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