136 lines
3.0 KiB
C++
136 lines
3.0 KiB
C++
#include "tier2/ifilesystem.h"
|
|
#include "tier1/interface.h"
|
|
#include "android/asset_manager.h"
|
|
#include "android/android_native_app_glue.h"
|
|
|
|
class CAndroidFileHandle : public IFileHandle
|
|
{
|
|
public:
|
|
AAsset *m_pFile;
|
|
size_t m_nSize;
|
|
|
|
};
|
|
|
|
class CAndroidDirectoryHandle: public IDirectoryHandle
|
|
{
|
|
public:
|
|
};
|
|
|
|
extern struct android_app *g_android_app;
|
|
class CAndroidFileSystem : public IFileSystem
|
|
{
|
|
public:
|
|
virtual void Init() override {
|
|
|
|
};
|
|
virtual void Shutdown() override {};
|
|
|
|
virtual IFileHandle *Open( const char *szFileName, int eOpCode ) override
|
|
{
|
|
FILE *pFile;
|
|
CAndroidFileHandle *pHandle = NULL;
|
|
|
|
switch (eOpCode)
|
|
{
|
|
case FILEMODE_READ:
|
|
break;
|
|
default:
|
|
return 0;
|
|
}
|
|
|
|
pHandle = new CAndroidFileHandle;
|
|
pHandle->m_pFileSystem = this;
|
|
pHandle->m_pFile = AAssetManager_open(g_android_app->activity->assetManager, szFileName, AASSET_MODE_RANDOM);
|
|
pHandle->m_nSize = AAsset_getLength64(pHandle->m_pFile);
|
|
return pHandle;
|
|
}
|
|
virtual size_t Write( IFileHandle *pFile, const void *pData, size_t nDataSize ) override
|
|
{
|
|
}
|
|
virtual size_t Read( IFileHandle *pFile, void *pData, size_t nDataSize ) override
|
|
{
|
|
CAndroidFileHandle *pHandle = (CAndroidFileHandle*)pFile;
|
|
if (!pHandle)
|
|
return 0;
|
|
return AAsset_read(pHandle->m_pFile, pData, nDataSize);
|
|
}
|
|
|
|
virtual size_t Seek( IFileHandle *pFile, ESeekMode eSeekMode, size_t nOffset ) override
|
|
{
|
|
CAndroidFileHandle *pHandle = (CAndroidFileHandle*)pFile;
|
|
int eLibcSeekMode = 0;
|
|
|
|
if (!pHandle)
|
|
return 0;
|
|
|
|
switch (eSeekMode) {
|
|
case SEEKMODE_RELATIVE_CURRENT:
|
|
eLibcSeekMode = SEEK_CUR;
|
|
break;
|
|
case SEEKMODE_RELATIVE_END:
|
|
eLibcSeekMode = SEEK_END;
|
|
break;
|
|
case SEEKMODE_RELATIVE_START:
|
|
eLibcSeekMode = SEEK_SET;
|
|
break;
|
|
}
|
|
return AAsset_seek64(pHandle->m_pFile, nOffset, eLibcSeekMode);
|
|
}
|
|
|
|
virtual size_t Tell( IFileHandle *pFile ) override
|
|
{
|
|
CAndroidFileHandle *pHandle = (CAndroidFileHandle*)pFile;
|
|
if (!pHandle)
|
|
return 0;
|
|
return AAsset_seek64(pHandle->m_pFile, 0, SEEK_CUR);
|
|
}
|
|
|
|
virtual size_t Size( IFileHandle *pFile ) override
|
|
{
|
|
CAndroidFileHandle *pHandle = (CAndroidFileHandle*)pFile;
|
|
if (!pHandle)
|
|
return 0;
|
|
return pHandle->m_nSize;
|
|
}
|
|
|
|
|
|
|
|
virtual void Close( IFileHandle *pFile ) override
|
|
{
|
|
CAndroidFileHandle *pHandle = (CAndroidFileHandle*)pFile;
|
|
if (!pHandle)
|
|
return;
|
|
AAsset_close(pHandle->m_pFile);
|
|
delete pHandle;
|
|
}
|
|
|
|
virtual CUtlBuffer<unsigned char> Read( IFileHandle *pFile ) override { return {}; };
|
|
virtual const char *ReadString( IFileHandle *pFile ) override {
|
|
char *szData = NULL;
|
|
size_t uSize = Size(pFile);
|
|
|
|
szData = (char*)V_malloc(uSize+1);
|
|
Read(pFile, szData,uSize);
|
|
szData[uSize] = 0;
|
|
|
|
return szData;
|
|
};
|
|
|
|
virtual size_t PrintF( IFileHandle *pFile, const char *szFormat, ... ) override
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
virtual IDirectoryHandle *OpenDir( const char *szDirName ) override
|
|
{
|
|
return NULL;
|
|
|
|
};
|
|
|
|
virtual void CloseDir( IDirectoryHandle *pDir ) override
|
|
{
|
|
};
|
|
};
|
|
|
|
EXPOSE_INTERFACE(CAndroidFileSystem, IFileSystem, FILESYSTEM_INTERFACE_VERSION)
|