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