• 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 "convert_utils.h"
16 #include "pasteboard_hilog.h"
17 namespace OHOS {
18 namespace MiscServices {
19 using UnifiedRecord = UDMF::UnifiedRecord;
20 using UnifiedData = UDMF::UnifiedData;
21 using UnifiedDataProperties = UDMF::UnifiedDataProperties;
22 using UDType = UDMF::UDType;
23 using ShareOptions = UDMF::ShareOptions;
24 
Convert(const UnifiedData & unifiedData)25 std::shared_ptr<PasteData> ConvertUtils::Convert(const UnifiedData &unifiedData)
26 {
27     auto pasteData = std::make_shared<PasteData>(Convert(unifiedData.GetRecords()));
28     pasteData->SetProperty(ConvertProperty(unifiedData.GetProperties(), unifiedData));
29     return pasteData;
30 }
31 
Convert(const PasteData & pasteData)32 std::shared_ptr<UnifiedData> ConvertUtils::Convert(const PasteData &pasteData)
33 {
34     auto unifiedData = std::make_shared<UnifiedData>();
35     unifiedData->SetRecords(Convert(pasteData.AllRecords()));
36     unifiedData->SetProperties(ConvertProperty(pasteData.GetProperty()));
37     unifiedData->SetDataId(pasteData.GetDataId());
38     return unifiedData;
39 }
40 
Convert(const std::vector<std::shared_ptr<PasteDataRecord>> & records)41 std::vector<std::shared_ptr<UnifiedRecord>> ConvertUtils::Convert(
42     const std::vector<std::shared_ptr<PasteDataRecord>> &records)
43 {
44     std::vector<std::shared_ptr<UnifiedRecord>> unifiedRecords;
45     for (auto const &record : records) {
46         unifiedRecords.emplace_back(Convert(record));
47     }
48     return unifiedRecords;
49 }
50 
Convert(const std::vector<std::shared_ptr<UnifiedRecord>> & records)51 std::vector<std::shared_ptr<PasteDataRecord>> ConvertUtils::Convert(
52     const std::vector<std::shared_ptr<UnifiedRecord>> &records)
53 {
54     std::vector<std::shared_ptr<PasteDataRecord>> pasteboardRecords;
55     for (auto const &record : records) {
56         pasteboardRecords.emplace_back(Convert(record));
57     }
58     return pasteboardRecords;
59 }
60 
Convert(std::shared_ptr<PasteDataRecord> record)61 std::shared_ptr<UnifiedRecord> ConvertUtils::Convert(std::shared_ptr<PasteDataRecord> record)
62 {
63     PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr, PASTEBOARD_MODULE_CLIENT,
64         "paste record is nullptr");
65     std::shared_ptr<UnifiedRecord> udmfRecord = std::make_shared<UnifiedRecord>();
66     auto entries = Convert(record->GetEntries(), record);
67     for (auto &udmfEntry : *entries) {
68         udmfRecord->AddEntry(udmfEntry.first, std::move(udmfEntry.second));
69     }
70     udmfRecord->SetChannelName(CHANNEL_NAME);
71     udmfRecord->SetDataId(record->GetDataId());
72     udmfRecord->SetRecordId(record->GetRecordId());
73     return udmfRecord;
74 }
75 
Convert(std::shared_ptr<UnifiedRecord> record)76 std::shared_ptr<PasteDataRecord> ConvertUtils::Convert(std::shared_ptr<UnifiedRecord> record)
77 {
78     PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(record != nullptr, nullptr, PASTEBOARD_MODULE_CLIENT,
79         "udmfRecord is nullptr");
80     std::shared_ptr<PasteDataRecord> pbRecord = std::make_shared<PasteDataRecord>();
81     auto utdId = record->GetUtdId();
82     pbRecord->AddEntry(utdId, std::make_shared<PasteDataEntry>(utdId, record->GetOriginValue()));
83     for (auto const &entry : Convert(record->GetEntries())) {
84         if (entry == nullptr) {
85             PASTEBOARD_HILOGW(PASTEBOARD_MODULE_CLIENT, "entry is empty");
86             continue;
87         }
88         if (utdId == entry->GetUtdId()) {
89             continue;
90         }
91         pbRecord->AddEntry(entry->GetUtdId(), entry);
92     }
93     pbRecord->SetDataId(record->GetDataId());
94     pbRecord->SetRecordId(record->GetRecordId());
95     if (record->GetEntryGetter() != nullptr) {
96         pbRecord->SetDelayRecordFlag(true);
97     }
98     return pbRecord;
99 }
100 
Convert(const std::shared_ptr<std::map<std::string,UDMF::ValueType>> & entries)101 std::vector<std::shared_ptr<PasteDataEntry>> ConvertUtils::Convert(
102     const std::shared_ptr<std::map<std::string, UDMF::ValueType>> &entries)
103 {
104     std::vector<std::shared_ptr<PasteDataEntry>> pbEntries;
105     PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(entries != nullptr, pbEntries, PASTEBOARD_MODULE_CLIENT,
106         "pbEntries is empty");
107     for (auto const &[utdId, value] : *entries) {
108         pbEntries.emplace_back(std::make_shared<PasteDataEntry>(utdId, value));
109     }
110     return pbEntries;
111 }
112 
Convert(const std::shared_ptr<PasteDataEntry> & entry,std::shared_ptr<PasteDataRecord> record)113 UDMF::ValueType ConvertUtils::Convert(const std::shared_ptr<PasteDataEntry>& entry,
114     std::shared_ptr<PasteDataRecord> record)
115 {
116     PASTEBOARD_CHECK_AND_RETURN_RET_LOGE(entry != nullptr, nullptr, PASTEBOARD_MODULE_CLIENT,
117         "entry is null, convert failed.");
118     auto utdId = entry->GetUtdId();
119     auto value = entry->GetValue();
120     if (std::holds_alternative<std::monostate>(value) || std::holds_alternative<std::shared_ptr<Object>>(value)) {
121         if (std::holds_alternative<std::shared_ptr<Object>>(value) && CommonUtils::IsFileUri(utdId) &&
122             record->GetUriV0() != nullptr) {
123             auto object = std::get<std::shared_ptr<Object>>(value);
124             object->value_[UDMF::FILE_URI_PARAM] = record->GetUriV0()->ToString();
125         }
126         return value;
127     }
128     auto mimeType = entry->GetMimeType();
129     auto object = std::make_shared<UDMF::Object>();
130     if (mimeType == MIMETYPE_TEXT_PLAIN) {
131         object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId;
132         if (std::holds_alternative<std::string>(value)) {
133             object->value_[UDMF::CONTENT] = std::get<std::string>(value);
134         }
135     } else if (mimeType == MIMETYPE_TEXT_HTML) {
136         object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId;
137         if (std::holds_alternative<std::string>(value)) {
138             object->value_[UDMF::HTML_CONTENT] = std::get<std::string>(value);
139         }
140     } else if (mimeType == MIMETYPE_TEXT_URI) {
141         object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId;
142         if (std::holds_alternative<std::string>(value) && record->GetUriV0() != nullptr) {
143             object->value_[UDMF::FILE_URI_PARAM] = record->GetUriV0()->ToString();
144         }
145     } else if (mimeType == MIMETYPE_PIXELMAP) {
146         object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId;
147         if (std::holds_alternative<std::shared_ptr<OHOS::Media::PixelMap>>(value)) {
148             object->value_[UDMF::PIXEL_MAP] = std::get<std::shared_ptr<OHOS::Media::PixelMap>>(value);
149         }
150     } else if (mimeType == MIMETYPE_TEXT_WANT) {
151         PASTEBOARD_HILOGW(PASTEBOARD_MODULE_CLIENT, "mimeType is want, udmf not support");
152     } else {
153         object->value_[UDMF::UNIFORM_DATA_TYPE] = utdId;
154         if (std::holds_alternative<std::vector<uint8_t>>(value)) {
155             auto arrayBuffer = std::get<std::vector<uint8_t>>(value);
156             object->value_[UDMF::ARRAY_BUFFER] = arrayBuffer;
157             object->value_[UDMF::ARRAY_BUFFER_LENGTH] = static_cast<int64_t>(arrayBuffer.size());
158         }
159     }
160     return object;
161 }
162 
Convert(const std::vector<std::shared_ptr<PasteDataEntry>> & entries,std::shared_ptr<PasteDataRecord> record)163 std::shared_ptr<std::vector<std::pair<std::string, UDMF::ValueType>>> ConvertUtils::Convert(
164     const std::vector<std::shared_ptr<PasteDataEntry>> &entries, std::shared_ptr<PasteDataRecord> record)
165 {
166     std::map<std::string, UDMF::ValueType> udmfEntryMap;
167     std::vector<std::pair<std::string, UDMF::ValueType>> udmfEntries;
168     std::vector<std::string> entryUtdIds;
169     for (auto const &entry : entries) {
170         if (entry == nullptr) {
171             continue;
172         }
173         if (udmfEntryMap.find(entry->GetUtdId()) == udmfEntryMap.end()) {
174             entryUtdIds.emplace_back(entry->GetUtdId());
175         }
176         auto udmfEntry = Convert(entry, record);
177         if (std::holds_alternative<nullptr_t>(udmfEntry)) {
178             continue;
179         }
180         udmfEntryMap.insert_or_assign(entry->GetUtdId(), udmfEntry);
181     }
182     for (auto const &utdId : entryUtdIds) {
183         auto item = udmfEntryMap.find(utdId);
184         if (item != udmfEntryMap.end()) {
185             udmfEntries.emplace_back(std::pair<std::string, UDMF::ValueType>(item->first, item->second));
186         }
187     }
188     return std::make_shared<std::vector<std::pair<std::string, UDMF::ValueType>>>(udmfEntries);
189 }
190 
UdmfOptions2PbOption(ShareOptions udmfOptions)191 ShareOption ConvertUtils::UdmfOptions2PbOption(ShareOptions udmfOptions)
192 {
193     ShareOption pbOption = CrossDevice;
194     switch (udmfOptions) {
195         case UDMF::IN_APP:
196             pbOption = InApp;
197             break;
198         case UDMF::CROSS_APP:
199             pbOption = LocalDevice;
200             break;
201         case UDMF::CROSS_DEVICE:
202             pbOption = CrossDevice;
203             break;
204         default:
205             break;
206     }
207     return pbOption;
208 }
209 
PbOption2UdmfOptions(ShareOption pbOption)210 ShareOptions ConvertUtils::PbOption2UdmfOptions(ShareOption pbOption)
211 {
212     ShareOptions udmfOptions = UDMF::CROSS_DEVICE;
213     switch (pbOption) {
214         case InApp:
215             udmfOptions = UDMF::IN_APP;
216             break;
217         case LocalDevice:
218             udmfOptions = UDMF::CROSS_APP;
219             break;
220         case CrossDevice:
221             udmfOptions = UDMF::CROSS_DEVICE;
222             break;
223         default:
224             break;
225     }
226     return udmfOptions;
227 }
228 
ConvertProperty(const std::shared_ptr<UnifiedDataProperties> & properties,const UnifiedData & unifiedData)229 PasteDataProperty ConvertUtils::ConvertProperty(
230     const std::shared_ptr<UnifiedDataProperties> &properties, const UnifiedData &unifiedData)
231 {
232     if (!properties) {
233         return {};
234     }
235     PasteDataProperty pasteDataProperty;
236     pasteDataProperty.shareOption = UdmfOptions2PbOption(properties->shareOptions);
237     pasteDataProperty.additions = properties->extras;
238     pasteDataProperty.timestamp = properties->timestamp;
239     pasteDataProperty.tag = properties->tag;
240     auto utdIds = unifiedData.GetTypesLabels();
241     pasteDataProperty.mimeTypes = Convert(utdIds);
242     pasteDataProperty.isRemote = properties->isRemote;
243     return PasteDataProperty(pasteDataProperty);
244 }
245 
ConvertProperty(const PasteDataProperty & properties)246 std::shared_ptr<UnifiedDataProperties> ConvertUtils::ConvertProperty(const PasteDataProperty &properties)
247 {
248     auto unifiedDataProperties = std::make_shared<UnifiedDataProperties>();
249     unifiedDataProperties->shareOptions = PbOption2UdmfOptions(properties.shareOption);
250     unifiedDataProperties->extras = properties.additions;
251     unifiedDataProperties->timestamp = properties.timestamp;
252     unifiedDataProperties->tag = properties.tag;
253     unifiedDataProperties->isRemote = properties.isRemote;
254     return unifiedDataProperties;
255 }
256 
Convert(const std::vector<std::string> & utdIds)257 std::vector<std::string> ConvertUtils::Convert(const std::vector<std::string> &utdIds)
258 {
259     std::vector<std::string> types;
260     for (const auto &utdId : utdIds) {
261         types.push_back(CommonUtils::Convert2MimeType(utdId));
262     }
263     return types;
264 }
265 } // namespace MiscServices
266 } // namespace OHOS