JSObject* DLLCALL js_CreateUserObject(JSContext* cx, JSObject* parent, scfg_t* cfg, char* name ,user_t* user, client_t* client, BOOL global_user) { JSObject* userobj; private_t* p; jsval val; if(name==NULL) userobj = JS_NewObject(cx, &js_user_class, NULL, parent); else if(JS_GetProperty(cx,parent,name,&val) && val!=JSVAL_VOID) userobj = JSVAL_TO_OBJECT(val); /* Return existing user object */ else userobj = JS_DefineObject(cx, parent, name, &js_user_class , NULL, JSPROP_ENUMERATE|JSPROP_READONLY); if(userobj==NULL) return(NULL); if((p=JS_GetPrivate(cx, userobj)) == NULL) /* Uses existing private pointer: Fix memory leak? */ if((p=(private_t*)malloc(sizeof(private_t)))==NULL) return(NULL); memset(p,0,sizeof(private_t)); p->client = client; p->cached = FALSE; p->user = &p->storage; if(user!=NULL) { p->storage = *user; if(global_user) p->user = user; } JS_SetPrivate(cx, userobj, p); #ifdef BUILD_JSDOCS js_DescribeSyncObject(cx,userobj ,"Instance of <i>User</i> class, representing current user online" ,310); js_DescribeSyncConstructor(cx,userobj ,"To create a new user object: <tt>var u = new User(<i>number</i>)</tt>"); js_CreateArrayOfStrings(cx, userobj ,"_property_desc_list", user_prop_desc, JSPROP_READONLY); #endif return(userobj); }
JSObject* DLLCALL js_CreateInternalJsObject(JSContext* cx, JSObject* parent, js_callback_t* cb, js_startup_t* startup) { JSObject* obj; if((obj = JS_DefineObject(cx, parent, "js", &js_internal_class, NULL ,JSPROP_ENUMERATE|JSPROP_READONLY))==NULL) return(NULL); if(!JS_SetPrivate(cx, obj, cb)) /* Store a pointer to js_callback_t */ return(NULL); if(startup!=NULL) { JSObject* load_path_list; jsval val; str_list_t load_path; if((load_path_list=JS_NewArrayObject(cx, 0, NULL))==NULL) return(NULL); val=OBJECT_TO_JSVAL(load_path_list); if(!JS_SetProperty(cx, obj, JAVASCRIPT_LOAD_PATH_LIST, &val)) return(NULL); if((load_path=strListSplitCopy(NULL, startup->load_path, ",")) != NULL) { JSString* js_str; unsigned i; for(i=0; load_path[i]!=NULL; i++) { if((js_str=JS_NewStringCopyZ(cx, load_path[i]))==NULL) break; val=STRING_TO_JSVAL(js_str); if(!JS_SetElement(cx, load_path_list, i, &val)) break; } strListFree(&load_path); } } #ifdef BUILD_JSDOCS js_DescribeSyncObject(cx,obj,"JavaScript engine internal control object",311); js_CreateArrayOfStrings(cx, obj, "_property_desc_list", prop_desc, JSPROP_READONLY); #endif return(obj); }
JSObject* js_CreateConsoleObject(JSContext* cx, JSObject* parent) { JSObject* obj; sbbs_t* sbbs; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(NULL); if((obj=JS_DefineObject(cx, parent, "console", &js_console_class, NULL ,JSPROP_ENUMERATE|JSPROP_READONLY))==NULL) return(NULL); if(!js_DefineSyncProperties(cx, obj, js_console_properties)) return(NULL); if (!js_DefineSyncMethods(cx, obj, js_console_functions, FALSE)) return(NULL); /* Create an array of pre-defined colors */ JSObject* color_list; if((color_list=JS_NewArrayObject(cx,0,NULL))==NULL) return(NULL); if(!JS_DefineProperty(cx, obj, "color_list", OBJECT_TO_JSVAL(color_list) ,NULL, NULL, 0)) return(NULL); for(uint i=0;i<sbbs->cfg.total_colors;i++) { jsval val=INT_TO_JSVAL(sbbs->cfg.color[i]); if(!JS_SetElement(cx, color_list, i, &val)) return(NULL); } #ifdef BUILD_JSDOCS js_DescribeSyncObject(cx,obj,"Controls the user's Telnet/RLogin terminal",310); js_CreateArrayOfStrings(cx, obj, "_property_desc_list", con_prop_desc, JSPROP_READONLY); #endif return(obj); }
JSObject* DLLCALL js_CreateServerObject(JSContext* cx, JSObject* parent ,js_server_props_t* props) { JSObject* obj; if((obj = JS_DefineObject(cx, parent, "server", &js_server_class, NULL ,JSPROP_ENUMERATE|JSPROP_READONLY))==NULL) return(NULL); if(!JS_SetPrivate(cx, obj, props)) return(NULL); #ifdef BUILD_JSDOCS js_DescribeSyncObject(cx,obj,"Server-specifc properties",310); js_CreateArrayOfStrings(cx,obj,"_property_desc_list", server_prop_desc, JSPROP_READONLY); #endif return(obj); }
JSObject* DLLCALL js_CreateClientObject(JSContext* cx, JSObject* parent ,char* name, client_t* client, SOCKET sock) { JSObject* obj; obj = JS_DefineObject(cx, parent, name, &js_client_class, NULL ,JSPROP_ENUMERATE|JSPROP_READONLY); if(obj==NULL) return(NULL); JS_SetPrivate(cx, obj, client); /* Store a pointer to client_t */ js_CreateSocketObject(cx, obj, "socket", sock); #ifdef BUILD_JSDOCS js_DescribeSyncObject(cx,obj,"Represents a TCP/IP client session",310); js_CreateArrayOfStrings(cx, obj, "_property_desc_list", client_prop_desc, JSPROP_READONLY); #endif return(obj); }
JSObject* DLLCALL js_CreateInternalJsObject(JSContext* cx, JSObject* parent, js_branch_t* branch) { JSObject* obj; if((obj = JS_DefineObject(cx, parent, "js", &js_internal_class, NULL ,JSPROP_ENUMERATE|JSPROP_READONLY))==NULL) return(NULL); if(!JS_SetPrivate(cx, obj, branch)) /* Store a pointer to js_branch_t */ return(NULL); if(!js_DefineSyncProperties(cx, obj, js_properties)) /* expose them */ return(NULL); if(!js_DefineSyncMethods(cx, obj, js_functions, /* append? */ FALSE)) return(NULL); #ifdef BUILD_JSDOCS js_DescribeSyncObject(cx,obj,"JavaScript execution and garbage collection control object",311); js_CreateArrayOfStrings(cx, obj, "_property_desc_list", prop_desc, JSPROP_READONLY); #endif return(obj); }
JSObject* DLLCALL js_CreateXtrnAreaObject(JSContext* cx, JSObject* parent, scfg_t* cfg ,user_t* user, client_t* client) { JSObject* areaobj; JSObject* allsec; JSObject* allprog; JSObject* secobj; JSObject* progobj; JSObject* eventobj; JSObject* event_array; JSObject* xeditobj; JSObject* xedit_array; JSObject* sec_list; JSObject* prog_list; JSString* js_str; jsval val; jsuint sec_index; jsuint prog_index; uint l,d; /* Return existing object if it's already been created */ if(JS_GetProperty(cx,parent,"xtrn_area",&val) && val!=JSVAL_VOID) areaobj = JSVAL_TO_OBJECT(val); else areaobj = JS_DefineObject(cx, parent, "xtrn_area", NULL , NULL, JSPROP_ENUMERATE|JSPROP_READONLY); if(areaobj==NULL) return(NULL); #ifdef BUILD_JSDOCS js_DescribeSyncObject(cx,areaobj,"External Program Areas",310); #endif /* xtrn_area.sec[] */ if((allsec=JS_NewObject(cx,NULL,NULL,areaobj))==NULL) return(NULL); val=OBJECT_TO_JSVAL(allsec); if(!JS_SetProperty(cx, areaobj, "sec", &val)) return(NULL); /* xtrn_area.prog[] */ if((allprog=JS_NewObject(cx,NULL,NULL,areaobj))==NULL) return(NULL); val=OBJECT_TO_JSVAL(allprog); if(!JS_SetProperty(cx, areaobj, "prog", &val)) return(NULL); /* xtrn_area.sec_list[] */ if((sec_list=JS_NewArrayObject(cx, 0, NULL))==NULL) return(NULL); val=OBJECT_TO_JSVAL(sec_list); if(!JS_SetProperty(cx, areaobj, "sec_list", &val)) return(NULL); for(l=0;l<cfg->total_xtrnsecs;l++) { if((secobj=JS_NewObject(cx, NULL, NULL, NULL))==NULL) return(NULL); sec_index=-1; if(user==NULL || chk_ar(cfg,cfg->xtrnsec[l]->ar,user,client)) { if(!JS_GetArrayLength(cx, sec_list, &sec_index)) return(NULL); val=OBJECT_TO_JSVAL(secobj); if(!JS_SetElement(cx, sec_list, sec_index, &val)) return(NULL); } /* Add as property (associative array element) */ if(!JS_DefineProperty(cx, allsec, cfg->xtrnsec[l]->code, val ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE)) return(NULL); val=INT_TO_JSVAL(sec_index); if(!JS_SetProperty(cx, secobj, "index", &val)) return(NULL); val=INT_TO_JSVAL(l); if(!JS_SetProperty(cx, secobj, "number", &val)) return(NULL); if((js_str=JS_NewStringCopyZ(cx, cfg->xtrnsec[l]->code))==NULL) return(NULL); val=STRING_TO_JSVAL(js_str); if(!JS_SetProperty(cx, secobj, "code", &val)) return(NULL); if((js_str=JS_NewStringCopyZ(cx, cfg->xtrnsec[l]->name))==NULL) return(NULL); val=STRING_TO_JSVAL(js_str); if(!JS_SetProperty(cx, secobj, "name", &val)) return(NULL); if((js_str=JS_NewStringCopyZ(cx, cfg->xtrnsec[l]->arstr))==NULL) return(NULL); val=STRING_TO_JSVAL(js_str); if(!JS_SetProperty(cx, secobj, "ars", &val)) return(NULL); if(user==NULL || chk_ar(cfg,cfg->xtrnsec[l]->ar,user,client)) val=JSVAL_TRUE; else val=JSVAL_FALSE; if(!JS_SetProperty(cx, secobj, "can_access", &val)) return(NULL); /* prog_list[] */ if((prog_list=JS_NewArrayObject(cx, 0, NULL))==NULL) return(NULL); val=OBJECT_TO_JSVAL(prog_list); if(!JS_SetProperty(cx, secobj, "prog_list", &val)) return(NULL); #ifdef BUILD_JSDOCS js_DescribeSyncObject(cx,secobj,"Online Program (door) Sections (current user has access to)",310); #endif for(d=0;d<cfg->total_xtrns;d++) { if(cfg->xtrn[d]->sec!=l) continue; if((progobj=JS_NewObject(cx, NULL, NULL, NULL))==NULL) return(NULL); prog_index=-1; if((user==NULL || chk_ar(cfg,cfg->xtrn[d]->ar,user,client)) && !(cfg->xtrn[d]->event && cfg->xtrn[d]->misc&EVENTONLY)) { if(!JS_GetArrayLength(cx, prog_list, &prog_index)) return(NULL); val=OBJECT_TO_JSVAL(progobj); if(!JS_SetElement(cx, prog_list, prog_index, &val)) return(NULL); } /* Add as property (associative array element) */ if(!JS_DefineProperty(cx, allprog, cfg->xtrn[d]->code, val ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE)) return(NULL); val=INT_TO_JSVAL(prog_index); if(!JS_SetProperty(cx, progobj, "index", &val)) return(NULL); val=INT_TO_JSVAL(d); if(!JS_SetProperty(cx, progobj, "number", &val)) return(NULL); val=INT_TO_JSVAL(sec_index); if(!JS_SetProperty(cx, progobj, "sec_index", &val)) return(NULL); val=INT_TO_JSVAL(l); if(!JS_SetProperty(cx, progobj, "sec_number", &val)) return(NULL); val=STRING_TO_JSVAL(JS_NewStringCopyZ(cx,cfg->xtrnsec[l]->code)); if(!JS_SetProperty(cx, progobj, "sec_code", &val)) return(NULL); if(!js_CreateXtrnProgProperties(cx, progobj, cfg->xtrn[d])) return(NULL); if(user==NULL || chk_ar(cfg,cfg->xtrn[d]->ar,user,client)) val=JSVAL_TRUE; else val=JSVAL_FALSE; if(!JS_SetProperty(cx, progobj, "can_access", &val)) return(NULL); if(user==NULL || chk_ar(cfg,cfg->xtrn[d]->run_ar,user,client)) val=JSVAL_TRUE; else val=JSVAL_FALSE; if(!JS_SetProperty(cx, progobj, "can_run", &val)) return(NULL); #ifdef BUILD_JSDOCS js_DescribeSyncObject(cx,progobj,"Online External Programs (doors) (current user has access to)",310); #endif } #ifdef BUILD_JSDOCS js_CreateArrayOfStrings(cx, secobj, "_property_desc_list", xtrn_sec_prop_desc, JSPROP_READONLY); #endif } #ifdef BUILD_JSDOCS js_DescribeSyncObject(cx,allsec,"Associative array of all external program sections (use internal code as index)",312); JS_DefineProperty(cx,allsec,"_dont_document",JSVAL_TRUE,NULL,NULL,JSPROP_READONLY); js_DescribeSyncObject(cx,allprog,"Associative array of all external programs (use internal code as index)",311); JS_DefineProperty(cx,allprog,"_dont_document",JSVAL_TRUE,NULL,NULL,JSPROP_READONLY); #endif /* Create event property */ if((event_array=JS_NewObject(cx,NULL,NULL,areaobj))==NULL) return(NULL); val=OBJECT_TO_JSVAL(event_array); if(!JS_SetProperty(cx, areaobj, "event", &val)) return(NULL); for(l=0;l<cfg->total_events;l++) { if((eventobj=JS_NewObject(cx, NULL, NULL, NULL))==NULL) return(NULL); if(!JS_DefineProperty(cx, event_array, cfg->event[l]->code, OBJECT_TO_JSVAL(eventobj) ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE)) return(NULL); if((js_str=JS_NewStringCopyZ(cx, cfg->event[l]->cmd))==NULL) return(NULL); if(!JS_DefineProperty(cx, eventobj, "cmd", STRING_TO_JSVAL(js_str) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(NULL); if((js_str=JS_NewStringCopyZ(cx, cfg->event[l]->dir))==NULL) return(NULL); if(!JS_DefineProperty(cx, eventobj, "startup_dir", STRING_TO_JSVAL(js_str) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(NULL); if(!JS_DefineProperty(cx, eventobj, "node_num", INT_TO_JSVAL(cfg->event[l]->node) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(NULL); if(!JS_DefineProperty(cx, eventobj, "time", INT_TO_JSVAL(cfg->event[l]->time) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(NULL); if(!JS_DefineProperty(cx, eventobj, "freq", INT_TO_JSVAL(cfg->event[l]->freq) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(NULL); if(!JS_DefineProperty(cx, eventobj, "days", INT_TO_JSVAL(cfg->event[l]->days) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(NULL); if(!JS_DefineProperty(cx, eventobj, "mdays", INT_TO_JSVAL(cfg->event[l]->mdays) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(NULL); if(!JS_DefineProperty(cx, eventobj, "months", INT_TO_JSVAL(cfg->event[l]->months) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(NULL); if(!JS_DefineProperty(cx, eventobj, "last_run", INT_TO_JSVAL(cfg->event[l]->last) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(NULL); if(!JS_DefineProperty(cx, eventobj, "settings", INT_TO_JSVAL(cfg->event[l]->misc) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(NULL); #ifdef BUILD_JSDOCS js_CreateArrayOfStrings(cx, eventobj, "_property_desc_list", event_prop_desc, JSPROP_READONLY); #endif } #ifdef BUILD_JSDOCS js_DescribeSyncObject(cx,event_array,"Associative array of all timed events (use internal code as index)",311); JS_DefineProperty(cx,event_array,"_assoc_array",JSVAL_TRUE,NULL,NULL,JSPROP_READONLY); #endif /* Create editor property */ if((xedit_array=JS_NewObject(cx,NULL,NULL,areaobj))==NULL) return(NULL); val=OBJECT_TO_JSVAL(xedit_array); if(!JS_SetProperty(cx, areaobj, "editor", &val)) return(NULL); for(l=0;l<cfg->total_xedits;l++) { if(user!=NULL && !chk_ar(cfg,cfg->xedit[l]->ar,user,client)) continue; if((xeditobj=JS_NewObject(cx, NULL, NULL, NULL))==NULL) return(NULL); if(!JS_DefineProperty(cx, xedit_array, cfg->xedit[l]->code, OBJECT_TO_JSVAL(xeditobj) ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE)) return(NULL); if((js_str=JS_NewStringCopyZ(cx, cfg->xedit[l]->name))==NULL) return(NULL); if(!JS_DefineProperty(cx, xeditobj, "name", STRING_TO_JSVAL(js_str) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(NULL); if((js_str=JS_NewStringCopyZ(cx, cfg->xedit[l]->rcmd))==NULL) return(NULL); if(!JS_DefineProperty(cx, xeditobj, "cmd", STRING_TO_JSVAL(js_str) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(NULL); if((js_str=JS_NewStringCopyZ(cx, cfg->xedit[l]->arstr))==NULL) return(NULL); if(!JS_DefineProperty(cx, xeditobj, "ars", STRING_TO_JSVAL(js_str) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(NULL); if(!JS_DefineProperty(cx, xeditobj, "settings", INT_TO_JSVAL(cfg->xedit[l]->misc) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(NULL); if(!JS_DefineProperty(cx, xeditobj, "type", INT_TO_JSVAL(cfg->xedit[l]->type) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(NULL); #ifdef BUILD_JSDOCS js_CreateArrayOfStrings(cx, xeditobj, "_property_desc_list", xedit_prop_desc, JSPROP_READONLY); #endif } #ifdef BUILD_JSDOCS js_DescribeSyncObject(cx,xedit_array,"Associative array of all external editors (use internal code as index)",311); JS_DefineProperty(cx,xedit_array,"_assoc_array",JSVAL_TRUE,NULL,NULL,JSPROP_READONLY); #endif return(areaobj); }
BOOL DLLCALL js_CreateXtrnProgProperties(JSContext* cx, JSObject* obj, xtrn_t* xtrn) { JSString* js_str; if((js_str=JS_NewStringCopyZ(cx, xtrn->code))==NULL) return(FALSE); if(!JS_DefineProperty(cx, obj, "code", STRING_TO_JSVAL(js_str) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(FALSE); if((js_str=JS_NewStringCopyZ(cx, xtrn->name))==NULL) return(FALSE); if(!JS_DefineProperty(cx, obj, "name", STRING_TO_JSVAL(js_str) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(FALSE); if((js_str=JS_NewStringCopyZ(cx, xtrn->cmd))==NULL) return(FALSE); if(!JS_DefineProperty(cx, obj, "cmd", STRING_TO_JSVAL(js_str) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(FALSE); if((js_str=JS_NewStringCopyZ(cx, xtrn->clean))==NULL) return(FALSE); if(!JS_DefineProperty(cx, obj, "clean_cmd", STRING_TO_JSVAL(js_str) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(FALSE); if((js_str=JS_NewStringCopyZ(cx, xtrn->path))==NULL) return(FALSE); if(!JS_DefineProperty(cx, obj, "startup_dir", STRING_TO_JSVAL(js_str) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(FALSE); if((js_str=JS_NewStringCopyZ(cx, xtrn->arstr))==NULL) return(FALSE); if(!JS_DefineProperty(cx, obj, "ars", STRING_TO_JSVAL(js_str) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(FALSE); if((js_str=JS_NewStringCopyZ(cx, xtrn->run_arstr))==NULL) return(FALSE); if(!JS_DefineProperty(cx, obj, "execution_ars", STRING_TO_JSVAL(js_str) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(FALSE); if(!JS_DefineProperty(cx, obj, "settings", INT_TO_JSVAL(xtrn->misc) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(FALSE); if(!JS_DefineProperty(cx, obj, "type", INT_TO_JSVAL(xtrn->type) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(FALSE); if(!JS_DefineProperty(cx, obj, "event", INT_TO_JSVAL(xtrn->event) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(FALSE); if(!JS_DefineProperty(cx, obj, "textra", INT_TO_JSVAL(xtrn->textra) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(FALSE); if(!JS_DefineProperty(cx, obj, "max_time", INT_TO_JSVAL(xtrn->maxtime) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(FALSE); if(!JS_DefineProperty(cx, obj, "cost", INT_TO_JSVAL(xtrn->cost) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) return(FALSE); #ifdef BUILD_JSDOCS js_CreateArrayOfStrings(cx, obj, "_property_desc_list", xtrn_prog_prop_desc, JSPROP_READONLY); #endif return(TRUE); }
static JSBool js_user_resolve(JSContext *cx, JSObject *obj, jsid id) { char* name=NULL; JSObject* newobj; private_t* p; JSBool ret; if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL) return(JS_TRUE); if(id != JSID_VOID && id != JSID_EMPTY) { jsval idval; JS_IdToValue(cx, id, &idval); if(JSVAL_IS_STRING(idval)) { JSSTRING_TO_MSTRING(cx, JSVAL_TO_STRING(idval), name, NULL); HANDLE_PENDING(cx); } } if(name==NULL || strcmp(name, "stats")==0) { if(name) free(name); /* user.stats */ if((newobj=JS_DefineObject(cx, obj, "stats" ,&js_user_stats_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY))==NULL) return(JS_FALSE); JS_SetPrivate(cx, newobj, p); #ifdef BUILD_JSDOCS js_DescribeSyncObject(cx,newobj,"User statistics (all <small>READ ONLY</small>)",310); js_CreateArrayOfStrings(cx, newobj, "_property_desc_list", user_stats_prop_desc, JSPROP_READONLY); #endif if(name) return(JS_TRUE); } if(name==NULL || strcmp(name, "security")==0) { if(name) free(name); /* user.security */ if((newobj=JS_DefineObject(cx, obj, "security" ,&js_user_security_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY))==NULL) return(JS_FALSE); JS_SetPrivate(cx, newobj, p); #ifdef BUILD_JSDOCS js_DescribeSyncObject(cx,newobj,"User security settings",310); js_CreateArrayOfStrings(cx, newobj, "_property_desc_list", user_security_prop_desc, JSPROP_READONLY); #endif if(name) return(JS_TRUE); } if(name==NULL || strcmp(name, "limits")==0) { if(name) free(name); /* user.limits */ if((newobj=JS_DefineObject(cx, obj, "limits" ,&js_user_limits_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY))==NULL) return(JS_FALSE); JS_SetPrivate(cx, newobj, p); #ifdef BUILD_JSDOCS js_DescribeSyncObject(cx,newobj,"User limitations based on security level (all <small>READ ONLY</small>)",311); js_CreateArrayOfStrings(cx, newobj, "_property_desc_list", user_limits_prop_desc, JSPROP_READONLY); #endif if(name) return(JS_TRUE); } ret=js_SyncResolve(cx, obj, name, js_user_properties, js_user_functions, NULL, 0); if(name) free(name); return ret; }