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