1 /*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "mission/mission_info_converter.h"
17
18 #include "adapter/adapter_constant.h"
19 #include "dtbschedmgr_log.h"
20 #include "mission/mission_constant.h"
21 #include "parcel_helper.h"
22
23 using namespace std;
24 namespace OHOS {
25 namespace DistributedSchedule {
26 using namespace Constants::Adapter;
27 namespace {
28 const std::string TAG = "MissionInfoConverter";
29 }
ConvertToDstbMissionInfos(std::vector<AAFwk::MissionInfo> & missionInfoSet,std::vector<DstbMissionInfo> & dstbMissionInfoSet)30 int32_t MissionInfoConverter::ConvertToDstbMissionInfos(std::vector<AAFwk::MissionInfo>& missionInfoSet,
31 std::vector<DstbMissionInfo>& dstbMissionInfoSet)
32 {
33 if (missionInfoSet.empty()) {
34 return ERR_OK;
35 }
36 for (auto iter = missionInfoSet.begin(); iter != missionInfoSet.end(); iter++) {
37 DstbMissionInfo dstbMissionInfo;
38 dstbMissionInfo.id = iter->id;
39 dstbMissionInfo.runingState = iter->runningState;
40 dstbMissionInfo.lockedState = iter->lockedState;
41 dstbMissionInfo.label = iter->label;
42 dstbMissionInfo.iconPath = iter->iconPath;
43 shared_ptr<AAFwk::Want> spWant = make_shared<AAFwk::Want>(iter->want);
44 dstbMissionInfo.baseWant = spWant;
45 dstbMissionInfo.continuable = iter->continuable ? 1 : 0;
46 dstbMissionInfoSet.push_back(dstbMissionInfo);
47 }
48 return ERR_OK;
49 }
50
ConvertToMissionInfos(std::vector<DstbMissionInfo> & dstbMissionInfoSet,std::vector<AAFwk::MissionInfo> & missionInfoSet)51 int32_t MissionInfoConverter::ConvertToMissionInfos(std::vector<DstbMissionInfo>& dstbMissionInfoSet,
52 std::vector<AAFwk::MissionInfo>& missionInfoSet)
53 {
54 if (dstbMissionInfoSet.empty()) {
55 return ERR_OK;
56 }
57 for (auto iter = dstbMissionInfoSet.begin(); iter != dstbMissionInfoSet.end(); iter++) {
58 AAFwk::MissionInfo missionInfo;
59 missionInfo.id = iter->id;
60 missionInfo.runningState = iter->runingState;
61 missionInfo.lockedState = iter->lockedState;
62 missionInfo.label = iter->label;
63 missionInfo.iconPath = iter->iconPath;
64 missionInfo.want = *(iter->baseWant);
65 missionInfo.continuable = iter->continuable == 1;
66 missionInfoSet.push_back(missionInfo);
67 }
68 return ERR_OK;
69 }
70
ReadMissionInfosFromParcel(Parcel & parcel,std::vector<AAFwk::MissionInfo> & missionInfoSet)71 bool MissionInfoConverter::ReadMissionInfosFromParcel(Parcel& parcel,
72 std::vector<AAFwk::MissionInfo>& missionInfoSet)
73 {
74 int32_t empty = parcel.ReadInt32();
75 if (empty == VALUE_OBJECT) {
76 int32_t len = parcel.ReadInt32();
77 HILOGD("ReadMissionInfosFromParcel::readLength is:%{public}d", len);
78 if (len < 0) {
79 return false;
80 }
81 size_t size = static_cast<size_t>(len);
82 if ((size > parcel.GetReadableBytes()) || (size > Constants::Mission::GET_MAX_MISSIONS)) {
83 HILOGE("Failed to read MissionInfo vector, size = %{public}zu", size);
84 return false;
85 }
86 missionInfoSet.clear();
87 for (size_t i = 0; i < size; i++) {
88 AAFwk::MissionInfo *ptr = parcel.ReadParcelable<AAFwk::MissionInfo>();
89 if (ptr == nullptr) {
90 HILOGW("read MissionInfo failed");
91 return false;
92 }
93 missionInfoSet.emplace_back(*ptr);
94 delete ptr;
95 }
96 }
97
98 HILOGI("ReadMissionInfosFromParcel end. info size is:%{public}zu", missionInfoSet.size());
99 return true;
100 }
101
WriteMissionInfosToParcel(Parcel & parcel,const std::vector<AAFwk::MissionInfo> & missionInfoSet)102 bool MissionInfoConverter::WriteMissionInfosToParcel(Parcel& parcel,
103 const std::vector<AAFwk::MissionInfo>& missionInfoSet)
104 {
105 size_t size = missionInfoSet.size();
106 if (size == 0) {
107 PARCEL_WRITE_HELPER_RET(parcel, Int32, VALUE_NULL, false);
108 return true;
109 }
110
111 PARCEL_WRITE_HELPER_RET(parcel, Int32, VALUE_OBJECT, false);
112 PARCEL_WRITE_HELPER_RET(parcel, Int32, size, false);
113 for (auto& info : missionInfoSet) {
114 PARCEL_WRITE_HELPER_RET(parcel, Parcelable, &info, false);
115 }
116 return true;
117 }
118 } // namespace DistributedSchedule
119 } // namespace OHOS
120