• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &parameter,
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 &parameter)
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 &parameter,
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 &parameter, 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