17270, r=dougt@netscape.com. These changes move FTP from interface pointers to COMptrs. There is also a variable name change, mUrl -> mURL. Also some extraneous pipe code has been removed.

This commit is contained in:
valeski%netscape.com 1999-10-26 20:55:50 +00:00
Родитель efcdcfd4ad
Коммит e6e2c9e39f
4 изменённых файлов: 150 добавлений и 258 удалений

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

@ -28,7 +28,6 @@
#include "nsIEventQueueService.h" #include "nsIEventQueueService.h"
#include "nsIProgressEventSink.h" #include "nsIProgressEventSink.h"
#include "nsIEventSinkGetter.h" #include "nsIEventSinkGetter.h"
#include "nsIPipe.h"
#include "nsILoadGroup.h" #include "nsILoadGroup.h"
#include "nsIFTPContext.h" #include "nsIFTPContext.h"
#include "nsIMIMEService.h" #include "nsIMIMEService.h"
@ -53,36 +52,14 @@ extern PRLogModuleInfo* gFTPLog;
nsFTPChannel::nsFTPChannel() { nsFTPChannel::nsFTPChannel() {
NS_INIT_REFCNT(); NS_INIT_REFCNT();
mConnectionThread = nsnull;
mUrl = nsnull;
mEventQueue = nsnull;
mEventSink = nsnull;
mConnected = PR_FALSE; mConnected = PR_FALSE;
mListener = nsnull;
mContext = nsnull;
mLoadAttributes = LOAD_NORMAL; mLoadAttributes = LOAD_NORMAL;
mBufferInputStream = nsnull;
mBufferOutputStream = nsnull;
mSourceOffset = 0; mSourceOffset = 0;
mAmount = 0; mAmount = 0;
mLoadGroup = nsnull;
mContentLength = -1; mContentLength = -1;
mThreadRequest = nsnull;
mConnectionEventQueue = nsnull;
mHandler = nsnull;
} }
nsFTPChannel::~nsFTPChannel() { nsFTPChannel::~nsFTPChannel() {
NS_IF_RELEASE(mUrl);
NS_IF_RELEASE(mListener);
NS_IF_RELEASE(mEventQueue);
NS_IF_RELEASE(mConnectionEventQueue);
NS_IF_RELEASE(mLoadGroup);
NS_IF_RELEASE(mContext);
NS_IF_RELEASE(mThreadRequest);
NS_IF_RELEASE(mBufferInputStream);
NS_IF_RELEASE(mBufferOutputStream);
NS_IF_RELEASE(mHandler);
} }
NS_IMPL_ISUPPORTS4(nsFTPChannel, nsIChannel, nsIFTPChannel, nsIStreamListener, nsIStreamObserver); NS_IMPL_ISUPPORTS4(nsFTPChannel, nsIChannel, nsIFTPChannel, nsIStreamListener, nsIStreamObserver);
@ -94,32 +71,22 @@ nsFTPChannel::Init(const char* verb, nsIURI* uri, nsILoadGroup *aGroup,
{ {
nsresult rv; nsresult rv;
mHandler = aHandler;
NS_ADDREF(mHandler);
if (mConnected) if (mConnected)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
mHandler = aHandler;
mOriginalURI = originalURI ? originalURI : uri; mOriginalURI = originalURI ? originalURI : uri;
mUrl = uri; mURL = uri;
NS_ADDREF(mUrl);
mLoadGroup = aGroup; mLoadGroup = aGroup;
NS_IF_ADDREF(mLoadGroup);
if (getter) { if (getter) {
nsIProgressEventSink* eventSink = nsnull;
rv = getter->GetEventSink(verb, NS_GET_IID(nsIProgressEventSink), rv = getter->GetEventSink(verb, NS_GET_IID(nsIProgressEventSink),
(nsISupports**)&eventSink); (nsISupports**)&mEventSink);
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("nsFTPChannel::Init() (couldn't find event sink)\n")); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("nsFTPChannel::Init() (couldn't find event sink)\n"));
} }
// XXX event sinks are optional (for now) in ftp
if (eventSink) {
mEventSink = eventSink;
NS_ADDREF(mEventSink);
}
} }
NS_WITH_SERVICE(nsIEventQueueService, eventQService, kEventQueueService, &rv); NS_WITH_SERVICE(nsIEventQueueService, eventQService, kEventQueueService, &rv);
@ -127,12 +94,12 @@ nsFTPChannel::Init(const char* verb, nsIURI* uri, nsILoadGroup *aGroup,
// the FTP channel is instanciated on the main thread. the actual // the FTP channel is instanciated on the main thread. the actual
// protocol is interpreted on the FTP thread. // protocol is interpreted on the FTP thread.
rv = eventQService->GetThreadEventQueue(PR_CurrentThread(), &mEventQueue); rv = eventQService->GetThreadEventQueue(PR_CurrentThread(), getter_AddRefs(mEventQueue));
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
// go ahead and create the thread for the connection. // go ahead and create the thread for the connection.
// we'll init it and kick it off later // we'll init it and kick it off later
rv = NS_NewThread(&mConnectionThread); rv = NS_NewThread(getter_AddRefs(mConnectionThread));
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
// we'll create the FTP connection's event queue here, on this thread. // we'll create the FTP connection's event queue here, on this thread.
@ -147,9 +114,9 @@ nsFTPChannel::Init(const char* verb, nsIURI* uri, nsILoadGroup *aGroup,
PLEventQueue* PLEventQ = PL_CreateEventQueue("FTP thread", thread); PLEventQueue* PLEventQ = PL_CreateEventQueue("FTP thread", thread);
if (!PLEventQ) return rv; if (!PLEventQ) return rv;
rv = eventQService->CreateFromPLEventQueue(PLEventQ, &mConnectionEventQueue); rv = eventQService->CreateFromPLEventQueue(PLEventQ, getter_AddRefs(mConnectionEventQueue));
#else #else
rv = eventQService->CreateFromIThread(mConnectionThread, &mConnectionEventQueue); rv = eventQService->CreateFromIThread(mConnectionThread, getter_AddRefs(mConnectionEventQueue));
#endif #endif
return rv; return rv;
@ -223,8 +190,8 @@ nsFTPChannel::GetOriginalURI(nsIURI * *aURL)
NS_IMETHODIMP NS_IMETHODIMP
nsFTPChannel::GetURI(nsIURI * *aURL) nsFTPChannel::GetURI(nsIURI * *aURL)
{ {
NS_ADDREF(mUrl); *aURL = mURL;
*aURL = mUrl; NS_ADDREF(*aURL);
return NS_OK; return NS_OK;
} }
@ -260,7 +227,7 @@ nsFTPChannel::OpenInputStream(PRUint32 startPosition, PRInt32 readCount,
if (!protocolInterpreter) if (!protocolInterpreter)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
protocolInterpreter->Init(mUrl); protocolInterpreter->Init(mURL);
protocolInterpreter->SetUsePasv(PR_TRUE); protocolInterpreter->SetUsePasv(PR_TRUE);
rv = NS_NewThread(&workerThread, protocolInterpreter); rv = NS_NewThread(&workerThread, protocolInterpreter);
@ -299,21 +266,9 @@ nsFTPChannel::AsyncRead(PRUint32 startPosition, PRInt32 readCount,
mSourceOffset = startPosition; mSourceOffset = startPosition;
mAmount = readCount; mAmount = readCount;
if (ctxt) { mContext = ctxt;
mContext = ctxt;
NS_ADDREF(mContext);
}
mListener = listener; mListener = listener;
NS_ADDREF(mListener);
rv = NS_NewPipe(&mBufferInputStream, &mBufferOutputStream,
nsnull/*this*/, // XXX need channel to implement nsIPipeObserver
NS_FTP_SEGMENT_SIZE, NS_FTP_BUFFER_SIZE);
if (NS_FAILED(rv)) return rv;
rv = mBufferOutputStream->SetNonBlocking(PR_TRUE);
if (NS_FAILED(rv)) return rv;
mSourceOffset = startPosition; mSourceOffset = startPosition;
mAmount = readCount; mAmount = readCount;
@ -326,7 +281,7 @@ nsFTPChannel::AsyncRead(PRUint32 startPosition, PRInt32 readCount,
NS_ADDREF(protocolInterpreter); NS_ADDREF(protocolInterpreter);
rv = protocolInterpreter->Init(mConnectionEventQueue, /* FTP thread queue */ rv = protocolInterpreter->Init(mConnectionEventQueue, /* FTP thread queue */
mUrl, /* url to load */ mURL, /* url to load */
mEventQueue, /* event queue for this thread */ mEventQueue, /* event queue for this thread */
mHandler, mHandler,
this, ctxt); this, ctxt);
@ -340,14 +295,14 @@ nsFTPChannel::AsyncRead(PRUint32 startPosition, PRInt32 readCount,
NS_GET_IID(nsIRequest), NS_GET_IID(nsIRequest),
(nsISupports*)(nsIRequest*)protocolInterpreter, (nsISupports*)(nsIRequest*)protocolInterpreter,
PROXY_SYNC | PROXY_ALWAYS, PROXY_SYNC | PROXY_ALWAYS,
(void**)&mThreadRequest); getter_AddRefs(mThreadRequest));
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
rv = mConnectionThread->Init((nsIRunnable*)protocolInterpreter, rv = mConnectionThread->Init((nsIRunnable*)protocolInterpreter,
0, /* stack size */ 0, /* stack size */
PR_PRIORITY_NORMAL, PR_PRIORITY_NORMAL,
PR_GLOBAL_THREAD, PR_GLOBAL_THREAD,
PR_JOINABLE_THREAD); PR_UNJOINABLE_THREAD);
// this extra release is a result of a discussion with // this extra release is a result of a discussion with
// dougt. GetProxyObject is doing an extra addref. dougt // dougt. GetProxyObject is doing an extra addref. dougt
@ -355,9 +310,13 @@ nsFTPChannel::AsyncRead(PRUint32 startPosition, PRInt32 readCount,
// release, yank it. // release, yank it.
NS_RELEASE2(protocolInterpreter, rv); NS_RELEASE2(protocolInterpreter, rv);
NS_RELEASE(protocolInterpreter); NS_RELEASE(protocolInterpreter);
NS_RELEASE(mConnectionThread); mConnectionThread = 0; // this is necessary because there is a circular dependency
// between the FTPChannel and the connection thread.
// we need to ditch our ref to the connection thread asap.
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
mConnected = PR_TRUE;
return NS_OK; return NS_OK;
} }
@ -411,7 +370,7 @@ nsFTPChannel::GetContentType(char* *aContentType) {
NS_WITH_SERVICE(nsIMIMEService, MIMEService, kMIMEServiceCID, &rv); NS_WITH_SERVICE(nsIMIMEService, MIMEService, kMIMEServiceCID, &rv);
if (NS_SUCCEEDED(rv)) { if (NS_SUCCEEDED(rv)) {
rv = MIMEService->GetTypeFromURI(mUrl, aContentType); rv = MIMEService->GetTypeFromURI(mURL, aContentType);
if (NS_SUCCEEDED(rv)) { if (NS_SUCCEEDED(rv)) {
mContentType = *aContentType; mContentType = *aContentType;
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("nsFTPChannel::NewChannel() returned %s\n", *aContentType)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("nsFTPChannel::NewChannel() returned %s\n", *aContentType));
@ -480,7 +439,6 @@ nsFTPChannel::Put(void) {
NS_IMETHODIMP NS_IMETHODIMP
nsFTPChannel::SetStreamListener(nsIStreamListener *aListener) { nsFTPChannel::SetStreamListener(nsIStreamListener *aListener) {
mListener = aListener; mListener = aListener;
NS_ADDREF(mListener);
return NS_OK; return NS_OK;
} }
@ -506,11 +464,6 @@ nsFTPChannel::OnStopRequest(nsIChannel* channel, nsISupports* context,
if (mListener) { if (mListener) {
rv = mListener->OnStopRequest(channel, mContext, aStatus, aMsg); rv = mListener->OnStopRequest(channel, mContext, aStatus, aMsg);
} }
// release the proxy object to the thread.
// this request is over (thus the FTP thread will be)
// leaving soon.
NS_RELEASE(mThreadRequest);
return rv; return rv;
} }

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

@ -27,8 +27,6 @@
#include "nsIURI.h" #include "nsIURI.h"
#include "nsString2.h" #include "nsString2.h"
#include "nsIEventQueue.h" #include "nsIEventQueue.h"
#include "nsIBufferOutputStream.h"
#include "nsIBufferInputStream.h"
#include "nsILoadGroup.h" #include "nsILoadGroup.h"
#include "nsCOMPtr.h" #include "nsCOMPtr.h"
#include "nsHashtable.h" #include "nsHashtable.h"
@ -63,29 +61,27 @@ public:
nsIProtocolHandler* aHandler); nsIProtocolHandler* aHandler);
protected: protected:
nsCOMPtr<nsIURI> mOriginalURI; nsCOMPtr<nsIURI> mOriginalURI;
nsIURI* mUrl; nsCOMPtr<nsIURI> mURL;
nsIEventQueue* mEventQueue; nsCOMPtr<nsIEventQueue> mEventQueue;
nsIProgressEventSink* mEventSink; nsCOMPtr<nsIProgressEventSink> mEventSink;
PRBool mConnected; PRBool mConnected;
nsIStreamListener* mListener; nsCOMPtr<nsIStreamListener> mListener;
nsISupports* mContext; nsCOMPtr<nsISupports> mContext;
PRUint32 mLoadAttributes; PRUint32 mLoadAttributes;
nsIBufferInputStream* mBufferInputStream; PRUint32 mSourceOffset;
nsIBufferOutputStream* mBufferOutputStream; PRInt32 mAmount;
PRUint32 mSourceOffset; nsCOMPtr<nsILoadGroup> mLoadGroup;
PRInt32 mAmount; nsAutoString mContentType;
nsILoadGroup* mLoadGroup; PRInt32 mContentLength;
nsAutoString mContentType; nsCOMPtr<nsISupports> mOwner;
PRInt32 mContentLength; nsCOMPtr<nsIThread> mConnectionThread; // the thread for this connection.
nsCOMPtr<nsISupports> mOwner;
nsIThread* mConnectionThread; // the thread for this connection.
nsIEventQueue* mConnectionEventQueue; nsCOMPtr<nsIEventQueue> mConnectionEventQueue;
nsIRequest* mThreadRequest; // the nsIRequest proxy object. nsCOMPtr<nsIRequest> mThreadRequest; // the nsIRequest proxy object.
nsIProtocolHandler* mHandler; nsCOMPtr<nsIProtocolHandler> mHandler;
}; };
#define NS_FTP_SEGMENT_SIZE (4*1024) #define NS_FTP_SEGMENT_SIZE (4*1024)

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

@ -109,10 +109,6 @@ NS_IMPL_ISUPPORTS2(nsFtpConnectionThread, nsIRunnable, nsIRequest);
nsFtpConnectionThread::nsFtpConnectionThread() { nsFtpConnectionThread::nsFtpConnectionThread() {
NS_INIT_REFCNT(); NS_INIT_REFCNT();
mHandler = nsnull;
mEventQueue = nsnull;
mListener = nsnull;
mSyncListener = nsnull;
mAction = GET; mAction = GET;
mUsePasv = PR_TRUE; mUsePasv = PR_TRUE;
mState = FTP_S_USER; mState = FTP_S_USER;
@ -122,9 +118,6 @@ nsFtpConnectionThread::nsFtpConnectionThread() {
mConnected = PR_FALSE; mConnected = PR_FALSE;
mResetMode = PR_FALSE; mResetMode = PR_FALSE;
mList = PR_FALSE; mList = PR_FALSE;
mChannel = nsnull;
mContext = nsnull;
mDPipe = nsnull;
mKeepRunning = PR_TRUE; mKeepRunning = PR_TRUE;
mUseDefaultPath = PR_TRUE; mUseDefaultPath = PR_TRUE;
mContinueRead = PR_FALSE; mContinueRead = PR_FALSE;
@ -133,25 +126,14 @@ nsFtpConnectionThread::nsFtpConnectionThread() {
mCachedConn = PR_FALSE; mCachedConn = PR_FALSE;
mInternalError = NS_OK; // start out on the up 'n up. mInternalError = NS_OK; // start out on the up 'n up.
mSentStart = PR_FALSE; mSentStart = PR_FALSE;
mFTPContext = nsnull;
mCPipe = nsnull;
mDPipe = nsnull;
mConn = nsnull; mConn = nsnull;
mConnCache = nsnull; mFTPContext = nsnull;
} }
nsFtpConnectionThread::~nsFtpConnectionThread() { nsFtpConnectionThread::~nsFtpConnectionThread() {
NS_RELEASE(mListener);
NS_RELEASE(mSyncListener);
NS_RELEASE(mChannel);
NS_IF_RELEASE(mContext);
NS_IF_RELEASE(mEventQueue);
NS_RELEASE(mFTPContext);
NS_RELEASE(mUrl);
// lose the socket transport // lose the socket transport
NS_RELEASE(mSTS); NS_RELEASE(mSTS);
NS_IF_RELEASE(mHandler); NS_RELEASE(mFTPContext);
nsAllocator::Free(mURLSpec); nsAllocator::Free(mURLSpec);
} }
@ -160,7 +142,7 @@ nsresult
nsFtpConnectionThread::Process() { nsFtpConnectionThread::Process() {
nsresult rv; nsresult rv;
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("nsFtpConnectionThread::Process() started for %x (spec =%s)\n", mUrl, mURLSpec)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("nsFtpConnectionThread::Process() started for %x (spec =%s)\n", mURL, mURLSpec));
while (mKeepRunning) { while (mKeepRunning) {
@ -182,7 +164,7 @@ nsFtpConnectionThread::Process() {
PRUint32 read; PRUint32 read;
rv = mCInStream->Read(buffer, NS_FTP_BUFFER_READ_SIZE, &read); rv = mCInStream->Read(buffer, NS_FTP_BUFFER_READ_SIZE, &read);
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - READ_BUF - Read() FAILED with rv = %d\n", mUrl, rv)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - READ_BUF - Read() FAILED with rv = %d\n", mURL, rv));
mInternalError = NS_ERROR_FAILURE; mInternalError = NS_ERROR_FAILURE;
mState = FTP_ERROR; mState = FTP_ERROR;
break; break;
@ -190,12 +172,12 @@ nsFtpConnectionThread::Process() {
if (0 == read) { if (0 == read) {
// EOF // EOF
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - READ_BUF received EOF\n", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - READ_BUF received EOF\n", mURL));
mState = FTP_COMPLETE; mState = FTP_COMPLETE;
break; break;
} }
buffer[read] = '\0'; buffer[read] = '\0';
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - READ_BUF - read \"%s\" (%d bytes)", mUrl, buffer, read)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - READ_BUF - read \"%s\" (%d bytes)", mURL, buffer, read));
// get the response code out. // get the response code out.
if (!mContinueRead) { if (!mContinueRead) {
@ -255,7 +237,7 @@ nsFtpConnectionThread::Process() {
case FTP_ERROR: case FTP_ERROR:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - ERROR\n", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - ERROR\n", mURL));
// if something went wrong, delete this connection entry and don't // if something went wrong, delete this connection entry and don't
// bother putting it in the cache. // bother putting it in the cache.
@ -269,7 +251,7 @@ nsFtpConnectionThread::Process() {
case FTP_COMPLETE: case FTP_COMPLETE:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - COMPLETE\n", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - COMPLETE\n", mURL));
// push through all of the pertinent state into the cache entry; // push through all of the pertinent state into the cache entry;
mConn->mCwd = mCwd; mConn->mCwd = mCwd;
mConn->mUseDefaultPath = mUseDefaultPath; mConn->mUseDefaultPath = mUseDefaultPath;
@ -288,7 +270,7 @@ nsFtpConnectionThread::Process() {
case FTP_S_USER: case FTP_S_USER:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_USER - ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_USER - ", mURL));
rv = S_user(); rv = S_user();
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
mInternalError = NS_ERROR_FTP_LOGIN; mInternalError = NS_ERROR_FTP_LOGIN;
@ -314,7 +296,7 @@ nsFtpConnectionThread::Process() {
case FTP_S_PASS: case FTP_S_PASS:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_PASS - ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_PASS - ", mURL));
rv = S_pass(); rv = S_pass();
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
mInternalError = NS_ERROR_FTP_LOGIN; mInternalError = NS_ERROR_FTP_LOGIN;
@ -340,7 +322,7 @@ nsFtpConnectionThread::Process() {
case FTP_S_SYST: case FTP_S_SYST:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_SYST - ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_SYST - ", mURL));
rv = S_syst(); rv = S_syst();
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
mInternalError = rv; mInternalError = rv;
@ -366,7 +348,7 @@ nsFtpConnectionThread::Process() {
case FTP_S_ACCT: case FTP_S_ACCT:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_ACCT - ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_ACCT - ", mURL));
rv = S_acct(); rv = S_acct();
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
mInternalError = NS_ERROR_FTP_LOGIN; mInternalError = NS_ERROR_FTP_LOGIN;
@ -392,7 +374,7 @@ nsFtpConnectionThread::Process() {
case FTP_S_MACB: case FTP_S_MACB:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_MACB - ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_MACB - ", mURL));
rv = S_macb(); rv = S_macb();
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
mInternalError = rv; mInternalError = rv;
@ -418,7 +400,7 @@ nsFtpConnectionThread::Process() {
case FTP_S_PWD: case FTP_S_PWD:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_PWD - ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_PWD - ", mURL));
rv = S_pwd(); rv = S_pwd();
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
mInternalError = rv; mInternalError = rv;
@ -444,7 +426,7 @@ nsFtpConnectionThread::Process() {
case FTP_S_MODE: case FTP_S_MODE:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_MODE - ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_MODE - ", mURL));
rv = S_mode(); rv = S_mode();
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
mInternalError = NS_ERROR_FTP_MODE; mInternalError = NS_ERROR_FTP_MODE;
@ -470,7 +452,7 @@ nsFtpConnectionThread::Process() {
case FTP_S_CWD: case FTP_S_CWD:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_CWD - ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_CWD - ", mURL));
rv = S_cwd(); rv = S_cwd();
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
mInternalError = NS_ERROR_FTP_CWD; mInternalError = NS_ERROR_FTP_CWD;
@ -496,7 +478,7 @@ nsFtpConnectionThread::Process() {
case FTP_S_SIZE: case FTP_S_SIZE:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_SIZE - ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_SIZE - ", mURL));
rv = S_size(); rv = S_size();
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
mInternalError = rv; mInternalError = rv;
@ -522,7 +504,7 @@ nsFtpConnectionThread::Process() {
case FTP_S_MDTM: case FTP_S_MDTM:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_MDTM - ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_MDTM - ", mURL));
rv = S_mdtm(); rv = S_mdtm();
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
mInternalError = rv; mInternalError = rv;
@ -548,7 +530,7 @@ nsFtpConnectionThread::Process() {
case FTP_S_LIST: case FTP_S_LIST:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_LIST - ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_LIST - ", mURL));
rv = S_list(); rv = S_list();
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
mInternalError = rv; mInternalError = rv;
@ -557,8 +539,8 @@ nsFtpConnectionThread::Process() {
} else { } else {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("SUCCEEDED\n")); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("SUCCEEDED\n"));
// get the data channel ready // get the data channel ready
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_LIST - Opening data stream ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_LIST - Opening data stream ", mURL));
rv = mDPipe->OpenInputStream(0, -1, &mDInStream); rv = mDPipe->OpenInputStream(0, -1, getter_AddRefs(mDInStream));
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("FAILED\n")); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("FAILED\n"));
return rv; return rv;
@ -579,14 +561,14 @@ nsFtpConnectionThread::Process() {
mInternalError = NS_ERROR_FAILURE; mInternalError = NS_ERROR_FAILURE;
mNextState = FTP_COMPLETE; mNextState = FTP_COMPLETE;
mDInStream->Close(); mDInStream->Close();
NS_RELEASE(mDInStream); mDInStream = 0;
break; break;
} }
// END: FTP_R_LIST // END: FTP_R_LIST
case FTP_S_RETR: case FTP_S_RETR:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_RETR - ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_RETR - ", mURL));
rv = S_retr(); rv = S_retr();
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
mInternalError = rv; mInternalError = rv;
@ -595,8 +577,8 @@ nsFtpConnectionThread::Process() {
} else { } else {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("SUCCEEDED\n")); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("SUCCEEDED\n"));
// get the data channel ready // get the data channel ready
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_RETR - Opening data stream ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_RETR - Opening data stream ", mURL));
rv = mDPipe->OpenInputStream(0, -1, &mDInStream); rv = mDPipe->OpenInputStream(0, -1, getter_AddRefs(mDInStream));
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("FAILED\n")); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("FAILED\n"));
return rv; return rv;
@ -617,7 +599,7 @@ nsFtpConnectionThread::Process() {
mInternalError = NS_ERROR_FAILURE; mInternalError = NS_ERROR_FAILURE;
mNextState = FTP_COMPLETE; mNextState = FTP_COMPLETE;
mDInStream->Close(); mDInStream->Close();
NS_RELEASE(mDInStream); mDInStream = 0;
break; break;
} }
// END: FTP_R_RETR // END: FTP_R_RETR
@ -628,7 +610,7 @@ nsFtpConnectionThread::Process() {
////////////////////////////// //////////////////////////////
case FTP_S_PASV: case FTP_S_PASV:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_PASV - ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_PASV - ", mURL));
rv = S_pasv(); rv = S_pasv();
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
mInternalError = NS_ERROR_FTP_PASV; mInternalError = NS_ERROR_FTP_PASV;
@ -657,7 +639,7 @@ nsFtpConnectionThread::Process() {
////////////////////////////// //////////////////////////////
case FTP_S_DEL_FILE: case FTP_S_DEL_FILE:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_DEL_FILE - ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_DEL_FILE - ", mURL));
rv = S_del_file(); rv = S_del_file();
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
mInternalError = rv; mInternalError = rv;
@ -683,7 +665,7 @@ nsFtpConnectionThread::Process() {
case FTP_S_DEL_DIR: case FTP_S_DEL_DIR:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_DEL_DIR - ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_DEL_DIR - ", mURL));
rv = S_del_dir(); rv = S_del_dir();
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
mInternalError = NS_ERROR_FTP_DEL_DIR; mInternalError = NS_ERROR_FTP_DEL_DIR;
@ -709,7 +691,7 @@ nsFtpConnectionThread::Process() {
case FTP_S_MKDIR: case FTP_S_MKDIR:
{ {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_MKDIR - ", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - S_MKDIR - ", mURL));
rv = S_mkdir(); rv = S_mkdir();
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
mInternalError = NS_ERROR_FTP_MKDIR; mInternalError = NS_ERROR_FTP_MKDIR;
@ -739,7 +721,7 @@ nsFtpConnectionThread::Process() {
} // END: switch } // END: switch
} // END: while loop } // END: while loop
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("nsFtpConnectionThread::Process() ended for %x (spec =%s)\n\n\n", mUrl, mURLSpec)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("nsFtpConnectionThread::Process() ended for %x (spec =%s)\n\n\n", mURL, mURLSpec));
return NS_OK; return NS_OK;
} }
@ -765,7 +747,7 @@ nsFtpConnectionThread::S_user() {
static nsAutoString message; static nsAutoString message;
if (message.Length() < 1) { if (message.Length() < 1) {
char *host; char *host;
rv = mUrl->GetHost(&host); rv = mURL->GetHost(&host);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
message = "Enter username and password for "; //TODO localize it! message = "Enter username and password for "; //TODO localize it!
message += host; message += host;
@ -781,7 +763,7 @@ nsFtpConnectionThread::S_user() {
} }
usernameStr.Append(FTP_CRLF); usernameStr.Append(FTP_CRLF);
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, usernameStr.GetBuffer())); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mURL, usernameStr.GetBuffer()));
rv = mCOutStream->Write(usernameStr.GetBuffer(), usernameStr.Length(), &bytes); rv = mCOutStream->Write(usernameStr.GetBuffer(), usernameStr.Length(), &bytes);
return rv; return rv;
@ -829,7 +811,7 @@ nsFtpConnectionThread::S_pass() {
static nsAutoString message; static nsAutoString message;
if (message.Length() < 1) { if (message.Length() < 1) {
char *host; char *host;
rv = mUrl->GetHost(&host); rv = mURL->GetHost(&host);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
message = "Enter password for "; //TODO localize it! message = "Enter password for "; //TODO localize it!
message += mUsername; message += mUsername;
@ -846,7 +828,7 @@ nsFtpConnectionThread::S_pass() {
} }
passwordStr.Append(FTP_CRLF); passwordStr.Append(FTP_CRLF);
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, passwordStr.GetBuffer())); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mURL, passwordStr.GetBuffer()));
rv = mCOutStream->Write(passwordStr.GetBuffer(), passwordStr.Length(), &bytes); rv = mCOutStream->Write(passwordStr.GetBuffer(), passwordStr.Length(), &bytes);
return rv; return rv;
@ -872,7 +854,7 @@ nsFtpConnectionThread::S_syst() {
char *buffer = "SYST" FTP_CRLF; char *buffer = "SYST" FTP_CRLF;
PRUint32 bytes; PRUint32 bytes;
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, buffer)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mURL, buffer));
return mCOutStream->Write(buffer, PL_strlen(buffer), &bytes); return mCOutStream->Write(buffer, PL_strlen(buffer), &bytes);
} }
@ -900,7 +882,7 @@ nsFtpConnectionThread::S_acct() {
char *buffer = "ACCT noaccount" FTP_CRLF; char *buffer = "ACCT noaccount" FTP_CRLF;
PRUint32 bytes; PRUint32 bytes;
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, buffer)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mURL, buffer));
return mCOutStream->Write(buffer, PL_strlen(buffer), &bytes); return mCOutStream->Write(buffer, PL_strlen(buffer), &bytes);
} }
@ -918,7 +900,7 @@ nsFtpConnectionThread::S_macb() {
char *buffer = "MACB ENABLE" FTP_CRLF; char *buffer = "MACB ENABLE" FTP_CRLF;
PRUint32 bytes; PRUint32 bytes;
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, buffer)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mURL, buffer));
return mCOutStream->Write(buffer, PL_strlen(buffer), &bytes); return mCOutStream->Write(buffer, PL_strlen(buffer), &bytes);
} }
@ -942,7 +924,7 @@ nsFtpConnectionThread::S_pwd() {
char *buffer = "PWD" FTP_CRLF; char *buffer = "PWD" FTP_CRLF;
PRUint32 bytes; PRUint32 bytes;
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, buffer)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mURL, buffer));
return mCOutStream->Write(buffer, PL_strlen(buffer), &bytes); return mCOutStream->Write(buffer, PL_strlen(buffer), &bytes);
} }
@ -1019,7 +1001,7 @@ nsFtpConnectionThread::R_pwd() {
if (ptr.Length()) { if (ptr.Length()) {
char *initialPath = nsnull; char *initialPath = nsnull;
rv = mUrl->GetPath(&initialPath); rv = mURL->GetPath(&initialPath);
if (NS_FAILED(rv)) return FTP_ERROR; if (NS_FAILED(rv)) return FTP_ERROR;
if (ptr.Last() == '/') { if (ptr.Last() == '/') {
@ -1032,7 +1014,7 @@ nsFtpConnectionThread::R_pwd() {
nsAllocator::Free(initialPath); nsAllocator::Free(initialPath);
const char *p = ptr.GetBuffer(); const char *p = ptr.GetBuffer();
rv = mUrl->SetPath(p); rv = mURL->SetPath(p);
if (NS_FAILED(rv)) return FTP_ERROR; if (NS_FAILED(rv)) return FTP_ERROR;
} }
} }
@ -1058,7 +1040,7 @@ nsFtpConnectionThread::S_mode() {
buffer = "TYPE A" FTP_CRLF; buffer = "TYPE A" FTP_CRLF;
} }
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, buffer)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mURL, buffer));
return mCOutStream->Write(buffer, PL_strlen(buffer), &bytes); return mCOutStream->Write(buffer, PL_strlen(buffer), &bytes);
} }
@ -1087,7 +1069,7 @@ nsFtpConnectionThread::S_cwd() {
nsresult rv; nsresult rv;
char *path; char *path;
PRUint32 bytes; PRUint32 bytes;
rv = mUrl->GetPath(&path); rv = mURL->GetPath(&path);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
nsCAutoString cwdStr("CWD "); nsCAutoString cwdStr("CWD ");
@ -1118,7 +1100,7 @@ nsFtpConnectionThread::S_cwd() {
} }
nsAllocator::Free(path); nsAllocator::Free(path);
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, cwdStr.GetBuffer())); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mURL, cwdStr.GetBuffer()));
cwdStr.Mid(mCwdAttempt, 3, cwdStr.Length() - 4); cwdStr.Mid(mCwdAttempt, 3, cwdStr.Length() - 4);
@ -1159,7 +1141,7 @@ nsFtpConnectionThread::S_size() {
nsresult rv; nsresult rv;
char *path; char *path;
PRUint32 bytes; PRUint32 bytes;
rv = mUrl->GetPath(&path); rv = mURL->GetPath(&path);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
// XXX should the actual file name be parsed out??? // XXX should the actual file name be parsed out???
@ -1176,7 +1158,7 @@ nsFtpConnectionThread::S_size() {
nsAllocator::Free(path); nsAllocator::Free(path);
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, sizeBuf.GetBuffer())); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mURL, sizeBuf.GetBuffer()));
rv = mCOutStream->Write(sizeBuf.GetBuffer(), sizeBuf.Length(), &bytes); rv = mCOutStream->Write(sizeBuf.GetBuffer(), sizeBuf.Length(), &bytes);
return rv; return rv;
@ -1204,7 +1186,7 @@ nsFtpConnectionThread::S_mdtm() {
nsresult rv; nsresult rv;
char *path; char *path;
PRUint32 bytes; PRUint32 bytes;
rv = mUrl->GetPath(&path); rv = mURL->GetPath(&path);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
/*if (mServerType == FTP_VMS_TYPE) { /*if (mServerType == FTP_VMS_TYPE) {
@ -1217,7 +1199,7 @@ nsFtpConnectionThread::S_mdtm() {
mdtmStr.Append(FTP_CRLF); mdtmStr.Append(FTP_CRLF);
nsAllocator::Free(path); nsAllocator::Free(path);
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, mdtmStr.GetBuffer())); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mURL, mdtmStr.GetBuffer()));
rv = mCOutStream->Write(mdtmStr.GetBuffer(), mdtmStr.Length(), &bytes); rv = mCOutStream->Write(mdtmStr.GetBuffer(), mdtmStr.Length(), &bytes);
return rv; return rv;
@ -1269,7 +1251,7 @@ nsFtpConnectionThread::S_list() {
else else
buffer = "NLST" FTP_CRLF; buffer = "NLST" FTP_CRLF;
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, buffer)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mURL, buffer));
return mCOutStream->Write(buffer, PL_strlen(buffer), &bytes); return mCOutStream->Write(buffer, PL_strlen(buffer), &bytes);
} }
@ -1288,7 +1270,7 @@ nsFtpConnectionThread::R_list() {
// setup a listener to push the data into. This listener sits inbetween the // setup a listener to push the data into. This listener sits inbetween the
// unconverted data of fromType, and the final listener in the chain (in this case // unconverted data of fromType, and the final listener in the chain (in this case
// the mListener). // the mListener).
nsIStreamListener *converterListener = nsnull; nsCOMPtr<nsIStreamListener> converterListener;
NS_WITH_SERVICE(nsIStreamConverterService, StreamConvService, kStreamConverterServiceCID, &rv); NS_WITH_SERVICE(nsIStreamConverterService, StreamConvService, kStreamConverterServiceCID, &rv);
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
@ -1303,7 +1285,7 @@ nsFtpConnectionThread::R_list() {
rv = StreamConvService->AsyncConvertData(fromStr.GetUnicode(), rv = StreamConvService->AsyncConvertData(fromStr.GetUnicode(),
toStr.GetUnicode(), toStr.GetUnicode(),
mSyncListener, mUrl, &converterListener); mSyncListener, mURL, getter_AddRefs(converterListener));
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
return FTP_ERROR; return FTP_ERROR;
} }
@ -1319,47 +1301,31 @@ nsFtpConnectionThread::R_list() {
while (1) { while (1) {
PRUint32 read; PRUint32 read;
char *listBuf = (char*)nsAllocator::Alloc(NS_FTP_BUFFER_READ_SIZE + 1); char *listBuf = (char*)nsAllocator::Alloc(NS_FTP_BUFFER_READ_SIZE + 1);
if (!listBuf) { if (!listBuf) return FTP_ERROR;
NS_RELEASE(converterListener);
return FTP_ERROR;
}
rv = mDInStream->Read(listBuf, NS_FTP_BUFFER_READ_SIZE, &read); rv = mDInStream->Read(listBuf, NS_FTP_BUFFER_READ_SIZE, &read);
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x R_list() data pipe read failed w/ rv = %d\n", mUrl, rv)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x R_list() data pipe read failed w/ rv = %d\n", mURL, rv));
nsAllocator::Free(listBuf); nsAllocator::Free(listBuf);
NS_RELEASE(converterListener);
return FTP_ERROR; return FTP_ERROR;
} else if (read < 1) { } else if (read < 1) {
// EOF // EOF
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x R_list() data pipe read hit EOF\n", mUrl)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x R_list() data pipe read hit EOF\n", mURL));
nsAllocator::Free(listBuf); nsAllocator::Free(listBuf);
NS_RELEASE(converterListener);
return FTP_READ_BUF; return FTP_READ_BUF;
} }
listBuf[read] = '\0'; listBuf[read] = '\0';
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x R_list() data pipe read %d bytes:\n%s\n", mUrl, read, listBuf)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x R_list() data pipe read %d bytes:\n%s\n", mURL, read, listBuf));
nsISupports *stringStrmSup = nsnull; nsCOMPtr<nsISupports> stringStreamSup;
rv = NS_NewCharInputStream(&stringStrmSup, listBuf); // char streams keep ref to buffer rv = NS_NewCharInputStream(getter_AddRefs(stringStreamSup), listBuf);
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) return FTP_ERROR;
NS_RELEASE(converterListener);
return FTP_ERROR;
}
nsCOMPtr<nsIInputStream> listStream = do_QueryInterface(stringStrmSup, &rv); nsCOMPtr<nsIInputStream> listStream = do_QueryInterface(stringStreamSup, &rv);
NS_RELEASE(stringStrmSup);
if (NS_FAILED(rv)) {
NS_RELEASE(converterListener);
return FTP_ERROR;
}
rv = converterListener->OnDataAvailable(mChannel, mFTPContext, listStream, 0, read); rv = converterListener->OnDataAvailable(mChannel, mFTPContext, listStream, 0, read);
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) return FTP_ERROR;
NS_RELEASE(converterListener);
return FTP_ERROR;
}
} }
@ -1375,7 +1341,7 @@ nsFtpConnectionThread::S_retr() {
nsresult rv; nsresult rv;
char *path; char *path;
PRUint32 bytes; PRUint32 bytes;
rv = mUrl->GetPath(&path); rv = mURL->GetPath(&path);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
nsCAutoString retrStr("RETR "); nsCAutoString retrStr("RETR ");
@ -1389,7 +1355,7 @@ nsFtpConnectionThread::S_retr() {
nsAllocator::Free(path); nsAllocator::Free(path);
retrStr.Append(FTP_CRLF); retrStr.Append(FTP_CRLF);
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, retrStr.GetBuffer())); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mURL, retrStr.GetBuffer()));
rv = mCOutStream->Write(retrStr.GetBuffer(), retrStr.Length(), &bytes); rv = mCOutStream->Write(retrStr.GetBuffer(), retrStr.Length(), &bytes);
return rv; return rv;
@ -1414,7 +1380,7 @@ nsFtpConnectionThread::R_retr() {
if (NS_FAILED(rv)) return FTP_ERROR; if (NS_FAILED(rv)) return FTP_ERROR;
char *contentType; char *contentType;
rv = MIMEService->GetTypeFromURI(mUrl, &contentType); rv = MIMEService->GetTypeFromURI(mURL, &contentType);
// if we fail, we want to push the data on up anyway. let the app figure // if we fail, we want to push the data on up anyway. let the app figure
// out what to do. // out what to do.
@ -1422,9 +1388,6 @@ nsFtpConnectionThread::R_retr() {
mFTPContext->SetContentType(contentType); mFTPContext->SetContentType(contentType);
} }
nsISupports *ctxtSup = nsnull;
rv = mFTPContext->QueryInterface(NS_GET_IID(nsISupports), (void**)&ctxtSup);
nsIBufferInputStream *bufInStrm = nsnull; nsIBufferInputStream *bufInStrm = nsnull;
nsIBufferOutputStream *bufOutStrm = nsnull; nsIBufferOutputStream *bufOutStrm = nsnull;
rv = NS_NewPipe(&bufInStrm, &bufOutStrm); rv = NS_NewPipe(&bufInStrm, &bufOutStrm);
@ -1462,7 +1425,6 @@ nsFtpConnectionThread::R_retr() {
// we're done filling this end of the pipe. close it. // we're done filling this end of the pipe. close it.
bufOutStrm->Close(); bufOutStrm->Close();
NS_RELEASE(ctxtSup);
NS_RELEASE(inStream); NS_RELEASE(inStream);
return FTP_READ_BUF; return FTP_READ_BUF;
@ -1482,7 +1444,7 @@ nsFtpConnectionThread::S_pasv() {
char *buffer = "PASV" FTP_CRLF; char *buffer = "PASV" FTP_CRLF;
PRUint32 bytes; PRUint32 bytes;
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, buffer)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mURL, buffer));
return mCOutStream->Write(buffer, PL_strlen(buffer), &bytes); return mCOutStream->Write(buffer, PL_strlen(buffer), &bytes);
} }
@ -1555,14 +1517,14 @@ nsFtpConnectionThread::R_pasv() {
nsAllocator::Free(response); nsAllocator::Free(response);
// now we know where to connect our data channel // now we know where to connect our data channel
rv = mSTS->CreateTransport(host.GetBuffer(), port, nsnull, &mDPipe); // the data channel rv = mSTS->CreateTransport(host.GetBuffer(), port, nsnull, getter_AddRefs(mDPipe)); // the data channel
if (NS_FAILED(rv)) return FTP_ERROR; if (NS_FAILED(rv)) return FTP_ERROR;
if (mAction == GET) { if (mAction == GET) {
// Setup the data channel for file reception // Setup the data channel for file reception
} else { } else {
// get the output stream so we can write to the server // get the output stream so we can write to the server
rv = mDPipe->OpenOutputStream(0, &mDOutStream); rv = mDPipe->OpenOutputStream(0, getter_AddRefs(mDOutStream));
if (NS_FAILED(rv)) return FTP_ERROR; if (NS_FAILED(rv)) return FTP_ERROR;
} }
@ -1593,7 +1555,7 @@ nsFtpConnectionThread::S_del_file() {
nsresult rv; nsresult rv;
char *filename; char *filename;
PRUint32 bytes; PRUint32 bytes;
rv = mUrl->GetPath(&filename); // XXX we should probably check to rv = mURL->GetPath(&filename); // XXX we should probably check to
// XXX make sure we have an actual filename. // XXX make sure we have an actual filename.
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
@ -1602,7 +1564,7 @@ nsFtpConnectionThread::S_del_file() {
delStr.Append(FTP_CRLF); delStr.Append(FTP_CRLF);
nsAllocator::Free(filename); nsAllocator::Free(filename);
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, delStr.GetBuffer())); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mURL, delStr.GetBuffer()));
rv = mCOutStream->Write(delStr.GetBuffer(), delStr.Length(), &bytes); rv = mCOutStream->Write(delStr.GetBuffer(), delStr.Length(), &bytes);
return rv; return rv;
@ -1622,7 +1584,7 @@ nsFtpConnectionThread::S_del_dir() {
nsresult rv; nsresult rv;
char *dir; char *dir;
PRUint32 bytes; PRUint32 bytes;
rv = mUrl->GetPath(&dir); rv = mURL->GetPath(&dir);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
nsCAutoString delDirStr("RMD "); nsCAutoString delDirStr("RMD ");
@ -1630,7 +1592,7 @@ nsFtpConnectionThread::S_del_dir() {
delDirStr.Append(FTP_CRLF); delDirStr.Append(FTP_CRLF);
nsAllocator::Free(dir); nsAllocator::Free(dir);
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, delDirStr.GetBuffer())); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mURL, delDirStr.GetBuffer()));
rv = mCOutStream->Write(delDirStr.GetBuffer(), delDirStr.Length(), &bytes); rv = mCOutStream->Write(delDirStr.GetBuffer(), delDirStr.Length(), &bytes);
return rv; return rv;
@ -1649,7 +1611,7 @@ nsFtpConnectionThread::S_mkdir() {
nsresult rv; nsresult rv;
char *dir; char *dir;
PRUint32 bytes; PRUint32 bytes;
rv = mUrl->GetPath(&dir); rv = mURL->GetPath(&dir);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
nsCAutoString mkdirStr("MKD "); nsCAutoString mkdirStr("MKD ");
@ -1657,7 +1619,7 @@ nsFtpConnectionThread::S_mkdir() {
mkdirStr.Append(FTP_CRLF); mkdirStr.Append(FTP_CRLF);
nsAllocator::Free(dir); nsAllocator::Free(dir);
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, mkdirStr.GetBuffer())); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mURL, mkdirStr.GetBuffer()));
rv = mCOutStream->Write(mkdirStr.GetBuffer(), mkdirStr.Length(), &bytes); rv = mCOutStream->Write(mkdirStr.GetBuffer(), mkdirStr.Length(), &bytes);
return rv; return rv;
@ -1693,10 +1655,10 @@ nsFtpConnectionThread::Run() {
// COMMAND CHANNEL SETUP // COMMAND CHANNEL SETUP
///////////////////////// /////////////////////////
char *host; char *host;
rv = mUrl->GetHost(&host); rv = mURL->GetHost(&host);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
PRInt32 port; PRInt32 port;
rv = mUrl->GetPort(&port); rv = mURL->GetPort(&port);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
// use a cached connection if there is one. // use a cached connection if there is one.
@ -1707,13 +1669,9 @@ nsFtpConnectionThread::Run() {
mCachedConn = PR_TRUE; mCachedConn = PR_TRUE;
// we were passed in a connection to use // we were passed in a connection to use
mCPipe = mConn->mSocketTransport; mCPipe = mConn->mSocketTransport;
NS_ADDREF(mCPipe);
mCInStream = mConn->mInputStream;
NS_ADDREF(mCInStream);
mCInStream = mConn->mInputStream;
mCOutStream = mConn->mOutputStream; mCOutStream = mConn->mOutputStream;
NS_ADDREF(mCOutStream);
mServerType = mConn->mServerType; mServerType = mConn->mServerType;
mCwd = mConn->mCwd; mCwd = mConn->mCwd;
@ -1721,15 +1679,15 @@ nsFtpConnectionThread::Run() {
mUseDefaultPath = mConn->mUseDefaultPath; mUseDefaultPath = mConn->mUseDefaultPath;
} else { } else {
// build our own // build our own
rv = mSTS->CreateTransport(host, port, nsnull, &mCPipe); // the command channel rv = mSTS->CreateTransport(host, port, nsnull, getter_AddRefs(mCPipe)); // the command channel
nsAllocator::Free(host); nsAllocator::Free(host);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
// get the output stream so we can write to the server // get the output stream so we can write to the server
rv = mCPipe->OpenOutputStream(0, &mCOutStream); rv = mCPipe->OpenOutputStream(0, getter_AddRefs(mCOutStream));
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
rv = mCPipe->OpenInputStream(0, -1, &mCInStream); rv = mCPipe->OpenInputStream(0, -1, getter_AddRefs(mCInStream));
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
// cache this stuff. // cache this stuff.
@ -1749,7 +1707,7 @@ nsFtpConnectionThread::Run() {
PRUint32 read; PRUint32 read;
rv = mCInStream->Read(greetBuf, NS_FTP_BUFFER_READ_SIZE, &read); rv = mCInStream->Read(greetBuf, NS_FTP_BUFFER_READ_SIZE, &read);
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x nsFTPConnTrd::Run() greeting read failed with rv = %d\n", mUrl, rv)); PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x nsFTPConnTrd::Run() greeting read failed with rv = %d\n", mURL, rv));
return rv; return rv;
} }
@ -1807,10 +1765,6 @@ nsFtpConnectionThread::Run() {
rv = Process(); rv = Process();
// close the command and data channel (if we have a data channel)
NS_RELEASE(mCPipe);
NS_IF_RELEASE(mDPipe);
return rv; return rv;
} }
@ -1887,54 +1841,43 @@ nsFtpConnectionThread::Init(nsIEventQueue* aFTPEventQ,
nsISupports* aContext) { nsISupports* aContext) {
nsresult rv; nsresult rv;
mHandler = aHandler;
NS_ADDREF(mHandler);
NS_ASSERTION(aEventQ, "FTP: thread needs an event queue to post events to");
mEventQueue = aEventQ;
NS_IF_ADDREF(mEventQueue);
NS_ASSERTION(aFTPEventQ, "FTP: thread needs an event queue to process"); NS_ASSERTION(aFTPEventQ, "FTP: thread needs an event queue to process");
mFTPEventQueue = aFTPEventQ; mFTPEventQueue = aFTPEventQ;
NS_ADDREF(mFTPEventQueue);
NS_ASSERTION(aChannel, "FTP: thread needs a channel"); NS_ASSERTION(aChannel, "FTP: thread needs a channel");
NS_WITH_SERVICE(nsIProxyObjectManager, pIProxyObjectManager, kProxyObjectManagerCID, &rv); NS_WITH_SERVICE(nsIProxyObjectManager, pIProxyObjectManager, kProxyObjectManagerCID, &rv);
if(NS_FAILED(rv)) return rv; if(NS_FAILED(rv)) return rv;
rv = pIProxyObjectManager->GetProxyObject(mEventQueue, rv = pIProxyObjectManager->GetProxyObject(aEventQ,
NS_GET_IID(nsIStreamListener), NS_GET_IID(nsIStreamListener),
aChannel, aChannel,
PROXY_ASYNC | PROXY_ALWAYS, PROXY_ASYNC | PROXY_ALWAYS,
(void**)&mListener); getter_AddRefs(mListener));
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
rv = pIProxyObjectManager->GetProxyObject(mEventQueue, rv = pIProxyObjectManager->GetProxyObject(aEventQ,
NS_GET_IID(nsIStreamListener), NS_GET_IID(nsIStreamListener),
aChannel, aChannel,
PROXY_SYNC | PROXY_ALWAYS, PROXY_SYNC | PROXY_ALWAYS,
(void**)&mSyncListener); getter_AddRefs(mSyncListener));
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
rv = pIProxyObjectManager->GetProxyObject(mEventQueue, rv = pIProxyObjectManager->GetProxyObject(aEventQ,
NS_GET_IID(nsIChannel), NS_GET_IID(nsIChannel),
aChannel, aChannel,
PROXY_SYNC | PROXY_ALWAYS, PROXY_SYNC | PROXY_ALWAYS,
(void**)&mChannel); getter_AddRefs(mChannel));
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
mContext = aContext; mContext = aContext;
NS_IF_ADDREF(mContext); mURL = aUrl;
mUrl = aUrl; mURL->GetSpec(&mURLSpec);
NS_ADDREF(mUrl);
mUrl->GetSpec(&mURLSpec);
// pull any username and/or password out of the uri // pull any username and/or password out of the uri
char *preHost = nsnull; char *preHost = nsnull;
rv = mUrl->GetPreHost(&preHost); rv = mURL->GetPreHost(&preHost);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
if (preHost) { if (preHost) {
@ -1948,10 +1891,10 @@ nsFtpConnectionThread::Init(nsIEventQueue* aFTPEventQ,
} }
char *host; char *host;
rv = mUrl->GetHost(&host); rv = mURL->GetHost(&host);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
PRInt32 port; PRInt32 port;
rv = mUrl->GetPort(&port); rv = mURL->GetPort(&port);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
mCacheKey.SetString(host); mCacheKey.SetString(host);
@ -1962,6 +1905,7 @@ nsFtpConnectionThread::Init(nsIEventQueue* aFTPEventQ,
nsFTPContext *dataCtxt = new nsFTPContext(); nsFTPContext *dataCtxt = new nsFTPContext();
if (!dataCtxt) return NS_ERROR_OUT_OF_MEMORY; if (!dataCtxt) return NS_ERROR_OUT_OF_MEMORY;
rv = dataCtxt->QueryInterface(NS_GET_IID(nsIFTPContext), (void**)&mFTPContext); rv = dataCtxt->QueryInterface(NS_GET_IID(nsIFTPContext), (void**)&mFTPContext);
//mFTPContext = NS_STATIC_CAST(nsIFTPContext*, dataCtxt);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
// get a proxied ptr to the FTP protocol handler service so we can control // get a proxied ptr to the FTP protocol handler service so we can control
@ -1970,7 +1914,7 @@ nsFtpConnectionThread::Init(nsIEventQueue* aFTPEventQ,
NS_GET_IID(nsIConnectionCache), NS_GET_IID(nsIConnectionCache),
aHandler, aHandler,
PROXY_SYNC | PROXY_ALWAYS, PROXY_SYNC | PROXY_ALWAYS,
(void**)&mConnCache); getter_AddRefs(mConnCache));
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
return NS_OK; return NS_OK;
@ -1989,8 +1933,8 @@ nsFtpConnectionThread::StopProcessing() {
PRUnichar* errorMsg = nsnull; PRUnichar* errorMsg = nsnull;
nsresult rv; nsresult rv;
NS_RELEASE(mCOutStream); mCOutStream = 0;
NS_RELEASE(mCInStream); mCInStream = 0;
// if we haven't sent an OnStartRequest() yet, fire one now. We don't want // if we haven't sent an OnStartRequest() yet, fire one now. We don't want
// to blidly send an OnStop if we haven't "started" anything. // to blidly send an OnStop if we haven't "started" anything.
@ -2090,7 +2034,7 @@ nsFtpConnectionThread::FindGetState(void) {
nsresult rv; nsresult rv;
FTP_STATE result = FTP_ERROR; FTP_STATE result = FTP_ERROR;
rv = mUrl->GetPath(&path); rv = mURL->GetPath(&path);
if (NS_FAILED(rv)) return FTP_ERROR; if (NS_FAILED(rv)) return FTP_ERROR;
if (mServerType == FTP_VMS_TYPE) { if (mServerType == FTP_VMS_TYPE) {

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

@ -36,6 +36,7 @@
#include "nsIConnectionCache.h" #include "nsIConnectionCache.h"
#include "nsConnectionCacheObj.h" #include "nsConnectionCacheObj.h"
#include "nsIProtocolHandler.h" #include "nsIProtocolHandler.h"
#include "nsCOMPtr.h"
// ftp server types // ftp server types
#define FTP_GENERIC_TYPE 0 #define FTP_GENERIC_TYPE 0
@ -184,9 +185,8 @@ private:
// Private members // Private members
nsIEventQueue* mEventQueue; // used to communicate outside this thread nsCOMPtr<nsIEventQueue> mFTPEventQueue; // the eventq for this thread.
nsIEventQueue* mFTPEventQueue; // the eventq for this thread. nsCOMPtr<nsIURI> mURL;
nsIURI* mUrl;
FTP_STATE mState; // the current state FTP_STATE mState; // the current state
FTP_STATE mNextState; // the next state FTP_STATE mNextState; // the next state
@ -194,14 +194,14 @@ private:
nsISocketTransportService *mSTS; // the socket transport service; nsISocketTransportService *mSTS; // the socket transport service;
nsIChannel *mCPipe; // the command channel transport nsCOMPtr<nsIChannel> mCPipe; // the command channel transport
nsIChannel *mDPipe; // the data channel transport nsCOMPtr<nsIChannel> mDPipe; // the data channel transport
nsIOutputStream* mCOutStream; // command channel output nsCOMPtr<nsIOutputStream> mCOutStream; // command channel output
nsIInputStream* mCInStream; // command channel input nsCOMPtr<nsIInputStream> mCInStream; // command channel input
nsIOutputStream* mDOutStream; // data channel output nsCOMPtr<nsIOutputStream> mDOutStream; // data channel output
nsIInputStream* mDInStream; // data channel input nsCOMPtr<nsIInputStream> mDInStream; // data channel input
PRInt32 mResponseCode; // the last command response code. PRInt32 mResponseCode; // the last command response code.
nsCAutoString mResponseMsg; // the last command response text nsCAutoString mResponseMsg; // the last command response text
@ -234,15 +234,14 @@ private:
PRBool mSentStart; // have we sent an OnStartRequest() notification PRBool mSentStart; // have we sent an OnStartRequest() notification
nsresult mInternalError; // represents internal state errors nsresult mInternalError; // represents internal state errors
nsIStreamListener* mListener; // the listener we want to call nsCOMPtr<nsIStreamListener> mListener; // the listener we want to call
// during our event firing. // during our event firing.
nsIStreamListener* mSyncListener; // a syncronous version of our listener nsCOMPtr<nsIStreamListener> mSyncListener; // a syncronous version of our listener
nsIChannel* mChannel; nsCOMPtr<nsIChannel> mChannel;
nsISupports* mContext; nsCOMPtr<nsISupports> mContext;
nsIFTPContext* mFTPContext; // FTP channel specific context. nsIFTPContext* mFTPContext; // FTP channel specific context.
nsIConnectionCache* mConnCache; // the nsISupports proxy ptr to the FTP proto handler nsCOMPtr<nsIConnectionCache> mConnCache; // the nsISupports proxy ptr to the FTP proto handler
nsIProtocolHandler* mHandler; // The protocol handler that created this.
nsConnectionCacheObj* mConn; // The cached connection. nsConnectionCacheObj* mConn; // The cached connection.
PRBool mKeepRunning; // thread event loop boolean PRBool mKeepRunning; // thread event loop boolean