From 2fe4ba6f7e660a945ed94559110c76852c5edd47 Mon Sep 17 00:00:00 2001 From: HyungKyu Song Date: Sat, 16 Feb 2013 19:06:08 +0900 Subject: [PATCH] Tizen 2.0 Release --- CMakeLists.txt | 42 +- LICENSE => LICENSE.APLv2 | 0 NOTICE | 2 + build-util/API-generator.c | 59 - build-util/generator.sh | 35 +- client/CMakeLists.txt | 97 + .../contacts-service2.pc.in | 6 +- client/ctsvc_client_activity.c | 126 + client/ctsvc_client_db.c | 1521 +++++++ client/ctsvc_client_group.c | 140 + client/ctsvc_client_ipc.c | 279 ++ client/ctsvc_client_ipc.h | 44 + client/ctsvc_client_noti.c | 179 + client/ctsvc_client_person.c | 418 ++ client/ctsvc_client_phonelog.c | 148 + client/ctsvc_client_service.c | 199 + client/ctsvc_client_sim.c | 167 + common/ctsvc_db_notification.c | 55 + common/ctsvc_filter.c | 339 ++ common/ctsvc_filter.h | 30 + common/ctsvc_inotify.c | 399 ++ src/cts-inotify.h => common/ctsvc_inotify.h | 18 +- common/ctsvc_internal.h | 143 + common/ctsvc_list.c | 424 ++ common/ctsvc_list.h | 40 + common/ctsvc_localize.c | 502 +++ helper/localize.h => common/ctsvc_localize.h | 19 +- common/ctsvc_localize_ch.c | 2276 ++++++++++ helper/normalize.h => common/ctsvc_localize_ch.h | 22 +- src/cts-pthread.c => common/ctsvc_mutex.c | 51 +- src/cts-pthread.h => common/ctsvc_mutex.h | 14 +- common/ctsvc_normalize.c | 806 ++++ common/ctsvc_normalize.h | 79 + common/ctsvc_notify.h | 52 + common/ctsvc_query.c | 155 + common/ctsvc_query.h | 29 + common/ctsvc_record.c | 560 +++ common/ctsvc_record.h | 53 + common/ctsvc_record_addressbook.c | 198 + common/ctsvc_record_contact.c | 4331 ++++++++++++++++++++ common/ctsvc_record_group.c | 254 ++ common/ctsvc_record_my_profile.c | 595 +++ common/ctsvc_record_person.c | 306 ++ common/ctsvc_record_phonelog.c | 225 + common/ctsvc_record_result.c | 427 ++ common/ctsvc_record_sdn.c | 185 + common/ctsvc_record_speeddial.c | 223 + common/ctsvc_record_updated_info.c | 144 + common/ctsvc_setting.c | 156 + common/ctsvc_setting.h | 31 + common/ctsvc_sim.c | 51 + common/ctsvc_socket.c | 196 + common/ctsvc_socket.h | 56 + common/ctsvc_struct.h | 634 +++ common/ctsvc_vcard.c | 2793 +++++++++++++ common/ctsvc_vcard.h | 27 + common/ctsvc_view.c | 1287 ++++++ common/ctsvc_view.h | 461 +++ common/ipc/ctsvc_ipc_activity.c | 79 + common/ipc/ctsvc_ipc_activity_photo.c | 65 + common/ipc/ctsvc_ipc_address.c | 80 + common/ipc/ctsvc_ipc_addressbook.c | 63 + common/ipc/ctsvc_ipc_company.c | 85 + common/ipc/ctsvc_ipc_contact.c | 140 + common/ipc/ctsvc_ipc_define.h | 81 + common/ipc/ctsvc_ipc_email.c | 68 + common/ipc/ctsvc_ipc_event.c | 64 + common/ipc/ctsvc_ipc_extension.c | 86 + common/ipc/ctsvc_ipc_group.c | 72 + common/ipc/ctsvc_ipc_grouprelation.c | 64 + common/ipc/ctsvc_ipc_image.c | 68 + common/ipc/ctsvc_ipc_macros.h | 173 + common/ipc/ctsvc_ipc_marshal.c | 1237 ++++++ common/ipc/ctsvc_ipc_marshal.h | 86 + common/ipc/ctsvc_ipc_messenger.c | 65 + common/ipc/ctsvc_ipc_my_profile.c | 98 + common/ipc/ctsvc_ipc_name.c | 86 + common/ipc/ctsvc_ipc_nickname.c | 65 + common/ipc/ctsvc_ipc_note.c | 61 + common/ipc/ctsvc_ipc_number.c | 66 + common/ipc/ctsvc_ipc_person.c | 97 + common/ipc/ctsvc_ipc_phonelog.c | 72 + common/ipc/ctsvc_ipc_profile.c | 78 + common/ipc/ctsvc_ipc_relationship.c | 64 + common/ipc/ctsvc_ipc_result.c | 223 + common/ipc/ctsvc_ipc_sdn.c | 57 + common/ipc/ctsvc_ipc_simple_contact.c | 78 + common/ipc/ctsvc_ipc_speeddial.c | 61 + common/ipc/ctsvc_ipc_updated_info.c | 55 + common/ipc/ctsvc_ipc_url.c | 64 + contacts-service2.manifest | 20 + debian/changelog | 7 - debian/libcontacts-service.postinst.in | 21 - debian_NOT_USED/changelog | 2240 ++++++++++ {debian => debian_NOT_USED}/compat | 0 .../contacts-service-bin.install.in | 0 .../contacts-service-bin.postinst.in | 2 +- {debian => debian_NOT_USED}/control | 2 +- {debian => debian_NOT_USED}/copyright | 0 {debian => debian_NOT_USED}/dirs | 0 {debian => debian_NOT_USED}/docs | 0 .../libcontacts-service-dev.install.in | 0 .../libcontacts-service.install.in | 0 debian_NOT_USED/libcontacts-service.postinst.in | 25 + {debian => debian_NOT_USED}/rules | 2 +- helper/CMakeLists.txt | 24 - helper/contacts-svc-helper.sh | 1 - helper/helper-socket.c | 375 -- helper/localize.c | 181 - helper/main.c | 57 - helper/normalize.c | 186 - helper/schema-recovery.c | 85 - helper/sim.c | 617 --- helper/sqlite.c | 347 -- helper/utils.c | 155 - image/SLP_ContactsService_PG_image001.PNG | Bin 75708 -> 0 bytes include/ContactsService_PG.h | 333 -- include/contacts-svc-struct.head | 46 - include/contacts-svc-struct.tail | 6 - include/contacts-svc-sub.tail | 2 - include/contacts-svc.tail | 9 - include/contacts.h | 1316 ++++++ include/contacts_activity.h | 78 + include/contacts_db.h | 591 +++ include/contacts_errors.h | 85 + include/contacts_filter.h | 213 + include/contacts_group.h | 82 + include/contacts_list.h | 185 + include/contacts_person.h | 160 + include/contacts_phone_log.h | 85 + include/contacts_query.h | 128 + include/contacts_record.h | 349 ++ include/contacts_service.h | 120 + include/contacts_setting.h | 86 + include/contacts_sim.h | 72 + include/contacts_types.h | 231 ++ include/{contacts-svc.head => contacts_utils.h} | 110 +- include/contacts_vcard.h | 127 + include/contacts_views.h | 607 +++ native/CMakeLists.txt | 28 + native/contacts-service3.pc.in | 13 + native/ctsvc_activity.c | 88 + helper/sim.h => native/ctsvc_activity.h | 53 +- native/ctsvc_db_init.c | 896 ++++ native/ctsvc_db_init.h | 71 + native/ctsvc_db_plugin_activity.c | 529 +++ native/ctsvc_db_plugin_address.c | 371 ++ native/ctsvc_db_plugin_address_helper.c | 218 + native/ctsvc_db_plugin_address_helper.h | 31 + native/ctsvc_db_plugin_addressbook.c | 522 +++ native/ctsvc_db_plugin_company.c | 404 ++ native/ctsvc_db_plugin_company_helper.c | 307 ++ native/ctsvc_db_plugin_company_helper.h | 33 + native/ctsvc_db_plugin_contact.c | 2089 ++++++++++ native/ctsvc_db_plugin_contact_helper.c | 1659 ++++++++ native/ctsvc_db_plugin_contact_helper.h | 92 + native/ctsvc_db_plugin_email.c | 370 ++ native/ctsvc_db_plugin_email_helper.c | 146 + native/ctsvc_db_plugin_email_helper.h | 32 + native/ctsvc_db_plugin_event.c | 363 ++ native/ctsvc_db_plugin_event_helper.c | 150 + native/ctsvc_db_plugin_event_helper.h | 32 + native/ctsvc_db_plugin_extension.c | 398 ++ native/ctsvc_db_plugin_extension_helper.c | 191 + native/ctsvc_db_plugin_extension_helper.h | 32 + native/ctsvc_db_plugin_group.c | 507 +++ native/ctsvc_db_plugin_grouprelation.c | 209 + native/ctsvc_db_plugin_image.c | 360 ++ native/ctsvc_db_plugin_image_helper.c | 178 + native/ctsvc_db_plugin_image_helper.h | 32 + native/ctsvc_db_plugin_messenger.c | 357 ++ native/ctsvc_db_plugin_messenger_helper.c | 147 + native/ctsvc_db_plugin_messenger_helper.h | 32 + native/ctsvc_db_plugin_my_profile.c | 1089 +++++ native/ctsvc_db_plugin_name.c | 382 ++ native/ctsvc_db_plugin_name_helper.c | 385 ++ native/ctsvc_db_plugin_name_helper.h | 32 + native/ctsvc_db_plugin_nickname.c | 350 ++ native/ctsvc_db_plugin_nickname_helper.c | 143 + native/ctsvc_db_plugin_nickname_helper.h | 32 + native/ctsvc_db_plugin_note.c | 352 ++ native/ctsvc_db_plugin_note_helper.c | 136 + native/ctsvc_db_plugin_note_helper.h | 32 + native/ctsvc_db_plugin_number.c | 384 ++ native/ctsvc_db_plugin_number_helper.c | 167 + native/ctsvc_db_plugin_number_helper.h | 32 + native/ctsvc_db_plugin_person.c | 609 +++ native/ctsvc_db_plugin_person_helper.c | 477 +++ native/ctsvc_db_plugin_person_helper.h | 33 + native/ctsvc_db_plugin_phonelog.c | 475 +++ native/ctsvc_db_plugin_profile.c | 386 ++ native/ctsvc_db_plugin_profile_helper.c | 178 + native/ctsvc_db_plugin_profile_helper.h | 32 + native/ctsvc_db_plugin_relationship.c | 357 ++ native/ctsvc_db_plugin_relationship_helper.c | 150 + native/ctsvc_db_plugin_relationship_helper.h | 32 + native/ctsvc_db_plugin_sdn.c | 390 ++ .../ctsvc_db_plugin_sdn.h | 9 +- native/ctsvc_db_plugin_simple_contact.c | 527 +++ native/ctsvc_db_plugin_speeddial.c | 400 ++ native/ctsvc_db_plugin_url.c | 365 ++ native/ctsvc_db_plugin_url_helper.c | 147 + native/ctsvc_db_plugin_url_helper.h | 32 + native/ctsvc_db_query.c | 2119 ++++++++++ native/ctsvc_db_query.h | 38 + native/ctsvc_group.c | 223 + src/cts-vcard-file.h => native/ctsvc_group.h | 19 +- native/ctsvc_notification.c | 557 +++ native/ctsvc_notification.h | 58 + native/ctsvc_person.c | 1269 ++++++ native/ctsvc_person.h | 29 + native/ctsvc_phonelog.c | 107 + native/ctsvc_phonelog.h | 27 + native/ctsvc_restriction.c | 82 + .../SIMimport-test.c => native/ctsvc_restriction.h | 17 +- native/ctsvc_schema.h | 119 + native/ctsvc_service.c | 195 + native/ctsvc_service.h | 29 + native/ctsvc_sqlite.c | 270 ++ src/cts-sqlite.h => native/ctsvc_sqlite.h | 63 +- native/ctsvc_utils.c | 428 ++ native/ctsvc_utils.h | 35 + packaging/contacts-service.service | 13 + packaging/contacts-service.spec | 119 +- res/.CONTACTS_SVC_AB_CHANGED | 0 res/.CONTACTS_SVC_ACTIVITY_CHANGED | 0 res/.CONTACTS_SVC_ADDRESS_CHANGED | 0 res/.CONTACTS_SVC_COMPANY_CHANGED | 0 res/.CONTACTS_SVC_DATA_CHANGED | 0 res/.CONTACTS_SVC_DB_CHANGED | 0 res/.CONTACTS_SVC_EMAIL_CHANGED | 0 res/.CONTACTS_SVC_EVENT_CHANGED | 0 res/.CONTACTS_SVC_FAVOR_CHANGED | 0 res/.CONTACTS_SVC_GROUP_CHANGED | 0 res/.CONTACTS_SVC_GROUP_RELATION_CHANGED | 0 res/.CONTACTS_SVC_GROUP_REL_CHANGED | 0 res/.CONTACTS_SVC_IMAGE_CHANGED | 0 res/.CONTACTS_SVC_MESSENGER_CHANGED | 0 res/.CONTACTS_SVC_MISSED_CHANGED | 0 res/.CONTACTS_SVC_MY_PROFILE_CHANGED | 0 res/.CONTACTS_SVC_NAME_CHANGED | 0 res/.CONTACTS_SVC_NICKNAME_CHANGED | 0 res/.CONTACTS_SVC_NOTE_CHANGED | 0 res/.CONTACTS_SVC_NUMBER_CHANGED | 0 res/.CONTACTS_SVC_PERSON_CHANGED | 0 res/.CONTACTS_SVC_PLOG_CHANGED | 0 res/.CONTACTS_SVC_PROFILE_CHANGED | 0 res/.CONTACTS_SVC_RELATIONSHIP_CHANGED | 0 res/.CONTACTS_SVC_RESTRICTION_CHECK | 0 res/.CONTACTS_SVC_SDN_CHANGED | 0 res/.CONTACTS_SVC_SIMPLE_CONTACT_CHANGED | 0 res/.CONTACTS_SVC_SPEED_CHANGED | 0 res/.CONTACTS_SVC_URL_CHANGED | 0 res/Not empty folder | 0 schema.sql | 432 +- server/CMakeLists.txt | 175 + server/contacts-service-ipcd.sh | 3 + server/ctsvc_ipc_server.c | 1562 +++++++ server/ctsvc_ipc_server.h | 52 + server/ctsvc_ipc_server2.c | 661 +++ server/ctsvc_ipc_server2.h | 41 + server/ctsvc_ipc_server_sim.c | 43 + server/ctsvc_ipc_server_sim.h | 28 + server/ctsvc_schema_recovery.c | 91 + .../ctsvc_schema_recovery.h | 10 +- server/ctsvc_server.c | 146 + server/ctsvc_server_bg.c | 383 ++ server/ctsvc_server_bg.h | 27 + server/ctsvc_server_change_subject.c | 128 + .../ctsvc_server_change_subject.h | 66 +- server/ctsvc_server_sim.c | 667 +++ server/ctsvc_server_sim.h | 46 + server/ctsvc_server_socket.c | 230 ++ .../ctsvc_server_socket.h | 57 +- server/ctsvc_server_sqlite.c | 421 ++ server/ctsvc_server_sqlite.h | 34 + server/ctsvc_server_utils.c | 197 + helper/utils.h => server/ctsvc_server_utils.h | 19 +- {helper => server}/internal.h | 55 +- src/cts-addressbook.c | 234 -- src/cts-addressbook.h | 200 - src/cts-contact.c | 3160 -------------- src/cts-contact.h | 414 -- src/cts-errors.h | 59 - src/cts-favorite.c | 356 -- src/cts-favorite.h | 99 - src/cts-group.c | 391 -- src/cts-group.h | 226 - src/cts-inotify.c | 340 -- src/cts-internal.h | 119 - src/cts-list-info.c | 359 -- src/cts-list.c | 1447 ------- src/cts-list.h | 612 --- src/cts-normalize.c | 615 --- src/cts-normalize.h | 66 - src/cts-phonelog.c | 442 -- src/cts-phonelog.h | 174 - src/cts-schema.h | 58 - src/cts-service.c | 126 - src/cts-service.h | 49 - src/cts-socket.c | 277 -- src/cts-socket.h | 59 - src/cts-sqlite.c | 411 -- src/cts-struct-ext.c | 745 ---- src/cts-struct-ext.h | 51 - src/cts-struct.c | 2927 ------------- src/cts-struct.h | 826 ---- src/cts-types.c | 155 - src/cts-types.h | 361 -- src/cts-utils.c | 929 ----- src/cts-utils.h | 294 -- src/cts-vcard-file.c | 1765 -------- src/cts-vcard.c | 416 -- src/cts-vcard.h | 133 - test/Makefile | 30 - test/addressbook-test.c | 186 - test/change-noti-test.c | 68 - test/contact-test.c | 868 ---- test/group-test.c | 138 - test/phonelog-test.c | 185 - test/timetest.c | 143 - test/timetest.h | 53 - test/vcard2contact-test.c | 145 - 323 files changed, 62666 insertions(+), 23767 deletions(-) rename LICENSE => LICENSE.APLv2 (100%) delete mode 100755 build-util/API-generator.c create mode 100755 client/CMakeLists.txt rename contacts-service.pc.in => client/contacts-service2.pc.in (72%) create mode 100644 client/ctsvc_client_activity.c create mode 100644 client/ctsvc_client_db.c create mode 100644 client/ctsvc_client_group.c create mode 100755 client/ctsvc_client_ipc.c create mode 100644 client/ctsvc_client_ipc.h create mode 100644 client/ctsvc_client_noti.c create mode 100644 client/ctsvc_client_person.c create mode 100644 client/ctsvc_client_phonelog.c create mode 100644 client/ctsvc_client_service.c create mode 100644 client/ctsvc_client_sim.c create mode 100644 common/ctsvc_db_notification.c create mode 100644 common/ctsvc_filter.c create mode 100644 common/ctsvc_filter.h create mode 100755 common/ctsvc_inotify.c rename src/cts-inotify.h => common/ctsvc_inotify.h (62%) create mode 100644 common/ctsvc_internal.h create mode 100644 common/ctsvc_list.c create mode 100644 common/ctsvc_list.h create mode 100755 common/ctsvc_localize.c rename helper/localize.h => common/ctsvc_localize.h (62%) create mode 100755 common/ctsvc_localize_ch.c rename helper/normalize.h => common/ctsvc_localize_ch.h (57%) rename src/cts-pthread.c => common/ctsvc_mutex.c (56%) rename src/cts-pthread.h => common/ctsvc_mutex.h (78%) create mode 100644 common/ctsvc_normalize.c create mode 100644 common/ctsvc_normalize.h create mode 100644 common/ctsvc_notify.h create mode 100644 common/ctsvc_query.c create mode 100644 common/ctsvc_query.h create mode 100644 common/ctsvc_record.c create mode 100644 common/ctsvc_record.h create mode 100644 common/ctsvc_record_addressbook.c create mode 100644 common/ctsvc_record_contact.c create mode 100644 common/ctsvc_record_group.c create mode 100644 common/ctsvc_record_my_profile.c create mode 100755 common/ctsvc_record_person.c create mode 100644 common/ctsvc_record_phonelog.c create mode 100644 common/ctsvc_record_result.c create mode 100644 common/ctsvc_record_sdn.c create mode 100644 common/ctsvc_record_speeddial.c create mode 100644 common/ctsvc_record_updated_info.c create mode 100644 common/ctsvc_setting.c create mode 100644 common/ctsvc_setting.h create mode 100644 common/ctsvc_sim.c create mode 100644 common/ctsvc_socket.c create mode 100644 common/ctsvc_socket.h create mode 100644 common/ctsvc_struct.h create mode 100644 common/ctsvc_vcard.c create mode 100644 common/ctsvc_vcard.h create mode 100644 common/ctsvc_view.c create mode 100644 common/ctsvc_view.h create mode 100644 common/ipc/ctsvc_ipc_activity.c create mode 100644 common/ipc/ctsvc_ipc_activity_photo.c create mode 100644 common/ipc/ctsvc_ipc_address.c create mode 100644 common/ipc/ctsvc_ipc_addressbook.c create mode 100644 common/ipc/ctsvc_ipc_company.c create mode 100644 common/ipc/ctsvc_ipc_contact.c create mode 100644 common/ipc/ctsvc_ipc_define.h create mode 100644 common/ipc/ctsvc_ipc_email.c create mode 100644 common/ipc/ctsvc_ipc_event.c create mode 100644 common/ipc/ctsvc_ipc_extension.c create mode 100644 common/ipc/ctsvc_ipc_group.c create mode 100644 common/ipc/ctsvc_ipc_grouprelation.c create mode 100644 common/ipc/ctsvc_ipc_image.c create mode 100644 common/ipc/ctsvc_ipc_macros.h create mode 100644 common/ipc/ctsvc_ipc_marshal.c create mode 100644 common/ipc/ctsvc_ipc_marshal.h create mode 100644 common/ipc/ctsvc_ipc_messenger.c create mode 100644 common/ipc/ctsvc_ipc_my_profile.c create mode 100644 common/ipc/ctsvc_ipc_name.c create mode 100644 common/ipc/ctsvc_ipc_nickname.c create mode 100644 common/ipc/ctsvc_ipc_note.c create mode 100644 common/ipc/ctsvc_ipc_number.c create mode 100644 common/ipc/ctsvc_ipc_person.c create mode 100644 common/ipc/ctsvc_ipc_phonelog.c create mode 100644 common/ipc/ctsvc_ipc_profile.c create mode 100644 common/ipc/ctsvc_ipc_relationship.c create mode 100644 common/ipc/ctsvc_ipc_result.c create mode 100644 common/ipc/ctsvc_ipc_sdn.c create mode 100644 common/ipc/ctsvc_ipc_simple_contact.c create mode 100644 common/ipc/ctsvc_ipc_speeddial.c create mode 100644 common/ipc/ctsvc_ipc_updated_info.c create mode 100644 common/ipc/ctsvc_ipc_url.c create mode 100644 contacts-service2.manifest delete mode 100644 debian/changelog delete mode 100755 debian/libcontacts-service.postinst.in create mode 100755 debian_NOT_USED/changelog rename {debian => debian_NOT_USED}/compat (100%) rename {debian => debian_NOT_USED}/contacts-service-bin.install.in (100%) rename {debian => debian_NOT_USED}/contacts-service-bin.postinst.in (89%) rename {debian => debian_NOT_USED}/control (95%) rename {debian => debian_NOT_USED}/copyright (100%) rename {debian => debian_NOT_USED}/dirs (100%) rename {debian => debian_NOT_USED}/docs (100%) rename {debian => debian_NOT_USED}/libcontacts-service-dev.install.in (100%) rename {debian => debian_NOT_USED}/libcontacts-service.install.in (100%) create mode 100755 debian_NOT_USED/libcontacts-service.postinst.in rename {debian => debian_NOT_USED}/rules (98%) delete mode 100755 helper/CMakeLists.txt delete mode 100755 helper/contacts-svc-helper.sh delete mode 100755 helper/helper-socket.c delete mode 100755 helper/localize.c delete mode 100755 helper/main.c delete mode 100755 helper/normalize.c delete mode 100755 helper/schema-recovery.c delete mode 100755 helper/sim.c delete mode 100755 helper/sqlite.c delete mode 100755 helper/utils.c delete mode 100755 image/SLP_ContactsService_PG_image001.PNG delete mode 100755 include/ContactsService_PG.h delete mode 100755 include/contacts-svc-struct.head delete mode 100755 include/contacts-svc-struct.tail delete mode 100755 include/contacts-svc-sub.tail delete mode 100644 include/contacts-svc.tail create mode 100644 include/contacts.h create mode 100644 include/contacts_activity.h create mode 100755 include/contacts_db.h create mode 100755 include/contacts_errors.h create mode 100755 include/contacts_filter.h create mode 100644 include/contacts_group.h create mode 100644 include/contacts_list.h create mode 100644 include/contacts_person.h create mode 100644 include/contacts_phone_log.h create mode 100644 include/contacts_query.h create mode 100644 include/contacts_record.h create mode 100755 include/contacts_service.h create mode 100755 include/contacts_setting.h create mode 100644 include/contacts_sim.h create mode 100644 include/contacts_types.h rename include/{contacts-svc.head => contacts_utils.h} (52%) mode change 100755 => 100644 create mode 100644 include/contacts_vcard.h create mode 100755 include/contacts_views.h create mode 100755 native/CMakeLists.txt create mode 100644 native/contacts-service3.pc.in create mode 100644 native/ctsvc_activity.c rename helper/sim.h => native/ctsvc_activity.h (72%) mode change 100755 => 100644 create mode 100644 native/ctsvc_db_init.c create mode 100644 native/ctsvc_db_init.h create mode 100644 native/ctsvc_db_plugin_activity.c create mode 100644 native/ctsvc_db_plugin_address.c create mode 100644 native/ctsvc_db_plugin_address_helper.c create mode 100644 native/ctsvc_db_plugin_address_helper.h create mode 100644 native/ctsvc_db_plugin_addressbook.c create mode 100644 native/ctsvc_db_plugin_company.c create mode 100644 native/ctsvc_db_plugin_company_helper.c create mode 100644 native/ctsvc_db_plugin_company_helper.h create mode 100644 native/ctsvc_db_plugin_contact.c create mode 100644 native/ctsvc_db_plugin_contact_helper.c create mode 100644 native/ctsvc_db_plugin_contact_helper.h create mode 100644 native/ctsvc_db_plugin_email.c create mode 100644 native/ctsvc_db_plugin_email_helper.c create mode 100644 native/ctsvc_db_plugin_email_helper.h create mode 100644 native/ctsvc_db_plugin_event.c create mode 100644 native/ctsvc_db_plugin_event_helper.c create mode 100644 native/ctsvc_db_plugin_event_helper.h create mode 100644 native/ctsvc_db_plugin_extension.c create mode 100644 native/ctsvc_db_plugin_extension_helper.c create mode 100644 native/ctsvc_db_plugin_extension_helper.h create mode 100644 native/ctsvc_db_plugin_group.c create mode 100644 native/ctsvc_db_plugin_grouprelation.c create mode 100644 native/ctsvc_db_plugin_image.c create mode 100644 native/ctsvc_db_plugin_image_helper.c create mode 100644 native/ctsvc_db_plugin_image_helper.h create mode 100644 native/ctsvc_db_plugin_messenger.c create mode 100644 native/ctsvc_db_plugin_messenger_helper.c create mode 100644 native/ctsvc_db_plugin_messenger_helper.h create mode 100644 native/ctsvc_db_plugin_my_profile.c create mode 100644 native/ctsvc_db_plugin_name.c create mode 100644 native/ctsvc_db_plugin_name_helper.c create mode 100644 native/ctsvc_db_plugin_name_helper.h create mode 100644 native/ctsvc_db_plugin_nickname.c create mode 100644 native/ctsvc_db_plugin_nickname_helper.c create mode 100644 native/ctsvc_db_plugin_nickname_helper.h create mode 100644 native/ctsvc_db_plugin_note.c create mode 100644 native/ctsvc_db_plugin_note_helper.c create mode 100644 native/ctsvc_db_plugin_note_helper.h create mode 100644 native/ctsvc_db_plugin_number.c create mode 100644 native/ctsvc_db_plugin_number_helper.c create mode 100644 native/ctsvc_db_plugin_number_helper.h create mode 100644 native/ctsvc_db_plugin_person.c create mode 100755 native/ctsvc_db_plugin_person_helper.c create mode 100755 native/ctsvc_db_plugin_person_helper.h create mode 100644 native/ctsvc_db_plugin_phonelog.c create mode 100644 native/ctsvc_db_plugin_profile.c create mode 100644 native/ctsvc_db_plugin_profile_helper.c create mode 100644 native/ctsvc_db_plugin_profile_helper.h create mode 100644 native/ctsvc_db_plugin_relationship.c create mode 100644 native/ctsvc_db_plugin_relationship_helper.c create mode 100644 native/ctsvc_db_plugin_relationship_helper.h create mode 100644 native/ctsvc_db_plugin_sdn.c rename include/contacts-svc-sub.head => native/ctsvc_db_plugin_sdn.h (85%) mode change 100755 => 100644 create mode 100644 native/ctsvc_db_plugin_simple_contact.c create mode 100644 native/ctsvc_db_plugin_speeddial.c create mode 100644 native/ctsvc_db_plugin_url.c create mode 100644 native/ctsvc_db_plugin_url_helper.c create mode 100644 native/ctsvc_db_plugin_url_helper.h create mode 100755 native/ctsvc_db_query.c create mode 100644 native/ctsvc_db_query.h create mode 100644 native/ctsvc_group.c rename src/cts-vcard-file.h => native/ctsvc_group.h (63%) mode change 100755 => 100644 create mode 100644 native/ctsvc_notification.c create mode 100644 native/ctsvc_notification.h create mode 100644 native/ctsvc_person.c create mode 100644 native/ctsvc_person.h create mode 100644 native/ctsvc_phonelog.c create mode 100644 native/ctsvc_phonelog.h create mode 100755 native/ctsvc_restriction.c rename test/SIMimport-test.c => native/ctsvc_restriction.h (74%) create mode 100755 native/ctsvc_schema.h create mode 100644 native/ctsvc_service.c create mode 100644 native/ctsvc_service.h create mode 100755 native/ctsvc_sqlite.c rename src/cts-sqlite.h => native/ctsvc_sqlite.h (55%) create mode 100644 native/ctsvc_utils.c create mode 100644 native/ctsvc_utils.h create mode 100644 packaging/contacts-service.service create mode 100644 res/.CONTACTS_SVC_AB_CHANGED create mode 100644 res/.CONTACTS_SVC_ACTIVITY_CHANGED create mode 100644 res/.CONTACTS_SVC_ADDRESS_CHANGED create mode 100644 res/.CONTACTS_SVC_COMPANY_CHANGED create mode 100644 res/.CONTACTS_SVC_DATA_CHANGED create mode 100644 res/.CONTACTS_SVC_DB_CHANGED create mode 100644 res/.CONTACTS_SVC_EMAIL_CHANGED create mode 100644 res/.CONTACTS_SVC_EVENT_CHANGED create mode 100644 res/.CONTACTS_SVC_FAVOR_CHANGED create mode 100644 res/.CONTACTS_SVC_GROUP_CHANGED create mode 100644 res/.CONTACTS_SVC_GROUP_RELATION_CHANGED create mode 100644 res/.CONTACTS_SVC_GROUP_REL_CHANGED create mode 100644 res/.CONTACTS_SVC_IMAGE_CHANGED create mode 100644 res/.CONTACTS_SVC_MESSENGER_CHANGED create mode 100644 res/.CONTACTS_SVC_MISSED_CHANGED create mode 100644 res/.CONTACTS_SVC_MY_PROFILE_CHANGED create mode 100644 res/.CONTACTS_SVC_NAME_CHANGED create mode 100644 res/.CONTACTS_SVC_NICKNAME_CHANGED create mode 100644 res/.CONTACTS_SVC_NOTE_CHANGED create mode 100644 res/.CONTACTS_SVC_NUMBER_CHANGED create mode 100644 res/.CONTACTS_SVC_PERSON_CHANGED create mode 100644 res/.CONTACTS_SVC_PLOG_CHANGED create mode 100644 res/.CONTACTS_SVC_PROFILE_CHANGED create mode 100644 res/.CONTACTS_SVC_RELATIONSHIP_CHANGED create mode 100644 res/.CONTACTS_SVC_RESTRICTION_CHECK create mode 100644 res/.CONTACTS_SVC_SDN_CHANGED create mode 100644 res/.CONTACTS_SVC_SIMPLE_CONTACT_CHANGED create mode 100644 res/.CONTACTS_SVC_SPEED_CHANGED create mode 100644 res/.CONTACTS_SVC_URL_CHANGED create mode 100644 res/Not empty folder create mode 100755 server/CMakeLists.txt create mode 100755 server/contacts-service-ipcd.sh create mode 100644 server/ctsvc_ipc_server.c create mode 100644 server/ctsvc_ipc_server.h create mode 100644 server/ctsvc_ipc_server2.c create mode 100644 server/ctsvc_ipc_server2.h create mode 100644 server/ctsvc_ipc_server_sim.c create mode 100644 server/ctsvc_ipc_server_sim.h create mode 100755 server/ctsvc_schema_recovery.c rename helper/schema-recovery.h => server/ctsvc_schema_recovery.h (76%) create mode 100644 server/ctsvc_server.c create mode 100644 server/ctsvc_server_bg.c create mode 100644 server/ctsvc_server_bg.h create mode 100644 server/ctsvc_server_change_subject.c rename helper/sqlite.h => server/ctsvc_server_change_subject.h (60%) mode change 100755 => 100644 create mode 100755 server/ctsvc_server_sim.c create mode 100755 server/ctsvc_server_sim.h create mode 100644 server/ctsvc_server_socket.c rename helper/helper-socket.h => server/ctsvc_server_socket.h (66%) mode change 100755 => 100644 create mode 100755 server/ctsvc_server_sqlite.c create mode 100755 server/ctsvc_server_sqlite.h create mode 100755 server/ctsvc_server_utils.c rename helper/utils.h => server/ctsvc_server_utils.h (64%) rename {helper => server}/internal.h (57%) delete mode 100755 src/cts-addressbook.c delete mode 100755 src/cts-addressbook.h delete mode 100755 src/cts-contact.c delete mode 100755 src/cts-contact.h delete mode 100755 src/cts-errors.h delete mode 100755 src/cts-favorite.c delete mode 100755 src/cts-favorite.h delete mode 100755 src/cts-group.c delete mode 100755 src/cts-group.h delete mode 100755 src/cts-inotify.c delete mode 100755 src/cts-internal.h delete mode 100755 src/cts-list-info.c delete mode 100755 src/cts-list.c delete mode 100755 src/cts-list.h delete mode 100755 src/cts-normalize.c delete mode 100755 src/cts-normalize.h delete mode 100755 src/cts-phonelog.c delete mode 100755 src/cts-phonelog.h delete mode 100755 src/cts-schema.h delete mode 100755 src/cts-service.c delete mode 100755 src/cts-service.h delete mode 100755 src/cts-socket.c delete mode 100755 src/cts-socket.h delete mode 100755 src/cts-sqlite.c delete mode 100755 src/cts-struct-ext.c delete mode 100755 src/cts-struct-ext.h delete mode 100755 src/cts-struct.c delete mode 100755 src/cts-struct.h delete mode 100755 src/cts-types.c delete mode 100755 src/cts-types.h delete mode 100755 src/cts-utils.c delete mode 100755 src/cts-utils.h delete mode 100755 src/cts-vcard-file.c delete mode 100755 src/cts-vcard.c delete mode 100755 src/cts-vcard.h delete mode 100755 test/Makefile delete mode 100755 test/addressbook-test.c delete mode 100755 test/change-noti-test.c delete mode 100755 test/contact-test.c delete mode 100755 test/group-test.c delete mode 100755 test/phonelog-test.c delete mode 100755 test/timetest.c delete mode 100755 test/timetest.h delete mode 100755 test/vcard2contact-test.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 2e79af0..cff5090 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,17 +14,17 @@ SET(EXEC_PREFIX "\${prefix}") SET(LIBDIR "\${prefix}/lib") SET(INCLUDEDIR "\${prefix}/${DEST_INCLUDE_DIR}") SET(VERSION_MAJOR 0) -SET(VERSION "${VERSION_MAJOR}.5.2") +SET(VERSION "${VERSION_MAJOR}.9.24.8") EXECUTE_PROCESS(COMMAND build-util/generator.sh) +SET(PC_REQUIRED "capi-base-common") + #INCLUDE_DIRECTORIES(${SRC_INCLUDE_DIR}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -I${SRC_INCLUDE_DIR}") -FILE(GLOB SRCS src/*.c) - INCLUDE(FindPkgConfig) -pkg_check_modules(pkgs REQUIRED glib-2.0 sqlite3 vconf dlog db-util) +pkg_check_modules(pkgs REQUIRED glib-2.0 capi-base-common vconf dlog db-util icu-i18n) FOREACH(flag ${pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") @@ -32,32 +32,28 @@ ENDFOREACH(flag) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC") #SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") #SET(CMAKE_C_FLAGS_RELEASE "-mabi=aapcs-linux -march=armv7-a -msoft-float -O2") ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") -ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS}) -SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION ${VERSION_MAJOR}) -SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES VERSION ${VERSION}) -TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} -lpthread) - -CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) -SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES - "${PROJECT_NAME}.pc;include/contacts-svc-sub.h;include/contacts-svc.h;include/contacts-svc-struct.h;helper/schema.h") +# Install notification files +FILE(GLOB NOTI_FILES ${CMAKE_SOURCE_DIR}/res/.CONTACTS_SVC_*) +INSTALL(FILES ${NOTI_FILES} DESTINATION /opt/usr/data/contacts-svc + PERMISSIONS OWNER_WRITE OWNER_READ GROUP_WRITE GROUP_READ) -INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib) -INSTALL(FILES ${PROJECT_NAME}.pc DESTINATION lib/pkgconfig) +# Install directory for image +INSTALL(DIRECTORY DESTINATION /opt/usr/data/contacts-svc/img/vcard) +INSTALL(DIRECTORY DESTINATION /opt/usr/data/contacts-svc/img/my) +INSTALL(DIRECTORY DESTINATION /opt/usr/data/contacts-svc/img/group) +INSTALL(DIRECTORY DESTINATION /opt/usr/data/contacts-svc/img/logo) -FILE(GLOB HEADER_FILES ${SRC_INCLUDE_DIR}/contacts-svc*.h) +# Install header file +FILE(GLOB HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h) INSTALL(FILES ${HEADER_FILES} DESTINATION ${DEST_INCLUDE_DIR}) -INSTALL(FILES ${SRC_INCLUDE_DIR}/ContactsService_PG.h DESTINATION ${DEST_INCLUDE_DIR}) - -FILE(GLOB NOTI_FILES ${CMAKE_SOURCE_DIR}/.CONTACTS_SVC_*_CHANGED) -INSTALL(FILES ${NOTI_FILES} DESTINATION /opt/data/contacts-svc) - -INSTALL(DIRECTORY DESTINATION /opt/data/contacts-svc/img/vcard) -ADD_SUBDIRECTORY(helper) +ADD_SUBDIRECTORY(native) +ADD_SUBDIRECTORY(client) +ADD_SUBDIRECTORY(server) diff --git a/LICENSE b/LICENSE.APLv2 similarity index 100% rename from LICENSE rename to LICENSE.APLv2 diff --git a/NOTICE b/NOTICE index fd4209d..d4bc6d5 100644 --- a/NOTICE +++ b/NOTICE @@ -1 +1,3 @@ Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. +Except as noted, this software is licensed under Apache License, Version 2. +Please, see the LICENSE.APLv2 file for Apache license, version 2 terms and conditions. diff --git a/build-util/API-generator.c b/build-util/API-generator.c deleted file mode 100755 index ee62026..0000000 --- a/build-util/API-generator.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#define _GNU_SOURCE -#include -#include - -int main(int argc, char **argv) -{ - FILE *fp; - char *line = NULL; - size_t len = 0; - ssize_t read; - - fp = fopen(argv[1], "r"); - if (fp == NULL) - exit(EXIT_FAILURE); - - while ((read = getline(&line, &len, fp)) != -1) { - if (len >= 6 && '/'==line[0] - && '/'==line[1] - && '<'==line[2] - && '!'==line[3] - && '-'==line[4] - && '-'==line[5]) - break; - } - - while ((read = getline(&line, &len, fp)) != -1) { - if (len >= 5 && '/'==line[0] - && '/'==line[1] - && '-'==line[2] - && '-'==line[3] - && '>'==line[4]) - break; - printf("%s", line); - } - - free(line); - exit(EXIT_SUCCESS); -} - diff --git a/build-util/generator.sh b/build-util/generator.sh index 0bc0730..366aeba 100755 --- a/build-util/generator.sh +++ b/build-util/generator.sh @@ -25,37 +25,10 @@ echo "###### API Generator #####" cd build-util make -#contacts-svc.h -cat ../include/contacts-svc.head > ../include/contacts-svc.h -./API-generator ../src/cts-service.h >> ../include/contacts-svc.h -./API-generator ../src/cts-errors.h >> ../include/contacts-svc.h -./API-generator ../src/cts-addressbook.h >> ../include/contacts-svc.h -./API-generator ../src/cts-contact.h >> ../include/contacts-svc.h -./API-generator ../src/cts-normalize.h >> ../include/contacts-svc.h -./API-generator ../src/cts-list.h >> ../include/contacts-svc.h -./API-generator ../src/cts-utils.h >> ../include/contacts-svc.h -./API-generator ../src/cts-vcard.h >> ../include/contacts-svc.h -cat ../include/contacts-svc.tail >> ../include/contacts-svc.h - -# contacts-svc-struct.h -cat ../include/contacts-svc-struct.head > ../include/contacts-svc-struct.h -./API-generator ../src/cts-struct.h >> ../include/contacts-svc-struct.h -./API-generator ../src/cts-struct-ext.h >> ../include/contacts-svc-struct.h -cat ../include/contacts-svc-struct.tail >> ../include/contacts-svc-struct.h - -# contacts-svc-sub.h -cat ../include/contacts-svc-sub.head > ../include/contacts-svc-sub.h -./API-generator ../src/cts-phonelog.h >> ../include/contacts-svc-sub.h -./API-generator ../src/cts-favorite.h >> ../include/contacts-svc-sub.h -./API-generator ../src/cts-group.h >> ../include/contacts-svc-sub.h -./API-generator ../src/cts-im.h >> ../include/contacts-svc-sub.h -./API-generator ../src/cts-types.h >> ../include/contacts-svc-sub.h -cat ../include/contacts-svc-sub.tail >> ../include/contacts-svc-sub.h - -# Schema -echo "static const char *schema_query = \"\\" > ../helper/schema.h -./DB-schema-gen ../schema.sql >> ../helper/schema.h -echo \"\; >> ../helper/schema.h +# New server daemon Schema +echo "static const char *schema_query = \"\\" > ../server/schema.h +./DB-schema-gen ../schema.sql >> ../server/schema.h +echo \"\; >> ../server/schema.h make clean diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt new file mode 100755 index 0000000..fdc06b4 --- /dev/null +++ b/client/CMakeLists.txt @@ -0,0 +1,97 @@ +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/client) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/common) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/common/ipc) + + +SET(CLIENT contacts-service2) + +SET(SRCS + ctsvc_client_activity.c + ctsvc_client_db.c + ctsvc_client_group.c + ctsvc_client_person.c + ctsvc_client_phonelog.c + ctsvc_client_service.c + ctsvc_client_ipc.c + ctsvc_client_noti.c + + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_marshal.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_addressbook.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_contact.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_my_profile.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_group.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_person.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_phonelog.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_result.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_sdn.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_simple_contact.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_speeddial.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_result.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_updated_info.c + + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_activity.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_activity_photo.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_address.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_company.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_email.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_event.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_grouprelation.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_messenger.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_name.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_nickname.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_note.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_number.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_relationship.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_image.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_url.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_extension.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_profile.c + + ${CMAKE_SOURCE_DIR}/common/ctsvc_db_notification.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_filter.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_inotify.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_list.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_localize.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_normalize.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_mutex.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_query.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_addressbook.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_contact.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_my_profile.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_group.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_person.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_phonelog.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_result.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_sdn.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_speeddial.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_updated_info.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_setting.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_sim.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_socket.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_vcard.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_view.c +) + +INCLUDE(FindPkgConfig) +pkg_check_modules(client_pkgs REQUIRED pims-ipc gobject-2.0) + +FOREACH(flag ${client_pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC") + +CONFIGURE_FILE(${CLIENT}.pc.in ${CLIENT}.pc @ONLY) + +ADD_DEFINITIONS("-D_CONTACTS_IPC_CLIENT") + +ADD_LIBRARY(${CLIENT} SHARED ${SRCS}) +SET_TARGET_PROPERTIES(${CLIENT} PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES(${CLIENT} PROPERTIES VERSION ${VERSION}) +TARGET_LINK_LIBRARIES(${CLIENT} ${client_pkgs_LDFLAGS} ${pkgs_LDFLAGS} -lpthread) + +INSTALL(TARGETS ${CLIENT} DESTINATION lib) +INSTALL(FILES ${CLIENT}.pc DESTINATION lib/pkgconfig) + diff --git a/contacts-service.pc.in b/client/contacts-service2.pc.in similarity index 72% rename from contacts-service.pc.in rename to client/contacts-service2.pc.in index cdaf2a5..5ac7490 100644 --- a/contacts-service.pc.in +++ b/client/contacts-service2.pc.in @@ -5,9 +5,9 @@ exec_prefix=@EXEC_PREFIX@ libdir=@LIBDIR@ includedir=@INCLUDEDIR@ -Name: @PROJECT_NAME@ +Name: @TARGET@ Description: @PROJECT_NAME@ library Version: @VERSION@ -Requires: glib-2.0 -Libs: -L${libdir} -l@PROJECT_NAME@ +Requires: glib-2.0 @PC_REQUIRED@ +Libs: -L${libdir} -l@CLIENT@ Cflags: -I${includedir} diff --git a/client/ctsvc_client_activity.c b/client/ctsvc_client_activity.c new file mode 100644 index 0000000..b3856a9 --- /dev/null +++ b/client/ctsvc_client_activity.c @@ -0,0 +1,126 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_ipc_define.h" +#include "ctsvc_ipc_marshal.h" +#include "ctsvc_client_ipc.h" +#include + +API int contacts_activity_delete_by_contact_id(int contact_id) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(contact_id <= 0,CONTACTS_ERROR_INVALID_PARAMETER,"id should be greater than 0"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + ret = ctsvc_ipc_marshal_int( contact_id, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + + // ipc call + if (ctsvc_ipc_call( CTSVC_IPC_ACTIVITY_MODULE, CTSVC_IPC_SERVER_ACTIVITY_DELETE_BY_CONTACT_ID, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + pims_ipc_data_destroy(indata); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check result + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata, &size); + + pims_ipc_data_destroy(outdata); + } + + return ret; +} + +API int contacts_activity_delete_by_account_id(int account_id) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(account_id <= 0,CONTACTS_ERROR_INVALID_PARAMETER,"id should be greater than 0"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + ret = ctsvc_ipc_marshal_int( account_id, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + + // ipc call + if (ctsvc_ipc_call( CTSVC_IPC_ACTIVITY_MODULE, CTSVC_IPC_SERVER_ACTIVITY_DELETE_BY_ACCOUNT_ID, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + pims_ipc_data_destroy(indata); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check result + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata, &size); + + pims_ipc_data_destroy(outdata); + } + + return ret; +} + diff --git a/client/ctsvc_client_db.c b/client/ctsvc_client_db.c new file mode 100644 index 0000000..cf1f9a0 --- /dev/null +++ b/client/ctsvc_client_db.c @@ -0,0 +1,1521 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_list.h" +#include "ctsvc_record.h" +#include "ctsvc_query.h" +#include "ctsvc_inotify.h" + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_define.h" +#include "ctsvc_ipc_marshal.h" +#include "ctsvc_view.h" + +#include "ctsvc_client_ipc.h" +#include + +#include "ctsvc_inotify.h" + +typedef struct { + void *callback; + void *user_data; + contacts_list_h list; +}ctsvc_ipc_async_userdata_s; + +static void __ctsvc_ipc_client_insert_records_cb(pims_ipc_h ipc, pims_ipc_data_h data_out, void *userdata); +static void __ctsvc_ipc_client_update_records_cb(pims_ipc_h ipc, pims_ipc_data_h data_out, void *userdata); +static void __ctsvc_ipc_client_delete_records_cb(pims_ipc_h ipc, pims_ipc_data_h data_out, void *userdata); + +void __ctsvc_ipc_client_insert_records_cb(pims_ipc_h ipc, pims_ipc_data_h data_out, void *userdata) +{ + ctsvc_ipc_async_userdata_s *sync_data = (ctsvc_ipc_async_userdata_s *)userdata; + int ret = CONTACTS_ERROR_NONE; + contacts_list_h list = sync_data->list; + int *ids = NULL; + unsigned int count = 0; + + if (data_out) + { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(data_out,&size); + + if (ret == CONTACTS_ERROR_NONE && list != NULL) + { + int i=0; + unsigned int size = 0; + + count = *(unsigned int*) pims_ipc_data_get(data_out,&size); + ids = calloc(count, sizeof(int)); + for(i=0;icallback) + { + contacts_db_insert_result_cb callback = sync_data->callback; + callback(ret, ids, count, sync_data->user_data); + } + free(ids); + + ctsvc_inotify_call_blocked_callback(); + + CONTACTS_FREE(sync_data); + + return ; +} + +void __ctsvc_ipc_client_update_records_cb(pims_ipc_h ipc, pims_ipc_data_h data_out, void *userdata) +{ + ctsvc_ipc_async_userdata_s *sync_data = (ctsvc_ipc_async_userdata_s *)userdata; + int ret = CONTACTS_ERROR_NONE; + + if (data_out) + { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(data_out,&size); + } + + if (sync_data->callback) + { + contacts_db_result_cb callback = sync_data->callback; + callback(ret, sync_data->user_data); + } + + ctsvc_inotify_call_blocked_callback(); + + CONTACTS_FREE(sync_data); + + return ; +} +void __ctsvc_ipc_client_delete_records_cb(pims_ipc_h ipc, pims_ipc_data_h data_out, void *userdata) +{ + ctsvc_ipc_async_userdata_s *sync_data = (ctsvc_ipc_async_userdata_s *)userdata; + int ret = CONTACTS_ERROR_NONE; + + if (data_out) + { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(data_out,&size); + } + + if (sync_data->callback) + { + contacts_db_result_cb callback = sync_data->callback; + callback(ret, sync_data->user_data); + } + + ctsvc_inotify_call_blocked_callback(); + + CONTACTS_FREE(sync_data); + + return ; +} + +API int contacts_db_insert_record( contacts_record_h record, int *id ) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + if (id) + *id = 0; + + RETVM_IF(record==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"record is NULL"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + ret = ctsvc_ipc_marshal_record(record,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_INSERT_RECORD, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + pims_ipc_data_destroy(indata); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata,&size); + + if (ret == CONTACTS_ERROR_NONE) + { + if (id) + *id = *(int*)pims_ipc_data_get(outdata,&size); + } + + pims_ipc_data_destroy(outdata); + } + + return ret; +} + +API int contacts_db_get_record( const char* view_uri, int id, contacts_record_h* out_record ) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(view_uri==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"view_uri is NULL"); + RETVM_IF(id<0,CONTACTS_ERROR_INVALID_PARAMETER,"id<0"); + RETVM_IF(out_record==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"record is NULL"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + ret = ctsvc_ipc_marshal_string(view_uri,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + ret = ctsvc_ipc_marshal_int(id,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_RECORD, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + pims_ipc_data_destroy(indata); + *out_record = NULL; + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata,&size); + + if (ret == CONTACTS_ERROR_NONE) + { + ret = ctsvc_ipc_unmarshal_record(outdata,out_record); + } + + pims_ipc_data_destroy(outdata); + } + + return ret; +} + +API int contacts_db_update_record( contacts_record_h record ) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(record==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"record is NULL"); + + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + ret = ctsvc_ipc_marshal_record(record,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_UPDATE_RECORD, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + pims_ipc_data_destroy(indata); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata,&size); + + pims_ipc_data_destroy(outdata); + } + + return ret; +} + +API int contacts_db_delete_record( const char* view_uri, int id ) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(view_uri==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"view_uri is NULL"); + RETVM_IF(id<=0,CONTACTS_ERROR_INVALID_PARAMETER,"id <= 0"); + + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + ret = ctsvc_ipc_marshal_string(view_uri,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + ret = ctsvc_ipc_marshal_int(id,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_DELETE_RECORD, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + pims_ipc_data_destroy(indata); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata,&size); + + pims_ipc_data_destroy(outdata); + } + + return ret; +} + +API int contacts_db_replace_record( contacts_record_h record, int id ) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter : record is NULL"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + ret = ctsvc_ipc_marshal_record(record, indata); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("marshal fail"); + return ret; + } + ret = ctsvc_ipc_marshal_int(id, indata); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("marshal fail"); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, + CTSVC_IPC_SERVER_DB_REPLACE_RECORD, indata, &outdata) != 0) { + CTS_ERR("pims_ipc_call failed"); + pims_ipc_data_destroy(indata); + return CONTACTS_ERROR_IPC; + } + + pims_ipc_data_destroy(indata); + + if (outdata) { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata,&size); + pims_ipc_data_destroy(outdata); + } + + return ret; +} + +API int contacts_db_get_all_records( const char* view_uri, int offset, int limit, contacts_list_h* out_list ) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(out_list==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"list is NULL"); + RETVM_IF(view_uri==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"view_uri is NULL"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + ret = ctsvc_ipc_marshal_string(view_uri,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + ret = ctsvc_ipc_marshal_int(offset,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + ret = ctsvc_ipc_marshal_int(limit,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_ALL_RECORDS, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + pims_ipc_data_destroy(indata); + *out_list = NULL; + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata,&size); + + if (ret == CONTACTS_ERROR_NONE) + { + ret = ctsvc_ipc_unmarshal_list(outdata,out_list); + } + pims_ipc_data_destroy(outdata); + } + + return ret; +} + +API int contacts_db_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(query==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"query is NULL"); + RETVM_IF(out_list==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"list is NULL"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + ret = ctsvc_ipc_marshal_query(query,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + ret = ctsvc_ipc_marshal_int(offset,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + ret = ctsvc_ipc_marshal_int(limit,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_RECORDS_WITH_QUERY, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + pims_ipc_data_destroy(indata); + *out_list = NULL; + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata,&size); + + if (ret == CONTACTS_ERROR_NONE) + { + ret = ctsvc_ipc_unmarshal_list(outdata,out_list); + } + + pims_ipc_data_destroy(outdata); + } + + return ret; +} + + +API int contacts_db_get_count( const char* view_uri, int *out_count ) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(view_uri==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"view_uri is NULL"); + RETVM_IF(out_count==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"count pointer is NULL"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + ret = ctsvc_ipc_marshal_string(view_uri,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_COUNT, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + pims_ipc_data_destroy(indata); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata,&size); + + if (ret == CONTACTS_ERROR_NONE) + { + ret = ctsvc_ipc_unmarshal_int(outdata,out_count); + } + + pims_ipc_data_destroy(outdata); + } + + return ret; +} + +API int contacts_db_get_count_with_query( contacts_query_h query, int *out_count ) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(query==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"record is NULL"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + ret = ctsvc_ipc_marshal_query(query,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_COUNT_WITH_QUERY, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + pims_ipc_data_destroy(indata); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata,&size); + + if (ret == CONTACTS_ERROR_NONE) + { + ret = ctsvc_ipc_unmarshal_int(outdata,out_count); + } + + pims_ipc_data_destroy(outdata); + } + + return ret; +} + +API int contacts_db_insert_records_async(const contacts_list_h list, contacts_db_insert_result_cb callback, void *user_data) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + contacts_list_h clone_list = NULL; + ctsvc_ipc_async_userdata_s *async_data = NULL; + + RETVM_IF(list==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"list is NULL"); + + + ret = ctsvc_list_clone(list, &clone_list); + RETV_IF(CONTACTS_ERROR_NONE != ret, ret); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + contacts_list_destroy(clone_list, true); + return ret; + } + ret = ctsvc_ipc_marshal_list(clone_list,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + contacts_list_destroy(clone_list, true); + return ret; + } + + if (callback == NULL) + { + if (ctsvc_ipc_call( CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_INSERT_RECORDS, + indata,&outdata) != 0) + { + CTS_ERR("pims_ipc_call_async failed"); + contacts_list_destroy(clone_list, true); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + if (outdata) + { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata,&size); + + if (ret == CONTACTS_ERROR_NONE) + { + goto SET_DATA; + } + + pims_ipc_data_destroy(outdata); + } + + contacts_list_destroy(clone_list, true); + return ret; + } + + async_data = (ctsvc_ipc_async_userdata_s*)malloc(sizeof(ctsvc_ipc_async_userdata_s)); + if (async_data == NULL) + { + CTS_ERR("malloc fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + contacts_list_destroy(clone_list, true); + return ret; + } + async_data->callback = callback; + async_data->user_data = user_data; + async_data->list = clone_list; + if (ctsvc_ipc_call_async(CTSVC_IPC_DB_MODULE,CTSVC_IPC_SERVER_DB_INSERT_RECORDS, + indata,__ctsvc_ipc_client_insert_records_cb,async_data) != 0) + { + CONTACTS_FREE(async_data); + CTS_ERR("pims_ipc_call_async failed"); + contacts_list_destroy(clone_list, true); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + contacts_list_destroy(clone_list, true); + + return ret; + +SET_DATA: + if (outdata) + { +/* + int count = 0; + int id = 0; + unsigned int property_id = 0; + int i=0; + unsigned int size = 0; + + contacts_list_first(list); + count = *(int*) pims_ipc_data_get(outdata,&size); + property_id = *(unsigned int*) pims_ipc_data_get(outdata,&size); + for(i=0;icallback = callback; + async_data->user_data = user_data; + async_data->list = list; + if (ctsvc_ipc_call_async(CTSVC_IPC_DB_MODULE,CTSVC_IPC_SERVER_DB_UPDATE_RECORDS, + indata,__ctsvc_ipc_client_update_records_cb,async_data) != 0) + { + CONTACTS_FREE(async_data); + CTS_ERR("pims_ipc_call_async failed"); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + return ret; +} + +API int contacts_db_delete_records_async(const char* view_uri, int ids[], int count, contacts_db_result_cb callback, void *user_data) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + int i = 0; + ctsvc_ipc_async_userdata_s *async_data = NULL; + + RETVM_IF(view_uri==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"view_uri is NULL"); + RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + RETVM_IF(0 == count, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + ret = ctsvc_ipc_marshal_string(view_uri,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + ret = ctsvc_ipc_marshal_int(count,indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + for (i=0;icallback = callback; + async_data->user_data = user_data; + if (ctsvc_ipc_call_async(CTSVC_IPC_DB_MODULE,CTSVC_IPC_SERVER_DB_DELETE_RECORDS, + indata,__ctsvc_ipc_client_delete_records_cb,async_data) != 0) + { + CONTACTS_FREE(async_data); + CTS_ERR("pims_ipc_call_async failed"); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + return ret; +} + +void __ctsvc_ipc_client_replace_records_cb(pims_ipc_h ipc, pims_ipc_data_h data_out, void *userdata) +{ + ctsvc_ipc_async_userdata_s *async_data = (ctsvc_ipc_async_userdata_s *)userdata; + int ret = CONTACTS_ERROR_NONE; + + if (data_out) { + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(data_out,&size); + //pims_ipc_data_destroy(data_out); + } + + if (async_data->callback) { + contacts_db_result_cb callback = async_data->callback; + callback(ret, async_data->user_data); + } + + ctsvc_inotify_call_blocked_callback(); + + free(async_data); + + return ; +} + +API int contacts_db_replace_records_async( contacts_list_h list, int ids[], unsigned int count, + contacts_db_result_cb callback, void *user_data ) +{ + int i; + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + ctsvc_ipc_async_userdata_s *async_data = NULL; + + RETVM_IF(NULL == list,CONTACTS_ERROR_INVALID_PARAMETER, "list is NULL"); + RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + RETVM_IF(0 == count, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + ret = ctsvc_ipc_marshal_list(list, indata); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("marshal fail"); + return ret; + } + + ret = ctsvc_ipc_marshal_unsigned_int(count, indata); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("marshal fail"); + return ret; + } + + for (i=0;icallback = callback; + async_data->user_data = user_data; + async_data->list = list; + if (ctsvc_ipc_call_async(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_REPLACE_RECORDS, + indata, __ctsvc_ipc_client_replace_records_cb, async_data) != 0) { + CONTACTS_FREE(async_data); + CTS_ERR("pims_ipc_call_async failed"); + return CONTACTS_ERROR_IPC; + } + + pims_ipc_data_destroy(indata); + + return ret; +} + +API int contacts_db_insert_records( contacts_list_h list, int **ids, unsigned int *count) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + if (ids) + *ids = NULL; + if (count) + *count = 0; + + RETVM_IF(list==NULL,CONTACTS_ERROR_INVALID_PARAMETER, "list is NULL"); + RETVM_IF(ctsvc_get_ipc_handle()==NULL,CONTACTS_ERROR_IPC, "contacts not connected"); + + indata = pims_ipc_data_create(0); + if (indata == NULL) { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + ret = ctsvc_ipc_marshal_list(list,indata); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return ret; + } + + if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_INSERT_RECORDS, + indata, &outdata) != 0) { + CTS_ERR("pims_ipc_call_async failed"); + pims_ipc_data_destroy(indata); + return CONTACTS_ERROR_IPC; + } + + pims_ipc_data_destroy(indata); + + if (outdata) { + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata,&size); + + if (ret == CONTACTS_ERROR_NONE) { + if (ids && count) { + int i = 0; + int *id = NULL; + unsigned int c; + c = *(unsigned int*)pims_ipc_data_get(outdata, &size); + id = calloc(c, sizeof(int)); + for(i=0;i + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_ipc_define.h" +#include "ctsvc_client_ipc.h" +#include +#include "ctsvc_ipc_marshal.h" + +API int contacts_group_add_contact(int group_id, int contact_id) +{ + int ret = CONTACTS_ERROR_NONE; + + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(group_id <= 0 || contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,"id should be greater than 0"); + RETVM_IF(ctsvc_get_ipc_handle() == NULL,CONTACTS_ERROR_IPC,"contacts not connected"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + ret = ctsvc_ipc_marshal_int( group_id, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + ret = ctsvc_ipc_marshal_int( contact_id, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_GROUP_MODULE, CTSVC_IPC_SERVER_GROUP_ADD_CONTACT, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check result + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata, &size); + + pims_ipc_data_destroy(outdata); + } + + return ret; +} + +API int contacts_group_remove_contact(int group_id, int contact_id) +{ + int ret = CONTACTS_ERROR_NONE; + + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(group_id <= 0 || contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,"id should be greater than 0"); + RETVM_IF(ctsvc_get_ipc_handle() == NULL,CONTACTS_ERROR_IPC,"contacts not connected"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + ret = ctsvc_ipc_marshal_int( group_id, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + ret = ctsvc_ipc_marshal_int( contact_id, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_GROUP_MODULE, CTSVC_IPC_SERVER_GROUP_REMOVE_CONTACT, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check result + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata, &size); + + pims_ipc_data_destroy(outdata); + } + + return ret; +} + diff --git a/client/ctsvc_client_ipc.c b/client/ctsvc_client_ipc.c new file mode 100755 index 0000000..339dd77 --- /dev/null +++ b/client/ctsvc_client_ipc.c @@ -0,0 +1,279 @@ + + +#include +//#include +#include "ctsvc_client_ipc.h" + +#include "ctsvc_internal.h" +#include "ctsvc_list.h" +#include "ctsvc_record.h" +#include "ctsvc_query.h" +#include "ctsvc_inotify.h" + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_define.h" +#include "ctsvc_ipc_marshal.h" +#include "ctsvc_view.h" +#include +#include "ctsvc_mutex.h" + +static __thread pims_ipc_h contacts_ipc = NULL; + +static pims_ipc_h contacts_global_ipc = NULL; + +int ctsvc_ipc_connect_on_thread(void) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + // ipc create + if (contacts_ipc == NULL) + { + contacts_ipc = pims_ipc_create(CTSVC_IPC_SOCKET_PATH); + if (contacts_ipc == NULL) + { + CTS_ERR("pims_ipc_create() Failed(%d)", CONTACTS_ERROR_IPC_NOT_AVALIABLE); + return CONTACTS_ERROR_IPC_NOT_AVALIABLE; + } + } + else + { + CTS_DBG("contacts already connected"); + return CONTACTS_ERROR_NONE; + } + + // ipc call + if (pims_ipc_call(contacts_ipc, CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_CONNECT, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + return CONTACTS_ERROR_IPC; + } + + if (outdata) + { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata,&size); + + pims_ipc_data_destroy(outdata); + + if (ret == CONTACTS_ERROR_NONE) + { + + } + else + { + pims_ipc_destroy(contacts_ipc); + contacts_ipc = NULL; + } + } + + return ret; +} + +int ctsvc_ipc_disconnect_on_thread(void) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(contacts_ipc == NULL, CONTACTS_ERROR_IPC, "contacts not connected"); + + // ipc call + if (pims_ipc_call(contacts_ipc, CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_DISCONNECT, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + return CONTACTS_ERROR_IPC; + } + + if (outdata) + { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata,&size); + + pims_ipc_data_destroy(outdata); + } + + if (contacts_ipc && ret != CONTACTS_ERROR_NONE) + { + pims_ipc_destroy(contacts_ipc); + contacts_ipc = NULL; + } + + return ret; +} + +pims_ipc_h ctsvc_get_ipc_handle() +{ + if(contacts_ipc == NULL) + { + if(contacts_global_ipc == NULL ) + { + ASSERT_NOT_REACHED("IPC haven't been initialized yet."); + return NULL; + } + CTS_DBG("fallback to global ipc channel"); + return contacts_global_ipc; + } + + return contacts_ipc; +} + +bool ctsvc_ipc_is_busy() +{ + bool ret = false; + + if(contacts_ipc != NULL) + { + ret = pims_ipc_is_call_in_progress(contacts_ipc); + if(ret) + { + CTS_ERR("thread local ipc channel is busy."); + } + } + else { + ret = pims_ipc_is_call_in_progress(contacts_global_ipc); + if(ret) + { + CTS_ERR("global ipc channel is busy."); + } + } + + return ret; +} + + + +int ctsvc_ipc_connect(void) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + // ipc create + if (contacts_global_ipc == NULL) + { + contacts_global_ipc = pims_ipc_create(CTSVC_IPC_SOCKET_PATH); + if (contacts_global_ipc == NULL) + { + CTS_ERR("[GLOBAL_IPC_CHANNEL] pims_ipc_create() Failed(%d)", CONTACTS_ERROR_IPC_NOT_AVALIABLE); + return CONTACTS_ERROR_IPC_NOT_AVALIABLE; + } + } + else + { + CTS_DBG("[GLOBAL_IPC_CHANNEL] contacts already connected"); + return CONTACTS_ERROR_NONE; + } + + // ipc call + if (pims_ipc_call(contacts_global_ipc, CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_CONNECT, indata, &outdata) != 0) + { + CTS_ERR("[GLOBAL_IPC_CHANNEL] pims_ipc_call failed"); + return CONTACTS_ERROR_IPC; + } + + if (outdata) + { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata,&size); + + pims_ipc_data_destroy(outdata); + + if (ret == CONTACTS_ERROR_NONE) + { + + } + else + { + pims_ipc_destroy(contacts_global_ipc); + contacts_global_ipc = NULL; + } + } + + return ret; +} + + +int ctsvc_ipc_disconnect(void) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(contacts_global_ipc == NULL, CONTACTS_ERROR_IPC, "[GLOBAL_IPC_CHANNEL] contacts not connected"); + + // ipc call + if (pims_ipc_call(contacts_global_ipc, CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_DISCONNECT, indata, &outdata) != 0) + { + CTS_ERR("[GLOBAL_IPC_CHANNEL] pims_ipc_call failed"); + return CONTACTS_ERROR_IPC; + } + + if (outdata) + { + // check outdata + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata,&size); + + pims_ipc_data_destroy(outdata); + } + + if (contacts_global_ipc && ret == CONTACTS_ERROR_NONE) + { + pims_ipc_destroy(contacts_global_ipc); + contacts_global_ipc = NULL; + } + else + { + CTS_ERR("[GLOBAL_IPC_CHANNEL] pims_ipc didn't destroyed!!!(%d)", ret); + } + + return ret; +} + + +void __ctsvc_ipc_lock() +{ + if (contacts_ipc == NULL) + { + ctsvc_mutex_lock(CTS_MUTEX_PIMS_IPC_CALL); + } +} + +void __ctsvc_ipc_unlock(void) +{ + if (contacts_ipc == NULL) + { + ctsvc_mutex_unlock(CTS_MUTEX_PIMS_IPC_CALL); + } +} + +int ctsvc_ipc_call(char *module, char *function, pims_ipc_h data_in, pims_ipc_data_h *data_out) +{ + pims_ipc_h ipc_handle = ctsvc_get_ipc_handle(); + + __ctsvc_ipc_lock(); + + int ret = pims_ipc_call(ipc_handle, module, function, data_in, data_out); + + __ctsvc_ipc_unlock(); + + return ret; +} + +int ctsvc_ipc_call_async(char *module, char *function, pims_ipc_h data_in, pims_ipc_call_async_cb callback, void *userdata) +{ + pims_ipc_h ipc_handle = ctsvc_get_ipc_handle(); + + __ctsvc_ipc_lock(); + + int ret = pims_ipc_call_async(ipc_handle, module, function, data_in, callback, userdata); + + __ctsvc_ipc_unlock(); + + return ret; +} diff --git a/client/ctsvc_client_ipc.h b/client/ctsvc_client_ipc.h new file mode 100644 index 0000000..39515d7 --- /dev/null +++ b/client/ctsvc_client_ipc.h @@ -0,0 +1,44 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_CLIENT_IPC_H__ +#define __TIZEN_SOCIAL_CTSVC_CLIENT_IPC_H__ + +#include + +pims_ipc_h ctsvc_get_ipc_handle(); + +int ctsvc_ipc_connect(void); +int ctsvc_ipc_disconnect(void); + +int ctsvc_ipc_connect_on_thread(void); +int ctsvc_ipc_disconnect_on_thread(void); + + +bool ctsvc_ipc_is_busy(); + +int ctsvc_ipc_create_for_change_subscription(); +int ctsvc_ipc_destroy_for_change_subscription(); + +int ctsvc_ipc_call(char *module, char *function, pims_ipc_h data_in, pims_ipc_data_h *data_out); +int ctsvc_ipc_call_async(char *module, char *function, pims_ipc_h data_in, pims_ipc_call_async_cb callback, void *userdata); + + +#endif /* __TIZEN_SOCIAL_CTSVC_CLIENT_IPC_H__ */ + diff --git a/client/ctsvc_client_noti.c b/client/ctsvc_client_noti.c new file mode 100644 index 0000000..946197f --- /dev/null +++ b/client/ctsvc_client_noti.c @@ -0,0 +1,179 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_ipc_define.h" +#include "ctsvc_mutex.h" + +typedef struct +{ + contacts_db_change_cb_with_info cb; + void *user_data; +}callback_info_s; + +typedef struct +{ + char *view_uri; + GSList *callbacks; +}subscribe_info_s; + +static pims_ipc_h __ipc = NULL; +static GSList *__subscribe_list = NULL; + +static void __ctsvc_subscriber_callback(pims_ipc_h ipc, pims_ipc_data_h data, void *user_data) +{ + unsigned int size = 0; + char *str = NULL; + subscribe_info_s *info = user_data; + + INFO("(%x) subscribe_callback(%p)", (unsigned int)pthread_self(), ipc); + if (data) { + str = (char*)pims_ipc_data_get(data, &size); + if (!str) { + CTS_ERR("pims_ipc_data_get fail()"); + return; + } + } + if (info) { + GSList *l; + for (l = info->callbacks;l;l=l->next) { + callback_info_s *cb_info = l->data; + cb_info->cb(info->view_uri, str, cb_info->user_data); + } + } +} + +int ctsvc_ipc_create_for_change_subscription() +{ + ctsvc_mutex_lock(CTS_MUTEX_PIMS_IPC_PUBSUB); + + if (!__ipc) { + __ipc = pims_ipc_create_for_subscribe(CTSVC_IPC_SOCKET_PATH_FOR_CHANGE_SUBSCRIPTION); + if (!__ipc) { + CTS_ERR("pims_ipc_create_for_subscribe error\n"); + ctsvc_mutex_unlock(CTS_MUTEX_PIMS_IPC_PUBSUB); + return CONTACTS_ERROR_IPC; + } + } + ctsvc_mutex_unlock(CTS_MUTEX_PIMS_IPC_PUBSUB); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_ipc_destroy_for_change_subscription() +{ + ctsvc_mutex_lock(CTS_MUTEX_PIMS_IPC_PUBSUB); + + pims_ipc_destroy_for_subscribe(__ipc); + __ipc = NULL; + + ctsvc_mutex_unlock(CTS_MUTEX_PIMS_IPC_PUBSUB); + return CONTACTS_ERROR_NONE; +} + +API int contacts_db_add_changed_cb_with_info(const char* view_uri, + contacts_db_change_cb_with_info cb, void* user_data) +{ + GSList *it = NULL; + subscribe_info_s *info = NULL; + callback_info_s *cb_info; + + ctsvc_mutex_lock(CTS_MUTEX_PIMS_IPC_PUBSUB); + + for (it=__subscribe_list;it;it=it->next) { + if (!it->data) continue; + + info = it->data; + if (strcmp(info->view_uri, view_uri) == 0) + break; + else + info = NULL; + } + + if (!info) { + info = calloc(1, sizeof(subscribe_info_s)); + if (NULL == info) { + CTS_ERR("calloc() Failed"); + ctsvc_mutex_unlock(CTS_MUTEX_PIMS_IPC_PUBSUB); + return CONTACTS_ERROR_OUT_OF_MEMORY; + } + + if (pims_ipc_subscribe(__ipc, CTSVC_IPC_SUBSCRIBE_MODULE, (char*)view_uri, + __ctsvc_subscriber_callback, (void*)info) != 0) { + CTS_ERR("pims_ipc_subscribe error\n"); + free(info); + ctsvc_mutex_unlock(CTS_MUTEX_PIMS_IPC_PUBSUB); + return CONTACTS_ERROR_IPC; + } + info->view_uri = strdup(view_uri); + __subscribe_list = g_slist_append(__subscribe_list, info); + } + + cb_info = calloc(1, sizeof(callback_info_s)); + cb_info->user_data = user_data; + cb_info->cb = cb; + info->callbacks = g_slist_append(info->callbacks, cb_info); + + ctsvc_mutex_unlock(CTS_MUTEX_PIMS_IPC_PUBSUB); + return CONTACTS_ERROR_NONE; +} + +API int contacts_db_remove_changed_cb_with_info(const char* view_uri, + contacts_db_change_cb_with_info cb, void* user_data) +{ + GSList *it = NULL; + subscribe_info_s *info = NULL; + + ctsvc_mutex_lock(CTS_MUTEX_PIMS_IPC_PUBSUB); + + for (it=__subscribe_list;it;it=it->next) { + if (!it->data) continue; + + info = it->data; + if (strcmp(info->view_uri, view_uri) == 0) + break; + else + info = NULL; + } + + if (info) { + GSList *l; + for(l = info->callbacks;l;l=l->next) { + callback_info_s *cb_info = l->data; + if (cb == cb_info->cb && user_data == cb_info->user_data) { + info->callbacks = g_slist_remove(info->callbacks, cb_info); + break; + } + } + if (g_slist_length(info->callbacks) == 0) { + pims_ipc_unsubscribe(__ipc, CTSVC_IPC_SUBSCRIBE_MODULE, info->view_uri); + __subscribe_list = g_slist_remove(__subscribe_list, info); + free(info->view_uri); + free(info); + } + } + + ctsvc_mutex_unlock(CTS_MUTEX_PIMS_IPC_PUBSUB); + return CONTACTS_ERROR_NONE; +} + diff --git a/client/ctsvc_client_person.c b/client/ctsvc_client_person.c new file mode 100644 index 0000000..8b3329a --- /dev/null +++ b/client/ctsvc_client_person.c @@ -0,0 +1,418 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_ipc_define.h" +#include "ctsvc_client_ipc.h" +#include +#include "ctsvc_ipc_marshal.h" + +API int contacts_person_link_person(int base_person_id, int person_id) +{ + + int ret = CONTACTS_ERROR_NONE; + + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(base_person_id <= 0 || person_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,"id should be greater than 0"); + RETVM_IF(ctsvc_get_ipc_handle() == NULL,CONTACTS_ERROR_IPC,"contacts not connected"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + return CONTACTS_ERROR_OUT_OF_MEMORY; + } + + bool success = false; + do { + if( ctsvc_ipc_marshal_int( base_person_id, indata) != CONTACTS_ERROR_NONE ) break; + if( ctsvc_ipc_marshal_int( person_id, indata) != CONTACTS_ERROR_NONE ) break; + + success = true; + } while(0); + + if( success == false ) { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return CONTACTS_ERROR_IPC; + } + +/* + ret = ctsvc_ipc_marshal_int( base_person_id, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } + ret = ctsvc_ipc_marshal_int( person_id, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + return ret; + } +*/ + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_LINK_PERSON, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check result + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata, &size); + + pims_ipc_data_destroy(outdata); + } + + return ret; +} + +API int contacts_person_unlink_contact(int person_id, int contact_id, int* unlinked_person_id) +{ + int ret = CONTACTS_ERROR_NONE; + + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(person_id <= 0 || contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,"id should be greater than 0"); + RETVM_IF(ctsvc_get_ipc_handle() == NULL,CONTACTS_ERROR_IPC,"contacts not connected"); + + if (unlinked_person_id) + *unlinked_person_id = 0; + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + ret = ctsvc_ipc_marshal_int( person_id, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return ret; + } + ret = ctsvc_ipc_marshal_int( contact_id, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_UNLINK_CONTACT, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + pims_ipc_data_destroy(indata); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check result + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata, &size); + + if (CONTACTS_ERROR_NONE == ret) { + if (unlinked_person_id) + *unlinked_person_id = *(int*)pims_ipc_data_get(outdata,&size); + } + + pims_ipc_data_destroy(outdata); + } + + return ret; +} + +API int contacts_person_reset_usage(int person_id, contacts_usage_type_e type) +{ + int ret = CONTACTS_ERROR_NONE; + + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(person_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,"contact_id should be greater than 0"); + RETVM_IF(ctsvc_get_ipc_handle() == NULL,CONTACTS_ERROR_IPC,"contacts not connected"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + ret = ctsvc_ipc_marshal_int( person_id, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return ret; + } + ret = ctsvc_ipc_marshal_int( (int)type, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_RESET_USAGE, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + pims_ipc_data_destroy(indata); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check result + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata, &size); + + pims_ipc_data_destroy(outdata); + } + + return ret; +} + +API int contacts_person_set_favorite_order(int person_id, int previous_person_id, int next_person_id) +{ + int ret = CONTACTS_ERROR_NONE; + + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(person_id <= 0 || previous_person_id < 0 || next_person_id < 0, CONTACTS_ERROR_INVALID_PARAMETER,"id should be greater than 0"); + RETVM_IF(ctsvc_get_ipc_handle() == NULL,CONTACTS_ERROR_IPC,"contacts not connected"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + ret = ctsvc_ipc_marshal_int( person_id, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return ret; + } + ret = ctsvc_ipc_marshal_int( previous_person_id, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return ret; + } + ret = ctsvc_ipc_marshal_int( next_person_id, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_SET_FAVORITE_ORDER, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check result + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata, &size); + + pims_ipc_data_destroy(outdata); + } + + return ret; + +} + +API int contacts_person_set_default_property(contacts_person_property_e property, + int person_id, int id) +{ + int ret = CONTACTS_ERROR_NONE; + + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(person_id <= 0 || id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,"id should be greater than 0"); + RETVM_IF(ctsvc_get_ipc_handle() == NULL,CONTACTS_ERROR_IPC,"contacts not connected"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + ret = ctsvc_ipc_marshal_int( person_id, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return ret; + } + ret = ctsvc_ipc_marshal_unsigned_int( property, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return ret; + } + ret = ctsvc_ipc_marshal_int( id, indata); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_SET_DEFAULT_PROPERTY, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + pims_ipc_data_destroy(indata); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check result + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata, &size); + + pims_ipc_data_destroy(outdata); + } + + return ret; +} + +API int contacts_person_get_default_property(contacts_person_property_e property, + int person_id, int *id) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(person_id <= 0 || id == NULL, CONTACTS_ERROR_INVALID_PARAMETER,"id should be greater than 0"); + *id = 0; + RETVM_IF(ctsvc_get_ipc_handle() == NULL,CONTACTS_ERROR_IPC,"contacts not connected"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + ret = ctsvc_ipc_marshal_int(person_id, indata); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return ret; + } + + ret = ctsvc_ipc_marshal_unsigned_int(property, indata); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_GET_DEFAULT_PROPERTY, + indata, &outdata) != 0) { + CTS_ERR("pims_ipc_call failed"); + pims_ipc_data_destroy(indata); + return CONTACTS_ERROR_IPC; + } + + if (indata) { + pims_ipc_data_destroy(indata); + } + + if (outdata) { + // check result + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata, &size); + if (ret == CONTACTS_ERROR_NONE) { + if (id) + *id = *(int*)pims_ipc_data_get(outdata,&size); + } + pims_ipc_data_destroy(outdata); + } + + return ret; +} + diff --git a/client/ctsvc_client_phonelog.c b/client/ctsvc_client_phonelog.c new file mode 100644 index 0000000..67e25fc --- /dev/null +++ b/client/ctsvc_client_phonelog.c @@ -0,0 +1,148 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_ipc_define.h" +#include "ctsvc_client_ipc.h" +#include +#include "ctsvc_ipc_marshal.h" + +API int contacts_phone_log_reset_statistics(void) +{ + int ret = CONTACTS_ERROR_NONE; + + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(ctsvc_get_ipc_handle() == NULL,CONTACTS_ERROR_IPC,"contacts not connected"); + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_PHONELOG_MODULE, CTSVC_IPC_SERVER_PHONELOG_RESET_STATISTICS, indata, &outdata) != 0) + { + CTS_ERR("pims_ipc_call failed"); + return CONTACTS_ERROR_IPC; + } + + if (indata) + { + pims_ipc_data_destroy(indata); + } + + if (outdata) + { + // check result + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata, &size); + + pims_ipc_data_destroy(outdata); + } + + return ret; + +} + +API int contacts_phone_log_delete(contacts_phone_log_delete_e op, ...) +{ + int ret = CONTACTS_ERROR_NONE; + + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + char *number = NULL; + int extra_data1; + + va_list args; + + RETVM_IF(ctsvc_get_ipc_handle() == NULL,CONTACTS_ERROR_IPC, "contacts not connected"); + + indata = pims_ipc_data_create(0); + if (indata == NULL) { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + pims_ipc_data_destroy(indata); + return ret; + } + + ret = ctsvc_ipc_marshal_int( op, indata); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_ipc_marshal_int fail"); + pims_ipc_data_destroy(indata); + return ret; + } + + switch(op) { + case CONTACTS_PHONE_LOG_DELETE_BY_ADDRESS: + va_start(args, op); + number = va_arg(args, char *); + va_end(args); + RETV_IF(NULL == number, CONTACTS_ERROR_INVALID_PARAMETER); + ret = ctsvc_ipc_marshal_string( number, indata); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_ipc_marshal_string fail"); + pims_ipc_data_destroy(indata); + return ret; + } + break; + case CONTACTS_PHONE_LOG_DELETE_BY_MESSAGE_EXTRA_DATA1: + case CONTACTS_PHONE_LOG_DELETE_BY_EMAIL_EXTRA_DATA1: + va_start(args, op); + extra_data1 = va_arg(args, int); + va_end(args); + ret = ctsvc_ipc_marshal_int( extra_data1, indata); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_ipc_marshal_int fail"); + pims_ipc_data_destroy(indata); + return ret; + } + break; + default: + CTS_ERR("Invalid parameter : operation is not proper (%d)", ret); + pims_ipc_data_destroy(indata); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + if (ctsvc_ipc_call(CTSVC_IPC_PHONELOG_MODULE, + CTSVC_IPC_SERVER_PHONELOG_DELETE, indata, &outdata) != 0) { + CTS_ERR("pims_ipc_call failed"); + pims_ipc_data_destroy(indata); + return CONTACTS_ERROR_IPC; + } + + pims_ipc_data_destroy(indata); + + if (outdata) { + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata, &size); + pims_ipc_data_destroy(outdata); + } + + return ret; +} + diff --git a/client/ctsvc_client_service.c b/client/ctsvc_client_service.c new file mode 100644 index 0000000..35f3cd7 --- /dev/null +++ b/client/ctsvc_client_service.c @@ -0,0 +1,199 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +#include +#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_socket.h" +#include "ctsvc_mutex.h" +#include "ctsvc_inotify.h" +#include "ctsvc_setting.h" +#include "ctsvc_client_ipc.h" + +static int ctsvc_connection = 0; + +static int __thread ctsvc_connection_on_thread = 0; + +API int contacts_connect_with_flags(unsigned int flags) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + + ret = contacts_connect2(); + if (ret == CONTACTS_ERROR_NONE) + return ret; + + if (flags & CONTACTS_CONNECT_FLAG_RETRY) { + int i; + int waiting_time = 500; + for (i=0;i<6;i++) { + usleep(waiting_time * 1000); + DBG("retry cnt=%d, ret=%x, %d",(i+1), ret, waiting_time); + ret = contacts_connect2(); + if (ret == CONTACTS_ERROR_NONE) + break; + waiting_time *= 2; + } + } + + return ret; +} + +API int contacts_connect2() +{ + CTS_FN_CALL; + int ret; + + ctsvc_mutex_lock(CTS_MUTEX_CONNECTION); + if (0 == ctsvc_connection) { + + ret = ctsvc_ipc_connect(); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_ipc_connect() Failed(%d)", ret); + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + return ret; + } + + ret = ctsvc_socket_init(); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_socket_init() Failed(%d)", ret); + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + return ret; + } + + ret = ctsvc_inotify_init(); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_inotify_init() Failed(%d)", ret); + ctsvc_socket_final(); + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + return ret; + } + + ctsvc_view_uri_init(); + ctsvc_register_vconf(); + ctsvc_ipc_create_for_change_subscription(); + } + else + CTS_DBG("System : Contacts service has been already connected(%d)", ctsvc_connection + 1); + + ctsvc_connection++; + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + + return CONTACTS_ERROR_NONE; +} + +API int contacts_disconnect2() +{ + int ret; + + CTS_FN_CALL; + + ctsvc_mutex_lock(CTS_MUTEX_CONNECTION); + if (1 == ctsvc_connection) { + ctsvc_ipc_destroy_for_change_subscription(); + + ret = ctsvc_ipc_disconnect(); + if (ret != CONTACTS_ERROR_NONE) { + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + CTS_ERR("ctsvc_ipc_disconnect() Failed(%d)", ret); + return ret; + } + + ctsvc_view_uri_deinit(); + ctsvc_inotify_close(); + ctsvc_socket_final(); + ctsvc_deregister_vconf(); + + } + else if (1 < ctsvc_connection) + CTS_DBG("System : connection count is %d", ctsvc_connection); + else { + CTS_DBG("System : please call contacts_connect2(), connection count is (%d)", ctsvc_connection); + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ctsvc_connection--; + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + + return CONTACTS_ERROR_NONE; +} + +API int contacts_connect_on_thread() +{ + int ret; + + ctsvc_mutex_lock(CTS_MUTEX_CONNECTION); + + ret = ctsvc_ipc_connect_on_thread(); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_ipc_connect_on_thread() Failed(%d)", ret); + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + return ret; + } + + if (0 < ctsvc_connection_on_thread) + CTS_DBG("System : Contacts service has been already connected"); + + ctsvc_connection_on_thread++; + + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + + return CONTACTS_ERROR_NONE; +} + +API int contacts_disconnect_on_thread() +{ + int ret; + + ctsvc_mutex_lock(CTS_MUTEX_CONNECTION); + + ret = ctsvc_ipc_disconnect_on_thread(); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_ipc_disconnect_on_thread() Failed(%d)", ret); + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + return ret; + } + + if (1 == ctsvc_connection_on_thread) { + CTS_DBG("System : connection_on_thread was destroyed successfully"); + } + else if (1 < ctsvc_connection_on_thread) { + CTS_DBG("System : connection count is %d", ctsvc_connection_on_thread); + } + else { + CTS_DBG("System : please call contacts_connect_on_thread(), connection count is (%d)", ctsvc_connection_on_thread); + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ctsvc_connection_on_thread--; + + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + + return CONTACTS_ERROR_NONE; +} diff --git a/client/ctsvc_client_sim.c b/client/ctsvc_client_sim.c new file mode 100644 index 0000000..f68054f --- /dev/null +++ b/client/ctsvc_client_sim.c @@ -0,0 +1,167 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_ipc_define.h" +#include "ctsvc_ipc_marshal.h" +#include "ctsvc_client_ipc.h" +#include + +API int contacts_sim_insert(contacts_record_h record, int *contact_id) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + ret = ctsvc_ipc_marshal_record( record, indata ); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_SIM_MODULE, CTSVC_IPC_SERVER_SIM_INSERT_CONTACT, indata, &outdata) != 0) + { + pims_ipc_data_destroy(indata); + CTS_ERR("pims_ipc_call failed"); + return CONTACTS_ERROR_IPC; + } + + if (outdata) + { + // check result + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata, &size); + + pims_ipc_data_destroy(outdata); + } + + pims_ipc_data_destroy(indata); + + return ret; +} + +API int contacts_sim_update(contacts_record_h record) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + ret = ctsvc_ipc_marshal_record( record, indata ); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_SIM_MODULE, CTSVC_IPC_SERVER_SIM_UPDATE_CONTACT, indata, &outdata) != 0) + { + pims_ipc_data_destroy(indata); + CTS_ERR("pims_ipc_call failed"); + return CONTACTS_ERROR_IPC; + } + + if (outdata) + { + // check result + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata, &size); + + pims_ipc_data_destroy(outdata); + } + + pims_ipc_data_destroy(indata); + + return ret; +} + +API int contacts_sim_delete(int person_id) +{ + int ret = CONTACTS_ERROR_NONE; + pims_ipc_data_h indata = NULL; + pims_ipc_data_h outdata = NULL; + + RETVM_IF(person_id <= 0,CONTACTS_ERROR_INVALID_PARAMETER,"id should be greater than 0"); + + + // make indata + indata = pims_ipc_data_create(0); + if (indata == NULL) + { + CTS_ERR("ipc data created fail!"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + + ret = ctsvc_ipc_marshal_int( person_id, indata ); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("marshal fail"); + pims_ipc_data_destroy(indata); + return ret; + } + + // ipc call + if (ctsvc_ipc_call(CTSVC_IPC_SIM_MODULE, CTSVC_IPC_SERVER_SIM_DELETE_CONTACT, indata, &outdata) != 0) + { + pims_ipc_data_destroy(indata); + CTS_ERR("pims_ipc_call failed"); + return CONTACTS_ERROR_IPC; + } + + if (outdata) + { + // check result + unsigned int size = 0; + ret = *(int*) pims_ipc_data_get(outdata, &size); + + pims_ipc_data_destroy(outdata); + } + + pims_ipc_data_destroy(indata); + + return ret; +} diff --git a/common/ctsvc_db_notification.c b/common/ctsvc_db_notification.c new file mode 100644 index 0000000..1af62e8 --- /dev/null +++ b/common/ctsvc_db_notification.c @@ -0,0 +1,55 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_inotify.h" + +API int contacts_db_add_changed_cb( const char* view_uri, contacts_db_changed_cb cb, + void* user_data ) +{ + int ret; + + RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, + "Invaild parameter : view_uri is null"); + + ret = ctsvc_inotify_subscribe(view_uri, cb, user_data); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, + "ctsvc_inotify_subscribe(%d) Failed(%d)", view_uri, ret); + + return CONTACTS_ERROR_NONE; +} + +API int contacts_db_remove_changed_cb( const char* view_uri, contacts_db_changed_cb cb, + void* user_data ) +{ + int ret; + + RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, + "Invaild parameter : view_uri is null"); + + ret = ctsvc_inotify_unsubscribe(view_uri, cb, user_data); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, + "ctsvc_inotify_unsubscribe(%d) Failed(%d)", view_uri, ret); + + return CONTACTS_ERROR_NONE; +} + diff --git a/common/ctsvc_filter.c b/common/ctsvc_filter.c new file mode 100644 index 0000000..7efb32a --- /dev/null +++ b/common/ctsvc_filter.c @@ -0,0 +1,339 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_filter.h" + +static inline bool __ctsvc_filters_property_check(const property_info_s *properties, + int count, unsigned int property_id, int *type) +{ + int i; + for (i=0;iproperty_id) { + if (p->property_type == CTSVC_SEARCH_PROPERTY_ALL || p->property_type == CTSVC_SEARCH_PROPERTY_FILTER) { + *type = p->type; + return true; + } + else + return false; + } + } + return false; +} + +API int contacts_filter_create( const char* view_uri, contacts_filter_h* out_filter ) +{ + ctsvc_composite_filter_s *com_filter; + + RETV_IF(NULL == out_filter, CONTACTS_ERROR_INVALID_PARAMETER); + *out_filter = NULL; + + RETV_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER); + com_filter = (ctsvc_composite_filter_s *)calloc(1, sizeof(ctsvc_composite_filter_s)); + + com_filter->filter_type = CTSVC_FILTER_COMPOSITE; + com_filter->view_uri = strdup(view_uri); + com_filter->properties = (property_info_s *)ctsvc_view_get_all_property_infos(view_uri, &com_filter->property_count); + *out_filter = (contacts_filter_h)com_filter; + return CONTACTS_ERROR_NONE; +} + +API int contacts_filter_add_operator( contacts_filter_h filter, contacts_filter_operator_e op ) +{ + ctsvc_composite_filter_s *com_filter; + + RETV_IF(NULL == filter, CONTACTS_ERROR_INVALID_PARAMETER); + + com_filter = (ctsvc_composite_filter_s*)filter; + + RETVM_IF(g_slist_length(com_filter->filter_ops) != (g_slist_length(com_filter->filters)-1), + CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : Please check the operator of filter"); + com_filter->filter_ops = g_slist_append(com_filter->filter_ops, (void*)op ); + return CONTACTS_ERROR_NONE; +} + +API int contacts_filter_add_filter(contacts_filter_h filter1, contacts_filter_h filter2) +{ + int ret; + ctsvc_composite_filter_s *s_filter1; + ctsvc_composite_filter_s *s_filter2; + contacts_filter_h new_filter; + + RETV_IF(NULL == filter1 || NULL == filter2, CONTACTS_ERROR_INVALID_PARAMETER); + s_filter1 = (ctsvc_composite_filter_s *)filter1; + s_filter2 = (ctsvc_composite_filter_s *)filter2; + + RETVM_IF(g_slist_length(s_filter1->filter_ops) != (g_slist_length(s_filter1->filters)), + CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : Please check the operator of filter"); + RETVM_IF (0 != strcmp(s_filter1->view_uri, s_filter2->view_uri), CONTACTS_ERROR_INVALID_PARAMETER, + "The filter view_uri is different (filter1:%s, filter2:%s)", s_filter1->view_uri, s_filter2->view_uri); + ret = ctsvc_filter_clone(filter2, &new_filter); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_filter_clone is failed (%d)", ret); + s_filter1->filters = g_slist_append(s_filter1->filters, new_filter); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_attribute_filter_create(ctsvc_composite_filter_s *com_filter, unsigned int property_id, + int match, int filter_type, ctsvc_attribute_filter_s **out_filter) +{ + ctsvc_attribute_filter_s *filter; + int type; + bool find = false; + + RETVM_IF(g_slist_length(com_filter->filter_ops) != g_slist_length(com_filter->filters), + CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter :Please check the operator of filter"); + + find = __ctsvc_filters_property_check(com_filter->properties, com_filter->property_count, property_id, &type); + RETVM_IF(false == find, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is not supported on view_uri(%s)", property_id, com_filter->view_uri); + + if (type == CTSVC_VIEW_DATA_TYPE_INT && CTSVC_FILTER_INT != filter_type) { + CTS_ERR("Invalid parameter : use contacts_filter_add_int() (%d)", filter_type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + if (type == CTSVC_VIEW_DATA_TYPE_STR && CTSVC_FILTER_STR != filter_type) { + CTS_ERR("Invalid parameter : use contacts_filter_add_str() (%d)", filter_type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + if (type == CTSVC_VIEW_DATA_TYPE_BOOL && CTSVC_FILTER_BOOL != filter_type) { + CTS_ERR("Invalid parameter : use contacts_filter_add_bool() (%d)", filter_type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + if (type == CTSVC_VIEW_DATA_TYPE_LLI && CTSVC_FILTER_LLI != filter_type) { + CTS_ERR("Invalid parameter : use contacts_filter_add_lli() (%d)", filter_type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + if (type == CTSVC_VIEW_DATA_TYPE_DOUBLE && CTSVC_FILTER_DOUBLE != filter_type) { + CTS_ERR("Invalid parameter : use contacts_filter_add_double() (%d)", filter_type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + filter = (ctsvc_attribute_filter_s *)calloc(1, sizeof(ctsvc_attribute_filter_s)); + filter->filter_type = filter_type; + filter->property_id = property_id; + filter->match = match; + + com_filter->filters = g_slist_append(com_filter->filters, filter); + *out_filter = filter; + return CONTACTS_ERROR_NONE; +} + +API int contacts_filter_add_str( contacts_filter_h filter, unsigned int property_id, + contacts_match_str_flag_e match, const char* match_value ) +{ + ctsvc_composite_filter_s *com_filter; + ctsvc_attribute_filter_s *str_filter; + int ret; + + RETV_IF(NULL == filter || NULL == match_value, CONTACTS_ERROR_INVALID_PARAMETER); + + com_filter = (ctsvc_composite_filter_s*)filter; + ret = __ctsvc_attribute_filter_create(com_filter, property_id, match, CTSVC_FILTER_STR, &str_filter); + RETVM_IF(CONTACTS_ERROR_NONE !=ret, ret, + "Invalid parameter : The parameter is not proper (view_uri:, property_id:0x%x, match:%d, match_value :%s", + property_id, match, match_value); + + str_filter->value.s = SAFE_STRDUP(match_value); + return CONTACTS_ERROR_NONE; +} + +API int contacts_filter_add_int( contacts_filter_h filter, unsigned int property_id, + contacts_match_int_flag_e match, int match_value ) +{ + ctsvc_composite_filter_s *com_filter; + ctsvc_attribute_filter_s *int_filter; + int ret; + + RETV_IF(NULL == filter, CONTACTS_ERROR_INVALID_PARAMETER); + + com_filter = (ctsvc_composite_filter_s*)filter; + ret = __ctsvc_attribute_filter_create(com_filter, property_id, match, CTSVC_FILTER_INT, &int_filter); + RETVM_IF(CONTACTS_ERROR_NONE !=ret, ret, + "Invalid parameter : The parameter is not proper (view_uri:%s, property_id:0x%x, match:%d, match_value :%d", + com_filter->view_uri, property_id, match, match_value); + + int_filter->value.i = match_value; + + return CONTACTS_ERROR_NONE; +} + +API int contacts_filter_add_lli( contacts_filter_h filter, unsigned int property_id, + contacts_match_int_flag_e match, long long int match_value ) +{ + ctsvc_composite_filter_s *com_filter; + ctsvc_attribute_filter_s *lli_filter; + int ret; + + RETV_IF(NULL == filter, CONTACTS_ERROR_INVALID_PARAMETER); + + com_filter = (ctsvc_composite_filter_s*)filter; + ret = __ctsvc_attribute_filter_create(com_filter, property_id, match, CTSVC_FILTER_LLI, &lli_filter); + RETVM_IF(CONTACTS_ERROR_NONE !=ret, ret, + "Invalid parameter : The parameter is not proper (view_uri:, property_id:0x%x, match:%d, match_value :%d", + property_id, match, match_value); + + lli_filter->value.l = match_value; + + return CONTACTS_ERROR_NONE; +} + +API int contacts_filter_add_double( contacts_filter_h filter, unsigned int property_id, + contacts_match_int_flag_e match, double match_value ) +{ + ctsvc_composite_filter_s *com_filter; + ctsvc_attribute_filter_s *double_filter; + int ret; + + RETV_IF(NULL == filter, CONTACTS_ERROR_INVALID_PARAMETER); + + com_filter = (ctsvc_composite_filter_s*)filter; + ret = __ctsvc_attribute_filter_create(com_filter, property_id, match, CTSVC_FILTER_DOUBLE, &double_filter); + RETVM_IF(CONTACTS_ERROR_NONE !=ret, ret, + "Invalid parameter : The parameter is not proper (view_uri:, property_id:0x%x, match:%d, match_value :%d", + property_id, match, match_value); + + double_filter->value.d = match_value; + + return CONTACTS_ERROR_NONE; +} + +API int contacts_filter_add_bool( contacts_filter_h filter, unsigned int property_id, bool match_value ) +{ + ctsvc_composite_filter_s *com_filter; + ctsvc_attribute_filter_s *bool_filter; + int ret; + + RETV_IF(NULL == filter, CONTACTS_ERROR_INVALID_PARAMETER); + + com_filter = (ctsvc_composite_filter_s*)filter; + ret = __ctsvc_attribute_filter_create(com_filter, property_id, 0, CTSVC_FILTER_BOOL, &bool_filter); + RETVM_IF(CONTACTS_ERROR_NONE !=ret, ret, + "Invalid parameter : The parameter is not proper (view_uri:, property_id:%d, match_value :%d", + property_id, match_value); + + bool_filter->value.b = match_value; + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_composite_filter_destroy(ctsvc_composite_filter_s *com_filter) +{ + CTS_FN_CALL; + GSList *cursor; + + RETV_IF(NULL == com_filter, CONTACTS_ERROR_INVALID_PARAMETER); + + for(cursor=com_filter->filters;cursor;cursor=cursor->next) { + ctsvc_filter_s *sub_filter = (ctsvc_filter_s *)cursor->data; + + if (sub_filter->filter_type == CTSVC_FILTER_COMPOSITE) + __ctsvc_composite_filter_destroy((ctsvc_composite_filter_s *)sub_filter); + else { + ctsvc_attribute_filter_s *attr = (ctsvc_attribute_filter_s *)sub_filter; + if (attr->filter_type == CTSVC_FILTER_STR) + free(attr->value.s); + free(attr); + } + } + g_slist_free(com_filter->filter_ops); + + free(com_filter->view_uri); + + free(com_filter); + return CONTACTS_ERROR_NONE; +} + + +API int contacts_filter_destroy( contacts_filter_h filter ) +{ + RETV_IF(NULL == filter, CONTACTS_ERROR_INVALID_PARAMETER); + + return __ctsvc_composite_filter_destroy((ctsvc_composite_filter_s*)filter); +} + +static int __ctsvc_attribute_filter_clone(ctsvc_attribute_filter_s *src, ctsvc_attribute_filter_s **dest) +{ + ctsvc_attribute_filter_s *out; + out = (ctsvc_attribute_filter_s *)calloc(1, sizeof(ctsvc_attribute_filter_s)); + out->filter_type = src->filter_type; + out->property_id = src->property_id; + out->match = src->match; + if (src->filter_type == CTSVC_FILTER_STR) + out->value.s = SAFE_STRDUP(src->value.s); + else if (src->filter_type == CTSVC_FILTER_INT) + out->value.i = src->value.i; + else if (src->filter_type == CTSVC_FILTER_BOOL) + out->value.b = src->value.b; + else if (src->filter_type == CTSVC_FILTER_LLI) + out->value.l = src->value.l; + else if (src->filter_type == CTSVC_FILTER_DOUBLE) + out->value.d = src->value.d; + else + CTS_ERR("Invalid parameter : unknown type (%d)", src->filter_type); + + *dest = out; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_composite_filter_clone(ctsvc_composite_filter_s * filter, + ctsvc_composite_filter_s **out_filter) +{ + GSList *cursor; + ctsvc_composite_filter_s *out; + + RETV_IF(NULL == filter, CONTACTS_ERROR_INVALID_PARAMETER); + contacts_filter_create(filter->view_uri, (contacts_filter_h *)&out); + + for(cursor=filter->filters;cursor;cursor=cursor->next) { + ctsvc_filter_s *src = (ctsvc_filter_s *)cursor->data; + ctsvc_filter_s *dest = NULL; + + if (src->filter_type == CTSVC_FILTER_COMPOSITE) + __ctsvc_composite_filter_clone((ctsvc_composite_filter_s *)src, (ctsvc_composite_filter_s **)&dest); + else + __ctsvc_attribute_filter_clone((ctsvc_attribute_filter_s *)src, (ctsvc_attribute_filter_s **)&dest); + + out->filters = g_slist_append(out->filters, dest); + } + + out->filter_ops = g_slist_copy(filter->filter_ops); + *out_filter = out; + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_filter_clone(contacts_filter_h filter, contacts_filter_h *out_filter) +{ + RETV_IF(NULL == filter || NULL == out_filter, CONTACTS_ERROR_INVALID_PARAMETER); + + return __ctsvc_composite_filter_clone((ctsvc_composite_filter_s *)filter, (ctsvc_composite_filter_s **)out_filter); +} diff --git a/common/ctsvc_filter.h b/common/ctsvc_filter.h new file mode 100644 index 0000000..31b22e4 --- /dev/null +++ b/common/ctsvc_filter.h @@ -0,0 +1,30 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_FILTER_H__ +#define __TIZEN_SOCIAL_CTSVC_FILTER_H__ + +int ctsvc_filter_clone(contacts_filter_h filter, contacts_filter_h *out_filter); + +#endif /* __TIZEN_SOCIAL_CTSVC_FILTER_H__ */ + diff --git a/common/ctsvc_inotify.c b/common/ctsvc_inotify.c new file mode 100755 index 0000000..6b8e6cc --- /dev/null +++ b/common/ctsvc_inotify.c @@ -0,0 +1,399 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngjae Shin + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +#include +#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_notify.h" +#include "ctsvc_view.h" + +#include + +#ifdef _CONTACTS_IPC_CLIENT +#include "ctsvc_client_ipc.h" +#endif + +typedef struct +{ + int wd; + char *view_uri; + contacts_db_changed_cb cb; + void *cb_data; + bool blocked; +}noti_info; + +static int __inoti_fd = -1; +static guint __inoti_handler = 0; +static GSList *__noti_list = NULL; + +void ctsvc_inotify_call_blocked_callback() { + noti_info *noti; + GSList *it = NULL; + + for (it = __noti_list;it;it=it->next) { + noti = (noti_info *)it->data; + + if (noti->cb && noti->blocked) { + CTS_DBG("%s", noti->view_uri); + noti->blocked = false; + noti->cb(noti->view_uri, noti->cb_data); + } + } +} + +static inline void __ctsvc_inotify_handle_callback(GSList *noti_list, int wd, uint32_t mask) +{ + noti_info *noti; + GSList *it = NULL; + + for (it = noti_list;it;it=it->next) { + noti = (noti_info *)it->data; + + if (noti->wd == wd) { + +#ifdef _CONTACTS_IPC_CLIENT + if( ctsvc_ipc_is_busy() ){ + // hold the line + noti->blocked = true; + continue; + } +#endif + if ((mask & IN_CLOSE_WRITE) && noti->cb) { + CTS_DBG("%s", noti->view_uri); + noti->cb(noti->view_uri, noti->cb_data); + } + + } + } +} + +static gboolean __ctsvc_inotify_gio_cb(GIOChannel *src, GIOCondition cond, gpointer data) +{ + int fd, ret; + struct inotify_event ie; + char name[FILENAME_MAX] = {0}; + + fd = g_io_channel_unix_get_fd(src); + + while (0 < (ret = read(fd, &ie, sizeof(ie)))) { + if (sizeof(ie) == ret) { + if (__noti_list) + __ctsvc_inotify_handle_callback(__noti_list, ie.wd, ie.mask); + + while (0 < ie.len) { + ret = read(fd, name, (ie.lennext) { + if (it->data) { + same_noti = it->data; + if (same_noti->wd == wd && same_noti->cb == cb && + strcmp(same_noti->view_uri, view_uri) == 0 && same_noti->cb_data == data) + break; + else + same_noti = NULL; + } + } + + if (same_noti) { +// __ctsvc_inotify_watch(__inoti_fd, path); + CTS_ERR("The same callback(%s) is already exist", path); + return CONTACTS_ERROR_SYSTEM; + } + + ret = __ctsvc_inotify_watch(__inoti_fd, path); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "__ctsvc_inotify_watch() Failed"); + + noti = calloc(1, sizeof(noti_info)); + RETVM_IF(NULL == noti, CONTACTS_ERROR_OUT_OF_MEMORY, "calloc() Failed"); + + noti->wd = wd; + noti->view_uri = strdup(view_uri); + noti->cb_data = data; + noti->cb = cb; + noti->blocked = false; + + __noti_list = g_slist_append(__noti_list, noti); + + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_del_noti(GSList **noti_list, int wd, + const char *view_uri, contacts_db_changed_cb cb, void *user_data) +{ + int del_cnt, remain_cnt; + GSList *it, *result; + + del_cnt = 0; + remain_cnt = 0; + + it = result = *noti_list; + while (it) { + noti_info *noti = it->data; + if (noti && wd == noti->wd) { + if (cb == noti->cb && user_data == noti->cb_data + && 0 == strcmp(noti->view_uri, view_uri)) { + it = it->next; + result = g_slist_remove(result , noti); + free(noti->view_uri); + free(noti); + del_cnt++; + continue; + } + else { + remain_cnt++; + } + } + it = it->next; + } + RETVM_IF(del_cnt == 0, CONTACTS_ERROR_NO_DATA, "No Data: nothing deleted"); + + *noti_list = result; + + return remain_cnt; +} + +int ctsvc_inotify_unsubscribe(const char *view_uri, contacts_db_changed_cb cb, void *user_data) +{ + int ret, wd; + const char *path; + + RETV_IF(NULL==cb, CONTACTS_ERROR_INVALID_PARAMETER); + RETVM_IF(__inoti_fd < 0, CONTACTS_ERROR_SYSTEM, + "System : __inoti_fd(%d) is invalid", __inoti_fd); + + path = __ctsvc_noti_get_file_path(view_uri); + RETVM_IF(NULL == path, CONTACTS_ERROR_INVALID_PARAMETER, + "__ctsvc_noti_get_file_path(%s) Failed", view_uri); + + wd = __ctsvc_inotify_get_wd(__inoti_fd, path); + RETVM_IF(-1 == wd, CONTACTS_ERROR_SYSTEM, + "System: __ctsvc_inotify_get_wd() Failed(%d)", errno); + + ret = __ctsvc_del_noti(&__noti_list, wd, view_uri, cb, user_data); + WARN_IF(ret < CONTACTS_ERROR_NONE, "__ctsvc_del_noti() Failed(%d)", ret); + + if (0 == ret) + return inotify_rm_watch(__inoti_fd, wd); + + return __ctsvc_inotify_watch(__inoti_fd, path); +} + +static void __clear_nslot_list(gpointer data, gpointer user_data) +{ + noti_info *noti = (noti_info *)data; + + free(noti->view_uri); + free(noti ); +} + +static inline gboolean __ctsvc_inotify_detach_handler(guint id) +{ + return g_source_remove(id); +} + +void ctsvc_inotify_close(void) +{ + if (__inoti_handler) { + __ctsvc_inotify_detach_handler(__inoti_handler); + __inoti_handler = 0; + } + + if (__noti_list) { + g_slist_foreach(__noti_list, __clear_nslot_list, NULL); + g_slist_free(__noti_list); + __noti_list = NULL; + } + + if (0 <= __inoti_fd) { + close(__inoti_fd); + __inoti_fd = -1; + } +} diff --git a/src/cts-inotify.h b/common/ctsvc_inotify.h similarity index 62% rename from src/cts-inotify.h rename to common/ctsvc_inotify.h index 5d092f7..d1c6f43 100755 --- a/src/cts-inotify.h +++ b/common/ctsvc_inotify.h @@ -18,15 +18,15 @@ * limitations under the License. * */ -#ifndef __CTS_INOTIFY_H__ -#define __CTS_INOTIFY_H__ +#ifndef __TIZEN_SOCIAL_CTSVC_INOTIFY_H__ +#define __TIZEN_SOCIAL_CTSVC_INOTIFY_H__ -int cts_inotify_init(void); -void cts_inotify_close(void); -int cts_inotify_subscribe(const char *path, void (*cb)(void *), void *data); -int cts_inotify_unsubscribe(const char *path, void (*cb)(void *)); -int cts_inotify_unsubscribe_with_data(const char *path, - void (*cb)(void *), void *user_data); +#include "contacts_db.h" +int ctsvc_inotify_init(void); +void ctsvc_inotify_close(void); +int ctsvc_inotify_subscribe(const char *view_uri, contacts_db_changed_cb cb, void *data); +int ctsvc_inotify_unsubscribe(const char *view_uri, contacts_db_changed_cb cb, void *user_data); +void ctsvc_inotify_call_blocked_callback(); -#endif //__CTS_INOTIFY_H__ +#endif //__TIZEN_SOCIAL_CTSVC_INOTIFY_H__ diff --git a/common/ctsvc_internal.h b/common/ctsvc_internal.h new file mode 100644 index 0000000..049cc08 --- /dev/null +++ b/common/ctsvc_internal.h @@ -0,0 +1,143 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_INTERNAL_H__ +#define __TIZEN_SOCIAL_CTSVC_INTERNAL_H__ + +#include +#include + +#include "contacts_errors.h" +#include "ctsvc_struct.h" +#include "ctsvc_view.h" + +#ifdef API +#define API __attribute__ ((visibility("default"))) +//#undef API +#endif + + +//#define CONTACTS_DEBUGGING +//#define CONTACTS_TIMECHECK + + +#define LOG_TAG "CONTACTS_SERVICE" +#include +#define DLOG(prio, fmt, arg...) \ + do { SLOG(prio, LOG_TAG, fmt, ##arg); } while (0) + + +#if defined(_CONTACTS_IPC_SERVER) +#define IPC_ROLE "[SERVER]" +#elif defined(_CONTACTS_IPC_CLIENT) +#define IPC_ROLE "[CLIENT]" +#else +#define IPC_ROLE "[LIB]" +#endif + +#define INFO(fmt, arg...) SLOGI(IPC_ROLE" "fmt, ##arg) +#define ERR(fmt, arg...) SLOGE(IPC_ROLE" "fmt, ##arg) +#define DBG(fmt, arg...) SLOGD(IPC_ROLE" "fmt, ##arg) +#define WARN(fmt, arg...) SLOGD(IPC_ROLE" "fmt, ##arg) +#define VERBOSE(fmt, arg...) SLOGV(IPC_ROLE" "fmt, ##arg) + +#ifdef CONTACTS_DEBUGGING + + #define CTS_FN_CALL DBG(">>>>>>>> called") + #define CTS_FN_END DBG("<<<<<<<< ended") + + #define CTS_DBG(fmt, arg...) DBG(fmt, ##arg) + #define CTS_WARN(fmt, arg...) WARN(fmt, ##arg) + #define CTS_ERR(fmt, arg...) ERR(fmt, ##arg) + #define CTS_INFO(fmt, arg...) INFO(fmt, ##arg) + #define CTS_VERBOSE(fmt, arg...) VERBOSE(fmt, ##arg) + +#else /* CONTACTS_DEBUGGING */ + #define CTS_FN_CALL + #define CTS_FN_END + + #define CTS_DBG(fmt, arg...) + #define CTS_WARN(fmt, arg...) + #define CTS_ERR(fmt, arg...) ERR(IPC_ROLE" "fmt, ##arg) + #define CTS_INFO(fmt, arg...) + #define CTS_VERBOSE(fmt, arg...) + + #define G_DISABLE_ASSERT +#endif /* CONTACTS_DEBUGGING */ + +#define WARN_IF(expr, fmt, arg...) do { \ + if (expr) { \ + CTS_WARN(fmt, ##arg); \ + } \ +} while (0) +#define RET_IF(expr) do { \ + if (expr) { \ + CTS_ERR("(%s)", #expr); \ + return; \ + } \ +} while (0) +#define RETV_IF(expr, val) do { \ + if (expr) { \ + CTS_ERR("(%s)", #expr); \ + return (val); \ + } \ +} while (0) +#define RETM_IF(expr, fmt, arg...) do { \ + if (expr) { \ + CTS_ERR(fmt, ##arg); \ + return; \ + } \ +} while (0) +#define RETVM_IF(expr, val, fmt, arg...) do { \ + if (expr) { \ + CTS_ERR(fmt, ##arg); \ + return (val); \ + } \ +} while (0) + + +// TO DISABLE THIS MACRO, DEFINE "G_DISABLE_ASSERT" +#define ASSERT_NOT_REACHED(fmt, arg...) do { \ + CTS_ERR(fmt, ##arg); \ + assert(!"DO NOT REACH HERE!"); \ + } while(0) + + +#define CONTACTS_FREE(ptr) \ + do { \ + if (ptr) \ + free(ptr); \ + ptr = NULL; \ + } while(0) + +// Thread-local storage +#ifdef _CONTACTS_IPC_SERVER +#define TLS __thread +#elif _CONTACTS_IPC_CLIENT +#define TLS __thread +#else //_CONTACTS_NATIVE +#define TLS +#endif + +#endif /* __TIZEN_SOCIAL_CTSVC_INTERNAL_H__ */ + diff --git a/common/ctsvc_list.c b/common/ctsvc_list.c new file mode 100644 index 0000000..3e4879a --- /dev/null +++ b/common/ctsvc_list.c @@ -0,0 +1,424 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_list.h" +#include "ctsvc_record.h" + +API int contacts_list_create( contacts_list_h* out_list ) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER); + *out_list = NULL; + + list_s = (ctsvc_list_s*)calloc(1, sizeof(ctsvc_list_s)); + RETVM_IF(NULL == list_s, CONTACTS_ERROR_OUT_OF_MEMORY, "Out of memory : calloc is failed"); + + list_s->l_type = -1; + *out_list = (contacts_list_h)list_s; + return CONTACTS_ERROR_NONE; +} + +API int contacts_list_get_count( contacts_list_h list, unsigned int *count ) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == count, CONTACTS_ERROR_INVALID_PARAMETER); + *count = 0; + + RETV_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER); + list_s = (ctsvc_list_s *)list; + + *count = list_s->count; + return CONTACTS_ERROR_NONE; +} + +int ctsvc_list_add_child( contacts_list_h list, contacts_record_h child_record ) +{ + ctsvc_list_s *s_list; + ctsvc_record_s *s_record; + bool is_first = false; + + RETV_IF(NULL == list || NULL == child_record, CONTACTS_ERROR_INVALID_PARAMETER); + s_list = (ctsvc_list_s *)list; + s_record = (ctsvc_record_s *)child_record; + + if (-1 == s_list->l_type) { + s_list->l_type = s_record->r_type; + is_first = true; + } + else if (s_list->l_type != s_record->r_type) + return CONTACTS_ERROR_INVALID_PARAMETER; + + s_list->records = g_list_append(s_list->records, child_record); + + if (s_list->count == 0) + s_list->cursor = s_list->records; + + s_list->count++; + return CONTACTS_ERROR_NONE; +} + +API int contacts_list_add( contacts_list_h list, contacts_record_h child_record ) +{ + ctsvc_list_s *s_list; + ctsvc_record_s *s_record; + bool is_first = false; + + RETV_IF(NULL == list || NULL == child_record, CONTACTS_ERROR_INVALID_PARAMETER); + s_list = (ctsvc_list_s *)list; + s_record = (ctsvc_record_s *)child_record; + + if (-1 == s_list->l_type) { + s_list->l_type = s_record->r_type; + is_first = true; + } + else if (s_list->l_type != s_record->r_type) + return CONTACTS_ERROR_INVALID_PARAMETER; + + s_list->records = g_list_append(s_list->records, child_record); + + if (s_list->count == 0) + s_list->cursor = s_list->records; + + s_list->count++; + return CONTACTS_ERROR_NONE; +} + +int ctsvc_list_prepend( contacts_list_h list, contacts_record_h child_record ) +{ + ctsvc_list_s *s_list; + ctsvc_record_s *s_record; + bool is_first = false; + + RETV_IF(NULL == list || NULL == child_record, CONTACTS_ERROR_INVALID_PARAMETER); + s_list = (ctsvc_list_s *)list; + s_record = (ctsvc_record_s *)child_record; + + if (-1 == s_list->l_type) { + s_list->l_type = s_record->r_type; + is_first = true; + } + else if (s_list->l_type != s_record->r_type) + return CONTACTS_ERROR_INVALID_PARAMETER; + + s_list->records = g_list_prepend(s_list->records, child_record); + + if (s_list->count == 0) + s_list->cursor = s_list->records; + + s_list->count++; + return CONTACTS_ERROR_NONE; +} + +int ctsvc_list_reverse( contacts_list_h list) +{ + ctsvc_list_s *s_list; + + RETV_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER); + s_list = (ctsvc_list_s *)list; + + + if (s_list->count != 0) + s_list->records = g_list_reverse (s_list->records); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_list_remove_child( contacts_list_h list, contacts_record_h record, bool insert_delete_list ) +{ + GList *cursor = NULL; + ctsvc_list_s *s_list; + ctsvc_record_s *s_record; + contacts_record_h delete_record; + contacts_error_e err = CONTACTS_ERROR_NONE; + + RETV_IF(NULL == list || NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_list = (ctsvc_list_s *)list; + s_record = (ctsvc_record_s *)record; + + if (s_list->l_type != s_record->r_type) + return CONTACTS_ERROR_INVALID_PARAMETER; + + for (cursor=s_list->records;cursor;cursor=cursor->next) { + ctsvc_record_s *data = (ctsvc_record_s *)cursor->data; + if (data == s_record){ + s_list->count--; + if (s_list->cursor == cursor) + s_list->cursor = cursor->next; + + s_list->records = g_list_remove(s_list->records, s_record); + if (insert_delete_list) { + err = contacts_record_clone(record, &delete_record); + RETVM_IF(CONTACTS_ERROR_NONE != err, err,"contacts_record_clone() Failed(%d)", err); + s_list->deleted_records = g_list_append(s_list->deleted_records, delete_record); + } + return CONTACTS_ERROR_NONE; + } + } + + return CONTACTS_ERROR_NO_DATA; +} + +API int contacts_list_remove( contacts_list_h list, contacts_record_h record ) +{ + GList *cursor = NULL; + ctsvc_list_s *s_list; + ctsvc_record_s *s_record; + + RETV_IF(NULL == list || NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_list = (ctsvc_list_s *)list; + s_record = (ctsvc_record_s *)record; + + if (s_list->l_type != s_record->r_type) + return CONTACTS_ERROR_INVALID_PARAMETER; + + for (cursor=s_list->records;cursor;cursor=cursor->next) { + ctsvc_record_s *data = (ctsvc_record_s *)cursor->data; + if (data == s_record){ + s_list->count--; + if (s_list->cursor == cursor) + s_list->cursor = cursor->next; + s_list->records = g_list_remove(s_list->records, s_record); + return CONTACTS_ERROR_NONE; + } + } + + return CONTACTS_ERROR_NO_DATA; +} + +API int contacts_list_get_current_record_p( contacts_list_h list, contacts_record_h* record ) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + *record = NULL; + + RETV_IF(NULL == list || NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + list_s = (ctsvc_list_s *)list; + + if (NULL == list_s->cursor) { + *record = NULL; + return CONTACTS_ERROR_NO_DATA; + } + + *record = list_s->cursor->data; + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_list_get_nth_record_p( contacts_list_h list, int index, contacts_record_h* record ) +{ + GList *cursor = NULL; + ctsvc_list_s *list_s; + ctsvc_record_s *data; + int i, j; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + *record = NULL; + + RETV_IF(NULL == list || NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + list_s = (ctsvc_list_s *)list; + + for (i=0,j=0,cursor=list_s->records;cursor;cursor=cursor->next, i++) { + data = (ctsvc_record_s *)cursor->data; + if (j == index) { + *record = (contacts_record_h)cursor->data; + return CONTACTS_ERROR_NONE; + } + j++; + } + *record = NULL; + return CONTACTS_ERROR_NO_DATA; +} + +static int __ctsvc_list_move_cursor( contacts_list_h list, bool next ) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER); + list_s = (ctsvc_list_s *)list; + + if (NULL == list_s->cursor) + return CONTACTS_ERROR_NO_DATA; + + list_s->cursor = next ? list_s->cursor->next : list_s->cursor->prev ; + + if (NULL == list_s->cursor) + return CONTACTS_ERROR_NO_DATA; + + return CONTACTS_ERROR_NONE; +} + +API int contacts_list_prev( contacts_list_h list ) +{ + return __ctsvc_list_move_cursor(list, false); +} + +API int contacts_list_next( contacts_list_h list ) +{ + return __ctsvc_list_move_cursor(list, true); +} + + + +API int contacts_list_first( contacts_list_h list ) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER); + list_s = (ctsvc_list_s *)list; + + list_s->cursor = list_s->records; + if (NULL == list_s->cursor) + return CONTACTS_ERROR_NO_DATA; + + return CONTACTS_ERROR_NONE; +} + +API int contacts_list_last( contacts_list_h list ) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER); + list_s = (ctsvc_list_s *)list; + + list_s->cursor = g_list_last(list_s->records); + if (NULL == list_s->cursor) + return CONTACTS_ERROR_NO_DATA; + + return CONTACTS_ERROR_NONE; +} + +API int contacts_list_destroy( contacts_list_h list, bool delete_child ) +{ + ctsvc_list_s *s_list; + GList *cursor = NULL; + + RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : The list is null"); + s_list = (ctsvc_list_s *)list; + + if (delete_child) { + for(cursor = s_list->records;cursor;cursor=cursor->next) + contacts_record_destroy((contacts_record_h)(cursor->data), true); + g_list_free(s_list->records); + } + + for(cursor = s_list->deleted_records;cursor;cursor=cursor->next) + contacts_record_destroy((contacts_record_h)(cursor->data), true); + g_list_free(s_list->deleted_records); + + free(s_list); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_list_clone(contacts_list_h list, contacts_list_h* out_list) +{ + ctsvc_list_s *list_s; + ctsvc_record_s *data; + contacts_record_h new_record; + contacts_list_h new_list; + GList *cursor = NULL; + contacts_error_e err = CONTACTS_ERROR_NONE; + + RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, + "The list is null"); + list_s = (ctsvc_list_s *)list; + + contacts_list_create(&new_list); + for(cursor = list_s->records;cursor;cursor=cursor->next) { + data = (ctsvc_record_s *)cursor->data; + err = contacts_record_clone((contacts_record_h)cursor->data, &new_record); + RETVM_IF(CONTACTS_ERROR_NONE != err, err,"contacts_record_clone() Failed(%d)", err); + ctsvc_list_prepend(new_list, new_record); + } + ctsvc_list_reverse(new_list); + + for(cursor = list_s->deleted_records;cursor;cursor=cursor->next) { + data = (ctsvc_record_s *)cursor->data; + err = contacts_record_clone((contacts_record_h)cursor->data, &new_record); + RETVM_IF(CONTACTS_ERROR_NONE != err, err,"contacts_record_clone() Failed(%d)", err); + ((ctsvc_list_s*)new_list)->deleted_records = g_list_prepend(((ctsvc_list_s*)new_list)->deleted_records, new_record); + } + if (((ctsvc_list_s*)new_list)->deleted_records) + ((ctsvc_list_s*)new_list)->deleted_records = g_list_reverse(((ctsvc_list_s*)new_list)->deleted_records); + + *out_list = new_list; + + return CONTACTS_ERROR_NONE; +} + + +int ctsvc_list_get_deleted_count(contacts_list_h list, unsigned int *count ) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == count, CONTACTS_ERROR_INVALID_PARAMETER); + *count = 0; + + RETV_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER); + list_s = (ctsvc_list_s *)list; + + if( NULL == list_s->deleted_records ) + { + return CONTACTS_ERROR_NONE; + } + + *count = g_list_length(list_s->deleted_records); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_list_get_deleted_nth_record_p( contacts_list_h list, int index, contacts_record_h* record ) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + *record = NULL; + + RETV_IF(NULL == list || NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + list_s = (ctsvc_list_s *)list; + + RETV_IF(NULL == list_s->deleted_records, CONTACTS_ERROR_NO_DATA); + + *record = (ctsvc_record_s *)g_list_nth_data(list_s->deleted_records, index); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_list_append_deleted_record(contacts_list_h list, contacts_record_h record) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == list || NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + + list_s = (ctsvc_list_s *)list; + + list_s->deleted_records = g_list_append(list_s->deleted_records, record); + + return CONTACTS_ERROR_NONE; +} diff --git a/common/ctsvc_list.h b/common/ctsvc_list.h new file mode 100644 index 0000000..b13f6bf --- /dev/null +++ b/common/ctsvc_list.h @@ -0,0 +1,40 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_LIST_H__ +#define __TIZEN_SOCIAL_CTSVC_LIST_H__ + +#include "contacts_views.h" + +int ctsvc_list_clone(contacts_list_h list, contacts_list_h* out_list); +int ctsvc_list_get_nth_record_p( contacts_list_h list, int index, contacts_record_h* record ); +int ctsvc_list_add_child( contacts_list_h list, contacts_record_h child_record ); +int ctsvc_list_prepend( contacts_list_h list, contacts_record_h child_record ); +int ctsvc_list_reverse( contacts_list_h list); +int ctsvc_list_remove_child( contacts_list_h list, contacts_record_h record, bool insert_delete_list ); + +int ctsvc_list_get_deleted_count(contacts_list_h list, unsigned int *count ); +int ctsvc_list_get_deleted_nth_record_p( contacts_list_h list, int index, contacts_record_h* record ); +int ctsvc_list_append_deleted_record(contacts_list_h list, contacts_record_h record); + +#endif /* __TIZEN_SOCIAL_CTSVC_LIST_H__ */ diff --git a/common/ctsvc_localize.c b/common/ctsvc_localize.c new file mode 100755 index 0000000..c53957a --- /dev/null +++ b/common/ctsvc_localize.c @@ -0,0 +1,502 @@ +/* + * Contacts Service Helper + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +#include +#include +#include "ctsvc_internal.h" +#include "ctsvc_normalize.h" +#include "ctsvc_localize.h" + +#define CTSVC_COMPARE_BETWEEN(left_range, value, right_range) (((left_range) <= (value)) && ((value) <= (right_range))) + +/* korean -Hangul Jamo extended A*/ +#define CTSVC_JAMO_A_START (UChar)0xA960 +#define CTSVC_JAMO_A_END (UChar)0xA97F + +/* korean -Hangul Jamo extended B*/ +#define CTSVC_JAMO_B_START (UChar)0xD7B0 +#define CTSVC_JAMO_B_END (UChar)0xD7FF + +/* korean -Hangul Compatability */ +#define CTSVC_HAN_C_START (UChar)0x3130 +#define CTSVC_HAN_C_END (UChar)0x318F + +/* korean -Hangul halfwidth */ +#define CTSVC_HAN_HALF_START (UChar)0xFFA0 +#define CTSVC_HAN_HALF_END (UChar)0xFFDC + +static const char hangul_compatibility_choseong[] = { + 0x31, 0x32, 0x34, 0x37, 0x38, 0x39, 0x40, 0x41, + 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x65, 0x66, 0x6E, + 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, + 0x81, 0x84, 0x85, 0x86, 0x00}; +static const unsigned char hangul_jamo_choseong[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x1A, 0x06, 0x07, // to choseong 0x1100~0x115F + 0x08, 0x21, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x14, 0x15, 0x1C, 0x1D, 0x1E, 0x20, + 0x22, 0x23, 0x27, 0x29, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x32, 0x36, 0x40, 0x47, 0x4C, 0x57, 0x58, 0x59, 0x00}; + +static const char hangul_compatibility_jungseong[] = { + 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, + 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, + 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x87, 0x88, + 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x00}; +static const unsigned char hangul_jamo_jungseong[] = { + 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, // to jungseong 0x1160~0x11A7 + 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, + 0x73, 0x74, 0x75, 0x60, 0x84, 0x85, 0x88, 0x91, 0x92, + 0x94, 0x9E, 0xA1, 0x00}; + +static const char hangul_compatibility_jongseong[] = { + 0x33, 0x35, 0x36, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, + 0x3F, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, + 0x6F, 0x70, 0x82, 0x83, 0x00}; +static const unsigned char hangul_jamo_jongseong[] = { + 0xAA, 0xAC, 0xAD, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, // to jongseong 0x11A8~0x11FF + 0xC7, 0xC8, 0xCC, 0xCE, 0xD3, 0xD7, 0xD9, 0xDF, 0xF1, 0xF2, 0x00}; + +int ctsvc_check_utf8(char c) +{ + if ((c & 0xff) < (128 & 0xff)) + return 1; + else if ((c & (char)0xe0) == (char)0xc0) + return 2; + else if ((c & (char)0xf0) == (char)0xe0) + return 3; + else if ((c & (char)0xf8) == (char)0xf0) + return 4; + else if ((c & (char)0xfc) == (char)0xf8) + return 5; + else if ((c & (char)0xfe) == (char)0xfc) + return 6; + else + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static inline bool is_hangul(UChar src) +{ + if ((0x1100 == (src & 0xFF00)) /* korean -Hangul Jamo*/ + || CTSVC_COMPARE_BETWEEN(CTSVC_JAMO_A_START, src, CTSVC_JAMO_A_END) + || CTSVC_COMPARE_BETWEEN(CTSVC_JAMO_B_START, src, CTSVC_JAMO_B_END) + || CTSVC_COMPARE_BETWEEN(CTSVC_HAN_C_START, src, CTSVC_HAN_C_END) + || CTSVC_COMPARE_BETWEEN(CTSVC_HAN_HALF_START, src, CTSVC_HAN_HALF_END)) + return true; + else + return FALSE; +} + +static inline void hangul_compatibility2jamo(UChar *src) +{ + int unicode_value1 = 0; + int unicode_value2 = 0; + + unicode_value1 = (0xFF00 & (*src)) >> 8; + unicode_value2 = (0xFF & (*src)); + + /* korean -Hangul Jamo halfwidth*/ + if (CTSVC_COMPARE_BETWEEN(CTSVC_HAN_HALF_START, *src, CTSVC_HAN_HALF_END)) { + unicode_value1 = 0x31; + + if (unicode_value2 < 0xBF) + unicode_value2 -= 0x70; + else if (unicode_value2 < 0xC8) + unicode_value2 -= 0x73; + else if (unicode_value2 < 0xD0) + unicode_value2 -= 0x75; + else if (unicode_value2 < 0xD8) + unicode_value2 -= 0x77; + else + unicode_value2 -= 0x79; + + (*src) = unicode_value1 << 8 | unicode_value2; + } + + if (CTSVC_COMPARE_BETWEEN(CTSVC_HAN_C_START, *src, CTSVC_HAN_C_END)) { + char *pos; + if (NULL != (pos = strchr(hangul_compatibility_choseong, unicode_value2))) { + unicode_value1 = 0x11; + unicode_value2 = hangul_jamo_choseong[pos - hangul_compatibility_choseong]; + (*src) = unicode_value1 << 8 | unicode_value2; + } + else if (NULL != (pos = strchr(hangul_compatibility_jungseong, unicode_value2))) { + unicode_value1 = 0x11; + unicode_value2 = hangul_jamo_jungseong[pos - hangul_compatibility_jungseong]; + (*src) = unicode_value1 << 8 | unicode_value2; + } + else if (NULL != (pos = strchr(hangul_compatibility_jongseong, unicode_value2))) { + unicode_value1 = 0x11; + unicode_value2 = hangul_jamo_jongseong[pos - hangul_compatibility_jongseong]; + (*src) = unicode_value1 << 8 | unicode_value2; + } + } +} + +int ctsvc_check_language(UChar *word) +{ + int type; + + int unicode_value1 = 0; + int unicode_value2 = 0; + + unicode_value1 = (0xFF00 & (*word)) >> 8; + unicode_value2 = (0xFF & (*word)); + + CTS_VERBOSE("0x%x%x", unicode_value1, unicode_value2); + + if (CTSVC_COMPARE_BETWEEN('0', word[0], '9')) { + type = CTSVC_LANG_NUMBER; + } + else if (CTSVC_COMPARE_BETWEEN(0x41, word[0], 0x7A)) { /* english */ + type = CTSVC_LANG_ENGLISH; + } + else if (is_hangul(word[0])){ + type = CTSVC_LANG_KOREAN; + } + else if (0x4E00 <= *word && *word <= 0x9FA5) { + type = CTSVC_LANG_ENGLISH; + } + +#if 0 // TODO + else if () + type = CTSVC_LANG_CHINESE; + else if () + type = CTSVC_LANG_JAPANESE; + else if () + type = CTSVC_LANG_FRENCH; + else if () + type = CTSVC_LANG_GERMAN; + else if () + type = CTSVC_LANG_ITALIAN; + else if () + type = CTSVC_LANG_RUSSIAN; + else if () + type = CTSVC_LANG_DUTCH; + else if () + type = CTSVC_LANG_PORTUGUESE; + else if () + type = CTSVC_LANG_TURKISH; + else if () + type = CTSVC_LANG_GREEK; + else if () + type = CTSVC_LANG_SPANISH; + else if () + type = CTSVC_LANG_DANISH; + else if () + type = CTSVC_LANG_AZERBAIJAN; + else if () + type = CTSVC_LANG_ARABIC; + else if () + type = CTSVC_LANG_BULGARIAN; + else if () + type = CTSVC_LANG_CATALAN; + else if () + type = CTSVC_LANG_CZECH; + else if () + type = CTSVC_LANG_ESTONIAN; + else if () + type = CTSVC_LANG_BASQUE; + else if () + type = CTSVC_LANG_FINNISH; + else if () + type = CTSVC_LANG_IRISH; + else if () + type = CTSVC_LANG_GALICIAN; + else if () + type = CTSVC_LANG_HINDI; + else if () + type = CTSVC_LANG_CROATIAN; + else if () + type = CTSVC_LANG_HUNGARIAN; + else if () + type = CTSVC_LANG_ARMENIAN; + else if () + type = CTSVC_LANG_ICELANDIC; + else if () + type = CTSVC_LANG_GEORGIAN; + else if () + type = CTSVC_LANG_KAZAKHSTAN; + else if () + type = CTSVC_LANG_LITHUANIAN; + else if () + type = CTSVC_LANG_LATVIAN; + else if () + type = CTSVC_LANG_MACEDONIA; + else if () + type = CTSVC_LANG_NORWAY; + else if () + type = CTSVC_LANG_POLISH; + else if () + type = CTSVC_LANG_ROMANIA; + else if () + type = CTSVC_LANG_SLOVAK; + else if () + type = CTSVC_LANG_SLOVENIAN; + else if () + type = CTSVC_LANG_SERBIAN; + else if () + type = CTSVC_LANG_SWEDISH; + else if () + type = CTSVC_LANG_UKRAINE; +#endif + else + type = CTSVC_LANG_OTHERS; + + CTS_VERBOSE("language type = %d", type); + return type; +} + +#define array_sizeof(a) (sizeof(a) / sizeof(a[0])) + +int ctsvc_check_language_type(const char *src) +{ + int length = 0; + char temp[10] = {0}; + UChar tmp_result[2]; + UChar result[10]; + UErrorCode status = 0; + int32_t size; + + if (src && src[0]) { + length = ctsvc_check_utf8(src[0]); + RETVM_IF(length <= 0, CONTACTS_ERROR_INTERNAL, "check_utf8 failed"); + + strncpy(temp, src, length); + + CTS_VERBOSE("temp(%s) src(%s) length(%d)", temp, src, length); + + u_strFromUTF8(tmp_result, array_sizeof(tmp_result), NULL, temp, -1, &status); + RETVM_IF(U_FAILURE(status), CONTACTS_ERROR_SYSTEM, + "u_strFromUTF8() Failed(%s)", u_errorName(status)); + + u_strToUpper(tmp_result, array_sizeof(tmp_result), tmp_result, -1, NULL, &status); + RETVM_IF(U_FAILURE(status), CONTACTS_ERROR_SYSTEM, + "u_strToLower() Failed(%s)", u_errorName(status)); + + size = unorm_normalize(tmp_result, -1, UNORM_NFD, 0, + (UChar *)result, array_sizeof(result), &status); + RETVM_IF(U_FAILURE(status), CONTACTS_ERROR_SYSTEM, + "unorm_normalize(%s) Failed(%s)", src, u_errorName(status)); + + CTS_VERBOSE("0x%x%x", (0xFF00 & (tmp_result[0])) >> 8, (0xFF & (tmp_result[0]))); + + return ctsvc_check_language(result); + } + + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +void ctsvc_extra_normalize(UChar *word, int32_t word_size) +{ + int i; + for (i=0;i - * Donghee Ye - * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -19,13 +16,15 @@ * limitations under the License. * */ -#ifndef __CTS_HELPER_LOCALIZE_H__ -#define __CTS_HELPER_LOCALIZE_H__ +#ifndef __TIZEN_SOCIAL_CTSVC_LOCALIZE_H__ +#define __TIZEN_SOCIAL_CTSVC_LOCALIZE_H__ #include -int helper_check_language(UChar *word); -int helper_get_language_type(const char *system_lang); -void helper_extra_normalize(UChar *word, int32_t word_size); - -#endif // __CTS_HELPER_LOCALIZE_H__ +int ctsvc_check_utf8(char c); +int ctsvc_check_language(UChar *word); +int ctsvc_check_language_type(const char *src); +int ctsvc_get_language_type(const char *system_lang); +void ctsvc_extra_normalize(UChar *word, int32_t word_size); +int ctsvc_get_chosung(const char *src, char *dest, int dest_size); +#endif // __TIZEN_SOCIAL_CTSVC_LOCALIZE_H__ diff --git a/common/ctsvc_localize_ch.c b/common/ctsvc_localize_ch.c new file mode 100755 index 0000000..9d7f29d --- /dev/null +++ b/common/ctsvc_localize_ch.c @@ -0,0 +1,2276 @@ +/* + * Contacts Service Helper + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + + +#include "ctsvc_internal.h" +#include "ctsvc_localize_ch.h" + + +#define CHINESE_COUNT 20902 +#define CHINESE_DUOYINZI_MAX_COUNT 6 + + +#define CHINESE_UNICODE_START 0x4E01 +#define CHINESE_UNICODE_END 0x9FA5 + +static const char* const pinyin_spell_table[] = { + "yi","ding|zheng","kao|qiao|yu","qi","shang","xia","mo","wan|mo","zhang","san", + "shang","xia","qi|ji","bu|fou","yu","mian","gai","chou","chou","zhuan", + "qie|ju","pi","shi","shi","qiu","bing","ye","cong","dong","si", + "cheng","diu","qiu","liang","diu","you","liang","yan","bing","sang", + "gun","jiu","ge","ya","pan","zhong","ji","jie","feng","guan|kuang", + "chuan","chan","lin","zhuo","zhu","ba","wan","dan","wei","zhu", + "jing","li","ju","pie","fu","yi|ji","yi","nai","wu","jiu", + "jiu","tuo|zhe","me|yao|mB","yi","ho","zhi","wu","zha","hu","fa", + "le|yue","yin","ping","pang","qiao","hu","guai","cheng|sheng","cheng|sheng","yi", + "hao","zhe","mie|nie","jiu","qi","ye","xi","xiang","gai","jiu", + "hal","hol","shu","dou","shi","ji","nang","kal","keol","tol", + "mol","ol","mai","luan","cal","ru","xue","yan","phoi","sha", + "na","qian","sol","er","zu","ceor","qian|gan","zhi|luan","gui","qian", + "luan","lin","yi","jue","liao|le","ma","yu","zheng","shi","shi", + "er","chu","yu","kui","yu","yun","hu","qi","wu","jing", + "si","sui","gen","gen","ya","xie|suo","ya","qi|zhai","ya","ji|qi", + "tou","wang|wu","kang","da","jiao","hai","yi","chan","heng|peng","mu", + "ye","xiang","jing","ting","liang","xiang","jing","ye","qin|qing","bo", + "you","xie","dan","lian","duo","wei|men","ren","ren","ji","ji", + "wang","yi","shi|shen","ren","le","ding","ze","jin","pu","chou|qiu", + "ba","zhang","jin","jie","bing","reng","cong|zong","fo","jin|san","lun", + "bing","cang","zi|zai","shi","ta","zhang","fu","xian","xian","tuo|cha|duo", + "hong","tong","ren","qian","gan|han","yi|ge","bo","dai","ling","yi", + "chao","chang|zhang","sa","chang","yi","mu","men","ren","fan","chao|miao", + "yang|ang","qian","zhong","pi","wo","wu","jian","jia|jie","yao|fo","feng", + "cang","ren","wang","fen|bin","di","fang","zhong","qi","pei","yu", + "diao","dun","wen","yi","xin","kang","yi","ji","ai","wu", + "ji|qi","fu","fa","xiu|xu","jin","pi","dan","fu","tang","zhong", + "you","huo","hui|kuai","yu","cui","yun","san","wei","chuan|zhuan","che|ju", + "ya","qian","shang","chang","lun","cang|chen","xun","xin","wei","zhu", + "chi","xian|xuan","nu","bo|bai|ba","gu","ni","ni","xie","ban","xu", + "ling","zhou","shen","qu","si|ci","peng","si|shi","qie|jia|ga","pi","zhi", + "si","yi|chi","zheng","dian|tian","han|gan","mai","dan","zhu","bu","qu", + "bi","zhao|shao","ci","wei","di","zhu","zuo","you","yang","ti|ben", + "zhan|dian","he","bi","tuo","she","yu","yi|die","fo|fu|bi|bo","zuo","gou|kou", + "ning","tong","ni","xian","qu","yong","wa","qian","shi","ka", + "bao","pei","hui|huai","ge","lao","xiang","ge","yang","bai","fa", + "ming","jia","er|nai","bing","ji","hen","huo","gui","quan","tiao", + "jiao","ci","yi","shi","xing","shen","tuo","kan","zhi","gai", + "lai","yi","chi","kua","gong","li","yin","shi","mi","zhu", + "xu","you","an","lu","mou","er","lun","dong|tong","cha","chi", + "xun","gong","zhou","yi","ru","cun","xia","si","dai","lv", + "ta","jiao|yao","zhen","ce|ze|zhai","qiao","kuai","chai","ning","nong","jin", + "wu","hou","jiong","cheng|ting","zhen","zuo","hao","qin","lv","jv", + "shu|dou","ting","shen","tuo|tui","bo","nan","xiao","bian|pian","tui","yu", + "xi","cu","e","qiu","xu","guang","ku","wu","jun","yi", + "fu","liang","zu","qiao|xiao","li","yong","hun","jing","qian","san", + "pei","su","fu","xi","li","fu","ping","bao","yu|shu","si|qi", + "xia","xin|shen","xiu","yu","di","che|ju","chou","zhi","yan","liang|lia", + "li","lai","si","jian","xiu","fu","huo","ju","xiao","pai", + "jian","biao","chu|ti","fei","feng","ya","an","bei","yu","xin", + "bi","hu|chi","chang","zhi","bing","jiu","yao","cui|zu","liang|lia","wan", + "lai","cang","zong","ge","guan","bei","tian","shu","shu","men", + "dao","tan","jue","chui","xing","peng","tang|chang","hou","yi","qi", + "ti","gan","liang|jing","jie","sui","chang","jie","fang","zhi","kong", + "juan","zong","ju","qian","ni","lun","zhuo","wo|wei","luo","song", + "leng","hun","dong","zi","ben","wu","ju","nai","cai","jian", + "zhai","ye","zhi","sha","qing","ning","ying","cheng|chen","qian","yan", + "ruan","zhong|tong","chun","jia","ji|jie","wei","yu","bing","ruo","ti", + "wei","pian","yan","feng","tang|dang","wo","e","xie","che","sheng", + "kan","di","zuo","cha","ting","bei","xie","huang","yao","zhan", + "chou|qiao","an","you","jian","xu","zha","ci","fu","bi","zhi", + "zong","mian","ji","yi","xie","xun","cai|si","duan","ce|ze|zhai","zhen", + "ou","tou","tou","bei","zan|za|zBn","lv|lou","jie","wei","fen","chang", + "kui|gui","sou","zhi|si","su","xia","fu","yuan","rong","li","nu", + "yun","jiang|gou","ma","bang","dian","tang","hao","jie","xi","shan", + "qian|jian","que|jue","cang|chen","chu","san","bei","xiao","rong","yao","ta|tan", + "suo","yang","fa","bing","jia","dai","zai","tang","gu","bin", + "chu","nuo","can","lei","cui","yong","zao|cao","zong","peng","song", + "ao","chuan|zhuan","yu","zhai","qi|cou","shang","chuang","jing","chi","sha", + "han","zhang","qing","yan","di","xie","lv|lou","bei","piao|biao","jin", + "lian","lu","man","qian","xian","tan","ying","dong","zhuan","xiang", + "shan","qiao","jiong","tui","zun","pu","xi","lao","chang","guang", + "liao","qi","cheng|deng","zhan|zhuan|chan","wei","ji","bo","hui","chuan","tie|jian", + "dan","jiao|yao","jiu","seng","fen","xian","yu|ju","e|wu","jiao","jian", + "tong|zhuang","lin","bo","gu","xian","su","xian","jiang","min","ye", + "jin","jia|jie","qiao","pi","feng","zhou","ai","sai","yi","jun", + "nong","chan|tan|shan","yi","dang","jing","xuan","kuai","jian","chu","dan", + "jiao","sha","zai","can","bin","an","ru","tai","chou","chai", + "lan","ni|yi","jin","qian","meng","wu","ning","qiong","ni","chang", + "lie","lei","lv","kuang","bao","yu","biao","zan","zhi","si", + "you","hao","qing","chen","li","teng","wei","long","chu","chan", + "rang|xiang","shu","hui|xie","li","luo","zan","nuo","tang","yan","lei", + "nang","er","wu","yun","zan","yuan","xiong","chong","zhao","xiong", + "xian","guang","dui|rui|yue","ke","dui|rui|yue","mian","tu","chang|zhang","er","dui|rui|yue", + "er|ni","jin","tu","si","yan","yan","shi","shike","dang","qibnke", + "dou","gongfenPPPU","hboke","shen","dou","baike","jing","gongli","huang","ru", + "wang","nei","quan","liang","yu|shu","ba","gong","liu|lu","xi","han", + "lan","gong","tian","guan","xing","bing","qi|ji","ju","dian","zi|ci", + "bun","yang","jian","shou","ji","yi","ji","chan","jiong","mao", + "ran","nei|na","yuan","mao","gang","ran","ce","jiong","ce","zai", + "gua","jiong","mao","zhou","mao|mo","gou","xu","mian","mi","rong", + "yin|you","xie","kan","jun","nong","yi","shen","shi","guan","meng", + "zhong","zui","yuan","ming","kou","lin","fu","xie","mi","bing", + "dong","tai","gang","feng|ping","bing","hu","chong","jue","ya","kuang", + "ye","leng","pan","fa","min","dong","xian","lie","qia","jian", + "jing|cheng","sou","mei","tu","qi","gu","zhun","song","jing|cheng","liang", + "qing","diao","ling","dong","gan","jian","yin","cou","ai","li", + "cang","ming","zhun","cui","si","duo","jin","lin","lin","ning", + "xi","du","ji","fan","fan","fan","feng","ju","chu","yi kB|yi kB no bo li|tB ko", + "feng","mu","zhi","fu","feng","ping","feng","kai","huang","kai", + "gan","deng","ping","kan|qian","xiong","kuai","tu","ao|wa","chu","ji", + "dang","han","han","zao","dao","diao","dao","ren","ren","chuang", + "fen","qie","yi","ji","kan","qian","cun","chu","wen","ji", + "dan","xing","hua","wan","jue","li","yue","lie","liu","ze", + "gang","chuang","fu","chu","qu","diao","shan","min","ling","zhong", + "pan","bie","jie","jie","pao|bao","li","shan","bie","chan","jing", + "gua","geng","dao","chuang","kui","ku","duo","er","zhi","shua", + "quan|xuan","cha|sha","ci","ke","jie","gui","ci","gui","kai","duo", + "ji","ti","jing","dou","luo","ze","yuan","cuo","xiao|xue","kei|ke", + "la","qian","cha|sha","chuang","gua","jian","cuo","li","ti","fei", + "pou","chan","qi","chuang","zi","gang","wan","bao|bo","ji","duo", + "qing","yan|shan","du|zhuo","jian","ji","bao|bo","yan","ju","huo","sheng", + "jian","duo","zhi|duan","wu","gua","fu|pi","sheng","jian","ge","da|zha", + "kai","chuang","chuan","chan","tuan|zhuan","lu|jiu","li","peng","shan","piao", + "kou","jiao|chao","gua","qiao","jue","hua","zha","zhuo","lian","ju", + "pi","liu","gui","jiao|chao","gui","jian","jian","tang","huo","ji", + "jian","yi","jian","zhi","chan","zuan","mo","li","zhu","li", + "ya","quan","ban","gong","jia","wu","mai","lie","jin|jing","keng", + "xie|lie","zhi","dong","zhu|chu","nu","jie","qu","shao","yi","zhu", + "miao","li","jin|jing","lao","lao","juan","kou","yang","wa","xiao", + "mou","kuang","jie","lie","he","shi","ke","jin|jing","gao","bo|bei", + "min","chi","lang","yong","yong","mian","ke","xun","juan","qing", + "lu","bu","meng","chi","le|lei","kai","mian","dong","xu","xu", + "kan","wu","yi","xun","weng|yang","sheng","lao","mu","lu","piao", + "shi","ji","qin","jiang","jiao|chao","quan","xiang","yi","qiao","fan", + "juan","tong|dong","ju","dan","xie","mai","xun","xun","lv","li", + "che","rang|xiang","quan","bao","shao","yun","jiu","bao","gou","wu", + "yun","mo","xiong","gai","gai","bao","cong","yi","xiong","peng", + "ju","tao|yao","ge","pu","e","pao","fu","gong","da","jiu", + "gong","bi","hua","bei","nao","chi|shi","fang","jiu","yi","za", + "jiang","kang","jiang","kuang","hu","xia","qu","fan","gui","qie", + "zang|cang","kuang","fei","hu","yu","gui","kui|gui","hui","dan","kui|gui", + "lian","lian","suan","du","jiu","jue","xi","pi","qu|ou","yi", + "ke|qia","yan","bian","ni","qu|ou","shi","xun","qian","nian","sa", + "zu","sheng","wu","hui","ban","shi","xi","wan","hua","xie", + "wan","bei","zu|cu","zhuo","xie","dan|shan|chan","mai","nan|na","dan","ji", + "bo","shuai|lv","bu|bo","guan|kuang","bian","bu","zhan","qia|ka","lu","you", + "lu","xi","gua","wo","xie","jie","jie","wei","yang|ang","qiong", + "zhi","mao","yin","wei","shao","ji","que","luan","chi","juan", + "xie","xu","jin","que","wu","ji","e","qing","xi","san", + "chang|an|han","wei","e","ting","li","zhe|zhai","han|an","li","ya","ya", + "yan","she","di","zha|zhai","pang","ya","qie","ya","zhi|shi","ce", + "mang","ti","li","she","hou","ting","zui","cuo","fei","yuan", + "ce","yuan","xiang","yan","li","jue","sha|xia","dian","chu","jiu", + "jin","ao","gui","yan","si","li","chang","qian|lan","li","yan", + "yan","yuan","si|mou","gong|hong","lin|miao","rou|qiu","qu","qu","ke","lei", + "du","xian|xuan","zhuan","san","can|shen|cen|san","can|shen|cen|san","can|shen|cen|san","can|shen|cen|san","ai|yi","dai", + "you","cha","ji","you","shuang","fan","shou","guai","ba","fa", + "ruo","li","shu","zhuo|yi|li|jue","qu","shou","bian","xu","jia","pan", + "sou","ji","wei|yu","sou","die","rui","cong","kou","gu","ju|gou", + "ling","gua","tao|dao","kou","zhi","jiao","zhao|shao","ba","ding","ke", + "tai","chi","shi","you","qiu","po","ye|xie","hao","si","tan", + "chi","le","diao","ji","dug","hong","mie","xu|yu","mang","chi", + "ge","xuan|song","yao","zi","he|ge","ji","diao","dou|cun","tong","ming", + "hou","li","tu","xiang","zha","xia|he","ye","lv","a","ma|mB", + "ou","huo","yi","jun","chou","lin","tun","yin","fei","pi|bi", + "qin","qin","jie|ge","bu","fou|pi","ba","dun","fen","e|hua","han", + "ting","hang|keng","shun","qi","hong","zhi|zi","yin|shen","wu","wu","chao", + "na|ne","xue|chuo|jue","xi","chui","dou|ru","wen","hou","hou|hong|ou","wu|yu","gao", + "ya|yB","jun","lv","e","ge","wen","dai","qi","cheng","wu", + "gao","fu","jiao","hong","chi","sheng","na|ne","tun|tian","fu|?","yi", + "dai","ou","li","bei|bai","yuan|yun","wai|he|wo|wa|gua|guo","hua|qi","qiang","wu","e", + "shi","juan","pen","wen|min","ne","mou|m","ling","ran","you","di", + "zhou","shi","zhou","tie|che","xi","yi","qi|zhi","ping","zi|ci","gua|gu", + "zi|ci","wei","xu|hou|gou","he|a|ke","nao","xia","pei","yi","xiao|hao","shen", + "hu","ming","da|dan","qu","ju|zui","xian|gan","za","tuo","duo","pou", + "pao","bi","fu","yang","he","zha|za","he|huo|hu","hai","jiu","yong", + "fu","da","zhou","wa","ka","gu","ka|ga","zuo","bu","long", + "dong","ning","tuo","si","xian","huo","qi","er","e","guang", + "zha","die|xi","yi","lie","zi","mie","mi","zhi","yao","ji|xi|qia", + "zhou","ka|luo|lo|ge","shu|xun","zan|za|zBn","xiao","ke|hai","hui","kua","huai|shi","tao", + "xian","e|an","xuan","xiu","wai|he|wo|wa|gua|guo","yan|ye","lao","yi","ai","pin", + "shen","tong","hong","xiong","duo","wa|wB","ha","zai","you","die|di", + "pai","xiang","ai","gen|hen","kuang","ya","da","xiao","bi","yue|hui", + "nian","hua","xing","kuai","duo","po","ji|jie|zhai","nong","mou","yo", + "hao","yuan|yun","long","pou","mang","ge","o","chi","shao","li", + "na|nei|nB|ne","zu","he","ku","xiao","xian","lao","po|ba|bo","zhe","zha", + "liang|lang","ba","mie","lie|lv","sui","fu","bu","han","heng|hng","geng", + "chuo|yue","ge|jia","you","yan","gu","gu","bei|bai","han","suo","chun", + "yi","ai","jia|qian","tu","dan|xian|yan","wan","li","xi","tang","zuo", + "qiu","che","wu","zao","ya","dou","qi","di","qin","ma", + "ma","gong|hong","dou","ge","lao","liang","suo","zao","huan","leng", + "sha|shB","ji","zu","wo|wei","feng","jin|yin","hu|xia","qi","shou","wei", + "shua","chang","er|wa","li","qiang","an","jie|ze|zuo","yo","nian","yu", + "tian","lai","sha","xi","tuo","hu","ai","zhou|zhao|tiao","gou","ken", + "zhuo","zhuo|zhao","shang","di","heng","lan|lin","a","cai","qiang","zhun|tun|xiang|dui", + "wu","wen","cui|qi","sha|jie|die|ti","gu","qi","qi","tao","dan","dan", + "yue|wa","zi|ci","bi|tu","cui","chuo|chuai","he","ya","qi","zhe","fei", + "liang","xian","pi","sha","lB|la","ze","qing|ying","gua","pa","ze|shi", + "se","zhuan","nie","guo","luo","yan","di","quan","tan|chan|tuo","bo", + "ding","lang","xiao","ju","tang","chi","ti","an","jiu","dan", + "ka","yong","wei","nan","shan","yu","zhe","la","jie","hou", + "han","die|zha","zhou","chai","wai","nuo|re","huo|guo|xu","yin","zan|za|zBn","yao", + "o|wo","mian","hu","yun","chuan","hui","huan","huan|yuan|xuan|he","xi","he|ye", + "ji","kui","zhong|chuang","wei","sha","xu","huang","duo|zha","yan","xuan", + "liang","yu","sang","chi","qiao|jiao","yan","dan|shan|chan","pen|ben","can|sun|qi","li", + "yo","zha|cha","wei","miao","ying","pen","pbo","kui","xi","yu", + "jie","lou","ku","zao|qiao","hu","ti","yao","he|xiao|hu","sha|a","xiu", + "qiang","se","yong","su","gong|hong","xie","yi|ai","suo","ma|mB","cha", + "hai","ke","ta|da","sang","chen","ru","sou","wa|gu","ji","beng|pang", + "wu","xian|qian|qie","shi","ge","zi","jie","lao","weng","wa","si", + "chi","hao","suo","jia","hai|hei","suo","qin","nie","he","zi", + "sai","ng","ge","na","dia","ai","qiang","tong","bi","ao", + "ao","lian","zui|sui","zhe|zhu","mo","sou","sou","tan","di","qi", + "jiao","chong","jiao|dao","kai|ge","tan","shan|can","cao","jia","ai","xiao", + "piao","lou","ga","gu","xiao|jiao","hu","hui","guo","ou","xian", + "ze","chang","xu|shi","po","de|dei","ma","ma","hu","le","du", + "ga","tang","ye","beng","ying","sai","jiao","mi","xiao","hua", + "mai","ran","zuo","peng","lao","xiao","ji","zhu","chao|zhao","kui", + "zui","xiao","si","hao","fu|?","liao","qiao","xi","chu|xu|shou","tan|chan", + "dan|tan","hei|mo","xun","e","zun","fan|bo","chi","hui","zan","chuang", + "cu|za|he","dan","jue","tun|kuo","ceng","jiao","ye","xi","qi","hao", + "lian","xu|shi","deng","hui","yin","pu","jue","qin","xun","nie", + "lu","si","yan","ying","da","zhan","o","zhou|zhuo","jin","nong", + "yue|hui","xie","qi","e","zao","yi","shi","jiao|qiao|chi","yuan","ai", + "yong","jue|xue","kuai","yu","pen","dao","ga","xin|hen","dun","dang", + "xin","sai","pi","pi","yin","zui","ning","di","lan","ta", + "huo|o","ru","hao","he|xia","yan","duo","xiu|pi","zhou|chou","ji|jie|zhai","jin", + "hao","ti","chang","xun","me","ca|cha","ti","lu","hui","bo|pao|bao", + "you","nie","yin","hu","mei|me|mo","hong","zhe","li","liu","xie|hai", + "nang","xiao","mo","yan","li","lu","long","po","dan","chen", + "pin","pi","xiang","huo","me","xi","duo","ku","yan","chan", + "ying","rang","dian","la","ta","xiao","jiao|jue","chuo","huan","huo", + "zhuan","nie","xiao","ca","li","chan","chai","li","yi","luo", + "nang","za|zan|can","su","xi","zeng","jian","yan|za|nie","zhu","lan","nie", + "nang","ramo","luo","wei|guo","hui","yin","qiu","si","nin","jian|nan", + "hui","xin","yin","nan","tuan","tuan","dun|tun","kang","yuan","jiong", + "pian","yun","cong","hu","hui","yuan","e","guo","kun","cong", + "wei|tong","tu","wei","lun","guo","qun","ri","ling","gu","guo", + "tai","guo","tu","you","guo","yin","hun","pu","yu","han", + "yuan","lun","quan|juan","yu","qing","guo","chuan|chui","wei","yuan","quan|juan", + "ku","pu","yuan","yuan","ya","tuan","tu","tu","tuan","lve", + "hui","yi","huan|yuan","luan","luan","tu","ya","tu","ting","sheng", + "pu","lu","kuai","ya","zai","wei|xu","ge","yu|zhun","wu","gui", + "pi","yi","di|de","qian|su","qian","zhen","zhuo","dang","qia","xia", + "shan","kuang","chang","qi|yin","nie","mo","ji","jia","zhi","zhi", + "ban","xun","yi","qin","mei|fen","jun","rong|keng","tun|dun","fang","ben|fen", + "ben","tan","kan","huai|pei|pi","zuo","keng","bi","jing","di|lan","jing", + "ji","kuai","di","jing","jian","tan","li","ba","wu","fen", + "zhui","po","pan|ban","tang","kun","qu","tan","zhi","tuo","gan", + "ping","dian","gua","ni","tai","pi","jiong","yang","fo","ao", + "lu","qiu","mu","ke","gou","xue","fa","di|chi","che","ling", + "zhu","fu","hu","zhi","chui","la","long","long","lu","ao", + "dai","pao","min","xing","dong|tong","ji","he","lv","ci","chi", + "lei","gai","yin","hou","dui","zhao","fu","guang","yao","duo", + "duo","gui","cha","yang","yin","fa","gou","yuan","die","xie", + "ken","shang","shou","e","bing","dian","hong","ya","kua","da", + "ka","dang","kai","hang","nao","an","xing","xian","yuan|huan","bang", + "pou|fu","ba","yi","yin","han","xu","chui","cen","geng","ai", + "beng|feng","di|fang","que|jue","yong","jun","xia|jia","di","mai|man","lang","juan", + "cheng","yan|shan","qin|jin","zhe","lie","lie","pu|bu","cheng","hua","bu", + "shi","xun","guo","jiong","ye","nian","di","yu","bu","ya", + "quan","sui|su","pi","qing|zheng","wan","ju","lun","zheng|cheng","kong","chong|shang", + "dong","dai","tan","an","cai","chu|tou","beng","xian|kan","zhi","duo", + "yi|shi","zhi","yi","pei","ji","zhun","qi","sao","ju","ni", + "ku","ke","tang","kun","ni","jian","dui","jin","gang","yu", + "e","peng|beng","gu","tu","leng","fang","ya","qian|zan|jian","kun","an", + "shen","duo|hui","nao","tu","cheng","yin","huan","bi","lian","guo", + "die","zhuan","hou","bao|bu|pu","bao","yu","di","mao|mou|wu","jie","ruan", + "e|ai|ye","geng","kan","zong","yu","huang","e","yao","yan","bao", + "ji","mei","chang","du","tuo","yin","feng","zhong","jie","jin", + "feng","gang","chuan","jian","ping","lei","jiang","huang","leng","duan", + "wan","xuan","xi","ji","kuai","ying","ta","cheng","yong","kai", + "su","su","shi","mi","ta","weng","cheng","tu","tang","que", + "zhong","li","peng","bang","sai|se","zang","dui","tian","wu","zheng", + "xun","ge","zhen","ai","gong","yan","xian","tian|zhen","yuan","wen", + "xie","liu","hai","lang","chang","peng","beng","chen","lu","lu", + "ou|qiu","qian|zan|jian","mei","mo","zhuan|tuan","shuang","shu","lou","chi","man", + "biao","jing","qi","shu","zhi|di","zhang","kan","yong","dian","chen", + "zhi|zhuo","xi","guo","qiang","jin","shang","shang","mu","cui","yan", + "ta","zeng","qian","qiang","liang","wei","zhui","qiao","zeng","xu", + "shan","shan","fa","pu","kuai|tui","tuan|dong","fan","qiao|que","mo","dun", + "dun","zun|dun","di","sheng","duo|hui","duo","tan","deng","wu","fen", + "huang","tan","da","ye","zhu","jian","ao","qiang","ji","qiao|ao", + "ken","yi|tu","pi","bi","dian","jiang","ye","yong","xue|bo|jue","tan", + "lan","ju","huai","dang","rang","qian","xun","xian|lan","xi","he", + "ai","ya","dao","hao","ruan","jin","lei","kuang","lu","yan", + "tan","wei","huai","long","long","rui","li","lin","rang","chan", + "xun","yan","lei","ba","wan","shi","ren","san","zhuang","zhuang", + "sheng","yi","mai","ke|qiao","zhu","zhuang","hu","hu","kun","yi", + "hu","xu","kun","shou","mang","dun","shou","yi","zhi|zhong","gu|ying", + "chu","jiang|xiang","feng|pang","bei","zhai","bian","sui","qun","ling","fu", + "cuo","xia","xiong|xuan","xie","nao","xia","kui","xi","wai","yuan|wan", + "mao|wan","su","duo","duo","ye","qing","yi","gou","gou","qi", + "meng","meng","yin","huo","chen","da|dai","ce","tian","tai","fu", + "guai","yao","yang","hang|ben","gao","shi","tao|ben","tai","tou","yan|tao", + "bi","yi","kua","jia|ga|xia","duo","hua","kuang","yun","jia|ga|xia","ba", + "en","lian","huan","di|ti","yan","pao","juan","qi|ji","nai","feng", + "xie","fen","dian","quan|juan","kui","zou","huan","qi|qie|xie","kai","she|chi|zha", + "ben","yi","jiang","tao","zang|zhuang","ben","xi","huang","fei","diao", + "xun|zhui","beng","dian","ao","she","weng","po|ha|tai","ao|yu","wu","ao|yu", + "jiang","lian","duo","yun","jiang","shi","fen","huo","bi","luan", + "duo|che","nv","nu","ding|tian","nai","qian","jian","ta|jie","jiu","nuan", + "cha","hao","xian","fan","ji","shuo","ru","fei|pei","wang","hong", + "zhuang","fu","ma","dan","ren","fu|you","jing","yan","hai|jie","wen", + "zhong","pa","du","ji","keng|hang","zhong","yao","jin","yun","miao", + "fou|pei|pi","chi","yue|jue","zhuang","niu","yan","na|nan","xin","fen","bi", + "yu","tuo","feng","wan|yuan","fang","wu","yu","gui","du","ba", + "ni","zhou","zhuo","zhao","da","ni|nai","yuan","tou","xian|xuan|xu","zhi|yi", + "e","mei","mo","qi","bi","shen","qie","e","he","xu", + "fa","zheng","min","ban","mu","fu","ling","zi","zi","shi", + "ran","shan","yang","gan","jie","gu","si","xing","wei","zi", + "ju","shan","pin","ren","yao","dong","jiang","shu","ji","gai", + "xiang","hua|huo","juan","jiao|xiao","gou|du","mu|lao","jian","jian","yi","nian", + "zhi","zhen","ji","xian","heng","guang","jun|xun","kua|hu","yan","ming", + "lie","pei","e","you","yan","cha","shen|xian","yin","shi","gui", + "quan","zi","song","wei","hong","wa","lou","ya","rao","jiao", + "luan","ping","xian","shao","li","cheng|sheng","xie","mang","fu","suo", + "wu|mu","wei","ke","chuo|lai","chuo","ting","niang","xing","nan","yu", + "na|nuo","pou|bi","nei|sui","juan","shen","zhi","han","di","zhuang","e", + "pin","tui","man","mian","wu|yu","yan","wu","xi|ai","yan","yu", + "si","yu","wa","li","xian","ju","qu","zhui|shui","qi","xian", + "zhuo","dong","chang","lu","ai|e","e","e","lou","mian","cong", + "pou|pei|bu","ju","po","cai","ling","wan","biao","xiao","shu","qi", + "hui","fu|fan","wo","wo","tan","fei","fei","jie","tian","ni", + "quan|juan","jing","hun","jing","qian|jin","dian","xing","hu","wan|wa","lai", + "bi","yin","zhou|chou","chuo|nao","fu","jing","lun","an|n= CHINESE_COUNT , CONTACTS_ERROR_INVALID_PARAMETER, "src is invalid"); + + len = strlen(pinyin_spell_table[offset]); + + for(i=0, j=0; i<=len; i++) { + if (pinyin_spell_table[offset][i]== DUOYINZI_SEPERATOR + || pinyin_spell_table[offset][i] == '\0') { + strncpy(spell[count], pinyin_spell_table[offset]+j, i-j); + j=i+1; + count++; + } + } + + return count; +} + +static inline bool __ctsvc_is_chinese(const UChar *src) +{ + if (CHINESE_UNICODE_START <= *src && *src <= CHINESE_UNICODE_END) + return true; + + return false; +} + +static inline bool +__ctsvc_has_chinese(const UChar *src) +{ + int i, len; + + len = u_strlen(src); + + for (i = 0; i < len; i++) + { + if (__ctsvc_is_chinese(&src[i])) + return true; + } + + return false; +} + +#define array_sizeof(a) (sizeof(a) / sizeof(a[0])) + +bool ctsvc_has_chinese(const char *src) +{ + UChar temp[strlen(src)+1]; + UErrorCode status = 0; + + RETVM_IF(src==NULL, CONTACTS_ERROR_SYSTEM, "src is NULL"); + RETVM_IF(!*src, CONTACTS_ERROR_SYSTEM, "*src is NULL"); + + u_strFromUTF8(temp, array_sizeof(temp), NULL, src, -1, &status); + if (U_FAILURE(status)){ + CTS_ERR("u_strFromUTF8 Failed(%s)", u_errorName(status)); + return false; + } + + return __ctsvc_has_chinese(temp); +} + +int ctsvc_convert_chinese_to_pinyin(const char *src, pinyin_name_s **name, int *size) +{ + char spell[CHINESE_PINYIN_MAX_LEN][CHINESE_DUOYINZI_MAX_COUNT][CHINESE_PINYIN_SPELL_MAX_LEN] + = {NULL}; + int pinyin_spell_count[CHINESE_PINYIN_MAX_LEN] = {0};; + UChar temp_result[strlen(src)+1]; + int count = 0, len=0, total_count=0; + int ret, i, j; + UErrorCode status = 0; + pinyin_name_s *temp_name = NULL; + + RETVM_IF(src==NULL, CONTACTS_ERROR_SYSTEM, "src is NULL"); + RETVM_IF(!*src, CONTACTS_ERROR_SYSTEM, "*src is NULL"); + + u_strFromUTF8(temp_result, array_sizeof(temp_result), NULL, src, -1, &status); + if (U_FAILURE(status)){ + CTS_ERR("u_strFromUTF8 Failed(%s)", u_errorName(status)); + return CONTACTS_ERROR_SYSTEM; + } + + len = u_strlen(temp_result); + for (count = 0; count < len && count < CHINESE_PINYIN_MAX_LEN; count++) + { + if (__ctsvc_is_chinese(&temp_result[count])) { + ret = __ctsvc_get_pinyinspell(temp_result[count], spell[count]); + + RETVM_IF(ret < CONTACTS_ERROR_NONE, CONTACTS_ERROR_SYSTEM, "__ctsvc_get_pinyinspell() Failed(%d)", ret); + pinyin_spell_count[count] = ret; + + if(total_count==0) + total_count = ret; + else + total_count *= ret; + } + else { + UChar temp[2]; + int size; + + temp[0] = temp_result[count]; + temp[1] = 0x00; + u_strToUTF8(spell[count][0], 10, &size, temp, -1, &status); + RETVM_IF(U_FAILURE(status), CONTACTS_ERROR_SYSTEM, "u_strToUTF8() Failed(%s)", u_errorName(status)); + spell[count][0][size]='\0'; + pinyin_spell_count[count] = 1; + } + } + + *size = total_count; + temp_name = calloc(total_count, sizeof(pinyin_name_s)); + RETVM_IF(temp_name==NULL, CONTACTS_ERROR_OUT_OF_MEMORY,"calloc Failed(%s)"); + + int repeat = 1; + int name_len[total_count]; + int initial_len[total_count]; + for(i=0; i < count ; i++) { + for(j=0;jpinyin_name %s", j, temp_name[j].pinyin_name); +// DBG("temp_name[%d]->pinyin_initial %s", j, temp_name[j].pinyin_initial); +// } + + *name = temp_name; + + return CONTACTS_ERROR_NONE; +} + diff --git a/helper/normalize.h b/common/ctsvc_localize_ch.h similarity index 57% rename from helper/normalize.h rename to common/ctsvc_localize_ch.h index 666c11f..33396e4 100755 --- a/helper/normalize.h +++ b/common/ctsvc_localize_ch.h @@ -3,9 +3,6 @@ * * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. * - * Contact: Youngjae Shin - * Donghee Ye - * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -19,14 +16,19 @@ * limitations under the License. * */ -#ifndef __CTS_HELPER_NORMALIZE_H__ -#define __CTS_HELPER_NORMALIZE_H__ +#ifndef __TIZEN_SOCIAL_CTSVC_LOCALIZE_CH_H__ +#define __TIZEN_SOCIAL_CTSVC_LOCALIZE_CH_H__ + +#define CHINESE_PINYIN_SPELL_MAX_LEN 15 +#define CHINESE_PINYIN_MAX_LEN 3 -#include "cts-normalize.h" +typedef struct { + char pinyin_initial[CHINESE_PINYIN_MAX_LEN+1]; + char pinyin_name[CHINESE_PINYIN_SPELL_MAX_LEN*(CHINESE_PINYIN_MAX_LEN+1)]; +} pinyin_name_s; -int helper_normalize_str(const char *src, char *dest, int dest_size); -int helper_collation_str(const char *src, char *dest, int dest_size); -int helper_unicode_to_utf8(char *src, int src_len, char *dest, int dest_size); +int ctsvc_convert_chinese_to_pinyin(const char *src, pinyin_name_s **name, int *size); -#endif // __CTS_HELPER_NORMALIZE_H__ +bool ctsvc_has_chinese(const char *src); +#endif // __TIZEN_SOCIAL_CTSVC_LOCALIZE_CH_H__ diff --git a/src/cts-pthread.c b/common/ctsvc_mutex.c similarity index 56% rename from src/cts-pthread.c rename to common/ctsvc_mutex.c index 14a073c..bf7d8fd 100755 --- a/src/cts-pthread.c +++ b/common/ctsvc_mutex.c @@ -20,15 +20,16 @@ */ #include -#include "cts-internal.h" -#include "cts-pthread.h" +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_mutex.h" typedef struct { int (* lock) (pthread_mutex_t *mutex); int (* unlock) (pthread_mutex_t *mutex); -}cts_thread_fns; +}cts_mutex_fns; -static cts_thread_fns cts_thread_funtions = +static cts_mutex_fns cts_mutex_funtions = { pthread_mutex_lock, pthread_mutex_unlock @@ -36,8 +37,11 @@ static cts_thread_fns cts_thread_funtions = static pthread_mutex_t conn_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t sockfd_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t trans_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t ipc_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t ipc_pubsub_mutex = PTHREAD_MUTEX_INITIALIZER; -static inline pthread_mutex_t* cts_pthread_get_mutex(int type) +static inline pthread_mutex_t* cts_mutex_get_mutex(int type) { pthread_mutex_t *ret_val; @@ -48,41 +52,46 @@ static inline pthread_mutex_t* cts_pthread_get_mutex(int type) case CTS_MUTEX_SOCKET_FD: ret_val = &sockfd_mutex; break; + case CTS_MUTEX_TRANSACTION: + ret_val = &trans_mutex; + break; + case CTS_MUTEX_PIMS_IPC_CALL: + ret_val = &ipc_mutex; + break; + case CTS_MUTEX_PIMS_IPC_PUBSUB: + ret_val = &ipc_pubsub_mutex; + break; default: - ERR("unknown type(%d)", type); + CTS_ERR("unknown type(%d)", type); ret_val = NULL; + break; } return ret_val; } -void cts_mutex_lock(int type) +void ctsvc_mutex_lock(int type) { int ret; pthread_mutex_t *mutex; - mutex = cts_pthread_get_mutex(type); + mutex = cts_mutex_get_mutex(type); - if (cts_thread_funtions.lock) { - ret = cts_thread_funtions.lock(mutex); - warn_if(ret, "pthread_mutex_lock Failed(%d)", ret); + if (cts_mutex_funtions.lock) { + ret = cts_mutex_funtions.lock(mutex); + WARN_IF(ret, "mutex_lock Failed(%d)", ret); } } -void cts_mutex_unlock(int type) +void ctsvc_mutex_unlock(int type) { int ret; pthread_mutex_t *mutex; - mutex = cts_pthread_get_mutex(type); + mutex = cts_mutex_get_mutex(type); - if (cts_thread_funtions.unlock) { - ret = cts_thread_funtions.unlock(mutex); - warn_if(ret, "pthread_mutex_unlock Failed(%d)", ret); + if (cts_mutex_funtions.unlock) { + ret = cts_mutex_funtions.unlock(mutex); + WARN_IF(ret, "mutex_unlock Failed(%d)", ret); } } -void contacts_svc_thread_init(void) -{ - cts_thread_funtions.lock = pthread_mutex_lock; - cts_thread_funtions.unlock = pthread_mutex_unlock; -} diff --git a/src/cts-pthread.h b/common/ctsvc_mutex.h similarity index 78% rename from src/cts-pthread.h rename to common/ctsvc_mutex.h index 16a5132..21de5df 100755 --- a/src/cts-pthread.h +++ b/common/ctsvc_mutex.h @@ -18,18 +18,20 @@ * limitations under the License. * */ -#ifndef __CTS_PTHREAD_H__ -#define __CTS_PTHREAD_H__ +#ifndef __CTSVC_MUTEX_H__ +#define __CTSVC_MUTEX_H__ enum { CTS_MUTEX_CONNECTION, CTS_MUTEX_UPDTATED_LIST_MEMPOOL, CTS_MUTEX_SOCKET_FD, + CTS_MUTEX_TRANSACTION, + CTS_MUTEX_PIMS_IPC_CALL, + CTS_MUTEX_PIMS_IPC_PUBSUB, }; -void cts_mutex_lock(int type); -void cts_mutex_unlock(int type); +void ctsvc_mutex_lock(int type); +void ctsvc_mutex_unlock(int type); -#endif //__CTS_PTHREAD_H__ - +#endif //__CTSVC_MUTEX_H__ diff --git a/common/ctsvc_normalize.c b/common/ctsvc_normalize.c new file mode 100644 index 0000000..1f3d4f4 --- /dev/null +++ b/common/ctsvc_normalize.c @@ -0,0 +1,806 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_normalize.h" +#include "ctsvc_localize.h" + +#define CTSVC_NORMALIZED_NUMBER_SIZE_MAX 7 +#define CTSVC_NORMALIZED_MAX_LEN 1024 + + + +static inline bool __ctsvc_check_dirty_number(char digit) +{ + switch (digit) + { + case '0' ... '9': + case 'p': + case 'w': + case 'P': + case 'W': + case '#': + case '*': + case '(': + case '/': + case ')': + case 'N': + case ',': + case '.': + case ';': + return false; + case '+': //only first position + default: + return true; + } +} + +int ctsvc_clean_number(const char *src, char *dest, int dest_size) +{ + int s_pos=0, d_pos=0, char_type; + + if (NULL == src) + CTS_ERR("The parameter(src) is NULL"); + else { + if ('+' == src[s_pos]) + dest[d_pos++] = src[s_pos++]; + + while (src[s_pos] != 0) + { + if (d_pos >= dest_size-2) break; + char_type = ctsvc_check_utf8(src[s_pos]); + if (char_type <= 1) { + if (__ctsvc_check_dirty_number(src[s_pos])) { + s_pos++; + continue; + } + dest[d_pos++] = src[s_pos++]; + } + else + s_pos += char_type; + } + } + + dest[d_pos] = 0; + return d_pos; +} + +static inline const char* __ctsvc_clean_country_code(const char *src) +{ + int ret = 1; + switch (src[ret++]-'0') + { + case 1: + case 7: + break; + case 2: + switch (src[ret++]-'0') + { + case 0: + case 7: + break; + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 8: + case 9: + ret += 1; + break; + default: + CTS_ERR("The parameter(src:%s) has invalid character set", src); + } + break; + case 3: + switch (src[ret++]-'0') + { + case 0: + case 1: + case 2: + case 3: + case 4: + case 6: + case 9: + break; + case 5: + case 7: + case 8: + ret += 1; + break; + default: + CTS_ERR("The parameter(src:%s) has invalid character set", src); + } + break; + case 4: + switch (src[ret++]-'0') + { + case 0: + case 1: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + break; + case 2: + ret += 1; + break; + default: + CTS_ERR("The parameter(src:%s) has invalid character set", src); + } + break; + case 5: + switch (src[ret++]-'0') + { + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + break; + case 0: + case 9: + ret += 1; + break; + default: + CTS_ERR("The parameter(src:%s) has invalid character set", src); + } + break; + case 6: + switch (src[ret++]-'0') + { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + break; + case 7: + case 8: + case 9: + ret += 1; + break; + default: + CTS_ERR("The parameter(src:%s) has invalid character set", src); + } + break; + case 8: + switch (src[ret++]-'0') + { + case 1: + case 2: + case 4: + case 6: + break; + case 0: + case 3: + case 5: + case 7: + case 8: + case 9: + ret += 1; + break; + default: + CTS_ERR("The parameter(src:%s) has invalid character set", src); + } + break; + case 9: + switch (src[ret++]-'0') + { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 8: + break; + case 6: + case 7: + case 9: + ret += 1; + break; + default: + CTS_ERR("The parameter(src:%s) has invalid character set", src); + } + break; + case 0: + default: + CTS_ERR("The parameter(src:%s) has invalid character set", src); + return src; + } + + return &src[ret]; +} + +int ctsvc_normalize_number(const char *src, char *dest, int dest_size) +{ + int i; + int len; + int d_pos = 0; + const char *temp_number; + + if ('+' == src[0]) + temp_number = __ctsvc_clean_country_code(src); + else if ('0' == src[0]) + temp_number = src+1; + else + temp_number = src; + + len = strlen(temp_number); + + if (0 < len) { + while(0 <= (len-d_pos-1) && temp_number[len-d_pos-1] + && d_pos < CTSVC_NORMALIZED_NUMBER_SIZE_MAX) { + if (dest_size-d_pos == 0) { + CTS_ERR("Destination string buffer is not enough(%s)", src); + return CONTACTS_ERROR_INTERNAL; + } + + dest[d_pos] = temp_number[len-d_pos-1]; + d_pos++; + } + dest[d_pos] = 0; + + len = strlen(dest); + for(i=0; idisplay); + snprintf(middle, len+1, "%s", item_data->display + ret); + printf("%s -> %s, %s, %s", item_data->display, first, middle, item_data->display + ret + len); + } else + printf("str1 doesn't has str2"); + * @endcode + */ +API int contacts_normalized_strstr(const char *haystack, + const char *needle, int *len) +{ + int i, j, wind, h_len, n_len; + int first_needle_len; + int equal_index; + int equal_length; + int equal_wind = 0; + bool counted = false; + RETVM_IF(NULL == haystack, -1, "The parameter(haystack) is NULL"); + RETVM_IF(NULL == needle, -1, "The parameter(needle) is NULL"); + CTS_VERBOSE("haystack = %s, needle = %s", haystack, needle); + + h_len = 1; + n_len = 1; + equal_index = 0; + first_needle_len = ctsvc_check_utf8(needle[0]); + for (i=0, j=0;i + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_query.h" +#include "ctsvc_filter.h" + +typedef enum { + QUERY_SORTKEY, + QUERY_PROJECTION, +}query_property_type_e; + +static bool __ctsvc_query_property_check(const property_info_s *properties, + int count, query_property_type_e property_type, unsigned int property_id) +{ + int i; + + for (i=0;iproperty_id) { + if (property_type == QUERY_PROJECTION) { + if (p->property_type == CTSVC_SEARCH_PROPERTY_ALL || p->property_type == CTSVC_SEARCH_PROPERTY_PROJECTION) + return true; + else + return false; + } + else + return true; + } + } + return false; +} + +API int contacts_query_create( const char* view_uri, contacts_query_h* out_query ) +{ + ctsvc_query_s *query; + + RETV_IF(NULL == out_query, CONTACTS_ERROR_INVALID_PARAMETER); + *out_query = NULL; + + RETV_IF(NULL == view_uri || NULL == out_query, CONTACTS_ERROR_INVALID_PARAMETER); + + query = (ctsvc_query_s *)calloc(1, sizeof(ctsvc_query_s)); + query->view_uri = strdup(view_uri); + query->properties = (property_info_s *)ctsvc_view_get_all_property_infos(view_uri, &query->property_count); + *out_query = (contacts_query_h)query; + + return CONTACTS_ERROR_NONE; +} + +API int contacts_query_set_projection(contacts_query_h query, unsigned int property_ids[], int count) +{ + ctsvc_query_s *query_s; + int i; + bool find; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + query_s = (ctsvc_query_s *)query; + + for (i=0;iproperties, query_s->property_count, QUERY_PROJECTION, property_ids[i]); + RETVM_IF(false == find, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is not supported on view_uri(%s)", property_ids[i], query_s->view_uri); + } + if (query_s->projection) + free(query_s->projection); + + query_s->projection = calloc(count, sizeof(unsigned int)); + memcpy(query_s->projection, property_ids, sizeof(unsigned int) * count); + query_s->projection_count = count; + + return CONTACTS_ERROR_NONE; +} + +API int contacts_query_set_filter(contacts_query_h query, contacts_filter_h filter) +{ + ctsvc_query_s *s_query; + contacts_filter_h new_filter; + + RETV_IF(NULL == query || NULL == filter, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ctsvc_filter_clone(filter, &new_filter); + s_query->filter = (ctsvc_composite_filter_s*)new_filter; + + return CONTACTS_ERROR_NONE; +} + +API int contacts_query_set_sort(contacts_query_h query, unsigned int property_id, bool asc) +{ + ctsvc_query_s *query_s; + bool find = false; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + query_s = (ctsvc_query_s *)query; + + find = __ctsvc_query_property_check(query_s->properties, query_s->property_count, QUERY_SORTKEY, property_id); + RETVM_IF(false == find, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is not supported on view_uri(%s)", property_id, query_s->view_uri); + query_s->sort_property_id = property_id; + query_s->sort_asc = asc; + + return CONTACTS_ERROR_NONE; +} + +API int contacts_query_destroy( contacts_query_h query ) +{ + ctsvc_query_s *s_query; + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + if (s_query->filter) + contacts_filter_destroy((contacts_filter_h)s_query->filter); + + free(s_query->projection); + free(s_query->view_uri); + free(s_query); + + return CONTACTS_ERROR_NONE; +} + +API int contacts_query_set_distinct(contacts_query_h query, bool set) +{ + ctsvc_query_s *query_s; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + query_s = (ctsvc_query_s *)query; + query_s->distinct = set; + + return CONTACTS_ERROR_NONE; +} + diff --git a/common/ctsvc_query.h b/common/ctsvc_query.h new file mode 100644 index 0000000..ead18e9 --- /dev/null +++ b/common/ctsvc_query.h @@ -0,0 +1,29 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_QUERY_H__ +#define __TIZEN_SOCIAL_CTSVC_QUERY_H__ + +#endif /* __TIZEN_SOCIAL_CTSVC_QUERY_H__ */ + + diff --git a/common/ctsvc_record.c b/common/ctsvc_record.c new file mode 100644 index 0000000..771b2cb --- /dev/null +++ b/common/ctsvc_record.c @@ -0,0 +1,560 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_record.h" +#include "ctsvc_struct.h" +#include "ctsvc_view.h" + +extern ctsvc_record_plugin_cb_s addressbook_plugin_cbs; +extern ctsvc_record_plugin_cb_s group_plugin_cbs; +extern ctsvc_record_plugin_cb_s person_plugin_cbs; +extern ctsvc_record_plugin_cb_s contact_plugin_cbs; +extern ctsvc_record_plugin_cb_s my_profile_plugin_cbs; +extern ctsvc_record_plugin_cb_s simple_contact_plugin_cbs; +extern ctsvc_record_plugin_cb_s updated_info_plugin_cbs; + +extern ctsvc_record_plugin_cb_s name_plugin_cbs; +extern ctsvc_record_plugin_cb_s number_plugin_cbs; +extern ctsvc_record_plugin_cb_s address_plugin_cbs; +extern ctsvc_record_plugin_cb_s url_plugin_cbs; +extern ctsvc_record_plugin_cb_s event_plugin_cbs; +extern ctsvc_record_plugin_cb_s messenger_plugin_cbs; +extern ctsvc_record_plugin_cb_s activity_plugin_cbs; +extern ctsvc_record_plugin_cb_s activity_photo_plugin_cbs; +extern ctsvc_record_plugin_cb_s relationship_plugin_cbs; +extern ctsvc_record_plugin_cb_s image_plugin_cbs; +extern ctsvc_record_plugin_cb_s group_relation_plugin_cbs; +extern ctsvc_record_plugin_cb_s note_plugin_cbs; +extern ctsvc_record_plugin_cb_s company_plugin_cbs; +extern ctsvc_record_plugin_cb_s profile_plugin_cbs; +extern ctsvc_record_plugin_cb_s nickname_plugin_cbs; +extern ctsvc_record_plugin_cb_s email_plugin_cbs; +extern ctsvc_record_plugin_cb_s result_plugin_cbs; +extern ctsvc_record_plugin_cb_s sdn_plugin_cbs; +extern ctsvc_record_plugin_cb_s speeddial_plugin_cbs; +extern ctsvc_record_plugin_cb_s extension_plugin_cbs; +extern ctsvc_record_plugin_cb_s phonelog_plugin_cbs; + +static const ctsvc_record_plugin_cb_s *__ctsvc_record_get_plugin_cb(int r_type) +{ + switch((int)r_type) { + case CTSVC_RECORD_ADDRESSBOOK: + return &addressbook_plugin_cbs; + case CTSVC_RECORD_GROUP: + return &group_plugin_cbs; + case CTSVC_RECORD_PERSON: + return &person_plugin_cbs; + case CTSVC_RECORD_CONTACT: + return &contact_plugin_cbs; + case CTSVC_RECORD_MY_PROFILE: + return &my_profile_plugin_cbs; + case CTSVC_RECORD_SIMPLE_CONTACT: + return &simple_contact_plugin_cbs; + case CTSVC_RECORD_NAME: + return &name_plugin_cbs; + case CTSVC_RECORD_COMPANY: + return &company_plugin_cbs; + case CTSVC_RECORD_NOTE: + return ¬e_plugin_cbs; + case CTSVC_RECORD_NUMBER: + return &number_plugin_cbs; + case CTSVC_RECORD_EMAIL: + return &email_plugin_cbs; + case CTSVC_RECORD_URL: + return &url_plugin_cbs; + case CTSVC_RECORD_EVENT: + return &event_plugin_cbs; + case CTSVC_RECORD_NICKNAME: + return &nickname_plugin_cbs; + case CTSVC_RECORD_ADDRESS: + return &address_plugin_cbs; + case CTSVC_RECORD_MESSENGER: + return &messenger_plugin_cbs; + case CTSVC_RECORD_GROUP_RELATION: + return &group_relation_plugin_cbs; + case CTSVC_RECORD_ACTIVITY: + return &activity_plugin_cbs; + case CTSVC_RECORD_ACTIVITY_PHOTO: + return &activity_photo_plugin_cbs; + case CTSVC_RECORD_PROFILE: + return &profile_plugin_cbs; + case CTSVC_RECORD_RELATIONSHIP: + return &relationship_plugin_cbs; + case CTSVC_RECORD_IMAGE: + return &image_plugin_cbs; + case CTSVC_RECORD_EXTENSION: + return &extension_plugin_cbs; + case CTSVC_RECORD_PHONELOG: + return &phonelog_plugin_cbs; + case CTSVC_RECORD_SPEEDDIAL: + return &speeddial_plugin_cbs; + case CTSVC_RECORD_SDN: + return &sdn_plugin_cbs; + case CTSVC_RECORD_UPDATED_INFO: + return &updated_info_plugin_cbs; + case CTSVC_RECORD_RESULT: + return &result_plugin_cbs; + default: + return NULL; + } +} + +#define __INVALID_PARAMETER_ERROR_HANDLING() \ + ASSERT_NOT_REACHED("Invalid parameter: Operation restricted."); \ + return CONTACTS_ERROR_INVALID_PARAMETER; + +static inline bool __ctsvc_record_check_property_flag(const ctsvc_record_s* s_record, unsigned int property_id, contacts_property_flag_e flag) +{ + int index = property_id & 0x000000FF; + + if ( s_record->properties_flags == NULL) + return true; + + return ( s_record->properties_flags[index] & flag) ? true : false; +} + +static inline contacts_property_flag_e __ctsvc_record_get_property_flag(const ctsvc_record_s* s_record, unsigned int index) +{ + return s_record->properties_flags[index] & 0x0000000F; +} + +static inline void __ctsvc_record_set_property_flag(ctsvc_record_s* _record, unsigned int index, contacts_property_flag_e flag) +{ + _record->properties_flags[index] |= flag; +} + +#define __CHECK_READ_ONLY_PROPERTY() \ + if( CTSVC_READ_ONLY_CHECK(property_id, CTSVC_READ_ONLY_PROPERTY) ) \ + { \ + ASSERT_NOT_REACHED("Invalid parameter: Don't try to change read-only property.(0x%0x)", property_id); \ + return CONTACTS_ERROR_INVALID_PARAMETER; \ + } + +#define __CHECK_PROJECTED_PROPERTY() \ + if( __ctsvc_record_check_property_flag( s_record, property_id, CTSVC_PROPERTY_FLAG_PROJECTION ) ) \ + { \ + CTS_ERR("Invalid parameter: Don't try to get un-projected property(0x%0x).", property_id); \ + return CONTACTS_ERROR_INVALID_PARAMETER; \ + } + +// Record constuct/destruct +API int contacts_record_create( const char* view_uri, contacts_record_h* out_record ) +{ + int ret; + ctsvc_record_type_e r_type; + const ctsvc_record_plugin_cb_s *plugin_cb; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + r_type = ctsvc_view_get_record_type(view_uri); + RETVM_IF (CTSVC_RECORD_INVALID == r_type, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : view_uri(%s)", view_uri); + + plugin_cb = __ctsvc_record_get_plugin_cb(r_type); + if (plugin_cb && plugin_cb->create) { + ret = plugin_cb->create(out_record); + if( CONTACTS_ERROR_NONE == ret ) { + CTSVC_RECORD_INIT_BASE((ctsvc_record_s*)*out_record, r_type, plugin_cb, ctsvc_view_get_uri(view_uri)); + } + return ret; + } + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +API int contacts_record_destroy( contacts_record_h record, bool delete_child ) +{ + ctsvc_record_s *s_record; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_record = (ctsvc_record_s *)record; + + if (s_record && s_record->plugin_cbs && s_record->plugin_cbs->destroy) + return s_record->plugin_cbs->destroy(record, delete_child); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +API int contacts_record_clone( contacts_record_h record, contacts_record_h* out_record ) +{ + ctsvc_record_s *s_record; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_record = (ctsvc_record_s *)record; + + if (s_record->plugin_cbs && s_record->plugin_cbs->clone) + return s_record->plugin_cbs->clone(record, out_record); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +API int contacts_record_get_uri_p( contacts_record_h record, const char** out_str ) +{ + int ret = CONTACTS_ERROR_NONE; + + ctsvc_record_s *temp = (ctsvc_record_s*)(record); + + RETVM_IF(NULL == record || NULL == out_str, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter"); + + *out_str = (temp->view_uri); + + return ret; +} + +// Record get/set int,str, etc.. +API int contacts_record_get_str( contacts_record_h record, unsigned int property_id, char** out_str ) +{ + ctsvc_record_s *s_record; + + RETV_IF(NULL == out_str, CONTACTS_ERROR_INVALID_PARAMETER); + *out_str = NULL; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_record = (ctsvc_record_s *)record; + +// __CHECK_PROJECTED_PROPERTY(); + + if (s_record->plugin_cbs && s_record->plugin_cbs->get_str) + return s_record->plugin_cbs->get_str(record, property_id, out_str); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +API int contacts_record_get_lli( contacts_record_h record, unsigned int property_id, long long int *value ) +{ + ctsvc_record_s *s_record; + + RETV_IF(NULL == value, CONTACTS_ERROR_INVALID_PARAMETER); + *value = 0; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_record = (ctsvc_record_s *)record; + +// __CHECK_PROJECTED_PROPERTY(); + + if (s_record->plugin_cbs && s_record->plugin_cbs->get_lli) + return s_record->plugin_cbs->get_lli(record, property_id, value); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +API int contacts_record_get_double( contacts_record_h record, unsigned int property_id, double *value ) +{ + ctsvc_record_s *s_record; + + RETV_IF(NULL == value, CONTACTS_ERROR_INVALID_PARAMETER); + *value = 0; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_record = (ctsvc_record_s *)record; + +// __CHECK_PROJECTED_PROPERTY(); + + if (s_record->plugin_cbs && s_record->plugin_cbs->get_double) + return s_record->plugin_cbs->get_double(record, property_id, value); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +API int contacts_record_get_str_p( contacts_record_h record, unsigned int property_id, char** out_str ) +{ + ctsvc_record_s *s_record; + + RETV_IF(NULL == out_str, CONTACTS_ERROR_INVALID_PARAMETER); + *out_str = NULL; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_record = (ctsvc_record_s *)record; + +// __CHECK_PROJECTED_PROPERTY(); + + if (s_record->plugin_cbs && s_record->plugin_cbs->get_str_p) + return s_record->plugin_cbs->get_str_p(record, property_id, out_str ); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +API int contacts_record_get_int( contacts_record_h record, unsigned int property_id, int* out_value ) +{ + ctsvc_record_s *s_record; + + RETV_IF(NULL == out_value, CONTACTS_ERROR_INVALID_PARAMETER); + *out_value = 0; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_record = (ctsvc_record_s *)record; + +// __CHECK_PROJECTED_PROPERTY(); + + if (s_record->plugin_cbs && s_record->plugin_cbs->get_int) + return s_record->plugin_cbs->get_int(record, property_id, out_value); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +API int contacts_record_set_str( contacts_record_h record, unsigned int property_id, const char* value ) +{ + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + + __CHECK_READ_ONLY_PROPERTY(); + + return ctsvc_record_set_str(record, property_id, value); +} + +int ctsvc_record_set_str( contacts_record_h record, unsigned int property_id, const char* value ) +{ + char *str; + ctsvc_record_s *s_record; + + s_record = (ctsvc_record_s *)record; + + if (value && *value) + str = (char *)value; + else + str = NULL; + + if (s_record->plugin_cbs && s_record->plugin_cbs->set_str) + return s_record->plugin_cbs->set_str(record, property_id, str); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +API int contacts_record_get_bool( contacts_record_h record, unsigned int property_id, bool* value ) +{ + ctsvc_record_s *s_record; + + RETV_IF(NULL == value, CONTACTS_ERROR_INVALID_PARAMETER); + *value = false; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_record = (ctsvc_record_s *)record; + +// __CHECK_PROJECTED_PROPERTY(); + + if (s_record->plugin_cbs && s_record->plugin_cbs->get_bool) + return s_record->plugin_cbs->get_bool(record, property_id, value); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +API int contacts_record_set_bool( contacts_record_h record, unsigned int property_id, bool value ) +{ + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + + __CHECK_READ_ONLY_PROPERTY(); + + return ctsvc_record_set_bool(record, property_id, value); +} + +int ctsvc_record_set_bool( contacts_record_h record, unsigned int property_id, bool value ) +{ + ctsvc_record_s *s_record; + s_record = (ctsvc_record_s *)record; + + if (s_record->plugin_cbs && s_record->plugin_cbs->set_bool) + return s_record->plugin_cbs->set_bool(record, property_id, value); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +API int contacts_record_set_int( contacts_record_h record, unsigned int property_id, int value ) +{ + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + + __CHECK_READ_ONLY_PROPERTY(); + + return ctsvc_record_set_int(record, property_id, value); +} + +int ctsvc_record_set_int( contacts_record_h record, unsigned int property_id, int value ) +{ + ctsvc_record_s *s_record; + s_record = (ctsvc_record_s *)record; + + if (s_record->plugin_cbs && s_record->plugin_cbs->set_int) + return s_record->plugin_cbs->set_int(record, property_id, value); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + + +API int contacts_record_set_lli( contacts_record_h record, unsigned int property_id, long long int value ) +{ + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + + __CHECK_READ_ONLY_PROPERTY(); + + return ctsvc_record_set_lli(record, property_id, value); +} + +int ctsvc_record_set_lli( contacts_record_h record, unsigned int property_id, long long int value ) +{ + ctsvc_record_s *s_record; + s_record = (ctsvc_record_s *)record; + + if (s_record->plugin_cbs && s_record->plugin_cbs->set_lli) + return s_record->plugin_cbs->set_lli(record, property_id, value); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +API int contacts_record_set_double( contacts_record_h record, unsigned int property_id, double value ) +{ + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + + __CHECK_READ_ONLY_PROPERTY(); + + return ctsvc_record_set_double(record, property_id, value); +} + +int ctsvc_record_set_double( contacts_record_h record, unsigned int property_id, double value ) +{ + ctsvc_record_s *s_record; + + s_record = (ctsvc_record_s *)record; + + if (s_record->plugin_cbs && s_record->plugin_cbs->set_double) + return s_record->plugin_cbs->set_double(record, property_id, value); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +// Record get/set child records +API int contacts_record_add_child_record( contacts_record_h record, + unsigned int property_id, contacts_record_h child_record ) +{ + ctsvc_record_s *s_record; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_record = (ctsvc_record_s *)record; + + if (s_record->plugin_cbs && s_record->plugin_cbs->add_child_record) + return s_record->plugin_cbs->add_child_record(record, property_id, child_record); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +API int contacts_record_remove_child_record( contacts_record_h record, + unsigned int property_id, contacts_record_h child_record ) +{ + ctsvc_record_s *s_record; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_record = (ctsvc_record_s *)record; + + if (s_record->plugin_cbs && s_record->plugin_cbs->remove_child_record) + return s_record->plugin_cbs->remove_child_record(record, property_id, child_record); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +API int contacts_record_get_child_record_count( contacts_record_h record, + unsigned int property_id, unsigned int *count ) +{ + ctsvc_record_s *s_record; + + RETV_IF(NULL == count, CONTACTS_ERROR_INVALID_PARAMETER); + *count = 0; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_record = (ctsvc_record_s *)record; + + if (s_record->plugin_cbs && s_record->plugin_cbs->get_child_record_count) + return s_record->plugin_cbs->get_child_record_count(record, property_id, count); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +API int contacts_record_get_child_record_at_p( contacts_record_h record, + unsigned int property_id, int index, contacts_record_h* out_record ) +{ + ctsvc_record_s *s_record; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_record = (ctsvc_record_s *)record; + + if (s_record->plugin_cbs && s_record->plugin_cbs->get_child_record_at_p) + return s_record->plugin_cbs->get_child_record_at_p(record, property_id, index, out_record); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + +API int contacts_record_clone_child_record_list( contacts_record_h record, + unsigned int property_id, contacts_list_h* out_list ) +{ + ctsvc_record_s *s_record; + + RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER); + *out_list = NULL; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_record = (ctsvc_record_s *)record; + + if (s_record->plugin_cbs && s_record->plugin_cbs->clone_child_record_list) + return s_record->plugin_cbs->clone_child_record_list(record, property_id, out_list); + + __INVALID_PARAMETER_ERROR_HANDLING(); +} + + +int ctsvc_record_set_projection_flags( contacts_record_h record, const unsigned int *projection, + const unsigned int projection_count, const unsigned int property_max_count) +{ + RETV_IF(record == NULL, CONTACTS_ERROR_INVALID_PARAMETER); + + ctsvc_record_s *_record = (ctsvc_record_s *)record; + + CONTACTS_FREE(_record->properties_flags); + + _record->properties_flags = calloc(property_max_count, sizeof(char)); + + RETVM_IF(NULL == _record->properties_flags, CONTACTS_ERROR_OUT_OF_MEMORY, "calloc fail"); + + _record->property_max_count = property_max_count; + + int i; + for (i = 0; i < projection_count; i++) + { + unsigned int index = projection[i] & 0x00000FFF; + if( index >= property_max_count ) { + ASSERT_NOT_REACHED("Boundary Check failed"); + return CONTACTS_ERROR_INTERNAL; + } + __ctsvc_record_set_property_flag(_record, index, CTSVC_PROPERTY_FLAG_PROJECTION); + } + + return CONTACTS_ERROR_NONE; +} + + diff --git a/common/ctsvc_record.h b/common/ctsvc_record.h new file mode 100644 index 0000000..625b234 --- /dev/null +++ b/common/ctsvc_record.h @@ -0,0 +1,53 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_RECORD_H__ +#define __TIZEN_SOCIAL_CTSVC_RECORD_H__ + +#define CTSVC_RECORD_INIT_BASE(base, type, cb, uri) do {\ + (base)->r_type = (type);\ + (base)->plugin_cbs = (cb);\ + (base)->view_uri = (uri);\ + (base)->property_max_count = 0;\ +} while (0) + +#define CTSVC_RECORD_COPY_BASE(dest, src) do {\ + (dest)->r_type = (src)->r_type;\ + (dest)->plugin_cbs = (src)->plugin_cbs;\ + (dest)->view_uri = (src)->view_uri;\ + (dest)->property_max_count = (src)->property_max_count;\ + if ((src)->properties_flags) \ + {\ + (dest)->properties_flags = calloc((dest)->property_max_count, sizeof(char));\ + memcpy((dest)->properties_flags,(src)->properties_flags,sizeof(char)*(dest)->property_max_count);\ + }\ +} while (0) + +int ctsvc_record_set_projection_flags( contacts_record_h record, const unsigned int *projection, const unsigned int projection_count, const unsigned int property_max_count); +int ctsvc_record_set_str( contacts_record_h record, unsigned int property_id, const char* value ); +int ctsvc_record_set_bool( contacts_record_h record, unsigned int property_id, bool value ); +int ctsvc_record_set_int( contacts_record_h record, unsigned int property_id, int value ); +int ctsvc_record_set_lli( contacts_record_h record, unsigned int property_id, long long int value ); +int ctsvc_record_set_double( contacts_record_h record, unsigned int property_id, double value ); + +#endif /* __TIZEN_SOCIAL_CTSVC_RECORD_H__ */ diff --git a/common/ctsvc_record_addressbook.c b/common/ctsvc_record_addressbook.c new file mode 100644 index 0000000..a0338fd --- /dev/null +++ b/common/ctsvc_record_addressbook.c @@ -0,0 +1,198 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_record.h" + +static int __ctsvc_addressbook_create(contacts_record_h *out_record); +static int __ctsvc_addressbook_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_addressbook_clone( contacts_record_h record, contacts_record_h* out_record ); +static int __ctsvc_addressbook_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_addressbook_get_str(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_addressbook_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_addressbook_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_addressbook_set_str(contacts_record_h record, unsigned int property_id, const char* str); + + +ctsvc_record_plugin_cb_s addressbook_plugin_cbs = { + .create = __ctsvc_addressbook_create, + .destroy = __ctsvc_addressbook_destroy, + .clone = __ctsvc_addressbook_clone, + .get_str = __ctsvc_addressbook_get_str, + .get_str_p = __ctsvc_addressbook_get_str_p, + .get_int = __ctsvc_addressbook_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_addressbook_set_str, + .set_int = __ctsvc_addressbook_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +static int __ctsvc_addressbook_create(contacts_record_h *out_record) +{ + ctsvc_addressbook_s *addressbook; + + addressbook = (ctsvc_addressbook_s*)calloc(1, sizeof(ctsvc_addressbook_s)); + RETVM_IF(NULL == addressbook, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)addressbook; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_addressbook_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_addressbook_s *addressbook = (ctsvc_addressbook_s*)record; + + addressbook->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(addressbook->base.properties_flags); + free(addressbook->name); + free(addressbook); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_addressbook_clone( contacts_record_h record, contacts_record_h* out_record ) +{ + ctsvc_addressbook_s *src = (ctsvc_addressbook_s*)record; + ctsvc_addressbook_s *dest; + + dest = calloc(1, sizeof(ctsvc_addressbook_s)); + RETVM_IF(NULL == dest, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + CTSVC_RECORD_COPY_BASE(&(dest->base), &(src->base)); + + dest->id = src->id; + dest->account_id = src->account_id; + dest->mode = src->mode; + dest->name = SAFE_STRDUP(src->name); + + *out_record = (contacts_record_h)dest; + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_addressbook_get_str_real(contacts_record_h record, + unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_addressbook_s *addressbook = (ctsvc_addressbook_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_ADDRESSBOOK_NAME: + *out_str = GET_STR(copy, addressbook->name); + break; + default : + ASSERT_NOT_REACHED("This field(%d) is not supported in value(addressbook)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_addressbook_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_addressbook_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_addressbook_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_addressbook_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_addressbook_set_str(contacts_record_h record, + unsigned int property_id, const char* str ) +{ + ctsvc_addressbook_s *addressbook = (ctsvc_addressbook_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_ADDRESSBOOK_NAME: + FREEandSTRDUP(addressbook->name, str); + break; + default : + ASSERT_NOT_REACHED("This field(%d) is not supported in value(addressbook)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_addressbook_get_int(contacts_record_h record, + unsigned int property_id, int *out) +{ + ctsvc_addressbook_s *addressbook = (ctsvc_addressbook_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_ADDRESSBOOK_ID: + *out = addressbook->id; + break; + case CTSVC_PROPERTY_ADDRESSBOOK_ACCOUNT_ID: + *out = addressbook->account_id; + break; + case CTSVC_PROPERTY_ADDRESSBOOK_MODE: + *out = addressbook->mode; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(addressbook)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_addressbook_set_int(contacts_record_h record, + unsigned int property_id, int value) +{ + ctsvc_addressbook_s *addressbook = (ctsvc_addressbook_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_ADDRESSBOOK_ID: + addressbook->id = value; + break; +/* + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is a read-only value (addressbook)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_ADDRESSBOOK_MODE: + addressbook->mode = value; + break; + case CTSVC_PROPERTY_ADDRESSBOOK_ACCOUNT_ID: + RETVM_IF(addressbook->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (addressbook)", property_id); + addressbook->account_id = value; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(addressbook)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + diff --git a/common/ctsvc_record_contact.c b/common/ctsvc_record_contact.c new file mode 100644 index 0000000..e4cef2d --- /dev/null +++ b/common/ctsvc_record_contact.c @@ -0,0 +1,4331 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_list.h" +#include "ctsvc_record.h" +#include "ctsvc_view.h" + +static int __ctsvc_activity_create(contacts_record_h *out_record); +static int __ctsvc_activity_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_activity_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_activity_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_activity_get_str(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_activity_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_activity_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_activity_set_str(contacts_record_h record, unsigned int property_id, const char* str ); + +static int __ctsvc_activity_photo_create(contacts_record_h *out_record); +static int __ctsvc_activity_photo_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_activity_photo_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_activity_photo_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_activity_photo_get_str(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_activity_photo_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_activity_photo_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_activity_photo_set_str(contacts_record_h record, unsigned int property_id, const char* str ); + + +static int __ctsvc_address_create(contacts_record_h *out_ecord); +static int __ctsvc_address_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_address_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_address_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_address_get_str(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_address_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_address_get_bool(contacts_record_h record, unsigned int property_id, bool *value ); +static int __ctsvc_address_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_address_set_str(contacts_record_h record, unsigned int property_id, const char* str ); +static int __ctsvc_address_set_bool(contacts_record_h record, unsigned int property_id, bool value); + +static int __ctsvc_company_create(contacts_record_h *out_record); +static int __ctsvc_company_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_company_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_company_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_company_get_str(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_company_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_company_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_company_set_str(contacts_record_h record, unsigned int property_id, const char* str ); + +static int __ctsvc_contact_create(contacts_record_h *out_record); +static int __ctsvc_contact_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_contact_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_contact_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_contact_get_str(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_contact_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_contact_get_bool(contacts_record_h record, unsigned int property_id, bool *value ); +static int __ctsvc_contact_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_contact_set_str(contacts_record_h record, unsigned int property_id, const char* str ); +static int __ctsvc_contact_set_bool(contacts_record_h record, unsigned int property_id, bool value); +static int __ctsvc_contact_clone_child_record_list(contacts_record_h record, unsigned int property_id, contacts_list_h* out_list ); +static int __ctsvc_contact_get_child_record_at_p(contacts_record_h record, unsigned int property_id, int index, contacts_record_h* out_record ); +static int __ctsvc_contact_get_child_record_count(contacts_record_h record, unsigned int property_id, unsigned int *count ); +static int __ctsvc_contact_add_child_record(contacts_record_h record, unsigned int property_id, contacts_record_h child_record ); +static int __ctsvc_contact_remove_child_record(contacts_record_h record, unsigned int property_id, contacts_record_h child_record ); + +static int __ctsvc_email_create(contacts_record_h *out_record); +static int __ctsvc_email_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_email_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_email_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_email_get_str(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_email_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_email_get_bool(contacts_record_h record, unsigned int property_id, bool *value ); +static int __ctsvc_email_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_email_set_str(contacts_record_h record, unsigned int property_id, const char* str ); +static int __ctsvc_email_set_bool(contacts_record_h record, unsigned int property_id, bool value); + +static int __ctsvc_event_create(contacts_record_h *out_record); +static int __ctsvc_event_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_event_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_event_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_event_get_str(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_event_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_event_get_bool(contacts_record_h record, unsigned int property_id, bool *value ); +static int __ctsvc_event_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_event_set_str(contacts_record_h record, unsigned int property_id, const char* str ); +static int __ctsvc_event_set_bool(contacts_record_h record, unsigned int property_id, bool value); + +static int __ctsvc_extension_create(contacts_record_h *out_record); +static int __ctsvc_extension_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_extension_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_extension_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_extension_get_str(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_extension_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_extension_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_extension_set_str(contacts_record_h record, unsigned int property_id, const char* str ); + +static int __ctsvc_group_relation_create(contacts_record_h *out_record); +static int __ctsvc_group_relation_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_group_relation_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_group_relation_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_group_relation_get_str(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_group_relation_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_group_relation_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_group_relation_set_str(contacts_record_h record, unsigned int property_id, const char* str ); + +static int __ctsvc_messenger_create(contacts_record_h *out_record); +static int __ctsvc_messenger_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_messenger_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_messenger_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_messenger_get_str(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_messenger_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_messenger_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_messenger_set_str(contacts_record_h record, unsigned int property_id, const char* str ); + +static int __ctsvc_name_create(contacts_record_h *out_record); +static int __ctsvc_name_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_name_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_name_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_name_get_str(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_name_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_name_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_name_set_str(contacts_record_h record, unsigned int property_id, const char* str ); + +static int __ctsvc_nickname_create(contacts_record_h *out_record); +static int __ctsvc_nickname_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_nickname_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_nickname_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_nickname_get_str(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_nickname_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_nickname_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_nickname_set_str(contacts_record_h record, unsigned int property_id, const char* str ); + +static int __ctsvc_note_create(contacts_record_h *out_record); +static int __ctsvc_note_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_note_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_note_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_note_get_str(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_note_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_note_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_note_set_str(contacts_record_h record, unsigned int property_id, const char* str ); + +static int __ctsvc_number_create(contacts_record_h *out_record); +static int __ctsvc_number_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_number_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_number_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_number_get_str(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_number_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_number_get_bool(contacts_record_h record, unsigned int property_id, bool *value ); +static int __ctsvc_number_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_number_set_str(contacts_record_h record, unsigned int property_id, const char* str ); +static int __ctsvc_number_set_bool(contacts_record_h record, unsigned int property_id, bool value); + +static int __ctsvc_profile_create(contacts_record_h *out_record); +static int __ctsvc_profile_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_profile_clone(contacts_record_h record, contacts_record_h *out_reord); +static int __ctsvc_profile_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_profile_get_str(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_profile_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_profile_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_profile_set_str(contacts_record_h record, unsigned int property_id, const char* str ); + +static int __ctsvc_relationship_create(contacts_record_h *out_record); +static int __ctsvc_relationship_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_relationship_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_relationship_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_relationship_get_str(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_relationship_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_relationship_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_relationship_set_str(contacts_record_h record, unsigned int property_id, const char* str ); + +static int __ctsvc_image_create(contacts_record_h *out_record); +static int __ctsvc_image_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_image_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_image_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_image_get_str(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_image_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_image_get_bool(contacts_record_h record, unsigned int property_id, bool *value ); +static int __ctsvc_image_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_image_set_str(contacts_record_h record, unsigned int property_id, const char* str ); +static int __ctsvc_image_set_bool(contacts_record_h record, unsigned int property_id, bool value); + +static int __ctsvc_simple_contact_create(contacts_record_h *out_record); +static int __ctsvc_simple_contact_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_simple_contact_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_simple_contact_get_bool(contacts_record_h record, unsigned int property_id, bool *out); +static int __ctsvc_simple_contact_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_simple_contact_get_str(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_simple_contact_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_simple_contact_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_simple_contact_set_str(contacts_record_h record, unsigned int property_id, const char* str ); + +static int __ctsvc_url_create(contacts_record_h *out_record); +static int __ctsvc_url_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_url_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_url_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_url_get_str(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_url_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_url_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_url_set_str(contacts_record_h record, unsigned int property_id, const char* str ); + + +ctsvc_record_plugin_cb_s name_plugin_cbs = { + .create = __ctsvc_name_create, + .destroy = __ctsvc_name_destroy, + .clone = __ctsvc_name_clone, + .get_str = __ctsvc_name_get_str, + .get_str_p = __ctsvc_name_get_str_p, + .get_int = __ctsvc_name_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_name_set_str, + .set_int = __ctsvc_name_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s number_plugin_cbs = { + .create = __ctsvc_number_create, + .destroy = __ctsvc_number_destroy, + .clone = __ctsvc_number_clone, + .get_str = __ctsvc_number_get_str, + .get_str_p = __ctsvc_number_get_str_p, + .get_int = __ctsvc_number_get_int, + .get_bool = __ctsvc_number_get_bool, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_number_set_str, + .set_int = __ctsvc_number_set_int, + .set_bool = __ctsvc_number_set_bool, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s address_plugin_cbs = { + .create = __ctsvc_address_create, + .destroy = __ctsvc_address_destroy, + .clone = __ctsvc_address_clone, + .get_str = __ctsvc_address_get_str, + .get_str_p = __ctsvc_address_get_str_p, + .get_int = __ctsvc_address_get_int, + .get_bool = __ctsvc_address_get_bool, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_address_set_str, + .set_int = __ctsvc_address_set_int, + .set_bool = __ctsvc_address_set_bool, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s url_plugin_cbs = { + .create = __ctsvc_url_create, + .destroy = __ctsvc_url_destroy, + .clone = __ctsvc_url_clone, + .get_str = __ctsvc_url_get_str, + .get_str_p = __ctsvc_url_get_str_p, + .get_int = __ctsvc_url_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_url_set_str, + .set_int = __ctsvc_url_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s event_plugin_cbs = { + .create = __ctsvc_event_create, + .destroy = __ctsvc_event_destroy, + .clone = __ctsvc_event_clone, + .get_str = __ctsvc_event_get_str, + .get_str_p = __ctsvc_event_get_str_p, + .get_int = __ctsvc_event_get_int, + .get_bool = __ctsvc_event_get_bool, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_event_set_str, + .set_int = __ctsvc_event_set_int, + .set_bool = __ctsvc_event_set_bool, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s messenger_plugin_cbs = { + .create = __ctsvc_messenger_create, + .destroy = __ctsvc_messenger_destroy, + .clone = __ctsvc_messenger_clone, + .get_str = __ctsvc_messenger_get_str, + .get_str_p = __ctsvc_messenger_get_str_p, + .get_int = __ctsvc_messenger_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_messenger_set_str, + .set_int = __ctsvc_messenger_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s activity_plugin_cbs = { + .create = __ctsvc_activity_create, + .destroy = __ctsvc_activity_destroy, + .clone = __ctsvc_activity_clone, + .get_str = __ctsvc_activity_get_str, + .get_str_p = __ctsvc_activity_get_str_p, + .get_int = __ctsvc_activity_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_activity_set_str, + .set_int = __ctsvc_activity_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s activity_photo_plugin_cbs = { + .create = __ctsvc_activity_photo_create, + .destroy = __ctsvc_activity_photo_destroy, + .clone = __ctsvc_activity_photo_clone, + .get_str = __ctsvc_activity_photo_get_str, + .get_str_p = __ctsvc_activity_photo_get_str_p, + .get_int = __ctsvc_activity_photo_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_activity_photo_set_str, + .set_int = __ctsvc_activity_photo_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s relationship_plugin_cbs = { + .create = __ctsvc_relationship_create, + .destroy = __ctsvc_relationship_destroy, + .clone = __ctsvc_relationship_clone, + .get_str = __ctsvc_relationship_get_str, + .get_str_p = __ctsvc_relationship_get_str_p, + .get_int = __ctsvc_relationship_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_relationship_set_str, + .set_int = __ctsvc_relationship_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s image_plugin_cbs = { + .create = __ctsvc_image_create, + .destroy = __ctsvc_image_destroy, + .clone = __ctsvc_image_clone, + .get_str = __ctsvc_image_get_str, + .get_str_p = __ctsvc_image_get_str_p, + .get_int = __ctsvc_image_get_int, + .get_bool = __ctsvc_image_get_bool, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_image_set_str, + .set_int = __ctsvc_image_set_int, + .set_bool = __ctsvc_image_set_bool, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s group_relation_plugin_cbs = { + .create = __ctsvc_group_relation_create, + .destroy = __ctsvc_group_relation_destroy, + .clone = __ctsvc_group_relation_clone, + .get_str = __ctsvc_group_relation_get_str, + .get_str_p = __ctsvc_group_relation_get_str_p, + .get_int = __ctsvc_group_relation_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_group_relation_set_str, + .set_int = __ctsvc_group_relation_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s note_plugin_cbs = { + .create = __ctsvc_note_create, + .destroy = __ctsvc_note_destroy, + .clone = __ctsvc_note_clone, + .get_str = __ctsvc_note_get_str, + .get_str_p = __ctsvc_note_get_str_p, + .get_int = __ctsvc_note_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_note_set_str, + .set_int = __ctsvc_note_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s company_plugin_cbs = { + .create = __ctsvc_company_create, + .destroy = __ctsvc_company_destroy, + .clone = __ctsvc_company_clone, + .get_str = __ctsvc_company_get_str, + .get_str_p = __ctsvc_company_get_str_p, + .get_int = __ctsvc_company_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_company_set_str, + .set_int = __ctsvc_company_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s profile_plugin_cbs = { + .create = __ctsvc_profile_create, + .destroy = __ctsvc_profile_destroy, + .clone = __ctsvc_profile_clone, + .get_str = __ctsvc_profile_get_str, + .get_str_p = __ctsvc_profile_get_str_p, + .get_int = __ctsvc_profile_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_profile_set_str, + .set_int = __ctsvc_profile_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s nickname_plugin_cbs = { + .create = __ctsvc_nickname_create, + .destroy = __ctsvc_nickname_destroy, + .clone = __ctsvc_nickname_clone, + .get_str = __ctsvc_nickname_get_str, + .get_str_p = __ctsvc_nickname_get_str_p, + .get_int = __ctsvc_nickname_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_nickname_set_str, + .set_int = __ctsvc_nickname_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s email_plugin_cbs = { + .create = __ctsvc_email_create, + .destroy = __ctsvc_email_destroy, + .clone = __ctsvc_email_clone, + .get_str = __ctsvc_email_get_str, + .get_str_p = __ctsvc_email_get_str_p, + .get_int = __ctsvc_email_get_int, + .get_bool = __ctsvc_email_get_bool, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_email_set_str, + .set_int = __ctsvc_email_set_int, + .set_bool = __ctsvc_email_set_bool, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s extension_plugin_cbs = { + .create = __ctsvc_extension_create, + .destroy = __ctsvc_extension_destroy, + .clone = __ctsvc_extension_clone, + .get_str = __ctsvc_extension_get_str, + .get_str_p = __ctsvc_extension_get_str_p, + .get_int = __ctsvc_extension_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_extension_set_str, + .set_int = __ctsvc_extension_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +ctsvc_record_plugin_cb_s contact_plugin_cbs = { + .create = __ctsvc_contact_create, + .destroy = __ctsvc_contact_destroy, + .clone = __ctsvc_contact_clone, + .get_str = __ctsvc_contact_get_str, + .get_str_p = __ctsvc_contact_get_str_p, + .get_int = __ctsvc_contact_get_int, + .get_bool = __ctsvc_contact_get_bool, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_contact_set_str, + .set_int = __ctsvc_contact_set_int, + .set_bool = __ctsvc_contact_set_bool, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = __ctsvc_contact_add_child_record, + .remove_child_record = __ctsvc_contact_remove_child_record, + .get_child_record_count = __ctsvc_contact_get_child_record_count, + .get_child_record_at_p = __ctsvc_contact_get_child_record_at_p, + .clone_child_record_list = __ctsvc_contact_clone_child_record_list, +}; + +ctsvc_record_plugin_cb_s simple_contact_plugin_cbs = { + .create = __ctsvc_simple_contact_create, + .destroy = __ctsvc_simple_contact_destroy, + .clone = __ctsvc_simple_contact_clone, + .get_str = __ctsvc_simple_contact_get_str, + .get_str_p = __ctsvc_simple_contact_get_str_p, + .get_int = __ctsvc_simple_contact_get_int, + .get_bool = __ctsvc_simple_contact_get_bool, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_simple_contact_set_str, + .set_int = __ctsvc_simple_contact_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +static int __ctsvc_activity_create(contacts_record_h *out_record) +{ + ctsvc_activity_s *activity; + activity = (ctsvc_activity_s*)calloc(1, sizeof(ctsvc_activity_s)); + RETVM_IF(NULL == activity, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + activity->photos = calloc(1, sizeof(ctsvc_list_s)); + activity->photos->l_type = CTSVC_RECORD_ACTIVITY_PHOTO; + + *out_record = (contacts_record_h)activity; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_activity_photo_create(contacts_record_h *out_record) +{ + ctsvc_activity_photo_s *photo; + photo = (ctsvc_activity_photo_s*)calloc(1, sizeof(ctsvc_activity_photo_s)); + RETVM_IF(NULL == photo, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)photo; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_address_create(contacts_record_h *out_record) +{ + ctsvc_address_s *address; + + address = (ctsvc_address_s*)calloc(1, sizeof(ctsvc_address_s)); + RETVM_IF(NULL == address, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)address; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_company_create(contacts_record_h *out_record) +{ + ctsvc_company_s *company; + + company = (ctsvc_company_s*)calloc(1, sizeof(ctsvc_company_s)); + RETVM_IF(NULL == company, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)company; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_email_create(contacts_record_h *out_record) +{ + ctsvc_email_s *email; + email = (ctsvc_email_s*)calloc(1, sizeof(ctsvc_email_s)); + RETVM_IF(NULL == email, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)email; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_event_create(contacts_record_h *out_record) +{ + ctsvc_event_s *event; + event = (ctsvc_event_s*)calloc(1, sizeof(ctsvc_event_s)); + RETVM_IF(NULL == event, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)event; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_extension_create(contacts_record_h *out_record) +{ + ctsvc_extension_s *extension; + extension = (ctsvc_extension_s*)calloc(1, sizeof(ctsvc_extension_s)); + RETVM_IF(NULL == extension, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)extension; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_group_relation_create(contacts_record_h *out_record) +{ + ctsvc_group_relation_s *group_relation; + group_relation = (ctsvc_group_relation_s*)calloc(1, sizeof(ctsvc_group_relation_s)); + RETVM_IF(NULL == group_relation, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)group_relation; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_messenger_create(contacts_record_h *out_record) +{ + ctsvc_messenger_s *messenger; + messenger = (ctsvc_messenger_s*)calloc(1, sizeof(ctsvc_messenger_s)); + RETVM_IF(NULL == messenger, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)messenger; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_name_create(contacts_record_h *out_record) +{ + ctsvc_name_s *name; + + name = (ctsvc_name_s*)calloc(1, sizeof(ctsvc_name_s)); + RETVM_IF(NULL == name, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)name; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_nickname_create(contacts_record_h *out_record) +{ + ctsvc_nickname_s *nickname; + + nickname = (ctsvc_nickname_s*)calloc(1, sizeof(ctsvc_nickname_s)); + RETVM_IF(NULL == nickname, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)nickname; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_note_create(contacts_record_h *out_record) +{ + ctsvc_note_s *note; + + note = (ctsvc_note_s*)calloc(1, sizeof(ctsvc_note_s)); + RETVM_IF(NULL == note, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)note; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_number_create(contacts_record_h *out_record) +{ + ctsvc_number_s *number; + + number = (ctsvc_number_s*)calloc(1, sizeof(ctsvc_number_s)); + RETVM_IF(NULL == number, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)number; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_profile_create(contacts_record_h *out_record) +{ + ctsvc_profile_s *profile; + + profile = (ctsvc_profile_s*)calloc(1, sizeof(ctsvc_profile_s)); + RETVM_IF(NULL == profile, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)profile; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_relationship_create(contacts_record_h *out_record) +{ + ctsvc_relationship_s *relationship; + + relationship = (ctsvc_relationship_s*)calloc(1, sizeof(ctsvc_relationship_s)); + RETVM_IF(NULL == relationship, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)relationship; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_image_create(contacts_record_h *out_record) +{ + ctsvc_image_s *image; + + image = (ctsvc_image_s*)calloc(1, sizeof(ctsvc_image_s)); + RETVM_IF(NULL == image, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)image; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_simple_contact_create(contacts_record_h *out_record) +{ + ctsvc_simple_contact_s *simple_contact; + + simple_contact = (ctsvc_simple_contact_s*)calloc(1, sizeof(ctsvc_simple_contact_s)); + RETVM_IF(NULL == simple_contact, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)simple_contact; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_url_create(contacts_record_h *out_record) +{ + ctsvc_url_s *url; + + url = (ctsvc_url_s*)calloc(1, sizeof(ctsvc_url_s)); + RETVM_IF(NULL == url, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)url; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_name_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_name_s *name = (ctsvc_name_s*)record; + name->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(name->base.properties_flags); + + free(name->first); + free(name->last); + free(name->addition); + free(name->prefix); + free(name->suffix); + free(name->phonetic_first); + free(name->phonetic_middle); + free(name->phonetic_last); + free(name->lookup); + free(name->reverse_lookup); + free(name); + + return CONTACTS_ERROR_NONE; +}; + +static int __ctsvc_company_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_company_s *company = (ctsvc_company_s*)record; + company->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(company->base.properties_flags); + + free(company->name); + free(company->department); + free(company->job_title); + free(company->role); + free(company->assistant_name); + free(company->logo); + free(company->location); + free(company->description); + free(company->phonetic_name); + free(company); + + return CONTACTS_ERROR_NONE; +}; + +static int __ctsvc_note_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_note_s *note = (ctsvc_note_s*)record; + note->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(note->base.properties_flags); + + free(note->note); + free(note); + + return CONTACTS_ERROR_NONE; +}; + +static int __ctsvc_number_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_number_s *number = (ctsvc_number_s*)record; + number->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(number->base.properties_flags); + + free(number->label); + free(number->number); + free(number->lookup); + free(number); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_email_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_email_s *email = (ctsvc_email_s*)record; + email->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(email->base.properties_flags); + + free(email->label); + free(email->email_addr); + free(email); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_group_relation_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_group_relation_s *group = (ctsvc_group_relation_s*)record; + group->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(group->base.properties_flags); + + free(group->group_name); + free(group); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_activity_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_activity_s *activity = (ctsvc_activity_s*)record; + activity->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(activity->base.properties_flags); + + free(activity->source_name); + free(activity->status); + free(activity->sync_data1); + free(activity->sync_data2); + free(activity->sync_data3); + free(activity->sync_data4); + contacts_list_destroy((contacts_list_h)activity->photos, delete_child); + free(activity); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_activity_photo_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_activity_photo_s *photo = (ctsvc_activity_photo_s*)record; + photo->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(photo->base.properties_flags); + + free(photo->photo_url); + free(photo); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_event_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_event_s *event = (ctsvc_event_s*)record; + event->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(event->base.properties_flags); + + free(event->label); + free(event); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_messenger_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_messenger_s *messenger = (ctsvc_messenger_s*)record; + messenger->base.plugin_cbs = NULL; + free(messenger->base.properties_flags); + + free(messenger->label); + free(messenger->im_id); + free(messenger); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_address_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_address_s *address = (ctsvc_address_s*)record; + address->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(address->base.properties_flags); + + free(address->label); + free(address->pobox); + free(address->postalcode); + free(address->region); + free(address->locality); + free(address->street); + free(address->extended); + free(address->country); + free(address); + + return CONTACTS_ERROR_NONE; +} +static int __ctsvc_url_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_url_s *url = (ctsvc_url_s*)record; + url->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(url->base.properties_flags); + + free(url->label); + free(url->url); + free(url); + + return CONTACTS_ERROR_NONE; +} +static int __ctsvc_nickname_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_nickname_s *nickname = (ctsvc_nickname_s*)record; + nickname->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(nickname->base.properties_flags); + + free(nickname->label); + free(nickname->nickname); + free(nickname); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_profile_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_profile_s *profile = (ctsvc_profile_s*)record; + profile->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(profile->base.properties_flags); + + free(profile->label); + free(profile->uid); + free(profile->text); + free(profile->appsvc_operation); + free(profile->data1); + free(profile->data2); + free(profile->data3); + free(profile->data4); + free(profile); + + return CONTACTS_ERROR_NONE; +} +static int __ctsvc_relationship_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_relationship_s *relationship = (ctsvc_relationship_s*)record; + relationship->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(relationship->base.properties_flags); + + free(relationship->label); + free(relationship->name); + free(relationship); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_image_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_image_s *image = (ctsvc_image_s*)record; + image->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(image->base.properties_flags); + + free(image->label); + free(image->path); + free(image); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_extension_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_extension_s *data = (ctsvc_extension_s*)record; + data->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(data->base.properties_flags); + + free(data->data2); + free(data->data3); + free(data->data4); + free(data->data5); + free(data->data6); + free(data->data7); + free(data->data8); + free(data->data9); + free(data->data10); + free(data->data11); + free(data->data12); + free(data); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_simple_contact_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_simple_contact_s *contact= (ctsvc_simple_contact_s*)record; + contact->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(contact->base.properties_flags); + + free(contact->display_name); + free(contact->image_thumbnail_path); + free(contact->ringtone_path); + free(contact->vibration); + free(contact->uid); + free(contact); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_contact_create(contacts_record_h *out_record) +{ + ctsvc_contact_s *contact; + + contact = calloc(1, sizeof(ctsvc_contact_s)); + RETVM_IF(NULL == contact, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + contact->name = calloc(1, sizeof(ctsvc_list_s)); + contact->name->l_type = CTSVC_RECORD_NAME; + + contact->company = calloc(1, sizeof(ctsvc_list_s)); + contact->company->l_type = CTSVC_RECORD_COMPANY; + + contact->note = calloc(1, sizeof(ctsvc_list_s)); + contact->note->l_type = CTSVC_RECORD_NOTE; + + contact->numbers = calloc(1, sizeof(ctsvc_list_s)); + contact->numbers->l_type = CTSVC_RECORD_NUMBER; + + contact->emails = calloc(1, sizeof(ctsvc_list_s)); + contact->emails->l_type = CTSVC_RECORD_EMAIL; + + contact->grouprelations = calloc(1, sizeof(ctsvc_list_s)); + contact->grouprelations->l_type = CTSVC_RECORD_GROUP_RELATION; + + contact->events = calloc(1, sizeof(ctsvc_list_s)); + contact->events->l_type = CTSVC_RECORD_EVENT; + + contact->messengers = calloc(1, sizeof(ctsvc_list_s)); + contact->messengers->l_type = CTSVC_RECORD_MESSENGER; + + contact->postal_addrs = calloc(1, sizeof(ctsvc_list_s)); + contact->postal_addrs->l_type = CTSVC_RECORD_ADDRESS; + + contact->urls = calloc(1, sizeof(ctsvc_list_s)); + contact->urls->l_type = CTSVC_RECORD_URL; + + contact->nicknames = calloc(1, sizeof(ctsvc_list_s)); + contact->nicknames->l_type = CTSVC_RECORD_NICKNAME; + + contact->profiles = calloc(1, sizeof(ctsvc_list_s)); + contact->profiles->l_type = CTSVC_RECORD_PROFILE; + + contact->relationships = calloc(1, sizeof(ctsvc_list_s)); + contact->relationships->l_type = CTSVC_RECORD_RELATIONSHIP; + + contact->images = calloc(1, sizeof(ctsvc_list_s)); + contact->images->l_type = CTSVC_RECORD_IMAGE; + + contact->extensions = calloc(1, sizeof(ctsvc_list_s)); + contact->extensions->l_type = CTSVC_RECORD_EXTENSION; + + *out_record = (contacts_record_h)contact; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_contact_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_contact_s *contact = (ctsvc_contact_s*)record; + contact->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(contact->base.properties_flags); + + free(contact->display_name); + free(contact->reverse_display_name); + free(contact->uid); + free(contact->image_thumbnail_path); + free(contact->ringtone_path); + free(contact->vibration); + free(contact->sortkey); + free(contact->reverse_sortkey); + free(contact->sync_data1); + free(contact->sync_data2); + free(contact->sync_data3); + free(contact->sync_data4); + + contacts_list_destroy((contacts_list_h)contact->name, delete_child); + + contacts_list_destroy((contacts_list_h)contact->company, delete_child); + + contacts_list_destroy((contacts_list_h)contact->note, delete_child); + + contacts_list_destroy((contacts_list_h)contact->numbers, delete_child); + + contacts_list_destroy((contacts_list_h)contact->emails, delete_child); + + contacts_list_destroy((contacts_list_h)contact->grouprelations, delete_child); + + contacts_list_destroy((contacts_list_h)contact->events, delete_child); + + contacts_list_destroy((contacts_list_h)contact->messengers, delete_child); + + contacts_list_destroy((contacts_list_h)contact->postal_addrs, delete_child); + + contacts_list_destroy((contacts_list_h)contact->urls, delete_child); + + contacts_list_destroy((contacts_list_h)contact->nicknames, delete_child); + + contacts_list_destroy((contacts_list_h)contact->profiles, delete_child); + + contacts_list_destroy((contacts_list_h)contact->relationships, delete_child); + + contacts_list_destroy((contacts_list_h)contact->images, delete_child); + + contacts_list_destroy((contacts_list_h)contact->extensions, delete_child); + free(contact); + + return CONTACTS_ERROR_NONE; +} + + +static int __ctsvc_contact_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_contact_s *contact = (ctsvc_contact_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_CONTACT_ID: + *out = contact->id; + break; + case CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID: + *out = contact->display_source_type; + break; + case CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID: + *out = contact->addressbook_id; + break; + case CTSVC_PROPERTY_CONTACT_PERSON_ID: + *out = contact->person_id; + break; + case CTSVC_PROPERTY_CONTACT_CHANGED_TIME: + *out = contact->changed_time; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_simple_contact_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_simple_contact_s *contact = (ctsvc_simple_contact_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_CONTACT_ID: + *out = contact->contact_id; + break; + case CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID: + *out = contact->display_source_type; + break; + case CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID: + *out = contact->addressbook_id; + break; + case CTSVC_PROPERTY_CONTACT_PERSON_ID: + *out = contact->person_id; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(simple contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_name_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_name_s *name = (ctsvc_name_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_NAME_ID: + *out = name->id; + break; + case CTSVC_PROPERTY_NAME_CONTACT_ID: + *out = name->contact_id; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(name)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_company_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_company_s *company = (ctsvc_company_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_COMPANY_ID: + *out = company->id; + break; + case CTSVC_PROPERTY_COMPANY_CONTACT_ID: + *out = company->contact_id; + break; + case CTSVC_PROPERTY_COMPANY_TYPE: + *out = company->type; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(company)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_note_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_note_s *note = (ctsvc_note_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_NOTE_ID: + *out = note->id; + break; + case CTSVC_PROPERTY_NOTE_CONTACT_ID: + *out = note->contact_id; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(note)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_number_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_number_s *number = (ctsvc_number_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_NUMBER_ID: + *out = number->id; + break; + case CTSVC_PROPERTY_NUMBER_CONTACT_ID: + *out = number->contact_id; + break; + case CTSVC_PROPERTY_NUMBER_TYPE: + *out = number->type; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(number)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_email_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_email_s *email = (ctsvc_email_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_EMAIL_ID: + *out = email->id; + break; + case CTSVC_PROPERTY_EMAIL_CONTACT_ID: + *out = email->contact_id; + break; + case CTSVC_PROPERTY_EMAIL_TYPE: + *out = email->type; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(email)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_url_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_url_s *url = (ctsvc_url_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_URL_ID: + *out = url->id; + break; + case CTSVC_PROPERTY_URL_CONTACT_ID: + *out = url->contact_id; + break; + case CTSVC_PROPERTY_URL_TYPE: + *out = url->type; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(url)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_event_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_event_s *event = (ctsvc_event_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_EVENT_ID: + *out = event->id; + break; + case CTSVC_PROPERTY_EVENT_CONTACT_ID: + *out = event->contact_id; + break; + case CTSVC_PROPERTY_EVENT_TYPE: + *out = event->type; + break; + case CTSVC_PROPERTY_EVENT_DATE: + *out = event->date; + break; + case CTSVC_PROPERTY_EVENT_LUNAR_DATE: + *out = event->lunar_date; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(event)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_nickname_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_nickname_s *nickname = (ctsvc_nickname_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_NICKNAME_ID: + *out = nickname->id; + break; + case CTSVC_PROPERTY_NICKNAME_CONTACT_ID: + *out = nickname->contact_id; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(nickname)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_address_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_address_s *address = (ctsvc_address_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_ADDRESS_ID: + *out = address->id; + break; + case CTSVC_PROPERTY_ADDRESS_CONTACT_ID: + *out = address->contact_id; + break; + case CTSVC_PROPERTY_ADDRESS_TYPE: + *out = address->type; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(address)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_messenger_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_messenger_s *messenger = (ctsvc_messenger_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_MESSENGER_ID: + *out = messenger->id; + break; + case CTSVC_PROPERTY_MESSENGER_CONTACT_ID: + *out = messenger->contact_id; + break; + case CTSVC_PROPERTY_MESSENGER_TYPE: + *out = messenger->type; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(messenger)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_group_relation_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_group_relation_s *group = (ctsvc_group_relation_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_GROUP_RELATION_ID: + *out = group->id; + break; + case CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID: + *out = group->contact_id; + break; + case CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID: + *out = group->group_id; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(group)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_activity_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_activity_s *activity = (ctsvc_activity_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_ACTIVITY_ID: + *out = activity->id; + break; + case CTSVC_PROPERTY_ACTIVITY_CONTACT_ID: + *out = activity->contact_id; + break; + case CTSVC_PROPERTY_ACTIVITY_TIMESTAMP: + *out = activity->timestamp; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(activity)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_activity_photo_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_activity_photo_s *photo = (ctsvc_activity_photo_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_ACTIVITY_PHOTO_ID: + *out = photo->id; + break; + case CTSVC_PROPERTY_ACTIVITY_PHOTO_ACTIVITY_ID: + *out = photo->activity_id; + break; + case CTSVC_PROPERTY_ACTIVITY_PHOTO_SORT_INDEX: + *out = photo->sort_index; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(activity)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_profile_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_profile_s *profile = (ctsvc_profile_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_PROFILE_ID: + *out = profile->id; + break; + case CTSVC_PROPERTY_PROFILE_CONTACT_ID: + *out = profile->contact_id; + break; + case CTSVC_PROPERTY_PROFILE_TYPE: + *out = profile->type; + break; + case CTSVC_PROPERTY_PROFILE_ORDER: + *out = profile->order; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(profile)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_relationship_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_relationship_s *relationship = (ctsvc_relationship_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_RELATIONSHIP_ID: + *out = relationship->id; + break; + case CTSVC_PROPERTY_RELATIONSHIP_CONTACT_ID: + *out = relationship->contact_id; + break; + case CTSVC_PROPERTY_RELATIONSHIP_TYPE: + *out = relationship->type; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(relationship)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_image_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_image_s *image = (ctsvc_image_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_IMAGE_ID: + *out = image->id; + break; + case CTSVC_PROPERTY_IMAGE_CONTACT_ID: + *out = image->contact_id; + break; + case CTSVC_PROPERTY_IMAGE_TYPE: + *out = image->type; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(image)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_extension_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_extension_s *extension = (ctsvc_extension_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_EXTENSION_ID: + *out = extension->id; + break; + case CTSVC_PROPERTY_EXTENSION_CONTACT_ID: + *out = extension->contact_id; + break; + case CTSVC_PROPERTY_EXTENSION_DATA1: + *out = extension->data1; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(extension)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + + +static int __ctsvc_contact_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_contact_s *contact = (ctsvc_contact_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_CONTACT_ID: + contact->id = value; + break; + case CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID: + contact->display_source_type = value; + break; + case CTSVC_PROPERTY_CONTACT_PERSON_ID: + contact->person_id = value; + break; + case CTSVC_PROPERTY_CONTACT_CHANGED_TIME: + contact->changed_time = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID: + RETVM_IF(contact->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (contact)", property_id); + contact->addressbook_id = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in valuecontact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_simple_contact_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_simple_contact_s *contact = (ctsvc_simple_contact_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_CONTACT_ID: + contact->contact_id = value; + break; + case CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID: + contact->display_source_type = value; + break; + case CTSVC_PROPERTY_CONTACT_PERSON_ID: + contact->person_id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (simple contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID: + RETVM_IF(contact->contact_id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalide parameter : property_id(%d) is a read-only value (contact)", property_id); + contact->addressbook_id = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(simple contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_name_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_name_s *name = (ctsvc_name_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_NAME_ID: + name->id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (name)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_NAME_CONTACT_ID: + RETVM_IF(name->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (name)", property_id); + name->contact_id = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(name)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_company_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_company_s *company = (ctsvc_company_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_COMPANY_ID: + company->id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (company)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_COMPANY_CONTACT_ID: + RETVM_IF(company->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (company)", property_id); + company->contact_id = value; + break; + case CTSVC_PROPERTY_COMPANY_TYPE: + company->type = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(company)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_note_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_note_s *note = (ctsvc_note_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_NOTE_ID: + note->id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (note)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_NOTE_CONTACT_ID: + RETVM_IF(note->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (note)", property_id); + note->contact_id = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(note)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_number_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_number_s *number = (ctsvc_number_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_NUMBER_ID: + number->id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (number)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_NUMBER_CONTACT_ID: + RETVM_IF(number->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (number)", property_id); + number->contact_id = value; + break; + case CTSVC_PROPERTY_NUMBER_TYPE: + number->type = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(number)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_email_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_email_s *email = (ctsvc_email_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_EMAIL_ID: + email->id = value; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (email)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_EMAIL_CONTACT_ID: + RETVM_IF(email->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (email)", property_id); + email->contact_id = value; + break; + case CTSVC_PROPERTY_EMAIL_TYPE: + email->type = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(email)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_url_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_url_s *url = (ctsvc_url_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_URL_ID: + url->id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (url)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_URL_CONTACT_ID: + RETVM_IF(url->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (url)", property_id); + url->contact_id = value; + break; + case CTSVC_PROPERTY_URL_TYPE: + url->type = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(url)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_event_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_event_s *event = (ctsvc_event_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_EVENT_ID: + event->id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (event)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_EVENT_CONTACT_ID: + RETVM_IF(event->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (event)", property_id); + event->contact_id = value; + break; + case CTSVC_PROPERTY_EVENT_TYPE: + event->type = value; + break; + case CTSVC_PROPERTY_EVENT_DATE: + event->date = value; + break; + case CTSVC_PROPERTY_EVENT_LUNAR_DATE: + event->lunar_date = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(event)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_nickname_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_nickname_s *nickname = (ctsvc_nickname_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_NICKNAME_ID: + nickname->id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (nickname)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_NICKNAME_CONTACT_ID: + RETVM_IF(nickname->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (nickname)", property_id); + nickname->contact_id = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(nickname)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_address_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_address_s *address = (ctsvc_address_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_ADDRESS_ID: + address->id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (address)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_ADDRESS_CONTACT_ID: + RETVM_IF(address->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (address)", property_id); + address->contact_id = value; + break; + case CTSVC_PROPERTY_ADDRESS_TYPE: + address->type = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(address)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_messenger_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_messenger_s *messenger = (ctsvc_messenger_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_MESSENGER_ID: + messenger->id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (messenger)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_MESSENGER_CONTACT_ID: + RETVM_IF(messenger->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (messenger)", property_id); + messenger->contact_id = value; + break; + case CTSVC_PROPERTY_MESSENGER_TYPE: + messenger->type = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(messenger)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_group_relation_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_group_relation_s *group = (ctsvc_group_relation_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_GROUP_RELATION_ID: + group->id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (group relation)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID: + RETVM_IF(group->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (group)", property_id); + group->contact_id = value; + break; + case CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID: + group->group_id = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(group relation)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_activity_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_activity_s *activity = (ctsvc_activity_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_ACTIVITY_ID: + activity->id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (activity)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_ACTIVITY_CONTACT_ID: + RETVM_IF(activity->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (activity)", property_id); + activity->contact_id = value; + break; + case CTSVC_PROPERTY_ACTIVITY_TIMESTAMP: + activity->timestamp = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(activity)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_activity_photo_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_activity_photo_s *photo = (ctsvc_activity_photo_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_ACTIVITY_PHOTO_ID: + photo->id = value; + break; + case CTSVC_PROPERTY_ACTIVITY_PHOTO_ACTIVITY_ID: + photo->activity_id = value; + break; + case CTSVC_PROPERTY_ACTIVITY_PHOTO_SORT_INDEX: + photo->sort_index = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(activity)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_profile_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_profile_s *profile = (ctsvc_profile_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_PROFILE_ID: + profile->id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (profile)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_PROFILE_CONTACT_ID: + RETVM_IF(profile->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (profile)", property_id); + profile->contact_id = value; + break; + case CTSVC_PROPERTY_PROFILE_TYPE: + profile->type = value; + break; + case CTSVC_PROPERTY_PROFILE_ORDER: + profile->order = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(profile)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_relationship_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_relationship_s *relationship = (ctsvc_relationship_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_RELATIONSHIP_ID: + relationship->id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (relationship)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_RELATIONSHIP_CONTACT_ID: + RETVM_IF(relationship->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (relationship)", property_id); + relationship->contact_id = value; + break; + case CTSVC_PROPERTY_RELATIONSHIP_TYPE: + relationship->type = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(relationship)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_image_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_image_s *image = (ctsvc_image_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_IMAGE_ID: + image->id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (image)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_IMAGE_CONTACT_ID: + RETVM_IF(image->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (image)", property_id); + image->contact_id = value; + break; + case CTSVC_PROPERTY_IMAGE_TYPE: + image->is_changed = true; + image->type = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(image)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_extension_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_extension_s *extension = (ctsvc_extension_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_EXTENSION_ID: + extension->id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (extension)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_EXTENSION_CONTACT_ID: + RETVM_IF(extension->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (extension)", property_id); + extension->contact_id = value; + break; + case CTSVC_PROPERTY_EXTENSION_DATA1: + extension->data1 = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(extension)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_contact_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_contact_s *contact = (ctsvc_contact_s*)record; + switch(property_id) { + case CTSVC_PROPERTY_CONTACT_DISPLAY_NAME: + *out_str = GET_STR(copy, contact->display_name); + break; + case CTSVC_PROPERTY_CONTACT_RINGTONE: + *out_str = GET_STR(copy, contact->ringtone_path); + break; + case CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL: + *out_str = GET_STR(copy, contact->image_thumbnail_path); + break; + case CTSVC_PROPERTY_CONTACT_UID: + *out_str = GET_STR(copy, contact->uid); + break; + case CTSVC_PROPERTY_CONTACT_VIBRATION: + *out_str = GET_STR(copy, contact->vibration); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_contact_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_contact_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_contact_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_contact_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_contact_get_record_list_p(contacts_record_h record, + unsigned int property_id, contacts_list_h *list) +{ + ctsvc_contact_s *contact = (ctsvc_contact_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_CONTACT_NAME: + *list = (contacts_list_h)contact->name; + break; + case CTSVC_PROPERTY_CONTACT_COMPANY: + *list = (contacts_list_h)contact->company; + break; + case CTSVC_PROPERTY_CONTACT_NOTE: + *list = (contacts_list_h)contact->note; + break; + case CTSVC_PROPERTY_CONTACT_NUMBER: + *list = (contacts_list_h)contact->numbers; + break; + case CTSVC_PROPERTY_CONTACT_EMAIL: + *list = (contacts_list_h)contact->emails; + break; + case CTSVC_PROPERTY_CONTACT_EVENT: + *list = (contacts_list_h)contact->events; + break; + case CTSVC_PROPERTY_CONTACT_MESSENGER: + *list = (contacts_list_h)contact->messengers; + break; + case CTSVC_PROPERTY_CONTACT_ADDRESS: + *list = (contacts_list_h)contact->postal_addrs; + break; + case CTSVC_PROPERTY_CONTACT_URL: + *list = (contacts_list_h)contact->urls; + break; + case CTSVC_PROPERTY_CONTACT_NICKNAME: + *list = (contacts_list_h)contact->nicknames; + break; + case CTSVC_PROPERTY_CONTACT_PROFILE: + *list = (contacts_list_h)contact->profiles; + break; + case CTSVC_PROPERTY_CONTACT_RELATIONSHIP: + *list = (contacts_list_h)contact->relationships; + break; + case CTSVC_PROPERTY_CONTACT_IMAGE: + *list = (contacts_list_h)contact->images; + break; + case CTSVC_PROPERTY_CONTACT_GROUP_RELATION: + *list = (contacts_list_h)contact->grouprelations; + break; + case CTSVC_PROPERTY_CONTACT_EXTENSION: + *list = (contacts_list_h)contact->extensions; + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_contact_get_child_record_count(contacts_record_h record, + unsigned int property_id, unsigned int *count ) +{ + int ret; + contacts_list_h list = NULL; + + *count = 0; + ret = __ctsvc_contact_get_record_list_p(record, property_id, &list); + if (CONTACTS_ERROR_INVALID_PARAMETER == ret) + return ret; + + if(list) + contacts_list_get_count(list, count); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_contact_get_child_record_at_p(contacts_record_h record, + unsigned int property_id, int index, contacts_record_h* out_record ) +{ + int ret; + unsigned int count; + contacts_list_h list = NULL; + + ret = __ctsvc_contact_get_record_list_p(record, property_id, &list); + if (CONTACTS_ERROR_INVALID_PARAMETER == ret) + return ret; + + contacts_list_get_count(list, &count); + if (count < index) { + CTS_ERR("The index(%d) is greather than total length(%d)", index, count); + *out_record = NULL; + return CONTACTS_ERROR_NO_DATA; + } + else + return ctsvc_list_get_nth_record_p(list, index, out_record); +} + +static int __ctsvc_contact_clone_child_record_list(contacts_record_h record, + unsigned int property_id, contacts_list_h* out_list ) +{ + int ret; + unsigned int count; + contacts_list_h list = NULL; + + ret = __ctsvc_contact_get_record_list_p(record, property_id, &list); + if (CONTACTS_ERROR_INVALID_PARAMETER == ret) + return ret; + + contacts_list_get_count(list, &count); + if (count <= 0) { + *out_list = NULL; + return CONTACTS_ERROR_NO_DATA; + } + ctsvc_list_clone(list, out_list); + + return CONTACTS_ERROR_NONE; +} + + +static int __ctsvc_contact_reset_child_record_id(contacts_record_h child_record) +{ + ctsvc_record_s *record = (ctsvc_record_s*)child_record; + + switch(record->r_type) { + case CTSVC_RECORD_NAME: + ((ctsvc_name_s *)record)->id = 0; + break; + case CTSVC_RECORD_COMPANY: + ((ctsvc_company_s *)record)->id = 0; + break; + case CTSVC_RECORD_NOTE: + ((ctsvc_note_s *)record)->id = 0; + break; + case CTSVC_RECORD_NUMBER: + ((ctsvc_number_s *)record)->id = 0; + break; + case CTSVC_RECORD_EMAIL: + ((ctsvc_email_s *)record)->id = 0; + break; + case CTSVC_RECORD_URL: + ((ctsvc_url_s *)record)->id = 0; + break; + case CTSVC_RECORD_EVENT: + ((ctsvc_event_s *)record)->id = 0; + break; + case CTSVC_RECORD_NICKNAME: + ((ctsvc_nickname_s *)record)->id = 0; + break; + case CTSVC_RECORD_ADDRESS: + ((ctsvc_address_s *)record)->id = 0; + break; + case CTSVC_RECORD_MESSENGER: + ((ctsvc_messenger_s *)record)->id = 0; + break; + case CTSVC_RECORD_GROUP_RELATION: + ((ctsvc_group_relation_s *)record)->id = 0; + break; + case CTSVC_RECORD_ACTIVITY: + ((ctsvc_activity_s *)record)->id = 0; + break; + case CTSVC_RECORD_PROFILE: + ((ctsvc_profile_s *)record)->id = 0; + break; + case CTSVC_RECORD_RELATIONSHIP: + ((ctsvc_relationship_s *)record)->id = 0; + break; + case CTSVC_RECORD_IMAGE: + ((ctsvc_image_s *)record)->id = 0; + break; + case CTSVC_RECORD_EXTENSION: + ((ctsvc_extension_s *)record)->id = 0; + break; + default : + CTS_ERR("Invalid parameter : record(%d) is not child of contact", record->r_type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_contact_get_child_record_id(contacts_record_h child_record) +{ + ctsvc_record_s *record = (ctsvc_record_s*)child_record; + + switch(record->r_type) { + case CTSVC_RECORD_NAME: + return ((ctsvc_name_s *)record)->id; + case CTSVC_RECORD_COMPANY: + return ((ctsvc_company_s *)record)->id; + case CTSVC_RECORD_NOTE: + return ((ctsvc_note_s *)record)->id; + case CTSVC_RECORD_NUMBER: + return ((ctsvc_number_s *)record)->id; + case CTSVC_RECORD_EMAIL: + return ((ctsvc_email_s *)record)->id; + case CTSVC_RECORD_URL: + return ((ctsvc_url_s *)record)->id; + case CTSVC_RECORD_EVENT: + return ((ctsvc_event_s *)record)->id; + case CTSVC_RECORD_NICKNAME: + return ((ctsvc_nickname_s *)record)->id; + case CTSVC_RECORD_ADDRESS: + return ((ctsvc_address_s *)record)->id; + case CTSVC_RECORD_MESSENGER: + return ((ctsvc_messenger_s *)record)->id; + case CTSVC_RECORD_GROUP_RELATION: + return ((ctsvc_group_relation_s *)record)->id; + case CTSVC_RECORD_ACTIVITY: + return ((ctsvc_activity_s *)record)->id; + case CTSVC_RECORD_PROFILE: + return ((ctsvc_profile_s *)record)->id; + case CTSVC_RECORD_RELATIONSHIP: + return ((ctsvc_relationship_s *)record)->id; + case CTSVC_RECORD_IMAGE: + return ((ctsvc_image_s *)record)->id; + case CTSVC_RECORD_EXTENSION: + return ((ctsvc_extension_s *)record)->id; + default : + CTS_ERR("Invalid parameter : record(%d) is not child of contact", record->r_type); + return 0; + } + return 0; +} + +static int __ctsvc_contact_add_child_record(contacts_record_h record, + unsigned int property_id, contacts_record_h child_record ) +{ + int ret; + contacts_list_h list = NULL; + ctsvc_record_s *s_record = (ctsvc_record_s *)child_record; + + ret = __ctsvc_contact_get_record_list_p(record, property_id, &list); + if (CONTACTS_ERROR_INVALID_PARAMETER == ret) + return ret; + + if (CTSVC_RECORD_NAME == s_record->r_type && 1 == ((ctsvc_list_s *)list)->count) { + CTS_ERR("This type(%d) of child_record can not be added anymore", s_record->r_type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = __ctsvc_contact_reset_child_record_id(child_record); + if (CONTACTS_ERROR_INVALID_PARAMETER == ret) + return ret; + + ctsvc_list_add_child(list, child_record); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_contact_remove_child_record(contacts_record_h record, + unsigned int property_id, contacts_record_h child_record ) +{ + int id; + int ret; + contacts_list_h list = NULL; + + ret = __ctsvc_contact_get_record_list_p(record, property_id, &list); + if (CONTACTS_ERROR_INVALID_PARAMETER == ret) + return ret; + + id = __ctsvc_contact_get_child_record_id(child_record); + ctsvc_list_remove_child(list, child_record, (id?true:false)); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_simple_contact_get_str_real(contacts_record_h record, + unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_simple_contact_s *contact = (ctsvc_simple_contact_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_CONTACT_DISPLAY_NAME: + *out_str = GET_STR(copy, contact->display_name); + break; + case CTSVC_PROPERTY_CONTACT_RINGTONE: + *out_str = GET_STR(copy, contact->ringtone_path); + break; + case CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL: + *out_str = GET_STR(copy, contact->image_thumbnail_path); + break; + case CTSVC_PROPERTY_CONTACT_UID: + *out_str = GET_STR(copy, contact->uid); + break; + case CTSVC_PROPERTY_CONTACT_VIBRATION: + *out_str = GET_STR(copy, contact->vibration); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(simple_contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_simple_contact_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_simple_contact_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_simple_contact_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_simple_contact_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_name_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_name_s *name = (ctsvc_name_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_NAME_FIRST: + *out_str = GET_STR(copy, name->first); + break; + case CTSVC_PROPERTY_NAME_LAST: + *out_str = GET_STR(copy, name->last); + break; + case CTSVC_PROPERTY_NAME_ADDITION: + *out_str = GET_STR(copy, name->addition); + break; + case CTSVC_PROPERTY_NAME_SUFFIX: + *out_str = GET_STR(copy, name->suffix); + break; + case CTSVC_PROPERTY_NAME_PREFIX: + *out_str = GET_STR(copy, name->prefix); + break; + case CTSVC_PROPERTY_NAME_PHONETIC_FIRST: + *out_str = GET_STR(copy, name->phonetic_first); + break; + case CTSVC_PROPERTY_NAME_PHONETIC_MIDDLE: + *out_str = GET_STR(copy, name->phonetic_middle); + break; + case CTSVC_PROPERTY_NAME_PHONETIC_LAST: + *out_str = GET_STR(copy, name->phonetic_last); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(name)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_name_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_name_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_name_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_name_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_company_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_company_s *company = (ctsvc_company_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_COMPANY_LABEL: + *out_str = GET_STR(copy, company->label); + break; + case CTSVC_PROPERTY_COMPANY_NAME: + *out_str = GET_STR(copy, company->name); + break; + case CTSVC_PROPERTY_COMPANY_DEPARTMENT: + *out_str = GET_STR(copy, company->department); + break; + case CTSVC_PROPERTY_COMPANY_JOB_TITLE: + *out_str = GET_STR(copy, company->job_title); + break; + case CTSVC_PROPERTY_COMPANY_ASSISTANT_NAME: + *out_str = GET_STR(copy, company->assistant_name); + break; + case CTSVC_PROPERTY_COMPANY_ROLE: + *out_str = GET_STR(copy, company->role); + break; + case CTSVC_PROPERTY_COMPANY_LOGO: + *out_str = GET_STR(copy, company->logo); + break; + case CTSVC_PROPERTY_COMPANY_LOCATION: + *out_str = GET_STR(copy, company->location); + break; + case CTSVC_PROPERTY_COMPANY_DESCRIPTION: + *out_str = GET_STR(copy, company->description); + break; + case CTSVC_PROPERTY_COMPANY_PHONETIC_NAME: + *out_str = GET_STR(copy, company->phonetic_name); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(company)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_company_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_company_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_company_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_company_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_note_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_note_s *note = (ctsvc_note_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_NOTE_NOTE: + *out_str = GET_STR(copy, note->note); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(note)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_note_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_note_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_note_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_note_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_number_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_number_s *number = (ctsvc_number_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_NUMBER_LABEL: + *out_str = GET_STR(copy, number->label); + break; + case CTSVC_PROPERTY_NUMBER_NUMBER: + *out_str = GET_STR(copy, number->number); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(number)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_number_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_number_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_number_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_number_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_email_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_email_s *email = (ctsvc_email_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_EMAIL_EMAIL: + *out_str = GET_STR(copy, email->email_addr); + break; + case CTSVC_PROPERTY_EMAIL_LABEL: + *out_str = GET_STR(copy, email->label); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(email)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_email_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_email_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_email_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_email_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_url_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_url_s *url = (ctsvc_url_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_URL_URL: + *out_str = GET_STR(copy, url->url); + break; + case CTSVC_PROPERTY_URL_LABEL: + *out_str = GET_STR(copy, url->label); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(url)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_url_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_url_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_url_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_url_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_event_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_event_s *event = (ctsvc_event_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_EVENT_LABEL: + *out_str = GET_STR(copy, event->label); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(event)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_event_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_event_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_event_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_event_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_nickname_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_nickname_s *nickname = (ctsvc_nickname_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_NICKNAME_NAME: + *out_str = GET_STR(copy, nickname->nickname); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(nickname)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_nickname_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_nickname_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_nickname_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_nickname_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_address_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_address_s *address = (ctsvc_address_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_ADDRESS_LABEL: + *out_str = GET_STR(copy, address->label); + break; + case CTSVC_PROPERTY_ADDRESS_POSTBOX: + *out_str = GET_STR(copy, address->pobox); + break; + case CTSVC_PROPERTY_ADDRESS_POSTAL_CODE: + *out_str = GET_STR(copy, address->postalcode); + break; + case CTSVC_PROPERTY_ADDRESS_REGION: + *out_str = GET_STR(copy, address->region); + break; + case CTSVC_PROPERTY_ADDRESS_LOCALITY: + *out_str = GET_STR(copy, address->locality); + break; + case CTSVC_PROPERTY_ADDRESS_STREET: + *out_str = GET_STR(copy, address->street); + break; + case CTSVC_PROPERTY_ADDRESS_COUNTRY: + *out_str = GET_STR(copy, address->country); + break; + case CTSVC_PROPERTY_ADDRESS_EXTENDED: + *out_str = GET_STR(copy, address->extended); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(address)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_address_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_address_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_address_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_address_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_messenger_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_messenger_s *messenger = (ctsvc_messenger_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_MESSENGER_LABEL: + *out_str = GET_STR(copy, messenger->label); + break; + case CTSVC_PROPERTY_MESSENGER_IM_ID: + *out_str = GET_STR(copy, messenger->im_id); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(messenger)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_messenger_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_messenger_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_messenger_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_messenger_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_group_relation_get_str_real(contacts_record_h record, + unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_group_relation_s *group_relation = (ctsvc_group_relation_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_GROUP_RELATION_GROUP_NAME: + *out_str = GET_STR(copy, group_relation->group_name); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(group_relation)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_group_relation_get_str_p(contacts_record_h record, + unsigned int property_id, char** out_str) +{ + return __ctsvc_group_relation_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_group_relation_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_group_relation_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_activity_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_activity_s *activity = (ctsvc_activity_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_ACTIVITY_SOURCE_NAME: + *out_str = GET_STR(copy, activity->source_name); + break; + case CTSVC_PROPERTY_ACTIVITY_STATUS: + *out_str = GET_STR(copy, activity->status); + break; + case CTSVC_PROPERTY_ACTIVITY_SYNC_DATA1: + *out_str = GET_STR(copy, activity->sync_data1); + break; + case CTSVC_PROPERTY_ACTIVITY_SYNC_DATA2: + *out_str = GET_STR(copy, activity->sync_data2); + break; + case CTSVC_PROPERTY_ACTIVITY_SYNC_DATA3: + *out_str = GET_STR(copy, activity->sync_data3); + break; + case CTSVC_PROPERTY_ACTIVITY_SYNC_DATA4: + *out_str = GET_STR(copy, activity->sync_data4); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(activity)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_activity_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_activity_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_activity_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_activity_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_activity_photo_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_activity_photo_s *photo = (ctsvc_activity_photo_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_ACTIVITY_PHOTO_URL: + *out_str = GET_STR(copy, photo->photo_url); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(activity)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_activity_photo_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_activity_photo_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_activity_photo_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_activity_photo_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_profile_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_profile_s *profile = (ctsvc_profile_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_PROFILE_LABEL: + *out_str = GET_STR(copy, profile->label); + break; + case CTSVC_PROPERTY_PROFILE_UID: + *out_str = GET_STR(copy, profile->uid); + break; + case CTSVC_PROPERTY_PROFILE_TEXT: + *out_str = GET_STR(copy, profile->text); + break; + case CTSVC_PROPERTY_PROFILE_APPSVC_OPERATION: + *out_str = GET_STR(copy, profile->appsvc_operation); + break; + case CTSVC_PROPERTY_PROFILE_DATA1: + *out_str = GET_STR(copy, profile->data1); + break; + case CTSVC_PROPERTY_PROFILE_DATA2: + *out_str = GET_STR(copy, profile->data2); + break; + case CTSVC_PROPERTY_PROFILE_DATA3: + *out_str = GET_STR(copy, profile->data3); + break; + case CTSVC_PROPERTY_PROFILE_DATA4: + *out_str = GET_STR(copy, profile->data4); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(profile)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_profile_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_profile_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_profile_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_profile_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_relationship_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_relationship_s *relationship = (ctsvc_relationship_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_RELATIONSHIP_LABEL: + *out_str = GET_STR(copy, relationship->label); + break; + case CTSVC_PROPERTY_RELATIONSHIP_NAME: + *out_str = GET_STR(copy, relationship->name); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(relationship)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_relationship_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_relationship_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_relationship_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_relationship_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_image_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_image_s *image = (ctsvc_image_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_IMAGE_LABEL: + *out_str = GET_STR(copy, image->label); + break; + case CTSVC_PROPERTY_IMAGE_PATH: + *out_str = GET_STR(copy, image->path); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(image)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_image_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_image_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_image_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_image_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_extension_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_extension_s *extension = (ctsvc_extension_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_EXTENSION_DATA2: + *out_str = GET_STR(copy, extension->data2); + break; + case CTSVC_PROPERTY_EXTENSION_DATA3: + *out_str = GET_STR(copy, extension->data3); + break; + case CTSVC_PROPERTY_EXTENSION_DATA4: + *out_str = GET_STR(copy, extension->data4); + break; + case CTSVC_PROPERTY_EXTENSION_DATA5: + *out_str = GET_STR(copy, extension->data5); + break; + case CTSVC_PROPERTY_EXTENSION_DATA6: + *out_str = GET_STR(copy, extension->data6); + break; + case CTSVC_PROPERTY_EXTENSION_DATA7: + *out_str = GET_STR(copy, extension->data7); + break; + case CTSVC_PROPERTY_EXTENSION_DATA8: + *out_str = GET_STR(copy, extension->data8); + break; + case CTSVC_PROPERTY_EXTENSION_DATA9: + *out_str = GET_STR(copy, extension->data9); + break; + case CTSVC_PROPERTY_EXTENSION_DATA10: + *out_str = GET_STR(copy, extension->data10); + break; + case CTSVC_PROPERTY_EXTENSION_DATA11: + *out_str = GET_STR(copy, extension->data11); + break; + case CTSVC_PROPERTY_EXTENSION_DATA12: + *out_str = GET_STR(copy, extension->data12); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(extension)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_extension_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_extension_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_extension_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_extension_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_contact_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_contact_s *contact = (ctsvc_contact_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_CONTACT_DISPLAY_NAME: + FREEandSTRDUP(contact->display_name, str); + contact->display_name_changed = true; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_CONTACT_RINGTONE: + FREEandSTRDUP(contact->ringtone_path, str); + contact->ringtone_changed = true; + break; + case CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL: + FREEandSTRDUP(contact->image_thumbnail_path, str); + contact->image_thumbnail_changed = true; + break; + case CTSVC_PROPERTY_CONTACT_UID: + FREEandSTRDUP(contact->uid, str); + contact->uid_changed = true; + break; + case CTSVC_PROPERTY_CONTACT_VIBRATION: + FREEandSTRDUP(contact->vibration, str); + contact->vibration_changed = true; + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + + +static int __ctsvc_simple_contact_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_simple_contact_s *contact = (ctsvc_simple_contact_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_CONTACT_DISPLAY_NAME: + FREEandSTRDUP(contact->display_name, str); + contact->display_name_changed = true; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_CONTACT_RINGTONE: + FREEandSTRDUP(contact->ringtone_path, str); + contact->ringtone_changed = true; + break; + case CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL: + FREEandSTRDUP(contact->image_thumbnail_path, str); + contact->image_thumbnail_changed = true; + break; + case CTSVC_PROPERTY_CONTACT_UID: + FREEandSTRDUP(contact->uid, str); + contact->uid_changed = true; + break; + case CTSVC_PROPERTY_CONTACT_VIBRATION: + FREEandSTRDUP(contact->vibration, str); + contact->vibration_changed = true; + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(simple_contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_name_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_name_s *name = (ctsvc_name_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_NAME_FIRST: + FREEandSTRDUP(name->first, str); + break; + case CTSVC_PROPERTY_NAME_LAST: + FREEandSTRDUP(name->last, str); + break; + case CTSVC_PROPERTY_NAME_ADDITION: + FREEandSTRDUP(name->addition, str); + break; + case CTSVC_PROPERTY_NAME_SUFFIX: + FREEandSTRDUP(name->suffix, str); + break; + case CTSVC_PROPERTY_NAME_PREFIX: + FREEandSTRDUP(name->prefix, str); + break; + case CTSVC_PROPERTY_NAME_PHONETIC_FIRST: + FREEandSTRDUP(name->phonetic_first, str); + break; + case CTSVC_PROPERTY_NAME_PHONETIC_MIDDLE: + FREEandSTRDUP(name->phonetic_middle, str); + break; + case CTSVC_PROPERTY_NAME_PHONETIC_LAST: + FREEandSTRDUP(name->phonetic_last, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(name)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + name->is_changed = true; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_company_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_company_s *company = (ctsvc_company_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_COMPANY_LABEL: + FREEandSTRDUP(company->label, str); + break; + case CTSVC_PROPERTY_COMPANY_NAME: + FREEandSTRDUP(company->name, str); + break; + case CTSVC_PROPERTY_COMPANY_DEPARTMENT: + FREEandSTRDUP(company->department, str); + break; + case CTSVC_PROPERTY_COMPANY_JOB_TITLE: + FREEandSTRDUP(company->job_title, str); + break; + case CTSVC_PROPERTY_COMPANY_ASSISTANT_NAME: + FREEandSTRDUP(company->assistant_name, str); + break; + case CTSVC_PROPERTY_COMPANY_ROLE: + FREEandSTRDUP(company->role, str); + break; + case CTSVC_PROPERTY_COMPANY_LOGO: + FREEandSTRDUP(company->logo, str); + break; + case CTSVC_PROPERTY_COMPANY_LOCATION: + FREEandSTRDUP(company->location, str); + break; + case CTSVC_PROPERTY_COMPANY_DESCRIPTION: + FREEandSTRDUP(company->description, str); + break; + case CTSVC_PROPERTY_COMPANY_PHONETIC_NAME: + FREEandSTRDUP(company->phonetic_name, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(company)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_note_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_note_s *note = (ctsvc_note_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_NOTE_NOTE: + FREEandSTRDUP(note->note, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(note)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_number_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_number_s *number = (ctsvc_number_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_NUMBER_LABEL: + FREEandSTRDUP(number->label, str); + break; + case CTSVC_PROPERTY_NUMBER_NUMBER: + FREEandSTRDUP(number->number, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(number)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_email_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_email_s *email = (ctsvc_email_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_EMAIL_EMAIL: + FREEandSTRDUP(email->email_addr, str); + break; + case CTSVC_PROPERTY_EMAIL_LABEL: + FREEandSTRDUP(email->label, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(email)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_url_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_url_s *url = (ctsvc_url_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_URL_URL: + FREEandSTRDUP(url->url, str); + break; + case CTSVC_PROPERTY_URL_LABEL: + FREEandSTRDUP(url->label, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(url)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_event_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_event_s *event = (ctsvc_event_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_EVENT_LABEL: + FREEandSTRDUP(event->label, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(event)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_nickname_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_nickname_s *nickname = (ctsvc_nickname_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_NICKNAME_NAME: + FREEandSTRDUP(nickname->nickname, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(nickname)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_address_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_address_s *address = (ctsvc_address_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_ADDRESS_LABEL: + FREEandSTRDUP(address->label, str); + break; + case CTSVC_PROPERTY_ADDRESS_POSTBOX: + FREEandSTRDUP(address->pobox, str); + break; + case CTSVC_PROPERTY_ADDRESS_POSTAL_CODE: + FREEandSTRDUP(address->postalcode, str); + break; + case CTSVC_PROPERTY_ADDRESS_REGION: + FREEandSTRDUP(address->region, str); + break; + case CTSVC_PROPERTY_ADDRESS_LOCALITY: + FREEandSTRDUP(address->locality, str); + break; + case CTSVC_PROPERTY_ADDRESS_STREET: + FREEandSTRDUP(address->street, str); + break; + case CTSVC_PROPERTY_ADDRESS_COUNTRY: + FREEandSTRDUP(address->country, str); + break; + case CTSVC_PROPERTY_ADDRESS_EXTENDED: + FREEandSTRDUP(address->extended, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(address)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_messenger_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_messenger_s *messenger = (ctsvc_messenger_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_MESSENGER_LABEL: + FREEandSTRDUP(messenger->label, str); + break; + case CTSVC_PROPERTY_MESSENGER_IM_ID: + FREEandSTRDUP(messenger->im_id, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(messenger)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_group_relation_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_group_relation_s *group_relation = (ctsvc_group_relation_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_GROUP_RELATION_GROUP_NAME: + FREEandSTRDUP(group_relation->group_name, str); + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (group_relation)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(group_relation)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_activity_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_activity_s *activity = (ctsvc_activity_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_ACTIVITY_SOURCE_NAME: + FREEandSTRDUP(activity->source_name, str); + break; + case CTSVC_PROPERTY_ACTIVITY_STATUS: + FREEandSTRDUP(activity->status, str); + break; + case CTSVC_PROPERTY_ACTIVITY_SYNC_DATA1: + FREEandSTRDUP(activity->sync_data1, str); + break; + case CTSVC_PROPERTY_ACTIVITY_SYNC_DATA2: + FREEandSTRDUP(activity->sync_data2, str); + break; + case CTSVC_PROPERTY_ACTIVITY_SYNC_DATA3: + FREEandSTRDUP(activity->sync_data3, str); + break; + case CTSVC_PROPERTY_ACTIVITY_SYNC_DATA4: + FREEandSTRDUP(activity->sync_data4, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(activity)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_activity_photo_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_activity_photo_s *photo = (ctsvc_activity_photo_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_ACTIVITY_PHOTO_URL: + FREEandSTRDUP(photo->photo_url, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(activity)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_profile_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_profile_s *profile = (ctsvc_profile_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_PROFILE_LABEL: + FREEandSTRDUP(profile->label, str); + break; + case CTSVC_PROPERTY_PROFILE_UID: + FREEandSTRDUP(profile->uid, str); + break; + case CTSVC_PROPERTY_PROFILE_TEXT: + FREEandSTRDUP(profile->text, str); + break; + case CTSVC_PROPERTY_PROFILE_APPSVC_OPERATION: + FREEandSTRDUP(profile->appsvc_operation, str); + break; + case CTSVC_PROPERTY_PROFILE_DATA1: + FREEandSTRDUP(profile->data1, str); + break; + case CTSVC_PROPERTY_PROFILE_DATA2: + FREEandSTRDUP(profile->data2, str); + break; + case CTSVC_PROPERTY_PROFILE_DATA3: + FREEandSTRDUP(profile->data3, str); + break; + case CTSVC_PROPERTY_PROFILE_DATA4: + FREEandSTRDUP(profile->data4, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(profile)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_relationship_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_relationship_s *relationship = (ctsvc_relationship_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_RELATIONSHIP_LABEL: + FREEandSTRDUP(relationship->label, str); + break; + case CTSVC_PROPERTY_RELATIONSHIP_NAME: + FREEandSTRDUP(relationship->name, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(relationship)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_image_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_image_s *image = (ctsvc_image_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_IMAGE_LABEL: + image->is_changed = true; + FREEandSTRDUP(image->label, str); + break; + case CTSVC_PROPERTY_IMAGE_PATH: + image->is_changed = true; + FREEandSTRDUP(image->path, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(image)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_extension_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_extension_s *extension = (ctsvc_extension_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_EXTENSION_DATA2: + FREEandSTRDUP(extension->data2, str); + break; + case CTSVC_PROPERTY_EXTENSION_DATA3: + FREEandSTRDUP(extension->data3, str); + break; + case CTSVC_PROPERTY_EXTENSION_DATA4: + FREEandSTRDUP(extension->data4, str); + break; + case CTSVC_PROPERTY_EXTENSION_DATA5: + FREEandSTRDUP(extension->data5, str); + break; + case CTSVC_PROPERTY_EXTENSION_DATA6: + FREEandSTRDUP(extension->data6, str); + break; + case CTSVC_PROPERTY_EXTENSION_DATA7: + FREEandSTRDUP(extension->data7, str); + break; + case CTSVC_PROPERTY_EXTENSION_DATA8: + FREEandSTRDUP(extension->data8, str); + break; + case CTSVC_PROPERTY_EXTENSION_DATA9: + FREEandSTRDUP(extension->data9, str); + break; + case CTSVC_PROPERTY_EXTENSION_DATA10: + FREEandSTRDUP(extension->data10, str); + break; + case CTSVC_PROPERTY_EXTENSION_DATA11: + FREEandSTRDUP(extension->data11, str); + break; + case CTSVC_PROPERTY_EXTENSION_DATA12: + FREEandSTRDUP(extension->data12, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(extension)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_contact_get_bool(contacts_record_h record, unsigned int property_id, bool *value ) +{ + ctsvc_contact_s *contact = (ctsvc_contact_s *)record; + switch (property_id) { + case CTSVC_PROPERTY_CONTACT_IS_FAVORITE: + *value = contact->is_favorite; + break; + case CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER: + *value = contact->has_phonenumber; + break; + case CTSVC_PROPERTY_CONTACT_HAS_EMAIL: + *value = contact->has_email; + break; + default: + CTS_ERR("Invalid parameter : property_id(0x%x) is not supported in value(contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_simple_contact_get_bool(contacts_record_h record, unsigned int property_id, bool *value ) +{ + ctsvc_simple_contact_s *contact = (ctsvc_simple_contact_s *)record; + switch (property_id) { + case CTSVC_PROPERTY_CONTACT_IS_FAVORITE: + *value = contact->is_favorite; + break; + case CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER: + *value = contact->has_phonenumber; + break; + case CTSVC_PROPERTY_CONTACT_HAS_EMAIL: + *value = contact->has_email; + break; + default: + CTS_ERR("Invalid parameter : property_id(0x%x) is not supported in value(contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + + +static int __ctsvc_number_get_bool(contacts_record_h record, unsigned int property_id, bool *value ) +{ + ctsvc_number_s *number = (ctsvc_number_s*)record; + switch (property_id) { + case CTSVC_PROPERTY_NUMBER_IS_DEFAULT: + *value = number->is_default; + break; + default: + CTS_ERR("Invalid parameter : property_id(0x%x) is not supported in value(number)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_email_get_bool(contacts_record_h record, unsigned int property_id, bool *value ) +{ + ctsvc_email_s *email = (ctsvc_email_s *)record; + switch (property_id) { + case CTSVC_PROPERTY_EMAIL_IS_DEFAULT: + *value = email->is_default; + break; + default: + CTS_ERR("Invalid parameter : property_id(0x%x) is not supported in value(email)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_event_get_bool(contacts_record_h record, unsigned int property_id, bool *value ) +{ + ctsvc_event_s *event = (ctsvc_event_s *)record; + switch (property_id) { + case CTSVC_PROPERTY_EVENT_IS_LUNAR: + *value = event->is_lunar; + break; + default: + CTS_ERR("Invalid parameter : property_id(0x%x) is not supported in value(event)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_image_get_bool(contacts_record_h record, unsigned int property_id, bool *value ) +{ + ctsvc_image_s *image = (ctsvc_image_s *)record; + switch (property_id) { + case CTSVC_PROPERTY_IMAGE_IS_DEFAULT: + *value = image->is_default; + break; + default: + CTS_ERR("Invalid parameter : property_id(0x%x) is not supported in value(image)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_address_get_bool(contacts_record_h record, unsigned int property_id, bool *value ) +{ + ctsvc_address_s *address = (ctsvc_address_s *)record; + switch (property_id) { + case CTSVC_PROPERTY_ADDRESS_IS_DEFAULT: + *value = address->is_default; + break; + default: + CTS_ERR("Invalid parameter : property_id(0x%x) is not supported in value(address)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_contact_set_bool(contacts_record_h record, unsigned int property_id, bool value) +{ + ctsvc_contact_s *contact = (ctsvc_contact_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_CONTACT_IS_FAVORITE: + contact->is_favorite = value; + break; + case CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER: + contact->has_phonenumber = value; + break; + case CTSVC_PROPERTY_CONTACT_HAS_EMAIL: + contact->has_email = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value(contact)", property_id); + break; +*/ + default: + CTS_ERR("Invalid parameter : property_id(0x%x) is not supported in value(contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_number_set_bool(contacts_record_h record, unsigned int property_id, bool value) +{ + ctsvc_number_s *number = (ctsvc_number_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_NUMBER_IS_DEFAULT: + number->is_default = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(number)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_email_set_bool(contacts_record_h record, unsigned int property_id, bool value) +{ + ctsvc_email_s *email = (ctsvc_email_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_EMAIL_IS_DEFAULT: + email->is_default = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(email)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_event_set_bool(contacts_record_h record, unsigned int property_id, bool value) +{ + ctsvc_event_s *event = (ctsvc_event_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_EVENT_IS_LUNAR: + event->is_lunar = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(event)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_image_set_bool(contacts_record_h record, unsigned int property_id, bool value) +{ + ctsvc_image_s *image = (ctsvc_image_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_IMAGE_IS_DEFAULT: + image->is_default = value; + break; + default: + ERR("Invalid parameter : property_id(0x%x) is not supported in value(image)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_address_set_bool(contacts_record_h record, unsigned int property_id, bool value) +{ + ctsvc_address_s *address = (ctsvc_address_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_ADDRESS_IS_DEFAULT: + address->is_default = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(address)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_contact_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_contact_s *out_data = NULL; + ctsvc_contact_s *src_data = NULL; + + src_data = (ctsvc_contact_s*)record; + out_data = calloc(1, sizeof(ctsvc_contact_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_contact_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->display_name_changed = src_data->display_name_changed; + out_data->uid_changed = src_data->uid_changed; + out_data->vibration_changed = src_data->vibration_changed; + out_data->image_thumbnail_changed = src_data->image_thumbnail_changed; + out_data->ringtone_changed = src_data->ringtone_changed; + + out_data->id = src_data->id; + out_data->person_id = src_data->person_id; + out_data->addressbook_id = src_data->addressbook_id; + out_data->changed_time = src_data->changed_time; + out_data->display_source_type = src_data->display_source_type; + out_data->has_phonenumber = src_data->has_phonenumber; + out_data->has_email = src_data->has_email; + out_data->is_favorite = src_data->is_favorite; + out_data->is_restricted = src_data->is_restricted; + + out_data->display_name = SAFE_STRDUP(src_data->display_name); + out_data->reverse_display_name = SAFE_STRDUP(src_data->reverse_display_name); + out_data->uid = SAFE_STRDUP(src_data->uid); + out_data->ringtone_path = SAFE_STRDUP(src_data->ringtone_path); + out_data->vibration = SAFE_STRDUP(src_data->vibration); + out_data->image_thumbnail_path = SAFE_STRDUP(src_data->image_thumbnail_path); + out_data->sortkey = SAFE_STRDUP(src_data->sortkey); + out_data->reverse_sortkey = SAFE_STRDUP(src_data->reverse_sortkey); + out_data->sync_data1 = SAFE_STRDUP(src_data->sync_data1); + out_data->sync_data2 = SAFE_STRDUP(src_data->sync_data2); + out_data->sync_data3 = SAFE_STRDUP(src_data->sync_data3); + out_data->sync_data4 = SAFE_STRDUP(src_data->sync_data4); + + ctsvc_list_clone((contacts_list_h)src_data->name, (contacts_list_h*)&out_data->name); + out_data->name->l_type = CTSVC_RECORD_NAME; + + ctsvc_list_clone((contacts_list_h)src_data->company, (contacts_list_h*)&out_data->company); + out_data->company->l_type = CTSVC_RECORD_COMPANY; + + ctsvc_list_clone((contacts_list_h)src_data->note, (contacts_list_h*)&out_data->note); + out_data->note->l_type = CTSVC_RECORD_NOTE; + + ctsvc_list_clone((contacts_list_h)src_data->numbers, (contacts_list_h*)&out_data->numbers); + out_data->numbers->l_type = CTSVC_RECORD_NUMBER; + + ctsvc_list_clone((contacts_list_h)src_data->emails, (contacts_list_h*)&out_data->emails); + out_data->emails->l_type = CTSVC_RECORD_EMAIL; + + ctsvc_list_clone((contacts_list_h)src_data->grouprelations, (contacts_list_h*)&out_data->grouprelations); + out_data->grouprelations->l_type = CTSVC_RECORD_GROUP_RELATION; + + ctsvc_list_clone((contacts_list_h)src_data->events, (contacts_list_h*)&out_data->events); + out_data->events->l_type = CTSVC_RECORD_EVENT; + + ctsvc_list_clone((contacts_list_h)src_data->messengers, (contacts_list_h*)&out_data->messengers); + out_data->messengers->l_type = CTSVC_RECORD_MESSENGER; + + ctsvc_list_clone((contacts_list_h)src_data->postal_addrs, (contacts_list_h*)&out_data->postal_addrs); + out_data->postal_addrs->l_type = CTSVC_RECORD_ADDRESS; + + ctsvc_list_clone((contacts_list_h)src_data->urls, (contacts_list_h*)&out_data->urls); + out_data->urls->l_type = CTSVC_RECORD_URL; + + ctsvc_list_clone((contacts_list_h)src_data->nicknames, (contacts_list_h*)&out_data->nicknames); + out_data->nicknames->l_type = CTSVC_RECORD_NICKNAME; + + ctsvc_list_clone((contacts_list_h)src_data->profiles, (contacts_list_h*)&out_data->profiles); + out_data->profiles->l_type = CTSVC_RECORD_PROFILE; + + ctsvc_list_clone((contacts_list_h)src_data->relationships, (contacts_list_h*)&out_data->relationships); + out_data->relationships->l_type = CTSVC_RECORD_RELATIONSHIP; + + ctsvc_list_clone((contacts_list_h)src_data->images, (contacts_list_h*)&out_data->images); + out_data->images->l_type = CTSVC_RECORD_IMAGE; + + ctsvc_list_clone((contacts_list_h)src_data->extensions, (contacts_list_h*)&out_data->extensions); + out_data->extensions->l_type = CTSVC_RECORD_EXTENSION; + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + + return CONTACTS_ERROR_NONE; +} + + +static int __ctsvc_activity_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_activity_s *out_data = NULL; + ctsvc_activity_s *src_data = NULL; + + src_data = (ctsvc_activity_s*)record; + out_data = calloc(1, sizeof(ctsvc_activity_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_activity_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->contact_id = src_data->contact_id; + out_data->timestamp = src_data->timestamp; + out_data->source_name = SAFE_STRDUP(src_data->source_name); + out_data->status = SAFE_STRDUP(src_data->status); + out_data->sync_data1 = SAFE_STRDUP(src_data->sync_data1); + out_data->sync_data2 = SAFE_STRDUP(src_data->sync_data2); + out_data->sync_data3 = SAFE_STRDUP(src_data->sync_data3); + out_data->sync_data4 = SAFE_STRDUP(src_data->sync_data4); + + ctsvc_list_clone((contacts_list_h)src_data->photos, (contacts_list_h*)&out_data->photos); + out_data->photos->l_type = CTSVC_RECORD_ACTIVITY_PHOTO; + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_activity_photo_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_activity_photo_s *out_data = NULL; + ctsvc_activity_photo_s *src_data = NULL; + + src_data = (ctsvc_activity_photo_s*)record; + out_data = calloc(1, sizeof(ctsvc_activity_photo_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_activity_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->activity_id = src_data->activity_id; + out_data->photo_url = SAFE_STRDUP(src_data->photo_url); + out_data->sort_index = src_data->sort_index; + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_address_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_address_s *out_data = NULL; + ctsvc_address_s *src_data = NULL; + + src_data = (ctsvc_address_s*)record; + out_data = calloc(1, sizeof(ctsvc_address_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_address_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->contact_id = src_data->contact_id; + out_data->type = src_data->type; + out_data->is_default = src_data->is_default; + out_data->label = SAFE_STRDUP(src_data->label); + out_data->pobox = SAFE_STRDUP(src_data->pobox); + out_data->postalcode = SAFE_STRDUP(src_data->postalcode); + out_data->region = SAFE_STRDUP(src_data->region); + out_data->locality = SAFE_STRDUP(src_data->locality); + out_data->street = SAFE_STRDUP(src_data->street); + out_data->extended = SAFE_STRDUP(src_data->extended); + out_data->country = SAFE_STRDUP(src_data->country); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_company_clone(contacts_record_h record, contacts_record_h *out_record) +{ + + ctsvc_company_s *out_data = NULL; + ctsvc_company_s *src_data = NULL; + + src_data = (ctsvc_company_s*)record; + out_data = calloc(1, sizeof(ctsvc_company_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_company_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->logo_changed= src_data->logo_changed; + out_data->contact_id = src_data->contact_id; + out_data->name = SAFE_STRDUP(src_data->name); + out_data->department = SAFE_STRDUP(src_data->department); + out_data->job_title = SAFE_STRDUP(src_data->job_title); + out_data->role = SAFE_STRDUP(src_data->role); + out_data->assistant_name = SAFE_STRDUP(src_data->assistant_name); + out_data->logo = SAFE_STRDUP(src_data->logo); + out_data->location = SAFE_STRDUP(src_data->location); + out_data->description = SAFE_STRDUP(src_data->description); + out_data->phonetic_name = SAFE_STRDUP(src_data->phonetic_name); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_email_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_email_s *out_data = NULL; + ctsvc_email_s *src_data = NULL; + + src_data = (ctsvc_email_s*)record; + out_data = calloc(1, sizeof(ctsvc_email_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_email_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->is_default = src_data->is_default; + out_data->contact_id = src_data->contact_id; + out_data->type = src_data->type; + out_data->label = SAFE_STRDUP(src_data->label); + out_data->email_addr = SAFE_STRDUP(src_data->email_addr); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_event_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_event_s *out_data = NULL; + ctsvc_event_s *src_data = NULL; + + src_data = (ctsvc_event_s*)record; + out_data = calloc(1, sizeof(ctsvc_event_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_event_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->contact_id = src_data->contact_id; + out_data->type = src_data->type; + out_data->label = SAFE_STRDUP(src_data->label); + out_data->date = src_data->date; + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_extension_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_extension_s *out_data = NULL; + ctsvc_extension_s *src_data = NULL; + + src_data = (ctsvc_extension_s*)record; + out_data = calloc(1, sizeof(ctsvc_extension_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_extension_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->contact_id = src_data->contact_id; +// out_data->is_default = src_data->is_default; + out_data->data1 = src_data->data1; + out_data->data2 = SAFE_STRDUP(src_data->data2); + out_data->data3 = SAFE_STRDUP(src_data->data3); + out_data->data4 = SAFE_STRDUP(src_data->data4); + out_data->data5 = SAFE_STRDUP(src_data->data5); + out_data->data6 = SAFE_STRDUP(src_data->data6); + out_data->data7 = SAFE_STRDUP(src_data->data7); + out_data->data8 = SAFE_STRDUP(src_data->data8); + out_data->data9 = SAFE_STRDUP(src_data->data9); + out_data->data10 = SAFE_STRDUP(src_data->data10); + out_data->data11 = SAFE_STRDUP(src_data->data11); + out_data->data12 = SAFE_STRDUP(src_data->data12); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_group_relation_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_group_relation_s *out_data = NULL; + ctsvc_group_relation_s *src_data = NULL; + + src_data = (ctsvc_group_relation_s*)record; + out_data = calloc(1, sizeof(ctsvc_group_relation_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_group_relation_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->group_id = src_data->group_id; + out_data->contact_id = src_data->contact_id; + out_data->group_name = SAFE_STRDUP(src_data->group_name); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_messenger_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_messenger_s *out_data = NULL; + ctsvc_messenger_s *src_data = NULL; + + src_data = (ctsvc_messenger_s*)record; + out_data = calloc(1, sizeof(ctsvc_messenger_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_messenger_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->contact_id = src_data->contact_id; + out_data->type = src_data->type; + out_data->label = SAFE_STRDUP(src_data->label); + out_data->im_id = SAFE_STRDUP(src_data->im_id); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_name_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_name_s *out_data = NULL; + ctsvc_name_s *src_data = NULL; + + src_data = (ctsvc_name_s*)record; + out_data = calloc(1, sizeof(ctsvc_name_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_name_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->is_default = src_data->is_default; + out_data->is_changed = src_data->is_changed; + out_data->id = src_data->id; + out_data->contact_id= src_data->contact_id; + out_data->language_type = src_data->language_type; + out_data->first = SAFE_STRDUP(src_data->first); + out_data->last = SAFE_STRDUP(src_data->last); + out_data->addition = SAFE_STRDUP(src_data->addition); + out_data->prefix = SAFE_STRDUP(src_data->prefix); + out_data->suffix = SAFE_STRDUP(src_data->suffix); + out_data->phonetic_first = SAFE_STRDUP(src_data->phonetic_first); + out_data->phonetic_middle = SAFE_STRDUP(src_data->phonetic_middle); + out_data->phonetic_last = SAFE_STRDUP(src_data->phonetic_last); + out_data->lookup = SAFE_STRDUP(src_data->lookup); + out_data->reverse_lookup = SAFE_STRDUP(src_data->reverse_lookup); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_nickname_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_nickname_s *out_data = NULL; + ctsvc_nickname_s *src_data = NULL; + + src_data = (ctsvc_nickname_s*)record; + out_data = calloc(1, sizeof(ctsvc_nickname_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_nickname_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->contact_id = src_data->contact_id; + out_data->type = src_data->type; + out_data->label = SAFE_STRDUP(src_data->label); + out_data->nickname = SAFE_STRDUP(src_data->nickname); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_note_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_note_s *out_data = NULL; + ctsvc_note_s *src_data = NULL; + + src_data = (ctsvc_note_s*)record; + out_data = calloc(1, sizeof(ctsvc_note_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_note_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->contact_id = src_data->contact_id; + out_data->note = SAFE_STRDUP(src_data->note); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_number_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_number_s *out_data = NULL; + ctsvc_number_s *src_data = NULL; + + src_data = (ctsvc_number_s*)record; + out_data = calloc(1, sizeof(ctsvc_number_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_number_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->is_default = src_data->is_default; + out_data->id = src_data->id; + out_data->contact_id = src_data->contact_id; + out_data->type = src_data->type; + out_data->label = SAFE_STRDUP(src_data->label); + out_data->number = SAFE_STRDUP(src_data->number); + out_data->lookup = SAFE_STRDUP(src_data->lookup); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_profile_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_profile_s *out_data = NULL; + ctsvc_profile_s *src_data = NULL; + + src_data = (ctsvc_profile_s*)record; + out_data = calloc(1, sizeof(ctsvc_profile_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_profile_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->contact_id = src_data->contact_id; + out_data->type = src_data->type; + out_data->order = src_data->order; + out_data->label = SAFE_STRDUP(src_data->label); + out_data->uid = SAFE_STRDUP(src_data->uid); + out_data->text = SAFE_STRDUP(src_data->text); + out_data->appsvc_operation = SAFE_STRDUP(src_data->appsvc_operation); + out_data->data1 = SAFE_STRDUP(src_data->data1); + out_data->data2 = SAFE_STRDUP(src_data->data2); + out_data->data3 = SAFE_STRDUP(src_data->data3); + out_data->data4 = SAFE_STRDUP(src_data->data4); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_relationship_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_relationship_s *out_data = NULL; + ctsvc_relationship_s *src_data = NULL; + + src_data = (ctsvc_relationship_s*)record; + out_data = calloc(1, sizeof(ctsvc_relationship_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_relationship_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->contact_id = src_data->contact_id; + out_data->type = src_data->type; + out_data->label = SAFE_STRDUP(src_data->label); + out_data->name = SAFE_STRDUP(src_data->name); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_image_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_image_s *out_data = NULL; + ctsvc_image_s *src_data = NULL; + + src_data = (ctsvc_image_s*)record; + out_data = calloc(1, sizeof(ctsvc_image_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_image_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->is_changed = src_data->is_changed; + out_data->is_default = src_data->is_default; + out_data->id = src_data->id; + out_data->contact_id = src_data->contact_id; + out_data->type = src_data->type; + out_data->label = SAFE_STRDUP(src_data->label); + out_data->path = SAFE_STRDUP(src_data->path); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_simple_contact_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_simple_contact_s *out_data = NULL; + ctsvc_simple_contact_s *src_data = NULL; + + src_data = (ctsvc_simple_contact_s*)record; + out_data = calloc(1, sizeof(ctsvc_simple_contact_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_simple_contact_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->uid_changed = src_data->uid_changed; + out_data->vibration_changed = src_data->vibration_changed; + out_data->image_thumbnail_changed = src_data->image_thumbnail_changed; + out_data->ringtone_changed = src_data->ringtone_changed; + + out_data->contact_id = src_data->contact_id; + out_data->person_id = src_data->person_id; + out_data->addressbook_id = src_data->addressbook_id; + out_data->changed_time = src_data->changed_time; + out_data->display_source_type = src_data->display_source_type; + out_data->has_phonenumber = src_data->has_phonenumber; + out_data->has_email = src_data->has_email; + out_data->is_favorite = src_data->is_favorite; + // out_data->is_restricted = src_data->is_restricted; + + out_data->display_name = SAFE_STRDUP(src_data->display_name); + out_data->uid = SAFE_STRDUP(src_data->uid); + out_data->ringtone_path = SAFE_STRDUP(src_data->ringtone_path); + out_data->vibration = SAFE_STRDUP(src_data->vibration); + out_data->image_thumbnail_path = SAFE_STRDUP(src_data->image_thumbnail_path); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_url_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_url_s *out_data = NULL; + ctsvc_url_s *src_data = NULL; + + src_data = (ctsvc_url_s*)record; + out_data = calloc(1, sizeof(ctsvc_url_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_url_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->contact_id = src_data->contact_id; + out_data->type = src_data->type; + out_data->label = SAFE_STRDUP(src_data->label); + out_data->url = SAFE_STRDUP(src_data->url); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + diff --git a/common/ctsvc_record_group.c b/common/ctsvc_record_group.c new file mode 100644 index 0000000..7e3bcef --- /dev/null +++ b/common/ctsvc_record_group.c @@ -0,0 +1,254 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_record.h" +#include "ctsvc_view.h" + +static int __ctsvc_group_create(contacts_record_h *out_record); +static int __ctsvc_group_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_group_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_group_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_group_get_str(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_group_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_group_get_bool( contacts_record_h record, unsigned int property_id, bool *value ); +static int __ctsvc_group_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_group_set_str(contacts_record_h record, unsigned int property_id, const char* str ); +static int __ctsvc_group_set_bool(contacts_record_h record, unsigned int property_id, bool value); + + +ctsvc_record_plugin_cb_s group_plugin_cbs = { + .create = __ctsvc_group_create, + .destroy = __ctsvc_group_destroy, + .clone = __ctsvc_group_clone, + .get_str = __ctsvc_group_get_str, + .get_str_p = __ctsvc_group_get_str_p, + .get_int = __ctsvc_group_get_int, + .get_bool = __ctsvc_group_get_bool, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_group_set_str, + .set_int = __ctsvc_group_set_int, + .set_bool = __ctsvc_group_set_bool, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +static int __ctsvc_group_create(contacts_record_h *out_record) +{ + ctsvc_group_s *group; + + group = (ctsvc_group_s*)calloc(1, sizeof(ctsvc_group_s)); + RETVM_IF(NULL == group, CONTACTS_ERROR_OUT_OF_MEMORY, + "calloc is failed"); + + *out_record = (contacts_record_h)group; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_group_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_group_s *group = (ctsvc_group_s*)record; + group->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(group->base.properties_flags); + + free(group->name); + free(group->ringtone_path); + free(group->vibration); + free(group->image_thumbnail_path); + free(group->system_id); + free(group); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_group_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_group_s *out_data = NULL; + ctsvc_group_s *src_data = NULL; + + src_data = (ctsvc_group_s*)record; + out_data = calloc(1, sizeof(ctsvc_group_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_group_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->addressbook_id = src_data->addressbook_id; + out_data->is_read_only = src_data->is_read_only; + out_data->image_thumbnail_changed = src_data->image_thumbnail_changed; + out_data->name = SAFE_STRDUP(src_data->name); + out_data->system_id = SAFE_STRDUP(src_data->system_id); + out_data->vibration = SAFE_STRDUP(src_data->vibration); + out_data->ringtone_path = SAFE_STRDUP(src_data->ringtone_path); + out_data->image_thumbnail_path = SAFE_STRDUP(src_data->image_thumbnail_path); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_group_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_group_s *group = (ctsvc_group_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_GROUP_ID: + *out = group->id; + break; + case CTSVC_PROPERTY_GROUP_ADDRESSBOOK_ID: + *out = group->addressbook_id; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(group)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_group_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_group_s *group = (ctsvc_group_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_GROUP_NAME: + *out_str = GET_STR(copy, group->name); + break; + case CTSVC_PROPERTY_GROUP_RINGTONE: + *out_str = GET_STR(copy, group->ringtone_path); + break; + case CTSVC_PROPERTY_GROUP_IMAGE: + *out_str = GET_STR(copy, group->image_thumbnail_path); + break; + case CTSVC_PROPERTY_GROUP_VIBRATION: + *out_str = GET_STR(copy, group->vibration); + break; + case CTSVC_PROPERTY_GROUP_SYSTEM_ID: + *out_str = GET_STR(copy, group->system_id); + break; + default : + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(group)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_group_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_group_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_group_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_group_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_group_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_group_s *group = (ctsvc_group_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_GROUP_ID: + group->id = value; + break; +/* + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is a read-only value (group)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_GROUP_ADDRESSBOOK_ID: + RETVM_IF(group->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (group)", property_id); + group->addressbook_id = value; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(group)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_group_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_group_s *group = (ctsvc_group_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_GROUP_NAME: + FREEandSTRDUP(group->name, str); + break; + case CTSVC_PROPERTY_GROUP_RINGTONE: + FREEandSTRDUP(group->ringtone_path, str); + break; + case CTSVC_PROPERTY_GROUP_IMAGE: + FREEandSTRDUP(group->image_thumbnail_path, str); + group->image_thumbnail_changed = true; + break; + case CTSVC_PROPERTY_GROUP_VIBRATION: + FREEandSTRDUP(group->vibration, str); + break; + case CTSVC_PROPERTY_GROUP_SYSTEM_ID: + FREEandSTRDUP(group->system_id, str); + break; + default : + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(group)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_group_get_bool(contacts_record_h record, unsigned int property_id, bool *value ) +{ + ctsvc_group_s *group = (ctsvc_group_s*)record; + switch (property_id) { + case CTSVC_PROPERTY_GROUP_IS_READ_ONLY: + *value = group->is_read_only; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(company)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_group_set_bool(contacts_record_h record, unsigned int property_id, bool value) +{ + ctsvc_group_s *group = (ctsvc_group_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_GROUP_IS_READ_ONLY: + group->is_read_only = value; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(group)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + diff --git a/common/ctsvc_record_my_profile.c b/common/ctsvc_record_my_profile.c new file mode 100644 index 0000000..26eee2f --- /dev/null +++ b/common/ctsvc_record_my_profile.c @@ -0,0 +1,595 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_list.h" +#include "ctsvc_record.h" +#include "ctsvc_view.h" + +static int __ctsvc_my_profile_create(contacts_record_h *out_record); +static int __ctsvc_my_profile_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_my_profile_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_my_profile_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_my_profile_get_str(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_my_profile_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_my_profile_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_my_profile_set_str(contacts_record_h record, unsigned int property_id, const char* str ); +static int __ctsvc_my_profile_clone_child_record_list(contacts_record_h record, unsigned int property_id, contacts_list_h* out_list ); +static int __ctsvc_my_profile_get_child_record_at_p(contacts_record_h record, unsigned int property_id, int index, contacts_record_h* out_record ); +static int __ctsvc_my_profile_get_child_record_count(contacts_record_h record, unsigned int property_id, unsigned int *count ); +static int __ctsvc_my_profile_add_child_record(contacts_record_h record, unsigned int property_id, contacts_record_h child_record ); +static int __ctsvc_my_profile_remove_child_record(contacts_record_h record, unsigned int property_id, contacts_record_h child_record ); + +ctsvc_record_plugin_cb_s my_profile_plugin_cbs = { + .create = __ctsvc_my_profile_create, + .destroy = __ctsvc_my_profile_destroy, + .clone = __ctsvc_my_profile_clone, + .get_str = __ctsvc_my_profile_get_str, + .get_str_p = __ctsvc_my_profile_get_str_p, + .get_int = __ctsvc_my_profile_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_my_profile_set_str, + .set_int = __ctsvc_my_profile_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = __ctsvc_my_profile_add_child_record, + .remove_child_record = __ctsvc_my_profile_remove_child_record, + .get_child_record_count = __ctsvc_my_profile_get_child_record_count, + .get_child_record_at_p = __ctsvc_my_profile_get_child_record_at_p, + .clone_child_record_list = __ctsvc_my_profile_clone_child_record_list, +}; + +static int __ctsvc_my_profile_create(contacts_record_h *out_record) +{ + ctsvc_my_profile_s *my_profile; + + my_profile = calloc(1, sizeof(ctsvc_my_profile_s)); + RETVM_IF(NULL == my_profile, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + my_profile->name = calloc(1, sizeof(ctsvc_list_s)); + my_profile->name->l_type = CTSVC_RECORD_NAME; + + my_profile->company = calloc(1, sizeof(ctsvc_list_s)); + my_profile->company->l_type = CTSVC_RECORD_COMPANY; + + my_profile->note = calloc(1, sizeof(ctsvc_list_s)); + my_profile->note->l_type = CTSVC_RECORD_NOTE; + + my_profile->numbers = calloc(1, sizeof(ctsvc_list_s)); + my_profile->numbers->l_type = CTSVC_RECORD_NUMBER; + + my_profile->emails = calloc(1, sizeof(ctsvc_list_s)); + my_profile->emails->l_type = CTSVC_RECORD_EMAIL; + + my_profile->events = calloc(1, sizeof(ctsvc_list_s)); + my_profile->events->l_type = CTSVC_RECORD_EVENT; + + my_profile->messengers = calloc(1, sizeof(ctsvc_list_s)); + my_profile->messengers->l_type = CTSVC_RECORD_MESSENGER; + + my_profile->postal_addrs = calloc(1, sizeof(ctsvc_list_s)); + my_profile->postal_addrs->l_type = CTSVC_RECORD_ADDRESS; + + my_profile->urls = calloc(1, sizeof(ctsvc_list_s)); + my_profile->urls->l_type = CTSVC_RECORD_URL; + + my_profile->nicknames = calloc(1, sizeof(ctsvc_list_s)); + my_profile->nicknames->l_type = CTSVC_RECORD_NICKNAME; + + my_profile->profiles = calloc(1, sizeof(ctsvc_list_s)); + my_profile->profiles->l_type = CTSVC_RECORD_PROFILE; + + my_profile->relationships = calloc(1, sizeof(ctsvc_list_s)); + my_profile->relationships->l_type = CTSVC_RECORD_RELATIONSHIP; + + my_profile->images = calloc(1, sizeof(ctsvc_list_s)); + my_profile->images->l_type = CTSVC_RECORD_IMAGE; + + my_profile->extensions = calloc(1, sizeof(ctsvc_list_s)); + my_profile->extensions->l_type = CTSVC_RECORD_EXTENSION; + + *out_record = (contacts_record_h)my_profile; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_my_profile_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_my_profile_s *my_profile = (ctsvc_my_profile_s*)record; + my_profile->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(my_profile->base.properties_flags); + + free(my_profile->display_name); + free(my_profile->uid); + free(my_profile->image_thumbnail_path); + + contacts_list_destroy((contacts_list_h)my_profile->name, delete_child); + + contacts_list_destroy((contacts_list_h)my_profile->company, delete_child); + + contacts_list_destroy((contacts_list_h)my_profile->note, delete_child); + + contacts_list_destroy((contacts_list_h)my_profile->numbers, delete_child); + + contacts_list_destroy((contacts_list_h)my_profile->emails, delete_child); + + contacts_list_destroy((contacts_list_h)my_profile->events, delete_child); + + contacts_list_destroy((contacts_list_h)my_profile->messengers, delete_child); + + contacts_list_destroy((contacts_list_h)my_profile->postal_addrs, delete_child); + + contacts_list_destroy((contacts_list_h)my_profile->urls, delete_child); + + contacts_list_destroy((contacts_list_h)my_profile->nicknames, delete_child); + + contacts_list_destroy((contacts_list_h)my_profile->profiles, delete_child); + + contacts_list_destroy((contacts_list_h)my_profile->relationships, delete_child); + + contacts_list_destroy((contacts_list_h)my_profile->images, delete_child); + + contacts_list_destroy((contacts_list_h)my_profile->extensions, delete_child); + + free(my_profile); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_my_profile_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_contact_s *contact = (ctsvc_contact_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_MY_PROFILE_ID: + *out = contact->id; + break; + case CTSVC_PROPERTY_MY_PROFILE_ADDRESSBOOK_ID: + *out = contact->addressbook_id; + break; + case CTSVC_PROPERTY_MY_PROFILE_CHANGED_TIME: + *out = contact->changed_time; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_my_profile_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_my_profile_s *my_profile = (ctsvc_my_profile_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_MY_PROFILE_ID: + my_profile->id = value; + break; + case CTSVC_PROPERTY_MY_PROFILE_CHANGED_TIME: + my_profile->changed_time = value; + break; + case CTSVC_PROPERTY_MY_PROFILE_ADDRESSBOOK_ID: + RETVM_IF(my_profile->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (my_profile)", property_id); + my_profile->addressbook_id = value; + break; + default: + CTS_ERR("Invalid parameter : property_id(%d) is not supported in valuecontact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_my_profile_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_contact_s *contact = (ctsvc_contact_s*)record; + switch(property_id) { + case CTSVC_PROPERTY_MY_PROFILE_DISPLAY_NAME: + *out_str = GET_STR(copy, contact->display_name); + break; + case CTSVC_PROPERTY_MY_PROFILE_IMAGE_THUMBNAIL: + *out_str = GET_STR(copy, contact->image_thumbnail_path); + break; + case CTSVC_PROPERTY_MY_PROFILE_UID: + *out_str = GET_STR(copy, contact->uid); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_my_profile_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_my_profile_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_my_profile_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_my_profile_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_my_profile_get_record_list_p(contacts_record_h record, + unsigned int property_id, contacts_list_h *list) +{ + ctsvc_my_profile_s *contact = (ctsvc_my_profile_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_MY_PROFILE_NAME: + *list = (contacts_list_h)contact->name; + break; + case CTSVC_PROPERTY_MY_PROFILE_COMPANY: + *list = (contacts_list_h)contact->company; + break; + case CTSVC_PROPERTY_MY_PROFILE_NOTE: + *list = (contacts_list_h)contact->note; + break; + case CTSVC_PROPERTY_MY_PROFILE_NUMBER: + *list = (contacts_list_h)contact->numbers; + break; + case CTSVC_PROPERTY_MY_PROFILE_EMAIL: + *list = (contacts_list_h)contact->emails; + break; + case CTSVC_PROPERTY_MY_PROFILE_EVENT: + *list = (contacts_list_h)contact->events; + break; + case CTSVC_PROPERTY_MY_PROFILE_MESSENGER: + *list = (contacts_list_h)contact->messengers; + break; + case CTSVC_PROPERTY_MY_PROFILE_ADDRESS: + *list = (contacts_list_h)contact->postal_addrs; + break; + case CTSVC_PROPERTY_MY_PROFILE_URL: + *list = (contacts_list_h)contact->urls; + break; + case CTSVC_PROPERTY_MY_PROFILE_NICKNAME: + *list = (contacts_list_h)contact->nicknames; + break; + case CTSVC_PROPERTY_MY_PROFILE_PROFILE: + *list = (contacts_list_h)contact->profiles; + break; + case CTSVC_PROPERTY_MY_PROFILE_RELATIONSHIP: + *list = (contacts_list_h)contact->relationships; + break; + case CTSVC_PROPERTY_MY_PROFILE_IMAGE: + *list = (contacts_list_h)contact->images; + break; + case CTSVC_PROPERTY_MY_PROFILE_EXTENSION: + *list = (contacts_list_h)contact->extensions; + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_my_profile_get_child_record_count(contacts_record_h record, + unsigned int property_id, unsigned int *count ) +{ + int ret; + contacts_list_h list = NULL; + + *count = 0; + ret = __ctsvc_my_profile_get_record_list_p(record, property_id, &list); + if (CONTACTS_ERROR_INVALID_PARAMETER == ret) + return ret; + + if(list) + contacts_list_get_count(list, count); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_my_profile_get_child_record_at_p(contacts_record_h record, + unsigned int property_id, int index, contacts_record_h* out_record ) +{ + int ret; + unsigned int count; + contacts_list_h list = NULL; + + ret = __ctsvc_my_profile_get_record_list_p(record, property_id, &list); + if (CONTACTS_ERROR_INVALID_PARAMETER == ret) + return ret; + + contacts_list_get_count(list, &count); + if (count < index) { + CTS_ERR("The index(%d) is greather than total length(%d)", index, count); + *out_record = NULL; + return CONTACTS_ERROR_NO_DATA; + } + else + return ctsvc_list_get_nth_record_p(list, index, out_record); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_my_profile_clone_child_record_list(contacts_record_h record, + unsigned int property_id, contacts_list_h* out_list ) +{ + int ret; + unsigned int count; + contacts_list_h list = NULL; + + ret = __ctsvc_my_profile_get_record_list_p(record, property_id, &list); + if (CONTACTS_ERROR_INVALID_PARAMETER == ret) + return ret; + + contacts_list_get_count(list, &count); + if (count <= 0) { + *out_list = NULL; + return CONTACTS_ERROR_NO_DATA; + } + ctsvc_list_clone(list, out_list); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_my_profile_reset_child_record_id(contacts_record_h child_record) +{ + ctsvc_record_s *record = (ctsvc_record_s*)child_record; + + switch(record->r_type) { + case CTSVC_RECORD_NAME: + ((ctsvc_name_s *)record)->id = 0; + break; + case CTSVC_RECORD_COMPANY: + ((ctsvc_company_s *)record)->id = 0; + break; + case CTSVC_RECORD_NOTE: + ((ctsvc_note_s *)record)->id = 0; + break; + case CTSVC_RECORD_NUMBER: + ((ctsvc_number_s *)record)->id = 0; + break; + case CTSVC_RECORD_EMAIL: + ((ctsvc_email_s *)record)->id = 0; + break; + case CTSVC_RECORD_URL: + ((ctsvc_url_s *)record)->id = 0; + break; + case CTSVC_RECORD_EVENT: + ((ctsvc_event_s *)record)->id = 0; + break; + case CTSVC_RECORD_NICKNAME: + ((ctsvc_nickname_s *)record)->id = 0; + break; + case CTSVC_RECORD_ADDRESS: + ((ctsvc_address_s *)record)->id = 0; + break; + case CTSVC_RECORD_MESSENGER: + ((ctsvc_messenger_s *)record)->id = 0; + break; + case CTSVC_RECORD_GROUP_RELATION: + ((ctsvc_group_relation_s *)record)->id = 0; + break; + case CTSVC_RECORD_ACTIVITY: + ((ctsvc_activity_s *)record)->id = 0; + break; + case CTSVC_RECORD_PROFILE: + ((ctsvc_profile_s *)record)->id = 0; + break; + case CTSVC_RECORD_RELATIONSHIP: + ((ctsvc_relationship_s *)record)->id = 0; + break; + case CTSVC_RECORD_IMAGE: + ((ctsvc_image_s *)record)->id = 0; + break; + case CTSVC_RECORD_EXTENSION: + ((ctsvc_extension_s *)record)->id = 0; + break; + default : + CTS_ERR("Invalid parameter : record(%d) is not child of contact", record->r_type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + + +static int __ctsvc_my_profile_add_child_record(contacts_record_h record, + unsigned int property_id, contacts_record_h child_record ) +{ + int ret; + contacts_list_h list = NULL; + ctsvc_record_s *s_record = (ctsvc_record_s *)child_record; + + ret = __ctsvc_my_profile_get_record_list_p(record, property_id, &list); + if (CONTACTS_ERROR_INVALID_PARAMETER == ret) + return ret; + + if (CTSVC_RECORD_NAME == s_record->r_type && 1 == ((ctsvc_list_s *)list)->count) { + CTS_ERR("This type(%d) of child_record can not be added anymore", s_record->r_type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + if (CTSVC_RECORD_IMAGE == s_record->r_type && 1 == ((ctsvc_list_s *)list)->count) { + CTS_ERR("This type(%d) of child_record can not be added anymore", s_record->r_type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = __ctsvc_my_profile_reset_child_record_id(child_record); + if (CONTACTS_ERROR_INVALID_PARAMETER == ret) + return ret; + + ctsvc_list_add_child(list, child_record); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_my_profile_get_child_record_id(contacts_record_h child_record) +{ + ctsvc_record_s *record = (ctsvc_record_s*)child_record; + + switch(record->r_type) { + case CTSVC_RECORD_NAME: + return ((ctsvc_name_s *)record)->id; + case CTSVC_RECORD_COMPANY: + return ((ctsvc_company_s *)record)->id; + case CTSVC_RECORD_NOTE: + return ((ctsvc_note_s *)record)->id; + case CTSVC_RECORD_NUMBER: + return ((ctsvc_number_s *)record)->id; + case CTSVC_RECORD_EMAIL: + return ((ctsvc_email_s *)record)->id; + case CTSVC_RECORD_URL: + return ((ctsvc_url_s *)record)->id; + case CTSVC_RECORD_EVENT: + return ((ctsvc_event_s *)record)->id; + case CTSVC_RECORD_NICKNAME: + return ((ctsvc_nickname_s *)record)->id; + case CTSVC_RECORD_ADDRESS: + return ((ctsvc_address_s *)record)->id; + case CTSVC_RECORD_MESSENGER: + return ((ctsvc_messenger_s *)record)->id; + case CTSVC_RECORD_GROUP_RELATION: + return ((ctsvc_group_relation_s *)record)->id; + case CTSVC_RECORD_ACTIVITY: + return ((ctsvc_activity_s *)record)->id; + case CTSVC_RECORD_PROFILE: + return ((ctsvc_profile_s *)record)->id; + case CTSVC_RECORD_RELATIONSHIP: + return ((ctsvc_relationship_s *)record)->id; + case CTSVC_RECORD_IMAGE: + return ((ctsvc_image_s *)record)->id; + case CTSVC_RECORD_EXTENSION: + return ((ctsvc_extension_s *)record)->id; + default : + CTS_ERR("Invalid parameter : record(%d) is not child of contact", record->r_type); + return 0; + } + return 0; +} + + +static int __ctsvc_my_profile_remove_child_record(contacts_record_h record, + unsigned int property_id, contacts_record_h child_record ) +{ + int id; + int ret; + contacts_list_h list = NULL; + + ret = __ctsvc_my_profile_get_record_list_p(record, property_id, &list); + if (CONTACTS_ERROR_INVALID_PARAMETER == ret) + return ret; + + id = __ctsvc_my_profile_get_child_record_id(child_record); + ctsvc_list_remove_child(list, child_record, (id?true:false)); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_my_profile_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_my_profile_s *my_profile = (ctsvc_my_profile_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_MY_PROFILE_DISPLAY_NAME: + FREEandSTRDUP(my_profile->display_name, str); + break; + case CTSVC_PROPERTY_MY_PROFILE_IMAGE_THUMBNAIL: + FREEandSTRDUP(my_profile->image_thumbnail_path, str); + break; + case CTSVC_PROPERTY_MY_PROFILE_UID: + FREEandSTRDUP(my_profile->uid, str); + break; + default : + CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(my_profile)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_my_profile_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_my_profile_s *out_data = NULL; + ctsvc_my_profile_s *src_data = NULL; + + src_data = (ctsvc_my_profile_s*)record; + out_data = calloc(1, sizeof(ctsvc_my_profile_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_contact_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->addressbook_id = src_data->addressbook_id; + out_data->changed_time = src_data->changed_time; + + out_data->display_name = SAFE_STRDUP(src_data->display_name); + out_data->uid = SAFE_STRDUP(src_data->uid); + out_data->image_thumbnail_path = SAFE_STRDUP(src_data->image_thumbnail_path); + + ctsvc_list_clone((contacts_list_h)src_data->name, (contacts_list_h*)&out_data->name); + out_data->name->l_type = CTSVC_RECORD_NAME; + + ctsvc_list_clone((contacts_list_h)src_data->company, (contacts_list_h*)&out_data->company); + out_data->company->l_type = CTSVC_RECORD_COMPANY; + + ctsvc_list_clone((contacts_list_h)src_data->note, (contacts_list_h*)&out_data->note); + out_data->note->l_type = CTSVC_RECORD_NOTE; + + ctsvc_list_clone((contacts_list_h)src_data->numbers, (contacts_list_h*)&out_data->numbers); + out_data->numbers->l_type = CTSVC_RECORD_NUMBER; + + ctsvc_list_clone((contacts_list_h)src_data->emails, (contacts_list_h*)&out_data->emails); + out_data->emails->l_type = CTSVC_RECORD_EMAIL; + + ctsvc_list_clone((contacts_list_h)src_data->events, (contacts_list_h*)&out_data->events); + out_data->events->l_type = CTSVC_RECORD_EVENT; + + ctsvc_list_clone((contacts_list_h)src_data->messengers, (contacts_list_h*)&out_data->messengers); + out_data->messengers->l_type = CTSVC_RECORD_MESSENGER; + + ctsvc_list_clone((contacts_list_h)src_data->postal_addrs, (contacts_list_h*)&out_data->postal_addrs); + out_data->postal_addrs->l_type = CTSVC_RECORD_ADDRESS; + + ctsvc_list_clone((contacts_list_h)src_data->urls, (contacts_list_h*)&out_data->urls); + out_data->urls->l_type = CTSVC_RECORD_URL; + + ctsvc_list_clone((contacts_list_h)src_data->nicknames, (contacts_list_h*)&out_data->nicknames); + out_data->nicknames->l_type = CTSVC_RECORD_NICKNAME; + + ctsvc_list_clone((contacts_list_h)src_data->profiles, (contacts_list_h*)&out_data->profiles); + out_data->profiles->l_type = CTSVC_RECORD_PROFILE; + + ctsvc_list_clone((contacts_list_h)src_data->relationships, (contacts_list_h*)&out_data->relationships); + out_data->relationships->l_type = CTSVC_RECORD_RELATIONSHIP; + + ctsvc_list_clone((contacts_list_h)src_data->images, (contacts_list_h*)&out_data->images); + out_data->images->l_type = CTSVC_RECORD_IMAGE; + + ctsvc_list_clone((contacts_list_h)src_data->extensions, (contacts_list_h*)&out_data->extensions); + out_data->extensions->l_type = CTSVC_RECORD_EXTENSION; + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + + return CONTACTS_ERROR_NONE; +} + diff --git a/common/ctsvc_record_person.c b/common/ctsvc_record_person.c new file mode 100755 index 0000000..86c18fa --- /dev/null +++ b/common/ctsvc_record_person.c @@ -0,0 +1,306 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_record.h" +#include "ctsvc_view.h" + +static int __ctsvc_person_create(contacts_record_h* out_record); +static int __ctsvc_person_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_person_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_person_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_person_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_person_get_str(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_person_get_bool( contacts_record_h record, unsigned int property_id, bool *value ); +static int __ctsvc_person_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_person_set_str(contacts_record_h record, unsigned int property_id, const char* str ); +static int __ctsvc_person_set_bool(contacts_record_h record, unsigned int property_id, bool value); + + +ctsvc_record_plugin_cb_s person_plugin_cbs = { + .create = __ctsvc_person_create, + .destroy = __ctsvc_person_destroy, + .clone = __ctsvc_person_clone, + .get_str = __ctsvc_person_get_str, + .get_str_p = __ctsvc_person_get_str_p, + .get_int = __ctsvc_person_get_int, + .get_bool = __ctsvc_person_get_bool, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_person_set_str, + .set_int = __ctsvc_person_set_int, + .set_bool = __ctsvc_person_set_bool, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +static int __ctsvc_person_create(contacts_record_h* out_record) +{ + ctsvc_person_s *person; + person = (ctsvc_person_s*)calloc(1, sizeof(ctsvc_person_s)); + RETVM_IF(NULL == person, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)person; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_person_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_person_s *person = (ctsvc_person_s*)record; + person->base.plugin_cbs = NULL; // help to find double-destroy bug (refer to the contacts_record_destroy) + free(person->base.properties_flags); + + free(person->display_name); + free(person->display_name_index); + free(person->ringtone_path); + free(person->vibration); + free(person->image_thumbnail_path); + free(person->status); + free(person->addressbook_ids); + free(person); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_person_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_person_s *out_data = NULL; + ctsvc_person_s *src_data = NULL; + + src_data = (ctsvc_person_s*)record; + out_data = calloc(1, sizeof(ctsvc_person_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_person_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->name_contact_id_changed = src_data->name_contact_id_changed; + out_data->image_thumbnail_changed = src_data->image_thumbnail_changed; + out_data->ringtone_changed = src_data->ringtone_changed; + out_data->vibration_changed = src_data->vibration_changed; + out_data->is_favorite_changed = src_data->is_favorite_changed; + out_data->is_favorite = src_data->is_favorite; + out_data->has_phonenumber = src_data->has_phonenumber; + out_data->has_email = src_data->has_email; + out_data->person_id = src_data->person_id; + out_data->name_contact_id = src_data->name_contact_id; + out_data->link_count = src_data->link_count; + out_data->account_id1 = src_data->account_id1; + out_data->account_id2 = src_data->account_id2; + out_data->account_id3 = src_data->account_id3; + out_data->addressbook_ids = SAFE_STRDUP(src_data->addressbook_ids); + out_data->display_name = SAFE_STRDUP(src_data->display_name); + out_data->display_name_index = SAFE_STRDUP(src_data->display_name_index); + out_data->image_thumbnail_path = SAFE_STRDUP(src_data->image_thumbnail_path); + out_data->ringtone_path = SAFE_STRDUP(src_data->ringtone_path); + out_data->vibration = SAFE_STRDUP(src_data->vibration); + out_data->status = SAFE_STRDUP(src_data->status); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_person_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_person_s *person = (ctsvc_person_s *)record; + switch(property_id) { + case CTSVC_PROPERTY_PERSON_ID: + *out = person->person_id; + break; + case CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID: + *out = person->name_contact_id; + break; + case CTSVC_PROPERTY_PERSON_LINK_COUNT: + *out = person->link_count; + break; + case CTSVC_PROPERTY_PERSON_ACCOUNT_ID1: + *out = person->account_id1; + break; + case CTSVC_PROPERTY_PERSON_ACCOUNT_ID2: + *out = person->account_id2; + break; + case CTSVC_PROPERTY_PERSON_ACCOUNT_ID3: + *out = person->account_id3; + break; + default: + ASSERT_NOT_REACHED("This field(%d) is not supported in value(person)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_person_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_person_s *person = (ctsvc_person_s *)record; + switch(property_id) { + case CTSVC_PROPERTY_PERSON_DISPLAY_NAME: + *out_str = GET_STR(copy, person->display_name); + break; + case CTSVC_PROPERTY_PERSON_RINGTONE: + *out_str = GET_STR(copy, person->ringtone_path); + break; + case CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL: + *out_str = GET_STR(copy, person->image_thumbnail_path); + break; + case CTSVC_PROPERTY_PERSON_VIBRATION: + *out_str = GET_STR(copy, person->vibration); + break; + case CTSVC_PROPERTY_PERSON_STATUS: + *out_str = GET_STR(copy, person->status); + break; + case CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX: + *out_str = GET_STR(copy, person->display_name_index); + break; + case CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS: + *out_str = GET_STR(copy, person->addressbook_ids); + break; + default : + ASSERT_NOT_REACHED("This field(%d) is not supported in value(person)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_person_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_person_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_person_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_person_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_person_get_bool(contacts_record_h record, unsigned int property_id, bool *value ) +{ + ctsvc_person_s *person = (ctsvc_person_s *)record; + switch (property_id) { + case CTSVC_PROPERTY_PERSON_IS_FAVORITE: + *value = person->is_favorite; + break; + case CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER: + *value = person->has_phonenumber; + break; + case CTSVC_PROPERTY_PERSON_HAS_EMAIL: + *value = person->has_email; + break; + default: + ASSERT_NOT_REACHED("This field(%d) is not supported in value(company)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_person_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_person_s *person = (ctsvc_person_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID: + person->name_contact_id = value; + person->name_contact_id_changed = true; + break; + case CTSVC_PROPERTY_PERSON_ID: + person->person_id = value; + break; + case CTSVC_PROPERTY_PERSON_LINK_COUNT: + person->link_count = value; + break; + case CTSVC_PROPERTY_PERSON_ACCOUNT_ID1: + person->account_id1 = value; + break; + case CTSVC_PROPERTY_PERSON_ACCOUNT_ID2: + person->account_id2 = value; + break; + case CTSVC_PROPERTY_PERSON_ACCOUNT_ID3: + person->account_id3 = value; + break; +/* + ASSERT_NOT_REACHED("The field(0x%0x) is a read-only value (person)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + default: + ASSERT_NOT_REACHED("This field(0x%0x) is not supported in value(person)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_person_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_person_s *person = (ctsvc_person_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_PERSON_DISPLAY_NAME: + FREEandSTRDUP( person->display_name, str); + break; + case CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX: + FREEandSTRDUP( person->display_name_index, str); + break; +/* + ASSERT_NOT_REACHED("The field(%d) is a read-only value (contact)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_PERSON_RINGTONE: + FREEandSTRDUP(person->ringtone_path, str); + person->ringtone_changed = true; + break; + case CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL: + FREEandSTRDUP(person->image_thumbnail_path, str); + person->image_thumbnail_changed = true; + break; + case CTSVC_PROPERTY_PERSON_VIBRATION: + FREEandSTRDUP(person->vibration, str); + person->vibration_changed = true; + break; + default : + ASSERT_NOT_REACHED("This field(%d) is not supported in value(person)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_person_set_bool(contacts_record_h record, unsigned int property_id, bool value) +{ + ctsvc_person_s *person = (ctsvc_person_s *)record; + + switch(property_id) { + case CTSVC_PROPERTY_PERSON_IS_FAVORITE: + if (person->is_favorite != value) { + person->is_favorite = value; + person->is_favorite_changed = true; + } + break; + default: + ASSERT_NOT_REACHED("This field(%d) is not supported in value(person)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + + diff --git a/common/ctsvc_record_phonelog.c b/common/ctsvc_record_phonelog.c new file mode 100644 index 0000000..6ee4f0e --- /dev/null +++ b/common/ctsvc_record_phonelog.c @@ -0,0 +1,225 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_record.h" +#include "ctsvc_view.h" + +static int __ctsvc_phonelog_create(contacts_record_h *out_record); +static int __ctsvc_phonelog_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_phonelog_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_phonelog_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_phonelog_get_str(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_phonelog_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_phonelog_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_phonelog_set_str(contacts_record_h record, unsigned int property_id, const char* str ); + +ctsvc_record_plugin_cb_s phonelog_plugin_cbs = { + .create = __ctsvc_phonelog_create, + .destroy = __ctsvc_phonelog_destroy, + .clone = __ctsvc_phonelog_clone, + .get_str = __ctsvc_phonelog_get_str, + .get_str_p = __ctsvc_phonelog_get_str_p, + .get_int = __ctsvc_phonelog_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_phonelog_set_str, + .set_int = __ctsvc_phonelog_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +static int __ctsvc_phonelog_create(contacts_record_h *out_record) +{ + ctsvc_phonelog_s *phonelog; + + phonelog = (ctsvc_phonelog_s*)calloc(1, sizeof(ctsvc_phonelog_s)); + RETVM_IF(NULL == phonelog, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)phonelog; + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_phonelog_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_phonelog_s* phonelog = (ctsvc_phonelog_s*)record; + phonelog->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(phonelog->base.properties_flags); + + free(phonelog->address); + free(phonelog->extra_data2); + free(phonelog->display_name); + free(phonelog->image_thumbnail_path); + free(phonelog); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_phonelog_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_phonelog_s *out_data = NULL; + ctsvc_phonelog_s *src_data = NULL; + + src_data = (ctsvc_phonelog_s*)record; + out_data = calloc(1, sizeof(ctsvc_phonelog_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_phonelog_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->address = SAFE_STRDUP(src_data->address); + out_data->person_id = src_data->person_id; + out_data->log_time = src_data->log_time; + out_data->log_type = src_data->log_type; + out_data->extra_data1 = src_data->extra_data1; + out_data->extra_data2 = SAFE_STRDUP(src_data->extra_data2); + out_data->display_name = SAFE_STRDUP(src_data->display_name); + out_data->image_thumbnail_path = SAFE_STRDUP(src_data->image_thumbnail_path); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_phonelog_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_phonelog_s* phonelog = (ctsvc_phonelog_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_PHONELOG_ID: + *out = phonelog->id; + break; + case CTSVC_PROPERTY_PHONELOG_PERSON_ID: + *out = phonelog->person_id; + break; + case CTSVC_PROPERTY_PHONELOG_LOG_TIME: + *out = phonelog->log_time; + break; + case CTSVC_PROPERTY_PHONELOG_LOG_TYPE: + *out = phonelog->log_type; + break; + case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1: + *out = phonelog->extra_data1; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(phonelog)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_phonelog_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_phonelog_s* phonelog = (ctsvc_phonelog_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_PHONELOG_ADDRESS: + *out_str = GET_STR(copy, phonelog->address); + break; + case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2: + *out_str = GET_STR(copy, phonelog->extra_data2); + break; + default : + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(phonelog)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_phonelog_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_phonelog_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_phonelog_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_phonelog_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_phonelog_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_phonelog_s* phonelog = (ctsvc_phonelog_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_PHONELOG_ID: + phonelog->id = value; + break; +/* + CTS_ERR("Invalid parameter : property_id(%d) is a read-only value (phonelog)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_PHONELOG_PERSON_ID: + RETVM_IF(phonelog->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (phonelog)", property_id); + phonelog->person_id = value; + break; + case CTSVC_PROPERTY_PHONELOG_LOG_TIME: + RETVM_IF(phonelog->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (phonelog)", property_id); + phonelog->log_time = value; + break; + case CTSVC_PROPERTY_PHONELOG_LOG_TYPE: + phonelog->log_type = value; + break; + case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1: + RETVM_IF(phonelog->id > 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property_id(%d) is a read-only value (phonelog)", property_id); + phonelog->extra_data1 = value; + break; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(phonelog)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_phonelog_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_phonelog_s* phonelog = (ctsvc_phonelog_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_PHONELOG_ADDRESS: + FREEandSTRDUP(phonelog->address, str); + break; + case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2: + FREEandSTRDUP(phonelog->extra_data2, str); + break; + default : + ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(phonelog)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + diff --git a/common/ctsvc_record_result.c b/common/ctsvc_record_result.c new file mode 100644 index 0000000..7675d63 --- /dev/null +++ b/common/ctsvc_record_result.c @@ -0,0 +1,427 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_record.h" +#include "ctsvc_view.h" + +static int __ctsvc_result_create(contacts_record_h* out_record); +static int __ctsvc_result_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_result_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_result_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_result_get_str(contacts_record_h record, unsigned int property_id, char** out_str); +static int __ctsvc_result_get_int(contacts_record_h record, unsigned int property_id, int* out_value ); +static int __ctsvc_result_get_lli(contacts_record_h record, unsigned int property_id, long long int* out_value ); +static int __ctsvc_result_get_bool(contacts_record_h record, unsigned int property_id, bool* out_value ); +static int __ctsvc_result_get_double(contacts_record_h record, unsigned int property_id, double* out_value ); +static int __ctsvc_result_set_int(contacts_record_h record, unsigned int property_id, int value ); +static int __ctsvc_result_set_lli(contacts_record_h record, unsigned int property_id, long long int value ); +static int __ctsvc_result_set_bool(contacts_record_h record, unsigned int property_id, bool value ); +static int __ctsvc_result_set_str(contacts_record_h record, unsigned int property_id, const char *str ); +static int __ctsvc_result_set_double(contacts_record_h record, unsigned int property_id, double value ); + +ctsvc_record_plugin_cb_s result_plugin_cbs = { + .create = __ctsvc_result_create, + .destroy = __ctsvc_result_destroy, + .clone = __ctsvc_result_clone, + .get_str = __ctsvc_result_get_str, + .get_str_p = __ctsvc_result_get_str_p, + .get_int = __ctsvc_result_get_int, + .get_bool = __ctsvc_result_get_bool, + .get_lli = __ctsvc_result_get_lli, + .get_double = __ctsvc_result_get_double, + .set_str = __ctsvc_result_set_str, + .set_int = __ctsvc_result_set_int, + .set_bool = __ctsvc_result_set_bool, + .set_lli = __ctsvc_result_set_lli, + .set_double = __ctsvc_result_set_double, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +static int __ctsvc_result_create(contacts_record_h* out_record) +{ + ctsvc_result_s *result; + result = (ctsvc_result_s*)calloc(1, sizeof(ctsvc_result_s)); + RETVM_IF(NULL == result, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)result; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_result_destroy(contacts_record_h record, bool delete_child) +{ + GSList *cursor; + ctsvc_result_s* result = (ctsvc_result_s*)record; + + for(cursor = result->values;cursor;cursor=cursor->next){ + ctsvc_result_value_s *data = cursor->data; + if (data->type == CTSVC_VIEW_DATA_TYPE_STR) + free(data->value.s); + free(data); + } + g_slist_free(result->values); + result->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(result->base.properties_flags); + + free(result); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_result_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_result_s *out_data = NULL; + ctsvc_result_s *src_data = NULL; + GSList *cursor; + + src_data = (ctsvc_result_s*)record; + out_data = calloc(1, sizeof(ctsvc_result_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_result_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + for(cursor=src_data->values;cursor;cursor=cursor->next) { + ctsvc_result_value_s *src = cursor->data; + ctsvc_result_value_s *dest = calloc(1, sizeof(ctsvc_result_value_s)); + dest->property_id = src->property_id; + dest->type = src->type; + switch(src->type) { + case CTSVC_VIEW_DATA_TYPE_BOOL: + dest->value.b = src->value.b; + break; + case CTSVC_VIEW_DATA_TYPE_INT: + dest->value.i = src->value.i; + break; + case CTSVC_VIEW_DATA_TYPE_LLI: + dest->value.l = src->value.l; + break; + case CTSVC_VIEW_DATA_TYPE_STR: + dest->value.s = SAFE_STRDUP(src->value.s); + break; + case CTSVC_VIEW_DATA_TYPE_DOUBLE: + dest->value.d = src->value.d; + break; + default: + break; + } + out_data->values = g_slist_append(out_data->values, (void*)dest); + } + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_result_get_str_real(contacts_record_h record, unsigned int property_id, + char** out_str, bool copy ) +{ + ctsvc_result_s* result = (ctsvc_result_s *)record; + + GSList *cursor; + + for(cursor = result->values;cursor;cursor=cursor->next){ + ctsvc_result_value_s *data = cursor->data; + if (data->property_id == property_id) { + if (data->type == CTSVC_VIEW_DATA_TYPE_STR) { + *out_str = GET_STR(copy, data->value.s); + return CONTACTS_ERROR_NONE; + } + else { + ASSERT_NOT_REACHED("use another get_type API, (type : %d)", data->type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + } + + return CONTACTS_ERROR_NO_DATA; +} + +static int __ctsvc_result_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_result_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_result_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_result_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_result_get_int(contacts_record_h record, unsigned int property_id, int* out_value ) +{ + ctsvc_result_s* result = (ctsvc_result_s *)record; + + GSList *cursor; + //TODO: check the value type of property_id is int + for(cursor = result->values;cursor;cursor=cursor->next){ + ctsvc_result_value_s *data = cursor->data; + if (data->property_id == property_id) { + if (data->type == CTSVC_VIEW_DATA_TYPE_INT) { + *out_value = data->value.i; + return CONTACTS_ERROR_NONE; + } + else { + ASSERT_NOT_REACHED("use another get_type API, (type : %d)", data->type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + } + + return CONTACTS_ERROR_NO_DATA; +} + +static int __ctsvc_result_set_int(contacts_record_h record, unsigned int property_id, int value ) +{ + ctsvc_result_s* result = (ctsvc_result_s *)record; + GSList *cursor; + ctsvc_result_value_s *data; + + // TODO: check the value type of property_id is int + for(cursor = result->values;cursor;cursor=cursor->next){ + data = cursor->data; + if (data->property_id == property_id) { + if (data->type == CTSVC_VIEW_DATA_TYPE_INT) { + data->value.i = value; + return CONTACTS_ERROR_NONE; + } + else { + ASSERT_NOT_REACHED("use another get_type API, (type : %d)", data->type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + } + + data = calloc(1, sizeof(ctsvc_result_value_s)); + data->property_id = property_id; + data->type = CTSVC_VIEW_DATA_TYPE_INT; + data->value.i = value; + result->values = g_slist_append(result->values, (void*)data); + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_result_set_lli(contacts_record_h record, unsigned int property_id, long long int value ) +{ + ctsvc_result_s* result = (ctsvc_result_s *)record; + GSList *cursor; + ctsvc_result_value_s *data; + + // TODO: check the value type of property_id is int + for(cursor = result->values;cursor;cursor=cursor->next){ + data = cursor->data; + if (data->property_id == property_id) { + if (data->type == CTSVC_VIEW_DATA_TYPE_LLI) { + data->value.l = value; + return CONTACTS_ERROR_NONE; + } + else { + ASSERT_NOT_REACHED("use another get_type API, (type : %d)", data->type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + } + + data = calloc(1, sizeof(ctsvc_result_value_s)); + data->property_id = property_id; + data->type = CTSVC_VIEW_DATA_TYPE_LLI; + data->value.l = value; + result->values = g_slist_append(result->values, (void*)data); + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_result_set_double(contacts_record_h record, unsigned int property_id, double value ) +{ + ctsvc_result_s* result = (ctsvc_result_s *)record; + GSList *cursor; + ctsvc_result_value_s *data; + + for(cursor = result->values;cursor;cursor=cursor->next){ + data = cursor->data; + if (data->property_id == property_id) { + if (data->type == CTSVC_VIEW_DATA_TYPE_DOUBLE) { + data->value.d = value; + return CONTACTS_ERROR_NONE; + } + else { + ASSERT_NOT_REACHED("use another get_type API, (type : %d)", data->type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + } + + data = calloc(1, sizeof(ctsvc_result_value_s)); + data->property_id = property_id; + data->type = CTSVC_VIEW_DATA_TYPE_DOUBLE; + data->value.d = value; + result->values = g_slist_append(result->values, (void*)data); + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_result_set_bool(contacts_record_h record, unsigned int property_id, bool value ) +{ + ctsvc_result_s* result = (ctsvc_result_s *)record; + GSList *cursor; + ctsvc_result_value_s *data; + + // TODO: check the value type of property_id is int + for(cursor = result->values;cursor;cursor=cursor->next){ + data = cursor->data; + if (data->property_id == property_id) { + if (data->type == CTSVC_VIEW_DATA_TYPE_BOOL) { + data->value.b = value; + return CONTACTS_ERROR_NONE; + } + else { + ASSERT_NOT_REACHED("use another get_type API, (type : %d)", data->type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + } + + data = calloc(1, sizeof(ctsvc_result_value_s)); + data->property_id = property_id; + data->type = CTSVC_VIEW_DATA_TYPE_BOOL; + data->value.i = value; + result->values = g_slist_append(result->values, (void*)data); + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_result_set_str(contacts_record_h record, unsigned int property_id, const char *str ) +{ + ctsvc_result_s* result = (ctsvc_result_s *)record; + GSList *cursor; + ctsvc_result_value_s *data; + char *full_path = NULL; + + // TODO: check the value type of property_id is int + for(cursor = result->values;cursor;cursor=cursor->next){ + data = cursor->data; + if (data->property_id == property_id) { + if (data->type == CTSVC_VIEW_DATA_TYPE_STR) { + switch (property_id) { + case CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL: + case CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL: + if (str) { + full_path = calloc(1, strlen(CTS_IMG_FULL_LOCATION) + strlen(str) + 2); + sprintf(full_path, "%s/%s", CTS_IMG_FULL_LOCATION, str); + } + free(data->value.s); + data->value.s = full_path; + return CONTACTS_ERROR_NONE; + default: + FREEandSTRDUP(data->value.s, str); + return CONTACTS_ERROR_NONE; + } + } + else { + ASSERT_NOT_REACHED("use another get_type API, (type : %d)", data->type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + } + + data = calloc(1, sizeof(ctsvc_result_value_s)); + data->property_id = property_id; + data->type = CTSVC_VIEW_DATA_TYPE_STR; + switch (property_id) { + case CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL: + case CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL: + if (str) { + full_path = calloc(1, strlen(CTS_IMG_FULL_LOCATION) + strlen(str) + 2); + sprintf(full_path, "%s/%s", CTS_IMG_FULL_LOCATION, str); + } + free(data->value.s); + data->value.s = full_path; + break; + default: + data->value.s = SAFE_STRDUP(str); + break; + } + + result->values = g_slist_append(result->values, (void*)data); + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_result_get_bool(contacts_record_h record, unsigned int property_id, bool* out_value ) +{ + ctsvc_result_s* result = (ctsvc_result_s *)record; + GSList *cursor; + for(cursor = result->values;cursor;cursor=cursor->next){ + ctsvc_result_value_s *data = cursor->data; + if (data->property_id == property_id) { + if (data->type == CTSVC_VIEW_DATA_TYPE_BOOL) { + *out_value = data->value.b; + return CONTACTS_ERROR_NONE; + } + else { + ASSERT_NOT_REACHED("use another get_type API, (type : %d)", data->type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + } + + return CONTACTS_ERROR_NO_DATA; +} + +static int __ctsvc_result_get_lli(contacts_record_h record, unsigned int property_id, long long int* out_value ) +{ + ctsvc_result_s* result = (ctsvc_result_s *)record; + GSList *cursor; + for(cursor = result->values;cursor;cursor=cursor->next){ + ctsvc_result_value_s *data = cursor->data; + if (data->property_id == property_id) { + if (data->type == CTSVC_VIEW_DATA_TYPE_LLI) { + *out_value = data->value.l; + return CONTACTS_ERROR_NONE; + } + else { + ASSERT_NOT_REACHED("use another get_type API, (type : %d)", data->type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + } + + return CONTACTS_ERROR_NO_DATA; +} + +static int __ctsvc_result_get_double(contacts_record_h record, unsigned int property_id, double* out_value ) +{ + ctsvc_result_s* result = (ctsvc_result_s *)record; + GSList *cursor; + for(cursor = result->values;cursor;cursor=cursor->next){ + ctsvc_result_value_s *data = cursor->data; + if (data->property_id == property_id) { + if (data->type == CTSVC_VIEW_DATA_TYPE_DOUBLE) { + *out_value = data->value.d; + return CONTACTS_ERROR_NONE; + } + else { + ASSERT_NOT_REACHED("use another get_type API, (type : %d)", data->type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + } + + return CONTACTS_ERROR_NO_DATA; +} + diff --git a/common/ctsvc_record_sdn.c b/common/ctsvc_record_sdn.c new file mode 100644 index 0000000..44b18ef --- /dev/null +++ b/common/ctsvc_record_sdn.c @@ -0,0 +1,185 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_record.h" +#include "ctsvc_view.h" + +static int __ctsvc_sdn_create(contacts_record_h* out_record); +static int __ctsvc_sdn_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_sdn_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_sdn_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_sdn_get_str(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_sdn_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_sdn_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_sdn_set_str(contacts_record_h record, unsigned int property_id, const char* str ); + +ctsvc_record_plugin_cb_s sdn_plugin_cbs = { + .create = __ctsvc_sdn_create, + .destroy = __ctsvc_sdn_destroy, + .clone = __ctsvc_sdn_clone, + .get_str = __ctsvc_sdn_get_str, + .get_str_p = __ctsvc_sdn_get_str_p, + .get_int = __ctsvc_sdn_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_sdn_set_str, + .set_int = __ctsvc_sdn_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +static int __ctsvc_sdn_create(contacts_record_h* out_record) +{ + ctsvc_sdn_s *sdn; + sdn = (ctsvc_sdn_s*)calloc(1, sizeof(ctsvc_sdn_s)); + RETVM_IF(NULL == sdn, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory calloc is failed"); + + *out_record = (contacts_record_h)sdn; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_sdn_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_sdn_s* sdn = (ctsvc_sdn_s*)record; + sdn->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(sdn->base.properties_flags); + + free(sdn->name); + free(sdn->number); + free(sdn); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_sdn_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_sdn_s *out_data = NULL; + ctsvc_sdn_s *src_data = NULL; + + src_data = (ctsvc_sdn_s*)record; + out_data = calloc(1, sizeof(ctsvc_sdn_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_sdn_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->name = SAFE_STRDUP(src_data->name); + out_data->number = SAFE_STRDUP(src_data->number); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_sdn_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_sdn_s* sdn = (ctsvc_sdn_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_SDN_ID: + *out = sdn->id; + break; + default: + ASSERT_NOT_REACHED("This field(%d) is not supported in value(sdn)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_sdn_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_sdn_s* sdn = (ctsvc_sdn_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_SDN_NAME: + *out_str = GET_STR(copy, sdn->name); + break; + case CTSVC_PROPERTY_SDN_NUMBER: + *out_str = GET_STR(copy, sdn->number); + break; + default : + ASSERT_NOT_REACHED("This field(%d) is not supported in value(sdn)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_sdn_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_sdn_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_sdn_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_sdn_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_sdn_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_sdn_s* sdn = (ctsvc_sdn_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_SDN_ID: + sdn->id = value; + break; +/* + ASSERT_NOT_REACHED("The field(%d) is a read-only value (sdn)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + default: + ASSERT_NOT_REACHED("This field(%d) is not supported in value(sdn)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_sdn_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_sdn_s* sdn = (ctsvc_sdn_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_SDN_NAME: + FREEandSTRDUP(sdn->name, str); + break; + case CTSVC_PROPERTY_SDN_NUMBER: + FREEandSTRDUP(sdn->number, str); + break; + default : + ASSERT_NOT_REACHED("This field(%d) is not supported in value(sdn)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + diff --git a/common/ctsvc_record_speeddial.c b/common/ctsvc_record_speeddial.c new file mode 100644 index 0000000..fc5e2f6 --- /dev/null +++ b/common/ctsvc_record_speeddial.c @@ -0,0 +1,223 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_record.h" +#include "ctsvc_view.h" + +static int __ctsvc_speeddial_create(contacts_record_h* out_record); +static int __ctsvc_speeddial_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_speeddial_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_speeddial_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_speeddial_get_str(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_speeddial_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str ); +static int __ctsvc_speeddial_set_int(contacts_record_h record, unsigned int property_id, int value); +static int __ctsvc_speeddial_set_str(contacts_record_h record, unsigned int property_id, const char* str ); + + +ctsvc_record_plugin_cb_s speeddial_plugin_cbs = { + .create = __ctsvc_speeddial_create, + .destroy = __ctsvc_speeddial_destroy, + .clone = __ctsvc_speeddial_clone, + .get_str = __ctsvc_speeddial_get_str, + .get_str_p = __ctsvc_speeddial_get_str_p, + .get_int = __ctsvc_speeddial_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = __ctsvc_speeddial_set_str, + .set_int = __ctsvc_speeddial_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +static int __ctsvc_speeddial_create(contacts_record_h* out_record) +{ + ctsvc_speeddial_s *speeddial; + speeddial = (ctsvc_speeddial_s*)calloc(1, sizeof(ctsvc_speeddial_s)); + RETVM_IF(NULL == speeddial, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory : calloc is failed"); + + *out_record = (contacts_record_h)speeddial; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_speeddial_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_speeddial_s* speeddial = (ctsvc_speeddial_s*)record; + speeddial->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(speeddial->base.properties_flags); + + free(speeddial->display_name); + free(speeddial->image_thumbnail_path); + free(speeddial->label); + free(speeddial->number); + free(speeddial); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_speeddial_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_speeddial_s *out_data = NULL; + ctsvc_speeddial_s *src_data = NULL; + + src_data = (ctsvc_speeddial_s*)record; + out_data = calloc(1, sizeof(ctsvc_speeddial_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_speeddial_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->dial_number = src_data->dial_number; + out_data->number_id = src_data->number_id; + out_data->person_id = src_data->person_id; + out_data->number_type = src_data->number_type; + out_data->display_name = SAFE_STRDUP(src_data->display_name); + out_data->image_thumbnail_path = SAFE_STRDUP(src_data->image_thumbnail_path); + out_data->label = SAFE_STRDUP(src_data->label); + out_data->number = SAFE_STRDUP(src_data->number); + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_speeddial_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_speeddial_s *speeddial = (ctsvc_speeddial_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_SPEEDDIAL_DIAL_NUMBER: + *out = speeddial->dial_number; + break; + case CTSVC_PROPERTY_SPEEDDIAL_NUMBER_ID: + *out = speeddial->number_id; + break; + case CTSVC_PROPERTY_SPEEDDIAL_NUMBER_TYPE: + *out = speeddial->number_type; + break; + case CTSVC_PROPERTY_SPEEDDIAL_PERSON_ID: + *out = speeddial->person_id; + break; + default: + ASSERT_NOT_REACHED("This field(%d) is not supported in value(speeddial)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_speeddial_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy ) +{ + ctsvc_speeddial_s *speeddial = (ctsvc_speeddial_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_SPEEDDIAL_DISPLAY_NAME: + *out_str = GET_STR(copy, speeddial->display_name); + break; + case CTSVC_PROPERTY_SPEEDDIAL_NUMBER: + *out_str = GET_STR(copy, speeddial->number); + break; + case CTSVC_PROPERTY_SPEEDDIAL_IMAGE_THUMBNAIL: + *out_str = GET_STR(copy, speeddial->image_thumbnail_path); + break; + case CTSVC_PROPERTY_SPEEDDIAL_NUMBER_LABEL: + *out_str = GET_STR(copy, speeddial->label); + break; + default : + ASSERT_NOT_REACHED("This field(%d) is not supported in value(speeddial)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_speeddial_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_speeddial_get_str_real(record, property_id, out_str, false); +} + +static int __ctsvc_speeddial_get_str(contacts_record_h record, unsigned int property_id, char** out_str) +{ + return __ctsvc_speeddial_get_str_real(record, property_id, out_str, true); +} + +static int __ctsvc_speeddial_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_speeddial_s *speeddial = (ctsvc_speeddial_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_SPEEDDIAL_NUMBER_TYPE: + speeddial->number_type = value; + break; + case CTSVC_PROPERTY_SPEEDDIAL_PERSON_ID: + speeddial->person_id = value; + break; +/* + CTS_ERR("The field(%d) is a read-only value (speeddial)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; +*/ + case CTSVC_PROPERTY_SPEEDDIAL_DIAL_NUMBER: + speeddial->dial_number = value; + break; + case CTSVC_PROPERTY_SPEEDDIAL_NUMBER_ID: + speeddial->number_id = value; + break; + default: + ASSERT_NOT_REACHED("This field(%d) is not supported in value(speeddial)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_speeddial_set_str(contacts_record_h record, unsigned int property_id, const char* str ) +{ + ctsvc_speeddial_s *speeddial = (ctsvc_speeddial_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_SPEEDDIAL_DISPLAY_NAME: + FREEandSTRDUP(speeddial->display_name, str); + break; + case CTSVC_PROPERTY_SPEEDDIAL_NUMBER: + FREEandSTRDUP(speeddial->number, str); + break; + case CTSVC_PROPERTY_SPEEDDIAL_IMAGE_THUMBNAIL: + FREEandSTRDUP(speeddial->image_thumbnail_path, str); + break; + case CTSVC_PROPERTY_SPEEDDIAL_NUMBER_LABEL: + FREEandSTRDUP(speeddial->label, str); + break; + default : + ASSERT_NOT_REACHED("This field(%d) is not supported in value(speeddial)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + diff --git a/common/ctsvc_record_updated_info.c b/common/ctsvc_record_updated_info.c new file mode 100644 index 0000000..07442a5 --- /dev/null +++ b/common/ctsvc_record_updated_info.c @@ -0,0 +1,144 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_record.h" +#include "ctsvc_view.h" + +static int __ctsvc_updated_info_create(contacts_record_h* out_record); +static int __ctsvc_updated_info_destroy(contacts_record_h record, bool delete_child); +static int __ctsvc_updated_info_clone(contacts_record_h record, contacts_record_h *out_record); +static int __ctsvc_updated_info_get_int(contacts_record_h record, unsigned int property_id, int *out); +static int __ctsvc_updated_info_set_int(contacts_record_h record, unsigned int property_id, int value); + +ctsvc_record_plugin_cb_s updated_info_plugin_cbs = { + .create = __ctsvc_updated_info_create, + .destroy = __ctsvc_updated_info_destroy, + .clone = __ctsvc_updated_info_clone, + .get_str = NULL, + .get_str_p = NULL, + .get_int = __ctsvc_updated_info_get_int, + .get_bool = NULL, + .get_lli = NULL, + .get_double = NULL, + .set_str = NULL, + .set_int = __ctsvc_updated_info_set_int, + .set_bool = NULL, + .set_lli = NULL, + .set_double = NULL, + .add_child_record = NULL, + .remove_child_record = NULL, + .get_child_record_count = NULL, + .get_child_record_at_p = NULL, + .clone_child_record_list = NULL, +}; + +static int __ctsvc_updated_info_create(contacts_record_h* out_record) +{ + ctsvc_updated_info_s *updated_info; + updated_info = (ctsvc_updated_info_s*)calloc(1, sizeof(ctsvc_updated_info_s)); + RETVM_IF(NULL == updated_info, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memory calloc is failed"); + + *out_record = (contacts_record_h)updated_info; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_updated_info_destroy(contacts_record_h record, bool delete_child) +{ + ctsvc_updated_info_s* updated_info = (ctsvc_updated_info_s*)record; + updated_info->base.plugin_cbs = NULL; // help to find double destroy bug (refer to the contacts_record_destroy) + free(updated_info->base.properties_flags); + free(updated_info); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_updated_info_clone(contacts_record_h record, contacts_record_h *out_record) +{ + ctsvc_updated_info_s *out_data = NULL; + ctsvc_updated_info_s *src_data = NULL; + + src_data = (ctsvc_updated_info_s*)record; + out_data = calloc(1, sizeof(ctsvc_updated_info_s)); + RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY, + "Out of memeory : calloc(ctsvc_updated_info_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY); + + out_data->id = src_data->id; + out_data->changed_type = src_data->changed_type; + out_data->changed_ver = src_data->changed_ver; + out_data->addressbook_id = src_data->addressbook_id; + + CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base)); + + *out_record = (contacts_record_h)out_data; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_updated_info_get_int(contacts_record_h record, unsigned int property_id, int *out) +{ + ctsvc_updated_info_s* updated_info = (ctsvc_updated_info_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_UPDATE_INFO_ID : + *out = updated_info->id; + break; + case CTSVC_PROPERTY_UPDATE_INFO_ADDRESSBOOK_ID: + *out = updated_info->addressbook_id; + break; + case CTSVC_PROPERTY_UPDATE_INFO_TYPE: + *out = updated_info->changed_type; + break; + case CTSVC_PROPERTY_UPDATE_INFO_VERSION: + *out = updated_info->changed_ver; + break; + default: + ASSERT_NOT_REACHED("This field(%d) is not supported in value(updated_info)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_updated_info_set_int(contacts_record_h record, unsigned int property_id, int value) +{ + ctsvc_updated_info_s* updated_info = (ctsvc_updated_info_s*)record; + + switch(property_id) { + case CTSVC_PROPERTY_UPDATE_INFO_ID : + updated_info->id = value; + break; + case CTSVC_PROPERTY_UPDATE_INFO_ADDRESSBOOK_ID: + updated_info->addressbook_id = value; + break; + case CTSVC_PROPERTY_UPDATE_INFO_TYPE: + updated_info->changed_type = value; + break; + case CTSVC_PROPERTY_UPDATE_INFO_VERSION: + updated_info->changed_ver = value; + break; + default: + ASSERT_NOT_REACHED("This field(%d) is not supported in value(updated_info)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + diff --git a/common/ctsvc_setting.c b/common/ctsvc_setting.c new file mode 100644 index 0000000..b645ad8 --- /dev/null +++ b/common/ctsvc_setting.c @@ -0,0 +1,156 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_setting.h" +#include "ctsvc_normalize.h" + +static int name_display_order = -1; +static int default_lang = -1; +static int secondary_lang = -1; + +static const char *CTSVC_VCONF_DISPLAY_ORDER = VCONFKEY_CONTACTS_SVC_NAME_DISPLAY_ORDER; + +const char* ctsvc_get_default_language_vconfkey(void) +{ + return "file/private/contacts-service/default_lang"; +} + +const char* ctsvc_get_secondary_language_vconfkey(void) +{ + return "file/private/contacts-service/secondary_lang"; +} + +API int contacts_setting_get_name_display_order(contacts_name_display_order_e *order) +{ + int ret; + if (name_display_order < 0) + { + ret = vconf_get_int(VCONFKEY_CONTACTS_SVC_NAME_DISPLAY_ORDER, &name_display_order); + RETVM_IF(ret<0, CONTACTS_ERROR_SYSTEM, "System : vconf_get_int() Failed(%d)", ret); + } + + *order = name_display_order; + + return CONTACTS_ERROR_NONE; +} + +API int contacts_setting_set_name_display_order(contacts_name_display_order_e order) +{ + int ret; + RETVM_IF(CONTACTS_NAME_DISPLAY_ORDER_FIRSTLAST != order && CONTACTS_NAME_DISPLAY_ORDER_LASTFIRST != order, + CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : The parameter(order:%d) is Invalid", name_display_order); + + ret = vconf_set_int(VCONFKEY_CONTACTS_SVC_NAME_DISPLAY_ORDER, order); + RETVM_IF(ret<0, CONTACTS_ERROR_SYSTEM, "System : vconf_set_int(%s) Failed(%d)", VCONFKEY_CONTACTS_SVC_NAME_DISPLAY_ORDER, ret); + + name_display_order = order; + + return CONTACTS_ERROR_NONE; +} + +static void ctsvc_vconf_diplay_order_cb(keynode_t *key, void *data) +{ + name_display_order = vconf_keynode_get_int(key); +} + +static void ctsvc_vconf_language_cb(keynode_t *key, void *data) +{ + default_lang = vconf_keynode_get_int(key); +} + +static void ctsvc_vconf_secondary_language_cb(keynode_t *key, void *data) +{ + secondary_lang = vconf_keynode_get_int(key); +} + +int ctsvc_register_vconf(void) +{ + int ret; + + ret = vconf_get_int(CTSVC_VCONF_DISPLAY_ORDER, &name_display_order); + if (ret < 0) { + CTS_ERR("vconf_get_int() Failed(%d)", ret); + name_display_order = CONTACTS_NAME_DISPLAY_ORDER_FIRSTLAST; + } + + ret = vconf_get_int(ctsvc_get_default_language_vconfkey(), &default_lang); + WARN_IF(ret < 0, "vconf_get_int() Failed(%d)", ret); + + ret = vconf_get_int(ctsvc_get_secondary_language_vconfkey(), &secondary_lang); + WARN_IF(ret < 0, "vconf_get_int() Failed(%d)", ret); + + ret = vconf_notify_key_changed(CTSVC_VCONF_DISPLAY_ORDER, + ctsvc_vconf_diplay_order_cb, NULL); + RETVM_IF(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_notify_key_changed(%s) Failed(%d)", + CTSVC_VCONF_DISPLAY_ORDER, ret); + ret = vconf_notify_key_changed(ctsvc_get_default_language_vconfkey(), + ctsvc_vconf_language_cb, NULL); + RETVM_IF(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_notify_key_changed(%s) Failed(%d)", + ctsvc_get_default_language_vconfkey(), ret); + + ret = vconf_notify_key_changed(ctsvc_get_secondary_language_vconfkey(), + ctsvc_vconf_secondary_language_cb, NULL); + RETVM_IF(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_notify_key_changed(%s) Failed(%d)", + ctsvc_get_secondary_language_vconfkey(), ret); + + return CONTACTS_ERROR_NONE; +} + +void ctsvc_deregister_vconf(void) +{ + int ret; + + ret = vconf_ignore_key_changed(CTSVC_VCONF_DISPLAY_ORDER, ctsvc_vconf_diplay_order_cb); + RETM_IF(ret<0,"vconf_ignore_key_changed(%s) Failed(%d)",CTSVC_VCONF_DISPLAY_ORDER,ret); + ret = vconf_ignore_key_changed(ctsvc_get_default_language_vconfkey(), ctsvc_vconf_language_cb); + RETM_IF(ret<0,"vconf_ignore_key_changed(%s) Failed(%d)", ctsvc_get_default_language_vconfkey(),ret); + ret = vconf_ignore_key_changed(ctsvc_get_secondary_language_vconfkey(), ctsvc_vconf_secondary_language_cb); + RETM_IF(ret<0,"vconf_ignore_key_changed(%s) Failed(%d)", ctsvc_get_secondary_language_vconfkey(),ret); +} + +int ctsvc_get_default_language(void) +{ + if (default_lang < 0) { + int ret; + ret = vconf_get_int(ctsvc_get_default_language_vconfkey(), &default_lang); + WARN_IF(ret < 0, "vconf_get_int() Failed(%d)", ret); + } + return default_lang; +} + +int ctsvc_get_secondary_language(void) +{ + if (secondary_lang < 0) { + int ret; + ret = vconf_get_int(ctsvc_get_secondary_language_vconfkey(), &secondary_lang); + WARN_IF(ret < 0, "vconf_get_int() Failed(%d)", ret); + } + return secondary_lang; +} + diff --git a/common/ctsvc_setting.h b/common/ctsvc_setting.h new file mode 100644 index 0000000..424d4e6 --- /dev/null +++ b/common/ctsvc_setting.h @@ -0,0 +1,31 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_SETTING_H__ +#define __TIZEN_SOCIAL_CTSVC_SETTING_H__ + +int ctsvc_register_vconf(void); +void ctsvc_deregister_vconf(void); +int ctsvc_get_default_language(void); +int ctsvc_get_secondary_language(void); +const char *ctsvc_get_default_language_vconfkey(void); +const char *ctsvc_get_secondary_language_vconfkey(void); + +#endif /* __TIZEN_SOCIAL_CTSVC_SETTING_H__ */ + diff --git a/common/ctsvc_sim.c b/common/ctsvc_sim.c new file mode 100644 index 0000000..f517a7d --- /dev/null +++ b/common/ctsvc_sim.c @@ -0,0 +1,51 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_mutex.h" +#include "ctsvc_socket.h" + +API int contacts_sim_import_all_contacts() +{ + int ret; + + ctsvc_mutex_lock(CTS_MUTEX_SOCKET_FD); + ret = ctsvc_request_sim_import(); + ctsvc_mutex_unlock(CTS_MUTEX_SOCKET_FD); + + return ret; +} + +API int contacts_sim_get_initialization_status(bool *completed) +{ + int ret; + + ctsvc_mutex_lock(CTS_MUTEX_SOCKET_FD); + ret = ctsvc_request_sim_get_initialization_status(completed); + ctsvc_mutex_unlock(CTS_MUTEX_SOCKET_FD); + + return ret; +} diff --git a/common/ctsvc_socket.c b/common/ctsvc_socket.c new file mode 100644 index 0000000..72312e3 --- /dev/null +++ b/common/ctsvc_socket.c @@ -0,0 +1,196 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_socket.h" +#include "ctsvc_mutex.h" +#include "ctsvc_inotify.h" + +//static int ctsvc_conn_refcnt = 0; +static int cts_csockfd = -1; + +int ctsvc_socket_init(void) +{ + int ret; + struct sockaddr_un caddr; + + bzero(&caddr, sizeof(caddr)); + caddr.sun_family = AF_UNIX; + snprintf(caddr.sun_path, sizeof(caddr.sun_path), "%s", CTSVC_SOCKET_PATH); + + cts_csockfd = socket(PF_UNIX, SOCK_STREAM, 0); + RETVM_IF(-1 == cts_csockfd, CONTACTS_ERROR_IPC, + "socket() Failed(errno = %d)", errno); + + ret = connect(cts_csockfd, (struct sockaddr *)&caddr, sizeof(caddr)); + if (-1 == ret) { + CTS_ERR("connect() Failed(errno = %d)", errno); + close(cts_csockfd); + cts_csockfd = -1; + return CONTACTS_ERROR_IPC; + } + + return CONTACTS_ERROR_NONE; +} + +void ctsvc_socket_final(void) +{ + close(cts_csockfd); + cts_csockfd = -1; +} + +static inline int __ctsvc_safe_write(int fd, const char *buf, int buf_size) +{ + int ret, writed=0; + while (buf_size) { + ret = write(fd, buf+writed, buf_size); + if (-1 == ret) { + if (EINTR == errno) + continue; + else + return ret; + } + writed += ret; + buf_size -= ret; + } + return writed; +} + +static inline int __ctsvc_safe_read(int fd, char *buf, int buf_size) +{ + int ret, read_size=0; + while (buf_size) { + ret = read(fd, buf+read_size, buf_size); + if (-1 == ret) { + if (EINTR == errno) + continue; + else + return ret; + } + read_size += ret; + buf_size -= ret; + } + return read_size; +} + +static int __ctsvc_socket_handle_return(int fd, ctsvc_socket_msg_s *msg) +{ + CTS_FN_CALL; + int ret; + + ret = __ctsvc_safe_read(fd, (char *)msg, sizeof(ctsvc_socket_msg_s)); + RETVM_IF(-1 == ret, CONTACTS_ERROR_IPC, "__ctsvc_safe_read() Failed(errno = %d)", errno); + + WARN_IF(CTSVC_SOCKET_MSG_TYPE_REQUEST_RETURN_VALUE != msg->type, + "Unknown Type(%d), ret=%d, attach_num= %d," + "attach1 = %d, attach2 = %d, attach3 = %d, attach4 = %d", + msg->type, msg->val, msg->attach_num, + msg->attach_sizes[0],msg->attach_sizes[1],msg->attach_sizes[2], + msg->attach_sizes[3]); + + RETVM_IF(CTSVC_SOCKET_MSG_REQUEST_MAX_ATTACH < msg->attach_num, CONTACTS_ERROR_IPC, + "Invalid msg(attach_num = %d)", msg->attach_num); + + return CONTACTS_ERROR_NONE; +} + +static void __ctsvc_remove_invalid_msg(int fd, int size) +{ + int ret; + char dummy[CTSVC_SOCKET_MSG_SIZE] = {0}; + + while (size) { + if (sizeof(dummy) < size) { + ret = read(fd, dummy, sizeof(dummy)); + if (-1 == ret) { + if (EINTR == errno) + continue; + else + return; + } + size -= ret; + } + else { + ret = read(fd, dummy, size); + if (-1 == ret) { + if (EINTR == errno) + continue; + else + return; + } + size -= ret; + } + } +} + +int ctsvc_request_sim_import(void) +{ + int i, ret; + ctsvc_socket_msg_s msg = {0}; + + RETVM_IF(-1 == cts_csockfd, CONTACTS_ERROR_IPC, "socket is not connected"); + + msg.type = CTSVC_SOCKET_MSG_TYPE_REQUEST_IMPORT_SIM; + ret = __ctsvc_safe_write(cts_csockfd, (char *)&msg, sizeof(msg)); + RETVM_IF(-1 == ret, CONTACTS_ERROR_IPC, "__ctsvc_safe_write() Failed(errno = %d)", errno); + + ret = __ctsvc_socket_handle_return(cts_csockfd, &msg); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "__ctsvc_socket_handle_return() Failed(%d)", ret); + CTS_DBG("attach_num = %d", msg.attach_num); + + for (i=0;i + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_SOCKET_H__ +#define __TIZEN_SOCIAL_CTSVC_SOCKET_H__ + +#define CTSVC_SOCKET_PATH "/opt/usr/data/contacts-svc/.contacts-svc.sock" +#define CTSVC_SOCKET_MSG_SIZE 1024 +#define CTSVC_SIM_MAX_TEXT_LEN 40 +#define CTSVC_SIM_NUM_EMAIL_MAX_COUNT 4 + +// for use current contacts-svc-helper daemon +// Message type +enum{ + CTSVC_SOCKET_MSG_TYPE_REQUEST_RETURN_VALUE, + CTSVC_SOCKET_MSG_TYPE_REQUEST_IMPORT_SIM, + CTSVC_SOCKET_MSG_TYPE_REQUEST_SIM_INIT_COMPLETE, +}; + +#define CTSVC_SOCKET_MSG_REQUEST_MAX_ATTACH 5 + +typedef struct{ + int type; + int val; + int attach_num; + int attach_sizes[CTSVC_SOCKET_MSG_REQUEST_MAX_ATTACH]; +}ctsvc_socket_msg_s; + +int ctsvc_request_sim_import(void); +int ctsvc_request_sim_get_initialization_status(bool* completed); + +int ctsvc_socket_init(void); +void ctsvc_socket_final(void); + +#endif /* __TIZEN_SOCIAL_CTSVC_SOCKET_H__ */ + diff --git a/common/ctsvc_struct.h b/common/ctsvc_struct.h new file mode 100644 index 0000000..381300d --- /dev/null +++ b/common/ctsvc_struct.h @@ -0,0 +1,634 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_STRUCT_H__ +#define __TIZEN_SOCIAL_CTSVC_STRUCT_H__ + +#include +#include +#include +#include + +#include "contacts_views.h" + +#define CTSVC_IMG_FULL_PATH_SIZE_MAX 1024 +#define CTSVC_NUMBER_MAX_LEN 512 +#define CTS_IMG_FULL_LOCATION "/opt/usr/data/contacts-svc/img" + +#define SAFE_STR(src) (src)?src:"" +#define SAFE_STRDUP(src) (src)?strdup(src):NULL +#define SAFE_STRLEN(src) ((src)?strlen(src):0) +#define FREEandSTRDUP(dest, src) \ + do{ \ + free(dest);\ + if (src) dest = strdup(src);\ + else dest = NULL; \ + }while (0) +#define GET_STR(copy, str) (copy)?(SAFE_STRDUP(str)):(str) + +enum { + CTSVC_DATA_NAME = 1, + CTSVC_DATA_POSTAL = 2, + CTSVC_DATA_MESSENGER = 3, + CTSVC_DATA_URL = 4, + CTSVC_DATA_EVENT = 5, + CTSVC_DATA_COMPANY = 6, + CTSVC_DATA_NICKNAME = 7, + CTSVC_DATA_NUMBER = 8, + CTSVC_DATA_EMAIL = 9, + CTSVC_DATA_PROFILE = 10, + CTSVC_DATA_RELATIONSHIP = 11, + CTSVC_DATA_NOTE = 12, + CTSVC_DATA_IMAGE = 13, + CTSVC_DATA_EXTENSION = 100 +}; + +typedef enum { + CTSVC_RECORD_INVALID = -1, + CTSVC_RECORD_ADDRESSBOOK, + CTSVC_RECORD_GROUP, + CTSVC_RECORD_PERSON, + CTSVC_RECORD_CONTACT, + CTSVC_RECORD_MY_PROFILE, + CTSVC_RECORD_SIMPLE_CONTACT, + CTSVC_RECORD_NAME, + CTSVC_RECORD_COMPANY, + CTSVC_RECORD_NOTE, + CTSVC_RECORD_NUMBER, + CTSVC_RECORD_EMAIL, + CTSVC_RECORD_URL, + CTSVC_RECORD_EVENT, + CTSVC_RECORD_NICKNAME, + CTSVC_RECORD_ADDRESS, + CTSVC_RECORD_MESSENGER, + CTSVC_RECORD_GROUP_RELATION, + CTSVC_RECORD_ACTIVITY, + CTSVC_RECORD_ACTIVITY_PHOTO, + CTSVC_RECORD_PROFILE, + CTSVC_RECORD_RELATIONSHIP, + CTSVC_RECORD_IMAGE, + CTSVC_RECORD_EXTENSION, + CTSVC_RECORD_UPDATED_INFO, + CTSVC_RECORD_PHONELOG, + CTSVC_RECORD_SPEEDDIAL, + CTSVC_RECORD_SDN, + CTSVC_RECORD_RESULT, +}ctsvc_record_type_e; + +typedef enum { + CTSVC_FILTER_BOOL, + CTSVC_FILTER_INT, + CTSVC_FILTER_LLI, + CTSVC_FILTER_STR, + CTSVC_FILTER_DOUBLE, + CTSVC_FILTER_COMPOSITE, +}ctsvc_filter_type_e; + +/* +typedef enum { + TYPE_BOOL, + TYPE_INT, + TYPE_LLI, + TYPE_STR, + TYPE_DOUBLE, + TYPE_PTR, +}value_type_e; + +typedef enum { + PROPERTY_NONE, + PROPERTY_FILTER, + PROPERTY_PROJECTION, + PROPERTY_ALL, +}property_type_e; +*/ + +typedef struct{ + unsigned int property_id; + int type; + int property_type; + void* fields; +}property_info_s; + +typedef int (*__ctsvc_record_create_cb)(contacts_record_h* out_record); +typedef int (*__ctsvc_record_destroy_cb)(contacts_record_h record, bool delete_child ); +typedef int (*__ctsvc_record_clone_cb)(contacts_record_h record, contacts_record_h* out_record); + +typedef int (*__ctsvc_record_get_str_cb)(contacts_record_h record, unsigned int property_id,char** out_str); +typedef int (*__ctsvc_record_get_str_p_cb)(contacts_record_h record, unsigned int property_id,char** out_str); +typedef int (*__ctsvc_record_get_int_cb)(contacts_record_h record, unsigned int property_id, int* out_value); +typedef int (*__ctsvc_record_get_bool_cb)(contacts_record_h record, unsigned int property_id, bool *value); +typedef int (*__ctsvc_record_get_lli_cb)(contacts_record_h record, unsigned int property_id, long long int *value); +typedef int (*__ctsvc_record_get_double_cb)(contacts_record_h record, unsigned int property_id, double *value); + +typedef int (*__ctsvc_record_set_str_cb)(contacts_record_h record, unsigned int property_id, const char* value); +typedef int (*__ctsvc_record_set_int_cb)(contacts_record_h record, unsigned int property_id, int value); +typedef int (*__ctsvc_record_set_bool_cb)(contacts_record_h record, unsigned int property_id, bool value); +typedef int (*__ctsvc_record_set_lli_cb)(contacts_record_h record, unsigned int property_id, long long int value); +typedef int (*__ctsvc_record_set_double_cb)(contacts_record_h record, unsigned int property_id, double value); + +typedef int (*__ctsvc_record_add_child_record_cb)(contacts_record_h record, unsigned int property_id, contacts_record_h child_record); +typedef int (*__ctsvc_record_remove_child_record_cb)(contacts_record_h record, unsigned int property_id, contacts_record_h child_record); +typedef int (*__ctsvc_record_get_child_record_count_cb)(contacts_record_h record, unsigned int property_id, unsigned int *count); +typedef int (*__ctsvc_record_get_child_record_at_p_cb)(contacts_record_h record, unsigned int property_id, int index, contacts_record_h* out_record); +typedef int (*__ctsvc_record_clone_child_record_list_cb)(contacts_record_h record, unsigned int property_id, contacts_list_h* out_list); + +typedef struct { + __ctsvc_record_create_cb create; + __ctsvc_record_destroy_cb destroy; + __ctsvc_record_clone_cb clone; + __ctsvc_record_get_str_cb get_str; + __ctsvc_record_get_str_p_cb get_str_p; + __ctsvc_record_get_int_cb get_int; + __ctsvc_record_get_bool_cb get_bool; + __ctsvc_record_get_lli_cb get_lli; + __ctsvc_record_get_double_cb get_double; + __ctsvc_record_set_str_cb set_str; + __ctsvc_record_set_int_cb set_int; + __ctsvc_record_set_bool_cb set_bool; + __ctsvc_record_set_lli_cb set_lli; + __ctsvc_record_set_double_cb set_double; + __ctsvc_record_add_child_record_cb add_child_record; + __ctsvc_record_remove_child_record_cb remove_child_record; + __ctsvc_record_get_child_record_count_cb get_child_record_count; + __ctsvc_record_get_child_record_at_p_cb get_child_record_at_p; + __ctsvc_record_clone_child_record_list_cb clone_child_record_list; +}ctsvc_record_plugin_cb_s; + +typedef struct { + int r_type; + bool deleted; + const ctsvc_record_plugin_cb_s *plugin_cbs; + const char* view_uri; + unsigned int property_max_count; + unsigned char* properties_flags; +}ctsvc_record_s; + +typedef struct { + int filter_type; +}ctsvc_filter_s; + +typedef struct { + int filter_type; + char *view_uri; + GSList *filter_ops; //ctsvc_filter_operator_e op; + GSList *filters; //ctsvc_filter_h l_filter; + property_info_s *properties; + unsigned int property_count; +}ctsvc_composite_filter_s; + +typedef struct { + int filter_type; + int property_id; + int match; + union { + bool b; + int i; + char *s; + long long int l; + double d; + }value; +}ctsvc_attribute_filter_s; + +typedef struct { + char* view_uri; + ctsvc_composite_filter_s *filter; + unsigned int *projection; + unsigned int projection_count; + unsigned int sort_property_id; + bool sort_asc; + property_info_s *properties; + unsigned int property_count; + bool distinct; +}ctsvc_query_s; + +typedef struct { + int l_type; + int count; + GList *records; + GList *deleted_records; + GList *cursor; +}ctsvc_list_s; + +typedef struct { + ctsvc_record_s base; + int id; + char *name; + int account_id; + int mode; +}ctsvc_addressbook_s; + +typedef struct { + ctsvc_record_s base; + bool image_thumbnail_changed; + int id; + int addressbook_id; + bool is_read_only; + char *name; + char *system_id; + char *ringtone_path; + char *vibration; + char *image_thumbnail_path; +}ctsvc_group_s; + +typedef struct { + ctsvc_record_s base; + bool name_contact_id_changed; + bool image_thumbnail_changed; + bool ringtone_changed; + bool vibration_changed; + bool is_favorite_changed; + bool is_favorite; + bool has_phonenumber; + bool has_email; + int person_id; + int name_contact_id; + char *display_name; + char *display_name_index; + char *image_thumbnail_path; + char *ringtone_path; + char *vibration; + char *status; + int link_count; + int account_id1; + int account_id2; + int account_id3; + char *addressbook_ids; +}ctsvc_person_s; + +typedef struct { + ctsvc_record_s base; + bool display_name_changed; + bool uid_changed; + bool image_thumbnail_changed; + bool ringtone_changed; + bool vibration_changed; + bool is_restricted; + bool is_favorite; + int changed_time; + bool has_phonenumber; + bool has_email; + int person_id; + int contact_id; + int addressbook_id; + char *image_thumbnail_path; + char *ringtone_path; + char *vibration; + char *display_name; + char *uid; + int display_source_type; +}ctsvc_simple_contact_s; + +typedef struct { + ctsvc_record_s base; + bool is_default; + bool is_changed; + int id; + int contact_id; + int language_type; + char *first; + char *last; + char *addition; + char *prefix; + char *suffix; + char *phonetic_first; + char *phonetic_middle; + char *phonetic_last; + char *lookup; + char *reverse_lookup; +}ctsvc_name_s; + +typedef struct { + ctsvc_record_s base; + bool is_default; + int id; + int contact_id; + int type; + char *label; + char *number; + char *lookup; // internally used +}ctsvc_number_s; + +typedef struct { + ctsvc_record_s base; + bool is_default; + int id; + int contact_id; + int type; + char *label; + char *email_addr; +}ctsvc_email_s; + +typedef struct { + ctsvc_record_s base; + int id; + int contact_id; + int type; + char *label; + char *url; +}ctsvc_url_s; + +typedef struct { + ctsvc_record_s base; + bool is_default; + int id; + int contact_id; + int type; + char *label; + char *pobox; + char *postalcode; + char *region; + char *locality; + char *street; + char *extended; + char *country; +}ctsvc_address_s; + +typedef struct { + ctsvc_record_s base; + int id; + int contact_id; + int type; + char *label; + int date; + bool is_lunar; + int lunar_date; +}ctsvc_event_s; + +typedef struct { + ctsvc_record_s base; + int id; + int contact_id; + int type; + char *label; + char *im_id; +}ctsvc_messenger_s; + +typedef struct { + ctsvc_record_s base; + int id; + int contact_id; + int group_id; + char *group_name; +}ctsvc_group_relation_s; + +typedef struct { + ctsvc_record_s base; + int id; + int contact_id; + int type; + char *label; + char *nickname; +}ctsvc_nickname_s; + +typedef struct { + ctsvc_record_s base; + int id; + int contact_id; + int type; + char *label; + char *uid; + char *text; + int order; + char *appsvc_operation; + char *data1; + char *data2; + char *data3; + char *data4; +}ctsvc_profile_s; + +typedef struct { + ctsvc_record_s base; + int id; + int contact_id; + int type; + char *label; + char *name; +}ctsvc_relationship_s; + +typedef struct { + ctsvc_record_s base; + bool is_changed; + bool is_default; + int id; + int contact_id; + int type; + char *label; + char *path; +}ctsvc_image_s; + +typedef struct { + ctsvc_record_s base; + int id; + int contact_id; + char *note; +}ctsvc_note_s; + +typedef struct { + ctsvc_record_s base; + int id; + int contact_id; + char *source_name; + char *status; + int timestamp; + ctsvc_list_s* photos; + char *sync_data1; + char *sync_data2; + char *sync_data3; + char *sync_data4; +}ctsvc_activity_s; + +typedef struct { + ctsvc_record_s base; + int id; + int activity_id; + char *photo_url; + int sort_index; +}ctsvc_activity_photo_s; + +typedef struct { + ctsvc_record_s base; + bool logo_changed; + int id; + int contact_id; + bool is_default; + int type; + char *label; + char *name; + char *department; + char *job_title; + char *role; + char *assistant_name; + char *logo; + char *location; + char *description; + char *phonetic_name; +}ctsvc_company_s; + +typedef struct { + ctsvc_record_s base; + int id; + char *address; + int person_id; /* person id */ + int log_time; + int log_type; + int extra_data1; /* duration, message_id */ + char *extra_data2; /*short message*/ + char *display_name; // new + char *image_thumbnail_path; // new +}ctsvc_phonelog_s; + +typedef struct { + ctsvc_record_s base; + int id; + int contact_id; + int data1; + char *data2; + char *data3; + char *data4; + char *data5; + char *data6; + char *data7; + char *data8; + char *data9; + char *data10; + char *data11; + char *data12; +}ctsvc_extension_s; + +typedef struct { + ctsvc_record_s base; + bool display_name_changed; + bool uid_changed; + bool image_thumbnail_changed; + bool ringtone_changed; + bool vibration_changed; + bool is_restricted; + bool is_favorite; + int id; + int person_id; + int changed_time; + int addressbook_id; + bool has_phonenumber; + bool has_email; + char *display_name; + char *reverse_display_name; + int display_source_type; + int display_name_language; + char *sortkey; + char *reverse_sortkey; + char *uid; + char *image_thumbnail_path; + char *ringtone_path; + char *vibration; + char *sync_data1; + char *sync_data2; + char *sync_data3; + char *sync_data4; + ctsvc_list_s* name; + ctsvc_list_s* note; + ctsvc_list_s* company; + ctsvc_list_s* numbers; + ctsvc_list_s* emails; + ctsvc_list_s* grouprelations; + ctsvc_list_s* events; + ctsvc_list_s* messengers; + ctsvc_list_s* postal_addrs; + ctsvc_list_s* urls; + ctsvc_list_s* nicknames; + ctsvc_list_s* profiles; + ctsvc_list_s* relationships; + ctsvc_list_s* images; + ctsvc_list_s* extensions; +}ctsvc_contact_s; + +typedef struct { + ctsvc_record_s base; + int id; + int addressbook_id; + int changed_time; + char *display_name; + char *uid; + char *image_thumbnail_path; + ctsvc_list_s* name; + ctsvc_list_s* note; + ctsvc_list_s* company; + ctsvc_list_s* numbers; + ctsvc_list_s* emails; + ctsvc_list_s* events; + ctsvc_list_s* messengers; + ctsvc_list_s* postal_addrs; + ctsvc_list_s* urls; + ctsvc_list_s* nicknames; + ctsvc_list_s* profiles; + ctsvc_list_s* relationships; + ctsvc_list_s* images; + ctsvc_list_s* extensions; +}ctsvc_my_profile_s; + + +typedef struct { + ctsvc_record_s base; + int id; + char *name; + char *number; +}ctsvc_sdn_s; + +typedef struct { + ctsvc_record_s base; + int changed_type; + int id; + int changed_ver; + int addressbook_id; +}ctsvc_updated_info_s; + +typedef struct { + ctsvc_record_s base; + int number_id; + int person_id; + char *display_name; + char *image_thumbnail_path; + int number_type; + char *label; + char *number; + int dial_number; +}ctsvc_speeddial_s; + +typedef struct { + int property_id; + int type; + union { + bool b; + int i; + char *s; + long long int l; + double d; + }value; +}ctsvc_result_value_s; + +typedef struct { + ctsvc_record_s base; + GSList *values; +}ctsvc_result_s; + + +#endif /* __TIZEN_SOCIAL_CTSVC_STRUCT_H__ */ diff --git a/common/ctsvc_vcard.c b/common/ctsvc_vcard.c new file mode 100644 index 0000000..2c19455 --- /dev/null +++ b/common/ctsvc_vcard.c @@ -0,0 +1,2793 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_list.h" +#include "ctsvc_vcard.h" + +#define SMART_STRDUP(src) (src && *src)?strdup(src):NULL +#define CTSVC_VCARD_FILE_MAX_SIZE 1024*1024 +#define CTSVC_VCARD_PHOTO_MAX_SIZE 1024*100 +#define CTSVC_VCARD_IMAGE_LOCATION "/opt/usr/data/contacts-svc/img/vcard" + +enum { + CTSVC_VCARD_VER_NONE, + CTSVC_VCARD_VER_2_1, + CTSVC_VCARD_VER_3_0, + CTSVC_VCARD_VER_4_0, +}; + +enum { + CTSVC_VCARD_VALUE_NONE, + CTSVC_VCARD_VALUE_FN, + CTSVC_VCARD_VALUE_N, + CTSVC_VCARD_VALUE_PHONETIC_FIRST_NAME, + CTSVC_VCARD_VALUE_PHONETIC_LAST_NAME, + CTSVC_VCARD_VALUE_NICKNAME, + CTSVC_VCARD_VALUE_PHOTO, + CTSVC_VCARD_VALUE_BDAY, + CTSVC_VCARD_VALUE_ADR, + CTSVC_VCARD_VALUE_LABEL, + CTSVC_VCARD_VALUE_TEL, + CTSVC_VCARD_VALUE_EMAIL, + CTSVC_VCARD_VALUE_TITLE, + CTSVC_VCARD_VALUE_ROLE, + CTSVC_VCARD_VALUE_LOGO, + CTSVC_VCARD_VALUE_ORG, + CTSVC_VCARD_VALUE_NOTE, + CTSVC_VCARD_VALUE_REV, + CTSVC_VCARD_VALUE_UID, + CTSVC_VCARD_VALUE_URL, + CTSVC_VCARD_VALUE_X_ANNIVERSARY, + CTSVC_VCARD_VALUE_X_MSN, + CTSVC_VCARD_VALUE_X_YAHOO, + CTSVC_VCARD_VALUE_X_ICQ, + CTSVC_VCARD_VALUE_X_AIM, + CTSVC_VCARD_VALUE_X_JABBER, + CTSVC_VCARD_VALUE_X_SKYPE, + CTSVC_VCARD_VALUE_X_QQ, + CTSVC_VCARD_VALUE_X_GOOGLE_TALK, + CTSVC_VCARD_VALUE_END, + CTSVC_VCARD_VALUE_MAX +}; + +enum{ + CTSVC_VCARD_IMG_NONE, + CTSVC_VCARD_IMG_JPEG, + CTSVC_VCARD_IMG_PNG, + CTSVC_VCARD_IMG_GIF, + CTSVC_VCARD_IMG_TIFF, +}; + +static int __ctsvc_tmp_image_id = 0; +static int __ctsvc_tmp_logo_id = 0; + +static const char *content_name[CTSVC_VCARD_VALUE_MAX] = {0}; +const char *CTSVC_CRLF = "\r\n"; + +static void __ctsvc_vcard_initial(void) +{ + if (NULL == *content_name) { + //content_name[CTSVC_VCARD_VALUE_NAME] = "NAME"; /* not supported */ + //content_name[CTSVC_VCARD_VALUE_PROFILE] = "PROFILE"; /* not supported */ + //content_name[CTSVC_VCARD_VALUE_SOURCE] = "SOURCE"; /* not supported */ + content_name[CTSVC_VCARD_VALUE_FN] = "FN"; + content_name[CTSVC_VCARD_VALUE_N] = "N"; + content_name[CTSVC_VCARD_VALUE_PHONETIC_FIRST_NAME] = "X-PHONETIC-FIRST-NAME"; + content_name[CTSVC_VCARD_VALUE_PHONETIC_LAST_NAME] = "X-PHONETIC-LAST-NAME"; + content_name[CTSVC_VCARD_VALUE_NICKNAME] = "NICKNAME"; + content_name[CTSVC_VCARD_VALUE_PHOTO] = "PHOTO"; + content_name[CTSVC_VCARD_VALUE_BDAY] = "BDAY"; + content_name[CTSVC_VCARD_VALUE_ADR] = "ADR"; + content_name[CTSVC_VCARD_VALUE_LABEL] = "LABEL"; /* not supported */ + content_name[CTSVC_VCARD_VALUE_TEL] = "TEL"; + content_name[CTSVC_VCARD_VALUE_EMAIL] = "EMAIL"; + //content_name[CTSVC_VCARD_VALUE_MAILER] = "MAILER"; /* not supported */ + //content_name[CTSVC_VCARD_VALUE_TZ] = "TZ"; /* not supported */ + //content_name[CTSVC_VCARD_VALUE_GEO] = "GEO"; /* not supported */ + content_name[CTSVC_VCARD_VALUE_TITLE] = "TITLE"; + content_name[CTSVC_VCARD_VALUE_ROLE] = "ROLE"; + content_name[CTSVC_VCARD_VALUE_LOGO] = "LOGO"; + //content_name[CTSVC_VCARD_VALUE_AGENT] = "AGENT"; /* not supported */ + content_name[CTSVC_VCARD_VALUE_ORG] = "ORG"; + //content_name[CTSVC_VCARD_VALUE_CATEGORIES] = "CATEGORIES"; /* not supported */ + content_name[CTSVC_VCARD_VALUE_NOTE] = "NOTE"; + //content_name[CTSVC_VCARD_VALUE_PRODID] = "PRODID"; /* not supported */ + content_name[CTSVC_VCARD_VALUE_REV] = "REV"; + //content_name[CTSVC_VCARD_VALUE_SORT-STRING] = "SORT-STRING"; /* not supported */ + //content_name[CTSVC_VCARD_VALUE_SOUND] = "SOUND"; /* not supported */ + content_name[CTSVC_VCARD_VALUE_UID] = "UID"; + content_name[CTSVC_VCARD_VALUE_URL] = "URL"; + //content_name[CTSVC_VCARD_VALUE_VERSION] = "VERSION"; /* not supported */ + //content_name[CTSVC_VCARD_VALUE_CLASS] = "CLASS"; /* not supported */ + //content_name[CTSVC_VCARD_VALUE_KEY] = "KEY"; /* not supported */ + content_name[CTSVC_VCARD_VALUE_X_ANNIVERSARY] = "X-ANNIVERSARY"; + content_name[CTSVC_VCARD_VALUE_X_MSN] = "X-MSN"; + content_name[CTSVC_VCARD_VALUE_X_YAHOO] = "X-YAHOO"; + content_name[CTSVC_VCARD_VALUE_X_ICQ] = "X-ICQ"; + content_name[CTSVC_VCARD_VALUE_X_AIM] = "X-AIM"; + content_name[CTSVC_VCARD_VALUE_X_JABBER] = "X-JABBER"; + content_name[CTSVC_VCARD_VALUE_X_SKYPE] = "X-SKYPE"; + content_name[CTSVC_VCARD_VALUE_X_QQ] = "X-QQ"; + content_name[CTSVC_VCARD_VALUE_X_GOOGLE_TALK] = "X-GOOGLE-TALK"; + //content_name[CTSVC_VCARD_VALUE_X_CHILDREN] = "X-CHILDREN"; + content_name[CTSVC_VCARD_VALUE_END] = "END"; + } +}; + +#define CTS_VCARD_FOLDING_LIMIT 75 + +static inline int __ctsvc_vcard_add_folding(char *src) +{ + int len, result_len; + char result[CTSVC_VCARD_FILE_MAX_SIZE] = {0}; + char *r; + const char *s; + + s = src; + r = result; + len = result_len = 0; + while (*s) { + if ('\r' == *s) + len--; + else if ('\n' == *s) + len = -1; + + if (CTS_VCARD_FOLDING_LIMIT == len) { + *r = '\r'; + r++; + *r = '\n'; + r++; + *r = ' '; + r++; + len = 1; + result_len += 3; + } + + *r = *s; + r++; + s++; + len++; + result_len++; + RETVM_IF(sizeof(result) - 5 < result_len, CONTACTS_ERROR_INVALID_PARAMETER, + "src is too long\n(%s)", src); + } + *r = '\0'; + + memcpy(src, result, result_len+1); + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_vcard_append_name(ctsvc_list_s *names, + char *dest, int dest_size) +{ + int ret_len; + char display[1024] = {0}; + GList *cursor = names->records; + ctsvc_name_s *name; + + RETV_IF(NULL == cursor, 0); + + name = (ctsvc_name_s *)cursor->data; + + ret_len = snprintf(dest, dest_size, "%s", content_name[CTSVC_VCARD_VALUE_N]); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ":%s", + SAFE_STR(name->last)); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", + SAFE_STR(name->first)); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", + SAFE_STR(name->addition)); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", + SAFE_STR(name->prefix)); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s%s", + SAFE_STR(name->suffix), CTSVC_CRLF); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + + if (name->first && name->last) { + contacts_name_display_order_e order; + contacts_setting_get_name_display_order(&order); + if (CONTACTS_NAME_DISPLAY_ORDER_FIRSTLAST == order) { + snprintf(display, sizeof(display), "%s %s", name->first, name->last); + } + else { +#if 0 // TODO : implement language set + int lang; + if (CTSVC_LANG_DEFAULT == name->language_type) + lang = ctsvc_get_default_language(); + else + lang = name->language_type; + + if (CTSVC_LANG_ENGLISH == lang) + snprintf(display, sizeof(display), "%s, %s", name->last, name->first); + else + snprintf(display, sizeof(display), "%s %s", name->last, name->first); +#endif + } + } + else + snprintf(display, sizeof(display), "%s%s", SAFE_STR(name->first), SAFE_STR(name->last)); + + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", + content_name[CTSVC_VCARD_VALUE_FN], + display, CTSVC_CRLF); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + + if (name->phonetic_first) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", + content_name[CTSVC_VCARD_VALUE_PHONETIC_FIRST_NAME], name->phonetic_first, CTSVC_CRLF); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + + if (name->phonetic_last) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", + content_name[CTSVC_VCARD_VALUE_PHONETIC_LAST_NAME], name->phonetic_last, CTSVC_CRLF); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + + return ret_len; +} + +static inline const char* __ctsvc_get_img_suffix(int type) +{ + switch (type) + { + case CTSVC_VCARD_IMG_TIFF: + return "tiff"; + case CTSVC_VCARD_IMG_GIF: + return "gif"; + case CTSVC_VCARD_IMG_PNG: + return "png"; + case CTSVC_VCARD_IMG_JPEG: + case CTSVC_VCARD_IMG_NONE: + default: + return "jpeg"; + } +} + +static inline int __ctsvc_vcard_get_image_type(char *val) +{ + char *temp, *result; + + temp = val; + while (*temp) + { + *temp = tolower(*temp); + temp++; + } + + result = strstr(val, "jpeg"); + if (result) return CTSVC_VCARD_IMG_JPEG; + result = strstr(val, "jpg"); + if (result) return CTSVC_VCARD_IMG_JPEG; + + result = strstr(val, "png"); + if (result) return CTSVC_VCARD_IMG_PNG; + + result = strstr(val, "gif"); + if (result) return CTSVC_VCARD_IMG_GIF; + + result = strstr(val, "tiff"); + if (result) return CTSVC_VCARD_IMG_TIFF; + + return CTSVC_VCARD_IMG_NONE; +} + +static inline const char* __ctsvc_get_image_type_str(int type) +{ + switch (type) + { + case CTSVC_VCARD_IMG_TIFF: + return "TIFF"; + case CTSVC_VCARD_IMG_GIF: + return "GIF"; + case CTSVC_VCARD_IMG_PNG: + return "PNG"; + case CTSVC_VCARD_IMG_JPEG: + default: + return "JPEG"; + } +} + +static inline int __ctsvc_vcard_put_company_logo(const char *path, char *dest, int dest_size) +{ + int ret, fd, type; + gsize read_len; + char *suffix; + gchar *buf; + guchar image[CTSVC_VCARD_PHOTO_MAX_SIZE] = {0}; + + suffix = strrchr(path, '.'); + RETVM_IF(NULL == suffix, 0, "Image Type(%s) is invalid", path); + + type = __ctsvc_vcard_get_image_type(suffix); + RETVM_IF(CTSVC_VCARD_IMG_NONE == type, 0, "Invalid parameter : Image Type(%s) is invalid", path); + + fd = open(path, O_RDONLY); + RETVM_IF(fd < 0, CONTACTS_ERROR_SYSTEM, "System : Open(%s) Failed(%d)", path, errno); + + read_len = 0; + while ((ret = read(fd, image+read_len, sizeof(image)-read_len))) { + if (-1 == ret) { + if (EINTR == errno) + continue; + else + break; + } + read_len += ret; + } + close(fd); + RETVM_IF(ret < 0, CONTACTS_ERROR_SYSTEM, "System : read() Failed(%d)", errno); + + ret = 0; + buf = g_base64_encode(image, read_len); + if (buf) { + ret = snprintf(dest, dest_size, "%s;ENCODING=BASE64;TYPE=%s:%s%s%s", + content_name[CTSVC_VCARD_VALUE_LOGO], + __ctsvc_get_image_type_str(type), buf, CTSVC_CRLF, CTSVC_CRLF); + g_free(buf); + } + + return ret; +} + +static inline int __ctsvc_vcard_append_company(ctsvc_list_s *company_list, + char *dest, int dest_size) +{ + int ret_len = 0; + GList *cursor = company_list->records; + ctsvc_company_s *company; + RETV_IF(NULL == cursor, 0); + + company = (ctsvc_company_s *)cursor->data; + + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s", + content_name[CTSVC_VCARD_VALUE_ORG], + SAFE_STR(company->name)); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + + if (company->department) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", + company->department); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s", CTSVC_CRLF); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + + if (company->job_title) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", + content_name[CTSVC_VCARD_VALUE_TITLE], + company->job_title, CTSVC_CRLF); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + + if (company->role) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", + content_name[CTSVC_VCARD_VALUE_ROLE], + company->role, CTSVC_CRLF); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + + if (company->logo) { + ret_len += __ctsvc_vcard_put_company_logo(company->logo, dest+ret_len, dest_size-ret_len); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + + return ret_len; +} + +static inline int __ctsvc_vcard_append_note(ctsvc_list_s *note_list, + char *dest, int dest_size) +{ + int ret_len = 0; + GList *cursor = note_list->records; + ctsvc_note_s *note; + + RETV_IF(NULL == cursor, 0); + + note = (ctsvc_note_s *)cursor->data; + + if (note->note) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", + content_name[CTSVC_VCARD_VALUE_NOTE], + SAFE_STR(note->note), CTSVC_CRLF); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + + return ret_len; +} + +static inline int __ctsvc_vcard_2_put_postal_type(int type, char *dest, int dest_size) +{ + int ret_len = 0; + + if (type & CONTACTS_ADDRESS_TYPE_DOM) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "DOM"); + if (type & CONTACTS_ADDRESS_TYPE_INTL) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "INTL"); + if (type & CONTACTS_ADDRESS_TYPE_HOME) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "HOME"); + if (type & CONTACTS_ADDRESS_TYPE_WORK) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "WORK"); + if (type & CONTACTS_ADDRESS_TYPE_POSTAL) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "POSTAL"); + if (type & CONTACTS_ADDRESS_TYPE_PARCEL) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "PARCEL"); + + return ret_len; +} + +static inline int __ctsvc_vcard_put_postal_type(int type, char *label, char *dest, int dest_size) +{ + int ret_len = 0; + + if (type & CONTACTS_ADDRESS_TYPE_DOM) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "DOM"); + if (type & CONTACTS_ADDRESS_TYPE_INTL) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "INTL"); + if (type & CONTACTS_ADDRESS_TYPE_HOME) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "HOME"); + if (type & CONTACTS_ADDRESS_TYPE_WORK) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "WORK"); + if (type & CONTACTS_ADDRESS_TYPE_POSTAL) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "POSTAL"); + if (type & CONTACTS_ADDRESS_TYPE_PARCEL) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "PARCEL"); + if (type & CONTACTS_ADDRESS_TYPE_CUSTOM) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=X-%s", label); + + return ret_len; +} + +static inline int __ctsvc_vcard_append_postals(ctsvc_list_s *address_list, + char *dest, int dest_size) +{ + int ret_len = 0; + GList *cursor; + ctsvc_address_s *address; + + for (cursor = address_list->records;cursor;cursor=cursor->next) { + address = cursor->data; + if (address) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s", + content_name[CTSVC_VCARD_VALUE_ADR]); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + + ret_len += __ctsvc_vcard_put_postal_type(address->type, address->label, dest+ret_len, + dest_size-ret_len); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + + if (address->is_default) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "PREF"); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ":%s", + SAFE_STR(address->pobox)); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", + SAFE_STR(address->extended)); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", + SAFE_STR(address->street)); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", + SAFE_STR(address->locality)); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", + SAFE_STR(address->region)); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", + SAFE_STR(address->postalcode)); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s%s", + SAFE_STR(address->country), CTSVC_CRLF); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + } + + return ret_len; +} + +static inline int __ctsvc_vcard_append_nicknames(ctsvc_list_s *nickname_list, + char *dest, int dest_size) +{ + bool first; + int ret_len = 0; + GList *cursor; + ctsvc_nickname_s *nickname; + + first = true; + for (cursor=nickname_list->records;cursor;cursor=cursor->next) { + nickname = cursor->data; + if (nickname->nickname && *nickname->nickname) { + if (first) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:", + content_name[CTSVC_VCARD_VALUE_NICKNAME]); + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s", nickname->nickname); + first = false; + } + else { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ",%s", nickname->nickname); + } + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + } + + if (ret_len > 0) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s", CTSVC_CRLF); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + + return ret_len; +} + +static inline int __ctsvc_vcard_2_put_number_type(int type, char *dest, int dest_size) +{ + int ret_len = 0; + if (type & CONTACTS_NUMBER_TYPE_HOME) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "HOME"); + if (type & CONTACTS_NUMBER_TYPE_MSG) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "MSG"); + if (type & CONTACTS_NUMBER_TYPE_WORK) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "WORK"); + if (type & CONTACTS_NUMBER_TYPE_VOICE) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "VOICE"); + if (type & CONTACTS_NUMBER_TYPE_FAX) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "FAX"); + if (type & CONTACTS_NUMBER_TYPE_VOICE) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "VOICE"); + if (type & CONTACTS_NUMBER_TYPE_CELL) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "CELL"); + if (type & CONTACTS_NUMBER_TYPE_VIDEO) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "VIDEO"); + if (type & CONTACTS_NUMBER_TYPE_PAGER) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "PAGER"); + if (type & CONTACTS_NUMBER_TYPE_BBS) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "BBS"); + if (type & CONTACTS_NUMBER_TYPE_MODEM) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "MODEM"); + if (type & CONTACTS_NUMBER_TYPE_CAR) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "CAR"); + if (type & CONTACTS_NUMBER_TYPE_ISDN) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "ISDN"); + if (type & CONTACTS_NUMBER_TYPE_PCS) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "PCS"); + + return ret_len; +} + +static inline int __ctsvc_vcard_put_number_type(int type, char *label, char *dest, int dest_size) +{ + int ret_len = 0; + if (type & CONTACTS_NUMBER_TYPE_HOME) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "HOME"); + if (type & CONTACTS_NUMBER_TYPE_MSG) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "MSG"); + if (type & CONTACTS_NUMBER_TYPE_WORK) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "WORK"); + if (type & CONTACTS_NUMBER_TYPE_VOICE) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "VOICE"); + if (type & CONTACTS_NUMBER_TYPE_FAX) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "FAX"); + if (type & CONTACTS_NUMBER_TYPE_VOICE) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "VOICE"); + if (type & CONTACTS_NUMBER_TYPE_CELL) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "CELL"); + if (type & CONTACTS_NUMBER_TYPE_VIDEO) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "VIDEO"); + if (type & CONTACTS_NUMBER_TYPE_PAGER) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "PAGER"); + if (type & CONTACTS_NUMBER_TYPE_BBS) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "BBS"); + if (type & CONTACTS_NUMBER_TYPE_MODEM) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "MODEM"); + if (type & CONTACTS_NUMBER_TYPE_CAR) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "CAR"); + if (type & CONTACTS_NUMBER_TYPE_ISDN) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "ISDN"); + if (type & CONTACTS_NUMBER_TYPE_PCS) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "PCS"); + if (type & CONTACTS_NUMBER_TYPE_ASSISTANT) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "X-ASSISTANT"); + if (type & CONTACTS_NUMBER_TYPE_CUSTOM) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=X-%s", label); + return ret_len; +} + + +static inline int __ctsvc_vcard_append_numbers(ctsvc_list_s *number_list, + char *dest, int dest_size) +{ + int ret_len = 0; + GList *cursor; + ctsvc_number_s *number; + + for (cursor=number_list->records;cursor;cursor=cursor->next) { + number = cursor->data; + if (number->number) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s", + content_name[CTSVC_VCARD_VALUE_TEL]); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + + ret_len += __ctsvc_vcard_put_number_type(number->type, number->label, dest+ret_len, dest_size-ret_len); + if (number->is_default) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "PREF"); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ":%s%s", + number->number, CTSVC_CRLF); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + } + + return ret_len; +} + +static inline int __ctsvc_vcard_2_put_email_type(int type, char *dest, int dest_size) +{ + int ret_len = 0; + + if (CONTACTS_EMAIL_TYPE_HOME & type) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "HOME"); + if (CONTACTS_EMAIL_TYPE_WORK & type) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "WORK"); + + return ret_len; +} + +static inline int __ctsvc_vcard_put_email_type(int type, char *label, char *dest, int dest_size) +{ + int ret_len = 0; + + if (CONTACTS_EMAIL_TYPE_HOME & type) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "HOME"); + if (CONTACTS_EMAIL_TYPE_WORK & type) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "WORK"); + if (CONTACTS_EMAIL_TYPE_CUSTOM & type) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=X-%s", label); + + return ret_len; +} + +static inline int __ctsvc_vcard_append_emails(ctsvc_list_s *email_list, + char *dest, int dest_size) +{ + int ret_len = 0; + GList *cursor; + ctsvc_email_s *email; + + for (cursor=email_list->records;cursor;cursor=cursor->next) { + email = cursor->data; + if (email->email_addr) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s", + content_name[CTSVC_VCARD_VALUE_EMAIL]); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + + ret_len += __ctsvc_vcard_put_email_type(email->type, email->label, dest+ret_len, dest_size-ret_len); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + + if (email->is_default) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "PREF"); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + + ret_len += snprintf(dest+ret_len, dest_size-ret_len, ":%s%s", + email->email_addr, CTSVC_CRLF); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + } + + return ret_len; +} + +static inline int __ctsvc_vcard_append_webs(ctsvc_list_s *url_list, + char *dest, int dest_size) +{ + int ret_len = 0; + GList *cursor; + ctsvc_url_s *url; + + for (cursor=url_list->records;cursor;cursor=cursor->next) { + url = cursor->data; + if (url->url && *url->url) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", + content_name[CTSVC_VCARD_VALUE_URL], + url->url, CTSVC_CRLF); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + } + + return ret_len; +} + +static inline int __ctsvc_vcard_append_events(ctsvc_list_s *event_list, + char *dest, int dest_size) +{ + int ret_len = 0; + GList *cursor; + ctsvc_event_s *data; + + for (cursor=event_list->records;cursor;cursor=cursor->next) { + data = cursor->data; + if (!data->date) continue; + + if (CONTACTS_EVENT_TYPE_BIRTH == data->type) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%d-%02d-%d%s", + content_name[CTSVC_VCARD_VALUE_BDAY], + data->date/10000, (data->date%10000)/100, data->date%100, + CTSVC_CRLF); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + else if (CONTACTS_EVENT_TYPE_ANNIVERSARY == data->type) { + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%d-%02d-%d%s", + content_name[CTSVC_VCARD_VALUE_X_ANNIVERSARY], + data->date/10000, (data->date%10000)/100, data->date%100, + CTSVC_CRLF); + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + } + + return ret_len; +} + +static inline int __ctsvc_vcard_append_messengers(ctsvc_list_s *messenger_list, char *dest, int dest_size) +{ + int ret_len = 0; + GList *cursor; + ctsvc_messenger_s *messenger; + + for (cursor=messenger_list->records;cursor;cursor=cursor->next) { + messenger = cursor->data; + if (messenger->im_id && *messenger->im_id) { + switch (messenger->type) { + case CONTACTS_MESSENGER_TYPE_WLM: + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", + content_name[CTSVC_VCARD_VALUE_X_MSN], messenger->im_id, CTSVC_CRLF); + break; + case CONTACTS_MESSENGER_TYPE_YAHOO: + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", + content_name[CTSVC_VCARD_VALUE_X_YAHOO], messenger->im_id, CTSVC_CRLF); + break; + case CONTACTS_MESSENGER_TYPE_ICQ: + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", + content_name[CTSVC_VCARD_VALUE_X_ICQ], messenger->im_id, CTSVC_CRLF); + break; + case CONTACTS_MESSENGER_TYPE_AIM: + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", + content_name[CTSVC_VCARD_VALUE_X_AIM], messenger->im_id, CTSVC_CRLF); + break; + case CONTACTS_MESSENGER_TYPE_JABBER: + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", + content_name[CTSVC_VCARD_VALUE_X_JABBER], messenger->im_id, CTSVC_CRLF); + break; + case CONTACTS_MESSENGER_TYPE_SKYPE: + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", + content_name[CTSVC_VCARD_VALUE_X_SKYPE], messenger->im_id, CTSVC_CRLF); + break; + case CONTACTS_MESSENGER_TYPE_QQ: + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", + content_name[CTSVC_VCARD_VALUE_X_QQ], messenger->im_id, CTSVC_CRLF); + break; + case CONTACTS_MESSENGER_TYPE_GOOGLE: + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", + content_name[CTSVC_VCARD_VALUE_X_GOOGLE_TALK], messenger->im_id, CTSVC_CRLF); + break; + default: + break; + } + RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL); + } + } + return ret_len; +} + +static inline int __ctsvc_vcard_put_photo(ctsvc_list_s *image_list, char *dest, int dest_size) +{ + int ret = 0, fd, type; + gsize read_len; + char *suffix; + gchar *buf; + guchar image[CTSVC_VCARD_PHOTO_MAX_SIZE] = {0}; + + GList *cursor; + ctsvc_image_s *data; + + for (cursor=image_list->records;cursor;cursor=cursor->next) { + data = cursor->data; + if (!data->path) continue; + + suffix = strrchr(data->path, '.'); + RETVM_IF(NULL == suffix, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : Image Type(%s) is invalid", data->path); + + type = __ctsvc_vcard_get_image_type(suffix); + RETVM_IF(CTSVC_VCARD_IMG_NONE == type, 0, "Invalid parameter : Image Type(%s) is invalid", data->path); + + fd = open(data->path, O_RDONLY); + RETVM_IF(fd < 0, CONTACTS_ERROR_SYSTEM, "System : Open(%s) Failed(%d)", data->path, errno); + + read_len = 0; + while ((ret = read(fd, image+read_len, sizeof(image)-read_len))) { + if (-1 == ret) { + if (EINTR == errno) + continue; + else + break; + } + read_len += ret; + } + close(fd); + RETVM_IF(ret < 0, CONTACTS_ERROR_SYSTEM, "System : read() Failed(%d)", errno); + + ret = 0; + buf = g_base64_encode(image, read_len); + + if (buf) { + ret = snprintf(dest, dest_size, "%s;ENCODING=BASE64;TYPE=%s:%s%s%s", + content_name[CTSVC_VCARD_VALUE_PHOTO], + __ctsvc_get_image_type_str(type), buf, CTSVC_CRLF, CTSVC_CRLF); + g_free(buf); + RETV_IF(dest_size <= ret, CONTACTS_ERROR_INTERNAL); + } + } + + return ret; +} + +static inline int __ctsvc_vcard_append_contact(ctsvc_contact_s *contact, + char *dest, int dest_size) +{ + int ret_len = 0; + int ret; + + if (contact->name) { + ret = __ctsvc_vcard_append_name(contact->name, + dest+ret_len, dest_size-ret_len); + RETV_IF(ret < 0, ret); + ret_len += ret; + } + if (contact->company) { + ret = __ctsvc_vcard_append_company(contact->company, + dest+ret_len, dest_size-ret_len); + RETV_IF(ret < 0, ret); + ret_len += ret; + } + if (contact->note) { + ret = __ctsvc_vcard_append_note(contact->note, + dest+ret_len, dest_size-ret_len); + RETV_IF(ret < 0, ret); + ret_len += ret; + } + if (contact->postal_addrs) { + ret = __ctsvc_vcard_append_postals(contact->postal_addrs, + dest+ret_len, dest_size-ret_len); + RETV_IF(ret < 0, ret); + ret_len += ret; + } + if (contact->numbers) { + ret = __ctsvc_vcard_append_numbers(contact->numbers, + dest+ret_len, dest_size-ret_len); + RETV_IF(ret < 0, ret); + ret_len += ret; + } + if (contact->emails) { + ret = __ctsvc_vcard_append_emails(contact->emails, + dest+ret_len, dest_size-ret_len); + RETV_IF(ret < 0, ret); + ret_len += ret; + } + if (contact->nicknames) { + ret = __ctsvc_vcard_append_nicknames(contact->nicknames, + dest+ret_len, dest_size-ret_len); + RETV_IF(ret < 0, ret); + ret_len += ret; + } + if (contact->urls) { + ret = __ctsvc_vcard_append_webs(contact->urls, + dest+ret_len, dest_size-ret_len); + RETV_IF(ret < 0, ret); + ret_len += ret; + } + if (contact->events) { + ret = __ctsvc_vcard_append_events(contact->events, + dest+ret_len, dest_size-ret_len); + RETV_IF(ret < 0, ret); + ret_len += ret; + } + if (contact->images) { + ret = __ctsvc_vcard_put_photo(contact->images, + dest+ret_len, dest_size-ret_len); + RETV_IF(ret < 0, ret); + ret_len += ret; + } + if (contact->messengers) { + ret = __ctsvc_vcard_append_messengers(contact->messengers, dest+ret_len, dest_size-ret_len); + RETV_IF(ret < 0, ret); + ret_len += ret; + } + if (contact->uid) + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", + content_name[CTSVC_VCARD_VALUE_UID], + contact->uid, CTSVC_CRLF); + if (contact->changed_time) { + struct tm ts; + gmtime_r((time_t *)&contact->changed_time, &ts); + ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%04d-%02d-%02dT%02d:%02d:%02dZ%s", + content_name[CTSVC_VCARD_VALUE_REV], + 1900+ts.tm_year, 1+ts.tm_mon, ts.tm_mday, + ts.tm_hour, ts.tm_min, ts.tm_sec, + CTSVC_CRLF); + } +#if 0 + char *image_path; + ctsvc_list_s* grouprelations; + ctsvc_list_s* profile; + ctsvc_list_s* relationships; +#endif + return ret_len; +} + +static int __ctsvc_vcard_make(ctsvc_contact_s *contact, char **vcard_stream) +{ + int ret_len, ret; + char result[CTSVC_VCARD_FILE_MAX_SIZE] = {0}; + + __ctsvc_vcard_initial(); + + ret_len = snprintf(result, sizeof(result), "%s%s", "BEGIN:VCARD", CTSVC_CRLF); + ret_len += snprintf(result+ret_len, sizeof(result)-ret_len, + "%s%s%s", "VERSION:", "3.0", CTSVC_CRLF); + + ret = __ctsvc_vcard_append_contact(contact, + result+ret_len, sizeof(result)-ret_len); + RETVM_IF(ret < 0, CONTACTS_ERROR_INTERNAL, + "This contact has too many information"); + ret_len += ret; + RETVM_IF(sizeof(result)-ret_len <= 0, CONTACTS_ERROR_INTERNAL, + "This contact has too many information"); + + ret_len += snprintf(result+ret_len, sizeof(result)-ret_len, + "%s%s", "END:VCARD", CTSVC_CRLF); + + ret = __ctsvc_vcard_add_folding(result); + RETV_IF (CONTACTS_ERROR_NONE != ret, ret); + + *vcard_stream = strdup(result); + + return CONTACTS_ERROR_NONE; +} + +API int contacts_vcard_make_from_contact(contacts_record_h record, char **vcard_stream) +{ + ctsvc_contact_s *contact; + RETV_IF(NULL == vcard_stream, CONTACTS_ERROR_INVALID_PARAMETER); + *vcard_stream = NULL; + + RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact(%p), vcard_stream(%p)", record, vcard_stream); + + contact = (ctsvc_contact_s*)record; + RETVM_IF(CTSVC_RECORD_CONTACT != contact->base.r_type, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : The record is not conatct record (type : %d)", contact->base.r_type); + + __ctsvc_vcard_make(contact, vcard_stream); + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_vcard_append_person(ctsvc_person_s *person, ctsvc_list_s *list_contacts, char *dest, int dest_size) +{ + int ret; + int ret_len = 0; + int total_len = 0; + int changed_time = 0; + ctsvc_contact_s *contact; + ctsvc_simple_contact_s *simple_contact; + GList *cursor = NULL; + + for(cursor=list_contacts->records;cursor;cursor=cursor->next) { + simple_contact = (ctsvc_simple_contact_s *)cursor->data; + ret = contacts_db_get_record(_contacts_contact._uri, simple_contact->contact_id, (contacts_record_h *)&contact); + if (CONTACTS_ERROR_NONE == ret && contact && contact->id == person->name_contact_id && contact->name) { + ret_len = __ctsvc_vcard_append_name(contact->name, dest+total_len, dest_size-total_len); + RETVM_IF(ret_len < 0, CONTACTS_ERROR_INTERNAL, "This person has too many information"); + total_len += ret_len; + break; + } + } + + for(cursor=list_contacts->records;cursor;cursor=cursor->next) { + simple_contact = (ctsvc_simple_contact_s *)cursor->data; + ret = contacts_db_get_record(_contacts_contact._uri, simple_contact->contact_id, (contacts_record_h *)&contact); + if (CONTACTS_ERROR_NONE == ret && contact && contact->company && contact->company->cursor) { + ret_len = __ctsvc_vcard_append_company(contact->company, dest+total_len, dest_size-total_len); + RETVM_IF(ret_len < 0, CONTACTS_ERROR_INTERNAL, "This person has too many information"); + total_len += ret_len; + } + } + for(cursor=list_contacts->records;cursor;cursor=cursor->next) { + simple_contact = (ctsvc_simple_contact_s *)cursor->data; + ret = contacts_db_get_record(_contacts_contact._uri, simple_contact->contact_id, (contacts_record_h *)&contact); + if (CONTACTS_ERROR_NONE == ret && contact && contact->note && contact->note->cursor) { + ret_len = __ctsvc_vcard_append_note(contact->note, dest+total_len, dest_size-total_len); + RETVM_IF(ret_len < 0, CONTACTS_ERROR_INTERNAL, "This person has too many information"); + total_len += ret_len; + } + } + for(cursor=list_contacts->records;cursor;cursor=cursor->next) { + simple_contact = (ctsvc_simple_contact_s *)cursor->data; + ret = contacts_db_get_record(_contacts_contact._uri, simple_contact->contact_id, (contacts_record_h *)&contact); + if (CONTACTS_ERROR_NONE == ret && contact && contact->postal_addrs && contact->postal_addrs->cursor) { + ret_len = __ctsvc_vcard_append_postals(contact->postal_addrs, dest+total_len, dest_size-total_len); + RETVM_IF(ret_len < 0, CONTACTS_ERROR_INTERNAL, "This person has too many information"); + total_len += ret_len; + } + } + for(cursor=list_contacts->records;cursor;cursor=cursor->next) { + simple_contact = (ctsvc_simple_contact_s *)cursor->data; + ret = contacts_db_get_record(_contacts_contact._uri, simple_contact->contact_id, (contacts_record_h *)&contact); + if (CONTACTS_ERROR_NONE == ret && contact && contact->numbers && contact->numbers->cursor) { + ret_len = __ctsvc_vcard_append_numbers(contact->numbers, dest+total_len, dest_size-total_len); + RETVM_IF(ret_len < 0, CONTACTS_ERROR_INTERNAL, "This person has too many information"); + total_len += ret_len; + } + } + for(cursor=list_contacts->records;cursor;cursor=cursor->next) { + simple_contact = (ctsvc_simple_contact_s *)cursor->data; + ret = contacts_db_get_record(_contacts_contact._uri, simple_contact->contact_id, (contacts_record_h *)&contact); + if (CONTACTS_ERROR_NONE == ret && contact && contact->emails && contact->emails->cursor) { + ret_len = __ctsvc_vcard_append_emails(contact->emails, dest+total_len, dest_size-total_len); + RETVM_IF(ret_len < 0, CONTACTS_ERROR_INTERNAL, "This person has too many information"); + total_len += ret_len; + } + } + for(cursor=list_contacts->records;cursor;cursor=cursor->next) { + simple_contact = (ctsvc_simple_contact_s *)cursor->data; + ret = contacts_db_get_record(_contacts_contact._uri, simple_contact->contact_id, (contacts_record_h *)&contact); + if (CONTACTS_ERROR_NONE == ret && contact && contact->nicknames && contact->nicknames->cursor) { + ret_len = __ctsvc_vcard_append_nicknames(contact->nicknames, dest+total_len, dest_size-total_len); + RETVM_IF(ret_len < 0, CONTACTS_ERROR_INTERNAL, "This person has too many information"); + total_len += ret_len; + } + } + for(cursor=list_contacts->records;cursor;cursor=cursor->next) { + simple_contact = (ctsvc_simple_contact_s *)cursor->data; + ret = contacts_db_get_record(_contacts_contact._uri, simple_contact->contact_id, (contacts_record_h *)&contact); + if (CONTACTS_ERROR_NONE == ret && contact && contact->urls && contact->urls->cursor) { + ret_len = __ctsvc_vcard_append_webs(contact->urls, dest+total_len, dest_size-total_len); + RETVM_IF(ret_len < 0, CONTACTS_ERROR_INTERNAL, "This person has too many information"); + total_len += ret_len; + } + } + for(cursor=list_contacts->records;cursor;cursor=cursor->next) { + simple_contact = (ctsvc_simple_contact_s *)cursor->data; + ret = contacts_db_get_record(_contacts_contact._uri, simple_contact->contact_id, (contacts_record_h *)&contact); + if (CONTACTS_ERROR_NONE == ret && contact && contact->events && contact->events->cursor) { + ret_len = __ctsvc_vcard_append_events(contact->events, dest+total_len, dest_size-total_len); + RETVM_IF(ret_len < 0, CONTACTS_ERROR_INTERNAL, "This person has too many information"); + total_len += ret_len; + } + } + for(cursor=list_contacts->records;cursor;cursor=cursor->next) { + simple_contact = (ctsvc_simple_contact_s *)cursor->data; + ret = contacts_db_get_record(_contacts_contact._uri, simple_contact->contact_id, (contacts_record_h *)&contact); + if (CONTACTS_ERROR_NONE == ret && contact && contact->images && contact->images->cursor) { + ret_len = __ctsvc_vcard_put_photo(contact->images, dest+total_len, dest_size-total_len); + RETVM_IF(ret_len < 0, CONTACTS_ERROR_INTERNAL, "This person has too many information"); + total_len += ret_len; + } + } + for(cursor=list_contacts->records;cursor;cursor=cursor->next) { + simple_contact = (ctsvc_simple_contact_s *)cursor->data; + ret = contacts_db_get_record(_contacts_contact._uri, simple_contact->contact_id, (contacts_record_h *)&contact); + if (CONTACTS_ERROR_NONE == ret && contact && contact->messengers && contact->messengers->cursor) { + ret_len = __ctsvc_vcard_append_messengers(contact->messengers, dest+total_len, dest_size-total_len); + RETVM_IF(ret_len < 0, CONTACTS_ERROR_INTERNAL, "This person has too many information"); + total_len += ret_len; + } + } + for(cursor=list_contacts->records;cursor;cursor=cursor->next) { + simple_contact = (ctsvc_simple_contact_s *)cursor->data; + ret = contacts_db_get_record(_contacts_contact._uri, simple_contact->contact_id, (contacts_record_h *)&contact); + if (CONTACTS_ERROR_NONE == ret && contact && contact->uid) { + ret_len = snprintf(dest+total_len, dest_size-total_len, "%s:%s%s", content_name[CTSVC_VCARD_VALUE_UID], contact->uid, CTSVC_CRLF); + RETVM_IF(ret_len < 0, CONTACTS_ERROR_INTERNAL, "This person has too many information"); + total_len += ret_len; + } + } + for(cursor=list_contacts->records;cursor;cursor=cursor->next) { + simple_contact = (ctsvc_simple_contact_s *)cursor->data; + ret = contacts_db_get_record(_contacts_contact._uri, simple_contact->contact_id, (contacts_record_h *)&contact); + if (CONTACTS_ERROR_NONE == ret && contact && changed_time < contact->changed_time) + changed_time = contact->changed_time; + } + if (changed_time) { + struct tm ts; + gmtime_r((time_t *)&changed_time, &ts); + ret_len = snprintf(dest+total_len, dest_size-total_len, "%s:%04d-%02d-%02dT%02d:%02d:%02dZ%s", + content_name[CTSVC_VCARD_VALUE_REV], + 1900+ts.tm_year, 1+ts.tm_mon, ts.tm_mday, + ts.tm_hour, ts.tm_min, ts.tm_sec, + CTSVC_CRLF); + RETVM_IF(ret_len < 0, CONTACTS_ERROR_INTERNAL, "This person has too many information"); + total_len += ret_len; + } +#if 0 + char *image_path; + ctsvc_list_s* grouprelations; + ctsvc_list_s* profile; + ctsvc_list_s* relationships; +#endif + return total_len; +} + +static int __ctsvc_vcard_make_from_person(ctsvc_person_s *person, ctsvc_list_s *list_contacts, + char **vcard_stream) +{ + int ret_len, ret; + char *result = NULL; + + RETV_IF(NULL == vcard_stream, CONTACTS_ERROR_INVALID_PARAMETER); + *vcard_stream = NULL; + + result = calloc(1, CTSVC_VCARD_FILE_MAX_SIZE); + RETVM_IF(NULL == result, CONTACTS_ERROR_OUT_OF_MEMORY, "Out of memory : calloc() Failed()"); + + __ctsvc_vcard_initial(); + + ret_len = snprintf(result, CTSVC_VCARD_FILE_MAX_SIZE, "%s%s", "BEGIN:VCARD", CTSVC_CRLF); + ret_len += snprintf(result+ret_len, CTSVC_VCARD_FILE_MAX_SIZE-ret_len, "%s%s%s", "VERSION:", "3.0", CTSVC_CRLF); + ret = __ctsvc_vcard_append_person(person, list_contacts, result+ret_len, CTSVC_VCARD_FILE_MAX_SIZE-ret_len); + if (ret < 0) { + free(result); + return ret; + } + + ret_len += ret; + if (CTSVC_VCARD_FILE_MAX_SIZE-ret_len <= 0) { + CTS_ERR("This person has too many information"); + free(result); + return CONTACTS_ERROR_INTERNAL; + } + + ret_len += snprintf(result+ret_len, CTSVC_VCARD_FILE_MAX_SIZE-ret_len, "%s%s", "END:VCARD", CTSVC_CRLF); + if (CTSVC_VCARD_FILE_MAX_SIZE-ret_len <= 0) { + CTS_ERR("This person has too many information"); + free(result); + return CONTACTS_ERROR_INTERNAL; + } + + ret = __ctsvc_vcard_add_folding(result); + if (CONTACTS_ERROR_NONE != ret) { + free(result); + return ret; + } + + *vcard_stream = strdup(result); + free(result); + + return CONTACTS_ERROR_NONE; +} + +API int contacts_vcard_make_from_person(contacts_record_h record, char **vcard_stream) +{ + int ret; + ctsvc_person_s *person; + contacts_query_h query = NULL; + contacts_filter_h filter = NULL; + contacts_list_h list = NULL; + + RETVM_IF(NULL == record || NULL == vcard_stream, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : person(%p), vcard_stream(%p)", record, vcard_stream); + *vcard_stream = NULL; + + person = (ctsvc_person_s *)record; + + RETVM_IF(CTSVC_RECORD_PERSON != person->base.r_type, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid paramter : The record is not conatct record (type : %d)", person->base.r_type); + + contacts_filter_create(_contacts_simple_contact._uri, &filter); + ret = contacts_filter_add_int(filter, _contacts_simple_contact.person_id, CONTACTS_MATCH_EQUAL, person->person_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("Invalid paramter : contacts_filter_add_int is failed", ret); + contacts_filter_destroy(filter); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + contacts_query_create(_contacts_simple_contact._uri, &query); + contacts_query_set_filter(query, filter); + ret = contacts_db_get_records_with_query(query, 0, 0, &list); + + if (ret == CONTACTS_ERROR_NONE) + __ctsvc_vcard_make_from_person(person, (ctsvc_list_s *)list, vcard_stream); + + contacts_query_destroy(query); + contacts_filter_destroy(filter); + contacts_list_destroy(list, true); + + return CONTACTS_ERROR_NONE; +} + +//////////////////////////////////////////////////////////////////////////// +static inline char* __ctsvc_vcard_remove_empty_line(char *src) +{ + while (*src) { + if ('\n' != *src && '\r' != *src) + break; + src++; + } + return src; +} + +static char* __ctsvc_vcard_check_word(char *src, const char *word) +{ + bool start = false; + + RETVM_IF(NULL == src, NULL, "The src is NULL."); + + src = __ctsvc_vcard_remove_empty_line(src); + + while (*src) { + switch (*src) { + case ' ': + case ':': + case ';': + src++; + break; + default: + start = true; + break; + } + if (start) break; + } + + while (*src == *word) { + src++; + word++; + + if ('\0' == *src || '\0' == *word) + break; + } + + if ('\0' == *word) + return src; + else + return NULL; +} + +static int __ctsvc_vcard_check_content_type(char **vcard) +{ + int i; + char *new_start; + + for (i=CTSVC_VCARD_VALUE_NONE+1;ipobox, text, temp); + CTS_GET_ADDR_COMPONENT(((ctsvc_address_s*)address)->extended, text, temp); + CTS_GET_ADDR_COMPONENT(((ctsvc_address_s*)address)->street, text, temp); + CTS_GET_ADDR_COMPONENT(((ctsvc_address_s*)address)->locality, text, temp); + CTS_GET_ADDR_COMPONENT(((ctsvc_address_s*)address)->region, text, temp); + CTS_GET_ADDR_COMPONENT(((ctsvc_address_s*)address)->postalcode, text, temp); + CTS_GET_ADDR_COMPONENT(((ctsvc_address_s*)address)->country, text, temp); + + CTS_ERR("invalid ADR type(%s)", temp); + break; + } + + if (((ctsvc_address_s*)address)->pobox || ((ctsvc_address_s*)address)->extended + || ((ctsvc_address_s*)address)->street || ((ctsvc_address_s*)address)->locality + || ((ctsvc_address_s*)address)->region || ((ctsvc_address_s*)address)->postalcode + || ((ctsvc_address_s*)address)->country) { + contacts_record_set_bool(address, _contacts_address.is_default, __ctsvc_vcard_get_postal_type(address, val)); + } else { + CTS_ERR("Invalid vcard(%s)", val); + contacts_record_destroy(address, true); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + contacts_list_add((contacts_list_h)address_list, address); + } + + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_vcard_get_messenger(ctsvc_list_s* messenger_list, int type, char *val) +{ + int ret; + contacts_record_h messenger; + char *temp; + + temp = __ctsvc_get_content_value(val); + RETVM_IF(NULL == temp, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : vcard(%s)", val); + + ret = contacts_record_create(_contacts_messenger._uri, &messenger); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_record_create is failed(%d)", ret); + + contacts_record_set_str(messenger, _contacts_messenger.im_id, temp); + + switch (type) { + case CTSVC_VCARD_VALUE_X_MSN: + contacts_record_set_int(messenger, _contacts_messenger.type, CONTACTS_MESSENGER_TYPE_WLM); + break; + case CTSVC_VCARD_VALUE_X_YAHOO: + contacts_record_set_int(messenger, _contacts_messenger.type, CONTACTS_MESSENGER_TYPE_YAHOO); + break; + case CTSVC_VCARD_VALUE_X_ICQ: + contacts_record_set_int(messenger, _contacts_messenger.type, CONTACTS_MESSENGER_TYPE_ICQ); + break; + case CTSVC_VCARD_VALUE_X_AIM: + contacts_record_set_int(messenger, _contacts_messenger.type, CONTACTS_MESSENGER_TYPE_AIM); + break; + case CTSVC_VCARD_VALUE_X_JABBER: + contacts_record_set_int(messenger, _contacts_messenger.type, CONTACTS_MESSENGER_TYPE_JABBER); + break; + case CTSVC_VCARD_VALUE_X_SKYPE: + contacts_record_set_int(messenger, _contacts_messenger.type, CONTACTS_MESSENGER_TYPE_SKYPE); + break; + case CTSVC_VCARD_VALUE_X_QQ: + contacts_record_set_int(messenger, _contacts_messenger.type, CONTACTS_MESSENGER_TYPE_QQ); + break; + case CTSVC_VCARD_VALUE_X_GOOGLE_TALK: + contacts_record_set_int(messenger, _contacts_messenger.type, CONTACTS_MESSENGER_TYPE_GOOGLE); + break; + } + contacts_list_add((contacts_list_h)messenger_list, messenger); + + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_vcard_get_contact(int ver, char *vcard, contacts_record_h *record) +{ + int type; + char *cursor, *new_start, *val; + ctsvc_contact_s *contact = (ctsvc_contact_s*)*record; + + cursor = vcard; + while (cursor) { + type = __ctsvc_vcard_check_content_type(&cursor); + if (CTSVC_VCARD_VALUE_NONE == type) { + new_start = __ctsvc_vcard_pass_unsupported(cursor); + if (new_start) { + cursor = new_start; + continue; + } + else + break; + } + + new_start = __ctsvc_vcard_get_val(ver, cursor, &val); + if (NULL == new_start) + continue; + + if (NULL == val) { + cursor = new_start; + continue; + } + + switch (type) { + case CTSVC_VCARD_VALUE_FN: + __ctsvc_vcard_get_display_name(contact->name, val); + free(val); + break; + case CTSVC_VCARD_VALUE_N: + __ctsvc_vcard_get_name(contact->name, val); + free(val); + break; + case CTSVC_VCARD_VALUE_PHONETIC_FIRST_NAME: + case CTSVC_VCARD_VALUE_PHONETIC_LAST_NAME: + __ctsvc_vcard_get_phonetic_name(contact->name, type, val); + free(val); + break; + case CTSVC_VCARD_VALUE_NICKNAME: + __ctsvc_vcard_get_nickname(contact->nicknames, val); + free(val); + break; + case CTSVC_VCARD_VALUE_PHOTO: + __ctsvc_vcard_get_photo(*record, contact->images, val); + free(val); + break; + case CTSVC_VCARD_VALUE_BDAY: + __ctsvc_vcard_get_event(contact->events, CONTACTS_EVENT_TYPE_BIRTH, val); + free(val); + break; + case CTSVC_VCARD_VALUE_ADR: + case CTSVC_VCARD_VALUE_LABEL: + __ctsvc_vcard_get_address(contact->postal_addrs, val); + free(val); + break; + case CTSVC_VCARD_VALUE_TEL: + __ctsvc_vcard_get_number(contact->numbers, val); + free(val); + break; + case CTSVC_VCARD_VALUE_EMAIL: + __ctsvc_vcard_get_email(contact->emails, val); + free(val); + break; + case CTSVC_VCARD_VALUE_TITLE: + __ctsvc_vcard_get_company(contact->company, _contacts_company.job_title, val); + free(val); + break; + case CTSVC_VCARD_VALUE_ROLE: + __ctsvc_vcard_get_company(contact->company, _contacts_company.role, val); + free(val); + break; + case CTSVC_VCARD_VALUE_LOGO: + __ctsvc_vcard_get_company_logo(contact->company, val); + free(val); + break; + case CTSVC_VCARD_VALUE_ORG: + __ctsvc_vcard_get_company(contact->company, _contacts_company.name, val); + free(val); + break; + case CTSVC_VCARD_VALUE_NOTE: + __ctsvc_vcard_get_note(contact->note, val); + free(val); + break; + case CTSVC_VCARD_VALUE_REV: + if (*val) + contact->changed_time = __ctsvc_vcard_get_time(val); + free(val); + break; + case CTSVC_VCARD_VALUE_UID: + contacts_record_set_str((contacts_record_h)contact, _contacts_contact.uid, val); + free(val); + break; + case CTSVC_VCARD_VALUE_URL: + __ctsvc_vcard_get_url(contact->urls, val); + free(val); + break; + case CTSVC_VCARD_VALUE_X_ANNIVERSARY: + __ctsvc_vcard_get_event(contact->events, CONTACTS_EVENT_TYPE_ANNIVERSARY, val); + free(val); + break; + case CTSVC_VCARD_VALUE_X_MSN: + case CTSVC_VCARD_VALUE_X_YAHOO: + case CTSVC_VCARD_VALUE_X_ICQ: + case CTSVC_VCARD_VALUE_X_AIM: + case CTSVC_VCARD_VALUE_X_JABBER: + case CTSVC_VCARD_VALUE_X_SKYPE: + case CTSVC_VCARD_VALUE_X_QQ: + case CTSVC_VCARD_VALUE_X_GOOGLE_TALK: + __ctsvc_vcard_get_messenger(contact->messengers, type, val); + free(val); + break; + case CTSVC_VCARD_VALUE_END: + free(val); + return CONTACTS_ERROR_NONE; + default: + CTS_ERR("Invalid parameter : __ctsvc_vcard_check_content_type() Failed(%d)", type); + free(val); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + cursor = new_start; + } + + CTS_ERR("Invalid vcard(%s)", vcard); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static inline int __ctsvc_vcard_check_version(const char *src) +{ + bool start = false; + const char *ver3 = "3.0"; + + while (*src) { + switch (*src) { + case '\n': + case '\r': + return CTSVC_VCARD_VER_2_1; + case ' ': + src++; + break; + default: + start = true; + break; + } + if (start) break; + } + + if (0 == strcmp(src, ver3)) + return CTSVC_VCARD_VER_3_0; + else + return CTSVC_VCARD_VER_2_1; +} + +static inline void __ctsvc_vcard_make_contact_display_name(ctsvc_contact_s *contact) +{ + GList *cur; + + ctsvc_name_s *name = NULL; + if ( contact->name->count > 0 && contact->name->records != NULL && contact->name->records->data != NULL ) + { + name = (ctsvc_name_s *)contact->name->records->data; + } + + if ( name && ( name->first || name->last) ) { + if (name->first && name->last) { + char display[strlen(name->first) + strlen(name->last) + 3]; + snprintf(display, sizeof(display),"%s %s",name->first,name->last); + contact->display_name = strdup(display); + snprintf(display, sizeof(display),"%s, %s",name->last, name->first); + contact->reverse_display_name = strdup(display); + } + else if (name->first) { + contact->display_name = strdup(name->first); + contact->reverse_display_name = strdup(name->first); + } + else { + contact->display_name = strdup(name->last); + contact->reverse_display_name = strdup(name->last); + } + + contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME; + } + else { + if (contact->company && contact->company->records) { + for (cur=contact->company->records;cur;cur=cur->next) { + ctsvc_company_s *company = (ctsvc_company_s *)cur->data; + if (company && company->name) { + contact->display_name = SAFE_STRDUP(company->name); + contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY; + break; + } + } + } + + if (NULL == contact->display_name && contact->nicknames->records) { + for (cur=contact->nicknames->records;cur;cur=cur->next) { + ctsvc_nickname_s *nickname = (ctsvc_nickname_s *)cur->data; + if (nickname && nickname->nickname) { + contact->display_name = SAFE_STRDUP(nickname->nickname); + contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME; + break; + } + } + } + + if (NULL == contact->display_name && contact->numbers->records) { + for (cur=contact->numbers->records;cur;cur=cur->next) { + ctsvc_number_s *number = (ctsvc_number_s *)cur->data; + if (number && number->number) { + contact->display_name = SAFE_STRDUP(number->number); + contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NUMBER; + break; + } + } + } + + if (NULL == contact->display_name && contact->emails->records) { + for (cur=contact->emails->records;cur;cur=cur->next) { + ctsvc_email_s *email = (ctsvc_email_s *)cur->data; + if (email && email->email_addr) { + contact->display_name = SAFE_STRDUP(email->email_addr); + contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_EMAIL; + break; + } + } + } + } +} + +static int __ctsvc_vcard_parse(const void *vcard_stream, contacts_record_h *record) +{ + int ret, ver; + ctsvc_contact_s *contact; + char *val_begin, *new_start, *val; + char *vcard = (char *)vcard_stream; + + RETV_IF(NULL == vcard_stream, CONTACTS_ERROR_INVALID_PARAMETER); + + __ctsvc_vcard_initial(); + + vcard = __ctsvc_vcard_check_word(vcard, "BEGIN:VCARD"); + RETVM_IF(NULL == vcard, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : The vcard is invalid."); + + val_begin = __ctsvc_vcard_check_word(vcard, "VERSION:"); + new_start = __ctsvc_vcard_get_val(CTSVC_VCARD_VER_NONE, val_begin, &val); + if (NULL == new_start || NULL == val) + ver = CTSVC_VCARD_VER_2_1; + else { + ver = __ctsvc_vcard_check_version(val); + free(val); + vcard = new_start; + } + + contacts_record_create(_contacts_contact._uri, (contacts_record_h *)&contact); + RETVM_IF(NULL == contact, CONTACTS_ERROR_OUT_OF_MEMORY, "Out of memory : contacts_record_create() Failed"); + + ret = __ctsvc_vcard_get_contact(ver, vcard, (contacts_record_h *)&contact); + if (CONTACTS_ERROR_NONE!= ret) { + contacts_record_destroy((contacts_record_h)contact, true); + if (CONTACTS_ERROR_INVALID_PARAMETER == ret) + CTS_ERR("cts_vcard_get_contact() Failed(%d)\n %s \n", ret, vcard); + else + CTS_ERR("cts_vcard_get_contact() Failed(%d)", ret); + + return ret; + } + __ctsvc_vcard_make_contact_display_name(contact); + *record = (contacts_record_h)contact; + return CONTACTS_ERROR_NONE; +} + +#define CTSVC_VCARD_MAX_SIZE 1024*1024 + +API int contacts_vcard_parse_to_contacts(const char *vcard_stream, contacts_list_h *out_contacts) +{ + contacts_record_h record; + contacts_list_h list = NULL; + int len; + int ret; + int pos = 0; + int begin_pos; + char *stream; + char *temp; + char *vcard; + const char* sep = "END:VCARD"; + const char* begin_sep = "BEGIN:VCARD"; + + RETV_IF(NULL == out_contacts, CONTACTS_ERROR_INVALID_PARAMETER); + *out_contacts = NULL; + + RETV_IF(NULL == vcard_stream, CONTACTS_ERROR_INVALID_PARAMETER); + + temp = strstr(vcard_stream, begin_sep); + if(NULL == temp) + return CONTACTS_ERROR_INVALID_PARAMETER; + begin_pos = temp - vcard_stream; + vcard = strstr(temp, sep); + if(NULL == vcard) + return CONTACTS_ERROR_INVALID_PARAMETER; + pos = vcard - vcard_stream + strlen(sep); + len = vcard - temp + strlen(sep); + while (temp) { + stream = malloc(len+1); + snprintf(stream, len, "%s", vcard_stream+begin_pos); + stream[len] = '\0'; + + ret = __ctsvc_vcard_parse(stream, &record); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("Invalid parameter : vcard stream parsing error"); + free(stream); + contacts_list_destroy(list, true); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + if (NULL == list) + contacts_list_create(&list); + contacts_list_add(list, record); + free(stream); + vcard = (char*)(vcard_stream + pos); + temp = strstr(vcard, begin_sep); + if(NULL == temp) + break; + begin_pos = temp - vcard_stream; + vcard = strstr(temp, sep); + if (NULL == vcard) + break; + pos = vcard - vcard_stream + strlen(sep); + len = vcard - temp + strlen(sep); + } + + *out_contacts = list; + return CONTACTS_ERROR_NONE; +} + +API int contacts_vcard_parse_to_contact_foreach(const char *vcard_file_name, + contacts_vcard_parse_cb cb, void *data) +{ + contacts_record_h record; + FILE *file; + int buf_size, len; + int ret; + char *stream; + char line[1024] = {0}; + + RETV_IF(NULL == vcard_file_name, CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == cb, CONTACTS_ERROR_INVALID_PARAMETER); + + file = fopen(vcard_file_name, "r"); + RETVM_IF(NULL == file, CONTACTS_ERROR_SYSTEM, "System : fopen() Failed(%d)", errno); + + len = 0; + buf_size = CTSVC_VCARD_MAX_SIZE; + stream = malloc(CTSVC_VCARD_MAX_SIZE); + if (NULL == stream) { + CTS_ERR("Out of memory : malloc() Failed"); + fclose(file); + return CONTACTS_ERROR_OUT_OF_MEMORY; + } + + while (fgets(line, sizeof(line), file)) { + if (0 == len) + if (strncmp(line, "BEGIN:VCARD", strlen("BEGIN:VCARD"))) + continue; + + if (len + sizeof(line) < buf_size) + len += snprintf(stream + len, buf_size - len, "%s", line); + else { + char *new_stream; + buf_size += sizeof(line) * 2; + new_stream = realloc(stream, buf_size); + if (new_stream) + stream = new_stream; + else { + free(stream); + fclose(file); + return CONTACTS_ERROR_OUT_OF_MEMORY; + } + + len += snprintf(stream + len, buf_size - len, "%s", line); + } + + if (0 == strncmp(line, "END:VCARD", 9)) { + ret = __ctsvc_vcard_parse(stream, &record); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("Invalid parameter : vcard stream parsing error"); + free(stream); + fclose(file); + return CONTACTS_ERROR_NO_DATA; + } + + if (!cb(record, data)) { + free(stream); + fclose(file); + contacts_record_destroy(record, true); + return CONTACTS_ERROR_NO_DATA; + } + contacts_record_destroy(record, true); + len = 0; + } + } + + free(stream); + fclose(file); + return CONTACTS_ERROR_NONE; +} + +API int contacts_vcard_get_entity_count(const char *vcard_file_name, int *count) +{ + FILE *file; + int cnt; + char line[1024] = {0}; + RETV_IF(NULL == count, CONTACTS_ERROR_INVALID_PARAMETER); + *count = 0; + + RETV_IF(NULL == vcard_file_name, CONTACTS_ERROR_INVALID_PARAMETER); + + file = fopen(vcard_file_name, "r"); + RETVM_IF(NULL == file, CONTACTS_ERROR_SYSTEM, "System : fopen() Failed(%d)", errno); + + cnt = 0; + while (fgets(line, sizeof(line), file)) { + if (0 == strncmp(line, "END:VCARD", 9)) + cnt++; + } + fclose(file); + + *count = cnt; + + return CONTACTS_ERROR_NONE; +} + diff --git a/common/ctsvc_vcard.h b/common/ctsvc_vcard.h new file mode 100644 index 0000000..d06e400 --- /dev/null +++ b/common/ctsvc_vcard.h @@ -0,0 +1,27 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_VCARD_H__ +#define __TIZEN_SOCIAL_CTSVC_VCARD_H__ + +#endif /* __TIZEN_SOCIAL_CTSVC_VCARD_H__ */ diff --git a/common/ctsvc_view.c b/common/ctsvc_view.c new file mode 100644 index 0000000..a8c08fa --- /dev/null +++ b/common/ctsvc_view.c @@ -0,0 +1,1287 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_view.h" + +API const _contacts_address_book_property_ids _contacts_address_book = { + ._uri = CTSVC_VIEW_URI_ADDRESSBOOK, + .id = CTSVC_PROPERTY_ADDRESSBOOK_ID, + .account_id = CTSVC_PROPERTY_ADDRESSBOOK_ACCOUNT_ID, + .name = CTSVC_PROPERTY_ADDRESSBOOK_NAME, + .mode = CTSVC_PROPERTY_ADDRESSBOOK_MODE +}; + +API const _contacts_group_property_ids _contacts_group = { + ._uri = CTSVC_VIEW_URI_GROUP, + .id = CTSVC_PROPERTY_GROUP_ID, + .address_book_id = CTSVC_PROPERTY_GROUP_ADDRESSBOOK_ID, + .name = CTSVC_PROPERTY_GROUP_NAME, + .ringtone_path = CTSVC_PROPERTY_GROUP_RINGTONE, + .image_path = CTSVC_PROPERTY_GROUP_IMAGE, + .vibration = CTSVC_PROPERTY_GROUP_VIBRATION, + .system_id = CTSVC_PROPERTY_GROUP_SYSTEM_ID, + .is_read_only = CTSVC_PROPERTY_GROUP_IS_READ_ONLY +}; + +API const _contacts_person_property_ids _contacts_person = { + ._uri = CTSVC_VIEW_URI_PERSON, + .id = CTSVC_PROPERTY_PERSON_ID, + .display_name = CTSVC_PROPERTY_PERSON_DISPLAY_NAME, + .display_name_index = CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX, + .display_contact_id = CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID, + .ringtone_path = CTSVC_PROPERTY_PERSON_RINGTONE, + .image_thumbnail_path = CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL, + .vibration = CTSVC_PROPERTY_PERSON_VIBRATION, + .status = CTSVC_PROPERTY_PERSON_STATUS, + .is_favorite = CTSVC_PROPERTY_PERSON_IS_FAVORITE, + .favorite_priority = CTSVC_PROPERTY_PERSON_FAVORITE_PRIORITY, + .link_count = CTSVC_PROPERTY_PERSON_LINK_COUNT, + .account_id1 = CTSVC_PROPERTY_PERSON_ACCOUNT_ID1, + .account_id2 = CTSVC_PROPERTY_PERSON_ACCOUNT_ID2, + .account_id3 = CTSVC_PROPERTY_PERSON_ACCOUNT_ID3, + .addressbook_ids = CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS, + .has_phonenumber = CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER, + .has_email = CTSVC_PROPERTY_PERSON_HAS_EMAIL, +}; + +API const _contacts_contact_property_ids _contacts_contact = { + ._uri = CTSVC_VIEW_URI_CONTACT, + .id = CTSVC_PROPERTY_CONTACT_ID, + .display_name = CTSVC_PROPERTY_CONTACT_DISPLAY_NAME, + .display_source_type = CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID, + .address_book_id = CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, + .ringtone_path = CTSVC_PROPERTY_CONTACT_RINGTONE, + .image_thumbnail_path = CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL, + .is_favorite = CTSVC_PROPERTY_CONTACT_IS_FAVORITE, + .has_phonenumber = CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER, + .has_email = CTSVC_PROPERTY_CONTACT_HAS_EMAIL, + .person_id = CTSVC_PROPERTY_CONTACT_PERSON_ID, + .uid = CTSVC_PROPERTY_CONTACT_UID, + .vibration = CTSVC_PROPERTY_CONTACT_VIBRATION, + .changed_time = CTSVC_PROPERTY_CONTACT_CHANGED_TIME, + .name = CTSVC_PROPERTY_CONTACT_NAME, + .company = CTSVC_PROPERTY_CONTACT_COMPANY, + .note = CTSVC_PROPERTY_CONTACT_NOTE, + .number = CTSVC_PROPERTY_CONTACT_NUMBER, + .email = CTSVC_PROPERTY_CONTACT_EMAIL, + .event = CTSVC_PROPERTY_CONTACT_EVENT, + .messenger = CTSVC_PROPERTY_CONTACT_MESSENGER, + .address = CTSVC_PROPERTY_CONTACT_ADDRESS, + .url = CTSVC_PROPERTY_CONTACT_URL, + .nickname = CTSVC_PROPERTY_CONTACT_NICKNAME, + .profile = CTSVC_PROPERTY_CONTACT_PROFILE, + .relationship = CTSVC_PROPERTY_CONTACT_RELATIONSHIP, + .image = CTSVC_PROPERTY_CONTACT_IMAGE, + .group_relation = CTSVC_PROPERTY_CONTACT_GROUP_RELATION, + .extension = CTSVC_PROPERTY_CONTACT_EXTENSION, +}; + + +API const _contacts_my_profile_property_ids _contacts_my_profile = { + ._uri = CTSVC_VIEW_URI_MY_PROFILE, + .id = CTSVC_PROPERTY_MY_PROFILE_ID, + .display_name = CTSVC_PROPERTY_MY_PROFILE_DISPLAY_NAME, + .address_book_id = CTSVC_PROPERTY_MY_PROFILE_ADDRESSBOOK_ID, + .image_thumbnail_path = CTSVC_PROPERTY_MY_PROFILE_IMAGE_THUMBNAIL, + .uid = CTSVC_PROPERTY_MY_PROFILE_UID, + .changed_time = CTSVC_PROPERTY_MY_PROFILE_CHANGED_TIME, + .name = CTSVC_PROPERTY_MY_PROFILE_NAME, + .company = CTSVC_PROPERTY_MY_PROFILE_COMPANY, + .note = CTSVC_PROPERTY_MY_PROFILE_NOTE, + .number = CTSVC_PROPERTY_MY_PROFILE_NUMBER, + .email = CTSVC_PROPERTY_MY_PROFILE_EMAIL, + .event = CTSVC_PROPERTY_MY_PROFILE_EVENT, + .messenger = CTSVC_PROPERTY_MY_PROFILE_MESSENGER, + .address = CTSVC_PROPERTY_MY_PROFILE_ADDRESS, + .url = CTSVC_PROPERTY_MY_PROFILE_URL, + .nickname = CTSVC_PROPERTY_MY_PROFILE_NICKNAME, + .profile = CTSVC_PROPERTY_MY_PROFILE_PROFILE, + .relationship = CTSVC_PROPERTY_MY_PROFILE_RELATIONSHIP, + .image = CTSVC_PROPERTY_MY_PROFILE_IMAGE, + .extension = CTSVC_PROPERTY_MY_PROFILE_EXTENSION, +}; + +API const _contacts_simple_contact_property_ids _contacts_simple_contact = { + ._uri = CTSVC_VIEW_URI_SIMPLE_CONTACT, + .id = CTSVC_PROPERTY_CONTACT_ID, + .display_name = CTSVC_PROPERTY_CONTACT_DISPLAY_NAME, + .display_source_type = CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID, + .address_book_id = CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, + .person_id = CTSVC_PROPERTY_CONTACT_PERSON_ID, + .ringtone_path = CTSVC_PROPERTY_CONTACT_RINGTONE, + .image_thumbnail_path = CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL, + .is_favorite = CTSVC_PROPERTY_CONTACT_IS_FAVORITE, + .has_phonenumber = CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER, + .has_email = CTSVC_PROPERTY_CONTACT_HAS_EMAIL, + .uid = CTSVC_PROPERTY_CONTACT_UID, + .vibration = CTSVC_PROPERTY_CONTACT_VIBRATION, + .changed_time = CTSVC_PROPERTY_CONTACT_CHANGED_TIME, +}; + +API const _contacts_name_property_ids _contacts_name = { + ._uri = CTSVC_VIEW_URI_NAME, + .id = CTSVC_PROPERTY_NAME_ID, + .contact_id = CTSVC_PROPERTY_NAME_CONTACT_ID, + .first = CTSVC_PROPERTY_NAME_FIRST, + .last = CTSVC_PROPERTY_NAME_LAST, + .addition = CTSVC_PROPERTY_NAME_ADDITION, + .suffix = CTSVC_PROPERTY_NAME_SUFFIX, + .prefix = CTSVC_PROPERTY_NAME_PREFIX, + .phonetic_first = CTSVC_PROPERTY_NAME_PHONETIC_FIRST, + .phonetic_middle= CTSVC_PROPERTY_NAME_PHONETIC_MIDDLE, + .phonetic_last = CTSVC_PROPERTY_NAME_PHONETIC_LAST +}; + +API const _contacts_number_property_ids _contacts_number = { + ._uri = CTSVC_VIEW_URI_NUMBER, + .id = CTSVC_PROPERTY_NUMBER_ID, + .contact_id = CTSVC_PROPERTY_NUMBER_CONTACT_ID, + .type = CTSVC_PROPERTY_NUMBER_TYPE, + .label = CTSVC_PROPERTY_NUMBER_LABEL, + .is_default = CTSVC_PROPERTY_NUMBER_IS_DEFAULT, + .number = CTSVC_PROPERTY_NUMBER_NUMBER +}; + +API const _contacts_email_property_ids _contacts_email = { + ._uri = CTSVC_VIEW_URI_EMAIL, + .id = CTSVC_PROPERTY_EMAIL_ID, + .contact_id = CTSVC_PROPERTY_EMAIL_CONTACT_ID, + .type = CTSVC_PROPERTY_EMAIL_TYPE, + .label = CTSVC_PROPERTY_EMAIL_LABEL, + .is_default = CTSVC_PROPERTY_EMAIL_IS_DEFAULT, + .email = CTSVC_PROPERTY_EMAIL_EMAIL +}; + +API const _contacts_address_property_ids _contacts_address = { + ._uri = CTSVC_VIEW_URI_ADDRESS, + .id = CTSVC_PROPERTY_ADDRESS_ID, + .contact_id = CTSVC_PROPERTY_ADDRESS_CONTACT_ID, + .type = CTSVC_PROPERTY_ADDRESS_TYPE, + .label = CTSVC_PROPERTY_ADDRESS_LABEL, + .postbox = CTSVC_PROPERTY_ADDRESS_POSTBOX, + .postal_code = CTSVC_PROPERTY_ADDRESS_POSTAL_CODE, + .region = CTSVC_PROPERTY_ADDRESS_REGION, + .locality = CTSVC_PROPERTY_ADDRESS_LOCALITY, + .street = CTSVC_PROPERTY_ADDRESS_STREET, + .country = CTSVC_PROPERTY_ADDRESS_COUNTRY, + .extended = CTSVC_PROPERTY_ADDRESS_EXTENDED, + .is_default = CTSVC_PROPERTY_ADDRESS_IS_DEFAULT +}; + +API const _contacts_url_property_ids _contacts_url = { + ._uri = CTSVC_VIEW_URI_URL, + .id = CTSVC_PROPERTY_URL_ID, + .contact_id = CTSVC_PROPERTY_URL_CONTACT_ID, + .type = CTSVC_PROPERTY_URL_TYPE, + .label = CTSVC_PROPERTY_URL_LABEL, + .url = CTSVC_PROPERTY_URL_URL +}; + +API const _contacts_event_property_ids _contacts_event = { + ._uri = CTSVC_VIEW_URI_EVENT, + .id = CTSVC_PROPERTY_EVENT_ID, + .contact_id = CTSVC_PROPERTY_EVENT_CONTACT_ID, + .type = CTSVC_PROPERTY_EVENT_TYPE, + .label = CTSVC_PROPERTY_EVENT_LABEL, + .date = CTSVC_PROPERTY_EVENT_DATE, + .is_lunar = CTSVC_PROPERTY_EVENT_IS_LUNAR, + .lunar_date = CTSVC_PROPERTY_EVENT_LUNAR_DATE +}; + +API const _contacts_company_property_ids _contacts_company = { + ._uri = CTSVC_VIEW_URI_COMPANY, + .id = CTSVC_PROPERTY_COMPANY_ID, + .contact_id = CTSVC_PROPERTY_COMPANY_CONTACT_ID, + .type = CTSVC_PROPERTY_COMPANY_TYPE, + .label = CTSVC_PROPERTY_COMPANY_LABEL, + .name = CTSVC_PROPERTY_COMPANY_NAME, + .department = CTSVC_PROPERTY_COMPANY_DEPARTMENT, + .job_title = CTSVC_PROPERTY_COMPANY_JOB_TITLE, + .assistant_name = CTSVC_PROPERTY_COMPANY_ASSISTANT_NAME, + .role = CTSVC_PROPERTY_COMPANY_ROLE, + .logo = CTSVC_PROPERTY_COMPANY_LOGO, + .location = CTSVC_PROPERTY_COMPANY_LOCATION, + .description = CTSVC_PROPERTY_COMPANY_DESCRIPTION, + .phonetic_name = CTSVC_PROPERTY_COMPANY_PHONETIC_NAME, +}; + +API const _contacts_nickname_property_ids _contacts_nickname = { + ._uri = CTSVC_VIEW_URI_NICKNAME, + .id = CTSVC_PROPERTY_NICKNAME_ID, + .contact_id = CTSVC_PROPERTY_NICKNAME_CONTACT_ID, + .name = CTSVC_PROPERTY_NICKNAME_NAME, +}; + +API const _contacts_note_property_ids _contacts_note = { + ._uri = CTSVC_VIEW_URI_NOTE, + .id = CTSVC_PROPERTY_NOTE_ID, + .contact_id = CTSVC_PROPERTY_NOTE_CONTACT_ID, + .note = CTSVC_PROPERTY_NOTE_NOTE +}; + +API const _contacts_profile_property_ids _contacts_profile = { + ._uri = CTSVC_VIEW_URI_PROFILE, + .id = CTSVC_PROPERTY_PROFILE_ID, + .type = CTSVC_PROPERTY_PROFILE_TYPE, + .label = CTSVC_PROPERTY_PROFILE_LABEL, + .uid = CTSVC_PROPERTY_PROFILE_UID, + .text = CTSVC_PROPERTY_PROFILE_TEXT, + .order = CTSVC_PROPERTY_PROFILE_ORDER, + .appsvc_operation = CTSVC_PROPERTY_PROFILE_APPSVC_OPERATION, + .data1 = CTSVC_PROPERTY_PROFILE_DATA1, + .data2 = CTSVC_PROPERTY_PROFILE_DATA2, + .data3 = CTSVC_PROPERTY_PROFILE_DATA3, + .data4 = CTSVC_PROPERTY_PROFILE_DATA4, + .contact_id = CTSVC_PROPERTY_PROFILE_CONTACT_ID +}; + +API const _contacts_group_relation_property_ids _contacts_group_relation = { + ._uri = CTSVC_VIEW_URI_GROUP_RELATION, + .id = CTSVC_PROPERTY_GROUP_RELATION_ID, + .group_id = CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID, + .contact_id = CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID, + .name = CTSVC_PROPERTY_GROUP_RELATION_GROUP_NAME, +}; + +API const _contacts_relationship_property_ids _contacts_relationship = { + ._uri = CTSVC_VIEW_URI_RELATIONSHIP, + .id = CTSVC_PROPERTY_RELATIONSHIP_ID, + .contact_id = CTSVC_PROPERTY_RELATIONSHIP_CONTACT_ID, + .type = CTSVC_PROPERTY_RELATIONSHIP_TYPE, + .label = CTSVC_PROPERTY_RELATIONSHIP_LABEL, + .name = CTSVC_PROPERTY_RELATIONSHIP_NAME, +}; + +API const _contacts_image_property_ids _contacts_image = { + ._uri = CTSVC_VIEW_URI_IMAGE, + .id = CTSVC_PROPERTY_IMAGE_ID, + .contact_id = CTSVC_PROPERTY_IMAGE_CONTACT_ID, + .type = CTSVC_PROPERTY_IMAGE_TYPE, + .label = CTSVC_PROPERTY_IMAGE_LABEL, + .path = CTSVC_PROPERTY_IMAGE_PATH, + .is_default = CTSVC_PROPERTY_IMAGE_IS_DEFAULT, +}; + +API const _contacts_messenger_property_ids _contacts_messenger = { + ._uri = CTSVC_VIEW_URI_MESSENGER, + .id = CTSVC_PROPERTY_MESSENGER_ID, + .contact_id = CTSVC_PROPERTY_MESSENGER_CONTACT_ID, + .type = CTSVC_PROPERTY_MESSENGER_TYPE, + .label = CTSVC_PROPERTY_MESSENGER_LABEL, + .im_id = CTSVC_PROPERTY_MESSENGER_IM_ID, +}; + +API const _contacts_sdn_property_ids _contacts_sdn = { + ._uri = CTSVC_VIEW_URI_SDN, + .id = CTSVC_PROPERTY_SDN_ID, + .name = CTSVC_PROPERTY_SDN_NAME, + .number = CTSVC_PROPERTY_SDN_NUMBER, +}; + +API const _contacts_speeddial_property_ids _contacts_speeddial = { + ._uri = CTSVC_VIEW_URI_SPEEDDIAL, + .speeddial_number = CTSVC_PROPERTY_SPEEDDIAL_DIAL_NUMBER, + .number_id = CTSVC_PROPERTY_SPEEDDIAL_NUMBER_ID, + .number = CTSVC_PROPERTY_SPEEDDIAL_NUMBER, + .number_label = CTSVC_PROPERTY_SPEEDDIAL_NUMBER_LABEL, + .number_type = CTSVC_PROPERTY_SPEEDDIAL_NUMBER_TYPE, + .person_id = CTSVC_PROPERTY_SPEEDDIAL_PERSON_ID, + .display_name = CTSVC_PROPERTY_SPEEDDIAL_DISPLAY_NAME, + .image_thumbnail_path = CTSVC_PROPERTY_SPEEDDIAL_IMAGE_THUMBNAIL, +}; + +API const _contacts_contact_updated_info_property_ids _contacts_contact_updated_info = { + ._uri = CTSVC_VIEW_URI_CONTACTS_UPDATED_INFO, + .contact_id = CTSVC_PROPERTY_UPDATE_INFO_ID, + .address_book_id = CTSVC_PROPERTY_UPDATE_INFO_ADDRESSBOOK_ID, + .type = CTSVC_PROPERTY_UPDATE_INFO_TYPE, + .version = CTSVC_PROPERTY_UPDATE_INFO_VERSION, +}; + +API const _contacts_group_updated_info_property_ids _contacts_group_updated_info = { + ._uri = CTSVC_VIEW_URI_GROUPS_UPDATED_INFO, + .group_id = CTSVC_PROPERTY_UPDATE_INFO_ID, + .address_book_id = CTSVC_PROPERTY_UPDATE_INFO_ADDRESSBOOK_ID, + .type = CTSVC_PROPERTY_UPDATE_INFO_TYPE, + .version = CTSVC_PROPERTY_UPDATE_INFO_VERSION, +}; + +API const _contacts_group_member_updated_info_property_ids _contacts_group_member_updated_info = { + ._uri = CTSVC_VIEW_URI_GROUPS_MEMBER_UPDATED_INFO, + .group_id = CTSVC_PROPERTY_UPDATE_INFO_ID, + .address_book_id = CTSVC_PROPERTY_UPDATE_INFO_ADDRESSBOOK_ID, + .version = CTSVC_PROPERTY_UPDATE_INFO_VERSION, +}; + +API const _contacts_grouprel_updated_info_property_ids _contacts_grouprel_updated_info = { + ._uri = CTSVC_VIEW_URI_GROUPRELS_UPDATED_INFO, + .group_id = CTSVC_PROPERTY_GROUP_ID, + .contact_id = CTSVC_PROPERTY_CONTACT_ID, + .address_book_id = CTSVC_PROPERTY_ADDRESSBOOK_ID, + .type = CTSVC_PROPERTY_UPDATE_INFO_TYPE, + .version = CTSVC_PROPERTY_UPDATE_INFO_VERSION, +}; + +API const _contacts_activity_property_ids _contacts_activity = { + ._uri = CTSVC_VIEW_URI_ACTIVITY, + .id = CTSVC_PROPERTY_ACTIVITY_ID, + .contact_id = CTSVC_PROPERTY_ACTIVITY_CONTACT_ID, + .source_name = CTSVC_PROPERTY_ACTIVITY_SOURCE_NAME, + .status = CTSVC_PROPERTY_ACTIVITY_STATUS, + .timestamp = CTSVC_PROPERTY_ACTIVITY_TIMESTAMP, + .sync_data1 = CTSVC_PROPERTY_ACTIVITY_SYNC_DATA1, + .sync_data2 = CTSVC_PROPERTY_ACTIVITY_SYNC_DATA2, + .sync_data3 = CTSVC_PROPERTY_ACTIVITY_SYNC_DATA3, + .sync_data4 = CTSVC_PROPERTY_ACTIVITY_SYNC_DATA4, + .photo = CTSVC_PROPERTY_ACTIVITY_ACTIVITY_PHOTO, +}; + +API const _contacts_activity_photo_property_ids _contacts_activity_photo = { + ._uri = CTSVC_VIEW_URI_ACTIVITY_PHOTO, + .id = CTSVC_PROPERTY_ACTIVITY_PHOTO_ID, + .activity_id = CTSVC_PROPERTY_ACTIVITY_PHOTO_ACTIVITY_ID, + .photo_url = CTSVC_PROPERTY_ACTIVITY_PHOTO_URL, + .sort_index = CTSVC_PROPERTY_ACTIVITY_PHOTO_SORT_INDEX, +}; + +API const _contacts_phone_log_property_ids _contacts_phone_log = { + ._uri = CTSVC_VIEW_URI_PHONELOG, + .id = CTSVC_PROPERTY_PHONELOG_ID, + .person_id = CTSVC_PROPERTY_PHONELOG_PERSON_ID, + .address = CTSVC_PROPERTY_PHONELOG_ADDRESS, + .log_time = CTSVC_PROPERTY_PHONELOG_LOG_TIME, + .log_type = CTSVC_PROPERTY_PHONELOG_LOG_TYPE, + .extra_data1 = CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1, + .extra_data2 = CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2, +}; + +API const _contacts_extension_property_ids _contacts_extension = { + ._uri = CTSVC_VIEW_URI_EXTENSION, + .id = CTSVC_PROPERTY_EXTENSION_ID, + .contact_id = CTSVC_PROPERTY_EXTENSION_CONTACT_ID, + .data1 = CTSVC_PROPERTY_EXTENSION_DATA1, + .data2 = CTSVC_PROPERTY_EXTENSION_DATA2, + .data3 = CTSVC_PROPERTY_EXTENSION_DATA3, + .data4 = CTSVC_PROPERTY_EXTENSION_DATA4, + .data5 = CTSVC_PROPERTY_EXTENSION_DATA5, + .data6 = CTSVC_PROPERTY_EXTENSION_DATA6, + .data7 = CTSVC_PROPERTY_EXTENSION_DATA7, + .data8 = CTSVC_PROPERTY_EXTENSION_DATA8, + .data9 = CTSVC_PROPERTY_EXTENSION_DATA9, + .data10 = CTSVC_PROPERTY_EXTENSION_DATA10, + .data11 = CTSVC_PROPERTY_EXTENSION_DATA11, + .data12 = CTSVC_PROPERTY_EXTENSION_DATA12, +}; + +API const _contacts_person_contact_property_ids _contacts_person_contact = { + ._uri = CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT, + .person_id = CTSVC_PROPERTY_PERSON_ID, + .display_name = CTSVC_PROPERTY_PERSON_DISPLAY_NAME, + .display_name_index = CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX, + .display_contact_id = CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID, + .ringtone_path = CTSVC_PROPERTY_PERSON_RINGTONE, + .image_thumbnail_path = CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL, + .vibration = CTSVC_PROPERTY_PERSON_VIBRATION, + .status = CTSVC_PROPERTY_PERSON_STATUS, + .is_favorite = CTSVC_PROPERTY_PERSON_IS_FAVORITE, + .link_count = CTSVC_PROPERTY_PERSON_LINK_COUNT, + .account_id1 = CTSVC_PROPERTY_PERSON_ACCOUNT_ID1, + .account_id2 = CTSVC_PROPERTY_PERSON_ACCOUNT_ID2, + .account_id3 = CTSVC_PROPERTY_PERSON_ACCOUNT_ID3, + .addressbook_ids = CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS, + .has_phonenumber = CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER, + .has_email = CTSVC_PROPERTY_PERSON_HAS_EMAIL, + .contact_id = CTSVC_PROPERTY_CONTACT_ID, + .address_book_id = CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, + .address_book_name = CTSVC_PROPERTY_ADDRESSBOOK_NAME, + .address_book_mode = CTSVC_PROPERTY_ADDRESSBOOK_MODE +}; + +API const _contacts_person_number_property_ids _contacts_person_number = { + ._uri = CTSVC_VIEW_URI_READ_ONLY_PERSON_NUMBER, + .person_id = CTSVC_PROPERTY_PERSON_ID, + .display_name = CTSVC_PROPERTY_PERSON_DISPLAY_NAME, + .display_name_index = CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX, + .display_contact_id = CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID, + .ringtone_path = CTSVC_PROPERTY_PERSON_RINGTONE, + .image_thumbnail_path = CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL, + .vibration = CTSVC_PROPERTY_PERSON_VIBRATION, + .is_favorite = CTSVC_PROPERTY_PERSON_IS_FAVORITE, + .has_phonenumber = CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER, + .has_email = CTSVC_PROPERTY_PERSON_HAS_EMAIL, + .number_id = CTSVC_PROPERTY_NUMBER_ID, + .type = CTSVC_PROPERTY_NUMBER_TYPE, + .label = CTSVC_PROPERTY_NUMBER_LABEL, + .is_primary_default = CTSVC_PROPERTY_DATA_IS_PRIMARY_DEFAULT, + .number = CTSVC_PROPERTY_NUMBER_NUMBER, + .number_filter = CTSVC_PROPERTY_NUMBER_NUMBER_FILTER, +}; + +API const _contacts_person_email_property_ids _contacts_person_email = { + ._uri = CTSVC_VIEW_URI_READ_ONLY_PERSON_EMAIL, + .person_id = CTSVC_PROPERTY_PERSON_ID, + .display_name = CTSVC_PROPERTY_PERSON_DISPLAY_NAME, + .display_name_index = CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX, + .display_contact_id = CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID, + .ringtone_path = CTSVC_PROPERTY_PERSON_RINGTONE, + .image_thumbnail_path = CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL, + .vibration = CTSVC_PROPERTY_PERSON_VIBRATION, + .is_favorite = CTSVC_PROPERTY_PERSON_IS_FAVORITE, + .has_phonenumber = CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER, + .has_email = CTSVC_PROPERTY_PERSON_HAS_EMAIL, + .email_id = CTSVC_PROPERTY_EMAIL_ID, + .type = CTSVC_PROPERTY_EMAIL_TYPE, + .label = CTSVC_PROPERTY_EMAIL_LABEL, + .is_primary_default = CTSVC_PROPERTY_DATA_IS_PRIMARY_DEFAULT, + .email = CTSVC_PROPERTY_EMAIL_EMAIL +}; + +API const _contacts_person_usage_property_ids _contacts_person_usage = { + ._uri = CTSVC_VIEW_URI_READ_ONLY_PERSON_USAGE, + .person_id = CTSVC_PROPERTY_PERSON_ID, + .display_name = CTSVC_PROPERTY_PERSON_DISPLAY_NAME, + .display_name_index = CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX, + .display_contact_id = CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID, + .ringtone_path = CTSVC_PROPERTY_PERSON_RINGTONE, + .image_thumbnail_path = CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL, + .vibration = CTSVC_PROPERTY_PERSON_VIBRATION, + .is_favorite = CTSVC_PROPERTY_PERSON_IS_FAVORITE, + .has_phonenumber = CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER, + .has_email = CTSVC_PROPERTY_PERSON_HAS_EMAIL, + .usage_type = CTSVC_PROPERTY_PERSON_USAGE_TYPE, + .times_used = CTSVC_PROPERTY_PERSON_TIMES_USED +}; + +API const _contacts_person_grouprel_property_ids _contacts_person_grouprel = { + ._uri = CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP, + .person_id = CTSVC_PROPERTY_PERSON_ID, + .display_name = CTSVC_PROPERTY_PERSON_DISPLAY_NAME, + .display_name_index = CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX, + .display_contact_id = CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID, + .ringtone_path = CTSVC_PROPERTY_PERSON_RINGTONE, + .image_thumbnail_path = CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL, + .vibration = CTSVC_PROPERTY_PERSON_VIBRATION, + .status = CTSVC_PROPERTY_PERSON_STATUS, + .is_favorite = CTSVC_PROPERTY_PERSON_IS_FAVORITE, + .has_phonenumber = CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER, + .has_email = CTSVC_PROPERTY_PERSON_HAS_EMAIL, + .link_count = CTSVC_PROPERTY_PERSON_LINK_COUNT, + .account_id1 = CTSVC_PROPERTY_PERSON_ACCOUNT_ID1, + .account_id2 = CTSVC_PROPERTY_PERSON_ACCOUNT_ID2, + .account_id3 = CTSVC_PROPERTY_PERSON_ACCOUNT_ID3, + .addressbook_ids = CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS, + .address_book_id = CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, + .group_id = CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID, + .address_book_name = CTSVC_PROPERTY_ADDRESSBOOK_NAME, + .address_book_mode = CTSVC_PROPERTY_ADDRESSBOOK_MODE, + .contact_id = CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID +}; + +API const _contacts_person_phone_log_property_ids _contacts_person_phone_log = { + ._uri = CTSVC_VIEW_URI_READ_ONLY_PERSON_PHONELOG, + .person_id = CTSVC_PROPERTY_PERSON_ID, + .display_name = CTSVC_PROPERTY_PERSON_DISPLAY_NAME, + .image_thumbnail_path = CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL, + .log_id = CTSVC_PROPERTY_PHONELOG_ID, + .address = CTSVC_PROPERTY_PHONELOG_ADDRESS, + .address_type = CTSVC_PROPERTY_DATA_DATA1, + .log_time = CTSVC_PROPERTY_PHONELOG_LOG_TIME, + .log_type = CTSVC_PROPERTY_PHONELOG_LOG_TYPE, + .extra_data1 = CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1, + .extra_data2 = CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2, +}; + +API const _contacts_contact_number_property_ids _contacts_contact_number = { + ._uri = CTSVC_VIEW_URI_READ_ONLY_CONTACT_NUMBER, + .contact_id = CTSVC_PROPERTY_CONTACT_ID, + .display_name = CTSVC_PROPERTY_CONTACT_DISPLAY_NAME, + .display_source_type = CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID, + .address_book_id = CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, + .person_id = CTSVC_PROPERTY_CONTACT_PERSON_ID, + .ringtone_path = CTSVC_PROPERTY_CONTACT_RINGTONE, + .image_thumbnail_path = CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL, + .number_id = CTSVC_PROPERTY_NUMBER_ID, + .type = CTSVC_PROPERTY_NUMBER_TYPE, + .label = CTSVC_PROPERTY_NUMBER_LABEL, + .is_default = CTSVC_PROPERTY_NUMBER_IS_DEFAULT, + .number = CTSVC_PROPERTY_NUMBER_NUMBER, + .number_filter = CTSVC_PROPERTY_NUMBER_NUMBER_FILTER, +}; + +API const _contacts_contact_email_property_ids _contacts_contact_email = { + ._uri = CTSVC_VIEW_URI_READ_ONLY_CONTACT_EMAIL, + .contact_id = CTSVC_PROPERTY_CONTACT_ID, + .display_name = CTSVC_PROPERTY_CONTACT_DISPLAY_NAME, + .display_source_type = CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID, + .address_book_id = CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, + .person_id = CTSVC_PROPERTY_CONTACT_PERSON_ID, + .ringtone_path = CTSVC_PROPERTY_CONTACT_RINGTONE, + .image_thumbnail_path = CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL, + .email_id = CTSVC_PROPERTY_EMAIL_ID, + .type = CTSVC_PROPERTY_EMAIL_TYPE, + .label = CTSVC_PROPERTY_EMAIL_LABEL, + .is_default = CTSVC_PROPERTY_EMAIL_IS_DEFAULT, + .email = CTSVC_PROPERTY_EMAIL_EMAIL +}; + +API const _contacts_contact_grouprel_property_ids _contacts_contact_grouprel = { + ._uri = CTSVC_VIEW_URI_READ_ONLY_CONTACT_GROUP, + .contact_id = CTSVC_PROPERTY_CONTACT_ID, + .display_name = CTSVC_PROPERTY_CONTACT_DISPLAY_NAME, + .display_source_type = CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID, + .address_book_id = CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, + .person_id = CTSVC_PROPERTY_CONTACT_PERSON_ID, + .ringtone_path = CTSVC_PROPERTY_CONTACT_RINGTONE, + .image_thumbnail_path = CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL, + .group_id = CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID, + .group_name = CTSVC_PROPERTY_GROUP_RELATION_GROUP_NAME +}; + +API const _contacts_contact_activity_property_ids _contacts_contact_activity = { + ._uri = CTSVC_VIEW_URI_READ_ONLY_CONTACT_ACTIVITY, + .contact_id = CTSVC_PROPERTY_CONTACT_ID, + .display_name = CTSVC_PROPERTY_CONTACT_DISPLAY_NAME, + .display_source_type = CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID, + .address_book_id = CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, + .person_id = CTSVC_PROPERTY_CONTACT_PERSON_ID, + .ringtone_path = CTSVC_PROPERTY_CONTACT_RINGTONE, + .image_thumbnail_path = CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL, + .activity_id = CTSVC_PROPERTY_ACTIVITY_ID, + .source_name = CTSVC_PROPERTY_ACTIVITY_SOURCE_NAME, + .status = CTSVC_PROPERTY_ACTIVITY_STATUS, + .timestamp = CTSVC_PROPERTY_ACTIVITY_TIMESTAMP, + .sync_data1 = CTSVC_PROPERTY_ACTIVITY_SYNC_DATA1, + .sync_data2 = CTSVC_PROPERTY_ACTIVITY_SYNC_DATA2, + .sync_data3 = CTSVC_PROPERTY_ACTIVITY_SYNC_DATA3, + .sync_data4 = CTSVC_PROPERTY_ACTIVITY_SYNC_DATA4, + .account_id = CTSVC_PROPERTY_ADDRESSBOOK_ACCOUNT_ID, +}; + +API const _contacts_phone_log_number_property_ids _contacts_phone_log_number = { + ._uri = CTSVC_VIEW_URI_READ_ONLY_PHONELOG_NUMBER, + .number = CTSVC_PROPERTY_PHONELOG_ADDRESS, +}; + +API const _contacts_phone_log_stat_property_ids _contacts_phone_log_stat = { + ._uri = CTSVC_VIEW_URI_READ_ONLY_PHONELOG_STAT, + .log_count = CTSVC_PROPERTY_PHONELOG_STAT_LOG_COUNT, + .log_type = CTSVC_PROPERTY_PHONELOG_STAT_LOG_TYPE, +}; + +const property_info_s __property_addressbook[] = { + {CTSVC_PROPERTY_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_id"}, + {CTSVC_PROPERTY_ADDRESSBOOK_ACCOUNT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "account_id"}, + {CTSVC_PROPERTY_ADDRESSBOOK_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_name"}, + {CTSVC_PROPERTY_ADDRESSBOOK_MODE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "mode"}, +}; + +const property_info_s __property_snd[] = { + {CTSVC_PROPERTY_SDN_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_SDN_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "name"}, + {CTSVC_PROPERTY_SDN_NUMBER, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "number"}, +}; + +const property_info_s __property_group[] = { + {CTSVC_PROPERTY_GROUP_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "group_id"}, + {CTSVC_PROPERTY_GROUP_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_id"}, + {CTSVC_PROPERTY_GROUP_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "group_name"}, + {CTSVC_PROPERTY_GROUP_RINGTONE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "ringtone_path"}, + {CTSVC_PROPERTY_GROUP_IMAGE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "image_thumbnail_path"}, + {CTSVC_PROPERTY_GROUP_VIBRATION, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "vibration"}, + {CTSVC_PROPERTY_GROUP_SYSTEM_ID, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "system_id"}, + {CTSVC_PROPERTY_GROUP_IS_READ_ONLY, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "is_read_only"}, +}; + +const property_info_s __property_person[] = { + {CTSVC_PROPERTY_PERSON_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "person_id"}, + {CTSVC_PROPERTY_PERSON_DISPLAY_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "name_contact_id"}, + {CTSVC_PROPERTY_PERSON_RINGTONE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "ringtone_path"}, + {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "image_thumbnail_path"}, + {CTSVC_PROPERTY_PERSON_VIBRATION, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "vibration"}, + {CTSVC_PROPERTY_PERSON_STATUS, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "status"}, + {CTSVC_PROPERTY_PERSON_IS_FAVORITE, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "is_favorite"}, + {CTSVC_PROPERTY_PERSON_FAVORITE_PRIORITY, CTSVC_VIEW_DATA_TYPE_DOUBLE,CTSVC_SEARCH_PROPERTY_FILTER, "favorite_prio"}, + {CTSVC_PROPERTY_PERSON_LINK_COUNT, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "link_count"}, + {CTSVC_PROPERTY_PERSON_ACCOUNT_ID1, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "account_id1"}, + {CTSVC_PROPERTY_PERSON_ACCOUNT_ID2, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "account_id2"}, + {CTSVC_PROPERTY_PERSON_ACCOUNT_ID3, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "account_id3"}, + {CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "addressbook_ids"}, + {CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "has_phonenumber"}, + {CTSVC_PROPERTY_PERSON_HAS_EMAIL, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "has_email"}, +}; + +const property_info_s __property_simple_contact[] = { + {CTSVC_PROPERTY_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "display_name_source"}, + {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_id"}, + {CTSVC_PROPERTY_CONTACT_RINGTONE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "ringtone_path"}, + {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL,CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "image_thumbnail_path"}, + {CTSVC_PROPERTY_CONTACT_IS_FAVORITE, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "is_favorite"}, + {CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER,CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "has_phonenumber"}, + {CTSVC_PROPERTY_CONTACT_HAS_EMAIL, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "has_email"}, + {CTSVC_PROPERTY_CONTACT_PERSON_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "person_id"}, + {CTSVC_PROPERTY_CONTACT_UID, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "uid"}, + {CTSVC_PROPERTY_CONTACT_VIBRATION, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "vibration"}, + {CTSVC_PROPERTY_CONTACT_CHANGED_TIME, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "changed_time"}, +}; + +const property_info_s __property_name[] = { + {CTSVC_PROPERTY_NAME_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_NAME_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_NAME_FIRST, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "first"}, + {CTSVC_PROPERTY_NAME_LAST, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "last"}, + {CTSVC_PROPERTY_NAME_ADDITION, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "addition"}, + {CTSVC_PROPERTY_NAME_PREFIX, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "prefix"}, + {CTSVC_PROPERTY_NAME_SUFFIX, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "suffix"}, + {CTSVC_PROPERTY_NAME_PHONETIC_FIRST, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "phonetic_first"}, + {CTSVC_PROPERTY_NAME_PHONETIC_MIDDLE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "phonetic_middle"}, + {CTSVC_PROPERTY_NAME_PHONETIC_LAST, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "phonetic_last"}, +}; + +const property_info_s __property_number[] = { + {CTSVC_PROPERTY_NUMBER_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_NUMBER_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_NUMBER_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "type"}, + {CTSVC_PROPERTY_NUMBER_LABEL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "label"}, + {CTSVC_PROPERTY_NUMBER_IS_DEFAULT, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "is_default"}, + {CTSVC_PROPERTY_NUMBER_NUMBER, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "number"}, +}; + +const property_info_s __property_email[] = { + {CTSVC_PROPERTY_EMAIL_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_EMAIL_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_EMAIL_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "type"}, + {CTSVC_PROPERTY_EMAIL_LABEL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "label"}, + {CTSVC_PROPERTY_EMAIL_IS_DEFAULT, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "is_default"}, + {CTSVC_PROPERTY_EMAIL_EMAIL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "email"}, +}; + +const property_info_s __property_address[] = { + {CTSVC_PROPERTY_ADDRESS_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_ADDRESS_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_ADDRESS_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "type"}, + {CTSVC_PROPERTY_ADDRESS_LABEL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "label"}, + {CTSVC_PROPERTY_ADDRESS_POSTBOX, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "postbox"}, + {CTSVC_PROPERTY_ADDRESS_POSTAL_CODE,CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "postal_code"}, + {CTSVC_PROPERTY_ADDRESS_REGION, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "region"}, + {CTSVC_PROPERTY_ADDRESS_LOCALITY, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "locality"}, + {CTSVC_PROPERTY_ADDRESS_STREET, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "street"}, + {CTSVC_PROPERTY_ADDRESS_COUNTRY, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "country"}, + {CTSVC_PROPERTY_ADDRESS_EXTENDED, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "extend"}, + {CTSVC_PROPERTY_ADDRESS_IS_DEFAULT, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "is_default"}, +}; + +const property_info_s __property_url[] = { + {CTSVC_PROPERTY_URL_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_URL_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_URL_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "type"}, + {CTSVC_PROPERTY_URL_LABEL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "label"}, + {CTSVC_PROPERTY_URL_URL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "url"}, +}; + +const property_info_s __property_event[] = { + {CTSVC_PROPERTY_EVENT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_EVENT_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_EVENT_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "type"}, + {CTSVC_PROPERTY_EVENT_LABEL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "label"}, + {CTSVC_PROPERTY_EVENT_DATE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "date"}, + {CTSVC_PROPERTY_EVENT_IS_LUNAR, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "is_lunar"}, + {CTSVC_PROPERTY_EVENT_LUNAR_DATE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "lunar_date"}, +}; + +const property_info_s __property_group_relation[] = { +// {CTSVC_PROPERTY_GROUP_RELATION_ID, CTSVC_VIEW_DATA_TYPE_INT, "id"}, + {CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "group_id"}, + {CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_GROUP_RELATION_GROUP_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "group_name"}, +}; + +const property_info_s __property_relationship[] = { + {CTSVC_PROPERTY_RELATIONSHIP_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_RELATIONSHIP_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_RELATIONSHIP_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "type"}, + {CTSVC_PROPERTY_RELATIONSHIP_LABEL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "label"}, + {CTSVC_PROPERTY_RELATIONSHIP_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "name"}, +}; + +const property_info_s __property_image[] = { + {CTSVC_PROPERTY_IMAGE_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_IMAGE_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_IMAGE_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "type"}, + {CTSVC_PROPERTY_IMAGE_LABEL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "label"}, + {CTSVC_PROPERTY_IMAGE_PATH, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "path"}, + {CTSVC_PROPERTY_IMAGE_IS_DEFAULT, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "is_default"}, +}; + +const property_info_s __property_company[] = { + {CTSVC_PROPERTY_COMPANY_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_COMPANY_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_COMPANY_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "type"}, + {CTSVC_PROPERTY_COMPANY_LABEL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "label"}, + {CTSVC_PROPERTY_COMPANY_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "name"}, + {CTSVC_PROPERTY_COMPANY_DEPARTMENT, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "department"}, + {CTSVC_PROPERTY_COMPANY_JOB_TITLE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "job_title"}, + {CTSVC_PROPERTY_COMPANY_ASSISTANT_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "assistant"}, + {CTSVC_PROPERTY_COMPANY_ROLE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "role"}, + {CTSVC_PROPERTY_COMPANY_LOGO, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "logo"}, + {CTSVC_PROPERTY_COMPANY_LOCATION, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "location"}, + {CTSVC_PROPERTY_COMPANY_DESCRIPTION, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "description"}, + {CTSVC_PROPERTY_COMPANY_PHONETIC_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "phonetic_name"}, +}; + +const property_info_s __property_nickname[] = { + {CTSVC_PROPERTY_NICKNAME_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id",}, + {CTSVC_PROPERTY_NICKNAME_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_NICKNAME_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "nickname"}, +}; + +const property_info_s __property_messenger[] = { + {CTSVC_PROPERTY_MESSENGER_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_MESSENGER_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_MESSENGER_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "type"}, + {CTSVC_PROPERTY_MESSENGER_LABEL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "label"}, + {CTSVC_PROPERTY_MESSENGER_IM_ID, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "im_id"}, +}; + +const property_info_s __property_note[] = { + {CTSVC_PROPERTY_NOTE_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_NOTE_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_NOTE_NOTE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "note"}, +}; + +const property_info_s __property_profile[] = { + {CTSVC_PROPERTY_PROFILE_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_PROFILE_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_PROFILE_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "type"}, + {CTSVC_PROPERTY_PROFILE_LABEL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "label"}, + {CTSVC_PROPERTY_PROFILE_UID, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "uid"}, + {CTSVC_PROPERTY_PROFILE_TEXT, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "text"}, + {CTSVC_PROPERTY_PROFILE_ORDER, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "profile_order"}, + {CTSVC_PROPERTY_PROFILE_APPSVC_OPERATION, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "appsvc_op"}, + {CTSVC_PROPERTY_PROFILE_DATA1, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "data1"}, + {CTSVC_PROPERTY_PROFILE_DATA2, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "data2"}, + {CTSVC_PROPERTY_PROFILE_DATA3, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "data3"}, + {CTSVC_PROPERTY_PROFILE_DATA4, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "data4"}, +}; + +const property_info_s __property_activity_photo[] = { + {CTSVC_PROPERTY_ACTIVITY_PHOTO_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_ACTIVITY_PHOTO_ACTIVITY_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "activity_id"}, + {CTSVC_PROPERTY_ACTIVITY_PHOTO_URL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "photo_url"}, + {CTSVC_PROPERTY_ACTIVITY_PHOTO_SORT_INDEX, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "sort_index"}, +}; + +const property_info_s __property_activity[] = { + {CTSVC_PROPERTY_ACTIVITY_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_ACTIVITY_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_ACTIVITY_SOURCE_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "source_name"}, + {CTSVC_PROPERTY_ACTIVITY_STATUS, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "status"}, + {CTSVC_PROPERTY_ACTIVITY_TIMESTAMP, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "timestamp"}, + {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA1, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "sync_data1"}, + {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA2, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "sync_data2"}, + {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA3, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "sync_data3"}, + {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA4, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "sync_data4"}, + {CTSVC_PROPERTY_ACTIVITY_ACTIVITY_PHOTO,CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE, (void*)__property_activity_photo}, +}; + +const property_info_s __property_extension[] = { + {CTSVC_PROPERTY_EXTENSION_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_EXTENSION_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_EXTENSION_DATA1, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "data1"}, + {CTSVC_PROPERTY_EXTENSION_DATA2, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "data2"}, + {CTSVC_PROPERTY_EXTENSION_DATA3, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "data3"}, + {CTSVC_PROPERTY_EXTENSION_DATA4, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "data4"}, + {CTSVC_PROPERTY_EXTENSION_DATA5, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "data5"}, + {CTSVC_PROPERTY_EXTENSION_DATA6, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "data6"}, + {CTSVC_PROPERTY_EXTENSION_DATA7, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "data7"}, + {CTSVC_PROPERTY_EXTENSION_DATA8, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "data8"}, + {CTSVC_PROPERTY_EXTENSION_DATA9, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "data9"}, + {CTSVC_PROPERTY_EXTENSION_DATA10, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "data10"}, + {CTSVC_PROPERTY_EXTENSION_DATA11, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "data11"}, + {CTSVC_PROPERTY_EXTENSION_DATA12, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "data12"}, +}; + +const property_info_s __property_contact[] = { + {CTSVC_PROPERTY_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, NULL}, //dispaly_name, reverse_display_name + {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "display_name_source"}, + {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_id"}, + {CTSVC_PROPERTY_CONTACT_RINGTONE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "ringtone_path"}, + {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "image_thumbnail_path"}, + {CTSVC_PROPERTY_CONTACT_IS_FAVORITE, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "is_favorite"}, + {CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "has_phonenumber"}, + {CTSVC_PROPERTY_CONTACT_HAS_EMAIL, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "has_email"}, + {CTSVC_PROPERTY_CONTACT_PERSON_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "person_id"}, + {CTSVC_PROPERTY_CONTACT_UID, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "uid"}, + {CTSVC_PROPERTY_CONTACT_VIBRATION, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "vibration"}, + {CTSVC_PROPERTY_CONTACT_CHANGED_TIME, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "changed_time"}, + {CTSVC_PROPERTY_CONTACT_NAME, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE, (void*)__property_name}, + {CTSVC_PROPERTY_CONTACT_COMPANY, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_company}, + {CTSVC_PROPERTY_CONTACT_NOTE, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_note}, + {CTSVC_PROPERTY_CONTACT_NUMBER, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_number}, + {CTSVC_PROPERTY_CONTACT_EMAIL, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_email}, + {CTSVC_PROPERTY_CONTACT_EVENT, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_event}, + {CTSVC_PROPERTY_CONTACT_MESSENGER, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_messenger}, + {CTSVC_PROPERTY_CONTACT_ADDRESS, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_address}, + {CTSVC_PROPERTY_CONTACT_URL, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_url}, + {CTSVC_PROPERTY_CONTACT_NICKNAME, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_nickname}, + {CTSVC_PROPERTY_CONTACT_PROFILE, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_profile}, + {CTSVC_PROPERTY_CONTACT_RELATIONSHIP, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_relationship}, + {CTSVC_PROPERTY_CONTACT_IMAGE, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_image}, + {CTSVC_PROPERTY_CONTACT_GROUP_RELATION, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_group_relation}, + {CTSVC_PROPERTY_CONTACT_EXTENSION, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_extension}, +}; + +const property_info_s __property_my_profile[] = { + {CTSVC_PROPERTY_MY_PROFILE_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "my_profile_id"}, + {CTSVC_PROPERTY_MY_PROFILE_DISPLAY_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, NULL}, //dispaly_name, reverse_display_name + {CTSVC_PROPERTY_MY_PROFILE_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_id"}, + {CTSVC_PROPERTY_MY_PROFILE_IMAGE_THUMBNAIL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "image_thumbnail_path"}, + {CTSVC_PROPERTY_MY_PROFILE_UID, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "uid"}, + {CTSVC_PROPERTY_MY_PROFILE_CHANGED_TIME, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "changed_time"}, + {CTSVC_PROPERTY_MY_PROFILE_NAME, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE, (void*)__property_name}, + {CTSVC_PROPERTY_MY_PROFILE_COMPANY, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_company}, + {CTSVC_PROPERTY_MY_PROFILE_NOTE, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_note}, + {CTSVC_PROPERTY_MY_PROFILE_NUMBER, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_number}, + {CTSVC_PROPERTY_MY_PROFILE_EMAIL, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_email}, + {CTSVC_PROPERTY_MY_PROFILE_EVENT, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_event}, + {CTSVC_PROPERTY_MY_PROFILE_MESSENGER, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_messenger}, + {CTSVC_PROPERTY_MY_PROFILE_ADDRESS, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_address}, + {CTSVC_PROPERTY_MY_PROFILE_URL, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_url}, + {CTSVC_PROPERTY_MY_PROFILE_NICKNAME, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_nickname}, + {CTSVC_PROPERTY_MY_PROFILE_PROFILE, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_profile}, + {CTSVC_PROPERTY_MY_PROFILE_RELATIONSHIP, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_relationship}, + {CTSVC_PROPERTY_MY_PROFILE_IMAGE, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_image}, + {CTSVC_PROPERTY_MY_PROFILE_EXTENSION, CTSVC_VIEW_DATA_TYPE_REC, CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_extension}, +}; + + +const property_info_s __property_speeddial[] = { + {CTSVC_PROPERTY_SPEEDDIAL_DIAL_NUMBER, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "speed_number"}, + {CTSVC_PROPERTY_SPEEDDIAL_NUMBER_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "number_id"}, + {CTSVC_PROPERTY_SPEEDDIAL_NUMBER, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "number"}, + {CTSVC_PROPERTY_SPEEDDIAL_NUMBER_LABEL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "label"}, + {CTSVC_PROPERTY_SPEEDDIAL_NUMBER_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "type"}, + {CTSVC_PROPERTY_SPEEDDIAL_PERSON_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "person_id"}, + {CTSVC_PROPERTY_SPEEDDIAL_DISPLAY_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, NULL}, // display_name or reverse_display_name + {CTSVC_PROPERTY_SPEEDDIAL_IMAGE_THUMBNAIL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "image_thumbnail_path"}, +}; + +const property_info_s __property_phonelog[] = { + {CTSVC_PROPERTY_PHONELOG_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_PHONELOG_PERSON_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "person_id"}, + {CTSVC_PROPERTY_PHONELOG_ADDRESS, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "number"}, + {CTSVC_PROPERTY_PHONELOG_LOG_TIME, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "log_time"}, + {CTSVC_PROPERTY_PHONELOG_LOG_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "log_type"}, + {CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "data1"}, // duration + {CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "data2"}, // short message, email subject +}; + +const property_info_s __property_updated_info[] = { + {CTSVC_PROPERTY_UPDATE_INFO_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_UPDATE_INFO_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_id"}, + {CTSVC_PROPERTY_UPDATE_INFO_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "type"}, + {CTSVC_PROPERTY_UPDATE_INFO_VERSION, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "version"}, +}; + +const property_info_s __property_grouprel_updated_info[] = { + {CTSVC_PROPERTY_GROUP_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "group_id"}, + {CTSVC_PROPERTY_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_id"}, + {CTSVC_PROPERTY_UPDATE_INFO_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "type"}, + {CTSVC_PROPERTY_UPDATE_INFO_VERSION, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "version"}, +}; + +// search properties /////////////////////////////////////////////////////////////////////////////////////////////////// +const property_info_s __property_person_contact[] = { // _contacts_person_contact + {CTSVC_PROPERTY_PERSON_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "person_id"}, + {CTSVC_PROPERTY_PERSON_DISPLAY_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_PROJECTION, "name_contact_id"}, + {CTSVC_PROPERTY_PERSON_RINGTONE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "ringtone_path"}, + {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "image_thumbnail_path"}, + {CTSVC_PROPERTY_PERSON_VIBRATION, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "vibration"}, + {CTSVC_PROPERTY_PERSON_STATUS, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "status"}, + {CTSVC_PROPERTY_PERSON_IS_FAVORITE, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "is_favorite"}, + {CTSVC_PROPERTY_PERSON_LINK_COUNT, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "link_count"}, + {CTSVC_PROPERTY_PERSON_ACCOUNT_ID1, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "account_id1"}, + {CTSVC_PROPERTY_PERSON_ACCOUNT_ID2, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "account_id2"}, + {CTSVC_PROPERTY_PERSON_ACCOUNT_ID3, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "account_id3"}, + {CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "addressbook_ids"}, + {CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "has_phonenumber"}, + {CTSVC_PROPERTY_PERSON_HAS_EMAIL, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "has_email"}, + // contact + {CTSVC_PROPERTY_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_id"}, + // addressbook + {CTSVC_PROPERTY_ADDRESSBOOK_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_name"}, + {CTSVC_PROPERTY_ADDRESSBOOK_MODE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_mode"}, +}; + +const property_info_s __property_person_number[] = { // _contacts_person_number + {CTSVC_PROPERTY_PERSON_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "person_id"}, + {CTSVC_PROPERTY_PERSON_DISPLAY_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_PROJECTION, "name_contact_id"}, + {CTSVC_PROPERTY_PERSON_RINGTONE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "ringtone_path"}, + {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "image_thumbnail_path"}, + {CTSVC_PROPERTY_PERSON_VIBRATION, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "vibration"}, + {CTSVC_PROPERTY_PERSON_IS_FAVORITE, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "is_favorite"}, + {CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "has_phonenumber"}, + {CTSVC_PROPERTY_PERSON_HAS_EMAIL, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "has_email"}, + // number + {CTSVC_PROPERTY_NUMBER_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "number_id"}, + {CTSVC_PROPERTY_DATA_IS_PRIMARY_DEFAULT, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "is_primary_default"}, + {CTSVC_PROPERTY_NUMBER_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_PROJECTION, "type"}, + {CTSVC_PROPERTY_NUMBER_LABEL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "label"}, + {CTSVC_PROPERTY_NUMBER_NUMBER, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "number"}, + {CTSVC_PROPERTY_NUMBER_NUMBER_FILTER, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_FILTER, "normalized_number"}, +}; + +const property_info_s __property_person_email[] = { // _contacts_person_email + {CTSVC_PROPERTY_PERSON_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "person_id"}, + {CTSVC_PROPERTY_PERSON_DISPLAY_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_PROJECTION, "name_contact_id"}, + {CTSVC_PROPERTY_PERSON_RINGTONE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "ringtone_path"}, + {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "image_thumbnail_path"}, + {CTSVC_PROPERTY_PERSON_VIBRATION, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "vibration"}, + {CTSVC_PROPERTY_PERSON_IS_FAVORITE, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "is_favorite"}, + {CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "has_phonenumber"}, + {CTSVC_PROPERTY_PERSON_HAS_EMAIL, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "has_email"}, + // email + {CTSVC_PROPERTY_EMAIL_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "email_id"}, + {CTSVC_PROPERTY_EMAIL_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_PROJECTION, "type"}, + {CTSVC_PROPERTY_EMAIL_LABEL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "label"}, + {CTSVC_PROPERTY_DATA_IS_PRIMARY_DEFAULT, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "is_primary_default"}, + {CTSVC_PROPERTY_EMAIL_EMAIL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "email"}, +}; + +const property_info_s __property_person_grouprel[] = { // _contacts_person_grouprel + {CTSVC_PROPERTY_PERSON_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "person_id"}, + {CTSVC_PROPERTY_PERSON_DISPLAY_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_PROJECTION, "name_contact_id"}, + {CTSVC_PROPERTY_PERSON_RINGTONE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "ringtone_path"}, + {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "image_thumbnail_path"}, + {CTSVC_PROPERTY_PERSON_VIBRATION, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "vibration"}, + {CTSVC_PROPERTY_PERSON_STATUS, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "status"}, + {CTSVC_PROPERTY_PERSON_IS_FAVORITE, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "is_favorite"}, + {CTSVC_PROPERTY_PERSON_LINK_COUNT, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "link_count"}, + {CTSVC_PROPERTY_PERSON_ACCOUNT_ID1, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "account_id1"}, + {CTSVC_PROPERTY_PERSON_ACCOUNT_ID2, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "account_id2"}, + {CTSVC_PROPERTY_PERSON_ACCOUNT_ID3, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "account_id3"}, + {CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "addressbook_ids"}, + {CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "has_phonenumber"}, + {CTSVC_PROPERTY_PERSON_HAS_EMAIL, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "has_email"}, + // contacts + {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_id"}, + // group relation + {CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "group_id"}, + // addressbook + {CTSVC_PROPERTY_ADDRESSBOOK_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_name"}, + {CTSVC_PROPERTY_ADDRESSBOOK_MODE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_mode"}, + {CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_PROJECTION, "contact_id"}, +}; + +const property_info_s __property_person_phonelog[] = { // _contacts_person_phone_log + {CTSVC_PROPERTY_PERSON_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "id"}, + {CTSVC_PROPERTY_PERSON_DISPLAY_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "image_thumbnail_path"}, + // phonelog + {CTSVC_PROPERTY_PHONELOG_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "phonelog_id"}, + {CTSVC_PROPERTY_PHONELOG_ADDRESS, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "address"}, + {CTSVC_PROPERTY_DATA_DATA1, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_PROJECTION, "address_type"}, + {CTSVC_PROPERTY_PHONELOG_LOG_TIME, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "log_time"}, + {CTSVC_PROPERTY_PHONELOG_LOG_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "log_type"}, + {CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_PROJECTION, "data1"}, // duration + {CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "data2"}, // message_id +}; + +const property_info_s __property_person_usage[] = { // _contacts_person_usage + {CTSVC_PROPERTY_PERSON_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "person_id"}, + {CTSVC_PROPERTY_PERSON_DISPLAY_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_PROJECTION, "name_contact_id"}, + {CTSVC_PROPERTY_PERSON_RINGTONE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "ringtone_path"}, + {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "image_thumbnail_path"}, + {CTSVC_PROPERTY_PERSON_VIBRATION, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "vibration"}, + {CTSVC_PROPERTY_PERSON_IS_FAVORITE, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "is_favorite"}, + {CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "has_phonenumber"}, + {CTSVC_PROPERTY_PERSON_HAS_EMAIL, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "has_email"}, + // contact_stat + {CTSVC_PROPERTY_PERSON_USAGE_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "usage_type"}, + {CTSVC_PROPERTY_PERSON_TIMES_USED, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "times_used"}, +}; + +const property_info_s __property_contact_number[] = { // _contacts_contact_number + {CTSVC_PROPERTY_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_PROJECTION, "display_name_source"}, + {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_id"}, + {CTSVC_PROPERTY_CONTACT_PERSON_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "person_id"}, + {CTSVC_PROPERTY_CONTACT_RINGTONE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "ringtone_path"}, + {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL,CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "image_thumbnail_path"}, + // number + {CTSVC_PROPERTY_NUMBER_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "number_id"}, + {CTSVC_PROPERTY_NUMBER_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_PROJECTION, "type"}, + {CTSVC_PROPERTY_NUMBER_LABEL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "label"}, + {CTSVC_PROPERTY_NUMBER_IS_DEFAULT, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "is_default"}, + {CTSVC_PROPERTY_NUMBER_NUMBER, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "number"}, + {CTSVC_PROPERTY_NUMBER_NUMBER_FILTER, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_FILTER, "normalized_number"}, +}; + +const property_info_s __property_contact_email[] = { // _contacts_contact_email + {CTSVC_PROPERTY_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "display_name_source"}, + {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_id"}, + {CTSVC_PROPERTY_CONTACT_PERSON_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "person_id"}, + {CTSVC_PROPERTY_CONTACT_RINGTONE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "ringtone_path"}, + {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "image_thumbnail_path"}, + // email + {CTSVC_PROPERTY_EMAIL_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "email_id"}, + {CTSVC_PROPERTY_EMAIL_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_PROJECTION, "type"}, + {CTSVC_PROPERTY_EMAIL_LABEL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "label"}, + {CTSVC_PROPERTY_EMAIL_IS_DEFAULT, CTSVC_VIEW_DATA_TYPE_BOOL, CTSVC_SEARCH_PROPERTY_ALL, "is_default"}, + {CTSVC_PROPERTY_EMAIL_EMAIL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "email"}, +}; + +const property_info_s __property_contact_grouprel[] = { // _contacts_contact_grouprel + {CTSVC_PROPERTY_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_PROJECTION, "display_name_source"}, + {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_id"}, + {CTSVC_PROPERTY_CONTACT_PERSON_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "person_id"}, + {CTSVC_PROPERTY_CONTACT_RINGTONE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "ringtone_path"}, + {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "image_thumbnail_path"}, + // group relation + {CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "group_id"}, + {CTSVC_PROPERTY_GROUP_RELATION_GROUP_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "group_name"}, +}; + +const property_info_s __property_contact_activity[] = { // _contacts_contact_activity + {CTSVC_PROPERTY_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "contact_id"}, + {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, NULL}, // "dispaly_name" or "reverse_dispaly_name" + {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_PROJECTION, "display_name_source"}, + {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "addressbook_id"}, + {CTSVC_PROPERTY_CONTACT_PERSON_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "person_id"}, + {CTSVC_PROPERTY_CONTACT_RINGTONE, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "ringtone_path"}, + {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "image_thumbnail_path"}, + {CTSVC_PROPERTY_ACTIVITY_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "activity_id"}, + {CTSVC_PROPERTY_ACTIVITY_SOURCE_NAME, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "source_name"}, + {CTSVC_PROPERTY_ACTIVITY_STATUS, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "status"}, + {CTSVC_PROPERTY_ACTIVITY_TIMESTAMP, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "timestamp"}, + {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA1, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "sync_data1"}, + {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA2, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "sync_data2"}, + {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA3, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "sync_data3"}, + {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA4, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_PROJECTION, "sync_data4"}, + {CTSVC_PROPERTY_ADDRESSBOOK_ACCOUNT_ID, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "account_id"}, +}; + +const property_info_s __property_phonelog_number[] = { //_contacts_phone_log_number + {CTSVC_PROPERTY_PHONELOG_ADDRESS, CTSVC_VIEW_DATA_TYPE_STR, CTSVC_SEARCH_PROPERTY_ALL, "number"}, +}; + +const property_info_s __property_phonelog_stat[] = { //_contacts_phone_log_stat + {CTSVC_PROPERTY_PHONELOG_STAT_LOG_COUNT, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_PROJECTION, "log_count"}, + {CTSVC_PROPERTY_PHONELOG_STAT_LOG_TYPE, CTSVC_VIEW_DATA_TYPE_INT, CTSVC_SEARCH_PROPERTY_ALL, "log_type"}, +}; + +typedef struct { + char *view_uri; + ctsvc_record_type_e type; + property_info_s *properties; + unsigned int property_count; +}view_uri_info_s; + +#define PTR_COUNT(X) (void*)(X), sizeof(X)/sizeof(property_info_s) + +static const view_uri_info_s __tables[] = { + {CTSVC_VIEW_URI_ADDRESSBOOK, CTSVC_RECORD_ADDRESSBOOK, PTR_COUNT(__property_addressbook)}, + {CTSVC_VIEW_URI_GROUP, CTSVC_RECORD_GROUP, PTR_COUNT(__property_group)}, + {CTSVC_VIEW_URI_PERSON, CTSVC_RECORD_PERSON, PTR_COUNT(__property_person)}, + {CTSVC_VIEW_URI_SIMPLE_CONTACT, CTSVC_RECORD_SIMPLE_CONTACT, PTR_COUNT(__property_simple_contact)}, + {CTSVC_VIEW_URI_CONTACT, CTSVC_RECORD_CONTACT, PTR_COUNT(__property_contact)}, + {CTSVC_VIEW_URI_MY_PROFILE, CTSVC_RECORD_MY_PROFILE, PTR_COUNT(__property_my_profile)}, + {CTSVC_VIEW_URI_ACTIVITY, CTSVC_RECORD_ACTIVITY, PTR_COUNT(__property_activity)}, + {CTSVC_VIEW_URI_ACTIVITY_PHOTO, CTSVC_RECORD_ACTIVITY_PHOTO, PTR_COUNT(__property_activity_photo)}, + {CTSVC_VIEW_URI_PHONELOG, CTSVC_RECORD_PHONELOG, PTR_COUNT(__property_phonelog)}, + {CTSVC_VIEW_URI_SPEEDDIAL, CTSVC_RECORD_SPEEDDIAL, PTR_COUNT(__property_speeddial)}, + {CTSVC_VIEW_URI_SDN, CTSVC_RECORD_SDN, PTR_COUNT(__property_snd)}, + + {CTSVC_VIEW_URI_NAME, CTSVC_RECORD_NAME, PTR_COUNT(__property_name)}, + {CTSVC_VIEW_URI_COMPANY, CTSVC_RECORD_COMPANY, PTR_COUNT(__property_company)}, + {CTSVC_VIEW_URI_NUMBER, CTSVC_RECORD_NUMBER, PTR_COUNT(__property_number)}, + {CTSVC_VIEW_URI_EMAIL, CTSVC_RECORD_EMAIL, PTR_COUNT(__property_email)}, + {CTSVC_VIEW_URI_URL, CTSVC_RECORD_URL, PTR_COUNT(__property_url)}, + {CTSVC_VIEW_URI_ADDRESS, CTSVC_RECORD_ADDRESS, PTR_COUNT(__property_address)}, + {CTSVC_VIEW_URI_PROFILE, CTSVC_RECORD_PROFILE, PTR_COUNT(__property_profile)}, + {CTSVC_VIEW_URI_RELATIONSHIP, CTSVC_RECORD_RELATIONSHIP, PTR_COUNT(__property_relationship)}, + {CTSVC_VIEW_URI_IMAGE, CTSVC_RECORD_IMAGE, PTR_COUNT(__property_image)}, + {CTSVC_VIEW_URI_NOTE, CTSVC_RECORD_NOTE, PTR_COUNT(__property_note)}, + {CTSVC_VIEW_URI_NICKNAME, CTSVC_RECORD_NICKNAME, PTR_COUNT(__property_nickname)}, + {CTSVC_VIEW_URI_EVENT, CTSVC_RECORD_EVENT, PTR_COUNT(__property_event)}, + {CTSVC_VIEW_URI_MESSENGER, CTSVC_RECORD_MESSENGER, PTR_COUNT(__property_messenger)}, + {CTSVC_VIEW_URI_GROUP_RELATION, CTSVC_RECORD_GROUP_RELATION, PTR_COUNT(__property_group_relation)}, + {CTSVC_VIEW_URI_EXTENSION, CTSVC_RECORD_EXTENSION, PTR_COUNT(__property_extension)}, + + {CTSVC_VIEW_URI_GROUPS_UPDATED_INFO, CTSVC_RECORD_UPDATED_INFO, PTR_COUNT(__property_updated_info)}, + {CTSVC_VIEW_URI_GROUPS_MEMBER_UPDATED_INFO, CTSVC_RECORD_UPDATED_INFO, PTR_COUNT(__property_updated_info)}, + {CTSVC_VIEW_URI_CONTACTS_UPDATED_INFO, CTSVC_RECORD_UPDATED_INFO, PTR_COUNT(__property_updated_info)}, + {CTSVC_VIEW_URI_GROUPRELS_UPDATED_INFO, CTSVC_RECORD_RESULT, PTR_COUNT(__property_grouprel_updated_info)}, + + {CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT, CTSVC_RECORD_RESULT, PTR_COUNT(__property_person_contact)}, + {CTSVC_VIEW_URI_READ_ONLY_PERSON_NUMBER, CTSVC_RECORD_RESULT, PTR_COUNT(__property_person_number)}, + {CTSVC_VIEW_URI_READ_ONLY_PERSON_EMAIL, CTSVC_RECORD_RESULT, PTR_COUNT(__property_person_email)}, + {CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP, CTSVC_RECORD_RESULT, PTR_COUNT(__property_person_grouprel)}, + {CTSVC_VIEW_URI_READ_ONLY_PERSON_PHONELOG, CTSVC_RECORD_RESULT, PTR_COUNT(__property_person_phonelog)}, + {CTSVC_VIEW_URI_READ_ONLY_PERSON_USAGE, CTSVC_RECORD_RESULT, PTR_COUNT(__property_person_usage)}, + {CTSVC_VIEW_URI_READ_ONLY_CONTACT_NUMBER, CTSVC_RECORD_RESULT, PTR_COUNT(__property_contact_number)}, + {CTSVC_VIEW_URI_READ_ONLY_CONTACT_EMAIL, CTSVC_RECORD_RESULT, PTR_COUNT(__property_contact_email)}, + {CTSVC_VIEW_URI_READ_ONLY_CONTACT_GROUP, CTSVC_RECORD_RESULT, PTR_COUNT(__property_contact_grouprel)}, + {CTSVC_VIEW_URI_READ_ONLY_CONTACT_ACTIVITY, CTSVC_RECORD_RESULT, PTR_COUNT(__property_contact_activity)}, + {CTSVC_VIEW_URI_READ_ONLY_PHONELOG_NUMBER, CTSVC_RECORD_RESULT, PTR_COUNT(__property_phonelog_number)}, + {CTSVC_VIEW_URI_READ_ONLY_PHONELOG_STAT, CTSVC_RECORD_RESULT, PTR_COUNT(__property_phonelog_stat)}, +}; + +static GHashTable *__ctsvc_view_uri_hash = NULL; + +void ctsvc_view_uri_init() +{ + int i; + if (__ctsvc_view_uri_hash) + return; + + __ctsvc_view_uri_hash = g_hash_table_new(g_str_hash, g_str_equal); + + i = 0; + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_ADDRESSBOOK, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_GROUP, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_PERSON, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_SIMPLE_CONTACT, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_CONTACT, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_MY_PROFILE, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_ACTIVITY, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_ACTIVITY_PHOTO, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_PHONELOG, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_SPEEDDIAL, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_SDN, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_NAME, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_COMPANY, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_NUMBER, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_EMAIL, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_URL, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_ADDRESS, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_PROFILE, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_RELATIONSHIP, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_IMAGE, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_NOTE, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_NICKNAME, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_EVENT, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_MESSENGER, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_GROUP_RELATION, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_EXTENSION, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_GROUPS_UPDATED_INFO, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_GROUPS_MEMBER_UPDATED_INFO, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_CONTACTS_UPDATED_INFO, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_GROUPRELS_UPDATED_INFO, GINT_TO_POINTER(&__tables[i++])); + + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_PERSON_NUMBER, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_PERSON_EMAIL, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_PERSON_PHONELOG, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_PERSON_USAGE, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_CONTACT_NUMBER, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_CONTACT_EMAIL, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_CONTACT_GROUP, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_CONTACT_ACTIVITY, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_PHONELOG_NUMBER, GINT_TO_POINTER(&__tables[i++])); + g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_PHONELOG_STAT, GINT_TO_POINTER(&__tables[i++])); +} + +void ctsvc_view_uri_deinit() +{ +#if 0 + if (NULL == __ctsvc_view_uri_hash) + ASSERT_NOT_REACHED("__ctsvc_view_uri_hash is NULL"); + + g_hash_table_destroy(__ctsvc_view_uri_hash); + __ctsvc_view_uri_hash = NULL; +#endif +} + +ctsvc_record_type_e ctsvc_view_get_record_type(const char* view_uri) +{ + view_uri_info_s* view_uri_info = NULL; + ctsvc_record_type_e type = CTSVC_RECORD_INVALID; + + if (NULL == __ctsvc_view_uri_hash) { + ASSERT_NOT_REACHED("__ctsvc_view_uri_hash is NULL"); + } + + view_uri_info = g_hash_table_lookup(__ctsvc_view_uri_hash, view_uri); + if (view_uri_info) + type = view_uri_info->type; + + return type; +} + +const char* ctsvc_view_get_uri( const char* view_uri ) +{ + view_uri_info_s* view_uri_info = NULL; + + if (NULL == __ctsvc_view_uri_hash) { + ASSERT_NOT_REACHED("__ctsvc_view_uri_hash is NULL"); + } + + view_uri_info = g_hash_table_lookup(__ctsvc_view_uri_hash, view_uri); + if (view_uri_info) + return view_uri_info->view_uri; + + return NULL; +} + +const property_info_s* ctsvc_view_get_all_property_infos(const char *view_uri, unsigned int *count) +{ + view_uri_info_s* view_uri_info = NULL; + + if (NULL == __ctsvc_view_uri_hash) { + ASSERT_NOT_REACHED("__ctsvc_view_uri_hash is NULL"); + } + + view_uri_info = g_hash_table_lookup(__ctsvc_view_uri_hash, view_uri); + if (view_uri_info) { + *count = view_uri_info->property_count; + return view_uri_info->properties; + } + + return NULL; +} + diff --git a/common/ctsvc_view.h b/common/ctsvc_view.h new file mode 100644 index 0000000..7dd1fd8 --- /dev/null +++ b/common/ctsvc_view.h @@ -0,0 +1,461 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_VIEW_H__ +#define __TIZEN_SOCIAL_CTSVC_VIEW_H__ + +#include "ctsvc_struct.h" + +#define CTSVC_VIEW_URI_ADDRESSBOOK "tizen.contacts_view.addressbook" +#define CTSVC_VIEW_URI_GROUP "tizen.contacts_view.group" +#define CTSVC_VIEW_URI_PERSON "tizen.contacts_view.person" +#define CTSVC_VIEW_URI_SIMPLE_CONTACT "tizen.contacts_view.simple_contact" +#define CTSVC_VIEW_URI_CONTACT "tizen.contacts_view.contact" +#define CTSVC_VIEW_URI_MY_PROFILE "tizen.contacts_view.my_profile" +#define CTSVC_VIEW_URI_ACTIVITY "tizen.contacts_view.activity" +#define CTSVC_VIEW_URI_ACTIVITY_PHOTO "tizen.contacts_view.activity/photo" +#define CTSVC_VIEW_URI_PHONELOG "tizen.contacts_view.phonelog" +#define CTSVC_VIEW_URI_SPEEDDIAL "tizen.contacts_view.speeddial" +#define CTSVC_VIEW_URI_SDN "tizen.contacts_view.sdn" +#define CTSVC_VIEW_URI_CONTACTS_UPDATED_INFO "tizen.contacts_view.contacts_updated_info" +#define CTSVC_VIEW_URI_GROUPS_UPDATED_INFO "tizen.contacts_view.groups_updated_info" +#define CTSVC_VIEW_URI_GROUPS_MEMBER_UPDATED_INFO "tizen.contacts_view.groups_member_updated_info" +#define CTSVC_VIEW_URI_GROUPRELS_UPDATED_INFO "tizen.contacts_view.group_relations_updated_info" +#define CTSVC_VIEW_URI_NAME "tizen.contacts_view.name" +#define CTSVC_VIEW_URI_COMPANY "tizen.contacts_view.company" +#define CTSVC_VIEW_URI_NUMBER "tizen.contacts_view.number" +#define CTSVC_VIEW_URI_EMAIL "tizen.contacts_view.email" +#define CTSVC_VIEW_URI_URL "tizen.contacts_view.url" +#define CTSVC_VIEW_URI_ADDRESS "tizen.contacts_view.address" +#define CTSVC_VIEW_URI_PROFILE "tizen.contacts_view.profile" +#define CTSVC_VIEW_URI_RELATIONSHIP "tizen.contacts_view.relationship" +#define CTSVC_VIEW_URI_IMAGE "tizen.contacts_view.image" +#define CTSVC_VIEW_URI_NOTE "tizen.contacts_view.note" +#define CTSVC_VIEW_URI_NICKNAME "tizen.contacts_view.nickname" +#define CTSVC_VIEW_URI_EVENT "tizen.contacts_view.event" +#define CTSVC_VIEW_URI_MESSENGER "tizen.contacts_view.messenger" +#define CTSVC_VIEW_URI_GROUP_RELATION "tizen.contacts_view.group_relation" +#define CTSVC_VIEW_URI_EXTENSION "tizen.contacts_view.extension" + +#define CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT "tizen.contacts_view.person/simple_contact" +#define CTSVC_VIEW_URI_READ_ONLY_PERSON_NUMBER "tizen.contacts_view.person/simple_contact/number" +#define CTSVC_VIEW_URI_READ_ONLY_PERSON_EMAIL "tizen.contacts_view.person/simple_contact/email" + +#define CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP "tizen.contacts_view.person/simple_contact/group" +#define CTSVC_VIEW_URI_READ_ONLY_PERSON_PHONELOG "tizen.contacts_view.person/simple_contact/phonelog" +#define CTSVC_VIEW_URI_READ_ONLY_PERSON_USAGE "tizen.contacts_view.person/usage" + +#define CTSVC_VIEW_URI_READ_ONLY_CONTACT_NUMBER "tizen.contacts_view.simple_contact/number" +#define CTSVC_VIEW_URI_READ_ONLY_CONTACT_EMAIL "tizen.contacts_view.simple_contact/email" +#define CTSVC_VIEW_URI_READ_ONLY_CONTACT_GROUP "tizen.contacts_view.simple_contact/group" +#define CTSVC_VIEW_URI_READ_ONLY_CONTACT_ACTIVITY "tizen.contacts_view.simple_contact/activity" +#define CTSVC_VIEW_URI_READ_ONLY_PHONELOG_NUMBER "tizen.contacts_view.phonelog/number" +#define CTSVC_VIEW_URI_READ_ONLY_PHONELOG_STAT "tizen.contacts_view.phonelog_stat" + + +typedef enum +{ + CTSVC_PROPERTY_FLAG_PROJECTION = 0x00000001, + CTSVC_PROPERTY_FLAG_DIRTY = 0x00000002, // for dirty bit +} contacts_property_flag_e; + + +// for type check // data_type mask 0x000FF000 +#define CTSVC_VIEW_DATA_TYPE_MASK 0x000F0000 +#define CTSVC_VIEW_DATA_TYPE_BOOL 0x00010000 +#define CTSVC_VIEW_DATA_TYPE_INT 0x00020000 +#define CTSVC_VIEW_DATA_TYPE_LLI 0x00030000 +#define CTSVC_VIEW_DATA_TYPE_STR 0x00040000 +#define CTSVC_VIEW_DATA_TYPE_DOUBLE 0x00050000 +#define CTSVC_VIEW_DATA_TYPE_REC 0x00060000 +#define CTSVC_VIEW_CHECK_DATA_TYPE(property_id,data_type) \ + ((property_id&CTSVC_VIEW_DATA_TYPE_MASK) == data_type ? true : false) + +#define CTSVC_READ_WRITE_TYPE_MASK 0x0000F000 +#define CTSVC_READ_ONLY_PROPERTY 0x00001000 +#define CTSVC_WRIET_ONCE_PROPERTY 0x00002000 + +#define CTSVC_READ_ONLY_CHECK(property_id, data_type) \ + ((property_id & CTSVC_READ_WRITE_TYPE_MASK) == data_type ? true : false) + + +// for property // 0x0FF00000 +#define CTSVC_PROPERTY_MASK 0x0FF00000 + +#define CTSVC_PROPERTY_ADDRESSBOOK 0x00100000 +#define CTSVC_PROPERTY_GROUP 0x00200000 +#define CTSVC_PROPERTY_PERSON 0x00300000 +#define CTSVC_PROPERTY_ACTIVITY 0x00500000 +#define CTSVC_PROPERTY_DATA 0x00600000 +#define CTSVC_PROPERTY_SPEEDDIAL 0x00700000 +#define CTSVC_PROPERTY_PHONELOG 0x00800000 +#define CTSVC_PROPERTY_UPDATE_INFO 0x00900000 +#define CTSVC_PROPERTY_SDN 0x00A00000 +#define CTSVC_PROPERTY_PHONELOG_STAT 0x00B00000 + +#define CTSVC_PROPERTY_CONTACT 0x01000000 +#define CTSVC_PROPERTY_NAME 0x01100000 +#define CTSVC_PROPERTY_NUMBER 0x01200000 +#define CTSVC_PROPERTY_EMAIL 0x01300000 +#define CTSVC_PROPERTY_ADDRESS 0x01400000 +#define CTSVC_PROPERTY_URL 0x01500000 +#define CTSVC_PROPERTY_EVENT 0x01600000 +#define CTSVC_PROPERTY_GROUP_RELATION 0x01700000 +#define CTSVC_PROPERTY_RELATIONSHIP 0x01800000 +#define CTSVC_PROPERTY_COMPANY 0x01900000 +#define CTSVC_PROPERTY_NICKNAME 0x01A00000 +#define CTSVC_PROPERTY_MESSENGER 0x01B00000 +#define CTSVC_PROPERTY_NOTE 0x01C00000 +#define CTSVC_PROPERTY_PROFILE 0x01D00000 +#define CTSVC_PROPERTY_IMAGE 0x01E00000 +#define CTSVC_PROPERTY_EXTENSION 0x01F00000 +#define CTSVC_PROPERTY_MY_PROFILE 0x02000000 +#define CTSVC_PROPERTY_ACTIVITY_PHOTO 0x02100000 + +#define CTSVC_PROPERTY_CHECK(property_id,data_type) \ + ((property_id & CTSVC_PROPERTY_MASK) == data_type ? true : false) + +#define CTSVC_SEARCH_PROPERTY_MASK 0xF0000000 +#define CTSVC_SEARCH_PROPERTY_NONE 0x10000000 +#define CTSVC_SEARCH_PROPERTY_FILTER 0x20000000 +#define CTSVC_SEARCH_PROPERTY_PROJECTION 0x30000000 +#define CTSVC_SEARCH_PROPERTY_ALL 0x40000000 +#define CTSVC_SEARCH_PROPERTY_CHECK(property_id,data_type) \ + ((property_id & CTSVC_SEARCH_PROPERTY_MASK) == data_type ? true : false) + +typedef enum { + // addressbook + CTSVC_PROPERTY_ADDRESSBOOK_ID = (CTSVC_PROPERTY_ADDRESSBOOK | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_ADDRESSBOOK_ACCOUNT_ID = (CTSVC_PROPERTY_ADDRESSBOOK | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_ADDRESSBOOK_NAME = (CTSVC_PROPERTY_ADDRESSBOOK | CTSVC_VIEW_DATA_TYPE_STR) +2, + CTSVC_PROPERTY_ADDRESSBOOK_MODE = (CTSVC_PROPERTY_ADDRESSBOOK | CTSVC_VIEW_DATA_TYPE_INT) +3, + + // group + CTSVC_PROPERTY_GROUP_ID = (CTSVC_PROPERTY_GROUP | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_GROUP_ADDRESSBOOK_ID = (CTSVC_PROPERTY_GROUP | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_GROUP_NAME = (CTSVC_PROPERTY_GROUP | CTSVC_VIEW_DATA_TYPE_STR) +2, + CTSVC_PROPERTY_GROUP_RINGTONE = (CTSVC_PROPERTY_GROUP | CTSVC_VIEW_DATA_TYPE_STR) +3, + CTSVC_PROPERTY_GROUP_IMAGE = (CTSVC_PROPERTY_GROUP | CTSVC_VIEW_DATA_TYPE_STR) +4, + CTSVC_PROPERTY_GROUP_VIBRATION = (CTSVC_PROPERTY_GROUP | CTSVC_VIEW_DATA_TYPE_STR) +5, + CTSVC_PROPERTY_GROUP_SYSTEM_ID = (CTSVC_PROPERTY_GROUP | CTSVC_VIEW_DATA_TYPE_STR) +6, + CTSVC_PROPERTY_GROUP_IS_READ_ONLY = (CTSVC_PROPERTY_GROUP | CTSVC_VIEW_DATA_TYPE_BOOL | CTSVC_READ_ONLY_PROPERTY) +7, + + // person + CTSVC_PROPERTY_PERSON_ID = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_PERSON_DISPLAY_NAME = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +1, + CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_INT ) +2, + CTSVC_PROPERTY_PERSON_RINGTONE = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_STR) +3, + CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_STR) +4, + CTSVC_PROPERTY_PERSON_VIBRATION = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_STR) +5, + CTSVC_PROPERTY_PERSON_IS_FAVORITE = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_BOOL) +6, + CTSVC_PROPERTY_PERSON_FAVORITE_PRIORITY = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_DOUBLE | CTSVC_READ_ONLY_PROPERTY) +7, + CTSVC_PROPERTY_PERSON_LINK_COUNT = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +8, + CTSVC_PROPERTY_PERSON_ACCOUNT_ID1 = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +9, + CTSVC_PROPERTY_PERSON_ACCOUNT_ID2 = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +10, + CTSVC_PROPERTY_PERSON_ACCOUNT_ID3 = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +11, + CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +12, + CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_BOOL | CTSVC_READ_ONLY_PROPERTY) +13, + CTSVC_PROPERTY_PERSON_HAS_EMAIL = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_BOOL | CTSVC_READ_ONLY_PROPERTY) +14, + CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +15, + CTSVC_PROPERTY_PERSON_STATUS = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +16, + // person-stat + CTSVC_PROPERTY_PERSON_USAGE_TYPE = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_INT) +17, + CTSVC_PROPERTY_PERSON_TIMES_USED = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_INT) +18, + + // simple contact : read only + // contact + CTSVC_PROPERTY_CONTACT_ID = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_CONTACT_DISPLAY_NAME = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +1, + CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +2, + CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_INT) +3, + CTSVC_PROPERTY_CONTACT_RINGTONE = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_STR) +4, + CTSVC_PROPERTY_CONTACT_IMAGE = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +5, + CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_STR) +6, + CTSVC_PROPERTY_CONTACT_IS_FAVORITE = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_BOOL | CTSVC_READ_ONLY_PROPERTY) +7, + CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_BOOL | CTSVC_READ_ONLY_PROPERTY) +8, + CTSVC_PROPERTY_CONTACT_HAS_EMAIL = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_BOOL | CTSVC_READ_ONLY_PROPERTY) +9, + CTSVC_PROPERTY_CONTACT_PERSON_ID = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +10, + CTSVC_PROPERTY_CONTACT_UID = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_STR) +11, + CTSVC_PROPERTY_CONTACT_VIBRATION = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_STR) +12, + CTSVC_PROPERTY_CONTACT_CHANGED_TIME = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +13, + CTSVC_PROPERTY_CONTACT_NAME = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +14, + CTSVC_PROPERTY_CONTACT_COMPANY = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +15, + CTSVC_PROPERTY_CONTACT_NOTE = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +16, + CTSVC_PROPERTY_CONTACT_NUMBER = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +17, + CTSVC_PROPERTY_CONTACT_EMAIL = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +18, + CTSVC_PROPERTY_CONTACT_EVENT = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +19, + CTSVC_PROPERTY_CONTACT_MESSENGER = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +20, + CTSVC_PROPERTY_CONTACT_ADDRESS = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +21, + CTSVC_PROPERTY_CONTACT_URL = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +22, + CTSVC_PROPERTY_CONTACT_NICKNAME = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +23, + CTSVC_PROPERTY_CONTACT_PROFILE = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +24, + CTSVC_PROPERTY_CONTACT_RELATIONSHIP = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +25, + CTSVC_PROPERTY_CONTACT_GROUP_RELATION = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +26, + CTSVC_PROPERTY_CONTACT_EXTENSION = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +27, + + // my_profile + CTSVC_PROPERTY_MY_PROFILE_ID = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_MY_PROFILE_DISPLAY_NAME = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +1, + CTSVC_PROPERTY_MY_PROFILE_ADDRESSBOOK_ID = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_INT) +2, + CTSVC_PROPERTY_MY_PROFILE_IMAGE = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +3, + CTSVC_PROPERTY_MY_PROFILE_IMAGE_THUMBNAIL = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_STR) +4, + CTSVC_PROPERTY_MY_PROFILE_UID = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_STR) +5, + CTSVC_PROPERTY_MY_PROFILE_CHANGED_TIME = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_INT) +6, + CTSVC_PROPERTY_MY_PROFILE_NAME = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +7, + CTSVC_PROPERTY_MY_PROFILE_COMPANY = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +8, + CTSVC_PROPERTY_MY_PROFILE_NOTE = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +9, + CTSVC_PROPERTY_MY_PROFILE_NUMBER = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +10, + CTSVC_PROPERTY_MY_PROFILE_EMAIL = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +11, + CTSVC_PROPERTY_MY_PROFILE_EVENT = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +12, + CTSVC_PROPERTY_MY_PROFILE_MESSENGER = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +13, + CTSVC_PROPERTY_MY_PROFILE_ADDRESS = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +14, + CTSVC_PROPERTY_MY_PROFILE_URL = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +15, + CTSVC_PROPERTY_MY_PROFILE_NICKNAME = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +16, + CTSVC_PROPERTY_MY_PROFILE_PROFILE = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +17, + CTSVC_PROPERTY_MY_PROFILE_RELATIONSHIP = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +18, + CTSVC_PROPERTY_MY_PROFILE_EXTENSION = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +19, + + // contact_name + CTSVC_PROPERTY_NAME_ID = (CTSVC_PROPERTY_NAME | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_NAME_CONTACT_ID = (CTSVC_PROPERTY_NAME | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_NAME_FIRST = (CTSVC_PROPERTY_NAME | CTSVC_VIEW_DATA_TYPE_STR) +2, + CTSVC_PROPERTY_NAME_LAST = (CTSVC_PROPERTY_NAME | CTSVC_VIEW_DATA_TYPE_STR) +3, + CTSVC_PROPERTY_NAME_ADDITION = (CTSVC_PROPERTY_NAME | CTSVC_VIEW_DATA_TYPE_STR) +4, + CTSVC_PROPERTY_NAME_SUFFIX = (CTSVC_PROPERTY_NAME | CTSVC_VIEW_DATA_TYPE_STR) +5, + CTSVC_PROPERTY_NAME_PREFIX = (CTSVC_PROPERTY_NAME | CTSVC_VIEW_DATA_TYPE_STR) +6, + CTSVC_PROPERTY_NAME_PHONETIC_FIRST = (CTSVC_PROPERTY_NAME | CTSVC_VIEW_DATA_TYPE_STR) +7, + CTSVC_PROPERTY_NAME_PHONETIC_MIDDLE = (CTSVC_PROPERTY_NAME | CTSVC_VIEW_DATA_TYPE_STR) +8, + CTSVC_PROPERTY_NAME_PHONETIC_LAST = (CTSVC_PROPERTY_NAME | CTSVC_VIEW_DATA_TYPE_STR) +9, + + + // contact_number + CTSVC_PROPERTY_NUMBER_ID = (CTSVC_PROPERTY_NUMBER | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_NUMBER_CONTACT_ID = (CTSVC_PROPERTY_NUMBER | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_NUMBER_TYPE = (CTSVC_PROPERTY_NUMBER | CTSVC_VIEW_DATA_TYPE_INT) +2, + CTSVC_PROPERTY_NUMBER_LABEL = (CTSVC_PROPERTY_NUMBER | CTSVC_VIEW_DATA_TYPE_STR) +3, + CTSVC_PROPERTY_NUMBER_IS_DEFAULT = (CTSVC_PROPERTY_NUMBER | CTSVC_VIEW_DATA_TYPE_BOOL) +4, + CTSVC_PROPERTY_NUMBER_NUMBER = (CTSVC_PROPERTY_NUMBER | CTSVC_VIEW_DATA_TYPE_STR) +5, + CTSVC_PROPERTY_NUMBER_NUMBER_FILTER = (CTSVC_PROPERTY_NUMBER | CTSVC_VIEW_DATA_TYPE_STR) +6, + + // contact_email + CTSVC_PROPERTY_EMAIL_ID = (CTSVC_PROPERTY_EMAIL | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_EMAIL_CONTACT_ID = (CTSVC_PROPERTY_EMAIL | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_EMAIL_TYPE = (CTSVC_PROPERTY_EMAIL | CTSVC_VIEW_DATA_TYPE_INT) +2, + CTSVC_PROPERTY_EMAIL_LABEL = (CTSVC_PROPERTY_EMAIL | CTSVC_VIEW_DATA_TYPE_STR) +3, + CTSVC_PROPERTY_EMAIL_IS_DEFAULT = (CTSVC_PROPERTY_EMAIL | CTSVC_VIEW_DATA_TYPE_BOOL) +4, + CTSVC_PROPERTY_EMAIL_EMAIL = (CTSVC_PROPERTY_EMAIL | CTSVC_VIEW_DATA_TYPE_STR) +5, + + // contact_address + CTSVC_PROPERTY_ADDRESS_ID = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_ADDRESS_CONTACT_ID = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_ADDRESS_TYPE = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_INT) +2, + CTSVC_PROPERTY_ADDRESS_LABEL = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_STR) +3, + CTSVC_PROPERTY_ADDRESS_POSTBOX = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_STR) +4, + CTSVC_PROPERTY_ADDRESS_POSTAL_CODE = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_STR) +5, + CTSVC_PROPERTY_ADDRESS_REGION = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_STR) +6, + CTSVC_PROPERTY_ADDRESS_LOCALITY = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_STR) +7, + CTSVC_PROPERTY_ADDRESS_STREET = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_STR) +8, + CTSVC_PROPERTY_ADDRESS_COUNTRY = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_STR) +9, + CTSVC_PROPERTY_ADDRESS_EXTENDED = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_STR) +10, + CTSVC_PROPERTY_ADDRESS_IS_DEFAULT = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_STR) +11, + + // contact_url + CTSVC_PROPERTY_URL_ID = (CTSVC_PROPERTY_URL | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_URL_CONTACT_ID = (CTSVC_PROPERTY_URL | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_URL_TYPE = (CTSVC_PROPERTY_URL | CTSVC_VIEW_DATA_TYPE_INT) +2, + CTSVC_PROPERTY_URL_LABEL = (CTSVC_PROPERTY_URL | CTSVC_VIEW_DATA_TYPE_STR) +3, + CTSVC_PROPERTY_URL_URL = (CTSVC_PROPERTY_URL | CTSVC_VIEW_DATA_TYPE_STR) +4, + + // contact_event + CTSVC_PROPERTY_EVENT_ID = (CTSVC_PROPERTY_EVENT | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_EVENT_CONTACT_ID = (CTSVC_PROPERTY_EVENT | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_EVENT_TYPE = (CTSVC_PROPERTY_EVENT | CTSVC_VIEW_DATA_TYPE_INT) +2, + CTSVC_PROPERTY_EVENT_LABEL = (CTSVC_PROPERTY_EVENT | CTSVC_VIEW_DATA_TYPE_STR) +3, + CTSVC_PROPERTY_EVENT_DATE = (CTSVC_PROPERTY_EVENT | CTSVC_VIEW_DATA_TYPE_INT) +4, + CTSVC_PROPERTY_EVENT_IS_LUNAR = (CTSVC_PROPERTY_EVENT | CTSVC_VIEW_DATA_TYPE_BOOL) +5, + CTSVC_PROPERTY_EVENT_LUNAR_DATE = (CTSVC_PROPERTY_EVENT | CTSVC_VIEW_DATA_TYPE_INT) +6, + + // contact_grouprelation + CTSVC_PROPERTY_GROUP_RELATION_ID = (CTSVC_PROPERTY_GROUP_RELATION | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID = (CTSVC_PROPERTY_GROUP_RELATION | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID = (CTSVC_PROPERTY_GROUP_RELATION | CTSVC_VIEW_DATA_TYPE_INT) +2, + CTSVC_PROPERTY_GROUP_RELATION_GROUP_NAME = (CTSVC_PROPERTY_GROUP_RELATION | CTSVC_VIEW_DATA_TYPE_STR) +3, + + // contact_relationship + CTSVC_PROPERTY_RELATIONSHIP_ID = (CTSVC_PROPERTY_RELATIONSHIP | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_RELATIONSHIP_CONTACT_ID = (CTSVC_PROPERTY_RELATIONSHIP | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_RELATIONSHIP_TYPE = (CTSVC_PROPERTY_RELATIONSHIP | CTSVC_VIEW_DATA_TYPE_INT) +2, + CTSVC_PROPERTY_RELATIONSHIP_LABEL = (CTSVC_PROPERTY_RELATIONSHIP | CTSVC_VIEW_DATA_TYPE_STR) +3, + CTSVC_PROPERTY_RELATIONSHIP_NAME = (CTSVC_PROPERTY_RELATIONSHIP | CTSVC_VIEW_DATA_TYPE_STR) +4, + + // contact_image + CTSVC_PROPERTY_IMAGE_ID = (CTSVC_PROPERTY_IMAGE | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_IMAGE_CONTACT_ID = (CTSVC_PROPERTY_IMAGE | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_IMAGE_TYPE = (CTSVC_PROPERTY_IMAGE | CTSVC_VIEW_DATA_TYPE_INT) +2, + CTSVC_PROPERTY_IMAGE_LABEL = (CTSVC_PROPERTY_IMAGE | CTSVC_VIEW_DATA_TYPE_STR) +3, + CTSVC_PROPERTY_IMAGE_PATH = (CTSVC_PROPERTY_IMAGE | CTSVC_VIEW_DATA_TYPE_STR) +4, + CTSVC_PROPERTY_IMAGE_IS_DEFAULT = (CTSVC_PROPERTY_IMAGE | CTSVC_VIEW_DATA_TYPE_BOOL) + 5, + + // contact_company + CTSVC_PROPERTY_COMPANY_ID = (CTSVC_PROPERTY_COMPANY | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_COMPANY_CONTACT_ID = (CTSVC_PROPERTY_COMPANY | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_COMPANY_TYPE = (CTSVC_PROPERTY_COMPANY | CTSVC_VIEW_DATA_TYPE_INT) +2, + CTSVC_PROPERTY_COMPANY_LABEL = (CTSVC_PROPERTY_COMPANY | CTSVC_VIEW_DATA_TYPE_STR) +3, + CTSVC_PROPERTY_COMPANY_NAME = (CTSVC_PROPERTY_COMPANY | CTSVC_VIEW_DATA_TYPE_STR) +4, + CTSVC_PROPERTY_COMPANY_DEPARTMENT = (CTSVC_PROPERTY_COMPANY | CTSVC_VIEW_DATA_TYPE_STR) +5, + CTSVC_PROPERTY_COMPANY_JOB_TITLE = (CTSVC_PROPERTY_COMPANY | CTSVC_VIEW_DATA_TYPE_STR) +6, + CTSVC_PROPERTY_COMPANY_ASSISTANT_NAME = (CTSVC_PROPERTY_COMPANY | CTSVC_VIEW_DATA_TYPE_STR) +7, + CTSVC_PROPERTY_COMPANY_ROLE = (CTSVC_PROPERTY_COMPANY | CTSVC_VIEW_DATA_TYPE_STR) +8, + CTSVC_PROPERTY_COMPANY_LOGO = (CTSVC_PROPERTY_COMPANY | CTSVC_VIEW_DATA_TYPE_STR) +9, + CTSVC_PROPERTY_COMPANY_LOCATION = (CTSVC_PROPERTY_COMPANY | CTSVC_VIEW_DATA_TYPE_STR) +10, + CTSVC_PROPERTY_COMPANY_DESCRIPTION = (CTSVC_PROPERTY_COMPANY | CTSVC_VIEW_DATA_TYPE_STR) +11, + CTSVC_PROPERTY_COMPANY_PHONETIC_NAME = (CTSVC_PROPERTY_COMPANY | CTSVC_VIEW_DATA_TYPE_STR) +12, + + // contact_nickname + CTSVC_PROPERTY_NICKNAME_ID = (CTSVC_PROPERTY_NICKNAME | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_NICKNAME_CONTACT_ID = (CTSVC_PROPERTY_NICKNAME | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_NICKNAME_NAME = (CTSVC_PROPERTY_NICKNAME | CTSVC_VIEW_DATA_TYPE_STR) +2, + + // contact_messenger + CTSVC_PROPERTY_MESSENGER_ID = (CTSVC_PROPERTY_MESSENGER | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_MESSENGER_CONTACT_ID = (CTSVC_PROPERTY_MESSENGER | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_MESSENGER_TYPE = (CTSVC_PROPERTY_MESSENGER | CTSVC_VIEW_DATA_TYPE_INT) +2, + CTSVC_PROPERTY_MESSENGER_LABEL = (CTSVC_PROPERTY_MESSENGER | CTSVC_VIEW_DATA_TYPE_STR) +3, + CTSVC_PROPERTY_MESSENGER_IM_ID = (CTSVC_PROPERTY_MESSENGER | CTSVC_VIEW_DATA_TYPE_STR) +4, + + // contact_note + CTSVC_PROPERTY_NOTE_ID = (CTSVC_PROPERTY_NOTE | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_NOTE_CONTACT_ID = (CTSVC_PROPERTY_NOTE | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_NOTE_NOTE = (CTSVC_PROPERTY_NOTE | CTSVC_VIEW_DATA_TYPE_STR) +2, + + // contact_extend + CTSVC_PROPERTY_EXTENSION_ID = (CTSVC_PROPERTY_EXTENSION | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_EXTENSION_CONTACT_ID = (CTSVC_PROPERTY_EXTENSION | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_EXTENSION_DATA1 = (CTSVC_PROPERTY_EXTENSION | CTSVC_VIEW_DATA_TYPE_INT) +2, + CTSVC_PROPERTY_EXTENSION_DATA2 = (CTSVC_PROPERTY_EXTENSION | CTSVC_VIEW_DATA_TYPE_STR) +3, + CTSVC_PROPERTY_EXTENSION_DATA3 = (CTSVC_PROPERTY_EXTENSION | CTSVC_VIEW_DATA_TYPE_STR) +4, + CTSVC_PROPERTY_EXTENSION_DATA4 = (CTSVC_PROPERTY_EXTENSION | CTSVC_VIEW_DATA_TYPE_STR) +5, + CTSVC_PROPERTY_EXTENSION_DATA5 = (CTSVC_PROPERTY_EXTENSION | CTSVC_VIEW_DATA_TYPE_STR) +6, + CTSVC_PROPERTY_EXTENSION_DATA6 = (CTSVC_PROPERTY_EXTENSION | CTSVC_VIEW_DATA_TYPE_STR) +7, + CTSVC_PROPERTY_EXTENSION_DATA7 = (CTSVC_PROPERTY_EXTENSION | CTSVC_VIEW_DATA_TYPE_STR) +8, + CTSVC_PROPERTY_EXTENSION_DATA8 = (CTSVC_PROPERTY_EXTENSION | CTSVC_VIEW_DATA_TYPE_STR) +9, + CTSVC_PROPERTY_EXTENSION_DATA9 = (CTSVC_PROPERTY_EXTENSION | CTSVC_VIEW_DATA_TYPE_STR) +10, + CTSVC_PROPERTY_EXTENSION_DATA10 = (CTSVC_PROPERTY_EXTENSION | CTSVC_VIEW_DATA_TYPE_STR) +11, + CTSVC_PROPERTY_EXTENSION_DATA11 = (CTSVC_PROPERTY_EXTENSION | CTSVC_VIEW_DATA_TYPE_STR) +12, + CTSVC_PROPERTY_EXTENSION_DATA12 = (CTSVC_PROPERTY_EXTENSION | CTSVC_VIEW_DATA_TYPE_STR) +13, + + // contact_profile + CTSVC_PROPERTY_PROFILE_ID = (CTSVC_PROPERTY_PROFILE | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_PROFILE_CONTACT_ID = (CTSVC_PROPERTY_PROFILE | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_PROFILE_TYPE = (CTSVC_PROPERTY_PROFILE | CTSVC_VIEW_DATA_TYPE_INT) +2, + CTSVC_PROPERTY_PROFILE_LABEL = (CTSVC_PROPERTY_PROFILE | CTSVC_VIEW_DATA_TYPE_STR) +3, + CTSVC_PROPERTY_PROFILE_UID = (CTSVC_PROPERTY_PROFILE | CTSVC_VIEW_DATA_TYPE_STR) +4, + CTSVC_PROPERTY_PROFILE_TEXT = (CTSVC_PROPERTY_PROFILE | CTSVC_VIEW_DATA_TYPE_STR) +5, + CTSVC_PROPERTY_PROFILE_ORDER = (CTSVC_PROPERTY_PROFILE | CTSVC_VIEW_DATA_TYPE_INT) +6, + CTSVC_PROPERTY_PROFILE_APPSVC_OPERATION = (CTSVC_PROPERTY_PROFILE | CTSVC_VIEW_DATA_TYPE_STR) +7, + CTSVC_PROPERTY_PROFILE_DATA1 = (CTSVC_PROPERTY_PROFILE | CTSVC_VIEW_DATA_TYPE_STR) +8, + CTSVC_PROPERTY_PROFILE_DATA2 = (CTSVC_PROPERTY_PROFILE | CTSVC_VIEW_DATA_TYPE_STR) +9, + CTSVC_PROPERTY_PROFILE_DATA3 = (CTSVC_PROPERTY_PROFILE | CTSVC_VIEW_DATA_TYPE_STR) +10, + CTSVC_PROPERTY_PROFILE_DATA4 = (CTSVC_PROPERTY_PROFILE | CTSVC_VIEW_DATA_TYPE_STR) +11, + + // activity + CTSVC_PROPERTY_ACTIVITY_ID = (CTSVC_PROPERTY_ACTIVITY | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_ACTIVITY_CONTACT_ID = (CTSVC_PROPERTY_ACTIVITY | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_ACTIVITY_SOURCE_NAME = (CTSVC_PROPERTY_ACTIVITY | CTSVC_VIEW_DATA_TYPE_STR) +2, + CTSVC_PROPERTY_ACTIVITY_STATUS = (CTSVC_PROPERTY_ACTIVITY | CTSVC_VIEW_DATA_TYPE_STR) +3, + CTSVC_PROPERTY_ACTIVITY_TIMESTAMP = (CTSVC_PROPERTY_ACTIVITY | CTSVC_VIEW_DATA_TYPE_INT) +4, + CTSVC_PROPERTY_ACTIVITY_SYNC_DATA1 = (CTSVC_PROPERTY_ACTIVITY | CTSVC_VIEW_DATA_TYPE_STR) +5, + CTSVC_PROPERTY_ACTIVITY_SYNC_DATA2 = (CTSVC_PROPERTY_ACTIVITY | CTSVC_VIEW_DATA_TYPE_STR) +6, + CTSVC_PROPERTY_ACTIVITY_SYNC_DATA3 = (CTSVC_PROPERTY_ACTIVITY | CTSVC_VIEW_DATA_TYPE_STR) +7, + CTSVC_PROPERTY_ACTIVITY_SYNC_DATA4 = (CTSVC_PROPERTY_ACTIVITY | CTSVC_VIEW_DATA_TYPE_STR) +8, + CTSVC_PROPERTY_ACTIVITY_ACTIVITY_PHOTO = (CTSVC_PROPERTY_ACTIVITY | CTSVC_VIEW_DATA_TYPE_REC) +9, + + // activity photo + CTSVC_PROPERTY_ACTIVITY_PHOTO_ID = (CTSVC_PROPERTY_ACTIVITY_PHOTO | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_ACTIVITY_PHOTO_ACTIVITY_ID = (CTSVC_PROPERTY_ACTIVITY_PHOTO | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_ACTIVITY_PHOTO_URL = (CTSVC_PROPERTY_ACTIVITY_PHOTO | CTSVC_VIEW_DATA_TYPE_STR) +2, + CTSVC_PROPERTY_ACTIVITY_PHOTO_SORT_INDEX = (CTSVC_PROPERTY_ACTIVITY_PHOTO | CTSVC_VIEW_DATA_TYPE_INT) +3, + + // data + CTSVC_PROPERTY_DATA_ID = (CTSVC_PROPERTY_DATA | CTSVC_VIEW_DATA_TYPE_INT), + CTSVC_PROPERTY_DATA_CONTACT_ID = (CTSVC_PROPERTY_DATA | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_DATA_TYPE = (CTSVC_PROPERTY_DATA | CTSVC_VIEW_DATA_TYPE_INT) +2, + CTSVC_PROPERTY_DATA_IS_PRIMARY_DEFAULT = (CTSVC_PROPERTY_DATA | CTSVC_VIEW_DATA_TYPE_BOOL) +3, + CTSVC_PROPERTY_DATA_IS_DEFAULT = (CTSVC_PROPERTY_DATA | CTSVC_VIEW_DATA_TYPE_BOOL) +4, + CTSVC_PROPERTY_DATA_DATA1 = (CTSVC_PROPERTY_DATA | CTSVC_VIEW_DATA_TYPE_INT) +5, + CTSVC_PROPERTY_DATA_DATA2 = (CTSVC_PROPERTY_DATA | CTSVC_VIEW_DATA_TYPE_STR) +6, + CTSVC_PROPERTY_DATA_DATA3 = (CTSVC_PROPERTY_DATA | CTSVC_VIEW_DATA_TYPE_STR) +7, + CTSVC_PROPERTY_DATA_DATA4 = (CTSVC_PROPERTY_DATA | CTSVC_VIEW_DATA_TYPE_STR) +8, + CTSVC_PROPERTY_DATA_DATA5 = (CTSVC_PROPERTY_DATA | CTSVC_VIEW_DATA_TYPE_STR) +9, + CTSVC_PROPERTY_DATA_DATA6 = (CTSVC_PROPERTY_DATA | CTSVC_VIEW_DATA_TYPE_STR) +10, + CTSVC_PROPERTY_DATA_DATA7 = (CTSVC_PROPERTY_DATA | CTSVC_VIEW_DATA_TYPE_STR) +11, + CTSVC_PROPERTY_DATA_DATA8 = (CTSVC_PROPERTY_DATA | CTSVC_VIEW_DATA_TYPE_STR) +12, + CTSVC_PROPERTY_DATA_DATA9 = (CTSVC_PROPERTY_DATA | CTSVC_VIEW_DATA_TYPE_STR) +13, + CTSVC_PROPERTY_DATA_DATA10 = (CTSVC_PROPERTY_DATA | CTSVC_VIEW_DATA_TYPE_STR) +14, + + // speeddial + CTSVC_PROPERTY_SPEEDDIAL_DIAL_NUMBER = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_INT), + CTSVC_PROPERTY_SPEEDDIAL_NUMBER_ID = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_SPEEDDIAL_NUMBER = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +2, + CTSVC_PROPERTY_SPEEDDIAL_NUMBER_LABEL = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +3, + CTSVC_PROPERTY_SPEEDDIAL_NUMBER_TYPE = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +4, + CTSVC_PROPERTY_SPEEDDIAL_PERSON_ID = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +5, + CTSVC_PROPERTY_SPEEDDIAL_DISPLAY_NAME = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +6, + CTSVC_PROPERTY_SPEEDDIAL_IMAGE_THUMBNAIL = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +7, + + // phonelog + CTSVC_PROPERTY_PHONELOG_ID = (CTSVC_PROPERTY_PHONELOG | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_PHONELOG_PERSON_ID = (CTSVC_PROPERTY_PHONELOG | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_PHONELOG_ADDRESS = (CTSVC_PROPERTY_PHONELOG | CTSVC_VIEW_DATA_TYPE_STR) +2, + CTSVC_PROPERTY_PHONELOG_LOG_TIME = (CTSVC_PROPERTY_PHONELOG | CTSVC_VIEW_DATA_TYPE_INT) +3, + CTSVC_PROPERTY_PHONELOG_LOG_TYPE = (CTSVC_PROPERTY_PHONELOG | CTSVC_VIEW_DATA_TYPE_INT) +4, + CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1 = (CTSVC_PROPERTY_PHONELOG | CTSVC_VIEW_DATA_TYPE_INT) +5, // duration, message_id, email_id + CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2 = (CTSVC_PROPERTY_PHONELOG | CTSVC_VIEW_DATA_TYPE_STR) +6, // short message, subject + + // contact_updated_info : read only + CTSVC_PROPERTY_UPDATE_INFO_ID = (CTSVC_PROPERTY_UPDATE_INFO | CTSVC_VIEW_DATA_TYPE_INT), + CTSVC_PROPERTY_UPDATE_INFO_ADDRESSBOOK_ID = (CTSVC_PROPERTY_UPDATE_INFO | CTSVC_VIEW_DATA_TYPE_INT) +1, + CTSVC_PROPERTY_UPDATE_INFO_TYPE = (CTSVC_PROPERTY_UPDATE_INFO | CTSVC_VIEW_DATA_TYPE_INT) +2, + CTSVC_PROPERTY_UPDATE_INFO_VERSION = (CTSVC_PROPERTY_UPDATE_INFO | CTSVC_VIEW_DATA_TYPE_INT) +3, + + // contact_sdn + CTSVC_PROPERTY_SDN_ID = (CTSVC_PROPERTY_SDN | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY), + CTSVC_PROPERTY_SDN_NAME = (CTSVC_PROPERTY_SDN | CTSVC_VIEW_DATA_TYPE_STR) +1, + CTSVC_PROPERTY_SDN_NUMBER = (CTSVC_PROPERTY_SDN | CTSVC_VIEW_DATA_TYPE_STR) +2, + + // phonelog_stat + CTSVC_PROPERTY_PHONELOG_STAT_LOG_COUNT = (CTSVC_PROPERTY_PHONELOG_STAT | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY ), + CTSVC_PROPERTY_PHONELOG_STAT_LOG_TYPE = (CTSVC_PROPERTY_PHONELOG_STAT | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY ) +1, + +}cts_property_ids_e; + + + +void ctsvc_view_uri_init(); +void ctsvc_view_uri_deinit(); + +const char* ctsvc_view_get_uri( const char* view_uri ); +ctsvc_record_type_e ctsvc_view_get_record_type(const char* view_uri); +const property_info_s* ctsvc_view_get_all_property_infos(const char *view_uri, unsigned int *count); + +#endif /* __TIZEN_SOCIAL_CTSVC_VIEW_H__ */ diff --git a/common/ipc/ctsvc_ipc_activity.c b/common/ipc/ctsvc_ipc_activity.c new file mode 100644 index 0000000..7f9a708 --- /dev/null +++ b/common/ipc/ctsvc_ipc_activity.c @@ -0,0 +1,79 @@ +#include "ctsvc_ipc_macros.h" + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_activity(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_activity(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_activity_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_activity_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_activity, + .marshal_record = __ctsvc_ipc_marshal_activity, + .get_primary_id = __ctsvc_ipc_marshal_activity_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_activity(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_activity_s* activity_p = (ctsvc_activity_s*) record; + + do + { + if (ctsvc_ipc_unmarshal_int(ipc_data, &activity_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &activity_p->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &activity_p->source_name) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &activity_p->status) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &activity_p->timestamp) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &activity_p->sync_data1) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &activity_p->sync_data2) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &activity_p->sync_data3) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &activity_p->sync_data4) != CONTACTS_ERROR_NONE) break; + + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&activity_p->photos) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_activity(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_activity_s* activity_p = (ctsvc_activity_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(activity_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_int((activity_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((activity_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((activity_p->source_name),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((activity_p->status),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((activity_p->timestamp),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((activity_p->sync_data1),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((activity_p->sync_data2),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((activity_p->sync_data3),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((activity_p->sync_data4),ipc_data) != CONTACTS_ERROR_NONE) break; + + if (ctsvc_ipc_marshal_list( (contacts_list_h)activity_p->photos, ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + + return CONTACTS_ERROR_INVALID_PARAMETER; + +} + +static int __ctsvc_ipc_marshal_activity_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_ACTIVITY_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_activity_photo.c b/common/ipc/ctsvc_ipc_activity_photo.c new file mode 100644 index 0000000..cec4264 --- /dev/null +++ b/common/ipc/ctsvc_ipc_activity_photo.c @@ -0,0 +1,65 @@ +#include "ctsvc_ipc_macros.h" + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_activity_photo(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_activity_photo(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_activity_photo_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_activity_photo_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_activity_photo, + .marshal_record = __ctsvc_ipc_marshal_activity_photo, + .get_primary_id = __ctsvc_ipc_marshal_activity_photo_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_activity_photo(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_activity_photo_s* photo_p = (ctsvc_activity_photo_s*) record; + + do + { + if (ctsvc_ipc_unmarshal_int(ipc_data, &photo_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &photo_p->activity_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &photo_p->photo_url) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &photo_p->sort_index) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_activity_photo(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_activity_photo_s* photo_p = (ctsvc_activity_photo_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(photo_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_int((photo_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((photo_p->activity_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((photo_p->photo_url),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((photo_p->sort_index),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + + return CONTACTS_ERROR_INVALID_PARAMETER; + +} + +static int __ctsvc_ipc_marshal_activity_photo_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_ACTIVITY_PHOTO_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_address.c b/common/ipc/ctsvc_ipc_address.c new file mode 100644 index 0000000..4acdd9a --- /dev/null +++ b/common/ipc/ctsvc_ipc_address.c @@ -0,0 +1,80 @@ +#include "ctsvc_ipc_macros.h" + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_address(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_address(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_address_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_address_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_address, + .marshal_record = __ctsvc_ipc_marshal_address, + .get_primary_id = __ctsvc_ipc_marshal_address_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_address(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_address_s* address_p = (ctsvc_address_s*) record; + + do { + if (ctsvc_ipc_unmarshal_bool(ipc_data, &address_p->is_default) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &address_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &address_p->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &address_p->type) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &address_p->label) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &address_p->pobox) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &address_p->postalcode) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &address_p->region) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &address_p->locality) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &address_p->street) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &address_p->extended) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &address_p->country) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_address(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_address_s* address_p = (ctsvc_address_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(address_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_bool((address_p->is_default),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((address_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((address_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((address_p->type),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((address_p->label),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((address_p->pobox),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((address_p->postalcode),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((address_p->region),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((address_p->locality),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((address_p->street),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((address_p->extended),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((address_p->country),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_address_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_ADDRESS_ID; + return contacts_record_get_int(record, *property_id, id ); +} + diff --git a/common/ipc/ctsvc_ipc_addressbook.c b/common/ipc/ctsvc_ipc_addressbook.c new file mode 100644 index 0000000..30bbab2 --- /dev/null +++ b/common/ipc/ctsvc_ipc_addressbook.c @@ -0,0 +1,63 @@ +#include "ctsvc_ipc_macros.h" + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_addressbook(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_addressbook(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_addressbook_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_addressbook_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_addressbook, + .marshal_record = __ctsvc_ipc_marshal_addressbook, + .get_primary_id = __ctsvc_ipc_marshal_addressbook_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_addressbook(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_addressbook_s* addressbook_p = (ctsvc_addressbook_s*) record; + + do { + if (ctsvc_ipc_unmarshal_int(ipc_data, &addressbook_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &addressbook_p->name) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &addressbook_p->account_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &addressbook_p->mode) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_addressbook(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_addressbook_s* addressbook_p = (ctsvc_addressbook_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(addressbook_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_int((addressbook_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((addressbook_p->name),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((addressbook_p->account_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((addressbook_p->mode),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_addressbook_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_ADDRESSBOOK_ID; + return contacts_record_get_int(record, *property_id, id ); +} + diff --git a/common/ipc/ctsvc_ipc_company.c b/common/ipc/ctsvc_ipc_company.c new file mode 100644 index 0000000..622068b --- /dev/null +++ b/common/ipc/ctsvc_ipc_company.c @@ -0,0 +1,85 @@ +#include "ctsvc_ipc_macros.h" + + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_company(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_company(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_company_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_company_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_company, + .marshal_record = __ctsvc_ipc_marshal_company, + .get_primary_id = __ctsvc_ipc_marshal_company_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_company(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_company_s* company_p = (ctsvc_company_s*) record; + + do { + if (ctsvc_ipc_unmarshal_bool(ipc_data, &company_p->logo_changed) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &company_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &company_p->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &company_p->is_default) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &company_p->type) != CONTACTS_ERROR_NONE) break; + + if (ctsvc_ipc_unmarshal_string(ipc_data, &company_p->label) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &company_p->name) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &company_p->department) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &company_p->job_title) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &company_p->role) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &company_p->assistant_name) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &company_p->logo) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &company_p->location) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &company_p->description) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &company_p->phonetic_name) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_company(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_company_s* company_p = (ctsvc_company_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(company_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_bool((company_p->logo_changed),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((company_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((company_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((company_p->is_default),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((company_p->type),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((company_p->label),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((company_p->name),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((company_p->department),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((company_p->job_title),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((company_p->role),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((company_p->assistant_name),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((company_p->logo),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((company_p->location),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((company_p->description),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((company_p->phonetic_name),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_company_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_COMPANY_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_contact.c b/common/ipc/ctsvc_ipc_contact.c new file mode 100644 index 0000000..1b1b71b --- /dev/null +++ b/common/ipc/ctsvc_ipc_contact.c @@ -0,0 +1,140 @@ +#include "ctsvc_ipc_macros.h" + + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" + +static int __ctsvc_ipc_unmarshal_contact(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_contact(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_contact_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_contact_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_contact, + .marshal_record = __ctsvc_ipc_marshal_contact, + .get_primary_id = __ctsvc_ipc_marshal_contact_get_primary_id +}; + + + +static int __ctsvc_ipc_unmarshal_contact(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_contact_s* pcontact = (ctsvc_contact_s*) record; + + do { + if (ctsvc_ipc_unmarshal_bool(ipc_data, &pcontact->display_name_changed) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &pcontact->uid_changed) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &pcontact->image_thumbnail_changed) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &pcontact->ringtone_changed) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &pcontact->vibration_changed) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &pcontact->is_restricted) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &pcontact->is_favorite) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &pcontact->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &pcontact->person_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &pcontact->changed_time) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &pcontact->addressbook_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &pcontact->has_phonenumber) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &pcontact->has_email) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->display_name) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->reverse_display_name) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &pcontact->display_source_type) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &pcontact->display_name_language) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->sortkey) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->reverse_sortkey) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->uid) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->image_thumbnail_path) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->ringtone_path) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->vibration) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->sync_data1) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->sync_data2) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->sync_data3) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->sync_data4) != CONTACTS_ERROR_NONE) break; + + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pcontact->name) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pcontact->note) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pcontact->company) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pcontact->numbers) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pcontact->emails) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pcontact->grouprelations) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pcontact->events) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pcontact->messengers) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pcontact->postal_addrs) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pcontact->urls) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pcontact->nicknames) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pcontact->profiles) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pcontact->relationships) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pcontact->images) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pcontact->extensions) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_contact(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_contact_s* pcontact = (ctsvc_contact_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(pcontact==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_bool((pcontact->display_name_changed),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((pcontact->uid_changed),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((pcontact->image_thumbnail_changed),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((pcontact->ringtone_changed),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((pcontact->vibration_changed),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((pcontact->is_restricted),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((pcontact->is_favorite),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((pcontact->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((pcontact->person_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((pcontact->changed_time),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((pcontact->addressbook_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((pcontact->has_phonenumber),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((pcontact->has_email),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->display_name),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->reverse_display_name),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((pcontact->display_source_type),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((pcontact->display_name_language),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->sortkey),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->reverse_sortkey),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->uid),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->image_thumbnail_path),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->ringtone_path),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->vibration),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->sync_data1),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->sync_data2),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->sync_data3),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->sync_data4),ipc_data) != CONTACTS_ERROR_NONE) break; + + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->name, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->note, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->company, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->numbers, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->emails, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->grouprelations, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->events, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->messengers, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->postal_addrs, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->urls, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->nicknames, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->profiles, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->relationships, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->images, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->extensions, ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_contact_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_CONTACT_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_define.h b/common/ipc/ctsvc_ipc_define.h new file mode 100644 index 0000000..84b0d54 --- /dev/null +++ b/common/ipc/ctsvc_ipc_define.h @@ -0,0 +1,81 @@ +/* + * Calendar Service + * + * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_IPC_DEFINE_H__ +#define __CTSVC_IPC_DEFINE_H__ + +#define CTSVC_IPC_SERVICE "contacts_svc_ipc" +#define CTSVC_IPC_SOCKET_PATH "/opt/usr/data/contacts-svc/."CTSVC_IPC_SERVICE + +#define CTSVC_IPC_SOCKET_PATH_FOR_CHANGE_SUBSCRIPTION "/opt/usr/data/contacts-svc/."CTSVC_IPC_SERVICE"_for_subscribe" +#define CTSVC_IPC_SUBSCRIBE_MODULE "ctsvc_ipc_subscribe_module" + +#define CTSVC_IPC_MODULE "ctsvc_ipc_module" +#define CTSVC_IPC_DB_MODULE "ctsvc_ipc_db_module" +#define CTSVC_IPC_ACTIVITY_MODULE "ctsvc_ipc_activity_module" +#define CTSVC_IPC_GROUP_MODULE "ctsvc_ipc_group_module" +#define CTSVC_IPC_PERSON_MODULE "ctsvc_ipc_person_module" +#define CTSVC_IPC_PHONELOG_MODULE "ctsvc_ipc_phonelog_module" +#define CTSVC_IPC_SIM_MODULE "ctsvc_ipc_sim_module" + + +#define CTSVC_IPC_SERVER_CONNECT "connect" +#define CTSVC_IPC_SERVER_DISCONNECT "disconnect" + +#define CTSVC_IPC_SERVER_DB_INSERT_RECORD "insert_record" +#define CTSVC_IPC_SERVER_DB_GET_RECORD "get_record" +#define CTSVC_IPC_SERVER_DB_UPDATE_RECORD "update_record" +#define CTSVC_IPC_SERVER_DB_DELETE_RECORD "delete_record" +#define CTSVC_IPC_SERVER_DB_REPLACE_RECORD "replace_record" +#define CTSVC_IPC_SERVER_DB_GET_ALL_RECORDS "get_all_records" +#define CTSVC_IPC_SERVER_DB_GET_RECORDS_WITH_QUERY "get_records_with_query" +#define CTSVC_IPC_SERVER_DB_GET_COUNT "get_count" +#define CTSVC_IPC_SERVER_DB_GET_COUNT_WITH_QUERY "get_count_with_query" +#define CTSVC_IPC_SERVER_DB_INSERT_RECORDS "insert_records" +#define CTSVC_IPC_SERVER_DB_UPDATE_RECORDS "update_records" +#define CTSVC_IPC_SERVER_DB_DELETE_RECORDS "delete_records" +#define CTSVC_IPC_SERVER_DB_REPLACE_RECORDS "replace_records" +#define CTSVC_IPC_SERVER_DB_CHANGES_BY_VERSION "changes_by_version" +#define CTSVC_IPC_SERVER_DB_GET_CURRENT_VERSION "get_current_version" +#define CTSVC_IPC_SERVER_DB_SEARCH_RECORDS "search_records" +#define CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_QUERY "search_records_with_query" + +#define CTSVC_IPC_SERVER_ACTIVITY_DELETE_BY_CONTACT_ID "activity_delete_by_contact_id" +#define CTSVC_IPC_SERVER_ACTIVITY_DELETE_BY_ACCOUNT_ID "activity_delete_by_account_id" + +#define CTSVC_IPC_SERVER_GROUP_ADD_CONTACT "group_add_contact" +#define CTSVC_IPC_SERVER_GROUP_REMOVE_CONTACT "group_remove_contact" + +#define CTSVC_IPC_SERVER_PERSON_LINK_PERSON "person_link_person" +#define CTSVC_IPC_SERVER_PERSON_UNLINK_CONTACT "person_unlink_contact" +#define CTSVC_IPC_SERVER_PERSON_RESET_USAGE "person_reset_usgae" +#define CTSVC_IPC_SERVER_PERSON_SET_FAVORITE_ORDER "person_set_favorite_order" +#define CTSVC_IPC_SERVER_PERSON_SET_DEFAULT_PROPERTY "person_set_default_property" +#define CTSVC_IPC_SERVER_PERSON_GET_DEFAULT_PROPERTY "person_get_default_property" + +#define CTSVC_IPC_SERVER_PHONELOG_RESET_STATISTICS "phonelog_reset_statistics" +#define CTSVC_IPC_SERVER_PHONELOG_DELETE "phonelog_delete" + +#define CTSVC_IPC_SERVER_SIM_IMPORT_ALL_CONTACTS "sim_import_all_contacts" +#define CTSVC_IPC_SERVER_SIM_EXPORT_PERSON "sim_export_person" +#define CTSVC_IPC_SERVER_SIM_INSERT_CONTACT "sim_insert_contact" +#define CTSVC_IPC_SERVER_SIM_UPDATE_CONTACT "sim_update_contact" +#define CTSVC_IPC_SERVER_SIM_DELETE_CONTACT "sim_delete_contact" + +#endif /*__CTSVC_IPC_DEFINE_H__ */ diff --git a/common/ipc/ctsvc_ipc_email.c b/common/ipc/ctsvc_ipc_email.c new file mode 100644 index 0000000..d6a3517 --- /dev/null +++ b/common/ipc/ctsvc_ipc_email.c @@ -0,0 +1,68 @@ +#include "ctsvc_ipc_macros.h" + + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_email(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_email(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_email_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_email_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_email, + .marshal_record = __ctsvc_ipc_marshal_email, + .get_primary_id = __ctsvc_ipc_marshal_email_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_email(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_email_s* email_p = (ctsvc_email_s*) record; + + do { + if (ctsvc_ipc_unmarshal_bool(ipc_data, &email_p->is_default) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &email_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &email_p->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &email_p->type) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &email_p->label) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &email_p->email_addr) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_email(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_email_s* email_p = (ctsvc_email_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(email_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_bool((email_p->is_default),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((email_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((email_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((email_p->type),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((email_p->label),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((email_p->email_addr),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_email_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_EMAIL_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_event.c b/common/ipc/ctsvc_ipc_event.c new file mode 100644 index 0000000..acf76fc --- /dev/null +++ b/common/ipc/ctsvc_ipc_event.c @@ -0,0 +1,64 @@ +#include "ctsvc_ipc_macros.h" + + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_event(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_event(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_event_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_event_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_event, + .marshal_record = __ctsvc_ipc_marshal_event, + .get_primary_id = __ctsvc_ipc_marshal_event_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_event(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_event_s* event_p = (ctsvc_event_s*) record; + + do { + if (ctsvc_ipc_unmarshal_int(ipc_data, &event_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &event_p->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &event_p->type) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &event_p->label) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &event_p->date) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_event(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_event_s* event_p = (ctsvc_event_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(event_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_int((event_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((event_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((event_p->type),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((event_p->label),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((event_p->date),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_event_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_EVENT_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_extension.c b/common/ipc/ctsvc_ipc_extension.c new file mode 100644 index 0000000..c69c163 --- /dev/null +++ b/common/ipc/ctsvc_ipc_extension.c @@ -0,0 +1,86 @@ +#include "ctsvc_ipc_macros.h" + + + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_extension(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_extension(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_extension_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_extension_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_extension, + .marshal_record = __ctsvc_ipc_marshal_extension, + .get_primary_id = __ctsvc_ipc_marshal_extension_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_extension(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_extension_s* extend_p = (ctsvc_extension_s*) record; + + do { + if (ctsvc_ipc_unmarshal_int(ipc_data, &extend_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &extend_p->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &extend_p->data1) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &extend_p->data2) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &extend_p->data3) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &extend_p->data4) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &extend_p->data5) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &extend_p->data6) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &extend_p->data7) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &extend_p->data8) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &extend_p->data9) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &extend_p->data10) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &extend_p->data11) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &extend_p->data12) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_extension(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_extension_s* extend_p = (ctsvc_extension_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(extend_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_int((extend_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((extend_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((extend_p->data1),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((extend_p->data2),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((extend_p->data3),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((extend_p->data4),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((extend_p->data5),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((extend_p->data6),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((extend_p->data7),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((extend_p->data8),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((extend_p->data9),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((extend_p->data10),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((extend_p->data11),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((extend_p->data12),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_extension_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_EXTENSION_ID; + return contacts_record_get_int(record, *property_id, id ); +} + diff --git a/common/ipc/ctsvc_ipc_group.c b/common/ipc/ctsvc_ipc_group.c new file mode 100644 index 0000000..35efe16 --- /dev/null +++ b/common/ipc/ctsvc_ipc_group.c @@ -0,0 +1,72 @@ +#include "ctsvc_ipc_macros.h" + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_group(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_group(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_group_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_group_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_group, + .marshal_record = __ctsvc_ipc_marshal_group, + .get_primary_id = __ctsvc_ipc_marshal_group_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_group(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_group_s* group_p = (ctsvc_group_s*) record; + + do { + if (ctsvc_ipc_unmarshal_int(ipc_data, &group_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &group_p->addressbook_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &group_p->is_read_only) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &group_p->name) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &group_p->system_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &group_p->ringtone_path) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &group_p->vibration) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &group_p->image_thumbnail_path) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &group_p->image_thumbnail_changed) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_group(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_group_s* group_p = (ctsvc_group_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(group_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_int((group_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((group_p->addressbook_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((group_p->is_read_only),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((group_p->name),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((group_p->system_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((group_p->ringtone_path),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((group_p->vibration),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((group_p->image_thumbnail_path),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((group_p->image_thumbnail_changed),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_group_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_GROUP_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_grouprelation.c b/common/ipc/ctsvc_ipc_grouprelation.c new file mode 100644 index 0000000..a7ac312 --- /dev/null +++ b/common/ipc/ctsvc_ipc_grouprelation.c @@ -0,0 +1,64 @@ +#include "ctsvc_ipc_macros.h" + + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_group_relation(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_group_relation(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_group_relation_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_group_relation_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_group_relation, + .marshal_record = __ctsvc_ipc_marshal_group_relation, + .get_primary_id = __ctsvc_ipc_marshal_group_relation_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_group_relation(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_group_relation_s* group_relation_p = (ctsvc_group_relation_s*) record; + + do { + if (ctsvc_ipc_unmarshal_int(ipc_data, &group_relation_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &group_relation_p->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &group_relation_p->group_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &group_relation_p->group_name) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_group_relation(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_group_relation_s* group_relation_p = (ctsvc_group_relation_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(group_relation_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_int((group_relation_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((group_relation_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((group_relation_p->group_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((group_relation_p->group_name),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_group_relation_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_GROUP_RELATION_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_image.c b/common/ipc/ctsvc_ipc_image.c new file mode 100644 index 0000000..96b605e --- /dev/null +++ b/common/ipc/ctsvc_ipc_image.c @@ -0,0 +1,68 @@ +#include "ctsvc_ipc_macros.h" + + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_image(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_image(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_image_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_image_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_image, + .marshal_record = __ctsvc_ipc_marshal_image, + .get_primary_id = __ctsvc_ipc_marshal_image_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_image(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_image_s* image_p = (ctsvc_image_s*) record; + + do { + if (ctsvc_ipc_unmarshal_bool(ipc_data, &image_p->is_changed) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &image_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &image_p->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &image_p->type) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &image_p->label) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &image_p->path) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &image_p->is_default) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_image(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_image_s* image_p = (ctsvc_image_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(image_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_bool((image_p->is_changed),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((image_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((image_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((image_p->type),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((image_p->label),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((image_p->path),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((image_p->is_default),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_image_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_IMAGE_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_macros.h b/common/ipc/ctsvc_ipc_macros.h new file mode 100644 index 0000000..8673a22 --- /dev/null +++ b/common/ipc/ctsvc_ipc_macros.h @@ -0,0 +1,173 @@ +#ifndef __CTSVC_IPC_MACROS_H__ +#define __CTSVC_IPC_MACROS_H__ + +#include +#include +#include + +#define CTSVC_IPC_PREPARE() \ + char __handle_str[1024] = {0, }; \ + snprintf(__handle_str, sizeof(__handle_str), \ + "/opt/CONTACT_SVC_IPC_HANDLE/handle_%d", \ + getpid()); + +#define CTSVC_IPC_SETUP(type) \ + pims_ipc_h __IPC_HANDLE__ = pims_ipc_create(__handle_str); \ + pims_ipc_data_h __IPC_DATA_IN_HANDLE__ = pims_ipc_data_create(type); \ + pims_ipc_data_h __IPC_DATA_OUT_HANDLE__ = NULL; + +#define CTSVC_IPC_CALL(MODULE, FUNCTION) \ + pims_ipc_call(__IPC_HANDLE__, MODULE, FUNCTION, __IPC_DATA_IN_HANDLE__, &(__IPC_DATA_OUT_HANDLE__) ); + +#define CTSVC_IPC_ASYNC_CALL(MODULE, FUNCTION, CALLBACK, USERPARAM) \ + pims_ipc_call(__IPC_HANDLE__, MODULE, FUNCTION, __IPC_DATA_IN_HANDLE__, CALLBACK, USERPARAM ); + +#define CTSVC_IPC_DATA_IN_WITH_TYPE(type, in_param) \ + pims_ipc_data_put_with_type_##type(__IPC_DATA_IN_HANDLE__, in_param); + +#define CTSVC_IPC_DATA_OUT_WITH_TYPE(type, out_param) \ + pims_ipc_data_get_with_type_##type(__IPC_DATA_OUT_HANDLE__, &out_param); + +#define CTSVC_IPC_DATA_OUT_DUP_WITH_TYPE(type, out_param) \ + pims_ipc_data_get_with_type_##type_dup(__IPC_DATA_OUT_HANDLE__, &out_param); + +#define CTSVC_IPC_CALL_INSERT(RECORD_TYPE) CTSVC_IPC_CALL("INSERT", RECORD_TYPE) +#define CTSVC_IPC_CALL_UPDATE(RECORD_TYPE) CTSVC_IPC_CALL("UPDATE", RECORD_TYPE) +#define CTSVC_IPC_CALL_DELETE(RECORD_TYPE) CTSVC_IPC_CALL("DELETE", RECORD_TYPE) +#define CTSVC_IPC_CALL_GET(RECORD_TYPE) CTSVC_IPC_CALL("GET_RECORD", RECORD_TYPE) +#define CTSVC_IPC_CALL_GET_ALL(RECORD_TYPE) CTSVC_IPC_CALL("GET_ALL_RECORDS", RECORD_TYPE) +#define CTSVC_IPC_CALL_GET_RECORDS_QUERY(RECORD_TYPE) CTSVC_IPC_CALL("GET_RECORDS_QUERY", RECORD_TYPE) +#define CTSVC_IPC_CALL_INSERT_RECORDS(RECORD_TYPE) CTSVC_IPC_CALL("INSERT_RECORDS", RECORD_TYPE) +#define CTSVC_IPC_CALL_UPDATE_RECORDS(RECORD_TYPE) CTSVC_IPC_CALL("UPDATE_RECORDS", RECORD_TYPE) +#define CTSVC_IPC_CALL_DELETE_RECORDS(RECORD_TYPE) CTSVC_IPC_CALL("DELETE_RECORDS", RECORD_TYPE) + +#define CTSVC_IPC_TEARDOWN() \ + pims_ipc_data_destroy(__IPC_DATA_OUT_HANDLE__); \ + pims_ipc_data_destroy(__IPC_DATA_IN_HANDLE__); \ + pims_ipc_destroy(__IPC_HANDLE__); + + +#define pims_ipc_data_put_with_type_char(data, buf) \ + do { char __tmp = buf; \ + pims_ipc_data_put_with_type(data, PIMS_IPC_DATA_TYPE_CHAR, (void*)&__tmp, 0); } while(0) +#define pims_ipc_data_put_with_type_bool(data, buf) \ + do { bool __tmp = buf; \ + pims_ipc_data_put_with_type(data, PIMS_IPC_DATA_TYPE_INT, (void*)&__tmp, 0); }while(0) +#define pims_ipc_data_put_with_type_int(data, buf) \ + do { int __tmp = buf; \ + pims_ipc_data_put_with_type(data, PIMS_IPC_DATA_TYPE_INT, (void*)&__tmp, 0); } while(0) +#define pims_ipc_data_put_with_type_uint(data, buf) \ + do { unsigned int __tmp = buf; \ + pims_ipc_data_put_with_type(data, PIMS_IPC_DATA_TYPE_UINT, (void*)&__tmp, 0); } while(0) +#define pims_ipc_data_put_with_type_long(data, buf) \ + do { long __tmp = buf; \ + pims_ipc_data_put_with_type(data, PIMS_IPC_DATA_TYPE_LONG, (void*)&__tmp, 0); } while(0) +#define pims_ipc_data_put_with_type_ulong(data, buf) \ + do { unsigned long __tmp = buf; \ + pims_ipc_data_put_with_type(data, PIMS_IPC_DATA_TYPE_ULONG, (void*)&__tmp, 0); } while(0) +#define pims_ipc_data_put_with_type_double(data, buf) \ + do { double __tmp = buf; \ + pims_ipc_data_put_with_type(data, PIMS_IPC_DATA_TYPE_DOUBLE, (void*)&__tmp, 0); } while(0) +#define pims_ipc_data_put_with_type_string(data, buf) \ + pims_ipc_data_put_with_type(data, PIMS_IPC_DATA_TYPE_STRING, (void*)buf, 0) +#define pims_ipc_data_put_with_type_memory(data, buf, size) \ + pims_ipc_data_put_with_type(data, PIMS_IPC_DATA_TYPE_MEMORY, (void*)buf, size) + + +#define pims_ipc_data_put_bool(data, buf) \ + do { bool __tmp = buf; \ + pims_ipc_data_put(data, (void*)&__tmp, sizeof(int)); }while(0) +#define pims_ipc_data_put_int(data, buf) \ + do { int __tmp = buf; \ + pims_ipc_data_put(data, (void*)&__tmp, sizeof(int)); } while(0) +#define pims_ipc_data_put_string(data, buf) \ + do { \ + if( buf ) \ + pims_ipc_data_put(data, (void*)buf, strlen(buf)+1); \ + else \ + pims_ipc_data_put(data, (void*)"", 0); } while(0) + +static inline void pims_ipc_data_get_with_type_int(pims_ipc_data_h data, int* result) +{ + pims_ipc_data_type_e ipc_dtype = PIMS_IPC_DATA_TYPE_INVALID; + unsigned int ipc_dsize = 0; + + *result = *((int*)pims_ipc_data_get_with_type(data, &ipc_dtype, &ipc_dsize)); +} + +static inline void pims_ipc_data_get_dup_with_type_int(pims_ipc_data_h data, int* result) +{ + pims_ipc_data_type_e ipc_dtype = PIMS_IPC_DATA_TYPE_INVALID; + unsigned int ipc_dsize = 0; + + *result = *((int*) pims_ipc_data_get_dup_with_type(data, &ipc_dtype, &ipc_dsize)); +} + +static inline void pims_ipc_data_get_with_type_bool(pims_ipc_data_h data, bool* result) +{ + pims_ipc_data_type_e ipc_dtype = PIMS_IPC_DATA_TYPE_INVALID; + unsigned int ipc_dsize = 0; + + *result = (bool)(*((int*)pims_ipc_data_get_with_type(data, &ipc_dtype, &ipc_dsize))); +} + +static inline void pims_ipc_data_get_dup_with_type_bool(pims_ipc_data_h data, bool* result) +{ + pims_ipc_data_type_e ipc_dtype = PIMS_IPC_DATA_TYPE_INVALID; + unsigned int ipc_dsize = 0; + + *result = (bool)(*((int*) pims_ipc_data_get_dup_with_type(data, &ipc_dtype, &ipc_dsize))); +} +static inline void pims_ipc_data_get_with_type_string(pims_ipc_data_h data, char** result) +{ + pims_ipc_data_type_e ipc_dtype = PIMS_IPC_DATA_TYPE_INVALID; + unsigned int ipc_dsize = 0; + + *result = (char*)pims_ipc_data_get_with_type(data, &ipc_dtype, &ipc_dsize); +} + +static inline void pims_ipc_data_get_dup_with_type_string(pims_ipc_data_h data, char** result) +{ + pims_ipc_data_type_e ipc_dtype = PIMS_IPC_DATA_TYPE_INVALID; + unsigned int ipc_dsize = 0; + + *result = (char*)pims_ipc_data_get_dup_with_type(data, &ipc_dtype, &ipc_dsize); +} + +static inline void pims_ipc_data_get_int(pims_ipc_data_h data, int* result) +{ + unsigned int ipc_dsize = 0; + *result = *((int*) pims_ipc_data_get(data, &ipc_dsize)); +} + +static inline void pims_ipc_data_get_dup_int(pims_ipc_data_h data, int* result) +{ + unsigned int ipc_dsize = 0; + *result = *((int*) pims_ipc_data_get_dup(data, &ipc_dsize)); +} + +static inline void pims_ipc_data_get_bool(pims_ipc_data_h data, bool* result) +{ + unsigned int ipc_dsize = 0; + *result = (bool)(*((int*)pims_ipc_data_get(data, &ipc_dsize))); +} + +static inline void pims_ipc_data_get_dup_bool(pims_ipc_data_h data, bool* result) +{ + unsigned int ipc_dsize = 0; + *result = (bool)(*((int*)pims_ipc_data_get_dup(data, &ipc_dsize))); +} +static inline void pims_ipc_data_get_string(pims_ipc_data_h data, char** result) +{ + unsigned int ipc_dsize = 0; + *result = (char*)pims_ipc_data_get(data, &ipc_dsize); +} + +static inline void pims_ipc_data_get_dup_string(pims_ipc_data_h data, char** result) +{ + unsigned int ipc_dsize = 0; + *result = (char*)pims_ipc_data_get_dup(data, &ipc_dsize); +} + +#endif /*__CTSVC_IPC_MACROS_H__*/ + diff --git a/common/ipc/ctsvc_ipc_marshal.c b/common/ipc/ctsvc_ipc_marshal.c new file mode 100644 index 0000000..bfbf3f1 --- /dev/null +++ b/common/ipc/ctsvc_ipc_marshal.c @@ -0,0 +1,1237 @@ +/* + * Calendar Service + * + * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include //calloc +#include +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" +#include "ctsvc_internal.h" +#include "contacts_query.h" +#include "contacts_filter.h" +#include "contacts_list.h" +#include "ctsvc_list.h" + +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_contact_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_my_profile_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_addressbook_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_group_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_person_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_phonelog_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_result_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_sdn_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_speeddial_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_updated_info_plugin_cb; + +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_simple_contact_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_address_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_activity_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_activity_photo_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_company_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_email_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_event_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_extension_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_group_relation_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_messenger_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_name_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_nickname_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_note_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_number_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_profile_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_relationship_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_url_plugin_cb; +extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_image_plugin_cb; + +static ctsvc_ipc_marshal_record_plugin_cb_s* __ctsvc_ipc_marshal_get_plugin_cb(ctsvc_record_type_e type); + + +static int __ctsvc_ipc_unmarshal_composite_filter(const pims_ipc_data_h ipc_data, ctsvc_composite_filter_s* filter); +static int __ctsvc_ipc_marshal_composite_filter(const ctsvc_composite_filter_s* filter, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_unmarshal_attribute_filter(const pims_ipc_data_h ipc_data, const ctsvc_filter_type_e filter_type, ctsvc_attribute_filter_s* filter); +static int __ctsvc_ipc_marshal_attribute_filter(const ctsvc_attribute_filter_s* filter, pims_ipc_data_h ipc_data); + + +static ctsvc_ipc_marshal_record_plugin_cb_s* __ctsvc_ipc_marshal_get_plugin_cb(ctsvc_record_type_e type) +{ + switch (type) + { + case CTSVC_RECORD_ADDRESSBOOK: + return (&_ctsvc_ipc_record_addressbook_plugin_cb); + case CTSVC_RECORD_GROUP: + return (&_ctsvc_ipc_record_group_plugin_cb); + case CTSVC_RECORD_PERSON: + return (&_ctsvc_ipc_record_person_plugin_cb); + case CTSVC_RECORD_CONTACT: + return (&_ctsvc_ipc_record_contact_plugin_cb); + case CTSVC_RECORD_MY_PROFILE: + return (&_ctsvc_ipc_record_my_profile_plugin_cb); + case CTSVC_RECORD_UPDATED_INFO: + return (&_ctsvc_ipc_record_updated_info_plugin_cb); + case CTSVC_RECORD_PHONELOG: + return (&_ctsvc_ipc_record_phonelog_plugin_cb); + case CTSVC_RECORD_SPEEDDIAL: + return (&_ctsvc_ipc_record_speeddial_plugin_cb); + case CTSVC_RECORD_SDN: + return (&_ctsvc_ipc_record_sdn_plugin_cb); + case CTSVC_RECORD_RESULT: + return (&_ctsvc_ipc_record_result_plugin_cb); + case CTSVC_RECORD_SIMPLE_CONTACT: + return &_ctsvc_ipc_record_simple_contact_plugin_cb; + case CTSVC_RECORD_NAME: + return (&_ctsvc_ipc_record_name_plugin_cb); + case CTSVC_RECORD_COMPANY: + return (&_ctsvc_ipc_record_company_plugin_cb); + case CTSVC_RECORD_NOTE: + return (&_ctsvc_ipc_record_note_plugin_cb); + case CTSVC_RECORD_NUMBER: + return (&_ctsvc_ipc_record_number_plugin_cb); + case CTSVC_RECORD_EMAIL: + return (&_ctsvc_ipc_record_email_plugin_cb); + case CTSVC_RECORD_URL: + return (&_ctsvc_ipc_record_url_plugin_cb); + case CTSVC_RECORD_EVENT: + return (&_ctsvc_ipc_record_event_plugin_cb); + case CTSVC_RECORD_NICKNAME: + return (&_ctsvc_ipc_record_nickname_plugin_cb); + case CTSVC_RECORD_ADDRESS: + return (&_ctsvc_ipc_record_address_plugin_cb); + case CTSVC_RECORD_MESSENGER: + return (&_ctsvc_ipc_record_messenger_plugin_cb); + case CTSVC_RECORD_GROUP_RELATION: + return (&_ctsvc_ipc_record_group_relation_plugin_cb); + case CTSVC_RECORD_ACTIVITY: + return (&_ctsvc_ipc_record_activity_plugin_cb); + case CTSVC_RECORD_ACTIVITY_PHOTO: + return (&_ctsvc_ipc_record_activity_photo_plugin_cb); + case CTSVC_RECORD_PROFILE: + return (&_ctsvc_ipc_record_profile_plugin_cb); + case CTSVC_RECORD_RELATIONSHIP: + return (&_ctsvc_ipc_record_relationship_plugin_cb); + case CTSVC_RECORD_IMAGE: + return (&_ctsvc_ipc_record_image_plugin_cb); + case CTSVC_RECORD_EXTENSION: + return (&_ctsvc_ipc_record_extension_plugin_cb); + + default: + ASSERT_NOT_REACHED("Unimplemented IPC module (%d)", type); + return NULL; + } +} + +static void __ctsvc_ipc_unmarshal_composite_filter_free(ctsvc_composite_filter_s* filter) +{ + if (filter->filters) { + GSList *cursor = NULL; + for(cursor=filter->filters;cursor;cursor=cursor->next) { + ctsvc_filter_s *src = (ctsvc_filter_s*)cursor->data; + if (src->filter_type == CTSVC_FILTER_COMPOSITE) + __ctsvc_ipc_unmarshal_composite_filter_free((ctsvc_composite_filter_s *)src); + else { + ctsvc_attribute_filter_s *attr = (ctsvc_attribute_filter_s *)src; + if (attr->filter_type == CTSVC_FILTER_STR) + free(attr->value.s); + } + free(src); + } + g_slist_free(filter->filters); + } + + if (filter->filter_ops) { + g_slist_free(filter->filter_ops); + } + + free(filter->view_uri); +} + +static int __ctsvc_ipc_unmarshal_composite_filter(const pims_ipc_data_h ipc_data, ctsvc_composite_filter_s* filter) +{ + int ret = CONTACTS_ERROR_NONE; + unsigned int size = 0; + char* str = NULL; + int count =0, i=0; + ctsvc_filter_type_e filter_type = CTSVC_FILTER_COMPOSITE; + contacts_filter_operator_e op = CONTACTS_FILTER_OPERATOR_AND; + + filter->filter_type = CTSVC_FILTER_COMPOSITE; + + // view_uri + str = (char*)pims_ipc_data_get(ipc_data,&size); + filter->view_uri = (char*)SAFE_STRDUP(str); + + // filters + if (ctsvc_ipc_unmarshal_int(ipc_data,&count) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + for(i=0;ifilters = g_slist_append(filter->filters,com_filter); + } + else + { + ctsvc_attribute_filter_s* attr_filter = NULL; + attr_filter = (ctsvc_attribute_filter_s*)calloc(1,sizeof(ctsvc_attribute_filter_s)); + if (attr_filter == NULL) + { + CTS_ERR("malloc fail"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + goto ERROR_RETURN; + } + if (__ctsvc_ipc_unmarshal_attribute_filter(ipc_data, filter_type, attr_filter) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + ret = CONTACTS_ERROR_INVALID_PARAMETER; + CONTACTS_FREE(attr_filter); + goto ERROR_RETURN; + } + filter->filters = g_slist_append(filter->filters,attr_filter); + } + } + + // filters + if (ctsvc_ipc_unmarshal_int(ipc_data,&count) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + ret = CONTACTS_ERROR_INVALID_PARAMETER; + goto ERROR_RETURN; + } + + for(i=0;ifilter_ops = g_slist_append(filter->filter_ops, (void*)op); + } + + // properties //property_count + filter->properties = (property_info_s *)ctsvc_view_get_all_property_infos(filter->view_uri, &filter->property_count); + + return CONTACTS_ERROR_NONE; + +ERROR_RETURN: + __ctsvc_ipc_unmarshal_composite_filter_free(filter); + return ret; +} + +static int __ctsvc_ipc_marshal_composite_filter(const ctsvc_composite_filter_s* filter, pims_ipc_data_h ipc_data) +{ + if (ctsvc_ipc_marshal_int((filter->filter_type),ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + // view_uri + int length = strlen(filter->view_uri); + if (pims_ipc_data_put(ipc_data,(void*)filter->view_uri,length+1) < 0) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + // filter->filters + if (filter->filters) + { + int count = g_slist_length(filter->filters); + GSList *cursor = filter->filters; + ctsvc_filter_s* child_filter; + + if (ctsvc_ipc_marshal_int(count,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + while (cursor) + { + child_filter = (ctsvc_filter_s*)cursor->data; + + if (child_filter->filter_type == CTSVC_FILTER_COMPOSITE) + { + if (__ctsvc_ipc_marshal_composite_filter((ctsvc_composite_filter_s*)child_filter, ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("__ctsvc_ipc_marshal_composite_filter fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + else + { + if (__ctsvc_ipc_marshal_attribute_filter((ctsvc_attribute_filter_s*)child_filter, ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("__ctsvc_ipc_marshal_attribute_filter fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + cursor = g_slist_next(cursor); + } + } + else + { + if (ctsvc_ipc_marshal_int(0,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + + if (filter->filter_ops) + { + int count = g_slist_length(filter->filter_ops); + GSList *cursor = filter->filter_ops; + + if (ctsvc_ipc_marshal_int(count,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + while (cursor) + { + contacts_filter_operator_e op = (contacts_filter_operator_e)cursor->data; + + if (ctsvc_ipc_marshal_int(op,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + cursor = g_slist_next(cursor); + } + } + else + { + if (ctsvc_ipc_marshal_int(0,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + + // properties //property_count + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_ipc_unmarshal_attribute_filter(const pims_ipc_data_h ipc_data, const ctsvc_filter_type_e filter_type, ctsvc_attribute_filter_s* filter) +{ + filter->filter_type = filter_type; + if (ctsvc_ipc_unmarshal_int(ipc_data,&filter->property_id) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + if (ctsvc_ipc_unmarshal_int(ipc_data,&filter->match) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + switch(filter->filter_type) + { + case CTSVC_FILTER_STR: + if (ctsvc_ipc_unmarshal_string(ipc_data,&filter->value.s) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + break; + case CTSVC_FILTER_INT: + if (ctsvc_ipc_unmarshal_int(ipc_data,&filter->value.i) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + break; + case CTSVC_FILTER_BOOL: + if (ctsvc_ipc_unmarshal_bool(ipc_data,&filter->value.b) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + break; + case CTSVC_FILTER_DOUBLE: + if (ctsvc_ipc_unmarshal_double(ipc_data,&filter->value.d) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + break; + case CTSVC_FILTER_LLI: + if (ctsvc_ipc_unmarshal_lli(ipc_data,&filter->value.l) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + break; + default: + break; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_ipc_marshal_attribute_filter(const ctsvc_attribute_filter_s* filter, pims_ipc_data_h ipc_data) +{ + if (ctsvc_ipc_marshal_int((filter->filter_type),ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + if (ctsvc_ipc_marshal_int((filter->property_id),ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + if (ctsvc_ipc_marshal_int((filter->match),ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + switch(filter->filter_type) + { + case CTSVC_FILTER_STR: + if (ctsvc_ipc_marshal_string((filter->value.s),ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + break; + case CTSVC_FILTER_INT: + if (ctsvc_ipc_marshal_int((filter->value.i),ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + break; + case CTSVC_FILTER_BOOL: + if (ctsvc_ipc_marshal_bool((filter->value.b),ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + break; + case CTSVC_FILTER_DOUBLE: + if (ctsvc_ipc_marshal_double((filter->value.d),ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + break; + case CTSVC_FILTER_LLI: + if (ctsvc_ipc_marshal_lli((filter->value.l),ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + break; + default: + break; + } + + return CONTACTS_ERROR_NONE; +} + + +int ctsvc_ipc_unmarshal_record(const pims_ipc_data_h ipc_data, contacts_record_h* precord) +{ + int ret = CONTACTS_ERROR_NONE; + + ctsvc_record_s common = {0,}; + + if (ctsvc_ipc_unmarshal_record_common(ipc_data, &common) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_unmarshal_common fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + RETVM_IF( NULL == precord || NULL == ipc_data, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter"); + + ret = contacts_record_create(common.view_uri, precord); + RETVM_IF(ret != CONTACTS_ERROR_NONE, ret, "create activity record fail"); + + ctsvc_ipc_marshal_record_plugin_cb_s *plugin_cb = __ctsvc_ipc_marshal_get_plugin_cb(common.r_type); + + RETVM_IF(NULL == plugin_cb || NULL == plugin_cb->unmarshal_record, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter"); + + ret = plugin_cb->unmarshal_record(ipc_data, common.view_uri, *precord); + if( CONTACTS_ERROR_NONE != ret ) + { + contacts_record_destroy(*precord,true); + *precord = NULL; + return CONTACTS_ERROR_IPC; + } + + return ret; +} + +int ctsvc_ipc_marshal_record(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + RETVM_IF(NULL == record || NULL == ipc_data, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter"); + + ctsvc_record_s *common = (ctsvc_record_s*)(record); + + if (ctsvc_ipc_marshal_record_common(common, ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_marshal_common fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ctsvc_ipc_marshal_record_plugin_cb_s *plugin_cb = __ctsvc_ipc_marshal_get_plugin_cb(common->r_type); + + RETVM_IF(NULL == plugin_cb || NULL == plugin_cb->marshal_record, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter"); + + int ret = plugin_cb->marshal_record(record, ipc_data); + + return ret; +} + +int ctsvc_ipc_marshal_record_get_primary_id(const contacts_record_h record, + unsigned int *property_id, int *id) +{ + RETVM_IF(NULL == record || NULL == property_id || NULL == id, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter"); + + ctsvc_record_s *temp = (ctsvc_record_s*)(record); + + ctsvc_ipc_marshal_record_plugin_cb_s *plugin_cb = __ctsvc_ipc_marshal_get_plugin_cb(temp->r_type); + + RETVM_IF(NULL == plugin_cb || NULL == plugin_cb->get_primary_id, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter"); + + int ret = plugin_cb->get_primary_id(record, property_id,id); + + return ret; +} + +int ctsvc_ipc_unmarshal_string(const pims_ipc_data_h ipc_data, char** ppbufchar) +{ + int ret = CONTACTS_ERROR_NONE; + + void *tmp = NULL; + unsigned int size = 0; + char *str = NULL; + + int length = 0; + + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(ppbufchar==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + + tmp = pims_ipc_data_get(ipc_data,&size); + if ( tmp == NULL){ + CTS_ERR("pims_ipc_data_get string fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + length = *(int*)tmp; + + if(length == -1) + { + ret = CONTACTS_ERROR_NONE; + CTS_VERBOSE("string is null"); + *ppbufchar = NULL; + return ret; + } + + str = (char*)pims_ipc_data_get(ipc_data,&size); + if (str) + { + *ppbufchar = SAFE_STRDUP(str); + } + CTS_VERBOSE("string set %s",*ppbufchar); + + return ret; +} + +int ctsvc_ipc_unmarshal_int(const pims_ipc_data_h data, int *pout) +{ + RETV_IF(data==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(pout==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + + unsigned int size = 0; + void *tmp = pims_ipc_data_get(data,&size); + if ( tmp == NULL) + { + CTS_ERR("pims_ipc_data_get int fail"); + return CONTACTS_ERROR_NO_DATA; + } + else + { + *pout = *(int*)tmp; + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_ipc_unmarshal_unsigned_int(const pims_ipc_data_h data, unsigned int *pout) +{ + RETV_IF(data==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(pout==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + + unsigned int size = 0; + void *tmp = pims_ipc_data_get(data,&size); + if ( tmp == NULL) + { + CTS_ERR("pims_ipc_data_get unsigned int fail"); + return CONTACTS_ERROR_NO_DATA; + } + else + { + *pout = *(unsigned int*)tmp; + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_ipc_unmarshal_bool(const pims_ipc_data_h data, bool *pout) +{ + RETV_IF(data==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(pout==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + + unsigned int size = 0; + void *tmp = pims_ipc_data_get(data,&size); + if ( tmp == NULL) + { + CTS_ERR("pims_ipc_data_get bool fail"); + return CONTACTS_ERROR_NO_DATA; + } + else + { + *pout = *(bool*)tmp; + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_ipc_unmarshal_lli(const pims_ipc_data_h data, long long int *pout) +{ + RETV_IF(data==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(pout==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + + unsigned int size = 0; + void *tmp = pims_ipc_data_get(data,&size); + if ( tmp == NULL) + { + CTS_ERR("pims_ipc_data_get lli fail"); + return CONTACTS_ERROR_NO_DATA; + } + else + { + *pout = *(long long int*)tmp; + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_ipc_unmarshal_long(const pims_ipc_data_h data, long *pout) +{ + RETV_IF(data==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(pout==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + + unsigned int size = 0; + void *tmp = pims_ipc_data_get(data, &size); + if ( tmp == NULL ) + { + CTS_ERR("pims_ipc_data_get long fail"); + return CONTACTS_ERROR_NO_DATA; + } + else + { + *pout = *(long*)tmp; + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_ipc_unmarshal_double(const pims_ipc_data_h data, double *pout) +{ + RETV_IF(data==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(pout==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + + unsigned int size = 0; + void* tmp = pims_ipc_data_get(data,&size); + if ( tmp == NULL) + { + CTS_ERR("pims_ipc_data_get double fail"); + return CONTACTS_ERROR_NO_DATA; + } + else + { + *pout = *(double*)tmp; + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_ipc_unmarshal_record_common(const pims_ipc_data_h ipc_data, ctsvc_record_s* common) +{ + void *tmp = NULL; + unsigned int size = 0; + const char* str = NULL; + + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + tmp = pims_ipc_data_get(ipc_data,&size); + if ( tmp == NULL) + { + CTS_ERR("pims_ipc_data_get fail"); + return CONTACTS_ERROR_NO_DATA; + } + else + { + common->r_type = *(ctsvc_record_type_e*)tmp; + } + + str = (char*)pims_ipc_data_get(ipc_data,&size); + common->view_uri = ctsvc_view_get_uri(str); + common->property_max_count = *(unsigned int*)pims_ipc_data_get(ipc_data,&size); + + tmp = pims_ipc_data_get(ipc_data,&size); + if ( tmp == NULL ){ + CTS_ERR("pims_ipc_data unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + int length = *(int*)tmp; + if(length == -1) + { + CTS_VERBOSE("properties_flags is null"); + } + else { + tmp = (unsigned char*)pims_ipc_data_get(ipc_data,&size); + { + common->properties_flags = calloc(common->property_max_count, sizeof(unsigned char)); + if (common->properties_flags == NULL) + { + CTS_ERR("calloc fail"); + return CONTACTS_ERROR_OUT_OF_MEMORY; + } + memcpy(common->properties_flags, tmp, sizeof(unsigned char)*(common->property_max_count)); + } + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_ipc_marshal_string(const char* bufchar, pims_ipc_data_h ipc_data) +{ + int ret = CONTACTS_ERROR_NONE; + + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + + if( bufchar != NULL) + { + int length = strlen(bufchar); + if (pims_ipc_data_put(ipc_data,(void*)&length,sizeof(int)) != 0) + { + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + } + + if ( pims_ipc_data_put(ipc_data,(void*)bufchar,length+1) != 0) + { + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + return ret; + } + } + else + { + int length = -1; + + if (pims_ipc_data_put(ipc_data,(void*)&length,sizeof(int)) != 0) + { + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + } + } + return ret; +} + +int ctsvc_ipc_marshal_int(const int in, pims_ipc_data_h ipc_data) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + + if (pims_ipc_data_put(ipc_data,(void*)&in,sizeof(int)) != 0) + { + return CONTACTS_ERROR_OUT_OF_MEMORY; + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_ipc_marshal_unsigned_int(const unsigned int in, pims_ipc_data_h ipc_data) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + + if (pims_ipc_data_put(ipc_data,(void*)&in,sizeof(unsigned int)) != 0) + { + return CONTACTS_ERROR_OUT_OF_MEMORY; + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_ipc_marshal_bool(const bool in, pims_ipc_data_h ipc_data) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + + if (pims_ipc_data_put(ipc_data,(void*)&in,sizeof(bool)) != 0) + { + return CONTACTS_ERROR_OUT_OF_MEMORY; + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_ipc_marshal_lli(const long long int in, pims_ipc_data_h ipc_data) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + + if (pims_ipc_data_put(ipc_data,(void*)&in,sizeof(long long int)) != 0) + { + return CONTACTS_ERROR_OUT_OF_MEMORY; + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_ipc_marshal_long(const long in, pims_ipc_data_h ipc_data) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + + if (pims_ipc_data_put(ipc_data,(void*)&in,sizeof(long)) != 0) + { + return CONTACTS_ERROR_OUT_OF_MEMORY; + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_ipc_marshal_double(const double in, pims_ipc_data_h ipc_data) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_INVALID_PARAMETER); + + if (pims_ipc_data_put(ipc_data,(void*)&in,sizeof(double)) != 0) + { + return CONTACTS_ERROR_OUT_OF_MEMORY; + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_ipc_marshal_record_common(const ctsvc_record_s* common, pims_ipc_data_h ipc_data) +{ + + RETV_IF(NULL == common, CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == ipc_data, CONTACTS_ERROR_INVALID_PARAMETER); + + if(pims_ipc_data_put(ipc_data,(void*)&common->r_type,sizeof(int)) < 0) + { + return CONTACTS_ERROR_NO_DATA; + } + + int length = strlen(common->view_uri); + if (pims_ipc_data_put(ipc_data,(void*)common->view_uri,length+1) < 0) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + if(pims_ipc_data_put(ipc_data,(void*)&common->property_max_count,sizeof(unsigned int)) < 0) + { + return CONTACTS_ERROR_NO_DATA; + } + + if (common->properties_flags != NULL) + { + int length = common->property_max_count; + if (pims_ipc_data_put(ipc_data,(void*)&length,sizeof(int)) != 0) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_OUT_OF_MEMORY; + } + if(pims_ipc_data_put(ipc_data,(void*)common->properties_flags,sizeof(unsigned char)*common->property_max_count) < 0) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_NO_DATA; + } + } + else + { + int length = -1; + if (pims_ipc_data_put(ipc_data,(void*)&length,sizeof(int)) != 0) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_OUT_OF_MEMORY; + } + } + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_ipc_unmarshal_query(const pims_ipc_data_h ipc_data, contacts_query_h *query) +{ + ctsvc_query_s *que = NULL; + unsigned int size = 0; + char* str = NULL; + unsigned int count = 0, i = 0; + int ret = CONTACTS_ERROR_NONE; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == ipc_data, CONTACTS_ERROR_INVALID_PARAMETER); + + // view_uri + str = (char*)pims_ipc_data_get(ipc_data,&size); + + ret = contacts_query_create(str, query); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("contacts_query_create fail"); + return ret; + } + + que = (ctsvc_query_s *) *query; + + if (ctsvc_ipc_unmarshal_unsigned_int(ipc_data,&count) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + ret = CONTACTS_ERROR_INVALID_PARAMETER; + goto ERROR_RETURN; + } + + if (count == 0) + { + que->filter = NULL; + } + else + { + contacts_filter_h filter = (contacts_filter_h)que->filter; + if (contacts_filter_create(que->view_uri,&filter) != CONTACTS_ERROR_NONE) + { + CTS_ERR("contacts_filter_create fail"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + goto ERROR_RETURN; + } + que->filter = (ctsvc_composite_filter_s*)filter; + + // for filter_type + if (ctsvc_ipc_unmarshal_unsigned_int(ipc_data, &count) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + ret = CONTACTS_ERROR_INVALID_PARAMETER; + goto ERROR_RETURN; + } + + if (__ctsvc_ipc_unmarshal_composite_filter(ipc_data,que->filter) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + ret = CONTACTS_ERROR_INVALID_PARAMETER; + goto ERROR_RETURN; + } + } + + if (ctsvc_ipc_unmarshal_unsigned_int(ipc_data,&(que->projection_count)) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + ret = CONTACTS_ERROR_INVALID_PARAMETER; + goto ERROR_RETURN; + } + + if (que->projection_count > 0) + { + que->projection = (unsigned int*)malloc(sizeof(unsigned int)*que->projection_count); + if (que->projection == NULL) + { + CTS_ERR("malloc fail"); + ret = CONTACTS_ERROR_OUT_OF_MEMORY; + goto ERROR_RETURN; + } + for(i=0;iprojection_count;i++) + { + if (ctsvc_ipc_unmarshal_unsigned_int(ipc_data,&(que->projection[i])) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + ret = CONTACTS_ERROR_INVALID_PARAMETER; + goto ERROR_RETURN; + } + } + } + else + { + que->projection = NULL; + } + + if (ctsvc_ipc_unmarshal_unsigned_int(ipc_data,&(que->sort_property_id)) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + ret = CONTACTS_ERROR_INVALID_PARAMETER; + goto ERROR_RETURN; + } + + if (ctsvc_ipc_unmarshal_bool(ipc_data,&(que->sort_asc)) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + ret = CONTACTS_ERROR_INVALID_PARAMETER; + goto ERROR_RETURN; + } + + if (ctsvc_ipc_unmarshal_bool(ipc_data,&(que->distinct)) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + ret = CONTACTS_ERROR_INVALID_PARAMETER; + goto ERROR_RETURN; + } + + return CONTACTS_ERROR_NONE; + +ERROR_RETURN: + contacts_query_destroy(*query); + *query = NULL; + + return ret; +} + +int ctsvc_ipc_marshal_query(const contacts_query_h query, pims_ipc_data_h ipc_data) +{ + ctsvc_query_s *que = NULL; + int i = 0; + int length = 0; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == ipc_data, CONTACTS_ERROR_INVALID_PARAMETER); + que = (ctsvc_query_s *)query; + + //view_uri + length = strlen(que->view_uri); + if (pims_ipc_data_put(ipc_data,(void*)que->view_uri,length+1) < 0) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + if (que->filter) + { + if (ctsvc_ipc_marshal_int(1,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + if (__ctsvc_ipc_marshal_composite_filter(que->filter,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + else + { + if (ctsvc_ipc_marshal_int(0,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + + if (ctsvc_ipc_marshal_unsigned_int(que->projection_count,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + for(i=0;iprojection_count;i++) + { + if (ctsvc_ipc_marshal_unsigned_int(que->projection[i],ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + + if (ctsvc_ipc_marshal_unsigned_int(que->sort_property_id,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + if (ctsvc_ipc_marshal_bool(que->sort_asc,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + if (ctsvc_ipc_marshal_bool(que->distinct,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + //properties // property_count + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_ipc_unmarshal_list(const pims_ipc_data_h ipc_data, contacts_list_h* list) +{ + unsigned int count = 0; + unsigned int deleted_count = 0; + contacts_record_h record; + int ret = CONTACTS_ERROR_NONE; + + RETV_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == ipc_data, CONTACTS_ERROR_INVALID_PARAMETER); + + if (contacts_list_create(list) != CONTACTS_ERROR_NONE) + { + CTS_ERR("contacts_list_create fail"); + return CONTACTS_ERROR_OUT_OF_MEMORY; + } + + if (ctsvc_ipc_unmarshal_unsigned_int(ipc_data,&(count)) != CONTACTS_ERROR_NONE) + { + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + unsigned int i = 0; + for(i=0;i +#include "ctsvc_struct.h" +#include "contacts_record.h" + +/* + * record + * pims_ipc_data_h 의 경우 생성된 사항을 넘겨받아야함 + * unmarshal_record의 경우 plugin에서 struct를 alloc하여 return + * marshal : 각 plugin에서 cal_common_s + other 같이 marshal + * unmarshal : cal_common_s 는 먼저 marshal 하여, view_uri 만 넘겨준 이후, + * 각 plug in에서 cal_common_s를 제외 한 사항에 대하여 unmarshal + */ +typedef int (*ctsvc_ipc_unmarshal_record_cb)(const pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h precord); +typedef int (*ctsvc_ipc_marshal_record_cb)(const contacts_record_h record, pims_ipc_data_h ipc_data); +typedef int (*ctsvc_ipc_marshal_record_get_primary_id_cb)(const contacts_record_h record, unsigned int *property_id, int *id); + +typedef struct { + ctsvc_ipc_unmarshal_record_cb unmarshal_record; + ctsvc_ipc_marshal_record_cb marshal_record; + ctsvc_ipc_marshal_record_get_primary_id_cb get_primary_id; +} ctsvc_ipc_marshal_record_plugin_cb_s; + +int ctsvc_ipc_unmarshal_record(const pims_ipc_data_h ipc_data, contacts_record_h* precord); +int ctsvc_ipc_marshal_record(const contacts_record_h record, pims_ipc_data_h ipc_data); +int ctsvc_ipc_marshal_record_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +/* + * string + * char의 경우 NULL 설정의 이슈로 인하여, [int:string length]+[char*] 로 넘길 수 있도록 설정.. + */ +int ctsvc_ipc_unmarshal_string(const pims_ipc_data_h ipc_data, char** ppbufchar); +int ctsvc_ipc_unmarshal_bool(const pims_ipc_data_h data, bool *pout); +int ctsvc_ipc_unmarshal_int(const pims_ipc_data_h data, int *pout); +int ctsvc_ipc_unmarshal_unsigned_int(const pims_ipc_data_h data, unsigned int *pout); +int ctsvc_ipc_unmarshal_lli(const pims_ipc_data_h data, long long int *pout); +int ctsvc_ipc_unmarshal_long(const pims_ipc_data_h data, long *pout); +int ctsvc_ipc_unmarshal_double(const pims_ipc_data_h data, double *pout); +int ctsvc_ipc_unmarshal_record_common(const pims_ipc_data_h ipc_data, ctsvc_record_s* common); + +/* + * NULL 이슈로 ctsvc_ipc_unmarshal_string / ctsvc_ipc_marshal_string 는 pair 를 이루어야함. + */ +int ctsvc_ipc_marshal_string(const char* bufchar, pims_ipc_data_h ipc_data); +int ctsvc_ipc_marshal_bool(const bool in, pims_ipc_data_h ipc_data); +int ctsvc_ipc_marshal_int(const int in, pims_ipc_data_h ipc_data); +int ctsvc_ipc_marshal_unsigned_int(const unsigned int in, pims_ipc_data_h ipc_data); +int ctsvc_ipc_marshal_lli(const long long int in, pims_ipc_data_h ipc_data); +int ctsvc_ipc_marshal_long(const long in, pims_ipc_data_h ipc_data); +int ctsvc_ipc_marshal_double(const double in, pims_ipc_data_h ipc_data); +int ctsvc_ipc_marshal_record_common(const ctsvc_record_s* common, pims_ipc_data_h ipc_data); + +/* + * filter, query + * + * marsharl : view_uri + other + * unmarshal : view_uri를 먼저 get 하고 난 이후 나머지를 .. + */ +//int ctsvc_ipc_unmarshal_filter(const pims_ipc_data_h ipc_data, contacts_filter_h *filter); +//int ctsvc_ipc_marshal_filter(const contacts_filter_h filter, pims_ipc_data_h ipc_data); +int ctsvc_ipc_unmarshal_query(const pims_ipc_data_h ipc_data, contacts_query_h *query); +int ctsvc_ipc_marshal_query(const contacts_query_h query, pims_ipc_data_h ipc_data); +int ctsvc_ipc_unmarshal_list(const pims_ipc_data_h ipc_data, contacts_list_h *list); +int ctsvc_ipc_marshal_list(const contacts_list_h list, pims_ipc_data_h ipc_data); + +#endif /* __ctsvc_ipc_marshal__ */ diff --git a/common/ipc/ctsvc_ipc_messenger.c b/common/ipc/ctsvc_ipc_messenger.c new file mode 100644 index 0000000..4130a88 --- /dev/null +++ b/common/ipc/ctsvc_ipc_messenger.c @@ -0,0 +1,65 @@ +#include "ctsvc_ipc_macros.h" + + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_messenger(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_messenger(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_messenger_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_messenger_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_messenger, + .marshal_record = __ctsvc_ipc_marshal_messenger, + .get_primary_id = __ctsvc_ipc_marshal_messenger_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_messenger(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_messenger_s* messenger_p = (ctsvc_messenger_s*) record; + + do { + if (ctsvc_ipc_unmarshal_int(ipc_data, &messenger_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &messenger_p->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &messenger_p->type) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &messenger_p->label) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &messenger_p->im_id) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_messenger(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_messenger_s* messenger_p = (ctsvc_messenger_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(messenger_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_int((messenger_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((messenger_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((messenger_p->type),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((messenger_p->label),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((messenger_p->im_id),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_messenger_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_MESSENGER_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_my_profile.c b/common/ipc/ctsvc_ipc_my_profile.c new file mode 100644 index 0000000..e91f9fc --- /dev/null +++ b/common/ipc/ctsvc_ipc_my_profile.c @@ -0,0 +1,98 @@ +#include "ctsvc_ipc_macros.h" + + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "ctsvc_view.h" + +static int __ctsvc_ipc_unmarshal_my_profile(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_my_profile(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_my_profile_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_my_profile_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_my_profile, + .marshal_record = __ctsvc_ipc_marshal_my_profile, + .get_primary_id = __ctsvc_ipc_marshal_my_profile_get_primary_id +}; + + + +static int __ctsvc_ipc_unmarshal_my_profile(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_my_profile_s* pmy_profile = (ctsvc_my_profile_s*) record; + + do { + if (ctsvc_ipc_unmarshal_int(ipc_data, &pmy_profile->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &pmy_profile->changed_time) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &pmy_profile->addressbook_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pmy_profile->display_name) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pmy_profile->uid) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pmy_profile->image_thumbnail_path) != CONTACTS_ERROR_NONE) break; + + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pmy_profile->name) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pmy_profile->note) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pmy_profile->company) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pmy_profile->numbers) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pmy_profile->emails) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pmy_profile->events) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pmy_profile->messengers) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pmy_profile->postal_addrs) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pmy_profile->urls) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pmy_profile->nicknames) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pmy_profile->profiles) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pmy_profile->relationships) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pmy_profile->images) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_list(ipc_data, (contacts_list_h*)&pmy_profile->extensions) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_my_profile(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_my_profile_s* pcontact = (ctsvc_my_profile_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(pcontact==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_int((pcontact->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((pcontact->changed_time),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((pcontact->addressbook_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->display_name),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->uid),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->image_thumbnail_path),ipc_data) != CONTACTS_ERROR_NONE) break; + + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->name, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->note, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->company, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->numbers, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->emails, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->events, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->messengers, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->postal_addrs, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->urls, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->nicknames, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->profiles, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->relationships, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->images, ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_list( (contacts_list_h)pcontact->extensions, ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_my_profile_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_CONTACT_ID; + return contacts_record_get_int(record, *property_id, id ); +} + diff --git a/common/ipc/ctsvc_ipc_name.c b/common/ipc/ctsvc_ipc_name.c new file mode 100644 index 0000000..22578c1 --- /dev/null +++ b/common/ipc/ctsvc_ipc_name.c @@ -0,0 +1,86 @@ +#include "ctsvc_ipc_macros.h" + + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_name(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_name(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_name_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_name_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_name, + .marshal_record = __ctsvc_ipc_marshal_name, + .get_primary_id = __ctsvc_ipc_marshal_name_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_name(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_name_s* name_p = (ctsvc_name_s*) record; + + do { + if (ctsvc_ipc_unmarshal_bool(ipc_data, &name_p->is_default) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &name_p->is_changed) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &name_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &name_p->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &name_p->language_type) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &name_p->first) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &name_p->last) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &name_p->addition) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &name_p->prefix) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &name_p->suffix) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &name_p->phonetic_first) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &name_p->phonetic_middle) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &name_p->phonetic_last) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &name_p->lookup) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &name_p->reverse_lookup) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_name(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_name_s* name_p = (ctsvc_name_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(name_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_bool((name_p->is_default),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((name_p->is_changed),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((name_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((name_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((name_p->language_type),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((name_p->first),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((name_p->last),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((name_p->addition),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((name_p->prefix),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((name_p->suffix),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((name_p->phonetic_first),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((name_p->phonetic_middle),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((name_p->phonetic_last),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((name_p->lookup),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((name_p->reverse_lookup),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_name_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_NAME_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_nickname.c b/common/ipc/ctsvc_ipc_nickname.c new file mode 100644 index 0000000..80b2c3c --- /dev/null +++ b/common/ipc/ctsvc_ipc_nickname.c @@ -0,0 +1,65 @@ +#include "ctsvc_ipc_macros.h" + + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_nickname(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_nickname(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_nickname_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_nickname_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_nickname, + .marshal_record = __ctsvc_ipc_marshal_nickname, + .get_primary_id = __ctsvc_ipc_marshal_nickname_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_nickname(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_nickname_s* nickname_p = (ctsvc_nickname_s*) record; + + do { + if (ctsvc_ipc_unmarshal_int(ipc_data, &nickname_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &nickname_p->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &nickname_p->type) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &nickname_p->label) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &nickname_p->nickname) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_nickname(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_nickname_s* nickname_p = (ctsvc_nickname_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(nickname_p==NULL,CONTACTS_ERROR_NO_DATA); + + do{ + if (ctsvc_ipc_marshal_int((nickname_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((nickname_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((nickname_p->type),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((nickname_p->label),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((nickname_p->nickname),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_nickname_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_NICKNAME_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_note.c b/common/ipc/ctsvc_ipc_note.c new file mode 100644 index 0000000..273df03 --- /dev/null +++ b/common/ipc/ctsvc_ipc_note.c @@ -0,0 +1,61 @@ +#include "ctsvc_ipc_macros.h" + + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_note(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_note(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_note_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_note_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_note, + .marshal_record = __ctsvc_ipc_marshal_note, + .get_primary_id = __ctsvc_ipc_marshal_note_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_note(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_note_s* note_p = (ctsvc_note_s*) record; + + do { + if (ctsvc_ipc_unmarshal_int(ipc_data, ¬e_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, ¬e_p->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, ¬e_p->note) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_note(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_note_s* note_p = (ctsvc_note_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(note_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_int((note_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((note_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((note_p->note),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_note_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_NOTE_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_number.c b/common/ipc/ctsvc_ipc_number.c new file mode 100644 index 0000000..89b21d3 --- /dev/null +++ b/common/ipc/ctsvc_ipc_number.c @@ -0,0 +1,66 @@ +#include "ctsvc_ipc_macros.h" + + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_number(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_number(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_number_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_number_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_number, + .marshal_record = __ctsvc_ipc_marshal_number, + .get_primary_id = __ctsvc_ipc_marshal_number_get_primary_id +}; + +static int __ctsvc_ipc_unmarshal_number(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_number_s* number_p = (ctsvc_number_s*) record; + + do { + if (ctsvc_ipc_unmarshal_int(ipc_data, &number_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &number_p->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &number_p->type) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &number_p->label) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &number_p->number) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &number_p->lookup) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_number(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_number_s* number_p = (ctsvc_number_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(number_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_int((number_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((number_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((number_p->type),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((number_p->label),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((number_p->number),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((number_p->lookup),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_number_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_NUMBER_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_person.c b/common/ipc/ctsvc_ipc_person.c new file mode 100644 index 0000000..382f904 --- /dev/null +++ b/common/ipc/ctsvc_ipc_person.c @@ -0,0 +1,97 @@ +#include "ctsvc_ipc_macros.h" + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_person(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_person(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_person_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_person_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_person, + .marshal_record = __ctsvc_ipc_marshal_person, + .get_primary_id = __ctsvc_ipc_marshal_person_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_person(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_person_s* person_p = (ctsvc_person_s*) record; + + do { + if (ctsvc_ipc_unmarshal_bool(ipc_data, &person_p->name_contact_id_changed) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &person_p->image_thumbnail_changed) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &person_p->ringtone_changed) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &person_p->vibration_changed) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &person_p->is_favorite_changed) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &person_p->is_favorite) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &person_p->has_phonenumber) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &person_p->has_email) != CONTACTS_ERROR_NONE) break; + + if (ctsvc_ipc_unmarshal_int(ipc_data, &person_p->person_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &person_p->name_contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &person_p->display_name) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &person_p->display_name_index) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &person_p->image_thumbnail_path) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &person_p->ringtone_path) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &person_p->vibration) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &person_p->status) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &person_p->link_count) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &person_p->account_id1) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &person_p->account_id2) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &person_p->account_id3) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &person_p->addressbook_ids) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_person(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_person_s* person_p = (ctsvc_person_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(person_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_bool((person_p->name_contact_id_changed),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((person_p->image_thumbnail_changed),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((person_p->ringtone_changed),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((person_p->vibration_changed),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((person_p->is_favorite_changed),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((person_p->is_favorite),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((person_p->has_phonenumber),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((person_p->has_email),ipc_data) != CONTACTS_ERROR_NONE) break; + + if (ctsvc_ipc_marshal_int((person_p->person_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((person_p->name_contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((person_p->display_name),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((person_p->display_name_index),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((person_p->image_thumbnail_path),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((person_p->ringtone_path),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((person_p->vibration),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((person_p->status),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((person_p->link_count),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((person_p->account_id1),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((person_p->account_id2),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((person_p->account_id3),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((person_p->addressbook_ids),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_person_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_PERSON_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_phonelog.c b/common/ipc/ctsvc_ipc_phonelog.c new file mode 100644 index 0000000..c367e66 --- /dev/null +++ b/common/ipc/ctsvc_ipc_phonelog.c @@ -0,0 +1,72 @@ +#include "ctsvc_ipc_macros.h" + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_phonelog(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_phonelog(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_phonelog_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_phonelog_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_phonelog, + .marshal_record = __ctsvc_ipc_marshal_phonelog, + .get_primary_id = __ctsvc_ipc_marshal_phonelog_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_phonelog(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_phonelog_s* phonelog_p = (ctsvc_phonelog_s*) record; + + do { + if (ctsvc_ipc_unmarshal_int(ipc_data, &phonelog_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &phonelog_p->address) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &phonelog_p->person_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &phonelog_p->log_time) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &phonelog_p->log_type) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &phonelog_p->extra_data1) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &phonelog_p->extra_data2) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &phonelog_p->display_name) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &phonelog_p->image_thumbnail_path) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_phonelog(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_phonelog_s* phonelog_p = (ctsvc_phonelog_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(phonelog_p==NULL,CONTACTS_ERROR_NO_DATA); + + + do { + if (ctsvc_ipc_marshal_int((phonelog_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((phonelog_p->address),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((phonelog_p->person_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((phonelog_p->log_time),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((phonelog_p->log_type),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((phonelog_p->extra_data1),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((phonelog_p->extra_data2),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((phonelog_p->display_name),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((phonelog_p->image_thumbnail_path),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_phonelog_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_PHONELOG_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_profile.c b/common/ipc/ctsvc_ipc_profile.c new file mode 100644 index 0000000..190c83d --- /dev/null +++ b/common/ipc/ctsvc_ipc_profile.c @@ -0,0 +1,78 @@ +#include "ctsvc_ipc_macros.h" + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_profile(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_profile(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_profile_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_profile_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_profile, + .marshal_record = __ctsvc_ipc_marshal_profile, + .get_primary_id = __ctsvc_ipc_marshal_profile_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_profile(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_profile_s* profile_p = (ctsvc_profile_s*) record; + + do { + if (ctsvc_ipc_unmarshal_int(ipc_data, &profile_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &profile_p->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &profile_p->type) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &profile_p->label) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &profile_p->uid) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &profile_p->text) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &profile_p->order) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &profile_p->appsvc_operation) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &profile_p->data1) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &profile_p->data2) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &profile_p->data3) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &profile_p->data4) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_profile(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_profile_s* profile_p = (ctsvc_profile_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(profile_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_int((profile_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((profile_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((profile_p->type),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((profile_p->label),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((profile_p->uid),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((profile_p->text),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((profile_p->order),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((profile_p->appsvc_operation),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((profile_p->data1),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((profile_p->data2),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((profile_p->data3),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((profile_p->data4),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_profile_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_PROFILE_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_relationship.c b/common/ipc/ctsvc_ipc_relationship.c new file mode 100644 index 0000000..e65c9c2 --- /dev/null +++ b/common/ipc/ctsvc_ipc_relationship.c @@ -0,0 +1,64 @@ +#include "ctsvc_ipc_macros.h" + + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_relationship(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_relationship(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_relationship_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_relationship_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_relationship, + .marshal_record = __ctsvc_ipc_marshal_relationship, + .get_primary_id = __ctsvc_ipc_marshal_relationship_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_relationship(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_relationship_s* relationship_p = (ctsvc_relationship_s*) record; + + do { + if (ctsvc_ipc_unmarshal_int(ipc_data, &relationship_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &relationship_p->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &relationship_p->type) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &relationship_p->label) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &relationship_p->name) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_relationship(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_relationship_s* relationship_p = (ctsvc_relationship_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(relationship_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_int((relationship_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((relationship_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((relationship_p->type),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((relationship_p->label),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((relationship_p->name),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_relationship_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_RELATIONSHIP_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_result.c b/common/ipc/ctsvc_ipc_result.c new file mode 100644 index 0000000..61b1d96 --- /dev/null +++ b/common/ipc/ctsvc_ipc_result.c @@ -0,0 +1,223 @@ +#include "ctsvc_ipc_macros.h" + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_result(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_result(const contacts_record_h record, pims_ipc_data_h ipc_data); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_result_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_result, + .marshal_record = __ctsvc_ipc_marshal_result, + .get_primary_id = NULL +}; + + +static int __ctsvc_ipc_unmarshal_search_value(pims_ipc_data_h ipc_data, ctsvc_result_value_s* pvalue) +{ + if (ctsvc_ipc_unmarshal_int(ipc_data,&pvalue->property_id) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + if (ctsvc_ipc_unmarshal_int(ipc_data,&pvalue->type) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + + if (CTSVC_VIEW_CHECK_DATA_TYPE(pvalue->property_id, CTSVC_VIEW_DATA_TYPE_STR) == true) + { + if (ctsvc_ipc_unmarshal_string(ipc_data,&pvalue->value.s) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + else if (CTSVC_VIEW_CHECK_DATA_TYPE(pvalue->property_id, CTSVC_VIEW_DATA_TYPE_BOOL) == true) + { + if (ctsvc_ipc_unmarshal_bool(ipc_data,&pvalue->value.b) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + else if (CTSVC_VIEW_CHECK_DATA_TYPE(pvalue->property_id, CTSVC_VIEW_DATA_TYPE_INT) == true) + { + if (ctsvc_ipc_unmarshal_int(ipc_data,&pvalue->value.i) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + else if (CTSVC_VIEW_CHECK_DATA_TYPE(pvalue->property_id, CTSVC_VIEW_DATA_TYPE_DOUBLE) == true) + { + if (ctsvc_ipc_unmarshal_double(ipc_data,&pvalue->value.d) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + else if (CTSVC_VIEW_CHECK_DATA_TYPE(pvalue->property_id, CTSVC_VIEW_DATA_TYPE_LLI) == true) + { + if (ctsvc_ipc_unmarshal_lli(ipc_data,&pvalue->value.l) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + else + { + ASSERT_NOT_REACHED("invalid parameter (property:%d)",pvalue->property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_ipc_marshal_search_value(const ctsvc_result_value_s* pvalue, pims_ipc_data_h ipc_data) +{ + if (ctsvc_ipc_marshal_int(pvalue->property_id,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + if (ctsvc_ipc_marshal_int(pvalue->type,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + + + if (CTSVC_VIEW_CHECK_DATA_TYPE(pvalue->property_id, CTSVC_VIEW_DATA_TYPE_STR) == true) + { + if (ctsvc_ipc_marshal_string(pvalue->value.s,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + else if (CTSVC_VIEW_CHECK_DATA_TYPE(pvalue->property_id, CTSVC_VIEW_DATA_TYPE_BOOL) == true) + { + if (ctsvc_ipc_marshal_bool(pvalue->value.b,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + else if (CTSVC_VIEW_CHECK_DATA_TYPE(pvalue->property_id, CTSVC_VIEW_DATA_TYPE_INT) == true) + { + if (ctsvc_ipc_marshal_int(pvalue->value.i,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + else if (CTSVC_VIEW_CHECK_DATA_TYPE(pvalue->property_id, CTSVC_VIEW_DATA_TYPE_DOUBLE) == true) + { + if (ctsvc_ipc_marshal_double(pvalue->value.d,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + else if (CTSVC_VIEW_CHECK_DATA_TYPE(pvalue->property_id, CTSVC_VIEW_DATA_TYPE_LLI) == true) + { + if (ctsvc_ipc_marshal_lli(pvalue->value.l,ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + else + { + ASSERT_NOT_REACHED("invalid parameter (property:%d)",pvalue->property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + return CONTACTS_ERROR_NONE; +} + + +static int __ctsvc_ipc_unmarshal_result(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL, CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL, CONTACTS_ERROR_NO_DATA); + + ctsvc_result_s* result_p = (ctsvc_result_s*)record; + + unsigned int count = 0; + if (ctsvc_ipc_unmarshal_unsigned_int(ipc_data, &count) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + unsigned int i = 0; + for ( i=0; ivalues = g_slist_append(result_p->values, value_data); + } + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_ipc_marshal_result(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_result_s* result_p = (ctsvc_result_s*)record; + RETV_IF(result_p==NULL,CONTACTS_ERROR_NO_DATA); + + if (result_p->values) + { + unsigned int count = g_slist_length(result_p->values); + if (ctsvc_ipc_marshal_unsigned_int(count, ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + GSList *cursor = result_p->values; + while (cursor) + { + ctsvc_result_value_s* value_data = (ctsvc_result_value_s *)cursor->data; + if (value_data == NULL) + { + cursor = g_slist_next(cursor); + continue; + } + if (__ctsvc_ipc_marshal_search_value((const ctsvc_result_value_s*)value_data, ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + cursor = g_slist_next(cursor); + } + } + else + { + if (ctsvc_ipc_marshal_int(0, ipc_data) != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + + return CONTACTS_ERROR_NONE; +} + diff --git a/common/ipc/ctsvc_ipc_sdn.c b/common/ipc/ctsvc_ipc_sdn.c new file mode 100644 index 0000000..7ecc6c2 --- /dev/null +++ b/common/ipc/ctsvc_ipc_sdn.c @@ -0,0 +1,57 @@ +#include "ctsvc_ipc_macros.h" + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_sdn(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_sdn(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_sdn_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_sdn_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_sdn, + .marshal_record = __ctsvc_ipc_marshal_sdn, + .get_primary_id = __ctsvc_ipc_marshal_sdn_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_sdn(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_sdn_s* sdn_p = (ctsvc_sdn_s*) record; + do { + if (ctsvc_ipc_unmarshal_int(ipc_data, &sdn_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &sdn_p->name) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &sdn_p->number) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_sdn(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_sdn_s* sdn_p = (ctsvc_sdn_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(sdn_p==NULL,CONTACTS_ERROR_NO_DATA); + do { + if (ctsvc_ipc_marshal_int((sdn_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((sdn_p->name),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((sdn_p->number),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_sdn_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_SDN_ID; + return contacts_record_get_int(record, *property_id, id ); +} diff --git a/common/ipc/ctsvc_ipc_simple_contact.c b/common/ipc/ctsvc_ipc_simple_contact.c new file mode 100644 index 0000000..aaab788 --- /dev/null +++ b/common/ipc/ctsvc_ipc_simple_contact.c @@ -0,0 +1,78 @@ +#include "ctsvc_ipc_macros.h" + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" + +static int __ctsvc_ipc_unmarshal_simple_contact(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_simple_contact(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_simple_contact_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_simple_contact_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_simple_contact, + .marshal_record = __ctsvc_ipc_marshal_simple_contact, + .get_primary_id = __ctsvc_ipc_marshal_simple_contact_get_primary_id +}; + +static int __ctsvc_ipc_unmarshal_simple_contact(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_simple_contact_s* pcontact = (ctsvc_simple_contact_s*) record; + do { + if (ctsvc_ipc_unmarshal_bool(ipc_data, &pcontact->is_restricted) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &pcontact->is_favorite) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &pcontact->changed_time) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &pcontact->has_phonenumber) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_bool(ipc_data, &pcontact->has_email) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &pcontact->person_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &pcontact->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &pcontact->addressbook_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->image_thumbnail_path) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->ringtone_path) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->vibration) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->display_name) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->uid) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &pcontact->display_source_type) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_simple_contact(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_simple_contact_s* pcontact = (ctsvc_simple_contact_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(pcontact==NULL,CONTACTS_ERROR_NO_DATA); + do { + if (ctsvc_ipc_marshal_bool((pcontact->is_restricted),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((pcontact->is_favorite),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((pcontact->changed_time),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((pcontact->has_phonenumber),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_bool((pcontact->has_email),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((pcontact->person_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((pcontact->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((pcontact->addressbook_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->image_thumbnail_path),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->ringtone_path),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->vibration),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->display_name),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((pcontact->uid),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((pcontact->display_source_type),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_simple_contact_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_CONTACT_ID; + return contacts_record_get_int(record, *property_id, id ); +} + diff --git a/common/ipc/ctsvc_ipc_speeddial.c b/common/ipc/ctsvc_ipc_speeddial.c new file mode 100644 index 0000000..770ac63 --- /dev/null +++ b/common/ipc/ctsvc_ipc_speeddial.c @@ -0,0 +1,61 @@ +#include "ctsvc_ipc_macros.h" + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_speeddial(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_speeddial(const contacts_record_h record, pims_ipc_data_h ipc_data); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_speeddial_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_speeddial, + .marshal_record = __ctsvc_ipc_marshal_speeddial, + .get_primary_id = NULL +}; + + +static int __ctsvc_ipc_unmarshal_speeddial(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_speeddial_s* speeddial_p = (ctsvc_speeddial_s*) record; + do { + if (ctsvc_ipc_unmarshal_int(ipc_data, &speeddial_p->number_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &speeddial_p->person_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &speeddial_p->display_name) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &speeddial_p->image_thumbnail_path) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &speeddial_p->number_type) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &speeddial_p->label) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &speeddial_p->number) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &speeddial_p->dial_number) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_speeddial(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_speeddial_s* speeddial_p = (ctsvc_speeddial_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(speeddial_p==NULL,CONTACTS_ERROR_NO_DATA); + do { + if (ctsvc_ipc_marshal_int((speeddial_p->number_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((speeddial_p->person_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((speeddial_p->display_name),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((speeddial_p->image_thumbnail_path),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((speeddial_p->number_type),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((speeddial_p->label),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((speeddial_p->number),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((speeddial_p->dial_number),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + diff --git a/common/ipc/ctsvc_ipc_updated_info.c b/common/ipc/ctsvc_ipc_updated_info.c new file mode 100644 index 0000000..6398128 --- /dev/null +++ b/common/ipc/ctsvc_ipc_updated_info.c @@ -0,0 +1,55 @@ +#include "ctsvc_ipc_macros.h" + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_updated_info(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_updated_info(const contacts_record_h record, pims_ipc_data_h ipc_data); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_updated_info_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_updated_info, + .marshal_record = __ctsvc_ipc_marshal_updated_info, + .get_primary_id = NULL +}; + + +static int __ctsvc_ipc_unmarshal_updated_info(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_updated_info_s* updated_info_p = (ctsvc_updated_info_s*) record; + + do { + if (ctsvc_ipc_unmarshal_int(ipc_data,&updated_info_p->changed_type) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data,&updated_info_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data,&updated_info_p->changed_ver) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data,&updated_info_p->addressbook_id) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_updated_info(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_updated_info_s* updated_info_p = (ctsvc_updated_info_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(updated_info_p==NULL,CONTACTS_ERROR_NO_DATA); + + + do { + if (ctsvc_ipc_marshal_int((updated_info_p->changed_type),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((updated_info_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((updated_info_p->changed_ver),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((updated_info_p->addressbook_id),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} diff --git a/common/ipc/ctsvc_ipc_url.c b/common/ipc/ctsvc_ipc_url.c new file mode 100644 index 0000000..b2a17d6 --- /dev/null +++ b/common/ipc/ctsvc_ipc_url.c @@ -0,0 +1,64 @@ +#include "ctsvc_ipc_macros.h" + +#include "ctsvc_internal.h" +#include "ctsvc_ipc_marshal.h" +#include "contacts_record.h" + +static int __ctsvc_ipc_unmarshal_url(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record); +static int __ctsvc_ipc_marshal_url(const contacts_record_h record, pims_ipc_data_h ipc_data); +static int __ctsvc_ipc_marshal_url_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id); + +ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_url_plugin_cb = { + .unmarshal_record = __ctsvc_ipc_unmarshal_url, + .marshal_record = __ctsvc_ipc_marshal_url, + .get_primary_id = __ctsvc_ipc_marshal_url_get_primary_id +}; + + +static int __ctsvc_ipc_unmarshal_url(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record) +{ + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(record==NULL,CONTACTS_ERROR_NO_DATA); + + ctsvc_url_s* url_p = (ctsvc_url_s*) record; + + do { + if (ctsvc_ipc_unmarshal_int(ipc_data, &url_p->id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &url_p->contact_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_int(ipc_data, &url_p->type) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &url_p->label) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &url_p->url) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_unmarshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_url(const contacts_record_h record, pims_ipc_data_h ipc_data) +{ + ctsvc_url_s* url_p = (ctsvc_url_s*)record; + RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA); + RETV_IF(url_p==NULL,CONTACTS_ERROR_NO_DATA); + + do { + if (ctsvc_ipc_marshal_int((url_p->id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((url_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_int((url_p->type),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((url_p->label),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((url_p->url),ipc_data) != CONTACTS_ERROR_NONE) break; + + return CONTACTS_ERROR_NONE; + } while(0); + + CTS_ERR("_ctsvc_ipc_marshal fail"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_ipc_marshal_url_get_primary_id(const contacts_record_h record, unsigned int *property_id, int *id) +{ + *property_id = CTSVC_PROPERTY_URL_ID; + return contacts_record_get_int(record, *property_id, id ); +} + diff --git a/contacts-service2.manifest b/contacts-service2.manifest new file mode 100644 index 0000000..6c867d6 --- /dev/null +++ b/contacts-service2.manifest @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + diff --git a/debian/changelog b/debian/changelog deleted file mode 100644 index 04ff60e..0000000 --- a/debian/changelog +++ /dev/null @@ -1,7 +0,0 @@ -contacts-service (0.5.2-37) unstable; urgency=low - - * release - * Git: pkgs/c/contacts-service - * Tag: contacts-service_0.5.2-37 - - -- Youngjae Shin Tue, 21 Feb 2012 18:36:56 +0900 diff --git a/debian/libcontacts-service.postinst.in b/debian/libcontacts-service.postinst.in deleted file mode 100755 index 14aef55..0000000 --- a/debian/libcontacts-service.postinst.in +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -if [ "$USER" = "root" ] -then -# Change file owner - chown root:root @PREFIX@/lib/libcontacts-service.so.* - chown :6005 -R /opt/data/contacts-svc/img - chown :6005 /opt/data/contacts-svc/.CONTACTS_SVC_* - vconftool set -t int db/service/contacts/name_sorting_order 0 -g 6005 - vconftool set -t int db/service/contacts/name_display_order 0 -g 6005 -else - vconftool set -t int db/service/contacts/name_sorting_order 0 - vconftool set -t int db/service/contacts/name_display_order 0 -fi - -# Change file permissions -# chmod 644 /usr/lib/libcontacts-service.so -chmod 660 /opt/data/contacts-svc/.CONTACTS_SVC_* -chmod 770 -R /opt/data/contacts-svc/img - -echo "Done" diff --git a/debian_NOT_USED/changelog b/debian_NOT_USED/changelog new file mode 100755 index 0000000..c35c3be --- /dev/null +++ b/debian_NOT_USED/changelog @@ -0,0 +1,2240 @@ +contacts-service (0.9.10) unstable; urgency=low + + * Fix bugs, Change view_uri + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.9.10 + + -- Donghee Ye Thu, 27 Dec 2012 11:25:45 +0900 + +contacts-service (0.9.6) unstable; urgency=low + + * Fix bugs, Add new notification mechanishm + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.9.6 + + -- Donghee Ye Fri, 7 Dec 2012 11:25:45 +0900 + +contacts-service (0.8.27) unstable; urgency=low + + * Apply IPC version + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.8.27 + + -- Donghee Ye Tue, 27 Nov 2012 11:25:45 +0900 + +contacts-service (0.8.5.1-1) unstable; urgency=low + + * Add manifest file + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.8.5.1-1 + + -- Donghee Ye Fri, 2 Nov 2012 11:25:45 +0900 + +contacts-service (0.8.5-1) unstable; urgency=low + + * Add new managed API + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.8.5-1 + + -- Donghee Ye Wed, 17 Oct 2012 11:25:45 +0900 + +contacts-service (0.7.33-1) unstable; urgency=low + + * fix Fix timeout crash problem + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.32-1 + + -- DoHyung Jin Wed, 19 Sep 2012 11:25:45 +0900 + +contacts-service (0.7.32-1) unstable; urgency=low + + * fix query of CTS_LIST_PLOG_OF_PERSON_ID + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.32-1 + + -- DoHyung Jin Wed, 19 Sep 2012 11:25:45 +0900 + +contacts-service (0.7.31-1) unstable; urgency=low + + * when language changed, update display_name_language + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.31-1 + + -- DoHyung Jin Wed, 19 Sep 2012 11:25:45 +0900 + +contacts-service (0.7.30-1) unstable; urgency=low + + * fix seg_falut when callback from tapi sim + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.30-1 + + -- DoHyung Jin Wed, 19 Sep 2012 11:25:45 +0900 + +contacts-service (0.7.29-1) unstable; urgency=low + + * version update error fix + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.29-1 + + -- JongWon Lee Wed, 19 Sep 2012 11:25:45 +0900 + +contacts-service (0.7.28-1) unstable; urgency=low + + * version update error fix + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.28-1 + + -- JongWon Lee Wed, 19 Sep 2012 11:25:45 +0900 + +contacts-service (0.7.26-1) unstable; urgency=low + + * add manifest file + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.26-1 + + -- JongWon Lee Wed, 19 Sep 2012 11:25:45 +0900 + +contacts-service (0.7.25-1) unstable; urgency=low + + * Fix search by number failure + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.25-1 + + -- JongWon Lee Wed, 19 Sep 2012 11:25:45 +0900 + +contacts-service (0.7.24-1) unstable; urgency=low + + * Fix add resize image / fix CTS_FILTERED_ALL_CONTACT problem + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.24-1 + + -- JongWon Lee Wed, 19 Sep 2012 11:25:45 +0900 + +contacts-service (0.7.23-1) unstable; urgency=low + + * Fix build error : make display name for vcard contact + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.23-1 + + -- JongWon Lee Fri, 14 Sep 2012 19:10:03 +0900 + +contacts-service (0.7.22-1) unstable; urgency=low + + * Fix build error : changed systemd header file path + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.22-1 + + -- DongHee Ye Fri, 14 Sep 2012 11:02:26 +0900 + +contacts-service (0.7.21-1) unstable; urgency=low + + * fix Disable auto link + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.21-1 + + -- JongWon Lee Thu, 13 Sep 2012 22:10:00 +0900 + +contacts-service (0.7.20-1) unstable; urgency=low + + * fix add phonelog statistic functions + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.20-1 + + -- JongWon Lee Wed, 12 Sep 2012 17:49:00 +0900 + +contacts-service (0.7.19-1) unstable; urgency=low + + * fix remove C/S communication while normalizing name or string / add contacts_svc_get_vcard_from_person + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.19-1 + + -- JongWon Lee Tue, 11 Sep 2012 19:22:00 +0900 + +contacts-service (0.7.18-1) unstable; urgency=low + + * fix Auto Link + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.18-1 + + -- JongWon Lee Mon, 10 Sep 2012 20:24:00 +0900 + +contacts-service (0.7.17-1) unstable; urgency=low + + * fix set has_phonenumber, has_email when update contact + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.17-1 + + -- JongWon Lee Mon, 10 Sep 2012 11:21:00 +0900 + +contacts-service (0.7.16-1) unstable; urgency=low + + * fix set has_phonenumber, has_email when update contact + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.16-1 + + -- JongWon Lee Fri, 7 Sep 2012 18:21:00 +0900 + +contacts-service (0.7.15-1) unstable; urgency=low + + * fix add activity delete function + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.15-1 + + -- JongWon Lee Tue, 4 Sep 2012 19:50:01 +0900 + +contacts-service (0.7.14-1) unstable; urgency=low + + * fix fix list members of group_id + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.14-1 + + -- JongWon Lee Tue, 4 Sep 2012 16:04:02 +0900 + +contacts-service (0.7.13-1) unstable; urgency=low + + * fix fix emailinfo list / fix label of number,email,web,postal + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.13-1 + + -- JongWon Lee Tue, 4 Sep 2012 13:45:24 +0900 + +contacts-service (0.7.12-1) unstable; urgency=low + + * fix fix smartsearch list / fix account delete + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.12-1 + + -- JongWon Lee Mon, 3 Sep 2012 17:05:03 +0900 + +contacts-service (0.7.10-1) unstable; urgency=low + + * fix fix person link + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.10-1 + + -- JongWon Lee Fri, 31 Aug 2012 21:25:01 +0900 + +contacts-service (0.7.9-1) unstable; urgency=low + + * fix change number normalization style / set phone default number, email/ fix plog problem + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.9-1 + + -- JongWon Lee Thu, 30 Aug 2012 19:57:32 +0900 + +contacts-service (0.7.8-1) unstable; urgency=low + + * fix group thumbnail path problem/search by name problem/add is_primary_default to data table / activity is deleted when contact is deleted + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.8-1 + + -- JongWon Lee Thu, 30 Aug 2012 14:27:53 +0900 + +contacts-service (0.7.7-1) unstable; urgency=low + + * fix Fix contact struct duplicate problem + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.7-1 + + -- JongWon Lee Tue, 28 Aug 2012 19:40:21 +0900 + +contacts-service (0.7.6-1) unstable; urgency=low + + * fix Person Notification/ contact struct duplicate + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.6-1 + + -- JongWon Lee Mon, 27 Aug 2012 11:11:23 +0900 + +contacts-service (0.7.5-1) unstable; urgency=low + + * fix fix default number, email problems/ fix speed_number column in speeddials table + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.5-1 + + -- JongWon Lee Fri, 24 Aug 2012 19:21:52 +0900 + +contacts-service (0.7.4-1) unstable; urgency=low + + * fix change sortkey collation / remove contact unnecessary trigger + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.4-1 + + -- JongWon Lee Wed, 22 Aug 2012 19:22:23 +0900 + +contacts-service (0.7.3-1) unstable; urgency=low + + * fix fix person notification / add vibration + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.3-1 + + -- JongWon Lee Tue, 21 Aug 2012 17:02:23 +0900 + +contacts-service (0.7.2-1) unstable; urgency=low + + * fix the mis-implementaion about deleting group & writing deleted_group + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.2-1 + + -- DoHyung Jin Tue, 21 Aug 2012 15:02:21 +0900 + +contacts-service (0.7.1-1) unstable; urgency=low + + * Apply new db schema + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.7.1-1 + + -- JongWon Lee Mon, 20 Aug 2012 13:48:04 +0900 + +contacts-service (0.6.15-1) unstable; urgency=low + + * removal of dlogutil script + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.6.15-1 + + -- DoHyung Jin Mon, 20 Aug 2012 09:58:04 +0900 + +contacts-service (0.6.14-1) unstable; urgency=low + + * Fix get empty_pb_count + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.6.14-1 + + -- DongHee Ye Fri, 17 Aug 2012 19:54:37 +0900 + +contacts-service (0.6.13-1) unstable; urgency=low + + * Add API to get sim empty slot count + * Git: framework/pim/contacts-service + * Tag: contacts-service_0.6.13-1 + + -- DongHee Ye Mon, 13 Aug 2012 17:13:22 +0900 + +contacts-service (0.6.12-1) unstable; urgency=low + + * Apply new TAPI + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.12-1 + + -- DongHee Ye Wed, 08 Aug 2012 10:34:40 +0900 + +contacts-service (0.6.11-1) unstable; urgency=low + + * Add CTS_LIST_CHANGE_ADDRESSBOOK_ID_INT + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.11-1 + + -- DoHyung Jin Tue, 07 Aug 2012 10:48:57 +0900 + +contacts-service (0.6.10-1) unstable; urgency=low + + * change hard code "20000 -> CTS_GET_COUNT_GROUPS_IN_ADDRESSBOOK" + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.10-1 + + -- DoHyung Jin Wed, 25 Jul 2012 18:23:34 +0900 + +contacts-service (0.6.9-1) unstable; urgency=low + + * for OSP - permission of making transparent filter + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.9-1 + + -- DoHyung Jin Mon, 23 Jul 2012 16:42:55 +0900 + +contacts-service (0.6.8-1) unstable; urgency=low + + * Add enum to get count of incoming/outgoing call + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.8-1 + + -- DongHee Ye Wed, 18 Jul 2012 21:57:53 +0900 + +contacts-service (0.6.7-1) unstable; urgency=low + + * Update version for submit request + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.7-1 + + -- Donghee Ye Thu, 12 Jul 2012 22:28:47 +0900 + +contacts-service (0.6.6-1) unstable; urgency=low + + * Add log create + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.6-1 + + -- Donghee Ye Thu, 12 Jul 2012 21:54:24 +0900 + +contacts-service (0.6.5-1) unstable; urgency=low + + * Fix : update cts_version when changing group + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.5-1 + + -- Donghee Ye Fri, 06 Jul 2012 14:48:43 +0900 + +contacts-service (0.6.4-1) unstable; urgency=low + + * Fix filter bugs + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.4-1 + + -- DongHee Ye Tue, 03 Jul 2012 18:03:20 +0900 + +contacts-service (0.6.3-1) unstable; urgency=low + + * Enable to add/delete email logs + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.3-1 + + -- Donghee Ye Tue, 26 Jun 2012 17:36:15 +0900 + +contacts-service (0.6.2-1) unstable; urgency=low + + * Fix group relation + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.2-1 + + -- Donghee Ye Wed, 13 Jun 2012 23:26:06 +0900 + +contacts-service (0.6.1-19) unstable; urgency=low + + * Add feature for OSP : group ringtone return, group relation change + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-19 + + -- Donghee Ye Thu, 07 Jun 2012 23:29:08 +0900 + +contacts-service (0.6.1-18) unstable; urgency=low + + * Add feature for OSP : group count, default number of contact list + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-18 + + -- Donghee Ye Wed, 30 May 2012 20:52:08 +0900 + +contacts-service (0.6.1-17) unstable; urgency=low + + * Change vconf key name + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-17 + + -- Donghee Ye Fri, 25 May 2012 15:00:00 +0900 + +contacts-service (0.6.1-16) unstable; urgency=low + + * Add feature : to get phonelogs of person (history) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-16 + + -- Donghee Ye Fri, 25 May 2012 09:42:39 +0900 + +contacts-service (0.6.1-15) unstable; urgency=low + + * Add feature : myprofile + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-15 + + -- Donghee Ye Thu, 24 May 2012 09:06:24 +0900 + +contacts-service (0.6.1-14) unstable; urgency=low + + * Add feature : set group image + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-14 + + -- Donghee Ye Fri, 11 May 2012 13:50:27 +0900 + +contacts-service (0.6.1-13) unstable; urgency=low + + * fix bugs(chang language) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-13 + + -- Youngjae Shin Mon, 30 Apr 2012 16:45:13 +0900 + +contacts-service (0.6.1-12) unstable; urgency=low + + * fix bugs(socket and outgoing count). + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-12 + + -- Youngjae Shin Fri, 27 Apr 2012 10:56:30 +0900 + +contacts-service (0.6.1-11) unstable; urgency=low + + * Add CTS_LIST_ALL_UNSEEN_MISSED_CALL + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-11 + + -- Donghee Ye Tue, 10 Apr 2012 16:55:49 +0900 + +contacts-service (0.6.1-10) unstable; urgency=low + + * fix bug on emulator + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-10 + + -- Youngjae Shin Mon, 09 Apr 2012 11:51:00 +0900 + +contacts-service (0.6.1-9) unstable; urgency=low + + * fix bug(image handling) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-9 + + -- Youngjae Shin Thu, 05 Apr 2012 10:22:33 +0900 + +contacts-service (0.6.1-8) unstable; urgency=low + + * fix bug(vcard parser) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-8 + + -- Youngjae Shin Tue, 03 Apr 2012 20:09:09 +0900 + +contacts-service (0.6.1-7) unstable; urgency=low + + * Fix smartsearch query in case of searching by number + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-7 + + -- Donghee Ye Fri, 30 Mar 2012 11:08:19 +0900 + +contacts-service (0.6.1-6) unstable; urgency=low + + * fix bug(image handling) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-6 + + -- Youngjae Shin Thu, 29 Mar 2012 08:38:20 +0900 + +contacts-service (0.6.1-5) unstable; urgency=low + + * Fix smartsearch query + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-5 + + -- Donghee Ye Wed, 28 Mar 2012 19:55:12 +0900 + +contacts-service (0.6.1-4) unstable; urgency=low + + * fix memory leak + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-4 + + -- Youngjae Shin Mon, 26 Mar 2012 11:42:11 +0900 + +contacts-service (0.6.1-3) unstable; urgency=low + + * fix bug + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-3 + + -- Youngjae Shin Wed, 21 Mar 2012 10:13:44 +0900 + +contacts-service (0.6.1-2) unstable; urgency=low + + * apply revised telephony + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-2 + + -- Youngjae Shin Mon, 19 Mar 2012 21:20:46 +0900 + +contacts-service (0.6.1-1) unstable; urgency=low + + * handling restricted data AND quoted printable + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.1-1 + + -- Youngjae Shin Sat, 03 Mar 2012 15:23:35 +0900 + +contacts-service (0.6.0-2) unstable; urgency=low + + * make strong in thread for transaction functions + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.0-2 + + -- Youngjae Shin Mon, 27 Feb 2012 20:56:07 +0900 + +contacts-service (0.6.0-1) unstable; urgency=low + + * added link mechanism + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.6.0-1 + + -- Youngjae Shin Mon, 27 Feb 2012 14:25:42 +0900 + +contacts-service (0.5.2-37) unstable; urgency=low + + * fix bug(group relation while inserting contact) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-37 + + -- Youngjae Shin Tue, 21 Feb 2012 18:36:56 +0900 + +contacts-service (0.5.2-36) unstable; urgency=low + + * revise doxygen + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-36 + + -- Youngjae Shin Fri, 10 Feb 2012 14:42:34 +0900 + +contacts-service (0.5.2-35) unstable; urgency=low + + * fix bug(normalize and missed call noti) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-35 + + -- Youngjae Shin Wed, 08 Feb 2012 21:23:06 +0900 + +contacts-service (0.5.2-34) unstable; urgency=low + + * fix bug(normalize overflow) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-34 + + -- Youngjae Shin Tue, 31 Jan 2012 18:15:29 +0900 + +contacts-service (0.5.2-33) unstable; urgency=low + + * fix bugs + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-33 + + -- Youngjae Shin Sat, 28 Jan 2012 11:54:30 +0900 + +contacts-service (0.5.2-32) unstable; urgency=low + + * fix bug(uid updating) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-32 + + -- Youngjae Shin Thu, 19 Jan 2012 15:25:29 +0900 + +contacts-service (0.5.2-31) unstable; urgency=low + + * fix bugs(vcard note) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-31 + + -- Youngjae Shin Fri, 13 Jan 2012 14:34:53 +0900 + +contacts-service (0.5.2-30) unstable; urgency=low + + * fix busg and revise doxygen + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-30 + + -- Youngjae Shin Fri, 06 Jan 2012 17:33:07 +0900 + +contacts-service (0.5.2-29) unstable; urgency=low + + * fix bugs + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-29 + + -- Youngjae Shin Mon, 02 Jan 2012 13:35:53 +0900 + +contacts-service (0.5.2-28) unstable; urgency=low + + * line up cts_str_filter_op + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-28 + + -- Youngjae Shin Wed, 28 Dec 2011 19:34:34 +0900 + +contacts-service (0.5.2-27) unstable; urgency=low + + * change function name + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-27 + + -- Youngjae Shin Wed, 28 Dec 2011 14:44:02 +0900 + +contacts-service (0.5.2-26) unstable; urgency=low + + * change type from cts_find_contact_op to cts_find_op + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-26 + + -- Youngjae Shin Wed, 21 Dec 2011 11:06:00 +0900 + +contacts-service (0.5.2-25) unstable; urgency=low + + * fix errata + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-25 + + -- Youngjae Shin Tue, 20 Dec 2011 20:40:33 +0900 + +contacts-service (0.5.2-24) unstable; urgency=low + + * fix helper socket ipc + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-24 + + -- Youngjae Shin Wed, 14 Dec 2011 16:38:02 +0900 + +contacts-service (0.5.2-23) unstable; urgency=low + + * cleanup + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-23 + + -- Youngjae Shin Thu, 08 Dec 2011 17:06:54 +0900 + +contacts-service (0.5.2-22) unstable; urgency=low + + * revise handling photo + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-22 + + -- Youngjae Shin Tue, 06 Dec 2011 18:09:35 +0900 + +contacts-service (0.5.2-21) unstable; urgency=low + + * fix bug + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-21 + + -- Youngjae Shin Thu, 01 Dec 2011 12:48:38 +0900 + +contacts-service (0.5.2-20) unstable; urgency=low + + * debugging vcard parser + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-20 + + -- Youngjae Shin Tue, 29 Nov 2011 11:06:43 +0900 + +contacts-service (0.5.2-19) unstable; urgency=low + + * debug contacts_svc_smartsearch_excl() + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-19 + + -- Youngjae Shin Tue, 22 Nov 2011 17:07:18 +0900 + +contacts-service (0.5.2-18) unstable; urgency=low + + * revise contacts_svc_phonelog_set_seen() + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-18 + + -- Youngjae Shin Mon, 21 Nov 2011 16:14:48 +0900 + +contacts-service (0.5.2-17) unstable; urgency=low + + * Remove unused code, add normalized_strstr + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-17 + + -- Donghee Ye Thu, 17 Nov 2011 15:53:14 +0900 + +contacts-service (0.5.2-16) unstable; urgency=low + + * remove duplicated data when insert and update + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-16 + + -- Youngjae Shin Mon, 14 Nov 2011 10:09:39 +0900 + +contacts-service (0.5.2-15) unstable; urgency=low + + * fix bug(number and email list) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-15 + + -- Youngjae Shin Tue, 08 Nov 2011 15:04:49 +0900 + +contacts-service (0.5.2-14) unstable; urgency=low + + * fix BS(handling no_name) and add type for contacts_svc_get_list + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-14 + + -- Youngjae Shin Mon, 07 Nov 2011 14:44:34 +0900 + +contacts-service (0.5.2-13) unstable; urgency=low + + * revise + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-13 + + -- Youngjae Shin Sat, 05 Nov 2011 19:21:12 +0900 + +contacts-service (0.5.2-12) unstable; urgency=low + + * fix BS + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-12 + + -- Youngjae Shin Thu, 03 Nov 2011 09:47:47 +0900 + +contacts-service (0.5.2-11) unstable; urgency=low + + * revise no name and fix bug(email searched list) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-11 + + -- Youngjae Shin Wed, 02 Nov 2011 21:34:11 +0900 + +contacts-service (0.5.2-10) unstable; urgency=low + + * revise numer handling(support 'P' and 'w' and remove invalid speeddial) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-10 + + -- Youngjae Shin Mon, 31 Oct 2011 16:12:45 +0900 + +contacts-service (0.5.2-9) unstable; urgency=low + + * fix bug(defult number and email) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-9 + + -- Youngjae Shin Sat, 29 Oct 2011 17:42:50 +0900 + +contacts-service (0.5.2-8) unstable; urgency=low + + * fix BS and revise vcard parsing + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-8 + + -- Youngjae Shin Fri, 28 Oct 2011 17:29:11 +0900 + +contacts-service (0.5.2-7) unstable; urgency=low + + * fix bug(update number and email) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-7 + + -- Youngjae Shin Thu, 27 Oct 2011 08:31:23 +0900 + +contacts-service (0.5.2-6) unstable; urgency=low + + * fix memory leak + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-6 + + -- Youngjae Shin Wed, 26 Oct 2011 16:24:35 +0900 + +contacts-service (0.5.2-5) unstable; urgency=low + + * Fix build error + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-5 + + -- Donghee Ye Fri, 21 Oct 2011 21:51:09 +0900 + +contacts-service (0.5.2-4) unstable; urgency=low + + * change vconf key of system language + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-4 + + -- Youngjae Shin Fri, 21 Oct 2011 17:49:16 +0900 + +contacts-service (0.5.2-3) unstable; urgency=low + + * update icu + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-3 + + -- Youngjae Shin Thu, 20 Oct 2011 20:54:52 +0900 + +contacts-service (0.5.2-2) unstable; urgency=low + + * fix bug(ordering) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-2 + + -- Youngjae Shin Wed, 19 Oct 2011 21:02:07 +0900 + +contacts-service (0.5.2-1) unstable; urgency=low + + * revise vcard encoding + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.2-1 + + -- Youngjae Shin Mon, 17 Oct 2011 21:58:09 +0900 + +contacts-service (0.5.1-5) unstable; urgency=low + + * fix bug(speeddial) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.1-5 + + -- Youngjae Shin Tue, 11 Oct 2011 15:37:59 +0900 + +contacts-service (0.5.1-4) unstable; urgency=low + + * revise vcard handling + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.1-4 + + -- Youngjae Shin Sat, 08 Oct 2011 07:16:20 +0900 + +contacts-service (0.5.1-3) unstable; urgency=low + + * fix bug(update number and email) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.1-3 + + -- Youngjae Shin Fri, 07 Oct 2011 13:43:00 +0900 + +contacts-service (0.5.1-2) unstable; urgency=low + + * fix bug + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.1-2 + + -- Youngjae Shin Thu, 06 Oct 2011 20:14:15 +0900 + +contacts-service (0.5.1-1) unstable; urgency=low + + * change schema + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.5.1-1 + + -- Youngjae Shin Thu, 06 Oct 2011 10:49:29 +0900 + +contacts-service (0.4.2-7) unstable; urgency=low + + * revise missed call handling + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.4.2-7 + + -- Youngjae Shin Wed, 05 Oct 2011 14:28:59 +0900 + +contacts-service (0.4.2-6) unstable; urgency=low + + * fix bug + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.4.2-6 + + -- Youngjae Shin Tue, 04 Oct 2011 19:49:45 +0900 + +contacts-service (0.4.2-5) unstable; urgency=low + + * change address type + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.4.2-5 + + -- Youngjae Shin Mon, 03 Oct 2011 13:28:47 +0900 + +contacts-service (0.4.2-4) unstable; urgency=low + + * fix bug + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.4.2-4 + + -- Youngjae Shin Thu, 29 Sep 2011 17:19:09 +0900 + +contacts-service (0.4.2-3) unstable; urgency=low + + * revise contacts-service + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.4.2-3 + + -- Youngjae Shin Thu, 29 Sep 2011 15:00:50 +0900 + +contacts-service (0.4.2-2) unstable; urgency=low + + * fix errata + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.4.2-2 + + -- Youngjae Shin Wed, 28 Sep 2011 10:40:01 +0900 + +contacts-service (0.4.2-1) unstable; urgency=low + + * revise updated_contacts and support bada + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.4.2-1 + + -- Youngjae Shin Tue, 27 Sep 2011 13:20:36 +0900 + +contacts-service (0.4.1-2) unstable; urgency=low + + * fix bug of phonelog + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.4.1-2 + + -- Youngjae Shin Mon, 26 Sep 2011 13:23:41 +0900 + +contacts-service (0.4.1-1) unstable; urgency=low + + * revise iterator + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.4.1-1 + + -- Youngjae Shin Fri, 23 Sep 2011 17:59:57 +0900 + +contacts-service (0.3.4-4) unstable; urgency=low + + * add list of all phonelog + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.4-4 + + -- Youngjae Shin Wed, 07 Sep 2011 20:49:43 +0900 + +contacts-service (0.3.4-3) unstable; urgency=low + + * revise image handling + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.4-3 + + -- Youngjae Shin Mon, 05 Sep 2011 10:44:15 +0900 + +contacts-service (0.3.4-2) unstable; urgency=low + + * revise + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.4-2 + + -- Youngjae Shin Thu, 01 Sep 2011 22:24:11 +0900 + +contacts-service (0.3.4-1) unstable; urgency=low + + * revise vcard + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.4-1 + + -- Youngjae Shin Wed, 31 Aug 2011 17:43:51 +0900 + +contacts-service (0.3.3-1) unstable; urgency=low + + * add struct handling functions + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.3-1 + + -- Youngjae Shin Sat, 27 Aug 2011 15:35:36 +0900 + +contacts-service (0.3.2-7) unstable; urgency=low + + * modify by prevent comment + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.2-7 + + -- Youngjae Shin Tue, 23 Aug 2011 11:24:06 +0900 + +contacts-service (0.3.2-6) unstable; urgency=low + + * revise vcard parser + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.2-6 + + -- Youngjae Shin Thu, 18 Aug 2011 08:20:47 +0900 + +contacts-service (0.3.2-5) unstable; urgency=low + + * revise to handle write() + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.2-5 + + -- Youngjae Shin Wed, 17 Aug 2011 16:34:05 +0900 + +contacts-service (0.3.2-4) unstable; urgency=low + + * revise to handle sqlite errors + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.2-4 + + -- Youngjae Shin Tue, 16 Aug 2011 18:22:18 +0900 + +contacts-service (0.3.2-3) unstable; urgency=low + + * revise vcard parsing + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.2-3 + + -- Youngjae Shin Wed, 10 Aug 2011 15:38:41 +0900 + +contacts-service (0.3.2-2) unstable; urgency=low + + * revise version mechanism + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.2-2 + + -- Youngjae Shin Wed, 10 Aug 2011 10:45:06 +0900 + +contacts-service (0.3.2-1) unstable; urgency=low + + * apply version + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.2-1 + + -- Youngjae Shin Tue, 09 Aug 2011 20:24:14 +0900 + +contacts-service (0.3.1-9) unstable; urgency=low + + * fix errata + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.1-9 + + -- Youngjae Shin Fri, 05 Aug 2011 10:02:08 +0900 + +contacts-service (0.3.1-8) unstable; urgency=low + + * revise contacts-service + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.1-8 + + -- Youngjae Shin Wed, 03 Aug 2011 18:56:18 +0900 + +contacts-service (0.3.1-7) unstable; urgency=low + + * add display name handling code + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.1-7 + + -- Youngjae Shin Tue, 26 Jul 2011 19:38:25 +0900 + +contacts-service (0.3.1-6) unstable; urgency=low + + * revise contacts-service + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.1-6 + + -- Youngjae Shin Mon, 25 Jul 2011 21:37:40 +0900 + +contacts-service (0.3.1-5) unstable; urgency=low + + * revise vcard parsing + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.1-5 + + -- Youngjae Shin Sat, 23 Jul 2011 17:20:42 +0900 + +contacts-service (0.3.1-4) unstable; urgency=low + + * fix bug for making vcard + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.1-4 + + -- Youngjae Shin Sat, 23 Jul 2011 11:59:01 +0900 + +contacts-service (0.3.1-3) unstable; urgency=low + + * check duplicated contacts for importing sim + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.1-3 + + -- Youngjae Shin Sat, 23 Jul 2011 10:48:25 +0900 + +contacts-service (0.3.1-2) unstable; urgency=low + + * revise error handling code for inotify + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.1-2 + + -- Youngjae Shin Thu, 21 Jul 2011 10:59:52 +0900 + +contacts-service (0.3.1-1) unstable; urgency=low + + * remove the dependeny with vobject service + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.1-1 + + -- Youngjae Shin Tue, 19 Jul 2011 10:17:59 +0900 + +contacts-service (0.3.0-5) unstable; urgency=low + + * fix bug + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.0-5 + + -- Youngjae Shin Thu, 14 Jul 2011 18:33:16 +0900 + +contacts-service (0.3.0-4) unstable; urgency=low + + * revise contacts-service + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.0-4 + + -- Youngjae Shin Wed, 13 Jul 2011 13:23:28 +0900 + +contacts-service (0.3.0-3) unstable; urgency=low + + * fix prevent bug + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.0-3 + + -- Youngjae Shin Fri, 08 Jul 2011 18:35:20 +0900 + +contacts-service (0.3.0-2) unstable; urgency=low + + * add noti for modifing addressbook + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.0-2 + + -- Youngjae Shin Thu, 07 Jul 2011 15:21:36 +0900 + +contacts-service (0.3.0-1) unstable; urgency=low + + * add concepts of addressbook + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.3.0-1 + + -- Youngjae Shin Mon, 04 Jul 2011 21:25:36 +0900 + +contacts-service (0.2.14-2) unstable; urgency=low + + * fix errata + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.14-2 + + -- Youngjae Shin Thu, 30 Jun 2011 09:06:43 +0900 + +contacts-service (0.2.14-1) unstable; urgency=low + + * add contacts_svc_unsubscribe_change_with_data() + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.14-1 + + -- Youngjae Shin Wed, 29 Jun 2011 17:31:03 +0900 + +contacts-service (0.2.13-2) unstable; urgency=low + + * add doxygen about contacts_svc_get_phonelog() + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.13-2 + + -- Youngjae Shin Mon, 27 Jun 2011 15:19:27 +0900 + +contacts-service (0.2.13-1) unstable; urgency=low + + * change favorite and speeddial functions + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.13-1 + + -- Youngjae Shin Wed, 22 Jun 2011 21:07:31 +0900 + +contacts-service (0.2.12-15) unstable; urgency=low + + * fix bugs + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.12-15 + + -- Youngjae Shin Tue, 14 Jun 2011 18:32:28 +0900 + +contacts-service (0.2.12-14) unstable; urgency=low + + * check invalid string + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.12-14 + + -- Youngjae Shin Mon, 13 Jun 2011 19:54:33 +0900 + +contacts-service (0.2.12-13) unstable; urgency=low + + * add a operation of contacts_svc_get_contact_value + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.12-13 + + -- Youngjae Shin Mon, 13 Jun 2011 11:23:21 +0900 + +contacts-service (0.2.12-12) unstable; urgency=low + + * revise name ordering + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.12-12 + + -- Youngjae Shin Thu, 09 Jun 2011 14:37:02 +0900 + +contacts-service (0.2.12-11) unstable; urgency=low + + * change the policy for name ordering + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.12-11 + + -- Youngjae Shin Wed, 08 Jun 2011 14:21:52 +0900 + +contacts-service (0.2.12-10) unstable; urgency=low + + * fix socket handling + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.12-10 + + -- Youngjae Shin Wed, 08 Jun 2011 07:54:17 +0900 + +contacts-service (0.2.12-9) unstable; urgency=low + + * fix BS + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.12-9 + + -- Youngjae Shin Fri, 03 Jun 2011 15:41:10 +0900 + +contacts-service (0.2.12-8) unstable; urgency=low + + * fix errta + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.12-8 + + -- Youngjae Shin Thu, 26 May 2011 15:56:41 +0900 + +contacts-service (0.2.12-7) unstable; urgency=low + + * revise + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.12-7 + + -- Youngjae Shin Thu, 19 May 2011 15:01:31 +0900 + +contacts-service (0.2.12-6) unstable; urgency=low + + * sort group list + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.12-6 + + -- Youngjae Shin Tue, 17 May 2011 17:02:57 +0900 + +contacts-service (0.2.12-5) unstable; urgency=low + + * update icu + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.12-5 + + -- Youngjae Shin Mon, 16 May 2011 11:08:58 +0900 + +contacts-service (0.2.12-4) unstable; urgency=low + + * revise insert_contact(guarantee atomic) + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.12-4 + + -- Youngjae Shin Fri, 13 May 2011 20:25:44 +0900 + +contacts-service (0.2.12-3) unstable; urgency=low + + * add debugging code + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.12-3 + + -- Youngjae Shin Mon, 09 May 2011 18:35:41 +0900 + +contacts-service (0.2.12-2) unstable; urgency=low + + * debugging normalization + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.12-2 + + -- Youngjae Shin Thu, 05 May 2011 11:29:13 +0900 + +contacts-service (0.2.12-1) unstable; urgency=low + + * revise normalization and phonelog + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.12-1 + + -- Youngjae Shin Sat, 30 Apr 2011 16:45:38 +0900 + +contacts-service (0.2.11-4) unstable; urgency=low + + * change retry term + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.11-4 + + -- Youngjae Shin Fri, 15 Apr 2011 16:10:35 +0900 + +contacts-service (0.2.11-3) unstable; urgency=low + + * revise group api + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.11-3 + + -- Youngjae Shin Mon, 11 Apr 2011 11:46:47 +0900 + +contacts-service (0.2.11-2) unstable; urgency=low + + * fix TC + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.11-2 + + -- Youngjae Shin Mon, 04 Apr 2011 14:50:45 +0900 + +contacts-service (0.2.11-1) unstable; urgency=low + + * add normalization for number + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.11-1 + + -- Youngjae Sat, 26 Mar 2011 11:17:53 +0900 + +contacts-service (0.2.10-5) unstable; urgency=low + + * add contacts_svc_delete_group_with_members() + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.10-5 + + -- Youngjae Thu, 17 Mar 2011 17:43:29 +0900 + +contacts-service (0.2.10-4) unstable; urgency=low + + * fix bug + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.10-4 + + -- Youngjae Wed, 09 Mar 2011 20:55:38 +0900 + +contacts-service (0.2.10-3) unstable; urgency=low + + * add group notification + * Git: slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.10-3 + + -- Youngjae Wed, 09 Mar 2011 16:08:50 +0900 + +contacts-service (0.2.10-2) unstable; urgency=low + + * revise handling empty string and Unkown log + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.10-2 + + -- Youngjae Tue, 08 Mar 2011 11:06:57 +0900 + +contacts-service (0.2.10-1) unstable; urgency=low + + * change the policy of number types + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.10-1 + + -- Youngjae Tue, 01 Mar 2011 11:05:39 +0900 + +contacts-service (0.2.9-10) unstable; urgency=low + + * fix phonelog error + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.9-10 + + -- Youngjae Sat, 26 Feb 2011 11:17:32 +0900 + +contacts-service (0.2.9-9) unstable; urgency=low + + * fix errata + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.9-9 + + -- Youngjae Fri, 25 Feb 2011 15:44:30 +0900 + +contacts-service (0.2.9-8) unstable; urgency=low + + * fix bug + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.9-8 + + -- Youngjae Thu, 24 Feb 2011 15:19:29 +0900 + +contacts-service (0.2.9-7) unstable; urgency=low + + * fix some bug and revise retry mechanism + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.9-7 + + -- Youngjae Thu, 24 Feb 2011 13:44:54 +0900 + +contacts-service (0.2.9-6) unstable; urgency=low + + * revise lock mechanism and check constraint for handling group + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.9-6 + + -- Youngjae Shin Wed, 23 Feb 2011 17:56:47 +0900 + +contacts-service (0.2.9-5) unstable; urgency=low + + * fix prevent bug + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.9-5 + + -- Youngjae Shin Tue, 22 Feb 2011 13:44:54 +0900 + +contacts-service (0.2.9-4) unstable; urgency=low + + * support full image in a contact + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.9-4 + + -- Youngjae Shin Mon, 21 Feb 2011 17:59:20 +0900 + +contacts-service (0.2.9-3) unstable; urgency=low + + * remove MWC code in source. + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.9-3 + + -- Youngjae Shin Wed, 16 Feb 2011 19:36:17 +0900 + +contacts-service (0.2.9-2) unstable; urgency=low + + * handling contact struct which have no name and no id + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.9-2 + + -- Youngjae Shin Wed, 16 Feb 2011 12:08:48 +0900 + +contacts-service (0.2.9-1) unstable; urgency=low + + * remove MWC code + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.9-1 + + -- Youngjae Shin Mon, 14 Feb 2011 11:19:19 +0900 + +contacts-service (0.2.8-9MWC2011) unstable; urgency=low + + * revise handling invalid name + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.8-9MWC2011 + + -- Youngjae Shin Thu, 10 Feb 2011 09:36:32 +0900 + +contacts-service (0.2.8-8MWC2011) unstable; urgency=low + + * revise MWC code + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.8-8MWC2011 + + -- Youngjae Shin Mon, 31 Jan 2011 17:20:04 +0900 + +contacts-service (0.2.8-7MWC2011) unstable; urgency=low + + * add contacts_svc_value_get_type() + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.8-7MWC2011 + + -- Youngjae Shin Mon, 31 Jan 2011 09:23:25 +0900 + +contacts-service (0.2.8-6MWC2011) unstable; urgency=low + + * fix prevent errors + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.8-6MWC2011 + + -- Youngjae Shin Sat, 29 Jan 2011 15:34:17 +0900 + +contacts-service (0.2.8-5MWC2011) unstable; urgency=low + + * add options for contacts_svc_get_contact_value() + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.8-5MWC2011 + + -- Youngjae Shin Tue, 25 Jan 2011 19:41:50 +0900 + +contacts-service (0.2.8-4MWC2011) unstable; urgency=low + + * fix prevent errors + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.8-4MWC2011 + + -- Youngjae Shin Sat, 22 Jan 2011 14:11:58 +0900 + +contacts-service (0.2.8-3MWC2011) unstable; urgency=low + + * handle NULL pointer + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.8-3MWC2011 + + -- Youngjae Shin Thu, 20 Jan 2011 08:49:36 +0900 + +contacts-service (0.2.8-2MWC2011) unstable; urgency=low + + * add UID for MWC2011 + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.8-2MWC2011 + + -- Youngjae Shin Tue, 18 Jan 2011 11:02:03 +0900 + +contacts-service (0.2.8-1MWC2011) unstable; urgency=low + + * debugging MWC code + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.8-1MWC2011 + + -- Youngjae Shin Thu, 13 Jan 2011 20:58:41 +0900 + +contacts-service (0.2.7.MWC2011-3) unstable; urgency=low + + * rebuild + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.7.MWC2011-3 + + -- Youngjae Shin Thu, 13 Jan 2011 14:29:44 +0900 + +contacts-service (0.2.7.MWC2011-2) unstable; urgency=low + + * revise postinst + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.7.MWC2011-2 + + -- Youngjae Shin Thu, 13 Jan 2011 11:17:47 +0900 + +contacts-service (0.2.7.MWC2011-1) unstable; urgency=low + + * for MWC2011 + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.7.MWC2011-1 + + -- Youngjae Shin Thu, 13 Jan 2011 09:34:33 +0900 + +contacts-service (0.2.7-2) unstable; urgency=low + + * modify enum + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.7-2 + + -- Youngjae Shin Thu, 06 Jan 2011 15:09:33 +0900 + +contacts-service (0.2.7-1) unstable; urgency=low + + * change enum(MESSENGERVALUE) + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.7-1 + + -- Youngjae Shin Tue, 04 Jan 2011 08:37:02 +0900 + +contacts-service (0.2.6-1) unstable; urgency=low + + * change enum and minor debugging + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.6-1 + + -- Youngjae Shin Tue, 28 Dec 2010 13:52:52 +0900 + +contacts-service (0.2.5-2) unstable; urgency=low + + * fix socket handling + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.5-2 + + -- Youngjae Shin Wed, 15 Dec 2010 14:05:35 +0900 + +contacts-service (0.2.5-1) unstable; urgency=low + + * remove contacts_svc_get_count and update vobject_servcie + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.5-1 + + -- Youngjae Shin Mon, 13 Dec 2010 11:34:09 +0900 + +contacts-service (0.2.4-4) unstable; urgency=low + + * debugging compare function + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.4-4 + + -- Youngjae Shin Thu, 09 Dec 2010 13:35:29 +0900 + +contacts-service (0.2.4-3) unstable; urgency=low + + * remove old files + * Git: slp-source.sec.samsung.net:slp/pkgs/c/contacts-service + * Tag: contacts-service_0.2.4-3 + + -- Youngjae Shin Wed, 08 Dec 2010 13:16:58 +0900 + +contacts-service (0.2.4-2) unstable; urgency=low + + * debugging contacts_svc_nomalize_str() + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.4-2 + + -- Youngjae Shin Thu, 02 Dec 2010 09:51:45 +0900 + +contacts-service (0.2.4-1) unstable; urgency=low + + * deprecate contacts_svc_get_count and add contacts_svc_count, + contacts_svc_count_with_int + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.4-1 + + -- Youngjae Shin Wed, 01 Dec 2010 21:26:20 +0900 + +contacts-service (0.2.3-14) unstable; urgency=low + + * change libicu from 36 to 40 + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.3-14 + + -- Youngjae Shin Tue, 30 Nov 2010 21:44:00 +0900 + +contacts-service (0.2.3-13) unstable; urgency=low + + * debugging + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.3-13 + + -- Youngjae Shin Mon, 29 Nov 2010 08:45:27 +0900 + +contacts-service (0.2.3-12) unstable; urgency=low + + * optimize query for favorite + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.3-12 + + -- Youngjae Shin Wed, 17 Nov 2010 14:22:14 +0900 + +contacts-service (0.2.3-11) unstable; urgency=low + + * debugging extend value + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.3-11 + + -- Youngjae Shin Tue, 16 Nov 2010 20:10:58 +0900 + +contacts-service (0.2.3-10) unstable; urgency=low + + * debugging + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.3-10 + + -- Youngjae Shin Tue, 16 Nov 2010 09:36:50 +0900 + +contacts-service (0.2.3-9) unstable; urgency=low + + * debugging + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.3-9 + + -- Youngjae Shin Mon, 15 Nov 2010 15:23:49 +0900 + +contacts-service (0.2.3-8) unstable; urgency=low + + * remove db file in package + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.3-8 + + -- Youngjae Shin Mon, 15 Nov 2010 10:51:34 +0900 + +contacts-service (0.2.3-7) unstable; urgency=low + + * debugging count function + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.3-7 + + -- Youngjae Shin Fri, 12 Nov 2010 08:09:49 +0900 + +contacts-service (0.2.3-6) unstable; urgency=low + + * revise normalization + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.3-6 + + -- Youngjae Shin Wed, 10 Nov 2010 20:51:04 +0900 + +contacts-service (0.2.3-5) unstable; urgency=low + + * change policy of group + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.3-5 + + -- Youngjae Shin Tue, 09 Nov 2010 09:35:13 +0900 + +contacts-service (0.2.3-4) unstable; urgency=low + + * change policy of SDN + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.3-4 + + -- Youngjae Shin Mon, 08 Nov 2010 11:44:02 +0900 + +contacts-service (0.2.3-3) unstable; urgency=low + + * change vobject-service + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.3-3 + + -- Youngjae Shin Wed, 03 Nov 2010 21:29:52 +0900 + +contacts-service (0.2.3-2) unstable; urgency=low + + * revise socket msg + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.3-2 + + -- Youngjae Shin Sat, 30 Oct 2010 15:37:54 +0900 + +contacts-service (0.2.3-1) unstable; urgency=low + + * add normalization + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.3-1 + + -- Youngjae Shin Fri, 29 Oct 2010 11:58:20 +0900 + +contacts-service (0.2.2-2) unstable; urgency=low + + * debugging get_updated_contacts() + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.2-2 + + -- Youngjae Shin Thu, 28 Oct 2010 14:41:57 +0900 + +contacts-service (0.2.2-1) unstable; urgency=low + + * revise get_updated_contacts() + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.2-1 + + -- Youngjae Shin Wed, 27 Oct 2010 21:22:31 +0900 + +contacts-service (0.2.1-9) unstable; urgency=low + + * debugging about cpu share and handling delete_bool + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.1-9 + + -- Youngjae Shin Wed, 27 Oct 2010 09:39:22 +0900 + +contacts-service (0.2.1-8) unstable; urgency=low + + * add import_sim function and debugging + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.1-8 + + -- Youngjae Shin Tue, 26 Oct 2010 14:08:49 +0900 + +contacts-service (0.2.1-7) unstable; urgency=low + + * revise image functions + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.1-7 + + -- Youngjae Shin Fri, 22 Oct 2010 20:37:12 +0900 + +contacts-service (0.2.1-6) unstable; urgency=low + + * debugging group list + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.1-6 + + -- Youngjae Shin Thu, 21 Oct 2010 17:24:53 +0900 + +contacts-service (0.2.1-5) unstable; urgency=low + + * debugging transaction rule + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.1-5 + + -- Youngjae Shin Wed, 20 Oct 2010 20:57:18 +0900 + +contacts-service (0.2.1-4) unstable; urgency=low + + * update vcard converting functions + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.1-4 + + -- Youngjae Shin Mon, 18 Oct 2010 21:14:33 +0900 + +contacts-service (0.2.1-3) unstable; urgency=low + + * fix errata + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.1-3 + + -- Youngjae Shin Mon, 18 Oct 2010 09:39:47 +0900 + +contacts-service (0.2.1-2) unstable; urgency=low + + * change phonelog schema + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.1-2 + + -- Youngjae Shin Fri, 15 Oct 2010 12:22:04 +0900 + +contacts-service (0.2.1-1) unstable; urgency=low + + * change update_list method and add vcard function + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.1-1 + + -- Youngjae Shin Wed, 13 Oct 2010 10:08:00 +0900 + +contacts-service (0.2.0-12) unstable; urgency=low + + * add recovery mechanism + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.0-12 + + -- Youngjae Shin Mon, 11 Oct 2010 17:01:20 +0900 + +contacts-service (0.2.0-11) unstable; urgency=low + + * debugging group functions + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.0-11 + + -- Youngjae Shin Mon, 11 Oct 2010 15:18:39 +0900 + +contacts-service (0.2.0-10) unstable; urgency=low + + * debugging add more field + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.0-10 + + -- Youngjae Shin Tue, 05 Oct 2010 19:03:22 +0900 + +contacts-service (0.2.0-9) unstable; urgency=low + + * add temporary library link + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.0-9 + + -- Youngjae Shin Tue, 05 Oct 2010 10:48:40 +0900 + +contacts-service (0.2.0-8) unstable; urgency=low + + * debugging name search + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.0-8 + + -- Youngjae Shin Mon, 04 Oct 2010 18:18:11 +0900 + +contacts-service (0.2.0-7) unstable; urgency=low + + * debugging double free + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.0-7 + + -- Youngjae Shin Mon, 04 Oct 2010 16:22:06 +0900 + +contacts-service (0.2.0-6) unstable; urgency=low + + * add number list searched by number + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.0-6 + + -- Youngjae Shin Mon, 04 Oct 2010 13:14:13 +0900 + +contacts-service (0.2.0-5) unstable; urgency=low + + * debugging name order + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.0-5 + + -- Youngjae Shin Sat, 02 Oct 2010 11:33:16 +0900 + +contacts-service (0.2.0-4) unstable; urgency=low + + * debugging contacts_svc_get_contact_from_vcard() + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.0-4 + + -- Youngjae Shin Sat, 02 Oct 2010 11:15:00 +0900 + +contacts-service (0.2.0-3) unstable; urgency=low + + * debugging contacts_svc_get_custom_type() + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.0-3 + + -- Youngjae Shin Fri, 01 Oct 2010 13:59:02 +0900 + +contacts-service (0.2.0-2) unstable; urgency=low + + * debugging(assigning group and vcard crash) + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.0-2 + + -- Youngjae Shin Fri, 01 Oct 2010 10:25:30 +0900 + +contacts-service (0.2.0-1) unstable; urgency=low + + * remove old contacts-service + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.2.0-1 + + -- Youngjae Shin Tue, 28 Sep 2010 20:10:10 +0900 + +contacts-service (0.1.2-11) unstable; urgency=low + + * debugging connection mechanism + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.2-11 + + -- Youngjae Shin Mon, 27 Sep 2010 22:09:41 +0900 + +contacts-service (0.1.2-10) unstable; urgency=low + + * debugging update_contact(default num, email) + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.2-10 + + -- Youngjae Shin Mon, 27 Sep 2010 16:38:29 +0900 + +contacts-service (0.1.2-9) unstable; urgency=low + + * change image path from ums to opt + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.2-9 + + -- Youngjae Shin Mon, 27 Sep 2010 09:59:17 +0900 + +contacts-service (0.1.2-8) unstable; urgency=low + + * add group API and favorite noti + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.2-8 + + -- Youngjae Shin Thu, 16 Sep 2010 09:33:52 +0900 + +contacts-service (0.1.2-7) unstable; urgency=low + + * add/modify function(deprecate contacts_svc_save_image) + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.2-7 + + -- Youngjae Shin Tue, 14 Sep 2010 14:38:08 +0900 + +contacts-service (0.1.2-6) unstable; urgency=low + + * debugging dpkg + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.2-6 + + -- Youngjae Shin Sat, 11 Sep 2010 16:42:04 +0900 + +contacts-service (0.1.2-5) unstable; urgency=low + + * remove eina dependency + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.2-5 + + -- Youngjae Shin Sat, 11 Sep 2010 15:13:10 +0900 + +contacts-service (0.1.2-4) unstable; urgency=low + + * add favorite list, modify count function, fix sorting bug + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.2-4 + + -- Youngjae Shin Thu, 09 Sep 2010 20:29:27 +0900 + +contacts-service (0.1.2-3) unstable; urgency=low + + * complete get_contact() + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.2-3 + + -- Youngjae Shin Wed, 08 Sep 2010 21:05:17 +0900 + +contacts-service (0.1.2-2) unstable; urgency=low + + * modify doxygen and add account API + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.2-2 + + -- Youngjae Shin Wed, 08 Sep 2010 12:22:10 +0900 + +contacts-service (0.1.2-1) unstable; urgency=low + + * revise some API by Mike + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.2-1 + + -- Youngjae Shin Mon, 06 Sep 2010 17:57:19 +0900 + +contacts-service (0.1.1-2) unstable; urgency=low + + * add some functions + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.1-2 + + -- Youngjae Shin Sat, 04 Sep 2010 17:37:38 +0900 + +contacts-service (0.1.1-1) unstable; urgency=low + + * apply some requirements + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.1-1 + + -- Youngjae Shin Thu, 02 Sep 2010 09:47:05 +0900 + +contacts-service (0.1.1-0) unstable; urgency=low + + * release + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.1-0 + + -- Youngjae Shin Wed, 01 Sep 2010 15:07:42 +0900 + +contacts-service (0.1.0-5) unstable; urgency=low + + * remove alarm dependency + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.0-5 + + -- Youngjae Shin Tue, 31 Aug 2010 21:10:10 +0900 + +contacts-service (0.1.0-4) unstable; urgency=low + + * add doxygen + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.0-4 + + -- Youngjae Shin Fri, 27 Aug 2010 22:02:07 +0900 + +contacts-service (0.1.0-3) unstable; urgency=low + + * fix package config file + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.0-3 + + -- Youngjae Shin Wed, 18 Aug 2010 13:29:08 +0900 + +contacts-service (0.1.0-2) unstable; urgency=low + + * add phone logs + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.0-2 + + -- Youngjae Shin Wed, 18 Aug 2010 12:53:44 +0900 + +contacts-service (0.1.0-1) unstable; urgency=low + + * add new contacts-service + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.1.0-1 + + -- Youngjae Shin Fri, 13 Aug 2010 09:48:32 +0900 + +contacts-service (0.0.2-8) unstable; urgency=low + + * fix errata in schema + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.2-8 + + -- Youngjae Shin Sat, 07 Aug 2010 09:40:28 +0900 + +contacts-service (0.0.2-7) unstable; urgency=low + + * change parameter name for vcard API + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.2-7 + + -- Youngjae Shin Wed, 04 Aug 2010 14:18:58 +0900 + +contacts-service (0.0.2-6) unstable; urgency=low + + * add some missed old API + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.2-6 + + -- Youngjae Shin Fri, 30 Jul 2010 20:34:45 +0900 + +contacts-service (0.0.2-5) unstable; urgency=low + + * fix buf(not finalize) + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.2-5 + + -- Youngjae Shin Fri, 30 Jul 2010 17:38:04 +0900 + +contacts-service (0.0.2-4) unstable; urgency=low + + * fix BS + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.2-4 + + -- Youngjae Shin Fri, 30 Jul 2010 14:01:48 +0900 + +contacts-service (0.0.2-3) unstable; urgency=low + + * fix a problem of version + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.2-3 + + -- Youngjae Shin Fri, 30 Jul 2010 10:37:21 +0900 + +contacts-service (0.0.2-2) unstable; urgency=low + + * fix build-break(upload contacts-svc-struct.h) + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.2-2 + + -- Youngjae Shin Fri, 30 Jul 2010 08:56:29 +0900 + +contacts-service (0.0.2-1) unstable; urgency=low + + * add image handling and struct handling code + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.2-1 + + -- Youngjae Shin Thu, 29 Jul 2010 11:38:38 +0900 + +contacts-service (0.0.1-9) unstable; urgency=low + + * debugging BS which is occurred for handling sim + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.1-9 + + -- Youngjae Shin Wed, 28 Jul 2010 10:02:09 +0900 + +contacts-service (0.0.1-8) unstable; urgency=low + + * remove log + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.1-8 + + -- Youngjae Shin Tue, 27 Jul 2010 09:22:46 +0900 + +contacts-service (0.0.1-7) unstable; urgency=low + + * fix sim init in helper + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.1-7 + + -- Youngjae Shin Mon, 26 Jul 2010 11:46:10 +0900 + +contacts-service (0.0.1-6) unstable; urgency=low + + * fix some bug(related group) + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.1-6 + + -- Youngjae Shin Fri, 23 Jul 2010 10:01:42 +0900 + +contacts-service (0.0.1-5) unstable; urgency=low + + * modify bulid process for database file and change some API + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.1-5 + + -- Youngjae Shin Wed, 21 Jul 2010 11:30:34 +0900 + +contacts-service (0.0.1-4) unstable; urgency=low + + * fix some bugs(related image) and change some API + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.1-4 + + -- Youngjae Shin Tue, 20 Jul 2010 14:51:25 +0900 + +contacts-service (0.0.1-3) unstable; urgency=low + + * the hidden symbol change + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.1-3 + + -- Youngjae Shin Mon, 19 Jul 2010 10:42:11 +0900 + +contacts-service (0.0.1-2) unstable; urgency=low + + * include old API header in package + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.1-2 + + -- Youngjae Shin Mon, 19 Jul 2010 09:59:55 +0900 + +contacts-service (0.0.1-1) unstable; urgency=low + + * change package name and source tree + * Git: /git/slp/pkgs/contacts-service + * Tag: contacts-service_0.0.1-1 + + -- Youngjae Shin Fri, 16 Jul 2010 13:23:35 +0900 diff --git a/debian/compat b/debian_NOT_USED/compat similarity index 100% rename from debian/compat rename to debian_NOT_USED/compat diff --git a/debian/contacts-service-bin.install.in b/debian_NOT_USED/contacts-service-bin.install.in similarity index 100% rename from debian/contacts-service-bin.install.in rename to debian_NOT_USED/contacts-service-bin.install.in diff --git a/debian/contacts-service-bin.postinst.in b/debian_NOT_USED/contacts-service-bin.postinst.in similarity index 89% rename from debian/contacts-service-bin.postinst.in rename to debian_NOT_USED/contacts-service-bin.postinst.in index 52e46f0..a853e91 100755 --- a/debian/contacts-service-bin.postinst.in +++ b/debian_NOT_USED/contacts-service-bin.postinst.in @@ -25,4 +25,4 @@ chmod 660 /opt/dbspace/.contacts-svc.db-journal chmod 755 /etc/rc.d/init.d/contacts-svc-helper.sh -vconftool set -t int db/service/contacts/default_lang 1 +vconftool set -t int file/private/contacts-service/default_lang 1 diff --git a/debian/control b/debian_NOT_USED/control similarity index 95% rename from debian/control rename to debian_NOT_USED/control index e061d95..3d3eb07 100644 --- a/debian/control +++ b/debian_NOT_USED/control @@ -2,7 +2,7 @@ Source: contacts-service Section: devel Priority: extra Maintainer: Youngjae Shin , Donghee Ye -Build-Depends: debhelper (>= 5), libslp-db-util-dev, libsqlite3-dev, libglib2.0-dev, dlog-dev, libvconf-dev, libvconf-keys-dev, libslp-tapi-dev, libicu-dev +Build-Depends: debhelper (>= 5), libslp-db-util-dev, libsqlite3-dev, libglib2.0-dev, dlog-dev, libvconf-dev, libvconf-keys-dev, libtapi-dev, libicu-dev, libsystemd-daemon-dev Standards-Version: 3.7.2 Homepage: N/A diff --git a/debian/copyright b/debian_NOT_USED/copyright similarity index 100% rename from debian/copyright rename to debian_NOT_USED/copyright diff --git a/debian/dirs b/debian_NOT_USED/dirs similarity index 100% rename from debian/dirs rename to debian_NOT_USED/dirs diff --git a/debian/docs b/debian_NOT_USED/docs similarity index 100% rename from debian/docs rename to debian_NOT_USED/docs diff --git a/debian/libcontacts-service-dev.install.in b/debian_NOT_USED/libcontacts-service-dev.install.in similarity index 100% rename from debian/libcontacts-service-dev.install.in rename to debian_NOT_USED/libcontacts-service-dev.install.in diff --git a/debian/libcontacts-service.install.in b/debian_NOT_USED/libcontacts-service.install.in similarity index 100% rename from debian/libcontacts-service.install.in rename to debian_NOT_USED/libcontacts-service.install.in diff --git a/debian_NOT_USED/libcontacts-service.postinst.in b/debian_NOT_USED/libcontacts-service.postinst.in new file mode 100755 index 0000000..5f04744 --- /dev/null +++ b/debian_NOT_USED/libcontacts-service.postinst.in @@ -0,0 +1,25 @@ +#!/bin/sh + +if [ "$USER" = "root" ] +then +# Change file owner + chown root:root @PREFIX@/lib/libcontacts-service.so.* + #db_contact + chown :6005 -R /opt/data/contacts-svc/img + chown :6005 /opt/data/contacts-svc/.CONTACTS_SVC_*_CHANGED + #db_sns + chown :6016 /opt/data/contacts-svc/.CONTACTS_SVC_RESTRICTION_CHECK + vconftool set -t int db/contacts-svc/name_sorting_order 0 -g 6005 + vconftool set -t int db/contacts-svc/name_display_order 0 -g 6005 +else + vconftool set -t int db/contacts-svc/name_sorting_order 0 + vconftool set -t int db/contacts-svc/name_display_order 0 +fi + +# Change file permissions +# chmod 644 /usr/lib/libcontacts-service.so +chmod 660 /opt/data/contacts-svc/.CONTACTS_SVC_*_CHANGED +chmod 660 /opt/data/contacts-svc/.CONTACTS_SVC_RESTRICTION_CHECK +chmod 770 -R /opt/data/contacts-svc/img + +echo "Done" diff --git a/debian/rules b/debian_NOT_USED/rules similarity index 98% rename from debian/rules rename to debian_NOT_USED/rules index f2b94ce..5b1c2fe 100755 --- a/debian/rules +++ b/debian_NOT_USED/rules @@ -55,7 +55,7 @@ clean: # Add here commands to clean up after the build process. -$(MAKE) clean rm -rf CMakeCache.txt CMakeFiles cmake_install.cmake Makefile install_manifest.txt - cd helper; rm -rf CMakeCache.txt CMakeFiles cmake_install.cmake Makefile install_manifest.txt + cd helper; rm -rf CMakeCache.txt CMakeFiles cmake_install.cmake Makefile install_manifest.txt contacts-svc-helper for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ rm -f $${f%.in}; \ diff --git a/helper/CMakeLists.txt b/helper/CMakeLists.txt deleted file mode 100755 index 594c888..0000000 --- a/helper/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src) -LINK_DIRECTORIES(${CMAKE_BINARY_DIR}) - -SET(TARGET contacts-svc-helper) - -FILE(GLOB SRCS *.c) -#SET(SRCS main.c schema-recovery.c) - -pkg_check_modules(helper_pkgs REQUIRED tapi icu-i18n) - -UNSET(EXTRA_CFLAGS) -FOREACH(flag ${helper_pkgs_CFLAGS}) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") -ENDFOREACH(flag) - -#SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") - -ADD_EXECUTABLE(${TARGET} ${SRCS}) -SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_FLAGS ${EXTRA_CFLAGS}) -TARGET_LINK_LIBRARIES(${TARGET} ${PROJECT_NAME} ${helper_pkgs_LDFLAGS}) - -INSTALL(TARGETS ${TARGET} DESTINATION bin) -INSTALL(PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/contacts-svc-helper.sh DESTINATION /etc/rc.d/init.d) diff --git a/helper/contacts-svc-helper.sh b/helper/contacts-svc-helper.sh deleted file mode 100755 index 8966589..0000000 --- a/helper/contacts-svc-helper.sh +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/contacts-svc-helper & diff --git a/helper/helper-socket.c b/helper/helper-socket.c deleted file mode 100755 index f66f0b1..0000000 --- a/helper/helper-socket.c +++ /dev/null @@ -1,375 +0,0 @@ -/* - * Contacts Service Helper - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include - -#include "internal.h" -#include "cts-schema.h" -#include "cts-sqlite.h" -#include "cts-socket.h" -#include "helper-socket.h" -#include "sim.h" -#include "normalize.h" -#include "utils.h" - - -static inline int helper_safe_write(int fd, char *buf, int buf_size) -{ - int ret, writed=0; - while (buf_size) { - ret = write(fd, buf+writed, buf_size); - if (-1 == ret) { - if (EINTR == errno) - continue; - else - return ret; - } - writed += ret; - buf_size -= ret; - } - return writed; -} - - -static inline int helper_safe_read(int fd, char *buf, int buf_size) -{ - int ret, read_size=0; - while (buf_size) { - ret = read(fd, buf+read_size, buf_size); - if (-1 == ret) { - if (EINTR == errno) - continue; - else - return ret; - } - read_size += ret; - buf_size -= ret; - } - return read_size; -} - - -static void helper_discard_msg(int fd, int size) -{ - int ret; - char dummy[CTS_SQL_MAX_LEN]; - - while (size) { - if (sizeof(dummy) < size) { - ret = read(fd, dummy, sizeof(dummy)); - if (-1 == ret) { - if (EINTR == errno) - continue; - else - return; - } - size -= ret; - } - else { - ret = read(fd, dummy, size); - if (-1 == ret) { - if (EINTR == errno) - continue; - else - return; - } - size -= ret; - } - } -} - -int helper_socket_return(GIOChannel *src, int value, int attach_num, int *attach_size) -{ - int ret; - cts_socket_msg msg={0}; - - h_retvm_if(CTS_ERR_SOCKET_FAILED == value, value, "Socket has problems"); - h_retvm_if(CTS_REQUEST_MAX_ATTACH < attach_num, CTS_ERR_ARG_INVALID, - "Invalid msg(attach_num = %d)", attach_num); - - msg.type = CTS_REQUEST_RETURN_VALUE; - msg.val = value; - msg.attach_num = attach_num; - - memcpy(msg.attach_sizes, attach_size, attach_num * sizeof(int)); - - HELPER_DBG("fd = %d, MSG_TYPE=%d, MSG_VAL=%d, MSG_ATTACH_NUM=%d," - "MSG_ATTACH1=%d, MSG_ATTACH2=%d, MSG_ATTACH3=%d, MSG_ATTACH4=%d", - g_io_channel_unix_get_fd(src), msg.type, msg.val, msg.attach_num, - msg.attach_sizes[0], msg.attach_sizes[1], msg.attach_sizes[2], - msg.attach_sizes[3]); - - ret = helper_safe_write(g_io_channel_unix_get_fd(src), (char *)&msg, sizeof(msg)); - h_retvm_if(-1 == ret, CTS_ERR_SOCKET_FAILED, - "helper_safe_write() Failed(errno = %d)", errno); - - return CTS_SUCCESS; -} - -static void helper_handle_import_sim(GIOChannel *src) -{ - int ret; - - ret = helper_sim_read_pb_record(src); - if (CTS_SUCCESS != ret) { - ERR("helper_sim_read_pb_record() Failed(%d)", ret); - helper_socket_return(src, ret, 0, NULL); - } -} - -static int helper_normalize(GIOChannel *src, int read_size, - char *dest, int dest_size) -{ - int ret=CTS_SUCCESS; - gsize len; - GError *gerr = NULL; - char receiver[CTS_SQL_MAX_LEN]; - - g_io_channel_read_chars(src, receiver, read_size, &len, &gerr); - if (gerr) { - ERR("g_io_channel_read_chars() Failed(%s)", gerr->message); - g_error_free(gerr); - return CTS_ERR_SOCKET_FAILED; - } - HELPER_DBG("Receiver = %s(%d), read_size = %d", receiver, len, read_size); - - if (len) { - receiver[len] = '\0'; - ret = helper_normalize_str(receiver, dest, dest_size); - h_retvm_if(ret < CTS_SUCCESS, ret, "helper_normalize_str() Failed(%d)", ret); - HELPER_DBG("Normalized text of %s = %s(%d)", receiver, dest, strlen(dest)); - } - return ret; -} - -static int helper_collation(GIOChannel *src, int read_size, - char *dest, int dest_size) -{ - int ret = CTS_SUCCESS; - gsize len; - GError *gerr = NULL; - char receiver[CTS_SQL_MAX_LEN]; - - g_io_channel_read_chars(src, receiver, read_size, &len, &gerr); - if (gerr) { - ERR("g_io_channel_read_chars() Failed(%s)", gerr->message); - g_error_free(gerr); - return CTS_ERR_SOCKET_FAILED; - } - HELPER_DBG("Receiver = %s(%d), read_size = %d", receiver, len, read_size); - - if (len) { - receiver[len] = '\0'; - ret = helper_collation_str(receiver, dest, dest_size); - h_retvm_if(ret < CTS_SUCCESS, ret, "helper_collation_str() Failed(%d)", ret); - HELPER_DBG("Sortkey of %s : %s, %d", receiver, dest, strlen(dest)); - } - return ret; -} - -static void helper_handle_normalize_str(GIOChannel *src, int size) -{ - HELPER_FN_CALL; - int str_len, ret; - char normalized_str[CTS_SQL_MAX_LEN]; - - ret = helper_normalize(src, size, normalized_str, sizeof(normalized_str)); - if (ret < CTS_SUCCESS) { - ERR("helper_normalize() Failed(%d)", ret); - helper_socket_return(src, ret, 0, NULL); - return; - } - str_len = strlen(normalized_str); - - ret = helper_socket_return(src, CTS_SUCCESS, 1, &str_len); - h_retm_if(CTS_SUCCESS != ret, "helper_socket_return() Failed(%d)", ret); - ret = helper_safe_write(g_io_channel_unix_get_fd(src), normalized_str, str_len); - h_retm_if(-1 == ret, "helper_safe_write() Failed(errno = %d)", errno); -} - -static void helper_handle_normalize_name(GIOChannel *src, int* sizes) -{ - HELPER_FN_CALL; - int fd, ret; - int lang_type = 0; - int msg_size_buf[CTS_REQUEST_MAX_ATTACH]={0}; - char normalized_first[CTS_SQL_MAX_LEN], normalized_last[CTS_SQL_MAX_LEN]; - char sortkey[CTS_SQL_MAX_LEN]; - - if (sizes[CTS_NN_FIRST]) - { - ret = helper_normalize(src, sizes[CTS_NN_FIRST], normalized_first, - sizeof(normalized_first)); - if (ret < CTS_SUCCESS) { - ERR("helper_normalize() Failed(%d)", ret); - helper_discard_msg(g_io_channel_unix_get_fd(src), - sizes[CTS_NN_LAST] + sizes[CTS_NN_SORTKEY]); - helper_socket_return(src, ret, 0, NULL); - return; - } - lang_type = ret; - - msg_size_buf[CTS_NN_FIRST] = strlen(normalized_first); - } - - if (sizes[CTS_NN_LAST]) - { - ret = helper_normalize(src, sizes[CTS_NN_LAST], normalized_last, - sizeof(normalized_last)); - if (ret < CTS_SUCCESS) { - ERR("helper_normalize() Failed(%d)", ret); - helper_discard_msg(g_io_channel_unix_get_fd(src), sizes[CTS_NN_SORTKEY]); - helper_socket_return(src, ret, 0, NULL); - return; - } - if (lang_type < ret) lang_type = ret; - - msg_size_buf[CTS_NN_LAST] = strlen(normalized_last); - } - - if (sizes[CTS_NN_SORTKEY]) - { - ret = helper_collation(src, sizes[CTS_NN_SORTKEY], sortkey, sizeof(sortkey)); - if (ret < CTS_SUCCESS) { - ERR("helper_collation() Failed(%d)", ret); - helper_socket_return(src, ret, 0, NULL); - } - msg_size_buf[CTS_NN_SORTKEY] = strlen(sortkey); - } - - ret = helper_socket_return(src, lang_type, 3, msg_size_buf); - h_retm_if(CTS_SUCCESS != ret, "helper_socket_return() Failed(%d)", ret); - - fd = g_io_channel_unix_get_fd(src); - ret = helper_safe_write(fd, normalized_first, msg_size_buf[0]); - h_retm_if(-1 == ret, "helper_safe_write() Failed(errno = %d)", errno); - ret = helper_safe_write(fd, normalized_last, msg_size_buf[1]); - h_retm_if(-1 == ret, "helper_safe_write() Failed(errno = %d)", errno); - ret = helper_safe_write(fd, sortkey, msg_size_buf[2]); - h_retm_if(-1 == ret, "helper_safe_write() Failed(errno = %d)", errno); -} - -static gboolean request_handler(GIOChannel *src, GIOCondition condition, - gpointer data) -{ - int ret; - cts_socket_msg msg={0}; - HELPER_FN_CALL; - - if (G_IO_HUP & condition) { - close(g_io_channel_unix_get_fd(src)); - return FALSE; - } - - ret = helper_safe_read(g_io_channel_unix_get_fd(src), (char *)&msg, sizeof(msg)); - h_retvm_if(-1 == ret, TRUE, "helper_safe_read() Failed(errno = %d)", errno); - - HELPER_DBG("attach number = %d, attach1 = %d, attach2 = %d", - msg.attach_num, msg.attach_sizes[CTS_NN_FIRST], - msg.attach_sizes[CTS_NN_LAST]); - - switch (msg.type) - { - case CTS_REQUEST_IMPORT_SIM: - helper_handle_import_sim(src); - break; - case CTS_REQUEST_NORMALIZE_STR: - if (CTS_NS_ATTACH_NUM != msg.attach_num) { - ERR("Invalid CTS_NS_ATTACH_NUM = %d", msg.attach_num); - helper_socket_return(src, CTS_ERR_MSG_INVALID, 0, NULL); - } - else - helper_handle_normalize_str(src, msg.attach_sizes[0]); - break; - case CTS_REQUEST_NORMALIZE_NAME: - if (CTS_NN_ATTACH_NUM != msg.attach_num) { - ERR("Invalid CTS_NN_ATTACH_NUM = %d", msg.attach_num); - helper_socket_return(src, CTS_ERR_MSG_INVALID, 0, NULL); - }else if (!msg.attach_sizes[CTS_NN_FIRST] && !msg.attach_sizes[CTS_NN_LAST]) { - ERR("No attach names(CTS_NN_FIRST size = %d, CTS_NN_LAST size = %d ", - msg.attach_sizes[CTS_NN_FIRST], msg.attach_sizes[CTS_NN_LAST]); - helper_socket_return(src, CTS_ERR_MSG_INVALID, 0, NULL); - } - else - helper_handle_normalize_name(src, msg.attach_sizes); - break; - default: - ERR("Unknown request type(%d)", msg.type); - break; - } - return TRUE; -} - -static gboolean socket_handler(GIOChannel *src, - GIOCondition condition, gpointer data) -{ - GIOChannel *channel; - int client_sockfd, sockfd = (int)data; - struct sockaddr_un clientaddr; - socklen_t client_len = sizeof(clientaddr); - - HELPER_FN_CALL; - - client_sockfd = accept(sockfd, (struct sockaddr *)&clientaddr, &client_len); - h_retvm_if(-1 == client_sockfd, TRUE, "accept() Failed(errno = %d)", errno); - - channel = g_io_channel_unix_new(client_sockfd); - g_io_add_watch(channel, G_IO_IN|G_IO_HUP, request_handler, NULL); - g_io_channel_unref(channel); - - return TRUE; -} - -int helper_socket_init(void) -{ - int sockfd, ret; - struct sockaddr_un addr; - GIOChannel *gio; - - unlink(CTS_SOCKET_PATH); - - bzero(&addr, sizeof(addr)); - addr.sun_family = AF_UNIX; - snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", CTS_SOCKET_PATH); - - sockfd = socket(PF_UNIX, SOCK_STREAM, 0); - h_retvm_if(-1 == sockfd, CTS_ERR_SOCKET_FAILED, "socket() Failed(errno = %d)", errno); - - ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)); - h_retvm_if(-1 == ret, CTS_ERR_SOCKET_FAILED, "bind() Failed(errno = %d)", errno); - - chown(CTS_SOCKET_PATH, getuid(), CTS_SECURITY_FILE_GROUP); - chmod(CTS_SOCKET_PATH, CTS_SECURITY_DEFAULT_PERMISSION); - - ret = listen(sockfd, 30); - h_retvm_if(-1 == ret, CTS_ERR_SOCKET_FAILED, "listen() Failed(errno = %d)", errno); - - gio = g_io_channel_unix_new(sockfd); - g_io_add_watch(gio, G_IO_IN, socket_handler, (gpointer)sockfd); - - return CTS_SUCCESS; -} diff --git a/helper/localize.c b/helper/localize.c deleted file mode 100755 index b7be1f6..0000000 --- a/helper/localize.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Contacts Service Helper - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * Donghee Ye - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include "internal.h" -#include "cts-normalize.h" -#include "localize.h" - -/* korean -Hangul Jamo extended A*/ -#define CTS_JAMO_A_START (UChar)0xA960 -#define CTS_JAMO_A_END (UChar)0xA97F - -/* korean -Hangul Jamo extended B*/ -#define CTS_JAMO_B_START (UChar)0xD7B0 -#define CTS_JAMO_B_END (UChar)0xD7FF - -/* korean -Hangul Compatability */ -#define CTS_HAN_C_START (UChar)0x3130 -#define CTS_HAN_C_END (UChar)0x318F - -/* korean -Hangul halfwidth */ -#define CTS_HAN_HALF_START (UChar)0xFFA0 -#define CTS_HAN_HALF_END (UChar)0xFFDC - -static const char hangul_compatibility_choseong[] = { - 0x31, 0x32, 0x34, 0x37, 0x38, 0x39, 0x40, 0x41, - 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, - 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x65, 0x66, 0x6E, - 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, - 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, - 0x81, 0x84, 0x85, 0x86, 0x00}; -static const unsigned char hangul_jamo_choseong[] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x1A, 0x06, 0x07, // to choseong 0x1100~0x115F - 0x08, 0x21, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0x10, 0x11, 0x12, 0x14, 0x15, 0x1C, 0x1D, 0x1E, 0x20, - 0x22, 0x23, 0x27, 0x29, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, - 0x32, 0x36, 0x40, 0x47, 0x4C, 0x57, 0x58, 0x59, 0x00}; - -static const char hangul_compatibility_jungseong[] = { - 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, - 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, - 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x87, 0x88, - 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x00}; -static const unsigned char hangul_jamo_jungseong[] = { - 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, // to jungseong 0x1160~0x11A7 - 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, - 0x73, 0x74, 0x75, 0x60, 0x84, 0x85, 0x88, 0x91, 0x92, - 0x94, 0x9E, 0xA1, 0x00}; - -static const char hangul_compatibility_jongseong[] = { - 0x33, 0x35, 0x36, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, - 0x3F, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, - 0x6F, 0x70, 0x82, 0x83, 0x00}; -static const unsigned char hangul_jamo_jongseong[] = { - 0xAA, 0xAC, 0xAD, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, // to jongseong 0x11A8~0x11FF - 0xC7, 0xC8, 0xCC, 0xCE, 0xD3, 0xD7, 0xD9, 0xDF, 0xF1, 0xF2, 0x00}; - -static inline bool is_hangul(UChar src) -{ - if ((0x1100 == (src & 0xFF00)) /* korean -Hangul Jamo*/ - || CTS_COMPARE_BETWEEN(CTS_JAMO_A_START, src, CTS_JAMO_A_END) - || CTS_COMPARE_BETWEEN(CTS_JAMO_B_START, src, CTS_JAMO_B_END) - || CTS_COMPARE_BETWEEN(CTS_HAN_C_START, src, CTS_HAN_C_END) - || CTS_COMPARE_BETWEEN(CTS_HAN_HALF_START, src, CTS_HAN_HALF_END)) - return true; - else - return FALSE; -} - -static inline void hangul_compatibility2jamo(UChar *src) -{ - int unicode_value1 = 0; - int unicode_value2 = 0; - - unicode_value1 = (0xFF00 & (*src)) >> 8; - unicode_value2 = (0xFF & (*src)); - - /* korean -Hangul Jamo halfwidth*/ - if (CTS_COMPARE_BETWEEN(CTS_HAN_HALF_START, *src, CTS_HAN_HALF_END)) { - unicode_value1 = 0x31; - - if (unicode_value2 < 0xBF) - unicode_value2 -= 0x70; - else if (unicode_value2 < 0xC8) - unicode_value2 -= 0x73; - else if (unicode_value2 < 0xD0) - unicode_value2 -= 0x75; - else if (unicode_value2 < 0xD8) - unicode_value2 -= 0x77; - else - unicode_value2 -= 0x79; - - (*src) = unicode_value1 << 8 | unicode_value2; - } - - if (CTS_COMPARE_BETWEEN(CTS_HAN_C_START, *src, CTS_HAN_C_END)) - { - char *pos; - if (NULL != (pos = strchr(hangul_compatibility_choseong, unicode_value2))) - { - unicode_value1 = 0x11; - unicode_value2 = hangul_jamo_choseong[pos - hangul_compatibility_choseong]; - (*src) = unicode_value1 << 8 | unicode_value2; - } - else if (NULL != (pos = strchr(hangul_compatibility_jungseong, unicode_value2))) - { - unicode_value1 = 0x11; - unicode_value2 = hangul_jamo_jungseong[pos - hangul_compatibility_jungseong]; - (*src) = unicode_value1 << 8 | unicode_value2; - } - else if (NULL != (pos = strchr(hangul_compatibility_jongseong, unicode_value2))) - { - unicode_value1 = 0x11; - unicode_value2 = hangul_jamo_jongseong[pos - hangul_compatibility_jongseong]; - (*src) = unicode_value1 << 8 | unicode_value2; - } - } -} - -int helper_check_language(UChar *word) -{ - int type; - - if (CTS_COMPARE_BETWEEN('0', word[0], '9')) { - type = CTS_LANG_NUMBER; - } - else if (CTS_COMPARE_BETWEEN(0x41, word[0], 0x7A)) { /* english */ - type = CTS_LANG_ENGLISH; - } - else if (is_hangul(word[0])){ - type = CTS_LANG_KOREAN; - } - else - type = CTS_LANG_OTHERS; - - return type; -} - -void helper_extra_normalize(UChar *word, int32_t word_size) -{ - int i; - for (i=0;i - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include - -#include "internal.h" -#include "schema-recovery.h" -#include "helper-socket.h" -#include "utils.h" -#include "sqlite.h" - -int main(int argc, char **argv) -{ - int ret; - GMainLoop *cts_helper_loop = NULL; - - helper_check_schema(); - if (2 <= argc && !strcmp(argv[1], "schema")) - return CTS_SUCCESS; - - cts_helper_loop = g_main_loop_new (NULL, FALSE); - h_retvm_if(NULL == cts_helper_loop, CTS_ERR_FAIL, "g_main_loop_new() Failed"); - - ret = contacts_svc_connect(); - h_retvm_if(CTS_SUCCESS != ret, ret, "contacts_svc_connect() Failed(%d)", ret); - - helper_socket_init(); - helper_init_configuration(); - - g_main_loop_run(cts_helper_loop); - - helper_final_configuration(); - ret = contacts_svc_disconnect(); - h_retvm_if(CTS_SUCCESS != ret, ret, "contacts_svc_disconnect() Failed(%d)", ret); - - g_main_loop_unref(cts_helper_loop); - return CTS_SUCCESS; -} diff --git a/helper/normalize.c b/helper/normalize.c deleted file mode 100755 index 241bbe8..0000000 --- a/helper/normalize.c +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Contacts Service Helper - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * Donghee Ye - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include -#include -#include -#include -#include - -#include "internal.h" -#include "cts-sqlite.h" -#include "localize.h" -#include "normalize.h" -#include "utils.h" - -#define array_sizeof(a) (sizeof(a) / sizeof(a[0])) - -int helper_unicode_to_utf8(char *src, int src_len, char *dest, int dest_size) -{ - int32_t size = 0; - UErrorCode status = 0; - UChar *unicode_src = (UChar *)src; - - u_strToUTF8(dest, dest_size, &size, unicode_src, -1, &status); - h_retvm_if(U_FAILURE(status), CTS_ERR_ICU_FAILED, - "u_strToUTF8() Failed(%s)", u_errorName(status)); - - dest[size]='\0'; - return CTS_SUCCESS; -} - -static inline int check_utf8(char c) -{ - if (c < 128) - return 1; - else if ((c & (char)0xe0) == (char)0xc0) - return 2; - else if ((c & (char)0xf0) == (char)0xe0) - return 3; - else if ((c & (char)0xf8) == (char)0xf0) - return 4; - else if ((c & (char)0xfc) == (char)0xf8) - return 5; - else if ((c & (char)0xfe) == (char)0xfc) - return 6; - else - return CTS_ERR_FAIL; -} - -int helper_normalize_str(const char *src, char *dest, int dest_size) -{ - int type = CTS_LANG_OTHERS; - int32_t size; - UErrorCode status = 0; - UChar tmp_result[CTS_SQL_MAX_LEN]; - UChar result[CTS_SQL_MAX_LEN]; - int i = 0; - int j = 0; - int str_len = strlen(src); - int char_len = 0; - - for (i=0;i - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include -#include -#include -#include - -#include "internal.h" -#include "sqlite.h" -#include "schema.h" -#include "schema-recovery.h" -#include "cts-schema.h" - -static inline int helper_check_db_file(void) -{ - int fd = open(CTS_DB_PATH, O_RDONLY); - h_retvm_if(-1 == fd, CTS_ERR_NO_DB_FILE, - "DB file(%s) is not exist", CTS_DB_PATH); - - close(fd); - return CTS_SUCCESS; -} - -static inline int remake_db_file() -{ - int ret, fd; - char *errmsg; - sqlite3 *db; - - ret = helper_db_open(&db); - h_retvm_if(CTS_SUCCESS != ret, ret, "helper_db_open() Failed(%d)", ret); - - ret = sqlite3_exec(db, schema_query, NULL, 0, &errmsg); - if (SQLITE_OK != ret) { - ERR("remake contacts DB file is Failed : %s", errmsg); - sqlite3_free(errmsg); - } - - helper_db_close(); - - fd = open(CTS_DB_PATH, O_CREAT | O_RDWR, 0660); - h_retvm_if(-1 == fd, CTS_ERR_FAIL, "open Failed"); - - fchown(fd, getuid(), CTS_SECURITY_FILE_GROUP); - fchmod(fd, CTS_SECURITY_DEFAULT_PERMISSION); - close(fd); - - fd = open(CTS_DB_JOURNAL_PATH, O_CREAT | O_RDWR, 0660); - h_retvm_if(-1 == fd, CTS_ERR_FAIL, "open Failed"); - - fchown(fd, getuid(), CTS_SECURITY_FILE_GROUP); - fchmod(fd, CTS_SECURITY_DEFAULT_PERMISSION); - close(fd); - - return CTS_SUCCESS; -} - -int helper_check_schema(void) -{ - if (CTS_ERR_NO_DB_FILE == helper_check_db_file()) - remake_db_file(); - - return CTS_SUCCESS; -} - diff --git a/helper/sim.c b/helper/sim.c deleted file mode 100755 index 13d9bb1..0000000 --- a/helper/sim.c +++ /dev/null @@ -1,617 +0,0 @@ -/* - * Contacts Service Helper - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include -#include - -#include "cts-addressbook.h" -#include "helper-socket.h" -#include "internal.h" -#include "normalize.h" -#include "sqlite.h" -#include "utils.h" -#include "sim.h" - -#define CTS_SIM_EVENT_NUM 2 -#define CTS_TAPI_SIM_PB_MAX 0xFFFF -#define CTS_MIN(a, b) (a>b)?b:a - -static int helper_sim_read_record_cb(const TelTapiEvent_t *pdata, void *data); -static int helper_sim_pb_count_cb(const TelTapiEvent_t *pdata, void *data); - -static TelSimImsiInfo_t TAPI_imsi; -static void *helper_import_sim_data = NULL; - -static unsigned int TAPI_SIM_EVENT_ID[CTS_SIM_EVENT_NUM]; -static const int TAPI_SIM_EVENT[CTS_SIM_EVENT_NUM] = -{ - TAPI_EVENT_SIM_PB_ACCESS_READ_CNF, - TAPI_EVENT_SIM_PB_STORAGE_COUNT_CNF -}; -static const TelAppCallback TAPI_SIM_EVENT_CB[CTS_SIM_EVENT_NUM] = -{ - helper_sim_read_record_cb, - helper_sim_pb_count_cb -}; - -static int helper_register_tapi_cnt = 0; -static int helper_register_tapi_sim_event(void) -{ - int i, ret; - - if (0 == helper_register_tapi_cnt) - { - ret = tel_init(); - h_retvm_if(TAPI_API_SUCCESS != ret, CTS_ERR_TAPI_FAILED, - "tel_init() is Failed(%d)", ret); - - ret = tel_register_app_name(CTS_DBUS_SERVICE); - h_retvm_if(TAPI_API_SUCCESS != ret, CTS_ERR_TAPI_FAILED, - "tel_register_app_name(%s) is Failed(%d)", CTS_DBUS_SERVICE, ret); - - for (i=0;iNameEncryptType, (char *)pb2g_data->Name, - CTS_MIN(sizeof(pb2g_data->Name), pb2g_data->NameLen), - utf_data, sizeof(utf_data)); - h_retvm_if(ret != CTS_SUCCESS, ret, "helper_sim_data_to_utf8 is Failed(%d)", ret); - - ret = helper_insert_SDN_contact(utf_data, (char *)pb2g_data->Number); - h_retvm_if(ret != CTS_SUCCESS, ret, "helper_insert_SDN_contact() Failed(%d)", ret); - - return ret; -} - -static int helper_insert_2g_contact(int index, TelSimPb2GData_t *pb2g_data) -{ - int ret, found_id; - char uid[32]; - char utf_data[HELPER_SIM_DATA_MAX_LENGTH]; - CTSstruct *contact; - GSList *numbers=NULL; - CTSvalue *name_val, *number_val, *base; - - h_retvm_if(index <= 0, CTS_ERR_ARG_INVALID, "The index(%d) is invalid", index); - - snprintf(uid, sizeof(uid), "SIM:%s-%s-%s-%d", - TAPI_imsi.szMcc, TAPI_imsi.szMnc, TAPI_imsi.szMsin, index); - HELPER_DBG("UID = %s", uid); - - found_id = contacts_svc_find_contact_by(CTS_FIND_BY_UID, uid); - - ret = helper_sim_data_to_utf8(pb2g_data->NameEncryptType, (char *)pb2g_data->Name, - CTS_MIN(sizeof(pb2g_data->Name), pb2g_data->NameLen), - utf_data, sizeof(utf_data)); - h_retvm_if(ret != CTS_SUCCESS, ret, "helper_sim_data_to_utf8 is Failed(%d)", ret); - - contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT); - - base = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO); - if (base) { - contacts_svc_value_set_str(base, CTS_BASE_VAL_UID_STR, uid); - contacts_svc_struct_store_value(contact, CTS_CF_BASE_INFO_VALUE, base); - contacts_svc_value_free(base); - } - - name_val = contacts_svc_value_new(CTS_VALUE_NAME); - if (name_val) { - contacts_svc_value_set_str(name_val, CTS_NAME_VAL_DISPLAY_STR, utf_data); - contacts_svc_struct_store_value(contact, CTS_CF_NAME_VALUE, name_val); - contacts_svc_value_free(name_val); - } - - number_val = contacts_svc_value_new(CTS_VALUE_NUMBER); - if (number_val) { - contacts_svc_value_set_str(number_val, CTS_NUM_VAL_NUMBER_STR, - (char *)pb2g_data->Number); - contacts_svc_value_set_int(number_val, CTS_NUM_VAL_TYPE_INT, CTS_NUM_TYPE_CELL); - contacts_svc_value_set_bool(number_val, CTS_NUM_VAL_DEFAULT_BOOL, true); - } - numbers = g_slist_append(numbers, number_val); - - contacts_svc_struct_store_list(contact, CTS_CF_NUMBER_LIST, numbers); - contacts_svc_value_free(number_val); - g_slist_free(numbers); - - if (0 < found_id) { - CTSstruct *temp; - ret = contacts_svc_get_contact(found_id, &temp); - if (CTS_SUCCESS == ret) { - contacts_svc_struct_merge(temp, contact); - contacts_svc_struct_free(contact); - contact = temp; - ret = contacts_svc_update_contact(contact); - h_warn_if(ret < CTS_SUCCESS, "contacts_svc_update_contact() Failed(%d)", ret); - } else { - ERR("contacts_svc_get_contact() Failed(%d)", ret); - } - } else { - ret = contacts_svc_insert_contact(CTS_ADDRESSBOOK_INTERNAL, contact); - h_warn_if(ret < CTS_SUCCESS, "contacts_svc_insert_contact() Failed(%d)", ret); - } - contacts_svc_struct_free(contact); - - return ret; -} - -static int helper_insert_3g_contact(int index, TelSimPb3GData_t *pb3g_data) -{ - int i, ret, found_id; - char uid[32]; - char utf_data[HELPER_SIM_DATA_MAX_LENGTH]; - CTSstruct *contact; - CTSvalue *name_val=NULL, *number_val, *email_val, *base; - TelSimPb3GFileDataInfo_t temp; - GSList *numbers=NULL, *emails=NULL; - - h_retvm_if(index <= 0, CTS_ERR_ARG_INVALID, "The index(%d) is invalid", index); - - snprintf(uid, sizeof(uid), "SIM:%s-%s-%s-%d", - TAPI_imsi.szMcc, TAPI_imsi.szMnc, TAPI_imsi.szMsin, index); - HELPER_DBG("UID = %s", uid); - found_id = contacts_svc_find_contact_by(CTS_FIND_BY_UID, uid); - - contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT); - - base = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO); - if (base) { - contacts_svc_value_set_str(base, CTS_BASE_VAL_UID_STR, uid); - contacts_svc_struct_store_value(contact, CTS_CF_BASE_INFO_VALUE, base); - contacts_svc_value_free(base); - } - - for (i=0;iFileTypeCount;i++) - { - temp = pb3g_data->PbFileDataInfo[i]; - switch (temp.FileType) - { - case TAPI_PB_3G_NAME: - case TAPI_PB_3G_SNE: - ret = helper_sim_data_to_utf8(temp.FileDataType.EncryptionType, - (char *)temp.FileData, - CTS_MIN(sizeof(temp.FileData), temp.FileDataLength), - utf_data, sizeof(utf_data)); - if (ret != CTS_SUCCESS) { - ERR("helper_sim_data_to_utf8() Failed(%d)", ret); - goto CONVERT_3GPB_FAIL; - } - - if (!name_val) - name_val = contacts_svc_value_new(CTS_VALUE_NAME); - if (name_val) { - if (TAPI_PB_3G_NAME == temp.FileType) - contacts_svc_value_set_str(name_val, CTS_NAME_VAL_FIRST_STR, utf_data); - else - contacts_svc_value_set_str(name_val, CTS_NAME_VAL_LAST_STR, utf_data); - } - - contacts_svc_struct_store_value(contact, CTS_CF_NAME_VALUE, name_val); - break; - case TAPI_PB_3G_NUMBER: - case TAPI_PB_3G_ANR: - case TAPI_PB_3G_ANRA: - case TAPI_PB_3G_ANRB: - number_val = contacts_svc_value_new(CTS_VALUE_NUMBER); - if (number_val) { - contacts_svc_value_set_str(number_val, CTS_NUM_VAL_NUMBER_STR, - (char *)temp.FileData); - //contacts_svc_value_set_int(number_val, CTS_NUM_VAL_TYPE_INT, CTS_NUM_TYPE_CELL); - if (TAPI_PB_3G_NUMBER == temp.FileType) - contacts_svc_value_set_bool(number_val, CTS_NUM_VAL_DEFAULT_BOOL, true); - } - numbers = g_slist_append(numbers, number_val); - contacts_svc_struct_store_list(contact, CTS_CF_NUMBER_LIST, numbers); - contacts_svc_value_free(number_val); - break; - case TAPI_PB_3G_EMAIL: - ret = helper_sim_data_to_utf8(temp.FileDataType.EncryptionType, - (char *)temp.FileData, - CTS_MIN(sizeof(temp.FileData), temp.FileDataLength), - utf_data, sizeof(utf_data)); - if (ret != CTS_SUCCESS) { - ERR("helper_sim_data_to_utf8() Failed(%d)", ret); - goto CONVERT_3GPB_FAIL; - } - - email_val = contacts_svc_value_new(CTS_VALUE_EMAIL); - if (email_val) { - contacts_svc_value_set_str(email_val, CTS_EMAIL_VAL_ADDR_STR, - (char *)temp.FileData); - contacts_svc_value_set_bool(email_val, CTS_NUM_VAL_DEFAULT_BOOL, true); - } - emails = g_slist_append(emails, email_val); - contacts_svc_struct_store_list(contact, CTS_CF_EMAIL_LIST, emails); - contacts_svc_value_free(email_val); - break; - default: - ERR("Unknown file type=%d", temp.FileType); - break; - } - } - - if (0 < found_id) { - CTSstruct *temp; - ret = contacts_svc_get_contact(found_id, &temp); - if (CTS_SUCCESS == ret) { - contacts_svc_struct_merge(temp, contact); - contacts_svc_struct_free(contact); - contact = temp; - ret = contacts_svc_update_contact(contact); - h_warn_if(ret < CTS_SUCCESS, "contacts_svc_update_contact() Failed(%d)", ret); - } else { - ERR("contacts_svc_get_contact() Failed(%d)", ret); - } - } else { - ret = contacts_svc_insert_contact(CTS_ADDRESSBOOK_INTERNAL, contact); - h_warn_if(ret < CTS_SUCCESS, "contacts_svc_insert_contact() Failed(%d)", ret); - } - -CONVERT_3GPB_FAIL: - contacts_svc_struct_free(contact); - return ret; -} - -static int helper_sim_read_record_cb(const TelTapiEvent_t *sim_event, void *data) -{ - int ret, saved_pb_num, i=0, req_id; - TelSimPbRecordData_t *sim_info; - - HELPER_FN_CALL; - - h_retvm_if(TAPI_EVENT_CLASS_SIM != sim_event->EventClass || - TAPI_EVENT_SIM_PB_ACCESS_READ_CNF != sim_event->EventType, - CTS_ERR_TAPI_FAILED, - "Unknown Event(EventClass = 0x%X, EventType = 0x%X", - sim_event->EventClass, sim_event->EventType); - - sim_info = (TelSimPbRecordData_t*)sim_event->pData; - if (NULL == sim_info) { - ERR("sim_info is NULL, Status = %d", sim_event->Status); - goto ERROR_RETURN; - } - - if (TAPI_SIM_PB_SUCCESS != sim_event->Status) { - if (TAPI_SIM_PB_SDN == sim_info->StorageFileType && - TAPI_SIM_PB_INVALID_INDEX == sim_event->Status) - { - HELPER_DBG("Index = %d", sim_info->Index); - ret = tel_read_sim_pb_record(sim_info->StorageFileType, - sim_info->Index+1, &req_id); - if (TAPI_API_SUCCESS != ret) { - ERR("tel_read_sim_pb_record() Failed(%d)", ret); - goto ERROR_RETURN; - } - return CTS_SUCCESS; - } - ERR("SIM phonebook access Failed(%d)", sim_event->Status); - goto ERROR_RETURN; - } - - switch (sim_info->StorageFileType) - { - case TAPI_SIM_PB_SDN: - saved_pb_num = sim_event->pDataLen / sizeof(TelSimPbRecordData_t); - if (saved_pb_num <= 0 || TAPI_SIM_3G_PB_MAX_RECORD_COUNT < saved_pb_num) { - ERR("received saved_pb_num is invalid(%d)", saved_pb_num); - goto ERROR_RETURN; - } - while (true) { - ret = helper_insert_SDN(&sim_info->ContactInfo.Pb2GData); - h_warn_if(ret < CTS_SUCCESS, "helper_insert_SDN() is Failed(%d)", ret); - if (saved_pb_num == ++i) break; - sim_info++; - } - //sim_info->NextIndex = sim_info->Index+1; - break; - case TAPI_SIM_PB_ADN: - saved_pb_num = sim_event->pDataLen / sizeof(TelSimPbRecordData_t); - if (saved_pb_num <= 0 || TAPI_SIM_3G_PB_MAX_RECORD_COUNT < saved_pb_num) { - ERR("received saved_pb_num is invalid(%d)", saved_pb_num); - goto ERROR_RETURN; - } - while (true) { - ret = helper_insert_2g_contact(sim_info->Index, &sim_info->ContactInfo.Pb2GData); - h_warn_if(ret < CTS_SUCCESS, "helper_insert_2g_contact() is Failed(%d)", ret); - if (saved_pb_num == ++i) break; - sim_info++; - } - break; - case TAPI_SIM_PB_3GSIM: - saved_pb_num = sim_event->pDataLen / sizeof(TelSimPbRecordData_t); - HELPER_DBG("saved_pb_num = %d", saved_pb_num); - if (saved_pb_num <= 0 || TAPI_SIM_3G_PB_MAX_RECORD_COUNT < saved_pb_num) { - ERR("received saved_pb_num is invalid(%d)", saved_pb_num); - goto ERROR_RETURN; - } - while (true) { - ret = helper_insert_3g_contact(sim_info->Index, &sim_info->ContactInfo.Pb3GData); - h_warn_if(ret < CTS_SUCCESS, "helper_insert_3g_contact() is Failed(%d)", ret); - if (saved_pb_num == ++i) break; - sim_info++; - } - break; - case TAPI_SIM_PB_FDN: - case TAPI_SIM_PB_MSISDN: - default: - ERR("Unknown storage type(%d)", sim_info->StorageFileType); - goto ERROR_RETURN; - } - if (sim_info->NextIndex && CTS_TAPI_SIM_PB_MAX != sim_info->NextIndex) { - HELPER_DBG("NextIndex = %d", sim_info->NextIndex); - ret = tel_read_sim_pb_record(sim_info->StorageFileType, - sim_info->NextIndex, &req_id); - if (TAPI_API_SUCCESS != ret) { - ERR("tel_read_sim_pb_record() Failed(%d)", ret); - goto ERROR_RETURN; - } - } - else { - contacts_svc_end_trans(true); - if (helper_import_sim_data) { - ret = helper_socket_return(helper_import_sim_data, CTS_SUCCESS, 0, NULL); - h_warn_if(CTS_SUCCESS != ret, "helper_socket_return() Failed(%d)", ret); - helper_import_sim_data = NULL; - memset(&TAPI_imsi, 0x00, sizeof(TelSimImsiInfo_t)); - } - - helper_deregister_tapi_sim_event(); - helper_trim_memory(); - } - return CTS_SUCCESS; -ERROR_RETURN: - contacts_svc_end_trans(false); - if (helper_import_sim_data) { - ret = helper_socket_return(helper_import_sim_data, CTS_SUCCESS, 0, NULL); - h_warn_if(CTS_SUCCESS != ret, "helper_socket_return() Failed(%d)", ret); - helper_import_sim_data = NULL; - memset(&TAPI_imsi, 0x00, sizeof(TelSimImsiInfo_t)); - } - helper_deregister_tapi_sim_event(); - helper_trim_memory(); - return CTS_ERR_TAPI_FAILED; -} - -int helper_sim_read_pb_record(void *data) -{ - int ret, req_id; - TelSimPbFileType_t storage; - TelSimCardType_t cardInfo; - - h_retvm_if(NULL != helper_import_sim_data, CTS_ERR_ENV_INVALID, - "Helper is already processing with sim"); - - ret = helper_register_tapi_sim_event(); - h_retvm_if(TAPI_API_SUCCESS != ret, ret, - "helper_register_tapi_sim_event() Failed(%d)", ret); - - ret = tel_get_sim_type(&cardInfo); - h_retvm_if(TAPI_API_SUCCESS != ret, CTS_ERR_TAPI_FAILED, - "tel_get_sim_type() Failed(%d)", ret); - - if (TAPI_SIM_CARD_TYPE_USIM == cardInfo) - storage = TAPI_SIM_PB_3GSIM; - else - storage = TAPI_SIM_PB_ADN; - - int first_id, sim_pb_inited; - TelSimPbList_t pb_list = {0}; - - ret = tel_get_sim_pb_init_info(&sim_pb_inited, &pb_list, &first_id); - h_retvm_if(TAPI_API_SUCCESS != ret, CTS_ERR_TAPI_FAILED, - "tel_get_sim_pb_init_info() Failed(%d)", ret); - HELPER_DBG("sim_pb_inited(%d), first_id(%d)", sim_pb_inited, first_id); - - tel_get_sim_imsi(&TAPI_imsi); - h_retvm_if(CTS_SUCCESS != ret, ret, "tel_get_sim_imsi() Failed(%d)", ret); - - if (sim_pb_inited) { - if (CTS_TAPI_SIM_PB_MAX == first_id) return CTS_ERR_NO_DATA; - ret = tel_read_sim_pb_record(storage, first_id, &req_id); - h_retvm_if(TAPI_API_SUCCESS != ret, CTS_ERR_TAPI_FAILED, - "tel_read_sim_pb_record() Failed(%d)", ret); - } - - ret = contacts_svc_begin_trans(); - h_retvm_if(CTS_SUCCESS != ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - helper_import_sim_data = data; - - return CTS_SUCCESS; -} - - -static int helper_sim_pb_count_cb(const TelTapiEvent_t *sim_event, void *data) -{ - int ret, req_id; - TelSimPbStorageInfo_t *sim_info; - - HELPER_FN_CALL; - - h_retvm_if(TAPI_EVENT_CLASS_SIM != sim_event->EventClass || - TAPI_EVENT_SIM_PB_STORAGE_COUNT_CNF != sim_event->EventType, - CTS_ERR_TAPI_FAILED, - "Unknown Event(EventClass = 0x%X, EventType = 0x%X", - sim_event->EventClass, sim_event->EventType); - - sim_info = (TelSimPbStorageInfo_t *)sim_event->pData; - if (NULL == sim_info) { - ERR("sim_info is NULL, Status = %d", sim_event->Status); - goto ERROR_RETURN; - } - - if (TAPI_SIM_PB_SUCCESS != sim_event->Status) { - ERR("SIM phonebook access Failed(%d)", sim_event->Status); - goto ERROR_RETURN; - } - - switch (sim_info->StorageFileType) - { - case TAPI_SIM_PB_SDN: - if (sim_info->UsedRecordCount) { - ret = tel_read_sim_pb_record(TAPI_SIM_PB_SDN, 1, &req_id); - h_retvm_if(TAPI_API_SUCCESS != ret, CTS_ERR_TAPI_FAILED, - "tel_read_sim_pb_record() Failed(%d)", ret); - } - break; - case TAPI_SIM_PB_ADN: - case TAPI_SIM_PB_3GSIM: - case TAPI_SIM_PB_FDN: - case TAPI_SIM_PB_MSISDN: - default: - ERR("Unknown storage type(%d)", sim_info->StorageFileType); - goto ERROR_RETURN; - } - - return CTS_SUCCESS; - -ERROR_RETURN: - helper_deregister_tapi_sim_event(); - return CTS_ERR_TAPI_FAILED; -} - -int helper_sim_read_SDN(void* data) -{ - int ret, req_id, card_changed=0; - TelSimCardStatus_t sim_status; - - HELPER_FN_CALL; - - h_retvm_if(NULL != helper_import_sim_data, CTS_ERR_ENV_INVALID, - "Helper is already processing with sim"); - - ret = helper_register_tapi_sim_event(); - h_retvm_if(TAPI_API_SUCCESS != ret, ret, - "helper_register_tapi_sim_event() Failed(%d)", ret); - - ret = tel_get_sim_init_info(&sim_status, &card_changed); - h_retvm_if(TAPI_API_SUCCESS != ret, CTS_ERR_TAPI_FAILED, - "tel_get_sim_init_info() Failed(%d)", ret); - HELPER_DBG("sim_status = %d, card_changed = %d", sim_status, card_changed); - - if (TAPI_SIM_STATUS_CARD_NOT_PRESENT == sim_status || - TAPI_SIM_STATUS_CARD_REMOVED == sim_status) - { - ret = helper_delete_SDN_contact(); - h_retvm_if(CTS_SUCCESS != ret, ret, "helper_delete_SDN_contact() Failed(%d)", ret); - } - else if (TAPI_SIM_STATUS_SIM_INIT_COMPLETED == sim_status) - { - ret = helper_delete_SDN_contact(); - h_retvm_if(CTS_SUCCESS != ret, ret, "helper_delete_SDN_contact() Failed(%d)", ret); - - ret = tel_get_sim_pb_count(TAPI_SIM_PB_SDN, &req_id); - h_retvm_if(TAPI_API_SUCCESS != ret, CTS_ERR_TAPI_FAILED, - "tel_get_sim_pb_count() Failed(%d)", ret); - - //ret = contacts_svc_begin_trans(); - //h_retvm_if(CTS_SUCCESS != ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - helper_import_sim_data = data; - } - - return CTS_SUCCESS; -} diff --git a/helper/sqlite.c b/helper/sqlite.c deleted file mode 100755 index 63bccc5..0000000 --- a/helper/sqlite.c +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Contacts Service Helper - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include -#include - -#include "cts-errors.h" -#include "cts-schema.h" -#include "cts-sqlite.h" -#include "cts-utils.h" - -#include "internal.h" -#include "normalize.h" -#include "utils.h" - -static sqlite3 *helper_db; - -int helper_db_open(sqlite3 **db) -{ - HELPER_FN_CALL; - int ret; - - if (!helper_db) - { - ret = db_util_open(CTS_DB_PATH, &helper_db, 0); - h_retvm_if(ret != SQLITE_OK, CTS_ERR_DB_NOT_OPENED, - "db_util_open() Failed(%d)", ret); - } - if (db) - *db = helper_db; - return CTS_SUCCESS; -} - -int helper_db_close(void) -{ - if (helper_db) - { - db_util_close(helper_db); - helper_db = NULL; - } - - return CTS_SUCCESS; -} - -int helper_begin_trans(void) -{ - int ret = -1; - - ret = sqlite3_exec(helper_db, "BEGIN IMMEDIATE TRANSACTION", - NULL, NULL, NULL); - - while (SQLITE_BUSY == ret) { - sleep(1); - ret = sqlite3_exec(helper_db, "BEGIN IMMEDIATE TRANSACTION", - NULL, NULL, NULL); - } - - if (SQLITE_OK != ret) - { - ERR("sqlite3_exec() Failed(%d)", ret); - return CTS_ERR_DB_FAILED; - } - return CTS_SUCCESS; -} - -#define CTS_COMMIT_TRY_MAX 3 -int helper_end_trans(bool success) -{ - int ret = -1, i=0; - char *errmsg = NULL; - - if (success) { - ret = sqlite3_exec(helper_db, "COMMIT TRANSACTION", - NULL, NULL, &errmsg); - if (SQLITE_OK != ret) - { - ERR("sqlite3_exec(COMMIT) Failed(%d, %s)", ret, errmsg); - sqlite3_free(errmsg); - - while (SQLITE_BUSY == ret && i - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include -#include - -#include "cts-utils.h" -#include "internal.h" -#include "sim.h" -#include "sqlite.h" -#include "normalize.h" -#include "localize.h" -#include "utils.h" - -static const char *HELPER_VCONF_TAPI_SIM_PB_INIT = VCONFKEY_TELEPHONY_SIM_PB_INIT; -static const char *HELPER_VCONF_SYSTEM_LANGUAGE = VCONFKEY_LANGSET; -static const char *HELPER_VCONF_DISPLAY_ORDER = CTS_VCONF_DISPLAY_ORDER_DEF; - -static int default_language = -1; -static int system_language = -1; - -static inline int helper_get_system_language(void) -{ - return system_language; -} - -inline int helper_set_default_language(int lang) -{ - int ret = vconf_set_int(CTS_VCONF_DEFAULT_LANGUAGE, lang); - h_retvm_if(ret<0, CTS_ERR_VCONF_FAILED, "vconf_set_int() Failed(%d)", ret); - - default_language = lang; - return CTS_SUCCESS; -} - -static void helper_change_language_cb(keynode_t *key, void *data) -{ - int ret = -1; - const char *langset; - - langset = vconf_keynode_get_str(key); - if (!default_language) { - ret = vconf_get_int(CTS_VCONF_DEFAULT_LANGUAGE, &default_language); - h_retm_if(ret<0, "vconf_get_int() Failed(%d)", ret); - } - - system_language = helper_get_language_type(langset); - if (system_language != default_language) - ret = helper_update_default_language(default_language, system_language); -} - -static void helper_update_collation_cb(keynode_t *key, void *data) -{ - helper_update_collation(); -} - -static void helper_tapi_sim_complete_cb(keynode_t *key, void *data) -{ - int ret, init_stat; - init_stat = vconf_keynode_get_int(key); - if (VCONFKEY_TELEPHONY_SIM_PB_INIT_COMPLETED == init_stat) { - ret = helper_sim_read_SDN(NULL); - h_warn_if(CTS_SUCCESS != ret, "helper_sim_read_SDN() Failed(%d)", ret); - - vconf_ignore_key_changed(HELPER_VCONF_TAPI_SIM_PB_INIT, helper_tapi_sim_complete_cb); - } -} - -void helper_final_configuration(void) -{ - int ret = -1; - - ret = vconf_ignore_key_changed(HELPER_VCONF_SYSTEM_LANGUAGE, helper_change_language_cb); - h_retm_if(ret<0,"vconf_ignore_key_changed(%s) Failed(%d)",HELPER_VCONF_SYSTEM_LANGUAGE,ret); - - ret = vconf_ignore_key_changed(VCONFKEY_REGIONFORMAT, helper_update_collation_cb); - h_retm_if(ret<0,"vconf_ignore_key_changed(%s) Failed(%d)",VCONFKEY_REGIONFORMAT,ret); - - ret = vconf_ignore_key_changed(HELPER_VCONF_DISPLAY_ORDER, helper_update_collation_cb); - h_retm_if(ret<0,"vconf_ignore_key_changed(%s) Failed(%d)",VCONFKEY_REGIONFORMAT,ret); -} - -int helper_init_configuration(void) -{ - int ret, sim_stat=-1; - const char *langset; - - ret = vconf_get_int(CTS_VCONF_DEFAULT_LANGUAGE, &default_language); - if (ret < 0) { - ERR("vconf_get_int(%s) Failed(%d)",CTS_VCONF_DEFAULT_LANGUAGE ,ret); - default_language = 0; - } - - ret = vconf_notify_key_changed(HELPER_VCONF_SYSTEM_LANGUAGE, - helper_change_language_cb, NULL); - h_retvm_if(ret<0, CTS_ERR_VCONF_FAILED, "vconf_notify_key_changed(%s) Failed(%d)", - HELPER_VCONF_SYSTEM_LANGUAGE, ret); - - ret = vconf_notify_key_changed(VCONFKEY_REGIONFORMAT, - helper_update_collation_cb, NULL); - h_retvm_if(ret<0, CTS_ERR_VCONF_FAILED, "vconf_notify_key_changed(%s) Failed(%d)", - VCONFKEY_REGIONFORMAT, ret); - - ret = vconf_notify_key_changed(HELPER_VCONF_DISPLAY_ORDER, - helper_update_collation_cb, NULL); - h_retvm_if(ret<0, CTS_ERR_VCONF_FAILED, "vconf_notify_key_changed(%s) Failed(%d)", - HELPER_VCONF_DISPLAY_ORDER, ret); - - langset = vconf_get_str(HELPER_VCONF_SYSTEM_LANGUAGE); - h_warn_if(NULL == langset, "vconf_get_str(%s) return NULL", HELPER_VCONF_SYSTEM_LANGUAGE); - - system_language = helper_get_language_type(langset); - if (system_language != default_language) { - ERR("system lang(%s, %d), default lang(%d)", langset, system_language, default_language); - helper_update_default_language(default_language, system_language); - } - - ret = vconf_get_int(HELPER_VCONF_TAPI_SIM_PB_INIT, &sim_stat); - if (VCONFKEY_TELEPHONY_SIM_PB_INIT_COMPLETED == sim_stat) { - ret = helper_sim_read_SDN(NULL); - h_warn_if(CTS_SUCCESS != ret, "helper_sim_read_SDN() Failed(%d)", ret); - } else { - ret = vconf_notify_key_changed(HELPER_VCONF_TAPI_SIM_PB_INIT, - helper_tapi_sim_complete_cb, NULL); - h_retvm_if(ret<0, CTS_ERR_VCONF_FAILED, "vconf_notify_key_changed(%s) Failed(%d)", - HELPER_VCONF_TAPI_SIM_PB_INIT, ret); - } - - return CTS_SUCCESS; -} - -void helper_trim_memory(void) -{ - malloc_trim(0); - sqlite3_release_memory(-1); -} diff --git a/image/SLP_ContactsService_PG_image001.PNG b/image/SLP_ContactsService_PG_image001.PNG deleted file mode 100755 index 36ff2256c51bad8fba20742e84b2091d90232798..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75708 zcmZ^~1z40}w>CO}fV4p>M5JfKXB!+;JR0{{(<;(s{7@H@1RU~tqPPnK43Fl z?j57m6Q+z&@bm|{0J&%7pi!z|rdBk22@KOt@FyxkOL16gP|Bowb(eKqKxic32-^$`r??^?Whhn!LE%}?^7fb!fiU;as?1J0R3eE z-S5Zq-h0vqTZJW9U{Ty5wZJ~o9<_k~JaG|ycBAS#lru;R#2-ppW3r=(ZB4M+Vruil zbG6T<7eFd89yQtkGD_L#dUh>7E$orUBBGYIkZD-^SmqUoubJdz#B;_l4}!wD!H|}T z#Ryc04OwEQgCsvFH(c%3FMp&kz27p>uKI@~R(I!#D_WQFetas3>a-izK)Hj&;$|y+*tMw8`$Znud@u#K9bxLv(4x1D!K_i{ z5f~bV#EfnHp7P||_XOn9sbUq*jF@72>*ttaYTL@$!A32ej0m@>bjz84Y7d-q9h9aB z$iTH-l@chwut--Dk*e-{Y*Ff99>Md0OTd0u$|6oK3IDBVw^7XIM5m`kF-EE{?-Z!# z5b%z(K(0Gzo|Kgb2BNi!5iz{+0|<2@Trphe!G&dRx3uwnBl~IjkX3pXQ-Oq7g;AJ7 zLTpFwZ*r6USbqCqKg4%H@E!9A7N!UXJfn(4M7HcvR{^dO7q*4MH!iBKct(f)sTZDE zf;0D_zI>KbiU1&fMvo4fW0RBApO|~!n_ycSbJS&wB{0BDV_|`Gc|+9qMDSyo2t<+!K!} zn)0+D>hbf{a#UUpygL{n@%xM^plg*G+aV=45qi=k7E@%5coQdXA(s0oxrm2|O6skr zIsO$Z#?;2(UK~8t;hrRQJ>WXWDricr0~X(GNO)5VkGkqo5X^&80y>mBS8IV~JfYlQ zLbxV`V~`o37BxZcFIGnPJQ^QY7hPE7ZpZD!Tej8+{{1V4$FsB_J+$D5c3+u zjhz*+y}9aC|~BgeCD$S#DZt4ZH_4q7! zs8i%eQwd(z@yBd+?FCjeDtu!QiD?}+H(sY&gT*#FOc0H~a*&NuUV2Gg^J*2XOlE-D zm98t6r@7cZLP5&nWRSU>$Ra>YkjOw+4vVd~`d88wk<&3^cm(BC8n|LxrESYYCI*aO zw&N~b0UfD*;`!0+|Ll}q#A9M#|17f=hN-sXdg5hpo6U$nU!Jo^<{|yK8Gh?gau;(3 z5;}QCg*#I9#3$N5;u7y_rJTUU`^mXk9ZF3ifJam%he|okQ(#NxueoPJr=v^d0`XW8;QZFv!DT=j|r-* z`%NAJxTAmIhEJHZSd2YibNh2f`1@AN+-)+r?I18nlCmDRlRoJ# zTde_ZR#}2xrrx^l5wimARSy+zfUhe^0}!KUAq_;VDtZ+Fj;6wZ!95u-`Mj^VXs~^Xy%SGMz9eUS znbA9axsW~Z#uu+XK31+hJqtpE43sue@kh*9&QK*5P}VTdU+Hg3*>>A4XLTz6kUMG~ zKqG$Zsh5CCzXBS~!$<>QY+G(3>7=VTv8~5ql*A+F#!RSG$xyrVKmao7|s$W2@E0q zYeW`f%v^^rp`9 zDR9GTWP#!!b{xQJN5(b}ZamAW`BHnLFI16HAtHST!VCAIrCFj)C}bK%r8|{*!4HqV zIHKwuHS@?Y=@5!Yk(2oGR77@xr-i|{@XNF8Mb6E7mH@87X^UJ}`0>p#tUYJHBWDk= z9{EXp>a*8A&5tybC^}*OCUVefDg8JA6#v@Rg??&(w#*ORfOI~VPINEiu^LS(S@|dn z7mX5TzML^CMDFz+f(+={1XcW<1VZtz-T@{hxK-CCsjQWX;UXB@LNEJ1Mc#{Uka>?G z`zsf_j}~@W4Tb&Kbr}yj)g&`bk=De3T7>SC)2`F+iGb95Oog~z*T@=Ak-il=ARM!o zRDnBXk-j5EzPAx1FcLx&C{_}A{n+sA`({hxiN9GuQ8-LNhu46Z(bZF00MpS{GX%!> zL6F7QEIG93CGb8G)p}fFnv#|1=yzX6jG@Gj0!QyUmWDe2h8Fz;ohud$gNHc;GBb}) z_))oDz;;Rxh%Q>p`p3$y4rwdH~^HMSLUYn^E+CeecAXOIT@(Ul%O`VrR=Z4 zSjckYJ8B+ba<5EcJ&x=kwwBPsy_ezOktu*sb|uM0_FZqt=mk6wJ#timeW9WZU58G} zUP2ASkV($8q^KY0jru6ReG%-0ZmG_CDyIxF`-{u=S5jp{M25t?sGY0&o81EfE%gD1 zAY=xRE`+NJvujbeoTf@_KYr~b`sYm{M%iO!8lNhIx8_yENH3>#Z4k#0CrSai-->wU zfEWt?e15O&sgvQhv~0YCM9feh5_tSjS&^4pi*|Lfn%Tiz_E`;$GKUoM+^x8oAk zeHSnpSES0&8pbg#?mG(|#RAoSK$*{sUhUn!VhkOD2`ZK30Kli;VQBGMSz^%80+GBO zhohzchG>A9bDb$z=@(G8C<7HtJH5iU$j!Y`L7uurCOcK&o!E{`67N^SF+~Ni4z$mI z_kIKvk{VcL!&$OSF@Gz)|5(346R5<7JW_G^4y`sU;7y7xb84mxRS zwJ@RsX(5YW?21csCx7N;auhclzOY+6@><^m+F!VwE@bgfn$xL04uTZbY&<|-TCbLM zy!z^dD~1MT@I8+6*lRp%FDz-|sIs4WG*M*0yxVl;Sn9I&!f`AB!U(4nTaA@(UrRP~ zR46wnw=&>NoAmN+cH{Gi*tkhsxXvANRv74jY|#*zj9(Vl?>;1w+7Ix!K7e;b(@9Fv zU{qnD@~37X59i`NgfH;^o54)!<(=vUa^9x%?;eNUtkNwr4W5FcZ(I1mVpxmnSF`If ztc23Xnw($gJXhl~tD`3^>;04YWRiHzGV2-ms}N^9yH_$N3;~2y_w2))Z%;}xqtJ|k z|F!JNWI)UQ;L*YD)n0^2Jv1ys(mj0A%-^KpblPq<9}OPRO6jrrBe}ilYL~_lkAkPj zxH>ypqUR{*sLp zJxZH=Uib~yhrMsId{2p;8V*9vrw094=>5*kom(*}Jd6^jf0p$oUVIiiE6*ZZml2-L zwN#1@V@@6yo=*;Amh~?7C{SwVf2-D)F0P}dt{z4uXyu_;Ve5~MR6ASqTZ20vZ1?|0 z_-z>-$Z+MK6@J5lZ%5(G|YEX7dipteZzv*t3ysGy7w zeCutRZg1USvMxjY0)!SU1vUmD_v=HQgNM{cDO#dSE=k$^8mH)IEPFI$Pt#oo4t{@F z?@!au>XITsQCMFgxX0AU@C7kR5nM$21V_M-GUe8N@sU=-J6?mbc8taX)3C|ju@96q zG)GkjVL1H7ZKo>cdmv+AIt@tlChx8oEkdiz#7(Vn_advr@ zsWh%6InS#%1LuT1^Bb9?xFlRbg&&xHYzf0lqm9}ZCYMPwq1XKXoZah+*dTZug#w=i0kMa zLl>#OVAJl$wBP;iY1YYiEc-HNNfB;rm~akNt8D;O(sjiiXB zo9l}s>A{Td2(b0{_zYjQVmztq`>i}Ox53!7Ki6y~okvcVWSidJMc^p9IPvl7Yp6JVPpO*4@bWx z4hnOQy$4lU$kWXNPlDkrCKOck^-o`yL;HUio7J7oI$26txF8_OuWvuuxq&jZ==6UX zt|^c+O1)NKcy%FH&}zE!69|~E=#`v9cCd($y0Kzu4P{IY{T3?^=LRGbuRcC9BuYWZ zof4VL5-;Up=wb0FrS){oTpD208MwGKEc63d|6)y| zOzs2o?tG)sjM7IfEF!+}fDC=Z3fk;#W+qZW0%UxNw{dZstKE1oW`%Ab-P`-Tf)9V@ zKREJAT%Y=D+a2AnliOdRD0Q`G+Qo zf~_k72-z#&KJruLK*LtT!P`pBE*#qjTirU3%;Twreh!*{ARJ5{efa$`?aD`!kgV;i z9t-wXsm3Kf0fXVstL$DiRuuC5I8b5Z>$<$U-=hj8Yen17f+liA;4e+_NX)-KlIGWR z5l@|j$HIAjU2ixA)#b+j>EMXf>Goa*=UKb_($phYKoQOWkGR&tbNaZ!^vB3ZE_US* z0FO2*`)fbHn^ zWEH11G70Y3en=IT`qFJsM?u;U525>NQZZbmX`r;Bb>xR?8#NPBX!l#Ns0R1ii1N6n zHlT)lxn5E>Y-p4S^xk5-Q-#iKacrhH@se(iso9?LYex}cM`|^T9TLEKs>#JJRozneNq$?j$~ORZi^|&o8D)rBfLZ@w1RbQ6 zP{J(wdVw;si2ui4o_CKTU2?36(-5BRe6Tqz&AoS6{wT;N;Ke@T$rJNWp$^gcM~qW# zY$a)W@b(;{V?^cY+rn?lCqX6z1k3Ck`dXqhduRQ0FsO9HqtIZQ4#O>Ts(LB;okAN`XpVYx3Rm{{oZ zvIxXDRN5G^gUKiaU$%)&|e14l~8fA7eBY~Ka@qL)wd_o=ad`C;7iCrv_1UN`+cLUyue|2S18w7eEa z59tgSa9$mb>mQ$*2-%NxMc6`tDjrMyGE~U;iK}kibs?ClK@6v-FH?|-J5TeL(Fhrg z#<={6uz*0_k%>;2o1laSIby9)Nz1YTy?)D&Xq?)5de3poxF#J;ar;N9QsdfzyN>6( z*24N8ciN;&g$Ow#`!aE*=Is#r*2T#hG0K*KJRC##h|Qy|3SsE7-QsiBA4ChZ@#In` z5-LeQc~yixwA0X`fuW9Xo_#da1AwATFUj<5?4(Bf_ebrSxenqUku~j>T>jTJ$XWV& zT!N>}*^)$>KgRkuq~_4;zq#R;-WurHcuh|S&ijImBMTXJUyBF3&AQBD2XVqNoG)hR z!?0A&9Wvro-9KD;(95^E5ucpUxSIURcIWYFTq~CUIBB$8>+snryKnaQ0SFay0j{`0 z7|@?~$aBp<+$s-PXtcf%+{JEhn=2$nu~2EL(1j#Rrm#DHW=|r+CybZP2`~Xg75D|O zRp4*a;^93L55}|%7J-vgKYq-r>{RW#5}g69ciw=H-wuz)v-@BL zJrIgp$B^!fXYm481Th|6%dYG3lk%#D*?dQ5L%}t#g>ABQGvWj^F`a5N4nP88ue$@`%aX8k)yBxQh4>gM;V7oFsOyv2oL2Jair zoEw%7f58gzhb|gykK( zW(4Sq=r*;|gvziL$KNgE?0oBClON+l)A4$PH@6?@iPR=>Z{JFqh>i=BwU|*#%8EzI zW6#G2=V-$?4Jha{i{&h8G1}~&D)>Lomdm|<;)~xq#B8bEJKT9oDpg6}WvenAk}Dml zoI(y_{)6bh=(!V3`r&mh%Dm~*JxabzEDoegfZ_!(?n_~ zSc{0r*ox%lz}BCSm56jA2Q$J$`L-6UJt!M~us0@SSy8RAvci=$f*B4Jw=82M2J_n) z_&(`0ixw#@4KFbuRAC82#Gd0fO%_>EAIfs}Cm!=!#%;6zOmDx4Il!)Jqpz>nc6;z` z#hWr4XDsI(%ev~PkTAuY_N}~A-uHCLJ8JZQPa|P@pw?)xwbT33)oHSPGNg9AI=-~@ zqaz58{KMa9>1oCH)IC8i~?3~CZ7et9r^xL@Cz42e%@xUr!{E8?V!bkVoh>Rlp6UV zOZ^b}w=b06uYB}lshZ(Ki$-rPT42VTGz(*DmH%5irK0L-f$=56S6?l0$8exc*c{@U zG4zL&8a#2QCL^>-txXSCSrW1F6z4w7#>aChBse}F%rG%qvyJ#*{{lg4QoVGK`e5b8 zTaCyVS%udtep+u#sP6pEjlufpugXF^0!uTOT; z4u1^()^ob33UhlVs(h=p?T|y8F_Wt7d8r7zqQC4&I2D|%QL-_AuU=ql+}(cRPk<-} zbl7c=($Qey{7))yIV>A+PXqp)$fB2@se6-B3f0AnDlq&HMDKVOu@%Dae zvCdp~=fCeZV%0Z&tP>LI{35=iNiJ*<)%APGuGW}S4!rOp8PDTCKTn_IS8iJXy zB3*KEvyoDMs)`#pt3?%@FWY!Tyl?x>XrWa((h5sOcJKwvPN~^xs!Rcl6VTKE@MoL0 ze-EJ2Q2t_%+gnESiqUp18(}>!VZooGt(s3TAxX35Mw3&_U^v=mG-=yjD!-i)MKoa^ z(UqG4dF5$H?VGmmHm0Q%rhfcRR18)qF5Fs7P3MrTU6Ex!*{gRU>Ap*vm+lh&YuSM3 zZ>vXv`vB=R+%IjHa~z`3U~6+bWG&(GJnLZjr6)Am-lt`9yi zd>{D$$#vrYqEzAP=e*&eJt`}saV*B8H)2VqncMNWx$JFeKPDB#?>%nx=GZwIYX=QH z0JY?{L^$v&TYh81#QAaj4$W~J;= zG3aEs@YEJhK^|XxyVqL$oPk1&)I99I2C^6L2**Kz=2$`guU$CgU@Ph098ED(yLHgn zjtsNN!#BNGVl_L6cE%p2si}p~OE%vR$jq`)$SM>S6X7VQR}^PjUwy)&5th-G!!xDm zeXzSrf%xI^hNR6g!fuOB933f@uY>U-O4lKhAj%}Tz#@h?C?ha(_QxAcF?jKtrv|iu zl^S0KfR$j|Yb|?kv&*ASm$~<75Cjpc z^{URmOi4Sso{115hE75gA+b1fMSU-1xS6C>JW7qI8l4X1W;L@<>Et8V^L5aIOcLM1 zpH=^Z?F0m&7qWm>L7{hR z#syo!ZQ1#sdH6JerVJhkbV9j6C$vmI{>SJMDRhxdwX0#vIi8_T@-@-0YoaH;)W zlE|X`x7DjTQU{02uE;kkffaqfg1v0*1pjnxyofRBfN*Au0p(dEH@_s!IwEzmz40$j zWRn8JFg}`rgzR9zq9$y)8s;N2SS9*G#43;8|F9B@`aL;Rn*EH&jgj`jf+m~Q{irzm zBEt;ffKj+|W@PcbdM|%Ad(+;Ns&=G(I>b7c9YIpCft8-^1&M5yioOI9qC3T90-Up;XaSdI#QS|{wW#q+S3L{RX_4Y=EH6qiH65d zz4XSG;^G@;TR-5RM27lr%_}zdDW}-HJ^Z}U#FXC?g9CLl>A3a0teSn=xb-h20v!Rj zgy{7-Mk6z;!oicH(Hi#9Luz*g`2E&sNN+AWutyz}Bz3^xW`O31k(UA!-opdm73;&q z8jld&kJ;k%=l0YkEXQQx#QlTmBBF_dOr{8z4zfuRrI64T#OmL93pvbiPB8x8QK0jU z?3jj~HX>PMI}~8YKCx!`l#w`WzQ}^ntrc@qD)KfS$0zbfm5Dme+WfHBzcR_KKK3_R zGaD=2J?nU1t4q6S`RBSw%z9?ugF`|Q1nt<;aa21yNlz1XA_wSIQzs$#9(ku#;>|C6 zas;o>-<*H>HGmkgq;wEWB=bP_^}(m}k!9=}fXziyg14+UH)WkKuT>jtGJL-I=vq>x zUDeyn86e*1=hj?enD!lV53KKI^4j$Brou+HQdj5N@ms&{r2q1%dgjfun(bhfUJ;;I zip7EAZrz?%H+#y~@a_=*jgTbFH)fxvRvt*CPf2GXv3k{<*b?ryJ^qeSO7Xc5vdH$$mPSNAp1_yQ+2 zt`ZqY!Hyw?@U;50I&8aBj7viCKJ?_&f7nl;Hpyfb&Vp$53#7yF4*74UmJeN0YRBuK zgF+hSt>wj0S9Y_X=h{v;f-#(U3Zt8&N>jKx3}}JqAD?T%r?_SmeGRM*Pc$nS(4b=# zO$#XyfA4UQ>+y`nVOnr#slf^55t7`txg{Ey<@v9nl6`G-i|&B1zIyjP@O39d9npqI%5vd3=Z(VwuZHL3anr^j3|SeiPJuc&p*{%ajq6S5tpAQR!s zwCI(3hN(xHbB&>AdGSQAaG(`Xpc>goK(B4x#k^qdMN!K&;#lAcS+4a0#0EneFh#@L zt45!#a77GOQs1uMjW{K_Vw+aFS1*%VVb2L*E>IM3L{$<-0S(aC{xaLhIwJgg^_Q3T zC*>E4tF3d~4|z6!6kS#Wz%2joxHgsnIiD;*WUE&o0j@Rdcib}YyXH;m_^FQ3$!tSg7DV6e2Iqec(7XtsuXn*6@@X8+ zaj$$KZ#+Am<~dE10p9Yy%%H0KqEN%*2ws!^Q<*F6WFd2Fu?7qG%nQI>9bq#(QH#a)viGH+ zCbmQ~!x^Op6};vZPM^P}D8w+hrT3RPj3ryLm=XQc*aZ#54qu8XPXX-pe0+@rX|sVE z#9_q*&9f^S*2sqFk_Gc;P)Q#SZJ} z;Z+$!Yjg;zp7GTV08f4!8flu%pBi|NF`CP7Q*M81>pKJl0uJ=#gt$2L`%SwY`?SV? zEDiXGr)S${4>Sw^2Enm%SwBKwl`RP=w=w%oIm@_?Ad~hRa~A2X(lSd*^^peT518-CdxAP}NqMoK%mNRVETZNwjT5pp1 zeey2Scz02&cJ`@RF~Mwvvqo`U<9|d#Rita8BLz-lC zhGxNM=|VyEWf?p=oC}y$X~>(AA(WvsP*p@h zQy{G2GLrtS$**C@@77w3eC%mgW9~cuCBuhp05vL40KWC4``E$=kQoMa8^!YUT~+f# z276ohihsjQ9IJo^!@!Un<)gm7&tZix?YxlosWDtYh@nxST8k6zu_wKYD`(?WBs8Do-LTy1}m+)VEfjJ@Ga0C%@;cIN<$q4RSnF5YN>}UmIj%b zD4Jeu&-ac#K8&UAf81o6c2uO7XWEoL*}snh2_>w2<>bpqQ&K_)YO+7l=&5x`x=u5a#T&|UaMBc#4@38YFeO>5ViyibHZv!Y4po6=LRd1bBJ@9eI7RODao2F|;^6n26&8Sl& z0LjOG_(=bu*5y`*!PmpBR#Odr+gCRn(=nOw=w|*(TTNhTBr_^BIvc6ZY$)t8y^!f; z;s#WJF}OH~3}I?)v zCNgMJVy^$(>94maO!q*-qu}3flwq8??!(R!XYC802nL%F1=ukl$=L*FrvW@@+8S+r zy``AdIG=J1-Hs_B>t&9dUF$A;Dx2jIjZ4`H$>2jICH*+ZN?!gqYZqg!?8eQ1{)-mz z9ReJSMBSRu!vok*%XLai5apn4y-aXL9@0X}c>e>}g{`}#lkVNDJ{lxI(BG>E0Eq8x$fDtF?yW6D;PYx;YL^2I>VWUIS*F!el_*M! z!rSSYe|UR+9uV@M*oty(LDQ;XU73&cuE488|Bp~5z<~-@@6DF5O}@MHU%>wIcLB%U zqZF|v9mt!#Q3kuHNgy~M0&PgLLZ{=fABPJ-C9q>aV=!Hj1tCxWM?9dHH;??quUse~ zQ)Nt1e4Mt-;<0Jolju+pkDR$YAk+^X}RfQyyzD z1@K8#@0qA^IvL_|-t<{FF|w!^Co8kPo%Oyb{#0c`q@%mjG(75Jj~spDbR8A?+-q&6 zhBU_H+12NR48Ps{B{QJY)`mVmTY_GEtG!(}H?yEk$p5%r*+;QubR0-74c!TrHyTRS z<7q86#fbjb^t1zMDV4I|UKVak-il%zHci`u1Pjmw=<6O0U z(Pw^EZd21DbwxQo?a-X6?aTqOMV9{T(X*Ip>sME0111lVArF6TtgF7A+^-2g)%`-Q zwMX0e;b-z|lU|manx!cUOp%+*7;hxK?}6|EBSWNt_r`dq_~N~KD*}nkjK8AT!I zpQ#3G1Q?Af<${yz7Wfw1bvB4TV&?|ToiyK0+N9(i(prvdacWSVay%z-3qubi(z=_u zJ8i~Xrv`=kspZ^-lzk-p{otmGWl%o?#NBgW+MGX@X1u8nP)q&N8e!R$;IYgWQ!PKQ zS%a|+|2h7S=+VP<^&r>r6VV8UyX$1;*4?r4K{D%1|8K%D+x|+k);-8WWjLD8ww+Vh zcv`jiFVWU$#V0_e_3Enurc3agj(}%4-VBM$n^P9?r{0!ftL(l4v>;`S_|HhQmvXY@ z9zP)t({rj|#T5xzv#yl3N~cJLP&9VF-%xw2|25{%W<*GM^w6UK*`s^B!=+Bkr5MkB z*7up)m)G1wZVJ7TAj*YV_hzONdVlNin}NrH?;ElPnmn37YV}3@Ere$lvuVyT0}#%l zX#wt+8R^N}lnIBaQa=os6Rh)qU74b4SO5r}FLLM4>J-*>e^7b+`Ib^E4INoIO})Dy zb8aN3r}+30|9ngesuFV3WOk9YEbDVwJzqw!&*yVuXVxo(bj^_MfaFPe3Q}M|zaL>_ zZv(!W#pHn$4bK(?N){ zn=d5=H!729gwUG#Y0!ve%fP*naHKq}a58@tbpURo7kCXm%REMi!=y`%ypW~|^!4y8 z^7ADgmtbK}7n2-gdL86Xw<|ZiKMDkv-y@45)?cKakRX>$*)DDuWR7I9yLDcjf78oa zayzY9Whp%*H#@;QNW38=An+zaqB}84xvlfQ7W0|w7I-;Cjvs@eJtE+Oft~>Ts!h|E2wEI;771+?j%t&v+-C-UCE)W$_YN)6P^a23H z`Ou$q7nJ+2mZr9Pdm=Seyf#fWvwdUCbQoUfCrb{J>YU@lr?%V`0Qudi_RoT z%`foYs{#GHwDZBc3t4Zb#2y-tjjlI&-enhwsdXj`P?~;u)?y6Tv?C zkg&Jia!Z)QQv^s0UvwEo5z_39Zanrz zYojfpYdWoxo2A)-x=#;-iYdQ(MnV%rAUufzNZqM}T78zacUeAIw>FK39}_!!dn6V4 zO7Q3nf#2EiqA?%`Ij&qalL$v%K#ZLn&}`*Mce`suSLid~dav2P?Yg@}n`A=NPM;uz z?JN$FKv_3d_>YD~@V~S<7S6LX1-h{kFe2;tO4h?v;_^ev(@ zB(O{+`u5NfOT5Wq`7mA*`WNi6owV;hNLJ(I^af<$qmcL1_ zz@Z0Ida*nh(6m)r$qx|ngPte}fO(~^1Gamt5;zO4Rv##JHJ^F3awgg%b}RX!uXM!) z`-GC+K{#jT^&UWcsTkQJj=cD(Sb=8Jd8Bij;J@p^^-{83{6B~_@lFe~Ad@WMhibqt zCVOzp#}*l=bB-T?Jsrnfu!YoY8-@b7Ww55--wa7+EikL{ zLa&4h+agS{kdB`35>n1LX@fGj?PAtY4G10ztV#ZY^$GyiSO8cn0AQVsey!z;o2APkgR>W`>S9S}W!JkX!a)a6F3K-M`MlkIl za#4bjwZ)A9)Mh71=C824?&$wwIW*+zj9;;NX{%#mg0!3XN!R?;Ez&i}WKymDavB5U z3Pt@L{plxR&3OM%^exyI-}qfC=6uRF_3Q~XQjyzT6RsYMr6q~~=v3#{@9pTxXl|Vg z*B^$6vA)ToXys8$v7WYOYYXl z=Qy~}d**#|;?yrDJ#ZK=(0$Yd3^tko&%S4Kz%%f}t49v?XY<|)BhUrkv#=b8ldW;! zegC_gM@`cEEf~)hP=lfIRh4#=;T1c;j3cSa3^2L)eEM`qo(TB*&E?4>+ZmX7u=2Es z<1E|q3_zuFEzjhtr#<)aUX4=%o{xu>6sAuRkQm_Wz@8s9nHQP&xe@FFR@D1jT$V>J zn3=gm(*f!DVU&y{+SB%bm$R>OKUShf`Rm3nU5y8Ba(@25AMFGt9Oli`xsPIS`m?MS3udyJANCG}Z{o_MbB8|czY zV7`x$y{&1%g0-czA+|*kH|kzUT7<|Rt`syai@YY4v{nT;nGH|`yJBe>d!K%k^c~iP zt+WMi(bJE`Im&L!429mRjn+mls1hMprKbRj+xtDe(Nc8(=?5+ppoJ*g}9bS|Ue!`OP1;$Su@tZ(f$)G)Dd7eAO?q`knI0LjHtV zDfmYo$|2sfrjJO=y8wEI55I?!OeE$BVjL2Xc5FW37JJgzExt7kq@}?c7jv~5Kyxc~ zw*TEmxfz+aZP$00=@q}MWSD5G(3w41J?+_vSY2i3h!oiOvi$IdB}o4a-Y%oZs4sWHs_^1hJS1J6}ePs z_I;YRzch@?K)sZ&YAv3U zpyCO|CqCv^Wx&Un2~iq81ej3DMV6ZcH#!SnCzt5D)Bk1A(;6ra(s8Cnf!3?t-uav; z`r&zV7Zy- z|55+;tuC`%9%I?81hhC%$301GC^0JZ4a*Y+_VRp>MEbfWkjZ#N_$20g=aTeWQ^0OK ze@eZLL!Q>bm`GhSB3H~z-$c_TOXkDB7WTw4A!46s}#&UB-~IC}o0mv7U4oqN7<5(R&xb|wyWQBfm;@FA0BHEz1d##324;t zFB*D;tcv<1(d&+bT)q)J{VCYdQ;np7yKR}QUTVTCx&s`6QiN1+%`F4>RYc5#lSuZU z49>|{x+gZcNXhYHh;j=R*+vDE)pbc4t_Gya~mhp%csvdf#KM zxT+tPwM8@=0KI*RsI8q1blQ*Vuj5B|;na|QmJTbWez*Viv7Vn+_V=E$vaLld#6`${ ztRKxFsi6101%t(;6JI^E$qQdW@L4gX+YVQXZVZLPC3lcX2INYY`lelc0kRDnGtT3NMqw&5LSl6 zo^c|do~40-VhkQwU+KXwao4txhZh7O@Vl&~{I9tk~SacO|~%~NiAa8QOS zq%^#)1_VvHYdYvZYu}_8I0F$eB^ey;)bYay&>t%#Ny9XojGvo7Dx;N`VJm#ICx%Ex zpOZeDWge-ju*6fF{3;*+Szvo;SpF>kUB7%@0HJ@i!%U~9TG2o>D{wq!^AT?*Tfpz` zspnA&N1RlLG)z!<1HB~f#S|^hrgn(o;>FP^6=e)4fzQ|Fal6ifKP3+{9CN1#1wA%BkkCt3 zX*OlA*YWRfE_O8P9SPuzMS|k+V)B5hqqLOw1VRMRe{`Xc{YUStIVL}^*|0aAt%4nH zF2Cx8uFP9U)|OLr2J>f|fVphE##t;$i;766dv&4D4Yf%}pWwwl{?S*4>2N%R_UAat z72rEfZE|#j$8Aj2pRs{gyPE~Bu|dmJ;nTD*i#9Ecq!iXxL5|9y{=~d2DlZbRwNk+? z2FiDBz7PCzLt7Nzi(p97jU;NBDJ@5Ebq!qk>T2pKh^q(99S^1aMuef?=5IT-7FBGE z_~LI7VT>6MOLWGLFT9i&bNxoB8#(pp$ZXq2l97WDin|JOYnIyl{HK+W9){!e)9LOB z1tt*%b8=>3ci8zCx7(n#c?>PLbZ4sR<&{U@(ig9{%nQvLhzw1or8EqE<|G@Vy)OKW zmbd2#%rmM6hb|hhTi^bYambLls4dYd@{7C4UT4UPt=r0MA$C(eMAYKGx0@&;Rxtt~ zt>T@k&&#hf%fFr`S8USP*0}Q!x*a2Srk~USeS%{x2FW`R{^Q46lpsBA8{ILI6avT> z=hUSiJv@bVtm9GM$cLA#@z0<9NsXZFO}(+gg34owZM_=y>6XH>PKrx8@y&Fdny=P^ z9Z5M-cXhzSN|RqpYie3Pxh8xZ{WRpwG`*Qy^4=HtfY9$ek(fC)wuG+&;A&?gD;T54 zePJD)hvloiFnp(GkfU}l&eInzQ#t6hPo<@XB3kvjei&XHNIc=OpvT!(lQGN5#JE)d zCIA1h^_Fo_MeQCa9RdR)ofZhvAf1Y!NQ*Q>3W#(KEhQizpeQ9RNXO7Ibi=@q!qDAA zci%nup7)&lyZ3`%{GfZS+51_~^RHFyTVP}F=!y&Bt6y*p4@?ecs;!fWi=8J=%{H%b z!CZsR7z~Y;hj5du?0OicVUI|jE&U*FM?FM}o{S8)eNhZ-9BAUX0~!3rEpc>k{~@*z zAdJg6fAU-71@rr3`sN}#?CL#Hh<}_yV{q^b0RiUYOoJ)~1$A=xL!_YKwoP)JF?BLG zKSfx=ysgG3_WldpfPFuf6TVSUmA4|93Rz7{YQ*-04a0c61&mgo+|b z{0%rk!)xAmP|unUCZ*|6!99`w(>b;6&5<(NMqTEHq+q=l6y7P7HvZN!ub|=P?a$60 z6q= zpL78w%guQgwyEZhA~ameTLlNkTRw;{kAMe?+oDCfN$vN)_vwwn2S>5M;r)R{&;^s@j;}{WliC<{H8tKD9^;pz! z{+K5>gw=(I!6=++tcF?d&Ylyy;J`$X^&Gy>7?DgKuK=)(Yqi9gha-z$B)IH}e7*bL z&e40KaVBxeA1T|*8V{(wQa_n-YRu#)eGOFOous8p#t`4hy>z&F`Quk+P*uc6m3y%4 zcy{;^XVUWoen*lfqa#g51)lx)GXjM61ry)6^bHr8#J{r3=xqcnTa6iAI$zZ)(+BQx z{@SyiW;(2%Yj;ftnRi-`?y2}C*ZsqPs!pW3h-X9_c?~M zsD^%K?|{dD>sDPL)CtIZM7X?0sCxLGHP8WGjdqggtYxO$XC?O#eGQFvZy3E1=2X^`TlC*C9HJX&J^4n^op4>h4b#G3U|T%20Ak-KY`yuH~eo?*_Y5eD%e%tKq5wJfuho{SaFSR_^4lNspl&%62AI#VvGK3hgCIMSC3aJWgrf!$A!z;^a1MGr8x^i>`` z_Qa^AVJ}?g8EKNn{tVskK4A1Pll}$b5otAH_8-s#X3Q}Hiv%Bek08j8c1KWD@qXaw z5K#D+&MG1IwV_zfrd6EUOI>bP2gP$Ee}hY&u@a)u66g64I@cU5RFeL76K0@f6sGz~ z1JHgaNAQhNAk(?-tn7{jod_MevP;AnTb^Jt-48R4BjKN(dQ`g&u3kxfZuZI_oa+DI z{{@&k4(hB2OxOc61=mKRaWm4mN!Hd%!uv`#$&nHKroX&5tcI&UI*(uBiNo-8XB@wq z-?#KhJ@FPgu_p)8nB-pYV|Qt!vajWD)^io!F0(ndK^Fu3Y7*`@y+Q33CSGY_R%Bwv7QL@N{0XuK+f8@u z`RECEL~~X%f`!XwwEbVV`tfUNqBol^9;%3B1*v(p8*em|@)^Hw(2+fmc+DbV~ALMTuvo+elHYZ|7-PMst^Gz zr;bYRCmEH22B5fn)U||H@|nJsYA#~Ju6u3N7G?DVQyH3XX;8z_bPx8x*SD*5AO z^J|79A6o1*+s;u;2#QFc8jhZu+^kTV_>ks>*)qGY62y8Q=XV!AM_AO37KY=emz+=J z1rnLH1c@Ps#$uM(0vz}#Tj?TQMUz_IGQi=xXC3LJjo4^H$)xO8JZR$%|JTp9r! z%4B~)q{&#~1@H)<6$=oBXx^+*0kZ+r*`x;BZ@PE5pTaAO@c|WaUvXeMTf~c|>Gh~1 z)+PSF-CS%GlG*|z8vT0OPgeJ7e9|;tmCUpncYOmDpx^Q6&=|g`{A;E?Le(V(?5vCy z$qqR_Ol0K$;%QGMU94!i_dN7s6|unAf@{Ap!~(#a6wdcXzd0LEvMrwM@Q8NWjgV9q zC1&75!e=QJzHI9cH?4orXnEV15bcyhY={P)Y&_ ziAG}c`fyVb=fEHH>b6xYU2ZT&?JFjamyd0=BwVPO**c^=zQ%iA?(r(TnGkc)uQGfJ zq7#2@0KkX?o-R5m_pO|}fxbTy&;^$PC#wKT=uI&gC)k+nT#X7JhFkUwo4hl~`S9m+ zq0t{Ds2V6(%)_IZO%eB>Hpy zEjG+0P2;{WF+>>?JbEeW&5SR4be&+Cau-PxMhhs7t}^t?>z+zLxH;X@Bp`v=M-A$Q z^acPRF})l7Agj)4Bee1QicK{DQebJ^Aqmp+ke#Cq8O(IH#105ej}~&v{P-xs$7IGx zcLFGk*|WAg`t(Q^u#jfMp7?QZ5xW)Yspd31p3e5kCK&Y1au@wgr?0MkC zcQPXI^km-^P>Z*qtz?;yYYqo@RcoQbp7Y;=mlb1HwVO8QjmH0(fG}=?6{QIwjt4s=N5GLfMoWOk@S^ zzX5maKbn}w!6|=Tof(>58s~V-RODdBQHF&Q>7V40ynq?!bT)I-h0!u4t~m}6D|;79 zm%P0RnQ7woXS{d_hxVdB|Nf_qh#d}0SR4K$J~fqtjUc~RT*x54lx!m-ZV|B7GWTTI zZMoYj0gu(^Z>T8=H{0ncMMi~pDGm6m|4`{=56w`Y5(tP@X4r2eU#7C*7LPLq>zJFDEw^y>VDGA+}Y&kJM{*R zmow>o?z`ryVNX((W~2G_R{9(gR+3v+?<_6&0?b8PCqfi@a9_!D_C1xPq&GhnF#2TL z5nIp%XGAI=vc7jmJ#=0Z!-Js0zdLW;eiXOuLNN}C{6$R225*bmYKVwsU@|o;%45`w z)aGpu)5wFf^Jn`=O_zV$DSM7QWUiHC?oIF-9DYb&D%I~?_@A`%R1;-)XplS?f) zF!wRCwaw$^B0>#C|3>Z&kVrUxil&ezcJA;XWU4)|{8Cc?iQO)CoJ+DAb{1z^T>ptB zR;un@Kr#-~StF^lRNIzxKR)ag)1EBniP-t5F?X`J?_u4D8XTJ&t1TiFn|r7UG$V#F zEl1u9dS_gv#DKjs!v}9Ua{|iBrsG_D^9B3P1vZcROwICw&Sxh)CRnDZ%N>+ADWeP! zxN*mEYR2s0=NigRxYuyA>9r7{+W{$+nHMw9_O9_Z$nkP7jwJxBA#;K%>%U`z1H(Wu z#fEAaAceX@$MctQw)FKHWIUE~VRztRKv!c-?X{8mjFkJYnWck`HwZjMPt$$=B%(XP zgsQ2?A3VosVzjjXVa)2K1#LpstTr~}`3I+#TGzm3Q11#d;<)-EG}fZWqjHcqsnvNA z!#`mxn+cK2;!xt448zbg-{k#R2tT#2SwGG9Y|N7U56*xF`=jqu2%zU2`4@cllKh7c zzp5&Iag?lc{AfxRvrw}zS4i*vs6()7`f$m8u5kExaN14Q95d*#x7AF)bw&l1QQ94!FW>LdjbwjZ%FC{M2DPSII}~;K7@2(7FY!_z{l)B)5_$fge~Sb^<*_{Qlfa;Rw@l# zE_w&zSND>1+JC{6*0W|g`ZH9~yYj?w0m6fFatBS{={Ku-`1&h9hB)aAD23T`Z7w&_ z7fR}>I`iNG4-U*k6+Dcd#DYwJU49!aQKd9q?RCO8(W<-e!XK;7PZuWo)Y*LW-i>-^ z9<;AH!e(UwnZ(qum}Wi{K2qjoyc$$e%0mFDDTQ_LzXAChUV2Gd+m0U5yW7_}bh}qh z&Tnd;oImlx&gdjIMj%`bsq*qL(n?*`)ENJc?!?s@TUzH527nLeodK^Rf-IF$oFC_5 zlN!O>;UA_3*kx?h?XrBB&QdxijbsB^S(l|6@Sz8U-?Ha=@f&szMGUd4aus?D!?*8= z7UQR>59H%_=7}pZpf)gS%UOuzpU8>Ms{ST-U#IBZI?De;zJj2>h}z;=31X_nM4Eu6 z3&oH?Py$!C?CO)(gsTJVKqM7&OA=1Cc_O~?DvMmRcg=u!cBz4iLU9stjRAMPi(fT1 z58>*Nhw~b@B->qJV5t>BG8T9(legRel?49y)MJ*Jllw=C_`Ud6DP0Biu+IihzlGoY z=~VGRLEy~F_?0B~ic!;`^%5_Xl|S?LQ@e9dTICsrd^^Rx{lfyUGueQ!RN*s&Jt=nU zOii#fY`JEddatr7*Z%1Nav7^>rT7VK(Y4x#`)g>a>+U?)*#oNPZSaoa*Z;Dt5>eAT zh%VQ!3TF?HVBhLfl<1_3@K}>swigo1>@R-hXHkgLEZK?#LAbxsM_nlb&`O@QG4%n% z#?14^mJ&6^B-!t2hN&Am`J>ULO+`K5-~f>FlWh6&%3SBqYQm4nx1v#?2XP0-)Mgj` zL@NUi4*A9GRe)N;b69U*)xi%2`KbgMfFvL@3}XF{+|oqUJT{js@5YC7f#;sc?ydHL z18%UP;g98jFblem>pVuhH}?}rz@Dhf8s`H!98@OIeNBmapNu3wdA&1DxS&F4n=x0U zl7>A8V3*Fs?Kms|W3m)d9_d2>(WDO^(n+8Mdm)I#hcwEBZK{v)Q4?d-IIz6p&g~d& z^qV$V>Pj%r^*|TFizM-~*NiV@9-=jp9dO}l8#K%44vFRtoX!%Ek_5z8COyuLBrK{4 zzh3XpS~5q+0zt5l8j|*vF0zmw=#~y`|o^n2Rk`QSa>l`*lRwH zsSEdDl>%vkn5w%nkN-pEx!#{nj|Y2h0Vit5+&|aess9GAX;q|p`GOl0lBj7)Azki- zRK(v&;yghvr)zJM+eaqv{5g>2>TG)+w*jZ_+A(KaxnmDXmbTwcJ8S;s!V&r7VC6BA zQJNT{D&>*zS%TIxmqoq?Wjrf>vSi*Fes7yt24wuC9zyiC3B6^#>-3TkOr-7488Pb0 zBmYi2E5fK`A~@qalY)0z!IlLd@IqwOLWF=#!#k*WvDm-Y0OW&`wmrQ76EYFR1m!*5 z(5M87)wRpAXBfu`rt<%qAF-wU6(aqKeG*rx+w4p`-%7{ z*QN)xV@H7}elIkHsCcaW_8lHgYhC?V6L31)`wjk8O_4Hq9cus+mEwEt5p0?VaDmK& zwGG8BX0HIM5umMJ1Jn5bA8iGkj}&&fmJT3}!pPBWtM zd7L0|9`DNwJv{UbJ@ww(9E`6!o0ybQ1bo;>Upa1f^fAk8b=`1fNyyWS56n&59VGf~ z4_@_Bl{NVOY`V!{x|}&^Q7O3$-HHh`dS4SrhPpJr6TSME5}$%eSIJ)lS%JOAboT(X z+e$(jfAYG8&gE0EqUTy>wwIWXBHYR99?&h9EQ5rAv6b6~wEOhx;yuGnAIl1|20HZ| z++j_P0F-h74@=8&`)jkV=2$ZWwBlk<5TAM_s5^njM|Dz($1H1z-zyRT|LFpzcaifc z5-gauh+@^_Iv1kYLjF?PqF86tHQ)i!v^64b+V*tJlsb8BDuk$c#F9G9TP0i*Cjkw8y5g> z7!rFqwc?&nRvrM$t*_%U1#sumaCO#N9)4uy18vlmkH8u>b*Z^iqLKpqO_O`(HY){#HzMMJx zV2jBByfsmK??uK(YhPeHI&{Dt72O^LknKZ{+Xqna9joZisr>}#7!O*CYhuPQ^hW^-Q|$=DP8Qc|joc=2A^x-bcIL{`1zpCZjUq z;H-a#<$4(DOYX(8rY5KVD#me8j(XX!GVNoU;yz-&EDMPOiaD%Q;FccuZ2M+!KNz*4yMKB-n7ExYnzC%IFSfI0(bm)mxf3qb{1y;I zmFU}{V%M!{twnkD_ZpW^BBz6dr&juk#Z`jMv5=*6M6;8rW>tzWOHH$$ zzqW(s^NRnu>#&TO_p_EZxswFyOu5G7#aa8#|Ju+ftLc3=78dxN&P6AY+m^BR_di-8 zJ$`eU6iPHHmLRcg2>i(+@74(On|1?9|2|4*m6NnkX2#!gH4E_>OzPyGp*}>$U`PIz zmxzLAd(lDzN11xNxeiBkKN)5ECjMg$KFuASw6Pzoc=@?yDTS44A*!rfAg>hxyXu$R zLV95-zPm@rh;xwPRJY@-KDCk5bEehQ){uM!&M(_6_O#S9of|QF4VBwqXk>~+Xk4EL z*Cj*ca}G18U5b`)5*!*a=z4+`HLZ4bw()(r3!u5iF=_#z^A>nK6EJAu`x(2;Z>#Q@ z_>XL`SqKqbPg3>=>$awKMf~b~9HL&rvrk*08JWSkRn|~k%54t+r~!soR_t`1q!)uR z#iueHcN!KG7#BJ_Q`nBhKV+@OO}tXdf{L#>8Wp5o_toz# z&n>Eawx(F)vt~Wkq~gzzW{0p>QNV@4-gm9=0}SfN-Qi}tNzqi2da&6Ymlyqd82828 zBhI;Z1A+|8h@+;P6teww<7oTq`tPAP@_v1;!5tEvwkn(iohS^=P?y)b>h zZ2JVjIOE)U<59EtX0tCtq)@{l4R-r8xL@9;$M=|7dPX&#t}HKTH;T71p}SQY@qH~h z`}Ay*T?#_@NR!=&o7C7JuL3+{%G6aMjNjjvv47&(HTYZdV&+6s>5Xjy5g|)K6Trd8 zaA!EWI&&LH5+iUqD>D$P$4iDYi7~E?+}w_r(dm>xiSOZ!@&ZbH1W@AdqNXr$?`1?A zul{E@6A#_M7hm%@Rvop3qXeuCEf}w+vmABbMg14X1^OKW3cp)ztR@po+0t9j`#8x~ z%G`a1h3oTMB8`_+-GIC%edq99{CDUZU(iI;0p)?spU<8f%dd=;itWkO9V4KLZ&b}ipr=*z=CYPmZ*Vk@U?tgU9XL@w74bq@N+)#hY)5BR{g0x^SL8T~}}+^gndA?$&s_kuPEU z{hKmjV#X%x>P5r{v$y*{-OuvcHx9}@X`H}MkrkBx2n;JY)gkV!y6K>tGfu&JAh$mZ zV_K1?{xK8?N_`#${$3Cd=&fw%ndAV-U(@nE^%l0P0a|h8Gk&1$A@RS;Ce6s{%u)h~ zm9b^@l>gm`CEbPl{SER@`jNTY2QkIYQ)aKyyjt{arZfQt5#6B0E)TH)N{V(#2y7`T z3wtuqHzqy4xJ#|~RVtPHL+vFC1$1x2F(k~2r^x)ZJg+>zHtF^ouaz?Id4&9XAU@X; zzq`5nAF<2=eY;Xj{DOvMSd0@8WK@QiyL2LT#kbY)dy6BA);msZ6q(&lNbjmV9N8{) zz4z3keI|RBW<;5h`RbF+XoOy}=_+VqKm?Eq-ul7-!7F!dcdFT~Hhlv zBT`#478Zhh*12y2T2#WE?rry{0t72w)_#@7qsFuAU2b>k@Menv%D|MO_ zxiug-hXI0f`Zw;VDgA93N&mvm0e<16y*6C|6)dx^%hQh&!_v@$)WeVt3)$L4ch$v< zYU8%VNL9dEJ!Tm@15B$qohsHR3y&W1uE=Um9b|b8j<_i_j%R%0sc@2%`Fd0Iae3a0 zgiO-sQ7X$U&;N^WHkm7dJAdtN=nDjY8d#sai@k7jVxf&dNDHjtM} zg%s)JjyJR1m(}Z(()62VlWiOAQzt#zYqfV-^f!*nR<)rEYrUfIaY`|7gIryp-vu`X zz|hugCw3Qg81i(`p{H7#>wK351Yz$4B|FdkIp}FUnWwV|bm;RJhUy!iJgGrU(`s|} z;0Cf*0$DabN=ktK5F0!JV9qL};A_sf9-_Eo?dGKGH~>{Ycme65E5Hc;a(8aJ?yrVE zpxOas0%jUfd*XRlhVfeOBbA+9dulyJSOyC5lLwb)T-#FsN>mXD4)za!gY8>%GW{E&uPrj!Z!0erte+8W#4FLC+ z#r`kQHk~61A!tvcWp#akOz;EvGD)a@>HE-lKC@sT3)gBv3~~o`tE+J7GXJMf8xH`w zuv=CWC<-Gaz`;d>lw?~4`su>&dlzmoNoHd&wUh*a2*~Z15y3jK(;098ad#knX^bT}O*3s+gBc}YBT5%GUPmZyoi7Vqv-`qky; zLMB@$IZffXt{KUY9lvS@h;GhQ&pNdXp^A5g8A167Bhq`*lXa@2@wpkcK@yNh0@@aR zCGZ|k+MB|t{;lvJNBNbh8Y0O5m>;eWLH=B5#1F_Oz!o1NFoXd~wQqWXz|Z@OOGRK< z+b};r@w}re#(&F?TpIkBbjVJ+^^n#wL#+@dV-tWn7|t_@6W_U%`3I(HH*x=Z&c)HH zw_9(=w%Rig8)FVg1bR2VrK}fLH|qmgiK|t_G7kme(*sGgH0FbkiSCkW$j_b`Q@|_Z zzHLiLS{phRmVHHWKJvkUq{b57|2^Ls)WjVvV)4#2{L&V1Wn$YJkR&5U(+GF$N8`Kc zoHf07UNFj6$=>vJZFfq9Mr?c#x50U=%8mtjof1&^@xtGDl@*z*SEyIfb1-wYBHVaa zr;(cwwa=~V_lI~Wmh1k2B-fB1H!y+#A`K9j-XEj}Fo!9bWT-sAM1>jL`vm&SF;(Qr zBAAbNhNp=M(R6YLwn#wn-Ll8d^;M?N9$&O;+PKl zj*ne-d2}#hnIc@BIX11ez;ka4?g#!WlMPhy8WKp(^rU?w*GgaFlZLZC`!GNWZ%|;= zICC&@cP+Tgz`|o~sLuH`NoEybbBkKjwxx>8nXvGF>idP`%e zjx#XjwHQnJ>s_%>L;OqY-?oY)D1#X+)?@#=y{&q{qi8WI;f3cF>(77*OWVHlQx+O7 zjYIQhxd=NERMUzf>E}>mbU82A5ueY5GJP;;;uFT>RJh{mK^pWh_$H^lID^P8e=)k% z^Wd|7;%9HtsQLmvGc3@*MGEEA{N8Y@c{~#FW>@poWTQh5?!ve6S?XEIjVB9Vm~WIA z_I`*)*xzh^Yi&Piyz$xlk$U;^5@jiU&v~WSYV3IWhW&cj_dIn0W}EL8dH&mIKpLOH z!7nZi#8gLbS8YOo8ls}i4&j!Zik6`c5)DZ9j{a@QvGJ>uTNO{f!hSr_j2%ipf3!z3 ziNz%TXn_BK&J+EUTDUa4zwg*$Cd@Bu_^lg3l=_vn$NU0#U*7g`T3`NRNOfgwYgRF$ z=EMPhRrTUEf*s43{hvKv-$@DX=?&J`H>Nfc5wlMJ=yUV>3&f@ups4@jt6yKs@=m(xsx(uJL-&6jB7OGuC)>`1Iqzu~c*_{nduE)% zu@k>mDaI9&Bhh~59co0q9;be#k_2FxFw8M}+tF^CI{h$m#+t|RkSp=d&xA#!ek7IG zmTP&n`Ebs`5}W;dQMrk?*EEN408U)QJiR$Lx=~DW?4UJm4JLU2oPSyMqM-`<^pY-~ zTJX~w^HPHiMcOrtxWgMDU0bA6rLRPv<41NiRPz24i{j{e<;6TDG9H^vD#{D}@n&%i zSwp)Fun)0nsWv} zi&P}I*=|l(%Q&R*uOH*HlX|ba?)=_gjEPY4Prii8+IT-WN4EY<4=VU^uErt2_t?{+ z_cb*CzKux#RI%7RFza7WF#k1jKMntH_Qx4Pl?4Lzw9;Myfhd`6dVr)T}X+>xRy@mkp6Ve5e!RJt?ne`GPq-K18G7w<43 zcAReC9#Lortl%FUmQsoI>u`>-*>G_vaipa4asY*Uu?4-*2Rt9*s2?W$tl&$bEOVcg zdqH}%tCw-jndO^u_BPa*T4ra)NhJwi@{uebK6EA3?Ijy)!-<3|Kc%<7n$XD6Ahi+E zs%S!$0GG#`iB+oyb-D?Z*leJ451Q+W_I%CQsq%qY3^H5PzfDP>;=@B*bzK0Y+K^f7&!MzvK|!pDfrYWs|n-%aS64ER<;b$=`d zZrV*{h}WbZ>!W;y436900ZD64LmT{3eCht+AyKE%cK*y|cBb{6RYWoeNF2r6pOIH; zDzufZs9%ban$4vzlLl|h5s@iY0R#+x{$tEv%kyi3m>QVV;cI@l_Pe@@Y_7J3Vr+ym^a9|-QqR|()FV|16q z7Cc5q6XErzt{zdz>RoPO+0U$de==?o73rdm7RRaksr8M#@-cGaeCO0FNi-Q$q2cnB zB>s#N#%6v3H-duf^(H0#FM(UFT7P0Sp%b-bC)s#tBMA}TT^iIoJB~ZgI>;p<6QW8$ z^H9sV9p2vkozom0V6HRF4Ull;$mKq#g#U~oX@I=@Kaxr%{XkG^cA@O*uMhzH*EaG2 zI&T2G0P@^;-)ELsKNzNOM#vjc@(93R_n$Z1!4}e!pUStH5gKtlTCoLu^w**B9$o2J zDa-<-svxLVMFFcX~>9h%VTFcW4OgSN(=Jg^_VmIc6Yle_l6 zUb*e{yL>p1grwh)%sh+Q4{k;TLI%BS zB#YO#%KJ0=Bd+OOY_V$#&YVxBwv#n>FkL>j4$&FY7o>mTL&l8hXvr>gYmDB4h$ryV zs~G-BUxiRnAX4F@-HNQR2T=lWXH4vQj{}pQA$AP}yH;lC=i@-Py?t@qPt+Lrq;_5% z@PSynoK+0i8|oVQ-*6=wqmlb$cw8}mw*f90Auu47has9>S9vbYp!Y*y7{dq6B(Kvneh*t21yI-{0 zUO+8qSLtw3q46eA_@=1AaeOL}=9czj0b&7}#6`~WocA8etn_`SrwpT&6bjJT8&K}u zB0{8kg8J7#sKr@Sa~%}08Ur&R>xq~Pn6RdIe_$C`%x~JdxE_$LQ-;;7FrH{1-Xr3^FVE?3$ZQ$IKBWdrlZmd->yB|6wC?XaajPwV!g z-fsV=N=LKBZgH=plBdvzl6}b%d!VSh;oF}SPz{ssvS_1AX-t#Zs_GKG$|$*{P>+;n z_44N=Y>}?8TtHNr+*-|@5U+Uy0*uWO=hHi%R%xfsgOw8Y`X|n>s~01ki@3Vv&o_;3 zCTcv#w-+^3CI1GR2b+pvxSsL>gTu+oYWBqt0LMrLv|{VCt41UA>hR^P_BIa+v6Lqo%K zZ=s#(gZI^@5q0BfJ5Sw-?QBua3SF_JwxP!#4cq6*+>Mt`*&FZ6itVfC@$A2%jfEzt zBhScbZ1OwoM*AY9QM^-E_vZ9CCB4)F^52suvEe_q{Eil3e0Q?&X=md1!# zrYSf}!F)8ArNwHV@ul>`0xk3If-;cnI-RuY@c*%ns(hajv+;=J8;>(yl>&VNtc?rx zCo=~t&kMn@(Sr$}Gq};Q(AQNB6;ZhYy^6e}Nx~;da~1eRC9shcz;UUK0Wrw?(N{YK z_%2QRehFe7@bj(k9`oYC_Ir{g+W+%fi&IBu8}n^03HJZIyYoc!3#*hvXH)U8dkG03 zi92wNF~46mXcn>zA}exRIin8VoG`B_L+s5SJOBN|Qfh*=Mpj8{G*(n3_H0}m2e#H~ z8IXLjvVk_PexqZSIcewlq>kZdSGOm>7h&%$i)y^NUI^nTBFl(<_@UM9WY)Lwv`4#P z!GF3pL7*MTL{GN5_e}n3BF&7_we43RL37(wJ>V&Qb-BoVL-x-;`F;f^p&FMjM2vAy z2P#T31^u?0vy=Gj{)Utrqj6^gZy*ftk6jw-XCqXjc0x>3<|GH2vZ7O7Qtw1^Hlv&QD}_N4>pX?4g>Qt{Q_Kbz$$adP^Ls5c)l%qvoxt- zCF^1Lc{%Vst2`21e|sDi6XDbW+^!%_GPTQypcWkiAfABxaP|($SkbNnzwA)-k2ewg z)Lrkcl>Yl`-N_0;4;mAF-x182lHcj^)Kk?4#`$6kAxz>`eD>FuXEP6%UmIg$(>o^@ z)gSBawK8812-K2Fof_L0@?Fl3qD{Gm;!s}kBH8jqK&^i=vHl`aO_-B^`vrI-2V24g z$vaw$=UP4CwFP*~Yp~r>#x9;Iuz3G`;z5%|;XYXUXxvcaO}U7P83R>J)#Fcy(^~C} zvGy=-2L|z~ZOPmZ34VG_fGqSU+hh3a!v<9YeePHZIeoUtz%mC%qrM;1CvBJ$3+C7> zBj{@#*!p3W5;R|pNHd0aEi1|tWsG55+#l9oF#Z~VqQU==}`+6UK_dD z5<847OLKC~H|T3uPJH#N#>*_d3}1~fk3G2lolMZ}l5U$5G6XB6qb_uV6@khoR`6gK z-@gy}Z%K*rU4TTNU(}+h0*Ud$^Oc+?gn-y1UL28w2mle|`etI;Gf5_>6*6`h=Fb1v z*qkxH^$&l!&rTQsMfp(3!;7E9n(vO_0;(ySV(_S|-;PGTBYT>VyP99gvwsc(aBYZ} zds5^_MJ@5N4$emAuPoH%E@(I8%i;9+|C1$z=%sNnFGgQ6L!{Y8G(-P&Rj6?;B1ynf z1&LEHiS~XYe|>s>pqwZq2qsBsd;M>5vN%22K8gCCnMKw|PHrUVfGQW|=naF}f!VPE)iigXs#jJam&bZiWivca9p4;%^ zMy(smUwkr63Y1;)%mb(XQJ*7Xpj3 z!h>3VPnwGem$#D2#*9~6oba)sMA6UPJ90tRfVzP!KodIzl_OICF;d z1z)S#-3B2FsoZA07w(DFLexydENBfU?RS9YJoS0A|1)L-Q6^twZN72NhdD*3KJEM#VVN-`}uduikH3C0kI|p)?wwzu-l^p(ZD8 z@I@$>4uyz2*o59ip=i8pIVnRm$vTju)ci&rl1`4Kk0m^ny|#cF!f4Wcv@M9NDV=J@ zXbaed4`+O%+_NC|7h#|zBB1SLg2N{?TfRjY+an3Z)k*d8G@ zNnG+IJW*4^dh_FAK)VK!Pmw37)(J@epq^Evxr>e5c9*K?zT=?9r|0FPx@ey_2~ArdOju z85-{1A5yoV-tS$Gm?kPIa#MO75?A}5XTgDeV8Q@S3VDu|p+fyC?vmf9MT$HD;5g6W zzRIOzWZ|tcZad~)nRXZ9#8~X>l!b@LT-SycwF(SgJQ+c>G>ZXNP!Kn$22BWG47TLN zc}8A4E(!dinf>)WXdNeyDO5fxG(yhSBe2d~mf`?efYexdSN_%lbXeZrZ;36sVv2zz=(=D|lX7%?GIgwYm)CHS+s$(eglE6? zad|zd{Dh2K)x|?8sfiI`6+bZPi-Lb{fn$3s{bpcv7Vxi-0DQPpf`L``v)sH<+&9+$ zn zWE1tc$BqNJjD8GqR8qNQ{Tocyks-XZj|rq%zs*-gDxVm;bm&}^F zNE_JKO<~dH>!l4@1(|n)YP}NBSW6=`U7oq8o5k8v&~#6uS$)FN%&hi_-5aGYwXSYL z^Ejn1?6fqZqEb+e4#}$IDb+IYWq&X{CH{?=kd|{H_u{>KfPCh5FjbG5=0#dOUY<(P}Vk z(c%dn7zz@LKhY?e^{@0q0a4Ld;fSM$bC~prWQqY58(FN&mlbmY?d}g3SPo3yV9p&b zRqv+T{v0Fe1TIuh^lkXY?D*diausQ{%3G*7Aj};M_%iL%1mZn<##FI(FyejE5>`&-7CpsJ1(CwBBc(nOs`#WfEJ=#_3*}u&v63kZL7}eYx-Msbm$aUtf zJKEyHe(>nBL6`SB5`Yl1WLZ3pxw)t)&+y2QaL6ma<_tdD>m)3KKBAus&-d?h9!}u$ z3crKYU7FZ~+a>|JOiAJu7LsLWH8r2acoo~x8>?VPn)N_3% znv@imrl@KxS2QSF2b6hs!-**k%*_bO#o+=b9C3l#6QYOrIn$P7Mg zzVsD3Ui>z_yvr-T)+oG*8-@S5?jw^b&m}oR{79D{$+EeP5J7n=6F??Yx+^f8|JQ$y z1N&{3-IbK7E?*kq=~Aym{Yf006S(!sZUWHsY}StJ)cL@R&x1}=Q?H||S#%N+Y!n)# zK_hA1sf){FEOcUDM7=X!@L{sD(+Vy=`20T^=Rbcx2V;#-%#|d@KFAMTkNTyR^2F|~ z5;5y5yax$V<@wVnEpTmlL#CA$JzWKEVAOEx3 z%j(xF1%RLBeE}{o;cUMXhK_?qTBiE69ZUNPKl12ll3ikvQ@|9b+!pzXW-0XvB_M_s z_o6FaMnwpzkY*%(BNNc+Q~}fi;vtS;29kDzYKQbDA@_A#5=&{knUUtCPIchb_rh)c zB1eOM^*Qz_8cBowZCf)woS`!d21_)S^s+mPCiYfZ?6Zknp?txFkadlh1Q5K~v}N$| zYtm`;SBxyNoVuoGO54=4<((iOKHuxhFKUj^Rw>|eEoCwdRl3E7QJ=yG&D^U__(oR~ zV|CrdQyXI#6PtL%7r(Ei)E1>?s2$BJl<}TPLjGbI&{bEXb@ABE+_WvgcLlRxYcfG3 ziB8)ZN5%>Qc=ZNqysSM>GrvWzvl)aDDF+WRR0@mE$WENB03vIFdq5_I&0~$CzAGee zZA`IZd%gpo?WWa+;OmlNZ&b5h45V6#jX5f}hQfQfeCpVMh7mbz_dDdV+ z^eb)d3Rv`#!Q6I^e-#EYo_7-^OgDgkyezcN4(T5KL(~658;Ce^EA9w?}Zx~CD z_vm}EZLfhz-2~cdop1%(D|#$(?<}dRTx@tHaN7sBrIyl|-DrX84RN{9p$DV~wYm?7NH~`6Ak*#VDq1}Q0Au*g9_@Rb1Z!R~S-~Hn12m@qmbR^)Eo|6D_;w}XUa!t=cD zHbKYcUxH5Vs+fbqs#u2yEp(9q2BH5^P@jNRy1X46%uh1!) zFh!N#6aZ1aDFw<;qQYO{0WrG(&9Q{#qkbLdivCHLD`4Y_j)gauukBTVV5Jk&e*vEp zxcdG~Fi%^x&--%Ju%eU8qSQV?XrLj`)I_e9Eauar9}$Q)8VD&zZm^TwXvGaB>z(V> zew&z~5OObczC4+)EnNKd80p%|%Q<}K^M3BLbMv0{jgrdrlVrD6c*-GAe#gLI=J5VIH^^YM>uX0EK|D0a2t7Y z(P2|Jfgmc(`tN{ShkV&XB|gKukqr1AF)5_MXn>6W_~w zk;PS0C%wCLxy4a7p3OF~w$@*NV!{%aFU4#$z0TH3IILLqcU$hT5uC$~t{0vo6rLng z_;WCpFWi_J;mZ3xlNkhph@{`e0eyaG8A1%sadI#9^z&()?-}*ZjaihW5SA7Id8BFw zPi)s6Ai7RAE^n3_FRAyId3?w7H%CT(R&N%;aMFm=gruaHVxz8H9m3vABH8Fy zPXW?wJtnlY%5GXu$Bap&0LUSJWL&it%igcCpWGUiGnH0ljsu&Q6{YNTJBMTM{1L|*fcid3_TSv7UoE>joG{2 zehc1lsir$>40zsj_r9_}ebd^i^i55izj@po*#~v z;XuL}+7M{?%YGYXRLxaw;kYbc&n4@(tYwL8xhQD4W69+7VR=R{0PO11?l?=r^`A9J z`!W8DkJ}0;l!*e1J{ny5@OV02)H&-1E#;!20ImWCi+kFfB>yzVeG!oHA3!tpba@af z3BAHHTs8vpHt*`Ili684ok!2|=u0u${UrQ2B;8rH!RJyyuBJMW1YWy0&PHuWSB@Ke z(yq<5kFf)A1dpbUIBh_NwFlIkhZ2zRxLMtr6X4Pn5}J}d`jIhy+ZO7gs><~@P!7v) z6?-2zEl7$Hv0VB|ISu>2FdH!R9E%g~SmS(KK9a!{ahS5Lnx+b1l&}!NpCcQ<7r{i1 zdnfb;m3e$hG|x~?12+6XI>aP@fZ{3`s?ku2&XBIy%1U@=wEU+z>8ZIpItcHJM!!^* ztNe57^Nd^}V>=d!f!&#>X7|$Y2a5Al(C3h*SuV#i5(g&q@f{v2R-yqsbv}jYsrNoa zn$riE1D6M_!Wos&TQp}U(Bd$;BaO{YSpvL@)-e{>!g#q+i6_Fn#+Hl`^3zXbjiM+ z+31^mDzGv6`<2mVXid!SQ2JF5vd((ZEQa+hKz*UkJ$?REBzEWh9{c>?C`F*$i)JT1 zK-8Of6qzaYJOO;!uc*27minGpZv;8KlA(C?YG1Kl?rellqWDusiC0{oAjOd>V5G3B3_NL)ODj5oO zY(DsD-ftx!h+dPZ#FBul0y#ox5B#4_L}X1k4ih|%r%JVKv2o9Lmpwf#E~`}{R@b0_}eW`!|qMyQp=7ThT$nBIwCIViev zeg4t+@#E*ei8*=vJT$u`&ZMt9Z^%NJJU_^i;5?29Eh!=7qbzO)E?-TgIe%7?GW=uF zv`%PfLkL-aeZDzUEu+I~Bzb~#HLt;T&B&TpZq-*!d0T?db?NM>m0p2?R-NL_k* z1zfW_W1Gv(#_Rl3fV+mP^~z)dm)mJNMJ5wXCIfjhTC|-vtK`loo9U@vPve4xN$dj{ zJ7qK)r6qVenf_1q>Ln+@x1!SoX~T4r3+ug3?EKri@;@~Tgz$>JuPU!^ayzTNV1k9R zA8B(q5}}w!Fh)aef>wF&R4Wh@#TFv(`)diQ}g}iqN^1S2?yQ|Tb>PY@>@E7dlznF+lg`mx?9ofjV9KiBpZS zvOC>0{p2^3*x?(7%Z1RlSkS~U|C|VrYnqZfY8RST9Nt#Ngesaj{CfI}_@*h!ZD#Ah zXjau5pzWQQ;{aB7>!uMTYT!LTl`lS=QtPrg;ei1WnrPdLxe@M=mxlI!It(n_M6R4R z*Q0agfr}#2`j!Az$U~8SJ}zIY@Trm73qsze`3mcP4yFLwgWz?HtRRz)R=yA*LAEC$ z*5v1xv^FU=m8+v?Z<0E*L-bf#-l!8A{hm+R8kF!=mfj0hB|{CpM`uR1-wJqCrMGCq zIc}aNA-9{vAUus6RFcPa@l{UAB0k+ePq$L-$Qli+k?t4!QbyFTj2vqAu049}OlONf zIZN-syA^>&us%bzh?-GOH#4WLNhAL zw~Ncaxy|EN!V+BO2%i}b4mA?xB$j2^L)?z)tssa>O4X~QF3XjV7iDdi-Uz-4p29R~P%Q4GiGKo?6ozsMkZp=BjH*uP5*zg)oP)`$CRPat$lM zfX$5%!ubZ3rOa_mJLq;ynf99UCvoE2w}$(zIIs0oJYsop4#K|YSPYdZ5q6!R@>v-x zm}_S%KgHGVRnJP4;;dym{_F8@#98^qPDw`4eAaXzCStWy`xS5VBR`@ET~>RI_WxpF z?4iK3aQgMUg7~)9K@_q4wkC%hl`S_;~<8j;v{^g>+q~e^RBShc2fH z5ZG6mZ=7*-9+c?W{I+92TmIN+37IHJ)~+soae@!T4<|(b*S_8Ry(lZt($6)q|NQ&7TbQ)a+P%Z=w{ddx?}~0LrP9i*x?;)k4=6;0#pbuFOB;ko7Nc< zami1=&<}szo}9$t@d2mpxqyN?!qu;!-GEx3U6Jrjc!;$Zp=Ju<04^}81M+z5f_=`7 zk);E@ggs^^Ke?W?Dea(an>CqT4e{lfzp1X>uB+*MKeCV9JB`92rO##>*gVmI%JcAm>5b4sK=#gW-ev<9n2 z6wHIci1`a0HpA)tSXJDESa9q^p+x^WAK5K?RPGpjFBPAer`Y!@WTCpHGvH@?yshbnTI+#9*--Pc@j8SGil5vHf zB#N!X43QM4-(r7lx14Q*<)!5YYQlDZ*dOkU1q<4wUXTjjU1{)Ys@fy3nS|u|jY_t1 zm-6}?It!v_Fd@;rF3p4HA{pE_2de4Z#mY7V`3Hg5EuN#wWv@fqEi&?8+B_8qT3cB# zZK}wy_->DDr{$TX-G8sk9$kg~9=8FU{^a9sRpLGUPm7s6n+T&vcLWrvJ<&iTDRU|% z24Kip3fq6zudOw#C%VLstJHp0qzrEC?Kv8{XL7S{((YuC;B#-(Pi?H%~5ZnSat7($6&r7o_WO~ zE#vYxd<3snRM559C;u1ZjF1y;HPsX$8D+hG7h8CMNz=9eDw zca;x6wGi)i4V)5U>a1LNv8*W*|NU!{{LMo8JIh}tN5YHFW`@**<(Xv_Z;?xgyXE)h zoMxg^es~6GScH0eR;Y(sj3tK7jpWiec;^L55}K-*m@cKQlKO(9xxV(&i_=z+y*UM1 zq&GS&?_WAt->rD*X=h}+Wsqul_6bRj9E|F^INl^0EV4!2%j!tu_OOp7$8pW0b%0yM zAjH8G>sc|&36Fbq@`T%psY~PJe^slk-}+vjw2B%dtvTCI{YO&106^h`&#M}<2NB0O zYLilOQ@>e4TQ?XgrQ_u*{TB$GXAA_Y@qeUVUH+K7D2#}UwqID<0Zf`43weV^`4E#N z`fiyq@YggY?+oDjEPzMj&}>(f(1qUQYB0pwL0~u)tU6KE`AWNJf`UNc>KiN04?(os zKY^BKT;KZNgXh;QjWijW{Ph$SS`^eNQe#8P|GC4&tjY%A;9T!BdSvv=BPwq2_kUmx z5G6#B-s`aa&+R&fTQ$ix>nVRbu=4!zQ{c5bUsa{n>5fJZQ+jdwKr}KQq>ba(eK4*$ zd6@})DG_-B43R~~bB!dH{UCsbl5uofy}xJ9a|3F_XO5KfSGFO$-)N4_I>w?IoS7%- zGs57U=e^^ zp8ddUWooVt*#U2OTL1y%2dv2wv8+EhLVn| zteaT^V(;;)o1kw|o7K7agdfOQ`a5zTrXI>I%LPqwAZcKdoYo zfaAb6W-HTrLd-7inRK2AqiTYQDoC6GzGd3R*iedG!jc_3M|USs`yoToI(p_H$eF@+*}x3{!PyBS zN`&LvHAT0#j)^XYR4sc-LhhV}6&HrBO3?_@8d=6^%`%J!qy?A=|7*DaL%5-96wS&O z#p|4T(94g3o>5)|xu|M321{xLmhq}-nGut!{YM=DllB$A=8L7vd_yDnYa>QMWZb|{29MzRL4LOcfnKkvB-SZ_59y}SN4Y1+t)DXzbvUb zEc+%!|8!^&QC1uX^(F87EKg^+0RT zogJhGzL5f|29^!F0QiH1!yL0q;KtwvwzG=y7#)_Nc#D5q4-_ZD?V)C=DkWP(Q{j&6U1_3 zea~_s#dkcA$YsOZ^cM%cG#04%QOdlK56?W5&k!WTn+$8)Zc|Ny1n%Rr-|Pn6XKO2@ z{ZQM$e%3t&oI@CAgYaqT5zE;@#1)$K9Q!ohYT2jne9y_x6nj{{dyqW_oD=Qms>`HA zmItQXkOjlI4g0i-_735wYIb%jI`j`hMyxF-Bb);ANB7A)Z!h)jwLHkNqMqVsJO}*^ z)Pb?L%Ps#l*R@Dh*xst&#A}#kkNj+jgD~QhqnXawKl!8s1ZLt+t502hX37p#29u0& zuQ3BvYP}`6WE^~CeveNM1Y$Ip@}zp?Kv%a9FPtE18}a8~y;#3FMbbd&{E836xtdvm zMHl(9_qfO8iguP0iX^WNM`&g_4{xSNqbyNpzk6v*-I!?pC^7Y1Jt64&dud4Ar7VJ7 zrfsCLJLv}hrQ$dZWaEt&wzb7%;>c3+zaZUbY{U{i&SXDP*v|-*0TTfX7JV7ZMl%+& z0M;dSs%J2(4CsFJ0$>G>!vKd&wAzxKBf#jF3HCv%rwKbqH;kF_$1Y@{hNnVWf4V-} zh)E70EDiO}H@Fko`Ap`3rtl3bKYqi97V4BxS6Gh>`>uRg=$s4rgb(zePNKB>mo=vZdMUi$1T%GdyJ`6FO>%`7ba>OLl0`taXbbN35VB^-d= zSK#`?MODA_tzo5&(Yn`|`DXIubjJ>;*J?P8>l8V?I-hxjy;Zj&m@aHhDkm)doDcXJ zO9xp#W~I`cS4RAZPua2G$lsj?MYNFp)j+QbF{da;6~b%(=HfQwchx&B%LbInH1BAD z7Q{TZ57i;~{B)3!5S||Z|F2t?$-18eI`CTomYPZrLKY`v|3@!PmXZQ?5DHvX35ueUdK@9rZoBwXx})fb_wk=obI(eyEj+t(3&agzDX97N5XnZpv)}N-CG#um5wT8e_B{SF2x3 z5q9RnnOHwZ5gTb{&Y!I8_hPE6gcmZZCo|DS8#C=u9ifQ=X8hj(BFjKxH}IX4|F(2M%0zKKa(FdpzVA;qowKi@sWV|`915i0S)+3ZX8PbcbwH2;7&%7(x5p~o2mY5d@N7cmbrlk=asuwL5 z@`I(tGxg55@W0_tfl*l%`br!71}>R^6XcfV<>p}&hH!iGc&dsaqD|K3;vM?lmwcD* z*9g2KVvi(EruKTQ`^2-NfKy6CHtKlt@j-IFl2}$l1?j%j~ z{j;WZeRa)~KqGHVG4G2562$zY%`v9W=XTBusLAYaq3fjaGzTL>&9}CgVOrEq)i#G> z>24^SI&^RnA6maaU)kCCd?9eH-yFOnJ`#kzDt%}Zg)L6_nPBpya;(Yn$9mz*-GvHV zevLQGS&1KW&Y}=OEjFThBmr*70d`H>j zSr)P$mTf%AwZ|5u#~?51Lkp{$YR>YvH?pOLd&H`r)?~f!S!HI7DfsjA#ur~)^0B!A z@i-qm4gz0aaLci80_J#G$y>`CbM zHCStB^SNyhVRG2sS$A(djk@iwej)b98SQSzJ6}9_!vRD=HJzaws*a-4u>nM`I$l3h zyZ|_uCCX}Q<2_c|Lg>3~fQ94u2e(-K1sz z=E&F+tFr6G1TbaG+>&wB9FHb#<-72%@Iq|Ot_hjHD<%Y|l_eV@X!kNkNX*E+`#6X34CZ3*nIBxc}tq1G7Q9Axw&_mR>cMJxaT zt^R%e7uTqGDbD#727dY=!tznV002=0_Xl&q>OIF&H!n$^75V|6QwA;|8d{tc5?O`N z1Tc)yo=QTSu^6uo+EPvwxyT1D`Ea{D#QbOt383`>QLYT}nfi-QvL<#~WW2trM9W!e zi?8%}$I{5CAazTwK-gieB4ug7r4xEh^2#1J@)$M`T2oCt7D&Lei6qP9990YRBANKk zEc7b?m~_%16Tn;e1Y}UpWqv-2+fBzrHZxxmKo7^#U5CXgeV70g%O)i6^Iyd#9Pv3^ zf3CP+SLgA(u+F(Q5hBW6(v!qq z%gUXLD*f#nHqyegIkXL5ftYN65T7SII*CFP*1eIFabtZe!SMPXHx)! zg>=u#o)&%hD!`orHd{Yc;3-3SW~X!Apk;rNY#xSRtQB)4705KDV9?~{)-yQi@H`9x zkMjFm_pk}z5gR`G&`;BR&OYL8P2cP>I~>#1yEhcmX-_y?%r_P(4#Z-YmnnFyDNBv+(DzR{S^SQ(6+8NUvF{O47!{9ZW6QaS1B| zr-|8*LADD%M zpP&VU=xD!U&isAXO?|&GSYMjX=Ez#x8vSj6A^&vlS-`WoCt36Kb~SGWI-rxM^D8TP z(6130UgNWVw_5`%!EPfVvqxl7+@;sZ1LgBTLFySe{|s5j`PDYlvx4$^JVbCxlR==^K8*q5UPeq-@d4T_kzsc=6?$`e@)2%<`l){C+E0{5waE`IrcUS(XL!5=A zhEiLajRPzpTzP$QMAJDTTte>%xAWyHOIwsWv{>_5OrP1BT-^m1AMc<$v{IYAGRlwc zl`QBj0hHXh^}0_MNnnDw**B%G6)gt7On8LqDfS(eqC&|n({_?SSBc=WPQF+5UdGCF z%{#s9heRub98;Q(42#yohs7Ujr zj^OoF!?0aU^G&o)$!<*(auTqVRrLfVb za$jgd{>9g*5Y11papi3a&^04J5fR9KDFpkie<#YwbEQJ`RbRlUku)Cl8Uz0t^I8&I z>3w6z`@aMkDFW8wTpmhzTK)ibrru1uoaw)yc!V|p-Ou`_?AWCASB`Zhgipu zRgUHX-$mgIRd43v662PsfUz(_0=a z**X3m#tga`nO$Vx65GjUwiE!GmgZO1bi-H8P3COdFEjW%9zUr5;zyGGv{!T6Un-e@ z%X4DQD<<2WU-#g_LJiWz;sRxO9My{&pycG&koTPfy z9|mi;*+!0WV{^d8^mJI5ycx=)5ps)}7C8yLUV`CPa-Pkc}a2jugb<`2rLcJBk&gpaJPq~;1u zpG$!#0T}Db#z$PfEp-nB+W!$gm)bqmn(cGygs$KLF^K>7jGWaeDQ?n6%cf-Z4(^fp z!^&E348uw9WbEkrO%l{A`|n}sBk?VM_BErUE4~t7z;r9`WjD@<>Hl8jele&>ztxY8 zYo(&OfBhS1$nHz1`IU0Gf0FANUr}4e)-!~u9uED|X{5OUI{;w;q)JEa?vprJOvt4_ zIrs?e1Gq*pVD8;!2>J|fM!EA3qVCAR8IN1%>XQ~94NihwKV|3llHTu?!%hkM&3ORc z%{~Sr5ut6VO_q;cV z^B`t7<1`D?BQ&t}#s$mG>u65k%06Jeh9jCHNvbxa+ls_Ev>;MHakcwJpI`5O7&q9F z1}@Q1fm%%B1LOtI1O_i`GO>$c>G$h8P3}Pn{s9xMZkX4WQIGF{ufNCg|JXF>d3ib{ zF8hGrWu^M8xH}_*~t}>1me5ym=NcK-Py%e><2A;H0yMxr7y^o#PT@gN z{o`U7(}V^Y0SHP&!$$>Z-t6=8|GFJR04NB^X==5^OXhG@E5>`8&R&jSpawrO`RvO& z`>DxgtmxjiBm$3zQn-EQKpD3{@cHq_VPDLjx*}VWRl?)59VVTd#u}x+*ACN9r5gr; zL)b%{K3k$du>GQO-D^Ji&F|c7NmH>We zWjDsHmwNBL#u6O^+UqE)C46Y4Y2E(J-cQTWb);h9G*1g40T+AKPUQ9jbC<`J1}PgZG#1Q&m%Rr4f;U`vu+j13iJw!5>Iw&sxu7b?OwW?@jlM$q>1Kgd?-khM{PyJP$u9HpPLs>-{uM{&*DgO7r4NIRvwL&wX>M}LT5^m|3Om&-QNXdsR+2!cG z^_;2nk!Ejx(($wf%&nWM!bf_;a3Ceg+kEz?&C6}Ux!W=_;=o?5{z-gL`P#)~y}L<0 zDaHmJi>{+R=&0}9%}?U*%*OaU;vw2yV2|$muz5VSuCdqcnLus6lBsIQ4h29XQdfuC zf`U?99GrMB-*d%%vKdW03MUlgJ4;nLcd&aT@hGXRD;<;9nn5OoS|VT;0?mEflpH0f zO}HmNVSvRl69l~rm$chRyD?EE{!dHu&w1+X+QQGI*_eH=nPk(0^!V&?Sidi)aaDXY z`w>i(Ikz1})NUkbE;K+;V`)c$M4sqq`=h+w-D=#5vPa0S|D~DM(%rM9u<)s+SXmkG zmR!>CZxZ}GA5Z2TYUzRTbP{>$n4d=eEBJiq6Y#>K4`ulA3<>}Q%hAj1g=N2;S3)~+ z&dqPVgI1d>&+P>ux`a=2XJ;5^+NeHV7S zNJ&iFjNyWiAR(0dDe|?nG%C^}ZeOkR0I;!+LCKJm5 zH=OEB(f!$yydqm(H#-ZDS&*re&$|Q4Mq_5;HK|`*EW`^X{uG?un$^O$$%BVD&y1lUb_;l8vLzkGpfgHe^8Gw`Xby( zJbLZu9Ufc5YL8%UKHa1EG6m8@=)zbLbEPRWlMD%4%KMh;rt@lq=yk3Re`U|}*C!3u zC8smTGbXnSpD8{3{@g|J?`|Mg_FzTxYcDz%_wU3_9fmKxwl686pH?n{&K&le47y78 z{red>Y5BpAEZ`73=S<`-S$8f;ItZ%s-*9RW>GxZH|C7b8zS7<<2-$vsgQ(*o2xxqJ z9f}8AJpl7YAGQl}c9tA1R1zQ5Iy(mw_b5Nx{MpJ)TU1B}HI>AU0lJ_bOlVXG^w(M0 zKLFEGb?X1=$Ze(5e@X&M2%+)Xzq8qljWEd7oq{Pb)P5?#u>d{C&w#oYxRYiSMI-^( z#lKaP4fpt;Y~W&_mP>pin8syAO{QTd1Tsas(rzn3kq@L>Hi72UOrAaqv<@I+4RB_H zwa22L4G3X9g`d@(FI#s7pDY+1qZSF>AIcW-ngeAyW?k~rl)X5jwePsqm#k$-R>pt$ z>@0|-X+@ld2n&y2EhXeF84qP<@`Zl6^W%!OegJ)%UhhS%*YVK@f)~w!ri|~APpu8|M`S$0W9kD|j%HWK;cR=5t zxHR#(JBevjvMN5gOB<239A_mT5do|gg5-hcepjZ<_b>4-rfBP?W zlP5|PX$#AF;_7QmGv64PoGdvUaUW3bKMMqeaTVRoymFcAr-dft#pW^*EEG@Kkk6$( z73%@j_oGL0!jrU${N}P=b9muzsHnWw3oV}Li-Eho{~-2WH-nu0sYHdGci$dJ1H`~5 z(Pw{;Lo!|#HJhC4<@S)uCxA=%KCX8DqW(&UDK1{)ilFAD5Qif3#}>@>9zKPY4m>G& z*iJ1-Rvg3c0eB)u;4ptLuAEew-thZNjEv9QN8smnO_NC)iBIqnR0Q;;s&{srCX2E) zez*Yt{Sl${@z*Wjx&-d;o7}NF{p8#(e~Wqh1BC&wW;`F0np+nrw-jrF4-{Eeno z-gt4R3e!RL7j9qVEb66(!orQ~F76%0HPi$2I=);P?~I`{&)1$~in%hjcOBK{6l&YS!K;r~+I7!(xlMiB)Nt`ON73 z>|~w)2@tJ(mD1728zW#(M%WK ziT50)2XvnY(eKS%1_~GCupp zm;~^2vZxSk=gr2&3eX`Xf67Ipo6=UsXQX#Xg7JlUY%S8|)AHoAG|cgo*nBY6=#`O?0~9kg`TkeB9NY%8 z`iCzVJsHs(v`?k+K;MI;}0z|R%6K&FND z#_|5qu(*$8|m6p`A=A- z71<9ZphT8WbEC@ja`hI~Id>)|1)bi4pjtI0ypXU_rC^AVsiH5Q(}M7J7WM(tW;8qZ z7rW%Q9CD=t;_U^~EdmH5{wBAG-#V86h#I=w6YW1bVWE~iKYMN>-k3hallRiiL6vrG zE``X56!4Xi_htQEe$Dq7rZQzYag&j!GJG4sq28AtXYN#UG}-diap63x_VU8L(~RzW zxU)7os(E+)0rKOOyKiK}m{jYRqWV^E%R)Pvfjx1=P=;hG(Kj7)xIQ;~2Kqtxt5PW@ z6P$aobk8#&c=bm>r=qKk?{F%;=ECx*$N(&|T11rnB;`WrfgMG;af%1>>h%-9Zsqxb zymmIgX0DsH!s_|>#*%l!JIY1tgx?3LxE?t(bg-Pn=ax%M1ERx%wV0!Vo~}=1l8@mv z-Z94FLvju_k#|;cx#l651P1Q^bRFkvq#Pr9qBH6*i5GubE9#e!WSa8U7)&*@lKUax zG#iXJTkTbUh^o%Ck~n748IZ+Ep&Zp+E)MfQX%-(!H|#nK9xPubfqU<7ub$~;r|tXs z4^1U?eyee$@LyXe;PKSzJ3iU=&9{f;WU)2Qm+u|3Pk+7XU(H87-q~z&+ph&QOYSU7jY%wKfuyYAzvsVC>-J! zN>j*x@WlrvEq+C{cDvjw{6OPBoYB!&SiZmVKPxGma^fHFk(i2VZfz7W@HMTlGjQY6 z;G6NzNYl~Hjr?V9gx7G_)#Q;M))5Enbsq+^?I^MR3bA{n`9LigeE{+XvD280>?77E z$<(}nU`gH{XUWX}iOL6{wnjV6&O0sg@~dUN;vdP9R&t)Ybbz>5wUc7>}u+_bmeM zms_+)fPtvxcUlw6iZWm2lSo0%tzeGk>9ELM^@iO6on}q3Nt?j zX4&!ajzQ2d^RWMUNPwcO5*uN}C;6Y6$$vkIeZX@3s`aWPRta2@!wCWgZu5q?;`Et& znyu9Ntb-JX!7r9HJ)YcP7f(Q!KDlq+KTt;9w5{g$2W|2)pMF{i85no1KIzv8liD{R zKo)ynKR()|x#i&VL%wkyMB#Ul9r#QjK03y5hC|?*Ch4V@gh#6e%!ka3OIX;z(FocO zu-+X_SOJM<;%3GTAQ+SiOfNdx19En~`zCu@SrYlm5q-}7Mr%$CnN;H>Z-peq__{gw zGU^(QNeIRRG^p_!3QfFJ4eQq*I&aLAMff^;$N*S_qUbijeT}fRK2;h4sH~Ns z`Ob-~YYj>Y)Crl*_fUvV+$c#J2N+=#rZxzcqK+`0eoQTa&K1Q3@UDDeKMQvSf42YT z5@N_gRH;7~@nl<1TlpI+y;L(YXg(#_OFK9luv<0Eh~bCB3T=71pYY_QTpWEfV=pypecp-^vaoKcsz? zR38D17cO}fkk&+$kr!MYxQQAFDER~Q0(0|BYEC;%$QDix*;hSF68LXI$CN$S43AsN z6-!N#BR_fO@B!sNmZ)f4wlOrltay^#S(ig&KO?&l)t1ERq(>WJm`25| z-;|qOVYB7H-XjFBVXfL=x_He2)XI9sgjo|v8_UiJjVl5?(B8;?sG(<5|5R3H4-H3E^MZJ20J`55u0e}@lY zDu{BNKZl84)~^duZpf_!hGkOfNMNcrNjN4f84}-h$MXioGB=oAf0$ZYKic1M=;-)$ zISXj7c06_-A?_NpW`J|sbtRuTV&^{>WEhwu4t;-lyzx^{7%lcWl(|9H6)B(IplhA@ zKgS1D9`H<)XHIG8o}F>h3DqoZ*K~Rced|BamU!yN9(5A*dy{n8t$NdPnp+wNNwLwz z_RGa8nVkJo^gN_FgT{|;xQ-#ioQAhB6@q^*{Z@89twlLpBeCScrqoG%t+JK=b=+WZ zxbs66TOXFD)3FoStB-g8IzIpVuk%Ox<$sk>poR*|^G}m#+m}=o2l7@)cjrsds&b!- zuy3NmP@a`PtY?@~GV!4>a|&ICLQvO)E6r{f%Il%H<6_J+66pB@3AxmidT~0yMlSg0AGDf0{K|Y2w{pLIC&Jjr{U@d}xv+s&RAr zy354jxV#|adP&52JFX<6(BdP1_qd4#fz>4VygAo*=MrA9#88j=8OT zc~cW%Zc)46M{%?Kr$JYCUiJsiy;c0xr}mLY$7{Cy#YC;cq1uNCBVhW@K7L4O=rZwT z-S2Tdq0h0tE83Zzn4s)rtsfCQVOifDiPcJcytJy^Eg@kn8u#3FyfVb;61kFIiP}%% zIbTI_ca7XMYBKW3372W>-8Q-dJWh}8VcoMzQKvqeqntv=hdoCAVdv?}@!02p$WMZp zbwbOU@d2`6{JXq(m7NVSIej6WHvqpGe3K}r)(6JR|L^&$mufh+^R&hS8wDlJq#a=m|pkrAg&q_svK{Bpp$01 z{`uEwU0o)6cOI+&V8z*!9|P_bDh+xX(7z~-R8O(m?MFqT&%x41>ESP7b#rVuhZxVo-yDc#`p zM--WokkNJve5_gL-Xx0TvozbupwP3%)cA{)+KgU%&qfTqk>4L0Z>_Vy?H(SBv^=5i z4cROCPUwC}4qHx|q%W-|mJK!2o>lb~E^R;<4-!>O@)^L(iY^m*Y4m3f)u--3-zK;J z;?nw&>u`5YaQ+GIOk=G*ARVG^3Wyy*?(M*(6XnGdWzWNE%`gosEA}N3eNiKdjzf=E zz%@nGuIr42nTBq0=TlYg;W&;)2UyIK9(!T+w$;r~tlryG370e&TpbpqHX-v{n%9k; zFXvM&KJE*pf=r=@@H40$Ra7@jyiqIOT>Ny++YST-|N;ND->cq!}8NS9kwJvPDJ5^VltsVtaAG| ze0<(`3k^D*)4LhpT@OUQQYI~|(%necqpZjdo9is1&V$k-s(?gyECT+BpLs*s7}Z;0 z7J4%33t&)zSJw%_^X!{rMM(=Y_GSy_{NV!`H-%}cXBl8-0=Lsh4Ff#3wqfH; zbl>Q{x&a`*8r?D&3z}pvO0kKsFEs$Pns){dlH5`3;yJA!)sEo#4C9HF^gI&#@|3xp zJzeK(pY0Ra5R)8kYpaT|=mRYwB*k@8V^Bi` zKwM`&)KHmwQ7+!z)th>rdVGPQr9%af}j7Q`O4ZX3l-;E{@Bef%=pj>zRtpv zW?r@fSl5|nhD5OKBRz%Nsjdo!g77CIy*A+jN*)`aN#WZ@S>?CML147bn7I2@RAJ{k z4cpFbA-Z8bm*FR^j4)C)&d~(0d_V2y>d5y%h5TCIO8HP%+}9e|um3bpgX(G<9#H5A z0$k1t=nA8(?Uk`8OUHqVSGt??LHfa)75AQ_i4)I>x&%aM(32le1b0^Wk%nhPaP4|1F-2XR0y7u_P(R!C{{Km?{d3*ydQjz!JYFCU?9G`ru`ju;g!E%J4If zmN;~Mmn{ts0xq9h6Br2CvL+&j_48-8h|^R7Co*uWBBB+3ghCLO97PmRM>qknGcHC0*uXh9sO zl;M8PM9jM%(s{#zHc%knc zs9f(7nHG1Z^uvrr23tT(-7BS;T~cMS-YNlM66&zh!$cl**bc~rC^beJXD%!sF4esj zFY!QnlDRBL1(7cJyxHEyCBXTT4QHe?BfQR9JrcTl$gDo-j;oyc7|tSL!l&c(ElnJJ zJMG>HWLRJQ>eNI3JxhK(T4(MwbNA%;Pn`80r}Q)|CV|qW&>9A<(Mk-@&HvUrP5D4J zEqVTJE>6(pPIaq82Zv`+*ZzQiIlk^h?^ zQ)+89@sbd_W0l+J0mGMhjf?ul>6k%`BXPF8*~PNXShBcSGkyFF>n+Hu$Jjp)Ohe4v zl-XB0lxbMj8I&wX&G%6Fwp^C6aZSom?;ecwdpXDpv z&W;>jdqCvvSXpDqQ_!t*{#vv%Wma$L=x z8~{k5TNluciexI*ofw{2{+G-FE&G!A6hwofI|55rg zjCu6lr3Wi#8*O&+DA`NnN1KCx1eDf)nCDx16H5R}^2-9goFAKI!W@?yS`}i^hIryU z_N~OpL$rVR(kGeofAP~Tsbe0u<={o6&yEjhY0c&9IFw@I(xfL(pbs}zOoKSdfH~*5 zu-}vb(#VG=ll9esES-pl)W$|1E|2v)0&xuv(+f$6YA8*{lL{baK@bYPzdcit)*1W; zdhUL7pUls%Y)f0PhiEh2xEXX69lzurjGOC-zl8tg<(48LOlXjjS*CYW)Byr{QmEEQNXvlD3kdLge-|5g4VbbyKZi6c?&f0BHo-0XKw^I)`*h=tOC8Ste!bjs)6A_4 zr2%i7!ePt)dx+_et`A+2(1QiuQd%*SYwcF%{7MqQ0{;DnoX!m6YvwS$B1d+_HkgbF z^ET8M6j zj}_h%z-GmYf3(CY34uw25^6jbTCfP(4H7G_&rx0BnPHe`YH{m-%AGUBP(C0Pm^I^^ zn(71%`eq}$qO+v9{#6>=X4mzrP>r9y)&m#LA4>v7w?L9vL^2)(YXq)S#8pD_su||M z`%HV|c^QQ%Upx`KlYhCT)e%GWLaAB~!mt%G&Sa9wEoLJebr4&puyp+`3Hxvy_I^O) zL2=hN&({etE6XRor%whwO4TIrs#hR8K7L-poQ0Pm2^xO2cw2V9S9JE3$dX{?p3Crp zr_j4zF&95N7y$%V2Ky=3q4>oxIs+dG7K(o$6S4<)@k_xEtXbG>%bJN!a)pCJ3H%vn z);7TD# z=MOyyp1Jb*zHL13UVN$?_#gR?bGsIqLgi02G#4P~DgK_FY(HBZKT6>+_PC0CIn|{> z7JGOw$B#qB1SpV3tEupm!Q4)k*5hP86H53R>u#o+F>f5cJ4^*`F`tAVu+Q0Pn2g6Q zC{U>L0Yl=0)>C{!WB=G=_%JSGKY6dP1&8WE$=sn>vks=f`~zvfT-^?%D9f;S261|$ zOz}b3WtMS1%Z}#}&^0abah3L;b(eM?1Y8hwKo(e)uMA3FBMNfmW-nvWFIx8RTDU|I z_iW;>N?XN>8#7IvEP1F(5DAlGed+v-j7dU?B8DYv1D&n`hlWm=0GT_!t zz7{yIHCbkYyQQMygdjROyxkgAud!f6FqKT{)A${XV+$ zSb;*j%(5zG5pIh+^&8w)oO-PfKVS9~^{ao5_Z7zU{rBOUdt+2G1RS!0ZnYh^AgN&6 zcDYIX-dR!JoSsB`O3-XA_4(f!&o7KIx%bJDJRynlS!!hW-k-M&zW+QmN7=={$&X@H z31DI+TSz!&nO3Q-m}s%Q96T)p`Uo4FRO}G;#~6E1}t?uUXa&i&~WB-`25$MNC)M{CU;d| zk^XqIZph!koqP844AZUzOztDcB`)BkIiK2iyV-B?ER4z5jC*$S_tE5Q1K_W4IHF8M zby&FSZp3Za(I)efqNT2SrqFM|KH)&WuG-H86*$k8m-YxCy1--Kb&pqnzzSyL@H|{G z<_Ug={k6DmQ;+P_5dG1Vk8KD4sifn!c1|^xQ<*eH-r?k5>?VA1rclF%e^CWw5QlDe z>j;g+B2tnF4}(L=rIPo1W<~=H=eP|hdKX4@xj5h-O24DdKGA-xx)>RUk4*gky#>gc zNQP2!_aww+pD%Z%dS8TQk9LZ#b!~33MLc1>KN?1oA=sKQQ$VnX`}q%wT>j5+h?8QP zfBc!?pBs>t$0jJyr!MFJ@bwl@QE<=SI3Nft(jd|x4HAl!G>C{ucbAB?)Y1)73Q8j_ zA|SO$!%_lF-vd0==5F*mWY&H-t`DQ(=MlQJuU$V0mNejb>hQO4$-tHAgUmLoss&@*cF*D%p@Q0JUV4IPN9jC z#u;RbP=oG$kxju6bDNuKx)qDKh0RTCw5gJDYz(l^d*b&uYTjlsjQkd?up}Vb5Uj7+ z5!NxMv_X*h^yU}jubYpac|Sz04aOl07jjxEYjZSH5Y9$HJU~^_ejynwJI6iq!WOCO zi*|Y#w`oP}zKgg`&6%VhAY9C}4{0{^8%7uNXqzJ62{c8T(e>KjKIRlKv+Ft-`=_%a2p)49GfbOk^j zk$G!BW3fjL#~`of^H4}vVu6vh1;Lgw80(2PNla*8#H;CJ_M2RFtT!ebL-3O{^Z=&y z_3BZo{8fbcU}}1xNN5xJ5Tte$ul1)mt1%MilWRwsxmhj>=|{-Dz)9X-5r+Eu1yuX{ zjtLdlF72~(ILn5UVf-$6oCXwTE|nNRzkP7>xmrID<2Lk3j{9LdkN`HLa;){L%zYcE z&e~jtwO8xM7*L#z1cO>=7{2%g&*KXiiqP`lZ@h14>KWFMd;XKP+w~mC?!6^;lTRM< z@iEx}==~D6-8n^@5Guz|LC_p~G(PgcLhGk_610)-0kTTi==yB96*NY(`wOmO^5nyo zwfGn)vmGp5npkgDHy}?iA43g3f6(Ty z%YwjLzPI|}HqHjg2nXn(*3cN~FWO8-ngN#833(MTiNwdh+KuuJMS|PI0i2oP^X3>O zF}5_fxiCeWoD|3Ks{I~eoC@<`LA&j`RtJuWK2uXusRsr%WyX3FZ=|(;YQ$`UDEj;b z07q-60+sK7;qk-_mu)`uo7UG`h5-PiCkbqo|61}b&)e36oJRHVPAK*GGmKn`C{i9Y zVUfkLQi~|Ej-8`%`-sXZk4|~qF55uCO|^8Q9NV|j5ww>pvU8x&+^pfi%LZ-3Mn4(Z zJIA60dAw?NDG@&H!}u3<-8sX#04eLAYepTRH|YR1JsvhkC9CRw5N93#moVx1U9(VH znUzDe$dVeMm z|1LLtC*UvP+xt9o?@jN$+_PhuQFfRf$$-mfqS-hQ=M1!GP8-fiC~kH(oh?B@d12;~ z-rssj(^IwY4%wbf^qx)6?w4SfJjfLgqdniKHl^4OG^6poaM-;%-;Rh%Pzdc!6Q=el z8q4cI7;Sq})!OJNFO>-%m!^|0E7oRqnuJgPj-yjse*} z%*AAp{ww#~PG&yz7HRKy{FYSdmYB+pBzROpLwLffpZ@90jExo-kL{<=DI+r98vLD3nOh5 z6$9KrhEzuU>gGwdnvJh(ypSU5F@E7K`TAvSugkjrruR?;MA`p4$;zD(85AyM3lB#) z!3a~_A{q8aX~CtSM94Jp#tYnM)D`liErD@pAl#h%j?6O(Ql{b$;3jqQD*y(RZZI|H zJws&Wi`(eK(=TYqJvZ>T^GjV;P=hh;T08b*7TEJq<=D{GvlsWv9P$VB(E!865BsN~kbiAbY=82;OtEN9hu)q(@HOs7* zH#Sl2)QSkkDU9uw0%|S;t%$7;7q)-T&Wj+DP5Qy0{I!=9n$bOgG`6H>>gY&Nk)$7g z=UV-j4pE2F@!sI@B61>Q_O=rA+78T6&Oq4Mu7-Q54jocq@;8eJGYy3PG&V#+hi&G z#c|5|J8qDyzvWe2SLtI~p^VEdx9cPvL5M} z#m?Va2CmhFGN}MnkA|VUR>F~ML)&QA{p%BKfNeE9B{DeSnY6lhqAH4DVuE1D`a83L zzG3arsncgnapVw}xHL^sLdB8tF`;M7dB2Z21i79-?=^8{OAGs4y4u{U{2~P6tD29e zc3-Zjm3TkN7e2va3ILW2#w{9QTWYWxH1Th$zRRF_%=DlE#(-P)GtKD`X=~2T7u4 zK<(Otc)D_`EOtU^GJXaTQNP(#WbGyF8y#+9PcWgnW238kBv)fz`bu=w$_w+XnoM z<=*jcv#i3Gz3SgBXg;KY&N&*8vHl-6CicdAMCMnS zXB1JH$RnG`)~5)I2vJv%!;+YLhQCBo#`?UE{wG;$Lp8wFcI;q7Q#!5LStI%i%@qG^ z1-9JjjTcjQ@q$;+x0=*tTM1N}(Sw=+og(0Kc98ru@Hq%8v zW+RM~Czj4e{XVxBncfhVeU=K7+LcGO7Z7*}3@X)(RAaIvGrqMpFR3CW0h-rdcVLPy zTSOJ{T%IR=C)nu79Zof~B~RYnjeFb>y)RVD8#xkfg8{6SQHvt$sMyfRPxx;g{ZeTj znjU0eZ7SyesVqLA>0@RYd}I@N)hI}$Sj2fg-;`0WuWWGHxUY6u-2;K2S3K9ZCI(MqaTePC3U{T<(GB>NGL2SGIyc`-=rW8>8Isd2j!0 zjS|FjligJULXQh6BiZmWANW%(+42-^WcJiBFdYrR(zKVVZT+zxDIE_VP?# zTuNK-0^8|Nf@7r7r-(6z4c!aTS9-n}q7{i!+bAvYFmqb};<^@H+Q3Ral}vKD$Gnqn z;bd*>xrt{7yD@K57)XM&NzNCaI`+TR>&XrQv82t(1`bb497c;U>@} zH%F>boqcY05wDB~7AsR&`>Ft%$H`}SD^)lSBvs7kJ4pxQvgi4AzXgC;4!@YsL*$D! z7BqgJKaDbgBbusvKrQ5pb+lrW%nFVBtT;EPMLkPGzNzT*&nyxySLM|B2fuJJZk%j^ zvxM@M5H$We|2WoMiZKfZMLCRF>v}#Z~2_Acgan z0dIhT-LEI^pawQ(vg4UhuHU{PA10rCe)Q@k&S!4jvRoNXGmRT%bja4{iNvx$#N|)R zqXEvu;YwGjGHNnFAdR0KO49>y^K>sO%a66~!9K4k1L7>sVquXzte%m;%PP3*EtY0H zygX$wUi$^y#Z}#B#)@#2fH;1EXqOx$zhjj%mO)DU6#!wCb=dn%jluX*H!4TsAt{X% zEMK|nF4@f~DiHh6B}3P<&m8xXYzk zDV_iu$;4aOZDQd3;lr)X2gf)aEk0KkO&pH(U(L#U4+j5~o@e|J zedDIZY@Uzv!<@j;tK35yw#P&|QtgzJ@WH{uF&F<+zX#rdP01^q`xb;vgxbk-8Ag=rX~uF5OvjoHSQF=O18JG90^T6@~jR;5Fqpl zaQ;v`-yAK?QQI^@dS)4D6-YfMx2@BXyi}rh!AlMI0`2boS?auL7I6cqQ54+Kyn78* zM^AX51(?1y34NLg*$MKnn=AA=%&A06JEw@1$MeXh#N*JaSZGZ*kPN?}VP}oheb&wG z{2A&UxF#0nBCr&ZIx|<|Gg={fZK&&mH={ciuZ>+dSj5?S#wbK^pH`XQdlokD4U>Oj zL_~6yo~PVco=*5pGd=pN z&Gg$k53^=t6PpFtNr)AtL`j?+2`IjM+f|-_$tK=dQy-sn(m;jEy?f>5)s(m>)wC6P zYp5#?&1z#_Hy=_nvpEi$G$5R>)}Gv!KqQCoX`LSg(CCk4D2et|sG_nf2cvDG3zv!T zx_21kr3tht227Uk<>efsEAMxCZ>C>ok$L1r=XmKcDJ6aUr3osjSey~3>LW|abEM2l zd8Rf$-UmQHM^Qn(C8AYBEb0y8SFeL3NejgAv(S1tP-akqW_1C;RP$4fh_HD{> zC5ZL5=lv{wq@KZyvDBNs-IRb2O9}Z8#JVb!_O_ zVZd&1?7BwLU@J`)nyqGrRj!&YNU77JOM)Oo&ZF0^GXn95&bMmqx0i@2+%HPEfO4qH z0k9Bw1_VYCSm`b%G`E_1>Tn8*C~Q4cVDl?QVF!J}vsD)_fC(28KGc zWLPihwZEVtO?e0LwHL=1+7H>i-s1hk`&j%s+q*?TQJW%Oe7QdaUX!6XTn4(0R{<$gu0-J&5_cvd(_2)@sLmoTW|8S3bTfH%TbyPWb zIBeAGeLYu~*H7Pz0DJkS8tp?MwOtCW*N%U}z{1xU#qTb{Gk&+gk+#hD1&tGjJ?toL zFZU7}9)PC0_pCQ167QUazty_bxZVKWmD&KG;AwmqDmy8uK9go9tl#!B@(8-``z93o zvfWv~Xe#l&BmKnJd3J2#u;n3+rpTfshmm@t3&v--z-X1YbM?!qWc`NE+TzGNNi{+iJM>$+X88+3`~z2hpFP`X+{4d(i7H zqfa1cw51ZDi9cT%2Z06|uW^`3pz`?750t_6P3Kq&z*YpUcbLjW_u3hxrfIwnR5Ib3b!RsP9W7)RI~oYYwTR!;A#;%%-qg^YQgr|OV*FK`c~=48gvvD6+PaD zQCb)#Mg&q#-C8=p1*A!(XKtUce?u`|foJQYrb^C4z>s;I@{miceUd|hsJVTL^D<6Rv1g#4*vn+8N~Y; zjJF|i)<42C@8f1P3Ilq)gG75C&G)cVSN%s#US1BpAopaOa$DhdpYO|CZ~8gfJOO52 z3KP&QeWDmCXtiZuS(u#`SK{)2a^#3OLzV`nZO1DJHz0=Bi5A}iafZIkb9_fZJVteX z!Sd>OAp-I^TY_rC%|4uY;Rj!oXY376if*SRAbG+zLo)KA!&t6ZU(`^DdIiPl>{*mS ziM*Z>!g%nTRyb*YU>2x8hGIe6(K-NYU-%1-0M?4rYpI_2dZkfKSv2Wi&@)W!PYn#j zHSGfuXKK)ZKdX6L-eYmYb8$|fizVGlHTQ$D)`sIyolA1ss7}F08mi!r8V30^kCPOf z)o(^z;7*DuS63W$pU8qc!UcppN?^J`a|>qsIT^Q=dw&0AEMz5yU@cC;b3D6N5+i~)`q*s5 zm~PqnlszXMjf?PDbhBp{FVaB+%6U?&kqxGX6I=|6Qgb&!9FXknHJ(#MYp=L}vMQot z`m1)OU20`38TK(5mbg;ay=3~H{i~>NUPEM9y*)%wP-$KHIs`T#L~9bO#f81{Ehh(q zKfs`bHmIz%8kM(mxM5(_W&Ov16oSP2%0xe>VE$B;6o%aX?{xx&q{!x*uhfniF75Z~ z*lH?L>Zv5_J^wJw4P_k@c~W~@Te&UDU_NiJWhGy->5c;`V<_}>HQ?ZZ3~Ejz7xq$@ zq+OwQE&t{_p;h-8W?~7h(_a=SP)dHc^^+BWt}^G|UpfdoQYUe?bm-LQl#>>j;uJJt z45u^D$*m+EgIYUUL~Uor#KF-|QHzX4tAkz=5-;%lkH6DK_=kry8ifG(uhi9kkCum7 z^i|n>9A#Hrt;-fmE6ehkaSq(!R`J9mhc1@37Jo8ZykT+batSxpm4Rk-oqGNOu$xX{Rrr4D0qWaZQB&{tN!nAl-9ekh^`jHR>iyQM zF`x6^aYnC?I3kYwk#{|Vr)lZ9p5BXaEroYu)<&p5j}RGVi6ZReUl-_%X!WnrQt@ff z=eo0H0ny`%jBBHHU3D~h}NVtZ;KMB{sR)IGWVj#GT9%k%#3xr9d)3tG$9 zR&TdQ*WWlqz`1d09-U>znGAHWEQjj_dJ@AO0^i&fA8_1Xidd*yk#P9^ns)7W8#P0u z(A$?@dx>nEf#z@RYrON7Gvnmw5@MTvnJ5J3zmN)4a&&{KZ5 z**U$tU9HmEG#;!Jx~m}|kk5>u+i21Vh6yI!O{FRg8=9?@)JIjB4n;fCPLvk?J7JPl+)Ny_l)5e8w4<4H+S4Jcg zZVPmdw>o%s9@BRf?o81>7DuT*#q8XUB;yD$$4-OKyOmUW`G&;*dW5^sZ>-p$Gk0x~ z=FU8U1#RW3XVmt$z-x?Is16TdysuA4BZ@+A+}qk(`-$MTi}V{dI?gmKCN?V4x1LDz zPa?+<6absOm(|Dz=VfCunT7(@aX0i+llSUuNP@?4b_v1K#rXj0zE@OAjR0E|70qK0 z9@j>hOjoaFun3|-2%HzczmzcF~>fQQSYanJ5d&~q^(%m0; zhg82-ZG!U1xM?zyrI59~0R1z4p~D4Uz{+5)G;!(o-GbtGN}q-OKe|*=IwgGW|{flLLN7UK%M4o7ZzCrlp z2TMqF+Ixse7|`B4m@rRpSJolbw=5lwCW;kGipqX>bmNLFS(eMIRxa!;nOCge(1ow3f{;`>AoxT@wSJ0(jC3{8Vu659qpubJD!)(|6CkeWhuFiDtxrA|T~GUiH9nA6w$S^!2jm@#j;?uc0*p zOilW6gbZ*2b3DB*;8LTIzQx&aPR!?**XFTM^jK8ii&5BT9N83CN{-@j+dEwWPNwm4 zcN};w(0ko!hcAv#Y3>La$ zYTJ|jiYzc|S0rBYwBi0qXApqSv`%#s3p}5A(1r(RM5&fM35S$F#fo_07LdHWySJ1l z#j(5Kbk+0&9>|Sj_c>5m9>dW!Edv}dm!-R1vFX2fl880WI*Ag4wASe3YqS6vz2et! zWy+?ak=EBZnmhsu-PUTepPs9tHGYSn5I)K45WcKwL-4%ho9=DFNs#5!(_PHFb)5Yd zXQWmde3ev_A%*I`b$p9(g$8bnuxj{M7LPaC;uc&f4b(xpb5jf5(|Ev640&I#W#{vX z0%c19vsYHNs0ljSbXE5(_$Nb5b&;L%P@o7#s&JO4jv`jQPV~gdfpuTI#GOR0FKYg#H zl$m-)TETbwm4TKhZm?V_j<}E>{KA1PP7~E4I=EwSM@7MsLtB;%80MW?DmdFd{=Jc zozC2^2_zCH&*&gbk zzR!%*K-JM$1lWBaIBCpffq}^9Z7;=f=%Tc1XrzU=Jt$&#(JJ4-l6TBrK(u|BjkRN# z&Jl8aCJNa`wP!bdTE`u2kaWx}Y!;t=vqu?zYQ{Om(^<_a^%7MLMJd0$f>e~mG~!{B z_abU6f0CJK(8r%CIK6GYBgM%VrGKe|;3Au*IFGLq(T=A}J3!yw4@kjtf~*;O?aBlg zG)=$1FwC`lC?v-9j90%aSwM{K_EqJ~2^%e*sQr(l%YmT!cX7}(6lU*jr;7_#HR@&G z1Wi0+C3jes@n=qBpTZxV3pDC<#Xu&l&!!l;S&Ol&Xx)ov>H-80X^xpMJtv}`)nRt6 zP6KD~7)9VxH2T}hHsMiJg4~Jtwt~AX{qap$cL8bk$_G|I{z#dopN8vnrq=s7@ejQn zPl<>ny{2fOxigp4prKIQFI6M0tv&nGcSn^)I|&RtsT=|w961trzNj~T$ra8W*@bs; zd0|+gxaor-4@6`80}DQWLBql^>G3U=){M@vwQ@uWp-E}&piEJU7g((&3h4+N@P?)5 zIaZfH;!HeO@uxzn-(b&}0D+4`KQ2FE@VBDpHfrk8)GfiyI?T5WQ=Sqz-VMgz9+Q?G z)AU(x$4FgAbj>f-v9-}H7Tw4aI*=vdN#5m1ExV6fLe}&{HN#tMPiQ5(lmF0jVK1P# zaMvBERuOK5U%p#-N80$CRZHvsNmF3X(hRQW#T-gJxfJ$xDw_1=bt1a-;`@=|r*#v$ zNhBTKxe|)tmR#?159?;-D1 z>F}U%0nts=R6GZ`z%Ip2#Jnm82x~&>mJs;@tU_O;<!dUwZICq76S&3T zX;ffa0nUE&zOhJxv>+01!CM797Qd`_kOB!@`<3$_FD9apr=Ufef#D-bXE-@_cNbo3 ztd3H^`y>d8nGW|S72aq|HE|8b#I{62)$ z^()dhWkfnE=KfTTTr{SZX-(0FLKBZ;L>x~ZU@z<-y9XeUOVbL1nHEu&KN=4A98>#i zAC@_jd96O}d^LBBj&>wH>}cIq0kJO1>jz0d0sv?r)yQv-;R3B2dsxfJoA1URc1DC( z+YNN+b8J~E`7^@i>%xwiJsBdIZcL}|Dvj7MX=vf}<(BIdRZ&glw(s@%T%uWI-X)xW z%pHNvqHWujmy@=pkTG3uo!~dyoREYTM9P~ABl{o9B>W9xj+rTsLyO{ndB)UP`y&VL z&>5`nHLmKNBJQqiVz59BjwwL#XcefJ~{e9*a_2Oj<91la!& zw_m~pM*-#-b2x$HUg8fQ(u0R4-F2aSJACFN-+9VutV+<@wXFZ>KP$T9-3EAu?2e7~ z-+8{DiT!TfbF=^9Ney!bChS;_#Jq6`OBN`x+eH{o`JCJC4(Zv4r3$+aRiwHM>6kXZ z!!1wkeTGCa+-)Iljq*8Qa2V9k3iCdm)S{!*(O8yB&#>>4UEw$&Z|b=)Wf@W7aKfm{ z!GX*i7p{7$X*5h5aD^N*lNH?^@&{)vf#eOz23=5%zp3Ia5y=r0d;so%(zpq_Fd2p} zDEXeLmH1qGplXY5!}r<$C?DdSg(@dp@7dyQ9F(vATnJdc;@5sdWlKKAa^`(?6fg8e zsIX(;a~o6zbt<`QOHyGf-`##~F0PFqgvXSh`TuNE)SwYiu{-7S%h_7XFFqP3E`V zyE6LmDvT`cm)1VyF(!xQ$8Wx3@ZN!^RJYgvz=R6dtQmTrB5i4qa0jdgRL~8WX2bd3 z4|-VPBUC5QQsXXYt%0YMS&1=y>kP%$i!Wco2^PKOoeZAkq#n(mzYGfl-697+zUsCd zR1S34MUwSDgQur@sr9`BXA*4-Cs42up{}X<% zdsYbgyRX|rxD=3N%hC%n?*1mp|2rw&NIA(y^ld4&WVSzRxYngx0 z_ZXRBNoD6-6zdB+LC{ z^)E;Og{dIb1qr1P7dq-p4_?7M=}s>IRuQQjWN(vqn>3%lZtk@?W$xh8@)S{x7V&H% zz*#N#|GX3XkEOmT2C3P#N6^W)-JnL~h*?4gpBEjD@;biQSB?(7B&rxQ-OZpeFt0bi z`MR>eJ2T1=*8Pv4vu1X$I5eDS$*|7EVNB((O%Kvw{kgqHEgrM;P|8G|G3 z#USdGFep3t2lMtgz;>+nJ7S{OUXV#l${KTx9_FW$O^bRSe$0V<#4M&+T4=H!#ArwD zy1#KSXFmR{f*f`{v?c1|3Y?FB@S=wmIS|nukl34AjZmdP>!tEz0q+&~3Qw!nQBVpZvXAn>uc}*0v%q%lIb`Pe?_n%cK@FfTHLY-%fPU{m;X_gE z_bPqNidYt}d0U97?5lfN<|@J;^Z;f7zJ*gsdmEvIj-S&xj2EN#jlD zqkpVaIS!~|WT)Yc^t|EZKCgPFHyF?5gVE#E#6mly)UKK4rNHNoj z>M2UW`1Nc6&QD4c#>j+H@EwI9Gv+(|PqF8NJI(6*mn*?e=8s`C|Jh85X>j6Q-k=j~ zJQ+x`f&62qz#Q$F;CM!MQZL-&oQOkOPXARn%Ba8BC=O9jSTf|EN~*IUkB-Z)&cW;o zLHBZ)>VJm6+4@EmaArV%`<1>|<^Q1kW-uPmEOU*G6^}i>OMGopveM?rBIsacv z20!#GLDm+SW$VHimPg7nVzg!cMH{=ZB*>z}P)TNwHXe@M6G5h}{)47Bnm}h!CkVfR zqU>$_;y&9sV2Bw?LQWUl{<+*Fl}O5+e3 z5v0wrEOso^>lq>h{eK`dkK>7K+7;8}7#$~S6)&zE?X8^x9r4K@G-B>@`StE!3sm;k zN0JQQ)<0>N+a;f@%{CCWbvI~Hxli5t;IBvi=4l=24z+VjZz~RWU9>gITZ_M$`1hj6 ziY1C0@iJq9DwOQ1^OB|y{nN}z=#z(Fq4kadfyS@LXUy6Emw8m|e-@ZpzuTF1A z%2bign7flW?4tt8eWSlu^7rv`miO=Rr(Wto9f~%_Gx_j56zv8;){Hgta_2Fc)oh`B zKWb*0fo%h>f)4Y)56@cze^Ahb;EDk`H+n51RbursnSnW6cy7;Y`Zc-DY0p2|{;$o= zLS}C_sgd^DVE2+NweK>4!r>jwH9t&zW+|b+^0EK1sEkR7^X-j~*{UITL6dQ7ZPXyk zwSBzVZcrKZk8dHPE>Mm>a#*s{sxgFd(7Cr_3g>6~tWnSX;?-7-=&{ENbC2)uW zjlG}L--gifz7c7a*XJRH> z9wMxs5%TyNnZ%*DT!fPm@-hKSv{l!|Z{#Fkfn9|3f4~*j*O_|%J*~5fzhXe@lnR#g z%e|S_Cd|xmzxxHgm?O7Xt4}&a?&x4~w_+*@M*P&P=9c#cS!+XHx?S4$hTF z%8wd%9uU!?{`b?);P1n*;e3K66C~(qe<<18f9-QW59>P6I2fzNJGIW4_eYV+h|K*t zR7MH3|9+J3pA);e;W%!CDE;(sBbdG2F1^d4r z2{CNt5t&#V!~^;?7-kA2szoW3BaXR8e;Iq*>maTnRNUDmOkAXXi2Z<=Mj(z>#Qyb2 z&Id9sMba!-gmgq(^uGqH2ZJ$jrGH;>K-W)rAv)M1^!gKOu)*C}cijK353IHQ9ZIml z{T>3B$uIrGU0;h;31vP)NuXhnG?tiu4OoN)1_Z!R;VWB3SPH|I)shE?12Tr`xz569 zu>LYeGf>T8~rWqaz6qSUeTGNw4 zYJ=XmKf(Se5rKYn(k31b3ZK%$?r3BF{pW=$=8jzypjn2Hef3yhB>O8y=lFfp5R|9X z;{PFWk=}UUE(a!`52v2zgwO@}b=RgM zxa9a$=L!wPV@B>ea0MGs&OWjxTH!%W{@KvXytntC!5?Ccz{lA(Oi>O+AKUh(BpIom zqxIy#tckT>%cBX=8UHz1ZhZOqKf-J**SIvPXkvj~Y7?R|5?A=tU7WFx5qv8Kl-vOE zknqI10GS17t6P(`)bbs-FBWpB&~2tRNuZ0Y>m#m`CS;W4N_74R0+{6mjuY?WSR~aD zDT%P^R?3`kS55Ju-LjSB>u5yuToD~9E8=Cct8lP^P{)%a1Lcv{XFrLbXYiogP+TJ> z?%*P2$sdit&#lI3Ir0SLePw45&+)NzJN6r;9B8pzM#UJq_D`oAyo;G~?zds7Tm0G} zyh^L+(I$7j{MGk~Wn|2hYrhD~Wv3ji;OeyE=k2ffsbzg~5h-OOa`Gud2EB(8YT0lqhDNt60{^{E;AFkG9yRut{VyaqNmAMDx)7gkZYWHuZi5kpU?r?|scY;n!FAYY_w=>lO z6hk#4yYsWDVVKaS`XgWEcOCTok$X0>X`4CGL!>ur#T{E|&nSU3+q>=SXSE*g=kqy? z1b_85+WcMTH|9ct%TzB=Y_zWb3%)juu|!-t1hxtNXR};}1mJ)#q!x{oRY5^QV*3qq zJ9A~ucb@6;)-Qm6Ef63H&q#q=%Ta0q?_0sE4Q8ls8lW{2?p)iY=AZM zeW&_ksGi1T8)~$$Z7VF;W65vl@VLTAMkZV2nNW*mkoC3xkVEr=O-9p+HJ=$lVcH`+ zx2YwWANQK|lULvSi_gPOd-((JdjI6EkU-^Vxzm);PMLtfR&s4j+|u8QOuI_uRn~ae z%oNyzOM5SWlp75FlnpesrlExC@w7K--bej4Mu`- zWlkaDb!eWVKCgq{7i8>Av6)0yxS^4G<9$!+dqL$iw9ze$V|hfon0h^HmS&7{gwz% zr4jvl8>Ub+g_U*o+?h9Aj?xRe!7$5g$#9?US**I|;#VVC?AqoK{NZ4O^Sd%(M9xwL zPA~PiH~mDpOmfZ=>MwQECHWI9xYs;+LERE#X(VG|0&*p_f`}f53+IQ!UtmtbrdBi! zA3yO!YQIL^?q%_JBnIbOj|eKZsmdVISsasb&Ap*-flb0oGBwyEvuLn2*LAQphaFy! z!#%K$Ez;CO68!q9{K(_5Ic(wbnz>LyhL(XmwbtGFHtG0+Vf0jMSW6y%kp&m~T01vI zI~9CL`eEJlsmwhLS*B3~Zn;?XZ}^c;4~t>)zH#z;k}NG+kupZ-5aF^>z9QCUKQ@Wa zq4B?8{RE&jgYB2zA7Q-fM!b+h@xf1DUHXxyZ8&2?tEv3{8vxUI(6Q)}7hr#eKdveRL1aJ4hV1CWO+>*C*4S^!kOG zl8%Oy5bG)&Pz-;>V$c%hi`u@W>glUVaxcBJ~e zM&VP=R#)d>9{E_K-oP;`BGQF1ZtV^7Nc>SAW{&xsMP{YZm75^z%rI}+;`Qv$=PbH% z!sk6D@{2mg%#3}-SR;?GIB{w-KDtnvklov|n=Q$LSzA*_a-+T z#ICmbPDTu=RHM@kzm@h{&IC5E}Irg zGZ_V~JJluHeja@yr!B?YDQ0Bp*@F^3+u~I88|^@_0l;chF|uVd&jXMlqLxX z@2Q3PdAb3Pn@8VUn{r*!(%0Qqp%Rz&RQsbA={k!T_LKeD^1wTU(}AjLu>@Ft;YR~v zH{RD>xt`lzOGB$pxj%MBFx>5%zeL*vrCOwSxUEw>6}MfbnI(l5+CNBB@5A0LbaK+W zV=|mySXNX#P*mCJLsR{BtNf$lrRdDQ@cMK1xNfAJCP3Ea%%x1U;E%Fe8I9$^&0k3f z{m!6suH&mi8ECY%%V}FnMr9AZy4CxE2>OF8mlL7ftLJj@HkGI#oScz0)^CRx%hE^S zb=SRzRs*aL-_A(jNS5?l_(W>v-xsy~ZH`%gf#-M!1r{KY_&agReeV^+to;S; z^fcUE4I&Wwfbqia>VuihzN(>GXlaLM^Bn4M-k}f>bB|O z9c;jGznyQ7=&s9x$cwZ$bmOgRJNM3H?#Vo53O4NR`ok$TxnFP9EkUu4&uFO(M-(}M z+uXLN(8d+JmQ<;_a>HsWUu?UlPU2HFi&LPdH!8#Su_RJY$W5v)kHN>~88*^9oU)Wn zvyV>}AD_hWN9i?8k`jYj#2xm{4|_kKXQUH>gESuXlhR}K%KGj(gaBHTA+c)YdkO#;EV#l@+oWCw*@q}^SbTXt zD1@AugM>sL9c}}J^7nf*F`Nl z-de*kfuHsPTt`aArwkc55H~ZrogFo7EGB~fD?CG%P*OMl8Qjkz?mx6aA)I!(l|}<8 ziB)|Tk>w5|?`unnZc@KJ#>)m7Tbn(pDS{6K_UA{NF{VgpZpV7srAl>nW4>wTppG} zm)Ul^rUh!N{0OUdq|q3a#nAXa_?~XnP`SQ>K+4y?)DwLp0?H>xO5$OH&Gu9s35lZ1 z4?>%Y@*aNf#qv6@(;p5O8zq)Dd_vf`BmPmj)AT_%sN<*~~Tk`}UsG?z>TOb!dp8SN_)yG^WwA z5zEmM^~n7{tq;7iHJG^kO;X6XoOk($%b@0|EDkS`30CTZ?aC!5$ zbVB+b_78Lf_I)b)(rNGG)D+6o)tvN>xR<4h>0WzbaIp)M62LkjEyTW~7g zZIe(R8j(K{!OAkBU+{-%qfNPsX*j!>g1iZ`?R{!`*QV&+I*8m=oDD&Lo^gTnNA}ca zsDCm^ND?M!pGOMR6>ruOIVnb#a31xiJo&{oMHB} zz;x1hD86^HJMW00h9zR7pY9Tn(R^rviO4r0BO7D$`B3g&c}xksBNiz_`kpC0@4oT_ z-^9kwb60`_0{^Pw(geG^4M%%;z^T+_MjH7kLQ0G`p@1ENzUHKd0z~J8rrA0hgh?(4 zmy#L0ik?P(wux;R73t8@

*ss?jc@G#IAf)?t{`z)=~1pC;(GL-%6VKPVxJ78xe# zLvA1Avzyq?M=n&+6mr8y4?F_D9%Xi|u@r@^n?>M-*En}p#Z-?X-Rk=PoLu!z~4OnxNCtmy2y!GZ-c>groS<+ zPrC?*OGauwBZRqEs*T8~EF2@9cV!;r@oKUQTZ)$Wh90|&k?PM>Vm1YlI;6(hNmuL6jmQP3bjMX+e66l8aoGrVt6e zw*dY?K_CdBDFT8J1QZ165Gm5RM5SCnKp_;VQj~WF-+k-%&r4>_T3N}OnUg(d&-d+b zpS=+=kl%>_C%#T=Jc@1(Lo-9U*m#g+=zPhp8MopX>Gq{6Mq?N(GwK96ALmELZ-h%L zdQuQgdkg&aed-x+!85ShbUN(dC1??qM0x91W=e7L{QTNW-fOxEO{G-nQbDy`>Ze*0 zAf7vg9R1vt$DG$M_hwXcVedr$@+g0ym8AHqel9!B6}y$9c$l>1CqJ-v+gwUBv80!A}u#$u7im#!g>1d^?Q9gfhB{sc?-z+=j!+Al!WV0^waMa?R-MShzq9Hxj;%Ut zIsYB9!9y&tLG!e94)9qQ?Md3&jT-AMbh9(@!aQkWW?YqE&6X%sxMrrxBA4Y5v=FUb zt`pAJW2X{5RQ2%7@lS;TRiL?kiQ0E+rWXn^p*jRCLj z)bq1LhQi$J8e0zuie6750@MOGp0!*zy?RQOnlolY4*^?a+m97 z_|Jn}SgNcjruZcN#yM(_oW#R0FHcD_>(Vs>`j{?e7-xt-fSKOVdD`CxxuR{ zDr@4U_-Ykl@Ok4NI)GtMQvQUN&k(nX@_pOe0Uvdh3xtk9>Wig?n_T=Qqd`ICd)f%# zjOiKx53^gopW#m+VPVCh)}i|1sv{gEpS!j)Q>?0A_VcxKV~GA1H1iyHwOd}N8<&OE zW}s9~GD=WAJ@`{Zq2N&%5@Aefb=o=H97rn83v`n7D(Q$XK*ZX!B z-%L%43$vUMZ2aJOy8htvwr@3Su*XZf@g^t5ShN~1M41`bh2Ta$v4VspO#ITCamrNI z8jl&7*zk1vBI=rw4k~v^$xdz$9%|xK8ibbo#8GYiS0pTC_;(eY{CboHWxO2+upWD(OU6SCU?`u) zn-p#x`-^jt5*X07Yz-_1G=vc)IXHI`I_(<^vbyzkMOb7Q3|u+!NxU*W^V{v2lwB#& ziHPq<5y@d!jBdl2qj%cnz({QCYq;-+hKABgR*q=@gFP8AJ=WLL|%?XBFjTLLQj>K(_p&aPl$={|l95T<0%WcYeC5uwqe!$Hr+keLdmBg`} z>YFKSs$FytZYlf7^Ejp4WV;m>zUXyqhfmY}o6N_~OoA5E=Dj*mFAtaZVs}nGB%yeD zZu^9%Cd4^j$K~SVl#smeOYGXqL?Y5gfNamGg3sm@HNclz75C_?ktAZ8TUaiL7B9d2 zFweaDwIRi-ye;{z63U8FRPUwZtiym};Spdyg{x4(1>NQK`&in(K3sp~)mMdOdcJQp zqFg+64aan1?Fji!%1_PRL61pIpisuQa7<>>e41n|eYbfHeUv0ZMee~(DK7&q{CVQE zTI6;3=C>S&>e=JiUlpSZ*Mc_Wmi2!sANd@ebdoo`BZ2{uRs+W1Z^$ueScqUgf6Ai)NV2F3tNdnN{(swRjULEOlb))fts(wrY-T3-Y?~I3X5;@fre6%82I-~9 zF$~*L=y5wv>y#|P^*SLnI3Z+#_46F={fFShbx?rhZXE8+lvc04ldl$;O{hTv!z)H` z;>PI=ROiuDYLS{&q8#riFPFmX5R@~Z)NBt$hmfufU>VGk#zql z+VaR1U~B}Hq($I^6&b=)buX(yQr<16x$<}L|d?j`gNaIEE!T;ZL&!x!j8E6X5 zh_A1KO+FGe>==4#=){3@tk(-N@|bdemuMG!f56W)g*f0`7a*ioN?j^bbZ05;c;b3% z%1WcTD;=r96iY>F_YU>>Ea$GWx!GX|5Ui9~Y0<>iMv#dcvsKY04WS3GCkR3F zJ?Xxv*7D(3ZoM!)#hudv@;C97q-q0 z5NhQg>|8vvdHq8x@3@8v?GT)^E9BD)k8mwfYlVlXp_oa*?%Lj3%R6R9A7C6WrRKjfMXyIUaaWyOm(hMfZ71~!>WR)AO(mjriYiH#g8M_HtE6jZ|d zJfv@pI7`CpHH998{5S}Vp2f!n=JQdc2EXNui@Y&{6_&>i57x}hR0qkJ*>w)Sj=~$D- zg30w>vVf_jn|l=@=~jzOIAp(-V1q0L2;0F^wI7q(&06O+K6zAj>zjb`33;V0(G2cw zF--D@!{O{|Du2oFS{oT&{>p+ZX`G}zXHOY3s6q4Zzip)BArkp&jhGrd#w)s|8DxuB z`mz+Vo>>)}cdMY+-|J9x2LB_hb=~Fs7(jfCeM;?3?j$Dc_r|2sj=G^7A$R76i@KN0 zbQrEN=%6r}BRxQ9;KSIl=F|+wLkunH%WsXW2ZFbD{tx;^6{UnVf@&Z<0+MpkPI^Kc z`oHSfc7`^0httah9P9aOCutgS>xpOpn55@t-aPy;-n1EWVKgxAMYJ?UxC!X3ig zYnN8qdI#m}LeO&ei8Z!^UY*CKG5yc;BwF_NeV|-R5ai%nUs#_0rXrhXJJuUnG*RD*vd9Lw0-5u$}>kBMtbE73#$SeWm;XlF&K#a??X0sfVE z3uk74tIvboW2;9mpOK_|zYXD_oACA{0IG%4uOJ6W_>-_RdRfMl44S>{J73;Es+dDC z%EhzK1Rr*Y=f75ezag&roWno!5;`^aZ25b}luIx{_4prbNQHp*jUT&NZxpN-1+ahI z2;H`ke4$F@kpCkX@fIVjwRbLmoETma=-gPnUj?Dqw`l|W!-+Nkj|EX3MS8K2X%J+H z8wzBjMpX5*VFm7$!?l zRk!ZhJ7@TjX}Q?1>KzM%nT&EMF$h{6a)RK|=B+EzJ#;6yPcjb(aH*EL?F?r1`Bd8T zon-kNA>cRi+{`z5253GCsJcrP>;ULfFU&P|sgE99_H>!N8hv(?QS?~(bQL@c9WoU< zqzSIKkqBoZ%;ZV_MLa0Kw?-Jik2!KCC(0^bJQE!l=OFIPJ01@STIoL5U00=Iiz3U_ zGV%lLdwB?KzXwBR zhPKEsLqsq4)u$C>Yya>b#y#y(=v`w;PF*0M)5h?g;$s*8{j>kuM>cYTn2S@wpwPcZ z`1dRP)rhuBVzNT!|CL^Ftj-3C0(bR>t3U%9-G6T!X+SYIby3gxS0MgZvfeQG=jg=c W=?9~_aq|T<;B{5sT(1J@67@d;#ks=( diff --git a/include/ContactsService_PG.h b/include/ContactsService_PG.h deleted file mode 100755 index 49a344f..0000000 --- a/include/ContactsService_PG.h +++ /dev/null @@ -1,333 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/** - * - * @ingroup SLP_PG - * @defgroup CONTACTS_SVC_PG Contacts Service - - -

Introduction

-

Purpose of this document

- -The purpose of this document is to describe how applications can use contacts-service APIs for handling contact's information. This document gives programming guidelines to application engineers and examples of using contact data. - -

Scope

- -The scope of this document is limited to Contacts-service API usage. - - -

Contacts Service Architecture

-

Overview

- -Contacts-service is responsible for inserting, deleting, and updating contact data in order to accommodate the needs for application's contact data. -Users can access contacts data without knowing DB schema, SQLite, relations of data - -@image html SLP_ContactsService_PG_image001.PNG - - -

Sub-Components

- -Contacts-svc-helper is a process for contacts-servcie. The process wait requests of contacts-service library and respond immediately - - - -

Contacts Service Features

- - Similar to Sqlite3 - - Handle information of Contact - - Handle information of Group - - Handle information of Phone log - -

Similar to Sqlite3

-Contacts-service API is similar to Sqlite3. - -

Handle information of Contact

-Contacts-service supports to insert/update/delete/get/search information of contact. -The Information of contact includes name, numbers, emails, addresses, company, messenger, events, group relation information, web sites and favorite information. - -

Handle information of Group

-Contacts-service supports to insert/update/delete/get information of contact. - -

Handle information of Group

-Contacts-service supports to insert/update/delete/get information of Phone log. - -

Contacts Service API Description

- -you can refer @ref CONTACTS_SVC - - - -

Sample Code

- -

Connect to Contact Database

- -Before using contact information from contacts service API, caller module should connect to the contact database, and after finishing with the contact information, should disconnect from the contact database - -@code -int contacts_svc_connect(void); - -int contacts_svc_disconnect(void); -@endcode - - -

Insert information of contact

- -@code - -void insert_test(void) -{ - CTSstruct *contact; - CTSvalue *name, *number1, *number2; - GSList *numbers=NULL; - contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT); - - name = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO); - if(name) { - contacts_svc_value_set_str(name, CTS_BASE_VAL_IMG_PATH_STR, "test.vcf"); - } - contacts_svc_struct_store_value(contact, CTS_CF_BASE_INFO_VALUE, name); - contacts_svc_value_free(name); - - - name = contacts_svc_value_new(CTS_VALUE_NAME); - if(name) { - contacts_svc_value_set_str(name, CTS_NAME_VAL_FIRST_STR, "Gil-Dong"); - contacts_svc_value_set_str(name, CTS_NAME_VAL_LAST_STR, "Hong"); - contacts_svc_value_set_str(name, CTS_NAME_VAL_SUFFIX_STR, "engineer"); - } - contacts_svc_struct_store_value(contact, CTS_CF_NAME_VALUE, name); - contacts_svc_value_free(name); - - number1 = contacts_svc_value_new(CTS_VALUE_NUMBER); - if(number1) { - contacts_svc_value_set_str(number1, CTS_NUM_VAL_NUMBER_STR, "0987654321"); - contacts_svc_value_set_int(number1, CTS_NUM_VAL_TYPE_INT, CTS_NUM_TYPE_CELL); - contacts_svc_value_set_bool(number1, CTS_NUM_VAL_DEFAULT_BOOL, true); - } - numbers = g_slist_append(numbers, number1); - - number2 = contacts_svc_value_new(CTS_VALUE_NUMBER); - if(number2) { - contacts_svc_value_set_str(number2, CTS_NUM_VAL_NUMBER_STR, "0123456789"); - contacts_svc_value_set_int(number2, CTS_NUM_VAL_TYPE_INT, - CTS_NUM_TYPE_WORK); - } - numbers = g_slist_append(numbers, number2); - - contacts_svc_struct_store_list(contact, CTS_CF_NUMBER_LIST, numbers); - contacts_svc_value_free(number1); - contacts_svc_value_free(number2); - g_slist_free(numbers); - - contacts_svc_insert_contact(0, contact); - contacts_svc_struct_free(contact); -} -@endcode - - -

Get contact

- -@code -void get_contact(CTSstruct *contact) -{ - int index=0, ret=-1; - CTSvalue *value=NULL; - GSList *get_list, *cursor; - - if(!contact) { - index = contacts_svc_find_contact_by(CTS_FIND_BY_NUMBER, "0123456789"); - if(index > CTS_SUCCESS) - ret = contacts_svc_get_contact(index, &contact); - if(ret < 0) - { - printf("No found record\n"); - return; - } - } - contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &value); - printf("First Name : %s\n", contacts_svc_value_get_str(value, CTS_NAME_VAL_FIRST_STR)); - printf("Last Name : %s\n", contacts_svc_value_get_str(value, CTS_NAME_VAL_LAST_STR)); - printf("Additional Name : %s\n", contacts_svc_value_get_str(value, CTS_NAME_VAL_ADDITION_STR)); - printf("Display Name : %s\n", contacts_svc_value_get_str(value, CTS_NAME_VAL_DISPLAY_STR)); - printf("Prefix Name : %s\n", contacts_svc_value_get_str(value, CTS_NAME_VAL_PREFIX_STR)); - printf("Suffix Name : %s\n", contacts_svc_value_get_str(value, CTS_NAME_VAL_SUFFIX_STR)); - - value = NULL; - contacts_svc_struct_get_value(contact, CTS_CF_COMPANY_VALUE, &value); - printf("Company Name : %s\n", contacts_svc_value_get_str(value, CTS_COMPANY_VAL_NAME_STR)); - printf("Company Department : %s\n", contacts_svc_value_get_str(value, CTS_COMPANY_VAL_DEPARTMENT_STR)); - - get_list = NULL; - contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &get_list); - - cursor = get_list; - for(;cursor;cursor=g_slist_next(cursor)) - { - printf("number Type = %d", - contacts_svc_value_get_int(cursor->data, CTS_NUM_VAL_TYPE_INT)); - if(contacts_svc_value_get_bool(cursor->data, CTS_NUM_VAL_FAVORITE_BOOL)) - printf("(favorite)"); - printf("Number = %s\n", - contacts_svc_value_get_str(cursor->data, CTS_NUM_VAL_NUMBER_STR)); - if(index) - contacts_svc_insert_favorite(contacts_svc_value_get_int(cursor->data, CTS_NUM_VAL_ID_INT)); - } - - get_list = NULL; - contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &get_list); - - cursor = get_list; - for(;cursor;cursor=g_slist_next(cursor)) - { - printf("email Type = %d", - contacts_svc_value_get_int(cursor->data, CTS_EMAIL_VAL_TYPE_INT)); - - printf("email = %s\n", - contacts_svc_value_get_str(cursor->data, CTS_EMAIL_VAL_ADDR_STR)); - } - - get_list = NULL; - contacts_svc_struct_get_list(contact, CTS_CF_GROUPREL_LIST, &get_list); - cursor = get_list; - for(;cursor;cursor=g_slist_next(cursor)) - { - printf("group = %s:", - contacts_svc_value_get_str(cursor->data, CTS_GROUPREL_VAL_NAME_STR)); - - printf("%d\n", - contacts_svc_value_get_int(cursor->data, CTS_GROUPREL_VAL_ID_INT)); - } - - - if(index) - contacts_svc_struct_free(contact); - -} -@endcode - - -

Get contact list

- -@code -void get_contact_list(void) -{ - CTSiter *iter = NULL; - contacts_svc_get_list(CTS_LIST_ALL_CONTACT, &iter); - - while(CTS_SUCCESS == contacts_svc_iter_next(iter)) - { - CTSvalue *contact = NULL; - const char *first, *last, *display; - contact = contacts_svc_iter_get_info(iter); - - printf("(%8d)", contacts_svc_value_get_int(contact, CTS_LIST_CONTACT_ID_INT)); - display = contacts_svc_value_get_str(contact, CTS_LIST_CONTACT_DISPLAY_STR); - if(display) - printf("%s :", display); - else - { - first = contacts_svc_value_get_str(contact, CTS_LIST_CONTACT_FIRST_STR); - last = contacts_svc_value_get_str(contact, CTS_LIST_CONTACT_LAST_STR); - if(CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - printf("%s %s :", first, last); - else - printf("%s %s :", last, first); - } - printf("%s", contacts_svc_value_get_str(contact, CTS_LIST_CONTACT_IMG_PATH_STR)); - printf("\n"); - contacts_svc_value_free(contact); - } - contacts_svc_iter_remove(iter); -} -@endcode - - -

Delete contact

- -@code - -void delete_test(void) -{ - //get contact - int index=0, ret=-1; - CTSstruct *contact; - - if(!contact) { - index = contacts_svc_find_contact_by(CTS_FIND_BY_NUMBER, "0123456789"); - if(index > CTS_SUCCESS) - ret = contacts_svc_get_contact(index, &contact); - if(ret < 0) - { - printf("No found record\n"); - return; - } - } - - contacts_svc_delete_contact(index); - - contacts_svc_struct_free(contact); - -} - -@endcode - -

Search contacts by name

- -@code -void search_contacts_by_name(void) -{ - int ret; - CTSiter *iter = NULL; - ret = contacts_svc_get_list_with_str(CTS_LIST_CONTACTS_WITH_NAME, - "Hong", &iter); - if(CTS_SUCCESS != ret) return; - - while(CTS_SUCCESS == contacts_svc_iter_next(iter)) - { - CTSvalue *row_info = NULL; - const char *first, *last, *display; - row_info = contacts_svc_iter_get_info(iter); - - printf("(%8d)", contacts_svc_value_get_int(row_info, CTS_LIST_CONTACT_ID_INT)); - - display = contacts_svc_value_get_str(row_info, CTS_LIST_CONTACT_DISPLAY_STR); - if(display) - printf("%s :", display); - else - { - first = contacts_svc_value_get_str(row_info, CTS_LIST_CONTACT_FIRST_STR); - last = contacts_svc_value_get_str(row_info, CTS_LIST_CONTACT_LAST_STR); - if(CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - printf("%s %s :", first, last); - else - printf("%s %s :", last, first); - } - printf("%s", contacts_svc_value_get_str(row_info, CTS_LIST_CONTACT_IMG_PATH_STR)); - printf("\n"); - contacts_svc_value_free(row_info); - } - contacts_svc_iter_remove(iter); -} -@endcode - - * @} - */ - diff --git a/include/contacts-svc-struct.head b/include/contacts-svc-struct.head deleted file mode 100755 index a0242be..0000000 --- a/include/contacts-svc-struct.head +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CONTACTS_SVC_STRUCT_H__ -#define __CONTACTS_SVC_STRUCT_H__ - -#include -#include - -/** - * @defgroup CONTACTS_SVC_STRUCT Structs & values - * @ingroup CONTACTS_SVC - * @addtogroup CONTACTS_SVC_STRUCT - * @{ - * - * This interface provides methods to handle Structs (= collection of values) - * and values of contacts service (individual properties of a contact). - * - * @section sec1 Properties and Policies - * - Memory always has to be freed by its creator, unless stated otherwise. - * \n contacts_svc_struct_store_XXX means "copy". - * But If list has a same start with contacts struct(#CTSstruct), it is not "copy"(just appendix) - * - Contacts structs(#CTSstruct) own data stored in them.(User cannot free each value in struct) - * - Contacts_svc_value_XXXX is called by reference. - * \n But Contacts_svc_value_set_str() is called by value for the data in contacts struct(#CTSstruct). - * - All "char *" strings use UTF-8 encoding. - * - */ - diff --git a/include/contacts-svc-struct.tail b/include/contacts-svc-struct.tail deleted file mode 100755 index 6ea9abc..0000000 --- a/include/contacts-svc-struct.tail +++ /dev/null @@ -1,6 +0,0 @@ - -/** - * @} - */ - -#endif //__CONTACTS_SVC_STRUCT_H__ diff --git a/include/contacts-svc-sub.tail b/include/contacts-svc-sub.tail deleted file mode 100755 index d2263ff..0000000 --- a/include/contacts-svc-sub.tail +++ /dev/null @@ -1,2 +0,0 @@ - -#endif //__CONTACTS_SVC_SUB_H__ diff --git a/include/contacts-svc.tail b/include/contacts-svc.tail deleted file mode 100644 index cddb7e1..0000000 --- a/include/contacts-svc.tail +++ /dev/null @@ -1,9 +0,0 @@ - -/** - * @} - */ -#ifdef __cplusplus - } -#endif - -#endif //__CONTACTS_SVC_H__ diff --git a/include/contacts.h b/include/contacts.h new file mode 100644 index 0000000..89e4c03 --- /dev/null +++ b/include/contacts.h @@ -0,0 +1,1316 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __TIZEN_SOCIAL_CONTACTS_H__ +#define __TIZEN_SOCIAL_CONTACTS_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif //__TIZEN_SOCIAL_CONTACTS_H__ + +/** + * @ingroup CAPI_SOCIAL_FRAMEWORK + * @defgroup CAPI_SOCIAL_CONTACTS_SVC_MODULE Contacts(New) + * + * @brief The Contacts Service API provides functions for managing phone contacts (a.k.a. phonebook). + * This API allows you not only to store information about contacts but also to query contact information. + * + * @section CAPI_SOCIAL_CONTACTS_SVC_MODULE_HEADER Required Header + * \#include + * + * @section CAPI_SOCIAL_CONTACTS_SVC_MODULE_OVERVIEW Overview + * + * The basic concept in Contacts APi is a record. It may be helpful to know that a record represents + * an actual record in the internal database, but in general, you can think of a record as a piece + * of information, like an address, phone number or group of contacts. A record can be a complex + * set of data, containing other data, e.g. an address record contains country, region, and street, + * among others. Also, the contained data can be a reference to another record. For example, + * a contact record contains the 'address' property, which is a reference to an address record. An address + * record belongs to a contact record - its 'contact_id' property is set to identifier of the corresponding contact + * (more on ids later). In this case, the address is the contact's child record and the contact is the parent record. + * + * Effectively, a record can be a node in a tree or graph of relations between records. + * + * Each record type has a special structure defined for it, called 'view', which contains identifiers of its properties. + * For example, the _contacts_contact view describes the properties of the contact record. + * Its properties include name, company, nickname of the contact and many more. The address record is described by + * the _contacts_address view. A special property in such structures is the URI, which is used to identify + * the record's type. Every view describing a record has this property. You can think of views + * as of classes in an object oriented language. Whenever you use a record, you refer to its view to know + * the record's properties. + * + * To operate on a record, you must obtain its handle. The handle is provided during creation of the record. + * It can also be obtained when referring to a child record of a record the handle of which you already have. + * + * When creating a record, you need to specify what type of record you want to create. This is where you should + * use the URI property. The code below creates a contact record and obtains its handle. + * + * @code + * contacts_record_h hcontact = NULL; + * contacts_record_create( _contacts_contact._uri, &hcontact ); + * @endcode + * + * A record can have basic properties of four types: integer, string, boolean, long integer, double. Each property + * of basic type has functions to operate on it: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Property typeSetterGetter
string contacts_record_set_str contacts_record_get_str
integer contacts_record_set_int contacts_record_get_int
boolean contacts_record_set_bool contacts_record_get_bool
long integer contacts_record_set_lli contacts_record_get_lli
long integer contacts_record_set_double contacts_record_get_double
+ * + * For long integer functions, "lli" stands for long long int, ususally used to hold UTC time. + * + * These functions also require specifying which property you wish to get/set. The code below sets the "ringtone_path" + * property of a contact record. + * + * @code + * contacts_record_set_str( hcontact, _contacts_contact.ringtone_path , "My Documents/1.mp3" ); + * @endcode + * + * Note on returned values ownership: some functions have the "_p" postfix. It means that the returned + * value should not be freed by the application, as it is a pointer to data in an existing record. For example: + * + * @code + * API int contacts_record_get_str( contacts_record_h record, unsigned int property_id, char** out_str ); + * API int contacts_record_get_str_p( contacts_record_h record, unsigned int property_id, char** out_str ); + * @endcode + * + * In the first case, the returned string should be freed by the application, in the second one it should not. + * + * + * A record can also have properties of type 'record' - other records, called child records. + * A record can contain many child records of a given type. For example, a contact record + * can contain many address records, and is called the parent record of the address records. + * The code below inserts an address record into a contact record. + * Note that it is not necessary to insert all records - just the contact record needs to be + * inserted into the database, it is enough for all information to be stored. + * Both records are then destroyed. + * + * @code + * contacts_record_h haddress = NULL; + * contacts_record_h himage = NULL; + * contacts_record_create( _contacts_contact._uri, &hcontact ); + * contacts_record_create( _contacts_image._uri, &himage ); + * contacts_record_create( _contacts_address._uri, &haddress ); + * contacts_record_set_str( himage, _contacts_image.path, "My Documents/1.jpg" ); + * contacts_record_set_str( hcontact, _contacts_address.country, "Korea" ); + * contacts_record_add_child_record( hcontact, _contacts_contact.image, himage ); + * contacts_record_add_child_record( hcontact, _contacts_contact.address, haddress ); + * + * contacts_db_insert_record( hcontact ); + * contacts_record_destroy( hcontact, true ); + * @endcode + * + * Establishing parent/child relation between records is also possible + * through the use of identifiers, described in following paragraphs. + * + * One of record's properties is the identifier (id). If you know the id of a record existing in the database, + * you can directly access it. The id is available after the record has been inserted into the database + * and is a read-only property. + * + * @code + * contacts_record_h haddress = NULL; + * contacts_record_create( _contacts_contact._uri, &hcontact ); + * contacts_db_insert_record( hcontact ); + * int id = contacts_record_get_int( hcontact, _contacts_contact.id ); + * // use hcontact ... + * // ... + * contacts_record_destroy( hcontact, true); // hcontact is no longer usable + * + * contacts_db_get_record( _contacts_contact._uri, id, &hcontact ); + * // hcontact is now a handle to the same record as before + * @endcode + * + * Identifiers can also be used to establish a relation between two records. + * The following code sets an address record's 'contact_id' property to the id of the contact. + * contact_id acts as a foreign key here. After that is done, the address becomes one of the addresses + * connected to the contact. The address is now the contact's child record, the contact is the + * the parent record. + * + * @code + * contacts_record_create( _contacts_contact._uri, &hcontact ); + * int id = ... // acquire id of created contact + * + * contacts_record_create( _contacts_address._uri, &haddress ); + * contacts_record_set_int( haddress, _contacts_address.contact_id, id ); + * // set other address properties + * contacts_db_insert_record( haddress ); + * @endcode + * + * As mentioned above, a record can have many child records, just as more than one record in a database can have + * its foreign keys set to the id of another record. + * Having a record handle, you can access all records of a specific type related to the given record: + * + * @code + * contacts_db_get_record( _contacts_contact._uri, id, &hcontact ); + * int address_num = contacts_record_get_child_record_count( hcontact, _contacts_contact.address ); + * for( int i=0; i < address_num; i++ ) + * { + * haddress = contacts_record_get_child_record_at( hcontact, _contacts_contact.address, i ); + * contacts_record_set_str( haddress, _contacts_address.country, "Korea" ); + * } + * contacts_db_update_record( hcontact ); + * + * contacts_record_destroy( hcontact, true ); + * @endcode + * + * This code acquires the number of child records of type 'address' and iterates over them. Each address + * has its 'country' property set to 'Korea'. Only the parent record is saved to the database - all changes + * made to the child records are saved automatically. + * + * + * Another two important concepts in Contacts API are filters and queries, related to searching. + * Filters allow returning results that satisfy a given condition, e.g. an integer property + * value must be greater than a given value, or a string must contain a given substring. Many + * conditions can be added to a filter, creating a composite filter with the use of AND and OR logical operators. + * + * A query acts as a container for filters and as an interface to the stored data. It allows configuring + * sorting and grouping methods of returned results. + * + * Sample code: Create a filter which will accept addresses with their contact's id equal to a given id + * (integer filter), or their country property equal to "Korea" (string filter). Create a query and + * add the filter to it. Results are received in a list. + * + * @code + * contacts_filter_h filter = NULL; + * contacts_list_h list = NULL; + * contacts_query_h query = NULL; + * + * contacts_filter_create( _contacts_address._uri, &filter ); + * contacts_filter_add_int( filter, _contacts_address.contact_id, CONTACTS_MATCH_EQUAL, id ); + * contacts_filter_add_operator( filter, CONTACTS_FILTER_OPERATOR_OR); + * contacts_filter_add_str( filter, _contacts_address.country, CONTACTS_MATCH_EXACTLY, "Korea" ); + * contacts_query_create( _contacts_address._uri, &query ); + * contacts_query_set_filter(query, filter); + * + * contacts_db_get_records_with_query( query, 0, 0, &list ); + * + * contacts_filter_destroy( filter ); + * contacts_query_destroy( query); + * // use the list + * // ... + * contacts_list_destroy( list, true ); + * @endcode + * + * A query can contain more than one fiter. You can add logical operators between filters. Whole filters + * are operators' arguments, not just the conditions. Extending the example above, the following code creates two filters + * and connects them with the OR operator: + * + * @code + * contacts_filter_h filter1 = NULL; + * contacts_filter_h filter2 = NULL; + * contacts_query_h query = NULL; + * + * contacts_filter_create( _contacts_address._uri, &filter1 ); + * contacts_filter_add_int( filter1, _contacts_address.contact_id, CONTACTS_MATCH_EQUAL, id ); + * contacts_filter_add_operator( filter1, CONTACTS_FILTER_OPERATOR_OR); + * contacts_filter_add_str( filter1, _contacts_address.country, CONTACTS_MATCH_EXACTLY, "Korea" ); + * + * contacts_filter_create( _contacts_address._uri, &filter2 ); + * contacts_filter_add_str( filter2, _contacts_address.country, CONTACTS_MATCH_EXACTLY, "USA" ); + * contacts_filter_add_operator( filter2, CONTACTS_FILTER_OPERATOR_AND); + * contacts_filter_add_str( filter2, _contacts_address.region, CONTACTS_MATCH_CONTAINS, "California" ); + * + * contacts_filter_add_operator(filter1, CONTACTS_FILTER_OPERATOR_OR); + * contacts_filter_add_filter(filter1, filter2); + * + * contacts_query_create( _contacts_address._uri, &query ); + * contacts_query_set_filter(query, filter1); + * + * contacts_db_get_records_with_query( query, 0, 0, &list ); + * + * contacts_filter_destroy( filter1 ); + * contacts_filter_destroy( filter2 ); + * contacts_query_destroy( query ); + * // ... + * @endcode + * + * The first filter accepts addresses with country equal to "Korea" or contact id equal to 'id' variable. + * The second filter accepts addresses with "USA" as country and region containing the string "California". + * The query in the code above will return addresses accepted by either of the filters. + * + * Furthermore, the order in which filters and operators are added determines the placement of parentheses. + * For example, If the following are added, in given order: + * + * @code + * Filter F1 + * OR + * Filter F2 + * AND + * Filter F3 + * @endcode + * + * the result is: + * + * @code + * (F1 OR F2) AND F3 + * @endcode + * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_View_properties View properties + * In \ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE category, you can find tables with view properties. Record types which have *_id + * as their properties, hold identifiers of other records - e.g. name, number and email + * views hold id of their corresponding contacts in contact_id property + * (as children of the corresponding contacts record). + * + * Properties of type 'record' are other records. For example, a contact record has 'name', + * 'number' and 'email' properties, which means that records of those types can be children + * of contact type records. + * + */ + +/** + * @ingroup CAPI_SOCIAL_CONTACTS_SVC_MODULE + * @defgroup CAPI_SOCIAL_CONTACTS_SVC_DATABASE_MODULE Database + * + * @brief The contacts database API provides the set of the definitions and interfaces that enable you to handle contacts database. + * + * @section CAPI_SOCIAL_CONTACTS_SVC_DATABASE_MODULE_HEADER Required Header + * \#include + * + *
+ */ + +/** + * @ingroup CAPI_SOCIAL_CONTACTS_SVC_MODULE + * @defgroup CAPI_SOCIAL_CONTACTS_SVC_RECORD_MODULE Record + * + * @brief The contacts record API provides the set of the definitions and interfaces that enable you to get/set data from/to contacts record handle. + * + * @section CAPI_SOCIAL_CONTACTS_SVC_RECORD_MODULE_HEADER Required Header + * \#include + * + *
+ */ + +/** + * @ingroup CAPI_SOCIAL_CONTACTS_SVC_MODULE + * @defgroup CAPI_SOCIAL_CONTACTS_SVC_LIST_MODULE List + * + * @brief The contacts record API provides the set of the definitions and interfaces that enable you to get/set records list data. + * + * @section CAPI_SOCIAL_CONTACTS_SVC_LIST_MODULE_HEADER Required Header + * \#include + * + *
+ */ + +/** + * @ingroup CAPI_SOCIAL_CONTACTS_SVC_MODULE + * @defgroup CAPI_SOCIAL_CONTACTS_SVC_PERSON_MODULE Person + * + * @brief The contacts person API provides the set of the definitions and interfaces that enable you to link/unlink person and contact. + * + * @section CAPI_SOCIAL_CONTACTS_SVC_PERSON_MODULE_HEADER Required Header + * \#include + * + *
+ */ + +/** + * @ingroup CAPI_SOCIAL_CONTACTS_SVC_MODULE + * @defgroup CAPI_SOCIAL_CONTACTS_SVC_GROUP_MODULE Group + * + * @brief The contacts group API provides the set of the definitions and interfaces that enable you to add/remove contact as group member. + * + * @section CAPI_SOCIAL_CONTACTS_SVC_GROUP_MODULE_HEADER Required Header + * \#include + * + *
+ */ + + +/** + * @ingroup CAPI_SOCIAL_CONTACTS_SVC_MODULE + * @defgroup CAPI_SOCIAL_CONTACTS_SVC_FILTER_MODULE Filter + * + * @brief The contacts Filter API provides the set of the definitions and interfaces that enable you to make filters to set query. + * + * @section CAPI_SOCIAL_CONTACTS_SVC_CONTACTS_FILTER_HEADER Required Header + * \#include + * + *
+ */ + +/** + * @ingroup CAPI_SOCIAL_CONTACTS_SVC_MODULE + * @defgroup CAPI_SOCIAL_CONTACTS_SVC_QUERY_MODULE Query + * + * @brief The contacts Query API provides the set of the definitions and interfaces that enable you to make query to get list. + * + * @section CAPI_SOCIAL_CONTACTS_SVC_CONTACTS_QUERY_HEADER Required Header + * \#include + * + *
+ */ + +/** + * @ingroup CAPI_SOCIAL_CONTACTS_SVC_MODULE + * @defgroup CAPI_SOCIAL_CONTACTS_SVC_VCARD_MODULE vCard + * + * @brief The contacts record API provides the set of the definitions and interfaces that enable you to get/set data from/to vCard. + * + * @section CAPI_SOCIAL_CONTACTS_SVC_VCARD_MODULE_HEADER Required Header + * \#include + * + *
+ */ + +/** + * @ingroup CAPI_SOCIAL_CONTACTS_SVC_MODULE + * @defgroup CAPI_SOCIAL_CONTACTS_SVC_ACTIVITY_MODULE Activity + * + * @brief The contacts activity API provides the set of the definitions and interfaces that enable you to delete activities by contact_id and account_id. \n + * Please refer to \ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_activity for more details. + * + * @section CAPI_SOCIAL_CONTACTS_SVC_ACTIVITY_MODULE_HEADER Required Header + * \#include + * + *
+ */ + +/** + * @ingroup CAPI_SOCIAL_CONTACTS_SVC_MODULE + * @defgroup CAPI_SOCIAL_CONTACTS_SVC_PHONELOG_MODULE Phone log + * + * @brief The contacts phone log API provides the set of the definitions and interfaces that enable you to reset phone log count. + * + * @section CAPI_SOCIAL_CONTACTS_SVC_PHONELOG_MODULE_HEADER Required Header + * \#include + * + *
+ */ + +/** + * @ingroup CAPI_SOCIAL_CONTACTS_SVC_MODULE + * @defgroup CAPI_SOCIAL_CONTACTS_SVC_SETTING_MODULE Setting + * + * @brief The contacts setting API provides the set of the definitions and interfaces that enable you to set up contacts features. + * + * @section CAPI_SOCIAL_CONTACTS_SVC_SETTING_MODULE_HEADER Required Header + * \#include + * + *
+ */ + +/** + * @ingroup CAPI_SOCIAL_CONTACTS_SVC_MODULE + * @defgroup CAPI_SOCIAL_CONTACTS_SVC_SIM_MODULE SIM + * + * @brief The contacts SIM API provides the set of the definitions and interfaces that enable you to get/set data from/to SIM card. + * + * @section CAPI_SOCIAL_CONTACTS_SVC_CONTACTS_SIM_HEADER Required Header + * \#include + * + *
+ */ + +/** + * @ingroup CAPI_SOCIAL_CONTACTS_SVC_MODULE + * @defgroup CAPI_SOCIAL_CONTACTS_SVC_UTILS_MODULE Utils + * + * @brief The contacts Utils API provides the set of the definitions and interfaces that enable you to get index characters of language according to phone setting + * + * @section CAPI_SOCIAL_CONTACTS_SVC_CONTACTS_UTILS_HEADER Required Header + * \#include + * + *
+ */ + +/** + * @ingroup CAPI_SOCIAL_CONTACTS_SVC_MODULE + * @defgroup CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE View/Property + * + * @brief This page provides information about views with properties. + * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_OVERVIEW Overview + * A view is a structure which describes properties of a record. + * A record can have basic properties of four types: integer, string, boolean, long integer, double. Each property + * of basic type has functions to operate on it: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Property typeSetterGetter
string contacts_record_set_str contacts_record_get_str
integer contacts_record_set_int contacts_record_get_int
boolean contacts_record_set_bool contacts_record_get_bool
long integer contacts_record_set_lli contacts_record_get_lli
long integer contacts_record_set_double contacts_record_get_double
+ * + * For long integer functions, "lli" stands for long long int, ususally used to hold UTC time. + * + * Below you can find tables with view properties. + * + * Properties of type 'record' are other records. For example, the _contacts_contact view + * has a 'name' property of type 'record'. This means that records of type name (_contacts_name view) + * can be children of the contact record. If a name record holds the identifier + * of a contact record in its 'contact_id' property, it is the child record of the corresponding + * contact record. + * + * Records can have many children of a given type. + * + * Please refer to the main section of Contacts API for a more detailed explanation and examples. + * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_HEADER Required Header + * \#include + * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_contact _contacts_contact view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only View uri for contact
integeridread only
stringdisplay_nameread only
integerdisplay_source_idread onlyThe source type of display name contacts_display_name_source_type_e
integeraddress_book_idread, write once
stringringtone_pathread, write
stringimage_thumbnail_pathread only
booleanis_favoriteread, write
booleanhas_phonenumberread only
booleanhas_emailread only
integerperson_idread only
stringuidread, write
stringvibrationread, write
integerchanged_timeread only
recordnameread, write
recordcompanyread, write
recordnoteread, write
recordnumberread, write
recordemailread, write
recordeventread, write
recordmessengerread, write
recordaddressread, write
recordurlread, write
recordnicknameread, write
recordprofileread, write
recordrelationshipread, write
recordimageread, write
recordgroup_relationread, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_my_profile _contacts_my_profile view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only View uri for my profile
integeridread only
stringdisplay_nameread only
integeraddress_book_idread, write once
stringimage_thumbnail_pathread only
stringuidread, write
integerchanged_timeread only
recordnameread, write
recordcompanyread, write
recordnoteread, write
recordnumberread, write
recordemailread, write
recordeventread, write
recordmessengerread, write
recordaddressread, write
recordurlread, write
recordnicknameread, write
recordprofileread, write
recordrelationshipread, write
recordimageread, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_simple_contact _contacts_simple_contact view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integeridread only
stringdisplay_nameread only
integerdisplay_source_idread only
integeraddress_book_idread, write once
stringringtone_pathread, write
stringimage_thumbnail_pathread only
booleanis_favoriteread, write
booleanhas_phonenumberread only
booleanhas_emailread only
integerperson_idread only
stringuidread, write
stringvibrationread, write
integerchanged_timeread only
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person _contacts_person view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
string display_name read only
string display_name_index read only The first character of first string for grouping. This is normalized using icu.
integer display_contact_id read only
string ringtone_path read, write
string image_thumbnail_path read, write
string vibration read, write
string status read only
boolean is_favorite read, write
double favorite_priority filter only The priority of favorite contacts. You can not set the value but you can use it as sorting key.
integer link_count read, write
integer account_id1 read, write
integer account_id2 read, write
integer account_id3 read, write
integer addressbook_ids read, write
boolean has_phonenumber read only
boolean has_email read only
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_address_book _contacts_address_book view + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer account_id read, write once
string name read, write It can not be NULL. Duplicate names are not allowed.
integer mode read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_group _contacts_group view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer address_book_id read, write once
string name read, write
string ringtone_path read, write
string image_path read, write
string vibration read, write
string system_id read, write
boolean is_read_only read only
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_name _contacts_name view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer contact_id read, write once
string first read, write
string last read, write
string addition read, write
string suffix read, write
string prefix read, write
string phonetic_first read, write
string phonetic_middle read, write
string phonetic_last read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_number _contacts_number view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer contact_id read, write once
integer type read, write
string label read, write
boolean is_default read, write
string number read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_email _contacts_email view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer contact_id read, write once
integer type read, write
string label read, write
boolean is_default read, write
string email read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_address _contacts_address view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer contact_id read, write once
integer type read, write
string label read, write
string postbox read, write
string postal_code read, write
string region read, write
string locality read, write
string street read, write
string country read, write
string extend read, write
boolean is_default read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_note _contacts_note view + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer contact_id read, write once
string note read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_url _contacts_url view + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer contact_id read, write once
integer type read, write
string label read, write
string url read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_event _contacts_event view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer contact_id read, write once
integer type read, write
string label read, write
integer date read, write
integer is_lunar read, write
integer lunar_date read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_relationship _contacts_relationship view + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer contact_id read, write once
integer type read, write
string label read, write
string name read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_image _contacts_image view + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer contact_id read, write once
integer type read, write
string label read, write
string path read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_company _contacts_company view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer contact_id read, write once
integer type read, write
string label read, write
string name read, write
string department read, write
string job_title read, write
string assistant_name read, write
string role read, write
string logo read, write
string location read, write
string description read, write
string phonetic_name read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_nickname _contacts_nickname view + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer contact_id read, write once
string nickname read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_messenger _contacts_messenger view + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer contact_id read, write once
integer type read, write
string label read, write
string im_id read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_extension _contacts_extension view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer contact_id read, write once
integer data1 read, write
string data2 read, write
string data3 read, write
string data4 read, write
string data5 read, write
string data6 read, write
string data7 read, write
string data8 read, write
string data9 read, write
string data10 read, write
string data11 read, write
string data12 read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_sdn _contacts_sdn view + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
string name read, write once
string number read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_profile _contacts_profile view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer contact_id read, write once
integer type read, write
string label read, write
string uid read, write
string text read, write
integer order read, write
string appsvc_operation read, write
string data1 read, write
string data2 read, write
string data3 read, write
string data4 read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_activity _contacts_activity view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer contact_id read, write once
string source_name read, write
int timestamp read, write
string status read, write
string sync_data1 read, write
string sync_data2 read, write
string sync_data3 read, write
string sync_data4 read, write
string photo read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_activity_photo _contacts_activity_photo view + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer activity_id read, write once
string photo_url read, write
integer sort_index read, write
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_speeddial _contacts_speeddial view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer speeddial_number read, write
integer number_id read, write
string number read only
string number_label read only
integer number_type read only
integer person_id read only
string display_name read only
string image_thumbnail_path read only
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_phone_log _contacts_phone_log view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDRead, WriteDescription
string_uriread only
integer id read only
integer person_id read, write once
string address read, write once
integer log_time read, write once
integer log_type read, write
integer extra_data1 read, write once You can set the related integer data(e.g. message_id, email_id) or duration of call.
string extra_data2 read, write once You can set the related string data. e.g.) short message, subject
+ * +*

+* Read-only View URIs +*
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_contact_updated_info _contacts_contact_updated_info view + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDPrimay KeyDescription
string_uri
integer contact_id *
integer address_book_id
integer type
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_group_updated_info _contacts_group_updated_info view + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDPrimary KeyDescription
string_uri
integer group_id *
integer address_book_id
integer type
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_number _contacts_person_number view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDPrimary KeyDescription
string_uri
integer person_id
string display_name
string display_name_index
integer display_contact_id
string ringtone_path
string image_thumbnail_path
string vibration
boolean is_favorite
boolean has_phonenumber
boolean has_email
integer number_id *
integer type
string label
boolean is_primary_default
string number
string number_filter If you add filter with this property, the string will be normalized internally and the match rule will be applied CONTACTS_MATCH_EXACTLY
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_email _contacts_person_email view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDPrimary KeyDescription
string_uri
integer person_id
string display_name
string display_name_index
integer display_contact_id
string ringtone_path
string image_thumbnail_path
string vibration
boolean is_favorite
boolean has_phonenumber
boolean has_email
integer email_id *
integer type
string label
boolean is_primary_default
string email
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_grouprel _contacts_person_grouprel view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDPrimary KeyDescription
string_uri
integer person_id *
string display_name
string display_name_index
integer display_contact_id
string ringtone_path
string image_thumbnail_path
string vibration
string status
boolean is_favorite
integer link_count
integer account_id1
integer account_id2
integer account_id3
integer addressbook_ids
boolean has_phonenumber
boolean has_email
integer address_book_id
integer group_id *
string group_name
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_phone_log _contacts_person_phone_log view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDPrimary KeyDescription
string_uri
integer person_id *
string display_name
string image_thumbnail_path
integer log_id *
string address
integer log_time
integer log_type
integer extra_data1
string extra_data2
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_usage _contacts_person_usage view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * > + * + * * + * + *
TypeProperty IDPrimary KeyDescription
string_uri
integer person_id *
string display_name
string display_name_index
integer display_contact_id
string ringtone_path
string image_thumbnail_path
string vibration
boolean is_favorite
boolean has_phonenumber
boolean has_email
integer usage_type
integer times_used
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_contact_number _contacts_contact_number view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDPrimary KeyDescription
string_uri
integercontact_id
stringdisplay_name
integerdisplay_source_type
integeraddress_book_id
integerperson_id
stringringtone_path
stringimage_thumbnail_path
integer number_id *
integer type
string label
boolean is_ default
string number
string number_filter If you add filter with this property, the string will be normalized internally and the match rule will be applied CONTACTS_MATCH_EXACTLY
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_contact_email _contacts_contact_email view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDPrimary KeyDescription
string_uri
integercontact_id
stringdisplay_name
integerdisplay_source_type
integeraddress_book_id
integerperson_id
stringringtone_path
stringimage_thumbnail_path
integer email_id *
integer type
string label
boolean is_ default
string email
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_contact_grouprel _contacts_contact_grouprel view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDPrimary KeyDescription
string_uri
integercontact_id*
stringdisplay_name
integerdisplay_source_type
integeraddress_book_id
integerperson_id
stringringtone_path
stringimage_thumbnail_path
integer group_id *
string group_name
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_contact_activity _contacts_contact_activity view + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDPrimary KeyDescription
string_uri
integercontact_id
stringdisplay_name
integerdisplay_source_type
integeraddress_book_id
integerperson_id
stringringtone_path
stringimage_thumbnail_path
integer activity_id *
string source_name
string status
integer timestamp
string sync_data1
string sync_data2
string sync_data3
string sync_data4
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_phone_log_number _contacts_phone_log_number view + * + * + * + * + * + * + * + * + * + *
TypeProperty IDPrimary KeyDescription
string_uri
string number *
+ * + * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_phone_log_stat _contacts_phone_log_stat view + * + * + * + * + * + * + * + * + * + * + *
TypeProperty IDPrimary KeyDescription
string_uri
integer log_count
integer log_type *
+ */ + diff --git a/include/contacts_activity.h b/include/contacts_activity.h new file mode 100644 index 0000000..815d6fa --- /dev/null +++ b/include/contacts_activity.h @@ -0,0 +1,78 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __TIZEN_SOCIAL_CONTACTS_ACTIVITY_H__ +#define __TIZEN_SOCIAL_CONTACTS_ACTIVITY_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_ACTIVITY_MODULE + * @{ + */ + +/** + * @brief Deletes activity record from the contacts database by contact id. + * + * @param[in] contact_id The contact ID to delete + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + */ +API int contacts_activity_delete_by_contact_id(int contact_id); + +/** + * @brief Deletes activity record from the contacts database by account id. + * + * @param[in] account_id The account ID to delete + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + */ +API int contacts_activity_delete_by_account_id(int account_id); + + +/** + * @} + */ + + +#ifdef __cplusplus +} +#endif + + +#endif //__TIZEN_SOCIAL_CONTACTS_ACTIVITY_H__ + diff --git a/include/contacts_db.h b/include/contacts_db.h new file mode 100755 index 0000000..73de2ca --- /dev/null +++ b/include/contacts_db.h @@ -0,0 +1,591 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __TIZEN_SOCIAL_CONTACTS_DB_H__ +#define __TIZEN_SOCIAL_CONTACTS_DB_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_DATABASE_MODULE + * @{ + */ + +typedef enum +{ + CONTACTS_CHANGE_INSERTED, /**< . */ + CONTACTS_CHANGE_UPDATED, /**< . */ + CONTACTS_CHANGE_DELETED, /**< . */ +// CONTACTS_CHANGE_BULK_INSERTED, +// CONTACTS_CHANGE_BULK_DELETED +} contacts_changed_e; + +/** + * @brief Called when designated view changes. + * + * @param[in] view_uri The view uri + * @param[in] user_data The user data passed from the callback registration function + * + * @see contacts_db_add_changed_cb() + */ +typedef void (*contacts_db_changed_cb)(const char* view_uri, void* user_data); + +/** + * @brief The callback function to get the result of insert batch operation. + * + * @param[in] error Error code for batch operation + * @param[in] ids IDs of inserted records + * @param[in] count The number of ids + * @param[in] user_data The user data passed from the batch operation + * + * @return @c true to continue with the next iteration of the loop or @c false to break out of the loop. + * + * @pre contacts_db_insert_records() will invoke this callback. + * + * @see contacts_db_insert_records() + */ +typedef void (*contacts_db_insert_result_cb)( int error, int *ids, unsigned int count, void *user_data); + +/** + * @brief The callback function to get the result of batch operation. + * + * @param[in] error Error code for batch operation + * @param[in] user_data The user data passed from the batch operation + * + * @return @c true to continue with the next iteration of the loop or @c false to break out of the loop. + * + * @pre contacts_db_update_records() will invoke this callback. + * + * @see contacts_db_update_records() + */ +typedef void (*contacts_db_result_cb)( int error, void *user_data); + +/** + * @brief Inserts a record to the contacts database. + * + * @param[in] record The record handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_db_update_record() + * @see contacts_db_delete_record() + * @see contacts_db_get_record() + */ +API int contacts_db_insert_record( contacts_record_h record, int *id ); + +/** + * @brief Gets a record from the contacts database. + * + * @details This function creates a new contact handle from the contacts database by the given @a record_id. \n + * @a contact will be created, which is filled with contact information. + * + * @remarks @a record must be released with contacts_record_destroy() by you. + * + * @param[in] view_uri The view URI of a record + * @param[in] record_id The record ID to get from database + * @param[out] record The record handle associated with the record ID + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_record_destroy() + */ +API int contacts_db_get_record( const char* view_uri, int record_id, contacts_record_h* record ); + +/** + * @brief Updates a record to the contacts database. + * + * @param[in] record The record handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_db_insert_record() + * @see contacts_db_delete_record() + * @see contacts_db_get_record() + */ +API int contacts_db_update_record( contacts_record_h record ); + +/** + * @brief Deletes a record from the contacts database. + * + * @param[in] view_uri The view URI of a record + * @param[in] record_id The record ID to delete + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_db_insert_record() + */ +API int contacts_db_delete_record( const char* view_uri, int record_id ); + +/** + * @brief Replace the record to the contacts database related to id. + * + * @remarks @the write once value of record is not replaced. + * + * @param[in] record The new record handle to replace + * @param[in] id The db record ID to replace + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_db_update_record() + * @see contacts_db_delete_record() + * @see contacts_db_get_record() + */ +API int contacts_db_replace_record( contacts_record_h record, int id ); + +/** + * @brief Retrieves all record as a list + * + * @remarks @a record_list must be released with contacts_list_destroy() by you. + * + * @param[in] view_uri The view URI to get records + * @param[in] offset The index to get results from which index + * @param[in] limit The number to limit results + * @param[out] record_list The record list + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_list_destroy() + */ +API int contacts_db_get_all_records( const char* view_uri, int offset, int limit, contacts_list_h* record_list ); + +/** + * @brief Retrieves records with a query handle + * + * @remarks @a record_list must be released with contacts_list_destroy() by you. + * + * @param[in] query The query handle to filter + * @param[in] offset The index to get results from which index + * @param[in] limit The number to limit results + * @param[out] record_list The record list + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_list_destroy() + */ +API int contacts_db_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* record_list ); + +/** + * @brief Inserts multiple records as batch operation to the contacts database. + * + * @param[in] record_list The record list handle + * @param[out] ids IDs of inserted records + * @param[out] count The number of ids + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_db_update_records() + * @see contacts_db_delete_records() + * @see contacts_db_result_cb() + */ +API int contacts_db_insert_records( contacts_list_h record_list, int **ids, unsigned int *count); + +/** + * @brief Inserts multiple records as batch operation to the contacts database. + * + * @param[in] record_list The record list handle + * @param[in] callback The callback function to invoke which lets you know result of batch operation + * @param[in] user_data The user data to be passed to the callback function + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_db_insert_records() + * @see contacts_db_update_records_async() + * @see contacts_db_delete_records_async() + * @see contacts_db_insert_result_cb() + */ +API int contacts_db_insert_records_async( contacts_list_h record_list, contacts_db_insert_result_cb callback, void *user_data); + +/** + * @brief Updates multiple records as batch operation to the contacts database. + * + * @param[in] record_list The record list handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_db_insert_records() + * @see contacts_db_delete_records() + * @see contacts_db_result_cb() + */ +API int contacts_db_update_records( contacts_list_h record_list); + +/** + * @brief Updates multiple records as batch operation to the contacts database. + * + * @param[in] record_list The record list handle + * @param[in] callback The callback function to invoke which lets you know result of batch operation + * @param[in] user_data The user data to be passed to the callback function + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_db_update_records() + * @see contacts_db_insert_records_async() + * @see contacts_db_delete_records_async() + * @see contacts_db_result_cb() + */ +API int contacts_db_update_records_async( contacts_list_h record_list, contacts_db_result_cb callback, void *user_data); + +/** + * @brief Deletes multiple records as batch operation to the contacts database. + * + * @param[in] view_uri The view URI of records + * @param[in] record_id_array The record IDs to delete + * @param[in] count The number of record ID array + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_db_insert_records() + * @see contacts_db_update_records() + * @see contacts_db_result_cb() + */ +API int contacts_db_delete_records(const char* view_uri, int record_id_array[], int count); + +/** + * @brief Deletes multiple records as batch operation to the contacts database. + * + * @param[in] view_uri The view URI of records + * @param[in] record_id_array The record IDs to delete + * @param[in] count The number of record ID array + * @param[in] callback The callback function to invoke which lets you know result of batch operation + * @param[in] user_data The user data to be passed to the callback function + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_db_delete_records() + * @see contacts_db_insert_records_async() + * @see contacts_db_update_records_async() + * @see contacts_db_result_cb() + */ +API int contacts_db_delete_records_async(const char* view_uri, int record_id_array[], int count, contacts_db_result_cb callback, void *user_data); + +/** + * @brief Replace the record to the contacts database related to id. + * + * @param[in] record The new record list handle to replace + * @param[in] record_id_array The record IDs to replace + * @param[in] count The number of record ID array + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_db_update_record() + * @see contacts_db_delete_record() + * @see contacts_db_get_record() + */ +API int contacts_db_replace_records( contacts_list_h list, int record_id_array[], unsigned int count ); + +/** + * @brief Replace the record to the contacts database related to id. + * + * @param[in] record The new record list handle to replace + * @param[in] record_id_array The record IDs to replace + * @param[in] count The number of record ID array + * @param[in] callback The callback function to invoke which lets you know result of batch operation + * @param[in] user_data The user data to be passed to the callback function + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_db_replace_record() + * @see contacts_db_update_record_async() + * @see contacts_db_delete_records_async() + * @see contacts_db_get_record() + */ +API int contacts_db_replace_records_async( contacts_list_h list, int record_id_array[], unsigned int count, contacts_db_result_cb callback, void *user_data ); + +/** + * @brief Gets the current contacts database version. + * + * @param[out] contacts_db_version The contacts database version + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to the contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_db_get_changes_by_version() + */ +API int contacts_db_get_current_version( int* contacts_db_version ); + +/** + * @brief Registers a callback function to be invoked when the record changes. + * + * @param[in] view_uri The view URI of record to subscribe to changing notifications + * @param[in] callback The callback function to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @pre This function requires an open connection to the contacts service by contacts_connect2(). + * @post contacts_db_changed_cb() will be invoked when the designated view changes. + * + * @see contacts_connect2() + * @see contacts_db_changed_cb() + * @see contacts_db_remove_changed_cb() + */ +API int contacts_db_add_changed_cb( const char* view_uri, contacts_db_changed_cb callback, void* user_data ); + +/** + * @brief Unregisters a callback function. + * + * @param[in] view_uri The view URI of record to subscribe to changing notifications + * @param[in] callback The callback function to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @pre This function requires an open connection to the contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_db_changed_cb() + * @see contacts_db_add_changed_cb() + */ +API int contacts_db_remove_changed_cb( const char* view_uri, contacts_db_changed_cb callback, void* user_data ); + +#ifndef _CONTACTS_NATIVE + +typedef void (*contacts_db_change_cb_with_info)(const char* view_uri, char *changes, void* user_data); + +API int contacts_db_add_changed_cb_with_info(const char* view_uri, contacts_db_change_cb_with_info callback, void* user_data); +API int contacts_db_remove_changed_cb_with_info(const char* view_uri, contacts_db_change_cb_with_info callback, void* user_data); +#endif + +/** + * @brief Retrieves records with the contacts database version. + * + * @details This function will find all changed records since the given @a contacts_db_version + * + * @remarks @a change_record_list must be released with contacts_list_destroy() by you. + * + * @param[in] view_uri The view URI to get records + * @param[in] address_book_id The address book ID to filter + * @param[in] contacts_db_version The contacts database version + * @param[out] record_list The record list + * @param[out] current_contacts_db_version The current contacts database version + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_list_destroy() + */ +API int contacts_db_get_changes_by_version( const char* view_uri, int address_book_id, int contacts_db_version, + contacts_list_h* change_record_list, int* current_contacts_db_version ); + +/** + * @brief Retrieves records with a keyword + * + * @remarks @a record_list must be released with contacts_list_destroy() by you. \n + * This API works only for \ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person and \ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_grouprel. + * + * @param[in] view_uri The view URI to get records + * @param[in] keyword Thekeyword + * @param[in] offset The index to get results from which index + * @param[in] limit The number to limit results + * @param[out] record_list The record list + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_list_destroy() + */ +API int contacts_db_search_records(const char* view_uri, const char *keyword, int offset, int limit, contacts_list_h* record_list); + +/** + * @brief Retrieves records with a query handle and a keyword + * + * @remarks @a record_list must be released with contacts_list_destroy() by you. \n + * This API works only for \ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person and \ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_grouprel. + * + * @param[in] query The query handle to filter + * @param[in] keyword Thekeyword + * @param[in] offset The index to get results from which index + * @param[in] limit The number to limit results + * @param[out] record_list The record list + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_list_destroy() + */ +API int contacts_db_search_records_with_query(contacts_query_h query, const char *keyword, int offset, int limit, contacts_list_h* record_list); + +/** + * @brief Gets records count of a specific view + * + * @param[in] view_uri The view URI to get records + * @param[out] count The count of records + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + */ +API int contacts_db_get_count( const char* view_uri, int *count); + +/** + * @brief Gets records count with a query handle + * + * @param[in] query The query handle to filter + * @param[out] count The count of records + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + */ +API int contacts_db_get_count_with_query( contacts_query_h query, int *count); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif //__TIZEN_SOCIAL_CONTACTS_DB_H__ diff --git a/include/contacts_errors.h b/include/contacts_errors.h new file mode 100755 index 0000000..1ec24cd --- /dev/null +++ b/include/contacts_errors.h @@ -0,0 +1,85 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CONTACTS_ERROR_H__ +#define __TIZEN_SOCIAL_CONTACTS_ERROR_H__ + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif +/** + * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_DATABASE_MODULE + * @{ + */ + +typedef enum +{ + /* GENERAL */ + CONTACTS_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successful */ + CONTACTS_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */ + CONTACTS_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */ + CONTACTS_ERROR_FILE_NO_SPACE = TIZEN_ERROR_FILE_NO_SPACE_ON_DEVICE, /**< FS Full */ + /* LOGIC & DATA */ + CONTACTS_ERROR_NO_DATA = TIZEN_ERROR_SOCIAL_CLASS | TIZEN_ERROR_NO_DATA, /**< Requested data does not exist */ + + /* DB */ +// CONTACTS_ERROR_DB_NOT_OPENED = TIZEN_ERROR_SOCIAL_CLASS | 0x80, /**< Database didn't opened not yet */ +// CONTACTS_ERROR_DB_LOCKED = TIZEN_ERROR_SOCIAL_CLASS | 0x81, /**< Database table locked or file locked */ +// CONTACTS_ERROR_DB_FAILED = TIZEN_ERROR_SOCIAL_CLASS | 0x82, /**< Database operation failure */ +// CONTACTS_ERROR_DB_RECORD_NOT_FOUND = TIZEN_ERROR_SOCIAL_CLASS | 0x83, /**< Empty result set */ +// CONTACTS_ERROR_DB_FULL = TIZEN_ERROR_SOCIAL_CLASS | 0x84, /**< Database Full */ +// CONTACTS_ERROR_DB_IO_ERROR = TIZEN_ERROR_SOCIAL_CLASS | 0x85, /**< Database I/O error */ + + CONTACTS_ERROR_DB = TIZEN_ERROR_SOCIAL_CLASS | 0x9F, /**< Unknown DB error */ + + /* IPC */ +// CONTACTS_ERROR_IPC_BUSY = TIZEN_ERROR_SOCIAL_CLASS | 0xB0, /**< IPC bus locked */ + CONTACTS_ERROR_IPC_NOT_AVALIABLE = TIZEN_ERROR_SOCIAL_CLASS | 0xB1, /**< IPC server is not available */ + CONTACTS_ERROR_IPC = TIZEN_ERROR_SOCIAL_CLASS | 0xBF, /**< Unknown IPC error */ + + /* VCARD */ +// CONTACTS_ERROR_VCARD_UNKNOWN_ERROR = TIZEN_ERROR_SOCIAL_CLASS | 0xCF, /**< Unknown Vcard error */ + + /* ENVIRONMENT & OTEHR MODULE */ + CONTACTS_ERROR_SYSTEM = TIZEN_ERROR_SOCIAL_CLASS | 0xEF, /**< . */ +/* + CONTACTS_ERROR_SOCKET_FAILED = TIZEN_ERROR_SOCIAL_CLASS | 0xE0, + CONTACTS_ERROR_INOTIFY_FAILED = TIZEN_ERROR_SOCIAL_CLASS | 0xE1, + CONTACTS_ERROR_VCONF_FAILED = TIZEN_ERROR_SOCIAL_CLASS | 0xE2, + CONTACTS_ERROR_ICU_FAILED = TIZEN_ERROR_SOCIAL_CLASS | 0xE3, + CONTACTS_ERROR_TAPI_FAILED = TIZEN_ERROR_SOCIAL_CLASS | 0xE4, +*/ + + /* UNHANDLED EXCEPTION */ + CONTACTS_ERROR_INTERNAL = TIZEN_ERROR_SOCIAL_CLASS | 0xFF, /**< Implementation Error, Temporary Use */ +} contacts_error_e; + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_SOCIAL_CONTACTS_ERROR_H__ */ + diff --git a/include/contacts_filter.h b/include/contacts_filter.h new file mode 100755 index 0000000..e6310ce --- /dev/null +++ b/include/contacts_filter.h @@ -0,0 +1,213 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __TIZEN_SOCIAL_CONTACTS_FILTER_H__ +#define __TIZEN_SOCIAL_CONTACTS_FILTER_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** + * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_FILTER_MODULE + * @{ + */ + +typedef enum +{ + CONTACTS_MATCH_EXACTLY, /**< . */ + CONTACTS_MATCH_FULLSTRING, /**< . */ + CONTACTS_MATCH_CONTAINS, /**< . */ + CONTACTS_MATCH_STARTSWITH, /**< . */ + CONTACTS_MATCH_ENDSWITH, /**< . */ + CONTACTS_MATCH_EXISTS /**< . */ +} contacts_match_str_flag_e; + +typedef enum +{ + CONTACTS_MATCH_EQUAL, /**< . */ + CONTACTS_MATCH_GREATER_THAN, /**< . */ + CONTACTS_MATCH_GREATER_THAN_OR_EQUAL, /**< . */ + CONTACTS_MATCH_LESS_THAN, /**< . */ + CONTACTS_MATCH_LESS_THAN_OR_EQUAL, /**< . */ + CONTACTS_MATCH_NOT_EQUAL, /**< this flag can yield poor performance */ + CONTACTS_MATCH_NONE, /**< . */ +} contacts_match_int_flag_e; + +typedef enum { + CONTACTS_FILTER_OPERATOR_AND, /**< . */ + CONTACTS_FILTER_OPERATOR_OR /**< . */ +} contacts_filter_operator_e; + + +/** + * @brief Creates a handle to filter. + * + * @remarks @a filter must be released with contacts_filter_destroy() by you. + * + * @param[in] view_uri The view URI of a filter + * @param[out] filter The filter handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_OUT_OF_MEMORY Out of memory + * + * @see contacts_filter_destroy() + */ +API int contacts_filter_create( const char* view_uri, contacts_filter_h* filter ); + +/** + * @brief Destroys a filter handle. + * + * @param[in] filter The filter handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_filter_create() + */ +API int contacts_filter_destroy( contacts_filter_h filter ); + +/** + * @brief Adds a condition for string type property + * + * @param[in] filter The filter handle + * @param[in] property_id The property ID to add a condition + * @param[in] match The match flag + * @param[in] match_value The match value + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_filter_add_operator() + */ +API int contacts_filter_add_str( contacts_filter_h filter, unsigned int property_id, contacts_match_str_flag_e match, const char* match_value ); + +/** + * @brief Adds a condition for integer type property + * + * @param[in] filter The filter handle + * @param[in] property_id The property ID to add a condition + * @param[in] match The match flag + * @param[in] match_value The match value + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_filter_add_operator() + */ +API int contacts_filter_add_int( contacts_filter_h filter, unsigned int property_id, contacts_match_int_flag_e match, int match_value ); + +/** + * @brief Adds a condition for long long int type property + * + * @param[in] filter The filter handle + * @param[in] property_id The property ID to add a condition + * @param[in] match The match flag + * @param[in] match_value The match value + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_filter_add_operator() + */ +API int contacts_filter_add_lli( contacts_filter_h filter, unsigned int property_id, contacts_match_int_flag_e match, long long int match_value ); + +/** + * @brief Adds a condition for double type property + * + * @param[in] filter The filter handle + * @param[in] property_id The property ID to add a condition + * @param[in] match The match flag + * @param[in] match_value The match value + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_filter_add_operator() + */ +API int contacts_filter_add_double( contacts_filter_h filter, unsigned int property_id, contacts_match_int_flag_e match, double match_value ); + +/** + * @brief Adds a condition for boolean type property + * + * @param[in] filter The filter handle + * @param[in] property_id The property ID to add a condition + * @param[in] match_value The match value + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_filter_add_operator() + */ +API int contacts_filter_add_bool( contacts_filter_h filter, unsigned int property_id, bool match_value ); + +/** + * @brief Adds a operator between conditions + * + * @param[in] filter The filter handle + * @param[in] operator_type The operator type + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_filter_add_str() + * @see contacts_filter_add_int() + * @see contacts_filter_add_bool() + */ +API int contacts_filter_add_operator( contacts_filter_h filter, contacts_filter_operator_e operator_type ); + +/** + * @brief Adds a filter handle to filter handle. + * + * @param[in] parent_filter The parent filter handle + * @param[in] child_filter The child filter handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_filter_add_operator() + */ +API int contacts_filter_add_filter(contacts_filter_h parent_filter, contacts_filter_h child_filter); + + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif //__TIZEN_SOCIAL_CONTACTS_FILTER_H__ diff --git a/include/contacts_group.h b/include/contacts_group.h new file mode 100644 index 0000000..2e0fe73 --- /dev/null +++ b/include/contacts_group.h @@ -0,0 +1,82 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __TIZEN_SOCIAL_CONTACTS_GROUP_H__ +#define __TIZEN_SOCIAL_CONTACTS_GROUP_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_GROUP_MODULE + * @{ + */ + +/** + * @brief Adds a contact and a group relationship to the contacts database. + * + * @param[in] group_id The group ID + * @param[in] contact_id The contact ID + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_group_remove_contact() + */ +API int contacts_group_add_contact(int group_id, int contact_id); + +/** + * @brief Removes a contact and a group relationship from the contacts database. + * + * @param[in] group_id The group ID + * @param[in] contact_id The contact ID + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + * @see contacts_group_add_contact() + */ +API int contacts_group_remove_contact(int group_id, int contact_id); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif //__TIZEN_SOCIAL_CONTACTS_GROUP_H__ diff --git a/include/contacts_list.h b/include/contacts_list.h new file mode 100644 index 0000000..146bb9f --- /dev/null +++ b/include/contacts_list.h @@ -0,0 +1,185 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __TIZEN_SOCIAL_CONTACTS_LIST_H__ +#define __TIZEN_SOCIAL_CONTACTS_LIST_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_LIST_MODULE + * @{ + */ + +/** + * @brief Creates a handle to the contacts list. + * + * @remarks @a contacts_list must be released with contacts_list_destroy() by you. + * + * @param[out] contacts_list The contacts list handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_list_destroy() + */ +API int contacts_list_create( contacts_list_h* contacts_list ); + +/** + * @brief Destroys a contacts list handle and releases all its resources. + * + * @param[in] contacts_list The contacts list handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_list_create() + */ +API int contacts_list_destroy( contacts_list_h contacts_list, bool delete_child ); + +/** + * @brief Retrieves count of contact entity from a contacts list. + * + * @param[in] contacts_list The contacts list handle + * @param[out] count The count of contact entity + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_list_add() + */ +API int contacts_list_get_count( contacts_list_h contacts_list, unsigned int *count ); + +/** + * @brief Adds a record handle to contacts list handle. + * + * @param[in] contacts_list The contacts list handle + * @param[in] record The record handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_list_remove() + */ +API int contacts_list_add( contacts_list_h contacts_list, contacts_record_h record ); + +/** + * @brief Removes a record handle to contacts list handle. + * @details If the record is current record then current record is changed the next record.\n + * If the record is the last record then current record will be NULL. + * + * @param[in] contacts_list The contacts list handle + * @param[in] record The record handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_list_add() + */ +API int contacts_list_remove( contacts_list_h contacts_list, contacts_record_h record ); + +/** + * @brief Retrieves a record handle from contacts list handle. + * @details The default current record is the first record + * @remarks The @a record handle MUST NOT destroyed by you. + * It is destroyed automatically when the @a contacts_list is destroyed. + * + * @param[in] contacts_list The contacts list handle + * @param[out] record The record handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + */ +API int contacts_list_get_current_record_p( contacts_list_h contacts_list, contacts_record_h* record ); + +/** + * @brief Moves a contacts list to previous position. + * + * @param[in] contacts_list The contacts list handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_list_next() + */ +API int contacts_list_prev( contacts_list_h contacts_list ); + +/** + * @brief Moves a contacts list to next position. + * + * @param[in] contacts_list The contacts list handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_list_prev() + */ +API int contacts_list_next( contacts_list_h contacts_list ); + +/** + * @brief Moves a contacts list to the first position. + * + * @param[in] contacts_list The contacts list handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_list_last() + */ +API int contacts_list_first( contacts_list_h contacts_list ); + +/** + * @brief Moves a contacts lis tto the last position. + * + * @param[in] contacts_list The contacts list handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_list_first() + */ +API int contacts_list_last( contacts_list_h contacts_list ); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif //__TIZEN_SOCIAL_CONTACTS_LIST_H__ diff --git a/include/contacts_person.h b/include/contacts_person.h new file mode 100644 index 0000000..fbea293 --- /dev/null +++ b/include/contacts_person.h @@ -0,0 +1,160 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __TIZEN_SOCIAL_CONTACTS_PERSON_H__ +#define __TIZEN_SOCIAL_CONTACTS_PERSON_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_PERSON_MODULE + * @{ + */ + +/** + * @brief Links a person to a person. + * + * @param[in] base_person_id The base person ID + * @param[in] person_id The person ID to be linked + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + */ +API int contacts_person_link_person(int base_person_id, int person_id); + +/** + * @brief Unlinks a contact from a person. + * + * @param[in] person_id The person ID + * @param[in] contact_id The contact ID to unlink + * @param[out] unliked_person_id The person ID generated + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + */ +API int contacts_person_unlink_contact(int person_id, int contact_id, int* unlinked_person_id); + +/** + * @brief Resets a person's usage count. + * @details The person is no longer in the most frequent contacted person list. + * + * @param[in] person_id The person ID + * @param[in] type The type to reset + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + */ +API int contacts_person_reset_usage(int person_id, contacts_usage_type_e type); + +/** + * @brief Sets a favorite person place between a previous person and a next person. + * + * @param[in] person_id The person ID to move + * @param[in] previous_person_id The previous person ID + * @param[in] next_person_id The back person ID + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + */ +API int contacts_person_set_favorite_order(int person_id, int previous_person_id, int next_person_id); + +typedef enum { + CONTACTS_PERSON_PROPERTY_NAME_CONTACT, /**< . */ + CONTACTS_PERSON_PROPERTY_NUMBER, /**< . */ + CONTACTS_PERSON_PROPERTY_EMAIL, /**< . */ + CONTACTS_PERSON_PROPERTY_IMAGE, /**< . */ +} contacts_person_property_e; + +/** + * @brief Sets a default property for a record. + * + * @remarks @a id can be contact_id, number_id, email_id, image_id + * + * @param[in] property #contacts_person_property_e + * @param[in] person_id The person ID + * @param[in] id The record id + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + */ +API int contacts_person_set_default_property(contacts_person_property_e property, int person_id, + int id); + +/** + * @brief Gets a default property for a record. + * + * @remarks @a id can be contact_id, number_id, email_id, image_id + * + * @param[in] property #contacts_person_property_e + * @param[in] person_id The person ID + * @param[out] id The record id of the property to be set as default + + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + */ +API int contacts_person_get_default_property(contacts_person_property_e property, int person_id, + int *id); + +/** + * @} + */ + + +#ifdef __cplusplus +} +#endif + + +#endif //__TIZEN_SOCIAL_CONTACTS_PERSON_H__ diff --git a/include/contacts_phone_log.h b/include/contacts_phone_log.h new file mode 100644 index 0000000..f799307 --- /dev/null +++ b/include/contacts_phone_log.h @@ -0,0 +1,85 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __TIZEN_SOCIAL_CONTACTS_PHONELOG_H__ +#define __TIZEN_SOCIAL_CONTACTS_PHONELOG_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_PHONELOG_MODULE + * @{ + */ + +/** + * @brief Resets a phonelog's count. + * @details The count of all type of phonelog will be 0. + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + */ +API int contacts_phone_log_reset_statistics(); + +typedef enum { + CONTACTS_PHONE_LOG_DELETE_BY_ADDRESS, /**< . */ + CONTACTS_PHONE_LOG_DELETE_BY_MESSAGE_EXTRA_DATA1, /**< . */ + CONTACTS_PHONE_LOG_DELETE_BY_EMAIL_EXTRA_DATA1, /**< . */ +} contacts_phone_log_delete_e; + +/** + * @brief Delete phone log with extra_data1 + * + * @param[in] op operation #contacts_phone_log_delete_e + * @param[in] address (optional) Address to delete (number, email, etc) + * @param[in] extra_data1 (optional) extra_data1 to delete + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @par example + * @code + contacts_phone_log_delete(CONTACTS_PHONE_LOG_DELETE_BY_ADDRESS, "0123456789"); + contacts_phone_log_delete(CONTACTS_PHONE_LOG_DELETE_BY_MESSAGE_EXTRA_DATA1, 2); + contacts_phone_log_delete(CONTACTS_PHONE_LOG_DELETE_BY_EMAIL_EXTRA_DATA1, 1); + * @endcode + */ +API int contacts_phone_log_delete(contacts_phone_log_delete_e op, ...); + +/** + * @} + */ + + +#ifdef __cplusplus +} +#endif + + +#endif //__TIZEN_SOCIAL_CONTACTS_PHONELOG_H__ diff --git a/include/contacts_query.h b/include/contacts_query.h new file mode 100644 index 0000000..af9c799 --- /dev/null +++ b/include/contacts_query.h @@ -0,0 +1,128 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __TIZEN_SOCIAL_CONTACTS_QUERY_H__ +#define __TIZEN_SOCIAL_CONTACTS_QUERY_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_QUERY_MODULE + * @{ + */ + +/** + * @brief Creates a query handle. + * + * @remarks @a query must be released with contacts_query_destroy() by you. + * + * @param[in] view_uri The view URI of a query + * @param[out] query The filter handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_OUT_OF_MEMORY Out of memory + * + * @see contacts_query_destroy() + */ +API int contacts_query_create( const char* view_uri, contacts_query_h* query ); + +/** + * @brief Destroys a query handle. + * + * @param[in] query The query handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_query_create() + */ +API int contacts_query_destroy( contacts_query_h query ); + +/** + * @brief Adds property IDs for projection. + * + * @param[in] filter The filter handle + * @param[in] property_id_array The property ID array + * @param[in] count The number of property IDs + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + */ +API int contacts_query_set_projection(contacts_query_h query, unsigned int property_id_array[], int count); + +/** + * @brief Set distinct option for projection. + * + * @param[in] query The query handle + * @param[in] set Set or unset + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + */ +API int contacts_query_set_distinct(contacts_query_h query, bool set); + +/** + * @brief Set a filter handle to query handle. + * + * @param[in] query The query handle + * @param[in] filter The filter handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_filter_create() + */ +API int contacts_query_set_filter(contacts_query_h query, contacts_filter_h filter); + +/** + * @brief Sets sort mode. + * + * @param[in] query The query handle + * @param[in] property_id The property ID to sort + * @param[in] is_ascending Ascending or decending + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + */ +API int contacts_query_set_sort(contacts_query_h query, unsigned int property_id, bool is_ascending); + + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif //__TIZEN_SOCIAL_CONTACTS_QUERY_H__ diff --git a/include/contacts_record.h b/include/contacts_record.h new file mode 100644 index 0000000..60ac4bf --- /dev/null +++ b/include/contacts_record.h @@ -0,0 +1,349 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __TIZEN_SOCIAL_CONTACTS_RECORD_H__ +#define __TIZEN_SOCIAL_CONTACTS_RECORD_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** + * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_RECORD_MODULE + * @{ + */ + +/** + * @brief Creates a handle to the record. + * + * @remarks @a record must be released with contacts_record_destroy() by you. + * + * @param[in] view_uri The view uri + * @param[out] record The record handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_destroy() + */ +API int contacts_record_create( const char* view_uri, contacts_record_h* record ); + +/** + * @brief Destroys a record handle and releases all its resources. + * + * @param[in] record The record handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_list_create() + */ +API int contacts_record_destroy( contacts_record_h record, bool delete_child ); + +/** + * @brief Makes a clone of a record handle. + * + * @remarks @a cloned_record must be released with contacts_record_destroy() by you. + * + * @param[in] record The record handle + * @param[out] cloned_record The cloned record handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_destroy() + */ +API int contacts_record_clone( contacts_record_h record, contacts_record_h* cloned_record ); + +/** + * @brief Gets a string from a record handle. + * + * @remarks @a value must be released with free() by you. + * + * @param[in] record The record handle + * @param[in] property_id The property ID + * @param[out] value The value to be returned + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_get_str_p() + * @see contacts_record_set_str() + */ +API int contacts_record_get_str( contacts_record_h record, unsigned int property_id, char** value ); + +/** + * @brief Gets a string pointer from a record handle. + * + * @remarks @a value MUST NOT be released by you. + * + * @param[in] record The record handle + * @param[in] property_id The property ID + * @param[out] value The value to be returned + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_get_str() + * @see contacts_record_set_str() + */ +API int contacts_record_get_str_p( contacts_record_h record, unsigned int property_id, char** value ); + +/** + * @brief Sets a string to a record handle. + * + * @param[in] record The record handle + * @param[in] property_id The property ID + * @param[in] value The value to set + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_get_str() + * @see contacts_record_get_str_p() + */ +API int contacts_record_set_str( contacts_record_h record, unsigned int property_id, const char* value ); + +/** + * @brief Gets a integer from a record handle. + * + * @param[in] record The record handle + * @param[in] property_id The property ID + * @param[out] value The value to be returned + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_set_int() + */ +API int contacts_record_get_int( contacts_record_h record, unsigned int property_id, int* value ); + +/** + * @brief Sets a integer to a record handle. + * + * @param[in] record The record handle + * @param[in] property_id The property ID + * @param[in] value The value to set + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_get_int() + */ +API int contacts_record_set_int( contacts_record_h record, unsigned int property_id, int value ); + +/** + * @brief Gets a long integer from a record handle. + * + * @param[in] record The record handle + * @param[in] property_id The property ID + * @param[out] value The value to be returned + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_set_lli() + */ +API int contacts_record_get_lli( contacts_record_h record, unsigned int property_id, long long int *value ); + +/** + * @brief Sets a long integer to a record handle. + * + * @param[in] record The record handle + * @param[in] property_id The property ID + * @param[in] value The value to set + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_get_lli() + */ +API int contacts_record_set_lli( contacts_record_h record, unsigned int property_id, long long int value ); + +/** + * @brief Gets a boolean from a record handle. + * + * @param[in] record The record handle + * @param[in] property_id The property ID + * @param[out] value The value to be returned + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_set_bool() + */ +API int contacts_record_get_bool( contacts_record_h record, unsigned int property_id, bool *value ); + +/** + * @brief Sets a boolean to the record handle. + * + * @param[in] record The record handle + * @param[in] property_id The property ID + * @param[in] value The value to set + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_get_bool() + */ +API int contacts_record_set_bool( contacts_record_h record, unsigned int property_id, bool value ); + +/** + * @brief Gets a double from a record handle. + * + * @param[in] record The record handle + * @param[in] property_id The property ID + * @param[out] value The value to be returned + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_set_bool() + */ +API int contacts_record_get_double( contacts_record_h record, unsigned int property_id, double *value ); + +/** + * @brief Sets a double to the record handle. + * + * @param[in] record The record handle + * @param[in] property_id The property ID + * @param[in] value The value to set + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_get_bool() + */ +API int contacts_record_set_double( contacts_record_h record, unsigned int property_id, double value ); + +/** + * @brief Adds a child record handle to a parent record handle. + * + * @param[in] record The parent record handle + * @param[in] property_id The property ID + * @param[in] child_record The child record handle to be added to parent record handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_remove_child_record() + */ +API int contacts_record_add_child_record( contacts_record_h record, unsigned int property_id, contacts_record_h child_record ); + +/** + * @brief Removes a child record handle from a parent record handle. + * + * @param[in] record The parent record handle + * @param[in] property_id The property ID + * @param[in] child_record The child record handle to be removed from parent record handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_add_child_record() + */ +API int contacts_record_remove_child_record( contacts_record_h record, unsigned int property_id, contacts_record_h child_record ); + +//API int contacts_record_update_child_record( contacts_record_h record, contacts_record_h child_record ); + +/** + * @brief Gets a number of child record handle from a parent record handle. + * + * @param[in] record The parent record handle + * @param[in] property_id The property ID + * @param[out] count The child record count + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_add_child_record() + * @see contacts_record_remove_child_record() + */ +API int contacts_record_get_child_record_count( contacts_record_h record, unsigned int property_id, unsigned int *count ); + +/** + * @brief Gets a child record handle pointer from a parent record handle. + * + * @remarks @a child_record MUST NOT be released by you. \n It is released when the parent record handle destroyed. + * + * @param[in] record The record handle + * @param[in] property_id The property ID + * @param[in] index The index of child record + * @param[out] child_record The child record handle pointer to be returned + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_record_add_child_record() + * @see contacts_record_remove_child_record() + * @see contacts_record_get_child_record_count() + */ +API int contacts_record_get_child_record_at_p( contacts_record_h record, unsigned int property_id, int index, contacts_record_h* child_record ); + +/** + * @brief Makes a clone of a child record list handle from a parent record handle. + * + * @remarks @a cloned_list MUST be released with contacts_list_destroy() by you. + * + * @param[in] record The record handle + * @param[in] property_id The property ID + * @param[out] cloned_list The cloned list handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see contacts_list_destroy() + */ +API int contacts_record_clone_child_record_list( contacts_record_h record, unsigned int property_id, contacts_list_h* cloned_list ); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif //__TIZEN_SOCIAL_CONTACTS_RECORD_H__ diff --git a/include/contacts_service.h b/include/contacts_service.h new file mode 100755 index 0000000..a82b9bc --- /dev/null +++ b/include/contacts_service.h @@ -0,0 +1,120 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __TIZEN_SOCIAL_CONTACTS_SERVICE_H__ +#define __TIZEN_SOCIAL_CONTACTS_SERVICE_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_DATABASE_MODULE + * @{ + */ + +/** + * @brief Connects to the contacts service. + * + * @remarks Connection opening is necessary to access the contacts database such as fetching, inserting, or updating records.\n + * The execution of contacts_connect2() and contacts_disconnect2() could slow down your application so you are recommended not to call them frequently. + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @see contacts_disconnect2() + */ +API int contacts_connect2(); + +/** + * @brief Disconnects from the contacts service. + * + * @remarks If there is no opened connection, this function returns #CONTACTS_ERROR_DB. + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @see contacts_connect2() + */ +API int contacts_disconnect2(); + + + +/** + * @brief Connects to the contacts service with another connection for thread. + * + * @remarks + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @see contacts_disconnect_on_thread() + */ +API int contacts_connect_on_thread(); + +/** + * @brief Disconnects from the contacts service. + * + * @remarks + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @see contacts_connect_on_thread() + */ +API int contacts_disconnect_on_thread(); + + +#define CONTACTS_CONNECT_FLAG_RETRY 0x00000001 +#define CONTACTS_CONNECT_FLAG_NONE 0 + +/** + * @brief Connects to the contacts service. If connection is failed because contacts-service is not running, it will retry for several seconds + * + * @remarks Connection opening is necessary to access the contacts database such as fetching, inserting, or updating records.\n + * The execution of contacts_connect2() and contacts_disconnect2() could slow down your application so you are recommended not to call them frequently. + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @see contacts_disconnect2() + */ +API int contacts_connect_with_flags(unsigned int flags); + + + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif //__TIZEN_SOCIAL_CONTACTS_SERVICE_H__ diff --git a/include/contacts_setting.h b/include/contacts_setting.h new file mode 100755 index 0000000..410eebb --- /dev/null +++ b/include/contacts_setting.h @@ -0,0 +1,86 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __TIZEN_SOCIAL_CONTACTS_SETTING_H__ +#define __TIZEN_SOCIAL_CONTACTS_SETTING_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_SETTING_MODULE + * @{ + */ + +/** + * @brief Enumerations of name display order + */ +typedef enum +{ + CONTACTS_NAME_DISPLAY_ORDER_FIRSTLAST, /**< First name comes at the first */ + CONTACTS_NAME_DISPLAY_ORDER_LASTFIRST /**< First name comes at the last */ +} contacts_name_display_order_e; + +/** + * @brief Gets the contacts name display order. + * + * @param[out] name_display_order The name display order + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to the contacts service by contacts_connect2(). + * + * @see contacts_connect2() + */ +API int contacts_setting_get_name_display_order(contacts_name_display_order_e *name_display_order); + +/** + * @brief Sets the contacts name display order. + * + * @param[in] name_display_order The name display order + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to the contacts service by contacts_connect2(). + * + * @see contacts_connect2() + */ +API int contacts_setting_set_name_display_order(contacts_name_display_order_e name_display_order); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif //__TIZEN_SOCIAL_CONTACTS_SETTING_H__ diff --git a/include/contacts_sim.h b/include/contacts_sim.h new file mode 100644 index 0000000..3a7019c --- /dev/null +++ b/include/contacts_sim.h @@ -0,0 +1,72 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __TIZEN_SOCIAL_CONTACTS_SIM_H__ +#define __TIZEN_SOCIAL_CONTACTS_SIM_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_SIM_MODULE + * @{ + */ + +/** + * @brief Imports all contacts to Contacts Database from SIM. + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + */ +API int contacts_sim_import_all_contacts(); + + +/** + * @brief check whether to complete sim initialize . + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_DB Database operation failure + * + * @pre This function requires an open connection to contacts service by contacts_connect2(). + * + * @see contacts_connect2() + */ +API int contacts_sim_get_initialization_status(bool *completed); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif //__TIZEN_SOCIAL_CONTACTS_SIM_H__ diff --git a/include/contacts_types.h b/include/contacts_types.h new file mode 100644 index 0000000..0112176 --- /dev/null +++ b/include/contacts_types.h @@ -0,0 +1,231 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CONTACTS_TYPES_H__ +#define __TIZEN_SOCIAL_CONTACTS_TYPES_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define _CONTACTS_BEGIN_VIEW() \ + typedef struct{ \ + const char* const _uri; +#define _CONTACTS_BEGIN_READ_ONLY_VIEW() _CONTACTS_BEGIN_VIEW() +#define _CONTACTS_PROPERTY_INT(property_id_name) unsigned int property_id_name; +#define _CONTACTS_PROPERTY_STR(property_id_name) unsigned int property_id_name; +#define _CONTACTS_PROPERTY_BOOL(property_id_name) unsigned int property_id_name; +#define _CONTACTS_PROPERTY_DOUBLE(property_id_name) unsigned int property_id_name; +#define _CONTACTS_PROPERTY_LLI(property_id_name) unsigned int property_id_name; + +#define _CONTACTS_PROPERTY_CHILD_SINGLE(property_id_name) unsigned int property_id_name; +#define _CONTACTS_PROPERTY_CHILD_MULTIPLE(property_id_name) unsigned int property_id_name; +#define _CONTACTS_PROPERTY_FILTER_INT(property_id_name) unsigned int property_id_name; +#define _CONTACTS_PROPERTY_FILTER_STR(property_id_name) unsigned int property_id_name; +#define _CONTACTS_PROPERTY_FILTER_BOOL(property_id_name) unsigned int property_id_name; +#define _CONTACTS_PROPERTY_FILTER_DOUBLE(property_id_name) unsigned int property_id_name; +#define _CONTACTS_PROPERTY_FILTER_LLI(property_id_name) unsigned int property_id_name; + +#define _CONTACTS_PROPERTY_PROJECTION_INT(property_id_name) unsigned int property_id_name; +#define _CONTACTS_PROPERTY_PROJECTION_STR(property_id_name) unsigned int property_id_name; +#define _CONTACTS_PROPERTY_PROJECTION_BOOL(property_id_name) unsigned int property_id_name; +#define _CONTACTS_PROPERTY_PROJECTION_DOUBLE(property_id_name) unsigned int property_id_name; +#define _CONTACTS_PROPERTY_PROJECTION_LLI(property_id_name) unsigned int property_id_name; +#define _CONTACTS_END_VIEW(name) \ + } name##_property_ids; \ + extern API const name##_property_ids name; +#define _CONTACTS_END_READ_ONLY_VIEW(name) _CONTACTS_END_VIEW(name) + +#define _CONTACTS_HANDLE(A) typedef struct __##A{}* A; + +_CONTACTS_HANDLE( contacts_record_h ) +_CONTACTS_HANDLE( contacts_filter_h ) +_CONTACTS_HANDLE( contacts_list_h ) +_CONTACTS_HANDLE( contacts_query_h ) + +/** + * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_RECORD_MODULE + * @{ + */ + +/** + * The Number can be made with a set of values by specifying one or more values. + * \n Example : CTS_NUM_TYPE_HOME|CTS_NUM_TYPE_VOICE + * \n Exceptionally, CTS_NUM_TYPE_CUSTOM is exclusive. + */ +typedef enum { + CONTACTS_NUMBER_TYPE_OTHER, /**< . */ + CONTACTS_NUMBER_TYPE_CUSTOM = 1<<0, /**< Custom number type */ + CONTACTS_NUMBER_TYPE_HOME = 1<<1, /**< A telephone number associated with a residence */ + CONTACTS_NUMBER_TYPE_WORK = 1<<2, /**< A telephone number associated with a place of work */ + CONTACTS_NUMBER_TYPE_VOICE = 1<<3, /**< A voice telephone number */ + CONTACTS_NUMBER_TYPE_FAX = 1<<4, /**< A facsimile telephone number */ + CONTACTS_NUMBER_TYPE_MSG = 1<<5, /**< The telephone number has voice messaging support */ + CONTACTS_NUMBER_TYPE_CELL = 1<<6, /**< A cellular telephone number */ + CONTACTS_NUMBER_TYPE_PAGER = 1<<7, /**< A paging device telephone number */ + CONTACTS_NUMBER_TYPE_BBS = 1<<8, /**< A bulletin board system telephone number */ + CONTACTS_NUMBER_TYPE_MODEM = 1<<9, /**< A MODEM connected telephone number */ + CONTACTS_NUMBER_TYPE_CAR = 1<<10, /**< A car-phone telephone number */ + CONTACTS_NUMBER_TYPE_ISDN = 1<<11, /**< An ISDN service telephone number */ + CONTACTS_NUMBER_TYPE_VIDEO = 1<<12, /**< A video conferencing telephone number */ + CONTACTS_NUMBER_TYPE_PCS = 1<<13, /**< A personal communication services telephone number */ + + CONTACTS_NUMBER_TYPE_ASSISTANT = 1<<30, /**< A additional type for assistant */ +}contacts_number_type_e; + +typedef enum { + CONTACTS_EMAIL_TYPE_OTHER, /**< . */ + CONTACTS_EMAIL_TYPE_CUSTOM = 1<<0, /**< . */ + CONTACTS_EMAIL_TYPE_HOME = 1<<1, /**< . */ + CONTACTS_EMAIL_TYPE_WORK = 1<<2, /**< . */ + CONTACTS_EMAIL_TYPE_MOBILE = 1<<3, /**< . */ +}contacts_email_type_e; + +typedef enum { + CONTACTS_COMPANY_TYPE_OTHER, /**< . */ + CONTACTS_COMPANY_TYPE_CUSTOM = 1<<0, /**< . */ + CONTACTS_COMPANY_TYPE_WORK = 1<<1, /**< . */ +}contacts_company_type_e; + +typedef enum { + CONTACTS_ADDRESS_TYPE_OTHER, /**< . */ + CONTACTS_ADDRESS_TYPE_CUSTOM = 1<<0, /**< a delivery address for a residence */ + CONTACTS_ADDRESS_TYPE_HOME = 1<<1, /**< a delivery address for a residence */ + CONTACTS_ADDRESS_TYPE_WORK = 1<<2, /**< a delivery address for a place of work */ + CONTACTS_ADDRESS_TYPE_DOM = 1<<3, /**< a domestic delivery address */ + CONTACTS_ADDRESS_TYPE_INTL = 1<<4, /**< an international delivery address */ + CONTACTS_ADDRESS_TYPE_POSTAL = 1<<5, /**< a postal delivery address */ + CONTACTS_ADDRESS_TYPE_PARCEL = 1<<6, /**< a parcel delivery address */ +}contacts_address_type_e; + +typedef enum { + CONTACTS_URL_TYPE_OTHER, /**< . */ + CONTACTS_URL_TYPE_CUSTOM, /**< . */ + CONTACTS_URL_TYPE_HOME, /**< . */ + CONTACTS_URL_TYPE_WORK, /**< . */ +}contacts_url_type_e; + +typedef enum{ + CONTACTS_MESSENGER_TYPE_OTHER, /**< . */ + CONTACTS_MESSENGER_TYPE_CUSTOM, /**< . */ + CONTACTS_MESSENGER_TYPE_GOOGLE, /**< . */ + CONTACTS_MESSENGER_TYPE_WLM, /**< . */ + CONTACTS_MESSENGER_TYPE_YAHOO, /**< . */ + CONTACTS_MESSENGER_TYPE_FACEBOOK, /**< . */ + CONTACTS_MESSENGER_TYPE_ICQ, /**< . */ + CONTACTS_MESSENGER_TYPE_AIM, /**< . */ + CONTACTS_MESSENGER_TYPE_QQ, /**< . */ + CONTACTS_MESSENGER_TYPE_JABBER, /**< . */ + CONTACTS_MESSENGER_TYPE_SKYPE, /**< . */ + CONTACTS_MESSENGER_TYPE_IRC, /**< . */ +}contacts_messenger_type_e; + +typedef enum { + CONTACTS_PLOG_TYPE_NONE, + CONTACTS_PLOG_TYPE_VOICE_INCOMMING = 1, /**< . */ + CONTACTS_PLOG_TYPE_VOICE_OUTGOING = 2, /**< . */ + CONTACTS_PLOG_TYPE_VIDEO_INCOMMING = 3, /**< . */ + CONTACTS_PLOG_TYPE_VIDEO_OUTGOING = 4, /**< . */ + CONTACTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN = 5, /**< Not confirmed missed call */ + CONTACTS_PLOG_TYPE_VOICE_INCOMMING_SEEN = 6, /**< Confirmed missed call */ + CONTACTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN = 7, /**< Not confirmed missed video call */ + CONTACTS_PLOG_TYPE_VIDEO_INCOMMING_SEEN = 8, /**< Confirmed missed video call */ + CONTACTS_PLOG_TYPE_VOICE_REJECT = 9, /**< . */ + CONTACTS_PLOG_TYPE_VIDEO_REJECT = 10, /**< . */ + CONTACTS_PLOG_TYPE_VOICE_BLOCKED = 11, /**< . */ + CONTACTS_PLOG_TYPE_VIDEO_BLOCKED = 12, /**< . */ + + CONTACTS_PLOG_TYPE_MMS_INCOMMING = 101, /**< . */ + CONTACTS_PLOG_TYPE_MMS_OUTGOING = 102, /**< . */ + CONTACTS_PLOG_TYPE_SMS_INCOMMING = 103, /**< . */ + CONTACTS_PLOG_TYPE_SMS_OUTGOING = 104, /**< . */ + CONTACTS_PLOG_TYPE_SMS_BLOCKED = 105, /**< . */ + CONTACTS_PLOG_TYPE_MMS_BLOCKED = 106, /**< . */ + + CONTACTS_PLOG_TYPE_EMAIL_RECEIVED = 201, /**<.*/ + CONTACTS_PLOG_TYPE_EMAIL_SENT = 202, /**<.*/ + + CONTACTS_PLOG_TYPE_MAX +}contacts_phone_log_type_e; + +typedef enum { + CONTACTS_EVENT_TYPE_OTHER, /**< . */ + CONTACTS_EVENT_TYPE_CUSTOM, /**< . */ + CONTACTS_EVENT_TYPE_BIRTH, /**< . */ + CONTACTS_EVENT_TYPE_ANNIVERSARY /**< . */ +}contacts_event_type_e; + +typedef enum { + CONTACTS_USAGE_STAT_TYPE_NONE, /**< . */ + CONTACTS_USAGE_STAT_TYPE_OUTGOING_CALL, /**< . */ + CONTACTS_USAGE_STAT_TYPE_OUTGOING_MSG /**< . */ +}contacts_usage_type_e; + +typedef enum { + CONTACTS_DISPLAY_NAME_SOURCE_TYPE_INVALID, /**< . */ + CONTACTS_DISPLAY_NAME_SOURCE_TYPE_EMAIL, /**< . */ + CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NUMBER, /**< . */ + CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME, /**< . */ + CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY, /**< . */ + CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME, /**< . */ +}contacts_display_name_source_type_e; + +typedef enum { + CONTACTS_ADDRESS_BOOK_MODE_NONE, /**< .*/ + CONTACTS_ADDRESS_BOOK_MODE_READONLY, /**< .*/ +}contacts_address_book_mode_e; + +typedef enum { + CONTACTS_RELATIONSHIP_TYPE_OTHER, /**< .*/ + CONTACTS_RELATIONSHIP_TYPE_ASSISTANT, /**< .*/ + CONTACTS_RELATIONSHIP_TYPE_BROTHER, /**< .*/ + CONTACTS_RELATIONSHIP_TYPE_CHILD, /**< .*/ + CONTACTS_RELATIONSHIP_TYPE_DOMESTIC_PARTNER, /**< .*/ + CONTACTS_RELATIONSHIP_TYPE_FATHER, /**< .*/ + CONTACTS_RELATIONSHIP_TYPE_FRIEND, /**< .*/ + CONTACTS_RELATIONSHIP_TYPE_MANAGER, /**< .*/ + CONTACTS_RELATIONSHIP_TYPE_MOTHER, /**< .*/ + CONTACTS_RELATIONSHIP_TYPE_PARENT, /**< .*/ + CONTACTS_RELATIONSHIP_TYPE_PARTNER, /**< .*/ + CONTACTS_RELATIONSHIP_TYPE_REFERRED_BY, /**< .*/ + CONTACTS_RELATIONSHIP_TYPE_RELATIVE, /**< .*/ + CONTACTS_RELATIONSHIP_TYPE_SISTER, /**< .*/ + CONTACTS_RELATIONSHIP_TYPE_SPOUSE, /**< .*/ + CONTACTS_RELATIONSHIP_TYPE_CUSTOM, /**< .*/ +}contacts_relationship_type_e; + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_SOCIAL_CONTACTS_TYPES_H__ */ + diff --git a/include/contacts-svc.head b/include/contacts_utils.h old mode 100755 new mode 100644 similarity index 52% rename from include/contacts-svc.head rename to include/contacts_utils.h index fcb5cd5..9757b20 --- a/include/contacts-svc.head +++ b/include/contacts_utils.h @@ -1,53 +1,57 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CONTACTS_SVC_H__ -#define __CONTACTS_SVC_H__ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include -#include - -/** - * This header file contains the declaration & description of Contacts Service. - * - * @defgroup CONTACTS_SVC Contacts Service - * @ingroup PIMS_SVC - * @brief Contacts Service - * - * Contacts Service supports APIs that insert, delete, and update contact data - * in order to accommodate the needs for application's contact data processing. - * - * @section Header To use Them: - * @code - * #include - * @endcode - * - */ - -/** - * @addtogroup CONTACTS_SVC - * @{ - */ - +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __TIZEN_SOCIAL_CONTACTS_UTILS_H__ +#define __TIZEN_SOCIAL_CONTACTS_UTILS_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_UTILS_MODULE + * @{ + */ + +/** + * Gets normalized string. + * + * @param[out] index_string The pointer of language index (number, first language, second language(if differ from first), #). + * + * @return 0 on success, otherwise a negative error value. + * + * @retval #CONTACTS_ERROR_NONE Successful +*/ +API int contacts_utils_get_index_characters(char **index_string); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif //__TIZEN_SOCIAL_CONTACTS_UTILS_H__ + diff --git a/include/contacts_vcard.h b/include/contacts_vcard.h new file mode 100644 index 0000000..3f64535 --- /dev/null +++ b/include/contacts_vcard.h @@ -0,0 +1,127 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __TIZEN_SOCIAL_CONTACTS_VCARD_H__ +#define __TIZEN_SOCIAL_CONTACTS_VCARD_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_VCARD_MODULE + * @{ + */ +/** + * @brief The callback function to get record hadle of \ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_contact. + * + * @param[in] record The record handle + * @param[in] user_data The user data passed from the foreach function + * + * @return @c true to continue with the next iteration of the loop or @c false to break out of the loop. + * + * @pre contacts_vcard_parse_to_contact_foreach() will invoke this callback. + * + * @see contacts_vcard_parse_to_contact_foreach() + */ +typedef bool (*contacts_vcard_parse_cb)(contacts_record_h record, void *user_data); + +/** + * @brief Retrieves all contacts with record handle(_contacts_contact) from a vCard file. + * + * @param[in] vcard_file_path The file path of vCard stream file + * @param[in] callback The callback function to invoke + * @param[in] user_data The user data to be passed to the callback function + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @post This function invokes contacts_vcard_stream_cb(). + * + * @see contacts_vcard_parse_cb() + */ +API int contacts_vcard_parse_to_contact_foreach(const char *vcard_file_path, contacts_vcard_parse_cb callback, void *user_data); + +/** + * @brief Retrieves all contacts with contacts list from vCard stream. + * + * @param[in] vcard_stream The vCard stream + * @param[out] contacts_list The contacts list handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + */ +API int contacts_vcard_parse_to_contacts(const char *vcard_stream, contacts_list_h *contacts_list); + +/** + * @brief Retrieves vCard stream from a contact. + * + * @param[in] contact The contact record handle + * @param[out] vcard_stream The vCard stream + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + */ +API int contacts_vcard_make_from_contact(contacts_record_h contact, char **vcard_stream); + +/** + * @brief Retrieves vCard stream from a person. + * + * @param[in] person The person record handle + * @param[out] vcard_stream The vCard stream + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + */ +API int contacts_vcard_make_from_person(contacts_record_h person, char **vcard_stream); + +/** + * @brief Retrieves count of contact entity from a vCard file. + * + * @param[in] vcard_file_path The person record handle + * @param[out] count The count of contact entity + * + * @return 0 on success, otherwise a negative error value. + * @retval #CONTACTS_ERROR_NONE Successful + * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter + */ +API int contacts_vcard_get_entity_count(const char *vcard_file_path, int *count); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif //__TIZEN_SOCIAL_CONTACTS_VCARD_H__ diff --git a/include/contacts_views.h b/include/contacts_views.h new file mode 100755 index 0000000..358dbb7 --- /dev/null +++ b/include/contacts_views.h @@ -0,0 +1,607 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CONTACTS_VIEWS_H__ +#define __TIZEN_SOCIAL_CONTACTS_VIEWS_H__ + +#include "contacts_types.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +// address_book +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( account_id ) // read, write-once + _CONTACTS_PROPERTY_STR( name ) // read, write + _CONTACTS_PROPERTY_INT( mode ) // read, write +_CONTACTS_END_VIEW( _contacts_address_book ) + +// group +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( address_book_id ) // read, write-once + _CONTACTS_PROPERTY_STR( name ) // read, write + _CONTACTS_PROPERTY_STR( ringtone_path ) // read, write + _CONTACTS_PROPERTY_STR( image_path ) // read, write + _CONTACTS_PROPERTY_STR( vibration ) // read, write + _CONTACTS_PROPERTY_STR( system_id ) // read, write, string + _CONTACTS_PROPERTY_BOOL( is_read_only ) // read only +_CONTACTS_END_VIEW( _contacts_group ) + +// person +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_STR( display_name ) // read only + _CONTACTS_PROPERTY_STR( display_name_index) // read only + _CONTACTS_PROPERTY_INT( display_contact_id ) // read, write + _CONTACTS_PROPERTY_STR( ringtone_path ) // read, write + _CONTACTS_PROPERTY_STR( image_thumbnail_path ) // read, write + _CONTACTS_PROPERTY_STR( vibration ) // read, write + _CONTACTS_PROPERTY_STR( status ) // read only + _CONTACTS_PROPERTY_BOOL( is_favorite ) // read, write + _CONTACTS_PROPERTY_DOUBLE( favorite_priority ) // read only + _CONTACTS_PROPERTY_INT( link_count ) // read only + _CONTACTS_PROPERTY_INT( account_id1 ) // read only + _CONTACTS_PROPERTY_INT( account_id2 ) // read only + _CONTACTS_PROPERTY_INT( account_id3 ) // read only + _CONTACTS_PROPERTY_STR( addressbook_ids ) // read only + _CONTACTS_PROPERTY_BOOL( has_phonenumber ) // read only + _CONTACTS_PROPERTY_BOOL( has_email ) // read only +_CONTACTS_END_VIEW( _contacts_person ) + +// simple contact +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_STR( display_name ) // read only + _CONTACTS_PROPERTY_INT( display_source_type) // read only, internal field ? + _CONTACTS_PROPERTY_INT( address_book_id ) // read, write-once + _CONTACTS_PROPERTY_STR( ringtone_path ) // read, write + _CONTACTS_PROPERTY_STR( image_thumbnail_path ) // read, write + _CONTACTS_PROPERTY_BOOL( is_favorite ) // read only + _CONTACTS_PROPERTY_BOOL( has_phonenumber ) // read only + _CONTACTS_PROPERTY_BOOL( has_email ) // read only + _CONTACTS_PROPERTY_INT( person_id ) // read only + _CONTACTS_PROPERTY_STR( uid ) // read, write + _CONTACTS_PROPERTY_STR( vibration ) // read, write + _CONTACTS_PROPERTY_INT( changed_time ) // read only +_CONTACTS_END_VIEW( _contacts_simple_contact ) + +// contact +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_STR( display_name ) // read only + _CONTACTS_PROPERTY_INT( display_source_type ) // read only + _CONTACTS_PROPERTY_INT( address_book_id ) // read, write once + _CONTACTS_PROPERTY_STR( ringtone_path ) // read, write + _CONTACTS_PROPERTY_STR( image_thumbnail_path ) // read, write + _CONTACTS_PROPERTY_BOOL( is_favorite ) // read only + _CONTACTS_PROPERTY_BOOL( has_phonenumber ) // read only + _CONTACTS_PROPERTY_BOOL( has_email ) // read only + _CONTACTS_PROPERTY_INT( person_id ) // read only + _CONTACTS_PROPERTY_STR( uid ) // read, write + _CONTACTS_PROPERTY_STR( vibration ) // read, write + _CONTACTS_PROPERTY_INT( changed_time ) // read only + _CONTACTS_PROPERTY_CHILD_SINGLE( name ) // read, write + _CONTACTS_PROPERTY_CHILD_SINGLE( image ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( company ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( note ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( number ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( email ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( event ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( messenger ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( address ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( url ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( nickname ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( profile ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( relationship ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( group_relation ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( extension ) // read, write +_CONTACTS_END_VIEW( _contacts_contact ) + +// my_profile +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_STR( display_name ) // read only + _CONTACTS_PROPERTY_INT( address_book_id ) // read, write once + _CONTACTS_PROPERTY_STR( image_thumbnail_path ) // read, write + _CONTACTS_PROPERTY_STR( uid ) // read, write + _CONTACTS_PROPERTY_INT( changed_time ) // read only + _CONTACTS_PROPERTY_CHILD_SINGLE( name ) // read, write + _CONTACTS_PROPERTY_CHILD_SINGLE( image ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( company ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( note ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( number ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( email ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( event ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( messenger ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( address ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( url ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( nickname ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( profile ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( relationship ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE( extension ) // read, write +_CONTACTS_END_VIEW( _contacts_my_profile ) + + +// contact_name +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( contact_id ) // read, write once + _CONTACTS_PROPERTY_STR( first ) // read, write + _CONTACTS_PROPERTY_STR( last ) // read, write + _CONTACTS_PROPERTY_STR( addition ) // read, write + _CONTACTS_PROPERTY_STR( suffix ) // read, write + _CONTACTS_PROPERTY_STR( prefix ) // read, write + _CONTACTS_PROPERTY_STR( phonetic_first ) // read, write + _CONTACTS_PROPERTY_STR( phonetic_middle ) // read, write + _CONTACTS_PROPERTY_STR( phonetic_last ) // read, write +_CONTACTS_END_VIEW( _contacts_name ) + +// contact_number +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( contact_id ) // read, write once + _CONTACTS_PROPERTY_INT( type ) // read, write + _CONTACTS_PROPERTY_STR( label ) // read, write + _CONTACTS_PROPERTY_BOOL( is_default ) // read, write + _CONTACTS_PROPERTY_STR( number ) // read, write +_CONTACTS_END_VIEW( _contacts_number ) + +// contact_email +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( contact_id ) // read, write once + _CONTACTS_PROPERTY_INT( type ) // read, write + _CONTACTS_PROPERTY_STR( label ) // read, write + _CONTACTS_PROPERTY_BOOL( is_default ) // read, write + _CONTACTS_PROPERTY_STR( email ) // read, write +_CONTACTS_END_VIEW( _contacts_email ) + +// contact_address +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( contact_id ) // read, write once + _CONTACTS_PROPERTY_INT( type ) // read, write + _CONTACTS_PROPERTY_STR( label ) // read, write + _CONTACTS_PROPERTY_STR( postbox ) // read, write + _CONTACTS_PROPERTY_STR( extended ) // read, write + _CONTACTS_PROPERTY_STR( street ) // read, write + _CONTACTS_PROPERTY_STR( locality ) // read, write + _CONTACTS_PROPERTY_STR( region ) // read, write + _CONTACTS_PROPERTY_STR( postal_code ) // read, write + _CONTACTS_PROPERTY_STR( country ) // read, write + _CONTACTS_PROPERTY_BOOL( is_default ) // read, write +_CONTACTS_END_VIEW( _contacts_address ) + +// contact_note +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( contact_id ) // read, write once + _CONTACTS_PROPERTY_STR( note ) // read, write +_CONTACTS_END_VIEW( _contacts_note ) + +// contact_url +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( contact_id ) // read, write once + _CONTACTS_PROPERTY_INT( type ) // read, write + _CONTACTS_PROPERTY_STR( label ) // read, write + _CONTACTS_PROPERTY_STR( url ) // read, write +_CONTACTS_END_VIEW( _contacts_url ) + +// contact_event +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( contact_id ) // read, write once + _CONTACTS_PROPERTY_INT( type ) // read, write + _CONTACTS_PROPERTY_STR( label ) // read, write + _CONTACTS_PROPERTY_INT( date ) // read, write + _CONTACTS_PROPERTY_INT( is_lunar ) // read, write + _CONTACTS_PROPERTY_INT( lunar_date ) // read, write +_CONTACTS_END_VIEW( _contacts_event ) + +// contact_grouprelation +// refer to the contacts_group_add_contact, contacts_group_remove_contact +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only, can not used as filter + _CONTACTS_PROPERTY_INT( group_id ) // read, write + _CONTACTS_PROPERTY_INT( contact_id ) // read, write once + _CONTACTS_PROPERTY_STR( name ) // read only +_CONTACTS_END_VIEW( _contacts_group_relation ) + +// contact_relationship +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( contact_id ) // read, write once + _CONTACTS_PROPERTY_INT( type ) // read, write + _CONTACTS_PROPERTY_STR( label ) // read, write + _CONTACTS_PROPERTY_STR( name ) // read, write +_CONTACTS_END_VIEW( _contacts_relationship ) + +// contact_image +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( contact_id ) // read, write once + _CONTACTS_PROPERTY_INT( type ) // read, write + _CONTACTS_PROPERTY_STR( label ) // read, write + _CONTACTS_PROPERTY_STR( path ) // read, write + _CONTACTS_PROPERTY_BOOL( is_default ) +_CONTACTS_END_VIEW( _contacts_image ) + +// contact_company +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( contact_id ) // read, write once + _CONTACTS_PROPERTY_INT( type ) // read, write + _CONTACTS_PROPERTY_STR( label ) // read, write + _CONTACTS_PROPERTY_STR( name ) // read, write + _CONTACTS_PROPERTY_STR( department ) // read, write + _CONTACTS_PROPERTY_STR( job_title ) // read, write + _CONTACTS_PROPERTY_STR( assistant_name ) // read, write + _CONTACTS_PROPERTY_STR( role ) // read, write + _CONTACTS_PROPERTY_STR( logo ) // read, write + _CONTACTS_PROPERTY_STR( location ) // read, write + _CONTACTS_PROPERTY_STR( description ) // read, write + _CONTACTS_PROPERTY_STR( phonetic_name ) // read, write +_CONTACTS_END_VIEW( _contacts_company ) + +// contact_nickname +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( contact_id ) // read, write once + _CONTACTS_PROPERTY_STR( name ) // read, write +_CONTACTS_END_VIEW( _contacts_nickname ) + +// contact_messenger +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( contact_id ) // read, write once + _CONTACTS_PROPERTY_INT( type ) // read, write + _CONTACTS_PROPERTY_STR( label ) // read, write + _CONTACTS_PROPERTY_STR( im_id ) // read, write +_CONTACTS_END_VIEW( _contacts_messenger ) + +// contact_extend +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( contact_id ) // read, write once + _CONTACTS_PROPERTY_INT( data1 ) // read, write + _CONTACTS_PROPERTY_STR( data2 ) // read, write + _CONTACTS_PROPERTY_STR( data3 ) // read, write + _CONTACTS_PROPERTY_STR( data4 ) // read, write + _CONTACTS_PROPERTY_STR( data5 ) // read, write + _CONTACTS_PROPERTY_STR( data6 ) // read, write + _CONTACTS_PROPERTY_STR( data7 ) // read, write + _CONTACTS_PROPERTY_STR( data8 ) // read, write + _CONTACTS_PROPERTY_STR( data9 ) // read, write + _CONTACTS_PROPERTY_STR( data10 ) // read, write + _CONTACTS_PROPERTY_STR( data11 ) // read, write + _CONTACTS_PROPERTY_STR( data12 ) // read, write +_CONTACTS_END_VIEW( _contacts_extension ) + +// contact_sdn +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_STR( name ) // read, write + _CONTACTS_PROPERTY_STR( number ) // read, write +_CONTACTS_END_VIEW( _contacts_sdn ) + +// contact_profile +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( type ) // read, write + _CONTACTS_PROPERTY_STR( label ) // read, write + _CONTACTS_PROPERTY_STR( uid ) // read, write + _CONTACTS_PROPERTY_STR( text ) // read, write + _CONTACTS_PROPERTY_INT( order ) // read, write + _CONTACTS_PROPERTY_STR( appsvc_operation ) // read, write + _CONTACTS_PROPERTY_STR( data1 ) // read, write + _CONTACTS_PROPERTY_STR( data2 ) // read, write + _CONTACTS_PROPERTY_STR( data3 ) // read, write + _CONTACTS_PROPERTY_STR( data4 ) // read, write + _CONTACTS_PROPERTY_INT( contact_id ) // read, write once +_CONTACTS_END_VIEW( _contacts_profile ) + +// activity photo +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( activity_id ) // read, write once + _CONTACTS_PROPERTY_STR( photo_url ) // read, write + _CONTACTS_PROPERTY_INT( sort_index ) // read, write +_CONTACTS_END_VIEW( _contacts_activity_photo ) + +// activity +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( contact_id ) // read, write once + _CONTACTS_PROPERTY_STR( source_name ) // read, write + _CONTACTS_PROPERTY_STR( status ) // read, write + _CONTACTS_PROPERTY_INT( timestamp ) // read, write + _CONTACTS_PROPERTY_STR( sync_data1 ) // read, write + _CONTACTS_PROPERTY_STR( sync_data2 ) // read, write + _CONTACTS_PROPERTY_STR( sync_data3 ) // read, write + _CONTACTS_PROPERTY_STR( sync_data4 ) // read, write + _CONTACTS_PROPERTY_CHILD_MULTIPLE(photo) // read, write +_CONTACTS_END_VIEW( _contacts_activity ) + +// speeddial +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( speeddial_number ) // read, write + _CONTACTS_PROPERTY_INT( number_id ) // read, write + _CONTACTS_PROPERTY_STR( number ) // read only + _CONTACTS_PROPERTY_STR( number_label ) // read only + _CONTACTS_PROPERTY_INT( number_type ) // read only + _CONTACTS_PROPERTY_INT( person_id ) // read only + _CONTACTS_PROPERTY_STR( display_name ) // read only + _CONTACTS_PROPERTY_STR( image_thumbnail_path ) // read only +_CONTACTS_END_VIEW( _contacts_speeddial ) + +// phone_log +_CONTACTS_BEGIN_VIEW() + _CONTACTS_PROPERTY_INT( id ) // read only + _CONTACTS_PROPERTY_INT( person_id ) // read, write once + _CONTACTS_PROPERTY_STR( address ) // read, write once, number or email + _CONTACTS_PROPERTY_INT( log_time ) // read, write once + _CONTACTS_PROPERTY_INT( log_type ) // read, write + _CONTACTS_PROPERTY_INT( extra_data1 ) // read, write once : message or email id, duration + _CONTACTS_PROPERTY_STR( extra_data2 ) // read, write once : shortmsg, subject +_CONTACTS_END_VIEW( _contacts_phone_log ) + +// contact_updated_info : read only +_CONTACTS_BEGIN_READ_ONLY_VIEW() + _CONTACTS_PROPERTY_INT( contact_id ) + _CONTACTS_PROPERTY_INT( address_book_id ) + _CONTACTS_PROPERTY_INT( type ) // insert/update/delete + _CONTACTS_PROPERTY_INT( version ) +_CONTACTS_END_READ_ONLY_VIEW( _contacts_contact_updated_info ) + +// group_updated_info : read only +_CONTACTS_BEGIN_READ_ONLY_VIEW() + _CONTACTS_PROPERTY_INT( group_id ) + _CONTACTS_PROPERTY_INT( address_book_id ) + _CONTACTS_PROPERTY_INT( type ) // insert/update/delete + _CONTACTS_PROPERTY_INT( version ) +_CONTACTS_END_READ_ONLY_VIEW( _contacts_group_updated_info ) + + +// group_updated_info : read only +_CONTACTS_BEGIN_READ_ONLY_VIEW() + _CONTACTS_PROPERTY_INT( group_id ) + _CONTACTS_PROPERTY_INT( address_book_id ) + _CONTACTS_PROPERTY_INT( version ) +_CONTACTS_END_READ_ONLY_VIEW( _contacts_group_member_updated_info ) + +// grouprel_updated_info : read only +_CONTACTS_BEGIN_READ_ONLY_VIEW() + _CONTACTS_PROPERTY_INT( group_id ) + _CONTACTS_PROPERTY_INT( contact_id ) + _CONTACTS_PROPERTY_INT( address_book_id ) + _CONTACTS_PROPERTY_INT( type ) // insert/delete + _CONTACTS_PROPERTY_INT( version ) +_CONTACTS_END_READ_ONLY_VIEW( _contacts_grouprel_updated_info ) + +// only for query (filter/projection) +// person_contact : read only +_CONTACTS_BEGIN_READ_ONLY_VIEW() + _CONTACTS_PROPERTY_INT( person_id ) + _CONTACTS_PROPERTY_STR( display_name ) + _CONTACTS_PROPERTY_PROJECTION_STR( display_name_index) + _CONTACTS_PROPERTY_PROJECTION_INT( display_contact_id ) + _CONTACTS_PROPERTY_PROJECTION_STR( ringtone_path ) + _CONTACTS_PROPERTY_PROJECTION_STR( image_thumbnail_path ) + _CONTACTS_PROPERTY_PROJECTION_STR( vibration ) + _CONTACTS_PROPERTY_PROJECTION_STR( status ) + _CONTACTS_PROPERTY_BOOL( is_favorite ) + _CONTACTS_PROPERTY_PROJECTION_INT( link_count ) + _CONTACTS_PROPERTY_PROJECTION_INT( account_id1 ) + _CONTACTS_PROPERTY_PROJECTION_INT( account_id2 ) + _CONTACTS_PROPERTY_PROJECTION_INT( account_id3 ) + _CONTACTS_PROPERTY_PROJECTION_STR( addressbook_ids ) + _CONTACTS_PROPERTY_BOOL( has_phonenumber ) + _CONTACTS_PROPERTY_BOOL( has_email ) + _CONTACTS_PROPERTY_INT( contact_id ) + _CONTACTS_PROPERTY_INT( address_book_id ) + _CONTACTS_PROPERTY_STR( address_book_name ) + _CONTACTS_PROPERTY_INT( address_book_mode ) +_CONTACTS_END_READ_ONLY_VIEW( _contacts_person_contact ) + +// person_number : read only +_CONTACTS_BEGIN_READ_ONLY_VIEW() + _CONTACTS_PROPERTY_INT( person_id ) + _CONTACTS_PROPERTY_STR( display_name ) + _CONTACTS_PROPERTY_PROJECTION_STR( display_name_index) + _CONTACTS_PROPERTY_PROJECTION_INT( display_contact_id ) + _CONTACTS_PROPERTY_PROJECTION_STR( ringtone_path ) + _CONTACTS_PROPERTY_PROJECTION_STR( image_thumbnail_path ) + _CONTACTS_PROPERTY_PROJECTION_STR( vibration ) + _CONTACTS_PROPERTY_BOOL( is_favorite ) + _CONTACTS_PROPERTY_BOOL( has_phonenumber ) + _CONTACTS_PROPERTY_BOOL( has_email ) + _CONTACTS_PROPERTY_INT( number_id ) + _CONTACTS_PROPERTY_PROJECTION_INT( type ) + _CONTACTS_PROPERTY_PROJECTION_STR( label ) + _CONTACTS_PROPERTY_BOOL( is_primary_default ) + _CONTACTS_PROPERTY_STR( number ) + _CONTACTS_PROPERTY_FILTER_STR( number_filter ) +_CONTACTS_END_READ_ONLY_VIEW( _contacts_person_number ) + +// person_email : read only +_CONTACTS_BEGIN_READ_ONLY_VIEW() + _CONTACTS_PROPERTY_INT( person_id ) + _CONTACTS_PROPERTY_STR( display_name ) + _CONTACTS_PROPERTY_PROJECTION_STR( display_name_index) + _CONTACTS_PROPERTY_PROJECTION_INT( display_contact_id ) + _CONTACTS_PROPERTY_PROJECTION_STR( ringtone_path ) + _CONTACTS_PROPERTY_PROJECTION_STR( image_thumbnail_path ) + _CONTACTS_PROPERTY_PROJECTION_STR( vibration ) + _CONTACTS_PROPERTY_BOOL( is_favorite ) + _CONTACTS_PROPERTY_BOOL( has_phonenumber ) + _CONTACTS_PROPERTY_BOOL( has_email ) + _CONTACTS_PROPERTY_INT( email_id ) + _CONTACTS_PROPERTY_PROJECTION_INT( type ) + _CONTACTS_PROPERTY_PROJECTION_STR( label ) + _CONTACTS_PROPERTY_BOOL( is_primary_default ) + _CONTACTS_PROPERTY_STR( email ) +_CONTACTS_END_READ_ONLY_VIEW( _contacts_person_email ) + +// person_group : read only +_CONTACTS_BEGIN_READ_ONLY_VIEW() + _CONTACTS_PROPERTY_INT( person_id ) + _CONTACTS_PROPERTY_STR( display_name ) + _CONTACTS_PROPERTY_PROJECTION_STR( display_name_index) + _CONTACTS_PROPERTY_PROJECTION_INT( display_contact_id ) + _CONTACTS_PROPERTY_PROJECTION_STR( ringtone_path ) + _CONTACTS_PROPERTY_PROJECTION_STR( image_thumbnail_path ) + _CONTACTS_PROPERTY_PROJECTION_STR( vibration ) + _CONTACTS_PROPERTY_PROJECTION_STR( status ) + _CONTACTS_PROPERTY_BOOL( is_favorite ) + _CONTACTS_PROPERTY_PROJECTION_INT( link_count ) + _CONTACTS_PROPERTY_PROJECTION_INT( account_id1 ) + _CONTACTS_PROPERTY_PROJECTION_INT( account_id2 ) + _CONTACTS_PROPERTY_PROJECTION_INT( account_id3 ) + _CONTACTS_PROPERTY_PROJECTION_STR( addressbook_ids ) + _CONTACTS_PROPERTY_BOOL( has_phonenumber ) + _CONTACTS_PROPERTY_BOOL( has_email ) + _CONTACTS_PROPERTY_INT( address_book_id ) + _CONTACTS_PROPERTY_INT( group_id ) + _CONTACTS_PROPERTY_STR( address_book_name ) + _CONTACTS_PROPERTY_INT( address_book_mode ) + _CONTACTS_PROPERTY_PROJECTION_INT( contact_id ) +_CONTACTS_END_READ_ONLY_VIEW( _contacts_person_grouprel ) + +//person phone_log : read only +_CONTACTS_BEGIN_READ_ONLY_VIEW() + _CONTACTS_PROPERTY_INT( person_id ) + _CONTACTS_PROPERTY_STR( display_name ) + _CONTACTS_PROPERTY_PROJECTION_STR( image_thumbnail_path ) + _CONTACTS_PROPERTY_INT( log_id ) + _CONTACTS_PROPERTY_STR( address ) + _CONTACTS_PROPERTY_PROJECTION_INT( address_type ) + _CONTACTS_PROPERTY_INT( log_time ) + _CONTACTS_PROPERTY_INT( log_type ) + _CONTACTS_PROPERTY_PROJECTION_INT( extra_data1 ) + _CONTACTS_PROPERTY_PROJECTION_STR( extra_data2 ) +_CONTACTS_END_READ_ONLY_VIEW( _contacts_person_phone_log ) + +// person, stat : read only +_CONTACTS_BEGIN_READ_ONLY_VIEW() + _CONTACTS_PROPERTY_INT( person_id ) + _CONTACTS_PROPERTY_STR( display_name ) + _CONTACTS_PROPERTY_PROJECTION_STR( display_name_index) + _CONTACTS_PROPERTY_PROJECTION_INT( display_contact_id ) + _CONTACTS_PROPERTY_PROJECTION_STR( ringtone_path ) + _CONTACTS_PROPERTY_PROJECTION_STR( image_thumbnail_path ) + _CONTACTS_PROPERTY_PROJECTION_STR( vibration ) + _CONTACTS_PROPERTY_BOOL( is_favorite ) + _CONTACTS_PROPERTY_BOOL( has_phonenumber ) + _CONTACTS_PROPERTY_BOOL( has_email ) + _CONTACTS_PROPERTY_INT( usage_type ) + _CONTACTS_PROPERTY_INT( times_used ) +_CONTACTS_END_READ_ONLY_VIEW( _contacts_person_usage ) + +// simple contact number : read only +_CONTACTS_BEGIN_READ_ONLY_VIEW() + _CONTACTS_PROPERTY_INT( contact_id ) + _CONTACTS_PROPERTY_STR( display_name ) + _CONTACTS_PROPERTY_PROJECTION_INT( display_source_type) + _CONTACTS_PROPERTY_INT( address_book_id ) + _CONTACTS_PROPERTY_INT( person_id ) + _CONTACTS_PROPERTY_PROJECTION_STR( ringtone_path ) + _CONTACTS_PROPERTY_PROJECTION_STR( image_thumbnail_path ) + _CONTACTS_PROPERTY_INT( number_id ) + _CONTACTS_PROPERTY_PROJECTION_INT( type ) + _CONTACTS_PROPERTY_PROJECTION_STR( label ) + _CONTACTS_PROPERTY_BOOL( is_default ) + _CONTACTS_PROPERTY_STR( number ) + _CONTACTS_PROPERTY_FILTER_STR( number_filter ) +_CONTACTS_END_READ_ONLY_VIEW( _contacts_contact_number ) + +// simple contact email : read only +_CONTACTS_BEGIN_READ_ONLY_VIEW() + _CONTACTS_PROPERTY_INT( contact_id ) + _CONTACTS_PROPERTY_STR( display_name ) + _CONTACTS_PROPERTY_PROJECTION_INT( display_source_type) + _CONTACTS_PROPERTY_INT( address_book_id ) + _CONTACTS_PROPERTY_INT( person_id ) + _CONTACTS_PROPERTY_PROJECTION_STR( ringtone_path ) + _CONTACTS_PROPERTY_PROJECTION_STR( image_thumbnail_path ) + _CONTACTS_PROPERTY_INT( email_id ) + _CONTACTS_PROPERTY_PROJECTION_INT( type ) + _CONTACTS_PROPERTY_PROJECTION_STR( label ) + _CONTACTS_PROPERTY_BOOL( is_default ) + _CONTACTS_PROPERTY_STR( email ) +_CONTACTS_END_READ_ONLY_VIEW( _contacts_contact_email ) + +// simple contact group : read only +_CONTACTS_BEGIN_READ_ONLY_VIEW() + _CONTACTS_PROPERTY_INT( contact_id ) + _CONTACTS_PROPERTY_STR( display_name ) + _CONTACTS_PROPERTY_PROJECTION_INT( display_source_type) + _CONTACTS_PROPERTY_INT( address_book_id ) + _CONTACTS_PROPERTY_INT( person_id ) + _CONTACTS_PROPERTY_PROJECTION_STR( ringtone_path ) + _CONTACTS_PROPERTY_PROJECTION_STR( image_thumbnail_path ) + _CONTACTS_PROPERTY_INT( group_id ) + _CONTACTS_PROPERTY_PROJECTION_STR( group_name ) +_CONTACTS_END_READ_ONLY_VIEW( _contacts_contact_grouprel ) + +// simple contact activity : read only +_CONTACTS_BEGIN_READ_ONLY_VIEW() + _CONTACTS_PROPERTY_INT( contact_id ) + _CONTACTS_PROPERTY_STR( display_name ) + _CONTACTS_PROPERTY_PROJECTION_INT( display_source_type) + _CONTACTS_PROPERTY_INT( address_book_id ) + _CONTACTS_PROPERTY_INT( account_id ) + _CONTACTS_PROPERTY_INT( person_id ) + _CONTACTS_PROPERTY_PROJECTION_STR( ringtone_path ) + _CONTACTS_PROPERTY_PROJECTION_STR( image_thumbnail_path ) + _CONTACTS_PROPERTY_INT( activity_id ) + _CONTACTS_PROPERTY_STR( source_name ) + _CONTACTS_PROPERTY_PROJECTION_STR( status ) + _CONTACTS_PROPERTY_INT( timestamp ) + _CONTACTS_PROPERTY_PROJECTION_STR( sync_data1 ) + _CONTACTS_PROPERTY_PROJECTION_STR( sync_data2 ) + _CONTACTS_PROPERTY_PROJECTION_STR( sync_data3 ) + _CONTACTS_PROPERTY_PROJECTION_STR( sync_data4 ) +_CONTACTS_END_READ_ONLY_VIEW( _contacts_contact_activity ) + +// phone_log number list : read only +_CONTACTS_BEGIN_READ_ONLY_VIEW() + _CONTACTS_PROPERTY_STR( number ) +_CONTACTS_END_READ_ONLY_VIEW( _contacts_phone_log_number ) + +// phone_log stat : read only +_CONTACTS_BEGIN_READ_ONLY_VIEW() + _CONTACTS_PROPERTY_PROJECTION_STR( log_count ) + _CONTACTS_PROPERTY_STR( log_type ) +_CONTACTS_END_READ_ONLY_VIEW( _contacts_phone_log_stat ) + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_SOCIAL_CONTACTS_VIEWS_H__ */ + diff --git a/native/CMakeLists.txt b/native/CMakeLists.txt new file mode 100755 index 0000000..8636905 --- /dev/null +++ b/native/CMakeLists.txt @@ -0,0 +1,28 @@ +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/common) + +SET(NATIVE contacts-service3) + +FILE(GLOB SRCS *.c ../common/*.c) + +INCLUDE(FindPkgConfig) +pkg_check_modules(service_pkgs REQUIRED sqlite3 db-util capi-media-image-util badge) + +FOREACH(flag ${service_pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") + +ADD_DEFINITIONS("-D_CONTACTS_NATIVE") + +ADD_LIBRARY(${NATIVE} SHARED ${SRCS}) +SET_TARGET_PROPERTIES(${NATIVE} PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES(${NATIVE} PROPERTIES VERSION ${VERSION}) +TARGET_LINK_LIBRARIES(${NATIVE} ${pkgs_LDFLAGS} ${service_pkgs_LDFLAGS} -lpthread) + +INSTALL(TARGETS ${NATIVE} DESTINATION lib) + +# Make pc file and install +CONFIGURE_FILE(${NATIVE}.pc.in ${NATIVE}.pc @ONLY) +INSTALL(FILES ${NATIVE}.pc DESTINATION lib/pkgconfig) diff --git a/native/contacts-service3.pc.in b/native/contacts-service3.pc.in new file mode 100644 index 0000000..3948eac --- /dev/null +++ b/native/contacts-service3.pc.in @@ -0,0 +1,13 @@ +# Package Information for pkg-config + +prefix=@PREFIX@ +exec_prefix=@EXEC_PREFIX@ +libdir=@LIBDIR@ +includedir=@INCLUDEDIR@ + +Name: @TARGET@ +Description: @PROJECT_NAME@ library +Version: @VERSION@ +Requires: glib-2.0 @PC_REQUIRED@ +Libs: -L${libdir} -l@NATIVE@ +Cflags: -I${includedir} diff --git a/native/ctsvc_activity.c b/native/ctsvc_activity.c new file mode 100644 index 0000000..5b59a50 --- /dev/null +++ b/native/ctsvc_activity.c @@ -0,0 +1,88 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_notification.h" + +API int contacts_activity_delete_by_contact_id(int contact_id) +{ + char query[CTS_SQL_MAX_LEN] = {0}; + + RETV_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER); + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_ACTIVITIES" WHERE contact_id = %d", contact_id); + + int ret = ctsvc_begin_trans(); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_set_activity_noti(); + +/* why notify twice? + ctsvc_set_contact_noti(); + ctsvc_db_contact_update_changed_time(contact_id); +*/ + + ret = ctsvc_end_trans(true); + return ret; +} + +API int contacts_activity_delete_by_account_id(int account_id) +{ + char query[CTS_SQL_MAX_LEN] = {0}; + + RETV_IF(account_id < 0, CONTACTS_ERROR_INVALID_PARAMETER); + + snprintf(query, sizeof(query), "DELETE FROM %s WHERE contact_id IN " + "(SELECT C.contact_id FROM %s C, %s A ON C.addressbook_id = A.addressbook_id " + "WHERE A.account_id = %d)", + CTS_TABLE_ACTIVITIES, CTS_TABLE_CONTACTS, CTS_TABLE_ADDRESSBOOKS, account_id); + + int ret = ctsvc_begin_trans(); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_set_activity_noti(); +/* + ctsvc_set_contact_noti(); + ctsvc_db_contact_update_changed_time(contact_id); +*/ + + ret = ctsvc_end_trans(true); + return ret; +} + + diff --git a/helper/sim.h b/native/ctsvc_activity.h old mode 100755 new mode 100644 similarity index 72% rename from helper/sim.h rename to native/ctsvc_activity.h index 8b3c769..f95dc52 --- a/helper/sim.h +++ b/native/ctsvc_activity.h @@ -1,29 +1,24 @@ -/* - * Contacts Service Helper - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_HELPER_SIM_H__ -#define __CTS_HELPER_SIM_H__ - -int helper_sim_read_pb_record(void* data); -int helper_sim_read_SDN(void* data); - - -#endif // __CTS_HELPER_SIM_H__ - +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_ACTIVITY_H__ +#define __TIZEN_SOCIAL_CTSVC_ACTIVITY_H__ + +#endif // __TIZEN_SOCIAL_CTSVC_PERSON_H__ + diff --git a/native/ctsvc_db_init.c b/native/ctsvc_db_init.c new file mode 100644 index 0000000..1d0441c --- /dev/null +++ b/native/ctsvc_db_init.c @@ -0,0 +1,896 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_db_init.h" +#include "ctsvc_utils.h" +#include "ctsvc_restriction.h" +#include "ctsvc_view.h" +#include "ctsvc_notification.h" + +#define MODULE_NAME_DB "DB" + +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_addressbook; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_contact; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_my_profile; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_simple_contact; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_group; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_person; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_phonelog; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_speeddial; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_sdn; + +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_activity; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_address; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_company; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_email; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_event; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_grouprelation; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_relationship; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_image; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_messenger; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_name; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_nickname; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_note; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_number; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_url; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_extension; +extern ctsvc_db_plugin_info_s ctsvc_db_plugin_profile; + + +static GHashTable *__ctsvc_db_view_hash_table = NULL; + +#ifdef _CONTACTS_IPC_SERVER +static bool __ctsvc_db_view_already_created = false; +#endif + +typedef struct { + char *view_uri; + const char * const table_name; +}db_table_info_s; + +static const db_table_info_s __db_tables[] = { + {CTSVC_VIEW_URI_ADDRESSBOOK, CTS_TABLE_ADDRESSBOOKS}, + {CTSVC_VIEW_URI_GROUP, CTS_TABLE_GROUPS}, + {CTSVC_VIEW_URI_PERSON, CTSVC_DB_VIEW_PERSON}, + {CTSVC_VIEW_URI_SIMPLE_CONTACT, CTSVC_DB_VIEW_CONTACT}, + {CTSVC_VIEW_URI_CONTACT, CTSVC_DB_VIEW_CONTACT}, + {CTSVC_VIEW_URI_MY_PROFILE, CTS_TABLE_MY_PROFILES}, + {CTSVC_VIEW_URI_ACTIVITY, CTSVC_DB_VIEW_ACTIVITY}, + {CTSVC_VIEW_URI_PHONELOG, CTS_TABLE_PHONELOGS}, + {CTSVC_VIEW_URI_SPEEDDIAL, CTSVC_DB_VIEW_SPEEDIDAL}, + {CTSVC_VIEW_URI_SDN, CTS_TABLE_SDN}, + + {CTSVC_VIEW_URI_NAME, CTSVC_DB_VIEW_NAME}, + {CTSVC_VIEW_URI_COMPANY, CTSVC_DB_VIEW_COMPANY}, + {CTSVC_VIEW_URI_NUMBER, CTSVC_DB_VIEW_NUMBER}, + {CTSVC_VIEW_URI_EMAIL, CTSVC_DB_VIEW_EMAIL}, + {CTSVC_VIEW_URI_URL, CTSVC_DB_VIEW_URL}, + {CTSVC_VIEW_URI_ADDRESS, CTSVC_DB_VIEW_ADDRESS}, + {CTSVC_VIEW_URI_PROFILE, CTSVC_DB_VIEW_PROFILE}, + {CTSVC_VIEW_URI_RELATIONSHIP, CTSVC_DB_VIEW_RELATIONSHIP}, + {CTSVC_VIEW_URI_IMAGE, CTSVC_DB_VIEW_IMAGE}, + {CTSVC_VIEW_URI_NOTE, CTSVC_DB_VIEW_NOTE}, + {CTSVC_VIEW_URI_NICKNAME, CTSVC_DB_VIEW_NICKNAME}, + {CTSVC_VIEW_URI_EVENT, CTSVC_DB_VIEW_EVENT}, + {CTSVC_VIEW_URI_MESSENGER, CTSVC_DB_VIEW_MESSENGER}, + {CTSVC_VIEW_URI_GROUP_RELATION, CTSVC_DB_VIEW_GROUP_RELATION}, + {CTSVC_VIEW_URI_EXTENSION, CTSVC_DB_VIEW_EXTENSION}, + +// Do not support get_all_records, get_records_with_query, get_count, get_count_with_query +// {CTSVC_VIEW_URI_GROUPS_UPDATED_INFO, CTSVC_DB_VIEW_GROUPS_UPDATED_INFO}, +// {CTSVC_VIEW_URI_GROUPS_MEMBER_UPDATED_INFO, CTSVC_DB_VIEW_GROUPS_MEMBER_UPDATED_INFO}, +// {CTSVC_VIEW_URI_CONTACTS_UPDATED_INFO, CTSVC_DB_VIEW_CONTACTS_UPDATED_INFO}, +// {CTSVC_VIEW_URI_GROUPRELS_UPDATED_INFO, NULL, NULL}, + + {CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT, CTSVC_DB_VIEW_PERSON_CONTACT}, + {CTSVC_VIEW_URI_READ_ONLY_PERSON_NUMBER, CTSVC_DB_VIEW_PERSON_NUMBER}, + {CTSVC_VIEW_URI_READ_ONLY_PERSON_EMAIL, CTSVC_DB_VIEW_PERSON_EMAIL}, + {CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP, CTSVC_DB_VIEW_PERSON_GROUP}, + {CTSVC_VIEW_URI_READ_ONLY_PERSON_PHONELOG, CTSVC_DB_VIEW_PERSON_PHONELOG}, + {CTSVC_VIEW_URI_READ_ONLY_PERSON_USAGE, CTSVC_DB_VIEW_PERSON_USAGE}, + + {CTSVC_VIEW_URI_READ_ONLY_CONTACT_NUMBER, CTSVC_DB_VIEW_CONTACT_NUMBER}, + {CTSVC_VIEW_URI_READ_ONLY_CONTACT_EMAIL, CTSVC_DB_VIEW_CONTACT_EMAIL}, + {CTSVC_VIEW_URI_READ_ONLY_CONTACT_GROUP, CTSVC_DB_VIEW_CONTACT_GROUP}, + {CTSVC_VIEW_URI_READ_ONLY_CONTACT_ACTIVITY, CTSVC_DB_VIEW_CONTACT_ACTIVITY}, + + {CTSVC_VIEW_URI_READ_ONLY_PHONELOG_NUMBER, CTSVC_DB_VIEW_PHONELOG_NUMBER}, + {CTSVC_VIEW_URI_READ_ONLY_PHONELOG_STAT, CTS_TABLE_PHONELOG_STAT}, +}; + +// this function is called in mutex lock +int ctsvc_db_plugin_init() +{ + int i; +// pims_ipc_svc_init("/opt/CONTACT_SVC", getuid(), 0660); + + if (__ctsvc_db_view_hash_table) { + return CONTACTS_ERROR_NONE; + } + + __ctsvc_db_view_hash_table = g_hash_table_new(g_str_hash, g_str_equal); + + if (__ctsvc_db_view_hash_table) { + i = 0; + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_ADDRESSBOOK, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_GROUP, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_PERSON, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_SIMPLE_CONTACT, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_CONTACT, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_MY_PROFILE, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_ACTIVITY, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_PHONELOG, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_SPEEDDIAL, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_SDN, GINT_TO_POINTER(&(__db_tables[i++]))); + + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_NAME, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_COMPANY, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_NUMBER, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_EMAIL, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_URL, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_ADDRESS, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_PROFILE, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_RELATIONSHIP, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_IMAGE, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_NOTE, GINT_TO_POINTER(&(__db_tables[i++])) ); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_NICKNAME, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_EVENT, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_MESSENGER, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_GROUP_RELATION, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_EXTENSION, GINT_TO_POINTER(&(__db_tables[i++]))); + +// g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_GROUPS_UPDATED_INFO, GINT_TO_POINTER(&(__db_tables[i++])) ); +// g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_GROUPS_MEMBER_UPDATED_INFO, GINT_TO_POINTER(&(__db_tables[i++])) ); +// g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_CONTACTS_UPDATED_INFO, GINT_TO_POINTER(&(__db_tables[i++])) ); +// g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_GROUPRELS_UPDATED_INFO, GINT_TO_POINTER(&(__db_tables[i++])) ); + + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_PERSON_NUMBER, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_PERSON_EMAIL, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_PERSON_PHONELOG, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_PERSON_USAGE, GINT_TO_POINTER(&(__db_tables[i++]))); + + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_CONTACT_NUMBER, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_CONTACT_EMAIL, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_CONTACT_GROUP, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_CONTACT_ACTIVITY, GINT_TO_POINTER(&(__db_tables[i++]))); + + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_PHONELOG_NUMBER, GINT_TO_POINTER(&(__db_tables[i++]))); + g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_PHONELOG_STAT, GINT_TO_POINTER(&(__db_tables[i++]))); + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_plugin_deinit() +{ + if (!__ctsvc_db_view_hash_table) { + return CONTACTS_ERROR_NONE; + } + g_hash_table_destroy(__ctsvc_db_view_hash_table); + __ctsvc_db_view_hash_table = NULL; + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_get_table_name(const char *view_uri, const char **out_table) +{ + db_table_info_s* db_view_info = NULL; + + if(__ctsvc_db_view_hash_table){ + db_view_info = g_hash_table_lookup(__ctsvc_db_view_hash_table, view_uri); + if (db_view_info) { + *out_table = db_view_info->table_name; + return CONTACTS_ERROR_NONE; + } + } + else + CTS_ERR("Please check contact_connect2()"); + + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +ctsvc_db_plugin_info_s* ctsvc_db_get_plugin_info(ctsvc_record_type_e type) +{ + switch((int)type) { + case CTSVC_RECORD_ADDRESSBOOK: + return &ctsvc_db_plugin_addressbook; + case CTSVC_RECORD_GROUP: + return &ctsvc_db_plugin_group; + case CTSVC_RECORD_PERSON: + return &ctsvc_db_plugin_person; + case CTSVC_RECORD_CONTACT: + return &ctsvc_db_plugin_contact; + case CTSVC_RECORD_SIMPLE_CONTACT: + return &ctsvc_db_plugin_simple_contact; + case CTSVC_RECORD_NAME: + return &ctsvc_db_plugin_name; + case CTSVC_RECORD_COMPANY: + return &ctsvc_db_plugin_company; + case CTSVC_RECORD_NOTE: + return &ctsvc_db_plugin_note; + case CTSVC_RECORD_NUMBER: + return &ctsvc_db_plugin_number; + case CTSVC_RECORD_EMAIL: + return &ctsvc_db_plugin_email; + case CTSVC_RECORD_URL: + return &ctsvc_db_plugin_url; + case CTSVC_RECORD_EVENT: + return &ctsvc_db_plugin_event; + case CTSVC_RECORD_NICKNAME: + return &ctsvc_db_plugin_nickname; + case CTSVC_RECORD_ADDRESS: + return &ctsvc_db_plugin_address; + case CTSVC_RECORD_MESSENGER: + return &ctsvc_db_plugin_messenger; + case CTSVC_RECORD_GROUP_RELATION: + return &ctsvc_db_plugin_grouprelation; + case CTSVC_RECORD_ACTIVITY: + return &ctsvc_db_plugin_activity; + case CTSVC_RECORD_PROFILE: + return &ctsvc_db_plugin_profile; + case CTSVC_RECORD_RELATIONSHIP: + return &ctsvc_db_plugin_relationship; + case CTSVC_RECORD_IMAGE: + return &ctsvc_db_plugin_image; + case CTSVC_RECORD_EXTENSION: + return &ctsvc_db_plugin_extension; + case CTSVC_RECORD_PHONELOG: + return &ctsvc_db_plugin_phonelog; + case CTSVC_RECORD_SPEEDDIAL: + return &ctsvc_db_plugin_speeddial; + case CTSVC_RECORD_SDN: + return &ctsvc_db_plugin_sdn; + case CTSVC_RECORD_UPDATED_INFO: + case CTSVC_RECORD_RESULT: + default: + return NULL; + } +} + +#ifdef _CONTACTS_IPC_SERVER +static int __ctsvc_db_create_views() +{ + int ret; + char query[CTS_SQL_MAX_LEN] = {0}; + + if( __ctsvc_db_view_already_created ) + return CONTACTS_ERROR_NONE; + + // CTSVC_DB_VIEW_CONTACT + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACT" AS " + "SELECT * FROM "CTS_TABLE_CONTACTS" WHERE deleted = 0"); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_PERSON + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON" AS " + "SELECT persons.person_id, " + "display_name, reverse_display_name, " + "display_name_language, " + "sortkey, reverse_sortkey, " + "name_contact_id, " + "persons.ringtone_path, " + "persons.image_thumbnail_path, " + "persons.vibration, " + "status, " + "link_count, " + "account_id1, " + "account_id2, " + "account_id3, " + "addressbook_ids, " + "persons.has_phonenumber, " + "persons.has_email, " + "EXISTS(SELECT person_id FROM "CTS_TABLE_FAVORITES" WHERE person_id=persons.person_id) is_favorite, " + "(SELECT favorite_prio FROM "CTS_TABLE_FAVORITES" WHERE person_id=persons.person_id) favorite_prio " + "FROM "CTS_TABLE_CONTACTS", "CTS_TABLE_PERSONS" " + "ON (name_contact_id = contacts.contact_id) "); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_NAME + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_NAME" AS " + "SELECT id, " + "data.contact_id, " + "data2 first, " + "data3 last, " + "data4 addition, " + "data5 prefix, " + "data6 suffix, " + "data7 phonetic_first, " + "data8 phonetic_middle, " + "data9 phonetic_last " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile = 0 ", + CTSVC_DATA_NAME); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_NUMBER + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_NUMBER" AS " + "SELECT id, " + "data.contact_id, " + "is_default, " + "data1 type, " + "data2 label, " + "data3 number, " + "data4 lookup " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile = 0 ", + CTSVC_DATA_NUMBER); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_EMAIL + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_EMAIL" AS " + "SELECT id, " + "data.contact_id, " + "is_default, " + "data1 type, " + "data2 label, " + "data3 email " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile = 0 ", + CTSVC_DATA_EMAIL); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_ADDRESS + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_ADDRESS" AS " + "SELECT id, " + "data.contact_id, " + "is_default, " + "data1 type, " + "data2 label, " + "data3 postbox, " + "data4 postal_code, " + "data5 region, " + "data6 locality, " + "data7 street, " + "data8 extend, " + "data9 country " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile = 0 ", + CTSVC_DATA_POSTAL); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_URL + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_URL" AS " + "SELECT id, " + "data.contact_id, " + "data1 type, " + "data2 label, " + "data3 url " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile = 0 ", + CTSVC_DATA_URL); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_EVENT + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_EVENT" AS " + "SELECT id, " + "data.contact_id, " + "data1 type, " + "data2 label, " + "data3 date " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile = 0 ", + CTSVC_DATA_EVENT); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_GROUP_RELATION + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_GROUP_RELATION" AS " + "SELECT "CTS_TABLE_GROUP_RELATIONS".group_id, " + "contact_id, " + "group_name " + "FROM "CTS_TABLE_GROUP_RELATIONS", "CTS_TABLE_GROUPS" " + "ON "CTS_TABLE_GROUP_RELATIONS".group_id = "CTS_TABLE_GROUPS".group_id AND deleted = 0 " + "ORDER BY group_name COLLATE NOCASE"); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_RELATIONSHIP + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_RELATIONSHIP" AS " + "SELECT id, " + "data.contact_id, " + "data1 type, " + "data2 label, " + "data3 name " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile = 0 ", + CTSVC_DATA_RELATIONSHIP); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_IMAGE + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_IMAGE" AS " + "SELECT id, " + "is_default, " + "data.contact_id, " + "data1 type, " + "data2 label, " + "data3 path " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile = 0 ", + CTSVC_DATA_IMAGE); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_COMPANY + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_COMPANY" AS " + "SELECT id, " + "data.contact_id, " + "data1 type, " + "data2 label, " + "data3 name, " + "data4 department, " + "data5 job_title, " + "data6 assistant, " + "data7 role, " + "data8 logo, " + "data9 location, " + "data10 description, " + "data11 phonetic_name " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile = 0 ", + CTSVC_DATA_COMPANY); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_NICKNAME + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_NICKNAME" AS " + "SELECT id, " + "data.contact_id, " + "data3 nickname " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile = 0 ", + CTSVC_DATA_NICKNAME); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_MESSENGER + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_MESSENGER" AS " + "SELECT id, " + "data.contact_id, " + "data1 type, " + "data2 label, " + "data3 im_id " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile = 0 ", + CTSVC_DATA_MESSENGER); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_NOTE + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_NOTE" AS " + "SELECT id, " + "data.contact_id, " + "data3 note " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile = 0 ", + CTSVC_DATA_NOTE); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_PROFILE + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PROFILE" AS " + "SELECT id, " + "data.contact_id, " + "data1 type, " + "data2 label, " + "data3 uid, " + "data4 text, " + "data5 profile_order, " + "data6 appsvc_op, " + "data7 data1, " + "data8 data2, " + "data9 data3, " + "data10 data4 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile = 0 ", + CTSVC_DATA_PROFILE); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_EXTENSION + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_EXTENSION" AS " + "SELECT id, " + "data.contact_id, " + "data1, " + "data2, " + "data3, " + "data4, " + "data5, " + "data6, " + "data7, " + "data8, " + "data9, " + "data10, " + "data11, " + "data12 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile = 0 ", + CTSVC_DATA_EXTENSION); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_ACTIVITY + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_ACTIVITY" AS " + "SELECT id, " + "activities.contact_id, " + "source_name, " + "status, " + "timestamp, " + "sync_data1, " + "sync_data2, " + "sync_data3, " + "sync_data4 " + "FROM "CTS_TABLE_ACTIVITIES", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_ACTIVITIES".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "ORDER BY timestamp DESC"); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_SPEEDIDAL + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_SPEEDIDAL" AS " + "SELECT persons.person_id, " + "name_contacts.display_name, name_contacts.reverse_display_name, " + "name_contacts.display_name_language, " + "name_contacts.sortkey, name_contacts.reverse_sortkey, " + "persons.image_thumbnail_path, " + "data.id number_id, " + "data.data1 type, " + "data.data2 label, " + "data.data3 number, " + "speeddials.speed_number " + "FROM "CTS_TABLE_PERSONS", "CTS_TABLE_CONTACTS" AS name_contacts, " + CTSVC_DB_VIEW_CONTACT" AS temp_contacts, " + CTS_TABLE_DATA", "CTS_TABLE_SPEEDDIALS" " + "ON (persons.name_contact_id = name_contacts.contact_id " + "AND persons.person_id = temp_contacts.person_id " + "AND temp_contacts.contact_id = data.contact_id " + "AND data.id = speeddials.number_id) " + "ORDER BY speeddials.speed_number"); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); +#if 0 + // CTSVC_DB_VIEW_CONTACTS_UPDATED_INFO + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACTS_UPDATED_INFO" AS " + "SELECT %d, contact_id, changed_ver version, addressbook_id " + "FROM "CTS_TABLE_CONTACTS" " + "WHERE changed_ver == created_ver " + "UNION SELECT %d, contact_id, changed_ver version, addressbook_id " + "FROM "CTS_TABLE_CONTACTS" " + "WHERE changed_ver > created_ver " + "UNION SELECT %d, contact_id, deleted_ver version, addressbook_id " + "FROM "CTS_TABLE_DELETEDS, + CONTACTS_CHANGE_INSERTED, CONTACTS_CHANGE_UPDATED, CONTACTS_CHANGE_DELETED); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_GROUPS_UPDATED_INFO + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_GROUPS_UPDATED_INFO" AS " + "SELECT %d, group_id, changed_ver version, addressbook_id " + "FROM "CTS_TABLE_GROUPS" " + "WHERE changed_ver == created_ver " + "UNION SELECT %d, group_id, changed_ver version, addressbook_id " + "FROM "CTS_TABLE_GROUPS" " + "WHERE changed_ver > created_ver " + "UNION SELECT %d, group_id, deleted_ver version, addressbook_id " + "FROM "CTS_TABLE_GROUP_DELETEDS, + CONTACTS_CHANGE_INSERTED, CONTACTS_CHANGE_UPDATED, CONTACTS_CHANGE_DELETED); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); +#endif + + // CTSVC_DB_VIEW_GROUPS_MEMBER_UPDATED_INFO + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_GROUPS_MEMBER_UPDATED_INFO" AS " + "SELECT group_id, member_changed_ver version, addressbook_id " + "FROM "CTS_TABLE_GROUPS); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_PERSON_CONTACT + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_CONTACT" AS " + "SELECT * FROM "CTSVC_DB_VIEW_PERSON" " + "JOIN (SELECT contact_id, " + "addressbook_id, " + "person_id person_id_in_contact " + "FROM "CTSVC_DB_VIEW_CONTACT") temp_contacts " + "JOIN (SELECT addressbook_id addressbook_id_in_addressbooks, addressbook_name, mode addressbook_mode " + "FROM "CTS_TABLE_ADDRESSBOOKS") temp_addressbooks " + "ON temp_contacts.person_id_in_contact = "CTSVC_DB_VIEW_PERSON".person_id " + "AND addressbook_id = temp_addressbooks.addressbook_id_in_addressbooks"); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_PERSON_NUMBER + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_NUMBER" AS " + "SELECT * FROM "CTSVC_DB_VIEW_PERSON_CONTACT" " + "JOIN (SELECT id number_id, " + "contact_id, " + "data1 type, " + "is_primary_default, " + "data2 label, " + "data3 number, " + "data4 normalized_number " + "FROM "CTS_TABLE_DATA" WHERE datatype = %d AND is_my_profile = 0) temp_data " + "ON temp_data.contact_id = "CTSVC_DB_VIEW_PERSON_CONTACT".contact_id", + CTSVC_DATA_NUMBER); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_PERSON_EMAIL + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_EMAIL" AS " + "SELECT * FROM "CTSVC_DB_VIEW_PERSON_CONTACT" " + "JOIN (SELECT id email_id, " + "contact_id, " + "data1 type, " + "is_primary_default, " + "data2 label, " + "data3 email " + "FROM "CTS_TABLE_DATA" WHERE datatype = %d AND is_my_profile = 0) temp_data " + "ON temp_data.contact_id = "CTSVC_DB_VIEW_PERSON_CONTACT".contact_id", + CTSVC_DATA_EMAIL); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_PERSON_PHONELOG + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_PHONELOG" AS " + "SELECT C.id phonelog_id, " + "F.display_name, F.reverse_display_name, " + "F.display_name_language, " + "F.sortkey, F.reverse_sortkey, " + "F.image_thumbnail_path, " + "C.number address, " + "C.log_type, " + "C.log_time, " + "C.data1, " + "C.data2, " + "C.person_id id, " + "C.number_type address_type " + "FROM (SELECT A.id, A.number, A.log_type, A.log_time, A.data1, A.data2, " + "MIN(B.person_id) person_id, B.data1 number_type " + "FROM "CTS_TABLE_PHONELOGS" A " + "LEFT JOIN (SELECT G.person_id person_id, G.contact_id contact_id, " + "H.datatype datatype, H.data1 data1, H.data4 data4 " + "FROM "CTSVC_DB_VIEW_CONTACT" G, "CTS_TABLE_DATA" H " + "ON H.datatype = %d AND G.contact_id = H.contact_id AND H.is_my_profile = 0 ) B " + "ON A.normal_num = B.data4 " + "AND (A.person_id = B.person_id " + "OR A.person_id IS NULL " + "OR NOT EXISTS (SELECT id FROM "CTS_TABLE_DATA" " + "WHERE datatype = %d AND is_my_profile = 0 " + "AND contact_id IN(SELECT contact_id " + "FROM "CTSVC_DB_VIEW_CONTACT" " + "WHERE person_id = A.person_id) " + "AND A.normal_num = data4)) " + "GROUP BY A.id) C " + "LEFT JOIN (SELECT D.person_id, D.display_name, D.reverse_display_name, " + "D.display_name_language, D.sortkey, D.reverse_sortkey, " + "E.image_thumbnail_path " + "FROM "CTS_TABLE_CONTACTS" D, "CTS_TABLE_PERSONS" E " + "ON E.name_contact_id = D.contact_id) F " + "ON C.person_id = F.person_id " + "ORDER BY C.log_time DESC", + CTSVC_DATA_NUMBER, CTSVC_DATA_NUMBER); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_PERSON_USAGE + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_USAGE" AS " + "SELECT * FROM "CTSVC_DB_VIEW_PERSON" " + "LEFT JOIN (SELECT usage_type, " + "person_id, " + "times_used " + "FROM "CTS_TABLE_CONTACT_STAT") usage " + "ON usage.person_id = "CTSVC_DB_VIEW_PERSON".person_id " + "ORDER BY usage.times_used"); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_PERSON_GROUP + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_GROUP" AS " + "SELECT * FROM "CTSVC_DB_VIEW_PERSON_CONTACT" " + "LEFT JOIN (SELECT group_relations.group_id, " + "group_name, " + "contact_id contact_id_in_group " + "FROM "CTS_TABLE_GROUP_RELATIONS", "CTS_TABLE_GROUPS" " + "ON group_relations.group_id = groups.group_id AND deleted = 0) temp_group " + "ON temp_group.contact_id_in_group = "CTSVC_DB_VIEW_PERSON_CONTACT".contact_id"); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_CONTACT_NUMBER + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACT_NUMBER" AS " + "SELECT * FROM "CTSVC_DB_VIEW_CONTACT" " + "JOIN (SELECT id number_id, " + "contact_id, " + "data1 type, " + "is_default, " + "data2 label, " + "data3 number, " + "data4 normalized_number " + "FROM "CTS_TABLE_DATA" WHERE datatype = %d AND is_my_profile = 0) temp_data " + "ON temp_data.contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id", + CTSVC_DATA_NUMBER); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_CONTACT_EMAIL + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACT_EMAIL" AS " + "SELECT * FROM "CTSVC_DB_VIEW_CONTACT" " + "JOIN (SELECT id email_id, " + "contact_id, " + "data1 type, " + "is_default, " + "data2 label, " + "data3 email " + "FROM "CTS_TABLE_DATA" WHERE datatype = %d AND is_my_profile = 0) temp_data " + "ON temp_data.contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id", + CTSVC_DATA_EMAIL); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_CONTACT_GROUP + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACT_GROUP" AS " + "SELECT * FROM "CTSVC_DB_VIEW_CONTACT" " + "LEFT JOIN (SELECT group_relations.group_id, " + "group_name, " + "contact_id contact_id_in_group " + "FROM "CTS_TABLE_GROUP_RELATIONS", "CTS_TABLE_GROUPS" " + "ON group_relations.group_id = groups.group_id AND deleted = 0) temp_group " + "ON temp_group.contact_id_in_group = "CTSVC_DB_VIEW_CONTACT".contact_id"); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + // CTSVC_DB_VIEW_CONTACT_ACTIVITY + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACT_ACTIVITY" AS " + "SELECT A.contact_id, " + "A.display_name, " + "A.display_name_source, " + "A.reverse_display_name, " + "A.display_name_language, " + "A.sortkey, A.reverse_sortkey, " + "A.addressbook_id, " + "AB.account_id, " + "A.person_id, " + "A.ringtone_path, " + "A.image_thumbnail_path, " + "AC.id activity_id, " + "AC.source_name, " + "AC.status, " + "AC.timestamp, " + "AC.sync_data1, " + "AC.sync_data2, " + "AC.sync_data3, " + "AC.sync_data4 " + "FROM "CTSVC_DB_VIEW_CONTACT" A, "CTS_TABLE_ACTIVITIES" AC, "CTS_TABLE_ADDRESSBOOKS" AB " + "ON A.contact_id = AC.contact_id " + "AND A.addressbook_id = AB.addressbook_id " + "ORDER BY timestamp DESC"); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + //CTSVC_DB_VIEW_PHONELOG_NUMBER + snprintf(query, sizeof(query), + "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PHONELOG_NUMBER" AS " + "SELECT DISTINCT number FROM "CTS_TABLE_PHONELOGS" " + "WHERE log_type < %d", CONTACTS_PLOG_TYPE_EMAIL_RECEIVED); + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret); + + __ctsvc_db_view_already_created = true; + + return CONTACTS_ERROR_NONE; +} +#endif + +int ctsvc_db_init() +{ + int ret = CONTACTS_ERROR_NONE; + ret = ctsvc_db_open(); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_db_open() Failed(%d)", ret); + return ret; + } + ret = ctsvc_restriction_init(); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_restriction_init() Failed(%d)", ret); + return ret; + } + +#ifdef _CONTACTS_IPC_SERVER + ret = __ctsvc_db_create_views(); +#endif + + return ret; +} + +int ctsvc_db_deinit() +{ + int ret = CONTACTS_ERROR_NONE; + ret = ctsvc_db_close(); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_db_close() Failed(%d)", ret); + return ret; + } + ctsvc_restriction_deinit(); + return CONTACTS_ERROR_NONE; +} + + diff --git a/native/ctsvc_db_init.h b/native/ctsvc_db_init.h new file mode 100644 index 0000000..deb6e91 --- /dev/null +++ b/native/ctsvc_db_init.h @@ -0,0 +1,71 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_DB_INIT_H__ +#define __TIZEN_SOCIAL_CTSVC_DB_INIT_H__ + +#include "contacts.h" +#include "ctsvc_struct.h" + +typedef int (*ctsvc_db_insert_record_cb)( contacts_record_h record, int *id ); +typedef int (*ctsvc_db_get_record_cb)( int id, contacts_record_h* out_record ); +typedef int (*ctsvc_db_update_record_cb)( contacts_record_h record ); +typedef int (*ctsvc_db_delete_record_cb)( int id ); +typedef int (*ctsvc_db_replace_record_cb)( contacts_record_h record, int id ); + +typedef int (*ctsvc_db_insert_records_cb)(const contacts_list_h in_list, int **ids); +typedef int (*ctsvc_db_update_records_cb)(const contacts_list_h in_list); +typedef int (*ctsvc_db_delete_records_cb)(int ids[], int count); +typedef int (*ctsvc_db_replace_records_cb)(const contacts_list_h in_list, int ids[], int count); + +typedef int (*ctsvc_db_get_all_records_cb)( int offset, int limit, contacts_list_h* out_list ); +typedef int (*ctsvc_db_get_records_with_query_cb)( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +typedef int (*ctsvc_db_get_count_cb)( int *out_count); +typedef int (*ctsvc_db_get_count_with_query_cb)( contacts_query_h query, int *out_count); + +typedef struct { + bool is_query_only; + ctsvc_db_insert_record_cb insert_record; + ctsvc_db_get_record_cb get_record; + ctsvc_db_update_record_cb update_record; + ctsvc_db_delete_record_cb delete_record; + ctsvc_db_replace_record_cb replace_record; + ctsvc_db_get_all_records_cb get_all_records; + ctsvc_db_get_records_with_query_cb get_records_with_query; + ctsvc_db_insert_records_cb insert_records; + ctsvc_db_update_records_cb update_records; + ctsvc_db_delete_records_cb delete_records; + ctsvc_db_replace_records_cb replace_records; + ctsvc_db_get_count_cb get_count; + ctsvc_db_get_count_with_query_cb get_count_with_query; +} ctsvc_db_plugin_info_s; + +int ctsvc_db_init(); +int ctsvc_db_deinit(); +int ctsvc_db_get_table_name(const char *view_uri, const char **out_table); +ctsvc_db_plugin_info_s* ctsvc_db_get_plugin_info(ctsvc_record_type_e type); +int ctsvc_db_plugin_init(); +int ctsvc_db_plugin_deinit(); + + +#endif // __TIZEN_SOCIAL_CTSVC_DB_INIT_H__ diff --git a/native/ctsvc_db_plugin_activity.c b/native/ctsvc_db_plugin_activity.c new file mode 100644 index 0000000..fdab06f --- /dev/null +++ b/native/ctsvc_db_plugin_activity.c @@ -0,0 +1,529 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_list.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_db_init.h" +#include "ctsvc_utils.h" +#include "ctsvc_record.h" +#include "ctsvc_db_query.h" +#include "ctsvc_notification.h" + +static int __ctsvc_db_activity_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_activity_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_activity_update_record( contacts_record_h record ); +static int __ctsvc_db_activity_delete_record( int id ); +static int __ctsvc_db_activity_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_activity_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_activity_insert_records(const contacts_list_h in_list, int **ds); +//static int __ctsvc_db_activity_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_activity_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_activity = { + .is_query_only = false, + .insert_record = __ctsvc_db_activity_insert_record, + .get_record = __ctsvc_db_activity_get_record, + .update_record = __ctsvc_db_activity_update_record, + .delete_record = __ctsvc_db_activity_delete_record, + .get_all_records = __ctsvc_db_activity_get_all_records, + .get_records_with_query = __ctsvc_db_activity_get_records_with_query, + .insert_records = NULL, //__ctsvc_db_activity_insert_records, + .update_records = NULL, //__ctsvc_db_activity_update_records, + .delete_records = NULL, //__ctsvc_db_activity_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_activity_photo_insert_record( ctsvc_activity_photo_s *photo, int activity_id ) +{ + int ret; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + RETV_IF(NULL == photo, CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == photo->photo_url, CONTACTS_ERROR_INVALID_PARAMETER); + snprintf(query, sizeof(query), "INSERT INTO "CTS_TABLE_ACTIVITY_PHOTOS"(" + "activity_id, photo_url, sort_index) " + "VALUES(%d, ?, %d)", + activity_id, photo->sort_index); + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + + cts_stmt_bind_text(stmt, 1, photo->photo_url); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_activity_insert_record( contacts_record_h record, int *id ) +{ + int ret; + int activity_id; + int contact_id; + cts_stmt stmt = NULL; + unsigned int count = 0; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_activity_s *activity = (ctsvc_activity_s *)record; + + RETV_IF(NULL == activity, CONTACTS_ERROR_INVALID_PARAMETER); + RETVM_IF(activity->id, CONTACTS_ERROR_INVALID_PARAMETER, + "The activity has ID(%d)", activity->id); + + RETVM_IF(activity->contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "The contact_id(%d) does not exist", activity->contact_id); + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), + "SELECT contact_id from %s WHERE contact_id = %d", + CTSVC_DB_VIEW_CONTACT, activity->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret ) { + CTS_ERR("No data : contact id (%d)", activity->contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + snprintf(query, sizeof(query), "INSERT INTO "CTS_TABLE_ACTIVITIES"(" + "contact_id, source_name, status, timestamp, sync_data1, sync_data2, " + "sync_data3, sync_data4) " + "VALUES(%d, ?, ?, %d, ?, ?, ?, ?)", + activity->contact_id, activity->timestamp); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("DB error : cts_query_prepare() Failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + if (activity->source_name) + cts_stmt_bind_text(stmt, 1, activity->source_name); + if (activity->status) + cts_stmt_bind_text(stmt, 2, activity->status); + if (activity->sync_data1) + cts_stmt_bind_text(stmt, 3, activity->sync_data1); + if (activity->sync_data2) + cts_stmt_bind_text(stmt, 4, activity->sync_data2); + if (activity->sync_data3) + cts_stmt_bind_text(stmt, 5, activity->sync_data3); + if (activity->sync_data4) + cts_stmt_bind_text(stmt, 6, activity->sync_data4); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + + activity_id = cts_db_get_last_insert_id(); + + cts_stmt_finalize(stmt); + + if (activity->photos) { + ret = contacts_list_get_count((contacts_list_h)activity->photos, &count); + if(CONTACTS_ERROR_NONE == ret && 0 < count) { + ctsvc_activity_photo_s *photo = NULL; + contacts_record_h record = NULL; + + contacts_list_first((contacts_list_h)activity->photos); + do { + contacts_list_get_current_record_p((contacts_list_h)activity->photos, &record); + photo = (ctsvc_activity_photo_s*)record; + ret = __ctsvc_db_activity_photo_insert_record(photo, activity_id); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : return (%d)", ret); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next((contacts_list_h)activity->photos)); + } + } + + ctsvc_set_activity_noti(); + ctsvc_set_contact_noti(); + + ret = ctsvc_db_contact_update_changed_time(activity->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + if (id) + *id = activity_id; + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + return ret; + else + return CONTACTS_ERROR_NONE; +} + + +static int __ctsvc_db_activity_photo_value_set(cts_stmt stmt, contacts_record_h *record) +{ + int i = 0; + char *temp; + ctsvc_activity_photo_s *photo; + + contacts_record_create(_contacts_activity_photo._uri, record); + photo = (ctsvc_activity_photo_s*)*record; + + photo->id = ctsvc_stmt_get_int(stmt, i++); + photo->activity_id = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + photo->photo_url = SAFE_STRDUP(temp); + photo->sort_index = ctsvc_stmt_get_int(stmt, i++); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_activity_value_set(cts_stmt stmt, contacts_record_h *record) +{ + int i = 0; + char *temp; + ctsvc_activity_s *activity; + + contacts_record_create(_contacts_activity._uri, record); + activity = (ctsvc_activity_s*)*record; + + activity->id = ctsvc_stmt_get_int(stmt, i++); + activity->contact_id = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + activity->source_name = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + activity->status = SAFE_STRDUP(temp); + activity->timestamp = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + activity->sync_data1 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + activity->sync_data2 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + activity->sync_data3 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + activity->sync_data4 = SAFE_STRDUP(temp); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_activity_photo_get_records(int id, contacts_record_h record) +{ + char query[CTS_SQL_MAX_LEN] = {0}; + int ret; + cts_stmt stmt = NULL; + contacts_list_h list; + + snprintf(query, sizeof(query), "SELECT id, activity_id, photo_url, sort_index " + "FROM "CTS_TABLE_ACTIVITY_PHOTOS" WHERE activity_id = %d " + "ORDER BY sort_index ASC", id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + __ctsvc_db_activity_photo_value_set(stmt, &record); + + ctsvc_list_prepend(list, record); + } + + cts_stmt_finalize(stmt); + + ((ctsvc_activity_s*)record)->photos = (ctsvc_list_s*)list; + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_activity_get_record( int id, contacts_record_h* out_record ) +{ + char query[CTS_SQL_MAX_LEN] = {0}; + int ret; + cts_stmt stmt = NULL; + contacts_record_h record; + + + snprintf(query, sizeof(query), "SELECT id, contact_id, source_name, status, " + "timestamp, sync_data1, sync_data2, sync_data3, sync_data4 " + "FROM "CTSVC_DB_VIEW_ACTIVITY" WHERE id = %d", id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + __ctsvc_db_activity_value_set(stmt, &record); + cts_stmt_finalize(stmt); + + __ctsvc_db_activity_photo_get_records(id, record); + + *out_record = (contacts_record_h)record; + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_activity_update_record( contacts_record_h record ) +{ + CTS_ERR("Invalid operation : activity can not update, only insert/delete"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_db_activity_delete_record( int id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_ACTIVITY" WHERE id = %d", id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret ) { + CTS_ERR("No data : id (%d)", id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_NO_DATA; + } + + snprintf(query, sizeof(query), + "DELETE FROM "CTS_TABLE_ACTIVITIES" WHERE id = %d", id); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_set_activity_noti(); + ctsvc_set_contact_noti(); + + ret = ctsvc_db_contact_update_changed_time(contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + return ret; + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_activity_get_all_records( int offset, int limit, + contacts_list_h* out_list ) +{ + int ret; + int len; + int activity_id; + cts_stmt stmt; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_list_h list; + + len = snprintf(query, sizeof(query), + "SELECT id, contact_id, source_name, status, " + "timestamp, sync_data1, sync_data2, sync_data3, sync_data4 " + "FROM "CTSVC_DB_VIEW_ACTIVITY); + + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + activity_id = ctsvc_stmt_get_int(stmt, 0); + ret = contacts_db_get_record(_contacts_activity._uri, activity_id, &record); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : contacts_db_get_record() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return CONTACTS_ERROR_NO_DATA; + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_activity_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + int activity_id = 0; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_activity_s *activity; + bool had_activity_id = false; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + if (s_query->projection) { + for (i=0;iprojection_count;i++) { + if (s_query->projection[i] == CTSVC_PROPERTY_ACTIVITY_ID) { + had_activity_id = true; + break; + } + } + } + else + had_activity_id = true; + + if (!had_activity_id) { + s_query->projection = realloc(s_query->projection, s_query->projection_count+1); + s_query->projection[s_query->projection_count] = CTSVC_PROPERTY_ACTIVITY_ID; + s_query->projection_count++; + } + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_activity._uri, &record); + activity = (ctsvc_activity_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else { + field_count = s_query->projection_count; + ret = ctsvc_record_set_projection_flags(record, s_query->projection, + s_query->projection_count, s_query->property_count); + + if(CONTACTS_ERROR_NONE != ret) + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + + switch(property_id) { + case CTSVC_PROPERTY_ACTIVITY_ID: + activity_id = ctsvc_stmt_get_int(stmt, i); + if (had_activity_id) + activity->id = activity_id; + break; + case CTSVC_PROPERTY_ACTIVITY_CONTACT_ID: + activity->contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_ACTIVITY_SOURCE_NAME: + temp = ctsvc_stmt_get_text(stmt, i); + activity->source_name = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_ACTIVITY_STATUS: + temp = ctsvc_stmt_get_text(stmt, i); + activity->status = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_ACTIVITY_TIMESTAMP: + activity->timestamp = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_ACTIVITY_SYNC_DATA1: + temp = ctsvc_stmt_get_text(stmt, i); + activity->sync_data1 = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_ACTIVITY_SYNC_DATA2: + temp = ctsvc_stmt_get_text(stmt, i); + activity->sync_data2 = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_ACTIVITY_SYNC_DATA3: + temp = ctsvc_stmt_get_text(stmt, i); + activity->sync_data3 = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_ACTIVITY_SYNC_DATA4: + temp = ctsvc_stmt_get_text(stmt, i); + activity->sync_data4 = SAFE_STRDUP(temp); + break; + default: + break; + } + } + __ctsvc_db_activity_photo_get_records(activity_id, record); + + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} +//static int __ctsvc_db_activity_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_activity_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_activity_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_address.c b/native/ctsvc_db_plugin_address.c new file mode 100644 index 0000000..d5d7440 --- /dev/null +++ b/native/ctsvc_db_plugin_address.c @@ -0,0 +1,371 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_db_plugin_address_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_db_query.h" +#include "ctsvc_list.h" + +static int __ctsvc_db_address_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_address_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_address_update_record( contacts_record_h record ); +static int __ctsvc_db_address_delete_record( int id ); +static int __ctsvc_db_address_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_address_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_address_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_address_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_address_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_address = { + .is_query_only = false, + .insert_record = __ctsvc_db_address_insert_record, + .get_record = __ctsvc_db_address_get_record, + .update_record = __ctsvc_db_address_update_record, + .delete_record = __ctsvc_db_address_delete_record, + .get_all_records = __ctsvc_db_address_get_all_records, + .get_records_with_query = __ctsvc_db_address_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_address_insert_records, + .update_records = NULL,//__ctsvc_db_address_update_records, + .delete_records = NULL,//__ctsvc_db_address_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_address_insert_record( contacts_record_h record, int *id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_address_s *address = (ctsvc_address_s*)record; + + RETVM_IF(NULL == address->pobox && NULL == address->postalcode && NULL == address->region + && NULL == address->locality && NULL == address->street && NULL == address->extended + && NULL == address->country, + CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : address is NULL"); + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", address->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_address_insert(record, address->contact_id, false, id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(address->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + return ret; + else + return CONTACTS_ERROR_NONE; +} + + +static int __ctsvc_db_address_update_record( contacts_record_h record ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_address_s *address = (ctsvc_address_s*)record; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", address->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_address_update(record, address->contact_id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(address->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + return ret; + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_address_delete_record( int id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MIN_LEN] = {0}; + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), "SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d", id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret ) { + CTS_ERR("No data : id (%d)", id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_NO_DATA; + } + + ret = ctsvc_db_address_delete(id); + if (CONTACTS_ERROR_NONE != ret) { + ret = ctsvc_db_contact_update_changed_time(contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + ret = ctsvc_end_trans(true); + } + else + ctsvc_end_trans(false); + + if (ret < CONTACTS_ERROR_NONE) + return ret; + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_address_get_record( int id, contacts_record_h* out_record ) +{ + char query[CTS_SQL_MAX_LEN] = {0}; + int ret; + cts_stmt stmt = NULL; + ctsvc_address_s *address; + + snprintf(query, sizeof(query), + "SELECT data.contact_id, is_default, " + "data1, data2, data3, data4, data5, data6, data7, data8, data9 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype=%d AND id = %d ", + CTSVC_DATA_POSTAL, id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + ctsvc_db_address_get_value_from_stmt(stmt, (contacts_record_h*)&address, 0); + cts_stmt_finalize(stmt); + + *out_record = (contacts_record_h)address; + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_address_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int len; + int ret; + contacts_list_h list; + ctsvc_address_s *address; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT data.contact_id, is_default, " + "data1, data2, data3, data4, data5, data6, data7, data8, data9 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype=%d AND is_my_profile=0 ", + CTSVC_DATA_POSTAL); + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + ctsvc_db_address_get_value_from_stmt(stmt, (contacts_record_h*)&address, 0); + ctsvc_list_prepend(list, (contacts_record_h)address); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_address_get_records_with_query( contacts_query_h query, int offset, + int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_address_s *address; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_address._uri, &record); + address = (ctsvc_address_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else { + field_count = s_query->projection_count; + ret = ctsvc_record_set_projection_flags(record, s_query->projection, + s_query->projection_count, s_query->property_count); + + if(CONTACTS_ERROR_NONE != ret) + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_ADDRESS_ID: + address->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_ADDRESS_CONTACT_ID: + address->contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_ADDRESS_TYPE: + address->type = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_ADDRESS_IS_DEFAULT: + address->is_default = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_ADDRESS_LABEL: + temp = ctsvc_stmt_get_text(stmt, i); + address->label = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_ADDRESS_POSTBOX: + temp = ctsvc_stmt_get_text(stmt, i); + address->pobox = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_ADDRESS_POSTAL_CODE: + temp = ctsvc_stmt_get_text(stmt, i); + address->postalcode = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_ADDRESS_REGION: + temp = ctsvc_stmt_get_text(stmt, i); + address->region = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_ADDRESS_LOCALITY: + temp = ctsvc_stmt_get_text(stmt, i); + address->locality = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_ADDRESS_STREET: + temp = ctsvc_stmt_get_text(stmt, i); + address->street = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_ADDRESS_COUNTRY: + temp = ctsvc_stmt_get_text(stmt, i); + address->country = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_ADDRESS_EXTENDED: + temp = ctsvc_stmt_get_text(stmt, i); + address->extended = SAFE_STRDUP(temp); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_address_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_address_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_address_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_address_helper.c b/native/ctsvc_db_plugin_address_helper.c new file mode 100644 index 0000000..3bdc4b4 --- /dev/null +++ b/native/ctsvc_db_plugin_address_helper.c @@ -0,0 +1,218 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_address_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + +int ctsvc_db_address_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count) +{ + int ret; + char *temp; + ctsvc_address_s *address; + + ret = contacts_record_create(_contacts_address._uri, (contacts_record_h *)&address); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + + address->id = ctsvc_stmt_get_int(stmt, start_count++); + address->contact_id = ctsvc_stmt_get_int(stmt, start_count++); + address->is_default = ctsvc_stmt_get_int(stmt, start_count++); + address->type = ctsvc_stmt_get_int(stmt, start_count++); + temp = ctsvc_stmt_get_text(stmt, start_count++); + address->label = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + address->pobox = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + address->postalcode = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + address->region = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + address->locality = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + address->street = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + address->extended = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + address->country = SAFE_STRDUP(temp); + + *record = (contacts_record_h)address; + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_address_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id) +{ + int ret; + cts_stmt stmt = NULL; + ctsvc_address_s *address = (ctsvc_address_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + +// RETVM_IF(address->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted address record"); + RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact_id(%d) is mandatory field to insert address record ", address->contact_id); + RETVM_IF(0 < address->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", address->id); + + if (address->pobox || address->postalcode || address->region || address->locality + || address->street || address->extended || address->country) { + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, is_default, data1, data2, data3, " + "data4, data5, data6, data7, data8, data9) " + "VALUES(%d, %d, %d, %d, %d, ?, ?, ?, ?, ?, ?, ?, ?)", + contact_id, is_my_profile, CTSVC_DATA_POSTAL, address->is_default, address->type); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + if (address->label) + sqlite3_bind_text(stmt, 1, address->label, + strlen(address->label), SQLITE_STATIC); + if (address->pobox) + sqlite3_bind_text(stmt, 2, address->pobox, + strlen(address->pobox), SQLITE_STATIC); + if (address->postalcode) + sqlite3_bind_text(stmt, 3, address->postalcode, + strlen(address->postalcode), SQLITE_STATIC); + if (address->region) + sqlite3_bind_text(stmt, 4, address->region, + strlen(address->region), SQLITE_STATIC); + if (address->locality) + sqlite3_bind_text(stmt, 5, address->locality, + strlen(address->locality), SQLITE_STATIC); + if (address->street) + sqlite3_bind_text(stmt, 6, address->street, + strlen(address->street), SQLITE_STATIC); + if (address->extended) + sqlite3_bind_text(stmt, 7, address->extended, + strlen(address->extended), SQLITE_STATIC); + if (address->country) + sqlite3_bind_text(stmt, 8, address->country, + strlen(address->country), SQLITE_STATIC); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + if (id) + *id = cts_db_get_last_insert_id(); + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_address_noti(); + } + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_address_update(contacts_record_h record, int contact_id, bool is_my_profile) +{ + int ret; + cts_stmt stmt = NULL; + ctsvc_address_s *address = (ctsvc_address_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + +// RETVM_IF(address->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted address record"); + RETVM_IF(NULL == address->pobox && NULL == address->postalcode && address->region + && address->locality && address->street && address->extended && address->country, + CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : address is NULL"); + RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact_id(%d) is mandatory field to insert address record ", address->contact_id); + RETVM_IF(address->id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", address->id); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET is_my_profile=%d, is_default=?, data1 = ?, data2 = ?, data3 = ?, " + "data4 = ?, data5 = ?, data6 = ?, data7 = ?, data8 = ?, data9 = ? " + "WHERE id = %d", is_my_profile, address->id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + sqlite3_bind_int(stmt, 1, address->is_default); + sqlite3_bind_int(stmt, 2, address->type); + + if (address->label) + sqlite3_bind_text(stmt, 3, address->label, + strlen(address->label), SQLITE_STATIC); + if (address->pobox) + sqlite3_bind_text(stmt, 4, address->pobox, + strlen(address->pobox), SQLITE_STATIC); + if (address->postalcode) + sqlite3_bind_text(stmt, 5, address->postalcode, + strlen(address->postalcode), SQLITE_STATIC); + if (address->region) + sqlite3_bind_text(stmt, 6, address->region, + strlen(address->region), SQLITE_STATIC); + if (address->locality) + sqlite3_bind_text(stmt, 7, address->locality, + strlen(address->locality), SQLITE_STATIC); + if (address->street) + sqlite3_bind_text(stmt, 8, address->street, + strlen(address->street), SQLITE_STATIC); + if (address->extended) + sqlite3_bind_text(stmt, 9, address->extended, + strlen(address->extended), SQLITE_STATIC); + if (address->country) + sqlite3_bind_text(stmt, 10, address->country, + strlen(address->country), SQLITE_STATIC); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_address_noti(); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_address_delete(int id) +{ + int ret; + cts_stmt stmt; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE datatype = %d AND id = %d", + CTSVC_DATA_POSTAL, id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + cts_stmt_finalize(stmt); + + ctsvc_set_address_noti(); + + return ret; +} diff --git a/native/ctsvc_db_plugin_address_helper.h b/native/ctsvc_db_plugin_address_helper.h new file mode 100644 index 0000000..4af38f7 --- /dev/null +++ b/native/ctsvc_db_plugin_address_helper.h @@ -0,0 +1,31 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_ADDRESS_HELPER_H__ +#define __CTSVC_DB_PLUGIN_ADDRESS_HELPER_H__ + +#include "contacts.h" +#include "ctsvc_sqlite.h" + +int ctsvc_db_address_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id); +int ctsvc_db_address_update(contacts_record_h record, int contact_id, bool is_my_profile); +int ctsvc_db_address_delete(int id); +int ctsvc_db_address_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count); + +#endif // __CTSVC_DB_PLUGIN_ADDRESS_HELPER_H__ diff --git a/native/ctsvc_db_plugin_addressbook.c b/native/ctsvc_db_plugin_addressbook.c new file mode 100644 index 0000000..56557fd --- /dev/null +++ b/native/ctsvc_db_plugin_addressbook.c @@ -0,0 +1,522 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_list.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_query.h" +#include "ctsvc_db_plugin_person_helper.h" +#include "ctsvc_person.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + +static int __ctsvc_db_addressbook_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_addressbook_get_record( int id, contacts_record_h* record ); +static int __ctsvc_db_addressbook_update_record( contacts_record_h record ); +static int __ctsvc_db_addressbook_delete_record( int id ); +static int __ctsvc_db_addressbook_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_addressbook_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_addressbook_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_addressbook_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_addressbook_delete_records(int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_addressbook = { + .is_query_only = false, + .insert_record = __ctsvc_db_addressbook_insert_record, + .get_record = __ctsvc_db_addressbook_get_record, + .update_record = __ctsvc_db_addressbook_update_record, + .delete_record = __ctsvc_db_addressbook_delete_record, + .get_all_records = __ctsvc_db_addressbook_get_all_records, + .get_records_with_query = __ctsvc_db_addressbook_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_addressbook_insert_records, + .update_records = NULL,//__ctsvc_db_addressbook_update_records, + .delete_records = NULL,//__ctsvc_db_addressbook_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_addressbook_value_set(cts_stmt stmt, contacts_record_h *record) +{ + int i; + int ret; + char *temp; + ctsvc_addressbook_s *addressbook; + + ret = contacts_record_create(_contacts_address_book._uri, record); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + addressbook = (ctsvc_addressbook_s*)*record; + + i = 0; + addressbook->id = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + addressbook->name = SAFE_STRDUP(temp); + addressbook->account_id = ctsvc_stmt_get_int(stmt, i++); + addressbook->mode = ctsvc_stmt_get_int(stmt, i++); + + return CONTACTS_ERROR_NONE; +} + + +static int __ctsvc_db_addressbook_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_record_h record; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + len = snprintf(query, sizeof(query), + "SELECT addressbook_id, addressbook_name, account_id, mode, last_sync_ver " + "FROM "CTS_TABLE_ADDRESSBOOKS" WHERE addressbook_id = %d", + id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ret = __ctsvc_db_addressbook_value_set(stmt, &record); + + cts_stmt_finalize(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("__ctsvc_db_addressbook_value_set(ALL) Failed(%d)", ret); + return ret; + } + + *out_record = record; + + return CONTACTS_ERROR_NONE; +} + + +static int __ctsvc_db_addressbook_insert_record( contacts_record_h record, int *id ) +{ + ctsvc_addressbook_s *addressbook = (ctsvc_addressbook_s*)record; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == addressbook->name, CONTACTS_ERROR_INVALID_PARAMETER); + RETVM_IF(CTSVC_RECORD_ADDRESSBOOK != addressbook->base.r_type, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : record is invalid type(%d)", addressbook->base.r_type); + + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + snprintf(query, sizeof(query), + "INSERT INTO %s(addressbook_name, account_id, mode) " + "VALUES(?, %d, %d)", + CTS_TABLE_ADDRESSBOOKS, addressbook->account_id, addressbook->mode); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("DB error : cts_query_prepare() Failed"); + return CONTACTS_ERROR_DB; + } + + cts_stmt_bind_text(stmt, 1, addressbook->name); + + /* BEGIN_TRANSACTION */ + int ret = ctsvc_begin_trans(); + if( ret < CONTACTS_ERROR_NONE ) + { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + /* DOING JOB */ + do { + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + break; + } + + //int index = cts_db_get_last_insert_id(); + if (id) + *id = cts_db_get_last_insert_id(); + cts_stmt_finalize(stmt); + + ctsvc_set_addressbook_noti(); + ret = ctsvc_end_trans(true); + if(ret < CONTACTS_ERROR_NONE ) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + //addressbook->id = index; + + // SUCCESS + return CONTACTS_ERROR_NONE; + + } while(0); + + /* ROLLBACK TRANSACTION */ + ctsvc_end_trans(false); + + return ret; +} + +static int __ctsvc_db_addressbook_update_record( contacts_record_h record ) +{ + ctsvc_addressbook_s *addressbook = (ctsvc_addressbook_s *)record; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == addressbook->name, CONTACTS_ERROR_INVALID_PARAMETER); + RETVM_IF(CTSVC_RECORD_ADDRESSBOOK != addressbook->base.r_type, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : record is invalid type(%d)", addressbook->base.r_type); + + cts_stmt stmt = NULL; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), + "UPDATE %s SET addressbook_name=?, account_id=%d, mode=%d " + "WHERE addressbook_id=%d", CTS_TABLE_ADDRESSBOOKS, + addressbook->account_id, addressbook->mode, addressbook->id); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("DB error : cts_query_prepare() Failed"); + return CONTACTS_ERROR_DB; + } + + cts_stmt_bind_text(stmt, 1, addressbook->name); + + /* BEGIN_TRANSACTION */ + int ret = ctsvc_begin_trans(); + if( ret < CONTACTS_ERROR_NONE ) + { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + /* DOING JOB */ + do { + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + break; + } + cts_stmt_finalize(stmt); + + ctsvc_set_addressbook_noti(); + + ret = ctsvc_end_trans(true); + if(ret < CONTACTS_ERROR_NONE ) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + + return CONTACTS_ERROR_NONE; + + } while(0); + + /* ROLLBACK TRANSACTION */ + ctsvc_end_trans(false); + + return ret; +} + +static inline int __ctsvc_db_addressbook_reset_internal_addressbook(void) +{ + CTS_FN_CALL; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "UPDATE %s SET deleted=1, person_id=0, " + "changed_ver = ((SELECT ver FROM cts_version) + 1) WHERE addressbook_id = %d", + CTS_TABLE_CONTACTS, 0 /*CTS_ADDRESSBOOK_INTERNAL*/); + + /* BEGIN_TRANSACTION */ + int ret = ctsvc_begin_trans(); + RETVM_IF(CONTACTS_ERROR_NONE > ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret); + + /* DOING JOB */ + do { + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + break; + } + + snprintf(query, sizeof(query), "DELETE FROM %s WHERE addressbook_id = %d", + CTS_TABLE_MY_PROFILES, 0); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) + { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + break; + } + + snprintf(query, sizeof(query), "DELETE FROM %s WHERE addressbook_id = %d", + CTS_TABLE_GROUPS, 0 /*CTS_ADDRESSBOOK_INTERNAL*/); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + break; + } + + snprintf(query, sizeof(query), "DELETE FROM %s WHERE addressbook_id = %d", + CTS_TABLE_GROUP_DELETEDS, 0 /*CTS_ADDRESSBOOK_INTERNAL*/); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + break; + } + + snprintf(query, sizeof(query), "DELETE FROM %s WHERE addressbook_id = %d", + CTS_TABLE_DELETEDS, 0 /*CTS_ADDRESSBOOK_INTERNAL*/); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + break; + } + + ret = ctsvc_person_do_garbage_collection(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : cts_person_garbagecollection() Failed(%d)", ret); + break; + } + + ctsvc_set_contact_noti(); + ctsvc_set_my_profile_noti(); + ctsvc_set_group_noti(); + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + + return CONTACTS_ERROR_NONE; + } while(0); + + /* ROLLBACK TRANSACTION */ + ctsvc_end_trans(false); + + return ret; +} + +static int __ctsvc_db_addressbook_delete_record( int addressbook_id ) +{ + CTS_FN_CALL; + + if (0 /*CTS_ADDRESSBOOK_INTERNAL*/ == addressbook_id) + return __ctsvc_db_addressbook_reset_internal_addressbook(); + + char query[CTS_SQL_MAX_LEN] = {0}; + snprintf(query, sizeof(query), "DELETE FROM %s WHERE addressbook_id = %d", + CTS_TABLE_ADDRESSBOOKS, addressbook_id); + + /* BEGIN_TRANSACTION */ + int ret = ctsvc_begin_trans(); + RETVM_IF(CONTACTS_ERROR_NONE > ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret); + + /* DOING JOB */ + do { + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + break; + } + + ret = cts_db_change(); + if (0 < ret) { + ctsvc_set_my_profile_noti(); + ctsvc_set_contact_noti(); + ctsvc_set_group_noti(); + ctsvc_set_addressbook_noti(); + } + else { + ret = CONTACTS_ERROR_NO_DATA; + break; + } + + ret = ctsvc_person_do_garbage_collection(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : cts_person_garbagecollection() Failed(%d)", ret); + break; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + + return CONTACTS_ERROR_NONE; + + } while(0); + + ctsvc_end_trans(false); + + return ret; +} + +static int __ctsvc_db_addressbook_get_all_records( int offset, int limit, + contacts_list_h* out_list ) +{ + int ret; + int len; + cts_stmt stmt; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_list_h list; + + len = snprintf(query, sizeof(query), + "SELECT addressbook_id, addressbook_name, account_id, mode, last_sync_ver " + "FROM "CTS_TABLE_ADDRESSBOOKS" ORDER BY account_id, addressbook_id"); + + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return CONTACTS_ERROR_NO_DATA; + } + __ctsvc_db_addressbook_value_set(stmt, &record); + + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_addressbook_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_addressbook_s *addressbook; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return CONTACTS_ERROR_NO_DATA; + } + + contacts_record_create(_contacts_address_book._uri, &record); + addressbook = (ctsvc_addressbook_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else + { + field_count = s_query->projection_count; + + if( CONTACTS_ERROR_NONE != ctsvc_record_set_projection_flags(record, s_query->projection, s_query->projection_count, s_query->property_count) ) + { + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_ADDRESSBOOK_ID: + addressbook->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_ADDRESSBOOK_NAME: + temp = ctsvc_stmt_get_text(stmt, i); + addressbook->name = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_ADDRESSBOOK_MODE: + addressbook->mode = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_ADDRESSBOOK_ACCOUNT_ID: + addressbook->account_id = ctsvc_stmt_get_int(stmt, i); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + + return CONTACTS_ERROR_NONE; +} + +#if 0 +static int __ctsvc_db_addressbook_insert_records(const contacts_list_h in_list, int **ids) +{ + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_addressbook_update_records(const contacts_list_h in_list) +{ + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_addressbook_delete_records(int ids[], int count) +{ + return CONTACTS_ERROR_NONE; +} +#endif diff --git a/native/ctsvc_db_plugin_company.c b/native/ctsvc_db_plugin_company.c new file mode 100644 index 0000000..7bd00a0 --- /dev/null +++ b/native/ctsvc_db_plugin_company.c @@ -0,0 +1,404 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_db_plugin_company_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" +#include "ctsvc_db_query.h" +#include "ctsvc_list.h" + +#define CTS_LOGO_IMAGE_LOCATION "/opt/usr/data/contacts-svc/img/logo" + +static int __ctsvc_db_company_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_company_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_company_update_record( contacts_record_h record ); +static int __ctsvc_db_company_delete_record( int id ); +static int __ctsvc_db_company_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_company_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_company_insert_records(const contacts_list_h in_list, int **ds); +//static int __ctsvc_db_company_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_company_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_company = { + .is_query_only = false, + .insert_record = __ctsvc_db_company_insert_record, + .get_record = __ctsvc_db_company_get_record, + .update_record = __ctsvc_db_company_update_record, + .delete_record = __ctsvc_db_company_delete_record, + .get_all_records = __ctsvc_db_company_get_all_records, + .get_records_with_query = __ctsvc_db_company_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_company_insert_records, + .update_records = NULL,//__ctsvc_db_company_update_records, + .delete_records = NULL,//__ctsvc_db_company_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_company_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, " + "data3, data4, data5, data6, data7, data8, data9, data10, data11, data12 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE id = %d AND datatype = %d ", + id, CTSVC_DATA_COMPANY); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ctsvc_db_company_get_value_from_stmt(stmt, out_record, 0); + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_company_insert_record( contacts_record_h record, int *id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_company_s *company = (ctsvc_company_s *)record; + + RETVM_IF(NULL == company->name && NULL == company->department && NULL == company->job_title + && NULL == company->role && NULL == company->assistant_name && NULL == company->logo + && NULL == company->location && NULL == company->description && NULL == company->phonetic_name, + CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : company is NULL"); + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", company->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_company_insert(record, company->contact_id, false, id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(company->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_set_contact_noti(); + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_company_update_record( contacts_record_h record ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_company_s *company = (ctsvc_company_s *)record; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", company->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_company_update(record, company->contact_id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + // TODO ; contact display company update + ret = ctsvc_db_contact_update_changed_time(company->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_set_contact_noti(); + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + + +static int __ctsvc_db_company_delete_record( int id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" " + "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if( ret != CONTACTS_ERROR_NONE ) { + CTS_ERR("The id(%d) is Invalid(%d)", id, ret); + ctsvc_end_trans(false); + return contact_id; + } + + ret = ctsvc_db_company_delete(id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_set_contact_noti(); + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_company_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int len; + int ret; + contacts_list_h list; + ctsvc_company_s *company; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, " + "data3, data4, data5, data6, data7, data8, data9, data10, data11, data12 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype=%d AND is_my_profile=0 ", + CTSVC_DATA_COMPANY); + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB : cts_stmt_step fail(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + ctsvc_db_company_get_value_from_stmt(stmt, (contacts_record_h*)&company, 0); + ctsvc_list_prepend(list, (contacts_record_h)company); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_company_get_records_with_query( contacts_query_h query, int offset, + int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_company_s *company; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_company._uri, &record); + company = (ctsvc_company_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else { + field_count = s_query->projection_count; + ret = ctsvc_record_set_projection_flags(record, s_query->projection, + s_query->projection_count, s_query->property_count); + + if(CONTACTS_ERROR_NONE != ret) + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_COMPANY_ID: + company->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_COMPANY_CONTACT_ID: + company->contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_COMPANY_TYPE: + company->type = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_COMPANY_LABEL: + temp = ctsvc_stmt_get_text(stmt, i); + company->label = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_COMPANY_NAME: + temp = ctsvc_stmt_get_text(stmt, i); + company->name = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_COMPANY_DEPARTMENT: + temp = ctsvc_stmt_get_text(stmt, i); + company->department = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_COMPANY_JOB_TITLE: + temp = ctsvc_stmt_get_text(stmt, i); + company->job_title = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_COMPANY_ASSISTANT_NAME: + temp = ctsvc_stmt_get_text(stmt, i); + company->assistant_name = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_COMPANY_ROLE: + temp = ctsvc_stmt_get_text(stmt, i); + company->role = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_COMPANY_LOGO: + temp = ctsvc_stmt_get_text(stmt, i); + company->logo = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_COMPANY_LOCATION: + temp = ctsvc_stmt_get_text(stmt, i); + company->location = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_COMPANY_DESCRIPTION: + temp = ctsvc_stmt_get_text(stmt, i); + company->description = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_COMPANY_PHONETIC_NAME: + temp = ctsvc_stmt_get_text(stmt, i); + company->phonetic_name = SAFE_STRDUP(temp); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_company_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_company_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_company_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_company_helper.c b/native/ctsvc_db_plugin_company_helper.c new file mode 100644 index 0000000..31f48f0 --- /dev/null +++ b/native/ctsvc_db_plugin_company_helper.c @@ -0,0 +1,307 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_company_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + +#define CTS_LOGO_IMAGE_LOCATION "/opt/usr/data/contacts-svc/img/logo" + +static int __ctsvc_company_add_logo_file(int index, char *src_img, char *dest_name, int dest_size) +{ + int ret; + char *ext; + char dest[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + + RETVM_IF(NULL == src_img, CONTACTS_ERROR_INVALID_PARAMETER, "img_path is NULL"); + RETVM_IF(NULL == dest_name, CONTACTS_ERROR_INVALID_PARAMETER, "img_path is NULL"); + dest_name[0] = '\0'; + + ext = strrchr(src_img, '.'); + if (NULL == ext || strchr(ext, '/')) + ext = ""; + + snprintf(dest, sizeof(dest), "%s/%d%s", + CTS_LOGO_IMAGE_LOCATION, index, ext); + + ret = ctsvc_copy_image(src_img, dest); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "cts_copy_file() Failed(%d)", ret); + + snprintf(dest_name, dest_size, "%d%s", index, ext); + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_company_update_logo_file(int index, char *src_img, char *dest_name, int dest_size) +{ + int ret; + dest_name[0] = '\0'; + ret = ctsvc_company_delete_logo_file(index); + RETVM_IF(CONTACTS_ERROR_NONE != ret && CONTACTS_ERROR_NO_DATA != ret, + ret, "ccts_company_delete_logo_file() Failed(%d)", ret); + + if (src_img) { + ret = __ctsvc_company_add_logo_file(index, src_img, dest_name, dest_size); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "__ctsvc_company_add_logo_file() Failed(%d)", ret); + } + return ret; +} + +static int __ctsvc_company_bind_stmt(cts_stmt stmt, ctsvc_company_s *company, int start_cnt) +{ + cts_stmt_bind_int(stmt, start_cnt, company->is_default); + cts_stmt_bind_int(stmt, start_cnt+1, company->type); + if (company->label) + sqlite3_bind_text(stmt, start_cnt+2, company->label, + strlen(company->label), SQLITE_STATIC); + if (company->name) + sqlite3_bind_text(stmt, start_cnt+3, company->name, + strlen(company->name), SQLITE_STATIC); + if (company->department) + sqlite3_bind_text(stmt, start_cnt+4, company->department, + strlen(company->department), SQLITE_STATIC); + if (company->job_title) + sqlite3_bind_text(stmt, start_cnt+5, company->job_title, + strlen(company->job_title), SQLITE_STATIC); + if (company->role) + sqlite3_bind_text(stmt, start_cnt+6, company->role, + strlen(company->role), SQLITE_STATIC); + if (company->assistant_name) + sqlite3_bind_text(stmt, start_cnt+7, company->assistant_name, + strlen(company->assistant_name), SQLITE_STATIC); + + // skip logo here + + if (company->location) + sqlite3_bind_text(stmt, start_cnt+9, company->location, + strlen(company->location), SQLITE_STATIC); + if (company->description) + sqlite3_bind_text(stmt, start_cnt+10, company->description, + strlen(company->description), SQLITE_STATIC); + if (company->phonetic_name) + sqlite3_bind_text(stmt, start_cnt+11, company->phonetic_name, + strlen(company->phonetic_name), SQLITE_STATIC); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_company_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id) +{ + int ret; + cts_stmt stmt = NULL; + ctsvc_company_s *company = (ctsvc_company_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + +// RETVM_IF(company->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted company record"); + RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact_id(%d) is mandatory field to insert company record ", company->contact_id); + RETVM_IF(0 < company->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", company->id); + + if (company->name || company->department || company->job_title || company->role + || company->assistant_name || company->logo || company->location || company->description + || company->phonetic_name) { + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, is_default, data1, data2, data3, data4, " + "data5, data6, data7, data8, data9, data10, data11, data12) " + "VALUES(%d, %d, %d, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + contact_id, is_my_profile, CTSVC_DATA_COMPANY); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + __ctsvc_company_bind_stmt(stmt, company, 1); + if (company->logo) { + char image[CTS_SQL_MAX_LEN] = {0}; + ret = __ctsvc_company_add_logo_file(company->contact_id, company->logo, image, sizeof(image)); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("__ctsvc_company_add_logo_file() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + cts_stmt_bind_text(stmt, 9, image); + } + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + if (id) + *id = cts_db_get_last_insert_id(); + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_company_noti(); + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_company_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count) +{ + int ret; + char *temp; + ctsvc_company_s *company; + + ret = contacts_record_create(_contacts_company._uri, (contacts_record_h *)&company); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + + company->id = ctsvc_stmt_get_int(stmt, start_count++); + company->contact_id = ctsvc_stmt_get_int(stmt, start_count++); + company->is_default = ctsvc_stmt_get_int(stmt, start_count++); + company->type = ctsvc_stmt_get_int(stmt, start_count++); + temp = ctsvc_stmt_get_text(stmt, start_count++); + company->label = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + company->name = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + company->department = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + company->job_title = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + company->role = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + company->assistant_name = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + if (temp) { + char tmp_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + snprintf(tmp_path, sizeof(tmp_path), "%s/%s", CTS_LOGO_IMAGE_LOCATION, temp); + company->logo = strdup(tmp_path); + } + temp = ctsvc_stmt_get_text(stmt, start_count++); + company->location = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + company->description = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + company->phonetic_name = SAFE_STRDUP(temp); + + if (company->name || company->department || company->job_title || company->role + || company->assistant_name || company->logo || company->location || company->description + || company->phonetic_name) + *record = (contacts_record_h)company; + else { + contacts_record_destroy((contacts_record_h)company, true); + *record = NULL; + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_company_update(contacts_record_h record, int contact_id, bool is_my_profile) +{ + int ret; + ctsvc_company_s *company = (ctsvc_company_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + cts_stmt stmt; + + RETVM_IF(!company->id, CONTACTS_ERROR_INVALID_PARAMETER, "company of contact has no ID."); + + if (company->name || company->department || company->job_title || company->role + || company->assistant_name || company->logo || company->location || company->description + || company->phonetic_name) { + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, is_default=?, data1=?, data2=?, data3=?, data4=?," + "data5=?, data6=?, data7=?, data8=?, data9=?, data10=?, data11=?, data12=? WHERE id=%d", + contact_id, is_my_profile, company->id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + __ctsvc_company_bind_stmt(stmt, company, 1); + if (company->logo_changed) { + char dest[CTS_SQL_MAX_LEN] = {0}; + __ctsvc_company_update_logo_file(contact_id, company->logo, dest, sizeof(dest)); + if (*dest) + cts_stmt_bind_text(stmt, 9, dest); + company->logo_changed = false; + } + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_company_noti(); + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_company_delete(int id) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d", + id, CTSVC_DATA_COMPANY); + + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret); + ctsvc_set_company_noti(); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_company_delete_logo_file(int index) +{ + int ret; + cts_stmt stmt; + char *tmp_path; + char query[CTS_SQL_MIN_LEN] = {0}; + snprintf(query, sizeof(query), + "SELECT data8 FROM %s WHERE contact_id = %d AND datatype = %d AND is_my_profile = 0", + CTS_TABLE_DATA, index, CTSVC_DATA_COMPANY); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare() Failed"); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_DB; + } + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_DBG("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + tmp_path = ctsvc_stmt_get_text(stmt, 0); + if (tmp_path) { + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_LOGO_IMAGE_LOCATION, tmp_path); + ret = unlink(full_path); + WARN_IF(ret < 0, "unlink(%s) Failed(%d)", full_path, errno); + } + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_company_helper.h b/native/ctsvc_db_plugin_company_helper.h new file mode 100644 index 0000000..93644be --- /dev/null +++ b/native/ctsvc_db_plugin_company_helper.h @@ -0,0 +1,33 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_COMPANY_HELPER_H__ +#define __CTSVC_DB_PLUGIN_COMPANY_HELPER_H__ + +#include "contacts.h" +#include "ctsvc_sqlite.h" + +int ctsvc_db_company_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id); +int ctsvc_db_company_update(contacts_record_h record, int contact_id, bool is_my_profile); +int ctsvc_db_company_delete(int id); + +int ctsvc_db_company_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count); +int ctsvc_company_delete_logo_file(int index); + +#endif // __CTSVC_DB_PLUGIN_COMPANY_HELPER_H__ diff --git a/native/ctsvc_db_plugin_contact.c b/native/ctsvc_db_plugin_contact.c new file mode 100644 index 0000000..f1b9516 --- /dev/null +++ b/native/ctsvc_db_plugin_contact.c @@ -0,0 +1,2089 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_schema.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_query.h" +#include "ctsvc_utils.h" +#include "ctsvc_record.h" +#include "ctsvc_normalize.h" +#include "ctsvc_list.h" +#include "ctsvc_setting.h" +#include "ctsvc_localize_ch.h" +#include "ctsvc_group.h" +#include "ctsvc_notification.h" +#include "ctsvc_localize.h" +#include "ctsvc_person.h" + +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_db_plugin_person_helper.h" + +#define CTSVC_MY_IMAGE_LOCATION "/opt/usr/data/contacts-svc/img/my" + +#define CTSVC_CONTACT_DISPLAY_NAME_MAX_LEN 1024 +#define CTSVC_CONTACT_SEARCH_DATA_MAX_LEN 1024 +#define CTSVC_CONTACT_INITIAL_DATA_MAX_LEN 128 + +static int __ctsvc_db_contact_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_contact_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_contact_update_record( contacts_record_h record ); +static int __ctsvc_db_contact_delete_record( int id ); +static int __ctsvc_db_contact_replace_record( contacts_record_h record, int id ); + +static int __ctsvc_db_contact_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_contact_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_contact_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_contact_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_contact_delete_records(int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_contact = { + .is_query_only = false, + .insert_record = __ctsvc_db_contact_insert_record, + .get_record = __ctsvc_db_contact_get_record, + .update_record = __ctsvc_db_contact_update_record, + .delete_record = __ctsvc_db_contact_delete_record, + .get_all_records = __ctsvc_db_contact_get_all_records, + .get_records_with_query = __ctsvc_db_contact_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_contact_insert_records, + .update_records = NULL,//__ctsvc_db_contact_update_records, + .delete_records = NULL,//__ctsvc_db_contact_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = __ctsvc_db_contact_replace_record, + .replace_records = NULL, +}; + +static int __ctsvc_db_get_contact_base_info(int id, ctsvc_contact_s *contact) +{ + int ret, len; + int i; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + char *temp; + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT contact_id, addressbook_id, person_id, changed_time, %s, " + "display_name_source, image_thumbnail_path, " + "ringtone_path, vibration, uid, is_favorite, has_phonenumber, has_email " + "FROM "CTS_TABLE_CONTACTS" WHERE contact_id = %d AND deleted = 0", + ctsvc_get_display_column(), id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + i = 0; + contact->id = ctsvc_stmt_get_int(stmt, i++); + contact->addressbook_id = ctsvc_stmt_get_int(stmt, i++); + contact->person_id = ctsvc_stmt_get_int(stmt, i++); + contact->changed_time = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + contact->display_name = SAFE_STRDUP(temp); + contact->display_source_type = ctsvc_stmt_get_int(stmt, i++); + + temp = ctsvc_stmt_get_text(stmt, i++); + if (temp) { + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_IMG_FULL_LOCATION, temp); + contact->image_thumbnail_path = strdup(full_path); + } + + temp = ctsvc_stmt_get_text(stmt, i++); + contact->ringtone_path = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + contact->vibration = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + contact->uid = SAFE_STRDUP(temp); + contact->is_favorite = ctsvc_stmt_get_int(stmt, i++); + contact->has_phonenumber = ctsvc_stmt_get_int(stmt, i++); + contact->has_email = ctsvc_stmt_get_int(stmt, i++); +#if 0 + contact->sync_data1 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + contact->sync_data1 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + contact->sync_data1 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + contact->sync_data1 = SAFE_STRDUP(temp); +#endif + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_get_data(int id, ctsvc_contact_s *contact) +{ + int ret, len; + int datatype; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT datatype, id, data.contact_id, is_default, data1, data2, " + "data3, data4, data5, data6, data7, data8, data9, data10, data11, data12 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE data.contact_id = %d AND is_my_profile = 0", id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE */!= ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + do { + datatype = ctsvc_stmt_get_int(stmt, 0); + switch (datatype) { + case CTSVC_DATA_NAME: + ctsvc_get_data_info_name(stmt, (contacts_list_h)contact->name); + break; + case CTSVC_DATA_EVENT: + ctsvc_get_data_info_event(stmt, (contacts_list_h)contact->events); + break; + case CTSVC_DATA_MESSENGER: + ctsvc_get_data_info_messenger(stmt, (contacts_list_h)contact->messengers); + break; + case CTSVC_DATA_POSTAL: + ctsvc_get_data_info_address(stmt, (contacts_list_h)contact->postal_addrs); + break; + case CTSVC_DATA_URL: + ctsvc_get_data_info_url(stmt, (contacts_list_h)contact->urls); + break; + case CTSVC_DATA_NICKNAME: + ctsvc_get_data_info_nickname(stmt, (contacts_list_h)contact->nicknames); + break; + case CTSVC_DATA_NUMBER: + ctsvc_get_data_info_number(stmt, (contacts_list_h)contact->numbers); + break; + case CTSVC_DATA_EMAIL: + ctsvc_get_data_info_email(stmt, (contacts_list_h)contact->emails); + break; + case CTSVC_DATA_PROFILE: + ctsvc_get_data_info_profile(stmt, (contacts_list_h)contact->profiles); + break; + case CTSVC_DATA_RELATIONSHIP: + ctsvc_get_data_info_relationship(stmt, (contacts_list_h)contact->relationships); + break; + case CTSVC_DATA_IMAGE: + ctsvc_get_data_info_image(stmt, (contacts_list_h)contact->images); + break; + case CTSVC_DATA_COMPANY: + ctsvc_get_data_info_company(stmt, (contacts_list_h)contact->company); + break; + case CTSVC_DATA_NOTE: + ctsvc_get_data_info_note(stmt, (contacts_list_h)contact->note); + break; + case CTSVC_DATA_EXTENSION: + ctsvc_get_data_info_extension(stmt, (contacts_list_h)contact->extensions); + break; + default: + CTS_ERR("Intenal : Not supported data type (%d)", datatype); + break; + } + + }while(1 /*CTS_TRUE*/ == cts_stmt_step(stmt)); + + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; + +} + +static inline int __ctsvc_get_contact_grouprel(int contact_id, ctsvc_contact_s *contact) +{ + CTS_FN_CALL; + ctsvc_group_relation_s *grouprel; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + char *temp; + + snprintf(query, sizeof(query), + "SELECT group_id, contact_id, group_name " + " FROM "CTSVC_DB_VIEW_GROUP_RELATION" WHERE contact_id = %d", contact_id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + while (1 /*CTS_TRUE */ == cts_stmt_step(stmt)) { + contacts_record_create(_contacts_group_relation._uri, (contacts_record_h*)&grouprel); + + if (grouprel) { + grouprel->group_id = ctsvc_stmt_get_int(stmt, 0); + grouprel->id = grouprel->group_id; + grouprel->contact_id = ctsvc_stmt_get_int(stmt, 1); + temp = ctsvc_stmt_get_text(stmt, 2); + grouprel->group_name = SAFE_STRDUP(temp); + + ctsvc_list_prepend((contacts_list_h)contact->grouprelations, (contacts_record_h)grouprel); + } + } + + cts_stmt_finalize(stmt); + ctsvc_list_reverse((contacts_list_h)contact->grouprelations); + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_contact_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + contacts_record_h record; + ctsvc_contact_s *contact; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + contacts_record_create(_contacts_contact._uri, &record); + contact = (ctsvc_contact_s *)record; + ret = __ctsvc_db_get_contact_base_info(id, contact); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_get_main_contacts_info(ALL) Failed(%d)", ret); + contacts_record_destroy(record, true); + return ret; + } + + ret = __ctsvc_db_get_data(id, contact); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_get_data_info Failed(%d)", ret); + contacts_record_destroy(record, true); + return ret; + } + + ret = __ctsvc_get_contact_grouprel(id, contact); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_get_group_relations Failed(%d)", ret); + contacts_record_destroy(record, true); + return ret; + } + + *out_record = record; + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_contact_delete_record( int id ) +{ + CTS_FN_CALL; + int ret, rel_changed; + int addressbook_id; + int person_id; + int link_count = 0; + char query[CTS_SQL_MAX_LEN] = {0}; + cts_stmt stmt = NULL; + + snprintf(query, sizeof(query), + "SELECT addressbook_id, person_id " + "FROM "CTS_TABLE_CONTACTS" WHERE contact_id = %d AND deleted = 0", id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + addressbook_id = ctsvc_stmt_get_int(stmt, 0); + person_id = ctsvc_stmt_get_int(stmt, 1); + CTS_DBG("addressbook_id : %d, person_id : %d", addressbook_id, person_id); + cts_stmt_finalize(stmt); + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), + "UPDATE %s SET member_changed_ver=%d " + "WHERE group_id IN (SELECT group_id FROM %s WHERE contact_id = %d AND deleted = 0) ", + CTS_TABLE_GROUPS, ctsvc_get_next_ver(), CTS_TABLE_GROUP_RELATIONS, id); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + rel_changed = cts_db_change(); + // images are deleted by db trigger callback function in ctsvc_db_contact_delete_callback + snprintf(query, sizeof(query), "DELETE FROM %s WHERE contact_id = %d", + CTS_TABLE_CONTACTS, id); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + snprintf(query, sizeof(query), "SELECT link_count FROM "CTS_TABLE_PERSONS" WHERE person_id = %d", person_id); + ret = ctsvc_query_get_first_int_result(query, &link_count); + WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_query_get_first_int_result() Failed(%d)", ret); + // set dirty bit to person by trigger : person will be aggregated in ctsvc_person_aggregate + if (1 < link_count) + ctsvc_person_aggregate(person_id); + else + ctsvc_set_person_noti(); + + ctsvc_set_contact_noti(); + if (rel_changed > 0) + ctsvc_set_group_rel_noti(); + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_safe_strcmp(char *s1, char *s2) +{ + if (NULL == s1 || NULL == s2) + return !(s1 == s2); + else + return strcmp(s1, s2); +} + +static inline void __ctsvc_update_contact_display_name(ctsvc_contact_s *contact) +{ + char *temp_display_name = NULL; + char *display = NULL; + char *sortkey = NULL; + GList *cur; + int ret, len=0, display_len=0; + + ctsvc_name_s *name = NULL; + if ( contact->name->count > 0 && contact->name->records != NULL && contact->name->records->data != NULL ) + { + name = (ctsvc_name_s *)contact->name->records->data; + } + + if ( name && ( name->first || name->last) ) { + if (name->first && name->last){ + temp_display_name = calloc(1, SAFE_STRLEN(name->first) + SAFE_STRLEN(name->first) + 2 ); + snprintf(temp_display_name, SAFE_STRLEN(name->first) + SAFE_STRLEN(name->first) + 2, "%s %s",name->first,name->last); + } + else if (name->first) + temp_display_name = strdup(name->first); + else + temp_display_name = strdup(name->last); + + if (0 != __ctsvc_safe_strcmp(contact->display_name, temp_display_name) + || CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME != contact->display_source_type) { + contact->display_name_changed = true; + + // make display name + display_len = SAFE_STRLEN(name->first) + + SAFE_STRLEN(name->addition) + + SAFE_STRLEN(name->last) + + SAFE_STRLEN(name->suffix) + 5; + + display = calloc(1, display_len); + + if(name->first) + len += snprintf(display + len, display_len - len, "%s", name->first); + + if(name->addition) { + if (*display) + len += snprintf(display + len, display_len - len, " "); + len += snprintf(display + len, display_len - len, "%s", name->addition); + } + + if(name->last) { + if (*display) + len += snprintf(display + len, display_len - len, " "); + len += snprintf(display + len, display_len - len, "%s", name->last); + } + + if(name->suffix) { + if (*display) + len += snprintf(display + len, display_len - len, " "); + len += snprintf(display + len, display_len - len, "%s", name->suffix); + } + contact->display_name = display; + + display = calloc(1, display_len); + // make reverse_display_name + len = 0; + if(name->last) { + len += snprintf(display + len, display_len - len, "%s", name->last); + + if(name->first || name->addition) + len += snprintf(display + len, display_len - len, ","); + } + + if(name->first) { + if (*display) + len += snprintf(display + len, display_len - len, " "); + len += snprintf(display + len, display_len - len, "%s", name->first); + } + + if(name->addition) { + if (*display) + len += snprintf(display + len, display_len - len, " "); + len += snprintf(display + len, display_len - len, "%s", name->addition); + } + + if(name->suffix) { + if (*display) + len += snprintf(display + len, sizeof(display) - len, " "); + len += snprintf(display + len, sizeof(display) - len, "%s", name->suffix); + } + + + contact->reverse_display_name = display; + + ret = ctsvc_check_language_type(contact->display_name); + if (0 <= ret) { + if (ctsvc_get_default_language() == ret) + contact->display_name_language = CTSVC_LANG_DEFAULT; + else if (ctsvc_get_secondary_language() == ret) + contact->display_name_language = CTSVC_LANG_SECONDARY; + else + contact->display_name_language = ret; + } + + ret = ctsvc_collation_str(contact->display_name, &sortkey); + if (CONTACTS_ERROR_NONE == ret) + contact->sortkey = sortkey; + else + free(sortkey); + sortkey = NULL; + + ret = ctsvc_collation_str(contact->reverse_display_name, &sortkey); + if (CONTACTS_ERROR_NONE == ret) + contact->reverse_sortkey = sortkey; + else + free(sortkey); + contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME; + } + + free(temp_display_name); + } + + else { + if (contact->company && contact->company->records) { + for (cur=contact->company->records;cur;cur=cur->next) { + ctsvc_company_s *company = (ctsvc_company_s *)cur->data; + if (company && company->name) { + if (__ctsvc_safe_strcmp(contact->display_name, company->name) + || CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY != contact->display_source_type) { + contact->display_name_changed = true; + contact->display_name = SAFE_STRDUP(company->name); + contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY; + break; + } + } + } + } + else if (contact->nicknames && contact->nicknames->records) { + for (cur=contact->nicknames->records;cur;cur=cur->next) { + ctsvc_nickname_s *nickname = (ctsvc_nickname_s *)cur->data; + if (nickname && nickname->nickname) { + if (__ctsvc_safe_strcmp(contact->display_name, nickname->nickname) + || CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME != contact->display_source_type) { + contact->display_name = SAFE_STRDUP(nickname->nickname); + contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME; + break; + } + } + } + } + else if (contact->numbers && contact->numbers->records) { + for (cur=contact->numbers->records;cur;cur=cur->next) { + ctsvc_number_s *number = (ctsvc_number_s *)cur->data; + if (number && number->number) { + if (__ctsvc_safe_strcmp(contact->display_name, number->number) + || CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NUMBER != contact->display_source_type) { + contact->display_name_changed = true; + contact->display_name = SAFE_STRDUP(number->number); + contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NUMBER; + break; + } + } + } + } + else if (contact->emails && contact->emails->records) { + for (cur=contact->emails->records;cur;cur=cur->next) { + ctsvc_email_s *email = (ctsvc_email_s*)cur->data; + if (email && email->email_addr) { + if (__ctsvc_safe_strcmp(contact->display_name, email->email_addr) + || CONTACTS_DISPLAY_NAME_SOURCE_TYPE_EMAIL != contact->display_source_type) { + contact->display_name_changed = true; + contact->display_name = SAFE_STRDUP(email->email_addr); + contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_EMAIL; + break; + } + } + } + } + + if (contact->display_name_changed) { + contact->reverse_display_name = SAFE_STRDUP(contact->display_name); + + ret = ctsvc_check_language_type(contact->display_name); + if (0 <= ret) { + if (ctsvc_get_default_language() == ret) + contact->display_name_language = CTSVC_LANG_DEFAULT; + else if (ctsvc_get_secondary_language() == ret) + contact->display_name_language = CTSVC_LANG_SECONDARY; + else + contact->display_name_language = ret; + } + + ret = ctsvc_collation_str(contact->display_name, &sortkey); + if (CONTACTS_ERROR_NONE == ret) { + contact->sortkey = sortkey; + contact->reverse_sortkey = strdup(sortkey); + } + else + free(sortkey); + } + } + return; +} + +static inline int __ctsvc_update_contact_data(ctsvc_contact_s *contact) +{ + int ret; + + if (contact->name) { + ret = ctsvc_contact_update_data_name((contacts_list_h)contact->name, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_name() Failed(%d)", ret); + return ret; + } + } + + if (contact->company) { + ret = ctsvc_contact_update_data_company((contacts_list_h)contact->company, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_company() Failed(%d)", ret); + return ret; + } + } + + if (contact->note) { + ret = ctsvc_contact_update_data_note((contacts_list_h)contact->note, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_note() Failed(%d)", ret); + return ret; + } + } + + if (contact->events) { + ret = ctsvc_contact_update_data_event((contacts_list_h)contact->events, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_events() Failed(%d)", ret); + return ret; + } + } + + if (contact->messengers) { + ret = ctsvc_contact_update_data_messenger((contacts_list_h)contact->messengers, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_messengers() Failed(%d)", ret); + return ret; + } + } + + if (contact->postal_addrs) { + ret = ctsvc_contact_update_data_address((contacts_list_h)contact->postal_addrs, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_address() Failed(%d)", ret); + return ret; + } + } + + if (contact->urls) { + ret = ctsvc_contact_update_data_url((contacts_list_h)contact->urls, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_url() Failed(%d)", ret); + return ret; + } + } + + if (contact->nicknames) { + ret = ctsvc_contact_update_data_nickname((contacts_list_h)contact->nicknames, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_nickname() Failed(%d)", ret); + return ret; + } + } + + if (contact->numbers) { + bool had_phonenumber; + ret = ctsvc_contact_update_data_number((contacts_list_h)contact->numbers, contact->id, false, &had_phonenumber); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_number() Failed(%d)", ret); + return ret; + } + contact->has_phonenumber = had_phonenumber; + } + + if (contact->emails) { + bool had_email; + ret = ctsvc_contact_update_data_email((contacts_list_h)contact->emails, contact->id, false, &had_email); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_email() Failed(%d)", ret); + return ret; + } + contact->has_email = had_email; + } + + if (contact->profiles) { + ret = ctsvc_contact_update_data_profile((contacts_list_h)contact->profiles, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_profile() Failed(%d)", ret); + return ret; + } + } + + if (contact->relationships) { + ret = ctsvc_contact_update_data_relationship((contacts_list_h)contact->relationships, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_relationship() Failed(%d)", ret); + return ret; + } + } + + if (contact->images) { + ret = ctsvc_contact_update_data_image((contacts_list_h)contact->images, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_image() Failed(%d)", ret); + return ret; + } + } + + if (contact->extensions) { + ret = ctsvc_contact_update_data_extension((contacts_list_h)contact->extensions, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_extension() Failed(%d)", ret); + return ret; + } + } + + return CONTACTS_ERROR_NONE; +} + +static void __ctsvc_contact_check_default_data(ctsvc_contact_s *contact) +{ + if (contact->numbers) + contact->has_phonenumber = ctsvc_contact_check_default_number((contacts_list_h)contact->numbers); + if (contact->emails) + contact->has_email = ctsvc_contact_check_default_email((contacts_list_h)contact->emails); + if (contact->images) + ctsvc_contact_check_default_image((contacts_list_h)contact->images); +} + +static inline int __ctsvc_update_contact_grouprel(int contact_id, contacts_list_h group_list) +{ + CTS_FN_CALL; + ctsvc_group_relation_s *grouprel; + ctsvc_list_s *list = (ctsvc_list_s*)group_list; + int rel_changed = 0; + unsigned int count; + int ret; + GList *cursor; + + RETV_IF(NULL == group_list, CONTACTS_ERROR_INVALID_PARAMETER); + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + grouprel = (ctsvc_group_relation_s *)cursor->data; + ret = ctsvc_group_remove_contact_in_transaction(grouprel->group_id, contact_id); + if (0 < ret) + rel_changed += ret; + } + + ret = contacts_list_get_count(group_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(group_list); + do { + contacts_list_get_current_record_p(group_list, (contacts_record_h*)&grouprel); + if (NULL == grouprel) + continue; + + if (grouprel->group_id) { + ret = ctsvc_group_add_contact_in_transaction(grouprel->group_id, contact_id); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_db_group_set_relation() Failed(%d)", ret); + if (0 < ret) + rel_changed += ret; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(group_list)); + + if (rel_changed) + return rel_changed; + else + return CONTACTS_ERROR_NONE; +} + +static inline void __ctsvc_contact_get_initial(char *src, char *dest, int dest_size, bool pinyin ) +{ + int i, j=0; + bool bFirst = true; + int len = strlen(src); + for(i = 0; i < len && j < (dest_size-1); i++) + { + if (src[i] == ' ') { + bFirst=true; + } else if (bFirst) { + dest[j++] = src[i]; + if (!pinyin) + dest[j++] = ' '; + bFirst = false; + } + } + CTS_DBG("src(%s) dest(%s)", src, dest); +} + +static inline void __ctsvc_remove_space(char *src, char *dest, int dest_size) +{ + int len = strlen(src); + int i, j=0; + + for(i=0; i < len && i < dest_size; i++) { + if (src[i] && src[i] != ' ') { + dest[j] = src[i]; + j++; + } + } + dest[j] = '\0'; +} + +static inline int __ctsvc_contact_make_search_name(ctsvc_contact_s *contact, char **search_name) { + char *name = NULL; + int buf_size, ret; + + if (contact->display_name) { + if (ctsvc_has_chinese(contact->display_name)) { + pinyin_name_s *pinyinname; + int size, i; + + ret = ctsvc_convert_chinese_to_pinyin(contact->display_name, &pinyinname, &size); + + if (CONTACTS_ERROR_NONE == ret) { + char *name_nospace = calloc(1, CHINESE_PINYIN_SPELL_MAX_LEN); + char *temp_name = NULL; + + name = calloc(1, strlen(contact->display_name)* 5); + + ctsvc_normalize_str(contact->display_name, name, strlen(contact->display_name)* 5); + + for(i=0; idisplay_name)* 5); + + ctsvc_normalize_str(contact->display_name, normalized_display_name, strlen(contact->display_name)* 5); + __ctsvc_contact_get_initial(contact->display_name, initial, sizeof(initial), false); + buf_size = SAFE_STRLEN(normalized_display_name) + strlen(initial) + 2; + name = calloc(1, buf_size); + snprintf(name, buf_size, "%s %s", normalized_display_name, initial); + + free(normalized_display_name); + } + } + else if (CTSVC_LANG_KOREAN == ctsvc_check_language_type(contact->display_name)) { + char *temp_name = NULL; + char *chosung = calloc(1, strlen(contact->display_name) + 1); + int count, i, j; + int full_len, chosung_len; + int total_len = strlen(contact->display_name); + + count = ctsvc_get_chosung(contact->display_name, chosung, strlen(contact->display_name) + 1 ); + + name = calloc(1, strlen(contact->display_name)* 5); + + ctsvc_normalize_str(contact->display_name, name, strlen(contact->display_name)* 5); + + if (count > 0) { + for(i=0, j=0; i < total_len; i+=full_len, j+=chosung_len) { + full_len = ctsvc_check_utf8(contact->display_name[i]); + chosung_len = ctsvc_check_utf8(chosung[j]); + + buf_size = SAFE_STRLEN(name) + SAFE_STRLEN(&contact->display_name[i]) + SAFE_STRLEN(&chosung[j]) + 3; + temp_name = calloc(1, buf_size); + + snprintf(temp_name, buf_size, "%s %s %s", name, &contact->display_name[i], &chosung[j]); + + free(name); + name = temp_name; + } + } + free(chosung); + } + else { + char initial[CTSVC_CONTACT_INITIAL_DATA_MAX_LEN] = {0,}; + char *normalized_display_name=NULL; + + normalized_display_name = calloc(1, strlen(contact->display_name)* 5); + + ctsvc_normalize_str(contact->display_name, normalized_display_name, strlen(contact->display_name)* 5); + __ctsvc_contact_get_initial(contact->display_name, initial, sizeof(initial), false); + buf_size = SAFE_STRLEN(normalized_display_name) + strlen(initial) + 2; + name = calloc(1, buf_size); + snprintf(name, buf_size, "%s %s", normalized_display_name, initial); + + free(normalized_display_name); + } + } + *search_name = name; + return CONTACTS_ERROR_NONE; +} + + +static inline int __ctsvc_contact_make_search_data(int contact_id, char **search_name, + char **search_number, char **search_data) +{ + int ret, len = 0; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_contact_s *contact; + + char *number = NULL; + char *data = NULL; + char *temp_number=NULL; + char *temp_data=NULL; + int buf_size=0; + + ret = contacts_db_get_record(_contacts_contact._uri, contact_id, (contacts_record_h*)&contact); + if (CONTACTS_ERROR_NO_DATA == ret) { + int r; + snprintf(query, sizeof(query), "DELETE FROM %s WHERE contact_id = %d", + CTS_TABLE_SEARCH_INDEX, contact_id); + r = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != r) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", r); + return r; + } + return ret; + } + else if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("contacts_db_get_record() Failed(%d)", ret); + return ret; + } + + __ctsvc_contact_make_search_name(contact, search_name); + + if (contact->numbers) { + contacts_list_h number_list = (contacts_list_h)contact->numbers; + ctsvc_number_s *number_record; + contacts_list_first(number_list); + len = 0; + do { + contacts_list_get_current_record_p(number_list, (contacts_record_h*)&number_record); + if (NULL != number_record) { + buf_size = SAFE_STRLEN(number) + SAFE_STRLEN(number_record->lookup) + 3; + temp_number = calloc(1, buf_size); + if (number) + snprintf(temp_number, buf_size, "%s %s ", SAFE_STR(number), number_record->lookup); + else + snprintf(temp_number, buf_size, "%s ", number_record->lookup); + free(number); + number = temp_number; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(number_list)); + } + + len = 0; + if (contact->emails) { + contacts_list_h email_list = (contacts_list_h)contact->emails; + ctsvc_email_s *email; + contacts_list_first(email_list); + do { + contacts_list_get_current_record_p(email_list, (contacts_record_h*)&email); + if (NULL != email) { + buf_size = SAFE_STRLEN(data) + SAFE_STRLEN(email->email_addr) + 3; + temp_data = calloc(1, buf_size); + if (data) + snprintf(temp_data, buf_size, "%s %s ",data, email->email_addr); + else + snprintf(temp_data, buf_size, "%s ",email->email_addr); + free(data); + data = temp_data; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(email_list)); + } + + if (contact->nicknames) { + contacts_list_h nickname_list = (contacts_list_h)contact->nicknames; + ctsvc_nickname_s *nickname; + contacts_list_first(nickname_list); + do { + contacts_list_get_current_record_p(nickname_list, (contacts_record_h*)&nickname); + if (NULL != nickname) { + buf_size = SAFE_STRLEN(data) + SAFE_STRLEN(nickname->nickname) + 3; + temp_data = calloc(1, buf_size); + if (data) + snprintf(temp_data, buf_size, "%s %s ", data, nickname->nickname); + else + snprintf(temp_data+len, buf_size, "%s ", nickname->nickname); + free(data); + data = temp_data; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(nickname_list)); + } + + if (contact->postal_addrs) { + contacts_list_h address_list = (contacts_list_h)contact->postal_addrs; + ctsvc_address_s *address; + contacts_list_first(address_list); + do { + contacts_list_get_current_record_p(address_list, (contacts_record_h*)&address); + if (NULL != address) { + len =0; + buf_size = SAFE_STRLEN(data) + + SAFE_STRLEN(address->country) + + SAFE_STRLEN(address->pobox) + + SAFE_STRLEN(address->postalcode) + + SAFE_STRLEN(address->region) + + SAFE_STRLEN(address->locality) + + SAFE_STRLEN(address->street) + + SAFE_STRLEN(address->extended) + 9; + temp_data = calloc(1, buf_size); + if(data) + len += snprintf(temp_data + len, buf_size - len, "%s ", data); + if (address->country) + len += snprintf(temp_data + len, buf_size - len, "%s ", address->country); + if (address->pobox) + len += snprintf(temp_data + len, buf_size - len, "%s ", address->pobox); + if (address->postalcode) + len += snprintf(temp_data + len, buf_size - len, "%s ", address->postalcode); + if (address->region) + len += snprintf(temp_data + len, buf_size - len, "%s ", address->region); + if (address->locality) + len += snprintf(temp_data + len, buf_size - len, "%s ", address->locality); + if (address->street) + len += snprintf(temp_data + len, buf_size - len, "%s ", address->street); + if (address->extended) + len += snprintf(temp_data + len, buf_size - len, "%s ", address->extended); + free(data); + data = temp_data; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(address_list)); + } + + contacts_record_destroy((contacts_record_h)contact, true); + + *search_number = number; + *search_data = data; + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_update_contact_search_data(int contact_id) +{ + int ret; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + char *search_name = NULL; + char *search_number = NULL; + char *search_data = NULL; + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), + "UPDATE %s SET name=?, number=?, data=? " + "WHERE contact_id = %d", + CTS_TABLE_SEARCH_INDEX, contact_id); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare() Failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + ret = __ctsvc_contact_make_search_data(contact_id, &search_name, &search_number, &search_data); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_make_contact_search_data() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + + if (search_name) + cts_stmt_bind_text(stmt, 1, search_name); + if(search_number) + cts_stmt_bind_text(stmt, 2, search_number); + if(search_data) + cts_stmt_bind_text(stmt, 3, search_data); + + ret = cts_stmt_step(stmt); + + free(search_name); + free(search_number); + free(search_data); + + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + cts_stmt_finalize(stmt); + + ret = ctsvc_end_trans(true); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_end_trans() Failed(%d)", ret); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_contact_update_record( contacts_record_h record ) +{ + int i, ret, len; + int rel_changed = 0; + int count; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_contact_s *contact = (ctsvc_contact_s*)record; + cts_stmt stmt; + + snprintf(query, sizeof(query), + "SELECT count(contact_id) FROM "CTS_TABLE_CONTACTS" " + "WHERE contact_id = %d AND deleted = 0", contact->id); + ret = ctsvc_query_get_first_int_result(query, &count); + RETVM_IF(1 != count, CONTACTS_ERROR_NO_DATA, + "The index(%d) is Invalid. %d Record(s) is(are) found", contact->id, ret); + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + __ctsvc_update_contact_display_name(contact); + __ctsvc_contact_check_default_data(contact); + + //update data + ret = __ctsvc_update_contact_data(contact); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("__ctsvc_update_contact_data() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + if (contact->grouprelations) { + rel_changed = __ctsvc_update_contact_grouprel(contact->id, (contacts_list_h)contact->grouprelations); + if (rel_changed < CONTACTS_ERROR_NONE) { + CTS_ERR("cts_update_contact_grouprel() Failed(%d)", rel_changed); + ctsvc_end_trans(false); + return rel_changed; + } + } + + ////////////////////////////////////////////////////////////////////// + // this code will be removed. + free(contact->image_thumbnail_path); + contact->image_thumbnail_path = NULL; + contact->image_thumbnail_changed = false; + + if (contact->images) { + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + ctsvc_list_s *list = (ctsvc_list_s*)contact->images; + ctsvc_image_s *image; + GList *cursor; + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + image = (ctsvc_image_s *)cursor->data; + contact->image_thumbnail_path = NULL; + } + + contacts_list_get_count((contacts_list_h)contact->images, &count); + if (count) { + contacts_list_first((contacts_list_h)contact->images); + ret = contacts_list_get_current_record_p((contacts_list_h)contact->images, &record); + + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("contacts_list_get_current_record_p() Failed(%d)", ret); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + image = (ctsvc_image_s*)record; + + if ( image->path && *image->path && strstr(image->path, CTS_IMG_FULL_LOCATION) != NULL) + contact->image_thumbnail_path = SAFE_STRDUP( image->path + strlen(CTS_IMG_FULL_LOCATION) + 1); + else + contact->image_thumbnail_path = SAFE_STRDUP(image->path); + + } + contact->image_thumbnail_changed = true; + } + // this code will be removed. + ////////////////////////////////////////////////////////////////////// + + len = snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver=%d, changed_time=%d, " + "has_phonenumber=%d, has_email=%d ", + ctsvc_get_next_ver(), (int)time(NULL), + contact->has_phonenumber, contact->has_email); + + if (contact->display_name_changed) + len += snprintf(query+len, sizeof(query)-len, ", display_name=?, " + "reverse_display_name=?, display_name_source=?, display_name_language=?, " + "sortkey=?, reverse_sortkey=?"); + + if (contact->uid_changed) + len += snprintf(query+len, sizeof(query)-len, ", uid=?"); + + if (contact->ringtone_changed) + len += snprintf(query+len, sizeof(query)-len, ", ringtone_path=?"); + + if (contact->vibration_changed) + len += snprintf(query+len, sizeof(query)-len, ", vibration=?"); + + if (contact->image_thumbnail_changed) + len += snprintf(query+len, sizeof(query)-len, ", image_thumbnail_path=?"); + + snprintf(query+len, sizeof(query)-len, " WHERE contact_id=%d", contact->id); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare() Failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + i=1; + if (contact->display_name_changed) { + cts_stmt_bind_text(stmt, i++, contact->display_name); + cts_stmt_bind_text(stmt, i++, contact->reverse_display_name); + cts_stmt_bind_int(stmt, i++, contact->display_source_type); + cts_stmt_bind_int(stmt, i++, contact->display_name_language); + cts_stmt_bind_text(stmt, i++, contact->sortkey); + cts_stmt_bind_text(stmt, i++, contact->reverse_sortkey); + } + if (contact->uid_changed) { + if(contact->uid) + cts_stmt_bind_text(stmt, i, contact->uid); + i++; + } + if (contact->ringtone_changed) { + if (contact->ringtone_path) + cts_stmt_bind_text(stmt, i, contact->ringtone_path); + i++; + } + if (contact->vibration_changed) { + if (contact->vibration) + cts_stmt_bind_text(stmt, i, contact->vibration); + i++; + } + + if (contact->image_thumbnail_changed ) { + if (contact->image_thumbnail_path) { + cts_stmt_bind_text(stmt, i, contact->image_thumbnail_path); + } + i++; + } + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + cts_stmt_finalize(stmt); + + ctsvc_set_contact_noti(); + if (0 < rel_changed) + ctsvc_set_group_rel_noti(); + + __ctsvc_update_contact_search_data(contact->id); + ctsvc_db_update_person((contacts_record_h)contact); + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_contact_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int ret; + int len; + int contact_id; + cts_stmt stmt; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_list_h list; + + len = snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTS_TABLE_CONTACTS" WHERE deleted = 0"); + + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + contact_id = ctsvc_stmt_get_int(stmt, 0); + ret = contacts_db_get_record(_contacts_contact._uri, contact_id, &record); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : contacts_db_get_record() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return CONTACTS_ERROR_NO_DATA; + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_contact_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_contact_s *contact; + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + bool had_contact_id = false; + int contact_id = 0; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + if (s_query->projection) { + for (i=0;iprojection_count;i++) { + if (s_query->projection[i] == CTSVC_PROPERTY_CONTACT_ID) { + had_contact_id = true; + break; + } + } + } + else + had_contact_id = true; + + if (!had_contact_id) { + s_query->projection = realloc(s_query->projection, s_query->projection_count+1); + s_query->projection[s_query->projection_count] = CTSVC_PROPERTY_CONTACT_ID; + s_query->projection_count++; + } + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_contact._uri, &record); + contact = (ctsvc_contact_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else + field_count = s_query->projection_count; + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_CONTACT_ID: + contact_id = ctsvc_stmt_get_int(stmt, i); + if (had_contact_id) + contact->id = contact_id; + break; + case CTSVC_PROPERTY_CONTACT_DISPLAY_NAME: + temp = ctsvc_stmt_get_text(stmt, i); + contact->display_name = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID: + contact->display_source_type = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID: + contact->addressbook_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_CONTACT_RINGTONE: + temp = ctsvc_stmt_get_text(stmt, i); + contact->ringtone_path = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL: + temp = ctsvc_stmt_get_text(stmt, i); + if (temp && *temp) { + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_IMG_FULL_LOCATION, temp); + contact->image_thumbnail_path = strdup(full_path); + } + break; + case CTSVC_PROPERTY_CONTACT_IS_FAVORITE: + contact->is_favorite = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER: + contact->has_phonenumber = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_CONTACT_HAS_EMAIL: + contact->has_email = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_CONTACT_PERSON_ID: + contact->person_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_CONTACT_UID: + temp = ctsvc_stmt_get_text(stmt, i); + contact->uid = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_CONTACT_VIBRATION: + temp = ctsvc_stmt_get_text(stmt, i); + contact->vibration = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_CONTACT_CHANGED_TIME: + contact->changed_time = ctsvc_stmt_get_int(stmt, i); + break; + default: + break; + } + } + ret = __ctsvc_db_get_data(contact_id, contact); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_get_data_info Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + ret = __ctsvc_get_contact_grouprel(contact_id, contact); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_get_group_relations Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_contact_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_contact_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_contact_delete_records(int ids[], int count) { return CONTACTS_ERROR_NONE; } + +static int __ctsvc_contact_insert_data(ctsvc_contact_s *contact) +{ + int ret; + + DBG("B ctsvc_contact_insert_data_name"); + //Insert the name + if (contact->name) { + ret = ctsvc_contact_insert_data_name((contacts_list_h)contact->name, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_insert_data_name() Failed(%d)", ret); + return ret; + } + } + DBG("A ctsvc_contact_insert_data_name"); + + //Insert the company + if (contact->company) { + ret = ctsvc_contact_insert_data_company((contacts_list_h)contact->company, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_insert_contact_data_company() Failed(%d)", ret); + return ret; + } + } + + //Insert the events + if (contact->events) { + ret = ctsvc_contact_insert_data_event((contacts_list_h)contact->events, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_insert_contact_data_event() Failed(%d)", ret); + return ret; + } + } + + //Insert the messengers + if (contact->messengers) { + ret = ctsvc_contact_insert_data_messenger((contacts_list_h)contact->messengers, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_insert_contact_data_messenger() Failed(%d)", ret); + return ret; + } + } + + //Insert the postals + if (contact->postal_addrs) { + ret = ctsvc_contact_insert_data_address((contacts_list_h)contact->postal_addrs, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_insert_contact_data_postal() Failed(%d)", ret); + return ret; + } + } + + //Insert the Web addrs + if (contact->urls) { + ret = ctsvc_contact_insert_data_url((contacts_list_h)contact->urls, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_insert_contact_data_web() Failed(%d)", ret); + return ret; + } + } + + //Insert the Nick names + if (contact->nicknames) { + ret = ctsvc_contact_insert_data_nickname((contacts_list_h)contact->nicknames, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_insert_contact_data_nickname() Failed(%d)", ret); + return ret; + } + } + + //Insert the numbers + if (contact->numbers) { + ret = ctsvc_contact_insert_data_number((contacts_list_h)contact->numbers, contact->id, false); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_contact_insert_data_number() Failed(%d)", ret); + return ret; + } + } + + //Insert the emails + if (contact->emails) { + ret = ctsvc_contact_insert_data_email((contacts_list_h)contact->emails, contact->id, false); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_insert_contact_data_email() Failed(%d)", ret); + return ret; + } + } + + //Insert the profile values + if (contact->profiles) { + ret = ctsvc_contact_insert_data_profile((contacts_list_h)contact->profiles, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_insert_contact_data_profile() Failed(%d)", ret); + return ret; + } + } + + //Insert the relationship values + if (contact->relationships) { + ret = ctsvc_contact_insert_data_relationship((contacts_list_h)contact->relationships, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_insert_data_relationship() Failed(%d)", ret); + return ret; + } + } + + //Insert the image values + if (contact->images) { + ret = ctsvc_contact_insert_data_image((contacts_list_h)contact->images, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_insert_data_image() Failed(%d)", ret); + return ret; + } + } + + //Insert the note values + if (contact->note) { + ret = ctsvc_contact_insert_data_note((contacts_list_h)contact->note, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_insert_data_note() Failed(%d)", ret); + return ret; + } + } + + //Insert the extensions values + if (contact->extensions) { + ret = ctsvc_contact_insert_data_extension((contacts_list_h)contact->extensions, contact->id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_insert_data_extension() Failed(%d)", ret); + return ret; + } + } + + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_contact_insert_search_data(int contact_id) +{ + int ret; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + char *search_name = NULL; + char *search_number = NULL; + char *search_data = NULL; + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), "DELETE FROM %s WHERE contact_id = %d", + CTS_TABLE_SEARCH_INDEX, contact_id); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "INSERT INTO %s(contact_id, name, number, data) " + "VALUES(%d, ?, ?, ?)", + CTS_TABLE_SEARCH_INDEX, contact_id); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare() Failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + ret = __ctsvc_contact_make_search_data(contact_id, &search_name, &search_number, &search_data); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("__ctsvc_contact_make_search_data() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + + if(search_name) + cts_stmt_bind_text(stmt, 1, search_name); + if(search_number) + cts_stmt_bind_text(stmt, 2, search_number); + if(search_data) + cts_stmt_bind_text(stmt, 3, search_data); + + ret = cts_stmt_step(stmt); + + free(search_name); + free(search_number); + free(search_data); + + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + cts_stmt_finalize(stmt); + + ret = ctsvc_end_trans(true); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_end_trans() Failed(%d)", ret); + + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_contact_insert_grouprel(int contact_id, contacts_list_h group_list) +{ + CTS_FN_CALL; + ctsvc_group_relation_s *grouprel; + int rel_changed = 0; + unsigned int count; + int ret; + + RETV_IF(NULL == group_list, CONTACTS_ERROR_INVALID_PARAMETER); + ret = contacts_list_get_count(group_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(group_list); + do { + contacts_list_get_current_record_p(group_list, (contacts_record_h*)&grouprel); + if (NULL == grouprel || grouprel->base.deleted) + continue; + + if (grouprel->group_id) { + int ret = ctsvc_group_add_contact_in_transaction(grouprel->group_id, contact_id); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_db_group_set_relation() Failed(%d)", ret); + if (0 < ret) + rel_changed += ret; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(group_list)); + + if (rel_changed) + return rel_changed; + else + return CONTACTS_ERROR_NONE; +} + +inline static int __ctsvc_find_person_to_link_with_number(const char *normalized_number, int *person_id) +{ + int ret; + + char query[CTS_SQL_MIN_LEN] = {0}; + char normal_num[CTSVC_NUMBER_MAX_LEN] = {0}; + char clean_num[CTSVC_NUMBER_MAX_LEN] = {0}; + + ret = ctsvc_clean_number(normalized_number, clean_num, sizeof(clean_num)); + if (0 < ret) { + ret = ctsvc_normalize_number(clean_num, normal_num, CTSVC_NUMBER_MAX_LEN); + snprintf(query, sizeof(query), + "SELECT C.person_id FROM "CTS_TABLE_CONTACTS" C, "CTS_TABLE_DATA" D " + "ON C.contact_id=D.contact_id AND D.datatype=%d AND C.deleted = 0 " + "WHERE D.data4='%s' AND D.is_my_profile = 0", + CTSVC_DATA_NUMBER, normal_num); + ret = ctsvc_query_get_first_int_result(query, person_id); + CTS_DBG("%s", query); + CTS_DBG("result ret(%d) person_id(%d)", ret, *person_id); + return ret; + } + + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +inline static int __ctsvc_find_person_to_link_with_email(const char *email_addr, int *person_id) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), + "SELECT C.person_id FROM "CTS_TABLE_CONTACTS" C, "CTS_TABLE_DATA" D " + "ON C.contact_id=D.contact_id AND D.datatype=%d AND C.deleted = 0 " + "WHERE D.data3='%s' AND D.is_my_profile = 0", + CTSVC_DATA_EMAIL, email_addr); + ret = ctsvc_query_get_first_int_result(query, person_id); + CTS_DBG("%s", query); + CTS_DBG("result ret(%d) person_id(%d)", ret, *person_id); + + return ret; +} + + +inline static int __ctsvc_find_person_to_link(contacts_record_h record, int *person_id) +{ + int ret; + ctsvc_contact_s *contact = (ctsvc_contact_s*)record; + ctsvc_number_s *number_data; + ctsvc_email_s *email_data; + GList *cursor; + + for(cursor = contact->numbers->records;cursor;cursor=cursor->next) { + number_data = (ctsvc_number_s *)cursor->data; + if (number_data && number_data->number && number_data->number[0]){ + ret = __ctsvc_find_person_to_link_with_number(number_data->number, person_id); + + if (ret == CONTACTS_ERROR_NONE && *person_id > 0) + return ret; + } + } + + for(cursor = contact->emails->records;cursor;cursor=cursor->next) { + email_data = (ctsvc_email_s *)cursor->data; + if (email_data && email_data->email_addr && email_data->email_addr[0]){ + ret = __ctsvc_find_person_to_link_with_email(email_data->email_addr, person_id); + + if (ret == CONTACTS_ERROR_NONE && *person_id > 0) + return ret; + } + } + + return CONTACTS_ERROR_NO_DATA; +} + + +static int __ctsvc_db_contact_insert_record( contacts_record_h record, int *id) +{ + int version; + int ret, person_id = 0; + char query[CTS_SQL_MAX_LEN] = {0}; + bool auto_link_enabled = true; + + ctsvc_contact_s *contact = (ctsvc_contact_s*)record; + int rel_changed = 0; + cts_stmt stmt; + + // These check should be done in client side +// RETVM_IF(contact->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted contact record"); + RETVM_IF(NULL == contact, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact is NULL"); + RETVM_IF(contact->addressbook_id < 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : addressbook_id(%d) is mandatory field to insert contact record ", contact->addressbook_id); + RETVM_IF(0 < contact->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", contact->id); + + ret = ctsvc_begin_trans(); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + ret = cts_db_get_next_id(CTS_TABLE_CONTACTS); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("cts_db_get_next_id() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + contact->id = ret; + if (id) + *id = ret; + + DBG("B ctsvc_make_contact_display_name"); + ctsvc_make_contact_display_name(contact); + DBG("A ctsvc_make_contact_display_name"); + __ctsvc_contact_check_default_data(contact); + + //Insert Data + ret = __ctsvc_contact_insert_data(contact); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_insert_contact_data() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ////////////////////////////////////////////////////////////////////// + // this code will be removed. + free(contact->image_thumbnail_path); + contact->image_thumbnail_path = NULL; + + if (contact->images) { + ctsvc_image_s *image; + unsigned int count = 0; + + contacts_list_get_count((contacts_list_h)contact->images, &count); + + while (count) { + contacts_list_first((contacts_list_h)contact->images); + ret = contacts_list_get_current_record_p((contacts_list_h)contact->images, (contacts_record_h*)&image); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("contacts_list_get_current_record_p() Failed(%d)", ret); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + if (image->path && image->is_default) { + contact->image_thumbnail_path = strdup(image->path); + break; + } + count--; + } + } + // this code will be removed. + ////////////////////////////////////////////////////////////////////// + + version = ctsvc_get_next_ver(); + + if (auto_link_enabled) { + ret = __ctsvc_find_person_to_link((contacts_record_h)contact, &person_id); + CTS_DBG("__ctsvc_find_person_to_link return %d , person_id(%d)", ret, person_id); + if (ret == CONTACTS_ERROR_NONE && person_id > 0) { + contact->person_id = person_id; + } + else { + ret = ctsvc_db_insert_person((contacts_record_h)contact); + CTS_DBG("ctsvc_db_insert_person return %d, person_id(%d)", ret, person_id); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_db_insert_person() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + contact->person_id = ret; + } + } + else { + ret = ctsvc_db_insert_person((contacts_record_h)contact); + CTS_DBG("ctsvc_db_insert_person return %d, person_id(%d)", ret, person_id); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_db_insert_person() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + contact->person_id = ret; + } + + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_CONTACTS"(contact_id, person_id, addressbook_id, is_restricted, " + "created_ver, changed_ver, changed_time, has_phonenumber, has_email, " + "display_name, reverse_display_name, display_name_source, display_name_language, " + "sortkey, reverse_sortkey, " + "uid, ringtone_path, vibration, image_thumbnail_path) " + "VALUES(%d, %d, %d, %d, %d, %d, %d, %d, %d, ?, ?, %d, %d, ?, ?, ?, ?, ?, ?)", + contact->id, contact->person_id, contact->addressbook_id, contact->is_restricted, + version, version, (int)time(NULL), contact->has_phonenumber, contact->has_email, + contact->display_source_type, contact->display_name_language); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare() Failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + if (contact->display_name) + cts_stmt_bind_text(stmt, 1, contact->display_name); + if (contact->reverse_display_name) + cts_stmt_bind_text(stmt, 2, contact->reverse_display_name); + if (contact->sortkey) + cts_stmt_bind_text(stmt, 3, contact->sortkey); + if (contact->reverse_sortkey) + cts_stmt_bind_text(stmt, 4, contact->reverse_sortkey); + if (contact->uid) + cts_stmt_bind_text(stmt, 5, contact->uid); + if (contact->ringtone_path) + cts_stmt_bind_text(stmt, 6, contact->ringtone_path); + if (contact->vibration) + cts_stmt_bind_text(stmt, 7, contact->vibration); + if (contact->image_thumbnail_path) + cts_stmt_bind_text(stmt, 8, contact->image_thumbnail_path); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + cts_stmt_finalize(stmt); + + //Insert group Info + if (contact->grouprelations) { + rel_changed = __ctsvc_contact_insert_grouprel(contact->id, (contacts_list_h)contact->grouprelations); + if (rel_changed < CONTACTS_ERROR_NONE) { + CTS_ERR("__ctsvc_contact_insert_grouprel() Failed(%d)", rel_changed); + ctsvc_end_trans(false); + return rel_changed; + } + } + + DBG("B __ctsvc_contact_insert_search_data"); + __ctsvc_contact_insert_search_data(contact->id); + DBG("A __ctsvc_contact_insert_search_data"); + + if (rel_changed) + ctsvc_set_group_rel_noti(); + ctsvc_set_contact_noti(); + + ret = ctsvc_end_trans(true); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_svc_end_trans() Failed(%d)", ret); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_contact_replace_record( contacts_record_h record, int contact_id ) +{ + CTS_FN_CALL; + int ret, len; + int rel_changed = 0; + int count; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_contact_s *contact = (ctsvc_contact_s*)record; + cts_stmt stmt; + + snprintf(query, sizeof(query), + "SELECT count(contact_id) FROM "CTS_TABLE_CONTACTS" " + "WHERE contact_id = %d AND deleted = 0", contact_id); + ret = ctsvc_query_get_first_int_result(query, &count); + RETVM_IF(1 != count, CONTACTS_ERROR_NO_DATA, + "The index(%d) is Invalid. %d Record(s) is(are) not found", contact->id, ret); + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + contact->id = contact_id; + __ctsvc_update_contact_display_name(contact); + __ctsvc_contact_check_default_data(contact); + + //remove current child data + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE contact_id = %d", contact_id); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = __ctsvc_contact_insert_data(contact); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("__ctsvc_contact_insert_data() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + //remove current child data + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_GROUP_RELATIONS" WHERE contact_id = %d", contact_id); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + if (contact->grouprelations) { + rel_changed = __ctsvc_contact_insert_grouprel(contact_id, (contacts_list_h)contact->grouprelations); + if (rel_changed < CONTACTS_ERROR_NONE) { + CTS_ERR("__ctsvc_contact_insert_grouprel() Failed(%d)", rel_changed); + ctsvc_end_trans(false); + return rel_changed; + } + } + + ////////////////////////////////////////////////////////////////////// + // this code will be removed. + free(contact->image_thumbnail_path); + contact->image_thumbnail_path = NULL; + contact->image_thumbnail_changed = false; + + if (contact->images) { + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + ctsvc_list_s *list = (ctsvc_list_s*)contact->images; + ctsvc_image_s *image; + GList *cursor; + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + image = (ctsvc_image_s *)cursor->data; + contact->image_thumbnail_path = NULL; + } + + contacts_list_get_count((contacts_list_h)contact->images, &count); + if (count) { + contacts_list_first((contacts_list_h)contact->images); + ret = contacts_list_get_current_record_p((contacts_list_h)contact->images, &record); + + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("contacts_list_get_current_record_p() Failed(%d)", ret); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + image = (ctsvc_image_s*)record; + + if ( image->path && *image->path && strstr(image->path, CTS_IMG_FULL_LOCATION) != NULL) + contact->image_thumbnail_path = SAFE_STRDUP( image->path + strlen(CTS_IMG_FULL_LOCATION) + 1); + else + contact->image_thumbnail_path = SAFE_STRDUP(image->path); + + } + contact->image_thumbnail_changed = true; + } + // this code will be removed. + ////////////////////////////////////////////////////////////////////// + + len = snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver=%d, changed_time=%d, " + "has_phonenumber=%d, has_email=%d , display_name=?, " + "reverse_display_name=?, display_name_source=%d, display_name_language=%d, " + "sortkey=?, reverse_sortkey=?, uid=?, ringtone_path=?, vibration=?, " + "image_thumbnail_path=? WHERE contact_id=%d", + ctsvc_get_next_ver(), (int)time(NULL), + contact->has_phonenumber, contact->has_email, + contact->display_source_type, contact->display_name_language, + contact->id); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare() Failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + if (contact->display_name) + cts_stmt_bind_text(stmt, 1, contact->display_name); + if (contact->reverse_display_name) + cts_stmt_bind_text(stmt, 2, contact->reverse_display_name); + if (contact->sortkey) + cts_stmt_bind_text(stmt, 3, contact->sortkey); + if (contact->reverse_sortkey) + cts_stmt_bind_text(stmt, 4, contact->reverse_sortkey); + if (contact->uid) + cts_stmt_bind_text(stmt, 5, contact->uid); + if (contact->ringtone_path) + cts_stmt_bind_text(stmt, 6, contact->ringtone_path); + if (contact->vibration) + cts_stmt_bind_text(stmt, 7, contact->vibration); + if (contact->image_thumbnail_path) + cts_stmt_bind_text(stmt, 8, contact->image_thumbnail_path); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + cts_stmt_finalize(stmt); + + ctsvc_set_contact_noti(); + if (0 < rel_changed) + ctsvc_set_group_rel_noti(); + + __ctsvc_update_contact_search_data(contact->id); + ctsvc_db_update_person((contacts_record_h)contact); + + ret = ctsvc_end_trans(true); + + if (ret < CONTACTS_ERROR_NONE) + return ret; + else + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_contact_helper.c b/native/ctsvc_db_plugin_contact_helper.c new file mode 100644 index 0000000..05684a2 --- /dev/null +++ b/native/ctsvc_db_plugin_contact_helper.c @@ -0,0 +1,1659 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_schema.h" +#include "ctsvc_db_init.h" +#include "ctsvc_utils.h" +#include "ctsvc_record.h" +#include "ctsvc_normalize.h" +#include "ctsvc_setting.h" +#include "ctsvc_localize.h" +#include "ctsvc_localize_ch.h" +#include "ctsvc_notification.h" +#include "ctsvc_localize.h" + +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_db_plugin_company_helper.h" +#include "ctsvc_db_plugin_name_helper.h" +#include "ctsvc_db_plugin_number_helper.h" +#include "ctsvc_db_plugin_email_helper.h" +#include "ctsvc_db_plugin_event_helper.h" +#include "ctsvc_db_plugin_url_helper.h" +#include "ctsvc_db_plugin_note_helper.h" +#include "ctsvc_db_plugin_profile_helper.h" +#include "ctsvc_db_plugin_address_helper.h" +#include "ctsvc_db_plugin_nickname_helper.h" +#include "ctsvc_db_plugin_messenger_helper.h" +#include "ctsvc_db_plugin_relationship_helper.h" +#include "ctsvc_db_plugin_image_helper.h" +#include "ctsvc_db_plugin_extension_helper.h" + +//#include "ctsvc_db_plugin_grouprelation_helper.h" + +#include "ctsvc_group.h" + +#define CTSVC_MY_IMAGE_LOCATION "/opt/usr/data/contacts-svc/img/my" + +int ctsvc_contact_add_image_file(ctsvc_img_e image_type, int index, char *src_img, + char *dest_name, int dest_size) +{ + int ret; + char *ext; + char dest[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + + RETVM_IF(NULL == src_img, CONTACTS_ERROR_INVALID_PARAMETER, "image_thumbnail_path is NULL"); + + ext = strrchr(src_img, '.'); + if (NULL == ext || strchr(ext, '/')) + ext = ""; + + snprintf(dest, sizeof(dest), "%s/%d-%d%s", + CTS_IMG_FULL_LOCATION, index, image_type, ext); + + ret = ctsvc_copy_image(src_img, dest); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "cts_copy_file() Failed(%d)", ret); + + snprintf(dest_name, dest_size, "%d-%d%s", index, image_type, ext); + return CONTACTS_ERROR_NONE; +} + +static inline const char* __ctsvc_get_image_column_name(ctsvc_img_e image_type) +{ + switch(image_type) + { + case CTSVC_IMG_NORMAL: + return "image_thumbnail_path"; + default: + CTS_ERR("Invalid parameter : The image_type(%d) is not supported", image_type); + return NULL; + } +} + +int ctsvc_contact_delete_image_file(ctsvc_img_e image_type, int index) +{ + int ret; + cts_stmt stmt; + char *tmp_path; + char query[CTS_SQL_MIN_LEN] = {0}; + snprintf(query, sizeof(query), + "SELECT %s FROM %s WHERE contact_id = %d", + __ctsvc_get_image_column_name(image_type), CTS_TABLE_CONTACTS, index); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("DB error: cts_query_prepare() Failed"); + return CONTACTS_ERROR_DB; + } + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("DB error: cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + tmp_path = ctsvc_stmt_get_text(stmt, 0); + if (tmp_path) { + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_IMG_FULL_LOCATION, tmp_path); + ret = unlink(full_path); + WARN_IF (ret < 0, "unlink(%s) Failed(%d)", full_path, errno); + } + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_contact_update_image_file(int image_type, int index, char *src_img, + char *dest_name, int dest_size) +{ + int ret; + if (src_img && strstr(src_img, CTS_IMG_FULL_LOCATION) != NULL) { + snprintf(dest_name, dest_size, "%s", src_img + strlen(CTS_IMG_FULL_LOCATION) + 1); + return CONTACTS_ERROR_NONE; + } + + ret = ctsvc_contact_delete_image_file(image_type, index); + WARN_IF(CONTACTS_ERROR_NONE != ret && CONTACTS_ERROR_NO_DATA != ret, + "ctsvc_contact_delete_image_file() Failed(%d)", ret); + + if (src_img) { + ret = ctsvc_contact_add_image_file(image_type, index, src_img, dest_name, dest_size); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_contact_add_image_file() Failed(%d)", ret); + } + + return ret; +} + +int ctsvc_db_contact_update_changed_time(int contact_id) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), + "UPDATE %s SET changed_ver=%d, changed_time=%d WHERE contact_id=%d AND deleted = 0", + CTS_TABLE_CONTACTS, ctsvc_get_next_ver(), (int)time(NULL), contact_id); + + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "cts_query_exec() Failed(%d)", ret); + + ctsvc_set_contact_noti(); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_contact_delete_image_file_with_path(const unsigned char* image_path) +{ + int ret; + + if (image_path) { + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_IMG_FULL_LOCATION, image_path); + ret = unlink(full_path); + WARN_IF(ret < 0, "unlink(%s) Failed(%d)", full_path, errno); + } + + return CONTACTS_ERROR_NONE; +} + +void ctsvc_db_contact_delete_callback(sqlite3_context * context, + int argc, sqlite3_value ** argv) +{ + int ret; + int contact_id; + const unsigned char* image_thumbnail_path; + const unsigned char* image_path; + + if (argc > 3) { + sqlite3_result_null(context); + return; + } + + contact_id = sqlite3_value_int(argv[0]); + CTS_DBG("contact_id (%d), %c", sqlite3_value_int(argv[0]), contact_id); + image_thumbnail_path = sqlite3_value_text(argv[1]); + image_path = sqlite3_value_text(argv[2]); + + ret = __ctsvc_contact_delete_image_file_with_path(image_thumbnail_path); + WARN_IF (CONTACTS_ERROR_NONE != ret && CONTACTS_ERROR_NO_DATA != ret, + "__ctsvc_contact_delete_image_file_with_path(NORMAL) Failed(%d)", ret); + + ret = __ctsvc_contact_delete_image_file_with_path(image_path); + WARN_IF(CONTACTS_ERROR_NONE != ret && CONTACTS_ERROR_NO_DATA != ret, + "__ctsvc_contact_delete_image_file_with_path(FULL) Failed(%d)", ret); + + ret = ctsvc_company_delete_logo_file(contact_id); + if (CONTACTS_ERROR_NONE != ret && CONTACTS_ERROR_NO_DATA != ret) { + CTS_ERR("ctsvc_company_delete_logo_file_with_contact_id() Failed(%d)", ret); + return; + } + + return; +} + +void ctsvc_make_contact_display_name(ctsvc_contact_s *contact) +{ + char *display = NULL; + char *sortkey = NULL; + GList *cur; + int ret, len, display_len; + + ctsvc_name_s *name = NULL; + + contact->display_name_language = CTSVC_LANG_OTHERS; + + if ( contact->name->count > 0 && contact->name->records != NULL && contact->name->records->data != NULL ) + { + name = (ctsvc_name_s *)contact->name->records->data; + } + + if ( name && ( name->first || name->last) ) { + + // make display name + display_len = SAFE_STRLEN(name->first) + + SAFE_STRLEN(name->addition) + + SAFE_STRLEN(name->last) + + SAFE_STRLEN(name->suffix) + 5; + display = calloc(1, display_len); + len=0; + + if(name->first) + len += snprintf(display + len, display_len - len, "%s", name->first); + + if(name->addition) { + if (*display) + len += snprintf(display + len, display_len - len, " "); + len += snprintf(display + len, display_len - len, "%s", name->addition); + } + + if(name->last) { + if (*display) + len += snprintf(display + len, display_len - len, " "); + len += snprintf(display + len, display_len - len, "%s", name->last); + } + + if(name->suffix) { + if (*display) + len += snprintf(display + len, display_len - len, " "); + len += snprintf(display + len, display_len - len, "%s", name->suffix); + } + + contact->display_name = display; + + // make reverse_display_name + display = calloc(1, display_len); + len = 0; + if(name->last) { + len += snprintf(display + len, display_len - len, "%s", name->last); + + if(name->first || name->addition) + len += snprintf(display + len, display_len - len, ","); + } + + if(name->first) { + if (*display) + len += snprintf(display + len, display_len - len, " "); + len += snprintf(display + len, display_len - len, "%s", name->first); + } + + if(name->addition) { + if (*display) + len += snprintf(display + len, display_len - len, " "); + len += snprintf(display + len, display_len - len, "%s", name->addition); + } + + if(name->suffix) { + if (*display) + len += snprintf(display + len, display_len - len, " "); + len += snprintf(display + len, display_len - len, "%s", name->suffix); + } + + contact->reverse_display_name = display; + + ret = ctsvc_check_language_type(contact->display_name); + if (0 <= ret) { + if (ctsvc_get_default_language() == ret) + contact->display_name_language = CTSVC_LANG_DEFAULT; + else if (ctsvc_get_secondary_language() == ret) + contact->display_name_language = CTSVC_LANG_SECONDARY; + else + contact->display_name_language = ret; + } + + if (ctsvc_has_chinese(contact->display_name)) { + pinyin_name_s *pinyinname = NULL; + int size; + + ret = ctsvc_convert_chinese_to_pinyin(contact->display_name, &pinyinname, &size); + + if (CONTACTS_ERROR_NONE == ret) { + ret = ctsvc_collation_str(pinyinname[0].pinyin_name, &sortkey); + if (CONTACTS_ERROR_NONE == ret) { + contact->sortkey = sortkey; + contact->reverse_sortkey = strdup(sortkey); + } + free(pinyinname); + } + else { + ret = ctsvc_collation_str(contact->display_name, &sortkey); + if (CONTACTS_ERROR_NONE == ret) + contact->sortkey = sortkey; + else + free(sortkey); + sortkey = NULL; + + ret = ctsvc_collation_str(contact->reverse_display_name, &sortkey); + if (CONTACTS_ERROR_NONE == ret) + contact->reverse_sortkey = sortkey; + else + free(sortkey); + } + + } + else { + ret = ctsvc_collation_str(contact->display_name, &sortkey); + if (CONTACTS_ERROR_NONE == ret) + contact->sortkey = sortkey; + else + free(sortkey); + sortkey = NULL; + + ret = ctsvc_collation_str(contact->reverse_display_name, &sortkey); + if (CONTACTS_ERROR_NONE == ret) + contact->reverse_sortkey = sortkey; + else + free(sortkey); + + } + contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME; + } + else { + if (contact->company && contact->company->records) { + for (cur=contact->company->records;cur;cur=cur->next) { + ctsvc_company_s *company = (ctsvc_company_s *)cur->data; + if (company && company->name) { + contact->display_name = SAFE_STRDUP(company->name); + contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY; + break; + } + } + } + + if (NULL == contact->display_name && contact->nicknames->records) { + for (cur=contact->nicknames->records;cur;cur=cur->next) { + ctsvc_nickname_s *nickname = (ctsvc_nickname_s *)cur->data; + if (nickname && nickname->nickname) { + contact->display_name = SAFE_STRDUP(nickname->nickname); + contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME; + break; + } + } + } + + if (NULL == contact->display_name && contact->numbers->records) { + for (cur=contact->numbers->records;cur;cur=cur->next) { + ctsvc_number_s *number = (ctsvc_number_s *)cur->data; + if (number && number->number) { + contact->display_name = SAFE_STRDUP(number->number); + contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NUMBER; + break; + } + } + } + + if (NULL == contact->display_name && contact->emails->records) { + for (cur=contact->emails->records;cur;cur=cur->next) { + ctsvc_email_s *email = (ctsvc_email_s *)cur->data; + if (email && email->email_addr) { + contact->display_name = SAFE_STRDUP(email->email_addr); + contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_EMAIL; + break; + } + } + } + + if (contact->display_name) { + contact->reverse_display_name = SAFE_STRDUP(contact->display_name); + if (ctsvc_has_chinese(contact->display_name)) { + pinyin_name_s *pinyinname; + int size; + ret = ctsvc_convert_chinese_to_pinyin(contact->display_name, &pinyinname, &size); + + if (CONTACTS_ERROR_NONE == ret) { + ret = ctsvc_collation_str(pinyinname[0].pinyin_name, &sortkey); + if (CONTACTS_ERROR_NONE == ret) { + contact->sortkey = sortkey; + contact->reverse_sortkey = strdup(sortkey); + } + else + free(sortkey); + free(pinyinname); + } + else { + ret = ctsvc_collation_str(contact->display_name, &sortkey); + if (CONTACTS_ERROR_NONE == ret) + contact->sortkey = sortkey; + else + free(sortkey); + sortkey = NULL; + + ret = ctsvc_collation_str(contact->reverse_display_name, &sortkey); + if (CONTACTS_ERROR_NONE == ret) + contact->reverse_sortkey = sortkey; + else + free(sortkey); + } + } + else { + ret = ctsvc_check_language_type(contact->display_name); + if (0 <= ret) { + if (ctsvc_get_default_language() == ret) + contact->display_name_language = CTSVC_LANG_DEFAULT; + else if (ctsvc_get_secondary_language() == ret) + contact->display_name_language = CTSVC_LANG_SECONDARY; + else + contact->display_name_language = ret; + } + + ret = ctsvc_collation_str(contact->display_name, &sortkey); + if (CONTACTS_ERROR_NONE == ret) { + contact->sortkey = sortkey; + contact->reverse_sortkey = strdup(sortkey); + } + else + free(sortkey); + } + } + } + + return; +} + +int ctsvc_get_data_info_name(cts_stmt stmt, contacts_list_h name_list) +{ + int ret; + unsigned int count; + contacts_record_h record; + + ret = contacts_list_get_count(name_list, &count); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_list_get_count is failed(%d)", ret); + RETVM_IF (1 < count, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : already had name"); + + ctsvc_db_name_get_value_from_stmt(stmt, &record, 1); + contacts_list_add(name_list, record); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_get_data_info_event(cts_stmt stmt, contacts_list_h list) +{ + contacts_record_h record; + + ctsvc_db_event_get_value_from_stmt(stmt, &record, 1); + contacts_list_add(list, record); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_get_data_info_number(cts_stmt stmt, contacts_list_h number_list) +{ + contacts_record_h record; + + ctsvc_db_number_get_value_from_stmt(stmt, &record, 1); + contacts_list_add(number_list, record); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_get_data_info_email(cts_stmt stmt, contacts_list_h list) +{ + contacts_record_h record; + + ctsvc_db_email_get_value_from_stmt(stmt, &record, 1); + contacts_list_add(list, record); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_get_data_info_address(cts_stmt stmt, contacts_list_h list) +{ + contacts_record_h record; + + ctsvc_db_address_get_value_from_stmt(stmt, &record, 1); + contacts_list_add(list, record); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_get_data_info_messenger(cts_stmt stmt, contacts_list_h list) +{ + contacts_record_h record; + + ctsvc_db_messenger_get_value_from_stmt(stmt, &record, 1); + contacts_list_add(list, record); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_get_data_info_note(cts_stmt stmt, contacts_list_h list) +{ + contacts_record_h record; + + ctsvc_db_note_get_value_from_stmt(stmt, &record, 1); + contacts_list_add(list, record); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_get_data_info_company(cts_stmt stmt, contacts_list_h list) +{ + contacts_record_h record; + + ctsvc_db_company_get_value_from_stmt(stmt, &record, 1); + contacts_list_add(list, record); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_get_data_info_profile(cts_stmt stmt, contacts_list_h list) +{ + contacts_record_h record; + + ctsvc_db_profile_get_value_from_stmt(stmt, &record, 1); + contacts_list_add(list, record); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_get_data_info_relationship(cts_stmt stmt, contacts_list_h list) +{ + contacts_record_h record; + + ctsvc_db_relationship_get_value_from_stmt(stmt, &record, 1); + contacts_list_add(list, record); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_get_data_info_image(cts_stmt stmt, contacts_list_h list) +{ + contacts_record_h record; + + ctsvc_db_image_get_value_from_stmt(stmt, &record, 1); + contacts_list_add(list, record); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_get_data_info_url(cts_stmt stmt, contacts_list_h list) +{ + contacts_record_h record; + + ctsvc_db_url_get_value_from_stmt(stmt, &record, 1); + contacts_list_add(list, record); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_get_data_info_nickname(cts_stmt stmt, contacts_list_h list) +{ + contacts_record_h record; + + ctsvc_db_nickname_get_value_from_stmt(stmt, &record, 1); + contacts_list_add(list, record); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_get_data_info_extension(cts_stmt stmt, contacts_list_h list) +{ + contacts_record_h record; + + ctsvc_db_extension_get_value_from_stmt(stmt, &record, 1); + contacts_list_add(list, record); + + return CONTACTS_ERROR_NONE; +} + +bool ctsvc_contact_check_default_number(contacts_list_h number_list) +{ + bool has_default = false; + ctsvc_number_s* number; + unsigned int count; + int ret; + + RETV_IF(NULL == number_list, false); + + ret = contacts_list_get_count(number_list, &count); + if(CONTACTS_ERROR_NONE !=ret || 0 == count) + return false; + + contacts_list_first(number_list); + do { + contacts_list_get_current_record_p(number_list, (contacts_record_h*)&number); + if (NULL != number && number->number && *number->number && !number->base.deleted) { + if (number->is_default && false == has_default) + has_default = true; + else if (has_default) + number->is_default = false; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(number_list)); + + if (false == has_default) { + contacts_list_first(number_list); + do { + contacts_list_get_current_record_p(number_list, (contacts_record_h*)&number); + if (NULL != number && number->number && *number->number && !number->base.deleted) { + number->is_default = true; + has_default = true; + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(number_list)); + } + return has_default; +} + +bool ctsvc_contact_check_default_email(contacts_list_h email_list) +{ + bool has_default = false; + ctsvc_email_s* email; + unsigned int count; + int ret; + + RETV_IF(NULL == email_list, false); + + ret = contacts_list_get_count(email_list, &count); + if(CONTACTS_ERROR_NONE !=ret || 0 == count) + return false; + + contacts_list_first(email_list); + do { + contacts_list_get_current_record_p(email_list, (contacts_record_h*)&email); + if (NULL != email && email->email_addr && *email->email_addr && !email->base.deleted) { + if (email->is_default && false == has_default) + has_default = true; + else if (has_default) + email->is_default = false; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(email_list)); + + if (false == has_default) { + contacts_list_first(email_list); + do { + contacts_list_get_current_record_p(email_list, (contacts_record_h*)&email); + if (NULL != email && email->email_addr && *email->email_addr && !email->base.deleted) { + email->is_default = true; + has_default = true; + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(email_list)); + } + return has_default; +} + +bool ctsvc_contact_check_default_image(contacts_list_h image_list) +{ + bool has_default = false; + ctsvc_image_s* image; + unsigned int count; + int ret; + + RETV_IF(NULL == image_list, false); + + ret = contacts_list_get_count(image_list, &count); + if (CONTACTS_ERROR_NONE !=ret || 0 == count) { + CTS_DBG("list get count failed (%d)", count); + return false; + } + + contacts_list_first(image_list); + do { + contacts_list_get_current_record_p(image_list, (contacts_record_h*)&image); + if (NULL != image && image->path && *image->path) { + if (image->is_default && false == has_default) + has_default = true; + else if (has_default) + image->is_default = false; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(image_list)); + + if (false == has_default) { + contacts_list_first(image_list); + do { + contacts_list_get_current_record_p(image_list, (contacts_record_h*)&image); + if (NULL != image && image->path && *image->path) { + image->is_default = true; + has_default = true; + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(image_list)); + } + return CONTACTS_ERROR_NONE; +} + +int ctsvc_contact_update_data_name(contacts_list_h name_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record; + ctsvc_name_s *name; + ctsvc_list_s *list = (ctsvc_list_s*)name_list; + GList *cursor; + RETV_IF(NULL == name_list, CONTACTS_ERROR_INVALID_PARAMETER); + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + name = (ctsvc_name_s *)cursor->data; + ctsvc_db_name_delete(name->id); + } + + contacts_list_first(name_list); + contacts_list_get_current_record_p(name_list, &record); + if (record) { + name = (ctsvc_name_s*)record; + if (0 < name->id) { + if (name->first || name->last || name->addition || name->prefix || name->suffix + || name->phonetic_first || name->phonetic_middle || name->phonetic_last) + ret = ctsvc_db_name_update(record, contact_id, is_my_profile); + else + ret = ctsvc_db_name_delete(name->id); + } + else + ret = ctsvc_db_name_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret) + CTS_ERR("DB error : return(%d)", ret); + } + + return ret; +} + +int ctsvc_contact_update_data_company(contacts_list_h company_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + ctsvc_list_s *list = (ctsvc_list_s*)company_list; + ctsvc_company_s *company; + GList *cursor; + + RETV_IF(NULL == company_list, CONTACTS_ERROR_INVALID_PARAMETER); + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + company = (ctsvc_company_s *)cursor->data; + ctsvc_db_company_delete(company->id); + } + + ret = contacts_list_get_count(company_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(company_list); + do { + contacts_list_get_current_record_p(company_list, &record); + company = (ctsvc_company_s*)record; + if (0 < company->id) { + if (company->name || company->department || company->job_title || company->role + || company->assistant_name || company->logo || company->location || company->description + || company->phonetic_name) + ret = ctsvc_db_company_update(record, contact_id, is_my_profile); + else + ret = ctsvc_db_company_delete(company->id); + } + else + ret = ctsvc_db_company_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : return (%d)", ret); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(company_list)); + + return ret; +} + +int ctsvc_contact_update_data_note(contacts_list_h note_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + ctsvc_list_s *list = (ctsvc_list_s*)note_list; + ctsvc_note_s *note; + GList *cursor; + + RETV_IF(NULL == note_list, CONTACTS_ERROR_INVALID_PARAMETER); + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + note = (ctsvc_note_s *)cursor->data; + ctsvc_db_note_delete(note->id); + } + + ret = contacts_list_get_count(note_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(note_list); + do { + contacts_list_get_current_record_p(note_list, &record); + note = (ctsvc_note_s*)record; + if (0 < note->id) { + if (note->note) + ret = ctsvc_db_note_update(record, contact_id, is_my_profile); + else + ret = ctsvc_db_note_delete(note->id); + } + else + ret = ctsvc_db_note_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : return (%d)", ret); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(note_list)); + + return ret; +} + +int ctsvc_contact_update_data_event(contacts_list_h event_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + ctsvc_list_s *list = (ctsvc_list_s*)event_list; + ctsvc_event_s *event; + GList *cursor; + + RETV_IF(NULL == event_list, CONTACTS_ERROR_INVALID_PARAMETER); + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + event = (ctsvc_event_s *)cursor->data; + ctsvc_db_event_delete(event->id); + } + + ret = contacts_list_get_count(event_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(event_list); + do { + contacts_list_get_current_record_p(event_list, &record); + event = (ctsvc_event_s*)record; + if (0 < event->id) { + if (event->date > 0) + ret = ctsvc_db_event_update(record, contact_id, is_my_profile); + else + ret = ctsvc_db_event_delete(event->id); + } + else + ret = ctsvc_db_event_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : return (%d)", ret); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(event_list)); + + return ret; +} + +int ctsvc_contact_update_data_messenger(contacts_list_h messenger_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + ctsvc_list_s *list = (ctsvc_list_s*)messenger_list; + ctsvc_messenger_s *messenger; + GList *cursor; + + RETV_IF(NULL == messenger_list, CONTACTS_ERROR_INVALID_PARAMETER); + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + messenger = (ctsvc_messenger_s *)cursor->data; + ctsvc_db_messenger_delete(messenger->id); + } + + ret = contacts_list_get_count(messenger_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(messenger_list); + do { + contacts_list_get_current_record_p(messenger_list, &record); + messenger = (ctsvc_messenger_s*)record; + if (0 < messenger->id) { + if (messenger->im_id) + ret = ctsvc_db_messenger_update(record, contact_id, is_my_profile); + else + ret = ctsvc_db_messenger_delete(messenger->id); + } + else + ret = ctsvc_db_messenger_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : return (%d)", ret); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(messenger_list)); + + return ret; +} + +int ctsvc_contact_update_data_address(contacts_list_h address_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + ctsvc_list_s *list = (ctsvc_list_s*)address_list; + ctsvc_address_s *address; + GList *cursor; + + RETV_IF(NULL == address_list, CONTACTS_ERROR_INVALID_PARAMETER); + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + address = (ctsvc_address_s *)cursor->data; + ctsvc_db_address_delete(address->id); + } + + ret = contacts_list_get_count(address_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(address_list); + do { + contacts_list_get_current_record_p(address_list, &record); + address = (ctsvc_address_s*)record; + if (0 < address->id) { + if (address->pobox || address->postalcode || address->region || address->locality + || address->street || address->extended || address->country) + ret = ctsvc_db_address_update(record, contact_id, is_my_profile); + else + ret = ctsvc_db_address_delete(address->id); + } + else + ret = ctsvc_db_address_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : return (%d)", ret); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(address_list)); + + return ret; +} + +int ctsvc_contact_update_data_url(contacts_list_h url_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + ctsvc_list_s *list = (ctsvc_list_s*)url_list; + ctsvc_url_s *url; + GList *cursor; + + RETV_IF(NULL == url_list, CONTACTS_ERROR_INVALID_PARAMETER); + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + url = (ctsvc_url_s *)cursor->data; + ctsvc_db_url_delete(url->id); + } + + ret = contacts_list_get_count(url_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(url_list); + do { + contacts_list_get_current_record_p(url_list, &record); + url = (ctsvc_url_s*)record; + if (0 < url->id) { + if (url->url) + ret = ctsvc_db_url_update(record, contact_id, is_my_profile); + else + ret = ctsvc_db_url_delete(url->id); + } + else + ret = ctsvc_db_url_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : return (%d)", ret); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(url_list)); + + return ret; +} + +int ctsvc_contact_update_data_profile(contacts_list_h profile_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + ctsvc_list_s *list = (ctsvc_list_s*)profile_list; + ctsvc_profile_s *profile; + GList *cursor; + + RETV_IF(NULL == profile_list, CONTACTS_ERROR_INVALID_PARAMETER); + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + profile = (ctsvc_profile_s *)cursor->data; + ctsvc_db_profile_delete(profile->id); + } + ret = contacts_list_get_count(profile_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(profile_list); + do { + contacts_list_get_current_record_p(profile_list, &record); + profile = (ctsvc_profile_s*)record; + if (0 < profile->id) { + if (profile->appsvc_operation) + ret = ctsvc_db_profile_update(record, contact_id, is_my_profile); + else + ret = ctsvc_db_profile_delete(profile->id); + } + else + ret = ctsvc_db_profile_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : return (%d)", ret); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(profile_list)); + + return ret; +} + +int ctsvc_contact_update_data_relationship(contacts_list_h relationship_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + ctsvc_list_s *list = (ctsvc_list_s*)relationship_list; + ctsvc_relationship_s *relationship; + GList *cursor; + + RETV_IF(NULL == relationship_list, CONTACTS_ERROR_INVALID_PARAMETER); + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + relationship = (ctsvc_relationship_s *)cursor->data; + ctsvc_db_relationship_delete(relationship->id); + } + + ret = contacts_list_get_count(relationship_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(relationship_list); + do { + contacts_list_get_current_record_p(relationship_list, &record); + relationship = (ctsvc_relationship_s*)record; + if (0 < relationship->id) { + if (relationship->name) + ret = ctsvc_db_relationship_update(record, contact_id, is_my_profile); + else + ret = ctsvc_db_relationship_delete(relationship->id); + } + else + ret = ctsvc_db_relationship_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : return (%d)", ret); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(relationship_list)); + + return ret; +} + +int ctsvc_contact_update_data_image(contacts_list_h image_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + ctsvc_list_s *list = (ctsvc_list_s*)image_list; + ctsvc_image_s *image; + GList *cursor; + + RETV_IF(NULL == image_list, CONTACTS_ERROR_INVALID_PARAMETER); + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + image = (ctsvc_image_s *)cursor->data; + ctsvc_db_image_delete(image->id); + } + + ret = contacts_list_get_count(image_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(image_list); + do { + contacts_list_get_current_record_p(image_list, &record); + image = (ctsvc_image_s*)record; + if (image->is_changed) { + if (0 < image->id) { + if (image->path) + ret = ctsvc_db_image_update(record, contact_id, is_my_profile); + else + ret = ctsvc_db_image_delete(image->id); + } + else + ret = ctsvc_db_image_insert(record, contact_id, is_my_profile, NULL); + } + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : return (%d)", ret); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(image_list)); + + return ret; +} + +int ctsvc_contact_update_data_nickname(contacts_list_h nickname_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + ctsvc_list_s *list = (ctsvc_list_s*)nickname_list; + ctsvc_nickname_s *nickname; + GList *cursor; + + RETV_IF(NULL == nickname_list, CONTACTS_ERROR_INVALID_PARAMETER); + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + nickname = (ctsvc_nickname_s *)cursor->data; + ctsvc_db_nickname_delete(nickname->id); + } + + ret = contacts_list_get_count(nickname_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(nickname_list); + do { + contacts_list_get_current_record_p(nickname_list, &record); + nickname = (ctsvc_nickname_s*)record; + if (0 < nickname->id) { + if (nickname->nickname) + ret = ctsvc_db_nickname_update(record, contact_id, is_my_profile); + else + ret = ctsvc_db_nickname_delete(nickname->id); + } + else + ret = ctsvc_db_nickname_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : return (%d)", ret); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(nickname_list)); + + return ret; +} + +int ctsvc_contact_update_data_extension(contacts_list_h extension_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + ctsvc_list_s *list = (ctsvc_list_s*)extension_list; + ctsvc_extension_s *extension; + GList *cursor; + + RETV_IF(NULL == extension_list, CONTACTS_ERROR_INVALID_PARAMETER); + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + extension = (ctsvc_extension_s *)cursor->data; + ctsvc_db_extension_delete(extension->id); + } + + ret = contacts_list_get_count(extension_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(extension_list); + do { + contacts_list_get_current_record_p(extension_list, &record); + extension = (ctsvc_extension_s*)record; + if (0 < extension->id) { + if (extension->data2 || extension->data3 || extension->data4 || extension->data5 + || extension->data6 || extension->data7 || extension->data8 || extension->data9 + || extension->data10 || extension->data11 || extension->data12) + ret = ctsvc_db_extension_update(record, contact_id, is_my_profile); + else + ret = ctsvc_db_extension_delete(extension->id); + } + else + ret = ctsvc_db_extension_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : return (%d)", ret); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(extension_list)); + + return ret; +} + +int ctsvc_contact_update_data_number(contacts_list_h number_list, + int contact_id, bool is_my_profile, bool *had_phonenumber) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + ctsvc_list_s *list = (ctsvc_list_s*)number_list; + ctsvc_number_s *number; + GList *cursor; + bool had = false; + *had_phonenumber = false; + + RETV_IF(NULL == number_list, CONTACTS_ERROR_INVALID_PARAMETER); + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + number = (ctsvc_number_s *)cursor->data; + ctsvc_db_number_delete(number->id); + } + + ret = contacts_list_get_count(number_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(number_list); + do { + contacts_list_get_current_record_p(number_list, &record); + number = (ctsvc_number_s*)record; + if (number->number) { + if (0 < number->id) { + if (number->number) + ret = ctsvc_db_number_update(record, contact_id, is_my_profile); + else + ret = ctsvc_db_number_delete(number->id); + } + else + ret = ctsvc_db_number_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : return (%d)", ret); + break; + } + had = true; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(number_list)); + + *had_phonenumber = had; + return ret; +} + +int ctsvc_contact_update_data_email(contacts_list_h email_list, + int contact_id, bool is_my_profile, bool *had_email) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + ctsvc_list_s *list = (ctsvc_list_s*)email_list; + ctsvc_email_s *email; + GList *cursor; + bool had = false; + *had_email = false; + + RETV_IF(NULL == email_list, CONTACTS_ERROR_INVALID_PARAMETER); + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + email = (ctsvc_email_s *)cursor->data; + ctsvc_db_email_delete(email->id); + } + + ret = contacts_list_get_count(email_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(email_list); + do { + contacts_list_get_current_record_p(email_list, &record); + email = (ctsvc_email_s*)record; + if (email->email_addr) { + if (0 < email->id) { + if (email->email_addr) + ret = ctsvc_db_email_update(record, contact_id, is_my_profile); + else + ret = ctsvc_db_email_delete(email->id); + } + else + ret = ctsvc_db_email_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : return (%d)", ret); + break; + } + had = true; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(email_list)); + + *had_email = had; + return ret; +} + +int ctsvc_contact_insert_data_name(contacts_list_h name_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record; + RETV_IF(NULL == name_list, CONTACTS_ERROR_INVALID_PARAMETER); + + contacts_list_first(name_list); + contacts_list_get_current_record_p(name_list, &record); + if (record) { + ret = ctsvc_db_name_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : ctsvc_db_name_insert"); + } + } + return ret; +} + +int ctsvc_contact_insert_data_number(contacts_list_h number_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record; + unsigned int count = 0; + + RETV_IF(NULL == number_list, CONTACTS_ERROR_INVALID_PARAMETER); + ret = contacts_list_get_count(number_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(number_list); + do { + contacts_list_get_current_record_p(number_list, &record); + ret = ctsvc_db_number_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : ctsvc_db_number_insert"); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(number_list)); + + return ret; +} + +int ctsvc_contact_insert_data_email(contacts_list_h email_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record; + unsigned int count = 0; + + RETV_IF(NULL == email_list, CONTACTS_ERROR_INVALID_PARAMETER); + ret = contacts_list_get_count(email_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(email_list); + do { + contacts_list_get_current_record_p(email_list, &record); + ret = ctsvc_db_email_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : ctsvc_db_email_insert"); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(email_list)); + + return ret; +} + +int ctsvc_contact_insert_data_profile(contacts_list_h profile_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record; + unsigned int count = 0; + + RETV_IF(NULL == profile_list, CONTACTS_ERROR_INVALID_PARAMETER); + ret = contacts_list_get_count(profile_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(profile_list); + do { + contacts_list_get_current_record_p(profile_list, &record); + ret = ctsvc_db_profile_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : ctsvc_db_profile_insert"); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(profile_list)); + + return ret; +} + +int ctsvc_contact_insert_data_company(contacts_list_h company_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + + RETV_IF(NULL == company_list, CONTACTS_ERROR_INVALID_PARAMETER); + ret = contacts_list_get_count(company_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(company_list); + do { + contacts_list_get_current_record_p(company_list, &record); + ret = ctsvc_db_company_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : ctsvc_db_company_insert"); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(company_list)); + + return ret; +} + +int ctsvc_contact_insert_data_note(contacts_list_h note_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + + RETV_IF(NULL == note_list, CONTACTS_ERROR_INVALID_PARAMETER); + ret = contacts_list_get_count(note_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(note_list); + do { + contacts_list_get_current_record_p(note_list, &record); + if (record) { + ret = ctsvc_db_note_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : ctsvc_db_note_insert"); + break; + } + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(note_list)); + return ret; +} + +int ctsvc_contact_insert_data_event(contacts_list_h event_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record; + unsigned int count = 0; + + RETV_IF(NULL == event_list, CONTACTS_ERROR_INVALID_PARAMETER); + ret = contacts_list_get_count(event_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(event_list); + do { + contacts_list_get_current_record_p(event_list, &record); + ret = ctsvc_db_event_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : ctsvc_db_event_insert"); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(event_list)); + + return ret; +} + +int ctsvc_contact_insert_data_messenger(contacts_list_h messenger_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record; + unsigned int count = 0; + + RETV_IF(NULL == messenger_list, CONTACTS_ERROR_INVALID_PARAMETER); + ret = contacts_list_get_count(messenger_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(messenger_list); + do { + contacts_list_get_current_record_p(messenger_list, &record); + ret = ctsvc_db_messenger_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : ctsvc_db_messenger_insert"); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(messenger_list)); + + return ret; +} + +int ctsvc_contact_insert_data_address(contacts_list_h address_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record; + unsigned int count = 0; + + RETV_IF(NULL == address_list, CONTACTS_ERROR_INVALID_PARAMETER); + ret = contacts_list_get_count(address_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(address_list); + do { + contacts_list_get_current_record_p(address_list, &record); + ret = ctsvc_db_address_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : ctsvc_db_address_insert"); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(address_list)); + + return ret; +} + +int ctsvc_contact_insert_data_url(contacts_list_h url_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record; + unsigned int count = 0; + + RETV_IF(NULL == url_list, CONTACTS_ERROR_INVALID_PARAMETER); + ret = contacts_list_get_count(url_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(url_list); + do { + contacts_list_get_current_record_p(url_list, &record); + ret = ctsvc_db_url_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : ctsvc_db_url_insert"); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(url_list)); + + return ret; +} + +int ctsvc_contact_insert_data_nickname(contacts_list_h nickname_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record; + unsigned int count = 0; + + RETV_IF(NULL == nickname_list, CONTACTS_ERROR_INVALID_PARAMETER); + ret = contacts_list_get_count(nickname_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(nickname_list); + do { + contacts_list_get_current_record_p(nickname_list, &record); + ret = ctsvc_db_nickname_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : ctsvc_db_nickname_insert"); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(nickname_list)); + + return ret; +} + +int ctsvc_contact_insert_data_relationship(contacts_list_h relationship_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record; + unsigned int count = 0; + + RETV_IF(NULL == relationship_list, CONTACTS_ERROR_INVALID_PARAMETER); + ret = contacts_list_get_count(relationship_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(relationship_list); + do { + contacts_list_get_current_record_p(relationship_list, &record); + ret = ctsvc_db_relationship_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : ctsvc_db_relationship_insert"); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(relationship_list)); + + return ret; +} + +int ctsvc_contact_insert_data_image(contacts_list_h image_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record; + unsigned int count = 0; + + RETV_IF(NULL == image_list, CONTACTS_ERROR_INVALID_PARAMETER); + ret = contacts_list_get_count(image_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(image_list); + do { + contacts_list_get_current_record_p(image_list, &record); + ret = ctsvc_db_image_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : ctsvc_db_image_insert"); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(image_list)); + + return ret; +} + +int ctsvc_contact_insert_data_extension(contacts_list_h extension_list, int contact_id, bool is_my_profile) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record; + unsigned int count = 0; + + RETV_IF(NULL == extension_list, CONTACTS_ERROR_INVALID_PARAMETER); + ret = contacts_list_get_count(extension_list, &count); + if(0 == count) + return CONTACTS_ERROR_NONE; + + contacts_list_first(extension_list); + do { + contacts_list_get_current_record_p(extension_list, &record); + ret = ctsvc_db_extension_insert(record, contact_id, is_my_profile, NULL); + if (CONTACTS_ERROR_DB == ret){ + CTS_ERR("DB error : ctsvc_db_extension_insert"); + break; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(extension_list)); + + return ret; +} + diff --git a/native/ctsvc_db_plugin_contact_helper.h b/native/ctsvc_db_plugin_contact_helper.h new file mode 100644 index 0000000..049ed8d --- /dev/null +++ b/native/ctsvc_db_plugin_contact_helper.h @@ -0,0 +1,92 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_CONTACT_HELPER_H__ +#define __CTSVC_DB_PLUGIN_CONTACT_HELPER_H__ + +#include "ctsvc_struct.h" +#include "ctsvc_sqlite.h" + +typedef enum +{ + CTSVC_IMG_NORMAL, /**< . */ +} ctsvc_img_e; + +int ctsvc_db_contact_update_changed_time(int contact_id); + +int ctsvc_contact_add_image_file(ctsvc_img_e image_type, int index, char *src_img, + char *dest_name, int dest_size); +int ctsvc_contact_update_image_file(int image_type, int index, char *src_img, + char *dest_name, int dest_size); +int ctsvc_contact_delete_image_file(ctsvc_img_e image_type, int index); +void ctsvc_make_contact_display_name(ctsvc_contact_s *contact); + +void ctsvc_db_contact_delete_callback(sqlite3_context * context, + int argc, sqlite3_value ** argv); + +int ctsvc_get_data_info_name(cts_stmt stmt, contacts_list_h name_list); +int ctsvc_get_data_info_event(cts_stmt stmt, contacts_list_h list); +int ctsvc_get_data_info_number(cts_stmt stmt, contacts_list_h number_list); +int ctsvc_get_data_info_email(cts_stmt stmt, contacts_list_h list); +int ctsvc_get_data_info_address(cts_stmt stmt, contacts_list_h list); +int ctsvc_get_data_info_messenger(cts_stmt stmt, contacts_list_h list); +int ctsvc_get_data_info_note(cts_stmt stmt, contacts_list_h list); +int ctsvc_get_data_info_company(cts_stmt stmt, contacts_list_h list); +int ctsvc_get_data_info_profile(cts_stmt stmt, contacts_list_h list); +int ctsvc_get_data_info_relationship(cts_stmt stmt, contacts_list_h list); +int ctsvc_get_data_info_image(cts_stmt stmt, contacts_list_h list); +int ctsvc_get_data_info_url(cts_stmt stmt, contacts_list_h list); +int ctsvc_get_data_info_nickname(cts_stmt stmt, contacts_list_h list); +int ctsvc_get_data_info_extension(cts_stmt stmt, contacts_list_h list); + +bool ctsvc_contact_check_default_number(contacts_list_h number_list); +bool ctsvc_contact_check_default_email(contacts_list_h email_list); +bool ctsvc_contact_check_default_image(contacts_list_h image_list); + +int ctsvc_contact_update_data_name(contacts_list_h name_list, int contact_id, bool is_my_profile); +int ctsvc_contact_update_data_company(contacts_list_h company_list, int contact_id, bool is_my_profile); +int ctsvc_contact_update_data_note(contacts_list_h note_list, int contact_id, bool is_my_profile); +int ctsvc_contact_update_data_event(contacts_list_h event_list, int contact_id, bool is_my_profile); +int ctsvc_contact_update_data_messenger(contacts_list_h messenger_list, int contact_id, bool is_my_profile); +int ctsvc_contact_update_data_address(contacts_list_h address_list, int contact_id, bool is_my_profile); +int ctsvc_contact_update_data_url(contacts_list_h url_list, int contact_id, bool is_my_profile); +int ctsvc_contact_update_data_profile(contacts_list_h profile_list, int contact_id, bool is_my_profile); +int ctsvc_contact_update_data_relationship(contacts_list_h relationship_list, int contact_id, bool is_my_profile); +int ctsvc_contact_update_data_image(contacts_list_h image_list, int contact_id, bool is_my_profile); +int ctsvc_contact_update_data_nickname(contacts_list_h nickname_list, int contact_id, bool is_my_profile); +int ctsvc_contact_update_data_extension(contacts_list_h extension_list, int contact_id, bool is_my_profile); +int ctsvc_contact_update_data_number(contacts_list_h number_list, int contact_id, bool is_my_profile, bool *had_phonenumber); +int ctsvc_contact_update_data_email(contacts_list_h email_list, int contact_id, bool is_my_profile, bool *had_email); + +int ctsvc_contact_insert_data_name(contacts_list_h name_list, int contact_id, bool is_my_profile); +int ctsvc_contact_insert_data_number(contacts_list_h number_list, int contact_id, bool is_my_profile); +int ctsvc_contact_insert_data_email(contacts_list_h email_list, int contact_id, bool is_my_profile); +int ctsvc_contact_insert_data_profile(contacts_list_h profile_list, int contact_id, bool is_my_profile); +int ctsvc_contact_insert_data_company(contacts_list_h company_list, int contact_id, bool is_my_profile); +int ctsvc_contact_insert_data_note(contacts_list_h note_list, int contact_id, bool is_my_profile); +int ctsvc_contact_insert_data_event(contacts_list_h event_list, int contact_id, bool is_my_profile); +int ctsvc_contact_insert_data_messenger(contacts_list_h messenger_list, int contact_id, bool is_my_profile); +int ctsvc_contact_insert_data_address(contacts_list_h address_list, int contact_id, bool is_my_profile); +int ctsvc_contact_insert_data_url(contacts_list_h url_list, int contact_id, bool is_my_profile); +int ctsvc_contact_insert_data_nickname(contacts_list_h nickname_list, int contact_id, bool is_my_profile); +int ctsvc_contact_insert_data_relationship(contacts_list_h relationship_list, int contact_id, bool is_my_profile); +int ctsvc_contact_insert_data_image(contacts_list_h image_list, int contact_id, bool is_my_profile); +int ctsvc_contact_insert_data_extension(contacts_list_h extension_list, int contact_id, bool is_my_profile); + +#endif // __CTSVC_DB_PLUGIN_CONTACT_HELPER_H__ diff --git a/native/ctsvc_db_plugin_email.c b/native/ctsvc_db_plugin_email.c new file mode 100644 index 0000000..1714c85 --- /dev/null +++ b/native/ctsvc_db_plugin_email.c @@ -0,0 +1,370 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_db_plugin_email_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" +#include "ctsvc_db_query.h" +#include "ctsvc_list.h" + +static int __ctsvc_db_email_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_email_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_email_update_record( contacts_record_h record ); +static int __ctsvc_db_email_delete_record( int id ); +static int __ctsvc_db_email_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_email_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_email_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_email_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_email_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_email = { + .is_query_only = false, + .insert_record = __ctsvc_db_email_insert_record, + .get_record = __ctsvc_db_email_get_record, + .update_record = __ctsvc_db_email_update_record, + .delete_record = __ctsvc_db_email_delete_record, + .get_all_records = __ctsvc_db_email_get_all_records, + .get_records_with_query = __ctsvc_db_email_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_email_insert_records, + .update_records = NULL,//__ctsvc_db_email_update_records, + .delete_records = NULL,//__ctsvc_db_email_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_email_insert_record( contacts_record_h record, int *id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_email_s *email = (ctsvc_email_s *)record; + RETVM_IF(NULL == email->email_addr, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : email is NULL"); + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", email->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_email_insert(record, email->contact_id, false, id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_CONTACTS" SET has_email = %d, changed_ver = %d, changed_time = %d " + "WHERE contact_id = %d", + 1, ctsvc_get_next_ver(), (int)time(NULL), email->contact_id); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + ctsvc_set_contact_noti(); + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_email_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, data3 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE id = %d AND datatype = %d ", + id, CTSVC_DATA_EMAIL); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ctsvc_db_email_get_value_from_stmt(stmt, out_record, 0); + + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_email_update_record( contacts_record_h record ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_email_s *email = (ctsvc_email_s *)record; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", email->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_email_update(record, email->contact_id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + // TODO ; contact display email update + ret = ctsvc_db_contact_update_changed_time(email->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_set_contact_noti(); + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_email_delete_record( int id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT " " + "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if( ret != CONTACTS_ERROR_NONE ) { + CTS_ERR("The id(%d) is Invalid(%d)", id, ret); + ctsvc_end_trans(false); + return contact_id; + } + + ret = ctsvc_db_email_delete(id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_set_contact_noti(); + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_email_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int len; + int ret; + contacts_list_h list; + ctsvc_email_s *email; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, data3 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile=0 ", + CTSVC_DATA_EMAIL); + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB : cts_stmt_step fail(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + ctsvc_db_email_get_value_from_stmt(stmt, (contacts_record_h*)&email, 0); + ctsvc_list_prepend(list, (contacts_record_h)email); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_email_get_records_with_query( contacts_query_h query, int offset, + int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_email_s *email; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_email._uri, &record); + email = (ctsvc_email_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else { + field_count = s_query->projection_count; + ret = ctsvc_record_set_projection_flags(record, s_query->projection, + s_query->projection_count, s_query->property_count); + + if(CONTACTS_ERROR_NONE != ret) + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_EMAIL_ID: + email->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_EMAIL_CONTACT_ID: + email->contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_EMAIL_TYPE: + email->type = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_EMAIL_LABEL: + temp = ctsvc_stmt_get_text(stmt, i); + email->label = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_EMAIL_EMAIL: + temp = ctsvc_stmt_get_text(stmt, i); + email->email_addr = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_EMAIL_IS_DEFAULT: + email->is_default = ctsvc_stmt_get_int(stmt, i); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_email_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_email_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_email_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_email_helper.c b/native/ctsvc_db_plugin_email_helper.c new file mode 100644 index 0000000..416093d --- /dev/null +++ b/native/ctsvc_db_plugin_email_helper.c @@ -0,0 +1,146 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_email_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + +int ctsvc_db_email_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count) +{ + int ret; + char *temp; + ctsvc_email_s *email; + + ret = contacts_record_create(_contacts_email._uri, (contacts_record_h *)&email); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + + email->id = ctsvc_stmt_get_int(stmt, start_count++); + email->contact_id = ctsvc_stmt_get_int(stmt, start_count++); + email->is_default = ctsvc_stmt_get_int(stmt, start_count++); + email->type = ctsvc_stmt_get_int(stmt, start_count++); + temp = ctsvc_stmt_get_text(stmt, start_count++); + email->label = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + email->email_addr = SAFE_STRDUP(temp); + + *record = (contacts_record_h)email; + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_email_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id) +{ + int ret; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_email_s *email = (ctsvc_email_s *)record; + +// RETVM_IF(email->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted email record"); + RETV_IF(NULL == email->email_addr, CONTACTS_ERROR_NONE); + RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact_id(%d) is mandatory field to insert email record ", email->contact_id); + RETVM_IF(0 < email->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", email->id); + + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, is_default, data1, data2, data3) " + "VALUES(%d, %d, %d, %d, %d, ?, ?)", + contact_id, is_my_profile, CTSVC_DATA_EMAIL, email->is_default, email->type); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + if (email->label) + cts_stmt_bind_text(stmt, 1, email->label); + if (email->email_addr) + cts_stmt_bind_text(stmt, 2, email->email_addr); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + //email->id = cts_db_get_last_insert_id(); + if (id) + *id = cts_db_get_last_insert_id(); + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_email_noti(); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_email_update(contacts_record_h record, int contact_id, bool is_my_profile) +{ + int ret; + ctsvc_email_s *email = (ctsvc_email_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + cts_stmt stmt; + + RETVM_IF(!email->id, CONTACTS_ERROR_INVALID_PARAMETER, "email of contact has no ID."); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=? WHERE id=%d", + contact_id, is_my_profile, email->type, email->id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + if (email->label) + cts_stmt_bind_text(stmt, 1, email->label); + if (email->email_addr) + cts_stmt_bind_text(stmt, 2, email->email_addr); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_email_noti(); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_email_delete(int id) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d", + id, CTSVC_DATA_EMAIL); + + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret); + ctsvc_set_email_noti(); + + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_email_helper.h b/native/ctsvc_db_plugin_email_helper.h new file mode 100644 index 0000000..aec0a87 --- /dev/null +++ b/native/ctsvc_db_plugin_email_helper.h @@ -0,0 +1,32 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_EMAIL_HELPER_H__ +#define __CTSVC_DB_PLUGIN_EMAIL_HELPER_H__ + +#include "contacts.h" +#include "ctsvc_sqlite.h" + +int ctsvc_db_email_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id); +int ctsvc_db_email_update(contacts_record_h record, int contact_id, bool is_my_profile); +int ctsvc_db_email_delete(int id); + +int ctsvc_db_email_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count); + +#endif // __CTSVC_DB_PLUGIN_EMAIL_HELPER_H__ diff --git a/native/ctsvc_db_plugin_event.c b/native/ctsvc_db_plugin_event.c new file mode 100644 index 0000000..216236f --- /dev/null +++ b/native/ctsvc_db_plugin_event.c @@ -0,0 +1,363 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_event_helper.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_db_query.h" +#include "ctsvc_list.h" + +static int __ctsvc_db_event_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_event_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_event_update_record( contacts_record_h record ); +static int __ctsvc_db_event_delete_record( int id ); +static int __ctsvc_db_event_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_event_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_event_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_event_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_event_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_event = { + .is_query_only = false, + .insert_record = __ctsvc_db_event_insert_record, + .get_record = __ctsvc_db_event_get_record, + .update_record = __ctsvc_db_event_update_record, + .delete_record = __ctsvc_db_event_delete_record, + .get_all_records = __ctsvc_db_event_get_all_records, + .get_records_with_query = __ctsvc_db_event_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_event_insert_records, + .update_records = NULL,//__ctsvc_db_event_update_records, + .delete_records = NULL,//__ctsvc_db_event_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_event_insert_record( contacts_record_h record, int *id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_event_s *event = (ctsvc_event_s *)record; + + RETVM_IF(event->date <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : event date(%d)", event->date); + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", event->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_event_insert(record, event->contact_id, false, id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(event->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_event_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, data3, data4, data5 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE id = %d AND datatype = %d ", + id, CTSVC_DATA_EVENT); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ctsvc_db_event_get_value_from_stmt(stmt, out_record, 0); + + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_event_update_record( contacts_record_h record ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_event_s *event = (ctsvc_event_s *)record; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", event->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_event_update(record, event->contact_id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + // TODO ; contact display event update + ret = ctsvc_db_contact_update_changed_time(event->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_event_delete_record( int id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT " " + "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("The id(%d) is Invalid(%d)", id, ret); + ctsvc_end_trans(false); + return contact_id; + } + + ret = ctsvc_db_event_delete(id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_event_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int len; + int ret; + contacts_list_h list; + ctsvc_event_s *event; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, data3, data4, data5 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile=0 ", + CTSVC_DATA_EVENT); + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB : cts_stmt_step fail(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + ctsvc_db_event_get_value_from_stmt(stmt, (contacts_record_h*)&event, 0); + ctsvc_list_prepend(list, (contacts_record_h)event); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_event_get_records_with_query( contacts_query_h query, int offset, + int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_event_s *event; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_event._uri, &record); + event = (ctsvc_event_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else { + field_count = s_query->projection_count; + ret = ctsvc_record_set_projection_flags(record, s_query->projection, + s_query->projection_count, s_query->property_count); + + if(CONTACTS_ERROR_NONE != ret) + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_EVENT_ID: + event->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_EVENT_CONTACT_ID: + event->contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_EVENT_TYPE: + event->type = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_EVENT_LABEL: + temp = ctsvc_stmt_get_text(stmt, i); + event->label = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_EVENT_DATE: + event->date = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_EVENT_IS_LUNAR: + event->is_lunar = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_EVENT_LUNAR_DATE: + event->lunar_date = ctsvc_stmt_get_int(stmt, i); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_event_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_event_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_event_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_event_helper.c b/native/ctsvc_db_plugin_event_helper.c new file mode 100644 index 0000000..22ef48c --- /dev/null +++ b/native/ctsvc_db_plugin_event_helper.c @@ -0,0 +1,150 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_event_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + +int ctsvc_db_event_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id) +{ + int ret; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_event_s *event = (ctsvc_event_s *)record; + + // These check should be done in client side +// RETVM_IF(event->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted event record"); + RETV_IF(event->date <= 0, CONTACTS_ERROR_NONE); + RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact_id(%d) is mandatory field to insert event record", event->contact_id); + RETVM_IF(0 < event->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", event->id); + + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, data1, data2, data3, data4, data5) " + "VALUES(%d, %d, %d, %d, ?, ?, %d, ?)", + contact_id, is_my_profile, CTSVC_DATA_EVENT, event->type, event->is_lunar); + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + if (event->label) + cts_stmt_bind_text(stmt, 1, event->label); + cts_stmt_bind_int(stmt, 2, event->date); + cts_stmt_bind_int(stmt, 3, event->lunar_date); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + +// event->id = cts_db_get_last_insert_id(); + if (id) + *id = cts_db_get_last_insert_id(); + + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_event_noti(); + + return CONTACTS_ERROR_NONE; +} + + +int ctsvc_db_event_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count) +{ + int ret; + ctsvc_event_s *event; + char *temp; + + ret = contacts_record_create(_contacts_event._uri, (contacts_record_h *)&event); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + + event->id = ctsvc_stmt_get_int(stmt, start_count++); + event->contact_id = ctsvc_stmt_get_int(stmt, start_count++); + start_count++; // skip is default + event->type = ctsvc_stmt_get_int(stmt, start_count++); + temp = ctsvc_stmt_get_text(stmt, start_count++); + event->label = SAFE_STRDUP(temp); + event->date = ctsvc_stmt_get_int(stmt, start_count++); + event->is_lunar = ctsvc_stmt_get_int(stmt, start_count++); + event->lunar_date = ctsvc_stmt_get_int(stmt, start_count++); + + *record = (contacts_record_h)event; + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_event_update(contacts_record_h record, int contact_id, bool is_my_profile) +{ + int ret; + ctsvc_event_s *event = (ctsvc_event_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + cts_stmt stmt; + + RETVM_IF(!event->id, CONTACTS_ERROR_INVALID_PARAMETER, "event of contact has no ID."); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=?, data4=%d, data5=? WHERE id=%d", + contact_id, is_my_profile, event->type, event->is_lunar, event->id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + if (event->label) + cts_stmt_bind_text(stmt, 1, event->label); + cts_stmt_bind_int(stmt, 2, event->date); + cts_stmt_bind_int(stmt, 3, event->lunar_date); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_event_noti(); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_event_delete(int id) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d", + id, CTSVC_DATA_EVENT); + + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret); + + ctsvc_set_event_noti(); + + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_event_helper.h b/native/ctsvc_db_plugin_event_helper.h new file mode 100644 index 0000000..e9b8a72 --- /dev/null +++ b/native/ctsvc_db_plugin_event_helper.h @@ -0,0 +1,32 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_EVENT_HELPER_H__ +#define __CTSVC_DB_PLUGIN_EVENT_HELPER_H__ + +#include "contacts.h" +#include "ctsvc_sqlite.h" + +int ctsvc_db_event_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id); +int ctsvc_db_event_update(contacts_record_h record, int contact_id, bool is_my_profile); +int ctsvc_db_event_delete(int id); + +int ctsvc_db_event_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count); + +#endif // __CTSVC_DB_PLUGIN_EVENT_HELPER_H__ diff --git a/native/ctsvc_db_plugin_extension.c b/native/ctsvc_db_plugin_extension.c new file mode 100644 index 0000000..83528c4 --- /dev/null +++ b/native/ctsvc_db_plugin_extension.c @@ -0,0 +1,398 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_db_plugin_extension_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_db_query.h" +#include "ctsvc_list.h" + +static int __ctsvc_db_extension_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_extension_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_extension_update_record( contacts_record_h record ); +static int __ctsvc_db_extension_delete_record( int id ); +static int __ctsvc_db_extension_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_extension_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_extension_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_extension_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_extension_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_extension = { + .is_query_only = false, + .insert_record = __ctsvc_db_extension_insert_record, + .get_record = __ctsvc_db_extension_get_record, + .update_record = __ctsvc_db_extension_update_record, + .delete_record = __ctsvc_db_extension_delete_record, + .get_all_records = __ctsvc_db_extension_get_all_records, + .get_records_with_query = __ctsvc_db_extension_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_extension_insert_records, + .update_records = NULL,//__ctsvc_db_extension_update_records, + .delete_records = NULL,//__ctsvc_db_extension_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_extension_insert_record( contacts_record_h record, int *id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_extension_s *extension = (ctsvc_extension_s *)record; + + RETVM_IF(NULL == extension->data2 && NULL == extension->data3 && NULL == extension->data4 + && NULL == extension->data5 && NULL == extension->data6 && NULL == extension->data7 + && NULL == extension->data8 && NULL == extension->data9 && NULL == extension->data10 + && NULL == extension->data11 && NULL == extension->data12, + CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", extension->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_extension_insert(record, extension->contact_id, false, id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(extension->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_extension_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, " + "data3, data4, data5, data6, data7, data8, data9, data10, data11, data12 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE id = %d AND datatype = %d ", + id, CTSVC_DATA_EXTENSION); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ctsvc_db_extension_get_value_from_stmt(stmt, out_record, 0); + + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_extension_update_record( contacts_record_h record ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_extension_s *extension = (ctsvc_extension_s *)record; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", extension->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_extension_update(record, extension->contact_id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(extension->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_extension_delete_record( int id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT " " + "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if( ret != CONTACTS_ERROR_NONE ) { + CTS_ERR("The id(%d) is Invalid(%d)", id, ret); + ctsvc_end_trans(false); + return contact_id; + } + + ret = ctsvc_db_extension_delete(id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_extension_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int len; + int ret; + contacts_list_h list; + ctsvc_extension_s *extension; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, " + "data3, data4, data5, data6, data7, data8, data9, data10, data11, data12 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile=0 ", + CTSVC_DATA_EXTENSION); + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB : cts_stmt_step fail(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + ctsvc_db_extension_get_value_from_stmt(stmt, (contacts_record_h*)&extension, 0); + ctsvc_list_prepend(list, (contacts_record_h)extension); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_extension_get_records_with_query( contacts_query_h query, int offset, + int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_extension_s *extension; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_extension._uri, &record); + extension = (ctsvc_extension_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else { + field_count = s_query->projection_count; + ret = ctsvc_record_set_projection_flags(record, s_query->projection, + s_query->projection_count, s_query->property_count); + + if(CONTACTS_ERROR_NONE != ret) + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_EXTENSION_ID: + extension->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_EXTENSION_CONTACT_ID: + extension->contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_EXTENSION_DATA1: + extension->data1 = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_EXTENSION_DATA2: + temp = ctsvc_stmt_get_text(stmt, i); + extension->data2 = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_EXTENSION_DATA3: + temp = ctsvc_stmt_get_text(stmt, i); + extension->data3 = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_EXTENSION_DATA4: + temp = ctsvc_stmt_get_text(stmt, i); + extension->data4 = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_EXTENSION_DATA5: + temp = ctsvc_stmt_get_text(stmt, i); + extension->data5 = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_EXTENSION_DATA6: + temp = ctsvc_stmt_get_text(stmt, i); + extension->data6 = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_EXTENSION_DATA7: + temp = ctsvc_stmt_get_text(stmt, i); + extension->data7 = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_EXTENSION_DATA8: + temp = ctsvc_stmt_get_text(stmt, i); + extension->data8 = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_EXTENSION_DATA9: + temp = ctsvc_stmt_get_text(stmt, i); + extension->data9 = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_EXTENSION_DATA10: + temp = ctsvc_stmt_get_text(stmt, i); + extension->data10 = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_EXTENSION_DATA11: + temp = ctsvc_stmt_get_text(stmt, i); + extension->data11 = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_EXTENSION_DATA12: + temp = ctsvc_stmt_get_text(stmt, i); + extension->data12 = SAFE_STRDUP(temp); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_extension_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_extension_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_extension_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_extension_helper.c b/native/ctsvc_db_plugin_extension_helper.c new file mode 100644 index 0000000..8815708 --- /dev/null +++ b/native/ctsvc_db_plugin_extension_helper.c @@ -0,0 +1,191 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_extension_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + + +int ctsvc_db_extension_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count) +{ + int ret; + char *temp; + ctsvc_extension_s *extension; + + ret = contacts_record_create(_contacts_extension._uri, (contacts_record_h *)&extension); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + + extension->id = ctsvc_stmt_get_int(stmt, start_count++); + extension->contact_id = ctsvc_stmt_get_int(stmt, start_count++); + start_count++; + extension->data1 = ctsvc_stmt_get_int(stmt, start_count++); + temp = ctsvc_stmt_get_text(stmt, start_count++); + extension->data2= SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + extension->data3 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + extension->data4= SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + extension->data5 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + extension->data6 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + extension->data7 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + extension->data8 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + extension->data9 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + extension->data10 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + extension->data11 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + extension->data12 = SAFE_STRDUP(temp); + + *record = (contacts_record_h)extension; + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_extension_bind_stmt(cts_stmt stmt, ctsvc_extension_s *extension, int start_cnt) +{ + if (extension->data2) + cts_stmt_bind_text(stmt, start_cnt, extension->data2); + if (extension->data3) + cts_stmt_bind_text(stmt, start_cnt+1, extension->data3); + if (extension->data4) + cts_stmt_bind_text(stmt, start_cnt+2, extension->data4); + if (extension->data5) + cts_stmt_bind_text(stmt, start_cnt+3, extension->data5); + if (extension->data6) + cts_stmt_bind_text(stmt, start_cnt+4, extension->data6); + if (extension->data7) + cts_stmt_bind_text(stmt, start_cnt+5, extension->data7); + if (extension->data8) + cts_stmt_bind_text(stmt, start_cnt+6, extension->data8); + if (extension->data9) + cts_stmt_bind_text(stmt, start_cnt+7, extension->data9); + if (extension->data10) + cts_stmt_bind_text(stmt, start_cnt+8, extension->data10); + if (extension->data11) + cts_stmt_bind_text(stmt, start_cnt+9, extension->data11); + if (extension->data12) + cts_stmt_bind_text(stmt, start_cnt+10, extension->data12); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_extension_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id) +{ + int ret; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_extension_s *extension = (ctsvc_extension_s *)record; + +// RETVM_IF(extension->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted extension record"); + RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact_id(%d) is mandatory field to insert extension record ", extension->contact_id); + RETVM_IF(0 < extension->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", extension->id); + + if (extension->data2 || extension->data3 || extension->data4 || extension->data5 + || extension->data6 || extension->data7 || extension->data8 || extension->data9 + || extension->data10 || extension->data11 || extension->data12) { + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_DATA" (contact_id, is_my_profile, datatype, data1, data2, data3, data4, " + "data5, data6, data7, data8, data9, data10, data11, data12) " + "VALUES(%d, %d, %d, %d, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + contact_id, is_my_profile, CTSVC_DATA_EXTENSION, extension->data1); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + __ctsvc_extension_bind_stmt(stmt, extension, 1); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + +// extension->id = cts_db_get_last_insert_id(); + if (id) + *id = cts_db_get_last_insert_id(); + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_data_noti(); + } + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_extension_update(contacts_record_h record, int contact_id, bool is_my_profile) +{ + int ret; + ctsvc_extension_s *extension = (ctsvc_extension_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + cts_stmt stmt; + + RETVM_IF(!extension->id, CONTACTS_ERROR_INVALID_PARAMETER, "extension of contact has no ID."); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=?, data4=?, " + "data5=?, data6=?, data7=?, data8=?, data9=?, data10=?, data11=?, data12=? WHERE id=%d", + contact_id, is_my_profile, extension->data1, extension->id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + __ctsvc_extension_bind_stmt(stmt, extension, 1); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_data_noti(); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_extension_delete(int id) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d", + id, CTSVC_DATA_EXTENSION); + + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret); + ctsvc_set_data_noti(); + + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_extension_helper.h b/native/ctsvc_db_plugin_extension_helper.h new file mode 100644 index 0000000..e039f6a --- /dev/null +++ b/native/ctsvc_db_plugin_extension_helper.h @@ -0,0 +1,32 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_EXTENSION_HELPER_H__ +#define __CTSVC_DB_PLUGIN_EXTENSION_HELPER_H__ + +#include "contacts.h" +#include "ctsvc_sqlite.h" + +int ctsvc_db_extension_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id); +int ctsvc_db_extension_update(contacts_record_h record, int contact_id, bool is_my_profile); +int ctsvc_db_extension_delete(int id); + +int ctsvc_db_extension_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count); + +#endif // __CTSVC_DB_PLUGIN_EXTENSION_HELPER_H__ \ No newline at end of file diff --git a/native/ctsvc_db_plugin_group.c b/native/ctsvc_db_plugin_group.c new file mode 100644 index 0000000..761cfd4 --- /dev/null +++ b/native/ctsvc_db_plugin_group.c @@ -0,0 +1,507 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_list.h" +#include "ctsvc_db_query.h" +#include "ctsvc_db_init.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + +#define CTS_GROUP_IMAGE_LOCATION "/opt/usr/data/contacts-svc/img/group" + +static int __ctsvc_db_group_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_group_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_group_update_record( contacts_record_h record ); +static int __ctsvc_db_group_delete_record( int id ); +static int __ctsvc_db_group_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_group_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_group_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_group_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_group_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_group = { + .is_query_only = false, + .insert_record = __ctsvc_db_group_insert_record, + .get_record = __ctsvc_db_group_get_record, + .update_record = __ctsvc_db_group_update_record, + .delete_record = __ctsvc_db_group_delete_record, + .get_all_records = __ctsvc_db_group_get_all_records, + .get_records_with_query = __ctsvc_db_group_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_group_insert_records, + .update_records = NULL,//__ctsvc_db_group_update_records, + .delete_records = NULL,//__ctsvc_db_group_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_group_insert_record( contacts_record_h record, int *id ) +{ + int ret; + int ver; + cts_stmt stmt; + ctsvc_group_s *group = (ctsvc_group_s *)record; + char query[CTS_SQL_MAX_LEN] = {0}; + char image[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + RETVM_IF(CTSVC_RECORD_GROUP != group->base.r_type, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : record is invalid type(%d)", group->base.r_type); + RETVM_IF(NULL == group->name, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : The name of record is empty."); + + ret = ctsvc_begin_trans(); + if( ret < CONTACTS_ERROR_NONE ) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + group->id = cts_db_get_next_id(CTS_TABLE_GROUPS); + if (id) + *id = group->id; + + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_GROUPS"(group_id, addressbook_id, group_name, created_ver, changed_ver, ringtone_path, " + "vibration, image_thumbnail_path, system_id, is_read_only) " + "VALUES(%d, %d, ?, ?, ?, ?, ?, ?, ?, %d)", + group->id, group->addressbook_id, group->is_read_only); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("DB error : cts_query_prepare() Failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + cts_stmt_bind_text(stmt, 1, group->name); + + ver = ctsvc_get_next_ver(); + + cts_stmt_bind_int(stmt, 2, ver); + cts_stmt_bind_int(stmt, 3, ver); + + if (group->ringtone_path) + cts_stmt_bind_text(stmt, 4, group->ringtone_path); + if (group->vibration) + cts_stmt_bind_text(stmt, 5, group->vibration); + + if(group->image_thumbnail_path) { + ret = ctsvc_change_image(CTS_GROUP_IMAGE_LOCATION, group->id, group->image_thumbnail_path, + image, sizeof(image)); + if(CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_change_image() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + free(group->image_thumbnail_path); + group->image_thumbnail_path = strdup(image); + cts_stmt_bind_text(stmt, 6, group->image_thumbnail_path); + } + + if (group->system_id) + cts_stmt_bind_text(stmt, 7, group->system_id); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_set_group_noti(); + + cts_stmt_finalize(stmt); + + ret = ctsvc_end_trans(true); + if(ret < CONTACTS_ERROR_NONE ) { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_group_update_record( contacts_record_h record ) +{ + int ret; + ctsvc_group_s *group = (ctsvc_group_s *)record; + char image[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + char query[CTS_SQL_MIN_LEN] = {0}; + cts_stmt stmt; + int len; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + RETVM_IF(CTSVC_RECORD_GROUP != group->base.r_type, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : group is invalid type(%d)", group->base.r_type); + RETVM_IF(NULL == group->name, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : The name of group is empty."); + + len = snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_GROUPS" SET group_name=?, changed_ver=?, ringtone_path=?, vibration=? "); + + if (group->image_thumbnail_changed) + len += snprintf(query+len, sizeof(query)-len, ", image_thumbnail_path = ? "); + + snprintf(query+len, sizeof(query)-len, "WHERE group_id=%d", group->id); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("DB error : cts_query_prepare() Failed"); + return CONTACTS_ERROR_DB; + } + + ret = ctsvc_begin_trans(); + if( ret < CONTACTS_ERROR_NONE ) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + cts_stmt_bind_text(stmt, 1, group->name); + cts_stmt_bind_int(stmt, 2, ctsvc_get_next_ver()); + + if (group->ringtone_path) + cts_stmt_bind_text(stmt, 3, group->ringtone_path); + + if (group->vibration) + cts_stmt_bind_text(stmt, 4, group->vibration); + + if (group->image_thumbnail_changed) { + ret = ctsvc_change_image(CTS_GROUP_IMAGE_LOCATION, group->id, group->image_thumbnail_path, + image, sizeof(image)); + if(CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_change_image() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + if (*image) { + free(group->image_thumbnail_path); + group->image_thumbnail_path = strdup(image); + cts_stmt_bind_text(stmt, 5, image); + } + } + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + cts_stmt_finalize(stmt); + + ctsvc_set_group_noti(); + + ret = ctsvc_end_trans(true); + if(ret < CONTACTS_ERROR_NONE ) { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_group_delete_record( int index ) +{ + int ret; + int addressbook_id; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + RETVM_IF(CONTACTS_ERROR_NONE > ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), + "SELECT addressbook_id FROM %s WHERE group_id = %d", + CTS_TABLE_GROUPS, index); + + ret = ctsvc_query_get_first_int_result(query, &addressbook_id); + if ( ret < CONTACTS_ERROR_NONE) { + CTS_ERR("DB error : The index(%d) is Invalid(%d)", index, addressbook_id); + ctsvc_end_trans(false); + return ret; + } + + snprintf(query, sizeof(query), "DELETE FROM %s WHERE group_id=%d AND is_read_only=0", + CTS_TABLE_GROUPS, index); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = cts_db_change(); + if (ret <= 0) { + ctsvc_end_trans(false); + return CONTACTS_ERROR_NO_DATA; + } + + snprintf(query, sizeof(query), "INSERT INTO %s VALUES(%d, %d, %d)", + CTS_TABLE_GROUP_DELETEDS, index, addressbook_id, ctsvc_get_next_ver()); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_change_image(CTS_GROUP_IMAGE_LOCATION, index, NULL, NULL, 0); + if (ret < 0) { + CTS_ERR("DB error : ctsvc_change_image() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_set_group_noti(); + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_group_value_set(cts_stmt stmt, contacts_record_h *record) +{ + int i; + int ret; + char *temp; + ctsvc_group_s *group; + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + + ret = contacts_record_create(_contacts_group._uri, record); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + group = (ctsvc_group_s*)*record; + + i = 0; + group->id = ctsvc_stmt_get_int(stmt, i++); + group->addressbook_id = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + group->name = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + group->system_id = SAFE_STRDUP(temp); + group->is_read_only = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + group->ringtone_path = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + group->vibration = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + if (temp) { + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_GROUP_IMAGE_LOCATION, temp); + group->image_thumbnail_path = strdup(full_path); + } + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_group_get_record( int id, contacts_record_h *out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_record_h record; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + len = snprintf(query, sizeof(query), + "SELECT group_id, addressbook_id, group_name, system_id, is_read_only, " + "ringtone_path, vibration, image_thumbnail_path " + "FROM "CTS_TABLE_GROUPS" WHERE group_id = %d", id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ret = __ctsvc_db_group_value_set(stmt, &record); + + cts_stmt_finalize(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("__ctsvc_db_group_value_set(ALL) Failed(%d)", ret); + return ret; + } + *out_record = record; + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_group_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int ret; + int len; + cts_stmt stmt; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_list_h list; + + len = snprintf(query, sizeof(query), + "SELECT group_id, addressbook_id, group_name, system_id, is_read_only, " + "ringtone_path, vibration, image_thumbnail_path " + "FROM "CTS_TABLE_GROUPS" ORDER BY addressbook_id, group_name COLLATE NOCASE"); + + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + __ctsvc_db_group_value_set(stmt, &record); + + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_group_get_records_with_query( contacts_query_h query, + int offset, int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_group_s *group; + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_group._uri, &record); + group = (ctsvc_group_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else + { + field_count = s_query->projection_count; + + if( CONTACTS_ERROR_NONE != ctsvc_record_set_projection_flags(record, s_query->projection, s_query->projection_count, s_query->property_count) ) + { + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_GROUP_ID: + group->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_GROUP_ADDRESSBOOK_ID: + group->addressbook_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_GROUP_NAME: + temp = ctsvc_stmt_get_text(stmt, i); + group->name = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_GROUP_RINGTONE: + temp = ctsvc_stmt_get_text(stmt, i); + group->ringtone_path = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_GROUP_IMAGE: + temp = ctsvc_stmt_get_text(stmt, i); + if (temp) { + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_GROUP_IMAGE_LOCATION, temp); + group->image_thumbnail_path = strdup(full_path); + } + break; + case CTSVC_PROPERTY_GROUP_VIBRATION: + temp = ctsvc_stmt_get_text(stmt, i); + group->vibration = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_GROUP_SYSTEM_ID: + temp = ctsvc_stmt_get_text(stmt, i); + group->system_id = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_GROUP_IS_READ_ONLY: + group->is_read_only = ctsvc_stmt_get_int(stmt, i); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + + return CONTACTS_ERROR_NONE; +} +//static int __ctsvc_db_group_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_group_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_group_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } + + diff --git a/native/ctsvc_db_plugin_grouprelation.c b/native/ctsvc_db_plugin_grouprelation.c new file mode 100644 index 0000000..bb37b9d --- /dev/null +++ b/native/ctsvc_db_plugin_grouprelation.c @@ -0,0 +1,209 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_list.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_query.h" +#include "ctsvc_record.h" + +static int __ctsvc_db_grouprelation_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_grouprelation_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_grouprelation_update_record( contacts_record_h record ); +static int __ctsvc_db_grouprelation_delete_record( int id ); +static int __ctsvc_db_grouprelation_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_grouprelation_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_grouprelation_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_grouprelation_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_grouprelation_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_grouprelation = { + .is_query_only = false, + .insert_record = __ctsvc_db_grouprelation_insert_record, + .get_record = __ctsvc_db_grouprelation_get_record, + .update_record = __ctsvc_db_grouprelation_update_record, + .delete_record = __ctsvc_db_grouprelation_delete_record, + .get_all_records = __ctsvc_db_grouprelation_get_all_records, + .get_records_with_query = __ctsvc_db_grouprelation_get_records_with_query, + .insert_records = NULL, //__ctsvc_db_grouprelation_insert_records, + .update_records = NULL, //__ctsvc_db_grouprelation_update_records, + .delete_records = NULL, //__ctsvc_db_grouprelation_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_grouprelation_insert_record( contacts_record_h record, int *id ) +{ + CTS_ERR("Please use the contacts_group_add_contact()"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_db_grouprelation_get_record( int id, contacts_record_h* out_record ) +{ + CTS_ERR("Not support update group-relation"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_db_grouprelation_update_record( contacts_record_h record ) +{ + CTS_ERR("Not support update group-relation"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_db_grouprelation_delete_record( int id ) +{ + CTS_ERR("Please use the contacts_group_remove_contact()"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_db_grouprelation_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int len; + int ret; + contacts_list_h list; + ctsvc_group_relation_s *grouprel; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + char *temp; + + len = snprintf(query, sizeof(query), + "SELECT group_id, contact_id, group_name FROM "CTSVC_DB_VIEW_GROUP_RELATION); + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + contacts_record_create(_contacts_group_relation._uri, (contacts_record_h*)&grouprel); + + if (grouprel) { + grouprel->group_id = ctsvc_stmt_get_int(stmt, 0); + grouprel->id = grouprel->group_id; + grouprel->contact_id = ctsvc_stmt_get_int(stmt, 1); + temp = ctsvc_stmt_get_text(stmt, 2); + grouprel->group_name = SAFE_STRDUP(temp); + + ctsvc_list_prepend(list, (contacts_record_h)grouprel); + } + } + + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_grouprelation_get_records_with_query( contacts_query_h query, + int offset, int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_group_relation_s *group_relation; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_group_relation._uri, &record); + group_relation = (ctsvc_group_relation_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else + { + field_count = s_query->projection_count; + + if( CONTACTS_ERROR_NONE != ctsvc_record_set_projection_flags(record, s_query->projection, s_query->projection_count, s_query->property_count) ) + { + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + if (CTSVC_PROPERTY_GROUP_RELATION_ID == property_id) + continue; + + switch(property_id) { + case CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID: + group_relation->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID: + group_relation->group_id = ctsvc_stmt_get_int(stmt, i); + group_relation->id = group_relation->group_id; + break; + case CTSVC_PROPERTY_GROUP_RELATION_GROUP_NAME: + temp = ctsvc_stmt_get_text(stmt, i); + group_relation->group_name = SAFE_STRDUP(temp); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_grouprelation_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_grouprelation_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_grouprelation_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_image.c b/native/ctsvc_db_plugin_image.c new file mode 100644 index 0000000..bd9acb3 --- /dev/null +++ b/native/ctsvc_db_plugin_image.c @@ -0,0 +1,360 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_image_helper.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_db_query.h" +#include "ctsvc_list.h" + +static int __ctsvc_db_image_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_image_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_image_update_record( contacts_record_h record ); +static int __ctsvc_db_image_delete_record( int id ); +static int __ctsvc_db_image_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_image_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_image_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_image_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_image_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_image = { + .is_query_only = false, + .insert_record = __ctsvc_db_image_insert_record, + .get_record = __ctsvc_db_image_get_record, + .update_record = __ctsvc_db_image_update_record, + .delete_record = __ctsvc_db_image_delete_record, + .get_all_records = __ctsvc_db_image_get_all_records, + .get_records_with_query = __ctsvc_db_image_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_image_insert_records, + .update_records = NULL,//__ctsvc_db_image_update_records, + .delete_records = NULL,//__ctsvc_db_image_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_image_insert_record( contacts_record_h record, int *id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_image_s *image = (ctsvc_image_s *)record; + + RETVM_IF(NULL == image->path, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : image path is NULL"); + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", image->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_image_insert(record, image->contact_id, false, id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(image->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_image_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, data3 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE id = %d AND datatype = %d ", + id, CTSVC_DATA_IMAGE); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ctsvc_db_image_get_value_from_stmt(stmt, out_record, 0); + + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_image_update_record( contacts_record_h record ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_image_s *image = (ctsvc_image_s *)record; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", image->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_image_update(record, image->contact_id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(image->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_image_delete_record( int id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT " " + "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if( ret != CONTACTS_ERROR_NONE ) { + CTS_ERR("The id(%d) is Invalid(%d)", id, ret); + ctsvc_end_trans(false); + return contact_id; + } + + ret = ctsvc_db_image_delete(id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_image_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int len; + int ret; + contacts_list_h list; + ctsvc_image_s *image; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, data3 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile=0 ", + CTSVC_DATA_IMAGE); + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB : cts_stmt_step fail(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + ctsvc_db_image_get_value_from_stmt(stmt, (contacts_record_h*)&image, 0); + ctsvc_list_prepend(list, (contacts_record_h)image); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_image_get_records_with_query( contacts_query_h query, int offset, + int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_image_s *image; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_image._uri, &record); + image = (ctsvc_image_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else { + field_count = s_query->projection_count; + ret = ctsvc_record_set_projection_flags(record, s_query->projection, + s_query->projection_count, s_query->property_count); + + if(CONTACTS_ERROR_NONE != ret) + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_IMAGE_ID: + image->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_IMAGE_CONTACT_ID: + image->contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_IMAGE_TYPE: + image->type = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_IMAGE_LABEL: + temp = ctsvc_stmt_get_text(stmt, i); + image->label = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_IMAGE_PATH: + temp = ctsvc_stmt_get_text(stmt, i); + image->path = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_IMAGE_IS_DEFAULT: + temp = ctsvc_stmt_get_text(stmt, i); + image->is_default = SAFE_STRDUP(temp); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_image_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_image_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_image_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_image_helper.c b/native/ctsvc_db_plugin_image_helper.c new file mode 100644 index 0000000..8e49099 --- /dev/null +++ b/native/ctsvc_db_plugin_image_helper.c @@ -0,0 +1,178 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_image_helper.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + + +int ctsvc_db_image_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count) +{ + int ret; + char *temp; + ctsvc_image_s *image; + + ret = contacts_record_create(_contacts_image._uri, (contacts_record_h *)&image); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + + image->id = ctsvc_stmt_get_int(stmt, start_count++); + image->contact_id = ctsvc_stmt_get_int(stmt, start_count++); + image->is_default = ctsvc_stmt_get_int(stmt, start_count++); + image->type = ctsvc_stmt_get_int(stmt, start_count++); + temp = ctsvc_stmt_get_text(stmt, start_count++); + image->label = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + if (temp) { + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_IMG_FULL_LOCATION, temp); + image->path = strdup(full_path); + } + + *record = (contacts_record_h)image; + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_image_bind_stmt(cts_stmt stmt, ctsvc_image_s *image, int start_cnt) +{ + if (image->label) + cts_stmt_bind_text(stmt, start_cnt, image->label); + if (image->path) + cts_stmt_bind_text(stmt, start_cnt+1, image->path); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_image_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id) +{ + int ret; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + char image_path[CTS_SQL_MAX_LEN] = {0}; + ctsvc_image_s *image = (ctsvc_image_s *)record; + + // These check should be done in client side +// RETVM_IF(image->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted image record"); + RETV_IF(NULL == image->path, CONTACTS_ERROR_NONE); + RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact_id(%d) is mandatory field to insert image record", image->contact_id); + RETVM_IF(0 < image->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", image->id); + + ret = ctsvc_contact_add_image_file(CTSVC_IMG_NORMAL, contact_id, image->path, + image_path, sizeof(image_path)); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_add_image_file(NORMAL) Failed(%d)", ret); + return ret; + } + free(image->path); + image->path = strdup(image_path); + + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, is_default, data1, data2, data3) " + "VALUES(%d, %d, %d, %d, %d, ?, ?)", + contact_id, is_my_profile, CTSVC_DATA_IMAGE, image->is_default, image->type); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + __ctsvc_image_bind_stmt(stmt, image, 1); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + //image->id = cts_db_get_last_insert_id(); + if (id) + *id = cts_db_get_last_insert_id(); + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_image_noti(); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_image_update(contacts_record_h record, int contact_id, bool is_my_profile) +{ + int ret; + ctsvc_image_s *image = (ctsvc_image_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + char image_path[CTS_SQL_MAX_LEN] = {0}; + cts_stmt stmt; + + RETVM_IF(!image->id, CONTACTS_ERROR_INVALID_PARAMETER, "image of contact has no ID."); + + ret = ctsvc_contact_update_image_file(CTSVC_IMG_NORMAL, contact_id, + image->path, image_path, sizeof(image_path)); + + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_contact_update_image_file() Failed(%d)", ret); + + if (*image_path) { + free(image->path); + image->path = strdup(image_path); + } + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, is_default=%d, data1=%d, data2=?, data3=? WHERE id=%d", + contact_id, is_my_profile, image->is_default, image->type, image->id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + __ctsvc_image_bind_stmt(stmt, image, 1); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_image_noti(); + image->is_changed = false; + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_image_delete(int id) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d", + id, CTSVC_DATA_IMAGE); + + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret); + ctsvc_set_image_noti(); + + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_image_helper.h b/native/ctsvc_db_plugin_image_helper.h new file mode 100644 index 0000000..e06b54b --- /dev/null +++ b/native/ctsvc_db_plugin_image_helper.h @@ -0,0 +1,32 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_IMAGE_HELPER_H__ +#define __CTSVC_DB_PLUGIN_IMAGE_HELPER_H__ + +#include "contacts.h" +#include "ctsvc_sqlite.h" + +int ctsvc_db_image_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id); +int ctsvc_db_image_update(contacts_record_h record, int contact_id, bool is_my_profile); +int ctsvc_db_image_delete(int id); + +int ctsvc_db_image_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count); + +#endif // __CTSVC_DB_PLUGIN_RELATIONSHIP_HELPER_H__ diff --git a/native/ctsvc_db_plugin_messenger.c b/native/ctsvc_db_plugin_messenger.c new file mode 100644 index 0000000..6eca202 --- /dev/null +++ b/native/ctsvc_db_plugin_messenger.c @@ -0,0 +1,357 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_db_plugin_messenger_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" +#include "ctsvc_db_query.h" +#include "ctsvc_list.h" + +static int __ctsvc_db_messenger_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_messenger_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_messenger_update_record( contacts_record_h record ); +static int __ctsvc_db_messenger_delete_record( int id ); +static int __ctsvc_db_messenger_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_messenger_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_messenger_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_messenger_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_messenger_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_messenger = { + .is_query_only = false, + .insert_record = __ctsvc_db_messenger_insert_record, + .get_record = __ctsvc_db_messenger_get_record, + .update_record = __ctsvc_db_messenger_update_record, + .delete_record = __ctsvc_db_messenger_delete_record, + .get_all_records = __ctsvc_db_messenger_get_all_records, + .get_records_with_query = __ctsvc_db_messenger_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_messenger_insert_records, + .update_records = NULL,//__ctsvc_db_messenger_update_records, + .delete_records = NULL,//__ctsvc_db_messenger_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_messenger_insert_record( contacts_record_h record, int *id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_messenger_s *messenger = (ctsvc_messenger_s *)record; + + RETVM_IF(NULL == messenger->im_id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : messenger id is NULL"); + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", messenger->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_messenger_insert(record, messenger->contact_id, false, id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(messenger->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_messenger_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, data3 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE id = %d AND datatype = %d ", + id, CTSVC_DATA_MESSENGER); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ctsvc_db_messenger_get_value_from_stmt(stmt, out_record, 0); + + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_messenger_update_record( contacts_record_h record ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_messenger_s *messenger = (ctsvc_messenger_s *)record; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", messenger->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_messenger_update(record, messenger->contact_id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(messenger->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_messenger_delete_record( int id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT " " + "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if( ret != CONTACTS_ERROR_NONE ) { + CTS_ERR("The id(%d) is Invalid(%d)", id, ret); + ctsvc_end_trans(false); + return contact_id; + } + + ret = ctsvc_db_messenger_delete(id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_messenger_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int len; + int ret; + contacts_list_h list; + ctsvc_messenger_s *messenger; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, data3 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile=0 ", + CTSVC_DATA_MESSENGER); + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB : cts_stmt_step fail(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + ctsvc_db_messenger_get_value_from_stmt(stmt, (contacts_record_h*)&messenger, 0); + ctsvc_list_prepend(list, (contacts_record_h)messenger); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_messenger_get_records_with_query( contacts_query_h query, int offset, + int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_messenger_s *messenger; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_messenger._uri, &record); + messenger = (ctsvc_messenger_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else { + field_count = s_query->projection_count; + ret = ctsvc_record_set_projection_flags(record, s_query->projection, + s_query->projection_count, s_query->property_count); + + if(CONTACTS_ERROR_NONE != ret) + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_MESSENGER_ID: + messenger->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_MESSENGER_CONTACT_ID: + messenger->contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_MESSENGER_TYPE: + messenger->type = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_MESSENGER_LABEL: + temp = ctsvc_stmt_get_text(stmt, i); + messenger->label = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_MESSENGER_IM_ID: + temp = ctsvc_stmt_get_text(stmt, i); + messenger->im_id = SAFE_STRDUP(temp); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_messenger_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_messenger_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_messenger_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_messenger_helper.c b/native/ctsvc_db_plugin_messenger_helper.c new file mode 100644 index 0000000..204513c --- /dev/null +++ b/native/ctsvc_db_plugin_messenger_helper.c @@ -0,0 +1,147 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_messenger_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + + +int ctsvc_db_messenger_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count) +{ + int ret; + char *temp; + ctsvc_messenger_s *messenger; + + ret = contacts_record_create(_contacts_messenger._uri, (contacts_record_h *)&messenger); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + + messenger->id = ctsvc_stmt_get_int(stmt, start_count++); + messenger->contact_id = ctsvc_stmt_get_int(stmt, start_count++); + start_count++; + messenger->type = ctsvc_stmt_get_int(stmt, start_count++); + temp = ctsvc_stmt_get_text(stmt, start_count++); + messenger->label = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + messenger->im_id = SAFE_STRDUP(temp); + + *record = (contacts_record_h)messenger; + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_messenger_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id) +{ + int ret; + cts_stmt stmt = NULL; + ctsvc_messenger_s *messenger =(ctsvc_messenger_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + +// RETVM_IF(messenger->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted messenger record"); + RETV_IF(NULL == messenger->im_id, CONTACTS_ERROR_NONE); + RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact_id(%d) is mandatory field to insert messenger record ", messenger->contact_id); + RETVM_IF(0 < messenger->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", messenger->id); + + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, data1, data2, data3) " + "VALUES(%d, %d, %d, %d, ?, ?)", + contact_id, is_my_profile, CTSVC_DATA_MESSENGER, messenger->type); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + if (messenger->label) + sqlite3_bind_text(stmt, 1, messenger->label, + strlen(messenger->label), SQLITE_STATIC); + if (messenger->im_id) + sqlite3_bind_text(stmt, 2, messenger->im_id, + strlen(messenger->im_id), SQLITE_STATIC); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + //messenger->id = cts_db_get_last_insert_id(); + if (id) + *id = cts_db_get_last_insert_id(); + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_messenger_noti(); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_messenger_update(contacts_record_h record, int contact_id, bool is_my_profile) +{ + int ret; + ctsvc_messenger_s *messenger = (ctsvc_messenger_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + cts_stmt stmt; + + RETVM_IF(!messenger->id, CONTACTS_ERROR_INVALID_PARAMETER, "messenger of contact has no ID."); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=? WHERE id=%d", + contact_id, is_my_profile, messenger->type, messenger->id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + if (messenger->label) + cts_stmt_bind_text(stmt, 1, messenger->label); + if (messenger->im_id) + cts_stmt_bind_text(stmt, 2, messenger->im_id); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_messenger_noti(); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_messenger_delete(int id) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d", + id, CTSVC_DATA_MESSENGER); + + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret); + ctsvc_set_messenger_noti(); + + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_messenger_helper.h b/native/ctsvc_db_plugin_messenger_helper.h new file mode 100644 index 0000000..c501fed --- /dev/null +++ b/native/ctsvc_db_plugin_messenger_helper.h @@ -0,0 +1,32 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_MESSENGER_HELPER_H__ +#define __CTSVC_DB_PLUGIN_MESSENGER_HELPER_H__ + +#include "contacts.h" +#include "ctsvc_sqlite.h" + +int ctsvc_db_messenger_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id); +int ctsvc_db_messenger_update(contacts_record_h record, int contact_id, bool is_my_profile); +int ctsvc_db_messenger_delete(int id); + +int ctsvc_db_messenger_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count); + +#endif // __CTSVC_DB_PLUGIN_MESSENGER_HELPER_H__ diff --git a/native/ctsvc_db_plugin_my_profile.c b/native/ctsvc_db_plugin_my_profile.c new file mode 100644 index 0000000..248b739 --- /dev/null +++ b/native/ctsvc_db_plugin_my_profile.c @@ -0,0 +1,1089 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_schema.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_query.h" +#include "ctsvc_utils.h" +#include "ctsvc_record.h" +#include "ctsvc_normalize.h" +#include "ctsvc_list.h" +#include "ctsvc_setting.h" +#include "ctsvc_localize_ch.h" +#include "ctsvc_group.h" +#include "ctsvc_notification.h" +#include "ctsvc_localize.h" + +#include "ctsvc_db_plugin_contact_helper.h" + +#define CTSVC_MY_PROFILE_DISPLAY_NAME_MAX_LEN 1024 + +static int __ctsvc_db_my_profile_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_my_profile_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_my_profile_update_record( contacts_record_h record ); +static int __ctsvc_db_my_profile_delete_record( int id ); + +static int __ctsvc_db_my_profile_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_my_profile_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_my_profile = { + .is_query_only = false, + .insert_record = __ctsvc_db_my_profile_insert_record, + .get_record = __ctsvc_db_my_profile_get_record, + .update_record = __ctsvc_db_my_profile_update_record, + .delete_record = __ctsvc_db_my_profile_delete_record, + .get_all_records = __ctsvc_db_my_profile_get_all_records, + .get_records_with_query = __ctsvc_db_my_profile_get_records_with_query, + .insert_records = NULL, + .update_records = NULL, + .delete_records = NULL, + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_get_my_profile_base_info(int id, ctsvc_my_profile_s *my_profile) +{ + int ret, len; + int i; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + char *temp; + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT my_profile_id, addressbook_id, changed_time, %s, image_thumbnail_path, uid " + "FROM "CTS_TABLE_MY_PROFILES" WHERE my_profile_id = %d", + ctsvc_get_display_column(), id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + i = 0; + my_profile->id = ctsvc_stmt_get_int(stmt, i++); + my_profile->addressbook_id = ctsvc_stmt_get_int(stmt, i++); + my_profile->changed_time = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + my_profile->display_name = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + if (temp) { + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_IMG_FULL_LOCATION, temp); + my_profile->image_thumbnail_path = strdup(full_path); + } + temp = ctsvc_stmt_get_text(stmt, i++); + my_profile->uid = SAFE_STRDUP(temp); + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + + + +static int __ctsvc_db_my_profile_get_data(int id, ctsvc_my_profile_s *my_profile) +{ + int ret, len; + int datatype; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT datatype, id, contact_id, is_default, data1, data2, " + "data3, data4, data5, data6, data7, data8, data9, data10 " + "FROM "CTS_TABLE_DATA" WHERE contact_id = %d AND is_my_profile = 1", id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE */!= ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + do { + datatype = ctsvc_stmt_get_int(stmt, 0); + switch (datatype) { + case CTSVC_DATA_NAME: + ctsvc_get_data_info_name(stmt, (contacts_list_h)my_profile->name); + break; + case CTSVC_DATA_EVENT: + ctsvc_get_data_info_event(stmt, (contacts_list_h)my_profile->events); + break; + case CTSVC_DATA_MESSENGER: + ctsvc_get_data_info_messenger(stmt, (contacts_list_h)my_profile->messengers); + break; + case CTSVC_DATA_POSTAL: + ctsvc_get_data_info_address(stmt, (contacts_list_h)my_profile->postal_addrs); + break; + case CTSVC_DATA_URL: + ctsvc_get_data_info_url(stmt, (contacts_list_h)my_profile->urls); + break; + case CTSVC_DATA_NICKNAME: + ctsvc_get_data_info_nickname(stmt, (contacts_list_h)my_profile->nicknames); + break; + case CTSVC_DATA_NUMBER: + ctsvc_get_data_info_number(stmt, (contacts_list_h)my_profile->numbers); + break; + case CTSVC_DATA_EMAIL: + ctsvc_get_data_info_email(stmt, (contacts_list_h)my_profile->emails); + break; + case CTSVC_DATA_PROFILE: + ctsvc_get_data_info_profile(stmt, (contacts_list_h)my_profile->profiles); + break; + case CTSVC_DATA_RELATIONSHIP: + ctsvc_get_data_info_relationship(stmt, (contacts_list_h)my_profile->relationships); + break; + case CTSVC_DATA_IMAGE: + ctsvc_get_data_info_image(stmt, (contacts_list_h)my_profile->images); + break; + case CTSVC_DATA_COMPANY: + ctsvc_get_data_info_company(stmt, (contacts_list_h)my_profile->company); + break; + case CTSVC_DATA_NOTE: + ctsvc_get_data_info_note(stmt, (contacts_list_h)my_profile->note); + break; + case CTSVC_DATA_EXTENSION: + ctsvc_get_data_info_extension(stmt, (contacts_list_h)my_profile->extensions); + break; + default: + CTS_ERR("Intenal : Not supported data type (%d)", datatype); + break; + } + + }while(1 /*CTS_TRUE*/ == cts_stmt_step(stmt)); + + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; + +} + +static int __ctsvc_db_my_profile_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + contacts_record_h record; + ctsvc_my_profile_s *my_profile; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + contacts_record_create(_contacts_my_profile._uri, &record); + my_profile = (ctsvc_my_profile_s *)record; + ret = __ctsvc_db_get_my_profile_base_info(id, my_profile); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_get_main_contacts_info(ALL) Failed(%d)", ret); + contacts_record_destroy(record, true); + return ret; + } + + ret = __ctsvc_db_my_profile_get_data(id, my_profile); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_get_data_info Failed(%d)", ret); + contacts_record_destroy(record, true); + return ret; + } + + *out_record = record; + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_my_profile_delete_record( int id ) +{ + CTS_FN_CALL; + int ret; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), "DELETE FROM %s WHERE my_profile_id = %d", CTS_TABLE_MY_PROFILES, id); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_set_my_profile_noti(); + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_safe_strcmp(char *s1, char *s2) +{ + if (NULL == s1 || NULL == s2) + return !(s1 == s2); + else + return strcmp(s1, s2); +} + +static inline void __ctsvc_update_my_profile_display_name(ctsvc_my_profile_s *my_profile) +{ + char *temp_display_name = NULL; + char display[CTSVC_MY_PROFILE_DISPLAY_NAME_MAX_LEN] = {0}; + GList *cur; + int len=0; + + ctsvc_name_s *name = NULL; + if ( my_profile->name->count > 0 && my_profile->name->records != NULL && my_profile->name->records->data != NULL ) + { + name = (ctsvc_name_s *)my_profile->name->records->data; + } + + if ( name && ( name->first || name->last) ) { + if (name->first && name->last){ + snprintf(display, sizeof(display), "%s %s",name->first,name->last); + temp_display_name = strdup(display); + } + else if (name->first) + temp_display_name = strdup(name->first); + else + temp_display_name = strdup(name->last); + + if (0 != __ctsvc_safe_strcmp(my_profile->display_name, temp_display_name)) { + // make display name + if(name->first) + len += snprintf(display + len, sizeof(display) - len, "%s", name->first); + + if(name->addition) { + if (*display) + len += snprintf(display + len, sizeof(display) - len, " "); + len += snprintf(display + len, sizeof(display) - len, "%s", name->addition); + } + + if(name->last) { + if (*display) + len += snprintf(display + len, sizeof(display) - len, " "); + len += snprintf(display + len, sizeof(display) - len, "%s", name->last); + } + + if(name->suffix) { + if (*display) + len += snprintf(display + len, sizeof(display) - len, " "); + len += snprintf(display + len, sizeof(display) - len, "%s", name->suffix); + } + my_profile->display_name = strdup(display); + } + free(temp_display_name); + } + else { + if (my_profile->company && my_profile->company->records) { + for (cur=my_profile->company->records;cur;cur=cur->next) { + ctsvc_company_s *company = (ctsvc_company_s *)cur->data; + if (company && company->name) { + if (__ctsvc_safe_strcmp(my_profile->display_name, company->name)) { + my_profile->display_name = SAFE_STRDUP(company->name); + break; + } + } + } + } + else if (my_profile->nicknames && my_profile->nicknames->records) { + for (cur=my_profile->nicknames->records;cur;cur=cur->next) { + ctsvc_nickname_s *nickname = (ctsvc_nickname_s *)cur->data; + if (nickname && nickname->nickname) { + if (__ctsvc_safe_strcmp(my_profile->display_name, nickname->nickname)) { + my_profile->display_name = SAFE_STRDUP(nickname->nickname); + break; + } + } + } + } + else if (my_profile->numbers && my_profile->numbers->records) { + for (cur=my_profile->numbers->records;cur;cur=cur->next) { + ctsvc_number_s *number = (ctsvc_number_s *)cur->data; + if (number && number->number) { + if (__ctsvc_safe_strcmp(my_profile->display_name, number->number)) { + my_profile->display_name = SAFE_STRDUP(number->number); + break; + } + } + } + } + else if (my_profile->emails && my_profile->emails->records) { + for (cur=my_profile->emails->records;cur;cur=cur->next) { + ctsvc_email_s *email = (ctsvc_email_s*)cur->data; + if (email && email->email_addr) { + if (__ctsvc_safe_strcmp(my_profile->display_name, email->email_addr)) { + my_profile->display_name = SAFE_STRDUP(email->email_addr); + break; + } + } + } + } + } + return; +} + +static inline int __ctsvc_my_profile_update_data(ctsvc_my_profile_s *my_profile) +{ + int ret; + + if (my_profile->name) { + ret = ctsvc_contact_update_data_name((contacts_list_h)my_profile->name, my_profile->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_name() Failed(%d)", ret); + return ret; + } + } + + if (my_profile->company) { + ret = ctsvc_contact_update_data_company((contacts_list_h)my_profile->company, my_profile->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_company() Failed(%d)", ret); + return ret; + } + } + + if (my_profile->note) { + ret = ctsvc_contact_update_data_note((contacts_list_h)my_profile->note, my_profile->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_note() Failed(%d)", ret); + return ret; + } + } + + if (my_profile->events) { + ret = ctsvc_contact_update_data_event((contacts_list_h)my_profile->events, my_profile->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_events() Failed(%d)", ret); + return ret; + } + } + + if (my_profile->messengers) { + ret = ctsvc_contact_update_data_messenger((contacts_list_h)my_profile->messengers, my_profile->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_messengers() Failed(%d)", ret); + return ret; + } + } + + if (my_profile->postal_addrs) { + ret = ctsvc_contact_update_data_address((contacts_list_h)my_profile->postal_addrs, my_profile->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_address() Failed(%d)", ret); + return ret; + } + } + + if (my_profile->urls) { + ret = ctsvc_contact_update_data_url((contacts_list_h)my_profile->urls, my_profile->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_url() Failed(%d)", ret); + return ret; + } + } + + if (my_profile->nicknames) { + ret = ctsvc_contact_update_data_nickname((contacts_list_h)my_profile->nicknames, my_profile->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_nickname() Failed(%d)", ret); + return ret; + } + } + + if (my_profile->numbers) { + bool had_phonenumber; + ret = ctsvc_contact_update_data_number((contacts_list_h)my_profile->numbers, my_profile->id, true, &had_phonenumber); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_number() Failed(%d)", ret); + return ret; + } + } + + if (my_profile->emails) { + bool had_email; + ret = ctsvc_contact_update_data_email((contacts_list_h)my_profile->emails, my_profile->id, true, &had_email); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_email() Failed(%d)", ret); + return ret; + } + } + + if (my_profile->profiles) { + ret = ctsvc_contact_update_data_profile((contacts_list_h)my_profile->profiles, my_profile->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_profile() Failed(%d)", ret); + return ret; + } + } + + if (my_profile->relationships) { + ret = ctsvc_contact_update_data_relationship((contacts_list_h)my_profile->relationships, my_profile->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_relationship() Failed(%d)", ret); + return ret; + } + } + + if (my_profile->images) { + ret = ctsvc_contact_update_data_image((contacts_list_h)my_profile->images, my_profile->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_image() Failed(%d)", ret); + return ret; + } + } + + if (my_profile->extensions) { + ret = ctsvc_contact_update_data_extension((contacts_list_h)my_profile->extensions, my_profile->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_update_data_extension() Failed(%d)", ret); + return ret; + } + } + + return CONTACTS_ERROR_NONE; +} + +static void __ctsvc_my_profile_check_default_data(ctsvc_my_profile_s *my_profile) +{ + ctsvc_contact_check_default_number((contacts_list_h)my_profile->numbers); + ctsvc_contact_check_default_email((contacts_list_h)my_profile->emails); + ctsvc_contact_check_default_image((contacts_list_h)my_profile->images); +} + +static int __ctsvc_db_my_profile_update_record( contacts_record_h record ) +{ + int ret, len; + int count; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_my_profile_s *my_profile = (ctsvc_my_profile_s*)record; + cts_stmt stmt; + + snprintf(query, sizeof(query), + "SELECT count(my_profile_id) FROM "CTS_TABLE_MY_PROFILES" WHERE my_profile_id = %d", my_profile->id); + ret = ctsvc_query_get_first_int_result(query, &count); + RETVM_IF(1 != count, CONTACTS_ERROR_NO_DATA, + "The index(%d) is Invalid. %d Record(s) is(are) found", my_profile->id, ret); + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + __ctsvc_update_my_profile_display_name(my_profile); + __ctsvc_my_profile_check_default_data(my_profile); + + //update data + ret = __ctsvc_my_profile_update_data(my_profile); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("__ctsvc_my_profile_update_data() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ////////////////////////////////////////////////////////////////////// + // this code will be removed. + free(my_profile->image_thumbnail_path); + my_profile->image_thumbnail_path = NULL; + + if (my_profile->images) { + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + unsigned int count = 0; + ctsvc_list_s *list = (ctsvc_list_s*)my_profile->images; + ctsvc_image_s *image; + GList *cursor; + + for(cursor = list->deleted_records;cursor;cursor=cursor->next) { + image = (ctsvc_image_s *)cursor->data; + my_profile->image_thumbnail_path = NULL; + } + + contacts_list_get_count((contacts_list_h)my_profile->images, &count); + if (count) { + contacts_list_first((contacts_list_h)my_profile->images); + ret = contacts_list_get_current_record_p((contacts_list_h)my_profile->images, &record); + + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("contacts_list_get_current_record_p() Failed(%d)", ret); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + image = (ctsvc_image_s*)record; + + if ( image->path && *image->path && strstr(image->path, CTS_IMG_FULL_LOCATION) != NULL) + my_profile->image_thumbnail_path = SAFE_STRDUP( image->path + strlen(CTS_IMG_FULL_LOCATION) + 1); + else + my_profile->image_thumbnail_path = SAFE_STRDUP(image->path); + + } + } + // this code will be removed. + ////////////////////////////////////////////////////////////////////// + + len = snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_MY_PROFILES" SET changed_ver=%d, changed_time=%d, " + "display_name=?, uid=?, image_thumbnail_path=?", + ctsvc_get_next_ver(), (int)time(NULL)); + snprintf(query+len, sizeof(query)-len, " WHERE my_profile_id=%d", my_profile->id); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare() Failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + cts_stmt_bind_text(stmt, 1, my_profile->display_name); + if (my_profile->uid) + cts_stmt_bind_text(stmt, 2, my_profile->uid); + if (my_profile->image_thumbnail_path) + cts_stmt_bind_text(stmt, 3, my_profile->image_thumbnail_path); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + cts_stmt_finalize(stmt); + + ctsvc_set_my_profile_noti(); + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_my_profile_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int ret; + int len; + int my_profile_id; + cts_stmt stmt; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_list_h list; + + len = snprintf(query, sizeof(query), + "SELECT my_profile_id FROM "CTS_TABLE_MY_PROFILES); + + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + my_profile_id = ctsvc_stmt_get_int(stmt, 0); + ret = contacts_db_get_record(_contacts_my_profile._uri, my_profile_id, &record); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : contacts_db_get_record() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return CONTACTS_ERROR_NO_DATA; + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_my_profile_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_my_profile_s *my_profile; + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + bool had_my_profile_id = false; + int my_profile_id = 0; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + if (s_query->projection) { + for (i=0;iprojection_count;i++) { + if (s_query->projection[i] == CTSVC_PROPERTY_MY_PROFILE_ID) { + had_my_profile_id = true; + break; + } + } + } + else + had_my_profile_id = true; + + if (!had_my_profile_id) { + s_query->projection = realloc(s_query->projection, s_query->projection_count+1); + s_query->projection[s_query->projection_count] = CTSVC_PROPERTY_MY_PROFILE_ID; + s_query->projection_count++; + } + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE == ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + contacts_list_create(&list); + do { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_my_profile._uri, &record); + my_profile = (ctsvc_my_profile_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else + field_count = s_query->projection_count; + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_MY_PROFILE_ID: + my_profile_id = ctsvc_stmt_get_int(stmt, i); + if (had_my_profile_id) + my_profile->id = my_profile_id; + break; + case CTSVC_PROPERTY_MY_PROFILE_DISPLAY_NAME: + temp = ctsvc_stmt_get_text(stmt, i); + my_profile->display_name = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_MY_PROFILE_ADDRESSBOOK_ID: + my_profile->addressbook_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_MY_PROFILE_IMAGE_THUMBNAIL: + temp = ctsvc_stmt_get_text(stmt, i); + if (temp) { + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_IMG_FULL_LOCATION, temp); + my_profile->image_thumbnail_path = strdup(full_path); + } + break; + case CTSVC_PROPERTY_MY_PROFILE_CHANGED_TIME: + my_profile->changed_time = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_MY_PROFILE_UID: + temp = ctsvc_stmt_get_text(stmt, i); + my_profile->uid = SAFE_STRDUP(temp); + break; + default: + break; + } + } + ret = __ctsvc_db_my_profile_get_data(my_profile_id, my_profile); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_get_data_info Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + ctsvc_list_prepend(list, record); + } while ((ret = cts_stmt_step(stmt))); + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_my_profile_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_my_profile_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_my_profile_delete_records(int ids[], int count) { return CONTACTS_ERROR_NONE; } + +static int __ctsvc_my_profile_insert_data(ctsvc_my_profile_s *contact) +{ + int ret; + + //Insert the name + if (contact->name) { + ret = ctsvc_contact_insert_data_name((contacts_list_h)contact->name, contact->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_insert_data_name() Failed(%d)", ret); + return ret; + } + } + + //Insert the company + if (contact->company) { + ret = ctsvc_contact_insert_data_company((contacts_list_h)contact->company, contact->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_insert_my_profile_data_company() Failed(%d)", ret); + return ret; + } + } + + //Insert the events + if (contact->events) { + ret = ctsvc_contact_insert_data_event((contacts_list_h)contact->events, contact->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_insert_my_profile_data_event() Failed(%d)", ret); + return ret; + } + } + + //Insert the messengers + if (contact->messengers) { + ret = ctsvc_contact_insert_data_messenger((contacts_list_h)contact->messengers, contact->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_insert_my_profile_data_messenger() Failed(%d)", ret); + return ret; + } + } + + //Insert the postals + if (contact->postal_addrs) { + ret = ctsvc_contact_insert_data_address((contacts_list_h)contact->postal_addrs, contact->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_insert_my_profile_data_postal() Failed(%d)", ret); + return ret; + } + } + + //Insert the Web addrs + if (contact->urls) { + ret = ctsvc_contact_insert_data_url((contacts_list_h)contact->urls, contact->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_insert_my_profile_data_web() Failed(%d)", ret); + return ret; + } + } + + //Insert the Nick names + if (contact->nicknames) { + ret = ctsvc_contact_insert_data_nickname((contacts_list_h)contact->nicknames, contact->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_insert_my_profile_data_nickname() Failed(%d)", ret); + return ret; + } + } + + //Insert the numbers + if (contact->numbers) { + ret = ctsvc_contact_insert_data_number((contacts_list_h)contact->numbers, contact->id, true); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_contact_insert_data_number() Failed(%d)", ret); + return ret; + } + } + + //Insert the emails + if (contact->emails) { + ret = ctsvc_contact_insert_data_email((contacts_list_h)contact->emails, contact->id, true); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_insert_my_profile_data_email() Failed(%d)", ret); + return ret; + } + } + + //Insert the profile values + if (contact->profiles) { + ret = ctsvc_contact_insert_data_profile((contacts_list_h)contact->profiles, contact->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_insert_my_profile_data_profile() Failed(%d)", ret); + return ret; + } + } + + //Insert the relationship values + if (contact->relationships) { + ret = ctsvc_contact_insert_data_relationship((contacts_list_h)contact->relationships, contact->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_insert_data_relationship() Failed(%d)", ret); + return ret; + } + } + + //Insert the image values + if (contact->images) { + ret = ctsvc_contact_insert_data_image((contacts_list_h)contact->images, contact->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_insert_data_image() Failed(%d)", ret); + return ret; + } + } + + //Insert the note values + if (contact->note) { + ret = ctsvc_contact_insert_data_note((contacts_list_h)contact->note, contact->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_insert_data_note() Failed(%d)", ret); + return ret; + } + } + + //Insert the extensions values + if (contact->extensions) { + ret = ctsvc_contact_insert_data_extension((contacts_list_h)contact->extensions, contact->id, true); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_insert_data_extension() Failed(%d)", ret); + return ret; + } + } + + return CONTACTS_ERROR_NONE; +} + +void __ctsvc_make_my_profile_display_name(ctsvc_my_profile_s *my_profile) +{ + char display[CTS_SQL_MAX_LEN]={0}; + GList *cur; + int len; + + ctsvc_name_s *name = NULL; + + if ( my_profile->name->count > 0 && my_profile->name->records != NULL && my_profile->name->records->data != NULL ) { + name = (ctsvc_name_s *)my_profile->name->records->data; + } + + if ( name && ( name->first || name->last) ) { + + // make display name + len=0; + if(name->first) + len += snprintf(display + len, sizeof(display) - len, "%s", name->first); + + if(name->addition) { + if (*display) + len += snprintf(display + len, sizeof(display) - len, " "); + len += snprintf(display + len, sizeof(display) - len, "%s", name->addition); + } + + if(name->last) { + if (*display) + len += snprintf(display + len, sizeof(display) - len, " "); + len += snprintf(display + len, sizeof(display) - len, "%s", name->last); + } + + if(name->suffix) { + if (*display) + len += snprintf(display + len, sizeof(display) - len, " "); + len += snprintf(display + len, sizeof(display) - len, "%s", name->suffix); + } + + my_profile->display_name = strdup(display); + } + else { + if (my_profile->company && my_profile->company->records) { + for (cur=my_profile->company->records;cur;cur=cur->next) { + ctsvc_company_s *company = (ctsvc_company_s *)cur->data; + if (company && company->name) { + my_profile->display_name = SAFE_STRDUP(company->name); + break; + } + } + } + + if (NULL == my_profile->display_name && my_profile->nicknames->records) { + for (cur=my_profile->nicknames->records;cur;cur=cur->next) { + ctsvc_nickname_s *nickname = (ctsvc_nickname_s *)cur->data; + if (nickname && nickname->nickname) { + my_profile->display_name = SAFE_STRDUP(nickname->nickname); + break; + } + } + } + + if (NULL == my_profile->display_name && my_profile->numbers->records) { + for (cur=my_profile->numbers->records;cur;cur=cur->next) { + ctsvc_number_s *number = (ctsvc_number_s *)cur->data; + if (number && number->number) { + my_profile->display_name = SAFE_STRDUP(number->number); + break; + } + } + } + + if (NULL == my_profile->display_name && my_profile->emails->records) { + for (cur=my_profile->emails->records;cur;cur=cur->next) { + ctsvc_email_s *email = (ctsvc_email_s *)cur->data; + if (email && email->email_addr) { + my_profile->display_name = SAFE_STRDUP(email->email_addr); + break; + } + } + } + } + return; +} + +static int __ctsvc_db_my_profile_insert_record( contacts_record_h record, int *id) +{ + CTS_FN_CALL; + int ret; + int version; + char query[CTS_SQL_MAX_LEN] = {0}; + + ctsvc_my_profile_s *my_profile = (ctsvc_my_profile_s*)record; + cts_stmt stmt; + + // These check should be done in client side +// RETVM_IF(my_profile->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted my_profile record"); + RETVM_IF(NULL == my_profile, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : my_profile is NULL"); + RETVM_IF(my_profile->addressbook_id < 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : addressbook_id(%d) is mandatory field to insert my_profile record ", my_profile->addressbook_id); + RETVM_IF(0 < my_profile->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", my_profile->id); + + ret = ctsvc_begin_trans(); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + ret = cts_db_get_next_id(CTS_TABLE_MY_PROFILES); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("cts_db_get_next_id() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + my_profile->id = ret; + if (id) + *id = ret; + + __ctsvc_make_my_profile_display_name(my_profile); + __ctsvc_my_profile_check_default_data(my_profile); + + //Insert Data + ret = __ctsvc_my_profile_insert_data(my_profile); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_insert_my_profile_data() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ////////////////////////////////////////////////////////////////////// + // this code will be removed. + free(my_profile->image_thumbnail_path); + my_profile->image_thumbnail_path = NULL; + + if (my_profile->images) { + ctsvc_image_s *image; + unsigned int count = 0; + + contacts_list_get_count((contacts_list_h)my_profile->images, &count); + + while (count) { + contacts_list_first((contacts_list_h)my_profile->images); + ret = contacts_list_get_current_record_p((contacts_list_h)my_profile->images, (contacts_record_h*)&image); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("contacts_list_get_current_record_p() Failed(%d)", ret); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + if (image->path && image->is_default) { + my_profile->image_thumbnail_path = strdup(image->path); + break; + } + count--; + } + } + // this code will be removed. + ////////////////////////////////////////////////////////////////////// + + version = ctsvc_get_next_ver(); + + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_MY_PROFILES"(my_profile_id, addressbook_id, " + "created_ver, changed_ver, changed_time, " + "display_name, uid, image_thumbnail_path) " + "VALUES(%d, %d, %d, %d, %d, ?, ?, ?)", + my_profile->id, my_profile->addressbook_id, version, version, (int)time(NULL)); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare() Failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + if (my_profile->display_name) + cts_stmt_bind_text(stmt, 1, my_profile->display_name); + if (my_profile->uid) + cts_stmt_bind_text(stmt, 2, my_profile->uid); + if (my_profile->image_thumbnail_path) + cts_stmt_bind_text(stmt, 3, my_profile->image_thumbnail_path); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + cts_stmt_finalize(stmt); + + ctsvc_set_my_profile_noti(); + + ret = ctsvc_end_trans(true); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_svc_end_trans() Failed(%d)", ret); + + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_name.c b/native/ctsvc_db_plugin_name.c new file mode 100644 index 0000000..15ac142 --- /dev/null +++ b/native/ctsvc_db_plugin_name.c @@ -0,0 +1,382 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_normalize.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_query.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_db_plugin_name_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_list.h" + +static int __ctsvc_db_name_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_name_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_name_update_record( contacts_record_h record ); +static int __ctsvc_db_name_delete_record( int id ); +static int __ctsvc_db_name_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_name_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_name_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_name_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_name_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_name = { + .is_query_only = false, + .insert_record = __ctsvc_db_name_insert_record, + .get_record = __ctsvc_db_name_get_record, + .update_record = __ctsvc_db_name_update_record, + .delete_record = __ctsvc_db_name_delete_record, + .get_all_records = __ctsvc_db_name_get_all_records, + .get_records_with_query = __ctsvc_db_name_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_name_insert_records, + .update_records = NULL,//__ctsvc_db_name_update_records, + .delete_records = NULL,//__ctsvc_db_name_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_name_insert_record( contacts_record_h record, int *id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_name_s *name = (ctsvc_name_s *)record; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", name->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_name_insert(record, name->contact_id, false, id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + // TODO ; contact name update + ret = ctsvc_db_contact_update_changed_time(name->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_name_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, " + "data3, data4, data5, data6, data7, data8, data9, data10, data11, data12 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE id = %d AND datatype = %d ", + id, CTSVC_DATA_NAME); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ctsvc_db_name_get_value_from_stmt(stmt, out_record, 0); + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_name_update_record( contacts_record_h record ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_name_s *name = (ctsvc_name_s *)record; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", name->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_name_update(record, name->contact_id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + // TODO ; contact display name update + ret = ctsvc_db_contact_update_changed_time(name->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + + +static int __ctsvc_db_name_delete_record( int id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT " " + "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if( ret != CONTACTS_ERROR_NONE ) { + CTS_ERR("The id(%d) is Invalid(%d)", id, ret); + ctsvc_end_trans(false); + return contact_id; + } + + ret = ctsvc_db_name_delete(id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + // TODO ; contact name update + ret = ctsvc_db_contact_update_changed_time(contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_name_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int len; + int ret; + contacts_list_h list; + ctsvc_name_s *name; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, " + "data3, data4, data5, data6, data7, data8, data9, data10, data11, data12 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile=0 ", + CTSVC_DATA_NAME); + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + ctsvc_db_name_get_value_from_stmt(stmt, (contacts_record_h*)&name, 0); + ctsvc_list_prepend(list, (contacts_record_h)name); + } + + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_name_get_records_with_query( contacts_query_h query, int offset, + int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_name_s *name; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_name._uri, &record); + name = (ctsvc_name_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else { + field_count = s_query->projection_count; + ret = ctsvc_record_set_projection_flags(record, s_query->projection, + s_query->projection_count, s_query->property_count); + + if( CONTACTS_ERROR_NONE != ret) + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_NAME_ID: + name->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_NAME_CONTACT_ID: + name->contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_NAME_FIRST: + temp = ctsvc_stmt_get_text(stmt, i); + name->first = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_NAME_LAST: + temp = ctsvc_stmt_get_text(stmt, i); + name->last = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_NAME_ADDITION: + temp = ctsvc_stmt_get_text(stmt, i); + name->addition = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_NAME_SUFFIX: + temp = ctsvc_stmt_get_text(stmt, i); + name->suffix = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_NAME_PREFIX: + temp = ctsvc_stmt_get_text(stmt, i); + name->prefix = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_NAME_PHONETIC_FIRST: + temp = ctsvc_stmt_get_text(stmt, i); + name->phonetic_first = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_NAME_PHONETIC_MIDDLE: + temp = ctsvc_stmt_get_text(stmt, i); + name->phonetic_middle = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_NAME_PHONETIC_LAST: + temp = ctsvc_stmt_get_text(stmt, i); + name->phonetic_last = SAFE_STRDUP(temp); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_name_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_name_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_name_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_name_helper.c b/native/ctsvc_db_plugin_name_helper.c new file mode 100644 index 0000000..527b504 --- /dev/null +++ b/native/ctsvc_db_plugin_name_helper.c @@ -0,0 +1,385 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_normalize.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_name_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_setting.h" +#include "ctsvc_notification.h" + +enum{ + CTSVC_NN_FIRST, + CTSVC_NN_LAST, + CTSVC_NN_MAX, +}; + +static inline void __ctsvc_make_name_lookup(int op_code, const char *name_first, + const char *name_last, char **name_lookup) +{ + if (name_first && !name_last) + *name_lookup = SAFE_STRDUP(name_first); + else if (!name_first && name_last) + *name_lookup = SAFE_STRDUP(name_last); + else { + if (CONTACTS_NAME_DISPLAY_ORDER_FIRSTLAST == op_code) { + *name_lookup = calloc(1, SAFE_STRLEN(name_first) + SAFE_STRLEN(name_last) + 3); + snprintf(*name_lookup, SAFE_STRLEN(name_first) + SAFE_STRLEN(name_last) + 3, "%s %c%s", + SAFE_STR(name_first), 0x7E, SAFE_STR(name_last)); + + } + else { + *name_lookup = calloc(1, SAFE_STRLEN(name_first) + SAFE_STRLEN(name_last) + 5); + snprintf(*name_lookup, SAFE_STRLEN(name_first) + SAFE_STRLEN(name_last) + 5, "%s,%c %c%s", + SAFE_STR(name_last), 0x7E, 0x7E, SAFE_STR(name_first)); + } + } +} + +static inline int __ctsvc_name_bind_stmt(cts_stmt stmt, ctsvc_name_s *name, int start_cnt) +{ + cts_stmt_bind_int(stmt, start_cnt, name->is_default); + cts_stmt_bind_int(stmt, start_cnt+1, name->language_type); + if (name->first) + sqlite3_bind_text(stmt, start_cnt+2, name->first, + strlen(name->first), SQLITE_STATIC); + if (name->last) + sqlite3_bind_text(stmt, start_cnt+3, name->last, + strlen(name->last), SQLITE_STATIC); + if (name->addition) + sqlite3_bind_text(stmt, start_cnt+4, name->addition, + strlen(name->addition), SQLITE_STATIC); + if (name->prefix) + sqlite3_bind_text(stmt, start_cnt+5, name->prefix, + strlen(name->prefix), SQLITE_STATIC); + if (name->suffix) + sqlite3_bind_text(stmt, start_cnt+6, name->suffix, + strlen(name->suffix), SQLITE_STATIC); + if (name->phonetic_first) + sqlite3_bind_text(stmt, start_cnt+7, name->phonetic_first, + strlen(name->phonetic_first), SQLITE_STATIC); + if (name->phonetic_middle) + sqlite3_bind_text(stmt, start_cnt+8, name->phonetic_middle, + strlen(name->phonetic_middle), SQLITE_STATIC); + if (name->phonetic_last) + sqlite3_bind_text(stmt, start_cnt+9, name->phonetic_last, + strlen(name->phonetic_last), SQLITE_STATIC); + if (name->lookup) + sqlite3_bind_text(stmt, start_cnt+10, name->lookup, + strlen(name->lookup), SQLITE_STATIC); + if (name->reverse_lookup) + sqlite3_bind_text(stmt, start_cnt+11, name->reverse_lookup, + strlen(name->reverse_lookup), SQLITE_STATIC); + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_normalize_name(ctsvc_name_s *src, char *dest[]) +{ + int ret = CONTACTS_ERROR_NO_DATA; + int language_type = 0; + + if (src->first) { + dest[CTSVC_NN_FIRST] = calloc(1, strlen(src->first)* 5); + ret = ctsvc_normalize_str(src->first, dest[CTSVC_NN_FIRST], strlen(src->first)*5); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "_cts_normalize_str() Failed(%d)", ret); + language_type = ret; + } + + if (src->last) { + dest[CTSVC_NN_LAST] = calloc(1, strlen(src->last)* 5); + ret = ctsvc_normalize_str(src->last, dest[CTSVC_NN_LAST], strlen(src->last)*5); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "_cts_normalize_str() Failed(%d)", ret); + if (language_type < ret) + language_type = ret; + } + return language_type; +} + +int ctsvc_db_name_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id) +{ + int ret, len = 0; + cts_stmt stmt = NULL; + ctsvc_name_s *name = (ctsvc_name_s*)record; + char *tmp_first, *tmp_last; + char query[CTS_SQL_MAX_LEN]={0}; + char *normal_name[CTSVC_NN_MAX]={NULL}; //insert name search info + char *temp_normal_first = NULL; + char *temp_normal_last = NULL; + + RETV_IF(NULL == name, CONTACTS_ERROR_INVALID_PARAMETER); + +// RETVM_IF(name->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted name record"); + RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact_id(%d) is mandatory field to insert name record ", name->contact_id); + RETVM_IF(0 < name->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", name->id); + + if (name->first || name->last || name->addition || name->prefix || name->suffix + || name->phonetic_first || name->phonetic_middle || name->phonetic_last) { + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, is_default, data1, data2, data3, " + "data4, data5, data6, data7, data8, data9, data10, data11, data12) " + "VALUES(%d, %d, %d, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + contact_id, is_my_profile, CTSVC_DATA_NAME); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + tmp_first = name->first; + tmp_last = name->last; + + ret = __ctsvc_normalize_name(name, normal_name); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("__ctsvc_normalize_name() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + switch (ret) { + case CTSVC_LANG_KOREAN: + temp_normal_first = calloc(1, SAFE_STRLEN(normal_name[CTSVC_NN_LAST]) + SAFE_STRLEN(normal_name[CTSVC_NN_LAST]) + 1); + if (normal_name[CTSVC_NN_LAST]) { + len = snprintf(temp_normal_first, SAFE_STRLEN(normal_name[CTSVC_NN_LAST]) + SAFE_STRLEN(normal_name[CTSVC_NN_LAST]) + 1, + "%s", normal_name[CTSVC_NN_LAST]); + } + if (normal_name[CTSVC_NN_FIRST]) { + snprintf(temp_normal_first+len, SAFE_STRLEN(normal_name[CTSVC_NN_LAST]) + SAFE_STRLEN(normal_name[CTSVC_NN_LAST]) + 1 - len, + "%s", normal_name[CTSVC_NN_FIRST]); + } + temp_normal_last = NULL; + break; + case CTSVC_LANG_ENGLISH: + default: + if (normal_name[CTSVC_NN_FIRST] && normal_name[CTSVC_NN_FIRST][0]) + temp_normal_first = normal_name[CTSVC_NN_FIRST]; + else + name->first = NULL; + + if (normal_name[CTSVC_NN_LAST] && normal_name[CTSVC_NN_LAST][0]) + temp_normal_last = normal_name[CTSVC_NN_LAST]; + else + name->last = NULL; + break; + } + + + if (ctsvc_get_default_language() == ret) + name->language_type = CTSVC_LANG_DEFAULT; + else if (ctsvc_get_secondary_language() == ret) + name->language_type = CTSVC_LANG_SECONDARY; + else + name->language_type = ret; + + name->first = tmp_first; + name->last = tmp_last; + + __ctsvc_make_name_lookup(CONTACTS_NAME_DISPLAY_ORDER_FIRSTLAST, + temp_normal_first, temp_normal_last, &name->lookup); + + __ctsvc_make_name_lookup(CONTACTS_NAME_DISPLAY_ORDER_LASTFIRST, + temp_normal_first, temp_normal_last, &name->reverse_lookup); + +// CTS_DBG("lookup=%s(%d), reverse_lookup=%s(%d)", +// lookup, strlen(lookup), reverse_lookup, strlen(reverse_lookup)); + + free(normal_name[CTSVC_NN_FIRST]); + free(normal_name[CTSVC_NN_LAST]); + + __ctsvc_name_bind_stmt(stmt, name, 1); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + //name->id = cts_db_get_last_insert_id(); + if (id) + *id = cts_db_get_last_insert_id(); + name->contact_id = contact_id; + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_name_noti(); + } + + + // update search index table + name->is_changed = false; + return CONTACTS_ERROR_NONE; +} + + +int ctsvc_db_name_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count) +{ + int ret; + char *temp; + ctsvc_name_s *name; + + ret = contacts_record_create(_contacts_name._uri, (contacts_record_h *)&name); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + + name->id = ctsvc_stmt_get_int(stmt, start_count++); + name->contact_id = ctsvc_stmt_get_int(stmt, start_count++); + name->is_default = ctsvc_stmt_get_int(stmt, start_count++); + name->language_type = ctsvc_stmt_get_int(stmt, start_count++); + temp = ctsvc_stmt_get_text(stmt, start_count++); + name->first = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + name->last = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + name->addition = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + name->prefix = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + name->suffix = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + name->phonetic_first = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + name->phonetic_middle = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + name->phonetic_last = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + name->lookup = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + name->reverse_lookup = SAFE_STRDUP(temp); + + *record = (contacts_record_h)name; + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_name_update(contacts_record_h record, int contact_id, bool is_my_profile) +{ + int ret, len=0; + ctsvc_name_s *name = (ctsvc_name_s*)record; + char *tmp_first, *tmp_last; + char query[CTS_SQL_MAX_LEN] = {0}; + char *normal_name[CTSVC_NN_MAX] = {NULL}; + char *temp_normal_first = NULL; + char *temp_normal_last = NULL; + cts_stmt stmt; + + RETV_IF(false == name->is_changed, CONTACTS_ERROR_NONE); + RETVM_IF(!name->id, CONTACTS_ERROR_INVALID_PARAMETER, "name of contact has no ID."); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, is_default=?, data1=?, data2=?, data3=?, data4=?," + "data5=?, data6=?, data7=?, data8=?, data9=?, data10=?, data11=?, data12=? WHERE id=%d", contact_id, is_my_profile, name->id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + tmp_first = name->first; + tmp_last = name->last; + + ret = __ctsvc_normalize_name(name, normal_name); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("cts_normalize_name() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + switch (ret) { + case CTSVC_LANG_KOREAN: + temp_normal_first = calloc(1, SAFE_STRLEN(normal_name[CTSVC_NN_LAST]) + SAFE_STRLEN(normal_name[CTSVC_NN_LAST]) + 1); + if (normal_name[CTSVC_NN_LAST]) { + len = snprintf(temp_normal_first, SAFE_STRLEN(normal_name[CTSVC_NN_LAST]) + SAFE_STRLEN(normal_name[CTSVC_NN_LAST]) + 1, + "%s", normal_name[CTSVC_NN_LAST]); + } + if (normal_name[CTSVC_NN_FIRST]) { + snprintf(temp_normal_first+len, SAFE_STRLEN(normal_name[CTSVC_NN_LAST]) + SAFE_STRLEN(normal_name[CTSVC_NN_LAST]) + 1 - len, + "%s", normal_name[CTSVC_NN_FIRST]); + } + temp_normal_last = NULL; + break; + case CTSVC_LANG_ENGLISH: + default: + if (normal_name[CTSVC_NN_FIRST] && normal_name[CTSVC_NN_FIRST][0]) + temp_normal_first = normal_name[CTSVC_NN_FIRST]; + else + name->first = NULL; + + if (normal_name[CTSVC_NN_LAST] && normal_name[CTSVC_NN_LAST][0]) + temp_normal_last = normal_name[CTSVC_NN_LAST]; + else + name->last = NULL; + break; + } + + if (ctsvc_get_default_language() == ret) + name->language_type = CTSVC_LANG_DEFAULT; + else if (ctsvc_get_secondary_language() == ret) + name->language_type = CTSVC_LANG_SECONDARY; + else + name->language_type = ret; + + name->first = tmp_first; + name->last = tmp_last; + + __ctsvc_make_name_lookup(CONTACTS_NAME_DISPLAY_ORDER_FIRSTLAST, + temp_normal_first, temp_normal_last, &name->lookup); + + __ctsvc_make_name_lookup(CONTACTS_NAME_DISPLAY_ORDER_LASTFIRST, + temp_normal_first, temp_normal_last, &name->reverse_lookup); + +// CTS_DBG("lookup=%s(%d), reverse_lookup=%s(%d)", +// lookup, strlen(lookup), reverse_lookup, strlen(reverse_lookup)); + + free(normal_name[CTSVC_NN_FIRST]); + free(normal_name[CTSVC_NN_LAST]); + + __ctsvc_name_bind_stmt(stmt, name, 1); + name->contact_id = contact_id; + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_name_noti(); + name->is_changed = false; + + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_name_delete(int id) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d", id); + + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret); + ctsvc_set_name_noti(); + + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_name_helper.h b/native/ctsvc_db_plugin_name_helper.h new file mode 100644 index 0000000..4539a0f --- /dev/null +++ b/native/ctsvc_db_plugin_name_helper.h @@ -0,0 +1,32 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_NAME_HELPER_H__ +#define __CTSVC_DB_PLUGIN_NAME_HELPER_H__ + +#include "contacts.h" +#include "ctsvc_sqlite.h" + +int ctsvc_db_name_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id); +int ctsvc_db_name_update(contacts_record_h record, int contact_id, bool is_my_profile); +int ctsvc_db_name_delete(int id); + +int ctsvc_db_name_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count); + +#endif // __CTSVC_DB_PLUGIN_NAME_HELPER_H__ diff --git a/native/ctsvc_db_plugin_nickname.c b/native/ctsvc_db_plugin_nickname.c new file mode 100644 index 0000000..62b5be7 --- /dev/null +++ b/native/ctsvc_db_plugin_nickname.c @@ -0,0 +1,350 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_db_plugin_nickname_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_db_query.h" +#include "ctsvc_list.h" + +static int __ctsvc_db_nickname_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_nickname_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_nickname_update_record( contacts_record_h record ); +static int __ctsvc_db_nickname_delete_record( int id ); +static int __ctsvc_db_nickname_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_nickname_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_nickname_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_nickname_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_nickname_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_nickname = { + .is_query_only = false, + .insert_record = __ctsvc_db_nickname_insert_record, + .get_record = __ctsvc_db_nickname_get_record, + .update_record = __ctsvc_db_nickname_update_record, + .delete_record = __ctsvc_db_nickname_delete_record, + .get_all_records = __ctsvc_db_nickname_get_all_records, + .get_records_with_query = __ctsvc_db_nickname_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_nickname_insert_records, + .update_records = NULL,//__ctsvc_db_nickname_update_records, + .delete_records = NULL,//__ctsvc_db_nickname_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_nickname_insert_record( contacts_record_h record, int *id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_nickname_s *nickname = (ctsvc_nickname_s *)record; + + RETVM_IF(NULL == nickname->nickname, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : nickname is NULL"); + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", nickname->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_nickname_insert(record, nickname->contact_id, false, id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(nickname->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_nickname_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, data3 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE id = %d AND datatype = %d ", + id, CTSVC_DATA_NICKNAME); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ctsvc_db_nickname_get_value_from_stmt(stmt, out_record, 0); + + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_nickname_update_record( contacts_record_h record ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_nickname_s *nickname = (ctsvc_nickname_s *)record; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", nickname->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_nickname_update(record, nickname->contact_id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(nickname->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_nickname_delete_record( int id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT " " + "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if( ret != CONTACTS_ERROR_NONE ) { + CTS_ERR("The id(%d) is Invalid(%d)", id, ret); + ctsvc_end_trans(false); + return contact_id; + } + + ret = ctsvc_db_nickname_delete(id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_nickname_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int len; + int ret; + contacts_list_h list; + ctsvc_nickname_s *nickname; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, data3 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile=0 ", + CTSVC_DATA_NICKNAME); + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB : cts_stmt_step fail(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + ctsvc_db_nickname_get_value_from_stmt(stmt, (contacts_record_h*)&nickname, 0); + ctsvc_list_prepend(list, (contacts_record_h)nickname); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_nickname_get_records_with_query( contacts_query_h query, int offset, + int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_nickname_s *nickname; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_nickname._uri, &record); + nickname = (ctsvc_nickname_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else { + field_count = s_query->projection_count; + ret = ctsvc_record_set_projection_flags(record, s_query->projection, + s_query->projection_count, s_query->property_count); + + if(CONTACTS_ERROR_NONE != ret) + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_NICKNAME_ID: + nickname->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_NICKNAME_CONTACT_ID: + nickname->contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_NICKNAME_NAME: + temp = ctsvc_stmt_get_text(stmt, i); + nickname->nickname = SAFE_STRDUP(temp); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_nickname_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_nickname_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_nickname_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_nickname_helper.c b/native/ctsvc_db_plugin_nickname_helper.c new file mode 100644 index 0000000..e1b59c0 --- /dev/null +++ b/native/ctsvc_db_plugin_nickname_helper.c @@ -0,0 +1,143 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_nickname_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + + +int ctsvc_db_nickname_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count) +{ + int ret; + char *temp; + ctsvc_nickname_s *nickname; + + ret = contacts_record_create(_contacts_nickname._uri, (contacts_record_h *)&nickname); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + + nickname->id = ctsvc_stmt_get_int(stmt, start_count++); + nickname->contact_id = ctsvc_stmt_get_int(stmt, start_count++); + start_count++; + start_count++; + start_count++; + temp = ctsvc_stmt_get_text(stmt, start_count++); + nickname->nickname = SAFE_STRDUP(temp); + + *record = (contacts_record_h)nickname; + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_nickname_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id) +{ + int ret; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_nickname_s *nickname = (ctsvc_nickname_s *)record; + +// RETVM_IF(nickname->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted nickname record"); + RETV_IF(NULL == nickname->nickname, CONTACTS_ERROR_NONE); + RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact_id(%d) is mandatory field to insert nickname record ", nickname->contact_id); + RETVM_IF(0 < nickname->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", nickname->id); + + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, data1, data2, data3) " + "VALUES(%d, %d, %d, %d, ?, ?)", + contact_id, is_my_profile, CTSVC_DATA_NICKNAME, nickname->type); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + if (nickname->label) + cts_stmt_bind_text(stmt, 1, nickname->label); + if (nickname->nickname) + cts_stmt_bind_text(stmt, 2, nickname->nickname); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + //nickname->id = cts_db_get_last_insert_id(); + if (id) + *id = cts_db_get_last_insert_id(); + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_nickname_noti(); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_nickname_update(contacts_record_h record, int contact_id, bool is_my_profile) +{ + int ret; + ctsvc_nickname_s *nickname = (ctsvc_nickname_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + cts_stmt stmt; + + RETVM_IF(!nickname->id, CONTACTS_ERROR_INVALID_PARAMETER, "nickname of contact has no ID."); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=? WHERE id=%d", + contact_id, is_my_profile, nickname->type, nickname->id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + if (nickname->label) + cts_stmt_bind_text(stmt, 1, nickname->label); + if (nickname->nickname) + cts_stmt_bind_text(stmt, 2, nickname->nickname); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_nickname_noti(); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_nickname_delete(int id) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d", + id, CTSVC_DATA_NICKNAME); + + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret); + ctsvc_set_nickname_noti(); + + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_nickname_helper.h b/native/ctsvc_db_plugin_nickname_helper.h new file mode 100644 index 0000000..f94fde4 --- /dev/null +++ b/native/ctsvc_db_plugin_nickname_helper.h @@ -0,0 +1,32 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_NICKNAME_HELPER_H__ +#define __CTSVC_DB_PLUGIN_NICKNAME_HELPER_H__ + +#include "contacts.h" +#include "ctsvc_sqlite.h" + +int ctsvc_db_nickname_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id); +int ctsvc_db_nickname_update(contacts_record_h record, int contact_id, bool is_my_profile); +int ctsvc_db_nickname_delete(int id); + +int ctsvc_db_nickname_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count); + +#endif // __CTSVC_DB_PLUGIN_NICKNAME_HELPER_H__ diff --git a/native/ctsvc_db_plugin_note.c b/native/ctsvc_db_plugin_note.c new file mode 100644 index 0000000..6b6702f --- /dev/null +++ b/native/ctsvc_db_plugin_note.c @@ -0,0 +1,352 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_db_plugin_note_helper.h" +#include "ctsvc_db_query.h" +#include "ctsvc_list.h" +#include "ctsvc_record.h" + +static int __ctsvc_db_note_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_note_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_note_update_record( contacts_record_h record ); +static int __ctsvc_db_note_delete_record( int id ); +static int __ctsvc_db_note_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_note_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_note_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_note_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_note_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_note = { + .is_query_only = false, + .insert_record = __ctsvc_db_note_insert_record, + .get_record = __ctsvc_db_note_get_record, + .update_record = __ctsvc_db_note_update_record, + .delete_record = __ctsvc_db_note_delete_record, + .get_all_records = __ctsvc_db_note_get_all_records, + .get_records_with_query = __ctsvc_db_note_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_note_insert_records, + .update_records = NULL,//__ctsvc_db_note_update_records, + .delete_records = NULL,//__ctsvc_db_note_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_note_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, data3 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE id = %d AND datatype = %d ", + id, CTSVC_DATA_NOTE); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ctsvc_db_note_get_value_from_stmt(stmt, out_record, 0); + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_note_insert_record( contacts_record_h record, int *id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_note_s *note = (ctsvc_note_s *)record; + + RETVM_IF(NULL == note->note, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : note is NULL"); + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", note->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_note_insert(record, note->contact_id, false, id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(note->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_note_update_record( contacts_record_h record ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_note_s *note = (ctsvc_note_s *)record; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", note->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_note_update(record, note->contact_id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + // TODO ; contact display note update + ret = ctsvc_db_contact_update_changed_time(note->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + + +static int __ctsvc_db_note_delete_record( int id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT " " + "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if( ret != CONTACTS_ERROR_NONE ) { + CTS_ERR("The id(%d) is Invalid(%d)", id, ret); + ctsvc_end_trans(false); + return contact_id; + } + + ret = ctsvc_db_note_delete(id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + // TODO ; contact name update + ret = ctsvc_db_contact_update_changed_time(contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_note_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int len; + int ret; + contacts_list_h list; + ctsvc_note_s *note; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, data3 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile=0 ", + CTSVC_DATA_NOTE); + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB : cts_stmt_step fail(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + ctsvc_db_note_get_value_from_stmt(stmt, (contacts_record_h*)¬e, 0); + ctsvc_list_prepend(list, (contacts_record_h)note); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_note_get_records_with_query( contacts_query_h query, int offset, + int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_note_s *note; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_note._uri, &record); + note = (ctsvc_note_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else { + field_count = s_query->projection_count; + ret = ctsvc_record_set_projection_flags(record, s_query->projection, + s_query->projection_count, s_query->property_count); + + if(CONTACTS_ERROR_NONE != ret) + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_NOTE_ID: + note->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_NOTE_CONTACT_ID: + note->contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_NOTE_NOTE: + temp = ctsvc_stmt_get_text(stmt, i); + note->note = SAFE_STRDUP(temp); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_note_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_note_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_note_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_note_helper.c b/native/ctsvc_db_plugin_note_helper.c new file mode 100644 index 0000000..d0d04f1 --- /dev/null +++ b/native/ctsvc_db_plugin_note_helper.c @@ -0,0 +1,136 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_note_helper.h" +#include "ctsvc_notification.h" + +int ctsvc_db_note_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count) +{ + int ret; + char *temp; + ctsvc_note_s *note; + + ret = contacts_record_create(_contacts_note._uri, (contacts_record_h *)¬e); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + + note->id = ctsvc_stmt_get_int(stmt, start_count++); + note->contact_id = ctsvc_stmt_get_int(stmt, start_count++); + start_count++; + start_count++; + start_count++; + temp = ctsvc_stmt_get_text(stmt, start_count++); + note->note = SAFE_STRDUP(temp); + + *record = (contacts_record_h)note; + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_note_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id) +{ + int ret; + cts_stmt stmt = NULL; + ctsvc_note_s *note = (ctsvc_note_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + +// RETVM_IF(note->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted note record"); + RETV_IF(NULL == note->note, CONTACTS_ERROR_NONE); + RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact_id(%d) is mandatory field to insert note record ", note->contact_id); + RETVM_IF(0 < note->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", note->id); + + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, data3) " + "VALUES(%d, %d, %d, ?)", contact_id, is_my_profile, CTSVC_DATA_NOTE); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + sqlite3_bind_text(stmt, 1, note->note, + strlen(note->note), SQLITE_STATIC); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + if (id) + *id = cts_db_get_last_insert_id(); + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_note_noti(); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_note_update(contacts_record_h record, int contact_id, bool is_my_profile) +{ + int ret; + ctsvc_note_s *note = (ctsvc_note_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + cts_stmt stmt; + + RETVM_IF(!note->id, CONTACTS_ERROR_INVALID_PARAMETER, "note of contact has no ID."); + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data3=? WHERE id=%d", + contact_id, is_my_profile, note->id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + if (note->note) + sqlite3_bind_text(stmt, 1, note->note, + strlen(note->note), SQLITE_STATIC); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_note_noti(); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_note_delete(int id) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d", + id, CTSVC_DATA_NOTE); + + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret); + ctsvc_set_note_noti(); + + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_note_helper.h b/native/ctsvc_db_plugin_note_helper.h new file mode 100644 index 0000000..f0b3407 --- /dev/null +++ b/native/ctsvc_db_plugin_note_helper.h @@ -0,0 +1,32 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_NOTE_HELPER_H__ +#define __CTSVC_DB_PLUGIN_NOTE_HELPER_H__ + +#include "contacts.h" +#include "ctsvc_sqlite.h" + +int ctsvc_db_note_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id); +int ctsvc_db_note_update(contacts_record_h record, int contact_id, bool is_my_profile); +int ctsvc_db_note_delete(int id); + +int ctsvc_db_note_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count); + +#endif // __CTSVC_DB_PLUGIN_NOTE_HELPER_H__ diff --git a/native/ctsvc_db_plugin_number.c b/native/ctsvc_db_plugin_number.c new file mode 100644 index 0000000..d6d8335 --- /dev/null +++ b/native/ctsvc_db_plugin_number.c @@ -0,0 +1,384 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_query.h" +#include "ctsvc_normalize.h" +#include "ctsvc_db_plugin_number_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" +#include "ctsvc_list.h" + +static int __ctsvc_db_number_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_number_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_number_update_record( contacts_record_h record ); +static int __ctsvc_db_number_delete_record( int id ); +static int __ctsvc_db_number_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_number_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_number_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_number_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_number_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_number = { + .is_query_only = false, + .insert_record = __ctsvc_db_number_insert_record, + .get_record = __ctsvc_db_number_get_record, + .update_record = __ctsvc_db_number_update_record, + .delete_record = __ctsvc_db_number_delete_record, + .get_all_records = __ctsvc_db_number_get_all_records, + .get_records_with_query = __ctsvc_db_number_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_number_insert_records, + .update_records = NULL,//__ctsvc_db_number_update_records, + .delete_records = NULL,//__ctsvc_db_number_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + + +static int __ctsvc_db_number_insert_record( contacts_record_h record, int *id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_number_s *number = (ctsvc_number_s *)record; + RETVM_IF(NULL == number->number, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : number is NULL"); + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", number->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_number_insert(record, number->contact_id, false, id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_CONTACTS" SET has_phonenumber = %d, changed_ver = %d, changed_time = %d " + "WHERE contact_id = %d", + 1, ctsvc_get_next_ver(), (int)time(NULL), number->contact_id); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + // should update person default number + ctsvc_set_contact_noti(); + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_number_get_record( int id, contacts_record_h* out_record ) +{ + char query[CTS_SQL_MAX_LEN] = {0}; + int ret; + cts_stmt stmt = NULL; + + snprintf(query, sizeof(query), + "SELECT id, contact_id, is_default, type, label, number, lookup " + "FROM "CTSVC_DB_VIEW_NUMBER" WHERE id = %d", id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ctsvc_db_number_get_value_from_stmt(stmt, out_record, 0); + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_number_update_record( contacts_record_h record ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_number_s *number = (ctsvc_number_s *)record; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", number->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_number_update(record, number->contact_id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_CONTACTS" SET has_phonenumber = %d, changed_ver = %d, changed_time = %d " + "WHERE contact_id = %d", + 1, ctsvc_get_next_ver(), (int)time(NULL), number->contact_id); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + // should update person default number + ctsvc_set_contact_noti(); + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_number_delete_record( int id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + bool has_phonenumber = false; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT " " + "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if( ret != CONTACTS_ERROR_NONE ) { + CTS_ERR("The id(%d) is Invalid(%d)", id, ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_number_delete(id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT COUNT(id) FROM "CTS_TABLE_DATA" WHERE contact_id = %d AND is_my_profile = 0", contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if ( 0 < ret ) + has_phonenumber = true; + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_CONTACTS" SET has_phonenumber = %d, changed_ver = %d, changed_time = %d " + "WHERE contact_id = %d", + has_phonenumber, ctsvc_get_next_ver(), (int)time(NULL), contact_id); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + // should update person default number + ctsvc_set_contact_noti(); + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_number_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int len; + int ret; + contacts_list_h list; + ctsvc_number_s *number; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT id, contact_id, is_default, type, label, number, lookup FROM "CTSVC_DB_VIEW_NUMBER); + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step Failed (%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + ctsvc_db_number_get_value_from_stmt(stmt, (contacts_record_h*)&number, 0); + ctsvc_list_prepend(list, (contacts_record_h)number); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_number_get_records_with_query( contacts_query_h query, int offset, + int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_number_s *number; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_number._uri, &record); + number = (ctsvc_number_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else { + field_count = s_query->projection_count; + ret = ctsvc_record_set_projection_flags(record, s_query->projection, + s_query->projection_count, s_query->property_count); + + if(CONTACTS_ERROR_NONE != ret) + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_NUMBER_ID: + number->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_NUMBER_CONTACT_ID: + number->contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_NUMBER_TYPE: + number->type = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_NUMBER_IS_DEFAULT: + number->is_default = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_NUMBER_LABEL: + temp = ctsvc_stmt_get_text(stmt, i); + number->label = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_NUMBER_NUMBER: + temp = ctsvc_stmt_get_text(stmt, i); + number->number = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_NUMBER_NUMBER_FILTER: + temp = ctsvc_stmt_get_text(stmt, i); + number->lookup = SAFE_STRDUP(temp); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_number_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_number_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_number_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_number_helper.c b/native/ctsvc_db_plugin_number_helper.c new file mode 100644 index 0000000..4a27b34 --- /dev/null +++ b/native/ctsvc_db_plugin_number_helper.c @@ -0,0 +1,167 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_db_init.h" +#include "ctsvc_normalize.h" +#include "ctsvc_db_plugin_number_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + +int ctsvc_db_number_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id) +{ + int ret; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_number_s *number = (ctsvc_number_s *)record; + char normal_num[CTSVC_NUMBER_MAX_LEN] = {0}; + char clean_num[CTSVC_NUMBER_MAX_LEN] = {0}; + +// RETVM_IF(number->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted number record"); + RETV_IF(NULL == number->number, CONTACTS_ERROR_NONE); + RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact_id(%d) is mandatory field to insert number record ", number->contact_id); + RETVM_IF(0 < number->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", number->id); + + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, is_default, data1, data2, data3, data4) " + "VALUES(%d, %d, %d, %d, %d, ?, ?, ?)", + contact_id, is_my_profile, CTSVC_DATA_NUMBER, number->is_default, number->type); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + if (number->label) + cts_stmt_bind_text(stmt, 1, number->label); + + cts_stmt_bind_text(stmt, 2, number->number); + ret = ctsvc_clean_number(number->number, clean_num, sizeof(clean_num)); + if (0 < ret) { + ret = ctsvc_normalize_number(clean_num, normal_num, CTSVC_NUMBER_MAX_LEN); + if (CONTACTS_ERROR_NONE == ret) + cts_stmt_bind_text(stmt, 3, normal_num); + } + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + //number->id = cts_db_get_last_insert_id(); + if (id) + *id = cts_db_get_last_insert_id(); + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_number_noti(); + + return CONTACTS_ERROR_NONE; +} + + +int ctsvc_db_number_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count) +{ + int ret; + char *temp; + ctsvc_number_s *number; + + ret = contacts_record_create(_contacts_number._uri, (contacts_record_h *)&number); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + + number->id = ctsvc_stmt_get_int(stmt, start_count++); + number->contact_id = ctsvc_stmt_get_int(stmt, start_count++); + number->is_default = ctsvc_stmt_get_int(stmt, start_count++); + number->type = ctsvc_stmt_get_int(stmt, start_count++); + temp = ctsvc_stmt_get_text(stmt, start_count++); + number->label = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + number->number = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + number->lookup = SAFE_STRDUP(temp); + + *record = (contacts_record_h)number; + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_number_update(contacts_record_h record, int contact_id, bool is_my_profile) +{ + int ret; + ctsvc_number_s *number = (ctsvc_number_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + char normal_num[CTSVC_NUMBER_MAX_LEN] = {0}; + char clean_num[CTSVC_NUMBER_MAX_LEN] = {0}; + cts_stmt stmt; + + RETVM_IF(!number->id, CONTACTS_ERROR_INVALID_PARAMETER, "number of contact has no ID."); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=?, data4=? WHERE id=%d", + contact_id, is_my_profile, number->type, number->id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + if (number->label) + cts_stmt_bind_text(stmt, 1, number->label); + + if (number->number) + cts_stmt_bind_text(stmt, 2, number->number); + ret = ctsvc_clean_number(number->number, clean_num, sizeof(clean_num)); + if (0 < ret) { + ret = ctsvc_normalize_number(clean_num, normal_num, CTSVC_NUMBER_MAX_LEN); + if (CONTACTS_ERROR_NONE == ret) + cts_stmt_bind_text(stmt, 3, normal_num); + } + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_number_noti(); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_number_delete(int id) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d", + id, CTSVC_DATA_NUMBER); + + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret); + ctsvc_set_number_noti(); + + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_number_helper.h b/native/ctsvc_db_plugin_number_helper.h new file mode 100644 index 0000000..fe07513 --- /dev/null +++ b/native/ctsvc_db_plugin_number_helper.h @@ -0,0 +1,32 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_NUMBER_HELPER_H__ +#define __CTSVC_DB_PLUGIN_NUMBER_HELPER_H__ + +#include "contacts.h" +#include "ctsvc_sqlite.h" + +int ctsvc_db_number_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id); +int ctsvc_db_number_update(contacts_record_h record, int contact_id, bool is_my_profile); +int ctsvc_db_number_delete(int id); + +int ctsvc_db_number_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count); + +#endif // __CTSVC_DB_PLUGIN_NUMBER_HELPER_H__ diff --git a/native/ctsvc_db_plugin_person.c b/native/ctsvc_db_plugin_person.c new file mode 100644 index 0000000..b7e4eee --- /dev/null +++ b/native/ctsvc_db_plugin_person.c @@ -0,0 +1,609 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_db_plugin_person_helper.h" +#include "ctsvc_db_init.h" +#include "ctsvc_utils.h" +#include "ctsvc_list.h" +#include "ctsvc_db_query.h" +#include "ctsvc_record.h" +#include "ctsvc_normalize.h" +#include "ctsvc_notification.h" + +#ifdef _CONTACTS_IPC_SERVER +#include "ctsvc_server_change_subject.h" +#endif + +static int __ctsvc_db_person_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_person_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_person_update_record( contacts_record_h record ); +static int __ctsvc_db_person_delete_record( int id ); +static int __ctsvc_db_person_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_person_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_person_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_person_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_person_delete_records(int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_person = { + .is_query_only = false, + .insert_record = __ctsvc_db_person_insert_record, + .get_record = __ctsvc_db_person_get_record, + .update_record = __ctsvc_db_person_update_record, + .delete_record = __ctsvc_db_person_delete_record, + .get_all_records = __ctsvc_db_person_get_all_records, + .get_records_with_query = __ctsvc_db_person_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_person_insert_records, + .update_records = NULL,//__ctsvc_db_person_update_records, + .delete_records = NULL,//__ctsvc_db_person_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_person_insert_record( contacts_record_h record, int *id ) +{ + CTS_ERR("Can not insert person record directly"); + return CONTACTS_ERROR_INVALID_PARAMETER; +} + +static int __ctsvc_db_person_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_record_h record; + + *out_record = NULL; + snprintf(query, sizeof(query), + "SELECT persons.person_id, " + "%s, " + "_NORMALIZE_INDEX_(%s), " + "name_contact_id, " + "persons.image_thumbnail_path, " + "persons.ringtone_path, " + "persons.vibration, " + "status, " + "link_count, " + "account_id1, " + "account_id2, " + "account_id3, " + "addressbook_ids, " + "persons.has_phonenumber, " + "persons.has_email, " + "EXISTS(SELECT person_id FROM "CTS_TABLE_FAVORITES" WHERE person_id=persons.person_id) is_favorite " + "FROM "CTS_TABLE_PERSONS" " + "LEFT JOIN "CTS_TABLE_CONTACTS" " + "ON (name_contact_id = contacts.contact_id AND contacts.deleted = 0) " + "WHERE persons.person_id = %d", + ctsvc_get_display_column(), ctsvc_get_display_column(), id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if( 1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + ret = ctsvc_db_person_create_record_from_stmt(stmt, &record); + cts_stmt_finalize(stmt); + + if(CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_db_person_create_record_from_stmt() Failed(%d)", ret); + return ret; + } + + *out_record = record; + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_db_person_set_favorite(int person_id, bool set) +{ + int ret; + double prio = 0.0; + cts_stmt stmt = NULL; + char query[CTS_SQL_MIN_LEN] = {0}; + + if (set) { + snprintf(query, sizeof(query), + "SELECT MAX(favorite_prio) FROM "CTS_TABLE_FAVORITES); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ == ret) { + prio = ctsvc_stmt_get_dbl(stmt, 0); + } + else if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + cts_stmt_finalize(stmt); + + prio = prio + 1.0; + snprintf(query, sizeof(query), + "INSERT OR REPLACE INTO "CTS_TABLE_FAVORITES" values(%d, %f)", person_id, prio); + } + else { + snprintf(query, sizeof(query), + "DELETE FROM "CTS_TABLE_FAVORITES" WHERE person_id = %d", person_id); + } + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_query_exec() Failed(%d)", ret); + return ret; + } + + ret = cts_db_change(); + if (0 < ret) + ctsvc_set_favor_noti(); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_CONTACTS" SET is_favorite = %d " + "WHERE person_id=%d AND deleted = 0", set?1:0, person_id); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_query_exec() Failed(%d)", ret); + return ret; + } + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_person_update_record( contacts_record_h record ) +{ + int ret, i, len, len2; + cts_stmt stmt = NULL; + char query[CTS_SQL_MIN_LEN] = {0}; + char contact_query[CTS_SQL_MIN_LEN] = {0}; + ctsvc_person_s *person = (ctsvc_person_s *)record; + const char *display_name = NULL; + + RETV_IF(NULL == person, CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(person->person_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER); + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + len = snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_PERSONS" SET changed_ver=%d ", ctsvc_get_next_ver()); + + len2 = snprintf(contact_query, sizeof(contact_query), + "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver=%d ", ctsvc_get_next_ver()); + + if (person->name_contact_id_changed) { + // check name_contact_id validation + char *temp; + char check_query[CTS_SQL_MIN_LEN] = {0}; + snprintf(check_query, sizeof(check_query), "SELECT contact_id, %s FROM "CTS_TABLE_CONTACTS + " WHERE person_id = %d AND contact_id = %d AND deleted = 0", + ctsvc_get_display_column(), person->person_id, person->name_contact_id); + stmt = cts_query_prepare(check_query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare() Failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + ret = cts_stmt_step(stmt); + if ( 1 != ret) { + if ( CONTACTS_ERROR_NONE == ret) { + CTS_ERR("Invalid paramter : the name_contact_id(%d) is not linked with person_id(%d)", + person->name_contact_id, person->person_id); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + else { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + } + temp = ctsvc_stmt_get_text(stmt, 0); + display_name = SAFE_STRDUP(temp); + + len += snprintf(query + len, sizeof(query) - len, ", name_contact_id = %d ", person->name_contact_id); + + cts_stmt_finalize(stmt); + } + if (person->image_thumbnail_changed) + len += snprintf(query + len, sizeof(query) - len, ", image_thumbnail_path=? "); + if (person->ringtone_changed) { + len += snprintf(query + len, sizeof(query) - len, ", ringtone_path=? "); + len2 += snprintf(contact_query + len2, sizeof(contact_query) - len2, ", ringtone_path=? "); + } + if (person->vibration_changed) { + len += snprintf(query + len, sizeof(query) - len, ", vibration=? "); + len2 += snprintf(contact_query + len2, sizeof(contact_query) - len2, ", vibration=? "); + } + + snprintf(query+len, sizeof(query)-len, " WHERE person_id=%d", person->person_id); + snprintf(contact_query+len2, sizeof(contact_query)-len2, + " WHERE person_id=%d AND deleted = 0", person->person_id); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare() Failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + i = 1; + if (person->image_thumbnail_changed) { + if (person->image_thumbnail_path) + cts_stmt_bind_text(stmt, i, person->image_thumbnail_path); + i++; + } + + if (person->ringtone_changed) { + if (person->ringtone_path) + cts_stmt_bind_text(stmt, i, person->ringtone_path); + i++; + } + if (person->vibration_changed) { + if (person->vibration) + cts_stmt_bind_text(stmt, i, person->vibration); + i++; + } + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + cts_stmt_finalize(stmt); + + stmt = cts_query_prepare(contact_query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare() Failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + i = 1; + if (person->ringtone_changed) { + if (person->ringtone_path) + cts_stmt_bind_text(stmt, i, person->ringtone_path); + i++; + } + if (person->vibration_changed) { + if (person->vibration) + cts_stmt_bind_text(stmt, i, person->vibration); + i++; + } + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + cts_stmt_finalize(stmt); + + // update favorite + if (person->is_favorite_changed) { + ret = __ctsvc_db_person_set_favorite(person->person_id, person->is_favorite); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + } + + // update person display_name + if (display_name) { + char temp[CTS_SQL_MAX_LEN] = {0}; + person->display_name = SAFE_STRDUP(display_name); + ret = ctsvc_normalize_index(person->display_name, temp, sizeof(temp)); + if (0 <= ret) + person->display_name_index = strdup(temp); + // TODO : update name primary_default?? + } + ctsvc_set_person_noti(); +#ifdef _CONTACTS_IPC_SERVER + ctsvc_change_subject_add_changed_person_id(CONTACTS_CHANGE_UPDATED, person->person_id); +#endif + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else { + person->name_contact_id_changed = false; + person->image_thumbnail_changed = false; + person->ringtone_changed = false; + person->vibration_changed = false; + person->is_favorite_changed = false; + return CONTACTS_ERROR_NONE; + } +} + +static int __ctsvc_db_person_delete_record( int id ) +{ + int ret, rel_changed; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_GROUPS" SET member_changed_ver=%d " + "WHERE group_id IN (SELECT distinct group_id " + "FROM "CTS_TABLE_CONTACTS" C, "CTS_TABLE_GROUP_RELATIONS" R " + "ON C.contact_id=R.contact_id AND R.deleted = 0 AND C.deleted = 0 " + "WHERE person_id = %d)", + ctsvc_get_next_ver(), id); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + rel_changed = cts_db_change(); + + // images are deleted by db trigger callback function in ctsvc_db_contact_delete_callback + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_CONTACTS" WHERE person_id = %d", id); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_PERSONS" WHERE person_id = %d", id); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_set_contact_noti(); + ctsvc_set_person_noti(); + if (rel_changed > 0) + ctsvc_set_group_rel_noti(); + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_person_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int ret; + int len; + cts_stmt stmt; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_list_h list; + + len = snprintf(query, sizeof(query), + "SELECT person_id, " + "%s, " + "_NORMALIZE_INDEX_(%s), " + "name_contact_id, " + "image_thumbnail_path, " + "ringtone_path, " + "vibration, " + "status, " + "link_count, " + "account_id1, " + "account_id2, " + "account_id3, " + "addressbook_ids, " + "has_phonenumber, " + "has_email, " + "is_favorite " + "FROM "CTSVC_DB_VIEW_PERSON" ORDER BY %s", + ctsvc_get_display_column(), ctsvc_get_display_column(), ctsvc_get_sort_column()); + + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + ret = ctsvc_db_person_create_record_from_stmt(stmt, &record); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_person_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_person_s *person; + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_person._uri, &record); + person = (ctsvc_person_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else + { + field_count = s_query->projection_count; + + if( CONTACTS_ERROR_NONE != ctsvc_record_set_projection_flags(record, s_query->projection, s_query->projection_count, s_query->property_count) ) + { + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_PERSON_ID: + person->person_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_DISPLAY_NAME: + temp = ctsvc_stmt_get_text(stmt, i); + person->display_name = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX: + temp = ctsvc_stmt_get_text(stmt, i); + person->display_name_index = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID: + person->name_contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_RINGTONE: + temp = ctsvc_stmt_get_text(stmt, i); + person->ringtone_path = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL: + temp = ctsvc_stmt_get_text(stmt, i); + if (temp && *temp) { + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_IMG_FULL_LOCATION, temp); + person->image_thumbnail_path = strdup(full_path); + } + break; + case CTSVC_PROPERTY_PERSON_IS_FAVORITE: + person->is_favorite = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER: + person->has_phonenumber = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_HAS_EMAIL: + person->has_email = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_LINK_COUNT: + person->link_count = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_ACCOUNT_ID1: + person->account_id1 = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_ACCOUNT_ID2: + person->account_id2 = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_ACCOUNT_ID3: + person->account_id3 = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS: + temp = ctsvc_stmt_get_text(stmt, i); + person->addressbook_ids = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PERSON_VIBRATION: + temp = ctsvc_stmt_get_text(stmt, i); + person->vibration = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PERSON_STATUS: + temp = ctsvc_stmt_get_text(stmt, i); + person->status = SAFE_STRDUP(temp); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + + return CONTACTS_ERROR_NONE; +} + +#if 0 +static int __ctsvc_db_person_insert_records(const contacts_list_h in_list, int **ids) +{ + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_person_update_records(const contacts_list_h in_list) +{ + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_person_delete_records(int ids[], int count) +{ + return CONTACTS_ERROR_NONE; +} +#endif diff --git a/native/ctsvc_db_plugin_person_helper.c b/native/ctsvc_db_plugin_person_helper.c new file mode 100755 index 0000000..e86cca8 --- /dev/null +++ b/native/ctsvc_db_plugin_person_helper.c @@ -0,0 +1,477 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_db_plugin_person_helper.h" +#include "ctsvc_normalize.h" +#include "ctsvc_db_init.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_query.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + +#ifdef _CONTACTS_IPC_SERVER +#include "ctsvc_server_change_subject.h" +#endif + +int ctsvc_db_person_create_record_from_stmt_with_projection(cts_stmt stmt, unsigned int *projection, int projection_count, contacts_record_h *record) +{ + ctsvc_person_s *person; + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + + contacts_record_create(_contacts_person._uri, record); + person = (ctsvc_person_s*)*record; + + int i; + for(i=0;iperson_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_DISPLAY_NAME: + temp = ctsvc_stmt_get_text(stmt, i); + person->display_name = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX: + temp = ctsvc_stmt_get_text(stmt, i); + person->display_name_index = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID: + person->name_contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_RINGTONE: + temp = ctsvc_stmt_get_text(stmt, i); + person->ringtone_path = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL: + temp = ctsvc_stmt_get_text(stmt, i); + if (temp && *temp) { + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_IMG_FULL_LOCATION, temp); + person->image_thumbnail_path = strdup(full_path); + } + break; + case CTSVC_PROPERTY_PERSON_VIBRATION: + temp = ctsvc_stmt_get_text(stmt, i); + person->vibration = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PERSON_STATUS: + temp = ctsvc_stmt_get_text(stmt, i); + person->status = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PERSON_IS_FAVORITE: + person->is_favorite = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER: + person->has_phonenumber = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_HAS_EMAIL: + person->has_email = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_LINK_COUNT: + person->link_count = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_ACCOUNT_ID1: + person->account_id1 = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_ACCOUNT_ID2: + person->account_id2 = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_ACCOUNT_ID3: + person->account_id3 = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS: + temp = ctsvc_stmt_get_text(stmt, i); + person->addressbook_ids = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PERSON_FAVORITE_PRIORITY: + { + // TODO: Fixme (BS) + int value = ctsvc_stmt_get_int(stmt, i); + value++; // fix warning + } + break; + // ASSERT_NOT_REACHED("Invalid parameter : property_id(0x%0x) is not supported in projection value(person)", property_id); + // return CONTACTS_ERROR_INVALID_PARAMETER; + default: + ASSERT_NOT_REACHED("Invalid parameter : property_id(0x%0x) is not supported in value(person)", property_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + } + return CONTACTS_ERROR_NONE; +} + + +int ctsvc_db_person_create_record_from_stmt_with_query(cts_stmt stmt, contacts_query_h query, contacts_record_h *record) +{ + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + ctsvc_query_s *s_query = (ctsvc_query_s *)query; + + if (0 == s_query->projection_count) + { + unsigned int *projection = malloc(sizeof(unsigned int)*s_query->property_count); + int i; + for(i=0;iproperty_count;i++) + { + projection[i] = s_query->properties[i].property_id; + } + + int ret = ctsvc_db_person_create_record_from_stmt_with_projection(stmt, projection, s_query->property_count, record); + + free(projection); + + return ret; + } + else + return ctsvc_db_person_create_record_from_stmt_with_projection(stmt, s_query->projection, s_query->projection_count, record); + +} + +int ctsvc_db_person_create_record_from_stmt(cts_stmt stmt, contacts_record_h *record) +{ + int ret; + int i; + char *temp; + ctsvc_person_s *person; + + i = 0; + ret = contacts_record_create(_contacts_person._uri, record); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + person = (ctsvc_person_s *)*record; + person->person_id = ctsvc_stmt_get_int(stmt, i++); + + temp = ctsvc_stmt_get_text(stmt, i++); + person->display_name = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + person->display_name_index = SAFE_STRDUP(temp); + person->name_contact_id = ctsvc_stmt_get_int(stmt, i++); + + temp = ctsvc_stmt_get_text(stmt, i++); + if (temp && *temp) { + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_IMG_FULL_LOCATION, temp); + person->image_thumbnail_path = strdup(full_path); + } + + temp = ctsvc_stmt_get_text(stmt, i++); + person->ringtone_path = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + person->vibration = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + person->status = SAFE_STRDUP(temp); + + person->link_count = ctsvc_stmt_get_int(stmt, i++); + person->account_id1 = ctsvc_stmt_get_int(stmt, i++); + person->account_id2 = ctsvc_stmt_get_int(stmt, i++); + person->account_id3 = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + person->addressbook_ids = SAFE_STRDUP(temp); + + person->has_phonenumber = ctsvc_stmt_get_int(stmt, i++); + person->has_email = ctsvc_stmt_get_int(stmt, i++); + person->is_favorite = ctsvc_stmt_get_int(stmt, i++); + + return CONTACTS_ERROR_NONE; +} + +inline static const char* __cts_get_image_filename(const char* src) +{ + const char* dir = CTS_IMG_FULL_LOCATION; + int pos=0; + while (dir[pos]==src[pos]) { + pos++; + } + + if ('/' == src[pos]) + return src + pos + 1; + + return src+pos; +} + +int ctsvc_db_insert_person(contacts_record_h record) +{ + int ret, index; + cts_stmt stmt = NULL; + char query[CTS_SQL_MIN_LEN] = {0}; + contacts_record_h addressbook; + int account_id, version; + ctsvc_contact_s *contact = (ctsvc_contact_s*)record; + char *status = NULL; + + ret = contacts_db_get_record(_contacts_address_book._uri, contact->addressbook_id, &addressbook); + if(CONTACTS_ERROR_NONE != ret) { + CTS_ERR("contacts_svc_get_addressbook() Failed\n"); + return CONTACTS_ERROR_DB; + } + contacts_record_get_int(addressbook, _contacts_address_book.account_id, &account_id); + contacts_record_destroy(addressbook, true); + + snprintf(query, sizeof(query), + "SELECT status FROM %s " + "WHERE contact_id=%d " + "ORDER BY timestamp DESC LIMIT 1", + CTS_TABLE_ACTIVITIES, contact->id); + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare() Failed(%d)", ret); + return CONTACTS_ERROR_DB; + } + + if (1 == cts_stmt_step(stmt)) + status = SAFE_STRDUP(ctsvc_stmt_get_text(stmt, 0)); + + sqlite3_finalize(stmt); + + version = ctsvc_get_next_ver(); + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_PERSONS"(name_contact_id, created_ver, changed_ver, " + "has_phonenumber, has_email, ringtone_path, vibration, status, " + "image_thumbnail_path, link_count, account_id1, addressbook_ids) " + "VALUES(%d, %d, %d, %d, %d, ?, ?, ?, ?, 1, %d, '%d') ", + contact->id, version, version, + contact->has_phonenumber, contact->has_email, account_id, contact->addressbook_id); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare() Failed(%d)", ret); + free(status); + return CONTACTS_ERROR_DB; + } + if(contact->ringtone_path) + cts_stmt_bind_text(stmt, 1, contact->ringtone_path); + if(contact->vibration) + cts_stmt_bind_text(stmt, 2, contact->vibration); + if(status) + cts_stmt_bind_text(stmt, 3, status); + if(contact->image_thumbnail_path) + cts_stmt_bind_text(stmt, 4, __cts_get_image_filename(contact->image_thumbnail_path)); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + free(status); + return ret; + } + index = cts_db_get_last_insert_id(); + + cts_stmt_finalize(stmt); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET is_primary_default = 1 " + "WHERE is_default = 1 AND contact_id = %d AND is_my_profile = 0", contact->id); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_query_exec(%s) Failed(%d)", query, ret); + free(status); + return ret; + } + + free(status); + ctsvc_set_person_noti(); +#ifdef _CONTACTS_IPC_SERVER + ctsvc_change_subject_add_changed_person_id(CONTACTS_CHANGE_INSERTED, index); +#endif + + return index; +} + +static inline int __ctsvc_db_update_person_default(int person_id, int datatype) +{ + int ret, data_id; + cts_stmt stmt = NULL; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), + "SELECT D.id FROM "CTS_TABLE_CONTACTS" C, "CTS_TABLE_DATA" D " + "ON C.contact_id = D.contact_id AND C.deleted = 0 " + "WHERE C.person_id=%d AND D.datatype=%d AND is_primary_default=1 AND D.is_my_profile = 0", + person_id, datatype); + + CTS_DBG("%s", query); + ret = ctsvc_query_get_first_int_result(query, &data_id); + if (CONTACTS_ERROR_NO_DATA == ret ) { + snprintf(query, sizeof(query), + "SELECT D.id FROM "CTS_TABLE_CONTACTS" C, "CTS_TABLE_DATA" D " + "ON C.contact_id = D.contact_id AND C.deleted = 0 " + "WHERE C.person_id=%d AND D.datatype=%d AND D.is_default=1 AND D.is_my_profile = 0 ORDER BY D.id", + person_id, datatype); + + CTS_DBG("%s", query); + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare() Failed"); + return CONTACTS_ERROR_DB; + } + + if ((ret = cts_stmt_step(stmt))) + { + data_id = ctsvc_stmt_get_int(stmt, 0); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET is_primary_default=1 WHERE id=%d" + ,data_id); + + CTS_DBG("%s", query); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_query_exec(%s) Failed(%d)", query, ret); + cts_stmt_finalize(stmt); + return ret; + } + } + cts_stmt_finalize(stmt); + } + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_update_person(contacts_record_h record) +{ + int ret, i=1, contact_count=0, len=0; + cts_stmt stmt = NULL; + char query[CTS_SQL_MIN_LEN] = {0}; + ctsvc_contact_s *contact = (ctsvc_contact_s*)record; + bool has_phonenumber=false, has_email=false; + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), + "SELECT count(contact_id) FROM "CTS_TABLE_CONTACTS" " + "WHERE person_id=%d AND has_phonenumber=1 AND deleted = 0", + contact->person_id); + + ret = ctsvc_query_get_first_int_result(query, &contact_count); + if (CONTACTS_ERROR_NONE != ret ) { + CTS_ERR("No Contacts : person_id (%d)", contact->person_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_NO_DATA; + } + + if(contact_count) + has_phonenumber = true; + + snprintf(query, sizeof(query), + "SELECT count(contact_id) FROM "CTS_TABLE_CONTACTS" " + "WHERE person_id=%d AND has_email=1 AND deleted = 0", + contact->person_id); + + ret = ctsvc_query_get_first_int_result(query, &contact_count); + if (CONTACTS_ERROR_NONE != ret ) { + CTS_ERR("No Contacts : person_id (%d)", contact->person_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_NO_DATA; + } + + if(contact_count) + has_email = true; + + len = snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_PERSONS" SET changed_ver=%d, has_phonenumber=%d, has_email=%d ", + ctsvc_get_next_ver(), has_phonenumber, has_email); + + + if (contact->ringtone_changed) + len += snprintf(query+len, sizeof(query)-len, ", ringtone_path=?"); + if (contact->vibration_changed) + len += snprintf(query+len, sizeof(query)-len, ", vibration=?"); + if (contact->image_thumbnail_changed) + len += snprintf(query+len, sizeof(query)-len, ", image_thumbnail_path=?"); + + snprintf(query+len, sizeof(query)-len, + " WHERE person_id=%d", contact->person_id); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare() Failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + if (contact->ringtone_changed) + cts_stmt_bind_text(stmt, i++, SAFE_STR(contact->ringtone_path)); + if (contact->vibration_changed) + cts_stmt_bind_text(stmt, i++, SAFE_STR(contact->vibration)); + if (contact->image_thumbnail_changed) + cts_stmt_bind_text(stmt, i++, SAFE_STR(contact->image_thumbnail_path)); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + + cts_stmt_finalize(stmt); + + __ctsvc_db_update_person_default(contact->person_id, CTSVC_DATA_NUMBER); + __ctsvc_db_update_person_default(contact->person_id, CTSVC_DATA_EMAIL); + __ctsvc_db_update_person_default(contact->person_id, CTSVC_DATA_IMAGE); + + ctsvc_set_person_noti(); +#ifdef _CONTACTS_IPC_SERVER + ctsvc_change_subject_add_changed_person_id(CONTACTS_CHANGE_UPDATED, contact->person_id); +#endif + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +void ctsvc_db_normalize_str_callback(sqlite3_context * context, + int argc, sqlite3_value ** argv) +{ + int ret; + const char *display_name; + char dest[CTS_SQL_MAX_LEN] = {0}; + + if (argc < 1) { + sqlite3_result_null(context); + return; + } + + display_name = (const char *)sqlite3_value_text(argv[0]); + if (display_name) { + ret = ctsvc_normalize_index(display_name, dest, sizeof(dest)); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_normalize_index() Failed(%d)", ret); + sqlite3_result_null(context); + return; + } + CTS_VERBOSE("normalize index : %s, %s", display_name, dest); + } + + + sqlite3_result_text(context, dest, strlen(dest), SQLITE_STATIC); + return; +} + diff --git a/native/ctsvc_db_plugin_person_helper.h b/native/ctsvc_db_plugin_person_helper.h new file mode 100755 index 0000000..15ff251 --- /dev/null +++ b/native/ctsvc_db_plugin_person_helper.h @@ -0,0 +1,33 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_PERSON_HELPER_H__ +#define __CTSVC_DB_PLUGIN_PERSON_HELPER_H__ + +#include "contacts.h" +#include "ctsvc_sqlite.h" + +int ctsvc_db_insert_person(contacts_record_h contact); +int ctsvc_db_update_person(contacts_record_h contact); +int ctsvc_db_person_create_record_from_stmt(cts_stmt stmt, contacts_record_h *record); +int ctsvc_db_person_create_record_from_stmt_with_query(cts_stmt stmt, contacts_query_h query, contacts_record_h *record); +int ctsvc_db_person_create_record_from_stmt_with_projection(cts_stmt stmt, unsigned int *projection, int projection_count, contacts_record_h *record); +void ctsvc_db_normalize_str_callback(sqlite3_context * context, int argc, sqlite3_value ** argv); + +#endif // __CTSVC_DB_PLUGIN_PERSON_HELPER_H__ diff --git a/native/ctsvc_db_plugin_phonelog.c b/native/ctsvc_db_plugin_phonelog.c new file mode 100644 index 0000000..b5bc50a --- /dev/null +++ b/native/ctsvc_db_plugin_phonelog.c @@ -0,0 +1,475 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_normalize.h" +#include "ctsvc_utils.h" +#include "ctsvc_list.h" +#include "ctsvc_record.h" +#include "ctsvc_db_query.h" +#include "ctsvc_db_init.h" +#include "ctsvc_notification.h" +#include "badge.h" + +#ifdef _CONTACTS_IPC_SERVER +#include "ctsvc_server_change_subject.h" +#endif + +static int __ctsvc_db_phonelog_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_phonelog_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_phonelog_update_record( contacts_record_h record ); +static int __ctsvc_db_phonelog_delete_record( int id ); +static int __ctsvc_db_phonelog_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_phonelog_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_phonelog_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_phonelog_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_phonelog_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_phonelog = { + .is_query_only = false, + .insert_record = __ctsvc_db_phonelog_insert_record, + .get_record = __ctsvc_db_phonelog_get_record, + .update_record = __ctsvc_db_phonelog_update_record, + .delete_record = __ctsvc_db_phonelog_delete_record, + .get_all_records = __ctsvc_db_phonelog_get_all_records, + .get_records_with_query = __ctsvc_db_phonelog_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_phonelog_insert_records, + .update_records = NULL,//__ctsvc_db_phonelog_update_records, + .delete_records = NULL,//__ctsvc_db_phonelog_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_phonelog_value_set(cts_stmt stmt, contacts_record_h *record) +{ + int i; + int ret; + char *temp; + ctsvc_phonelog_s *phonelog; + + ret = contacts_record_create(_contacts_phone_log._uri, record); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + phonelog = (ctsvc_phonelog_s*)*record; + + i = 0; + phonelog->id = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + phonelog->address = SAFE_STRDUP(temp); + phonelog->person_id = ctsvc_stmt_get_int(stmt, i++); + phonelog->log_type = ctsvc_stmt_get_int(stmt, i++); + phonelog->log_time = ctsvc_stmt_get_int(stmt, i++); + phonelog->extra_data1 = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + phonelog->extra_data2 = SAFE_STRDUP(temp); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_phonelog_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_record_h record; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + len = snprintf(query, sizeof(query), + "SELECT id, number, person_id, log_type, log_time, data1, data2 " + "FROM "CTS_TABLE_PHONELOGS" WHERE id = %d", id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ret = __ctsvc_db_phonelog_value_set(stmt, &record); + + cts_stmt_finalize(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("__ctsvc_db_phonelog_value_set(ALL) Failed(%d)", ret); + return ret; + } + + *out_record = record; + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_phonelog_update_record( contacts_record_h record ) +{ + int ret; +// cts_stmt stmt; + char query[CTS_SQL_MIN_LEN] = {0}; + ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s *)record; + + RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER, "Invaild parameter : record is null"); + RETVM_IF(phonelog->id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : The phone_log has ID(%d)", phonelog->id); + RETVM_IF(phonelog->log_type != CONTACTS_PLOG_TYPE_VOICE_INCOMMING_SEEN && + phonelog->log_type != CONTACTS_PLOG_TYPE_VIDEO_INCOMMING_SEEN, CONTACTS_ERROR_INVALID_PARAMETER, + "Invaild parameter : the type is can not updated(%d)", phonelog->log_type); + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_PHONELOGS" SET log_type = %d WHERE id = %d", + phonelog->log_type, phonelog->id); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret ) { + CTS_ERR("DB error : ctsvc_query_exec() Failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + if (cts_db_change()) { + ctsvc_set_phonelog_noti(); + ctsvc_set_missed_call_noti(); +#ifdef _CONTACTS_IPC_SERVER + // add id for subscribe + ctsvc_change_subject_add_changed_phone_log_id(CONTACTS_CHANGE_UPDATED, phonelog->id); +#endif + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_phonelog_delete_record( int id ) +{ + int ret; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), "DELETE FROM %s WHERE id = %d", + CTS_TABLE_PHONELOGS, id); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_set_phonelog_noti(); + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_phonelog_get_all_records( int offset, int limit, + contacts_list_h* out_list ) +{ + int ret; + int len; + cts_stmt stmt; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_list_h list; + + len = snprintf(query, sizeof(query), + "SELECT id, number, person_id, log_type, log_time, data1, data2 FROM "CTS_TABLE_PHONELOGS); + + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return CONTACTS_ERROR_NO_DATA; + } + __ctsvc_db_phonelog_value_set(stmt, &record); + + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_phonelog_get_records_with_query( contacts_query_h query, int offset, + int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_phonelog_s *phonelog; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_phone_log._uri, &record); + phonelog = (ctsvc_phonelog_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else + { + field_count = s_query->projection_count; + + if( CONTACTS_ERROR_NONE != ctsvc_record_set_projection_flags(record, s_query->projection, s_query->projection_count, s_query->property_count) ) + { + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_PHONELOG_ID: + phonelog->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PHONELOG_PERSON_ID: + phonelog->person_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PHONELOG_ADDRESS: + temp = ctsvc_stmt_get_text(stmt, i); + phonelog->address = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PHONELOG_LOG_TIME: + phonelog->log_time = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PHONELOG_LOG_TYPE: + phonelog->log_type = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1: + phonelog->extra_data1= ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2: + temp = ctsvc_stmt_get_text(stmt, i); + phonelog->extra_data2= SAFE_STRDUP(temp); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + + return CONTACTS_ERROR_NONE; +} +//static int __ctsvc_db_phonelog_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_phonelog_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_phonelog_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } + +static int __ctsvc_cb_phonelog_increase_outgoing_count(int person_id) +{ + int ret; + int id; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), + "SELECT person_id FROM %s WHERE person_id = %d and usage_type = %d ", + CTS_TABLE_CONTACT_STAT, person_id, CONTACTS_USAGE_STAT_TYPE_OUTGOING_CALL); + + ret = ctsvc_query_get_first_int_result(query, &id); + if (CONTACTS_ERROR_NO_DATA == ret) { + snprintf(query, sizeof(query), + "INSERT INTO %s(person_id, usage_type, times_used) VALUES(%d, %d, 1)", + CTS_TABLE_CONTACT_STAT, person_id, CONTACTS_USAGE_STAT_TYPE_OUTGOING_CALL); + } + else { + snprintf(query, sizeof(query), + "UPDATE %s SET times_used = times_used + 1 WHERE person_id = %d and usage_type = %d", + CTS_TABLE_CONTACT_STAT, person_id, CONTACTS_USAGE_STAT_TYPE_OUTGOING_CALL); + } + + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : cts_query_exec() Failed(%d)", ret); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_phonelog_insert(ctsvc_phonelog_s *phonelog, int *id) +{ + int ret; + cts_stmt stmt = NULL; + char clean_num[CTSVC_NUMBER_MAX_LEN] = {0}; + char query[CTS_SQL_MAX_LEN] = {0}; + char normal_num[CTSVC_NUMBER_MAX_LEN] = {0}; + + RETVM_IF(phonelog->log_type <= CONTACTS_PLOG_TYPE_NONE + || CONTACTS_PLOG_TYPE_MAX <= phonelog->log_type, + CONTACTS_ERROR_INVALID_PARAMETER, "phonelog type(%d) is invaid", phonelog->log_type); + + snprintf(query, sizeof(query), "INSERT INTO "CTS_TABLE_PHONELOGS"(" + "number, normal_num, person_id, log_type, log_time, data1, data2) " + "VALUES(?, ?, ?, %d, %d, %d, ?)", + phonelog->log_type, phonelog->log_time, phonelog->extra_data1); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + if (phonelog->address) { + cts_stmt_bind_text(stmt, 1, phonelog->address); + if (phonelog->log_type < CONTACTS_PLOG_TYPE_EMAIL_RECEIVED) { + ret = ctsvc_clean_number(phonelog->address, clean_num, sizeof(clean_num)); + if (0 < ret) { + ret = ctsvc_normalize_number(clean_num, normal_num, CTSVC_NUMBER_MAX_LEN); + cts_stmt_bind_text(stmt, 2, normal_num); + } + } + } + + if (0 < phonelog->person_id) + cts_stmt_bind_int(stmt, 3, phonelog->person_id); + + if (phonelog->extra_data2) + cts_stmt_bind_text(stmt, 4, phonelog->extra_data2); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) + { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + if (id) + *id = cts_db_get_last_insert_id(); + cts_stmt_finalize(stmt); + + if (CONTACTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN == phonelog->log_type || + CONTACTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN == phonelog->log_type) + ctsvc_set_missed_call_noti(); + + ctsvc_set_phonelog_noti(); + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_phonelog_insert_record( contacts_record_h record, int *id ) +{ + int ret; + ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s *)record; + + RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER, "Invaild parameter : record is null"); + RETVM_IF(phonelog->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : The phone_log has ID(%d)", phonelog->id); + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + ret = __ctsvc_db_phonelog_insert(phonelog, id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("__ctsvc_db_phonelog_insert() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + if (0 < phonelog->person_id) { + ret = __ctsvc_cb_phonelog_increase_outgoing_count(phonelog->person_id); + WARN_IF(CONTACTS_ERROR_NONE != ret, "cts_increase_outgoing_count() Failed(%d)", ret); + } + +#ifdef _CONTACTS_IPC_SERVER + // add id for subscribe + ctsvc_change_subject_add_changed_phone_log_id(CONTACTS_CHANGE_INSERTED, *id); +#endif + ret = ctsvc_end_trans(true); + + // set missed call Badge number to Apptray + if(phonelog-> log_type == CONTACTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN || phonelog-> log_type == CONTACTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN) { + + #define PHONE_PACKAGE_NAME "org.tizen.phone" + int call_cnt = 0; + bool bBadgeExist = FALSE; + + badge_is_existing(PHONE_PACKAGE_NAME, &bBadgeExist); + if(bBadgeExist == FALSE) + badge_create(PHONE_PACKAGE_NAME, PHONE_PACKAGE_NAME); + + badge_get_count(PHONE_PACKAGE_NAME, &call_cnt); + call_cnt++; + badge_set_count(PHONE_PACKAGE_NAME, call_cnt); + } + + + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_profile.c b/native/ctsvc_db_plugin_profile.c new file mode 100644 index 0000000..0b65642 --- /dev/null +++ b/native/ctsvc_db_plugin_profile.c @@ -0,0 +1,386 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_db_plugin_profile_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_db_query.h" +#include "ctsvc_list.h" + +static int __ctsvc_db_profile_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_profile_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_profile_update_record( contacts_record_h record ); +static int __ctsvc_db_profile_delete_record( int id ); +static int __ctsvc_db_profile_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_profile_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_profile_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_profile_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_profile_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_profile = { + .is_query_only = false, + .insert_record = __ctsvc_db_profile_insert_record, + .get_record = __ctsvc_db_profile_get_record, + .update_record = __ctsvc_db_profile_update_record, + .delete_record = __ctsvc_db_profile_delete_record, + .get_all_records = __ctsvc_db_profile_get_all_records, + .get_records_with_query = __ctsvc_db_profile_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_profile_insert_records, + .update_records = NULL,//__ctsvc_db_profile_update_records, + .delete_records = NULL,//__ctsvc_db_profile_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_profile_insert_record( contacts_record_h record, int *id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_profile_s *profile = (ctsvc_profile_s *)record; + + RETVM_IF(NULL == profile->appsvc_operation, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : profile uid is NULL"); + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", profile->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_profile_insert(record, profile->contact_id, false, id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(profile->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_profile_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, " + "data3, data4, data5, data6, data7, data8, data9, data10, data11, data12 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE id = %d AND datatype = %d ", + id, CTSVC_DATA_PROFILE); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ctsvc_db_profile_get_value_from_stmt(stmt, out_record, 0); + + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_profile_update_record( contacts_record_h record ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_profile_s *profile = (ctsvc_profile_s *)record; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", profile->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_profile_update(record, profile->contact_id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(profile->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_profile_delete_record( int id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT " " + "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if( ret != CONTACTS_ERROR_NONE ) { + CTS_ERR("The id(%d) is Invalid(%d)", id, ret); + ctsvc_end_trans(false); + return contact_id; + } + + ret = ctsvc_db_profile_delete(id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_profile_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int len; + int ret; + contacts_list_h list; + ctsvc_profile_s *profile; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, " + "data3, data4, data5, data6, data7, data8, data9, data10 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile=0 ", + CTSVC_DATA_PROFILE); + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB : cts_stmt_step fail(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + ctsvc_db_profile_get_value_from_stmt(stmt, (contacts_record_h*)&profile, 0); + ctsvc_list_prepend(list, (contacts_record_h)profile); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_profile_get_records_with_query( contacts_query_h query, int offset, + int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_profile_s *profile; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_profile._uri, &record); + profile = (ctsvc_profile_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else { + field_count = s_query->projection_count; + ret = ctsvc_record_set_projection_flags(record, s_query->projection, + s_query->projection_count, s_query->property_count); + + if(CONTACTS_ERROR_NONE != ret) + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_PROFILE_ID: + profile->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PROFILE_CONTACT_ID: + profile->contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PROFILE_TYPE: + profile->type = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PROFILE_LABEL: + temp = ctsvc_stmt_get_text(stmt, i); + profile->label = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PROFILE_UID: + temp = ctsvc_stmt_get_text(stmt, i); + profile->uid = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PROFILE_TEXT: + temp = ctsvc_stmt_get_text(stmt, i); + profile->text = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PROFILE_ORDER: + profile->order = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_PROFILE_APPSVC_OPERATION: + temp = ctsvc_stmt_get_text(stmt, i); + profile->appsvc_operation = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PROFILE_DATA1: + temp = ctsvc_stmt_get_text(stmt, i); + profile->data1 = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PROFILE_DATA2: + temp = ctsvc_stmt_get_text(stmt, i); + profile->data2 = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PROFILE_DATA3: + temp = ctsvc_stmt_get_text(stmt, i); + profile->data3 = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_PROFILE_DATA4: + temp = ctsvc_stmt_get_text(stmt, i); + profile->data4 = SAFE_STRDUP(temp); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_profile_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_profile_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_profile_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_profile_helper.c b/native/ctsvc_db_plugin_profile_helper.c new file mode 100644 index 0000000..083de56 --- /dev/null +++ b/native/ctsvc_db_plugin_profile_helper.c @@ -0,0 +1,178 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_profile_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + + +int ctsvc_db_profile_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count) +{ + int ret; + char *temp; + ctsvc_profile_s *profile; + + ret = contacts_record_create(_contacts_profile._uri, (contacts_record_h *)&profile); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + + profile->id = ctsvc_stmt_get_int(stmt, start_count++); + profile->contact_id = ctsvc_stmt_get_int(stmt, start_count++); + start_count++; + start_count++; + temp = ctsvc_stmt_get_text(stmt, start_count++); + profile->label = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + profile->uid = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + profile->text = SAFE_STRDUP(temp); + profile->order = ctsvc_stmt_get_int(stmt, start_count++); + temp = ctsvc_stmt_get_text(stmt, start_count++); + profile->appsvc_operation = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + profile->data1 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + profile->data2 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + profile->data3 = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + profile->data4 = SAFE_STRDUP(temp); + + *record = (contacts_record_h)profile; + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_profile_bind_stmt(cts_stmt stmt, ctsvc_profile_s *profile, int start_cnt) +{ + if (profile->label) + cts_stmt_bind_text(stmt, start_cnt, profile->label); + if (profile->uid) + cts_stmt_bind_text(stmt, start_cnt+1, profile->uid); + if (profile->text) + cts_stmt_bind_text(stmt, start_cnt+2, profile->text); + cts_stmt_bind_int(stmt, start_cnt+3, profile->order); + if (profile->appsvc_operation) + cts_stmt_bind_text(stmt, start_cnt+4, profile->appsvc_operation); + if (profile->data1) + cts_stmt_bind_text(stmt, start_cnt+5, profile->data1); + if (profile->data2) + cts_stmt_bind_text(stmt, start_cnt+6, profile->data2); + if (profile->data3) + cts_stmt_bind_text(stmt, start_cnt+7, profile->data3); + if (profile->data4) + cts_stmt_bind_text(stmt, start_cnt+8, profile->data4); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_profile_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id) +{ + int ret; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_profile_s *profile = (ctsvc_profile_s *)record; + +// RETVM_IF(profile->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted profile record"); + RETV_IF(NULL == profile->appsvc_operation, CONTACTS_ERROR_NONE); + RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact_id(%d) is mandatory field to insert profile record ", profile->contact_id); + RETVM_IF(0 < profile->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", profile->id); + + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, data1, data2, data3, data4, data5, " + "data6, data7, data8, data9, data10) " + "VALUES(%d, %d, %d, %d, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + contact_id, is_my_profile, CTSVC_DATA_PROFILE, profile->type); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + __ctsvc_profile_bind_stmt(stmt, profile, 1); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + //profile->id = cts_db_get_last_insert_id(); + if (id) + *id = cts_db_get_last_insert_id(); + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_profile_noti(); + + return CONTACTS_ERROR_NONE; + +} + +int ctsvc_db_profile_update(contacts_record_h record, int contact_id, bool is_my_profile) +{ + int ret; + ctsvc_profile_s *profile = (ctsvc_profile_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + cts_stmt stmt; + + RETVM_IF(!profile->id, CONTACTS_ERROR_INVALID_PARAMETER, "profile of contact has no ID."); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=?, data4=?, data5=?, " + "data6=?, data7=?, data8=?, data9=?, data10=?, data11=?, data12=? WHERE id=%d", + contact_id, is_my_profile, profile->type, profile->id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + __ctsvc_profile_bind_stmt(stmt, profile, 1); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_profile_noti(); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_profile_delete(int id) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d", + id, CTSVC_DATA_URL); + + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret); + ctsvc_set_profile_noti(); + + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_profile_helper.h b/native/ctsvc_db_plugin_profile_helper.h new file mode 100644 index 0000000..0b93afd --- /dev/null +++ b/native/ctsvc_db_plugin_profile_helper.h @@ -0,0 +1,32 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_PROFILE_HELPER_H__ +#define __CTSVC_DB_PLUGIN_PROFILE_HELPER_H__ + +#include "contacts.h" +#include "ctsvc_sqlite.h" + +int ctsvc_db_profile_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id); +int ctsvc_db_profile_update(contacts_record_h record, int contact_id, bool is_my_profile); +int ctsvc_db_profile_delete(int id); + +int ctsvc_db_profile_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count); + +#endif // __CTSVC_DB_PLUGIN_PROFILE_HELPER_H__ diff --git a/native/ctsvc_db_plugin_relationship.c b/native/ctsvc_db_plugin_relationship.c new file mode 100644 index 0000000..cbffc51 --- /dev/null +++ b/native/ctsvc_db_plugin_relationship.c @@ -0,0 +1,357 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_relationship_helper.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_db_query.h" +#include "ctsvc_list.h" + +static int __ctsvc_db_relationship_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_relationship_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_relationship_update_record( contacts_record_h record ); +static int __ctsvc_db_relationship_delete_record( int id ); +static int __ctsvc_db_relationship_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_relationship_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_relationship_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_relationship_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_relationship_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_relationship = { + .is_query_only = false, + .insert_record = __ctsvc_db_relationship_insert_record, + .get_record = __ctsvc_db_relationship_get_record, + .update_record = __ctsvc_db_relationship_update_record, + .delete_record = __ctsvc_db_relationship_delete_record, + .get_all_records = __ctsvc_db_relationship_get_all_records, + .get_records_with_query = __ctsvc_db_relationship_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_relationship_insert_records, + .update_records = NULL,//__ctsvc_db_relationship_update_records, + .delete_records = NULL,//__ctsvc_db_relationship_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_relationship_insert_record( contacts_record_h record, int *id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_relationship_s *relationship = (ctsvc_relationship_s *)record; + + RETVM_IF(NULL == relationship->name, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : relationship name is NULL"); + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", relationship->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_relationship_insert(record, relationship->contact_id, false, id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(relationship->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_relationship_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, data3 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE id = %d AND datatype = %d ", + id, CTSVC_DATA_RELATIONSHIP); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ctsvc_db_relationship_get_value_from_stmt(stmt, out_record, 0); + + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_relationship_update_record( contacts_record_h record ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_relationship_s *relationship = (ctsvc_relationship_s *)record; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", relationship->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_relationship_update(record, relationship->contact_id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(relationship->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_relationship_delete_record( int id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT " " + "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if( ret != CONTACTS_ERROR_NONE ) { + CTS_ERR("The id(%d) is Invalid(%d)", id, ret); + ctsvc_end_trans(false); + return contact_id; + } + + ret = ctsvc_db_relationship_delete(id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_relationship_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int len; + int ret; + contacts_list_h list; + ctsvc_relationship_s *relationship; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, data3 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile=0 ", + CTSVC_DATA_RELATIONSHIP); + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB : cts_stmt_step fail(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + ctsvc_db_relationship_get_value_from_stmt(stmt, (contacts_record_h*)&relationship, 0); + ctsvc_list_prepend(list, (contacts_record_h)relationship); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_relationship_get_records_with_query( contacts_query_h query, int offset, + int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_relationship_s *relationship; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_relationship._uri, &record); + relationship = (ctsvc_relationship_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else { + field_count = s_query->projection_count; + ret = ctsvc_record_set_projection_flags(record, s_query->projection, + s_query->projection_count, s_query->property_count); + + if(CONTACTS_ERROR_NONE != ret) + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_RELATIONSHIP_ID: + relationship->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_RELATIONSHIP_CONTACT_ID: + relationship->contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_RELATIONSHIP_TYPE: + relationship->type = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_RELATIONSHIP_LABEL: + temp = ctsvc_stmt_get_text(stmt, i); + relationship->label = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_RELATIONSHIP_NAME: + temp = ctsvc_stmt_get_text(stmt, i); + relationship->name = SAFE_STRDUP(temp); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_relationship_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_relationship_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_relationship_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_relationship_helper.c b/native/ctsvc_db_plugin_relationship_helper.c new file mode 100644 index 0000000..1186fa2 --- /dev/null +++ b/native/ctsvc_db_plugin_relationship_helper.c @@ -0,0 +1,150 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_relationship_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + + +int ctsvc_db_relationship_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count) +{ + int ret; + char *temp; + ctsvc_relationship_s *relationship; + + ret = contacts_record_create(_contacts_relationship._uri, (contacts_record_h *)&relationship); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + + relationship->id = ctsvc_stmt_get_int(stmt, start_count++); + relationship->contact_id = ctsvc_stmt_get_int(stmt, start_count++); + start_count++; + relationship->type = ctsvc_stmt_get_int(stmt, start_count++); + temp = ctsvc_stmt_get_text(stmt, start_count++); + relationship->label = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + relationship->name = SAFE_STRDUP(temp); + + *record = (contacts_record_h)relationship; + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_relationship_bind_stmt(cts_stmt stmt, ctsvc_relationship_s *relationship, int start_cnt) +{ + if (relationship->label) + cts_stmt_bind_text(stmt, start_cnt, relationship->label); + if (relationship->name) + cts_stmt_bind_text(stmt, 2, relationship->name); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_relationship_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id) +{ + int ret; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_relationship_s *relationship = (ctsvc_relationship_s *)record; + + // These check should be done in client side +// RETVM_IF(relationship->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted relationship record"); + RETV_IF(NULL == relationship->name, CONTACTS_ERROR_NONE); + RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact_id(%d) is mandatory field to insert relationship record", relationship->contact_id); + RETVM_IF(0 < relationship->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", relationship->id); + + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, data1, data2, data3) " + "VALUES(%d, %d, %d, %d, ?, ?)", + contact_id, is_my_profile, CTSVC_DATA_RELATIONSHIP, relationship->type); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + __ctsvc_relationship_bind_stmt(stmt, relationship, 1); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + //relationship->id = cts_db_get_last_insert_id(); + if (id) + *id = cts_db_get_last_insert_id(); + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_relationship_noti(); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_relationship_update(contacts_record_h record, int contact_id, bool is_my_profile) +{ + int ret; + ctsvc_relationship_s *relationship = (ctsvc_relationship_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + cts_stmt stmt; + + RETVM_IF(!relationship->id, CONTACTS_ERROR_INVALID_PARAMETER, "relationship of contact has no ID."); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=? WHERE id=%d", + contact_id, is_my_profile, relationship->type, relationship->id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + __ctsvc_relationship_bind_stmt(stmt, relationship, 1); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_relationship_noti(); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_relationship_delete(int id) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d", + id, CTSVC_DATA_RELATIONSHIP); + + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret); + ctsvc_set_relationship_noti(); + + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_relationship_helper.h b/native/ctsvc_db_plugin_relationship_helper.h new file mode 100644 index 0000000..c112431 --- /dev/null +++ b/native/ctsvc_db_plugin_relationship_helper.h @@ -0,0 +1,32 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_RELATIONSHIP_HELPER_H__ +#define __CTSVC_DB_PLUGIN_RELATIONSHIP_HELPER_H__ + +#include "contacts.h" +#include "ctsvc_sqlite.h" + +int ctsvc_db_relationship_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id); +int ctsvc_db_relationship_update(contacts_record_h record, int contact_id, bool is_my_profile); +int ctsvc_db_relationship_delete(int id); + +int ctsvc_db_relationship_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count); + +#endif // __CTSVC_DB_PLUGIN_RELATIONSHIP_HELPER_H__ diff --git a/native/ctsvc_db_plugin_sdn.c b/native/ctsvc_db_plugin_sdn.c new file mode 100644 index 0000000..409c7d2 --- /dev/null +++ b/native/ctsvc_db_plugin_sdn.c @@ -0,0 +1,390 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_list.h" +#include "ctsvc_db_plugin_sdn.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_query.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + +static int __ctsvc_db_sdn_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_sdn_get_record( int id, contacts_record_h* record ); +static int __ctsvc_db_sdn_update_record( contacts_record_h record ); +static int __ctsvc_db_sdn_delete_record( int id ); +static int __ctsvc_db_sdn_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_sdn_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_sdn_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_sdn_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_sdn_delete_records(int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_sdn = { + .is_query_only = false, + .insert_record = __ctsvc_db_sdn_insert_record, + .get_record = __ctsvc_db_sdn_get_record, + .update_record = __ctsvc_db_sdn_update_record, + .delete_record = __ctsvc_db_sdn_delete_record, + .get_all_records = __ctsvc_db_sdn_get_all_records, + .get_records_with_query = __ctsvc_db_sdn_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_sdn_insert_records, + .update_records = NULL,//__ctsvc_db_sdn_update_records, + .delete_records = NULL,//__ctsvc_db_sdn_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_sdn_value_set(cts_stmt stmt, contacts_record_h *record) +{ + int i; + int ret; + char *temp; + ctsvc_sdn_s *sdn; + + ret = contacts_record_create(_contacts_sdn._uri, record); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + sdn = (ctsvc_sdn_s*)*record; + + i = 0; + sdn->id = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + sdn->name = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + sdn->number = SAFE_STRDUP(temp); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_sdn_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_record_h record; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + len = snprintf(query, sizeof(query), + "SELECT id, name, number FROM "CTS_TABLE_SDN" WHERE id = %d", id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ret = __ctsvc_db_sdn_value_set(stmt, &record); + + cts_stmt_finalize(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("__ctsvc_db_sdn_value_set(ALL) Failed(%d)", ret); + return ret; + } + + *out_record = record; + + return CONTACTS_ERROR_NONE; +} + + +static int __ctsvc_db_sdn_insert_record( contacts_record_h record, int *id ) +{ + int ret; + ctsvc_sdn_s *sdn = (ctsvc_sdn_s*)record; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == sdn->name, CONTACTS_ERROR_INVALID_PARAMETER); + RETVM_IF(CTSVC_RECORD_SDN != sdn->base.r_type, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : record is invalid type(%d)", sdn->base.r_type); + + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_SDN"(name, number) VALUES(?, ?)"); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("DB error : cts_query_prepare() Failed"); + return CONTACTS_ERROR_DB; + } + + cts_stmt_bind_text(stmt, 1, sdn->name); + cts_stmt_bind_text(stmt, 2, sdn->number); + + ret = ctsvc_begin_trans(); + if( ret < CONTACTS_ERROR_NONE ) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + + //sdn->id = cts_db_get_last_insert_id(); + if (id) + *id = cts_db_get_last_insert_id(); + cts_stmt_finalize(stmt); + + ctsvc_set_sdn_noti(); + ret = ctsvc_end_trans(true); + if(ret < CONTACTS_ERROR_NONE ) { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_sdn_update_record( contacts_record_h record ) +{ + int ret; + ctsvc_sdn_s *sdn = (ctsvc_sdn_s *)record; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == sdn->name, CONTACTS_ERROR_INVALID_PARAMETER); + RETVM_IF(CTSVC_RECORD_SDN != sdn->base.r_type, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : record is invalid type(%d)", sdn->base.r_type); + + cts_stmt stmt = NULL; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_SDN" SET name=?, number=? WHERE id = %d", sdn->id); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("DB error : cts_query_prepare() Failed"); + return CONTACTS_ERROR_DB; + } + + cts_stmt_bind_text(stmt, 1, sdn->name); + cts_stmt_bind_text(stmt, 2, sdn->number); + + ret = ctsvc_begin_trans(); + if( ret < CONTACTS_ERROR_NONE ) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + + cts_stmt_finalize(stmt); + + ctsvc_set_sdn_noti(); + + ret = ctsvc_end_trans(true); + if(ret < CONTACTS_ERROR_NONE ) { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_sdn_delete_record( int sdn_id ) +{ + int ret; + + char query[CTS_SQL_MAX_LEN] = {0}; + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_SDN" WHERE id = %d", sdn_id); + + ret = ctsvc_begin_trans(); + RETVM_IF(CONTACTS_ERROR_NONE > ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = cts_db_change(); + if (ret <= 0) { + ret = CONTACTS_ERROR_NO_DATA; + ctsvc_end_trans(false); + return ret; + } + + ctsvc_set_sdn_noti(); + ret = ctsvc_end_trans(true); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_sdn_get_all_records( int offset, int limit, + contacts_list_h* out_list ) +{ + int ret; + int len; + cts_stmt stmt; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_list_h list; + + len = snprintf(query, sizeof(query), + "SELECT id, name, number FROM "CTS_TABLE_SDN); + + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return CONTACTS_ERROR_NO_DATA; + } + __ctsvc_db_sdn_value_set(stmt, &record); + + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_sdn_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_sdn_s *sdn; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return CONTACTS_ERROR_NO_DATA; + } + + contacts_record_create(_contacts_sdn._uri, &record); + sdn = (ctsvc_sdn_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else + { + field_count = s_query->projection_count; + + if( CONTACTS_ERROR_NONE != ctsvc_record_set_projection_flags(record, s_query->projection, s_query->projection_count, s_query->property_count) ) + { + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_SDN_ID: + sdn->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_SDN_NAME: + temp = ctsvc_stmt_get_text(stmt, i); + sdn->name = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_SDN_NUMBER: + temp = ctsvc_stmt_get_text(stmt, i); + sdn->number = SAFE_STRDUP(temp); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + + return CONTACTS_ERROR_NONE; +} + +#if 0 +static int __ctsvc_db_sdn_insert_records(const contacts_list_h in_list, int **ids) +{ + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_sdn_update_records(const contacts_list_h in_list) +{ + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_sdn_delete_records(int ids[], int count) +{ + return CONTACTS_ERROR_NONE; +} +#endif diff --git a/include/contacts-svc-sub.head b/native/ctsvc_db_plugin_sdn.h old mode 100755 new mode 100644 similarity index 85% rename from include/contacts-svc-sub.head rename to native/ctsvc_db_plugin_sdn.h index e891d16..0b29b7d --- a/include/contacts-svc-sub.head +++ b/native/ctsvc_db_plugin_sdn.h @@ -3,8 +3,6 @@ * * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. * - * Contact: Youngjae Shin - * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -18,6 +16,9 @@ * limitations under the License. * */ -#ifndef __CONTACTS_SVC_SUB_H__ -#define __CONTACTS_SVC_SUB_H__ +#ifndef __CTSVC_DB_PLUGIN_SDN_H__ +#define __CTSVC_DB_PLUGIN_SDN_H__ + + +#endif // __CTSVC_DB_PLUGIN_SDN_H__ diff --git a/native/ctsvc_db_plugin_simple_contact.c b/native/ctsvc_db_plugin_simple_contact.c new file mode 100644 index 0000000..e68f4d7 --- /dev/null +++ b/native/ctsvc_db_plugin_simple_contact.c @@ -0,0 +1,527 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_schema.h" +#include "ctsvc_db_init.h" +#include "ctsvc_utils.h" +#include "ctsvc_list.h" +#include "ctsvc_db_plugin_person_helper.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_db_query.h" +#include "ctsvc_notification.h" + +static int __ctsvc_db_simple_contact_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_simple_contact_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_simple_contact_update_record( contacts_record_h record ); +static int __ctsvc_db_simple_contact_delete_record( int id ); +static int __ctsvc_db_simple_contact_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_simple_contact_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_simple_contact = { + .is_query_only = false, + .insert_record = __ctsvc_db_simple_contact_insert_record, + .get_record = __ctsvc_db_simple_contact_get_record, + .update_record = __ctsvc_db_simple_contact_update_record, + .delete_record = __ctsvc_db_simple_contact_delete_record, + .get_all_records = __ctsvc_db_simple_contact_get_all_records, + .get_records_with_query = __ctsvc_db_simple_contact_get_records_with_query, + .insert_records = NULL, + .update_records = NULL, + .delete_records = NULL, + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_simple_contact_value_set(cts_stmt stmt, contacts_record_h *record) +{ + int i; + int ret; + char *temp; + ctsvc_simple_contact_s *contact; + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + + ret = contacts_record_create(_contacts_simple_contact._uri, record); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + contact = (ctsvc_simple_contact_s*)*record; + + i = 0; + contact->contact_id = ctsvc_stmt_get_int(stmt, i++); + contact->addressbook_id = ctsvc_stmt_get_int(stmt, i++); + contact->person_id = ctsvc_stmt_get_int(stmt, i++); + contact->changed_time = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + contact->display_name = SAFE_STRDUP(temp); + contact->display_source_type = ctsvc_stmt_get_int(stmt, i++); + + temp = ctsvc_stmt_get_text(stmt, i++); + if (temp) { + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_IMG_FULL_LOCATION, temp); + contact->image_thumbnail_path = strdup(full_path); + } + + temp = ctsvc_stmt_get_text(stmt, i++); + contact->ringtone_path = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + contact->vibration = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + contact->uid = SAFE_STRDUP(temp); + contact->is_favorite = ctsvc_stmt_get_int(stmt, i++); + contact->has_phonenumber = ctsvc_stmt_get_int(stmt, i++); + contact->has_email = ctsvc_stmt_get_int(stmt, i++); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_simple_contact_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_record_h record; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; +// if (0 == id) +// return ctsvc_get_myprofile(contact); + + len = snprintf(query, sizeof(query), + "SELECT contact_id, addressbook_id, person_id, changed_time, %s, " + "display_name_source, image_thumbnail_path, " + "ringtone_path, vibration, uid, is_favorite, has_phonenumber, has_email " + "FROM "CTS_TABLE_CONTACTS" WHERE contact_id = %d AND deleted = 0", + ctsvc_get_display_column(), id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ret = __ctsvc_db_simple_contact_value_set(stmt, &record); + + cts_stmt_finalize(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("__ctsvc_db_simple_contact_value_set(ALL) Failed(%d)", ret); + return ret; + } + + *out_record = record; + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_simple_contact_update_record( contacts_record_h record ) +{ + int ret; + int len; + int i; + int id; + char query[CTS_SQL_MAX_LEN] = {0}; + char image[CTS_SQL_MAX_LEN] = {0}; + ctsvc_simple_contact_s *contact = (ctsvc_simple_contact_s*)record; + cts_stmt stmt; + + // These check should be done in client side +// RETVM_IF(contact->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted contact record"); + RETVM_IF(NULL == contact, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact is NULL"); + RETVM_IF(contact->addressbook_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : addressbook_id(%d) is mandatory field to insert contact record ", + contact->addressbook_id); + RETVM_IF(contact->contact_id < 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : ide(%d), This record is already inserted", contact->contact_id); + + ret = ctsvc_begin_trans(); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTS_TABLE_CONTACTS" " + "WHERE contact_id = %d AND deleted = 0", contact->contact_id); + ret = ctsvc_query_get_first_int_result(query, &id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("Invalid Parameter : contact_id (%d) is not exist", contact->contact_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + len = snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver=%d, changed_time=%d ", + ctsvc_get_next_ver(), (int)time(NULL)); + + if (contact->uid_changed) + len += snprintf(query+len, sizeof(query)-len, ", uid=?"); + + if (contact->ringtone_changed) + len += snprintf(query+len, sizeof(query)-len, ", ringtone_path=?"); + + if (contact->vibration_changed) + len += snprintf(query+len, sizeof(query)-len, ", vibration=?"); + + if (contact->image_thumbnail_changed) + len += snprintf(query+len, sizeof(query)-len, ", image_thumbnail_path=?"); + + len += snprintf(query+len, sizeof(query)-len, " WHERE contact_id=%d", contact->contact_id); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare() Failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + i = 0; + if (contact->uid_changed) { + if(contact->uid) + cts_stmt_bind_text(stmt, i++, contact->uid); + i++; + } + if (contact->ringtone_changed) { + if (contact->ringtone_path) + cts_stmt_bind_text(stmt, i, contact->ringtone_path); + i++; + } + if (contact->vibration_changed) { + if (contact->vibration) + cts_stmt_bind_text(stmt, i, contact->vibration); + i++; + } + + if (contact->image_thumbnail_changed) { + image[0] = '\0'; + ret = ctsvc_contact_update_image_file(CTSVC_IMG_NORMAL, contact->contact_id, + contact->image_thumbnail_path, image, sizeof(image)); + + if (*image) { + free(contact->image_thumbnail_path); + contact->image_thumbnail_path = strdup(image); + if (CONTACTS_ERROR_NONE == ret && contact->image_thumbnail_path) + cts_stmt_bind_text(stmt, i, contact->image_thumbnail_path); + } + i++; + } + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + cts_stmt_finalize(stmt); + + ctsvc_set_contact_noti(); + //ctsvc_update_person(contact); + ret = ctsvc_end_trans(true); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_end_trans() Failed(%d)", ret); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_simple_contact_delete_record( int id ) +{ + int ret; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), "DELETE FROM %s WHERE contact_id = %d AND deleted = 0", + CTS_TABLE_CONTACTS, id); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_set_contact_noti(); + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + return ret; + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_simple_contact_get_all_records( int offset, int limit, + contacts_list_h* out_list ) +{ + int ret; + int len; + cts_stmt stmt; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_list_h list; + + len = snprintf(query, sizeof(query), + "SELECT contact_id, addressbook_id, person_id, changed_time, " + "%s, display_name_source, image_thumbnail_path, " + "ringtone_path, vibration, uid, is_favorite, has_phonenumber, has_email " + "FROM "CTS_TABLE_CONTACTS" WHERE deleted = 0", ctsvc_get_display_column()); + + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + __ctsvc_db_simple_contact_value_set(stmt, &record); + + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_simple_contact_get_records_with_query( contacts_query_h query, + int offset, int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_simple_contact_s *contact; + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_simple_contact._uri, &record); + contact = (ctsvc_simple_contact_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else + { + field_count = s_query->projection_count; + + if( CONTACTS_ERROR_NONE != ctsvc_record_set_projection_flags(record, s_query->projection, s_query->projection_count, s_query->property_count) ) + { + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_CONTACT_ID: + contact->contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_CONTACT_DISPLAY_NAME: + temp = ctsvc_stmt_get_text(stmt, i); + contact->display_name = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID: + contact->display_source_type = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID: + contact->addressbook_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_CONTACT_RINGTONE: + temp = ctsvc_stmt_get_text(stmt, i); + contact->ringtone_path = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL: + temp = ctsvc_stmt_get_text(stmt, i); + if (temp && *temp) { + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_IMG_FULL_LOCATION, temp); + contact->image_thumbnail_path = strdup(full_path); + } + break; + case CTSVC_PROPERTY_CONTACT_IS_FAVORITE: + contact->is_favorite = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER: + contact->has_phonenumber = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_CONTACT_HAS_EMAIL: + contact->has_email = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_CONTACT_PERSON_ID: + contact->person_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_CONTACT_UID: + temp = ctsvc_stmt_get_text(stmt, i); + contact->uid = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_CONTACT_VIBRATION: + temp = ctsvc_stmt_get_text(stmt, i); + contact->vibration = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_CONTACT_CHANGED_TIME: + contact->changed_time = ctsvc_stmt_get_int(stmt, i); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_simple_contact_insert_record( contacts_record_h record, int *id) +{ + int version; + int ret; + char query[CTS_SQL_MAX_LEN] = {0}; + char image[CTS_SQL_MAX_LEN] = {0}; + ctsvc_simple_contact_s *contact = (ctsvc_simple_contact_s*)record; + cts_stmt stmt; + + // These check should be done in client side +// RETVM_IF(contact->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted contact record"); + RETVM_IF(NULL == contact, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact is NULL"); + RETVM_IF(contact->addressbook_id < 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : addressbook_id(%d) is mandatory field to insert contact record ", contact->addressbook_id); +// RETVM_IF(0 < contact->contact_id, CONTACTS_ERROR_INVALID_PARAMETER, +// "Invalid parameter : ide(%d), This record is already inserted", contact->contact_id); + + ret = ctsvc_begin_trans(); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + ret = cts_db_get_next_id(CTS_TABLE_CONTACTS); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("cts_db_get_next_id() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + contact->contact_id = ret; + if (id) + *id = ret; + + if (contact->image_thumbnail_path) { + image[0] = '\0'; + ret = ctsvc_contact_add_image_file(CTSVC_IMG_NORMAL, contact->contact_id, contact->image_thumbnail_path, + image, sizeof(image)); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_contact_add_image_file(NORMAL) Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + free(contact->image_thumbnail_path); + contact->image_thumbnail_path = strdup(image); + } + + version = ctsvc_get_next_ver(); + + ret = ctsvc_db_insert_person((contacts_record_h)contact); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_db_insert_person() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + contact->person_id = ret; + + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_CONTACTS"(contact_id, person_id, addressbook_id, is_restricted, " + "created_ver, changed_ver, changed_time, " + "uid, ringtone_path, vibration, image_thumbnail_path) " + "VALUES(%d, %d, %d, %d, %d, %d, %d, ?, ?, ?, ?)", + contact->contact_id, contact->person_id, contact->addressbook_id, contact->is_restricted, + version, version, (int)time(NULL)); + + stmt = cts_query_prepare(query); + if(NULL == stmt){ + CTS_ERR("cts_query_prepare() Failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + if (contact->uid) + cts_stmt_bind_text(stmt, 1, contact->uid); + if (contact->ringtone_path) + cts_stmt_bind_text(stmt, 2, contact->ringtone_path); + if (contact->vibration) + cts_stmt_bind_text(stmt, 3, contact->vibration); + if (contact->image_thumbnail_path) + cts_stmt_bind_text(stmt, 4, contact->image_thumbnail_path); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + cts_stmt_finalize(stmt); + + ctsvc_set_contact_noti(); + + ret = ctsvc_end_trans(true); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_svc_end_trans() Failed(%d)", ret); + + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_simple_contact_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_simple_contact_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_simple_contact_delete_records(int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_speeddial.c b/native/ctsvc_db_plugin_speeddial.c new file mode 100644 index 0000000..13bec0b --- /dev/null +++ b/native/ctsvc_db_plugin_speeddial.c @@ -0,0 +1,400 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_list.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_query.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + +static int __ctsvc_db_speeddial_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_speeddial_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_speeddial_update_record( contacts_record_h record ); +static int __ctsvc_db_speeddial_delete_record( int id ); +static int __ctsvc_db_speeddial_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_speeddial_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_speeddial_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_speeddial_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_speeddial_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_speeddial = { + .is_query_only = false, + .insert_record = __ctsvc_db_speeddial_insert_record, + .get_record = __ctsvc_db_speeddial_get_record, + .update_record = __ctsvc_db_speeddial_update_record, + .delete_record = __ctsvc_db_speeddial_delete_record, + .get_all_records = __ctsvc_db_speeddial_get_all_records, + .get_records_with_query = __ctsvc_db_speeddial_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_speeddial_insert_records, + .update_records = NULL,//__ctsvc_db_speeddial_update_records, + .delete_records = NULL,//__ctsvc_db_speeddial_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_speeddial_insert_record( contacts_record_h record, int *id ) +{ + int ret; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_speeddial_s *speeddial = (ctsvc_speeddial_s*)record; + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_SPEEDDIALS"(speed_number, number_id) VALUES(%d, %d)", + speeddial->dial_number, speeddial->number_id); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = cts_db_change(); + if (0 < ret) { + if (id) + *id = cts_db_get_last_insert_id(); + ctsvc_set_speed_noti(); + } + else { + CTS_ERR("already exist"); + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + return ret; + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_speeddial_value_set(cts_stmt stmt, contacts_record_h *record) +{ + int i; + int ret; + char *temp; + ctsvc_speeddial_s *speeddial; + + ret = contacts_record_create(_contacts_speeddial._uri, record); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + speeddial = (ctsvc_speeddial_s*)*record; + + i = 0; + speeddial->person_id = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + speeddial->display_name = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + if (temp) { + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_IMG_FULL_LOCATION, temp); + speeddial->image_thumbnail_path = strdup(full_path); + } + + speeddial->number_id = ctsvc_stmt_get_int(stmt, i++); + speeddial->number_type = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + speeddial->label = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + speeddial->number = SAFE_STRDUP(temp); + speeddial->dial_number = ctsvc_stmt_get_int(stmt, i++); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_speeddial_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + cts_stmt stmt = NULL; + contacts_record_h record; + char query[CTS_SQL_MAX_LEN] = {0}; + + snprintf(query, sizeof(query), + "SELECT person_id, %s, image_thumbnail_path, number_id, " + "type, label, number, speed_number " + "FROM "CTSVC_DB_VIEW_SPEEDIDAL " " + "WHERE speed_number = %d", + ctsvc_get_display_column(), id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + ret = __ctsvc_db_speeddial_value_set(stmt, &record); + + cts_stmt_finalize(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("__ctsvc_db_speeddial_value_set(ALL) Failed(%d)", ret); + return ret; + } + + *out_record = record; + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_speeddial_update_record( contacts_record_h record ) +{ + int ret; + cts_stmt stmt; + char query[CTS_SQL_MIN_LEN] = {0}; + ctsvc_speeddial_s *speeddial = (ctsvc_speeddial_s *)record; + + RETVM_IF (speeddial->dial_number < 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invaild parameter : dial number (%d)", speeddial->dial_number); + RETVM_IF (speeddial->number_id < 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invaild parameter : number id (%d)", speeddial->number_id); + + snprintf(query, sizeof(query), "UPDATE "CTS_TABLE_SPEEDDIALS" " + "SET number_id = %d WHERE speed_number = %d", + speeddial->number_id, speeddial->dial_number); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = ctsvc_begin_trans(); + if (ret) { + cts_stmt_finalize(stmt); + CTS_ERR("contacts_svc_begin_trans() Failed(%d)", ret); + return ret; + } + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + ret = cts_db_change(); + cts_stmt_finalize(stmt); + + if (0 < ret) { + ctsvc_set_speed_noti(); + ret = ctsvc_end_trans(true); + } + else { + ctsvc_end_trans(false); + ret = CONTACTS_ERROR_NO_DATA; + } + + if (ret < CONTACTS_ERROR_NONE) + return ret; + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_speeddial_delete_record( int id ) +{ + int ret; + cts_stmt stmt; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "DELETE FROM %s WHERE speed_number = %d", + CTS_TABLE_SPEEDDIALS, id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = ctsvc_begin_trans(); + if (ret) { + cts_stmt_finalize(stmt); + CTS_ERR("ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + ret = cts_db_change(); + cts_stmt_finalize(stmt); + + if (0 < ret) { + ctsvc_set_speed_noti(); + ret = ctsvc_end_trans(true); + } + else { + ctsvc_end_trans(false); + ret = CONTACTS_ERROR_NO_DATA; + } + + if (ret < CONTACTS_ERROR_NONE) + return ret; + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_speeddial_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int ret; + int len; + cts_stmt stmt; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_list_h list; + + len = snprintf(query, sizeof(query), + "SELECT person_id, %s, image_thumbnail_path, number_id, " + "type, label, number, speed_number " + "FROM "CTSVC_DB_VIEW_SPEEDIDAL " ", ctsvc_get_display_column()); + + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + __ctsvc_db_speeddial_value_set(stmt, &record); + + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_speeddial_get_records_with_query( contacts_query_h query, + int offset, int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_speeddial_s *speeddial; + char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt is failed(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_speeddial._uri, &record); + speeddial = (ctsvc_speeddial_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else + { + field_count = s_query->projection_count; + + if( CONTACTS_ERROR_NONE != ctsvc_record_set_projection_flags(record, s_query->projection, s_query->projection_count, s_query->property_count) ) + { + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_SPEEDDIAL_DIAL_NUMBER: + speeddial->dial_number = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_SPEEDDIAL_NUMBER_ID: + speeddial->number_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_SPEEDDIAL_NUMBER: + temp = ctsvc_stmt_get_text(stmt, i); + speeddial->number = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_SPEEDDIAL_NUMBER_LABEL: + temp = ctsvc_stmt_get_text(stmt, i); + speeddial->label = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_SPEEDDIAL_NUMBER_TYPE: + speeddial->number_type = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_SPEEDDIAL_PERSON_ID: + speeddial->person_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_SPEEDDIAL_DISPLAY_NAME: + temp = ctsvc_stmt_get_text(stmt, i); + speeddial->display_name = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_SPEEDDIAL_IMAGE_THUMBNAIL: + temp = ctsvc_stmt_get_text(stmt, i); + if (temp) { + snprintf(full_path, sizeof(full_path), "%s/%s", CTS_IMG_FULL_LOCATION, temp); + speeddial->image_thumbnail_path = strdup(full_path); + } + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_speeddial_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_speeddial_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_speeddial_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_url.c b/native/ctsvc_db_plugin_url.c new file mode 100644 index 0000000..ae798b6 --- /dev/null +++ b/native/ctsvc_db_plugin_url.c @@ -0,0 +1,365 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_db_plugin_url_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_db_query.h" +#include "ctsvc_list.h" + +static int __ctsvc_db_url_insert_record( contacts_record_h record, int *id ); +static int __ctsvc_db_url_get_record( int id, contacts_record_h* out_record ); +static int __ctsvc_db_url_update_record( contacts_record_h record ); +static int __ctsvc_db_url_delete_record( int id ); +static int __ctsvc_db_url_get_all_records( int offset, int limit, contacts_list_h* out_list ); +static int __ctsvc_db_url_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list ); +//static int __ctsvc_db_url_insert_records(const contacts_list_h in_list, int **ids); +//static int __ctsvc_db_url_update_records(const contacts_list_h in_list); +//static int __ctsvc_db_url_delete_records( int ids[], int count); + +ctsvc_db_plugin_info_s ctsvc_db_plugin_url = { + .is_query_only = false, + .insert_record = __ctsvc_db_url_insert_record, + .get_record = __ctsvc_db_url_get_record, + .update_record = __ctsvc_db_url_update_record, + .delete_record = __ctsvc_db_url_delete_record, + .get_all_records = __ctsvc_db_url_get_all_records, + .get_records_with_query = __ctsvc_db_url_get_records_with_query, + .insert_records = NULL,//__ctsvc_db_url_insert_records, + .update_records = NULL,//__ctsvc_db_url_update_records, + .delete_records = NULL,//__ctsvc_db_url_delete_records + .get_count = NULL, + .get_count_with_query = NULL, + .replace_record = NULL, + .replace_records = NULL, +}; + +static int __ctsvc_db_url_insert_record( contacts_record_h record, int *id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_url_s *url = (ctsvc_url_s *)record; + + RETVM_IF(NULL == url->url, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : url is NULL"); + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", url->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_url_insert(record, url->contact_id, false, id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", url->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_contact_update_changed_time(url->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_url_get_record( int id, contacts_record_h* out_record ) +{ + int ret; + int len; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, data3 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE id = %d AND datatype = %d ", + id, CTSVC_DATA_URL); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return CONTACTS_ERROR_NO_DATA; + } + + ctsvc_db_url_get_value_from_stmt(stmt, out_record, 0); + + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_url_update_record( contacts_record_h record ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_url_s *url = (ctsvc_url_s *)record; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", url->contact_id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("No data : contact_id (%d) is not exist", contact_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + ret = ctsvc_db_url_update(record, url->contact_id, false); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(url->contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_url_delete_record( int id ) +{ + int ret; + int contact_id; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + return ret; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT " " + "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id); + ret = ctsvc_query_get_first_int_result(query, &contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("The id(%d) is Invalid(%d)", id, ret); + ctsvc_end_trans(false); + return contact_id; + } + + ret = ctsvc_db_url_delete(id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_db_contact_update_changed_time(contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_url_get_all_records( int offset, int limit, contacts_list_h* out_list ) +{ + int len; + int ret; + contacts_list_h list; + ctsvc_url_s *url; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + + len = snprintf(query, sizeof(query), + "SELECT id, data.contact_id, is_default, data1, data2, data3 " + "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" " + "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id " + "WHERE datatype = %d AND is_my_profile=0 ", + CTSVC_DATA_URL); + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB : cts_stmt_step fail(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + ctsvc_db_url_get_value_from_stmt(stmt, (contacts_record_h*)&url, 0); + ctsvc_list_prepend(list, (contacts_record_h)url); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_url_get_records_with_query( contacts_query_h query, int offset, + int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int field_count; + ctsvc_query_s *s_query; + cts_stmt stmt; + contacts_list_h list; + ctsvc_url_s *url; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s *)query; + + ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 /*CTS_TRUE */ != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(_contacts_url._uri, &record); + url = (ctsvc_url_s*)record; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else { + field_count = s_query->projection_count; + ret = ctsvc_record_set_projection_flags(record, s_query->projection, + s_query->projection_count, s_query->property_count); + + if(CONTACTS_ERROR_NONE != ret) + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + switch(property_id) { + case CTSVC_PROPERTY_URL_ID: + url->id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_URL_CONTACT_ID: + url->contact_id = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_URL_TYPE: + url->type = ctsvc_stmt_get_int(stmt, i); + break; + case CTSVC_PROPERTY_URL_LABEL: + temp = ctsvc_stmt_get_text(stmt, i); + url->label = SAFE_STRDUP(temp); + break; + case CTSVC_PROPERTY_URL_URL: + temp = ctsvc_stmt_get_text(stmt, i); + url->url = SAFE_STRDUP(temp); + break; + default: + break; + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +//static int __ctsvc_db_url_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_url_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; } +//static int __ctsvc_db_url_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_db_plugin_url_helper.c b/native/ctsvc_db_plugin_url_helper.c new file mode 100644 index 0000000..eaff3fe --- /dev/null +++ b/native/ctsvc_db_plugin_url_helper.c @@ -0,0 +1,147 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_db_plugin_url_helper.h" +#include "ctsvc_record.h" +#include "ctsvc_notification.h" + + +int ctsvc_db_url_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count) +{ + int ret; + char *temp; + ctsvc_url_s *url; + + ret = contacts_record_create(_contacts_url._uri, (contacts_record_h *)&url); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + + url->id = ctsvc_stmt_get_int(stmt, start_count++); + url->contact_id = ctsvc_stmt_get_int(stmt, start_count++); + start_count++; + url->type = ctsvc_stmt_get_int(stmt, start_count++); + temp = ctsvc_stmt_get_text(stmt, start_count++); + url->label = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, start_count++); + url->url = SAFE_STRDUP(temp); + + *record = (contacts_record_h)url; + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_url_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id) +{ + int ret; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; + ctsvc_url_s *url = (ctsvc_url_s *)record; + +// RETVM_IF(url->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted url record"); + RETV_IF(NULL == url->url, CONTACTS_ERROR_NONE); + RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : contact_id(%d) is mandatory field to insert url record ", url->contact_id); + RETVM_IF(0 < url->id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : id(%d), This record is already inserted", url->id); + + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, data1, data2, data3) " + "VALUES(%d, %d, %d, %d, ?, ?)", + contact_id, is_my_profile, CTSVC_DATA_URL, url->type); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + if (url->label) + cts_stmt_bind_text(stmt, 1, url->label); + if (url->url) + cts_stmt_bind_text(stmt, 2, url->url); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + //url->id = cts_db_get_last_insert_id(); + if (id) + *id = cts_db_get_last_insert_id(); + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_url_noti(); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_url_update(contacts_record_h record, int contact_id, bool is_my_profile) +{ + int ret; + ctsvc_url_s *url = (ctsvc_url_s*)record; + char query[CTS_SQL_MAX_LEN] = {0}; + cts_stmt stmt; + + RETVM_IF(!url->id, CONTACTS_ERROR_INVALID_PARAMETER, "url of contact has no ID."); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=? WHERE id=%d", + contact_id, is_my_profile, url->type, url->id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + if (url->label) + cts_stmt_bind_text(stmt, 1, url->label); + if (url->url) + cts_stmt_bind_text(stmt, 2, url->url); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + return ret; + } + + cts_stmt_finalize(stmt); + + if (!is_my_profile) + ctsvc_set_url_noti(); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_db_url_delete(int id) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d", + id, CTSVC_DATA_URL); + + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret); + ctsvc_set_url_noti(); + + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_url_helper.h b/native/ctsvc_db_plugin_url_helper.h new file mode 100644 index 0000000..1e06795 --- /dev/null +++ b/native/ctsvc_db_plugin_url_helper.h @@ -0,0 +1,32 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_URL_HELPER_H__ +#define __CTSVC_DB_PLUGIN_URL_HELPER_H__ + +#include "contacts.h" +#include "ctsvc_sqlite.h" + +int ctsvc_db_url_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id); +int ctsvc_db_url_update(contacts_record_h record, int contact_id, bool is_my_profile); +int ctsvc_db_url_delete(int id); + +int ctsvc_db_url_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count); + +#endif // __CTSVC_DB_PLUGIN_URL_HELPER_H__ diff --git a/native/ctsvc_db_query.c b/native/ctsvc_db_query.c new file mode 100755 index 0000000..11a57d7 --- /dev/null +++ b/native/ctsvc_db_query.c @@ -0,0 +1,2119 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_schema.h" +#include "ctsvc_list.h" +#include "ctsvc_record.h" +#include "ctsvc_utils.h" +#include "ctsvc_normalize.h" +#include "ctsvc_restriction.h" +#include "ctsvc_db_init.h" +#include "ctsvc_view.h" +#include "ctsvc_inotify.h" + +#include "ctsvc_db_plugin_person_helper.h" + +typedef enum { + QUERY_SORTKEY, + QUERY_FILTER, + QUERY_PROJECTION, +}db_query_property_type_e; + +static const char * __ctsvc_db_get_property_field_name(const property_info_s *properties, + int count, db_query_property_type_e property_type, unsigned int property_id) +{ + int i; + + for (i=0;iproperty_id) { + if (p->fields) { + if (property_type == QUERY_PROJECTION) { + if (p->property_type == CTSVC_SEARCH_PROPERTY_PROJECTION || p->property_type == CTSVC_SEARCH_PROPERTY_ALL) + return p->fields; + } + else if (property_type == QUERY_FILTER) { + if (p->property_type == CTSVC_SEARCH_PROPERTY_FILTER || p->property_type == CTSVC_SEARCH_PROPERTY_ALL) + return p->fields; + } + else if (property_type == QUERY_SORTKEY) { + return p->fields; + } + return NULL; + } + /* + else if (property_id == CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX) { + if (property_type != QUERY_PROJECTION) + return NULL; + const char* temp = ctsvc_get_display_column(); + // snprintf(temp, sizeof(temp), "_NORMALIZE_INDEX_(%s)", ctsvc_get_display_column()); + return "_NORMALIZE_INDEX_"temp; + } + */ + else + return ctsvc_get_display_column(); + } + } + return NULL; +} + +static inline int __ctsvc_db_get_property_type(const property_info_s *properties, + int count, unsigned int property_id) +{ + int i; + for (i=0;iproperty_id) { + return p->type; + } + } + return -1; +} + +static inline int __ctsvc_db_create_int_condition(ctsvc_composite_filter_s *com_filter, + ctsvc_attribute_filter_s *filter, char **condition ) +{ + const char *field_name; + char out_cond[CTS_SQL_MAX_LEN] = {0}; + + field_name = __ctsvc_db_get_property_field_name(com_filter->properties, + com_filter->property_count, QUERY_FILTER, filter->property_id); + RETVM_IF(NULL == field_name, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property id(%d)", filter->property_id); + + switch(filter->match) { + case CONTACTS_MATCH_EQUAL: + snprintf(out_cond, sizeof(out_cond), "%s = %d", field_name, filter->value.i); + break; + case CONTACTS_MATCH_GREATER_THAN: + snprintf(out_cond, sizeof(out_cond), "%s > %d", field_name, filter->value.i); + break; + case CONTACTS_MATCH_GREATER_THAN_OR_EQUAL: + snprintf(out_cond, sizeof(out_cond), "%s >= %d", field_name, filter->value.i); + break; + case CONTACTS_MATCH_LESS_THAN: + snprintf(out_cond, sizeof(out_cond), "%s < %d", field_name, filter->value.i); + break; + case CONTACTS_MATCH_LESS_THAN_OR_EQUAL: + snprintf(out_cond, sizeof(out_cond), "%s <= %d", field_name, filter->value.i); + break; + case CONTACTS_MATCH_NOT_EQUAL: + snprintf(out_cond, sizeof(out_cond), "%s <> %d", field_name, filter->value.i); + break; + case CONTACTS_MATCH_NONE: + snprintf(out_cond, sizeof(out_cond), "%s IS NULL", field_name); + break; + default : + CTS_ERR("Invalid parameter : int match rule(%d) is not supported", filter->match); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + *condition = strdup(out_cond); + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_db_create_double_condition(ctsvc_composite_filter_s *com_filter, + ctsvc_attribute_filter_s *filter, char **condition ) +{ + const char *field_name; + char out_cond[CTS_SQL_MAX_LEN] = {0}; + + field_name = __ctsvc_db_get_property_field_name(com_filter->properties, + com_filter->property_count, QUERY_FILTER, filter->property_id); + RETVM_IF(NULL == field_name, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property id(%d)", filter->property_id); + + switch(filter->match) { + case CONTACTS_MATCH_EQUAL: + snprintf(out_cond, sizeof(out_cond), "%s = %lf", field_name, filter->value.d); + break; + case CONTACTS_MATCH_GREATER_THAN: + snprintf(out_cond, sizeof(out_cond), "%s > %lf", field_name, filter->value.d); + break; + case CONTACTS_MATCH_GREATER_THAN_OR_EQUAL: + snprintf(out_cond, sizeof(out_cond), "%s >= %lf", field_name, filter->value.d); + break; + case CONTACTS_MATCH_LESS_THAN: + snprintf(out_cond, sizeof(out_cond), "%s < %lf", field_name, filter->value.d); + break; + case CONTACTS_MATCH_LESS_THAN_OR_EQUAL: + snprintf(out_cond, sizeof(out_cond), "%s <= %lf", field_name, filter->value.d); + break; + case CONTACTS_MATCH_NOT_EQUAL: + snprintf(out_cond, sizeof(out_cond), "%s <> %lf", field_name, filter->value.d); + break; + case CONTACTS_MATCH_NONE: + snprintf(out_cond, sizeof(out_cond), "%s IS NULL", field_name); + break; + default : + CTS_ERR("Invalid parameter : int match rule(%d) is not supported", filter->match); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + *condition = strdup(out_cond); + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_db_create_lli_condition(ctsvc_composite_filter_s *com_filter, + ctsvc_attribute_filter_s *filter, char **condition ) +{ + const char *field_name; + char out_cond[CTS_SQL_MAX_LEN] = {0}; + + field_name = __ctsvc_db_get_property_field_name(com_filter->properties, + com_filter->property_count, QUERY_FILTER, filter->property_id); + RETVM_IF(NULL == field_name, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property id(%d)", filter->property_id); + + switch(filter->match) { + case CONTACTS_MATCH_EQUAL: + snprintf(out_cond, sizeof(out_cond), "%s = %lld", field_name, filter->value.l); + break; + case CONTACTS_MATCH_GREATER_THAN: + snprintf(out_cond, sizeof(out_cond), "%s > %lld", field_name, filter->value.l); + break; + case CONTACTS_MATCH_GREATER_THAN_OR_EQUAL: + snprintf(out_cond, sizeof(out_cond), "%s >= %lld", field_name, filter->value.l); + break; + case CONTACTS_MATCH_LESS_THAN: + snprintf(out_cond, sizeof(out_cond), "%s < %lld", field_name, filter->value.l); + break; + case CONTACTS_MATCH_LESS_THAN_OR_EQUAL: + snprintf(out_cond, sizeof(out_cond), "%s <= %lld", field_name, filter->value.l); + break; + case CONTACTS_MATCH_NOT_EQUAL: + snprintf(out_cond, sizeof(out_cond), "%s <> %lld", field_name, filter->value.l); + break; + case CONTACTS_MATCH_NONE: + snprintf(out_cond, sizeof(out_cond), "%s IS NULL", field_name); + break; + default : + CTS_ERR("Invalid parameter : int match rule(%d) is not supported", filter->match); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + *condition = strdup(out_cond); + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_db_create_str_condition(ctsvc_composite_filter_s *com_filter, + ctsvc_attribute_filter_s *filter, char **condition, GSList **bind_text) +{ + int ret; + const char *field_name; + char out_cond[CTS_SQL_MAX_LEN] = {0}; + + *condition = NULL; + + field_name = __ctsvc_db_get_property_field_name(com_filter->properties, + com_filter->property_count, QUERY_FILTER, filter->property_id); + RETVM_IF(NULL == field_name, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property id(%d)", filter->property_id); + + if (filter->property_id == CTSVC_PROPERTY_NUMBER_NUMBER_FILTER) + filter->match = CONTACTS_MATCH_EXACTLY; + + switch(filter->match) { + case CONTACTS_MATCH_EXACTLY: + snprintf(out_cond, sizeof(out_cond), "%s = ?", field_name); + break; + case CONTACTS_MATCH_FULLSTRING: + snprintf(out_cond, sizeof(out_cond), "%s LIKE ?", field_name); + break; + case CONTACTS_MATCH_CONTAINS: + snprintf(out_cond, sizeof(out_cond), "%s LIKE ('%%' || ? || '%%')", field_name); + break; + case CONTACTS_MATCH_STARTSWITH: + snprintf(out_cond, sizeof(out_cond), "%s LIKE ( ? || '%%')", field_name); + break; + case CONTACTS_MATCH_ENDSWITH: + snprintf(out_cond, sizeof(out_cond), "%s LIKE ('%%' || ?)", field_name); + break; + case CONTACTS_MATCH_EXISTS: + snprintf(out_cond, sizeof(out_cond), "%s IS NOT NULL", field_name); + break; + default : + CTS_ERR("Invalid parameter : int match rule (%d) is not supported", filter->match); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + if (filter->value.s) { + if (filter->property_id == CTSVC_PROPERTY_NUMBER_NUMBER_FILTER) { + char dest[strlen(filter->value.s)+1]; + ret = ctsvc_normalize_number(filter->value.s, dest, sizeof(dest)); + if (CONTACTS_ERROR_NONE == ret) + *bind_text = g_slist_append(*bind_text, strdup(dest)); + else + return CONTACTS_ERROR_INVALID_PARAMETER; + } + else + *bind_text = g_slist_append(*bind_text, strdup(filter->value.s)); + } + *condition = strdup(out_cond); + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_db_create_bool_condition(ctsvc_composite_filter_s *com_filter, + ctsvc_attribute_filter_s *filter, char **condition ) +{ + const char *field_name; + char out_cond[CTS_SQL_MAX_LEN] = {0}; + + field_name = __ctsvc_db_get_property_field_name(com_filter->properties, + com_filter->property_count, QUERY_FILTER, filter->property_id); + RETVM_IF(NULL == field_name, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : property id(%d)", filter->property_id); + + snprintf(out_cond, sizeof(out_cond), "%s = %d", field_name, filter->value.b?1:0); + *condition = strdup(out_cond); + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_create_attribute_condition(ctsvc_composite_filter_s *com_filter, + ctsvc_attribute_filter_s *filter, char **condition, GSList **bind_text) +{ + int ret; + char *cond = NULL; + + RETV_IF(NULL == filter, CONTACTS_ERROR_INVALID_PARAMETER); + + switch (filter->filter_type) { + case CTSVC_FILTER_INT: + ret = __ctsvc_db_create_int_condition(com_filter, filter, &cond); + break; + case CTSVC_FILTER_BOOL: + ret = __ctsvc_db_create_bool_condition(com_filter, filter, &cond); + break; + case CTSVC_FILTER_STR: + ret = __ctsvc_db_create_str_condition(com_filter, filter, &cond, bind_text); + break; + case CTSVC_FILTER_LLI: + ret = __ctsvc_db_create_lli_condition(com_filter, filter, &cond); + break; + case CTSVC_FILTER_DOUBLE: + ret = __ctsvc_db_create_double_condition(com_filter, filter, &cond); + break; + default : + CTS_ERR("The filter type is not supported (%d)", filter->filter_type); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + if (CONTACTS_ERROR_NONE == ret) + *condition = cond; + + return ret; +} + +static inline int __ctsvc_db_create_composite_condition(ctsvc_composite_filter_s *com_filter, + char **condition, GSList **bind_text) +{ + RETV_IF(NULL == com_filter, CONTACTS_ERROR_INVALID_PARAMETER); + + int len; + char *cond, out_cond[CTS_SQL_MAX_LEN] = {0}; + GSList *cursor_filter; + GSList *cursor_ops; + ctsvc_filter_s *filter; + contacts_filter_operator_e op; + GSList *bind; + GSList *filters = com_filter->filters; + GSList *ops = com_filter->filter_ops; + + RETV_IF(NULL == filters, CONTACTS_ERROR_INVALID_PARAMETER); + + cond = NULL; + bind = NULL; + filter = (ctsvc_filter_s *)filters->data; + if (filter->filter_type == CTSVC_FILTER_COMPOSITE) + __ctsvc_db_create_composite_condition((ctsvc_composite_filter_s *)filter, &cond, bind_text); + else + __ctsvc_db_create_attribute_condition(com_filter, (ctsvc_attribute_filter_s*)filter, &cond, bind_text); + + cursor_filter = filters->next; + + len = 0; + len = snprintf(out_cond, sizeof(out_cond), "(%s)", cond); + free(cond); + + for(cursor_ops=ops; cursor_ops && cursor_filter; cursor_filter=cursor_filter->next, cursor_ops=cursor_ops->next) { + cond = NULL; + bind = NULL; + + filter = (ctsvc_filter_s *)cursor_filter->data; + if (filter->filter_type == CTSVC_FILTER_COMPOSITE) + __ctsvc_db_create_composite_condition((ctsvc_composite_filter_s *)filter, &cond, &bind); + else + __ctsvc_db_create_attribute_condition(com_filter, (ctsvc_attribute_filter_s*)filter, &cond, &bind); + + if (cond) { + op = (contacts_filter_operator_e)cursor_ops->data; + if (op == CONTACTS_FILTER_OPERATOR_AND) + len += snprintf(out_cond+len, sizeof(out_cond)-len, " AND (%s)", cond); + else + len += snprintf(out_cond+len, sizeof(out_cond)-len, " OR (%s)", cond); + if (bind) + *bind_text = g_slist_concat(*bind_text, bind); + free(cond); + } + } + *condition = strdup(out_cond); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_create_projection(const property_info_s *properties, int ids_count, + unsigned int *projections, int pro_count, char **projection) +{ + bool first; + int i; + int len; + const char *field_name = NULL; + char out_projection[CTS_SQL_MAX_LEN] = {0}; + char temp[CTS_SQL_MAX_LEN] = {0}; + + len = 0; + first = true; + if (0 < pro_count) { + for (i=0;iproperty_id) { + case CTSVC_PROPERTY_PERSON_DISPLAY_NAME: + case CTSVC_PROPERTY_CONTACT_DISPLAY_NAME: + return true; + default: + break; + } + } + return false; +} + +int ctsvc_db_make_get_records_query_stmt(ctsvc_query_s *s_query, int offset, int limit, cts_stmt *stmt) +{ + char query[CTS_SQL_MAX_LEN] = {0}; + int len; + int ret; + int i; + const char *table; + const char *sortkey = NULL; + char *condition = NULL; + char *projection = NULL; + GSList *bind_text = NULL; + GSList *cursor; + + ret = ctsvc_db_get_table_name(s_query->view_uri, &table); + RETVM_IF (CONTACTS_ERROR_NONE != ret, ret, "Invalid parameter : view uri (%s)", s_query->view_uri); + + ret = __ctsvc_db_create_projection(s_query->properties, s_query->property_count, + s_query->projection, s_query->projection_count, &projection); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("__ctsvc_db_create_projection is failed(%s)", ret); + return ret; + } + + if (s_query->distinct) + len = snprintf(query, sizeof(query), "SELECT DISTINCT %s FROM %s", projection, table); + else + len = snprintf(query, sizeof(query), "SELECT %s FROM %s", projection, table); + + if (s_query->filter) { + ret = __ctsvc_db_create_composite_condition(s_query->filter, &condition, &bind_text); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("__ctsvc_db_create_composite_condition is failed(%d)", ret); + free(projection); + return ret; + } + if (condition && *condition) + len += snprintf(query+len, sizeof(query)-len, " WHERE %s", condition); + } + + if (__ctsvc_db_view_has_display_name(s_query->view_uri, s_query->properties, s_query->property_count)) + sortkey = ctsvc_get_sort_column(); + + if (s_query->sort_property_id) { + const char *field_name; + + switch(s_query->sort_property_id) { + case CTSVC_PROPERTY_PERSON_DISPLAY_NAME: + case CTSVC_PROPERTY_CONTACT_DISPLAY_NAME: + len += snprintf(query+len, sizeof(query)-len, " ORDER BY %s %s", sortkey, s_query->sort_asc?"":"DESC"); + break; + default : + field_name = __ctsvc_db_get_property_field_name(s_query->properties, + s_query->property_count, QUERY_SORTKEY, s_query->sort_property_id); + if (field_name) { + len += snprintf(query+len, sizeof(query)-len, " ORDER BY %s", field_name); +// if (sortkey) +// len += snprintf(query+len, sizeof(query)-len, ", %s", sortkey); + if (false == s_query->sort_asc) + len += snprintf(query+len, sizeof(query)-len, " DESC"); + } + else if (sortkey) + len += snprintf(query+len, sizeof(query)-len, " ORDER BY %s", sortkey); + break; + } + } + else if (sortkey) + len += snprintf(query+len, sizeof(query)-len, " ORDER BY %s", sortkey); + + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + free(condition); + free(projection); + + CTS_DBG("query : %s", query); + *stmt = cts_query_prepare(query); + if(NULL == *stmt) { + CTS_ERR("DB error : cts_query_prepare() Failed"); + for (cursor=bind_text;cursor;cursor=cursor->next) + free(cursor->data); + g_slist_free(bind_text); + return CONTACTS_ERROR_DB; + } + + for (cursor=bind_text, i=1; cursor;cursor=cursor->next, i++) + cts_stmt_bind_copy_text(*stmt, i, cursor->data, strlen(cursor->data)); + + for (cursor=bind_text;cursor;cursor=cursor->next) + free(cursor->data); + g_slist_free(bind_text); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_get_records_with_query_exec(ctsvc_query_s *query, int offset, + int limit, contacts_list_h* out_list ) +{ + int ret; + int i; + int type; + cts_stmt stmt = NULL; + contacts_list_h list = NULL; + + ret = ctsvc_db_make_get_records_query_stmt(query, offset, limit, &stmt); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_db_make_get_records_query_stmt(%d)", ret); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + int field_count; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + contacts_record_create(query->view_uri, (contacts_record_h*)&record); + + if (0 == query->projection_count) + field_count = query->property_count; + else { + field_count = query->projection_count; + + if( CONTACTS_ERROR_NONE != ctsvc_record_set_projection_flags(record, query->projection, query->projection_count, query->property_count) ) + { + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + } + + for(i=0;iprojection_count) + property_id = query->properties[i].property_id; + else { + property_id = query->projection[i]; + } + type = __ctsvc_db_get_property_type(query->properties, query->property_count, property_id); + if (type == CTSVC_VIEW_DATA_TYPE_INT) + ctsvc_record_set_int(record, property_id, ctsvc_stmt_get_int(stmt, i)); + else if (type == CTSVC_VIEW_DATA_TYPE_STR) + ctsvc_record_set_str(record, property_id, ctsvc_stmt_get_text(stmt, i)); + else if (type == CTSVC_VIEW_DATA_TYPE_BOOL) + ctsvc_record_set_bool(record, property_id, (ctsvc_stmt_get_int(stmt, i)?true:false)); + else if (type == CTSVC_VIEW_DATA_TYPE_LLI) + ctsvc_record_set_lli(record, property_id, ctsvc_stmt_get_int64(stmt, i)); + else if (type == CTSVC_VIEW_DATA_TYPE_DOUBLE) + ctsvc_record_set_double(record, property_id, ctsvc_stmt_get_dbl(stmt, i)); + else + CTS_ERR("DB error : unknown type (%d)", type); + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_get_all_records_exec(const char *view_uri, const property_info_s* properties, int ids_count, + const char *projection, int offset, int limit, contacts_list_h* out_list ) +{ + char query[CTS_SQL_MAX_LEN] = {0}; + const char *table; + int len; + int ret; + int i; + int type; + cts_stmt stmt = NULL; + contacts_list_h list = NULL; + ctsvc_record_type_e r_type; + const char *sortkey; + + ret = ctsvc_db_get_table_name(view_uri, &table); + RETVM_IF (CONTACTS_ERROR_NONE != ret, ret, "Invalid parameter : view uri (%s)", view_uri); + + len = snprintf(query, sizeof(query), "SELECT %s FROM %s", projection, table); + + if (__ctsvc_db_view_has_display_name(view_uri, properties, ids_count)) { + sortkey = ctsvc_get_sort_column(); + len += snprintf(query+len, sizeof(query)-len, " ORDER BY %s", sortkey); + } + + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + r_type = ctsvc_view_get_record_type(view_uri); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return CONTACTS_ERROR_NO_DATA; + } + + contacts_record_create(view_uri, &record); + for(i=0;iview_uri, &table); + RETVM_IF (CONTACTS_ERROR_NONE != ret, ret, "Invalid parameter : view uri (%s)", s_query->view_uri); + + if (s_query->distinct) + len = snprintf(query, sizeof(query), "SELECT DISTINCT %s ", projection); + else + len = snprintf(query, sizeof(query), "SELECT %s ", projection); + + if (0 == strcmp(s_query->view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT) + || 0 == strcmp(s_query->view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP)) { + len += snprintf(query+len, sizeof(query)-len, "FROM %s, %s " + "ON %s.contact_id = %s.contact_id ", + table, CTS_TABLE_SEARCH_INDEX, + table, CTS_TABLE_SEARCH_INDEX); + } + else { // CTSVC_VIEW_URI_PERSON + len += snprintf(query+len, sizeof(query)-len, "FROM %s, %s, " + "(SELECT contact_id, person_id person_id_in_contact FROM %s WHERE deleted = 0) temp_contacts " + "ON %s.person_id = temp_contacts.person_id_in_contact " + "AND temp_contacts.contact_id = %s.contact_id", + table, CTS_TABLE_SEARCH_INDEX, CTS_TABLE_CONTACTS, table, CTS_TABLE_SEARCH_INDEX); + } +/* len += snprintf(query+len, sizeof(query)-len, "FROM %s, "CTS_TABLE_SEARCH_INDEX" " + "ON %s.contact_id = "CTS_TABLE_SEARCH_INDEX".contact_id", table, table);*/ + + ret = ctsvc_normalize_str(keyword, remake_val, sizeof(remake_val)); + + if (CONTACTS_ERROR_NONE <= ret) { + len += snprintf(query+len, sizeof(query)-len, + " WHERE ("CTS_TABLE_SEARCH_INDEX" MATCH 'name:%s* OR number:%s* OR data:%s*') ", remake_val, keyword, keyword); + } + else + len += snprintf(query+len, sizeof(query)-len, + " WHERE ("CTS_TABLE_SEARCH_INDEX" MATCH 'name:%s* OR number:%s* OR data:%s*') ", keyword, keyword, keyword); + + if (condition && *condition) + len += snprintf(query+len, sizeof(query)-len, " AND (%s)", condition); + + if (__ctsvc_db_view_has_display_name(s_query->view_uri, s_query->properties, s_query->property_count)) + sortkey = ctsvc_get_sort_column(); + + if (s_query->sort_property_id) { + const char *field_name; + + switch(s_query->sort_property_id) { + case CTSVC_PROPERTY_PERSON_DISPLAY_NAME: + case CTSVC_PROPERTY_CONTACT_DISPLAY_NAME: + len += snprintf(query+len, sizeof(query)-len, " ORDER BY %s %s", sortkey, s_query->sort_asc?"":"DESC"); + break; + default : + field_name = __ctsvc_db_get_property_field_name(s_query->properties, + s_query->property_count, QUERY_SORTKEY, s_query->sort_property_id); + if (field_name) { + len += snprintf(query+len, sizeof(query)-len, " ORDER BY %s", field_name); +// if (sortkey) +// len += snprintf(query+len, sizeof(query)-len, ", %s", sortkey); + if (false == s_query->sort_asc) + len += snprintf(query+len, sizeof(query)-len, " DESC"); + } + else if (sortkey) + len += snprintf(query+len, sizeof(query)-len, " ORDER BY %s", sortkey); + break; + } + } + else if (sortkey) + len += snprintf(query+len, sizeof(query)-len, " ORDER BY %s", sortkey); + + if (0 < limit) { + len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit); + if (0 < offset) + len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset); + } + + CTS_DBG("%s", query); + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + i = 1; +// sqlite3_bind_text(stmt, i++, keyword, strlen(keyword), SQLITE_STATIC); +// if (*remake_val) +// sqlite3_bind_text(stmt, i++, remake_val, strlen(remake_val), SQLITE_STATIC); + + len = g_slist_length(bind); + for (cursor=bind; cursor;cursor=cursor->next, i++) + sqlite3_bind_text(stmt, i, cursor->data, strlen(cursor->data), SQLITE_STATIC); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + if( ctsvc_view_get_record_type(s_query->view_uri) == CTSVC_RECORD_PERSON ) { + unsigned int ids_count; + unsigned int *project; + if (0 == s_query->projection_count) + ids_count = s_query->property_count; + else + ids_count = s_query->projection_count; + + project = malloc(sizeof(unsigned int)*ids_count); + + for(i=0;iprojection_count) + project[i] = s_query->properties[i].property_id; + else + project[i] = s_query->projection[i]; + } + + ret = ctsvc_db_person_create_record_from_stmt_with_projection(stmt, project, ids_count, &record); + free(project); + + if( CONTACTS_ERROR_NONE != ret ) + CTS_ERR("DB error : make record Failed(%d)", ret); + } + else { + contacts_record_create(s_query->view_uri, (contacts_record_h*)&record); + int field_count; + if (0 == s_query->projection_count) + field_count = s_query->property_count; + else + { + field_count = s_query->projection_count; + + if( CONTACTS_ERROR_NONE != ctsvc_record_set_projection_flags(record, s_query->projection, s_query->projection_count, s_query->property_count) ) + { + ASSERT_NOT_REACHED("To set projection is failed.\n"); + } + } + + for(i=0;iprojection_count) + property_id = s_query->properties[i].property_id; + else + property_id = s_query->projection[i]; + + type = __ctsvc_db_get_property_type(s_query->properties, s_query->property_count, s_query->projection[i]); + if (type == CTSVC_VIEW_DATA_TYPE_INT) + ctsvc_record_set_int(record,property_id, ctsvc_stmt_get_int(stmt, i)); + else if (type == CTSVC_VIEW_DATA_TYPE_STR) + ctsvc_record_set_str(record, property_id, ctsvc_stmt_get_text(stmt, i)); + else if (type == CTSVC_VIEW_DATA_TYPE_BOOL) + ctsvc_record_set_bool(record, property_id, (ctsvc_stmt_get_int(stmt, i)?true:false)); + else if (type == CTSVC_VIEW_DATA_TYPE_LLI) + ctsvc_record_set_lli(record, property_id, ctsvc_stmt_get_int64(stmt, i)); + else if (type == CTSVC_VIEW_DATA_TYPE_DOUBLE) + ctsvc_record_set_double(record, property_id, ctsvc_stmt_get_dbl(stmt, i)); + else + CTS_ERR("DB error : unknown type (%d)", type); + } + } + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_search_records_with_query( contacts_query_h query, const char *keyword, + int offset, int limit, contacts_list_h* out_list) +{ + int ret; + char *condition = NULL; + char *projection; + ctsvc_query_s *s_query; + GSList *bind_text = NULL; + GSList *cursor = NULL; + bool can_keyword_search; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + RETVM_IF(NULL == keyword, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : keyword is NULL"); + s_query = (ctsvc_query_s *)query; + + can_keyword_search = __ctsvc_db_view_can_keyword_search(s_query->view_uri); + RETVM_IF(false == can_keyword_search, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : can not keyword search"); + + if (s_query->filter) { + ret = __ctsvc_db_create_composite_condition(s_query->filter, &condition, &bind_text); + RETVM_IF (CONTACTS_ERROR_NONE != ret, ret, "__ctsvc_db_create_composite_condition is failed(%s)", ret); + } + + ret = __ctsvc_db_create_projection(s_query->properties, s_query->property_count, + s_query->projection, s_query->projection_count, &projection); + RETVM_IF (CONTACTS_ERROR_NONE != ret, ret, "__ctsvc_db_create_projection is failed(%s)", ret); + + ret = __ctsvc_db_search_records_with_query_exec(s_query, projection, condition, bind_text, keyword, offset, limit, out_list); + RETVM_IF (CONTACTS_ERROR_NONE != ret, ret, "__ctsvc_db_search_records_with_query_exec is failed(%s)", ret); + + for (cursor=bind_text;cursor;cursor=cursor->next) + free(cursor->data); + g_slist_free(bind_text); + + free(condition); + free(projection); + + return CONTACTS_ERROR_NONE; +} + +typedef struct { + contacts_list_h list; + int *ids; + unsigned int count; + unsigned int index; + const char *view_uri; + void *cb; + void *user_data; +}ctsvc_bulk_info_s; + +static int __ctsvc_db_insert_records(contacts_list_h list, int **ids) +{ + int ret; + int index; + int *id = NULL; + unsigned int count; + contacts_record_h record = NULL; + + ret = contacts_list_get_count(list, &count); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("contacts_list_get_count() failed(%d)", ret); + return ret; + } + + ret = ctsvc_begin_trans(); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_server_db_begin_trans is failed(%d)", ret); + + id = calloc(count, sizeof(int)); + + contacts_list_first(list); + index = 0; + do { + ret = contacts_list_get_current_record_p(list, &record); + if( CONTACTS_ERROR_NONE != ret) { + CTS_ERR("contacts_list_get_current_record_p is faild(%d)", ret); + ctsvc_end_trans(false); + free(id); + return ret; + } + + ret = contacts_db_insert_record(record, &id[index++]); + if( ret != CONTACTS_ERROR_NONE ) { + CTS_ERR("contacts_db_insert_record is faild(%d)", ret); + ctsvc_end_trans(false); + free(id); + return ret; + } + }while (CONTACTS_ERROR_NONE == contacts_list_next(list)); + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + + if (ids) + *ids = id; + else + free(id); + return CONTACTS_ERROR_NONE; +} + +#ifdef _CONTACTS_NATIVE +static gboolean __ctsvc_db_insert_idler(void *data) +{ + int ret; + ctsvc_bulk_info_s *info = data; + contacts_db_insert_result_cb cb; + + ret = __ctsvc_db_insert_records(info->list, &info->ids); + + if (info->cb) { + cb = info->cb; + if( CONTACTS_ERROR_NONE != ret) { + cb(ret, NULL, 0, info->user_data); + } + else { + unsigned int count = 0; + contacts_list_get_count(info->list, &count); + cb(ret, info->ids, count, info->user_data); + } + } + contacts_list_destroy(info->list, true); + free(info->ids); + free(info); + return false; +} +#endif + +static int __ctsvc_db_delete_records(const char* view_uri, int ids[], int count) +{ + int ret = CONTACTS_ERROR_NONE; + int index; + + ret = ctsvc_begin_trans(); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_server_db_begin_trans is failed(%d)", ret); + + index = 0; + do { + ret = contacts_db_delete_record(view_uri, ids[index++]); + if( ret != CONTACTS_ERROR_NONE ) { + CTS_ERR("contacts_db_delete_record is faild(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + }while(index < count); + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + + + return CONTACTS_ERROR_NONE; +} + +#ifdef _CONTACTS_NATIVE +static gboolean __ctsvc_db_delete_idler(void *data) +{ + int ret; + ctsvc_bulk_info_s *info = data; + contacts_db_result_cb cb; + + ret = __ctsvc_db_delete_records(info->view_uri, info->ids, info->count); + + if (info->cb) { + cb = info->cb; + cb(ret, info->user_data); + } + free(info->ids); + free(info); + return false; +} +#endif + +static int __ctsvc_db_update_records( contacts_list_h list) +{ + int ret = CONTACTS_ERROR_NONE; + unsigned int count; + contacts_record_h record; + + ret = contacts_list_get_count(list, &count); + RETVM_IF(ret != CONTACTS_ERROR_NONE, ret, "contacts_list_get_count is falied(%d)", ret); + RETVM_IF(count <= 0, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : count is 0"); + + ret = ctsvc_begin_trans(); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_server_db_begin_trans is failed(%d)", ret); + + contacts_list_first(list); + do { + ret = contacts_list_get_current_record_p(list, &record); + if( CONTACTS_ERROR_NONE != ret) { + CTS_ERR("contacts_list_get_current_record_p is faild(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = contacts_db_update_record(record); + if( ret != CONTACTS_ERROR_NONE ) { + CTS_ERR("contacts_db_update_record is faild(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(list)); + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + + + return CONTACTS_ERROR_NONE; +} + +#ifdef _CONTACTS_NATIVE +static gboolean __ctsvc_db_update_idler(void *data) +{ + int ret; + ctsvc_bulk_info_s *info = data; + contacts_db_result_cb cb; + + ret = __ctsvc_db_update_records(info->list); + + if (info->cb) { + cb = info->cb; + cb(ret, info->user_data); + } + contacts_list_destroy(info->list, true); + free(info); + return false; +} +#endif + +static int __ctsvc_db_get_count_exec(const char *view_uri, const property_info_s* properties, int ids_count, + const char *projection, int *out_count ) +{ + char query[CTS_SQL_MAX_LEN] = {0}; + const char *table; + int len; + int ret; + + ret = ctsvc_db_get_table_name(view_uri, &table); + RETVM_IF (CONTACTS_ERROR_NONE != ret, ret, "Invalid parameter : view uri (%s)", view_uri); + + len = snprintf(query, sizeof(query), "SELECT COUNT(*) FROM (SELECT %s FROM %s)", projection, table); + + ret = ctsvc_query_get_first_int_result(query, out_count); + + return ret; +} + +static int __ctsvc_db_get_count( const char* view_uri, int *out_count) +{ + int ret; + unsigned int count; + char *projection; + + const property_info_s *p = ctsvc_view_get_all_property_infos(view_uri, &count); + ret = __ctsvc_db_create_projection(p, count, NULL, 0, &projection); + RETVM_IF (CONTACTS_ERROR_NONE != ret, ret, "__ctsvc_db_create_projection is failed(%s)", ret); + + __ctsvc_db_get_count_exec(view_uri, p, count, projection, out_count); + free(projection); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_get_count_with_query_exec(ctsvc_query_s *s_query, const char *projection, + const char *condition, GSList *bind_text, int *out_count ) +{ + char query[CTS_SQL_MAX_LEN] = {0}; + int len; + int ret; + const char *table; + + RETV_IF(NULL == projection || '\0' == *projection, CONTACTS_ERROR_INVALID_PARAMETER); + + ret = ctsvc_db_get_table_name(s_query->view_uri, &table); + RETVM_IF (CONTACTS_ERROR_NONE != ret, ret, "Invalid parameter : view uri (%s)", s_query->view_uri); + + if (s_query->distinct) + len = snprintf(query, sizeof(query), "SELECT COUNT(*) FROM (SELECT DISTINCT %s FROM %s", projection, table); + else + len = snprintf(query, sizeof(query), "SELECT COUNT(*) FROM (SELECT %s FROM %s", projection, table); + + if (condition && *condition) + len += snprintf(query+len, sizeof(query)-len, " WHERE %s)", condition); + else + len += snprintf(query+len, sizeof(query)-len, ")"); + + if (bind_text) { + cts_stmt stmt; + GSList *cursor; + int i; + stmt = cts_query_prepare(query); + if(NULL == stmt) { + CTS_ERR("DB error : cts_query_prepare() Failed"); + return CONTACTS_ERROR_DB; + } + + for (cursor=bind_text, i=1; cursor;cursor=cursor->next, i++) + cts_stmt_bind_copy_text(stmt, i, cursor->data, strlen(cursor->data)); + ret = ctsvc_stmt_get_first_int_result(stmt, out_count); + } + else + ret = ctsvc_query_get_first_int_result(query, out_count); + return ret; +} + +static int __ctsvc_db_get_count_with_query( contacts_query_h query, int *out_count) +{ + int ret; + char *condition = NULL; + char *projection; + ctsvc_query_s *query_s; + GSList *bind_text = NULL; + GSList *cursor; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + query_s = (ctsvc_query_s *)query; + + if (query_s->filter) { + ret = __ctsvc_db_create_composite_condition(query_s->filter, &condition, &bind_text); + RETVM_IF (CONTACTS_ERROR_NONE != ret, ret, "__ctsvc_db_create_composite_condition is failed(%s)", ret); + } + + ret = __ctsvc_db_create_projection(query_s->properties, query_s->property_count, + query_s->projection, query_s->projection_count, &projection); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("__ctsvc_db_create_projection is failed(%s)", ret); + for (cursor=bind_text;cursor;cursor=cursor->next) + free(cursor->data); + g_slist_free(bind_text); + return ret; + } + + ret = __ctsvc_db_get_count_with_query_exec(query_s, projection, condition, bind_text, out_count); + for (cursor=bind_text;cursor;cursor=cursor->next) + free(cursor->data); + g_slist_free(bind_text); + + free(condition); + free(projection); + + return ret; +} + +API int contacts_db_get_records_with_query( contacts_query_h query, int offset, int limit, + contacts_list_h* out_list ) +{ + int ret = CONTACTS_ERROR_NONE; + ctsvc_db_plugin_info_s* plugin_info = NULL; + ctsvc_query_s *s_query; + + RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER); + *out_list = NULL; + + RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER); + s_query = (ctsvc_query_s*)query; + + if (( plugin_info = ctsvc_db_get_plugin_info(ctsvc_view_get_record_type(s_query->view_uri)))){ + if( plugin_info->get_records_with_query ) { + ret = plugin_info->get_records_with_query( query, offset, limit, out_list ); + return ret; + } + } + + return __ctsvc_db_get_records_with_query_exec(s_query, offset, limit, out_list); +} + + +static int __ctsvc_db_update_info_create_record_from_stmt(const char *view_uri, + cts_stmt stmt, int version, contacts_record_h* record) +{ + int ret = contacts_record_create(view_uri, record); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret); + + ctsvc_updated_info_s *update_info = (ctsvc_updated_info_s *)*record; + + update_info->changed_type = ctsvc_stmt_get_int(stmt, 0); + update_info->id = ctsvc_stmt_get_int(stmt, 1); + update_info->changed_ver = ctsvc_stmt_get_int(stmt, 2); + + if (ctsvc_stmt_get_int(stmt, 3) == update_info->changed_ver || version < ctsvc_stmt_get_int(stmt, 3)) + update_info->changed_type = CONTACTS_CHANGE_INSERTED; + + update_info->addressbook_id = ctsvc_stmt_get_int(stmt, 4); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_get_group_relations_changes(const char* view_uri, int addressbook_id, + int version, contacts_list_h* out_list, int* out_current_version) +{ + int len; + int ret; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_list_h list; + cts_stmt stmt; + + len = snprintf(query, sizeof(query), + "SELECT %d, group_id, contact_id, addressbook_id, ver " + "FROM "CTS_TABLE_GROUP_RELATIONS", "CTS_TABLE_GROUPS" USING (group_id) " + "WHERE ver > %d AND deleted = 0 ", CONTACTS_CHANGE_INSERTED, version); + if (0 <= addressbook_id) { + len += snprintf(query + len , sizeof(query) - len , + "AND addressbook_id = %d ", addressbook_id); + } + + len += snprintf(query + len, sizeof(query) - len, + "UNION SELECT %d, group_id, contact_id, addressbook_id, ver " + "FROM "CTS_TABLE_GROUP_RELATIONS", "CTS_TABLE_GROUPS" USING (group_id) " + "WHERE ver > %d AND deleted = 1 ", CONTACTS_CHANGE_DELETED, version); + if (0 <= addressbook_id) { + len += snprintf(query + len , sizeof(query) - len , + "AND addressbook_id = %d ", addressbook_id); + } + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + ret = contacts_record_create(view_uri, &record); + ctsvc_record_set_int(record, _contacts_grouprel_updated_info.type, ctsvc_stmt_get_int(stmt, 0)); + ctsvc_record_set_int(record, _contacts_grouprel_updated_info.group_id, ctsvc_stmt_get_int(stmt, 1)); + ctsvc_record_set_int(record, _contacts_grouprel_updated_info.contact_id, ctsvc_stmt_get_int(stmt, 2)); + ctsvc_record_set_int(record, _contacts_grouprel_updated_info.address_book_id, ctsvc_stmt_get_int(stmt, 3)); + ctsvc_record_set_int(record, _contacts_grouprel_updated_info.version, ctsvc_stmt_get_int(stmt, 4)); + + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + snprintf(query, sizeof(query), "SELECT ver FROM "CTS_TABLE_VERSION); + ret = ctsvc_query_get_first_int_result(query, out_current_version); + + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_db_get_group_member_changes(const char* view_uri, int addressbook_id, + int version, contacts_list_h* out_list, int* out_current_version) +{ + int len; + int ret; + char query[CTS_SQL_MAX_LEN] = {0}; + contacts_list_h list; + cts_stmt stmt; + + len = snprintf(query, sizeof(query), + "SELECT group_id, version, addressbook_id " + "FROM "CTSVC_DB_VIEW_GROUPS_MEMBER_UPDATED_INFO" WHERE version > %d", version); + + if (0 <= addressbook_id) + len += snprintf(query+len, sizeof(query)-len, " AND addressbook_id = %d ", addressbook_id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + contacts_list_create(&list); + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + ret = contacts_record_create(view_uri, &record); + ctsvc_record_set_int(record, _contacts_group_member_updated_info.group_id, ctsvc_stmt_get_int(stmt, 0)); + ctsvc_record_set_int(record, _contacts_group_member_updated_info.version, ctsvc_stmt_get_int(stmt, 1)); + ctsvc_record_set_int(record, _contacts_group_member_updated_info.address_book_id, ctsvc_stmt_get_int(stmt, 2)); + + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = list; + snprintf(query, sizeof(query), "SELECT ver FROM "CTS_TABLE_VERSION); + ret = ctsvc_query_get_first_int_result(query, out_current_version); + + return CONTACTS_ERROR_NONE; +} + +API int contacts_db_get_changes_by_version( const char* view_uri, int addressbook_id, + int version, contacts_list_h* out_list, int* out_current_version ) +{ + int ret; + RETV_IF(version < 0, CONTACTS_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER); + *out_list = NULL; + RETV_IF(NULL == out_current_version, CONTACTS_ERROR_INVALID_PARAMETER); + *out_current_version = 0; + + char query[CTS_SQL_MAX_LEN] = {0}; + if (0 == strcmp(view_uri, _contacts_contact_updated_info._uri)) + { + if (0 <= addressbook_id) + { + snprintf(query, sizeof(query), + "SELECT %d, contact_id, changed_ver, created_ver, addressbook_id FROM %s " + "WHERE changed_ver > %d AND addressbook_id = %d AND deleted = 0 " + "UNION " + "SELECT %d, contact_id, deleted_ver, -1, addressbook_id FROM %s " + "WHERE deleted_ver > %d AND addressbook_id = %d " + "UNION " + "SELECT %d, contact_id, changed_ver, -1, addressbook_id FROM %s " + "WHERE changed_ver > %d AND addressbook_id = %d AND deleted = 1", + CONTACTS_CHANGE_UPDATED, CTS_TABLE_CONTACTS, version, addressbook_id, + CONTACTS_CHANGE_DELETED, CTS_TABLE_DELETEDS, version, addressbook_id, + CONTACTS_CHANGE_DELETED, CTS_TABLE_CONTACTS, version, addressbook_id); + } + else { + snprintf(query, sizeof(query), + "SELECT %d, contact_id, changed_ver, created_ver, addressbook_id FROM %s " + "WHERE changed_ver > %d AND deleted = 0 " + "UNION " + "SELECT %d, contact_id, deleted_ver, -1, addressbook_id FROM %s " + "WHERE deleted_ver > %d " + "UNION " + "SELECT %d, contact_id, changed_ver, -1, addressbook_id FROM %s " + "WHERE changed_ver > %d AND deleted = 1", + CONTACTS_CHANGE_UPDATED, CTS_TABLE_CONTACTS, version, + CONTACTS_CHANGE_DELETED, CTS_TABLE_DELETEDS, version, + CONTACTS_CHANGE_DELETED, CTS_TABLE_CONTACTS, version); + } + } + else if(0 == strcmp(view_uri, _contacts_group_updated_info._uri)) + { + if (0 <= addressbook_id) + { + snprintf(query, sizeof(query), + "SELECT %d, group_id, changed_ver, created_ver, addressbook_id FROM %s " + "WHERE changed_ver > %d AND addressbook_id = %d " + "UNION " + "SELECT %d, group_id, deleted_ver, -1, addressbook_id FROM %s " + "WHERE deleted_ver > %d AND addressbook_id = %d", + CONTACTS_CHANGE_UPDATED, CTS_TABLE_GROUPS, version, addressbook_id, + CONTACTS_CHANGE_DELETED, CTS_TABLE_GROUP_DELETEDS, version, addressbook_id); + } + else { + snprintf(query, sizeof(query), + "SELECT %d, group_id, changed_ver, created_ver, addressbook_id FROM %s " + "WHERE changed_ver > %d " + "UNION " + "SELECT %d, group_id, deleted_ver, -1, addressbook_id FROM %s " + "WHERE deleted_ver > %d ", + CONTACTS_CHANGE_UPDATED, CTS_TABLE_GROUPS, version, + CONTACTS_CHANGE_DELETED, CTS_TABLE_GROUP_DELETEDS, version); + } + } + else if(0 == strcmp(view_uri, _contacts_group_member_updated_info._uri)) { + ret = __ctsvc_db_get_group_member_changes(view_uri, addressbook_id, + version, out_list, out_current_version); + return ret; + } + else if(0 == strcmp(view_uri, _contacts_grouprel_updated_info._uri)) { + ret = __ctsvc_db_get_group_relations_changes(view_uri, addressbook_id, + version, out_list, out_current_version); + return ret; + } +/* + else if(0 == strcmp(view_uri, CTSVC_VIEW_URI_PERSON_UPDATED_INFO)) + { + + } +*/ + else + { + CTS_ERR("Invalid parameter : this API does not support uri(%s)", view_uri); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + cts_stmt stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed"); + + contacts_list_h list; + contacts_list_create(&list); + + while ((ret = cts_stmt_step(stmt))) { + contacts_record_h record; + if (1 != ret) { + CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return ret; + } + + ret = __ctsvc_db_update_info_create_record_from_stmt(view_uri, stmt, version, &record); + if( ret != CONTACTS_ERROR_NONE ) + { + CTS_ERR("DB error : __ctsvc_db_update_info_create_record_from_stmt() Failed(%d)", ret); + cts_stmt_finalize(stmt); + contacts_list_destroy(list, true); + return CONTACTS_ERROR_DB; + } + + ctsvc_list_prepend(list, record); + } + cts_stmt_finalize(stmt); + ctsvc_list_reverse(list); + + *out_list = (contacts_list_h)list; + + // why should be return with current_version ?? + const char *version_query = "SELECT ver FROM "CTS_TABLE_VERSION; + ret = ctsvc_query_get_first_int_result(version_query, out_current_version); + + return CONTACTS_ERROR_NONE; +} + +API int contacts_db_get_current_version( int* out_current_version ) +{ + RETVM_IF(NULL == out_current_version, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + + return ctsvc_get_current_version(out_current_version); +} + +API int contacts_db_search_records(const char* view_uri, const char *keyword, + int offset, int limit, contacts_list_h* out_list) +{ + RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER); + *out_list = NULL; + RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + + return __ctsvc_db_search_records(view_uri, keyword, offset, limit, out_list); +} + +API int contacts_db_search_records_with_query( contacts_query_h query, const char *keyword, + int offset, int limit, contacts_list_h* out_list) +{ + RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER); + *out_list = NULL; + RETVM_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + + return __ctsvc_db_search_records_with_query(query, keyword, offset, limit, out_list); +} + +API int contacts_db_get_count( const char* view_uri, int *out_count) +{ + int ret; + ctsvc_db_plugin_info_s* plugin_info = NULL; + + RETV_IF(NULL == out_count, CONTACTS_ERROR_INVALID_PARAMETER); + *out_count = 0; + RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + + if (( plugin_info = ctsvc_db_get_plugin_info(ctsvc_view_get_record_type(view_uri)))){ + if( plugin_info->get_count ) { + ret = plugin_info->get_count(out_count); + return ret; + } + } + + return __ctsvc_db_get_count( view_uri, out_count ); +} + +API int contacts_db_get_count_with_query( contacts_query_h query, int *out_count) +{ + int ret = CONTACTS_ERROR_NONE; + ctsvc_record_type_e type = CTSVC_RECORD_INVALID; + ctsvc_db_plugin_info_s* plugin_info = NULL; + ctsvc_query_s *s_query; + + RETV_IF(NULL == out_count, CONTACTS_ERROR_INVALID_PARAMETER); + *out_count = 0; + + RETVM_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + s_query = (ctsvc_query_s*)query; + + type = ctsvc_view_get_record_type(s_query->view_uri); + plugin_info = ctsvc_db_get_plugin_info(type); + + if (plugin_info){ + if(plugin_info->get_count_with_query ) { + ret = plugin_info->get_count_with_query( query, out_count ); + return ret; + } + } + + return __ctsvc_db_get_count_with_query( query, out_count ); +} + +API int contacts_db_insert_record(contacts_record_h record, int *id ) +{ + ctsvc_db_plugin_info_s* plugin_info = NULL; + + if (id) + *id = 0; + + RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + + plugin_info = ctsvc_db_get_plugin_info(((ctsvc_record_s*)record)->r_type); + RETVM_IF(NULL == plugin_info, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter"); + RETVM_IF(NULL == plugin_info->insert_record, CONTACTS_ERROR_INVALID_PARAMETER, "Not permitted"); + + return plugin_info->insert_record(record, id); +} + +API int contacts_db_update_record(contacts_record_h record) +{ + ctsvc_db_plugin_info_s* plugin_info = NULL; + + RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + + plugin_info = ctsvc_db_get_plugin_info(((ctsvc_record_s*)record)->r_type); + RETVM_IF(NULL == plugin_info, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter"); + RETVM_IF(NULL == plugin_info->update_record, CONTACTS_ERROR_INVALID_PARAMETER, "Not permitted"); + + return plugin_info->update_record(record); +} + +API int contacts_db_delete_record(const char* view_uri, int id) +{ + ctsvc_record_type_e type = CTSVC_RECORD_INVALID; + ctsvc_db_plugin_info_s* plugin_info = NULL; + + RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + + type = ctsvc_view_get_record_type(view_uri); + plugin_info = ctsvc_db_get_plugin_info(type); + RETVM_IF(NULL == plugin_info, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter"); + RETVM_IF(NULL == plugin_info->delete_record, CONTACTS_ERROR_INVALID_PARAMETER, "Not permitted"); + + return plugin_info->delete_record(id); +} + +API int contacts_db_get_record(const char* view_uri, int id, contacts_record_h* out_record ) +{ + ctsvc_record_type_e type = CTSVC_RECORD_INVALID; + ctsvc_db_plugin_info_s* plugin_info = NULL; + + RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER); + *out_record = NULL; + RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + + type = ctsvc_view_get_record_type(view_uri); + plugin_info = ctsvc_db_get_plugin_info(type); + + RETVM_IF(NULL == plugin_info, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter"); + RETVM_IF(NULL == plugin_info->get_record, CONTACTS_ERROR_INVALID_PARAMETER, "Not permitted"); + + return plugin_info->get_record(id, out_record); +} + +API int contacts_db_replace_record( contacts_record_h record, int id ) +{ + ctsvc_db_plugin_info_s* plugin_info = NULL; + + RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter : record is NULL"); + + plugin_info = ctsvc_db_get_plugin_info(((ctsvc_record_s*)record)->r_type); + RETVM_IF(NULL == plugin_info, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter"); + RETVM_IF(NULL == plugin_info->replace_record, CONTACTS_ERROR_INVALID_PARAMETER, "Not permitted"); + + return plugin_info->replace_record(record, id); +} + +API int contacts_db_get_all_records(const char* view_uri, int offset, int limit, contacts_list_h* out_list ) +{ + int ret = CONTACTS_ERROR_NONE; + ctsvc_record_type_e type = CTSVC_RECORD_INVALID; + ctsvc_db_plugin_info_s* plugin_info = NULL; + + RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER); + *out_list = NULL; + RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + + type = ctsvc_view_get_record_type(view_uri); + plugin_info = ctsvc_db_get_plugin_info(type); + + if (plugin_info){ + if( plugin_info->get_all_records ) { + ret = plugin_info->get_all_records(offset, limit, out_list); + return ret; + } + } + + return __ctsvc_db_get_all_records( view_uri, offset, limit, out_list ); +} + +int ctsvc_db_insert_records(contacts_list_h list, int **ids, unsigned int *count) +{ + int ret = CONTACTS_ERROR_NONE; + ctsvc_db_plugin_info_s* plugin_info = NULL; + + RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + + if (count) + contacts_list_get_count(list, count); + if (( plugin_info = ctsvc_db_get_plugin_info(((ctsvc_list_s*)list)->l_type))){ + if( plugin_info->insert_records ) { + ret = plugin_info->insert_records( list, ids ); + return ret; + } + } + + return __ctsvc_db_insert_records(list, ids); +} + +API int contacts_db_insert_records_async( contacts_list_h list, + contacts_db_insert_result_cb callback, void *user_data) +{ + RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + +#ifdef _CONTACTS_NATIVE + if (callback) { + ctsvc_bulk_info_s *info; + info = (ctsvc_bulk_info_s *)calloc(1, sizeof(ctsvc_bulk_info_s)); + ctsvc_list_clone(list, &info->list); + info->cb = callback; + info->user_data = user_data; + g_idle_add(__ctsvc_db_insert_idler, info); // should be changed after ipc implementation + return CONTACTS_ERROR_NONE; + } +#endif + return ctsvc_db_insert_records(list, NULL, NULL); +} + +int ctsvc_db_update_records(contacts_list_h list) +{ + int ret = CONTACTS_ERROR_NONE; + ctsvc_db_plugin_info_s* plugin_info = NULL; + + RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + + if (( plugin_info = ctsvc_db_get_plugin_info(((ctsvc_list_s*)list)->l_type))){ + if( plugin_info->update_records ) { + ret = plugin_info->update_records( list ); + return ret; + } + } + + return __ctsvc_db_update_records(list); +} + +API int contacts_db_update_records_async( contacts_list_h list, + contacts_db_result_cb callback, void *user_data) +{ + RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + +#ifdef _CONTACTS_NATIVE + if (callback) { + ctsvc_bulk_info_s *info; + info = (ctsvc_bulk_info_s *)calloc(1, sizeof(ctsvc_bulk_info_s)); + ctsvc_list_clone(list, &info->list); + info->cb = callback; + info->user_data = user_data; + g_idle_add(__ctsvc_db_update_idler, info); // should be changed after ipc implementation + return CONTACTS_ERROR_NONE; + } +#endif + return ctsvc_db_update_records(list); +} + +int ctsvc_db_delete_records(const char* view_uri, int* ids, int count) +{ + int ret = CONTACTS_ERROR_NONE; + ctsvc_db_plugin_info_s* plugin_info = NULL; + + RETV_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER); + + if (( plugin_info = ctsvc_db_get_plugin_info(ctsvc_view_get_record_type(view_uri)))){ + if( plugin_info->delete_records ) { + ret = plugin_info->delete_records( ids, count ); + return ret; + } + } + + return __ctsvc_db_delete_records(view_uri, ids, count); +} + +API int contacts_db_delete_records_async( const char* view_uri, int* ids, int count, + contacts_db_result_cb callback, void *user_data) +{ + RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + +#ifdef _CONTACTS_NATIVE + if (callback) { + ctsvc_bulk_info_s *info; + info = (ctsvc_bulk_info_s *)calloc(1, sizeof(ctsvc_bulk_info_s)); + info->ids = calloc(count, sizeof(int)); + memcpy(info->ids, ids, sizeof(int)*count); + info->view_uri = view_uri; + info->count = count; + info->cb = callback; + info->user_data = user_data; + g_idle_add(__ctsvc_db_delete_idler, info); // should be changed after ipc implementation + return CONTACTS_ERROR_NONE; + } +#endif + return ctsvc_db_delete_records(view_uri, ids, count); +} + +static int __ctsvc_db_replace_records( contacts_list_h list, int ids[], int count) +{ + int ret = CONTACTS_ERROR_NONE; + unsigned int record_count; + contacts_record_h record; + int i; + + ret = contacts_list_get_count(list, &record_count); + RETVM_IF(ret != CONTACTS_ERROR_NONE, ret, "contacts_list_get_count is falied(%d)", ret); + RETVM_IF(record_count <= 0, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : count is 0"); + RETVM_IF(record_count != count, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : list count and ids count are not matched"); + + ret = ctsvc_begin_trans(); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_server_db_begin_trans is failed(%d)", ret); + + contacts_list_first(list); + i = 0; + do { + ret = contacts_list_get_current_record_p(list, &record); + if( CONTACTS_ERROR_NONE != ret) { + CTS_ERR("contacts_list_get_current_record_p is faild(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = contacts_db_replace_record(record, ids[i++]); + if( ret != CONTACTS_ERROR_NONE ) { + CTS_ERR("contacts_db_replace_record is faild(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + }while(CONTACTS_ERROR_NONE == contacts_list_next(list)); + + ret = ctsvc_end_trans(true); + + return ret; +} + + +#ifdef _CONTACTS_NATIVE +static gboolean __ctsvc_db_replace_idler(void *data) +{ + int ret; + ctsvc_bulk_info_s *info = data; + contacts_db_result_cb cb; + + ret = __ctsvc_db_replace_records(info->list, info->ids, info->count); + + if (info->cb) { + cb = info->cb; + cb(ret, info->user_data); + } + contacts_list_destroy(info->list, true); + free(info->ids); + free(info); + return false; +} +#endif + +int ctsvc_db_replace_records(contacts_list_h list, int ids[], unsigned int count) +{ + int ret = CONTACTS_ERROR_NONE; + ctsvc_db_plugin_info_s* plugin_info = NULL; + + RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + + if (( plugin_info = ctsvc_db_get_plugin_info(((ctsvc_list_s*)list)->l_type))){ + if( plugin_info->replace_records ) { + ret = plugin_info->replace_records( list, ids, count ); + return ret; + } + } + + return __ctsvc_db_replace_records(list, ids, count); +} + +API int contacts_db_replace_records_async( contacts_list_h list, int ids[], unsigned int count, + contacts_db_result_cb callback, void *user_data ) +{ + RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter"); + +#ifdef _CONTACTS_NATIVE + if (callback) { + ctsvc_bulk_info_s *info; + info = (ctsvc_bulk_info_s *)calloc(1, sizeof(ctsvc_bulk_info_s)); + ctsvc_list_clone(list, &info->list); + info->ids = calloc(count, sizeof(int)); + memcpy(info->ids, ids, sizeof(int)*count); + info->count = count; + info->cb = callback; + info->user_data = user_data; + g_idle_add(__ctsvc_db_replace_idler, info); // should be changed after ipc implementation + return CONTACTS_ERROR_NONE; + } +#endif + return ctsvc_db_replace_records(list, ids, count); +} + +API int contacts_db_insert_records( contacts_list_h record_list, int **ids, unsigned int *count) +{ + return ctsvc_db_insert_records(record_list, ids, count); +} + +API int contacts_db_update_records( contacts_list_h record_list) +{ + return ctsvc_db_update_records(record_list); +} + +API int contacts_db_delete_records(const char* view_uri, int record_id_array[], int count) +{ + return ctsvc_db_delete_records(view_uri, record_id_array, count); +} + +API int contacts_db_replace_records( contacts_list_h list, int record_id_array[], unsigned int count ) +{ + return ctsvc_db_replace_records(list, record_id_array, count); +} + diff --git a/native/ctsvc_db_query.h b/native/ctsvc_db_query.h new file mode 100644 index 0000000..b8031ae --- /dev/null +++ b/native/ctsvc_db_query.h @@ -0,0 +1,38 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_DB_QUERY_H__ +#define __TIZEN_SOCIAL_CTSVC_DB_QUERY_H__ + +#include "ctsvc_struct.h" +#include "ctsvc_sqlite.h" + +int ctsvc_db_insert_records(contacts_list_h list, int **ids, unsigned int *count); +int ctsvc_db_update_records(contacts_list_h list); +int ctsvc_db_delete_records(const char* view_uri, int *ids, int count); +int ctsvc_db_replace_records(contacts_list_h list, int ids[], unsigned int count); + +int ctsvc_db_make_get_records_query_stmt(ctsvc_query_s *s_query, int offset, int limit, cts_stmt *stmt); + +#endif /* __TIZEN_SOCIAL_CTSVC_DB_QUERY_H__ */ + diff --git a/native/ctsvc_group.c b/native/ctsvc_group.c new file mode 100644 index 0000000..c7f33a4 --- /dev/null +++ b/native/ctsvc_group.c @@ -0,0 +1,223 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_group.h" +#include "ctsvc_notification.h" + +int ctsvc_group_add_contact_in_transaction(int group_id, int contact_id) +{ + int ret; + int version; + cts_stmt stmt = NULL; + char query[CTS_SQL_MIN_LEN] = {0}; + int rel_changed = 0; + int grp_acc, contact_acc; + int exist; + + snprintf(query, sizeof(query), + "SELECT COUNT(*) FROM %s WHERE group_id = %d AND contact_id=%d AND deleted = 0", + CTS_TABLE_GROUP_RELATIONS, group_id, contact_id); + + ret = ctsvc_query_get_first_int_result(query, &exist); + if (1 == exist) { + CTS_DBG("group relation already exist (group_id:%d, contac_id:%d)", group_id, contact_id); + return CONTACTS_ERROR_NONE; + } + + version = ctsvc_get_next_ver(); + snprintf(query, sizeof(query), + "SELECT addressbook_id FROM %s WHERE group_id = %d", + CTS_TABLE_GROUPS, group_id); + + ret = ctsvc_query_get_first_int_result(query, &grp_acc); + RETVM_IF(CONTACTS_ERROR_NO_DATA == grp_acc, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid Parameter: group_id(%d) is Invalid", group_id); + + snprintf(query, sizeof(query), + "SELECT addressbook_id FROM %s WHERE contact_id = %d AND deleted = 0", + CTS_TABLE_CONTACTS, contact_id); + + ret = ctsvc_query_get_first_int_result(query, &contact_acc); + RETVM_IF( contact_acc != grp_acc, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid Parameter: group_acc(%d) is differ from contact_acc(%d) Invalid", grp_acc, contact_acc); + + snprintf(query, sizeof(query), "INSERT OR REPLACE INTO %s VALUES(%d, %d, %d, 0)", + CTS_TABLE_GROUP_RELATIONS, group_id, contact_id, version); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + WARN_IF(CONTACTS_ERROR_NONE != ret, "cts_stmt_step() Failed(%d)", ret); + + rel_changed = cts_db_change(); + cts_stmt_finalize(stmt); + + if (0 < rel_changed) { + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_GROUPS" SET member_changed_ver=%d WHERE group_id=%d", + version, group_id); + ret = ctsvc_query_exec(query); + RETVM_IF(ret != CONTACTS_ERROR_NONE, ret, "ctsvc_query_exec() Failed(%d)", ret); + ctsvc_set_group_rel_noti(); + return rel_changed; + } + + return ret; +} + +API int contacts_group_add_contact(int group_id, int contact_id) +{ + RETVM_IF( group_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid Parameter: group_id should be greater than 0"); + RETVM_IF( contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid Parameter: contact_id should be greater than 0"); + + /* BEGIN_TRANSACTION */ + int ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); + + /* DOING JOB */ + do { + int changed = ctsvc_group_add_contact_in_transaction(group_id, contact_id); + if (changed < CONTACTS_ERROR_NONE) { + CTS_ERR("DB error : ctsvc_group_add_contact_in_transaction() Failed(%d)", changed); + ret = changed; + break; + } + + ret = ctsvc_db_contact_update_changed_time(contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret); + ret = CONTACTS_ERROR_DB; + break; + } + + ctsvc_set_contact_noti(); + + ret = ctsvc_end_trans(true); + if(ret < CONTACTS_ERROR_NONE ) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + + return CONTACTS_ERROR_NONE; + + } while(0); + + /* ROLLBACK TRANSACTION */ + ctsvc_end_trans(false); + + return ret; +} + +int ctsvc_group_remove_contact_in_transaction(int group_id, int contact_id) +{ + int ret; + int version; + cts_stmt stmt = NULL; + char query[CTS_SQL_MIN_LEN] = {0}; + + version = ctsvc_get_next_ver(); + snprintf(query, sizeof(query), + "UPDATE %s SET deleted=1, ver = %d WHERE group_id = %d AND contact_id = %d", + CTS_TABLE_GROUP_RELATIONS, version, group_id, contact_id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB Error: cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + WARN_IF(CONTACTS_ERROR_NONE != ret, "DB Error: cts_stmt_step() Failed(%d)", ret); + + int rel_changed = cts_db_change(); + cts_stmt_finalize(stmt); + + if (0 <= rel_changed) { + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_GROUPS" SET member_changed_ver=%d WHERE group_id=%d", + version, group_id); + ret = ctsvc_query_exec(query); + RETVM_IF(ret != CONTACTS_ERROR_NONE, ret, "ctsvc_query_exec() Failed(%d)", ret); + ctsvc_set_group_rel_noti(); + return rel_changed; + } + + return CONTACTS_ERROR_NONE; +} + +API int contacts_group_remove_contact(int group_id, int contact_id) +{ + RETVM_IF( group_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid Parameter: group_id should be greater than 0"); + RETVM_IF( contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid Parameter: contact_id should be greater than 0"); + + /* BEGIN_TRANSACTION */ + int ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); + + /* DOING JOB */ + do { + int changed = ctsvc_group_remove_contact_in_transaction(group_id, contact_id); + if (changed < CONTACTS_ERROR_NONE) { + CTS_ERR("DB error : ctsvc_group_remove_contact_in_transaction() Failed(%d)", changed); + ret = changed; + break; + } + + ret = ctsvc_db_contact_update_changed_time(contact_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret); + ret = CONTACTS_ERROR_DB; + break; + } + + ctsvc_set_contact_noti(); + + ret = ctsvc_end_trans(true); + if(ret < CONTACTS_ERROR_NONE ) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + + return CONTACTS_ERROR_NONE; + + } while(0); + + /* ROLLBACK TRANSACTION */ + ctsvc_end_trans(false); + + return ret; +} + +/* +API int contacts_group_add_person(int group_id, int person_id) +{ + return CONTACTS_ERROR_NONE; +} +API int contacts_group_remove_person(int group_id, int person_id) +{ + return CONTACTS_ERROR_NONE; +} +*/ + diff --git a/src/cts-vcard-file.h b/native/ctsvc_group.h old mode 100755 new mode 100644 similarity index 63% rename from src/cts-vcard-file.h rename to native/ctsvc_group.h index a82d6be..9b1bcf1 --- a/src/cts-vcard-file.h +++ b/native/ctsvc_group.h @@ -3,8 +3,6 @@ * * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. * - * Contact: Youngjae Shin - * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -18,15 +16,16 @@ * limitations under the License. * */ -#ifndef __CTS_VCARD_FILE_H__ -#define __CTS_VCARD_FILE_H__ - -#define CTS_VCARD_FILE_MAX_SIZE 1024*1024 -#define CTS_VCARD_PHOTO_MAX_SIZE 1024*100 -int cts_vcard_parse(const void *vcard_stream, CTSstruct **contact, int flags); -int cts_vcard_make(const CTSstruct *contact, char **vcard_stream, int flags); +#ifndef __CTSVC_GROUP_H__ +#define __CTSVC_GROUP_H__ -#endif //__CTS_VCARD_FILE_H__ +int ctsvc_group_add_contact_in_transaction(int group_id, int contact_id); +int ctsvc_group_remove_contact_in_transaction(int group_id, int contact_id); +/* +int ctsvc_group_add_contacts_in_person(int group_id, int person_id); +int ctsvc_group_remove_contacts_in_person(int group_id, int person_id); +*/ +#endif // __CTSVC_GROUP_H__ diff --git a/native/ctsvc_notification.c b/native/ctsvc_notification.c new file mode 100644 index 0000000..702ffa9 --- /dev/null +++ b/native/ctsvc_notification.c @@ -0,0 +1,557 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +//#include +//#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +//#include "ctsvc_utils.h" +#include "ctsvc_notify.h" +#include "ctsvc_notification.h" + +static TLS bool contact_change = false; +static TLS bool my_profile_change = false; +static TLS bool phonelog_change = false; +static TLS bool missed_change = false; +static TLS bool favor_change = false; +static TLS bool speed_change = false; +static TLS bool addressbook_change = false; +static TLS bool group_change = false; +static TLS bool group_rel_change = false; +static TLS bool person_change = false; +static TLS bool activity_change = false; +static TLS bool address_change = false; +static TLS bool data_change = false; +static TLS bool event_change = false; +static TLS bool number_change = false; +static TLS bool email_change = false; +static TLS bool messenger_change = false; +static TLS bool name_change = false; +static TLS bool note_change = false; +static TLS bool url_change = false; +static TLS bool nickname_change = false; +static TLS bool sdn_change = false; +static TLS bool relationship_change = false; +static TLS bool image_change = false; +static TLS bool profile_change = false; +static TLS bool company_change = false; + +static inline void __ctsvc_noti_publish_contact_change(void) +{ + int fd = open(CTSVC_NOTI_CONTACT_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + contact_change = false; + } +} + +static inline void __ctsvc_noti_publish_my_profile_change(void) +{ + int fd = open(CTSVC_NOTI_MY_PROFILE_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + my_profile_change = false; + } +} + +static inline void __ctsvc_noti_publish_phonelog_change(void) +{ + int fd = open(CTSVC_NOTI_PHONELOG_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + phonelog_change = false; + } +} + +static inline void __ctsvc_noti_publish_missed_call_change(void) +{ + int fd = open(CTSVC_NOTI_MISSED_CALL_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + missed_change = false; + } +} + +static inline void __ctsvc_noti_publish_favor_change(void) +{ + int fd = open(CTSVC_NOTI_FAVORITE_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + favor_change = false; + } +} + +static inline void __ctsvc_noti_publish_speed_change(void) +{ + int fd = open(CTSVC_NOTI_SPEEDDIAL_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + speed_change = false; + } +} + +static inline void __ctsvc_noti_publish_addressbook_change(void) +{ + int fd = open(CTSVC_NOTI_ADDRESSBOOK_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + addressbook_change = false; + } +} + +static inline void __ctsvc_noti_publish_group_change(void) +{ + int fd = open(CTSVC_NOTI_GROUP_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + group_change = false; + } +} + +static inline void __ctsvc_noti_publish_group_rel_change(void) +{ + int fd = open(CTSVC_NOTI_GROUP_RELATION_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + group_rel_change = false; + } +} + +static inline void __ctsvc_noti_publish_person_change(void) +{ + int fd = open(CTSVC_NOTI_PERSON_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + person_change = false; + } +} + +static inline void __ctsvc_noti_publish_simple_contact_change(void) +{ + int fd = open(CTSVC_NOTI_SIMPLE_CONTACT_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + contact_change = false; + } +} + +static inline void __ctsvc_noti_publish_name_change(void) +{ + int fd = open(CTSVC_NOTI_NAME_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + name_change = false; + } +} + +static inline void __ctsvc_noti_publish_number_change(void) +{ + int fd = open(CTSVC_NOTI_NUMBER_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + number_change = false; + } +} + +static inline void __ctsvc_noti_publish_email_change(void) +{ + int fd = open(CTSVC_NOTI_EMAIL_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + email_change = false; + } +} + +static inline void __ctsvc_noti_publish_event_change(void) +{ + int fd = open(CTSVC_NOTI_EVENT_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + event_change = false; + } +} + +static inline void __ctsvc_noti_publish_url_change(void) +{ + int fd = open(CTSVC_NOTI_URL_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + url_change = false; + } +} + +static inline void __ctsvc_noti_publish_address_change(void) +{ + int fd = open(CTSVC_NOTI_ADDRESS_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + address_change = false; + } +} + +static inline void __ctsvc_noti_publish_note_change(void) +{ + int fd = open(CTSVC_NOTI_NOTE_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + note_change = false; + } +} + +static inline void __ctsvc_noti_publish_company_change(void) +{ + int fd = open(CTSVC_NOTI_COMPANY_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + company_change = false; + } +} + +static inline void __ctsvc_noti_publish_relationship_change(void) +{ + int fd = open(CTSVC_NOTI_RELATIONSHIP_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + relationship_change = false; + } +} + +static inline void __ctsvc_noti_publish_image_change(void) +{ + int fd = open(CTSVC_NOTI_IMAGE_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + image_change = false; + } +} + +static inline void __ctsvc_noti_publish_nickname_change(void) +{ + int fd = open(CTSVC_NOTI_NICKNAME_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + nickname_change = false; + } +} + +static inline void __ctsvc_noti_publish_messenger_change(void) +{ + int fd = open(CTSVC_NOTI_MESSENGER_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + messenger_change = false; + } +} + +static inline void __ctsvc_noti_publish_data_change(void) +{ + int fd = open(CTSVC_NOTI_DATA_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + data_change = false; + } +} + +static inline void __ctsvc_noti_publish_sdn_change(void) +{ + int fd = open(CTSVC_NOTI_SDN_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + sdn_change = false; + } +} + +static inline void __ctsvc_noti_publish_profile_change(void) +{ + int fd = open(CTSVC_NOTI_PROFILE_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + profile_change = false; + } +} + +static inline void __ctsvc_noti_publish_activity_change(void) +{ + int fd = open(CTSVC_NOTI_ACTIVITY_CHANGED, O_TRUNC | O_RDWR); + if (0 <= fd) { + close(fd); + activity_change = false; + } +} + +void ctsvc_nofitication_cancel(void) +{ + contact_change = false; + my_profile_change = false; + phonelog_change = false; + missed_change = false; + favor_change = false; + speed_change = false; + addressbook_change = false; + group_change = false; + group_rel_change = false; + person_change = false; + activity_change = false; + address_change = false; + data_change = false; + event_change = false; + number_change = false; + email_change = false; + messenger_change = false; + name_change = false; + note_change = false; + url_change = false; + nickname_change = false; + sdn_change = false; + relationship_change = false; + image_change = false; + profile_change = false; + company_change = false; +} + +void ctsvc_set_contact_noti(void) +{ + contact_change = true; +} + +void ctsvc_set_my_profile_noti(void) +{ + my_profile_change = true; +} + +void ctsvc_set_phonelog_noti(void) +{ + phonelog_change = true; +} + +void ctsvc_set_missed_call_noti(void) +{ + missed_change = true; +} + +void ctsvc_set_favor_noti(void) +{ + favor_change = true; +} + +void ctsvc_set_speed_noti(void) +{ + speed_change = true; +} + +void ctsvc_set_addressbook_noti(void) +{ + addressbook_change = true; +} + +void ctsvc_set_group_noti(void) +{ + group_change = true; +} + +void ctsvc_set_group_rel_noti(void) +{ + group_rel_change = true; +} + +void ctsvc_set_person_noti(void) +{ + person_change = true; +} + +void ctsvc_set_activity_noti(void) +{ + activity_change = true; +} + +void ctsvc_set_address_noti(void) +{ + address_change = true; +} + +void ctsvc_set_data_noti(void) +{ + data_change = true; +} + +void ctsvc_set_event_noti(void) +{ + event_change = true; +} + +void ctsvc_set_number_noti(void) +{ + number_change = true; +} + +void ctsvc_set_email_noti(void) +{ + email_change = true; +} + +void ctsvc_set_messenger_noti(void) +{ + messenger_change = true; +} + +void ctsvc_set_nickname_noti(void) +{ + nickname_change = true; +} + +void ctsvc_set_name_noti(void) +{ + name_change = true; +} + +void ctsvc_set_note_noti(void) +{ + note_change = true; +} + +void ctsvc_set_url_noti(void) +{ + url_change = true; +} + +void ctsvc_set_sdn_noti(void) +{ + sdn_change = true; +} + +void ctsvc_set_relationship_noti(void) +{ + relationship_change = true; +} + +void ctsvc_set_image_noti(void) +{ + image_change = true; +} + +void ctsvc_set_profile_noti(void) +{ + profile_change = true; +} + +void ctsvc_set_company_noti(void) +{ + company_change = true; +} + +void ctsvc_notification_send() +{ + if (contact_change) __ctsvc_noti_publish_contact_change(); + if (my_profile_change) __ctsvc_noti_publish_my_profile_change(); + if (phonelog_change) __ctsvc_noti_publish_phonelog_change(); + if (missed_change) __ctsvc_noti_publish_missed_call_change(); + if (favor_change) __ctsvc_noti_publish_favor_change(); + if (speed_change) __ctsvc_noti_publish_speed_change(); + if (addressbook_change) __ctsvc_noti_publish_addressbook_change(); + if (group_change) __ctsvc_noti_publish_group_change(); + if (group_rel_change) __ctsvc_noti_publish_group_rel_change(); + if (person_change) __ctsvc_noti_publish_person_change(); + if (activity_change) __ctsvc_noti_publish_activity_change(); + if (address_change) __ctsvc_noti_publish_address_change(); + if (data_change) __ctsvc_noti_publish_data_change(); + if (company_change) __ctsvc_noti_publish_company_change(); + if (event_change) __ctsvc_noti_publish_event_change(); + if (number_change) __ctsvc_noti_publish_number_change(); + if (email_change) __ctsvc_noti_publish_email_change(); + if (messenger_change) __ctsvc_noti_publish_messenger_change(); + if (name_change) __ctsvc_noti_publish_name_change(); + if (note_change) __ctsvc_noti_publish_note_change(); + if (url_change) __ctsvc_noti_publish_url_change(); + if (nickname_change) __ctsvc_noti_publish_nickname_change(); + if (sdn_change) __ctsvc_noti_publish_sdn_change(); + if (relationship_change) __ctsvc_noti_publish_relationship_change(); + if (image_change) __ctsvc_noti_publish_image_change(); + if (profile_change) __ctsvc_noti_publish_profile_change(); + if (company_change) __ctsvc_noti_publish_company_change(); +} + +void ctsvc_db_data_delete_callback(sqlite3_context * context, + int argc, sqlite3_value ** argv) +{ + CTS_FN_CALL; + int id; + int datatype; + + if (argc > 2) { + sqlite3_result_null(context); + return; + } + + id = sqlite3_value_int(argv[0]); + datatype = sqlite3_value_int(argv[1]); + CTS_DBG("id : %d, datatype : %d", id, datatype); + + switch(datatype) { + case CTSVC_DATA_NAME: + ctsvc_set_name_noti(); + break; + case CTSVC_DATA_POSTAL: + ctsvc_set_address_noti(); + break; + case CTSVC_DATA_MESSENGER: + ctsvc_set_messenger_noti(); + break; + case CTSVC_DATA_URL: + ctsvc_set_url_noti(); + break; + case CTSVC_DATA_EVENT: + ctsvc_set_event_noti(); + break; + case CTSVC_DATA_COMPANY: + ctsvc_set_company_noti(); + break; + case CTSVC_DATA_NICKNAME: + ctsvc_set_nickname_noti(); + break; + case CTSVC_DATA_NUMBER: + ctsvc_set_number_noti(); + break; + case CTSVC_DATA_EMAIL: + ctsvc_set_email_noti(); + break; + case CTSVC_DATA_PROFILE: + ctsvc_set_profile_noti(); + break; + case CTSVC_DATA_RELATIONSHIP: + ctsvc_set_relationship_noti(); + break; + case CTSVC_DATA_NOTE: + ctsvc_set_note_noti(); + break; + case CTSVC_DATA_IMAGE: + ctsvc_set_image_noti(); + break; + case CTSVC_DATA_EXTENSION: + ctsvc_set_data_noti(); + break; + default: + break; + } + sqlite3_result_null(context); + CTS_FN_END; +} + diff --git a/native/ctsvc_notification.h b/native/ctsvc_notification.h new file mode 100644 index 0000000..92e4e57 --- /dev/null +++ b/native/ctsvc_notification.h @@ -0,0 +1,58 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_NOTIFICATION_H__ +#define __TIZEN_SOCIAL_CTSVC_NOTIFICATION_H__ + +#include "ctsvc_sqlite.h" + +void ctsvc_set_contact_noti(void); +void ctsvc_set_my_profile_noti(void); +void ctsvc_set_phonelog_noti(void); +void ctsvc_set_missed_call_noti(void); +void ctsvc_set_favor_noti(void); +void ctsvc_set_speed_noti(void); +void ctsvc_set_addressbook_noti(void); +void ctsvc_set_group_noti(void); +void ctsvc_set_group_rel_noti(void); +void ctsvc_set_person_noti(void); +void ctsvc_set_data_noti(void); +void ctsvc_set_activity_noti(void); +void ctsvc_set_address_noti(void); +void ctsvc_set_event_noti(void); +void ctsvc_set_messenger_noti(void); +void ctsvc_set_number_noti(void); +void ctsvc_set_email_noti(void); +void ctsvc_set_name_noti(void); +void ctsvc_set_note_noti(void); +void ctsvc_set_url_noti(void); +void ctsvc_set_nickname_noti(void); +void ctsvc_set_relationship_noti(void); +void ctsvc_set_image_noti(void); +void ctsvc_set_profile_noti(void); +void ctsvc_set_sdn_noti(void); +void ctsvc_set_company_noti(void); + +void ctsvc_notification_send(); +void ctsvc_nofitication_cancel(void); + +void ctsvc_db_data_delete_callback(sqlite3_context * context, + int argc, sqlite3_value ** argv); + +#endif /* __TIZEN_SOCIAL_CTSVC_NOTIFICATION_H__ */ diff --git a/native/ctsvc_person.c b/native/ctsvc_person.c new file mode 100644 index 0000000..1eb5240 --- /dev/null +++ b/native/ctsvc_person.c @@ -0,0 +1,1269 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_db_init.h" +#include "ctsvc_utils.h" +#include "ctsvc_notification.h" +#include "ctsvc_db_plugin_person_helper.h" + +#ifdef _CONTACTS_IPC_SERVER +#include "ctsvc_server_change_subject.h" +#endif + +#define DISPLAY_ACCOUNT_MAX 3 + +enum { + CTSVC_GET_PERSON_DEFAULT_NUMBER_VALUE, + CTSVC_GET_PERSON_DEFAULT_EMAIL_VALUE, + CTSVC_GET_PERSON_DEFAULT_IMAGE_VALUE, +}; + +static inline int __ctsvc_get_person_default_number_value(int id, contacts_record_h *record) +{ + int ret; + cts_stmt stmt; + ctsvc_number_s *number; + char query[CTS_SQL_MAX_LEN] = {0}; + + snprintf(query, sizeof(query), + "SELECT data.id, data.is_default, data.data1, data.data2, data.data3, data.data4 " + "FROM %s, %s ON data.is_primary_default=1 AND data.datatype=%d " + "AND data.contact_id = contacts.contact_id AND contacts.deleted = 0 " + "WHERE contacts.person_id = %d", + CTS_TABLE_CONTACTS, CTS_TABLE_DATA, CTSVC_DATA_NUMBER, id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + cts_stmt_finalize(stmt); + CTS_ERR("No data : person(%d) has no default phone", id); + return CONTACTS_ERROR_NO_DATA; + } + + ret = contacts_record_create(_contacts_number._uri, (contacts_record_h*)&number); + if (number) { + char *temp; + number->id = ctsvc_stmt_get_int(stmt, 0); + number->is_default = ctsvc_stmt_get_int(stmt, 1); + number->type = ctsvc_stmt_get_int(stmt, 2); + temp = ctsvc_stmt_get_text(stmt, 3); + number->label = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, 4); + number->number = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, 5); + number->lookup = SAFE_STRDUP(temp); + + *record = (contacts_record_h)number; + ret = CONTACTS_ERROR_NONE; + } + else + CTS_ERR("contacts_record_create() Failed"); + + cts_stmt_finalize(stmt); + return ret; +} + +static inline int __ctsvc_get_person_default_email_value(int id, contacts_record_h *record) +{ + int ret; + cts_stmt stmt; + ctsvc_email_s *email; + char query[CTS_SQL_MAX_LEN] = {0}; + + snprintf(query, sizeof(query), + "SELECT data.id, data.is_default, data.data1, data.data2, data.data3 " + "FROM %s, %s ON data.is_primary_default=1 AND data.datatype=%d " + "AND data.contact_id = contacts.contact_id AND contacts.deleted = 0 " + "WHERE contacts.person_id = %d", + CTS_TABLE_CONTACTS, CTS_TABLE_DATA, CTSVC_DATA_EMAIL, id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + + if (1 /*CTS_TRUE*/ != ret) { + cts_stmt_finalize(stmt); + CTS_ERR("person(%d) has no default email", id); + return CONTACTS_ERROR_NO_DATA; + } + + ret = contacts_record_create(_contacts_email._uri, (contacts_record_h*)&email); + if (email) { + char *temp; + email->id = ctsvc_stmt_get_int(stmt, 0); + email->is_default = ctsvc_stmt_get_int(stmt, 1); + email->type = ctsvc_stmt_get_int(stmt, 2); + temp = ctsvc_stmt_get_text(stmt, 3); + email->label = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, 4); + email->email_addr = SAFE_STRDUP(temp); + + *record = (contacts_record_h)email; + ret = CONTACTS_ERROR_NONE; + } + else + CTS_ERR("contacts_record_create() Failed"); + + cts_stmt_finalize(stmt); + return ret; +} + +static inline int __ctsvc_get_person_default_image_value(int id, contacts_record_h *record) +{ + int ret; + cts_stmt stmt; + ctsvc_image_s *image; + char query[CTS_SQL_MAX_LEN] = {0}; + + snprintf(query, sizeof(query), + "SELECT data.id, data.is_default, data.data1, data.data2, data.data3 " + "FROM "CTS_TABLE_CONTACTS", "CTS_TABLE_DATA" " + "ON data.is_primary_default=1 AND data.datatype=%d AND data.is_my_profile = 0 " + "AND data.contact_id = contacts.contact_id AND contacts.deleted = 0 " + "WHERE contacts.person_id = %d", + CTSVC_DATA_IMAGE, id); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ != ret) { + cts_stmt_finalize(stmt); + ERR("person(%d) has no default image", id); + return CONTACTS_ERROR_NO_DATA; + } + + ret = contacts_record_create(_contacts_image._uri, (contacts_record_h*)&image); + if (image) { + char *temp; + image->id = ctsvc_stmt_get_int(stmt, 0); + image->is_default = ctsvc_stmt_get_int(stmt, 1); + image->type = ctsvc_stmt_get_int(stmt, 2); + temp = ctsvc_stmt_get_text(stmt, 3); + image->label = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, 4); + image->path = SAFE_STRDUP(temp); + + *record = (contacts_record_h)image; + ret = CONTACTS_ERROR_NONE; + } + else + ERR("contacts_record_create() Failed"); + + cts_stmt_finalize(stmt); + return ret; +} + +static int __ctsvc_get_person_value(int op_code, + int person_id, contacts_record_h *record) +{ + int ret; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + + switch (op_code) + { + case CTSVC_GET_PERSON_DEFAULT_NUMBER_VALUE: + ret = __ctsvc_get_person_default_number_value(person_id, record); + RETVM_IF(ret != CONTACTS_ERROR_NONE, ret, "__ctsvc_get_person_default_number_value() Failed(%d)", ret); + break; + case CTSVC_GET_PERSON_DEFAULT_EMAIL_VALUE: + ret = __ctsvc_get_person_default_email_value(person_id, record); + RETVM_IF(ret != CONTACTS_ERROR_NONE, ret, "__ctsvc_get_person_default_email_value() Failed(%d)", ret); + break; + case CTSVC_GET_PERSON_DEFAULT_IMAGE_VALUE: + ret = __ctsvc_get_person_default_image_value(person_id, record); + RETVM_IF(ret != CONTACTS_ERROR_NONE, ret, "__ctsvc_get_person_default_image_value() Failed(%d)", ret); + break; + default: + CTS_ERR("Invalid parameter : The op_code(%d) is not supported", op_code); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + + if (NULL == *record) + return CONTACTS_ERROR_NO_DATA; + + return ret; +} + +static inline int __ctsvc_put_person_default_name(int person_id, int contact_id) +{ + int ret; + int id; + char query[CTS_SQL_MAX_LEN] = {0}; + + snprintf(query, sizeof(query), + "SELECT person_id FROM %s WHERE contact_id=%d AND deleted = 0", + CTS_TABLE_CONTACTS, contact_id); + + ret = ctsvc_query_get_first_int_result(query, &id); + RETVM_IF(ret != CONTACTS_ERROR_NONE, ret, "ctsvc_query_get_first_int_result() Failed(%d)", ret); + + if (id == person_id) { + ret = ctsvc_begin_trans(); + RETVM_IF(CONTACTS_ERROR_NONE > ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret); + snprintf(query, sizeof(query), + "UPDATE %s SET name_contact_id=%d WHERE person_id=%d", + CTS_TABLE_PERSONS, contact_id, person_id); + + ret = ctsvc_query_exec(query); + if( CONTACTS_ERROR_NONE != ret ) + { + CTS_ERR( "ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + else + { + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; + } + } + else { + CTS_ERR("contact(%d) does not belong to person(%d), to person(%d)", contact_id, person_id, ret); + ret = CONTACTS_ERROR_NO_DATA; + } + + return ret; +} + +static inline int __ctsvc_put_person_default_image(int person_id, int id) +{ + int ret; + int is_default; + int contact_id; + cts_stmt stmt; + char *image_path; + char query[CTS_SQL_MAX_LEN] = {0}; + + ret = ctsvc_begin_trans(); + RETVM_IF(CONTACTS_ERROR_NONE > ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), + "SELECT D.is_default, D.contact_id, D.data3 " + "FROM "CTS_TABLE_DATA" D, "CTS_TABLE_CONTACTS" C " + "ON D.contact_id = C.contact_id AND C.deleted = 0 " + "WHERE D.datatype=%d AND D.is_my_profile = 0 AND C.person_id=%d AND D.id=%d", + CTSVC_DATA_IMAGE, person_id, id); + stmt = cts_query_prepare(query); + if (NULL == stmt) { + CTS_ERR("cts_query_prepare failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + ret = cts_stmt_step(stmt); + if (1 != ret) { + cts_stmt_finalize(stmt); + ctsvc_end_trans(false); + return ret; + } + + is_default = ctsvc_stmt_get_int(stmt, 0); + contact_id = ctsvc_stmt_get_int(stmt, 1); + image_path = SAFE_STRDUP(ctsvc_stmt_get_text(stmt, 2)); + cts_stmt_finalize(stmt); + + // unset is_primary_default of all data of the person + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET is_primary_default=0 WHERE datatype=%d AND is_my_profile = 0 " + "AND contact_id IN (SELECT contact_id FROM "CTS_TABLE_CONTACTS" " + "WHERE person_id=%d AND deleted = 0) ", + CTSVC_DATA_IMAGE, person_id); + ret = ctsvc_query_exec(query); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + free(image_path); + ctsvc_end_trans(false); + return ret; + } + + // unset is_default of all data of person if the data is not default + if (!is_default) { + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET is_default=0 WHERE datatype=%d AND is_my_profile = 0 " + "AND contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id=%d) ", + CTSVC_DATA_IMAGE, id); + + ret = ctsvc_query_exec(query); + if(CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + free(image_path); + ctsvc_end_trans(false); + return ret; + } + } + + // set is_default, is _primary_default + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET is_primary_default=1, is_default=1 WHERE id=%d ", id); + ret = ctsvc_query_exec(query); + if( CONTACTS_ERROR_NONE != ret ) { + CTS_ERR( "ctsvc_query_exec() Failed(%d)", ret); + free(image_path); + ctsvc_end_trans(false); + return ret; + } + + // update person's image_thumbnail_path + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_PERSONS" SET image_thumbnail_path=? WHERE person_id=%d ", person_id); + stmt = cts_query_prepare(query); + if( NULL == stmt ) { + CTS_ERR( "cts_query_prepare() Failed()"); + free(image_path); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + cts_stmt_bind_text(stmt, 1, image_path); + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + free(image_path); + ctsvc_end_trans(false); + return ret; + } + cts_stmt_finalize(stmt); + + // update contact's image_thumbnail_path + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_CONTACTS" SET image_thumbnail_path=? WHERE contact_id=%d ", contact_id); + stmt = cts_query_prepare(query); + if( NULL == stmt ) { + CTS_ERR( "cts_query_prepare() Failed"); + free(image_path); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + cts_stmt_bind_text(stmt, 1, image_path); + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + free(image_path); + ctsvc_end_trans(false); + return ret; + } + cts_stmt_finalize(stmt); + + free(image_path); + + ret = ctsvc_end_trans(true); + return ret; +} + +static inline int __ctsvc_put_person_default_data(int person_id, int id, int datatype) +{ + int ret; + int is_default; + char query[CTS_SQL_MAX_LEN] = {0}; + + snprintf(query, sizeof(query), + "SELECT D.is_default FROM %s D, %s C " + "ON (D.contact_id=C.contact_id AND C.deleted = 0) " + "WHERE D.datatype=%d AND C.person_id=%d AND D.id=%d", + CTS_TABLE_DATA, CTS_TABLE_CONTACTS, datatype, person_id, id); + + ret = ctsvc_query_get_first_int_result(query, &is_default); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_query_get_first_int_result() Failed(%d)", ret); + + ret = ctsvc_begin_trans(); + RETVM_IF(CONTACTS_ERROR_NONE > ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret); + + // unset is_primary_default of all data of the person + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET is_primary_default=0 WHERE datatype=%d AND is_my_profile = 0 " + "AND contact_id IN (SELECT contact_id FROM "CTS_TABLE_CONTACTS" " + "WHERE person_id=%d AND deleted = 0) ", + datatype, person_id); + + ret = ctsvc_query_exec(query); + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + // unset is_default of all data of person if the data is not default + if (!is_default) { + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET is_default=0 WHERE datatype=%d AND is_my_profile = 0 " + "AND contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id=%d) ", + datatype, id); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + } + + // set is_default, is _primary_default + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_DATA" SET is_primary_default=1, is_default=1 WHERE id=%d ", id); + + ret = ctsvc_query_exec(query); + if( CONTACTS_ERROR_NONE != ret ) { + CTS_ERR( "ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +void ctsvc_db_person_delete_callback(sqlite3_context * context, + int argc, sqlite3_value ** argv) +{ +#ifdef _CONTACTS_IPC_SERVER + int person_id; + + if (argc < 1) { + sqlite3_result_null(context); + return; + } + + person_id = sqlite3_value_int(argv[0]); + ctsvc_change_subject_add_changed_person_id(CONTACTS_CHANGE_DELETED, person_id); + + sqlite3_result_null(context); + return; +#endif +} + +inline static const char* __cts_get_image_filename(const char* src) +{ + const char* dir = CTS_IMG_FULL_LOCATION; + int pos=0; + while (dir[pos]==src[pos]) { + pos++; + } + + if ('/' == src[pos]) + return src + pos + 1; + + return src+pos; +} + +int ctsvc_person_aggregate(int person_id) +{ + int ret, len = 0; + int version; + int link_count; + int id = 0; + int account_ids[DISPLAY_ACCOUNT_MAX] = {0}; + char addressbook_ids[100] = {0}; + int name_contact_id = 0; + int person_name_contact_id = 0; + int display_name_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_INVALID; + char query[CTS_SQL_MIN_LEN] = {0}; + char *ringtone_path = NULL; + char *image_thumbnail_path = NULL; + char *vibration = NULL; + char *status = NULL; + const char *temp; + cts_stmt stmt; + ctsvc_person_s *person; + bool person_is_favorite = false; + + ret = contacts_db_get_record( _contacts_person._uri, person_id, (contacts_record_h*)&person); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("contacts_db_get_record() Failed\n"); + return CONTACTS_ERROR_INTERNAL; + } + + snprintf(query, sizeof(query), + "SELECT contact_id FROM %s " + "WHERE person_id=%d AND contact_id=%d AND deleted = 0", + CTS_TABLE_CONTACTS, person->person_id, person->name_contact_id); + + ret = ctsvc_query_get_first_int_result(query, &id); + if(ret == CONTACTS_ERROR_NONE) { + name_contact_id = person->name_contact_id; + person_name_contact_id = person->name_contact_id; + } + else { + name_contact_id = 0; + person_name_contact_id = 0; + } + + if (person->image_thumbnail_path) { + temp = __cts_get_image_filename(person->image_thumbnail_path); + snprintf(query, sizeof(query), + "SELECT D.id FROM "CTS_TABLE_CONTACTS" C, "CTS_TABLE_DATA" D " + "WHERE C.person_id=%d AND C.contact_id=D.contact_id AND C.deleted = 0 " + "AND D.datatype=%d AND D.is_primary_default = 1 AND D.data3='%s'", + person->person_id, CTSVC_DATA_IMAGE, temp); + ret = ctsvc_query_get_first_int_result(query, &id); + if(ret == CONTACTS_ERROR_NONE) { + image_thumbnail_path = SAFE_STRDUP(temp); + } + } + else { + image_thumbnail_path = NULL; + } + + snprintf(query, sizeof(query), + "SELECT a.status FROM %s c, %s a " + "ON c.contact_id = a.contact_id AND c.deleted = 0 " + "WHERE c.person_id=%d " + "ORDER BY timestamp DESC LIMIT 1", + CTS_TABLE_CONTACTS, CTS_TABLE_ACTIVITIES, person->person_id); + stmt = cts_query_prepare(query); + if (NULL == stmt) { + ERR("DB error : cts_query_prepare() Failed"); + free(image_thumbnail_path); + contacts_record_destroy((contacts_record_h)person, true); + return CONTACTS_ERROR_DB; + } + + if (1 == cts_stmt_step(stmt)) { + temp = ctsvc_stmt_get_text(stmt, 0); + status = SAFE_STRDUP(temp); + } + cts_stmt_finalize(stmt); + + if (person->ringtone_path) + ringtone_path = SAFE_STRDUP(person->ringtone_path); + if (person->vibration) + vibration = SAFE_STRDUP(person->vibration); + contacts_record_destroy((contacts_record_h)person, true); + + snprintf(query, sizeof(query), + "SELECT contact_id, contacts.addressbook_id, %s, display_name_source, " + "image_thumbnail_path, ringtone_path, vibration, account_id, is_favorite " + "FROM %s, %s " + "ON contacts.addressbook_id = addressbooks.addressbook_id AND contacts.deleted = 0 " + "WHERE person_id = %d " + "ORDER BY contact_id", + ctsvc_get_display_column(), CTS_TABLE_CONTACTS, CTS_TABLE_ADDRESSBOOKS, person_id); + stmt = cts_query_prepare(query); + if (NULL == stmt) { + ERR("DB error : cts_query_prepare() Failed"); + free(image_thumbnail_path); + free(ringtone_path); + free(vibration); + return CONTACTS_ERROR_DB; + } + + link_count = 0; + while ((ret = cts_stmt_step(stmt))) { + const char *temp_str; + int i = 0; + int account_id; + int contact_id; + int addressbook_id; + int contact_display_name_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_INVALID; + char *contact_display_name = NULL; + char *contact_ringtone_path = NULL; + char *contact_image_thumbnail_path = NULL; + char *contact_vibration = NULL; + bool is_favorite = false; + + contact_id = ctsvc_stmt_get_int(stmt, i++); + addressbook_id = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + contact_display_name = SAFE_STRDUP(temp); + contact_display_name_source_type = ctsvc_stmt_get_int(stmt, i++); + temp = ctsvc_stmt_get_text(stmt, i++); + if (temp) + contact_image_thumbnail_path = strdup(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + contact_ringtone_path = SAFE_STRDUP(temp); + temp = ctsvc_stmt_get_text(stmt, i++); + contact_vibration = SAFE_STRDUP(temp); + account_id = ctsvc_stmt_get_int(stmt, i++); + is_favorite = ctsvc_stmt_get_int(stmt, i++); + + link_count++; + + for( i=0; i display_name_source_type) { + display_name_source_type = contact_display_name_source_type; + name_contact_id = contact_id; + } + else if (contact_display_name_source_type == display_name_source_type){ + if (name_contact_id != person_name_contact_id) + name_contact_id = person_name_contact_id; + } + + len += snprintf(addressbook_ids + len, sizeof(addressbook_ids)-len, "%d ", addressbook_id ); + + if (contact_image_thumbnail_path && *contact_image_thumbnail_path) { + temp = __cts_get_image_filename(contact_image_thumbnail_path); + image_thumbnail_path = SAFE_STRDUP(temp); + // update data table : is_primary_default + } + free(contact_image_thumbnail_path); + + temp_str = contact_ringtone_path; + if (!ringtone_path && temp_str && strlen(temp_str)) + ringtone_path = SAFE_STRDUP(temp_str); + + temp_str = contact_vibration; + if (!vibration && temp_str && strlen(temp_str)) + vibration = SAFE_STRDUP(temp_str); + + if (is_favorite) + person_is_favorite = true; + } + cts_stmt_finalize(stmt); + version = ctsvc_get_next_ver(); + + snprintf(query, sizeof(query), + "UPDATE "CTS_TABLE_PERSONS" SET dirty=0, name_contact_id = %d, changed_ver = %d, " + "has_phonenumber = EXISTS(SELECT contact_id FROM "CTS_TABLE_CONTACTS" " + "WHERE person_id = %d AND has_phonenumber = 1 AND deleted = 0), " + "has_email = EXISTS(SELECT contact_id FROM "CTS_TABLE_CONTACTS" " + "WHERE person_id = %d AND has_email = 1 AND deleted = 0), " + "link_count = %d, account_id1 = %d, account_id2 = %d, account_id3 = %d, " + "addressbook_ids = ?, ringtone_path=?, vibration=?, status=?, image_thumbnail_path=? " + "WHERE person_id = %d ", + name_contact_id, version, person_id, + person_id, link_count, account_ids[0], account_ids[1], account_ids[2], person_id); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + ERR("DB error : cts_query_prepare() Failed"); + free(image_thumbnail_path); + free(ringtone_path); + free(vibration); + return CONTACTS_ERROR_DB; + } + + cts_stmt_bind_text(stmt, 1, addressbook_ids); + + if(ringtone_path) + cts_stmt_bind_text(stmt, 2, ringtone_path); + if(vibration) + cts_stmt_bind_text(stmt, 3, vibration); + if(status) + cts_stmt_bind_text(stmt, 4, status); + if(image_thumbnail_path) + cts_stmt_bind_text(stmt, 5, image_thumbnail_path); + + ret = cts_stmt_step(stmt); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("cts_stmt_step() Failed(%d)", ret); + cts_stmt_finalize(stmt); + free(image_thumbnail_path); + free(ringtone_path); + free(vibration); + return ret; + } + + cts_stmt_finalize(stmt); + + free(image_thumbnail_path); + free(ringtone_path); + free(vibration); + + if (!person_is_favorite) { + snprintf(query, sizeof(query), + "DELETE FROM "CTS_TABLE_FAVORITES" WHERE person_id = %d", person_id); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + return ret; + } + } + + ctsvc_set_person_noti(); +#ifdef _CONTACTS_IPC_SERVER + ctsvc_change_subject_add_changed_person_id(CONTACTS_CHANGE_UPDATED, person_id); +#endif + + return CONTACTS_ERROR_NONE; +} + +static bool __ctsvc_get_person_favorite_info(int person_id, double *priority) +{ + int ret; + cts_stmt stmt; + char query[CTS_SQL_MIN_LEN] = {0}; + snprintf(query, sizeof(query), + "SELECT favorite_prio FROM "CTS_TABLE_FAVORITES" WHERE person_id = %d", person_id); + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + ret = cts_stmt_step(stmt); + if (1 == ret) { + *priority = ctsvc_stmt_get_dbl(stmt, 0); + cts_stmt_finalize(stmt); + return true; + } + cts_stmt_finalize(stmt); + return false; +} + +API int contacts_person_link_person(int base_person_id, int person_id) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + int default_number_id = 0; + int default_email_id = 0; + int default_image_id = 0; + contacts_record_h record = NULL; + bool base_is_favorite = false; + bool is_favorite = false; + double favorite_prio = 0.0; + + RETVM_IF(base_person_id == person_id, CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : base_person_id(%d), person_id(%d)", base_person_id, person_id); + + ret = ctsvc_begin_trans(); + RETVM_IF(CONTACTS_ERROR_NONE > ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret); + + ret = __ctsvc_get_person_value(CTSVC_GET_PERSON_DEFAULT_NUMBER_VALUE, base_person_id, &record); + if (CONTACTS_ERROR_NONE != ret ) { + ret = __ctsvc_get_person_value(CTSVC_GET_PERSON_DEFAULT_NUMBER_VALUE, person_id, &record); + if (CONTACTS_ERROR_NONE == ret) { + contacts_record_get_int(record, CTSVC_PROPERTY_NUMBER_ID, &default_number_id); + contacts_record_destroy(record, true); + } + } + else { + contacts_record_get_int(record, CTSVC_PROPERTY_NUMBER_ID, &default_number_id); + contacts_record_destroy(record, true); + } + + ret = __ctsvc_get_person_value(CTSVC_GET_PERSON_DEFAULT_EMAIL_VALUE, base_person_id, &record); + if (CONTACTS_ERROR_NONE != ret ) { + ret = __ctsvc_get_person_value(CTSVC_GET_PERSON_DEFAULT_EMAIL_VALUE, person_id, &record); + if (CONTACTS_ERROR_NONE == ret ) { + contacts_record_get_int(record, CTSVC_PROPERTY_EMAIL_ID, &default_email_id); + contacts_record_destroy(record, true); + } + } + else { + contacts_record_get_int(record, CTSVC_PROPERTY_EMAIL_ID, &default_email_id); + contacts_record_destroy(record, true); + } + + ret = __ctsvc_get_person_value(CTSVC_GET_PERSON_DEFAULT_IMAGE_VALUE, base_person_id, &record); + if (CONTACTS_ERROR_NONE != ret ) { + ret = __ctsvc_get_person_value(CTSVC_GET_PERSON_DEFAULT_IMAGE_VALUE, person_id, &record); + if (CONTACTS_ERROR_NONE == ret ) { + contacts_record_get_int(record, CTSVC_PROPERTY_IMAGE_ID, &default_image_id); + contacts_record_destroy(record, true); + } + } + else { + contacts_record_get_int(record, CTSVC_PROPERTY_IMAGE_ID, &default_image_id); + contacts_record_destroy(record, true); + } + + base_is_favorite = __ctsvc_get_person_favorite_info(base_person_id, &favorite_prio); + if (!base_is_favorite) + is_favorite = __ctsvc_get_person_favorite_info(person_id, &favorite_prio); + + snprintf(query, sizeof(query), + "UPDATE %s SET person_id = %d WHERE person_id = %d AND deleted = 0", + CTS_TABLE_CONTACTS, base_person_id, person_id); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_person_aggregate(base_person_id); + + if (default_number_id) + __ctsvc_put_person_default_data(base_person_id, default_number_id, CTSVC_DATA_NUMBER); + + if (default_email_id) + __ctsvc_put_person_default_data(base_person_id, default_email_id, CTSVC_DATA_EMAIL); + + if (default_image_id) + __ctsvc_put_person_default_image(base_person_id, default_image_id); + + snprintf(query, sizeof(query), "DELETE FROM %s WHERE person_id = %d", + CTS_TABLE_PERSONS, person_id); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + if (is_favorite) { + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_FAVORITES" values(%d, %f)", base_person_id, favorite_prio); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + } + + ctsvc_set_person_noti(); + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +static int __ctsvc_update_primary_default_data(int person_id) +{ + int ret; + contacts_record_h record = NULL; + char query[CTS_SQL_MIN_LEN] = {0}; + cts_stmt stmt; + + ret = __ctsvc_get_person_value(CTSVC_GET_PERSON_DEFAULT_NUMBER_VALUE, person_id, &record); + if (CONTACTS_ERROR_NONE != ret ) { + snprintf(query, sizeof(query), + "SELECT contact_id " + "FROM %s " + "WHERE person_id = %d AND deleted = 0 " + "ORDER BY contact_id", + CTS_TABLE_CONTACTS, person_id); + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "cts_query_prepare fail(%d)", CONTACTS_ERROR_DB); + + while (1 == cts_stmt_step(stmt)) { + int contact_id = ctsvc_stmt_get_int(stmt, 0); + cts_stmt stmt_number; + + snprintf(query, sizeof(query), + "SELECT id, is_default FROM %s " + "WHERE contact_id = %d AND datatype = %d AND is_default = 1 AND is_my_profile = 0", + CTS_TABLE_DATA, contact_id, CTSVC_DATA_NUMBER); + + stmt_number = cts_query_prepare(query); + + if( 1 == cts_stmt_step(stmt_number) ) { + int default_number_id = ctsvc_stmt_get_int(stmt_number, 0); + __ctsvc_put_person_default_data(person_id, default_number_id, CTSVC_DATA_NUMBER); + cts_stmt_finalize(stmt_number); + break; + } + cts_stmt_finalize(stmt_number); + } + cts_stmt_finalize(stmt); + } + else { + contacts_record_destroy(record, true); + } + + ret = __ctsvc_get_person_value(CTSVC_GET_PERSON_DEFAULT_EMAIL_VALUE, person_id, &record); + if (CONTACTS_ERROR_NONE != ret ) { + snprintf(query, sizeof(query), + "SELECT contact_id " + "FROM %s " + "WHERE person_id = %d AND deleted = 0 " + "ORDER BY contact_id", + CTS_TABLE_CONTACTS, person_id); + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "cts_query_prepare fail(%d)", CONTACTS_ERROR_DB); + + while (1 == cts_stmt_step(stmt)) { + int contact_id = ctsvc_stmt_get_int(stmt, 0); + cts_stmt stmt_email; + + snprintf(query, sizeof(query), + "SELECT id, is_default FROM %s " + "WHERE contact_id = %d AND datatype = %d AND is_default = 1 AND is_my_profile = 0", + CTS_TABLE_DATA, contact_id, CTSVC_DATA_EMAIL); + + stmt_email = cts_query_prepare(query); + + if( 1 == cts_stmt_step(stmt_email)) { + int default_email_id = ctsvc_stmt_get_int(stmt_email, 0); + __ctsvc_put_person_default_data(person_id, default_email_id, CTSVC_DATA_EMAIL); + cts_stmt_finalize(stmt_email); + break; + } + cts_stmt_finalize(stmt_email); + } + cts_stmt_finalize(stmt); + } + else { + contacts_record_destroy(record, true); + } + + ret = __ctsvc_get_person_value(CTSVC_GET_PERSON_DEFAULT_IMAGE_VALUE, person_id, &record); + if (CONTACTS_ERROR_NONE != ret ) { + snprintf(query, sizeof(query), + "SELECT contact_id " + "FROM %s " + "WHERE person_id = %d AND deleted = 0 " + "ORDER BY contact_id", + CTS_TABLE_CONTACTS, person_id); + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "cts_query_prepare fail(%d)", CONTACTS_ERROR_DB); + + while ( 1 == cts_stmt_step(stmt)) { + int contact_id = ctsvc_stmt_get_int(stmt, 0); + cts_stmt stmt_image; + + snprintf(query, sizeof(query), + "SELECT id, is_default FROM %s " + "WHERE contact_id = %d AND datatype = %d AND is_default = 1 AND is_my_profile = 0", + CTS_TABLE_DATA, contact_id, CTSVC_DATA_IMAGE); + + stmt_image = cts_query_prepare(query); + if( 1 == cts_stmt_step(stmt_image)) { + int default_image_id = ctsvc_stmt_get_int(stmt_image, 0); + __ctsvc_put_person_default_image(person_id, default_image_id); + cts_stmt_finalize(stmt_image); + break; + } + cts_stmt_finalize(stmt_image); + } + cts_stmt_finalize(stmt); + } + else { + contacts_record_destroy(record, true); + } + + return CONTACTS_ERROR_NONE; +} + +API int contacts_person_unlink_contact(int person_id, int contact_id, int* out_person_id ) +{ + int ret; + int id; + char query[CTS_SQL_MIN_LEN] = {0}; + contacts_record_h record = NULL; + bool is_favorite = false; + double priority = 0.0; + + RETVM_IF(person_id <= 0 || contact_id <= 0 , CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : person_id(%d), person_id(%d)", person_id, person_id); + RETVM_IF(out_person_id == NULL , CONTACTS_ERROR_INVALID_PARAMETER, + "Invalid parameter : out_person_id is NULL"); + + *out_person_id = 0; + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), + "SELECT person_id FROM "CTS_TABLE_PERSONS" WHERE person_id=%d", person_id); + ret = ctsvc_query_get_first_int_result(query, &id); + if (CONTACTS_ERROR_NONE != ret) { + ctsvc_end_trans(false); + return ret; + } + + ret = contacts_db_get_record(_contacts_contact._uri, contact_id, &record); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("contacts_db_get_record() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + *out_person_id = ctsvc_db_insert_person(record); + if (CONTACTS_ERROR_NONE > *out_person_id) { + CTS_ERR("ctsvc_db_insert_person() Failed(%d)", *out_person_id); + ctsvc_end_trans(false); + return *out_person_id; + } + + snprintf(query, sizeof(query), + "INSERT INTO %s (person_id, usage_type, times_used) " + "SELECT %d, usage_type, times_used FROM %s WHERE person_id = %d", + CTS_TABLE_CONTACT_STAT, *out_person_id, CTS_TABLE_CONTACT_STAT, person_id ); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + is_favorite = __ctsvc_get_person_favorite_info(person_id, &priority); + + snprintf(query, sizeof(query), + "UPDATE %s SET person_id = %d WHERE contact_id = %d", + CTS_TABLE_CONTACTS, *out_person_id, contact_id); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_person_aggregate(person_id); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_person_aggregate(%d) Failed(%d)", person_id, ret); + ctsvc_end_trans(false); + return ret; + } + + if (is_favorite && ((ctsvc_contact_s*)record)->is_favorite) { + snprintf(query, sizeof(query), + "INSERT INTO "CTS_TABLE_FAVORITES" values(%d, %f)", *out_person_id, priority); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + } + + __ctsvc_update_primary_default_data(person_id); + + ctsvc_set_person_noti(); + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +int ctsvc_person_do_garbage_collection(void) +{ + cts_stmt stmt = NULL; + char query[CTS_SQL_MIN_LEN] = {0}; + + snprintf(query, sizeof(query), "SELECT person_id FROM "CTS_TABLE_PERSONS" WHERE dirty=1"); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); + + while ( 1 /*CTS_TRUE*/ == cts_stmt_step(stmt)) { + int person_id; + person_id = ctsvc_stmt_get_int(stmt, 0); + ctsvc_person_aggregate(person_id); + } + cts_stmt_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +API int contacts_person_reset_usage(int person_id, contacts_usage_type_e type) +{ + int ret ; + char query[CTS_SQL_MAX_LEN] = {0}; + + RETVM_IF(person_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,"contact_id should be greater than 0"); + + snprintf(query, sizeof(query), + "UPDATE %s SET times_used = 0 WHERE person_id = %d AND usage_type = %d", + CTS_TABLE_CONTACT_STAT, person_id, type); + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +API int contacts_person_set_favorite_order(int person_id, int front_person_id, int back_person_id) +{ + int ret; + double front_prio = 0.0; + double back_prio = 0.0; + double prio; + cts_stmt stmt; + char query[CTS_SQL_MAX_LEN] = {0}; + + snprintf(query, sizeof(query), "SELECT favorite_prio FROM "CTS_TABLE_FAVORITES" WHERE person_id = ?"); + + stmt = cts_query_prepare(query); + RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "cts_query_prepare() Failed"); + + cts_stmt_bind_int(stmt, 1, front_person_id); + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ == ret) + front_prio = ctsvc_stmt_get_dbl(stmt, 0); + cts_stmt_reset(stmt); + cts_stmt_bind_int(stmt, 1, back_person_id); + ret = cts_stmt_step(stmt); + if (1 /*CTS_TRUE*/ == ret) + back_prio = ctsvc_stmt_get_dbl(stmt, 0); + cts_stmt_finalize(stmt); + + RETVM_IF(0.0 == front_prio && 0.0 == back_prio, CONTACTS_ERROR_INVALID_PARAMETER, + "The indexes for front and back are invalid."); + + if (0.0 == back_prio) + prio = front_prio + 1; + else + prio = (front_prio + back_prio) / 2; + + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), + "UPDATE %s SET favorite_prio = %f WHERE person_id = %d", + CTS_TABLE_FAVORITES, prio, person_id); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_set_favor_noti(); + + ret = ctsvc_end_trans(true); + if (ret < CONTACTS_ERROR_NONE) + { + CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret); + return ret; + } + else + return CONTACTS_ERROR_NONE; +} + +API int contacts_person_set_default_property(contacts_person_property_e property, int person_id, + int id) +{ + int ret; + + ret = ctsvc_begin_trans(); + RETVM_IF(ret < CONTACTS_ERROR_NONE, CONTACTS_ERROR_DB, "ctsvc_begin_trans() Failed(%d)", ret); + + switch(property) { + case CONTACTS_PERSON_PROPERTY_NAME_CONTACT: + ret = __ctsvc_put_person_default_name(person_id, id); // contact id + break; + case CONTACTS_PERSON_PROPERTY_NUMBER: + ret = __ctsvc_put_person_default_data(person_id, id, CTSVC_DATA_NUMBER); // number id + break; + case CONTACTS_PERSON_PROPERTY_EMAIL: + ret = __ctsvc_put_person_default_data(person_id, id, CTSVC_DATA_EMAIL); // email id + break; + case CONTACTS_PERSON_PROPERTY_IMAGE: + ret = __ctsvc_put_person_default_image(person_id, id); // image id + break; + default: + ret = CONTACTS_ERROR_INVALID_PARAMETER; + break; + } + if (ret < CONTACTS_ERROR_NONE) { + CTS_ERR("contacts_person_set_default_property() Failed(%d) : person property (%d)", ret, property); + ctsvc_end_trans(false); + return ret; + } + +#ifdef _CONTACTS_IPC_SERVER + ctsvc_change_subject_add_changed_person_id(CONTACTS_CHANGE_UPDATED, id); +#endif + ctsvc_set_person_noti(); + ret = ctsvc_end_trans(true); + + return ret; +} + +API int contacts_person_get_default_property(contacts_person_property_e property, int person_id, + int *id) +{ + int ret = CONTACTS_ERROR_NONE; + char query[CTS_SQL_MAX_LEN] = {0}; + + switch(property) { + case CONTACTS_PERSON_PROPERTY_NAME_CONTACT: + snprintf(query, sizeof(query), + "SELECT name_contact_id FROM "CTS_TABLE_PERSONS" WHERE person_id = %d", + person_id); + break; + case CONTACTS_PERSON_PROPERTY_NUMBER: + snprintf(query, sizeof(query), + "SELECT id FROM "CTS_TABLE_DATA" WHERE is_primary_default = 1 AND datatype = %d AND is_my_profile = 0 AND " + "contact_id in (SELECT contact_id FROM "CTS_TABLE_CONTACTS" " + "WHERE person_id = %d AND deleted = 0)", + CTSVC_DATA_NUMBER, person_id); + break; + case CONTACTS_PERSON_PROPERTY_EMAIL: + snprintf(query, sizeof(query), + "SELECT id FROM "CTS_TABLE_DATA" WHERE is_primary_default = 1 AND datatype = %d AND is_my_profile = 0 AND " + "contact_id in (SELECT contact_id FROM "CTS_TABLE_CONTACTS" " + "WHERE person_id = %d AND deleted = 0)", + CTSVC_DATA_EMAIL, person_id); + break; + case CONTACTS_PERSON_PROPERTY_IMAGE: + snprintf(query, sizeof(query), + "SELECT id FROM "CTS_TABLE_DATA" WHERE is_primary_default = 1 AND datatype = %d AND is_my_profile = 0 AND " + "contact_id in (SELECT contact_id FROM "CTS_TABLE_CONTACTS" " + "WHERE person_id = %d AND deleted = 0)", + CTSVC_DATA_IMAGE, person_id); + break; + default: + ret = CONTACTS_ERROR_INVALID_PARAMETER; + break; + } + + if (*query) { + int result = 0; + ret = ctsvc_query_get_first_int_result(query, &result); + RETVM_IF(ret != CONTACTS_ERROR_NONE, ret, "ctsvc_query_get_first_int_result failed(%d)", ret); + *id = result; + } + + return ret; +} + diff --git a/native/ctsvc_person.h b/native/ctsvc_person.h new file mode 100644 index 0000000..677b98d --- /dev/null +++ b/native/ctsvc_person.h @@ -0,0 +1,29 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_PERSON_H__ +#define __TIZEN_SOCIAL_CTSVC_PERSON_H__ + +#include "ctsvc_sqlite.h" + +int ctsvc_person_do_garbage_collection(void); +int ctsvc_person_aggregate(int person_id); +void ctsvc_db_person_delete_callback(sqlite3_context * context, int argc, sqlite3_value ** argv); + +#endif // __TIZEN_SOCIAL_CTSVC_PERSON_H__ diff --git a/native/ctsvc_phonelog.c b/native/ctsvc_phonelog.c new file mode 100644 index 0000000..b8017b0 --- /dev/null +++ b/native/ctsvc_phonelog.c @@ -0,0 +1,107 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_utils.h" +#include "ctsvc_notification.h" + +#ifdef _CONTACTS_IPC_SERVER +#include "ctsvc_server_change_subject.h" +#endif + +API int contacts_phone_log_reset_statistics() +{ + char query[CTS_SQL_MIN_LEN] = {0}; + snprintf(query, sizeof(query),"DELETE FROM "CTS_TABLE_PHONELOG_STAT); + return ctsvc_query_exec(query); +} + +API int contacts_phone_log_delete(contacts_phone_log_delete_e op, ...) +{ + int ret; + int extra_data1; + char query[CTS_SQL_MAX_LEN] = {0}; + char *number = NULL; + va_list args; + + switch(op) { + case CONTACTS_PHONE_LOG_DELETE_BY_ADDRESS: + va_start(args, op); + number = va_arg(args, char *); + va_end(args); + RETV_IF(NULL == number, CONTACTS_ERROR_INVALID_PARAMETER); + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_PHONELOGS" WHERE number = '%s'", number); + break; + case CONTACTS_PHONE_LOG_DELETE_BY_MESSAGE_EXTRA_DATA1: + va_start(args, op); + extra_data1 = va_arg(args, int); + va_end(args); + snprintf(query, sizeof(query), + "DELETE FROM "CTS_TABLE_PHONELOGS" " + "WHERE data1 = %d AND %d <= log_type AND log_type <= %d", + extra_data1, CONTACTS_PLOG_TYPE_MMS_INCOMMING, CONTACTS_PLOG_TYPE_MMS_BLOCKED); + break; + case CONTACTS_PHONE_LOG_DELETE_BY_EMAIL_EXTRA_DATA1: + va_start(args, op); + extra_data1 = va_arg(args, int); + va_end(args); + snprintf(query, sizeof(query), + "DELETE FROM "CTS_TABLE_PHONELOGS" " + "WHERE data1 = %d AND %d <= log_type AND log_type <= %d", + extra_data1, CONTACTS_PLOG_TYPE_EMAIL_RECEIVED, CONTACTS_PLOG_TYPE_EMAIL_SENT); + break; + default: + CTS_ERR("Invalid parameter : the operation is not proper (op : %d)", op); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + ret = ctsvc_begin_trans(); + RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + ctsvc_set_phonelog_noti(); + ret = ctsvc_end_trans(true); + return ret; +} + +void ctsvc_db_phone_log_delete_callback(sqlite3_context * context, + int argc, sqlite3_value ** argv) +{ +#ifdef _CONTACTS_IPC_SERVER + int phone_log_id; + + if (argc < 1) { + sqlite3_result_null(context); + return; + } + + phone_log_id = sqlite3_value_int(argv[0]); + ctsvc_change_subject_add_changed_phone_log_id(CONTACTS_CHANGE_DELETED, phone_log_id); + + sqlite3_result_null(context); + return; +#endif +} diff --git a/native/ctsvc_phonelog.h b/native/ctsvc_phonelog.h new file mode 100644 index 0000000..f03dba7 --- /dev/null +++ b/native/ctsvc_phonelog.h @@ -0,0 +1,27 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_PHONELOG_H__ +#define __TIZEN_SOCIAL_CTSVC_PHONELOG_H__ + +#include "ctsvc_sqlite.h" +void ctsvc_db_phone_log_delete_callback(sqlite3_context * context, + int argc, sqlite3_value ** argv); + +#endif // __TIZEN_SOCIAL_CTSVC_PHONELOG_H__ \ No newline at end of file diff --git a/native/ctsvc_restriction.c b/native/ctsvc_restriction.c new file mode 100755 index 0000000..bc8f27d --- /dev/null +++ b/native/ctsvc_restriction.c @@ -0,0 +1,82 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngjae Shin + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_schema.h" + +static const char *CTS_RESTRICTION_CHECK_FILE="/opt/usr/data/contacts-svc/.CONTACTS_SVC_RESTRICTION_CHECK"; +static TLS int ctsvc_restriction_permit; + +int ctsvc_restriction_init(void) +{ + if (!ctsvc_restriction_permit) { + int fd = open(CTS_RESTRICTION_CHECK_FILE, O_RDONLY); + if (0 <= fd) { + close(fd); + ctsvc_restriction_permit = TRUE; + } else { + CTS_ERR("Restriction Mode"); + } + } + if (!ctsvc_restriction_permit) { + int ret; + const char *query; + query = "CREATE TEMP VIEW "CTS_TABLE_RESTRICTED_DATA_VIEW" AS SELECT * FROM "CTS_TABLE_DATA" WHERE is_restricted != 1 AND is_my_profile = 0"; + + ret = ctsvc_query_exec(query); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "cts_query_exec() Failed(%d)", ret); + } + return CONTACTS_ERROR_NONE; +} + +void ctsvc_restriction_deinit(void) +{ + ctsvc_restriction_permit = FALSE; +} + +int ctsvc_restriction_get_permit(void) +{ + return ctsvc_restriction_permit; +} +#if 0 +/** + * This function make restricted contact. + * If process does not have permission for restriction, this function will be failed. + * + * @param[in] contact The contacts service struct + * @return #CTS_SUCCESS on success, Negative value(#cts_error) on error + */ +API int contacts_svc_struct_set_restriction(CTSstruct *contact) +{ + contact_t *record = (contact_t *)contact; + + RETV_IF(NULL == contact, CTS_ERR_ARG_NULL); + RETV_IF(FALSE == ctsvc_restriction_permit, CTS_ERR_ENV_INVALID); + + record->is_restricted = TRUE; + + return CONTACTS_ERROR_NONE; +} +#endif diff --git a/test/SIMimport-test.c b/native/ctsvc_restriction.h similarity index 74% rename from test/SIMimport-test.c rename to native/ctsvc_restriction.h index 1cbc357..0e4ac6b 100755 --- a/test/SIMimport-test.c +++ b/native/ctsvc_restriction.h @@ -18,18 +18,13 @@ * limitations under the License. * */ -#include -#include +#ifndef __TIZEN_SOCIAL_CTSVC_RESTRICTION_H__ +#define __TIZEN_SOCIAL_CTSVC_RESTRICTION_H__ -int main() -{ - contacts_svc_connect(); +int ctsvc_restriction_init(void); +void ctsvc_restriction_deinit(void); - int ret = contacts_svc_import_sim(); - printf("contacts_svc_import_sim() return %d\n", ret); - - contacts_svc_disconnect(); - return 0; -} +int ctsvc_restriction_get_permit(void); +#endif //__TIZEN_SOCIAL_CTSVC_RESTRICTION_H__ diff --git a/native/ctsvc_schema.h b/native/ctsvc_schema.h new file mode 100755 index 0000000..58cf8e1 --- /dev/null +++ b/native/ctsvc_schema.h @@ -0,0 +1,119 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_SCHEMA_H__ +#define __TIZEN_SOCIAL_CTSVC_SCHEMA_H__ + +#define CTSVC_DB_PATH "/opt/usr/dbspace/.contacts-svc.db" +#define CTSVC_DB_JOURNAL_PATH "/opt/usr/dbspace/.contacts-svc.db-journal" + +// For Security +#define CTS_SECURITY_FILE_GROUP 6005 +#define CTS_SECURITY_DEFAULT_PERMISSION 0660 +#define CTS_SECURITY_DIR_DEFAULT_PERMISSION 0770 + +#define CTS_SCHEMA_TABLE_TOTAL 10 + +// DB Tables +#define CTS_TABLE_PERSONS "persons" +#define CTS_TABLE_CONTACTS "contacts" +#define CTS_TABLE_GROUPS "groups" +#define CTS_TABLE_ADDRESSBOOKS "addressbooks" +#define CTS_TABLE_DATA "data" // This is the data table for contact all fields +#define CTS_TABLE_FAVORITES "favorites" +#define CTS_TABLE_PHONELOGS "phonelogs" +#define CTS_TABLE_PHONELOG_ACC "phonelog_accumulation" +#define CTS_TABLE_PHONELOG_STAT "phonelog_stat" +#define CTS_TABLE_GROUP_RELATIONS "group_relations" +#define CTS_TABLE_DELETEDS "contact_deleteds" +#define CTS_TABLE_GROUP_DELETEDS "group_deleteds" +#define CTS_TABLE_CUSTOM_TYPES "custom_types" +#define CTS_TABLE_SDN "sdn" +#define CTS_TABLE_SPEEDDIALS "speeddials" +#define CTS_TABLE_VERSION "cts_version" +#define CTS_TABLE_MY_PROFILES "my_profiles" +#define CTS_TABLE_CONTACT_STAT "contact_stat" +#define CTS_TABLE_SEARCH_INDEX "search_index" +#define CTS_TABLE_ACTIVITIES "activities" +#define CTS_TABLE_ACTIVITY_PHOTOS "activity_photos" + +#define CTS_TABLE_RESTRICTED_DATA_VIEW "restricted_data" + +// DB views ///////////////////////////////////////////////////////////////////// +#define CTSVC_DB_VIEW_PERSON "view_person" +#define CTSVC_DB_VIEW_CONTACT "view_contact" + +#define CTSVC_DB_VIEW_NAME "view_name" +#define CTSVC_DB_VIEW_NUMBER "view_number" +#define CTSVC_DB_VIEW_EMAIL "view_email" +#define CTSVC_DB_VIEW_ADDRESS "view_address" +#define CTSVC_DB_VIEW_URL "view_url" +#define CTSVC_DB_VIEW_EVENT "view_event" +#define CTSVC_DB_VIEW_RELATIONSHIP "view_relationship" +#define CTSVC_DB_VIEW_IMAGE "view_image" +#define CTSVC_DB_VIEW_COMPANY "view_company" +#define CTSVC_DB_VIEW_GROUP_RELATION "view_group_relation" +#define CTSVC_DB_VIEW_NICKNAME "view_nickname" +#define CTSVC_DB_VIEW_MESSENGER "view_messenger" +#define CTSVC_DB_VIEW_NOTE "view_note" +#define CTSVC_DB_VIEW_PROFILE "view_profile" +#define CTSVC_DB_VIEW_EXTENSION "view_extension" + +#define CTSVC_DB_VIEW_ACTIVITY "view_activity" +#define CTSVC_DB_VIEW_SPEEDIDAL "view_speeddial" + +//#define CTSVC_DB_VIEW_GROUPS_UPDATED_INFO "view_group_changes" +#define CTSVC_DB_VIEW_GROUPS_MEMBER_UPDATED_INFO "view_group_member_changes" +//#define CTSVC_DB_VIEW_CONTACTS_UPDATED_INFO "view_contacts_changes" + +#define CTSVC_DB_VIEW_PERSON_CONTACT "view_person_contact" +#define CTSVC_DB_VIEW_PERSON_NUMBER "view_person_contact_number" +#define CTSVC_DB_VIEW_PERSON_EMAIL "view_person_contact_email" +#define CTSVC_DB_VIEW_PERSON_GROUP "view_person_contact_group" + +#define CTSVC_DB_VIEW_PERSON_PHONELOG "view_person_contact_phonelog" +#define CTSVC_DB_VIEW_PERSON_USAGE "view_person_usage" + +#define CTSVC_DB_VIEW_CONTACT_NUMBER "view_contact_number" +#define CTSVC_DB_VIEW_CONTACT_EMAIL "view_contact_email" +#define CTSVC_DB_VIEW_CONTACT_GROUP "view_contact_group" + +#define CTSVC_DB_VIEW_CONTACT_ACTIVITY "view_contact_activity" + +#define CTSVC_DB_VIEW_PHONELOG_NUMBER "view_phonelog_number" + +///////////////////////////////////////////////////////////////////////////////// + +#define CTS_SCHEMA_DATA_NAME_LANG_INFO "data1" +#define CTS_SCHEMA_DATA_NAME_LOOKUP "data7" +#define CTS_SCHEMA_DATA_NAME_REVERSE_LOOKUP "data8" + +#define CTS_SCHEMA_SQLITE_SEQ "sqlite_sequence" + +#define CTS_SCHEMA_DISPLAY_NAME "display_name" +#define CTS_SCHEMA_REVERSE_DISPLAY_NAME "reverse_display_name" +#define CTS_SCHEMA_SORTKEY "sortkey" +#define CTS_SCHEMA_REVERSE_SORTKEY "reverse_sortkey" + + +#endif /* __TIZEN_SOCIAL_CTSVC_SCHEMA_H__ */ diff --git a/native/ctsvc_service.c b/native/ctsvc_service.c new file mode 100644 index 0000000..391b6c5 --- /dev/null +++ b/native/ctsvc_service.c @@ -0,0 +1,195 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_socket.h" +#include "ctsvc_mutex.h" +#include "ctsvc_inotify.h" +#include "ctsvc_db_init.h" +#include "ctsvc_setting.h" + +#ifndef _CONTACTS_IPC_CLIENT +static int ctsvc_connection = 0; +static __thread int thread_connection = 0; +#endif + +API int contacts_connect2() +{ + CTS_FN_CALL; + int ret; + +#ifndef _CONTACTS_IPC_CLIENT + ctsvc_mutex_lock(CTS_MUTEX_CONNECTION); + if (0 == ctsvc_connection) { + ret = ctsvc_socket_init(); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_socket_init() Failed(%d)", ret); + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + return ret; + } + ret = ctsvc_inotify_init(); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_inotify_init() Failed(%d)", ret); + ctsvc_socket_final(); + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + return ret; + } + ctsvc_db_plugin_init(); + ctsvc_view_uri_init(); + ctsvc_register_vconf(); + } + else + CTS_DBG("System : Contacts service has been already connected"); + + ctsvc_connection++; + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); +#endif + + if (0 == thread_connection) { + ret = ctsvc_db_init(); + if (ret != CONTACTS_ERROR_NONE) { + CTS_ERR("ctsvc_db_init() Failed(%d)", ret); + return ret; + } + } + thread_connection++; + + return CONTACTS_ERROR_NONE; +} + +API int contacts_connect_with_flags(unsigned int flags) +{ + CTS_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + + ret = contacts_connect2(); + if (ret == CONTACTS_ERROR_NONE) + return ret; + + if (flags & CONTACTS_CONNECT_FLAG_RETRY) { + int i; + int waiting_time = 500; + for (i=0;i<6;i++) { + usleep(waiting_time * 1000); + DBG("retry cnt=%d, ret=%x, %d",(i+1), ret, waiting_time); + ret = contacts_connect2(); + if (ret == CONTACTS_ERROR_NONE) + break; + waiting_time *= 2; + } + } + + return ret; +} + +API int contacts_disconnect2() +{ + if (1 == thread_connection) + ctsvc_db_deinit(); + else if (thread_connection <= 0) { + CTS_DBG("System : please call contacts_connect_on_thread(), thread_connection count is (%d)", thread_connection); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + thread_connection--; + +#ifndef _CONTACTS_IPC_CLIENT + ctsvc_mutex_lock(CTS_MUTEX_CONNECTION); + if (1 == ctsvc_connection) { + ctsvc_socket_final(); + ctsvc_inotify_close(); + ctsvc_deregister_vconf(); + ctsvc_view_uri_deinit(); + ctsvc_db_plugin_deinit(); + } + else if (1 < ctsvc_connection) + CTS_DBG("System : connection count is %d", ctsvc_connection); + else { + CTS_DBG("System : please call contacts_connect2(), connection count is (%d)", ctsvc_connection); + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + ctsvc_connection--; + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); +#endif + + + return CONTACTS_ERROR_NONE; +} + +API int contacts_connect_on_thread() +{ + int ret; + + ctsvc_mutex_lock(CTS_MUTEX_CONNECTION); + + if (0 == thread_connection) + { + ret = ctsvc_db_init(); + if (ret != CONTACTS_ERROR_NONE) + { + CTS_ERR("ctsvc_db_init() Failed(%d)", ret); + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + return ret; + } + } + else + { + CTS_DBG("System : db connection on thread already exist"); + } + thread_connection++; + + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + + return CONTACTS_ERROR_NONE; +} + +API int contacts_disconnect_on_thread() +{ + ctsvc_mutex_lock(CTS_MUTEX_CONNECTION); + + if (1 == thread_connection) + { + ctsvc_db_deinit(); + } + else if (thread_connection <= 0) + { + CTS_DBG("System : please call contacts_connect_on_thread(), connection count is (%d)", thread_connection); + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + else + { + CTS_DBG("System : db connection on thread count is (%d)", thread_connection); + } + + thread_connection--; + + ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); + + return CONTACTS_ERROR_NONE; +} diff --git a/native/ctsvc_service.h b/native/ctsvc_service.h new file mode 100644 index 0000000..52af4fc --- /dev/null +++ b/native/ctsvc_service.h @@ -0,0 +1,29 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_SERVICE_H__ +#define __TIZEN_SOCIAL_CTSVC_SERVICE_H__ + + +#endif /* __TIZEN_SOCIAL_CTSVC_SERVICE_H__ */ + diff --git a/native/ctsvc_sqlite.c b/native/ctsvc_sqlite.c new file mode 100755 index 0000000..f2bfdad --- /dev/null +++ b/native/ctsvc_sqlite.c @@ -0,0 +1,270 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_notification.h" + +#include "ctsvc_db_init.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_db_plugin_person_helper.h" + +#include "ctsvc_phonelog.h" +#include "ctsvc_person.h" + +static __thread sqlite3 *ctsvc_db = NULL; + +static inline int __ctsvc_db_busyhandler(void *pData, int count) +{ + if(10 - count > 0) { + CTS_DBG("Busy Handler Called! : PID(%d) / CNT(%d)\n", getpid(), count+1); + usleep(20000); + return 1; + } else { + CTS_DBG("Busy Handler will be returned SQLITE_BUSY error : PID(%d) \n", getpid()); + return 0; + } +} + +int ctsvc_db_open(void) { + CTS_FN_CALL; + int ret; + + if (!ctsvc_db) { + ret = db_util_open(CTSVC_DB_PATH, &ctsvc_db, 0); + RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB /*CTS_ERR_DB_NOT_OPENED*/, + "DB error : db_util_open() Failed(%d)", ret); + ret = sqlite3_create_function(ctsvc_db, "_CONTACT_DELETE_", 3, SQLITE_UTF8, NULL, + ctsvc_db_contact_delete_callback, NULL, NULL); + RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB, + "sqlite3_create_function() Failed(%d)", ret); + ret = sqlite3_create_function(ctsvc_db, "_DATA_DELETE_", 2, SQLITE_UTF8, NULL, + ctsvc_db_data_delete_callback, NULL, NULL); + RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB, + "sqlite3_create_function() Failed(%d)", ret); + ret = sqlite3_create_function(ctsvc_db, "_NORMALIZE_INDEX_", 1, SQLITE_UTF8, NULL, + ctsvc_db_normalize_str_callback, NULL, NULL); + RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB, + "sqlite3_create_function() Failed(%d)", ret); + ret = sqlite3_create_function(ctsvc_db, "_PHONE_LOG_DELETE_", 1, SQLITE_UTF8, NULL, + ctsvc_db_phone_log_delete_callback, NULL, NULL); + RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB, + "sqlite3_create_function() Failed(%d)", ret); + ret = sqlite3_create_function(ctsvc_db, "_PERSON_DELETE_", 1, SQLITE_UTF8, NULL, + ctsvc_db_person_delete_callback, NULL, NULL); + RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB, + "sqlite3_create_function() Failed(%d)", ret); + + /* Register Busy handler */ + ret = sqlite3_busy_handler(ctsvc_db, __ctsvc_db_busyhandler, NULL); + RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB, + "sqlite3_busy_handler() Failed(%d)", ret); + } + return CONTACTS_ERROR_NONE /*CTS_SUCCESS*/; +} + +int ctsvc_db_close(void) { + int ret = 0; + + if (ctsvc_db) { + ret = db_util_close(ctsvc_db); + WARN_IF(SQLITE_OK != ret, "db_util_close() Failed(%d)", ret); + ctsvc_db = NULL; + CTS_DBG("The database disconnected really."); + } + + return CONTACTS_ERROR_NONE /*CTS_SUCCESS*/; +} + +int cts_db_change(void) { + return sqlite3_changes(ctsvc_db); +} + +int cts_db_get_last_insert_id(void) { + return sqlite3_last_insert_rowid(ctsvc_db); +} + +int cts_db_get_next_id(const char *table) { + int id; + int ret; + char query[CTS_SQL_MAX_LEN] = { 0 }; + + snprintf(query, sizeof(query), "SELECT seq FROM %s WHERE name = '%s'", + CTS_SCHEMA_SQLITE_SEQ, table); + + ret = ctsvc_query_get_first_int_result(query, &id); + if (ret != CONTACTS_ERROR_NONE /*CTS_SUCCESS*/) { + if (CONTACTS_ERROR_NO_DATA /*CONTACTS_ERR_DB_RECORD_NOT_FOUND*/ == ret) + return 1; + else + return id; + } else { + return (1 + id); + } +} + +int ctsvc_query_get_first_int_result(const char *query, int *result) { + int ret; + cts_stmt stmt = NULL; + RETVM_IF(NULL == ctsvc_db, CONTACTS_ERROR_DB /*CTS_ERR_DB_NOT_OPENED*/, "DB error : Database is not opended"); + + ret = sqlite3_prepare_v2(ctsvc_db, query, strlen(query), &stmt, NULL); + RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB, + "DB error : sqlite3_prepare_v2(%s) Failed(%s)", query, sqlite3_errmsg(ctsvc_db)); + + ret = sqlite3_step(stmt); + if (SQLITE_ROW != ret) { + sqlite3_finalize(stmt); + if (SQLITE_DONE == ret) { + INFO("sqlite3_step() return with SQLITE_DONE (it means NO_DATA) (%s, %d, %s)", + query, ret, sqlite3_errmsg(ctsvc_db)); + + return CONTACTS_ERROR_NO_DATA /*CONTACTS_ERR_DB_RECORD_NOT_FOUND*/; + } + + CTS_ERR("sqlite3_step() Failed(%s, %d, %s)", + query, ret, sqlite3_errmsg(ctsvc_db)); + + return CONTACTS_ERROR_DB; + } + + *result = sqlite3_column_int(stmt, 0); + sqlite3_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_query_exec(const char *query) { + int ret; + char *err_msg = NULL; + + RETVM_IF(NULL == ctsvc_db, CONTACTS_ERROR_DB /*CTS_ERR_DB_NOT_OPENED*/, "DB error : Database is not opended"); + CTS_DBG("query : %s", query); + + ret = sqlite3_exec(ctsvc_db, query, NULL, NULL, &err_msg); + if (SQLITE_OK != ret) { + CTS_ERR("sqlite3_exec(%s) Failed(%d, %s)", query, ret, err_msg); + sqlite3_free(err_msg); + switch (ret) { + case SQLITE_BUSY: + case SQLITE_LOCKED: + return CONTACTS_ERROR_DB /*CTS_ERR_DB_LOCK*/; + case SQLITE_IOERR: + return CONTACTS_ERROR_DB /*CTS_ERR_IO_ERR*/; + case SQLITE_FULL: + return CONTACTS_ERROR_FILE_NO_SPACE /*CTS_ERR_NO_SPACE*/; + default: + return CONTACTS_ERROR_DB; + } + } + + return CONTACTS_ERROR_NONE /*CTS_SUCCESS*/; +} + +cts_stmt cts_query_prepare(char *query) { + int ret = -1; + cts_stmt stmt = NULL; + + RETVM_IF(NULL == ctsvc_db, NULL, "DB error : Database is not opended"); + CTS_DBG("prepare query : %s", query); + + ret = sqlite3_prepare_v2(ctsvc_db, query, strlen(query), &stmt, NULL); + RETVM_IF(SQLITE_OK != ret, NULL, "DB error : sqlite3_prepare_v2(%s) Failed(%s)", + query, sqlite3_errmsg(ctsvc_db)); + + return stmt; +} + +int ctsvc_stmt_get_first_int_result(cts_stmt stmt, int *result) { + int ret; + RETVM_IF(NULL == ctsvc_db, CONTACTS_ERROR_DB /*CTS_ERR_DB_NOT_OPENED*/, "DB error : Database is not opended"); + + ret = sqlite3_step(stmt); + if (SQLITE_ROW != ret) { + CTS_ERR("sqlite3_step() Failed(%d, %s)", ret, sqlite3_errmsg(ctsvc_db)); + sqlite3_finalize(stmt); + if (SQLITE_DONE == ret) + return CONTACTS_ERROR_NO_DATA /*CONTACTS_ERR_DB_RECORD_NOT_FOUND*/; + return CONTACTS_ERROR_DB; + } + + *result = sqlite3_column_int(stmt, 0); + sqlite3_finalize(stmt); + + return CONTACTS_ERROR_NONE; +} + +int cts_stmt_step(cts_stmt stmt) { + int ret; + ret = sqlite3_step(stmt); + switch (ret) { + case SQLITE_BUSY: + case SQLITE_LOCKED: + ret = CONTACTS_ERROR_DB /*CTS_ERR_DB_LOCK*/; + break; + case SQLITE_IOERR: + ret = CONTACTS_ERROR_DB /*CTS_ERR_IO_ERR*/; + break; + case SQLITE_FULL: + ret = CONTACTS_ERROR_FILE_NO_SPACE /*CTS_ERR_NO_SPACE*/; + break; + case SQLITE_CONSTRAINT: + ret = CONTACTS_ERROR_DB /*CTS_ERR_ALREADY_EXIST*/; + break; + case SQLITE_ROW: + ret = 1 /*CTS_TRUE*/; + break; + case SQLITE_DONE: + ret = CONTACTS_ERROR_NONE /*CTS_SUCCESS*/; + break; + case SQLITE_CORRUPT: + ASSERT_NOT_REACHED("the database disk image is malformed"); + ret = CONTACTS_ERROR_DB; + break; + default: + CTS_ERR("sqlite3_step() Failed(%d)", ret); + ret = CONTACTS_ERROR_DB; + break; + } + return ret; +} + +void cts_stmt_reset(cts_stmt stmt) { + sqlite3_reset(stmt); + sqlite3_clear_bindings(stmt); +} + +void cts_stmt_finalize(cts_stmt stmt) { + int ret; + + if (NULL == stmt) + return; + + ret = sqlite3_finalize(stmt); + WARN_IF(ret != SQLITE_OK, "sqlite3_finalize Failed(%d, %s)", + ret, sqlite3_errmsg(ctsvc_db)); +} + diff --git a/src/cts-sqlite.h b/native/ctsvc_sqlite.h similarity index 55% rename from src/cts-sqlite.h rename to native/ctsvc_sqlite.h index 044a3d4..696b36d 100755 --- a/src/cts-sqlite.h +++ b/native/ctsvc_sqlite.h @@ -3,7 +3,9 @@ * * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. * - * Contact: Youngjae Shin + * Contact: Dohyung Jin + * Jongwon Lee + * Donghee Ye * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,34 +20,46 @@ * limitations under the License. * */ -#ifndef __CTS_SQLITE_H__ -#define __CTS_SQLITE_H__ + +#ifndef __TIZEN_SOCIAL_CTSVC_SQLITE_H__ +#define __TIZEN_SOCIAL_CTSVC_SQLITE_H__ #include -#include "cts-struct.h" #define CTS_SQL_MAX_LEN 2048 //normal string length #define CTS_SQL_MIN_LEN 1024 //short sql string length typedef sqlite3_stmt* cts_stmt; -//////////////////// iterator //////////////////// - -int cts_db_open(void); -int cts_db_close(void); +int ctsvc_db_open(void); +int ctsvc_db_close(void); int cts_db_change(); int cts_db_get_last_insert_id(void); int cts_db_get_next_id(const char *table); -int cts_query_get_first_int_result(const char *query); -int cts_query_exec(char *query); +int ctsvc_query_get_first_int_result(const char *query, int *result); +int ctsvc_query_exec(const char *query); cts_stmt cts_query_prepare(char *query); int cts_stmt_step(cts_stmt stmt); void cts_stmt_reset(cts_stmt stmt); void cts_stmt_finalize(cts_stmt stmt); -int cts_stmt_get_first_int_result(cts_stmt stmt); +int ctsvc_stmt_get_first_int_result(cts_stmt stmt, int *result); + + +static inline double ctsvc_stmt_get_dbl(cts_stmt stmt, int pos) { + return sqlite3_column_double(stmt, pos); +} +static inline int ctsvc_stmt_get_int(cts_stmt stmt, int pos) { + return sqlite3_column_int(stmt, pos); +} +static inline char* ctsvc_stmt_get_text(cts_stmt stmt, int pos) { + return (char *)sqlite3_column_text(stmt, pos); +} +static inline long long int ctsvc_stmt_get_int64(cts_stmt stmt, int pos) { + return sqlite3_column_int64(stmt, pos); +} static inline int cts_stmt_bind_int(cts_stmt stmt, int pos, int num) { return sqlite3_bind_int(stmt, pos, num); @@ -61,29 +75,4 @@ static inline int cts_stmt_bind_copy_text(cts_stmt stmt, int pos, int cts_stmt_bind_copy_text(cts_stmt stmt, int pos, const char *str, int strlen); -int cts_stmt_bind_name(cts_stmt stmt, int start_cnt, cts_name *name_struct); -int cts_stmt_bind_postal(cts_stmt stmt, int start_cnt, cts_postal *postal_struct); -int cts_stmt_bind_company(cts_stmt stmt, int start_cnt, cts_company *company_struct); -int cts_stmt_bind_web(cts_stmt stmt, int start_cnt, cts_web *web_struct); -int cts_stmt_bind_messenger(cts_stmt stmt, int start_cnt, cts_messenger *im_struct); -int cts_stmt_bind_event(cts_stmt stmt, int start_cnt, cts_event *event_struct); -int cts_stmt_bind_extend(cts_stmt stmt, int start_cnt, cts_extend *extend_struct); - -static inline double cts_stmt_get_dbl(cts_stmt stmt, int pos) { - return sqlite3_column_double(stmt, pos); -} -static inline int cts_stmt_get_int(cts_stmt stmt, int pos) { - return sqlite3_column_int(stmt, pos); -} -static inline char* cts_stmt_get_text(cts_stmt stmt, int pos) { - return (char *)sqlite3_column_text(stmt, pos); -} - -int cts_stmt_get_addressbook(cts_stmt stmt, cts_addrbook *ab); -int cts_stmt_get_number(cts_stmt stmt, cts_number *result, int start_cnt); -int cts_stmt_get_email(cts_stmt stmt, cts_email *result, int start_cnt); -int cts_stmt_get_name(cts_stmt stmt, cts_name *result, int start_cnt); - - -#endif //__CTS_SQLITE_H__ - +#endif //__TIZEN_SOCIAL_CTSVC_SQLITE_H__ diff --git a/native/ctsvc_utils.c b/native/ctsvc_utils.c new file mode 100644 index 0000000..2fb1051 --- /dev/null +++ b/native/ctsvc_utils.c @@ -0,0 +1,428 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +#include +#include +#include +#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_utils.h" +#include "ctsvc_mutex.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_schema.h" +#include "ctsvc_notification.h" +#include "ctsvc_struct.h" + +#ifdef _CONTACTS_IPC_SERVER +#include "ctsvc_server_change_subject.h" +#endif + +static __thread int transaction_count = 0; +static __thread int transaction_ver = 0; +static __thread bool version_up = false; + +#define CTS_COMMIT_TRY_MAX 500000 // For 3second +int ctsvc_begin_trans(void) +{ + int ret = -1, progress; + +#ifndef _CONTACTS_IPC_SERVER + ctsvc_mutex_lock(CTS_MUTEX_TRANSACTION); +#endif + if (transaction_count <= 0) { + ret = ctsvc_query_exec("BEGIN IMMEDIATE TRANSACTION"); //taken 600ms + progress = 100000; + while (CONTACTS_ERROR_DB == ret && progress < CTS_COMMIT_TRY_MAX) { + usleep(progress); + ret = ctsvc_query_exec("BEGIN IMMEDIATE TRANSACTION"); + progress *= 2; + } + if(CONTACTS_ERROR_NONE != ret) { + CTS_ERR("ctsvc_query_exec() Failed(%d)", ret); +#ifndef _CONTACTS_IPC_SERVER + ctsvc_mutex_unlock(CTS_MUTEX_TRANSACTION); +#endif + return ret; + } + + transaction_count = 0; + + const char *query = "SELECT ver FROM "CTS_TABLE_VERSION; + ret = ctsvc_query_get_first_int_result(query, &transaction_ver); + version_up = false; + } + transaction_count++; + INFO("transaction_count : %d.", transaction_count); +#ifndef _CONTACTS_IPC_SERVER + ctsvc_mutex_unlock(CTS_MUTEX_TRANSACTION); +#endif + return CONTACTS_ERROR_NONE; +} + +int ctsvc_end_trans(bool is_success) +{ + int ret = -1, progress; + char query[CTS_SQL_MIN_LEN] = {0}; + +#ifndef _CONTACTS_IPC_SERVER + ctsvc_mutex_lock(CTS_MUTEX_TRANSACTION); +#endif + + transaction_count--; + INFO("%s, transaction_count : %d", is_success?"True": "False", transaction_count); + + if (0 != transaction_count) { + CTS_DBG("contact transaction_count : %d.", transaction_count); +#ifndef _CONTACTS_IPC_SERVER + ctsvc_mutex_unlock(CTS_MUTEX_TRANSACTION); +#endif + return CONTACTS_ERROR_NONE; + } + + if (false == is_success) { + ctsvc_nofitication_cancel(); +#ifdef _CONTACTS_IPC_SERVER + ctsvc_change_subject_clear_changed_info(); +#endif + ret = ctsvc_query_exec("ROLLBACK TRANSACTION"); + +#ifndef _CONTACTS_IPC_SERVER + ctsvc_mutex_unlock(CTS_MUTEX_TRANSACTION); +#endif + return CONTACTS_ERROR_NONE; + } + + if (version_up) { + transaction_ver++; + snprintf(query, sizeof(query), "UPDATE %s SET ver = %d", + CTS_TABLE_VERSION, transaction_ver); + ret = ctsvc_query_exec(query); + WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_query_exec(version up) Failed(%d)", ret); + } + + progress = 100000; + ret = ctsvc_query_exec("COMMIT TRANSACTION"); + while (CONTACTS_ERROR_DB == ret && progressd_name); + if ('.' != *file_info->d_name) { + if (0 == index || !strncmp(tmp_path, file_info->d_name, strlen(tmp_path))) { + if (dest) { + snprintf(dest, dest_size, "%s/%s", dir, file_info->d_name); + ret_val = dest; + } else { + snprintf(tmp_path, sizeof(tmp_path), "%s/%s", dir, file_info->d_name); + ret_val = strdup(tmp_path); + } + closedir(dp); + return ret_val; + } + } + } + closedir(dp); + } + + return NULL; +} + +static inline bool ctsvc_check_available_image_space(void){ + int ret; + struct statfs buf; + long long size; + ret = statfs(CTS_IMG_FULL_LOCATION, &buf); + + RETVM_IF(ret!=0, false, "statfs Failed(%d)", ret); + + size = buf.f_bavail * (buf.f_bsize); + + if (size > 1024*1024) // if available space to copy a image is larger than 1M + return true; + return false; +} + +static int image_size = 480; +static int __ctsvc_resize_and_copy_image(const char *src, const char *dest) +{ + image_util_error_e ret; + int width = 0, height = 0; + unsigned int size_decode = 0; + int resized_width, resized_height; + unsigned char * img_target = 0; + unsigned char * img_source = 0; + const image_util_colorspace_e colorspace = IMAGE_UTIL_COLORSPACE_I420; + + // load jpeg sample file + CTS_DBG("src : %s, dest : %s", src, dest); + ret = image_util_decode_jpeg( src, colorspace, &img_source, &width, &height, &size_decode ); + RETVM_IF(ret!=IMAGE_UTIL_ERROR_NONE, CONTACTS_ERROR_INTERNAL, "image_util_decode_jpeg failed(%d)", ret); + +#if 0 + if (0>image_size) { + int w,h; + ecore_x_window_size_get( + ecore_x_window_root_get(ecore_x_window_focus_get()) + , &w, &h); + + if (w>h) + image_size = h; + else + image_size = w; + + } +#endif + + if (width > image_size || height > image_size) { + if (image_size<=0 || width <=0 || height <= 0) { + free(img_source); + CTS_ERR("image size error(%d)", image_size); + return CONTACTS_ERROR_INTERNAL; + } + + if (width>height) { + resized_width = image_size; + resized_height = height*image_size/width; + } + else { + resized_height = image_size; + resized_width = width*image_size/height; + } + CTS_DBG("size(%d, %d) -> resize(%d,%d)", width, height, resized_width, resized_height); + + image_util_calculate_buffer_size(resized_width, resized_height, colorspace , &size_decode); + + img_target = malloc( size_decode ); + // do resize + ret = image_util_resize( img_target, &resized_width, &resized_height, + img_source, width, height, colorspace ); + if (ret!=IMAGE_UTIL_ERROR_NONE) { + CTS_ERR("image_util_resize failed(%d)", ret); + free( img_target ); + free( img_source ); + return CONTACTS_ERROR_INTERNAL; + } + + ret = image_util_encode_jpeg(img_target, resized_width, resized_height, colorspace, 100, dest ); + free( img_target ); + free( img_source ); + RETVM_IF(ret!=IMAGE_UTIL_ERROR_NONE, CONTACTS_ERROR_INTERNAL, "image_util_encode_jpeg failed(%d)", ret); + } + else { + resized_width = width; + resized_height = height; + + ret = image_util_encode_jpeg(img_source, resized_width, resized_height, colorspace, 100, dest ); + free( img_source ); + RETVM_IF(ret!=IMAGE_UTIL_ERROR_NONE, CONTACTS_ERROR_INTERNAL, "image_util_encode_jpeg failed(%d)", ret); + } + + return CONTACTS_ERROR_NONE; +} + +#define CTSVC_COPY_SIZE_MAX 4096 +int ctsvc_copy_image(const char *src, const char *dest) +{ + int ret; + int size; + int src_fd, dest_fd; + char buf[CTSVC_COPY_SIZE_MAX] = {0}; + + if (!ctsvc_check_available_image_space()) + return CONTACTS_ERROR_FILE_NO_SPACE; + + ret = __ctsvc_resize_and_copy_image(src, dest); + if (CONTACTS_ERROR_NONE == ret) + return ret; + + src_fd = open(src, O_RDONLY); + RETVM_IF(src_fd < 0, CONTACTS_ERROR_SYSTEM, "System : Open(src:%s) Failed(%d)", src, errno); + dest_fd = open(dest, O_WRONLY|O_CREAT|O_TRUNC, 0660); + if (dest_fd < 0) { + CTS_ERR("Open(dest:%s) Failed(%d)", dest, errno); + close(src_fd); + return CONTACTS_ERROR_SYSTEM; + } + + while ((size = read(src_fd, buf, CTSVC_COPY_SIZE_MAX)) > 0) { + ret = write(dest_fd, buf, size); + if (ret <= 0) { + if (EINTR == errno) + continue; + else { + CTS_ERR("write() Failed(%d)", errno); + if (ENOSPC == errno) + ret = CONTACTS_ERROR_SYSTEM; // No space + else + ret = CONTACTS_ERROR_SYSTEM; // IO error + close(src_fd); + close(dest_fd); + unlink(dest); + return ret; + } + } + } + + ret = fchown(dest_fd, getuid(), CTS_SECURITY_FILE_GROUP); + if (0 != ret) + CTS_ERR("fchown(%s) Failed(%d)", dest, ret); + ret = fchmod(dest_fd, CTS_SECURITY_DEFAULT_PERMISSION); + if (0 != ret) + CTS_ERR("fchmod(%s) Failed(%d)", dest, ret); + close(src_fd); + close(dest_fd); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_change_image(const char *dir, int index, const char *path, char *image, int image_len) +{ + int ret; + char dest[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0}; + + if (ctsvc_get_image(dir, index, dest, sizeof(dest))) { + if (path && 0 == strcmp(dest, path)) + return CONTACTS_ERROR_NONE; + ret = unlink(dest); + RETVM_IF(ret < 0, CONTACTS_ERROR_SYSTEM, "System : unlink(%s) Failed(%d)", dest, errno); + } + + if (path) { + char *ext; + int len; + ext = strrchr(path, '.'); + if (NULL == ext || strchr(ext, '/')) + ext = ""; + + snprintf(dest, sizeof(dest), "%s/%d%s", + dir, index, ext); + ret = ctsvc_copy_image(path, dest); + RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_copy_image() Failed(%d)", ret); + len = strlen(dest) - strlen(dir); + if (image_len < len) { + CTS_ERR("The image_len is too short. It should be greater than %d", len); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + snprintf(image, image_len, "%d%s", index, ext); + } + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_get_next_ver(void) +{ + const char *query; + int version; + + if (0 < transaction_count) { + version_up = true; + return transaction_ver + 1; + } + + query = "SELECT ver FROM "CTS_TABLE_VERSION; + ctsvc_query_get_first_int_result(query, &version); + return (1 + version); +} + +int ctsvc_get_current_version( int* out_current_version ){ + if (transaction_count <= 0) { + int ret; + int version = 0; + const char *query = "SELECT ver FROM "CTS_TABLE_VERSION; + ret = ctsvc_query_get_first_int_result(query, &version); + *out_current_version = version; + } + else + *out_current_version = transaction_ver; + return CONTACTS_ERROR_NONE; +} + + diff --git a/native/ctsvc_utils.h b/native/ctsvc_utils.h new file mode 100644 index 0000000..adbe165 --- /dev/null +++ b/native/ctsvc_utils.h @@ -0,0 +1,35 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_SOCIAL_CTSVC_UTILS_H__ +#define __TIZEN_SOCIAL_CTSVC_UTILS_H__ + +const char* ctsvc_get_display_column(void); +const char* ctsvc_get_sort_column(void); + +int ctsvc_begin_trans(void); +int ctsvc_end_trans(bool is_success); +int ctsvc_get_next_ver(void); +int ctsvc_get_current_version( int* out_current_version ); + +char* ctsvc_get_image(const char *dir, int index, char *dest, int dest_size); +int ctsvc_change_image(const char *dir, int index, const char *path, char *image, int image_len); +int ctsvc_copy_image(const char *src, const char *dest); + +#endif /* __TIZEN_SOCIAL_CTSVC_UTILS_H__ */ diff --git a/packaging/contacts-service.service b/packaging/contacts-service.service new file mode 100644 index 0000000..6eabc36 --- /dev/null +++ b/packaging/contacts-service.service @@ -0,0 +1,13 @@ +[Unit] +Description=Start the Contacts service helper service + +[Service] +ExecStart=/usr/bin/contacts-service-ipcd +Nice=5 +OOMScoreAdjust=-100 +Restart=always +RestartSec=2 + +[Install] +WantedBy=tizen-middleware.target + diff --git a/packaging/contacts-service.spec b/packaging/contacts-service.spec index f86c8e3..dfd2c38 100644 --- a/packaging/contacts-service.spec +++ b/packaging/contacts-service.spec @@ -1,14 +1,11 @@ Name: contacts-service Summary: Contacts Service -Version: 0.4.2 +Version: 0.9.24.8 Release: 1 Group: TO_BE/FILLED_IN -License: Apache 2.0 +License: Apache-2.0 Source0: %{name}-%{version}.tar.gz -Requires(post): /sbin/ldconfig -Requires(post): /usr/bin/sqlite3 -Requires(post): /usr/bin/vconftool -Requires(postun): /sbin/ldconfig +Source1: contacts-service.service BuildRequires: cmake BuildRequires: vconf-keys-devel BuildRequires: pkgconfig(db-util) @@ -18,17 +15,33 @@ BuildRequires: pkgconfig(sqlite3) BuildRequires: pkgconfig(tapi) BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(icu-i18n) +BuildRequires: pkgconfig(capi-base-common) +BuildRequires: pkgconfig(capi-media-image-util) +BuildRequires: pkgconfig(pims-ipc) +BuildRequires: pkgconfig(badge) +Requires(post): /usr/bin/sqlite3, /bin/chmod, /bin/chown +Requires(post): /usr/bin/vconftool +Requires(post): /sbin/ldconfig +Requires(postun): /sbin/ldconfig %description Contacts Service Library -%package devel -Summary: Contacts Service (devel) +%package -n contacts-service2 +Summary: New Contacts service library +Group: Development/Libraries + +%description -n contacts-service2 +New Contact Serivce Library + + +%package -n contacts-service2-devel +Summary: New Contacts Service (devel) Group: Development/Libraries -Requires: %{name} = %{version}-%{release} +Requires: %{name}2 = %{version}-%{release} -%description devel -Contacts Service Library (devel) +%description -n contacts-service2-devel +New Contacts Service Library (devel) %prep %setup -q @@ -38,47 +51,73 @@ Contacts Service Library (devel) cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -make %{?jobs:-j%jobs} +make %{?_smp_mflags} %install rm -rf %{buildroot} %make_install -%post -/sbin/ldconfig -contacts-svc-helper schema -chown :6005 /opt/dbspace/.contacts-svc.db -chown :6005 /opt/dbspace/.contacts-svc.db-journal +mkdir -p %{buildroot}%{_sysconfdir}/rc.d/rc3.d/ +mkdir -p %{buildroot}%{_sysconfdir}/rc.d/rc5.d/ +ln -s ../init.d/contacts-service-ipcd.sh %{buildroot}%{_sysconfdir}/rc.d/rc3.d/S50contacts-svc-helper +ln -s ../init.d/contacts-service-ipcd.sh %{buildroot}%{_sysconfdir}/rc.d/rc5.d/S50contacts-svc-helper -vconftool set -t int db/service/contacts/default_lang 1 -vconftool set -t int db/service/contacts/name_sorting_order 0 -g 6005 -vconftool set -t int db/service/contacts/name_display_order 0 -g 6005 +mkdir -p %{buildroot}%{_libdir}/systemd/user/tizen-middleware.target.wants +install -m 0644 %SOURCE1 %{buildroot}%{_libdir}/systemd/user/contacts-service.service +ln -s ../contacts-service.service %{buildroot}%{_libdir}/systemd/user/tizen-middleware.target.wants/contacts-service.service -#mkdir -p %{buildroot}%{_sysconfdir}/rc.d/ -#mkdir -p %{buildroot}%{_sysconfdir}/rc.d/rc3.d/ -#mkdir -p %{buildroot}%{_sysconfdir}/rc.d/rc5.d/ -#ln -s %{buildroot}/%{_sysconfdir}/init.d/contacts-svc-helper.sh %{buildroot}%/{_sysconfdir}/rc.d/rc3.d/S50contacts-svc-helper -#ln -s %{buildroot}/%{_sysconfdir}/init.d/contacts-svc-helper.sh %{buildroot}%/{_sysconfdir}/rc.d/rc5.d/S50contacts-svc-helper -mkdir -p /etc/rc.d/ -mkdir -p /etc/rc.d/rc3.d/ -mkdir -p /etc/rc.d/rc5.d/ -ln -s /etc/init.d/contacts-svc-helper.sh /etc/rc.d/rc3.d/S50contacts-svc-helper -ln -s /etc/init.d/contacts-svc-helper.sh /etc/rc.d/rc5.d/S50contacts-svc-helper +%post -n contacts-service2 +/sbin/ldconfig +# from contacts-service-bin.postinst +contacts-service-ipcd schema +chown :6005 /opt/usr/data/contacts-svc +chown :6005 /opt/usr/dbspace/.contacts-svc.db +chown :6005 /opt/usr/dbspace/.contacts-svc.db-journal +if [ -f /usr/lib/rpm-plugins/msm.so ] +then + chsmack -a 'contacts-service::db' /opt/usr/dbspace/.contacts-svc.db* +fi +chown :6005 -R /opt/usr/data/contacts-svc/img +chown :6005 /opt/usr/data/contacts-svc/.CONTACTS_SVC_*_CHANGED + +chmod 660 /opt/usr/dbspace/.contacts-svc.db +chmod 660 /opt/usr/dbspace/.contacts-svc.db-journal +chmod 775 /opt/usr/data/contacts-svc +chmod 770 -R /opt/usr/data/contacts-svc/img/ +chmod 660 /opt/usr/data/contacts-svc/.CONTACTS_SVC_* +vconftool set -t int file/private/contacts-service/default_lang 1 -g 6005 +vconftool set -t int file/private/contacts-service/secondary_lang 2 -g 6005 +vconftool set -t string db/contacts-svc/secondary_lang en_US -g 6005 + +# from libcontacts-service.postinst +chown :6016 /opt/usr/data/contacts-svc/.CONTACTS_SVC_RESTRICTION_CHECK +vconftool set -t int db/contacts-svc/name_sorting_order 0 -g 6005 +vconftool set -t int db/contacts-svc/name_display_order 0 -g 6005 %postun -p /sbin/ldconfig -%files +%files -n contacts-service2 +%manifest contacts-service2.manifest %defattr(-,root,root,-) -%attr(0660,root,db_contact)/opt/data/contacts-svc/.CONTACTS_SVC_* -%{_libdir}/libcontacts-service.so* -%{_bindir}/contacts-svc-helper -%attr(0755,root,root) /etc/rc.d/init.d/contacts-svc-helper.sh - -%files devel +%{_libdir}/libcontacts-service2.so.* +%{_libdir}/libcontacts-service3.so.* +%{_bindir}/contacts-service-ipcd* +/etc/rc.d/rc*.d/S50contacts-svc-helper +/opt/usr/data/contacts-svc/.CONTACTS_SVC_* +/opt/usr/data/contacts-svc/img/* +%attr(0755,root,root) /etc/rc.d/init.d/contacts-service-ipcd.sh +%{_libdir}/systemd/user/contacts-service.service +%{_libdir}/systemd/user/tizen-middleware.target.wants/contacts-service.service + + +%files -n contacts-service2-devel %defattr(-,root,root,-) -%{_libdir}/*.so -%{_libdir}/pkgconfig/contacts-service.pc -%{_includedir}/contacts-svc/*.h +%{_libdir}/libcontacts-service2.so +%{_libdir}/libcontacts-service3.so +%{_libdir}/pkgconfig/contacts-service2.pc +%{_libdir}/pkgconfig/contacts-service3.pc +%{_includedir}/contacts-svc/contacts.h +%{_includedir}/contacts-svc/contacts_*.h diff --git a/res/.CONTACTS_SVC_AB_CHANGED b/res/.CONTACTS_SVC_AB_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_ACTIVITY_CHANGED b/res/.CONTACTS_SVC_ACTIVITY_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_ADDRESS_CHANGED b/res/.CONTACTS_SVC_ADDRESS_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_COMPANY_CHANGED b/res/.CONTACTS_SVC_COMPANY_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_DATA_CHANGED b/res/.CONTACTS_SVC_DATA_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_DB_CHANGED b/res/.CONTACTS_SVC_DB_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_EMAIL_CHANGED b/res/.CONTACTS_SVC_EMAIL_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_EVENT_CHANGED b/res/.CONTACTS_SVC_EVENT_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_FAVOR_CHANGED b/res/.CONTACTS_SVC_FAVOR_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_GROUP_CHANGED b/res/.CONTACTS_SVC_GROUP_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_GROUP_RELATION_CHANGED b/res/.CONTACTS_SVC_GROUP_RELATION_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_GROUP_REL_CHANGED b/res/.CONTACTS_SVC_GROUP_REL_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_IMAGE_CHANGED b/res/.CONTACTS_SVC_IMAGE_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_MESSENGER_CHANGED b/res/.CONTACTS_SVC_MESSENGER_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_MISSED_CHANGED b/res/.CONTACTS_SVC_MISSED_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_MY_PROFILE_CHANGED b/res/.CONTACTS_SVC_MY_PROFILE_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_NAME_CHANGED b/res/.CONTACTS_SVC_NAME_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_NICKNAME_CHANGED b/res/.CONTACTS_SVC_NICKNAME_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_NOTE_CHANGED b/res/.CONTACTS_SVC_NOTE_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_NUMBER_CHANGED b/res/.CONTACTS_SVC_NUMBER_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_PERSON_CHANGED b/res/.CONTACTS_SVC_PERSON_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_PLOG_CHANGED b/res/.CONTACTS_SVC_PLOG_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_PROFILE_CHANGED b/res/.CONTACTS_SVC_PROFILE_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_RELATIONSHIP_CHANGED b/res/.CONTACTS_SVC_RELATIONSHIP_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_RESTRICTION_CHECK b/res/.CONTACTS_SVC_RESTRICTION_CHECK new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_SDN_CHANGED b/res/.CONTACTS_SVC_SDN_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_SIMPLE_CONTACT_CHANGED b/res/.CONTACTS_SVC_SIMPLE_CONTACT_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_SPEED_CHANGED b/res/.CONTACTS_SVC_SPEED_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/.CONTACTS_SVC_URL_CHANGED b/res/.CONTACTS_SVC_URL_CHANGED new file mode 100644 index 0000000..e69de29 diff --git a/res/Not empty folder b/res/Not empty folder new file mode 100644 index 0000000..e69de29 diff --git a/schema.sql b/schema.sql index 99ebfee..b021fa4 100755 --- a/schema.sql +++ b/schema.sql @@ -3,7 +3,7 @@ -- -- Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. -- --- Contact: Youngjae Shin +-- Contact: Jongwon Lee -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. @@ -21,113 +21,166 @@ --PRAGMA journal_mode = PERSIST; --PRAGMA journal_mode = TRUNCATE; +CREATE TABLE persons +( + person_id INTEGER PRIMARY KEY AUTOINCREMENT, + name_contact_id INTEGER NOT NULL, + has_phonenumber INTEGER, + has_email INTEGER, + created_ver INTEGER NOT NULL, + changed_ver INTEGER NOT NULL, + ringtone_path TEXT, + vibration TEXT, + image_thumbnail_path TEXT, + image_path TEXT, + link_count INTEGER, + account_id1 INTEGER, + account_id2 INTEGER, + account_id3 INTEGER, + addressbook_ids TEXT, + dirty INTEGER, + status TEXT +); + +CREATE TRIGGER trg_person_del AFTER DELETE ON persons + BEGIN + DELETE FROM favorites WHERE person_id = old.person_id; + SELECT _PERSON_DELETE_(old.person_id); + END; + CREATE TABLE addressbooks ( -addrbook_id INTEGER PRIMARY KEY AUTOINCREMENT, -addrbook_name TEXT, -acc_id INTEGER, -acc_type INTEGER DEFAULT 0, -mode INTEGER, -- permission -last_sync_ver INTEGER -); ---CREATE TRIGGER trg_addressbook_sync AFTER UPDATE OF last_sync_ver ON addressbooks --- BEGIN --- DELETE FROM deleteds WHERE addrbook_id = new.addrbook_id and deleted_time <= new.last_sync_ver; --- END; + addressbook_id INTEGER PRIMARY KEY AUTOINCREMENT, + addressbook_name TEXT NOT NULL, + account_id INTEGER, + mode INTEGER, -- permission + last_sync_ver INTEGER, + UNIQUE(addressbook_name) +); + +insert into addressbooks(addressbook_id, addressbook_name, mode, account_id) values(0, 'http://tizen.org/addressbook/phone', 0, 0); + CREATE TRIGGER trg_addressbook_del AFTER DELETE ON addressbooks BEGIN - DELETE FROM groups WHERE addrbook_id = old.addrbook_id; - DELETE FROM contacts WHERE addrbook_id = old.addrbook_id; - DELETE FROM deleteds WHERE addrbook_id = old.addrbook_id; + DELETE FROM groups WHERE addressbook_id = old.addressbook_id; + UPDATE contacts SET deleted = 1, person_id = 0, changed_ver = ((SELECT ver FROM cts_version) + 1) WHERE addressbook_id = old.addressbook_id; + DELETE FROM my_profiles WHERE addressbook_id = old.addressbook_id; + DELETE FROM contact_deleteds WHERE addressbook_id = old.addressbook_id; + DELETE FROM group_deleteds WHERE addressbook_id = old.addressbook_id; END; CREATE TABLE contacts ( -contact_id INTEGER PRIMARY KEY AUTOINCREMENT, -addrbook_id INTEGER NOT NULL DEFAULT 0, -default_num INTEGER, -default_email INTEGER, -default_addr INTEGER, -is_favorite INTEGER DEFAULT 0, -created_ver INTEGER NOT NULL, -changed_ver INTEGER NOT NULL, -changed_time INTEGER NOT NULL, -outgoing_count INTEGER DEFAULT 0, -uid TEXT, -ringtone TEXT, -note TEXT, -image0 TEXT, -- normal image -image1 TEXT, -- full image -person_id INTEGER -); -CREATE INDEX contacts_ver_idx ON contacts(changed_ver); -CREATE INDEX contacts_person_idx ON contacts(person_id); + contact_id INTEGER PRIMARY KEY AUTOINCREMENT, + person_id INTEGER NOT NULL, + addressbook_id INTEGER NOT NULL DEFAULT 0, + has_phonenumber INTEGER, + has_email INTEGER, + is_restricted INTEGER DEFAULT 0, + is_favorite INTEGER DEFAULT 0, + deleted INTEGER DEFAULT 0, + display_name TEXT, + reverse_display_name TEXT, + display_name_source INTEGER, + display_name_language INTEGER, + sortkey TEXT COLLATE NOCASE, + reverse_sortkey TEXT COLLATE NOCASE, + created_ver INTEGER NOT NULL, + changed_ver INTEGER NOT NULL, + changed_time INTEGER NOT NULL, + uid TEXT, + ringtone_path TEXT, + vibration TEXT, + image_thumbnail_path TEXT, + image_path TEXT +); + +CREATE INDEX contacts_idx1 ON contacts(changed_ver); +CREATE INDEX contacts_idx2 ON contacts(person_id); +CREATE INDEX contacts_idx3 ON contacts(display_name_language, sortkey); +CREATE INDEX contacts_idx4 ON contacts(display_name_language, reverse_sortkey); + CREATE TRIGGER trg_contacts_del AFTER DELETE ON contacts - BEGIN - DELETE FROM data WHERE contact_id = old.contact_id; - DELETE FROM group_relations WHERE old.addrbook_id != -1 AND contact_id = old.contact_id; - DELETE FROM favorites WHERE type = 0 AND related_id = old.contact_id; - END; + BEGIN + SELECT _CONTACT_DELETE_(old.contact_id, old.image_thumbnail_path, old.image_path); + DELETE FROM data WHERE contact_id = old.contact_id AND is_my_profile = 0; + DELETE FROM group_relations WHERE old.addressbook_id != -1 AND contact_id = old.contact_id; + DELETE FROM activities WHERE contact_id = old.contact_id; + DELETE FROM persons WHERE person_id = old.person_id AND link_count = 1; + DELETE FROM search_index WHERE contact_id = old.contact_id; + UPDATE persons SET dirty=1 WHERE person_id = old.person_id AND link_count > 1; + END; + +CREATE TRIGGER trg_contacts_del2 AFTER DELETE ON contacts + WHEN old.addressbook_id IN (SELECT addressbook_id from addressbooks WHERE addressbook_id = old.addressbook_id) + BEGIN + INSERT INTO contact_deleteds VALUES(old.contact_id, old.addressbook_id, (SELECT ver FROM cts_version) + 1); + END; -CREATE TABLE deleteds +CREATE TRIGGER trg_contacts_update AFTER UPDATE ON contacts + WHEN new.deleted = 1 + BEGIN + DELETE FROM group_relations WHERE old.addressbook_id != -1 AND contact_id = old.contact_id; + DELETE FROM persons WHERE person_id = old.person_id AND link_count = 1; + UPDATE persons SET dirty=1 WHERE person_id = old.person_id AND link_count > 1; + END; + +CREATE TABLE contact_deleteds ( -contact_id INTEGER, -addrbook_id INTEGER, -deleted_ver INTEGER + contact_id INTEGER PRIMARY KEY, + addressbook_id INTEGER, + deleted_ver INTEGER ); -CREATE INDEX deleteds_ver_idx ON deleteds(deleted_ver); +CREATE INDEX contact_deleteds_idx1 ON contact_deleteds(deleted_ver); CREATE TABLE cts_version ( -ver INTEGER PRIMARY KEY + ver INTEGER PRIMARY KEY ); -INSERT INTO cts_version VALUES(0); -CREATE TABLE sim_services -( -id INTEGER PRIMARY KEY AUTOINCREMENT, -type INTEGER, -name TEXT, -number TEXT -); +INSERT INTO cts_version VALUES(0); -CREATE TABLE custom_types +CREATE TABLE sdn ( -id INTEGER PRIMARY KEY AUTOINCREMENT, -class INTEGER, -name TEXT, -UNIQUE(class, name) + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT, + number TEXT ); -CREATE INDEX idx_custom_type ON custom_types(class, name); -CREATE TRIGGER trg_custom_types_del AFTER DELETE ON custom_types - BEGIN - UPDATE data SET data1 = 0 WHERE old.class = 1 AND number_type = old.id AND datatype = 8; - END; CREATE TABLE data ( -id INTEGER PRIMARY KEY AUTOINCREMENT, -contact_id INTEGER NOT NULL, -datatype INTEGER NOT NULL, -data1 INTEGER, -data2 TEXT, -data3 TEXT, -data4 TEXT, -data5 TEXT, -data6 TEXT, -data7 TEXT, -data8 TEXT, -data9 TEXT, -data10 TEXT, -person_id INTEGER + id INTEGER PRIMARY KEY AUTOINCREMENT, + contact_id INTEGER NOT NULL, + datatype INTEGER NOT NULL, + is_my_profile INTEGER, + is_primary_default INTEGER, + is_default INTEGER, + data1 INTEGER, + data2 TEXT, + data3 TEXT, + data4 TEXT, + data5 TEXT, + data6 TEXT, + data7 TEXT, + data8 TEXT, + data9 TEXT, + data10 TEXT, + data11 TEXT, + data12 TEXT ); + +CREATE TRIGGER trg_data_del AFTER DELETE ON data + BEGIN + SELECT _DATA_DELETE_(old.id, old.datatype); + END; + CREATE TRIGGER trg_data_number_del AFTER DELETE ON data - WHEN old.datatype = 8 - BEGIN - DELETE FROM favorites WHERE type = 1 AND related_id = old.id; - DELETE FROM speeddials WHERE number_id = old.id; - END; -CREATE INDEX data_contact_idx ON data(contact_id); + WHEN old.datatype = 8 + BEGIN + DELETE FROM speeddials WHERE number_id = old.id; + END; + +CREATE INDEX data_contact_idx1 ON data(contact_id); CREATE INDEX data_contact_idx2 ON data(datatype, contact_id); CREATE INDEX data_idx1 ON data(data1); CREATE INDEX data_idx2 ON data(data2); @@ -139,82 +192,191 @@ CREATE INDEX data_idx7 ON data(data7); CREATE INDEX data_idx8 ON data(data8); CREATE INDEX data_idx9 ON data(data9); CREATE INDEX data_idx10 ON data(data10); -CREATE INDEX data_person_idx ON data(person_id); CREATE TABLE groups ( -group_id INTEGER PRIMARY KEY AUTOINCREMENT, -addrbook_id INTEGER, -group_name TEXT, -ringtone TEXT, -UNIQUE(addrbook_id, group_name) + group_id INTEGER PRIMARY KEY AUTOINCREMENT, + addressbook_id INTEGER, + group_name TEXT, + system_id TEXT, + is_read_only INTEGER DEFAULT 0, + created_ver INTEGER NOT NULL, + changed_ver INTEGER NOT NULL, + ringtone_path TEXT, + vibration TEXT, + image_thumbnail_path TEXT, + member_changed_ver INTEGER ); + +INSERT INTO groups(addressbook_id, group_name, system_id, is_read_only, created_ver, changed_ver) + VALUES(0, 'family', 'family', 1, 0, 0); +INSERT INTO groups(addressbook_id, group_name, system_id, is_read_only, created_ver, changed_ver) + VALUES(0, 'friends', 'friends',1, 0, 0); +INSERT INTO groups(addressbook_id, group_name, system_id, is_read_only, created_ver, changed_ver) + VALUES(0, 'coworkers', 'coworkers', 1, 0, 0); + CREATE TRIGGER trg_groups_del AFTER DELETE ON groups BEGIN DELETE FROM group_relations WHERE group_id = old.group_id; END; +CREATE TABLE group_deleteds +( + group_id INTEGER PRIMARY KEY, + addressbook_id INTEGER, + deleted_ver INTEGER +); + +CREATE INDEX group_deleteds_idx1 ON group_deleteds(deleted_ver); + CREATE TABLE group_relations ( -group_id INTEGER NOT NULL, -contact_id INTEGER NOT NULL, -UNIQUE(group_id, contact_id) + group_id INTEGER NOT NULL, + contact_id INTEGER NOT NULL, + ver INTEGER NOT NULL, + deleted INTEGER DEFAULT 0, + UNIQUE(group_id, contact_id) ); -CREATE INDEX group_idx1 ON group_relations(contact_id); +CREATE INDEX groups_idx1 ON group_relations(contact_id); + CREATE TABLE speeddials ( -speed_num INTEGER PRIMARY KEY NOT NULL, -number_id INTEGER UNIQUE + speed_number INTEGER PRIMARY KEY NOT NULL, + number_id INTEGER UNIQUE ); CREATE TABLE favorites ( -id INTEGER PRIMARY KEY AUTOINCREMENT, -type INTEGER NOT NULL, -related_id INTEGER NOT NULL, -favorite_prio REAL, -UNIQUE(type, related_id) + person_id INTEGER PRIMARY KEY, + favorite_prio REAL ); -CREATE INDEX idx1_favorites ON favorites(favorite_prio); -CREATE INDEX idx2_favorites ON favorites(type, related_id); -CREATE TRIGGER trg_favorite_del BEFORE DELETE ON favorites - BEGIN - UPDATE data SET data3 = 0 WHERE old.type = 1 AND id = old.related_id AND datatype = 8; - UPDATE contacts SET is_favorite = 0 WHERE old.type = 0 AND contact_id = old.related_id; - END; -CREATE TRIGGER trg_favorite_insert AFTER INSERT ON favorites - BEGIN - UPDATE data SET data3 = 1 WHERE new.type = 1 AND id = new.related_id AND datatype = 8; - UPDATE contacts SET is_favorite = 1 WHERE new.type = 0 AND contact_id = new.related_id; - END; +CREATE INDEX favorites_idx1 ON favorites(favorite_prio); +CREATE INDEX favorites_idx2 ON favorites(person_id); + + +--CREATE TRIGGER trg_favorites_del BEFORE DELETE ON favorites +-- BEGIN +-- UPDATE contacts SET is_favorite = 0 WHERE person_id = old.person_id; +-- END; +--CREATE TRIGGER trg_favorites_insert AFTER INSERT ON favorites +-- BEGIN +-- UPDATE contacts SET is_favorite = 1 WHERE person_id = new.person_id; +-- END; + CREATE TABLE phonelogs ( -id INTEGER PRIMARY KEY AUTOINCREMENT, -number TEXT, -normal_num TEXT, -related_id INTEGER, --contact_id -log_type INTEGER, -log_time INTEGER, -data1 INTEGER, --duration, message_id -data2 TEXT -- short message -); -CREATE INDEX idx1_phonelogs ON phonelogs(log_type); -CREATE INDEX idx2_phonelogs ON phonelogs(log_time); + id INTEGER PRIMARY KEY AUTOINCREMENT, + number TEXT, + normal_num TEXT, + person_id INTEGER, --person_id + log_type INTEGER, + log_time INTEGER, + data1 INTEGER, --duration, message_id + data2 TEXT -- short message +); + +CREATE INDEX phonelogs_idx1 ON phonelogs(log_type); +CREATE INDEX phonelogs_idx2 ON phonelogs(log_time); CREATE TRIGGER trg_phonelogs_del AFTER DELETE ON phonelogs - WHEN old.log_type = 2 OR old.log_type = 4 - BEGIN - DELETE FROM phonelog_accumulation WHERE log_time < (old.log_time - 3456000); -- 40 days - INSERT INTO phonelog_accumulation VALUES(NULL, 1, old.log_time, old.data1); - END; + BEGIN + SELECT _PHONE_LOG_DELETE_(old.id); + END; + +--CREATE TRIGGER trg_phonelogs_del AFTER DELETE ON phonelogs +-- WHEN old.log_type = 2 OR old.log_type = 4 +-- BEGIN +-- DELETE FROM phonelog_accumulation WHERE log_time < (old.log_time - 3456000); -- 40 days +-- INSERT INTO phonelog_accumulation VALUES(NULL, 1, old.log_time, old.data1); +-- END; + +--CREATE TABLE phonelog_accumulation +--( +-- id INTEGER PRIMARY KEY AUTOINCREMENT, +-- log_cnt INTEGER, +-- log_time INTEGER, +-- duration INTEGER +--); +--INSERT INTO phonelog_accumulation VALUES(1, 0, NULL, 0); +--INSERT INTO phonelog_accumulation VALUES(2, 0, NULL, 0); --total + +CREATE TABLE phonelog_stat +( + log_type INTEGER PRIMARY KEY, + log_count INTEGER +); + +CREATE TRIGGER trg_phonelogs_insert AFTER INSERT ON phonelogs + BEGIN + INSERT OR REPLACE INTO phonelog_stat values(new.log_type, coalesce((SELECT log_count+1 FROM phonelog_stat WHERE log_type=new.log_type), 1)); + END; -CREATE TABLE phonelog_accumulation +CREATE TABLE contact_stat ( -id INTEGER PRIMARY KEY AUTOINCREMENT, -log_cnt INTEGER, -log_time INTEGER, -duration INTEGER + id INTEGER PRIMARY KEY AUTOINCREMENT, + person_id INTEGER, + usage_type INTEGER, + times_used INTEGER ); -INSERT INTO phonelog_accumulation VALUES(1, 0, NULL, 0); -INSERT INTO phonelog_accumulation VALUES(2, 0, NULL, 0); --total + +CREATE TABLE activities +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + contact_id INTEGER NOT NULL, + source_name TEXT, + status TEXT, + timestamp INTEGER, + sync_data1 TEXT, + sync_data2 TEXT, + sync_data3 TEXT, + sync_data4 TEXT +); + +CREATE TABLE activity_photos +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + activity_id INTEGER NOT NULL, + photo_url TEXT, + sort_index INTEGER +); + +CREATE TRIGGER trg_activities_insert AFTER INSERT ON activities + BEGIN + UPDATE persons SET status=(SELECT status FROM activities WHERE contact_id IN (SELECT contact_id FROM contacts WHERE person_id = (select person_id FROM contacts WHERE contact_id = new.contact_id)) ORDER BY timestamp DESC LIMIT 1) WHERE person_id = (SELECT person_id FROM contacts WHERE contact_id = new.contact_id); + END; + +CREATE TRIGGER trg_activities_delete AFTER DELETE ON activities + BEGIN + UPDATE persons SET status=(SELECT status FROM activities WHERE contact_id IN (SELECT contact_id FROM contacts WHERE person_id = (select person_id FROM contacts WHERE contact_id = old.contact_id)) ORDER BY timestamp DESC LIMIT 1) WHERE person_id = (SELECT person_id FROM contacts WHERE contact_id = old.contact_id); + DELETE FROM activity_photos WHERE activity_id = old.id; + END; + +CREATE VIRTUAL TABLE search_index USING FTS4 +( + contact_id integer NOT NULL, + data TEXT, + name TEXT, + number TEXT, + UNIQUE(contact_id) +); + +CREATE TABLE my_profiles +( + my_profile_id INTEGER PRIMARY KEY AUTOINCREMENT, + addressbook_id INTEGER NOT NULL DEFAULT 0, + display_name TEXT, + created_ver INTEGER NOT NULL, + changed_ver INTEGER NOT NULL, + changed_time INTEGER NOT NULL, + uid TEXT, + image_thumbnail_path TEXT, + UNIQUE(addressbook_id) +); + +CREATE TRIGGER trg_my_profiles_del AFTER DELETE ON my_profiles + BEGIN +-- It should be implemented SELECT _MY_PROFILE_DELETE_(old.my_profile_id); + DELETE FROM data WHERE contact_id = old.my_profile_id AND is_my_profile = 1; + END; + diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt new file mode 100755 index 0000000..c752343 --- /dev/null +++ b/server/CMakeLists.txt @@ -0,0 +1,175 @@ +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/server) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/native) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/common) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/common/ipc) +LINK_DIRECTORIES(${CMAKE_BINARY_DIR}) +LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/server) + +SET(DAEMON contacts-service-ipcd) + +SET(SRCS + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_marshal.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_addressbook.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_contact.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_my_profile.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_group.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_person.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_phonelog.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_result.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_sdn.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_simple_contact.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_speeddial.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_result.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_updated_info.c + + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_activity.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_activity_photo.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_address.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_company.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_email.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_event.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_grouprelation.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_messenger.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_name.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_nickname.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_note.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_number.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_relationship.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_url.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_extension.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_profile.c + ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_image.c + + ${CMAKE_SOURCE_DIR}/common/ctsvc_filter.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_db_notification.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_inotify.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_list.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_localize.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_localize_ch.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_normalize.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_mutex.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_query.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_addressbook.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_contact.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_my_profile.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_group.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_person.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_phonelog.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_result.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_sdn.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_speeddial.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_record_updated_info.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_setting.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_sim.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_socket.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_vcard.c + ${CMAKE_SOURCE_DIR}/common/ctsvc_view.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_activity.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_init.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_activity.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_address_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_address.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_addressbook.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_company_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_company.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_contact_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_contact.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_my_profile.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_email_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_email.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_event_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_event.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_extension_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_extension.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_group.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_grouprelation.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_image_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_image.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_messenger_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_messenger.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_name_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_name.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_nickname_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_nickname.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_note_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_note.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_number_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_number.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_person_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_person.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_phonelog.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_profile_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_profile.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_relationship_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_relationship.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_sdn.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_simple_contact.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_speeddial.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_url_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_url.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_query.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_group.c + + ${CMAKE_SOURCE_DIR}/native/ctsvc_person.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_phonelog.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_restriction.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_service.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_sqlite.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_utils.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_notification.c + + ctsvc_ipc_server.c + ctsvc_ipc_server2.c + ctsvc_ipc_server_sim.c + ctsvc_server_socket.c + ctsvc_server_sim.c + ctsvc_server_sqlite.c + ctsvc_server_utils.c + ctsvc_server_change_subject.c + ctsvc_schema_recovery.c + ctsvc_server_bg.c + ctsvc_server.c +) + +INCLUDE(FindPkgConfig) +pkg_check_modules(ctsvc_server_pkgs REQUIRED glib-2.0 pims-ipc gobject-2.0 tapi dlog capi-media-image-util badge) + +FOREACH(flag ${ctsvc_server_pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") +SET(ctsvc_server_pkgs_LDFLAGS "${pkgs_LDFLAGS} ${ctsvc_server_pkgs_LDFLAGS}") + +ADD_DEFINITIONS("-D_CONTACTS_IPC_SERVER") +ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") + +#cmake_policy(SET CMP0002 OLD) +ADD_EXECUTABLE(${DAEMON} ${SRCS}) +SET_TARGET_PROPERTIES(${DAEMON} PROPERTIES COMPILE_FLAGS ${EXTRA_CFLAGS}) +TARGET_LINK_LIBRARIES(${DAEMON} ${ctsvc_server_pkgs_LDFLAGS}) + +INSTALL(TARGETS ${DAEMON} DESTINATION bin) +INSTALL(PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/contacts-service-ipcd.sh DESTINATION /etc/rc.d/init.d) diff --git a/server/contacts-service-ipcd.sh b/server/contacts-service-ipcd.sh new file mode 100755 index 0000000..98626bf --- /dev/null +++ b/server/contacts-service-ipcd.sh @@ -0,0 +1,3 @@ +#dlogutil -v threadtime -f /var/log/contacts-service-ipcd.log -r 1000 -n 10 CONTACTS_SERVICE & + +/usr/bin/contacts-service-ipcd & diff --git a/server/ctsvc_ipc_server.c b/server/ctsvc_ipc_server.c new file mode 100644 index 0000000..fa38d82 --- /dev/null +++ b/server/ctsvc_ipc_server.c @@ -0,0 +1,1562 @@ +/* + * Contacts Service + * + * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "ctsvc_service.h" +#include "ctsvc_db_init.h" +#include "ctsvc_db_query.h" + +#include "ctsvc_ipc_marshal.h" +#include "ctsvc_internal.h" +#include "ctsvc_ipc_server.h" + +void ctsvc_ipc_server_connect(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + + ret = contacts_connect2(); + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + return; + } + if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + return; + } + } + else + { + ERR("outdata is NULL"); + } + return; +} + +void ctsvc_ipc_server_disconnect(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + + ret = contacts_disconnect2(); + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + return; + } + if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + return; + } + } + else + { + ERR("outdata is NULL"); + } + return; +} + +void ctsvc_ipc_server_db_insert_record(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + int id = 0; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_record(indata,&record); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_record fail"); + record = NULL; + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_server_db_insert_record fail"); + goto ERROR_RETURN; + } + + ret = contacts_db_insert_record(record, &id); + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + goto DATA_FREE; + } + if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + goto DATA_FREE; + } + if (ret == CONTACTS_ERROR_NONE) + { + if (ctsvc_ipc_marshal_int(id,*outdata) != CONTACTS_ERROR_NONE) + { + pims_ipc_data_destroy(*outdata); + ERR("ctsvc_ipc_marshal fail"); + ret = CONTACTS_ERROR_INVALID_PARAMETER; + goto ERROR_RETURN; + } + } + } + else + { + ERR("outdata is NULL"); + } + goto DATA_FREE; + // goto 주의.. +ERROR_RETURN: + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + goto DATA_FREE; + } + if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + goto DATA_FREE; + } + } + else + { + ERR("outdata is NULL"); + } + +DATA_FREE: + if (record) + { + contacts_record_destroy(record,true); + } + return; +} + +void ctsvc_ipc_server_db_get_record(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + char* view_uri = NULL; + int id = 0; + contacts_record_h record = NULL; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_string(indata,&view_uri); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_string fail"); + goto ERROR_RETURN; + } + ret = ctsvc_ipc_unmarshal_int(indata,&id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_server_db_insert_record fail"); + goto ERROR_RETURN; + } + + ret = contacts_db_get_record(view_uri,id,&record); + + // goto 주의.. +ERROR_RETURN: + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + goto DATA_FREE; + } + if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + goto DATA_FREE; + } + + if ( CONTACTS_ERROR_NO_DATA == ret ) + { + CTS_DBG("no data"); + } + else if( CONTACTS_ERROR_NONE == ret ) + { + if( ctsvc_ipc_marshal_record(record, *outdata) != CONTACTS_ERROR_NONE ) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("ctsvc_ipc_marshal_record fail"); + goto DATA_FREE; + } + } + } + else + { + ERR("outdata is NULL"); + } +DATA_FREE: + if (record) + { + contacts_record_destroy(record,true); + } + CONTACTS_FREE(view_uri); + return; +} + +void ctsvc_ipc_server_db_update_record(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_record(indata,&record); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_record fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_server_db_insert_record fail"); + goto ERROR_RETURN; + } + + ret = contacts_db_update_record(record); + + // goto 주의.. +ERROR_RETURN: + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + goto DATA_FREE; + } + if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + goto DATA_FREE; + } + } + else + { + ERR("outdata is NULL"); + } +DATA_FREE: + if (record) + { + contacts_record_destroy(record,true); + } + return; +} + +void ctsvc_ipc_server_db_delete_record(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + char* view_uri = NULL; + int id = 0; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_string(indata,&view_uri); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_record fail"); + goto ERROR_RETURN; + } + ret = ctsvc_ipc_unmarshal_int(indata,&id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_server_db_insert_record fail"); + goto ERROR_RETURN; + } + + ret = contacts_db_delete_record(view_uri,id); + + // goto 주의.. +ERROR_RETURN: + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + goto DATA_FREE; + } + if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + goto DATA_FREE; + } + } + else + { + ERR("outdata is NULL"); + } +DATA_FREE: + + CONTACTS_FREE(view_uri); + return; +} + +void ctsvc_ipc_server_db_replace_record(pims_ipc_h ipc, pims_ipc_data_h indata, + pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + int id = 0; + + if (indata) { + ret = ctsvc_ipc_unmarshal_record(indata, &record); + if (ret != CONTACTS_ERROR_NONE) { + ERR("ctsvc_ipc_unmarshal_record fail"); + record = NULL; + goto ERROR_RETURN; + } + ret = ctsvc_ipc_unmarshal_int(indata, &id); + if (ret != CONTACTS_ERROR_NONE) { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + } + else { + ERR("ctsvc_ipc_server_db_replace_record fail"); + goto ERROR_RETURN; + } + + ret = contacts_db_replace_record(record, id); + +ERROR_RETURN: + if (outdata) { + *outdata = pims_ipc_data_create(0); + if (!*outdata) { + ERR("pims_ipc_data_create fail"); + goto DATA_FREE; + } + if (pims_ipc_data_put(*outdata, (void*)&ret, sizeof(int)) != 0) { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + goto DATA_FREE; + } + } + else { + ERR("outdata is NULL"); + } + +DATA_FREE: + if (record) + contacts_record_destroy(record, true); + + return; +} + +void ctsvc_ipc_server_db_get_all_records(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + char* view_uri = NULL; + int offset = 0; + int limit = 0; + contacts_list_h list = NULL; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_string(indata,&view_uri); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_record fail"); + goto ERROR_RETURN; + } + ret = ctsvc_ipc_unmarshal_int(indata,&offset); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + ret = ctsvc_ipc_unmarshal_int(indata,&limit); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_server_db_insert_record fail"); + goto ERROR_RETURN; + } + + ret = contacts_db_get_all_records(view_uri,offset,limit,&list); + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + goto DATA_FREE; + } + if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + goto DATA_FREE; + } + + if ( CONTACTS_ERROR_NO_DATA == ret ) + { + CTS_DBG("no data"); + } + else if( CONTACTS_ERROR_NONE == ret ) + { + ret = ctsvc_ipc_marshal_list(list,*outdata); + + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto DATA_FREE; + } + } + + } + else + { + ERR("outdata is NULL"); + } + + goto DATA_FREE; + + // goto 주의.. +ERROR_RETURN: + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + goto DATA_FREE; + } + if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + goto DATA_FREE; + } + } + else + { + ERR("outdata is NULL"); + } +DATA_FREE: + + if (list) + { + contacts_list_destroy(list,true); + } + CONTACTS_FREE(view_uri); + return; +} + +void ctsvc_ipc_server_db_get_records_with_query(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + contacts_query_h query = NULL; + int offset = 0; + int limit = 0; + contacts_list_h list = NULL; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_query(indata,&query); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_record fail"); + goto ERROR_RETURN; + } + ret = ctsvc_ipc_unmarshal_int(indata,&offset); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + ret = ctsvc_ipc_unmarshal_int(indata,&limit); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_server_db_insert_record fail"); + goto ERROR_RETURN; + } + + ret = contacts_db_get_records_with_query(query,offset,limit,&list); + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + goto DATA_FREE; + } + if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + goto DATA_FREE; + } + + if ( CONTACTS_ERROR_NO_DATA == ret ) + { + CTS_DBG("no data"); + } + else if( CONTACTS_ERROR_NONE == ret ) + { + ret = ctsvc_ipc_marshal_list(list,*outdata); + + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto DATA_FREE; + } + } + } + else + { + ERR("outdata is NULL"); + } + goto DATA_FREE; + + // goto 주의.. +ERROR_RETURN: + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + goto DATA_FREE; + } + if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + goto DATA_FREE; + } + } + else + { + ERR("outdata is NULL"); + } +DATA_FREE: + + if (list) + { + contacts_list_destroy(list,true); + } + if (query) + { + contacts_query_destroy(query); + } + return; +} + + +void ctsvc_ipc_server_db_get_count(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + char* view_uri = NULL; + int count = 0; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_string(indata,&view_uri); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_record fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_server_db_insert_record fail"); + goto ERROR_RETURN; + } + + ret = contacts_db_get_count(view_uri,&count); + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + goto DATA_FREE; + } + if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + goto DATA_FREE; + } + + if ( CONTACTS_ERROR_NO_DATA == ret ) + { + CTS_DBG("no data"); + } + else if( CONTACTS_ERROR_NONE == ret ) + { + ret = ctsvc_ipc_marshal_int(count,*outdata); + + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto DATA_FREE; + } + } + } + else + { + ERR("outdata is NULL"); + } + goto DATA_FREE; + + // goto 주의.. +ERROR_RETURN: + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + goto DATA_FREE; + } + if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + goto DATA_FREE; + } + } + else + { + ERR("outdata is NULL"); + } +DATA_FREE: + CONTACTS_FREE(view_uri); + return; +} + +void ctsvc_ipc_server_db_get_count_with_query(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + contacts_query_h query = NULL; + int count = 0; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_query(indata,&query); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_record fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_server_db_insert_record fail"); + goto ERROR_RETURN; + } + + ret = contacts_db_get_count_with_query(query,&count); + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + goto DATA_FREE; + } + if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + goto DATA_FREE; + } + + if ( CONTACTS_ERROR_NO_DATA == ret ) + { + CTS_DBG("no data"); + } + else if( CONTACTS_ERROR_NONE == ret ) + { + ret = ctsvc_ipc_marshal_int(count,*outdata); + + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto DATA_FREE; + } + } + } + else + { + ERR("outdata is NULL"); + } + goto DATA_FREE; + + // goto 주의.. +ERROR_RETURN: + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + goto DATA_FREE; + } + if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + goto DATA_FREE; + } + } + else + { + ERR("outdata is NULL"); + } +DATA_FREE: + if (query) + { + contacts_query_destroy(query); + } + return; +} + +void ctsvc_ipc_server_db_insert_records(pims_ipc_h ipc, pims_ipc_data_h indata, + pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + contacts_list_h list = NULL; + unsigned int id_count = 0; + int *ids = NULL; + int i=0; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_list(indata,&list); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_list fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_server_db_insert_record fail"); + goto ERROR_RETURN; + } + + ret = ctsvc_db_insert_records(list, &ids, &id_count); + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + goto DATA_FREE; + } + if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + goto DATA_FREE; + } + + if(ret == CONTACTS_ERROR_NONE) + { + contacts_record_h record = NULL; + // marshal : id_count+property_id+[ids]*id_count + // id_count + if (pims_ipc_data_put(*outdata,(void*)&id_count,sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + ret = CONTACTS_ERROR_INVALID_PARAMETER; + goto ERROR_RETURN; + } + for(i=0;i + +// contacts_service.h +void ctsvc_ipc_server_connect(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_server_disconnect(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); + +// contacts_db_init.h +void ctsvc_ipc_server_db_insert_record(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_server_db_get_record(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_server_db_update_record(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_server_db_delete_record(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_server_db_replace_record(pims_ipc_h ipc, pims_ipc_data_h indata,pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_server_db_get_all_records(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_server_db_get_records_with_query(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); + +void ctsvc_ipc_server_db_get_count(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_server_db_get_count_with_query(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); + +void ctsvc_ipc_server_db_insert_records(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_server_db_update_records(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_server_db_delete_records(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_server_db_replace_records(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); + +void ctsvc_ipc_server_db_get_changes_by_version(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_server_db_get_current_version(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); + +void ctsvc_ipc_server_db_search_records(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_server_db_search_records_with_query(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); + + +#endif /*__CTSVC_IPC_SERVER_H__*/ diff --git a/server/ctsvc_ipc_server2.c b/server/ctsvc_ipc_server2.c new file mode 100644 index 0000000..f737743 --- /dev/null +++ b/server/ctsvc_ipc_server2.c @@ -0,0 +1,661 @@ +/* + * Contacts Service + * + * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "ctsvc_service.h" +#include "ctsvc_db_init.h" + +#include "ctsvc_ipc_marshal.h" +#include "ctsvc_internal.h" +#include "ctsvc_ipc_server.h" + + +void ctsvc_ipc_activity_delete_by_contact_id(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + int contact_id = 0; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_int(indata, &contact_id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_server_db_insert_record fail"); + goto ERROR_RETURN; + } + + ret = contacts_activity_delete_by_contact_id(contact_id); + + +ERROR_RETURN: + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + return; + } + if (pims_ipc_data_put(*outdata, (void*)&ret, sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + } + } + else + { + ERR("outdata is NULL"); + } + + return; +} + +void ctsvc_ipc_activity_delete_by_account_id(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + int account_id = 0; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_int(indata, &account_id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_activity_delete_by_account_id fail"); + goto ERROR_RETURN; + } + + ret = contacts_activity_delete_by_account_id(account_id); + +ERROR_RETURN: + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + return; + } + if (pims_ipc_data_put(*outdata, (void*)&ret, sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + } + } + else + { + ERR("outdata is NULL"); + } + + return; +} + +void ctsvc_ipc_group_add_contact(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + int group_id = 0; + int contact_id = 0; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_int(indata, &group_id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + ret = ctsvc_ipc_unmarshal_int(indata, &contact_id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_group_add_contact fail"); + goto ERROR_RETURN; + } + + ret = contacts_group_add_contact(group_id, contact_id); + +ERROR_RETURN: + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + return; + } + if (pims_ipc_data_put(*outdata, (void*)&ret, sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + } + } + else + { + ERR("outdata is NULL"); + } + + return; +} + +void ctsvc_ipc_group_remove_contact(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + int group_id = 0; + int contact_id = 0; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_int(indata, &group_id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + ret = ctsvc_ipc_unmarshal_int(indata, &contact_id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_group_remove_contact fail"); + goto ERROR_RETURN; + } + + ret = contacts_group_remove_contact(group_id, contact_id); + +ERROR_RETURN: + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + return; + } + if (pims_ipc_data_put(*outdata, (void*)&ret, sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + } + } + else + { + ERR("outdata is NULL"); + } + + return; +} + +void ctsvc_ipc_person_link_person(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + int base_person_id = 0; + int person_id = 0; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_int(indata, &base_person_id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + ret = ctsvc_ipc_unmarshal_int(indata, &person_id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_person_link_person fail"); + goto ERROR_RETURN; + } + + ret = contacts_person_link_person(base_person_id, person_id); + +ERROR_RETURN: + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + return; + } + if (pims_ipc_data_put(*outdata, (void*)&ret, sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + } + } + else + { + ERR("outdata is NULL"); + } + + return; +} +void ctsvc_ipc_person_unlink_contact(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + int person_id = 0; + int contact_id = 0; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_int(indata, &person_id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + ret = ctsvc_ipc_unmarshal_int(indata, &contact_id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_person_link_person fail"); + goto ERROR_RETURN; + } + + int unlinked_person_id; + ret = contacts_person_unlink_contact(person_id, contact_id, &unlinked_person_id); + +ERROR_RETURN: + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + return; + } + if (pims_ipc_data_put(*outdata, (void*)&ret, sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + return; + } + if (pims_ipc_data_put(*outdata, (void*)&unlinked_person_id, sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + } + + } + else + { + ERR("outdata is NULL"); + } + + return; +} +void ctsvc_ipc_person_reset_usage(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + int person_id = 0; + contacts_usage_type_e type; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_int(indata, &person_id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + int temp = 0; + ret = ctsvc_ipc_unmarshal_int(indata, &temp); + type = (int)temp; + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_person_link_person fail"); + goto ERROR_RETURN; + } + + ret = contacts_person_reset_usage(person_id, type); + +ERROR_RETURN: + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + return; + } + if (pims_ipc_data_put(*outdata, (void*)&ret, sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + } + } + else + { + ERR("outdata is NULL"); + } + + return; +} +void ctsvc_ipc_person_set_favorite_order(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + int person_id = 0; + int previous_person_id; + int next_person_id; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_int(indata, &person_id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + ret = ctsvc_ipc_unmarshal_int(indata, &previous_person_id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + ret = ctsvc_ipc_unmarshal_int(indata, &next_person_id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_person_link_person fail"); + goto ERROR_RETURN; + } + + ret = contacts_person_set_favorite_order(person_id, previous_person_id, next_person_id ); + +ERROR_RETURN: + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + return; + } + if (pims_ipc_data_put(*outdata, (void*)&ret, sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + } + } + else + { + ERR("outdata is NULL"); + } + + return; +} + +void ctsvc_ipc_person_set_default_property(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + int person_id = 0; + int id; + contacts_person_property_e property; + + if (indata) + { + ret = ctsvc_ipc_unmarshal_int(indata, &person_id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + ret = ctsvc_ipc_unmarshal_unsigned_int(indata, &property); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + ret = ctsvc_ipc_unmarshal_int(indata, &id); + if (ret != CONTACTS_ERROR_NONE) + { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + } + else + { + ERR("ctsvc_ipc_person_set_default_property fail"); + goto ERROR_RETURN; + } + + ret = contacts_person_set_default_property(property, person_id, id ); + +ERROR_RETURN: + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + return; + } + if (pims_ipc_data_put(*outdata, (void*)&ret, sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + } + } + else + { + ERR("outdata is NULL"); + } + + return; +} + +void ctsvc_ipc_person_get_default_property(pims_ipc_h ipc, pims_ipc_data_h indata, + pims_ipc_data_h *outdata, void *userdata) +{ + int ret = CONTACTS_ERROR_NONE; + int person_id = 0; + int id; + contacts_person_property_e op; + + if (indata) { + ret = ctsvc_ipc_unmarshal_int(indata, &person_id); + if (ret != CONTACTS_ERROR_NONE) { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + ret = ctsvc_ipc_unmarshal_unsigned_int(indata, &op); + if (ret != CONTACTS_ERROR_NONE) { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + } + else { + ERR("ctsvc_ipc_person_get_default_property fail"); + goto ERROR_RETURN; + } + + ret = contacts_person_get_default_property(op, person_id, &id ); + +ERROR_RETURN: + + if (outdata) { + *outdata = pims_ipc_data_create(0); + if (!*outdata) { + ERR("pims_ipc_data_create fail"); + return; + } + if (pims_ipc_data_put(*outdata, (void*)&ret, sizeof(int)) != 0) { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail (return value)"); + return; + } + if (pims_ipc_data_put(*outdata, (void*)&id, sizeof(int)) != 0) { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail (id)"); + return; + } + } + else { + ERR("outdata is NULL"); + } + + return; +} + +void ctsvc_ipc_phone_log_reset_statistics(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + int ret = contacts_phone_log_reset_statistics(); + + if (outdata) + { + *outdata = pims_ipc_data_create(0); + if (!*outdata) + { + ERR("pims_ipc_data_create fail"); + return; + } + if (pims_ipc_data_put(*outdata, (void*)&ret, sizeof(int)) != 0) + { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + } + } + else + { + ERR("outdata is NULL"); + } + + return; +} + +void ctsvc_ipc_phone_log_delete(pims_ipc_h ipc, pims_ipc_data_h indata, + pims_ipc_data_h *outdata, void *userdata) +{ + int ret= CONTACTS_ERROR_NONE; + int extra_data1; + char *number = NULL; + contacts_phone_log_delete_e op; + + if (indata) { + ret = ctsvc_ipc_unmarshal_int(indata, (int*)&op); + if (ret != CONTACTS_ERROR_NONE) { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + + switch(op){ + case CONTACTS_PHONE_LOG_DELETE_BY_ADDRESS: + ret = ctsvc_ipc_unmarshal_string(indata, &number); + if (ret != CONTACTS_ERROR_NONE) { + ERR("ctsvc_ipc_unmarshal_string fail"); + goto ERROR_RETURN; + } + ret = contacts_phone_log_delete(op, number); + break; + case CONTACTS_PHONE_LOG_DELETE_BY_MESSAGE_EXTRA_DATA1: + case CONTACTS_PHONE_LOG_DELETE_BY_EMAIL_EXTRA_DATA1: + ret = ctsvc_ipc_unmarshal_int(indata, &extra_data1); + if (ret != CONTACTS_ERROR_NONE) { + ERR("ctsvc_ipc_unmarshal_int fail"); + goto ERROR_RETURN; + } + ret = contacts_phone_log_delete(op, extra_data1); + break; + default: + ERR("Invalid parameter : the operation is not proper (op : %d)", op); + ret = CONTACTS_ERROR_INVALID_PARAMETER; + break; + } + } + +ERROR_RETURN: + if (outdata) { + *outdata = pims_ipc_data_create(0); + if (!*outdata) { + ERR("pims_ipc_data_create fail"); + return; + } + if (pims_ipc_data_put(*outdata, (void*)&ret, sizeof(int)) != 0) { + pims_ipc_data_destroy(*outdata); + *outdata = NULL; + ERR("pims_ipc_data_put fail"); + } + } +} + diff --git a/server/ctsvc_ipc_server2.h b/server/ctsvc_ipc_server2.h new file mode 100644 index 0000000..a5486f9 --- /dev/null +++ b/server/ctsvc_ipc_server2.h @@ -0,0 +1,41 @@ +/* + * Calendar Service + * + * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __CTSVC_IPC_SERVER2_H__ +#define __CTSVC_IPC_SERVER2_H__ + +#include + +void ctsvc_ipc_activity_delete_by_contact_id(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_activity_delete_by_account_id(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); + +void ctsvc_ipc_group_add_contact(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_group_remove_contact(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); + +void ctsvc_ipc_person_link_person(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_person_unlink_contact(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); + +void ctsvc_ipc_person_reset_usage(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_person_set_favorite_order(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_person_set_default_property(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_person_get_default_property(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); + +void ctsvc_ipc_phone_log_reset_statistics(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_phone_log_delete(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); + +#endif /*__CTSVC_IPC_SERVER2_H__*/ diff --git a/server/ctsvc_ipc_server_sim.c b/server/ctsvc_ipc_server_sim.c new file mode 100644 index 0000000..c50ee4f --- /dev/null +++ b/server/ctsvc_ipc_server_sim.c @@ -0,0 +1,43 @@ +/* + * Contacts Service + * + * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "ctsvc_service.h" +#include "ctsvc_db_init.h" + +#include "ctsvc_ipc_marshal.h" +#include "ctsvc_internal.h" +#include "ctsvc_ipc_server_sim.h" + +void ctsvc_ipc_sim_insert_contact(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + return; +} + +void ctsvc_ipc_sim_update_contact(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + return; +} + +void ctsvc_ipc_sim_delete_contact(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata) +{ + return; +} + diff --git a/server/ctsvc_ipc_server_sim.h b/server/ctsvc_ipc_server_sim.h new file mode 100644 index 0000000..5ef8f5d --- /dev/null +++ b/server/ctsvc_ipc_server_sim.h @@ -0,0 +1,28 @@ +/* + * Calendar Service + * + * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __CTSVC_IPC_SERVER_SIM_H__ +#define __CTSVC_IPC_SERVER_SIM_H__ + +#include + +void ctsvc_ipc_sim_insert_contact(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_sim_update_contact(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); +void ctsvc_ipc_sim_delete_contact(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata); + +#endif /*__CTSVC_IPC_SERVER_SIM_H__*/ diff --git a/server/ctsvc_schema_recovery.c b/server/ctsvc_schema_recovery.c new file mode 100755 index 0000000..e4e9642 --- /dev/null +++ b/server/ctsvc_schema_recovery.c @@ -0,0 +1,91 @@ +/* + * Contacts Service Helper + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +#include +#include +#include +#include + +#include "internal.h" +#include "ctsvc_server_sqlite.h" +#include "schema.h" +#include "ctsvc_schema_recovery.h" +#include "ctsvc_schema.h" + +static inline int __ctsvc_server_check_db_file(void) +{ + int fd = open(CTSVC_DB_PATH, O_RDONLY); + h_retvm_if(-1 == fd, CTSVC_ERR_NO_DB_FILE, + "DB file(%s) is not exist", CTSVC_DB_PATH); + + close(fd); + return CONTACTS_ERROR_NONE; +} + +static inline int __ctsvc_server_remake_db_file() +{ + int ret, fd; + char *errmsg; + sqlite3 *db; + + ret = ctsvc_server_db_open(&db); + h_retvm_if(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_server_db_open() Failed(%d)", ret); + + ret = sqlite3_exec(db, schema_query, NULL, 0, &errmsg); + if (SQLITE_OK != ret) { + ERR("remake contacts DB file is Failed : %s", errmsg); + sqlite3_free(errmsg); + } + + ctsvc_server_db_close(); + + fd = open(CTSVC_DB_PATH, O_CREAT | O_RDWR, 0660); + h_retvm_if(-1 == fd, CONTACTS_ERROR_SYSTEM, "open Failed"); + + ret = fchown(fd, getuid(), CTS_SECURITY_FILE_GROUP); + if (0 != ret) + ERR("fchown(%s) Failed(%d)", CTSVC_DB_PATH, ret); + ret = fchmod(fd, CTS_SECURITY_DEFAULT_PERMISSION); + if (0 != ret) + ERR("fchown(%s) Failed(%d)", CTSVC_DB_PATH, ret); + close(fd); + + fd = open(CTSVC_DB_JOURNAL_PATH, O_CREAT | O_RDWR, 0660); + h_retvm_if(-1 == fd, CONTACTS_ERROR_SYSTEM, "open Failed"); + + ret = fchown(fd, getuid(), CTS_SECURITY_FILE_GROUP); + if (0 != ret) + ERR("fchown(%s) Failed(%d)", CTSVC_DB_JOURNAL_PATH, ret); + ret = fchmod(fd, CTS_SECURITY_DEFAULT_PERMISSION); + if (0 != ret) + ERR("fchown(%s) Failed(%d)", CTSVC_DB_JOURNAL_PATH, ret); + close(fd); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_server_check_schema(void) +{ + if (CTSVC_ERR_NO_DB_FILE == __ctsvc_server_check_db_file()) + __ctsvc_server_remake_db_file(); + + return CONTACTS_ERROR_NONE; +} + diff --git a/helper/schema-recovery.h b/server/ctsvc_schema_recovery.h similarity index 76% rename from helper/schema-recovery.h rename to server/ctsvc_schema_recovery.h index 9f7a2f8..fa4f8b2 100755 --- a/helper/schema-recovery.h +++ b/server/ctsvc_schema_recovery.h @@ -3,8 +3,6 @@ * * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. * - * Contact: Youngjae Shin - * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -18,11 +16,11 @@ * limitations under the License. * */ -#ifndef __CTS_HELPER_SCHEMA_RECOVERY_H__ -#define __CTS_HELPER_SCHEMA_RECOVERY_H__ +#ifndef __CTSVC_SERVER_SCHEMA_RECOVERY_H__ +#define __CTSVC_SERVER_SCHEMA_RECOVERY_H__ -int helper_check_schema(); +int ctsvc_server_check_schema(); -#endif // __CTS_HELPER_SCHEMA_RECOVERY_H__ +#endif // __CTSVC_SERVER_SCHEMA_RECOVERY_H__ diff --git a/server/ctsvc_server.c b/server/ctsvc_server.c new file mode 100644 index 0000000..593c1fc --- /dev/null +++ b/server/ctsvc_server.c @@ -0,0 +1,146 @@ +/* + * Contact Service + * + * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include //getuid +#include +#include + +#include "internal.h" // DBG +#include "ctsvc_db_init.h" +#include "ctsvc_schema.h" +#include "ctsvc_schema_recovery.h" +#include "ctsvc_server_socket.h" +#include "ctsvc_server_utils.h" +#include "ctsvc_server_bg.h" + +#include "ctsvc_ipc_define.h" +#include "ctsvc_ipc_server.h" +#include "ctsvc_ipc_server2.h" +#include "ctsvc_ipc_server_sim.h" + +//static GMainLoop *loop; + +static int __server_main(); + +static int __server_main(void) +{ + int ret; + pims_ipc_svc_init(CTSVC_IPC_SOCKET_PATH, CTS_SECURITY_FILE_GROUP, 0777); + + do { + if (pims_ipc_svc_register(CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_CONNECT, ctsvc_ipc_server_connect, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_DISCONNECT, ctsvc_ipc_server_disconnect, NULL) != 0) break; + + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_INSERT_RECORD, ctsvc_ipc_server_db_insert_record, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_RECORD, ctsvc_ipc_server_db_get_record, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_UPDATE_RECORD, ctsvc_ipc_server_db_update_record, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_DELETE_RECORD, ctsvc_ipc_server_db_delete_record, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_REPLACE_RECORD, ctsvc_ipc_server_db_replace_record, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_ALL_RECORDS, ctsvc_ipc_server_db_get_all_records, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_RECORDS_WITH_QUERY, ctsvc_ipc_server_db_get_records_with_query, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_COUNT, ctsvc_ipc_server_db_get_count, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_COUNT_WITH_QUERY, ctsvc_ipc_server_db_get_count_with_query, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_INSERT_RECORDS, ctsvc_ipc_server_db_insert_records, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_UPDATE_RECORDS, ctsvc_ipc_server_db_update_records, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_DELETE_RECORDS, ctsvc_ipc_server_db_delete_records, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_REPLACE_RECORDS, ctsvc_ipc_server_db_replace_records, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_CHANGES_BY_VERSION, ctsvc_ipc_server_db_get_changes_by_version, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_CURRENT_VERSION, ctsvc_ipc_server_db_get_current_version, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_SEARCH_RECORDS, ctsvc_ipc_server_db_search_records, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_QUERY, ctsvc_ipc_server_db_search_records_with_query, NULL) != 0) break; + + if (pims_ipc_svc_register(CTSVC_IPC_ACTIVITY_MODULE, CTSVC_IPC_SERVER_ACTIVITY_DELETE_BY_CONTACT_ID, ctsvc_ipc_activity_delete_by_contact_id, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_ACTIVITY_MODULE, CTSVC_IPC_SERVER_ACTIVITY_DELETE_BY_ACCOUNT_ID, ctsvc_ipc_activity_delete_by_account_id, NULL) != 0) break; + + if (pims_ipc_svc_register(CTSVC_IPC_GROUP_MODULE, CTSVC_IPC_SERVER_GROUP_ADD_CONTACT, ctsvc_ipc_group_add_contact, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_GROUP_MODULE, CTSVC_IPC_SERVER_GROUP_REMOVE_CONTACT, ctsvc_ipc_group_remove_contact, NULL) != 0) break; + + if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_LINK_PERSON, ctsvc_ipc_person_link_person, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_UNLINK_CONTACT, ctsvc_ipc_person_unlink_contact, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_RESET_USAGE, ctsvc_ipc_person_reset_usage, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_SET_FAVORITE_ORDER, ctsvc_ipc_person_set_favorite_order, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_SET_DEFAULT_PROPERTY, ctsvc_ipc_person_set_default_property, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_GET_DEFAULT_PROPERTY, ctsvc_ipc_person_get_default_property, NULL) != 0) break; + + if (pims_ipc_svc_register(CTSVC_IPC_PHONELOG_MODULE, CTSVC_IPC_SERVER_PHONELOG_RESET_STATISTICS, ctsvc_ipc_phone_log_reset_statistics, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_PHONELOG_MODULE, CTSVC_IPC_SERVER_PHONELOG_DELETE, ctsvc_ipc_phone_log_delete, NULL) != 0) break; + + /* + if (pims_ipc_svc_register(CTSVC_IPC_SIM_MODULE, CTSVC_IPC_SERVER_SIM_IMPORT_ALL_CONTACTS, ctsvc_ipc_sim_import_all_contacts, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_SIM_MODULE, CTSVC_IPC_SERVER_SIM_EXPORT_PERSON, ctsvc_ipc_sim_export_person, NULL) != 0) break; + */ + if (pims_ipc_svc_register(CTSVC_IPC_SIM_MODULE, CTSVC_IPC_SERVER_SIM_INSERT_CONTACT, ctsvc_ipc_sim_insert_contact, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_SIM_MODULE, CTSVC_IPC_SERVER_SIM_UPDATE_CONTACT, ctsvc_ipc_sim_update_contact, NULL) != 0) break; + if (pims_ipc_svc_register(CTSVC_IPC_SIM_MODULE, CTSVC_IPC_SERVER_SIM_DELETE_CONTACT, ctsvc_ipc_sim_delete_contact, NULL) != 0) break; + + pims_ipc_svc_init_for_publish(CTSVC_IPC_SOCKET_PATH_FOR_CHANGE_SUBSCRIPTION, CTS_SECURITY_FILE_GROUP, 0660); + + ret = contacts_connect2(); + if (CONTACTS_ERROR_NONE != ret) { + SERVER_DBG("contacts_connect2 fail(%d)", ret); + break; + } + + ctsvc_server_bg_add_cb(); + ctsvc_server_bg_delete_start(); + + ret = ctsvc_server_init_configuration(); + SERVER_DBG("%d", ret); + + pims_ipc_svc_run_main_loop(NULL); + + ctsvc_server_final_configuration(); + + ctsvc_server_bg_remove_cb(); + + ret = contacts_disconnect2(); + if (CONTACTS_ERROR_NONE != ret) + SERVER_DBG("%d", ret); + + pims_ipc_svc_deinit_for_publish(); + + pims_ipc_svc_deinit(); + + return 0; + + } while(0); + + ERR("pims_ipc_svc_register error"); + return -1; +} + +int main(int argc, char *argv[]) +{ + SERVER_FN_CALL; + int ret; + ctsvc_server_check_schema(); + if (2 <= argc && !strcmp(argv[1], "schema")) + return CONTACTS_ERROR_NONE; + + ret = ctsvc_server_socket_init(); + SERVER_DBG("%d", ret); + + __server_main(); + + return 0; +} + diff --git a/server/ctsvc_server_bg.c b/server/ctsvc_server_bg.c new file mode 100644 index 0000000..eefa170 --- /dev/null +++ b/server/ctsvc_server_bg.c @@ -0,0 +1,383 @@ +/* + * Contact Service + * + * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include //sleep + +#include "contacts.h" +#include "internal.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_server_bg.h" +#include "ctsvc_utils.h" + +#define CTSVC_SERVER_BG_DELETE_COUNT 50 +#define CTSVC_SERVER_BG_DELETE_STEP_TIME 1 +#define CTSVC_SERVER_BG_DELETE_THREAD "ctsvc_server_bg_delete" + +typedef enum +{ + STEP_1, // get contact_ids + STEP_2, // delete data + STEP_3, // delete activity + STEP_4, // delete search_index, contact(image by trigger) +} __ctsvc_delete_step_e; + +typedef struct { + GSList *contact_ids; + int current_contact_id; + __ctsvc_delete_step_e step; +} __ctsvc_delete_data_s; + +GThread *__ctsvc_server_bg_delete_thread = NULL; +GCond __ctsvc_server_bg_delete_cond; +GMutex __ctsvc_server_bg_delete_mutex; + +static int __ctsvc_server_bg_contact_delete_step1(__ctsvc_delete_data_s* data) +{ + char query[CTS_SQL_MIN_LEN] = {0,}; + int ret; + cts_stmt stmt = NULL; + int count = 0; + GSList *cursor; + + if (data->contact_ids == NULL){ + // get event_list + snprintf(query, sizeof(query), "SELECT contact_id FROM "CTS_TABLE_CONTACTS" WHERE deleted = 1"); + stmt = cts_query_prepare(query); + if (NULL == stmt) { + ERR("cts_query_prepare() Failed"); + return CONTACTS_ERROR_DB; + } + + while(1 == (ret = cts_stmt_step(stmt))) { + int id = 0; + id = ctsvc_stmt_get_int(stmt, 0); + data->contact_ids = g_slist_append(data->contact_ids, GINT_TO_POINTER(id)); + } + cts_stmt_finalize(stmt); + } + + count = g_slist_length(data->contact_ids); + if (count <= 0) + return CONTACTS_ERROR_DB; + + cursor = g_slist_nth(data->contact_ids, 0); + if (cursor) { + data->current_contact_id = GPOINTER_TO_INT(cursor->data); + data->contact_ids = g_slist_remove(data->contact_ids, GINT_TO_POINTER(data->current_contact_id)); + + return CONTACTS_ERROR_NONE; + } + else { + return CONTACTS_ERROR_NO_DATA; + } +} + +// remove data +static int __ctsvc_server_bg_contact_delete_step2(__ctsvc_delete_data_s* data) +{ + SERVER_FN_CALL; + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + GSList *list = NULL; + cts_stmt stmt = NULL; + int count = 0; + GSList *cursor; + + // get event_list + snprintf(query, sizeof(query), + "SELECT id FROM "CTS_TABLE_DATA" WHERE contact_id = %d LIMIT %d", + data->current_contact_id, CTSVC_SERVER_BG_DELETE_COUNT); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + ERR("cts_query_prepare() Failed"); + return CONTACTS_ERROR_DB; + } + + while(1 == (ret = cts_stmt_step(stmt))) { + int id = 0; + id = ctsvc_stmt_get_int(stmt, 0); + list = g_slist_append(list, GINT_TO_POINTER(id)); + } + cts_stmt_finalize(stmt); + + count = g_slist_length(list); + if (count <= 0) + return CONTACTS_ERROR_NO_DATA; + + ret = ctsvc_begin_trans(); + h_retvm_if(CONTACTS_ERROR_NONE != ret, CONTACTS_ERROR_DB, "DB failed" ); + + cursor = g_slist_nth(list, 0); + while(cursor) { + int id = GPOINTER_TO_INT(cursor->data); + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d", id); + + ret = ctsvc_query_exec(query); + SERVER_DBG("%s",query); + if (ret != CONTACTS_ERROR_NONE) { + ERR("DB failed"); + ctsvc_end_trans(false); + g_slist_free(list); + return CONTACTS_ERROR_DB; + } + cursor = g_slist_next(cursor); + } + g_slist_free(list); + ret = ctsvc_end_trans(true); + + return ret; +} + +// remove activities +static int __ctsvc_server_bg_contact_delete_step3(__ctsvc_delete_data_s* data) +{ + SERVER_FN_CALL; + + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + GSList *list = NULL; + cts_stmt stmt = NULL; + int count = 0; + GSList *cursor; + + // get event_list + snprintf(query, sizeof(query), + "SELECT id FROM "CTS_TABLE_ACTIVITIES" WHERE contact_id = %d LIMIT %d", + data->current_contact_id, CTSVC_SERVER_BG_DELETE_COUNT); + + stmt = cts_query_prepare(query); + if (NULL == stmt) { + ERR("cts_query_prepare() Failed"); + return CONTACTS_ERROR_DB; + } + + while(1 == (ret = cts_stmt_step(stmt))) { + int id = 0; + id = ctsvc_stmt_get_int(stmt, 0); + list = g_slist_append(list, GINT_TO_POINTER(id)); + } + cts_stmt_finalize(stmt); + + count = g_slist_length(list); + if (count <= 0) + return CONTACTS_ERROR_NO_DATA; + + ret = ctsvc_begin_trans(); + h_retvm_if(CONTACTS_ERROR_NONE != ret, CONTACTS_ERROR_DB, "DB failed" ); + + cursor = g_slist_nth(list, 0); + while(cursor) { + int id = GPOINTER_TO_INT(cursor->data); + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_ACTIVITIES" WHERE id = %d", id); + + ret = ctsvc_query_exec(query); + SERVER_DBG("%s",query); + if (ret != CONTACTS_ERROR_NONE) { + ERR("DB failed"); + ctsvc_end_trans(false); + g_slist_free(list); + return CONTACTS_ERROR_DB; + } + cursor = g_slist_next(cursor); + } + g_slist_free(list); + ret = ctsvc_end_trans(true); + + return ret; +} + +static int __ctsvc_server_bg_contact_delete_step4(__ctsvc_delete_data_s* data) +{ + int ret; + char query[CTS_SQL_MIN_LEN] = {0}; + + ret = ctsvc_begin_trans(); + h_retvm_if(CONTACTS_ERROR_NONE != ret, CONTACTS_ERROR_DB, "DB failed" ); + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_SEARCH_INDEX" WHERE contact_id = %d", + data->current_contact_id); + ret = ctsvc_query_exec(query); + SERVER_DBG("%s",query); + if (CONTACTS_ERROR_NONE != ret) { + ERR("DB failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_CONTACTS" WHERE contact_id = %d", + data->current_contact_id); + ret = ctsvc_query_exec(query); + SERVER_DBG("%s",query); + if (CONTACTS_ERROR_NONE != ret) { + ERR("DB failed"); + ctsvc_end_trans(false); + return CONTACTS_ERROR_DB; + } + + ret = ctsvc_end_trans(true); + return ret; +} + +static bool __ctsvc_server_bg_contact_delete_step(int ret, __ctsvc_delete_data_s* data) +{ + if (ret != CONTACTS_ERROR_NONE && ret != CONTACTS_ERROR_NO_DATA) { + if(data->contact_ids) + g_slist_free(data->contact_ids); + ERR("fail (%d)",ret); + return false; + } + + switch (data->step) { + case STEP_1: + if (ret == CONTACTS_ERROR_NO_DATA) { + if(data->contact_ids) + g_slist_free(data->contact_ids); + ERR("step_1 no_data"); + return false; + } + data->step = STEP_2; + break; + case STEP_2: + if (ret == CONTACTS_ERROR_NO_DATA) + data->step = STEP_3; + break; + case STEP_3: + if (ret == CONTACTS_ERROR_NO_DATA) + data->step = STEP_4; + break; + case STEP_4: + data->step = STEP_1; + break; + default: + data->step = STEP_1; + break; + } + + return true; +} + +static bool __ctsvc_server_db_delete_run(__ctsvc_delete_data_s* data) +{ + SERVER_FN_CALL; + int ret = CONTACTS_ERROR_NONE; + + if(data == NULL) { + ERR("data is NULL"); + return false; + } + + switch (data->step) { + case STEP_1: + ret = __ctsvc_server_bg_contact_delete_step1(data); + break; + case STEP_2: + ret = __ctsvc_server_bg_contact_delete_step2(data); + break; + case STEP_3: + ret = __ctsvc_server_bg_contact_delete_step3(data); + break; + case STEP_4: + ret = __ctsvc_server_bg_contact_delete_step4(data); + break; + default: + ERR("invalid step"); + if(data->contact_ids) + g_slist_free(data->contact_ids); + return false; + } + + return __ctsvc_server_bg_contact_delete_step(ret, data); +} + +static gpointer __ctsvc_server_bg_delete(gpointer user_data) +{ + SERVER_FN_CALL; + int ret; + __ctsvc_delete_data_s *callback_data = NULL; + + while(1) { + callback_data = calloc(1,sizeof(__ctsvc_delete_data_s)); + if (callback_data == NULL) { + ERR("calloc fail"); + continue; + } + callback_data->step = STEP_1; + + ret = contacts_connect2(); + if (CONTACTS_ERROR_NONE != ret) { + SERVER_DBG("%d", ret); + free(callback_data); + continue; + } + + while(1) { + sleep(CTSVC_SERVER_BG_DELETE_STEP_TIME); // sleep 1 sec. + if (__ctsvc_server_db_delete_run(callback_data) == false) { + SERVER_DBG("end"); + free(callback_data); + break; + } + } + ret = contacts_disconnect2(); + if (CONTACTS_ERROR_NONE != ret) + SERVER_DBG("%d", ret); + + g_mutex_lock(&__ctsvc_server_bg_delete_mutex); + SERVER_DBG("wait"); + g_cond_wait(&__ctsvc_server_bg_delete_cond, &__ctsvc_server_bg_delete_mutex); + g_mutex_unlock(&__ctsvc_server_bg_delete_mutex); + } + + return NULL; +} + +void ctsvc_server_bg_delete_start() +{ + SERVER_FN_CALL; + + if (__ctsvc_server_bg_delete_thread == NULL) { + g_mutex_init(&__ctsvc_server_bg_delete_mutex); + g_cond_init(&__ctsvc_server_bg_delete_cond); + __ctsvc_server_bg_delete_thread = g_thread_new(CTSVC_SERVER_BG_DELETE_THREAD, + __ctsvc_server_bg_delete, NULL); + } + + // don't use mutex. + g_cond_signal(&__ctsvc_server_bg_delete_cond); +} + +void __ctsvc_server_addressbook_deleted_cb(const char *view_uri, void *data) +{ + ctsvc_server_bg_delete_start(); +} + +int ctsvc_server_bg_add_cb() +{ + return contacts_db_add_changed_cb(_contacts_address_book._uri, __ctsvc_server_addressbook_deleted_cb, NULL); +} + +int ctsvc_server_bg_remove_cb() +{ + return contacts_db_remove_changed_cb(_contacts_address_book._uri, __ctsvc_server_addressbook_deleted_cb, NULL); +} + diff --git a/server/ctsvc_server_bg.h b/server/ctsvc_server_bg.h new file mode 100644 index 0000000..9ad1064 --- /dev/null +++ b/server/ctsvc_server_bg.h @@ -0,0 +1,27 @@ +/* + * Contact Service + * + * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_SERVER_BG_H__ +#define __CTSVC_SERVER_BG_H__ + +void ctsvc_server_bg_delete_start(); +int ctsvc_server_bg_add_cb(); +int ctsvc_server_bg_remove_cb(); + +#endif /* __CTSVC_SERVER_BG_H__ */ diff --git a/server/ctsvc_server_change_subject.c b/server/ctsvc_server_change_subject.c new file mode 100644 index 0000000..34d57fe --- /dev/null +++ b/server/ctsvc_server_change_subject.c @@ -0,0 +1,128 @@ +/* + * Contacts Service Helper + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include + +#include "contacts.h" +#include "ctsvc_internal.h" + +#include "ctsvc_ipc_define.h" +#include "ctsvc_server_change_subject.h" + +#define CTSVC_SUBSCRIBE_MAX_LEN 1024 + +static __thread char *__phone_log_chanaged_info = NULL; +static __thread unsigned int __phone_log_buf_size = 0; + +static __thread char *__person_changed_info = NULL; +static __thread unsigned int __person_buf_size = 0; + +static gboolean __ctsvc_publish_changes_with_data(const char *view_uri, char *data) +{ + pims_ipc_data_h indata = NULL; + if( NULL == data ) + return true; + + indata = pims_ipc_data_create(0); + if (!indata) { + ERR("pims_ipc_data_create error\n"); + return false; + } + + if (pims_ipc_data_put(indata, data, strlen(data) + 1) != 0) { + ERR("pims_ipc_data_put error\n"); + return false; + } + + if (pims_ipc_svc_publish(CTSVC_IPC_SUBSCRIBE_MODULE, (char*)view_uri, indata) != 0) { + ERR("pims_ipc_svc_publish error\n"); + return false; + } + + pims_ipc_data_destroy(indata); + + return true; +} + +void ctsvc_change_subject_publish_changed_info() +{ + __ctsvc_publish_changes_with_data(_contacts_person._uri, __person_changed_info); + __ctsvc_publish_changes_with_data(_contacts_phone_log._uri, __phone_log_chanaged_info); + ctsvc_change_subject_clear_changed_info(); +} + +void ctsvc_change_subject_clear_changed_info() +{ + free(__phone_log_chanaged_info); + __phone_log_chanaged_info = NULL; + __phone_log_buf_size = 0; + + free(__person_changed_info); + __person_changed_info = NULL; + __person_buf_size = 0; +} + +void ctsvc_change_subject_add_changed_phone_log_id(contacts_changed_e type, int id) +{ + CTS_FN_CALL; + int len = 0; + int info_len = 0; + char changed_info[30] = {0}; + + if (!__phone_log_chanaged_info) { + __phone_log_chanaged_info = (char*)calloc(CTSVC_SUBSCRIBE_MAX_LEN, sizeof(char)); + __phone_log_buf_size = CTSVC_SUBSCRIBE_MAX_LEN; + __phone_log_chanaged_info[0] = '\0'; + } + + len = snprintf(changed_info, sizeof(changed_info), "%d:%d,", type, id); + info_len = strlen(__phone_log_chanaged_info); + CTS_DBG("%s(len : %d), %s (crrent_len : %d), max_len : %d", + changed_info, len, __phone_log_chanaged_info, info_len, __phone_log_buf_size); + if (info_len + len > __phone_log_buf_size) { + __phone_log_chanaged_info = realloc(__phone_log_chanaged_info, __phone_log_buf_size * 2); + __phone_log_buf_size *= 2; + } + snprintf(__phone_log_chanaged_info + info_len, __phone_log_buf_size - info_len, "%s", changed_info); + CTS_DBG("%s", __phone_log_chanaged_info); +} + +void ctsvc_change_subject_add_changed_person_id(contacts_changed_e type, int id) +{ + CTS_FN_CALL; + int len = 0; + int info_len = 0; + char changed_info[30] = {0}; + + if (!__person_changed_info) { + __person_changed_info = (char*)calloc(CTSVC_SUBSCRIBE_MAX_LEN, sizeof(char)); + __person_buf_size = CTSVC_SUBSCRIBE_MAX_LEN; + __person_changed_info[0] = '\0'; + } + + len = snprintf(changed_info, sizeof(changed_info), "%d:%d,", type, id); + info_len = strlen(__person_changed_info); + if (info_len + len > __person_buf_size) { + __person_changed_info = realloc(__person_changed_info, __person_buf_size * 2); + __person_buf_size *= 2; + } + snprintf(__person_changed_info + info_len, __person_buf_size - info_len, "%s", changed_info); +} diff --git a/helper/sqlite.h b/server/ctsvc_server_change_subject.h old mode 100755 new mode 100644 similarity index 60% rename from helper/sqlite.h rename to server/ctsvc_server_change_subject.h index a2b5368..af27d00 --- a/helper/sqlite.h +++ b/server/ctsvc_server_change_subject.h @@ -1,35 +1,31 @@ -/* - * Contacts Service Helper - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_HELPER_SQLITE_H__ -#define __CTS_HELPER_SQLITE_H__ - -#include - -int helper_db_open(sqlite3 **db); -int helper_db_close(void); -int helper_update_default_language(int system_lang, int default_lang); -int helper_insert_SDN_contact(const char *name, const char *number); -int helper_delete_SDN_contact(void); -int helper_update_collation(); - -#endif // __CTS_HELPER_SQLITE_H__ - - +/* + * Contacts Service Helper + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_SERVER_CHANGE_SUBJECT_H__ +#define __CTSVC_SERVER_CHANGE_SUBJECT_H__ + +#include "contacts_types.h" + +void ctsvc_change_subject_publish_changed_info(); +void ctsvc_change_subject_clear_changed_info(); + +void ctsvc_change_subject_add_changed_phone_log_id(contacts_changed_e type, int id); +void ctsvc_change_subject_add_changed_person_id(contacts_changed_e type, int id); + +#endif // __CTSVC_SERVER_CHANGE_SUBJECT_H__ \ No newline at end of file diff --git a/server/ctsvc_server_sim.c b/server/ctsvc_server_sim.c new file mode 100755 index 0000000..9729deb --- /dev/null +++ b/server/ctsvc_server_sim.c @@ -0,0 +1,667 @@ +/* + * Contacts Service Helper + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "internal.h" +#include "ctsvc_struct.h" +#include "ctsvc_server_socket.h" +#include "ctsvc_server_sqlite.h" +#include "ctsvc_server_utils.h" +#include "ctsvc_server_sim.h" +#include "ctsvc_utils.h" + +#define PHONE_ADDRESSBOOK_ID 0 + +#define CTSVC_TAPI_SIM_PB_MAX 0xFFFF +//#define CTSVC_SIM_DATA_MAX_LENGTH 1024 + +#define TAPI_PB_MAX_FILE_CNT TAPI_PB_3G_PBC+1 +#define TAPI_PB_NAME_INDEX TAPI_PB_3G_NAME +#define TAPI_PB_NUMBER_INDEX TAPI_PB_3G_NUMBER + +#define CTSVC_2GSIM_NAME TAPI_PB_3G_NAME +#define CTSVC_2GSIM_NUMBER TAPI_PB_3G_NUMBER + +static TapiHandle *ghandle = NULL; +static TelSimPbType_t gsim_type = TAPI_SIM_PB_UNKNOWNN; +static void* greturn_data = NULL; +static int gsim_addressbook_id =0; + +typedef struct { + unsigned int index_max; + unsigned int text_max; + unsigned int used_count; + + unsigned int (*get_index_max)(void *); + unsigned int (*get_text_max)(void *); + unsigned int (*get_unused_count)(void *); + void (*increase_used_count)(void *); + void (*set)(void *,int ,int ,int ); +}sim_file_s; + +static sim_file_s gfile_record[TAPI_PB_MAX_FILE_CNT]; +static GSList *gcontact_records = NULL; +static bool ginit_completed = false; + +static inline unsigned int get_index_max(void *this) +{ + return ((sim_file_s*)this)->index_max; +} + +static inline unsigned int get_unused_count(void *this) +{ + return ((sim_file_s*)this)->index_max - ((sim_file_s*)this)->used_count; +} + +static inline unsigned int get_text_max(void *this) +{ + return ((sim_file_s*)this)->text_max; +} + +static inline void increase_used_count(void *this) +{ + ((sim_file_s*)this)->used_count++; +} + +static inline void set(void *this,int index,int text,int used_count) +{ + ((sim_file_s*)this)->index_max = index; + ((sim_file_s*)this)->text_max = text; + ((sim_file_s*)this)->used_count = used_count; +} +static inline TelSimPbType_t __ctsvc_server_get_sim_type(void) +{ + return gsim_type; +} +static inline void __ctsvc_server_set_contact_records(GSList * list) +{ + gcontact_records = list; +} + +static inline GSList* __ctsvc_server_get_contact_records(void) +{ + h_retvm_if(gcontact_records == NULL, NULL, "gcontact_records is NULL"); + return gcontact_records; +} + +static inline void __ctsvc_server_sim_set_init_completed(bool init) +{ + SERVER_DBG("set ginit_completed = %d ", init); + ginit_completed = init; +} + +bool ctsvc_server_sim_get_init_completed(void) +{ + SERVER_DBG("get complete_init_flag = %d ", ginit_completed); + return ginit_completed; +} +static inline void __ctsvc_server_set_sim_addressbook_id(int id) +{ + gsim_addressbook_id = id; +} +static void __ctsvc_server_init_sim_file(void) +{ + int i= 0; + for(i = 0 ;i name); + free(record->number); + free(record->anr1); + free(record->anr2); + free(record->anr3); + free(record->email1); + free(record->email2); + free(record->email3); + free(record->email4); + free(record); + return; +} +static sim_file_s * __ctsvc_server_sim_get_file_record(TelSimPb3GFileType_t file_type) +{ + return &gfile_record[file_type]; +} +int ctsvc_server_sim_finalize(void) +{ + SERVER_FN_CALL; + GSList *cursor = NULL; + sim_contact_s *record = NULL; + + int ret = 0; + if (ghandle) { + ret = tel_deinit(ghandle); + h_retvm_if(TAPI_API_SUCCESS != ret, CONTACTS_ERROR_SYSTEM, + "tel_deinit() Failed(%d)", ret); + } + + for (cursor=__ctsvc_server_get_contact_records();cursor;cursor=g_slist_next(cursor)){ + record = cursor->data; + __ctsvc_server_set_contact_records(g_slist_remove(__ctsvc_server_get_contact_records(),cursor)); + ctsvc_server_sim_destroy_contact_record(record); + } + + contacts_disconnect2(); + + return CONTACTS_ERROR_NONE; +} + +static void __ctsvc_server_set_sim_type(void) +{ + int err = 0; + TelSimCardType_t cardtype = TAPI_SIM_PB_UNKNOWNN; + err = tel_get_sim_type(__ctsvc_server_get_tapi_handle(), &cardtype); + h_retm_if(err != TAPI_API_SUCCESS,"tel_get_sim_type failed"); + + if(cardtype == TAPI_SIM_CARD_TYPE_USIM) + gsim_type = TAPI_SIM_PB_3GSIM; + else + gsim_type = TAPI_SIM_PB_ADN; +} + +static inline void __ctsvc_server_set_return_data(void* data) +{ + greturn_data = data; +} + +static inline void* __ctsvc_server_get_return_data(void) +{ + h_retvm_if(greturn_data == NULL, NULL, "ghelper_data is NULL"); + return greturn_data; +} + +static sim_contact_s * __ctsvc_server_sim_create_contact_record(TelSimPbRecord_t *sim_record) +{ + sim_contact_s *record = calloc(1,sizeof(sim_contact_s)); + record->sim_index = sim_record->index; + record->next_index = sim_record->next_index; + record->name = SAFE_STRDUP((char*)sim_record->name); + record->nickname = SAFE_STRDUP((char*)sim_record->sne); + record->number = SAFE_STRDUP((char*)sim_record->number); + record->anr1 = SAFE_STRDUP((char*)sim_record->anr1); + record->anr2 = SAFE_STRDUP((char*)sim_record->anr2); + record->anr3 = SAFE_STRDUP((char*)sim_record->anr3); + record->email1 = SAFE_STRDUP((char*)sim_record->email1); + record->email2 = SAFE_STRDUP((char*)sim_record->email2); + record->email3 = SAFE_STRDUP((char*)sim_record->email3); + record->email4 = SAFE_STRDUP((char*)sim_record->email4); + + return record; +} + +static inline int __ctsvc_server_insert_db_num(contacts_record_h *record, char *number) +{ + + int ret; + h_retvm_if(number == NULL,CONTACTS_ERROR_INVALID_PARAMETER, "invalid number"); + + ret = contacts_record_create(_contacts_number._uri, record); + h_retvm_if(ret < CONTACTS_ERROR_NONE,ret, "contacts_record_destroy() Failed(%d)", ret); + ret = contacts_record_set_str(*record, _contacts_number.number, number); + h_retvm_if(ret < CONTACTS_ERROR_NONE,ret, "contacts_record_set_str() Failed(%d)", ret); + ret = contacts_record_set_int(*record, _contacts_number.type, CONTACTS_NUMBER_TYPE_CELL); + h_retvm_if(ret < CONTACTS_ERROR_NONE,ret, "contacts_record_set_int() Failed(%d)", ret); + return ret; +} + +static inline int __ctsvc_server_insert_db_email(contacts_record_h *record, char *email) +{ + int ret; + + h_retvm_if(email == NULL,CONTACTS_ERROR_INVALID_PARAMETER, "invalid email"); + + ret = contacts_record_create(_contacts_email._uri, record); + h_retvm_if(ret < CONTACTS_ERROR_NONE,ret, "contacts_record_destroy() Failed(%d)", ret); + ret = contacts_record_set_str(*record, _contacts_email.email, email); + h_retvm_if(ret < CONTACTS_ERROR_NONE,ret, "contacts_record_set_str() Failed(%d)", ret); + ret = contacts_record_set_int(*record, _contacts_email.type,CONTACTS_EMAIL_TYPE_HOME); + h_retvm_if(ret < CONTACTS_ERROR_NONE,ret, "contacts_record_set_int() Failed(%d)", ret); + return ret; +} + +static int __ctsvc_server_insert_contact_to_db(sim_contact_s *record,int* contact_id, int addressbook_id) +{ + SERVER_FN_CALL; + int ret; + char sim_id[20] = {0}; + contacts_record_h contact = NULL; + contacts_record_h name = NULL; + contacts_record_h number = NULL; + contacts_record_h email = NULL; + contacts_record_h nick = NULL; + + h_retvm_if(record == NULL, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter : record is NULL"); + h_retvm_if(contact_id == NULL, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter : contact_id is NULL"); + h_retvm_if(record->sim_index <= 0, CONTACTS_ERROR_INVALID_PARAMETER, "The index(%d) is invalid", record->sim_index); + + SERVER_DBG("insert record -> sim_index %d",record->sim_index); + + ret = contacts_record_create(_contacts_contact._uri, &contact); + h_retvm_if(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create failed(%d)", ret); + snprintf(sim_id, sizeof(sim_id), "%d", record->sim_index); + contacts_record_set_str(contact, _contacts_contact.uid, sim_id); + + if (record->name) { + contacts_record_create(_contacts_name._uri, &name); + if (name) { + contacts_record_set_str(name, _contacts_name.first, (char *)record->name); + contacts_record_add_child_record(contact, _contacts_contact.name, name); + } + } + SERVER_DBG("insert record -> name %s", record->name); + + if (record->nickname) { + contacts_record_create(_contacts_nickname._uri, &nick); + if (nick) { + contacts_record_set_str(nick, _contacts_nickname.name, (char *)record->nickname); + contacts_record_add_child_record(contact, _contacts_contact.nickname, nick); + } + } + SERVER_DBG("insert record -> nick name %s", record->nickname); + + if (record->number) { + contacts_record_create(_contacts_number._uri, &number); + if (number) { + contacts_record_set_str(number, _contacts_number.number, (char *)record->number); + contacts_record_set_int(number, _contacts_number.type, CONTACTS_NUMBER_TYPE_CELL); + contacts_record_add_child_record(contact, _contacts_contact.number, number); + } + } + SERVER_DBG("insert record ->number %s", record->number); + + ret = __ctsvc_server_insert_db_num(&number, (char *)record->anr1); + if (CONTACTS_ERROR_NONE == ret) + contacts_record_add_child_record(contact, _contacts_contact.number, number); + SERVER_DBG("insert record ->anr1 %s", record->anr1); + + ret = __ctsvc_server_insert_db_num(&number, (char *)record->anr2); + if (CONTACTS_ERROR_NONE == ret) + contacts_record_add_child_record(contact, _contacts_contact.number, number); + SERVER_DBG("insert record ->anr2 %s", record->anr2); + + ret = __ctsvc_server_insert_db_num(&number, (char *)record->anr3); + if (CONTACTS_ERROR_NONE == ret) + contacts_record_add_child_record(contact, _contacts_contact.number, number); + SERVER_DBG("insert record ->anr3 %s", record->anr3); + + ret = __ctsvc_server_insert_db_email(&email, (char *)record->email1); + if (CONTACTS_ERROR_NONE == ret) + contacts_record_add_child_record(contact, _contacts_contact.email, email); + SERVER_DBG("insert record ->email1 %s", record->email1); + + ret = __ctsvc_server_insert_db_email(&email, (char *)record->email2); + if (CONTACTS_ERROR_NONE == ret) + contacts_record_add_child_record(contact, _contacts_contact.email, email); + SERVER_DBG("insert record ->email2 %s", record->email2); + + ret = __ctsvc_server_insert_db_email(&email, (char *)record->email3); + if (CONTACTS_ERROR_NONE == ret) + contacts_record_add_child_record(contact, _contacts_contact.email, email); + SERVER_DBG("insert record ->email3 %s", record->email3); + + ret = __ctsvc_server_insert_db_email(&email, (char *)record->email4); + if (CONTACTS_ERROR_NONE == ret) + contacts_record_add_child_record(contact, _contacts_contact.email, email); + SERVER_DBG("insert record ->email4 %s", record->email4); + + contacts_record_set_int(contact, _contacts_contact.address_book_id, addressbook_id); + ret = contacts_db_insert_record(contact, contact_id); + h_warn_if(ret < CONTACTS_ERROR_NONE, "contacts_db_insert_record() Failed(%d)", ret); + record->contact_id = *contact_id; + SERVER_DBG("inserted contact id = %d",record->contact_id); + contacts_record_destroy(contact, true); + h_warn_if(ret < CONTACTS_ERROR_NONE, "contacts_record_destroy() Failed(%d)", ret); + + return ret; +} + +static void __ctsvc_server_sim_import_read_cb(TapiHandle *handle, int result, void *data, void* user_data) +{ + SERVER_FN_CALL; + int ret = 0; + TelSimPbAccessResult_t access_rt = result; + TelSimPbRecord_t *sim_info = data; + sim_contact_s *record = NULL; + int start_index = 0; + int contact_id =0; + + if(user_data != NULL) + start_index = (int)user_data; + + + if (NULL == sim_info) { + ERR("sim_info is NULL, result = %d", access_rt); + ret = CONTACTS_ERROR_SYSTEM; + goto ERROR_RETURN; + } + + if(access_rt == TAPI_SIM_PB_INVALID_INDEX) { + SERVER_DBG("TAPI_SIM_PB_INVALID_INDEX : start_index = %d",start_index); + start_index++; //search for start index + sim_file_s *file = __ctsvc_server_sim_get_file_record(TAPI_PB_3G_NAME); + if(start_index > file->get_index_max((void*)file)){ + ERR("start_index is invalid start_index = %d, total = %d", start_index,file->get_index_max((void*)file)); + ret = CONTACTS_ERROR_SYSTEM; + goto ERROR_RETURN; + } + ret = tel_read_sim_pb_record(handle, __ctsvc_server_get_sim_type(), start_index, __ctsvc_server_sim_import_read_cb, (void*)start_index); + if(ret != TAPI_API_SUCCESS){ + ERR("SIM phonebook access Failed(%d) start_indext(%d)", access_rt,start_index); + ret = CONTACTS_ERROR_SYSTEM; + goto ERROR_RETURN; + } + } + + if (TAPI_SIM_PB_SUCCESS != access_rt) { + ERR("SIM phonebook access Failed(%d)", access_rt); + ret = CONTACTS_ERROR_SYSTEM; + goto ERROR_RETURN; + } + switch (sim_info->phonebook_type) { + case TAPI_SIM_PB_ADN: + case TAPI_SIM_PB_3GSIM: + record = __ctsvc_server_sim_create_contact_record(sim_info); + ret = __ctsvc_server_insert_contact_to_db(record, &contact_id,PHONE_ADDRESSBOOK_ID); + ctsvc_server_sim_destroy_contact_record(record); + if(ret < CONTACTS_ERROR_NONE || contact_id <= 0) { + ERR("__ctsvc_server_insert_or_update_contact_to_db is fail(%d)",ret); + goto ERROR_RETURN; + } + break; + case TAPI_SIM_PB_FDN: + case TAPI_SIM_PB_SDN: + default: + ERR("Unknown storage type(%d)", sim_info->phonebook_type); + ret = CONTACTS_ERROR_SYSTEM; + goto ERROR_RETURN; + } + if (sim_info->next_index && CTSVC_TAPI_SIM_PB_MAX != sim_info->next_index) { + SERVER_DBG("NextIndex = %d", sim_info->next_index); + ret = tel_read_sim_pb_record(__ctsvc_server_get_tapi_handle(), sim_info->phonebook_type, + sim_info->next_index, __ctsvc_server_sim_import_read_cb, NULL); + if (TAPI_API_SUCCESS != ret) { + ERR("tel_read_sim_pb_record() Failed(%d)", ret); + ret = CONTACTS_ERROR_SYSTEM; + goto ERROR_RETURN; + } + } + else { + if (__ctsvc_server_get_return_data()) { + ret = ctsvc_server_socket_return(__ctsvc_server_get_return_data(), CONTACTS_ERROR_NONE, 0, NULL); + h_warn_if(CONTACTS_ERROR_NONE != ret, "ctsvc_server_socket_return() Failed(%d)", ret); + __ctsvc_server_set_return_data(NULL); + } + } + return; + +ERROR_RETURN: + if (__ctsvc_server_get_return_data()) { + ret = ctsvc_server_socket_return(__ctsvc_server_get_return_data(), ret, 0, NULL); + h_warn_if(CONTACTS_ERROR_NONE != ret, "ctsvc_server_socket_return() Failed(%d)", ret); + __ctsvc_server_set_return_data(NULL); + } + return; +} + +int ctsvc_server_sim_import(void* data) +{ + SERVER_FN_CALL; + int ret; + + h_retvm_if(false == ctsvc_server_sim_get_init_completed(), CONTACTS_ERROR_SYSTEM,"sim init is not completed"); + h_retvm_if(NULL != __ctsvc_server_get_return_data(), CONTACTS_ERROR_INTERNAL,"Helper is already processing with sim"); + + __ctsvc_server_set_return_data(data); + + sim_file_s *file = __ctsvc_server_sim_get_file_record(TAPI_PB_3G_NAME); + if(file->get_unused_count((void*)file) == file->get_index_max((void*)file)){ + ret = ctsvc_server_socket_return(__ctsvc_server_get_return_data(), CONTACTS_ERROR_NO_DATA, 0, NULL); + h_warn_if(CONTACTS_ERROR_SYSTEM != ret, "helper_socket_return() Failed(%d)", ret); + __ctsvc_server_set_return_data(NULL); + return ret; + } + + ret = tel_read_sim_pb_record(__ctsvc_server_get_tapi_handle(), __ctsvc_server_get_sim_type(), 1, + __ctsvc_server_sim_import_read_cb, NULL); + if (ret != TAPI_API_SUCCESS) { + ERR("tel_read_sim_pb_record = %d",ret); + __ctsvc_server_set_return_data(NULL); + return CONTACTS_ERROR_SYSTEM; + } + + return CONTACTS_ERROR_NONE; +} + +static void __ctsvc_server_sim_sdn_read_cb(TapiHandle *handle, int result, void *data, void *user_data) +{ + SERVER_FN_CALL; + int ret=0; + TelSimPbAccessResult_t sec_rt = result; + TelSimPbRecord_t *sim_info = data; + + h_retm_if(sim_info == NULL, "sim_info is NULL"); + + if (TAPI_SIM_PB_SUCCESS != sec_rt) { + if (TAPI_SIM_PB_SDN == sim_info->phonebook_type && + TAPI_SIM_PB_INVALID_INDEX == sec_rt) { + SERVER_DBG("Index = %d", sim_info->index); + ret = tel_read_sim_pb_record(handle, sim_info->phonebook_type,sim_info->index+1, + __ctsvc_server_sim_sdn_read_cb, NULL); + h_retm_if(ret != TAPI_API_SUCCESS, "tel_read_sim_pb_record() Failed(%d)", ret); + } + ERR("SIM phonebook access Failed(%d)", sec_rt); + goto ERROR_RETURN; + } + + switch (sim_info->phonebook_type) { + case TAPI_SIM_PB_SDN: + ret = ctsvc_server_insert_sdn_contact((char *)sim_info->name, (char *)sim_info->number); + h_warn_if(ret != CONTACTS_ERROR_NONE, "ctsvc_server_insert_sdn_contact() Failed(%d)", ret); + break; + case TAPI_SIM_PB_ADN: + case TAPI_SIM_PB_3GSIM: + case TAPI_SIM_PB_FDN: + default: + ERR("Unknown storage type(%d)", sim_info->phonebook_type); + goto ERROR_RETURN; + } + + if (sim_info->next_index && CTSVC_TAPI_SIM_PB_MAX != sim_info->next_index) { + SERVER_DBG("NextIndex = %d", sim_info->next_index); + ret = tel_read_sim_pb_record(handle, sim_info->phonebook_type,sim_info->next_index, + __ctsvc_server_sim_sdn_read_cb, NULL); + if (TAPI_API_SUCCESS != ret) { + ERR("tel_read_sim_pb_record() Failed(%d)", ret); + goto ERROR_RETURN; + } + } + else { + // read SDN done ( success ) + // sim_data = NULL; + ctsvc_server_trim_memory(); + } + return; + +ERROR_RETURN: + // sim_data = NULL; + ctsvc_server_trim_memory(); + return; +} + +int ctsvc_server_sim_read_sdn(void* data) +{ + SERVER_FN_CALL; + int ret, card_changed = 0; + TelSimCardStatus_t sim_status; + + h_retvm_if(NULL != __ctsvc_server_get_return_data(), CONTACTS_ERROR_INVALID_PARAMETER, + "Helper is already processing with sim"); + ret = tel_get_sim_init_info(__ctsvc_server_get_tapi_handle(), &sim_status, &card_changed); + if(TAPI_API_SUCCESS != ret) { + ERR("tel_get_sim_init_info() Failed(%d)", ret); + SERVER_DBG("sim_status = %d, card_changed = %d", sim_status, card_changed); + goto ERROR_RETURN; + } + + if (TAPI_SIM_STATUS_CARD_NOT_PRESENT == sim_status || + TAPI_SIM_STATUS_CARD_REMOVED == sim_status) { + ret = ctsvc_server_delete_sdn_contact(); + if(CONTACTS_ERROR_NONE != ret) { + ERR("__ctsvc_server_delete_SDN_contact() Failed(%d)", ret); + goto ERROR_RETURN; + } + } + else if (TAPI_SIM_STATUS_SIM_INIT_COMPLETED == sim_status) { + ret = ctsvc_server_delete_sdn_contact(); + if(CONTACTS_ERROR_NONE != ret) { + ERR("__ctsvc_server_delete_SDN_contact() Failed(%d)", ret); + goto ERROR_RETURN; + } + + ret = tel_read_sim_pb_record(__ctsvc_server_get_tapi_handle(), TAPI_SIM_PB_SDN, + 1, __ctsvc_server_sim_sdn_read_cb, NULL); + if(TAPI_API_SUCCESS != ret) { + ERR("tel_read_sim_pb_record() Failed(%d)", ret); + ret = CONTACTS_ERROR_SYSTEM; + goto ERROR_RETURN; + } + } + + return CONTACTS_ERROR_NONE; + +ERROR_RETURN: + ctsvc_server_trim_memory(); + return ret; +} + +static void __ctsvc_server_sim_initialize_cb(TapiHandle *handle, int result, void *data, void *user_data) +{ + SERVER_FN_CALL; + int i=0; + TelSimPbAccessResult_t access_rt = result; + TelSimPbType_t sim_type = __ctsvc_server_get_sim_type(); + + SERVER_DBG("sim_type = %d",sim_type); + if (TAPI_SIM_PB_3GSIM == sim_type) { + TelSimPbCapabilityInfo_t *capa = data; + h_retm_if(capa == NULL, "capa is NULL result =%d",access_rt); + + for (i=0; i < capa->FileTypeCount; i++) { + sim_file_s *file_record = NULL; + int type = capa->FileTypeInfo[i].field_type; + SERVER_DBG("TYPE = %d",type); + file_record = __ctsvc_server_sim_get_file_record(type); + file_record->set(file_record,capa->FileTypeInfo[i].index_max, capa->FileTypeInfo[i].text_max, + capa->FileTypeInfo[i].used_count); + SERVER_DBG(" field_type[%d] : i_max(%d), t_max(%d), un_count(%d)", type, + gfile_record[type].get_index_max(&gfile_record[type]), gfile_record[type].get_text_max(&gfile_record[type]), gfile_record[type].get_unused_count(&gfile_record[type])); + } + } + else if(TAPI_SIM_PB_ADN == sim_type){ + TelSimPbEntryInfo_t *pe = data; + h_retm_if(pe == NULL, "pe is NULL result =%d",access_rt); + sim_file_s *file_record = NULL; + file_record =__ctsvc_server_sim_get_file_record(CTSVC_2GSIM_NAME); + file_record->set(file_record,pe->PbIndexMax,pe->PbTextLenMax,pe->PbIndexMin); + SERVER_DBG(" CTSVC_2GSIM_NAME : i_max(%d), t_max(%d), i_min(%d)", pe->PbIndexMax,pe->PbTextLenMax,pe->PbIndexMin); + + file_record =__ctsvc_server_sim_get_file_record(CTSVC_2GSIM_NUMBER); + file_record->set(file_record,pe->PbIndexMax,pe->PbNumLenMax,pe->PbIndexMin); + SERVER_DBG(" CTSVC_2GSIM_NUMBER : i_max(%d), t_max(%d), i_min(%d)", pe->PbIndexMax,pe->PbNumLenMax,pe->PbIndexMin); + } + else{ + ERR("sim_type [%d]error ", sim_type); + return; + } + __ctsvc_server_sim_set_init_completed(true); + return; +} + +int ctsvc_server_sim_initialize(void) +{ + SERVER_FN_CALL; + contacts_error_e err = CONTACTS_ERROR_NONE; + __ctsvc_server_get_tapi_handle(); + __ctsvc_server_set_sim_type(); + + err = contacts_connect2(); + if(err != CONTACTS_ERROR_NONE ){ + if (ghandle){ + tel_deinit(ghandle); + ghandle = NULL; + } + ERR("contacts_connect2 fail"); + return err; + } + + int ret = TAPI_API_SUCCESS; + TelSimPbType_t sim_type; + TapiHandle *sim_handle; + + __ctsvc_server_init_sim_file(); + + sim_type = __ctsvc_server_get_sim_type(); + sim_handle = __ctsvc_server_get_tapi_handle(); + + if(sim_type == TAPI_SIM_PB_3GSIM) + ret = tel_get_sim_pb_usim_meta_info(sim_handle, __ctsvc_server_sim_initialize_cb, NULL); + else if(sim_type == TAPI_SIM_PB_ADN) + ret = tel_get_sim_pb_meta_info(sim_handle, sim_type, __ctsvc_server_sim_initialize_cb, NULL); + h_retvm_if(ret != TAPI_API_SUCCESS, CONTACTS_ERROR_SYSTEM, "tel_get_sim_(usim)_meta_info =%d",ret); + + return CONTACTS_ERROR_NONE; +} + + diff --git a/server/ctsvc_server_sim.h b/server/ctsvc_server_sim.h new file mode 100755 index 0000000..e9cb5a2 --- /dev/null +++ b/server/ctsvc_server_sim.h @@ -0,0 +1,46 @@ +/* + * Contacts Service Helper + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __CTSVC_SERVER_SIM_H__ +#define __CTSVC_SERVER_SIM_H__ + +typedef struct { + int sim_index; + int contact_id; + int next_index; + char *name; + char *number; + char *anr1; + char *anr2; + char *anr3; + char *email1; + char *email2; + char *email3; + char *email4; + char *nickname; +}sim_contact_s; + +int ctsvc_server_sim_initialize(void); +int ctsvc_server_sim_finalize(void); +int ctsvc_server_sim_import(void* data); +int ctsvc_server_sim_read_sdn(void* data); +bool ctsvc_server_sim_get_init_completed(void); +void ctsvc_server_sim_destroy_contact_record(sim_contact_s *record); + +#endif // __CTSVC_SERVER_SIM_H__ + diff --git a/server/ctsvc_server_socket.c b/server/ctsvc_server_socket.c new file mode 100644 index 0000000..e4355a9 --- /dev/null +++ b/server/ctsvc_server_socket.c @@ -0,0 +1,230 @@ +/* + * Contacts Service Helper + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "internal.h" +#include "ctsvc_struct.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_socket.h" +#include "ctsvc_server_socket.h" +#include "ctsvc_server_sim.h" + +static inline int __ctsvc_server_socket_safe_write(int fd, char *buf, int buf_size) +{ + int ret, writed=0; + while (buf_size) { + ret = write(fd, buf+writed, buf_size); + if (-1 == ret) { + if (EINTR == errno) + continue; + else + return ret; + } + writed += ret; + buf_size -= ret; + } + return writed; +} + + +static inline int __ctsvc_server_socket_safe_read(int fd, char *buf, int buf_size) +{ + int ret, read_size=0; + while (buf_size) { + ret = read(fd, buf+read_size, buf_size); + if (-1 == ret) { + if (EINTR == errno) + continue; + else + return ret; + } + read_size += ret; + buf_size -= ret; + } + return read_size; +} + +int ctsvc_server_socket_return(GIOChannel *src, int value, int attach_num, int *attach_size) +{ + SERVER_FN_CALL; + int ret; + ctsvc_socket_msg_s msg = {0}; + + // h_retvm_if(CONTACTS_ERROR_SYSTEM == value, value, "Socket has problems"); + h_retvm_if(CTSVC_SOCKET_MSG_REQUEST_MAX_ATTACH < attach_num, CONTACTS_ERROR_INTERNAL, + "Invalid msg(attach_num = %d)", attach_num); + + msg.type = CTSVC_SOCKET_MSG_TYPE_REQUEST_RETURN_VALUE; + msg.val = value; + msg.attach_num = attach_num; + + memcpy(msg.attach_sizes, attach_size, attach_num * sizeof(int)); + + SERVER_DBG("fd = %d, MSG_TYPE=%d, MSG_VAL=%d, MSG_ATTACH_NUM=%d," + "MSG_ATTACH1=%d, MSG_ATTACH2=%d, MSG_ATTACH3=%d, MSG_ATTACH4=%d", + g_io_channel_unix_get_fd(src), msg.type, msg.val, msg.attach_num, + msg.attach_sizes[0], msg.attach_sizes[1], msg.attach_sizes[2], + msg.attach_sizes[3]); + + ret = __ctsvc_server_socket_safe_write(g_io_channel_unix_get_fd(src), (char *)&msg, sizeof(msg)); + h_retvm_if(-1 == ret, CONTACTS_ERROR_SYSTEM, + "__ctsvc_server_socket_safe_write() Failed(errno = %d)", errno); + + return CONTACTS_ERROR_NONE; +} + +static void __ctsvc_server_socket_import_sim(GIOChannel *src) +{ + SERVER_FN_CALL; + int ret; + + ret = ctsvc_server_sim_import(src); + if (CONTACTS_ERROR_NONE != ret) { + ERR("ctsvc_server_sim_import() Failed(%d)", ret); + ctsvc_server_socket_return(src, ret, 0, NULL); + } +} + +static void __ctsvc_server_socket_get_sim_init_status(GIOChannel *src) +{ + SERVER_FN_CALL; + + int ret; + ret = ctsvc_server_socket_return_sim_int(src, ctsvc_server_sim_get_init_completed()); + h_retm_if(CONTACTS_ERROR_NONE != ret, "ctsvc_server_socket_return_sim_int() Failed(%d)", ret); +} + +int ctsvc_server_socket_return_sim_int(GIOChannel *src, int value) +{ + SERVER_FN_CALL; + int ret; + int str_len; + char count_str[CTS_SQL_MAX_LEN] = {0}; + + str_len = snprintf(count_str, sizeof(count_str), "%d", value); + ret = ctsvc_server_socket_return(src, CONTACTS_ERROR_NONE, 1, &str_len); + h_retvm_if(CONTACTS_ERROR_NONE != ret, CONTACTS_ERROR_SYSTEM, "ctsvc_server_socket_return() Failed(%d)", ret); + INFO("count_str : %s", count_str); + ret = __ctsvc_server_socket_safe_write(g_io_channel_unix_get_fd(src), count_str, str_len); + h_retvm_if(-1 == ret, CONTACTS_ERROR_SYSTEM, "__ctsvc_server_socket_safe_write() Failed(errno = %d)", errno); + + return CONTACTS_ERROR_NONE; +} + +static gboolean __ctsvc_server_socket_request_handler(GIOChannel *src, GIOCondition condition, + gpointer data) +{ + int ret; + ctsvc_socket_msg_s msg = {0}; + SERVER_FN_CALL; + + if (G_IO_HUP & condition) { + close(g_io_channel_unix_get_fd(src)); + return FALSE; + } + + ret = __ctsvc_server_socket_safe_read(g_io_channel_unix_get_fd(src), (char *)&msg, sizeof(msg)); + h_retvm_if(-1 == ret, TRUE, "__ctsvc_server_socket_safe_read() Failed(errno = %d)", errno); + + SERVER_DBG("attach number = %d", msg.attach_num); + + switch (msg.type) { + case CTSVC_SOCKET_MSG_TYPE_REQUEST_IMPORT_SIM: + __ctsvc_server_socket_import_sim(src); + break; + case CTSVC_SOCKET_MSG_TYPE_REQUEST_SIM_INIT_COMPLETE: + __ctsvc_server_socket_get_sim_init_status(src); + break; + default: + ERR("Unknown request type(%d)", msg.type); + break; + } + return TRUE; +} + +static gboolean __ctsvc_server_socket_handler(GIOChannel *src, + GIOCondition condition, gpointer data) +{ + SERVER_FN_CALL; + + GIOChannel *channel; + int client_sockfd, sockfd = (int)data; + struct sockaddr_un clientaddr; + socklen_t client_len = sizeof(clientaddr); + + SERVER_FN_CALL; + + client_sockfd = accept(sockfd, (struct sockaddr *)&clientaddr, &client_len); + h_retvm_if(-1 == client_sockfd, TRUE, "accept() Failed(errno = %d)", errno); + + channel = g_io_channel_unix_new(client_sockfd); + g_io_add_watch(channel, G_IO_IN|G_IO_HUP, __ctsvc_server_socket_request_handler, NULL); + g_io_channel_unref(channel); + + return TRUE; +} + +int ctsvc_server_socket_init(void) +{ + SERVER_FN_CALL; + + int sockfd, ret; + struct sockaddr_un addr; + GIOChannel *gio; + + unlink(CTSVC_SOCKET_PATH); + + bzero(&addr, sizeof(addr)); + addr.sun_family = AF_UNIX; + snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", CTSVC_SOCKET_PATH); + + sockfd = socket(PF_UNIX, SOCK_STREAM, 0); + h_retvm_if(-1 == sockfd, CONTACTS_ERROR_SYSTEM, "socket() Failed(errno = %d)", errno); + + ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)); + h_retvm_if(-1 == ret, CONTACTS_ERROR_SYSTEM, "bind() Failed(errno = %d)", errno); + + ret = chown(CTSVC_SOCKET_PATH, getuid(), CTS_SECURITY_FILE_GROUP); + if (0 != ret) + ERR("chown(%s) Failed(%d)", CTSVC_SOCKET_PATH, ret); + + ret = chmod(CTSVC_SOCKET_PATH, CTS_SECURITY_DEFAULT_PERMISSION); + if (0 != ret) + ERR("chmod(%s) Failed(%d)", CTSVC_SOCKET_PATH, ret); + + ret = listen(sockfd, 30); + h_retvm_if(-1 == ret, CONTACTS_ERROR_SYSTEM, "listen() Failed(errno = %d)", errno); + + gio = g_io_channel_unix_new(sockfd); + g_io_add_watch(gio, G_IO_IN, __ctsvc_server_socket_handler, (gpointer)sockfd); + + SERVER_DBG("enter here!!!!!"); + DBG("enter here!!!!!"); + return CONTACTS_ERROR_NONE; +} + diff --git a/helper/helper-socket.h b/server/ctsvc_server_socket.h old mode 100755 new mode 100644 similarity index 66% rename from helper/helper-socket.h rename to server/ctsvc_server_socket.h index 9e68698..33b897c --- a/helper/helper-socket.h +++ b/server/ctsvc_server_socket.h @@ -1,29 +1,28 @@ -/* - * Contacts Service Helper - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_HELPER_SOCKET_H__ -#define __CTS_HELPER_SOCKET_H__ - -int helper_socket_init(void); -int helper_socket_return(GIOChannel *src, int value, int attach_num, int *attach_size); - -#endif // __CTS_HELPER_SOCKET_H__ - - +/* + * Contacts Service Helper + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __CTSVC_SERVER_SOCKET_H__ +#define __CTSVC_SERVER_SOCKET_H__ + +#include + +int ctsvc_server_socket_init(void); +int ctsvc_server_socket_return(GIOChannel *src, int value, int attach_num, int *attach_size); +int ctsvc_server_socket_return_sim_int(GIOChannel *src, int value); + +#endif // __CTSVC_SERVER_SOCKET_H__ diff --git a/server/ctsvc_server_sqlite.c b/server/ctsvc_server_sqlite.c new file mode 100755 index 0000000..b0b40f7 --- /dev/null +++ b/server/ctsvc_server_sqlite.c @@ -0,0 +1,421 @@ +/* + * Contacts Service Helper + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +#include +#include + +#include "internal.h" +#include "contacts.h" +#include "ctsvc_schema.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_notify.h" +#include "ctsvc_normalize.h" +#include "ctsvc_server_utils.h" + +#include "ctsvc_notification.h" +#include "ctsvc_db_plugin_contact_helper.h" +#include "ctsvc_person.h" +#include "ctsvc_phonelog.h" + +static sqlite3 *server_db; + +int ctsvc_server_db_open(sqlite3 **db) +{ + SERVER_FN_CALL; + int ret; + + if (!server_db) { + ret = db_util_open(CTSVC_DB_PATH, &server_db, 0); + h_retvm_if(ret != SQLITE_OK, CONTACTS_ERROR_DB, + "db_util_open() Failed(%d)", ret); + + ret = sqlite3_create_function(server_db, "_CONTACT_DELETE_", 3, SQLITE_UTF8, NULL, + ctsvc_db_contact_delete_callback, NULL, NULL); + h_retvm_if(SQLITE_OK != ret, CONTACTS_ERROR_DB, + "sqlite3_create_function() Failed(%d)", ret); + ret = sqlite3_create_function(server_db, "_DATA_DELETE_", 2, SQLITE_UTF8, NULL, + ctsvc_db_data_delete_callback, NULL, NULL); + h_retvm_if(SQLITE_OK != ret, CONTACTS_ERROR_DB, + "sqlite3_create_function() Failed(%d)", ret); + ret = sqlite3_create_function(server_db, "_PHONE_LOG_DELETE_", 1, SQLITE_UTF8, NULL, + ctsvc_db_phone_log_delete_callback, NULL, NULL); + h_retvm_if(SQLITE_OK != ret, CONTACTS_ERROR_DB, + "sqlite3_create_function() Failed(%d)", ret); + ret = sqlite3_create_function(server_db, "_PERSON_DELETE_", 1, SQLITE_UTF8, NULL, + ctsvc_db_person_delete_callback, NULL, NULL); + h_retvm_if(SQLITE_OK != ret, CONTACTS_ERROR_DB, + "sqlite3_create_function() Failed(%d)", ret); + } + if (db) + *db = server_db; + return CONTACTS_ERROR_NONE; +} + +int ctsvc_server_db_close(void) +{ + if (server_db) { + db_util_close(server_db); + server_db = NULL; + } + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_server_begin_trans(void) +{ + int ret = -1; + + ret = sqlite3_exec(server_db, "BEGIN IMMEDIATE TRANSACTION", + NULL, NULL, NULL); + + while (SQLITE_BUSY == ret) { + sleep(1); + ret = sqlite3_exec(server_db, "BEGIN IMMEDIATE TRANSACTION", + NULL, NULL, NULL); + } + + if (SQLITE_OK != ret) { + ERR("sqlite3_exec() Failed(%d)", ret); + return CONTACTS_ERROR_DB; + } + return CONTACTS_ERROR_NONE; +} + +#define CTS_COMMIT_TRY_MAX 3 +int ctsvc_server_end_trans(bool success) +{ + int ret = -1, i=0; + char *errmsg = NULL; + + if (success) { + ret = sqlite3_exec(server_db, "COMMIT TRANSACTION", + NULL, NULL, &errmsg); + if (SQLITE_OK != ret) { + ERR("sqlite3_exec(COMMIT) Failed(%d, %s)", ret, errmsg); + sqlite3_free(errmsg); + + while (SQLITE_BUSY == ret && i + +int ctsvc_server_db_open(sqlite3 **db); +int ctsvc_server_db_close(void); +int ctsvc_server_update_default_language(int system_lang, int default_lang, int second_lang); +int ctsvc_server_update_secondary_language(int prev_lang, int new_lang); +int ctsvc_server_insert_sdn_contact(const char *name, const char *number); +int ctsvc_server_delete_sdn_contact(void); +int ctsvc_server_update_collation(); + +#endif // __CTSVC_SERVER_SQLITE_H__ + + diff --git a/server/ctsvc_server_utils.c b/server/ctsvc_server_utils.c new file mode 100755 index 0000000..2de84f7 --- /dev/null +++ b/server/ctsvc_server_utils.c @@ -0,0 +1,197 @@ +/* + * Contacts Service Helper + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +#include +#include + +#include "internal.h" +#include "ctsvc_setting.h" +#include "ctsvc_server_utils.h" +#include "ctsvc_server_sim.h" +#include "ctsvc_server_sqlite.h" +#include "ctsvc_localize.h" +#include "ctsvc_normalize.h" + +static const char *CTSVC_SERVER_VCONF_TAPI_SIM_PB_INIT = VCONFKEY_TELEPHONY_SIM_PB_INIT; +static const char *CTSVC_SERVER_VCONF_SYSTEM_LANGUAGE = VCONFKEY_LANGSET; + + +static int default_language = -1; +static int system_language = -1; +static int secondary_language = -1; + +inline int ctsvc_server_set_default_language(int lang) +{ + int ret = vconf_set_int(ctsvc_get_default_language_vconfkey(), lang); + h_retvm_if(ret<0, CONTACTS_ERROR_INTERNAL, "vconf_set_int() Failed(%d)", ret); + + default_language = lang; + return CONTACTS_ERROR_NONE; +} + +inline int ctsvc_server_set_secondary_language(int lang) +{ + int ret = vconf_set_int(ctsvc_get_secondary_language_vconfkey(), lang); + h_retvm_if(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_set_int() Failed(%d)", ret); + + secondary_language = lang; + return CONTACTS_ERROR_NONE; +} + +static void ctsvc_server_change_language_cb(keynode_t *key, void *data) +{ + int ret = -1; + const char *langset; + + langset = vconf_keynode_get_str(key); + if (!default_language) { + ret = vconf_get_int(ctsvc_get_default_language_vconfkey(), &default_language); + h_retm_if(ret<0, "vconf_get_int() Failed(%d)", ret); + } + + + system_language = ctsvc_get_language_type(langset); + DBG("system language(%d, %s)", system_language, langset); + if (system_language != default_language) + ret = ctsvc_server_update_default_language(default_language, system_language, secondary_language); +} + +static void ctsvc_server_change_secondary_language_cb(keynode_t *key, void *data) +{ + int ret = -1; + const char *langset; + int lang_type; + + langset = vconf_keynode_get_str(key); + if (!secondary_language) { + ret = vconf_get_int(ctsvc_get_secondary_language_vconfkey(), &secondary_language); + h_retm_if(ret<0, "vconf_get_int() Failed(%d)", ret); + } + + lang_type = ctsvc_get_language_type(langset); + if (lang_type != secondary_language) + ret = ctsvc_server_update_secondary_language(secondary_language, lang_type); +} + +static void ctsvc_server_update_collation_cb(keynode_t *key, void *data) +{ + ctsvc_server_update_collation(); +} + +static void ctsvc_server_tapi_sim_complete_cb(keynode_t *key, void *data) +{ + int ret, init_stat; + init_stat = vconf_keynode_get_int(key); + if (VCONFKEY_TELEPHONY_SIM_PB_INIT_COMPLETED == init_stat) { + ret = ctsvc_server_sim_read_sdn(NULL); + h_warn_if(CONTACTS_ERROR_NONE != ret, "ctsvc_server_sim_read_sdn() Failed(%d)", ret); + + ret = ctsvc_server_sim_initialize(); + h_warn_if(CONTACTS_ERROR_NONE != ret, "ctsvc_server_sim_initialize() Failed(%d)", ret); + + vconf_ignore_key_changed(CTSVC_SERVER_VCONF_TAPI_SIM_PB_INIT, ctsvc_server_tapi_sim_complete_cb); + } +} +void ctsvc_server_final_configuration(void) +{ + int ret = -1; + + ret = vconf_ignore_key_changed(CTSVC_SERVER_VCONF_SYSTEM_LANGUAGE, ctsvc_server_change_language_cb); + h_retm_if(ret<0,"vconf_ignore_key_changed(%s) Failed(%d)",CTSVC_SERVER_VCONF_SYSTEM_LANGUAGE,ret); + + ret = vconf_ignore_key_changed(VCONFKEY_REGIONFORMAT, ctsvc_server_update_collation_cb); + h_retm_if(ret<0,"vconf_ignore_key_changed(%s) Failed(%d)",VCONFKEY_REGIONFORMAT,ret); + + ctsvc_server_sim_finalize(); +} + +int ctsvc_server_init_configuration(void) +{ + int ret, sim_stat=-1; + const char *langset; + int lang_type; + + ret = vconf_get_int(ctsvc_get_default_language_vconfkey(), &default_language); + if (ret < 0) { + ERR("vconf_get_int(%s) Failed(%d)", ctsvc_get_default_language_vconfkey() ,ret); + default_language = 0; + } + + ret = vconf_get_int(ctsvc_get_secondary_language_vconfkey(), &secondary_language); + if (ret < 0) { + ERR("vconf_get_int(%s) Failed(%d)", ctsvc_get_secondary_language_vconfkey(),ret); + secondary_language = 0; + } + + ret = vconf_notify_key_changed(CTSVC_SERVER_VCONF_SYSTEM_LANGUAGE, + ctsvc_server_change_language_cb, NULL); + h_retvm_if(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_notify_key_changed(%s) Failed(%d)", + CTSVC_SERVER_VCONF_SYSTEM_LANGUAGE, ret); + + ret = vconf_notify_key_changed(VCONFKEY_CONTACTS_SVC_SECONDARY_LANGUAGE, + ctsvc_server_change_secondary_language_cb, NULL); + h_retvm_if(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_notify_key_changed(%s) Failed(%d)", + VCONFKEY_CONTACTS_SVC_SECONDARY_LANGUAGE, ret); + + ret = vconf_notify_key_changed(VCONFKEY_REGIONFORMAT, + ctsvc_server_update_collation_cb, NULL); + h_retvm_if(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_notify_key_changed(%s) Failed(%d)", + VCONFKEY_REGIONFORMAT, ret); + + langset = vconf_get_str(CTSVC_SERVER_VCONF_SYSTEM_LANGUAGE); + h_warn_if(NULL == langset, "vconf_get_str(%s) return NULL", CTSVC_SERVER_VCONF_SYSTEM_LANGUAGE); + system_language = ctsvc_get_language_type(langset); + + langset = vconf_get_str(VCONFKEY_CONTACTS_SVC_SECONDARY_LANGUAGE); + h_warn_if(NULL == langset, "vconf_get_str(%s) return NULL", CTSVC_SERVER_VCONF_SYSTEM_LANGUAGE); + lang_type = ctsvc_get_language_type(langset); + if (secondary_language != lang_type) { + ERR("system lang(%s, %d), default lang(%d)", langset, lang_type, secondary_language); + ctsvc_server_update_secondary_language(secondary_language, lang_type); + } + + if (system_language != default_language) { + ERR("system lang(%s, %d), default lang(%d)", langset, system_language, default_language); + ctsvc_server_update_default_language(default_language, system_language, secondary_language); + } + + ret = vconf_get_int(CTSVC_SERVER_VCONF_TAPI_SIM_PB_INIT, &sim_stat); + if (VCONFKEY_TELEPHONY_SIM_PB_INIT_COMPLETED == sim_stat) { + ret = ctsvc_server_sim_read_sdn(NULL); + h_warn_if(CONTACTS_ERROR_NONE != ret, "ctsvc_server_sim_read_sdn() Failed(%d)", ret); + + ret = ctsvc_server_sim_initialize(); + h_warn_if(CONTACTS_ERROR_NONE != ret, "ctsvc_server_sim_initialize() Failed(%d)", ret); + } + else { + ret = vconf_notify_key_changed(CTSVC_SERVER_VCONF_TAPI_SIM_PB_INIT, + ctsvc_server_tapi_sim_complete_cb, NULL); + h_retvm_if(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_notify_key_changed(%s) Failed(%d)", + CTSVC_SERVER_VCONF_TAPI_SIM_PB_INIT, ret); + } + + return CONTACTS_ERROR_NONE; +} + +void ctsvc_server_trim_memory(void) +{ + malloc_trim(0); + sqlite3_release_memory(-1); +} diff --git a/helper/utils.h b/server/ctsvc_server_utils.h similarity index 64% rename from helper/utils.h rename to server/ctsvc_server_utils.h index fe27385..38c0cbb 100755 --- a/helper/utils.h +++ b/server/ctsvc_server_utils.h @@ -3,8 +3,6 @@ * * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. * - * Contact: Youngjae Shin - * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -18,16 +16,17 @@ * limitations under the License. * */ -#ifndef __CTS_HELPER_UTILS_H__ -#define __CTS_HELPER_UTILS_H__ +#ifndef __CTSVC_SERVER_UTILS_H__ +#define __CTSVC_SERVER_UTILS_H__ -int helper_init_configuration(void); -void helper_final_configuration(void); +int ctsvc_server_init_configuration(void); +void ctsvc_server_final_configuration(void); -int helper_get_default_language(void); -int helper_set_default_language(int lang); +int ctsvc_server_get_default_language(void); +int ctsvc_server_set_default_language(int lang); +int ctsvc_server_set_secondary_language(int lang); -void helper_trim_memory(void); +void ctsvc_server_trim_memory(void); -#endif // __CTS_HELPER_UTILS_H__ +#endif // __CTSVC_SERVER_UTILS_H__ diff --git a/helper/internal.h b/server/internal.h similarity index 57% rename from helper/internal.h rename to server/internal.h index 75a20e6..f99e8fe 100755 --- a/helper/internal.h +++ b/server/internal.h @@ -3,8 +3,6 @@ * * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. * - * Contact: Youngjae Shin - * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -18,8 +16,8 @@ * limitations under the License. * */ -#ifndef __CTS_HELPER_INTERNAL_H__ -#define __CTS_HELPER_INTERNAL_H__ +#ifndef __CTSVC_SERVER_INTERNAL_H__ +#define __CTSVC_SERVER_INTERNAL_H__ #include @@ -29,43 +27,40 @@ // Additional Error enum { - CTS_ERR_NO_DB_FILE = -10000, + CTSVC_ERR_NO_DB_FILE = -10000, }; -// DBUS Information -#define CTS_DBUS_SERVICE "org.tizen.contacts.service" - -#define HELPER_DLOG_OUT -//#define HELPER_DEBUGGING +#define SERVER_DLOG_OUT +#define SERVER_DEBUGGING -#ifdef HELPER_DLOG_OUT -#define LOG_TAG "CONTACTS_SVC_HELPER" +#ifdef SERVER_DLOG_OUT +#define LOG_TAG "CONTACTS_SVC_SERVER" #include #define DLOG(prio, fmt, arg...) \ do { SLOG(prio, LOG_TAG, fmt, ##arg); } while (0) -#define INFO(fmt, arg...) SLOGI(fmt, ##arg) -#define ERR(fmt, arg...) SLOGE("%s(%d): " fmt, __FUNCTION__, __LINE__, ##arg) -#define DBG(fmt, arg...) SLOGD("%s:" fmt, __FUNCTION__, ##arg) -#else //HELPER_DLOG_OUT +#define INFO(fmt, arg...) SLOGI("[SERVER] "fmt, ##arg) +#define ERR(fmt, arg...) SLOGE("[SERVER] "fmt, ##arg) +#define DBG(fmt, arg...) SLOGD("[SERVER] "fmt, ##arg) +#else //SERVER_DLOG_OUT #define PRT(prio, fmt, arg...) \ - do { fprintf((prio?stderr:stdout),"[Contacts-svc-helper]" fmt"\n", ##arg); } while (0) + do { fprintf((prio?stderr:stdout),"[SERVER] %s(%d): "fmt"\n", __FUNCTION__, __LINE__, ##arg); } while (0) #define INFO(fmt, arg...) PRT(0, fmt, ##arg) -#define ERR(fmt, arg...) PRT(1,"%s(%d): " fmt, __FUNCTION__, __LINE__, ##arg) +#define ERR(fmt, arg...) PRT(1, fmt, ##arg) #define DBG(fmt, arg...) \ do { \ - printf("\x1b[105;37m[Contacts-svc-helper]\x1b[0m(%s)" fmt "\n", __FUNCTION__, ##arg); \ + printf("\x1b[105;37m[SERVER]\x1b[0m(%s:%d) "fmt"\n", __FUNCTION__, __LINE__, ##arg); \ } while (0) -#endif //HELPER_DLOG_OUT +#endif //SERVER_DLOG_OUT -#ifdef HELPER_DEBUGGING -#define HELPER_FN_CALL DBG(">>>>>>>> called") -#define HELPER_FN_END DBG("<<<<<<<< ended") -#define HELPER_DBG(fmt, arg...) DBG("(%d) " fmt, __LINE__, ##arg) -#else /* HELPER_DEBUGGING */ -#define HELPER_FN_CALL -#define HELPER_FN_END -#define HELPER_DBG(fmt, arg...) -#endif /* HELPER_DEBUGGING */ +#ifdef SERVER_DEBUGGING +#define SERVER_FN_CALL DBG(">>>>>>>> called") +#define SERVER_FN_END DBG("<<<<<<<< ended") +#define SERVER_DBG(fmt, arg...) DBG(fmt, ##arg) +#else /* SERVER_DEBUGGING */ +#define SERVER_FN_CALL +#define SERVER_FN_END +#define SERVER_DBG(fmt, arg...) +#endif /* SERVER_DEBUGGING */ #define h_warn_if(expr, fmt, arg...) do { \ if (expr) { \ @@ -97,5 +92,5 @@ enum { } \ } while (0) -#endif // __CTS_HELPER_INTERNAL_H__ +#endif // __CTSVC_SERVER_INTERNAL_H__ diff --git a/src/cts-addressbook.c b/src/cts-addressbook.c deleted file mode 100755 index bb7d516..0000000 --- a/src/cts-addressbook.c +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include "cts-internal.h" -#include "cts-schema.h" -#include "cts-sqlite.h" -#include "cts-utils.h" -#include "cts-addressbook.h" - -static inline int cts_reset_internal_addressbook(void) -{ - CTS_FN_CALL; - int ret; - char query[CTS_SQL_MAX_LEN] = {0}; - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - snprintf(query, sizeof(query), "DELETE FROM %s WHERE addrbook_id = %d", - CTS_TABLE_CONTACTS, CTS_ADDRESSBOOK_INTERNAL); - - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) - { - ERR("cts_query_exec() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - snprintf(query, sizeof(query), "DELETE FROM %s WHERE addrbook_id = %d", - CTS_TABLE_GROUPS, CTS_ADDRESSBOOK_INTERNAL); - - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) - { - ERR("cts_query_exec() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - cts_set_contact_noti(); - cts_set_group_noti(); - ret = contacts_svc_end_trans(true); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -API int contacts_svc_insert_addressbook(CTSvalue *addressbook) -{ - int ret, index; - cts_stmt stmt = NULL; - cts_addrbook *record = (cts_addrbook *)addressbook; - char query[CTS_SQL_MAX_LEN] = {0}; - - retv_if(NULL == addressbook, CTS_ERR_ARG_NULL); - retv_if(NULL == record->name, CTS_ERR_ARG_INVALID); - retvm_if(CTS_VALUE_ADDRESSBOOK != record->v_type, CTS_ERR_ARG_INVALID, - "addressbook is invalid type(%d)", record->v_type); - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - snprintf(query, sizeof(query), - "INSERT INTO %s(addrbook_name, acc_id, acc_type, mode) " - "VALUES(?, %d, %d, %d)", - CTS_TABLE_ADDRESSBOOKS, record->acc_id, record->acc_type, record->mode); - - stmt = cts_query_prepare(query); - if (NULL == stmt) { - ERR("cts_query_prepare() Failed"); - contacts_svc_end_trans(false); - return CTS_ERR_DB_FAILED; - } - - cts_stmt_bind_text(stmt, 1, record->name); - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - contacts_svc_end_trans(false); - return ret; - } - index = cts_db_get_last_insert_id(); - cts_stmt_finalize(stmt); - - cts_set_addrbook_noti(); - ret = contacts_svc_end_trans(true); - retvm_if(ret < CTS_SUCCESS, ret, "contacts_svc_end_trans() Failed(%d)", ret); - - return index; -} - -API int contacts_svc_delete_addressbook(int addressbook_id) -{ - CTS_FN_CALL; - int ret; - char query[CTS_SQL_MAX_LEN] = {0}; - - if (CTS_ADDRESSBOOK_INTERNAL == addressbook_id) - return cts_reset_internal_addressbook(); - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - snprintf(query, sizeof(query), "DELETE FROM %s WHERE addrbook_id = %d", - CTS_TABLE_ADDRESSBOOKS, addressbook_id); - - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) { - ERR("cts_query_exec() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - ret = cts_db_change(); - - if (0 < ret) { - cts_set_contact_noti(); - cts_set_group_noti(); - cts_set_addrbook_noti(); - ret = contacts_svc_end_trans(true); - } - else { - contacts_svc_end_trans(false); - ret = CTS_ERR_NO_DATA; - } - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -API int contacts_svc_update_addressbook(CTSvalue *addressbook) -{ - int ret; - cts_stmt stmt = NULL; - char query[CTS_SQL_MIN_LEN] = {0}; - cts_addrbook *record = (cts_addrbook *)addressbook; - - retv_if(NULL == addressbook, CTS_ERR_ARG_NULL); - retv_if(NULL == record->name, CTS_ERR_ARG_INVALID); - retvm_if(CTS_VALUE_ADDRESSBOOK != record->v_type, CTS_ERR_ARG_INVALID, - "addressbook is invalid type(%d)", record->v_type); - - snprintf(query, sizeof(query), - "UPDATE %s SET addrbook_name=?, acc_id=%d, acc_type=%d, mode=%d " - "WHERE addrbook_id=%d", CTS_TABLE_ADDRESSBOOKS, - record->acc_id, record->acc_type, record->mode, record->id); - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - stmt = cts_query_prepare(query); - if (NULL == stmt) { - ERR("cts_query_prepare() Failed"); - contacts_svc_end_trans(false); - return CTS_ERR_DB_FAILED; - } - - cts_stmt_bind_text(stmt, 1, record->name); - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - contacts_svc_end_trans(false); - return ret; - } - cts_stmt_finalize(stmt); - - cts_set_addrbook_noti(); - - ret = contacts_svc_end_trans(true); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -API int contacts_svc_get_addressbook(int addressbook_id, CTSvalue **ret_value) -{ - int ret; - cts_addrbook *ab; - cts_stmt stmt = NULL; - char query[CTS_SQL_MAX_LEN] = {0}; - - retv_if(NULL == ret_value, CTS_ERR_ARG_NULL); - - snprintf(query, sizeof(query), - "SELECT addrbook_id, addrbook_name, acc_id, acc_type, mode " - "FROM %s WHERE addrbook_id = %d", CTS_TABLE_ADDRESSBOOKS, addressbook_id); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = cts_stmt_step(stmt); - if (CTS_TRUE != ret) { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return CTS_ERR_DB_RECORD_NOT_FOUND; - } - - ab = (cts_addrbook *)contacts_svc_value_new(CTS_VALUE_ADDRESSBOOK); - if (ab) { - ab->embedded = true; - cts_stmt_get_addressbook(stmt, ab); - } - - cts_stmt_finalize(stmt); - - *ret_value = (CTSvalue *)ab; - - return CTS_SUCCESS; -} diff --git a/src/cts-addressbook.h b/src/cts-addressbook.h deleted file mode 100755 index efd64ab..0000000 --- a/src/cts-addressbook.h +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_ADDRESSBOOK_H__ -#define __CTS_ADDRESSBOOK_H__ - -/** - * system addressbook id - */ - -enum ADDRESSBOOK{ - CTS_ADDRESSBOOK_INTERNAL, - CTS_ADDRESSBOOK_START, -}; - -#ifndef __CONTACTS_SVC_H__ - - -// -#endif //__CONTACTS_SVC_H__ -#endif //__CTS_ADDRESSBOOK_H__ diff --git a/src/cts-contact.c b/src/cts-contact.c deleted file mode 100755 index b090565..0000000 --- a/src/cts-contact.c +++ /dev/null @@ -1,3160 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include - -#include "cts-internal.h" -#include "cts-schema.h" -#include "cts-sqlite.h" -#include "cts-utils.h" -#include "cts-group.h" -#include "cts-types.h" -#include "cts-normalize.h" -#include "cts-contact.h" - -static const int CTS_UPDATE_ID_LOC = 11; - -static inline int cts_insert_contact_data_number(cts_stmt stmt, - GSList* number_list) -{ - CTS_FN_CALL; - - int ret, cnt, default_num=0, mobile_num=0; - GSList *number_repeat = number_list; - cts_number *number_data; - - retv_if(NULL == stmt, CTS_ERR_ARG_NULL); - retv_if(NULL == number_list, CTS_ERR_ARG_NULL); - - do - { - if (NULL != (number_data = (cts_number *)number_repeat->data) - && !number_data->deleted && number_data->number) - { - const char *normal_num; - char clean_num[CTS_NUMBER_MAX_LEN]; - - cnt = 1; - cts_stmt_bind_int(stmt, cnt++, CTS_DATA_NUMBER); - cts_stmt_bind_int(stmt, cnt++, number_data->type); - ret = cts_clean_number(number_data->number, clean_num, sizeof(clean_num)); - if (ret <= 0) { - ERR("Number(%s) is invalid", number_data->number); - number_repeat = g_slist_next(number_repeat); - continue; - } - - cts_stmt_bind_text(stmt, cnt++, clean_num); - normal_num = cts_normalize_number(clean_num); - cts_stmt_bind_text(stmt, cnt++, normal_num); - - ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - number_data->id = cts_db_get_last_insert_id(); - - if (number_data->is_default) - default_num = number_data->id; - else if (!default_num && CTS_NUM_TYPE_CELL & number_data->type && !mobile_num) - mobile_num = number_data->id; - cts_stmt_reset(stmt); - } - number_repeat = g_slist_next(number_repeat); - }while(number_repeat); - - if (default_num) - return default_num; - else - return mobile_num; -} - -static inline int cts_insert_contact_data_email(cts_stmt stmt, - GSList* email_list) -{ - CTS_FN_CALL; - - int ret, cnt, default_email=0; - GSList *email_repeat = email_list; - cts_email *email_data; - - retv_if(NULL == stmt, CTS_ERR_ARG_NULL); - retv_if(NULL == email_list, CTS_ERR_ARG_NULL); - - do - { - if (NULL != (email_data = (cts_email *)email_repeat->data) - && !email_data->deleted && email_data->email_addr) - { - cnt = 1; - cts_stmt_bind_int(stmt, cnt++, CTS_DATA_EMAIL); - cts_stmt_bind_int(stmt, cnt++, email_data->type); - cts_stmt_bind_text(stmt, cnt++, email_data->email_addr); - - ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - email_data->id = cts_db_get_last_insert_id(); - - if (email_data->is_default) - default_email = email_data->id; - cts_stmt_reset(stmt); - } - email_repeat = g_slist_next(email_repeat); - }while(email_repeat); - - return default_email; -} - -static inline int cts_insert_contact_grouprel(int acc_id, int index, - GSList* group_list) -{ - CTS_FN_CALL; - - GSList *group_repeat = group_list; - cts_group *group_data; - - retv_if(NULL == group_list, CTS_ERR_ARG_NULL); - - do - { - group_data = group_repeat->data; - group_repeat = group_repeat->next; - - if (NULL == group_data || group_data->deleted) - continue; - - if (group_data->vcard_group) { - int found_id; - found_id = contacts_svc_find_group(acc_id, group_data->vcard_group); - if (0 < found_id) - group_data->id = found_id; - else if (found_id == CTS_ERR_DB_RECORD_NOT_FOUND) { - CTSvalue *group; - group = contacts_svc_value_new(CTS_VALUE_GROUP); - - contacts_svc_value_set_str(group, CTS_GROUP_VAL_NAME_STR, group_data->vcard_group); - found_id = contacts_svc_insert_group(acc_id, group); - if (found_id < CTS_SUCCESS) - ERR("contacts_svc_insert_group() Failed\n"); - else - group_data->id = found_id; - - contacts_svc_value_free(group); - } - } - if (group_data->id) { - int ret = cts_group_set_relation(group_data->id, index, acc_id); - retvm_if(ret < CTS_SUCCESS, ret, "cts_group_set_relation() Failed(%d)", ret); - } - }while(group_repeat); - - return CTS_SUCCESS; -} - -static inline int cts_insert_contact_data_event(cts_stmt stmt, - GSList* event_list) -{ - CTS_FN_CALL; - - GSList *event_repeat = event_list; - cts_event *event_data; - - retv_if(NULL == stmt, CTS_ERR_ARG_NULL); - retv_if(NULL == event_list, CTS_ERR_ARG_NULL); - - do - { - if (NULL != (event_data = (cts_event *)event_repeat->data) - && !event_data->deleted && event_data->date) - { - cts_stmt_bind_int(stmt, 1, CTS_DATA_EVENT); - cts_stmt_bind_event(stmt, 2, event_data); - - int ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - cts_stmt_reset(stmt); - } - event_repeat = g_slist_next(event_repeat); - }while(event_repeat); - - return CTS_SUCCESS; -} - - -static inline int cts_insert_contact_data_messenger(cts_stmt stmt, - GSList* messenger_list) -{ - CTS_FN_CALL; - - GSList *messenger_repeat = messenger_list; - cts_messenger *messenger_data; - - retv_if(NULL == stmt, CTS_ERR_ARG_NULL); - retv_if(NULL == messenger_list, CTS_ERR_ARG_NULL); - - do - { - if (NULL != (messenger_data = (cts_messenger *)messenger_repeat->data) - && !messenger_data->deleted && messenger_data->im_id) - { - cts_stmt_bind_int(stmt, 1, CTS_DATA_MESSENGER); - cts_stmt_bind_messenger(stmt, 2, messenger_data); - - int ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - cts_stmt_reset(stmt); - } - messenger_repeat = g_slist_next(messenger_repeat); - }while(messenger_repeat); - - return CTS_SUCCESS; -} - -static inline int cts_insert_contact_data_postal(cts_stmt stmt, - GSList* postal_list) -{ - CTS_FN_CALL; - - GSList *postal_repeat = postal_list; - cts_postal *postal_data; - - retv_if(NULL == stmt, CTS_ERR_ARG_NULL); - retv_if(NULL == postal_list, CTS_ERR_ARG_NULL); - - do - { - if (NULL != (postal_data = (cts_postal *)postal_repeat->data) - && !postal_data->deleted - && (postal_data->country || postal_data->pobox - || postal_data->postalcode || postal_data->region - || postal_data->locality || postal_data->street || postal_data->extended)) - { - cts_stmt_bind_int(stmt, 1, CTS_DATA_POSTAL); - cts_stmt_bind_postal(stmt, 2, postal_data); - - int ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - cts_stmt_reset(stmt); - } - postal_repeat = g_slist_next(postal_repeat); - }while(postal_repeat); - - return CTS_SUCCESS; -} - -static inline int cts_insert_contact_data_web(cts_stmt stmt, - GSList* web_list) -{ - CTS_FN_CALL; - - GSList *web_repeat = web_list; - cts_web *web_data; - - retv_if(NULL == stmt, CTS_ERR_ARG_NULL); - retv_if(NULL == web_list, CTS_ERR_ARG_NULL); - - do - { - if (NULL != (web_data = (cts_web *)web_repeat->data) - && !web_data->deleted && web_data->url) - { - cts_stmt_bind_int(stmt, 1, CTS_DATA_WEB); - cts_stmt_bind_web(stmt, 2, web_data); - - int ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - cts_stmt_reset(stmt); - } - web_repeat = g_slist_next(web_repeat); - }while(web_repeat); - - return CTS_SUCCESS; -} - -static inline int cts_insert_contact_data_nick(cts_stmt stmt, - GSList* nick_list) -{ - CTS_FN_CALL; - GSList *nick_repeat = nick_list; - cts_nickname *nick_data; - - retv_if(NULL == stmt, CTS_ERR_ARG_NULL); - retv_if(NULL == nick_list, CTS_ERR_ARG_NULL); - - do - { - if (NULL != (nick_data = (cts_nickname *)nick_repeat->data) - && !nick_data->deleted && nick_data->nick) - { - cts_stmt_bind_int(stmt, 1, CTS_DATA_NICKNAME); - cts_stmt_bind_text(stmt, 3, nick_data->nick); - - int ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - cts_stmt_reset(stmt); - } - nick_repeat = g_slist_next(nick_repeat); - }while(nick_repeat); - - return CTS_SUCCESS; -} - -static inline int cts_insert_contact_data_extend(cts_stmt stmt, - GSList* extend_list) -{ - CTS_FN_CALL; - - GSList *extend_repeat = extend_list; - cts_extend *extend_data; - - retv_if(NULL == stmt, CTS_ERR_ARG_NULL); - retv_if(NULL == extend_list, CTS_ERR_ARG_NULL); - - do - { - if (NULL != (extend_data = (cts_extend *)extend_repeat->data) - && !extend_data->deleted) - { - cts_stmt_bind_int(stmt, 1, extend_data->type); - cts_stmt_bind_extend(stmt, 2, extend_data); - - int ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - cts_stmt_reset(stmt); - } - extend_repeat = g_slist_next(extend_repeat); - }while(extend_repeat); - - return CTS_SUCCESS; -} - -static inline int cts_make_name_lookup(int op_code, cts_name *name, - char *name_lookup, int name_lookup_size) -{ - if (name->display) { - snprintf(name_lookup, name_lookup_size, "%s", name->display); - return CTS_SUCCESS; - } - - if (CTS_ORDER_NAME_FIRSTLAST == op_code) - snprintf(name_lookup, name_lookup_size, "%s %c%s", - SAFE_STR(name->first), 0x1, SAFE_STR(name->last)); - else - snprintf(name_lookup, name_lookup_size, "%s,%c %c%s", - SAFE_STR(name->last), 0x1, 0x1, SAFE_STR(name->first)); - - return CTS_SUCCESS; -} - -static inline int cts_insert_contact_data_name(cts_stmt stmt, - cts_name *name) -{ - int ret; - int cnt = 2; - cts_name normalize_name={0}; - char *tmp_display, *tmp_first, *tmp_last; - char display[CTS_SQL_MAX_LEN]={0}; - char lookup[CTS_SQL_MAX_LEN]={0}; - char reverse_lookup[CTS_SQL_MAX_LEN]={0}; - - //insert name search info - char normal_name[CTS_NN_MAX][CTS_SQL_MAX_LEN]={{0},{0},{0}}; - - tmp_display = name->display; - tmp_first = name->first; - tmp_last = name->last; - - if (name->display) { - ret = cts_normalize_name(name, normal_name, true); - retvm_if(ret < CTS_SUCCESS, ret, "cts_normalize_name() Failed(%d)", ret); - if (normal_name[CTS_NN_FIRST][0]) - normalize_name.display = normal_name[CTS_NN_FIRST]; - else - name->display = NULL; - } - - if (NULL == name->display) { - ret = cts_normalize_name(name, normal_name, false); - retvm_if(ret < CTS_SUCCESS, ret, "cts_normalize_name() Failed(%d)", ret); - - switch (ret) - { - case CTS_LANG_KOREAN: - snprintf(display, sizeof(display), "%s%s", - SAFE_STR(name->last), SAFE_STR(name->first)); - - strncat(normal_name[CTS_NN_LAST], normal_name[CTS_NN_FIRST], - sizeof(normal_name[CTS_NN_LAST])); - - name->display = display; - normalize_name.display = normal_name[CTS_NN_LAST]; - break; - case CTS_LANG_ENGLISH: - default: - if (normal_name[CTS_NN_FIRST][0]) - normalize_name.first = normal_name[CTS_NN_FIRST]; - else - name->first = NULL; - - if (normal_name[CTS_NN_LAST][0]) - normalize_name.last = normal_name[CTS_NN_LAST]; - else - name->last = NULL; - - break; - } - } - - if (cts_get_default_language() == ret) - cts_stmt_bind_int(stmt, cnt, CTS_LANG_DEFAULT); - else - cts_stmt_bind_int(stmt, cnt, ret); - cnt = cts_stmt_bind_name(stmt, cnt, name); - - name->display = tmp_display; - name->first = tmp_first; - name->last = tmp_last; - - ret = cts_make_name_lookup(CTS_ORDER_NAME_FIRSTLAST, &normalize_name, - lookup, sizeof(lookup)); - retvm_if(CTS_SUCCESS != ret, ret, "cts_make_name_lookup() Failed(%d)", ret); - - ret = cts_make_name_lookup(CTS_ORDER_NAME_LASTFIRST, &normalize_name, - reverse_lookup, sizeof(reverse_lookup)); - retvm_if(CTS_SUCCESS != ret, ret, "cts_make_name_lookup() Failed(%d)", ret); - - CTS_DBG("lookup=%s(%d), reverse_lookup=%s(%d)", - lookup, strlen(lookup), reverse_lookup, strlen(reverse_lookup)); - - cts_stmt_bind_text(stmt, cnt++, lookup); - cts_stmt_bind_text(stmt, cnt++, reverse_lookup); - cts_stmt_bind_text(stmt, cnt++, normal_name[CTS_NN_SORTKEY]); - - return cnt; -} - -static int cts_insert_contact_data(int field, contact_t *contact) -{ - int ret; - cts_stmt stmt = NULL; - char query[CTS_SQL_MAX_LEN] = {0}; - - snprintf(query, sizeof(query), "INSERT INTO %s(contact_id, datatype, " - "data1, data2, data3, data4, data5, data6, data7, data8, data9, data10) " - "VALUES(%d, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", - CTS_TABLE_DATA, contact->base->id); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - //Insert the name - if ((field & CTS_DATA_FIELD_NAME)) - { - cts_stmt_bind_int(stmt, 1, CTS_DATA_NAME); - - if (contact->name) { - ret = cts_insert_contact_data_name(stmt, contact->name); - if (ret < CTS_SUCCESS) - { - ERR("cts_insert_contact_data_name() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - } - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - cts_stmt_reset(stmt); - } - - //Insert the company - if (contact->company && (field & CTS_DATA_FIELD_COMPANY)) - { - cts_company *com = contact->company; - if (com->name || com->department || com->jot_title || com->role || com->assistant_name) { - cts_stmt_bind_int(stmt, 1, CTS_DATA_COMPANY); - cts_stmt_bind_company(stmt, 2, com); - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - cts_stmt_reset(stmt); - } - } - - //Insert the events - if (contact->events && (field & CTS_DATA_FIELD_EVENT)) - { - ret = cts_insert_contact_data_event(stmt, contact->events); - - if (CTS_SUCCESS != ret) - { - ERR("cts_insert_contact_data_event() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - } - - //Insert the messengers - if (contact->messengers && (field & CTS_DATA_FIELD_MESSENGER)) - { - ret = cts_insert_contact_data_messenger(stmt, contact->messengers); - - if (CTS_SUCCESS != ret) - { - ERR("cts_insert_contact_data_messenger() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - } - - //Insert the postals - if (contact->postal_addrs && (field & CTS_DATA_FIELD_POSTAL)) - { - ret = cts_insert_contact_data_postal(stmt, contact->postal_addrs); - - if (CTS_SUCCESS != ret) - { - ERR("cts_insert_contact_data_postal() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - } - - //Insert the Web addrs - if (contact->web_addrs && (field & CTS_DATA_FIELD_WEB)) - { - ret = cts_insert_contact_data_web(stmt, contact->web_addrs); - - if (CTS_SUCCESS != ret) - { - ERR("cts_insert_contact_data_web() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - } - - //Insert the Nick names - if (contact->nicknames && (field & CTS_DATA_FIELD_NICKNAME)) - { - ret = cts_insert_contact_data_nick(stmt, contact->nicknames); - - if (CTS_SUCCESS != ret) - { - ERR("cts_insert_contact_data_nick() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - } - - //Insert the numbers - if (contact->numbers && (field & CTS_DATA_FIELD_NUMBER)) - { - ret = cts_insert_contact_data_number(stmt, contact->numbers); - - if (ret < CTS_SUCCESS) - { - ERR("cts_insert_contact_data_number() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - contact->default_num = ret; - } - - //Insert the emails - if (contact->emails && (field & CTS_DATA_FIELD_EMAIL)) - { - ret = cts_insert_contact_data_email(stmt, contact->emails); - - if (ret < CTS_SUCCESS) { - ERR("cts_insert_contact_data_email() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - contact->default_email = ret; - } - - - //Insert the extended values - if (contact->extended_values && (field & CTS_DATA_FIELD_EXTEND_ALL)) - { - ret = cts_insert_contact_data_extend(stmt, contact->extended_values); - - if (CTS_SUCCESS != ret) - { - ERR("cts_insert_contact_data_extend() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - } - - cts_stmt_finalize(stmt); - - return CTS_SUCCESS; -} - -static int cts_set_first_id_for_default(contact_t *contact) -{ - GSList *cur; - - if (!contact->default_num) - { - for (cur = contact->numbers;cur;cur = cur->next) { - if(cur->data) { - cts_number *num = cur->data; - if(!num->deleted && num->id) { - contact->default_num = num->id; - break; - } - } - } - } - - if (!contact->default_email) - { - for (cur = contact->emails;cur;cur = cur->next) { - if(cur->data) { - cts_email *email = cur->data; - if(!email->deleted && email->id) { - contact->default_email = email->id; - break; - } - } - } - } - - return CTS_SUCCESS; -} - -static inline char* cts_contact_get_valid_first_number_or_email(GSList *numbers, GSList *emails) -{ - GSList *cur; - - for (cur=numbers;cur;cur=cur->next) { - cts_number *num = cur->data; - if (num && !num->deleted && num->number) { - return num->number; - } - } - - for (cur=emails;cur;cur=cur->next) { - cts_email *email = cur->data; - if (email && !email->deleted && email->email_addr) { - return email->email_addr; - } - } - return NULL; -} - -static inline void cts_insert_contact_handle_no_name(contact_t *contact) -{ - if (NULL == contact->name) { - contact->name = calloc(1, sizeof(cts_name)); - contact->name->embedded = true; - } - - if (contact->name->display || contact->name->first || contact->name->last) - return; - - if (contact->company && contact->company->name) - contact->name->display = strdup(contact->company->name); - else { - char *temp; - - temp = cts_contact_get_valid_first_number_or_email(contact->numbers, contact->emails); - contact->name->display = SAFE_STRDUP(temp); - } - return; -} - -static inline int cts_safe_strcmp(char *s1, char *s2) -{ - if (NULL == s1 || NULL == s2) - return !(s1 == s2); - else - return strcmp(s1, s2); -} - - -static inline void cts_contact_remove_dup_data_number(GSList *numbers) -{ - GSList *cur1, *cur2; - - cts_number *num1, *num2; - for (cur1=numbers;cur1;cur1=cur1->next) { - num1 = cur1->data; - if (NULL == num1 || num1->deleted) - continue; - for (cur2=numbers;cur2;cur2=cur2->next) { - num2 = cur2->data; - if(NULL == num2 || num1 == num2) - continue; - if (!num2->deleted && num1->type == num2->type && - !cts_safe_strcmp(num1->number, num2->number)) { - num1->is_default |= num2->is_default; - num1->is_favorite |= num2->is_favorite; - num2->deleted = true; - } - } - } -} - - -static inline void cts_contact_remove_dup_data_email(GSList *emails) -{ - GSList *cur1, *cur2; - cts_email *email1, *email2; - - for (cur1=emails;cur1;cur1=cur1->next) { - email1 = cur1->data; - if (NULL == email1 || email1->deleted) - continue; - for (cur2=emails;cur2;cur2=cur2->next) { - email2 = cur2->data; - if(NULL == email2 || email1 == email2) - continue; - if (!email2->deleted && email1->type == email2->type && - !cts_safe_strcmp(email1->email_addr, email2->email_addr)) { - email1->is_default |= email2->is_default; - email2->deleted = true; - } - } - } -} - -static inline void cts_contact_remove_dup_data_event(GSList *events) -{ - GSList *cur1, *cur2; - cts_event *event1, *event2; - - for (cur1=events;cur1;cur1=cur1->next) { - event1 = cur1->data; - if (NULL == event1 || event1->deleted) - continue; - for (cur2=events;cur2;cur2=cur2->next) { - event2 = cur2->data; - if(NULL == event2 || event1 == event2) - continue; - if (!event2->deleted && event1->type == event2->type && - event1->date == event2->date) { - event2->deleted = true; - } - } - } -} - - -static inline void cts_contact_remove_dup_data_IM(GSList *IMs) -{ - GSList *cur1, *cur2; - cts_messenger *im1, *im2; - - for (cur1=IMs;cur1;cur1=cur1->next) { - im1 = cur1->data; - if (NULL == im1 || im1->deleted) - continue; - for (cur2=IMs;cur2;cur2=cur2->next) { - im2 = cur2->data; - if(NULL == im2 || im1 == im2) - continue; - if (!im2->deleted && im1->type == im2->type && - !cts_safe_strcmp(im1->im_id, im2->im_id)) { - im2->deleted = true; - } - } - } -} - - -static inline void cts_contact_remove_dup_data_web(GSList *webs) -{ - GSList *cur1, *cur2; - cts_web *web1, *web2; - - for (cur1=webs;cur1;cur1=cur1->next) { - web1 = cur1->data; - if (NULL == web1 || web1->deleted) - continue; - for (cur2=webs;cur2;cur2=cur2->next) { - web2 = cur2->data; - if(NULL == web2 || web1 == web2) - continue; - if (!web2->deleted && web1->type == web2->type && - !cts_safe_strcmp(web1->url, web2->url)) { - web2->deleted = true; - } - } - } -} - - -static inline void cts_contact_remove_dup_data_nick(GSList *nicks) -{ - GSList *cur1, *cur2; - cts_nickname *nick1, *nick2; - - for (cur1=nicks;cur1;cur1=cur1->next) { - nick1 = cur1->data; - if (NULL == nick1 || nick1->deleted) - continue; - for (cur2=nicks;cur2;cur2=cur2->next) { - nick2 = cur2->data; - if(NULL == nick2 || nick1 == nick2) - continue; - if (!nick2->deleted && !cts_safe_strcmp(nick1->nick, nick2->nick)) { - nick2->deleted = true; - } - } - } -} - - -static inline void cts_contact_remove_dup_data_postal(GSList *postals) -{ - GSList *cur1, *cur2; - cts_postal *addr1, *addr2; - - for (cur1=postals;cur1;cur1=cur1->next) { - addr1 = cur1->data; - if (NULL == addr1 || addr1->deleted) - continue; - for (cur2=postals;cur2;cur2=cur2->next) { - addr2 = cur2->data; - if(NULL == addr2 || addr1 == addr2) - continue; - if (!addr2->deleted && addr1->type == addr2->type && - !cts_safe_strcmp(addr1->pobox, addr2->pobox) && - !cts_safe_strcmp(addr1->postalcode, addr2->postalcode) && - !cts_safe_strcmp(addr1->region, addr2->region) && - !cts_safe_strcmp(addr1->locality, addr2->locality) && - !cts_safe_strcmp(addr1->street, addr2->street) && - !cts_safe_strcmp(addr1->extended, addr2->extended) && - !cts_safe_strcmp(addr1->country, addr2->country)) { - addr2->deleted = true; - } - } - } -} - - -static void cts_contact_remove_dup_data(contact_t *contact) -{ - if (contact->numbers) - cts_contact_remove_dup_data_number(contact->numbers); - - if (contact->emails) - cts_contact_remove_dup_data_email(contact->emails); - - if (contact->events) - cts_contact_remove_dup_data_event(contact->events); - - if (contact->messengers) - cts_contact_remove_dup_data_IM(contact->messengers); - - if (contact->web_addrs) - cts_contact_remove_dup_data_web(contact->web_addrs); - - if (contact->nicknames) - cts_contact_remove_dup_data_nick(contact->nicknames); - - if (contact->postal_addrs) - cts_contact_remove_dup_data_postal(contact->postal_addrs); - -} - -static inline int cts_insert_contact(int addressbook_id, contact_t *contact) -{ - int ret; - char *img_path; - char query[CTS_SQL_MAX_LEN] = {0}; - - retv_if(NULL == contact, CTS_ERR_ARG_NULL); - - cts_insert_contact_handle_no_name(contact); - cts_contact_remove_dup_data(contact); - - //Insert Data - ret = cts_insert_contact_data(CTS_DATA_FIELD_ALL, contact); - retvm_if(CTS_SUCCESS != ret, ret, "cts_insert_contact_data() Failed(%d)", ret); - - //Insert group Info - if (contact->grouprelations) - { - ret = cts_insert_contact_grouprel(addressbook_id, contact->base->id, - contact->grouprelations); - retvm_if(ret < CTS_SUCCESS, ret, "cts_insert_contact_grouprel() Failed(%d)", ret); - } - - // default setting - if (!contact->default_num || !contact->default_email) - ret = cts_set_first_id_for_default(contact); - retvm_if(CTS_SUCCESS != ret, ret, "cts_set_first_id_for_default() Failed(%d)", ret); - - //insert contact table - int input_ver = cts_get_next_ver(); - - snprintf(query, sizeof(query), - "INSERT INTO %s(contact_id, addrbook_id, created_ver, changed_ver, " - "changed_time, default_num, default_email, uid, ringtone, note, image0, image1) " - "VALUES(%d, %d, %d, %d, %d, %d, %d, ?, ?, ?, ?, ?)", - CTS_TABLE_CONTACTS, contact->base->id, addressbook_id, input_ver, - input_ver, (int)time(NULL), contact->default_num, contact->default_email); - - cts_stmt stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - if (contact->base->uid) - cts_stmt_bind_text(stmt, 1, contact->base->uid); - if (contact->base->ringtone_path) - cts_stmt_bind_text(stmt, 2, contact->base->ringtone_path); - if (contact->base->note) - cts_stmt_bind_text(stmt, 3, contact->base->note); - - if (contact->base->img_path) { - ret = cts_add_image_file(CTS_IMG_NORMAL, contact->base->id, contact->base->img_path, &img_path); - if (CTS_SUCCESS != ret) { - ERR("cts_add_image_file(NORMAL) Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - cts_stmt_bind_text(stmt, 4, img_path); - } - else if (contact->base->vcard_img_path) { - ret = cts_add_image_file(CTS_IMG_NORMAL, contact->base->id, contact->base->vcard_img_path, &img_path); - if (CTS_SUCCESS == ret) - cts_stmt_bind_text(stmt, 4, img_path); - } - - ret = cts_add_image_file(CTS_IMG_FULL, contact->base->id, contact->base->full_img_path, &img_path); - if (CTS_SUCCESS == ret) - cts_stmt_bind_text(stmt, 5, img_path); - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - cts_stmt_finalize(stmt); - - return CTS_SUCCESS; -} - - -API int contacts_svc_insert_contact(int addressbook_id, CTSstruct* contact) -{ - int ret; - contact_t *record; - - CTS_FN_CALL; - - retv_if(NULL == contact, CTS_ERR_ARG_NULL); - retvm_if(CTS_STRUCT_CONTACT != contact->s_type, CTS_ERR_ARG_INVALID, - "The contact(%d) must be type of CTS_STRUCT_CONTACT.", contact->s_type); - - CTS_START_TIME_CHECK; - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - record = (contact_t *)contact; - - ret = cts_db_get_next_id(CTS_TABLE_CONTACTS); - if (ret < CTS_SUCCESS) - { - ERR("cts_db_get_next_id() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - CTS_DBG("index = %d.", ret); - - if (!record->base) { - record->base = (cts_ct_base*)contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO); - - if (NULL == record->base) - { - ERR("contacts_svc_value_new() Failed"); - contacts_svc_end_trans(false); - return CTS_ERR_OUT_OF_MEMORY; - } - } - - record->base->id = ret; - record->base->addrbook_id = addressbook_id; - ret = cts_insert_contact(addressbook_id, record); - if (CTS_SUCCESS != ret) - { - ERR("cts_insert_contact() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - cts_set_contact_noti(); - ret = contacts_svc_end_trans(true); - retvm_if(ret < CTS_SUCCESS, ret, "contacts_svc_end_trans() Failed(%d)", ret); - - CTS_END_TIME_CHECK(); - return record->base->id; -} - -API int contacts_svc_delete_contact(int index) -{ - CTS_FN_CALL; - int ret, addrbook_id; - char query[CTS_SQL_MAX_LEN] = {0}; - - CTS_START_TIME_CHECK; - - snprintf(query, sizeof(query), - "SELECT addrbook_id FROM %s WHERE contact_id = %d", - CTS_TABLE_CONTACTS, index); - addrbook_id = cts_query_get_first_int_result(query); - retvm_if(addrbook_id < CTS_SUCCESS, addrbook_id, - "The index(%d) is Invalid(%d)", index, addrbook_id); - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - ret = cts_delete_image_file(CTS_IMG_NORMAL, index); - if (CTS_SUCCESS != ret && CTS_ERR_DB_RECORD_NOT_FOUND != ret) { - ERR("cts_delete_image_file(NORMAL) Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - ret = cts_delete_image_file(CTS_IMG_FULL, index); - warn_if(CTS_SUCCESS != ret && CTS_ERR_DB_RECORD_NOT_FOUND != ret, - "cts_delete_image_file(FULL) Failed(%d)", ret); - - snprintf(query, sizeof(query), "DELETE FROM %s WHERE contact_id = %d", - CTS_TABLE_CONTACTS, index); - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) { - ERR("cts_query_exec() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - snprintf(query, sizeof(query), "INSERT INTO %s VALUES(%d, %d, %d)", - CTS_TABLE_DELETEDS, index, addrbook_id, cts_get_next_ver()); - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) - { - ERR("cts_query_exec() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - cts_set_contact_noti(); - - ret = contacts_svc_end_trans(true); - CTS_END_TIME_CHECK(); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -static inline int cts_delete_record_by_id(const char *table, int id) -{ - int ret; - char query[CTS_SQL_MIN_LEN] = {0}; - - retv_if(NULL == table, CTS_ERR_ARG_NULL); - - snprintf(query, sizeof(query), "DELETE FROM %s WHERE id=%d", table, id); - - ret = cts_query_exec(query); - retvm_if(ret, ret, "cts_query_exec() Failed(%d)", ret); - - return CTS_SUCCESS; -} - -static inline int cts_update_contact_data_number( - cts_stmt stmt, int contact_id, GSList* number_list) -{ - CTS_FN_CALL; - - int ret, default_num=0, mobile_num=0; - GSList *added_numbers=NULL, *number_repeat = number_list; - cts_number *number_data; - - retv_if(NULL == stmt, CTS_ERR_ARG_NULL); - retv_if(NULL == number_list, CTS_ERR_ARG_NULL); - - do - { - if (NULL != (number_data = (cts_number *)number_repeat->data)) - { - if (!number_data->id){ - if (!number_data->deleted) - added_numbers = g_slist_append(added_numbers, number_data); - number_repeat = g_slist_next(number_repeat); - continue; - } - if (number_data->deleted || NULL == number_data->number) { - ret = cts_delete_record_by_id(CTS_TABLE_DATA, number_data->id); - retvm_if(ret, ret, "cts_delete_record_by_id() Failed(%d)", ret); - } - else - { - int cnt = 1; - const char *normal_num; - char clean_num[CTS_NUMBER_MAX_LEN]; - - cts_stmt_bind_int(stmt, cnt++, number_data->type); - - ret = cts_clean_number(number_data->number, clean_num, sizeof(clean_num)); - if (ret <= 0) { - ERR("Number(%s) is invalid", number_data->number); - number_repeat = g_slist_next(number_repeat); - continue; - } - cts_stmt_bind_text(stmt, cnt++, clean_num); - - normal_num = cts_normalize_number(clean_num); - cts_stmt_bind_text(stmt, cnt++, normal_num); - cts_stmt_bind_int(stmt, CTS_UPDATE_ID_LOC, number_data->id); - - ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - - if (number_data->is_default) - default_num = number_data->id; - else if (!default_num && CTS_NUM_TYPE_CELL & number_data->type && !mobile_num) - mobile_num = number_data->id; - cts_stmt_reset(stmt); - } - } - number_repeat = g_slist_next(number_repeat); - }while(number_repeat); - - if (added_numbers) { - contact_t temp; - cts_ct_base base; - temp.base = &base; - temp.base->id = contact_id; - temp.numbers = added_numbers; - - ret = cts_insert_contact_data(CTS_DATA_FIELD_NUMBER, &temp); - if (temp.default_num) { - number_repeat = added_numbers; - while (number_repeat) { - if (NULL != (number_data = (cts_number *)number_repeat->data)) { - if (number_data->is_default) { - default_num = temp.default_num; - break; - } - } - number_repeat = number_repeat->next; - } - if(!default_num) - mobile_num = temp.default_num; - } - g_slist_free(added_numbers); - retvm_if(CTS_SUCCESS != ret, ret, "cts_insert_contact_data() Failed(%d)", ret); - } - - if (default_num) - return default_num; - else - return mobile_num; -} - -static inline int cts_update_contact_data_email( - cts_stmt stmt, int contact_id, GSList* email_list) -{ - CTS_FN_CALL; - - int ret, default_email=0; - GSList *added_emails=NULL, *email_repeat = email_list; - cts_email *email_data; - - retv_if(NULL == stmt, CTS_ERR_ARG_NULL); - retv_if(NULL == email_list, CTS_ERR_ARG_NULL); - - do - { - if (NULL != (email_data = (cts_email *)email_repeat->data)) - { - if (!email_data->id){ - if (!email_data->deleted) - added_emails = g_slist_append(added_emails, email_data); - email_repeat = g_slist_next(email_repeat); - continue; - } - if (email_data->deleted || NULL == email_data->email_addr) { - ret = cts_delete_record_by_id(CTS_TABLE_DATA, email_data->id); - retvm_if(ret, ret, "cts_delete_record_by_id() Failed(%d)", ret); - } - else - { - int cnt = 1; - - cts_stmt_bind_int(stmt, cnt++, email_data->type); - cts_stmt_bind_text(stmt, cnt++, email_data->email_addr); - cts_stmt_bind_int(stmt, CTS_UPDATE_ID_LOC, email_data->id); - - ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - - if (email_data->is_default) - default_email = email_data->id; - cts_stmt_reset(stmt); - } - } - email_repeat = g_slist_next(email_repeat); - }while(email_repeat); - - if (added_emails) { - contact_t temp; - cts_ct_base base; - temp.base = &base; - temp.base->id = contact_id; - temp.emails = added_emails; - - ret = cts_insert_contact_data(CTS_DATA_FIELD_EMAIL, &temp); - if (temp.default_email) { - email_repeat = added_emails; - while (email_repeat) { - if (NULL != (email_data = (cts_email *)email_repeat->data)) { - if (email_data->is_default) { - default_email = temp.default_email; - break; - } - } - email_repeat = email_repeat->next; - } - } - g_slist_free(added_emails); - retvm_if(CTS_SUCCESS != ret, ret, "cts_insert_contact_data() Failed(%d)", ret); - } - - return default_email; -} - -static inline int cts_update_contact_grouprel(cts_ct_base *base_info, - GSList* group_list) -{ - CTS_FN_CALL; - - int ret; - GSList *group_repeat = group_list; - cts_group *group_data; - - retv_if(NULL == group_list, CTS_ERR_ARG_NULL); - - do - { - group_data = group_repeat->data; - group_repeat = group_repeat->next; - - if (NULL == group_data) - continue; - - if (group_data->deleted) { - ret = cts_group_unset_relation(group_data->id, base_info->id); - retvm_if(ret, ret, "cts_group_unset_relation() Failed(%d)", ret); - } - else { - if (group_data->vcard_group) { - int found_id; - found_id = contacts_svc_find_group(base_info->addrbook_id, group_data->vcard_group); - if (0 < found_id) - group_data->id = found_id; - else if (found_id == CTS_ERR_DB_RECORD_NOT_FOUND) { - CTSvalue *group; - group = contacts_svc_value_new(CTS_VALUE_GROUP); - - contacts_svc_value_set_str(group, CTS_GROUP_VAL_NAME_STR, group_data->vcard_group); - found_id = contacts_svc_insert_group(base_info->addrbook_id, group); - if (found_id < CTS_SUCCESS) - ERR("contacts_svc_insert_group() Failed\n"); - else - group_data->id = found_id; - - contacts_svc_value_free(group); - } - } - if (group_data->id) { - ret = cts_group_set_relation(group_data->id, base_info->id, - base_info->addrbook_id); - retvm_if(ret < CTS_SUCCESS, ret, "cts_group_set_relation() Failed(%d)", ret); - } - } - }while(group_repeat); - - return CTS_SUCCESS; -} - -static inline int cts_update_contact_data_event( - cts_stmt stmt, int contact_id, GSList* event_list) -{ - CTS_FN_CALL; - - int ret; - GSList *added_event=NULL, *event_repeat = event_list; - cts_event *event_data; - - retv_if(NULL == stmt, CTS_ERR_ARG_NULL); - retv_if(NULL == event_list, CTS_ERR_ARG_NULL); - - do - { - if (NULL != (event_data = (cts_event *)event_repeat->data)) - { - if (!event_data->id){ - if (!event_data->deleted) - added_event = g_slist_append(added_event, event_data); - event_repeat = g_slist_next(event_repeat); - continue; - } - if (event_data->deleted) { - ret = cts_delete_record_by_id(CTS_TABLE_DATA, event_data->id); - retvm_if(ret, ret, "cts_delete_record_by_id() Failed(%d)", ret); - } - else - { - cts_stmt_bind_event(stmt, 1, event_data); - cts_stmt_bind_int(stmt, CTS_UPDATE_ID_LOC, event_data->id); - - ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - cts_stmt_reset(stmt); - } - } - event_repeat = g_slist_next(event_repeat); - }while(event_repeat); - - if (added_event) { - contact_t temp; - cts_ct_base base; - temp.base = &base; - temp.base->id = contact_id; - temp.events = added_event; - - ret = cts_insert_contact_data(CTS_DATA_FIELD_EVENT, &temp); - g_slist_free(added_event); - retvm_if(CTS_SUCCESS != ret, ret, - "cts_insert_contact_data() Failed(%d)", ret); - } - return CTS_SUCCESS; -} - -static inline int cts_update_contact_data_messenger( - cts_stmt stmt, int contact_id, GSList* messenger_list) -{ - CTS_FN_CALL; - - int ret; - GSList *added_messenger=NULL, *messenger_repeat = messenger_list; - cts_messenger *messenger_data; - - retv_if(NULL == stmt, CTS_ERR_ARG_NULL); - retv_if(NULL == messenger_list, CTS_ERR_ARG_NULL); - - do - { - if (NULL != (messenger_data = (cts_messenger *)messenger_repeat->data)) - { - if (!messenger_data->id){ - if (!messenger_data->deleted) - added_messenger = g_slist_append(added_messenger, messenger_data); - messenger_repeat = g_slist_next(messenger_repeat); - continue; - } - if (messenger_data->deleted || NULL == messenger_data->im_id) - { - ret = cts_delete_record_by_id(CTS_TABLE_DATA, messenger_data->id); - retvm_if(ret, ret, "cts_delete_record_by_id() Failed(%d)", ret); - } - else - { - cts_stmt_bind_messenger(stmt, 1, messenger_data); - cts_stmt_bind_int(stmt, CTS_UPDATE_ID_LOC, messenger_data->id); - - ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - cts_stmt_reset(stmt); - } - } - messenger_repeat = g_slist_next(messenger_repeat); - }while(messenger_repeat); - - if (added_messenger) { - contact_t temp; - cts_ct_base base; - temp.base = &base; - temp.base->id = contact_id; - temp.messengers = added_messenger; - - ret = cts_insert_contact_data(CTS_DATA_FIELD_MESSENGER, &temp); - g_slist_free(added_messenger); - retvm_if(CTS_SUCCESS != ret, ret, - "cts_insert_contact_data() Failed(%d)", ret); - } - return CTS_SUCCESS; -} - -static inline int cts_update_contact_data_postal( - cts_stmt stmt, int contact_id, GSList* postal_list) -{ - CTS_FN_CALL; - - int ret; - GSList *added_postal=NULL, *postal_repeat = postal_list; - cts_postal *postal_data; - - retv_if(NULL == stmt, CTS_ERR_ARG_NULL); - retv_if(NULL == postal_list, CTS_ERR_ARG_NULL); - - do - { - if (NULL != (postal_data = (cts_postal *)postal_repeat->data)) - { - if (!postal_data->id){ - if (!postal_data->deleted) - added_postal = g_slist_append(added_postal, postal_data); - postal_repeat = g_slist_next(postal_repeat); - continue; - } - if (postal_data->deleted || !(postal_data->country || postal_data->pobox - || postal_data->postalcode || postal_data->region - || postal_data->locality || postal_data->street || postal_data->extended)) - { - ret = cts_delete_record_by_id(CTS_TABLE_DATA, postal_data->id); - retvm_if(ret, ret, "cts_delete_record_by_id() Failed(%d)", ret); - } - else - { - cts_stmt_bind_postal(stmt, 1, postal_data); - cts_stmt_bind_int(stmt, CTS_UPDATE_ID_LOC, postal_data->id); - - ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - cts_stmt_reset(stmt); - } - } - postal_repeat = g_slist_next(postal_repeat); - }while(postal_repeat); - - if (added_postal) { - contact_t temp; - cts_ct_base base; - temp.base = &base; - temp.base->id = contact_id; - temp.postal_addrs = added_postal; - - ret = cts_insert_contact_data(CTS_DATA_FIELD_POSTAL, &temp); - g_slist_free(added_postal); - retvm_if(CTS_SUCCESS != ret, ret, - "cts_insert_contact_data() Failed(%d)", ret); - } - return CTS_SUCCESS; -} - -static inline int cts_update_contact_data_web( - cts_stmt stmt, int contact_id, GSList* web_list) -{ - CTS_FN_CALL; - - int ret; - GSList *added_web=NULL, *web_repeat = web_list; - cts_web *web_data; - - retv_if(NULL == stmt, CTS_ERR_ARG_NULL); - retv_if(NULL == web_list, CTS_ERR_ARG_NULL); - - do - { - if (NULL != (web_data = (cts_web *)web_repeat->data)) - { - if (!web_data->id){ - if (!web_data->deleted) - added_web = g_slist_append(added_web, web_data); - web_repeat = g_slist_next(web_repeat); - continue; - } - if (web_data->deleted || NULL == web_data->url) - { - ret = cts_delete_record_by_id(CTS_TABLE_DATA, web_data->id); - retvm_if(ret, ret, "cts_delete_record_by_id() Failed(%d)", ret); - } - else - { - cts_stmt_bind_web(stmt, 1, web_data); - cts_stmt_bind_int(stmt, CTS_UPDATE_ID_LOC, web_data->id); - - ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - cts_stmt_reset(stmt); - } - } - web_repeat = g_slist_next(web_repeat); - }while(web_repeat); - - if (added_web) { - contact_t temp; - cts_ct_base base; - temp.base = &base; - temp.base->id = contact_id; - temp.web_addrs = added_web; - - ret = cts_insert_contact_data(CTS_DATA_FIELD_WEB, &temp); - g_slist_free(added_web); - retvm_if(CTS_SUCCESS != ret, ret, - "cts_insert_contact_data() Failed(%d)", ret); - } - return CTS_SUCCESS; -} - -static inline int cts_update_contact_data_nick( - cts_stmt stmt, int contact_id, GSList* nick_list) -{ - CTS_FN_CALL; - - int ret; - GSList *added_nick=NULL, *nick_repeat = nick_list; - cts_nickname *nick_data; - - retv_if(NULL == stmt, CTS_ERR_ARG_NULL); - retv_if(NULL == nick_list, CTS_ERR_ARG_NULL); - - do - { - if (NULL != (nick_data = (cts_nickname *)nick_repeat->data)) - { - if (!nick_data->id){ - if (!nick_data->deleted) - added_nick = g_slist_append(added_nick, nick_data); - nick_repeat = g_slist_next(nick_repeat); - continue; - } - if (nick_data->deleted || NULL == nick_data->nick) - { - ret = cts_delete_record_by_id(CTS_TABLE_DATA, nick_data->id); - retvm_if(ret, ret, "cts_delete_record_by_id() Failed(%d)", ret); - } - else - { - cts_stmt_bind_text(stmt, 2, nick_data->nick); - cts_stmt_bind_int(stmt, CTS_UPDATE_ID_LOC, nick_data->id); - - ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - cts_stmt_reset(stmt); - } - } - nick_repeat = g_slist_next(nick_repeat); - }while(nick_repeat); - - if (added_nick) { - contact_t temp; - cts_ct_base base; - temp.base = &base; - temp.base->id = contact_id; - temp.nicknames = added_nick; - - ret = cts_insert_contact_data(CTS_DATA_FIELD_NICKNAME, &temp); - g_slist_free(added_nick); - retvm_if(CTS_SUCCESS != ret, ret, - "cts_insert_contact_data() Failed(%d)", ret); - } - return CTS_SUCCESS; -} - -static inline int cts_update_contact_data_extend( - cts_stmt stmt, int contact_id, GSList* extend_list) -{ - CTS_FN_CALL; - - int ret; - GSList *added_extend=NULL, *extend_repeat = extend_list; - cts_extend *extend_data; - - retv_if(NULL == stmt, CTS_ERR_ARG_NULL); - retv_if(NULL == extend_list, CTS_ERR_ARG_NULL); - - do - { - if (NULL != (extend_data = (cts_extend *)extend_repeat->data)) - { - if (!extend_data->id){ - if (!extend_data->deleted) - added_extend = g_slist_append(added_extend, extend_data); - extend_repeat = g_slist_next(extend_repeat); - continue; - } - if (extend_data->deleted) - { - ret = cts_delete_record_by_id(CTS_TABLE_DATA, extend_data->id); - retvm_if(ret, ret, "cts_delete_record_by_id() Failed(%d)", ret); - } - else - { - cts_stmt_bind_extend(stmt, 1, extend_data); - cts_stmt_bind_int(stmt, CTS_UPDATE_ID_LOC, extend_data->id); - - ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - cts_stmt_reset(stmt); - } - } - extend_repeat = g_slist_next(extend_repeat); - }while(extend_repeat); - - if (added_extend) { - contact_t temp; - cts_ct_base base; - temp.base = &base; - temp.base->id = contact_id; - temp.extended_values = added_extend; - - ret = cts_insert_contact_data(CTS_DATA_FIELD_EXTEND_ALL, &temp); - g_slist_free(added_extend); - retvm_if(CTS_SUCCESS != ret, ret, - "cts_insert_contact_data() Failed(%d)", ret); - } - return CTS_SUCCESS; -} - -static inline int cts_update_contact_data_name(cts_stmt stmt, - cts_name *name) -{ - int ret, cnt=1; - cts_name normalize_name={0}; - char *tmp_display, *tmp_first, *tmp_last; - char display[CTS_SQL_MAX_LEN]={0}; - char lookup[CTS_SQL_MAX_LEN]={0}; - char reverse_lookup[CTS_SQL_MAX_LEN]={0}; - - retvm_if(!name->id, CTS_ERR_ARG_INVALID, "name of contact has no ID."); - cts_stmt_bind_int(stmt, CTS_UPDATE_ID_LOC, name->id); - - //Update name search info - char normal_name[CTS_NN_MAX][CTS_SQL_MAX_LEN]={{0},{0},{0}}; - - tmp_display = name->display; - tmp_first = name->first; - tmp_last = name->last; - - if (name->display) { - ret = cts_normalize_name(name, normal_name, true); - retvm_if(ret < CTS_SUCCESS, ret, "cts_normalize_name() Failed(%d)", ret); - if (normal_name[CTS_NN_FIRST][0]) - normalize_name.display = normal_name[CTS_NN_FIRST]; - else - name->display = NULL; - } - - if (NULL == name->display) { - ret = cts_normalize_name(name, normal_name, false); - retvm_if(ret < CTS_SUCCESS, ret, "cts_normalize_name() Failed(%d)", ret); - - switch (ret) - { - case CTS_LANG_KOREAN: - snprintf(display, sizeof(display), "%s%s", - SAFE_STR(name->last), SAFE_STR(name->first)); - - strncat(normal_name[CTS_NN_LAST], normal_name[CTS_NN_FIRST], - sizeof(normal_name[CTS_NN_LAST])); - - name->display = display; - normalize_name.display = normal_name[CTS_NN_LAST]; - break; - case CTS_LANG_ENGLISH: - default: - if (normal_name[CTS_NN_FIRST][0]) - normalize_name.first = normal_name[CTS_NN_FIRST]; - else - name->first = NULL; - - if (normal_name[CTS_NN_LAST][0]) - normalize_name.last = normal_name[CTS_NN_LAST]; - else - name->last = NULL; - - break; - } - } - - if (cts_get_default_language() == ret) - cts_stmt_bind_int(stmt, cnt, CTS_LANG_DEFAULT); - else - cts_stmt_bind_int(stmt, cnt, ret); - cnt = cts_stmt_bind_name(stmt, cnt, name); - - name->display = tmp_display; - name->first = tmp_first; - name->last = tmp_last; - - ret = cts_make_name_lookup(CTS_ORDER_NAME_FIRSTLAST, &normalize_name, - lookup, sizeof(lookup)); - retvm_if(CTS_SUCCESS != ret, ret, "cts_make_name_lookup() Failed(%d)", ret); - - ret = cts_make_name_lookup(CTS_ORDER_NAME_LASTFIRST, &normalize_name, - reverse_lookup, sizeof(reverse_lookup)); - retvm_if(CTS_SUCCESS != ret, ret, "cts_make_name_lookup() Failed(%d)", ret); - - CTS_DBG("lookup=%s(%d), reverse_lookup=%s(%d)", - lookup, strlen(lookup), reverse_lookup, strlen(reverse_lookup)); - - cts_stmt_bind_text(stmt, cnt++, lookup); - cts_stmt_bind_text(stmt, cnt++, reverse_lookup); - cts_stmt_bind_text(stmt, cnt, normal_name[CTS_NN_SORTKEY]); - - ret = cts_stmt_step(stmt); - retvm_if(CTS_SUCCESS != ret, ret, "cts_stmt_step() Failed(%d)", ret); - - return CTS_SUCCESS; -} - -static inline int cts_update_contact_data(contact_t *contact) -{ - int ret; - cts_stmt stmt = NULL; - char query[CTS_SQL_MAX_LEN] = {0}; - - // Use stmt query for DATA table - snprintf(query, sizeof(query), "UPDATE %s SET data1=?, data2=?, data3=?, data4=?," - "data5=?, data6=?, data7=?, data8=?, data9=?, data10=? WHERE id=?", - CTS_TABLE_DATA); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - //Update the name - if (contact->name && contact->name->is_changed) - { - ret = cts_update_contact_data_name(stmt, contact->name); - if (CTS_SUCCESS != ret) { - ERR("cts_update_contact_data_name() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - cts_stmt_reset(stmt); - } - - //Update the company - if (contact->company) - { - cts_company *com = contact->company; - if (!com->id) { - ret = cts_insert_contact_data(CTS_DATA_FIELD_COMPANY, contact); - retvm_if(CTS_SUCCESS != ret, ret, - "cts_insert_contact_data(CTS_DATA_FIELD_COMPANY) Failed(%d)", ret); - } - else { - if (com->name || com->department || com->jot_title || com->role || com->assistant_name) { - cts_stmt_bind_company(stmt, 1, com); - cts_stmt_bind_int(stmt, CTS_UPDATE_ID_LOC, com->id); - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - cts_stmt_reset(stmt); - } - else { - ret = cts_delete_record_by_id(CTS_TABLE_DATA, com->id); - retvm_if(ret, ret, "cts_delete_record_by_id() Failed(%d)", ret); - } - } - } - - //Update the events - if (contact->events) - { - ret = cts_update_contact_data_event(stmt, contact->base->id, contact->events); - - if (CTS_SUCCESS != ret) - { - ERR("cts_update_contact_data_event() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - } - - //Update the messengers - if (contact->messengers) - { - ret = cts_update_contact_data_messenger(stmt, contact->base->id, - contact->messengers); - - if (CTS_SUCCESS != ret) - { - ERR("cts_update_contact_data_messenger() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - } - - //Update the postals - if (contact->postal_addrs) - { - ret = cts_update_contact_data_postal(stmt, contact->base->id, - contact->postal_addrs); - - if (CTS_SUCCESS != ret) - { - ERR("cts_update_contact_data_postal() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - } - - //Update the Web addrs - if (contact->web_addrs) - { - ret = cts_update_contact_data_web(stmt, contact->base->id, contact->web_addrs); - - if (CTS_SUCCESS != ret) - { - ERR("cts_update_contact_data_web() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - } - - //Update the Nick Names - if (contact->nicknames) - { - ret = cts_update_contact_data_nick(stmt, contact->base->id, contact->nicknames); - - if (CTS_SUCCESS != ret) - { - ERR("cts_update_contact_data_nick() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - } - - //Update the Numbers - if (contact->numbers) - { - ret = cts_update_contact_data_number(stmt, contact->base->id, contact->numbers); - - if (ret < CTS_SUCCESS) - { - ERR("cts_update_contact_data_number() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - contact->default_num = ret; - } - - //Update the Emails - if (contact->emails) - { - ret = cts_update_contact_data_email(stmt, contact->base->id, contact->emails); - - if (ret < CTS_SUCCESS) - { - ERR("cts_update_contact_data_email() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - contact->default_email = ret; - } - - //Update the extended values - if (contact->extended_values) - { - ret = cts_update_contact_data_extend(stmt, contact->base->id, - contact->extended_values); - - if (CTS_SUCCESS != ret) - { - ERR("cts_update_contact_data_extend() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - } - - cts_stmt_finalize(stmt); - - return CTS_SUCCESS; -} - - -static inline void cts_update_contact_handle_no_name(contact_t *contact) -{ - if (NULL == contact->name) { - contact->name = calloc(1, sizeof(cts_name)); - contact->name->embedded = true; - } else if (contact->name->first || contact->name->last) { - return; - } - - if (contact->name->display) { - free(contact->name->display); - contact->name->display = NULL; - } - contact->name->is_changed = true; - - if (contact->company && contact->company->name) { - contact->name->display = strdup(contact->company->name); - } else { - char *temp; - - temp = cts_contact_get_valid_first_number_or_email(contact->numbers, contact->emails); - contact->name->display = SAFE_STRDUP(temp); - } -} - - -static inline int cts_update_contact(contact_t *contact) -{ - int i, ret, len; - char query[CTS_SQL_MAX_LEN] = {0}; - char *img_path; - - snprintf(query, sizeof(query), - "SELECT count(contact_id) FROM %s WHERE contact_id = %d", - CTS_TABLE_CONTACTS, contact->base->id); - ret = cts_query_get_first_int_result(query); - retvm_if(1 != ret, CTS_ERR_DB_RECORD_NOT_FOUND, - "The index(%d) is Invalid. %d Record(s) is(are) found", contact->base->id, ret); - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - cts_update_contact_handle_no_name(contact); - cts_contact_remove_dup_data(contact); - - //update data - ret = cts_update_contact_data(contact); - if (CTS_SUCCESS != ret) - { - ERR("cts_update_contact_data() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - //update group relation Info - if (contact->grouprelations) - { - ret = cts_update_contact_grouprel(contact->base, contact->grouprelations); - if (ret < CTS_SUCCESS) - { - ERR("cts_update_contact_grouprel() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - } - - // default setting - if (!contact->default_num || !contact->default_email) { - ret = cts_set_first_id_for_default(contact); - if (CTS_SUCCESS != ret) { - ERR("cts_set_first_id_for_default() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - } - len = snprintf(query, sizeof(query), - "UPDATE %s SET changed_ver=%d, changed_time=%d, " - "default_num=%d, default_email=%d", - CTS_TABLE_CONTACTS, cts_get_next_ver(), (int)time(NULL), - contact->default_num, contact->default_email); - - if (contact->base->uid_changed) - len += snprintf(query+len, sizeof(query)-len, ", uid=?"); - - if (contact->base->ringtone_changed) - len += snprintf(query+len, sizeof(query)-len, ", ringtone=?"); - - if (contact->base->note_changed) - len += snprintf(query+len, sizeof(query)-len, ", note=?"); - - if (contact->base->img_changed || - (NULL == contact->base->img_path && contact->base->vcard_img_path)) - len += snprintf(query+len, sizeof(query)-len, ", image0=?"); - - if (contact->base->full_img_changed) - len += snprintf(query+len, sizeof(query)-len, ", image1=?"); - - snprintf(query+len, sizeof(query)-len, - " WHERE contact_id=%d", contact->base->id); - - cts_stmt stmt = cts_query_prepare(query); - if (NULL == stmt) { - ERR("cts_query_prepare() Failed"); - contacts_svc_end_trans(false); - return CTS_ERR_DB_FAILED; - } - - i=1; - if (contact->base->uid_changed) { - if (contact->base->uid) - cts_stmt_bind_text(stmt, i, contact->base->uid); - i++; - } - if (contact->base->ringtone_changed) { - if (contact->base->ringtone_path) - cts_stmt_bind_text(stmt, i, contact->base->ringtone_path); - i++; - } - if (contact->base->note_changed) { - if (contact->base->note) - cts_stmt_bind_text(stmt, i, contact->base->note); - i++; - } - - if (contact->base->img_changed || - (NULL == contact->base->img_path && contact->base->vcard_img_path)) { - if (contact->base->img_path) { - ret = cts_update_image_file(CTS_IMG_NORMAL, contact->base->id, contact->base->img_path, &img_path); - if (CTS_SUCCESS != ret) { - ERR("cts_update_image_file() Failed(%d)", ret); - cts_stmt_finalize(stmt); - contacts_svc_end_trans(false); - return ret; - } - if (img_path) - cts_stmt_bind_text(stmt, i, img_path); - i++; - } else { - if (contact->base->vcard_img_path) { - ret = cts_update_image_file(CTS_IMG_NORMAL, contact->base->id, contact->base->vcard_img_path, &img_path); - if (CTS_SUCCESS == ret && img_path) - cts_stmt_bind_text(stmt, i, img_path); - i++; - } else { - ret = cts_delete_image_file(CTS_IMG_NORMAL, contact->base->id); - if (CTS_SUCCESS != ret) { - ERR("cts_delete_image_file() Failed(%d)", ret); - cts_stmt_finalize(stmt); - contacts_svc_end_trans(false); - return ret; - } - } - } - } - - if (contact->base->full_img_changed) { - ret = cts_update_image_file(CTS_IMG_FULL, contact->base->id, contact->base->full_img_path, &img_path); - if (CTS_SUCCESS == ret && img_path) - cts_stmt_bind_text(stmt, i, img_path); - i++; - } - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - contacts_svc_end_trans(false); - return ret; - } - cts_stmt_finalize(stmt); - - cts_set_contact_noti(); - - ret = contacts_svc_end_trans(true); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -API int contacts_svc_update_contact(CTSstruct* contact) -{ - CTS_FN_CALL; - int ret; - - retv_if(NULL == contact, CTS_ERR_ARG_NULL); - retvm_if(CTS_STRUCT_CONTACT != contact->s_type, CTS_ERR_ARG_INVALID, - "The contact(%d) must be type of CTS_STRUCT_CONTACT.", contact->s_type); - - CTS_START_TIME_CHECK; - - ret = cts_update_contact((contact_t *)contact); - - CTS_END_TIME_CHECK(); - return ret; -} - -static inline int cts_put_base_val(int op_code, int contact_id, - cts_ct_base *value) -{ - int ret; - cts_stmt stmt = NULL; - char query[CTS_SQL_MIN_LEN] = {0}; - - retvm_if(CTS_VALUE_CONTACT_BASE_INFO != value->v_type, CTS_ERR_ARG_INVALID, - "value has unknown type"); - switch (op_code) { - case CTS_PUT_VAL_REPLACE_RINGTONE: - snprintf(query, sizeof(query), - "UPDATE %s SET changed_ver=%d, changed_time=%d, " - "ringtone=? WHERE contact_id=%d", - CTS_TABLE_CONTACTS, cts_get_next_ver(), (int)time(NULL), - contact_id); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - if (value->ringtone_path) - cts_stmt_bind_text(stmt, 1, value->ringtone_path); - break; - case CTS_PUT_VAL_REPLACE_NOTE: - snprintf(query, sizeof(query), - "UPDATE %s SET changed_ver=%d, changed_time=%d, " - "note=? WHERE contact_id=%d", - CTS_TABLE_CONTACTS, cts_get_next_ver(), (int)time(NULL), - contact_id); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - if (value->note) - cts_stmt_bind_text(stmt, 1, value->note); - break; - default: - ERR("Invalid parameter : The op_code(%d) is not supported", op_code); - return CTS_ERR_ARG_INVALID; - } - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - cts_stmt_finalize(stmt); - - return CTS_SUCCESS; -} - -static inline int cts_put_number_val(int contact_id, - cts_number *number) -{ - int ret, default_id; - cts_stmt stmt = NULL; - char clean_num[CTS_NUMBER_MAX_LEN], query[CTS_SQL_MAX_LEN] = {0}; - const char *normal_num; - - retv_if(NULL == number->number, CTS_ERR_ARG_NULL); - retvm_if(CTS_VALUE_NUMBER != number->v_type, CTS_ERR_ARG_INVALID, - "value has unknown type"); - - ret = cts_clean_number(number->number, clean_num, sizeof(clean_num)); - retvm_if(ret <= 0, CTS_ERR_ARG_INVALID, "Number(%s) is invalid", number->number); - - snprintf(query, sizeof(query), - "INSERT INTO %s(contact_id, datatype, data1, data2, data3) VALUES(%d, %d, %d, ?, ?)", - CTS_TABLE_DATA, contact_id, CTS_DATA_NUMBER, number->type); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - cts_stmt_bind_text(stmt, 1, clean_num); - - normal_num = cts_normalize_number(clean_num); - cts_stmt_bind_text(stmt, 2, normal_num); - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - cts_stmt_finalize(stmt); - - if (number->is_default) { - default_id = cts_db_get_last_insert_id(); - snprintf(query, sizeof(query), - "UPDATE %s SET changed_ver=%d, changed_time=%d, default_num=%d " - "WHERE contact_id=%d", - CTS_TABLE_CONTACTS, cts_get_next_ver(), (int)time(NULL), - default_id, contact_id); - } else { - snprintf(query, sizeof(query), - "UPDATE %s SET changed_ver=%d, changed_time=%d WHERE contact_id=%d", - CTS_TABLE_CONTACTS, cts_get_next_ver(), (int)time(NULL), - contact_id); - } - - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) { - ERR("cts_query_exec() Failed(%d)", ret); - return ret; - } - - return CTS_SUCCESS; -} - -static inline int cts_put_email_val(int contact_id, - cts_email *email) -{ - int ret, default_id; - cts_stmt stmt = NULL; - char query[CTS_SQL_MAX_LEN] = {0}; - - retv_if(NULL == email->email_addr, CTS_ERR_ARG_NULL); - retvm_if(CTS_VALUE_EMAIL != email->v_type, CTS_ERR_ARG_INVALID, - "value has unknown type"); - - snprintf(query, sizeof(query), - "INSERT INTO %s(contact_id, datatype, data1, data2) VALUES(%d, %d, %d, ?)", - CTS_TABLE_DATA, contact_id, CTS_DATA_EMAIL, email->type); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - if (email->email_addr) - cts_stmt_bind_text(stmt, 1, email->email_addr); - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - cts_stmt_finalize(stmt); - - if (email->is_default) { - default_id = cts_db_get_last_insert_id(); - snprintf(query, sizeof(query), - "UPDATE %s SET changed_ver=%d, changed_time=%d, default_email=%d " - "WHERE contact_id=%d", - CTS_TABLE_CONTACTS, cts_get_next_ver(), (int)time(NULL), - default_id, contact_id); - } else { - snprintf(query, sizeof(query), - "UPDATE %s SET changed_ver=%d, changed_time=%d WHERE contact_id=%d", - CTS_TABLE_CONTACTS, cts_get_next_ver(), (int)time(NULL), - contact_id); - } - - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) { - ERR("cts_query_exec() Failed(%d)", ret); - return ret; - } - - return CTS_SUCCESS; -} - -API int contacts_svc_put_contact_value(cts_put_contact_val_op op_code, - int contact_id, CTSvalue* value) -{ - CTS_FN_CALL; - - int ret; - - retv_if(NULL == value, CTS_ERR_ARG_NULL); - CTS_START_TIME_CHECK; - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - switch (op_code) - { - case CTS_PUT_VAL_REPLACE_RINGTONE: - case CTS_PUT_VAL_REPLACE_NOTE: - ret = cts_put_base_val(op_code, contact_id, (cts_ct_base *)value); - if (CTS_SUCCESS != ret) - { - ERR("cts_update_contact_val_ringtone() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - break; - case CTS_PUT_VAL_ADD_NUMBER: - ret = cts_put_number_val(contact_id, (cts_number *)value); - if (CTS_SUCCESS != ret) - { - ERR("cts_put_number_val() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - break; - case CTS_PUT_VAL_ADD_EMAIL: - ret = cts_put_email_val(contact_id, (cts_email *)value); - if (CTS_SUCCESS != ret) - { - ERR("cts_put_email_val() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - break; - default: - ERR("Invalid parameter : The op_code(%d) is not supported", op_code); - contacts_svc_end_trans(false); - return CTS_ERR_ARG_INVALID; - } - - cts_set_contact_noti(); - - ret = contacts_svc_end_trans(true); - CTS_END_TIME_CHECK(); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -#define CTS_MAIN_CTS_GET_RINGTON (1<<1) -#define CTS_MAIN_CTS_GET_NOTE (1<<2) -#define CTS_MAIN_CTS_GET_DEFAULT_NUM (1<<3) -#define CTS_MAIN_CTS_GET_DEFAULT_EMAIL (1<<4) -#define CTS_MAIN_CTS_GET_FAVOR (1<<5) -#define CTS_MAIN_CTS_GET_IMG (1<<6) -#define CTS_MAIN_CTS_GET_ALL (1<<1|1<<2|1<<3|1<<4|1<<5|1<<6) - -static int cts_get_main_contacts_info(int op_code, int index, contact_t *contact) -{ - int ret, len; - cts_stmt stmt = NULL; - char query[CTS_SQL_MAX_LEN] = {0}; - char *temp; - - len = snprintf(query, sizeof(query), "SELECT "); - - len += snprintf(query+len, sizeof(query)-len, - "contact_id, addrbook_id, changed_time"); - - if (op_code & CTS_MAIN_CTS_GET_RINGTON) - len += snprintf(query+len, sizeof(query)-len, ", ringtone"); - if (op_code & CTS_MAIN_CTS_GET_NOTE) - len += snprintf(query+len, sizeof(query)-len, ", note"); - if (op_code & CTS_MAIN_CTS_GET_DEFAULT_NUM) - len += snprintf(query+len, sizeof(query)-len, ", default_num"); - if (op_code & CTS_MAIN_CTS_GET_DEFAULT_EMAIL) - len += snprintf(query+len, sizeof(query)-len, ", default_email"); - if (op_code & CTS_MAIN_CTS_GET_FAVOR) - len += snprintf(query+len, sizeof(query)-len, ", is_favorite"); - if (op_code & CTS_MAIN_CTS_GET_IMG) { - len += snprintf(query+len, sizeof(query)-len, ", image0"); - len += snprintf(query+len, sizeof(query)-len, ", image1"); - } - - snprintf(query+len, sizeof(query)-len, - " FROM %s WHERE contact_id = %d", CTS_TABLE_CONTACTS, index); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = cts_stmt_step(stmt); - if (CTS_TRUE != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return CTS_ERR_DB_RECORD_NOT_FOUND; - } - int count=0; - - contact->base = (cts_ct_base *)contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO); - if (NULL == contact->base) { - cts_stmt_finalize(stmt); - ERR("contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO) Failed"); - return CTS_ERR_OUT_OF_MEMORY; - } - - contact->base->id = cts_stmt_get_int(stmt, count++); - contact->base->addrbook_id = cts_stmt_get_int(stmt, count++); - contact->base->changed_time = cts_stmt_get_int(stmt, count++); - - if (op_code & CTS_MAIN_CTS_GET_RINGTON) - { - contact->base->embedded = true; - temp = cts_stmt_get_text(stmt, count++); - if (temp && CTS_SUCCESS == cts_exist_file(temp)) - contact->base->ringtone_path = strdup(temp); - else - contact->base->ringtone_path = NULL; - } - if (op_code & CTS_MAIN_CTS_GET_NOTE) - { - contact->base->embedded = true; - temp = cts_stmt_get_text(stmt, count++); - contact->base->note = SAFE_STRDUP(temp); - } - if (op_code & CTS_MAIN_CTS_GET_DEFAULT_NUM) - contact->default_num = cts_stmt_get_int(stmt, count++); - if (op_code & CTS_MAIN_CTS_GET_DEFAULT_EMAIL) - contact->default_email = cts_stmt_get_int(stmt, count++); - if (op_code & CTS_MAIN_CTS_GET_FAVOR) - contact->base->is_favorite = cts_stmt_get_int(stmt, count++); - - if (op_code & CTS_MAIN_CTS_GET_IMG) { - contact->base->embedded = true; - temp = cts_stmt_get_text(stmt, count++); - contact->base->img_path = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, count++); - contact->base->full_img_path = SAFE_STRDUP(temp); - } - - cts_stmt_finalize(stmt); - - return CTS_SUCCESS; -} - -static inline int cts_get_data_info_number(cts_stmt stmt, contact_t *contact) -{ - cts_number *result; - - result = (cts_number *)contacts_svc_value_new(CTS_VALUE_NUMBER); - if (result) { - int cnt = 1; - result->embedded = true; - cnt = cts_stmt_get_number(stmt, result, cnt); - - if (result->id == contact->default_num) - result->is_default = true; - - result->is_favorite = cts_stmt_get_int(stmt, cnt); - contact->numbers = g_slist_append(contact->numbers, result); - } - return CTS_SUCCESS; -} - -static inline int cts_get_data_info_email(cts_stmt stmt, contact_t *contact) -{ - cts_email *result; - - result = (cts_email *)contacts_svc_value_new(CTS_VALUE_EMAIL); - if (result) { - result->embedded = true; - cts_stmt_get_email(stmt, result, 1); - - if (result->id == contact->default_email) - result->is_default = true; - - contact->emails = g_slist_append(contact->emails, result); - } - return CTS_SUCCESS; -} - -static inline cts_name* cts_get_data_info_name(cts_stmt stmt) -{ - cts_name *result; - - result = (cts_name *)contacts_svc_value_new(CTS_VALUE_NAME); - if (result) { - result->embedded = true; - cts_stmt_get_name(stmt, result, 1); - } - return result; -} - -static inline int cts_get_data_info_event(cts_stmt stmt, contact_t *contact) -{ - int cnt=1; - cts_event *result; - - result = (cts_event *)contacts_svc_value_new(CTS_VALUE_EVENT); - if (result) { - result->embedded = true; - result->id = cts_stmt_get_int(stmt, cnt++); - result->type = cts_stmt_get_int(stmt, cnt++); - result->date = cts_stmt_get_int(stmt, cnt++); - - contact->events = g_slist_append(contact->events, result); - } - return CTS_SUCCESS; -} - -static inline int cts_get_data_info_messenger(cts_stmt stmt, contact_t *contact) -{ - int cnt=1; - cts_messenger *result; - - result = (cts_messenger *)contacts_svc_value_new(CTS_VALUE_MESSENGER); - if (result) { - char *temp; - result->embedded = true; - result->id = cts_stmt_get_int(stmt, cnt++); - result->type = cts_stmt_get_int(stmt, cnt++); - temp = cts_stmt_get_text(stmt, cnt++); - result->im_id = SAFE_STRDUP(temp); - - contact->messengers = g_slist_append(contact->messengers, result); - } - return CTS_SUCCESS; -} - -static inline int cts_get_data_info_postal(cts_stmt stmt, contact_t *contact) -{ - int cnt=1; - cts_postal *result; - - result = (cts_postal *)contacts_svc_value_new(CTS_VALUE_POSTAL); - if (result) { - char *temp; - result->embedded = true; - result->id = cts_stmt_get_int(stmt, cnt++); - result->type = cts_stmt_get_int(stmt, cnt++); - temp = cts_stmt_get_text(stmt, cnt++); - result->pobox= SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->postalcode = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->region= SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->locality = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->street = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->extended = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->country = SAFE_STRDUP(temp); - - contact->postal_addrs = g_slist_append(contact->postal_addrs, result); - } - return CTS_SUCCESS; -} - -static inline int cts_get_data_info_web(cts_stmt stmt, contact_t *contact) -{ - int cnt=1; - cts_web *result; - - result = (cts_web *)contacts_svc_value_new(CTS_VALUE_WEB); - if (result) { - char *temp; - result->embedded = true; - result->id = cts_stmt_get_int(stmt, cnt++); - result->type = cts_stmt_get_int(stmt, cnt++); - temp = cts_stmt_get_text(stmt, cnt++); - result->url = SAFE_STRDUP(temp); - - contact->web_addrs = g_slist_append(contact->web_addrs, result); - } - return CTS_SUCCESS; -} - -static inline int cts_get_data_info_nick(cts_stmt stmt, contact_t *contact) -{ - int cnt=1; - cts_nickname *result; - - result = (cts_nickname *)contacts_svc_value_new(CTS_VALUE_NICKNAME); - if (result) { - char *temp; - result->embedded = true; - result->id = cts_stmt_get_int(stmt, cnt++); - temp = cts_stmt_get_text(stmt, cnt+1); - result->nick = SAFE_STRDUP(temp); - - contact->nicknames = g_slist_append(contact->nicknames, result); - } - return CTS_SUCCESS; -} - -static inline cts_company* cts_get_data_info_company(cts_stmt stmt) -{ - int cnt=1; - cts_company *result; - - result = (cts_company *)contacts_svc_value_new(CTS_VALUE_COMPANY); - retvm_if(NULL == result, NULL, "contacts_svc_value_new() Failed"); - - char *temp; - result->embedded = true; - result->id = cts_stmt_get_int(stmt, cnt++); - cnt++; - temp = cts_stmt_get_text(stmt, cnt++); - result->name = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->department = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->jot_title = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->role = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->assistant_name = SAFE_STRDUP(temp); - - if (result->name || result->department || result->jot_title || result->role || result->assistant_name) - return result; - else { - contacts_svc_value_free((CTSvalue *)result); - return NULL; - } -} - -static cts_extend* cts_make_extend_data(cts_stmt stmt, int type, int cnt) -{ - cts_extend *result; - result = (cts_extend *)contacts_svc_value_new(CTS_VALUE_EXTEND); - if (result) - { - char *temp; - result->type = type; - result->id = cts_stmt_get_int(stmt, cnt++); - result->data1 = cts_stmt_get_int(stmt, cnt++); - temp = cts_stmt_get_text(stmt, cnt++); - result->data2= SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->data3 = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->data4= SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->data5 = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->data6 = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->data7 = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->data8 = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->data9 = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->data10 = SAFE_STRDUP(temp); - } - return result; -} - -static inline int cts_get_data_info_extend(cts_stmt stmt, int type, - contact_t *contact) -{ - cts_extend *result; - - result = cts_make_extend_data(stmt, type, 1); - if (result) { - result->embedded = true; - contact->extended_values = g_slist_append(contact->extended_values, result); - } - else - return CTS_ERR_OUT_OF_MEMORY; - - return CTS_SUCCESS; -} - -enum{ - CTS_GET_DATA_BY_CONTACT_ID, - CTS_GET_DATA_BY_ID -}; - -static int cts_get_data_info(int op_code, int field, int index, contact_t *contact) -{ - int ret, datatype, len; - cts_stmt stmt = NULL; - char query[CTS_SQL_MAX_LEN] = {0}; - - switch (op_code) - { - case CTS_GET_DATA_BY_CONTACT_ID: - len = snprintf(query, sizeof(query), "SELECT datatype, id, data1, data2," - "data3, data4, data5, data6, data7, data8, data9, data10 " - "FROM %s WHERE contact_id = %d", CTS_TABLE_DATA, index); - break; - case CTS_GET_DATA_BY_ID: - default: - ERR("Invalid parameter : The op_code(%d) is not supported", op_code); - return CTS_ERR_ARG_INVALID; - } - - if (CTS_DATA_FIELD_ALL != field && CTS_DATA_FIELD_EXTEND_ALL != field) - { - bool first= true; - len += snprintf(query+len, sizeof(query)-len, " AND datatype IN ("); - - if (field & CTS_DATA_FIELD_NAME) { - first=false; - len += snprintf(query+len, sizeof(query)-len, "%d", CTS_DATA_NAME); - } - if (field & CTS_DATA_FIELD_EVENT) { - if (first) - first=false; - else - len += snprintf(query+len, sizeof(query)-len, ", "); - len += snprintf(query+len, sizeof(query)-len, "%d", CTS_DATA_EVENT); - } - if (field & CTS_DATA_FIELD_MESSENGER) { - if (first) - first=false; - else - len += snprintf(query+len, sizeof(query)-len, ", "); - len += snprintf(query+len, sizeof(query)-len, "%d", CTS_DATA_MESSENGER); - } - if (field & CTS_DATA_FIELD_POSTAL) { - if (first) - first=false; - else - len += snprintf(query+len, sizeof(query)-len, ", "); - len += snprintf(query+len, sizeof(query)-len, "%d", CTS_DATA_POSTAL); - } - if (field & CTS_DATA_FIELD_WEB) { - if (first) - first=false; - else - len += snprintf(query+len, sizeof(query)-len, ", "); - len += snprintf(query+len, sizeof(query)-len, "%d", CTS_DATA_WEB); - } - if (field & CTS_DATA_FIELD_NICKNAME) { - if (first) - first=false; - else - len += snprintf(query+len, sizeof(query)-len, ", "); - len += snprintf(query+len, sizeof(query)-len, "%d", CTS_DATA_NICKNAME); - } - if (field & CTS_DATA_FIELD_COMPANY) { - if (first) - first=false; - else - len += snprintf(query+len, sizeof(query)-len, ", "); - len += snprintf(query+len, sizeof(query)-len, "%d", CTS_DATA_COMPANY); - } - if (field & CTS_DATA_FIELD_NUMBER) { - if (first) - first=false; - else - len += snprintf(query+len, sizeof(query)-len, ", "); - len += snprintf(query+len, sizeof(query)-len, "%d", CTS_DATA_NUMBER); - } - if (field & CTS_DATA_FIELD_EMAIL) { - if (first) - first=false; - else - len += snprintf(query+len, sizeof(query)-len, ", "); - len += snprintf(query+len, sizeof(query)-len, "%d", CTS_DATA_EMAIL); - } - - len += snprintf(query+len, sizeof(query)-len, ")"); - } - - if (CTS_DATA_FIELD_ALL != field && field & CTS_DATA_FIELD_EXTEND_ALL) { - len += snprintf(query+len, sizeof(query)-len, " AND datatype>=%d", - CTS_DATA_EXTEND_START); - } - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = cts_stmt_step(stmt); - if (CTS_TRUE != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return CTS_ERR_DB_RECORD_NOT_FOUND; - } - - do { - datatype = cts_stmt_get_int(stmt, 0); - - switch (datatype) - { - case CTS_DATA_NAME: - if (contact->name) - ERR("name already Exist"); - else - contact->name = cts_get_data_info_name(stmt); - break; - case CTS_DATA_EVENT: - cts_get_data_info_event(stmt, contact); - break; - case CTS_DATA_MESSENGER: - cts_get_data_info_messenger(stmt, contact); - break; - case CTS_DATA_POSTAL: - cts_get_data_info_postal(stmt, contact); - break; - case CTS_DATA_WEB: - cts_get_data_info_web(stmt, contact); - break; - case CTS_DATA_NICKNAME: - cts_get_data_info_nick(stmt, contact); - break; - case CTS_DATA_NUMBER: - cts_get_data_info_number(stmt, contact); - break; - case CTS_DATA_EMAIL: - cts_get_data_info_email(stmt, contact); - break; - case CTS_DATA_COMPANY: - if (contact->company) - ERR("company already Exist"); - else - contact->company = cts_get_data_info_company(stmt); - break; - default: - if (CTS_DATA_EXTEND_START <= datatype) { - cts_get_data_info_extend(stmt, datatype, contact); - break; - } - ERR("Unknown data type(%d)", datatype); - continue; - } - }while(CTS_TRUE == cts_stmt_step(stmt)); - - cts_stmt_finalize(stmt); - - return CTS_SUCCESS; -} - -static inline int cts_get_groups_info(int index, contact_t *contact) -{ - cts_stmt stmt = NULL; - char query[CTS_SQL_MAX_LEN] = {0}; - GSList *result_list=NULL; - - snprintf(query, sizeof(query), "SELECT group_id, addrbook_id," - " group_name" - " FROM %s WHERE group_id IN (SELECT group_id" - " FROM %s WHERE contact_id = %d)" - " ORDER BY group_name COLLATE NOCASE", - CTS_TABLE_GROUPS, CTS_TABLE_GROUPING_INFO, index); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - while (CTS_TRUE == cts_stmt_step(stmt)) - { - cts_group *group_info; - group_info = (cts_group *)contacts_svc_value_new(CTS_VALUE_GROUP_RELATION); - - if (group_info) - { - group_info->id = cts_stmt_get_int(stmt, 0); - group_info->addrbook_id = cts_stmt_get_int(stmt, 1); - group_info->embedded = true; - group_info->name = SAFE_STRDUP(cts_stmt_get_text(stmt, 2)); - - result_list = g_slist_append(result_list, group_info); - } - } - - cts_stmt_finalize(stmt); - contact->grouprelations = result_list; - - return CTS_SUCCESS; - -} - -static inline int cts_get_number_value(int op_code, int id, CTSvalue **value) -{ - int ret; - cts_stmt stmt; - cts_number *number; - char query[CTS_SQL_MAX_LEN] = {0}; - - if (CTS_GET_DEFAULT_NUMBER_VALUE == op_code) { - snprintf(query, sizeof(query), - "SELECT B.id, B.data1, B.data2 FROM %s A, %s B " - "WHERE A.contact_id = %d AND B.id=A.default_num AND B.datatype = %d", - CTS_TABLE_CONTACTS, CTS_TABLE_DATA, id, CTS_DATA_NUMBER); - } - else if (CTS_GET_NUMBER_VALUE == op_code) { - snprintf(query, sizeof(query), - "SELECT id, data1, data2, contact_id FROM %s " - "WHERE id = %d AND datatype = %d", - CTS_TABLE_DATA, id, CTS_DATA_NUMBER); - } - else { - ERR("Invalid op_code(%d)", op_code); - return CTS_ERR_ARG_INVALID; - } - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = cts_stmt_step(stmt); - if (CTS_TRUE != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return CTS_ERR_DB_RECORD_NOT_FOUND; - } - - number = (cts_number *)contacts_svc_value_new(CTS_VALUE_NUMBER); - if (number) { - ret = CTS_SUCCESS; - number->v_type = CTS_VALUE_RDONLY_NUMBER; - number->embedded = true; - cts_stmt_get_number(stmt, number, 0); - - if (CTS_GET_DEFAULT_NUMBER_VALUE == op_code) - number->is_default = true; - else - ret = cts_stmt_get_int(stmt, 3); - - *value = (CTSvalue*) number; - - cts_stmt_finalize(stmt); - return ret; - } - else { - ERR("contacts_svc_value_new() Failed"); - cts_stmt_finalize(stmt); - return CTS_ERR_OUT_OF_MEMORY; - } -} - -static inline int cts_get_email_value(int op_code, int id, CTSvalue **value) -{ - int ret; - cts_stmt stmt; - cts_email *email; - char query[CTS_SQL_MAX_LEN] = {0}; - - if (CTS_GET_DEFAULT_EMAIL_VALUE == op_code) { - snprintf(query, sizeof(query), - "SELECT B.id, B.data1, B.data2 FROM %s A, %s B " - "WHERE A.contact_id = %d AND B.id=A.default_email AND B.datatype = %d", - CTS_TABLE_CONTACTS, CTS_TABLE_DATA, id, CTS_DATA_EMAIL); - } - else if (CTS_GET_EMAIL_VALUE == op_code) { - snprintf(query, sizeof(query), - "SELECT id, data1, data2, contact_id FROM %s " - "WHERE id = %d AND datatype = %d", - CTS_TABLE_DATA, id, CTS_DATA_EMAIL); - } - else { - ERR("Invalid op_code(%d)", op_code); - return CTS_ERR_ARG_INVALID; - } - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = cts_stmt_step(stmt); - if (CTS_TRUE != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return CTS_ERR_DB_RECORD_NOT_FOUND; - } - - email = (cts_email *)contacts_svc_value_new(CTS_VALUE_EMAIL); - if (email) - { - ret = CTS_SUCCESS; - email->v_type = CTS_VALUE_RDONLY_EMAIL; - email->embedded = true; - cts_stmt_get_email(stmt, email, 0); - - if (CTS_GET_DEFAULT_EMAIL_VALUE == op_code) - email->is_default = true; - else - ret = cts_stmt_get_int(stmt, 3); - - *value = (CTSvalue*) email; - - cts_stmt_finalize(stmt); - return ret; - } - else - { - ERR("contacts_svc_value_new() Failed"); - cts_stmt_finalize(stmt); - return CTS_ERR_OUT_OF_MEMORY; - } -} - -static inline int cts_get_extend_data(int type, int id, CTSvalue **value) -{ - int ret; - cts_stmt stmt; - char query[CTS_SQL_MAX_LEN] = {0}; - - snprintf(query, sizeof(query), "SELECT id, data1, data2," - "data3, data4, data5, data6, data7, data8, data9, data10 " - "FROM %s WHERE datatype = %d AND contact_id = %d", CTS_TABLE_DATA, type, id); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = cts_stmt_step(stmt); - if (CTS_TRUE != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return CTS_ERR_DB_RECORD_NOT_FOUND; - } - - *value = (CTSvalue *)cts_make_extend_data(stmt, type, 0); - cts_stmt_finalize(stmt); - - retvm_if(NULL == *value, CTS_ERR_OUT_OF_MEMORY, "cts_make_extend_data() return NULL"); - - return CTS_SUCCESS; -} - -API int contacts_svc_get_contact_value(cts_get_contact_val_op op_code, - int id, CTSvalue **value) -{ - int ret; - contact_t temp={0}; - - retv_if(NULL == value, CTS_ERR_ARG_NULL); - CTS_START_TIME_CHECK; - - if ((int)CTS_DATA_EXTEND_START <= op_code) { - ret = cts_get_extend_data(op_code, id, value); - retvm_if(CTS_SUCCESS != ret, ret, "cts_get_extend_data() Failed(%d)", ret); - } - else { - switch (op_code) - { - case CTS_GET_NAME_VALUE: - ret = cts_get_data_info(CTS_GET_DATA_BY_CONTACT_ID, - CTS_DATA_FIELD_NAME, id, &temp); - retvm_if(CTS_SUCCESS != ret, ret, - "cts_get_data_info(CTS_GET_DATA_BY_CONTACT_ID) Failed(%d)", ret); - if (temp.name) { - temp.name->v_type = CTS_VALUE_RDONLY_NAME; - *value = (CTSvalue *)temp.name; - }else - *value = NULL; - break; - case CTS_GET_DEFAULT_NUMBER_VALUE: - case CTS_GET_NUMBER_VALUE: - ret = cts_get_number_value(op_code, id, value); - retvm_if(ret < CTS_SUCCESS, ret, - "cts_get_number_value() Failed(%d)", ret); - break; - case CTS_GET_DEFAULT_EMAIL_VALUE: - case CTS_GET_EMAIL_VALUE: - ret = cts_get_email_value(op_code, id, value); - retvm_if(ret < CTS_SUCCESS, ret, "cts_get_email_value() Failed(%d)", ret); - break; - case CTS_GET_COMPANY_VALUE: - ret = cts_get_data_info(CTS_GET_DATA_BY_CONTACT_ID, - CTS_DATA_FIELD_COMPANY, id, &temp); - retvm_if(CTS_SUCCESS != ret, ret, - "cts_get_data_info(CTS_DATA_FIELD_COMPANY) Failed(%d)", ret); - if (temp.company) { - temp.company->v_type = CTS_VALUE_RDONLY_COMPANY; - *value = (CTSvalue *)temp.company; - }else - *value = NULL; - break; - default: - ERR("Invalid parameter : The op_code(%d) is not supported", op_code); - return CTS_ERR_ARG_INVALID; - } - } - if (NULL == *value) return CTS_ERR_NO_DATA; - - CTS_END_TIME_CHECK(); - return ret; -} - -API int contacts_svc_get_contact(int index, CTSstruct **contact) -{ - int ret; - contact_t *record; - - retv_if(NULL == contact, CTS_ERR_ARG_NULL); - CTS_START_TIME_CHECK; - - record = (contact_t *)contacts_svc_struct_new(CTS_STRUCT_CONTACT); - - ret = cts_get_main_contacts_info(CTS_MAIN_CTS_GET_ALL, index, record); - - if (CTS_SUCCESS != ret) { - ERR("cts_get_main_contacts_info(ALL) Failed(%d)", ret); - goto CTS_RETURN_ERROR; - } - - ret = cts_get_data_info(CTS_GET_DATA_BY_CONTACT_ID, - CTS_DATA_FIELD_ALL, index, record); - if (CTS_SUCCESS != ret) { - ERR("cts_get_data_info(CTS_GET_DATA_BY_CONTACT_ID) Failed(%d)", ret); - goto CTS_RETURN_ERROR; - } - - ret = cts_get_groups_info(index, record); - if (CTS_SUCCESS != ret) { - ERR("cts_get_group_info(CTS_GET_DATA_BY_CONTACT_ID) Failed(%d)", ret); - goto CTS_RETURN_ERROR; - } - - *contact = (CTSstruct *)record; - - CTS_END_TIME_CHECK(); - return CTS_SUCCESS; - -CTS_RETURN_ERROR: - contacts_svc_struct_free((CTSstruct *)record); - return ret; -} - -API int contacts_svc_find_contact_by(cts_find_op op_code, - const char *user_data) -{ - int ret; - const char *temp; - char query[CTS_SQL_MAX_LEN] = {0}; - char normalized_val[CTS_SQL_MIN_LEN]; - - CTS_START_TIME_CHECK; - retv_if(NULL == user_data, CTS_ERR_ARG_NULL); - - switch (op_code) - { - case CTS_FIND_BY_NUMBER: - ret = cts_clean_number(user_data, normalized_val, sizeof(normalized_val)); - retvm_if(ret <= 0, CTS_ERR_ARG_INVALID, "Number(%s) is invalid", user_data); - - temp = cts_normalize_number(normalized_val); - snprintf(query, sizeof(query), "SELECT contact_id " - "FROM %s WHERE datatype = %d AND data3 = '%s' LIMIT 1", - CTS_TABLE_DATA, CTS_DATA_NUMBER, temp); - ret = cts_query_get_first_int_result(query); - break; - case CTS_FIND_BY_EMAIL: - snprintf(query, sizeof(query), "SELECT contact_id " - "FROM %s WHERE datatype = %d AND data2 = '%s' LIMIT 1", - CTS_TABLE_DATA, CTS_DATA_EMAIL, user_data); - ret = cts_query_get_first_int_result(query); - break; - case CTS_FIND_BY_NAME: - ret = cts_normalize_str(user_data, normalized_val, sizeof(normalized_val)); - retvm_if(ret < CTS_SUCCESS, ret, "cts_normalize_str() Failed(%d)", ret); - - if (CTS_ORDER_NAME_LASTFIRST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - temp = CTS_SCHEMA_DATA_NAME_REVERSE_LOOKUP; - else - temp = CTS_SCHEMA_DATA_NAME_LOOKUP; - - snprintf(query, sizeof(query), "SELECT contact_id FROM %s " - "WHERE %s LIKE '%%%s%%' LIMIT 1", - CTS_TABLE_DATA, temp, normalized_val); - - ret = cts_query_get_first_int_result(query); - break; - case CTS_FIND_BY_UID: - snprintf(query, sizeof(query), "SELECT contact_id " - "FROM %s WHERE uid = '%s' LIMIT 1", CTS_TABLE_CONTACTS, user_data); - ret = cts_query_get_first_int_result(query); - break; - default: - ERR("Invalid parameter : The op_code(%d) is not supported", op_code); - return CTS_ERR_ARG_INVALID; - } - - CTS_END_TIME_CHECK(); - return ret; -} diff --git a/src/cts-contact.h b/src/cts-contact.h deleted file mode 100755 index 85b1a2b..0000000 --- a/src/cts-contact.h +++ /dev/null @@ -1,414 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_CONTACT_H__ -#define __CTS_CONTACT_H__ - -// -#endif //__CTS_CONTACT_H__ - diff --git a/src/cts-errors.h b/src/cts-errors.h deleted file mode 100755 index 55a2c9a..0000000 --- a/src/cts-errors.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_ERRORS_H__ -#define __CTS_ERRORS_H__ - -// - -#endif //__CTS_ERRORS_H__ - diff --git a/src/cts-favorite.c b/src/cts-favorite.c deleted file mode 100755 index c2d2655..0000000 --- a/src/cts-favorite.c +++ /dev/null @@ -1,356 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include "cts-internal.h" -#include "cts-schema.h" -#include "cts-sqlite.h" -#include "cts-utils.h" -#include "cts-favorite.h" - -API int contacts_svc_set_favorite(cts_favor_type op, int related_id) -{ - int ret; - double prio = 0.0; - cts_stmt stmt; - char query[CTS_SQL_MAX_LEN] = {0}; - - retvm_if(CTS_FAVOR_CONTACT != op && CTS_FAVOR_NUMBER != op, CTS_ERR_ARG_INVALID, - "op(%d) is invalid", op); - - snprintf(query, sizeof(query), - "SELECT MAX(favorite_prio) FROM %s", CTS_TABLE_FAVORITES); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - ret = cts_stmt_step(stmt); - if (CTS_TRUE == ret) { - prio = cts_stmt_get_dbl(stmt, 0); - } - else if (CTS_SUCCESS != ret) { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - contacts_svc_end_trans(false); - return ret; - } - cts_stmt_finalize(stmt); - - prio = prio + 1.0; - snprintf(query, sizeof(query), - "INSERT INTO %s(type, related_id, favorite_prio) VALUES(%d, %d, %f)", - CTS_TABLE_FAVORITES, op, related_id, prio); - - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) - { - ERR("cts_query_exec() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - cts_set_favor_noti(); - - ret = contacts_svc_end_trans(true); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -API int contacts_svc_unset_favorite(cts_favor_type op, int related_id) -{ - int ret; - cts_stmt stmt; - char query[CTS_SQL_MIN_LEN] = {0}; - - retvm_if(CTS_FAVOR_CONTACT != op && CTS_FAVOR_NUMBER != op, CTS_ERR_ARG_INVALID, - "op(%d) is invalid", op); - - snprintf(query, sizeof(query), "DELETE FROM %s WHERE type = %d AND related_id = %d", - CTS_TABLE_FAVORITES, op, related_id); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = contacts_svc_begin_trans(); - if (ret) { - cts_stmt_finalize(stmt); - ERR("contacts_svc_begin_trans() Failed(%d)", ret); - return ret; - } - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - contacts_svc_end_trans(false); - return ret; - } - ret = cts_db_change(); - cts_stmt_finalize(stmt); - - if (0 < ret) { - cts_set_favor_noti(); - ret = contacts_svc_end_trans(true); - } - else { - contacts_svc_end_trans(false); - ret = CTS_ERR_NO_DATA; - } - - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -API int contacts_svc_delete_favorite(int favorite_id) -{ - int ret; - cts_stmt stmt; - char query[CTS_SQL_MIN_LEN] = {0}; - - snprintf(query, sizeof(query), "DELETE FROM %s WHERE id = %d", - CTS_TABLE_FAVORITES, favorite_id); - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - contacts_svc_end_trans(false); - return ret; - } - ret = cts_db_change(); - cts_stmt_finalize(stmt); - - if (0 < ret) { - cts_set_favor_noti(); - ret = contacts_svc_end_trans(true); - } - else { - contacts_svc_end_trans(false); - ret = CTS_ERR_NO_DATA; - } - - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -static inline int cts_modify_favorite_prio(int favorite_id, int front, int back) -{ - int ret; - cts_stmt stmt; - double front_prio=0.0, back_prio=0.0, prio; - char query[CTS_SQL_MIN_LEN] = {0}; - - snprintf(query, sizeof(query), "SELECT favorite_prio FROM %s WHERE id = ?", - CTS_TABLE_FAVORITES); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - cts_stmt_bind_int(stmt, 1, front); - ret = cts_stmt_step(stmt); - if (CTS_TRUE == ret) - front_prio = cts_stmt_get_dbl(stmt, 0); - - cts_stmt_reset(stmt); - cts_stmt_bind_int(stmt, 1, back); - ret = cts_stmt_step(stmt); - if (CTS_TRUE == ret) - back_prio = cts_stmt_get_dbl(stmt, 0); - - cts_stmt_finalize(stmt); - - retvm_if(0.0 == front_prio && 0.0 == back_prio, CTS_ERR_ARG_INVALID, - "The indexes for front and back are invalid."); - - if (0.0 == back_prio) - prio = front_prio + 1; - else - prio = (front_prio + back_prio) / 2; - - snprintf(query, sizeof(query), - "UPDATE %s SET favorite_prio = %f WHERE id = %d", - CTS_TABLE_FAVORITES, prio, favorite_id); - - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) - { - ERR("cts_query_exec() Failed(%d)", ret); - return ret; - } - - return CTS_SUCCESS; -} - -API int contacts_svc_favorite_order(int favorite_id, - int front_favorite_id, int back_favorite_id) -{ - int ret; - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - ret = cts_modify_favorite_prio(favorite_id, front_favorite_id, back_favorite_id); - - if (CTS_SUCCESS != ret) - { - ERR("cts_modify_favorite_prio() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - cts_set_favor_noti(); - - ret = contacts_svc_end_trans(true); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -API int contacts_svc_set_speeddial(int speed_num, int number_id) -{ - int ret; - char query[CTS_SQL_MAX_LEN] = {0}; - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - snprintf(query, sizeof(query), - "INSERT INTO %s(speed_num, number_id) VALUES(%d, %d)", - CTS_TABLE_SPEEDDIALS, speed_num, number_id); - - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) { - ERR("cts_query_exec() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - cts_set_speed_noti(); - - ret = contacts_svc_end_trans(true); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -API int contacts_svc_unset_speeddial(int speed_num) -{ - int ret; - cts_stmt stmt; - char query[CTS_SQL_MIN_LEN] = {0}; - - snprintf(query, sizeof(query), "DELETE FROM %s WHERE speed_num = %d", - CTS_TABLE_SPEEDDIALS, speed_num); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = contacts_svc_begin_trans(); - if (ret) { - cts_stmt_finalize(stmt); - ERR("contacts_svc_begin_trans() Failed(%d)", ret); - return ret; - } - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - contacts_svc_end_trans(false); - return ret; - } - ret = cts_db_change(); - cts_stmt_finalize(stmt); - - if (0 < ret) { - cts_set_speed_noti(); - ret = contacts_svc_end_trans(true); - } - else { - contacts_svc_end_trans(false); - ret = CTS_ERR_NO_DATA; - } - - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -API int contacts_svc_get_speeddial(int speed_num, CTSvalue **value) -{ - int ret; - cts_stmt stmt; - cts_number *number; - char query[CTS_SQL_MAX_LEN] = {0}; - - snprintf(query, sizeof(query), - "SELECT A.id, A.data1, A.data2, A.contact_id FROM %s A, %s B " - "WHERE A.datatype = %d AND B.speed_num = %d AND A.id = B.number_id", - CTS_TABLE_DATA, CTS_TABLE_SPEEDDIALS, CTS_DATA_NUMBER, speed_num); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = cts_stmt_step(stmt); - if (CTS_TRUE != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return CTS_ERR_DB_RECORD_NOT_FOUND; - } - - number = (cts_number *)contacts_svc_value_new(CTS_VALUE_NUMBER); - if (number) { - ret = CTS_SUCCESS; - number->v_type = CTS_VALUE_RDONLY_NUMBER; - number->embedded = true; - number->id = cts_stmt_get_int(stmt, 0); - number->type = cts_stmt_get_int(stmt, 1); - number->number = SAFE_STRDUP(cts_stmt_get_text(stmt, 2)); - ret = cts_stmt_get_int(stmt, 3); - - *value = (CTSvalue*) number; - - cts_stmt_finalize(stmt); - return ret; - } - else { - ERR("contacts_svc_value_new() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return CTS_ERR_OUT_OF_MEMORY; - } -} diff --git a/src/cts-favorite.h b/src/cts-favorite.h deleted file mode 100755 index f62c02f..0000000 --- a/src/cts-favorite.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_FAVORITE_H__ -#define __CTS_FAVORITE_H__ - -// - -#endif //__CTS_FAVORITE_H__ diff --git a/src/cts-group.c b/src/cts-group.c deleted file mode 100755 index 808144a..0000000 --- a/src/cts-group.c +++ /dev/null @@ -1,391 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include "cts-internal.h" -#include "cts-schema.h" -#include "cts-sqlite.h" -#include "cts-utils.h" -#include "cts-list.h" -#include "cts-group.h" - -API int contacts_svc_find_group(int addressbook_id, const char *name) -{ - char query[CTS_SQL_MIN_LEN]; - - retv_if(NULL == name, CTS_ERR_ARG_NULL); - - snprintf(query, sizeof(query), "SELECT group_id FROM %s " - "WHERE group_name = '%s' LIMIT 1", - CTS_TABLE_GROUPS, name); - - return cts_query_get_first_int_result(query); -} - - -API int contacts_svc_get_group(int index, CTSvalue **retgroup) -{ - int ret; - cts_stmt stmt = NULL; - char query[CTS_SQL_MAX_LEN] = {0}; - - retv_if(NULL == retgroup, CTS_ERR_ARG_NULL); - - snprintf(query, sizeof(query), - "SELECT group_id, addrbook_id, group_name, ringtone " - "FROM %s WHERE group_id = %d", CTS_TABLE_GROUPS, index); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = cts_stmt_step(stmt); - if (CTS_TRUE != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return CTS_ERR_DB_RECORD_NOT_FOUND; - } - cts_group *group; - group = (cts_group *)contacts_svc_value_new(CTS_VALUE_GROUP); - - if (group) - { - group->embedded = true; - group->id = cts_stmt_get_int(stmt, 0); - group->addrbook_id = cts_stmt_get_int(stmt, 1); - group->name = SAFE_STRDUP(cts_stmt_get_text(stmt, 2)); - group->ringtone_path = SAFE_STRDUP(cts_stmt_get_text(stmt, 3)); - } - cts_stmt_finalize(stmt); - - *retgroup = (CTSvalue *)group; - - return CTS_SUCCESS; -} - -API int contacts_svc_update_group(CTSvalue *group) -{ - int ret; - cts_stmt stmt = NULL; - char query[CTS_SQL_MIN_LEN] = {0}; - cts_group *record = (cts_group *)group; - - retv_if(NULL == group, CTS_ERR_ARG_NULL); - retvm_if(CTS_VALUE_GROUP != group->v_type, CTS_ERR_ARG_INVALID, - "group is invalid type(%d)", group->v_type); - retvm_if(NULL == record->name, CTS_ERR_ARG_INVALID, - "The name of group is empty."); - - snprintf(query, sizeof(query), "UPDATE %s SET group_name=?, ringtone=? " - "WHERE group_id=%d", CTS_TABLE_GROUPS, record->id); - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - stmt = cts_query_prepare(query); - if (NULL == stmt) { - ERR("cts_query_prepare() Failed"); - contacts_svc_end_trans(false); - return CTS_ERR_DB_FAILED; - } - - cts_stmt_bind_text(stmt, 1, record->name); - if (record->ringtone_path) - cts_stmt_bind_text(stmt, 2, record->ringtone_path); - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - contacts_svc_end_trans(false); - return ret; - } - cts_stmt_finalize(stmt); - - cts_set_group_noti(); - - ret = contacts_svc_end_trans(true); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -API int contacts_svc_insert_group(int addressbook_id, CTSvalue *group) -{ - int ret, index; - cts_stmt stmt = NULL; - cts_group *record = (cts_group *)group; - char query[CTS_SQL_MAX_LEN] = {0}; - - retv_if(NULL == group, CTS_ERR_ARG_NULL); - retvm_if(CTS_VALUE_GROUP != group->v_type, CTS_ERR_ARG_INVALID, - "group is invalid type(%d)", group->v_type); - retvm_if(NULL == record->name, CTS_ERR_ARG_INVALID, - "The name of group is empty."); - - snprintf(query, sizeof(query), - "INSERT INTO %s(addrbook_id, group_name, ringtone) " - "VALUES(%d, ?, ?)", - CTS_TABLE_GROUPS, addressbook_id); - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - stmt = cts_query_prepare(query); - if (NULL == stmt) { - ERR("cts_query_prepare() Failed"); - contacts_svc_end_trans(false); - return CTS_ERR_DB_FAILED; - } - - cts_stmt_bind_text(stmt, 1, record->name); - - if (record->ringtone_path) - cts_stmt_bind_text(stmt, 2, record->ringtone_path); - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - contacts_svc_end_trans(false); - return ret; - } - index = cts_db_get_last_insert_id(); - cts_stmt_finalize(stmt); - - cts_set_group_noti(); - ret = contacts_svc_end_trans(true); - retvm_if(ret < CTS_SUCCESS, ret, - "contacts_svc_end_trans(true) Failed(%d)", ret); - - return index; -} - -API int contacts_svc_delete_group_with_members(int index) -{ - int ret; - char query[CTS_SQL_MAX_LEN] = {0}; - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - snprintf(query, sizeof(query), "DELETE FROM %s WHERE contact_id " - "IN (SELECT contact_id FROM %s A WHERE group_id = %d AND " - "(SELECT COUNT(*) FROM %s B WHERE A.contact_id = B.contact_id) = 1)", - CTS_TABLE_CONTACTS, CTS_TABLE_GROUPING_INFO, index, CTS_TABLE_GROUPING_INFO); - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) - { - ERR("cts_query_exec() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - snprintf(query, sizeof(query), "DELETE FROM %s WHERE group_id = %d", - CTS_TABLE_GROUPS, index); - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) - { - ERR("cts_query_exec() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - ret = cts_db_change(); - if (0 < ret) { - cts_set_contact_noti(); - cts_set_group_noti(); - ret = contacts_svc_end_trans(true); - } else { - contacts_svc_end_trans(false); - ret = CTS_ERR_NO_DATA; - } - - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -API int contacts_svc_delete_group(int index) -{ - int ret; - char query[CTS_SQL_MAX_LEN] = {0}; - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - snprintf(query, sizeof(query), "DELETE FROM %s WHERE group_id=%d", - CTS_TABLE_GROUPS, index); - - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) - { - ERR("cts_query_exec() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - ret = cts_db_change(); - if (0 < ret) { - cts_set_group_noti(); - ret = contacts_svc_end_trans(true); - } else { - contacts_svc_end_trans(false); - ret = CTS_ERR_NO_DATA; - } - - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -int cts_group_set_relation(int group_id, int contact_id, int contact_acc) -{ - int ret; - cts_stmt stmt = NULL; - char query[CTS_SQL_MIN_LEN]; - -#ifdef CTS_CHECK_SAME_ADDRESSBOOK - snprintf(query, sizeof(query), - "SELECT addrbook_id FROM %s WHERE group_id = %d", - CTS_TABLE_GROUPS, group_id); - int grp_acc = cts_query_get_first_int_result(query); - retvm_if(CTS_ERR_DB_RECORD_NOT_FOUND == grp_acc, CTS_ERR_ARG_INVALID, - "group_id(%d) is Invalid", group_id); - - retvm_if(contact_acc != grp_acc, CTS_ERR_ARG_INVALID, - "addrbook_id(%d) of the contact and addrbook_id(%d) of the group is not same", - contact_acc, grp_acc); -#endif - snprintf(query, sizeof(query), "INSERT OR IGNORE INTO %s VALUES(%d, %d)", - CTS_TABLE_GROUPING_INFO, group_id, contact_id); - - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = cts_stmt_step(stmt); - warn_if(CTS_SUCCESS != ret, "cts_stmt_step() Failed(%d)", ret); - - cts_stmt_finalize(stmt); - - return ret; -} - -API int contacts_svc_group_set_relation(int group_id, int contact_id) -{ - int ret, ct_acc=0; - -#ifndef CTS_CHECK_SAME_ADDRESSBOOK - retvm_if(!group_id, CTS_ERR_ARG_INVALID, "group_id is 0"); - retvm_if(!contact_id, CTS_ERR_ARG_INVALID, "contact_id is 0"); -#else - char query[CTS_SQL_MIN_LEN]; - - snprintf(query, sizeof(query), - "SELECT addrbook_id FROM %s WHERE contact_id = %d", - CTS_TABLE_CONTACTS, contact_id); - ct_acc = cts_query_get_first_int_result(query); - retvm_if(CTS_ERR_DB_RECORD_NOT_FOUND == ct_acc, CTS_ERR_ARG_INVALID, - "contact_id(%d) is Invalid", contact_id); -#endif - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - ret = cts_group_set_relation(group_id, contact_id, ct_acc); - if (ret) { - contacts_svc_end_trans(false); - ERR("cts_group_set_relation() Failed(%d)", ret); - return ret; - } - - ret = cts_update_contact_changed_time(contact_id); - if (CTS_SUCCESS != ret) { - ERR("cts_update_contact_changed_time() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - cts_set_contact_noti(); - cts_set_group_rel_noti(); - ret = contacts_svc_end_trans(true); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -int cts_group_unset_relation(int group_id, int contact_id) -{ - int ret; - cts_stmt stmt = NULL; - char query[CTS_SQL_MIN_LEN]; - - snprintf(query, sizeof(query), - "DELETE FROM %s WHERE group_id = %d AND contact_id = %d", - CTS_TABLE_GROUPING_INFO, group_id, contact_id); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = cts_stmt_step(stmt); - warn_if(CTS_SUCCESS != ret, "cts_stmt_step() Failed(%d)", ret); - - cts_stmt_finalize(stmt); - - return ret; -} - -API int contacts_svc_group_unset_relation(int group_id, int contact_id) -{ - int ret; - - retvm_if(!group_id, CTS_ERR_ARG_INVALID, "group_id is 0"); - retvm_if(!contact_id, CTS_ERR_ARG_INVALID, "contact_id is 0"); - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - ret = cts_group_unset_relation(group_id, contact_id); - if (ret) { - contacts_svc_end_trans(false); - ERR("cts_group_unset_relation() Failed(%d)", ret); - return ret; - } - - ret = cts_update_contact_changed_time(contact_id); - if (CTS_SUCCESS != ret) { - ERR("cts_update_contact_changed_time() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - cts_set_contact_noti(); - cts_set_group_rel_noti(); - ret = contacts_svc_end_trans(true); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} diff --git a/src/cts-group.h b/src/cts-group.h deleted file mode 100755 index 472b68f..0000000 --- a/src/cts-group.h +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_GROUP_H__ -#define __CTS_GROUP_H__ - -int cts_group_set_relation(int group_id, int contact_id, int contact_acc); -int cts_group_unset_relation(int group_id, int contact_id); - -/** - * This function gets index of group found by name. - * @param[in] addressbook_id The index of addressbook. 0 is local(phone internal) - * @param[in] name The group name for searching - * @return index of found group on success, Negative value(#cts_error) on error - * @par example - * @code - void get_group(void) - { - int index, ret=-1; - CTSvalue *group = NULL; - - index = contacts_svc_find_group(0, "Family"); - if(index > CTS_SUCCESS) - ret = contacts_svc_get_group(index, &group); - if(ret < CTS_SUCCESS) { - printf("contacts_svc_get_group() Failed"); - return; - } - } - * @endcode - */ -int contacts_svc_find_group(int addressbook_id, const char *name); - - -// -#endif //__CTS_GROUP_H__ - diff --git a/src/cts-inotify.c b/src/cts-inotify.c deleted file mode 100755 index 553fe3c..0000000 --- a/src/cts-inotify.c +++ /dev/null @@ -1,340 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include -#include -#include - -#include "cts-internal.h" - -typedef struct -{ - int wd; - void (*cb)(void *); - void *cb_data; -}noti_info; - -static int cts_inoti_fd = -1; -static guint cts_inoti_handler; -static GSList *cts_noti_list; - -static inline void handle_callback(GSList *noti_list, int wd, uint32_t mask) -{ - noti_info *noti; - GSList *it = NULL; - - for (it = noti_list;it;it=it->next) - { - noti = (noti_info *)it->data; - if (noti->wd == wd) { - if ((mask & IN_CLOSE_WRITE) && noti->cb) - noti->cb(noti->cb_data); - } - } -} - -static gboolean cts_inotify_gio_cb(GIOChannel *src, GIOCondition cond, gpointer data) -{ - int fd, ret; - struct inotify_event ie; - char name[FILENAME_MAX]; - - fd = g_io_channel_unix_get_fd(src); - - while (0 < (ret = read(fd, &ie, sizeof(ie)))) { - if (sizeof(ie) == ret) { - if (cts_noti_list) - handle_callback(cts_noti_list, ie.wd, ie.mask); - - while (0 < ie.len) { - ret = read(fd, name, (ie.lennext) - { - if (it->data) - { - same_noti = it->data; - if (same_noti->wd == wd && same_noti->cb == cb && same_noti->cb_data == data) { - break; - } - else { - same_noti = NULL; - } - } - } - - if (same_noti) { - cts_inotify_watch(cts_inoti_fd, path); - ERR("The same callback(%s) is already exist", path); - return CTS_ERR_ALREADY_EXIST; - } - - ret = cts_inotify_watch(cts_inoti_fd, path); - retvm_if(CTS_SUCCESS != ret, ret, "cts_inotify_watch() Failed"); - - noti = calloc(1, sizeof(noti_info)); - retvm_if(NULL == noti, CTS_ERR_OUT_OF_MEMORY, "calloc() Failed"); - - noti->wd = wd; - noti->cb_data = data; - noti->cb = cb; - cts_noti_list = g_slist_append(cts_noti_list, noti); - - return CTS_SUCCESS; -} - -static inline int del_noti_with_data(GSList **noti_list, int wd, - void (*cb)(void *), void *user_data) -{ - int del_cnt, remain_cnt; - GSList *it, *result; - - del_cnt = 0; - remain_cnt = 0; - - it = result = *noti_list; - while (it) - { - noti_info *noti = it->data; - if (noti && wd == noti->wd) - { - if (cb == noti->cb && user_data == noti->cb_data) { - it = it->next; - result = g_slist_remove(result , noti); - free(noti); - del_cnt++; - continue; - } - else { - remain_cnt++; - } - } - it = it->next; - } - retvm_if(del_cnt == 0, CTS_ERR_NO_DATA, "nothing deleted"); - - *noti_list = result; - - return remain_cnt; -} - -static inline int del_noti(GSList **noti_list, int wd, void (*cb)(void *)) -{ - int del_cnt, remain_cnt; - GSList *it, *result; - - del_cnt = 0; - remain_cnt = 0; - - it = result = *noti_list; - while (it) - { - noti_info *noti = it->data; - if (noti && wd == noti->wd) - { - if (NULL == cb || noti->cb == cb) { - it = it->next; - result = g_slist_remove(result, noti); - free(noti); - del_cnt++; - continue; - } - else { - remain_cnt++; - } - } - it = it->next; - } - retvm_if(del_cnt == 0, CTS_ERR_NO_DATA, "nothing deleted"); - - *noti_list = result; - - return remain_cnt; -} - -int cts_inotify_unsubscribe(const char *path, void (*cb)(void *)) -{ - int ret, wd; - - retv_if(NULL == path, CTS_ERR_ARG_NULL); - retvm_if(cts_inoti_fd < 0, CTS_ERR_ENV_INVALID, - "cts_inoti_fd(%d) is invalid", cts_inoti_fd); - - wd = cts_inotify_get_wd(cts_inoti_fd, path); - retvm_if(-1 == wd, CTS_ERR_INOTIFY_FAILED, - "cts_inotify_get_wd() Failed(%d)", errno); - - ret = del_noti(&cts_noti_list, wd, cb); - warn_if(ret < CTS_SUCCESS, "del_noti() Failed(%d)", ret); - - if (0 == ret) - return inotify_rm_watch(cts_inoti_fd, wd); - - return cts_inotify_watch(cts_inoti_fd, path); -} - -int cts_inotify_unsubscribe_with_data(const char *path, - void (*cb)(void *), void *user_data) -{ - int ret, wd; - - retv_if(NULL==path, CTS_ERR_ARG_NULL); - retv_if(NULL==cb, CTS_ERR_ARG_NULL); - retvm_if(cts_inoti_fd < 0, CTS_ERR_ENV_INVALID, - "cts_inoti_fd(%d) is invalid", cts_inoti_fd); - - wd = cts_inotify_get_wd(cts_inoti_fd, path); - retvm_if(-1 == wd, CTS_ERR_INOTIFY_FAILED, - "cts_inotify_get_wd() Failed(%d)", errno); - - ret = del_noti_with_data(&cts_noti_list, wd, cb, user_data); - warn_if(ret < CTS_SUCCESS, "del_noti_with_data() Failed(%d)", ret); - - if (0 == ret) - return inotify_rm_watch(cts_inoti_fd, wd); - - return cts_inotify_watch(cts_inoti_fd, path); -} - -static void clear_nslot_list(gpointer data, gpointer user_data) -{ - free(data); -} - -static inline gboolean cts_inotify_detach_handler(guint id) -{ - return g_source_remove(id); -} - -void cts_inotify_close(void) -{ - if (cts_inoti_handler) { - cts_inotify_detach_handler(cts_inoti_handler); - cts_inoti_handler = 0; - } - - if (cts_noti_list) { - g_slist_foreach(cts_noti_list, clear_nslot_list, NULL); - g_slist_free(cts_noti_list); - cts_noti_list = NULL; - } - - if (0 <= cts_inoti_fd) { - close(cts_inoti_fd); - cts_inoti_fd = -1; - } -} diff --git a/src/cts-internal.h b/src/cts-internal.h deleted file mode 100755 index 66cc489..0000000 --- a/src/cts-internal.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_INTERNAL_H__ -#define __CTS_INTERNAL_H__ - -#include -#include "cts-errors.h" -#include "cts-struct.h" - -#ifndef API -#define API __attribute__ ((visibility("default"))) -#endif - -#define SAFE_STR(src) (src)?src:"" - -#define CTS_DLOG_OUT -//#define CTS_DEBUGGING -//#define CTS_TIMECHECK - -#ifdef CTS_DLOG_OUT -#define LOG_TAG "CONTACTS_SVC" -#include -#define DLOG(prio, fmt, arg...) \ - do { SLOG(prio, LOG_TAG, fmt, ##arg); } while (0) -#define INFO(fmt, arg...) SLOGI(fmt, ##arg) -#define ERR(fmt, arg...) SLOGE("%s(%d): " fmt, __FUNCTION__, __LINE__, ##arg) -#define DBG(fmt, arg...) SLOGD("%s:" fmt, __FUNCTION__, ##arg) -#else -#include -#define PRT(prio, fmt, arg...) \ - do { fprintf((prio?stderr:stdout),"[Contacts-service]" fmt"\n", ##arg); } while (0) -#define INFO(fmt, arg...) PRT(0, fmt, ##arg) -#define ERR(fmt, arg...) PRT(1,"%s(%d): " fmt, __FUNCTION__, __LINE__, ##arg) -#define DBG(fmt, arg...) \ - do { \ - printf("\x1b[105;37m[%d]\x1b[0m(%s)" fmt "\n", getpid(), __FUNCTION__, ##arg); \ - } while (0) -#endif - -#ifdef CTS_DEBUGGING -#define CTS_FN_CALL DBG(">>>>>>>> called") -#define CTS_FN_END DBG("<<<<<<<< ended") -#define CTS_DBG(fmt, arg...) DBG("(%d) " fmt, __LINE__, ##arg) -#else /* CTS_DEBUGGING */ -#define CTS_FN_CALL -#define CTS_FN_END -#define CTS_DBG(fmt, arg...) -#endif /* CTS_DEBUGGING */ - -#define warn_if(expr, fmt, arg...) do { \ - if (expr) { \ - ERR(fmt, ##arg); \ - } \ -} while (0) -#define ret_if(expr) do { \ - if (expr) { \ - ERR("(%s)", #expr); \ - return; \ - } \ -} while (0) -#define retv_if(expr, val) do { \ - if (expr) { \ - ERR("(%s)", #expr); \ - return (val); \ - } \ -} while (0) -#define retm_if(expr, fmt, arg...) do { \ - if (expr) { \ - ERR(fmt, ##arg); \ - return; \ - } \ -} while (0) -#define retvm_if(expr, val, fmt, arg...) do { \ - if (expr) { \ - ERR(fmt, ##arg); \ - return (val); \ - } \ -} while (0) - -/************** TimeCheck ***************/ -#ifdef CTS_TIMECHECK - -double correction, startT; -double cts_set_start_time(void); -double cts_exec_time(double start); -int cts_init_time(void); -#define CTS_START_TIME_CHECK \ - cts_init_time();\ -startT = cts_set_start_time() -#define CTS_END_TIME_CHECK(fmt, arg...) \ - DBG(fmt" time = %f ms\n", ##arg, cts_exec_time(startT)) - -#else /* CTS_TIMECHECK */ - -#define CTS_START_TIME_CHECK -#define CTS_END_TIME_CHECK(arg) - -#endif /* CTS_TIMECHECK */ - -#endif /* __CTS_INTERNAL_H__ */ - diff --git a/src/cts-list-info.c b/src/cts-list-info.c deleted file mode 100755 index 96e23b9..0000000 --- a/src/cts-list-info.c +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include "cts-internal.h" -#include "cts-normalize.h" -#include "cts-utils.h" -#include "cts-list.h" - -static inline CTSvalue* cts_iter_get_info_contact(cts_stmt stmt, int type) -{ - int i, lang; - char *temp; - contact_list *result; - - result = (contact_list *)contacts_svc_value_new(CTS_VALUE_LIST_CONTACT); - retvm_if(NULL == result, NULL, "contacts_svc_value_new() Failed"); - - i = 0; - result->id = cts_stmt_get_int(stmt, i++); - lang = cts_stmt_get_int(stmt, i++); - temp = cts_stmt_get_text(stmt, i++); - result->first = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, i++); - result->last = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, i++); - result->display = SAFE_STRDUP(temp); - result->acc_id = cts_stmt_get_int(stmt, i++); - temp = cts_stmt_get_text(stmt, i++); - result->img_path = SAFE_STRDUP(temp); - - if (CTS_LANG_DEFAULT == lang) - lang = cts_get_default_language(); - - if (NULL == result->display && result->first && result->last - && CTS_LANG_ENGLISH == lang) { - char display[CTS_SQL_MAX_LEN]; - if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - snprintf(display, sizeof(display), "%s %s", result->first, result->last); - else - snprintf(display, sizeof(display), "%s, %s", result->last, result->first); - - result->display = strdup(display); - } - if (CTS_ITER_CONTACTS_WITH_NAME != type) { - temp = cts_stmt_get_text(stmt, i++); - result->normalize = SAFE_STRDUP(temp); - } - - return (CTSvalue *)result; -} - -static inline CTSvalue* cts_iter_get_info_number_email(cts_stmt stmt, int type) -{ - int i, lang; - char *temp; - contact_list *result; - - result = (contact_list *)contacts_svc_value_new(CTS_VALUE_LIST_CONTACT); - retvm_if(NULL == result, NULL, "contacts_svc_value_new() Failed"); - if (CTS_ITER_EMAILINFOS_WITH_EMAIL == type) - result->v_type = CTS_VALUE_LIST_EMAILINFO; - else if (CTS_ITER_NUMBERS_EMAILS == type) - result->v_type = CTS_VALUE_LIST_NUMS_EMAILS; - else - result->v_type = CTS_VALUE_LIST_NUMBERINFO; - - i = 0; - result->id = cts_stmt_get_int(stmt, i++); - lang = cts_stmt_get_int(stmt, i++); - temp = cts_stmt_get_text(stmt, i++); - result->first = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, i++); - result->last = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, i++); - result->display = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, i++); - result->connect = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, i++); - result->img_path = SAFE_STRDUP(temp); - if (CTS_ITER_NUMBERS_EMAILS == type) { - result->acc_id = cts_stmt_get_int(stmt, i++); - temp = cts_stmt_get_text(stmt, i++); - result->normalize = SAFE_STRDUP(temp); - } - - if (CTS_LANG_DEFAULT == lang) - lang = cts_get_default_language(); - - if (NULL == result->display && result->first && result->last - && CTS_LANG_ENGLISH == lang) { - char display[CTS_SQL_MAX_LEN]; - if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - snprintf(display, sizeof(display), "%s %s", result->first, result->last); - else - snprintf(display, sizeof(display), "%s, %s", result->last, result->first); - - result->display = strdup(display); - } - - return (CTSvalue *)result; -} - -static inline CTSvalue* cts_iter_get_info_sdn(cts_stmt stmt, int type) -{ - char *temp; - sdn_list *result; - - result = (sdn_list *)contacts_svc_value_new(CTS_VALUE_LIST_SDN); - retvm_if(NULL == result, NULL, "contacts_svc_value_new() Failed"); - - temp = cts_stmt_get_text(stmt, 0); - result->name = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, 1); - result->number = SAFE_STRDUP(temp); - - return (CTSvalue *)result; -} - -static inline CTSvalue* cts_iter_get_info_change(updated_contact *cursor) -{ - change_list *result; - - result = (change_list *)contacts_svc_value_new(CTS_VALUE_LIST_CHANGE); - retvm_if(NULL == result, NULL, "contacts_svc_value_new() Failed"); - - result->changed_type = cursor->type; - result->id = cursor->id; - result->changed_ver = cursor->ver; - - return (CTSvalue *)result; -} - -static inline CTSvalue* cts_iter_get_info_plog(int type, cts_stmt stmt) -{ - int lang, cnt=0; - char *temp; - plog_list *result; - - result = (plog_list *)contacts_svc_value_new(CTS_VALUE_LIST_PLOG); - retvm_if(NULL == result, NULL, "contacts_svc_value_new() Failed"); - - switch (type) - { - case CTS_ITER_GROUPING_PLOG: - result->id = cts_stmt_get_int(stmt, cnt++); - lang = cts_stmt_get_int(stmt, cnt++); - temp = cts_stmt_get_text(stmt, cnt++); - result->first = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->last = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->display = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, cnt++); - result->img_path = SAFE_STRDUP(temp); - if (CTS_LANG_DEFAULT == lang) - lang = cts_get_default_language(); - - if (NULL == result->display && result->first && result->last - && CTS_LANG_ENGLISH == lang) { - char display[CTS_SQL_MAX_LEN]; - if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - snprintf(display, sizeof(display), "%s %s", result->first, result->last); - else - snprintf(display, sizeof(display), "%s, %s", result->last, result->first); - - result->display = strdup(display); - } - - temp = cts_stmt_get_text(stmt, cnt++); - result->number = SAFE_STRDUP(temp); - result->log_type = cts_stmt_get_int(stmt, cnt++); - result->log_time = cts_stmt_get_int(stmt, cnt++); - result->extra_data1 = cts_stmt_get_int(stmt, cnt++); - temp = cts_stmt_get_text(stmt, cnt++); - result->extra_data2 = SAFE_STRDUP(temp); - result->related_id = cts_stmt_get_int(stmt, cnt++); - result->num_type = cts_stmt_get_int(stmt, cnt++); - break; - case CTS_ITER_PLOGS_OF_NUMBER: - result->id = cts_stmt_get_int(stmt, cnt++); - result->log_type = cts_stmt_get_int(stmt, cnt++); - result->log_time = cts_stmt_get_int(stmt, cnt++); - result->extra_data1 = cts_stmt_get_int(stmt, cnt++); - temp = cts_stmt_get_text(stmt, cnt++); - result->extra_data2 = SAFE_STRDUP(temp); - result->related_id = cts_stmt_get_int(stmt, cnt++); - break; - default: - ERR("Invalid parameter : The type(%d) is unknown type", type); - contacts_svc_value_free((CTSvalue*)result); - return NULL; - } - return (CTSvalue *)result; -} - -static inline CTSvalue* cts_iter_get_info_custom_num_type(cts_stmt stmt) -{ - numtype_list *result; - - result = (numtype_list *)contacts_svc_value_new(CTS_VALUE_LIST_CUSTOM_NUM_TYPE); - retvm_if(NULL == result, NULL, "contacts_svc_value_new() Failed"); - - result->id = cts_stmt_get_int(stmt, 0); - result->name = SAFE_STRDUP(cts_stmt_get_text(stmt, 1)); - - return (CTSvalue *)result; -} - -static inline CTSvalue* cts_iter_get_info_addrbook(cts_stmt stmt) -{ - cts_addrbook *result; - - result = (cts_addrbook *)contacts_svc_value_new(CTS_VALUE_LIST_ADDRBOOK); - retvm_if(NULL == result, NULL, "contacts_svc_value_new() Failed"); - - cts_stmt_get_addressbook(stmt, result); - - return (CTSvalue *)result; -} - -static inline CTSvalue* cts_iter_get_info_group(cts_stmt stmt) -{ - cts_group *result; - - result = (cts_group *)contacts_svc_value_new(CTS_VALUE_LIST_GROUP); - retvm_if(NULL == result, NULL, "contacts_svc_value_new() Failed"); - - result->id = cts_stmt_get_int(stmt, 0); - result->addrbook_id = cts_stmt_get_int(stmt, 1); - result->name = SAFE_STRDUP(cts_stmt_get_text(stmt, 2)); - - return (CTSvalue *)result; -} - -static inline CTSvalue* cts_iter_get_info_shortcut(int type, cts_stmt stmt) -{ - int i, lang; - char *temp; - shortcut_list *result; - - result = (shortcut_list *)contacts_svc_value_new(CTS_VALUE_LIST_SHORTCUT); - retvm_if(NULL == result, NULL, "contacts_svc_value_new() Failed"); - - i = 0; - result->contact_id = cts_stmt_get_int(stmt, i++); - lang = cts_stmt_get_int(stmt, i++); - temp = cts_stmt_get_text(stmt, i++); - result->first = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, i++); - result->last = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, i++); - result->display = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, i++); - result->img_path = SAFE_STRDUP(temp); - result->id = cts_stmt_get_int(stmt, i++); - if (CTS_LANG_DEFAULT == lang) - lang = cts_get_default_language(); - - if (NULL == result->display && result->first && result->last - && CTS_LANG_ENGLISH == lang) { - char display[CTS_SQL_MAX_LEN]; - if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - snprintf(display, sizeof(display), "%s %s", result->first, result->last); - else - snprintf(display, sizeof(display), "%s, %s", result->last, result->first); - - result->display = strdup(display); - } - - if (CTS_ITER_ALL_CONTACT_FAVORITE != type) { - result->num_type = cts_stmt_get_int(stmt, i++); - temp = cts_stmt_get_text(stmt, i++); - result->number = SAFE_STRDUP(temp); - - if (CTS_ITER_ALL_SPEEDDIAL == type) - result->speeddial = cts_stmt_get_int(stmt, i++); - } - - return (CTSvalue *)result; -} - -API CTSvalue* contacts_svc_iter_get_info(CTSiter *iter) -{ - CTSvalue *result; - - retvm_if(NULL == iter, NULL, "iter is NULL"); - - switch (iter->i_type) - { - case CTS_ITER_CONTACTS: - case CTS_ITER_CONTACTS_WITH_NAME: - result = cts_iter_get_info_contact(iter->stmt, iter->i_type); - retvm_if(NULL == result, NULL, "cts_iter_get_info_contact() Failed"); - break; - case CTS_ITER_NUMBERINFOS: - case CTS_ITER_EMAILINFOS_WITH_EMAIL: - case CTS_ITER_NUMBERS_EMAILS: - result = cts_iter_get_info_number_email(iter->stmt, iter->i_type); - retvm_if(NULL == result, NULL, "cts_iter_get_info_number() Failed"); - break; - case CTS_ITER_ALL_SDN: - result = cts_iter_get_info_sdn(iter->stmt, iter->i_type); - retvm_if(NULL == result, NULL, "cts_iter_get_info_number() Failed"); - break; - case CTS_ITER_UPDATED_CONTACTS_AFTER_VER: - result = cts_iter_get_info_change(iter->info->cursor); - retvm_if(NULL == result, NULL, "cts_iter_get_info_change() Failed"); - break; - case CTS_ITER_GROUPING_PLOG: - case CTS_ITER_PLOGS_OF_NUMBER: - result = cts_iter_get_info_plog(iter->i_type, iter->stmt); - retvm_if(NULL == result, NULL, "cts_iter_get_info_plog() Failed"); - break; - case CTS_ITER_ALL_CUSTOM_NUM_TYPE: - result = cts_iter_get_info_custom_num_type(iter->stmt); - retvm_if(NULL == result, NULL, "cts_iter_get_info_custom_num_type() Failed"); - break; - case CTS_ITER_ADDRESSBOOKS: - result = cts_iter_get_info_addrbook(iter->stmt); - retvm_if(NULL == result, NULL, "cts_iter_get_info_addrbook() Failed"); - break; - case CTS_ITER_GROUPS: - result = cts_iter_get_info_group(iter->stmt); - retvm_if(NULL == result, NULL, "cts_iter_get_info_group() Failed"); - break; - case CTS_ITER_ALL_NUM_FAVORITE: - case CTS_ITER_ALL_CONTACT_FAVORITE: - case CTS_ITER_ALL_SPEEDDIAL: - result = cts_iter_get_info_shortcut(iter->i_type, iter->stmt); - retvm_if(NULL == result, NULL, "cts_iter_get_info_shortcut() Failed"); - break; - case CTS_ITER_PLOGNUMBERS_WITH_NUM: - result = (CTSvalue*)(SAFE_STRDUP(cts_stmt_get_text(iter->stmt, 0))); - break; - default: - ERR("Invalid parameter : The iter(%d) has unknown type", iter->i_type); - return NULL; - } - - return result; -} - diff --git a/src/cts-list.c b/src/cts-list.c deleted file mode 100755 index cb289b0..0000000 --- a/src/cts-list.c +++ /dev/null @@ -1,1447 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include "cts-internal.h" -#include "cts-schema.h" -#include "cts-utils.h" -#include "cts-types.h" -#include "cts-normalize.h" -#include "cts-favorite.h" -#include "cts-list.h" - -#define CTS_MALLOC_DEFAULT_NUM 256 //4Kbytes -#define CTS_OFTEN_USED_NUM 1 - -static inline updated_contact* cts_updated_contact_add_mempool(void) -{ - int i; - updated_contact *mempool; - - mempool = calloc(CTS_MALLOC_DEFAULT_NUM, sizeof(updated_contact)); - for (i=0;ii_type <= CTS_ITER_NONE || CTS_ITER_MAX <= iter->i_type, - CTS_ERR_ARG_INVALID, "iter is Invalid(type=%d", iter->i_type); - - if (CTS_ITER_UPDATED_CONTACTS_AFTER_VER == iter->i_type) - { - retv_if(NULL == iter->info, CTS_ERR_ARG_INVALID); - - if (NULL == iter->info->cursor) - iter->info->cursor = iter->info->head; - else - iter->info->cursor = iter->info->cursor->next; - if (NULL == iter->info->cursor || 0 == iter->info->cursor->id) { - iter->info->cursor = NULL; - cts_updated_contact_free_mempool(iter->info->head); - iter->info->head = NULL; - return CTS_ERR_FINISH_ITER; - } - } - else - { - ret = cts_stmt_step(iter->stmt); - if (CTS_TRUE != ret) - { - if (CTS_SUCCESS != ret) - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(iter->stmt); - iter->stmt = NULL; - return CTS_ERR_FINISH_ITER; - } - } - return CTS_SUCCESS; -} - -API int contacts_svc_iter_remove(CTSiter *iter) -{ - retv_if(NULL == iter, CTS_ERR_ARG_NULL); - retvm_if(iter->i_type <= CTS_ITER_NONE || CTS_ITER_MAX <= iter->i_type, - CTS_ERR_ARG_INVALID, "iter is Invalid(type=%d", iter->i_type); - - if (CTS_ITER_UPDATED_CONTACTS_AFTER_VER == iter->i_type) { - retv_if(NULL == iter->info, CTS_ERR_ARG_INVALID); - if (iter->info->head) - cts_updated_contact_free_mempool(iter->info->head); - free(iter->info); - } - else { - cts_stmt_finalize(iter->stmt); - } - - free(iter); - return CTS_SUCCESS; -} - -static inline int cts_get_list(cts_get_list_op op_code, CTSiter *iter) -{ - cts_stmt stmt = NULL; - char query[CTS_SQL_MAX_LEN] = {0}; - const char *display; - - retv_if(NULL == iter, CTS_ERR_ARG_NULL); - - iter->i_type = CTS_ITER_NONE; - iter->stmt = NULL; - - switch (op_code) - { - case CTS_LIST_ALL_CONTACT: - iter->i_type = CTS_ITER_CONTACTS; - - if (CTS_ORDER_NAME_LASTFIRST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - display = CTS_SCHEMA_DATA_NAME_REVERSE_LOOKUP; - else - display = CTS_SCHEMA_DATA_NAME_LOOKUP; - - snprintf(query, sizeof(query), - "SELECT A.contact_id, data1, data2, data3, data5, B.addrbook_id, B.image0, %s " - "FROM %s A, %s B ON A.contact_id = B.contact_id " - "WHERE A.datatype = %d " - "ORDER BY A.data1, A.%s", - display, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_ALL_ADDRESSBOOK: - iter->i_type = CTS_ITER_ADDRESSBOOKS; - snprintf(query, sizeof(query), - "SELECT addrbook_id, addrbook_name, acc_id, acc_type, mode " - "FROM %s ORDER BY acc_id, addrbook_id", - CTS_TABLE_ADDRESSBOOKS); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_ALL_GROUP: - iter->i_type = CTS_ITER_GROUPS; - snprintf(query, sizeof(query), "SELECT group_id, addrbook_id, group_name " - "FROM %s ORDER BY addrbook_id, group_name COLLATE NOCASE", - CTS_TABLE_GROUPS); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_ALL_CUSTOM_NUM_TYPE: - iter->i_type = CTS_ITER_ALL_CUSTOM_NUM_TYPE; - snprintf(query, sizeof(query), "SELECT id, name FROM %s WHERE class = %d", - CTS_TABLE_CUSTOM_TYPES, CTS_TYPE_CLASS_NUM); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_GROUPING_PLOG: - iter->i_type = CTS_ITER_GROUPING_PLOG; - snprintf(query, sizeof(query), - "SELECT C.id, F.data1, F.data2, F.data3, F.data5, F.image0, C.number, " - "C.log_type, C.log_time, C.data1, C.data2, C.contact_id, C.number_type " - "FROM " - "(SELECT A.id, A.number, A.log_type, A.log_time, A.data1, A.data2, " - "MIN(B.contact_id) contact_id, B.data1 number_type " - "FROM %s A LEFT JOIN %s B ON B.datatype = %d AND A.normal_num = B.data3 AND " - "(A.related_id = B.contact_id OR A.related_id IS NULL OR " - "NOT EXISTS (SELECT id FROM %s " - "WHERE datatype = %d AND contact_id = A.related_id " - "AND A.normal_num = data3)) " - "GROUP BY A.id) C " - "LEFT JOIN (SELECT D.contact_id, data1, data2, data3, data5, image0 " - "FROM %s D, %s E ON D.datatype = %d AND D.contact_id = E.contact_id) F " - "ON C.contact_id = F.contact_id " - "GROUP BY F.data2, F.data3, F.data5, C.number " - "ORDER BY C.log_time DESC", - CTS_TABLE_PHONELOGS, CTS_TABLE_DATA, CTS_DATA_NUMBER, CTS_TABLE_DATA, - CTS_DATA_NUMBER, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, CTS_DATA_NAME); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_GROUPING_MSG_PLOG: - iter->i_type = CTS_ITER_GROUPING_PLOG; - snprintf(query, sizeof(query), - "SELECT C.id, F.data1, F.data2, F.data3, F.data5, F.image0, C.number, " - "C.log_type, C.log_time, C.data1, C.data2, C.contact_id, C.number_type " - "FROM " - "(SELECT A.id, A.number, A.log_type, A.log_time, A.data1, A.data2, " - "MIN(B.contact_id) contact_id, B.data1 number_type " - "FROM %s A LEFT JOIN %s B ON B.datatype = %d AND A.normal_num = B.data3 AND " - "(A.related_id = B.contact_id OR A.related_id IS NULL OR " - "NOT EXISTS (SELECT id FROM %s WHERE datatype = %d AND contact_id = A.related_id " - "AND A.normal_num = data3)) " - "WHERE A.log_type >= %d " - "GROUP BY A.id) C " - "LEFT JOIN (SELECT D.contact_id, data1, data2, data3, data5, image0 " - "FROM %s D, %s E ON D.datatype = %d AND D.contact_id = E.contact_id) F " - "ON C.contact_id = F.contact_id " - "GROUP BY F.data2, F.data3, F.data5, C.number " - "ORDER BY C.log_time DESC", - CTS_TABLE_PHONELOGS, CTS_TABLE_DATA, CTS_DATA_NUMBER, CTS_TABLE_DATA, CTS_DATA_NUMBER, - CTS_PLOG_TYPE_MMS_INCOMMING, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, CTS_DATA_NAME); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_GROUPING_CALL_PLOG: - iter->i_type = CTS_ITER_GROUPING_PLOG; - snprintf(query, sizeof(query), - "SELECT C.id, F.data1, F.data2, F.data3, F.data5, F.image0, C.number, " - "C.log_type, C.log_time, C.data1, C.data2, C.contact_id, C.number_type " - "FROM " - "(SELECT A.id, A.number, A.log_type, A.log_time, A.data1, A.data2, " - "MIN(B.contact_id) contact_id, B.data1 number_type " - "FROM %s A LEFT JOIN %s B ON B.datatype = %d AND A.normal_num = B.data3 AND " - "(A.related_id = B.contact_id OR A.related_id IS NULL OR " - "NOT EXISTS (SELECT id FROM %s WHERE datatype = %d AND contact_id = A.related_id " - "AND A.normal_num = data3)) " - "WHERE A.log_type < %d " - "GROUP BY A.id) C " - "LEFT JOIN (SELECT D.contact_id, data1, data2, data3, data5, image0 " - "FROM %s D, %s E ON D.datatype = %d AND D.contact_id = E.contact_id) F " - "ON C.contact_id = F.contact_id " - "GROUP BY F.data2, F.data3, F.data5, C.number " - "ORDER BY C.log_time DESC", - CTS_TABLE_PHONELOGS, CTS_TABLE_DATA, CTS_DATA_NUMBER, CTS_TABLE_DATA, CTS_DATA_NUMBER, - CTS_PLOG_TYPE_MMS_INCOMMING, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, CTS_DATA_NAME); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_ALL_PLOG: - iter->i_type = CTS_ITER_GROUPING_PLOG; - snprintf(query, sizeof(query), - "SELECT C.id, F.data1, F.data2, F.data3, F.data5, F.image0, C.number, " - "C.log_type, C.log_time, C.data1, C.data2, C.contact_id, C.number_type " - "FROM " - "(SELECT A.id, A.number, A.log_type, A.log_time, A.data1, A.data2, " - "MIN(B.contact_id) contact_id, B.data1 number_type " - "FROM %s A LEFT JOIN %s B ON B.datatype = %d AND A.normal_num = B.data3 AND " - "(A.related_id = B.contact_id OR A.related_id IS NULL OR " - "NOT EXISTS (SELECT id FROM %s " - "WHERE datatype = %d AND contact_id = A.related_id " - "AND A.normal_num = data3)) " - "GROUP BY A.id) C " - "LEFT JOIN (SELECT D.contact_id, data1, data2, data3, data5, image0 " - "FROM %s D, %s E ON D.datatype = %d AND D.contact_id = E.contact_id) F " - "ON C.contact_id = F.contact_id " - "ORDER BY C.log_time DESC", - CTS_TABLE_PHONELOGS, CTS_TABLE_DATA, CTS_DATA_NUMBER, CTS_TABLE_DATA, - CTS_DATA_NUMBER, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, CTS_DATA_NAME); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_ALL_MISSED_CALL: - iter->i_type = CTS_ITER_GROUPING_PLOG; - snprintf(query, sizeof(query), - "SELECT C.id, F.data1, F.data2, F.data3, F.data5, F.image0, C.number, " - "C.log_type, C.log_time, C.data1, C.data2, C.contact_id, C.number_type " - "FROM " - "(SELECT A.id, A.number, A.log_type, A.log_time, A.data1, A.data2, " - "MIN(B.contact_id) contact_id, B.data1 number_type " - "FROM %s A LEFT JOIN %s B ON B.datatype = %d AND A.normal_num = B.data3 AND " - "(A.related_id = B.contact_id OR A.related_id IS NULL OR " - "NOT EXISTS (SELECT id FROM %s " - "WHERE datatype = %d AND contact_id = A.related_id " - "AND A.normal_num = data3)) " - "WHERE (A.log_type = %d OR A.log_type = %d) " - "GROUP BY A.id) C " - "LEFT JOIN (SELECT D.contact_id, data1, data2, data3, data5, image0 " - "FROM %s D, %s E ON D.datatype = %d AND D.contact_id = E.contact_id) F " - "ON C.contact_id = F.contact_id " - "ORDER BY C.log_time DESC", - CTS_TABLE_PHONELOGS, CTS_TABLE_DATA, CTS_DATA_NUMBER, CTS_TABLE_DATA, CTS_DATA_NUMBER, - CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN, CTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN, - CTS_TABLE_DATA, CTS_TABLE_CONTACTS, CTS_DATA_NAME); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_ALL_NUMBER_FAVORITE: - iter->i_type = CTS_ITER_ALL_NUM_FAVORITE; - snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, D.image0, " - "B.id, B.data1, B.data2 " - "FROM %s A, %s B, %s C, %s D " - "ON A.contact_id = B.contact_id AND B.id = C.related_id AND A.contact_id = D.contact_id " - "WHERE A.datatype = %d AND B.datatype = %d AND C.type = %d " - "ORDER BY C.favorite_prio", - CTS_TABLE_DATA, CTS_TABLE_DATA, CTS_TABLE_FAVORITES, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_DATA_NUMBER, CTS_FAVOR_NUMBER); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_ALL_CONTACT_FAVORITE: - iter->i_type = CTS_ITER_ALL_CONTACT_FAVORITE; - snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, C.image0, B.id " - "FROM %s A, %s B, %s C " - "ON A.contact_id = B.related_id AND A.contact_id = C.contact_id " - "WHERE A.datatype = %d AND B.type = %d " - "ORDER BY B.favorite_prio", - CTS_TABLE_DATA, CTS_TABLE_FAVORITES, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_FAVOR_CONTACT); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_ALL_SPEEDDIAL: - iter->i_type = CTS_ITER_ALL_SPEEDDIAL; - snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, D.image0, " - "B.id, B.data1, B.data2, C.speed_num " - "FROM %s A, %s B, %s C, %s D " - "WHERE A.datatype = %d AND B.datatype = %d AND B.id = C.number_id " - "AND A.contact_id = B.contact_id AND A.contact_id = D.contact_id " - "ORDER BY C.speed_num", - CTS_TABLE_DATA, CTS_TABLE_DATA, CTS_TABLE_SPEEDDIALS, - CTS_TABLE_CONTACTS, CTS_DATA_NAME, CTS_DATA_NUMBER); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_ALL_SDN: - iter->i_type = CTS_ITER_ALL_SDN; - snprintf(query, sizeof(query),"SELECT name, number FROM %s", - CTS_TABLE_SIM_SERVICES); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_ALL_CONTACT_HAD_NUMBER: - iter->i_type = CTS_ITER_CONTACTS; - - if (CTS_ORDER_NAME_LASTFIRST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - display = CTS_SCHEMA_DATA_NAME_REVERSE_LOOKUP; - else - display = CTS_SCHEMA_DATA_NAME_LOOKUP; - - snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, B.addrbook_id, B.image0, A.%s " - "FROM %s A, %s B ON A.contact_id = B.contact_id " - "WHERE A.datatype = %d AND B.default_num > 0 " - "ORDER BY A.data1, A.%s", - display, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, CTS_DATA_NAME, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_ALL_CONTACT_HAD_EMAIL: - iter->i_type = CTS_ITER_CONTACTS; - if (CTS_ORDER_NAME_LASTFIRST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - display = CTS_SCHEMA_DATA_NAME_REVERSE_LOOKUP; - else - display = CTS_SCHEMA_DATA_NAME_LOOKUP; - - snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, B.addrbook_id, B.image0, A.%s " - "FROM %s A, %s B ON A.contact_id = B.contact_id " - "WHERE A.datatype = %d AND B.default_email > 0 " - "ORDER BY A.data1, A.%s", - display, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, CTS_DATA_NAME, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_ALL_EMAIL_NUMBER: - iter->i_type = CTS_ITER_NUMBERS_EMAILS; - - if (CTS_ORDER_NAME_LASTFIRST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - display = CTS_SCHEMA_DATA_NAME_REVERSE_LOOKUP; - else - display = CTS_SCHEMA_DATA_NAME_LOOKUP; - - snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, B.data2, C.image0, C.addrbook_id, A.%s " - "FROM %s A, %s B, %s C " - "ON A.contact_id = B.contact_id AND A.contact_id = C.contact_id " - "WHERE A.datatype = %d AND (B.datatype = %d OR B.datatype = %d) " - "ORDER BY A.data1, A.%s", - display, CTS_TABLE_DATA, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_DATA_NUMBER, CTS_DATA_EMAIL, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_OFTEN_USED_CONTACT: - iter->i_type = CTS_ITER_CONTACTS; - - if (CTS_ORDER_NAME_LASTFIRST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - display = CTS_SCHEMA_DATA_NAME_REVERSE_LOOKUP; - else - display = CTS_SCHEMA_DATA_NAME_LOOKUP; - - snprintf(query, sizeof(query), - "SELECT A.contact_id, data1, data2, data3, data5, A.addrbook_id, A.image0, %s " - "FROM %s A, %s B " - "WHERE A.outgoing_count > %d AND B.datatype = %d " - "AND B.contact_id = A.contact_id " - "ORDER BY A.outgoing_count DESC, data1, %s", - display, CTS_TABLE_CONTACTS, CTS_TABLE_DATA, - CTS_OFTEN_USED_NUM, CTS_DATA_NAME, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_ALL_NUMBER: - iter->i_type = CTS_ITER_NUMBERS_EMAILS; - - if (CTS_ORDER_NAME_LASTFIRST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - display = CTS_SCHEMA_DATA_NAME_REVERSE_LOOKUP; - else - display = CTS_SCHEMA_DATA_NAME_LOOKUP; - - snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, B.data2, C.image0, C.addrbook_id, A.%s " - "FROM %s A, %s B, %s C " - "ON A.contact_id = B.contact_id AND A.contact_id = C.contact_id " - "WHERE A.datatype = %d AND (B.datatype = %d) " - "ORDER BY A.data1, A.%s", - display, CTS_TABLE_DATA, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_DATA_NUMBER, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - default: - ERR("Invalid parameter : The op_code(%d) is not supported", op_code); - return CTS_ERR_ARG_INVALID; - } - - return CTS_SUCCESS; -} - -API int contacts_svc_get_list(cts_get_list_op op_code, CTSiter **iter) -{ - int ret; - CTSiter *result; - - retv_if(NULL == iter, CTS_ERR_ARG_NULL); - - result = calloc(1, sizeof(CTSiter)); - retvm_if(NULL == result, CTS_ERR_OUT_OF_MEMORY, "calloc() Failed"); - - ret = cts_get_list(op_code, result); - if (ret) { - ERR("cts_get_list() Failed(%d)", ret); - free(result); - return ret; - } - - *iter = (CTSiter *)result; - return CTS_SUCCESS; -} - -static inline int cts_get_list_with_str(cts_get_list_str_op op_code, - const char *search_value, CTSiter *iter) -{ - int ret; - cts_stmt stmt = NULL; - char query[CTS_SQL_MAX_LEN] = {0}; - const char *display; - char remake_val[CTS_SQL_MIN_LEN]; - - CTS_START_TIME_CHECK; - - retv_if(NULL == iter, CTS_ERR_ARG_NULL); - - iter->i_type = CTS_ITER_NONE; - iter->stmt = NULL; - - retvm_if(NULL == search_value && CTS_LIST_PLOGS_OF_NUMBER != op_code, - CTS_ERR_ARG_NULL, "The search_value is NULL"); - - switch ((int)op_code) - { - case CTS_LIST_PLOGS_OF_NUMBER: - iter->i_type = CTS_ITER_PLOGS_OF_NUMBER; - if (search_value && *search_value) { - snprintf(query, sizeof(query), - "SELECT A.id, A.log_type, A.log_time, A.data1, A.data2, MIN(B.contact_id) " - "FROM %s A LEFT JOIN %s B ON A.normal_num = B.data3 AND B.datatype = %d AND " - "(A.related_id = B.contact_id OR A.related_id IS NULL OR " - "NOT EXISTS (SELECT id FROM %s " - "WHERE datatype = %d AND contact_id = A.related_id AND data3 = ?)) " - "WHERE A.number = ? " - "GROUP BY A.id " - "ORDER BY A.log_time DESC", - CTS_TABLE_PHONELOGS, CTS_TABLE_DATA, CTS_DATA_NUMBER, CTS_TABLE_DATA, CTS_DATA_NUMBER); - } - else { - snprintf(query, sizeof(query), - "SELECT id, log_type, log_time, data1, data2, NULL " - "FROM %s WHERE number ISNULL ORDER BY id DESC", CTS_TABLE_PHONELOGS); - } - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - if (search_value) { - const char *normal_num; - ret = cts_clean_number(search_value, remake_val, sizeof(remake_val)); - retvm_if(ret <= 0, CTS_ERR_ARG_INVALID, "Number(%s) is invalid", search_value); - - normal_num = cts_normalize_number(remake_val); - cts_stmt_bind_copy_text(stmt, 1, normal_num, strlen(normal_num)); - cts_stmt_bind_copy_text(stmt, 2, remake_val, strlen(remake_val)); - } - iter->stmt = stmt; - break; - case CTS_LIST_CONTACTS_WITH_NAME: - retvm_if(CTS_SQL_MIN_LEN <= strlen(search_value), CTS_ERR_ARG_INVALID, - "search_value is too long"); - iter->i_type = CTS_ITER_CONTACTS_WITH_NAME; - memset(remake_val, 0x00, sizeof(remake_val)); - - ret = cts_normalize_str(search_value, remake_val, CTS_SQL_MIN_LEN); - retvm_if(ret < CTS_SUCCESS, ret, "cts_normalize_str() Failed(%d)", ret); - - if (CTS_ORDER_NAME_LASTFIRST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - display = CTS_SCHEMA_DATA_NAME_REVERSE_LOOKUP; - else - display = CTS_SCHEMA_DATA_NAME_LOOKUP; - - snprintf(query, sizeof(query), - "SELECT A.contact_id, data1, data2, data3, data5, B.addrbook_id, B.image0 " - "FROM %s A, %s B ON A.contact_id = B.contact_id " - "WHERE datatype = %d AND %s LIKE ('%%' || ? || '%%') " - "ORDER BY data1, %s", - CTS_TABLE_DATA, CTS_TABLE_CONTACTS, CTS_DATA_NAME, display, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - cts_stmt_bind_copy_text(stmt, 1, remake_val, strlen(remake_val)); - iter->stmt = stmt; - break; - case CTS_LIST_NUMBERINFOS_WITH_NAME: - retvm_if(CTS_SQL_MIN_LEN <= strlen(search_value), CTS_ERR_ARG_INVALID, - "search_value is too long"); - iter->i_type = CTS_ITER_NUMBERINFOS; - memset(remake_val, 0x00, sizeof(remake_val)); - - ret = cts_normalize_str(search_value, remake_val, CTS_SQL_MIN_LEN); - retvm_if(ret < CTS_SUCCESS, ret, "cts_normalize_str() Failed(%d)", ret); - - if (CTS_ORDER_NAME_LASTFIRST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - display = CTS_SCHEMA_DATA_NAME_REVERSE_LOOKUP; - else - display = CTS_SCHEMA_DATA_NAME_LOOKUP; - - snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, B.data2, C.image0 " - "FROM %s A, %s B, %s C " - "ON A.contact_id = B.contact_id AND A.contact_id = C.contact_id " - "WHERE A.datatype = %d AND B.datatype = %d AND A.%s LIKE ('%%' || ? || '%%') " - "ORDER BY A.data1, A.%s", - CTS_TABLE_DATA, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_DATA_NUMBER, display, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - cts_stmt_bind_copy_text(stmt, 1, remake_val, strlen(remake_val)); - iter->stmt = stmt; - break; - case CTS_LIST_NUMBERINFOS_WITH_NUM: - iter->i_type = CTS_ITER_NUMBERINFOS; - - snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, B.data2, C.image0 " - "FROM %s A, %s B, %s C " - "ON A.contact_id = B.contact_id AND A.contact_id = C.contact_id " - "WHERE A.datatype = %d AND B.datatype = %d AND B.data2 LIKE ('%%' || ? || '%%') " - "ORDER BY A.data1, A.%s", - CTS_TABLE_DATA, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_DATA_NUMBER, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - cts_stmt_bind_copy_text(stmt, 1, search_value, strlen(search_value)); - iter->stmt = stmt; - break; - case CTS_LIST_EMAILINFOS_WITH_EMAIL: - iter->i_type = CTS_ITER_EMAILINFOS_WITH_EMAIL; - snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, B.data2, C.image0 " - "FROM %s A, %s B, %s C " - "ON A.contact_id = B.contact_id AND A.contact_id = C.contact_id " - "WHERE A.datatype = %d AND B.datatype = %d AND B.data2 LIKE ('%%' || ? || '%%') " - "ORDER BY A.data1, A.%s", - CTS_TABLE_DATA, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_DATA_EMAIL, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - cts_stmt_bind_copy_text(stmt, 1, search_value, strlen(search_value)); - iter->stmt = stmt; - break; - case 10000: /* It is not supported. use only inhouse phone and message application */ - retvm_if(CTS_SQL_MIN_LEN - 50 < strlen(search_value), - CTS_ERR_ARG_INVALID, "search_value is too long"); - iter->i_type = CTS_ITER_PLOGNUMBERS_WITH_NUM; - snprintf(query, sizeof(query), - "SELECT number FROM %s WHERE number LIKE '%%%s%%' GROUP BY number", - CTS_TABLE_PHONELOGS, search_value); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - default: - ERR("Invalid parameter : The op_code(%d) is not supported", op_code); - return CTS_ERR_ARG_INVALID; - } - CTS_START_TIME_CHECK; - - return CTS_SUCCESS; -} - -API int contacts_svc_get_list_with_str(cts_get_list_str_op op_code, - const char *search_value, CTSiter **iter) -{ - int ret; - CTSiter *result; - - retv_if(NULL == iter, CTS_ERR_ARG_NULL); - - result = calloc(1, sizeof(CTSiter)); - retvm_if(NULL == result, CTS_ERR_OUT_OF_MEMORY, "calloc() Failed"); - - ret = cts_get_list_with_str(op_code, search_value, result); - if (ret) { - ERR("cts_get_list_with_str() Failed(%d)", ret); - free(result); - return ret; - } - - *iter = (CTSiter *)result; - return CTS_SUCCESS; -} - -static inline int cts_get_list_with_int(cts_get_list_int_op op_code, - unsigned int search_value, CTSiter *iter) -{ - cts_stmt stmt = NULL; - char query[CTS_SQL_MAX_LEN] = {0}; - const char *display; - - retv_if(NULL == iter, CTS_ERR_ARG_NULL); - iter->i_type = CTS_ITER_NONE; - iter->stmt = NULL; - - if (CTS_ORDER_NAME_LASTFIRST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - display = CTS_SCHEMA_DATA_NAME_REVERSE_LOOKUP; - else - display = CTS_SCHEMA_DATA_NAME_LOOKUP; - - switch (op_code) - { - case CTS_LIST_MEMBERS_OF_GROUP_ID: - iter->i_type = CTS_ITER_CONTACTS; - snprintf(query, sizeof(query), - "SELECT A.contact_id, data1, data2, data3, data5, B.addrbook_id, B.image0, %s " - "FROM %s A, %s B WHERE datatype = %d AND A.contact_id IN " - "(SELECT contact_id FROM %s WHERE group_id = %d) " - "AND A.contact_id = B.contact_id " - "ORDER BY data1, %s", - display, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, CTS_DATA_NAME, - CTS_TABLE_GROUPING_INFO, search_value, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_NO_GROUP_MEMBERS_OF_ADDRESSBOOK_ID: - iter->i_type = CTS_ITER_CONTACTS; - snprintf(query, sizeof(query), - "SELECT A.contact_id, data1, data2, data3, data5, A.addrbook_id, A.image0, %s " - "FROM %s A, %s B ON A.contact_id = B.contact_id " - "WHERE A.addrbook_id = %d AND NOT EXISTS " - "(SELECT contact_id FROM %s WHERE contact_id=A.contact_id LIMIT 1) " - "AND datatype = %d " - "ORDER BY data1, %s", - display, CTS_TABLE_CONTACTS, CTS_TABLE_DATA, - search_value, CTS_TABLE_GROUPING_INFO, CTS_DATA_NAME, - CTS_SCHEMA_DATA_NAME_SORTING_KEY); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_MEMBERS_OF_ADDRESSBOOK_ID: - iter->i_type = CTS_ITER_CONTACTS; - snprintf(query, sizeof(query), - "SELECT A.contact_id, data1, data2, data3, data5, B.addrbook_id, B.image0, %s " - "FROM %s A, %s B ON A.contact_id = B.contact_id " - "WHERE datatype = %d AND B.addrbook_id = %d " - "ORDER BY data1, %s", - display, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, CTS_DATA_NAME, search_value, - CTS_SCHEMA_DATA_NAME_SORTING_KEY); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_GROUPS_OF_ADDRESSBOOK_ID: - iter->i_type = CTS_ITER_GROUPS; - snprintf(query, sizeof(query), - "SELECT group_id, %d, group_name " - "FROM %s WHERE addrbook_id = %d " - "ORDER BY group_name COLLATE NOCASE", - search_value, CTS_TABLE_GROUPS, search_value); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - case CTS_LIST_ADDRESSBOOKS_OF_ACCOUNT_ID: - iter->i_type = CTS_ITER_ADDRESSBOOKS; - snprintf(query, sizeof(query), - "SELECT addrbook_id, addrbook_name, acc_id, acc_type, mode " - "FROM %s WHERE acc_id = %d " - "ORDER BY acc_id, addrbook_id", - CTS_TABLE_ADDRESSBOOKS, search_value); - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - iter->stmt = stmt; - break; - default: - ERR("Invalid parameter : The op_code(%d) is not supported", op_code); - return CTS_ERR_ARG_INVALID; - } - - return CTS_SUCCESS; -} - -API int contacts_svc_get_list_with_int(cts_get_list_int_op op_code, - unsigned int search_value, CTSiter **iter) -{ - int ret; - CTSiter *result; - - retv_if(NULL == iter, CTS_ERR_ARG_NULL); - - result = calloc(1, sizeof(CTSiter)); - retvm_if(NULL == result, CTS_ERR_OUT_OF_MEMORY, "calloc() Failed"); - - ret = cts_get_list_with_int(op_code, search_value, result); - if (ret) { - ERR("cts_get_list_with_int() Failed(%d)", ret); - free(result); - return ret; - } - - *iter = (CTSiter *)result; - return CTS_SUCCESS; -} - -static inline int cts_get_updated_contacts(int addressbook_id, int version, - CTSiter *iter) -{ - int ret; - cts_stmt stmt = NULL; - char query[CTS_SQL_MAX_LEN] = {0}; - updated_contact *result; - - retv_if(NULL == iter, CTS_ERR_ARG_NULL); - retv_if(NULL == iter->info, CTS_ERR_ARG_INVALID); - - iter->i_type = CTS_ITER_UPDATED_CONTACTS_AFTER_VER; - snprintf(query, sizeof(query), - "SELECT %d, contact_id, changed_ver, created_ver FROM %s " - "WHERE changed_ver > %d AND addrbook_id = %d " - "UNION " - "SELECT %d, contact_id, deleted_ver, -1 FROM %s " - "WHERE deleted_ver > %d AND addrbook_id = %d", - CTS_OPERATION_UPDATED, CTS_TABLE_CONTACTS, version, addressbook_id, - CTS_OPERATION_DELETED, CTS_TABLE_DELETEDS, version, addressbook_id); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = cts_stmt_step(stmt); - if (CTS_TRUE != ret) - { - warn_if(CTS_SUCCESS != ret, "cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return CTS_ERR_DB_RECORD_NOT_FOUND; - } - - iter->info->head = result = cts_updated_contact_add_mempool(); - do { - result->type = cts_stmt_get_int(stmt, 0); - result->id = cts_stmt_get_int(stmt, 1); - result->ver = cts_stmt_get_int(stmt, 2); - if (cts_stmt_get_int(stmt, 3) == result->ver || version < cts_stmt_get_int(stmt, 3)) - result->type = CTS_OPERATION_INSERTED; - if (NULL == result->next) - result->next = cts_updated_contact_add_mempool(); - result = result->next; - }while(CTS_TRUE == cts_stmt_step(stmt)); - - cts_stmt_finalize(stmt); - - return CTS_SUCCESS; -} - -API int contacts_svc_get_updated_contacts(int addressbook_id, - int version, CTSiter **iter) -{ - int ret; - CTSiter *result; - - retv_if(NULL == iter, CTS_ERR_ARG_NULL); - retvm_if(version < 0, CTS_ERR_ARG_INVALID, "The version(%d) is invalid", version); - - result = calloc(1, sizeof(CTSiter)); - retvm_if(NULL == result, CTS_ERR_OUT_OF_MEMORY, "calloc() Failed"); - - result->info = calloc(1, sizeof(updated_contact_info)); - if (NULL == result->info) { - ERR("calloc() Failed"); - free(result); - return CTS_ERR_OUT_OF_MEMORY; - } - - ret = cts_get_updated_contacts(addressbook_id, version, result); - if (ret) { - ERR("cts_get_updated_contacts() Failed(%d)", ret); - free(result->info); - free(result); - return ret; - } - - *iter = (CTSiter *)result; - return CTS_SUCCESS; -} - -static inline void cts_foreach_run(CTSiter *iter, cts_foreach_fn cb, void *data) -{ - while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { - int ret; - CTSvalue *value; - value = contacts_svc_iter_get_info(iter); - - ret = cb(value, data); - if (CTS_SUCCESS != ret) { - ERR("cts_foreach_fn(%p) Failed(%d)", cb, ret); - contacts_svc_value_free(value); - break; - } - - contacts_svc_value_free(value); - } - cts_stmt_finalize(iter->stmt); -} - -API int contacts_svc_list_foreach(cts_get_list_op op_code, - cts_foreach_fn cb, void *user_data) -{ - int ret; - CTSiter iter = {0}; - - ret = cts_get_list(op_code, &iter); - retvm_if(CTS_SUCCESS != ret, ret, "cts_get_list() Failed(%d)", ret); - - cts_foreach_run(&iter, cb, user_data); - - return CTS_SUCCESS; -} - -API int contacts_svc_list_with_int_foreach(cts_get_list_int_op op_code, - unsigned int search_value, cts_foreach_fn cb, void *user_data) -{ - int ret; - CTSiter iter = {0}; - - ret = cts_get_list_with_int(op_code, search_value, &iter); - retvm_if(CTS_SUCCESS != ret, ret, "cts_get_list_with_int() Failed(%d)", ret); - - cts_foreach_run(&iter, cb, user_data); - - return CTS_SUCCESS; -} - -API int contacts_svc_list_with_str_foreach(cts_get_list_str_op op_code, - const char *search_value, cts_foreach_fn cb, void *user_data) -{ - int ret; - CTSiter iter = {0}; - - ret = cts_get_list_with_str(op_code, search_value, &iter); - retvm_if(CTS_SUCCESS != ret, ret, "cts_get_list_with_str() Failed(%d)", ret); - - cts_foreach_run(&iter, cb, user_data); - - return CTS_SUCCESS; -} - -API int contacts_svc_list_filter_free(CTSfilter *filter) -{ - retv_if(NULL == filter, CTS_ERR_ARG_NULL); - - free(filter->search_val); - free(filter); - return CTS_SUCCESS; -} - -static inline int cts_filter_parse_args(va_list args, int type, CTSfilter *ret) -{ - while (type) { - switch (type) { - case CTS_LIST_FILTER_NONE: - break; - case CTS_LIST_FILTER_ADDRESBOOK_ID_INT: - ret->addrbook_on = true; - ret->addrbook_id = va_arg(args, int); - break; - case CTS_LIST_FILTER_GROUP_ID_INT: - ret->group_on = true; - ret->group_id = va_arg(args, int); - break; - case CTS_LIST_FILTER_LIMIT_INT: - ret->limit_on = true; - ret->limit = va_arg(args, int); - break; - case CTS_LIST_FILTER_OFFSET_INT: - ret->offset_on = true; - ret->offset = va_arg(args, int); - break; - default: - ERR("Invalid type. Your type(%d) is not supported.", type); - return CTS_ERR_ARG_INVALID; - } - type = va_arg(args, int); - } - - retvm_if(ret->offset_on && !ret->limit_on, CTS_ERR_ARG_INVALID, "OFFSET is depends on LIMIT"); - - return CTS_SUCCESS; -} - -enum { - CTS_FILTER_TYPE_NONE, - CTS_FILTER_TYPE_INT, - CTS_FILTER_TYPE_STR, -}; - -API CTSfilter* contacts_svc_list_str_filter_new(cts_str_filter_op list_type, - const char *search_value, cts_filter_type first_type, ...) -{ - int ret; - CTSfilter *ret_val; - va_list args; - - retvm_if(NULL == search_value, NULL, "The parameter(search_value) is NULL"); - retvm_if(CTS_LIST_FILTER_NONE == first_type, NULL, - "filter constraint is missing(use contacts_svc_get_list_with_str()"); - - ret_val = calloc(1, sizeof(CTSfilter)); - ret_val->type = CTS_FILTER_TYPE_STR; - ret_val->list_type = list_type; - ret_val->search_val = strdup(search_value); - - va_start(args, first_type); - ret = cts_filter_parse_args(args, first_type, ret_val); - va_end(args); - - if (ret) { - contacts_svc_list_filter_free(ret_val); - return NULL; - } - - return (CTSfilter *)ret_val; -} - -API CTSfilter* contacts_svc_list_filter_new(cts_filter_op list_type, cts_filter_type first_type, ...) -{ - int ret; - CTSfilter *ret_val; - va_list args; - - retvm_if(CTS_LIST_FILTER_NONE == first_type, NULL, - "filter constraint is missing(use contacts_svc_get_list()"); - - ret_val = calloc(1, sizeof(CTSfilter)); - ret_val = CTS_FILTER_TYPE_NONE; - ret_val->list_type = list_type; - - va_start(args, first_type); - ret = cts_filter_parse_args(args, first_type, ret_val); - va_end(args); - - if (ret) { - contacts_svc_list_filter_free(ret_val); - return NULL; - } - - return (CTSfilter *)ret_val; -} - -static int cts_list_with_str_make_query(CTSfilter *filter, CTSiter *iter) -{ - int ret; - cts_stmt stmt; - const char *display; - char query[CTS_SQL_MAX_LEN] = {0}; - char remake_val[CTS_SQL_MIN_LEN] = {0}; - - retvm_if(NULL == filter->search_val, - CTS_ERR_ARG_INVALID, "The parameter(filter) doesn't have search_val"); - - if (CTS_ORDER_NAME_LASTFIRST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - display = CTS_SCHEMA_DATA_NAME_REVERSE_LOOKUP; - else - display = CTS_SCHEMA_DATA_NAME_LOOKUP; - - switch (filter->list_type) { - case CTS_LIST_PLOGS_OF_NUMBER: - iter->i_type = CTS_ITER_PLOGS_OF_NUMBER; - if (filter->search_val && *filter->search_val) { - ret = snprintf(query, sizeof(query), - "SELECT A.id, A.log_type, A.log_time, A.data1, A.data2, MIN(B.contact_id) " - "FROM %s A LEFT JOIN %s B ON A.normal_num = B.data3 AND B.datatype = %d AND " - "(A.related_id = B.contact_id OR A.related_id IS NULL OR " - "NOT EXISTS (SELECT id FROM %s " - "WHERE datatype = %d AND contact_id = A.related_id AND data3 = ?)) " - "WHERE A.number = ? " - "GROUP BY A.id " - "ORDER BY A.log_time DESC", - CTS_TABLE_PHONELOGS, CTS_TABLE_DATA, CTS_DATA_NUMBER, CTS_TABLE_DATA, CTS_DATA_NUMBER); - } - else { - ret = snprintf(query, sizeof(query), - "SELECT id, log_type, log_time, data1, data2, NULL " - "FROM %s WHERE number ISNULL ORDER BY id DESC", CTS_TABLE_PHONELOGS); - } - if (filter->limit_on) { - ret += snprintf(query+ret, sizeof(query)-ret, " LIMIT %d ", filter->limit); - if (filter->offset_on) - ret += snprintf(query+ret, sizeof(query)-ret, ", %d", filter->offset); - } - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - if (filter->search_val) { - const char *normal_num; - ret = cts_clean_number(filter->search_val, remake_val, sizeof(remake_val)); - retvm_if(ret <= 0, CTS_ERR_ARG_INVALID, "Number(%s) is invalid", filter->search_val); - - normal_num = cts_normalize_number(remake_val); - cts_stmt_bind_copy_text(stmt, 1, normal_num, strlen(normal_num)); - cts_stmt_bind_copy_text(stmt, 2, remake_val, strlen(remake_val)); - } - iter->stmt = stmt; - break; - case CTS_LIST_CONTACTS_WITH_NAME: - retvm_if(CTS_SQL_MIN_LEN <= strlen(filter->search_val), CTS_ERR_ARG_INVALID, - "search_value is too long"); - iter->i_type = CTS_ITER_CONTACTS_WITH_NAME; - memset(remake_val, 0x00, sizeof(remake_val)); - - ret = cts_normalize_str(filter->search_val, remake_val, CTS_SQL_MIN_LEN); - retvm_if(ret < CTS_SUCCESS, ret, "cts_normalize_str() Failed(%d)", ret); - - if (filter->addrbook_on) { - ret = snprintf(query, sizeof(query), - "SELECT A.contact_id, data1, data2, data3, data5, B.addrbook_id, B.image0 " - "FROM %s A, %s B ON A.contact_id = B.contact_id " - "WHERE datatype = %d AND B.addrbook_id = %d AND %s LIKE ('%%' || ? || '%%') " - "ORDER BY data1, %s", - CTS_TABLE_DATA, CTS_TABLE_CONTACTS, CTS_DATA_NAME, filter->addrbook_id, - display, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - } else if (filter->group_on) { - ret = snprintf(query, sizeof(query), - "SELECT A.contact_id, data1, data2, data3, data5, B.addrbook_id, B.image0 " - "FROM %s A, %s B ON A.contact_id = B.contact_id " - "WHERE datatype = %d AND %s LIKE ('%%' || ? || '%%') " - "AND contact_id IN (SELECT contact_id FROM %s WHERE group_id = %d) " - "ORDER BY data1, %s", - CTS_TABLE_DATA, CTS_TABLE_CONTACTS, CTS_DATA_NAME, display, - CTS_TABLE_GROUPING_INFO, filter->group_id, - CTS_SCHEMA_DATA_NAME_SORTING_KEY); - } else { - ret = snprintf(query, sizeof(query), - "SELECT A.contact_id, data1, data2, data3, data5, B.addrbook_id, B.image0 " - "FROM %s A, %s B ON A.contact_id = B.contact_id " - "WHERE datatype = %d AND %s LIKE ('%%' || ? || '%%') " - "ORDER BY data1, %s", - CTS_TABLE_DATA, CTS_TABLE_CONTACTS, CTS_DATA_NAME, display, - CTS_SCHEMA_DATA_NAME_SORTING_KEY); - } - - if (filter->limit_on) { - ret += snprintf(query+ret, sizeof(query)-ret, " LIMIT %d ", filter->limit); - if (filter->offset_on) - ret += snprintf(query+ret, sizeof(query)-ret, ", %d", filter->offset); - } - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - cts_stmt_bind_copy_text(stmt, 1, remake_val, strlen(remake_val)); - break; - case CTS_LIST_NUMBERINFOS_WITH_NAME: - retvm_if(CTS_SQL_MIN_LEN <= strlen(filter->search_val), CTS_ERR_ARG_INVALID, - "search_value is too long"); - iter->i_type = CTS_ITER_NUMBERINFOS; - memset(remake_val, 0x00, sizeof(remake_val)); - - ret = cts_normalize_str(filter->search_val, remake_val, CTS_SQL_MIN_LEN); - retvm_if(ret < CTS_SUCCESS, ret, "cts_normalize_str() Failed(%d)", ret); - - if (filter->addrbook_on) { - ret = snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, B.data2, C.image0 " - "FROM %s A, %s B, %s C " - "ON A.contact_id = B.contact_id AND A.contact_id = C.contact_id " - "WHERE A.datatype = %d AND A.datatype = %d " - "AND C.addrbook_id = %d AND A.%s LIKE ('%%' || ? || '%%') " - "ORDER BY A.data1, A.%s", - CTS_TABLE_DATA, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_DATA_NUMBER, - filter->addrbook_id, display, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - } else if (filter->group_on) { - ret = snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, B.data2, C.image0 " - "FROM %s A, %s B, %s C " - "ON A.contact_id = B.contact_id AND A.contact_id = C.contact_id " - "WHERE A.datatype = %d AND B.datatype = %d AND A.%s LIKE ('%%' || ? || '%%') " - "AND A.contact_id IN " - "(SELECT contact_id FROM %s WHERE group_id = %d) " - "ORDER BY A.data1, A.%s", - CTS_TABLE_DATA, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_DATA_NUMBER, display, - CTS_TABLE_GROUPING_INFO, filter->group_id, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - } else { - ret = snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, B.data2, C.image0 " - "FROM %s A, %s B, %s C " - "ON A.contact_id = B.contact_id AND A.contact_id = C.contact_id " - "WHERE A.datatype = %d AND B.datatype = %d AND A.%s LIKE ('%%' || ? || '%%') " - "ORDER BY A.data1, A.%s", - CTS_TABLE_DATA, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_DATA_NUMBER, - display, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - } - if (filter->limit_on) { - ret += snprintf(query+ret, sizeof(query)-ret, " LIMIT %d ", filter->limit); - if (filter->offset_on) - ret += snprintf(query+ret, sizeof(query)-ret, ", %d", filter->offset); - } - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - cts_stmt_bind_copy_text(stmt, 1, remake_val, strlen(remake_val)); - break; - case CTS_LIST_NUMBERINFOS_WITH_NUM: - iter->i_type = CTS_ITER_NUMBERINFOS; - - if (filter->addrbook_on) { - ret = snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, B.data2, C.image0 " - "FROM %s A, %s B, %s C " - "ON A.contact_id = B.contact_id AND A.contact_id = C.contact_id " - "WHERE A.datatype = %d AND B.datatype = %d " - "AND C.addrbook_id = %d AND B.data2 LIKE ('%%' || ? || '%%') " - "ORDER BY A.data1, A.%s", - CTS_TABLE_DATA, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_DATA_NUMBER, - filter->addrbook_id, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - } else if (filter->group_on) { - ret = snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, B.data2, C.image0 " - "FROM %s A, %s B, %s C " - "ON A.contact_id = B.contact_id AND A.contact_id = C.contact_id " - "WHERE A.datatype = %d AND B.datatype = %d AND B.data2 LIKE ('%%' || ? || '%%') " - "AND A.contact_id IN (SELECT contact_id FROM %s WHERE group_id = %d) " - "ORDER BY A.data1, A.%s", - CTS_TABLE_DATA, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_DATA_NUMBER, - CTS_TABLE_GROUPING_INFO, filter->group_id, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - } else { - ret = snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, B.data2, C.image0 " - "FROM %s A, %s B, %s C " - "ON A.contact_id = B.contact_id AND A.contact_id = C.conatct_id " - "WHERE B.data2 LIKE ('%%' || ? || '%%') " - "AND A.datatype = %d AND B.datatype = %d " - "ORDER BY A.data1, A.%s", - CTS_TABLE_DATA, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_DATA_NUMBER, CTS_SCHEMA_DATA_NAME_SORTING_KEY); - } - if (filter->limit_on) { - ret += snprintf(query+ret, sizeof(query)-ret, " LIMIT %d ", filter->limit); - if (filter->offset_on) - ret += snprintf(query+ret, sizeof(query)-ret, ", %d", filter->offset); - } - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - cts_stmt_bind_copy_text(stmt, 1, filter->search_val, strlen(filter->search_val)); - break; - case CTS_LIST_EMAILINFOS_WITH_EMAIL: - iter->i_type = CTS_ITER_EMAILINFOS_WITH_EMAIL; - - if (filter->addrbook_on) { - ret = snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, B.data2, C.image0 " - "FROM %s A, %s B, %s C " - "ON A.contact_id = B.contact_id AND A.contact_id = C.contact_id " - "WHERE A.datatype = %d AND B.datatype = %d AND C.addrbook_id = %d " - "AND B.data2 LIKE ('%%' || ? || '%%') " - "ORDER BY A.data1, A.%s", - CTS_TABLE_DATA, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_DATA_NUMBER, filter->addrbook_id, - CTS_SCHEMA_DATA_NAME_SORTING_KEY); - } else if (filter->group_on) { - ret = snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, B.data2, C.image0 " - "FROM %s A, %s B, %s C " - "ON A.contact_id = B.contact_id AND A.contact_id = C.contact_id " - "WHERE A.datatype = %d AND B.datatype = %d AND " - "B.data2 LIKE ('%%' || ? || '%%') AND A.contact_id IN " - "(SELECT contact_id FROM %s WHERE group_id = %d) " - "ORDER BY A.data1, A.%s", - CTS_TABLE_DATA, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_DATA_NUMBER, - CTS_TABLE_GROUPING_INFO, filter->group_id, - CTS_SCHEMA_DATA_NAME_SORTING_KEY); - } else { - ret = snprintf(query, sizeof(query), - "SELECT A.contact_id, A.data1, A.data2, A.data3, A.data5, B.data2, C.image0 " - "FROM %s A, %s B, %s C " - "ON A.contact_id = B.contact_id AND A.contact_id = C.contact_id " - "WHERE A.datatype = %d AND B.datatype = %d AND B.data2 LIKE ('%%' || ? || '%%') " - "ORDER BY A.data1, A.%s", - CTS_TABLE_DATA, CTS_TABLE_DATA, CTS_TABLE_CONTACTS, - CTS_DATA_NAME, CTS_DATA_EMAIL, - CTS_SCHEMA_DATA_NAME_SORTING_KEY); - } - if (filter->limit_on) { - ret += snprintf(query+ret, sizeof(query)-ret, " LIMIT %d ", filter->limit); - if (filter->offset_on) - ret += snprintf(query+ret, sizeof(query)-ret, ", %d", filter->offset); - } - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - cts_stmt_bind_copy_text(stmt, 1, filter->search_val, strlen(filter->search_val)); - break; - default: - ERR("Invalid parameter : The op_code(%d) is not supported", filter->list_type); - return CTS_ERR_ARG_INVALID; - } - iter->stmt = stmt; - - return CTS_SUCCESS; -} - -#ifdef CTS_DEPRECATED -API int contacts_svc_get_list_with_filter(CTSfilter *filter, CTSiter **iter) -{ - int ret; - CTSiter *result; - - retv_if(NULL == filter, CTS_ERR_ARG_NULL); - retv_if(NULL == iter, CTS_ERR_ARG_NULL); - - if (CTS_FILTER_TYPE_STR == filter->type) { - result = calloc(1, sizeof(CTSiter)); - retvm_if(NULL == result, CTS_ERR_OUT_OF_MEMORY, "calloc() Failed"); - - ret = cts_list_with_str_make_query(filter, result); - if (ret) { - ERR("cts_list_with_str_make_query() Failed(%d)", ret); - free(result); - return ret; - } - } else { - ERR("Invalid CTSfilter(type = %d)", filter->type); - return CTS_ERR_ARG_INVALID; - } - - return CTS_SUCCESS; -} -#endif - -API int contacts_svc_list_with_filter_foreach(CTSfilter *filter, - cts_foreach_fn cb, void *user_data) -{ - int ret; - CTSiter iter = {0}; - - if (CTS_FILTER_TYPE_STR == filter->type) { - ret = cts_list_with_str_make_query(filter, &iter); - retvm_if(CTS_SUCCESS != ret, ret, "contacts_svc_get_list_with_filter() Failed(%d)", ret); - } else { - ERR("Invalid CTSfilter(type = %d)", filter->type); - return CTS_ERR_ARG_INVALID; - } - - cts_foreach_run(&iter, cb, user_data); - - return CTS_SUCCESS; -} - -static inline bool cts_is_number(const char *str) -{ - int i; - - for (i=0;iinfo, CTS_ERR_ARG_INVALID); - - iter->i_type = CTS_ITER_UPDATED_CONTACTS_AFTER_VER; - snprintf(query, sizeof(query), - "SELECT group_id, type, ver FROM %s, %s USING (group_id) " - "WHERE ver > %d AND addrbook_id = %d ", - "group_relations_log", CTS_TABLE_GROUPS, - version, addressbook_id); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = cts_stmt_step(stmt); - if (CTS_TRUE != ret) - { - warn_if(CTS_SUCCESS != ret, "cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return CTS_ERR_DB_RECORD_NOT_FOUND; - } - - iter->info->head = result = cts_updated_contact_add_mempool(); - do { - result->id = cts_stmt_get_int(stmt, 0); - result->type = cts_stmt_get_int(stmt, 1); - result->ver = cts_stmt_get_int(stmt, 2); - - if (NULL == result->next) - result->next = cts_updated_contact_add_mempool(); - result = result->next; - }while(CTS_TRUE == cts_stmt_step(stmt)); - - cts_stmt_finalize(stmt); - - return CTS_SUCCESS; -} diff --git a/src/cts-list.h b/src/cts-list.h deleted file mode 100755 index 93a3356..0000000 --- a/src/cts-list.h +++ /dev/null @@ -1,612 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_LIST_H__ -#define __CTS_LIST_H__ - -#include "cts-sqlite.h" - -enum -{ - CTS_ITER_NONE, - CTS_ITER_CONTACTS, - CTS_ITER_ALL_CUSTOM_NUM_TYPE, - CTS_ITER_GROUPING_PLOG, - CTS_ITER_ALL_CONTACT_FAVORITE, - CTS_ITER_ALL_NUM_FAVORITE, - CTS_ITER_ALL_SPEEDDIAL, - CTS_ITER_ALL_SDN, - CTS_ITER_PLOGS_OF_NUMBER, - CTS_ITER_PLOGNUMBERS_WITH_NUM, - CTS_ITER_CONTACTS_WITH_NAME, - CTS_ITER_NUMBERINFOS, - CTS_ITER_EMAILINFOS_WITH_EMAIL, - CTS_ITER_NUMBERS_EMAILS, - CTS_ITER_GROUPS, - CTS_ITER_ADDRESSBOOKS, - CTS_ITER_EMAILS_OF_CONTACT_ID, - CTS_ITER_NUMBERS_OF_CONTACT_ID, - CTS_ITER_UPDATED_CONTACTS_AFTER_VER, - CTS_ITER_MAX -}; - -typedef struct _updated_contact { - int type; - int id; - int ver; - struct _updated_contact *next; -}updated_contact; - -typedef struct { - updated_contact *head; - updated_contact *cursor; -}updated_contact_info; - -struct _cts_iter { - int i_type; - cts_stmt stmt; - updated_contact_info *info; -}; - -struct cts_filter { - int type; - int list_type; - char *search_val; - bool addrbook_on; - bool group_on; - bool limit_on; - bool offset_on; - int addrbook_id; - int group_id; - int limit; - int offset; -}; - -// - - -#endif //__CTS_LIST_H__ - diff --git a/src/cts-normalize.c b/src/cts-normalize.c deleted file mode 100755 index cd003ef..0000000 --- a/src/cts-normalize.c +++ /dev/null @@ -1,615 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * Donghee Ye - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include - -#include "cts-internal.h" -#include "cts-normalize.h" -#include "cts-socket.h" -#include "cts-pthread.h" -#include "cts-utils.h" - -static int (*extra_normalize_fn)(char dest[][CTS_SQL_MAX_LEN]); - -static inline int check_utf8(char c) -{ - if (c < 128) - return 1; - else if ((c & (char)0xe0) == (char)0xc0) - return 2; - else if ((c & (char)0xf0) == (char)0xe0) - return 3; - else if ((c & (char)0xf8) == (char)0xf0) - return 4; - else if ((c & (char)0xfc) == (char)0xf8) - return 5; - else if ((c & (char)0xfe) == (char)0xfc) - return 6; - else - return CTS_ERR_FAIL; -} - -static inline bool check_dirty_number(char digit) -{ - switch (digit) - { - case '0' ... '9': - case 'p': - case 'w': - case 'P': - case 'W': - return false; - case '+': //only first position - default: - return true; - } -} - -int cts_clean_number(const char *src, char *dest, int dest_size) -{ - int s_pos=0, d_pos=0, char_type; - - if (NULL == src) - ERR("The parameter(src) is NULL"); - else - { - if ('+' == src[s_pos]) - dest[d_pos++] = src[s_pos++]; - - while (src[s_pos] != 0) - { - if (d_pos >= dest_size-2) break; - char_type = check_utf8(src[s_pos]); - if (char_type <= 1) { - if (check_dirty_number(src[s_pos])) { - s_pos++; - continue; - } - dest[d_pos++] = src[s_pos++]; - } - else - s_pos += char_type; - } - } - - dest[d_pos] = 0; - return d_pos; -} - -static int cts_remove_special_char(const char *src, char *dest, int dest_size) -{ - int s_pos=0, d_pos=0, char_type, src_size; - - if (NULL == src) { - ERR("The parameter(src) is NULL"); - dest[d_pos] = '\0'; - return 0; - } - src_size = strlen(src); - - while (src[s_pos] != 0) - { - char_type = check_utf8(src[s_pos]); - - if (0 < char_type && char_type < dest_size - d_pos && char_type <= src_size - s_pos) { - memcpy(dest+d_pos, src+s_pos, char_type); - d_pos += char_type; - s_pos += char_type; - } - else { - ERR("The parameter(src:%s) has invalid character set", src); - dest[d_pos] = '\0'; - return CTS_ERR_ARG_INVALID; - } - } - - dest[d_pos] = '\0'; - return d_pos; -} - -int cts_normalize_str(const char *src, char *dest, int dest_size) -{ - int ret; - ret = cts_remove_special_char(src, dest, dest_size); - retvm_if(ret < CTS_SUCCESS, ret, "cts_remove_special_char() Failed(%d)", ret); - ret = CTS_SUCCESS; - - cts_mutex_lock(CTS_MUTEX_SOCKET_FD); - ret = cts_request_normalize_str(dest, dest, dest_size); - cts_mutex_unlock(CTS_MUTEX_SOCKET_FD); - - return ret; -} - -void cts_set_extra_normalize_fn(int (*fn)(char dest[][CTS_SQL_MAX_LEN])) -{ - extra_normalize_fn = fn; -} - -int cts_normalize_name(cts_name *src, - char dest[][CTS_SQL_MAX_LEN], bool is_display) -{ - int ret; - if (is_display) { - ret = cts_remove_special_char(src->display, dest[CTS_NN_FIRST], - sizeof(dest[CTS_NN_FIRST])); - warn_if(ret < CTS_SUCCESS, "cts_remove_special_char() Failed(%d)", ret); - snprintf(dest[CTS_NN_SORTKEY], sizeof(dest[CTS_NN_SORTKEY]), "%s", dest[CTS_NN_FIRST]); - ret = CTS_SUCCESS; - } - else { - ret = cts_remove_special_char(src->first, dest[CTS_NN_FIRST], - sizeof(dest[CTS_NN_FIRST])); - warn_if(ret < CTS_SUCCESS, "cts_remove_special_char() Failed(%d)", ret); - ret = CTS_SUCCESS; - - ret = cts_remove_special_char(src->last, dest[CTS_NN_LAST], - sizeof(dest[CTS_NN_LAST])); - warn_if(ret < CTS_SUCCESS, "cts_remove_special_char() Failed(%d)", ret); - ret = CTS_SUCCESS; - - if (!*dest[CTS_NN_LAST]) - snprintf(dest[CTS_NN_SORTKEY], sizeof(dest[CTS_NN_SORTKEY]), "%s", dest[CTS_NN_FIRST]); - else if (!*dest[CTS_NN_FIRST]) - snprintf(dest[CTS_NN_SORTKEY], sizeof(dest[CTS_NN_SORTKEY]), "%s", dest[CTS_NN_LAST]); - else if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - snprintf(dest[CTS_NN_SORTKEY], sizeof(dest[CTS_NN_SORTKEY]), "%s %s", dest[CTS_NN_FIRST], dest[CTS_NN_LAST]); - else - snprintf(dest[CTS_NN_SORTKEY], sizeof(dest[CTS_NN_SORTKEY]), "%s, %s", dest[CTS_NN_LAST], dest[CTS_NN_FIRST]); - } - - if (extra_normalize_fn) - ret = extra_normalize_fn(dest); - else { - cts_mutex_lock(CTS_MUTEX_SOCKET_FD); - ret = cts_request_normalize_name(dest); - cts_mutex_unlock(CTS_MUTEX_SOCKET_FD); - } - - return ret; -} - -/** - * This function make searchable string. - * The string can use at contacts_svc_normalized_strstr(). - * - * @param[in] src the string to convert - * @param[out] dest The pointer to get normalized string. - * @param[out] dest_len the size of dest. - * @return #CTS_SUCCESS on success, Negative value(#cts_error) on error - * @par example - * @code - char normalized_str[512]; - const char *name = "Test" - - ret = contacts_svc_normalize_str(name, normalized_str, sizeof(normalized_str)); - - if(CTS_SUCCESS != ret) - printf("Error : contacts_svc_normalize_str() Failed(%d)", ret); - else - printf("original string is %s, normalized string is %s", name, normalized_str); - * @endcode - */ -API int contacts_svc_normalize_str(const char *src, char *dest, const int dest_len) -{ - int ret; - retv_if(NULL == dest, CTS_ERR_ARG_NULL); - retvm_if(dest_len <= 0, CTS_ERR_ARG_INVALID, "dest_len(%d) is Invalid", dest_len); - - ret = cts_normalize_str(src, dest, dest_len); - retvm_if(ret < CTS_SUCCESS, ret, "cts_normalize_str() Failed(%d)", ret); - - return CTS_SUCCESS; -} - -static inline bool is_choseong(const char *src) -{ - unsigned short tmp; - - tmp = (src[1] << 8) | src[2]; - if (((char)0xE1 == src[0] && CTS_COMPARE_BETWEEN(0x8480, tmp, 0x859F)) /* korean -Hangul Jamo*/ - || ((char)0xEA == src[0] && CTS_COMPARE_BETWEEN(0xA5A0, tmp, 0xA5BC))) /* korean -Hangul Jamo extended A*/ - { - return true; - } - return false; -} - -static inline bool is_jungseong(const char *src) -{ - unsigned short tmp; - - tmp = (src[1] << 8) | src[2]; - if (((char)0xE1 == src[0] && CTS_COMPARE_BETWEEN(0x85A0, tmp, 0x86A7))/* korean -Hangul Jamo*/ - || ((char)0xED == src[0] && CTS_COMPARE_BETWEEN(0x9EB0, tmp, 0x9F86)))/* korean -Hangul Jamo extended B */ - { - return true; - } - return false; -} - -static inline bool is_diacritical(const char *src) -{ - unsigned short tmp; - - if (!src || !*src || !*(src+1)) - return false; - - tmp = (src[0] << 8) | src[1]; - if (CTS_COMPARE_BETWEEN(0xCC80, tmp, 0xCCBF) - || CTS_COMPARE_BETWEEN(0xCD80, tmp, 0xCDAF)) - { - return true; - } - return false; -} - -static inline bool compare_unicode(const char *str1, const char *str2, int str2_len) -{ - int k; - for (k=0; kdisplay); - snprintf(middle, len+1, "%s", item_data->display + ret); - printf("%s -> %s, %s, %s", item_data->display, first, middle, item_data->display + ret + len); - } else - printf("str1 doesn't has str2"); - * @endcode - */ -API int contacts_svc_normalized_strstr(const char *haystack, - const char *needle, int *len) -{ - int i, j, wind, h_len, n_len; - int first_needle_len; - int equal_index; - int equal_length; - int equal_wind = 0; - bool counted = false; - retvm_if(NULL == haystack, -1, "The parameter(haystack) is NULL"); - retvm_if(NULL == needle, -1, "The parameter(needle) is NULL"); - CTS_DBG("haystack = %s, needle = %s", haystack, needle); - - h_len = 1; - n_len = 1; - equal_index = 0; - first_needle_len = check_utf8(needle[0]); - for (i=0, j=0;i - * Donghee Ye - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_NORMALIZE_H__ -#define __CTS_NORMALIZE_H__ - -#include "cts-sqlite.h" - -#define CTS_COMPARE_BETWEEN(left_range, value, right_range) (((left_range) <= (value)) && ((value) <= (right_range))) -#define CTS_VCONF_DEFAULT_LANGUAGE "db/service/contacts/default_lang" - -/** - * Language Type - */ -enum LANGTYPE{ - CTS_LANG_NUMBER = 0, - CTS_LANG_DEFAULT = 1, - CTS_LANG_SYMBOL = 2, - CTS_LANG_ENGLISH = 3, - CTS_LANG_KOREAN = 4, /* always last-first */ - CTS_LANG_CHINESE = 5, - CTS_LANG_JAPANESE = 6, - CTS_LANG_FRENCH = 7, - CTS_LANG_GERMAN = 8, - CTS_LANG_ITALIAN = 9, - CTS_LANG_RUSSIAN = 10, - CTS_LANG_DUTCH = 11, - CTS_LANG_PORTUGUESE = 12, - CTS_LANG_TURKISH = 13, - CTS_LANG_GREEK = 14, - CTS_LANG_SPANISH = 15, - CTS_LANG_OTHERS = 16, -}; - -enum{ - CTS_NN_FIRST, - CTS_NN_LAST, - CTS_NN_SORTKEY, - CTS_NN_MAX, -}; - -int cts_normalize_str(const char *src, char *dest, int dest_size); -int cts_normalize_name(cts_name *src, char dest[][CTS_SQL_MAX_LEN], bool is_display); -void cts_set_extra_normalize_fn(int (*fn)(char dest[][CTS_SQL_MAX_LEN])); -const char* cts_normalize_number(const char *src); -int cts_clean_number(const char *src, char *dest, int dest_size); - -#endif //__CTS_NORMALIZE_H__ diff --git a/src/cts-phonelog.c b/src/cts-phonelog.c deleted file mode 100755 index 003c1ef..0000000 --- a/src/cts-phonelog.c +++ /dev/null @@ -1,442 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include "cts-internal.h" -#include "cts-schema.h" -#include "cts-sqlite.h" -#include "cts-contact.h" -#include "cts-utils.h" -#include "cts-types.h" -#include "cts-normalize.h" -#include "cts-phonelog.h" - -#define CTS_NAME_LEN_MAX 128 - -static int cts_phonelog_accumulation_handle(cts_plog *plog) -{ - int ret, cnt, duration, total_cnt, total_duration, deal_cnt=0; - cts_stmt stmt = NULL; - char query[CTS_SQL_MAX_LEN] = {0}; - - snprintf(query, sizeof(query), "SELECT * FROM %s WHERE id <= 2", - CTS_TABLE_PHONELOG_ACC); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - while (CTS_TRUE == cts_stmt_step(stmt)) - { - ret = cts_stmt_get_int(stmt, 0); - if (1 == ret) { - cnt = cts_stmt_get_int(stmt, 1); - duration = cts_stmt_get_int(stmt, 3); - deal_cnt++; - }else if (2 == ret) { - total_cnt = cts_stmt_get_int(stmt, 1); - total_duration = cts_stmt_get_int(stmt, 3); - deal_cnt++; - } - } - cts_stmt_finalize(stmt); - - if (deal_cnt != 2) { - ERR("Getting plog accumulation data is Failed"); - return CTS_ERR_DB_FAILED; - } - - snprintf(query, sizeof(query), "INSERT OR REPLACE INTO %s VALUES(?, ?, NULL, ?)", - CTS_TABLE_PHONELOG_ACC); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - cts_stmt_bind_int(stmt, 1, 1); - cts_stmt_bind_int(stmt, 2, cnt+1); - cts_stmt_bind_int(stmt, 3, duration + plog->extra_data1); - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - cts_stmt_reset(stmt); - - cts_stmt_bind_int(stmt, 1, 2); - cts_stmt_bind_int(stmt, 2, total_cnt+1); - cts_stmt_bind_int(stmt, 3, total_duration + plog->extra_data1); - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - - cts_stmt_finalize(stmt); - - return CTS_SUCCESS; -} - -static inline int cts_insert_phonelog(cts_plog *plog) -{ - int ret; - cts_stmt stmt = NULL; - char clean_num[CTS_NUMBER_MAX_LEN], query[CTS_SQL_MAX_LEN] = {0}; - const char *normal_num; - - retvm_if(plog->log_type <= CTS_PLOG_TYPE_NONE - || CTS_PLOG_TYPE_MAX <= plog->log_type, - CTS_ERR_ARG_INVALID, "phonelog type(%d) is invaid", plog->log_type); - - cts_clean_number(plog->number, clean_num, sizeof(clean_num)); - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - snprintf(query, sizeof(query), "INSERT INTO %s(" - "number, normal_num, related_id, log_type, log_time, data1, data2) " - "VALUES(?, ?, ?, %d, %d, %d, ?)", - CTS_TABLE_PHONELOGS, plog->log_type, - plog->log_time, plog->extra_data1); - - stmt = cts_query_prepare(query); - if (NULL == stmt) { - ERR("cts_query_prepare() Failed"); - contacts_svc_end_trans(false); - return CTS_ERR_DB_FAILED; - } - - if (*clean_num) { - cts_stmt_bind_text(stmt, 1, clean_num); - normal_num = cts_normalize_number(clean_num); - cts_stmt_bind_text(stmt, 2, normal_num); - } - - if (0 < plog->related_id) - cts_stmt_bind_int(stmt, 3, plog->related_id); - - if (plog->extra_data2) - cts_stmt_bind_text(stmt, 4, plog->extra_data2); - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - contacts_svc_end_trans(false); - return ret; - } - cts_stmt_finalize(stmt); - - if (CTS_PLOG_TYPE_VOICE_OUTGOING == plog->log_type - || CTS_PLOG_TYPE_VIDEO_OUTGOING == plog->log_type) - { - ret = cts_phonelog_accumulation_handle(plog); - if (CTS_SUCCESS != ret) { - ERR("cts_phonelog_accumulation_handle() Failed"); - contacts_svc_end_trans(false); - return ret; - } - } - - if (CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN == plog->log_type || - CTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN == plog->log_type) - cts_set_missed_call_noti(); - - cts_set_plog_noti(); - ret = contacts_svc_end_trans(true); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -//extra_data1 : duration, message_id -//extra_data2 : short message -API int contacts_svc_insert_phonelog(CTSvalue* phone_log) -{ - int ret; - cts_plog *plog = (cts_plog *)phone_log; - - retv_if(NULL == phone_log, CTS_ERR_ARG_NULL); - retvm_if(plog->id, CTS_ERR_ARG_INVALID, "The phone_log has ID(%d)", plog->id); - - ret = cts_insert_phonelog(plog); - retvm_if(CTS_SUCCESS != ret, ret,"cts_insert_phonelog() Failed(%d)", ret); - - if (0 < plog->related_id) { - ret = cts_increase_outgoing_count(plog->related_id); - warn_if(CTS_SUCCESS != ret, "cts_increase_outgoing_count() Failed(%d)", ret); - } - - return CTS_SUCCESS; -} - -API int contacts_svc_delete_phonelog(cts_del_plog_op op_code, ...) -{ - int id, ret; - char *number; - char query[CTS_SQL_MAX_LEN]; - va_list args; - - switch (op_code) - { - case CTS_PLOG_DEL_BY_ID: - va_start(args, op_code); - id = va_arg(args, int); - va_end(args); - snprintf(query, sizeof(query), "DELETE FROM %s WHERE id = %d", - CTS_TABLE_PHONELOGS, id); - break; - case CTS_PLOG_DEL_BY_NUMBER: - va_start(args, op_code); - number = va_arg(args, char *); - va_end(args); - retv_if(NULL == number, CTS_ERR_ARG_NULL); - snprintf(query, sizeof(query), "DELETE FROM %s WHERE number = '%s'", - CTS_TABLE_PHONELOGS, number); - break; - case CTS_PLOG_DEL_BY_MSGID: - va_start(args, op_code); - id = va_arg(args, int); - va_end(args); - snprintf(query, sizeof(query), "DELETE FROM %s " - "WHERE data1 = %d AND %d <= log_type AND log_type <= %d", - CTS_TABLE_PHONELOGS, - id, CTS_PLOG_TYPE_MMS_INCOMMING, CTS_PLOG_TYPE_MMS_BLOCKED); - break; - case CTS_PLOG_DEL_NO_NUMBER: - snprintf(query, sizeof(query), "DELETE FROM %s WHERE number ISNULL", - CTS_TABLE_PHONELOGS); - break; - default: - ERR("Invalid op_code. Your op_code(%d) is not supported.", op_code); - return CTS_ERR_ARG_INVALID; - } - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) { - ERR("cts_query_exec() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - cts_set_plog_noti(); - if (CTS_PLOG_DEL_BY_MSGID != op_code) - cts_set_missed_call_noti(); - - ret = contacts_svc_end_trans(true); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -API int contacts_svc_get_phonelog(int plog_id, CTSvalue **phonelog) -{ - int ret; - cts_stmt stmt; - cts_plog *plog; - char query[CTS_SQL_MAX_LEN] = {0}; - - snprintf(query, sizeof(query), - "SELECT id, number, related_id, log_type, log_time, data1, data2 " - "FROM %s WHERE id = %d", - CTS_TABLE_PHONELOGS, plog_id); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = cts_stmt_step(stmt); - if (CTS_TRUE != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return CTS_ERR_DB_RECORD_NOT_FOUND; - } - - plog = (cts_plog *)contacts_svc_value_new(CTS_VALUE_PHONELOG); - if (plog) { - ret = CTS_SUCCESS; - plog->v_type = CTS_VALUE_RDONLY_PLOG; - plog->id = cts_stmt_get_int(stmt, 0); - plog->number = SAFE_STRDUP(cts_stmt_get_text(stmt, 1)); - plog->related_id = cts_stmt_get_int(stmt, 2); - plog->log_type = cts_stmt_get_int(stmt, 3); - plog->log_time = cts_stmt_get_int(stmt, 4); - plog->extra_data1 = cts_stmt_get_int(stmt, 5); - plog->extra_data2 = SAFE_STRDUP(cts_stmt_get_text(stmt, 6)); - - *phonelog = (CTSvalue*)plog; - - cts_stmt_finalize(stmt); - return CTS_SUCCESS; - } - else { - ERR("contacts_svc_value_new() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return CTS_ERR_OUT_OF_MEMORY; - } -} - - -API int contacts_svc_phonelog_set_seen(int index, int type) -{ - int ret; - char query[CTS_SQL_MAX_LEN] = {0}; - - retvm_if(CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN != type && - CTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN != type && - CTS_PLOG_TYPE_NONE != type, - CTS_ERR_ARG_INVALID, - "The type is invalid. It must be CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN" - " or CTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN"); - - if (0 == index) { - if (CTS_PLOG_TYPE_NONE == type) - snprintf(query, sizeof(query), "UPDATE %s SET log_type = log_type + 1 WHERE log_type = %d OR log_type = %d", - CTS_TABLE_PHONELOGS, CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN, - CTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN); - else - snprintf(query, sizeof(query), "UPDATE %s SET log_type = %d WHERE log_type = %d", - CTS_TABLE_PHONELOGS, type+1, type); - } - else { - snprintf(query, sizeof(query), "UPDATE %s SET log_type = %d WHERE id = %d", - CTS_TABLE_PHONELOGS, type+1, index); - } - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) { - ERR("cts_query_exec() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - if (cts_db_change()) { - cts_set_plog_noti(); - cts_set_missed_call_noti(); - } - - ret = contacts_svc_end_trans(true); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -/** - * This is the signature of a callback function added with contats_svc_phonelog_get_all_number(), - * \n This function is invoked in the above functions. - * \n If this function doesn't return #CTS_SUCCESS, foreach function is terminated. - * - * @param[in] number number. - * @param[in] user_data The data which is set by contats_svc_phonelog_get_all_number(), - * @return #CTS_SUCCESS on success, other value on error - */ -typedef int (*cts_plog_foreach_fn)(const char *number, void *user_data); - -/** - * This function calls #cts_plog_foreach_fn for each number of all number list. - * The all number list doesn't have duplicated numbers. - * - * @param[in] cb callback function pointer(#cts_plog_foreach_fn) - * @param[in] user_data data which is passed to callback function - * @return #CTS_SUCCESS on success, Negative value(#cts_error) on error - */ -API int contats_svc_phonelog_get_all_number(cts_plog_foreach_fn cb, - void *user_data) -{ - cts_stmt stmt = NULL; - char query[CTS_SQL_MAX_LEN] = {0}; - - retv_if(NULL == cb, CTS_ERR_ARG_NULL); - - snprintf(query, sizeof(query), - "SELECT DISTINCT number FROM %s", CTS_TABLE_PHONELOGS); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - while (CTS_TRUE == cts_stmt_step(stmt)) { - if (cb(cts_stmt_get_text(stmt, 0), user_data)) - break; - } - cts_stmt_finalize(stmt); - - return CTS_SUCCESS; -} - -API char* contacts_svc_phonelog_get_last_number(cts_plog_get_last_op op) -{ - int ret; - cts_stmt stmt; - char *number; - char query[CTS_SQL_MAX_LEN] = {0}; - - switch (op) { - case CTS_PLOG_LAST_ALL: - snprintf(query, sizeof(query), - "SELECT id, number FROM %s " - "WHERE id = (SELECT MAX(id) FROM %s WHERE log_type = %d OR log_type = %d)", - CTS_TABLE_PHONELOGS, CTS_TABLE_PHONELOGS, - CTS_PLOG_TYPE_VOICE_OUTGOING, CTS_PLOG_TYPE_VIDEO_OUTGOING); - break; - case CTS_PLOG_LAST_CALL_ONLY: - snprintf(query, sizeof(query), - "SELECT id, number FROM %s " - "WHERE id = (SELECT MAX(id) FROM %s WHERE log_type = %d)", - CTS_TABLE_PHONELOGS, CTS_TABLE_PHONELOGS, CTS_PLOG_TYPE_VOICE_OUTGOING); - break; - case CTS_PLOG_LAST_VIDEO_CALL_ONLY: - snprintf(query, sizeof(query), - "SELECT id, number FROM %s " - "WHERE id = (SELECT MAX(id) FROM %s WHERE log_type = %d)", - CTS_TABLE_PHONELOGS, CTS_TABLE_PHONELOGS, CTS_PLOG_TYPE_VIDEO_OUTGOING); - break; - default: - ERR("Invalid op(%d)", op); - return NULL; - } - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, NULL, "cts_query_prepare() Failed"); - - ret = cts_stmt_step(stmt); - if (CTS_TRUE != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return NULL; - } - number = SAFE_STRDUP(cts_stmt_get_text(stmt, 1)); - - cts_stmt_finalize(stmt); - - return number; -} diff --git a/src/cts-phonelog.h b/src/cts-phonelog.h deleted file mode 100755 index 19b0a71..0000000 --- a/src/cts-phonelog.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_PHONELOG_H__ -#define __CTS_PHONELOG_H__ - -// - -#endif //__CTS_PHONELOG_H__ - diff --git a/src/cts-schema.h b/src/cts-schema.h deleted file mode 100755 index 8f72597..0000000 --- a/src/cts-schema.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_SCHEMA_H__ -#define __CTS_SCHEMA_H__ - -#define CTS_DB_PATH "/opt/dbspace/.contacts-svc.db" -#define CTS_DB_JOURNAL_PATH "/opt/dbspace/.contacts-svc.db-journal" - -// For Security -#define CTS_SECURITY_FILE_GROUP 6005 -#define CTS_SECURITY_DEFAULT_PERMISSION 0660 -#define CTS_SECURITY_DIR_DEFAULT_PERMISSION 0770 - -#define CTS_SCHEMA_TABLE_TOTAL 10 - -// Tables -#define CTS_TABLE_CONTACTS "contacts" -#define CTS_TABLE_GROUPS "groups" -#define CTS_TABLE_ADDRESSBOOKS "addressbooks" -#define CTS_TABLE_DATA "data" // This is the data table for contact all fields -#define CTS_TABLE_FAVORITES "favorites" -#define CTS_TABLE_PHONELOGS "phonelogs" -#define CTS_TABLE_PHONELOG_ACC "phonelog_accumulation" -#define CTS_TABLE_GROUPING_INFO "group_relations" -#define CTS_TABLE_DELETEDS "deleteds" -#define CTS_TABLE_CUSTOM_TYPES "custom_types" -#define CTS_TABLE_SIM_SERVICES "sim_services" -#define CTS_TABLE_SPEEDDIALS "speeddials" -#define CTS_TABLE_VERSION "cts_version" - -#define CTS_SCHEMA_DATA_NAME_LANG_INFO "data1" -#define CTS_SCHEMA_DATA_NAME_LOOKUP "data8" -#define CTS_SCHEMA_DATA_NAME_REVERSE_LOOKUP "data9" -#define CTS_SCHEMA_DATA_NAME_SORTING_KEY "data10" - -#define CTS_SCHEMA_SQLITE_SEQ "sqlite_sequence" - - -#endif /* __CTS_SCHEMA_H__ */ - diff --git a/src/cts-service.c b/src/cts-service.c deleted file mode 100755 index 280716c..0000000 --- a/src/cts-service.c +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include - -#include "cts-internal.h" -#include "cts-schema.h" -#include "cts-sqlite.h" -#include "cts-utils.h" -#include "cts-service.h" -#include "cts-socket.h" -#include "cts-normalize.h" -#include "cts-list.h" -#include "cts-pthread.h" - -static int cts_conn_refcnt = 0; - -API int contacts_svc_connect(void) -{ - CTS_FN_CALL; - int ret; - - cts_mutex_lock(CTS_MUTEX_CONNECTION); - if (0 < cts_conn_refcnt) { - CTS_DBG("The contacts-service is already connected. refcnt=%d", cts_conn_refcnt); - cts_conn_refcnt++; - } - else - { - ret = cts_socket_init(); - if (CTS_SUCCESS != ret) { - void *handle, *fn; - handle = dlopen(NULL, RTLD_GLOBAL); - fn = dlsym(handle, "cts_helper_normalize_name"); - if (NULL == fn) { - ERR("cts_socket_init() Failed(%d)", ret); - cts_mutex_unlock(CTS_MUTEX_CONNECTION); - return ret; - } - cts_set_extra_normalize_fn(fn); - } - - ret = cts_db_open(); - if (ret != CTS_SUCCESS) { - ERR("cts_db_open() Failed(%d)", ret); - cts_socket_final(); - cts_mutex_unlock(CTS_MUTEX_CONNECTION); - return ret; - } - - cts_register_noti(); - cts_conn_refcnt = 1; - } - cts_mutex_unlock(CTS_MUTEX_CONNECTION); - - return CTS_SUCCESS; -} - -API int contacts_svc_disconnect(void) -{ - CTS_FN_CALL; - retvm_if(0 == cts_conn_refcnt, CTS_ERR_ENV_INVALID, - "Contacts service was not connected"); - CTS_DBG("CTS DB refcnt = %d", cts_conn_refcnt); - - cts_mutex_lock(CTS_MUTEX_CONNECTION); - if (1 == cts_conn_refcnt) - { - cts_socket_final(); - cts_deregister_noti(); - cts_db_close(); - cts_conn_refcnt--; - } - else - cts_conn_refcnt--; - cts_mutex_unlock(CTS_MUTEX_CONNECTION); - - return CTS_SUCCESS; -} - -#if 0 -typedef enum { - CTS_DELETE_ALL_CONTACT_OF_ACCOUNT, - CTS_DELETE_ALL_GROUP_OF_ACCOUNT, - CTS_DELETE_ALL_PLOG -}; -int contacts_svc_delete_all(int op_code, int index) -{ - int ret; - cts_stmt stmt = NULL; - char query[CTS_SQL_MAX_LEN] = {0}; - - switch (op_code) - { - case CTS_DELETE_ALL_CONTACT_OF_ACCOUNT: - snprintf(query, sizeof(query), - "DELETE FROM %s WHERE account_id=%d" - CTS_TABLE_CONTACTS, CTS_SCHEMA_NUMBERS, CTS_PLOG_TYPE_MMS_INCOMMING); - break; - case CTS_DELETE_ALL_GROUP_OF_ACCOUNT: - default: - ERR("Invalid op_code. Your op_code(%d) is not supported.", op_code); - return CTS_ERR_ARG_INVALID; - } - - -} -#endif diff --git a/src/cts-service.h b/src/cts-service.h deleted file mode 100755 index 3c358e8..0000000 --- a/src/cts-service.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_SERVICE_H__ -#define __CTS_SERVICE_H__ - -// - -#endif //__CTS_SERVICE_H__ diff --git a/src/cts-socket.c b/src/cts-socket.c deleted file mode 100755 index 29dbf8c..0000000 --- a/src/cts-socket.c +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include -#include - -#include "cts-internal.h" -#include "cts-normalize.h" -#include "cts-socket.h" - -static int cts_csockfd = -1; - -static inline int cts_safe_write(int fd, const char *buf, int buf_size) -{ - int ret, writed=0; - while (buf_size) { - ret = write(fd, buf+writed, buf_size); - if (-1 == ret) { - if (EINTR == errno) - continue; - else - return ret; - } - writed += ret; - buf_size -= ret; - } - return writed; -} - -static inline int cts_safe_read(int fd, char *buf, int buf_size) -{ - int ret, read_size=0; - while (buf_size) { - ret = read(fd, buf+read_size, buf_size); - if (-1 == ret) { - if (EINTR == errno) - continue; - else - return ret; - } - read_size += ret; - buf_size -= ret; - } - return read_size; -} - -static int cts_socket_handle_return(int fd, cts_socket_msg *msg) -{ - CTS_FN_CALL; - int ret; - - ret = cts_safe_read(fd, (char *)msg, sizeof(cts_socket_msg)); - retvm_if(-1 == ret, CTS_ERR_SOCKET_FAILED, "cts_safe_read() Failed(errno = %d)", errno); - - warn_if(CTS_REQUEST_RETURN_VALUE != msg->type, - "Unknown Type(%d), ret=%d, attach_num= %d," - "attach1 = %d, attach2 = %d, attach3 = %d, attach4 = %d", - msg->type, msg->val, msg->attach_num, - msg->attach_sizes[0],msg->attach_sizes[1],msg->attach_sizes[2], - msg->attach_sizes[3]); - - retvm_if(CTS_REQUEST_MAX_ATTACH < msg->attach_num, CTS_ERR_SOCKET_FAILED, - "Invalid msg(attach_num = %d)", msg->attach_num); - - return CTS_SUCCESS; -} - -static void cts_remove_invalid_msg(int fd, int size) -{ - int ret; - char dummy[CTS_SOCKET_MSG_SIZE]; - - while (size) { - if (sizeof(dummy) < size) { - ret = read(fd, dummy, sizeof(dummy)); - if (-1 == ret) { - if (EINTR == errno) - continue; - else - return; - } - size -= ret; - } - else { - ret = read(fd, dummy, size); - if (-1 == ret) { - if (EINTR == errno) - continue; - else - return; - } - size -= ret; - } - } -} - -int cts_request_sim_import(void) -{ - int i, ret; - cts_socket_msg msg={0}; - - retvm_if(-1 == cts_csockfd, CTS_ERR_ENV_INVALID, "socket is not connected"); - - msg.type = CTS_REQUEST_IMPORT_SIM; - ret = cts_safe_write(cts_csockfd, (char *)&msg, sizeof(msg)); - retvm_if(-1 == ret, CTS_ERR_SOCKET_FAILED, "cts_safe_write() Failed(errno = %d)", errno); - - ret = cts_socket_handle_return(cts_csockfd, &msg); - retvm_if(CTS_SUCCESS != ret, ret, "cts_socket_handle_return() Failed(%d)", ret); - CTS_DBG("attach_num = %d", msg.attach_num); - - for (i=0;i - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_SOCKET_H__ -#define __CTS_SOCKET_H__ - -#include "cts-struct.h" -#include "cts-sqlite.h" - -#define CTS_SOCKET_PATH "/opt/data/contacts-svc/.contacts-svc.sock" -#define CTS_SOCKET_MSG_SIZE 128 - -//Message TYPE -enum{ - CTS_REQUEST_RETURN_VALUE, - CTS_REQUEST_IMPORT_SIM, - CTS_REQUEST_NORMALIZE_STR, - CTS_REQUEST_NORMALIZE_NAME, -}; -//#define CTS_REQUEST_IMPORT_SIM "cts_request_import_sim" -//#define CTS_REQUEST_NORMALIZE_STR "cts_request_normalize_str" -//#define CTS_REQUEST_RETURN_VALUE "cts_request_return_value" -#define CTS_REQUEST_MAX_ATTACH 5 - -#define CTS_NS_ATTACH_NUM 1 //NS = Normalize String -#define CTS_NN_ATTACH_NUM 3 //NN = Normalize Name - -typedef struct{ - int type; - int val; - int attach_num; - int attach_sizes[CTS_REQUEST_MAX_ATTACH]; -}cts_socket_msg; - -int cts_socket_init(void); -int cts_request_normalize_name(char dest[][CTS_SQL_MAX_LEN]); -int cts_request_normalize_str(const char * src, char * dest, int dest_size); -int cts_request_sim_import(void); -void cts_socket_final(void); - -#endif //__CTS_SOCKET_H__ - diff --git a/src/cts-sqlite.c b/src/cts-sqlite.c deleted file mode 100755 index 48eebbd..0000000 --- a/src/cts-sqlite.c +++ /dev/null @@ -1,411 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include - -#include "cts-internal.h" -#include "cts-schema.h" -#include "cts-sqlite.h" - -static sqlite3 *cts_db; - -int cts_db_open(void) -{ - CTS_FN_CALL; - int ret; - - if (!cts_db) { - ret = db_util_open(CTS_DB_PATH, &cts_db, 0); - retvm_if(SQLITE_OK != ret, CTS_ERR_DB_NOT_OPENED, - "db_util_open() Failed(%d)", ret); - } - return CTS_SUCCESS; -} - -int cts_db_close(void) -{ - int ret = 0; - - if (cts_db) { - ret = db_util_close(cts_db); - warn_if(SQLITE_OK != ret, "db_util_close() Failed(%d)", ret); - cts_db = NULL; - CTS_DBG("The database disconnected really."); - } - - return CTS_SUCCESS; -} - -int cts_db_change(void) -{ - return sqlite3_changes(cts_db); -} - -int cts_db_get_last_insert_id(void) -{ - return sqlite3_last_insert_rowid(cts_db); -} - -int cts_db_get_next_id(const char *table) -{ - int ret; - char query[CTS_SQL_MAX_LEN] = {0}; - - snprintf(query, sizeof(query), "SELECT seq FROM %s WHERE name = '%s'", - CTS_SCHEMA_SQLITE_SEQ, table); - - ret = cts_query_get_first_int_result(query); - if (ret < CTS_SUCCESS) { - if (CTS_ERR_DB_RECORD_NOT_FOUND == ret) - return 1; - else - return ret; - } else { - return (1 + ret); - } -} - -int cts_query_get_first_int_result(const char *query) -{ - int ret; - cts_stmt stmt = NULL; - retvm_if(NULL == cts_db, CTS_ERR_DB_NOT_OPENED, "Database is not opended"); - - ret = sqlite3_prepare_v2(cts_db, query, strlen(query), &stmt, NULL); - retvm_if(SQLITE_OK != ret, CTS_ERR_DB_FAILED, - "sqlite3_prepare_v2(%s) Failed(%s)", query, sqlite3_errmsg(cts_db)); - - ret = sqlite3_step(stmt); - if (SQLITE_ROW != ret) { - ERR("sqlite3_step() Failed(%d, %s)", ret, sqlite3_errmsg(cts_db)); - sqlite3_finalize(stmt); - if (SQLITE_DONE == ret) return CTS_ERR_DB_RECORD_NOT_FOUND; - return CTS_ERR_DB_FAILED; - } - - ret = sqlite3_column_int(stmt, 0); - sqlite3_finalize(stmt); - - return ret; -} - -int cts_query_exec(char *query) -{ - int ret; - char *err_msg = NULL; - - retvm_if(NULL == cts_db, CTS_ERR_DB_NOT_OPENED, "Database is not opended"); - CTS_DBG("query : %s", query); - - ret = sqlite3_exec(cts_db, query, NULL, NULL, &err_msg); - if (SQLITE_OK != ret) { - ERR("sqlite3_exec(%s) Failed(%d, %s)", query, ret, err_msg); - sqlite3_free(err_msg); - switch (ret) { - case SQLITE_BUSY: - case SQLITE_LOCKED: - return CTS_ERR_DB_LOCK; - case SQLITE_IOERR: - return CTS_ERR_IO_ERR; - case SQLITE_FULL: - return CTS_ERR_NO_SPACE; - default: - return CTS_ERR_DB_FAILED; - } - } - - return CTS_SUCCESS; -} - -cts_stmt cts_query_prepare(char *query) -{ - int ret = -1; - cts_stmt stmt = NULL; - - retvm_if(NULL == cts_db, NULL, "Database is not opended"); - CTS_DBG("prepare query : %s", query); - - ret = sqlite3_prepare_v2(cts_db, query, strlen(query), &stmt, NULL); - retvm_if(SQLITE_OK != ret, NULL, - "sqlite3_prepare_v2(%s) Failed(%s)", query, sqlite3_errmsg(cts_db)); - - return stmt; -} - -int cts_stmt_get_first_int_result(cts_stmt stmt) -{ - int ret; - retvm_if(NULL == cts_db, CTS_ERR_DB_NOT_OPENED, "Database is not opended"); - - ret = sqlite3_step(stmt); - if (SQLITE_ROW != ret) { - ERR("sqlite3_step() Failed(%d, %s)", ret, sqlite3_errmsg(cts_db)); - sqlite3_finalize(stmt); - if (SQLITE_DONE == ret) return CTS_ERR_DB_RECORD_NOT_FOUND; - return CTS_ERR_DB_FAILED; - } - - ret = sqlite3_column_int(stmt, 0); - sqlite3_finalize(stmt); - - return ret; -} - -int cts_stmt_step(cts_stmt stmt) -{ - int ret; - ret = sqlite3_step(stmt); - switch (ret) { - case SQLITE_BUSY: - case SQLITE_LOCKED: - ret = CTS_ERR_DB_LOCK; - break; - case SQLITE_IOERR: - ret = CTS_ERR_IO_ERR; - break; - case SQLITE_FULL: - ret = CTS_ERR_NO_SPACE; - break; - case SQLITE_CONSTRAINT: - ret = CTS_ERR_ALREADY_EXIST; - break; - case SQLITE_ROW: - ret = CTS_TRUE; - break; - case SQLITE_DONE: - ret = CTS_SUCCESS; - break; - default: - ERR("sqlite3_step() Failed(%d)", ret); - ret = CTS_ERR_DB_FAILED; - break; - } - return ret; -} - -void cts_stmt_reset(cts_stmt stmt) -{ - sqlite3_reset(stmt); - sqlite3_clear_bindings(stmt); -} - -void cts_stmt_finalize(cts_stmt stmt) -{ - int ret; - - if (NULL == stmt) - return; - - ret = sqlite3_finalize(stmt); - warn_if(ret != SQLITE_OK, - "sqlite3_finalize Failed(%d, %s)", ret, sqlite3_errmsg(cts_db)); -} - - -int cts_stmt_bind_name(cts_stmt stmt, int start_cnt, cts_name *name_struct) -{ - if (name_struct->first) - sqlite3_bind_text(stmt, start_cnt+1, name_struct->first, - strlen(name_struct->first), SQLITE_STATIC); - if (name_struct->last) - sqlite3_bind_text(stmt, start_cnt+2, name_struct->last, - strlen(name_struct->last), SQLITE_STATIC); - if (name_struct->addition) - sqlite3_bind_text(stmt, start_cnt+3, name_struct->addition, - strlen(name_struct->addition), SQLITE_STATIC); - if (name_struct->display) - sqlite3_bind_text(stmt, start_cnt+4, name_struct->display, - strlen(name_struct->display), SQLITE_STATIC); - if (name_struct->prefix) - sqlite3_bind_text(stmt, start_cnt+5, name_struct->prefix, - strlen(name_struct->prefix), SQLITE_STATIC); - if (name_struct->suffix) - sqlite3_bind_text(stmt, start_cnt+6, name_struct->suffix, - strlen(name_struct->suffix), SQLITE_STATIC); - return start_cnt+7; -} - -int cts_stmt_bind_event(cts_stmt stmt, int start_cnt, cts_event *event_struct) -{ - sqlite3_bind_int(stmt, start_cnt++, event_struct->type); - sqlite3_bind_int(stmt, start_cnt++, event_struct->date); - return CTS_SUCCESS; -} - -int cts_stmt_bind_messenger(cts_stmt stmt, int start_cnt, cts_messenger *im_struct) -{ - sqlite3_bind_int(stmt, start_cnt++, im_struct->type); - if (im_struct->im_id) - sqlite3_bind_text(stmt, start_cnt++, im_struct->im_id, - strlen(im_struct->im_id), SQLITE_STATIC); - return CTS_SUCCESS; -} - -int cts_stmt_bind_postal(cts_stmt stmt, int start_cnt, cts_postal *postal_struct) -{ - sqlite3_bind_int(stmt, start_cnt, postal_struct->type); - if (postal_struct->pobox) - sqlite3_bind_text(stmt, start_cnt+1, postal_struct->pobox, - strlen(postal_struct->pobox), SQLITE_STATIC); - if (postal_struct->postalcode) - sqlite3_bind_text(stmt, start_cnt+2, postal_struct->postalcode, - strlen(postal_struct->postalcode), SQLITE_STATIC); - if (postal_struct->region) - sqlite3_bind_text(stmt, start_cnt+3, postal_struct->region, - strlen(postal_struct->region), SQLITE_STATIC); - if (postal_struct->locality) - sqlite3_bind_text(stmt, start_cnt+4, postal_struct->locality, - strlen(postal_struct->locality), SQLITE_STATIC); - if (postal_struct->street) - sqlite3_bind_text(stmt, start_cnt+5, postal_struct->street, - strlen(postal_struct->street), SQLITE_STATIC); - if (postal_struct->extended) - sqlite3_bind_text(stmt, start_cnt+6, postal_struct->extended, - strlen(postal_struct->extended), SQLITE_STATIC); - if (postal_struct->country) - sqlite3_bind_text(stmt, start_cnt+7, postal_struct->country, - strlen(postal_struct->country), SQLITE_STATIC); - return CTS_SUCCESS; -} - -int cts_stmt_bind_company(cts_stmt stmt, int start_cnt, cts_company *company_struct) -{ - if (company_struct->name) - sqlite3_bind_text(stmt, start_cnt+1, company_struct->name, - strlen(company_struct->name), SQLITE_STATIC); - if (company_struct->department) - sqlite3_bind_text(stmt, start_cnt+2, company_struct->department, - strlen(company_struct->department), SQLITE_STATIC); - if (company_struct->jot_title) - sqlite3_bind_text(stmt, start_cnt+3, company_struct->jot_title, - strlen(company_struct->jot_title), SQLITE_STATIC); - if (company_struct->role) - sqlite3_bind_text(stmt, start_cnt+4, company_struct->role, - strlen(company_struct->role), SQLITE_STATIC); - if (company_struct->assistant_name) - sqlite3_bind_text(stmt, start_cnt+5, company_struct->assistant_name, - strlen(company_struct->assistant_name), SQLITE_STATIC); - return CTS_SUCCESS; -} - -int cts_stmt_bind_web(cts_stmt stmt, int start_cnt, cts_web *web_struct) -{ - sqlite3_bind_int(stmt, start_cnt++, web_struct->type); - if (web_struct->url) - sqlite3_bind_text(stmt, start_cnt++, web_struct->url, - strlen(web_struct->url), SQLITE_STATIC); - return CTS_SUCCESS; -} - -int cts_stmt_bind_extend(cts_stmt stmt, int start_cnt, cts_extend *extend_struct) -{ - sqlite3_bind_int(stmt, start_cnt, extend_struct->data1); - if (extend_struct->data2) - sqlite3_bind_text(stmt, start_cnt+1, extend_struct->data2, - strlen(extend_struct->data2), SQLITE_STATIC); - if (extend_struct->data3) - sqlite3_bind_text(stmt, start_cnt+2, extend_struct->data3, - strlen(extend_struct->data3), SQLITE_STATIC); - if (extend_struct->data4) - sqlite3_bind_text(stmt, start_cnt+3, extend_struct->data4, - strlen(extend_struct->data4), SQLITE_STATIC); - if (extend_struct->data5) - sqlite3_bind_text(stmt, start_cnt+4, extend_struct->data5, - strlen(extend_struct->data5), SQLITE_STATIC); - if (extend_struct->data6) - sqlite3_bind_text(stmt, start_cnt+5, extend_struct->data6, - strlen(extend_struct->data6), SQLITE_STATIC); - if (extend_struct->data7) - sqlite3_bind_text(stmt, start_cnt+6, extend_struct->data7, - strlen(extend_struct->data7), SQLITE_STATIC); - if (extend_struct->data8) - sqlite3_bind_text(stmt, start_cnt+7, extend_struct->data8, - strlen(extend_struct->data8), SQLITE_STATIC); - if (extend_struct->data9) - sqlite3_bind_text(stmt, start_cnt+8, extend_struct->data9, - strlen(extend_struct->data9), SQLITE_STATIC); - if (extend_struct->data10) - sqlite3_bind_text(stmt, start_cnt+9, extend_struct->data10, - strlen(extend_struct->data10), SQLITE_STATIC); - return CTS_SUCCESS; -} - -int cts_stmt_get_addressbook(cts_stmt stmt, cts_addrbook *ab) -{ - int cnt = 0; - char *temp; - - ab->id = cts_stmt_get_int(stmt, cnt++); - temp = cts_stmt_get_text(stmt, cnt++); - ab->name = SAFE_STRDUP(temp); - ab->acc_id = cts_stmt_get_int(stmt, cnt++); - ab->acc_type = cts_stmt_get_int(stmt, cnt++); - ab->mode = cts_stmt_get_int(stmt, cnt++); - - return CTS_SUCCESS; -} - -int cts_stmt_get_number(cts_stmt stmt, cts_number *result, int start_cnt) -{ - char *temp; - - result->id = cts_stmt_get_int(stmt, start_cnt++); - result->type = cts_stmt_get_int(stmt, start_cnt++); - temp = cts_stmt_get_text(stmt, start_cnt++); - result->number = SAFE_STRDUP(temp); - - return start_cnt; -} - -int cts_stmt_get_email(cts_stmt stmt, cts_email *result, int start_cnt) -{ - char *temp; - - result->id = cts_stmt_get_int(stmt, start_cnt++); - result->type = cts_stmt_get_int(stmt, start_cnt++); - temp = cts_stmt_get_text(stmt, start_cnt++); - result->email_addr = SAFE_STRDUP(temp); - - return start_cnt; -} - -int cts_stmt_get_name(cts_stmt stmt, cts_name *result, int start_cnt) -{ - char *temp; - - result->id = cts_stmt_get_int(stmt, start_cnt++); - result->lang_type = cts_stmt_get_int(stmt, start_cnt++); - temp = cts_stmt_get_text(stmt, start_cnt++); - result->first = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, start_cnt++); - result->last = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, start_cnt++); - result->addition = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, start_cnt++); - result->display = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, start_cnt++); - result->prefix = SAFE_STRDUP(temp); - temp = cts_stmt_get_text(stmt, start_cnt++); - result->suffix = SAFE_STRDUP(temp); - - return CTS_SUCCESS; -} - diff --git a/src/cts-struct-ext.c b/src/cts-struct-ext.c deleted file mode 100755 index 79032cb..0000000 --- a/src/cts-struct-ext.c +++ /dev/null @@ -1,745 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include "cts-internal.h" -#include "cts-utils.h" -#include "cts-struct.h" -#include "cts-struct-ext.h" - -#define CTS_VCARD_MOVE_TO(orig, src, check) \ - do{ \ - if (NULL == orig && NULL != src) { \ - orig = src; \ - check = true; \ - src = NULL; \ - } \ - }while(false) - -static inline int cts_merge_vcard_base(cts_ct_base *orig, cts_ct_base *addition) -{ - int ret; - char dest[CTS_IMG_PATH_SIZE_MAX]; - - retvm_if(NULL == addition, CTS_ERR_ARG_INVALID, "Invalid addition(%p)", addition); - - if (NULL == orig->img_path) { - if (orig->id && addition->img_path) { - ret = snprintf(dest, sizeof(dest), "%s/%d-%d.", CTS_IMAGE_LOCATION, - orig->id, CTS_IMG_NORMAL); - if (0 != strncmp(dest, addition->img_path, ret)) { - orig->img_path = addition->img_path; - orig->img_changed = true; - addition->img_path = NULL; - } - } else { - orig->img_path = addition->img_path; - orig->img_changed = true; - addition->img_path = NULL; - } - } - - if (NULL == orig->full_img_path) { - if (orig->id && addition->full_img_path) { - ret = snprintf(dest, sizeof(dest), "%s/%d-%d.", CTS_IMAGE_LOCATION, - orig->id, CTS_IMG_FULL); - if (0 != strncmp(dest, addition->full_img_path, ret)) { - orig->full_img_path = addition->full_img_path; - orig->full_img_changed = true; - addition->full_img_path = NULL; - } - } else { - orig->full_img_path = addition->full_img_path; - orig->full_img_changed = true; - addition->full_img_path = NULL; - } - } - - CTS_VCARD_MOVE_TO(orig->uid, addition->uid, orig->uid_changed); - CTS_VCARD_MOVE_TO(orig->note, addition->note, orig->note_changed); - CTS_VCARD_MOVE_TO(orig->ringtone_path, addition->ringtone_path, orig->ringtone_changed); - if (NULL == orig->vcard_img_path) { - orig->vcard_img_path = addition->vcard_img_path; - addition->vcard_img_path = NULL; - } - - return CTS_SUCCESS; -} - -static inline int cts_merge_vcard_name(cts_name *orig, cts_name *addition) -{ - retvm_if(NULL == addition, CTS_ERR_ARG_INVALID, "Invalid addition(%p)", addition); - - if (NULL == orig->first && NULL == orig->last) { - CTS_VCARD_MOVE_TO(orig->first, addition->first, orig->is_changed); - CTS_VCARD_MOVE_TO(orig->last, addition->last, orig->is_changed); - } - CTS_VCARD_MOVE_TO(orig->addition, addition->addition, orig->is_changed); - CTS_VCARD_MOVE_TO(orig->display, addition->display, orig->is_changed); - CTS_VCARD_MOVE_TO(orig->prefix, addition->prefix, orig->is_changed); - CTS_VCARD_MOVE_TO(orig->suffix, addition->suffix, orig->is_changed); - - return CTS_SUCCESS; -} - -static inline GSList* cts_merge_vcard_numbers(GSList *orig, GSList *addition) -{ - GSList *i, *j; - for (i=addition;i;i=i->next) { - cts_number *addition = i->data; - - if (NULL == addition->number) continue; - - for (j=orig;j;j=j->next) { - cts_number *org = j->data; - if (org->deleted) continue; - if (addition->number && org->number - && 0 == strcmp(addition->number, org->number)) - break; - } - if (NULL == j) { - orig = g_slist_append(orig, addition); - i->data = NULL; - } - } - - return orig; -} - -static inline GSList* cts_merge_vcard_emails(GSList *orig, GSList *addition) -{ - GSList *i, *j; - for (i=addition;i;i=i->next) { - cts_email *addition = i->data; - - if (NULL == addition->email_addr) continue; - - for (j=orig;j;j=j->next) { - cts_email *org = j->data; - if (org->deleted) continue; - if (addition->email_addr && org->email_addr - && 0 == strcmp(addition->email_addr, org->email_addr)) - break; - } - if (NULL == j) { - orig = g_slist_append(orig, addition); - i->data = NULL; - } - } - - return orig; -} - -static inline GSList* cts_merge_vcard_events(GSList *orig, GSList *addition) -{ - GSList *i, *j; - for (i=addition;i;i=i->next) { - cts_event *addition = i->data; - for (j=orig;j;j=j->next) { - cts_event *org = j->data; - if (org->deleted) continue; - if (addition->date == org->date) - break; - } - if (NULL == j) { - orig = g_slist_append(orig, addition); - i->data = NULL; - } - } - - return orig; -} - -static inline GSList* cts_merge_vcard_postals(GSList *orig, GSList *addition) -{ - GSList *i, *j; - for (i=addition;i;i=i->next) { - cts_postal *addition = i->data; - for (j=orig;j;j=j->next) { - cts_postal *org = j->data; - if (org->deleted) continue; - char *s1, *s2; - s1 = addition->pobox; - s2 = org->pobox; - if (s1 == s2 || (s1 && s2 && 0 == strcmp(s1, s2))) { - s1 = addition->postalcode; - s2 = org->postalcode; - if (s1 == s2 || (s1 && s2 && 0 == strcmp(s1, s2))) { - s1 = addition->region; - s2 = org->region; - if (s1 == s2 || (s1 && s2 && 0 == strcmp(s1, s2))) { - s1 = addition->locality; - s2 = org->locality; - if (s1 == s2 || (s1 && s2 && 0 == strcmp(s1, s2))) { - s1 = addition->street; - s2 = org->street; - if (s1 == s2 || (s1 && s2 && 0 == strcmp(s1, s2))) { - s1 = addition->extended; - s2 = org->extended; - if (s1 == s2 || (s1 && s2 && 0 == strcmp(s1, s2))) { - s1 = addition->country; - s2 = org->country; - if (s1 == s2 || (s1 && s2 && 0 == strcmp(s1, s2))) { - break; - } - } - } - } - } - } - } - } - if (NULL == j) { - orig = g_slist_append(orig, addition); - i->data = NULL; - } - } - - return orig; -} - -static inline GSList* cts_merge_vcard_webs(GSList *orig, GSList *addition) -{ - GSList *i, *j; - for (i=addition;i;i=i->next) { - cts_web *addition = i->data; - - if (NULL == addition->url) continue; - - for (j=orig;j;j=j->next) { - cts_web *org = j->data; - if (org->deleted) continue; - if (addition->url && org->url - && 0 == strcmp(addition->url, org->url)) - break; - } - if (NULL == j) { - orig = g_slist_append(orig, addition); - i->data = NULL; - } - } - - return orig; -} - -static inline GSList* cts_merge_vcard_nicknames(GSList *orig, GSList *addition) -{ - GSList *i, *j; - for (i=addition;i;i=i->next) { - cts_nickname *addition = i->data; - - if (NULL == addition->nick) continue; - - for (j=orig;j;j=j->next) { - cts_nickname *org = j->data; - if (org->deleted) continue; - if (addition->nick && org->nick - && 0 == strcmp(addition->nick, org->nick)) - break; - } - if (NULL == j) { - orig = g_slist_append(orig, addition); - i->data = NULL; - } - } - - return orig; -} - -static inline GSList* cts_merge_vcard_extends(GSList *orig, GSList *addition) -{ - GSList *d, *t; - cts_extend *orig_val, *addition_val; - - for (d=addition;d;d=d->next) { - addition_val = d->data; - - for (t=orig;t;t=t->next) { - orig_val = t->data; - if (orig_val->deleted) continue; - if (addition_val->type == orig_val->type) - break; - } - if (NULL == t) { - orig = g_slist_append(orig, addition_val); - d->data = NULL; - } - } - - return orig; -} - -static inline int cts_merge_vcard_company(cts_company *orig, cts_company *addition) -{ - bool temp; - - retvm_if(NULL == addition, CTS_ERR_ARG_INVALID, "Invalid addition(%p)", addition); - - CTS_VCARD_MOVE_TO(orig->name, addition->name, temp); - CTS_VCARD_MOVE_TO(orig->department, addition->department, temp); - CTS_VCARD_MOVE_TO(orig->jot_title, addition->jot_title, temp); - CTS_VCARD_MOVE_TO(orig->role, addition->role, temp); - CTS_VCARD_MOVE_TO(orig->assistant_name, addition->assistant_name, temp); - - return CTS_SUCCESS; -} - -static inline GSList* cts_merge_vcard_grouprel(GSList *orig, GSList *addition) -{ - GSList *i, *j; - for (i=addition;i;i=i->next) { - cts_group *addition = i->data; - - if (0 == addition->id) continue; - - for (j=orig;j;j=j->next) { - cts_group *org = j->data; - if (org->deleted) continue; - if (addition->id == org->id) - break; - } - if (NULL == j) { - orig = g_slist_append(orig, addition); - i->data = NULL; - } - } - - return orig; -} - -API int contacts_svc_struct_merge(CTSstruct *s1, CTSstruct *s2) -{ - contact_t *orig, *addition; - - retv_if(NULL == s1, CTS_ERR_ARG_NULL); - retv_if(NULL == s2, CTS_ERR_ARG_NULL); - - orig = (contact_t *)s1; - addition = (contact_t *)s2; - - if (orig->base) { - cts_merge_vcard_base(orig->base, addition->base); - } else { - orig->base = addition->base; - addition->base = NULL; - } - - if (orig->name) { - cts_merge_vcard_name(orig->name, addition->name); - } else { - orig->name = addition->name; - addition->name = NULL; - } - - if (orig->numbers) { - orig->numbers = - cts_merge_vcard_numbers(orig->numbers, addition->numbers); - } else { - orig->numbers = addition->numbers; - addition->numbers = NULL; - } - - if (orig->emails) { - orig->emails = - cts_merge_vcard_emails(orig->emails, addition->emails); - } else { - orig->emails = addition->emails; - addition->emails = NULL; - } - //orig->grouprelations does not support. - - if (orig->events) { - orig->events = - cts_merge_vcard_events(orig->events, addition->events); - } else { - orig->events = addition->events; - addition->events = NULL; - } - //orig->messengers does not support. - - if (orig->postal_addrs) { - orig->postal_addrs = - cts_merge_vcard_postals(orig->postal_addrs, addition->postal_addrs); - } else { - orig->postal_addrs = addition->postal_addrs; - addition->postal_addrs = NULL; - } - - if (orig->web_addrs) { - orig->web_addrs = - cts_merge_vcard_webs(orig->web_addrs, addition->web_addrs); - } else { - orig->web_addrs = addition->web_addrs; - addition->web_addrs = NULL; - } - - if (orig->nicknames) { - orig->nicknames = - cts_merge_vcard_nicknames(orig->nicknames, addition->nicknames); - } else { - orig->nicknames = addition->nicknames; - addition->nicknames = NULL; - } - - if (orig->company) { - cts_merge_vcard_company(orig->company, addition->company); - } else { - orig->company = addition->company; - addition->company = NULL; - } - - if (orig->grouprelations) { - cts_merge_vcard_grouprel(orig->grouprelations, addition->grouprelations); - } else { - orig->grouprelations = addition->grouprelations; - addition->grouprelations = NULL; - } - - if (orig->extended_values) { - orig->extended_values = - cts_merge_vcard_extends(orig->extended_values, addition->extended_values); - } else { - orig->extended_values = addition->extended_values; - addition->extended_values = NULL; - } - - return CTS_SUCCESS; -} - -static inline cts_ct_base* cts_struct_dup_base(const cts_ct_base *src) -{ - cts_ct_base *result = NULL; - if (src) { - result = calloc(1, sizeof(cts_ct_base)); - retvm_if(NULL == result, NULL, "calloc() Failed"); - - memcpy(result, src, sizeof(cts_ct_base)); - - if (src->uid) - result->uid = strdup(src->uid); - if (src->img_path) - result->img_path = strdup(src->img_path); - if (src->full_img_path) - result->full_img_path = strdup(src->full_img_path); - if (src->ringtone_path) - result->ringtone_path = strdup(src->ringtone_path); - if (src->note) - result->note = strdup(src->note); - if (src->vcard_img_path) - result->vcard_img_path = strdup(src->vcard_img_path); - } - - return result; -} - -static inline cts_name* cts_struct_dup_name(const cts_name *src) -{ - cts_name *result = NULL; - if (src) { - result = calloc(1, sizeof(cts_name)); - retvm_if(NULL == result, NULL, "calloc() Failed"); - - memcpy(result, src, sizeof(cts_name)); - - if (src->first) - result->first = strdup(src->first); - if (src->last) - result->last = strdup(src->last); - if (src->addition) - result->addition = strdup(src->addition); - if (src->display) - result->display = strdup(src->display); - if (src->prefix) - result->prefix = strdup(src->prefix); - if (src->suffix) - result->suffix = strdup(src->suffix); - } - - return result; -} - -static inline cts_number* cts_struct_dup_number(const cts_number *src) -{ - cts_number *result = NULL; - if (src) { - result = calloc(1, sizeof(cts_number)); - retvm_if(NULL == result, NULL, "calloc() Failed"); - - memcpy(result, src, sizeof(cts_number)); - - if (src->number) - result->number = strdup(src->number); - } - - return result; -} - -static inline cts_email* cts_struct_dup_email(const cts_email *src) -{ - cts_email *result = NULL; - if (src) { - result = calloc(1, sizeof(cts_email)); - retvm_if(NULL == result, NULL, "calloc() Failed"); - - memcpy(result, src, sizeof(cts_email)); - - if (src->email_addr) - result->email_addr = strdup(src->email_addr); - } - - return result; -} - -static inline cts_web* cts_struct_dup_web(const cts_web *src) -{ - cts_web *result = NULL; - if (src) { - result = calloc(1, sizeof(cts_web)); - retvm_if(NULL == result, NULL, "calloc() Failed"); - - memcpy(result, src, sizeof(cts_web)); - - if (src->url) - result->url = strdup(src->url); - } - - return result; -} - -static inline cts_postal* cts_struct_dup_postal(const cts_postal *src) -{ - cts_postal *result = NULL; - if (src) { - result = calloc(1, sizeof(cts_postal)); - retvm_if(NULL == result, NULL, "calloc() Failed"); - - memcpy(result, src, sizeof(cts_postal)); - - if (src->pobox) - result->pobox = strdup(src->pobox); - if (src->postalcode) - result->postalcode = strdup(src->postalcode); - if (src->region) - result->region = strdup(src->region); - if (src->locality) - result->locality = strdup(src->locality); - if (src->street) - result->street = strdup(src->street); - if (src->extended) - result->extended = strdup(src->extended); - if (src->country) - result->country = strdup(src->country); - } - - return result; -} - -static inline cts_event* cts_struct_dup_event(const cts_event *src) -{ - cts_event *result = NULL; - if (src) { - result = calloc(1, sizeof(cts_event)); - retvm_if(NULL == result, NULL, "calloc() Failed"); - - memcpy(result, src, sizeof(cts_event)); - } - - return result; -} - -static inline cts_messenger* cts_struct_dup_messenger(const cts_messenger *src) -{ - cts_messenger *result = NULL; - if (src) { - result = calloc(1, sizeof(cts_messenger)); - retvm_if(NULL == result, NULL, "calloc() Failed"); - - memcpy(result, src, sizeof(cts_messenger)); - - if (src->im_id) - result->im_id = strdup(src->im_id); - } - - return result; -} - -static inline cts_group* cts_struct_dup_grouprel(const cts_group *src) -{ - cts_group *result = NULL; - if (src) { - result = calloc(1, sizeof(cts_group)); - retvm_if(NULL == result, NULL, "calloc() Failed"); - - memcpy(result, src, sizeof(cts_group)); - - if (src->name) - result->name = strdup(src->name); - if (src->ringtone_path) - result->ringtone_path = strdup(src->ringtone_path); - } - - return result; -} - -static inline cts_extend* cts_struct_dup_extend(const cts_extend *src) -{ - cts_extend *result = NULL; - if (src) { - result = calloc(1, sizeof(cts_extend)); - retvm_if(NULL == result, NULL, "calloc() Failed"); - - memcpy(result, src, sizeof(cts_extend)); - - if (src->data2) - result->data2 = strdup(src->data2); - if (src->data3) - result->data3 = strdup(src->data3); - if (src->data4) - result->data4 = strdup(src->data4); - if (src->data5) - result->data5 = strdup(src->data5); - if (src->data6) - result->data6 = strdup(src->data6); - if (src->data7) - result->data7 = strdup(src->data7); - if (src->data8) - result->data8 = strdup(src->data8); - if (src->data9) - result->data9 = strdup(src->data9); - if (src->data10) - result->data10 = strdup(src->data10); - } - - return result; -} - -static inline cts_nickname* cts_struct_dup_nick(const cts_nickname *src) -{ - cts_nickname *result = NULL; - if (src) { - result = calloc(1, sizeof(cts_nickname)); - retvm_if(NULL == result, NULL, "calloc() Failed"); - - memcpy(result, src, sizeof(cts_nickname)); - - if (src->nick) - result->nick = strdup(src->nick); - } - - return result; -} - -static inline GSList* cts_struct_dup_list(int type, GSList *src) -{ - GSList *cur, *result = NULL; - if (src) { - result = g_slist_copy(src); - - for (cur=result;cur;cur=cur->next) { - switch (type) { - case CTS_VALUE_NUMBER: - cur->data = cts_struct_dup_number(cur->data); - break; - case CTS_VALUE_EMAIL: - cur->data = cts_struct_dup_email(cur->data); - break; - case CTS_VALUE_WEB: - cur->data = cts_struct_dup_web(cur->data); - break; - case CTS_VALUE_POSTAL: - cur->data = cts_struct_dup_postal(cur->data); - break; - case CTS_VALUE_EVENT: - cur->data = cts_struct_dup_event(cur->data); - break; - case CTS_VALUE_MESSENGER: - cur->data = cts_struct_dup_messenger(cur->data); - break; - case CTS_VALUE_GROUP_RELATION: - cur->data = cts_struct_dup_grouprel(cur->data); - break; - case CTS_VALUE_EXTEND: - cur->data = cts_struct_dup_extend(cur->data); - break; - case CTS_VALUE_NICKNAME: - cur->data = cts_struct_dup_nick(cur->data); - break; - default: - ERR("invalid type(%d)", type); - break; - } - } - } - - return result; -} - -static inline cts_company* cts_struct_dup_company(const cts_company *src) -{ - cts_company *result = NULL; - if (src) { - result = calloc(1, sizeof(cts_company)); - retvm_if(NULL == result, NULL, "calloc() Failed"); - - memcpy(result, src, sizeof(cts_company)); - - if (src->name) - result->name = strdup(src->name); - if (src->department) - result->department = strdup(src->department); - if (src->jot_title) - result->jot_title = strdup(src->jot_title); - if (src->role) - result->role = strdup(src->role); - if (src->assistant_name) - result->assistant_name = strdup(src->assistant_name); - } - - return result; -} - -API CTSstruct* contacts_svc_struct_duplicate(const CTSstruct *contact) -{ - contact_t *src, *result = NULL; - - retvm_if(NULL == contact, NULL, "contact is NULL"); - - src = (contact_t *)contact; - result = (contact_t *)contacts_svc_struct_new(CTS_STRUCT_CONTACT); - retvm_if(NULL == result, NULL, "contacts_svc_struct_new() Failed"); - - result->base = cts_struct_dup_base(src->base); - result->name = cts_struct_dup_name(src->name); - result->numbers = cts_struct_dup_list(CTS_VALUE_NUMBER, src->numbers); - result->emails = cts_struct_dup_list(CTS_VALUE_EMAIL, src->emails); - result->web_addrs = cts_struct_dup_list(CTS_VALUE_WEB, src->web_addrs); - result->postal_addrs = cts_struct_dup_list(CTS_VALUE_POSTAL, src->postal_addrs); - result->events = cts_struct_dup_list(CTS_VALUE_EVENT, src->events); - result->messengers = cts_struct_dup_list(CTS_VALUE_MESSENGER, src->messengers); - result->grouprelations = cts_struct_dup_list(CTS_VALUE_GROUP_RELATION, src->grouprelations); - result->company = cts_struct_dup_company(src->company); - result->extended_values = cts_struct_dup_list(CTS_VALUE_EXTEND, src->extended_values); - result->nicknames = cts_struct_dup_list(CTS_VALUE_NICKNAME, src->nicknames); - - result->default_num = src->default_num; - result->default_email = src->default_email; - - return (CTSstruct *)result; -} - diff --git a/src/cts-struct-ext.h b/src/cts-struct-ext.h deleted file mode 100755 index 88c373c..0000000 --- a/src/cts-struct-ext.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_STRUCT_EXT_H__ -#define __CTS_STRUCT_EXT_H__ - -// - -#endif //__CTS_STRUCT_EXT_H__ - diff --git a/src/cts-struct.c b/src/cts-struct.c deleted file mode 100755 index e701f2c..0000000 --- a/src/cts-struct.c +++ /dev/null @@ -1,2927 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include - -#include "cts-internal.h" -#include "cts-list.h" -#include "cts-utils.h" - -static contact_list *contact_list_mempool=NULL; -static plog_list *plog_list_mempool=NULL; -static change_list *change_list_mempool=NULL; -static numtype_list *numtype_list_mempool=NULL; -static shortcut_list *favorite_list_mempool=NULL; -static cts_group *group_list_mempool=NULL; -static cts_addrbook *addrbook_list_mempool=NULL; -static sdn_list *sdn_list_mempool=NULL; - -API CTSstruct* contacts_svc_struct_new(cts_struct_type type) -{ - CTSstruct* ret_val; - switch (type) - { - case CTS_STRUCT_CONTACT: - ret_val = (CTSstruct*)calloc(1, sizeof(contact_t)); - if (ret_val) ret_val->s_type = CTS_STRUCT_CONTACT; - return ret_val; - default: - ERR("your type is Not supported"); - return NULL; - } -} - -static void cts_number_free(gpointer data, gpointer user_data) -{ - if (NULL == data || !((cts_number*)data)->embedded) - return; - - free(((cts_number*)data)->number); - free(((cts_number*)data)->added_type); - free(data); -} -static void cts_email_free(gpointer data, gpointer user_data) -{ - if (NULL == data || !((cts_email*)data)->embedded) - return; - - free(((cts_email*)data)->email_addr); - free(data); -} -static void cts_group_free(gpointer data, gpointer user_data) -{ - cts_group* data0 = (cts_group*)data; - - if (NULL == data || !data0->embedded) - return; - - free(data0->name); - free(data0->ringtone_path); - free(data0->vcard_group); - free(data); -} -static void cts_event_free(gpointer data, gpointer user_data) -{ - if (NULL == data || !((cts_event*)data)->embedded) - return; - - free(data); -} -static void cts_messenger_free(gpointer data, gpointer user_data) -{ - if (NULL == data || !((cts_messenger*)data)->embedded) - return; - - free(((cts_messenger*)data)->im_id); - free(data); -} -static void cts_postal_free(gpointer data, gpointer user_data) -{ - cts_postal *data0 = (cts_postal *)data; - - if (NULL == data0 || !data0->embedded) - return; - - free(data0->pobox); - free(data0->postalcode); - free(data0->region); - free(data0->locality); - free(data0->street); - free(data0->extended); - free(data0->country); - free(data); -} -static void cts_web_free(gpointer data, gpointer user_data) -{ - if (NULL == data || !((cts_web*)data)->embedded) - return; - - free(((cts_web*)data)->url); - free(data); -} -static void cts_nickname_free(gpointer data, gpointer user_data) -{ - if (NULL == data || !((cts_nickname*)data)->embedded) - return; - - free(((cts_nickname*)data)->nick); - free(data); -} - -static void cts_extend_free(gpointer data, gpointer user_data) -{ - cts_extend *data0 = (cts_extend *)data; - if (NULL == data0 || !data0->embedded) - return; - - free(data0->data2); - free(data0->data3); - free(data0->data4); - free(data0->data5); - free(data0->data6); - free(data0->data7); - free(data0->data8); - free(data0->data9); - free(data0->data10); - free(data); -} - -static inline void cts_name_free(cts_name *name) -{ - if (!name->embedded) - return; - - free(name->first); - free(name->last); - free(name->addition); - free(name->display); - free(name->prefix); - free(name->suffix); - free(name); -} - -static inline void cts_company_free(cts_company *company) -{ - if (!company->embedded) - return; - - free(company->name); - free(company->department); - free(company->jot_title); - free(company->role); - free(company->assistant_name); - free(company); -} - -static inline void cts_contact_free(contact_t *contact) -{ - if (contact->base && contact->base->embedded) { - free(contact->base->uid); - free(contact->base->img_path); - free(contact->base->full_img_path); - free(contact->base->ringtone_path); - free(contact->base->note); - - if (contact->base->vcard_img_path) { - unlink(contact->base->vcard_img_path); - free(contact->base->vcard_img_path); - } - - free(contact->base); - } - - if (contact->name) - cts_name_free(contact->name); - - if (contact->company) - cts_company_free(contact->company); - - if (contact->numbers) { - g_slist_foreach(contact->numbers, cts_number_free, NULL); - g_slist_free(contact->numbers); - } - - if (contact->emails) { - g_slist_foreach(contact->emails, cts_email_free, NULL); - g_slist_free(contact->emails); - } - - if (contact->grouprelations) { - g_slist_foreach(contact->grouprelations, cts_group_free, NULL); - g_slist_free(contact->grouprelations); - } - - if (contact->events) { - g_slist_foreach(contact->events, cts_event_free, NULL); - g_slist_free(contact->events); - } - - if (contact->messengers) { - g_slist_foreach(contact->messengers, cts_messenger_free, NULL); - g_slist_free(contact->messengers); - } - - if (contact->postal_addrs) { - g_slist_foreach(contact->postal_addrs, cts_postal_free, NULL); - g_slist_free(contact->postal_addrs); - } - - if (contact->web_addrs) { - g_slist_foreach(contact->web_addrs, cts_web_free, NULL); - g_slist_free(contact->web_addrs); - } - - if (contact->nicknames) { - g_slist_foreach(contact->nicknames, cts_nickname_free, NULL); - g_slist_free(contact->nicknames); - } - - if (contact->extended_values) { - g_slist_foreach(contact->extended_values, cts_extend_free, NULL); - g_slist_free(contact->extended_values); - } -} - -API int contacts_svc_struct_free(CTSstruct* structure) -{ - retv_if(NULL == structure, CTS_ERR_ARG_NULL); - - switch (structure->s_type) - { - case CTS_STRUCT_CONTACT: - cts_contact_free((contact_t *)structure); - free(structure); - break; - default: - ERR("The structure type(%d) is Not valid", structure->s_type); - return CTS_ERR_ARG_INVALID; - } - return CTS_SUCCESS; -} - -API int contacts_svc_struct_get_list(CTSstruct *contact, - cts_struct_field field, GSList** retlist) -{ - contact_t *record = (contact_t *)contact; - - retv_if(NULL == contact, CTS_ERR_ARG_NULL); - retv_if(NULL == retlist, CTS_ERR_ARG_NULL); - retvm_if(CTS_STRUCT_CONTACT != contact->s_type, CTS_ERR_ARG_INVALID, - "The contact(%d) must be type of CTS_STRUCT_CONTACT.", contact->s_type); - - switch (field) - { - case CTS_CF_NUMBER_LIST: - *retlist = record->numbers; - break; - case CTS_CF_EMAIL_LIST: - *retlist = record->emails; - break; - case CTS_CF_GROUPREL_LIST: - *retlist = record->grouprelations; - break; - case CTS_CF_EVENT_LIST: - *retlist = record->events; - break; - case CTS_CF_MESSENGER_LIST: - *retlist = record->messengers; - break; - case CTS_CF_POSTAL_ADDR_LIST: - *retlist = record->postal_addrs; - break; - case CTS_CF_WEB_ADDR_LIST: - *retlist = record->web_addrs; - break; - case CTS_CF_NICKNAME_LIST: - *retlist = record->nicknames; - break; - default: - ERR("The parameter(field) is invalid" - "You MUST be (CTS_CF_VALUE_MAX < field < CTS_CF_FIELD_MAX)."); - return CTS_ERR_ARG_INVALID; - } - - if (NULL == *retlist) return CTS_ERR_NO_DATA; - - return CTS_SUCCESS; -} - -static cts_extend* cts_extend_slist_search(int type, GSList *list) -{ - cts_extend *tmp_extend; - GSList *tmp_gslist=list; - while (tmp_gslist) - { - tmp_extend = tmp_gslist->data; - retvm_if(CTS_VALUE_EXTEND != tmp_extend->v_type, NULL, - "List has other type"); - if (tmp_extend->type == type) return tmp_extend; - - tmp_gslist = tmp_gslist->next; - } - return NULL; -} - -static inline int cts_contact_get_value(contact_t *contact, - cts_struct_field field, CTSvalue** retval) -{ - - switch (field) - { - case CTS_CF_NAME_VALUE: - *retval = (CTSvalue *)contact->name; - break; - case CTS_CF_BASE_INFO_VALUE: - *retval = (CTSvalue *)contact->base; - break; - case CTS_CF_COMPANY_VALUE: - *retval = (CTSvalue *)contact->company; - break; - default: - if ((int)CTS_DATA_EXTEND_START <= field) { - *retval = (CTSvalue *)cts_extend_slist_search(field, - contact->extended_values); - return CTS_SUCCESS; - } - ERR("The parameter(field:%d) is not interpreted", field); - return CTS_ERR_ARG_INVALID; - } - return CTS_SUCCESS; -} - -API int contacts_svc_struct_get_value(CTSstruct *structure, - cts_struct_field field, CTSvalue **retval) -{ - int ret; - - retv_if(NULL == structure, CTS_ERR_ARG_NULL); - retv_if(NULL == retval, CTS_ERR_ARG_NULL); - - switch (structure->s_type) - { - case CTS_STRUCT_CONTACT: - ret = cts_contact_get_value((contact_t *)structure, field, retval); - if (CTS_SUCCESS != ret) - return ret; - break; - default: - ERR("The structure type(%d) is Not valid", structure->s_type); - return CTS_ERR_ARG_INVALID; - } - - if (NULL == *retval) return CTS_ERR_NO_DATA; - return CTS_SUCCESS; -} - -#define CTS_REMOVE_GSLIST_ITEM(type, loc) \ - do { \ - cts_##type##_free(tmp_##type, NULL); \ - if (prev) { \ - prev->next = tmp_gslist->next; \ - g_slist_free_1(tmp_gslist); \ - tmp_gslist = prev->next; \ - } \ - else { \ - contact->loc = tmp_gslist->next; \ - g_slist_free_1(tmp_gslist); \ - tmp_gslist = contact->loc; \ - } \ - }while(false) - -static inline int cts_struct_store_num_list(contact_t *contact, GSList* list) -{ - cts_number *tmp_number; - - GSList *new_gslist=NULL, *tmp_gslist=list, *prev=NULL; - if (contact->numbers && tmp_gslist == contact->numbers) - { - while (tmp_gslist) - { - tmp_number = tmp_gslist->data; - if (tmp_number) - { - retvm_if(CTS_VALUE_NUMBER != tmp_number->v_type, CTS_ERR_ARG_INVALID, - "List has other type"); - - if (!tmp_number->id && tmp_number->deleted) - { - CTS_REMOVE_GSLIST_ITEM(number, numbers); - continue; - } - - if (!tmp_number->embedded) - { - tmp_number->embedded = true; - tmp_number->number = SAFE_STRDUP(tmp_number->number); - } - } - prev = tmp_gslist; - tmp_gslist = tmp_gslist->next; - } - } - else - { - while (tmp_gslist) - { - tmp_number = tmp_gslist->data; - if (tmp_number) - { - retvm_if(tmp_number && CTS_VALUE_NUMBER != tmp_number->v_type, CTS_ERR_ARG_INVALID, - "List has other type"); - if (!tmp_number->embedded) - { - tmp_number->embedded = true; - tmp_number->number = SAFE_STRDUP(tmp_number->number); - new_gslist = g_slist_append(new_gslist, tmp_number); - } - } - tmp_gslist = tmp_gslist->next; - } - contact->numbers = g_slist_concat(contact->numbers, new_gslist); - } - return CTS_SUCCESS; -} - -static inline int cts_struct_store_email_list(contact_t *contact, GSList* list) -{ - cts_email *tmp_email; - - GSList *new_gslist=NULL, *tmp_gslist=list, *prev=NULL; - if (contact->emails && tmp_gslist == contact->emails) - { - while (tmp_gslist) - { - tmp_email = tmp_gslist->data; - if (tmp_email) - { - retvm_if(CTS_VALUE_EMAIL != tmp_email->v_type, CTS_ERR_ARG_INVALID, - "List has other type"); - - if (!tmp_email->id && tmp_email->deleted) { - CTS_REMOVE_GSLIST_ITEM(email, emails); - continue; - } - - if (!tmp_email->embedded) - { - tmp_email->embedded = true; - tmp_email->email_addr = SAFE_STRDUP(tmp_email->email_addr); - } - } - prev = tmp_gslist; - tmp_gslist = tmp_gslist->next; - } - } - else - { - while (tmp_gslist) - { - tmp_email = tmp_gslist->data; - if (tmp_email) - { - retvm_if(CTS_VALUE_EMAIL != tmp_email->v_type, CTS_ERR_ARG_INVALID, - "List has other type"); - if (!tmp_email->embedded) - { - tmp_email->embedded = true; - tmp_email->email_addr = SAFE_STRDUP(tmp_email->email_addr); - new_gslist = g_slist_append(new_gslist, tmp_email); - } - } - tmp_gslist = tmp_gslist->next; - } - contact->emails = g_slist_concat(contact->emails, new_gslist); - } - return CTS_SUCCESS; -} - -static inline int cts_struct_store_grouprel_list(contact_t *contact, GSList* list) -{ - cts_group *tmp_group; - - GSList *new_gslist=NULL, *tmp_gslist=list, *prev=NULL; - if (contact->grouprelations && tmp_gslist == contact->grouprelations) - { - while (tmp_gslist) - { - tmp_group = tmp_gslist->data; - if (tmp_group) - { - retvm_if(CTS_VALUE_GROUP_RELATION != tmp_group->v_type, CTS_ERR_ARG_INVALID, - "List has other type"); - - if (!tmp_group->name && tmp_group->deleted) { - CTS_REMOVE_GSLIST_ITEM(group, grouprelations); - continue; - } - - tmp_group->embedded = true; - } - prev = tmp_gslist; - tmp_gslist = tmp_gslist->next; - } - } - else - { - while (tmp_gslist) - { - tmp_group = tmp_gslist->data; - if (tmp_group) - { - retvm_if(CTS_VALUE_GROUP_RELATION != tmp_group->v_type, CTS_ERR_ARG_INVALID, - "List has other type"); - if (!tmp_group->embedded) - { - tmp_group->embedded = true; - new_gslist = g_slist_append(new_gslist, tmp_group); - } - } - tmp_gslist = tmp_gslist->next; - } - contact->grouprelations = g_slist_concat(contact->grouprelations, new_gslist); - } - return CTS_SUCCESS; -} - -static inline int cts_struct_store_event_list(contact_t *contact, GSList* list) -{ - cts_event *tmp_event; - - GSList *new_gslist=NULL, *tmp_gslist=list, *prev=NULL; - if (contact->events && tmp_gslist == contact->events) - { - while (tmp_gslist) - { - tmp_event = tmp_gslist->data; - if (tmp_event) - { - retvm_if(CTS_VALUE_EVENT != tmp_event->v_type, CTS_ERR_ARG_INVALID, - "List has other type"); - - if (!tmp_event->id && tmp_event->deleted) { - CTS_REMOVE_GSLIST_ITEM(event, events); - continue; - } - - tmp_event->embedded = true; - } - prev = tmp_gslist; - tmp_gslist = tmp_gslist->next; - } - } - else - { - while (tmp_gslist) - { - tmp_event = tmp_gslist->data; - if (tmp_event) - { - retvm_if(CTS_VALUE_EVENT != tmp_event->v_type, CTS_ERR_ARG_INVALID, - "List has other type"); - if (!tmp_event->embedded) - { - tmp_event->embedded = true; - new_gslist = g_slist_append(new_gslist, tmp_event); - } - } - tmp_gslist = tmp_gslist->next; - } - contact->events = g_slist_concat(contact->events, new_gslist); - } - return CTS_SUCCESS; -} - -static inline int cts_struct_store_messenger_list(contact_t *contact, GSList* list) -{ - cts_messenger *tmp_messenger; - - GSList *new_gslist=NULL, *tmp_gslist=list, *prev=NULL; - if (contact->messengers && tmp_gslist == contact->messengers) - { - while (tmp_gslist) - { - tmp_messenger = tmp_gslist->data; - if (tmp_messenger) - { - retvm_if(CTS_VALUE_MESSENGER != tmp_messenger->v_type, CTS_ERR_ARG_INVALID, - "List has other type"); - - if (!tmp_messenger->id && tmp_messenger->deleted) { - CTS_REMOVE_GSLIST_ITEM(messenger, messengers); - continue; - } - - if (!tmp_messenger->embedded) - { - tmp_messenger->embedded = true; - tmp_messenger->im_id = SAFE_STRDUP(tmp_messenger->im_id); - } - } - prev = tmp_gslist; - tmp_gslist = tmp_gslist->next; - } - } - else - { - while (tmp_gslist) - { - tmp_messenger = tmp_gslist->data; - if (tmp_messenger) - { - retvm_if(CTS_VALUE_MESSENGER != tmp_messenger->v_type, CTS_ERR_ARG_INVALID, - "List has other type"); - if (!tmp_messenger->embedded) - { - tmp_messenger->embedded = true; - tmp_messenger->im_id = SAFE_STRDUP(tmp_messenger->im_id); - new_gslist = g_slist_append(new_gslist, tmp_messenger); - } - } - tmp_gslist = tmp_gslist->next; - } - contact->messengers = g_slist_concat(contact->messengers, new_gslist); - } - return CTS_SUCCESS; -} - -static inline int cts_struct_store_postal_list(contact_t *contact, GSList* list) -{ - cts_postal *tmp_postal; - - GSList *new_gslist=NULL, *tmp_gslist=list, *prev=NULL; - if (contact->postal_addrs && tmp_gslist == contact->postal_addrs) - { - while (tmp_gslist) - { - tmp_postal = tmp_gslist->data; - if (tmp_postal) - { - retvm_if(CTS_VALUE_POSTAL != tmp_postal->v_type, CTS_ERR_ARG_INVALID, - "List has other type"); - - if (!tmp_postal->id && tmp_postal->deleted) { - CTS_REMOVE_GSLIST_ITEM(postal, postal_addrs); - continue; - } - - if (!tmp_postal->embedded) { - tmp_postal->embedded = true; - tmp_postal->pobox = SAFE_STRDUP(tmp_postal->pobox); - tmp_postal->postalcode = SAFE_STRDUP(tmp_postal->postalcode); - tmp_postal->region = SAFE_STRDUP(tmp_postal->region); - tmp_postal->locality = SAFE_STRDUP(tmp_postal->locality); - tmp_postal->street = SAFE_STRDUP(tmp_postal->street); - tmp_postal->extended = SAFE_STRDUP(tmp_postal->extended); - tmp_postal->country = SAFE_STRDUP(tmp_postal->country); - } - } - prev = tmp_gslist; - tmp_gslist = tmp_gslist->next; - } - } - else - { - //retvm_if(NULL != contact->postal_addrs, CTS_ERR_ARG_INVALID, "New list can be stored when struct has no list"); - while (tmp_gslist) - { - tmp_postal = tmp_gslist->data; - if (tmp_postal) { - retvm_if(tmp_postal && CTS_VALUE_POSTAL != tmp_postal->v_type, CTS_ERR_ARG_INVALID, - "List has other type"); - if (!tmp_postal->embedded) { - tmp_postal->embedded = true; - tmp_postal->pobox = SAFE_STRDUP(tmp_postal->pobox); - tmp_postal->postalcode = SAFE_STRDUP(tmp_postal->postalcode); - tmp_postal->region = SAFE_STRDUP(tmp_postal->region); - tmp_postal->locality = SAFE_STRDUP(tmp_postal->locality); - tmp_postal->street = SAFE_STRDUP(tmp_postal->street); - tmp_postal->extended = SAFE_STRDUP(tmp_postal->extended); - tmp_postal->country = SAFE_STRDUP(tmp_postal->country); - new_gslist = g_slist_append(new_gslist, tmp_postal); - } - } - tmp_gslist = tmp_gslist->next; - } - contact->postal_addrs = g_slist_concat(contact->postal_addrs, new_gslist); - } - return CTS_SUCCESS; -} - -static inline int cts_struct_store_web_list(contact_t *contact, GSList* list) -{ - cts_web *tmp_web; - - GSList *new_gslist=NULL, *tmp_gslist=list, *prev=NULL; - if (contact->web_addrs && tmp_gslist == contact->web_addrs) - { - while (tmp_gslist) - { - tmp_web = tmp_gslist->data; - if (tmp_web) - { - retvm_if(CTS_VALUE_WEB != tmp_web->v_type, CTS_ERR_ARG_INVALID, - "List has other type"); - - if (!tmp_web->id && tmp_web->deleted) { - CTS_REMOVE_GSLIST_ITEM(web, web_addrs); - continue; - } - - if (!tmp_web->embedded) { - tmp_web->embedded = true; - tmp_web->url = SAFE_STRDUP(tmp_web->url); - } - } - prev = tmp_gslist; - tmp_gslist = tmp_gslist->next; - } - } - else - { - while (tmp_gslist) - { - tmp_web = tmp_gslist->data; - if (tmp_web) - { - retvm_if(tmp_web && CTS_VALUE_WEB != tmp_web->v_type, CTS_ERR_ARG_INVALID, - "List has other type"); - if (!tmp_web->embedded) { - tmp_web->embedded = true; - tmp_web->url = SAFE_STRDUP(tmp_web->url); - new_gslist = g_slist_append(new_gslist, tmp_web); - } - } - tmp_gslist = tmp_gslist->next; - } - contact->web_addrs = g_slist_concat(contact->web_addrs, new_gslist); - } - return CTS_SUCCESS; -} - -static inline int cts_struct_store_nickname_list(contact_t *contact, GSList* list) -{ - cts_nickname *tmp_nickname; - - GSList *new_gslist=NULL, *tmp_gslist=list, *prev=NULL; - if (contact->nicknames && tmp_gslist == contact->nicknames) - { - while (tmp_gslist) - { - tmp_nickname = tmp_gslist->data; - if (tmp_nickname) - { - retvm_if(CTS_VALUE_NICKNAME != tmp_nickname->v_type, CTS_ERR_ARG_INVALID, - "List has other type"); - - if (!tmp_nickname->id && tmp_nickname->deleted) { - CTS_REMOVE_GSLIST_ITEM(nickname, nicknames); - continue; - } - - if (!tmp_nickname->embedded) { - tmp_nickname->embedded = true; - tmp_nickname->nick = SAFE_STRDUP(tmp_nickname->nick); - } - } - prev = tmp_gslist; - tmp_gslist = tmp_gslist->next; - } - } - else - { - //retvm_if(NULL != contact->web_addrs, CTS_ERR_ARG_INVALID, "New list can be stored when struct has no list"); - while (tmp_gslist) - { - tmp_nickname = tmp_gslist->data; - if (tmp_nickname) { - retvm_if(tmp_nickname && CTS_VALUE_NICKNAME != tmp_nickname->v_type, CTS_ERR_ARG_INVALID, - "List has other type"); - if (!tmp_nickname->embedded) - { - tmp_nickname->embedded = true; - tmp_nickname->nick = SAFE_STRDUP(tmp_nickname->nick); - new_gslist = g_slist_append(new_gslist, tmp_nickname); - } - } - tmp_gslist = tmp_gslist->next; - } - contact->nicknames = g_slist_concat(contact->nicknames, new_gslist); - } - return CTS_SUCCESS; -} - -API int contacts_svc_struct_store_list(CTSstruct *contact, - cts_struct_field field, GSList *list) -{ - int ret; - - retv_if(NULL == contact, CTS_ERR_ARG_NULL); - retv_if(NULL == list, CTS_ERR_ARG_NULL); - retvm_if(CTS_STRUCT_CONTACT != contact->s_type, CTS_ERR_ARG_INVALID, - "The contact(%d) must be type of CTS_STRUCT_CONTACT.", contact->s_type); - - switch (field) - { - case CTS_CF_NUMBER_LIST: - ret = cts_struct_store_num_list((contact_t *)contact, list); - retvm_if(CTS_SUCCESS != ret, ret, "cts_struct_store_num_list() Failed(%d)",ret); - break; - case CTS_CF_EMAIL_LIST: - ret = cts_struct_store_email_list((contact_t *)contact, list); - retvm_if(CTS_SUCCESS != ret, ret, "cts_struct_store_email_list() Failed(%d)",ret); - break; - case CTS_CF_GROUPREL_LIST: - ret = cts_struct_store_grouprel_list((contact_t *)contact, list); - retvm_if(CTS_SUCCESS != ret, ret, "cts_struct_store_grouprel_list() Failed(%d)",ret); - break; - case CTS_CF_EVENT_LIST: - ret = cts_struct_store_event_list((contact_t *)contact, list); - retvm_if(CTS_SUCCESS != ret, ret, "cts_struct_store_event_list() Failed(%d)",ret); - break; - case CTS_CF_MESSENGER_LIST: - ret = cts_struct_store_messenger_list((contact_t *)contact, list); - retvm_if(CTS_SUCCESS != ret, ret, "cts_struct_store_messenger_list() Failed(%d)",ret); - break; - case CTS_CF_POSTAL_ADDR_LIST: - ret = cts_struct_store_postal_list((contact_t *)contact, list); - retvm_if(CTS_SUCCESS != ret, ret, "cts_struct_store_postal_list() Failed(%d)",ret); - break; - case CTS_CF_WEB_ADDR_LIST: - ret = cts_struct_store_web_list((contact_t *)contact, list); - retvm_if(CTS_SUCCESS != ret, ret, "cts_struct_store_web_list() Failed(%d)",ret); - break; - case CTS_CF_NICKNAME_LIST: - ret = cts_struct_store_nickname_list((contact_t *)contact, list); - retvm_if(CTS_SUCCESS != ret, ret, "cts_struct_store_nickname_list() Failed(%d)",ret); - break; - default: - ERR("The parameter(field) is invalid" - "You MUST be (CTS_CF_VALUE_MAX < field < CTS_CF_FIELD_MAX)."); - return CTS_ERR_ARG_INVALID; - } - return CTS_SUCCESS; -} - -static inline void cts_contact_store_name(contact_t *contact, cts_name *value) -{ - if (contact->name) - { - if (value->is_changed) { - FREEandSTRDUP(contact->name->first, value->first); - FREEandSTRDUP(contact->name->last, value->last); - FREEandSTRDUP(contact->name->addition, value->addition); - FREEandSTRDUP(contact->name->display, value->display); - FREEandSTRDUP(contact->name->prefix, value->prefix); - FREEandSTRDUP(contact->name->suffix, value->suffix); - contact->name->is_changed = true; - } - } - else - { - //contact->name = (cts_name *)contacts_svc_value_new(CTS_VALUE_NAME); - contact->name = value; - contact->name->embedded = true; - contact->name->first = SAFE_STRDUP(value->first); - contact->name->last = SAFE_STRDUP(value->last); - contact->name->addition = SAFE_STRDUP(value->addition); - contact->name->display = SAFE_STRDUP(value->display); - contact->name->prefix = SAFE_STRDUP(value->prefix); - contact->name->suffix = SAFE_STRDUP(value->suffix); - } -} - -static inline void cts_contact_store_base(contact_t *contact, cts_ct_base *value) -{ - if (contact->base) - { - if (value->uid_changed) { - FREEandSTRDUP(contact->base->uid, value->uid); - contact->base->uid_changed = true; - } - if (value->img_changed) { - FREEandSTRDUP(contact->base->img_path, value->img_path); - contact->base->img_changed = true; - } - if (value->full_img_changed) { - FREEandSTRDUP(contact->base->full_img_path, value->full_img_path); - contact->base->full_img_changed = true; - } - if (value->ringtone_changed) { - FREEandSTRDUP(contact->base->ringtone_path, value->ringtone_path); - contact->base->ringtone_changed = true; - } - if (value->note_changed) { - FREEandSTRDUP(contact->base->note, value->note); - contact->base->note_changed = true; - } - } - else - { - contact->base = value; - contact->base->embedded = true; - contact->base->uid = SAFE_STRDUP(value->uid); - contact->base->img_path = SAFE_STRDUP(value->img_path); - contact->base->full_img_path = SAFE_STRDUP(value->full_img_path); - contact->base->ringtone_path = SAFE_STRDUP(value->ringtone_path); - contact->base->note = SAFE_STRDUP(value->note); - } -} - -static inline void cts_contact_store_company(contact_t *contact, cts_company *value) -{ - if (contact->company) - { - FREEandSTRDUP(contact->company->name, value->name); - FREEandSTRDUP(contact->company->department, value->department); - FREEandSTRDUP(contact->company->jot_title, value->jot_title); - FREEandSTRDUP(contact->company->role, value->role); - FREEandSTRDUP(contact->company->assistant_name, value->assistant_name); - } - else - { - //contact->company = (cts_company *)contacts_svc_value_new(CTS_VALUE_COMPANY); - contact->company = value; - contact->company->embedded = true; - contact->company->name = SAFE_STRDUP(value->name); - contact->company->department = SAFE_STRDUP(value->department); - contact->company->jot_title = SAFE_STRDUP(value->jot_title); - contact->company->role = SAFE_STRDUP(value->role); - contact->company->assistant_name = SAFE_STRDUP(value->assistant_name); - } -} - -static inline int cts_contact_store_extend(contact_t *contact, - int type, cts_extend *value) -{ - cts_extend *stored_extend; - - stored_extend = cts_extend_slist_search(type, contact->extended_values); - if (NULL == stored_extend) - { - retvm_if(value->embedded, CTS_ERR_ARG_INVALID, "This Value is already stored"); - value->embedded = true; - value->type = type; - contact->extended_values = g_slist_append(contact->extended_values, value); - value->data2 = SAFE_STRDUP(value->data2); - value->data3 = SAFE_STRDUP(value->data3); - value->data4 = SAFE_STRDUP(value->data4); - value->data5 = SAFE_STRDUP(value->data5); - value->data6 = SAFE_STRDUP(value->data6); - value->data7 = SAFE_STRDUP(value->data7); - value->data8 = SAFE_STRDUP(value->data8); - value->data9 = SAFE_STRDUP(value->data9); - value->data10 = SAFE_STRDUP(value->data10); - } - else - { - retvm_if(stored_extend == value, CTS_SUCCESS, "This value is already stored"); - - FREEandSTRDUP(stored_extend->data2, value->data2); - FREEandSTRDUP(stored_extend->data3, value->data3); - FREEandSTRDUP(stored_extend->data4, value->data4); - FREEandSTRDUP(stored_extend->data5, value->data5); - FREEandSTRDUP(stored_extend->data6, value->data6); - FREEandSTRDUP(stored_extend->data7, value->data7); - FREEandSTRDUP(stored_extend->data8, value->data8); - FREEandSTRDUP(stored_extend->data9, value->data9); - FREEandSTRDUP(stored_extend->data10, value->data10); - } - - return CTS_SUCCESS; -} - -API int contacts_svc_struct_store_value(CTSstruct *contact, - cts_struct_field field, CTSvalue *value) -{ - contact_t *record = (contact_t *)contact; - - retv_if(NULL == contact, CTS_ERR_ARG_NULL); - retv_if(NULL == value, CTS_ERR_ARG_NULL); - retvm_if(CTS_STRUCT_CONTACT != contact->s_type, CTS_ERR_ARG_INVALID, - "The contact(%d) must be type of CTS_STRUCT_CONTACT.", contact->s_type); - CTS_DBG("contact type = %d, field = %d, value type = %d", - contact->s_type, field, value->v_type); - - switch (field) - { - case CTS_CF_NAME_VALUE: - retvm_if(CTS_VALUE_NAME != value->v_type, CTS_ERR_ARG_INVALID, - "The value must be a CTS_VALUE_NAME for field(CTS_CF_NAME_VALUE)."); - if (record->name != (cts_name *)value) - cts_contact_store_name(record, (cts_name *)value); - break; - case CTS_CF_BASE_INFO_VALUE: - retvm_if(CTS_VALUE_CONTACT_BASE_INFO != value->v_type, CTS_ERR_ARG_INVALID, - "The value must be a CTS_VALUE_CONTACT_BASE_INFO for field(CTS_CF_IMAGE_PATH_STR)."); - if (record->base != (cts_ct_base *)value) - cts_contact_store_base(record, (cts_ct_base*)value); - break; - case CTS_CF_COMPANY_VALUE: - retvm_if(CTS_VALUE_COMPANY != value->v_type, CTS_ERR_ARG_INVALID, - "The value must be a CTS_VALUE_COMPANY for field(CTS_CF_COMPANY_VALUE)."); - if (record->company != (cts_company *)value) - cts_contact_store_company(record, (cts_company*)value); - break; - default: - if (CTS_VALUE_EXTEND == value->v_type && (int)CTS_DATA_EXTEND_START <= field) - return cts_contact_store_extend(record, field, (cts_extend*)value); - ERR("The parameter(field:%d) is invalid" - "You MUST be (CTS_CF_NONE < field < CTS_CF_VALUE_MAX).", field); - return CTS_ERR_ARG_INVALID; - } - - return CTS_SUCCESS; -} - -API CTSvalue* contacts_svc_value_new(cts_value_type type) -{ - CTSvalue* ret_val; - switch ((int)type) - { - case CTS_VALUE_BASIC: - ret_val = (CTSvalue*)calloc(1, sizeof(cts_basic)); - break; - case CTS_VALUE_CONTACT_BASE_INFO: - ret_val = (CTSvalue*)calloc(1, sizeof(cts_ct_base)); - break; - case CTS_VALUE_NAME: - ret_val = (CTSvalue*)calloc(1, sizeof(cts_name)); - break; - case CTS_VALUE_EMAIL: - ret_val = (CTSvalue*)calloc(1, sizeof(cts_email)); - break; - case CTS_VALUE_NUMBER: - ret_val = (CTSvalue*)calloc(1, sizeof(cts_number)); - break; - case CTS_VALUE_WEB: - ret_val = (CTSvalue*)calloc(1, sizeof(cts_web)); - break; - case CTS_VALUE_POSTAL: - ret_val = (CTSvalue*)calloc(1, sizeof(cts_postal)); - break; - case CTS_VALUE_EVENT: - ret_val = (CTSvalue*)calloc(1, sizeof(cts_event)); - break; - case CTS_VALUE_MESSENGER: - ret_val = (CTSvalue*)calloc(1, sizeof(cts_messenger)); - if (ret_val) ret_val->v_type = CTS_VALUE_MESSENGER; - break; - case CTS_VALUE_NICKNAME: - ret_val = (CTSvalue*)calloc(1, sizeof(cts_nickname)); - break; - case CTS_VALUE_GROUP_RELATION: - case CTS_VALUE_GROUP: - ret_val = (CTSvalue*)calloc(1, sizeof(cts_group)); - break; - case CTS_VALUE_COMPANY: - ret_val = (CTSvalue*)calloc(1, sizeof(cts_company)); - break; - case CTS_VALUE_PHONELOG: - ret_val = (CTSvalue*)calloc(1, sizeof(cts_plog)); - break; - case CTS_VALUE_EXTEND: - ret_val = (CTSvalue*)calloc(1, sizeof(cts_extend)); - break; - case CTS_VALUE_ADDRESSBOOK: - ret_val = (CTSvalue*)calloc(1, sizeof(cts_addrbook)); - break; - case CTS_VALUE_LIST_CONTACT: - if (contact_list_mempool) { - memset(contact_list_mempool, 0x00, sizeof(contact_list)); - ret_val = (CTSvalue*)contact_list_mempool; - contact_list_mempool = NULL; - } - else - ret_val = (CTSvalue*)calloc(1, sizeof(contact_list)); - break; - case CTS_VALUE_LIST_PLOG: - if (plog_list_mempool) { - memset(plog_list_mempool, 0x00, sizeof(plog_list)); - ret_val = (CTSvalue*)plog_list_mempool; - plog_list_mempool = NULL; - } - else - ret_val = (CTSvalue*)calloc(1, sizeof(plog_list)); - break; - case CTS_VALUE_LIST_CUSTOM_NUM_TYPE: - if (numtype_list_mempool) { - memset(numtype_list_mempool, 0x00, sizeof(numtype_list)); - ret_val = (CTSvalue*)numtype_list_mempool; - numtype_list_mempool = NULL; - } - else - ret_val = (CTSvalue*)calloc(1, sizeof(numtype_list)); - break; - case CTS_VALUE_LIST_CHANGE: - if (change_list_mempool) { - memset(change_list_mempool, 0x00, sizeof(change_list)); - ret_val = (CTSvalue*)change_list_mempool; - change_list_mempool = NULL; - } - else - ret_val = (CTSvalue*)calloc(1, sizeof(change_list)); - break; - case CTS_VALUE_LIST_ADDRBOOK: - if (addrbook_list_mempool) { - memset(addrbook_list_mempool, 0x00, sizeof(cts_addrbook)); - ret_val = (CTSvalue*)addrbook_list_mempool; - addrbook_list_mempool = NULL; - } - else - ret_val = (CTSvalue*)calloc(1, sizeof(cts_addrbook)); - break; - case CTS_VALUE_LIST_GROUP: - if (group_list_mempool) { - memset(group_list_mempool, 0x00, sizeof(cts_group)); - ret_val = (CTSvalue*)group_list_mempool; - group_list_mempool = NULL; - } - else - ret_val = (CTSvalue*)calloc(1, sizeof(cts_group)); - break; - case CTS_VALUE_LIST_SHORTCUT: - if (favorite_list_mempool) { - memset(favorite_list_mempool, 0x00, sizeof(shortcut_list)); - ret_val = (CTSvalue*)favorite_list_mempool; - favorite_list_mempool = NULL; - } - else - ret_val = (CTSvalue*)calloc(1, sizeof(shortcut_list)); - break; - case CTS_VALUE_LIST_SDN: - if (sdn_list_mempool) { - memset(sdn_list_mempool, 0x00, sizeof(sdn_list)); - ret_val = (CTSvalue*)sdn_list_mempool; - sdn_list_mempool = NULL; - } - else - ret_val = (CTSvalue*)calloc(1, sizeof(sdn_list)); - break; - default: - ERR("your type is Not supported"); - return NULL; - } - - if (ret_val) - ret_val->v_type = type; - else - ERR("calloc() Failed(%d)", errno); - - return ret_val; -} - -static inline void cts_internal_value_info_free(CTSvalue *value) -{ - plog_list *plog; - cts_plog *log; - numtype_list *numtype; - contact_list *contact; - change_list *change; - shortcut_list *favorite; - cts_group *group; - cts_addrbook *ab; - sdn_list *sdn; - - switch (value->v_type) - { - case CTS_VALUE_LIST_CONTACT: - case CTS_VALUE_LIST_NUMBERINFO: - case CTS_VALUE_LIST_EMAILINFO: - contact = (contact_list *)value; - free(contact->img_path); - free(contact->first); - free(contact->last); - free(contact->display); - free(contact->connect); - free(contact->normalize); - - if (!contact_list_mempool) { - contact_list_mempool = contact; - } - else - if (contact_list_mempool != contact) - free(contact); - break; - case CTS_VALUE_LIST_PLOG: - plog = (plog_list *)value; - free(plog->first); - free(plog->last); - free(plog->display); - free(plog->img_path); - - if (!plog_list_mempool) { - plog_list_mempool = plog; - } - else - if (plog_list_mempool != plog) - free(plog); - break; - case CTS_VALUE_LIST_CUSTOM_NUM_TYPE: - numtype = (numtype_list *)value; - free(numtype->name); - if (!numtype_list_mempool) { - numtype_list_mempool = numtype; - } - else - if (numtype_list_mempool != numtype) - free(numtype); - break; - case CTS_VALUE_LIST_CHANGE: - change = (change_list *)value; - if (!change_list_mempool) { - change_list_mempool = change; - } - else - if (change_list_mempool != change) - free(change); - break; - case CTS_VALUE_LIST_GROUP: - group = (cts_group *)value; - free(group->name); - - if (!group_list_mempool) { - group_list_mempool = group; - } - else - if (group_list_mempool != group) - free(group); - break; - case CTS_VALUE_LIST_ADDRBOOK: - ab = (cts_addrbook *)value; - free(ab->name); - - if (!addrbook_list_mempool) { - addrbook_list_mempool = ab; - } - else - if (addrbook_list_mempool != ab) - free(ab); - break; - case CTS_VALUE_LIST_SHORTCUT: - favorite = (shortcut_list *)value; - free(favorite->first); - free(favorite->last); - free(favorite->display); - free(favorite->number); - free(favorite->img_path); - - if (!favorite_list_mempool) { - favorite_list_mempool = favorite; - } - else - if (favorite_list_mempool != favorite) - free(favorite); - break; - case CTS_VALUE_LIST_SDN: - sdn = (sdn_list *)value; - free(sdn->name); - free(sdn->number); - - if (!sdn_list_mempool) { - sdn_list_mempool = sdn; - } - else - if (sdn_list_mempool != sdn) - free(sdn); - break; - case CTS_VALUE_RDONLY_NAME: - cts_name_free((cts_name *)value); - break; - case CTS_VALUE_RDONLY_NUMBER: - cts_number_free(value, NULL); - break; - case CTS_VALUE_RDONLY_EMAIL: - cts_email_free(value, NULL); - break; - case CTS_VALUE_RDONLY_COMPANY: - cts_company_free((cts_company *)value); - break; - case CTS_VALUE_RDONLY_PLOG: - log = (cts_plog *)value; - free(log->number); - free(log->extra_data2); - free(log); - break; - default: - ERR("The type of value is unknown type(%d)", value->v_type); - return; - } -} - -API int contacts_svc_value_free(CTSvalue *value) -{ - retv_if(NULL == value, CTS_ERR_ARG_NULL); - - if (CTS_VALUE_LIST_CONTACT <= value->v_type) - cts_internal_value_info_free(value); - else { - switch (value->v_type) { - case CTS_VALUE_GROUP: - if (value->embedded) { - free(((cts_group *)value)->name); - free(((cts_group *)value)->ringtone_path); - } - break; - case CTS_VALUE_ADDRESSBOOK: - if (value->embedded) { - free(((cts_addrbook *)value)->name); - } - break; - default: - if (value->embedded) { - DBG("This is the value of struct. It is really freed with the struct."); - return CTS_SUCCESS; - } - break; - } - free(value); - } - - return CTS_SUCCESS; -} - -API int contacts_svc_value_get_type(CTSvalue *value) -{ - retv_if(NULL == value, CTS_ERR_ARG_NULL); - - return value->v_type; -} - -static inline int cts_value_get_int_base(cts_ct_base *value, int field) -{ - int ret = 0; - - switch (field) - { - case CTS_BASE_VAL_ID_INT: - ret = value->id; - break; - case CTS_BASE_VAL_CHANGED_TIME_INT: - ret = value->changed_time; - break; - case CTS_BASE_VAL_ADDRESSBOOK_ID_INT: - ret = value->addrbook_id; - break; - default: - ERR("The field(%d) is not supported in value(Base_info)", field); - break; - } - return ret; -} - -static inline int cts_value_get_int_plog_list(plog_list *value, int field) -{ - int ret = 0; - - switch (field) - { - case CTS_LIST_PLOG_ID_INT: - ret = value->id; - break; - case CTS_LIST_PLOG_RELATED_ID_INT: - ret = value->related_id; - break; - case CTS_LIST_PLOG_NUM_TYPE_INT: - ret = value->num_type; - break; - case CTS_LIST_PLOG_LOG_TIME_INT: - ret = value->log_time; - break; - case CTS_LIST_PLOG_LOG_TYPE_INT: - ret = value->log_type; - break; - case CTS_LIST_PLOG_DURATION_INT: - case CTS_LIST_PLOG_MSGID_INT: - ret = value->extra_data1; - break; - default: - ERR("The field(%d) is not supported in value(plog list)", field); - break; - } - return ret; -} - -static inline int cts_value_get_int_plog(cts_plog *value, int field) -{ - int ret = 0; - - switch (field) - { - case CTS_PLOG_VAL_ID_INT: - ret = value->id; - break; - case CTS_PLOG_VAL_RELATED_ID_INT: - ret = value->related_id; - break; - case CTS_PLOG_VAL_LOG_TIME_INT: - ret = value->log_time; - break; - case CTS_PLOG_VAL_LOG_TYPE_INT: - ret = value->log_type; - break; - case CTS_PLOG_VAL_DURATION_INT: - case CTS_PLOG_VAL_MSGID_INT: - ret = value->extra_data1; - break; - default: - ERR("The field(%d) is not supported in value(plog)", field); - break; - } - return ret; -} - -static inline int cts_value_get_int_change_list(change_list *value, int field) -{ - int ret = 0; - - switch (field) - { - case CTS_LIST_CHANGE_ID_INT: - ret = value->id; - break; - case CTS_LIST_CHANGE_TYPE_INT: - ret = value->changed_type; - break; - case CTS_LIST_CHANGE_VER_INT: - ret = value->changed_ver; - break; - default: - ERR("The field(%d) is not supported in value(change list)", field); - break; - } - return ret; -} - -static inline int cts_value_get_int_shortcut_list(shortcut_list *value, int field) -{ - int ret = 0; - - switch (field) - { - case CTS_LIST_SHORTCUT_ID_INT: - ret = value->id; - break; - case CTS_LIST_SHORTCUT_CONTACT_ID_INT: - ret = value->contact_id; - break; - case CTS_LIST_SHORTCUT_NUMBER_TYPE_INT: - ret = value->num_type; - break; - case CTS_LIST_SHORTCUT_SPEEDDIAL_INT: - ret = value->speeddial; - break; - default: - ERR("The field(%d) is not supported in value(shorcut list)", field); - break; - } - return ret; -} - -static inline int cts_value_get_int_addrbook(cts_addrbook *value, int field) -{ - int ret = 0; - - switch (field) - { - case CTS_ADDRESSBOOK_VAL_ID_INT: - ret = value->id; - break; - case CTS_ADDRESSBOOK_VAL_ACC_ID_INT: - ret = value->acc_id; - break; - case CTS_ADDRESSBOOK_VAL_ACC_TYPE_INT: - ret = value->acc_type; - break; - case CTS_ADDRESSBOOK_VAL_MODE_INT: - ret = value->mode; - break; - default: - ERR("The field(%d) is not supported in value(addressbook)", field); - break; - } - return ret; -} - -API int contacts_svc_value_get_int(CTSvalue *value, int field) -{ - int ret = 0; - retvm_if(NULL == value, 0, "The Parameter(value) is NULL"); - - switch (value->v_type) - { - case CTS_VALUE_BASIC: - retvm_if(CTS_BASIC_VAL_INT != ((cts_basic*)value)->type, 0, - "The type of Basic_value is not integer"); - ret = ((cts_basic*)value)->val.i; - break; - case CTS_VALUE_CONTACT_BASE_INFO: - ret = cts_value_get_int_base((cts_ct_base *)value, field); - break; - case CTS_VALUE_EXTEND: - if (CTS_EXTEND_VAL_DATA1_INT == field) - ret = ((cts_extend*)value)->data1; - else - ERR("The field(%d) is not supported in value(Extend)", field); - break; - case CTS_VALUE_RDONLY_NUMBER: - case CTS_VALUE_NUMBER: - if (CTS_NUM_VAL_ID_INT == field) - ret = ((cts_number*)value)->id; - else if (CTS_NUM_VAL_TYPE_INT == field) - ret = ((cts_number*)value)->type; - else - ERR("The field(%d) is not supported in value(Number)", field); - break; - case CTS_VALUE_RDONLY_EMAIL: - case CTS_VALUE_EMAIL: - retvm_if(CTS_EMAIL_VAL_TYPE_INT != field, 0, - "The field(%d) is not supported in value(Email)", field); - ret = ((cts_email*)value)->type; - break; - case CTS_VALUE_LIST_PLOG: - ret = cts_value_get_int_plog_list((plog_list *)value, field); - break; - case CTS_VALUE_RDONLY_PLOG: - ret = cts_value_get_int_plog((cts_plog *)value, field); - break; - case CTS_VALUE_LIST_CONTACT: - case CTS_VALUE_LIST_NUMS_EMAILS: - if (CTS_LIST_CONTACT_ID_INT == field) - ret = ((contact_list *)value)->id; - else if (CTS_LIST_CONTACT_ADDRESSBOOK_ID_INT == field) - ret = ((contact_list *)value)->acc_id; - else - ERR("The field(%d) is not supported in value(contact_list)", field); - break; - case CTS_VALUE_ADDRESSBOOK: - case CTS_VALUE_LIST_ADDRBOOK: - ret = cts_value_get_int_addrbook((cts_addrbook *)value, field); - break; - case CTS_VALUE_LIST_NUMBERINFO: - case CTS_VALUE_LIST_EMAILINFO: // CTS_LIST_EMAIL_CONTACT_ID_INT is same to CTS_LIST_NUM_CONTACT_ID_INT - retvm_if(CTS_LIST_NUM_CONTACT_ID_INT != field, 0, - "The field(%d) is not supported in value(Number list)", field); - ret = ((contact_list*)value)->id; - break; - case CTS_VALUE_LIST_GROUP: - if (CTS_LIST_GROUP_ID_INT == field) - ret = ((cts_group *)value)->id; - else if (CTS_LIST_GROUP_ADDRESSBOOK_ID_INT == field) - ret = ((cts_group *)value)->addrbook_id; - else - ERR("Not supported field(%d)", field); - break; - case CTS_VALUE_LIST_CHANGE: - ret = cts_value_get_int_change_list((change_list *)value, field); - break; - case CTS_VALUE_LIST_SHORTCUT: - ret = cts_value_get_int_shortcut_list((shortcut_list *)value, field); - break; - case CTS_VALUE_MESSENGER: - if (CTS_MESSENGER_VAL_TYPE_INT == field) - ret = ((cts_messenger*)value)->type; - else - ERR("Not supported field(%d)", field); - break; - case CTS_VALUE_GROUP_RELATION: - if (CTS_GROUPREL_VAL_ID_INT == field) - ret = ((cts_group*)value)->id; - else - ERR("Not supported field(%d)", field); - break; - case CTS_VALUE_GROUP: - if (CTS_GROUP_VAL_ID_INT == field) - ret = ((cts_group*)value)->id; - if (CTS_GROUP_VAL_ADDRESSBOOK_ID_INT == field) - ret = ((cts_group*)value)->addrbook_id; - else - ERR("Not supported field(%d)", field); - break; - case CTS_VALUE_WEB: - if (CTS_WEB_VAL_TYPE_INT == field) - ret = ((cts_web*)value)->type; - else - ERR("Not supported field(%d)", field); - break; - case CTS_VALUE_POSTAL: - if (CTS_POSTAL_VAL_TYPE_INT == field) - ret = ((cts_postal*)value)->type; - else - ERR("Not supported field(%d)", field); - break; - case CTS_VALUE_EVENT: - if (CTS_EVENT_VAL_TYPE_INT == field) - ret = ((cts_event *)value)->type; - else if (CTS_EVENT_VAL_DATE_INT == field) - ret = ((cts_event *)value)->date; - else - ERR("Not supported field(%d)", field); - break; - case CTS_VALUE_PHONELOG: - /* phonelog value is write only */ - case CTS_VALUE_COMPANY: - /* company value doesn't have interger value */ - case CTS_VALUE_NAME: - /* name value doesn't have interger value */ - default: - ERR("The value has unsupported type"); - break; - } - return ret; -} - -double contacts_svc_value_get_dbl(CTSvalue *value, int field) -{ - retv_if(NULL == value, CTS_ERR_ARG_NULL); - - switch (value->v_type) - { - case CTS_VALUE_BASIC: - retvm_if(CTS_BASIC_VAL_DBL != ((cts_basic*)value)->type, 0.0, - "The type of value is not double"); - return ((cts_basic*)value)->val.d; - case CTS_VALUE_NAME: - case CTS_VALUE_EMAIL: - case CTS_VALUE_NUMBER: - case CTS_VALUE_WEB: - case CTS_VALUE_POSTAL: - case CTS_VALUE_EVENT: - case CTS_VALUE_MESSENGER: - case CTS_VALUE_GROUP_RELATION: - case CTS_VALUE_COMPANY: - default: - ERR("The value has unsupported type"); - return CTS_ERR_ARG_INVALID; - } - -} - -API bool contacts_svc_value_get_bool(CTSvalue *value, int field) -{ - retvm_if(NULL == value, false, "The Parameter(value) is NULL"); - - switch (value->v_type) - { - case CTS_VALUE_CONTACT_BASE_INFO: - if (CTS_BASE_VAL_FAVORITE_BOOL == field) { - return ((cts_ct_base*)value)->is_favorite; - } - else { - ERR("The field(%d) is not supported in value(BASE_INFO)", field); - return false; - } - case CTS_VALUE_RDONLY_NUMBER: - case CTS_VALUE_NUMBER: - if (CTS_NUM_VAL_DEFAULT_BOOL == field) { - return ((cts_number*)value)->is_default; - } - else if (CTS_NUM_VAL_DELETE_BOOL == field) { - return value->deleted; - } - else if (CTS_NUM_VAL_FAVORITE_BOOL == field) { - return ((cts_number*)value)->is_favorite; - } - else { - ERR("The field(%d) is not supported in value(Number)", field); - return false; - } - case CTS_VALUE_RDONLY_EMAIL: - case CTS_VALUE_EMAIL: - if (CTS_EMAIL_VAL_DEFAULT_BOOL == field) { - return ((cts_email*)value)->is_default; - } - else if (CTS_EMAIL_VAL_DELETE_BOOL == field) { - return value->deleted; - } - else { - ERR("The field(%d) is not supported in value(Email)", field); - return false; - } - case CTS_VALUE_GROUP_RELATION: - if (CTS_GROUPREL_VAL_DELETE_BOOL == field) { - return value->deleted; - } - else { - ERR("The field(%d) is not supported in value(Group)", field); - return false; - } - case CTS_VALUE_EVENT: - if (CTS_EVENT_VAL_DELETE_BOOL == field) { - return value->deleted; - } - else { - ERR("The field(%d) is not supported in value(Event)", field); - return false; - } - case CTS_VALUE_MESSENGER: - if (CTS_MESSENGER_VAL_DELETE_BOOL == field) { - return value->deleted; - } - else { - ERR("The field(%d) is not supported in value(Messenger)", field); - return false; - } - case CTS_VALUE_POSTAL: - if (CTS_POSTAL_VAL_DELETE_BOOL == field) { - return value->deleted; - } - else if (CTS_POSTAL_VAL_DEFAULT_BOOL == field) { - return ((cts_postal*)value)->is_default;; - } - else { - ERR("The field(%d) is not supported in value(Postal)", field); - return false; - } - case CTS_VALUE_WEB: - if (CTS_WEB_VAL_DELETE_BOOL == field) { - return value->deleted; - } - else { - ERR("The field(%d) is not supported in value(Web)", field); - return false; - } - case CTS_VALUE_NICKNAME: - if (CTS_NICKNAME_VAL_DELETE_BOOL == field) { - return value->deleted; - } - else { - ERR("The field(%d) is not supported in value(Web)", field); - return false; - } - case CTS_VALUE_EXTEND: - if (CTS_EXTEND_VAL_DELETE_BOOL == field) { - return value->deleted; - } - else { - ERR("The field(%d) is not supported in value(Extend)", field); - return false; - } - case CTS_VALUE_BASIC: - retvm_if(CTS_BASIC_VAL_BOOL != ((cts_basic*)value)->type, false, - "The type of value is not boolean"); - return ((cts_basic*)value)->val.b; - case CTS_VALUE_PHONELOG: - /* phonelog value is write only */ - case CTS_VALUE_LIST_CONTACT: - /* contact list value doesn't have boolean value */ - case CTS_VALUE_LIST_PLOG: - /* plog list value doesn't have boolean value */ - case CTS_VALUE_LIST_CUSTOM_NUM_TYPE: - /* custom number type list value doesn't have boolean value */ - case CTS_VALUE_LIST_CHANGE: - /* Change list value doesn't have boolean value */ - case CTS_VALUE_NAME: - /* name value doesn't have boolean value */ - case CTS_VALUE_COMPANY: - /* company value doesn't have boolean value */ - default: - ERR("The value has unsupported type"); - return false; - } -} - -static inline char* cts_value_get_str_name(int op_code, - cts_name *value, int field) -{ - char *ret_val; - - switch (field) - { - case CTS_NAME_VAL_FIRST_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->first); - break; - case CTS_NAME_VAL_LAST_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->last); - break; - case CTS_NAME_VAL_DISPLAY_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->display); - break; - case CTS_NAME_VAL_ADDITION_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->addition); - break; - case CTS_NAME_VAL_PREFIX_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->prefix); - break; - case CTS_NAME_VAL_SUFFIX_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->suffix); - break; - default: - ERR("The parameter(field:%d) is not interpreted", field); - ret_val = NULL; - break; - } - return ret_val; -} - -static inline char* cts_value_get_str_extend(int op_code, - cts_extend *value, int field) -{ - char *ret_val; - - switch (field) - { - case CTS_EXTEND_VAL_DATA2_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->data2); - break; - case CTS_EXTEND_VAL_DATA3_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->data3); - break; - case CTS_EXTEND_VAL_DATA4_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->data4); - break; - case CTS_EXTEND_VAL_DATA5_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->data5); - break; - case CTS_EXTEND_VAL_DATA6_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->data6); - break; - case CTS_EXTEND_VAL_DATA7_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->data7); - break; - case CTS_EXTEND_VAL_DATA8_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->data8); - break; - case CTS_EXTEND_VAL_DATA9_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->data9); - break; - case CTS_EXTEND_VAL_DATA10_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->data10); - break; - default: - ERR("The parameter(field:%d) is not interpreted", field); - ret_val = NULL; - break; - } - return ret_val; -} - -static inline char* cts_value_get_str_base(int op_code, - cts_ct_base *value, int field) -{ - char *ret_val; - - switch (field) - { - case CTS_BASE_VAL_IMG_PATH_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->img_path); - if (NULL == ret_val && value->vcard_img_path) { - if (CTS_HANDLE_STR_STEAL == op_code) - ret_val = strdup(value->vcard_img_path); - else - ret_val = value->vcard_img_path; - } - break; - case CTS_BASE_VAL_RINGTONE_PATH_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->ringtone_path); - break; - case CTS_BASE_VAL_NOTE_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->note); - break; - case CTS_BASE_VAL_UID_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->uid); - break; - case CTS_BASE_VAL_FULL_IMG_PATH_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->full_img_path); - break; - default: - ERR("The parameter(field:%d) is not interpreted", field); - ret_val = NULL; - break; - } - return ret_val; -} - -static inline char* cts_value_get_str_contact_list(int op_code, - contact_list *value, int field) -{ - char *ret_val; - switch (field) - { - case CTS_LIST_CONTACT_FIRST_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->first); - break; - case CTS_LIST_CONTACT_LAST_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->last); - break; - case CTS_LIST_CONTACT_DISPLAY_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->display); - break; - case CTS_LIST_CONTACT_IMG_PATH_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->img_path); - break; - case CTS_LIST_CONTACT_NUM_OR_EMAIL_STR: - if (CTS_VALUE_LIST_NUMS_EMAILS == value->v_type) { - HANDLE_STEAL_STRING(op_code, ret_val, value->connect); - } else { - ERR("The parameter(field:%d, value type = %d) is not interpreted", - field, value->v_type); - ret_val = NULL; - } - break; - case CTS_LIST_CONTACT_NORMALIZED_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->normalize); - break; - default: - ERR("The parameter(field:%d) is not interpreted", field); - ret_val = NULL; - break; - } - return ret_val; -} - -static inline char* cts_value_get_str_num_email_list(int op_code, - contact_list *value, int field, int type) -{ - char *ret_val; - switch (field) - { - case CTS_LIST_NUM_CONTACT_FIRST_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->first); - break; - case CTS_LIST_NUM_CONTACT_LAST_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->last); - break; - case CTS_LIST_NUM_CONTACT_DISPLAY_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->display); - break; - case CTS_LIST_NUM_CONTACT_IMG_PATH_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->img_path); - break; - case CTS_LIST_NUM_NUMBER_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->connect); - break; - default: - ERR("The parameter(field:%d) is not interpreted", field); - ret_val = NULL; - break; - } - return ret_val; -} - -static inline char* cts_value_get_str_favorite_list(int op_code, - shortcut_list *value, int field) -{ - char *ret_val; - switch (field) - { - case CTS_LIST_SHORTCUT_FIRST_NAME_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->first); - break; - case CTS_LIST_SHORTCUT_LAST_NAME_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->last); - break; - case CTS_LIST_SHORTCUT_DISPLAY_NAME_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->display); - break; - case CTS_LIST_SHORTCUT_IMG_PATH_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->img_path); - break; - case CTS_LIST_SHORTCUT_NUMBER_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->number); - break; - default: - ERR("The parameter(field:%d) is not interpreted", field); - ret_val = NULL; - break; - } - return ret_val; -} - -static inline char* cts_value_get_str_plog_list(int op_code, - plog_list *value, int field) -{ - char *ret_val; - switch (field) - { - case CTS_LIST_PLOG_FIRST_NAME_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->first); - break; - case CTS_LIST_PLOG_LAST_NAME_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->last); - break; - case CTS_LIST_PLOG_DISPLAY_NAME_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->display); - break; - case CTS_LIST_PLOG_NUMBER_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->number); - break; - case CTS_LIST_PLOG_IMG_PATH_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->img_path); - break; - case CTS_LIST_PLOG_SHORTMSG_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->extra_data2); - break; - default: - ERR("The parameter(field:%d) is not interpreted", field); - ret_val = NULL; - break; - } - return ret_val; -} - -static inline char* cts_value_get_str_postal(int op_code, - cts_postal *value, int field) -{ - char *ret_val; - switch (field) - { - case CTS_POSTAL_VAL_POBOX_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->pobox); - break; - case CTS_POSTAL_VAL_POSTALCODE_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->postalcode); - break; - case CTS_POSTAL_VAL_REGION_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->region); - break; - case CTS_POSTAL_VAL_LOCALITY_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->locality); - break; - case CTS_POSTAL_VAL_STREET_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->street); - break; - case CTS_POSTAL_VAL_EXTENDED_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->extended); - break; - case CTS_POSTAL_VAL_COUNTRY_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->country); - break; - default: - ERR("The parameter(field:%d) is not interpreted", field); - ret_val = NULL; - break; - } - return ret_val; -} - -static inline char* cts_value_get_str_company(int op_code, - cts_company *value, int field) -{ - char *ret_val; - switch (field) - { - case CTS_COMPANY_VAL_NAME_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->name); - break; - case CTS_COMPANY_VAL_DEPARTMENT_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->department); - break; - case CTS_COMPANY_VAL_JOB_TITLE_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->jot_title); - break; - case CTS_COMPANY_VAL_ROLE_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->role); - break; - case CTS_COMPANY_VAL_ASSISTANT_NAME_STR: - HANDLE_STEAL_STRING(op_code, ret_val, value->assistant_name); - break; - default: - ERR("The parameter(field:%d) is not interpreted", field); - ret_val = NULL; - break; - } - return ret_val; -} - -static char* cts_value_handle_str(int op_code, CTSvalue *value, int field) -{ - char *ret_val; - retvm_if(NULL == value, NULL, "The Parameter(value) is NULL"); - - switch (value->v_type) - { - case CTS_VALUE_BASIC: - retvm_if(CTS_BASIC_VAL_STR != ((cts_basic *)value)->type, NULL, - "The type of value is not string"); - HANDLE_STEAL_STRING(op_code, ret_val, ((cts_basic *)value)->val.s); - break; - case CTS_VALUE_CONTACT_BASE_INFO: - ret_val = cts_value_get_str_base(op_code, (cts_ct_base *)value, field); - break; - case CTS_VALUE_POSTAL: - ret_val = cts_value_get_str_postal(op_code, (cts_postal *)value, field); - break; - case CTS_VALUE_COMPANY: - case CTS_VALUE_RDONLY_COMPANY: - ret_val = cts_value_get_str_company(op_code, (cts_company *)value, field); - break; - case CTS_VALUE_NAME: - case CTS_VALUE_RDONLY_NAME: - ret_val = cts_value_get_str_name(op_code, (cts_name *)value, field); - break; - case CTS_VALUE_EXTEND: - ret_val = cts_value_get_str_extend(op_code, (cts_extend *)value, field); - break; - case CTS_VALUE_LIST_CONTACT: - case CTS_VALUE_LIST_NUMS_EMAILS: - ret_val = cts_value_get_str_contact_list(op_code, (contact_list *)value, field); - break; - case CTS_VALUE_LIST_NUMBERINFO: - case CTS_VALUE_LIST_EMAILINFO: - ret_val = cts_value_get_str_num_email_list(op_code, (contact_list *)value, field, value->v_type); - break; - case CTS_VALUE_LIST_SHORTCUT: - ret_val = cts_value_get_str_favorite_list(op_code, (shortcut_list *)value, field); - break; - case CTS_VALUE_LIST_PLOG: - ret_val = cts_value_get_str_plog_list(op_code, (plog_list *)value, field); - break; - case CTS_VALUE_RDONLY_PLOG: - if (CTS_PLOG_VAL_NUMBER_STR == field) { - HANDLE_STEAL_STRING(op_code, ret_val, ((cts_plog *)value)->number); - } else if (CTS_PLOG_VAL_SHORTMSG_STR == field) { - HANDLE_STEAL_STRING(op_code, ret_val, ((cts_plog *)value)->extra_data2); - } else { - ERR("Not supported field"); - return NULL; - } - break; - case CTS_VALUE_NUMBER: - case CTS_VALUE_RDONLY_NUMBER: - retvm_if(CTS_NUM_VAL_NUMBER_STR != field, NULL, - "This field(%d) is not supported in value(Number)", field); - HANDLE_STEAL_STRING(op_code, ret_val, ((cts_number *)value)->number); - break; - case CTS_VALUE_EMAIL: - case CTS_VALUE_RDONLY_EMAIL: - retvm_if(CTS_EMAIL_VAL_ADDR_STR != field, NULL, - "This field(%d) is not supported in value(Email)", field); - HANDLE_STEAL_STRING(op_code, ret_val, ((cts_email *)value)->email_addr); - break; - case CTS_VALUE_ADDRESSBOOK: - case CTS_VALUE_LIST_ADDRBOOK: - retvm_if(CTS_ADDRESSBOOK_VAL_NAME_STR != field, NULL, - "This field(%d) is not supported in value(addressbook)", field); - HANDLE_STEAL_STRING(op_code, ret_val, ((cts_addrbook *)value)->name); - break; - case CTS_VALUE_GROUP_RELATION: - if (CTS_GROUPREL_VAL_NAME_STR == field) { - HANDLE_STEAL_STRING(op_code, ret_val, ((cts_group *)value)->name); - } - else if (CTS_GROUPREL_VAL_RINGTONE_STR == field) { - HANDLE_STEAL_STRING(op_code, ret_val, ((cts_group *)value)->ringtone_path); - } - else { - ERR("Not supported field(%d)", field); - ret_val = NULL; - } - break; - case CTS_VALUE_MESSENGER: - if (CTS_MESSENGER_VAL_IM_ID_STR == field) { - HANDLE_STEAL_STRING(op_code, ret_val, ((cts_messenger *)value)->im_id); - } - else { - ERR("Not supported field(%d)", field); - ret_val = NULL; - } - break; - case CTS_VALUE_WEB: - if (CTS_WEB_VAL_ADDR_STR == field) { - HANDLE_STEAL_STRING(op_code, ret_val, ((cts_web *)value)->url); - } - else { - ERR("Not supported field(%d)", field); - ret_val = NULL; - } - break; - case CTS_VALUE_NICKNAME: - if (CTS_NICKNAME_VAL_NAME_STR == field) { - HANDLE_STEAL_STRING(op_code, ret_val, ((cts_nickname *)value)->nick); - } - else { - ERR("Not supported field(%d)", field); - ret_val = NULL; - } - break; - case CTS_VALUE_GROUP: - if (CTS_GROUP_VAL_NAME_STR == field) { - HANDLE_STEAL_STRING(op_code, ret_val, ((cts_group *)value)->name); - } - else if (CTS_GROUP_VAL_RINGTONE_STR == field) { - HANDLE_STEAL_STRING(op_code, ret_val, ((cts_group *)value)->ringtone_path); - } - else { - ERR("Not supported field(%d)", field); - ret_val = NULL; - } - break; - case CTS_VALUE_LIST_GROUP: - if (CTS_LIST_GROUP_NAME_STR == field) { - HANDLE_STEAL_STRING(op_code, ret_val, ((cts_group *)value)->name); - } - else { - ERR("Not supported field(%d)", field); - ret_val = NULL; - } - break; - case CTS_VALUE_LIST_SDN: - if (CTS_LIST_SDN_NAME_STR == field) { - HANDLE_STEAL_STRING(op_code, ret_val, ((sdn_list *)value)->name); - } - else if (CTS_LIST_SDN_NUMBER_STR == field) { - HANDLE_STEAL_STRING(op_code, ret_val, ((sdn_list *)value)->number); - } - else { - ERR("Not supported field(%d)", field); - ret_val = NULL; - } - break; - case CTS_VALUE_PHONELOG: - /* phonelog value is write only */ - case CTS_VALUE_LIST_CHANGE: - /* Change list value doesn't have string value */ - case CTS_VALUE_EVENT: - /* evet value doesn't have string value */ - default: - ERR("The value has unsupported type"); - ret_val = NULL; - break; - } - return ret_val; -} - -API const char* contacts_svc_value_get_str(CTSvalue *value, int field) -{ - return cts_value_handle_str(CTS_HANDLE_STR_GET, value, field); -} - -API char* contacts_svc_value_steal_str(CTSvalue *value, int field) -{ - return cts_value_handle_str(CTS_HANDLE_STR_STEAL, value, field); -} - -static inline int cts_value_set_int_plog(cts_plog *value, int field, int intval) -{ - switch (field) - { - case CTS_PLOG_VAL_LOG_TIME_INT: - value->log_time = intval; - break; - case CTS_PLOG_VAL_LOG_TYPE_INT: - value->log_type = intval; - break; - case CTS_PLOG_VAL_DURATION_INT: - case CTS_PLOG_VAL_MSGID_INT: - value->extra_data1 = intval; - break; - case CTS_PLOG_VAL_RELATED_ID_INT: - value->related_id = intval; - break; - default: - ERR("The field(%d) is not supported in value(plog)", field); - return CTS_ERR_ARG_INVALID; - } - return CTS_SUCCESS; -} - -static inline int cts_value_set_int_addrbook(cts_addrbook *value, - int field, int intval) -{ - switch (field) - { - case CTS_ADDRESSBOOK_VAL_ACC_ID_INT: - value->acc_id = intval; - break; - case CTS_ADDRESSBOOK_VAL_ACC_TYPE_INT: - value->acc_type = intval; - break; - case CTS_ADDRESSBOOK_VAL_MODE_INT: - value->mode = intval; - break; - default: - ERR("The field(%d) is not supported in value(addressbook)", field); - return CTS_ERR_ARG_INVALID; - } - return CTS_SUCCESS; -} - -API int contacts_svc_value_set_int(CTSvalue *value, int field, int intval) -{ - retv_if(NULL == value, CTS_ERR_ARG_NULL); - - switch (value->v_type) - { - case CTS_VALUE_BASIC: - ((cts_basic*)value)->type = CTS_BASIC_VAL_INT; - ((cts_basic*)value)->val.i = intval; - break; - case CTS_VALUE_EXTEND: - retvm_if(CTS_EXTEND_VAL_DATA1_INT != field, CTS_ERR_ARG_INVALID, - "Not supported field"); - ((cts_extend *)value)->data1 = intval; - break; - case CTS_VALUE_EMAIL: - case CTS_VALUE_NUMBER: - retvm_if(CTS_NUM_VAL_TYPE_INT != field, CTS_ERR_ARG_INVALID, - "Not supported field"); - ((cts_number *)value)->type = intval; - break; - case CTS_VALUE_PHONELOG: - return cts_value_set_int_plog((cts_plog *)value, field, intval); - case CTS_VALUE_GROUP_RELATION: - retvm_if(CTS_GROUPREL_VAL_ID_INT != field, CTS_ERR_ARG_INVALID, - "Not supported field"); - retvm_if(value->embedded, CTS_ERR_ARG_INVALID, - "The field is only used for creating"); - ((cts_group *)value)->id = intval; - break; - case CTS_VALUE_GROUP: - retvm_if(CTS_GROUP_VAL_ADDRESSBOOK_ID_INT != field, CTS_ERR_ARG_INVALID, - "Not supported field"); - retvm_if(!value->embedded, CTS_ERR_ARG_INVALID, - "The field is only used for updating"); - ((cts_group *)value)->addrbook_id = intval; - break; - case CTS_VALUE_MESSENGER: - retvm_if(CTS_MESSENGER_VAL_TYPE_INT != field, CTS_ERR_ARG_INVALID, - "Not supported field"); - ((cts_messenger *)value)->type = intval; - break; - case CTS_VALUE_WEB: - retvm_if(CTS_WEB_VAL_TYPE_INT != field, CTS_ERR_ARG_INVALID, - "Not supported field"); - ((cts_web *)value)->type = intval; - break; - case CTS_VALUE_EVENT: - if (CTS_EVENT_VAL_TYPE_INT == field) - ((cts_event *)value)->type = intval; - else if (CTS_EVENT_VAL_DATE_INT == field) - ((cts_event *)value)->date = intval; - else - { - ERR("Not supported field"); - return CTS_ERR_ARG_INVALID; - } - break; - case CTS_VALUE_POSTAL: - retvm_if(CTS_POSTAL_VAL_TYPE_INT != field, CTS_ERR_ARG_INVALID, - "Not supported field"); - ((cts_postal *)value)->type = intval; - break; - case CTS_VALUE_ADDRESSBOOK: - return cts_value_set_int_addrbook((cts_addrbook *)value, field, intval); - case CTS_VALUE_COMPANY: - /* company value doesn't have integer value */ - case CTS_VALUE_NAME: - /* name value doesn't have integer value */ - case CTS_VALUE_CONTACT_BASE_INFO: - /* base_info value doesn't have integer value for set */ - default: - ERR("The value has unsupported type"); - return CTS_ERR_ARG_INVALID; - } - - return CTS_SUCCESS; -} - -int contacts_svc_value_set_dbl(CTSvalue *value, int field, double dblval) -{ - retv_if(NULL == value, CTS_ERR_ARG_NULL); - - switch (value->v_type) - { - case CTS_VALUE_BASIC: - ((cts_basic*)value)->type = CTS_BASIC_VAL_DBL; - ((cts_basic*)value)->val.d = dblval; - break; - case CTS_VALUE_EMAIL: - case CTS_VALUE_NUMBER: - case CTS_VALUE_WEB: - case CTS_VALUE_POSTAL: - case CTS_VALUE_EVENT: - case CTS_VALUE_MESSENGER: - case CTS_VALUE_GROUP_RELATION: - case CTS_VALUE_COMPANY: - case CTS_VALUE_NAME: - case CTS_VALUE_CONTACT_BASE_INFO: - default: - ERR("The value has unsupported type"); - return CTS_ERR_ARG_INVALID; - } - - return CTS_SUCCESS; -} - -API int contacts_svc_value_set_bool(CTSvalue *value, - int field, bool boolval) -{ - retv_if(NULL == value, CTS_ERR_ARG_NULL); - - switch (value->v_type) - { - case CTS_VALUE_CONTACT_BASE_INFO: - if (CTS_BASE_VAL_FAVORITE_BOOL == field) - ((cts_ct_base*)value)->is_favorite = boolval; - else { - ERR("The field(%d) is not supported in value(BASE_INFO)", field); - return CTS_ERR_ARG_INVALID; - } - break; - case CTS_VALUE_NUMBER: - if (CTS_NUM_VAL_DEFAULT_BOOL == field) - ((cts_number *)value)->is_default = boolval; - else if (CTS_NUM_VAL_FAVORITE_BOOL == field) - ((cts_number *)value)->is_favorite = boolval; - else if (CTS_NUM_VAL_DELETE_BOOL == field) { - retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, - "The field is only used for updating"); - value->deleted = boolval; - } - else { - ERR("Not supported field"); - return CTS_ERR_ARG_INVALID; - } - break; - case CTS_VALUE_EMAIL: - if (CTS_EMAIL_VAL_DEFAULT_BOOL == field) - ((cts_email *)value)->is_default = boolval; - else if (CTS_EMAIL_VAL_DELETE_BOOL == field) { - retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, - "The field is only used for updating"); - value->deleted = boolval; - } - else { - ERR("Not supported field"); - return CTS_ERR_ARG_INVALID; - } - break; - case CTS_VALUE_POSTAL: - if (CTS_POSTAL_VAL_DEFAULT_BOOL == field) - ((cts_postal *)value)->is_default = boolval; - else if (CTS_POSTAL_VAL_DELETE_BOOL == field) { - retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, - "The field is only used for updating"); - value->deleted = boolval; - } - else { - ERR("Not supported field"); - return CTS_ERR_ARG_INVALID; - } - break; - case CTS_VALUE_GROUP_RELATION: - retvm_if(CTS_GROUPREL_VAL_DELETE_BOOL != field, CTS_ERR_ARG_INVALID, - "Not supported field"); - retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, - "The field is only used for updating"); - value->deleted = boolval; - break; - case CTS_VALUE_EVENT: - retvm_if(CTS_EVENT_VAL_DELETE_BOOL != field, CTS_ERR_ARG_INVALID, - "Not supported field"); - retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, - "The field is only used for updating"); - value->deleted = boolval; - break; - case CTS_VALUE_MESSENGER: - retvm_if(CTS_MESSENGER_VAL_DELETE_BOOL != field, CTS_ERR_ARG_INVALID, - "Not supported field"); - retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, - "The field is only used for updating"); - value->deleted = boolval; - break; - case CTS_VALUE_WEB: - retvm_if(CTS_WEB_VAL_DELETE_BOOL != field, CTS_ERR_ARG_INVALID, - "Not supported field"); - retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, - "The field is only used for updating"); - value->deleted = boolval; - break; - case CTS_VALUE_NICKNAME: - retvm_if(CTS_NICKNAME_VAL_DELETE_BOOL != field, CTS_ERR_ARG_INVALID, - "Not supported field"); - retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, - "The field is only used for updating"); - value->deleted = boolval; - break; - case CTS_VALUE_EXTEND: - retvm_if(CTS_EXTEND_VAL_DELETE_BOOL != field, CTS_ERR_ARG_INVALID, - "Not supported field"); - retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, - "The field is only used for updating"); - value->deleted = boolval; - break; - case CTS_VALUE_BASIC: - ((cts_basic*)value)->type = CTS_BASIC_VAL_BOOL; - ((cts_basic*)value)->val.b = boolval; - break; - case CTS_VALUE_COMPANY: - /* company value doesn't have boolean value */ - case CTS_VALUE_NAME: - /* name value doesn't have boolean value */ - default: - ERR("The value has unsupported type"); - return CTS_ERR_ARG_INVALID; - } - - return CTS_SUCCESS; -} - -static inline int cts_base_set_str(cts_ct_base *base, int field, char *strval) -{ - switch (field) - { - case CTS_BASE_VAL_IMG_PATH_STR: - if (base->embedded) - FREEandSTRDUP(base->img_path, strval); - else - base->img_path = strval; - base->img_changed = true; - break; - case CTS_BASE_VAL_RINGTONE_PATH_STR: - if (base->embedded) - FREEandSTRDUP(base->ringtone_path, strval); - else - base->ringtone_path = strval; - base->ringtone_changed = true; - break; - case CTS_BASE_VAL_NOTE_STR: - if (base->embedded) - FREEandSTRDUP(base->note, strval); - else - base->note = strval; - base->note_changed = true; - break; - case CTS_BASE_VAL_UID_STR: - if (base->embedded) - FREEandSTRDUP(base->uid, strval); - else - base->uid = strval; - base->uid_changed = true; - break; - case CTS_BASE_VAL_FULL_IMG_PATH_STR: - if (base->embedded) - FREEandSTRDUP(base->full_img_path, strval); - else - base->full_img_path = strval; - base->full_img_changed = true; - break; - default: - ERR("Not supported field"); - return CTS_ERR_ARG_INVALID; - } - return CTS_SUCCESS; -} - -static inline int cts_name_set_str(cts_name *name, int field, char *strval) -{ - switch (field) - { - case CTS_NAME_VAL_FIRST_STR: - if (name->embedded) { - FREEandSTRDUP(name->first, strval); - } - else - name->first = strval; - break; - case CTS_NAME_VAL_LAST_STR: - if (name->embedded) { - FREEandSTRDUP(name->last, strval); - } - else - name->last = strval; - break; - case CTS_NAME_VAL_ADDITION_STR: - if (name->embedded) { - FREEandSTRDUP(name->addition, strval); - } - else - name->addition = strval; - break; - case CTS_NAME_VAL_DISPLAY_STR: - if (name->embedded) { - FREEandSTRDUP(name->display, strval); - } - else - name->display = strval; - break; - case CTS_NAME_VAL_PREFIX_STR: - if (name->embedded) { - FREEandSTRDUP(name->prefix, strval); - } - else - name->prefix = strval; - break; - case CTS_NAME_VAL_SUFFIX_STR: - if (name->embedded) { - FREEandSTRDUP(name->suffix, strval); - } - else - name->suffix = strval; - break; - default: - ERR("Not supported field"); - return CTS_ERR_ARG_INVALID; - } - name->is_changed = true; - return CTS_SUCCESS; -} - -static inline int cts_postal_set_str(cts_postal *postal, int field, char *strval) -{ - switch (field) - { - case CTS_POSTAL_VAL_POBOX_STR: - if (postal->embedded) { - FREEandSTRDUP(postal->pobox, strval); - } - else - postal->pobox = strval; - break; - case CTS_POSTAL_VAL_POSTALCODE_STR: - if (postal->embedded) { - FREEandSTRDUP(postal->postalcode, strval); - } - else - postal->postalcode = strval; - break; - case CTS_POSTAL_VAL_REGION_STR: - if (postal->embedded) { - FREEandSTRDUP(postal->region, strval); - } - else - postal->region = strval; - break; - case CTS_POSTAL_VAL_LOCALITY_STR: - if (postal->embedded) { - FREEandSTRDUP(postal->locality, strval); - } - else - postal->locality = strval; - break; - case CTS_POSTAL_VAL_STREET_STR: - if (postal->embedded) { - FREEandSTRDUP(postal->street, strval); - } - else - postal->street = strval; - break; - case CTS_POSTAL_VAL_EXTENDED_STR: - if (postal->embedded) { - FREEandSTRDUP(postal->extended, strval); - } - else - postal->extended = strval; - break; - case CTS_POSTAL_VAL_COUNTRY_STR: - if (postal->embedded) { - FREEandSTRDUP(postal->country, strval); - } - else - postal->country = strval; - break; - default: - ERR("Not supported field"); - return CTS_ERR_ARG_INVALID; - } - return CTS_SUCCESS; -} - -static inline int cts_company_set_str( - cts_company *com, int field, char *strval) -{ - switch (field) - { - case CTS_COMPANY_VAL_NAME_STR: - if (com->embedded) { - FREEandSTRDUP(com->name, strval); - } - else - com->name = strval; - break; - case CTS_COMPANY_VAL_DEPARTMENT_STR: - if (com->embedded) { - FREEandSTRDUP(com->department, strval); - } - else - com->department = strval; - break; - case CTS_COMPANY_VAL_JOB_TITLE_STR: - if (com->embedded) { - FREEandSTRDUP(com->jot_title, strval); - } - else - com->jot_title = strval; - break; - case CTS_COMPANY_VAL_ROLE_STR: - if (com->embedded) { - FREEandSTRDUP(com->role, strval); - } - else - com->role = strval; - break; - case CTS_COMPANY_VAL_ASSISTANT_NAME_STR: - if (com->embedded) { - FREEandSTRDUP(com->assistant_name, strval); - } - else - com->assistant_name = strval; - break; - default: - ERR("Not supported field"); - return CTS_ERR_ARG_INVALID; - } - return CTS_SUCCESS; -} - -static inline int cts_group_set_str( - cts_group *group, int field, char *strval) -{ - switch (field) - { - case CTS_GROUP_VAL_NAME_STR: - if (group->embedded) { - FREEandSTRDUP(group->name, strval); - } - else - group->name = strval; - break; - case CTS_GROUP_VAL_RINGTONE_STR: - if (group->embedded) { - FREEandSTRDUP(group->ringtone_path, strval); - } - else - group->ringtone_path = strval; - break; - default: - ERR("Not supported field"); - return CTS_ERR_ARG_INVALID; - } - return CTS_SUCCESS; -} - -static inline int cts_extend_set_str(cts_extend *extend, int field, char *strval) -{ - switch (field) - { - case CTS_EXTEND_VAL_DATA2_STR: - if (extend->embedded) { - FREEandSTRDUP(extend->data2, strval); - } - else - extend->data2 = strval; - break; - case CTS_EXTEND_VAL_DATA3_STR: - if (extend->embedded) { - FREEandSTRDUP(extend->data3, strval); - } - else - extend->data3 = strval; - break; - case CTS_EXTEND_VAL_DATA4_STR: - if (extend->embedded) { - FREEandSTRDUP(extend->data4, strval); - } - else - extend->data4 = strval; - break; - case CTS_EXTEND_VAL_DATA5_STR: - if (extend->embedded) { - FREEandSTRDUP(extend->data5, strval); - } - else - extend->data5 = strval; - break; - case CTS_EXTEND_VAL_DATA6_STR: - if (extend->embedded) { - FREEandSTRDUP(extend->data6, strval); - } - else - extend->data6 = strval; - break; - case CTS_EXTEND_VAL_DATA7_STR: - if (extend->embedded) { - FREEandSTRDUP(extend->data7, strval); - } - else - extend->data7 = strval; - break; - case CTS_EXTEND_VAL_DATA8_STR: - if (extend->embedded) { - FREEandSTRDUP(extend->data8, strval); - } - else - extend->data8 = strval; - break; - case CTS_EXTEND_VAL_DATA9_STR: - if (extend->embedded) { - FREEandSTRDUP(extend->data9, strval); - } - else - extend->data9 = strval; - break; - - case CTS_EXTEND_VAL_DATA10_STR: - if (extend->embedded) { - FREEandSTRDUP(extend->data10, strval); - } - else - extend->data10 = strval; - break; - default: - ERR("Not supported field"); - return CTS_ERR_ARG_INVALID; - } - return CTS_SUCCESS; -} - -API int contacts_svc_value_set_str(CTSvalue *value, int field, const char *strval) -{ - char *str; - - retv_if(NULL == value, CTS_ERR_ARG_NULL); - - if (strval && *strval) - str = (char *)strval; - else - str = NULL; - - switch (value->v_type) - { - case CTS_VALUE_BASIC: - ((cts_basic*)value)->type = CTS_BASIC_VAL_STR; - if (value->embedded) - FREEandSTRDUP(((cts_basic*)value)->val.s, str); - else - ((cts_basic*)value)->val.s = str; - break; - case CTS_VALUE_CONTACT_BASE_INFO: - return cts_base_set_str((cts_ct_base *)value, field, str); - case CTS_VALUE_NAME: - return cts_name_set_str((cts_name *)value, field, str); - case CTS_VALUE_POSTAL: - return cts_postal_set_str((cts_postal *)value, field, str); - case CTS_VALUE_COMPANY: - return cts_company_set_str((cts_company *)value, field, str); - case CTS_VALUE_GROUP: - return cts_group_set_str((cts_group *)value, field, str); - case CTS_VALUE_EXTEND: - return cts_extend_set_str((cts_extend *)value, field, str); - case CTS_VALUE_NUMBER: - retvm_if(CTS_NUM_VAL_NUMBER_STR != field, CTS_ERR_ARG_INVALID, - "Not supported field"); - if (value->embedded) - FREEandSTRDUP(((cts_number*)value)->number, str); - else - ((cts_number *)value)->number = str; - break; - case CTS_VALUE_EMAIL: - retvm_if(CTS_EMAIL_VAL_ADDR_STR != field, CTS_ERR_ARG_INVALID, "Not supported field"); - if (value->embedded) - FREEandSTRDUP(((cts_email*)value)->email_addr, str); - else - ((cts_email *)value)->email_addr = str; - break; - case CTS_VALUE_GROUP_RELATION: - retvm_if(CTS_GROUPREL_VAL_NAME_STR != field, CTS_ERR_ARG_INVALID, - "Not supported field(%d) for CTS_VALUE_GROUP_RELATION", field); - retvm_if(value->embedded, CTS_ERR_ARG_INVALID, - "CTS_GROUPREL_VAL_NAME_STR is readonly"); - ((cts_group *)value)->name = str; - break; - case CTS_VALUE_PHONELOG: /* phonelog value never be embedded*/ - if (CTS_PLOG_VAL_NUMBER_STR == field) - ((cts_plog *)value)->number = str; - else if (CTS_PLOG_VAL_SHORTMSG_STR == field) - ((cts_plog *)value)->extra_data2 = str; - else - { - ERR("Not supported field"); - return CTS_ERR_ARG_INVALID; - } - break; - case CTS_VALUE_MESSENGER: - retvm_if(CTS_MESSENGER_VAL_IM_ID_STR != field, CTS_ERR_ARG_INVALID, "Not supported field"); - if (value->embedded) - FREEandSTRDUP(((cts_messenger *)value)->im_id, str); - else - ((cts_messenger *)value)->im_id = str; - break; - case CTS_VALUE_WEB: - retvm_if(CTS_WEB_VAL_ADDR_STR != field, CTS_ERR_ARG_INVALID, "Not supported field"); - if (value->embedded) - FREEandSTRDUP(((cts_web *)value)->url, str); - else - ((cts_web *)value)->url = str; - break; - case CTS_VALUE_NICKNAME: - retvm_if(CTS_NICKNAME_VAL_NAME_STR != field, CTS_ERR_ARG_INVALID, "Not supported field"); - if (value->embedded) - FREEandSTRDUP(((cts_nickname *)value)->nick, str); - else - ((cts_nickname *)value)->nick = str; - break; - case CTS_VALUE_ADDRESSBOOK: - retvm_if(CTS_ADDRESSBOOK_VAL_NAME_STR != field, CTS_ERR_ARG_INVALID, - "Not supported field"); - if (value->embedded) - FREEandSTRDUP(((cts_addrbook *)value)->name, str); - else - ((cts_addrbook *)value)->name = str; - break; - case CTS_VALUE_EVENT: - /* evet value doesn't have string value */ - default: - ERR("The value has unsupported type"); - return CTS_ERR_ARG_INVALID; - } - - return CTS_SUCCESS; -} diff --git a/src/cts-struct.h b/src/cts-struct.h deleted file mode 100755 index bd5b1db..0000000 --- a/src/cts-struct.h +++ /dev/null @@ -1,826 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_STRUCT_H__ -#define __CTS_STRUCT_H__ - -#include -#include -#include -#include - -#define CTS_NUMBER_MAX_LEN 512 - -#define SMART_STRDUP(src) (src && *src)?strdup(src):NULL -#define SAFE_STRDUP(src) (src)?strdup(src):NULL -#define FREEandSTRDUP(dest, src) \ - do{ \ - free(dest);\ - if (src) dest = strdup(src);\ - else dest = NULL; \ - }while (0) - -enum { - CTS_HANDLE_STR_GET, - CTS_HANDLE_STR_STEAL, -}; - -#define HANDLE_STEAL_STRING(op_code, dest, src) \ - do{ \ - dest=src; \ - if (CTS_HANDLE_STR_STEAL == op_code) src=NULL; \ - }while (0) - -#define CTS_DATA_FIELD_NAME (1<<0) -#define CTS_DATA_FIELD_POSTAL (1<<1) -#define CTS_DATA_FIELD_MESSENGER (1<<2) -#define CTS_DATA_FIELD_WEB (1<<3) -#define CTS_DATA_FIELD_EVENT (1<<4) -#define CTS_DATA_FIELD_COMPANY (1<<5) -#define CTS_DATA_FIELD_NICKNAME (1<<6) -#define CTS_DATA_FIELD_NUMBER (1<<7) -#define CTS_DATA_FIELD_EMAIL (1<<8) -#define CTS_DATA_FIELD_EXTEND_ALL (1<<9) -#define CTS_DATA_FIELD_ALL ((1<<9)|(1<<8)|(1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0)) - -enum { - CTS_DATA_NAME = 1, - CTS_DATA_POSTAL = 2, - CTS_DATA_MESSENGER = 3, - CTS_DATA_WEB = 4, - CTS_DATA_EVENT = 5, - CTS_DATA_COMPANY = 6, - CTS_DATA_NICKNAME = 7, - CTS_DATA_NUMBER = 8, - CTS_DATA_EMAIL = 9, - CTS_DATA_EXTEND_START = 100 -}; - -typedef struct { - int v_type:16; - bool embedded; - bool deleted; - int type; - union { - int i; - bool b; - double d; - char *s; - }val; -}cts_basic; //CTS_BASIC_VAL_ - -typedef struct { - int v_type:16; - bool embedded; - bool deleted; - bool uid_changed; - bool img_changed; - bool full_img_changed; - bool ringtone_changed; - bool note_changed; - bool is_favorite; - int id; - int changed_time; - int addrbook_id; - char *uid; - char *img_path; - char *full_img_path; - char *ringtone_path; - char *note; - char *vcard_img_path; -}cts_ct_base; //CTS_BASE_VAL_ - -typedef struct { - int v_type:16; - bool embedded; - bool deleted; - bool is_changed; - int id; - int lang_type; - char *first; - char *last; - char *addition; - char *display; - char *prefix; - char *suffix; -}cts_name; //CTS_NAME_VAL_ - -typedef struct { - int v_type:16; - bool embedded; - bool deleted; - bool is_default; - bool is_favorite; - int id; - int type; - char *number; - char *added_type; -}cts_number; //CTS_NUM_VAL_ - -typedef struct { - int v_type:16; - bool embedded; - bool deleted; - bool is_default; - int id; - int type; - char *email_addr; -}cts_email; //CTS_EMAIL_VAL_ - -typedef struct { - int v_type:16; - bool embedded; - bool deleted; - int id; - int type; - char *url; -}cts_web; //CTS_WEB_VAL_ - -typedef struct { - int v_type:16; - bool embedded; - bool deleted; - bool is_default; - int id; - int type; - char *pobox; - char *postalcode; - char *region; - char *locality; - char *street; - char *extended; - char *country; -}cts_postal; //CTS_POSTAL_VAL_ - -typedef struct { - int v_type:16; - bool embedded; - bool deleted; - int id; - int type; - int date; -}cts_event;//CTS_EVENT_VAL_ - -typedef struct { - int v_type:16; - bool embedded; - bool deleted; - int id; - int type; - char *im_id; -}cts_messenger;//CTS_MESSENGER_VAL_ - -typedef struct { - int v_type:16; - bool embedded; - bool deleted; - int id; - char *nick; -}cts_nickname; //CTS_NICKNAME_VAL_ - -typedef struct { - int v_type:16; - bool embedded; - bool deleted; - int id; - int addrbook_id; - char *name; - char *ringtone_path; - char *vcard_group; - // char *image_path; -}cts_group; //CTS_GROUP_VAL_ or CTS_GROUPREL_VAL_ - -typedef struct { - int v_type:16; - bool embedded; - bool deleted; - int id; - int acc_id; - int acc_type; - int mode; - char *name; -}cts_addrbook; //CTS_ADDRESSBOOK_VAL_ - -typedef struct { - int v_type:16; - bool embedded; - bool deleted; /* not used */ - int id; - char *name; - char *department; - char *jot_title; - char *role; - char *assistant_name; -}cts_company;//CTS_COMPANY_VAL_ - -typedef struct { - int v_type:16; - bool embedded; - bool deleted; - int id; - char *number; - int related_id; /* contact id */ - int log_time; - int log_type; - int extra_data1; /* duration, message_id */ - char *extra_data2; /*short message*/ -}cts_plog;//PHONELOGVALUE - -typedef struct { - int v_type:16; - bool embedded; - bool deleted; - int id; - int type; - int data1; - char *data2; - char *data3; - char *data4; - char *data5; - char *data6; - char *data7; - char *data8; - char *data9; - char *data10; -}cts_extend;//EXTENDVALUE - -typedef struct { - int v_type:16; - bool embedded; - int id; - int num_type; - char *first; - char *last; - char *display; - char *number; - char *img_path; - int log_time; - int log_type; - int extra_data1; /* duration, message_id */ - char *extra_data2; /*short message*/ - int related_id; /* contact id */ -}plog_list;//CTS_LIST_PLOG_ - -typedef struct { - int v_type:16; - bool embedded; - int id; - int acc_id; - char *img_path; - char *first; - char *last; - char *display; - char *connect; - char *normalize; -}contact_list;//CTS_LIST_CONTACT_ - -typedef struct { - int v_type:16; - bool embedded; - char *name; - char *number; -}sdn_list;//SDNLIST - -typedef struct { - int v_type:16; - bool embedded; - int changed_type:8; - int id; - int changed_ver; -}change_list;//CTS_LIST_CHANGE_ - -typedef struct { - int v_type:16; - bool embedded; - int id; - int account_type; - char *name; -}addrbook_list;//CTS_LIST_ADDRESSBOOK_ - -typedef struct { - int v_type:16; - bool embedded; - int id; - char *name; -}numtype_list;//CUSTOMNUMTYPELIST - -typedef struct { - int v_type:16; - bool embedded; - int id; - int contact_id; - char *first; - char *last; - char *display; - char *number; - char *img_path; - int num_type; - int speeddial; -}shortcut_list;//CTS_LIST_FAVORITE_ - -typedef struct { - int s_type; - cts_ct_base *base; - cts_name *name; - GSList *numbers; - GSList *emails; - GSList *grouprelations; - GSList *events; - GSList *messengers; - GSList *postal_addrs; - GSList *web_addrs; - GSList *nicknames; - cts_company *company; - int default_num; - int default_email; - GSList *extended_values; -}contact_t; //cts_struct_field - -enum{ - CTS_VALUE_BASIC = 100, /**< Deprecated */ - CTS_VALUE_LIST_CONTACT = 101, - CTS_VALUE_LIST_ADDRBOOK, // ADDRESSBOOKLIST order must be same to ADDRESSBOOKVALUE order. - CTS_VALUE_LIST_PLOG, - CTS_VALUE_LIST_CUSTOM_NUM_TYPE, - CTS_VALUE_LIST_CHANGE, - CTS_VALUE_LIST_GROUP, - CTS_VALUE_LIST_NUMBERINFO, // NUMBERLIST order must be same to EMAILLIST order. - CTS_VALUE_LIST_EMAILINFO, // EMAILLIST order must be same to NUMBERLIST order. - CTS_VALUE_LIST_NUMS_EMAILS, - CTS_VALUE_LIST_SDN, - CTS_VALUE_RDONLY_NAME, - CTS_VALUE_RDONLY_NUMBER, - CTS_VALUE_RDONLY_EMAIL, - CTS_VALUE_RDONLY_COMPANY, - CTS_VALUE_LIST_SHORTCUT, - CTS_VALUE_RDONLY_PLOG, -}; - -//basic -enum { - CTS_BASIC_VAL_INT, - CTS_BASIC_VAL_DBL, - CTS_BASIC_VAL_BOOL, - CTS_BASIC_VAL_STR -}; - -#ifndef __CONTACTS_SVC_H__ - -struct cts_struct{ - int s_type; -}; - -struct cts_value{ - int v_type:16; - bool embedded; - bool deleted; -}; - -// -#endif //__CONTACTS_SVC_H__ - -#endif //__CTS_STRUCT_H__ - diff --git a/src/cts-types.c b/src/cts-types.c deleted file mode 100755 index 0cab02f..0000000 --- a/src/cts-types.c +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include "cts-internal.h" -#include "cts-sqlite.h" -#include "cts-schema.h" -#include "cts-utils.h" -#include "cts-types.h" - -API char* contacts_svc_get_custom_type(cts_custom_type_class type_class, - int index) -{ - int ret; - char *ret_val = NULL; - cts_stmt stmt = NULL; - char query[CTS_SQL_MIN_LEN] = {0}; - - CTS_START_TIME_CHECK; - - if (CTS_TYPE_CLASS_EXTEND_DATA == type_class) index -= CTS_DATA_EXTEND_START; - else if (CTS_TYPE_CLASS_NUM == type_class) index ^= CTS_NUM_TYPE_CUSTOM; - - snprintf(query, sizeof(query), - "SELECT name FROM %s WHERE id = %d", - CTS_TABLE_CUSTOM_TYPES, index); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, NULL, "cts_query_prepare() Failed"); - - ret = cts_stmt_step(stmt); - if (CTS_TRUE == ret) - ret_val = cts_stmt_get_text(stmt, 0); - cts_stmt_finalize(stmt); - - ret_val = SAFE_STRDUP(ret_val); - - CTS_END_TIME_CHECK(); - return ret_val; -} - -API int contacts_svc_insert_custom_type(cts_custom_type_class type_class, - char *type_name) -{ - int ret; - cts_stmt stmt = NULL; - char query[CTS_SQL_MIN_LEN] = {0}; - - retv_if(NULL == type_name, CTS_ERR_ARG_NULL); - - snprintf(query, sizeof(query), - "INSERT INTO %s(class, name) VALUES(%d, ?)", - CTS_TABLE_CUSTOM_TYPES, type_class); - - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - cts_stmt_bind_text(stmt, 1, type_name); - - ret = cts_stmt_step(stmt); - if (CTS_SUCCESS != ret) - { - ERR("cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - contacts_svc_end_trans(false); - return ret; - } - ret = cts_db_get_last_insert_id(); - cts_stmt_finalize(stmt); - - int trans_ret = contacts_svc_end_trans(true); - retvm_if(trans_ret < CTS_SUCCESS, trans_ret, - "contacts_svc_end_trans(true) Failed(%d)", trans_ret); - - if (CTS_TYPE_CLASS_EXTEND_DATA == type_class) ret += CTS_DATA_EXTEND_START; - else if (CTS_TYPE_CLASS_NUM == type_class) ret |= CTS_NUM_TYPE_CUSTOM; - return ret; -} - -API int contacts_svc_delete_custom_type(cts_custom_type_class type_class, - int index) -{ - int ret; - char query[CTS_SQL_MIN_LEN] = {0}; - - retvm_if(CTS_TYPE_CLASS_NUM == type_class && index <= CTS_NUM_TYPE_ASSISTANT, - CTS_ERR_ARG_INVALID, - "This custom number type(System Number Type) is diable to delete"); - - if (CTS_TYPE_CLASS_EXTEND_DATA == type_class) index -= CTS_DATA_EXTEND_START; - else if (CTS_TYPE_CLASS_NUM == type_class) index ^= CTS_NUM_TYPE_CUSTOM; - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - snprintf(query, sizeof(query), "DELETE FROM %s WHERE class = %d AND id = %d", - CTS_TABLE_CUSTOM_TYPES, type_class, index); - - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) - { - ERR("cts_query_exec() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - ret = contacts_svc_end_trans(true); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -API int contacts_svc_find_custom_type(cts_custom_type_class type_class, - char *type_name) -{ - int ret; - char query[CTS_SQL_MAX_LEN] = {0}; - - retv_if(NULL == type_name, CTS_ERR_ARG_NULL); - - CTS_START_TIME_CHECK; - - snprintf(query, sizeof(query), - "SELECT id FROM %s WHERE class = %d AND name = '%s'", - CTS_TABLE_CUSTOM_TYPES, type_class, type_name); - ret = cts_query_get_first_int_result(query); - retvm_if(ret < CTS_SUCCESS, ret, "cts_query_get_first_int_result() Failed(%d)", ret); - - if (CTS_TYPE_CLASS_EXTEND_DATA == type_class) ret += CTS_DATA_EXTEND_START; - else if (CTS_TYPE_CLASS_NUM == type_class) ret |= CTS_NUM_TYPE_CUSTOM; - - CTS_END_TIME_CHECK(); - return ret; -} - diff --git a/src/cts-types.h b/src/cts-types.h deleted file mode 100755 index 6e81b8f..0000000 --- a/src/cts-types.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_TYPES_H__ -#define __CTS_TYPES_H__ - -// - -#endif //__CTS_TYPES_H__ - diff --git a/src/cts-utils.c b/src/cts-utils.c deleted file mode 100755 index 8bec57c..0000000 --- a/src/cts-utils.c +++ /dev/null @@ -1,929 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include -#include -#include -#include - -#include "cts-internal.h" -#include "cts-utils.h" -#include "cts-schema.h" -#include "cts-sqlite.h" -#include "cts-socket.h" -#include "cts-normalize.h" -#include "cts-inotify.h" -#include "cts-vcard.h" -#include "cts-pthread.h" -#include "cts-types.h" - -static const char *CTS_NOTI_CONTACT_CHANGED=CTS_NOTI_CONTACT_CHANGED_DEF; -static const char *CTS_NOTI_PLOG_CHANGED="/opt/data/contacts-svc/.CONTACTS_SVC_PLOG_CHANGED"; -static const char *CTS_NOTI_FAVORITE_CHANGED="/opt/data/contacts-svc/.CONTACTS_SVC_FAVOR_CHANGED"; -static const char *CTS_NOTI_SPEEDDIAL_CHANGED="/opt/data/contacts-svc/.CONTACTS_SVC_SPEED_CHANGED"; -static const char *CTS_NOTI_ADDRBOOK_CHANGED="/opt/data/contacts-svc/.CONTACTS_SVC_AB_CHANGED"; -static const char *CTS_NOTI_GROUP_CHANGED="/opt/data/contacts-svc/.CONTACTS_SVC_GROUP_CHANGED"; -static const char *CTS_NOTI_GROUP_RELATION_CHANGED="/opt/data/contacts-svc/.CONTACTS_SVC_GROUP_REL_CHANGED"; -static const char *CTS_NOTI_MISSED_CALL_CHANGED="/opt/data/contacts-svc/.CONTACTS_SVC_MISSED_CHANGED"; - -static const char *CTS_VCONF_SORTING_ORDER="db/service/contacts/name_sorting_order"; -static const char *CTS_VCONF_DISPLAY_ORDER=CTS_VCONF_DISPLAY_ORDER_DEF; - -static int transaction_count = 0; -static int transaction_ver = 0; -static bool version_up=false; - -static bool contact_change=false; -static bool plog_change=false; -static bool missed_change=false; -static bool favor_change=false; -static bool speed_change=false; -static bool addrbook_change=false; -static bool group_change=false; -static bool group_rel_change=false; - -static int name_sorting_order = -1; -static int name_display_order = -1; -static int default_lang = -1; - -static void cts_vconf_callback(keynode_t *key, void *data) -{ - //if(!strcmp(vconf_keynode_get_name(key), CTS_VCONF_SORTING_ORDER)); - if (CTS_ORDER_OF_SORTING == (int)data) - name_sorting_order = vconf_keynode_get_int(key); - else if (CTS_ORDER_OF_DISPLAY == (int)data) - name_display_order = vconf_keynode_get_int(key); - else if (CTS_ORDER_OF_DISPLAY + 1 == (int)data) - default_lang = vconf_keynode_get_int(key); -} - -int cts_get_default_language(void) -{ - if (default_lang < 0) { - int ret; - ret = vconf_get_int(CTS_VCONF_DEFAULT_LANGUAGE, &default_lang); - warn_if(ret < 0, "vconf_get_int() Failed(%d)", ret); - } - return default_lang; -} - -void cts_set_contact_noti(void) -{ - contact_change = true; -} -void cts_set_plog_noti(void) -{ - plog_change = true; -} -void cts_set_missed_call_noti(void) -{ - missed_change = true; -} -void cts_set_favor_noti(void) -{ - favor_change = true; -} -void cts_set_speed_noti(void) -{ - speed_change = true; -} -void cts_set_addrbook_noti(void) -{ - addrbook_change = true; -} -void cts_set_group_noti(void) -{ - group_change = true; -} -void cts_set_group_rel_noti(void) -{ - group_rel_change = true; -} - -static inline void cts_noti_publish_contact_change(void) -{ - int fd = open(CTS_NOTI_CONTACT_CHANGED, O_TRUNC | O_RDWR); - if (0 <= fd) { - close(fd); - contact_change = false; - } -} - -static inline void cts_noti_publish_plog_change(void) -{ - int fd = open(CTS_NOTI_PLOG_CHANGED, O_TRUNC | O_RDWR); - if (0 <= fd) { - close(fd); - plog_change = false; - } -} - -static inline void cts_noti_publish_missed_call_change(void) -{ - int fd = open(CTS_NOTI_MISSED_CALL_CHANGED, O_TRUNC | O_RDWR); - if (0 <= fd) { - close(fd); - missed_change = false; - } -} - -static inline void cts_noti_publish_favor_change(void) -{ - int fd = open(CTS_NOTI_FAVORITE_CHANGED, O_TRUNC | O_RDWR); - if (0 <= fd) { - close(fd); - favor_change = false; - } -} - -static inline void cts_noti_publish_speed_change(void) -{ - int fd = open(CTS_NOTI_SPEEDDIAL_CHANGED, O_TRUNC | O_RDWR); - if (0 <= fd) { - close(fd); - speed_change = false; - } -} - -static inline void cts_noti_publish_addrbook_change(void) -{ - int fd = open(CTS_NOTI_ADDRBOOK_CHANGED, O_TRUNC | O_RDWR); - if (0 <= fd) { - close(fd); - addrbook_change = false; - } -} - -static inline void cts_noti_publish_group_change(void) -{ - int fd = open(CTS_NOTI_GROUP_CHANGED, O_TRUNC | O_RDWR); - if (0 <= fd) { - close(fd); - group_change = false; - } -} - -static inline void cts_noti_publish_group_rel_change(void) -{ - int fd = open(CTS_NOTI_GROUP_RELATION_CHANGED, O_TRUNC | O_RDWR); - if (0 <= fd) { - close(fd); - group_rel_change = false; - } -} - -#define CTS_COMMIT_TRY_MAX 500000 // For 3second -API int contacts_svc_begin_trans(void) -{ - int ret = -1, progress; - - if (transaction_count <= 0) - { - ret = cts_query_exec("BEGIN IMMEDIATE TRANSACTION"); //taken 600ms - progress = 100000; - while (CTS_ERR_DB_LOCK == ret && progress 0) { - ret = write(dest_fd, buf, size); - if (ret <= 0) { - if (EINTR == errno) - continue; - else { - ERR("write() Failed(%d)", errno); - if (ENOSPC == errno) - ret = CTS_ERR_NO_SPACE; - else - ret = CTS_ERR_IO_ERR; - close(src_fd); - close(dest_fd); - unlink(dest); - return ret; - } - } - } - - fchown(dest_fd, getuid(), CTS_SECURITY_FILE_GROUP); - fchmod(dest_fd, CTS_SECURITY_DEFAULT_PERMISSION); - close(src_fd); - close(dest_fd); - *dest_img = strdup(dest); - return CTS_SUCCESS; -} - -int cts_update_image_file(int img_type, int index, char *src_img, char **dest_img) -{ - int ret; - - *dest_img = NULL; - ret = cts_delete_image_file(img_type, index); - retvm_if(CTS_SUCCESS != ret && CTS_ERR_DB_RECORD_NOT_FOUND != ret, - ret, "cts_delete_image_file() Failed(%d)", ret); - - if (src_img) { - ret = cts_add_image_file(img_type, index, src_img, &(*dest_img)); - retvm_if(CTS_SUCCESS != ret, ret, "cts_add_image_file() Failed(%d)", ret); - } - - return ret; -} - -int cts_update_contact_changed_time(int contact_id) -{ - int ret; - char query[CTS_SQL_MIN_LEN]; - - snprintf(query, sizeof(query), - "UPDATE %s SET changed_ver=%d, changed_time=%d WHERE contact_id=%d", - CTS_TABLE_CONTACTS, cts_get_next_ver(), (int)time(NULL), contact_id); - - ret = cts_query_exec(query); - retvm_if(CTS_SUCCESS != ret, ret, "cts_query_exec() Failed(%d)", ret); - - cts_set_contact_noti(); - - return CTS_SUCCESS; -} - -API int contacts_svc_save_image(cts_img_t img_type, int index, char *src_img) -{ - int ret; - char *dest_img; - char query[CTS_SQL_MIN_LEN]; - cts_stmt stmt; - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - ret = cts_update_image_file(img_type, index, src_img, &dest_img); - if (CTS_SUCCESS != ret) { - ERR("cts_update_image_file() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - snprintf(query, sizeof(query), - "UPDATE %s SET changed_ver=%d, changed_time=%d, image%d=? WHERE contact_id=%d", - CTS_TABLE_CONTACTS, cts_get_next_ver(), (int)time(NULL), img_type, index); - stmt = cts_query_prepare(query); - if (NULL == stmt) { - ERR("cts_query_prepare() Failed"); - contacts_svc_end_trans(false); - return CTS_ERR_DB_FAILED; - } - - if(dest_img) - cts_stmt_bind_text(stmt, 1, dest_img); - ret = cts_stmt_step(stmt); - warn_if(CTS_SUCCESS != ret, "cts_stmt_step() Failed(%d)", ret); - cts_stmt_finalize(stmt); - - cts_set_contact_noti(); - - ret = contacts_svc_end_trans(true); - retvm_if(ret < CTS_SUCCESS, ret, "contacts_svc_end_trans() Failed(%d)", ret); - - return CTS_SUCCESS; -} - -API int contacts_svc_count_with_int(cts_count_int_op op_code, int search_value) -{ - int ret; - cts_stmt stmt; - char query[CTS_SQL_MIN_LEN] = {0}; - - switch (op_code) - { - case CTS_GET_COUNT_CONTACTS_IN_ADDRESSBOOK: - snprintf(query, sizeof(query), - "SELECT COUNT(contact_id) FROM %s " - "WHERE addrbook_id = ?", CTS_TABLE_CONTACTS); - break; - case CTS_GET_COUNT_CONTACTS_IN_GROUP: - snprintf(query, sizeof(query), - "SELECT COUNT(contact_id) FROM %s WHERE group_id = ?", - CTS_TABLE_GROUPING_INFO); - break; - case CTS_GET_COUNT_NO_GROUP_CONTACTS_IN_ADDRESSBOOK: - snprintf(query, sizeof(query), - "SELECT COUNT(contact_id) FROM %s A " - "WHERE addrbook_id = ? AND NOT EXISTS " - "(SELECT contact_id FROM %s WHERE contact_id=A.contact_id LIMIT 1)", - CTS_TABLE_CONTACTS, CTS_TABLE_GROUPING_INFO); - break; - default: - ERR("Invalid parameter : The op_code(%d) is not supported", op_code); - return CTS_ERR_ARG_INVALID; - } - stmt = cts_query_prepare(query); - retvm_if(NULL == stmt, CTS_ERR_DB_FAILED, "cts_query_prepare() Failed"); - - cts_stmt_bind_int(stmt, 1, search_value); - ret = cts_stmt_get_first_int_result(stmt); - if (CTS_ERR_DB_RECORD_NOT_FOUND == ret) return 0; - else return ret; -} - -API int contacts_svc_count(cts_count_op op_code) -{ - int ret; - char query[CTS_SQL_MIN_LEN] = {0}; - - switch ((int)op_code) - { - case CTS_GET_ALL_CONTACT: - snprintf(query, sizeof(query),"SELECT COUNT(*) FROM %s", - CTS_TABLE_CONTACTS); - break; - case CTS_GET_COUNT_SDN: - snprintf(query, sizeof(query),"SELECT COUNT(*) FROM %s", - CTS_TABLE_SIM_SERVICES); - break; - case CTS_GET_ALL_PHONELOG: - snprintf(query, sizeof(query), "SELECT COUNT(*) FROM %s", - CTS_TABLE_PHONELOGS); - break; - case CTS_GET_UNSEEN_MISSED_CALL: - snprintf(query, sizeof(query), - "SELECT COUNT(*) FROM %s " - "WHERE log_type = %d OR log_type = %d", - CTS_TABLE_PHONELOGS, - CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN, CTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN); - break; - default: - ERR("Invalid parameter : The op_code(%d) is not supported", op_code); - return CTS_ERR_ARG_INVALID; - } - - ret = cts_query_get_first_int_result(query); - if (CTS_ERR_DB_RECORD_NOT_FOUND == ret) return 0; - else return ret; -} - -int cts_convert_nicknames2textlist(GSList *src, char *dest, int dest_size) -{ - int len; - GSList *nick_repeat = src; - cts_nickname *nick_data; - - retvm_if(dest_size <= 0 || NULL == dest, CTS_ERR_ARG_INVALID, - "The parameter is Invalid. dest = %p, dest_size = %d", dest, dest_size); - - len = 0; - dest[0] = '\0'; - while (nick_repeat) { - if (NULL != (nick_data = (cts_nickname *)nick_repeat->data) && nick_data->nick) { - if (!nick_data->deleted) - len += snprintf(dest+len, dest_size-len, "%s,", nick_data->nick); - } - nick_repeat = nick_repeat->next; - } - - len = strlen(dest); - if (len) - dest[len - 1] = '\0'; - else - return CTS_ERR_NO_DATA; - return CTS_SUCCESS; -} - -GSList* cts_convert_textlist2nicknames(char *text_list) -{ - char temp[CTS_SQL_MAX_LEN], *text_start, *text_end; - GSList *ret_list = NULL; - cts_nickname *result; - - snprintf(temp, sizeof(temp), "%s", text_list); - - text_start = temp; - while (text_start) - { - text_end = strchr(text_start, ','); - if (text_end) - *text_end = '\0'; - - result = (cts_nickname *)contacts_svc_value_new(CTS_VALUE_NICKNAME); - if (result) - { - result->embedded = true; - result->nick = strdup(text_start); - } - - ret_list = g_slist_append(ret_list, result); - - if (text_end) { - *text_end = ','; - text_start = text_end+1; - } - else - text_start = NULL; - } - return ret_list; -} - -API int contacts_svc_import_sim(void) -{ - int ret; - - cts_mutex_lock(CTS_MUTEX_SOCKET_FD); - ret = cts_request_sim_import(); - cts_mutex_unlock(CTS_MUTEX_SOCKET_FD); - - return ret; -} - -int cts_increase_outgoing_count(int contact_id) -{ - int ret; - char query[CTS_SQL_MIN_LEN]; - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - snprintf(query, sizeof(query), - "UPDATE %s SET outgoing_count = outgoing_count + 1 WHERE contact_id = %d", - CTS_TABLE_CONTACTS, contact_id); - - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) - { - ERR("cts_query_exec() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - ret = contacts_svc_end_trans(true); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -API int contacts_svc_reset_outgoing_count(int contact_id) -{ - int ret ; - char query[CTS_SQL_MAX_LEN]; - - snprintf(query, sizeof(query), - "UPDATE %s SET outgoing_count = 0 WHERE contact_id = %d", - CTS_TABLE_CONTACTS, contact_id); - - ret = contacts_svc_begin_trans(); - retvm_if(ret, ret, "contacts_svc_begin_trans() Failed(%d)", ret); - - ret = cts_query_exec(query); - if (CTS_SUCCESS != ret) - { - ERR("cts_query_exec() Failed(%d)", ret); - contacts_svc_end_trans(false); - return ret; - } - - ret = contacts_svc_end_trans(true); - if (ret < CTS_SUCCESS) - return ret; - else - return CTS_SUCCESS; -} - -#ifdef CTS_TIMECHECK -double cts_set_start_time(void) -{ - struct timeval tv; - double curtime; - - gettimeofday(&tv, NULL); - curtime = tv.tv_sec * 1000 + (double)tv.tv_usec/1000; - return curtime; -} - -double cts_exec_time(double start) -{ - double end = cts_set_start_time(); - return (end - start - correction); -} - -int cts_init_time(void) -{ - double temp_t; - temp_t = cts_set_start_time(); - correction = cts_exec_time(temp_t); - - return 0; -} -#endif - diff --git a/src/cts-utils.h b/src/cts-utils.h deleted file mode 100755 index 6350fc8..0000000 --- a/src/cts-utils.h +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_UTILS_H__ -#define __CTS_UTILS_H__ - -#include - -#define CTS_IMG_PATH_SIZE_MAX 1024 -#define CTS_IMAGE_LOCATION "/opt/data/contacts-svc/img" -#define CTS_VCARD_IMAGE_LOCATION "/opt/data/contacts-svc/img/vcard" -#define CTS_NOTI_CONTACT_CHANGED_DEF "/opt/data/contacts-svc/.CONTACTS_SVC_DB_CHANGED" -#define CTS_VCONF_DISPLAY_ORDER_DEF "db/service/contacts/name_display_order" - -void cts_deregister_noti(void); -void cts_register_noti(void); -int cts_get_default_language(void); -void cts_set_contact_noti(void); -void cts_set_plog_noti(void); -void cts_set_missed_call_noti(void); -void cts_set_favor_noti(void); -void cts_set_speed_noti(void); -void cts_set_addrbook_noti(void); -void cts_set_group_noti(void); -void cts_set_group_rel_noti(void); -int cts_exist_file(char *path); -int cts_convert_nicknames2textlist(GSList *src, char *dest, int dest_size); -GSList* cts_convert_textlist2nicknames(char *text_list); -int cts_increase_outgoing_count(int contact_id); -int cts_get_next_ver(void); -int cts_update_contact_changed_time(int contact_id); -int cts_delete_image_file(int img_type, int index); -int cts_add_image_file(int img_type, int index, char *src_img, char **dest_img); -int cts_update_image_file(int img_type, int index, char *src_img, char **dest_img); - -#ifndef __CONTACTS_SVC_H__ -// -#endif //#ifndef __CONTACTS_SVC_H__ - -#endif //__CTS_UTILS_H__ - diff --git a/src/cts-vcard-file.c b/src/cts-vcard-file.c deleted file mode 100755 index cf8e6ce..0000000 --- a/src/cts-vcard-file.c +++ /dev/null @@ -1,1765 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include -#include -#include -#include - -#include "cts-internal.h" -#include "cts-types.h" -#include "cts-utils.h" -#include "cts-normalize.h" -#include "cts-vcard.h" -#include "cts-vcard-file.h" - -static int cts_tmp_photo_id; - -enum { - CTS_VCARD_VER_NONE, - CTS_VCARD_VER_2_1, - CTS_VCARD_VER_3_0, - CTS_VCARD_VER_4_0, -}; - -enum { - CTS_VCARD_VALUE_NONE, - CTS_VCARD_VALUE_FN, - CTS_VCARD_VALUE_N, - CTS_VCARD_VALUE_NICKNAME, - CTS_VCARD_VALUE_PHOTO, - CTS_VCARD_VALUE_BDAY, - CTS_VCARD_VALUE_ADR, - CTS_VCARD_VALUE_LABEL, - CTS_VCARD_VALUE_TEL, - CTS_VCARD_VALUE_EMAIL, - CTS_VCARD_VALUE_TITLE, - CTS_VCARD_VALUE_ROLE, - CTS_VCARD_VALUE_ORG, - CTS_VCARD_VALUE_NOTE, - CTS_VCARD_VALUE_REV, - CTS_VCARD_VALUE_UID, - CTS_VCARD_VALUE_URL, - CTS_VCARD_VALUE_X_ANNIVERSARY, - CTS_VCARD_VALUE_X_IRMC_LUID, - CTS_VCARD_VALUE_X_SLP_GROUP, - CTS_VCARD_VALUE_END, - CTS_VCARD_VALUE_MAX -}; - -static const char *content_name[CTS_VCARD_VALUE_MAX]; - -static inline char* cts_vcard_remove_empty_line(char *src) -{ - while (*src) { - if ('\n' != *src && '\r' != *src) - break; - src++; - } - return src; -} - -static char* cts_vcard_check_word(char *src, const char *word) -{ - bool start = false; - - retvm_if(NULL == src, NULL, "The src is NULL."); - - src = cts_vcard_remove_empty_line(src); - - while (*src) { - switch (*src) { - case ' ': - case ':': - case ';': - src++; - break; - default: - start = true; - break; - } - if (start) break; - } - - while (*src == *word) { - src++; - word++; - - if ('\0' == *src || '\0' == *word) - break; - } - - if ('\0' == *word) - return src; - else - return NULL; -} - -static int cts_vcard_check_content_type(char **vcard) -{ - int i; - char *new_start; - - for (i=CTS_VCARD_VALUE_NONE+1;idisplay = SAFE_STRDUP(temp); - - return CTS_SUCCESS; -} - - -static inline int cts_vcard_get_name(cts_name *name, char *val) -{ - char *temp, *start; - const char separator = ';'; - - start = cts_get_content_value(val); - retv_if(NULL == start, CTS_ERR_NO_DATA); - - temp = cts_strtok(start, separator); - name->last = SMART_STRDUP(start); - start = temp; - temp = cts_strtok(start, separator); - name->first = SMART_STRDUP(start); - start = temp; - temp = cts_strtok(start, separator); - name->addition = SMART_STRDUP(start); - start = temp; - temp = cts_strtok(start, separator); - name->prefix = SMART_STRDUP(start); - start = temp; - temp = cts_strtok(start, separator); - name->suffix = SMART_STRDUP(start); - - return CTS_SUCCESS; -} - -static inline GSList* cts_vcard_get_nickname(GSList *nicks, char *val) -{ - char *temp; - cts_nickname *result; - const char *separator = ","; - - temp = strtok(val, separator); - while (temp) { - if ('\0' == *temp) continue; - - result = (cts_nickname *)contacts_svc_value_new(CTS_VALUE_NICKNAME); - if (result) { - result->embedded = true; - result->nick = strdup(temp); - nicks = g_slist_append(nicks, result); - } - - temp = strtok(NULL, separator); - } - - return nicks; -} - -static inline GSList* cts_vcard_get_event(GSList *events, int type, char *val) -{ - cts_event *event; - - event = (cts_event *)contacts_svc_value_new(CTS_VALUE_EVENT); - if (event) { - char *dest, *src; - - event->embedded = true; - event->type = type; - - dest = src = val; - while (*src) { - if ('0' <= *src && *src <= '9') { - *dest = *src; - dest++; - } - src++; - if (8 <= dest - val) - break; - } - *dest = '\0'; - - event->date = atoi(val); - - events = g_slist_append(events, event); - } - - return events; -} - -static inline int cts_vcard_get_company(cts_company *org, char *val) -{ - char *temp, *start; - - start = cts_get_content_value(val); - retv_if(NULL == start, CTS_ERR_NO_DATA); - - temp = strchr(start, ';'); - if (temp) { - *temp = '\0'; - org->name = SMART_STRDUP(start); - org->department = SMART_STRDUP(temp+1); - } - else - org->name = strdup(start); - - return CTS_SUCCESS; -} - - -static inline char* cts_vcard_get_note(char *val) -{ - char *temp; - - temp = cts_get_content_value(val); - - if (temp) - return g_strcompress(temp); - else - return NULL; -} - - -static inline int cts_vcard_get_time(char *val) -{ - int i; - char tmp[10]; - struct tm ts = {0}; - - i = 0; - while (*val && (*val < '0' || '9' < *val)) val++; - while (*val) { - tmp[i++] = *val; - val++; - if (4<=i || *val < '0' || '9' < *val) break; - } - tmp[i] = 0; - ts.tm_year = atoi(tmp)-1900; - - i = 0; - while (*val && (*val < '0' || '9' < *val)) val++; - while (*val) { - tmp[i++] = *val; - val++; - if (2<=i || *val < '0' || '9' < *val) break; - } - tmp[i] = 0; - ts.tm_mon = atoi(tmp)-1; - - i = 0; - while (*val && (*val < '0' || '9' < *val)) val++; - while (*val) { - tmp[i++] = *val; - val++; - if (2<=i || *val < '0' || '9' < *val) break; - } - tmp[i] = 0; - ts.tm_mday = atoi(tmp); - - i = 0; - while (*val && (*val < '0' || '9' < *val)) val++; - while (*val) { - tmp[i++] = *val; - val++; - if (2<=i || *val < '0' || '9' < *val) break; - } - tmp[i] = 0; - ts.tm_hour = atoi(tmp); - - i = 0; - while (*val && (*val < '0' || '9' < *val)) val++; - while (*val) { - tmp[i++] = *val; - val++; - if (2<=i || *val < '0' || '9' < *val) break; - } - tmp[i] = 0; - ts.tm_min = atoi(tmp); - - i = 0; - while (*val && (*val < '0' || '9' < *val)) val++; - while (*val) { - tmp[i++] = *val; - val++; - if (2<=i || *val < '0' || '9' < *val) break; - } - tmp[i] = 0; - ts.tm_sec = atoi(tmp); - - return (int)mktime(&ts); -} - - -static inline GSList* cts_vcard_get_web(GSList *webs, char *val) -{ - cts_web *web; - char *temp; - - temp = cts_get_content_value(val); - retvm_if(NULL == temp, webs, "Invalid vcard(%s)", val); - - web = (cts_web *)contacts_svc_value_new(CTS_VALUE_WEB); - if (web) { - web->embedded = true; - web->url = strdup(temp);; - if (val != temp) { - *(temp-1) = '\0'; - temp = val; - while (*temp) - { - *temp = tolower(*temp); - temp++; - } - - temp = strchr(val, ';'); - if (temp) { - if (strstr(val, "home")) - web->type = CTS_WEB_TYPE_HOME; - else if (strstr(val, "work")) - web->type = CTS_WEB_TYPE_WORK; - } - } - webs = g_slist_append(webs, web); - } else { - ERR("contacts_svc_value_new() Failed"); - } - - return webs; -} - - -static inline bool cts_vcard_get_number_type(cts_number *number, char *val) -{ - char *temp, *result; - int type = CTS_NUM_TYPE_NONE; - bool pref = false; - - temp = val; - while (*temp) - { - *temp = tolower(*temp); - temp++; - } - - temp = strchr(val , ';'); - if (temp) { - result = strstr(val, "home"); - if (result) type |= CTS_NUM_TYPE_HOME; - result = strstr(val, "msg"); - if (result) type |= CTS_NUM_TYPE_MSG; - result = strstr(val, "work"); - if (result) type |= CTS_NUM_TYPE_WORK; - result = strstr(val, "pref"); - if (result) pref = true; - result = strstr(val, "voice"); - if (result) type |= CTS_NUM_TYPE_VOICE; - result = strstr(val, "fax"); - if (result) type |= CTS_NUM_TYPE_FAX; - result = strstr(val, "cell"); - if (result) type |= CTS_NUM_TYPE_CELL; - result = strstr(val, "video"); - if (result) type |= CTS_NUM_TYPE_VIDEO; - result = strstr(val, "pager"); - if (result) type |= CTS_NUM_TYPE_PAGER; - result = strstr(val, "bbs"); - if (result) type |= CTS_NUM_TYPE_BBS; - result = strstr(val, "modem"); - if (result) type |= CTS_NUM_TYPE_MODEM; - result = strstr(val, "car"); - if (result) type |= CTS_NUM_TYPE_CAR; - result = strstr(val, "isdn"); - if (result) type |= CTS_NUM_TYPE_ISDN; - result = strstr(val, "pcs"); - if (result) type |= CTS_NUM_TYPE_PCS; - } - number->type = type; - - return pref; -} - - -static inline GSList* cts_vcard_get_number(GSList *numbers, char *val) -{ - cts_number *number; - char *temp; - - temp = cts_get_content_value(val); - retvm_if(NULL == temp, numbers, "Invalid vcard(%s)", val); - - number = (cts_number *)contacts_svc_value_new(CTS_VALUE_NUMBER); - if (number) { - number->embedded = true; - number->number = strdup(temp); - if (val != temp) { - *(temp-1) = '\0'; - number->is_default = cts_vcard_get_number_type(number, val); - } - numbers = g_slist_append(numbers, number); - } else { - ERR("contacts_svc_value_new() Failed"); - } - - return numbers; -} - -static inline bool cts_vcard_get_email_type(cts_email *email, char *val) -{ - char *temp; - int type = CTS_EMAIL_TYPE_NONE; - bool pref = false; - - temp = val; - while (*temp) - { - *temp = tolower(*temp); - temp++; - } - - temp = strchr(val , ';'); - if (temp) { - if (strstr(val, "home")) - type = CTS_EMAIL_TYPE_HOME; - else if (strstr(val, "work")) - type = CTS_EMAIL_TYPE_WORK; - if (strstr(val, "pref")) - pref = true; - } - email->type = type; - - return pref; -} - -static inline GSList* cts_vcard_get_email(GSList *emails, char *val) -{ - cts_email *email; - char *temp; - - temp = cts_get_content_value(val); - retvm_if(NULL == temp, emails, "Invalid vcard(%s)", val); - - email = (cts_email *)contacts_svc_value_new(CTS_VALUE_EMAIL); - if (email) { - email->embedded = true; - email->email_addr = strdup(temp); - if (val != temp) { - *(temp-1) = '\0'; - email->is_default = cts_vcard_get_email_type(email, val); - } - emails = g_slist_append(emails, email); - } else { - ERR("contacts_svc_value_new() Failed"); - } - - return emails; -} - -static inline bool cts_vcard_get_postal_type(cts_postal *postal, char *val) -{ - char *temp, *result; - int type = CTS_ADDR_TYPE_NONE; - bool pref = false; - - temp = val; - while (*temp) - { - *temp = tolower(*temp); - temp++; - } - - temp = strchr(val , ';'); - if (temp) { - result = strstr(val, "dom"); - if (result) type |= CTS_ADDR_TYPE_DOM; - result = strstr(val, "intl"); - if (result) type |= CTS_ADDR_TYPE_INTL; - result = strstr(val, "postal"); - if (result) type |= CTS_ADDR_TYPE_POSTAL; - result = strstr(val, "parcel"); - if (result) type |= CTS_ADDR_TYPE_PARCEL; - result = strstr(val, "home"); - if (result) type |= CTS_ADDR_TYPE_HOME; - result = strstr(val, "work"); - if (result) type |= CTS_ADDR_TYPE_WORK; - result = strstr(val, "pref"); - if (result) pref = true; - } - postal->type = type; - - return pref; -} - -#define CTS_GET_ADDR_COMPONENT(dest, src, tmp_char) \ - tmp_char = strchr(src , ';'); \ -if (tmp_char) { \ - *tmp_char = '\0'; \ - dest = SMART_STRDUP(src); \ - src = tmp_char+1; \ -} \ -else { \ - dest = SMART_STRDUP(src); \ - break; \ -} \ - -static inline GSList* cts_vcard_get_postal(GSList *postals, char *val) -{ - char *text; - cts_postal *postal; - - postal = (cts_postal *)contacts_svc_value_new(CTS_VALUE_POSTAL); - if (postal) { - postal->embedded = true; - - text = strrchr(val , ':'); - if (text) - text++; - else - text = val; - - while (true) { - char *temp; - - CTS_GET_ADDR_COMPONENT(postal->pobox, text, temp); - CTS_GET_ADDR_COMPONENT(postal->extended, text, temp); - CTS_GET_ADDR_COMPONENT(postal->street, text, temp); - CTS_GET_ADDR_COMPONENT(postal->locality, text, temp); - CTS_GET_ADDR_COMPONENT(postal->region, text, temp); - CTS_GET_ADDR_COMPONENT(postal->postalcode, text, temp); - CTS_GET_ADDR_COMPONENT(postal->country, text, temp); - - ERR("invalid ADR type(%s)", temp); - break; - } - if (postal->pobox || postal->extended || postal->street || postal->locality - || postal->region || postal->postalcode || postal->country) { - postal->is_default = cts_vcard_get_postal_type(postal, val); - } else { - ERR("Invalid vcard(%s)", val); - contacts_svc_value_free((CTSvalue *)postal); - return postals; - } - - postals = g_slist_append(postals, postal); - } - - return postals; -} - -static inline int cts_vcard_get_photo_type(char *val) -{ - char *temp, *result; - - temp = val; - while (*temp) - { - *temp = tolower(*temp); - temp++; - } - - result = strstr(val, "jpeg"); - if (result) return CTS_VCARD_IMG_JPEG; - result = strstr(val, "jpg"); - if (result) return CTS_VCARD_IMG_JPEG; - - result = strstr(val, "png"); - if (result) return CTS_VCARD_IMG_PNG; - - result = strstr(val, "gif"); - if (result) return CTS_VCARD_IMG_GIF; - - result = strstr(val, "tiff"); - if (result) return CTS_VCARD_IMG_TIFF; - - return CTS_VCARD_IMG_NONE; -} - -static inline const char* cts_get_img_suffix(int type) -{ - switch (type) - { - case CTS_VCARD_IMG_TIFF: - return "tiff"; - case CTS_VCARD_IMG_GIF: - return "gif"; - case CTS_VCARD_IMG_PNG: - return "png"; - case CTS_VCARD_IMG_JPEG: - case CTS_VCARD_IMG_NONE: - default: - return "jpeg"; - } -} - -static inline int cts_vcard_get_photo(cts_ct_base *base, char *val) -{ - int ret, type, fd; - gsize size; - guchar *buf; - char *temp; - char dest[CTS_IMG_PATH_SIZE_MAX]; - - temp = strchr(val , ':'); - retvm_if(NULL == temp, CTS_ERR_ARG_INVALID, "val is invalid(%s)", val); - - *temp = '\0'; - type = cts_vcard_get_photo_type(val); - - ret = snprintf(dest, sizeof(dest), "%s/%d-%d.%s", CTS_VCARD_IMAGE_LOCATION, - getpid(), cts_tmp_photo_id++, cts_get_img_suffix(type)); - retvm_if(ret<=0, CTS_ERR_FAIL, "Destination file name was not created"); - - fd = open(dest, O_WRONLY|O_CREAT|O_TRUNC, 0660); - retvm_if(fd < 0, CTS_ERR_FAIL, "open(%s) Failed(%d)", dest, errno); - - buf = g_base64_decode(temp+1, &size); - - while (0 < size) { - ret = write(fd, buf, size); - if (ret <= 0) { - if (EINTR == errno) - continue; - else { - ERR("write() Failed(%d)", errno); - close(fd); - if (ENOSPC == errno) - return CTS_ERR_NO_SPACE; - else - return CTS_ERR_IO_ERR; - } - } - size -= ret; - } - - close(fd); - g_free(buf); - - base->vcard_img_path = strdup(dest); - - return CTS_SUCCESS; -} - -static inline GSList* cts_vcard_get_group(GSList *groups, char *val) -{ - char *temp; - cts_group *result; - const char *separator = ","; - - temp = strtok(val, separator); - while (temp) { - if ('\0' == *temp) continue; - - result = (cts_group *)contacts_svc_value_new(CTS_VALUE_GROUP_RELATION); - if (result) { - result->embedded = true; - result->vcard_group = strdup(temp); - groups = g_slist_append(groups, result); - } - - temp = strtok(NULL, separator); - } - - return groups; -} - -static inline char* cts_vcard_pass_unsupported(char *vcard) -{ - while (*vcard) { - if ('\n' == *vcard) - return (vcard + 1); - vcard++; - } - - return NULL; -} - -static inline int cts_vcard_get_contact(int ver, int flags, - char *vcard, contact_t *contact) -{ - int type; - char *cursor, *new_start, *val; - - cursor = vcard; - while (cursor) - { - type = cts_vcard_check_content_type(&cursor); - if (CTS_VCARD_VALUE_NONE == type) { - new_start = cts_vcard_pass_unsupported(cursor); - if (new_start) { - cursor = new_start; - continue; - } - else - break; - } - - new_start = cts_vcard_get_val(ver, cursor, &val); - if (NULL == new_start) - continue; - - if (NULL == val) { - cursor = new_start; - continue; - } - cts_vcard_remove_folding(val); - - switch (type) { - case CTS_VCARD_VALUE_FN: - cts_vcard_get_display_name(contact->name, val); - free(val); - break; - case CTS_VCARD_VALUE_N: - cts_vcard_get_name(contact->name, val); - free(val); - break; - case CTS_VCARD_VALUE_NICKNAME: - contact->nicknames = cts_vcard_get_nickname(contact->nicknames, val); - free(val); - break; - case CTS_VCARD_VALUE_PHOTO: - cts_vcard_get_photo(contact->base, val); - free(val); - break; - case CTS_VCARD_VALUE_BDAY: - contact->events = cts_vcard_get_event(contact->events, - CTS_EVENT_TYPE_BIRTH, val); - free(val); - break; - case CTS_VCARD_VALUE_ADR: - case CTS_VCARD_VALUE_LABEL: - contact->postal_addrs = cts_vcard_get_postal(contact->postal_addrs, val); - free(val); - break; - case CTS_VCARD_VALUE_TEL: - contact->numbers = cts_vcard_get_number(contact->numbers, val); - free(val); - break; - case CTS_VCARD_VALUE_EMAIL: - contact->emails = cts_vcard_get_email(contact->emails, val); - free(val); - break; - case CTS_VCARD_VALUE_TITLE: - if (NULL == contact->company) { - contact->company = (cts_company*)contacts_svc_value_new(CTS_VALUE_COMPANY); - if (NULL == contact->company) { - free(val); - ERR("contacts_svc_value_new(CTS_VALUE_COMPANY) Failed"); - return CTS_ERR_OUT_OF_MEMORY; - } - contact->company->embedded = true; - } - contact->company->jot_title = val; - break; - case CTS_VCARD_VALUE_ROLE: - if (NULL == contact->company) { - contact->company = (cts_company*)contacts_svc_value_new(CTS_VALUE_COMPANY); - if (NULL == contact->company) { - free(val); - ERR("contacts_svc_value_new(CTS_VALUE_COMPANY) Failed"); - return CTS_ERR_OUT_OF_MEMORY; - } - contact->company->embedded = true; - } - contact->company->role = val; - break; - case CTS_VCARD_VALUE_ORG: - if (NULL == contact->company) { - contact->company = (cts_company*)contacts_svc_value_new(CTS_VALUE_COMPANY); - if (NULL == contact->company) { - free(val); - ERR("contacts_svc_value_new(CTS_VALUE_COMPANY) Failed"); - return CTS_ERR_OUT_OF_MEMORY; - } - contact->company->embedded = true; - } - cts_vcard_get_company(contact->company, val); - free(val); - break; - case CTS_VCARD_VALUE_NOTE: - contact->base->note = cts_vcard_get_note(val); - free(val); - break; - case CTS_VCARD_VALUE_REV: - if (*val) - contact->base->changed_time = cts_vcard_get_time(val);; - free(val); - break; - case CTS_VCARD_VALUE_UID: - contact->base->uid = val; - break; - case CTS_VCARD_VALUE_URL: - contact->web_addrs = cts_vcard_get_web(contact->web_addrs, val); - free(val); - break; - case CTS_VCARD_VALUE_X_ANNIVERSARY: - contact->events = cts_vcard_get_event(contact->events, - CTS_EVENT_TYPE_ANNIVERSARY, val); - free(val); - break; - case CTS_VCARD_VALUE_X_IRMC_LUID: - contact->base->id = atoi(val); - free(val); - break; - case CTS_VCARD_VALUE_X_SLP_GROUP: - if (flags & CTS_VCARD_CONTENT_X_SLP_GROUP) - contact->grouprelations = cts_vcard_get_group(contact->grouprelations, val); - free(val); - break; - case CTS_VCARD_VALUE_END: - free(val); - return CTS_SUCCESS; - default: - ERR("cts_vcard_check_content_type() Failed(%d)", type); - return CTS_ERR_VOBJECT_FAILED; - } - cursor = new_start; - } - - ERR("Invalid vcard(%s)", vcard); - return CTS_ERR_ARG_INVALID; -} - -static void cts_vcard_initial(void) -{ - if (NULL == *content_name) { - //content_name[CTS_VCARD_VALUE_NAME] = "NAME"; /* not supported */ - //content_name[CTS_VCARD_VALUE_PROFILE] = "PROFILE"; /* not supported */ - //content_name[CTS_VCARD_VALUE_SOURCE] = "SOURCE"; /* not supported */ - content_name[CTS_VCARD_VALUE_FN] = "FN"; - content_name[CTS_VCARD_VALUE_N] = "N"; - content_name[CTS_VCARD_VALUE_NICKNAME] = "NICKNAME"; - content_name[CTS_VCARD_VALUE_PHOTO] = "PHOTO"; - content_name[CTS_VCARD_VALUE_BDAY] = "BDAY"; - content_name[CTS_VCARD_VALUE_ADR] = "ADR"; - content_name[CTS_VCARD_VALUE_LABEL] = "LABEL"; /* not supported */ - content_name[CTS_VCARD_VALUE_TEL] = "TEL"; - content_name[CTS_VCARD_VALUE_EMAIL] = "EMAIL"; - //content_name[CTS_VCARD_VALUE_MAILER] = "MAILER"; /* not supported */ - //content_name[CTS_VCARD_VALUE_TZ] = "TZ"; /* not supported */ - //content_name[CTS_VCARD_VALUE_GEO] = "GEO"; /* not supported */ - content_name[CTS_VCARD_VALUE_TITLE] = "TITLE"; - content_name[CTS_VCARD_VALUE_ROLE] = "ROLE"; - //content_name[CTS_VCARD_VALUE_LOGO] = "LOGO"; /* not supported */ - //content_name[CTS_VCARD_VALUE_AGENT] = "AGENT"; /* not supported */ - content_name[CTS_VCARD_VALUE_ORG] = "ORG"; - //content_name[CTS_VCARD_VALUE_CATEGORIES] = "CATEGORIES"; /* not supported */ - content_name[CTS_VCARD_VALUE_NOTE] = "NOTE"; - //content_name[CTS_VCARD_VALUE_PRODID] = "PRODID"; /* not supported */ - content_name[CTS_VCARD_VALUE_REV] = "REV"; - //content_name[CTS_VCARD_VALUE_SORT-STRING] = "SORT-STRING"; /* not supported */ - //content_name[CTS_VCARD_VALUE_SOUND] = "SOUND"; /* not supported */ - content_name[CTS_VCARD_VALUE_UID] = "UID"; - content_name[CTS_VCARD_VALUE_URL] = "URL"; - //content_name[CTS_VCARD_VALUE_VERSION] = "VERSION"; /* not supported */ - //content_name[CTS_VCARD_VALUE_CLASS] = "CLASS"; /* not supported */ - //content_name[CTS_VCARD_VALUE_KEY] = "KEY"; /* not supported */ - content_name[CTS_VCARD_VALUE_X_ANNIVERSARY] = "X-ANNIVERSARY"; - //content_name[CTS_VCARD_VALUE_X_CHILDREN] = "X-CHILDREN"; - content_name[CTS_VCARD_VALUE_X_IRMC_LUID] = "X-IRMC-LUID"; - content_name[CTS_VCARD_VALUE_X_SLP_GROUP] = "X-SLP-GROUP"; - content_name[CTS_VCARD_VALUE_END] = "END"; - } -}; - -int cts_vcard_parse(const void *vcard_stream, CTSstruct **contact, int flags) -{ - int ret, ver; - contact_t *result; - char *val_begin, *new_start, *val; - char *vcard = (char *)vcard_stream; - - retv_if(NULL == vcard_stream, CTS_ERR_ARG_NULL); - - cts_vcard_initial(); - - vcard = cts_vcard_check_word(vcard, "BEGIN:VCARD"); - retvm_if(NULL == vcard, CTS_ERR_ARG_INVALID, "The vcard is invalid."); - - val_begin = cts_vcard_check_word(vcard, "VERSION:"); - new_start = cts_vcard_get_val(CTS_VCARD_VER_NONE, val_begin, &val); - if (NULL == new_start || NULL == val) - ver = CTS_VCARD_VER_2_1; - else { - ver = cts_vcard_check_version(val); - free(val); - vcard = new_start; - } - - result = (contact_t *)contacts_svc_struct_new(CTS_STRUCT_CONTACT); - retvm_if(NULL == result, CTS_ERR_OUT_OF_MEMORY, "contacts_svc_struct_new() Failed"); - - result->name = (cts_name*)contacts_svc_value_new(CTS_VALUE_NAME); - if (NULL == result->name) { - ERR("contacts_svc_value_new(CTS_VALUE_NAME) Failed"); - contacts_svc_struct_free((CTSstruct *)result); - return CTS_ERR_OUT_OF_MEMORY; - } - result->name->embedded = true; - - result->base = (cts_ct_base*)contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO); - if (NULL == result->base) { - ERR("contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO) Failed"); - contacts_svc_struct_free((CTSstruct *)result); - return CTS_ERR_OUT_OF_MEMORY; - } - result->base->embedded = true; - - ret = cts_vcard_get_contact(ver, flags, vcard, result); - - if (CTS_SUCCESS != ret) { - contacts_svc_struct_free((CTSstruct *)result); - if (CTS_ERR_ARG_INVALID == ret) - ERR("cts_vcard_get_contact() Failed(%d)\n %s \n", ret, vcard); - else - ERR("cts_vcard_get_contact() Failed(%d)", ret); - - return ret; - } - - *contact = (CTSstruct *)result; - return CTS_SUCCESS; -} - -/************************** - * - * Contact To VCard - * - **************************/ - -const char *CTS_CRLF = "\r\n"; - -static inline int cts_vcard_append_name(cts_name *name, - char *dest, int dest_size) -{ - int ret_len; - ret_len = snprintf(dest, dest_size, "%s", content_name[CTS_VCARD_VALUE_N]); - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ":%s", - SAFE_STR(name->last)); - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", - SAFE_STR(name->first)); - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", - SAFE_STR(name->addition)); - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", - SAFE_STR(name->prefix)); - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s%s", - SAFE_STR(name->suffix), CTS_CRLF); - - if (name->display) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", - content_name[CTS_VCARD_VALUE_FN], - name->display, CTS_CRLF); - else { - char display[1024]; - - if (name->first && name->last) { - if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_SORTING)) { - snprintf(display, sizeof(display), "%s %s", name->first, name->last); - } else { - int lang; - if (CTS_LANG_DEFAULT == name->lang_type) - lang = cts_get_default_language(); - else - lang = name->lang_type; - - if (CTS_LANG_ENGLISH == lang) - snprintf(display, sizeof(display), "%s, %s", name->last, name->first); - else - snprintf(display, sizeof(display), "%s %s", name->last, name->first); - } - } - else - snprintf(display, sizeof(display), "%s%s", SAFE_STR(name->first), SAFE_STR(name->last)); - - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", - content_name[CTS_VCARD_VALUE_FN], - display, CTS_CRLF); - } - - return ret_len; -} - -static inline int cts_vcard_put_number_type(int type, char *dest, int dest_size) -{ - int ret_len = 0; - if (type & CTS_NUM_TYPE_HOME) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "HOME"); - if (type & CTS_NUM_TYPE_MSG) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "MSG"); - if (type & CTS_NUM_TYPE_WORK) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "WORK"); - if (type & CTS_NUM_TYPE_VOICE) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "VOICE"); - if (type & CTS_NUM_TYPE_FAX) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "FAX"); - if (type & CTS_NUM_TYPE_VOICE) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "VOICE"); - if (type & CTS_NUM_TYPE_CELL) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "CELL"); - if (type & CTS_NUM_TYPE_VIDEO) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "VIDEO"); - if (type & CTS_NUM_TYPE_PAGER) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "PAGER"); - if (type & CTS_NUM_TYPE_BBS) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "BBS"); - if (type & CTS_NUM_TYPE_MODEM) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "MODEM"); - if (type & CTS_NUM_TYPE_CAR) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "CAR"); - if (type & CTS_NUM_TYPE_ISDN) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "ISDN"); - if (type & CTS_NUM_TYPE_PCS) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "PCS"); - - return ret_len; -} - -static inline int cts_vcard_append_numbers(GSList *numbers, - char *dest, int dest_size) -{ - int ret_len = 0; - GSList *cursor; - cts_number *data; - - for (cursor=numbers;cursor;cursor=cursor->next) { - data = cursor->data; - if (data->number) { - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s", - content_name[CTS_VCARD_VALUE_TEL]); - ret_len += cts_vcard_put_number_type(data->type, dest+ret_len, - dest_size-ret_len); - if (data->is_default) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "PREF"); - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ":%s%s", - data->number, CTS_CRLF); - } - } - - return ret_len; -} - -static inline int cts_vcard_append_emails(GSList *emails, - char *dest, int dest_size) -{ - int ret_len = 0; - GSList *cursor; - cts_email *data; - - for (cursor=emails;cursor;cursor=cursor->next) { - data = cursor->data; - if (data->email_addr) { - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s", - content_name[CTS_VCARD_VALUE_EMAIL]); - if (CTS_EMAIL_TYPE_HOME & data->type) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "HOME"); - if (CTS_EMAIL_TYPE_WORK & data->type) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "WORK"); - - if (data->is_default) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "PREF"); - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ":%s%s", - data->email_addr, CTS_CRLF); - } - } - - return ret_len; -} - -static inline int cts_vcard_put_postal_type(int type, char *dest, int dest_size) -{ - int ret_len = 0; - if (type & CTS_ADDR_TYPE_DOM) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "DOM"); - if (type & CTS_ADDR_TYPE_INTL) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "INTL"); - if (type & CTS_ADDR_TYPE_HOME) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "HOME"); - if (type & CTS_ADDR_TYPE_WORK) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "WORK"); - if (type & CTS_ADDR_TYPE_POSTAL) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "POSTAL"); - if (type & CTS_ADDR_TYPE_PARCEL) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "PARCEL"); - - return ret_len; -} - -static inline int cts_vcard_append_postals(GSList *numbers, - char *dest, int dest_size) -{ - int ret_len = 0; - GSList *cursor; - cts_postal *data; - - for (cursor=numbers;cursor;cursor=cursor->next) { - data = cursor->data; - if (data) { - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s", - content_name[CTS_VCARD_VALUE_ADR]); - ret_len += cts_vcard_put_postal_type(data->type, dest+ret_len, - dest_size-ret_len); - if (data->is_default) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "PREF"); - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ":%s", - SAFE_STR(data->pobox)); - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", - SAFE_STR(data->extended)); - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", - SAFE_STR(data->street)); - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", - SAFE_STR(data->locality)); - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", - SAFE_STR(data->region)); - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", - SAFE_STR(data->postalcode)); - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s%s", - SAFE_STR(data->country), CTS_CRLF); - } - } - - return ret_len; -} - -static inline int cts_vcard_append_company(cts_company *org, - char *dest, int dest_size) -{ - int ret_len = 0; - - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s", - content_name[CTS_VCARD_VALUE_ORG], - SAFE_STR(org->name)); - if (org->department) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", - org->department); - - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s", CTS_CRLF); - - if (org->jot_title) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", - content_name[CTS_VCARD_VALUE_TITLE], - org->jot_title, CTS_CRLF); - if (org->role) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", - content_name[CTS_VCARD_VALUE_ROLE], - org->role, CTS_CRLF); - - return ret_len; -} - -static inline int cts_vcard_append_nicks(GSList *nicks, - char *dest, int dest_size) -{ - bool first; - int ret_len = 0; - GSList *cursor; - cts_nickname *data; - - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:", - content_name[CTS_VCARD_VALUE_NICKNAME]); - - first = true; - for (cursor=nicks;cursor;cursor=cursor->next) { - data = cursor->data; - if (data->nick && *data->nick) { - if (first) { - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s", data->nick); - first = false; - } - else { - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ",%s", data->nick); - } - } - } - - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s", CTS_CRLF); - - return ret_len; -} - -static inline int cts_vcard_append_webs(GSList *webs, - char *dest, int dest_size) -{ - int ret_len = 0; - GSList *cursor; - cts_web *data; - - for (cursor=webs;cursor;cursor=cursor->next) { - data = cursor->data; - if (data->url && *data->url) { - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", - content_name[CTS_VCARD_VALUE_URL], - data->url, CTS_CRLF); - } - } - - return ret_len; -} - -static inline int cts_vcard_append_events(GSList *webs, - char *dest, int dest_size) -{ - int ret_len = 0; - GSList *cursor; - cts_event *data; - - for (cursor=webs;cursor;cursor=cursor->next) { - data = cursor->data; - if (!data->date) continue; - - if (CTS_EVENT_TYPE_BIRTH == data->type) { - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%d-%02d-%d%s", - content_name[CTS_VCARD_VALUE_BDAY], - data->date/10000, (data->date%10000)/100, data->date%100, - CTS_CRLF); - } - else if (CTS_EVENT_TYPE_ANNIVERSARY == data->type) { - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%d-%02d-%d%s", - content_name[CTS_VCARD_VALUE_X_ANNIVERSARY], - data->date/10000, (data->date%10000)/100, data->date%100, - CTS_CRLF); - } - } - - return ret_len; -} - -static inline const char* cts_get_photo_type_str(int type) -{ - switch (type) - { - case CTS_VCARD_IMG_TIFF: - return "TIFF"; - case CTS_VCARD_IMG_GIF: - return "GIF"; - case CTS_VCARD_IMG_PNG: - return "PNG"; - case CTS_VCARD_IMG_JPEG: - default: - return "JPEG"; - } -} - -static inline int cts_vcard_put_photo(const char *path, char *dest, int dest_size) -{ - int ret, fd, type; - gsize read_len; - char *suffix; - gchar *buf; - guchar image[CTS_VCARD_PHOTO_MAX_SIZE]; - - suffix = strrchr(path, '.'); - retvm_if(NULL == suffix, 0, "Image Type(%s) is invalid", path); - - type = cts_vcard_get_photo_type(suffix); - retvm_if(CTS_VCARD_IMG_NONE == type, 0, "Image Type(%s) is invalid", path); - - fd = open(path, O_RDONLY); - retvm_if(fd < 0, 0, "Open(%s) Failed(%d)", path, errno); - - read_len = 0; - while ((ret=read(fd, image+read_len, sizeof(image)-read_len))) { - if (-1 == ret) { - if (EINTR == errno) - continue; - else - break; - } - read_len += ret; - } - close(fd); - retvm_if(ret < 0, 0, "read() Failed(%d)", errno); - - ret = 0; - buf = g_base64_encode(image, read_len); - if (buf) { - ret = snprintf(dest, dest_size, "%s;ENCODING=BASE64;TYPE=%s:%s%s%s", - content_name[CTS_VCARD_VALUE_PHOTO], - cts_get_photo_type_str(type), buf, CTS_CRLF, CTS_CRLF); - g_free(buf); - } - - return ret; -} -static inline int cts_vcard_append_base(cts_ct_base *base, - char *dest, int dest_size) -{ - int ret_len = 0; - - if (base->img_path) - ret_len += cts_vcard_put_photo(base->img_path, - dest+ret_len, dest_size-ret_len); - if (base->uid) - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", - content_name[CTS_VCARD_VALUE_UID], - base->uid, CTS_CRLF); - if (base->note) { - gchar *escaped_note; - escaped_note = g_strescape(base->note, NULL); - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s", - content_name[CTS_VCARD_VALUE_NOTE], - escaped_note, CTS_CRLF); - g_free(escaped_note); - } - - if (base->changed_time) { - struct tm ts; - gmtime_r((time_t *)&base->changed_time, &ts); - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%04d-%02d-%02dT%02d:%02d:%02dZ%s", - content_name[CTS_VCARD_VALUE_REV], - 1900+ts.tm_year, 1+ts.tm_mon, ts.tm_mday, - ts.tm_hour, ts.tm_min, ts.tm_sec, - CTS_CRLF); - } - - return ret_len; -} - -static inline int cts_vcard_append_grouprelations(GSList *grouprelations, - char *dest, int dest_size) -{ - bool first; - int ret_len = 0; - GSList *cursor; - cts_group *data; - - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:", - content_name[CTS_VCARD_VALUE_X_SLP_GROUP]); - - first = true; - for (cursor=grouprelations;cursor;cursor=cursor->next) { - data = cursor->data; - if (data->name && *data->name) { - if (first) { - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s", data->name); - first = false; - } - else { - ret_len += snprintf(dest+ret_len, dest_size-ret_len, ",%s", data->name); - } - } - } - - ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s", CTS_CRLF); - - return ret_len; -} - -static inline int cts_vcard_append_contact(int flags, contact_t *contact, - char *dest, int dest_size) -{ - int ret_len = 0; - - if (contact->name) - ret_len += cts_vcard_append_name(contact->name, - dest+ret_len, dest_size-ret_len); - if (contact->company) - ret_len += cts_vcard_append_company(contact->company, - dest+ret_len, dest_size-ret_len); - if (contact->postal_addrs) - ret_len += cts_vcard_append_postals(contact->postal_addrs, - dest+ret_len, dest_size-ret_len); - if (contact->numbers) - ret_len += cts_vcard_append_numbers(contact->numbers, - dest+ret_len, dest_size-ret_len); - if (contact->emails) - ret_len += cts_vcard_append_emails(contact->emails, - dest+ret_len, dest_size-ret_len); - if (contact->nicknames) - ret_len += cts_vcard_append_nicks(contact->nicknames, - dest+ret_len, dest_size-ret_len); - if (contact->web_addrs) - ret_len += cts_vcard_append_webs(contact->web_addrs, - dest+ret_len, dest_size-ret_len); - if (contact->events) - ret_len += cts_vcard_append_events(contact->events, - dest+ret_len, dest_size-ret_len); - if (contact->base) - ret_len += cts_vcard_append_base(contact->base, - dest+ret_len, dest_size-ret_len); - if (contact->grouprelations && (flags & CTS_VCARD_CONTENT_X_SLP_GROUP)) - ret_len += cts_vcard_append_grouprelations(contact->grouprelations, - dest+ret_len, dest_size-ret_len); - - return ret_len; -} - -#define CTS_VCARD_FOLDING_LIMIT 75 - -static inline int cts_vcard_add_folding(char *src) -{ - int len, result_len; - char result[CTS_VCARD_FILE_MAX_SIZE]; - char *r; - const char *s; - - s = src; - r = result; - len = result_len = 0; - while (*s) { - if ('\r' == *s) - len--; - else if ('\n' == *s) - len = -1; - - if (CTS_VCARD_FOLDING_LIMIT == len) { - *r = '\r'; - r++; - *r = '\n'; - r++; - *r = ' '; - r++; - len = 1; - result_len += 3; - } - - *r = *s; - r++; - s++; - len++; - result_len++; - retvm_if(sizeof(result) - 5 < result_len, CTS_ERR_ARG_INVALID, - "src is too long\n(%s)", src); - } - *r = '\0'; - - memcpy(src, result, result_len+1); - return CTS_SUCCESS; -} - -int cts_vcard_make(const CTSstruct *contact, char **vcard_stream, int flags) -{ - int ret_len, ret; - char result[CTS_VCARD_FILE_MAX_SIZE]; - - retv_if(NULL == contact, CTS_ERR_ARG_NULL); - retv_if(NULL == vcard_stream, CTS_ERR_ARG_NULL); - retvm_if(CTS_STRUCT_CONTACT != contact->s_type, CTS_ERR_ARG_INVALID, - "The record(%d) must be type of CTS_STRUCT_CONTACT.", contact->s_type); - - cts_vcard_initial(); - - ret_len = snprintf(result, sizeof(result), "%s%s", "BEGIN:VCARD", CTS_CRLF); - ret_len += snprintf(result+ret_len, sizeof(result)-ret_len, - "%s%s%s", "VERSION:", "3.0", CTS_CRLF); - - ret_len += cts_vcard_append_contact(flags, (contact_t *)contact, - result+ret_len, sizeof(result)-ret_len); - - retvm_if(sizeof(result)-ret_len <= 0, CTS_ERR_EXCEEDED_LIMIT, - "This contact has too many information"); - - ret_len += snprintf(result+ret_len, sizeof(result)-ret_len, - "%s%s", "END:VCARD", CTS_CRLF); - - ret = cts_vcard_add_folding(result); - if (CTS_SUCCESS != ret) - return ret; - *vcard_stream = strdup(result); - - return CTS_SUCCESS; -} - diff --git a/src/cts-vcard.c b/src/cts-vcard.c deleted file mode 100755 index 8f02dfc..0000000 --- a/src/cts-vcard.c +++ /dev/null @@ -1,416 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include - -#include "cts-internal.h" -#include "cts-types.h" -#include "cts-contact.h" -#include "cts-vcard.h" -#include "cts-utils.h" -#include "cts-sqlite.h" -#include "cts-vcard-file.h" -#include "cts-struct-ext.h" - -API int contacts_svc_get_vcard_from_contact( - const CTSstruct *contact, char **vcard_stream) -{ - return cts_vcard_make(contact, vcard_stream, CTS_VCARD_CONTENT_BASIC); -} - -API int contacts_svc_get_contact_from_vcard( - const char *vcard_stream, CTSstruct **contact) -{ - int ret; - - ret = cts_vcard_parse(vcard_stream, contact, CTS_VCARD_CONTENT_BASIC); - retvm_if(ret, ret, "cts_vcard_parse() Failed(%d)", ret); - - return CTS_SUCCESS; -} - -static inline void cts_remove_name(cts_name *name) -{ - name->is_changed = true; - if (name->first) { - free(name->first); - name->first = NULL; - } - if (name->last) { - free(name->last); - name->last = NULL; - } - if (name->addition) { - free(name->addition); - name->addition = NULL; - } - if (name->display) { - free(name->display); - name->display = NULL; - } - if (name->prefix) { - free(name->prefix); - name->prefix = NULL; - } - if (name->suffix) { - free(name->suffix); - name->suffix = NULL; - } -} - -static inline void cts_remove_company(cts_company *company) -{ - if (company->name) { - free(company->name); - company->name = NULL; - } - if (company->department) { - free(company->department); - company->department = NULL; - } - if (company->jot_title) { - free(company->jot_title); - company->jot_title = NULL; - } - if (company->role) { - free(company->role); - company->role = NULL; - } -} - -static inline void cts_remove_base(cts_ct_base *base) -{ - if (base->img_path) { - free(base->img_path); - base->img_path = NULL; - base->img_changed = true; - } - if (base->full_img_path) { - free(base->full_img_path); - base->full_img_path = NULL; - base->full_img_changed = true; - } - if (base->note) { - free(base->note); - base->note = NULL; - base->note_changed = true; - } -} - -static void cts_remove_number(gpointer data, gpointer user_data) -{ - ((cts_number*)data)->deleted = true; -} - -void cts_remove_email(gpointer data, gpointer user_data) -{ - ((cts_email*)data)->deleted = true; -} - -void cts_remove_event(gpointer data, gpointer user_data) -{ - ((cts_event*)data)->deleted = true; -} - -void cts_remove_postal(gpointer data, gpointer user_data) -{ - ((cts_postal*)data)->deleted = true; -} - -void cts_remove_web(gpointer data, gpointer user_data) -{ - ((cts_web*)data)->deleted = true; -} - -void cts_remove_nick(gpointer data, gpointer user_data) -{ - ((cts_nickname*)data)->deleted = true; -} - -void cts_remove_grouprel(gpointer data, gpointer user_data) -{ - ((cts_group*)data)->deleted = true; -} - -/* - void cts_remove_extend(gpointer data, gpointer user_data) - { - cts_extend *extend = data; - if(0000 == extend->type) extend->deleted = true; - } - */ - -static inline void cts_contact_remove_vcard_field(contact_t *contact, int flags) -{ - if (contact->name) - cts_remove_name(contact->name); - if (contact->company) - cts_remove_company(contact->company); - if (contact->base) - cts_remove_base(contact->base); - - g_slist_foreach(contact->numbers, cts_remove_number, NULL); - g_slist_foreach(contact->emails, cts_remove_email, NULL); - g_slist_foreach(contact->events, cts_remove_event, NULL); - g_slist_foreach(contact->postal_addrs, cts_remove_postal, NULL); - g_slist_foreach(contact->web_addrs, cts_remove_web, NULL); - g_slist_foreach(contact->nicknames, cts_remove_nick, NULL); - if (flags & CTS_VCARD_CONTENT_X_SLP_GROUP) - g_slist_foreach(contact->grouprelations, cts_remove_grouprel, NULL); - //g_slist_foreach(contact->extended_values, cts_remove_extend, NULL); -} - -API int contacts_svc_insert_vcard(int addressbook_id, const char* a_vcard_stream) -{ - int ret; - CTSstruct *vcard_ct; - - retv_if(NULL == a_vcard_stream, CTS_ERR_ARG_NULL); - - ret = cts_vcard_parse(a_vcard_stream, &vcard_ct, CTS_VCARD_CONTENT_BASIC); - retvm_if(CTS_SUCCESS != ret, ret, "cts_vcard_parse() Failed(%d)", ret); - - ret = contacts_svc_insert_contact(addressbook_id, vcard_ct); - warn_if(ret < CTS_SUCCESS, "contacts_svc_insert_contact() Failed(%d)", ret); - - contacts_svc_struct_free(vcard_ct); - - return ret; -} - -API int contacts_svc_replace_by_vcard(int contact_id, const char* a_vcard_stream) -{ - int ret; - CTSstruct *vcard_ct, *contact=NULL; - - retv_if(NULL == a_vcard_stream, CTS_ERR_ARG_NULL); - - ret = contacts_svc_get_contact(contact_id, &contact); - retvm_if(CTS_SUCCESS != ret, ret, "contacts_svc_get_contact() Failed(%d)", ret); - - ret = cts_vcard_parse(a_vcard_stream, &vcard_ct, CTS_VCARD_CONTENT_BASIC); - if (CTS_SUCCESS != ret) { - if (contact) contacts_svc_struct_free(contact); - ERR("cts_vcard_parse() Failed(%d)", ret); - return ret; - } - - cts_contact_remove_vcard_field((contact_t *)contact, CTS_VCARD_CONTENT_BASIC); - ret = contacts_svc_struct_merge(contact, vcard_ct); - if (CTS_SUCCESS == ret) { - ret = contacts_svc_update_contact(contact); - warn_if(CTS_SUCCESS != ret, "contacts_svc_update_contact() Failed(%d)", ret); - } else { - ERR("contacts_svc_struct_merge() Failed(%d)", ret); - } - - contacts_svc_struct_free(contact); - contacts_svc_struct_free(vcard_ct); - - return ret; -} - -#define CTS_VCARD_MAX_SIZE 1024*1024 - -API int contacts_svc_vcard_foreach(const char *vcard_file_name, - int (*fn)(const char *a_vcard_stream, void *data), void *data) -{ - FILE *file; - int buf_size, len; - char *stream; - char line[1024]; - - retv_if(NULL == vcard_file_name, CTS_ERR_ARG_NULL); - retv_if(NULL == fn, CTS_ERR_ARG_NULL); - - file = fopen(vcard_file_name, "r"); - retvm_if(NULL == file, CTS_ERR_FAIL, "fopen() Failed(%d)", errno); - - len = 0; - buf_size = CTS_VCARD_MAX_SIZE; - stream = malloc(CTS_VCARD_MAX_SIZE); - retvm_if(NULL == stream, CTS_ERR_OUT_OF_MEMORY, "malloc() Failed"); - - while (fgets(line, sizeof(line), file)) { - if (0 == len) - if (strncmp(line, "BEGIN:VCARD", sizeof("BEGIN:VCARD")-1)) - continue; - - if (len + sizeof(line) < buf_size) - len += snprintf(stream + len, buf_size - len, "%s", line); - else { - char *new_stream; - buf_size += sizeof(line) * 2; - new_stream = realloc(stream, buf_size); - if (new_stream) - stream = new_stream; - else { - free(stream); - fclose(file); - return CTS_ERR_OUT_OF_MEMORY; - } - - len += snprintf(stream + len, buf_size - len, "%s", line); - } - - if (0 == strncmp(line, "END:VCARD", 9)) { - if (fn) - if (fn(stream, data)) { - free(stream); - fclose(file); - return CTS_ERR_FINISH_ITER; - } - len = 0; - } - } - - free(stream); - fclose(file); - return CTS_SUCCESS; -} - -API int contacts_svc_vcard_count(const char *vcard_file_name) -{ - FILE *file; - int cnt; - char line[1024]; - - retv_if(NULL == vcard_file_name, CTS_ERR_ARG_NULL); - - file = fopen(vcard_file_name, "r"); - retvm_if(NULL == file, CTS_ERR_FAIL, "fopen() Failed(%d)", errno); - - cnt = 0; - while (fgets(line, sizeof(line), file)) { - if (0 == strncmp(line, "END:VCARD", 9)) - cnt++; - } - fclose(file); - - return cnt; -} - -static inline char* cts_new_strcpy(char *dest, const char *src, int size) -{ - int i; - for (i=0;i < size && src[i];i++) - dest[i] = src[i]; - dest[i] = '\0'; - - return &dest[i]; -} - -API char* contacts_svc_vcard_put_content(const char *vcard_stream, - const char *content_type, const char *content_value) -{ - int i, org_len, new_len; - char *new_stream, *cur; - const char *end_content = "END:VCARD"; - - retvm_if(NULL == vcard_stream, NULL, "vcard_stream is NULL"); - retvm_if(NULL == content_type, NULL, "content_type is NULL"); - retvm_if(NULL == content_value, NULL, "content_value is NULL"); - - org_len = strlen(vcard_stream); - new_len = org_len + strlen(content_type) + strlen(content_value) + 8; - - new_stream = malloc(new_len); - retvm_if(NULL == new_stream, NULL, "malloc() Failed"); - - memcpy(new_stream, vcard_stream, org_len); - - i = 1; - for (cur = new_stream + new_len - 1 ;cur;cur--) { - if (end_content[9-i] == *cur) { - if (9 == i) break; - i++; - continue; - } else { - i = 1; - } - } - if (9 != i) { - ERR("vcard_stream is invalid(%s)", vcard_stream); - free(new_stream); - return NULL; - } - - cur += snprintf(cur, new_len - (cur - new_stream), "%s:", content_type); - cur = cts_new_strcpy(cur, content_value, new_len - (cur - new_stream)); - snprintf(cur, new_len - (cur - new_stream), "\r\n%s\r\n", end_content); - - return new_stream; -} - -API int contacts_svc_vcard_get_content(const char *vcard_stream, - const char *content_type, int (*fn)(const char *content_value, void *data), void *data) -{ - int len, buf_size, type_len; - char *cursor, *found, *value; - - retv_if(NULL == vcard_stream, CTS_ERR_ARG_NULL); - retv_if(NULL == content_type, CTS_ERR_ARG_NULL); - retv_if(NULL == fn, CTS_ERR_ARG_NULL); - - type_len = strlen(content_type); - value = malloc(1024); - retvm_if(NULL == value, CTS_ERR_OUT_OF_MEMORY, "malloc() Failed"); - buf_size = 1024; - - while ((found = strstr(vcard_stream, content_type))) { - if ((found != vcard_stream && '\n' != *(found-1)) - && ':' != *(found+type_len+1)) - continue; - - cursor = found; - while (*cursor) { - if ('\r' == *cursor) cursor++; - if ('\n' == *cursor) { - if (' ' != *(cursor+1)) - break; - } - - cursor++; - } - len = cursor - found; - if (len < buf_size) - memcpy(value, found, len); - else { - value = realloc(value, len + 1); - if (value) { - buf_size = len + 1; - memcpy(value, found, len); - }else { - vcard_stream = found + type_len; - continue; - } - } - value[len] = '\0'; - if (fn) - if (fn(value+type_len+1, data)) { - free(value); - return CTS_ERR_FINISH_ITER; - } - vcard_stream = found + type_len; - } - - free(value); - return CTS_SUCCESS; -} diff --git a/src/cts-vcard.h b/src/cts-vcard.h deleted file mode 100755 index 1f73b42..0000000 --- a/src/cts-vcard.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef __CTS_VCARD_H__ -#define __CTS_VCARD_H__ - -enum{ - CTS_VCARD_IMG_NONE, - CTS_VCARD_IMG_JPEG, - CTS_VCARD_IMG_PNG, - CTS_VCARD_IMG_GIF, - CTS_VCARD_IMG_TIFF, -}; - -/** - * content type - */ -enum VCARDCONTENT { - CTS_VCARD_CONTENT_NONE = 0, - CTS_VCARD_CONTENT_BASIC = 1<<0, - CTS_VCARD_CONTENT_X_SLP_GROUP = 1<<1, - CTS_VCARD_CONTENT_ALL = 1<<0|1<<1, -}; - -// - -#endif //__CTS_VCARD_H__ - diff --git a/test/Makefile b/test/Makefile deleted file mode 100755 index 12deb30..0000000 --- a/test/Makefile +++ /dev/null @@ -1,30 +0,0 @@ -CC = gcc - -REQUIRED_PKG = contacts-service -CFLAGS = -g -Wall -LDFLAGS = # -L../ -lefence -pthread -ifdef REQUIRED_PKG - CFLAGS += `pkg-config --cflags $(REQUIRED_PKG)` - LDFLAGS += `pkg-config --libs $(REQUIRED_PKG)` -endif - -SRCS = contact-test.c phonelog-test.c change-noti-test.c group-test.c vcard2contact-test.c SIMimport-test.c addressbook-test.c -TIMESRC = timetest.c -OBJECTS = $(SRCS:.c=.o) -TIMEOBJ = $(TIMESRC:.c=.o) -TARGETS = $(OBJECTS:.o=) -#A:.c=.o //A안에 있는 .c를 .o로 바꿔라 - - -all: $(OBJECTS) $(TARGETS) -#-mv test1 testlocal /usr/ - -$(TARGETS): $(TIMEOBJ) -$(TIMEOBJ): timetest.h - -% : %.o - $(CC) -o $@ $< $(TIMEOBJ) $(LDFLAGS) - -clean: - rm -rf $(OBJECTS) $(TARGETS) $(TIMEOBJ) - diff --git a/test/addressbook-test.c b/test/addressbook-test.c deleted file mode 100755 index 32ba2d9..0000000 --- a/test/addressbook-test.c +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include - -#include - -int insert_addrbook(int acc_id, int acc_type, int mode, const char *group_name) -{ - int ret; - CTSvalue *ab; - ab = contacts_svc_value_new(CTS_VALUE_ADDRESSBOOK); - - contacts_svc_value_set_int(ab, CTS_ADDRESSBOOK_VAL_ACC_ID_INT, acc_id); - contacts_svc_value_set_int(ab, CTS_ADDRESSBOOK_VAL_ACC_TYPE_INT, acc_type); - contacts_svc_value_set_int(ab, CTS_ADDRESSBOOK_VAL_MODE_INT, mode); - contacts_svc_value_set_str(ab, CTS_ADDRESSBOOK_VAL_NAME_STR, group_name); - - ret = contacts_svc_insert_addressbook(ab); - if (ret < CTS_SUCCESS) - printf("contacts_svc_insert_addressbook() Failed\n"); - - contacts_svc_value_free(ab); - return ret; -} - -void get_addrbook(int addressbook_id) -{ - int ret; - const char *name; - CTSvalue *ab = NULL; - - ret = contacts_svc_get_addressbook(addressbook_id, &ab); - if (CTS_SUCCESS != ret) { - printf("contacts_svc_get_addressbook() Failed\n"); - return; - } - - printf("///////////%d//////////////\n", - contacts_svc_value_get_int(ab, CTS_ADDRESSBOOK_VAL_ID_INT)); - printf("The related account ID : %d\n", - contacts_svc_value_get_int(ab, CTS_ADDRESSBOOK_VAL_ACC_ID_INT)); - printf("The related account type : %d\n", - contacts_svc_value_get_int(ab, CTS_ADDRESSBOOK_VAL_ACC_TYPE_INT)); - printf("permission : %d\n", - contacts_svc_value_get_int(ab, CTS_ADDRESSBOOK_VAL_MODE_INT)); - - name = contacts_svc_value_get_str(ab, CTS_ADDRESSBOOK_VAL_NAME_STR); - if (name) - printf("Name : %s\n", name); - printf("//////////////////////////\n"); - - contacts_svc_value_free(ab); -} - -void update_addrbook(void) -{ - int ret; - CTSvalue *ab = NULL; - ret = contacts_svc_get_addressbook(2, &ab); - if (CTS_SUCCESS != ret) { - printf("contacts_svc_get_addressbook() Failed\n"); - return; - } - - contacts_svc_value_set_str(ab, CTS_ADDRESSBOOK_VAL_NAME_STR,"Fixed-addressbook"); - - ret = contacts_svc_update_addressbook(ab); - if (ret < CTS_SUCCESS) - printf("contacts_svc_update_addressbook() Failed\n"); - - contacts_svc_value_free(ab); -} - -void delete_addrbook(int addressbook_id) -{ - int ret; - ret = contacts_svc_delete_addressbook(addressbook_id); - if (CTS_SUCCESS != ret) - printf("Error : contacts_svc_delete_addressbook() Failed(%d)\n", ret); -} - -static int list_cb(CTSvalue *ab, void *user_data) -{ - const char *name; - - printf("///////////%d//////////////\n", - contacts_svc_value_get_int(ab, CTS_LIST_ADDRESSBOOK_ID_INT)); - printf("The related account ID : %d\n", - contacts_svc_value_get_int(ab, CTS_LIST_ADDRESSBOOK_ACC_ID_INT)); - printf("The related account type : %d\n", - contacts_svc_value_get_int(ab, CTS_LIST_ADDRESSBOOK_ACC_TYPE_INT)); - printf("permission : %d\n", - contacts_svc_value_get_int(ab, CTS_LIST_ADDRESSBOOK_MODE_INT)); - - name = contacts_svc_value_get_str(ab, CTS_LIST_ADDRESSBOOK_NAME_STR); - if (name) - printf("Name : %s\n", name); - printf("//////////////////////////\n"); - - return CTS_SUCCESS; -} - -void addrbook_list(void) -{ - int ret; - - printf("///////////0//////////////\n"); - printf("Name : %s\n", "Internal Addressbook(This is logical value)"); - printf("//////////////////////////\n"); - - ret = contacts_svc_list_foreach(CTS_LIST_ALL_ADDRESSBOOK, list_cb, NULL); - if (CTS_SUCCESS != ret) { - printf("contacts_svc_list_foreach() Failed\n"); - return; - } -} - -void addrbook_list2(void) -{ - int ret, count; - CTSiter *iter; - - count = contacts_svc_count_with_int(CTS_GET_COUNT_CONTACTS_IN_ADDRESSBOOK, 0); - printf("Phone(%d)", count); - - ret = contacts_svc_get_list(CTS_LIST_ALL_ADDRESSBOOK, &iter); - if (CTS_SUCCESS != ret) { - printf("contacts_svc_get_list() Failed(%d)\n", ret); - return; - } - - while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { - int id; - const char *name; - CTSvalue *info; - - info = contacts_svc_iter_get_info(iter); - id = contacts_svc_value_get_int(info, CTS_LIST_ADDRESSBOOK_ID_INT); - name = contacts_svc_value_get_str(info, CTS_LIST_ADDRESSBOOK_NAME_STR); - count = contacts_svc_count_with_int(CTS_GET_COUNT_CONTACTS_IN_ADDRESSBOOK, id); - - printf("%s(%d)", name, count); - } - contacts_svc_iter_remove(iter); -} - -int main() -{ - int id; - contacts_svc_connect(); - insert_addrbook(1, CTS_ADDRESSBOOK_TYPE_GOOGLE, CTS_ADDRESSBOOK_MODE_NONE, "test1"); - insert_addrbook(1, CTS_ADDRESSBOOK_TYPE_GOOGLE, CTS_ADDRESSBOOK_MODE_NONE, "test2"); - id = insert_addrbook(2, CTS_ADDRESSBOOK_TYPE_FACEBOOK, CTS_ADDRESSBOOK_MODE_READONLY, - "facebook-test"); - get_addrbook(id); - addrbook_list(); - update_addrbook(); - addrbook_list(); - delete_addrbook(id); - addrbook_list(); - addrbook_list2(); - - contacts_svc_disconnect(); - return 0; -} - - - diff --git a/test/change-noti-test.c b/test/change-noti-test.c deleted file mode 100755 index 754b0b7..0000000 --- a/test/change-noti-test.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include - -static void favorite_change_callback(void *data) -{ - printf("Favorite data of contacts service is changed\n"); -} - -static void plog_change_callback(void *data) -{ - printf("Phone log data of contacts service is changed\n"); -} - -static void contact_change_callback(void *data) -{ - printf("Contact data of contacts service is changed\n"); -} - -static void missed_call_change_callback(void *data) -{ - printf("Missed Call is changed\n"); -} - -int main() -{ - GMainLoop *loop; - - contacts_svc_connect(); - contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE, contact_change_callback, NULL); - contacts_svc_subscribe_change(CTS_SUBSCRIBE_PLOG_CHANGE, plog_change_callback, NULL); - contacts_svc_subscribe_change(CTS_SUBSCRIBE_FAVORITE_CHANGE, favorite_change_callback, NULL); - contacts_svc_subscribe_change(CTS_SUBSCRIBE_MISSED_CALL_CHANGE, missed_call_change_callback, NULL); - - loop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(loop); - - contacts_svc_unsubscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE, contact_change_callback); - contacts_svc_unsubscribe_change(CTS_SUBSCRIBE_PLOG_CHANGE, plog_change_callback); - contacts_svc_unsubscribe_change(CTS_SUBSCRIBE_FAVORITE_CHANGE, favorite_change_callback); - contacts_svc_unsubscribe_change(CTS_SUBSCRIBE_MISSED_CALL_CHANGE, favorite_change_callback); - - contacts_svc_disconnect(); - g_main_loop_unref(loop); - - return 0; -} - diff --git a/test/contact-test.c b/test/contact-test.c deleted file mode 100755 index 037178f..0000000 --- a/test/contact-test.c +++ /dev/null @@ -1,868 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include -#include -#include -#include - -static int insert_test(void) -{ - CTSstruct *contact; - CTSvalue *name, *number1, *number2; - CTSvalue *nick, *event; - GSList *numbers, *nicknames, *events; - contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT); - - CTSvalue *base = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO); - if (base) { - //contacts_svc_value_set_str(base, CTS_BASE_VAL_IMG_PATH_STR, "/opt/media/Images and videos/Wallpapers/Wallpaper3.jpg"); - } - contacts_svc_struct_store_value(contact, CTS_CF_BASE_INFO_VALUE, base); - contacts_svc_value_free(base); - - name = contacts_svc_value_new(CTS_VALUE_NAME); - if (name) { - contacts_svc_value_set_str(name, CTS_NAME_VAL_FIRST_STR, "gildong"); - contacts_svc_value_set_str(name, CTS_NAME_VAL_LAST_STR, "Hong"); - contacts_svc_value_set_str(name, CTS_NAME_VAL_SUFFIX_STR, "engineer"); - } - contacts_svc_struct_store_value(contact, CTS_CF_NAME_VALUE, name); - contacts_svc_value_free(name); - - numbers = NULL; - number1 = contacts_svc_value_new(CTS_VALUE_NUMBER); - if (number1) { - contacts_svc_value_set_str(number1, CTS_NUM_VAL_NUMBER_STR, "0987654321"); - contacts_svc_value_set_int(number1, CTS_NUM_VAL_TYPE_INT, - CTS_NUM_TYPE_CELL); - contacts_svc_value_set_bool(number1, CTS_NUM_VAL_DEFAULT_BOOL, true); - } - numbers = g_slist_append(numbers, number1); - - number2 = contacts_svc_value_new(CTS_VALUE_NUMBER); - if (number2) { - contacts_svc_value_set_str(number2, CTS_NUM_VAL_NUMBER_STR, "0123456789"); - contacts_svc_value_set_int(number2, CTS_NUM_VAL_TYPE_INT, - CTS_NUM_TYPE_WORK|CTS_NUM_TYPE_VOICE); - } - numbers = g_slist_append(numbers, number2); - - contacts_svc_struct_store_list(contact, CTS_CF_NUMBER_LIST, numbers); - contacts_svc_value_free(number1); - contacts_svc_value_free(number2); - g_slist_free(numbers); - - nicknames = NULL; - nick = contacts_svc_value_new(CTS_VALUE_NICKNAME); - if (nick) - contacts_svc_value_set_str(nick, CTS_NICKNAME_VAL_NAME_STR, "Samm"); - - nicknames = g_slist_append(nicknames, nick); - contacts_svc_struct_store_list(contact, CTS_CF_NICKNAME_LIST, nicknames); - contacts_svc_value_free(nick); - g_slist_free(nicknames); - - nicknames = NULL; - contacts_svc_struct_get_list(contact, CTS_CF_NICKNAME_LIST, &nicknames); - if (nicknames) - nick = contacts_svc_value_new(CTS_VALUE_NICKNAME); - if (nick) - contacts_svc_value_set_str(nick, CTS_NICKNAME_VAL_NAME_STR, "3star"); - nicknames = g_slist_append(nicknames, nick); - contacts_svc_struct_store_list(contact, CTS_CF_NICKNAME_LIST, nicknames); - contacts_svc_value_free(nick); - //never free nicknames - - events = NULL; - event = contacts_svc_value_new(CTS_VALUE_EVENT); - if (event) { - contacts_svc_value_set_int(event, CTS_EVENT_VAL_DATE_INT, 20110526); - contacts_svc_value_set_int(event, CTS_EVENT_VAL_TYPE_INT, CTS_EVENT_TYPE_BIRTH); - } - - events = g_slist_append(events, event); - contacts_svc_struct_store_list(contact, CTS_CF_EVENT_LIST, events); - contacts_svc_value_free(event); - g_slist_free(events); - - int ret = contacts_svc_insert_contact(0, contact); - contacts_svc_struct_free(contact); - - return ret; -} - -void delete_test(void) -{ - //get contact - //CTSstruct *contact; - //contacts_svc_struct_get_value(contact, CTS_CF_INDEX_INT, &value); - //int index = contacts_svc_value_get_int(value, CTS_BASIC_VAL_INT); - - contacts_svc_delete_contact(2); - - //contacts_svc_struct_free(contact); - -#if DELETE_CONTACTS - // TODO: get each index of contacts - int i, index_list[10] ={1,3,4,65,345,54,5,2,9,10}; - int ret; - - ret = contacts_svc_begin_trans(); - if (CTS_SUCCESS != ret) return; - for (i=0;i<10;i++) { - ret = contacts_svc_delete_contact(index_list[i]); - if (CTS_SUCCESS != ret) { - contacts_svc_end_trans(false); - return; - } - } - ret = contacts_svc_end_trans(true); - if (ret < CTS_SUCCESS){ - printf("all work were rollbacked"); - return; - } -#endif - -} - -void update_test() -{ - int ret; - GSList *numbers, *cursor, *groupList, *nicknames; - CTSvalue *number=NULL, *name=NULL, *group = NULL, *company, *nick; - CTSstruct *contact=NULL; - - ret = contacts_svc_get_contact(1, &contact); - if (ret < CTS_SUCCESS) return; - - contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &name); - contacts_svc_value_set_str(name, CTS_NAME_VAL_FIRST_STR, "Changed first"); - contacts_svc_value_set_str(name, CTS_NAME_VAL_LAST_STR, "Changed last"); - contacts_svc_value_set_str(name, CTS_NAME_VAL_PREFIX_STR, "Changed prefix"); - contacts_svc_value_set_str(name, CTS_NAME_VAL_SUFFIX_STR, NULL); - - numbers = NULL; - contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &numbers); - cursor = numbers; - if (cursor) { - //char *temp = contacts_svc_value_get_str(cursor->data, CTS_NUM_VAL_NUMBER_STR); - contacts_svc_value_set_str(cursor->data, CTS_NUM_VAL_NUMBER_STR, "0987651234"); - - cursor = g_slist_next(cursor); - if (cursor) - contacts_svc_value_set_bool(cursor->data, CTS_NUM_VAL_DELETE_BOOL, true); - - number = contacts_svc_value_new(CTS_VALUE_NUMBER); - if (number) { - contacts_svc_value_set_str(number, CTS_NUM_VAL_NUMBER_STR, "+82125439876"); - contacts_svc_value_set_int(number, CTS_NUM_VAL_TYPE_INT, - CTS_NUM_TYPE_WORK|CTS_NUM_TYPE_FAX); - // contacts_svc_value_set_bool(number, CTS_NUM_VAL_DEFAULT_BOOL, true); - numbers = g_slist_append(numbers, number); - } - } - - contacts_svc_struct_store_list(contact, CTS_CF_NUMBER_LIST, numbers); - contacts_svc_value_free(number); - //free("+82125439876"); - - groupList = NULL; - contacts_svc_struct_get_list(contact, CTS_CF_GROUPREL_LIST, &groupList); - - cursor = groupList; - cursor=g_slist_next(groupList); - if (cursor) - contacts_svc_value_set_bool(cursor->data, CTS_GROUPREL_VAL_DELETE_BOOL, true); - - group = contacts_svc_value_new(CTS_VALUE_GROUP_RELATION); - if (group) { - contacts_svc_value_set_int(group, CTS_GROUPREL_VAL_ID_INT, 2); - groupList = g_slist_append(groupList, group); - } - contacts_svc_struct_store_list(contact, CTS_CF_GROUPREL_LIST, groupList); - contacts_svc_value_free(group); - - company = contacts_svc_value_new(CTS_VALUE_COMPANY); - if (company) { - contacts_svc_value_set_str(company, CTS_COMPANY_VAL_NAME_STR, "Company"); - contacts_svc_value_set_str(company, CTS_COMPANY_VAL_DEPARTMENT_STR, "department"); - contacts_svc_value_set_str(company, CTS_COMPANY_VAL_JOB_TITLE_STR, "engineer"); - } - contacts_svc_struct_store_value(contact, CTS_CF_COMPANY_VALUE, company); - - nicknames = NULL; - contacts_svc_struct_get_list(contact, CTS_CF_NICKNAME_LIST, &nicknames); - cursor = nicknames; - if (cursor) { - contacts_svc_value_set_bool(cursor->data, CTS_NICKNAME_VAL_DELETE_BOOL, true); - - nick = contacts_svc_value_new(CTS_VALUE_NICKNAME); - if (nick) { - contacts_svc_value_set_str(nick, CTS_NICKNAME_VAL_NAME_STR, "good company"); - nicknames = g_slist_append(nicknames, nick); - } - contacts_svc_struct_store_list(contact, CTS_CF_NICKNAME_LIST, nicknames); - contacts_svc_value_free(nick); - } - - - contacts_svc_update_contact(contact); - contacts_svc_struct_free(contact); -} - -static void translation_type(int type, char *dest, int dest_size) -{ - const char *type_str; - if (type & CTS_NUM_TYPE_CUSTOM) - { - char *custom; - custom = contacts_svc_get_custom_type(CTS_TYPE_CLASS_NUM, type); - if (NULL == custom) - type_str = "Other"; - else { - snprintf(dest, dest_size, custom); - free(custom); - return; - } - } - else if (type & CTS_NUM_TYPE_CELL) - type_str = "Mobile"; - else if (type & CTS_NUM_TYPE_VOICE) - { - if (type & CTS_NUM_TYPE_HOME) - type_str = "Home"; - else if (type & CTS_NUM_TYPE_WORK) - type_str = "Work"; - else - type_str = "Telephone"; - } - else if (type & CTS_NUM_TYPE_FAX) - { - if (type & CTS_NUM_TYPE_HOME) - type_str = "Fax(home)"; - else if (type & CTS_NUM_TYPE_WORK) - type_str = "Fax(work)"; - else - type_str = "Fax"; - } - else if (type & CTS_NUM_TYPE_PAGER) - type_str = "Pager"; - else if (type & CTS_NUM_TYPE_CAR) - type_str = "Car Telephone"; - else if (type & CTS_NUM_TYPE_ASSISTANT) - type_str = "Assistant"; - else - type_str = "Other"; - - snprintf(dest, dest_size, type_str); -} - -void get_contact(CTSstruct *contact) -{ - int index=0, ret=-1; - CTSvalue *value=NULL; - GSList *get_list, *cursor; - - if (!contact) { - index = contacts_svc_find_contact_by(CTS_FIND_BY_NUMBER, "125439876"); - if (index > CTS_SUCCESS) - ret = contacts_svc_get_contact(index, &contact); - if (ret < 0) - { - printf("No found record\n"); - return; - } - } - contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &value); - printf("First Name : %s\n", contacts_svc_value_get_str(value, CTS_NAME_VAL_FIRST_STR)); - printf("Last Name : %s\n", contacts_svc_value_get_str(value, CTS_NAME_VAL_LAST_STR)); - printf("Additional Name : %s\n", contacts_svc_value_get_str(value, CTS_NAME_VAL_ADDITION_STR)); - printf("Display Name : %s\n", contacts_svc_value_get_str(value, CTS_NAME_VAL_DISPLAY_STR)); - printf("Prefix Name : %s\n", contacts_svc_value_get_str(value, CTS_NAME_VAL_PREFIX_STR)); - printf("Suffix Name : %s\n", contacts_svc_value_get_str(value, CTS_NAME_VAL_SUFFIX_STR)); - - value = NULL; - contacts_svc_struct_get_value(contact, CTS_CF_COMPANY_VALUE, &value); - printf("Company Name : %s\n", contacts_svc_value_get_str(value, CTS_COMPANY_VAL_NAME_STR)); - printf("Company Department : %s\n", contacts_svc_value_get_str(value, CTS_COMPANY_VAL_DEPARTMENT_STR)); - - get_list = NULL; - contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &get_list); - - for (cursor=get_list;cursor;cursor=g_slist_next(cursor)) - { - int type; - char type_str[100]; - type = contacts_svc_value_get_int(cursor->data, CTS_NUM_VAL_TYPE_INT); - translation_type(type, type_str, sizeof(type_str)); - printf("number Type = %s ", type_str); - - if (contacts_svc_value_get_bool(cursor->data, CTS_NUM_VAL_FAVORITE_BOOL)) - printf("(favorite)"); - printf("Number = %s\n", - contacts_svc_value_get_str(cursor->data, CTS_NUM_VAL_NUMBER_STR)); - if (index) - contacts_svc_set_favorite(CTS_FAVOR_NUMBER, - contacts_svc_value_get_int(cursor->data, CTS_NUM_VAL_ID_INT)); - } - - get_list = NULL; - contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &get_list); - - cursor = get_list; - for (;cursor;cursor=g_slist_next(cursor)) - { - printf("email Type = %d", - contacts_svc_value_get_int(cursor->data, CTS_EMAIL_VAL_TYPE_INT)); - - printf("email = %s\n", - contacts_svc_value_get_str(cursor->data, CTS_EMAIL_VAL_ADDR_STR)); - } - - get_list = NULL; - contacts_svc_struct_get_list(contact, CTS_CF_GROUPREL_LIST, &get_list); - cursor = get_list; - for (;cursor;cursor=g_slist_next(cursor)) - { - printf("group = %s:", - contacts_svc_value_get_str(cursor->data, CTS_GROUPREL_VAL_NAME_STR)); - - printf("%d\n", - contacts_svc_value_get_int(cursor->data, CTS_GROUPREL_VAL_ID_INT)); - } - - get_list = NULL; - contacts_svc_struct_get_list(contact, CTS_CF_NICKNAME_LIST, &get_list); - cursor = get_list; - for (;cursor;cursor=g_slist_next(cursor)) - printf("nickname = %s\n", - contacts_svc_value_get_str(cursor->data, CTS_NICKNAME_VAL_NAME_STR)); - - - if (index) - contacts_svc_struct_free(contact); - -} - -void get_contact_default_num(void) -{ - int index, ret; - CTSvalue *number=NULL; - const char *default_num; - - index = contacts_svc_find_contact_by(CTS_FIND_BY_NUMBER, "0125439876"); - - ret = contacts_svc_get_contact_value(CTS_GET_DEFAULT_NUMBER_VALUE, index, &number); - if (CTS_SUCCESS != ret) { - printf("contacts_svc_get_contact_value() Failed(%d)\n", ret); - return; - } - - default_num = contacts_svc_value_get_str(number, CTS_NUM_VAL_NUMBER_STR); - printf("The default Number is %s\n", default_num); - contacts_svc_value_free(number); -} -void get_contact_list(void) -{ - CTSiter *iter = NULL; - printf("Phone contact NUM = %d\n", - contacts_svc_count_with_int(CTS_GET_COUNT_CONTACTS_IN_ADDRESSBOOK, 0)); - - contacts_svc_get_list(CTS_LIST_ALL_CONTACT, &iter); - //contacts_svc_get_list_with_int(CTS_LIST_MEMBERS_OF_ADDRESSBOOK_ID, 0, &iter); - - while (CTS_SUCCESS == contacts_svc_iter_next(iter)) - { - CTSvalue *contact = NULL; - const char *first, *last, *display; - contact = contacts_svc_iter_get_info(iter); - - printf("(%8d)", contacts_svc_value_get_int(contact, CTS_LIST_CONTACT_ID_INT)); - display = contacts_svc_value_get_str(contact, CTS_LIST_CONTACT_DISPLAY_STR); - if (display) - printf("%s :", display); - else - { - first = contacts_svc_value_get_str(contact, CTS_LIST_CONTACT_FIRST_STR); - last = contacts_svc_value_get_str(contact, CTS_LIST_CONTACT_LAST_STR); - if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - printf("%s %s :", first, last); - else - printf("%s %s :", last, first); - } - printf("%s", contacts_svc_value_get_str(contact, CTS_LIST_CONTACT_IMG_PATH_STR)); - printf("\n"); - contacts_svc_value_free(contact); - } - contacts_svc_iter_remove(iter); -} - -void sync_data(int ver) -{ - int ret, index_num; - CTSiter *iter; - - contacts_svc_get_updated_contacts(0, ver, &iter); - - while (CTS_SUCCESS == contacts_svc_iter_next(iter)) - { - CTSstruct *contact= NULL; - CTSvalue *row_info = NULL; - row_info = contacts_svc_iter_get_info(iter); - - index_num = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_ID_INT); - printf("(%8d)\n", index_num); - int type = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_TYPE_INT); - int ver = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_VER_INT); - - if (CTS_OPERATION_UPDATED == type || CTS_OPERATION_INSERTED == type) { - contacts_svc_get_contact(index_num, &contact); - char *vcard_stream, *new_stream; - char file[128]; - snprintf(file, sizeof(file), "test%d.vcf", index_num); - ret = contacts_svc_get_vcard_from_contact(contact, &vcard_stream); - new_stream = contacts_svc_vcard_put_content(vcard_stream, "X-TEST", "1234"); - printf("%s\n", (char *)new_stream); - free(new_stream); - if (CTS_SUCCESS == ret) { - //int fd = open(file, O_RDWR | O_CREAT); - //write(fd, (char *)vcard_stream, strlen((char *)vcard_stream)); - //close(fd); - CTSstruct *new_contact = NULL; - ret = contacts_svc_get_contact_from_vcard(vcard_stream, &new_contact); - if (CTS_SUCCESS == ret) { - get_contact(new_contact); - contacts_svc_struct_free(new_contact); - } - free(vcard_stream); - } - if (CTS_OPERATION_INSERTED == type) - printf("Added : %d \n", ver); - else - printf("Updated : %d \n", ver); - contacts_svc_struct_free(contact); - } - else - printf("Deleted : %d \n", ver); - - contacts_svc_value_free(row_info); - } - contacts_svc_iter_remove(iter); -} - -void search_contacts_by_name(void) -{ - int ret; - CTSiter *iter; - ret = contacts_svc_get_list_with_str(CTS_LIST_CONTACTS_WITH_NAME, - "ch", &iter); - if (CTS_SUCCESS != ret) return; - - while (CTS_SUCCESS == contacts_svc_iter_next(iter)) - { - CTSvalue *row_info = NULL; - const char *first, *last, *display; - row_info = contacts_svc_iter_get_info(iter); - - printf("(%8d)", contacts_svc_value_get_int(row_info, CTS_LIST_CONTACT_ID_INT)); - - display = contacts_svc_value_get_str(row_info, CTS_LIST_CONTACT_DISPLAY_STR); - if (display) - printf("%s :", display); - else - { - first = contacts_svc_value_get_str(row_info, CTS_LIST_CONTACT_FIRST_STR); - last = contacts_svc_value_get_str(row_info, CTS_LIST_CONTACT_LAST_STR); - if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - printf("%s %s :", first, last); - else - printf("%s %s :", last, first); - } - printf("%s", contacts_svc_value_get_str(row_info, CTS_LIST_CONTACT_IMG_PATH_STR)); - printf("\n"); - contacts_svc_value_free(row_info); - } - contacts_svc_iter_remove(iter); -} - -void get_favorite_list(void) -{ - CTSiter *iter; - contacts_svc_get_list(CTS_LIST_ALL_NUMBER_FAVORITE, &iter); - - while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { - CTSvalue *favorite = NULL; - const char *first, *last, *display; - favorite = contacts_svc_iter_get_info(iter); - - printf("(%8d)", contacts_svc_value_get_int(favorite, CTS_LIST_SHORTCUT_ID_INT)); - printf(":%d", contacts_svc_value_get_int(favorite, CTS_LIST_SHORTCUT_CONTACT_ID_INT)); - display = contacts_svc_value_get_str(favorite, CTS_LIST_SHORTCUT_DISPLAY_NAME_STR); - if (display) - printf("%s :", display); - else - { - first = contacts_svc_value_get_str(favorite, CTS_LIST_SHORTCUT_FIRST_NAME_STR); - last = contacts_svc_value_get_str(favorite, CTS_LIST_SHORTCUT_LAST_NAME_STR); - if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - printf("%s %s :", first, last); - else - printf("%s %s :", last, first); - } - printf("%s", contacts_svc_value_get_str(favorite, CTS_LIST_SHORTCUT_NUMBER_STR)); - printf("(%d)", contacts_svc_value_get_int(favorite, CTS_LIST_SHORTCUT_NUMBER_TYPE_INT)); - printf("-%d)", contacts_svc_value_get_int(favorite, CTS_LIST_SHORTCUT_SPEEDDIAL_INT)); - printf("%s", contacts_svc_value_get_str(favorite, CTS_LIST_SHORTCUT_IMG_PATH_STR)); - printf("\n"); - contacts_svc_value_free(favorite); - } - contacts_svc_iter_remove(iter); -} - -void put_value_test() -{ - CTSvalue *value, *number; - - value = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO); - if (value) { - contacts_svc_value_set_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR, - "/opt/test/test.mp3"); - contacts_svc_put_contact_value(CTS_PUT_VAL_REPLACE_RINGTONE, 1, value); - contacts_svc_value_free(value); - } - - number = contacts_svc_value_new(CTS_VALUE_NUMBER); - if (number) { - contacts_svc_value_set_str(number, CTS_NUM_VAL_NUMBER_STR, "0123337777"); - contacts_svc_value_set_int(number, CTS_NUM_VAL_TYPE_INT, CTS_NUM_TYPE_CELL); - // contacts_svc_value_set_bool(number, CTS_NUM_VAL_DEFAULT_BOOL, true); - - contacts_svc_put_contact_value(CTS_PUT_VAL_ADD_NUMBER, 1, number); - contacts_svc_value_free(number); - } -} - -static void print_extend_contact(CTSstruct *contact) -{ - int ret; - CTSvalue *value; - GSList *get_list, *cursor; - value = NULL; - contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &value); - printf("First Name : %s\n", contacts_svc_value_get_str(value, CTS_NAME_VAL_FIRST_STR)); - printf("Last Name : %s\n", contacts_svc_value_get_str(value, CTS_NAME_VAL_LAST_STR)); - - value = NULL; - ret = contacts_svc_find_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, "YomiName"); - ret = contacts_svc_struct_get_value(contact, ret, &value); - if (CTS_SUCCESS == ret) { - printf("extend1 data2 : %s\n", contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA2_STR)); - printf("extend1 data3 : %s\n", contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA3_STR)); - printf("extend1 data4 : %s\n", contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA4_STR)); - } - value = NULL; - ret = contacts_svc_find_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, "Family"); - ret = contacts_svc_struct_get_value(contact, ret, &value); - if (CTS_SUCCESS == ret) { - printf("extend2 data2 : %s\n", contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA2_STR)); - printf("extend2 data3 : %s\n", contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA3_STR)); - printf("extend2 data4 : %s\n", contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA4_STR)); - } - get_list = NULL; - contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &get_list); - - cursor = get_list; - for (;cursor;cursor=g_slist_next(cursor)) - { - int type; - char type_str[100]; - type = contacts_svc_value_get_int(cursor->data, CTS_NUM_VAL_TYPE_INT); - translation_type(type, type_str, sizeof(type_str)); - printf("number Type = %s", type_str); - - if (contacts_svc_value_get_bool(cursor->data, CTS_NUM_VAL_FAVORITE_BOOL)) - printf("(favorite)"); - printf("Number = %s\n", - contacts_svc_value_get_str(cursor->data, CTS_NUM_VAL_NUMBER_STR)); - } -} - -void extend_data_test(void) -{ - int ret, index; - CTSstruct *contact; - CTSvalue *name, *number1, *extend_value; - GSList *numbers=NULL; - - contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT); - - name = contacts_svc_value_new(CTS_VALUE_NAME); - if (name) { - contacts_svc_value_set_str(name, CTS_NAME_VAL_FIRST_STR, "People"); - contacts_svc_value_set_str(name, CTS_NAME_VAL_LAST_STR, "Japan"); - } - contacts_svc_struct_store_value(contact, CTS_CF_NAME_VALUE, name); - contacts_svc_value_free(name); - - number1 = contacts_svc_value_new(CTS_VALUE_NUMBER); - if (number1) { - contacts_svc_value_set_str(number1, CTS_NUM_VAL_NUMBER_STR, "0333333333"); - contacts_svc_value_set_int(number1, CTS_NUM_VAL_TYPE_INT, CTS_NUM_TYPE_CELL); - contacts_svc_value_set_bool(number1, CTS_NUM_VAL_DEFAULT_BOOL, true); - } - numbers = g_slist_append(numbers, number1); - - contacts_svc_struct_store_list(contact, CTS_CF_NUMBER_LIST, numbers); - contacts_svc_value_free(number1); - g_slist_free(numbers); - - extend_value = contacts_svc_value_new(CTS_VALUE_EXTEND); - if (extend_value) { - contacts_svc_value_set_str(extend_value, CTS_EXTEND_VAL_DATA2_STR, "YomiFirstName"); - contacts_svc_value_set_str(extend_value, CTS_EXTEND_VAL_DATA3_STR, "YomiLastName"); - contacts_svc_value_set_str(extend_value, CTS_EXTEND_VAL_DATA4_STR, "YomiCompanyName"); - } - ret = contacts_svc_find_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, "YomiName"); - if (CTS_ERR_DB_RECORD_NOT_FOUND == ret) - ret = contacts_svc_insert_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, "YomiName"); - contacts_svc_struct_store_value(contact, ret, extend_value); - contacts_svc_value_free(extend_value); - - extend_value = contacts_svc_value_new(CTS_VALUE_EXTEND); - if (extend_value) { - contacts_svc_value_set_str(extend_value, CTS_EXTEND_VAL_DATA2_STR, "Children1"); - contacts_svc_value_set_str(extend_value, CTS_EXTEND_VAL_DATA3_STR, "Children2"); - contacts_svc_value_set_str(extend_value, CTS_EXTEND_VAL_DATA4_STR, "Children3"); - } - ret = contacts_svc_find_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, "Family"); - if (CTS_ERR_DB_RECORD_NOT_FOUND == ret) - ret = contacts_svc_insert_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, "Family"); - contacts_svc_struct_store_value(contact, ret, extend_value); - contacts_svc_value_free(extend_value); - - index = contacts_svc_insert_contact(0, contact); - contacts_svc_struct_free(contact); - contact = NULL; - - ret = contacts_svc_get_contact(index, &contact); - if (ret < 0) - { - printf("No found record\n"); - return; - } - print_extend_contact(contact); - - //update test - - extend_value = NULL; - int type = contacts_svc_find_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, "Family"); - ret = contacts_svc_struct_get_value(contact, type, &extend_value); - if (CTS_SUCCESS == ret) - contacts_svc_value_set_str(extend_value, CTS_EXTEND_VAL_DATA2_STR, "Children4"); - contacts_svc_struct_store_value(contact, type, extend_value); - - contacts_svc_update_contact(contact); - contacts_svc_struct_free(contact); - contact = NULL; - - ret = contacts_svc_get_contact(index, &contact); - if (ret < 0) - { - printf("No found record\n"); - return; - } - print_extend_contact(contact); - contacts_svc_struct_free(contact); -} - -void get_number_list(void) -{ - CTSiter *iter; - contacts_svc_get_list_with_str(CTS_LIST_NUMBERINFOS_WITH_NUM, "123", &iter); - //contacts_svc_get_list_with_str(CTS_LIST_NUMBERINFOS_WITH_NAME, "kim", &iter); - - while (CTS_SUCCESS == contacts_svc_iter_next(iter)) - { - CTSvalue *contact = NULL; - const char *first, *last, *display; - contact = contacts_svc_iter_get_info(iter); - - printf("(%8d)", contacts_svc_value_get_int(contact, CTS_LIST_NUM_CONTACT_ID_INT)); - display = contacts_svc_value_get_str(contact, CTS_LIST_NUM_CONTACT_DISPLAY_STR); - if (display) - printf("%s :", display); - else - { - first = contacts_svc_value_get_str(contact, CTS_LIST_NUM_CONTACT_FIRST_STR); - last = contacts_svc_value_get_str(contact, CTS_LIST_NUM_CONTACT_LAST_STR); - if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - printf("%s %s :", first, last); - else - printf("%s %s :", last, first); - } - printf("%s", contacts_svc_value_get_str(contact, CTS_LIST_NUM_CONTACT_IMG_PATH_STR)); - printf("\n"); - printf("%s\n", contacts_svc_value_get_str(contact, CTS_LIST_NUM_NUMBER_STR)); - contacts_svc_value_free(contact); - } - contacts_svc_iter_remove(iter); -} - -static int get_search_cb(CTSvalue *value, void *user_data) -{ - const char *number, *img_path; - const char *first, *last, *display; - - printf("(%8d)", contacts_svc_value_get_int(value, CTS_LIST_NUM_CONTACT_ID_INT)); - display = contacts_svc_value_get_str(value, CTS_LIST_NUM_CONTACT_DISPLAY_STR); - if (display) - printf("%s :", display); - else - { - first = contacts_svc_value_get_str(value, CTS_LIST_NUM_CONTACT_FIRST_STR); - last = contacts_svc_value_get_str(value, CTS_LIST_NUM_CONTACT_LAST_STR); - if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - printf("%s %s :", first, last); - else - printf("%s %s :", last, first); - } - - img_path = contacts_svc_value_get_str(value, CTS_LIST_NUM_CONTACT_IMG_PATH_STR); - if (img_path) - printf("%s\n", img_path); - else - printf("\n"); - - number = contacts_svc_value_get_str(value, CTS_LIST_NUM_NUMBER_STR); - if (number) - printf("%s\n", number); - - return CTS_SUCCESS; -} - -void get_search(void) -{ - contacts_svc_smartsearch_excl("fir", 0, 0, get_search_cb, NULL); -} - -static int get_list_with_filter_cb(CTSvalue *value, void *user_data) -{ - const char *img_path; - const char *first, *last, *display; - - printf("(%8d)", contacts_svc_value_get_int(value, CTS_LIST_CONTACT_ID_INT)); - display = contacts_svc_value_get_str(value, CTS_LIST_CONTACT_DISPLAY_STR); - if (display) - printf("%s :", display); - else - { - first = contacts_svc_value_get_str(value, CTS_LIST_CONTACT_FIRST_STR); - last = contacts_svc_value_get_str(value, CTS_LIST_CONTACT_LAST_STR); - if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - printf("%s %s :", first, last); - else - printf("%s %s :", last, first); - } - - img_path = contacts_svc_value_get_str(value, CTS_LIST_CONTACT_IMG_PATH_STR); - if (img_path) - printf("%s\n", img_path); - else - printf("\n"); - - return CTS_SUCCESS; -} - -void get_list_with_filter(void) -{ - int ret; - CTSfilter *filter; - - filter = contacts_svc_list_str_filter_new(CTS_FILTERED_CONTACTS_WITH_NAME, - "kim", CTS_LIST_FILTER_ADDRESBOOK_ID_INT, 0, CTS_LIST_FILTER_NONE); - if (NULL == filter) { - printf("contacts_svc_list_str_filter_new() Failed\n"); - return; - } - - ret = contacts_svc_list_with_filter_foreach(filter, get_list_with_filter_cb, NULL); - if (CTS_SUCCESS != ret) - printf("contacts_svc_list_with_filter_foreach() Failed(%d)\n", ret); - - contacts_svc_list_filter_free(filter); -} - -int main() -{ - int ret, ver; - contacts_svc_connect(); - printf("\n##Insert##\n"); - - contacts_svc_begin_trans(); - ret = insert_test(); - if (CTS_SUCCESS < ret) - ver = contacts_svc_end_trans(true); - else - contacts_svc_end_trans(false); - printf("\n##Insert##\n"); - insert_test(); - sleep(2); - printf("\n##Update test##\n"); - update_test(); - put_value_test(); - printf("\n##All Contact Information##\n"); - get_contact(NULL); - printf("\n##Default Number##\n"); - get_contact_default_num(); - - printf("\n##Contact List##\n"); - get_contact_list(); - printf("\n##Delete Test##\n"); - delete_test(); - printf("\n##Sync Test##\n"); - sync_data(ver); - - printf("\n##Search Name##\n"); - search_contacts_by_name(); - printf("\n##Favorite List##\n"); - get_favorite_list(); - printf("\n##Favorite 1 Delete##\n"); - contacts_svc_delete_favorite(1); - get_favorite_list(); - - printf("\n##Extend Data insert##\n"); - extend_data_test(); - - printf("\n##Number List##\n"); - get_number_list(); - - printf("\n##search##\n"); - get_search(); - - printf("\n##list_with_filter##\n"); - get_list_with_filter(); - - contacts_svc_disconnect(); - - return 0; -} diff --git a/test/group-test.c b/test/group-test.c deleted file mode 100755 index fb387d5..0000000 --- a/test/group-test.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include - -void insert_group(const char *group_name) -{ - int ret; - CTSvalue *group; - group = contacts_svc_value_new(CTS_VALUE_GROUP); - - contacts_svc_value_set_str(group, CTS_GROUP_VAL_NAME_STR, group_name); - contacts_svc_value_set_str(group, CTS_GROUP_VAL_RINGTONE_STR,"/tmp/test.mp3"); - - ret = contacts_svc_insert_group(0, group); - if (ret < CTS_SUCCESS) - printf("contacts_svc_insert_group() Failed\n"); - - contacts_svc_value_free(group); -} -void get_group(void) -{ - int ret; - CTSvalue *group = NULL; - ret = contacts_svc_get_group(2, &group); - if (CTS_SUCCESS != ret) { - printf("contacts_svc_get_group() Failed\n"); - return; - } - - printf("Addressbook ID : %d\n", - contacts_svc_value_get_int(group, CTS_GROUP_VAL_ADDRESSBOOK_ID_INT)); - printf("Name : %s\n", - contacts_svc_value_get_str(group, CTS_GROUP_VAL_NAME_STR)); - if (contacts_svc_value_get_str(group, CTS_GROUP_VAL_RINGTONE_STR)) - printf("ringtone : %s\n", - contacts_svc_value_get_str(group, CTS_GROUP_VAL_RINGTONE_STR)); -} - -void update_group(void) -{ - int ret; - CTSvalue *group = NULL; - ret = contacts_svc_get_group(2, &group); - if (CTS_SUCCESS != ret) { - printf("contacts_svc_get_group() Failed\n"); - return; - } - - contacts_svc_value_set_str(group, CTS_GROUP_VAL_NAME_STR,"Fix-Friends"); - contacts_svc_value_set_str(group, CTS_GROUP_VAL_RINGTONE_STR,"/tmp/change.mp3"); - - //free("Fix-Friends"); - //free("/tmp/change.mp3"); - ret = contacts_svc_update_group(group); - if (ret < CTS_SUCCESS) - printf("contacts_svc_update_group() Failed\n"); - - contacts_svc_value_free(group); -} - -void delete_group(void) -{ - int ret; - ret = contacts_svc_delete_group(3); - if (CTS_SUCCESS != ret) - printf("Error : contacts_svc_delete_group() Failed(%d)\n", ret); -} - -void delete_group_with_members(void) -{ - int ret; - ret = contacts_svc_delete_group_with_members(1); - if (CTS_SUCCESS != ret) - printf("Error : contacts_svc_delete_group_with_members() Failed(%d)\n", ret); -} - -void group_list(void) -{ - int ret; - CTSiter *iter; - ret = contacts_svc_get_list(CTS_LIST_ALL_GROUP, &iter); - if (CTS_SUCCESS != ret) { - printf("contacts_svc_get_list() Failed\n"); - return; - } - - while (CTS_SUCCESS == contacts_svc_iter_next(iter)) - { - CTSvalue *group; - const char *name; - group = contacts_svc_iter_get_info(iter); - - printf("%8d", contacts_svc_value_get_int(group, CTS_LIST_GROUP_ID_INT)); - printf("(%d)", contacts_svc_value_get_int(group, CTS_LIST_GROUP_ADDRESSBOOK_ID_INT)); - name = contacts_svc_value_get_str(group, CTS_LIST_GROUP_NAME_STR); - if (name) - printf("%s :", name); - printf("\n"); - contacts_svc_value_free(group); - } - contacts_svc_iter_remove(iter); -} - - -int main() -{ - contacts_svc_connect(); - insert_group("Friends"); - insert_group("Home"); - get_group(); - update_group(); - group_list(); - delete_group(); - delete_group_with_members(); - contacts_svc_disconnect(); - return 0; -} - diff --git a/test/phonelog-test.c b/test/phonelog-test.c deleted file mode 100755 index 38a10f3..0000000 --- a/test/phonelog-test.c +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include -#include -#include -#include - -void phonelog_insert_test(void) -{ - CTSvalue *plog; - - plog = contacts_svc_value_new(CTS_VALUE_PHONELOG); - contacts_svc_value_set_str(plog, CTS_PLOG_VAL_NUMBER_STR, "0123456789"); - contacts_svc_value_set_int(plog, CTS_PLOG_VAL_LOG_TIME_INT,(int) time(NULL)); - contacts_svc_value_set_int(plog, CTS_PLOG_VAL_LOG_TYPE_INT, - CTS_PLOG_TYPE_VOICE_INCOMMING); - contacts_svc_value_set_int(plog, CTS_PLOG_VAL_DURATION_INT, 65); - contacts_svc_insert_phonelog(plog); - - contacts_svc_value_set_str(plog, CTS_PLOG_VAL_NUMBER_STR, "0987654321"); - contacts_svc_value_set_int(plog, CTS_PLOG_VAL_LOG_TIME_INT,(int) time(NULL)); - contacts_svc_value_set_int(plog, CTS_PLOG_VAL_LOG_TYPE_INT, - CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN); - contacts_svc_value_set_int(plog, CTS_PLOG_VAL_DURATION_INT, 65); - contacts_svc_insert_phonelog(plog); - - contacts_svc_value_set_str(plog, CTS_PLOG_VAL_NUMBER_STR, "0987654321"); - contacts_svc_value_set_int(plog, CTS_PLOG_VAL_LOG_TIME_INT,(int) time(NULL)); - contacts_svc_value_set_int(plog, CTS_PLOG_VAL_LOG_TYPE_INT, - CTS_PLOG_TYPE_VOICE_INCOMMING); - contacts_svc_value_set_int(plog, CTS_PLOG_VAL_DURATION_INT, 65); - contacts_svc_insert_phonelog(plog); - - - contacts_svc_value_free(plog); -} -void phonelog_modify_test(void) -{ - contacts_svc_phonelog_set_seen(2, CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN); - - contacts_svc_delete_phonelog(CTS_PLOG_DEL_BY_ID, 3); - contacts_svc_delete_phonelog(CTS_PLOG_DEL_BY_NUMBER, "0123456789"); -} - -void phonelog_get_list_test(void) -{ - CTSiter *iter = NULL; - char display[1024]={0}; - - contacts_svc_get_list(CTS_LIST_GROUPING_PLOG, &iter); - - while (CTS_SUCCESS == contacts_svc_iter_next(iter)) - { - CTSvalue *plog= NULL; - plog = contacts_svc_iter_get_info(iter); - - const char *img_path = contacts_svc_value_get_str(plog, CTS_LIST_PLOG_IMG_PATH_STR); - const char *display_name = contacts_svc_value_get_str(plog, CTS_LIST_PLOG_DISPLAY_NAME_STR); - const char *number = contacts_svc_value_get_str(plog, CTS_LIST_PLOG_NUMBER_STR); - if (display_name) - snprintf(display, sizeof(display), "%s", display_name); - else - { - const char *first = contacts_svc_value_get_str(plog, CTS_LIST_PLOG_FIRST_NAME_STR); - const char *last = contacts_svc_value_get_str(plog, CTS_LIST_PLOG_LAST_NAME_STR); - if (first && last) { - if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - snprintf(display, sizeof(display), "%s %s", first, last); - else - snprintf(display, sizeof(display), "%s %s", last, first); - }else if (first) - strcpy(display, first); - else if (last) - strcpy(display, last); - else { - if (number) - strcpy(display, number); - } - } - - int num_type = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_NUM_TYPE_INT); - - int index = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_ID_INT); - int type = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_LOG_TYPE_INT); - int time = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_LOG_TIME_INT); - - if (strlen(display)) - printf("%d:%s(%s:%d):type=%d:time=%d\n", - index, display, number, num_type, type, time); - if (img_path) - printf("%s\n", img_path); - contacts_svc_value_free(plog); - } - contacts_svc_iter_remove(iter); -} - -void phonelog_get_detail_list_test(void) -{ - int ret; - CTSiter *iter = NULL; - contacts_svc_get_list_with_str(CTS_LIST_PLOGS_OF_NUMBER,"0987654321", &iter); - - ret = contacts_svc_iter_next(iter); - while (CTS_SUCCESS == ret) - { - CTSvalue *plog=NULL; - plog = contacts_svc_iter_get_info(iter); - - int index = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_ID_INT); - int type = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_LOG_TYPE_INT); - int time = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_LOG_TIME_INT); - int duration = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_DURATION_INT); - - printf("%d::type=%d:time=%d:duration=%d\n", index, type, time, duration); - contacts_svc_value_free(plog); - ret = contacts_svc_iter_next(iter); - } - contacts_svc_iter_remove(iter); -} - -static int plog_get_number_list_cb(const char *number, void *user_data) -{ - printf("number = %s\n", number); - return CTS_SUCCESS; -} - -void phonelog_get_number_list_test(void) -{ - int ret; - - ret = contats_svc_phonelog_get_all_number(plog_get_number_list_cb, NULL); - if (CTS_SUCCESS != ret) - printf("contats_svc_phonelog_get_all_number() Failed(%d)\n", ret); - -} - -void phonelog_get_last_call_number_test(void) -{ - char *number = contacts_svc_phonelog_get_last_number(CTS_PLOG_LAST_ALL); - - printf("Last Call Number is %s\n", number); - free(number); -} - -int main() -{ - contacts_svc_connect(); - phonelog_insert_test(); - sleep(2); - phonelog_insert_test(); - printf("grouping List 1 <<<<<<<<<<<\n"); - phonelog_get_list_test(); - phonelog_modify_test(); - printf("grouping List 2 <<<<<<<<<<<\n"); - phonelog_get_list_test(); - printf("detail List <<<<<<<<<<<\n"); - phonelog_get_detail_list_test(); - printf("phonelog number List <<<<<<<<<<<\n"); - phonelog_get_number_list_test(); - - phonelog_get_last_call_number_test(); - - contacts_svc_disconnect(); - return 0; -} diff --git a/test/timetest.c b/test/timetest.c deleted file mode 100755 index ac3d3be..0000000 --- a/test/timetest.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include -#include "timetest.h" - -FILE *outfp; - - -double correction; - -double set_start_time(void) -{ - // DEBUG_FUNC_START; - - struct timeval tv; - double curtime; - - gettimeofday(&tv, NULL); - curtime = tv.tv_sec * 1000 + (double)tv.tv_usec/1000; - return curtime; -} - -double exec_time(double start) -{ - // DEBUG_FUNC_START; - - double end = set_start_time(); - return (end - start - correction); -} - -int init_time(void) -{ - // DEBUG_FUNC_START; - - double temp_t; - temp_t = set_start_time(); - correction = exec_time(temp_t); - - return 0; -} - -int print_time(char *prn_args, double time) -{ - DEBUG_FUNC_START; - -#ifdef USE_STD_OUT - printf("%200s =\t", prn_args); - printf("%f \n", time); -#else - fprintf(outfp, "%.50s\t", prn_args); - fprintf(outfp, "%f \n", time); -#endif - - return 0; -} - - -int print_argument(char *prn_args) -{ - DEBUG_FUNC_START; - -#ifdef USE_STD_OUT - printf("%s", prn_args); -#else - fprintf(outfp, "%s\n", prn_args); -#endif - - return 0; -} - - - -int print_milestone(char *prn_args, int level) -{ - DEBUG_FUNC_START; - int i; - - if (level > 1) { - for (i=0;i - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef _TIMETEST_H_ -#define _TIMETEST_H_ - - -#define TEST_TRACE(fmt, arg...) \ - printf("[TEST]%s %d:\n" fmt "", __FUNCTION__, __LINE__, ##arg) - -#define TEST_DEBUG(fmt, arg...) \ - printf("\x1b[105;37m[TEST]\x1b[0m(%d)" fmt "", __LINE__, ##arg) - - -#define DEBUG_FUNC_START \ - printf("\x1b[104;93m[FUNC_START]\x1b[0m%s\n", __FUNCTION__) - - -#define TEST_ERROR_PRINT(fmt, arg...) \ - printf("\n\x1b[101;38m[ERROR]\x1b[0m%s(%d): " fmt "", __FUNCTION__, __LINE__, ##arg) - -#define TEST_ERR_PRN_TREAT(eval, X, expr) if (eval) {TEST_ERROR_PRINT X; expr;} else {;} - - -int init_time(void); -double set_start_time(void); -double exec_time(double start); - -int print_time(char *prn_args, double time); -int print_argument(char *prn_args); -int print_milestone(char *prn_args, int level); -int std_output(char *prn_args, double time); -int file_print_init(char *filename); - - -#endif //_TIMETEST_H_ diff --git a/test/vcard2contact-test.c b/test/vcard2contact-test.c deleted file mode 100755 index d3e9e4b..0000000 --- a/test/vcard2contact-test.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Contacts Service - * - * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngjae Shin - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include -#include -#include -#include - -#include - -#define MAX_BUF 1048576 - -static void get_contact(CTSstruct *contact) -{ - CTSvalue *value; - GSList *get_list, *cursor; - const char *tmp_str; - - value = NULL; - contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &value); - printf("ID = %d\n", contacts_svc_value_get_int(value, CTS_BASE_VAL_ID_INT)); - printf("changed time = %d\n", contacts_svc_value_get_int(value, CTS_BASE_VAL_CHANGED_TIME_INT)); - - value = NULL; - contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &value); - if ((tmp_str = contacts_svc_value_get_str(value, CTS_NAME_VAL_FIRST_STR))) - printf("First Name : %s\n", tmp_str); - if ((tmp_str = contacts_svc_value_get_str(value, CTS_NAME_VAL_LAST_STR))) - printf("Last Name : %s\n", tmp_str); - if ((tmp_str = contacts_svc_value_get_str(value, CTS_NAME_VAL_ADDITION_STR))) - printf("Additional Name : %s\n", tmp_str); - if ((tmp_str = contacts_svc_value_get_str(value, CTS_NAME_VAL_DISPLAY_STR))) - printf("Display Name : %s\n", tmp_str); - if ((tmp_str = contacts_svc_value_get_str(value, CTS_NAME_VAL_PREFIX_STR))) - printf("Prefix Name : %s\n", tmp_str); - if ((tmp_str = contacts_svc_value_get_str(value, CTS_NAME_VAL_SUFFIX_STR))) - printf("Suffix Name : %s\n", tmp_str); - - value = NULL; - contacts_svc_struct_get_value(contact, CTS_CF_COMPANY_VALUE, &value); - if ((tmp_str = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_NAME_STR))) - printf("Company Name : %s\n", tmp_str); - if ((tmp_str = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_DEPARTMENT_STR))) - printf("Company Department : %s\n", tmp_str); - - get_list = NULL; - contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &get_list); - - for (cursor = get_list;cursor;cursor=cursor->next) - { - printf("number Type = %d", - contacts_svc_value_get_int(cursor->data, CTS_NUM_VAL_TYPE_INT)); - if (contacts_svc_value_get_bool(cursor->data, CTS_NUM_VAL_FAVORITE_BOOL)) - printf("(favorite)"); - printf("Number = %s\n", - contacts_svc_value_get_str(cursor->data, CTS_NUM_VAL_NUMBER_STR)); - } - - get_list = NULL; - contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &get_list); - - for (cursor = get_list;cursor;cursor=cursor->next) - { - printf("email Type = %d", - contacts_svc_value_get_int(cursor->data, CTS_EMAIL_VAL_TYPE_INT)); - - printf("email = %s\n", - contacts_svc_value_get_str(cursor->data, CTS_EMAIL_VAL_ADDR_STR)); - } - - get_list = NULL; - contacts_svc_struct_get_list(contact, CTS_CF_POSTAL_ADDR_LIST, &get_list); - for (cursor = get_list;cursor;cursor=cursor->next) - { - printf(">>> Postal(type = %d) <<<\n", - contacts_svc_value_get_int(cursor->data, CTS_POSTAL_VAL_TYPE_INT)); - if ((tmp_str = contacts_svc_value_get_str(cursor->data, CTS_POSTAL_VAL_POBOX_STR))) - printf("Pobox = %s\n", tmp_str); - if ((tmp_str = contacts_svc_value_get_str(cursor->data, CTS_POSTAL_VAL_POSTALCODE_STR))) - printf("POSTALCODE = %s\n", tmp_str); - if ((tmp_str = contacts_svc_value_get_str(cursor->data, CTS_POSTAL_VAL_LOCALITY_STR))) - printf("LOCALITY = %s\n", tmp_str); - if ((tmp_str = contacts_svc_value_get_str(cursor->data, CTS_POSTAL_VAL_STREET_STR))) - printf("STREET = %s\n", tmp_str); - if ((tmp_str = contacts_svc_value_get_str(cursor->data, CTS_POSTAL_VAL_EXTENDED_STR))) - printf("EXTENDED = %s\n", tmp_str); - if ((tmp_str = contacts_svc_value_get_str(cursor->data, CTS_POSTAL_VAL_COUNTRY_STR))) - printf("COUNTRY = %s\n", tmp_str); - } - get_list = NULL; - contacts_svc_struct_get_list(contact, CTS_CF_EVENT_LIST, &get_list); - for (cursor = get_list;cursor;cursor=cursor->next) - { - printf("type=%d:%d\n", - contacts_svc_value_get_int(cursor->data, CTS_EVENT_VAL_TYPE_INT), - contacts_svc_value_get_int(cursor->data, CTS_EVENT_VAL_DATE_INT)); - } -} - -static int vcard_handler(const char *vcard, void *data) -{ - int ret; - CTSstruct *new_contact = NULL; - - ret = contacts_svc_get_contact_from_vcard(vcard, &new_contact); - if (CTS_SUCCESS == ret) { - get_contact(new_contact); - contacts_svc_struct_free(new_contact); - } - - contacts_svc_insert_vcard(0, vcard); - contacts_svc_replace_by_vcard(1, vcard); - - return CTS_SUCCESS; -} - -int main(int argc, char **argv) -{ - if (argc < 2) return -1; - contacts_svc_connect(); - - printf("vcard file has %d vcards\n", contacts_svc_vcard_count(argv[1])); - contacts_svc_vcard_foreach(argv[1], vcard_handler, NULL); - - contacts_svc_disconnect(); - - return 0; -} -- 2.7.4