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