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