21250 Need to implement stream-as-file service

This commit is contained in:
davidm%netscape.com 2000-05-17 05:14:29 +00:00
Родитель 493e8d689b
Коммит ad449f9480
2 изменённых файлов: 90 добавлений и 5 удалений

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

@ -101,7 +101,7 @@ nsHTTPChannel::nsHTTPChannel(nsIURI* i_URL, nsHTTPHandler* i_Handler):
mPipelinedRequest (nsnull)
{
NS_INIT_REFCNT();
NS_NewISupportsArray ( getter_AddRefs (mStreamAsFileObserverArray ) );
#if defined(PR_LOGGING)
nsXPIDLCString urlCString;
mURI->GetSpec(getter_Copies(urlCString));
@ -137,13 +137,14 @@ nsHTTPChannel::~nsHTTPChannel()
CRTFREEIF(mProxy);
}
NS_IMPL_THREADSAFE_ISUPPORTS6(nsHTTPChannel,
NS_IMPL_THREADSAFE_ISUPPORTS7(nsHTTPChannel,
nsIHTTPChannel,
nsIChannel,
nsIInterfaceRequestor,
nsIProgressEventSink,
nsIProxy,
nsIRequest);
nsIRequest,
nsIStreamAsFile);
////////////////////////////////////////////////////////////////////////////////
// nsIRequest methods:
@ -877,6 +878,7 @@ nsHTTPChannel::CheckCache()
mURI->GetSpec(getter_Copies(urlCString));
rv = cacheManager->GetCachedNetData(urlCString, 0, 0, cacheFlags,
getter_AddRefs(mCacheEntry));
if (NS_FAILED(rv)) return rv;
NS_ASSERTION(mCacheEntry,
"Cache manager must always return cache entry");
@ -884,6 +886,21 @@ nsHTTPChannel::CheckCache()
return NS_ERROR_FAILURE;
}
// Hook up stream as listener
nsCOMPtr<nsIStreamAsFile> streamAsFile( do_QueryInterface( mCacheEntry ) );
if ( streamAsFile )
{
nsCOMPtr< nsIStreamAsFileObserver> observer;
PRUint32 count = 0;
mStreamAsFileObserverArray->Count( & count );
for ( PRInt32 i=0; i< count; i++ )
{
mStreamAsFileObserverArray->GetElementAt( i, getter_AddRefs( observer ) );
streamAsFile->AddObserver( observer );
}
}
// Be pessimistic: Assume cache entry has no useful data
mCachedContentIsAvailable = mCachedContentIsValid = PR_FALSE;
@ -1449,11 +1466,13 @@ nsresult nsHTTPChannel::Redirect(const char *aNewLocation,
//
NS_WITH_SERVICE(nsIIOService, serv, kIOServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
if (aStatusCode == 305) // Use-Proxy
{
newURI = mURI;
nsCOMPtr<nsIURI> tmpURI;
rv = serv->NewURI(aNewLocation, mURI, getter_AddRefs(tmpURI));
@ -2129,6 +2148,22 @@ nsHTTPChannel::ProcessNotModifiedResponse(nsIStreamListener *aListener)
rv = mCacheEntry->NewChannel(mLoadGroup, getter_AddRefs(mCacheTransport));
if (NS_FAILED (rv)) return rv;
// Set StreamAsFileObserver
nsCOMPtr<nsIStreamAsFile> streamAsFile( do_QueryInterface( mCacheTransport ) );
if ( streamAsFile )
{
nsCOMPtr< nsIStreamAsFileObserver> observer;
PRUint32 count = 0;
mStreamAsFileObserverArray->Count( & count );
for ( PRInt32 i=0; i< count; i++ )
{
mStreamAsFileObserverArray->GetElementAt( i, getter_AddRefs( observer ) );
streamAsFile->AddObserver( observer );
}
}
// Create a new HTTPCacheListener...
nsHTTPResponseListener *cacheListener;
cacheListener = new nsHTTPCacheListener(this, mHandler);
@ -2345,3 +2380,47 @@ nsHTTPChannel::SetUploadStream(nsIInputStream * aUploadStream)
return mRequest->SetUploadStream(aUploadStream);
}
NS_IMETHODIMP
nsHTTPChannel::GetFile(nsIFile * *aFile)
{
nsCOMPtr<nsIStreamAsFile> streamAsFile( do_QueryInterface( mCacheEntry ) );
if( streamAsFile.get() )
return streamAsFile->GetFile( aFile );
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsHTTPChannel::AddObserver(nsIStreamAsFileObserver *aObserver)
{
nsCOMPtr<nsISupports> isupports( aObserver );
PRInt32 index = 0;
nsresult rv;
mStreamAsFileObserverArray->GetIndexOf( isupports, &index );
if ( index == -1 )
{
rv = mStreamAsFileObserverArray->AppendElement( isupports );
if ( NS_FAILED( rv ) ) return rv;
}
nsCOMPtr<nsIStreamAsFile> streamAsFile( do_QueryInterface( mCacheEntry ) );
if( streamAsFile.get() )
return streamAsFile->AddObserver( aObserver );
return NS_OK;
}
NS_IMETHODIMP
nsHTTPChannel::RemoveObserver(nsIStreamAsFileObserver *aObserver)
{
nsCOMPtr<nsISupports> isupports( aObserver );
mStreamAsFileObserverArray->RemoveElement( isupports );
nsCOMPtr<nsIStreamAsFile> streamAsFile( do_QueryInterface( mCacheEntry ) );
if( streamAsFile.get() )
return streamAsFile->RemoveObserver( aObserver );
return NS_OK;
}

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

@ -42,6 +42,8 @@
#include "nsIProxy.h"
#include "nsIPrompt.h"
#include "nsIHTTPEventSink.h"
#include "nsIStreamAsFile.h"
class nsIFile;
class nsHTTPRequest;
class nsHTTPResponse;
@ -66,7 +68,8 @@ DupString(char* *o_Dest, const char* i_Src);
class nsHTTPChannel : public nsIHTTPChannel,
public nsIInterfaceRequestor,
public nsIProgressEventSink,
public nsIProxy
public nsIProxy,
public nsIStreamAsFile
{
public:
@ -83,7 +86,8 @@ public:
NS_DECL_NSIINTERFACEREQUESTOR
NS_DECL_NSIPROGRESSEVENTSINK
NS_DECL_NSIPROXY
NS_DECL_NSISTREAMASFILE
// nsHTTPChannel methods:
nsresult Authenticate(const char *iChallenge,
PRBool bProxyAuth = PR_FALSE);
@ -186,6 +190,8 @@ protected:
PRBool mPipeliningAllowed;
nsHTTPPipelinedRequest* mPipelinedRequest;
nsCOMPtr<nsISupports> mSecurityInfo;
// Stream as file
nsCOMPtr<nsISupportsArray> mStreamAsFileObserverArray;
};
#endif /* _nsHTTPChannel_h_ */