⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dom_smjs.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
		return JS_TRUE;	/*"baseURI"*/	case 14:		/*NOT SUPPORTED YET*/		*vp = JSVAL_VOID;		return JS_TRUE;	/*"textContent"*/	case 15:	{		char *res = dom_flatten_text(n);		*vp = STRING_TO_JSVAL( JS_NewStringCopyZ(c, res) );		free(res);	}		return JS_TRUE;	}	/*not supported*/	return JS_FALSE;}static JSBool dom_node_setProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	u32 tag;	Bool is_doc;	GF_Node *n;	GF_ParentNode *par;	n = dom_get_node(c, obj, &is_doc);	if (!n) return JS_FALSE;	if (!JSVAL_IS_INT(id)) return JS_TRUE;	tag = gf_node_get_tag(n);	par = (GF_ParentNode*)n;	switch (JSVAL_TO_INT(id)) {	/*"nodeValue"*/	case 1:		/*we only support element and sg in the Node interface, no set*/		return JS_FALSE;	/*"prefix"*/	case 12:		/*NOT SUPPORTED YET*/		return JS_TRUE;	/*"textContent"*/	case 15:		if (!JSVAL_IS_STRING(*vp)) return JS_FALSE;		/*reset all children*/		gf_node_unregister_children(n, par->children);		par->children = NULL;		gf_dom_add_text_node(n, strdup( JS_GetStringBytes(JSVAL_TO_STRING(*vp)) ) );		dom_node_changed(n, 1, NULL);		return JS_TRUE;	}		/*not supported*/	return JS_FALSE;}/*dom3 document*//*don't attempt to do anything with the scenegraph, it may be destroyedfortunately a sg cannot be created like that...*/static void dom_document_finalize(JSContext *c, JSObject *obj){	GF_SceneGraph *sg;	if (!JS_InstanceOf(c, obj, &dom_rt->domDocumentClass, NULL) ) 		return;	sg = (GF_SceneGraph*) JS_GetPrivate(c, obj);	/*the JS proto of the svgClass or a destroyed object*/	if (!sg) return;	sg->document = NULL;	gf_node_unregister(sg->RootNode, NULL);	if (sg->reference_count) {		sg->reference_count--;		if (!sg->reference_count) 			gf_sg_del(sg);	}}static JSBool dom_document_getProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	Bool is_doc;	u32 prop_id;	GF_Node *n = dom_get_node(c, obj, &is_doc);	if (!n || !is_doc) return JS_FALSE;	if (!JSVAL_IS_INT(id)) return JS_TRUE;	prop_id = JSVAL_TO_INT(id);	if (prop_id<=JS_DOM3_NODE_LAST_PROP) return dom_node_getProperty(c, obj, id, vp);	switch (prop_id) {	/*"doctype"*/	case JS_DOM3_NODE_LAST_PROP+1:		/*NOT SUPPORTED YET*/		*vp = JSVAL_VOID;		return JS_TRUE;	/*implementation - FIXME, this is wrong, we should have our own implementation		but at the current time we rely on the global object to provide it*/	case JS_DOM3_NODE_LAST_PROP+2:		*vp = OBJECT_TO_JSVAL( JS_GetGlobalObject(c) ); 		return JS_TRUE;	/*"documentElement"*/	case JS_DOM3_NODE_LAST_PROP+3:		*vp = dom_element_construct(c, n);		return JS_TRUE;	/*"inputEncoding"*/	case JS_DOM3_NODE_LAST_PROP+4:		/*NOT SUPPORTED YET*/		*vp = JSVAL_VOID;		return JS_TRUE;	/*"xmlEncoding"*/	case JS_DOM3_NODE_LAST_PROP+5:		/*NOT SUPPORTED YET*/		*vp = JSVAL_VOID;		return JS_TRUE;	/*"xmlStandalone"*/	case JS_DOM3_NODE_LAST_PROP+6:		/*NOT SUPPORTED YET*/		*vp = JSVAL_VOID;		return JS_TRUE;	/*"xmlVersion"*/	case JS_DOM3_NODE_LAST_PROP+7:		/*NOT SUPPORTED YET*/		*vp = JSVAL_VOID;		return JS_TRUE;	/*"strictErrorChecking"*/	case JS_DOM3_NODE_LAST_PROP+8:		/*NOT SUPPORTED YET*/		*vp = JSVAL_VOID;		return JS_TRUE;	/*"documentURI"*/	case JS_DOM3_NODE_LAST_PROP+9:		/*NOT SUPPORTED YET*/		*vp = JSVAL_VOID;		return JS_TRUE;	/*"domConfig"*/	case JS_DOM3_NODE_LAST_PROP+10:		/*NOT SUPPORTED YET*/		*vp = JSVAL_VOID;		return JS_TRUE;	/*global*/	case JS_DOM3_NODE_LAST_PROP+11:		*vp = OBJECT_TO_JSVAL( JS_GetGlobalObject(c) ); 		return JS_TRUE;	}	return JS_FALSE;}static JSBool dom_document_setProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	u32 prop_id;	Bool is_doc;	GF_Node *n = dom_get_node(c, obj, &is_doc);	if (!n || !is_doc) return JS_FALSE;	if (!JSVAL_IS_INT(id)) return JS_TRUE;	prop_id = JSVAL_TO_INT(id);	if (id<=JS_DOM3_NODE_LAST_PROP) return dom_node_setProperty(c, obj, id, vp);	switch (prop_id) {	/*"xmlStandalone"*/	case JS_DOM3_NODE_LAST_PROP+6:		break;	/*"xmlVersion"*/	case JS_DOM3_NODE_LAST_PROP+7:		break;	/*"strictErrorChecking"*/	case JS_DOM3_NODE_LAST_PROP+8:		break;	/*"documentURI"*/	case JS_DOM3_NODE_LAST_PROP+9:		break;	/*"domConfig"*/	case JS_DOM3_NODE_LAST_PROP+10:		break;	/*the rest is read-only*/	}	return JS_FALSE;}static JSBool xml_document_create_element(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	u32 tag;	GF_Node *n;	GF_SceneGraph *sg;	char *name;	if (!JS_InstanceOf(c, obj, &dom_rt->domDocumentClass, NULL) || !argc || !JSVAL_IS_STRING(argv[0]) ) return JS_FALSE;	sg = (GF_SceneGraph *) JS_GetPrivate(c, obj);	if (!sg) return JS_FALSE;	name = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));	if (!name) return JS_FALSE;	/*NS version*/	if (argc==2) {		if (!JSVAL_IS_STRING(argv[1])) return JS_FALSE;		name = JS_GetStringBytes(JSVAL_TO_STRING(argv[1]));	}	if (!name) return JS_FALSE;	/*browse all our supported DOM implementations*/	tag = gf_svg_get_element_tag(name);	if (!tag) tag = TAG_DOMFullNode;	n = gf_node_new(sg, tag);	*rval = dom_element_construct(c, n);	return JS_TRUE;}static JSBool xml_document_create_text(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	GF_Node *n;	GF_SceneGraph *sg;	if (!JS_InstanceOf(c, obj, &dom_rt->domDocumentClass, NULL) ) return JS_FALSE;	sg = (GF_SceneGraph *) JS_GetPrivate(c, obj);	if (!sg) return JS_FALSE;	n = gf_node_new(sg, TAG_DOMText);	if (argc) {		((GF_DOMText*)n)->textContent = strdup( JS_GetStringBytes(JS_ValueToString(c, argv[0])) );	}	*rval = dom_text_construct(c, n);	return JS_TRUE;}static void xml_doc_gather_nodes(GF_ParentNode *node, char *name, DOMNodeList *nl){	Bool bookmark = 1;	GF_ChildNodeItem *child;	const char *node_name;	if (!node) return;	if (name) {		node_name = gf_node_get_class_name((GF_Node*)node);		if (strcmp(node_name, name)) bookmark = 0;	}	if (bookmark) {		gf_node_register((GF_Node*)node, NULL);		if (node->sgprivate->scenegraph->reference_count)			node->sgprivate->scenegraph->reference_count++;		gf_node_list_add_child(&nl->child, (GF_Node*)node);	}	if (node->sgprivate->tag<GF_NODE_FIRST_PARENT_NODE_TAG) return;	child = node->children;	while (child) {		xml_doc_gather_nodes((GF_ParentNode*)child->node, name, nl);		child = child->next;	}}static JSBool xml_document_elements_by_tag(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	DOMNodeList *nl;	GF_SceneGraph *sg;	JSObject *new_obj;	char *name;	if (!JS_InstanceOf(c, obj, &dom_rt->domDocumentClass, NULL) ) return JS_FALSE;	sg = (GF_SceneGraph *) JS_GetPrivate(c, obj);	if (!sg) return JS_FALSE;	if (!argc || !JSVAL_IS_STRING(argv[0])) return JS_FALSE;	name = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));	/*NS version*/	if (argc==2) {		if (!JSVAL_IS_STRING(argv[1])) return JS_FALSE;		name = JS_GetStringBytes(JSVAL_TO_STRING(argv[1]));	}	GF_SAFEALLOC(nl, DOMNodeList);	if (name && !strcmp(name, "*")) name = NULL;	xml_doc_gather_nodes((GF_ParentNode*)sg->RootNode, name, nl);	new_obj = JS_NewObject(c, &dom_rt->domNodeListClass, 0, 0);	JS_SetPrivate(c, new_obj, nl);	*rval = OBJECT_TO_JSVAL(new_obj);	return JS_TRUE;}static JSBool xml_document_element_by_id(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	GF_Node *n;	GF_SceneGraph *sg;	char *id;	if (!JS_InstanceOf(c, obj, &dom_rt->domDocumentClass, NULL) ) return JS_FALSE;	sg = (GF_SceneGraph *) JS_GetPrivate(c, obj);	if (!sg) return JS_FALSE;	if (!argc || !JSVAL_IS_STRING(argv[0])) return JS_FALSE;	id = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));	n = gf_sg_find_node_by_name(sg, id);	*rval = dom_element_construct(c, n);	return JS_TRUE;}/*dom3 element*/static JSBool dom_element_getProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	u32 prop_id;	Bool is_doc;	GF_Node *n;	if (!JS_InstanceOf(c, obj, &dom_rt->domElementClass, NULL) ) return JS_FALSE;	if (!JSVAL_IS_INT(id)) return JS_TRUE;	prop_id = JSVAL_TO_INT(id);	if (prop_id<=JS_DOM3_NODE_LAST_PROP) return dom_node_getProperty(c, obj, id, vp);	n = dom_get_node(c, obj, &is_doc);	switch (prop_id) {	/*"tagName"*/	case JS_DOM3_NODE_LAST_PROP+1:		*vp = STRING_TO_JSVAL( JS_NewStringCopyZ(c, gf_node_get_class_name(n) ) );		return JS_TRUE;	/*"schemaTypeInfo"*/	case JS_DOM3_NODE_LAST_PROP+2:		/*NOT SUPPORTED YET*/		*vp = JSVAL_VOID;		return JS_TRUE;	case JS_DOM3_NODE_LAST_PROP+3:	case JS_DOM3_NODE_LAST_PROP+4:	case JS_DOM3_NODE_LAST_PROP+5:	case JS_DOM3_NODE_LAST_PROP+6:	case JS_DOM3_NODE_LAST_PROP+7:	case JS_DOM3_NODE_LAST_PROP+8:	case JS_DOM3_NODE_LAST_PROP+9:	case JS_DOM3_NODE_LAST_PROP+10:		return svg_udom_get_property(c, n, prop_id-(JS_DOM3_NODE_LAST_PROP+3), vp);	}	return JS_FALSE;}static JSBool dom_element_setProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	u32 prop_id;	if (!JS_InstanceOf(c, obj, &dom_rt->domElementClass, NULL) ) return JS_FALSE;	if (!JSVAL_IS_INT(id)) return JS_TRUE;	prop_id = JSVAL_TO_INT(id);	if (prop_id<=JS_DOM3_NODE_LAST_PROP) return dom_node_setProperty(c, obj, id, vp);	switch (prop_id) {	case JS_DOM3_NODE_LAST_PROP+3:	case JS_DOM3_NODE_LAST_PROP+4:	case JS_DOM3_NODE_LAST_PROP+5:	case JS_DOM3_NODE_LAST_PROP+6:	case JS_DOM3_NODE_LAST_PROP+7:	case JS_DOM3_NODE_LAST_PROP+8:	case JS_DOM3_NODE_LAST_PROP+9:		return svg_udom_set_property(c, dom_get_node(c, obj, NULL), prop_id-(JS_DOM3_NODE_LAST_PROP+3), vp);	default:		/*rest is read only*/		return JS_FALSE;	}}static JSBool xml_element_get_attribute(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	GF_Node *n;	char *name;	if (!JS_InstanceOf(c, obj, &dom_rt->domElementClass, NULL) ) return JS_FALSE;	if (!argc || !JSVAL_IS_STRING(argv[0])) return JS_FALSE;	n = dom_get_node(c, obj, NULL);	name = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));	/*NS version*/	if (argc==2) {		if (!JSVAL_IS_STRING(argv[1])) return JS_FALSE;		name = JS_GetStringBytes(JSVAL_TO_STRING(argv[1]));	}	if (!name) return JS_FALSE;	if (n->sgprivate->tag==TAG_DOMFullNode) {		GF_DOMFullNode *node = (GF_DOMFullNode*)n;		GF_DOMFullAttribute *att = (GF_DOMFullAttribute*)node->attributes;		while (att) {			if ((att->tag==TAG_DOM_ATTRIBUTE_FULL) && !strcmp(att->name, name)) {				*rval = STRING_TO_JSVAL( JS_NewStringCopyZ(c, (char*)att->data ) );				return JS_TRUE;			}			att = (GF_DOMFullAttribute *) att->next;		}	}	else if (n->sgprivate->tag<=GF_NODE_RANGE_LAST_SVG) {		GF_FieldInfo info;		if (gf_svg_get_attribute_by_name(n, name, 0, 0, &info)==GF_OK) {			char szAtt[4096];			gf_svg_dump_attribute(n, &info, szAtt);			*rval = STRING_TO_JSVAL( JS_NewStringCopyZ(c, szAtt) );			return JS_TRUE;		}	}	*rval = STRING_TO_JSVAL( JS_NewStringCopyZ(c, "") );	return JS_TRUE;}static JSBool xml_element_has_attribute(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	GF_Node *n;	char *name;	if (!JS_InstanceOf(c, obj, &dom_rt->domElementClass, NULL) ) return JS_FALSE;	if (!argc || !JSVAL_IS_STRING(argv[0])) return JS_FALSE;	n = dom_get_node(c, obj, NULL);	name = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));	/*NS version*/	if (argc==2) {		if (!JSVAL_IS_STRING(argv[1])) return JS_FALSE;		name = JS_GetStringBytes(JSVAL_TO_STRING(argv[1]));	}	if (!name) return JS_FALSE;	if (n->sgprivate->tag==TAG_DOMFullNode) {		GF_DOMFullNode *node = (GF_DOMFullNode*)n;		GF_DOMFullAttribute *att = (GF_DOMFullAttribute*)node->attributes;		while (att) {			if ((att->tag==TAG_DOM_ATTRIBUTE_FULL) && !strcmp(att->name, name)) {				*rval = BOOLEAN_TO_JSVAL(JS_TRUE);				return JS_TRUE;			}			att = (GF_DOMFullAttribute *) att->next;		}	}	else if (n->sgprivate->tag<=GF_NODE_RANGE_LAST_SVG) {		GF_FieldInfo info;		if (gf_svg_get_attribute_by_name(n, name, 0, 0, &info)==GF_OK) {			*rval = BOOLEAN_TO_JSVAL(JS_TRUE);			return JS_TRUE;		}	}	*rval = BOOLEAN_TO_JSVAL(JS_FALSE);	return JS_TRUE;}static JSBool xml_element_remove_attribute(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	u32 tag;	GF_DOMFullNode *node;	GF_DOMFullAttribute *prev, *att;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -