core/smn_filesystem.cpp
author David Anderson <dvander@alliedmods.net>
Tue Jan 02 01:44:46 2007 +0000 (2007-01-02)
changeset 259 ca9b124a2544
parent 255 236589ed0c92
child 262 de0e374ffa47
permissions -rw-r--r--
fixed various issues in the handle system with cloning
fixed plugins being able to free each other's handles
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@255
    54
	char realpath[PLATFORM_MAX_PATH+1];
dvander@255
    55
	g_LibSys.PathFormat(realpath, sizeof(realpath), "%s/%s", g_SourceMod.GetBaseDir(), path);
dvander@255
    56
dvander@255
    57
	IDirectory *pDir = g_LibSys.OpenDirectory(realpath);
dvander@252
    58
	if (!pDir)
dvander@252
    59
	{
dvander@252
    60
		return 0;
dvander@252
    61
	}
dvander@252
    62
dvander@252
    63
	return g_HandleSys.CreateScriptHandle(g_DirType, pDir, pContext, g_pCoreIdent);
dvander@252
    64
}
dvander@252
    65
dvander@252
    66
cell_t sm_ReadDirEntry(IPluginContext *pContext, const cell_t *params)
dvander@252
    67
{
dvander@252
    68
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@252
    69
dvander@252
    70
	IDirectory *pDir;
dvander@252
    71
	HandleError herr;
dvander@252
    72
	int err;
dvander@252
    73
	if ((herr=g_HandleSys.ReadHandle(hndl, g_DirType, g_pCoreIdent, (void **)&pDir))
dvander@252
    74
		!= HandleError_None)
dvander@252
    75
	{
dvander@252
    76
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
dvander@252
    77
	}
dvander@252
    78
dvander@252
    79
	if (!pDir->MoreFiles())
dvander@252
    80
	{
dvander@252
    81
		return false;
dvander@252
    82
	}
dvander@252
    83
dvander@252
    84
	cell_t *filetype;
dvander@252
    85
	if ((err=pContext->LocalToPhysAddr(params[4], &filetype)) != SP_ERROR_NONE)
dvander@252
    86
	{
dvander@252
    87
		pContext->ThrowNativeErrorEx(err, NULL);
dvander@252
    88
		return 0;
dvander@252
    89
	}
dvander@252
    90
dvander@252
    91
	if (pDir->IsEntryDirectory())
dvander@252
    92
	{
dvander@252
    93
		*filetype = 1;
dvander@252
    94
	} else if (pDir->IsEntryFile()) {
dvander@252
    95
		*filetype = 2;
dvander@252
    96
	} else {
dvander@252
    97
		*filetype = 0;
dvander@252
    98
	}
dvander@252
    99
dvander@252
   100
	const char *path = pDir->GetEntryName();
dvander@255
   101
	if ((err=pContext->StringToLocalUTF8(params[2], params[3], path, NULL))
dvander@252
   102
		!= SP_ERROR_NONE)
dvander@252
   103
	{
dvander@252
   104
		pContext->ThrowNativeErrorEx(err, NULL);
dvander@252
   105
		return 0;
dvander@252
   106
	}
dvander@252
   107
dvander@255
   108
	pDir->NextEntry();
dvander@255
   109
dvander@252
   110
	return true;
dvander@252
   111
}
dvander@252
   112
dvander@255
   113
cell_t PrintStuff(IPluginContext *pContext, const cell_t *params)
dvander@255
   114
{
dvander@255
   115
	char *stuff;
dvander@255
   116
	pContext->LocalToString(params[1], &stuff);
dvander@255
   117
dvander@255
   118
	FILE *fp = fopen("c:\\debug.txt", "at");
dvander@255
   119
	fprintf(fp, "%s\n", stuff);
dvander@255
   120
	fclose(fp);
dvander@255
   121
dvander@255
   122
	return 0;
dvander@255
   123
}
dvander@255
   124
dvander@255
   125
static FileNatives s_FileNatives;
dvander@252
   126
dvander@252
   127
REGISTER_NATIVES(filesystem)
dvander@252
   128
{
dvander@252
   129
	{"OpenDirectory",			sm_OpenDirectory},
dvander@252
   130
	{"ReadDirEntry",			sm_ReadDirEntry},
dvander@255
   131
	{"PrintStuff",				PrintStuff},
dvander@252
   132
	{NULL,						NULL},
dvander@252
   133
};