From 8c89b9d52749fdcc63b5fc4d498c80d7a2dba1d5 Mon Sep 17 00:00:00 2001 From: "darin%netscape.com" Date: Fri, 14 Dec 2001 22:54:56 +0000 Subject: [PATCH] fixes bug 115129 "stream loader optimizations" r=gagan, sr=brendan,dveditz git-svn-id: svn://10.0.0.236/trunk@110490 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/modules/libjar/nsJARChannel.cpp | 5 +- mozilla/netwerk/base/src/nsStreamLoader.cpp | 47 ++++++++++--------- mozilla/netwerk/base/src/nsStreamLoader.h | 4 +- .../netwerk/protocol/jar/src/nsJARChannel.cpp | 5 +- 4 files changed, 37 insertions(+), 24 deletions(-) diff --git a/mozilla/modules/libjar/nsJARChannel.cpp b/mozilla/modules/libjar/nsJARChannel.cpp index 5b05e5560b9..6d84a124828 100644 --- a/mozilla/modules/libjar/nsJARChannel.cpp +++ b/mozilla/modules/libjar/nsJARChannel.cpp @@ -699,7 +699,10 @@ nsJARChannel::GetInputStream(nsIInputStream* *aInputStream) } #endif NS_ENSURE_TRUE(mJAR, NS_ERROR_NULL_POINTER); - return mJAR->GetInputStream(mJAREntry, aInputStream); + nsresult rv = mJAR->GetInputStream(mJAREntry, aInputStream); + if (NS_SUCCEEDED(rv)) + (*aInputStream)->Available((PRUint32 *) &mContentLength); + return rv; } NS_IMETHODIMP diff --git a/mozilla/netwerk/base/src/nsStreamLoader.cpp b/mozilla/netwerk/base/src/nsStreamLoader.cpp index 309da4021f4..bd3dfe250a6 100644 --- a/mozilla/netwerk/base/src/nsStreamLoader.cpp +++ b/mozilla/netwerk/base/src/nsStreamLoader.cpp @@ -117,10 +117,18 @@ nsStreamLoader::GetRequest(nsIRequest **aRequest) return NS_OK; } - NS_IMETHODIMP nsStreamLoader::OnStartRequest(nsIRequest* request, nsISupports *ctxt) { + nsCOMPtr chan( do_QueryInterface(request) ); + if (chan) { + PRInt32 contentLength = -1; + chan->GetContentLength(&contentLength); + if (contentLength >= 0) { + // preallocate buffer + mData.SetCapacity(contentLength + 1); + } + } return NS_OK; } @@ -141,30 +149,27 @@ nsStreamLoader::OnStopRequest(nsIRequest* request, nsISupports *ctxt, return NS_OK; } -#define BUF_SIZE 1024 +NS_METHOD +nsStreamLoader::WriteSegmentFun(nsIInputStream *inStr, + void *closure, + const char *fromSegment, + PRUint32 toOffset, + PRUint32 count, + PRUint32 *writeCount) +{ + nsStreamLoader *self = (nsStreamLoader *) closure; + + self->mData.Append(fromSegment, count); + *writeCount = count; + + return NS_OK; +} NS_IMETHODIMP nsStreamLoader::OnDataAvailable(nsIRequest* request, nsISupports *ctxt, nsIInputStream *inStr, PRUint32 sourceOffset, PRUint32 count) { - nsresult rv = NS_OK; - char buffer[BUF_SIZE]; - PRUint32 len, lenRead; - - rv = inStr->Available(&len); - if (NS_FAILED(rv)) return rv; - - while (len > 0) { - lenRead = PR_MIN(len, BUF_SIZE); - rv = inStr->Read(buffer, lenRead, &lenRead); - if (NS_FAILED(rv) || lenRead == 0) { - return rv; - } - - mData.Append(buffer, lenRead); - len -= lenRead; - } - - return rv; + PRUint32 countRead; + return inStr->ReadSegments(WriteSegmentFun, this, count, &countRead); } diff --git a/mozilla/netwerk/base/src/nsStreamLoader.h b/mozilla/netwerk/base/src/nsStreamLoader.h index 563650cd757..b91658fd638 100644 --- a/mozilla/netwerk/base/src/nsStreamLoader.h +++ b/mozilla/netwerk/base/src/nsStreamLoader.h @@ -59,11 +59,13 @@ public: Create(nsISupports *aOuter, REFNSIID aIID, void **aResult); protected: + static NS_METHOD WriteSegmentFun(nsIInputStream *, void *, const char *, + PRUint32, PRUint32, PRUint32 *); + nsCOMPtr mObserver; nsCOMPtr mContext; // the observer's context nsCString mData; nsCOMPtr mRequest; -/// nsCOMPtr mLoadGroup; }; #endif // nsStreamLoader_h__ diff --git a/mozilla/netwerk/protocol/jar/src/nsJARChannel.cpp b/mozilla/netwerk/protocol/jar/src/nsJARChannel.cpp index 5b05e5560b9..6d84a124828 100644 --- a/mozilla/netwerk/protocol/jar/src/nsJARChannel.cpp +++ b/mozilla/netwerk/protocol/jar/src/nsJARChannel.cpp @@ -699,7 +699,10 @@ nsJARChannel::GetInputStream(nsIInputStream* *aInputStream) } #endif NS_ENSURE_TRUE(mJAR, NS_ERROR_NULL_POINTER); - return mJAR->GetInputStream(mJAREntry, aInputStream); + nsresult rv = mJAR->GetInputStream(mJAREntry, aInputStream); + if (NS_SUCCEEDED(rv)) + (*aInputStream)->Available((PRUint32 *) &mContentLength); + return rv; } NS_IMETHODIMP