nsresult nsComm4xMail::IterateMailDir(nsIFile *pFolder, nsISupportsArray *pArray, nsIImportService *pImport) { nsCOMPtr<nsISimpleEnumerator> directoryEnumerator; nsresult rv = pFolder->GetDirectoryEntries(getter_AddRefs(directoryEnumerator)); NS_ENSURE_SUCCESS(rv, rv); PRBool hasMore; directoryEnumerator->HasMoreElements(&hasMore); while (hasMore && NS_SUCCEEDED(rv)) { nsCOMPtr<nsISupports> aSupport; rv = directoryEnumerator->GetNext(getter_AddRefs(aSupport)); nsCOMPtr<nsILocalFile> currentFolderPath(do_QueryInterface(aSupport, &rv)); directoryEnumerator->HasMoreElements(&hasMore); PRBool isFile; nsCString pName; nsCString dirName; nsAutoString currentFolderNameStr; PRBool isDirectory, exists; nsAutoString ext; rv = currentFolderPath->GetLeafName(currentFolderNameStr); isFile = PR_FALSE; currentFolderPath->IsFile(&isFile); if (isFile) { if (!nsShouldIgnoreFile(currentFolderNameStr)) { rv = FoundMailbox(currentFolderPath, ¤tFolderNameStr, pArray, pImport); if (NS_FAILED(rv)) return rv; currentFolderNameStr.AppendLiteral(".sbd"); rv = currentFolderPath->SetLeafName(currentFolderNameStr); if (NS_FAILED(rv)) return rv; exists = PR_FALSE; currentFolderPath->Exists(&exists); isDirectory = PR_FALSE; currentFolderPath->IsDirectory(&isDirectory); if (exists && isDirectory) { rv = ScanMailDir (currentFolderPath, pArray, pImport); if (NS_FAILED(rv)) return rv; } } } } return 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; }