core/smn_filesystem.cpp
author Phong Dang <teame06@gmail.com>
Wed Aug 01 04:17:36 2007 +0000 (2007-08-01)
changeset 1235 88bb46f9731e
parent 1231 17badaf66ce4
child 1330 ab94316bb52b
permissions -rw-r--r--
Implemented requested amb603. Added voice natives.
dvander@370
     1
/**
ds@653
     2
 * vim: set ts=4 :
dvander@1231
     3
 * ================================================================
dvander@1231
     4
 * SourceMod
dvander@1231
     5
 * Copyright (C) 2004-2007 AlliedModders LLC.  All rights reserved.
dvander@1231
     6
 * ================================================================
dvander@370
     7
 *
dvander@1231
     8
 * This program is free software; you can redistribute it and/or 
dvander@1231
     9
 * modify it under the terms of the GNU General Public License, 
dvander@1231
    10
 * version 3.0, as published by the Free Software Foundation.
dvander@1231
    11
 * 
dvander@1231
    12
 * This program is distributed in the hope that it will be useful,
dvander@1231
    13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
dvander@1231
    14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
dvander@1231
    15
 * GNU General Public License for more details.
dvander@1231
    16
 *
dvander@1231
    17
 * You should have received a copy of the GNU General Public License
dvander@1231
    18
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1231
    19
 *
dvander@1231
    20
 * As a special exception, AlliedModders LLC gives you permission to 
dvander@1231
    21
 * link the code of this program (as well as its derivative works) to 
dvander@1231
    22
 * "Half-Life 2," the "Source Engine," the "SourcePawn JIT," and any 
dvander@1231
    23
 * Game MODs that run on software by the Valve Corporation.  You must 
dvander@1231
    24
 * obey the GNU General Public License in all respects for all other 
dvander@1231
    25
 * code used. Additionally, AlliedModders LLC grants this exception 
dvander@1231
    26
 * to all derivative works. AlliedModders LLC defines further 
dvander@1231
    27
 * exceptions, found in LICENSE.txt (as of this writing, version 
dvander@1231
    28
 * JULY-31-2007), or <http://www.sourcemod.net/license.php>.
dvander@370
    29
 *
dvander@370
    30
 * Version: $Id$
dvander@370
    31
 */
dvander@370
    32
faluco@274
    33
#include <sys/stat.h>
dvander@252
    34
#include "sm_globals.h"
dvander@252
    35
#include "HandleSys.h"
dvander@252
    36
#include "LibrarySys.h"
faluco@274
    37
#include "sm_stringutil.h"
dvander@592
    38
#include "Logger.h"
dvander@347
    39
#include "PluginSys.h"
dvander@347
    40
#include "sourcemm_api.h"
dvander@252
    41
dvander@252
    42
HandleType_t g_FileType;
dvander@252
    43
HandleType_t g_DirType;
dvander@252
    44
dvander@252
    45
class FileNatives : 
dvander@252
    46
	public SMGlobalClass,
dvander@252
    47
	public IHandleTypeDispatch
dvander@252
    48
{
dvander@252
    49
public:
dvander@252
    50
	virtual void OnSourceModAllInitialized()
dvander@252
    51
	{
dvander@262
    52
		g_FileType = g_HandleSys.CreateType("File", this, 0, NULL, NULL, g_pCoreIdent, NULL);
dvander@262
    53
		g_DirType = g_HandleSys.CreateType("Directory", this, 0, NULL, NULL, g_pCoreIdent, NULL);
dvander@252
    54
	}
dvander@252
    55
	virtual void OnSourceModShutdown()
dvander@252
    56
	{
dvander@252
    57
		g_HandleSys.RemoveType(g_DirType, g_pCoreIdent);
dvander@252
    58
		g_HandleSys.RemoveType(g_FileType, g_pCoreIdent);
dvander@252
    59
		g_DirType = 0;
dvander@252
    60
		g_FileType = 0;
dvander@252
    61
	}
dvander@252
    62
	virtual void OnHandleDestroy(HandleType_t type, void *object)
dvander@252
    63
	{
dvander@252
    64
		if (type == g_FileType)
dvander@252
    65
		{
dvander@252
    66
			FILE *fp = (FILE *)object;
dvander@252
    67
			fclose(fp);
dvander@252
    68
		} else if (type == g_DirType) {
dvander@252
    69
			IDirectory *pDir = (IDirectory *)object;
dvander@252
    70
			g_LibSys.CloseDirectory(pDir);
dvander@252
    71
		}
dvander@252
    72
	}
dvander@252
    73
};
dvander@252
    74
dvander@252
    75
faluco@274
    76
static cell_t sm_OpenDirectory(IPluginContext *pContext, const cell_t *params)
dvander@252
    77
{
dvander@252
    78
	char *path;
dvander@252
    79
	int err;
dvander@252
    80
	if ((err=pContext->LocalToString(params[1], &path)) != SP_ERROR_NONE)
dvander@252
    81
	{
dvander@252
    82
		pContext->ThrowNativeErrorEx(err, NULL);
dvander@252
    83
		return 0;
dvander@252
    84
	}
dvander@252
    85
ds@652
    86
	char realpath[PLATFORM_MAX_PATH];
dvander@317
    87
	g_SourceMod.BuildPath(Path_Game, realpath, sizeof(realpath), "%s", path);
dvander@255
    88
dvander@255
    89
	IDirectory *pDir = g_LibSys.OpenDirectory(realpath);
dvander@252
    90
	if (!pDir)
dvander@252
    91
	{
dvander@252
    92
		return 0;
dvander@252
    93
	}
dvander@252
    94
dvander@262
    95
	return g_HandleSys.CreateHandle(g_DirType, pDir, pContext->GetIdentity(), g_pCoreIdent, NULL);
dvander@252
    96
}
dvander@252
    97
faluco@274
    98
static cell_t sm_ReadDirEntry(IPluginContext *pContext, const cell_t *params)
dvander@252
    99
{
dvander@252
   100
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@252
   101
	IDirectory *pDir;
dvander@252
   102
	HandleError herr;
dvander@262
   103
	HandleSecurity sec;
dvander@252
   104
	int err;
dvander@262
   105
dvander@262
   106
	sec.pOwner = NULL;
dvander@262
   107
	sec.pIdentity = g_pCoreIdent;
dvander@262
   108
dvander@262
   109
	if ((herr=g_HandleSys.ReadHandle(hndl, g_DirType, &sec, (void **)&pDir))
dvander@252
   110
		!= HandleError_None)
dvander@252
   111
	{
dvander@252
   112
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
dvander@252
   113
	}
dvander@252
   114
dvander@252
   115
	if (!pDir->MoreFiles())
dvander@252
   116
	{
dvander@252
   117
		return false;
dvander@252
   118
	}
dvander@252
   119
dvander@252
   120
	cell_t *filetype;
dvander@252
   121
	if ((err=pContext->LocalToPhysAddr(params[4], &filetype)) != SP_ERROR_NONE)
dvander@252
   122
	{
dvander@252
   123
		pContext->ThrowNativeErrorEx(err, NULL);
dvander@252
   124
		return 0;
dvander@252
   125
	}
dvander@252
   126
dvander@252
   127
	if (pDir->IsEntryDirectory())
dvander@252
   128
	{
dvander@252
   129
		*filetype = 1;
dvander@252
   130
	} else if (pDir->IsEntryFile()) {
dvander@252
   131
		*filetype = 2;
dvander@252
   132
	} else {
dvander@252
   133
		*filetype = 0;
dvander@252
   134
	}
dvander@252
   135
dvander@252
   136
	const char *path = pDir->GetEntryName();
dvander@255
   137
	if ((err=pContext->StringToLocalUTF8(params[2], params[3], path, NULL))
dvander@252
   138
		!= SP_ERROR_NONE)
dvander@252
   139
	{
dvander@252
   140
		pContext->ThrowNativeErrorEx(err, NULL);
dvander@252
   141
		return 0;
dvander@252
   142
	}
dvander@252
   143
dvander@255
   144
	pDir->NextEntry();
dvander@255
   145
dvander@252
   146
	return true;
dvander@252
   147
}
dvander@252
   148
faluco@274
   149
static cell_t sm_OpenFile(IPluginContext *pContext, const cell_t *params)
faluco@274
   150
{
faluco@274
   151
	char *name, *mode;
faluco@274
   152
	int err;
faluco@274
   153
	if ((err=pContext->LocalToString(params[1], &name)) != SP_ERROR_NONE)
faluco@274
   154
	{
faluco@274
   155
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   156
		return 0;
faluco@274
   157
	}
faluco@274
   158
	if ((err=pContext->LocalToString(params[2], &mode)) != SP_ERROR_NONE)
faluco@274
   159
	{
faluco@274
   160
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   161
		return 0;
faluco@274
   162
	}
faluco@274
   163
ds@652
   164
	char realpath[PLATFORM_MAX_PATH];
dvander@636
   165
	g_SourceMod.BuildPath(Path_Game, realpath, sizeof(realpath), "%s", name);
faluco@274
   166
faluco@274
   167
	FILE *pFile = fopen(realpath, mode);
faluco@274
   168
	if (!pFile)
faluco@274
   169
	{
faluco@274
   170
		return 0;
faluco@274
   171
	}
faluco@274
   172
faluco@274
   173
	return g_HandleSys.CreateHandle(g_FileType, pFile, pContext->GetIdentity(), g_pCoreIdent, NULL);
faluco@274
   174
}
faluco@274
   175
faluco@274
   176
static cell_t sm_DeleteFile(IPluginContext *pContext, const cell_t *params)
faluco@274
   177
{
faluco@274
   178
	char *name;
faluco@274
   179
	int err;
faluco@274
   180
	if ((err=pContext->LocalToString(params[1], &name)) != SP_ERROR_NONE)
faluco@274
   181
	{
faluco@274
   182
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   183
		return 0;
faluco@274
   184
	}
faluco@274
   185
ds@652
   186
	char realpath[PLATFORM_MAX_PATH];
dvander@636
   187
	g_SourceMod.BuildPath(Path_Game, realpath, sizeof(realpath), "%s", name);
faluco@274
   188
faluco@274
   189
	return (unlink(realpath)) ? 0 : 1;
faluco@274
   190
}
faluco@274
   191
faluco@274
   192
static cell_t sm_ReadFileLine(IPluginContext *pContext, const cell_t *params)
faluco@274
   193
{
faluco@274
   194
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@274
   195
	HandleError herr;
faluco@274
   196
	HandleSecurity sec;
faluco@274
   197
	FILE *pFile;
faluco@274
   198
	int err;
faluco@274
   199
faluco@274
   200
	sec.pOwner = NULL;
faluco@274
   201
	sec.pIdentity = g_pCoreIdent;
faluco@274
   202
faluco@274
   203
	if ((herr=g_HandleSys.ReadHandle(hndl, g_FileType, &sec, (void **)&pFile))
faluco@274
   204
		!= HandleError_None)
faluco@274
   205
	{
faluco@274
   206
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
faluco@274
   207
	}
faluco@274
   208
faluco@274
   209
	char *buf;
faluco@274
   210
	if ((err=pContext->LocalToString(params[2], &buf)) != SP_ERROR_NONE)
faluco@274
   211
	{
faluco@274
   212
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   213
		return 0;
faluco@274
   214
	}
faluco@274
   215
dvander@638
   216
	if (fgets(buf, params[3], pFile) == NULL)
dvander@638
   217
	{
dvander@638
   218
		return 0;
dvander@638
   219
	}
faluco@274
   220
faluco@274
   221
	return 1;
faluco@274
   222
}
faluco@274
   223
faluco@274
   224
static cell_t sm_IsEndOfFile(IPluginContext *pContext, const cell_t *params)
faluco@274
   225
{
faluco@274
   226
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@274
   227
	HandleError herr;
faluco@274
   228
	HandleSecurity sec;
faluco@274
   229
	FILE *pFile;
faluco@274
   230
faluco@274
   231
	sec.pOwner = NULL;
faluco@274
   232
	sec.pIdentity = g_pCoreIdent;
faluco@274
   233
faluco@274
   234
	if ((herr=g_HandleSys.ReadHandle(hndl, g_FileType, &sec, (void **)&pFile))
faluco@274
   235
		!= HandleError_None)
faluco@274
   236
	{
faluco@274
   237
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
faluco@274
   238
	}
faluco@274
   239
faluco@274
   240
	return (feof(pFile)) ? 1 : 0;
faluco@274
   241
}
faluco@274
   242
faluco@274
   243
static cell_t sm_FileSeek(IPluginContext *pContext, const cell_t *params)
faluco@274
   244
{
faluco@274
   245
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@274
   246
	HandleError herr;
faluco@274
   247
	HandleSecurity sec;
faluco@274
   248
	FILE *pFile;
faluco@274
   249
faluco@274
   250
	sec.pOwner = NULL;
faluco@274
   251
	sec.pIdentity = g_pCoreIdent;
faluco@274
   252
faluco@274
   253
	if ((herr=g_HandleSys.ReadHandle(hndl, g_FileType, &sec, (void **)&pFile))
faluco@274
   254
		!= HandleError_None)
faluco@274
   255
	{
faluco@274
   256
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
faluco@274
   257
	}
faluco@274
   258
faluco@274
   259
	fseek(pFile, params[2], params[3]);
faluco@274
   260
	
faluco@274
   261
	return 1;
faluco@274
   262
}
faluco@274
   263
faluco@274
   264
static cell_t sm_FilePosition(IPluginContext *pContext, const cell_t *params)
faluco@274
   265
{
faluco@274
   266
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@274
   267
	HandleError herr;
faluco@274
   268
	HandleSecurity sec;
faluco@274
   269
	FILE *pFile;
faluco@274
   270
faluco@274
   271
	sec.pOwner = NULL;
faluco@274
   272
	sec.pIdentity = g_pCoreIdent;
faluco@274
   273
faluco@274
   274
	if ((herr=g_HandleSys.ReadHandle(hndl, g_FileType, &sec, (void **)&pFile))
faluco@274
   275
		!= HandleError_None)
faluco@274
   276
	{
faluco@274
   277
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
faluco@274
   278
	}
faluco@274
   279
faluco@274
   280
	return ftell(pFile);
faluco@274
   281
}
faluco@274
   282
faluco@274
   283
static cell_t sm_FileExists(IPluginContext *pContext, const cell_t *params)
faluco@274
   284
{
faluco@274
   285
	char *name;
faluco@274
   286
	int err;
faluco@274
   287
	if ((err=pContext->LocalToString(params[1], &name)) != SP_ERROR_NONE)
faluco@274
   288
	{
faluco@274
   289
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   290
		return 0;
faluco@274
   291
	}
faluco@274
   292
ds@652
   293
	char realpath[PLATFORM_MAX_PATH];
dvander@636
   294
	g_SourceMod.BuildPath(Path_Game, realpath, sizeof(realpath), "%s", name);
faluco@274
   295
#ifdef PLATFORM_WINDOWS
faluco@274
   296
	struct _stat s;
faluco@274
   297
	if (_stat(realpath, &s) != 0)
faluco@274
   298
	{
faluco@274
   299
		return 0;
faluco@274
   300
	}
faluco@274
   301
	if (s.st_mode & S_IFREG)
faluco@274
   302
	{
faluco@274
   303
		return 1;
faluco@274
   304
	}
faluco@274
   305
	return 0;
dvander@351
   306
#elif defined PLATFORM_POSIX
faluco@274
   307
	struct stat s;
faluco@274
   308
	if (stat(realpath, &s) != 0)
faluco@274
   309
	{
faluco@274
   310
		return 0;
faluco@274
   311
	}
faluco@274
   312
	if (S_ISREG(s.st_mode))
faluco@274
   313
	{
faluco@274
   314
		return 1;
faluco@274
   315
	}
faluco@274
   316
	return 0;
faluco@274
   317
#endif
faluco@274
   318
}
faluco@274
   319
faluco@274
   320
static cell_t sm_RenameFile(IPluginContext *pContext, const cell_t *params)
faluco@274
   321
{
faluco@274
   322
	char *newpath, *oldpath;
faluco@274
   323
	int err;
faluco@274
   324
	if ((err=pContext->LocalToString(params[1], &newpath)) != SP_ERROR_NONE)
faluco@274
   325
	{
faluco@274
   326
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   327
		return 0;
faluco@274
   328
	}
faluco@274
   329
	if ((err=pContext->LocalToString(params[2], &oldpath)) != SP_ERROR_NONE)
faluco@274
   330
	{
faluco@274
   331
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   332
		return 0;
faluco@274
   333
	}
faluco@274
   334
ds@652
   335
	char new_realpath[PLATFORM_MAX_PATH];
dvander@636
   336
	g_SourceMod.BuildPath(Path_Game, new_realpath, sizeof(new_realpath), "%s", newpath);
ds@652
   337
	char old_realpath[PLATFORM_MAX_PATH];
dvander@636
   338
	g_SourceMod.BuildPath(Path_Game, old_realpath, sizeof(old_realpath), "%s", oldpath);
faluco@274
   339
faluco@274
   340
#ifdef PLATFORM_WINDOWS
faluco@274
   341
	return (MoveFileA(old_realpath, new_realpath)) ? 1 : 0;
dvander@351
   342
#elif defined PLATFORM_POSIX
faluco@274
   343
	return (rename(old_realpath, new_realpath)) ? 0 : 1;
faluco@274
   344
#endif
faluco@274
   345
}
faluco@274
   346
faluco@274
   347
static cell_t sm_DirExists(IPluginContext *pContext, const cell_t *params)
faluco@274
   348
{
faluco@274
   349
	char *name;
faluco@274
   350
	int err;
faluco@274
   351
	if ((err=pContext->LocalToString(params[1], &name)) != SP_ERROR_NONE)
faluco@274
   352
	{
faluco@274
   353
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   354
		return 0;
faluco@274
   355
	}
faluco@274
   356
ds@652
   357
	char realpath[PLATFORM_MAX_PATH];
dvander@636
   358
	g_SourceMod.BuildPath(Path_Game, realpath, sizeof(realpath), "%s", name);
faluco@274
   359
#ifdef PLATFORM_WINDOWS
faluco@274
   360
	struct _stat s;
faluco@274
   361
	if (_stat(realpath, &s) != 0)
faluco@274
   362
	{
faluco@274
   363
		return 0;
faluco@274
   364
	}
faluco@274
   365
	if (s.st_mode & S_IFDIR)
faluco@274
   366
	{
faluco@274
   367
		return 1;
faluco@274
   368
	}
faluco@274
   369
	return 0;
dvander@351
   370
#elif defined PLATFORM_POSIX
faluco@274
   371
	struct stat s;
faluco@274
   372
	if (stat(realpath, &s) != 0)
faluco@274
   373
	{
faluco@274
   374
		return 0;
faluco@274
   375
	}
faluco@274
   376
	if (S_ISDIR(s.st_mode))
faluco@274
   377
	{
faluco@274
   378
		return 1;
faluco@274
   379
	}
faluco@274
   380
	return 0;
faluco@274
   381
#endif
faluco@274
   382
}
faluco@274
   383
faluco@274
   384
static cell_t sm_FileSize(IPluginContext *pContext, const cell_t *params)
faluco@274
   385
{
faluco@274
   386
	char *name;
faluco@274
   387
	int err;
faluco@274
   388
	if ((err=pContext->LocalToString(params[1], &name)) != SP_ERROR_NONE)
faluco@274
   389
	{
faluco@274
   390
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   391
		return -1;
faluco@274
   392
	}
faluco@274
   393
ds@652
   394
	char realpath[PLATFORM_MAX_PATH];
dvander@636
   395
	g_SourceMod.BuildPath(Path_Game, realpath, sizeof(realpath), "%s", name);
faluco@274
   396
#ifdef PLATFORM_WINDOWS
faluco@274
   397
	struct _stat s;
faluco@274
   398
	if (_stat(realpath, &s) != 0)
faluco@274
   399
	{
faluco@274
   400
		return -1;
faluco@274
   401
	}
faluco@274
   402
	if (s.st_mode & S_IFREG)
faluco@274
   403
	{
faluco@274
   404
		return static_cast<cell_t>(s.st_size);
faluco@274
   405
	}
faluco@274
   406
	return -1;
dvander@351
   407
#elif defined PLATFORM_POSIX
faluco@274
   408
	struct stat s;
faluco@274
   409
	if (stat(realpath, &s) != 0)
faluco@274
   410
	{
faluco@274
   411
		return -1;
faluco@274
   412
	}
faluco@274
   413
	if (S_ISREG(s.st_mode))
faluco@274
   414
	{
faluco@274
   415
		return static_cast<cell_t>(s.st_size);
faluco@274
   416
	}
faluco@274
   417
	return -1;
faluco@274
   418
#endif
faluco@274
   419
}
faluco@274
   420
faluco@274
   421
static cell_t sm_RemoveDir(IPluginContext *pContext, const cell_t *params)
faluco@274
   422
{
faluco@274
   423
	char *name;
faluco@274
   424
	int err;
faluco@274
   425
	if ((err=pContext->LocalToString(params[1], &name)) != SP_ERROR_NONE)
faluco@274
   426
	{
faluco@274
   427
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   428
		return 0;
faluco@274
   429
	}
faluco@274
   430
ds@652
   431
	char realpath[PLATFORM_MAX_PATH];
dvander@636
   432
	g_SourceMod.BuildPath(Path_Game, realpath, sizeof(realpath), "%s", name);
faluco@274
   433
faluco@274
   434
	return (rmdir(realpath)) ? 0 : 1;
faluco@274
   435
}
faluco@274
   436
faluco@274
   437
static cell_t sm_WriteFileLine(IPluginContext *pContext, const cell_t *params)
faluco@274
   438
{
faluco@274
   439
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@274
   440
	HandleError herr;
faluco@274
   441
	HandleSecurity sec;
faluco@274
   442
	FILE *pFile;
faluco@274
   443
faluco@274
   444
	sec.pOwner = NULL;
faluco@274
   445
	sec.pIdentity = g_pCoreIdent;
faluco@274
   446
faluco@274
   447
	if ((herr=g_HandleSys.ReadHandle(hndl, g_FileType, &sec, (void **)&pFile))
faluco@274
   448
		!= HandleError_None)
faluco@274
   449
	{
faluco@274
   450
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
faluco@274
   451
	}
faluco@274
   452
faluco@274
   453
	char *fmt;
faluco@274
   454
	int err;
faluco@274
   455
	if ((err=pContext->LocalToString(params[2], &fmt)) != SP_ERROR_NONE)
faluco@274
   456
	{
faluco@274
   457
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   458
		return 0;
faluco@274
   459
	}
faluco@274
   460
faluco@274
   461
	char buffer[2048];
faluco@274
   462
	int arg = 3;
faluco@274
   463
	atcprintf(buffer, sizeof(buffer), fmt, pContext, params, &arg);
faluco@274
   464
	fprintf(pFile, "%s\n", buffer);
faluco@274
   465
faluco@274
   466
	return 1;
faluco@274
   467
}
faluco@274
   468
dvander@821
   469
static cell_t sm_FlushFile(IPluginContext *pContext, const cell_t *params)
dvander@821
   470
{
dvander@821
   471
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@821
   472
	HandleError herr;
dvander@821
   473
	HandleSecurity sec;
dvander@821
   474
	FILE *pFile;
dvander@821
   475
dvander@821
   476
	sec.pOwner = NULL;
dvander@821
   477
	sec.pIdentity = g_pCoreIdent;
dvander@821
   478
dvander@821
   479
	if ((herr=g_HandleSys.ReadHandle(hndl, g_FileType, &sec, (void **)&pFile))
dvander@821
   480
		!= HandleError_None)
dvander@821
   481
	{
dvander@821
   482
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
dvander@821
   483
	}
dvander@821
   484
dvander@821
   485
	return (fflush(pFile) == 0) ? 1 : 0;
dvander@821
   486
}
dvander@821
   487
dvander@345
   488
static cell_t sm_BuildPath(IPluginContext *pContext, const cell_t *params)
dvander@345
   489
{
dvander@345
   490
	char path[PLATFORM_MAX_PATH], *fmt, *buffer;
ds@711
   491
	int arg = 5;
dvander@345
   492
	pContext->LocalToString(params[2], &buffer);
dvander@345
   493
	pContext->LocalToString(params[4], &fmt);
dvander@345
   494
dvander@345
   495
	atcprintf(path, sizeof(path), fmt, pContext, params, &arg);
dvander@345
   496
dvander@345
   497
	return g_SourceMod.BuildPath(Path_SM_Rel, buffer, params[3], "%s", path);
dvander@345
   498
}
dvander@345
   499
dvander@347
   500
static cell_t sm_LogToGame(IPluginContext *pContext, const cell_t *params)
dvander@347
   501
{
dvander@1011
   502
	g_SourceMod.SetGlobalTarget(LANG_SERVER);
dvander@1011
   503
dvander@347
   504
	char buffer[1024];
dvander@347
   505
	size_t len = g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1);
dvander@347
   506
dvander@347
   507
	if (len >= sizeof(buffer)-2)
dvander@347
   508
	{
dvander@347
   509
		buffer[1022] = '\n';
dvander@347
   510
		buffer[1023] = '\0';
dvander@347
   511
	} else {
dvander@347
   512
		buffer[len++] = '\n';
dvander@347
   513
		buffer[len] = '\0';
dvander@347
   514
	}
dvander@347
   515
dvander@347
   516
	engine->LogPrint(buffer);
dvander@347
   517
dvander@347
   518
	return 1;
dvander@347
   519
}
dvander@347
   520
dvander@347
   521
static cell_t sm_LogMessage(IPluginContext *pContext, const cell_t *params)
dvander@347
   522
{
dvander@1011
   523
	g_SourceMod.SetGlobalTarget(LANG_SERVER);
dvander@1011
   524
dvander@347
   525
	char buffer[1024];
dvander@351
   526
	g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1);
dvander@347
   527
dvander@347
   528
	IPlugin *pPlugin = g_PluginSys.FindPluginByContext(pContext->GetContext());
dvander@347
   529
	g_Logger.LogMessage("[%s] %s", pPlugin->GetFilename(), buffer);
dvander@347
   530
dvander@347
   531
	return 1;
dvander@347
   532
}
dvander@347
   533
dvander@347
   534
static cell_t sm_LogError(IPluginContext *pContext, const cell_t *params)
dvander@347
   535
{
dvander@1011
   536
	g_SourceMod.SetGlobalTarget(LANG_SERVER);
dvander@1011
   537
dvander@347
   538
	char buffer[1024];
dvander@351
   539
	g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1);
dvander@347
   540
dvander@347
   541
	IPlugin *pPlugin = g_PluginSys.FindPluginByContext(pContext->GetContext());
dvander@347
   542
	g_Logger.LogError("[%s] %s", pPlugin->GetFilename(), buffer);
dvander@347
   543
dvander@347
   544
	return 1;
dvander@347
   545
}
dvander@347
   546
dvander@255
   547
static FileNatives s_FileNatives;
dvander@252
   548
dvander@252
   549
REGISTER_NATIVES(filesystem)
dvander@252
   550
{
dvander@252
   551
	{"OpenDirectory",			sm_OpenDirectory},
dvander@252
   552
	{"ReadDirEntry",			sm_ReadDirEntry},
faluco@274
   553
	{"OpenFile",				sm_OpenFile},
faluco@274
   554
	{"DeleteFile",				sm_DeleteFile},
faluco@274
   555
	{"ReadFileLine",			sm_ReadFileLine},
faluco@274
   556
	{"IsEndOfFile",				sm_IsEndOfFile},
faluco@274
   557
	{"FileSeek",				sm_FileSeek},
faluco@274
   558
	{"FilePosition",			sm_FilePosition},
faluco@274
   559
	{"FileExists",				sm_FileExists},
faluco@274
   560
	{"RenameFile",				sm_RenameFile},
faluco@274
   561
	{"DirExists",				sm_DirExists},
faluco@274
   562
	{"FileSize",				sm_FileSize},
faluco@274
   563
	{"RemoveDir",				sm_RemoveDir},
faluco@274
   564
	{"WriteFileLine",			sm_WriteFileLine},
dvander@345
   565
	{"BuildPath",				sm_BuildPath},
dvander@636
   566
	{"LogToGame",				sm_LogToGame},
dvander@636
   567
	{"LogMessage",				sm_LogMessage},
dvander@347
   568
	{"LogError",				sm_LogError},
dvander@821
   569
	{"FlushFile",				sm_FlushFile},
dvander@252
   570
	{NULL,						NULL},
dvander@252
   571
};