1 /*
2 * Copyright (c) 2021-2024 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 #include "continuation_register_manager_proxy.h"
16
17 #include "context.h"
18 #include "continuation_connector.h"
19 #include "continuation_device_callback_interface.h"
20 #include "continuation_request.h"
21 #include "hilog_tag_wrapper.h"
22 #include "request_callback.h"
23
24 namespace OHOS {
25 namespace AppExecFwk {
ContinuationRequestRegister(const std::string & bundleName,const ExtraParams & parameter,const std::shared_ptr<IContinuationDeviceCallback> & deviceCallback)26 ContinuationRequestRegister::ContinuationRequestRegister(const std::string &bundleName, const ExtraParams ¶meter,
27 const std::shared_ptr<IContinuationDeviceCallback> &deviceCallback)
28 {
29 parameter_ = parameter;
30 deviceCallback_ = deviceCallback;
31 bundleName_ = bundleName;
32 }
33
Execute(void)34 void ContinuationRequestRegister::Execute(void)
35 {
36 if (continuatinConnector_ == nullptr) {
37 TAG_LOGE(AAFwkTag::CONTINUATION, "continuatinConnector is null");
38 return;
39 }
40
41 int ret = continuatinConnector_->Register(context_, bundleName_, parameter_, deviceCallback_);
42 if (requestCallback_ != nullptr) {
43 requestCallback_->OnResult(ret);
44 } else {
45 TAG_LOGE(AAFwkTag::CONTINUATION, "requestCallback is null");
46 }
47 }
48
ContinuationRequestUnRegister(int token)49 ContinuationRequestUnRegister::ContinuationRequestUnRegister(int token)
50 {
51 token_ = token;
52 }
53
Execute(void)54 void ContinuationRequestUnRegister::Execute(void)
55 {
56 if (continuatinConnector_ == nullptr) {
57 TAG_LOGE(AAFwkTag::CONTINUATION, "continuatinConnector is null");
58 return;
59 }
60
61 bool ret = continuatinConnector_->Unregister(token_);
62 if (requestCallback_ != nullptr) {
63 requestCallback_->OnResult(ret ? 0 : -1);
64 } else {
65 TAG_LOGE(AAFwkTag::CONTINUATION, "requestCallback is null");
66 }
67 }
68
ContinuationRequestUpdateConnectStatus(int token,const std::string & deviceId,int status)69 ContinuationRequestUpdateConnectStatus::ContinuationRequestUpdateConnectStatus(
70 int token, const std::string &deviceId, int status)
71 {
72 token_ = token;
73 deviceId_ = deviceId;
74 status_ = status;
75 }
76
Execute(void)77 void ContinuationRequestUpdateConnectStatus::Execute(void)
78 {
79 if (continuatinConnector_ == nullptr) {
80 TAG_LOGE(AAFwkTag::CONTINUATION, "continuatinConnector is null");
81 return;
82 }
83
84 bool ret = continuatinConnector_->UpdateConnectStatus(token_, deviceId_, status_);
85 if (requestCallback_ != nullptr) {
86 requestCallback_->OnResult(ret ? 0 : -1);
87 } else {
88 TAG_LOGE(AAFwkTag::CONTINUATION, "requestCallback is null");
89 }
90 }
91
ContinuationRequestShowDeviceList(int token,const ExtraParams & parameter)92 ContinuationRequestShowDeviceList::ContinuationRequestShowDeviceList(int token, const ExtraParams ¶meter)
93 {
94 token_ = token;
95 parameter_ = parameter;
96 }
97
Execute(void)98 void ContinuationRequestShowDeviceList::Execute(void)
99 {
100 if (continuatinConnector_ == nullptr) {
101 TAG_LOGE(AAFwkTag::CONTINUATION, "continuatinConnector is null");
102 return;
103 }
104
105 bool ret = continuatinConnector_->ShowDeviceList(token_, parameter_);
106 if (requestCallback_ != nullptr) {
107 requestCallback_->OnResult(ret ? 0 : -1);
108 } else {
109 TAG_LOGE(AAFwkTag::CONTINUATION, "requestCallback is null");
110 }
111 }
112
ContinuationRegisterManagerProxy(const std::weak_ptr<Context> & context)113 ContinuationRegisterManagerProxy::ContinuationRegisterManagerProxy(const std::weak_ptr<Context> &context)
114 {
115 context_ = context;
116 std::shared_ptr<Context> ctx = context_.lock();
117 if (ctx != nullptr) {
118 applicationContext_ = std::weak_ptr<Context>(ctx->GetApplicationContext());
119 }
120 }
121
~ContinuationRegisterManagerProxy()122 ContinuationRegisterManagerProxy::~ContinuationRegisterManagerProxy()
123 {}
124
125 /**
126 * Registers an ability to be migrated with the Device+ control center and obtains the registration token assigned
127 * to the ability.
128 *
129 * @param bundleName Indicates the bundle name of the application whose ability is to be migrated.
130 * @param parameter Indicates the {@link ExtraParams} object containing the extra parameters used to filter
131 * the list of available devices. This parameter can be null.
132 * @param deviceCallback Indicates the callback to be invoked when the connection state of the selected device
133 * changes.
134 * @param requestCallback Indicates the callback to be invoked when the Device+ service is connected.
135 */
Register(const std::string & bundleName,const ExtraParams & parameter,const std::shared_ptr<IContinuationDeviceCallback> & deviceCallback,const std::shared_ptr<RequestCallback> & requestCallback)136 void ContinuationRegisterManagerProxy::Register(const std::string &bundleName, const ExtraParams ¶meter,
137 const std::shared_ptr<IContinuationDeviceCallback> &deviceCallback,
138 const std::shared_ptr<RequestCallback> &requestCallback)
139 {
140 if (context_.lock() == nullptr || applicationContext_.lock() == nullptr) {
141 TAG_LOGE(AAFwkTag::CONTINUATION, "context or applicationContext is null");
142 return;
143 }
144
145 ContinuationRequestRegister *pContinuationRequestRegister =
146 new (std::nothrow) ContinuationRequestRegister(bundleName, parameter, deviceCallback);
147 if (pContinuationRequestRegister != nullptr) {
148 pContinuationRequestRegister->SetContext(context_);
149 pContinuationRequestRegister->SetContinuationConnector(continuatinConnector_);
150 pContinuationRequestRegister->SetRequestCallback(requestCallback);
151
152 std::shared_ptr<ContinuationRequest> request(pContinuationRequestRegister);
153
154 SendRequest(applicationContext_, request);
155 } else {
156 TAG_LOGE(AAFwkTag::CONTINUATION, "ContinuationRequestRegister failed");
157 }
158 }
159
160 /**
161 * Unregisters a specified ability from the Device+ control center based on the token obtained during ability
162 * registration.
163 *
164 * @param token Indicates the registration token of the ability.
165 * @param requestCallback Indicates the callback to be invoked when the Device+ service is connected.
166 * This parameter can be null.
167 */
Unregister(int token,const std::shared_ptr<RequestCallback> & requestCallback)168 void ContinuationRegisterManagerProxy::Unregister(int token, const std::shared_ptr<RequestCallback> &requestCallback)
169 {
170 if (applicationContext_.lock() == nullptr) {
171 TAG_LOGE(AAFwkTag::CONTINUATION, "Context is null");
172 return;
173 }
174
175 ContinuationRequestUnRegister *pContinuationRequestUnRegister =
176 new (std::nothrow) ContinuationRequestUnRegister(token);
177 if (pContinuationRequestUnRegister != nullptr) {
178 pContinuationRequestUnRegister->SetContinuationConnector(continuatinConnector_);
179 pContinuationRequestUnRegister->SetRequestCallback(requestCallback);
180
181 std::shared_ptr<ContinuationRequest> request(pContinuationRequestUnRegister);
182
183 SendRequest(applicationContext_, request);
184 } else {
185 TAG_LOGE(AAFwkTag::CONTINUATION, "ContinuationRequestUnRegister failed");
186 }
187 }
188
189 /**
190 * Updates the connection state of the device where the specified ability is successfully migrated.
191 *
192 * @param token Indicates the registration token of the ability.
193 * @param deviceId Indicates the ID of the device whose connection state is to be updated.
194 * @param status Indicates the connection state to update, which can be {@link DeviceConnectState#FAILURE},
195 * {@link DeviceConnectState#IDLE}, {@link DeviceConnectState#CONNECTING}, {@link DeviceConnectState#CONNECTED},
196 * or {@link DeviceConnectState#DIS_CONNECTING}.
197 * @param requestCallback Indicates the callback to be invoked when the Device+ service is connected.
198 * This parameter can be null.
199 */
UpdateConnectStatus(int token,const std::string & deviceId,int status,const std::shared_ptr<RequestCallback> & requestCallback)200 void ContinuationRegisterManagerProxy::UpdateConnectStatus(
201 int token, const std::string &deviceId, int status, const std::shared_ptr<RequestCallback> &requestCallback)
202 {
203 if (applicationContext_.lock() == nullptr) {
204 TAG_LOGE(AAFwkTag::CONTINUATION, "Context is null");
205 return;
206 }
207
208 ContinuationRequestUpdateConnectStatus *pContinuationRequestUpdateConnectStatus =
209 new (std::nothrow) ContinuationRequestUpdateConnectStatus(token, deviceId, status);
210
211 if (pContinuationRequestUpdateConnectStatus != nullptr) {
212 pContinuationRequestUpdateConnectStatus->SetContinuationConnector(continuatinConnector_);
213 pContinuationRequestUpdateConnectStatus->SetRequestCallback(requestCallback);
214
215 std::shared_ptr<ContinuationRequest> request(pContinuationRequestUpdateConnectStatus);
216
217 SendRequest(applicationContext_, request);
218 } else {
219 TAG_LOGE(AAFwkTag::CONTINUATION, "ContinuationRequestUpdateConnectStatus failed");
220 }
221 }
222
223 /**
224 * Shows the list of devices that can be selected for ability migration on the distributed network.
225 *
226 * @param token Indicates the registration token of the ability.
227 * @param parameter Indicates the {@link ExtraParams} object containing the extra parameters used to filter
228 * the list of available devices. This parameter can be null.
229 * @param requestCallback Indicates the callback to be invoked when the Device+ service is connected.
230 * This parameter can be null.
231 */
ShowDeviceList(int token,const ExtraParams & parameter,const std::shared_ptr<RequestCallback> & requestCallback)232 void ContinuationRegisterManagerProxy::ShowDeviceList(
233 int token, const ExtraParams ¶meter, const std::shared_ptr<RequestCallback> &requestCallback)
234 {
235 if (applicationContext_.lock() == nullptr) {
236 TAG_LOGE(AAFwkTag::CONTINUATION, "Context is null");
237 return;
238 }
239
240 ContinuationRequestShowDeviceList *pContinuationRequestShowDeviceList =
241 new (std::nothrow) ContinuationRequestShowDeviceList(token, parameter);
242 if (pContinuationRequestShowDeviceList != nullptr) {
243 pContinuationRequestShowDeviceList->SetContinuationConnector(continuatinConnector_);
244 pContinuationRequestShowDeviceList->SetRequestCallback(requestCallback);
245
246 std::shared_ptr<ContinuationRequest> request(pContinuationRequestShowDeviceList);
247
248 SendRequest(applicationContext_, request);
249 } else {
250 TAG_LOGE(AAFwkTag::CONTINUATION, "ContinuationRequestShowDeviceList failed");
251 }
252 }
253
254 /**
255 * Disconnects from the Device+ control center.
256 */
Disconnect(void)257 void ContinuationRegisterManagerProxy::Disconnect(void)
258 {
259 if (continuatinConnector_ != nullptr && continuatinConnector_->IsAbilityConnected()) {
260 continuatinConnector_->UnbindRemoteRegisterAbility();
261 }
262 }
263
SendRequest(const std::weak_ptr<Context> & context,const std::shared_ptr<ContinuationRequest> & request)264 void ContinuationRegisterManagerProxy::SendRequest(
265 const std::weak_ptr<Context> &context, const std::shared_ptr<ContinuationRequest> &request)
266 {
267 if (request == nullptr) {
268 TAG_LOGE(AAFwkTag::CONTINUATION, "request is null");
269 return;
270 }
271
272 if (continuatinConnector_ == nullptr) {
273 continuatinConnector_ = ContinuationConnector::GetInstance(context);
274 }
275
276 if (!continuatinConnector_->IsAbilityConnected()) {
277 continuatinConnector_->BindRemoteRegisterAbility(request);
278 } else {
279 request->Execute();
280 }
281 }
282 } // namespace AppExecFwk
283 } // namespace OHOS
284