1/*
2* Copyright (c) 2024 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 "message_option.h"
17#include "message_parcel.h"
18#include "pasteboard_entry_getter_proxy.h"
19#include "pasteboard_error.h"
20#include "pasteboard_hilog.h"
21#include "pasteboard_serv_ipc_interface_code.h"
22
23namespace OHOS {
24namespace MiscServices {
25using namespace OHOS::Security::PasteboardServ;
26PasteboardEntryGetterProxy::PasteboardEntryGetterProxy(const sptr<IRemoteObject> &object)
27    : IRemoteProxy<IPasteboardEntryGetter>(object)
28{
29}
30
31int32_t PasteboardEntryGetterProxy::MakeRequest(uint32_t recordId, PasteDataEntry &value, MessageParcel &request)
32{
33    if (!request.WriteInterfaceToken(GetDescriptor())) {
34        PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "write descriptor failed");
35        return static_cast<int32_t>(PasteboardError::SERIALIZATION_ERROR);
36    }
37    if (!request.WriteUint32(recordId)) {
38        PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "write recordId failed");
39        return static_cast<int32_t>(PasteboardError::SERIALIZATION_ERROR);
40    }
41    std::vector<uint8_t> sendEntryTLV(0);
42    if (!value.Marshalling(sendEntryTLV)) {
43        PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "marshall entry value failed");
44        return static_cast<int32_t>(PasteboardError::SERIALIZATION_ERROR);
45    }
46    if (!request.WriteInt32(sendEntryTLV.size())) {
47        PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "write entry tlv raw data size failed");
48        return static_cast<int32_t>(PasteboardError::SERIALIZATION_ERROR);
49    }
50    if (!request.WriteRawData(sendEntryTLV.data(), sendEntryTLV.size())) {
51        PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "write entry tlv raw data failed");
52        return static_cast<int32_t>(PasteboardError::SERIALIZATION_ERROR);
53    }
54    return static_cast<int32_t>(PasteboardError::E_OK);
55}
56
57int32_t PasteboardEntryGetterProxy::GetRecordValueByType(uint32_t recordId, PasteDataEntry &value)
58{
59    MessageParcel request;
60    auto res = MakeRequest(recordId, value, request);
61    if (res != static_cast<int32_t>(PasteboardError::E_OK)) {
62        return res;
63    }
64    MessageParcel reply;
65    MessageOption option;
66    int result = Remote()->SendRequest(
67        static_cast<int>(PasteboardEntryGetterInterfaceCode::GET_RECORD_VALUE_BY_TYPE), request, reply, option);
68    if (result != ERR_OK) {
69        PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "send request failed, error:%{public}d", result);
70        return result;
71    }
72    res = reply.ReadInt32();
73    int32_t rawDataSize = reply.ReadInt32();
74    if (rawDataSize <= 0) {
75        PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "read entry tlv raw data size failed");
76        return static_cast<int32_t>(PasteboardError::DESERIALIZATION_ERROR);
77    }
78    const uint8_t *rawData = reinterpret_cast<const uint8_t *>(reply.ReadRawData(rawDataSize));
79    if (rawData == nullptr) {
80        PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "read entry tlv raw data failed");
81        return static_cast<int32_t>(PasteboardError::DESERIALIZATION_ERROR);
82    }
83    std::vector<uint8_t> recvEntryTlv(rawData, rawData + rawDataSize);
84    PasteDataEntry entryValue;
85    if (!entryValue.Unmarshalling(recvEntryTlv)) {
86        PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "unmarshall entry value failed");
87        return static_cast<int32_t>(PasteboardError::DESERIALIZATION_ERROR);
88    }
89    value = entryValue;
90    return res;
91}
92} // namespace MiscServices
93} // namespace OHOS