Further pop_mx_ng work
[apps/madmutt.git] / lib-mx / pop.c
index 8f522c7..a7c2bed 100644 (file)
@@ -7,7 +7,6 @@
  * please see the file GPL in the top level source directory.
  */
 
-#include <lib-lib/lib-lib.h>
 
 #include <sasl/sasl.h>
 #include <sasl/saslutil.h>
@@ -1179,7 +1178,111 @@ static int pop_sync_mailbox(CONTEXT * ctx, int unused, int *index_hint)
   }
 }
 
-static int pop_fetch_message (MESSAGE * msg, CONTEXT * ctx, int msgno);
+/* fetch message from POP server */
+static int pop_fetch_message (MESSAGE * msg, CONTEXT * ctx, int msgno)
+{
+  int ret;
+  void *uidl;
+  char buf[LONG_STRING];
+  char path[_POSIX_PATH_MAX];
+  progress_t bar;
+  pop_data_t *pop_data = (pop_data_t *) ctx->data;
+  POP_CACHE *cache;
+  HEADER *h = ctx->hdrs[msgno];
+
+  /* see if we already have the message in our cache */
+  cache = &pop_data->cache[h->index % POP_CACHE_LEN];
+
+  if (cache->path) {
+    if (cache->index == h->index) {
+      /* yes, so just return a pointer to the message */
+      msg->fp = fopen (cache->path, "r");
+      if (msg->fp)
+        return 0;
+
+      mutt_perror (cache->path);
+      mutt_sleep (2);
+      return -1;
+    }
+    else {
+      /* clear the previous entry */
+      unlink (cache->path);
+      p_delete(&cache->path);
+    }
+  }
+
+  for (;;) {
+    if (pop_reconnect (ctx) != PQ_OK)
+      return -1;
+
+    /* verify that massage index is correct */
+    if (h->refno < 0) {
+      mutt_error
+        _("The message index is incorrect. Try reopening the mailbox.");
+      mutt_sleep (2);
+      return -1;
+    }
+
+    bar.size = h->content->length + h->content->offset - 1;
+    bar.msg = _("Fetching message...");
+    mutt_progress_bar (&bar, 0);
+
+    msg->fp = m_tempfile(path, sizeof(path), NONULL(mod_core.tmpdir), NULL);
+    if (!msg->fp) {
+      mutt_error(_("Could not create temporary file"));
+      mutt_sleep(2);
+      return -1;
+    }
+
+    snprintf(buf, sizeof(buf), "RETR %d\r\n", h->refno);
+    ret = pop_fetch_data(pop_data, buf, &bar, fetch_message, msg->fp);
+    if (ret == PQ_OK)
+      break;
+
+    m_fclose(&msg->fp);
+    unlink (path);
+
+    if (ret == PQ_ERR) {
+      mutt_error ("%s", pop_data->err_msg);
+      mutt_sleep (2);
+      return -1;
+    }
+
+    if (ret == PFD_FUNCT_ERROR) {
+      mutt_error _("Can't write message to temporary file!");
+
+      mutt_sleep (2);
+      return -1;
+    }
+  }
+
+  /* Update the header information.  Previously, we only downloaded a
+   * portion of the headers, those required for the main display.
+   */
+  cache->index = h->index;
+  cache->path = m_strdup(path);
+  rewind (msg->fp);
+  uidl = h->data;
+  envelope_delete(&h->env);
+  h->env = mutt_read_rfc822_header (msg->fp, h, 0, 0);
+  h->data = uidl;
+  h->lines = 0;
+  fgets (buf, sizeof (buf), msg->fp);
+  while (!feof (msg->fp)) {
+    ctx->hdrs[msgno]->lines++;
+    fgets (buf, sizeof (buf), msg->fp);
+  }
+
+  h->content->length = ftello (msg->fp) - h->content->offset;
+
+  /* This needs to be done in case this is a multipart message */
+  h->security = crypt_query (h->content);
+
+  mutt_clear_error ();
+  rewind (msg->fp);
+
+  return 0;
+}
 
 /* }}} */
 
@@ -1349,110 +1452,4 @@ fail:
   p_delete(&pop_data);
 }
 
-/* fetch message from POP server */
-static int pop_fetch_message (MESSAGE * msg, CONTEXT * ctx, int msgno)
-{
-  int ret;
-  void *uidl;
-  char buf[LONG_STRING];
-  char path[_POSIX_PATH_MAX];
-  progress_t bar;
-  pop_data_t *pop_data = (pop_data_t *) ctx->data;
-  POP_CACHE *cache;
-  HEADER *h = ctx->hdrs[msgno];
-
-  /* see if we already have the message in our cache */
-  cache = &pop_data->cache[h->index % POP_CACHE_LEN];
-
-  if (cache->path) {
-    if (cache->index == h->index) {
-      /* yes, so just return a pointer to the message */
-      msg->fp = fopen (cache->path, "r");
-      if (msg->fp)
-        return 0;
-
-      mutt_perror (cache->path);
-      mutt_sleep (2);
-      return -1;
-    }
-    else {
-      /* clear the previous entry */
-      unlink (cache->path);
-      p_delete(&cache->path);
-    }
-  }
-
-  for (;;) {
-    if (pop_reconnect (ctx) != PQ_OK)
-      return -1;
-
-    /* verify that massage index is correct */
-    if (h->refno < 0) {
-      mutt_error
-        _("The message index is incorrect. Try reopening the mailbox.");
-      mutt_sleep (2);
-      return -1;
-    }
-
-    bar.size = h->content->length + h->content->offset - 1;
-    bar.msg = _("Fetching message...");
-    mutt_progress_bar (&bar, 0);
-
-    msg->fp = m_tempfile(path, sizeof(path), NONULL(mod_core.tmpdir), NULL);
-    if (!msg->fp) {
-      mutt_error(_("Could not create temporary file"));
-      mutt_sleep(2);
-      return -1;
-    }
-
-    snprintf(buf, sizeof(buf), "RETR %d\r\n", h->refno);
-    ret = pop_fetch_data(pop_data, buf, &bar, fetch_message, msg->fp);
-    if (ret == PQ_OK)
-      break;
-
-    m_fclose(&msg->fp);
-    unlink (path);
-
-    if (ret == PQ_ERR) {
-      mutt_error ("%s", pop_data->err_msg);
-      mutt_sleep (2);
-      return -1;
-    }
-
-    if (ret == PFD_FUNCT_ERROR) {
-      mutt_error _("Can't write message to temporary file!");
-
-      mutt_sleep (2);
-      return -1;
-    }
-  }
-
-  /* Update the header information.  Previously, we only downloaded a
-   * portion of the headers, those required for the main display.
-   */
-  cache->index = h->index;
-  cache->path = m_strdup(path);
-  rewind (msg->fp);
-  uidl = h->data;
-  envelope_delete(&h->env);
-  h->env = mutt_read_rfc822_header (msg->fp, h, 0, 0);
-  h->data = uidl;
-  h->lines = 0;
-  fgets (buf, sizeof (buf), msg->fp);
-  while (!feof (msg->fp)) {
-    ctx->hdrs[msgno]->lines++;
-    fgets (buf, sizeof (buf), msg->fp);
-  }
-
-  h->content->length = ftello (msg->fp) - h->content->offset;
-
-  /* This needs to be done in case this is a multipart message */
-  h->security = crypt_query (h->content);
-
-  mutt_clear_error ();
-  rewind (msg->fp);
-
-  return 0;
-}
-
 /* }}} */