⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 browse.c

📁 mutt-1.5.12 源代码。linux 下邮件接受的工具。
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (C) 1996-9 Brandon Long <blong@fiction.net> * Copyright (C) 1999-2006 Brendan Cully <brendan@kublai.com> *  *     This program is free software; you can redistribute it and/or modify *     it under the terms of the GNU General Public License as published by *     the Free Software Foundation; either version 2 of the License, or *     (at your option) any later version. *  *     This program is distributed in the hope that it will be useful, *     but WITHOUT ANY WARRANTY; without even the implied warranty of *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *     GNU General Public License for more details. *  *     You should have received a copy of the GNU General Public License *     along with this program; if not, write to the Free Software *     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. */ /* Mutt browser support routines */#if HAVE_CONFIG_H# include "config.h"#endif#include <stdlib.h>#include <ctype.h>#include "mutt.h"#include "imap_private.h"/* -- forward declarations -- */static int browse_add_list_result (IMAP_DATA* idata, const char* cmd,  struct browser_state* state, short isparent);static void imap_add_folder (char delim, char *folder, int noselect,  int noinferiors, struct browser_state *state, short isparent);static int compare_names(struct folder_file *a, struct folder_file *b);static int browse_get_namespace (IMAP_DATA *idata, char *nsbuf, int nsblen,   IMAP_NAMESPACE_INFO *nsi, int nsilen, int *nns);static int browse_verify_namespace (IMAP_DATA* idata,  IMAP_NAMESPACE_INFO* nsi, int nns);/* imap_browse: IMAP hook into the folder browser, fills out browser_state, *   given a current folder to browse */int imap_browse (char* path, struct browser_state* state){  IMAP_DATA* idata;  IMAP_LIST list;  char buf[LONG_STRING];  char buf2[LONG_STRING];  char nsbuf[LONG_STRING];  char mbox[LONG_STRING];  char list_cmd[5];  IMAP_NAMESPACE_INFO nsi[16];  int home_namespace = 0;  int n;  int i;  int nsup;  char ctmp;  int nns = 0;  short showparents = 0;  int save_lsub;  IMAP_MBOX mx;  if (imap_parse_path (path, &mx))  {    mutt_error (_("%s is an invalid IMAP path"), path);    return -1;  }  save_lsub = option (OPTIMAPCHECKSUBSCRIBED);  unset_option (OPTIMAPCHECKSUBSCRIBED);  strfcpy (list_cmd, option (OPTIMAPLSUB) ? "LSUB" : "LIST", sizeof (list_cmd));  if (!(idata = imap_conn_find (&(mx.account), 0)))    goto fail;  if (!mx.mbox)  {    home_namespace = 1;    mbox[0] = '\0';		/* Do not replace "" with "INBOX" here */    mx.mbox = safe_strdup(ImapHomeNamespace);    if (mutt_bit_isset(idata->capabilities,NAMESPACE))    {      mutt_message _("Getting namespaces...");      if (browse_get_namespace (idata, nsbuf, sizeof (nsbuf), 			 nsi, sizeof (nsi),  &nns) != 0)	goto fail;      if (browse_verify_namespace (idata, nsi, nns) != 0)	goto fail;    }  }  mutt_message _("Getting folder list...");  /* skip check for parents when at the root */  if (mx.mbox && mx.mbox[0] != '\0')  {    int rc;    imap_fix_path (idata, mx.mbox, mbox, sizeof (mbox));    imap_munge_mbox_name (buf, sizeof (buf), mbox);    imap_unquote_string(buf); /* As kludgy as it gets */    mbox[sizeof (mbox) - 1] = '\0';    strncpy (mbox, buf, sizeof (mbox) - 1);    n = mutt_strlen (mbox);    dprint (3, (debugfile, "imap_browse: mbox: %s\n", mbox));    /* if our target exists and has inferiors, enter it if we     * aren't already going to */    if (mbox[n-1] != idata->delim)    {      snprintf (buf, sizeof (buf), "%s \"\" \"%s\"", list_cmd, mbox);      imap_cmd_start (idata, buf);      idata->cmddata = &list;      do      {	list.name = 0;        rc = imap_cmd_step (idata);        if (rc == IMAP_CMD_CONTINUE && list.name)        {          if (!list.noinferiors && list.name[0] &&              !imap_mxcmp (list.name, mbox) &&            (n = strlen (mbox)) < sizeof (mbox) - 1)          {            mbox[n++] = list.delim;            mbox[n] = '\0';          }        }      }      while (rc == IMAP_CMD_CONTINUE);      idata->cmddata = NULL;    }    /* if we're descending a folder, mark it as current in browser_state */    if (mbox[n-1] == list.delim)    {      /* don't show parents in the home namespace */      if (!home_namespace)	showparents = 1;      imap_qualify_path (buf, sizeof (buf), &mx, mbox);      state->folder = safe_strdup (buf);      n--;    }    /* Find superiors to list     * Note: UW-IMAP servers return folder + delimiter when asked to list     *  folder + delimiter. Cyrus servers don't. So we ask for folder,     *  and tack on delimiter ourselves.     * Further note: UW-IMAP servers return nothing when asked for      *  NAMESPACES without delimiters at the end. Argh! */    for (n--; n >= 0 && mbox[n] != list.delim ; n--);    if (n > 0)			/* "aaaa/bbbb/" -> "aaaa" */    {      /* forget the check, it is too delicate (see above). Have we ever       * had the parent not exist? */      ctmp = mbox[n];      mbox[n] = '\0';      if (showparents)      {	dprint (3, (debugfile, "imap_init_browse: adding parent %s\n", mbox));	imap_add_folder (list.delim, mbox, 1, 0, state, 1);      }      /* if our target isn't a folder, we are in our superior */      if (!state->folder)      {        /* store folder with delimiter */        mbox[n++] = ctmp;        ctmp = mbox[n];        mbox[n] = '\0';        imap_qualify_path (buf, sizeof (buf), &mx, mbox);        state->folder = safe_strdup (buf);      }      mbox[n] = ctmp;    }     /* "/bbbb/" -> add  "/", "aaaa/" -> add "" */    else    {      char relpath[2];      /* folder may be "/" */      snprintf (relpath, sizeof (relpath), "%c" , n < 0 ? '\0' : idata->delim);      if (showparents)        imap_add_folder (idata->delim, relpath, 1, 0, state, 1);       if (!state->folder)      {        imap_qualify_path (buf, sizeof (buf), &mx, relpath);        state->folder = safe_strdup (buf);      }    }  }  /* no namespace, no folder: set folder to host only */  if (!state->folder)  {    imap_qualify_path (buf, sizeof (buf), &mx, NULL);    state->folder = safe_strdup (buf);  }  if (home_namespace && mbox[0] != '\0')  {    /* Listing the home namespace, so INBOX should be included. Home      * namespace is not "", so we have to list it explicitly. We ask the      * server to see if it has descendants. */    dprint (3, (debugfile, "imap_browse: adding INBOX\n"));    if (browse_add_list_result (idata, "LIST \"\" \"INBOX\"", state, 0))      goto fail;  }  nsup = state->entrylen;  dprint (3, (debugfile, "imap_browse: Quoting mailbox scan: %s -> ", mbox));  snprintf (buf, sizeof (buf), "%s%%", mbox);  imap_quote_string (buf2, sizeof (buf2), buf);  dprint (3, (debugfile, "%s\n", buf2));  snprintf (buf, sizeof (buf), "%s \"\" %s", list_cmd, buf2);  if (browse_add_list_result (idata, buf, state, 0))    goto fail;  if (!state->entrylen)  {    mutt_error _("No such folder");    goto fail;  }  mutt_clear_error ();  qsort(&(state->entry[nsup]),state->entrylen-nsup,sizeof(state->entry[0]),	(int (*)(const void*,const void*)) compare_names);  if (home_namespace)  {				/* List additional namespaces */    for (i = 0; i < nns; i++)      if (nsi[i].listable && !nsi[i].home_namespace) {	imap_add_folder(nsi[i].delim, nsi[i].prefix, nsi[i].noselect,			nsi[i].noinferiors, state, 0);	dprint (3, (debugfile, "imap_browse: adding namespace: %s\n",		    nsi[i].prefix));      }  }  if (save_lsub)    set_option (OPTIMAPCHECKSUBSCRIBED);  FREE (&mx.mbox);  return 0; fail:  if (save_lsub)    set_option (OPTIMAPCHECKSUBSCRIBED);  FREE (&mx.mbox);  return -1;}/* imap_mailbox_create: Prompt for a new mailbox name, and try to create it */int imap_mailbox_create (const char* folder){  IMAP_DATA* idata;  IMAP_MBOX mx;  char buf[LONG_STRING];  short n;  if (imap_parse_path (folder, &mx) < 0)  {    dprint (1, (debugfile, "imap_mailbox_create: Bad starting path %s\n",      folder));    return -1;  }  if (!(idata = imap_conn_find (&mx.account, M_IMAP_CONN_NONEW)))  {    dprint (1, (debugfile, "imap_mailbox_create: Couldn't find open connection to %s", mx.account.host));    goto fail;  }    strfcpy (buf, NONULL (mx.mbox), sizeof (buf));  /* append a delimiter if necessary */  n = mutt_strlen (buf);  if (n && (n < sizeof (buf) - 1) && (buf[n-1] != idata->delim))  {    buf[n++] = idata->delim;    buf[n] = '\0';  }    if (mutt_get_field (_("Create mailbox: "), buf, sizeof (buf), M_FILE) < 0)    goto fail;  if (!mutt_strlen (buf))  {    mutt_error (_("Mailbox must have a name."));    mutt_sleep(1);    goto fail;  }    if (imap_create_mailbox (idata, buf) < 0)    goto fail;  mutt_message _("Mailbox created.");  mutt_sleep (0);  FREE (&mx.mbox);  return 0; fail:  FREE (&mx.mbox);  return -1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -