add AssetsSourceAndroid(untest)

This commit is contained in:
2020-01-13 11:42:41 +08:00
parent a60bc74929
commit 641256a8db
2 changed files with 142 additions and 0 deletions

137
src/AssetsSourceAndroid.cpp Normal file
View File

@@ -0,0 +1,137 @@
#include<hgl/assets/AssetsSource.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
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

View File

@@ -3,5 +3,10 @@ file(GLOB ASSETS_MANAGE_HEADER ${CMASSETS_MANAGE_ROOT_INCLUDE_PATH}/hgl/assets/*
set(ASSETS_MANAGE_SOURCE AssetsSource.cpp set(ASSETS_MANAGE_SOURCE AssetsSource.cpp
AssetsSourceFilesystem.cpp) AssetsSourceFilesystem.cpp)
IF(ANDROID)
set(ASSETS_MANAGE_SOURCE ${ASSETS_MANAGE_SOURCE}
AssetsSourceAndroid.cpp)
ENDIF()
add_cm_library(CMAssetsManage "CM" ${ASSETS_MANAGE_HEADER} add_cm_library(CMAssetsManage "CM" ${ASSETS_MANAGE_HEADER}
${ASSETS_MANAGE_SOURCE}) ${ASSETS_MANAGE_SOURCE})