From e2ef8df4d76dbd5798855c906ee55c9ebd48bc65 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Mon, 30 May 2011 20:52:31 +0000 Subject: Guess MIME type from DataType only if there isn't already a valid entry in the list svn path=/trunk/netsurf/; revision=12450 --- amiga/dt_anim.c | 15 ------- amiga/dt_picture.c | 15 ------- amiga/filetype.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++- amiga/filetype.h | 1 + 4 files changed, 115 insertions(+), 32 deletions(-) diff --git a/amiga/dt_anim.c b/amiga/dt_anim.c index cad43296b..8ef210850 100644 --- a/amiga/dt_anim.c +++ b/amiga/dt_anim.c @@ -101,21 +101,6 @@ nserror amiga_dt_anim_init(void) { ReleaseDataType(prevdt); prevdt = dt; - ami_datatype_to_mimetype(dt, dt_mime); - - LOG(("Guessed MIME from anim DT: %s", dt_mime)); - - lerror = lwc_intern_string(dt_mime, strlen(dt_mime), &type); - if (lerror != lwc_error_ok) - return NSERROR_NOMEM; - - error = content_factory_register_handler(type, - &amiga_dt_anim_content_handler); - - lwc_string_unref(type); - - if (error != NSERROR_OK) - return error; do { node = ami_mime_from_datatype(dt, &type, node); diff --git a/amiga/dt_picture.c b/amiga/dt_picture.c index f2350fe75..890236d41 100644 --- a/amiga/dt_picture.c +++ b/amiga/dt_picture.c @@ -88,21 +88,6 @@ nserror amiga_dt_picture_init(void) { ReleaseDataType(prevdt); prevdt = dt; - ami_datatype_to_mimetype(dt, dt_mime); - - LOG(("Guessed MIME from DT: %s", dt_mime)); - - lerror = lwc_intern_string(dt_mime, strlen(dt_mime), &type); - if (lerror != lwc_error_ok) - return NSERROR_NOMEM; - - error = content_factory_register_handler(type, - &amiga_dt_picture_content_handler); - - lwc_string_unref(type); - - if (error != NSERROR_OK) - return error; do { node = ami_mime_from_datatype(dt, &type, node); diff --git a/amiga/filetype.c b/amiga/filetype.c index b9a8d1d54..7358d616c 100644 --- a/amiga/filetype.c +++ b/amiga/filetype.c @@ -146,6 +146,8 @@ char *fetch_mimetype(const char *ro_path) const char *ami_content_type_to_file_type(content_type type) { + /* TODO: Can we pass MIME types to this function instead? */ + switch(type) { case CONTENT_HTML: @@ -394,6 +396,93 @@ struct ami_mime_entry *ami_mime_entry_locate(lwc_string *search, else return NULL; } + +APTR ami_mime_guess_add_datatype(struct DataType *dt, lwc_string **lwc_mimetype) +{ + struct nsObject *node; + char mimetype[100]; + char *dt_name_lwr; + struct ami_mime_entry *mimeentry; + lwc_error lerror; + struct DataTypeHeader *dth = dt->dtn_Header; + char *p; + + node = AddObject(ami_mime_list, AMINS_MIME); + mimeentry = AllocVec(sizeof(struct ami_mime_entry), MEMF_PRIVATE | MEMF_CLEAR); + node->objstruct = mimeentry; + + lerror = lwc_intern_string(dth->dth_Name, strlen(dth->dth_Name), &mimeentry->datatype); + if (lerror != lwc_error_ok) + return NULL; + + dt_name_lwr = strlwr(dth->dth_Name); + p = dt_name_lwr; + + while(*p != '\0') + { + if(*p == ' ') *p = '-'; + p++; + } + + switch(dth->dth_GroupID) + { + case GID_TEXT: + case GID_DOCUMENT: + if(strcmp("ascii", dt_name_lwr)==0) + { + strcpy(mimetype,"text/plain"); + } + else + { + sprintf(mimetype,"text/%s", dt_name_lwr); + } + break; + case GID_SOUND: + case GID_INSTRUMENT: + case GID_MUSIC: + sprintf(mimetype,"audio/%s", dt_name_lwr); + break; + case GID_PICTURE: + if(strcmp("sprite", dt_name_lwr)==0) + { + strcpy(mimetype,"image/x-riscos-sprite"); + } + else + { + sprintf(mimetype,"image/%s", dt_name_lwr); + } + break; + case GID_ANIMATION: + case GID_MOVIE: + sprintf(mimetype,"video/%s", dt_name_lwr); + break; + case GID_SYSTEM: + default: + if(strcmp("directory", dt_name_lwr)==0) + { + strcpy(mimetype,"application/x-netsurf-directory"); + } + else if(strcmp("binary", dt_name_lwr)==0) + { + strcpy(mimetype,"application/octet-stream"); + } + else sprintf(mimetype,"application/%s", dt_name_lwr); + break; + } + + lerror = lwc_intern_string(mimetype, strlen(mimetype), &mimeentry->mimetype); + if (lerror != lwc_error_ok) + return NULL; + + *lwc_mimetype = mimeentry->mimetype; + + lerror = lwc_intern_string(dt_name_lwr, strlen(dt_name_lwr), &mimeentry->filetype); + if (lerror != lwc_error_ok) + return NULL; + + return node; +} + /** * Return a MIME Type matching a DataType * @@ -421,7 +510,6 @@ struct Node *ami_mime_from_datatype(struct DataType *dt, node = start_node; mimeentry = ami_mime_entry_locate(dt_name, AMI_MIME_DATATYPE, &node); - lwc_string_unref(dt_name); if(mimeentry != NULL) @@ -431,7 +519,15 @@ struct Node *ami_mime_from_datatype(struct DataType *dt, } else { - return NULL; + if(start_node == NULL) + { + /* If there are no matching entries in the file, guess */ + return ami_mime_guess_add_datatype(dt, mimetype); + } + else + { + return NULL; + } } } @@ -547,3 +643,19 @@ bool ami_mime_compare(struct hlcache_handle *c, const char *type) return ret; } + + +void ami_mime_dump(void) +{ + struct Node *node; + struct ami_mime_entry *mimeentry; + + while(mimeentry = ami_mime_entry_locate(NULL, AMI_MIME_MIMETYPE, &node)) + { + LOG(("%s DT=%s TYPE=%s CMD=%s", + mimeentry->mimetype ? lwc_string_data(mimeentry->mimetype) : "", + mimeentry->datatype ? lwc_string_data(mimeentry->datatype) : "", + mimeentry->filetype ? lwc_string_data(mimeentry->filetype) : "", + mimeentry->plugincmd ? lwc_string_data(mimeentry->plugincmd) : "")); + }; +} diff --git a/amiga/filetype.h b/amiga/filetype.h index d9b76ee5f..fd0e1d8bc 100644 --- a/amiga/filetype.h +++ b/amiga/filetype.h @@ -30,6 +30,7 @@ struct ami_mime_entry; nserror ami_mime_init(const char *mimefile); void ami_mime_free(void); void ami_mime_entry_free(struct ami_mime_entry *mimeentry); +void ami_mime_dump(void); struct Node *ami_mime_from_datatype(struct DataType *dt, lwc_string **mimetype, struct Node *start_node); -- cgit v1.2.3