dav/sync.c

changeset 749
bbadf84cfc2d
parent 747
efbd59642577
child 750
4d7a2238c5ac
equal deleted inserted replaced
748:49a284f61e8c 749:bbadf84cfc2d
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) {

mercurial