00001 #include <qmessagebox.h>
00002 #include <qtextstream.h>
00003 #include <qpopupmenu.h>
00004 #include <qheader.h>
00005 #include <qfile.h>
00006 #include <qdir.h>
00007
00008 #include <qpe/resource.h>
00009
00010 #include <stdlib.h>
00011
00012 #include "folderwidget.h"
00013 #include "imaphandler.h"
00014 #include "imapbase.h"
00015 #include "rename.h"
00016
00017 FolderWidgetItem::FolderWidgetItem(Folder &folder, QListView *parent)
00018 : QListViewItem(parent), _folder(folder)
00019 {
00020 setPixmap(0, QPixmap(Resource::loadPixmap("mail/inbox")));
00021 setText(0, _folder.topFolder().account().user() + " (" + _folder.topFolder().account().imapServer() + ")");
00022 setOpen(true);
00023 }
00024
00025 FolderWidgetItem::FolderWidgetItem(Folder &folder, FolderWidgetItem *parent)
00026 : QListViewItem(parent), _folder(folder)
00027 {
00028 if (_folder.noCache()) {
00029 setText(0, QObject::tr("<Foldertree not known.>"));
00030 } else {
00031 if (folder.fullName().upper() == "INBOX") {
00032 setPixmap(0, QPixmap(Resource::loadPixmap("mail/inbox")));
00033 setText(0, QObject::tr("Inbox"));
00034 } else {
00035 setPixmap(0, QPixmap(Resource::loadPixmap("mail/folder")));
00036 setText(0, folder.fullName());
00037 }
00038 setOpen(true);
00039 }
00040 }
00041
00042 FolderWidget::FolderWidget(QWidget *parent, const char *name, WFlags fl)
00043 : ListViewPlus(parent, name, fl)
00044 {
00045 header()->hide();
00046 addColumn("");
00047 setSorting(-1);
00048
00049 QPopupMenu *menu = new QPopupMenu();
00050 menu->insertItem(tr("Rename"), MENU_RENAME);
00051 menu->insertItem(tr("Delete"), MENU_DELETE);
00052 menu->insertItem(tr("Move"), MENU_MOVE);
00053 menu->insertItem(tr("Copy"), MENU_COPY);
00054 menu->insertSeparator();
00055 menu->insertItem(tr("Create folder"), MENU_CREATE);
00056 menu->insertSeparator();
00057 menu->insertItem(tr("Rescan folder list"), MENU_RESCAN);
00058 setPopup(menu);
00059
00060 getAccounts();
00061
00062 connect(menu, SIGNAL(activated(int)), SLOT(slotMenuActivated(int)));
00063 connect(this, SIGNAL(clicked(QListViewItem*)), SLOT(slotItemClicked(QListViewItem*)));
00064 }
00065
00066 FolderWidget::~FolderWidget()
00067 {
00068
00069 }
00070
00071 void FolderWidget::update()
00072 {
00073 getAccounts();
00074 }
00075
00076 void FolderWidget::getAccounts()
00077 {
00078 clear();
00079
00080 QValueList<Account> accounts = ConfigFile::getAccounts();
00081 QValueList<Account>::Iterator it;
00082 for (it = accounts.begin(); it != accounts.end(); it++) {
00083 FolderWidgetItem *item = addAccount(*it);
00084 QFile f((QString) getenv("HOME") + "/Applications/mail/foldercache/foldercache-" + (*it).accountName());
00085 if (!f.open(IO_ReadOnly)) {
00086 Folder folder;
00087 folder.setNoCache(true);
00088 addFolder(folder, item);
00089 } else {
00090 QTextStream t(&f);
00091 while (!t.atEnd()) {
00092 QString separator = t.readLine();
00093 QString fullname = t.readLine();
00094 Folder folder;
00095 folder.setSeparator(separator);
00096 folder.setFullName(fullname);
00097 folder.setTopFolder(item->folder().topFolder());
00098 addFolder(folder, item);
00099 }
00100 f.close();
00101 }
00102 }
00103 }
00104
00105 FolderWidgetItem *FolderWidget::addAccount(Account &account)
00106 {
00107 TopFolder tf;
00108 tf.setAccount(account);
00109
00110
00111
00112 tf.setIMAPHandler(new IMAPHandler(account));
00113
00114 Folder folder;
00115 folder.setTopFolder(tf);
00116
00117 connect(tf.handler(), SIGNAL(IMAPLookingUpHost()), SLOT(slotIMAPLookingUpHost()));
00118 connect(tf.handler(), SIGNAL(IMAPHostFound()), SLOT(slotIMAPHostFound()));
00119 connect(tf.handler(), SIGNAL(IMAPConnected()), SLOT(slotIMAPConnected()));
00120 connect(tf.handler(), SIGNAL(IMAPDisconnected()), SLOT(slotIMAPDisconnected()));
00121 connect(tf.handler(), SIGNAL(IMAPError(int)), SLOT(slotIMAPError(int)));
00122
00123 return new FolderWidgetItem(folder, this);
00124 }
00125
00126 FolderWidgetItem *FolderWidget::addFolder(Folder &folder, FolderWidgetItem *folderWidgetItem)
00127 {
00128 return new FolderWidgetItem(folder, folderWidgetItem);
00129 }
00130
00131 void FolderWidget::slotMenuActivated(int itemid)
00132 {
00133 if (currentItem() == NULL) {
00134 QMessageBox::information(this, tr("Error"), tr("<p>Please select an item first.</p>"), tr("Ok"));
00135 return;
00136 }
00137
00138 if (itemid == MENU_RENAME) {
00139 if (((FolderWidgetItem *)currentItem())->folder().fullName().isEmpty()) return;
00140
00141 Folder folder = ((FolderWidgetItem *)currentItem())->folder();
00142 QString newName = Rename::rename(folder.fullName(), this);
00143 if (newName.isNull()) return;
00144
00145 folder.topFolder().handler()->iRename(folder.fullName(), newName);
00146 connect(folder.topFolder().handler(), SIGNAL(gotResponse(IMAPResponse&)), SLOT(slotIMAPRename(IMAPResponse&)));
00147 } else if (itemid == MENU_DELETE) {
00148 if (((FolderWidgetItem *)currentItem())->folder().fullName().isEmpty()) return;
00149
00150 Folder folder = ((FolderWidgetItem *)currentItem())->folder();
00151
00152 int ret = QMessageBox::information(this, tr("Question"), tr("<p>Do you really want to delete <pre>%1</pre>?").arg(folder.fullName()), tr("Yes"), tr("No"));
00153 if (ret == 1) return;
00154
00155 _createFolder = folder;
00156
00157 folder.topFolder().handler()->iDelete(folder.fullName());
00158 connect(folder.topFolder().handler(), SIGNAL(gotResponse(IMAPResponse&)), SLOT(slotIMAPDelete(IMAPResponse&)));
00159 } else if (itemid == MENU_MOVE) {
00160
00161 } else if (itemid == MENU_COPY) {
00162
00163 } else if (itemid == MENU_CREATE) {
00164 Folder folder = (((FolderWidgetItem *)currentItem())->folder());
00165 _createFolder = folder;
00166
00167 QString folderName = Rename::getText(tr("Foldername"), tr("<p>Please enter the name of the new folder.</p>"), this);
00168 if (folderName.isNull()) return;
00169
00170 folder.topFolder().handler()->iCreate(folder.fullName() + folder.separator() + folderName);
00171 connect(folder.topFolder().handler(), SIGNAL(gotResponse(IMAPResponse&)), SLOT(slotIMAPCreate(IMAPResponse&)));
00172 } else if (itemid == MENU_RESCAN) {
00173 Folder folder = (((FolderWidgetItem *)currentItem())->folder());
00174 _rescanAccount = folder.topFolder().account();
00175
00176 folder.topFolder().handler()->iList("", "*");
00177 connect(folder.topFolder().handler(), SIGNAL(gotResponse(IMAPResponse&)), SLOT(slotIMAPList(IMAPResponse&)));
00178 }
00179 }
00180
00181 void FolderWidget::slotItemClicked(QListViewItem *item)
00182 {
00183 if (item == NULL) return;
00184 Folder folder = ((FolderWidgetItem *)item)->folder();
00185 if (folder.fullName().isEmpty()) return;
00186
00187 emit folderSelected(folder);
00188 }
00189
00190 void FolderWidget::slotIMAPLookingUpHost()
00191 {
00192 emit status(tr("Looking up host..."));
00193 emit connecting();
00194 }
00195
00196 void FolderWidget::slotIMAPHostFound()
00197 {
00198 emit status(tr("Host found."));
00199 }
00200
00201 void FolderWidget::slotIMAPConnected()
00202 {
00203 emit status(tr("Connected to host."));
00204 emit connected();
00205 }
00206
00207 void FolderWidget::slotIMAPError(int error)
00208 {
00209 if (error == IMAPBase::IMAPErrConnectionRefused) {
00210 QMessageBox::warning(this, tr("Error"), tr("<p>The IMAP connection was refused.</p>"), tr("Ok"));
00211 } else if (error == IMAPBase::IMAPErrHostNotFound) {
00212 QMessageBox::warning(this, tr("Error"), tr("<p>The host was not found.</p>"), tr("Ok"));
00213 } else if (error == IMAPBase::IMAPErrSocketRead) {
00214 QMessageBox::warning(this, tr("Error"), tr("<p>There was an error while reading from the socket.</p>"), tr("Ok"));
00215 } else if (error == IMAPBase::IMAPErrLoginFailed) {
00216 QMessageBox::warning(this, tr("Error"), tr("<p>Login failed. Check your password/username.</p>"), tr("Ok"));
00217 } else {
00218 QMessageBox::warning(this, tr("Error"), tr("<p>An unknown error was encountered.</p>"), tr("Ok"));
00219 }
00220 }
00221
00222 void FolderWidget::slotIMAPDisconnected()
00223 {
00224 emit status(tr("Disconnected."));
00225 emit disconnected();
00226 }
00227
00228 void FolderWidget::slotIMAPLogin(IMAPResponse &response)
00229 {
00230 disconnect(response.imapHandler(), SIGNAL(gotResponse(IMAPResponse&)), this, SLOT(slotIMAPLogin(IMAPResponse&)));
00231
00232 if (response.statusResponse().status() == IMAPResponseEnums::OK) {
00233 emit status(tr("Login successful!"));
00234 } else {
00235 QMessageBox::warning(this, tr("Error"), tr("<p>Login failed. Go away.</p>"), tr("Ok"));
00236 }
00237 }
00238
00239 void FolderWidget::slotIMAPRename(IMAPResponse &response)
00240 {
00241 disconnect(response.imapHandler(), SIGNAL(gotResponse(IMAPResponse&)), this, SLOT(slotIMAPRename(IMAPResponse&)));
00242
00243 if (response.statusResponse().status() == IMAPResponseEnums::OK) {
00244 emit status(tr("Renaming successful!"));
00245 } else {
00246 QMessageBox::warning(this, tr("Error"), tr("<p>Renaming failed. (Server said: %1)</p>").arg(response.statusResponse().comment()), tr("Ok"));
00247 }
00248 }
00249
00250 void FolderWidget::slotIMAPDelete(IMAPResponse &response)
00251 {
00252 disconnect(response.imapHandler(), SIGNAL(gotResponse(IMAPResponse&)), this, SLOT(slotIMAPDelete(IMAPResponse&)));
00253
00254 if (response.statusResponse().status() == IMAPResponseEnums::OK) {
00255 emit status(tr("Deletion successful!"));
00256
00257 _rescanAccount = _createFolder.topFolder().account();
00258
00259 _createFolder.topFolder().handler()->iList(".", "*");
00260 connect(_createFolder.topFolder().handler(), SIGNAL(gotResponse(IMAPResponse&)), SLOT(slotIMAPList(IMAPResponse&)));
00261 } else {
00262 QMessageBox::warning(this, tr("Error"), tr("<p>Delete failed. (Server said: %1)</p>").arg(response.statusResponse().comment()), tr("Ok"));
00263 }
00264 }
00265
00266 void FolderWidget::slotIMAPCreate(IMAPResponse &response)
00267 {
00268 disconnect(response.imapHandler(), SIGNAL(gotResponse(IMAPResponse&)), this, SLOT(slotIMAPCreate(IMAPResponse&)));
00269
00270 if (response.statusResponse().status() == IMAPResponseEnums::OK) {
00271 emit status(tr("Folder created. Rescanning..."));
00272
00273 _rescanAccount = _createFolder.topFolder().account();
00274
00275 _createFolder.topFolder().handler()->iList(".", "*");
00276 connect(_createFolder.topFolder().handler(), SIGNAL(gotResponse(IMAPResponse&)), SLOT(slotIMAPList(IMAPResponse&)));
00277 } else {
00278 QMessageBox::warning(this, tr("Error"), tr("<p>The folder could not be created. (Server said: %1)</p>").arg(response.statusResponse().comment()), tr("Ok"));
00279 }
00280 }
00281
00282 void FolderWidget::slotIMAPList(IMAPResponse &response)
00283 {
00284 disconnect(response.imapHandler(), SIGNAL(gotResponse(IMAPResponse&)), this, SLOT(slotIMAPList(IMAPResponse&)));
00285
00286 if (response.statusResponse().status() == IMAPResponseEnums::OK) {
00287 QDir d((QString) getenv("HOME") + "/Applications/mail/foldercache");
00288 if (!d.exists()) {
00289 system("mkdir -p $HOME/Applications/mail/foldercache");
00290 qWarning("Created $HOME/Applications/mail/foldercache.");
00291 }
00292 QFile f((QString) getenv("HOME") + "/Applications/mail/foldercache/foldercache-" + _rescanAccount.accountName());
00293 if (!f.open(IO_WriteOnly)) {
00294 QMessageBox::critical(this, tr("Error"), tr("<p>Couldn't open folder cache file for writing!</p>"), tr("Ok"));
00295 return;
00296 }
00297 QTextStream t(&f);
00298
00299 QValueList<IMAPResponseLIST>::Iterator it;
00300 QValueList<IMAPResponseLIST> lists = response.LIST();
00301 for (it = lists.begin(); it != lists.end(); it++) {
00302 t << (*it).folderSeparator() << "\n";
00303 t << (*it).folder() << "\n";
00304 }
00305
00306 f.close();
00307
00308 emit status(tr("Got folder list."));
00309 getAccounts();
00310 } else {
00311 QMessageBox::warning(this, tr("Error"), tr("<p>Couldn't retrieve the folder list. (Server said: %1)</p>").arg(response.statusResponse().comment()), tr("Ok"));
00312 }
00313 }
00314