📄 jsfile.c
字号:
*rval = JSVAL_FALSE; return JS_FALSE;}static JSBoolfile_seek(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSFile *file = JS_GetInstancePrivate(cx, obj, &file_class, NULL); int32 toskip; int32 pos; SECURITY_CHECK(cx, NULL, "seek", file); JSFILE_CHECK_ONE_ARG("seek"); JSFILE_CHECK_NATIVE("seek"); JSFILE_CHECK_READ; if (!JS_ValueToInt32(cx, argv[0], &toskip)){ JS_ReportErrorNumber(cx, JSFile_GetErrorMessage, NULL, JSFILEMSG_FIRST_ARGUMENT_MUST_BE_A_NUMBER, "seek", argv[0]); goto out; } if(!file->hasRandomAccess){ JS_ReportErrorNumber(cx, JSFile_GetErrorMessage, NULL, JSFILEMSG_NO_RANDOM_ACCESS, file->path); goto out; } if(js_isDirectory(cx, file)){ JS_ReportWarning(cx,"Seek on directories is not supported, proceeding"); goto out; } pos = js_FileSeek(cx, file, toskip, file->type); if (pos!=-1) { *rval = INT_TO_JSVAL(pos); return JS_TRUE; }out: *rval = JSVAL_VOID; return JS_FALSE;}static JSBoolfile_list(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ PRDir *dir; PRDirEntry *entry; JSFile *file = JS_GetInstancePrivate(cx, obj, &file_class, NULL); JSObject *array; JSObject *eachFile; jsint len; jsval v; JSRegExp *re = NULL; JSFunction *func = NULL; JSString *str; jsval args[1]; char *filePath; SECURITY_CHECK(cx, NULL, "list", file); JSFILE_CHECK_NATIVE("list"); if (argc==1) { if (JSVAL_IS_REGEXP(cx, argv[0])) { re = JS_GetPrivate(cx, JSVAL_TO_OBJECT(argv[0])); }else if (JSVAL_IS_FUNCTION(cx, argv[0])) { func = JS_GetPrivate(cx, JSVAL_TO_OBJECT(argv[0])); }else{ JS_ReportErrorNumber(cx, JSFile_GetErrorMessage, NULL, JSFILEMSG_FIRST_ARGUMENT_MUST_BE_A_FUNCTION_OR_REGEX, argv[0]); goto out; } } if (!js_isDirectory(cx, file)) { JS_ReportErrorNumber(cx, JSFile_GetErrorMessage, NULL, JSFILEMSG_CANNOT_DO_LIST_ON_A_FILE, file->path); goto out; } dir = PR_OpenDir(file->path); if(!dir){ JS_ReportErrorNumber(cx, JSFile_GetErrorMessage, NULL, JSFILEMSG_OP_FAILED, "open", file->path); goto out; } /* create JSArray here... */ array = JS_NewArrayObject(cx, 0, NULL); len = 0; while ((entry = PR_ReadDir(dir, PR_SKIP_BOTH))!=NULL) { /* first, check if we have a regexp */ if (re!=NULL) { size_t index = 0; str = JS_NewStringCopyZ(cx, entry->name); if(!js_ExecuteRegExp(cx, re, str, &index, JS_TRUE, &v)){ /* don't report anything here */ goto out; } /* not matched! */ if (JSVAL_IS_NULL(v)) { continue; } }else if (func!=NULL) { str = JS_NewStringCopyZ(cx, entry->name); args[0] = STRING_TO_JSVAL(str); if(!JS_CallFunction(cx, obj, func, 1, args, &v)){ goto out; } if (v==JSVAL_FALSE) { continue; } } filePath = js_combinePath(cx, file->path, (char*)entry->name); eachFile = js_NewFileObject(cx, filePath); JS_free(cx, filePath); if (!eachFile){ JS_ReportWarning(cx, "File %s cannot be retrieved", filePath); continue; } v = OBJECT_TO_JSVAL(eachFile); JS_SetElement(cx, array, len, &v); JS_SetProperty(cx, array, entry->name, &v); len++; } if(PR_CloseDir(dir)!=PR_SUCCESS){ JS_ReportErrorNumber(cx, JSFile_GetErrorMessage, NULL, JSFILEMSG_OP_FAILED, "close", file->path); goto out; } *rval = OBJECT_TO_JSVAL(array); return JS_TRUE;out: *rval = JSVAL_NULL; return JS_FALSE;}static JSBoolfile_mkdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSFile *file = JS_GetInstancePrivate(cx, obj, &file_class, NULL); SECURITY_CHECK(cx, NULL, "mkdir", file); JSFILE_CHECK_ONE_ARG("mkdir"); JSFILE_CHECK_NATIVE("mkdir"); /* if the current file is not a directory, find out the directory name */ if (!js_isDirectory(cx, file)) { char *dir = js_fileDirectoryName(cx, file->path); JSObject *dirObj = js_NewFileObject(cx, dir); JS_free(cx, dir); /* call file_mkdir with the right set of parameters if needed */ if (file_mkdir(cx, dirObj, argc, argv, rval)) return JS_TRUE; else goto out; }else{ char *dirName = JS_GetStringBytes(JS_ValueToString(cx, argv[0])); char *fullName; fullName = js_combinePath(cx, file->path, dirName); if (PR_MkDir(fullName, 0755)==PR_SUCCESS){ *rval = JSVAL_TRUE; JS_free(cx, fullName); return JS_TRUE; }else{ JS_ReportErrorNumber(cx, JSFile_GetErrorMessage, NULL, JSFILEMSG_OP_FAILED, "mkdir", fullName); JS_free(cx, fullName); goto out; } }out: *rval = JSVAL_FALSE; return JS_FALSE;}static JSBoolfile_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval*rval){ JSFile *file = JS_GetInstancePrivate(cx, obj, &file_class, NULL); *rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, file->path)); return JS_TRUE;}static JSBoolfile_toURL(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSFile *file = JS_GetInstancePrivate(cx, obj, &file_class, NULL); char url[MAX_PATH_LENGTH]; jschar *urlChars; JSFILE_CHECK_NATIVE("toURL"); sprintf(url, "file://%s", file->path); /* TODO: js_escape in jsstr.h may go away at some point */ urlChars = js_InflateString(cx, url, strlen(url)); if (urlChars == NULL) return JS_FALSE; *rval = STRING_TO_JSVAL(js_NewString(cx, urlChars, strlen(url), 0)); if (!js_str_escape(cx, obj, 0, rval, rval)) return JS_FALSE; return JS_TRUE;out: *rval = JSVAL_VOID; return JS_FALSE;}static voidfile_finalize(JSContext *cx, JSObject *obj){ JSFile *file = JS_GetInstancePrivate(cx, obj, &file_class, NULL); if(file){ /* close the file before exiting */ if(file->isOpen && !file->isNative){ jsval vp; file_close(cx, obj, 0, NULL, &vp); } if (file->path) JS_free(cx, file->path); JS_free(cx, file); }}/* Allocates memory for the file object, sets fields to defaults.*/static JSFile*file_init(JSContext *cx, JSObject *obj, char *bytes){ JSFile *file; file = JS_malloc(cx, sizeof *file); if (!file) return NULL; memset(file, 0 , sizeof *file); js_ResetAttributes(file); file->path = RESOLVE_PATH(cx, bytes); if (!JS_SetPrivate(cx, obj, file)) { JS_ReportErrorNumber(cx, JSFile_GetErrorMessage, NULL, JSFILEMSG_CANNOT_SET_PRIVATE_FILE, file->path); JS_free(cx, file); return NULL; }else return file;}/* Returns a JSObject. This function is globally visible */JS_PUBLIC_API(JSObject*)js_NewFileObject(JSContext *cx, char *filename){ JSObject *obj; JSFile *file; obj = JS_NewObject(cx, &file_class, NULL, NULL); if (!obj){ JS_ReportErrorNumber(cx, JSFile_GetErrorMessage, NULL, JSFILEMSG_OBJECT_CREATION_FAILED, "js_NewFileObject"); return NULL; } file = file_init(cx, obj, filename); if(!file) return NULL; return obj;}/* Internal function, used for cases which NSPR file support doesn't cover */JSObject*js_NewFileObjectFromFILE(JSContext *cx, FILE *nativehandle, char *filename, int32 mode, JSBool open, JSBool randomAccess){ JSObject *obj; JSFile *file;#ifdef XP_MAC JS_ReportWarning(cx, "Native files are not fully supported on the MAC");#endif obj = JS_NewObject(cx, &file_class, NULL, NULL); if (!obj){ JS_ReportErrorNumber(cx, JSFile_GetErrorMessage, NULL, JSFILEMSG_OBJECT_CREATION_FAILED, "js_NewFileObjectFromFILE"); return NULL; } file = file_init(cx, obj, filename); if(!file) return NULL; file->nativehandle = nativehandle; /* free result of RESOLVE_PATH from file_init. */ JS_ASSERT(file->path != NULL); JS_free(cx, file->path); file->path = strdup(filename); file->isOpen = open; file->mode = mode; file->hasRandomAccess = randomAccess; file->isNative = JS_TRUE; return obj;}/* Real file constructor that is called from JavaScript. Basically, does error processing and calls file_init.*/static JSBoolfile_constructor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSString *str; JSFile *file; str = (argc==0)?JS_InternString(cx, ""):JS_ValueToString(cx, argv[0]); if (!str){ JS_ReportErrorNumber(cx, JSFile_GetErrorMessage, NULL, JSFILEMSG_FIRST_ARGUMENT_CONSTRUCTOR_NOT_STRING_ERROR, argv[0]); goto out; } file = file_init(cx, obj, JS_GetStringBytes(str)); if (!file) goto out; SECURITY_CHECK(cx, NULL, "constructor", file); return JS_TRUE;out: *rval = JSVAL_VOID; return JS_FALSE;}/* -------------------- File methods and properties ------------------------- */static JSFunctionSpec file_functions[] = { { "open", file_open, 0}, { "close", file_close, 0}, { "remove", file_remove, 0}, { "copyTo", file_copyTo, 0}, { "renameTo", file_renameTo, 0}, { "flush", file_flush, 0}, { "seek", file_seek, 0}, { "read", file_read, 0}, { "readln", file_readln, 0}, { "readAll", file_readAll, 0}, { "write", file_write, 0}, { "writeln", file_writeln, 0}, { "writeAll", file_writeAll, 0}, { "list", file_list, 0}, { "mkdir", file_mkdir, 0}, { "toString", file_toString, 0}, { "toURL", file_toURL, 0}, {0}};enum file_tinyid { FILE_LENGTH = -2, FILE_PARENT = -3, FILE_PATH = -4, FILE_NAME = -5, FILE_ISDIR = -6, FILE_ISFILE = -7, FILE_EXISTS = -8, FILE_CANREAD = -9, FILE_CANWRITE = -10, FILE_OPEN = -11, FILE_TYPE = -12, FILE_MODE = -13, FILE_CREATED = -14, FILE_MODIFIED = -15, FILE_SIZE = -16, FILE_RANDOMACCESS = -17, FILE_POSITION = -18, FILE_APPEND = -19, FILE_REPLACE = -20, FILE_AUTOFLUSH = -21, FILE_ISNATIVE = -22,};static JSPropertySpec file_props[] = { {"length", FILE_LENGTH, JSPROP_ENUMERATE | JSPROP_READONLY }, {"parent", FILE_PARENT, JSPROP_ENUMERATE | JSPROP_READONLY }, {"path", FILE_PATH, JSPROP_ENUMERATE | JSPROP_READONLY }, {"name", FILE_NAME, JSPROP_ENUMERATE | JSPROP_READONLY }, {"isDirectory", FILE_ISDIR, JSPROP_ENUMERATE | JSPROP_READONLY }, {"isFile", FILE_ISFILE, JSPROP_ENUMERATE | JSPROP_READONLY }, {"exists", FILE_EXISTS, JSPROP_ENUMERATE | JSPROP_READONLY }, {"canRead", FILE_CANREAD, JSPROP_ENUMERATE | JSPROP_READONLY }, {"canWrite", FILE_CANWRITE, JSPROP_ENUMERATE | JSPROP_READONLY }, {"canAppend", FILE_APPEND, JSPROP_ENUMERATE | JSPROP_READONLY }, {"canReplace", FILE_REPLACE, JSPROP_ENUMERATE | JSPROP_READONLY }, {"isOpen", FILE_OPEN, JSPROP_ENUMERATE | JSPROP_READONLY }, {"type", FILE_TYPE, JSPROP_ENUMERATE | JSPROP_READONLY }, {"mode", FILE_MODE, JSPROP_ENUMERATE | JSPROP_READONLY }, {"creationTime", FILE_CREATED, JSPROP_ENUMERATE | JSPROP_READONLY }, {"lastModified", FILE_MODIFIED, JSPROP_ENUMERATE | JSPROP_READONLY }, {"size", FILE_SIZE, JSPROP_ENUMERATE | JSPROP_READONLY }, {"hasRandomAccess", FILE_RANDOMACCESS, JSPROP_ENUMERATE | JSPROP_READONLY }, {"hasAutoFlush", FILE_AUTOFLUSH, JSPROP_ENUMERATE | JSPROP_READONLY }, {"position", FILE_POSITION, JSPROP_ENUMERATE }, {"isNative", FILE_ISNATIVE, JSPROP_ENUMERATE | JSPROP_READONLY }, {0}};/* ------------------------- Property getter/setter ------------------------- */static JSBoolfile_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp){ JSFile *file = JS_GetInstancePrivate(cx, obj, &file_class, NULL); char *str; jsint tiny; PRFileInfo info; JSBool flag; PRExplodedTime expandedTime; tiny = JSVAL_TO_INT(id); if(!file) return JS_TRUE; switch (tiny) { case FILE_PARENT: SECURITY_CHECK(cx, NULL, "parent", file); *vp = js_p
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -