Merged in file transport stuff (now file transport is obsolete).

This commit is contained in:
warren@netscape.com
1999-06-12 07:14:19 +00:00
parent b4b3a1fc5d
commit c06a5c0117
9 changed files with 561 additions and 36 deletions

View File

@@ -24,16 +24,34 @@
#include "nsIServiceManager.h"
#include "nsIEventSinkGetter.h"
#include "nsIProgressEventSink.h"
#include "nsIThread.h"
#include "nsISupportsArray.h"
#include "nsFileSpec.h"
static NS_DEFINE_CID(kStandardURLCID, NS_STANDARDURL_CID);
////////////////////////////////////////////////////////////////////////////////
nsFileProtocolHandler::nsFileProtocolHandler() {
nsFileProtocolHandler::nsFileProtocolHandler()
: mPool(nsnull)
{
NS_INIT_REFCNT();
}
nsFileProtocolHandler::~nsFileProtocolHandler() {
nsresult
nsFileProtocolHandler::Init()
{
nsresult rv;
rv = NS_NewThreadPool(&mPool, NS_FILE_TRANSPORT_WORKER_COUNT,
NS_FILE_TRANSPORT_WORKER_COUNT, 8*1024);
return rv;
}
nsFileProtocolHandler::~nsFileProtocolHandler()
{
// this will wait for all outstanding requests to be processed, then
// join with the worker threads, and finally free the pool:
NS_IF_RELEASE(mPool);
}
NS_IMPL_ISUPPORTS(nsFileProtocolHandler, nsIProtocolHandler::GetIID());
@@ -48,7 +66,10 @@ nsFileProtocolHandler::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult
if (ph == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(ph);
nsresult rv = ph->QueryInterface(aIID, aResult);
nsresult rv = ph->Init();
if (NS_SUCCEEDED(rv)) {
rv = ph->QueryInterface(aIID, aResult);
}
NS_RELEASE(ph);
return rv;
}
@@ -150,3 +171,70 @@ nsFileProtocolHandler::NewChannel(const char* verb, nsIURI* url,
}
////////////////////////////////////////////////////////////////////////////////
NS_IMETHODIMP
nsFileProtocolHandler::NewChannelFromNativePath(const char* nativePath,
nsIFileChannel* *result)
{
nsresult rv;
nsFileSpec spec(nativePath);
nsFileURL fileURL(spec);
const char* urlStr = fileURL.GetURLString();
nsIURI* uri;
rv = NewURI(urlStr, nsnull, &uri);
if (NS_FAILED(rv)) return rv;
rv = NewChannel("load", // XXX what should this be?
uri,
nsnull, // XXX bogus getter
nsnull, // XXX bogus
(nsIChannel**)result);
NS_RELEASE(uri);
return rv;
}
////////////////////////////////////////////////////////////////////////////////
nsresult
nsFileProtocolHandler::ProcessPendingRequests(void)
{
return mPool->ProcessPendingRequests();
}
nsresult
nsFileProtocolHandler::DispatchRequest(nsIRunnable* runnable)
{
return mPool->DispatchRequest(runnable);
}
////////////////////////////////////////////////////////////////////////////////
nsresult
nsFileProtocolHandler::Suspend(nsFileChannel* request)
{
nsresult rv;
if (mSuspended == nsnull) {
rv = NS_NewISupportsArray(&mSuspended);
if (NS_FAILED(rv)) return rv;
}
return mSuspended->AppendElement(NS_STATIC_CAST(nsIChannel*, request));
}
nsresult
nsFileProtocolHandler::Resume(nsFileChannel* request)
{
nsresult rv;
if (mSuspended == nsnull)
return NS_ERROR_FAILURE;
// XXX RemoveElement returns a bool instead of nsresult!
PRBool removed = mSuspended->RemoveElement(NS_STATIC_CAST(nsIChannel*, request));
rv = removed ? NS_OK : NS_ERROR_FAILURE;
if (NS_FAILED(rv)) return rv;
// restart the request
rv = mPool->DispatchRequest(NS_STATIC_CAST(nsIRunnable*, request));
return rv;
}
////////////////////////////////////////////////////////////////////////////////