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 23 namespace OHOS { 24 namespace MiscServices { 25 using namespace OHOS::Security::PasteboardServ; PasteboardEntryGetterProxy(const sptr<IRemoteObject> & object)26 PasteboardEntryGetterProxy::PasteboardEntryGetterProxy(const sptr<IRemoteObject> &object) 27 : IRemoteProxy<IPasteboardEntryGetter>(object) 28 { 29 } 30 MakeRequest(uint32_t recordId,PasteDataEntry & value,MessageParcel & request)31 int32_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 GetRecordValueByType(uint32_t recordId,PasteDataEntry & value)57 int32_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