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