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 #ifndef OHOS_SHARING_AGENT_H 17 #define OHOS_SHARING_AGENT_H 18 19 #include <map> 20 #include "agent/session/base_session.h" 21 #include "agent_def.h" 22 #include "common/event_comm.h" 23 24 namespace OHOS { 25 namespace Sharing { 26 27 class IAgentListener { 28 public: 29 using Ptr = std::shared_ptr<IAgentListener>; 30 31 virtual ~IAgentListener() = default; 32 33 virtual void OnAgentNotify(AgentStatusMsg::Ptr &statusMsg) = 0; 34 }; 35 36 class Agent : public IdentifierInfo, 37 public ISessionListener, 38 public HandleEventBase, 39 public std::enable_shared_from_this<Agent> { 40 public: 41 using Ptr = std::shared_ptr<Agent>; 42 43 explicit Agent(AgentType agentType); 44 SetDestroy()45 void SetDestroy() 46 { 47 destroy_ = true; 48 } 49 GetDestroy()50 bool GetDestroy() 51 { 52 return destroy_; 53 } 54 UpdateMediaChannelId(uint32_t mediaChannelId)55 void UpdateMediaChannelId(uint32_t mediaChannelId) 56 { 57 mediaChannelId_ = mediaChannelId; 58 } 59 SetAgentListener(std::weak_ptr<IAgentListener> agentListener)60 void SetAgentListener(std::weak_ptr<IAgentListener> agentListener) 61 { 62 agentListener_ = agentListener; 63 } 64 GetMediaChannelId()65 uint32_t GetMediaChannelId() 66 { 67 return mediaChannelId_; 68 } 69 GetAgentType()70 AgentType GetAgentType() 71 { 72 return agentType_; 73 } 74 75 public: 76 int32_t HandleEvent(SharingEvent &event) override; 77 SharingErrorCode CreateSession(const std::string &className); 78 79 protected: 80 void PushNextStep(SessionStatusMsg::Ptr &statusMsg); 81 void HandleSessionError(SessionStatusMsg::Ptr &statusMsg); 82 void UpdateSessionStatus(SessionStatusMsg::Ptr &statusMsg); 83 void PopNextStep(AgentRunStep step, AgentRunningStatus status); 84 void OnSessionNotify(SessionStatusMsg::Ptr &statusMsg) override; 85 void SetRunningStatus(AgentRunStep step, AgentRunningStatus status); 86 87 AgentRunStep GetRunStep(EventType eventType); 88 AgentRunStepWeight GetRunStepWeight(AgentRunStep runStep); 89 SharingErrorCode CheckRunStep(SharingEvent &event, bool &isCached); 90 91 private: 92 uint32_t NotifyPrivateEvent(SessionStatusMsg::Ptr &statusMsg); 93 94 void HandleProsumerState(SessionStatusMsg::Ptr &statusMsg); 95 void HandleProsumerError(SessionStatusMsg::Ptr &statusMsg); 96 97 template<typename T, typename SetupFunc> 98 void SendChannelCommonEvent(SessionStatusMsg::Ptr &statusMsg, EventType eventType, SetupFunc setupFunc); 99 100 void SendContextEvent(SessionStatusMsg::Ptr &statusMsg, EventType eventType); 101 void SendChannelEvent(SessionStatusMsg::Ptr &statusMsg, EventType eventType); 102 void SendInteractionEvent(SessionStatusMsg::Ptr &statusMsg, EventType eventType); 103 void SendChannelSetVolumeEvent(SessionStatusMsg::Ptr &statusMsg, EventType eventType); 104 void SendChannelSceneTypeEvent(SessionStatusMsg::Ptr &statusMsg, EventType eventType); 105 void SendChannelKeyRedirectEvent(SessionStatusMsg::Ptr &statusMsg, EventType eventType); 106 void SendChannelAppendSurfaceEvent(SessionStatusMsg::Ptr &statusMsg, EventType eventType); 107 void SendChannelRemoveSurfaceEvent(SessionStatusMsg::Ptr &statusMsg, EventType eventType); 108 109 protected: 110 bool destroy_ = false; 111 uint32_t prosumerId_ = INVALID_ID; 112 uint32_t mediaChannelId_ = INVALID_ID; 113 114 std::mutex runStepMutex_; 115 std::weak_ptr<IAgentListener> agentListener_; 116 std::map<AgentRunStepKey, SharingEvent> runEvents_; 117 118 AgentType agentType_ = SRC_AGENT; 119 BaseSession::Ptr session_ = nullptr; 120 AgentRunStep runStep_ = AGENT_STEP_IDLE; 121 AgentRunningStatus runningStatus_ = AGENT_STATUS_IDLE; 122 }; 123 124 } // namespace Sharing 125 } // namespace OHOS 126 #endif