dvander@252: #include "sm_globals.h" dvander@252: #include "HandleSys.h" dvander@252: #include "LibrarySys.h" dvander@252: dvander@252: HandleType_t g_FileType; dvander@252: HandleType_t g_DirType; dvander@252: dvander@252: class FileNatives : dvander@252: public SMGlobalClass, dvander@252: public IHandleTypeDispatch dvander@252: { dvander@252: public: dvander@252: virtual void OnSourceModAllInitialized() dvander@252: { dvander@262: g_FileType = g_HandleSys.CreateType("File", this, 0, NULL, NULL, g_pCoreIdent, NULL); dvander@262: g_DirType = g_HandleSys.CreateType("Directory", this, 0, NULL, NULL, g_pCoreIdent, NULL); dvander@252: } dvander@252: virtual void OnSourceModShutdown() dvander@252: { dvander@252: g_HandleSys.RemoveType(g_DirType, g_pCoreIdent); dvander@252: g_HandleSys.RemoveType(g_FileType, g_pCoreIdent); dvander@252: g_DirType = 0; dvander@252: g_FileType = 0; dvander@252: } dvander@252: virtual void OnHandleDestroy(HandleType_t type, void *object) dvander@252: { dvander@252: if (type == g_FileType) dvander@252: { dvander@252: FILE *fp = (FILE *)object; dvander@252: fclose(fp); dvander@252: } else if (type == g_DirType) { dvander@252: IDirectory *pDir = (IDirectory *)object; dvander@252: g_LibSys.CloseDirectory(pDir); dvander@252: } dvander@252: } dvander@252: }; dvander@252: dvander@252: dvander@252: cell_t sm_OpenDirectory(IPluginContext *pContext, const cell_t *params) dvander@252: { dvander@252: char *path; dvander@252: int err; dvander@252: if ((err=pContext->LocalToString(params[1], &path)) != SP_ERROR_NONE) dvander@252: { dvander@252: pContext->ThrowNativeErrorEx(err, NULL); dvander@252: return 0; dvander@252: } dvander@252: dvander@255: char realpath[PLATFORM_MAX_PATH+1]; dvander@255: g_LibSys.PathFormat(realpath, sizeof(realpath), "%s/%s", g_SourceMod.GetBaseDir(), path); dvander@255: dvander@255: IDirectory *pDir = g_LibSys.OpenDirectory(realpath); dvander@252: if (!pDir) dvander@252: { dvander@252: return 0; dvander@252: } dvander@252: dvander@262: return g_HandleSys.CreateHandle(g_DirType, pDir, pContext->GetIdentity(), g_pCoreIdent, NULL); dvander@252: } dvander@252: dvander@252: cell_t sm_ReadDirEntry(IPluginContext *pContext, const cell_t *params) dvander@252: { dvander@252: Handle_t hndl = static_cast(params[1]); dvander@252: IDirectory *pDir; dvander@252: HandleError herr; dvander@262: HandleSecurity sec; dvander@252: int err; dvander@262: dvander@262: sec.pOwner = NULL; dvander@262: sec.pIdentity = g_pCoreIdent; dvander@262: dvander@262: if ((herr=g_HandleSys.ReadHandle(hndl, g_DirType, &sec, (void **)&pDir)) dvander@252: != HandleError_None) dvander@252: { dvander@252: return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr); dvander@252: } dvander@252: dvander@252: if (!pDir->MoreFiles()) dvander@252: { dvander@252: return false; dvander@252: } dvander@252: dvander@252: cell_t *filetype; dvander@252: if ((err=pContext->LocalToPhysAddr(params[4], &filetype)) != SP_ERROR_NONE) dvander@252: { dvander@252: pContext->ThrowNativeErrorEx(err, NULL); dvander@252: return 0; dvander@252: } dvander@252: dvander@252: if (pDir->IsEntryDirectory()) dvander@252: { dvander@252: *filetype = 1; dvander@252: } else if (pDir->IsEntryFile()) { dvander@252: *filetype = 2; dvander@252: } else { dvander@252: *filetype = 0; dvander@252: } dvander@252: dvander@252: const char *path = pDir->GetEntryName(); dvander@255: if ((err=pContext->StringToLocalUTF8(params[2], params[3], path, NULL)) dvander@252: != SP_ERROR_NONE) dvander@252: { dvander@252: pContext->ThrowNativeErrorEx(err, NULL); dvander@252: return 0; dvander@252: } dvander@252: dvander@255: pDir->NextEntry(); dvander@255: dvander@252: return true; dvander@252: } dvander@252: dvander@255: cell_t PrintStuff(IPluginContext *pContext, const cell_t *params) dvander@255: { dvander@255: char *stuff; dvander@255: pContext->LocalToString(params[1], &stuff); dvander@255: dvander@255: FILE *fp = fopen("c:\\debug.txt", "at"); dvander@255: fprintf(fp, "%s\n", stuff); dvander@255: fclose(fp); dvander@255: dvander@255: return 0; dvander@255: } dvander@255: dvander@255: static FileNatives s_FileNatives; dvander@252: dvander@252: REGISTER_NATIVES(filesystem) dvander@252: { dvander@252: {"OpenDirectory", sm_OpenDirectory}, dvander@252: {"ReadDirEntry", sm_ReadDirEntry}, dvander@255: {"PrintStuff", PrintStuff}, dvander@252: {NULL, NULL}, dvander@252: };