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
This commit is contained in:
Vincent Sanders 2011-05-14 15:11:16 +00:00
parent a7a2759ec9
commit 6c2977ec29
1 changed files with 57 additions and 7 deletions

View File

@ -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;
}