• 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 "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> &params, 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