Skip to content
Snippets Groups Projects
js_system.c 59.9 KiB
Newer Older
static JSBool js_node_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp)
	uint		node_num;
	jsint		val=0;
    jsint       tiny;
	node_t		node;
	scfg_t*		cfg;
	JSObject*	sysobj;
	JSObject*	node_list;
deuce's avatar
deuce committed
	jsrefcount	rc;

	if((node_list=JS_GetParent(cx, obj))==NULL)
		return(JS_FALSE);

	if((sysobj=JS_GetParent(cx, node_list))==NULL)
		return(JS_FALSE);

	if((cfg=(scfg_t*)JS_GetPrivate(cx,sysobj))==NULL)
		return(JS_FALSE);

	node_num=(uint)JS_GetPrivate(cx,obj)>>1;

	memset(&node,0,sizeof(node));
deuce's avatar
deuce committed
	if(getnodedat(cfg, node_num, &node, &file)) {
		return(JS_TRUE);
		JS_ValueToInt32(cx, *vp, &val);
	JS_IdToValue(cx, id, &idval);
	tiny = JSVAL_TO_INT(idval);
	
    switch(tiny) {
		case NODE_PROP_STATUS:
			break;
		case NODE_PROP_ERRORS:	
			break;
		case NODE_PROP_ACTION:	
			break;
		case NODE_PROP_USERON:	
			break;
		case NODE_PROP_CONNECTION:
			break;
		case NODE_PROP_MISC:		
			break;
		case NODE_PROP_AUX:		
			break;
		case NODE_PROP_EXTAUX:	
			node.extaux=val;
			break;
	}
static jsSyncPropertySpec js_node_properties[] = {
/*		 name,						tinyid,					flags,				ver	*/

/* raw node_t fields */
	{	"status",					NODE_PROP_STATUS,		JSPROP_ENUMERATE,	310 },
	{	"errors",					NODE_PROP_ERRORS,		JSPROP_ENUMERATE,	310 },
	{	"action",					NODE_PROP_ACTION,		JSPROP_ENUMERATE,	310 },
	{	"useron",					NODE_PROP_USERON,		JSPROP_ENUMERATE,	310 },
	{	"connection",				NODE_PROP_CONNECTION,	JSPROP_ENUMERATE,	310 },
	{	"misc",						NODE_PROP_MISC,			JSPROP_ENUMERATE,	310 },
	{	"aux",						NODE_PROP_AUX,			JSPROP_ENUMERATE,	310 },
	{	"extaux",					NODE_PROP_EXTAUX,		JSPROP_ENUMERATE,	310 },
	{	"dir",						NODE_PROP_DIR,			JSPROP_ENUMERATE|JSPROP_READONLY,	315 },
static JSBool js_node_resolve(JSContext *cx, JSObject *obj, jsid id)
deuce's avatar
deuce committed
{
	char*			name=NULL;
deuce's avatar
deuce committed
	JSBool			ret;
deuce's avatar
deuce committed
	if(id != JSID_VOID && id != JSID_EMPTY) {
		jsval idval;
		
		JS_IdToValue(cx, id, &idval);
deuce's avatar
deuce committed
		if(JSVAL_IS_STRING(idval)) {
			JSSTRING_TO_MSTRING(cx, JSVAL_TO_STRING(idval), name, NULL);
			HANDLE_PENDING(cx);
		}
deuce's avatar
deuce committed
	}
deuce's avatar
deuce committed
	ret=js_SyncResolve(cx, obj, name, js_node_properties, NULL, NULL, 0);
	if(name)
		free(name);
	return(ret);
deuce's avatar
deuce committed
}

static JSBool js_node_enumerate(JSContext *cx, JSObject *obj)
{
deuce's avatar
deuce committed
	return(js_node_resolve(cx, obj, JSID_VOID));
static JSClass js_node_class = {
     "Node"					/* name			*/
    ,JSCLASS_HAS_PRIVATE	/* flags		*/
	,JS_PropertyStub		/* addProperty	*/
	,JS_PropertyStub		/* delProperty	*/
	,js_node_get			/* getProperty	*/
	,js_node_set			/* setProperty	*/
deuce's avatar
deuce committed
	,js_node_enumerate		/* enumerate	*/
	,js_node_resolve		/* resolve		*/
	,JS_ConvertStub			/* convert		*/
	,JS_FinalizeStub		/* finalize		*/
};

deuce's avatar
deuce committed
#define LAZY_INTEGER(PropName, PropValue) \
	if(name==NULL || strcmp(name, (PropName))==0) { \
		val=UINT_TO_JSVAL((PropValue)); \
deuce's avatar
deuce committed
		JS_DefineProperty(cx, obj, (PropName), val, NULL,NULL,JSPROP_ENUMERATE); \
deuce's avatar
deuce committed
		if(name) { \
			free(name); \
			return(JS_TRUE); \
		} \
deuce's avatar
deuce committed
#define LAZY_STRING(PropName, PropValue) \
	if(name==NULL || strcmp(name, (PropName))==0) { \
		if((js_str=JS_NewStringCopyZ(cx, (PropValue)))!=NULL) { \
			JS_DefineProperty(cx, obj, PropName, STRING_TO_JSVAL(js_str), NULL, NULL, JSPROP_ENUMERATE); \
deuce's avatar
deuce committed
			if(name) { \
				free(name); \
				return(JS_TRUE); \
			} \
		} \
		else if(name) { \
			free(name); \
			return(JS_TRUE); \
deuce's avatar
deuce committed
#define LAZY_STRFUNC(PropName, Function, PropValue) \
	if(name==NULL || strcmp(name, (PropName))==0) { \
		Function; \
		if((js_str=JS_NewStringCopyZ(cx, (PropValue)))!=NULL) { \
			JS_DefineProperty(cx, obj, PropName, STRING_TO_JSVAL(js_str), NULL, NULL, JSPROP_ENUMERATE); \
deuce's avatar
deuce committed
			if(name) { \
				free(name); \
				return(JS_TRUE); \
			} \
		} \
		else if(name) { \
			free(name); \
			return(JS_TRUE); \
deuce's avatar
deuce committed
#define LAZY_STRFUNC_TRUNCSP(PropName, Function, PropValue) \
	if(name==NULL || strcmp(name, (PropName))==0) { \
		Function; \
		if((js_str=JS_NewStringCopyZ(cx, truncsp(PropValue)))!=NULL) { \
			JS_DefineProperty(cx, obj, PropName, STRING_TO_JSVAL(js_str), NULL, NULL, JSPROP_ENUMERATE); \
deuce's avatar
deuce committed
			if(name) { \
				free(name); \
				return(JS_TRUE); \
			} \
		} \
		else if(name) { \
			free(name); \
			return(JS_TRUE); \
static JSBool js_system_resolve(JSContext *cx, JSObject *obj, jsid id)
deuce's avatar
deuce committed
{
	char*		name=NULL;
	jsval		val;
	char		str[256];
	JSString*	js_str;
	JSObject*	newobj;
	JSObject*	nodeobj;
	scfg_t* 	cfg;
	uint		i;
deuce's avatar
deuce committed
	JSBool		ret;
deuce's avatar
deuce committed
	if(id != JSID_VOID && id != JSID_EMPTY) {
		jsval idval;
		
		JS_IdToValue(cx, id, &idval);
deuce's avatar
deuce committed
		if(JSVAL_IS_STRING(idval)) {
			JSSTRING_TO_MSTRING(cx, JSVAL_TO_STRING(idval), name, NULL);
			HANDLE_PENDING(cx);
		}
deuce's avatar
deuce committed
	}
	/****************************/
	/* static string properties */
deuce's avatar
deuce committed
	LAZY_STRING("version", VERSION);
	LAZY_STRFUNC("revision", sprintf(str,"%c",REVISION), str);
	LAZY_STRFUNC_TRUNCSP("beta_version", SAFECOPY(str, beta_version), str);
deuce's avatar
deuce committed
	if(name==NULL || strcmp(name, "full_version")==0) {
		sprintf(str,"%s%c%s",VERSION,REVISION,beta_version);
		truncsp(str);
#if defined(_DEBUG)
deuce's avatar
deuce committed
		strcat(str," Debug");
deuce's avatar
deuce committed
		if(name) free(name);
deuce's avatar
deuce committed
		if((js_str=JS_NewStringCopyZ(cx, str))!=NULL) {
			val = STRING_TO_JSVAL(js_str);
			JS_SetProperty(cx, obj, "full_version", &val);
			if(name) return(JS_TRUE);
		}
		else if(name) return(JS_TRUE);
	}
deuce's avatar
deuce committed
	LAZY_STRING("version_notice", VERSION_NOTICE);
deuce's avatar
deuce committed
	LAZY_INTEGER("version_num", VERSION_NUM);
	LAZY_INTEGER("version_hex", VERSION_HEX);
deuce's avatar
deuce committed
	LAZY_STRING("platform", PLATFORM_DESC);
	LAZY_STRING("architecture", ARCHITECTURE_DESC);
deuce's avatar
deuce committed
	LAZY_STRFUNC("msgbase_lib", sprintf(str,"SMBLIB %s",smb_lib_ver()), str);
	LAZY_STRFUNC("compiled_with", DESCRIBE_COMPILER(str), str);
	LAZY_STRFUNC("compiled_when", sprintf(str,"%s %.5s",__DATE__,__TIME__), str);
	LAZY_STRING("copyright", COPYRIGHT_NOTICE);
	LAZY_STRING("js_version", (char *)JS_GetImplementationVersion());
	LAZY_STRING("os_version", os_version(str));
deuce's avatar
deuce committed
	/* fido_addr_list property */
	if(name==NULL || strcmp(name, "fido_addr_list")==0) {
deuce's avatar
deuce committed
		if(name) free(name);

deuce's avatar
deuce committed
		if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
			return(JS_FALSE);
deuce's avatar
deuce committed
		if((newobj=JS_NewArrayObject(cx, 0, NULL))==NULL)
			return(JS_FALSE);
		if(!JS_SetParent(cx, newobj, obj))
			return(JS_FALSE);

deuce's avatar
deuce committed
		if(!JS_DefineProperty(cx, obj, "fido_addr_list", OBJECT_TO_JSVAL(newobj)
			, NULL, NULL, JSPROP_ENUMERATE))
			return(JS_FALSE);
deuce's avatar
deuce committed
		for(i=0;i<cfg->total_faddrs;i++) {
			val=STRING_TO_JSVAL(JS_NewStringCopyZ(cx,smb_faddrtoa(&cfg->faddr[i],str)));
			JS_SetElement(cx, newobj, i, &val);
		}
		if(name) return(JS_TRUE);
	}
deuce's avatar
deuce committed
	if(name==NULL || strcmp(name, "stats")==0) {
deuce's avatar
deuce committed
		if(name) free(name);

deuce's avatar
deuce committed
		if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
			return(JS_FALSE);
deuce's avatar
deuce committed
		newobj = JS_DefineObject(cx, obj, "stats", &js_sysstats_class, NULL
			,JSPROP_ENUMERATE|JSPROP_READONLY);
deuce's avatar
deuce committed
		if(newobj==NULL)
			return(JS_FALSE);
deuce's avatar
deuce committed
		JS_SetPrivate(cx, newobj, cfg);	/* Store a pointer to scfg_t */
#ifdef BUILD_JSDOCS
		js_DescribeSyncObject(cx,newobj,"System statistics",310);
		js_CreateArrayOfStrings(cx, newobj, "_property_desc_list", sysstat_prop_desc, JSPROP_READONLY);
#endif
deuce's avatar
deuce committed
		if(name) return JS_TRUE;
deuce's avatar
deuce committed
	/* node_list property */
	if(name==NULL || strcmp(name, "node_list")==0) {
deuce's avatar
deuce committed
		if(name) free(name);

deuce's avatar
deuce committed
		if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
			return(JS_FALSE);
deuce's avatar
deuce committed
		if((newobj=JS_NewArrayObject(cx, 0, NULL))==NULL) 
			return(JS_FALSE);
		if(!JS_SetParent(cx, newobj, obj))
			return(JS_FALSE);

deuce's avatar
deuce committed
		if(!JS_DefineProperty(cx, obj, "node_list", OBJECT_TO_JSVAL(newobj)
			, NULL, NULL, JSPROP_ENUMERATE))
			return(JS_FALSE);
deuce's avatar
deuce committed
		for(i=0;i<cfg->sys_nodes && i<cfg->sys_lastnode;i++) {
deuce's avatar
deuce committed
			nodeobj = JS_NewObject(cx, &js_node_class, NULL, newobj);

			if(nodeobj==NULL)
				return(JS_FALSE);

			/* Store node number */
			/* We have to shift it to make it look like a pointer to JS. :-( */
			if(!JS_SetPrivate(cx, nodeobj, (char*)((i+1)<<1)))
				return(JS_FALSE);
deuce's avatar
deuce committed
	#ifdef BUILD_JSDOCS
			if(i==0) {
				js_DescribeSyncObject(cx,nodeobj,"BBS node listing",310);
				js_CreateArrayOfStrings(cx, nodeobj, "_property_desc_list", node_prop_desc, JSPROP_READONLY);
			}
	#endif

			val=OBJECT_TO_JSVAL(nodeobj);
			if(!JS_SetElement(cx, newobj, i, &val))
				return(JS_FALSE);
		}
		if(name) return(JS_TRUE);
deuce's avatar
deuce committed
	ret = js_SyncResolve(cx, obj, name, js_system_properties, js_system_functions, NULL, 0);
	if(name) free(name);
	return ret;
deuce's avatar
deuce committed
static JSBool js_system_enumerate(JSContext *cx, JSObject *obj)
{
deuce's avatar
deuce committed
	return(js_node_resolve(cx, obj, JSID_VOID));
deuce's avatar
deuce committed
static JSClass js_system_class = {
     "System"				/* name			*/
    ,JSCLASS_HAS_PRIVATE	/* flags		*/
	,JS_PropertyStub		/* addProperty	*/
	,JS_PropertyStub		/* delProperty	*/
	,js_system_get			/* getProperty	*/
	,js_system_set			/* setProperty	*/
	,js_system_enumerate	/* enumerate	*/
	,js_system_resolve		/* resolve		*/
	,JS_ConvertStub			/* convert		*/
	,JS_FinalizeStub		/* finalize		*/
};
deuce's avatar
deuce committed
JSObject* DLLCALL js_CreateSystemObject(JSContext* cx, JSObject* parent
										,scfg_t* cfg, time_t uptime, char* host_name, char* socklib_desc)
{
	jsval		val;
	JSObject*	sysobj;
	JSString*	js_str;
	char		str[256];
deuce's avatar
deuce committed
	sysobj = JS_DefineObject(cx, parent, "system", &js_system_class, NULL
		,JSPROP_ENUMERATE|JSPROP_READONLY);
deuce's avatar
deuce committed
	if(sysobj==NULL)
deuce's avatar
deuce committed
	if(!JS_SetPrivate(cx, sysobj, cfg))	/* Store a pointer to scfg_t */
deuce's avatar
deuce committed
	/****************************/
	/* static string properties */
	if((js_str=JS_NewStringCopyZ(cx, host_name))==NULL)
		return(NULL);
	val = STRING_TO_JSVAL(js_str);
	if(!JS_SetProperty(cx, sysobj, "host_name", &val))
		return(NULL);
deuce's avatar
deuce committed
	if((js_str=JS_NewStringCopyZ(cx, socklib_version(str, socklib_desc)))==NULL)
		return(NULL);
	val = STRING_TO_JSVAL(js_str);
	if(!JS_SetProperty(cx, sysobj, "socket_lib", &val))
		return(NULL);
deuce's avatar
deuce committed
	/***********************/
	val=DOUBLE_TO_JSVAL((double)uptime);
deuce's avatar
deuce committed
	if(!JS_SetProperty(cx, sysobj, "uptime", &val))
		return(NULL);
deuce's avatar
deuce committed
	js_DescribeSyncObject(cx,sysobj,"Global system-related properties and methods",310);
	js_CreateArrayOfStrings(cx, sysobj, "_property_desc_list", sys_prop_desc, JSPROP_READONLY);
#endif	/* JAVSCRIPT */