summaryrefslogtreecommitdiffstats
path: root/libmail/mailtool.C
diff options
context:
space:
mode:
Diffstat (limited to 'libmail/mailtool.C')
-rw-r--r--libmail/mailtool.C1340
1 files changed, 0 insertions, 1340 deletions
diff --git a/libmail/mailtool.C b/libmail/mailtool.C
deleted file mode 100644
index b060507..0000000
--- a/libmail/mailtool.C
+++ /dev/null
@@ -1,1340 +0,0 @@
-/*
-** Copyright 2002-2008, Double Precision Inc.
-**
-** See COPYING for distribution information.
-*/
-#include "libmail_config.h"
-#include "mail.H"
-#include "misc.H"
-#include "logininfo.H"
-#include "sync.H"
-#include "envelope.H"
-#include "structure.H"
-#include "maildir.H"
-#include "rfcaddr.H"
-#include "addmessage.H"
-#include "smtpinfo.H"
-#include "rfc822/rfc822.h"
-#include <cstring>
-
-#if HAVE_TERMIOS_H
-#include <termios.h>
-#endif
-
-#include <iostream>
-#include <iomanip>
-#include <algorithm>
-#include <stdlib.h>
-#include <stdio.h>
-#include <ctype.h>
-
-#include <sstream>
-#include <errno.h>
-
-using namespace std;
-
-static void error(string errmsg)
-{
- cerr << "ERROR: " << errmsg << endl;
- exit (1);
-}
-
-static void error(mail::ACCOUNT *p)
-{
- error(p->errmsg);
-}
-
-extern "C" void rfc2045_error(const char *p)
-{
- cerr << "ERROR: " << p << endl;
- exit (0);
-}
-
-static void showenvelope(const mail::envelope &env, string pfix="")
-{
- if (env.date > 0)
- {
- char buffer[200];
-
- rfc822_mkdate_buf(env.date, buffer);
- cout << pfix << " Date: " << buffer
- << endl;
- }
-
- cout << pfix << " Subject: " << env.subject << endl;
- cout << pfix << "In-ReplyTo: " << env.inreplyto
- << endl;
-
- vector<string>::const_iterator b=env.references.begin(),
- e=env.references.end();
-
- while (b != e)
- {
- cout << pfix << " Reference: <" << *b << ">" << endl;
- b++;
- }
-
- cout << pfix << "Message-ID: " << env.messageid
- << endl;
- cout << pfix << mail::address::toString(" From: ",
- env.from)
- << endl;
- cout << pfix << mail::address::toString(" Sender: ",
- env.sender)
- << endl;
- cout << pfix << mail::address::toString(" Reply-To: ",
- env.replyto)
- << endl;
- cout << pfix << mail::address::toString(" To: ",
- env.to)
- << endl;
- cout << pfix << mail::address::toString(" Cc: ",
- env.cc)
- << endl;
- cout << pfix << mail::address::toString(" Bcc: ",
- env.bcc)
- << endl;
-}
-
-static void showstructure(const mail::mimestruct &mps, string pfix="")
-{
- cout << pfix << " Mime-ID: " << mps.mime_id << endl;
- cout << pfix << " Content-Type: " << mps.type << "/"
- << mps.subtype << endl;
-
- mail::mimestruct::parameterList::const_iterator b, e;
-
- b=mps.type_parameters.begin();
- e=mps.type_parameters.end();
-
- while (b != e)
- {
- cout << pfix << " "
- << b->first << "=" << b->second << endl;
- b++;
- }
-
- cout << pfix << " Content-Id: " << mps.content_id << endl;
- cout << pfix << " Content-Description: " << mps.content_description
- << endl;
- cout << pfix << "Content-Transfer-Encoding: "
- << mps.content_transfer_encoding << endl;
- cout << pfix << " Size: " << mps.content_size
- << endl;
- cout << pfix << " Lines: " << mps.content_lines
- << endl;
- cout << pfix << " Content-MD5: " << mps.content_md5
- << endl;
- cout << pfix << " Content-Language: " << mps.content_language
- << endl;
- cout << pfix << " Content-Disposition: "
- << mps.content_disposition << endl;
-
- b=mps.content_disposition_parameters.begin();
- e=mps.content_disposition_parameters.end();
-
- while (b != e)
- {
- cout << pfix << " "
- << b->first << "=" << b->second << endl;
- b++;
- }
-
- if (mps.messagerfc822())
- {
- showenvelope(mps.getEnvelope(), pfix + " ");
- }
-
- size_t n=mps.getNumChildren();
- size_t i;
-
- for (i=0; i<n; i++)
- {
- cout << pfix
- << "---------------------------------------------------"
- << endl;
- showstructure(*mps.getChild(i), pfix + " ");
- }
-}
-
-static void showFolderList(mail::ACCOUNT *p,
- mail::ACCOUNT::FolderList &list, int nestinglevel,
- bool tree)
-{
- vector<const mail::folder *> cpy;
-
- cpy.insert(cpy.end(), list.begin(), list.end());
-
- sort(cpy.begin(), cpy.end(), mail::folder::sort(false));
-
- vector<const mail::folder *>::iterator
- b=cpy.begin(), e=cpy.end();
-
- bool extraSpace=false;
-
- while (b != e)
- {
- const mail::folder *f= *b++;
-
- if (extraSpace)
- cout << endl;
-
- extraSpace=false;
-
- if (tree)
- {
- mail::ACCOUNT::FolderInfo info;
-
- if (f->hasMessages())
- p->readFolderInfo(f, info);
-
- cout << setw(nestinglevel * 4 + 1) << " " << setw(0)
- << f->getName();
-
- if (info.unreadCount || info.messageCount)
- {
- cout << " (";
- if (info.messageCount)
- {
- cout << info.messageCount << " messages";
- if (info.unreadCount)
- cout << ", ";
- }
-
- if (info.unreadCount)
- cout << info.unreadCount << " unread";
- cout << ")";
- }
-
- cout << endl;
- }
- else
- {
- cout << f->getPath() << endl;
- }
-
- if (f->hasSubFolders() || !f->hasMessages())
- {
- mail::ACCOUNT::FolderList subfolders;
-
- if (p->getSubFolders(f, subfolders))
- {
- showFolderList(p, subfolders, nestinglevel+1,
- tree);
- extraSpace=tree;
- }
- else if (f->hasSubFolders())
- {
- error(p);
- }
- }
- }
-}
-
-static void showEnvelope(mail::xenvelope &env)
-{
- char date[100];
-
- if (env.arrivalDate)
- {
- rfc822_mkdate_buf(env.arrivalDate, date);
-
- cout << " Arrival-Date: " << date << endl;
- }
-
- cout << " Size: " << env.messageSize << endl;
-
- if (env.date)
- {
- rfc822_mkdate_buf(env.date, date);
-
- cout << " Date: " << date << endl;
- }
-
- cout << " Subject: " << env.subject << endl;
- cout << " Message-Id: " << env.messageid << endl;
- if (env.inreplyto.size() > 0)
- cout << " In-Reply-To: " << env.inreplyto << endl;
-
- vector<string>::const_iterator b=env.references.begin(),
- e=env.references.end();
-
- while (b != e)
- {
- cout << " Reference: <" << *b << ">" << endl;
- b++;
- }
-
- if (env.from.size() > 0)
- cout << mail::address::toString(" From: ", env.from)
- << endl;
-
- if (env.sender.size() > 0)
- cout << mail::address::toString(" Sender: ", env.sender)
- << endl;
-
- if (env.replyto.size() > 0)
- cout << mail::address::toString(" Reply-To: ",
- env.replyto)<< endl;
- if (env.to.size() > 0)
- cout << mail::address::toString(" To: ", env.to)
- << endl;
-
- if (env.cc.size() > 0)
- cout << mail::address::toString(" Cc: ",
- env.cc) << endl;
-
- if (env.bcc.size() > 0)
- cout << mail::address::toString(" Bcc: ", env.bcc)
- << endl;
-}
-
-static bool getIndex(mail::ACCOUNT *p, mail::folder *f)
-{
- if (!p->openFolder(f, NULL))
- return false;
-
- size_t n=p->getFolderIndexSize();
- size_t i;
-
- vector<size_t> msgnums;
-
- cout << "Total: " << n << " messages." << endl;
-
-#if 1
- for (i=0; i<n; i++)
- msgnums.push_back(i);
-
- vector<mail::xenvelope> envelopes;
-
- if (!p->getMessageEnvelope(msgnums, envelopes))
- return false;
-
- for (i=0; i<n; i++)
- {
- if (i > 0)
- cout << endl;
- cout << "Message " << (i+1) << ":" << endl;
-
- showEnvelope(envelopes[i]);
- }
-#endif
-
-#if 0
- vector<mail::mimestruct> structures;
-
- if (!p->getMessageStructure(msgnums, structures))
- error(p);
-
- vector<mail::mimestruct>::iterator b=structures.begin(),
- e=structures.end();
-
- i=0;
- while (b != e)
- {
- cout << endl;
- cout << "-------------------------------------------" << endl;
- cout << " Message " << ++i << endl;
- cout << "-------------------------------------------" << endl;
- showstructure( *b++ );
- }
-#endif
- return true;
-
-}
-
-class DisplayHeader : public mail::ACCOUNT::Store {
-public:
- DisplayHeader();
- ~DisplayHeader();
- void store(size_t, string);
-};
-
-DisplayHeader::DisplayHeader()
-{
-}
-
-DisplayHeader::~DisplayHeader()
-{
-}
-
-void DisplayHeader::store(size_t dummy, string txt)
-{
- cout << txt;
-}
-
-static bool getHeaders(mail::ACCOUNT *p, mail::folder *f, size_t n)
-{
- if (!p->openFolder(f, NULL))
- return false;
-
- vector<size_t> v;
-
- v.push_back(n-1);
-
- DisplayHeader display_header;
-
- return (p->getMessageContent(v, false, mail::readHeadersFolded,
- display_header));
-}
-
-static bool removeMessages(mail::ACCOUNT *p, mail::folder *f, const char *msgs)
-{
- if (!p->openFolder(f, NULL))
- return false;
-
- vector<size_t> v;
-
- while (*msgs)
- {
- if (!isdigit(*msgs))
- {
- msgs++;
- continue;
- }
-
- size_t n=0;
-
- while (*msgs && isdigit(*msgs))
- n= n * 10 + (*msgs++ - '0');
-
- if (n > 0)
- {
- cout << "Removing " << n << endl;
- v.push_back(n-1);
- }
- }
-
- cout << "Ready: ";
-
- string reply;
-
- if (getline(cin, reply).fail())
- return true;
-
- return (p->removeMessages(v));
-}
-
-static bool doFilterFolder(mail::ACCOUNT *p, mail::folder *f)
-{
- if (!p->openFolder(f, NULL))
- return false;
-
- size_t n=p->getFolderIndexSize();
-
- cout << "Total: " << n << " messages." << endl;
-
- size_t i;
-
- for (i=0; i<n; i++)
- {
- vector<size_t> msgnums;
-
- msgnums.push_back(i);
-
- vector<mail::xenvelope> envelopes;
-
- if (!p->getMessageEnvelope(msgnums, envelopes))
- return false;
-
- cout << endl << "Message " << (i+1) << ":" << endl;
- showEnvelope(envelopes[0]);
-
- cout << "D)elete, S)kip, E)xit? (S) " << flush;
-
- string reply;
-
- if (getline(cin, reply).fail())
- return true;
-
- if (reply.size() == 0)
- continue;
-
- mail::messageInfo msgInfo=p->getFolderIndexInfo(n);
-
- switch (reply[0]) {
- case 'D':
- case 'd':
- msgInfo.deleted=true;
-
- if (!p->saveFolderIndexInfo(n, msgInfo))
- return false;
- continue;
- case 'E':
- case 'e':
- break;
- default:
- continue;
- }
- break;
- }
-
- p->updateFolderIndexInfo();
-
- return true;
-}
-
-static bool doUploadMessage(mail::ACCOUNT *p, mail::folder *f)
-{
- class uploadMessage : public mail::addMessagePull {
- public:
-
- string getMessageContents()
- {
- char buffer[BUFSIZ];
-
- int n=read(0, buffer, sizeof(buffer));
-
- if (n <= 0)
- return "";
-
- return (string(buffer, buffer+n));
- }
- };
-
- uploadMessage upload;
-
- return p->addMessage(f, upload);
-}
-
-class readStdin : public mail::addMessagePull {
-public:
- readStdin();
- ~readStdin();
- string getMessageContents();
-};
-
-readStdin::readStdin()
-{
-}
-
-readStdin::~readStdin()
-{
-}
-
-string readStdin::getMessageContents()
-{
- char buffer[BUFSIZ];
-
- int n=cin.read(buffer, sizeof(buffer)).gcount();
-
- if (n <= 0)
- return "";
-
- return string(buffer, buffer+n);
-}
-
-class copyProgressReporter : public mail::ACCOUNT::Progress {
-
- string lastmsg;
-
- static void fmtByte(ostringstream &o, size_t byteCount);
-
- size_t lastCompletedShown;
-
-public:
- size_t bytesCompleted, bytesEstimatedTotal,
- messagesCompleted, messagesEstimatedTotal;
-
- bool doReportProgress;
- time_t timestamp;
- bool final;
-
- copyProgressReporter(mail::ACCOUNT *acct);
- ~copyProgressReporter();
-
- void operator()(size_t bytesCompleted,
- size_t bytesEstimatedTotal,
-
- size_t messagesCompleted,
- size_t messagesEstimatedTotal);
-
- void operator()();
-};
-
-copyProgressReporter::copyProgressReporter(mail::ACCOUNT *acct)
- : Progress(acct), lastmsg(""),
- lastCompletedShown(0),
- bytesCompleted(0), bytesEstimatedTotal(0),
- messagesCompleted(0), messagesEstimatedTotal(0),
- doReportProgress(isatty(1) != 0), timestamp(time(NULL)),
- final(false)
-{
-}
-
-copyProgressReporter::~copyProgressReporter()
-{
-}
-
-void copyProgressReporter::operator()(size_t bytesCompletedArg,
- size_t bytesEstimatedTotalArg,
-
- size_t messagesCompletedArg,
- size_t messagesEstimatedTotalArg)
-{
- bytesCompleted=bytesCompletedArg;
- bytesEstimatedTotal=bytesEstimatedTotalArg;
- messagesCompleted=messagesCompletedArg;
- messagesEstimatedTotal=messagesEstimatedTotalArg;
-
- if (!doReportProgress)
- return;
-
- time_t t=time(NULL);
-
- if (t == timestamp)
- return;
-
- timestamp=t;
-
- (*this)();
-}
-
-void copyProgressReporter::operator()()
-{
- if (lastCompletedShown != messagesCompleted)
- bytesCompleted=bytesEstimatedTotal=0;
- // Background noise.
-
- lastCompletedShown=messagesCompleted;
-
- size_t i, n=lastmsg.size();
-
- for (i=0; i<n; i++)
- cout << '\b';
- for (i=0; i<n; i++)
- cout << ' ';
- for (i=0; i<n; i++)
- cout << '\b';
-
- ostringstream o;
-
- if (bytesCompleted)
- {
- fmtByte(o, bytesCompleted);
-
- if (bytesCompleted < bytesEstimatedTotal)
- {
- o << " of ";
- fmtByte(o, bytesEstimatedTotal);
- }
- }
-
- if (final || messagesEstimatedTotal > 1)
- {
- if (bytesCompleted)
- o << "; ";
-
- o << messagesCompleted;
- if (messagesCompleted < messagesEstimatedTotal)
- o << " of " << messagesEstimatedTotal;
- o << " msgs copied...";
- }
-
- lastmsg=o.str();
- cout << lastmsg << flush;
-}
-
-void copyProgressReporter::fmtByte(ostringstream &o, size_t byteCount)
-{
- if (byteCount < 1024)
- {
- o << byteCount;
- return;
- }
-
- if (byteCount < 1024 * 1024)
- {
- o << (byteCount + 512) / 1024 << " Kb";
- return;
- }
-
- o << byteCount / (1024 * 1024) << "."
- << (byteCount % (1024 * 1024)) * 10 / (1024 * 1024) << " Mb";
-}
-
-static string docopyfolderordir(mail::ACCOUNT *fromAccount,
- mail::ACCOUNT *toAccount,
- mail::folder *fromfolder,
- mail::folder *tofolder);
-
-static string docopyfolder(mail::ACCOUNT *fromAccount,
- mail::ACCOUNT *toAccount,
- mail::folder *fromfolder,
- mail::folder *tofolder);
-
-
-static string docopy(mail::ACCOUNT *fromAccount,
- mail::ACCOUNT *toAccount,
- string fromFolderName,
- string toFolderName,
- bool recurse)
-{
- string fromNameServer=fromFolderName, toNameServer=toFolderName;
-
- mail::folder *fromfolder=
- fromAccount->getFolderFromPath(fromNameServer);
-
- if (!fromfolder)
- return fromAccount->errmsg;
-
- mail::folder *tofolder=
- toAccount->getFolderFromPath(toNameServer);
-
- if (!tofolder)
- return toAccount->errmsg;
-
- string errmsg=recurse ?
- docopyfolderordir(fromAccount, toAccount,
- fromfolder, tofolder)
- : docopyfolder(fromAccount, toAccount,
- fromfolder, tofolder);
-
- delete fromfolder;
- delete tofolder;
- return errmsg;
-}
-
-static string docopyfolderordir(mail::ACCOUNT *fromAccount,
- mail::ACCOUNT *toAccount,
- mail::folder *fromfolder,
- mail::folder *tofolder)
-{
- if (fromfolder->hasSubFolders())
- {
- toAccount->createFolder(tofolder, true);
- // Ignore error, subdirectory may already exist
-
- mail::ACCOUNT::FolderList subfolders;
-
- if (!fromAccount->getSubFolders(fromfolder, subfolders))
- return fromfolder->getName() + ": " +
- fromAccount->errmsg;
-
- mail::ACCOUNT::FolderList::iterator b=subfolders.begin(),
- e=subfolders.end();
-
- while (b != e)
- {
- mail::folder *f= *b++;
- string n=f->getName();
-
- mail::folder *newFolder=
- toAccount->createFolder(tofolder,
- n,
- !f->hasMessages());
-
- if (!newFolder) // May already exist
- {
- mail::ACCOUNT::FolderList subfolders2;
-
- if (!toAccount->getSubFolders(tofolder,
- subfolders2))
- return tofolder->getName() + ": "
- + toAccount->errmsg;
-
- mail::ACCOUNT::FolderList::iterator
- sb=subfolders2.begin(),
- se=subfolders2.end();
-
- while (sb != se)
- {
- if ( (*sb)->getName() == n)
- {
- newFolder= (*sb)->clone();
-
- if (!newFolder)
- return strerror(errno);
- break;
- }
- sb++;
- }
-
- if (!newFolder)
- {
- return tofolder->getName()
- + ": cannot create "
- + n;
- }
- }
-
- string errmsg=docopyfolderordir(fromAccount,
- toAccount,
- f,
- newFolder);
-
- if (errmsg != "")
- return errmsg;
- delete newFolder;
- }
- if (!fromfolder->hasMessages())
- return "";
- }
-
- return docopyfolder(fromAccount, toAccount, fromfolder, tofolder);
-}
-
-static string docopyfolder(mail::ACCOUNT *fromAccount,
- mail::ACCOUNT *toAccount,
- mail::folder *fromfolder,
- mail::folder *tofolder)
-{
- if (!fromAccount->openFolder(fromfolder, NULL))
- return fromfolder->getName() + ": "
- + fromAccount->errmsg;
-
- toAccount->createFolder(tofolder, false); // May fail, ignore
-
- {
- mail::ACCOUNT::FolderInfo dummyInfo;
-
- if (!toAccount->readFolderInfo(tofolder, dummyInfo))
- return tofolder->getName() + ": " + toAccount->errmsg;
- }
-
- size_t n=fromAccount->getFolderIndexSize();
-
- vector<size_t> copyvec;
-
- copyvec.reserve(n);
- size_t i;
-
- for (i=0; i<n; i++)
- copyvec.push_back(i);
-
- {
- copyProgressReporter progressReport(fromAccount);
-
- cout << fromfolder->getName() << ": ";
-
- if (!fromAccount->copyMessagesTo(copyvec, tofolder))
- {
- progressReport();
- cout << endl;
- return fromAccount->errmsg;
- }
- progressReport.bytesCompleted=0;
- progressReport.bytesEstimatedTotal=0;
- progressReport.messagesCompleted=n;
- progressReport.messagesEstimatedTotal=n;
- progressReport.final=true;
- progressReport();
- cout << endl;
- }
- return "";
-}
-
-static std::string pw_url;
-
-class pw_prompt : public mail::loginCallback {
-public:
- pw_prompt();
- ~pw_prompt();
-
- void loginPrompt(callbackType cbType,
- std::string prompt);
-};
-
-pw_prompt::pw_prompt()
-{
-}
-
-pw_prompt::~pw_prompt()
-{
-}
-
-
-void pw_prompt::loginPrompt(mail::loginCallback::callbackType theType,
- std::string prompt)
-{
-#if HAVE_TERMIOS_H
- struct termios ti;
-#endif
-
- if (isatty(1))
- {
- if (pw_url.size() > 0)
- cout << pw_url << "> ";
-
- cout << prompt;
-
-#if HAVE_TERMIOS_H
- if (theType == PASSWORD)
- {
- struct termios ti2;
-
- if (tcgetattr(0, &ti))
- {
- perror("tcgetattr");
- }
-
- ti2=ti;
-
- ti2.c_lflag &= ~ECHO;
- tcsetattr(0, TCSAFLUSH, &ti2);
- }
-#endif
- }
-
- char linebuf[80];
-
- cin.getline(linebuf, sizeof(linebuf));
-
-#if HAVE_TERMIOS_H
- if (isatty(1))
- {
- if (theType == PASSWORD)
- {
- cout << endl;
- tcsetattr(0, TCSAFLUSH, &ti);
- }
- }
-#endif
-
- char *p=strchr(linebuf, '\n');
-
- if (p) *p=0;
-
- callback(string(linebuf));
-}
-
-static void getExtraString(mail::account::openInfo &loginInfoArg)
-{
- if (strncmp(loginInfoArg.url.c_str(), "nntp", 4) == 0)
- {
- const char *p=getenv("NEWSRC");
-
- if (p && *p)
- loginInfoArg.extraString=p;
- else
- loginInfoArg.extraString=
- mail::homedir() + "/.newsrc";
- return;
- }
-
- if (strncmp(loginInfoArg.url.c_str(), "pop3maildrop", 12) == 0)
- {
- cout << "maildrop (./Maildir): " << flush;
-
- char linebuf[80];
-
- cin.getline(linebuf, sizeof(linebuf));
-
- char *p=strchr(linebuf, '\n');
-
- if (p) *p=0;
-
- if (linebuf[0] == 0)
- strcpy(linebuf, "Maildir");
-
- loginInfoArg.extraString=linebuf;
- if (*loginInfoArg.extraString.c_str() != '/')
- {
- if (getcwd(linebuf, sizeof(linebuf)) == NULL)
- {
- perror("getcwd");
- exit(1);
- }
-
- loginInfoArg.extraString= string(linebuf) + "/" +
- loginInfoArg.extraString;
- }
- mail::maildir::maildirmake(loginInfoArg.extraString, false);
- }
-}
-
-int main(int argc, char **argv)
-{
- int argn=1;
- const char *messagenum="0";
-
- string path, newpath, name;
- bool doCreate=false;
- bool doCreateDir=false;
- bool doDelete=false;
- bool doDeleteDir=false;
- bool doTree=false;
- bool doList=false;
- bool doIndex=false;
- bool doHeaders=false;
- bool doRemove=false;
- bool doFilter=false;
- bool doUpload=false;
- bool doMail=false;
- bool doRename=false;
-
- bool doCopy=false;
- bool doRecurse=false;
- string copyto;
- string tofolder;
- string fromfolder;
-
- mail::smtpInfo smtpInfo;
-
- while (argn < argc)
- {
- if (strcmp(argv[argn], "-mailfrom") == 0 && argc - argn >= 2)
- {
- doMail=true;
- smtpInfo.sender=argv[++argn];
- ++argn;
- continue;
- }
-
- if (strcmp(argv[argn], "-to") == 0 && argc - argn >= 2)
- {
- smtpInfo.recipients.push_back(argv[++argn]);
- ++argn;
- continue;
- }
-
- if (strcmp(argv[argn], "-opt") == 0 && argc - argn >= 3)
- {
- string opt=argv[++argn];
- string val=argv[++argn];
-
- smtpInfo.options.insert(make_pair(opt, val));
- ++argn;
- continue;
- }
-
- if (strcmp(argv[argn], "-create") == 0 && argc - argn >= 3)
- {
- path=argv[++argn];
- name=argv[++argn];
- ++argn;
- doCreate=true;
- continue;
- }
-
- if (strcmp(argv[argn], "-rename") == 0 && argc - argn >= 4)
- {
- path=argv[++argn];
- newpath=argv[++argn];
- name=argv[++argn];
- ++argn;
- doRename=true;
- continue;
- }
-
- if (strcmp(argv[argn], "-createdir") == 0 && argc - argn >= 3)
- {
- path=argv[++argn];
- name=argv[++argn];
- ++argn;
- doCreateDir=true;
- continue;
- }
-
- if (strcmp(argv[argn], "-delete") == 0 && argc - argn >= 2)
- {
- path=argv[++argn];
- ++argn;
- doDelete=true;
- continue;
- }
-
- if (strcmp(argv[argn], "-deletedir") == 0 && argc - argn >= 2)
- {
- path=argv[++argn];
- ++argn;
- doDeleteDir=true;
- continue;
- }
-
- if (strcmp(argv[argn], "-tree") == 0)
- {
- doTree=true;
- ++argn;
- continue;
- }
-
- if (strcmp(argv[argn], "-list") == 0)
- {
- doList=true;
- ++argn;
- continue;
- }
-
- if (strcmp(argv[argn], "-index") == 0 && argc - argn >= 2)
- {
- path=argv[++argn];
- ++argn;
- doIndex=true;
- continue;
- }
-
- if (strcmp(argv[argn], "-upload") == 0 && argc - argn >= 2)
- {
- path=argv[++argn];
- ++argn;
- doUpload=true;
- continue;
- }
-
- if (strcmp(argv[argn], "-filter") == 0 && argc - argn >= 2)
- {
- path=argv[++argn];
- ++argn;
- doFilter=true;
- continue;
- }
-
- if (strcmp(argv[argn], "-headers") == 0 && argc - argn >= 3)
- {
- path=argv[++argn];
- messagenum=argv[++argn];
- ++argn;
- doHeaders=true;
- continue;
- }
-
- if (strcmp(argv[argn], "-remove") == 0 && argc - argn >= 3)
- {
- path=argv[++argn];
- messagenum=argv[++argn];
- ++argn;
- doRemove=true;
- continue;
- }
-
- if (strcmp(argv[argn], "-copyto") == 0 && argc - argn >= 2)
- {
- copyto=argv[++argn];
- ++argn;
- doCopy=true;
- continue;
- }
-
- if (strcmp(argv[argn], "-tofolder") == 0 && argc - argn >= 2)
- {
- tofolder=argv[++argn];
- ++argn;
- continue;
- }
-
- if (strcmp(argv[argn], "-fromfolder") == 0 && argc - argn >= 2)
- {
- fromfolder=argv[++argn];
- ++argn;
- continue;
- }
-
- if (strcmp(argv[argn], "-recurse") == 0)
- {
- doRecurse=true;
- ++argn;
- continue;
- }
- break;
- }
-
- if (argn >= argc)
- exit (0);
-
- string url=argv[argn];
-
- mail::ACCOUNT *p=new mail::ACCOUNT();
-
- if (!p)
- {
- cerr << strerror(errno) << endl;
- exit (0);
- }
-
- mail::ACCOUNT::FolderList folderList;
-
- pw_url=url;
-
- {
- pw_prompt getpassword;
-
- mail::account::openInfo loginInfoArg;
-
- loginInfoArg.url=url;
-
- getExtraString(loginInfoArg);
-
- loginInfoArg.loginCallbackObj= &getpassword;
- if (!p->login(loginInfoArg) ||
- !p->getTopLevelFolders(folderList))
- {
- error(p);
- }
- }
-
- if (doCopy)
- {
- mail::ACCOUNT *toAccount=new mail::ACCOUNT();
-
- if (!toAccount)
- {
- cerr << strerror(errno) << endl;
- exit (0);
- }
-
- pw_url=copyto;
-
- pw_prompt getpassword;
-
- mail::account::openInfo loginInfo;
-
- loginInfo.url=copyto;
- loginInfo.loginCallbackObj= &getpassword;
- getExtraString(loginInfo);
-
- if (!toAccount->login(loginInfo))
- {
- error(toAccount);
- }
-
- string errmsg=docopy(p, toAccount, fromfolder, tofolder,
- doRecurse);
-
- if (errmsg.size() > 0)
- error(errmsg);
- toAccount->logout();
- delete toAccount;
- }
- else if (doCreate || doCreateDir)
- {
- mail::folder *f=p->getFolderFromPath(path);
-
- if (!f || !(f=p->createFolder(f, name, doCreateDir)))
- {
- error(p);
- }
- }
- else if (doRename)
- {
- mail::folder *oldFolder=p->getFolderFromPath(path);
-
- if (!oldFolder)
- {
- cerr << "ERROR: " << path << " - folder not found."
- << endl;
- exit(0);
- }
-
- mail::folder *newParent=NULL;
-
- if (newpath.size() > 0)
- {
- newParent=p->getFolderFromPath(newpath);
-
- if (!newParent)
- {
- cerr << "ERROR: " << newpath
- << " - folder not found."
- << endl;
- exit(0);
- }
- }
-
- if (!(oldFolder=p->renameFolder(oldFolder, newParent, name)))
- error(p);
- }
- else if (doDelete || doDeleteDir)
- {
- mail::folder *f=p->getFolderFromPath(path);
-
- if (!f || !p->deleteFolder(f, doDeleteDir))
- {
- error(p);
- }
- }
- else if (doIndex)
- {
- mail::folder *f=p->getFolderFromPath(path);
-
- if (!f || !getIndex(p, f))
- error(p);
-
-#if 0
- cout << "TOTAL # OF MESSAGES: " << p->getFolderIndexSize()
- << endl;
-
- string dummy;
-
- getline(cin, dummy);
-
- cout << "CHECK NEW MAIL: " << p->checkNewMail() << endl;
-
- cout << "TOTAL # OF MESSAGES: " << p->getFolderIndexSize()
- << endl;
-
- if (!getIndex(p, f))
- error(p);
-#endif
- }
- else if (doHeaders)
- {
- mail::folder *f=p->getFolderFromPath(path);
-
- if (!f || !getHeaders(p, f, atoi(messagenum)))
- error(p);
- }
- else if (doRemove)
- {
- mail::folder *f=p->getFolderFromPath(path);
-
- if (!f || !removeMessages(p, f, messagenum))
- error(p);
- }
- else if (doFilter)
- {
- mail::folder *f=p->getFolderFromPath(path);
-
- if (!f || !doFilterFolder(p, f))
- error(p);
- }
- else if (doUpload)
- {
- mail::folder *f=p->getFolderFromPath(path);
-
- if (!f || !doUploadMessage(p, f))
- error(p);
- }
- else if (doMail)
- {
- readStdin doReadStdin;
-
- if (!p->send(smtpInfo, NULL, doReadStdin))
- {
- string errmsg=p->errmsg;
- p->logout();
- delete p;
- error(errmsg);
- }
- }
- else if (doTree || doList)
- {
- mail::ACCOUNT::FolderList::iterator b=folderList.begin(),
- e=folderList.end();
-
- while (b != e)
- {
- if ( (*b)->getPath().size() == 0)
- break;
-
- ++b;
- }
-
- if (b != e)
- {
- mail::ACCOUNT::FolderList subfolders;
-
- if (!p->getSubFolders(*b, subfolders))
- error(p);
-
- showFolderList(p, subfolders, 0, doTree);
- }
- else
- showFolderList(p, folderList, 0, doTree);
- }
-
- p->logout();
-
- delete p;
- exit(0);
-}