109 |
109 |
110 static void nullfree(void *p) { |
110 static void nullfree(void *p) { |
111 if(p) { |
111 if(p) { |
112 free(p); |
112 free(p); |
113 } |
113 } |
|
114 } |
|
115 |
|
116 |
|
117 |
|
118 |
|
119 static bool nulliter_valid(void const *d) { |
|
120 return false; |
|
121 } |
|
122 |
|
123 static void * nulliter_current(void const *d) { |
|
124 return NULL; |
|
125 } |
|
126 |
|
127 void * nulliter_current_impl(void const *d) { |
|
128 return NULL; |
|
129 } |
|
130 |
|
131 void nulliter_next(void *d) { |
|
132 // noop |
|
133 } |
|
134 |
|
135 bool nulliter_flag_removal(void *d) { |
|
136 return false; |
|
137 } |
|
138 |
|
139 |
|
140 static CxIterator nullIterator(void) { |
|
141 CxIterator iter; |
|
142 memset(&iter, 0, sizeof(CxIterator)); |
|
143 iter.base.valid = nulliter_valid; |
|
144 iter.base.current = nulliter_current; |
|
145 iter.base.current_impl = nulliter_current_impl; |
|
146 iter.base.next = nulliter_next; |
|
147 iter.base.flag_removal = nulliter_flag_removal; |
|
148 return iter; |
|
149 } |
|
150 |
|
151 static CxIterator mapIteratorValues(CxMap *map) { |
|
152 return map ? cxMapIteratorValues(map) : nullIterator(); |
|
153 } |
|
154 |
|
155 static CxIterator listIterator(CxList *list) { |
|
156 return list ? cxListIterator(list) : nullIterator(); |
|
157 } |
|
158 |
|
159 typedef void*(*clonefunc)(void *elm, void *userdata); |
|
160 |
|
161 static CxMap* mapClone(const CxAllocator *a, CxMap *map, clonefunc clone, void *userdata) { |
|
162 CxMap *newmap = cxHashMapCreate(a, map->store_pointer ? CX_STORE_POINTERS : map->item_size, map->size + 4); |
|
163 |
|
164 CxIterator i = cxMapIterator(map); |
|
165 if(clone) { |
|
166 cx_foreach(CxMapEntry*, entry, i) { |
|
167 void *newdata = clone(entry->value, userdata); |
|
168 cxMapPut(newmap, *entry->key, newdata); |
|
169 } |
|
170 } else { |
|
171 cx_foreach(CxMapEntry*, entry, i) { |
|
172 cxMapPut(newmap, *entry->key, entry->value); |
|
173 } |
|
174 } |
|
175 |
|
176 return newmap; |
114 } |
177 } |
115 |
178 |
116 int dav_sync_main(int argc, char **argv); |
179 int dav_sync_main(int argc, char **argv); |
117 |
180 |
118 #ifdef _WIN32 |
181 #ifdef _WIN32 |
672 CxList *res_metadata = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
735 CxList *res_metadata = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
673 CxList *res_broken = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
736 CxList *res_broken = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
674 CxMap *lres_removed = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16); // type: LocalResource* |
737 CxMap *lres_removed = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16); // type: LocalResource* |
675 |
738 |
676 //UcxMap *svrres = ucx_map_new(db->resources->count); |
739 //UcxMap *svrres = ucx_map_new(db->resources->count); |
677 CxMap *dbres = NULL; // TODO: ucx_map_clone(db->resources, NULL, NULL); |
740 CxMap *dbres = mapClone(cxDefaultAllocator, db->resources, NULL, NULL); |
678 |
741 |
679 CxList *stack = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
742 CxList *stack = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
680 cxListInsert(stack, 0, ls->children); |
743 cxListInsert(stack, 0, ls->children); |
681 while(stack->size > 0) { |
744 while(stack->size > 0) { |
682 DavResource *res = cxListAt(stack, 0); |
745 DavResource *res = cxListAt(stack, 0); |
762 } |
825 } |
763 |
826 |
764 // find deleted resources |
827 // find deleted resources |
765 // svrres currently contains all resources from the server |
828 // svrres currently contains all resources from the server |
766 // and will replace the current db->resources map later |
829 // and will replace the current db->resources map later |
767 CxIterator i = cxMapIteratorValues(dbres); |
830 CxIterator i = mapIteratorValues(dbres); |
768 cx_foreach(LocalResource *, local, i) { |
831 cx_foreach(LocalResource *, local, i) { |
769 if (res_matches_dir_filter(dir, local->path)) { |
832 if (res_matches_dir_filter(dir, local->path)) { |
770 continue; |
833 continue; |
771 } |
834 } |
772 if(!local->keep) { |
835 if(!local->keep) { |