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 #include "convert_utils.h"
16 #include "pasteboard_hilog.h"
17 #include "unified_meta.h"
18 namespace OHOS {
19 namespace MiscServices {
20 using UnifiedRecord = UDMF::UnifiedRecord;
21 using UnifiedData = UDMF::UnifiedData;
22 using UnifiedDataProperties = UDMF::UnifiedDataProperties;
23 using UDType = UDMF::UDType;
24
Convert(const UnifiedData &unifiedData)25 std::shared_ptr<PasteData> ConvertUtils::Convert(const UnifiedData &unifiedData)
26 {
27 auto pasteData = std::make_shared<PasteData>(Convert(unifiedData.GetRecords()));
28 pasteData->SetProperty(ConvertProperty(unifiedData.GetProperties(), unifiedData));
29 return pasteData;
30 }
31
Convert(const PasteData &pasteData)32 std::shared_ptr<UnifiedData> ConvertUtils::Convert(const PasteData &pasteData)
33 {
34 auto unifiedData = std::make_shared<UnifiedData>();
35 unifiedData->SetRecords(Convert(pasteData.AllRecords()));
36 unifiedData->SetProperties(ConvertProperty(pasteData.GetProperty()));
37 unifiedData->SetDataId(pasteData.GetDataId());
38 return unifiedData;
39 }
40
Convert( const std::vector<std::shared_ptr<PasteDataRecord>> &records)41 std::vector<std::shared_ptr<UnifiedRecord>> ConvertUtils::Convert(
42 const std::vector<std::shared_ptr<PasteDataRecord>> &records)
43 {
44 std::vector<std::shared_ptr<UnifiedRecord>> unifiedRecords;
45 for (auto const &record : records) {
46 unifiedRecords.emplace_back(Convert(record));
47 }
48 return unifiedRecords;
49 }
50
Convert( const std::vector<std::shared_ptr<UnifiedRecord>> &records)51 std::vector<std::shared_ptr<PasteDataRecord>> ConvertUtils::Convert(
52 const std::vector<std::shared_ptr<UnifiedRecord>> &records)
53 {
54 std::vector<std::shared_ptr<PasteDataRecord>> pasteboardRecords;
55 for (auto const &record : records) {
56 pasteboardRecords.emplace_back(Convert(record));
57 }
58 return pasteboardRecords;
59 }
60
Convert(std::shared_ptr<PasteDataRecord> record)61 std::shared_ptr<UnifiedRecord> ConvertUtils::Convert(std::shared_ptr<PasteDataRecord> record)
62 {
63 if (record == nullptr) {
64 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_CLIENT, "paste record is nullptr");
65 return nullptr;
66 }
67 std::shared_ptr<UnifiedRecord> udmfRecord = std::make_shared<UnifiedRecord>();
68 auto entries = Convert(record->GetEntries());
69 if (entries->empty()) {
70 PASTEBOARD_HILOGW(PASTEBOARD_MODULE_CLIENT, "entries is nullptr");
71 auto udmfValue = record->GetUDMFValue();
72 if (udmfValue) {
73 auto utdId = CommonUtils::Convert2UtdId(record->GetUDType(), record->GetMimeType());
74 udmfRecord->AddEntry(utdId, std::move(*udmfValue));
75 }
76 return udmfRecord;
77 }
78 for (auto &udmfEntry : *entries) {
79 udmfRecord->AddEntry(udmfEntry.first, std::move(udmfEntry.second));
80 }
81 udmfRecord->SetChannelName(CHANNEL_NAME);
82 udmfRecord->SetDataId(record->GetDataId());
83 udmfRecord->SetRecordId(record->GetRecordId());
84 return udmfRecord;
85 }
86
Convert(std::shared_ptr<UnifiedRecord> record)87 std::shared_ptr<PasteDataRecord> ConvertUtils::Convert(std::shared_ptr<UnifiedRecord> record)
88 {
89 if (record == nullptr) {
90 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_CLIENT, "udmfRecord is nullptr");
91 return nullptr;
92 }
93 std::shared_ptr<PasteDataRecord> pbRecord = std::make_shared<PasteDataRecord>();
94 auto utdId = record->GetUtdId();
95 pbRecord->AddEntry(utdId, std::make_shared<PasteDataEntry>(utdId, record->GetOriginValue()));
96 for (auto const &entry : Convert(record->GetEntries())) {
97 if (entry == nullptr) {
98 PASTEBOARD_HILOGW(PASTEBOARD_MODULE_CLIENT, "entry is empty");
99 continue;
100 }
101 if (utdId == entry->GetUtdId()) {
102 continue;
103 }
104 pbRecord->AddEntry(entry->GetUtdId(), entry);
105 }
106 pbRecord->SetDataId(record->GetDataId());
107 pbRecord->SetRecordId(record->GetRecordId());
108 if (record->GetEntryGetter() != nullptr) {
109 pbRecord->SetDelayRecordFlag(true);
110 }
111 return pbRecord;
112 }
113
Convert( const std::shared_ptr<std::map<std::string, UDMF::ValueType>> &entries)114 std::vector<std::shared_ptr<PasteDataEntry>> ConvertUtils::Convert(
115 const std::shared_ptr<std::map<std::string, UDMF::ValueType>> &entries)
116 {
117 std::vector<std::shared_ptr<PasteDataEntry>> pbEntries;
118 if (entries == nullptr) {
119 PASTEBOARD_HILOGW(PASTEBOARD_MODULE_CLIENT, "pbEntries is empty");
120 return pbEntries;
121 }
122 for (auto const &[utdId, value] : *entries) {
123 pbEntries.emplace_back(std::make_shared<PasteDataEntry>(utdId, value));
124 }
125 return pbEntries;
126 }
127
Convert( const std::vector<std::shared_ptr<PasteDataEntry>> &entries)128 std::shared_ptr<std::vector<std::pair<std::string, UDMF::ValueType>>> ConvertUtils::Convert(
129 const std::vector<std::shared_ptr<PasteDataEntry>> &entries)
130 {
131 std::map<std::string, UDMF::ValueType> udmfEntryMap;
132 std::vector<std::pair<std::string, UDMF::ValueType>> udmfEntries;
133 std::vector<std::string> entryUtdIds;
134 for (auto const &entry : entries) {
135 if (entry == nullptr) {
136 continue;
137 }
138 if (udmfEntryMap.find(entry->GetUtdId()) == udmfEntryMap.end()) {
139 entryUtdIds.emplace_back(entry->GetUtdId());
140 }
141 udmfEntryMap.insert_or_assign(entry->GetUtdId(), entry->GetValue());
142 }
143 for (auto const &utdId : entryUtdIds) {
144 auto item = udmfEntryMap.find(utdId);
145 if (item != udmfEntryMap.end()) {
146 udmfEntries.emplace_back(std::pair<std::string, UDMF::ValueType>(item->first, item->second));
147 }
148 }
149 return std::make_shared<std::vector<std::pair<std::string, UDMF::ValueType>>>(udmfEntries);
150 }
151
ConvertProperty( const std::shared_ptr<UnifiedDataProperties> &properties, const UnifiedData &unifiedData)152 PasteDataProperty ConvertUtils::ConvertProperty(
153 const std::shared_ptr<UnifiedDataProperties> &properties, const UnifiedData &unifiedData)
154 {
155 if (!properties) {
156 return {};
157 }
158 PasteDataProperty pasteDataProperty;
159 pasteDataProperty.shareOption = static_cast<ShareOption>(properties->shareOptions);
160 pasteDataProperty.additions = properties->extras;
161 pasteDataProperty.timestamp = properties->timestamp;
162 pasteDataProperty.tag = properties->tag;
163 auto utdIds = unifiedData.GetTypesLabels();
164 pasteDataProperty.mimeTypes = Convert(utdIds);
165 pasteDataProperty.isRemote = properties->isRemote;
166 return PasteDataProperty(pasteDataProperty);
167 }
168
ConvertProperty(const PasteDataProperty &properties)169 std::shared_ptr<UnifiedDataProperties> ConvertUtils::ConvertProperty(const PasteDataProperty &properties)
170 {
171 auto unifiedDataProperties = std::make_shared<UnifiedDataProperties>();
172 unifiedDataProperties->shareOptions = properties.shareOption == InApp ? UDMF::ShareOptions::IN_APP
173 : UDMF::ShareOptions::CROSS_APP;
174 unifiedDataProperties->extras = properties.additions;
175 unifiedDataProperties->timestamp = properties.timestamp;
176 unifiedDataProperties->tag = properties.tag;
177 unifiedDataProperties->isRemote = properties.isRemote;
178 return unifiedDataProperties;
179 }
180
Convert(const std::vector<std::string> &utdIds)181 std::vector<std::string> ConvertUtils::Convert(const std::vector<std::string> &utdIds)
182 {
183 std::vector<std::string> types;
184 for (const auto &utdId : utdIds) {
185 types.push_back(CommonUtils::Convert2MimeType(utdId));
186 }
187 return types;
188 }
189 } // namespace MiscServices
190 } // namespace OHOS