dav/tags.c

Sun, 17 Dec 2023 14:25:34 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 17 Dec 2023 14:25:34 +0100
changeset 797
edbb20b1438d
parent 785
645f7e802873
child 816
839fefbdedc7
permissions
-rw-r--r--

[Makefile] fix missing rules preventing dry-runs

We have to support dry-runs, because many IDEs are using
dry-runs to collect build information.

Some rules have dependencies that expect certain files or
directories to be just present. We added respective build
rules which invoke the test program. This way, the behavior
when running make normally is exactly the same, but dry-runs
are also not failing now.

361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2018 Olaf Wintermann. All rights reserved.
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include <stdio.h>
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 #include <stdlib.h>
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
31 #include <string.h>
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
32 #include <ctype.h>
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
34 #include <cx/string.h>
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
35 #include <cx/utils.h>
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
36 #include <cx/printf.h>
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
37 #include <cx/hash_map.h>
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
39 #include <libidav/crypto.h>
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
40
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 #include "libxattr.h"
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 #include "tags.h"
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
45 #ifdef __APPLE__
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
46 #include <CoreFoundation/CoreFoundation.h>
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
47 #endif
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
48
390
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
49 void free_dav_tag(DavTag* tag) {
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
50 free(tag->name);
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 400
diff changeset
51 if(tag->color) {
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 400
diff changeset
52 free(tag->color);
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 400
diff changeset
53 }
390
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
54 free(tag);
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
55 }
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
56
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
57 void free_taglist(CxList *list) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
58 if(!list) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
59 return;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
60 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
61 cxListDestroy(list);
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
62 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
63
390
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
64 int compare_tagname(DavTag* left, DavTag* right, void* ignorecase) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
65 cxstring leftname = cx_str(left->name);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
66 cxstring rightname = cx_str(right->name);
390
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
67 if (ignorecase && *((int*) ignorecase)) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
68 return cx_strcasecmp(leftname, rightname);
390
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
69 } else {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
70 return cx_strcmp(leftname, rightname);
390
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
71 }
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
72 }
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
73
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
74 CxList* parse_text_taglist(const char *buf, size_t length) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
75 CxList *tags = cxLinkedListCreateSimple(CX_STORE_POINTERS);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
76 tags->simple_destructor = (cx_destructor_func)free_dav_tag;
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 int line_start = 0;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 for(int i=0;i<length;i++) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 if(buf[i] == '\n' || i == length-1) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
81 cxstring line = cx_strtrim(cx_strn((char*)buf + line_start, i - line_start));
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 if(line.length > 0) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 DavTag *tag = calloc(1, sizeof(DavTag));
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
84 cxstring color = cx_strchr(line, '#');
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
85 if(color.length>0) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
86 cxstring name = line;
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
87 name.length = (int)(color.ptr-line.ptr);
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
88 if(name.length != 0) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
89 tag->name = cx_strdup(name).ptr;
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
90 color.ptr++;
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
91 color.length--;
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
92 if(color.length > 0) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
93 tag->color = cx_strdup(color).ptr;
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
94 }
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
95 } else {
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
96 free(tag);
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
97 }
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
98 } else {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
99 tag->name = cx_strdup(line).ptr;
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
100 tag->color = NULL;
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
101 }
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
102
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
103 cxListAdd(tags, tag);
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105 line_start = i+1;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109 return tags;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
112 CxMap* taglist2map(CxList *tags) {
767
f4acc783f25e fix tag filter crash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
113 if(!tags) {
f4acc783f25e fix tag filter crash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
114 return cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 8);
f4acc783f25e fix tag filter crash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
115 }
f4acc783f25e fix tag filter crash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
116
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
117 CxMap *map = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, tags->size + 8);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
118 CxIterator iter = cxListIterator(tags);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
119 cx_foreach(DavTag*, t, iter) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
120 cxMapPut(map, cx_hash_key_str(t->name), t);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
121 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
122 return map;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
123 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
124
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
125 CxBuffer* create_text_taglist(CxList *tags) {
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
126 if(!tags) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127 return NULL;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
130 CxBuffer *buf = cxBufferCreate(NULL, 128, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
131 CxIterator i = cxListIterator(tags);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
132 cx_foreach(DavTag *, tag, i) {
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
133 if(tag->color) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
134 cx_bprintf(buf, "%s#%s\n", tag->name, tag->color);
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
135 } else {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
136 cx_bprintf(buf, "%s\n", tag->name);
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
137 }
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
138 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
139 return buf;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
140 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
141
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
142
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
143 CxList* parse_csv_taglist(const char *buf, size_t length) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
144 CxList *taglist = cxLinkedListCreateSimple(CX_STORE_POINTERS);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
145 taglist->simple_destructor = (cx_destructor_func)free_dav_tag;
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
146
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
147 cxstring str = cx_strn(buf, length);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
148 CxStrtokCtx tags = cx_strtok(str, CX_STR(","), INT_MAX);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
149 cxstring tagstr;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
150 while(cx_strtok_next(&tags, &tagstr)) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
151 cxstring trimmed_tag = cx_strtrim(tagstr);
393
438c8fe7d62f parse_csv_taglist() now skips empty tags
Mike Becker <universe@uap-core.de>
parents: 390
diff changeset
152 if (trimmed_tag.length > 0) {
438c8fe7d62f parse_csv_taglist() now skips empty tags
Mike Becker <universe@uap-core.de>
parents: 390
diff changeset
153 DavTag *tag = malloc(sizeof(DavTag));
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
154 tag->name = cx_strdup(trimmed_tag).ptr;
393
438c8fe7d62f parse_csv_taglist() now skips empty tags
Mike Becker <universe@uap-core.de>
parents: 390
diff changeset
155 tag->color = NULL;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
156 cxListAdd(taglist, tag);
393
438c8fe7d62f parse_csv_taglist() now skips empty tags
Mike Becker <universe@uap-core.de>
parents: 390
diff changeset
157 }
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
158 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
159 return taglist;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
160 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
161
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
162 CxBuffer* create_csv_taglist(CxList *tags) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
163 CxBuffer *buf = cxBufferCreate(NULL, 128, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
164 int insertsep = 0;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
165 CxIterator i = cxListIterator(tags);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
166 cx_foreach(DavTag*, tag, i) {
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
167 if(insertsep) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
168 cxBufferPut(buf, ',');
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
169 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
170 cxBufferPutString(buf, tag->name);
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
171 insertsep = 1;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
172 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
173 return buf;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
174 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
175
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
176
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
177 static DavTag* parse_xml_dav_tag(DavXmlNode *node) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
178 char *name = NULL;
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
179 char *color = NULL;
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
180
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
181 DavXmlNode *c = node->children;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
182 while(c) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
183 if(c->type == DAV_XML_ELEMENT) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
184 char *value = dav_xml_getstring(c->children);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
185 if(value) {
667
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
186 if(!strcmp(c->namespace, DAV_PROPS_NS)) {
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
187 if(!strcmp(c->name, "name")) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
188 char *value = dav_xml_getstring(c->children);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
189 if(value) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
190 name = value;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
191 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
192 }
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
193 if(!strcmp(c->name, "color")) {
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
194 char *value = dav_xml_getstring(c->children);
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
195 if(value) {
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
196 color = value;
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
197 }
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
198 }
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
199 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
200 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
201 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
202 c = c->next;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
203 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
204
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
205 DavTag *tag = NULL;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
206 if(name) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
207 tag = malloc(sizeof(DavTag));
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
208 tag->name = strdup(name);
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
209 tag->color = color ? strdup(color) : NULL;
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
210 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
211 return tag;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
212 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
213
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
214 CxList* parse_dav_xml_taglist(DavXmlNode *taglistnode) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
215 CxList *tags = cxLinkedListCreateSimple(CX_STORE_POINTERS);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
216 tags->simple_destructor = (cx_destructor_func)free_dav_tag;
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
217
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
218 DavXmlNode *node = taglistnode;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
219 while(node) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
220 if(node->type == DAV_XML_ELEMENT) {
667
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
221 if(!strcmp(node->namespace, DAV_PROPS_NS) && !strcmp(node->name, "tag")) {
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
222 DavTag *tag = parse_xml_dav_tag(node);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
223 if(tag) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
224 cxListAdd(tags, tag);
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
225 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
226 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
227 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
228 node = node->next;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
229 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
230
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
231 return tags;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
232 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
233
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
234 DavXmlNode* create_xml_taglist(CxList *tags) {
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
235 DavXmlNode *tag1 = NULL;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
236 DavXmlNode *lasttag = NULL;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
237 CxIterator i = cxListIterator(tags);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
238 cx_foreach(DavTag*, tag, i) {
667
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
239 DavXmlNode *tagelm = dav_xml_createnode(DAV_PROPS_NS, "tag");
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
240 DavXmlNode *tagname = dav_xml_createnode_with_text(DAV_PROPS_NS, "name", tag->name);
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
241 tagelm->children = tagname;
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
242 if(tag->color) {
667
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
243 DavXmlNode *tagcolor = dav_xml_createnode_with_text(DAV_PROPS_NS, "color", tag->color);
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
244 tagname->next = tagcolor;
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
245 }
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
246
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
247 if(lasttag) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
248 lasttag->next = tagelm;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
249 tagelm->prev = lasttag;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
250 } else {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
251 tag1 = tagelm;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
252 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
253 lasttag = tagelm;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
254 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
255 return tag1;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
256 }
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
257
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
258
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
259 #ifdef __APPLE__
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
260 static DavTag* tagstr2davtag(const char *str) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
261 const char *name = str;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
262 const char *color = NULL;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
263 size_t len = strlen(str);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
264 size_t namelen = len;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
265
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
266 if(len == 0) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
267 return NULL;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
268 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
269
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
270 // start with 1 because the first char should not be a linebreak
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
271 for(int i=1;i<len;i++) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
272 if(str[i] == '\n') {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
273 if(!color) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
274 color = str + i + 1;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
275 namelen = i;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
276 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
277 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
278 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
279 int colorlen = len - namelen - 1;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
280
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
281 DavTag *tag = malloc(sizeof(DavTag));
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
282 tag->name = malloc(namelen + 1);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
283 memcpy(tag->name, name, namelen);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
284 tag->name[namelen] = 0;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
285 if(colorlen > 0) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
286 tag->color = malloc(colorlen + 1);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
287 memcpy(tag->color, color, colorlen);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
288 tag->color[colorlen] = 0;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
289 } else {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
290 tag->color = NULL;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
291 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
292
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
293 return tag;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
294 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
295
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
296 CxList* parse_macos_taglist(const char *buf, size_t length) {
785
645f7e802873 fix build on macOS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 769
diff changeset
297 CxList *taglist = cxLinkedListCreateSimple(CX_STORE_POINTERS);
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
298 taglist->simple_destructor = (cx_destructor_func)free_dav_tag;
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
299
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
300 CFDataRef data = CFDataCreateWithBytesNoCopy(
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
301 kCFAllocatorDefault,
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
302 (const UInt8*)buf,
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
303 length,
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
304 kCFAllocatorNull);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
305 CFPropertyListRef propertylist = CFPropertyListCreateWithData(kCFAllocatorDefault, data, 0, NULL, NULL);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
306 CFArrayRef array = propertylist;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
307 int count = CFArrayGetCount(array);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
308 for(int i=0;i<count;i++) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
309 CFStringRef str = CFArrayGetValueAtIndex(array, i);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
310 int slen = CFStringGetLength(str);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
311 size_t cstrbuflen = slen * 4 + 4;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
312 char *cstr = malloc(cstrbuflen);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
313 if(CFStringGetCString(str, cstr, cstrbuflen, kCFStringEncodingUTF8)) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
314 DavTag *tag = tagstr2davtag(cstr);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
315 if(tag) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
316 cxListAdd(taglist, tag);
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
317 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
318 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
319 free(cstr);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
320 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
321
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
322 CFRelease(propertylist);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
323 CFRelease(data);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
324
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
325 return taglist;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
326 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
327
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
328 CxBuffer* create_macos_taglist(CxList *tags) {
785
645f7e802873 fix build on macOS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 769
diff changeset
329 size_t count = tags->size;
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
330 if(count == 0) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
331 return NULL;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
332 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
333
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
334 CFStringRef *strings = calloc(sizeof(CFStringRef), count);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
335 int i = 0;
785
645f7e802873 fix build on macOS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 769
diff changeset
336 CxIterator iter = cxListIterator(tags);
645f7e802873 fix build on macOS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 769
diff changeset
337 cx_foreach(DavTag*, tag, iter) {
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
338 CFStringRef str = NULL;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
339 if(tag->color) {
785
645f7e802873 fix build on macOS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 769
diff changeset
340 cxmutstr s = cx_strcat(3, cx_mutstr(tag->name), CX_STR("\n"), cx_str(tag->color));
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
341 str = CFStringCreateWithCString(kCFAllocatorDefault, s.ptr, kCFStringEncodingUTF8);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
342 free(s.ptr);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
343 } else {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
344 str = CFStringCreateWithCString(kCFAllocatorDefault, tag->name, kCFStringEncodingUTF8);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
345 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
346 strings[i] = str;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
347 i++;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
348 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
349
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
350 CFPropertyListRef array = CFArrayCreate(kCFAllocatorDefault, (const void**)strings, count, &kCFTypeArrayCallBacks);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
351 CFDataRef data = CFPropertyListCreateData(kCFAllocatorDefault, array, kCFPropertyListBinaryFormat_v1_0, 0, NULL);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
352
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
353 CxBuffer *buf = NULL;
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
354 if(data) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
355 int datalen = CFDataGetLength(data);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
356 CFRange range;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
357 range.location = 0;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
358 range.length = datalen;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
359 buf = cxBufferCreate(NULL, datalen, cxDefaultAllocator, 0);
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
360 CFDataGetBytes(data, range, (UInt8*)buf->space);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
361 buf->size = datalen;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
362 CFRelease(data);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
363 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
364
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
365 for(int i=0;i<count;i++) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
366 CFRelease(strings[i]);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
367 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
368 CFRelease(array);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
369
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
370 return buf;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
371 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
372
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
373 #else
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
374 CxList* parse_macos_taglist(const char *buf, size_t length) {
373
dcc03142eb5f dav info prints simplified xml values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 363
diff changeset
375 fprintf(stderr, "Error: macos tags not supported on this platform.\n");
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
376 return NULL;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
377 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
378 CxBuffer* create_macos_taglist(CxList *tags) {
373
dcc03142eb5f dav info prints simplified xml values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 363
diff changeset
379 fprintf(stderr, "Error: macos tags not supported on this platform.\n");
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
380 return NULL;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
381 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
382 #endif
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
383
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
384
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
385 int compare_taglists(CxList *tags1, CxList *tags2) {
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
386 if(!tags1) {
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
387 return tags2 ? 0 : 1;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
388 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
389 if(!tags2) {
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
390 return tags1 ? 0 : 1;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
391 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
392
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
393 CxMap *map1 = taglist2map(tags1);
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
394
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
395 int equal = 1;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
396 int i = 0;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
397 CxIterator iter = cxListIterator(tags2);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
398 cx_foreach(DavTag*, t, iter) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
399 if(!cxMapGet(map1, cx_hash_key_str(t->name))) {
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
400 equal = 0;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
401 break;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
402 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
403 i++;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
404 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
405
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
406 if(i != map1->size) {
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
407 equal = 0;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
408 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
409 cxMapDestroy(map1);
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
410 return equal;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
411 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
412
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
413 char* create_tags_hash(CxList *tags) {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
414 if(!tags) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
415 return NULL;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
416 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
417 CxBuffer *buf = create_text_taglist(tags);
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
418 char *hash = dav_create_hash(buf->space, buf->size);
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
419 cxBufferDestroy(buf);
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
420 return hash;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
421 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
422
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
423 CxList* merge_tags(CxList *tags1, CxList *tags2) {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
424 // this map is used to check the existence of tags
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
425 CxMap *tag_map = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 32);
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
426 // merged taglist
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
427 CxList *new_tags = cxLinkedListCreateSimple(CX_STORE_POINTERS);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
428 new_tags->simple_destructor = (cx_destructor_func)free_dav_tag;
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
429
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
430 // add all local tags
769
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
431 if(tags1) {
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
432 CxIterator iter = cxListIterator(tags1);
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
433 cx_foreach(DavTag*, t, iter) {
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
434 cxMapPut(tag_map, cx_hash_key_str(t->name), t);
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
435 DavTag *newt = calloc(1, sizeof(DavTag));
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
436 newt->color = t->color ? strdup(t->color) : NULL;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
437 newt->name = strdup(t->name);
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
438 cxListAdd(new_tags, newt);
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
439 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
440 }
769
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
441
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
442 // check if a remote tag is already in the map
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
443 // and if not add it to the new taglist
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
444 if(tags2) {
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
445 CxIterator iter = cxListIterator(tags2);
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
446 cx_foreach(DavTag*, t, iter) {
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
447 if(!cxMapGet(tag_map, cx_hash_key_str(t->name))) {
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
448 DavTag *newt = calloc(1, sizeof(DavTag));
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
449 newt->color = t->color ? strdup(t->color) : NULL;
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
450 newt->name = strdup(t->name);
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
451 cxListAdd(new_tags, newt);
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
452 }
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
453 }
24b317ce5ca9 fix crash in merge_tags() when one list was NULL
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 768
diff changeset
454 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
455
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
456 cxMapDestroy(tag_map);
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
457
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
458 return new_tags;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
459 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
460
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
461 void add_tag_colors(CxList *taglist, CxList *colored) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
462 CxMap *tagmap = taglist2map(taglist);
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
463
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
464 CxIterator i = cxListIterator(colored);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
465 cx_foreach(DavTag*, colored_tag, i) {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
466 if(colored_tag->color) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
467 DavTag *tag = cxMapGet(tagmap, cx_hash_key_str(colored_tag->name));
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
468 if(tag && !tag->color) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
469 tag->color = strdup(colored_tag->color);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
470 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
471 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
472 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
473
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
474 cxMapDestroy(tagmap);
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
475 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
476
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
477 /* ----------- ----------- tag filter ---------------------- */
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
478
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
479 static size_t rtrimskip(cxstring str, size_t skip) {
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
480 while (skip < str.length && isspace(str.ptr[skip])) skip++;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
481 return skip;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
482 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
483
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
484 static size_t parse_tagfilter_taglist(cxstring fs, SyncTagFilter* tagfilter) {
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
485 size_t csvlen;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
486 for (csvlen = 0 ; csvlen < fs.length ; ++csvlen) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
487 if (fs.ptr[csvlen] == ')') break;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
488 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
489 fs.length = csvlen;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
490
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
491 tagfilter->tags = parse_csv_taglist(fs.ptr, fs.length);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
492
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
493 return csvlen;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
494 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
495
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
496 static size_t parse_tagfilter_subfilters(cxstring fs, SyncTagFilter* tagfilter);
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
497
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
498 static size_t parse_tagfilter_filter(cxstring fs, SyncTagFilter* tagfilter) {
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
499
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
500 size_t consumed = rtrimskip(fs, 0);
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
501 fs = cx_strsubs(fs, consumed);
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
502
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
503 if (fs.length == 0) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
504 return consumed;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
505 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
506
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
507 // optional operator
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
508 int hasop = 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
509 if (fs.ptr[0] == '&') {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
510 tagfilter->mode = DAV_SYNC_TAGFILTER_AND;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
511 hasop = 1;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
512 } else if (fs.ptr[0] == '|') {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
513 tagfilter->mode = DAV_SYNC_TAGFILTER_OR;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
514 hasop = 1;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
515 } else if (fs.ptr[0] == '0') {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
516 tagfilter->mode = DAV_SYNC_TAGFILTER_NONE;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
517 hasop = 1;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
518 } else if (fs.ptr[0] == '1') {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
519 tagfilter->mode = DAV_SYNC_TAGFILTER_ONE;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
520 hasop = 1;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
521 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
522 // default operator is AND
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
523 tagfilter->mode = DAV_SYNC_TAGFILTER_AND;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
524 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
525
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
526 if (hasop) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
527 size_t skip = rtrimskip(fs, 1);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
528 consumed += skip;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
529 fs = cx_strsubs(fs, skip);
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
530 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
531
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
532 if (fs.length > 0 && fs.ptr[0] == '(') {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
533 size_t c = parse_tagfilter_subfilters(fs, tagfilter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
534 if (c) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
535 return consumed + c;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
536 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
537 return 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
538 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
539 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
540 tagfilter->subfilter_count = 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
541 tagfilter->subfilters = NULL;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
542 return consumed + parse_tagfilter_taglist(fs, tagfilter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
543 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
544 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
545 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
546
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
547 /*
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
548 * Parses: ( "(" , filter , ")" )+
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
549 */
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
550 static size_t parse_tagfilter_subfilters(cxstring fs, SyncTagFilter* f) {
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
551
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
552 // strategy: allocate much and give back later (instead of reallocs in loop)
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
553 size_t subfilter_cap = 8;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
554 f->subfilters = calloc(subfilter_cap, sizeof(SyncTagFilter*));
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
555 f->subfilter_count = 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
556
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
557 size_t total_consumed = 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
558 size_t c;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
559 do {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
560 // skip leading parenthesis (and white spaces)
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
561 c = rtrimskip(fs, 1);
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
562 fs = cx_strsubs(fs, c);
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
563 total_consumed += c;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
564
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
565 // increase array capacity, if necessary
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
566 if (f->subfilter_count >= subfilter_cap) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
567 subfilter_cap *= 2;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
568 SyncTagFilter** newarr = realloc(f->subfilters,
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
569 subfilter_cap * sizeof(SyncTagFilter*));
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
570 if (newarr) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
571 f->subfilters = newarr;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
572 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
573 abort(); // no error handling reachable, so we are fucked
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
574 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
575 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
576
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
577 // allocate space for a new filter
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
578 SyncTagFilter* subf = calloc(1, sizeof(SyncTagFilter));
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
579
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
580 // parse that filter
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
581 c = parse_tagfilter_filter(fs, subf);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
582
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
583 // sanity check: we must end with a closing parenthesis
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
584 if (c > 0 && fs.ptr[c] == ')') {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
585 f->subfilters[f->subfilter_count++] = subf;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
586
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
587 // consume ')' and find the next parenthesis or the end-of-string
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
588 c = rtrimskip(fs, 1+c);
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
589 fs = cx_strsubs(fs, c);
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
590 total_consumed += c;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
591
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
592 if (fs.length == 0 || fs.ptr[0] == ')') {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
593 // our job is done
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
594 break;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
595 } else if (fs.ptr[0] != '(') {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
596 // anything else than a parenthesis or end-of-string is an error
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
597 return 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
598 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
599 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
600 free(subf);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
601 break;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
602 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
603
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
604 } while(1);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
605
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
606 // try to shrink the array
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
607 if (f->subfilter_count > 0) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
608 SyncTagFilter** shrinked_array = realloc(f->subfilters,
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
609 f->subfilter_count * sizeof(SyncTagFilter*));
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
610 if (shrinked_array) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
611 f->subfilters = shrinked_array;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
612 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
613 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
614 free(f->subfilters);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
615 f->subfilters = NULL;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
616 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
617
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
618 return total_consumed;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
619 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
620
414
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 403
diff changeset
621 SyncTagFilter* parse_tagfilter_string(const char* filterstring, int scope) {
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
622 SyncTagFilter* tagfilter = calloc(1, sizeof(SyncTagFilter));
414
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 403
diff changeset
623 tagfilter->scope = scope;
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
624 if (!filterstring) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
625 return tagfilter;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
626 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
627
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
628 cxstring fs = cx_str(filterstring);
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
629 size_t consumed = parse_tagfilter_filter(fs, tagfilter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
630 if (!consumed) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
631 free_tagfilter(tagfilter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
632 return NULL;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
633 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
634
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
635 // consume trailing white spaces
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
636 consumed = rtrimskip(fs, consumed);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
637
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
638 // sanity check: have we consumed the whole string?
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
639 if (consumed != fs.length) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
640 free_tagfilter(tagfilter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
641 return NULL;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
642 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
643
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
644 return tagfilter;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
645 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
646
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
647 void free_tagfilter(SyncTagFilter* filter) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
648 for (size_t i = 0 ; i < filter->subfilter_count ; i++) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
649 free_tagfilter(filter->subfilters[i]);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
650 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
651 free(filter->subfilters);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
652 free(filter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
653 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
654
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
655
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
656 static int matches_tags_and(CxList *dav_tags, CxList *tags, int ignorecase) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
657 // ignorecase not supported yet
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
658 int ret = 1;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
659 CxMap *tagmap = taglist2map(dav_tags);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
660 CxIterator i = cxListIterator(tags);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
661 cx_foreach(DavTag *, tag, i) {
768
eb495f3d4065 fix matches_tags_and
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 767
diff changeset
662 if (cxMapGet(tagmap, cx_hash_key_str(tag->name)) == NULL) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
663 ret = 0;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
664 break;
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
665 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
666 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
667 cxMapDestroy(tagmap);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
668 return ret;
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
669 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
670
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
671 static int matches_tags_or(CxList *dav_tags, CxList *tags, int ignorecase) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
672 // ignorecase not supported yet
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
673 int ret = 0;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
674 CxMap *tagmap = taglist2map(dav_tags);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
675 CxIterator i = cxListIterator(tags);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
676 cx_foreach(DavTag *, tag, i) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
677 if (cxMapGet(tagmap, cx_hash_key_str(tag->name))) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
678 ret = 1;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
679 break;
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
680 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
681 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
682 cxMapDestroy(tagmap);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
683 return ret;
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
684 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
685
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
686 static int matches_tags_one(CxList *dav_tags, CxList *tags, int ignorecase) {
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
687 int matches_exactly_one = 0;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
688 CxMap *tagmap = taglist2map(dav_tags);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
689 CxIterator i = cxListIterator(tags);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
690 cx_foreach(DavTag *, tag, i) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
691 if (cxMapGet(tagmap, cx_hash_key_str(tag->name))) {
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
692 if (matches_exactly_one) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
693 cxMapDestroy(tagmap);
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
694 return 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
695 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
696 matches_exactly_one = 1;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
697 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
698 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
699 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
700 cxMapDestroy(tagmap);
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
701 return matches_exactly_one;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
702 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
703
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
704 static int matches_subfilters_and(CxList *dav_tags, SyncTagFilter *filter) {
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
705 int ret = 1;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
706 for (size_t i = 0 ; i < filter->subfilter_count ; i++) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
707 ret &= matches_tagfilter(dav_tags, filter->subfilters[i]);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
708 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
709 return ret;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
710 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
711
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
712 static int matches_subfilters_or(CxList *dav_tags, SyncTagFilter *filter) {
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
713 int ret = 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
714 for (size_t i = 0 ; i < filter->subfilter_count ; i++) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
715 ret |= matches_tagfilter(dav_tags, filter->subfilters[i]);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
716 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
717 return ret;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
718 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
719
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
720 static int matches_subfilters_one(CxList *dav_tags, SyncTagFilter *filter) {
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
721 int one = 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
722 for (size_t i = 0 ; i < filter->subfilter_count ; i++) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
723 if (matches_tagfilter(dav_tags, filter->subfilters[i])) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
724 if (one) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
725 return 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
726 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
727 one = 1;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
728 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
729 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
730 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
731 return one;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
732 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
733
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
734 int matches_tagfilter(CxList *dav_tags, SyncTagFilter *tagfilter) {
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
735
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
736 if (tagfilter->subfilter_count > 0) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
737 switch (tagfilter->mode) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
738 case DAV_SYNC_TAGFILTER_OR:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
739 return matches_subfilters_or(dav_tags, tagfilter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
740 case DAV_SYNC_TAGFILTER_AND:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
741 return matches_subfilters_and(dav_tags, tagfilter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
742 case DAV_SYNC_TAGFILTER_NONE:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
743 return !matches_subfilters_or(dav_tags, tagfilter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
744 case DAV_SYNC_TAGFILTER_ONE:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
745 return matches_subfilters_one(dav_tags, tagfilter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
746 default:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
747 abort();
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
748 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
749 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
750 int ignorecase = 0; // TODO: maybe add support later
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
751 switch (tagfilter->mode) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
752 case DAV_SYNC_TAGFILTER_OR:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
753 return matches_tags_or(dav_tags, tagfilter->tags, ignorecase);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
754 case DAV_SYNC_TAGFILTER_AND:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
755 return matches_tags_and(dav_tags, tagfilter->tags, ignorecase);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
756 case DAV_SYNC_TAGFILTER_NONE:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
757 return !matches_tags_or(dav_tags, tagfilter->tags, ignorecase);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
758 case DAV_SYNC_TAGFILTER_ONE:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
759 return matches_tags_one(dav_tags, tagfilter->tags, ignorecase);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
760 default:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
761 abort();
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
762 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
763 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
764 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
765

mercurial