X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=lib%2Fconfig.cc;h=0fe9a26823c3dfa4e1cc9c4369b54c3ccf3ff2c0;hb=fd6f8e6c30e0443d1ead248047ab572120df85e9;hp=8bce7ba8f480fe1f70794c8d987569feca9d6834;hpb=e5f3c3ed50247323ecbd2a50e3b24a8352d17f8d;p=notmuch diff --git a/lib/config.cc b/lib/config.cc index 8bce7ba8..0fe9a268 100644 --- a/lib/config.cc +++ b/lib/config.cc @@ -31,6 +31,13 @@ struct _notmuch_config_list { char *current_val; }; +struct _notmuch_config_values { + const char *iterator; + size_t tok_len; +}; + +static const char * _notmuch_config_key_to_string (notmuch_config_key_t key); + static int _notmuch_config_list_destroy (notmuch_config_list_t *list) { @@ -246,12 +253,59 @@ _notmuch_config_load_from_database (notmuch_database_t *notmuch) return status; } +notmuch_config_values_t * +notmuch_config_get_values (notmuch_database_t *notmuch, notmuch_config_key_t key) +{ + notmuch_config_values_t *values; + + const char *str; + const char *key_str = _notmuch_config_key_to_string (key); + + if (! key_str) + return NULL; + + str = _notmuch_string_map_get (notmuch->config, key_str); + if (! str) + return NULL; + + values = talloc (notmuch, notmuch_config_values_t); + if (unlikely(! values)) + return NULL; + + values->iterator = strsplit_len (str, ';', &(values->tok_len)); + return values; +} + +notmuch_bool_t +notmuch_config_values_valid (notmuch_config_values_t *values) { + if (! values) + return false; + + return (values->iterator != NULL); +} + +const char * +notmuch_config_values_get (notmuch_config_values_t *values) { + return talloc_strndup (values, values->iterator, values->tok_len); +} + +void +notmuch_config_values_move_to_next (notmuch_config_values_t *values) { + values->iterator += values->tok_len; + values->iterator = strsplit_len (values->iterator, ';', &(values->tok_len)); +} + +void +notmuch_config_values_destroy (notmuch_config_values_t *values) { + talloc_free (values); +} + notmuch_status_t _notmuch_config_load_from_file (notmuch_database_t *notmuch, GKeyFile *file) { notmuch_status_t status = NOTMUCH_STATUS_SUCCESS; - gchar **groups,**keys, *val; + gchar **groups, **keys, *val; if (notmuch->config == NULL) notmuch->config = _notmuch_string_map_create (notmuch); @@ -279,3 +333,83 @@ _notmuch_config_load_from_file (notmuch_database_t *notmuch, DONE: return status; } + +static const char * +_notmuch_config_key_to_string (notmuch_config_key_t key) { + switch (key) { + case NOTMUCH_CONFIG_DATABASE_PATH: + return "database.path"; + case NOTMUCH_CONFIG_EXCLUDE_TAGS: + return "search.exclude_tags"; + case NOTMUCH_CONFIG_NEW_TAGS: + return "new.tags"; + case NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS: + return "maildir.synchronize_flags"; + case NOTMUCH_CONFIG_PRIMARY_EMAIL: + return "user.primary_email"; + case NOTMUCH_CONFIG_OTHER_EMAIL: + return "user.other_email"; + case NOTMUCH_CONFIG_USER_NAME: + return "user.name"; + default: + return NULL; + } +} + +static const char * +_notmuch_config_default (void *ctx, notmuch_config_key_t key) { + char *path; + + switch (key) { + case NOTMUCH_CONFIG_DATABASE_PATH: + path = getenv ("MAILDIR"); + if (path) + path = talloc_strdup (ctx, path); + else + path = talloc_asprintf (ctx, "%s/mail", + getenv ("HOME")); + return path; + case NOTMUCH_CONFIG_EXCLUDE_TAGS: + return ""; + case NOTMUCH_CONFIG_NEW_TAGS: + return "inbox;unread"; + case NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS: + return "true"; + case NOTMUCH_CONFIG_USER_NAME: + case NOTMUCH_CONFIG_PRIMARY_EMAIL: + case NOTMUCH_CONFIG_OTHER_EMAIL: + return NULL; + default: + case NOTMUCH_CONFIG_LAST: + INTERNAL_ERROR ("illegal key enum %d", key); + } +} + +notmuch_status_t +_notmuch_config_load_defaults (notmuch_database_t *notmuch) { + notmuch_config_key_t key; + for (key = NOTMUCH_CONFIG_FIRST; + key < NOTMUCH_CONFIG_LAST; + key = notmuch_config_key_t(key + 1)) { + const char *val = notmuch_config_get (notmuch, key); + const char *key_string = _notmuch_config_key_to_string (key); + + val = _notmuch_string_map_get (notmuch->config, key_string); + if (! val) { + _notmuch_string_map_set (notmuch->config, key_string, _notmuch_config_default (notmuch, key)); + } + } + return NOTMUCH_STATUS_SUCCESS; +} + +const char * +notmuch_config_get (notmuch_database_t *notmuch, notmuch_config_key_t key) { + + return _notmuch_string_map_get (notmuch->config, _notmuch_config_key_to_string (key)); +} + +notmuch_status_t +notmuch_config_set (notmuch_database_t *notmuch, notmuch_config_key_t key, const char *val) { + + return notmuch_database_set_config (notmuch, _notmuch_config_key_to_string (key), val); +}