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