Newer
Older
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
static JSClass js_user_stats_class = {
"UserStats" /* name */
,JSCLASS_HAS_PRIVATE /* flags */
,JS_PropertyStub /* addProperty */
,JS_PropertyStub /* delProperty */
,js_user_get /* getProperty */
,js_user_set /* setProperty */
,JS_EnumerateStub /* enumerate */
,JS_ResolveStub /* resolve */
,JS_ConvertStub /* convert */
,JS_FinalizeStub /* finalize */
};
static JSClass js_user_security_class = {
"UserSecurity" /* name */
,JSCLASS_HAS_PRIVATE /* flags */
,JS_PropertyStub /* addProperty */
,JS_PropertyStub /* delProperty */
,js_user_get /* getProperty */
,js_user_set /* setProperty */
,JS_EnumerateStub /* enumerate */
,JS_ResolveStub /* resolve */
,JS_ConvertStub /* convert */
,JS_FinalizeStub /* finalize */
};
static JSClass js_user_limits_class = {
"UserLimits" /* name */
,JSCLASS_HAS_PRIVATE /* flags */
,JS_PropertyStub /* addProperty */
,JS_PropertyStub /* delProperty */
,js_user_get /* getProperty */
,js_user_set /* setProperty */
,JS_EnumerateStub /* enumerate */
,JS_ResolveStub /* resolve */
,JS_ConvertStub /* convert */
,JS_FinalizeStub /* finalize */
};
/* User Constructor (creates instance of user class) */
static JSBool
js_user_constructor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
int i;
JSObject* statsobj;
JSObject* securityobj;
JSObject* limitsobj;
JS_ValueToInt32(cx,argv[0],&val);
user.number=(ushort)val;
if(user.number!=0 && (i=getuserdat(scfg,&user))!=0) {
JS_ReportError(cx,"Error %d reading user number %d",i,val);
/* user.stats */
if((statsobj=JS_DefineObject(cx, obj, "stats"
,&js_user_stats_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY))==NULL)
return(JS_FALSE);
if(!js_DefineSyncProperties(cx, statsobj, js_user_stats_properties))
return(JS_FALSE);
/* user.security */
if((securityobj=JS_DefineObject(cx, obj, "security"
,&js_user_security_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY))==NULL)
return(JS_FALSE);
if(!js_DefineSyncProperties(cx, securityobj, js_user_security_properties))
return(JS_FALSE);
/* user.limits */
if((limitsobj=JS_DefineObject(cx, obj, "limits"
,&js_user_limits_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY))==NULL)
return(JS_FALSE);
if(!js_DefineSyncProperties(cx, limitsobj, js_user_limits_properties))
return(JS_FALSE);
/* other user properties */
if(!js_DefineSyncProperties(cx, obj, js_user_properties))
return(JS_FALSE);
if((p=(private_t*)malloc(sizeof(private_t)))==NULL)
return(JS_FALSE);
p->cfg = scfg;
p->user = user;
p->cached = (user.number==0 ? FALSE : TRUE);
JS_SetPrivate(cx, obj, p); /* Must do this before calling js_DefineSyncMethods() */
if(!js_DefineSyncMethods(cx, obj, js_user_functions, FALSE)) {
JS_SetPrivate(cx, obj, NULL);
free(p);
return(JS_FALSE);
}
JS_SetPrivate(cx, statsobj, p);
JS_SetPrivate(cx, securityobj, p);
JS_SetPrivate(cx, limitsobj, p);
return(JS_TRUE);
}
JSObject* DLLCALL js_CreateUserClass(JSContext* cx, JSObject* parent, scfg_t* cfg)
{
JSObject* userclass;
scfg = cfg;
userclass = JS_InitClass(cx, parent, NULL
,&js_user_class
,js_user_constructor
,1 /* number of constructor args */
,NULL /* props, defined in constructor */
,NULL /* funcs, defined in constructor */
,NULL,NULL);
return(userclass);
}
JSObject* DLLCALL js_CreateUserObject(JSContext* cx, JSObject* parent, scfg_t* cfg, char* name
, uint usernumber)
{
JSObject* userobj;
JSObject* statsobj;
JSObject* limitsobj;

rswindell
committed
private_t* p;
jsval val;

rswindell
committed
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);
p->cfg = cfg;
p->user.number = usernumber;
p->cached = FALSE;

rswindell
committed
JS_SetPrivate(cx, userobj, p);
if(!js_DefineSyncProperties(cx, userobj, js_user_properties)) {
free(p);
return(NULL);
}
#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);
js_DefineSyncMethods(cx, userobj, js_user_functions, FALSE);

rswindell
committed
/* user.stats */
statsobj = JS_DefineObject(cx, userobj, "stats"
,&js_user_stats_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY);
if(statsobj==NULL) {
free(p);
}

rswindell
committed
JS_SetPrivate(cx, statsobj, p);
if(!js_DefineSyncProperties(cx, statsobj, js_user_stats_properties)) {
free(p);
return(NULL);
}
#ifdef BUILD_JSDOCS
js_DescribeSyncObject(cx,statsobj,"User statistics (all <small>READ ONLY</small>)",310);
js_CreateArrayOfStrings(cx, statsobj, "_property_desc_list", user_stats_prop_desc, JSPROP_READONLY);
#endif
/* user.limits */
limitsobj = JS_DefineObject(cx, userobj, "limits"
,&js_user_limits_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY);
if(limitsobj==NULL) {
free(p);
return(NULL);
}
JS_SetPrivate(cx, limitsobj, p);
if(!js_DefineSyncProperties(cx, limitsobj, js_user_limits_properties)) {
free(p);
return(NULL);
}
#ifdef BUILD_JSDOCS
js_DescribeSyncObject(cx,limitsobj,"User limitations based on security level (all <small>READ ONLY</small>)",311);
js_CreateArrayOfStrings(cx, limitsobj, "_property_desc_list", user_limits_prop_desc, JSPROP_READONLY);
#endif
/* user.security */
securityobj = JS_DefineObject(cx, userobj, "security"
,&js_user_security_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY);
if(securityobj==NULL) {
free(p);
}

rswindell
committed
JS_SetPrivate(cx, securityobj, p);
if(!js_DefineSyncProperties(cx, securityobj, js_user_security_properties)) {
free(p);
return(NULL);
}
#ifdef BUILD_JSDOCS
js_DescribeSyncObject(cx,securityobj,"User security settings",310);
js_CreateArrayOfStrings(cx, securityobj, "_property_desc_list", user_security_prop_desc, JSPROP_READONLY);
#endif
/****************************************************************************/
/* Creates all the user-specific objects: user, msg_area, file_area */
/****************************************************************************/
JSBool DLLCALL
js_CreateUserObjects(JSContext* cx, JSObject* parent, scfg_t* cfg, user_t* user
,char* html_index_file, subscan_t* subscan)
{
if(js_CreateUserObject(cx,parent,cfg,"user",user==NULL ? 0 : user->number)==NULL)
return(JS_FALSE);
if(js_CreateFileAreaObject(cx,parent,cfg,user,html_index_file)==NULL)
return(JS_FALSE);
if(js_CreateMsgAreaObject(cx,parent,cfg,user,subscan)==NULL)
return(JS_FALSE);
if(js_CreateXtrnAreaObject(cx,parent,cfg,user)==NULL)
return(JS_FALSE);
return(JS_TRUE);
}