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