]> granicus.if.org Git - curl/commitdiff
imap: Enabled custom requests in imap_perform()
authorJiri Hruska <jirka@fud.cz>
Sun, 3 Mar 2013 10:21:29 +0000 (11:21 +0100)
committerSteve Holme <steve_holme@hotmail.com>
Sun, 3 Mar 2013 13:10:32 +0000 (13:10 +0000)
Modified imap_perform() to start with the custom command instead of
SELECT when a custom command is to be performed and no mailbox has
been given.

lib/imap.c

index 274513950189ec766716caf3ac717f6f8393d596..b9a4b9cfe6ce936891262817df0f2af03bd45376 100644 (file)
@@ -1794,8 +1794,8 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status,
  *
  * imap_perform()
  *
- * This is the actual DO function for IMAP. Fetch or append a message
- * according to the options previously setup.
+ * This is the actual DO function for IMAP. Fetch or append a message, or do
+ * other things according to the options previously setup.
  */
 static CURLcode imap_perform(struct connectdata *conn, bool *connected,
                              bool *dophase_done)
@@ -1805,6 +1805,7 @@ static CURLcode imap_perform(struct connectdata *conn, bool *connected,
   struct SessionHandle *data = conn->data;
   struct IMAP *imap = data->state.proto.imap;
   struct imap_conn *imapc = &conn->proto.imapc;
+  bool selected = FALSE;
 
   DEBUGF(infof(conn->data, "DO phase starts\n"));
 
@@ -1815,20 +1816,26 @@ static CURLcode imap_perform(struct connectdata *conn, bool *connected,
 
   *dophase_done = FALSE; /* not done yet */
 
+  /* Determine if the requested mailbox (with the same UIDVALIDITY if set)
+     has already been selected on this connection */
+  if(imap->mailbox && imapc->mailbox &&
+     !strcmp(imap->mailbox, imapc->mailbox) &&
+     (!imap->uidvalidity || !imapc->mailbox_uidvalidity ||
+      !strcmp(imap->uidvalidity, imapc->mailbox_uidvalidity)))
+    selected = TRUE;
+
   /* Start the first command in the DO phase */
   if(conn->data->set.upload)
     /* APPEND can be executed directly */
     result = imap_append(conn);
-    /* FETCH needs a selected mailbox */
-  else if(imap->mailbox && imapc->mailbox &&
-          !strcmp(imap->mailbox, imapc->mailbox) &&
-          (!imap->uidvalidity || !imapc->mailbox_uidvalidity ||
-           !strcmp(imap->uidvalidity, imapc->mailbox_uidvalidity))) {
-    /* This mailbox (with the same UIDVALIDITY if set) is already selected on
-       this connection so go straight to the next fetch operation */
+  else if(imap->custom && (selected || !imap->mailbox))
+    /* Custom command using the same mailbox or no mailbox */
+    result = imap_custom(conn);
+  else if(!imap->custom && selected)
+    /* FETCH from the same mailbox */
     result = imap_fetch(conn);
-  }
   else
+    /* SELECT the mailbox */
     result = imap_select(conn);
 
   if(result)