]> granicus.if.org Git - neomutt/commitdiff
imap: setup a mdata struct for each mailboxes
authorMehdi Abaakouk <sileht@sileht.net>
Tue, 13 Nov 2018 14:47:00 +0000 (15:47 +0100)
committerRichard Russon <rich@flatcap.org>
Thu, 15 Nov 2018 00:26:28 +0000 (00:26 +0000)
This change introduces `struct ImapMailboxeData` to mainly store
the mbox name in all its form.

Next change will use this names instead of parsing again and again the
path.

At this end we should be able to drop ImapMbox and imap_parse_path().

imap/imap.c
imap/imap_private.h
imap/util.c

index 1dc7942a2680ca2ae314bd4fdb22c82067307ca4..c32d00479fca5a58dee5dde4f58aab0e2a2efeeb 100644 (file)
@@ -2115,26 +2115,43 @@ int imap_ac_add(struct Account *a, struct Mailbox *m)
   if (m->magic != MUTT_IMAP)
     return -1;
 
+  // NOTE(sileht): The goal is to use ImapMbox and imap_parse_path() only here
+  // So we can remove it at this end.
+  struct ImapMbox mx;
+
+  if (imap_parse_path(m->path, &mx) < 0)
+    return -1;
+
   // if (a->type == MUTT_UNKNOWN)
   if (!a->adata)
   {
     struct ImapAccountData *adata = imap_adata_new();
-    struct ImapMbox mx;
     a->magic = MUTT_IMAP;
     a->adata = adata;
     a->free_adata = imap_adata_free;
-
-    if (imap_parse_path(m->path, &mx) < 0)
-      return -1;
-    FREE(&mx.mbox);
     adata->conn_account = mx.account;
     adata->conn = mutt_conn_new(&adata->conn_account);
     if (!adata->conn)
+    {
+      FREE(&mx.mbox);
       return -1;
+    }
   }
 
   m->account = a;
 
+  if (!m->mdata)
+  {
+    struct ImapMailboxData *mdata = imap_mdata_new(a->adata, mx.mbox);
+    if (!mdata)
+    {
+      FREE(&mx.mbox);
+      return -1;
+    }
+    m->mdata = mdata;
+    m->free_mdata = imap_mdata_free;
+  }
+
   struct MailboxNode *np = mutt_mem_calloc(1, sizeof(*np));
   np->m = m;
   STAILQ_INSERT_TAIL(&a->mailboxes, np, entries);
index 4b939c593a9571b3b4fb2fc2a592e8fad5c5aa69..0b70803c4feeda32aefdde082d7b87942c3dfc02 100644 (file)
@@ -274,6 +274,18 @@ struct ImapAccountData
 #endif
 };
 
+/**
+ * struct ImapMailboxData - IMAP-specific Mailbox data
+ *
+ * This data is specific to a Mailbox of an IMAP server
+ */
+struct ImapMailboxData
+{
+  char *name;
+  char *munge_name;
+  char *real_name;
+};
+
 /**
  * struct SeqsetIterator - UID Sequence Set Iterator
  */
@@ -350,6 +362,8 @@ int imap_continue(const char *msg, const char *resp);
 void imap_error(const char *where, const char *msg);
 struct ImapAccountData *imap_adata_new(void);
 void imap_adata_free(void **ptr);
+struct ImapMailboxData *imap_mdata_new(struct ImapAccountData *adata, const char* name);
+void imap_mdata_free(void **ptr);
 char *imap_fix_path(struct ImapAccountData *adata, const char *mailbox, char *path, size_t plen);
 void imap_cachepath(struct ImapAccountData *adata, const char *mailbox, char *dest, size_t dlen);
 int imap_get_literal_count(const char *buf, unsigned int *bytes);
index 8a8c9062a470f2f8d410fd9c0334e99b92c090d8..6a66e317cec37f1109508612e2d57ddc4edc741e 100644 (file)
@@ -118,12 +118,9 @@ struct ImapAccountData *imap_adata_new(void)
  */
 struct ImapAccountData *imap_adata_get(struct Mailbox *m)
 {
-  if (!m || (m->magic != MUTT_IMAP))
+  if (!m || (m->magic != MUTT_IMAP) || !m->account)
     return NULL;
-  struct Account *a = m->account;
-  if (!a)
-    return NULL;
-  return a->adata;
+  return m->account->adata;
 }
 
 /**
@@ -149,6 +146,55 @@ struct ImapAccountData *imap_adata_find(const char *path, struct ImapMbox *mx)
   return NULL;
 }
 
+/**
+ * imap_mdata_new - Allocate and initialise a new ImapMailboxData structure
+ * @retval ptr New ImapMailboxData
+ */
+struct ImapMailboxData *imap_mdata_new(struct ImapAccountData *adata, const char *name)
+{
+  char buf[LONG_STRING];
+  struct ImapMailboxData *mdata = mutt_mem_calloc(1, sizeof(struct ImapMailboxData));
+
+  mdata->real_name = mutt_str_strdup(name);
+
+  imap_fix_path(adata, name, buf, sizeof(buf));
+  if (!*buf)
+    mutt_str_strfcpy(buf, "INBOX", sizeof(buf));
+  mdata->name = mutt_str_strdup(buf);
+
+  imap_munge_mbox_name(adata, buf, sizeof(buf), mdata->name);
+  mdata->munge_name = mutt_str_strdup(buf);
+
+  return mdata;
+}
+
+/**
+ * imap_mdata_free - Release and clear storage in an ImapMailboxData structure
+ * @param ptr Imap Mailbox data
+ */
+void imap_mdata_free(void **ptr)
+{
+  if (!ptr || !*ptr)
+    return;
+
+  struct ImapMailboxData *mdata = *ptr;
+
+  FREE(&mdata->name);
+  FREE(&mdata->real_name);
+  FREE(&mdata->munge_name);
+  FREE(ptr);
+}
+
+/**
+ * imap_mdata_get - Get the Mailbox data for this mailbox
+ */
+struct ImapMailboxData *imap_mdata_get(struct Mailbox *m)
+{
+  if (!m || (m->magic != MUTT_IMAP) || !m->mdata)
+    return NULL;
+  return m->mdata;
+}
+
 /**
  * imap_get_parent - Get an IMAP folder's parent
  * @param mbox   Mailbox whose parent is to be determined