⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jsfile.c

📁 Swfdec still is development software, but has also followed a rigid no-crashes-allowed policy. I b
💻 C
📖 第 1 页 / 共 5 页
字号:
    *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 + -