core/smn_filesystem.cpp
author Borja Ferrer <faluco@alliedmods.net>
Fri Jan 05 00:42:22 2007 +0000 (2007-01-05)
changeset 268 d6fed4f05e07
parent 262 de0e374ffa47
child 274 959c85596341
permissions -rw-r--r--
Fixed CPlayer init, it was called too early.
nothing important on the logger
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@262
    15
		g_FileType = g_HandleSys.CreateType("File", this, 0, NULL, NULL, g_pCoreIdent, NULL);
dvander@262
    16
		g_DirType = g_HandleSys.CreateType("Directory", this, 0, NULL, NULL, g_pCoreIdent, NULL);
dvander@252
    17
	}
dvander@252
    18
	virtual void OnSourceModShutdown()
dvander@252
    19
	{
dvander@252
    20
		g_HandleSys.RemoveType(g_DirType, g_pCoreIdent);
dvander@252
    21
		g_HandleSys.RemoveType(g_FileType, g_pCoreIdent);
dvander@252
    22
		g_DirType = 0;
dvander@252
    23
		g_FileType = 0;
dvander@252
    24
	}
dvander@252
    25
	virtual void OnHandleDestroy(HandleType_t type, void *object)
dvander@252
    26
	{
dvander@252
    27
		if (type == g_FileType)
dvander@252
    28
		{
dvander@252
    29
			FILE *fp = (FILE *)object;
dvander@252
    30
			fclose(fp);
dvander@252
    31
		} else if (type == g_DirType) {
dvander@252
    32
			IDirectory *pDir = (IDirectory *)object;
dvander@252
    33
			g_LibSys.CloseDirectory(pDir);
dvander@252
    34
		}
dvander@252
    35
	}
dvander@252
    36
};
dvander@252
    37
dvander@252
    38
dvander@252
    39
cell_t sm_OpenDirectory(IPluginContext *pContext, const cell_t *params)
dvander@252
    40
{
dvander@252
    41
	char *path;
dvander@252
    42
	int err;
dvander@252
    43
	if ((err=pContext->LocalToString(params[1], &path)) != SP_ERROR_NONE)
dvander@252
    44
	{
dvander@252
    45
		pContext->ThrowNativeErrorEx(err, NULL);
dvander@252
    46
		return 0;
dvander@252
    47
	}
dvander@252
    48
dvander@255
    49
	char realpath[PLATFORM_MAX_PATH+1];
dvander@255
    50
	g_LibSys.PathFormat(realpath, sizeof(realpath), "%s/%s", g_SourceMod.GetBaseDir(), path);
dvander@255
    51
dvander@255
    52
	IDirectory *pDir = g_LibSys.OpenDirectory(realpath);
dvander@252
    53
	if (!pDir)
dvander@252
    54
	{
dvander@252
    55
		return 0;
dvander@252
    56
	}
dvander@252
    57
dvander@262
    58
	return g_HandleSys.CreateHandle(g_DirType, pDir, pContext->GetIdentity(), g_pCoreIdent, NULL);
dvander@252
    59
}
dvander@252
    60
dvander@252
    61
cell_t sm_ReadDirEntry(IPluginContext *pContext, const cell_t *params)
dvander@252
    62
{
dvander@252
    63
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@252
    64
	IDirectory *pDir;
dvander@252
    65
	HandleError herr;
dvander@262
    66
	HandleSecurity sec;
dvander@252
    67
	int err;
dvander@262
    68
dvander@262
    69
	sec.pOwner = NULL;
dvander@262
    70
	sec.pIdentity = g_pCoreIdent;
dvander@262
    71
dvander@262
    72
	if ((herr=g_HandleSys.ReadHandle(hndl, g_DirType, &sec, (void **)&pDir))
dvander@252
    73
		!= HandleError_None)
dvander@252
    74
	{
dvander@252
    75
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
dvander@252
    76
	}
dvander@252
    77
dvander@252
    78
	if (!pDir->MoreFiles())
dvander@252
    79
	{
dvander@252
    80
		return false;
dvander@252
    81
	}
dvander@252
    82
dvander@252
    83
	cell_t *filetype;
dvander@252
    84
	if ((err=pContext->LocalToPhysAddr(params[4], &filetype)) != SP_ERROR_NONE)
dvander@252
    85
	{
dvander@252
    86
		pContext->ThrowNativeErrorEx(err, NULL);
dvander@252
    87
		return 0;
dvander@252
    88
	}
dvander@252
    89
dvander@252
    90
	if (pDir->IsEntryDirectory())
dvander@252
    91
	{
dvander@252
    92
		*filetype = 1;
dvander@252
    93
	} else if (pDir->IsEntryFile()) {
dvander@252
    94
		*filetype = 2;
dvander@252
    95
	} else {
dvander@252
    96
		*filetype = 0;
dvander@252
    97
	}
dvander@252
    98
dvander@252
    99
	const char *path = pDir->GetEntryName();
dvander@255
   100
	if ((err=pContext->StringToLocalUTF8(params[2], params[3], path, NULL))
dvander@252
   101
		!= SP_ERROR_NONE)
dvander@252
   102
	{
dvander@252
   103
		pContext->ThrowNativeErrorEx(err, NULL);
dvander@252
   104
		return 0;
dvander@252
   105
	}
dvander@252
   106
dvander@255
   107
	pDir->NextEntry();
dvander@255
   108
dvander@252
   109
	return true;
dvander@252
   110
}
dvander@252
   111
dvander@255
   112
cell_t PrintStuff(IPluginContext *pContext, const cell_t *params)
dvander@255
   113
{
dvander@255
   114
	char *stuff;
dvander@255
   115
	pContext->LocalToString(params[1], &stuff);
dvander@255
   116
dvander@255
   117
	FILE *fp = fopen("c:\\debug.txt", "at");
dvander@255
   118
	fprintf(fp, "%s\n", stuff);
dvander@255
   119
	fclose(fp);
dvander@255
   120
dvander@255
   121
	return 0;
dvander@255
   122
}
dvander@255
   123
dvander@255
   124
static FileNatives s_FileNatives;
dvander@252
   125
dvander@252
   126
REGISTER_NATIVES(filesystem)
dvander@252
   127
{
dvander@252
   128
	{"OpenDirectory",			sm_OpenDirectory},
dvander@252
   129
	{"ReadDirEntry",			sm_ReadDirEntry},
dvander@255
   130
	{"PrintStuff",				PrintStuff},
dvander@252
   131
	{NULL,						NULL},
dvander@252
   132
};