SuspendableChannelWrapper.cpp (2090B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #include "SuspendableChannelWrapper.h" 6 #include "nsIStreamListener.h" 7 8 namespace mozilla { 9 namespace net { 10 11 NS_IMPL_ISUPPORTS(BaseSuspendableChannelWrapper, nsISuspendableChannelWrapper) 12 13 NS_IMPL_ADDREF_INHERITED(SuspendableChannelWrapper, 14 BaseSuspendableChannelWrapper) 15 NS_IMPL_RELEASE_INHERITED(SuspendableChannelWrapper, 16 BaseSuspendableChannelWrapper) 17 NS_INTERFACE_MAP_BEGIN(SuspendableChannelWrapper) 18 NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIChannel) 19 NS_INTERFACE_MAP_ENTRY(nsIRequest) 20 NS_INTERFACE_MAP_ENTRY(nsIChannel) 21 NS_INTERFACE_MAP_ENTRY(nsISuspendableChannelWrapper) 22 NS_INTERFACE_MAP_END_AGGREGATED(mInnerChannel) 23 24 NS_IMETHODIMP 25 SuspendableChannelWrapper::Suspend() { 26 if (mInnerOpened) { 27 mInnerChannel->Suspend(); 28 } else { 29 mSuspendCount++; 30 } 31 return NS_OK; 32 } 33 34 NS_IMETHODIMP 35 SuspendableChannelWrapper::Resume() { 36 if (mInnerOpened) { 37 mInnerChannel->Resume(); 38 } else if (mSuspendCount > 0) { 39 mSuspendCount--; 40 } 41 42 if (!mSuspendCount && mOuterOpened && !mInnerOpened) { 43 mInnerOpened = true; 44 MOZ_ASSERT(mListener); 45 return mInnerChannel->AsyncOpen(mListener); 46 } 47 return NS_OK; 48 } 49 50 NS_IMETHODIMP 51 SuspendableChannelWrapper::IsPending(bool* _retval) { 52 NS_ENSURE_ARG_POINTER(_retval); 53 if (mInnerOpened) { 54 return mInnerChannel->IsPending(_retval); 55 } 56 *_retval = mSuspendCount > 0; 57 return NS_OK; 58 } 59 60 NS_IMETHODIMP 61 SuspendableChannelWrapper::AsyncOpen(nsIStreamListener* aListener) { 62 if (mOuterOpened) { 63 return NS_ERROR_ALREADY_OPENED; 64 } 65 66 mListener = aListener; 67 mOuterOpened = true; 68 69 if (mInnerOpened || !mSuspendCount) { 70 return mInnerChannel->AsyncOpen(mListener); 71 } 72 73 return NS_OK; 74 } 75 76 NS_IMETHODIMP 77 SuspendableChannelWrapper::Open(nsIInputStream** _retval) { 78 return NS_ERROR_NOT_IMPLEMENTED; 79 } 80 81 } // namespace net 82 } // namespace mozilla