Author: chris_y
Date: Mon May 30 15:52:31 2011
New Revision: 12450
URL:
http://source.netsurf-browser.org?rev=12450&view=rev
Log:
Guess MIME type from DataType only if there isn't already a valid entry in the list
Modified:
trunk/netsurf/amiga/dt_anim.c
trunk/netsurf/amiga/dt_picture.c
trunk/netsurf/amiga/filetype.c
trunk/netsurf/amiga/filetype.h
Modified: trunk/netsurf/amiga/dt_anim.c
URL:
http://source.netsurf-browser.org/trunk/netsurf/amiga/dt_anim.c?rev=12450...
==============================================================================
--- trunk/netsurf/amiga/dt_anim.c (original)
+++ trunk/netsurf/amiga/dt_anim.c Mon May 30 15:52:31 2011
@@ -101,21 +101,6 @@
{
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);
Modified: trunk/netsurf/amiga/dt_picture.c
URL:
http://source.netsurf-browser.org/trunk/netsurf/amiga/dt_picture.c?rev=12...
==============================================================================
--- trunk/netsurf/amiga/dt_picture.c (original)
+++ trunk/netsurf/amiga/dt_picture.c Mon May 30 15:52:31 2011
@@ -88,21 +88,6 @@
{
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);
Modified: trunk/netsurf/amiga/filetype.c
URL:
http://source.netsurf-browser.org/trunk/netsurf/amiga/filetype.c?rev=1245...
==============================================================================
--- trunk/netsurf/amiga/filetype.c (original)
+++ trunk/netsurf/amiga/filetype.c Mon May 30 15:52:31 2011
@@ -146,6 +146,8 @@
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 @@
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 @@
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 @@
}
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 @@
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) : ""));
+ };
+}
Modified: trunk/netsurf/amiga/filetype.h
URL:
http://source.netsurf-browser.org/trunk/netsurf/amiga/filetype.h?rev=1245...
==============================================================================
--- trunk/netsurf/amiga/filetype.h (original)
+++ trunk/netsurf/amiga/filetype.h Mon May 30 15:52:31 2011
@@ -30,6 +30,7 @@
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);