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