]> granicus.if.org Git - neomutt/commitdiff
notmuch: simplify uri creation logic 1241/head
authorAustin Ray <austin@austinray.io>
Sat, 6 Oct 2018 19:55:26 +0000 (15:55 -0400)
committerRichard Russon <rich@flatcap.org>
Mon, 8 Oct 2018 12:50:56 +0000 (13:50 +0100)
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.

notmuch/mutt_notmuch.c

index 5176f7f09869d50611a10062b3bc034ed211bf3d..c24fea1d601abc64c4597879bd6a036ec582d8c8 100644 (file)
@@ -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;
 }