blob: d44e6df872d93a02e2ccef0576563b2b1fe38926 [file] [log] [blame]
/*
*
* Copyright (c) 2021 Project CHIP Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <array>
#include <channel/Channel.h>
#include <channel/ChannelContext.h>
#include <lib/support/DLLUtil.h>
#include <lib/support/Pool.h>
#include <messaging/ExchangeMgr.h>
namespace chip {
namespace Messaging {
class ChannelContext;
/**
* @brief
* This class is used to manage Channel Contexts with other CHIP nodes.
*/
class DLL_EXPORT ChannelManager : public SessionCreationDelegate
{
public:
ChannelManager(ExchangeManager * exchangeManager) : mExchangeManager(exchangeManager)
{
exchangeManager->GetSessionManager()->RegisterCreationDelegate(*this);
}
ChannelManager(const ChannelManager &) = delete;
ChannelManager operator=(const ChannelManager &) = delete;
ChannelHandle EstablishChannel(const ChannelBuilder & builder, ChannelDelegate * delegate);
// Internal APIs used for channel
void ReleaseChannelContext(ChannelContext * channel) { mChannelContexts.ReleaseObject(channel); }
void ReleaseChannelHandle(ChannelContextHandleAssociation * association) { mChannelHandles.ReleaseObject(association); }
template <typename Event>
void NotifyChannelEvent(ChannelContext * channel, Event event)
{
mChannelHandles.ForEachActiveObject([&](ChannelContextHandleAssociation * association) {
if (association->mChannelContext == channel)
event(association->mChannelDelegate);
return Loop::Continue;
});
}
void OnNewSession(SessionHandle session) override
{
mChannelContexts.ForEachActiveObject([&](ChannelContext * context) {
if (context->MatchesSession(session, mExchangeManager->GetSessionManager()))
{
context->OnNewConnection(session);
return Loop::Break;
}
return Loop::Continue;
});
}
private:
BitMapObjectPool<ChannelContext, CHIP_CONFIG_MAX_ACTIVE_CHANNELS> mChannelContexts;
BitMapObjectPool<ChannelContextHandleAssociation, CHIP_CONFIG_MAX_CHANNEL_HANDLES> mChannelHandles;
ExchangeManager * mExchangeManager;
};
} // namespace Messaging
} // namespace chip