• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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