fixes 95671, 96129. Caching control connections fixed, removing check against browser.enabled.cache, fixing double list response handling error. r= gordon, darin, sr= darin

This commit is contained in:
dougt%netscape.com 2001-08-21 19:40:55 +00:00
Родитель 728471dfeb
Коммит 26380f5632
4 изменённых файлов: 28 добавлений и 72 удалений

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

@ -766,9 +766,6 @@ nsFtpState::Process()
if (FTP_ERROR == mState)
mInternalError = NS_ERROR_FAILURE;
//(DONE)
mNextState = FTP_COMPLETE;
break;
// SIZE
@ -1235,11 +1232,17 @@ nsFtpState::S_list() {
FTP_STATE
nsFtpState::R_list() {
if ((mResponseCode/100 == 4) || (mResponseCode/100 == 5)) {
mFireCallbacks = PR_TRUE;
return FTP_ERROR;
if (mResponseCode/100 == 1)
return FTP_READ_BUF;
if (mResponseCode/100 == 2) {
//(DONE)
mNextState = FTP_COMPLETE;
return FTP_COMPLETE;
}
return FTP_READ_BUF;
mFireCallbacks = PR_TRUE;
return FTP_ERROR;
}
nsresult

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

@ -88,32 +88,9 @@ NS_IMPL_THREADSAFE_ISUPPORTS2(nsFtpStreamProvider,
// nsFtpControlConnection implementation ...
//
NS_IMPL_THREADSAFE_QUERY_INTERFACE2(nsFtpControlConnection,
nsIStreamListener,
nsIRequestObserver);
NS_IMPL_THREADSAFE_ADDREF(nsFtpControlConnection);
nsrefcnt nsFtpControlConnection::Release(void)
{
nsrefcnt count;
NS_PRECONDITION(0 != mRefCnt, "dup release");
count = PR_AtomicDecrement((PRInt32 *)&mRefCnt);
NS_LOG_RELEASE(this, count, "nsFtpControlConnection");
if (0 == count) {
mRefCnt = 1; /* stabilize */
/* enable this to find non-threadsafe destructors: */
/* NS_ASSERT_OWNINGTHREAD(_class); */
NS_DELETEXPCOM(this);
return 0;
}
else if (1 == count && mConnected)
{
// mPipe has a reference to |this| caused by AsyncRead()
// Break this cycle by calling disconnect.
Disconnect(NS_BINDING_ABORTED);
}
return count;
}
NS_IMPL_THREADSAFE_ISUPPORTS2(nsFtpControlConnection,
nsIStreamListener,
nsIRequestObserver);
nsFtpControlConnection::nsFtpControlConnection(const char* host, PRUint32 port)
{
@ -123,7 +100,6 @@ nsFtpControlConnection::nsFtpControlConnection(const char* host, PRUint32 port)
mHost.Adopt(nsCRT::strdup(host));
mPort = port;
mServerType = 0;
mConnected = PR_FALSE;
mLock = PR_NewLock();
NS_ASSERTION(mLock, "null lock");
@ -139,8 +115,8 @@ nsFtpControlConnection::~nsFtpControlConnection()
PRBool
nsFtpControlConnection::IsAlive()
{
if (!mConnected)
return mConnected;
if (!mCPipe)
return PR_FALSE;
PRBool isAlive = PR_FALSE;
nsCOMPtr<nsISocketTransport> sTrans = do_QueryInterface(mCPipe);
@ -205,21 +181,16 @@ nsFtpControlConnection::Connect()
nsnull, 0, PRUint32(-1), 0,
getter_AddRefs(mReadRequest));
mConnected = PR_TRUE;
return rv;
}
nsresult
nsFtpControlConnection::Disconnect(nsresult status)
{
if (!mConnected) return NS_ERROR_FAILURE;
if (!mCPipe) return NS_ERROR_FAILURE;
PR_LOG(gFTPLog, PR_LOG_ALWAYS, ("(%x) nsFtpControlConnection disconnecting (%x)", this, status));
if (NS_FAILED(status)) {
mConnected = PR_FALSE;
}
if (mWriteRequest) {
mWriteRequest->Cancel(status);
mWriteRequest = nsnull;
@ -234,7 +205,7 @@ nsFtpControlConnection::Disconnect(nsresult status)
nsresult
nsFtpControlConnection::Write(nsCString& command, PRBool suspend)
{
if (!mConnected)
if (!mCPipe)
return NS_ERROR_FAILURE;
PRUint32 len = command.Length();
@ -276,7 +247,7 @@ nsFtpControlConnection::SetStreamListener(nsIStreamListener *aListener)
NS_IMETHODIMP
nsFtpControlConnection::OnStartRequest(nsIRequest *request, nsISupports *aContext)
{
if (!mConnected)
if (!mCPipe)
return NS_OK;
// we do not care about notifications from the write channel.
@ -299,7 +270,7 @@ nsFtpControlConnection::OnStopRequest(nsIRequest *request, nsISupports *aContext
nsresult aStatus)
{
if (!mConnected)
if (!mCPipe)
return NS_OK;
// we do not care about successful notifications from the write channel.
@ -325,7 +296,7 @@ nsFtpControlConnection::OnDataAvailable(nsIRequest *request,
PRUint32 aOffset,
PRUint32 aCount)
{
if (!mConnected)
if (!mCPipe)
return NS_OK;
PR_Lock(mLock);

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

@ -71,7 +71,6 @@ private:
nsCOMPtr<nsITransport> mCPipe;
nsCOMPtr<nsIOutputStream> mOutStream;
nsCOMPtr<nsIStreamListener> mListener;
PRPackedBool mConnected;
PRPackedBool mWriteSuspened;
};

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

@ -167,33 +167,16 @@ nsFtpProtocolHandler::NewChannel(nsIURI* url, nsIChannel* *result)
nsFTPChannel* channel = nsnull;
rv = nsFTPChannel::Create(nsnull, NS_GET_IID(nsIChannel), (void**)&channel);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsICacheService> serv = do_GetService(kCacheServiceCID, &rv);
if (serv)
serv->CreateSession("FTP",
nsICache::STORE_ANYWHERE,
nsICache::STREAM_BASED,
getter_AddRefs(mCacheSession));
static PRBool checkedPref = PR_FALSE;
static PRBool useCache = PR_TRUE;
if (!checkedPref) {
// XXX should register a prefs changed callback for this
nsCOMPtr<nsIPref> prefs = do_GetService(kPrefServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
prefs->GetBoolPref("browser.cache.enable", &useCache);
checkedPref = PR_TRUE;
}
if (useCache && !mCacheSession) {
nsCOMPtr<nsICacheService> serv = do_GetService(kCacheServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
rv = serv->CreateSession("FTP",
nsICache::STORE_ANYWHERE,
nsICache::STREAM_BASED,
getter_AddRefs(mCacheSession));
if (NS_FAILED(rv)) return rv;
if (mCacheSession)
rv = mCacheSession->SetDoomEntriesIfExpired(PR_TRUE);
if (NS_FAILED(rv)) return rv;
}
rv = channel->Init(url, mCacheSession);
if (NS_FAILED(rv)) {