• 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 "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