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