folderutil.cpp
00001 /* Copyright 2009 Klarälvdalens Datakonsult AB 00002 00003 This program is free software; you can redistribute it and/or 00004 modify it under the terms of the GNU General Public License as 00005 published by the Free Software Foundation; either version 2 of 00006 the License or (at your option) version 3 or any later version 00007 accepted by the membership of KDE e.V. (or its successor approved 00008 by the membership of KDE e.V.), which shall act as a proxy 00009 defined in Section 14 of version 3 of the license. 00010 00011 This program is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU General Public License for more details. 00015 00016 You should have received a copy of the GNU General Public License 00017 along with this program. If not, see <http://www.gnu.org/licenses/>. 00018 */ 00019 #include "folderutil.h" 00020 00021 #include "kmfolder.h" 00022 #include "kmfolderimap.h" 00023 #include "kmfoldercachedimap.h" 00024 #include "kmfoldermgr.h" 00025 00026 #include <kmessagebox.h> 00027 00028 using namespace KMail; 00029 using namespace FolderUtil; 00030 00031 KMFolder *KMail::FolderUtil::createSubFolder( KMFolder *parentFolder, KMFolderDir *parentDir, 00032 const TQString &folderName, const TQString &namespaceName, 00033 KMFolderType localFolderType ) 00034 { 00035 KMFolder *newFolder = 0; 00036 00037 if ( parentFolder && parentFolder->folderType() == KMFolderTypeImap ) { 00038 KMFolderImap* selectedStorage = static_cast<KMFolderImap*>( parentFolder->storage() ); 00039 KMAcctImap *anAccount = selectedStorage->account(); 00040 // check if a connection is available BEFORE creating the folder 00041 if (anAccount->makeConnection() == ImapAccountBase::Connected) { 00042 newFolder = kmkernel->imapFolderMgr()->createFolder( folderName, false, KMFolderTypeImap, parentDir ); 00043 if ( newFolder ) { 00044 TQString imapPath, parent; 00045 if ( !namespaceName.isEmpty() ) { 00046 // create folder with namespace 00047 parent = anAccount->addPathToNamespace( namespaceName ); 00048 imapPath = anAccount->createImapPath( parent, folderName ); 00049 } else { 00050 imapPath = anAccount->createImapPath( selectedStorage->imapPath(), folderName ); 00051 } 00052 KMFolderImap* newStorage = static_cast<KMFolderImap*>( newFolder->storage() ); 00053 selectedStorage->createFolder(folderName, parent); // create it on the server 00054 newStorage->initializeFrom( selectedStorage, imapPath, TQString() ); 00055 static_cast<KMFolderImap*>(parentFolder->storage())->setAccount( selectedStorage->account() ); 00056 return newFolder; 00057 } 00058 } 00059 } else if ( parentFolder && parentFolder->folderType() == KMFolderTypeCachedImap ) { 00060 newFolder = kmkernel->dimapFolderMgr()->createFolder( folderName, false, KMFolderTypeCachedImap, 00061 parentDir ); 00062 if ( newFolder ) { 00063 KMFolderCachedImap* selectedStorage = static_cast<KMFolderCachedImap*>( parentFolder->storage() ); 00064 KMFolderCachedImap* newStorage = static_cast<KMFolderCachedImap*>( newFolder->storage() ); 00065 newStorage->initializeFrom( selectedStorage ); 00066 if ( !namespaceName.isEmpty() ) { 00067 // create folder with namespace 00068 TQString path = selectedStorage->account()->createImapPath( 00069 namespaceName, folderName ); 00070 newStorage->setImapPathForCreation( path ); 00071 } 00072 return newFolder; 00073 } 00074 } else { 00075 // local folder 00076 Q_ASSERT( localFolderType == KMFolderTypeMaildir || localFolderType == KMFolderTypeMbox ); 00077 newFolder = kmkernel->folderMgr()->createFolder( folderName, false, localFolderType, 00078 parentDir ); 00079 return newFolder; 00080 } 00081 00082 return newFolder; 00083 } 00084 00085 void KMail::FolderUtil::deleteFolder( KMFolder *folderToDelete, TQWidget *parent ) 00086 { 00087 if ( folderToDelete->hasAccounts() ) { 00088 // this folder has an account, so we need to change that to the inbox 00089 for ( AccountList::Iterator it (folderToDelete->acctList()->begin() ), 00090 end( folderToDelete->acctList()->end() ); it != end; ++it ) { 00091 (*it)->setFolder( kmkernel->inboxFolder() ); 00092 KMessageBox::information(parent, 00093 i18n("<qt>The folder you deleted was associated with the account " 00094 "<b>%1</b> which delivered mail into it. The folder the account " 00095 "delivers new mail into was reset to the main Inbox folder.</qt>").arg( (*it)->name())); 00096 } 00097 } 00098 if (folderToDelete->folderType() == KMFolderTypeImap) 00099 kmkernel->imapFolderMgr()->remove(folderToDelete); 00100 else if (folderToDelete->folderType() == KMFolderTypeCachedImap) { 00101 // Deleted by user -> tell the account (see KMFolderCachedImap::listDirectory2) 00102 KMFolderCachedImap* storage = static_cast<KMFolderCachedImap*>( folderToDelete->storage() ); 00103 KMAcctCachedImap* acct = storage->account(); 00104 if ( acct ) 00105 acct->addDeletedFolder( folderToDelete ); 00106 00107 kmkernel->dimapFolderMgr()->remove(folderToDelete); 00108 } 00109 else if (folderToDelete->folderType() == KMFolderTypeSearch) 00110 kmkernel->searchFolderMgr()->remove(folderToDelete); 00111 else 00112 kmkernel->folderMgr()->remove(folderToDelete); 00113 }