Bug #5781 --> part of mailnews audit --> Conversion to NS_WITH_SERVICE. Hook up a connection cache to CreateImapConnection.

a=chofmann
This commit is contained in:
mscott%netscape.com 1999-04-30 18:45:16 +00:00
Родитель 3b9514174c
Коммит ac59eff271
2 изменённых файлов: 57 добавлений и 38 удалений

Просмотреть файл

@ -61,6 +61,9 @@ nsImapService::nsImapService()
// on the host session list... // on the host session list...
nsresult rv = nsServiceManager::GetService(kCImapHostSessionList, nsIImapHostSessionList::GetIID(), nsresult rv = nsServiceManager::GetService(kCImapHostSessionList, nsIImapHostSessionList::GetIID(),
(nsISupports**)&m_sessionList); (nsISupports**)&m_sessionList);
// I don't know how we're going to report this error if we failed to create the isupports array...
rv = NS_NewISupportsArray(getter_AddRefs(m_connectionCache));
} }
nsImapService::~nsImapService() nsImapService::~nsImapService()
@ -101,17 +104,41 @@ nsresult nsImapService::QueryInterface(const nsIID &aIID, void** aInstancePtr)
} }
NS_IMETHODIMP NS_IMETHODIMP
nsImapService::CreateImapConnection(PLEventQueue *aEventQueue, nsImapService::CreateImapConnection(PLEventQueue *aEventQueue, nsIImapUrl * aImapUrl,
nsIImapProtocol ** aImapConnection) nsIImapProtocol ** aImapConnection)
{ {
nsIImapProtocol * protocolInstance = nsnull;
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (aImapConnection) PRBool canRunUrl = PR_FALSE;
nsCOMPtr<nsIImapProtocol> connection;
// iterate through the connection cache for a connection that can handle this url.
for (PRInt32 i = 0; i < m_connectionCache->Count() && !canRunUrl; i++)
{ {
connection = do_QueryInterface(m_connectionCache->ElementAt(i));
if (connection)
connection->CanHandleUrl(aImapUrl, canRunUrl);
}
// if we got here and we have a connection, then we should return it!
if (canRunUrl && connection)
{
*aImapConnection = connection;
NS_IF_ADDREF(*aImapConnection);
}
else
{
// create a new connection and add it to the connection cache
// we may need to flag the protocol connection as busy so we don't get a race
// condition where someone else goes through this code
nsIImapProtocol * protocolInstance = nsnull;
rv = nsComponentManager::CreateInstance(kImapProtocolCID, nsnull, nsIImapProtocol::GetIID(), (void **) &protocolInstance); rv = nsComponentManager::CreateInstance(kImapProtocolCID, nsnull, nsIImapProtocol::GetIID(), (void **) &protocolInstance);
if (NS_SUCCEEDED(rv) && protocolInstance) if (NS_SUCCEEDED(rv) && protocolInstance)
rv = protocolInstance->Initialize(m_sessionList, aEventQueue); rv = protocolInstance->Initialize(m_sessionList, aEventQueue);
*aImapConnection = protocolInstance;
// take the protocol instance and add it to the connectionCache
if (protocolInstance)
m_connectionCache->AppendElement(protocolInstance);
*aImapConnection = protocolInstance; // this is already ref counted.
} }
return rv; return rv;
@ -230,21 +257,13 @@ NS_IMETHODIMP nsImapService::DisplayMessage(const char* aMessageURI, nsISupports
nsIImapUrl * url = nsnull; nsIImapUrl * url = nsnull;
nsresult rv = NS_OK; nsresult rv = NS_OK;
PLEventQueue *queue; PLEventQueue *queue;
nsIRDFService* rdf = nsnull;
// get the Event Queue for this thread... // get the Event Queue for this thread...
nsIEventQueueService* pEventQService = nsnull; NS_WITH_SERVICE(nsIEventQueueService, pEventQService, kEventQueueServiceCID, &rv);
rv = nsServiceManager::GetService(kEventQueueServiceCID,
nsIEventQueueService::GetIID(),
(nsISupports**)&pEventQService);
if (NS_SUCCEEDED(rv) && pEventQService)
{
rv = pEventQService->GetThreadEventQueue(PR_GetCurrentThread(),&queue);
NS_RELEASE(pEventQService);
rv = nsServiceManager::GetService(kRDFServiceCID,
nsIRDFService::GetIID(),
(nsISupports**)&rdf);
} if (NS_SUCCEEDED(rv) && pEventQService)
rv = pEventQService->GetThreadEventQueue(PR_GetCurrentThread(),&queue);
NS_WITH_SERVICE(nsIRDFService, rdf, kRDFServiceCID, &rv);
nsString folderURI; nsString folderURI;
nsMsgKey msgKey; nsMsgKey msgKey;
@ -270,11 +289,6 @@ NS_IMETHODIMP nsImapService::DisplayMessage(const char* aMessageURI, nsISupports
} }
} }
if (rdf)
(void)nsServiceManager::ReleaseService(kRDFServiceCID, rdf);
if (pEventQService)
(void)nsServiceManager::ReleaseService(kRDFServiceCID, pEventQService);
return rv; return rv;
} }
@ -349,23 +363,21 @@ nsImapService::FetchMessage(PLEventQueue * aClientEventQueue,
nsresult nsImapService::GetImapConnectionAndUrl(PLEventQueue * aClientEventQueue, nsIImapUrl * &imapUrl, nsresult nsImapService::GetImapConnectionAndUrl(PLEventQueue * aClientEventQueue, nsIImapUrl * &imapUrl,
nsIImapProtocol * &protocolInstance, nsString2 &urlSpec) nsIImapProtocol * &protocolInstance, nsString2 &urlSpec)
{ {
// create a protocol instance to handle the request. nsresult rv = NS_OK;
// NOTE: once we start working with multiple connections, this step will be much more complicated...but for now
// just create a connection and process the request.
nsresult rv = CreateImapConnection(aClientEventQueue, &protocolInstance);
if (NS_SUCCEEDED(rv) && protocolInstance) // now we need to create an imap url to load into the connection. The url needs to represent a select folder action.
{ rv = nsComponentManager::CreateInstance(kImapUrlCID, nsnull,
// now we need to create an imap url to load into the connection. The url needs to represent a select folder action.
rv = nsComponentManager::CreateInstance(kImapUrlCID, nsnull,
nsIImapUrl::GetIID(), (void **) nsIImapUrl::GetIID(), (void **)
&imapUrl); &imapUrl);
if (NS_SUCCEEDED(rv) && imapUrl) if (NS_SUCCEEDED(rv) && imapUrl)
rv = CreateStartOfImapUrl(*imapUrl, urlSpec); rv = CreateStartOfImapUrl(*imapUrl, urlSpec);
else
NS_RELEASE(protocolInstance); // Create a imap connection to run the url inside of....
} rv = CreateImapConnection(aClientEventQueue, imapUrl, &protocolInstance);
if (NS_FAILED(rv))
NS_IF_RELEASE(imapUrl); // release the imap url before we return it because the whole command failed...
return rv; return rv;
} }

Просмотреть файл

@ -21,6 +21,8 @@
#include "nsIImapService.h" #include "nsIImapService.h"
#include "nsIMsgMessageService.h" #include "nsIMsgMessageService.h"
#include "nsISupportsArray.h"
#include "nsCOMPtr.h"
class nsIImapHostSessionList; class nsIImapHostSessionList;
class nsString2; class nsString2;
@ -40,7 +42,7 @@ public:
// we suppport the nsIImapService interface // we suppport the nsIImapService interface
//////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////
NS_IMETHOD CreateImapConnection (PLEventQueue *aEventQueue, NS_IMETHOD CreateImapConnection (PLEventQueue *aEventQueue, nsIImapUrl * aImapUrl,
nsIImapProtocol ** aImapConnection); nsIImapProtocol ** aImapConnection);
NS_IMETHOD SelectFolder(PLEventQueue * aClientEventQueue, NS_IMETHOD SelectFolder(PLEventQueue * aClientEventQueue,
@ -158,7 +160,12 @@ protected:
imapMessageFlagsType flags, imapMessageFlagsType flags,
PRBool messageIdsAreUID); PRBool messageIdsAreUID);
nsIImapHostSessionList * m_sessionList; // the one and only list of all host sessions... nsIImapHostSessionList * m_sessionList; // the one and only list of all host sessions...
// the connection cache right now is just a simple array of open nsIImapProtocol instances.
// we just iterate over all known connections and see if one of the connections can run
// our current request...we can look into making a more sophisticated cache later...
nsCOMPtr<nsISupportsArray> m_connectionCache;
}; };
#endif /* nsImapService_h___ */ #endif /* nsImapService_h___ */