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 "ability_scheduler_proxy.h"
16
17 #include "ability_manager_errors.h"
18 #include "data_ability_observer_interface.h"
19 #include "data_ability_operation.h"
20 #include "data_ability_predicates.h"
21 #include "data_ability_result.h"
22 #include "error_msg_util.h"
23 #include "hilog_tag_wrapper.h"
24 #include "hitrace_meter.h"
25 #include "ipc_capacity_wrap.h"
26 #include "ishared_result_set.h"
27 #include "session_info.h"
28 #include "values_bucket.h"
29
30 namespace OHOS {
31 namespace AAFwk {
32 namespace {
33 const int64_t SCHEDULE_IPC_LOG_TIME = 10000;
34 }
WriteInterfaceToken(MessageParcel & data)35 bool AbilitySchedulerProxy::WriteInterfaceToken(MessageParcel &data)
36 {
37 if (!data.WriteInterfaceToken(AbilitySchedulerProxy::GetDescriptor())) {
38 TAG_LOGE(AAFwkTag::ABILITYMGR, "write interface token failed");
39 return false;
40 }
41 return true;
42 }
43
ScheduleAbilityTransaction(const Want & want,const LifeCycleStateInfo & stateInfo,sptr<SessionInfo> sessionInfo)44 bool AbilitySchedulerProxy::ScheduleAbilityTransaction(const Want &want, const LifeCycleStateInfo &stateInfo,
45 sptr<SessionInfo> sessionInfo)
46 {
47 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
48 TAG_LOGD(AAFwkTag::ABILITYMGR, "begin");
49 auto start = std::chrono::system_clock::now();
50 MessageParcel data;
51 MessageParcel reply;
52 MessageOption option(MessageOption::TF_ASYNC);
53 AAFwk::ExtendMaxIpcCapacityForInnerWant(data);
54 if (!WriteInterfaceToken(data)) {
55 return false;
56 }
57 auto msgKey = AbilityRuntime::ErrorMgsUtil::BuildErrorKey(reinterpret_cast<uintptr_t>(this),
58 "ScheduleAbilityTransaction");
59 if (!data.WriteParcelable(&want)) {
60 TAG_LOGE(AAFwkTag::ABILITYMGR, "write want failed");
61 AbilityRuntime::ErrorMgsUtil::GetInstance().UpdateErrorMsg(msgKey, "write want failed");
62 return false;
63 }
64 data.WriteParcelable(&stateInfo);
65 if (sessionInfo) {
66 SessionInfo tmpInfo = *sessionInfo;
67 tmpInfo.want = Want();
68 if (!data.WriteBool(true) || !data.WriteParcelable(&tmpInfo)) {
69 TAG_LOGE(AAFwkTag::ABILITYMGR, "write sessionInfo failed");
70 AbilityRuntime::ErrorMgsUtil::GetInstance().UpdateErrorMsg(msgKey, "write sessionInfo failed");
71 return false;
72 }
73 } else {
74 if (!data.WriteBool(false)) {
75 return false;
76 }
77 }
78 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_ABILITY_TRANSACTION, data, reply, option);
79 if (err != NO_ERROR) {
80 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
81 AbilityRuntime::ErrorMgsUtil::GetInstance().UpdateErrorMsg(msgKey,
82 std::string("ScheduleAbilityTransaction ipc error " + std::to_string(err)));
83 return false;
84 }
85 int64_t cost = std::chrono::duration_cast<std::chrono::microseconds>(
86 std::chrono::system_clock::now() - start).count();
87 if (cost > SCHEDULE_IPC_LOG_TIME) {
88 TAG_LOGI(AAFwkTag::ABILITYMGR, "ScheduleAbilityTransaction proxy cost %{public}" PRId64 "mirco seconds,"
89 " data size: %{public}zu", cost, data.GetWritePosition());
90 } else {
91 TAG_LOGD(AAFwkTag::ABILITYMGR, "ScheduleAbilityTransaction proxy cost %{public}" PRId64 "mirco seconds,"
92 " data size: %{public}zu", cost, data.GetWritePosition());
93 }
94 return true;
95 }
96
ScheduleShareData(const int32_t & uniqueId)97 void AbilitySchedulerProxy::ScheduleShareData(const int32_t &uniqueId)
98 {
99 MessageParcel data;
100 MessageParcel reply;
101 MessageOption option(MessageOption::TF_ASYNC);
102 if (!WriteInterfaceToken(data)) {
103 TAG_LOGE(AAFwkTag::ABILITYMGR, "write interface token failed");
104 return;
105 }
106 if (!data.WriteInt32(uniqueId)) {
107 TAG_LOGE(AAFwkTag::ABILITYMGR, "uniqueId write failed");
108 return;
109 }
110 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_SHARE_DATA, data, reply, option);
111 if (err != NO_ERROR) {
112 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
113 }
114 return;
115 }
116
SendResult(int requestCode,int resultCode,const Want & resultWant)117 void AbilitySchedulerProxy::SendResult(int requestCode, int resultCode, const Want &resultWant)
118 {
119 MessageParcel data;
120 MessageParcel reply;
121 MessageOption option(MessageOption::TF_ASYNC);
122 if (!WriteInterfaceToken(data)) {
123 return;
124 }
125 if (!data.WriteInt32(requestCode)) {
126 TAG_LOGE(AAFwkTag::ABILITYMGR, "write requestCode failed");
127 return;
128 }
129 if (!data.WriteInt32(resultCode)) {
130 TAG_LOGE(AAFwkTag::ABILITYMGR, "write resultCode failed");
131 return;
132 }
133 if (!data.WriteParcelable(&resultWant)) {
134 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable");
135 return;
136 }
137 int32_t err = SendTransactCmd(IAbilityScheduler::SEND_RESULT, data, reply, option);
138 if (err != NO_ERROR) {
139 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
140 }
141 }
142
ScheduleConnectAbility(const Want & want)143 void AbilitySchedulerProxy::ScheduleConnectAbility(const Want &want)
144 {
145 MessageParcel data;
146 MessageParcel reply;
147 MessageOption option(MessageOption::TF_ASYNC);
148 AAFwk::ExtendMaxIpcCapacityForInnerWant(data);
149 if (!WriteInterfaceToken(data)) {
150 return;
151 }
152 if (!data.WriteParcelable(&want)) {
153 TAG_LOGE(AAFwkTag::SERVICE_EXT, "fail to WriteParcelable");
154 return;
155 }
156 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_ABILITY_CONNECT, data, reply, option);
157 if (err != NO_ERROR) {
158 TAG_LOGE(AAFwkTag::SERVICE_EXT, "fail, err: %{public}d", err);
159 }
160 }
161
ScheduleDisconnectAbility(const Want & want)162 void AbilitySchedulerProxy::ScheduleDisconnectAbility(const Want &want)
163 {
164 MessageParcel data;
165 MessageParcel reply;
166 MessageOption option(MessageOption::TF_ASYNC);
167 AAFwk::ExtendMaxIpcCapacityForInnerWant(data);
168 if (!WriteInterfaceToken(data)) {
169 return;
170 }
171 if (!data.WriteParcelable(&want)) {
172 TAG_LOGE(AAFwkTag::SERVICE_EXT, "fail to WriteParcelable");
173 return;
174 }
175
176 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_ABILITY_DISCONNECT, data, reply, option);
177 if (err != NO_ERROR) {
178 TAG_LOGE(AAFwkTag::SERVICE_EXT, "fail, err: %{public}d", err);
179 }
180 }
181
ScheduleCommandAbility(const Want & want,bool restart,int startId)182 void AbilitySchedulerProxy::ScheduleCommandAbility(const Want &want, bool restart, int startId)
183 {
184 MessageParcel data;
185 MessageParcel reply;
186 MessageOption option(MessageOption::TF_ASYNC);
187 AAFwk::ExtendMaxIpcCapacityForInnerWant(data);
188 if (!WriteInterfaceToken(data)) {
189 return;
190 }
191 if (!data.WriteParcelable(&want)) {
192 TAG_LOGE(AAFwkTag::SERVICE_EXT, "WriteParcelable failed");
193 return;
194 }
195 if (!data.WriteBool(restart)) {
196 TAG_LOGE(AAFwkTag::SERVICE_EXT, "WriteBool failed");
197 return;
198 }
199 TAG_LOGD(AAFwkTag::SERVICE_EXT, "WriteInt32,startId:%{public}d", startId);
200 if (!data.WriteInt32(startId)) {
201 TAG_LOGE(AAFwkTag::SERVICE_EXT, "fail to WriteInt32");
202 return;
203 }
204
205 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_ABILITY_COMMAND, data, reply, option);
206 if (err != NO_ERROR) {
207 TAG_LOGE(AAFwkTag::SERVICE_EXT, "fail, err: %{public}d", err);
208 }
209 }
210
SchedulePrepareTerminateAbility()211 bool AbilitySchedulerProxy::SchedulePrepareTerminateAbility()
212 {
213 MessageParcel data;
214 MessageParcel reply;
215 MessageOption option(MessageOption::TF_ASYNC);
216 if (!WriteInterfaceToken(data)) {
217 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to write interface");
218 return false;
219 }
220
221 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_ABILITY_PREPARE_TERMINATE, data, reply, option);
222 if (err != NO_ERROR) {
223 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, err: %{public}d", err);
224 return false;
225 }
226 return true;
227 }
228
ScheduleCommandAbilityWindow(const Want & want,const sptr<SessionInfo> & sessionInfo,WindowCommand winCmd)229 void AbilitySchedulerProxy::ScheduleCommandAbilityWindow(const Want &want, const sptr<SessionInfo> &sessionInfo,
230 WindowCommand winCmd)
231 {
232 MessageParcel data;
233 MessageParcel reply;
234 MessageOption option(MessageOption::TF_ASYNC);
235 AAFwk::ExtendMaxIpcCapacityForInnerWant(data);
236 if (!WriteInterfaceToken(data)) {
237 return;
238 }
239 if (!data.WriteParcelable(&want)) {
240 TAG_LOGE(AAFwkTag::ABILITYMGR, "writeParcelable failed");
241 return;
242 }
243 if (!data.WriteParcelable(sessionInfo)) {
244 TAG_LOGE(AAFwkTag::ABILITYMGR, "writeParcelable failed");
245 return;
246 }
247 if (!data.WriteInt32(winCmd)) {
248 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteInt32");
249 return;
250 }
251
252 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_ABILITY_COMMAND_WINDOW, data, reply, option);
253 if (err != NO_ERROR) {
254 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
255 }
256 }
257
ScheduleSaveAbilityState()258 void AbilitySchedulerProxy::ScheduleSaveAbilityState()
259 {
260 MessageParcel data;
261 MessageParcel reply;
262 MessageOption option(MessageOption::TF_ASYNC);
263 if (!WriteInterfaceToken(data)) {
264 return;
265 }
266 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_SAVE_ABILITY_STATE, data, reply, option);
267 if (err != NO_ERROR) {
268 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
269 }
270 }
271
ScheduleRestoreAbilityState(const PacMap & inState)272 void AbilitySchedulerProxy::ScheduleRestoreAbilityState(const PacMap &inState)
273 {
274 MessageParcel data;
275 MessageParcel reply;
276 MessageOption option(MessageOption::TF_ASYNC);
277 if (!WriteInterfaceToken(data)) {
278 return;
279 }
280 if (!data.WriteParcelable(&inState)) {
281 TAG_LOGE(AAFwkTag::ABILITYMGR, "writeParcelable err");
282 return;
283 }
284 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_RESTORE_ABILITY_STATE, data, reply, option);
285 if (err != NO_ERROR) {
286 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
287 }
288 }
289
290 /**
291 * @brief Obtains the MIME types of files supported.
292 *
293 * @param uri Indicates the path of the files to obtain.
294 * @param mimeTypeFilter Indicates the MIME types of the files to obtain. This parameter cannot be null.
295 *
296 * @return Returns the matched MIME types. If there is no match, null is returned.
297 */
GetFileTypes(const Uri & uri,const std::string & mimeTypeFilter)298 std::vector<std::string> AbilitySchedulerProxy::GetFileTypes(const Uri &uri, const std::string &mimeTypeFilter)
299 {
300 std::vector<std::string> types;
301
302 MessageParcel data;
303 MessageParcel reply;
304 MessageOption option;
305
306 if (!WriteInterfaceToken(data)) {
307 return types;
308 }
309
310 if (!data.WriteParcelable(&uri)) {
311 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable uri");
312 return types;
313 }
314
315 if (!data.WriteString(mimeTypeFilter)) {
316 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteString mimeTypeFilter");
317 return types;
318 }
319
320 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_GETFILETYPES, data, reply, option);
321 if (err != NO_ERROR) {
322 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
323 }
324
325 if (!reply.ReadStringVector(&types)) {
326 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to ReadStringVector types");
327 }
328
329 return types;
330 }
331
332 /**
333 * @brief Opens a file in a specified remote path.
334 *
335 * @param uri Indicates the path of the file to open.
336 * @param mode Indicates the file open mode, which can be "r" for read-only access, "w" for write-only access
337 * (erasing whatever data is currently in the file), "wt" for write access that truncates any existing file,
338 * "wa" for write-only access to append to any existing data, "rw" for read and write access on any existing data,
339 * or "rwt" for read and write access that truncates any existing file.
340 *
341 * @return Returns the file descriptor.
342 */
OpenFile(const Uri & uri,const std::string & mode)343 int AbilitySchedulerProxy::OpenFile(const Uri &uri, const std::string &mode)
344 {
345 int fd = -1;
346
347 MessageParcel data;
348 MessageParcel reply;
349 MessageOption option;
350
351 if (!WriteInterfaceToken(data)) {
352 return fd;
353 }
354
355 if (!data.WriteParcelable(&uri)) {
356 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable uri");
357 return fd;
358 }
359
360 if (!data.WriteString(mode)) {
361 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteString mode");
362 return fd;
363 }
364
365 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_OPENFILE, data, reply, option);
366 if (err != NO_ERROR) {
367 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
368 return fd;
369 }
370
371 fd = reply.ReadFileDescriptor();
372 if (fd == -1) {
373 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to ReadInt32 fd");
374 return fd;
375 }
376
377 return fd;
378 }
379
380 /**
381 * @brief This is like openFile, open a file that need to be able to return sub-sections of files,often assets
382 * inside of their .hap.
383 *
384 * @param uri Indicates the path of the file to open.
385 * @param mode Indicates the file open mode, which can be "r" for read-only access, "w" for write-only access
386 * (erasing whatever data is currently in the file), "wt" for write access that truncates any existing file,
387 * "wa" for write-only access to append to any existing data, "rw" for read and write access on any existing
388 * data, or "rwt" for read and write access that truncates any existing file.
389 *
390 * @return Returns the RawFileDescriptor object containing file descriptor.
391 */
OpenRawFile(const Uri & uri,const std::string & mode)392 int AbilitySchedulerProxy::OpenRawFile(const Uri &uri, const std::string &mode)
393 {
394 int fd = -1;
395
396 MessageParcel data;
397 MessageParcel reply;
398 MessageOption option;
399
400 if (!WriteInterfaceToken(data)) {
401 return fd;
402 }
403
404 if (!data.WriteParcelable(&uri)) {
405 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable uri");
406 return fd;
407 }
408
409 if (!data.WriteString(mode)) {
410 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteString mode");
411 return fd;
412 }
413
414 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_OPENRAWFILE, data, reply, option);
415 if (err != NO_ERROR) {
416 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
417 return fd;
418 }
419
420 if (!reply.ReadInt32(fd)) {
421 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to ReadInt32 fd");
422 return fd;
423 }
424
425 return fd;
426 }
427
428 /**
429 * @brief Inserts a single data record into the database.
430 *
431 * @param uri Indicates the path of the data to operate.
432 * @param value Indicates the data record to insert. If this parameter is null, a blank row will be inserted.
433 *
434 * @return Returns the index of the inserted data record.
435 */
Insert(const Uri & uri,const NativeRdb::ValuesBucket & value)436 int AbilitySchedulerProxy::Insert(const Uri &uri, const NativeRdb::ValuesBucket &value)
437 {
438 int index = -1;
439
440 MessageParcel data;
441 MessageParcel reply;
442 MessageOption option;
443
444 if (!WriteInterfaceToken(data)) {
445 return index;
446 }
447
448 if (!data.WriteParcelable(&uri)) {
449 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable uri");
450 return index;
451 }
452
453 if (!value.Marshalling(data)) {
454 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable value");
455 return index;
456 }
457
458 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_INSERT, data, reply, option);
459 if (err != NO_ERROR) {
460 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
461 return index;
462 }
463
464 if (!reply.ReadInt32(index)) {
465 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to ReadInt32 index");
466 return index;
467 }
468
469 return index;
470 }
471
472 /**
473 * @brief Inserts a single data record into the database.
474 *
475 * @param uri Indicates the path of the data to operate.
476 * @param value Indicates the data record to insert. If this parameter is null, a blank row will be inserted.
477 *
478 * @return Returns the index of the inserted data record.
479 */
Call(const Uri & uri,const std::string & method,const std::string & arg,const AppExecFwk::PacMap & pacMap)480 std::shared_ptr<AppExecFwk::PacMap> AbilitySchedulerProxy::Call(
481 const Uri &uri, const std::string &method, const std::string &arg, const AppExecFwk::PacMap &pacMap)
482 {
483 MessageParcel data;
484 MessageParcel reply;
485 MessageOption option;
486
487 if (!WriteInterfaceToken(data)) {
488 return nullptr;
489 }
490
491 if (!data.WriteParcelable(&uri)) {
492 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable uri");
493 return nullptr;
494 }
495
496 if (!data.WriteString(method)) {
497 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteString method");
498 return nullptr;
499 }
500
501 if (!data.WriteString(arg)) {
502 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteString arg");
503 return nullptr;
504 }
505
506 if (!data.WriteParcelable(&pacMap)) {
507 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable pacMap");
508 return nullptr;
509 }
510
511 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_CALL, data, reply, option);
512 if (err != NO_ERROR) {
513 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
514 return nullptr;
515 }
516 std::shared_ptr<AppExecFwk::PacMap> result(reply.ReadParcelable<AppExecFwk::PacMap>());
517 if (!result) {
518 TAG_LOGE(AAFwkTag::ABILITYMGR, "readParcelable value null");
519 return nullptr;
520 }
521 return result;
522 }
523
524 /**
525 * @brief Updates data records in the database.
526 *
527 * @param uri Indicates the path of data to update.
528 * @param value Indicates the data to update. This parameter can be null.
529 * @param predicates Indicates filter criteria. You should define the processing logic when this parameter is null.
530 *
531 * @return Returns the number of data records updated.
532 */
Update(const Uri & uri,const NativeRdb::ValuesBucket & value,const NativeRdb::DataAbilityPredicates & predicates)533 int AbilitySchedulerProxy::Update(const Uri &uri, const NativeRdb::ValuesBucket &value,
534 const NativeRdb::DataAbilityPredicates &predicates)
535 {
536 int index = -1;
537
538 MessageParcel data;
539 MessageParcel reply;
540 MessageOption option;
541
542 if (!WriteInterfaceToken(data)) {
543 return index;
544 }
545
546 if (!data.WriteParcelable(&uri)) {
547 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable uri");
548 return index;
549 }
550
551 if (!value.Marshalling(data)) {
552 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable value");
553 return index;
554 }
555
556 if (!data.WriteParcelable(&predicates)) {
557 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable predicates");
558 return index;
559 }
560
561 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_UPDATE, data, reply, option);
562 if (err != NO_ERROR) {
563 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
564 return index;
565 }
566
567 if (!reply.ReadInt32(index)) {
568 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to ReadInt32 index");
569 return index;
570 }
571
572 return index;
573 }
574
575 /**
576 * @brief Deletes one or more data records from the database.
577 *
578 * @param uri Indicates the path of the data to operate.
579 * @param predicates Indicates filter criteria. You should define the processing logic when this parameter is null.
580 *
581 * @return Returns the number of data records deleted.
582 */
Delete(const Uri & uri,const NativeRdb::DataAbilityPredicates & predicates)583 int AbilitySchedulerProxy::Delete(const Uri &uri, const NativeRdb::DataAbilityPredicates &predicates)
584 {
585 int index = -1;
586
587 MessageParcel data;
588 MessageParcel reply;
589 MessageOption option;
590
591 if (!WriteInterfaceToken(data)) {
592 return index;
593 }
594
595 if (!data.WriteParcelable(&uri)) {
596 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable uri");
597 return index;
598 }
599
600 if (!data.WriteParcelable(&predicates)) {
601 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable predicates");
602 return index;
603 }
604
605 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_DELETE, data, reply, option);
606 if (err != NO_ERROR) {
607 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
608 return index;
609 }
610
611 if (!reply.ReadInt32(index)) {
612 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to ReadInt32 index");
613 return index;
614 }
615
616 return index;
617 }
618
619 /**
620 * @brief Deletes one or more data records from the database.
621 *
622 * @param uri Indicates the path of data to query.
623 * @param columns Indicates the columns to query. If this parameter is null, all columns are queried.
624 * @param predicates Indicates filter criteria. You should define the processing logic when this parameter is null.
625 *
626 * @return Returns the query result.
627 */
Query(const Uri & uri,std::vector<std::string> & columns,const NativeRdb::DataAbilityPredicates & predicates)628 std::shared_ptr<NativeRdb::AbsSharedResultSet> AbilitySchedulerProxy::Query(
629 const Uri &uri, std::vector<std::string> &columns, const NativeRdb::DataAbilityPredicates &predicates)
630 {
631 MessageParcel data;
632 MessageParcel reply;
633 MessageOption option;
634
635 if (!WriteInterfaceToken(data)) {
636 return nullptr;
637 }
638
639 if (!data.WriteParcelable(&uri)) {
640 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable uri");
641 return nullptr;
642 }
643
644 if (!data.WriteStringVector(columns)) {
645 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteStringVector columns");
646 return nullptr;
647 }
648
649 if (!data.WriteParcelable(&predicates)) {
650 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable predicates");
651 return nullptr;
652 }
653
654 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_QUERY, data, reply, option);
655 if (err != NO_ERROR) {
656 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
657 return nullptr;
658 }
659 return OHOS::NativeRdb::ISharedResultSet::ReadFromParcel(reply);
660 }
661
662 /**
663 * @brief Obtains the MIME type matching the data specified by the URI of the Data ability. This method should be
664 * implemented by a Data ability. Data abilities supports general data types, including text, HTML, and JPEG.
665 *
666 * @param uri Indicates the URI of the data.
667 *
668 * @return Returns the MIME type that matches the data specified by uri.
669 */
GetType(const Uri & uri)670 std::string AbilitySchedulerProxy::GetType(const Uri &uri)
671 {
672 std::string type;
673
674 MessageParcel data;
675 MessageParcel reply;
676 MessageOption option;
677
678 if (!WriteInterfaceToken(data)) {
679 return type;
680 }
681
682 if (!data.WriteParcelable(&uri)) {
683 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable uri");
684 return type;
685 }
686
687 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_GETTYPE, data, reply, option);
688 if (err != NO_ERROR) {
689 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
690 return type;
691 }
692
693 type = reply.ReadString();
694 if (type.empty()) {
695 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to ReadString type");
696 return type;
697 }
698
699 return type;
700 }
701
702 /**
703 * @brief Reloads data in the database.
704 *
705 * @param uri Indicates the position where the data is to reload. This parameter is mandatory.
706 * @param extras Indicates the PacMap object containing the additional parameters to be passed in this call. This
707 * parameter can be null. If a custom Sequenceable object is put in the PacMap object and will be transferred across
708 * processes, you must call BasePacMap.setClassLoader(ClassLoader) to set a class loader for the custom object.
709 *
710 * @return Returns true if the data is successfully reloaded; returns false otherwise.
711 */
Reload(const Uri & uri,const PacMap & extras)712 bool AbilitySchedulerProxy::Reload(const Uri &uri, const PacMap &extras)
713 {
714 bool ret = false;
715
716 MessageParcel data;
717 MessageParcel reply;
718 MessageOption option;
719
720 if (!WriteInterfaceToken(data)) {
721 return ret;
722 }
723
724 if (!data.WriteParcelable(&uri)) {
725 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable uri");
726 return ret;
727 }
728
729 if (!data.WriteParcelable(&extras)) {
730 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable extras");
731 return ret;
732 }
733
734 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_RELOAD, data, reply, option);
735 if (err != NO_ERROR) {
736 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
737 return ret;
738 }
739
740 ret = reply.ReadBool();
741 if (!ret) {
742 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to ReadBool ret");
743 return ret;
744 }
745
746 return ret;
747 }
748
749 /**
750 * @brief Inserts multiple data records into the database.
751 *
752 * @param uri Indicates the path of the data to operate.
753 * @param values Indicates the data records to insert.
754 *
755 * @return Returns the number of data records inserted.
756 */
BatchInsert(const Uri & uri,const std::vector<NativeRdb::ValuesBucket> & values)757 int AbilitySchedulerProxy::BatchInsert(const Uri &uri, const std::vector<NativeRdb::ValuesBucket> &values)
758 {
759 int ret = -1;
760
761 MessageParcel data;
762 MessageParcel reply;
763 MessageOption option;
764
765 if (!WriteInterfaceToken(data)) {
766 return ret;
767 }
768
769 if (!data.WriteParcelable(&uri)) {
770 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable uri");
771 return ret;
772 }
773
774 int count = (int)values.size();
775 if (!data.WriteInt32(count)) {
776 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteInt32 ret");
777 return ret;
778 }
779
780 for (int i = 0; i < count; i++) {
781 if (!values[i].Marshalling(data)) {
782 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, index: %{public}d", i);
783 return ret;
784 }
785 }
786
787 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_BATCHINSERT, data, reply, option);
788 if (err != NO_ERROR) {
789 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
790 return ret;
791 }
792
793 if (!reply.ReadInt32(ret)) {
794 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to ReadInt32 index");
795 return ret;
796 }
797
798 return ret;
799 }
800
801 /**
802 * @brief Registers an observer to DataObsMgr specified by the given Uri.
803 *
804 * @param uri, Indicates the path of the data to operate.
805 * @param dataObserver, Indicates the IDataAbilityObserver object.
806 */
ScheduleRegisterObserver(const Uri & uri,const sptr<IDataAbilityObserver> & dataObserver)807 bool AbilitySchedulerProxy::ScheduleRegisterObserver(const Uri &uri, const sptr<IDataAbilityObserver> &dataObserver)
808 {
809 MessageParcel data;
810 MessageParcel reply;
811 MessageOption option;
812
813 if (!WriteInterfaceToken(data)) {
814 TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s WriteInterfaceToken(data) return false", __func__);
815 return false;
816 }
817
818 if (!data.WriteParcelable(&uri)) {
819 TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s failed to WriteParcelable uri ", __func__);
820 return false;
821 }
822
823 if (!data.WriteRemoteObject(dataObserver->AsObject())) {
824 TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s failed to WriteParcelable dataObserver ", __func__);
825 return false;
826 }
827
828 int32_t result = SendTransactCmd(IAbilityScheduler::SCHEDULE_REGISTEROBSERVER, data, reply, option);
829 if (result == ERR_NONE) {
830 TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}s SendRequest ok, retval: %{public}d", __func__, reply.ReadInt32());
831 return true;
832 } else {
833 TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s SendRequest error, result=%{public}d", __func__, result);
834 return false;
835 }
836 }
837
838 /**
839 * @brief Deregisters an observer used for DataObsMgr specified by the given Uri.
840 *
841 * @param uri, Indicates the path of the data to operate.
842 * @param dataObserver, Indicates the IDataAbilityObserver object.
843 */
ScheduleUnregisterObserver(const Uri & uri,const sptr<IDataAbilityObserver> & dataObserver)844 bool AbilitySchedulerProxy::ScheduleUnregisterObserver(const Uri &uri, const sptr<IDataAbilityObserver> &dataObserver)
845 {
846 MessageParcel data;
847 MessageParcel reply;
848 MessageOption option;
849
850 if (!WriteInterfaceToken(data)) {
851 TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s WriteInterfaceToken(data) return false", __func__);
852 return false;
853 }
854
855 if (!data.WriteParcelable(&uri)) {
856 TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s failed to WriteParcelable uri ", __func__);
857 return false;
858 }
859
860 if (!data.WriteRemoteObject(dataObserver->AsObject())) {
861 TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s failed to WriteParcelable dataObserver ", __func__);
862 return false;
863 }
864
865 int32_t result = SendTransactCmd(IAbilityScheduler::SCHEDULE_UNREGISTEROBSERVER, data, reply, option);
866 if (result == ERR_NONE) {
867 TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}s SendRequest ok, retval is %{public}d", __func__, reply.ReadInt32());
868 return true;
869 } else {
870 TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s SendRequest error, result=%{public}d", __func__, result);
871 return false;
872 }
873 }
874
875 /**
876 * @brief Notifies the registered observers of a change to the data resource specified by Uri.
877 *
878 * @param uri, Indicates the path of the data to operate.
879 */
ScheduleNotifyChange(const Uri & uri)880 bool AbilitySchedulerProxy::ScheduleNotifyChange(const Uri &uri)
881 {
882 MessageParcel data;
883 MessageParcel reply;
884 MessageOption option;
885
886 if (!WriteInterfaceToken(data)) {
887 TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s WriteInterfaceToken(data) return false", __func__);
888 return false;
889 }
890
891 if (!data.WriteParcelable(&uri)) {
892 TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s failed to WriteParcelable uri ", __func__);
893 return false;
894 }
895
896 int32_t result = SendTransactCmd(IAbilityScheduler::SCHEDULE_NOTIFYCHANGE, data, reply, option);
897 if (result == ERR_NONE) {
898 TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}s SendRequest ok, retval: %{public}d", __func__, reply.ReadInt32());
899 return true;
900 } else {
901 TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s SendRequest error, result=%{public}d", __func__, result);
902 return false;
903 }
904 }
905
906 /**
907 * @brief Converts the given uri that refer to the Data ability into a normalized URI. A normalized URI can be used
908 * across devices, persisted, backed up, and restored. It can refer to the same item in the Data ability even if the
909 * context has changed. If you implement URI normalization for a Data ability, you must also implement
910 * denormalizeUri(ohos.utils.net.Uri) to enable URI denormalization. After this feature is enabled, URIs passed to
911 * any method that is called on the Data ability must require normalization verification and denormalization. The
912 * default implementation of this method returns null, indicating that this Data ability does not support URI
913 * normalization.
914 *
915 * @param uri Indicates the Uri object to normalize.
916 *
917 * @return Returns the normalized Uri object if the Data ability supports URI normalization; returns null otherwise.
918 */
NormalizeUri(const Uri & uri)919 Uri AbilitySchedulerProxy::NormalizeUri(const Uri &uri)
920 {
921 Uri urivalue("");
922
923 MessageParcel data;
924 MessageParcel reply;
925 MessageOption option;
926
927 if (!WriteInterfaceToken(data)) {
928 return urivalue;
929 }
930
931 if (!data.WriteParcelable(&uri)) {
932 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable uri");
933 return urivalue;
934 }
935
936 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_NORMALIZEURI, data, reply, option);
937 if (err != NO_ERROR) {
938 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
939 return Uri("");
940 }
941
942 std::unique_ptr<Uri> info(reply.ReadParcelable<Uri>());
943 if (!info) {
944 TAG_LOGE(AAFwkTag::ABILITYMGR, "readParcelable value null");
945 return Uri("");
946 }
947 return *info;
948 }
949
950 /**
951 * @brief Converts the given normalized uri generated by normalizeUri(ohos.utils.net.Uri) into a denormalized one.
952 * The default implementation of this method returns the original URI passed to it.
953 *
954 * @param uri uri Indicates the Uri object to denormalize.
955 *
956 * @return Returns the denormalized Uri object if the denormalization is successful; returns the original Uri passed
957 * to this method if there is nothing to do; returns null if the data identified by the original Uri cannot be found
958 * in the current environment.
959 */
DenormalizeUri(const Uri & uri)960 Uri AbilitySchedulerProxy::DenormalizeUri(const Uri &uri)
961 {
962 Uri urivalue("");
963
964 MessageParcel data;
965 MessageParcel reply;
966 MessageOption option;
967
968 if (!WriteInterfaceToken(data)) {
969 return urivalue;
970 }
971
972 if (!data.WriteParcelable(&uri)) {
973 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to WriteParcelable uri");
974 return urivalue;
975 }
976
977 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_DENORMALIZEURI, data, reply, option);
978 if (err != NO_ERROR) {
979 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
980 return Uri("");
981 }
982
983 std::unique_ptr<Uri> info(reply.ReadParcelable<Uri>());
984 if (!info) {
985 TAG_LOGE(AAFwkTag::ABILITYMGR, "readParcelable value null");
986 return Uri("");
987 }
988 return *info;
989 }
990
ExecuteBatch(const std::vector<std::shared_ptr<AppExecFwk::DataAbilityOperation>> & operations)991 std::vector<std::shared_ptr<AppExecFwk::DataAbilityResult>> AbilitySchedulerProxy::ExecuteBatch(
992 const std::vector<std::shared_ptr<AppExecFwk::DataAbilityOperation>> &operations)
993 {
994 TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
995 MessageParcel data;
996 MessageParcel reply;
997 MessageOption option;
998
999 std::vector<std::shared_ptr<AppExecFwk::DataAbilityResult>> results;
1000 results.clear();
1001
1002 if (!WriteInterfaceToken(data)) {
1003 TAG_LOGE(AAFwkTag::ABILITYMGR, "writer token failed");
1004 return results;
1005 }
1006
1007 int count = (int)operations.size();
1008 if (!data.WriteInt32(count)) {
1009 TAG_LOGE(AAFwkTag::ABILITYMGR, "writeInt32 ret failed");
1010 return results;
1011 }
1012
1013 for (int i = 0; i < count; i++) {
1014 if (!data.WriteParcelable(operations[i].get())) {
1015 TAG_LOGE(AAFwkTag::ABILITYMGR,
1016 "failed, index: %{public}d", i);
1017 return results;
1018 }
1019 }
1020
1021 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_EXECUTEBATCH, data, reply, option);
1022 if (err != NO_ERROR) {
1023 TAG_LOGE(AAFwkTag::ABILITYMGR, "sendRequest failed, err: %{public}d", err);
1024 return results;
1025 }
1026
1027 int total = 0;
1028 if (!reply.ReadInt32(total)) {
1029 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail to ReadInt32 count %{public}d", total);
1030 return results;
1031 }
1032
1033 for (int i = 0; i < total; i++) {
1034 std::shared_ptr<AppExecFwk::DataAbilityResult> dataAbilityResult(
1035 reply.ReadParcelable<AppExecFwk::DataAbilityResult>());
1036 if (dataAbilityResult == nullptr) {
1037 TAG_LOGE(AAFwkTag::ABILITYMGR,
1038 "null dataAbilityResult, index: %{public}d", i);
1039 return results;
1040 }
1041 results.push_back(dataAbilityResult);
1042 }
1043 TAG_LOGI(AAFwkTag::ABILITYMGR, "end %{public}d", total);
1044 return results;
1045 }
1046
ContinueAbility(const std::string & deviceId,uint32_t versionCode)1047 void AbilitySchedulerProxy::ContinueAbility(const std::string& deviceId, uint32_t versionCode)
1048 {
1049 MessageParcel data;
1050 MessageParcel reply;
1051 MessageOption option(MessageOption::TF_ASYNC);
1052 if (!WriteInterfaceToken(data)) {
1053 TAG_LOGE(AAFwkTag::ABILITYMGR, "ContinueAbility fail to write token");
1054 return;
1055 }
1056 if (!data.WriteString(deviceId)) {
1057 TAG_LOGE(AAFwkTag::ABILITYMGR, "ContinueAbility fail to write deviceId");
1058 return;
1059 }
1060 if (!data.WriteUint32(versionCode)) {
1061 TAG_LOGE(AAFwkTag::ABILITYMGR, "ContinueAbility fail to write versionCode");
1062 return;
1063 }
1064
1065 int32_t err = SendTransactCmd(IAbilityScheduler::CONTINUE_ABILITY, data, reply, option);
1066 if (err != NO_ERROR) {
1067 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
1068 }
1069 }
1070
NotifyContinuationResult(int32_t result)1071 void AbilitySchedulerProxy::NotifyContinuationResult(int32_t result)
1072 {
1073 MessageParcel data;
1074 MessageParcel reply;
1075 MessageOption option(MessageOption::TF_ASYNC);
1076 if (!WriteInterfaceToken(data)) {
1077 TAG_LOGE(AAFwkTag::ABILITYMGR, "NotifyContinuationResult fail to write token");
1078 return;
1079 }
1080 if (!data.WriteInt32(result)) {
1081 TAG_LOGE(AAFwkTag::ABILITYMGR, "NotifyContinuationResult fail to write result");
1082 return;
1083 }
1084
1085 int32_t err = SendTransactCmd(IAbilityScheduler::NOTIFY_CONTINUATION_RESULT, data, reply, option);
1086 if (err != NO_ERROR) {
1087 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
1088 }
1089 }
1090
DumpAbilityInfo(const std::vector<std::string> & params,std::vector<std::string> & info)1091 void AbilitySchedulerProxy::DumpAbilityInfo(const std::vector<std::string> ¶ms, std::vector<std::string> &info)
1092 {
1093 MessageParcel data;
1094 MessageParcel reply;
1095 MessageOption option(MessageOption::TF_ASYNC);
1096 if (!WriteInterfaceToken(data)) {
1097 TAG_LOGE(AAFwkTag::ABILITYMGR, "DumpAbilityRunner fail to write token");
1098 return;
1099 }
1100
1101 if (!data.WriteStringVector(params)) {
1102 TAG_LOGE(AAFwkTag::ABILITYMGR, "DumpAbilityRunner fail to write params");
1103 return;
1104 }
1105
1106 int32_t err = SendTransactCmd(IAbilityScheduler::DUMP_ABILITY_RUNNER_INNER, data, reply, option);
1107 if (err != NO_ERROR) {
1108 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
1109 }
1110 }
1111
CallRequest()1112 void AbilitySchedulerProxy::CallRequest()
1113 {
1114 TAG_LOGD(AAFwkTag::ABILITYMGR, "start");
1115
1116 MessageParcel data;
1117 MessageParcel reply;
1118 MessageOption option(MessageOption::TF_ASYNC);
1119
1120 if (!WriteInterfaceToken(data)) {
1121 return;
1122 }
1123
1124 int32_t err = SendTransactCmd(IAbilityScheduler::REQUEST_CALL_REMOTE, data, reply, option);
1125 if (err != NO_ERROR) {
1126 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
1127 return;
1128 }
1129
1130 TAG_LOGD(AAFwkTag::ABILITYMGR, "end");
1131 }
1132
OnExecuteIntent(const Want & want)1133 void AbilitySchedulerProxy::OnExecuteIntent(const Want &want)
1134 {
1135 TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
1136
1137 MessageParcel data;
1138 MessageParcel reply;
1139 MessageOption option(MessageOption::TF_ASYNC);
1140 AAFwk::ExtendMaxIpcCapacityForInnerWant(data);
1141 if (!WriteInterfaceToken(data)) {
1142 return;
1143 }
1144 data.WriteParcelable(&want);
1145 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_ONEXECUTE_INTENT, data, reply, option);
1146 if (err != NO_ERROR) {
1147 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
1148 }
1149
1150 TAG_LOGI(AAFwkTag::ABILITYMGR, "end");
1151 }
1152
CreateModalUIExtension(const Want & want)1153 int32_t AbilitySchedulerProxy::CreateModalUIExtension(const Want &want)
1154 {
1155 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1156 TAG_LOGD(AAFwkTag::ABILITYMGR, "AbilitySchedulerProxy::CreateModalUIExtension start");
1157 MessageParcel data;
1158 MessageParcel reply;
1159 MessageOption option(MessageOption::TF_ASYNC);
1160 AAFwk::ExtendMaxIpcCapacityForInnerWant(data);
1161 if (!WriteInterfaceToken(data)) {
1162 TAG_LOGE(AAFwkTag::ABILITYMGR, "Write interface fail");
1163 return INNER_ERR;
1164 }
1165 if (!data.WriteParcelable(&want)) {
1166 TAG_LOGE(AAFwkTag::ABILITYMGR, "Write wants fail");
1167 return INNER_ERR;
1168 }
1169 int32_t err = SendTransactCmd(IAbilityScheduler::CREATE_MODAL_UI_EXTENSION, data, reply, option);
1170 if (err != NO_ERROR) {
1171 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
1172 return err;
1173 }
1174 return reply.ReadInt32();
1175 }
1176
UpdateSessionToken(sptr<IRemoteObject> sessionToken)1177 void AbilitySchedulerProxy::UpdateSessionToken(sptr<IRemoteObject> sessionToken)
1178 {
1179 MessageParcel data;
1180 if (!WriteInterfaceToken(data)) {
1181 return;
1182 }
1183 if (!data.WriteRemoteObject(sessionToken)) {
1184 TAG_LOGE(AAFwkTag::ABILITYMGR, "write sessionToken failed");
1185 return;
1186 }
1187 MessageParcel reply;
1188 MessageOption option(MessageOption::TF_ASYNC);
1189 int32_t err = SendTransactCmd(IAbilityScheduler::UPDATE_SESSION_TOKEN, data, reply, option);
1190 if (err != NO_ERROR) {
1191 TAG_LOGE(AAFwkTag::ABILITYMGR, "sendRequest failed, err: %{public}d", err);
1192 }
1193 }
1194
SendTransactCmd(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)1195 int32_t AbilitySchedulerProxy::SendTransactCmd(uint32_t code, MessageParcel &data,
1196 MessageParcel &reply, MessageOption &option)
1197 {
1198 sptr<IRemoteObject> remote = Remote();
1199 if (remote == nullptr) {
1200 TAG_LOGE(AAFwkTag::ABILITYMGR, "null remote");
1201 return ERR_NULL_OBJECT;
1202 }
1203
1204 int32_t ret = remote->SendRequest(code, data, reply, option);
1205 if (ret != NO_ERROR) {
1206 TAG_LOGE(AAFwkTag::ABILITYMGR, "sendRequest failed, code: %{public}d, ret: %{public}d", code, ret);
1207 return ret;
1208 }
1209 return NO_ERROR;
1210 }
1211
ScheduleCollaborate(const Want & want)1212 void AbilitySchedulerProxy::ScheduleCollaborate(const Want &want)
1213 {
1214 MessageParcel data;
1215 MessageParcel reply;
1216 MessageOption option(MessageOption::TF_ASYNC);
1217 if (!WriteInterfaceToken(data)) {
1218 TAG_LOGE(AAFwkTag::ABILITYMGR, "write interface token failed");
1219 return;
1220 }
1221 auto msgKey = AbilityRuntime::ErrorMgsUtil::BuildErrorKey(reinterpret_cast<uintptr_t>(this),
1222 "ScheduleCollaborate");
1223 if (!data.WriteParcelable(&want)) {
1224 TAG_LOGE(AAFwkTag::ABILITYMGR, "write want failed");
1225 AbilityRuntime::ErrorMgsUtil::GetInstance().UpdateErrorMsg(msgKey, "write want failed");
1226 return;
1227 }
1228 int32_t err = SendTransactCmd(IAbilityScheduler::SCHEDULE_COLLABORATE_DATA, data, reply, option);
1229 if (err != NO_ERROR) {
1230 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail, err: %{public}d", err);
1231 }
1232 return;
1233 }
1234 } // namespace AAFwk
1235 } // namespace OHOS
1236