Skip to content
Snippets Groups Projects
js_user.c 34.1 KiB
Newer Older
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		*/
};

rswindell's avatar
rswindell committed
/* User Constructor (creates instance of user class) */

static JSBool
js_user_constructor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
	int32		val=0;
rswindell's avatar
rswindell committed
	user_t		user;
	private_t*	p;
	JSObject*	statsobj;
	JSObject*	securityobj;
	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);
rswindell's avatar
rswindell committed
		return(JS_FALSE);
	/* user.stats */
	if((statsobj=JS_DefineObject(cx, obj, "stats"
		,&js_user_stats_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY))==NULL) 
	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) 
	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);

rswindell's avatar
rswindell committed
	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);
rswindell's avatar
rswindell committed

	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 */
rswindell's avatar
rswindell committed
		,NULL,NULL);

	return(userclass);
}

JSObject* DLLCALL js_CreateUserObject(JSContext* cx, JSObject* parent, scfg_t* cfg, char* name
									  , uint usernumber)
{
	JSObject*	userobj;
	JSObject*	statsobj;
	JSObject*	securityobj;
	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->user.number = usernumber;
	p->cached = FALSE;
	if(!js_DefineSyncProperties(cx, userobj, js_user_properties)) {
		free(p);
		return(NULL);
	}
	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);
	/* user.stats */
	statsobj = JS_DefineObject(cx, userobj, "stats"
		,&js_user_stats_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY);
		return(NULL);
	if(!js_DefineSyncProperties(cx, statsobj, js_user_stats_properties)) {
		free(p);
		return(NULL);
	}
	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);
	}
	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);
		return(NULL);
	if(!js_DefineSyncProperties(cx, securityobj, js_user_security_properties)) {
		free(p);
		return(NULL);
	}
	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);
#endif	/* JAVSCRIPT */