dav/tags.c

Sat, 22 Jun 2019 16:36:52 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 22 Jun 2019 16:36:52 +0200
changeset 607
5dc7fe41e8f8
parent 525
26a1d5b9d9d2
child 667
6cdcd3e4e368
permissions
-rw-r--r--

move some properties to new namespace

for properties encryption we need to decide which props must be encrypted and the plan is, to decide by namespace

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
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34 #include <ucx/string.h>
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 #include <ucx/utils.h>
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
37 #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
38
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 #include "libxattr.h"
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 #include "tags.h"
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
43 #ifdef __APPLE__
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
44 #include <CoreFoundation/CoreFoundation.h>
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
45 #endif
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
46
390
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
47 void free_dav_tag(DavTag* tag) {
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
48 free(tag->name);
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 400
diff changeset
49 if(tag->color) {
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 400
diff changeset
50 free(tag->color);
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 400
diff changeset
51 }
390
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
52 free(tag);
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
53 }
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
54
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
55 void free_taglist(UcxList *list) {
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
56 ucx_list_free_content(list, (ucx_destructor)free_dav_tag);
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
57 ucx_list_free(list);
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
58 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
59
390
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
60 int compare_tagname(DavTag* left, DavTag* right, void* ignorecase) {
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
61 sstr_t leftname = sstr(left->name);
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
62 sstr_t rightname = sstr(right->name);
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
63 if (ignorecase && *((int*) ignorecase)) {
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
64 return sstrcasecmp(leftname, rightname);
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
65 } else {
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
66 return sstrcmp(leftname, rightname);
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
67 }
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
68 }
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 388
diff changeset
69
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 UcxList* parse_text_taglist(const char *buf, size_t length) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 UcxList *tags = NULL;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 int line_start = 0;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 for(int i=0;i<length;i++) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 if(buf[i] == '\n' || i == length-1) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 sstr_t line = sstrtrim(sstrn((char*)buf + line_start, i - line_start));
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 if(line.length > 0) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 DavTag *tag = calloc(1, sizeof(DavTag));
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
79 sstr_t color = sstrchr(line, '#');
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
80 if(color.length>0) {
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
81 sstr_t name = line;
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
82 name.length = (int)(color.ptr-line.ptr);
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
83 if(name.length != 0) {
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
84 tag->name = sstrdup(name).ptr;
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
85 color.ptr++;
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
86 color.length--;
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
87 if(color.length > 0) {
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
88 tag->color = sstrdup(color).ptr;
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
89 }
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
90 } else {
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
91 free(tag);
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
92 }
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
93 } else {
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
94 tag->name = sstrdup(line).ptr;
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
95 tag->color = NULL;
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
96 }
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
97
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 tags = ucx_list_append(tags, tag);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 line_start = i+1;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 return tags;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105 }
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 UcxBuffer* create_text_taglist(UcxList *tags) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 if(!tags) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109 return NULL;
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
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 UcxBuffer *buf = ucx_buffer_new(NULL, 128, UCX_BUFFER_AUTOEXTEND);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
113 UCX_FOREACH(elm, tags) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114 DavTag *tag = elm->data;
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
115 if(tag->color) {
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
116 ucx_bprintf(buf, "%s#%s\n", tag->name, tag->color);
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
117 } else {
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
118 ucx_bprintf(buf, "%s\n", tag->name);
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
119 }
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
120 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
121 return buf;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
122 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
125 UcxList* parse_csv_taglist(const char *buf, size_t length) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
126 UcxList *taglist = NULL;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128 sstr_t str = sstrn((char*)buf, length);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129 ssize_t count = 0;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
130 sstr_t *tags = sstrsplit(str, S(","), &count);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
131 for(int i=0;i<count;i++) {
393
438c8fe7d62f parse_csv_taglist() now skips empty tags
Mike Becker <universe@uap-core.de>
parents: 390
diff changeset
132 sstr_t trimmed_tag = sstrtrim(tags[i]);
438c8fe7d62f parse_csv_taglist() now skips empty tags
Mike Becker <universe@uap-core.de>
parents: 390
diff changeset
133 if (trimmed_tag.length > 0) {
438c8fe7d62f parse_csv_taglist() now skips empty tags
Mike Becker <universe@uap-core.de>
parents: 390
diff changeset
134 DavTag *tag = malloc(sizeof(DavTag));
438c8fe7d62f parse_csv_taglist() now skips empty tags
Mike Becker <universe@uap-core.de>
parents: 390
diff changeset
135 tag->name = sstrdup(trimmed_tag).ptr;
438c8fe7d62f parse_csv_taglist() now skips empty tags
Mike Becker <universe@uap-core.de>
parents: 390
diff changeset
136 tag->color = NULL;
438c8fe7d62f parse_csv_taglist() now skips empty tags
Mike Becker <universe@uap-core.de>
parents: 390
diff changeset
137 taglist = ucx_list_append(taglist, tag);
438c8fe7d62f parse_csv_taglist() now skips empty tags
Mike Becker <universe@uap-core.de>
parents: 390
diff changeset
138 }
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
139 free(tags[i].ptr);
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 if(tags) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
142 free(tags);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
143 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
144 return taglist;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
145 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
146
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
147 UcxBuffer* create_csv_taglist(UcxList *tags) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
148 UcxBuffer *buf = ucx_buffer_new(NULL, 128, UCX_BUFFER_AUTOEXTEND);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
149 int insertsep = 0;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
150 UCX_FOREACH(elm, tags) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
151 DavTag *tag = elm->data;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
152 if(insertsep) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
153 ucx_buffer_putc(buf, ',');
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
154 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
155 ucx_buffer_puts(buf, tag->name);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
156 insertsep = 1;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
157 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
158 return buf;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
159 }
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
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
162 static DavTag* parse_xml_dav_tag(DavXmlNode *node) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
163 char *name = NULL;
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
164 char *color = NULL;
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
165
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
166 DavXmlNode *c = node->children;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
167 while(c) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
168 if(c->type == DAV_XML_ELEMENT) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
169 char *value = dav_xml_getstring(c->children);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
170 if(value) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
171 if(!strcmp(c->namespace, DAV_NS)) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
172 if(!strcmp(c->name, "name")) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
173 char *value = dav_xml_getstring(c->children);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
174 if(value) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
175 name = value;
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 }
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
178 if(!strcmp(c->name, "color")) {
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
179 char *value = dav_xml_getstring(c->children);
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
180 if(value) {
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
181 color = value;
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
182 }
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
183 }
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
184 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
185 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
186 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
187 c = c->next;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
188 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
189
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
190 DavTag *tag = NULL;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
191 if(name) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
192 tag = malloc(sizeof(DavTag));
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
193 tag->name = strdup(name);
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
194 tag->color = color ? strdup(color) : NULL;
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
195 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
196 return tag;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
197 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
198
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
199 UcxList* parse_dav_xml_taglist(DavXmlNode *taglistnode) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
200 UcxList *tags = NULL;
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 DavXmlNode *node = taglistnode;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
203 while(node) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
204 if(node->type == DAV_XML_ELEMENT) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
205 if(!strcmp(node->namespace, DAV_NS) && !strcmp(node->name, "tag")) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
206 DavTag *tag = parse_xml_dav_tag(node);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
207 if(tag) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
208 tags = ucx_list_append(tags, tag);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
209 }
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 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
212 node = node->next;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
213 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
214
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
215 return tags;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
216 }
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* create_xml_taglist(UcxList *tags) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
219 DavXmlNode *tag1 = NULL;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
220 DavXmlNode *lasttag = NULL;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
221 UCX_FOREACH(elm, tags) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
222 DavTag *tag = elm->data;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
223
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
224 DavXmlNode *tagelm = dav_xml_createnode(DAV_NS, "tag");
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
225 DavXmlNode *tagname = dav_xml_createnode_with_text(DAV_NS, "name", tag->name);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
226 tagelm->children = tagname;
423
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
227 if(tag->color) {
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
228 DavXmlNode *tagcolor = dav_xml_createnode_with_text(DAV_NS, "color", tag->color);
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
229 tagname->next = tagcolor;
84e6c407b431 adds support for tag colors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
230 }
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
231
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
232 if(lasttag) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
233 lasttag->next = tagelm;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
234 tagelm->prev = lasttag;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
235 } else {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
236 tag1 = tagelm;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
237 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
238 lasttag = tagelm;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
239 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
240 return tag1;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
241 }
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
242
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
243
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
244 #ifdef __APPLE__
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
245 static DavTag* tagstr2davtag(const char *str) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
246 const char *name = str;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
247 const char *color = NULL;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
248 size_t len = strlen(str);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
249 size_t namelen = len;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
250
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
251 if(len == 0) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
252 return NULL;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
253 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
254
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
255 // 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
256 for(int i=1;i<len;i++) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
257 if(str[i] == '\n') {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
258 if(!color) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
259 color = str + i + 1;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
260 namelen = i;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
261 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
262 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
263 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
264 int colorlen = len - namelen - 1;
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 DavTag *tag = malloc(sizeof(DavTag));
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
267 tag->name = malloc(namelen + 1);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
268 memcpy(tag->name, name, namelen);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
269 tag->name[namelen] = 0;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
270 if(colorlen > 0) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
271 tag->color = malloc(colorlen + 1);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
272 memcpy(tag->color, color, colorlen);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
273 tag->color[colorlen] = 0;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
274 } else {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
275 tag->color = NULL;
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 return tag;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
279 }
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 UcxList* parse_macos_taglist(const char *buf, size_t length) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
282 UcxList *taglist = NULL;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
283
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
284 CFDataRef data = CFDataCreateWithBytesNoCopy(
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
285 kCFAllocatorDefault,
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
286 (const UInt8*)buf,
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
287 length,
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
288 kCFAllocatorNull);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
289 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
290 CFArrayRef array = propertylist;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
291 int count = CFArrayGetCount(array);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
292 for(int i=0;i<count;i++) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
293 CFStringRef str = CFArrayGetValueAtIndex(array, i);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
294 int slen = CFStringGetLength(str);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
295 size_t cstrbuflen = slen * 4 + 4;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
296 char *cstr = malloc(cstrbuflen);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
297 if(CFStringGetCString(str, cstr, cstrbuflen, kCFStringEncodingUTF8)) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
298 DavTag *tag = tagstr2davtag(cstr);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
299 if(tag) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
300 taglist = ucx_list_append(taglist, tag);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
301 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
302 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
303 free(cstr);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
304 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
305
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
306 CFRelease(propertylist);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
307 CFRelease(data);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
308
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
309 return taglist;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
310 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
311
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
312 UcxBuffer* create_macos_taglist(UcxList *tags) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
313 size_t count = ucx_list_size(tags);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
314 if(count == 0) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
315 return NULL;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
316 }
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 CFStringRef *strings = calloc(sizeof(CFStringRef), count);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
319 int i = 0;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
320 UCX_FOREACH(elm, tags) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
321 DavTag *tag = elm->data;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
322 CFStringRef str = NULL;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
323 if(tag->color) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
324 sstr_t s = sstrcat(3, sstr(tag->name), S("\n"), sstr(tag->color));
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
325 str = CFStringCreateWithCString(kCFAllocatorDefault, s.ptr, kCFStringEncodingUTF8);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
326 free(s.ptr);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
327 } else {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
328 str = CFStringCreateWithCString(kCFAllocatorDefault, tag->name, kCFStringEncodingUTF8);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
329 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
330 strings[i] = str;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
331 i++;
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 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
335 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
336
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
337 UcxBuffer *buf = NULL;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
338 if(data) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
339 int datalen = CFDataGetLength(data);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
340 CFRange range;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
341 range.location = 0;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
342 range.length = datalen;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
343 buf = ucx_buffer_new(NULL, datalen, 0);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
344 CFDataGetBytes(data, range, (UInt8*)buf->space);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
345 buf->size = datalen;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
346 CFRelease(data);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
347 }
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 for(int i=0;i<count;i++) {
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
350 CFRelease(strings[i]);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
351 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
352 CFRelease(array);
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
353
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
354 return buf;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
355 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
356
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
357 #else
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
358 UcxList* 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
359 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
360 return NULL;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
361 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
362 UcxBuffer* create_macos_taglist(UcxList *tags) {
373
dcc03142eb5f dav info prints simplified xml values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 363
diff changeset
363 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
364 return NULL;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
365 }
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
366 #endif
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
367
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
368
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
369 int compare_taglists(UcxList *tags1, UcxList *tags2) {
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
370 if(!tags1) {
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
371 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
372 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
373 if(!tags2) {
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
374 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
375 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
376
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
377 UcxMap *map1 = ucx_map_new(32);
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
378 UCX_FOREACH(elm, tags1) {
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
379 DavTag *t = elm->data;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
380 ucx_map_cstr_put(map1, t->name, t);
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
381 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
382
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
383 int equal = 1;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
384 int i = 0;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
385 UCX_FOREACH(elm, tags2) {
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
386 DavTag *t = elm->data;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
387 if(!ucx_map_cstr_get(map1, t->name)) {
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
388 equal = 0;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
389 break;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
390 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
391 i++;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
392 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
393
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
394 if(i != map1->count) {
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
395 equal = 0;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
396 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
397 ucx_map_free(map1);
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
398 return equal;
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
399 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 510
diff changeset
400
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
401 char* create_tags_hash(UcxList *tags) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
402 if(!tags) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
403 return NULL;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
404 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
405 UcxBuffer *buf = create_text_taglist(tags);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
406 char *hash = dav_create_hash(buf->space, buf->size);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
407 ucx_buffer_free(buf);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
408 return hash;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
409 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
410
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
411 UcxList* merge_tags(UcxList *tags1, UcxList *tags2) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
412 // this map is used to check the existence of tags
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
413 UcxMap *tag_map = ucx_map_new(32);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
414 // merged taglist
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
415 UcxList *new_tags = NULL;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
416
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
417 // add all local tags
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
418 UCX_FOREACH(elm, tags1) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
419 DavTag *t = elm->data;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
420 ucx_map_cstr_put(tag_map, t->name, t);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
421 DavTag *newt = calloc(1, sizeof(DavTag));
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
422 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
423 newt->name = strdup(t->name);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
424 new_tags = ucx_list_append(new_tags, newt);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
425 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
426 // check if a remote tag is already in the map
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
427 // and if not add it to the new taglist
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
428 UCX_FOREACH(elm, tags2) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
429 DavTag *t = elm->data;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
430 if(!ucx_map_cstr_get(tag_map, t->name)) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
431 DavTag *newt = calloc(1, sizeof(DavTag));
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
432 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
433 newt->name = strdup(t->name);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
434 new_tags = ucx_list_append(new_tags, newt);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
435 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
436 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
437
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
438 ucx_map_free(tag_map);
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 return new_tags;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
441 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
442
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
443 void add_tag_colors(UcxList *taglist, UcxList *colored) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
444 UcxMap *tagmap = ucx_map_new(32);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
445 UCX_FOREACH(elm, taglist) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
446 DavTag *tag = elm->data;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
447 ucx_map_cstr_put(tagmap, tag->name, tag);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
448 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
449
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
450 UCX_FOREACH(elm, colored) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
451 DavTag *colored_tag = elm->data;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
452 if(colored_tag->color) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
453 DavTag *tag = ucx_map_cstr_get(tagmap, colored_tag->name);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
454 if(tag && !tag->color) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
455 tag->color = strdup(colored_tag->color);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
456 }
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 }
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 ucx_map_free(tagmap);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
461 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
462
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
463 /* ----------- ----------- tag filter ---------------------- */
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
464
510
d6e801f97e7a more sstr to scstr conversion
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 423
diff changeset
465 static size_t rtrimskip(scstr_t str, size_t skip) {
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
466 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
467 return skip;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
468 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
469
510
d6e801f97e7a more sstr to scstr conversion
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 423
diff changeset
470 static size_t parse_tagfilter_taglist(scstr_t fs, SyncTagFilter* tagfilter) {
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
471 size_t csvlen;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
472 for (csvlen = 0 ; csvlen < fs.length ; ++csvlen) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
473 if (fs.ptr[csvlen] == ')') break;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
474 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
475 fs.length = csvlen;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
476
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
477 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
478
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
479 return csvlen;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
480 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
481
510
d6e801f97e7a more sstr to scstr conversion
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 423
diff changeset
482 static size_t parse_tagfilter_subfilters(scstr_t fs, SyncTagFilter* tagfilter);
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
483
510
d6e801f97e7a more sstr to scstr conversion
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 423
diff changeset
484 static size_t parse_tagfilter_filter(scstr_t fs, SyncTagFilter* tagfilter) {
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
485
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
486 size_t consumed = rtrimskip(fs, 0);
510
d6e801f97e7a more sstr to scstr conversion
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 423
diff changeset
487 fs = scstrsubs(fs, consumed);
400
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 if (fs.length == 0) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
490 return consumed;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
491 } else {
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 // optional operator
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
494 int hasop = 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
495 if (fs.ptr[0] == '&') {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
496 tagfilter->mode = DAV_SYNC_TAGFILTER_AND;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
497 hasop = 1;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
498 } else if (fs.ptr[0] == '|') {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
499 tagfilter->mode = DAV_SYNC_TAGFILTER_OR;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
500 hasop = 1;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
501 } else if (fs.ptr[0] == '0') {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
502 tagfilter->mode = DAV_SYNC_TAGFILTER_NONE;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
503 hasop = 1;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
504 } else if (fs.ptr[0] == '1') {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
505 tagfilter->mode = DAV_SYNC_TAGFILTER_ONE;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
506 hasop = 1;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
507 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
508 // default operator is AND
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
509 tagfilter->mode = DAV_SYNC_TAGFILTER_AND;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
510 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
511
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
512 if (hasop) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
513 size_t skip = rtrimskip(fs, 1);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
514 consumed += skip;
510
d6e801f97e7a more sstr to scstr conversion
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 423
diff changeset
515 fs = scstrsubs(fs, skip);
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
516 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
517
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
518 if (fs.length > 0 && fs.ptr[0] == '(') {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
519 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
520 if (c) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
521 return consumed + c;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
522 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
523 return 0;
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 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
526 tagfilter->subfilter_count = 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
527 tagfilter->subfilters = NULL;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
528 return consumed + parse_tagfilter_taglist(fs, tagfilter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
529 }
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
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
533 /*
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
534 * Parses: ( "(" , filter , ")" )+
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
535 */
510
d6e801f97e7a more sstr to scstr conversion
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 423
diff changeset
536 static size_t parse_tagfilter_subfilters(scstr_t fs, SyncTagFilter* f) {
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
537
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
538 // 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
539 size_t subfilter_cap = 8;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
540 f->subfilters = calloc(subfilter_cap, sizeof(SyncTagFilter*));
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
541 f->subfilter_count = 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
542
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
543 size_t total_consumed = 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
544 size_t c;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
545 do {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
546 // skip leading parenthesis (and white spaces)
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
547 c = rtrimskip(fs, 1);
510
d6e801f97e7a more sstr to scstr conversion
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 423
diff changeset
548 fs = scstrsubs(fs, c);
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
549 total_consumed += c;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
550
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
551 // increase array capacity, if necessary
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
552 if (f->subfilter_count >= subfilter_cap) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
553 subfilter_cap *= 2;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
554 SyncTagFilter** newarr = realloc(f->subfilters,
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
555 subfilter_cap * sizeof(SyncTagFilter*));
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
556 if (newarr) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
557 f->subfilters = newarr;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
558 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
559 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
560 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
561 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
562
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
563 // allocate space for a new filter
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
564 SyncTagFilter* subf = calloc(1, sizeof(SyncTagFilter));
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
565
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
566 // parse that filter
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
567 c = parse_tagfilter_filter(fs, subf);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
568
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
569 // 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
570 if (c > 0 && fs.ptr[c] == ')') {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
571 f->subfilters[f->subfilter_count++] = subf;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
572
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
573 // 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
574 c = rtrimskip(fs, 1+c);
510
d6e801f97e7a more sstr to scstr conversion
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 423
diff changeset
575 fs = scstrsubs(fs, c);
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
576 total_consumed += c;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
577
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
578 if (fs.length == 0 || fs.ptr[0] == ')') {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
579 // our job is done
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
580 break;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
581 } else if (fs.ptr[0] != '(') {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
582 // 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
583 return 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
584 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
585 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
586 free(subf);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
587 break;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
588 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
589
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
590 } while(1);
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 // try to shrink the array
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
593 if (f->subfilter_count > 0) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
594 SyncTagFilter** shrinked_array = realloc(f->subfilters,
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
595 f->subfilter_count * sizeof(SyncTagFilter*));
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
596 if (shrinked_array) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
597 f->subfilters = shrinked_array;
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(f->subfilters);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
601 f->subfilters = NULL;
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 return total_consumed;
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
414
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 403
diff changeset
607 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
608 SyncTagFilter* tagfilter = calloc(1, sizeof(SyncTagFilter));
414
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 403
diff changeset
609 tagfilter->scope = scope;
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
610 if (!filterstring) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
611 return tagfilter;
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
510
d6e801f97e7a more sstr to scstr conversion
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 423
diff changeset
614 scstr_t fs = scstr(filterstring);
400
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
615 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
616 if (!consumed) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
617 free_tagfilter(tagfilter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
618 return NULL;
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
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
621 // consume trailing white spaces
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
622 consumed = rtrimskip(fs, consumed);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
623
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
624 // 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
625 if (consumed != fs.length) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
626 free_tagfilter(tagfilter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
627 return NULL;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
628 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
629
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
630 return tagfilter;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
631 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
632
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
633 void free_tagfilter(SyncTagFilter* filter) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
634 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
635 free_tagfilter(filter->subfilters[i]);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
636 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
637 free(filter->subfilters);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
638 free(filter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
639 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
640
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
641
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
642 static int matches_tags_and(UcxList *dav_tags, UcxList *tags, int ignorecase) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
643 UCX_FOREACH(e, tags) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
644 if (!ucx_list_contains(dav_tags, e->data,
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
645 (cmp_func) compare_tagname, &ignorecase)) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
646 return 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
647 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
648 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
649 return 1;
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
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
652 static int matches_tags_or(UcxList *dav_tags, UcxList *tags, int ignorecase) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
653 UCX_FOREACH(e, tags) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
654 if (ucx_list_contains(dav_tags, e->data,
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
655 (cmp_func) compare_tagname, &ignorecase)) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
656 return 1;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
657 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
658 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
659 return 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
660 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
661
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
662 static int matches_tags_one(UcxList *dav_tags, UcxList *tags, int ignorecase) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
663 int matches_exactly_one = 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
664 UCX_FOREACH(e, tags) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
665 if (ucx_list_contains(dav_tags, e->data,
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
666 (cmp_func) compare_tagname, &ignorecase)) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
667 if (matches_exactly_one) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
668 return 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
669 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
670 matches_exactly_one = 1;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
671 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
672 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
673 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
674 return matches_exactly_one;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
675 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
676
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
677 static int matches_subfilters_and(UcxList *dav_tags, SyncTagFilter *filter) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
678 int ret = 1;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
679 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
680 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
681 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
682 return ret;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
683 }
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 static int matches_subfilters_or(UcxList *dav_tags, SyncTagFilter *filter) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
686 int ret = 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
687 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
688 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
689 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
690 return ret;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
691 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
692
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
693 static int matches_subfilters_one(UcxList *dav_tags, SyncTagFilter *filter) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
694 int one = 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
695 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
696 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
697 if (one) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
698 return 0;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
699 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
700 one = 1;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
701 }
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 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
704 return one;
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
705 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
706
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
707 int matches_tagfilter(UcxList *dav_tags, SyncTagFilter *tagfilter) {
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 if (tagfilter->subfilter_count > 0) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
710 switch (tagfilter->mode) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
711 case DAV_SYNC_TAGFILTER_OR:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
712 return matches_subfilters_or(dav_tags, tagfilter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
713 case DAV_SYNC_TAGFILTER_AND:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
714 return matches_subfilters_and(dav_tags, tagfilter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
715 case DAV_SYNC_TAGFILTER_NONE:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
716 return !matches_subfilters_or(dav_tags, tagfilter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
717 case DAV_SYNC_TAGFILTER_ONE:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
718 return matches_subfilters_one(dav_tags, tagfilter);
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
719 default:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
720 abort();
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
721 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
722 } else {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
723 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
724 switch (tagfilter->mode) {
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
725 case DAV_SYNC_TAGFILTER_OR:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
726 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
727 case DAV_SYNC_TAGFILTER_AND:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
728 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
729 case DAV_SYNC_TAGFILTER_NONE:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
730 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
731 case DAV_SYNC_TAGFILTER_ONE:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
732 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
733 default:
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
734 abort();
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 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
737 }
90c6bfa94fa2 moves tag filter to tags.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 393
diff changeset
738

mercurial