From: Austin Ray Date: Sat, 6 Oct 2018 19:55:26 +0000 (-0400) Subject: notmuch: simplify uri creation logic X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e015d7e6c919908d369009f399e8b3a66f163a58;p=neomutt notmuch: simplify uri creation logic If `mdata` does not exist in `mailbox`, try to create a default instance of `NmMboxData`. Using a default instance removes two conditionals from `nm_uri_from_query(...)`, moving them to `nm_get_default_data(...)`. This reduces the number of `snprintf(...)` to maintain, and allows query parsing for type meta-data. An extra variable keeps track of default data usage for freeing allocated memory. --- diff --git a/notmuch/mutt_notmuch.c b/notmuch/mutt_notmuch.c index 5176f7f09..c24fea1d6 100644 --- a/notmuch/mutt_notmuch.c +++ b/notmuch/mutt_notmuch.c @@ -200,6 +200,22 @@ static void free_mboxdata(void **data) FREE(data); } +/** + * string_to_query_type - Lookup a query type + * @param str String to lookup + * @retval num Query type, e.g. #NM_QUERY_TYPE_MESGS + */ +static enum NmQueryType string_to_query_type(const char *str) +{ + if (mutt_str_strcmp(str, "threads") == 0) + return NM_QUERY_TYPE_THREADS; + else if (mutt_str_strcmp(str, "messages") == 0) + return NM_QUERY_TYPE_MESGS; + + mutt_error(_("failed to parse notmuch query type: %s"), NONULL(str)); + return NM_QUERY_TYPE_MESGS; +} + /** * new_mboxdata - Create a new NmMboxData object from a query * @param uri Notmuch query string @@ -217,6 +233,7 @@ static struct NmMboxData *new_mboxdata(const char *uri) mutt_debug(1, "nm: initialize mailbox mdata %p\n", (void *) mdata); mdata->db_limit = NmDbLimit; + mdata->query_type = string_to_query_type(NmQueryType); mdata->db_url_holder = mutt_str_strdup(uri); if (url_parse(&mdata->db_url, mdata->db_url_holder) < 0) @@ -228,6 +245,28 @@ static struct NmMboxData *new_mboxdata(const char *uri) return mdata; } +/** + * nm_get_default_data - Create a Mailbox with default Notmuch settings + * @retval ptr Mailbox with default Notmuch settings + * @retval NULL Error, it's impossible to create an NmMboxData + */ +struct NmMboxData *nm_get_default_data(void) +{ + // path to DB + query + URI "decoration" + char uri[PATH_MAX + LONG_STRING + 32]; + + // Try to use NmDefaultUri or Folder. + // If neither are set, it is impossible to create a Notmuch URI. + if (NmDefaultUri) + snprintf(uri, sizeof(uri), "%s", NmDefaultUri); + else if (Folder) + snprintf(uri, sizeof(uri), "notmuch://%s", Folder); + else + return NULL; + + return new_mboxdata(uri); +} + /** * get_mboxdata - Get the Notmuch data * @param mailbox Mailbox @@ -292,22 +331,6 @@ static char *email_get_fullpath(struct Email *e, char *buf, size_t buflen) return buf; } -/** - * string_to_query_type - Lookup a query type - * @param str String to lookup - * @retval num Query type, e.g. #NM_QUERY_TYPE_MESGS - */ -static enum NmQueryType string_to_query_type(const char *str) -{ - if (mutt_str_strcmp(str, "threads") == 0) - return NM_QUERY_TYPE_THREADS; - else if (mutt_str_strcmp(str, "messages") == 0) - return NM_QUERY_TYPE_MESGS; - - mutt_error(_("failed to parse notmuch query type: %s"), NONULL(str)); - return NM_QUERY_TYPE_MESGS; -} - /** * query_type_to_string - Turn a query type into a string * @param query_type Query type @@ -1899,6 +1922,14 @@ char *nm_uri_from_query(struct Mailbox *mailbox, char *buf, size_t buflen) struct NmMboxData *mdata = get_mboxdata(mailbox); char uri[PATH_MAX + LONG_STRING + 32]; /* path to DB + query + URI "decoration" */ int added; + bool using_default_data = false; + + // No existing data. Try to get a default NmMboxData. + if (!mdata) + { + mdata = nm_get_default_data(); + using_default_data = true; + } if (mdata) { @@ -1917,16 +1948,6 @@ char *nm_uri_from_query(struct Mailbox *mailbox, char *buf, size_t buflen) query_type_to_string(mdata->query_type)); } } - else if (NmDefaultUri) - { - added = snprintf(uri, sizeof(uri), "%s?type=%s&query=", NmDefaultUri, - query_type_to_string(string_to_query_type(NmQueryType))); - } - else if (Folder) - { - added = snprintf(uri, sizeof(uri), "notmuch://%s?type=%s&query=", Folder, - query_type_to_string(string_to_query_type(NmQueryType))); - } else return NULL; @@ -1941,6 +1962,9 @@ char *nm_uri_from_query(struct Mailbox *mailbox, char *buf, size_t buflen) mutt_str_strfcpy(buf, uri, buflen); buf[buflen - 1] = '\0'; + if (using_default_data) + free_mboxdata((void **) mdata); + mutt_debug(1, "nm: uri from query '%s'\n", buf); return buf; }