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