summaryrefslogtreecommitdiff
path: root/frontends/cocoa/fetch.m
blob: 74ba9afa3fa6b465b1ab163f86c78bb99ca0c40a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
 * Copyright 2011 Sven Weidauer <sven.weidauer@gmail.com>
 *
 * This file is part of NetSurf, http://www.netsurf-browser.org/
 *
 * NetSurf is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * NetSurf is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#import <Cocoa/Cocoa.h>

#import "utils/log.h"
#import "utils/nsurl.h"
#import "netsurf/fetch.h"

#import "cocoa/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" }
};

static const char *fetch_filetype(const char *unix_path)
{
    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 = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge 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;
    }

    if (nil != mimeType) {
        strncpy(cocoafiletype, [mimeType UTF8String], sizeof(cocoafiletype));
    } else {
        const char *extension;

        LOG("mimetype from uti failed");

        extension = [(__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge 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, cocoafiletype);

    return cocoafiletype;
}

static nsurl *gui_get_resource_url(const char *path)
{
    nsurl *url = NULL;
    NSString *nspath = [[NSBundle mainBundle] pathForResource:[NSString stringWithUTF8String:path] ofType:@""];
    if (nspath == nil)
        return NULL;
    nsurl_create([[[NSURL fileURLWithPath:nspath] absoluteString] UTF8String], &url);
    return url;
}

static struct gui_fetch_table fetch_table = {
    .filetype = fetch_filetype,

    .get_resource_url = gui_get_resource_url,
};

struct gui_fetch_table *cocoa_fetch_table = &fetch_table;