1 /*
2 * Copyright (c) 2022 Huawei Device 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 <dlfcn.h>
17 #include "remote_session_source_impl.h"
18 #include "avsession_trace.h"
19 #include "remote_session_source_proxy.h"
20
21 namespace OHOS::AVSession {
RemoteSessionSourceProxy()22 RemoteSessionSourceProxy::RemoteSessionSourceProxy()
23 {
24 LoadSourceImplement();
25 }
~RemoteSessionSourceProxy()26 RemoteSessionSourceProxy::~RemoteSessionSourceProxy()
27 {
28 UnLoadSourceImplement();
29 }
30
LoadSourceImplement()31 int32_t RemoteSessionSourceProxy::LoadSourceImplement() __attribute__((no_sanitize("cfi")))
32 {
33 handle_ = dlopen("libremote_session_source.z.so", RTLD_NOW);
34 if (handle_ == nullptr) {
35 SLOGE("Failed to open library %{public}s, reason: %{public}sn",
36 "libremote_session_source.z.so", dlerror());
37 return AVSESSION_ERROR;
38 }
39 using SourceImpl = RemoteSessionSourceImpl* (*)();
40
41 auto createRemoteSessionSourceImpl = (SourceImpl)(dlsym(handle_, "CreateRemoteSessionSourceImpl"));
42 if (createRemoteSessionSourceImpl == nullptr) {
43 if (handle_ != nullptr) {
44 #ifndef TEST_COVERAGE
45 dlclose(handle_);
46 #endif
47 }
48 SLOGE("Failed to get extension symbol %{public}s in %{public}s",
49 "RemoteSessionSourceImpl", "libremote_session_source.z.so");
50 return AVSESSION_ERROR;
51 }
52
53 sourceImpl_ = createRemoteSessionSourceImpl();
54 return AVSESSION_SUCCESS;
55 }
56
UnLoadSourceImplement()57 int32_t RemoteSessionSourceProxy::UnLoadSourceImplement() __attribute__((no_sanitize("cfi")))
58 {
59 using SourceImpl = void(*)(RemoteSessionSourceImpl*);
60 auto destroyRemoteSessionSourceImpl = (SourceImpl)(dlsym(handle_, "DestroyRemoteSessionSourceImpl"));
61 if (destroyRemoteSessionSourceImpl == nullptr) {
62 if (handle_ != nullptr) {
63 #ifndef TEST_COVERAGE
64 dlclose(handle_);
65 #endif
66 }
67 SLOGE("Failed to get extension symbol %{public}s in %{public}s",
68 "DestroyRemoteSessionSourceImpl", "libremote_session_source.z.so");
69 return AVSESSION_ERROR;
70 }
71 destroyRemoteSessionSourceImpl(sourceImpl_);
72 if (handle_ != nullptr) {
73 #ifndef TEST_COVERAGE
74 dlclose(handle_);
75 #endif
76 }
77 return AVSESSION_SUCCESS;
78 }
79
CastSessionToRemote(const sptr<AVSessionItem> & session,const std::string & sourceDevice,const std::string & sinkDevice,const std::string & sinkCapability)80 int32_t RemoteSessionSourceProxy::CastSessionToRemote(const sptr <AVSessionItem>& session,
81 const std::string& sourceDevice,
82 const std::string& sinkDevice,
83 const std::string& sinkCapability)
84 {
85 AVSESSION_TRACE_SYNC_START("RemoteSessionSourceProxy::CastSessionToRemote");
86 CHECK_AND_RETURN_RET_LOG(sourceImpl_ != nullptr, AVSESSION_ERROR, "sourceImpl_ is nullptr");
87 int32_t ret = sourceImpl_->CastSessionToRemote(session, sourceDevice, sinkDevice, sinkCapability);
88 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "source CastSessionToRemote error");
89 return AVSESSION_SUCCESS;
90 }
91
CancelCastAudio(const std::string & sinkDevice)92 int32_t RemoteSessionSourceProxy::CancelCastAudio(const std::string& sinkDevice)
93 {
94 CHECK_AND_RETURN_RET_LOG(sourceImpl_ != nullptr, AVSESSION_ERROR, "sourceImpl_ is nullptr");
95 int32_t ret = sourceImpl_->CancelCastAudio(sinkDevice);
96 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "source CastSessionToLocal error");
97 return AVSESSION_SUCCESS;
98 }
99
SetAVMetaData(const AVMetaData & metaData)100 int32_t RemoteSessionSourceProxy::SetAVMetaData(const AVMetaData& metaData)
101 {
102 AVSESSION_TRACE_SYNC_START("RemoteSessionSourceProxy::SetAVMetaData");
103 CHECK_AND_RETURN_RET_LOG(sourceImpl_ != nullptr, AVSESSION_ERROR, "sourceImpl_ is nullptr");
104 int32_t ret = sourceImpl_->SetAVMetaData(metaData);
105 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "source SetAVMetaData error");
106 return AVSESSION_SUCCESS;
107 }
108
SetAVPlaybackState(const AVPlaybackState & state)109 int32_t RemoteSessionSourceProxy::SetAVPlaybackState(const AVPlaybackState& state)
110 {
111 AVSESSION_TRACE_SYNC_START("RemoteSessionSourceProxy::SetAVPlaybackState");
112 CHECK_AND_RETURN_RET_LOG(sourceImpl_ != nullptr, AVSESSION_ERROR, "sourceImpl_ is nullptr");
113 int32_t ret = sourceImpl_->SetAVPlaybackState(state);
114 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "source SetAVPlaybackState error");
115 return AVSESSION_SUCCESS;
116 }
117
SetSessionEventRemote(const std::string & event,const AAFwk::WantParams & args)118 int32_t RemoteSessionSourceProxy::SetSessionEventRemote(const std::string& event, const AAFwk::WantParams& args)
119 {
120 AVSESSION_TRACE_SYNC_START("RemoteSessionSourceProxy::SetSessionEventRemote");
121 CHECK_AND_RETURN_RET_LOG(sourceImpl_ != nullptr, AVSESSION_ERROR, "sourceImpl_ is nullptr");
122 int32_t ret = sourceImpl_->SetSessionEventRemote(event, args);
123 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "source SetSessionEventRemote error");
124 return AVSESSION_SUCCESS;
125 }
126
SetAVQueueItems(const std::vector<AVQueueItem> & items)127 int32_t RemoteSessionSourceProxy::SetAVQueueItems(const std::vector<AVQueueItem>& items)
128 {
129 AVSESSION_TRACE_SYNC_START("RemoteSessionSourceProxy::SetAVQueueItems");
130 CHECK_AND_RETURN_RET_LOG(sourceImpl_ != nullptr, AVSESSION_ERROR, "sourceImpl_ is nullptr");
131 int32_t ret = sourceImpl_->SetAVQueueItems(items);
132 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "source SetAVQueueItems error");
133 return AVSESSION_SUCCESS;
134 }
135
SetAVQueueTitle(const std::string & title)136 int32_t RemoteSessionSourceProxy::SetAVQueueTitle(const std::string& title)
137 {
138 AVSESSION_TRACE_SYNC_START("RemoteSessionSourceProxy::SetAVQueueTitle");
139 CHECK_AND_RETURN_RET_LOG(sourceImpl_ != nullptr, AVSESSION_ERROR, "sourceImpl_ is nullptr");
140 int32_t ret = sourceImpl_->SetAVQueueTitle(title);
141 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "source SetAVQueueTitle error");
142 return AVSESSION_SUCCESS;
143 }
144
SetExtrasRemote(const AAFwk::WantParams & extras)145 int32_t RemoteSessionSourceProxy::SetExtrasRemote(const AAFwk::WantParams& extras)
146 {
147 AVSESSION_TRACE_SYNC_START("RemoteSessionSourceProxy::SetExtrasRemote");
148 CHECK_AND_RETURN_RET_LOG(sourceImpl_ != nullptr, AVSESSION_ERROR, "sourceImpl_ is nullptr");
149 int32_t ret = sourceImpl_->SetExtrasRemote(extras);
150 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "source SetExtrasRemote error");
151 return AVSESSION_SUCCESS;
152 }
153 } // namespace OHOS::AVSession
154