From 65be78c906c578b01895313b167085ff980eabd3 Mon Sep 17 00:00:00 2001
From: "jefft%netscape.com" <jefft%netscape.com>
Date: Fri, 30 Apr 1999 21:27:22 +0000
Subject: [PATCH] Part of fixing bug 5781 - fixed creating multiple mail
 folders problem

---
 mailnews/imap/src/nsImapMailFolder.cpp | 149 +++++++++++++------------
 1 file changed, 75 insertions(+), 74 deletions(-)

diff --git a/mailnews/imap/src/nsImapMailFolder.cpp b/mailnews/imap/src/nsImapMailFolder.cpp
index d0c167ff5462f..b997d149a703e 100644
--- a/mailnews/imap/src/nsImapMailFolder.cpp
+++ b/mailnews/imap/src/nsImapMailFolder.cpp
@@ -38,7 +38,7 @@
 #include "nsIMsgMailSession.h"
 #include "nsImapMessage.h"
 #include "nsIWebShell.h"
-#include "nsIMAPHostSessionList.h"
+
 // we need this because of an egcs 1.0 (and possibly gcc) compiler bug
 // that doesn't allow you to call ::nsISupports::GetIID() inside of a class
 // that multiply inherits from nsISupports
@@ -51,7 +51,7 @@ static NS_DEFINE_CID(kCImapDB, NS_IMAPDB_CID);
 static NS_DEFINE_CID(kCImapService, NS_IMAPSERVICE_CID);
 static NS_DEFINE_CID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID);
 static NS_DEFINE_CID(kMsgMailSessionCID, NS_MSGMAILSESSION_CID);
-static NS_DEFINE_CID(kCImapHostSessionList, NS_IIMAPHOSTSESSIONLIST_CID);
+
 ////////////////////////////////////////////////////////////////////////////////
 // for temp message hack
 #ifdef XP_UNIX
@@ -418,6 +418,7 @@ nsresult nsImapMailFolder::GetDatabase()
 	return folderOpen;
 }
 
+#ifdef NO_LONGER_NEEDED
 PRBool
 nsImapMailFolder::FindAndSelectFolder(nsISupports* aElement,
                                       void* aData)
@@ -461,6 +462,7 @@ nsImapMailFolder::FindAndSelectFolder(nsISupports* aElement,
     delete [] folderName;
     return keepGoing;
 }
+#endif 
 
 NS_IMETHODIMP nsImapMailFolder::GetMessages(nsIEnumerator* *result)
 {
@@ -484,18 +486,12 @@ NS_IMETHODIMP nsImapMailFolder::GetMessages(nsIEnumerator* *result)
     {
         if (!m_haveDiscoverAllFolders)
         {
-            nsIMsgFolder* child = nsnull;
-            rv = AddSubfolder("INBOX", &child);
-            
+            rv = CreateSubfolder("Inbox");
             if (NS_FAILED(rv)) return rv;
-
-            rv = imapService->SelectFolder(m_eventQueue, child, this,
-                                           nsnull);
             m_haveDiscoverAllFolders = PR_TRUE;
-            NS_IF_RELEASE(child);
 #if 0
-            mSubFolders->EnumerateForwards(FindAndSelectFolder, 
-                                           (void*) "Inbox");
+            rv = imapService->SelectFolder(m_eventQueue, child, this,
+                                           nsnull);
 #endif 
         }
         rv = NS_ERROR_NULL_POINTER;
@@ -528,6 +524,7 @@ NS_IMETHODIMP nsImapMailFolder::GetMessages(nsIEnumerator* *result)
     }
 	else
 		rv = NS_ERROR_NULL_POINTER;
+
 	return rv;
 }
 
@@ -555,13 +552,17 @@ NS_IMETHODIMP nsImapMailFolder::CreateSubfolder(const char *folderName)
 	if(NS_FAILED(rv))
 		return rv;
 
-
+    nsAutoString leafName = folderName;
+    nsString folderNameStr;
+    PRInt32 folderStart = leafName.RFind('/');
+    if (folderStart > 0)
+        leafName.Right(folderNameStr, leafName.Length() - folderStart -1);
+    else
+        folderNameStr = leafName;
+    
 	//Now we have a valid directory or we have returned.
 	//Make sure the new folder name is valid
-	path += folderName;
-	path.MakeUnique();
-
-//	nsOutputFileStream outputStream(path);	
+	path += folderNameStr;
    
 	// Create an empty database for this mail folder, set its name from the user  
 	nsIMsgDatabase * mailDBFactory = nsnull;
@@ -579,23 +580,17 @@ NS_IMETHODIMP nsImapMailFolder::CreateSubfolder(const char *folderName)
 			rv = unusedDB->GetDBFolderInfo(&folderInfo);
 			if(NS_SUCCEEDED(rv))
 			{
-				nsString folderNameStr(folderName);
 				// ### DMB used to be leafNameFromUser?
 				folderInfo->SetMailboxName(folderNameStr);
 				NS_IF_RELEASE(folderInfo);
 			}
 
 			//Now let's create the actual new folder
-			nsAutoString folderNameStr(folderName);
-			rv = AddSubfolder(folderName, &child);
+			rv = AddSubfolder(folderNameStr, &child);
             unusedDB->SetSummaryValid(PR_TRUE);
             unusedDB->Close(PR_TRUE);
         }
-        else
-        {
-			path.Delete(PR_FALSE);
-            rv = NS_MSG_CANT_CREATE_FOLDER;
-        }
+
 		NS_IF_RELEASE(mailDBFactory);
 	}
 	if(rv == NS_OK && child)
@@ -853,12 +848,61 @@ NS_IMETHODIMP nsImapMailFolder::PossibleImapMailbox(
 {
 	nsresult rv;
     PRBool found = PR_FALSE;
+    nsIMsgFolder* hostFolder = nsnull;
     nsIMsgFolder* aFolder = nsnull;
     nsISupports* aItem;
-    nsIBidirectionalEnumerator *aEnumerator = nsnull;
+    nsIEnumerator *aEnumerator = nsnull;
 
-    rv = NS_NewISupportsArrayEnumerator(mSubFolders, &aEnumerator);
+    NS_WITH_SERVICE(nsIRDFService, rdf, kRDFServiceCID, &rv); 
+ 
+    if(NS_FAILED(rv))
+        return rv;
+    
+    nsAutoString folderName = aSpec->allocatedPathName;
+    nsAutoString uri;
+    uri.Append(kImapRootURI);
+    uri.Append('/');
+    
+    uri.Append(aSpec->hostName);
+    
+    PRInt32 leafPos = folderName.RFind("/", PR_TRUE);
+    if (leafPos > 0)
+    {
+        uri.Append('/');
+        nsAutoString parentName(folderName);
+        parentName.Truncate(leafPos);
+        uri.Append(parentName);
+    }
+    
+    char* uriStr = uri.ToNewCString();
+    if (uriStr == nsnull) 
+        return NS_ERROR_OUT_OF_MEMORY;
+    nsIRDFResource* res;
+    rv = rdf->GetResource(uriStr, &res);
+    delete[] uriStr;
+    if (NS_FAILED(rv))
+        return rv;
+    // OK, this is purely temporary - we either need getParent, or
+    // AddSubFolder should be an nsIMsgFolder interface...
+    rv = res->QueryInterface(nsIMsgFolder::GetIID(), (void**)&hostFolder);
     if (NS_FAILED(rv)) return rv;
+            
+    nsCOMPtr<nsIFolder> a_nsIFolder(do_QueryInterface(hostFolder, &rv));
+    
+    if (NS_FAILED(rv))
+    {
+        NS_RELEASE(hostFolder);
+        return rv;
+    }
+
+    rv = a_nsIFolder->GetSubFolders(&aEnumerator);
+
+    if (NS_FAILED(rv)) 
+    {
+        NS_RELEASE(hostFolder);
+        NS_IF_RELEASE(aEnumerator);
+        return rv;
+    }
     
     rv = aEnumerator->First();
     while (rv == NS_OK)
@@ -876,7 +920,7 @@ NS_IMETHODIMP nsImapMailFolder::PossibleImapMailbox(
             PRBool isInbox = 
                 PL_strcasecmp("inbox", aSpec->allocatedPathName) == 0;
             if (PL_strcmp(aName, aSpec->allocatedPathName) == 0 || 
-                (isInbox && PL_strcasecmp(aName, aSpec->allocatedPathName)))
+                (isInbox && PL_strcasecmp(aName, aSpec->allocatedPathName) == 0))
             {
                 found = PR_TRUE;
                 break;
@@ -886,54 +930,11 @@ NS_IMETHODIMP nsImapMailFolder::PossibleImapMailbox(
     }
     if (!found)
     {
-		nsresult rv = NS_OK;
-        nsIMsgFolder *child = nsnull;
-        nsAutoString folderName = aSpec->allocatedPathName;
-		nsString leafName;
-	    NS_WITH_SERVICE(nsIRDFService, rdf, kRDFServiceCID, &rv); 
-
-		if(NS_FAILED(rv))
-			return rv;
-
-		nsAutoString uri;
-		uri.Append(kImapRootURI);
-		uri.Append('/');
-
-		uri.Append(aSpec->hostName);
-
-		PRInt32 leafPos = folderName.RFind("/", PR_TRUE);
-		if (leafPos > 0)
-		{
-			uri.Append('/');
-			nsAutoString parentName(folderName);
-			parentName.Left(leafName, leafPos);
-			parentName.Truncate(leafPos);
-			uri.Append(parentName);
-		}
-		else
-			leafName = folderName;
-
-		char* uriStr = uri.ToNewCString();
-		if (uriStr == nsnull) 
-			return NS_ERROR_OUT_OF_MEMORY;
-		nsIRDFResource* res;
-		rv = rdf->GetResource(uriStr, &res);
-		delete[] uriStr;
-		if (NS_FAILED(rv))
-			return rv;
-		// OK, this is purely temporary - we either need getParent, or
-		// AddSubFolder should be an nsIMsgFolder interface...
-		nsIMsgFolder *folder;
-		if(NS_SUCCEEDED(res->QueryInterface(nsIMsgFolder::GetIID(), (void**)&folder)))
-		{
-			nsImapMailFolder *imapParent = nsnull;
-			imapParent = NS_STATIC_CAST(nsImapMailFolder*, folder);
-			rv = imapParent->CreateSubfolder(nsAutoCString(leafName));
-//			NS_IF_RELEASE(child);
-			NS_IF_RELEASE(folder);
-		}
+        hostFolder->CreateSubfolder(aSpec->allocatedPathName);
     }
-    aEnumerator->Release();
+    
+    NS_RELEASE(hostFolder);
+    NS_RELEASE(aEnumerator);
 	return NS_OK;
 }
 
-- 
GitLab