15ccb8f90Sopenharmony_ci/*
25ccb8f90Sopenharmony_ci * Copyright (C) 2022-2023 Huawei Device Co., Ltd.
35ccb8f90Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
45ccb8f90Sopenharmony_ci * you may not use this file except in compliance with the License.
55ccb8f90Sopenharmony_ci * You may obtain a copy of the License at
65ccb8f90Sopenharmony_ci *
75ccb8f90Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
85ccb8f90Sopenharmony_ci *
95ccb8f90Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
105ccb8f90Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
115ccb8f90Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
125ccb8f90Sopenharmony_ci * See the License for the specific language governing permissions and
135ccb8f90Sopenharmony_ci * limitations under the License.
145ccb8f90Sopenharmony_ci */
155ccb8f90Sopenharmony_ci
165ccb8f90Sopenharmony_ci#include "message_parcel.h"
175ccb8f90Sopenharmony_ci
185ccb8f90Sopenharmony_ci#include <sys/mman.h>
195ccb8f90Sopenharmony_ci#include <unistd.h>
205ccb8f90Sopenharmony_ci
215ccb8f90Sopenharmony_ci#include "iremote_object.h"
225ccb8f90Sopenharmony_ci
235ccb8f90Sopenharmony_cinamespace {
245ccb8f90Sopenharmony_cistatic std::u16string g_interfaceTokenName {};
255ccb8f90Sopenharmony_ci} // namespace
265ccb8f90Sopenharmony_ci
275ccb8f90Sopenharmony_cinamespace OHOS {
285ccb8f90Sopenharmony_ciMessageParcel::MessageParcel()
295ccb8f90Sopenharmony_ci    : Parcel(), writeRawDataFd_(-1), readRawDataFd_(-1),
305ccb8f90Sopenharmony_ci    kernelMappedWrite_(nullptr), kernelMappedRead_(nullptr),
315ccb8f90Sopenharmony_ci    rawData_(nullptr), rawDataSize_(0)
325ccb8f90Sopenharmony_ci{
335ccb8f90Sopenharmony_ci}
345ccb8f90Sopenharmony_ci
355ccb8f90Sopenharmony_ciMessageParcel::MessageParcel(Allocator* allocator)
365ccb8f90Sopenharmony_ci    : Parcel(allocator), writeRawDataFd_(-1), readRawDataFd_(-1),
375ccb8f90Sopenharmony_ci    kernelMappedWrite_(nullptr), kernelMappedRead_(nullptr),
385ccb8f90Sopenharmony_ci    rawData_(nullptr), rawDataSize_(0)
395ccb8f90Sopenharmony_ci{
405ccb8f90Sopenharmony_ci}
415ccb8f90Sopenharmony_ci
425ccb8f90Sopenharmony_ciMessageParcel::~MessageParcel()
435ccb8f90Sopenharmony_ci{
445ccb8f90Sopenharmony_ci    if (kernelMappedWrite_ != nullptr) {
455ccb8f90Sopenharmony_ci        ::munmap(kernelMappedWrite_, rawDataSize_);
465ccb8f90Sopenharmony_ci        kernelMappedWrite_ = nullptr;
475ccb8f90Sopenharmony_ci    }
485ccb8f90Sopenharmony_ci    if (kernelMappedRead_ != nullptr) {
495ccb8f90Sopenharmony_ci        ::munmap(kernelMappedRead_, rawDataSize_);
505ccb8f90Sopenharmony_ci        kernelMappedRead_ = nullptr;
515ccb8f90Sopenharmony_ci    }
525ccb8f90Sopenharmony_ci
535ccb8f90Sopenharmony_ci    if (readRawDataFd_ > 0) {
545ccb8f90Sopenharmony_ci        ::close(readRawDataFd_);
555ccb8f90Sopenharmony_ci        readRawDataFd_ = -1;
565ccb8f90Sopenharmony_ci    }
575ccb8f90Sopenharmony_ci    if (writeRawDataFd_ > 0) {
585ccb8f90Sopenharmony_ci        ::close(writeRawDataFd_);
595ccb8f90Sopenharmony_ci        writeRawDataFd_ = -1;
605ccb8f90Sopenharmony_ci    }
615ccb8f90Sopenharmony_ci
625ccb8f90Sopenharmony_ci    ClearFileDescriptor();
635ccb8f90Sopenharmony_ci
645ccb8f90Sopenharmony_ci    rawData_ = nullptr;
655ccb8f90Sopenharmony_ci    rawDataSize_ = 0;
665ccb8f90Sopenharmony_ci}
675ccb8f90Sopenharmony_ci
685ccb8f90Sopenharmony_ci#ifndef CONFIG_IPC_SINGLE
695ccb8f90Sopenharmony_cibool MessageParcel::WriteDBinderProxy(const sptr<IRemoteObject>& object, uint32_t handle, uint64_t stubIndex)
705ccb8f90Sopenharmony_ci{
715ccb8f90Sopenharmony_ci    (void)object;
725ccb8f90Sopenharmony_ci    (void)handle;
735ccb8f90Sopenharmony_ci    (void)stubIndex;
745ccb8f90Sopenharmony_ci    return false;
755ccb8f90Sopenharmony_ci}
765ccb8f90Sopenharmony_ci#endif
775ccb8f90Sopenharmony_ci
785ccb8f90Sopenharmony_cibool MessageParcel::WriteRemoteObject(const sptr<IRemoteObject>& object)
795ccb8f90Sopenharmony_ci{
805ccb8f90Sopenharmony_ci    (void)object;
815ccb8f90Sopenharmony_ci    return false;
825ccb8f90Sopenharmony_ci}
835ccb8f90Sopenharmony_ci
845ccb8f90Sopenharmony_cisptr<IRemoteObject> MessageParcel::ReadRemoteObject()
855ccb8f90Sopenharmony_ci{
865ccb8f90Sopenharmony_ci    return nullptr;
875ccb8f90Sopenharmony_ci}
885ccb8f90Sopenharmony_ci
895ccb8f90Sopenharmony_cibool MessageParcel::WriteFileDescriptor(int fd)
905ccb8f90Sopenharmony_ci{
915ccb8f90Sopenharmony_ci    (void)fd;
925ccb8f90Sopenharmony_ci    return false;
935ccb8f90Sopenharmony_ci}
945ccb8f90Sopenharmony_ci
955ccb8f90Sopenharmony_ciint MessageParcel::ReadFileDescriptor()
965ccb8f90Sopenharmony_ci{
975ccb8f90Sopenharmony_ci    return -1;
985ccb8f90Sopenharmony_ci}
995ccb8f90Sopenharmony_ci
1005ccb8f90Sopenharmony_civoid MessageParcel::ClearFileDescriptor() {}
1015ccb8f90Sopenharmony_ci
1025ccb8f90Sopenharmony_cibool MessageParcel::ContainFileDescriptors() const
1035ccb8f90Sopenharmony_ci{
1045ccb8f90Sopenharmony_ci    return false;
1055ccb8f90Sopenharmony_ci}
1065ccb8f90Sopenharmony_ci
1075ccb8f90Sopenharmony_cibool MessageParcel::WriteInterfaceToken(std::u16string name)
1085ccb8f90Sopenharmony_ci{
1095ccb8f90Sopenharmony_ci#ifdef MOCK_WRITE_INTERFACE_TOKEN_RETURN_TRUE
1105ccb8f90Sopenharmony_ci    g_interfaceTokenName = name;
1115ccb8f90Sopenharmony_ci    return true;
1125ccb8f90Sopenharmony_ci#else
1135ccb8f90Sopenharmony_ci    (void)name;
1145ccb8f90Sopenharmony_ci    return false;
1155ccb8f90Sopenharmony_ci#endif
1165ccb8f90Sopenharmony_ci}
1175ccb8f90Sopenharmony_ci
1185ccb8f90Sopenharmony_cistd::u16string MessageParcel::ReadInterfaceToken()
1195ccb8f90Sopenharmony_ci{
1205ccb8f90Sopenharmony_ci#ifdef MOCK_WRITE_INTERFACE_TOKEN_RETURN_TRUE
1215ccb8f90Sopenharmony_ci    return g_interfaceTokenName;
1225ccb8f90Sopenharmony_ci#else
1235ccb8f90Sopenharmony_ci    return ReadString16();
1245ccb8f90Sopenharmony_ci#endif
1255ccb8f90Sopenharmony_ci}
1265ccb8f90Sopenharmony_ci
1275ccb8f90Sopenharmony_cibool MessageParcel::WriteRawData(const void* data, size_t size)
1285ccb8f90Sopenharmony_ci{
1295ccb8f90Sopenharmony_ci    (void)data;
1305ccb8f90Sopenharmony_ci    (void)size;
1315ccb8f90Sopenharmony_ci    return false;
1325ccb8f90Sopenharmony_ci}
1335ccb8f90Sopenharmony_ci
1345ccb8f90Sopenharmony_cibool MessageParcel::RestoreRawData(std::shared_ptr<char> rawData, size_t size)
1355ccb8f90Sopenharmony_ci{
1365ccb8f90Sopenharmony_ci    (void)rawData;
1375ccb8f90Sopenharmony_ci    (void)size;
1385ccb8f90Sopenharmony_ci    return false;
1395ccb8f90Sopenharmony_ci}
1405ccb8f90Sopenharmony_ci
1415ccb8f90Sopenharmony_ciconst void* MessageParcel::ReadRawData(size_t size)
1425ccb8f90Sopenharmony_ci{
1435ccb8f90Sopenharmony_ci    (void)size;
1445ccb8f90Sopenharmony_ci    return nullptr;
1455ccb8f90Sopenharmony_ci}
1465ccb8f90Sopenharmony_ci
1475ccb8f90Sopenharmony_ciconst void* MessageParcel::GetRawData() const
1485ccb8f90Sopenharmony_ci{
1495ccb8f90Sopenharmony_ci    return nullptr;
1505ccb8f90Sopenharmony_ci}
1515ccb8f90Sopenharmony_ci
1525ccb8f90Sopenharmony_cisize_t MessageParcel::GetRawDataSize() const
1535ccb8f90Sopenharmony_ci{
1545ccb8f90Sopenharmony_ci    return rawDataSize_;
1555ccb8f90Sopenharmony_ci}
1565ccb8f90Sopenharmony_ci
1575ccb8f90Sopenharmony_cisize_t MessageParcel::GetRawDataCapacity() const
1585ccb8f90Sopenharmony_ci{
1595ccb8f90Sopenharmony_ci    return MAX_RAWDATA_SIZE;
1605ccb8f90Sopenharmony_ci}
1615ccb8f90Sopenharmony_ci
1625ccb8f90Sopenharmony_civoid MessageParcel::WriteNoException()
1635ccb8f90Sopenharmony_ci{
1645ccb8f90Sopenharmony_ci    WriteInt32(0);
1655ccb8f90Sopenharmony_ci}
1665ccb8f90Sopenharmony_ci
1675ccb8f90Sopenharmony_ciint32_t MessageParcel::ReadException()
1685ccb8f90Sopenharmony_ci{
1695ccb8f90Sopenharmony_ci    return ReadInt32();
1705ccb8f90Sopenharmony_ci}
1715ccb8f90Sopenharmony_ci
1725ccb8f90Sopenharmony_cibool MessageParcel::WriteAshmem(sptr<Ashmem> ashmem)
1735ccb8f90Sopenharmony_ci{
1745ccb8f90Sopenharmony_ci    (void)ashmem;
1755ccb8f90Sopenharmony_ci    return false;
1765ccb8f90Sopenharmony_ci}
1775ccb8f90Sopenharmony_ci
1785ccb8f90Sopenharmony_cisptr<Ashmem> MessageParcel::ReadAshmem()
1795ccb8f90Sopenharmony_ci{
1805ccb8f90Sopenharmony_ci    return nullptr;
1815ccb8f90Sopenharmony_ci}
1825ccb8f90Sopenharmony_ci
1835ccb8f90Sopenharmony_cibool MessageParcel::Append(MessageParcel& data)
1845ccb8f90Sopenharmony_ci{
1855ccb8f90Sopenharmony_ci    (void)data;
1865ccb8f90Sopenharmony_ci    return false;
1875ccb8f90Sopenharmony_ci}
1885ccb8f90Sopenharmony_ci} // namespace OHOS
189