Added start request event firing, and we now maintain the initial response code from a multi-line response

This commit is contained in:
valeski%netscape.com 1999-08-24 21:53:27 +00:00
Родитель 5531d305c5
Коммит 8e17ea1cfb
1 изменённых файлов: 52 добавлений и 26 удалений

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

@ -137,12 +137,22 @@ nsFtpConnectionThread::~nsFtpConnectionThread() {
NS_IF_RELEASE(mContext);
NS_IF_RELEASE(mEventQueue);
// Close the data channel
NS_IF_RELEASE(mDPipe);
// Close the command channel
NS_RELEASE(mCPipe);
// lose the socket transport
NS_RELEASE(mSTS);
nsAllocator::Free(mURLSpec);
}
nsresult
nsFtpConnectionThread::Process() {
nsresult rv;
PRBool continueRead = PR_FALSE;
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("nsFtpConnectionThread::Process() started for %x (spec =%s)\n", mUrl, mURLSpec));
@ -166,11 +176,13 @@ nsFtpConnectionThread::Process() {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Process() - READ_BUF - read \"%s\" (%d bytes)\n", mUrl, buffer, read));
// get the response code out.
PR_sscanf(buffer, "%d", &mResponseCode);
mResponseCode = mResponseCode / 100; // truncate it
if (!continueRead) {
PR_sscanf(buffer, "%d", &mResponseCode);
mResponseCode = mResponseCode / 100; // truncate it
}
// see if we're handling a multi-line response.
if (buffer[3] == '-') {
if (continueRead || (buffer[3] == '-')) {
// yup, multi-line response, start appending
char *tmpBuffer = buffer, *crlf = nsnull;
PRBool lastLine = PR_FALSE;
@ -197,8 +209,10 @@ nsFtpConnectionThread::Process() {
} else {
mState = mNextState;
}
continueRead = PR_FALSE;
} else {
// don't increment state, we need to read more.
continueRead = PR_TRUE;
}
break;
}
@ -693,6 +707,7 @@ nsFtpConnectionThread::Process() {
///////////////////////////////////
nsresult
nsFtpConnectionThread::S_user() {
nsresult rv;
char *buffer;
PRUint32 bufLen, bytes;
nsString2 usernameStr("USER ");
@ -712,8 +727,9 @@ nsFtpConnectionThread::S_user() {
PR_LOG(gFTPLog, PR_LOG_DEBUG, ("%x Writing \"%s\"\n", mUrl, buffer));
return mCOutStream->Write(buffer, bufLen, &bytes);
rv = mCOutStream->Write(buffer, bufLen, &bytes);
nsAllocator::Free(buffer);
return rv;
}
FTP_STATE
@ -1229,21 +1245,32 @@ nsFtpConnectionThread::R_list() {
nsISupports *ctxtSup = nsnull;
rv = dataCtxt->QueryInterface(nsCOMTypeInfo<nsISupports>::GetIID(), (void**)&ctxtSup);
nsFtpOnDataAvailableEvent* event =
new nsFtpOnDataAvailableEvent(mListener, mChannel, ctxtSup); // XXX the destroy event method
// XXX needs to clean up this new.
if (!event) return FTP_ERROR;
// tell the user that we've begun the transaction.
nsFtpOnStartRequestEvent* startEvent =
new nsFtpOnStartRequestEvent(mListener, mChannel, mContext);
if (!startEvent) return FTP_ERROR;
rv = event->Init(stringStream, 0, read);
NS_RELEASE(stringStream);
rv = startEvent->Fire(mEventQueue);
if (NS_FAILED(rv)) {
delete event;
delete startEvent;
return FTP_ERROR;
}
rv = event->Fire(mEventQueue);
nsFtpOnDataAvailableEvent* availEvent =
new nsFtpOnDataAvailableEvent(mListener, mChannel, ctxtSup); // XXX the destroy event method
// XXX needs to clean up this new.
if (!availEvent) return FTP_ERROR;
rv = availEvent->Init(stringStream, 0, read);
NS_RELEASE(stringStream);
if (NS_FAILED(rv)) {
delete event;
delete availEvent;
return FTP_ERROR;
}
rv = availEvent->Fire(mEventQueue);
if (NS_FAILED(rv)) {
delete availEvent;
return FTP_ERROR;
}
@ -1318,6 +1345,17 @@ nsFtpConnectionThread::R_retr() {
nsISupports *ctxtSup = nsnull;
rv = dataCtxt->QueryInterface(nsCOMTypeInfo<nsISupports>::GetIID(), (void**)&ctxtSup);
// tell the user that we've begun the transaction.
nsFtpOnStartRequestEvent* startEvent =
new nsFtpOnStartRequestEvent(mListener, mChannel, mContext);
if (!startEvent) return FTP_ERROR;
rv = startEvent->Fire(mEventQueue);
if (NS_FAILED(rv)) {
delete startEvent;
return FTP_ERROR;
}
nsFtpOnDataAvailableEvent* event =
new nsFtpOnDataAvailableEvent(mListener, mChannel, ctxtSup); // XXX the destroy event method
// XXX needs to clean up this new.
@ -1452,7 +1490,7 @@ nsFtpConnectionThread::R_pasv() {
char *type = nsnull;
rv = mChannel->GetContentType(&type);
nsString2 typeStr;
if (NS_FAILED(rv))
if (NS_FAILED(rv) || !type)
typeStr = "bin";
else
typeStr = type;
@ -1629,18 +1667,6 @@ nsFtpConnectionThread::Run() {
mConnected = PR_TRUE;
// tell the user that we've begun the transaction.
nsFtpOnStartRequestEvent* event =
new nsFtpOnStartRequestEvent(mListener, mChannel, mContext);
if (event == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
rv = event->Fire(mEventQueue);
if (NS_FAILED(rv)) {
delete event;
return rv;
}
rv = Process();
NS_RELEASE(mCPipe);