diff options
Diffstat (limited to 'cocoa')
-rw-r--r-- | cocoa/fetch.m | 64 |
1 files 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; } |