michael@0: /* michael@0: * Copyright 2010 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: #include michael@0: #include "SkOSFile.h" michael@0: #include "SkString.h" michael@0: michael@0: struct SkFILE { michael@0: NSData* fData; michael@0: size_t fOffset; michael@0: size_t fLength; michael@0: }; michael@0: michael@0: SkFILE* sk_fopen(const char cpath[], SkFILE_Flags flags) { michael@0: if (flags & kWrite_SkFILE_Flag) { michael@0: return NULL; michael@0: } michael@0: michael@0: SkString cname, csuffix; michael@0: michael@0: const char* start = strrchr(cpath, '/'); michael@0: if (NULL == start) { michael@0: start = cpath; michael@0: } else { michael@0: start += 1; michael@0: } michael@0: const char* stop = strrchr(cpath, '.'); michael@0: if (NULL == stop) { michael@0: return NULL; michael@0: } else { michael@0: stop += 1; michael@0: } michael@0: michael@0: cname.set(start, stop - start - 1); michael@0: csuffix.set(stop); michael@0: michael@0: NSBundle* bundle = [NSBundle mainBundle]; michael@0: NSString* name = [NSString stringWithUTF8String:cname.c_str()]; michael@0: NSString* suffix = [NSString stringWithUTF8String:csuffix.c_str()]; michael@0: NSString* path = [bundle pathForResource:name ofType:suffix]; michael@0: NSData* data = [NSData dataWithContentsOfMappedFile:path]; michael@0: michael@0: if (data) { michael@0: [data retain]; michael@0: SkFILE* rec = new SkFILE; michael@0: rec->fData = data; michael@0: rec->fOffset = 0; michael@0: rec->fLength = [data length]; michael@0: return reinterpret_cast(rec); michael@0: } michael@0: return NULL; michael@0: } michael@0: michael@0: size_t sk_fgetsize(SkFILE* rec) { michael@0: SkASSERT(rec); michael@0: return rec->fLength; michael@0: } michael@0: michael@0: bool sk_frewind(SkFILE* rec) { michael@0: SkASSERT(rec); michael@0: rec->fOffset = 0; michael@0: return true; michael@0: } michael@0: michael@0: size_t sk_fread(void* buffer, size_t byteCount, SkFILE* rec) { michael@0: if (NULL == buffer) { michael@0: return rec->fLength; michael@0: } else { michael@0: size_t remaining = rec->fLength - rec->fOffset; michael@0: if (byteCount > remaining) { michael@0: byteCount = remaining; michael@0: } michael@0: memcpy(buffer, (char*)[rec->fData bytes] + rec->fOffset, byteCount); michael@0: rec->fOffset += byteCount; michael@0: SkASSERT(rec->fOffset <= rec->fLength); michael@0: return byteCount; michael@0: } michael@0: } michael@0: michael@0: size_t sk_fwrite(const void* buffer, size_t byteCount, SkFILE* f) { michael@0: SkDEBUGFAIL("Not supported yet"); michael@0: return 0; michael@0: } michael@0: michael@0: void sk_fflush(SkFILE* f) { michael@0: SkDEBUGFAIL("Not supported yet"); michael@0: } michael@0: michael@0: void sk_fclose(SkFILE* rec) { michael@0: SkASSERT(rec); michael@0: [rec->fData release]; michael@0: delete rec; michael@0: } michael@0: