From a7fe82e807c7e8e166ebbc530bb0d956ff096d75 Mon Sep 17 00:00:00 2001 From: "sfraser%netscape.com" Date: Wed, 13 Nov 2002 01:08:43 +0000 Subject: [PATCH] Add Init method to nsIStreamLoader to take an nsIChannel, so that we can set up the channel ourselves (for bug 165774). Similar patch has already landed on trunk. DO NOT LAND THIS ON THE TRUNK. git-svn-id: svn://10.0.0.236/branches/CHIMERA_M1_0_1_BRANCH@133717 18797224-902f-48f8-a5cc-f745e15eee43 --- .../netwerk/base/public/nsIStreamLoader.idl | 4 +++ mozilla/netwerk/base/public/nsNetUtil.h | 22 +++++++++++++ mozilla/netwerk/base/src/nsStreamLoader.cpp | 33 +++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/mozilla/netwerk/base/public/nsIStreamLoader.idl b/mozilla/netwerk/base/public/nsIStreamLoader.idl index 0eaeaff38ad..39799a188bd 100644 --- a/mozilla/netwerk/base/public/nsIStreamLoader.idl +++ b/mozilla/netwerk/base/public/nsIStreamLoader.idl @@ -66,6 +66,10 @@ interface nsIStreamLoader : nsISupports in nsIURI referrer, in unsigned long refererFlags); + void initWithChannel(in nsIChannel aChannel, + in nsIStreamLoaderObserver aObserver, + in nsISupports aContext); + /** * Gets the number of bytes read so far. */ diff --git a/mozilla/netwerk/base/public/nsNetUtil.h b/mozilla/netwerk/base/public/nsNetUtil.h index d8dd661f954..7394a66dcd3 100644 --- a/mozilla/netwerk/base/public/nsNetUtil.h +++ b/mozilla/netwerk/base/public/nsNetUtil.h @@ -434,6 +434,28 @@ NS_NewStreamLoader(nsIStreamLoader* *result, return rv; } +inline nsresult +NS_NewStreamLoader(nsIStreamLoader* *result, + nsIChannel* channel, + nsIStreamLoaderObserver* observer, + nsISupports* context = nsnull) +{ + nsresult rv; + nsCOMPtr loader; + static NS_DEFINE_CID(kStreamLoaderCID, NS_STREAMLOADER_CID); + rv = nsComponentManager::CreateInstance(kStreamLoaderCID, + nsnull, + NS_GET_IID(nsIStreamLoader), + getter_AddRefs(loader)); + if (NS_FAILED(rv)) return rv; + rv = loader->InitWithChannel(channel, observer, context); + + if (NS_FAILED(rv)) return rv; + *result = loader; + NS_ADDREF(*result); + return rv; +} + inline nsresult NS_NewRequestObserverProxy(nsIRequestObserver **aResult, nsIRequestObserver *aObserver, diff --git a/mozilla/netwerk/base/src/nsStreamLoader.cpp b/mozilla/netwerk/base/src/nsStreamLoader.cpp index 51450b38ad9..bf8b0ac89c3 100644 --- a/mozilla/netwerk/base/src/nsStreamLoader.cpp +++ b/mozilla/netwerk/base/src/nsStreamLoader.cpp @@ -97,6 +97,39 @@ nsStreamLoader::Init(nsIURI* aURL, return rv; } +NS_IMETHODIMP +nsStreamLoader::InitWithChannel(nsIChannel* channel, + nsIStreamLoaderObserver* observer, + nsISupports* context) +{ + NS_ENSURE_ARG_POINTER(channel); + NS_ENSURE_ARG_POINTER(observer); + + nsresult rv = channel->AsyncOpen(this, context); + + if (NS_FAILED(rv) && observer) { + // don't callback synchronously as it puts the caller + // in a recursive situation and breaks the asynchronous + // semantics of nsIStreamLoader + nsresult rv2 = NS_OK; + nsCOMPtr pIProxyObjectManager = + do_GetService(kProxyObjectManagerCID, &rv2); + if (NS_FAILED(rv2)) return rv2; + + nsCOMPtr pObserver; + rv2 = pIProxyObjectManager->GetProxyForObject(NS_CURRENT_EVENTQ, + NS_GET_IID(nsIStreamLoaderObserver), observer, + PROXY_ASYNC | PROXY_ALWAYS, getter_AddRefs(pObserver)); + if (NS_FAILED(rv2)) return rv2; + + rv = pObserver->OnStreamComplete(this, context, rv, 0, nsnull); + } + + mObserver = observer; + mContext = context; + return rv; +} + NS_METHOD nsStreamLoader::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult) {