From dd707a4593b4154a2826dc01cb38ecbcf281cc39 Mon Sep 17 00:00:00 2001 From: "mscott%netscape.com" Date: Fri, 12 Mar 1999 04:05:40 +0000 Subject: [PATCH] Creating a pop3 protocol should not require a transport. We should do it ourselves. LoadUrL should take a consumer. --- mailnews/local/src/nsPop3Protocol.cpp | 121 ++++++++++++++++---------- mailnews/local/src/nsPop3Protocol.h | 6 +- 2 files changed, 81 insertions(+), 46 deletions(-) diff --git a/mailnews/local/src/nsPop3Protocol.cpp b/mailnews/local/src/nsPop3Protocol.cpp index c67826864dc5..c86f619d0c0e 100644 --- a/mailnews/local/src/nsPop3Protocol.cpp +++ b/mailnews/local/src/nsPop3Protocol.cpp @@ -26,6 +26,10 @@ #include "plstr.h" #include "MailNewsTypes.h" +#include "nsINetService.h" + +static NS_DEFINE_CID(kNetServiceCID, NS_NETSERVICE_CID); + #if 1 // This is a temporary thing. @@ -408,50 +412,79 @@ NS_IMETHODIMP nsPop3Protocol::OnStopBinding(nsIURL* aURL, nsresult aStatus, return NS_OK; // for now } -nsPop3Protocol::nsPop3Protocol(nsIURL* aURL, nsITransport* aTransport) : nsMsgLineBuffer(NULL, FALSE) +nsPop3Protocol::nsPop3Protocol(nsIURL* aURL) : nsMsgLineBuffer(NULL, FALSE) { nsresult rv = 0; - NS_INIT_REFCNT(); - m_username = 0; - m_password = 0; - m_pop3ConData = 0; - m_nsIPop3URL = 0; - m_transport = 0; - m_outputStream = 0; - m_outputConsumer = 0; - m_nsIPop3Sink = 0; + NS_INIT_REFCNT(); + Initialize(aURL); +} + +void nsPop3Protocol::Initialize(nsIURL * aURL) +{ + m_username = nsnull; + m_password = nsnull; + m_pop3ConData = nsnull; + m_nsIPop3URL = nsnull; + m_transport = nsnull; + m_outputStream = nsnull; + m_outputConsumer = nsnull; + m_nsIPop3Sink = nsnull; m_isRunning = PR_FALSE; - m_pop3CapabilityFlags = POP3_AUTH_LOGIN_UNDEFINED | - POP3_XSENDER_UNDEFINED | - POP3_GURL_UNDEFINED | + m_pop3CapabilityFlags = POP3_AUTH_LOGIN_UNDEFINED | + POP3_XSENDER_UNDEFINED | + POP3_GURL_UNDEFINED | POP3_UIDL_UNDEFINED | POP3_TOP_UNDEFINED | - POP3_XTND_XLST_UNDEFINED; + POP3_XTND_XLST_UNDEFINED; - m_pop3ConData = (Pop3ConData *)PR_NEWZAP(Pop3ConData); + m_pop3ConData = (Pop3ConData *)PR_NEWZAP(Pop3ConData); PR_ASSERT(m_pop3ConData); + m_pop3ConData->output_buffer = (char *) PR_MALLOC(OUTPUT_BUFFER_SIZE); + PR_ASSERT(m_pop3ConData->output_buffer); - m_transport = aTransport; - m_outputStream = NULL; - m_outputConsumer = NULL; + m_transport = nsnull; + m_outputStream = nsnull; + m_outputConsumer = nsnull; m_isRunning = PR_FALSE; - - rv = m_transport->GetOutputStream(&m_outputStream); - NS_ASSERTION(NS_SUCCEEDED(rv), "unable to create an output stream"); + if (aURL) + { + nsresult rv = aURL->QueryInterface(nsIPop3URL::GetIID(), (void **)&m_nsIPop3URL); + if (NS_SUCCEEDED(rv) && m_nsIPop3URL) + { + // extract the file name and create a file transport... + const char * fileName = nsnull; + nsINetService* pNetService; + rv = nsServiceManager::GetService(kNetServiceCID, + nsINetService::GetIID(), + (nsISupports**)&pNetService); + if (NS_SUCCEEDED(rv) && pNetService) + { + const char * hostName = nsnull; + PRUint32 port = POP3_PORT; - rv = m_transport->GetOutputStreamConsumer(&m_outputConsumer); - NS_ASSERTION(NS_SUCCEEDED(rv), "unable to create an output consumer"); + m_nsIPop3URL->GetHost(&hostName); + m_nsIPop3URL->GetHostPort(&port); + rv = pNetService->CreateSocketTransport(&m_transport, port, hostName); + if (NS_SUCCEEDED(rv) && m_transport) + { + rv = m_transport->GetOutputStream(&m_outputStream); + NS_ASSERTION(NS_SUCCEEDED(rv), "unable to create an output stream"); - // register self as the consumer for the socket... - rv = m_transport->SetInputStreamConsumer((nsIStreamListener *) this); - NS_ASSERTION(NS_SUCCEEDED(rv), - "unable to register NNTP instance as a consumer on the socket"); + rv = m_transport->GetOutputStreamConsumer(&m_outputConsumer); + NS_ASSERTION(NS_SUCCEEDED(rv), "unable to create an output consumer"); - m_pop3ConData->output_buffer = (char *) PR_MALLOC(OUTPUT_BUFFER_SIZE); - PR_ASSERT(m_pop3ConData->output_buffer); + // register self as the consumer for the socket... + rv = m_transport->SetInputStreamConsumer((nsIStreamListener *) this); + NS_ASSERTION(NS_SUCCEEDED(rv), "unable to register NNTP instance as a consumer on the socket"); + } + + (void)nsServiceManager::ReleaseService(kNetServiceCID, pNetService); + } // if we got a netlib service + } // if we have a runningUrl + } // if we got a url... } nsPop3Protocol::~nsPop3Protocol() @@ -500,11 +533,11 @@ nsPop3Protocol::SetPassword(const char* passwd) PRInt32 -nsPop3Protocol::Load(nsIURL* aURL) +nsPop3Protocol::Load(nsIURL* aURL, nsISupports * aConsumer) { - const char* urlSpec = NULL; - const char* host = NULL; - nsresult rv = 0; + const char* urlSpec = NULL; + const char* host = NULL; + nsresult rv = 0; nsIPop3URL *pop3URL = NULL; if (aURL) @@ -522,7 +555,7 @@ nsPop3Protocol::Load(nsIURL* aURL) // it returns the interface to us...we'll release when we are done } else - NS_ASSERTION(0, "Invalid url type passed into NNTP Protocol Handler"); + NS_ASSERTION(0, "Invalid url type passed into Pop3 Protocol Handler"); } else rv = NS_ERROR_FAILURE; @@ -569,27 +602,27 @@ nsPop3Protocol::Load(nsIURL* aURL) NS_IF_RELEASE(m_nsIPop3Sink); m_nsIPop3URL->GetPop3Sink(&m_nsIPop3Sink); - const char* mailDirectory = 0; m_nsIPop3Sink->GetMailDirectory(&mailDirectory); - m_pop3ConData->uidlinfo = net_pop3_load_state(host, GetUsername(), + m_pop3ConData->uidlinfo = net_pop3_load_state(host, GetUsername(), mailDirectory); PR_ASSERT(m_pop3ConData->uidlinfo); - m_pop3ConData->biffstate = MSG_BIFF_NOMAIL; + m_pop3ConData->biffstate = MSG_BIFF_NOMAIL; - const char* uidl = PL_strcasestr(urlSpec, "?uidl="); + const char* uidl = PL_strcasestr(urlSpec, "?uidl="); PR_FREEIF(m_pop3ConData->only_uidl); if (uidl) - { - uidl += 6; - m_pop3ConData->only_uidl = PL_strdup(uidl); - PR_ASSERT(m_pop3ConData->only_uidl); - } - m_pop3ConData->next_state = POP3_READ_PASSWORD; + { + uidl += 6; + m_pop3ConData->only_uidl = PL_strdup(uidl); + PR_ASSERT(m_pop3ConData->only_uidl); + } + + m_pop3ConData->next_state = POP3_READ_PASSWORD; m_isRunning = PR_TRUE; m_transport->Open(aURL); diff --git a/mailnews/local/src/nsPop3Protocol.h b/mailnews/local/src/nsPop3Protocol.h index 2ff24979ba10..4cbd45d7b41e 100644 --- a/mailnews/local/src/nsPop3Protocol.h +++ b/mailnews/local/src/nsPop3Protocol.h @@ -295,11 +295,11 @@ typedef struct _Pop3ConData { class nsPop3Protocol : public nsIStreamListener, public nsMsgLineBuffer { public: - nsPop3Protocol(nsIURL* aURL, nsITransport* aTransport); + nsPop3Protocol(nsIURL* aURL); virtual ~nsPop3Protocol(); - PRInt32 Load(nsIURL *aURL); + PRInt32 Load(nsIURL *aURL, nsISupports * aConsumer /* consumer of the url */ = nsnull); PRBool IsRunning() { return m_isRunning; }; NS_DECL_ISUPPORTS @@ -409,6 +409,8 @@ private: PRInt32 CommitState(PRBool remove_last_entry); PRInt32 ProcessPop3State(nsIURL* aURL, nsIInputStream* aInputStream, PRUint32 aLength); + + void Initialize(nsIURL * aURL); }; #endif /* nsPop3Protocol_h__ */