diff --git a/src/AssetsSourceAndroid.cpp b/src/AssetsSourceAndroid.cpp new file mode 100644 index 0000000..14c89b4 --- /dev/null +++ b/src/AssetsSourceAndroid.cpp @@ -0,0 +1,137 @@ +#include + +#include +#include +#include + +namespace hgl +{ + namespace assets + { + class AndroidFileInputStream:public InputStream + { + AAsset *asset; + + public: + + AndroidFileInputStream(AAsset *aa) + { + asset=aa; + } + + ~AndroidFileInputStream() + { + Close(); + } + + void Close() + { + if(!asset)return; + + AAsset_close(asset); + asset=nullptr; + } + + int64 Read(void *ptr,int64 size) + { + if(!asset)return(-1); + + return AAsset_read(asset,ptr,size); + } + + int64 Peek(void *ptr,int64 size) + { + int result=Read(ptr,size); + + if(result>0) + AAsset_seek(asset,-result,0); + + return(result); + } + + int64 ReadFully(void *buf,int64 buf_size){return Read(buf,buf_size);} ///<充分读取,保证读取到指定长度的数据(不计算超时) + + bool CanRestart()const{return true;} + bool CanSeek()const{return true;} + bool CanSize()const{return true;} + bool CanPeek()const{return true;} + + bool Restart() + { + if(!asset)return(false); + + return AAsset_seek(asset,0,SEEK_SET) + } + + int64 Skip(int64 bytes) + { + return Seek(bytes,soCurrent); + } + + int64 Seek(int64 offset,SeekOrigin origin) + { + if(!asset)return(-1); + + return AAsset_seek64(asset,offset,origin) + } + + int64 Tell()const + { + if(!asset)return(-1); + + return(AAsset_getLength(asset)-AAsset_getRemainingLength(asset)); + } + + int64 GetSize()const + { + if(!asset)return(-1); + + return AAsset_getLength(asset); + } + + int64 Available()const + { + if(!asset)return(-1); + + return AAsset_getRemainingLength(asset); + } + + };//class AndroidFileInputStream:public InputStream + + class AssetsSourceFilesytem:public AssetsSource + { + OSString root_path; + bool only_read; + + public: + + AssetsSourceFilesytem(const UTF8String &sn,const OSString &path,const bool or):AssetsSource(sn) + { + root_path=path; + only_read=or; + } + + bool hasNameAccess()const override{return true;} + + io::InputStream *OpenByName(const UTF8String &filename) + { + const OSString &fullname=filesystem::MergeFilename(root_path,ToOSString(filename)); + + AAsset *aa=AAssetManager_open(__assetManager,path.c_str(),AASSET_MODE_RANDOM); + + if(!aa) + return(nullptr); + + return(new AndroidFileInputStream(aa)); + } + };//class AssetsSourceFilesytem:public AssetsSource + + AssetsSource *CreateByFilesystem(const OSString &path,const bool only_read) + { + if(path.IsEmpty()) + return(nullptr); + + return(new AssetsSourceFilesytem(path,only_read)); + } + }//namespace assets +}//namespace hgl diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 998a778..34e0697 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,5 +3,10 @@ file(GLOB ASSETS_MANAGE_HEADER ${CMASSETS_MANAGE_ROOT_INCLUDE_PATH}/hgl/assets/* set(ASSETS_MANAGE_SOURCE AssetsSource.cpp AssetsSourceFilesystem.cpp) +IF(ANDROID) + set(ASSETS_MANAGE_SOURCE ${ASSETS_MANAGE_SOURCE} + AssetsSourceAndroid.cpp) +ENDIF() + add_cm_library(CMAssetsManage "CM" ${ASSETS_MANAGE_HEADER} ${ASSETS_MANAGE_SOURCE})