Created common base class for nsIStreamXXX proxies.

git-svn-id: svn://10.0.0.236/branches/DARIN_AsyncWrite_20001227_BRANCH@84245 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
darin%netscape.com
2000-12-31 03:34:42 +00:00
parent 475960bd58
commit 3be1e137ed
6 changed files with 121 additions and 110 deletions

View File

@@ -10,9 +10,6 @@
#define DEFAULT_BUFFER_SEGMENT_SIZE 2048
#define DEFAULT_BUFFER_MAX_SIZE (4*2048)
#define GET_LISTENER_PROXY(p) \
((nsStreamListenerProxy *) (nsIStreamObserverProxy *) p)
#ifdef DEBUG
//
//----------------------------------------------------------------------------
@@ -119,7 +116,7 @@ nsStreamListenerProxy::~nsStreamListenerProxy()
class nsOnDataAvailableEvent : public nsStreamObserverEvent
{
public:
nsOnDataAvailableEvent(nsIStreamObserverProxy *aProxy,
nsOnDataAvailableEvent(nsStreamProxyBase *aProxy,
nsIChannel *aChannel,
nsISupports *aContext,
nsIInputStream *aSource,
@@ -151,7 +148,8 @@ nsOnDataAvailableEvent::HandleEvent()
{
PRINTF("HandleEvent -- OnDataAvailable [event=%x]", this);
nsStreamListenerProxy *listenerProxy = GET_LISTENER_PROXY(mProxy);
nsStreamListenerProxy *listenerProxy =
NS_STATIC_CAST(nsStreamListenerProxy *, mProxy);
nsIStreamListener *listener = listenerProxy->GetListener();
if (!listener) {
@@ -179,15 +177,6 @@ nsOnDataAvailableEvent::HandleEvent()
}
#endif
//
// If we are the only event at the moment and the pipe has extra data...
// feed that to the client...
//
//if (listenerProxy->mChannelToResume && (avail > mCount)) {
// NS_WARNING("pipe contains unread data");
// mCount = avail; // this is potentially very bad
//}
// Give the listener a chance to read some data.
rv = listener->OnDataAvailable(mChannel, mContext, mSource, mOffset, mCount);
@@ -226,7 +215,7 @@ nsOnDataAvailableEvent::HandleEvent()
//----------------------------------------------------------------------------
//
NS_IMPL_ISUPPORTS_INHERITED3(nsStreamListenerProxy,
nsStreamObserverProxy,
nsStreamProxyBase,
nsIStreamListenerProxy,
nsIStreamListener,
nsIInputStreamObserver)
@@ -241,7 +230,7 @@ nsStreamListenerProxy::OnStartRequest(nsIChannel *aChannel,
nsISupports *aContext)
{
return nsStreamObserverProxy::OnStartRequest(aChannel, aContext);
return nsStreamProxyBase::OnStartRequest(aChannel, aContext);
}
NS_IMETHODIMP
@@ -256,8 +245,8 @@ nsStreamListenerProxy::OnStopRequest(nsIChannel *aChannel,
mPipeIn = 0;
mPipeOut = 0;
return nsStreamObserverProxy::OnStopRequest(aChannel, aContext,
aStatus, aStatusText);
return nsStreamProxyBase::OnStopRequest(aChannel, aContext,
aStatus, aStatusText);
}
//
@@ -304,21 +293,13 @@ nsStreamListenerProxy::OnDataAvailable(nsIChannel *aChannel,
// inside the "C" monitor ensures that the resume will follow the
// suspend.
//
PRUint32 count, bytesWritten=0;
rv = mPipeIn->Available(&count);
if (NS_FAILED(rv)) return rv;
PRUint32 bytesWritten=0;
if (count == 0) {
PRINTF("Writing to the pipe...\n");FLUSH();
rv = mPipeOut->WriteFrom(aSource, aCount, &bytesWritten);
PRINTF("Writing to the pipe...\n");FLUSH();
rv = mPipeOut->WriteFrom(aSource, aCount, &bytesWritten);
PRINTF("mPipeOut->WriteFrom(aSource) [rv=%x aCount=%u bytesWritten=%u]\n",
rv, aCount, bytesWritten);FLUSH();
}
else {
PRINTF("Already %u bytes in the pipe\n", count);
rv = NS_BASE_STREAM_WOULD_BLOCK;
}
PRINTF("mPipeOut->WriteFrom(aSource) [rv=%x aCount=%u bytesWritten=%u]\n",
rv, aCount, bytesWritten);FLUSH();
if (NS_FAILED(rv)) {
if (rv == NS_BASE_STREAM_WOULD_BLOCK) {
@@ -347,7 +328,7 @@ nsStreamListenerProxy::OnDataAvailable(nsIChannel *aChannel,
aOffset, bytesWritten);
if (!ev) return NS_ERROR_OUT_OF_MEMORY;
rv = ev->FireEvent(mEventQueue);
rv = ev->FireEvent(GetEventQueue());
if (NS_FAILED(rv)) {
delete ev;
return rv;
@@ -366,8 +347,8 @@ nsStreamListenerProxy::Init(nsIStreamListener *aListener,
PRUint32 aBufferSegmentSize,
PRUint32 aBufferMaxSize)
{
NS_PRECONDITION(mReceiver == 0, "Listener already set");
NS_PRECONDITION(mEventQueue == 0, "Event queue already set");
NS_PRECONDITION(GetReceiver() == nsnull, "Listener already set");
NS_PRECONDITION(GetEventQueue() == nsnull, "Event queue already set");
mLMonitor = nsAutoMonitor::NewMonitor("ListenerStatus");
if (!mLMonitor) return NS_ERROR_OUT_OF_MEMORY;
@@ -397,15 +378,8 @@ nsStreamListenerProxy::Init(nsIStreamListener *aListener,
return rv;
}
nsCOMPtr<nsIInputStreamObserver> ob;
rv = mPipeIn->GetObserver(getter_AddRefs(ob));
if (NS_FAILED(rv)) {
PRINTF("GetObserver failed: rv=%x\n", rv);
return rv;
}
PRINTF("this=%x, observer=%x\n", this, ob.get());
return nsStreamObserverProxy::Init(aListener, aEventQ);
SetReceiver(aListener);
return SetEventQueue(aEventQ);
}
//

View File

@@ -8,7 +8,7 @@
#include "nsIOutputStream.h"
#include "nsCOMPtr.h"
class nsStreamListenerProxy : public nsStreamObserverProxy
class nsStreamListenerProxy : public nsStreamProxyBase
, public nsIStreamListenerProxy
, public nsIInputStreamObserver
{

View File

@@ -40,13 +40,20 @@ static NS_DEFINE_CID(kEventQueueService, NS_EVENTQUEUESERVICE_CID);
// nsStreamObserverEvent implementation...
//----------------------------------------------------------------------------
//
nsStreamObserverEvent::nsStreamObserverEvent(nsIStreamObserverProxy *aProxy,
nsStreamObserverEvent::nsStreamObserverEvent(nsStreamProxyBase *aProxy,
nsIChannel *aChannel,
nsISupports *aContext)
: mProxy(aProxy)
, mChannel(aChannel)
, mContext(aContext)
{}
{
NS_IF_ADDREF(mProxy);
}
nsStreamObserverEvent::~nsStreamObserverEvent()
{
NS_IF_RELEASE(mProxy);
}
nsresult
nsStreamObserverEvent::FireEvent(nsIEventQueue *aEventQ)
@@ -87,7 +94,7 @@ nsStreamObserverEvent::DestroyPLEvent(PLEvent *aEvent)
class nsOnStartRequestEvent : public nsStreamObserverEvent
{
public:
nsOnStartRequestEvent(nsIStreamObserverProxy *aProxy,
nsOnStartRequestEvent(nsStreamProxyBase *aProxy,
nsIChannel *aChannel,
nsISupports *aContext)
: nsStreamObserverEvent(aProxy, aChannel, aContext)
@@ -108,7 +115,7 @@ nsOnStartRequestEvent::HandleEvent()
{
PRINTF("HandleEvent -- OnStartRequest [event=%x]\n", this);
nsIStreamObserver *observer = GET_OBSERVER_PROXY(mProxy)->GetReceiver();
nsIStreamObserver *observer = mProxy->GetReceiver();
if (!observer) {
PRINTF("Already called OnStopRequest (observer is NULL)\n");
return NS_ERROR_FAILURE;
@@ -125,7 +132,7 @@ nsOnStartRequestEvent::HandleEvent()
class nsOnStopRequestEvent : public nsStreamObserverEvent
{
public:
nsOnStopRequestEvent(nsIStreamObserverProxy *aProxy,
nsOnStopRequestEvent(nsStreamProxyBase *aProxy,
nsIChannel *aChannel, nsISupports *aContext,
nsresult aStatus, const PRUnichar *aStatusText)
: nsStreamObserverEvent(aProxy, aChannel, aContext)
@@ -152,61 +159,65 @@ nsOnStopRequestEvent::HandleEvent()
{
PRINTF("HandleEvent -- OnStopRequest [event=%x]\n", this);
nsStreamObserverProxy *observerProxy = GET_OBSERVER_PROXY(mProxy);
nsCOMPtr<nsIStreamObserver> observer = observerProxy->GetReceiver();
nsCOMPtr<nsIStreamObserver> observer = mProxy->GetReceiver();
if (!observer) {
PRINTF("Already called OnStopRequest (observer is NULL)\n");
return NS_ERROR_FAILURE;
}
observerProxy->ClearReceiver();
return observer->OnStopRequest(mChannel, mContext, mStatus, mStatusText.GetUnicode());
//
// Do not allow any more events to be handled after OnStopRequest
//
mProxy->SetReceiver(nsnull);
return observer->OnStopRequest(mChannel,
mContext,
mStatus,
mStatusText.GetUnicode());
}
//
//----------------------------------------------------------------------------
// nsISupports implementation...
// nsStreamProxyBase: nsISupports implementation...
//----------------------------------------------------------------------------
//
NS_IMPL_THREADSAFE_ISUPPORTS2(nsStreamObserverProxy,
nsIStreamObserverProxy,
NS_IMPL_THREADSAFE_ISUPPORTS1(nsStreamProxyBase,
nsIStreamObserver)
//
//----------------------------------------------------------------------------
// nsIStreamObserver implementation...
// nsStreamProxyBase: nsIStreamObserver implementation...
//----------------------------------------------------------------------------
//
NS_IMETHODIMP
nsStreamObserverProxy::OnStartRequest(nsIChannel *aChannel,
nsISupports *aContext)
nsStreamProxyBase::OnStartRequest(nsIChannel *aChannel,
nsISupports *aContext)
{
PRINTF("nsStreamObserverProxy::OnStartRequest\n");
PRINTF("nsStreamProxyBase::OnStartRequest\n");
nsOnStartRequestEvent *ev =
new nsOnStartRequestEvent(this, aChannel, aContext);
if (!ev)
return NS_ERROR_OUT_OF_MEMORY;
nsresult rv = ev->FireEvent(mEventQueue);
nsresult rv = ev->FireEvent(GetEventQueue());
if (NS_FAILED(rv))
delete ev;
return rv;
}
NS_IMETHODIMP
nsStreamObserverProxy::OnStopRequest(nsIChannel *aChannel,
nsISupports *aContext,
nsresult aStatus,
const PRUnichar *aStatusText)
nsStreamProxyBase::OnStopRequest(nsIChannel *aChannel,
nsISupports *aContext,
nsresult aStatus,
const PRUnichar *aStatusText)
{
PRINTF("nsStreamObserverProxy::OnStopRequest [status=%x]\n", aStatus);
PRINTF("nsStreamProxyBase::OnStopRequest [status=%x]\n", aStatus);
nsOnStopRequestEvent *ev =
new nsOnStopRequestEvent(this, aChannel, aContext, aStatus, aStatusText);
if (!ev)
return NS_ERROR_OUT_OF_MEMORY;
nsresult rv = ev->FireEvent(mEventQueue);
nsresult rv = ev->FireEvent(GetEventQueue());
if (NS_FAILED(rv))
delete ev;
return rv;
@@ -214,29 +225,44 @@ nsStreamObserverProxy::OnStopRequest(nsIChannel *aChannel,
//
//----------------------------------------------------------------------------
// nsIStreamObserverProxy implementation...
// nsStreamProxyBase: implementation...
//----------------------------------------------------------------------------
//
NS_IMETHODIMP
nsStreamObserverProxy::Init(nsIStreamObserver *aObserver,
nsIEventQueue *aEventQ)
nsresult
nsStreamProxyBase::SetEventQueue(nsIEventQueue *aEventQ)
{
nsresult rv = NS_OK;
NS_PRECONDITION(aObserver, "null observer");
// Realize event queue
if ((aEventQ == NS_CURRENT_EVENTQ) || (aEventQ == NS_UI_THREAD_EVENTQ)) {
nsCOMPtr<nsIEventQueueService> serv =
do_GetService(kEventQueueService, &rv);
if (NS_FAILED(rv))
return rv;
rv = serv->GetSpecialEventQueue((PRInt32) aEventQ,
getter_AddRefs(mEventQueue));
getter_AddRefs(mEventQ));
} else
mEventQueue = aEventQ;
mReceiver = 0;
mReceiver = aObserver;
NS_POSTCONDITION(mReceiver, "null receiver");
mEventQ = aEventQ;
return rv;
}
//
//----------------------------------------------------------------------------
// nsStreamObserverProxy: nsISupports implementation...
//----------------------------------------------------------------------------
//
NS_IMPL_ISUPPORTS_INHERITED1(nsStreamObserverProxy,
nsStreamProxyBase,
nsIStreamObserverProxy)
//
//----------------------------------------------------------------------------
// nsStreamObserverProxy: nsIStreamObserverProxy implementation...
//----------------------------------------------------------------------------
//
NS_IMETHODIMP
nsStreamObserverProxy::Init(nsIStreamObserver *aObserver,
nsIEventQueue *aEventQ)
{
NS_PRECONDITION(aObserver, "null observer");
SetReceiver(aObserver);
return SetEventQueue(aEventQ);
}

View File

@@ -31,33 +31,45 @@
NS_DECL_LOG(nsStreamProxyLog)
class nsStreamObserverProxy : public nsIStreamObserverProxy
class nsStreamProxyBase : public nsIStreamObserver
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSISTREAMOBSERVER
NS_DECL_NSISTREAMOBSERVERPROXY
nsStreamObserverProxy()
{ NS_INIT_ISUPPORTS(); }
virtual ~nsStreamObserverProxy() {}
nsStreamProxyBase() { NS_INIT_ISUPPORTS(); }
virtual ~nsStreamProxyBase() {}
nsIEventQueue *GetEventQueue() { return mEventQueue.get(); }
nsIEventQueue *GetEventQueue() { return mEventQ.get(); }
nsIStreamObserver *GetReceiver() { return mReceiver.get(); }
void ClearReceiver() { mReceiver = nsnull; }
nsresult SetEventQueue(nsIEventQueue *);
protected:
nsCOMPtr<nsIEventQueue> mEventQueue;
nsresult SetReceiver(nsIStreamObserver *aReceiver) {
mReceiver = aReceiver;
return NS_OK;
}
private:
nsCOMPtr<nsIEventQueue> mEventQ;
nsCOMPtr<nsIStreamObserver> mReceiver;
};
class nsStreamObserverProxy : public nsStreamProxyBase
, public nsIStreamObserverProxy
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_FORWARD_NSISTREAMOBSERVER(nsStreamProxyBase::)
NS_DECL_NSISTREAMOBSERVERPROXY
};
class nsStreamObserverEvent
{
public:
nsStreamObserverEvent(nsIStreamObserverProxy *proxy,
nsStreamObserverEvent(nsStreamProxyBase *proxy,
nsIChannel *channel, nsISupports *context);
virtual ~nsStreamObserverEvent() {}
virtual ~nsStreamObserverEvent();
nsresult FireEvent(nsIEventQueue *);
NS_IMETHOD HandleEvent() = 0;
@@ -66,10 +78,10 @@ protected:
static void PR_CALLBACK HandlePLEvent(PLEvent *);
static void PR_CALLBACK DestroyPLEvent(PLEvent *);
PLEvent mEvent;
nsCOMPtr<nsIStreamObserverProxy> mProxy;
nsCOMPtr<nsIChannel> mChannel;
nsCOMPtr<nsISupports> mContext;
PLEvent mEvent;
nsStreamProxyBase *mProxy;
nsCOMPtr<nsIChannel> mChannel;
nsCOMPtr<nsISupports> mContext;
};
#define GET_STREAM_OBSERVER_EVENT(_mEvent_ptr) \

View File

@@ -7,9 +7,6 @@
#define DEFAULT_BUFFER_SEGMENT_SIZE 2048
#define DEFAULT_BUFFER_MAX_SIZE (4*2048)
#define GET_PROVIDER_PROXY(p) \
((nsStreamProviderProxy *) (nsIStreamObserverProxy *) p)
nsStreamProviderProxy::nsStreamProviderProxy()
: mProviderStatus(NS_OK)
{ }
@@ -25,7 +22,7 @@ nsStreamProviderProxy::~nsStreamProviderProxy()
class nsOnProvideDataEvent : public nsStreamObserverEvent
{
public:
nsOnProvideDataEvent(nsIStreamObserverProxy *aProxy,
nsOnProvideDataEvent(nsStreamProxyBase *aProxy,
nsIChannel *aChannel,
nsISupports *aContext,
nsIOutputStream *aSink,
@@ -57,7 +54,8 @@ nsOnProvideDataEvent::HandleEvent()
{
PRINTF("HandleEvent -- OnProvideData [event=%x]", this);
nsStreamProviderProxy *providerProxy = GET_PROVIDER_PROXY(mProxy);
nsStreamProviderProxy *providerProxy =
NS_STATIC_CAST(nsStreamProviderProxy *, mProxy);
nsIStreamProvider *provider = providerProxy->GetProvider();
if (!provider) {
@@ -106,7 +104,7 @@ nsOnProvideDataEvent::HandleEvent()
//----------------------------------------------------------------------------
//
NS_IMPL_ISUPPORTS_INHERITED2(nsStreamProviderProxy,
nsStreamObserverProxy,
nsStreamProxyBase,
nsIStreamProviderProxy,
nsIStreamProvider)
@@ -119,7 +117,7 @@ NS_IMETHODIMP
nsStreamProviderProxy::OnStartRequest(nsIChannel *aChannel,
nsISupports *aContext)
{
return nsStreamObserverProxy::OnStartRequest(aChannel, aContext);
return nsStreamProxyBase::OnStartRequest(aChannel, aContext);
}
NS_IMETHODIMP
@@ -134,8 +132,8 @@ nsStreamProviderProxy::OnStopRequest(nsIChannel *aChannel,
mPipeIn = 0;
mPipeOut = 0;
return nsStreamObserverProxy::OnStopRequest(aChannel, aContext,
aStatus, aStatusText);
return nsStreamProxyBase::OnStopRequest(aChannel, aContext,
aStatus, aStatusText);
}
//
@@ -207,7 +205,7 @@ nsStreamProviderProxy::OnProvideData(nsIChannel *aChannel,
if (!ev)
return NS_ERROR_OUT_OF_MEMORY;
rv = ev->FireEvent(mEventQueue);
rv = ev->FireEvent(GetEventQueue());
if (NS_FAILED(rv)) {
delete ev;
return rv;
@@ -226,8 +224,8 @@ nsStreamProviderProxy::Init(nsIStreamProvider *aProvider,
PRUint32 aBufferSegmentSize,
PRUint32 aBufferMaxSize)
{
NS_PRECONDITION(mReceiver == 0, "Listener already set");
NS_PRECONDITION(mEventQueue == 0, "Event queue already set");
NS_PRECONDITION(GetReceiver() == nsnull, "Listener already set");
NS_PRECONDITION(GetEventQueue() == nsnull, "Event queue already set");
//
// Create the pipe
@@ -246,5 +244,6 @@ nsStreamProviderProxy::Init(nsIStreamProvider *aProvider,
PR_TRUE, PR_TRUE);
if (NS_FAILED(rv)) return rv;
return nsStreamObserverProxy::Init(aProvider, aEventQ);
SetReceiver(aProvider);
return SetEventQueue(aEventQ);
}

View File

@@ -6,7 +6,7 @@
#include "nsIInputStream.h"
#include "nsIOutputStream.h"
class nsStreamProviderProxy : public nsStreamObserverProxy
class nsStreamProviderProxy : public nsStreamProxyBase
, public nsIStreamProviderProxy
{
public: