|
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 |
}; |