NS_IMETHODIMP nsMsgBrkMBoxStore::DiscoverSubFolders(nsIMsgFolder *aParentFolder, bool aDeep) { NS_ENSURE_ARG_POINTER(aParentFolder); nsCOMPtr<nsIFile> path; nsresult rv = aParentFolder->GetFilePath(getter_AddRefs(path)); if (NS_FAILED(rv)) return rv; bool exists; path->Exists(&exists); if (!exists) path->Create(nsIFile::DIRECTORY_TYPE, 0755); return AddSubFolders(aParentFolder, path, aDeep); }
NS_IMETHODIMP nsMsgMaildirStore::DiscoverSubFolders(nsIMsgFolder *aParentFolder, bool aDeep) { NS_ENSURE_ARG_POINTER(aParentFolder); nsCOMPtr<nsIFile> path; nsresult rv = aParentFolder->GetFilePath(getter_AddRefs(path)); NS_ENSURE_SUCCESS(rv, rv); bool isServer, directory = false; aParentFolder->GetIsServer(&isServer); if (!isServer) GetDirectoryForFolder(path); path->IsDirectory(&directory); if (directory) rv = AddSubFolders(aParentFolder, path, aDeep); return (rv == NS_MSG_FOLDER_EXISTS) ? NS_OK : rv; }
// Iterates over the files in the "path" directory, and adds subfolders to // parent for each mailbox file found. nsresult nsMsgBrkMBoxStore::AddSubFolders(nsIMsgFolder *parent, nsCOMPtr<nsIFile> &path, bool deep) { nsresult rv; nsCOMPtr<nsIFile> tmp; // at top level so we can safely assign to path bool isDirectory; path->IsDirectory(&isDirectory); if (!isDirectory) { rv = path->Clone(getter_AddRefs(tmp)); path = tmp; NS_ENSURE_SUCCESS(rv, rv); nsAutoString leafName; path->GetLeafName(leafName); leafName.AppendLiteral(".sbd"); path->SetLeafName(leafName); path->IsDirectory(&isDirectory); } if (!isDirectory) return NS_OK; // first find out all the current subfolders and files, before using them // while creating new subfolders; we don't want to modify and iterate the same // directory at once. nsCOMArray<nsIFile> currentDirEntries; nsCOMPtr<nsISimpleEnumerator> directoryEnumerator; rv = path->GetDirectoryEntries(getter_AddRefs(directoryEnumerator)); NS_ENSURE_SUCCESS(rv, rv); bool hasMore; while (NS_SUCCEEDED(directoryEnumerator->HasMoreElements(&hasMore)) && hasMore) { nsCOMPtr<nsISupports> aSupport; directoryEnumerator->GetNext(getter_AddRefs(aSupport)); nsCOMPtr<nsIFile> currentFile(do_QueryInterface(aSupport, &rv)); if (currentFile) currentDirEntries.AppendObject(currentFile); } // add the folders int32_t count = currentDirEntries.Count(); for (int32_t i = 0; i < count; ++i) { nsCOMPtr<nsIFile> currentFile(currentDirEntries[i]); nsAutoString leafName; currentFile->GetLeafName(leafName); directoryEnumerator->HasMoreElements(&hasMore); // here we should handle the case where the current file is a .sbd directory // w/o a matching folder file, or a directory w/o the name .sbd if (nsShouldIgnoreFile(leafName)) continue; nsCOMPtr<nsIMsgFolder> child; rv = parent->AddSubfolder(leafName, getter_AddRefs(child)); if (child) { nsString folderName; child->GetName(folderName); // try to get it from cache/db if (folderName.IsEmpty()) child->SetPrettyName(leafName); if (deep) { nsCOMPtr<nsIFile> path; rv = child->GetFilePath(getter_AddRefs(path)); AddSubFolders(child, path, true); } } } return rv == NS_MSG_FOLDER_EXISTS ? NS_OK : rv; }
// Iterates over the folders in the "path" directory, and adds subfolders to // parent for each Maildir folder found. nsresult nsMsgMaildirStore::AddSubFolders(nsIMsgFolder *parent, nsIFile *path, bool deep) { nsCOMArray<nsIFile> currentDirEntries; nsCOMPtr<nsISimpleEnumerator> directoryEnumerator; nsresult rv = path->GetDirectoryEntries(getter_AddRefs(directoryEnumerator)); NS_ENSURE_SUCCESS(rv, rv); bool hasMore; while (NS_SUCCEEDED(directoryEnumerator->HasMoreElements(&hasMore)) && hasMore) { nsCOMPtr<nsISupports> aSupport; directoryEnumerator->GetNext(getter_AddRefs(aSupport)); nsCOMPtr<nsIFile> currentFile(do_QueryInterface(aSupport, &rv)); if (currentFile) { nsAutoString leafName; currentFile->GetLeafName(leafName); bool isDirectory = false; currentFile->IsDirectory(&isDirectory); // Make sure this really is a mail folder dir (i.e., a directory that // contains cur and tmp sub-dirs, and not a .sbd or .mozmsgs dir). if (isDirectory && !nsShouldIgnoreFile(leafName)) currentDirEntries.AppendObject(currentFile); } } // add the folders int32_t count = currentDirEntries.Count(); for (int32_t i = 0; i < count; ++i) { nsCOMPtr<nsIFile> currentFile(currentDirEntries[i]); nsAutoString leafName; currentFile->GetLeafName(leafName); nsCOMPtr<nsIMsgFolder> child; rv = parent->AddSubfolder(leafName, getter_AddRefs(child)); if (child) { nsString folderName; child->GetName(folderName); // try to get it from cache/db if (folderName.IsEmpty()) child->SetPrettyName(leafName); if (deep) { nsCOMPtr<nsIFile> path; rv = child->GetFilePath(getter_AddRefs(path)); NS_ENSURE_SUCCESS(rv, rv); // Construct the .sbd directory path for the possible children of the // folder. GetDirectoryForFolder(path); bool directory = false; // Check that <folder>.sbd really is a directory. path->IsDirectory(&directory); if (directory) AddSubFolders(child, path, true); } } } return rv == NS_MSG_FOLDER_EXISTS ? NS_OK : rv; }