From fccb2d91f6502bc4552b5c3874f1ff395bc24c18 Mon Sep 17 00:00:00 2001 From: "rpotts%netscape.com" Date: Mon, 25 Jun 2001 06:22:44 +0000 Subject: [PATCH] bug #82458 (r=jst, sr=darin, a=blizzard). THis patch causes STATE_TRANSFERRING notifications to fire when URLs are loaded out of the disk cache or memory cache... git-svn-id: svn://10.0.0.236/trunk@97855 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/netwerk/base/src/nsFileTransport.cpp | 4 ++-- .../netwerk/base/src/nsStorageTransport.cpp | 24 +++++++++++++++++-- mozilla/netwerk/base/src/nsStorageTransport.h | 10 ++++++++ .../cache/src/nsCacheEntryDescriptor.cpp | 19 +++++++++++---- .../cache/src/nsCacheEntryDescriptor.h | 8 +++++-- .../protocol/http/src/nsHttpChannel.cpp | 6 +++++ 6 files changed, 61 insertions(+), 10 deletions(-) diff --git a/mozilla/netwerk/base/src/nsFileTransport.cpp b/mozilla/netwerk/base/src/nsFileTransport.cpp index b55aae8697f..70625a236fc 100644 --- a/mozilla/netwerk/base/src/nsFileTransport.cpp +++ b/mozilla/netwerk/base/src/nsFileTransport.cpp @@ -715,7 +715,7 @@ nsFileTransport::Process(void) LOG(("nsFileTransport: READING [this=%x %s] transferAmt=%u mBufferMaxSize=%u\n", this, mStreamName.get(), transferAmt, mBufferMaxSize)); - PRUint32 total, offset = mSourceWrapper->GetBytesRead(); + PRUint32 total = 0, offset = mSourceWrapper->GetBytesRead(); // Give the listener a chance to read at most transferAmt bytes from // the source input stream. @@ -762,7 +762,7 @@ nsFileTransport::Process(void) mStatus = status; mXferState = END_READ; } - else { + if (total) { // something was read... offset += total; mOffset += total; diff --git a/mozilla/netwerk/base/src/nsStorageTransport.cpp b/mozilla/netwerk/base/src/nsStorageTransport.cpp index bd39cfce1c6..cd05e7b8611 100644 --- a/mozilla/netwerk/base/src/nsStorageTransport.cpp +++ b/mozilla/netwerk/base/src/nsStorageTransport.cpp @@ -197,6 +197,15 @@ nsStorageTransport::Available(PRUint32 aStartingFrom, PRUint32 *aCount) return NS_OK; } +void +nsStorageTransport::FireOnProgress(nsIRequest *aRequest, + nsISupports *aContext, + PRUint32 aByteOffset) +{ + if (mProgressSink) + mProgressSink->OnProgress(aRequest, aContext, aByteOffset, mWriteCursor); +} + nsresult nsStorageTransport::AddWriteSegment() { @@ -285,7 +294,9 @@ NS_IMETHODIMP nsStorageTransport::GetNotificationCallbacks(nsIInterfaceRequestor** aCallbacks) { NS_ENSURE_ARG_POINTER(aCallbacks); - *aCallbacks = nsnull; + *aCallbacks = mCallbacks; + + NS_IF_ADDREF(*aCallbacks); return NS_OK; } @@ -293,7 +304,14 @@ NS_IMETHODIMP nsStorageTransport::SetNotificationCallbacks(nsIInterfaceRequestor* aCallbacks, PRUint32 flags) { - return NS_ERROR_NOT_IMPLEMENTED; + mCallbacks = aCallbacks; + + if (mCallbacks) + mProgressSink = do_QueryInterface(mCallbacks); + else + mProgressSink = 0; + + return NS_OK; } NS_IMETHODIMP @@ -466,6 +484,8 @@ nsStorageTransport::nsReadRequest::Process() this, mTransferOffset, count); + // Fire the progress notification... + mTransport->FireOnProgress(this, mListenerContext, mTransferOffset); } else if ((mTransferCount == 0) || !mTransport->HasWriter()) { diff --git a/mozilla/netwerk/base/src/nsStorageTransport.h b/mozilla/netwerk/base/src/nsStorageTransport.h index 2db6921918b..286157c9398 100644 --- a/mozilla/netwerk/base/src/nsStorageTransport.h +++ b/mozilla/netwerk/base/src/nsStorageTransport.h @@ -31,6 +31,9 @@ #include "prclist.h" #include "nsCOMPtr.h" +#include "nsIInterfaceRequestor.h" +#include "nsIProgressEventSink.h" + /** * Each "stream-based" memory cache entry has one transport * associated with it. The transport supports multiple @@ -155,6 +158,10 @@ public: /* internal */ PRBool HasWriter() { return (mOutputStream != nsnull); } + void FireOnProgress(nsIRequest *aRequest, + nsISupports *aContext, + PRUint32 aOffset); + private: /** @@ -192,6 +199,9 @@ private: nsSegment *mWriteSegment; PRUint32 mWriteCursor; + + nsCOMPtr mCallbacks; + nsCOMPtr mProgressSink; }; #endif diff --git a/mozilla/netwerk/cache/src/nsCacheEntryDescriptor.cpp b/mozilla/netwerk/cache/src/nsCacheEntryDescriptor.cpp index 6facd72acde..0d678a655bf 100644 --- a/mozilla/netwerk/cache/src/nsCacheEntryDescriptor.cpp +++ b/mozilla/netwerk/cache/src/nsCacheEntryDescriptor.cpp @@ -434,6 +434,10 @@ nsTransportWrapper::EnsureTransportWithAccess(nsCacheAccessMode mode) descriptor->mAccessGranted, getter_AddRefs(mTransport)); if (NS_FAILED(rv)) return rv; + + if (mCallbacks) { + mTransport->SetNotificationCallbacks(mCallbacks, mCallbackFlags); + } } return NS_OK; } @@ -468,9 +472,11 @@ NS_IMETHODIMP nsCacheEntryDescriptor:: nsTransportWrapper::GetNotificationCallbacks(nsIInterfaceRequestor **result) { NS_ENSURE_ARG_POINTER(result); - // if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; - return NS_ERROR_NOT_IMPLEMENTED; + *result = mCallbacks; + NS_IF_ADDREF(*result); + + return NS_OK; } @@ -478,9 +484,14 @@ NS_IMETHODIMP nsCacheEntryDescriptor:: nsTransportWrapper::SetNotificationCallbacks(nsIInterfaceRequestor *requestor, PRUint32 flags) { - // if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; + if (mTransport) { + mTransport->SetNotificationCallbacks(requestor, flags); + } - return NS_ERROR_NOT_IMPLEMENTED; + mCallbacks = requestor; + mCallbackFlags = flags; + + return NS_OK;; } diff --git a/mozilla/netwerk/cache/src/nsCacheEntryDescriptor.h b/mozilla/netwerk/cache/src/nsCacheEntryDescriptor.h index d197e502309..39a5d1c29c0 100644 --- a/mozilla/netwerk/cache/src/nsCacheEntryDescriptor.h +++ b/mozilla/netwerk/cache/src/nsCacheEntryDescriptor.h @@ -29,6 +29,7 @@ #include "nsCacheEntry.h" #include "nsIOutputStream.h" #include "nsITransport.h" +#include "nsIInterfaceRequestor.h" /****************************************************************************** * nsCacheEntryDescriptor @@ -76,12 +77,15 @@ private: NS_DECL_ISUPPORTS_INHERITED NS_DECL_NSITRANSPORT - nsTransportWrapper() : mTransport(nsnull) {} + nsTransportWrapper() : mCallbackFlags(0) {} virtual ~nsTransportWrapper() {} nsresult EnsureTransportWithAccess(nsCacheAccessMode mode); - nsCOMPtr mTransport; + PRUint32 mCallbackFlags; + + nsCOMPtr mTransport; + nsCOMPtr mCallbacks; }; // end of class nsTransportWrapper friend class nsTransportWrapper; diff --git a/mozilla/netwerk/protocol/http/src/nsHttpChannel.cpp b/mozilla/netwerk/protocol/http/src/nsHttpChannel.cpp index f799cf69163..c9bf9edd362 100644 --- a/mozilla/netwerk/protocol/http/src/nsHttpChannel.cpp +++ b/mozilla/netwerk/protocol/http/src/nsHttpChannel.cpp @@ -906,6 +906,12 @@ nsHttpChannel::ReadFromCache() nsresult rv = mCacheEntry->GetTransport(getter_AddRefs(mCacheTransport)); if (NS_FAILED(rv)) return rv; + // Hookup the notification callbacks interface to the new transport... + mCacheTransport->SetNotificationCallbacks(this, + ((mLoadFlags & nsIRequest::LOAD_BACKGROUND) + ? nsITransport::DONT_REPORT_PROGRESS + : 0)); + // Pump the cache data downstream return mCacheTransport->AsyncRead(this, mListenerContext, 0, PRUint32(-1), 0,