#include "rbxs_dom.h" #include "rbxs_domnode.h" #include "rbxs_domattribute.h" #include "rbxs_domattributeset.h" //*********************************************************************************** // GC //*********************************************************************************** void rbxs_domattributeset_free(rbxs_domattributeset *prbxs_domattributeset) { if (prbxs_domattributeset != NULL) { free(prbxs_domattributeset); } } void rbxs_domattributeset_mark(rbxs_domattributeset *prbxs_domattributeset) { if (prbxs_domattributeset == NULL) return; if (!NIL_P(prbxs_domattributeset->node)) rb_gc_mark(prbxs_domattributeset->node); } //*********************************************************************************** // Methods //*********************************************************************************** VALUE rbxs_domattributeset_include(VALUE self, VALUE key) { rbxs_domattributeset *prbxs_domattributeset; rbxs_domnode *prbxs_domnode; Check_Type(key, T_STRING); Data_Get_Struct(self, rbxs_domattributeset, prbxs_domattributeset); Data_Get_Struct(prbxs_domattributeset->node, rbxs_domnode, prbxs_domnode); if (xmlHasProp(prbxs_domnode->node,STR2CSTR(key))) return(Qtrue); else return(Qfalse); } VALUE rbxs_domattributeset_get(VALUE self, VALUE key) { rbxs_domattributeset *prbxs_domattributeset; rbxs_domnode *prbxs_domnode; xmlChar *ret; VALUE val; Check_Type(key, T_STRING); Data_Get_Struct(self, rbxs_domattributeset, prbxs_domattributeset); Data_Get_Struct(prbxs_domattributeset->node, rbxs_domnode, prbxs_domnode); ret = xmlGetProp(prbxs_domnode->node,STR2CSTR(key)); if (ret) { val = rb_str_new2(ret); xmlFree(ret); return(val); } else return(Qnil); } VALUE rbxs_domattributeset_set(VALUE self, VALUE key, VALUE value) { rbxs_domattributeset *prbxs_domattributeset; rbxs_domnode *prbxs_domnode; xmlAttrPtr attr; Check_Type(key, T_STRING); Data_Get_Struct(self, rbxs_domattributeset, prbxs_domattributeset); Data_Get_Struct(prbxs_domattributeset->node, rbxs_domnode, prbxs_domnode); attr = xmlSetProp(prbxs_domnode->node,STR2CSTR(key),STR2CSTR(rb_obj_as_string(value))); if (attr == NULL) { attr = xmlNewProp(prbxs_domnode->node,STR2CSTR(key),STR2CSTR(rb_obj_as_string(value))); if (attr == NULL) rb_raise(rb_eRuntimeError, "Couldn't set attribute"); } return(value); } VALUE rbxs_domattributeset_delete(VALUE self, VALUE key) { rbxs_domattributeset *prbxs_domattributeset; rbxs_domnode *prbxs_domnode; xmlAttrPtr attr; Check_Type(key, T_STRING); Data_Get_Struct(self, rbxs_domattributeset, prbxs_domattributeset); Data_Get_Struct(prbxs_domattributeset->node, rbxs_domnode, prbxs_domnode); attr = prbxs_domnode->node->properties; while (attr != NULL) { if (xmlStrEqual(attr->name,BAD_CAST(STR2CSTR(key)))) { xmlUnlinkNode((xmlNodePtr)attr); xmlFreeNode((xmlNodePtr)attr); return(Qtrue); } attr = attr->next; } rb_raise(rb_eRuntimeError, "Couldn't delete attribute"); return(Qnil); } //*********************************************************************************** // Constructors //*********************************************************************************** VALUE rbxs_domattributeset_new(VALUE class, VALUE node) { rbxs_domattributeset *prbxs_domattributeset; prbxs_domattributeset = (rbxs_domattributeset *)malloc(sizeof(rbxs_domattributeset)); if (prbxs_domattributeset == NULL ) rb_raise(rb_eNoMemError, "No memory left for XML::Simple::Dom::AttributeSet struct"); prbxs_domattributeset->node = node; return(Data_Wrap_Struct(class, rbxs_domattributeset_mark, rbxs_domattributeset_free, prbxs_domattributeset)); } //*********************************************************************************** // Initialize class Node //*********************************************************************************** VALUE cSimpleDomAttributeSet; void init_rbxs_domattributeset(void) { cSimpleDomAttributeSet = rb_define_class_under( cSimpleDom, "AttributeSet", rb_cObject ); rb_define_method(cSimpleDomAttributeSet, "has_key?", rbxs_domattributeset_include, 1); rb_define_method(cSimpleDomAttributeSet, "include?", rbxs_domattributeset_include, 1); rb_define_method(cSimpleDomAttributeSet, "[]", rbxs_domattributeset_get, 1); rb_define_method(cSimpleDomAttributeSet, "[]=", rbxs_domattributeset_set, 2); rb_define_method(cSimpleDomAttributeSet, "delete", rbxs_domattributeset_delete, 1); }