Rocco Rutte:
[apps/madmutt.git] / imap / command.c
index f76cff6..45d6ba3 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright notice from original mutt:
  * Copyright (C) 1996-8 Michael R. Elkins <me@mutt.org>
  * Copyright (C) 1996-9 Brandon Long <blong@fiction.net>
- * Copyright (C) 1999-2002 Brendan Cully <brendan@kublai.com>
+ * Copyright (C) 1999-2005 Brendan Cully <brendan@kublai.com>
  *
  * This file is part of mutt-ng, see http://www.muttng.org/.
  * It's licensed under the GNU General Public License,
 # include "config.h"
 #endif
 
-#include "mutt.h"
-#include "imap_private.h"
-#include "message.h"
-#include "mx.h"
-
 #include "lib/mem.h"
 #include "lib/intl.h"
 #include "lib/debug.h"
 
+#include "mutt.h"
+#include "message.h"
+#include "mx.h"
+#include "ascii.h"
+#include "imap_private.h"
+
 #include <ctype.h>
 #include <stdlib.h>
 
@@ -36,6 +37,7 @@ static int cmd_handle_untagged (IMAP_DATA * idata);
 static void cmd_make_sequence (IMAP_DATA * idata);
 static void cmd_parse_capabilities (IMAP_DATA * idata, char *s);
 static void cmd_parse_expunge (IMAP_DATA * idata, const char *s);
+static void cmd_parse_lsub (IMAP_DATA* idata, char* s);
 static void cmd_parse_fetch (IMAP_DATA * idata, char *s);
 static void cmd_parse_myrights (IMAP_DATA * idata, char *s);
 
@@ -347,6 +349,8 @@ static int cmd_handle_untagged (IMAP_DATA * idata)
   }
   else if (ascii_strncasecmp ("CAPABILITY", s, 10) == 0)
     cmd_parse_capabilities (idata, s);
+  else if (ascii_strncasecmp ("LSUB", s, 4) == 0)
+    cmd_parse_lsub (idata, s);
   else if (ascii_strncasecmp ("MYRIGHTS", s, 8) == 0)
     cmd_parse_myrights (idata, s);
   else if (ascii_strncasecmp ("BYE", s, 3) == 0) {
@@ -491,6 +495,60 @@ static void cmd_parse_fetch (IMAP_DATA * idata, char *s)
   }
 }
 
+static void cmd_parse_lsub (IMAP_DATA* idata, char* s) {
+  char buf[STRING];
+  char errstr[STRING];
+  BUFFER err, token;
+  ciss_url_t url;
+  char *ep;
+
+  if (!option (OPTIMAPCHECKSUBSCRIBED))
+    return;
+
+  s = imap_next_word (s); /* flags */
+
+  if (*s != '(') {
+    debug_print (1, ("Bad LSUB response\n"));
+    return;
+  }
+
+  s++;
+  ep = s;
+  for (ep = s; *ep && *ep != ')'; ep++);
+  do {
+    if (!ascii_strncasecmp (s, "\\NoSelect", 9))
+      return;
+    while (s < ep && *s != ' ' && *s != ')')
+      s++;
+    if (*s == ' ')
+      s++;
+  } while (s != ep);
+
+  s = imap_next_word (s); /* delim */
+  s = imap_next_word (s); /* name */
+
+  if (s) {
+    imap_unmunge_mbox_name (s);
+    debug_print (2, ("Subscribing to %s\n", s));
+
+    strfcpy (buf, "mailboxes \"", sizeof (buf));
+    mutt_account_tourl (&idata->conn->account, &url);
+    url.path = s;
+    if (!str_cmp (url.user, ImapUser))
+      url.user = NULL;
+    url_ciss_tostring (&url, buf + 11, sizeof (buf) - 10, 0);
+    str_cat (buf, sizeof (buf), "\"");
+    memset (&token, 0, sizeof (token));
+    err.data = errstr;
+    err.dsize = sizeof (errstr);
+    if (mutt_parse_rc_line (buf, &token, &err))
+      debug_print (1, ("Error adding subscribed mailbox: %s\n", errstr));
+    mem_free (&token.data);
+  }
+  else
+    debug_print (1, ("Bad LSUB response\n"));
+}
+
 /* cmd_parse_myrights: set rights bits according to MYRIGHTS response */
 static void cmd_parse_myrights (IMAP_DATA * idata, char *s)
 {