1 /* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef UTILS_DEFINED 18 #define UTILS_DEFINED 19 20 #include "SkStream.h" 21 22 #include "android_util_Binder.h" 23 24 #include <jni.h> 25 #include <androidfw/Asset.h> 26 27 namespace android { 28 29 class AssetStreamAdaptor : public SkStreamRewindable { 30 public: 31 // Enum passed to constructor. If set to kYes_OwnAsset, 32 // the passed in Asset will be deleted upon destruction. 33 enum OwnAsset { 34 kYes_OwnAsset, 35 kNo_OwnAsset, 36 }; 37 38 // Enum passed to constructor. If set to kYes_HasMemoryBase, 39 // getMemoryBase will return the Asset's buffer. 40 enum HasMemoryBase { 41 kYes_HasMemoryBase, 42 kNo_HasMemoryBase, 43 }; 44 45 AssetStreamAdaptor(Asset*, OwnAsset, HasMemoryBase); 46 ~AssetStreamAdaptor(); 47 48 virtual bool rewind(); 49 virtual size_t read(void* buffer, size_t size); 50 virtual bool hasLength() const { return true; } 51 virtual size_t getLength() const; 52 virtual bool isAtEnd() const; 53 54 virtual const void* getMemoryBase() { return fMemoryBase; } 55 56 virtual SkStreamRewindable* duplicate() const; 57 private: 58 Asset* fAsset; 59 const void* const fMemoryBase; 60 const OwnAsset fOwnAsset; 61 }; 62 63 /** 64 * Make a deep copy of the asset, and return it as a stream, or NULL if there 65 * was an error. 66 * FIXME: If we could "ref/reopen" the asset, we may not need to copy it here. 67 */ 68 69 SkMemoryStream* CopyAssetToStream(Asset*); 70 71 /** Restore the file descriptor's offset in our destructor 72 */ 73 class AutoFDSeek { 74 public: 75 AutoFDSeek(int fd) : fFD(fd) { 76 fCurr = ::lseek(fd, 0, SEEK_CUR); 77 } 78 ~AutoFDSeek() { 79 if (fCurr >= 0) { 80 ::lseek(fFD, fCurr, SEEK_SET); 81 } 82 } 83 private: 84 int fFD; 85 off64_t fCurr; 86 }; 87 88 jobject nullObjectReturn(const char msg[]); 89 90 }; // namespace android 91 92 #endif 93