#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: }; #include "android/log.h" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, "funnygame", __VA_ARGS__) 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 { LOGI("Opening file: %s", szFileName); 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); LOGI("Opened file: %p", pHandle->m_pFile); 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 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)