summaryrefslogtreecommitdiffstats
path: root/kmail/folderutil.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmail/folderutil.cpp')
-rw-r--r--kmail/folderutil.cpp113
1 files changed, 113 insertions, 0 deletions
diff --git a/kmail/folderutil.cpp b/kmail/folderutil.cpp
new file mode 100644
index 000000000..8e65fff27
--- /dev/null
+++ b/kmail/folderutil.cpp
@@ -0,0 +1,113 @@
+/* Copyright 2009 Klarälvdalens Datakonsult AB
+
+ 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) version 3 or any later version
+ accepted by the membership of KDE e.V. (or its successor approved
+ by the membership of KDE e.V.), which shall act as a proxy
+ defined in Section 14 of version 3 of the license.
+
+ 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, see <http://www.gnu.org/licenses/>.
+*/
+#include "folderutil.h"
+
+#include "kmfolder.h"
+#include "kmfolderimap.h"
+#include "kmfoldercachedimap.h"
+#include "kmfoldermgr.h"
+
+#include <kmessagebox.h>
+
+using namespace KMail;
+using namespace FolderUtil;
+
+KMFolder *KMail::FolderUtil::createSubFolder( KMFolder *parentFolder, KMFolderDir *parentDir,
+ const TQString &folderName, const TQString &namespaceName,
+ KMFolderType localFolderType )
+{
+ KMFolder *newFolder = 0;
+
+ if ( parentFolder && parentFolder->folderType() == KMFolderTypeImap ) {
+ KMFolderImap* selectedStorage = static_cast<KMFolderImap*>( parentFolder->storage() );
+ KMAcctImap *anAccount = selectedStorage->account();
+ // check if a connection is available BEFORE creating the folder
+ if (anAccount->makeConnection() == ImapAccountBase::Connected) {
+ newFolder = kmkernel->imapFolderMgr()->createFolder( folderName, false, KMFolderTypeImap, parentDir );
+ if ( newFolder ) {
+ TQString imapPath, parent;
+ if ( !namespaceName.isEmpty() ) {
+ // create folder with namespace
+ parent = anAccount->addPathToNamespace( namespaceName );
+ imapPath = anAccount->createImapPath( parent, folderName );
+ } else {
+ imapPath = anAccount->createImapPath( selectedStorage->imapPath(), folderName );
+ }
+ KMFolderImap* newStorage = static_cast<KMFolderImap*>( newFolder->storage() );
+ selectedStorage->createFolder(folderName, parent); // create it on the server
+ newStorage->initializeFrom( selectedStorage, imapPath, TQString::null );
+ static_cast<KMFolderImap*>(parentFolder->storage())->setAccount( selectedStorage->account() );
+ return newFolder;
+ }
+ }
+ } else if ( parentFolder && parentFolder->folderType() == KMFolderTypeCachedImap ) {
+ newFolder = kmkernel->dimapFolderMgr()->createFolder( folderName, false, KMFolderTypeCachedImap,
+ parentDir );
+ if ( newFolder ) {
+ KMFolderCachedImap* selectedStorage = static_cast<KMFolderCachedImap*>( parentFolder->storage() );
+ KMFolderCachedImap* newStorage = static_cast<KMFolderCachedImap*>( newFolder->storage() );
+ newStorage->initializeFrom( selectedStorage );
+ if ( !namespaceName.isEmpty() ) {
+ // create folder with namespace
+ TQString path = selectedStorage->account()->createImapPath(
+ namespaceName, folderName );
+ newStorage->setImapPathForCreation( path );
+ }
+ return newFolder;
+ }
+ } else {
+ // local folder
+ Q_ASSERT( localFolderType == KMFolderTypeMaildir || localFolderType == KMFolderTypeMbox );
+ newFolder = kmkernel->folderMgr()->createFolder( folderName, false, localFolderType,
+ parentDir );
+ return newFolder;
+ }
+
+ return newFolder;
+}
+
+void KMail::FolderUtil::deleteFolder( KMFolder *folderToDelete, TQWidget *parent )
+{
+ if ( folderToDelete->hasAccounts() ) {
+ // this folder has an account, so we need to change that to the inbox
+ for ( AccountList::Iterator it (folderToDelete->acctList()->begin() ),
+ end( folderToDelete->acctList()->end() ); it != end; ++it ) {
+ (*it)->setFolder( kmkernel->inboxFolder() );
+ KMessageBox::information(parent,
+ i18n("<qt>The folder you deleted was associated with the account "
+ "<b>%1</b> which delivered mail into it. The folder the account "
+ "delivers new mail into was reset to the main Inbox folder.</qt>").arg( (*it)->name()));
+ }
+ }
+ if (folderToDelete->folderType() == KMFolderTypeImap)
+ kmkernel->imapFolderMgr()->remove(folderToDelete);
+ else if (folderToDelete->folderType() == KMFolderTypeCachedImap) {
+ // Deleted by user -> tell the account (see KMFolderCachedImap::listDirectory2)
+ KMFolderCachedImap* storage = static_cast<KMFolderCachedImap*>( folderToDelete->storage() );
+ KMAcctCachedImap* acct = storage->account();
+ if ( acct )
+ acct->addDeletedFolder( folderToDelete );
+
+ kmkernel->dimapFolderMgr()->remove(folderToDelete);
+ }
+ else if (folderToDelete->folderType() == KMFolderTypeSearch)
+ kmkernel->searchFolderMgr()->remove(folderToDelete);
+ else
+ kmkernel->folderMgr()->remove(folderToDelete);
+}