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