Files
funnygame/engine/filesystem_android.cpp
2026-08-29 12:31:10 +03:00

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)