71 } |
71 } |
72 } |
72 } |
73 |
73 |
74 CxList* parse_text_taglist(const char *buf, size_t length) { |
74 CxList* parse_text_taglist(const char *buf, size_t length) { |
75 CxList *tags = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
75 CxList *tags = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
76 tags->simple_destructor = (cx_destructor_func)free_dav_tag; |
76 cxDefineDestructor(tags, free_dav_tag); |
77 |
77 |
78 int line_start = 0; |
78 int line_start = 0; |
79 for(int i=0;i<length;i++) { |
79 for(int i=0;i<length;i++) { |
80 if(buf[i] == '\n' || i == length-1) { |
80 if(buf[i] == '\n' || i == length-1) { |
81 cxstring line = cx_strtrim(cx_strn((char*)buf + line_start, i - line_start)); |
81 cxstring line = cx_strtrim(cx_strn((char*)buf + line_start, i - line_start)); |
112 CxMap* taglist2map(CxList *tags) { |
112 CxMap* taglist2map(CxList *tags) { |
113 if(!tags) { |
113 if(!tags) { |
114 return cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 8); |
114 return cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 8); |
115 } |
115 } |
116 |
116 |
117 CxMap *map = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, tags->size + 8); |
117 CxMap *map = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, cxListSize(tags) + 8); |
118 CxIterator iter = cxListIterator(tags); |
118 CxIterator iter = cxListIterator(tags); |
119 cx_foreach(DavTag*, t, iter) { |
119 cx_foreach(DavTag*, t, iter) { |
120 cxMapPut(map, cx_hash_key_str(t->name), t); |
120 cxMapPut(map, cx_hash_key_str(t->name), t); |
121 } |
121 } |
122 return map; |
122 return map; |
140 } |
140 } |
141 |
141 |
142 |
142 |
143 CxList* parse_csv_taglist(const char *buf, size_t length) { |
143 CxList* parse_csv_taglist(const char *buf, size_t length) { |
144 CxList *taglist = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
144 CxList *taglist = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
145 taglist->simple_destructor = (cx_destructor_func)free_dav_tag; |
145 cxDefineDestructor(taglist, free_dav_tag); |
146 |
146 |
147 cxstring str = cx_strn(buf, length); |
147 cxstring str = cx_strn(buf, length); |
148 CxStrtokCtx tags = cx_strtok(str, CX_STR(","), INT_MAX); |
148 CxStrtokCtx tags = cx_strtok(str, CX_STR(","), INT_MAX); |
149 cxstring tagstr; |
149 cxstring tagstr; |
150 while(cx_strtok_next(&tags, &tagstr)) { |
150 while(cx_strtok_next(&tags, &tagstr)) { |
183 if(c->type == DAV_XML_ELEMENT) { |
183 if(c->type == DAV_XML_ELEMENT) { |
184 char *value = dav_xml_getstring(c->children); |
184 char *value = dav_xml_getstring(c->children); |
185 if(value) { |
185 if(value) { |
186 if(!strcmp(c->namespace, DAV_PROPS_NS)) { |
186 if(!strcmp(c->namespace, DAV_PROPS_NS)) { |
187 if(!strcmp(c->name, "name")) { |
187 if(!strcmp(c->name, "name")) { |
188 char *value = dav_xml_getstring(c->children); |
188 name = value; |
189 if(value) { |
|
190 name = value; |
|
191 } |
|
192 } |
189 } |
193 if(!strcmp(c->name, "color")) { |
190 if(!strcmp(c->name, "color")) { |
194 char *value = dav_xml_getstring(c->children); |
191 color = value; |
195 if(value) { |
|
196 color = value; |
|
197 } |
|
198 } |
192 } |
199 } |
193 } |
200 } |
194 } |
201 } |
195 } |
202 c = c->next; |
196 c = c->next; |
211 return tag; |
205 return tag; |
212 } |
206 } |
213 |
207 |
214 CxList* parse_dav_xml_taglist(DavXmlNode *taglistnode) { |
208 CxList* parse_dav_xml_taglist(DavXmlNode *taglistnode) { |
215 CxList *tags = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
209 CxList *tags = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
216 tags->simple_destructor = (cx_destructor_func)free_dav_tag; |
210 cxDefineDestructor(tags, free_dav_tag); |
217 |
211 |
218 DavXmlNode *node = taglistnode; |
212 DavXmlNode *node = taglistnode; |
219 while(node) { |
213 while(node) { |
220 if(node->type == DAV_XML_ELEMENT) { |
214 if(node->type == DAV_XML_ELEMENT) { |
221 if(!strcmp(node->namespace, DAV_PROPS_NS) && !strcmp(node->name, "tag")) { |
215 if(!strcmp(node->namespace, DAV_PROPS_NS) && !strcmp(node->name, "tag")) { |
423 CxList* merge_tags(CxList *tags1, CxList *tags2) { |
417 CxList* merge_tags(CxList *tags1, CxList *tags2) { |
424 // this map is used to check the existence of tags |
418 // this map is used to check the existence of tags |
425 CxMap *tag_map = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 32); |
419 CxMap *tag_map = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 32); |
426 // merged taglist |
420 // merged taglist |
427 CxList *new_tags = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
421 CxList *new_tags = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
428 new_tags->simple_destructor = (cx_destructor_func)free_dav_tag; |
422 cxDefineDestructor(new_tags, free_dav_tag); |
429 |
423 |
430 // add all local tags |
424 // add all local tags |
431 if(tags1) { |
425 if(tags1) { |
432 CxIterator iter = cxListIterator(tags1); |
426 CxIterator iter = cxListIterator(tags1); |
433 cx_foreach(DavTag*, t, iter) { |
427 cx_foreach(DavTag*, t, iter) { |