• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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