jsj_javapackage.c

来自「一个基于alice开发的机器人」· C语言 代码 · 共 549 行 · 第 1/2 页

C
549
字号

    switch (type) {

    /* Pretty-printing of JavaPackage */
    case JSTYPE_VOID:   /* Default value */
    case JSTYPE_NUMBER:
    case JSTYPE_STRING:
        /* Convert '/' to '.' so that it looks like Java language syntax. */
        if (!package->path)
            break;
        name = JS_smprintf("[JavaPackage %s]", package->path);
        if (!name) {
            JS_ReportOutOfMemory(cx);
            return JS_FALSE;
        }
        for (cp = name; *cp != '\0'; cp++)
            if (*cp == '/')
                *cp = '.';
        str = JS_NewString(cx, name, strlen(name));
        if (!str) {
            free(name);
            /* It's not necessary to call JS_ReportOutOfMemory(), as
               JS_NewString() will do so on failure. */
            return JS_FALSE;
        }

        *vp = STRING_TO_JSVAL(str);
        break;

    case JSTYPE_OBJECT:
        *vp = OBJECT_TO_JSVAL(obj);
        break;

    default:
        break;
    }
    return JS_TRUE;
}

/*
 * Free the private native data associated with the JavaPackage object.
 */
JS_STATIC_DLL_CALLBACK(void)
JavaPackage_finalize(JSContext *cx, JSObject *obj)
{
    JavaPackage_Private *package = JS_GetPrivate(cx, obj);
    if (!package)
        return;

    if (package->path)
        JS_free(cx, (char *)package->path);
    JS_free(cx, package);
}

/*
 * The definition of the JavaPackage class
 */
JSClass JavaPackage_class = {
    "JavaPackage", JSCLASS_HAS_PRIVATE,
    JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JavaPackage_setProperty,
    JS_EnumerateStub, JavaPackage_resolve,
    JavaPackage_convert, JavaPackage_finalize,

    /* Optionally non-null members start here. */
    NULL,                       /* getObjectOps */
    NULL,                       /* checkAccess */
    NULL,                       /* call */
    NULL,                       /* construct */
    NULL,                       /* xdrObject */
    NULL,                       /* hasInstance */
    NULL,                       /* mark */
    0,                          /* spare */
};

JavaPackageDef
standard_java_packages[] = {
    {"java",                NULL,   PKG_USER,   0},
    {"java.applet",         NULL,   PKG_USER,   JSPROP_READONLY},
    {"java.awt",            NULL,   PKG_USER,   JSPROP_READONLY},
    {"java.awt.datatransfer",                       
                            NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"java.awt.event",      NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"java.awt.image",      NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"java.awt.peer",       NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"java.beans",          NULL,   PKG_USER,   JSPROP_READONLY},
    {"java.io",             NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"java.lang",           NULL,   PKG_USER,   JSPROP_READONLY},
    {"java.lang.reflect",   NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"java.math",           NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"java.net",            NULL,   PKG_USER,   JSPROP_READONLY},
    {"java.rmi",            NULL,   PKG_USER,   JSPROP_READONLY},
    {"java.rmi.dgc",        NULL,   PKG_USER,   JSPROP_READONLY},
    {"java.rmi.user",       NULL,   PKG_USER,   JSPROP_READONLY},
    {"java.rmi.registry",   NULL,   PKG_USER,   JSPROP_READONLY},
    {"java.rmi.server",     NULL,   PKG_USER,   JSPROP_READONLY},
    {"java.security",       NULL,   PKG_USER,   JSPROP_READONLY},
    {"java.security.acl",   NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"java.security.interfaces",
                            NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"java.sql",            NULL,   PKG_USER,   JSPROP_READONLY},
    {"java.text",           NULL,   PKG_USER,   JSPROP_READONLY},
    {"java.text.resources", NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"java.util",           NULL,   PKG_USER,   JSPROP_READONLY},
    {"java.util.zip",       NULL,   PKG_SYSTEM, JSPROP_READONLY},

    {"netscape",            NULL,   PKG_USER,   0},
    {"netscape.applet",     NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"netscape.application",NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"netscape.debug",      NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"netscape.javascript", NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"netscape.ldap",       NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"netscape.misc",       NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"netscape.net",        NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"netscape.plugin",     NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"netscape.util",       NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"netscape.secfile",    NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"netscape.security",   NULL,   PKG_SYSTEM, JSPROP_READONLY},
    {"netscape.WAI",        NULL,   PKG_SYSTEM, JSPROP_READONLY},

    {"sun",                 NULL,   PKG_USER,   0},
    {"Packages",            "",     PKG_USER,   JSPROP_READONLY},

    {NULL,                  NULL,   0,          0}
};

/*
 * On systems which provide strtok_r we'll use that function to avoid
 * problems with non-thread-safety.
 */
#if HAVE_STRTOK_R
# define STRTOK_1ST(str, seps, res) strtok_r (str, seps, &res)
# define STRTOK_OTHER(seps, res) strtok_r (res, seps, &res)
#else
# define STRTOK_1ST(str, seps, res) strtok (str, seps)
# define STRTOK_OTHER(seps, res) strtok (NULL, seps)
#endif

/*
 * Pre-define a hierarchy of JavaPackage objects.
 * Pre-defining a Java package at initialization time is not necessary, but
 * it will make package lookup faster and, more importantly, will avoid
 * unnecessary network accesses if classes are being loaded over the network.
 */
static JSBool
pre_define_java_packages(JSContext *cx, JSObject *global_obj,
                         JavaPackageDef *predefined_packages)
{
    JSBool package_exists;
    JSObject *parent_obj;
    JavaPackageDef *package_def;
    char *simple_name, *cp, *package_name, *path;
    int flags;

    if (!predefined_packages)
        return JS_TRUE;

    /* Iterate over all pre-defined Java packages */
    for (package_def = predefined_packages; package_def->name; package_def++) {
#if HAVE_STRTOK_R
	char *nextstr;
#endif
        package_name = path = NULL;

        parent_obj = global_obj;
        package_name = strdup(package_def->name);
        if (!package_name)
            goto out_of_memory;

        /* Walk the chain of JavaPackage objects to get to the parent of the
           rightmost sub-package in the fully-qualified package name. */
        for (simple_name = STRTOK_1ST(package_name, ".", nextstr); simple_name /*1*/; simple_name = STRTOK_OTHER(".", nextstr)) {
            jsval v;

            if (!simple_name) {
                JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL, 
                                        JSJMSG_DOUBLE_SHIPPING, package_name);
                goto error;
            }

            /* Check to see if the sub-package already exists */
            quiet_resolve_failure = JS_TRUE;
            package_exists = JS_LookupProperty(cx, parent_obj, simple_name, &v) && JSVAL_IS_OBJECT(v);
            quiet_resolve_failure = JS_FALSE;

            if (package_exists) {
                parent_obj = JSVAL_TO_OBJECT(v);
                continue;
            }

            /* New package objects should only be created at the terminal
               sub-package in a fully-qualified package-name */
            if (STRTOK_OTHER(".", nextstr)) {
                JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
                                JSJMSG_BAD_PACKAGE_PREDEF,
                               package_def->name);
                goto error;
            }
            
            if (package_def->path) {
                path = strdup(package_def->path);
                if (!path)
                    goto out_of_memory;
            } else {
                /*
                 * The default path is specified, so create it from the
                 * fully-qualified package name.
                 */
                path = strdup(package_def->name);
                if (!path)
                    goto out_of_memory;
                /* Transform package name, e.g. "java.lang" ==> "java/lang" */
                for (cp = path; *cp != '\0'; cp++) {
                    if (*cp == '.')
                         *cp = '/';
                }
            }
            flags = package_def->flags;
            parent_obj = define_JavaPackage(cx, parent_obj, simple_name, path, flags,
                                            package_def->access);
            if (!parent_obj)
                goto error;
 
            free(path);
            break;
        }
        free(package_name);
    }
    return JS_TRUE;

out_of_memory:
    JS_ReportOutOfMemory(cx);

error:
    JS_FREE_IF(cx, package_name);
    JS_FREE_IF(cx, path);
    return JS_FALSE;
}

JS_STATIC_DLL_CALLBACK(JSBool)
JavaPackage_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
                 jsval *rval)
{
    if (!JS_InstanceOf(cx, obj, &JavaPackage_class, argv))
        return JS_FALSE;
    return JavaPackage_convert(cx, obj, JSTYPE_STRING, rval);
}

static JSFunctionSpec JavaPackage_methods[] = {
    {"toString",   JavaPackage_toString,        0,      0,      0},
    {0, 0, 0, 0, 0},
};

/*
 * One-time initialization for the JavaPackage class.  (This is not
 * run once per thread, rather it's run once for a given JSContext.)
 */
JSBool
jsj_init_JavaPackage(JSContext *cx, JSObject *global_obj,
                     JavaPackageDef *additional_predefined_packages) {

    /* Define JavaPackage class */
    if (!JS_InitClass(cx, global_obj, 0, &JavaPackage_class,
                      0, 0, 0, JavaPackage_methods, 0, 0))
        return JS_FALSE;

    /* Add top-level packages, e.g. : java, netscape, sun */
    if (!pre_define_java_packages(cx, global_obj, standard_java_packages))
        return JS_FALSE;
    if (!pre_define_java_packages(cx, global_obj, additional_predefined_packages))
        return JS_FALSE;
    
    return JS_TRUE;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?