Move src/ -> webrtc/
TBR=niklas.enbom@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/915006
git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@2963 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/voice_engine/channel_manager.cc b/voice_engine/channel_manager.cc
new file mode 100644
index 0000000..47cec4a
--- /dev/null
+++ b/voice_engine/channel_manager.cc
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "channel.h"
+#include "channel_manager.h"
+
+namespace webrtc
+{
+
+namespace voe
+{
+
+ChannelManager::ChannelManager(const WebRtc_UWord32 instanceId) :
+ ChannelManagerBase(),
+ _instanceId(instanceId)
+{
+}
+
+ChannelManager::~ChannelManager()
+{
+ ChannelManagerBase::DestroyAllItems();
+}
+
+bool ChannelManager::CreateChannel(WebRtc_Word32& channelId)
+{
+ return ChannelManagerBase::CreateItem(channelId);
+}
+
+WebRtc_Word32 ChannelManager::DestroyChannel(const WebRtc_Word32 channelId)
+{
+ Channel* deleteChannel =
+ static_cast<Channel*> (ChannelManagerBase::RemoveItem(channelId));
+ if (!deleteChannel)
+ {
+ return -1;
+ }
+ delete deleteChannel;
+ return 0;
+}
+
+WebRtc_Word32 ChannelManager::NumOfChannels() const
+{
+ return ChannelManagerBase::NumOfItems();
+}
+
+WebRtc_Word32 ChannelManager::MaxNumOfChannels() const
+{
+ return ChannelManagerBase::MaxNumOfItems();
+}
+
+void* ChannelManager::NewItem(WebRtc_Word32 itemID)
+{
+ Channel* channel;
+ if (Channel::CreateChannel(channel, itemID, _instanceId) == -1)
+ {
+ return NULL;
+ }
+ return static_cast<void*> (channel);
+}
+
+void ChannelManager::DeleteItem(void* item)
+{
+ Channel* deleteItem = static_cast<Channel*> (item);
+ delete deleteItem;
+}
+
+Channel* ChannelManager::GetChannel(const WebRtc_Word32 channelId) const
+{
+ return static_cast<Channel*> (ChannelManagerBase::GetItem(channelId));
+}
+
+void ChannelManager::ReleaseChannel()
+{
+ ChannelManagerBase::ReleaseItem();
+}
+
+void ChannelManager::GetChannelIds(WebRtc_Word32* channelsArray,
+ WebRtc_Word32& numOfChannels) const
+{
+ ChannelManagerBase::GetItemIds(channelsArray, numOfChannels);
+}
+
+void ChannelManager::GetChannels(MapWrapper& channels) const
+{
+ ChannelManagerBase::GetChannels(channels);
+}
+
+ScopedChannel::ScopedChannel(ChannelManager& chManager) :
+ _chManager(chManager),
+ _channelPtr(NULL)
+{
+ // Copy all existing channels to the local map.
+ // It is not possible to utilize the ChannelPtr() API after
+ // this constructor. The intention is that this constructor
+ // is used in combination with the scoped iterator.
+ _chManager.GetChannels(_channels);
+}
+
+ScopedChannel::ScopedChannel(ChannelManager& chManager,
+ WebRtc_Word32 channelId) :
+ _chManager(chManager),
+ _channelPtr(NULL)
+{
+ _channelPtr = _chManager.GetChannel(channelId);
+}
+
+ScopedChannel::~ScopedChannel()
+{
+ if (_channelPtr != NULL || _channels.Size() != 0)
+ {
+ _chManager.ReleaseChannel();
+ }
+
+ // Delete the map
+ while (_channels.Erase(_channels.First()) == 0)
+ ;
+}
+
+Channel* ScopedChannel::ChannelPtr()
+{
+ return _channelPtr;
+}
+
+Channel* ScopedChannel::GetFirstChannel(void*& iterator) const
+{
+ MapItem* it = _channels.First();
+ iterator = (void*) it;
+ if (!it)
+ {
+ return NULL;
+ }
+ return static_cast<Channel*> (it->GetItem());
+}
+
+Channel* ScopedChannel::GetNextChannel(void*& iterator) const
+{
+ MapItem* it = (MapItem*) iterator;
+ if (!it)
+ {
+ iterator = NULL;
+ return NULL;
+ }
+ it = _channels.Next(it);
+ iterator = (void*) it;
+ if (!it)
+ {
+ return NULL;
+ }
+ return static_cast<Channel*> (it->GetItem());
+}
+
+} // namespace voe
+
+} // namespace webrtc