Blame netwerk/base/RedirectChannelRegistrar.cpp

Packit f0b94e
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit f0b94e
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
Packit f0b94e
#include "RedirectChannelRegistrar.h"
Packit f0b94e
Packit f0b94e
namespace mozilla {
Packit f0b94e
namespace net {
Packit f0b94e
Packit f0b94e
NS_IMPL_ISUPPORTS(RedirectChannelRegistrar, nsIRedirectChannelRegistrar)
Packit f0b94e
Packit f0b94e
RedirectChannelRegistrar::RedirectChannelRegistrar()
Packit f0b94e
    : mRealChannels(32),
Packit f0b94e
      mParentChannels(32),
Packit f0b94e
      mId(1),
Packit f0b94e
      mLock("RedirectChannelRegistrar") {}
Packit f0b94e
Packit f0b94e
NS_IMETHODIMP
Packit f0b94e
RedirectChannelRegistrar::RegisterChannel(nsIChannel *channel,
Packit f0b94e
                                          uint32_t *_retval) {
Packit f0b94e
  MutexAutoLock lock(mLock);
Packit f0b94e
Packit f0b94e
  mRealChannels.Put(mId, channel);
Packit f0b94e
  *_retval = mId;
Packit f0b94e
Packit f0b94e
  ++mId;
Packit f0b94e
Packit f0b94e
  // Ensure we always provide positive ids
Packit f0b94e
  if (!mId) mId = 1;
Packit f0b94e
Packit f0b94e
  return NS_OK;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
NS_IMETHODIMP
Packit f0b94e
RedirectChannelRegistrar::GetRegisteredChannel(uint32_t id,
Packit f0b94e
                                               nsIChannel **_retval) {
Packit f0b94e
  MutexAutoLock lock(mLock);
Packit f0b94e
Packit f0b94e
  if (!mRealChannels.Get(id, _retval)) return NS_ERROR_NOT_AVAILABLE;
Packit f0b94e
Packit f0b94e
  return NS_OK;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
NS_IMETHODIMP
Packit f0b94e
RedirectChannelRegistrar::LinkChannels(uint32_t id, nsIParentChannel *channel,
Packit f0b94e
                                       nsIChannel **_retval) {
Packit f0b94e
  MutexAutoLock lock(mLock);
Packit f0b94e
Packit f0b94e
  if (!mRealChannels.Get(id, _retval)) return NS_ERROR_NOT_AVAILABLE;
Packit f0b94e
Packit f0b94e
  mParentChannels.Put(id, channel);
Packit f0b94e
  return NS_OK;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
NS_IMETHODIMP
Packit f0b94e
RedirectChannelRegistrar::GetParentChannel(uint32_t id,
Packit f0b94e
                                           nsIParentChannel **_retval) {
Packit f0b94e
  MutexAutoLock lock(mLock);
Packit f0b94e
Packit f0b94e
  if (!mParentChannels.Get(id, _retval)) return NS_ERROR_NOT_AVAILABLE;
Packit f0b94e
Packit f0b94e
  return NS_OK;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
NS_IMETHODIMP
Packit f0b94e
RedirectChannelRegistrar::DeregisterChannels(uint32_t id) {
Packit f0b94e
  MutexAutoLock lock(mLock);
Packit f0b94e
Packit f0b94e
  mRealChannels.Remove(id);
Packit f0b94e
  mParentChannels.Remove(id);
Packit f0b94e
  return NS_OK;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
}  // namespace net
Packit f0b94e
}  // namespace mozilla