4 * Copyright (c) 2010 - 2012 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"
55 #include "ctsvc_server_person.h"
56 #include "ctsvc_server_group.h"
58 #ifdef ENABLE_LOG_FEATURE
59 #include "ctsvc_server_phonelog.h"
60 #endif /* ENABLE_LOG_FEATURE */
62 #define CTSVC_CONTACT_INITIAL_DATA_MAX_LEN 128
64 int ctsvc_contact_add_image_file(int parent_id, int img_id,
65 char *src_img, char *dest, int dest_size)
73 RETVM_IF(NULL == src_img, CONTACTS_ERROR_INVALID_PARAMETER, "image_thumbnail_path is NULL");
75 ext = strrchr(src_img, '.');
76 if (NULL == ext || strchr(ext, '/'))
79 lower_ext = strdup(ext);
82 CTS_ERR("strdup() Fail");
83 return CONTACTS_ERROR_OUT_OF_MEMORY;
86 *temp = tolower(*temp);
90 version = ctsvc_get_next_ver();
91 snprintf(dest, dest_size, "%d_%d-%d%s", parent_id, img_id, version, lower_ext);
94 ret = ctsvc_utils_copy_image(CTSVC_CONTACT_IMG_FULL_LOCATION, src_img, dest);
95 if (CONTACTS_ERROR_NONE != ret) {
96 CTS_ERR("ctsvc_utils_copy_image() Fail(%d)", ret);
101 return CONTACTS_ERROR_NONE;
104 static int __ctsvc_contact_get_current_image_file(int image_id, char *dest, int dest_size)
109 char query[CTS_SQL_MIN_LEN] = {0};
111 snprintf(query, sizeof(query), "SELECT data3 FROM %s WHERE id = %d", CTS_TABLE_DATA, image_id);
112 ret = ctsvc_query_prepare(query, &stmt);
113 RETVM_IF(NULL == stmt, ret, "DB error : ctsvc_query_prepare() Fail(%d)", ret);
115 ret = ctsvc_stmt_step(stmt);
116 if (1 /*CTS_TRUE*/ != ret) {
117 CTS_ERR("DB error: ctsvc_stmt_step() Fail(%d)", ret);
118 ctsvc_stmt_finalize(stmt);
119 if (CONTACTS_ERROR_NONE == ret)
120 return CONTACTS_ERROR_NO_DATA;
125 tmp_path = ctsvc_stmt_get_text(stmt, 0);
127 snprintf(dest, dest_size, "%s/%s", CTSVC_CONTACT_IMG_FULL_LOCATION, tmp_path);
129 ctsvc_stmt_finalize(stmt);
130 return CONTACTS_ERROR_NONE;
134 * check that the image file under location or not
135 * we should check CTSVC_CONTACT_IMG_FULL_LOCATION, CTSVC_VCARD_IMAGE_LOCATION,
136 * CTS_GROUP_IMAGE_LOCATION, CTS_LOGO_IMAGE_LOCATION
138 bool ctsvc_contact_check_image_location(const char *path)
143 if (path == NULL || *path == '\0')
146 slash = strrchr(path, '/');
147 if (slash == NULL || slash == path)
150 len = (int)(slash-path);
151 if (len != strlen(CTSVC_CONTACT_IMG_FULL_LOCATION))
154 if (STRING_EQUAL == strncmp(path, CTSVC_CONTACT_IMG_FULL_LOCATION, len))
160 int ctsvc_contact_update_image_file(int parent_id, int img_id,
161 char *src_img, char *dest_name, int dest_size)
164 char dest[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0};
166 ret = __ctsvc_contact_get_current_image_file(img_id, dest, sizeof(dest));
168 WARN_IF(CONTACTS_ERROR_NONE != ret && CONTACTS_ERROR_NO_DATA != ret,
169 "__ctsvc_contact_get_current_image_file() Fail(%d)", ret);
171 if (src_img && STRING_EQUAL == strcmp(dest, src_img)) {
172 snprintf(dest_name, dest_size, "%s", src_img + strlen(CTSVC_CONTACT_IMG_FULL_LOCATION) + 1);
173 return CONTACTS_ERROR_NONE;
178 CTS_WARN("unlink Fail(%d)", errno);
183 ret = ctsvc_contact_add_image_file(parent_id, img_id, src_img, dest_name, dest_size);
184 RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_contact_add_image_file() Fail(%d)", ret);
190 int ctsvc_db_contact_update_changed_time(int contact_id)
193 char query[CTS_SQL_MIN_LEN] = {0};
195 snprintf(query, sizeof(query),
196 "UPDATE %s SET changed_ver=%d, changed_time=%d WHERE contact_id=%d AND deleted = 0",
197 CTS_TABLE_CONTACTS, ctsvc_get_next_ver(), (int)time(NULL), contact_id);
199 ret = ctsvc_query_exec(query);
200 RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
202 ctsvc_set_contact_noti();
204 return CONTACTS_ERROR_NONE;
207 int ctsvc_contact_delete_image_file_with_path(const unsigned char* image_path)
212 char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0};
213 snprintf(full_path, sizeof(full_path), "%s/%s", CTSVC_CONTACT_IMG_FULL_LOCATION, image_path);
214 ret = unlink(full_path);
216 CTS_WARN("unlink Fail(%d)", errno);
220 return CONTACTS_ERROR_NONE;
223 int ctsvc_db_contact_delete(int contact_id)
226 int ret, rel_changed;
230 char query[CTS_SQL_MAX_LEN] = {0};
231 cts_stmt stmt = NULL;
234 ret = ctsvc_begin_trans();
235 RETVM_IF(ret, ret, "DB error : ctsvc_begin_trans() Fail(%d)", ret);
237 snprintf(query, sizeof(query),
238 "SELECT addressbook_id, person_id "
239 "FROM "CTS_TABLE_CONTACTS" WHERE contact_id = %d AND deleted = 0", contact_id);
241 ret = ctsvc_query_prepare(query, &stmt);
243 CTS_ERR("DB error : ctsvc_query_prepare() Fail(%d)", ret);
244 ctsvc_end_trans(false);
248 ret = ctsvc_stmt_step(stmt);
250 CTS_ERR("DB error : ctsvc_stmt_step() Fail(%d)", ret);
251 ctsvc_stmt_finalize(stmt);
252 ctsvc_end_trans(false);
253 if (CONTACTS_ERROR_NONE == ret)
254 return CONTACTS_ERROR_NO_DATA;
259 addressbook_id = ctsvc_stmt_get_int(stmt, 0);
260 person_id = ctsvc_stmt_get_int(stmt, 1);
261 CTS_DBG("addressbook_id : %d, person_id : %d", addressbook_id, person_id);
262 ctsvc_stmt_finalize(stmt);
265 if (false == ctsvc_have_ab_write_permission(addressbook_id)) {
266 CTS_ERR("Does not have permission to delete this contact");
267 ctsvc_end_trans(false);
268 return CONTACTS_ERROR_PERMISSION_DENIED;
271 version = ctsvc_get_next_ver();
272 snprintf(query, sizeof(query),
273 "UPDATE %s SET member_changed_ver=%d "
274 "WHERE group_id IN (SELECT group_id FROM %s WHERE contact_id = %d AND deleted = 0) ",
275 CTS_TABLE_GROUPS, version, CTS_TABLE_GROUP_RELATIONS, contact_id);
276 ret = ctsvc_query_exec(query);
277 if (CONTACTS_ERROR_NONE != ret) {
278 CTS_ERR("ctsvc_query_exec() Fail(%d)", ret);
279 ctsvc_end_trans(false);
282 rel_changed = ctsvc_db_change();
284 snprintf(query, sizeof(query),
285 "UPDATE %s SET deleted = 1, person_id = 0, changed_ver=%d WHERE contact_id = %d",
286 CTS_TABLE_CONTACTS, version, contact_id);
287 ret = ctsvc_query_exec(query);
288 if (CONTACTS_ERROR_NONE != ret) {
289 CTS_ERR("ctsvc_query_exec() Fail(%d)", ret);
290 ctsvc_end_trans(false);
294 snprintf(query, sizeof(query), "SELECT link_count FROM "CTS_TABLE_PERSONS" WHERE person_id = %d", person_id);
295 ret = ctsvc_query_get_first_int_result(query, &link_count);
296 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_query_get_first_int_result() Fail(%d)", ret);
298 * set dirty bit to person by trigger
299 * : person will be aggregated in ctsvc_person_aggregate
302 if (1 < link_count) {
303 ctsvc_person_aggregate(person_id);
305 #ifdef ENABLE_LOG_FEATURE
306 /* update phonelog */
307 ctsvc_db_phone_log_update_person_id(NULL, person_id, -1, false);
308 #endif /* ENABLE_LOG_FEATURE */
311 ctsvc_set_person_noti();
313 ctsvc_set_contact_noti();
315 ctsvc_set_group_rel_noti();
317 ret = ctsvc_end_trans(true);
318 if (ret < CONTACTS_ERROR_NONE) {
319 CTS_ERR("DB error : ctsvc_end_trans() Fail(%d)", ret);
323 return CONTACTS_ERROR_NONE;
326 static inline void __ctsvc_contact_get_initial(char *src, char *dest, int dest_size, bool pinyin)
330 int len = strlen(src);
331 for (i = 0; i < len && j < (dest_size-1);) {
336 int char_len = ctsvc_check_utf8(src[i]);
338 for (k=0;k<char_len && j < (dest_size-1) ;k++)
339 dest[j++] = src[i++];
340 if (false == pinyin && j < (dest_size-1))
349 static inline void __ctsvc_remove_space(char *src, char *dest, int dest_size)
351 int len = strlen(src);
354 for (i=0; i < len && i < dest_size; i++) {
355 if (src[i] && src[i] != ' ') {
363 /* make search name to insert search_index table name column
364 * korean : display_name, chosung, phonetic
365 * japanese : dislay_name(hiragana), phonetic
366 * if display_name is chinese and sort_name(phonetic) is japanese,
367 * then search_name is normalized_name and sort_name (phonetic)
368 * chinese : display_name, pinyin name, pinyin initial, phonetic
369 * others : display_name, phonetic
371 int ctsvc_contact_make_search_name(ctsvc_contact_s *contact, char **search_name) {
373 char *temp_name = NULL;
376 RETV_IF(NULL == contact, CONTACTS_ERROR_NO_DATA);
378 if (contact->display_name) {
379 if (ctsvc_has_chinese(contact->display_name)) {
380 if (CTSVC_LANG_JAPANESE == ctsvc_check_language_type(contact->sort_name)) {
381 char *normalized_display_name=NULL;
383 ctsvc_normalize_str(contact->display_name, &normalized_display_name);
384 if (normalized_display_name) {
385 buf_size = SAFE_STRLEN(normalized_display_name) + strlen(contact->sort_name) + 2;
386 name = calloc(1, buf_size);
388 CTS_ERR("calloc() Fail");
389 free(normalized_display_name);
390 return CONTACTS_ERROR_OUT_OF_MEMORY;
392 snprintf(name, buf_size, "%s %s", normalized_display_name, contact->sort_name);
393 free(normalized_display_name);
397 char *langset = ctsvc_get_langset();
398 if (STRING_EQUAL == strncmp(langset, "zh_CN", strlen("zh_CN"))) {
399 pinyin_name_s *pinyinname;
402 ret = ctsvc_convert_chinese_to_pinyin(contact->display_name, &pinyinname, &size);
403 if (CONTACTS_ERROR_NONE == ret) {
404 int name_len = (CHINESE_PINYIN_SPELL_MAX_LEN*strlen(contact->display_name)+1) * sizeof(char);
405 char *name_nospace = calloc(1, name_len);
406 if (NULL == name_nospace) {
407 CTS_ERR("calloc() Fail");
408 ctsvc_pinyin_free(pinyinname, size);
409 return CONTACTS_ERROR_OUT_OF_MEMORY;
411 char *temp_name = NULL;
413 ctsvc_normalize_str(contact->display_name, &name);
415 for (i=0; i<size; i++) {
416 __ctsvc_remove_space(pinyinname[i].pinyin_name, name_nospace, name_len);
418 buf_size = SAFE_STRLEN(name)
419 + SAFE_STRLEN(pinyinname[i].pinyin_name)
420 + SAFE_STRLEN(name_nospace)
421 + SAFE_STRLEN(pinyinname[i].pinyin_initial)
423 temp_name = calloc(1, buf_size);
424 if (NULL == temp_name) {
425 CTS_ERR("calloc() Fail");
427 ctsvc_pinyin_free(pinyinname, size);
429 return CONTACTS_ERROR_OUT_OF_MEMORY;
431 snprintf(temp_name, buf_size, "%s %s %s %s",
432 name, pinyinname[i].pinyin_name, name_nospace, pinyinname[i].pinyin_initial);
438 len = ctsvc_check_utf8(contact->display_name[0]);
439 for (i=len; i < strlen(contact->display_name); i+=len) {
440 len = ctsvc_check_utf8(contact->display_name[i]);
442 buf_size = SAFE_STRLEN(name) + SAFE_STRLEN(&contact->display_name[i]) + 2;
443 temp_name = calloc(1, buf_size);
444 if (NULL == temp_name) {
445 CTS_ERR("calloc() Fail");
447 ctsvc_pinyin_free(pinyinname, size);
449 return CONTACTS_ERROR_OUT_OF_MEMORY;
451 snprintf(temp_name, buf_size, "%s %s", name, &contact->display_name[i]);
458 ctsvc_pinyin_free(pinyinname, size);
461 char initial[CTSVC_CONTACT_INITIAL_DATA_MAX_LEN] = {0,};
462 char *normalized_display_name = NULL;
464 ctsvc_normalize_str(contact->display_name, &normalized_display_name);
465 if (normalized_display_name) {
466 __ctsvc_contact_get_initial(contact->display_name, initial, sizeof(initial), false);
467 buf_size = SAFE_STRLEN(normalized_display_name) + strlen(initial) + 2;
468 name = calloc(1, buf_size);
470 CTS_ERR("calloc() Fail");
471 free(normalized_display_name);
472 return CONTACTS_ERROR_OUT_OF_MEMORY;
474 snprintf(name, buf_size, "%s %s", normalized_display_name, initial);
476 free(normalized_display_name);
481 char initial[CTSVC_CONTACT_INITIAL_DATA_MAX_LEN] = {0,};
482 char *normalized_display_name = NULL;
484 ctsvc_normalize_str(contact->display_name, &normalized_display_name);
485 if (normalized_display_name) {
486 __ctsvc_contact_get_initial(contact->display_name, initial, sizeof(initial), false);
487 buf_size = SAFE_STRLEN(normalized_display_name) + strlen(initial) + 2;
488 name = calloc(1, buf_size);
490 CTS_ERR("calloc() Fail");
491 free(normalized_display_name);
492 return CONTACTS_ERROR_OUT_OF_MEMORY;
494 snprintf(name, buf_size, "%s %s", normalized_display_name, initial);
496 free(normalized_display_name);
501 else if (ctsvc_has_korean(contact->display_name)) {
502 /* 'a가' should be searched by 'ㄱ' */
504 int full_len, chosung_len;
505 char *chosung = calloc(1, strlen(contact->display_name) * 5);
506 if (NULL == chosung) {
507 CTS_ERR("calloc() Fail");
508 return CONTACTS_ERROR_OUT_OF_MEMORY;
510 int total_len = strlen(contact->display_name);
512 count = ctsvc_get_chosung(contact->display_name, chosung, strlen(contact->display_name) * 5);
514 ctsvc_normalize_str(contact->display_name, &name);
517 for (i=0, j=0; i < total_len; i+=full_len, j+=chosung_len) {
518 full_len = ctsvc_check_utf8(contact->display_name[i]);
519 chosung_len = ctsvc_check_utf8(chosung[j]);
521 buf_size = SAFE_STRLEN(name) + SAFE_STRLEN(&contact->display_name[i]) + SAFE_STRLEN(&chosung[j]) + 3;
522 temp_name = calloc(1, buf_size);
523 if (NULL == temp_name) {
524 CTS_ERR("calloc() Fail");
527 return CONTACTS_ERROR_OUT_OF_MEMORY;
530 snprintf(temp_name, buf_size, "%s %s %s", name, &contact->display_name[i], &chosung[j]);
538 else if (CTSVC_LANG_JAPANESE == ctsvc_check_language_type(contact->display_name)) {
539 ctsvc_convert_japanese_to_hiragana(contact->display_name, &name);
542 /* Insert 'ABO Â' for 'ÂBC' */
543 char initial[CTSVC_CONTACT_INITIAL_DATA_MAX_LEN] = {0,};
544 char *normalized_display_name=NULL;
546 ctsvc_normalize_str(contact->display_name, &normalized_display_name);
547 if (normalized_display_name) {
548 __ctsvc_contact_get_initial(contact->display_name, initial, sizeof(initial), false);
549 buf_size = SAFE_STRLEN(normalized_display_name) + strlen(initial) + 2;
550 name = calloc(1, buf_size);
552 CTS_ERR("calloc() Fail");
553 free(normalized_display_name);
554 return CONTACTS_ERROR_OUT_OF_MEMORY;
556 snprintf(name, buf_size, "%s %s", normalized_display_name, initial);
558 free(normalized_display_name);
563 /* append phonetic name */
565 contacts_list_h name_list = (contacts_list_h)contact->name;
566 ctsvc_name_s *name_record;
567 contacts_list_first(name_list);
568 char *phonetic = NULL;
571 contacts_list_get_current_record_p(name_list, (contacts_record_h*)&name_record);
573 buf_size = SAFE_STRLEN(name_record->phonetic_first) + SAFE_STRLEN(name_record->phonetic_last) + SAFE_STRLEN(name_record->phonetic_middle);
575 buf_size += 3; /* for space and null string */
576 phonetic = calloc(1, buf_size);
577 if (NULL == phonetic) {
578 CTS_ERR("calloc() Fail");
580 return CONTACTS_ERROR_OUT_OF_MEMORY;
583 if (name_record->phonetic_first)
584 temp_len += snprintf(phonetic, buf_size, "%s", name_record->phonetic_first);
585 if (name_record->phonetic_middle) {
587 temp_len += snprintf(phonetic + temp_len, buf_size - temp_len, " ");
588 temp_len += snprintf(phonetic + temp_len, buf_size - temp_len, "%s", name_record->phonetic_middle);
590 if (name_record->phonetic_last) {
592 temp_len += snprintf(phonetic + temp_len, buf_size - temp_len, " ");
593 temp_len += snprintf(phonetic + temp_len, buf_size - temp_len, "%s", name_record->phonetic_last);
597 buf_size = SAFE_STRLEN(name) + SAFE_STRLEN(phonetic) + 2;
598 temp_name = calloc(1, buf_size);
599 if (NULL == temp_name) {
600 CTS_ERR("calloc() Fail");
603 return CONTACTS_ERROR_OUT_OF_MEMORY;
605 snprintf(temp_name, buf_size, "%s %s", name, phonetic);
617 return CONTACTS_ERROR_NONE;
620 static int __ctsvc_make_phonetic_name(ctsvc_name_s* name, char** phonetic, contacts_name_display_order_e order)
622 int len = SAFE_STRLEN(name->phonetic_first) + SAFE_STRLEN(name->phonetic_last) + SAFE_STRLEN(name->phonetic_middle);
624 len += 3; /* for space and null string */
625 *phonetic = calloc(1, len);
626 if (NULL == *phonetic) {
627 CTS_ERR("calloc() Fail");
628 return CONTACTS_ERROR_OUT_OF_MEMORY;
632 if (order == CONTACTS_NAME_DISPLAY_ORDER_FIRSTLAST) {
633 if (name->phonetic_first)
634 temp_len += snprintf(*phonetic, len, "%s", name->phonetic_first);
635 if (name->phonetic_middle) {
637 temp_len += snprintf(*phonetic + temp_len, len - temp_len, " ");
638 temp_len += snprintf(*phonetic + temp_len, len - temp_len, "%s", name->phonetic_middle);
640 if (name->phonetic_last) {
642 temp_len += snprintf(*phonetic + temp_len, len - temp_len, " ");
643 temp_len += snprintf(*phonetic + temp_len, len - temp_len, "%s", name->phonetic_last);
647 if (name->phonetic_last)
648 temp_len += snprintf(*phonetic, len, "%s", name->phonetic_last);
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_first) {
656 temp_len += snprintf(*phonetic + temp_len, len - temp_len, " ");
657 temp_len += snprintf(*phonetic + temp_len, len - temp_len, "%s", name->phonetic_first);
662 return CONTACTS_ERROR_NONE;
665 static inline int __ctsvc_get_sort_name_to_pinyin(const char *display_name, char **sort_name) {
668 pinyin_name_s *pinyinname = NULL;
671 if (false == ctsvc_has_chinese(display_name))
672 return CONTACTS_ERROR_INVALID_PARAMETER;
674 ret = ctsvc_convert_chinese_to_pinyin(display_name, &pinyinname, &size);
676 if (ret == CONTACTS_ERROR_NONE) {
677 char temp[strlen(display_name) * 2 + strlen(pinyinname[0].pinyin_name)];
678 int pinyin_index = 0;
686 if (pinyinname[0].pinyin_name[pinyin_index] == '\0') {
687 if (display_name[name_index] != '\0') {
688 temp[temp_index] = ' ';
690 name_len = ctsvc_check_utf8(display_name[name_index]);
692 memcpy(&(temp[temp_index]), &(display_name[name_index]), name_len);
693 temp_index += name_len;
694 name_index += name_len;
699 pinyin_len = ctsvc_check_utf8(pinyinname[0].pinyin_name[pinyin_index]);
702 memcpy(&(temp[temp_index]), &(pinyinname[0].pinyin_name[pinyin_index]), pinyin_len);
703 temp_index += pinyin_len;
705 if (pinyinname[0].pinyin_name[pinyin_index] == ' ') {
706 name_len = ctsvc_check_utf8(display_name[name_index]);
710 if (name_len == 1 && display_name[name_index] == ' ') {
711 temp[temp_index] = ' ';
715 memcpy(&(temp[temp_index]), &(display_name[name_index]), name_len);
716 temp_index += name_len;
717 name_index += name_len;
718 temp[temp_index] = ' ';
722 pinyin_index += pinyin_len;
724 temp[temp_index] = '\0';
725 *sort_name = strdup(temp);
726 ctsvc_pinyin_free(pinyinname, size);
731 void ctsvc_contact_make_sortkey(ctsvc_contact_s *contact)
733 char *sortkey = NULL;
734 char *phonetic = NULL;
737 if (contact->display_source_type == CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME) {
738 if (0 < contact->name->count && contact->name->records
739 && contact->name->records->data) {
740 ctsvc_name_s *name = (ctsvc_name_s *)contact->name->records->data;
741 __ctsvc_make_phonetic_name(name, &phonetic, CONTACTS_NAME_DISPLAY_ORDER_FIRSTLAST);
746 sort_type = ctsvc_get_name_sort_type(phonetic);
747 else if (contact->sort_name)
748 sort_type = ctsvc_get_name_sort_type(contact->sort_name);
750 sort_type = CTSVC_SORT_OTHERS;
752 WARN_IF(sort_type < 0, "ctsvc_get_name_sort_type Fail(%d)", sort_type);
753 char *langset = ctsvc_get_langset();
758 if (STRING_EQUAL == strncmp(langset, "zh_CN", strlen("zh_CN"))) {
759 /* chinese to pinyin */
762 __ctsvc_get_sort_name_to_pinyin(phonetic, &pinyin);
764 __ctsvc_get_sort_name_to_pinyin(contact->sort_name, &pinyin);
767 free(contact->sort_name);
768 contact->sort_name = pinyin;
769 sort_type = CTSVC_SORT_WESTERN;
772 else if (STRING_EQUAL == strncmp(langset, "ko_KR", strlen("ko_KR"))) {
773 sort_type = CTSVC_SORT_KOREAN;
777 case CTSVC_SORT_JAPANESE:
779 char *hiragana = NULL;
780 ctsvc_convert_japanese_to_hiragana(contact->sort_name, &hiragana);
783 free(contact->sort_name);
784 contact->sort_name = hiragana;
791 FREEandSTRDUP(contact->sort_name, phonetic);
799 if (ctsvc_get_primary_sort() == sort_type)
800 contact->display_name_language = CTSVC_SORT_PRIMARY;
801 else if (ctsvc_get_secondary_sort() == sort_type)
802 contact->display_name_language = CTSVC_SORT_SECONDARY;
803 else if (sort_type < 0)
804 contact->display_name_language = CTSVC_SORT_OTHERS;
806 contact->display_name_language = sort_type;
809 * check reverse sort_name, reverser_display_name_language
810 * make reverse phonetic name
812 if (contact->display_source_type == CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME) {
813 if (0 < contact->name->count && contact->name->records
814 && contact->name->records->data) {
815 ctsvc_name_s *name = (ctsvc_name_s *)contact->name->records->data;
816 __ctsvc_make_phonetic_name(name, &phonetic, CONTACTS_NAME_DISPLAY_ORDER_LASTFIRST);
821 sort_type = ctsvc_get_name_sort_type(phonetic);
822 else if (contact->reverse_sort_name)
823 sort_type = ctsvc_get_name_sort_type(contact->reverse_sort_name);
825 sort_type = CTSVC_SORT_OTHERS;
827 WARN_IF(sort_type < 0, "ctsvc_get_name_sort_type Fail(%d)", sort_type);
832 if (STRING_EQUAL == strncmp(langset, "zh_CN", strlen("zh_CN"))) {
835 __ctsvc_get_sort_name_to_pinyin(phonetic, &pinyin);
837 __ctsvc_get_sort_name_to_pinyin(contact->reverse_sort_name, &pinyin);
840 free(contact->reverse_sort_name);
841 contact->reverse_sort_name = pinyin;
842 sort_type = CTSVC_SORT_WESTERN;
845 else if (STRING_EQUAL == strncmp(langset, "ko_KR", strlen("ko_KR"))) {
846 sort_type = CTSVC_SORT_KOREAN;
850 case CTSVC_SORT_JAPANESE:
852 char *hiragana = NULL;
853 ctsvc_convert_japanese_to_hiragana(contact->reverse_sort_name, &hiragana);
856 free(contact->reverse_sort_name);
857 contact->reverse_sort_name = hiragana;
864 FREEandSTRDUP(contact->reverse_sort_name, phonetic);
872 if (ctsvc_get_primary_sort() == sort_type)
873 contact->reverse_display_name_language = CTSVC_SORT_PRIMARY;
874 else if (ctsvc_get_secondary_sort() == sort_type)
875 contact->reverse_display_name_language = CTSVC_SORT_SECONDARY;
876 else if (sort_type < 0)
877 contact->reverse_display_name_language = CTSVC_SORT_OTHERS;
879 contact->reverse_display_name_language = sort_type;
881 if (contact->sort_name) {
882 sort_type = ctsvc_collation_str(contact->sort_name, &sortkey);
883 if (CONTACTS_ERROR_NONE == sort_type)
884 contact->sortkey = sortkey;
891 if (contact->reverse_sort_name) {
892 sort_type = ctsvc_collation_str(contact->reverse_sort_name, &sortkey);
893 if (CONTACTS_ERROR_NONE == sort_type)
894 contact->reverse_sortkey = sortkey;
900 static bool __ctsvc_contact_check_name_has_korean(const ctsvc_name_s *name)
902 if (name->first && ctsvc_has_korean(name->first))
904 else if (name->last && ctsvc_has_korean(name->last))
906 else if (name->addition && ctsvc_has_korean(name->addition))
908 else if (name->prefix && ctsvc_has_korean(name->prefix))
910 else if (name->suffix && ctsvc_has_korean(name->suffix))
916 static bool __ctsvc_contact_check_name_has_japanese(const ctsvc_name_s *name)
918 if (name->first && ctsvc_check_language_type(name->first) == CTSVC_LANG_JAPANESE)
920 else if (name->addition && ctsvc_check_language_type(name->addition) == CTSVC_LANG_JAPANESE)
922 else if (name->last && ctsvc_check_language_type(name->last) == CTSVC_LANG_JAPANESE)
928 static bool __ctsvc_contact_check_name_has_chinese(const ctsvc_name_s *name)
930 if (name->first && ctsvc_check_language_type(name->first) == CTSVC_LANG_CHINESE)
932 else if (name->addition && ctsvc_check_language_type(name->addition) == CTSVC_LANG_CHINESE)
934 else if (name->last && ctsvc_check_language_type(name->last) == CTSVC_LANG_CHINESE)
940 int ctsvc_contact_get_name_language(const ctsvc_name_s *name)
943 if (__ctsvc_contact_check_name_has_korean(name))
944 lang = CTSVC_LANG_KOREAN;
945 else if (__ctsvc_contact_check_name_has_japanese(name))
946 lang = CTSVC_LANG_JAPANESE;
947 else if (__ctsvc_contact_check_name_has_chinese(name))
948 lang = CTSVC_LANG_CHINESE;
951 lang = ctsvc_check_language_type(name->last);
952 else if (name->first)
953 lang = ctsvc_check_language_type(name->first);
954 else if (name->addition)
955 lang = ctsvc_check_language_type(name->addition);
961 char * __ctsvc_remove_first_space(char *src)
963 if (src == NULL ||SAFE_STRLEN(src) == 0)
966 int name_len = (SAFE_STRLEN(src)+1)*sizeof(char);
967 char *name_nospace = NULL;
968 name_nospace = calloc(1, name_len);
969 if (NULL == name_nospace) {
970 CTS_ERR("calloc() Fail");
974 int len = strlen(src);
977 for (i=0; i < len && i < name_len; i++) {
978 if (src[i] && src[i] != ' ') {
979 strncpy(name_nospace, src+i, name_len);
986 * Make display_name, sort_name, sortkey of the contact by name record
987 * If the contact record does not have name record,
988 * we use company, nickname, number, email record in order
990 void ctsvc_contact_make_display_name(ctsvc_contact_s *contact)
993 ctsvc_name_s *name = NULL;
995 free(contact->display_name);
996 contact->display_name = NULL;
998 free(contact->reverse_display_name);
999 contact->reverse_display_name = NULL;
1001 free(contact->sort_name);
1002 contact->sort_name = NULL;
1004 free(contact->reverse_sort_name);
1005 contact->reverse_sort_name = NULL;
1007 free(contact->sortkey);
1008 contact->sortkey = NULL;
1010 free(contact->reverse_sortkey);
1011 contact->reverse_sortkey = NULL;
1013 contact->display_name_language = CTSVC_SORT_OTHERS;
1014 contact->reverse_display_name_language = CTSVC_SORT_OTHERS;
1016 contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_INVALID;
1018 if (0 < contact->name->count && contact->name->records && contact->name->records->data) {
1019 name = (ctsvc_name_s *)contact->name->records->data;
1022 if (name && (name->first || name->last || name->prefix || name->addition || name->suffix)) {
1023 int reverse_lang_type = -1;
1025 int temp_display_len;
1026 char *display = NULL;
1027 char *temp_display = NULL;
1030 * Make reverse display name (Last name first)
1031 * Default : Prefix Last, First Middle(addition), Suffix
1032 * Korean, Chinese : Prefix LastMiddleFirstSuffix
1033 * Japanese : Prefix Last Middle First Suffix
1034 * reverse sort name does not include prefix
1035 * But, if there is only prefix, reverse sort_name is prefix
1037 temp_display_len = SAFE_STRLEN(name->first)
1038 + SAFE_STRLEN(name->addition)
1039 + SAFE_STRLEN(name->last)
1040 + SAFE_STRLEN(name->suffix);
1041 if (0 < temp_display_len) {
1042 temp_display_len += 7;
1043 temp_display = calloc(1, temp_display_len);
1044 if (NULL == temp_display) {
1045 CTS_ERR("calloc() Fail");
1050 /* get language type */
1051 reverse_lang_type = ctsvc_contact_get_name_language(name);
1053 char * temp = __ctsvc_remove_first_space(name->last);
1054 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1056 if (reverse_lang_type != CTSVC_LANG_KOREAN &&
1057 reverse_lang_type != CTSVC_LANG_CHINESE &&
1058 reverse_lang_type != CTSVC_LANG_JAPANESE) {
1059 if (name->first || name->addition)
1060 len += snprintf(temp_display + len, temp_display_len - len, ",");
1064 if (reverse_lang_type == CTSVC_LANG_JAPANESE) {
1065 /* make temp_display name Prefix - Last - Middle - First - Suffix */
1066 if (name->addition) {
1067 char * temp = __ctsvc_remove_first_space(name->addition);
1069 len += snprintf(temp_display + len, temp_display_len - len, " ");
1070 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1075 char * temp = __ctsvc_remove_first_space(name->first);
1077 len += snprintf(temp_display + len, temp_display_len - len, " ");
1078 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1082 else if (reverse_lang_type == CTSVC_LANG_CHINESE || reverse_lang_type == CTSVC_LANG_KOREAN) {
1083 if (name->addition) {
1084 char * temp = __ctsvc_remove_first_space(name->addition);
1085 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1090 char * temp = __ctsvc_remove_first_space(name->first);
1091 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1096 /* make temp_display name Prefix - Last - First - Middle - Suffix */
1098 if (*temp_display) {
1099 if (reverse_lang_type < 0) {
1100 reverse_lang_type = ctsvc_check_language_type(temp_display);
1103 if (reverse_lang_type != CTSVC_LANG_KOREAN &&
1104 reverse_lang_type != CTSVC_LANG_CHINESE)
1105 len += snprintf(temp_display + len, temp_display_len - len, " ");
1107 char * temp = __ctsvc_remove_first_space(name->first);
1108 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1112 if (name->addition) {
1113 if (*temp_display) {
1114 if (reverse_lang_type < 0) {
1115 reverse_lang_type = ctsvc_check_language_type(temp_display);
1118 if (reverse_lang_type != CTSVC_LANG_KOREAN &&
1119 reverse_lang_type != CTSVC_LANG_CHINESE)
1120 len += snprintf(temp_display + len, temp_display_len - len, " ");
1122 char * temp = __ctsvc_remove_first_space(name->addition);
1123 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1129 if (*temp_display) {
1130 if (reverse_lang_type < 0) {
1131 reverse_lang_type = ctsvc_check_language_type(temp_display);
1134 if (reverse_lang_type == CTSVC_LANG_JAPANESE)
1135 len += snprintf(temp_display + len, temp_display_len - len, " ");
1136 else if (reverse_lang_type != CTSVC_LANG_KOREAN &&
1137 reverse_lang_type != CTSVC_LANG_CHINESE)
1138 len += snprintf(temp_display + len, temp_display_len - len, ", ");
1140 char * temp = __ctsvc_remove_first_space(name->suffix);
1141 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1146 if (name->prefix && temp_display) {
1147 display_len = SAFE_STRLEN(name->prefix) + temp_display_len + 2;
1148 display = calloc(1, display_len);
1149 if (NULL == display) {
1150 CTS_ERR("calloc() Fail");
1154 char * temp = __ctsvc_remove_first_space(name->prefix);
1155 snprintf(display, display_len, "%s %s", temp, temp_display);
1157 contact->reverse_display_name = display;
1158 contact->reverse_sort_name = temp_display;
1160 else if (temp_display) {
1161 contact->reverse_display_name = temp_display;
1162 contact->reverse_sort_name = strdup(temp_display);
1164 else if (name->prefix) {
1165 contact->reverse_display_name = strdup(name->prefix);
1166 contact->reverse_sort_name = strdup(name->prefix);
1170 * Make display name (First name first)
1171 * Default : Prefix First Middle Last, Suffix
1172 * Korean, Chinese : Prefix LastFirstMiddleSuffix (Same as reverse display name)
1173 * Japanese : Prefix First Middle Last Suffix
1174 * sort name does not include prefix
1175 * But, if there is only prefix, sort_name is prefix
1177 if (reverse_lang_type == CTSVC_LANG_KOREAN ||
1178 reverse_lang_type == CTSVC_LANG_CHINESE ||
1179 reverse_lang_type == CTSVC_LANG_JAPANESE) {
1180 contact->display_name = strdup(contact->reverse_display_name);
1181 contact->sort_name = SAFE_STRDUP(contact->reverse_sort_name);
1185 temp_display = NULL;
1186 temp_display_len = SAFE_STRLEN(name->first)
1187 + SAFE_STRLEN(name->addition)
1188 + SAFE_STRLEN(name->last)
1189 + SAFE_STRLEN(name->suffix);
1190 if (0 < temp_display_len) {
1191 temp_display_len += 6;
1192 /* make reverse_temp_display_name */
1193 temp_display = calloc(1, temp_display_len);
1194 if (NULL == temp_display) {
1195 CTS_ERR("calloc() Fail");
1201 char * temp = __ctsvc_remove_first_space(name->first);
1202 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1206 if (name->addition) {
1207 char * temp = __ctsvc_remove_first_space(name->addition);
1209 len += snprintf(temp_display + len, temp_display_len - len, " ");
1210 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1215 char * temp = __ctsvc_remove_first_space(name->last);
1217 len += snprintf(temp_display + len, temp_display_len - len, " ");
1218 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1223 if (*temp_display) {
1224 lang_type = ctsvc_check_language_type(temp_display);
1225 if (lang_type == CTSVC_LANG_JAPANESE)
1226 len += snprintf(temp_display + len, temp_display_len - len, " ");
1228 len += snprintf(temp_display + len, temp_display_len - len, ", ");
1230 char * temp = __ctsvc_remove_first_space(name->suffix);
1231 len += snprintf(temp_display + len, temp_display_len - len, "%s", temp);
1236 if (name->prefix && temp_display) {
1237 display_len = SAFE_STRLEN(name->prefix) + temp_display_len + 2;
1238 display = calloc(1, display_len);
1239 if (NULL == display) {
1240 CTS_ERR("calloc() Fail");
1244 snprintf(display, display_len, "%s %s", name->prefix, temp_display);
1245 contact->display_name = display;
1246 contact->sort_name = temp_display;
1248 else if (temp_display) {
1249 contact->display_name = temp_display;
1250 contact->sort_name = strdup(temp_display);
1252 else if (name->prefix) {
1253 contact->display_name = strdup(name->prefix);
1254 contact->sort_name = strdup(name->prefix);
1258 ctsvc_record_set_property_flag((ctsvc_record_s *)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY);
1259 contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME;
1263 if (contact->company && contact->company->records) {
1264 for (cur=contact->company->records;cur;cur=cur->next) {
1265 ctsvc_company_s *company = (ctsvc_company_s *)cur->data;
1266 if (company && company->name) {
1267 ctsvc_record_set_property_flag((ctsvc_record_s *)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY);
1268 contact->display_name = SAFE_STRDUP(company->name);
1269 contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY;
1275 if (false == ctsvc_record_check_property_flag((ctsvc_record_s *)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY) &&
1276 contact->nicknames && contact->nicknames->records) {
1277 for (cur=contact->nicknames->records;cur;cur=cur->next) {
1278 ctsvc_nickname_s *nickname = (ctsvc_nickname_s *)cur->data;
1279 if (nickname && nickname->nickname) {
1280 ctsvc_record_set_property_flag((ctsvc_record_s *)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY);
1281 free(contact->display_name);
1282 contact->display_name = SAFE_STRDUP(nickname->nickname);
1283 contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME;
1289 if (false == ctsvc_record_check_property_flag((ctsvc_record_s *)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY) &&
1290 contact->numbers && contact->numbers->records) {
1291 for (cur=contact->numbers->records;cur;cur=cur->next) {
1292 ctsvc_number_s *number = (ctsvc_number_s *)cur->data;
1293 if (number && number->number) {
1294 ctsvc_record_set_property_flag((ctsvc_record_s *)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY);
1295 free(contact->display_name);
1296 contact->display_name = SAFE_STRDUP(number->number);
1297 contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NUMBER;
1303 if (false == ctsvc_record_check_property_flag((ctsvc_record_s *)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY) &&
1304 contact->emails && contact->emails->records) {
1305 for (cur=contact->emails->records;cur;cur=cur->next) {
1306 ctsvc_email_s *email = (ctsvc_email_s *)cur->data;
1307 if (email && email->email_addr) {
1308 ctsvc_record_set_property_flag((ctsvc_record_s *)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY);
1309 free(contact->display_name);
1310 contact->display_name = SAFE_STRDUP(email->email_addr);
1311 contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_EMAIL;
1317 if (ctsvc_record_check_property_flag((ctsvc_record_s *)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY)) {
1318 contact->reverse_display_name = SAFE_STRDUP(contact->display_name);
1319 contact->sort_name = SAFE_STRDUP(contact->display_name);
1320 contact->reverse_sort_name = SAFE_STRDUP(contact->display_name);
1323 /* Update as NULL */
1324 ctsvc_record_set_property_flag((ctsvc_record_s *)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY);
1329 if (ctsvc_record_check_property_flag((ctsvc_record_s *)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY))
1330 ctsvc_contact_make_sortkey(contact);
1335 int ctsvc_get_data_info_name(cts_stmt stmt, contacts_list_h name_list)
1339 contacts_record_h record;
1341 ret = contacts_list_get_count(name_list, &count);
1342 RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_list_get_count Fail(%d)", ret);
1343 RETVM_IF (1 < count, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : already had name");
1345 ctsvc_db_name_get_value_from_stmt(stmt, &record, 1);
1346 contacts_list_add(name_list, record);
1348 return CONTACTS_ERROR_NONE;
1351 int ctsvc_get_data_info_event(cts_stmt stmt, contacts_list_h list)
1353 contacts_record_h record;
1355 ctsvc_db_event_get_value_from_stmt(stmt, &record, 1);
1356 contacts_list_add(list, record);
1358 return CONTACTS_ERROR_NONE;
1361 int ctsvc_get_data_info_number(cts_stmt stmt, contacts_list_h number_list)
1363 contacts_record_h record;
1365 ctsvc_db_number_get_value_from_stmt(stmt, &record, 1);
1366 contacts_list_add(number_list, record);
1368 return CONTACTS_ERROR_NONE;
1371 int ctsvc_get_data_info_email(cts_stmt stmt, contacts_list_h list)
1373 contacts_record_h record;
1375 ctsvc_db_email_get_value_from_stmt(stmt, &record, 1);
1376 contacts_list_add(list, record);
1378 return CONTACTS_ERROR_NONE;
1381 int ctsvc_get_data_info_address(cts_stmt stmt, contacts_list_h list)
1383 contacts_record_h record;
1385 ctsvc_db_address_get_value_from_stmt(stmt, &record, 1);
1386 contacts_list_add(list, record);
1388 return CONTACTS_ERROR_NONE;
1391 int ctsvc_get_data_info_messenger(cts_stmt stmt, contacts_list_h list)
1393 contacts_record_h record;
1395 ctsvc_db_messenger_get_value_from_stmt(stmt, &record, 1);
1396 contacts_list_add(list, record);
1398 return CONTACTS_ERROR_NONE;
1401 int ctsvc_get_data_info_note(cts_stmt stmt, contacts_list_h list)
1403 contacts_record_h record;
1405 ctsvc_db_note_get_value_from_stmt(stmt, &record, 1);
1406 contacts_list_add(list, record);
1408 return CONTACTS_ERROR_NONE;
1411 int ctsvc_get_data_info_company(cts_stmt stmt, contacts_list_h list)
1413 contacts_record_h record;
1415 ctsvc_db_company_get_value_from_stmt(stmt, &record, 1);
1416 contacts_list_add(list, record);
1418 return CONTACTS_ERROR_NONE;
1421 int ctsvc_get_data_info_profile(cts_stmt stmt, contacts_list_h list)
1423 contacts_record_h record;
1425 ctsvc_db_profile_get_value_from_stmt(stmt, &record, 1);
1426 contacts_list_add(list, record);
1428 return CONTACTS_ERROR_NONE;
1431 int ctsvc_get_data_info_relationship(cts_stmt stmt, contacts_list_h list)
1433 contacts_record_h record;
1435 ctsvc_db_relationship_get_value_from_stmt(stmt, &record, 1);
1436 contacts_list_add(list, record);
1438 return CONTACTS_ERROR_NONE;
1441 int ctsvc_get_data_info_image(cts_stmt stmt, contacts_list_h list)
1443 contacts_record_h record;
1445 ctsvc_db_image_get_value_from_stmt(stmt, &record, 1);
1446 contacts_list_add(list, record);
1448 return CONTACTS_ERROR_NONE;
1451 int ctsvc_get_data_info_url(cts_stmt stmt, contacts_list_h list)
1453 contacts_record_h record;
1455 ctsvc_db_url_get_value_from_stmt(stmt, &record, 1);
1456 contacts_list_add(list, record);
1458 return CONTACTS_ERROR_NONE;
1461 int ctsvc_get_data_info_nickname(cts_stmt stmt, contacts_list_h list)
1463 contacts_record_h record;
1465 ctsvc_db_nickname_get_value_from_stmt(stmt, &record, 1);
1466 contacts_list_add(list, record);
1468 return CONTACTS_ERROR_NONE;
1471 int ctsvc_get_data_info_extension(cts_stmt stmt, contacts_list_h list)
1473 contacts_record_h record;
1475 ctsvc_db_extension_get_value_from_stmt(stmt, &record, 1);
1476 contacts_list_add(list, record);
1478 return CONTACTS_ERROR_NONE;
1481 bool ctsvc_contact_check_default_number(contacts_list_h number_list)
1483 bool has_default = false;
1484 ctsvc_number_s* number;
1488 RETV_IF(NULL == number_list, false);
1490 ret = contacts_list_get_count(number_list, &count);
1491 if (CONTACTS_ERROR_NONE !=ret || 0 == count)
1494 contacts_list_first(number_list);
1496 contacts_list_get_current_record_p(number_list, (contacts_record_h*)&number);
1497 if (number && number->number && *number->number) {
1498 if (number->is_default && false == has_default)
1500 else if (has_default)
1501 number->is_default = false;
1503 } while (CONTACTS_ERROR_NONE == contacts_list_next(number_list));
1505 if (false == has_default) {
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 number->is_default = true;
1511 ctsvc_record_set_property_flag((ctsvc_record_s *)number, _contacts_number.is_default, CTSVC_PROPERTY_FLAG_DIRTY);
1515 } while (CONTACTS_ERROR_NONE == contacts_list_next(number_list));
1520 bool ctsvc_contact_check_default_email(contacts_list_h email_list)
1522 bool has_default = false;
1523 ctsvc_email_s* email;
1527 RETV_IF(NULL == email_list, false);
1529 ret = contacts_list_get_count(email_list, &count);
1530 if (CONTACTS_ERROR_NONE !=ret || 0 == count)
1533 contacts_list_first(email_list);
1535 contacts_list_get_current_record_p(email_list, (contacts_record_h*)&email);
1536 if (email && email->email_addr && *email->email_addr) {
1537 if (email->is_default && false == has_default)
1539 else if (has_default)
1540 email->is_default = false;
1542 } while (CONTACTS_ERROR_NONE == contacts_list_next(email_list));
1544 if (false == has_default) {
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 email->is_default = true;
1550 ctsvc_record_set_property_flag((ctsvc_record_s *)email, _contacts_email.is_default, CTSVC_PROPERTY_FLAG_DIRTY);
1554 } while (CONTACTS_ERROR_NONE == contacts_list_next(email_list));
1559 bool ctsvc_contact_check_default_image(contacts_list_h image_list)
1561 bool has_default = false;
1562 ctsvc_image_s* image;
1566 RETV_IF(NULL == image_list, false);
1568 ret = contacts_list_get_count(image_list, &count);
1569 if (CONTACTS_ERROR_NONE !=ret || 0 == count) {
1570 CTS_DBG("list get count Fail (%d)", count);
1574 contacts_list_first(image_list);
1576 contacts_list_get_current_record_p(image_list, (contacts_record_h*)&image);
1577 if (image && image->path && *image->path) {
1578 if (image->is_default && false == has_default)
1580 else if (has_default)
1581 image->is_default = false;
1583 } while (CONTACTS_ERROR_NONE == contacts_list_next(image_list));
1585 if (false == has_default) {
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 image->is_default = true;
1591 ctsvc_record_set_property_flag((ctsvc_record_s *)image, _contacts_image.is_default, CTSVC_PROPERTY_FLAG_DIRTY);
1595 } while (CONTACTS_ERROR_NONE == contacts_list_next(image_list));
1597 return CONTACTS_ERROR_NONE;
1600 bool ctsvc_contact_check_default_address(contacts_list_h address_list)
1602 bool has_default = false;
1603 ctsvc_address_s* address;
1607 RETV_IF(NULL == address_list, false);
1609 ret = contacts_list_get_count(address_list, &count);
1610 if (CONTACTS_ERROR_NONE !=ret || 0 == count) {
1611 CTS_DBG("list get count Fail (%d)", count);
1615 contacts_list_first(address_list);
1617 contacts_list_get_current_record_p(address_list, (contacts_record_h*)&address);
1619 (address->pobox || address->postalcode || address->region || address->locality
1620 || address->street || address->extended || address->country)) {
1621 if (address->is_default && false == has_default)
1623 else if (has_default)
1624 address->is_default = false;
1626 } while (CONTACTS_ERROR_NONE == contacts_list_next(address_list));
1628 if (false == has_default) {
1629 contacts_list_first(address_list);
1631 contacts_list_get_current_record_p(address_list, (contacts_record_h*)&address);
1633 (address->pobox || address->postalcode || address->region || address->locality
1634 || address->street || address->extended || address->country)) {
1635 address->is_default = true;
1636 ctsvc_record_set_property_flag((ctsvc_record_s *)address, _contacts_address.is_default, CTSVC_PROPERTY_FLAG_DIRTY);
1640 } while (CONTACTS_ERROR_NONE == contacts_list_next(address_list));
1642 return CONTACTS_ERROR_NONE;
1645 int ctsvc_contact_update_data_name(contacts_list_h name_list, int contact_id, bool is_my_profile)
1648 int ret = CONTACTS_ERROR_NONE;
1649 contacts_record_h record;
1651 ctsvc_list_s *list = (ctsvc_list_s*)name_list;
1653 RETV_IF(NULL == name_list, CONTACTS_ERROR_INVALID_PARAMETER);
1655 for (cursor = list->deleted_records;cursor;cursor=cursor->next) {
1656 name = (ctsvc_name_s *)cursor->data;
1657 ctsvc_db_name_delete(name->id, is_my_profile);
1660 contacts_list_first(name_list);
1661 contacts_list_get_current_record_p(name_list, &record);
1663 name = (ctsvc_name_s*)record;
1665 if (name->first || name->last || name->addition || name->prefix || name->suffix
1666 || name->phonetic_first || name->phonetic_middle || name->phonetic_last)
1667 ret = ctsvc_db_name_update(record, is_my_profile);
1669 ret = ctsvc_db_name_delete(name->id, is_my_profile);
1672 ret = ctsvc_db_name_insert(record, contact_id, is_my_profile, NULL);
1673 if (CONTACTS_ERROR_DB == ret)
1674 CTS_ERR("DB error : return(%d)", ret);
1680 int ctsvc_contact_update_data_company(contacts_list_h company_list, int contact_id, bool is_my_profile)
1683 int ret = CONTACTS_ERROR_NONE;
1684 contacts_record_h record = NULL;
1686 ctsvc_list_s *list = (ctsvc_list_s*)company_list;
1687 ctsvc_company_s *company;
1690 RETV_IF(NULL == company_list, CONTACTS_ERROR_INVALID_PARAMETER);
1692 for (cursor = list->deleted_records;cursor;cursor=cursor->next) {
1693 company = (ctsvc_company_s *)cursor->data;
1694 ctsvc_db_company_delete(company->id, is_my_profile);
1697 ret = contacts_list_get_count(company_list, &count);
1699 return CONTACTS_ERROR_NONE;
1701 contacts_list_first(company_list);
1703 contacts_list_get_current_record_p(company_list, &record);
1704 company = (ctsvc_company_s*)record;
1705 if (0 < company->id) {
1706 if (company->name || company->department || company->job_title || company->role
1707 || company->assistant_name || company->logo || company->location || company->description
1708 || company->phonetic_name)
1709 ret = ctsvc_db_company_update(record, contact_id, is_my_profile);
1711 ret = ctsvc_db_company_delete(company->id, is_my_profile);
1714 ret = ctsvc_db_company_insert(record, contact_id, is_my_profile, NULL);
1715 if (CONTACTS_ERROR_DB == ret) {
1716 CTS_ERR("DB error : return (%d)", ret);
1719 } while (CONTACTS_ERROR_NONE == contacts_list_next(company_list));
1724 int ctsvc_contact_update_data_note(contacts_list_h note_list, int contact_id, bool is_my_profile)
1727 int ret = CONTACTS_ERROR_NONE;
1728 contacts_record_h record = NULL;
1730 ctsvc_list_s *list = (ctsvc_list_s*)note_list;
1734 RETV_IF(NULL == note_list, CONTACTS_ERROR_INVALID_PARAMETER);
1736 for (cursor = list->deleted_records;cursor;cursor=cursor->next) {
1737 note = (ctsvc_note_s *)cursor->data;
1738 ctsvc_db_note_delete(note->id, is_my_profile);
1741 ret = contacts_list_get_count(note_list, &count);
1743 return CONTACTS_ERROR_NONE;
1745 contacts_list_first(note_list);
1747 contacts_list_get_current_record_p(note_list, &record);
1748 note = (ctsvc_note_s*)record;
1751 ret = ctsvc_db_note_update(record, is_my_profile);
1753 ret = ctsvc_db_note_delete(note->id, is_my_profile);
1756 ret = ctsvc_db_note_insert(record, contact_id, is_my_profile, NULL);
1757 if (CONTACTS_ERROR_DB == ret) {
1758 CTS_ERR("DB error : return (%d)", ret);
1761 } while (CONTACTS_ERROR_NONE == contacts_list_next(note_list));
1766 int ctsvc_contact_update_data_event(contacts_list_h event_list, int contact_id, bool is_my_profile)
1769 int ret = CONTACTS_ERROR_NONE;
1770 contacts_record_h record = NULL;
1772 ctsvc_list_s *list = (ctsvc_list_s*)event_list;
1773 ctsvc_event_s *event;
1776 RETV_IF(NULL == event_list, CONTACTS_ERROR_INVALID_PARAMETER);
1778 for (cursor = list->deleted_records;cursor;cursor=cursor->next) {
1779 event = (ctsvc_event_s *)cursor->data;
1780 ctsvc_db_event_delete(event->id, is_my_profile);
1783 ret = contacts_list_get_count(event_list, &count);
1785 return CONTACTS_ERROR_NONE;
1787 contacts_list_first(event_list);
1789 contacts_list_get_current_record_p(event_list, &record);
1790 event = (ctsvc_event_s*)record;
1791 if (0 < event->id) {
1792 if (0 < event->date)
1793 ret = ctsvc_db_event_update(record, is_my_profile);
1795 ret = ctsvc_db_event_delete(event->id, is_my_profile);
1798 ret = ctsvc_db_event_insert(record, contact_id, is_my_profile, NULL);
1799 if (CONTACTS_ERROR_DB == ret) {
1800 CTS_ERR("DB error : return (%d)", ret);
1803 } while (CONTACTS_ERROR_NONE == contacts_list_next(event_list));
1808 int ctsvc_contact_update_data_messenger(contacts_list_h messenger_list, int contact_id, bool is_my_profile)
1811 int ret = CONTACTS_ERROR_NONE;
1812 contacts_record_h record = NULL;
1814 ctsvc_list_s *list = (ctsvc_list_s*)messenger_list;
1815 ctsvc_messenger_s *messenger;
1818 RETV_IF(NULL == messenger_list, CONTACTS_ERROR_INVALID_PARAMETER);
1820 for (cursor = list->deleted_records;cursor;cursor=cursor->next) {
1821 messenger = (ctsvc_messenger_s *)cursor->data;
1822 ctsvc_db_messenger_delete(messenger->id, is_my_profile);
1825 ret = contacts_list_get_count(messenger_list, &count);
1827 return CONTACTS_ERROR_NONE;
1829 contacts_list_first(messenger_list);
1831 contacts_list_get_current_record_p(messenger_list, &record);
1832 messenger = (ctsvc_messenger_s*)record;
1833 if (0 < messenger->id) {
1834 if (messenger->im_id)
1835 ret = ctsvc_db_messenger_update(record, is_my_profile);
1837 ret = ctsvc_db_messenger_delete(messenger->id, is_my_profile);
1840 ret = ctsvc_db_messenger_insert(record, contact_id, is_my_profile, NULL);
1841 if (CONTACTS_ERROR_DB == ret) {
1842 CTS_ERR("DB error : return (%d)", ret);
1845 } while (CONTACTS_ERROR_NONE == contacts_list_next(messenger_list));
1850 int ctsvc_contact_update_data_address(contacts_list_h address_list, int contact_id, bool is_my_profile)
1853 int ret = CONTACTS_ERROR_NONE;
1854 contacts_record_h record = NULL;
1856 ctsvc_list_s *list = (ctsvc_list_s*)address_list;
1857 ctsvc_address_s *address;
1860 RETV_IF(NULL == address_list, CONTACTS_ERROR_INVALID_PARAMETER);
1862 for (cursor = list->deleted_records;cursor;cursor=cursor->next) {
1863 address = (ctsvc_address_s *)cursor->data;
1864 ctsvc_db_address_delete(address->id, is_my_profile);
1867 ret = contacts_list_get_count(address_list, &count);
1869 return CONTACTS_ERROR_NONE;
1871 contacts_list_first(address_list);
1873 contacts_list_get_current_record_p(address_list, &record);
1874 address = (ctsvc_address_s*)record;
1875 if (0 < address->id) {
1876 if (address->pobox || address->postalcode || address->region || address->locality
1877 || address->street || address->extended || address->country)
1878 ret = ctsvc_db_address_update(record, is_my_profile);
1880 ret = ctsvc_db_address_delete(address->id, is_my_profile);
1883 ret = ctsvc_db_address_insert(record, contact_id, is_my_profile, NULL);
1884 if (CONTACTS_ERROR_DB == ret) {
1885 CTS_ERR("DB error : return (%d)", ret);
1888 } while (CONTACTS_ERROR_NONE == contacts_list_next(address_list));
1893 int ctsvc_contact_update_data_url(contacts_list_h url_list, int contact_id, bool is_my_profile)
1896 int ret = CONTACTS_ERROR_NONE;
1897 contacts_record_h record = NULL;
1899 ctsvc_list_s *list = (ctsvc_list_s*)url_list;
1903 RETV_IF(NULL == url_list, CONTACTS_ERROR_INVALID_PARAMETER);
1905 for (cursor = list->deleted_records;cursor;cursor=cursor->next) {
1906 url = (ctsvc_url_s *)cursor->data;
1907 ctsvc_db_url_delete(url->id, is_my_profile);
1910 ret = contacts_list_get_count(url_list, &count);
1912 return CONTACTS_ERROR_NONE;
1914 contacts_list_first(url_list);
1916 contacts_list_get_current_record_p(url_list, &record);
1917 url = (ctsvc_url_s*)record;
1920 ret = ctsvc_db_url_update(record, is_my_profile);
1922 ret = ctsvc_db_url_delete(url->id, is_my_profile);
1925 ret = ctsvc_db_url_insert(record, contact_id, is_my_profile, NULL);
1926 if (CONTACTS_ERROR_DB == ret) {
1927 CTS_ERR("DB error : return (%d)", ret);
1930 } while (CONTACTS_ERROR_NONE == contacts_list_next(url_list));
1935 int ctsvc_contact_update_data_profile(contacts_list_h profile_list, int contact_id, bool is_my_profile)
1938 int ret = CONTACTS_ERROR_NONE;
1939 contacts_record_h record = NULL;
1941 ctsvc_list_s *list = (ctsvc_list_s*)profile_list;
1942 ctsvc_profile_s *profile;
1945 RETV_IF(NULL == profile_list, CONTACTS_ERROR_INVALID_PARAMETER);
1947 for (cursor = list->deleted_records;cursor;cursor=cursor->next) {
1948 profile = (ctsvc_profile_s *)cursor->data;
1949 ctsvc_db_profile_delete(profile->id, is_my_profile);
1951 ret = contacts_list_get_count(profile_list, &count);
1953 return CONTACTS_ERROR_NONE;
1955 contacts_list_first(profile_list);
1957 contacts_list_get_current_record_p(profile_list, &record);
1958 profile = (ctsvc_profile_s*)record;
1959 if (0 < profile->id) {
1961 ret = ctsvc_db_profile_update(record, is_my_profile);
1963 ret = ctsvc_db_profile_delete(profile->id, is_my_profile);
1966 ret = ctsvc_db_profile_insert(record, contact_id, is_my_profile, NULL);
1967 if (CONTACTS_ERROR_DB == ret) {
1968 CTS_ERR("DB error : return (%d)", ret);
1971 } while (CONTACTS_ERROR_NONE == contacts_list_next(profile_list));
1976 int ctsvc_contact_update_data_relationship(contacts_list_h relationship_list, int contact_id, bool is_my_profile)
1979 int ret = CONTACTS_ERROR_NONE;
1980 contacts_record_h record = NULL;
1982 ctsvc_list_s *list = (ctsvc_list_s*)relationship_list;
1983 ctsvc_relationship_s *relationship;
1986 RETV_IF(NULL == relationship_list, CONTACTS_ERROR_INVALID_PARAMETER);
1988 for (cursor = list->deleted_records;cursor;cursor=cursor->next) {
1989 relationship = (ctsvc_relationship_s *)cursor->data;
1990 ctsvc_db_relationship_delete(relationship->id, is_my_profile);
1993 ret = contacts_list_get_count(relationship_list, &count);
1995 return CONTACTS_ERROR_NONE;
1997 contacts_list_first(relationship_list);
1999 contacts_list_get_current_record_p(relationship_list, &record);
2000 relationship = (ctsvc_relationship_s*)record;
2001 if (0 < relationship->id) {
2002 if (relationship->name)
2003 ret = ctsvc_db_relationship_update(record, is_my_profile);
2005 ret = ctsvc_db_relationship_delete(relationship->id, is_my_profile);
2008 ret = ctsvc_db_relationship_insert(record, contact_id, is_my_profile, NULL);
2009 if (CONTACTS_ERROR_DB == ret) {
2010 CTS_ERR("DB error : return (%d)", ret);
2013 } while (CONTACTS_ERROR_NONE == contacts_list_next(relationship_list));
2018 int ctsvc_contact_update_data_image(contacts_list_h image_list, int contact_id, bool is_my_profile)
2021 int ret = CONTACTS_ERROR_NONE;
2022 contacts_record_h record = NULL;
2024 ctsvc_list_s *list = (ctsvc_list_s*)image_list;
2025 ctsvc_image_s *image;
2028 RETV_IF(NULL == image_list, CONTACTS_ERROR_INVALID_PARAMETER);
2030 for (cursor = list->deleted_records;cursor;cursor=cursor->next) {
2031 image = (ctsvc_image_s *)cursor->data;
2032 ctsvc_db_image_delete(image->id, is_my_profile);
2035 ret = contacts_list_get_count(image_list, &count);
2037 return CONTACTS_ERROR_NONE;
2039 contacts_list_first(image_list);
2041 contacts_list_get_current_record_p(image_list, &record);
2042 image = (ctsvc_image_s*)record;
2043 if (CTSVC_PROPERTY_FLAG_DIRTY & image->base.property_flag) {
2044 if (0 < image->id) {
2046 ret = ctsvc_db_image_update(record, contact_id, is_my_profile);
2048 ret = ctsvc_db_image_delete(image->id, is_my_profile);
2051 ret = ctsvc_db_image_insert(record, contact_id, is_my_profile, NULL);
2053 if (CONTACTS_ERROR_DB == ret) {
2054 CTS_ERR("DB error : return (%d)", ret);
2057 } while (CONTACTS_ERROR_NONE == contacts_list_next(image_list));
2062 int ctsvc_contact_update_data_nickname(contacts_list_h nickname_list, int contact_id, bool is_my_profile)
2065 int ret = CONTACTS_ERROR_NONE;
2066 contacts_record_h record = NULL;
2068 ctsvc_list_s *list = (ctsvc_list_s*)nickname_list;
2069 ctsvc_nickname_s *nickname;
2072 RETV_IF(NULL == nickname_list, CONTACTS_ERROR_INVALID_PARAMETER);
2074 for (cursor = list->deleted_records;cursor;cursor=cursor->next) {
2075 nickname = (ctsvc_nickname_s *)cursor->data;
2076 ctsvc_db_nickname_delete(nickname->id, is_my_profile);
2079 ret = contacts_list_get_count(nickname_list, &count);
2081 return CONTACTS_ERROR_NONE;
2083 contacts_list_first(nickname_list);
2085 contacts_list_get_current_record_p(nickname_list, &record);
2086 nickname = (ctsvc_nickname_s*)record;
2087 if (0 < nickname->id) {
2088 if (nickname->nickname)
2089 ret = ctsvc_db_nickname_update(record, is_my_profile);
2091 ret = ctsvc_db_nickname_delete(nickname->id, is_my_profile);
2094 ret = ctsvc_db_nickname_insert(record, contact_id, is_my_profile, NULL);
2095 if (CONTACTS_ERROR_DB == ret) {
2096 CTS_ERR("DB error : return (%d)", ret);
2099 } while (CONTACTS_ERROR_NONE == contacts_list_next(nickname_list));
2104 int ctsvc_contact_update_data_extension(contacts_list_h extension_list, int contact_id, bool is_my_profile)
2107 int ret = CONTACTS_ERROR_NONE;
2108 contacts_record_h record = NULL;
2110 ctsvc_list_s *list = (ctsvc_list_s*)extension_list;
2111 ctsvc_extension_s *extension;
2114 RETV_IF(NULL == extension_list, CONTACTS_ERROR_INVALID_PARAMETER);
2116 for (cursor = list->deleted_records;cursor;cursor=cursor->next) {
2117 extension = (ctsvc_extension_s *)cursor->data;
2118 ctsvc_db_extension_delete(extension->id, is_my_profile);
2121 ret = contacts_list_get_count(extension_list, &count);
2123 return CONTACTS_ERROR_NONE;
2125 contacts_list_first(extension_list);
2127 contacts_list_get_current_record_p(extension_list, &record);
2128 extension = (ctsvc_extension_s*)record;
2129 if (0 < extension->id) {
2130 if (extension->data2 || extension->data3 || extension->data4 || extension->data5
2131 || extension->data6 || extension->data7 || extension->data8 || extension->data9
2132 || extension->data10 || extension->data11 || extension->data12)
2133 ret = ctsvc_db_extension_update(record);
2135 ret = ctsvc_db_extension_delete(extension->id, is_my_profile);
2138 ret = ctsvc_db_extension_insert(record, contact_id, is_my_profile, NULL);
2139 if (CONTACTS_ERROR_DB == ret) {
2140 CTS_ERR("DB error : return (%d)", ret);
2143 } while (CONTACTS_ERROR_NONE == contacts_list_next(extension_list));
2148 int ctsvc_contact_update_data_number(contacts_list_h number_list,
2149 int contact_id, bool is_my_profile, bool *had_phonenumber)
2152 int ret = CONTACTS_ERROR_NONE;
2153 contacts_record_h record = NULL;
2155 ctsvc_list_s *list = (ctsvc_list_s*)number_list;
2156 ctsvc_number_s *number;
2159 *had_phonenumber = false;
2161 RETV_IF(NULL == number_list, CONTACTS_ERROR_INVALID_PARAMETER);
2163 for (cursor = list->deleted_records;cursor;cursor=cursor->next) {
2164 number = (ctsvc_number_s *)cursor->data;
2165 ctsvc_db_number_delete(number->id, is_my_profile);
2168 ret = contacts_list_get_count(number_list, &count);
2170 return CONTACTS_ERROR_NONE;
2172 contacts_list_first(number_list);
2174 contacts_list_get_current_record_p(number_list, &record);
2175 number = (ctsvc_number_s*)record;
2176 if (0 < number->id) {
2177 if (number->number) {
2178 ret = ctsvc_db_number_update(record, is_my_profile);
2182 ret = ctsvc_db_number_delete(number->id, is_my_profile);
2184 else if (number->number) {
2185 ret = ctsvc_db_number_insert(record, contact_id, is_my_profile, NULL);
2188 if (CONTACTS_ERROR_DB == ret) {
2189 CTS_ERR("DB error : return (%d)", ret);
2192 } while (CONTACTS_ERROR_NONE == contacts_list_next(number_list));
2194 *had_phonenumber = had;
2198 int ctsvc_contact_update_data_email(contacts_list_h email_list,
2199 int contact_id, bool is_my_profile, bool *had_email)
2202 int ret = CONTACTS_ERROR_NONE;
2203 contacts_record_h record = NULL;
2205 ctsvc_list_s *list = (ctsvc_list_s*)email_list;
2206 ctsvc_email_s *email;
2211 RETV_IF(NULL == email_list, CONTACTS_ERROR_INVALID_PARAMETER);
2213 for (cursor = list->deleted_records;cursor;cursor=cursor->next) {
2214 email = (ctsvc_email_s *)cursor->data;
2215 ctsvc_db_email_delete(email->id, is_my_profile);
2218 ret = contacts_list_get_count(email_list, &count);
2220 return CONTACTS_ERROR_NONE;
2222 contacts_list_first(email_list);
2224 contacts_list_get_current_record_p(email_list, &record);
2225 email = (ctsvc_email_s*)record;
2227 if (0 < email->id) {
2228 if (email->email_addr) {
2229 ret = ctsvc_db_email_update(record, is_my_profile);
2233 ret = ctsvc_db_email_delete(email->id, is_my_profile);
2235 else if (email->email_addr) {
2236 ret = ctsvc_db_email_insert(record, contact_id, is_my_profile, NULL);
2239 if (CONTACTS_ERROR_DB == ret) {
2240 CTS_ERR("DB error : return (%d)", ret);
2243 } while (CONTACTS_ERROR_NONE == contacts_list_next(email_list));
2249 int ctsvc_contact_insert_data_name(contacts_list_h name_list, int contact_id, bool is_my_profile)
2252 int ret = CONTACTS_ERROR_NONE;
2253 contacts_record_h record;
2254 RETV_IF(NULL == name_list, CONTACTS_ERROR_INVALID_PARAMETER);
2256 contacts_list_first(name_list);
2257 contacts_list_get_current_record_p(name_list, &record);
2259 ret = ctsvc_db_name_insert(record, contact_id, is_my_profile, NULL);
2260 if (CONTACTS_ERROR_DB == ret) {
2261 CTS_ERR("DB error : ctsvc_db_name_insert");
2267 int ctsvc_contact_insert_data_number(contacts_list_h number_list, int contact_id, bool is_my_profile)
2270 int ret = CONTACTS_ERROR_NONE;
2271 contacts_record_h record;
2274 RETV_IF(NULL == number_list, CONTACTS_ERROR_INVALID_PARAMETER);
2275 ret = contacts_list_get_count(number_list, &count);
2277 return CONTACTS_ERROR_NONE;
2279 contacts_list_first(number_list);
2281 contacts_list_get_current_record_p(number_list, &record);
2282 ret = ctsvc_db_number_insert(record, contact_id, is_my_profile, NULL);
2283 if (CONTACTS_ERROR_DB == ret) {
2284 CTS_ERR("DB error : ctsvc_db_number_insert");
2287 } while (CONTACTS_ERROR_NONE == contacts_list_next(number_list));
2292 int ctsvc_contact_insert_data_email(contacts_list_h email_list, int contact_id, bool is_my_profile)
2295 int ret = CONTACTS_ERROR_NONE;
2296 contacts_record_h record;
2299 RETV_IF(NULL == email_list, CONTACTS_ERROR_INVALID_PARAMETER);
2300 ret = contacts_list_get_count(email_list, &count);
2302 return CONTACTS_ERROR_NONE;
2304 contacts_list_first(email_list);
2306 contacts_list_get_current_record_p(email_list, &record);
2307 ret = ctsvc_db_email_insert(record, contact_id, is_my_profile, NULL);
2308 if (CONTACTS_ERROR_DB == ret) {
2309 CTS_ERR("DB error : ctsvc_db_email_insert");
2312 } while (CONTACTS_ERROR_NONE == contacts_list_next(email_list));
2317 int ctsvc_contact_insert_data_profile(contacts_list_h profile_list, int contact_id, bool is_my_profile)
2320 int ret = CONTACTS_ERROR_NONE;
2321 contacts_record_h record;
2324 RETV_IF(NULL == profile_list, CONTACTS_ERROR_INVALID_PARAMETER);
2325 ret = contacts_list_get_count(profile_list, &count);
2327 return CONTACTS_ERROR_NONE;
2329 contacts_list_first(profile_list);
2331 contacts_list_get_current_record_p(profile_list, &record);
2332 ret = ctsvc_db_profile_insert(record, contact_id, is_my_profile, NULL);
2333 if (CONTACTS_ERROR_DB == ret) {
2334 CTS_ERR("DB error : ctsvc_db_profile_insert");
2337 } while (CONTACTS_ERROR_NONE == contacts_list_next(profile_list));
2342 int ctsvc_contact_insert_data_company(contacts_list_h company_list, int contact_id, bool is_my_profile)
2345 int ret = CONTACTS_ERROR_NONE;
2346 contacts_record_h record = NULL;
2349 RETV_IF(NULL == company_list, CONTACTS_ERROR_INVALID_PARAMETER);
2350 ret = contacts_list_get_count(company_list, &count);
2352 return CONTACTS_ERROR_NONE;
2354 contacts_list_first(company_list);
2356 contacts_list_get_current_record_p(company_list, &record);
2357 ret = ctsvc_db_company_insert(record, contact_id, is_my_profile, NULL);
2358 if (CONTACTS_ERROR_DB == ret) {
2359 CTS_ERR("DB error : ctsvc_db_company_insert");
2362 } while (CONTACTS_ERROR_NONE == contacts_list_next(company_list));
2367 int ctsvc_contact_insert_data_note(contacts_list_h note_list, int contact_id, bool is_my_profile)
2370 int ret = CONTACTS_ERROR_NONE;
2371 contacts_record_h record = NULL;
2374 RETV_IF(NULL == note_list, CONTACTS_ERROR_INVALID_PARAMETER);
2375 ret = contacts_list_get_count(note_list, &count);
2377 return CONTACTS_ERROR_NONE;
2379 contacts_list_first(note_list);
2381 contacts_list_get_current_record_p(note_list, &record);
2383 ret = ctsvc_db_note_insert(record, contact_id, is_my_profile, NULL);
2384 if (CONTACTS_ERROR_DB == ret) {
2385 CTS_ERR("DB error : ctsvc_db_note_insert");
2389 } while (CONTACTS_ERROR_NONE == contacts_list_next(note_list));
2393 int ctsvc_contact_insert_data_event(contacts_list_h event_list, int contact_id, bool is_my_profile)
2396 int ret = CONTACTS_ERROR_NONE;
2397 contacts_record_h record;
2400 RETV_IF(NULL == event_list, CONTACTS_ERROR_INVALID_PARAMETER);
2401 ret = contacts_list_get_count(event_list, &count);
2403 return CONTACTS_ERROR_NONE;
2405 contacts_list_first(event_list);
2407 contacts_list_get_current_record_p(event_list, &record);
2408 ret = ctsvc_db_event_insert(record, contact_id, is_my_profile, NULL);
2409 if (CONTACTS_ERROR_DB == ret) {
2410 CTS_ERR("DB error : ctsvc_db_event_insert");
2413 } while (CONTACTS_ERROR_NONE == contacts_list_next(event_list));
2418 int ctsvc_contact_insert_data_messenger(contacts_list_h messenger_list, int contact_id, bool is_my_profile)
2421 int ret = CONTACTS_ERROR_NONE;
2422 contacts_record_h record;
2425 RETV_IF(NULL == messenger_list, CONTACTS_ERROR_INVALID_PARAMETER);
2426 ret = contacts_list_get_count(messenger_list, &count);
2428 return CONTACTS_ERROR_NONE;
2430 contacts_list_first(messenger_list);
2432 contacts_list_get_current_record_p(messenger_list, &record);
2433 ret = ctsvc_db_messenger_insert(record, contact_id, is_my_profile, NULL);
2434 if (CONTACTS_ERROR_DB == ret) {
2435 CTS_ERR("DB error : ctsvc_db_messenger_insert");
2438 } while (CONTACTS_ERROR_NONE == contacts_list_next(messenger_list));
2443 int ctsvc_contact_insert_data_address(contacts_list_h address_list, int contact_id, bool is_my_profile)
2446 int ret = CONTACTS_ERROR_NONE;
2447 contacts_record_h record;
2450 RETV_IF(NULL == address_list, CONTACTS_ERROR_INVALID_PARAMETER);
2451 ret = contacts_list_get_count(address_list, &count);
2453 return CONTACTS_ERROR_NONE;
2455 contacts_list_first(address_list);
2457 contacts_list_get_current_record_p(address_list, &record);
2458 ret = ctsvc_db_address_insert(record, contact_id, is_my_profile, NULL);
2459 if (CONTACTS_ERROR_DB == ret) {
2460 CTS_ERR("DB error : ctsvc_db_address_insert");
2463 } while (CONTACTS_ERROR_NONE == contacts_list_next(address_list));
2468 int ctsvc_contact_insert_data_url(contacts_list_h url_list, int contact_id, bool is_my_profile)
2471 int ret = CONTACTS_ERROR_NONE;
2472 contacts_record_h record;
2475 RETV_IF(NULL == url_list, CONTACTS_ERROR_INVALID_PARAMETER);
2476 ret = contacts_list_get_count(url_list, &count);
2478 return CONTACTS_ERROR_NONE;
2480 contacts_list_first(url_list);
2482 contacts_list_get_current_record_p(url_list, &record);
2483 ret = ctsvc_db_url_insert(record, contact_id, is_my_profile, NULL);
2484 if (CONTACTS_ERROR_DB == ret) {
2485 CTS_ERR("DB error : ctsvc_db_url_insert");
2488 } while (CONTACTS_ERROR_NONE == contacts_list_next(url_list));
2493 int ctsvc_contact_insert_data_nickname(contacts_list_h nickname_list, int contact_id, bool is_my_profile)
2496 int ret = CONTACTS_ERROR_NONE;
2497 contacts_record_h record;
2500 RETV_IF(NULL == nickname_list, CONTACTS_ERROR_INVALID_PARAMETER);
2501 ret = contacts_list_get_count(nickname_list, &count);
2503 return CONTACTS_ERROR_NONE;
2505 contacts_list_first(nickname_list);
2507 contacts_list_get_current_record_p(nickname_list, &record);
2508 ret = ctsvc_db_nickname_insert(record, contact_id, is_my_profile, NULL);
2509 if (CONTACTS_ERROR_DB == ret) {
2510 CTS_ERR("DB error : ctsvc_db_nickname_insert");
2513 } while (CONTACTS_ERROR_NONE == contacts_list_next(nickname_list));
2518 int ctsvc_contact_insert_data_relationship(contacts_list_h relationship_list, int contact_id, bool is_my_profile)
2521 int ret = CONTACTS_ERROR_NONE;
2522 contacts_record_h record;
2525 RETV_IF(NULL == relationship_list, CONTACTS_ERROR_INVALID_PARAMETER);
2526 ret = contacts_list_get_count(relationship_list, &count);
2528 return CONTACTS_ERROR_NONE;
2530 contacts_list_first(relationship_list);
2532 contacts_list_get_current_record_p(relationship_list, &record);
2533 ret = ctsvc_db_relationship_insert(record, contact_id, is_my_profile, NULL);
2534 if (CONTACTS_ERROR_DB == ret) {
2535 CTS_ERR("DB error : ctsvc_db_relationship_insert");
2538 } while (CONTACTS_ERROR_NONE == contacts_list_next(relationship_list));
2543 int ctsvc_contact_insert_data_image(contacts_list_h image_list, int contact_id, bool is_my_profile)
2546 int ret = CONTACTS_ERROR_NONE;
2547 contacts_record_h record;
2550 RETV_IF(NULL == image_list, CONTACTS_ERROR_INVALID_PARAMETER);
2551 ret = contacts_list_get_count(image_list, &count);
2553 return CONTACTS_ERROR_NONE;
2555 contacts_list_first(image_list);
2557 contacts_list_get_current_record_p(image_list, &record);
2558 ret = ctsvc_db_image_insert(record, contact_id, is_my_profile, NULL);
2559 if (CONTACTS_ERROR_DB == ret) {
2560 CTS_ERR("DB error : ctsvc_db_image_insert");
2563 } while (CONTACTS_ERROR_NONE == contacts_list_next(image_list));
2568 int ctsvc_contact_insert_data_extension(contacts_list_h extension_list, int contact_id, bool is_my_profile)
2571 int ret = CONTACTS_ERROR_NONE;
2572 contacts_record_h record;
2575 RETV_IF(NULL == extension_list, CONTACTS_ERROR_INVALID_PARAMETER);
2576 ret = contacts_list_get_count(extension_list, &count);
2578 return CONTACTS_ERROR_NONE;
2580 contacts_list_first(extension_list);
2582 contacts_list_get_current_record_p(extension_list, &record);
2583 ret = ctsvc_db_extension_insert(record, contact_id, is_my_profile, NULL);
2584 if (CONTACTS_ERROR_DB == ret) {
2585 CTS_ERR("DB error : ctsvc_db_extension_insert");
2588 } while (CONTACTS_ERROR_NONE == contacts_list_next(extension_list));
2593 int ctsvc_contact_update_display_name(int contact_id, contacts_display_name_source_type_e changed_record_type)
2595 int ret = CONTACTS_ERROR_NONE;
2596 int display_name_type;
2597 contacts_record_h record;
2598 ret = ctsvc_db_contact_get(contact_id, (contacts_record_h*)&record);
2599 RETVM_IF(ret != CONTACTS_ERROR_NONE, ret, "ctsvc_db_contact_get Fail(%d)", ret);
2600 contacts_record_get_int(record, _contacts_contact.display_source_type, &display_name_type);
2602 if (display_name_type <= changed_record_type) {
2604 cts_stmt stmt = NULL;
2605 char query[CTS_SQL_MAX_LEN] = {0};
2606 ctsvc_contact_s *contact = (ctsvc_contact_s *)record;
2607 ctsvc_contact_make_display_name(contact);
2609 snprintf(query, sizeof(query), "UPDATE "CTS_TABLE_CONTACTS" SET "
2610 "display_name=?, reverse_display_name=?, display_name_source=%d, "
2611 "display_name_language=%d, reverse_display_name_language=%d, "
2612 "sort_name=?, reverse_sort_name=?, sortkey=?, reverse_sortkey=?, "
2613 "changed_ver=%d, changed_time=%d WHERE contact_id=%d",
2614 contact->display_source_type,
2615 contact->display_name_language, contact->reverse_display_name_language,
2616 ctsvc_get_next_ver(), (int)time(NULL), contact_id);
2618 ret = ctsvc_query_prepare(query, &stmt);
2620 CTS_ERR("DB error : ctsvc_query_prepare() Fail(%d)", ret);
2621 contacts_record_destroy(record, true);
2625 if (contact->display_name)
2626 ctsvc_stmt_bind_text(stmt, 1, contact->display_name);
2627 if (contact->reverse_display_name)
2628 ctsvc_stmt_bind_text(stmt, 2, contact->reverse_display_name);
2629 if (contact->sort_name)
2630 ctsvc_stmt_bind_text(stmt, 3, contact->sort_name);
2631 if (contact->reverse_sort_name)
2632 ctsvc_stmt_bind_text(stmt, 4, contact->reverse_sort_name);
2633 if (contact->sortkey)
2634 ctsvc_stmt_bind_text(stmt, 5, contact->sortkey);
2635 if (contact->reverse_sortkey)
2636 ctsvc_stmt_bind_text(stmt, 6, contact->reverse_sortkey);
2638 ret = ctsvc_stmt_step(stmt);
2639 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_stmt_step() Fail(%d)", ret);
2641 ctsvc_stmt_finalize(stmt);
2644 contacts_record_destroy(record, true);
2648 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_contact;
2649 int ctsvc_db_contact_get(int id, contacts_record_h* out_record)
2651 return ctsvc_db_plugin_contact.get_record(id, out_record);