2 * @file ejsFileSystem.c
3 * @brief FileSystem class for the EJ System Object Model
5 /********************************** Copyright *********************************/
7 * Copyright (c) Mbedthis Software LLC, 2003-2006. All Rights Reserved.
9 /********************************** Includes **********************************/
13 /******************************************************************************/
18 /******************************************************************************/
19 /************************************ Methods *********************************/
20 /******************************************************************************/
22 * function void access(string path);
23 * MOB - API insufficient. Access for read or write?
26 static int accessProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
30 if (argc != 1 || !ejsVarIsString(argv[0])) {
31 ejsError(ejs, EJS_ARG_ERROR, "Bad usage: access(path)");
35 rc = access(argv[0]->string, 04);
37 ejsSetReturnValueToBoolean(ejs, (rc == 0) ? 1 : 0);
41 /******************************************************************************/
43 * function void mkdir(string path);
46 static int mkdirProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
48 if (argc != 1 || !ejsVarIsString(argv[0])) {
49 ejsError(ejs, EJS_ARG_ERROR, "Bad usage: mkdir(path)");
53 if (mprMakeDirPath(ejs, argv[0]->string) < 0) {
54 ejsError(ejs, EJS_IO_ERROR, "Cant create directory");
60 /******************************************************************************/
62 * function void rmdir(string path);
65 static int rmdirProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
69 if (argc != 1 || !ejsVarIsString(argv[0])) {
70 ejsError(ejs, EJS_ARG_ERROR, "Bad usage: mkdir(path)");
74 rc = mprDeleteDir(ejs, argv[0]->string);
77 ejsError(ejs, EJS_IO_ERROR, "Cant remove directory");
83 /******************************************************************************/
85 * function void dirList(string path, [bool enumDirs]);
86 * MOB -- need pattern to match (what about "." and ".." and ".*"
89 static int dirListProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
91 WIN32_FIND_DATA findData;
93 char path[MPR_MAX_FNAME];
97 if (argc < 1 || !ejsVarIsString(argv[0])) {
98 ejsError(ejs, EJS_ARG_ERROR, "Bad usage: dirList(path)");
102 enumDirs = ejsVarToBoolean(argv[1]);
106 array = ejsCreateArray(ejs, 0);
107 ejsMakeObjPermanent(array, 1);
110 * First collect the files
112 mprSprintf(path, sizeof(path), "%s/*.*", argv[0]->string);
113 h = FindFirstFile(path, &findData);
114 if (h == INVALID_HANDLE_VALUE) {
115 ejsError(ejs, EJS_ARG_ERROR, "Can't enumerate dirList(path)");
120 if (findData.cFileName[0] == '.') {
124 (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
125 mprSprintf(path, sizeof(path), "%s/%s", argv[0]->string,
127 vp = ejsCreateStringVar(ejs, path);
128 ejsAddArrayElt(ejs, array, vp, EJS_SHALLOW_COPY);
131 } while (FindNextFile(h, &findData) != 0);
135 ejsSetReturnValue(ejs, array);
136 ejsMakeObjPermanent(array, 0);
139 * Can free now as the return value holds the reference
141 ejsFreeVar(ejs, array);
146 /******************************************************************************/
148 * function void getFreeSpace();
151 static int getFreeSpaceProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
157 app = mprGetApp(ejs);
158 space = IFILEMGR_GetFreeSpace(app->fileMgr, 0);
159 ejsSetReturnValueToInteger(ejs, space);
165 /******************************************************************************/
167 * function void writeFile(string path, var data);
170 static int writeFileProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
174 int bytes, length, rc;
176 if (argc != 2 || !ejsVarIsString(argv[0])) {
177 ejsError(ejs, EJS_ARG_ERROR, "Bad usage: writeFile(path, var)");
181 if (ejsVarIsString(argv[1])) {
182 data = argv[1]->string;
183 length = argv[1]->length;
186 buf = data = ejsVarToString(ejs, argv[1]);
187 length = strlen(data);
191 * Create fails if already present
193 rc = mprDelete(ejs, argv[0]->string);
194 file = mprOpen(ejs, argv[0]->string, O_CREAT | O_WRONLY | O_BINARY, 0664);
196 ejsError(ejs, EJS_IO_ERROR, "Cant create %s", argv[0]->string);
202 bytes = mprWrite(file, data, length);
203 if (bytes != length) {
204 ejsError(ejs, EJS_IO_ERROR, "Write error to %s", argv[1]->string);
214 /******************************************************************************/
216 * function string readFile(string path);
219 static int readFileProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
227 if (argc != 1 || !ejsVarIsString(argv[0])) {
228 ejsError(ejs, EJS_ARG_ERROR, "Bad usage: readFile(path)");
231 buf = mprCreateBuf(ejs, MPR_BUF_INCR, MPR_MAX_BUF);
237 data = mprAlloc(ejs, MPR_BUFSIZE);
244 app = mprGetApp(ejs);
245 file = mprOpen(ejs, argv[0]->string, O_RDONLY, 0664);
247 ejsError(ejs, EJS_IO_ERROR, "Cant open %s", argv[0]->string);
253 while ((bytes = mprRead(file, data, MPR_BUFSIZE)) > 0) {
254 if (mprPutBlockToBuf(buf, data, bytes) != bytes) {
255 ejsError(ejs, EJS_IO_ERROR, "Write error to %s", argv[1]->string);
261 ejsSetReturnValueToBinaryString(ejs, mprGetBufStart(buf),
262 mprGetBufLength(buf));
271 /******************************************************************************/
273 * function void remove(string path);
276 static int removeProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
280 if (argc != 1 || !ejsVarIsString(argv[0])) {
281 ejsError(ejs, EJS_ARG_ERROR, "Bad usage: remove(path)");
285 rc = unlink(argv[0]->string);
287 ejsError(ejs, EJS_IO_ERROR, "Cant remove file");
293 /******************************************************************************/
295 * function void rename(string from, string to);
298 static int renameProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
302 if (argc != 2 || !ejsVarIsString(argv[0]) || !ejsVarIsString(argv[1])) {
303 ejsError(ejs, EJS_ARG_ERROR, "Bad usage: rename(old, new)");
307 unlink(argv[1]->string);
308 rc = rename(argv[0]->string, argv[1]->string);
310 ejsError(ejs, EJS_IO_ERROR, "Cant rename file");
316 /******************************************************************************/
318 * function void copy(string old, string new);
321 static int copyProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
327 if (argc != 2 || !ejsVarIsString(argv[0]) || !ejsVarIsString(argv[1])) {
328 ejsError(ejs, EJS_ARG_ERROR, "Bad usage: copy(old, new)");
332 buf = mprAlloc(ejs, MPR_BUFSIZE);
338 from = mprOpen(ejs, argv[0]->string, O_RDONLY | O_BINARY, 0664);
340 ejsError(ejs, EJS_IO_ERROR, "Cant open %s", argv[0]->string);
345 to = mprOpen(ejs, argv[1]->string, O_CREAT | O_BINARY, 0664);
347 ejsError(ejs, EJS_IO_ERROR, "Cant create %s", argv[1]->string);
354 while ((bytes = mprRead(from, buf, MPR_BUFSIZE)) > 0) {
355 if (mprWrite(to, buf, bytes) != bytes) {
356 ejsError(ejs, EJS_IO_ERROR, "Write error to %s", argv[1]->string);
369 /******************************************************************************/
371 * function FileInfo getFileInfo(string path);
373 * MOB -- should create a real class FileInfo
376 static int getFileInfoProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
382 if (argc != 1 || !ejsVarIsString(argv[0])) {
383 ejsError(ejs, EJS_ARG_ERROR, "Bad usage: getFileInfo(path)");
387 fileInfo = ejsCreateObjVar(ejs);
392 ejsMakeObjPermanent(fileInfo, 1);
394 rc = mprGetFileInfo(ejs, argv[0]->string, &info);
396 ejsMakeObjPermanent(fileInfo, 0);
397 ejsFreeVar(ejs, fileInfo);
398 ejsError(ejs, EJS_IO_ERROR, "Cant get file info for %s",
403 ejsSetPropertyToInteger(ejs, fileInfo, "created", info.ctime);
404 ejsSetPropertyToInteger(ejs, fileInfo, "length", info.size);
405 ejsSetPropertyToBoolean(ejs, fileInfo, "isDir", info.isDir);
407 ejsSetReturnValue(ejs, fileInfo);
408 ejsMakeObjPermanent(fileInfo, 0);
413 /******************************************************************************/
414 /******************************** Initialization ******************************/
415 /******************************************************************************/
417 int ejsDefineFileSystemClass(Ejs *ejs)
419 EjsVar *fileSystemClass;
421 fileSystemClass = ejsDefineClass(ejs, "FileSystem", "Object", 0);
422 if (fileSystemClass == 0) {
423 return MPR_ERR_CANT_INITIALIZE;
429 ejsDefineCMethod(ejs, fileSystemClass, "access", accessProc, 0);
430 ejsDefineCMethod(ejs, fileSystemClass, "mkdir", mkdirProc, 0);
431 ejsDefineCMethod(ejs, fileSystemClass, "rmdir", rmdirProc, 0);
432 ejsDefineCMethod(ejs, fileSystemClass, "dirList", dirListProc, 0);
433 ejsDefineCMethod(ejs, fileSystemClass, "writeFile", writeFileProc, 0);
434 ejsDefineCMethod(ejs, fileSystemClass, "readFile", readFileProc, 0);
435 ejsDefineCMethod(ejs, fileSystemClass, "remove", removeProc, 0);
436 ejsDefineCMethod(ejs, fileSystemClass, "rename", renameProc, 0);
437 ejsDefineCMethod(ejs, fileSystemClass, "copy", copyProc, 0);
438 ejsDefineCMethod(ejs, fileSystemClass, "getFileInfo", getFileInfoProc, 0);
440 // MOB -- should be a property with accessor
441 ejsDefineCMethod(ejs, fileSystemClass, "getFreeSpace", getFreeSpaceProc, 0);
443 return ejsObjHasErrors(fileSystemClass) ? MPR_ERR_CANT_INITIALIZE: 0;
446 /******************************************************************************/
454 * vim600: sw=4 ts=4 fdm=marker