1 /*
2  * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "src_agent.h"
17 #include "common/common_macro.h"
18 #include "common/event_channel.h"
19 #include "magic_enum.hpp"
20 
21 namespace OHOS {
22 namespace Sharing {
23 
SrcAgent()24 SrcAgent::SrcAgent() : Agent(AgentType::SRC_AGENT)
25 {
26     SHARING_LOGD("agentId: %{public}u.", GetId());
27 }
28 
~SrcAgent()29 SrcAgent::~SrcAgent()
30 {
31     SHARING_LOGD("agentId: %{public}u.", GetId());
32 }
33 
OnSessionNotify(SessionStatusMsg::Ptr &statusMsg)34 void SrcAgent::OnSessionNotify(SessionStatusMsg::Ptr &statusMsg)
35 {
36     SHARING_LOGD("trace.");
37     RETURN_IF_NULL(statusMsg);
38     SHARING_LOGI("notify status: %{public}s, agentId: %{public}u.",
39                  std::string(magic_enum::enum_name((SessionNotifyStatus)statusMsg->status)).c_str(), GetId());
40     statusMsg->prosumerId = prosumerId_;
41     switch (statusMsg->status) {
42         case SessionNotifyStatus::NOTIFY_PROSUMER_CREATE:
43             NotifyProducer(statusMsg, EventType::EVENT_MEDIA_PRODUCER_CREATE);
44             break;
45         case SessionNotifyStatus::STATE_SESSION_STARTED:
46             NotifyProducer(statusMsg, EventType::EVENT_MEDIA_PRODUCER_START);
47             break;
48         case SessionNotifyStatus::STATE_SESSION_STOPED:
49             NotifyProducer(statusMsg, EventType::EVENT_MEDIA_PRODUCER_STOP);
50             break;
51         case SessionNotifyStatus::STATE_SESSION_PAUSED:
52             NotifyProducer(statusMsg, EventType::EVENT_MEDIA_PRODUCER_PAUSE);
53             break;
54         case SessionNotifyStatus::STATE_SESSION_RESUMED:
55             NotifyProducer(statusMsg, EventType::EVENT_MEDIA_PRODUCER_RESUME);
56             break;
57         case SessionNotifyStatus::STATE_SESSION_DESTROYED:
58             NotifyProducer(statusMsg, EventType::EVENT_MEDIA_PRODUCER_DESTROY);
59             break;
60         case SessionNotifyStatus::STATE_SESSION_INTERRUPTED:
61             PopNextStep(runStep_, AGENT_STATUS_DONE);
62             break;
63         default:
64             Agent::OnSessionNotify(statusMsg);
65             break;
66     }
67 }
68 
NotifyProducer(SessionStatusMsg::Ptr &statusMsg, EventType type)69 void SrcAgent::NotifyProducer(SessionStatusMsg::Ptr &statusMsg, EventType type)
70 {
71     SHARING_LOGD("trace.");
72     RETURN_IF_NULL(statusMsg);
73     RETURN_IF_NULL(statusMsg->msg);
74     SHARING_LOGI("agentId: %{public}u, notify status, type: %{public}s.", GetId(),
75                  std::string(magic_enum::enum_name(type)).c_str());
76 
77     auto listener = agentListener_.lock();
78     if (listener) {
79         auto channelMsg = std::make_shared<ChannelEventMsg>();
80         RETURN_IF_NULL(channelMsg);
81         channelMsg->agentId = GetId();
82         channelMsg->toMgr = ModuleType::MODULE_MEDIACHANNEL;
83         channelMsg->dstId = mediaChannelId_;
84         channelMsg->prosumerId = statusMsg->prosumerId;
85         channelMsg->type = type;
86         channelMsg->className = statusMsg->className;
87         channelMsg->errorCode = statusMsg->msg->errorCode;
88         channelMsg->requestId = statusMsg->msg->requestId;
89         statusMsg->msg = std::move(channelMsg);
90 
91         auto agentMsg = std::static_pointer_cast<AgentStatusMsg>(statusMsg);
92         agentMsg->agentId = GetId();
93         SHARING_LOGI("id: %{public}u, and notify to send event: %{public}s, mediaChannelId: %{public}u.", GetId(),
94                      std::string(magic_enum::enum_name(type)).c_str(), mediaChannelId_);
95         listener->OnAgentNotify(agentMsg);
96     }
97 }
98 
99 } // namespace Sharing
100 } // namespace OHOS