core/smn_filesystem.cpp
author David Anderson <dvander@alliedmods.net>
Mon Jan 01 19:50:16 2007 +0000 (2007-01-01)
changeset 252 ce166c465bad
child 255 236589ed0c92
permissions -rw-r--r--
added usage of the Handle System to begin experimenting
dvander@252
     1
#include "sm_globals.h"
dvander@252
     2
#include "HandleSys.h"
dvander@252
     3
#include "LibrarySys.h"
dvander@252
     4
dvander@252
     5
HandleType_t g_FileType;
dvander@252
     6
HandleType_t g_DirType;
dvander@252
     7
dvander@252
     8
class FileNatives : 
dvander@252
     9
	public SMGlobalClass,
dvander@252
    10
	public IHandleTypeDispatch
dvander@252
    11
{
dvander@252
    12
public:
dvander@252
    13
	virtual void OnSourceModAllInitialized()
dvander@252
    14
	{
dvander@252
    15
		HandleSecurity sec;
dvander@252
    16
		sec.owner = g_pCoreIdent;
dvander@252
    17
		sec.access[HandleAccess_Inherit] = false;
dvander@252
    18
		sec.access[HandleAccess_Create] = false;
dvander@252
    19
dvander@252
    20
		g_FileType = g_HandleSys.CreateTypeEx("File", this, 0, &sec, NULL);
dvander@252
    21
		g_DirType = g_HandleSys.CreateTypeEx("Directory", this, 0, &sec, NULL);
dvander@252
    22
	}
dvander@252
    23
	virtual void OnSourceModShutdown()
dvander@252
    24
	{
dvander@252
    25
		g_HandleSys.RemoveType(g_DirType, g_pCoreIdent);
dvander@252
    26
		g_HandleSys.RemoveType(g_FileType, g_pCoreIdent);
dvander@252
    27
		g_DirType = 0;
dvander@252
    28
		g_FileType = 0;
dvander@252
    29
	}
dvander@252
    30
	virtual void OnHandleDestroy(HandleType_t type, void *object)
dvander@252
    31
	{
dvander@252
    32
		if (type == g_FileType)
dvander@252
    33
		{
dvander@252
    34
			FILE *fp = (FILE *)object;
dvander@252
    35
			fclose(fp);
dvander@252
    36
		} else if (type == g_DirType) {
dvander@252
    37
			IDirectory *pDir = (IDirectory *)object;
dvander@252
    38
			g_LibSys.CloseDirectory(pDir);
dvander@252
    39
		}
dvander@252
    40
	}
dvander@252
    41
};
dvander@252
    42
dvander@252
    43
dvander@252
    44
cell_t sm_OpenDirectory(IPluginContext *pContext, const cell_t *params)
dvander@252
    45
{
dvander@252
    46
	char *path;
dvander@252
    47
	int err;
dvander@252
    48
	if ((err=pContext->LocalToString(params[1], &path)) != SP_ERROR_NONE)
dvander@252
    49
	{
dvander@252
    50
		pContext->ThrowNativeErrorEx(err, NULL);
dvander@252
    51
		return 0;
dvander@252
    52
	}
dvander@252
    53
dvander@252
    54
	IDirectory *pDir = g_LibSys.OpenDirectory(path);
dvander@252
    55
	if (!pDir)
dvander@252
    56
	{
dvander@252
    57
		return 0;
dvander@252
    58
	}
dvander@252
    59
dvander@252
    60
	return g_HandleSys.CreateScriptHandle(g_DirType, pDir, pContext, g_pCoreIdent);
dvander@252
    61
}
dvander@252
    62
dvander@252
    63
cell_t sm_ReadDirEntry(IPluginContext *pContext, const cell_t *params)
dvander@252
    64
{
dvander@252
    65
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@252
    66
dvander@252
    67
	IDirectory *pDir;
dvander@252
    68
	HandleError herr;
dvander@252
    69
	int err;
dvander@252
    70
	if ((herr=g_HandleSys.ReadHandle(hndl, g_DirType, g_pCoreIdent, (void **)&pDir))
dvander@252
    71
		!= HandleError_None)
dvander@252
    72
	{
dvander@252
    73
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
dvander@252
    74
	}
dvander@252
    75
dvander@252
    76
	if (!pDir->MoreFiles())
dvander@252
    77
	{
dvander@252
    78
		return false;
dvander@252
    79
	}
dvander@252
    80
dvander@252
    81
	cell_t *filetype;
dvander@252
    82
	if ((err=pContext->LocalToPhysAddr(params[4], &filetype)) != SP_ERROR_NONE)
dvander@252
    83
	{
dvander@252
    84
		pContext->ThrowNativeErrorEx(err, NULL);
dvander@252
    85
		return 0;
dvander@252
    86
	}
dvander@252
    87
dvander@252
    88
	if (pDir->IsEntryDirectory())
dvander@252
    89
	{
dvander@252
    90
		*filetype = 1;
dvander@252
    91
	} else if (pDir->IsEntryFile()) {
dvander@252
    92
		*filetype = 2;
dvander@252
    93
	} else {
dvander@252
    94
		*filetype = 0;
dvander@252
    95
	}
dvander@252
    96
dvander@252
    97
	const char *path = pDir->GetEntryName();
dvander@252
    98
	if ((err=pContext->StringToLocalUTF8(params[2], params[3],path, NULL))
dvander@252
    99
		!= SP_ERROR_NONE)
dvander@252
   100
	{
dvander@252
   101
		pContext->ThrowNativeErrorEx(err, NULL);
dvander@252
   102
		return 0;
dvander@252
   103
	}
dvander@252
   104
dvander@252
   105
	return true;
dvander@252
   106
}
dvander@252
   107
dvander@252
   108
dvander@252
   109
REGISTER_NATIVES(filesystem)
dvander@252
   110
{
dvander@252
   111
	{"OpenDirectory",			sm_OpenDirectory},
dvander@252
   112
	{"ReadDirEntry",			sm_ReadDirEntry},
dvander@252
   113
	{NULL,						NULL},
dvander@252
   114
};