1e0e9324cSopenharmony_ci/*
2e0e9324cSopenharmony_ci * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development Co., Ltd.
3e0e9324cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e0e9324cSopenharmony_ci * you may not use this file except in compliance with the License.
5e0e9324cSopenharmony_ci * You may obtain a copy of the License at
6e0e9324cSopenharmony_ci *
7e0e9324cSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e0e9324cSopenharmony_ci *
9e0e9324cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e0e9324cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e0e9324cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e0e9324cSopenharmony_ci * See the License for the specific language governing permissions and
13e0e9324cSopenharmony_ci * limitations under the License.
14e0e9324cSopenharmony_ci */
15e0e9324cSopenharmony_ci
16e0e9324cSopenharmony_ci#include "channel_manager.h"
17e0e9324cSopenharmony_ci#include "common/common_macro.h"
18e0e9324cSopenharmony_ci#include "magic_enum.hpp"
19e0e9324cSopenharmony_ci#include "mediachannel/media_channel.h"
20e0e9324cSopenharmony_ci
21e0e9324cSopenharmony_cinamespace OHOS {
22e0e9324cSopenharmony_cinamespace Sharing {
23e0e9324cSopenharmony_ci
24e0e9324cSopenharmony_ciChannelManager::ChannelManager()
25e0e9324cSopenharmony_ci{
26e0e9324cSopenharmony_ci    SHARING_LOGD("id: %{public}s.", std::string(magic_enum::enum_name(ModuleType::MODULE_MEDIACHANNEL)).c_str());
27e0e9324cSopenharmony_ci}
28e0e9324cSopenharmony_ci
29e0e9324cSopenharmony_civoid ChannelManager::Init()
30e0e9324cSopenharmony_ci{
31e0e9324cSopenharmony_ci    SHARING_LOGD("trace.");
32e0e9324cSopenharmony_ci}
33e0e9324cSopenharmony_ci
34e0e9324cSopenharmony_ciChannelManager::~ChannelManager()
35e0e9324cSopenharmony_ci{
36e0e9324cSopenharmony_ci    SHARING_LOGD("id: %{public}s.", std::string(magic_enum::enum_name(ModuleType::MODULE_MEDIACHANNEL)).c_str());
37e0e9324cSopenharmony_ci}
38e0e9324cSopenharmony_ci
39e0e9324cSopenharmony_ciSharingErrorCode ChannelManager::HandleMediaChannelCreate(SharingEvent &event)
40e0e9324cSopenharmony_ci{
41e0e9324cSopenharmony_ci    SHARING_LOGD("trace.");
42e0e9324cSopenharmony_ci    auto eventMsg = ConvertEventMsg<ChannelEventMsg>(event);
43e0e9324cSopenharmony_ci    if (eventMsg == nullptr) {
44e0e9324cSopenharmony_ci        return SharingErrorCode::ERR_GENERAL_ERROR;
45e0e9324cSopenharmony_ci    }
46e0e9324cSopenharmony_ci
47e0e9324cSopenharmony_ci    auto channel = std::make_shared<MediaChannel>();
48e0e9324cSopenharmony_ci    channel->SetContextId(eventMsg->srcId);
49e0e9324cSopenharmony_ci    eventMsg->srcId = channel->GetId();
50e0e9324cSopenharmony_ci    {
51e0e9324cSopenharmony_ci        std::lock_guard<std::mutex> lock(mutex_);
52e0e9324cSopenharmony_ci        mediaChannels_.emplace(channel->GetId(), channel);
53e0e9324cSopenharmony_ci    }
54e0e9324cSopenharmony_ci
55e0e9324cSopenharmony_ci    return SharingErrorCode::ERR_OK;
56e0e9324cSopenharmony_ci}
57e0e9324cSopenharmony_ci
58e0e9324cSopenharmony_ciSharingErrorCode ChannelManager::HandleMediaChannelDestroy(SharingEvent &event)
59e0e9324cSopenharmony_ci{
60e0e9324cSopenharmony_ci    SHARING_LOGD("trace.");
61e0e9324cSopenharmony_ci    auto eventMsg = ConvertEventMsg<ChannelEventMsg>(event);
62e0e9324cSopenharmony_ci    if (eventMsg == nullptr) {
63e0e9324cSopenharmony_ci        return SharingErrorCode::ERR_GENERAL_ERROR;
64e0e9324cSopenharmony_ci    }
65e0e9324cSopenharmony_ci
66e0e9324cSopenharmony_ci    {
67e0e9324cSopenharmony_ci        std::lock_guard<std::mutex> lock(mutex_);
68e0e9324cSopenharmony_ci        auto channel = mediaChannels_.find(eventMsg->dstId);
69e0e9324cSopenharmony_ci        if (channel != mediaChannels_.end()) {
70e0e9324cSopenharmony_ci            mediaChannels_.erase(channel);
71e0e9324cSopenharmony_ci        }
72e0e9324cSopenharmony_ci    }
73e0e9324cSopenharmony_ci
74e0e9324cSopenharmony_ci    auto contextMsg = std::make_shared<ContextEventMsg>();
75e0e9324cSopenharmony_ci    contextMsg->type = EventType::EVENT_CONTEXTMGR_STATE_CHANNEL_DESTROY;
76e0e9324cSopenharmony_ci    contextMsg->toMgr = ModuleType::MODULE_CONTEXT;
77e0e9324cSopenharmony_ci    contextMsg->fromMgr = ModuleType::MODULE_MEDIACHANNEL;
78e0e9324cSopenharmony_ci    contextMsg->srcId = eventMsg->dstId;
79e0e9324cSopenharmony_ci    contextMsg->dstId = eventMsg->srcId;
80e0e9324cSopenharmony_ci    contextMsg->agentId = eventMsg->agentId;
81e0e9324cSopenharmony_ci    SharingEvent contextEvent;
82e0e9324cSopenharmony_ci    contextEvent.eventMsg = std::move(contextMsg);
83e0e9324cSopenharmony_ci    SHARING_LOGI("mediachannelId: %{public}d, SendEvent event: %{public}s.", eventMsg->dstId,
84e0e9324cSopenharmony_ci                 std::string(magic_enum::enum_name(contextEvent.eventMsg->type)).c_str());
85e0e9324cSopenharmony_ci    SendEvent(contextEvent);
86e0e9324cSopenharmony_ci
87e0e9324cSopenharmony_ci    return SharingErrorCode::ERR_OK;
88e0e9324cSopenharmony_ci}
89e0e9324cSopenharmony_ci
90e0e9324cSopenharmony_ciint32_t ChannelManager::HandleEvent(SharingEvent &event)
91e0e9324cSopenharmony_ci{
92e0e9324cSopenharmony_ci    SHARING_LOGD("trace.");
93e0e9324cSopenharmony_ci    RETURN_INVALID_IF_NULL(event.eventMsg);
94e0e9324cSopenharmony_ci    SHARING_LOGI("fromMgr: %{public}u, srcId: %{public}u, toMgr: %{public}u, dstId: %{public}u, event: %{public}s.",
95e0e9324cSopenharmony_ci                 event.eventMsg->fromMgr, event.eventMsg->srcId, event.eventMsg->toMgr, event.eventMsg->dstId,
96e0e9324cSopenharmony_ci                 std::string(magic_enum::enum_name(event.eventMsg->type)).c_str());
97e0e9324cSopenharmony_ci
98e0e9324cSopenharmony_ci    switch (event.eventMsg->type) {
99e0e9324cSopenharmony_ci        case EventType::EVENT_CONFIGURE_MEDIACHANNEL:
100e0e9324cSopenharmony_ci            SHARING_LOGD("EVENT_CONFIGURE_MEDIACHANNEL.");
101e0e9324cSopenharmony_ci            break;
102e0e9324cSopenharmony_ci        case EventType::EVENT_MEDIA_CHANNEL_CREATE:
103e0e9324cSopenharmony_ci            SHARING_LOGD("trace.");
104e0e9324cSopenharmony_ci            HandleMediaChannelCreate(event);
105e0e9324cSopenharmony_ci            break;
106e0e9324cSopenharmony_ci        case EventType::EVENT_MEDIA_CHANNEL_DESTROY:
107e0e9324cSopenharmony_ci            SHARING_LOGD("trace.");
108e0e9324cSopenharmony_ci            HandleMediaChannelDestroy(event);
109e0e9324cSopenharmony_ci            break;
110e0e9324cSopenharmony_ci        default: {
111e0e9324cSopenharmony_ci            SHARING_LOGD("default.");
112e0e9324cSopenharmony_ci            uint32_t mediaChannelId = event.eventMsg->dstId;
113e0e9324cSopenharmony_ci            auto mediaChannel = GetMediaChannel(mediaChannelId);
114e0e9324cSopenharmony_ci            if (mediaChannel != nullptr) {
115e0e9324cSopenharmony_ci                mediaChannel->HandleEvent(event);
116e0e9324cSopenharmony_ci            } else {
117e0e9324cSopenharmony_ci                SHARING_LOGE("distribute event channel not exist channelId: %{public}d.", mediaChannelId);
118e0e9324cSopenharmony_ci            }
119e0e9324cSopenharmony_ci            break;
120e0e9324cSopenharmony_ci        }
121e0e9324cSopenharmony_ci    }
122e0e9324cSopenharmony_ci
123e0e9324cSopenharmony_ci    SHARING_LOGD("done eventType: %{public}s.", std::string(magic_enum::enum_name(event.eventMsg->type)).c_str());
124e0e9324cSopenharmony_ci    return 0;
125e0e9324cSopenharmony_ci}
126e0e9324cSopenharmony_ci
127e0e9324cSopenharmony_ciMediaChannel::Ptr ChannelManager::GetMediaChannel(uint32_t mediaChannelId)
128e0e9324cSopenharmony_ci{
129e0e9324cSopenharmony_ci    SHARING_LOGD("trace, mediachannelId: %{public}u.", mediaChannelId);
130e0e9324cSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
131e0e9324cSopenharmony_ci    auto channel = mediaChannels_.find(mediaChannelId);
132e0e9324cSopenharmony_ci    if (channel != mediaChannels_.end()) {
133e0e9324cSopenharmony_ci        return (channel->second);
134e0e9324cSopenharmony_ci    } else {
135e0e9324cSopenharmony_ci        return nullptr;
136e0e9324cSopenharmony_ci    }
137e0e9324cSopenharmony_ci}
138e0e9324cSopenharmony_ci
139e0e9324cSopenharmony_ci} // namespace Sharing
140e0e9324cSopenharmony_ci} // namespace OHOS