]> granicus.if.org Git - neomutt/commitdiff
pop: refactor
authorRichard Russon <rich@flatcap.org>
Sat, 27 Oct 2018 17:15:20 +0000 (18:15 +0100)
committerRichard Russon <rich@flatcap.org>
Tue, 30 Oct 2018 23:55:16 +0000 (23:55 +0000)
mailbox.c
mbox/mbox.c
mx.c
mx.h
pop/pop.c
pop/pop_private.h

index 55ab2c3a578f81d6f6cb94472fc56caf8ee9127d..3c17d1031e0e9aa0321b12fbecfad70aa32a94c2 100644 (file)
--- a/mailbox.c
+++ b/mailbox.c
@@ -600,7 +600,7 @@ int mutt_parse_mailboxes(struct Buffer *buf, struct Buffer *s,
 
     if (!new_account)
     {
-      struct Mailbox *old_m = mx_mbox_find(a, m);
+      struct Mailbox *old_m = mx_mbox_find(a, m->realpath);
       if (old_m)
       {
         if (old_m->flags == MB_HIDDEN)
index 4f8359e0070093918e023df253a0b33a92272c08..06f45242f813752c9acbb56d6969c6bf904a65a8 100644 (file)
@@ -890,7 +890,17 @@ void mbox_reset_atime(struct Mailbox *m, struct stat *st)
  */
 struct Account *mbox_ac_find(struct Account *a, const char *path)
 {
-  return NULL;
+  if (!a || (a->magic != MUTT_MBOX) || !path)
+    return NULL;
+
+  struct MailboxNode *np = STAILQ_FIRST(&a->mailboxes);
+  if (!np)
+    return NULL;
+
+  if (mutt_str_strcmp(np->m->path, path) != 0)
+    return NULL;
+
+  return a;
 }
 
 /**
diff --git a/mx.c b/mx.c
index d01c5d1c1a4306f00cb08449d96fea93f323264c..ee8faed29698881238e18083e7e153b3a82da451 100644 (file)
--- a/mx.c
+++ b/mx.c
@@ -252,6 +252,8 @@ struct Context *mx_mbox_open(struct Mailbox *m, const char *path, int flags)
   {
     ctx->mailbox = mailbox_new();
     ctx->mailbox->flags = MB_HIDDEN;
+    mutt_str_strfcpy(ctx->mailbox->path, path, sizeof(ctx->mailbox->path));
+    /* int rc = */ mx_path_canon2(ctx->mailbox, Folder);
   }
 
 #if 0
@@ -289,8 +291,8 @@ struct Context *mx_mbox_open(struct Mailbox *m, const char *path, int flags)
   ctx->mailbox->magic = mx_path_probe(path, NULL);
   ctx->mailbox->mx_ops = mx_get_ops(ctx->mailbox->magic);
 
-  if (ctx->mailbox->path[0] == '\0')
-    mutt_str_strfcpy(ctx->mailbox->path, path, sizeof(ctx->mailbox->path));
+  // if (ctx->mailbox->path[0] == '\0')
+  //   mutt_str_strfcpy(ctx->mailbox->path, path, sizeof(ctx->mailbox->path));
 
   if ((ctx->mailbox->magic == MUTT_UNKNOWN) ||
       (ctx->mailbox->magic == MUTT_MAILBOX_ERROR) || !ctx->mailbox->mx_ops)
@@ -1611,15 +1613,15 @@ struct Account *mx_ac_find(struct Mailbox *m)
  *
  * find a mailbox on an account
  */
-struct Mailbox *mx_mbox_find(struct Account *a, struct Mailbox *m)
+struct Mailbox *mx_mbox_find(struct Account *a, const char *path)
 {
-  if (!a || !m)
+  if (!a || !path)
     return NULL;
 
   struct MailboxNode *np = NULL;
   STAILQ_FOREACH(np, &a->mailboxes, entries)
   {
-    if (mutt_str_strcmp(np->m->realpath, m->realpath) == 0)
+    if (mutt_str_strcmp(np->m->realpath, path) == 0)
       return np->m;
   }
 
@@ -1640,11 +1642,12 @@ struct Mailbox *mx_mbox_find2(const char *path)
   mutt_str_strfcpy(buf, path, sizeof(buf));
   mx_path_canon(buf, sizeof(buf), Folder, NULL);
 
-  struct MailboxNode *np = NULL;
-  STAILQ_FOREACH(np, &AllMailboxes, entries)
+  struct Account *np = NULL;
+  TAILQ_FOREACH(np, &AllAccounts, entries)
   {
-    if (mutt_str_strcmp(np->m->realpath, buf) == 0)
-      return np->m;
+    struct Mailbox *m = mx_mbox_find(np, buf);
+    if (m)
+      return m;
   }
 
   return NULL;
diff --git a/mx.h b/mx.h
index 1d8d10601a1c00c6c75811195403f88a7f7c1e02..a4977ee55b48c8daf9a21af963b488b91c929239 100644 (file)
--- a/mx.h
+++ b/mx.h
@@ -270,7 +270,7 @@ int             mx_tags_commit     (struct Context *ctx, struct Email *e, char *
 int             mx_tags_edit       (struct Context *ctx, const char *tags, char *buf, size_t buflen);
 
 struct Account *mx_ac_find(struct Mailbox *m);
-struct Mailbox *mx_mbox_find(struct Account *a, struct Mailbox *m);
+struct Mailbox *mx_mbox_find(struct Account *a, const char *path);
 struct Mailbox *mx_mbox_find2(const char *path);
 int mx_ac_add(struct Account *a, struct Mailbox *m);
 int mx_ac_remove(struct Account *a, struct Mailbox *m);
index 8a4b6fb2363e3172330047f0fd00d6b9cf5e22fa..19dc8d9c06808393628c80ab7d0729e241d1a1b3 100644 (file)
--- a/pop/pop.c
+++ b/pop/pop.c
@@ -48,6 +48,7 @@
 #include "bcache.h"
 #include "context.h"
 #include "globals.h"
+#include "hook.h"
 #include "mailbox.h"
 #include "mutt_account.h"
 #include "mutt_header.h"
@@ -746,7 +747,27 @@ fail:
  */
 struct Account *pop_ac_find(struct Account *a, const char *path)
 {
-  return NULL;
+  if (!a || (a->magic != MUTT_POP) || !path)
+    return NULL;
+
+  struct Url url;
+  char tmp[PATH_MAX];
+  mutt_str_strfcpy(tmp, path, sizeof(tmp));
+  url_parse(&url, tmp);
+
+  struct PopAccountData *adata = a->adata;
+  struct ConnAccount *ac = &adata->conn_account;
+
+  if (mutt_str_strcasecmp(url.host, ac->host) != 0)
+    return NULL;
+
+  if (mutt_str_strcasecmp(url.user, ac->user) != 0)
+    return NULL;
+
+  // if (mutt_str_strcmp(path, a->mailbox->realpath) == 0)
+  //   return a;
+
+  return a;
 }
 
 /**
@@ -760,6 +781,33 @@ int pop_ac_add(struct Account *a, struct Mailbox *m)
   if (m->magic != MUTT_POP)
     return -1;
 
+  if (!a->adata)
+  {
+    struct PopAccountData *adata = pop_adata_new();
+    a->magic = MUTT_POP;
+    a->adata = adata;
+    a->free_adata = pop_adata_free;
+
+    struct Url url;
+    char tmp[PATH_MAX];
+    mutt_str_strfcpy(tmp, m->path, sizeof(tmp));
+    url_parse(&url, tmp);
+
+    mutt_str_strfcpy(adata->conn_account.user, url.user,
+                     sizeof(adata->conn_account.user));
+    mutt_str_strfcpy(adata->conn_account.pass, url.pass,
+                     sizeof(adata->conn_account.pass));
+    mutt_str_strfcpy(adata->conn_account.host, url.host,
+                     sizeof(adata->conn_account.host));
+    adata->conn_account.port = url.port;
+    adata->conn_account.type = MUTT_ACCT_TYPE_POP;
+
+    if (adata->conn_account.user[0] != '\0')
+      adata->conn_account.flags |= MUTT_ACCT_USER;
+    if (adata->conn_account.pass[0] != '\0')
+      adata->conn_account.flags |= MUTT_ACCT_PASS;
+  }
+
   m->account = a;
 
   struct MailboxNode *np = mutt_mem_calloc(1, sizeof(*np));
@@ -776,7 +824,6 @@ int pop_ac_add(struct Account *a, struct Mailbox *m)
 static int pop_mbox_open(struct Context *ctx)
 {
   char buf[PATH_MAX];
-  struct Connection *conn = NULL;
   struct ConnAccount acct;
   struct Url url;
 
@@ -789,14 +836,16 @@ static int pop_mbox_open(struct Context *ctx)
   mutt_account_tourl(&acct, &url);
   url.path = NULL;
   url_tostring(&url, buf, sizeof(buf), 0);
-  conn = mutt_conn_find(NULL, &acct);
-  if (!conn)
-    return -1;
 
   mutt_str_strfcpy(ctx->mailbox->path, buf, sizeof(ctx->mailbox->path));
   mutt_str_strfcpy(ctx->mailbox->realpath, ctx->mailbox->path,
                    sizeof(ctx->mailbox->realpath));
 
+  mutt_account_hook(ctx->mailbox->realpath);
+  struct Connection *conn = mutt_conn_new(&acct);
+  if (!conn)
+    return -1;
+
   struct PopAccountData *adata = pop_adata_new();
   adata->conn = conn;
 
@@ -806,7 +855,6 @@ static int pop_mbox_open(struct Context *ctx)
   if (pop_open_connection(adata) < 0)
     return -1;
 
-  conn->data = adata;
   adata->bcache = mutt_bcache_open(&acct, NULL);
 
   /* init (hard-coded) ACL rights */
index b2381295e58f93b6b0536c76cc825c92ca33399f..1faaa4b21f14c11ac193b707ca5f442bcd957ecf 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <stdbool.h>
 #include <time.h>
+#include "conn/conn.h"
 
 struct ConnAccount;
 struct Context;
@@ -78,6 +79,7 @@ struct PopCache
 struct PopAccountData
 {
   struct Connection *conn;
+  struct ConnAccount conn_account;
   unsigned int status : 2;
   bool capabilities : 1;
   unsigned int use_stls : 2;