# HG changeset patch # User Olaf Wintermann # Date 1515326361 -3600 # Node ID e9ed8e130ccf61b85a41f196b583ec0580a8c198 # Parent 9a75b6df33074189f9a86eff6fcbdd5eabe70bad adds support for macos file tags diff -r 9a75b6df3307 -r e9ed8e130ccf dav/Makefile --- a/dav/Makefile Mon Jan 01 19:54:37 2018 +0100 +++ b/dav/Makefile Sun Jan 07 12:59:21 2018 +0100 @@ -47,10 +47,10 @@ SYNC_SRC += libxattr.c SYNC_SRC += tags.c - DAV_OBJ = $(DAV_SRC:%.c=../build/tool/%$(OBJ_EXT)) SYNC_OBJ = $(SYNC_SRC:%.c=../build/tool/%$(OBJ_EXT)) + all: ../build/dav ../build/dav-sync ../build/dav: $(DAV_OBJ) ../build/libidav$(LIB_EXT) @@ -66,6 +66,7 @@ ../build/tool/%$(OBJ_EXT): %.c $(CC) $(CFLAGS) $(DAV_CFLAGS) -I../ -I../ucx -o $@ $< + cppcheck: $(DAV_SRC) $(SYNC_SRC) $(CPPCHECK) $(CPPCHECK_CONFIG) $(CPPCHECK_FLAGS) -I../ucx -I../ $+ 2>> ../$(CPPCHECK_LOG) diff -r 9a75b6df3307 -r e9ed8e130ccf dav/main.c --- a/dav/main.c Mon Jan 01 19:54:37 2018 +0100 +++ b/dav/main.c Sun Jan 07 12:59:21 2018 +0100 @@ -60,11 +60,12 @@ } //define DO_THE_TEST -#include -#include -#include "tags.h" +//include +//include +//include "tags.h" + void test() { - + } int main(int argc, char **argv) { diff -r 9a75b6df3307 -r e9ed8e130ccf dav/scfg.c --- a/dav/scfg.c Mon Jan 01 19:54:37 2018 +0100 +++ b/dav/scfg.c Sun Jan 07 12:59:21 2018 +0100 @@ -144,6 +144,8 @@ return TAG_FORMAT_CSV; } else if(!strcmp(str, "xml")) { return TAG_FORMAT_XML; + } else if(!strcmp(str, "macos")) { + return TAG_FORMAT_MACOS; } return TAG_FORMAT_UNKNOWN; } diff -r 9a75b6df3307 -r e9ed8e130ccf dav/scfg.h --- a/dav/scfg.h Mon Jan 01 19:54:37 2018 +0100 +++ b/dav/scfg.h Sun Jan 07 12:59:21 2018 +0100 @@ -67,6 +67,7 @@ TAG_FORMAT_TEXT = 0, TAG_FORMAT_CSV, TAG_FORMAT_XML, + TAG_FORMAT_MACOS, TAG_FORMAT_UNKNOWN }; typedef enum TagFormat TagFormat; diff -r 9a75b6df3307 -r e9ed8e130ccf dav/sync.c --- a/dav/sync.c Mon Jan 01 19:54:37 2018 +0100 +++ b/dav/sync.c Sun Jan 07 12:59:21 2018 +0100 @@ -1283,6 +1283,10 @@ data = create_csv_taglist(tags); break; } + case TAG_FORMAT_MACOS: { + data = create_macos_taglist(tags); + break; + } } if(data) { @@ -1321,6 +1325,10 @@ tags = parse_csv_taglist(tag_data, tag_length); break; } + case TAG_FORMAT_MACOS: { + tags = parse_macos_taglist(tag_data, tag_length); + break; + } } } } diff -r 9a75b6df3307 -r e9ed8e130ccf dav/tags.c --- a/dav/tags.c Mon Jan 01 19:54:37 2018 +0100 +++ b/dav/tags.c Sun Jan 07 12:59:21 2018 +0100 @@ -36,6 +36,10 @@ #include "tags.h" +#ifdef __APPLE__ +#include +#endif + UcxList* parse_text_taglist(const char *buf, size_t length) { UcxList *tags = NULL; @@ -175,3 +179,128 @@ } return tag1; } + + +#ifdef __APPLE__ +static DavTag* tagstr2davtag(const char *str) { + const char *name = str; + const char *color = NULL; + size_t len = strlen(str); + size_t namelen = len; + + if(len == 0) { + return NULL; + } + + // start with 1 because the first char should not be a linebreak + for(int i=1;iname = malloc(namelen + 1); + memcpy(tag->name, name, namelen); + tag->name[namelen] = 0; + if(colorlen > 0) { + tag->color = malloc(colorlen + 1); + memcpy(tag->color, color, colorlen); + tag->color[colorlen] = 0; + } else { + tag->color = NULL; + } + + return tag; +} + +UcxList* parse_macos_taglist(const char *buf, size_t length) { + UcxList *taglist = NULL; + + CFDataRef data = CFDataCreateWithBytesNoCopy( + kCFAllocatorDefault, + (const UInt8*)buf, + length, + kCFAllocatorNull); + CFPropertyListRef propertylist = CFPropertyListCreateWithData(kCFAllocatorDefault, data, 0, NULL, NULL); + CFArrayRef array = propertylist; + int count = CFArrayGetCount(array); + for(int i=0;idata; + CFStringRef str = NULL; + if(tag->color) { + sstr_t s = sstrcat(3, sstr(tag->name), S("\n"), sstr(tag->color)); + str = CFStringCreateWithCString(kCFAllocatorDefault, s.ptr, kCFStringEncodingUTF8); + free(s.ptr); + } else { + str = CFStringCreateWithCString(kCFAllocatorDefault, tag->name, kCFStringEncodingUTF8); + } + strings[i] = str; + i++; + } + + CFPropertyListRef array = CFArrayCreate(kCFAllocatorDefault, (const void**)strings, count, &kCFTypeArrayCallBacks); + CFDataRef data = CFPropertyListCreateData(kCFAllocatorDefault, array, kCFPropertyListBinaryFormat_v1_0, 0, NULL); + + UcxBuffer *buf = NULL; + if(data) { + int datalen = CFDataGetLength(data); + CFRange range; + range.location = 0; + range.length = datalen; + buf = ucx_buffer_new(NULL, datalen, 0); + CFDataGetBytes(data, range, (UInt8*)buf->space); + buf->size = datalen; + CFRelease(data); + } + + for(int i=0;i