diff --git a/CMakeLists.txt b/CMakeLists.txt index 39e1992cd..936624057 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -235,6 +235,7 @@ set(kmailprivate_LIB_SRCS kleojobexecutor.cpp iconnamecache.cpp backupjob.cpp + folderutil.cpp ) qt4_add_dbus_adaptor( kmailprivate_LIB_SRCS ${CMAKE_BINARY_DIR}/kmail/org.kde.kmail.kmail.xml kmkernel.h KMKernel ) diff --git a/folderutil.cpp b/folderutil.cpp new file mode 100644 index 000000000..2a90cc276 --- /dev/null +++ b/folderutil.cpp @@ -0,0 +1,81 @@ +/* Copyright 2009 Thomas McGuire + + 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 . +*/ +#include "folderutil.h" + +#include "kmfolder.h" +#include "kmfolderimap.h" +#include "kmfoldercachedimap.h" +#include "kmfoldermgr.h" + +using namespace KMail; +using namespace FolderUtil; + +KMFolder *KMail::FolderUtil::createSubFolder( KMFolder *parentFolder, KMFolderDir *parentDir, + const QString &folderName, const QString &namespaceName, + KMFolderType localFolderType ) +{ + KMFolder *newFolder = 0; + + if ( parentFolder && parentFolder->folderType() == KMFolderTypeImap ) { + KMFolderImap* selectedStorage = static_cast( 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 ) { + QString 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( newFolder->storage() ); + selectedStorage->createFolder(folderName, parent); // create it on the server + newStorage->initializeFrom( selectedStorage, imapPath, QString::null ); + static_cast(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( parentFolder->storage() ); + KMFolderCachedImap* newStorage = static_cast( newFolder->storage() ); + newStorage->initializeFrom( selectedStorage ); + if ( !namespaceName.isEmpty() ) { + // create folder with namespace + QString 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, KMFolderTypeMaildir, + parentDir ); + return newFolder; + } + + return newFolder; +} \ No newline at end of file diff --git a/folderutil.h b/folderutil.h new file mode 100644 index 000000000..af5f9fda4 --- /dev/null +++ b/folderutil.h @@ -0,0 +1,54 @@ +/* Copyright 2009 Thomas McGuire + + 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 . +*/ +#ifndef FOLDERUTIL_H +#define FOLDERUTIL_H + +#include "kmfoldertype.h" + +class KMFolder; +class KMFolderDir; +class QString; + +namespace KMail +{ + +namespace FolderUtil +{ + +/** + * Low-level function to create a subfolder for a folder of any kind. + * + * @param parentFolder parent folder of the folder that should be created. Can be 0 in case of + * local folders + * @param parentDir parent folder directory, which should be the folder directory of parentFolder + * @param folderName the name the newly created folder should have + * @param namespaceName for (d)IMAP folders, the namespace the new folder should be in. Can be empty. + * @param localFolderType for local folders, this determines if the folder should be MBOX or maildir + * + * @return the newly created folder or 0 in case an error occured + */ +KMFolder *createSubFolder( KMFolder *parentFolder, KMFolderDir *parentDir, + const QString &folderName, const QString &namespaceName, + KMFolderType localFolderType ); + +} + +} + +#endif diff --git a/newfolderdialog.cpp b/newfolderdialog.cpp index e96e41b4e..55412fe53 100644 --- a/newfolderdialog.cpp +++ b/newfolderdialog.cpp @@ -26,6 +26,7 @@ ** your version. *******************************************************************************/ +#include "folderutil.h" #include "newfolderdialog.h" #include "kmfolder.h" #include "folderstorage.h" @@ -55,7 +56,9 @@ using namespace KMail; NewFolderDialog::NewFolderDialog( QWidget* parent, KMFolder *folder ) - : KDialog( parent ), mContentsComboBox( 0 ), mFolder( folder ) + : KDialog( parent ), + mFormatComboBox( 0 ), mContentsComboBox( 0 ), + mNamespacesComboBox( 0 ), mFolder( folder ) { setCaption( i18n( "New Folder" ) ); setButtons( Ok | Cancel ); @@ -274,53 +277,21 @@ void NewFolderDialog::slotOk() /* Ok, obvious errors caught, let's try creating it for real. */ const QString message = i18n( "Failed to create folder %1." " ", fldName); - bool success = false; - KMFolder *newFolder = 0; - - if ( mFolder && mFolder->folderType() == KMFolderTypeImap ) { - KMFolderImap* selectedStorage = static_cast( mFolder->storage() ); - KMAcctImap *anAccount = selectedStorage->account(); - // check if a connection is available BEFORE creating the folder - if (anAccount->makeConnection() == ImapAccountBase::Connected) { - newFolder = kmkernel->imapFolderMgr()->createFolder( fldName, false, KMFolderTypeImap, selectedFolderDir ); - if ( newFolder ) { - QString imapPath, parent; - if ( mNamespacesComboBox ) { - // create folder with namespace - parent = anAccount->addPathToNamespace( mNamespacesComboBox->currentText() ); - imapPath = anAccount->createImapPath( parent, fldName ); - } - KMFolderImap* newStorage = static_cast( newFolder->storage() ); - selectedStorage->createFolder(fldName, parent); // create it on the server - newStorage->initializeFrom( selectedStorage, imapPath, QString() ); - static_cast(mFolder->storage())->setAccount( selectedStorage->account() ); - success = true; - } - } - } else if ( mFolder && mFolder->folderType() == KMFolderTypeCachedImap ) { - newFolder = kmkernel->dimapFolderMgr()->createFolder( fldName, false, KMFolderTypeCachedImap, selectedFolderDir ); - if ( newFolder ) { - KMFolderCachedImap* selectedStorage = static_cast( mFolder->storage() ); - KMFolderCachedImap* newStorage = static_cast( newFolder->storage() ); - newStorage->initializeFrom( selectedStorage ); - if ( mNamespacesComboBox ) { - // create folder with namespace - QString path = selectedStorage->account()->createImapPath( - mNamespacesComboBox->currentText(), fldName ); - newStorage->setImapPathForCreation( path ); - } - success = true; - } - } else { - // local folder - if (mFormatComboBox->currentIndex() == 1) - newFolder = kmkernel->folderMgr()->createFolder(fldName, false, KMFolderTypeMaildir, selectedFolderDir ); - else - newFolder = kmkernel->folderMgr()->createFolder(fldName, false, KMFolderTypeMbox, selectedFolderDir ); - if ( newFolder ) - success = true; + + QString namespaceName; + if ( mNamespacesComboBox ) { + namespaceName = mNamespacesComboBox->currentText(); } - if ( !success ) { + + KMFolderType folderType = KMFolderTypeUnknown; + if ( mFormatComboBox && mFormatComboBox->currentIndex() == 1 ) + folderType = KMFolderTypeMaildir; + else if ( mFormatComboBox ) + folderType = KMFolderTypeMbox; + + KMFolder *newFolder = KMail::FolderUtil::createSubFolder( mFolder, selectedFolderDir, fldName, + namespaceName, folderType ); + if ( !newFolder ) { KMessageBox::error( this, message ); return; }