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