--- a/dav/scfg.c Sun Feb 28 11:21:05 2016 +0100 +++ b/dav/scfg.c Sun Feb 28 13:39:59 2016 +0100 @@ -32,6 +32,7 @@ #include <errno.h> #include <libidav/utils.h> #include <ucx/map.h> +#include <ucx/utils.h> #include "scfg.h" @@ -45,12 +46,43 @@ static UcxMap *directories; +static int create_default_sync_config(char *file) { + FILE *out = fopen(file, "w"); + if(!out) { + perror("fopen"); + return -1; + } + + fputs("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n", out); + fputs("<configuration>\n", out); + fputs("</configuration>\n", out); + fclose(out); + + return 0; +} + int load_sync_config() { char *file = util_concat_path(ENV_HOME, ".dav/sync.xml"); + + struct stat s; + if(stat(file, &s)) { + switch(errno) { + case ENOENT: { + if(create_default_sync_config(file)) { + return -1; + } + break; + } + default: { + perror("Cannot load sync.xml"); + } + } + return 0; + } + xmlDoc *doc = xmlReadFile(file, NULL, 0); if(!doc) { - fprintf(stderr, "Missing or broken configuration file\n"); - scfg_print_example(); + fprintf(stderr, "Broken configuration file\n"); return -1; } @@ -200,30 +232,53 @@ return 0; } -void scfg_print_example() { - fprintf(stderr, - "example sync.xml\n\n" - "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" - "<configuration>\n" - " <directory>\n" - " <!-- identifier -->\n" - " <name>documents</name>\n\n" - " <!-- local path to the directory -->\n" - " <path>/home/user/Documents</path>\n\n" - " <!-- optional trash path -->\n" - " <trash>.trash</trash>" - " <!-- repository name specified in config.xml -->\n" - " <repository>server</repository>\n\n" - " <!-- collection to synchronize (optional) -->\n" - " <collection>somecol</collection>\n\n" - " <!-- database file name -->\n" - " <database>documents-db.xml</database>\n" - " </directory>\n" - "</configuration>\n"); +SyncDirectory* scfg_get_dir(char *name) { + return ucx_map_cstr_get(directories, name); } -SyncDirectory* scfg_get_dir(char *name) { - return ucx_map_cstr_get(directories, name); + +int add_directory(SyncDirectory *dir) { + char *file = util_concat_path(ENV_HOME, ".dav/sync.xml"); + xmlDoc *doc = xmlReadFile(file, NULL, 0); + if(!doc) { + free(file); + fprintf(stderr, "Cannot load config.xml\n"); + return 1; + } + + xmlNode *root = xmlDocGetRootElement(doc); + + xmlNode *dirNode = xmlNewNode(NULL, BAD_CAST "directory"); + xmlNodeAddContent(dirNode, BAD_CAST "\n\t\t"); + + xmlNewTextChild(dirNode, NULL, BAD_CAST "name", BAD_CAST dir->name); + xmlNodeAddContent(dirNode, BAD_CAST "\n\t\t"); + + xmlNewTextChild(dirNode, NULL, BAD_CAST "path", BAD_CAST dir->path); + xmlNodeAddContent(dirNode, BAD_CAST "\n\t\t"); + + xmlNewTextChild(dirNode, NULL, BAD_CAST "repository", BAD_CAST dir->repository); + xmlNodeAddContent(dirNode, BAD_CAST "\n\t\t"); + + if(dir->trash) { + xmlNewTextChild(dirNode, NULL, BAD_CAST "trash", BAD_CAST dir->trash); + xmlNodeAddContent(dirNode, BAD_CAST "\n\t\t"); + } + xmlNewTextChild(dirNode, NULL, BAD_CAST "database", BAD_CAST dir->database); + xmlNodeAddContent(dirNode, BAD_CAST "\n\t"); + + xmlNodeAddContent(root, BAD_CAST "\n\t"); + xmlAddChild(root, dirNode); + xmlNodeAddContent(root, BAD_CAST "\n"); + + int ret = 0; + if(xmlSaveFormatFileEnc(file, doc, "UTF-8", 1) == -1) { + ret = 1; + } + xmlFreeDoc(doc); + free(file); + + return ret; } int list_syncdirs() { @@ -234,3 +289,29 @@ } return 0; } + +char* generate_db_name(char *basename) { + char *dbname = NULL; + int count = -1; + while(!dbname) { + sstr_t name = count < 0 ? + ucx_sprintf("%s-db.xml", basename) : + ucx_sprintf("%s%d-db.xml", basename, count); + count++; + + UcxMapIterator i = ucx_map_iterator(directories); + SyncDirectory *dir; + bool unique = true; + UCX_MAP_FOREACH(key, dir, i) { + if(!sstrcmp(name, sstr(dir->database))) { + unique = false; + break; + } + } + if(unique) { + dbname = name.ptr; + break; + } + } + return dbname; +}