1 /*
2 * Copyright (c) 2022-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 "parcel_util.h"
17 #include "pasteboard_hilog.h"
18
19 namespace OHOS::MiscServices {
Parcelable2Raw(const Parcelable * value)20 RawMem ParcelUtil::Parcelable2Raw(const Parcelable *value)
21 {
22 RawMem rawMem{};
23 if (value == nullptr) {
24 return rawMem;
25 }
26 rawMem.parcel = std::make_shared<Parcel>(nullptr);
27 bool ret = value->Marshalling(*rawMem.parcel);
28 if (!ret) {
29 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_CLIENT, "Marshalling failed.");
30 return rawMem;
31 }
32 rawMem.buffer = rawMem.parcel->GetData();
33 rawMem.bufferLen = rawMem.parcel->GetDataSize();
34 return rawMem;
35 }
Raw2Parcel(const RawMem & rawMem,Parcel & parcel)36 bool ParcelUtil::Raw2Parcel(const RawMem &rawMem, Parcel &parcel)
37 {
38 if (rawMem.buffer == 0 || rawMem.bufferLen == 0) {
39 return false;
40 }
41 auto *temp = malloc(rawMem.bufferLen); // free by Parcel!
42 if (temp == nullptr) {
43 return false;
44 }
45 auto err = memcpy_s(temp, rawMem.bufferLen, reinterpret_cast<const void *>(rawMem.buffer), rawMem.bufferLen);
46 if (err != EOK) {
47 free(temp);
48 return false;
49 }
50 bool ret = parcel.ParseFrom(reinterpret_cast<uintptr_t>(temp), rawMem.bufferLen);
51 if (!ret) {
52 free(temp);
53 return false;
54 }
55 return true;
56 }
57 } // namespace OHOS::MiscServices