From 6c2977ec293f61db2f0d5732b9b232fd355cabdf Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Sat, 14 May 2011 15:11:16 +0000 Subject: [PATCH] If you do not have xcode installed many critical mime mappings (like css and html) are missing so this adds rudimentry filename extension mappings so teh browser does not explode on non develoepr machines. svn path=/trunk/netsurf/; revision=12411 --- cocoa/fetch.m | 64 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 7 deletions(-) diff --git a/cocoa/fetch.m b/cocoa/fetch.m index 8c35c4067..ff1496246 100644 --- a/cocoa/fetch.m +++ b/cocoa/fetch.m @@ -21,25 +21,75 @@ #import "utils/log.h" #import "content/fetch.h" +static char cocoafiletype[200]; + +static const struct mimemap_s { + const char const *extension; + const char const *mimetype; +} cocoamimemap[] = { + { "css", "text/css" }, + { "f79", "text/css" }, + { "jpg", "image/jpeg" }, + { "jpeg", "image/jpeg" }, + { "gif", "image/gif" }, + { "png", "image/png" }, + { "b60", "image/png" }, + { "jng", "image/jng" }, + { "svg", "image/svg" }, + { NULL, "text/html" } +}; + + const char *fetch_filetype(const char *unix_path) { - NSString *uti = [[NSWorkspace sharedWorkspace] typeOfFile: [NSString stringWithUTF8String: unix_path] - error: NULL]; - + NSString *uti; NSString *mimeType = nil; + NSError *utiError = nil; + + uti = [[NSWorkspace sharedWorkspace] typeOfFile: [NSString stringWithUTF8String: unix_path] error:&utiError]; if (nil != uti) { + LOG(("Looking for mimetype from uti \"%s\"", [uti UTF8String] )); mimeType = (NSString *)UTTypeCopyPreferredTagWithClass( (CFStringRef)uti, kUTTagClassMIMEType ); + } else { + NSAlert *utiAlert = [NSAlert alertWithError:utiError]; + [utiAlert runModal]; // Ignore return value. + + LOG(("uti call failed")); + + strncpy(cocoafiletype, "text/html", sizeof(cocoafiletype)); + return cocoafiletype; } - const char *result = "text/html"; if (nil != mimeType) { - result = [mimeType UTF8String]; + strncpy(cocoafiletype, [mimeType UTF8String], sizeof(cocoafiletype)); [mimeType release]; + } else { + const char *extension; + + LOG(("mimetype from uti failed")); + + extension = [(NSString *)UTTypeCopyPreferredTagWithClass( (CFStringRef)uti, kUTTagClassFilenameExtension) UTF8String]; + + if (extension == NULL) { + /* give up and go with default */ + LOG(("No extension going with default type")); + strncpy(cocoafiletype, "text/html", sizeof(cocoafiletype)); } else { + int eidx = 0; /* index of extension entry */ + + while ((cocoamimemap[eidx].extension != NULL) && + (strcmp(cocoamimemap[eidx].extension, extension) != 0)) { + eidx++; + } + + strncpy(cocoafiletype, + cocoamimemap[eidx].mimetype, + sizeof(cocoafiletype)); + } } - LOG(( "\tMIME type for '%s' is '%s'", unix_path, result )); + LOG(( "\tMIME type for '%s' is '%s'", unix_path, cocoafiletype )); - return result; + return cocoafiletype; }