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 namespace OHOS {
18 namespace MiscServices {
19 using UnifiedRecord = UDMF::UnifiedRecord;
20 using UnifiedData = UDMF::UnifiedData;
21 using UnifiedDataProperties = UDMF::UnifiedDataProperties;
22 using UDType = UDMF::UDType;
23 using ShareOptions = UDMF::ShareOptions;
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 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr, PASTEBOARD_MODULE_CLIENT,
64 "paste record is nullptr");
65 std::shared_ptr<UnifiedRecord> udmfRecord = std::make_shared<UnifiedRecord>();
66 auto entries = Convert(record->GetEntries(), record);
67 for (auto &udmfEntry : *entries) {
68 udmfRecord->AddEntry(udmfEntry.first, std::move(udmfEntry.second));
69 }
70 udmfRecord->SetChannelName(CHANNEL_NAME);
71 udmfRecord->SetDataId(record->GetDataId());
72 udmfRecord->SetRecordId(record->GetRecordId());
73 return udmfRecord;
74 }
75
Convert(std::shared_ptr<UnifiedRecord> record)76 std::shared_ptr<PasteDataRecord> ConvertUtils::Convert(std::shared_ptr<UnifiedRecord> record)
77 {
78 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr, PASTEBOARD_MODULE_CLIENT,
79 "udmfRecord is nullptr");
80 std::shared_ptr<PasteDataRecord> pbRecord = std::make_shared<PasteDataRecord>();
81 auto utdId = record->GetUtdId();
82 pbRecord->AddEntry(utdId, std::make_shared<PasteDataEntry>(utdId, record->GetOriginValue()));
83 for (auto const &entry : Convert(record->GetEntries())) {
84 if (entry == nullptr) {
85 PASTEBOARD_HILOGW(PASTEBOARD_MODULE_CLIENT, "entry is empty");
86 continue;
87 }
88 if (utdId == entry->GetUtdId()) {
89 continue;
90 }
91 pbRecord->AddEntry(entry->GetUtdId(), entry);
92 }
93 pbRecord->SetDataId(record->GetDataId());
94 pbRecord->SetRecordId(record->GetRecordId());
95 if (record->GetEntryGetter() != nullptr) {
96 pbRecord->SetDelayRecordFlag(true);
97 }
98 return pbRecord;
99 }
100
Convert(const std::shared_ptr<std::map<std::string,UDMF::ValueType>> & entries)101 std::vector<std::shared_ptr<PasteDataEntry>> ConvertUtils::Convert(
102 const std::shared_ptr<std::map<std::string, UDMF::ValueType>> &entries)
103 {
104 std::vector<std::shared_ptr<PasteDataEntry>> pbEntries;
105 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(entries != nullptr, pbEntries, PASTEBOARD_MODULE_CLIENT,
106 "pbEntries is empty");
107 for (auto const &[utdId, value] : *entries) {
108 pbEntries.emplace_back(std::make_shared<PasteDataEntry>(utdId, value));
109 }
110 return pbEntries;
111 }
112
Convert(const std::shared_ptr<PasteDataEntry> & entry,std::shared_ptr<PasteDataRecord> record)113 UDMF::ValueType ConvertUtils::Convert(const std::shared_ptr<PasteDataEntry>& entry,
114 std::shared_ptr<PasteDataRecord> record)
115 {
116 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(entry != nullptr, nullptr, PASTEBOARD_MODULE_CLIENT,
117 "entry is null, convert failed.");
118 auto utdId = entry->GetUtdId();
119 auto value = entry->GetValue();
120 if (std::holds_alternative<std::monostate>(value) || std::holds_alternative<std::shared_ptr<Object>>(value)) {
121 if (std::holds_alternative<std::shared_ptr<Object>>(value) && CommonUtils::IsFileUri(utdId) &&
122 record->GetUriV0() != nullptr) {
123 auto object = std::get<std::shared_ptr<Object>>(value);
124 object->value_[UDMF::FILE_URI_PARAM] = record->GetUriV0()->ToString();
125 }
126 return value;
127 }
128 auto mimeType = entry->GetMimeType();
129 auto object = std::make_shared<UDMF::Object>();
130 if (mimeType == MIMETYPE_TEXT_PLAIN) {
131 object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId;
132 if (std::holds_alternative<std::string>(value)) {
133 object->value_[UDMF::CONTENT] = std::get<std::string>(value);
134 }
135 } else if (mimeType == MIMETYPE_TEXT_HTML) {
136 object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId;
137 if (std::holds_alternative<std::string>(value)) {
138 object->value_[UDMF::HTML_CONTENT] = std::get<std::string>(value);
139 }
140 } else if (mimeType == MIMETYPE_TEXT_URI) {
141 object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId;
142 if (std::holds_alternative<std::string>(value) && record->GetUriV0() != nullptr) {
143 object->value_[UDMF::FILE_URI_PARAM] = record->GetUriV0()->ToString();
144 }
145 } else if (mimeType == MIMETYPE_PIXELMAP) {
146 object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId;
147 if (std::holds_alternative<std::shared_ptr<OHOS::Media::PixelMap>>(value)) {
148 object->value_[UDMF::PIXEL_MAP] = std::get<std::shared_ptr<OHOS::Media::PixelMap>>(value);
149 }
150 } else if (mimeType == MIMETYPE_TEXT_WANT) {
151 PASTEBOARD_HILOGW(PASTEBOARD_MODULE_CLIENT, "mimeType is want, udmf not support");
152 } else {
153 object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId;
154 if (std::holds_alternative<std::vector<uint8_t>>(value)) {
155 auto arrayBuffer = std::get<std::vector<uint8_t>>(value);
156 object->value_[UDMF::ARRAY_BUFFER] = arrayBuffer;
157 object->value_[UDMF::ARRAY_BUFFER_LENGTH] = static_cast<int64_t>(arrayBuffer.size());
158 }
159 }
160 return object;
161 }
162
Convert(const std::vector<std::shared_ptr<PasteDataEntry>> & entries,std::shared_ptr<PasteDataRecord> record)163 std::shared_ptr<std::vector<std::pair<std::string, UDMF::ValueType>>> ConvertUtils::Convert(
164 const std::vector<std::shared_ptr<PasteDataEntry>> &entries, std::shared_ptr<PasteDataRecord> record)
165 {
166 std::map<std::string, UDMF::ValueType> udmfEntryMap;
167 std::vector<std::pair<std::string, UDMF::ValueType>> udmfEntries;
168 std::vector<std::string> entryUtdIds;
169 for (auto const &entry : entries) {
170 if (entry == nullptr) {
171 continue;
172 }
173 if (udmfEntryMap.find(entry->GetUtdId()) == udmfEntryMap.end()) {
174 entryUtdIds.emplace_back(entry->GetUtdId());
175 }
176 auto udmfEntry = Convert(entry, record);
177 if (std::holds_alternative<nullptr_t>(udmfEntry)) {
178 continue;
179 }
180 udmfEntryMap.insert_or_assign(entry->GetUtdId(), udmfEntry);
181 }
182 for (auto const &utdId : entryUtdIds) {
183 auto item = udmfEntryMap.find(utdId);
184 if (item != udmfEntryMap.end()) {
185 udmfEntries.emplace_back(std::pair<std::string, UDMF::ValueType>(item->first, item->second));
186 }
187 }
188 return std::make_shared<std::vector<std::pair<std::string, UDMF::ValueType>>>(udmfEntries);
189 }
190
UdmfOptions2PbOption(ShareOptions udmfOptions)191 ShareOption ConvertUtils::UdmfOptions2PbOption(ShareOptions udmfOptions)
192 {
193 ShareOption pbOption = CrossDevice;
194 switch (udmfOptions) {
195 case UDMF::IN_APP:
196 pbOption = InApp;
197 break;
198 case UDMF::CROSS_APP:
199 pbOption = LocalDevice;
200 break;
201 case UDMF::CROSS_DEVICE:
202 pbOption = CrossDevice;
203 break;
204 default:
205 break;
206 }
207 return pbOption;
208 }
209
PbOption2UdmfOptions(ShareOption pbOption)210 ShareOptions ConvertUtils::PbOption2UdmfOptions(ShareOption pbOption)
211 {
212 ShareOptions udmfOptions = UDMF::CROSS_DEVICE;
213 switch (pbOption) {
214 case InApp:
215 udmfOptions = UDMF::IN_APP;
216 break;
217 case LocalDevice:
218 udmfOptions = UDMF::CROSS_APP;
219 break;
220 case CrossDevice:
221 udmfOptions = UDMF::CROSS_DEVICE;
222 break;
223 default:
224 break;
225 }
226 return udmfOptions;
227 }
228
ConvertProperty(const std::shared_ptr<UnifiedDataProperties> & properties,const UnifiedData & unifiedData)229 PasteDataProperty ConvertUtils::ConvertProperty(
230 const std::shared_ptr<UnifiedDataProperties> &properties, const UnifiedData &unifiedData)
231 {
232 if (!properties) {
233 return {};
234 }
235 PasteDataProperty pasteDataProperty;
236 pasteDataProperty.shareOption = UdmfOptions2PbOption(properties->shareOptions);
237 pasteDataProperty.additions = properties->extras;
238 pasteDataProperty.timestamp = properties->timestamp;
239 pasteDataProperty.tag = properties->tag;
240 auto utdIds = unifiedData.GetTypesLabels();
241 pasteDataProperty.mimeTypes = Convert(utdIds);
242 pasteDataProperty.isRemote = properties->isRemote;
243 return PasteDataProperty(pasteDataProperty);
244 }
245
ConvertProperty(const PasteDataProperty & properties)246 std::shared_ptr<UnifiedDataProperties> ConvertUtils::ConvertProperty(const PasteDataProperty &properties)
247 {
248 auto unifiedDataProperties = std::make_shared<UnifiedDataProperties>();
249 unifiedDataProperties->shareOptions = PbOption2UdmfOptions(properties.shareOption);
250 unifiedDataProperties->extras = properties.additions;
251 unifiedDataProperties->timestamp = properties.timestamp;
252 unifiedDataProperties->tag = properties.tag;
253 unifiedDataProperties->isRemote = properties.isRemote;
254 return unifiedDataProperties;
255 }
256
Convert(const std::vector<std::string> & utdIds)257 std::vector<std::string> ConvertUtils::Convert(const std::vector<std::string> &utdIds)
258 {
259 std::vector<std::string> types;
260 for (const auto &utdId : utdIds) {
261 types.push_back(CommonUtils::Convert2MimeType(utdId));
262 }
263 return types;
264 }
265 } // namespace MiscServices
266 } // namespace OHOS