blob: 33c572ac3a1b03f735ba0586518c13acdd44ce2c [file] [log] [blame]
yangsu@google.com1a2b4c12011-06-24 17:20:50 +00001/*
2 Copyright 2010, Tetrark Inc.
3*/
4
5#include "SkOSFile.h"
6#include "SkString.h"
7
8struct SkFILE {
9 NSData* fData;
10 size_t fOffset;
11 size_t fLength;
12};
13
14SkFILE* sk_fopen(const char cpath[], SkFILE_Flags flags) {
15 if (flags & kWrite_SkFILE_Flag) {
16 return NULL;
17 }
18
19 SkString cname, csuffix;
20
21 const char* start = strrchr(cpath, '/');
22 if (NULL == start) {
23 start = cpath;
24 } else {
25 start += 1;
26 }
27 const char* stop = strrchr(cpath, '.');
28 if (NULL == stop) {
29 return NULL;
30 } else {
31 stop += 1;
32 }
33
34 cname.set(start, stop - start - 1);
35 csuffix.set(stop);
36
37 NSBundle* bundle = [NSBundle mainBundle];
38 NSString* name = [NSString stringWithUTF8String:cname.c_str()];
39 NSString* suffix = [NSString stringWithUTF8String:csuffix.c_str()];
40 NSString* path = [bundle pathForResource:name ofType:suffix];
41 NSData* data = [NSData dataWithContentsOfMappedFile:path];
42
43 if (data) {
44 [data retain];
45 SkFILE* rec = new SkFILE;
46 rec->fData = data;
47 rec->fOffset = 0;
48 rec->fLength = [data length];
49 return reinterpret_cast<SkFILE*>(rec);
50 }
51 return NULL;
52}
53
54size_t sk_fgetsize(SkFILE* rec) {
55 SkASSERT(rec);
56 return rec->fLength;
57}
58
59bool sk_frewind(SkFILE* rec) {
60 SkASSERT(rec);
61 rec->fOffset = 0;
62 return true;
63}
64
65size_t sk_fread(void* buffer, size_t byteCount, SkFILE* rec) {
66 if (NULL == buffer) {
67 return rec->fLength;
68 } else {
69 size_t remaining = rec->fLength - rec->fOffset;
70 if (byteCount > remaining) {
71 byteCount = remaining;
72 }
73 memcpy(buffer, (char*)[rec->fData bytes] + rec->fOffset, byteCount);
74 rec->fOffset += byteCount;
75 SkASSERT(rec->fOffset <= rec->fLength);
76 return byteCount;
77 }
78}
79
80size_t sk_fwrite(const void* buffer, size_t byteCount, SkFILE* f) {
81 SkASSERT(!"Not supported yet");
82 return 0;
83}
84
85void sk_fflush(SkFILE* f) {
86 SkASSERT(!"Not supported yet");
87}
88
89void sk_fclose(SkFILE* rec) {
90 SkASSERT(rec);
91 [rec->fData release];
92 delete rec;
93}
94