void IMAPFolders::CreatePath(shared_ptr<IMAPFolders> pParentContainer, const std::vector<String> &vecFolderPath, bool bAutoSubscribe) { CriticalSectionScope scope(_lock); String hierarchyDelimiter = Configuration::Instance()->GetIMAPConfiguration()->GetHierarchyDelimiter(); LOG_DEBUG("Creating IMAP folder " + StringParser::JoinVector(vecFolderPath, hierarchyDelimiter)); std::vector<String> vecTempPath = vecFolderPath; shared_ptr<IMAPFolder> pParentFolder; while (vecTempPath.size() > 0) { // Get first level. String sTopLevel = vecTempPath[0]; shared_ptr<IMAPFolder> pParentCheck = pParentContainer->GetFolderByName(sTopLevel, false); if (pParentCheck) { // This folder already exists. Create next level. pParentContainer = pParentCheck->GetSubFolders(); pParentFolder = pParentCheck; vecTempPath = StringParser::GetAllButFirst(vecTempPath); continue; } __int64 iParentFolderID = -1; if (pParentFolder) iParentFolderID = pParentFolder->GetID(); shared_ptr<IMAPFolder> pFolder = shared_ptr<IMAPFolder>(new IMAPFolder(m_iAccountID, iParentFolderID)); pFolder->SetFolderName(sTopLevel); pFolder->SetIsSubscribed(bAutoSubscribe); PersistentIMAPFolder::SaveObject(pFolder); // Add the folder to the collection. pParentContainer->AddItem(pFolder); // Go down one folder. pParentContainer = pFolder->GetSubFolders(); vecTempPath = StringParser::GetAllButFirst(vecTempPath); pParentFolder = pFolder; } }