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