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 "pasteboard_utils.h"
16
17 #include <unordered_set>
18 #include "application_defined_record.h"
19 #include "audio.h"
20 #include "folder.h"
21 #include "html.h"
22 #include "image.h"
23 #include "link.h"
24 #include "plain_text.h"
25 #include "pasteboard_hilog.h"
26 #include "system_defined_appitem.h"
27 #include "system_defined_form.h"
28 #include "system_defined_pixelmap.h"
29 #include "video.h"
30
31 namespace OHOS {
32 namespace MiscServices {
33 using UnifiedRecord = UDMF::UnifiedRecord;
34 using UnifiedData = UDMF::UnifiedData;
35 using UnifiedDataProperties = UDMF::UnifiedDataProperties;
36 using UDType = UDMF::UDType;
37 using ShareOptions = UDMF::ShareOptions;
38
InitDecodeMap()39 void PasteboardUtils::InitDecodeMap()
40 {
41 convert2URecordMap_ = {
42 { UDMF::TEXT, PasteRecord2Text },
43 { UDMF::PLAIN_TEXT, PasteRecord2PlaintText },
44 { UDMF::OPENHARMONY_WANT, PasteRecord2Want },
45 { UDMF::HTML, PasteRecord2Html },
46 { UDMF::HYPERLINK, PasteRecord2Link },
47 { UDMF::FILE, PasteRecord2File },
48 { UDMF::IMAGE, PasteRecord2Image },
49 { UDMF::VIDEO, PasteRecord2Video },
50 { UDMF::AUDIO, PasteRecord2Audio },
51 { UDMF::FOLDER, PasteRecord2Folder },
52 { UDMF::SYSTEM_DEFINED_PIXEL_MAP, PasteRecord2PixelMap },
53 { UDMF::SYSTEM_DEFINED_RECORD, PasteRecord2SystemDefined },
54 { UDMF::SYSTEM_DEFINED_FORM, PasteRecord2Form },
55 { UDMF::SYSTEM_DEFINED_APP_ITEM, PasteRecord2AppItem },
56 };
57
58 convert2PRecordMap_ = {
59 { UDMF::TEXT, Text2PasteRecord },
60 { UDMF::PLAIN_TEXT, PlainText2PasteRecord },
61 { UDMF::OPENHARMONY_WANT, Want2PasteRecord },
62 { UDMF::HTML, Html2PasteRecord },
63 { UDMF::HYPERLINK, Link2PasteRecord },
64 { UDMF::FILE, File2PasteRecord },
65 { UDMF::IMAGE, Image2PasteRecord },
66 { UDMF::VIDEO, Video2PasteRecord },
67 { UDMF::AUDIO, Audio2PasteRecord },
68 { UDMF::FOLDER, Folder2PasteRecord },
69 { UDMF::SYSTEM_DEFINED_PIXEL_MAP, PixelMap2PasteRecord },
70 { UDMF::SYSTEM_DEFINED_RECORD, SystemDefined2PasteRecord },
71 { UDMF::SYSTEM_DEFINED_FORM, Form2PasteRecord },
72 { UDMF::SYSTEM_DEFINED_APP_ITEM, AppItem2PasteRecord },
73 { UDMF::APPLICATION_DEFINED_RECORD, AppDefined2PasteRecord },
74 };
75 }
76
Convert(const UnifiedData & unifiedData)77 std::shared_ptr<PasteData> PasteboardUtils::Convert(const UnifiedData &unifiedData)
78 {
79 auto unifiedRecords = unifiedData.GetRecords();
80 auto pasteData = std::make_shared<PasteData>(Convert(unifiedRecords));
81 auto unifiedDataProperties = unifiedData.GetProperties();
82 auto properties = Convert(*unifiedDataProperties);
83 auto recordTypes = unifiedData.GetTypesLabels();
84 properties.mimeTypes = Convert(recordTypes);
85 pasteData->SetProperty(properties);
86 return pasteData;
87 }
88
Convert(const PasteData & pasteData)89 std::shared_ptr<UnifiedData> PasteboardUtils::Convert(const PasteData &pasteData)
90 {
91 auto unifiedData = std::make_shared<UnifiedData>();
92 for (std::size_t i = 0; i < pasteData.GetRecordCount(); ++i) {
93 auto pasteboardRecord = pasteData.GetRecordAt(i);
94 if (pasteboardRecord == nullptr) {
95 continue;
96 }
97 auto type = Convert(pasteboardRecord->GetUDType(), pasteboardRecord->GetMimeType());
98 auto it = convert2URecordMap_.find(type);
99 if (it == convert2URecordMap_.end()) {
100 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "not find type, go to customData");
101 unifiedData->AddRecords(Custom2AppDefined(pasteboardRecord));
102 } else {
103 unifiedData->AddRecord(it->second(pasteboardRecord));
104 }
105 }
106 auto pastedProp = pasteData.GetProperty();
107 auto unifiedProp = Convert(pastedProp);
108 unifiedData->SetProperties(unifiedProp);
109 return unifiedData;
110 }
111
Convert(const std::vector<std::shared_ptr<UnifiedRecord>> & records)112 std::vector<std::shared_ptr<PasteDataRecord>> PasteboardUtils::Convert(
113 const std::vector<std::shared_ptr<UnifiedRecord>> &records)
114 {
115 std::vector<std::shared_ptr<PasteDataRecord>> pasteboardRecords;
116 for (auto const &record : records) {
117 if (record == nullptr) {
118 continue;
119 }
120 auto type = record->GetType();
121 auto it = convert2PRecordMap_.find(type);
122 if (it == convert2PRecordMap_.end()) {
123 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "not find type, convert to AppDefinedRecord");
124 pasteboardRecords.push_back(AppDefined2PasteRecord(record));
125 } else {
126 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "find type, convert to pasteRecord, type:%{public}d", type);
127 pasteboardRecords.push_back(it->second(record));
128 }
129 }
130 return pasteboardRecords;
131 }
132
UdmfOptions2PbOption(ShareOptions udmfOptions)133 ShareOption PasteboardUtils::UdmfOptions2PbOption(ShareOptions udmfOptions)
134 {
135 ShareOption pbOption = CrossDevice;
136 switch (udmfOptions) {
137 case UDMF::IN_APP:
138 pbOption = InApp;
139 break;
140 case UDMF::CROSS_APP:
141 pbOption = LocalDevice;
142 break;
143 case UDMF::CROSS_DEVICE:
144 pbOption = CrossDevice;
145 break;
146 default:
147 break;
148 }
149 return pbOption;
150 }
151
PbOption2UdmfOptions(ShareOption pbOption)152 ShareOptions PasteboardUtils::PbOption2UdmfOptions(ShareOption pbOption)
153 {
154 ShareOptions udmfOptions = UDMF::CROSS_DEVICE;
155 switch (pbOption) {
156 case InApp:
157 udmfOptions = UDMF::IN_APP;
158 break;
159 case LocalDevice:
160 udmfOptions = UDMF::CROSS_APP;
161 break;
162 case CrossDevice:
163 udmfOptions = UDMF::CROSS_DEVICE;
164 break;
165 default:
166 break;
167 }
168 return udmfOptions;
169 }
170
Convert(const UnifiedDataProperties & properties)171 PasteDataProperty PasteboardUtils::Convert(const UnifiedDataProperties &properties)
172 {
173 PasteDataProperty pasteDataProperty;
174 pasteDataProperty.shareOption = UdmfOptions2PbOption(properties.shareOptions);
175 pasteDataProperty.additions = properties.extras;
176 pasteDataProperty.timestamp = properties.timestamp;
177 pasteDataProperty.tag = properties.tag;
178 pasteDataProperty.isRemote = properties.isRemote;
179 return PasteDataProperty(pasteDataProperty);
180 }
181
Convert(const PasteDataProperty & properties)182 std::shared_ptr<UnifiedDataProperties> PasteboardUtils::Convert(const PasteDataProperty &properties)
183 {
184 auto unifiedDataProperties = std::make_shared<UnifiedDataProperties>();
185 unifiedDataProperties->shareOptions = PbOption2UdmfOptions(properties.shareOption);
186 unifiedDataProperties->extras = properties.additions;
187 unifiedDataProperties->timestamp = properties.timestamp;
188 unifiedDataProperties->tag = properties.tag;
189 unifiedDataProperties->isRemote = properties.isRemote;
190 return unifiedDataProperties;
191 }
192
Convert(const std::vector<std::string> & utdIds)193 std::vector<std::string> PasteboardUtils::Convert(const std::vector<std::string> &utdIds)
194 {
195 std::vector<std::string> types;
196 for (const auto &utdId : utdIds) {
197 types.push_back(CommonUtils::Convert2MimeType(utdId));
198 }
199 return types;
200 }
201
Convert(UDType uDType)202 std::string PasteboardUtils::Convert(UDType uDType)
203 {
204 switch (uDType) {
205 case UDType::PLAIN_TEXT:
206 // fall-through
207 return MIMETYPE_TEXT_PLAIN;
208 // fall-through
209 case UDType::HTML:
210 return MIMETYPE_TEXT_HTML;
211 // fall-through
212 case UDType::FILE:
213 // fall-through
214 case UDType::IMAGE:
215 // fall-through
216 case UDType::VIDEO:
217 // fall-through
218 case UDType::AUDIO:
219 // fall-through
220 case UDType::FOLDER:
221 // fall-through
222 case UDType::FILE_URI:
223 return MIMETYPE_TEXT_URI;
224 // fall-through
225 case UDType::SYSTEM_DEFINED_PIXEL_MAP:
226 return MIMETYPE_PIXELMAP;
227 // fall-through
228 case UDType::OPENHARMONY_WANT:
229 return MIMETYPE_TEXT_WANT;
230 default:
231 return UDMF::UtdUtils::GetUtdIdFromUtdEnum(uDType);
232 }
233 }
234
Convert(int32_t uDType,const std::string & mimeType)235 UDType PasteboardUtils::Convert(int32_t uDType, const std::string &mimeType)
236 {
237 if (uDType != UDMF::UD_BUTT) {
238 return static_cast<UDType>(uDType);
239 }
240 if (mimeType == MIMETYPE_TEXT_URI) {
241 return UDMF::FILE;
242 }
243 if (mimeType == MIMETYPE_TEXT_PLAIN) {
244 return UDMF::PLAIN_TEXT;
245 }
246 if (mimeType == MIMETYPE_TEXT_HTML) {
247 return UDMF::HTML;
248 }
249 if (mimeType == MIMETYPE_TEXT_WANT) {
250 return UDMF::OPENHARMONY_WANT;
251 }
252 if (mimeType == MIMETYPE_PIXELMAP) {
253 return UDMF::SYSTEM_DEFINED_PIXEL_MAP;
254 }
255 auto type = UDMF::UtdUtils::GetUtdEnumFromUtdId(mimeType);
256 if (type != UDMF::UD_BUTT) {
257 return static_cast<UDType>(type);
258 }
259 return UDMF::UD_BUTT;
260 }
261
PlainText2PasteRecord(const std::shared_ptr<UnifiedRecord> record)262 std::shared_ptr<PasteDataRecord> PasteboardUtils::PlainText2PasteRecord(const std::shared_ptr<UnifiedRecord> record)
263 {
264 auto plainText = static_cast<UDMF::PlainText *>(record.get());
265 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(plainText != nullptr, nullptr,
266 PASTEBOARD_MODULE_CLIENT, "get PLAIN_TEXT record failed.");
267 auto pbRecord = std::make_shared<PasteDataRecord>();
268 auto utdId = UDMF::UtdUtils::GetUtdIdFromUtdEnum(UDType::PLAIN_TEXT);
269 auto value = record->GetOriginValue();
270 if (std::holds_alternative<std::shared_ptr<Object>>(value)) {
271 pbRecord->AddEntry(utdId, std::make_shared<PasteDataEntry>(utdId, value));
272 return pbRecord;
273 }
274 auto object = std::make_shared<Object>();
275 object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId;
276 object->value_[UDMF::CONTENT] = plainText->GetContent();
277 object->value_[UDMF::ABSTRACT] = plainText->GetAbstract();
278 pbRecord->AddEntry(utdId, std::make_shared<PasteDataEntry>(utdId, object));
279 pbRecord->SetDetails(plainText->GetDetails());
280 return pbRecord;
281 }
282
PasteRecord2PlaintText(const std::shared_ptr<PasteDataRecord> record)283 std::shared_ptr<UnifiedRecord> PasteboardUtils::PasteRecord2PlaintText(const std::shared_ptr<PasteDataRecord> record)
284 {
285 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr,
286 PASTEBOARD_MODULE_CLIENT, "plain text record is null.");
287 auto udmfValue = record->GetUDMFValue();
288 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(udmfValue != nullptr, nullptr,
289 PASTEBOARD_MODULE_CLIENT, "udmfvalue is null.");
290 auto plainText = std::make_shared<UDMF::PlainText>(UDMF::PLAIN_TEXT, *udmfValue);
291 if (record->GetDetails()) {
292 plainText->SetDetails(*record->GetDetails());
293 }
294 return plainText;
295 }
296
Want2PasteRecord(const std::shared_ptr<UnifiedRecord> record)297 std::shared_ptr<PasteDataRecord> PasteboardUtils::Want2PasteRecord(const std::shared_ptr<UnifiedRecord> record)
298 {
299 auto want = static_cast<UDMF::UnifiedRecord *>(record.get());
300 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(want != nullptr, nullptr,
301 PASTEBOARD_MODULE_CLIENT, "get want record failed.");
302 auto recordValue = want->GetValue();
303 auto wantValue = std::get_if<std::shared_ptr<OHOS::AAFwk::Want>>(&recordValue);
304 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(wantValue != nullptr, nullptr,
305 PASTEBOARD_MODULE_CLIENT, "get want from unified record failed.");
306 auto wantRecord = PasteDataRecord::NewWantRecord(*(wantValue));
307 wantRecord->SetUDType(UDMF::OPENHARMONY_WANT);
308 return wantRecord;
309 }
310
PasteRecord2Want(const std::shared_ptr<PasteDataRecord> record)311 std::shared_ptr<UnifiedRecord> PasteboardUtils::PasteRecord2Want(const std::shared_ptr<PasteDataRecord> record)
312 {
313 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr,
314 PASTEBOARD_MODULE_CLIENT, "record2 want record is null.");
315 auto wantRecord = record->GetWant();
316 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(wantRecord != nullptr, nullptr,
317 PASTEBOARD_MODULE_CLIENT, "get want from paste record failed.");
318 return std::make_shared<UDMF::UnifiedRecord>(UDMF::OPENHARMONY_WANT, wantRecord);
319 }
320
Html2PasteRecord(const std::shared_ptr<UnifiedRecord> record)321 std::shared_ptr<PasteDataRecord> PasteboardUtils::Html2PasteRecord(const std::shared_ptr<UnifiedRecord> record)
322 {
323 auto html = static_cast<UDMF::Html *>(record.get());
324 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(html != nullptr, nullptr,
325 PASTEBOARD_MODULE_CLIENT, "get HTML record failed.");
326 auto pbRecord = std::make_shared<PasteDataRecord>();
327 auto utdId = UDMF::UtdUtils::GetUtdIdFromUtdEnum(UDType::HTML);
328 auto value = record->GetOriginValue();
329 if (std::holds_alternative<std::shared_ptr<Object>>(value)) {
330 pbRecord->AddEntry(utdId, std::make_shared<PasteDataEntry>(utdId, value));
331 return pbRecord;
332 }
333 auto object = std::make_shared<Object>();
334 object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId;
335 object->value_[UDMF::HTML_CONTENT] = html->GetHtmlContent();
336 object->value_[UDMF::PLAIN_CONTENT] = html->GetPlainContent();
337 pbRecord->AddEntry(utdId, std::make_shared<PasteDataEntry>(utdId, object));
338 pbRecord->SetDetails(html->GetDetails());
339 return pbRecord;
340 }
341
PasteRecord2Html(const std::shared_ptr<PasteDataRecord> record)342 std::shared_ptr<UnifiedRecord> PasteboardUtils::PasteRecord2Html(const std::shared_ptr<PasteDataRecord> record)
343 {
344 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr,
345 PASTEBOARD_MODULE_CLIENT, "record2 html record is null.");
346 auto udmfValue = record->GetUDMFValue();
347 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(udmfValue != nullptr, nullptr,
348 PASTEBOARD_MODULE_CLIENT, "udmfvalue is null.");
349 auto html = std::make_shared<UDMF::Html>(UDMF::HTML, *udmfValue);
350 if (record->GetDetails()) {
351 html->SetDetails(*record->GetDetails());
352 }
353 return html;
354 }
355
Link2PasteRecord(const std::shared_ptr<UnifiedRecord> record)356 std::shared_ptr<PasteDataRecord> PasteboardUtils::Link2PasteRecord(const std::shared_ptr<UnifiedRecord> record)
357 {
358 auto link = static_cast<UDMF::Link *>(record.get());
359 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(link != nullptr, nullptr,
360 PASTEBOARD_MODULE_CLIENT, "get Link record failed.");
361 auto pbRecord = std::make_shared<PasteDataRecord>();
362 auto utdId = UDMF::UtdUtils::GetUtdIdFromUtdEnum(UDType::HYPERLINK);
363 auto value = record->GetOriginValue();
364 if (std::holds_alternative<std::shared_ptr<Object>>(value)) {
365 pbRecord->AddEntry(utdId, std::make_shared<PasteDataEntry>(utdId, value));
366 return pbRecord;
367 }
368 auto object = std::make_shared<Object>();
369 object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId;
370 object->value_[UDMF::URL] = link->GetUrl();
371 object->value_[UDMF::DESCRIPTION] = link->GetDescription();
372 pbRecord->AddEntry(utdId, std::make_shared<PasteDataEntry>(utdId, object));
373 pbRecord->SetDetails(link->GetDetails());
374 return pbRecord;
375 }
376
PasteRecord2Link(const std::shared_ptr<PasteDataRecord> record)377 std::shared_ptr<UnifiedRecord> PasteboardUtils::PasteRecord2Link(const std::shared_ptr<PasteDataRecord> record)
378 {
379 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr,
380 PASTEBOARD_MODULE_CLIENT, "record2 link record is null.");
381 auto udmfValue = record->GetUDMFValue();
382 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(udmfValue != nullptr, nullptr,
383 PASTEBOARD_MODULE_CLIENT, "udmfvalue is null.");
384 auto link = std::make_shared<UDMF::Link>(UDMF::HYPERLINK, *udmfValue);
385 if (record->GetDetails()) {
386 link->SetDetails(*record->GetDetails());
387 }
388 return link;
389 }
390
File2PasteRecord(const std::shared_ptr<UnifiedRecord> record)391 std::shared_ptr<PasteDataRecord> PasteboardUtils::File2PasteRecord(const std::shared_ptr<UnifiedRecord> record)
392 {
393 auto file = static_cast<UDMF::File *>(record.get());
394 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(file != nullptr, nullptr,
395 PASTEBOARD_MODULE_CLIENT, "get file record failed.");
396 auto uriRecord = PasteDataRecord::NewUriRecord(OHOS::Uri(file->GetUri()));
397 uriRecord->SetDetails(file->GetDetails());
398 uriRecord->SetUDType(UDMF::FILE);
399 return uriRecord;
400 }
401
PasteRecord2File(const std::shared_ptr<PasteDataRecord> record)402 std::shared_ptr<UnifiedRecord> PasteboardUtils::PasteRecord2File(const std::shared_ptr<PasteDataRecord> record)
403 {
404 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr,
405 PASTEBOARD_MODULE_CLIENT, "record2 file record is null.");
406 auto uri = record->GetUri();
407 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(uri != nullptr, nullptr,
408 PASTEBOARD_MODULE_CLIENT, "get uri from paste record to file failed.");
409 auto unifiedRecord = std::make_shared<UDMF::File>(uri->ToString());
410 auto details = record->GetDetails();
411 if (details != nullptr) {
412 unifiedRecord->SetDetails(*details);
413 }
414 return unifiedRecord;
415 }
416
Image2PasteRecord(const std::shared_ptr<UnifiedRecord> record)417 std::shared_ptr<PasteDataRecord> PasteboardUtils::Image2PasteRecord(const std::shared_ptr<UnifiedRecord> record)
418 {
419 auto image = static_cast<UDMF::Image *>(record.get());
420 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(image != nullptr, nullptr,
421 PASTEBOARD_MODULE_CLIENT, "get image record failed.");
422 auto uriRecord = PasteDataRecord::NewUriRecord(OHOS::Uri(image->GetUri()));
423 uriRecord->SetDetails(image->GetDetails());
424 uriRecord->SetUDType(UDMF::IMAGE);
425 return uriRecord;
426 }
427
PasteRecord2Image(const std::shared_ptr<PasteDataRecord> record)428 std::shared_ptr<UnifiedRecord> PasteboardUtils::PasteRecord2Image(const std::shared_ptr<PasteDataRecord> record)
429 {
430 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr,
431 PASTEBOARD_MODULE_CLIENT, "record2 iamge record is null.");
432 auto uri = record->GetUri();
433 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(uri != nullptr, nullptr,
434 PASTEBOARD_MODULE_CLIENT, "get uri from paste record to image failed.");
435 auto unifiedRecord = std::make_shared<UDMF::Image>(uri->ToString());
436 auto details = record->GetDetails();
437 if (details != nullptr) {
438 unifiedRecord->SetDetails(*details);
439 }
440 return unifiedRecord;
441 }
442
Video2PasteRecord(const std::shared_ptr<UnifiedRecord> record)443 std::shared_ptr<PasteDataRecord> PasteboardUtils::Video2PasteRecord(const std::shared_ptr<UnifiedRecord> record)
444 {
445 auto video = static_cast<UDMF::Video *>(record.get());
446 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(video != nullptr, nullptr,
447 PASTEBOARD_MODULE_CLIENT, "get video record failed.");
448 auto uriRecord = PasteDataRecord::NewUriRecord(OHOS::Uri(video->GetUri()));
449 uriRecord->SetDetails(video->GetDetails());
450 uriRecord->SetUDType(UDMF::VIDEO);
451 return uriRecord;
452 }
453
PasteRecord2Video(const std::shared_ptr<PasteDataRecord> record)454 std::shared_ptr<UnifiedRecord> PasteboardUtils::PasteRecord2Video(const std::shared_ptr<PasteDataRecord> record)
455 {
456 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr,
457 PASTEBOARD_MODULE_CLIENT, "record2 video record is null.");
458 auto uri = record->GetUri();
459 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(uri != nullptr, nullptr,
460 PASTEBOARD_MODULE_CLIENT, "get uri from paste record to video failed.");
461 auto unifiedRecord = std::make_shared<UDMF::Video>(uri->ToString());
462 auto details = record->GetDetails();
463 if (details != nullptr) {
464 unifiedRecord->SetDetails(*details);
465 }
466 return unifiedRecord;
467 }
468
Audio2PasteRecord(const std::shared_ptr<UnifiedRecord> record)469 std::shared_ptr<PasteDataRecord> PasteboardUtils::Audio2PasteRecord(const std::shared_ptr<UnifiedRecord> record)
470 {
471 auto audio = static_cast<UDMF::Audio *>(record.get());
472 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(audio != nullptr, nullptr,
473 PASTEBOARD_MODULE_CLIENT, "get audio record failed.");
474 auto uriRecord = PasteDataRecord::NewUriRecord(OHOS::Uri(audio->GetUri()));
475 uriRecord->SetDetails(audio->GetDetails());
476 uriRecord->SetUDType(UDMF::AUDIO);
477 return uriRecord;
478 }
479
PasteRecord2Audio(const std::shared_ptr<PasteDataRecord> record)480 std::shared_ptr<UnifiedRecord> PasteboardUtils::PasteRecord2Audio(const std::shared_ptr<PasteDataRecord> record)
481 {
482 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr,
483 PASTEBOARD_MODULE_CLIENT, "record2 audio record is null.");
484 auto uri = record->GetUri();
485 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(uri != nullptr, nullptr,
486 PASTEBOARD_MODULE_CLIENT, "get uri from paste record to audio failed.");
487 auto unifiedRecord = std::make_shared<UDMF::Audio>(uri->ToString());
488 auto details = record->GetDetails();
489 if (details != nullptr) {
490 unifiedRecord->SetDetails(*details);
491 }
492 return unifiedRecord;
493 }
494
Folder2PasteRecord(const std::shared_ptr<UnifiedRecord> record)495 std::shared_ptr<PasteDataRecord> PasteboardUtils::Folder2PasteRecord(const std::shared_ptr<UnifiedRecord> record)
496 {
497 auto folder = static_cast<UDMF::Folder *>(record.get());
498 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(folder != nullptr, nullptr,
499 PASTEBOARD_MODULE_CLIENT, "get folder record failed.");
500 auto uriRecord = PasteDataRecord::NewUriRecord(OHOS::Uri(folder->GetUri()));
501 uriRecord->SetDetails(folder->GetDetails());
502 uriRecord->SetUDType(UDMF::FOLDER);
503 return uriRecord;
504 }
505
PasteRecord2Folder(const std::shared_ptr<PasteDataRecord> record)506 std::shared_ptr<UnifiedRecord> PasteboardUtils::PasteRecord2Folder(const std::shared_ptr<PasteDataRecord> record)
507 {
508 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr,
509 PASTEBOARD_MODULE_CLIENT, "record2 folder record is null.");
510 auto uri = record->GetUri();
511 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(uri != nullptr, nullptr,
512 PASTEBOARD_MODULE_CLIENT, "get uri from paste record to folder failed.");
513 auto unifiedRecord = std::make_shared<UDMF::Folder>(uri->ToString());
514 auto details = record->GetDetails();
515 if (details != nullptr) {
516 unifiedRecord->SetDetails(*details);
517 }
518 return unifiedRecord;
519 }
520
PixelMap2PasteRecord(const std::shared_ptr<UnifiedRecord> record)521 std::shared_ptr<PasteDataRecord> PasteboardUtils::PixelMap2PasteRecord(const std::shared_ptr<UnifiedRecord> record)
522 {
523 auto pixelMap = static_cast<UDMF::SystemDefinedPixelMap *>(record.get());
524 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(pixelMap != nullptr, nullptr,
525 PASTEBOARD_MODULE_CLIENT, "get pixelMap record failed.");
526 auto recordValue = pixelMap->GetValue();
527 auto pixelMapValue = std::get_if<std::shared_ptr<Media::PixelMap>>(&recordValue);
528 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(pixelMapValue != nullptr, nullptr,
529 PASTEBOARD_MODULE_CLIENT, "get pixelMap from unified record failed.");
530 auto pixelMapRecord = PasteDataRecord::NewPixelMapRecord(*(pixelMapValue));
531 pixelMapRecord->SetUDType(UDMF::SYSTEM_DEFINED_PIXEL_MAP);
532 return pixelMapRecord;
533 }
534
PasteRecord2PixelMap(const std::shared_ptr<PasteDataRecord> record)535 std::shared_ptr<UnifiedRecord> PasteboardUtils::PasteRecord2PixelMap(const std::shared_ptr<PasteDataRecord> record)
536 {
537 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr,
538 PASTEBOARD_MODULE_CLIENT, "pixel map record is null.");
539 auto pixelMapRecord = record->GetPixelMap();
540 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(pixelMapRecord != nullptr, nullptr,
541 PASTEBOARD_MODULE_CLIENT, "get pixelMap from paste record failed.");
542 return std::make_shared<UDMF::UnifiedRecord>(UDMF::SYSTEM_DEFINED_PIXEL_MAP, pixelMapRecord);
543 }
544
AppItem2PasteRecord(const std::shared_ptr<UnifiedRecord> record)545 std::shared_ptr<PasteDataRecord> PasteboardUtils::AppItem2PasteRecord(const std::shared_ptr<UnifiedRecord> record)
546 {
547 auto appItem = static_cast<UDMF::SystemDefinedAppItem *>(record.get());
548 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(appItem != nullptr, nullptr,
549 PASTEBOARD_MODULE_CLIENT, "get SystemDefined record failed.");
550 auto pbRecord = std::make_shared<PasteDataRecord>();
551 auto utdId = UDMF::UtdUtils::GetUtdIdFromUtdEnum(UDType::SYSTEM_DEFINED_APP_ITEM);
552 auto value = record->GetOriginValue();
553 if (std::holds_alternative<std::shared_ptr<Object>>(value)) {
554 pbRecord->AddEntry(utdId, std::make_shared<PasteDataEntry>(utdId, value));
555 return pbRecord;
556 }
557 auto object = std::make_shared<Object>();
558 object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId;
559 object->value_[UDMF::APP_ID] = appItem->GetAppId();
560 object->value_[UDMF::APP_NAME] = appItem->GetAppName();
561 object->value_[UDMF::APP_ICON_ID] = appItem->GetAppIconId();
562 object->value_[UDMF::APP_LABEL_ID] = appItem->GetAppLabelId();
563 object->value_[UDMF::BUNDLE_NAME] = appItem->GetBundleName();
564 object->value_[UDMF::ABILITY_NAME] = appItem->GetAbilityName();
565 pbRecord->AddEntry(utdId, std::make_shared<PasteDataEntry>(utdId, object));
566 pbRecord->SetDetails(appItem->GetDetails());
567 return pbRecord;
568 }
569
PasteRecord2AppItem(const std::shared_ptr<PasteDataRecord> record)570 std::shared_ptr<UnifiedRecord> PasteboardUtils::PasteRecord2AppItem(const std::shared_ptr<PasteDataRecord> record)
571 {
572 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr,
573 PASTEBOARD_MODULE_CLIENT, "app Item record is null.");
574 auto udmfValue = record->GetUDMFValue();
575 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(udmfValue != nullptr, nullptr,
576 PASTEBOARD_MODULE_CLIENT, "udmfvalue is null.");
577 auto unifiedRecord = std::make_shared<UDMF::SystemDefinedAppItem>(UDMF::SYSTEM_DEFINED_APP_ITEM, *udmfValue);
578 if (record->GetDetails() != nullptr) {
579 unifiedRecord->SetDetails(*record->GetDetails());
580 }
581 return unifiedRecord;
582 }
583
Form2PasteRecord(const std::shared_ptr<UnifiedRecord> record)584 std::shared_ptr<PasteDataRecord> PasteboardUtils::Form2PasteRecord(const std::shared_ptr<UnifiedRecord> record)
585 {
586 auto form = static_cast<UDMF::SystemDefinedForm *>(record.get());
587 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(form != nullptr, nullptr,
588 PASTEBOARD_MODULE_CLIENT, "Form2 Paste Record is null.");
589 std::vector<uint8_t> arrayBuffer;
590 auto kvRecord = PasteDataRecord::NewKvRecord(Convert(UDType::SYSTEM_DEFINED_FORM), arrayBuffer);
591 kvRecord->SetDetails(form->GetDetails());
592 kvRecord->SetSystemDefinedContent(form->GetItems());
593 kvRecord->SetUDType(UDType::SYSTEM_DEFINED_FORM);
594 return kvRecord;
595 }
596
PasteRecord2Form(const std::shared_ptr<PasteDataRecord> record)597 std::shared_ptr<UnifiedRecord> PasteboardUtils::PasteRecord2Form(const std::shared_ptr<PasteDataRecord> record)
598 {
599 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr,
600 PASTEBOARD_MODULE_CLIENT, "record2 from record is null.");
601 auto unifiedRecord = std::make_shared<UDMF::SystemDefinedForm>();
602 if (record->GetSystemDefinedContent() != nullptr) {
603 unifiedRecord->SetItems(*record->GetSystemDefinedContent());
604 }
605 if (record->GetDetails() != nullptr) {
606 unifiedRecord->SetDetails(*record->GetDetails());
607 }
608 return unifiedRecord;
609 }
610
SystemDefined2PasteRecord(const std::shared_ptr<UnifiedRecord> record)611 std::shared_ptr<PasteDataRecord> PasteboardUtils::SystemDefined2PasteRecord(const std::shared_ptr<UnifiedRecord> record)
612 {
613 auto systemDefined = static_cast<UDMF::SystemDefinedRecord *>(record.get());
614 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(systemDefined != nullptr, nullptr,
615 PASTEBOARD_MODULE_CLIENT, "get systemRecord record failed.");
616 std::vector<uint8_t> arrayBuffer;
617 auto kvRecord = PasteDataRecord::NewKvRecord(Convert(UDType::SYSTEM_DEFINED_RECORD), arrayBuffer);
618 kvRecord->SetDetails(systemDefined->GetDetails());
619 kvRecord->SetUDType(UDType::SYSTEM_DEFINED_RECORD);
620 return kvRecord;
621 }
622
PasteRecord2SystemDefined(const std::shared_ptr<PasteDataRecord> record)623 std::shared_ptr<UnifiedRecord> PasteboardUtils::PasteRecord2SystemDefined(const std::shared_ptr<PasteDataRecord> record)
624 {
625 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr,
626 PASTEBOARD_MODULE_CLIENT, "system fined record is null.");
627 auto unifiedRecord = std::make_shared<UDMF::SystemDefinedRecord>();
628 if (record->GetDetails() != nullptr) {
629 unifiedRecord->SetDetails(*record->GetDetails());
630 }
631 return unifiedRecord;
632 }
633
Text2PasteRecord(const std::shared_ptr<UnifiedRecord> record)634 std::shared_ptr<PasteDataRecord> PasteboardUtils::Text2PasteRecord(const std::shared_ptr<UnifiedRecord> record)
635 {
636 auto text = static_cast<UDMF::Text *>(record.get());
637 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(text != nullptr, nullptr,
638 PASTEBOARD_MODULE_CLIENT, "get TEXT record failed.");
639 std::vector<uint8_t> arrayBuffer;
640 std::string type = UDMF::UtdUtils::GetUtdIdFromUtdEnum(UDMF::TEXT);
641 auto kvRecord = PasteDataRecord::NewKvRecord(type, arrayBuffer);
642 kvRecord->SetUDType(UDMF::TEXT);
643 kvRecord->SetDetails(text->GetDetails());
644 return kvRecord;
645 }
646
PasteRecord2Text(std::shared_ptr<PasteDataRecord> record)647 std::shared_ptr<UnifiedRecord> PasteboardUtils::PasteRecord2Text(std::shared_ptr<PasteDataRecord> record)
648 {
649 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr,
650 PASTEBOARD_MODULE_CLIENT, "cord2 text record is null.");
651 auto unifiedRecord = std::make_shared<UDMF::Text>();
652 if (record->GetDetails() != nullptr) {
653 unifiedRecord->SetDetails(*record->GetDetails());
654 }
655 return unifiedRecord;
656 }
657
Custom2AppDefined(const std::shared_ptr<PasteDataRecord> record)658 std::vector<std::shared_ptr<UnifiedRecord>> PasteboardUtils::Custom2AppDefined(
659 const std::shared_ptr<PasteDataRecord> record)
660 {
661 std::vector<std::shared_ptr<UnifiedRecord>> unifiedRecords;
662 if (record == nullptr) {
663 return unifiedRecords;
664 }
665 if (record->GetCustomData() == nullptr) {
666 return unifiedRecords;
667 }
668 auto customData = record->GetCustomData();
669 if (customData == nullptr) {
670 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_CLIENT, "customData is null");
671 return unifiedRecords;
672 }
673 for (auto &[type, rawData] : customData->GetItemData()) {
674 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "app defied type:%{public}s.", type.c_str());
675 unifiedRecords.push_back(std::make_shared<UDMF::ApplicationDefinedRecord>(type, rawData));
676 }
677 return unifiedRecords;
678 }
679
AppDefined2PasteRecord(const std::shared_ptr<UnifiedRecord> record)680 std::shared_ptr<PasteDataRecord> PasteboardUtils::AppDefined2PasteRecord(const std::shared_ptr<UnifiedRecord> record)
681 {
682 auto appRecord = static_cast<UDMF::ApplicationDefinedRecord *>(record.get());
683 PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(appRecord != nullptr, nullptr,
684 PASTEBOARD_MODULE_CLIENT, "get ApplicationDefinedRecord record failed.");
685 auto utdId = appRecord->GetApplicationDefinedType();
686 auto pbRecord = std::make_shared<PasteDataRecord>();
687 auto value = record->GetOriginValue();
688 if (std::holds_alternative<std::shared_ptr<Object>>(value)) {
689 pbRecord->AddEntry(utdId, std::make_shared<PasteDataEntry>(utdId, value));
690 return pbRecord;
691 }
692 auto object = std::make_shared<Object>();
693 object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId;
694 object->value_[UDMF::ARRAY_BUFFER] = appRecord->GetRawData();
695 object->value_[UDMF::ARRAY_BUFFER_LENGTH] = static_cast<int64_t>(appRecord->GetRawData().size());
696 pbRecord->AddEntry(utdId, std::make_shared<PasteDataEntry>(utdId, object));
697 return pbRecord;
698 }
699
DeduplicateVector(const std::vector<std::string> & vec)700 std::vector<std::string> PasteboardUtils::DeduplicateVector(const std::vector<std::string> &vec)
701 {
702 std::unordered_set<std::string> tmp(vec.begin(), vec.end());
703 std::vector<std::string> result(tmp.begin(), tmp.end());
704 return result;
705 }
706
PasteboardUtils()707 PasteboardUtils::PasteboardUtils()
708 {
709 InitDecodeMap();
710 }
711
GetInstance()712 PasteboardUtils &PasteboardUtils::GetInstance()
713 {
714 static PasteboardUtils instance;
715 return instance;
716 }
717 } // namespace MiscServices
718 } // namespace OHOS