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
This commit is contained in:
sfraser%netscape.com
2002-11-13 01:08:43 +00:00
parent 9364e0414b
commit a7fe82e807
3 changed files with 59 additions and 0 deletions

View File

@@ -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.
*/

View File

@@ -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<nsIStreamLoader> 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,

View File

@@ -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<nsIProxyObjectManager> pIProxyObjectManager =
do_GetService(kProxyObjectManagerCID, &rv2);
if (NS_FAILED(rv2)) return rv2;
nsCOMPtr<nsIStreamLoaderObserver> 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)
{