1
2 /*
3 * Copyright (c) 2024 Huawei Device Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "unified_record_ffi.h"
18
19 #include "udmf_log.h"
20 #include "unified_record_impl.h"
21 #include "utils.h"
22
23 using namespace OHOS::FFI;
24 using namespace OHOS::UDMF;
25
26 namespace OHOS {
27 namespace UDMF {
28 constexpr int64_t NO_ERROR = 0;
29 constexpr int64_t ERR_INIT_FAILED = -1;
30
31 extern "C" {
FfiUDMFUnifiedRecordConstructor()32 int64_t FfiUDMFUnifiedRecordConstructor()
33 {
34 auto nativeCJUnifiedRecord = FFIData::Create<CUnifiedRecord>();
35 if (nativeCJUnifiedRecord == nullptr) {
36 return -1;
37 }
38 return nativeCJUnifiedRecord->GetID();
39 }
40
FfiUDMFUnifiedRecordConstructorwithOnlyType(const char * type)41 int64_t FfiUDMFUnifiedRecordConstructorwithOnlyType(const char *type)
42 {
43 auto nativeCJUnifiedRecord = FFIData::Create<CUnifiedRecord>(type);
44 if (nativeCJUnifiedRecord == nullptr) {
45 return -1;
46 }
47 return nativeCJUnifiedRecord->GetID();
48 }
49
FfiUDMFUnifiedRecordConstructorwithType(const char * type,CJValueType value)50 int64_t FfiUDMFUnifiedRecordConstructorwithType(const char *type, CJValueType value)
51 {
52 auto nativeCJUnifiedRecord = FFIData::Create<CUnifiedRecord>(type, value);
53 if (nativeCJUnifiedRecord == nullptr) {
54 return -1;
55 }
56 return nativeCJUnifiedRecord->GetID();
57 }
58
FfiUDMFUnifiedRecordGetType(int64_t unifiedId)59 char *FfiUDMFUnifiedRecordGetType(int64_t unifiedId)
60 {
61 auto instance = FFIData::GetData<CUnifiedRecord>(unifiedId);
62 if (instance == nullptr) {
63 return nullptr;
64 }
65 return instance->GetType();
66 }
67
FfiUDMFUnifiedRecordGetValue(int64_t unifiedId)68 CJValueType FfiUDMFUnifiedRecordGetValue(int64_t unifiedId)
69 {
70 auto instance = FFIData::GetData<CUnifiedRecord>(unifiedId);
71 if (instance == nullptr) {
72 return CJValueType {};
73 }
74 return instance->GetValue();
75 }
76
FfiUDMFFileGetUri(int64_t id)77 char *FfiUDMFFileGetUri(int64_t id)
78 {
79 auto instance = FFIData::GetData<CUnifiedRecord>(id);
80 if (instance == nullptr) {
81 LOGE("Get unifiedRecord failed. Instance is null.");
82 return nullptr;
83 }
84 return instance->GetFileUri();
85 }
86
FfiUDMFFileSetUri(int64_t id,const char * uri)87 int64_t FfiUDMFFileSetUri(int64_t id, const char *uri)
88 {
89 auto instance = FFIData::GetData<CUnifiedRecord>(id);
90 if (instance == nullptr) {
91 LOGE("Get unifiedRecord failed. Instance is null.");
92 return ERR_INIT_FAILED;
93 }
94 instance->SetFileUri(uri);
95 return NO_ERROR;
96 }
97
FfiUDMFFileGetDetails(int64_t id)98 CRecord FfiUDMFFileGetDetails(int64_t id)
99 {
100 CRecord ret = { .keys = { .head = nullptr, .size = 0 }, .values = { .head = nullptr, .size = 0 } };
101 auto instance = FFIData::GetData<CUnifiedRecord>(id);
102 if (instance == nullptr) {
103 LOGE("Get unifiedRecord failed. Instance is null.");
104 return ret;
105 }
106 return instance->GetFileDetails();
107 }
108
FfiUDMFFileSetDetails(int64_t id,CRecord record)109 int64_t FfiUDMFFileSetDetails(int64_t id, CRecord record)
110 {
111 if (record.keys.size != record.values.size) {
112 LOGE("Param error. The number of key and value mismatch.");
113 return ERR_INIT_FAILED;
114 }
115 auto instance = FFIData::GetData<CUnifiedRecord>(id);
116 if (instance == nullptr) {
117 LOGE("Get unifiedRecord failed. Instance is null.");
118 return ERR_INIT_FAILED;
119 }
120 std::map<std::string, std::string> details;
121 for (int64_t i = 0; i < record.keys.size; i++) {
122 std::string key{record.keys.head[i]};
123 std::string value{record.values.head[i]};
124 details[key] = value;
125 }
126 instance->SetFileDetails(details);
127 return NO_ERROR;
128 }
129
FfiUDMFImageGetImageUri(int64_t id)130 char *FfiUDMFImageGetImageUri(int64_t id)
131 {
132 auto instance = FFIData::GetData<CUnifiedRecord>(id);
133 if (instance == nullptr) {
134 LOGE("Get unifiedRecord failed. Instance is null.");
135 return nullptr;
136 }
137 return instance->GetImageUri();
138 }
139
FfiUDMFImageSetImageUri(int64_t id,const char * uri)140 int64_t FfiUDMFImageSetImageUri(int64_t id, const char *uri)
141 {
142 auto instance = FFIData::GetData<CUnifiedRecord>(id);
143 if (instance == nullptr) {
144 LOGE("Get unifiedRecord failed. Instance is null.");
145 return ERR_INIT_FAILED;
146 }
147 instance->SetImageUri(uri);
148 return NO_ERROR;
149 }
150
FfiUDMFVideoGetVideoUri(int64_t id)151 char *FfiUDMFVideoGetVideoUri(int64_t id)
152 {
153 auto instance = FFIData::GetData<CUnifiedRecord>(id);
154 if (instance == nullptr) {
155 LOGE("Get unifiedRecord failed. Instance is null.");
156 return nullptr;
157 }
158 return instance->GetVideoUri();
159 }
160
FfiUDMFVideoSetVideoUri(int64_t id,const char * uri)161 int64_t FfiUDMFVideoSetVideoUri(int64_t id, const char *uri)
162 {
163 auto instance = FFIData::GetData<CUnifiedRecord>(id);
164 if (instance == nullptr) {
165 LOGE("Get unifiedRecord failed. Instance is null.");
166 return ERR_INIT_FAILED;
167 }
168 instance->SetVideoUri(uri);
169 return NO_ERROR;
170 }
171
FfiUDMFTextGetDetails(int64_t id)172 CRecord FfiUDMFTextGetDetails(int64_t id)
173 {
174 CRecord ret = { .keys = { .head = nullptr, .size = 0 }, .values = { .head = nullptr, .size = 0 } };
175 auto instance = FFIData::GetData<CUnifiedRecord>(id);
176 if (instance == nullptr) {
177 LOGE("Get unifiedRecord failed. Instance is null.");
178 return ret;
179 }
180 return instance->GetTextDetails();
181 }
182
FfiUDMFTextSetDetails(int64_t id,CRecord record)183 int64_t FfiUDMFTextSetDetails(int64_t id, CRecord record)
184 {
185 if (record.keys.size != record.values.size) {
186 LOGE("Param error. The number of key and value mismatch.");
187 return ERR_INIT_FAILED;
188 }
189 auto instance = FFIData::GetData<CUnifiedRecord>(id);
190 if (instance == nullptr) {
191 LOGE("Get unifiedRecord failed. Instance is null.");
192 return ERR_INIT_FAILED;
193 }
194 std::map<std::string, std::string> details;
195 for (int64_t i = 0; i < record.keys.size; i++) {
196 std::string key{record.keys.head[i]};
197 std::string value{record.values.head[i]};
198 details[key] = value;
199 }
200 instance->SetTextDetails(details);
201 return NO_ERROR;
202 }
203
FfiUDMFHyperLinkGetUrl(int64_t id)204 char *FfiUDMFHyperLinkGetUrl(int64_t id)
205 {
206 auto instance = FFIData::GetData<CUnifiedRecord>(id);
207 if (instance == nullptr) {
208 LOGE("Get unifiedRecord failed. Instance is null.");
209 return nullptr;
210 }
211 return instance->GetHyperLinkUrl();
212 }
213
FfiUDMFHyperLinkSetUrl(int64_t id,const char * url)214 int64_t FfiUDMFHyperLinkSetUrl(int64_t id, const char *url)
215 {
216 auto instance = FFIData::GetData<CUnifiedRecord>(id);
217 if (instance == nullptr) {
218 LOGE("Get unifiedRecord failed. Instance is null.");
219 return ERR_INIT_FAILED;
220 }
221 instance->SetHyperLinkUrl(url);
222 return NO_ERROR;
223 }
224
FfiUDMFHyperLinkGetDescription(int64_t id)225 char *FfiUDMFHyperLinkGetDescription(int64_t id)
226 {
227 auto instance = FFIData::GetData<CUnifiedRecord>(id);
228 if (instance == nullptr) {
229 LOGE("Get unifiedRecord failed. Instance is null.");
230 return nullptr;
231 }
232 return instance->GetHyperLinkDescription();
233 }
234
FfiUDMFHyperLinkSetDescription(int64_t id,const char * description)235 int64_t FfiUDMFHyperLinkSetDescription(int64_t id, const char *description)
236 {
237 auto instance = FFIData::GetData<CUnifiedRecord>(id);
238 if (instance == nullptr) {
239 LOGE("Get unifiedRecord failed. Instance is null.");
240 return ERR_INIT_FAILED;
241 }
242 instance->SetHyperLinkDescription(description);
243 return NO_ERROR;
244 }
245
FfiUDMFPlainTextGetTextContent(int64_t id)246 char *FfiUDMFPlainTextGetTextContent(int64_t id)
247 {
248 auto instance = FFIData::GetData<CUnifiedRecord>(id);
249 if (instance == nullptr) {
250 LOGE("Get unifiedRecord failed. Instance is null.");
251 return nullptr;
252 }
253 return instance->GetPlainTextContent();
254 }
255
FfiUDMFPlainTextSetTextContent(int64_t id,const char * text)256 int64_t FfiUDMFPlainTextSetTextContent(int64_t id, const char *text)
257 {
258 auto instance = FFIData::GetData<CUnifiedRecord>(id);
259 if (instance == nullptr) {
260 LOGE("Get unifiedRecord failed. Instance is null.");
261 return ERR_INIT_FAILED;
262 }
263 instance->SetPlainTextContent(text);
264 return NO_ERROR;
265 }
266
FfiUDMFPlainTextGetAbstract(int64_t id)267 char *FfiUDMFPlainTextGetAbstract(int64_t id)
268 {
269 auto instance = FFIData::GetData<CUnifiedRecord>(id);
270 if (instance == nullptr) {
271 LOGE("Get unifiedRecord failed. Instance is null.");
272 return nullptr;
273 }
274 return instance->GetPlainTextAbstract();
275 }
276
FfiUDMFPlainTextSetAbstract(int64_t id,const char * abstr)277 int64_t FfiUDMFPlainTextSetAbstract(int64_t id, const char *abstr)
278 {
279 auto instance = FFIData::GetData<CUnifiedRecord>(id);
280 if (instance == nullptr) {
281 LOGE("Get unifiedRecord failed. Instance is null.");
282 return ERR_INIT_FAILED;
283 }
284 instance->SetPlainTextAbstract(abstr);
285 return NO_ERROR;
286 }
287
FfiUDMFFreeCjValueType(CJValueType * val)288 FFI_EXPORT void FfiUDMFFreeCjValueType(CJValueType *val)
289 {
290 if (val->string != nullptr) {
291 free(val->string);
292 val->string = nullptr;
293 }
294 if (val->byteArray.head != nullptr) {
295 free(val->byteArray.head);
296 val->byteArray.head = nullptr;
297 val->byteArray.size = 0;
298 }
299 }
300
FfiUDMFFreeCRecord(CRecord * record)301 FFI_EXPORT void FfiUDMFFreeCRecord(CRecord *record)
302 {
303 Utils::FreeCArrString(record->keys);
304 Utils::FreeCArrString(record->values);
305 record->keys.head = nullptr;
306 record->keys.size = 0;
307 record->values.head = nullptr;
308 record->values.size = 0;
309 }
310 }
311 } // namespace UDMF
312 } // namespace OHOS
313