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 #include "unified_meta.h"
18 namespace OHOS {
19 namespace MiscServices {
20 using UnifiedRecord = UDMF::UnifiedRecord;
21 using UnifiedData = UDMF::UnifiedData;
22 using UnifiedDataProperties = UDMF::UnifiedDataProperties;
23 using UDType = UDMF::UDType;
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     if (record == nullptr) {
64         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_CLIENT, "paste record is nullptr");
65         return nullptr;
66     }
67     std::shared_ptr<UnifiedRecord> udmfRecord = std::make_shared<UnifiedRecord>();
68     auto entries = Convert(record->GetEntries());
69     if (entries->empty()) {
70         PASTEBOARD_HILOGW(PASTEBOARD_MODULE_CLIENT, "entries is nullptr");
71         auto udmfValue = record->GetUDMFValue();
72         if (udmfValue) {
73             auto utdId = CommonUtils::Convert2UtdId(record->GetUDType(), record->GetMimeType());
74             udmfRecord->AddEntry(utdId, std::move(*udmfValue));
75         }
76         return udmfRecord;
77     }
78     for (auto &udmfEntry : *entries) {
79         udmfRecord->AddEntry(udmfEntry.first, std::move(udmfEntry.second));
80     }
81     udmfRecord->SetChannelName(CHANNEL_NAME);
82     udmfRecord->SetDataId(record->GetDataId());
83     udmfRecord->SetRecordId(record->GetRecordId());
84     return udmfRecord;
85 }
86 
Convert(std::shared_ptr<UnifiedRecord> record)87 std::shared_ptr<PasteDataRecord> ConvertUtils::Convert(std::shared_ptr<UnifiedRecord> record)
88 {
89     if (record == nullptr) {
90         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_CLIENT, "udmfRecord is nullptr");
91         return nullptr;
92     }
93     std::shared_ptr<PasteDataRecord> pbRecord = std::make_shared<PasteDataRecord>();
94     auto utdId = record->GetUtdId();
95     pbRecord->AddEntry(utdId, std::make_shared<PasteDataEntry>(utdId, record->GetOriginValue()));
96     for (auto const &entry : Convert(record->GetEntries())) {
97         if (entry == nullptr) {
98             PASTEBOARD_HILOGW(PASTEBOARD_MODULE_CLIENT, "entry is empty");
99             continue;
100         }
101         if (utdId == entry->GetUtdId()) {
102             continue;
103         }
104         pbRecord->AddEntry(entry->GetUtdId(), entry);
105     }
106     pbRecord->SetDataId(record->GetDataId());
107     pbRecord->SetRecordId(record->GetRecordId());
108     if (record->GetEntryGetter() != nullptr) {
109         pbRecord->SetDelayRecordFlag(true);
110     }
111     return pbRecord;
112 }
113 
Convert( const std::shared_ptr<std::map<std::string, UDMF::ValueType>> &entries)114 std::vector<std::shared_ptr<PasteDataEntry>> ConvertUtils::Convert(
115     const std::shared_ptr<std::map<std::string, UDMF::ValueType>> &entries)
116 {
117     std::vector<std::shared_ptr<PasteDataEntry>> pbEntries;
118     if (entries == nullptr) {
119         PASTEBOARD_HILOGW(PASTEBOARD_MODULE_CLIENT, "pbEntries is empty");
120         return pbEntries;
121     }
122     for (auto const &[utdId, value] : *entries) {
123         pbEntries.emplace_back(std::make_shared<PasteDataEntry>(utdId, value));
124     }
125     return pbEntries;
126 }
127 
Convert( const std::vector<std::shared_ptr<PasteDataEntry>> &entries)128 std::shared_ptr<std::vector<std::pair<std::string, UDMF::ValueType>>> ConvertUtils::Convert(
129     const std::vector<std::shared_ptr<PasteDataEntry>> &entries)
130 {
131     std::map<std::string, UDMF::ValueType> udmfEntryMap;
132     std::vector<std::pair<std::string, UDMF::ValueType>> udmfEntries;
133     std::vector<std::string> entryUtdIds;
134     for (auto const &entry : entries) {
135         if (entry == nullptr) {
136             continue;
137         }
138         if (udmfEntryMap.find(entry->GetUtdId()) == udmfEntryMap.end()) {
139             entryUtdIds.emplace_back(entry->GetUtdId());
140         }
141         udmfEntryMap.insert_or_assign(entry->GetUtdId(), entry->GetValue());
142     }
143     for (auto const &utdId : entryUtdIds) {
144         auto item = udmfEntryMap.find(utdId);
145         if (item != udmfEntryMap.end()) {
146             udmfEntries.emplace_back(std::pair<std::string, UDMF::ValueType>(item->first, item->second));
147         }
148     }
149     return std::make_shared<std::vector<std::pair<std::string, UDMF::ValueType>>>(udmfEntries);
150 }
151 
ConvertProperty( const std::shared_ptr<UnifiedDataProperties> &properties, const UnifiedData &unifiedData)152 PasteDataProperty ConvertUtils::ConvertProperty(
153     const std::shared_ptr<UnifiedDataProperties> &properties, const UnifiedData &unifiedData)
154 {
155     if (!properties) {
156         return {};
157     }
158     PasteDataProperty pasteDataProperty;
159     pasteDataProperty.shareOption = static_cast<ShareOption>(properties->shareOptions);
160     pasteDataProperty.additions = properties->extras;
161     pasteDataProperty.timestamp = properties->timestamp;
162     pasteDataProperty.tag = properties->tag;
163     auto utdIds = unifiedData.GetTypesLabels();
164     pasteDataProperty.mimeTypes = Convert(utdIds);
165     pasteDataProperty.isRemote = properties->isRemote;
166     return PasteDataProperty(pasteDataProperty);
167 }
168 
ConvertProperty(const PasteDataProperty &properties)169 std::shared_ptr<UnifiedDataProperties> ConvertUtils::ConvertProperty(const PasteDataProperty &properties)
170 {
171     auto unifiedDataProperties = std::make_shared<UnifiedDataProperties>();
172     unifiedDataProperties->shareOptions = properties.shareOption == InApp ? UDMF::ShareOptions::IN_APP
173                                                                           : UDMF::ShareOptions::CROSS_APP;
174     unifiedDataProperties->extras = properties.additions;
175     unifiedDataProperties->timestamp = properties.timestamp;
176     unifiedDataProperties->tag = properties.tag;
177     unifiedDataProperties->isRemote = properties.isRemote;
178     return unifiedDataProperties;
179 }
180 
Convert(const std::vector<std::string> &utdIds)181 std::vector<std::string> ConvertUtils::Convert(const std::vector<std::string> &utdIds)
182 {
183     std::vector<std::string> types;
184     for (const auto &utdId : utdIds) {
185         types.push_back(CommonUtils::Convert2MimeType(utdId));
186     }
187     return types;
188 }
189 } // namespace MiscServices
190 } // namespace OHOS