ferencd@0: // ferencd@0: // VMime library (http://www.vmime.org) ferencd@0: // Copyright (C) 2002-2013 Vincent Richard ferencd@0: // ferencd@0: // This program is free software; you can redistribute it and/or ferencd@0: // modify it under the terms of the GNU General Public License as ferencd@0: // published by the Free Software Foundation; either version 3 of ferencd@0: // the License, or (at your option) any later version. ferencd@0: // ferencd@0: // This program is distributed in the hope that it will be useful, ferencd@0: // but WITHOUT ANY WARRANTY; without even the implied warranty of ferencd@0: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ferencd@0: // General Public License for more details. ferencd@0: // ferencd@0: // You should have received a copy of the GNU General Public License along ferencd@0: // with this program; if not, write to the Free Software Foundation, Inc., ferencd@0: // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ferencd@0: // ferencd@0: // Linking this library statically or dynamically with other modules is making ferencd@0: // a combined work based on this library. Thus, the terms and conditions of ferencd@0: // the GNU General Public License cover the whole combination. ferencd@0: // ferencd@0: ferencd@0: #include "tests/testUtils.hpp" ferencd@0: ferencd@0: #include "vmime/platform.hpp" ferencd@0: ferencd@0: #include "vmime/net/maildir/maildirStore.hpp" ferencd@0: #include "vmime/net/maildir/maildirFormat.hpp" ferencd@0: ferencd@0: ferencd@0: // Shortcuts and helpers ferencd@0: typedef vmime::utility::file::path fspath; ferencd@0: typedef vmime::utility::file::path::component fspathc; ferencd@0: ferencd@0: typedef vmime::net::folder::path fpath; ferencd@0: typedef vmime::net::folder::path::component fpathc; ferencd@0: ferencd@0: ferencd@0: const fpath operator/(const fpath& path, const std::string& c) ferencd@0: { ferencd@0: return path / fpathc(c); ferencd@0: } ferencd@0: ferencd@0: ferencd@0: /** Test messages */ ferencd@0: static const vmime::string TEST_MESSAGE_1 = ferencd@0: "From: \r\n" ferencd@0: "Subject: VMime Test\r\n" ferencd@0: "Date: Thu, 01 Mar 2007 09:49:35 +0100\r\n" ferencd@0: "\r\n" ferencd@0: "Hello, world!"; ferencd@0: ferencd@0: ferencd@0: /** Maildir trees used in tests. ferencd@0: * Structure: ferencd@0: * ferencd@0: * . ferencd@0: * |-- Folder ferencd@0: * | `-- SubFolder ferencd@0: * | |-- SubSubFolder1 ferencd@0: * | `-- SubSubFolder2 ferencd@0: * `-- Folder2 ferencd@0: * ferencd@0: */ ferencd@0: ferencd@0: // KMail format ferencd@0: static const vmime::string TEST_MAILDIR_KMAIL[] = // directories to create ferencd@0: { ferencd@0: "/Folder", ferencd@0: "/Folder/new", ferencd@0: "/Folder/tmp", ferencd@0: "/Folder/cur", ferencd@0: "/.Folder.directory", ferencd@0: "/.Folder.directory/SubFolder", ferencd@0: "/.Folder.directory/SubFolder/new", ferencd@0: "/.Folder.directory/SubFolder/tmp", ferencd@0: "/.Folder.directory/SubFolder/cur", ferencd@0: "/.Folder.directory/.SubFolder.directory", ferencd@0: "/.Folder.directory/.SubFolder.directory/SubSubFolder1", ferencd@0: "/.Folder.directory/.SubFolder.directory/SubSubFolder1/new", ferencd@0: "/.Folder.directory/.SubFolder.directory/SubSubFolder1/tmp", ferencd@0: "/.Folder.directory/.SubFolder.directory/SubSubFolder1/cur", ferencd@0: "/.Folder.directory/.SubFolder.directory/SubSubFolder2", ferencd@0: "/.Folder.directory/.SubFolder.directory/SubSubFolder2/new", ferencd@0: "/.Folder.directory/.SubFolder.directory/SubSubFolder2/tmp", ferencd@0: "/.Folder.directory/.SubFolder.directory/SubSubFolder2/cur", ferencd@0: "/Folder2", ferencd@0: "/Folder2/new", ferencd@0: "/Folder2/tmp", ferencd@0: "/Folder2/cur", ferencd@0: "*" // end ferencd@0: }; ferencd@0: ferencd@0: static const vmime::string TEST_MAILDIRFILES_KMAIL[] = // files to create and their contents ferencd@0: { ferencd@0: "/.Folder.directory/.SubFolder.directory/SubSubFolder2/cur/1043236113.351.EmqD:S", TEST_MESSAGE_1, ferencd@0: "*" // end ferencd@0: }; ferencd@0: ferencd@0: // Courier format ferencd@0: static const vmime::string TEST_MAILDIR_COURIER[] = // directories to create ferencd@0: { ferencd@0: "/.Folder", ferencd@0: "/.Folder/new", ferencd@0: "/.Folder/tmp", ferencd@0: "/.Folder/cur", ferencd@0: "/.Folder.SubFolder", ferencd@0: "/.Folder.SubFolder", ferencd@0: "/.Folder.SubFolder/new", ferencd@0: "/.Folder.SubFolder/tmp", ferencd@0: "/.Folder.SubFolder/cur", ferencd@0: "/.Folder.SubFolder.SubSubFolder1", ferencd@0: "/.Folder.SubFolder.SubSubFolder1/new", ferencd@0: "/.Folder.SubFolder.SubSubFolder1/tmp", ferencd@0: "/.Folder.SubFolder.SubSubFolder1/cur", ferencd@0: "/.Folder.SubFolder.SubSubFolder2", ferencd@0: "/.Folder.SubFolder.SubSubFolder2/new", ferencd@0: "/.Folder.SubFolder.SubSubFolder2/tmp", ferencd@0: "/.Folder.SubFolder.SubSubFolder2/cur", ferencd@0: "/.Folder2", ferencd@0: "/.Folder2/new", ferencd@0: "/.Folder2/tmp", ferencd@0: "/.Folder2/cur", ferencd@0: "*" // end ferencd@0: }; ferencd@0: ferencd@0: static const vmime::string TEST_MAILDIRFILES_COURIER[] = // files to create and their contents ferencd@0: { ferencd@0: "/.Folder/maildirfolder", "", ferencd@0: "/.Folder.SubFolder/maildirfolder", "", ferencd@0: "/.Folder.SubFolder.SubSubFolder1/maildirfolder", "", ferencd@0: "/.Folder.SubFolder.SubSubFolder2/maildirfolder", "", ferencd@0: "/.Folder.SubFolder.SubSubFolder2/cur/1043236113.351.EmqD:S", TEST_MESSAGE_1, ferencd@0: "/.Folder2/maildirfolder", "", ferencd@0: "*" // end ferencd@0: }; ferencd@0: ferencd@0: ferencd@0: ferencd@0: VMIME_TEST_SUITE_BEGIN(maildirStoreTest) ferencd@0: ferencd@0: VMIME_TEST_LIST_BEGIN ferencd@0: VMIME_TEST(testDetectFormat_KMail) ferencd@0: VMIME_TEST(testDetectFormat_Courier) ferencd@0: ferencd@0: VMIME_TEST(testListRootFolders_KMail) ferencd@0: VMIME_TEST(testListAllFolders_KMail) ferencd@0: ferencd@0: VMIME_TEST(testListRootFolders_Courier) ferencd@0: VMIME_TEST(testListAllFolders_Courier) ferencd@0: ferencd@0: VMIME_TEST(testListMessages_KMail) ferencd@0: VMIME_TEST(testListMessages_Courier) ferencd@0: ferencd@0: VMIME_TEST(testRenameFolder_KMail) ferencd@0: VMIME_TEST(testRenameFolder_Courier) ferencd@0: ferencd@0: VMIME_TEST(testDestroyFolder_KMail) ferencd@0: VMIME_TEST(testDestroyFolder_Courier) ferencd@0: ferencd@0: VMIME_TEST(testFolderExists_KMail) ferencd@0: VMIME_TEST(testFolderExists_Courier) ferencd@0: ferencd@0: VMIME_TEST(testCreateFolder_KMail) ferencd@0: VMIME_TEST(testCreateFolder_Courier) ferencd@0: VMIME_TEST_LIST_END ferencd@0: ferencd@0: ferencd@0: public: ferencd@0: ferencd@0: maildirStoreTest() ferencd@0: { ferencd@0: // Temporary directory ferencd@0: m_tempPath = fspath() / fspathc("tmp") // Use /tmp ferencd@0: / fspathc("vmime" + vmime::utility::stringUtils::toString(std::time(NULL)) ferencd@0: + vmime::utility::stringUtils::toString(std::rand())); ferencd@0: } ferencd@0: ferencd@0: void tearDown() ferencd@0: { ferencd@0: // In case of an uncaught exception ferencd@0: destroyMaildir(); ferencd@0: } ferencd@0: ferencd@0: void testDetectFormat_KMail() ferencd@0: { ferencd@0: createMaildir(TEST_MAILDIR_KMAIL, TEST_MAILDIRFILES_KMAIL); ferencd@0: ferencd@0: vmime::shared_ptr store = ferencd@0: vmime::dynamicCast (createAndConnectStore()); ferencd@0: ferencd@0: VASSERT_EQ("*", "kmail", store->getFormat()->getName()); ferencd@0: ferencd@0: destroyMaildir(); ferencd@0: } ferencd@0: ferencd@0: void testDetectFormat_Courier() ferencd@0: { ferencd@0: createMaildir(TEST_MAILDIR_COURIER, TEST_MAILDIRFILES_COURIER); ferencd@0: ferencd@0: vmime::shared_ptr store = ferencd@0: vmime::dynamicCast (createAndConnectStore()); ferencd@0: ferencd@0: VASSERT_EQ("*", "courier", store->getFormat()->getName()); ferencd@0: ferencd@0: destroyMaildir(); ferencd@0: } ferencd@0: ferencd@0: ferencd@0: void testListRootFolders_KMail() ferencd@0: { ferencd@0: testListRootFoldersImpl(TEST_MAILDIR_KMAIL, TEST_MAILDIRFILES_KMAIL); ferencd@0: } ferencd@0: ferencd@0: void testListRootFolders_Courier() ferencd@0: { ferencd@0: testListRootFoldersImpl(TEST_MAILDIR_COURIER, TEST_MAILDIRFILES_COURIER); ferencd@0: } ferencd@0: ferencd@0: void testListRootFoldersImpl(const vmime::string* const dirs, const vmime::string* const files) ferencd@0: { ferencd@0: createMaildir(dirs, files); ferencd@0: ferencd@0: // Connect to store ferencd@0: vmime::shared_ptr store = createAndConnectStore(); ferencd@0: vmime::shared_ptr rootFolder = store->getRootFolder(); ferencd@0: ferencd@0: // Get root folders, not recursive ferencd@0: const std::vector > ferencd@0: rootFolders = rootFolder->getFolders(false); ferencd@0: ferencd@0: VASSERT_EQ("1", 2, rootFolders.size()); ferencd@0: VASSERT("2", findFolder(rootFolders, fpath() / "Folder") != NULL); ferencd@0: VASSERT("3", findFolder(rootFolders, fpath() / "Folder2") != NULL); ferencd@0: ferencd@0: destroyMaildir(); ferencd@0: } ferencd@0: ferencd@0: ferencd@0: void testListAllFolders_KMail() ferencd@0: { ferencd@0: testListAllFoldersImpl(TEST_MAILDIR_KMAIL, TEST_MAILDIRFILES_KMAIL); ferencd@0: } ferencd@0: ferencd@0: void testListAllFolders_Courier() ferencd@0: { ferencd@0: testListAllFoldersImpl(TEST_MAILDIR_COURIER, TEST_MAILDIRFILES_COURIER); ferencd@0: } ferencd@0: ferencd@0: void testListAllFoldersImpl(const vmime::string* const dirs, const vmime::string* const files) ferencd@0: { ferencd@0: createMaildir(dirs, files); ferencd@0: ferencd@0: // Connect to store ferencd@0: vmime::shared_ptr store = createAndConnectStore(); ferencd@0: vmime::shared_ptr rootFolder = store->getRootFolder(); ferencd@0: ferencd@0: // Get all folders, recursive ferencd@0: const std::vector > ferencd@0: allFolders = rootFolder->getFolders(true); ferencd@0: ferencd@0: VASSERT_EQ("1", 5, allFolders.size()); ferencd@0: VASSERT("2", findFolder(allFolders, fpath() / "Folder") != NULL); ferencd@0: VASSERT("3", findFolder(allFolders, fpath() / "Folder" / "SubFolder") != NULL); ferencd@0: VASSERT("4", findFolder(allFolders, fpath() / "Folder" / "SubFolder" / "SubSubFolder1") != NULL); ferencd@0: VASSERT("5", findFolder(allFolders, fpath() / "Folder" / "SubFolder" / "SubSubFolder2") != NULL); ferencd@0: VASSERT("6", findFolder(allFolders, fpath() / "Folder2") != NULL); ferencd@0: ferencd@0: destroyMaildir(); ferencd@0: } ferencd@0: ferencd@0: ferencd@0: void testListMessages_KMail() ferencd@0: { ferencd@0: testListMessagesImpl(TEST_MAILDIR_KMAIL, TEST_MAILDIRFILES_KMAIL); ferencd@0: } ferencd@0: ferencd@0: void testListMessages_Courier() ferencd@0: { ferencd@0: testListMessagesImpl(TEST_MAILDIR_COURIER, TEST_MAILDIRFILES_COURIER); ferencd@0: } ferencd@0: ferencd@0: void testListMessagesImpl(const vmime::string* const dirs, const vmime::string* const files) ferencd@0: { ferencd@0: createMaildir(dirs, files); ferencd@0: ferencd@0: vmime::shared_ptr store = createAndConnectStore(); ferencd@0: vmime::shared_ptr rootFolder = store->getRootFolder(); ferencd@0: ferencd@0: vmime::shared_ptr folder = store->getFolder ferencd@0: (fpath() / "Folder" / "SubFolder" / "SubSubFolder2"); ferencd@0: ferencd@0: int count, unseen; ferencd@0: folder->status(count, unseen); ferencd@0: ferencd@0: VASSERT_EQ("Message count", 1, count); ferencd@0: ferencd@0: folder->open(vmime::net::folder::MODE_READ_ONLY); ferencd@0: ferencd@0: vmime::shared_ptr msg = folder->getMessage(1); ferencd@0: ferencd@0: folder->fetchMessage(msg, vmime::net::fetchAttributes::SIZE); ferencd@0: ferencd@0: VASSERT_EQ("Message size", TEST_MESSAGE_1.length(), msg->getSize()); ferencd@0: ferencd@0: std::ostringstream oss; ferencd@0: vmime::utility::outputStreamAdapter os(oss); ferencd@0: msg->extract(os); ferencd@0: ferencd@0: VASSERT_EQ("Message contents", TEST_MESSAGE_1, oss.str()); ferencd@0: ferencd@0: folder->close(false); ferencd@0: ferencd@0: destroyMaildir(); ferencd@0: } ferencd@0: ferencd@0: ferencd@0: void testRenameFolder_KMail() ferencd@0: { ferencd@0: try ferencd@0: { ferencd@0: testRenameFolderImpl(TEST_MAILDIR_KMAIL, TEST_MAILDIRFILES_KMAIL); ferencd@0: } ferencd@0: catch (vmime::exception& e) ferencd@0: { ferencd@0: std::cerr << e; ferencd@0: throw e; ferencd@0: } ferencd@0: } ferencd@0: ferencd@0: void testRenameFolder_Courier() ferencd@0: { ferencd@0: try ferencd@0: { ferencd@0: testRenameFolderImpl(TEST_MAILDIR_COURIER, TEST_MAILDIRFILES_COURIER); ferencd@0: } ferencd@0: catch (vmime::exception& e) ferencd@0: { ferencd@0: std::cerr << e; ferencd@0: throw e; ferencd@0: } ferencd@0: } ferencd@0: ferencd@0: void testRenameFolderImpl(const vmime::string* const dirs, const vmime::string* const files) ferencd@0: { ferencd@0: createMaildir(dirs, files); ferencd@0: ferencd@0: vmime::shared_ptr store = createAndConnectStore(); ferencd@0: vmime::shared_ptr rootFolder = store->getRootFolder(); ferencd@0: ferencd@0: // Rename "Folder/SubFolder" to "Folder/foo" ferencd@0: vmime::shared_ptr folder = store->getFolder ferencd@0: (fpath() / "Folder" / "SubFolder"); ferencd@0: ferencd@0: folder->rename(fpath() / "Folder" / "foo"); ferencd@0: ferencd@0: // Ensure folder and its subfolders have been renamed ferencd@0: const std::vector > ferencd@0: allFolders = rootFolder->getFolders(true); ferencd@0: ferencd@0: VASSERT_EQ("1", 5, allFolders.size()); ferencd@0: VASSERT("2", findFolder(allFolders, fpath() / "Folder") != NULL); ferencd@0: VASSERT("3", findFolder(allFolders, fpath() / "Folder" / "SubFolder") == NULL); ferencd@0: VASSERT("4", findFolder(allFolders, fpath() / "Folder" / "SubFolder" / "SubSubFolder1") == NULL); ferencd@0: VASSERT("5", findFolder(allFolders, fpath() / "Folder" / "SubFolder" / "SubSubFolder2") == NULL); ferencd@0: VASSERT("6", findFolder(allFolders, fpath() / "Folder2") != NULL); ferencd@0: VASSERT("7", findFolder(allFolders, fpath() / "Folder" / "foo") != NULL); ferencd@0: VASSERT("8", findFolder(allFolders, fpath() / "Folder" / "foo" / "SubSubFolder1") != NULL); ferencd@0: VASSERT("9", findFolder(allFolders, fpath() / "Folder" / "foo" / "SubSubFolder2") != NULL); ferencd@0: ferencd@0: destroyMaildir(); ferencd@0: } ferencd@0: ferencd@0: ferencd@0: void testDestroyFolder_KMail() ferencd@0: { ferencd@0: testDestroyFolderImpl(TEST_MAILDIR_KMAIL, TEST_MAILDIRFILES_KMAIL); ferencd@0: } ferencd@0: ferencd@0: void testDestroyFolder_Courier() ferencd@0: { ferencd@0: testDestroyFolderImpl(TEST_MAILDIR_COURIER, TEST_MAILDIRFILES_COURIER); ferencd@0: } ferencd@0: ferencd@0: void testDestroyFolderImpl(const vmime::string* const dirs, const vmime::string* const files) ferencd@0: { ferencd@0: createMaildir(dirs, files); ferencd@0: ferencd@0: vmime::shared_ptr store = createAndConnectStore(); ferencd@0: vmime::shared_ptr rootFolder = store->getRootFolder(); ferencd@0: ferencd@0: // Destroy "Folder/SubFolder" (total: 3 folders) ferencd@0: vmime::shared_ptr folder = store->getFolder ferencd@0: (fpath() / "Folder" / "SubFolder"); ferencd@0: ferencd@0: folder->destroy(); ferencd@0: ferencd@0: // Ensure folder and its subfolders have been deleted and other folders still exist ferencd@0: const std::vector > ferencd@0: allFolders = rootFolder->getFolders(true); ferencd@0: ferencd@0: VASSERT_EQ("1", 2, allFolders.size()); ferencd@0: VASSERT("2", findFolder(allFolders, fpath() / "Folder") != NULL); ferencd@0: VASSERT("3", findFolder(allFolders, fpath() / "Folder" / "SubFolder") == NULL); ferencd@0: VASSERT("4", findFolder(allFolders, fpath() / "Folder" / "SubFolder" / "SubSubFolder1") == NULL); ferencd@0: VASSERT("5", findFolder(allFolders, fpath() / "Folder" / "SubFolder" / "SubSubFolder2") == NULL); ferencd@0: VASSERT("6", findFolder(allFolders, fpath() / "Folder2") != NULL); ferencd@0: ferencd@0: destroyMaildir(); ferencd@0: } ferencd@0: ferencd@0: ferencd@0: void testFolderExists_KMail() ferencd@0: { ferencd@0: testFolderExistsImpl(TEST_MAILDIR_KMAIL, TEST_MAILDIRFILES_KMAIL); ferencd@0: } ferencd@0: ferencd@0: void testFolderExists_Courier() ferencd@0: { ferencd@0: testFolderExistsImpl(TEST_MAILDIR_COURIER, TEST_MAILDIRFILES_COURIER); ferencd@0: } ferencd@0: ferencd@0: void testFolderExistsImpl(const vmime::string* const dirs, const vmime::string* const files) ferencd@0: { ferencd@0: createMaildir(dirs, files); ferencd@0: ferencd@0: vmime::shared_ptr store = createAndConnectStore(); ferencd@0: vmime::shared_ptr rootFolder = store->getRootFolder(); ferencd@0: ferencd@0: VASSERT("1", store->getFolder(fpath() / "Folder" / "SubFolder")->exists()); ferencd@0: VASSERT("2", !store->getFolder(fpath() / "Folder" / "SubSubFolder1")->exists()); ferencd@0: VASSERT("3", store->getFolder(fpath() / "Folder2")->exists()); ferencd@0: VASSERT("4", store->getFolder(fpath() / "Folder" / "SubFolder" / "SubSubFolder2")->exists()); ferencd@0: ferencd@0: destroyMaildir(); ferencd@0: } ferencd@0: ferencd@0: ferencd@0: void testCreateFolder_KMail() ferencd@0: { ferencd@0: testCreateFolderImpl(TEST_MAILDIR_KMAIL, TEST_MAILDIRFILES_KMAIL); ferencd@0: } ferencd@0: ferencd@0: void testCreateFolder_Courier() ferencd@0: { ferencd@0: testCreateFolderImpl(TEST_MAILDIR_COURIER, TEST_MAILDIRFILES_COURIER); ferencd@0: } ferencd@0: ferencd@0: void testCreateFolderImpl(const vmime::string* const dirs, const vmime::string* const files) ferencd@0: { ferencd@0: createMaildir(dirs, files); ferencd@0: ferencd@0: vmime::shared_ptr store = createAndConnectStore(); ferencd@0: vmime::shared_ptr rootFolder = store->getRootFolder(); ferencd@0: ferencd@0: VASSERT("Before", !store->getFolder(fpath() / "Folder" / "NewFolder")->exists()); ferencd@0: ferencd@0: vmime::net::folderAttributes attribs; ferencd@0: attribs.setType(vmime::net::folderAttributes::TYPE_CONTAINS_MESSAGES); ferencd@0: ferencd@0: VASSERT_NO_THROW("Creation", store->getFolder(fpath() / "Folder" / "NewFolder")->create(attribs)); ferencd@0: ferencd@0: VASSERT("After", store->getFolder(fpath() / "Folder" / "NewFolder")->exists()); ferencd@0: ferencd@0: destroyMaildir(); ferencd@0: } ferencd@0: ferencd@0: private: ferencd@0: ferencd@0: vmime::utility::file::path m_tempPath; ferencd@0: ferencd@0: ferencd@0: vmime::shared_ptr createAndConnectStore() ferencd@0: { ferencd@0: vmime::shared_ptr session = ferencd@0: vmime::make_shared (); ferencd@0: ferencd@0: vmime::shared_ptr store = ferencd@0: session->getStore(getStoreURL()); ferencd@0: ferencd@0: store->connect(); ferencd@0: ferencd@0: return store; ferencd@0: } ferencd@0: ferencd@0: const vmime::shared_ptr findFolder ferencd@0: (const std::vector >& folders, ferencd@0: const vmime::net::folder::path& path) ferencd@0: { ferencd@0: for (unsigned int i = 0, n = folders.size() ; i < n ; ++i) ferencd@0: { ferencd@0: if (folders[i]->getFullPath() == path) ferencd@0: return folders[i]; ferencd@0: } ferencd@0: ferencd@0: return vmime::null; ferencd@0: } ferencd@0: ferencd@0: const vmime::utility::url getStoreURL() ferencd@0: { ferencd@0: vmime::shared_ptr fsf = ferencd@0: vmime::platform::getHandler()->getFileSystemFactory(); ferencd@0: ferencd@0: vmime::utility::url url(std::string("maildir://localhost") ferencd@0: + fsf->pathToString(m_tempPath)); ferencd@0: ferencd@0: return url; ferencd@0: } ferencd@0: ferencd@0: void createMaildir(const vmime::string* const dirs, const vmime::string* const files) ferencd@0: { ferencd@0: vmime::shared_ptr fsf = ferencd@0: vmime::platform::getHandler()->getFileSystemFactory(); ferencd@0: ferencd@0: vmime::shared_ptr rootDir = fsf->create(m_tempPath); ferencd@0: rootDir->createDirectory(false); ferencd@0: ferencd@0: for (vmime::string const* dir = dirs ; *dir != "*" ; ++dir) ferencd@0: { ferencd@0: vmime::shared_ptr fdir = fsf->create(m_tempPath / fsf->stringToPath(*dir)); ferencd@0: fdir->createDirectory(false); ferencd@0: } ferencd@0: ferencd@0: for (vmime::string const* file = files ; *file != "*" ; file += 2) ferencd@0: { ferencd@0: const vmime::string& contents = *(file + 1); ferencd@0: ferencd@0: vmime::shared_ptr ffile = fsf->create(m_tempPath / fsf->stringToPath(*file)); ferencd@0: ffile->createFile(); ferencd@0: ferencd@0: vmime::shared_ptr fileWriter = ffile->getFileWriter(); ferencd@0: vmime::shared_ptr os = fileWriter->getOutputStream(); ferencd@0: ferencd@0: os->write(contents.data(), contents.length()); ferencd@0: os->flush(); ferencd@0: ferencd@0: fileWriter = vmime::null; ferencd@0: } ferencd@0: ferencd@0: } ferencd@0: ferencd@0: void destroyMaildir() ferencd@0: { ferencd@0: vmime::shared_ptr fsf = ferencd@0: vmime::platform::getHandler()->getFileSystemFactory(); ferencd@0: ferencd@0: recursiveDelete(fsf->create(m_tempPath)); ferencd@0: } ferencd@0: ferencd@0: void recursiveDelete(vmime::shared_ptr dir) ferencd@0: { ferencd@0: if (!dir->exists() || !dir->isDirectory()) ferencd@0: return; ferencd@0: ferencd@0: vmime::shared_ptr files = dir->getFiles(); ferencd@0: ferencd@0: // First, delete files and subdirectories in this directory ferencd@0: while (files->hasMoreElements()) ferencd@0: { ferencd@0: vmime::shared_ptr file = files->nextElement(); ferencd@0: ferencd@0: if (file->isDirectory()) ferencd@0: { ferencd@0: recursiveDelete(file); ferencd@0: } ferencd@0: else ferencd@0: { ferencd@0: try ferencd@0: { ferencd@0: file->remove(); ferencd@0: } ferencd@0: catch (vmime::exceptions::filesystem_exception&) ferencd@0: { ferencd@0: // Ignore ferencd@0: } ferencd@0: } ferencd@0: } ferencd@0: ferencd@0: // Then, delete this (empty) directory ferencd@0: try ferencd@0: { ferencd@0: dir->remove(); ferencd@0: } ferencd@0: catch (vmime::exceptions::filesystem_exception&) ferencd@0: { ferencd@0: // Ignore ferencd@0: } ferencd@0: } ferencd@0: ferencd@0: VMIME_TEST_SUITE_END ferencd@0: