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