diff options
Diffstat (limited to 'netwerk/base/RedirectChannelRegistrar.cpp')
-rw-r--r-- | netwerk/base/RedirectChannelRegistrar.cpp | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/netwerk/base/RedirectChannelRegistrar.cpp b/netwerk/base/RedirectChannelRegistrar.cpp new file mode 100644 index 000000000..17e26603a --- /dev/null +++ b/netwerk/base/RedirectChannelRegistrar.cpp @@ -0,0 +1,87 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "RedirectChannelRegistrar.h" + +namespace mozilla { +namespace net { + +NS_IMPL_ISUPPORTS(RedirectChannelRegistrar, nsIRedirectChannelRegistrar) + +RedirectChannelRegistrar::RedirectChannelRegistrar() + : mRealChannels(32) + , mParentChannels(32) + , mId(1) + , mLock("RedirectChannelRegistrar") +{ +} + +NS_IMETHODIMP +RedirectChannelRegistrar::RegisterChannel(nsIChannel *channel, + uint32_t *_retval) +{ + MutexAutoLock lock(mLock); + + mRealChannels.Put(mId, channel); + *_retval = mId; + + ++mId; + + // Ensure we always provide positive ids + if (!mId) + mId = 1; + + return NS_OK; +} + +NS_IMETHODIMP +RedirectChannelRegistrar::GetRegisteredChannel(uint32_t id, + nsIChannel **_retval) +{ + MutexAutoLock lock(mLock); + + if (!mRealChannels.Get(id, _retval)) + return NS_ERROR_NOT_AVAILABLE; + + return NS_OK; +} + +NS_IMETHODIMP +RedirectChannelRegistrar::LinkChannels(uint32_t id, + nsIParentChannel *channel, + nsIChannel** _retval) +{ + MutexAutoLock lock(mLock); + + if (!mRealChannels.Get(id, _retval)) + return NS_ERROR_NOT_AVAILABLE; + + mParentChannels.Put(id, channel); + return NS_OK; +} + +NS_IMETHODIMP +RedirectChannelRegistrar::GetParentChannel(uint32_t id, + nsIParentChannel **_retval) +{ + MutexAutoLock lock(mLock); + + if (!mParentChannels.Get(id, _retval)) + return NS_ERROR_NOT_AVAILABLE; + + return NS_OK; +} + +NS_IMETHODIMP +RedirectChannelRegistrar::DeregisterChannels(uint32_t id) +{ + MutexAutoLock lock(mLock); + + mRealChannels.Remove(id); + mParentChannels.Remove(id); + return NS_OK; +} + +} // namespace net +} // namespace mozilla |