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