Newer
Older
{"sent_email", js_sent_email, 1, JSTYPE_BOOLEAN, JSDOCSTR("[count] [,bool feedback]")
,JSDOCSTR("Adjust user's email/feedback-sent statistics by <i>count</i> (default: 1) (negative to subtract)")
},
{"uploaded_file", js_uploaded_file, 1, JSTYPE_BOOLEAN, JSDOCSTR("[bytes] [,files]")
,JSDOCSTR("Adjust user's files/bytes-uploaded statistics")
},
{"downloaded_file", js_downloaded_file, 1, JSTYPE_BOOLEAN, JSDOCSTR("[bytes] [,files]")
,JSDOCSTR("Adjust user's files/bytes-downloaded statistics")
},
{"get_time_left", js_get_time_left, 1, JSTYPE_NUMBER, JSDOCSTR("start_time")
,JSDOCSTR("Returns the user's available remaining time online, in seconds,<br>"
"based on the passed <i>start_time</i> value (in time_t format)<br>"
"Note: this method does not account for pending forced timed events")
,31401
},

rswindell
committed
{0}
};
static JSClass js_user_class = {
"User" /* 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 */

rswindell
committed
,js_user_finalize /* finalize */
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
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);
}