tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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