1dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com/*
20511f38ce432faff67522e680e6106f22deb4a7bepoger@google.com * Copyright 2010 Google Inc.
30511f38ce432faff67522e680e6106f22deb4a7bepoger@google.com *
40511f38ce432faff67522e680e6106f22deb4a7bepoger@google.com * Use of this source code is governed by a BSD-style license that can be
50511f38ce432faff67522e680e6106f22deb4a7bepoger@google.com * found in the LICENSE file.
60511f38ce432faff67522e680e6106f22deb4a7bepoger@google.com */
70511f38ce432faff67522e680e6106f22deb4a7bepoger@google.com
8159e5f06cdbfcc186a1f14822d11b77e62f7940fyangsu@google.com#include <Foundation/Foundation.h>
9dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com#include "SkOSFile.h"
10dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com#include "SkString.h"
11dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com
12dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.comstruct SkFILE {
13dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    NSData* fData;
14dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    size_t  fOffset;
15dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    size_t  fLength;
16dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com};
17dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com
18dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.comSkFILE* sk_fopen(const char cpath[], SkFILE_Flags flags) {
19dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    if (flags & kWrite_SkFILE_Flag) {
20dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        return NULL;
21dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    }
22dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com
23dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    SkString cname, csuffix;
24159e5f06cdbfcc186a1f14822d11b77e62f7940fyangsu@google.com
25dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    const char* start = strrchr(cpath, '/');
26dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    if (NULL == start) {
27dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        start = cpath;
28dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    } else {
29dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        start += 1;
30dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    }
31dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    const char* stop = strrchr(cpath, '.');
32dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    if (NULL == stop) {
33dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        return NULL;
34dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    } else {
35dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        stop += 1;
36dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    }
37dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com
38dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    cname.set(start, stop - start - 1);
39dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    csuffix.set(stop);
40159e5f06cdbfcc186a1f14822d11b77e62f7940fyangsu@google.com
41dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    NSBundle* bundle = [NSBundle mainBundle];
42dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    NSString* name = [NSString stringWithUTF8String:cname.c_str()];
43dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    NSString* suffix = [NSString stringWithUTF8String:csuffix.c_str()];
44dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    NSString* path = [bundle pathForResource:name ofType:suffix];
45dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    NSData* data = [NSData dataWithContentsOfMappedFile:path];
46dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com
47dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    if (data) {
48dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        [data retain];
49dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        SkFILE* rec = new SkFILE;
50dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        rec->fData = data;
51dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        rec->fOffset = 0;
52dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        rec->fLength = [data length];
53dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        return reinterpret_cast<SkFILE*>(rec);
54dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    }
55dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    return NULL;
56dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com}
57dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com
58dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.comsize_t sk_fgetsize(SkFILE* rec) {
59dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    SkASSERT(rec);
60dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    return rec->fLength;
61dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com}
62dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com
63dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.combool sk_frewind(SkFILE* rec) {
64dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    SkASSERT(rec);
65dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    rec->fOffset = 0;
66dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    return true;
67dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com}
68dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com
69dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.comsize_t sk_fread(void* buffer, size_t byteCount, SkFILE* rec) {
70dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    if (NULL == buffer) {
71dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        return rec->fLength;
72dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    } else {
73dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        size_t remaining = rec->fLength - rec->fOffset;
74dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        if (byteCount > remaining) {
75dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com            byteCount = remaining;
76dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        }
77dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        memcpy(buffer, (char*)[rec->fData bytes] + rec->fOffset, byteCount);
78dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        rec->fOffset += byteCount;
79dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        SkASSERT(rec->fOffset <= rec->fLength);
80dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com        return byteCount;
81dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    }
82dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com}
83dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com
84dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.comsize_t sk_fwrite(const void* buffer, size_t byteCount, SkFILE* f) {
8532826d2ab6453e15c878cdec19fbe965f5eef610mtklein@google.com    SkDEBUGFAIL("Not supported yet");
86dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    return 0;
87dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com}
88dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com
89dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.comvoid sk_fflush(SkFILE* f) {
9032826d2ab6453e15c878cdec19fbe965f5eef610mtklein@google.com    SkDEBUGFAIL("Not supported yet");
91dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com}
92dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com
93dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.comvoid sk_fclose(SkFILE* rec) {
94dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    SkASSERT(rec);
95dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    [rec->fData release];
96dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com    delete rec;
97dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com}
98dcfce0a6a1820e04a45cadb41c45c79d7bf3ef4ayangsu@google.com
99