55 free(dav_dir); |
55 free(dav_dir); |
56 |
56 |
57 SyncDatabase *db = malloc(sizeof(SyncDatabase)); |
57 SyncDatabase *db = malloc(sizeof(SyncDatabase)); |
58 db->resources = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 2048); |
58 db->resources = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 2048); |
59 db->conflict = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16); |
59 db->conflict = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16); |
60 |
60 |
61 db->resources->destructor_data = (cx_destructor_func)local_resource_free; |
61 cxDefineDestructor(db->resources, local_resource_free); |
62 db->conflict->destructor_data = (cx_destructor_func)local_resource_free; |
62 cxDefineDestructor(db->conflict, local_resource_free); |
63 |
63 |
64 xmlTextReaderPtr reader = xmlReaderForFile(db_file, NULL, 0); |
64 xmlTextReaderPtr reader = xmlReaderForFile(db_file, NULL, 0); |
65 if(!reader) { |
65 if(!reader) { |
66 xmlDoc *doc = doc = xmlNewDoc(BAD_CAST "1.0"); |
66 xmlDoc *doc = doc = xmlNewDoc(BAD_CAST "1.0"); |
67 xmlNode *root = xmlNewNode(NULL, BAD_CAST "directory"); |
67 xmlNode *root = xmlNewNode(NULL, BAD_CAST "directory"); |
77 free(db_file); |
77 free(db_file); |
78 |
78 |
79 int error = 0; |
79 int error = 0; |
80 while(xmlTextReaderRead(reader)) { |
80 while(xmlTextReaderRead(reader)) { |
81 int type = xmlTextReaderNodeType(reader); |
81 int type = xmlTextReaderNodeType(reader); |
82 const xmlChar *name = xmlTextReaderConstName(reader); |
82 const xmlChar *xmlName = xmlTextReaderConstName(reader); |
83 |
83 |
84 if(type == XML_READER_TYPE_ELEMENT) { |
84 if(type == XML_READER_TYPE_ELEMENT) { |
85 if(xstreq(name, "resource")) { |
85 if(xstreq(xmlName, "resource")) { |
86 LocalResource *res = process_resource(reader); |
86 LocalResource *res = process_resource(reader); |
87 if(res) { |
87 if(res) { |
88 cxMapPut(db->resources, cx_hash_key_str(res->path), res); |
88 cxMapPut(db->resources, cx_hash_key_str(res->path), res); |
89 } else { |
89 } else { |
90 error = 1; |
90 error = 1; |
91 break; |
91 break; |
92 } |
92 } |
93 } else if(xstreq(name, "conflict")) { |
93 } else if(xstreq(xmlName, "conflict")) { |
94 LocalResource *res = process_conflict(reader); |
94 LocalResource *res = process_conflict(reader); |
95 if(res) { |
95 if(res) { |
96 cxMapPut(db->conflict, cx_hash_key_str(res->path), res); |
96 cxMapPut(db->conflict, cx_hash_key_str(res->path), res); |
97 } else { |
97 } else { |
98 error = 1; |
98 error = 1; |
113 |
113 |
114 void process_parts(xmlTextReaderPtr reader, LocalResource *res) { |
114 void process_parts(xmlTextReaderPtr reader, LocalResource *res) { |
115 // TODO: rewrite using low level array |
115 // TODO: rewrite using low level array |
116 |
116 |
117 CxList *parts = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
117 CxList *parts = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
118 parts->destructor_data = (cx_destructor_func)filepart_free; |
118 cxDefineDestructor(parts, filepart_free); |
119 |
119 |
120 FilePart *current_part = NULL; |
120 FilePart *current_part = NULL; |
121 |
121 |
122 size_t count = 0; |
122 size_t count = 0; |
123 int field = -1; |
123 int field = -1; |
409 return -1; |
409 return -1; |
410 } |
410 } |
411 xmlTextWriterStartElement(writer, BAD_CAST "directory"); |
411 xmlTextWriterStartElement(writer, BAD_CAST "directory"); |
412 |
412 |
413 // write all resource entries |
413 // write all resource entries |
414 CxIterator i = cxMapIteratorValues(db->resources); |
414 CxIterator iter = cxMapIteratorValues(db->resources); |
415 LocalResource *res; |
415 cx_foreach(LocalResource*, res, iter) { |
416 cx_foreach(LocalResource*, res, i) { |
|
417 // <resource> |
416 // <resource> |
418 xmlTextWriterStartElement(writer, BAD_CAST "resource"); |
417 xmlTextWriterStartElement(writer, BAD_CAST "resource"); |
419 |
418 |
420 r = xmlTextWriterWriteElement( |
419 r = xmlTextWriterWriteElement( |
421 writer, |
420 writer, |
686 xmlTextWriterEndElement(writer); |
685 xmlTextWriterEndElement(writer); |
687 } |
686 } |
688 */ |
687 */ |
689 |
688 |
690 // write all conflict entries |
689 // write all conflict entries |
691 i = cxMapIteratorValues(db->conflict); |
690 iter = cxMapIteratorValues(db->conflict); |
692 cx_foreach(LocalResource*, res, i) { |
691 cx_foreach(LocalResource*, res, iter) { |
693 // <conflict> |
692 // <conflict> |
694 xmlTextWriterStartElement(writer, BAD_CAST "conflict"); |
693 xmlTextWriterStartElement(writer, BAD_CAST "conflict"); |
695 |
694 |
696 xmlTextWriterWriteElement( |
695 xmlTextWriterWriteElement( |
697 writer, |
696 writer, |
823 } |
822 } |
824 free(part); |
823 free(part); |
825 } |
824 } |
826 |
825 |
827 CxMap* create_hash_index(SyncDatabase *db) { |
826 CxMap* create_hash_index(SyncDatabase *db) { |
828 CxMap *hmap = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, db->resources->size + 64); |
827 CxMap *hmap = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, cxMapSize(db->resources) + 64); |
829 |
828 |
830 CxIterator i = cxMapIteratorValues(db->resources); |
829 CxIterator i = cxMapIteratorValues(db->resources); |
831 LocalResource *res; |
|
832 cx_foreach(LocalResource*, res, i) { |
830 cx_foreach(LocalResource*, res, i) { |
833 if(res->hash) { |
831 if(res->hash) { |
834 cxMapPut(hmap, cx_hash_key_str(res->hash), res); |
832 cxMapPut(hmap, cx_hash_key_str(res->hash), res); |
835 } |
833 } |
836 } |
834 } |