/* * Copyright (C) 2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "convert_utils.h" #include "pasteboard_hilog.h" #include "unified_meta.h" namespace OHOS { namespace MiscServices { using UnifiedRecord = UDMF::UnifiedRecord; using UnifiedData = UDMF::UnifiedData; using UnifiedDataProperties = UDMF::UnifiedDataProperties; using UDType = UDMF::UDType; using ShareOptions = UDMF::ShareOptions; std::shared_ptr ConvertUtils::Convert(const UnifiedData& unifiedData) { auto pasteData = std::make_shared(Convert(unifiedData.GetRecords())); pasteData->SetProperty(ConvertProperty(unifiedData.GetProperties(), unifiedData)); return pasteData; } std::shared_ptr ConvertUtils::Convert(const PasteData& pasteData) { auto unifiedData = std::make_shared(); unifiedData->SetRecords(Convert(pasteData.AllRecords())); unifiedData->SetProperties(ConvertProperty(pasteData.GetProperty())); unifiedData->SetDataId(pasteData.GetDataId()); return unifiedData; } std::vector> ConvertUtils::Convert( const std::vector>& records) { std::vector> unifiedRecords; for (auto const& record : records) { unifiedRecords.emplace_back(Convert(record)); } return unifiedRecords; } std::vector> ConvertUtils::Convert( const std::vector>& records) { std::vector> pasteboardRecords; for (auto const& record : records) { pasteboardRecords.emplace_back(Convert(record)); } return pasteboardRecords; } std::shared_ptr ConvertUtils::Convert(std::shared_ptr record) { if (record == nullptr) { PASTEBOARD_HILOGE(PASTEBOARD_MODULE_CLIENT, "paste record is nullptr"); return nullptr; } std::shared_ptr udmfRecord = std::make_shared(); auto entries = Convert(record->GetEntries(), record); if (entries->empty()) { PASTEBOARD_HILOGW(PASTEBOARD_MODULE_CLIENT, "entries is nullptr"); auto udmfValue = record->GetUDMFValue(); if (udmfValue) { auto utdId = CommonUtils::Convert2UtdId(record->GetUDType(), record->GetMimeType()); udmfRecord->AddEntry(utdId, std::move(*udmfValue)); } return udmfRecord; } for (auto &udmfEntry : *entries) { udmfRecord->AddEntry(udmfEntry.first, std::move(udmfEntry.second)); } udmfRecord->SetChannelName(CHANNEL_NAME); udmfRecord->SetDataId(record->GetDataId()); udmfRecord->SetRecordId(record->GetRecordId()); return udmfRecord; } std::shared_ptr ConvertUtils::Convert(std::shared_ptr record) { if (record == nullptr) { PASTEBOARD_HILOGE(PASTEBOARD_MODULE_CLIENT, "udmfRecord is nullptr"); return nullptr; } std::shared_ptr pbRecord = std::make_shared(); auto utdId = record->GetUtdId(); pbRecord->AddEntry(utdId, std::make_shared(utdId, record->GetOriginValue())); for (auto const& entry : Convert(record->GetEntries())) { if (entry == nullptr) { PASTEBOARD_HILOGW(PASTEBOARD_MODULE_CLIENT, "entry is empty"); continue; } if (utdId == entry->GetUtdId()) { continue; } pbRecord->AddEntry(entry->GetUtdId(), entry); } pbRecord->SetDataId(record->GetDataId()); pbRecord->SetRecordId(record->GetRecordId()); if (record->GetEntryGetter() != nullptr) { pbRecord->SetDelayRecordFlag(true); } return pbRecord; } std::vector> ConvertUtils::Convert( const std::shared_ptr>& entries) { std::vector> pbEntries; if (entries == nullptr) { PASTEBOARD_HILOGW(PASTEBOARD_MODULE_CLIENT, "pbEntries is empty"); return pbEntries; } for (auto const& [utdId, value] : *entries) { pbEntries.emplace_back(std::make_shared(utdId, value)); } return pbEntries; } UDMF::ValueType ConvertUtils::Convert(const std::shared_ptr& entry, const std::shared_ptr &record) { if (entry == nullptr) { PASTEBOARD_HILOGE(PASTEBOARD_MODULE_CLIENT, "entry is null, convert failed."); return nullptr; } auto utdId = entry->GetUtdId(); auto value = entry->GetValue(); if (std::holds_alternative(value) || std::holds_alternative>(value)) { if (std::holds_alternative>(value) && CommonUtils::IsFileUri(utdId) && record->GetUri() != nullptr) { auto object = std::get>(value); object->value_[UDMF::FILE_URI_PARAM] = record->GetUri()->ToString(); } return value; } auto mimeType = entry->GetMimeType(); auto object = std::make_shared(); if (mimeType == MIMETYPE_TEXT_PLAIN) { object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId; if (std::holds_alternative(value)) { object->value_[UDMF::CONTENT] = std::get(value); } } else if (mimeType == MIMETYPE_TEXT_HTML) { object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId; if (std::holds_alternative(value)) { object->value_[UDMF::HTML_CONTENT] = std::get(value); } } else if (mimeType == MIMETYPE_TEXT_URI) { object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId; if (record->GetUri() != nullptr) { object->value_[UDMF::FILE_URI_PARAM] = record->GetUri()->ToString(); } else if (std::holds_alternative(value)) { object->value_[UDMF::FILE_URI_PARAM] = std::get(value); } } else if (mimeType == MIMETYPE_PIXELMAP) { object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId; if (std::holds_alternative>(value)) { object->value_[UDMF::PIXEL_MAP] = std::get>(value); } } else if (mimeType == MIMETYPE_TEXT_WANT) { PASTEBOARD_HILOGW(PASTEBOARD_MODULE_CLIENT, "mimeType is want, udmf not support"); } else { return value; } return object; } std::shared_ptr>> ConvertUtils::Convert( const std::vector> &entries, const std::shared_ptr &record) { std::map udmfEntryMap; std::vector> udmfEntries; std::vector entryUtdIds; for (auto const &entry : entries) { if (entry == nullptr) { continue; } if (udmfEntryMap.find(entry->GetUtdId()) == udmfEntryMap.end()) { entryUtdIds.emplace_back(entry->GetUtdId()); } udmfEntryMap.insert_or_assign(entry->GetUtdId(), Convert(entry, record)); } for (auto const &utdId : entryUtdIds) { auto item = udmfEntryMap.find(utdId); if (item != udmfEntryMap.end()) { udmfEntries.emplace_back(std::pair(item->first, item->second)); } } return std::make_shared>>(udmfEntries); } ShareOption ConvertUtils::UdmfOptions2PbOption(ShareOptions udmfOptions) { ShareOption pbOption = CrossDevice; switch (udmfOptions) { case UDMF::IN_APP: pbOption = InApp; break; case UDMF::CROSS_APP: pbOption = LocalDevice; break; case UDMF::CROSS_DEVICE: pbOption = CrossDevice; break; default: break; } return pbOption; } ShareOptions ConvertUtils::PbOption2UdmfOptions(ShareOption pbOption) { ShareOptions udmfOptions = UDMF::CROSS_DEVICE; switch (pbOption) { case InApp: udmfOptions = UDMF::IN_APP; break; case LocalDevice: udmfOptions = UDMF::CROSS_APP; break; case CrossDevice: udmfOptions = UDMF::CROSS_DEVICE; break; default: break; } return udmfOptions; } PasteDataProperty ConvertUtils::ConvertProperty(const std::shared_ptr& properties, const UnifiedData& unifiedData) { if (!properties) { return {}; } PasteDataProperty pasteDataProperty; pasteDataProperty.shareOption = UdmfOptions2PbOption(properties->shareOptions); pasteDataProperty.additions = properties->extras; pasteDataProperty.timestamp = properties->timestamp; pasteDataProperty.tag = properties->tag; auto utdIds = unifiedData.GetTypesLabels(); pasteDataProperty.mimeTypes = Convert(utdIds); pasteDataProperty.isRemote = properties->isRemote; return PasteDataProperty(pasteDataProperty); } std::shared_ptr ConvertUtils::ConvertProperty(const PasteDataProperty& properties) { auto unifiedDataProperties = std::make_shared(); unifiedDataProperties->shareOptions = PbOption2UdmfOptions(properties.shareOption); unifiedDataProperties->extras = properties.additions; unifiedDataProperties->timestamp = properties.timestamp; unifiedDataProperties->tag = properties.tag; unifiedDataProperties->isRemote = properties.isRemote; return unifiedDataProperties; } std::vector ConvertUtils::Convert(const std::vector& utdIds) { std::vector types; for (const auto& utdId : utdIds) { types.push_back(CommonUtils::Convert2MimeType(utdId)); } return types; } } // namespace MiscServices } // namespace OHOS