1 /*
2  * Copyright (c) 2021-2022 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 
16 #include "result_convert.h"
17 
18 #include "hilog_wrapper_api.h"
19 
20 namespace OHOS {
21 namespace ContactsApi {
ResultConvert(void)22 ResultConvert::ResultConvert(void)
23 {
24 }
25 
~ResultConvert()26 ResultConvert::~ResultConvert()
27 {
28 }
29 
30 /**
31  * @brief Get object array by resultSet
32  *
33  * @param env Conditions for convert operation
34  * @param resultSet Conditions for convert operation
35  *
36  * @return The result returned by convert operation
37  */
ResultSetToObject( napi_env env, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)38 napi_value ResultConvert::ResultSetToObject(
39     napi_env env, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
40 {
41     if (resultSet == nullptr) {
42         HILOG_ERROR("ResultConvert::ResultSetToObject resultSet is nullptr");
43         napi_value array;
44         napi_create_array(env, &array);
45         return array;
46     }
47     int rowCount = 0;
48     resultSet->GetRowCount(rowCount);
49     HILOG_INFO("ResultSetToObject GetRowCount is %{public}d", rowCount);
50     if (rowCount == 0) {
51         napi_value array;
52         napi_create_array(env, &array);
53         resultSet->Close();
54         return array;
55     }
56     std::map<int, napi_value> resultSetMap;
57     std::map<int, std::string> quickSearchMap;
58     int resultSetNum = resultSet->GoToFirstRow();
59     while (resultSetNum == 0) {
60         int contactIdValue = 0;
61         std::string contactIdKey = "contact_id";
62         int contactIndex = 0;
63         resultSet->GetColumnIndex(contactIdKey, contactIndex);
64         resultSet->GetInt(contactIndex, contactIdValue);
65         napi_value napiObject = GetResultMapValue(env, resultSetMap, contactIdValue);
66         PutQuickSearchKey(env, resultSet, quickSearchMap, contactIdValue);
67         ConvertContactObject(env, napiObject, resultSet);
68         resultSetNum = resultSet->GoToNextRow();
69     }
70     resultSet->Close();
71     napi_value array = ConvertContactArray(env, resultSetMap, quickSearchMap);
72     return array;
73 }
74 
PutQuickSearchKey(napi_env env, std::shared_ptr<DataShare::DataShareResultSet> &resultSet, std::map<int, std::string> &quickSearchMap, int contactIdValue)75 void ResultConvert::PutQuickSearchKey(napi_env env, std::shared_ptr<DataShare::DataShareResultSet> &resultSet,
76     std::map<int, std::string> &quickSearchMap, int contactIdValue)
77 {
78     std::string quickSearchValue = "";
79     std::string quickSearchKey = "quick_search_key";
80     int columnIndex = 0;
81     resultSet->GetColumnIndex(quickSearchKey, columnIndex);
82     resultSet->GetString(columnIndex, quickSearchValue);
83     if (quickSearchMap.count(contactIdValue) <= 0) {
84         napi_value napiQuickSearchValue;
85         napi_create_string_utf8(env, quickSearchValue.c_str(), NAPI_AUTO_LENGTH, &napiQuickSearchValue);
86         quickSearchMap.insert(std::pair<int, std::string>(contactIdValue, quickSearchValue));
87     }
88 }
89 
ConvertContactArray( napi_env env, std::map<int, napi_value> &resultSetMap, std::map<int, std::string> &quickSearchMap)90 napi_value ResultConvert::ConvertContactArray(
91     napi_env env, std::map<int, napi_value> &resultSetMap, std::map<int, std::string> &quickSearchMap)
92 {
93     napi_value array;
94     napi_create_array(env, &array);
95     int count = 0;
96     std::map<int, napi_value>::iterator it;
97     for (it = resultSetMap.begin(); it != resultSetMap.end(); ++it) {
98         napi_value elementObject = it->second;
99         if (quickSearchMap.count(it->first) > 0) {
100             napi_value keyValue;
101             napi_create_string_utf8(env, quickSearchMap[it->first].c_str(), NAPI_AUTO_LENGTH, &keyValue);
102             napi_value napiQuickKey;
103             napi_create_string_utf8(env, "key", NAPI_AUTO_LENGTH, &napiQuickKey);
104             napi_set_property(env, elementObject, napiQuickKey, keyValue);
105         }
106         napi_value keyValue;
107         napi_create_int64(env, it->first, &keyValue);
108         napi_value napiIdKey;
109         napi_create_string_utf8(env, "id", NAPI_AUTO_LENGTH, &napiIdKey);
110         napi_set_property(env, elementObject, napiIdKey, keyValue);
111         napi_set_element(env, array, count, elementObject);
112         ++count;
113     }
114     return array;
115 }
116 
117 /**
118  * @brief Converting NaPi objects to C++ objects
119  *
120  * @param env Conditions for convert operation
121  * @param napiObject Conditions for convert operation
122  * @param resultSet Target of convert operation
123  */
ConvertContactObject( napi_env env, napi_value napiObject, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)124 void ResultConvert::ConvertContactObject(
125     napi_env env, napi_value napiObject, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
126 {
127     int typeIdValue = 0;
128     std::string typeId = "type_id";
129     int columnIndexType = 0;
130     resultSet->GetColumnIndex(typeId, columnIndexType);
131     resultSet->GetInt(columnIndexType, typeIdValue);
132     ConvertEmail(env, napiObject, typeIdValue, resultSet);
133     ConvertName(env, napiObject, typeIdValue, resultSet);
134     ConvertUri(env, napiObject, typeIdValue, resultSet);
135     ConvertEvent(env, napiObject, typeIdValue, resultSet);
136     ConvertGroup(env, napiObject, typeIdValue, resultSet);
137     ConvertImAddress(env, napiObject, typeIdValue, resultSet);
138     ConvertPhoneNumber(env, napiObject, typeIdValue, resultSet);
139     ConvertPostalAddress(env, napiObject, typeIdValue, resultSet);
140     ConvertRelation(env, napiObject, typeIdValue, resultSet);
141     ConvertSipAddress(env, napiObject, typeIdValue, resultSet);
142     ConvertWebsite(env, napiObject, typeIdValue, resultSet);
143     ConvertNickName(env, napiObject, typeIdValue, resultSet);
144     ConvertNote(env, napiObject, typeIdValue, resultSet);
145     ConvertOrganization(env, napiObject, typeIdValue, resultSet);
146 }
147 
IsEmpty(std::shared_ptr<DataShare::DataShareResultSet> &resultSet)148 bool ResultConvert::IsEmpty(std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
149 {
150     if (resultSet == nullptr) {
151         HILOG_ERROR("ResultSetToHolder resultSet is nullptr");
152         return true;
153     }
154     int rowCount = 0;
155     resultSet->GetRowCount(rowCount);
156     if (rowCount == 0) {
157         resultSet->Close();
158         return true;
159     }
160     return false;
161 }
162 
ResultSetToHolder( napi_env env, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)163 napi_value ResultConvert::ResultSetToHolder(
164     napi_env env, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
165 {
166     napi_value array;
167     napi_create_array(env, &array);
168     if (IsEmpty(resultSet)) {
169         return array;
170     }
171     int resultSetNum = resultSet->GoToFirstRow();
172     int count = 0;
173     while (resultSetNum == 0) {
174         napi_value elementObject;
175         napi_create_object(env, &elementObject);
176         int idValue;
177         std::string id = "id";
178         int idIndex = 0;
179         resultSet->GetColumnIndex(id, idIndex);
180         resultSet->GetInt(idIndex, idValue);
181         napi_value napiIdKey;
182         napi_create_string_utf8(env, "holderId", NAPI_AUTO_LENGTH, &napiIdKey);
183         napi_value napiValue;
184         napi_create_int64(env, idValue, &napiValue);
185         napi_set_property(env, elementObject, napiIdKey, napiValue);
186         std::string displayName = "account_name";
187         std::string displayNameValue;
188         int displayNameIndex = 0;
189         resultSet->GetColumnIndex(displayName, displayNameIndex);
190         resultSet->GetString(displayNameIndex, displayNameValue);
191         napi_value napiDisplayNameKey;
192         napi_create_string_utf8(env, "displayName", NAPI_AUTO_LENGTH, &napiDisplayNameKey);
193         napi_value napiDisplayNameValue;
194         napi_create_string_utf8(env, displayNameValue.c_str(), NAPI_AUTO_LENGTH, &napiDisplayNameValue);
195         napi_set_property(env, elementObject, napiDisplayNameKey, napiDisplayNameValue);
196         std::string bundleName = "account_type";
197         std::string bundleNameValue;
198         int bundleNameIndex = 0;
199         resultSet->GetColumnIndex(bundleName, bundleNameIndex);
200         resultSet->GetString(bundleNameIndex, bundleNameValue);
201         napi_value napiBundleNameKey;
202         napi_create_string_utf8(env, "bundleName", NAPI_AUTO_LENGTH, &napiBundleNameKey);
203         napi_value napiBundleNameValue;
204         napi_create_string_utf8(env, bundleNameValue.c_str(), NAPI_AUTO_LENGTH, &napiBundleNameValue);
205         napi_set_property(env, elementObject, napiBundleNameKey, napiBundleNameValue);
206         napi_set_element(env, array, count, elementObject);
207         ++count;
208         resultSetNum = resultSet->GoToNextRow();
209     }
210     resultSet->Close();
211     return array;
212 }
213 
ResultSetToGroup( napi_env env, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)214 napi_value ResultConvert::ResultSetToGroup(
215     napi_env env, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
216 {
217     napi_value array;
218     NAPI_CALL(env, napi_create_array(env, &array));
219     if (resultSet == nullptr) {
220         HILOG_ERROR("ResultSetToGroup resultSet is nullptr");
221         return array;
222     }
223     int rowCount = 0;
224     resultSet->GetRowCount(rowCount);
225     HILOG_INFO("ResultSetToGroup GetRowCount is %{public}d", rowCount);
226     if (rowCount == 0) {
227         resultSet->Close();
228         return array;
229     }
230     int resultSetNum = resultSet->GoToFirstRow();
231     HILOG_INFO("ResultSetToGroup resultSetNum is %{public}d", resultSetNum);
232     int count = 0;
233     while (resultSetNum == 0) {
234         napi_value elementObject;
235         napi_create_object(env, &elementObject);
236         int idValue;
237         std::string id = "id";
238         int idIndex = 0;
239         resultSet->GetColumnIndex(id, idIndex);
240         resultSet->GetInt(idIndex, idValue);
241         napi_value napiIdKey;
242         napi_create_string_utf8(env, "id", NAPI_AUTO_LENGTH, &napiIdKey);
243         napi_value napiValue;
244         napi_create_int64(env, idValue, &napiValue);
245         napi_set_property(env, elementObject, napiIdKey, napiValue);
246         std::string title = "group_name";
247         std::string titleValue;
248         int titleIndex = 0;
249         resultSet->GetColumnIndex(title, titleIndex);
250         resultSet->GetString(titleIndex, titleValue);
251         napi_value napiTitleKey;
252         napi_create_string_utf8(env, "title", NAPI_AUTO_LENGTH, &napiTitleKey);
253         napi_value napiTitleValue;
254         napi_create_string_utf8(env, titleValue.c_str(), NAPI_AUTO_LENGTH, &napiTitleValue);
255         napi_set_property(env, elementObject, napiTitleKey, napiTitleValue);
256         napi_set_element(env, array, count, elementObject);
257         ++count;
258         resultSetNum = resultSet->GoToNextRow();
259     }
260     resultSet->Close();
261     return array;
262 }
263 
GetResultMapValue(napi_env env, std::map<int, napi_value> &resultSetMap, int &contactId)264 napi_value ResultConvert::GetResultMapValue(napi_env env, std::map<int, napi_value> &resultSetMap, int &contactId)
265 {
266     napi_value napiObject;
267     if (resultSetMap.count(contactId) > 0) {
268         std::map<int, napi_value>::iterator it = resultSetMap.find(contactId);
269         napiObject = it->second;
270     } else {
271         napi_create_object(env, &napiObject);
272         resultSetMap.insert(std::pair<int, napi_value>(contactId, napiObject));
273         std::map<int, napi_value>::iterator it = resultSetMap.find(contactId);
274         napiObject = it->second;
275     }
276     return napiObject;
277 }
278 
GetNapiValue(napi_env env, const std::string keyChar, napi_value napiObject)279 napi_value ResultConvert::GetNapiValue(napi_env env, const std::string keyChar, napi_value napiObject)
280 {
281     if (napiObject == nullptr) {
282         HILOG_ERROR("ResultConvert::GetNapiValue object is nullptr");
283         return nullptr;
284     }
285     napi_value key;
286     napi_create_string_utf8(env, keyChar.c_str(), NAPI_AUTO_LENGTH, &key);
287     bool result = false;
288     napi_has_property(env, napiObject, key, &result);
289     if (result) {
290         napi_value value = nullptr;
291         napi_get_property(env, napiObject, key, &value);
292         return value;
293     }
294     return nullptr;
295 }
296 
GetNapiElementObject(napi_env env, napi_value napiObject, const std::string valueChar)297 napi_value ResultConvert::GetNapiElementObject(napi_env env, napi_value napiObject, const std::string valueChar)
298 {
299     napi_value objectElement = GetNapiValue(env, valueChar, napiObject);
300     if (objectElement == nullptr) {
301         napi_create_object(env, &objectElement);
302     }
303     return objectElement;
304 }
305 
GetNapiElementArray(napi_env env, napi_value napiObject, const std::string valueChar)306 napi_value ResultConvert::GetNapiElementArray(napi_env env, napi_value napiObject, const std::string valueChar)
307 {
308     napi_value emailArray = GetNapiValue(env, valueChar, napiObject);
309     if (emailArray == nullptr) {
310         napi_create_array(env, &emailArray);
311     }
312     return emailArray;
313 }
314 
GetResultValue( napi_env env, std::string &contentKey, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)315 napi_value ResultConvert::GetResultValue(
316     napi_env env, std::string &contentKey, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
317 {
318     int columnIndex = ERROR;
319     resultSet->GetColumnIndex(contentKey, columnIndex);
320     OHOS::DataShare::DataType columnType;
321     resultSet->GetDataType(columnIndex, columnType);
322     napi_value napiValue = nullptr;
323     if (columnType == OHOS::DataShare::DataType::TYPE_NULL) {
324         return napiValue;
325     } else if (columnType == OHOS::DataShare::DataType::TYPE_BLOB) {
326         return napiValue;
327     } else if (columnType == OHOS::DataShare::DataType::TYPE_INTEGER) {
328         int intValue = 0;
329         resultSet->GetInt(columnIndex, intValue);
330         napi_create_int64(env, intValue, &napiValue);
331     } else if (columnType == OHOS::DataShare::DataType::TYPE_FLOAT) {
332         double doubleValue = 0;
333         resultSet->GetDouble(columnIndex, doubleValue);
334         napi_create_double(env, doubleValue, &napiValue);
335     } else if (columnType == OHOS::DataShare::DataType::TYPE_STRING) {
336         std::string stringValue;
337         resultSet->GetString(columnIndex, stringValue);
338         napi_create_string_utf8(env, stringValue.c_str(), NAPI_AUTO_LENGTH, &napiValue);
339     }
340     return napiValue;
341 }
342 
CreateNapiStringValue(napi_env env, const std::string key)343 napi_value ResultConvert::CreateNapiStringValue(napi_env env, const std::string key)
344 {
345     napi_value keyValue;
346     napi_create_string_utf8(env, key.c_str(), NAPI_AUTO_LENGTH, &keyValue);
347     return keyValue;
348 }
349 
ConvertEmail( napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)350 void ResultConvert::ConvertEmail(
351     napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
352 {
353     if (typeId == EMAIL) {
354         const std::string emails = "emails";
355         napi_value emailArray = GetNapiElementArray(env, napiObject, emails);
356         uint32_t count = 0;
357         napi_get_array_length(env, emailArray, &count);
358         napi_value objectElement;
359         napi_create_object(env, &objectElement);
360         std::string detailInfoKey = "detail_info";
361         std::string customDataKey = "custom_data";
362         std::string extend7Key = "extend7";
363         std::string aliasDetailInfoKey = "alias_detail_info";
364         napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet);
365         napi_value customValue = GetResultValue(env, customDataKey, resultSet);
366         napi_value extend7Value = GetResultValue(env, extend7Key, resultSet);
367         napi_value aliasDetailInfoValue = GetResultValue(env, aliasDetailInfoKey, resultSet);
368         napi_value napiDetailInfoKey = CreateNapiStringValue(env, "email");
369         napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue);
370         napi_value napiLabelNameKey = CreateNapiStringValue(env, "labelName");
371         napi_set_property(env, objectElement, napiLabelNameKey, customValue);
372         napi_value napiLabelIdKey = CreateNapiStringValue(env, "labelId");
373         napi_set_property(env, objectElement, napiLabelIdKey, extend7Value);
374         napi_value napiDisplayNameIdKey = CreateNapiStringValue(env, "displayName");
375         napi_set_property(env, objectElement, napiDisplayNameIdKey, aliasDetailInfoValue);
376         napi_set_element(env, emailArray, count, objectElement);
377         napi_value napiElementKey;
378         napi_create_string_utf8(env, emails.c_str(), NAPI_AUTO_LENGTH, &napiElementKey);
379         napi_set_property(env, napiObject, napiElementKey, emailArray);
380     }
381 }
382 
ConvertName( napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)383 void ResultConvert::ConvertName(
384     napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
385 {
386     if (typeId == NAME) {
387         const std::string name = "name";
388         napi_value objectElement = GetNapiElementObject(env, napiObject, name);
389         std::string fullNameKey = "detail_info";
390         std::string familyNameKey = "family_name";
391         std::string familyNamePhoneticKey = "phonetic_name";
392         std::string givenNameKey = "given_name";
393         std::string givenNamePhoneticKey = "given_name_phonetic";
394         std::string middleNamePhoneticKey = "middle_name_phonetic";
395         std::string middleNameKey = "other_lan_last_name";
396         std::string namePrefixKey = "alpha_name";
397         std::string nameSuffixKey = "other_lan_first_name";
398         napi_value fullNameValue = GetResultValue(env, fullNameKey, resultSet);
399         napi_value familyNameValue = GetResultValue(env, familyNameKey, resultSet);
400         napi_value familyNamePhoneticValue = GetResultValue(env, familyNamePhoneticKey, resultSet);
401         napi_value givenNameValue = GetResultValue(env, givenNameKey, resultSet);
402         napi_value givenNamePhoneticValue = GetResultValue(env, givenNamePhoneticKey, resultSet);
403         napi_value middleNamePhoneticValue = GetResultValue(env, middleNamePhoneticKey, resultSet);
404         napi_value middleNameValue = GetResultValue(env, middleNameKey, resultSet);
405         napi_value namePrefixValue = GetResultValue(env, namePrefixKey, resultSet);
406         napi_value nameSuffixValue = GetResultValue(env, nameSuffixKey, resultSet);
407         napi_value napiFullNameKey = CreateNapiStringValue(env, "fullName");
408         napi_set_property(env, objectElement, napiFullNameKey, fullNameValue);
409         napi_value napiFamilyNameKey = CreateNapiStringValue(env, "familyName");
410         napi_set_property(env, objectElement, napiFamilyNameKey, familyNameValue);
411         napi_value napiFamilyNamePhoneticKey = CreateNapiStringValue(env, "familyNamePhonetic");
412         napi_set_property(env, objectElement, napiFamilyNamePhoneticKey, familyNamePhoneticValue);
413         napi_value napiGivenNameKey = CreateNapiStringValue(env, "givenName");
414         napi_set_property(env, objectElement, napiGivenNameKey, givenNameValue);
415         napi_value napiGivenNamePhoneticKey = CreateNapiStringValue(env, "givenNamePhonetic");
416         napi_set_property(env, objectElement, napiGivenNamePhoneticKey, givenNamePhoneticValue);
417         napi_value napiMiddleNamePhoneticKey = CreateNapiStringValue(env, "middleNamePhonetic");
418         napi_set_property(env, objectElement, napiMiddleNamePhoneticKey, middleNamePhoneticValue);
419         napi_value napiMiddleNameKey = CreateNapiStringValue(env, "middleName");
420         napi_set_property(env, objectElement, napiMiddleNameKey, middleNameValue);
421         napi_value napiNamePrefixKey = CreateNapiStringValue(env, "namePrefix");
422         napi_set_property(env, objectElement, napiNamePrefixKey, namePrefixValue);
423         napi_value napiNameSuffixKey = CreateNapiStringValue(env, "nameSuffix");
424         napi_set_property(env, objectElement, napiNameSuffixKey, nameSuffixValue);
425         napi_value napiElementKey;
426         napi_create_string_utf8(env, name.c_str(), NAPI_AUTO_LENGTH, &napiElementKey);
427         napi_set_property(env, napiObject, napiElementKey, objectElement);
428     }
429 }
430 
ConvertUri( napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)431 void ResultConvert::ConvertUri(
432     napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
433 {
434     if (typeId == PHOTO) {
435         const std::string portrait = "portrait";
436         napi_value objectElement = GetNapiElementObject(env, napiObject, portrait);
437         std::string uri = "detail_info";
438         napi_value uriValue = GetResultValue(env, uri, resultSet);
439         napi_value napiUri = CreateNapiStringValue(env, "uri");
440         napi_set_property(env, objectElement, napiUri, uriValue);
441         napi_value napiElementKey;
442         napi_create_string_utf8(env, portrait.c_str(), NAPI_AUTO_LENGTH, &napiElementKey);
443         napi_set_property(env, napiObject, napiElementKey, objectElement);
444     }
445 }
446 
ConvertEvent( napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)447 void ResultConvert::ConvertEvent(
448     napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
449 {
450     if (typeId == CONTACT_EVENT) {
451         const std::string events = "events";
452         napi_value emailArray = GetNapiElementArray(env, napiObject, events);
453         uint32_t count = 0;
454         napi_get_array_length(env, emailArray, &count);
455         napi_value objectElement;
456         napi_create_object(env, &objectElement);
457         std::string detailInfoKey = "detail_info";
458         std::string customDataKey = "custom_data";
459         std::string extend7Key = "extend7";
460         napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet);
461         napi_value customValue = GetResultValue(env, customDataKey, resultSet);
462         napi_value extend7Value = GetResultValue(env, extend7Key, resultSet);
463         napi_value napiDetailInfoKey = CreateNapiStringValue(env, "eventDate");
464         napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue);
465         napi_value napiLabelNameKey = CreateNapiStringValue(env, "labelName");
466         napi_set_property(env, objectElement, napiLabelNameKey, customValue);
467         napi_value napiLabelIdKey = CreateNapiStringValue(env, "labelId");
468         napi_set_property(env, objectElement, napiLabelIdKey, extend7Value);
469         napi_set_element(env, emailArray, count, objectElement);
470         napi_value napiElementKey;
471         napi_create_string_utf8(env, events.c_str(), NAPI_AUTO_LENGTH, &napiElementKey);
472         napi_set_property(env, napiObject, napiElementKey, emailArray);
473     }
474 }
475 
ConvertGroup( napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)476 void ResultConvert::ConvertGroup(
477     napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
478 {
479     if (typeId == GROUP_MEMBERSHIP) {
480         const std::string groups = "groups";
481         napi_value emailArray = GetNapiElementArray(env, napiObject, groups);
482         uint32_t count = 0;
483         napi_get_array_length(env, emailArray, &count);
484         napi_value objectElement;
485         napi_create_object(env, &objectElement);
486         std::string groupNameKey = "group_name";
487         napi_value groupNameValue = GetResultValue(env, groupNameKey, resultSet);
488         napi_value napiGroupNameKey = CreateNapiStringValue(env, "title");
489         napi_set_property(env, objectElement, napiGroupNameKey, groupNameValue);
490         std::string detailInfoKey = "detail_info";
491         napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet);
492         napi_value napiDetailInfoKey = CreateNapiStringValue(env, "groupId");
493         napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue);
494         napi_value napiElementKey;
495         napi_create_string_utf8(env, groups.c_str(), NAPI_AUTO_LENGTH, &napiElementKey);
496         napi_set_property(env, napiObject, napiElementKey, emailArray);
497     }
498 }
499 
ConvertImAddress( napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)500 void ResultConvert::ConvertImAddress(
501     napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
502 {
503     if (typeId == IM) {
504         const std::string imAddresses = "imAddresses";
505         napi_value imAddressArray = GetNapiElementArray(env, napiObject, imAddresses);
506         uint32_t count = 0;
507         napi_get_array_length(env, imAddressArray, &count);
508         napi_value objectElement;
509         napi_create_object(env, &objectElement);
510         std::string detailInfoKey = "detail_info";
511         std::string customDataKey = "custom_data";
512         std::string extend7Key = "extend7";
513         napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet);
514         napi_value customValue = GetResultValue(env, customDataKey, resultSet);
515         napi_value extend7Value = GetResultValue(env, extend7Key, resultSet);
516         napi_value napiDetailInfoKey = CreateNapiStringValue(env, "imAddress");
517         napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue);
518         napi_value napiLabelNameKey = CreateNapiStringValue(env, "labelName");
519         napi_set_property(env, objectElement, napiLabelNameKey, customValue);
520         napi_value napiLabelIdKey = CreateNapiStringValue(env, "labelId");
521         napi_set_property(env, objectElement, napiLabelIdKey, extend7Value);
522         napi_set_element(env, imAddressArray, count, objectElement);
523         napi_value napiElementKey;
524         napi_create_string_utf8(env, imAddresses.c_str(), NAPI_AUTO_LENGTH, &napiElementKey);
525         napi_set_property(env, napiObject, napiElementKey, imAddressArray);
526     }
527 }
528 
ConvertPhoneNumber( napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)529 void ResultConvert::ConvertPhoneNumber(
530     napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
531 {
532     if (typeId == PHONE) {
533         const std::string phoneNumbers = "phoneNumbers";
534         napi_value phoneNumbersArray = GetNapiElementArray(env, napiObject, phoneNumbers);
535         uint32_t count = 0;
536         napi_get_array_length(env, phoneNumbersArray, &count);
537         napi_value objectElement;
538         napi_create_object(env, &objectElement);
539         std::string detailInfoKey = "detail_info";
540         std::string customDataKey = "custom_data";
541         std::string extend7Key = "extend7";
542         napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet);
543         napi_value customValue = GetResultValue(env, customDataKey, resultSet);
544         napi_value extend7Value = GetResultValue(env, extend7Key, resultSet);
545         napi_value napiDetailInfoKey = CreateNapiStringValue(env, "phoneNumber");
546         napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue);
547         napi_value napiLabelNameKey = CreateNapiStringValue(env, "labelName");
548         napi_set_property(env, objectElement, napiLabelNameKey, customValue);
549         napi_value napiLabelIdKey = CreateNapiStringValue(env, "labelId");
550         napi_set_property(env, objectElement, napiLabelIdKey, extend7Value);
551         napi_set_element(env, phoneNumbersArray, count, objectElement);
552         napi_value napiElementKey;
553         napi_create_string_utf8(env, phoneNumbers.c_str(), NAPI_AUTO_LENGTH, &napiElementKey);
554         napi_set_property(env, napiObject, napiElementKey, phoneNumbersArray);
555     }
556 }
557 
ConvertPostalAddress( napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)558 void ResultConvert::ConvertPostalAddress(
559     napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
560 {
561     if (typeId == POSTAL_ADDRESS) {
562         const std::string postalAddresses = "postalAddresses";
563         napi_value postalAddressArray = GetNapiElementArray(env, napiObject, postalAddresses);
564         uint32_t count = 0;
565         napi_get_array_length(env, postalAddressArray, &count);
566         napi_value objectElement;
567         napi_create_object(env, &objectElement);
568         std::string detailInfoKey = "detail_info";
569         std::string customDataKey = "custom_data";
570         std::string extend7Key = "extend7";
571         napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet);
572         napi_value customValue = GetResultValue(env, customDataKey, resultSet);
573         napi_value extend7Value = GetResultValue(env, extend7Key, resultSet);
574         std::string neighborhoodKey = "neighborhood";
575         std::string poboxKey = "pobox";
576         std::string postcodeKey = "postcode";
577         std::string regionKey = "region";
578         std::string streetKey = "street";
579         std::string cityKey = "city";
580         std::string countryKey = "country";
581         napi_value neighborhoodKeyValue = GetResultValue(env, neighborhoodKey, resultSet);
582         napi_value cityKeyValue = GetResultValue(env, cityKey, resultSet);
583         napi_value countryKeyValue = GetResultValue(env, countryKey, resultSet);
584         napi_value poboxKeyValue = GetResultValue(env, poboxKey, resultSet);
585         napi_value postcodeKeyValue = GetResultValue(env, postcodeKey, resultSet);
586         napi_value regionKeyValue = GetResultValue(env, regionKey, resultSet);
587         napi_value streetKeyValue = GetResultValue(env, streetKey, resultSet);
588         napi_value napiDetailInfoKey = CreateNapiStringValue(env, "postalAddress");
589         napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue);
590         napi_value napiLabelNameKey = CreateNapiStringValue(env, "labelName");
591         napi_set_property(env, objectElement, napiLabelNameKey, customValue);
592         napi_value napiLabelIdKey = CreateNapiStringValue(env, "labelId");
593         napi_set_property(env, objectElement, napiLabelIdKey, extend7Value);
594         napi_set_property(
595             env, objectElement, CreateNapiStringValue(env, neighborhoodKey.c_str()), neighborhoodKeyValue);
596         napi_set_property(env, objectElement, CreateNapiStringValue(env, cityKey.c_str()), cityKeyValue);
597         napi_set_property(env, objectElement, CreateNapiStringValue(env, countryKey.c_str()), countryKeyValue);
598         napi_set_property(env, objectElement, CreateNapiStringValue(env, poboxKey.c_str()), poboxKeyValue);
599         napi_set_property(env, objectElement, CreateNapiStringValue(env, postcodeKey.c_str()), postcodeKeyValue);
600         napi_set_property(env, objectElement, CreateNapiStringValue(env, regionKey.c_str()), regionKeyValue);
601         napi_set_property(env, objectElement, CreateNapiStringValue(env, streetKey.c_str()), streetKeyValue);
602         napi_set_element(env, postalAddressArray, count, objectElement);
603         napi_value napiElementKey = CreateNapiStringValue(env, postalAddresses);
604         napi_set_property(env, napiObject, napiElementKey, postalAddressArray);
605     }
606 }
607 
ConvertRelation( napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)608 void ResultConvert::ConvertRelation(
609     napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
610 {
611     if (typeId == RELATION) {
612         const std::string relations = "relations";
613         napi_value relationsArray = GetNapiElementArray(env, napiObject, relations);
614         uint32_t count = 0;
615         napi_get_array_length(env, relationsArray, &count);
616         napi_value objectElement;
617         napi_create_object(env, &objectElement);
618         std::string detailInfoKey = "detail_info";
619         std::string customDataKey = "custom_data";
620         std::string extend7Key = "extend7";
621         napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet);
622         napi_value customValue = GetResultValue(env, customDataKey, resultSet);
623         napi_value extend7Value = GetResultValue(env, extend7Key, resultSet);
624         napi_value napiDetailInfoKey = CreateNapiStringValue(env, "sipAddress");
625         napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue);
626         napi_value napiLabelNameKey = CreateNapiStringValue(env, "labelName");
627         napi_set_property(env, objectElement, napiLabelNameKey, customValue);
628         napi_value napiLabelIdKey = CreateNapiStringValue(env, "labelId");
629         napi_set_property(env, objectElement, napiLabelIdKey, extend7Value);
630         napi_set_element(env, relationsArray, count, objectElement);
631         napi_value napiElementKey;
632         napi_create_string_utf8(env, relations.c_str(), NAPI_AUTO_LENGTH, &napiElementKey);
633         napi_set_property(env, napiObject, napiElementKey, relationsArray);
634     }
635 }
636 
ConvertSipAddress( napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)637 void ResultConvert::ConvertSipAddress(
638     napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
639 {
640     if (typeId == SIP_ADDRESS) {
641         const std::string sipAddresses = "sipAddresses";
642         napi_value sipAddressArray = GetNapiElementArray(env, napiObject, sipAddresses);
643         uint32_t count = 0;
644         napi_get_array_length(env, sipAddressArray, &count);
645         napi_value objectElement;
646         napi_create_object(env, &objectElement);
647         std::string detailInfoKey = "detail_info";
648         std::string customDataKey = "custom_data";
649         std::string extend7Key = "extend7";
650         napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet);
651         napi_value customValue = GetResultValue(env, customDataKey, resultSet);
652         napi_value extend7Value = GetResultValue(env, extend7Key, resultSet);
653         napi_value napiDetailInfoKey = CreateNapiStringValue(env, "relationName");
654         napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue);
655         napi_value napiLabelNameKey = CreateNapiStringValue(env, "labelName");
656         napi_set_property(env, objectElement, napiLabelNameKey, customValue);
657         napi_value napiLabelIdKey = CreateNapiStringValue(env, "labelId");
658         napi_set_property(env, objectElement, napiLabelIdKey, extend7Value);
659         napi_set_element(env, sipAddressArray, count, objectElement);
660         napi_value napiElementKey;
661         napi_create_string_utf8(env, sipAddresses.c_str(), NAPI_AUTO_LENGTH, &napiElementKey);
662         napi_set_property(env, napiObject, napiElementKey, sipAddressArray);
663     }
664 }
665 
ConvertWebsite( napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)666 void ResultConvert::ConvertWebsite(
667     napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
668 {
669     if (typeId == WEBSITE) {
670         const std::string websites = "websites";
671         napi_value websitesArray = GetNapiElementArray(env, napiObject, websites);
672         uint32_t count = 0;
673         napi_get_array_length(env, websitesArray, &count);
674         napi_value objectElement;
675         napi_create_object(env, &objectElement);
676         std::string detailInfoKey = "detail_info";
677         std::string customDataKey = "custom_data";
678         std::string extend7Key = "extend7";
679         napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet);
680         napi_value customValue = GetResultValue(env, customDataKey, resultSet);
681         napi_value extend7Value = GetResultValue(env, extend7Key, resultSet);
682         napi_value napiDetailInfoKey = CreateNapiStringValue(env, "website");
683         napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue);
684         napi_value napiLabelNameKey = CreateNapiStringValue(env, "labelName");
685         napi_set_property(env, objectElement, napiLabelNameKey, customValue);
686         napi_value napiLabelIdKey = CreateNapiStringValue(env, "labelId");
687         napi_set_property(env, objectElement, napiLabelIdKey, extend7Value);
688         napi_set_element(env, websitesArray, count, objectElement);
689         napi_value napiElementKey;
690         napi_create_string_utf8(env, websites.c_str(), NAPI_AUTO_LENGTH, &napiElementKey);
691         napi_set_property(env, napiObject, napiElementKey, websitesArray);
692     }
693 }
694 
ConvertNickName( napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)695 void ResultConvert::ConvertNickName(
696     napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
697 {
698     if (typeId == NICKNAME) {
699         const std::string nickName = "nickName";
700         napi_value objectElement = GetNapiElementObject(env, napiObject, nickName);
701         std::string name = "detail_info";
702         napi_value uriValue = GetResultValue(env, name, resultSet);
703         napi_value napiUri = CreateNapiStringValue(env, "nickName");
704         napi_set_property(env, objectElement, napiUri, uriValue);
705         napi_value napiElementKey;
706         napi_create_string_utf8(env, nickName.c_str(), NAPI_AUTO_LENGTH, &napiElementKey);
707         napi_set_property(env, napiObject, napiElementKey, objectElement);
708     }
709 }
710 
ConvertNote( napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)711 void ResultConvert::ConvertNote(
712     napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
713 {
714     if (typeId == NOTE) {
715         const std::string note = "note";
716         napi_value objectElement = GetNapiElementObject(env, napiObject, note);
717         std::string name = "detail_info";
718         napi_value noteValue = GetResultValue(env, name, resultSet);
719         napi_value noteKey = CreateNapiStringValue(env, "noteContent");
720         napi_set_property(env, objectElement, noteKey, noteValue);
721         napi_value napiElementKey;
722         napi_create_string_utf8(env, note.c_str(), NAPI_AUTO_LENGTH, &napiElementKey);
723         napi_set_property(env, napiObject, napiElementKey, objectElement);
724     }
725 }
726 
ConvertOrganization( napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)727 void ResultConvert::ConvertOrganization(
728     napi_env env, napi_value napiObject, int &typeId, std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
729 {
730     if (typeId == ORGANIZATION) {
731         const std::string organization = "organization";
732         napi_value objectElement = GetNapiElementObject(env, napiObject, organization);
733         std::string company = "detail_info";
734         std::string position = "position";
735         napi_value companyValue = GetResultValue(env, company, resultSet);
736         napi_value positionValue = GetResultValue(env, position, resultSet);
737         napi_value napiNameValueKey = CreateNapiStringValue(env, "name");
738         napi_set_property(env, objectElement, napiNameValueKey, companyValue);
739         napi_value napiTitleValueKey = CreateNapiStringValue(env, "title");
740         napi_set_property(env, objectElement, napiTitleValueKey, positionValue);
741         napi_value napiElementKey;
742         napi_create_string_utf8(env, organization.c_str(), NAPI_AUTO_LENGTH, &napiElementKey);
743         napi_set_property(env, napiObject, napiElementKey, objectElement);
744     }
745 }
746 } // namespace ContactsApi
747 } // namespace OHOS