4 * Copyright (c) 2010 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
24 #include "ctsvc_internal.h"
25 #include "ctsvc_db_sqlite.h"
26 #include "ctsvc_db_schema.h"
27 #include "ctsvc_db_init.h"
28 #include "ctsvc_db_utils.h"
29 #include "ctsvc_record.h"
30 #include "ctsvc_normalize.h"
31 #include "ctsvc_server_setting.h"
32 #include "ctsvc_localize.h"
33 #include "ctsvc_localize_utils.h"
34 #include "ctsvc_localize_ch.h"
35 #include "ctsvc_notification.h"
36 #include "ctsvc_notify.h"
37 #include "ctsvc_db_access_control.h"
39 #include "ctsvc_db_plugin_contact_helper.h"
40 #include "ctsvc_db_plugin_company_helper.h"
41 #include "ctsvc_db_plugin_name_helper.h"
42 #include "ctsvc_db_plugin_number_helper.h"
43 #include "ctsvc_db_plugin_email_helper.h"
44 #include "ctsvc_db_plugin_event_helper.h"
45 #include "ctsvc_db_plugin_url_helper.h"
46 #include "ctsvc_db_plugin_note_helper.h"
47 #include "ctsvc_db_plugin_profile_helper.h"
48 #include "ctsvc_db_plugin_address_helper.h"
49 #include "ctsvc_db_plugin_nickname_helper.h"
50 #include "ctsvc_db_plugin_messenger_helper.h"
51 #include "ctsvc_db_plugin_relationship_helper.h"
52 #include "ctsvc_db_plugin_image_helper.h"
53 #include "ctsvc_db_plugin_extension_helper.h"
54 #include "ctsvc_db_plugin_sip_helper.h"
56 #include "ctsvc_server_person.h"
57 #include "ctsvc_server_group.h"
59 #ifdef ENABLE_LOG_FEATURE
60 #include "ctsvc_server_phonelog.h"
61 #endif /* ENABLE_LOG_FEATURE */
63 #define CTSVC_CONTACT_INITIAL_DATA_MAX_LEN 128
65 int ctsvc_contact_add_image_file(int parent_id, int img_id,
66 char *src_img, char *dest, int dest_size)
74 RETV_IF(NULL == src_img, CONTACTS_ERROR_INVALID_PARAMETER);
76 ext = strrchr(src_img, '.');
77 if (NULL == ext || strchr(ext, '/'))
80 lower_ext = strdup(ext);
84 return CONTACTS_ERROR_OUT_OF_MEMORY;
87 *temp = tolower(*temp);
91 version = ctsvc_get_next_ver();
92 snprintf(dest, dest_size, "%d_%d-%d%s", parent_id, img_id, version, lower_ext);
95 ret = ctsvc_utils_copy_image(CTSVC_CONTACT_IMG_FULL_LOCATION, src_img, dest);
96 if (CONTACTS_ERROR_NONE != ret) {
97 ERR("ctsvc_utils_copy_image() Fail(%d)", ret);
102 return CONTACTS_ERROR_NONE;
105 static int __ctsvc_contact_get_current_image_file(int image_id, char *dest, int dest_size)
110 char query[CTS_SQL_MIN_LEN] = {0};
112 snprintf(query, sizeof(query), "SELECT data3 FROM %s WHERE id = %d", CTS_TABLE_DATA, image_id);
113 ret = ctsvc_query_prepare(query, &stmt);
114 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
116 ret = ctsvc_stmt_step(stmt);
117 if (1 /*CTS_TRUE*/ != ret) {
118 ERR("DB error: ctsvc_stmt_step() Fail(%d)", ret);
119 ctsvc_stmt_finalize(stmt);
120 if (CONTACTS_ERROR_NONE == ret)
121 return CONTACTS_ERROR_NO_DATA;
126 tmp_path = ctsvc_stmt_get_text(stmt, 0);
128 snprintf(dest, dest_size, "%s/%s", CTSVC_CONTACT_IMG_FULL_LOCATION, tmp_path);
130 ctsvc_stmt_finalize(stmt);
131 return CONTACTS_ERROR_NONE;
135 * check that the image file under location or not
136 * we should check CTSVC_CONTACT_IMG_FULL_LOCATION, CTSVC_VCARD_IMAGE_LOCATION,
137 * CTS_GROUP_IMAGE_LOCATION, CTS_LOGO_IMAGE_LOCATION
139 bool ctsvc_contact_check_image_location(const char *path)
144 if (path == NULL || *path == '\0')
147 slash = strrchr(path, '/');
148 if (slash == NULL || slash == path)
151 len = (int)(slash-path);
152 if (len != strlen(CTSVC_CONTACT_IMG_FULL_LOCATION))
155 if (STRING_EQUAL == strncmp(path, CTSVC_CONTACT_IMG_FULL_LOCATION, len))
161 int ctsvc_contact_update_image_file(int parent_id, int img_id,
162 char *src_img, char *dest_name, int dest_size)
165 char dest[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0};
166 char *thumbnail_path = NULL;
168 ret = __ctsvc_contact_get_current_image_file(img_id, dest, sizeof(dest));
170 WARN_IF(CONTACTS_ERROR_NONE != ret && CONTACTS_ERROR_NO_DATA != ret,
171 "__ctsvc_contact_get_current_image_file() Fail(%d)", ret);
173 if (src_img && STRING_EQUAL == strcmp(dest, src_img)) {
174 snprintf(dest_name, dest_size, "%s", src_img + strlen(CTSVC_CONTACT_IMG_FULL_LOCATION) + 1);
175 return CONTACTS_ERROR_NONE;
180 WARN("unlink() Fail(%d)", errno);
182 /* remove thumbnail */
183 thumbnail_path = ctsvc_utils_get_thumbnail_path(dest);
184 if (thumbnail_path && 0 == access(thumbnail_path, F_OK)) {
185 ret = unlink(thumbnail_path);
187 WARN("unlink() Fail(%d)", errno);
189 free(thumbnail_path);
193 ret = ctsvc_contact_add_image_file(parent_id, img_id, src_img, dest_name, dest_size);
194 RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_contact_add_image_file() Fail(%d)", ret);
200 int ctsvc_db_contact_update_changed_time(int contact_id)
203 char query[CTS_SQL_MIN_LEN] = {0};
205 snprintf(query, sizeof(query),
206 "UPDATE %s SET changed_ver=%d, changed_time=%d WHERE contact_id=%d AND deleted = 0",
207 CTS_TABLE_CONTACTS, ctsvc_get_next_ver(), (int)time(NULL), contact_id);
209 ret = ctsvc_query_exec(query);
210 RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
212 ctsvc_set_contact_noti();
214 return CONTACTS_ERROR_NONE;
217 int ctsvc_contact_delete_image_file_with_path(const unsigned char *image_path)
222 char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0};
223 char *thumbnail_path = NULL;
224 snprintf(full_path, sizeof(full_path), "%s/%s", CTSVC_CONTACT_IMG_FULL_LOCATION, image_path);
225 ret = unlink(full_path);
227 WARN("unlink() Fail(%d)", errno);
229 /* remove thumbnail */
230 thumbnail_path = ctsvc_utils_get_thumbnail_path(full_path);
231 if (thumbnail_path && 0 == access(thumbnail_path, F_OK)) {
232 ret = unlink(thumbnail_path);
234 WARN("unlink() Fail(%d)", errno);
236 free(thumbnail_path);
239 return CONTACTS_ERROR_NONE;
242 int ctsvc_db_contact_delete(int contact_id)
245 int ret, rel_changed;
249 char query[CTS_SQL_MAX_LEN] = {0};
250 cts_stmt stmt = NULL;
253 ret = ctsvc_begin_trans();
254 RETVM_IF(ret, ret, "ctsvc_begin_trans() Fail(%d)", ret);
256 snprintf(query, sizeof(query),
257 "SELECT addressbook_id, person_id "
258 "FROM "CTS_TABLE_CONTACTS" WHERE contact_id = %d AND deleted = 0", contact_id);
260 ret = ctsvc_query_prepare(query, &stmt);
262 ERR("ctsvc_query_prepare() Fail(%d)", ret);
263 ctsvc_end_trans(false);
267 ret = ctsvc_stmt_step(stmt);
269 ERR("ctsvc_stmt_step() Fail(%d)", ret);
270 ctsvc_stmt_finalize(stmt);
271 ctsvc_end_trans(false);
272 if (CONTACTS_ERROR_NONE == ret)
273 return CONTACTS_ERROR_NO_DATA;
278 addressbook_id = ctsvc_stmt_get_int(stmt, 0);
279 person_id = ctsvc_stmt_get_int(stmt, 1);
280 DBG("addressbook_id : %d, person_id : %d", addressbook_id, person_id);
281 ctsvc_stmt_finalize(stmt);
284 if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
285 ERR("No permission in this addresbook_id(%d)", addressbook_id);
286 ctsvc_end_trans(false);
287 return CONTACTS_ERROR_PERMISSION_DENIED;
290 version = ctsvc_get_next_ver();
291 snprintf(query, sizeof(query),
292 "UPDATE %s SET member_changed_ver=%d "
293 "WHERE group_id IN (SELECT group_id FROM %s WHERE contact_id = %d AND deleted = 0) ",
294 CTS_TABLE_GROUPS, version, CTS_TABLE_GROUP_RELATIONS, contact_id);
295 ret = ctsvc_query_exec(query);
296 if (CONTACTS_ERROR_NONE != ret) {
297 ERR("ctsvc_query_exec() Fail(%d)", ret);
298 ctsvc_end_trans(false);
301 rel_changed = ctsvc_db_change();
303 snprintf(query, sizeof(query),
304 "UPDATE %s SET deleted = 1, person_id = 0, changed_ver=%d WHERE contact_id = %d",
305 CTS_TABLE_CONTACTS, version, contact_id);
306 ret = ctsvc_query_exec(query);
307 if (CONTACTS_ERROR_NONE != ret) {
308 ERR("ctsvc_query_exec() Fail(%d)", ret);
309 ctsvc_end_trans(false);
313 snprintf(query, sizeof(query), "SELECT link_count FROM "CTS_TABLE_PERSONS" WHERE person_id = %d", person_id);
314 ret = ctsvc_query_get_first_int_result(query, &link_count);
315 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_query_get_first_int_result() Fail(%d)", ret);
317 * set dirty bit to person by trigger
318 * : person will be aggregated in ctsvc_person_aggregate
321 if (1 < link_count) {
322 ctsvc_person_aggregate(person_id);
324 #ifdef ENABLE_LOG_FEATURE
325 /* update phonelog */
326 ctsvc_db_phone_log_update_person_id(NULL, person_id, -1, false, NULL);
327 #endif /* ENABLE_LOG_FEATURE */
329 ctsvc_set_person_noti();
332 ctsvc_set_contact_noti();
334 ctsvc_set_group_rel_noti();
336 ret = ctsvc_end_trans(true);
337 if (ret < CONTACTS_ERROR_NONE) {
338 ERR("ctsvc_end_trans() Fail(%d)", ret);
341 return CONTACTS_ERROR_NONE;
345 static inline void __ctsvc_contact_get_initial(char *src, char *dest, int dest_size, bool pinyin)
349 int len = strlen(src);
350 for (i = 0; i < len && j < (dest_size-1);) {
355 int char_len = ctsvc_check_utf8(src[i]);
357 for (k = 0; k < char_len && j < (dest_size-1); k++)
358 dest[j++] = src[i++];
359 if (false == pinyin && j < (dest_size-1))
368 static inline void __ctsvc_remove_space(char *src, char *dest, int dest_size)
370 int len = strlen(src);
373 for (i = 0; i < len && i < dest_size; i++) {
374 if (src[i] && src[i] != ' ') {
382 /* make search name to insert search_index table name column
383 * korean : display_name, chosung, phonetic
384 * japanese : dislay_name(hiragana), phonetic
385 * if display_name is chinese and sort_name(phonetic) is japanese,
386 * then search_name is normalized_name and sort_name (phonetic)
387 * chinese : display_name, pinyin name, pinyin initial, phonetic
388 * others : display_name, phonetic
390 int ctsvc_contact_make_search_name(ctsvc_contact_s *contact, char **search_name)
393 char *temp_name = NULL;
396 RETV_IF(NULL == contact, CONTACTS_ERROR_NO_DATA);
398 if (contact->display_name) {
399 if (ctsvc_has_chinese(contact->display_name)) {
400 if (CTSVC_LANG_JAPANESE == ctsvc_check_language_type(contact->sort_name)) {
401 char *normalized_display_name = NULL;
403 ctsvc_normalize_str(contact->display_name, &normalized_display_name);
404 if (normalized_display_name) {
405 buf_size = SAFE_STRLEN(normalized_display_name) + strlen(contact->sort_name) + 2;
406 name = calloc(1, buf_size);
408 ERR("calloc() Fail");
409 free(normalized_display_name);
410 return CONTACTS_ERROR_OUT_OF_MEMORY;
412 snprintf(name, buf_size, "%s %s", normalized_display_name, contact->sort_name);
413 free(normalized_display_name);
416 char *langset = ctsvc_get_langset();
417 if (STRING_EQUAL == strncmp(langset, "zh_CN", strlen("zh_CN"))) {
418 pinyin_name_s *pinyinname;
421 ret = ctsvc_convert_chinese_to_pinyin(contact->display_name, &pinyinname, &size);
422 if (CONTACTS_ERROR_NONE == ret) {
423 int name_len = (CHINESE_PINYIN_SPELL_MAX_LEN*strlen(contact->display_name)+1) *sizeof(char);
424 char *name_nospace = calloc(1, name_len);
425 if (NULL == name_nospace) {
426 ERR("calloc() Fail");
427 ctsvc_pinyin_free(pinyinname, size);
428 return CONTACTS_ERROR_OUT_OF_MEMORY;
430 char *temp_name = NULL;
432 ctsvc_normalize_str(contact->display_name, &name);
434 for (i = 0; i < size; i++) {
435 __ctsvc_remove_space(pinyinname[i].pinyin_name, name_nospace, name_len);
437 buf_size = SAFE_STRLEN(name)
438 + SAFE_STRLEN(pinyinname[i].pinyin_name)
439 + SAFE_STRLEN(name_nospace)
440 + SAFE_STRLEN(pinyinname[i].pinyin_initial)
442 temp_name = calloc(1, buf_size);
443 if (NULL == temp_name) {
444 ERR("calloc() Fail");
446 ctsvc_pinyin_free(pinyinname, size);
448 return CONTACTS_ERROR_OUT_OF_MEMORY;
450 snprintf(temp_name, buf_size, "%s %s %s %s",
451 name, pinyinname[i].pinyin_name, name_nospace, pinyinname[i].pinyin_initial);
457 len = ctsvc_check_utf8(contact->display_name[0]);
458 for (i = len; i < strlen(contact->display_name); i += len) {
459 len = ctsvc_check_utf8(contact->display_name[i]);
461 buf_size = SAFE_STRLEN(name) + SAFE_STRLEN(&contact->display_name[i]) + 2;
462 temp_name = calloc(1, buf_size);
463 if (NULL == temp_name) {
464 ERR("calloc() Fail");
466 ctsvc_pinyin_free(pinyinname, size);
468 return CONTACTS_ERROR_OUT_OF_MEMORY;
470 snprintf(temp_name, buf_size, "%s %s", name, &contact->display_name[i]);
477 ctsvc_pinyin_free(pinyinname, size);
479 char initial[CTSVC_CONTACT_INITIAL_DATA_MAX_LEN] = {0,};
480 char *normalized_display_name = NULL;
482 ctsvc_normalize_str(contact->display_name, &normalized_display_name);
483 if (normalized_display_name) {
484 __ctsvc_contact_get_initial(contact->display_name, initial, sizeof(initial), false);
485 buf_size = SAFE_STRLEN(normalized_display_name) + strlen(initial) + 2;
486 name = calloc(1, buf_size);
488 ERR("calloc() Fail");
489 free(normalized_display_name);
490 return CONTACTS_ERROR_OUT_OF_MEMORY;
492 snprintf(name, buf_size, "%s %s", normalized_display_name, initial);
494 free(normalized_display_name);
498 char initial[CTSVC_CONTACT_INITIAL_DATA_MAX_LEN] = {0,};
499 char *normalized_display_name = NULL;
501 ctsvc_normalize_str(contact->display_name, &normalized_display_name);
502 if (normalized_display_name) {
503 __ctsvc_contact_get_initial(contact->display_name, initial, sizeof(initial), false);
504 buf_size = SAFE_STRLEN(normalized_display_name) + strlen(initial) + 2;
505 name = calloc(1, buf_size);
507 ERR("calloc() Fail");
508 free(normalized_display_name);
509 return CONTACTS_ERROR_OUT_OF_MEMORY;
511 snprintf(name, buf_size, "%s %s", normalized_display_name, initial);
513 free(normalized_display_name);
517 } else if (ctsvc_has_korean(contact->display_name)) {
518 /* 'a가' should be searched by 'ㄱ' */
520 int full_len, chosung_len;
521 char *chosung = calloc(1, strlen(contact->display_name) * 5);
522 if (NULL == chosung) {
523 ERR("calloc() Fail");
524 return CONTACTS_ERROR_OUT_OF_MEMORY;
526 int total_len = strlen(contact->display_name);
528 count = ctsvc_get_chosung(contact->display_name, chosung, strlen(contact->display_name) * 5);
530 ctsvc_normalize_str(contact->display_name, &name);
533 for (i = 0, j = 0; i < total_len; i += full_len, j += chosung_len) {
534 full_len = ctsvc_check_utf8(contact->display_name[i]);
535 chosung_len = ctsvc_check_utf8(chosung[j]);
537 buf_size = SAFE_STRLEN(name) + SAFE_STRLEN(&contact->display_name[i]) + SAFE_STRLEN(&chosung[j]) + 3;
538 temp_name = calloc(1, buf_size);
539 if (NULL == temp_name) {
540 ERR("calloc() Fail");
543 return CONTACTS_ERROR_OUT_OF_MEMORY;
546 snprintf(temp_name, buf_size, "%s %s %s", name, &contact->display_name[i], &chosung[j]);
553 } else if (CTSVC_LANG_JAPANESE == ctsvc_check_language_type(contact->display_name)) {
554 ctsvc_convert_japanese_to_hiragana(contact->display_name, &name);
556 /* Insert 'ABO Â' for 'ÂBC' */
557 char initial[CTSVC_CONTACT_INITIAL_DATA_MAX_LEN] = {0};
558 char *normalized_display_name = NULL;
560 ctsvc_normalize_str(contact->display_name, &normalized_display_name);
561 if (normalized_display_name) {
562 __ctsvc_contact_get_initial(contact->display_name, initial, sizeof(initial), false);
563 buf_size = SAFE_STRLEN(normalized_display_name) + strlen(initial) + 2;
564 name = calloc(1, buf_size);
566 ERR("calloc() Fail");
567 free(normalized_display_name);
568 return CONTACTS_ERROR_OUT_OF_MEMORY;
570 snprintf(name, buf_size, "%s %s", normalized_display_name, initial);
572 free(normalized_display_name);
577 /* append phonetic name */
579 contacts_list_h name_list = (contacts_list_h)contact->name;
580 ctsvc_name_s *name_record;
581 contacts_list_first(name_list);
582 char *phonetic = NULL;
585 contacts_list_get_current_record_p(name_list, (contacts_record_h*)&name_record);
587 buf_size = SAFE_STRLEN(name_record->phonetic_first) + SAFE_STRLEN(name_record->phonetic_last) + SAFE_STRLEN(name_record->phonetic_middle);
589 buf_size += 3; /* for space and null string */
590 phonetic = calloc(1, buf_size);
591 if (NULL == phonetic) {
592 ERR("calloc() Fail");
594 return CONTACTS_ERROR_OUT_OF_MEMORY;
597 if (name_record->phonetic_first)
598 temp_len += snprintf(phonetic, buf_size, "%s", name_record->phonetic_first);
599 if (name_record->phonetic_middle) {
601 temp_len += snprintf(phonetic + temp_len, buf_size - temp_len, " ");
602 temp_len += snprintf(phonetic + temp_len, buf_size - temp_len, "%s", name_record->phonetic_middle);
604 if (name_record->phonetic_last) {
606 temp_len += snprintf(phonetic + temp_len, buf_size - temp_len, " ");
607 temp_len += snprintf(phonetic + temp_len, buf_size - temp_len, "%s", name_record->phonetic_last);
611 buf_size = SAFE_STRLEN(name) + SAFE_STRLEN(phonetic) + 2;
612 temp_name = calloc(1, buf_size);
613 if (NULL == temp_name) {
614 ERR("calloc() Fail");
617 return CONTACTS_ERROR_OUT_OF_MEMORY;
619 snprintf(temp_name, buf_size, "%s %s", name, phonetic);
631 return CONTACTS_ERROR_NONE;
634 static int __ctsvc_make_phonetic_name(ctsvc_name_s *name, char **phonetic, contacts_name_display_order_e order)
636 int len = SAFE_STRLEN(name->phonetic_first) + SAFE_STRLEN(name->phonetic_last) + SAFE_STRLEN(name->phonetic_middle);
638 len += 3; /* for space and null string */
639 *phonetic = calloc(1, len);
640 if (NULL == *phonetic) {
641 ERR("calloc() Fail");
642 return CONTACTS_ERROR_OUT_OF_MEMORY;
646 if (order == CONTACTS_NAME_DISPLAY_ORDER_FIRSTLAST) {
647 if (name->phonetic_first)
648 temp_len += snprintf(*phonetic, len, "%s", name->phonetic_first);
649 if (name->phonetic_middle) {
651 temp_len += snprintf(*phonetic + temp_len, len - temp_len, " ");
652 temp_len += snprintf(*phonetic + temp_len, len - temp_len, "%s", name->phonetic_middle);
654 if (name->phonetic_last) {
656 temp_len += snprintf(*phonetic + temp_len, len - temp_len, " ");
657 temp_len += snprintf(*phonetic + temp_len, len - temp_len, "%s", name->phonetic_last);
660 if (name->phonetic_last)
661 temp_len += snprintf(*phonetic, len, "%s", name->phonetic_last);
662 if (name->phonetic_middle) {
664 temp_len += snprintf(*phonetic + temp_len, len - temp_len, " ");
665 temp_len += snprintf(*phonetic + temp_len, len - temp_len, "%s", name->phonetic_middle);
667 if (name->phonetic_first) {
669 temp_len += snprintf(*phonetic + temp_len, len - temp_len, " ");
670 temp_len += snprintf(*phonetic + temp_len, len - temp_len, "%s", name->phonetic_first);
675 return CONTACTS_ERROR_NONE;
678 static inline int __ctsvc_get_sort_name_to_pinyin(const char *display_name, char **sort_name)
682 pinyin_name_s *pinyinname = NULL;
685 if (false == ctsvc_has_chinese(display_name))
686 return CONTACTS_ERROR_INVALID_PARAMETER;
688 ret = ctsvc_convert_chinese_to_pinyin(display_name, &pinyinname, &size);
690 if (ret == CONTACTS_ERROR_NONE) {
691 char temp[strlen(display_name) * 2 + strlen(pinyinname[0].pinyin_name)];
692 int pinyin_index = 0;
700 if (pinyinname[0].pinyin_name[pinyin_index] == '\0') {
701 if (display_name[name_index] != '\0') {
702 temp[temp_index] = ' ';
704 name_len = ctsvc_check_utf8(display_name[name_index]);
706 memcpy(&(temp[temp_index]), &(display_name[name_index]), name_len);
707 temp_index += name_len;
708 name_index += name_len;
713 pinyin_len = ctsvc_check_utf8(pinyinname[0].pinyin_name[pinyin_index]);
716 memcpy(&(temp[temp_index]), &(pinyinname[0].pinyin_name[pinyin_index]), pinyin_len);
717 temp_index += pinyin_len;
719 if (pinyinname[0].pinyin_name[pinyin_index] == ' ') {
720 name_len = ctsvc_check_utf8(display_name[name_index]);
724 if (name_len == 1 && display_name[name_index] == ' ') {
725 temp[temp_index] = ' ';
729 memcpy(&(temp[temp_index]), &(display_name[name_index]), name_len);
730 temp_index += name_len;
731 name_index += name_len;
732 temp[temp_index] = ' ';
736 pinyin_index += pinyin_len;
738 temp[temp_index] = '\0';
739 *sort_name = strdup(temp);
740 ctsvc_pinyin_free(pinyinname, size);
745 void ctsvc_contact_make_sortkey(ctsvc_contact_s *contact)
747 char *sortkey = NULL;
748 char *phonetic = NULL;
751 if (contact->display_source_type == CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME) {
752 if (0 < contact->name->count && contact->name->records
753 && contact->name->records->data) {
754 ctsvc_name_s *name = (ctsvc_name_s*)contact->name->records->data;
755 __ctsvc_make_phonetic_name(name, &phonetic, CONTACTS_NAME_DISPLAY_ORDER_FIRSTLAST);
760 sort_type = ctsvc_get_name_sort_type(phonetic);
761 else if (contact->sort_name)
762 sort_type = ctsvc_get_name_sort_type(contact->sort_name);
764 sort_type = CTSVC_SORT_OTHERS;
766 WARN_IF(sort_type < 0, "ctsvc_get_name_sort_type Fail(%d)", sort_type);
767 char *langset = ctsvc_get_langset();
772 if (STRING_EQUAL == strncmp(langset, "zh_CN", strlen("zh_CN"))) {
773 /* chinese to pinyin */
776 __ctsvc_get_sort_name_to_pinyin(phonetic, &pinyin);
778 __ctsvc_get_sort_name_to_pinyin(contact->sort_name, &pinyin);
781 free(contact->sort_name);
782 contact->sort_name = pinyin;
783 sort_type = CTSVC_SORT_WESTERN;
785 } else if (STRING_EQUAL == strncmp(langset, "ko_KR", strlen("ko_KR"))) {
786 sort_type = CTSVC_SORT_KOREAN;
790 case CTSVC_SORT_JAPANESE:
792 char *hiragana = NULL;
793 ctsvc_convert_japanese_to_hiragana(contact->sort_name, &hiragana);
796 free(contact->sort_name);
797 contact->sort_name = hiragana;
804 FREEandSTRDUP(contact->sort_name, phonetic);
812 if (ctsvc_get_primary_sort() == sort_type)
813 contact->display_name_language = CTSVC_SORT_PRIMARY;
814 else if (ctsvc_get_secondary_sort() == sort_type)
815 contact->display_name_language = CTSVC_SORT_SECONDARY;
816 else if (sort_type < 0)
817 contact->display_name_language = CTSVC_SORT_OTHERS;
819 contact->display_name_language = sort_type;
822 * check reverse sort_name, reverser_display_name_language
823 * make reverse phonetic name
825 if (contact->display_source_type == CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME) {
826 if (0 < contact->name->count && contact->name->records
827 && contact->name->records->data) {
828 ctsvc_name_s *name = (ctsvc_name_s*)contact->name->records->data;
829 __ctsvc_make_phonetic_name(name, &phonetic, CONTACTS_NAME_DISPLAY_ORDER_LASTFIRST);
834 sort_type = ctsvc_get_name_sort_type(phonetic);
835 else if (contact->reverse_sort_name)
836 sort_type = ctsvc_get_name_sort_type(contact->reverse_sort_name);
838 sort_type = CTSVC_SORT_OTHERS;
840 WARN_IF(sort_type < 0, "ctsvc_get_name_sort_type Fail(%d)", sort_type);
845 if (STRING_EQUAL == strncmp(langset, "zh_CN", strlen("zh_CN"))) {
848 __ctsvc_get_sort_name_to_pinyin(phonetic, &pinyin);
850 __ctsvc_get_sort_name_to_pinyin(contact->reverse_sort_name, &pinyin);
853 free(contact->reverse_sort_name);
854 contact->reverse_sort_name = pinyin;
855 sort_type = CTSVC_SORT_WESTERN;
857 } else if (STRING_EQUAL == strncmp(langset, "ko_KR", strlen("ko_KR"))) {
858 sort_type = CTSVC_SORT_KOREAN;
862 case CTSVC_SORT_JAPANESE:
864 char *hiragana = NULL;
865 ctsvc_convert_japanese_to_hiragana(contact->reverse_sort_name, &hiragana);
868 free(contact->reverse_sort_name);
869 contact->reverse_sort_name = hiragana;
876 FREEandSTRDUP(contact->reverse_sort_name, phonetic);
884 if (ctsvc_get_primary_sort() == sort_type)
885 contact->reverse_display_name_language = CTSVC_SORT_PRIMARY;
886 else if (ctsvc_get_secondary_sort() == sort_type)
887 contact->reverse_display_name_language = CTSVC_SORT_SECONDARY;
888 else if (sort_type < 0)
889 contact->reverse_display_name_language = CTSVC_SORT_OTHERS;
891 contact->reverse_display_name_language = sort_type;
893 if (contact->sort_name) {
894 sort_type = ctsvc_collation_str(contact->sort_name, &sortkey);
895 if (CONTACTS_ERROR_NONE == sort_type)
896 contact->sortkey = sortkey;
903 if (contact->reverse_sort_name) {
904 sort_type = ctsvc_collation_str(contact->reverse_sort_name, &sortkey);
905 if (CONTACTS_ERROR_NONE == sort_type)
906 contact->reverse_sortkey = sortkey;
912 static bool __ctsvc_contact_check_name_has_korean(const ctsvc_name_s *name)
914 if (name->first && ctsvc_has_korean(name->first))
916 else if (name->last && ctsvc_has_korean(name->last))
918 else if (name->addition && ctsvc_has_korean(name->addition))
920 else if (name->prefix && ctsvc_has_korean(name->prefix))
922 else if (name->suffix && ctsvc_has_korean(name->suffix))
928 static bool __ctsvc_contact_check_name_has_japanese(const ctsvc_name_s *name)
930 if (name->first && ctsvc_check_language_type(name->first) == CTSVC_LANG_JAPANESE)
932 else if (name->addition && ctsvc_check_language_type(name->addition) == CTSVC_LANG_JAPANESE)
934 else if (name->last && ctsvc_check_language_type(name->last) == CTSVC_LANG_JAPANESE)
940 static bool __ctsvc_contact_check_name_has_chinese(const ctsvc_name_s *name)
942 if (name->first && ctsvc_check_language_type(name->first) == CTSVC_LANG_CHINESE)
944 else if (name->addition && ctsvc_check_language_type(name->addition) == CTSVC_LANG_CHINESE)
946 else if (name->last && ctsvc_check_language_type(name->last) == CTSVC_LANG_CHINESE)
952 int ctsvc_contact_get_name_language(const ctsvc_name_s *name)
955 if (__ctsvc_contact_check_name_has_korean(name))
956 lang = CTSVC_LANG_KOREAN;
957 else if (__ctsvc_contact_check_name_has_japanese(name))
958 lang = CTSVC_LANG_JAPANESE;
959 else if (__ctsvc_contact_check_name_has_chinese(name))
960 lang = CTSVC_LANG_CHINESE;
963 lang = ctsvc_check_language_type(name->last);
964 else if (name->first)
965 lang = ctsvc_check_language_type(name->first);
966 else if (name->addition)
967 lang = ctsvc_check_language_type(name->addition);
973 char* __ctsvc_remove_first_space(char *src)
975 if (src == NULL || SAFE_STRLEN(src) == 0)
978 int name_len = (SAFE_STRLEN(src)+1)*sizeof(char);
979 char *name_nospace = NULL;
980 name_nospace = calloc(1, name_len);
981 if (NULL == name_nospace) {
982 ERR("calloc() Fail");
986 int len = strlen(src);
989 for (i = 0; i < len && i < name_len; i++) {
990 if (src[i] && src[i] != ' ') {
991 strncpy(name_nospace, src+i, name_len);
998 * Make display_name, sort_name, sortkey of the contact by name record
999 * If the contact record does not have name record,
1000 * we use company, nickname, number, email record in order
1002 void ctsvc_contact_make_display_name(ctsvc_contact_s *contact)
1005 ctsvc_name_s *name = NULL;
1007 free(contact->display_name);
1008 contact->display_name = NULL;
1010 free(contact->reverse_display_name);
1011 contact->reverse_display_name = NULL;
1013 free(contact->sort_name);
1014 contact->sort_name = NULL;
1016 free(contact->reverse_sort_name);
1017 contact->reverse_sort_name = NULL;
1019 free(contact->sortkey);
1020 contact->sortkey = NULL;
1022 free(contact->reverse_sortkey);
1023 contact->reverse_sortkey = NULL;
1025 contact->display_name_language = CTSVC_SORT_OTHERS;
1026 contact->reverse_display_name_language = CTSVC_SORT_OTHERS;
1028 contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_INVALID;
1030 if (0 < contact->name->count && contact->name->records
1031 && contact->name->records->data) {
1032 name = (ctsvc_name_s*)contact->name->records->data;
1035 if (name && (name->first || name->last || name->prefix || name->addition
1037 int reverse_lang_type = -1;
1039 int temp_display_len;
1040 char *display = NULL;
1041 char *temp_display = NULL;
1044 * Make reverse display name (Last name first)
1045 * Default : Prefix Last, First Middle(addition), Suffix
1046 * Korean, Chinese : Prefix LastMiddleFirstSuffix
1047 * Japanese : Prefix Last Middle First Suffix
1048 * reverse sort name does not include prefix
1049 * But, if there is only prefix, reverse sort_name is prefix
1051 temp_display_len = SAFE_STRLEN(name->first)
1052 + SAFE_STRLEN(name->addition)
1053 + SAFE_STRLEN(name->last)
1054 + SAFE_STRLEN(name->suffix);
1055 if (0 < temp_display_len) {
1056 temp_display_len += 7;
1057 temp_display = calloc(1, temp_display_len);
1058 if (NULL == temp_display) {
1059 ERR("calloc() Fail");
1064 /* get language type */
1065 reverse_lang_type = ctsvc_contact_get_name_language(name);
1067 char *temp = __ctsvc_remove_first_space(name->last);
1068 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1070 if (reverse_lang_type != CTSVC_LANG_KOREAN &&
1071 reverse_lang_type != CTSVC_LANG_CHINESE &&
1072 reverse_lang_type != CTSVC_LANG_JAPANESE) {
1073 if (name->first || name->addition)
1074 len += snprintf(temp_display + len, temp_display_len - len, ",");
1078 if (reverse_lang_type == CTSVC_LANG_JAPANESE) {
1079 /* make temp_display name Prefix - Last - Middle - First - Suffix */
1080 if (name->addition) {
1081 char *temp = __ctsvc_remove_first_space(name->addition);
1083 len += snprintf(temp_display + len, temp_display_len - len, " ");
1084 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1089 char *temp = __ctsvc_remove_first_space(name->first);
1091 len += snprintf(temp_display + len, temp_display_len - len, " ");
1092 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1095 } else if (reverse_lang_type == CTSVC_LANG_CHINESE || reverse_lang_type == CTSVC_LANG_KOREAN) {
1096 if (name->addition) {
1097 char *temp = __ctsvc_remove_first_space(name->addition);
1098 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1103 char *temp = __ctsvc_remove_first_space(name->first);
1104 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1108 /* make temp_display name Prefix - Last - First - Middle - Suffix */
1110 if (*temp_display) {
1111 if (reverse_lang_type < 0)
1112 reverse_lang_type = ctsvc_check_language_type(temp_display);
1114 if (reverse_lang_type != CTSVC_LANG_KOREAN &&
1115 reverse_lang_type != CTSVC_LANG_CHINESE)
1116 len += snprintf(temp_display + len, temp_display_len - len, " ");
1118 char *temp = __ctsvc_remove_first_space(name->first);
1119 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1123 if (name->addition) {
1124 if (*temp_display) {
1125 if (reverse_lang_type < 0)
1126 reverse_lang_type = ctsvc_check_language_type(temp_display);
1128 if (reverse_lang_type != CTSVC_LANG_KOREAN &&
1129 reverse_lang_type != CTSVC_LANG_CHINESE)
1130 len += snprintf(temp_display + len, temp_display_len - len, " ");
1132 char *temp = __ctsvc_remove_first_space(name->addition);
1133 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1139 if (*temp_display) {
1140 if (reverse_lang_type < 0)
1141 reverse_lang_type = ctsvc_check_language_type(temp_display);
1143 if (reverse_lang_type == CTSVC_LANG_JAPANESE)
1144 len += snprintf(temp_display + len, temp_display_len - len, " ");
1145 else if (reverse_lang_type != CTSVC_LANG_KOREAN &&
1146 reverse_lang_type != CTSVC_LANG_CHINESE)
1147 len += snprintf(temp_display + len, temp_display_len - len, ", ");
1149 char *temp = __ctsvc_remove_first_space(name->suffix);
1150 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1155 if (name->prefix && temp_display) {
1156 display_len = SAFE_STRLEN(name->prefix) + temp_display_len + 2;
1157 display = calloc(1, display_len);
1158 if (NULL == display) {
1159 ERR("calloc() Fail");
1163 char *temp = __ctsvc_remove_first_space(name->prefix);
1164 snprintf(display, display_len, "%s %s", temp, temp_display);
1166 contact->reverse_display_name = display;
1167 contact->reverse_sort_name = temp_display;
1168 } else if (temp_display) {
1169 contact->reverse_display_name = temp_display;
1170 contact->reverse_sort_name = strdup(temp_display);
1171 } else if (name->prefix) {
1172 contact->reverse_display_name = strdup(name->prefix);
1173 contact->reverse_sort_name = strdup(name->prefix);
1177 * Make display name (First name first)
1178 * Default : Prefix First Middle Last, Suffix
1179 * Korean, Chinese : Prefix LastFirstMiddleSuffix (Same as reverse display name)
1180 * Japanese : Prefix First Middle Last Suffix
1181 * sort name does not include prefix
1182 * But, if there is only prefix, sort_name is prefix
1184 if (reverse_lang_type == CTSVC_LANG_KOREAN ||
1185 reverse_lang_type == CTSVC_LANG_CHINESE ||
1186 reverse_lang_type == CTSVC_LANG_JAPANESE) {
1187 contact->display_name = strdup(contact->reverse_display_name);
1188 contact->sort_name = SAFE_STRDUP(contact->reverse_sort_name);
1191 temp_display = NULL;
1192 temp_display_len = SAFE_STRLEN(name->first)
1193 + SAFE_STRLEN(name->addition)
1194 + SAFE_STRLEN(name->last)
1195 + SAFE_STRLEN(name->suffix);
1196 if (0 < temp_display_len) {
1197 temp_display_len += 6;
1198 /* make reverse_temp_display_name */
1199 temp_display = calloc(1, temp_display_len);
1200 if (NULL == temp_display) {
1201 ERR("calloc() Fail");
1207 char *temp = __ctsvc_remove_first_space(name->first);
1208 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1212 if (name->addition) {
1213 char *temp = __ctsvc_remove_first_space(name->addition);
1215 len += snprintf(temp_display + len, temp_display_len - len, " ");
1216 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1221 char *temp = __ctsvc_remove_first_space(name->last);
1223 len += snprintf(temp_display + len, temp_display_len - len, " ");
1224 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1229 if (*temp_display) {
1230 lang_type = ctsvc_check_language_type(temp_display);
1231 if (lang_type == CTSVC_LANG_JAPANESE)
1232 len += snprintf(temp_display + len, temp_display_len - len, " ");
1234 len += snprintf(temp_display + len, temp_display_len - len, ", ");
1236 char *temp = __ctsvc_remove_first_space(name->suffix);
1237 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1242 if (name->prefix && temp_display) {
1243 display_len = SAFE_STRLEN(name->prefix) + temp_display_len + 2;
1244 display = calloc(1, display_len);
1245 if (NULL == display) {
1246 ERR("calloc() Fail");
1250 snprintf(display, display_len, "%s %s", name->prefix, temp_display);
1251 contact->display_name = display;
1252 contact->sort_name = temp_display;
1253 } else if (temp_display) {
1254 contact->display_name = temp_display;
1255 contact->sort_name = strdup(temp_display);
1256 } else if (name->prefix) {
1257 contact->display_name = strdup(name->prefix);
1258 contact->sort_name = strdup(name->prefix);
1262 ctsvc_record_set_property_flag((ctsvc_record_s*)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY);
1263 contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME;
1266 if (contact->company && contact->company->records) {
1267 for (cur = contact->company->records; cur; cur = cur->next) {
1268 ctsvc_company_s *company = cur->data;
1269 if (company && company->name) {
1270 ctsvc_record_set_property_flag((ctsvc_record_s*)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY);
1271 contact->display_name = SAFE_STRDUP(company->name);
1272 contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY;
1278 if (false == ctsvc_record_check_property_flag((ctsvc_record_s*)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY) &&
1279 contact->nicknames && contact->nicknames->records) {
1280 for (cur = contact->nicknames->records; cur; cur = cur->next) {
1281 ctsvc_nickname_s *nickname = cur->data;
1282 if (nickname && nickname->nickname) {
1283 ctsvc_record_set_property_flag((ctsvc_record_s*)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY);
1284 free(contact->display_name);
1285 contact->display_name = SAFE_STRDUP(nickname->nickname);
1286 contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME;
1292 if (false == ctsvc_record_check_property_flag((ctsvc_record_s*)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY) &&
1293 contact->numbers && contact->numbers->records) {
1294 for (cur = contact->numbers->records; cur; cur = cur->next) {
1295 ctsvc_number_s *number = cur->data;
1296 if (number && number->number) {
1297 ctsvc_record_set_property_flag((ctsvc_record_s*)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY);
1298 free(contact->display_name);
1299 contact->display_name = SAFE_STRDUP(number->number);
1300 contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NUMBER;
1306 if (false == ctsvc_record_check_property_flag((ctsvc_record_s*)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY) &&
1307 contact->emails && contact->emails->records) {
1308 for (cur = contact->emails->records; cur; cur = cur->next) {
1309 ctsvc_email_s *email = cur->data;
1310 if (email && email->email_addr) {
1311 ctsvc_record_set_property_flag((ctsvc_record_s*)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY);
1312 free(contact->display_name);
1313 contact->display_name = SAFE_STRDUP(email->email_addr);
1314 contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_EMAIL;
1320 if (ctsvc_record_check_property_flag((ctsvc_record_s*)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY)) {
1321 contact->reverse_display_name = SAFE_STRDUP(contact->display_name);
1322 contact->sort_name = SAFE_STRDUP(contact->display_name);
1323 contact->reverse_sort_name = SAFE_STRDUP(contact->display_name);
1325 /* Update as NULL */
1326 ctsvc_record_set_property_flag((ctsvc_record_s*)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY);
1331 if (ctsvc_record_check_property_flag((ctsvc_record_s*)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY))
1332 ctsvc_contact_make_sortkey(contact);
1337 int ctsvc_get_data_info_name(cts_stmt stmt, contacts_list_h name_list)
1341 contacts_record_h record;
1343 ret = contacts_list_get_count(name_list, &count);
1344 RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_list_get_count Fail(%d)", ret);
1345 RETVM_IF(1 < count, CONTACTS_ERROR_INVALID_PARAMETER, "already had name");
1347 ctsvc_db_name_get_value_from_stmt(stmt, &record, 1);
1348 contacts_list_add(name_list, record);
1350 return CONTACTS_ERROR_NONE;
1353 int ctsvc_get_data_info_event(cts_stmt stmt, contacts_list_h list)
1355 contacts_record_h record;
1357 ctsvc_db_event_get_value_from_stmt(stmt, &record, 1);
1358 contacts_list_add(list, record);
1360 return CONTACTS_ERROR_NONE;
1363 int ctsvc_get_data_info_number(cts_stmt stmt, contacts_list_h number_list)
1365 contacts_record_h record;
1367 ctsvc_db_number_get_value_from_stmt(stmt, &record, 1);
1368 contacts_list_add(number_list, record);
1370 return CONTACTS_ERROR_NONE;
1373 int ctsvc_get_data_info_email(cts_stmt stmt, contacts_list_h list)
1375 contacts_record_h record;
1377 ctsvc_db_email_get_value_from_stmt(stmt, &record, 1);
1378 contacts_list_add(list, record);
1380 return CONTACTS_ERROR_NONE;
1383 int ctsvc_get_data_info_address(cts_stmt stmt, contacts_list_h list)
1385 contacts_record_h record;
1387 ctsvc_db_address_get_value_from_stmt(stmt, &record, 1);
1388 contacts_list_add(list, record);
1390 return CONTACTS_ERROR_NONE;
1393 int ctsvc_get_data_info_messenger(cts_stmt stmt, contacts_list_h list)
1395 contacts_record_h record;
1397 ctsvc_db_messenger_get_value_from_stmt(stmt, &record, 1);
1398 contacts_list_add(list, record);
1400 return CONTACTS_ERROR_NONE;
1403 int ctsvc_get_data_info_note(cts_stmt stmt, contacts_list_h list)
1405 contacts_record_h record;
1407 ctsvc_db_note_get_value_from_stmt(stmt, &record, 1);
1408 contacts_list_add(list, record);
1410 return CONTACTS_ERROR_NONE;
1413 int ctsvc_get_data_info_company(cts_stmt stmt, contacts_list_h list)
1415 contacts_record_h record;
1417 ctsvc_db_company_get_value_from_stmt(stmt, &record, 1);
1418 contacts_list_add(list, record);
1420 return CONTACTS_ERROR_NONE;
1423 int ctsvc_get_data_info_profile(cts_stmt stmt, contacts_list_h list)
1425 contacts_record_h record;
1427 ctsvc_db_profile_get_value_from_stmt(stmt, &record, 1);
1428 contacts_list_add(list, record);
1430 return CONTACTS_ERROR_NONE;
1433 int ctsvc_get_data_info_relationship(cts_stmt stmt, contacts_list_h list)
1435 contacts_record_h record;
1437 ctsvc_db_relationship_get_value_from_stmt(stmt, &record, 1);
1438 contacts_list_add(list, record);
1440 return CONTACTS_ERROR_NONE;
1443 int ctsvc_get_data_info_image(cts_stmt stmt, contacts_list_h list)
1445 contacts_record_h record;
1447 ctsvc_db_image_get_value_from_stmt(stmt, &record, 1);
1448 contacts_list_add(list, record);
1450 return CONTACTS_ERROR_NONE;
1453 int ctsvc_get_data_info_url(cts_stmt stmt, contacts_list_h list)
1455 contacts_record_h record;
1457 ctsvc_db_url_get_value_from_stmt(stmt, &record, 1);
1458 contacts_list_add(list, record);
1460 return CONTACTS_ERROR_NONE;
1463 int ctsvc_get_data_info_nickname(cts_stmt stmt, contacts_list_h list)
1465 contacts_record_h record;
1467 ctsvc_db_nickname_get_value_from_stmt(stmt, &record, 1);
1468 contacts_list_add(list, record);
1470 return CONTACTS_ERROR_NONE;
1473 int ctsvc_get_data_info_extension(cts_stmt stmt, contacts_list_h list)
1475 contacts_record_h record;
1477 ctsvc_db_extension_get_value_from_stmt(stmt, &record, 1);
1478 contacts_list_add(list, record);
1480 return CONTACTS_ERROR_NONE;
1483 int ctsvc_get_data_info_sip(cts_stmt stmt, contacts_list_h list)
1485 contacts_record_h record;
1487 ctsvc_db_sip_get_value_from_stmt(stmt, &record, 1);
1488 contacts_list_add(list, record);
1490 return CONTACTS_ERROR_NONE;
1493 bool ctsvc_contact_check_default_number(contacts_list_h number_list)
1495 bool has_default = false;
1496 ctsvc_number_s *number;
1500 RETV_IF(NULL == number_list, false);
1502 ret = contacts_list_get_count(number_list, &count);
1503 if (CONTACTS_ERROR_NONE != ret || 0 == count)
1506 contacts_list_first(number_list);
1508 contacts_list_get_current_record_p(number_list, (contacts_record_h*)&number);
1509 if (number && number->number && *number->number) {
1510 if (number->is_default && false == has_default)
1512 else if (has_default)
1513 number->is_default = false;
1515 } while (CONTACTS_ERROR_NONE == contacts_list_next(number_list));
1517 if (false == has_default) {
1518 contacts_list_first(number_list);
1520 contacts_list_get_current_record_p(number_list, (contacts_record_h*)&number);
1521 if (number && number->number && *number->number) {
1522 number->is_default = true;
1523 ctsvc_record_set_property_flag((ctsvc_record_s*)number, _contacts_number.is_default, CTSVC_PROPERTY_FLAG_DIRTY);
1527 } while (CONTACTS_ERROR_NONE == contacts_list_next(number_list));
1532 bool ctsvc_contact_check_default_email(contacts_list_h email_list)
1534 bool has_default = false;
1535 ctsvc_email_s *email;
1539 RETV_IF(NULL == email_list, false);
1541 ret = contacts_list_get_count(email_list, &count);
1542 if (CONTACTS_ERROR_NONE != ret || 0 == count)
1545 contacts_list_first(email_list);
1547 contacts_list_get_current_record_p(email_list, (contacts_record_h*)&email);
1548 if (email && email->email_addr && *email->email_addr) {
1549 if (email->is_default && false == has_default)
1551 else if (has_default)
1552 email->is_default = false;
1554 } while (CONTACTS_ERROR_NONE == contacts_list_next(email_list));
1556 if (false == has_default) {
1557 contacts_list_first(email_list);
1559 contacts_list_get_current_record_p(email_list, (contacts_record_h*)&email);
1560 if (email && email->email_addr && *email->email_addr) {
1561 email->is_default = true;
1562 ctsvc_record_set_property_flag((ctsvc_record_s*)email, _contacts_email.is_default, CTSVC_PROPERTY_FLAG_DIRTY);
1566 } while (CONTACTS_ERROR_NONE == contacts_list_next(email_list));
1571 bool ctsvc_contact_check_default_image(contacts_list_h image_list)
1573 bool has_default = false;
1574 ctsvc_image_s *image;
1578 RETV_IF(NULL == image_list, false);
1580 ret = contacts_list_get_count(image_list, &count);
1581 if (CONTACTS_ERROR_NONE != ret || 0 == count) {
1582 DBG("list get count Fail(%d)", count);
1586 contacts_list_first(image_list);
1588 contacts_list_get_current_record_p(image_list, (contacts_record_h*)&image);
1589 if (image && image->path && *image->path) {
1590 if (image->is_default && false == has_default)
1592 else if (has_default)
1593 image->is_default = false;
1595 } while (CONTACTS_ERROR_NONE == contacts_list_next(image_list));
1597 if (false == has_default) {
1598 contacts_list_first(image_list);
1600 contacts_list_get_current_record_p(image_list, (contacts_record_h*)&image);
1601 if (image && image->path && *image->path) {
1602 image->is_default = true;
1603 ctsvc_record_set_property_flag((ctsvc_record_s*)image, _contacts_image.is_default, CTSVC_PROPERTY_FLAG_DIRTY);
1607 } while (CONTACTS_ERROR_NONE == contacts_list_next(image_list));
1609 return CONTACTS_ERROR_NONE;
1612 bool ctsvc_contact_check_default_address(contacts_list_h address_list)
1614 bool has_default = false;
1615 ctsvc_address_s *address;
1619 RETV_IF(NULL == address_list, false);
1621 ret = contacts_list_get_count(address_list, &count);
1622 if (CONTACTS_ERROR_NONE != ret || 0 == count) {
1623 DBG("list get count Fail(%d)", count);
1627 contacts_list_first(address_list);
1629 contacts_list_get_current_record_p(address_list, (contacts_record_h*)&address);
1631 (address->pobox || address->postalcode || address->region || address->locality
1632 || address->street || address->extended || address->country)) {
1633 if (address->is_default && false == has_default)
1635 else if (has_default)
1636 address->is_default = false;
1638 } while (CONTACTS_ERROR_NONE == contacts_list_next(address_list));
1640 if (false == has_default) {
1641 contacts_list_first(address_list);
1643 contacts_list_get_current_record_p(address_list, (contacts_record_h*)&address);
1645 (address->pobox || address->postalcode || address->region || address->locality
1646 || address->street || address->extended || address->country)) {
1647 address->is_default = true;
1648 ctsvc_record_set_property_flag((ctsvc_record_s*)address, _contacts_address.is_default, CTSVC_PROPERTY_FLAG_DIRTY);
1652 } while (CONTACTS_ERROR_NONE == contacts_list_next(address_list));
1654 return CONTACTS_ERROR_NONE;
1657 int ctsvc_contact_update_data_name(contacts_list_h name_list, int contact_id, bool is_my_profile)
1660 int ret = CONTACTS_ERROR_NONE;
1661 contacts_record_h record;
1663 ctsvc_list_s *list = (ctsvc_list_s*)name_list;
1665 RETV_IF(NULL == name_list, CONTACTS_ERROR_INVALID_PARAMETER);
1667 for (cursor = list->deleted_records; cursor; cursor = cursor->next) {
1668 name = cursor->data;
1669 ctsvc_db_name_delete(name->id, is_my_profile);
1672 contacts_list_first(name_list);
1673 contacts_list_get_current_record_p(name_list, &record);
1675 name = (ctsvc_name_s*)record;
1677 if (name->first || name->last || name->addition || name->prefix || name->suffix
1678 || name->phonetic_first || name->phonetic_middle || name->phonetic_last) {
1679 ret = ctsvc_db_name_update(record, is_my_profile);
1681 ret = ctsvc_db_name_delete(name->id, is_my_profile);
1684 ret = ctsvc_db_name_insert(record, contact_id, is_my_profile, NULL);
1686 if (CONTACTS_ERROR_DB == ret)
1687 ERR("return(%d)", ret);
1693 int ctsvc_contact_update_data_company(contacts_list_h company_list, int contact_id, bool is_my_profile)
1696 int ret = CONTACTS_ERROR_NONE;
1697 contacts_record_h record = NULL;
1699 ctsvc_list_s *list = (ctsvc_list_s*)company_list;
1700 ctsvc_company_s *company;
1703 RETV_IF(NULL == company_list, CONTACTS_ERROR_INVALID_PARAMETER);
1705 for (cursor = list->deleted_records; cursor; cursor = cursor->next) {
1706 company = cursor->data;
1707 ctsvc_db_company_delete(company->id, is_my_profile);
1710 ret = contacts_list_get_count(company_list, &count);
1712 return CONTACTS_ERROR_NONE;
1714 contacts_list_first(company_list);
1716 contacts_list_get_current_record_p(company_list, &record);
1717 company = (ctsvc_company_s*)record;
1718 if (0 < company->id) {
1719 if (company->name || company->department || company->job_title || company->role
1720 || company->assistant_name || company->logo || company->location || company->description
1721 || company->phonetic_name) {
1722 ret = ctsvc_db_company_update(record, contact_id, is_my_profile);
1724 ret = ctsvc_db_company_delete(company->id, is_my_profile);
1727 ret = ctsvc_db_company_insert(record, contact_id, is_my_profile, NULL);
1729 if (CONTACTS_ERROR_DB == ret) {
1730 ERR("return (%d)", ret);
1733 } while (CONTACTS_ERROR_NONE == contacts_list_next(company_list));
1738 int ctsvc_contact_update_data_note(contacts_list_h note_list, int contact_id, bool is_my_profile)
1741 int ret = CONTACTS_ERROR_NONE;
1742 contacts_record_h record = NULL;
1744 ctsvc_list_s *list = (ctsvc_list_s*)note_list;
1748 RETV_IF(NULL == note_list, CONTACTS_ERROR_INVALID_PARAMETER);
1750 for (cursor = list->deleted_records; cursor; cursor = cursor->next) {
1751 note = cursor->data;
1752 ctsvc_db_note_delete(note->id, is_my_profile);
1755 ret = contacts_list_get_count(note_list, &count);
1757 return CONTACTS_ERROR_NONE;
1759 contacts_list_first(note_list);
1761 contacts_list_get_current_record_p(note_list, &record);
1762 note = (ctsvc_note_s*)record;
1765 ret = ctsvc_db_note_update(record, is_my_profile);
1767 ret = ctsvc_db_note_delete(note->id, is_my_profile);
1769 ret = ctsvc_db_note_insert(record, contact_id, is_my_profile, NULL);
1771 if (CONTACTS_ERROR_DB == ret) {
1772 ERR("return (%d)", ret);
1775 } while (CONTACTS_ERROR_NONE == contacts_list_next(note_list));
1780 int ctsvc_contact_update_data_event(contacts_list_h event_list, int contact_id, bool is_my_profile)
1783 int ret = CONTACTS_ERROR_NONE;
1784 contacts_record_h record = NULL;
1786 ctsvc_list_s *list = (ctsvc_list_s*)event_list;
1787 ctsvc_event_s *event;
1790 RETV_IF(NULL == event_list, CONTACTS_ERROR_INVALID_PARAMETER);
1792 for (cursor = list->deleted_records; cursor; cursor = cursor->next) {
1793 event = cursor->data;
1794 ctsvc_db_event_delete(event->id, is_my_profile);
1797 ret = contacts_list_get_count(event_list, &count);
1799 return CONTACTS_ERROR_NONE;
1801 contacts_list_first(event_list);
1803 contacts_list_get_current_record_p(event_list, &record);
1804 event = (ctsvc_event_s*)record;
1805 if (0 < event->id) {
1806 if (0 < event->date)
1807 ret = ctsvc_db_event_update(record, is_my_profile);
1809 ret = ctsvc_db_event_delete(event->id, is_my_profile);
1811 ret = ctsvc_db_event_insert(record, contact_id, is_my_profile, NULL);
1813 if (CONTACTS_ERROR_DB == ret) {
1814 ERR("return (%d)", ret);
1817 } while (CONTACTS_ERROR_NONE == contacts_list_next(event_list));
1822 int ctsvc_contact_update_data_messenger(contacts_list_h messenger_list, int contact_id, bool is_my_profile)
1825 int ret = CONTACTS_ERROR_NONE;
1826 contacts_record_h record = NULL;
1828 ctsvc_list_s *list = (ctsvc_list_s*)messenger_list;
1829 ctsvc_messenger_s *messenger;
1832 RETV_IF(NULL == messenger_list, CONTACTS_ERROR_INVALID_PARAMETER);
1834 for (cursor = list->deleted_records; cursor; cursor = cursor->next) {
1835 messenger = cursor->data;
1836 ctsvc_db_messenger_delete(messenger->id, is_my_profile);
1839 ret = contacts_list_get_count(messenger_list, &count);
1841 return CONTACTS_ERROR_NONE;
1843 contacts_list_first(messenger_list);
1845 contacts_list_get_current_record_p(messenger_list, &record);
1846 messenger = (ctsvc_messenger_s*)record;
1847 if (0 < messenger->id) {
1848 if (messenger->im_id)
1849 ret = ctsvc_db_messenger_update(record, is_my_profile);
1851 ret = ctsvc_db_messenger_delete(messenger->id, is_my_profile);
1853 ret = ctsvc_db_messenger_insert(record, contact_id, is_my_profile, NULL);
1855 if (CONTACTS_ERROR_DB == ret) {
1856 ERR("return (%d)", ret);
1859 } while (CONTACTS_ERROR_NONE == contacts_list_next(messenger_list));
1864 int ctsvc_contact_update_data_address(contacts_list_h address_list, int contact_id, bool is_my_profile)
1867 int ret = CONTACTS_ERROR_NONE;
1868 contacts_record_h record = NULL;
1870 ctsvc_list_s *list = (ctsvc_list_s*)address_list;
1871 ctsvc_address_s *address;
1874 RETV_IF(NULL == address_list, CONTACTS_ERROR_INVALID_PARAMETER);
1876 for (cursor = list->deleted_records; cursor; cursor = cursor->next) {
1877 address = cursor->data;
1878 ctsvc_db_address_delete(address->id, is_my_profile);
1881 ret = contacts_list_get_count(address_list, &count);
1883 return CONTACTS_ERROR_NONE;
1885 contacts_list_first(address_list);
1887 contacts_list_get_current_record_p(address_list, &record);
1888 address = (ctsvc_address_s*)record;
1889 if (0 < address->id) {
1890 if (address->pobox || address->postalcode || address->region || address->locality
1891 || address->street || address->extended || address->country) {
1892 ret = ctsvc_db_address_update(record, is_my_profile);
1894 ret = ctsvc_db_address_delete(address->id, is_my_profile);
1897 ret = ctsvc_db_address_insert(record, contact_id, is_my_profile, NULL);
1899 if (CONTACTS_ERROR_DB == ret) {
1900 ERR("return (%d)", ret);
1903 } while (CONTACTS_ERROR_NONE == contacts_list_next(address_list));
1908 int ctsvc_contact_update_data_url(contacts_list_h url_list, int contact_id, bool is_my_profile)
1911 int ret = CONTACTS_ERROR_NONE;
1912 contacts_record_h record = NULL;
1914 ctsvc_list_s *list = (ctsvc_list_s*)url_list;
1918 RETV_IF(NULL == url_list, CONTACTS_ERROR_INVALID_PARAMETER);
1920 for (cursor = list->deleted_records; cursor; cursor = cursor->next) {
1922 ctsvc_db_url_delete(url->id, is_my_profile);
1925 ret = contacts_list_get_count(url_list, &count);
1927 return CONTACTS_ERROR_NONE;
1929 contacts_list_first(url_list);
1931 contacts_list_get_current_record_p(url_list, &record);
1932 url = (ctsvc_url_s*)record;
1935 ret = ctsvc_db_url_update(record, is_my_profile);
1937 ret = ctsvc_db_url_delete(url->id, is_my_profile);
1939 ret = ctsvc_db_url_insert(record, contact_id, is_my_profile, NULL);
1941 if (CONTACTS_ERROR_DB == ret) {
1942 ERR("return (%d)", ret);
1945 } while (CONTACTS_ERROR_NONE == contacts_list_next(url_list));
1950 int ctsvc_contact_update_data_profile(contacts_list_h profile_list, int contact_id, bool is_my_profile)
1953 int ret = CONTACTS_ERROR_NONE;
1954 contacts_record_h record = NULL;
1956 ctsvc_list_s *list = (ctsvc_list_s*)profile_list;
1957 ctsvc_profile_s *profile;
1960 RETV_IF(NULL == profile_list, CONTACTS_ERROR_INVALID_PARAMETER);
1962 for (cursor = list->deleted_records; cursor; cursor = cursor->next) {
1963 profile = cursor->data;
1964 ctsvc_db_profile_delete(profile->id, is_my_profile);
1966 ret = contacts_list_get_count(profile_list, &count);
1968 return CONTACTS_ERROR_NONE;
1970 contacts_list_first(profile_list);
1972 contacts_list_get_current_record_p(profile_list, &record);
1973 profile = (ctsvc_profile_s*)record;
1974 if (0 < profile->id) {
1976 ret = ctsvc_db_profile_update(record, is_my_profile);
1978 ret = ctsvc_db_profile_delete(profile->id, is_my_profile);
1980 ret = ctsvc_db_profile_insert(record, contact_id, is_my_profile, NULL);
1982 if (CONTACTS_ERROR_DB == ret) {
1983 ERR("return (%d)", ret);
1986 } while (CONTACTS_ERROR_NONE == contacts_list_next(profile_list));
1991 int ctsvc_contact_update_data_relationship(contacts_list_h relationship_list, int contact_id, bool is_my_profile)
1994 int ret = CONTACTS_ERROR_NONE;
1995 contacts_record_h record = NULL;
1997 ctsvc_list_s *list = (ctsvc_list_s*)relationship_list;
1998 ctsvc_relationship_s *relationship;
2001 RETV_IF(NULL == relationship_list, CONTACTS_ERROR_INVALID_PARAMETER);
2003 for (cursor = list->deleted_records; cursor; cursor = cursor->next) {
2004 relationship = cursor->data;
2005 ctsvc_db_relationship_delete(relationship->id, is_my_profile);
2008 ret = contacts_list_get_count(relationship_list, &count);
2010 return CONTACTS_ERROR_NONE;
2012 contacts_list_first(relationship_list);
2014 contacts_list_get_current_record_p(relationship_list, &record);
2015 relationship = (ctsvc_relationship_s*)record;
2016 if (0 < relationship->id) {
2017 if (relationship->name)
2018 ret = ctsvc_db_relationship_update(record, is_my_profile);
2020 ret = ctsvc_db_relationship_delete(relationship->id, is_my_profile);
2022 ret = ctsvc_db_relationship_insert(record, contact_id, is_my_profile, NULL);
2024 if (CONTACTS_ERROR_DB == ret) {
2025 ERR("return (%d)", ret);
2028 } while (CONTACTS_ERROR_NONE == contacts_list_next(relationship_list));
2033 int ctsvc_contact_update_data_image(contacts_list_h image_list, int contact_id, bool is_my_profile)
2036 int ret = CONTACTS_ERROR_NONE;
2037 contacts_record_h record = NULL;
2039 ctsvc_list_s *list = (ctsvc_list_s*)image_list;
2040 ctsvc_image_s *image;
2043 RETV_IF(NULL == image_list, CONTACTS_ERROR_INVALID_PARAMETER);
2045 for (cursor = list->deleted_records; cursor; cursor = cursor->next) {
2046 image = cursor->data;
2047 ctsvc_db_image_delete(image->id, is_my_profile);
2050 ret = contacts_list_get_count(image_list, &count);
2052 return CONTACTS_ERROR_NONE;
2054 contacts_list_first(image_list);
2056 contacts_list_get_current_record_p(image_list, &record);
2057 image = (ctsvc_image_s*)record;
2058 if (CTSVC_PROPERTY_FLAG_DIRTY & image->base.property_flag) {
2059 if (0 < image->id) {
2061 ret = ctsvc_db_image_update(record, contact_id, is_my_profile);
2063 ret = ctsvc_db_image_delete(image->id, is_my_profile);
2065 ret = ctsvc_db_image_insert(record, contact_id, is_my_profile, NULL);
2068 if (CONTACTS_ERROR_DB == ret) {
2069 ERR("return (%d)", ret);
2072 } while (CONTACTS_ERROR_NONE == contacts_list_next(image_list));
2077 int ctsvc_contact_update_data_nickname(contacts_list_h nickname_list, int contact_id, bool is_my_profile)
2080 int ret = CONTACTS_ERROR_NONE;
2081 contacts_record_h record = NULL;
2083 ctsvc_list_s *list = (ctsvc_list_s*)nickname_list;
2084 ctsvc_nickname_s *nickname;
2087 RETV_IF(NULL == nickname_list, CONTACTS_ERROR_INVALID_PARAMETER);
2089 for (cursor = list->deleted_records; cursor; cursor = cursor->next) {
2090 nickname = cursor->data;
2091 ctsvc_db_nickname_delete(nickname->id, is_my_profile);
2094 ret = contacts_list_get_count(nickname_list, &count);
2096 return CONTACTS_ERROR_NONE;
2098 contacts_list_first(nickname_list);
2100 contacts_list_get_current_record_p(nickname_list, &record);
2101 nickname = (ctsvc_nickname_s*)record;
2102 if (0 < nickname->id) {
2103 if (nickname->nickname)
2104 ret = ctsvc_db_nickname_update(record, is_my_profile);
2106 ret = ctsvc_db_nickname_delete(nickname->id, is_my_profile);
2108 ret = ctsvc_db_nickname_insert(record, contact_id, is_my_profile, NULL);
2110 if (CONTACTS_ERROR_DB == ret) {
2111 ERR("return (%d)", ret);
2114 } while (CONTACTS_ERROR_NONE == contacts_list_next(nickname_list));
2119 int ctsvc_contact_update_data_extension(contacts_list_h extension_list, int contact_id, bool is_my_profile)
2122 int ret = CONTACTS_ERROR_NONE;
2123 contacts_record_h record = NULL;
2125 ctsvc_list_s *list = (ctsvc_list_s*)extension_list;
2126 ctsvc_extension_s *extension;
2129 RETV_IF(NULL == extension_list, CONTACTS_ERROR_INVALID_PARAMETER);
2131 for (cursor = list->deleted_records; cursor; cursor = cursor->next) {
2132 extension = cursor->data;
2133 ctsvc_db_extension_delete(extension->id, is_my_profile);
2136 ret = contacts_list_get_count(extension_list, &count);
2138 return CONTACTS_ERROR_NONE;
2140 contacts_list_first(extension_list);
2142 contacts_list_get_current_record_p(extension_list, &record);
2143 extension = (ctsvc_extension_s*)record;
2144 if (0 < extension->id) {
2145 if (extension->data2 || extension->data3 || extension->data4 || extension->data5
2146 || extension->data6 || extension->data7 || extension->data8 || extension->data9
2147 || extension->data10 || extension->data11 || extension->data12) {
2148 ret = ctsvc_db_extension_update(record);
2150 ret = ctsvc_db_extension_delete(extension->id, is_my_profile);
2153 ret = ctsvc_db_extension_insert(record, contact_id, is_my_profile, NULL);
2155 if (CONTACTS_ERROR_DB == ret) {
2156 ERR("return (%d)", ret);
2159 } while (CONTACTS_ERROR_NONE == contacts_list_next(extension_list));
2164 int ctsvc_contact_update_data_sip(contacts_list_h sip_list, int contact_id, bool is_my_profile)
2167 int ret = CONTACTS_ERROR_NONE;
2168 contacts_record_h record = NULL;
2170 ctsvc_list_s *list = (ctsvc_list_s*)sip_list;
2174 RETV_IF(NULL == sip_list, CONTACTS_ERROR_INVALID_PARAMETER);
2176 for (cursor = list->deleted_records; cursor; cursor = cursor->next) {
2177 sip = (ctsvc_sip_s *)cursor->data;
2178 ctsvc_db_sip_delete(sip->id, is_my_profile);
2181 ret = contacts_list_get_count(sip_list, &count);
2183 return CONTACTS_ERROR_NONE;
2185 contacts_list_first(sip_list);
2187 contacts_list_get_current_record_p(sip_list, &record);
2188 sip = (ctsvc_sip_s*)record;
2191 ret = ctsvc_db_sip_update(record, is_my_profile);
2193 ret = ctsvc_db_sip_delete(sip->id, is_my_profile);
2195 ret = ctsvc_db_sip_insert(record, contact_id, is_my_profile, NULL);
2197 if (CONTACTS_ERROR_DB == ret) {
2198 ERR("DB error : return (%d)", ret);
2201 } while (CONTACTS_ERROR_NONE == contacts_list_next(sip_list));
2206 int ctsvc_contact_update_data_number(contacts_list_h number_list,
2207 int contact_id, bool is_my_profile, bool *had_phonenumber)
2210 int ret = CONTACTS_ERROR_NONE;
2211 contacts_record_h record = NULL;
2213 ctsvc_list_s *list = (ctsvc_list_s*)number_list;
2214 ctsvc_number_s *number;
2217 *had_phonenumber = false;
2219 RETV_IF(NULL == number_list, CONTACTS_ERROR_INVALID_PARAMETER);
2221 for (cursor = list->deleted_records; cursor; cursor = cursor->next) {
2222 number = cursor->data;
2223 ctsvc_db_number_delete(number->id, is_my_profile);
2226 ret = contacts_list_get_count(number_list, &count);
2228 return CONTACTS_ERROR_NONE;
2230 contacts_list_first(number_list);
2232 contacts_list_get_current_record_p(number_list, &record);
2233 number = (ctsvc_number_s*)record;
2234 if (0 < number->id) {
2235 if (number->number) {
2236 ret = ctsvc_db_number_update(record, is_my_profile);
2239 ret = ctsvc_db_number_delete(number->id, is_my_profile);
2241 } else if (number->number) {
2242 ret = ctsvc_db_number_insert(record, contact_id, is_my_profile, NULL);
2245 if (CONTACTS_ERROR_DB == ret) {
2246 ERR("return (%d)", ret);
2249 } while (CONTACTS_ERROR_NONE == contacts_list_next(number_list));
2251 *had_phonenumber = had;
2255 int ctsvc_contact_update_data_email(contacts_list_h email_list,
2256 int contact_id, bool is_my_profile, bool *had_email)
2259 int ret = CONTACTS_ERROR_NONE;
2260 contacts_record_h record = NULL;
2262 ctsvc_list_s *list = (ctsvc_list_s*)email_list;
2263 ctsvc_email_s *email;
2268 RETV_IF(NULL == email_list, CONTACTS_ERROR_INVALID_PARAMETER);
2270 for (cursor = list->deleted_records; cursor; cursor = cursor->next) {
2271 email = cursor->data;
2272 ctsvc_db_email_delete(email->id, is_my_profile);
2275 ret = contacts_list_get_count(email_list, &count);
2277 return CONTACTS_ERROR_NONE;
2279 contacts_list_first(email_list);
2281 contacts_list_get_current_record_p(email_list, &record);
2282 email = (ctsvc_email_s*)record;
2284 if (0 < email->id) {
2285 if (email->email_addr) {
2286 ret = ctsvc_db_email_update(record, is_my_profile);
2289 ret = ctsvc_db_email_delete(email->id, is_my_profile);
2291 } else if (email->email_addr) {
2292 ret = ctsvc_db_email_insert(record, contact_id, is_my_profile, NULL);
2295 if (CONTACTS_ERROR_DB == ret) {
2296 ERR("return (%d)", ret);
2299 } while (CONTACTS_ERROR_NONE == contacts_list_next(email_list));
2305 int ctsvc_contact_insert_data_name(contacts_list_h name_list, int contact_id, bool is_my_profile)
2308 int ret = CONTACTS_ERROR_NONE;
2309 contacts_record_h record;
2310 RETV_IF(NULL == name_list, CONTACTS_ERROR_INVALID_PARAMETER);
2312 contacts_list_first(name_list);
2313 contacts_list_get_current_record_p(name_list, &record);
2315 ret = ctsvc_db_name_insert(record, contact_id, is_my_profile, NULL);
2316 if (CONTACTS_ERROR_DB == ret)
2317 ERR("ctsvc_db_name_insert() Fail");
2322 int ctsvc_contact_insert_data_number(contacts_list_h number_list, int contact_id, bool is_my_profile)
2325 int ret = CONTACTS_ERROR_NONE;
2326 contacts_record_h record;
2329 RETV_IF(NULL == number_list, CONTACTS_ERROR_INVALID_PARAMETER);
2330 ret = contacts_list_get_count(number_list, &count);
2332 return CONTACTS_ERROR_NONE;
2334 contacts_list_first(number_list);
2336 contacts_list_get_current_record_p(number_list, &record);
2337 ret = ctsvc_db_number_insert(record, contact_id, is_my_profile, NULL);
2338 if (CONTACTS_ERROR_DB == ret) {
2339 ERR("ctsvc_db_number_insert");
2342 } while (CONTACTS_ERROR_NONE == contacts_list_next(number_list));
2347 int ctsvc_contact_insert_data_email(contacts_list_h email_list, int contact_id, bool is_my_profile)
2350 int ret = CONTACTS_ERROR_NONE;
2351 contacts_record_h record;
2354 RETV_IF(NULL == email_list, CONTACTS_ERROR_INVALID_PARAMETER);
2355 ret = contacts_list_get_count(email_list, &count);
2357 return CONTACTS_ERROR_NONE;
2359 contacts_list_first(email_list);
2361 contacts_list_get_current_record_p(email_list, &record);
2362 ret = ctsvc_db_email_insert(record, contact_id, is_my_profile, NULL);
2363 if (CONTACTS_ERROR_DB == ret) {
2364 ERR("ctsvc_db_email_insert");
2367 } while (CONTACTS_ERROR_NONE == contacts_list_next(email_list));
2372 int ctsvc_contact_insert_data_profile(contacts_list_h profile_list, int contact_id, bool is_my_profile)
2375 int ret = CONTACTS_ERROR_NONE;
2376 contacts_record_h record;
2379 RETV_IF(NULL == profile_list, CONTACTS_ERROR_INVALID_PARAMETER);
2380 ret = contacts_list_get_count(profile_list, &count);
2382 return CONTACTS_ERROR_NONE;
2384 contacts_list_first(profile_list);
2386 contacts_list_get_current_record_p(profile_list, &record);
2387 ret = ctsvc_db_profile_insert(record, contact_id, is_my_profile, NULL);
2388 if (CONTACTS_ERROR_DB == ret) {
2389 ERR("ctsvc_db_profile_insert");
2392 } while (CONTACTS_ERROR_NONE == contacts_list_next(profile_list));
2397 int ctsvc_contact_insert_data_company(contacts_list_h company_list, int contact_id, bool is_my_profile)
2400 int ret = CONTACTS_ERROR_NONE;
2401 contacts_record_h record = NULL;
2404 RETV_IF(NULL == company_list, CONTACTS_ERROR_INVALID_PARAMETER);
2405 ret = contacts_list_get_count(company_list, &count);
2407 return CONTACTS_ERROR_NONE;
2409 contacts_list_first(company_list);
2411 contacts_list_get_current_record_p(company_list, &record);
2412 ret = ctsvc_db_company_insert(record, contact_id, is_my_profile, NULL);
2413 if (CONTACTS_ERROR_DB == ret) {
2414 ERR("ctsvc_db_company_insert");
2417 } while (CONTACTS_ERROR_NONE == contacts_list_next(company_list));
2422 int ctsvc_contact_insert_data_note(contacts_list_h note_list, int contact_id, bool is_my_profile)
2425 int ret = CONTACTS_ERROR_NONE;
2426 contacts_record_h record = NULL;
2429 RETV_IF(NULL == note_list, CONTACTS_ERROR_INVALID_PARAMETER);
2430 ret = contacts_list_get_count(note_list, &count);
2432 return CONTACTS_ERROR_NONE;
2434 contacts_list_first(note_list);
2436 contacts_list_get_current_record_p(note_list, &record);
2438 ret = ctsvc_db_note_insert(record, contact_id, is_my_profile, NULL);
2439 if (CONTACTS_ERROR_DB == ret) {
2440 ERR("ctsvc_db_note_insert");
2444 } while (CONTACTS_ERROR_NONE == contacts_list_next(note_list));
2448 int ctsvc_contact_insert_data_event(contacts_list_h event_list, int contact_id, bool is_my_profile)
2451 int ret = CONTACTS_ERROR_NONE;
2452 contacts_record_h record;
2455 RETV_IF(NULL == event_list, CONTACTS_ERROR_INVALID_PARAMETER);
2456 ret = contacts_list_get_count(event_list, &count);
2458 return CONTACTS_ERROR_NONE;
2460 contacts_list_first(event_list);
2462 contacts_list_get_current_record_p(event_list, &record);
2463 ret = ctsvc_db_event_insert(record, contact_id, is_my_profile, NULL);
2464 if (CONTACTS_ERROR_DB == ret) {
2465 ERR("ctsvc_db_event_insert");
2468 } while (CONTACTS_ERROR_NONE == contacts_list_next(event_list));
2473 int ctsvc_contact_insert_data_messenger(contacts_list_h messenger_list, int contact_id, bool is_my_profile)
2476 int ret = CONTACTS_ERROR_NONE;
2477 contacts_record_h record;
2480 RETV_IF(NULL == messenger_list, CONTACTS_ERROR_INVALID_PARAMETER);
2481 ret = contacts_list_get_count(messenger_list, &count);
2483 return CONTACTS_ERROR_NONE;
2485 contacts_list_first(messenger_list);
2487 contacts_list_get_current_record_p(messenger_list, &record);
2488 ret = ctsvc_db_messenger_insert(record, contact_id, is_my_profile, NULL);
2489 if (CONTACTS_ERROR_DB == ret) {
2490 ERR("ctsvc_db_messenger_insert");
2493 } while (CONTACTS_ERROR_NONE == contacts_list_next(messenger_list));
2498 int ctsvc_contact_insert_data_address(contacts_list_h address_list, int contact_id, bool is_my_profile)
2501 int ret = CONTACTS_ERROR_NONE;
2502 contacts_record_h record;
2505 RETV_IF(NULL == address_list, CONTACTS_ERROR_INVALID_PARAMETER);
2506 ret = contacts_list_get_count(address_list, &count);
2508 return CONTACTS_ERROR_NONE;
2510 contacts_list_first(address_list);
2512 contacts_list_get_current_record_p(address_list, &record);
2513 ret = ctsvc_db_address_insert(record, contact_id, is_my_profile, NULL);
2514 if (CONTACTS_ERROR_DB == ret) {
2515 ERR("ctsvc_db_address_insert");
2518 } while (CONTACTS_ERROR_NONE == contacts_list_next(address_list));
2523 int ctsvc_contact_insert_data_url(contacts_list_h url_list, int contact_id, bool is_my_profile)
2526 int ret = CONTACTS_ERROR_NONE;
2527 contacts_record_h record;
2530 RETV_IF(NULL == url_list, CONTACTS_ERROR_INVALID_PARAMETER);
2531 ret = contacts_list_get_count(url_list, &count);
2533 return CONTACTS_ERROR_NONE;
2535 contacts_list_first(url_list);
2537 contacts_list_get_current_record_p(url_list, &record);
2538 ret = ctsvc_db_url_insert(record, contact_id, is_my_profile, NULL);
2539 if (CONTACTS_ERROR_DB == ret) {
2540 ERR("ctsvc_db_url_insert");
2543 } while (CONTACTS_ERROR_NONE == contacts_list_next(url_list));
2548 int ctsvc_contact_insert_data_nickname(contacts_list_h nickname_list, int contact_id, bool is_my_profile)
2551 int ret = CONTACTS_ERROR_NONE;
2552 contacts_record_h record;
2555 RETV_IF(NULL == nickname_list, CONTACTS_ERROR_INVALID_PARAMETER);
2556 ret = contacts_list_get_count(nickname_list, &count);
2558 return CONTACTS_ERROR_NONE;
2560 contacts_list_first(nickname_list);
2562 contacts_list_get_current_record_p(nickname_list, &record);
2563 ret = ctsvc_db_nickname_insert(record, contact_id, is_my_profile, NULL);
2564 if (CONTACTS_ERROR_DB == ret) {
2565 ERR("ctsvc_db_nickname_insert");
2568 } while (CONTACTS_ERROR_NONE == contacts_list_next(nickname_list));
2573 int ctsvc_contact_insert_data_relationship(contacts_list_h relationship_list, int contact_id, bool is_my_profile)
2576 int ret = CONTACTS_ERROR_NONE;
2577 contacts_record_h record;
2580 RETV_IF(NULL == relationship_list, CONTACTS_ERROR_INVALID_PARAMETER);
2581 ret = contacts_list_get_count(relationship_list, &count);
2583 return CONTACTS_ERROR_NONE;
2585 contacts_list_first(relationship_list);
2587 contacts_list_get_current_record_p(relationship_list, &record);
2588 ret = ctsvc_db_relationship_insert(record, contact_id, is_my_profile, NULL);
2589 if (CONTACTS_ERROR_DB == ret) {
2590 ERR("ctsvc_db_relationship_insert");
2593 } while (CONTACTS_ERROR_NONE == contacts_list_next(relationship_list));
2598 int ctsvc_contact_insert_data_image(contacts_list_h image_list, int contact_id, bool is_my_profile)
2601 int ret = CONTACTS_ERROR_NONE;
2602 contacts_record_h record;
2605 RETV_IF(NULL == image_list, CONTACTS_ERROR_INVALID_PARAMETER);
2606 ret = contacts_list_get_count(image_list, &count);
2608 return CONTACTS_ERROR_NONE;
2610 contacts_list_first(image_list);
2612 contacts_list_get_current_record_p(image_list, &record);
2613 ret = ctsvc_db_image_insert(record, contact_id, is_my_profile, NULL);
2614 if (CONTACTS_ERROR_DB == ret) {
2615 ERR("ctsvc_db_image_insert");
2618 } while (CONTACTS_ERROR_NONE == contacts_list_next(image_list));
2623 int ctsvc_contact_insert_data_extension(contacts_list_h extension_list, int contact_id, bool is_my_profile)
2626 int ret = CONTACTS_ERROR_NONE;
2627 contacts_record_h record;
2630 RETV_IF(NULL == extension_list, CONTACTS_ERROR_INVALID_PARAMETER);
2631 ret = contacts_list_get_count(extension_list, &count);
2633 return CONTACTS_ERROR_NONE;
2635 contacts_list_first(extension_list);
2637 contacts_list_get_current_record_p(extension_list, &record);
2638 ret = ctsvc_db_extension_insert(record, contact_id, is_my_profile, NULL);
2639 if (CONTACTS_ERROR_DB == ret) {
2640 ERR("ctsvc_db_extension_insert");
2643 } while (CONTACTS_ERROR_NONE == contacts_list_next(extension_list));
2648 int ctsvc_contact_insert_data_sip(contacts_list_h sip_list, int contact_id, bool is_my_profile)
2651 int ret = CONTACTS_ERROR_NONE;
2652 contacts_record_h record;
2655 RETV_IF(NULL == sip_list, CONTACTS_ERROR_INVALID_PARAMETER);
2656 ret = contacts_list_get_count(sip_list, &count);
2658 return CONTACTS_ERROR_NONE;
2660 contacts_list_first(sip_list);
2662 contacts_list_get_current_record_p(sip_list, &record);
2663 ret = ctsvc_db_sip_insert(record, contact_id, is_my_profile, NULL);
2664 if (CONTACTS_ERROR_DB == ret) {
2665 ERR("DB error : ctsvc_db_sip_insert");
2668 } while (CONTACTS_ERROR_NONE == contacts_list_next(sip_list));
2673 int ctsvc_contact_update_display_name(int contact_id, contacts_display_name_source_type_e changed_record_type)
2675 int ret = CONTACTS_ERROR_NONE;
2676 int display_name_type;
2677 contacts_record_h record;
2678 ret = ctsvc_db_contact_get(contact_id, (contacts_record_h*)&record);
2679 RETVM_IF(ret != CONTACTS_ERROR_NONE, ret, "ctsvc_db_contact_get Fail(%d)", ret);
2680 contacts_record_get_int(record, _contacts_contact.display_source_type, &display_name_type);
2682 if (display_name_type <= changed_record_type) {
2684 cts_stmt stmt = NULL;
2685 char query[CTS_SQL_MAX_LEN] = {0};
2686 ctsvc_contact_s *contact = (ctsvc_contact_s*)record;
2687 ctsvc_contact_make_display_name(contact);
2689 snprintf(query, sizeof(query), "UPDATE "CTS_TABLE_CONTACTS" SET "
2690 "display_name=?, reverse_display_name=?, display_name_source=%d, "
2691 "display_name_language=%d, reverse_display_name_language=%d, "
2692 "sort_name=?, reverse_sort_name=?, sortkey=?, reverse_sortkey=?, "
2693 "changed_ver=%d, changed_time=%d WHERE contact_id=%d",
2694 contact->display_source_type,
2695 contact->display_name_language, contact->reverse_display_name_language,
2696 ctsvc_get_next_ver(), (int)time(NULL), contact_id);
2698 ret = ctsvc_query_prepare(query, &stmt);
2700 ERR("ctsvc_query_prepare() Fail(%d)", ret);
2701 contacts_record_destroy(record, true);
2705 if (contact->display_name)
2706 ctsvc_stmt_bind_text(stmt, 1, contact->display_name);
2707 if (contact->reverse_display_name)
2708 ctsvc_stmt_bind_text(stmt, 2, contact->reverse_display_name);
2709 if (contact->sort_name)
2710 ctsvc_stmt_bind_text(stmt, 3, contact->sort_name);
2711 if (contact->reverse_sort_name)
2712 ctsvc_stmt_bind_text(stmt, 4, contact->reverse_sort_name);
2713 if (contact->sortkey)
2714 ctsvc_stmt_bind_text(stmt, 5, contact->sortkey);
2715 if (contact->reverse_sortkey)
2716 ctsvc_stmt_bind_text(stmt, 6, contact->reverse_sortkey);
2718 ret = ctsvc_stmt_step(stmt);
2719 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_stmt_step() Fail(%d)", ret);
2721 ctsvc_stmt_finalize(stmt);
2724 contacts_record_destroy(record, true);
2728 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_contact;
2729 int ctsvc_db_contact_get(int id, contacts_record_h *out_record)
2731 return ctsvc_db_plugin_contact.get_record(id, out_record);