1 /*
2 * Copyright (c) 2023 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 "drag_data_packer.h"
17
18 #include "devicestatus_common.h"
19 #include "devicestatus_define.h"
20 #include "devicestatus_errors.h"
21
22 namespace OHOS {
23 namespace Msdp {
24 namespace {
25 constexpr OHOS::HiviewDFX::HiLogLabel LABEL { LOG_CORE, MSDP_DOMAIN_ID, "DragDataPacker" };
26 } // namespace
27
28 namespace DeviceStatus {
29
Marshalling(const DragData & dragData,Parcel & data,bool isCross)30 int32_t DragDataPacker::Marshalling(const DragData &dragData, Parcel &data, bool isCross)
31 {
32 CALL_DEBUG_ENTER;
33 if (ShadowPacker::Marshalling(dragData.shadowInfos, data, isCross) != RET_OK) {
34 FI_HILOGE("Marshalling shadowInfos failed");
35 return RET_ERR;
36 }
37 WRITEUINT8VECTOR(data, dragData.buffer, ERR_INVALID_VALUE);
38 WRITESTRING(data, dragData.udKey, ERR_INVALID_VALUE);
39 WRITESTRING(data, dragData.extraInfo, ERR_INVALID_VALUE);
40 WRITESTRING(data, dragData.filterInfo, ERR_INVALID_VALUE);
41 WRITEINT32(data, dragData.sourceType, ERR_INVALID_VALUE);
42 WRITEINT32(data, dragData.dragNum, ERR_INVALID_VALUE);
43 WRITEINT32(data, dragData.pointerId, ERR_INVALID_VALUE);
44 WRITEINT32(data, dragData.displayX, ERR_INVALID_VALUE);
45 WRITEINT32(data, dragData.displayY, ERR_INVALID_VALUE);
46 WRITEINT32(data, dragData.displayId, ERR_INVALID_VALUE);
47 WRITEBOOL(data, dragData.hasCanceledAnimation, ERR_INVALID_VALUE);
48 if (SummaryPacker::Marshalling(dragData.summarys, data) != RET_OK) {
49 FI_HILOGE("Marshalling summary failed");
50 return RET_ERR;
51 }
52 return RET_OK;
53 }
54
UnMarshalling(Parcel & data,DragData & dragData,bool isCross)55 int32_t DragDataPacker::UnMarshalling(Parcel &data, DragData &dragData, bool isCross)
56 {
57 CALL_DEBUG_ENTER;
58 if (ShadowPacker::UnMarshalling(data, dragData.shadowInfos, isCross) != RET_OK) {
59 FI_HILOGE("UnMarshalling shadowInfos failed");
60 return RET_ERR;
61 }
62 READUINT8VECTOR(data, dragData.buffer, E_DEVICESTATUS_READ_PARCEL_ERROR);
63 READSTRING(data, dragData.udKey, E_DEVICESTATUS_READ_PARCEL_ERROR);
64 READSTRING(data, dragData.extraInfo, E_DEVICESTATUS_READ_PARCEL_ERROR);
65 READSTRING(data, dragData.filterInfo, E_DEVICESTATUS_READ_PARCEL_ERROR);
66 READINT32(data, dragData.sourceType, E_DEVICESTATUS_READ_PARCEL_ERROR);
67 READINT32(data, dragData.dragNum, E_DEVICESTATUS_READ_PARCEL_ERROR);
68 READINT32(data, dragData.pointerId, E_DEVICESTATUS_READ_PARCEL_ERROR);
69 READINT32(data, dragData.displayX, E_DEVICESTATUS_READ_PARCEL_ERROR);
70 READINT32(data, dragData.displayY, E_DEVICESTATUS_READ_PARCEL_ERROR);
71 READINT32(data, dragData.displayId, E_DEVICESTATUS_READ_PARCEL_ERROR);
72 READBOOL(data, dragData.hasCanceledAnimation, E_DEVICESTATUS_READ_PARCEL_ERROR);
73 if (SummaryPacker::UnMarshalling(data, dragData.summarys) != RET_OK) {
74 FI_HILOGE("Unmarshalling summary failed");
75 return RET_ERR;
76 }
77 return RET_OK;
78 }
79
Marshalling(const std::vector<ShadowInfo> & shadowInfos,Parcel & data,bool isCross)80 int32_t ShadowPacker::Marshalling(const std::vector<ShadowInfo> &shadowInfos, Parcel &data, bool isCross)
81 {
82 CALL_DEBUG_ENTER;
83 if (shadowInfos.empty()) {
84 FI_HILOGE("Invalid parameter shadowInfos");
85 return ERR_INVALID_VALUE;
86 }
87 int32_t shadowNum = static_cast<int32_t>(shadowInfos.size());
88 if (shadowNum > SHADOW_NUM_LIMIT) {
89 FI_HILOGW("Only %{public}d shadowInfos allowed at most, now %{public}d", SHADOW_NUM_LIMIT, shadowNum);
90 shadowNum = SHADOW_NUM_LIMIT;
91 }
92 WRITEINT32(data, shadowNum, ERR_INVALID_VALUE);
93 for (int32_t i = 0; i < shadowNum; i++) {
94 if (PackUpShadowInfo(shadowInfos[i], data, isCross) != RET_OK) {
95 FI_HILOGE("PackUpShadowInfo No.%{public}d failed", i);
96 return RET_ERR;
97 }
98 }
99 return RET_OK;
100 }
101
UnMarshalling(Parcel & data,std::vector<ShadowInfo> & shadowInfos,bool isCross)102 int32_t ShadowPacker::UnMarshalling(Parcel &data, std::vector<ShadowInfo> &shadowInfos, bool isCross)
103 {
104 CALL_DEBUG_ENTER;
105 int32_t shadowNum { 0 };
106 READINT32(data, shadowNum, E_DEVICESTATUS_READ_PARCEL_ERROR);
107 if (shadowNum <= 0 || shadowNum > SHADOW_NUM_LIMIT) {
108 FI_HILOGE("Invalid shadowNum:%{public}d", shadowNum);
109 return RET_ERR;
110 }
111 for (int32_t i = 0; i < shadowNum; i++) {
112 ShadowInfo shadowInfo;
113 if (UnPackShadowInfo(data, shadowInfo, isCross) != RET_OK) {
114 FI_HILOGE("UnPackShadowInfo No.%{public}d failed", i);
115 return RET_ERR;
116 }
117 CHKPR(shadowInfo.pixelMap, RET_ERR);
118 shadowInfos.push_back(shadowInfo);
119 }
120 return RET_OK;
121 }
122
PackUpShadowInfo(const ShadowInfo & shadowInfo,Parcel & data,bool isCross)123 int32_t ShadowPacker::PackUpShadowInfo(const ShadowInfo &shadowInfo, Parcel &data, bool isCross)
124 {
125 CALL_DEBUG_ENTER;
126 CHKPR(shadowInfo.pixelMap, RET_ERR);
127 if (isCross) {
128 FI_HILOGD("By EncodeTlv");
129 std::vector<uint8_t> pixelBuffer;
130 if (!shadowInfo.pixelMap->EncodeTlv(pixelBuffer)) {
131 FI_HILOGE("EncodeTlv pixelMap failed");
132 return ERR_INVALID_VALUE;
133 }
134 WRITEUINT8VECTOR(data, pixelBuffer, ERR_INVALID_VALUE);
135 } else {
136 FI_HILOGD("By Marshalling");
137 if (!shadowInfo.pixelMap->Marshalling(data)) {
138 FI_HILOGE("Marshalling pixelMap failed");
139 return ERR_INVALID_VALUE;
140 }
141 }
142 WRITEINT32(data, shadowInfo.x, ERR_INVALID_VALUE);
143 WRITEINT32(data, shadowInfo.y, ERR_INVALID_VALUE);
144 return RET_OK;
145 }
146
UnPackShadowInfo(Parcel & data,ShadowInfo & shadowInfo,bool isCross)147 int32_t ShadowPacker::UnPackShadowInfo(Parcel &data, ShadowInfo &shadowInfo, bool isCross)
148 {
149 CALL_DEBUG_ENTER;
150 Media::PixelMap *rawPixelMap = nullptr;
151 if (isCross) {
152 FI_HILOGD("By DecodeTlv");
153 std::vector<uint8_t> pixelBuffer;
154 READUINT8VECTOR(data, pixelBuffer, ERR_INVALID_VALUE);
155 rawPixelMap = Media::PixelMap::DecodeTlv(pixelBuffer);
156 } else {
157 FI_HILOGD("By UnMarshalling");
158 rawPixelMap = OHOS::Media::PixelMap::Unmarshalling(data);
159 }
160 CHKPR(rawPixelMap, RET_ERR);
161 shadowInfo.pixelMap = std::shared_ptr<Media::PixelMap>(rawPixelMap);
162 CHKPR(shadowInfo.pixelMap, RET_ERR);
163 READINT32(data, shadowInfo.x, E_DEVICESTATUS_READ_PARCEL_ERROR);
164 READINT32(data, shadowInfo.y, E_DEVICESTATUS_READ_PARCEL_ERROR);
165 return RET_OK;
166 }
167
Marshalling(const SummaryMap & val,Parcel & parcel)168 int32_t SummaryPacker::Marshalling(const SummaryMap &val, Parcel &parcel)
169 {
170 WRITEINT32(parcel, static_cast<int32_t>(val.size()), ERR_INVALID_VALUE);
171 for (auto const &[k, v] : val) {
172 WRITESTRING(parcel, k, ERR_INVALID_VALUE);
173 WRITEINT64(parcel, v, ERR_INVALID_VALUE);
174 }
175 return RET_OK;
176 }
177
UnMarshalling(Parcel & parcel,SummaryMap & val)178 int32_t SummaryPacker::UnMarshalling(Parcel &parcel, SummaryMap &val)
179 {
180 size_t readAbleSize = parcel.GetReadableBytes();
181 int32_t size = 0;
182 READINT32(parcel, size, E_DEVICESTATUS_READ_PARCEL_ERROR);
183 if (size < 0 || (static_cast<size_t>(size) > readAbleSize) || static_cast<size_t>(size) > val.max_size()) {
184 FI_HILOGE("Invalid size:%{public}d", size);
185 return RET_ERR;
186 }
187 for (int32_t i = 0; i < size; ++i) {
188 std::string key;
189 READSTRING(parcel, key, E_DEVICESTATUS_READ_PARCEL_ERROR);
190 READINT64(parcel, val[key], E_DEVICESTATUS_READ_PARCEL_ERROR);
191 }
192 return RET_OK;
193 }
194 } // namespace DeviceStatus
195 } // namespace Msdp
196 } // namespace OHOS
197