diff --git a/mozilla/netwerk/base/src/nsStreamListenerProxy.cpp b/mozilla/netwerk/base/src/nsStreamListenerProxy.cpp index 869c0cfad40..f29207ef609 100644 --- a/mozilla/netwerk/base/src/nsStreamListenerProxy.cpp +++ b/mozilla/netwerk/base/src/nsStreamListenerProxy.cpp @@ -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 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); } // diff --git a/mozilla/netwerk/base/src/nsStreamListenerProxy.h b/mozilla/netwerk/base/src/nsStreamListenerProxy.h index b22a0f0cee7..24ade051b50 100644 --- a/mozilla/netwerk/base/src/nsStreamListenerProxy.h +++ b/mozilla/netwerk/base/src/nsStreamListenerProxy.h @@ -8,7 +8,7 @@ #include "nsIOutputStream.h" #include "nsCOMPtr.h" -class nsStreamListenerProxy : public nsStreamObserverProxy +class nsStreamListenerProxy : public nsStreamProxyBase , public nsIStreamListenerProxy , public nsIInputStreamObserver { diff --git a/mozilla/netwerk/base/src/nsStreamObserverProxy.cpp b/mozilla/netwerk/base/src/nsStreamObserverProxy.cpp index 5e981a9a56b..7d91460b539 100644 --- a/mozilla/netwerk/base/src/nsStreamObserverProxy.cpp +++ b/mozilla/netwerk/base/src/nsStreamObserverProxy.cpp @@ -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 observer = observerProxy->GetReceiver(); + nsCOMPtr 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 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); +} diff --git a/mozilla/netwerk/base/src/nsStreamObserverProxy.h b/mozilla/netwerk/base/src/nsStreamObserverProxy.h index 00dbf13ab3f..c6d790aeec1 100644 --- a/mozilla/netwerk/base/src/nsStreamObserverProxy.h +++ b/mozilla/netwerk/base/src/nsStreamObserverProxy.h @@ -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 mEventQueue; + nsresult SetReceiver(nsIStreamObserver *aReceiver) { + mReceiver = aReceiver; + return NS_OK; + } + +private: + nsCOMPtr mEventQ; nsCOMPtr 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 mProxy; - nsCOMPtr mChannel; - nsCOMPtr mContext; + PLEvent mEvent; + nsStreamProxyBase *mProxy; + nsCOMPtr mChannel; + nsCOMPtr mContext; }; #define GET_STREAM_OBSERVER_EVENT(_mEvent_ptr) \ diff --git a/mozilla/netwerk/base/src/nsStreamProviderProxy.cpp b/mozilla/netwerk/base/src/nsStreamProviderProxy.cpp index 628961ff9d9..2d297710af6 100644 --- a/mozilla/netwerk/base/src/nsStreamProviderProxy.cpp +++ b/mozilla/netwerk/base/src/nsStreamProviderProxy.cpp @@ -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); } diff --git a/mozilla/netwerk/base/src/nsStreamProviderProxy.h b/mozilla/netwerk/base/src/nsStreamProviderProxy.h index 2f9397686f6..639baff12e5 100644 --- a/mozilla/netwerk/base/src/nsStreamProviderProxy.h +++ b/mozilla/netwerk/base/src/nsStreamProviderProxy.h @@ -6,7 +6,7 @@ #include "nsIInputStream.h" #include "nsIOutputStream.h" -class nsStreamProviderProxy : public nsStreamObserverProxy +class nsStreamProviderProxy : public nsStreamProxyBase , public nsIStreamProviderProxy { public: