added sip view table 09/52609/18 accepted/tizen/mobile/20160108.071111 submit/tizen_mobile/20160108.010740
authorJeesun Kim <iamjs.kim@samsung.com>
Wed, 25 Nov 2015 05:02:33 +0000 (14:02 +0900)
committerjeesun kim <iamjs.kim@samsung.com>
Tue, 5 Jan 2016 08:14:05 +0000 (00:14 -0800)
Change-Id: I61f584ef85747b22d436ca60ad8411fc942530fd

28 files changed:
client/CMakeLists.txt
client/ctsvc_client_db_notification.c
common/ctsvc_inotify.c
common/ctsvc_notify.h
common/ctsvc_record.c
common/ctsvc_record_contact.c
common/ctsvc_record_my_profile.c
common/ctsvc_struct.h
common/ctsvc_view.c
common/ctsvc_view.h
common/ipc/ctsvc_ipc_contact.c
common/ipc/ctsvc_ipc_marshal.c
common/ipc/ctsvc_ipc_sip.c [new file with mode: 0644]
include/contacts_types.h
include/contacts_views.h
server/CMakeLists.txt
server/ctsvc_notification.c
server/ctsvc_notification.h
server/ctsvc_server.c
server/db/ctsvc_db_init.c
server/db/ctsvc_db_plugin_contact.c
server/db/ctsvc_db_plugin_contact_helper.c
server/db/ctsvc_db_plugin_contact_helper.h
server/db/ctsvc_db_plugin_my_profile.c
server/db/ctsvc_db_plugin_sip.c [new file with mode: 0644]
server/db/ctsvc_db_plugin_sip_helper.c [new file with mode: 0644]
server/db/ctsvc_db_plugin_sip_helper.h [new file with mode: 0644]
server/db/ctsvc_db_schema.h

index 42a4f0e..5b28bbc 100644 (file)
@@ -53,6 +53,7 @@ SET(SRCS
        ${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_sip.c
 
        ${CMAKE_SOURCE_DIR}/common/ctsvc_filter.c
        ${CMAKE_SOURCE_DIR}/common/ctsvc_inotify.c
index 6a47712..18b0dc2 100644 (file)
@@ -52,25 +52,26 @@ static int _client_noti_check_read_permission(const char *view_uri)
                        || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_ACTIVITY_PHOTO, strlen(CTSVC_VIEW_URI_ACTIVITY_PHOTO))
                        || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_SPEEDDIAL, strlen(CTSVC_VIEW_URI_SPEEDDIAL))
                        || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_SDN, strlen(CTSVC_VIEW_URI_SDN))
-                       || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_GROUP_RELATION, strlen(CTSVC_VIEW_URI_GROUP_RELATION))) {
-                               ret = ctsvc_ipc_client_check_permission(CTSVC_PERMISSION_CONTACT_READ, &result);
-                               if (CONTACTS_ERROR_NONE != ret) {
-                                       ERR("ctsvc_ipc_client_check_permission() Fail(%d)", ret);
-                                       return ret;
-                               }
-
-                               RETVM_IF(result == false, CONTACTS_ERROR_PERMISSION_DENIED,
-                                               "Permission denied(contact read)");
-                       } else if (STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_PHONELOG, strlen(CTSVC_VIEW_URI_PHONELOG))) {
-                               ret = ctsvc_ipc_client_check_permission(CTSVC_PERMISSION_PHONELOG_READ, &result);
-                               if (CONTACTS_ERROR_NONE != ret) {
-                                       ERR("ctsvc_ipc_client_check_permission() Fail(%d)", ret);
-                                       return ret;
-                               }
-
-                               RETVM_IF(result == false, CONTACTS_ERROR_PERMISSION_DENIED,
-                                               "Permission denied(phonelog read)");
-                       }
+                       || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_GROUP_RELATION, strlen(CTSVC_VIEW_URI_GROUP_RELATION))
+                       || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_SIP, strlen(CTSVC_VIEW_URI_SIP))) {
+               ret = ctsvc_ipc_client_check_permission(CTSVC_PERMISSION_CONTACT_READ, &result);
+               if (CONTACTS_ERROR_NONE != ret) {
+                       ERR("ctsvc_ipc_client_check_permission() Fail(%d)", ret);
+                       return ret;
+               }
+
+               RETVM_IF(result == false, CONTACTS_ERROR_PERMISSION_DENIED,
+                               "Permission denied(contact read)");
+       } else if (STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_PHONELOG, strlen(CTSVC_VIEW_URI_PHONELOG))) {
+               ret = ctsvc_ipc_client_check_permission(CTSVC_PERMISSION_PHONELOG_READ, &result);
+               if (CONTACTS_ERROR_NONE != ret) {
+                       ERR("ctsvc_ipc_client_check_permission() Fail(%d)", ret);
+                       return ret;
+               }
+
+               RETVM_IF(result == false, CONTACTS_ERROR_PERMISSION_DENIED,
+                               "Permission denied(phonelog read)");
+       }
 
        return CONTACTS_ERROR_NONE;
 }
index 015ca8a..4a9cebf 100644 (file)
@@ -255,6 +255,8 @@ static inline const char* __ctsvc_noti_get_file_path(const char *view_uri)
                return CTSVC_NOTI_SPEEDDIAL_CHANGED;
        case CTSVC_RECORD_SDN:
                return CTSVC_NOTI_SDN_CHANGED;
+       case CTSVC_RECORD_SIP:
+               return CTSVC_NOTI_SIP_CHANGED;
        case CTSVC_RECORD_RESULT:
        default:
                ERR("The type(%s) is not supported", view_uri);
index 4499e56..9422820 100644 (file)
@@ -57,6 +57,7 @@
 #define CTSVC_NOTI_ACTIVITY_PHOTO_CHANGED tzplatform_mkpath(TZ_USER_DATA, "contacts-svc/.CONTACTS_SVC_ACTIVITY_PHOTO_CHANGED")
 #define CTSVC_NOTI_PHONELOG_CHANGED tzplatform_mkpath(TZ_USER_DATA, "contacts-svc/.CONTACTS_SVC_PLOG_CHANGED")
 #define CTSVC_NOTI_SPEEDDIAL_CHANGED tzplatform_mkpath(TZ_USER_DATA, "contacts-svc/.CONTACTS_SVC_SPEED_CHANGED")
+#define CTSVC_NOTI_SIP_CHANGED tzplatform_mkpath(TZ_USER_DATA, "contacts-svc/.CONTACTS_SVC_SIP_CHANGED")
 #define CTSVC_SETTING_DISPLAY_ORDER_CHANGED "contacts.setting.display_order"
 #define CTSVC_SETTING_SORTING_ORDER_CHANGED "contacts.setting.sorting_order"
 
index ebd860f..025bc5a 100644 (file)
@@ -54,6 +54,7 @@ extern ctsvc_record_plugin_cb_s extension_plugin_cbs;
 #ifdef ENABLE_LOG_FEATURE
 extern ctsvc_record_plugin_cb_s phonelog_plugin_cbs;
 #endif /* ENABLE_LOG_FEATURE */
+extern ctsvc_record_plugin_cb_s sip_plugin_cbs;
 
 static const ctsvc_record_plugin_cb_s *__ctsvc_record_get_plugin_cb(int r_type)
 {
@@ -116,6 +117,8 @@ static const ctsvc_record_plugin_cb_s *__ctsvc_record_get_plugin_cb(int r_type)
                return &updated_info_plugin_cbs;
        case CTSVC_RECORD_RESULT:
                return &result_plugin_cbs;
+       case CTSVC_RECORD_SIP:
+               return &sip_plugin_cbs;
        default:
                return NULL;
        }
index f85503f..9b5affd 100644 (file)
@@ -222,6 +222,15 @@ static int __ctsvc_url_get_str_p(contacts_record_h record, unsigned int property
 static int __ctsvc_url_set_int(contacts_record_h record, unsigned int property_id, int value, bool *is_dirty);
 static int __ctsvc_url_set_str(contacts_record_h record, unsigned int property_id, const char *str, bool *is_dirty);
 
+static int __ctsvc_sip_create(contacts_record_h *out_record);
+static int __ctsvc_sip_destroy(contacts_record_h record, bool delete_child);
+static int __ctsvc_sip_clone(contacts_record_h record, contacts_record_h *out_record);
+static int __ctsvc_sip_get_int(contacts_record_h record, unsigned int property_id, int *out);
+static int __ctsvc_sip_get_str(contacts_record_h record, unsigned int property_id, char** out_str);
+static int __ctsvc_sip_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str);
+static int __ctsvc_sip_set_int(contacts_record_h record, unsigned int property_id, int value, bool *is_dirty);
+static int __ctsvc_sip_set_str(contacts_record_h record, unsigned int property_id, const char* str, bool *is_dirty);
+
 static GHashTable *__ctsvc_temp_image_file_hash_table = NULL;
 
 ctsvc_record_plugin_cb_s name_plugin_cbs = {
@@ -642,6 +651,29 @@ ctsvc_record_plugin_cb_s simple_contact_plugin_cbs = {
        .clone_child_record_list = NULL,
 };
 
+ctsvc_record_plugin_cb_s sip_plugin_cbs = {
+       .create = __ctsvc_sip_create,
+       .destroy = __ctsvc_sip_destroy,
+       .clone = __ctsvc_sip_clone,
+       .get_str = __ctsvc_sip_get_str,
+       .get_str_p = __ctsvc_sip_get_str_p,
+       .get_int = __ctsvc_sip_get_int,
+       .get_bool = NULL,
+       .get_lli = NULL,
+       .get_double = NULL,
+       .set_str = __ctsvc_sip_set_str,
+       .set_int = __ctsvc_sip_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;
@@ -848,6 +880,17 @@ static int __ctsvc_url_create(contacts_record_h *out_record)
        return CONTACTS_ERROR_NONE;
 }
 
+static int __ctsvc_sip_create(contacts_record_h *out_record)
+{
+       ctsvc_sip_s *sip;
+       sip = calloc(1, sizeof(ctsvc_sip_s));
+       RETVM_IF(NULL == sip, CONTACTS_ERROR_OUT_OF_MEMORY,
+                       "Out of memory : calloc is Fail");
+
+       *out_record = (contacts_record_h)sip;
+       return CONTACTS_ERROR_NONE;
+}
+
 static int __ctsvc_name_destroy(contacts_record_h record, bool delete_child)
 {
        ctsvc_name_s *name = (ctsvc_name_s*)record;
@@ -1163,6 +1206,19 @@ static int __ctsvc_simple_contact_destroy(contacts_record_h record, bool delete_
        return CONTACTS_ERROR_NONE;
 }
 
+static int __ctsvc_sip_destroy(contacts_record_h record, bool delete_child)
+{
+       ctsvc_sip_s *sip = (ctsvc_sip_s*)record;
+       sip->base.plugin_cbs = NULL; /* help to find double destroy bug (refer to the contacts_record_destroy) */
+       free(sip->base.properties_flags);
+
+       free(sip->address);
+       free(sip->label);
+       free(sip);
+
+       return CONTACTS_ERROR_NONE;
+}
+
 static int __ctsvc_contact_create(contacts_record_h *out_record)
 {
        ctsvc_contact_s *contact;
@@ -1247,6 +1303,11 @@ static int __ctsvc_contact_create(contacts_record_h *out_record)
                        break;
                contact->extensions->l_type = CTSVC_RECORD_EXTENSION;
 
+               contact->sips = calloc(1, sizeof(ctsvc_list_s));
+               if (NULL == contact->sips)
+                       break;
+               contact->sips->l_type = CTSVC_RECORD_SIP;
+
                *out_record = (contacts_record_h)contact;
                return CONTACTS_ERROR_NONE;
        } while (0);
@@ -1267,6 +1328,7 @@ static int __ctsvc_contact_create(contacts_record_h *out_record)
        free(contact->note);
        free(contact->company);
        free(contact->name);
+       free(contact->sips);
        free(contact);
        return CONTACTS_ERROR_OUT_OF_MEMORY;
 }
@@ -1318,6 +1380,8 @@ static int __ctsvc_contact_destroy(contacts_record_h record, bool delete_child)
        contacts_list_destroy((contacts_list_h)contact->images, delete_child);
 
        contacts_list_destroy((contacts_list_h)contact->extensions, delete_child);
+
+       contacts_list_destroy((contacts_list_h)contact->sips, delete_child);
        free(contact);
 
        return CONTACTS_ERROR_NONE;
@@ -1821,6 +1885,26 @@ static int __ctsvc_extension_get_int(contacts_record_h record, unsigned int prop
        return CONTACTS_ERROR_NONE;
 }
 
+static int __ctsvc_sip_get_int(contacts_record_h record, unsigned int property_id, int *out)
+{
+       ctsvc_sip_s *sip = (ctsvc_sip_s *)record;
+
+       switch(property_id) {
+       case CTSVC_PROPERTY_SIP_ID:
+               *out = sip->id;
+               break;
+       case CTSVC_PROPERTY_SIP_CONTACT_ID:
+               *out = sip->contact_id;
+               break;
+       case CTSVC_PROPERTY_SIP_TYPE:
+               *out = sip->type;
+               break;
+       default:
+               ERR("Invalid parameter : property_id(%d) is not supported in value(sip)", 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, bool *is_dirty)
 {
@@ -2363,6 +2447,34 @@ static int __ctsvc_extension_set_int(contacts_record_h record, unsigned int prop
        return CONTACTS_ERROR_NONE;
 }
 
+static int __ctsvc_sip_set_int(contacts_record_h record, unsigned int property_id, int value, bool *is_dirty)
+{
+       ctsvc_sip_s *sip = (ctsvc_sip_s *)record;
+
+       switch(property_id) {
+       case CTSVC_PROPERTY_SIP_ID:
+               CHECK_DIRTY_VAL(sip->id, value, is_dirty);
+               sip->id = value;
+               break;
+       case CTSVC_PROPERTY_SIP_CONTACT_ID:
+               RETVM_IF(0 < sip->id, CONTACTS_ERROR_INVALID_PARAMETER,
+                               "Invalid parameter : property_id(%d) is a read-only value (sip)", property_id);
+               CHECK_DIRTY_VAL(sip->contact_id, value, is_dirty);
+               sip->contact_id = value;
+               break;
+       case CTSVC_PROPERTY_SIP_TYPE:
+               RETVM_IF(value < CONTACTS_SIP_TYPE_OTHER,
+                               CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : sip type is in invalid range (%d)", value);
+               CHECK_DIRTY_VAL(sip->type, value, is_dirty);
+               sip->type = value;
+               break;
+       default:
+               ERR("Invalid parameter : property_id(0x%x) is not supported in value(sip)", 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;
@@ -2453,7 +2565,10 @@ static int __ctsvc_contact_get_record_list_p(contacts_record_h record,
        case CTSVC_PROPERTY_CONTACT_EXTENSION:
                *list = (contacts_list_h)contact->extensions;
                break;
-       default:
+       case CTSVC_PROPERTY_CONTACT_SIP:
+               *list = (contacts_list_h)contact->sips;
+               break;
+       default :
                ERR("property_id(%d) is not supported in value(contact)", property_id);
                return CONTACTS_ERROR_INVALID_PARAMETER;
        }
@@ -2573,7 +2688,10 @@ static int __ctsvc_contact_reset_child_record_id(contacts_record_h child_record)
        case CTSVC_RECORD_EXTENSION:
                ((ctsvc_extension_s*)record)->id = 0;
                break;
-       default:
+       case CTSVC_RECORD_SIP:
+               ((ctsvc_sip_s *)record)->id = 0;
+               break;
+       default :
                ERR("record(%d) is not child of contact", record->r_type);
                return CONTACTS_ERROR_INVALID_PARAMETER;
        }
@@ -2617,7 +2735,9 @@ static int __ctsvc_contact_get_child_record_id(contacts_record_h child_record)
                return ((ctsvc_image_s*)record)->id;
        case CTSVC_RECORD_EXTENSION:
                return ((ctsvc_extension_s*)record)->id;
-       default:
+       case CTSVC_RECORD_SIP:
+               return ((ctsvc_sip_s *)record)->id;
+       default :
                ERR("record(%d) is not child of contact", record->r_type);
                return 0;
        }
@@ -3281,6 +3401,34 @@ static int __ctsvc_extension_get_str(contacts_record_h record, unsigned int prop
        return __ctsvc_extension_get_str_real(record, property_id, out_str, true);
 }
 
+static int __ctsvc_sip_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy)
+{
+       ctsvc_sip_s *sip = (ctsvc_sip_s *)record;
+
+       switch(property_id) {
+       case CTSVC_PROPERTY_SIP_ADDRESS:
+               *out_str = GET_STR(copy, sip->address);
+               break;
+       case CTSVC_PROPERTY_SIP_LABEL:
+               *out_str = GET_STR(copy, sip->label);
+               break;
+       default :
+               ERR("Invalid parameter : property_id(%d) is not supported in value(sip)", property_id);
+               return CONTACTS_ERROR_INVALID_PARAMETER;
+       }
+       return CONTACTS_ERROR_NONE;
+}
+
+static int __ctsvc_sip_get_str_p(contacts_record_h record, unsigned int property_id, char** out_str)
+{
+       return __ctsvc_sip_get_str_real(record, property_id, out_str, false);
+}
+
+static int __ctsvc_sip_get_str(contacts_record_h record, unsigned int property_id, char** out_str)
+{
+       return __ctsvc_sip_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, bool *is_dirty)
 {
@@ -3849,6 +3997,26 @@ static int __ctsvc_extension_set_str(contacts_record_h record, unsigned int prop
        return CONTACTS_ERROR_NONE;
 }
 
+static int __ctsvc_sip_set_str(contacts_record_h record, unsigned int property_id, const char* str, bool *is_dirty )
+{
+       ctsvc_sip_s *sip = (ctsvc_sip_s *)record;
+
+       switch(property_id) {
+       case CTSVC_PROPERTY_SIP_ADDRESS:
+               CHECK_DIRTY_STR(sip->address, str, is_dirty);
+               FREEandSTRDUP(sip->address, str);
+               break;
+       case CTSVC_PROPERTY_SIP_LABEL:
+               CHECK_DIRTY_STR(sip->label, str, is_dirty);
+               FREEandSTRDUP(sip->label, str);
+               break;
+       default :
+               ERR("Invalid parameter : property_id(%d) is not supported in value(sip)", 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;
@@ -4147,6 +4315,9 @@ static int __ctsvc_contact_clone(contacts_record_h record, contacts_record_h *ou
        ctsvc_list_clone((contacts_list_h)src_data->extensions, (contacts_list_h*)&out_data->extensions);
        out_data->extensions->l_type = CTSVC_RECORD_EXTENSION;
 
+       ctsvc_list_clone((contacts_list_h)src_data->sips, (contacts_list_h*)&out_data->sips);
+       out_data->sips->l_type = CTSVC_RECORD_SIP;
+
        int ret = ctsvc_record_copy_base(&(out_data->base), &(src_data->base));
        if (CONTACTS_ERROR_NONE != ret) {
                ERR("ctsvc_record_copy_base() Fail");
@@ -4694,3 +4865,29 @@ static int __ctsvc_url_clone(contacts_record_h record, contacts_record_h *out_re
        return CONTACTS_ERROR_NONE;
 }
 
+static int __ctsvc_sip_clone(contacts_record_h record, contacts_record_h *out_record)
+{
+       ctsvc_sip_s *out_data = NULL;
+       ctsvc_sip_s *src_data = NULL;
+
+       src_data = (ctsvc_sip_s*)record;
+       out_data = calloc(1, sizeof(ctsvc_sip_s));
+       RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY,
+                       "Out of memeory : calloc(ctsvc_sip_s) Fail(%d)", CONTACTS_ERROR_OUT_OF_MEMORY);
+
+       out_data->id = src_data->id;
+       out_data->contact_id = src_data->contact_id;
+       out_data->address = SAFE_STRDUP(src_data->address);
+       out_data->type = src_data->type;
+       out_data->label = SAFE_STRDUP(src_data->label);
+
+       int ret = ctsvc_record_copy_base(&(out_data->base), &(src_data->base));
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("ctsvc_record_copy_base() Fail");
+               __ctsvc_sip_destroy((contacts_record_h)out_data, true);
+               return ret;
+       }
+
+       *out_record = (contacts_record_h)out_data;
+       return CONTACTS_ERROR_NONE;
+}
index ad9a21f..12cc361 100644 (file)
@@ -138,6 +138,11 @@ static int __ctsvc_my_profile_create(contacts_record_h *out_record)
                        break;
                my_profile->extensions->l_type = CTSVC_RECORD_EXTENSION;
 
+               my_profile->sips = calloc(1, sizeof(ctsvc_list_s));
+               if (NULL == my_profile->sips)
+                       break;
+               my_profile->sips->l_type = CTSVC_RECORD_SIP;
+
                *out_record = (contacts_record_h)my_profile;
                return CONTACTS_ERROR_NONE;
        } while (0);
@@ -335,7 +340,10 @@ static int __ctsvc_my_profile_get_record_list_p(contacts_record_h record,
        case CTSVC_PROPERTY_MY_PROFILE_EXTENSION:
                *list = (contacts_list_h)contact->extensions;
                break;
-       default:
+       case CTSVC_PROPERTY_MY_PROFILE_SIP:
+               *list = (contacts_list_h)contact->sips;
+               break;
+       default :
                ERR("property_id(%d) is not supported in value(contact)", property_id);
                return CONTACTS_ERROR_INVALID_PARAMETER;
        }
@@ -454,7 +462,10 @@ static int __ctsvc_my_profile_reset_child_record_id(contacts_record_h child_reco
        case CTSVC_RECORD_EXTENSION:
                ((ctsvc_extension_s*)record)->id = 0;
                break;
-       default:
+       case CTSVC_RECORD_SIP:
+               ((ctsvc_sip_s *)record)->id = 0;
+               break;
+       default :
                ERR("record(%d) is not child of contact", record->r_type);
                return CONTACTS_ERROR_INVALID_PARAMETER;
        }
@@ -529,7 +540,9 @@ static int __ctsvc_my_profile_get_child_record_id(contacts_record_h child_record
                return ((ctsvc_image_s*)record)->id;
        case CTSVC_RECORD_EXTENSION:
                return ((ctsvc_extension_s*)record)->id;
-       default:
+       case CTSVC_RECORD_SIP:
+               return ((ctsvc_sip_s *)record)->id;
+       default :
                ERR("record(%d) is not child of contact", record->r_type);
                return 0;
        }
@@ -640,6 +653,9 @@ static int __ctsvc_my_profile_clone(contacts_record_h record,
        ctsvc_list_clone((contacts_list_h)src_data->extensions, (contacts_list_h*)&out_data->extensions);
        out_data->extensions->l_type = CTSVC_RECORD_EXTENSION;
 
+       ctsvc_list_clone((contacts_list_h)src_data->sips, (contacts_list_h*)&out_data->sips);
+       out_data->sips->l_type = CTSVC_RECORD_SIP;
+
        int ret = ctsvc_record_copy_base(&(out_data->base), &(src_data->base));
        if (CONTACTS_ERROR_NONE != ret) {
                ERR("ctsvc_record_copy_base() Fail");
index 03d9b68..508f1ef 100644 (file)
@@ -73,6 +73,7 @@ enum {
        CTSVC_DATA_RELATIONSHIP = 11,
        CTSVC_DATA_NOTE = 12,
        CTSVC_DATA_IMAGE = 13,
+       CTSVC_DATA_SIP = 14,
        CTSVC_DATA_EXTENSION = 100
 };
 
@@ -114,6 +115,7 @@ typedef enum {
        CTSVC_RECORD_SPEEDDIAL,
        CTSVC_RECORD_SDN,
        CTSVC_RECORD_RESULT,
+       CTSVC_RECORD_SIP,
 } ctsvc_record_type_e;
 
 typedef enum {
@@ -542,6 +544,7 @@ typedef struct {
        ctsvc_list_s *relationships;
        ctsvc_list_s *images;
        ctsvc_list_s *extensions;
+       ctsvc_list_s *sips;
 } ctsvc_contact_s;
 
 typedef struct {
@@ -567,9 +570,9 @@ typedef struct {
        ctsvc_list_s *relationships;
        ctsvc_list_s *images;
        ctsvc_list_s *extensions;
+       ctsvc_list_s *sips;
 } ctsvc_my_profile_s;
 
-
 typedef struct {
        ctsvc_record_s base;
        int id;
@@ -602,6 +605,15 @@ typedef struct {
 } ctsvc_speeddial_s;
 
 typedef struct {
+       ctsvc_record_s base;
+       int id;
+       int contact_id;
+       char *address;
+       int type;
+       char *label;
+}ctsvc_sip_s;
+
+typedef struct {
        int property_id;
        int type;
        union {
index 255ad48..cd17186 100644 (file)
@@ -93,6 +93,7 @@ API const _contacts_contact_property_ids _contacts_contact = {
        .image                                  = CTSVC_PROPERTY_CONTACT_IMAGE,
        .group_relation                 = CTSVC_PROPERTY_CONTACT_GROUP_RELATION,
        .extension                              = CTSVC_PROPERTY_CONTACT_EXTENSION,
+       .sip                                    = CTSVC_PROPERTY_CONTACT_SIP,
 };
 
 API const _contacts_my_profile_property_ids _contacts_my_profile = {
@@ -117,6 +118,7 @@ API const _contacts_my_profile_property_ids _contacts_my_profile = {
        .relationship                   = CTSVC_PROPERTY_MY_PROFILE_RELATIONSHIP,
        .image                                  = CTSVC_PROPERTY_MY_PROFILE_IMAGE,
        .extension                              = CTSVC_PROPERTY_MY_PROFILE_EXTENSION,
+       .sip                                    = CTSVC_PROPERTY_MY_PROFILE_SIP,
 };
 
 API const _contacts_simple_contact_property_ids _contacts_simple_contact = {
@@ -644,6 +646,15 @@ API const _contacts_contact_activity_property_ids _contacts_contact_activity = {
        .account_id             = CTSVC_PROPERTY_ADDRESSBOOK_ACCOUNT_ID,
 };
 
+API const _contacts_sip_property_ids _contacts_sip= {
+       ._uri           = CTSVC_VIEW_URI_SIP,
+       .id         = CTSVC_PROPERTY_SIP_ID,
+       .contact_id     = CTSVC_PROPERTY_SIP_CONTACT_ID,
+       .address    = CTSVC_PROPERTY_SIP_ADDRESS,
+       .type           = CTSVC_PROPERTY_SIP_TYPE,
+       .label          = CTSVC_PROPERTY_SIP_LABEL,
+};
+
 #ifdef ENABLE_LOG_FEATURE
 API const _contacts_phone_log_stat_property_ids _contacts_phone_log_stat = {
        ._uri           = CTSVC_VIEW_URI_READ_ONLY_PHONELOG_STAT,
@@ -888,6 +899,14 @@ const property_info_s __property_extension[] = {
        {CTSVC_PROPERTY_EXTENSION_DATA12,               CTSVC_SEARCH_PROPERTY_ALL,      "data12"},
 };
 
+const property_info_s __property_sip[] = {
+       {CTSVC_PROPERTY_SIP_ID,             CTSVC_SEARCH_PROPERTY_ALL,  "id"},
+       {CTSVC_PROPERTY_SIP_CONTACT_ID,     CTSVC_SEARCH_PROPERTY_ALL,  "contact_id"},
+       {CTSVC_PROPERTY_SIP_ADDRESS,        CTSVC_SEARCH_PROPERTY_ALL,  "data1"},
+       {CTSVC_PROPERTY_SIP_TYPE,                       CTSVC_SEARCH_PROPERTY_ALL,      "data2"},
+       {CTSVC_PROPERTY_SIP_LABEL,          CTSVC_SEARCH_PROPERTY_ALL,  "data3"},
+};
+
 const property_info_s __property_contact[] = {
        {CTSVC_PROPERTY_CONTACT_ID,                                     CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
        {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME,           CTSVC_SEARCH_PROPERTY_ALL,      NULL},        /* dispaly_name, reverse_display_name */
@@ -919,6 +938,7 @@ const property_info_s __property_contact[] = {
        {CTSVC_PROPERTY_CONTACT_IMAGE,                          CTSVC_SEARCH_PROPERTY_NONE, (void*)__property_image},
        {CTSVC_PROPERTY_CONTACT_GROUP_RELATION,         CTSVC_SEARCH_PROPERTY_NONE, (void*)__property_group_relation},
        {CTSVC_PROPERTY_CONTACT_EXTENSION,                      CTSVC_SEARCH_PROPERTY_NONE, (void*)__property_extension},
+       {CTSVC_PROPERTY_CONTACT_SIP,                            CTSVC_SEARCH_PROPERTY_NONE, (void*)__property_sip},
 };
 
 const property_info_s __property_my_profile[] = {
@@ -942,6 +962,7 @@ const property_info_s __property_my_profile[] = {
        {CTSVC_PROPERTY_MY_PROFILE_RELATIONSHIP,                CTSVC_SEARCH_PROPERTY_NONE, (void*)__property_relationship},
        {CTSVC_PROPERTY_MY_PROFILE_IMAGE,                               CTSVC_SEARCH_PROPERTY_NONE, (void*)__property_image},
        {CTSVC_PROPERTY_MY_PROFILE_EXTENSION,                   CTSVC_SEARCH_PROPERTY_NONE, (void*)__property_extension},
+       {CTSVC_PROPERTY_MY_PROFILE_SIP,                                 CTSVC_SEARCH_PROPERTY_NONE, (void*)__property_sip},
 };
 
 const property_info_s __property_speeddial[] = {   /* _contacts_speeddial */
@@ -1259,7 +1280,8 @@ static const view_uri_info_s __tables[] = {
        {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_EXTENSION,              CTSVC_RECORD_EXTENSION,                 PTR_COUNT(__property_extension)},
+       {CTSVC_VIEW_URI_SIP,                    CTSVC_RECORD_SIP,                               PTR_COUNT(__property_sip)},
 
        {CTSVC_VIEW_URI_GROUPS_UPDATED_INFO,  CTSVC_RECORD_UPDATED_INFO, NULL, 0},
        {CTSVC_VIEW_URI_GROUPS_MEMBER_UPDATED_INFO,  CTSVC_RECORD_UPDATED_INFO, NULL, 0},
index 6e61540..f3a1546 100644 (file)
@@ -53,6 +53,7 @@
 #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_SIP "tizen.contacts_view.sip"
 
 #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"
@@ -130,6 +131,7 @@ typedef enum
 #define CTSVC_PROPERTY_EXTENSION 0x01F00000
 #define CTSVC_PROPERTY_MY_PROFILE 0x02000000
 #define CTSVC_PROPERTY_ACTIVITY_PHOTO 0x02100000
+#define CTSVC_PROPERTY_SIP 0x02200000
 
 #define CTSVC_PROPERTY_CHECK(property_id,data_type) \
        ((property_id & CTSVC_PROPERTY_MASK) == data_type ? true : false)
@@ -213,6 +215,7 @@ typedef enum {
        CTSVC_PROPERTY_CONTACT_EXTENSION = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +27,
        CTSVC_PROPERTY_CONTACT_LINK_MODE = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_INT) +28,
        CTSVC_PROPERTY_CONTACT_MESSAGE_ALERT = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_STR) +29,
+       CTSVC_PROPERTY_CONTACT_SIP = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +30,
 
        /* my_profile */
        CTSVC_PROPERTY_MY_PROFILE_ID = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY),
@@ -235,6 +238,7 @@ typedef enum {
        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,
+       CTSVC_PROPERTY_MY_PROFILE_SIP = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +20,
 
        /* contact_name */
        CTSVC_PROPERTY_NAME_ID = (CTSVC_PROPERTY_NAME | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY),
@@ -456,6 +460,13 @@ typedef enum {
        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,
 
+       /* contact sip */
+       CTSVC_PROPERTY_SIP_ID = (CTSVC_PROPERTY_SIP | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY),
+       CTSVC_PROPERTY_SIP_CONTACT_ID = (CTSVC_PROPERTY_SIP | CTSVC_VIEW_DATA_TYPE_INT) +1,
+       CTSVC_PROPERTY_SIP_ADDRESS = (CTSVC_PROPERTY_SIP | CTSVC_VIEW_DATA_TYPE_STR) +2,
+       CTSVC_PROPERTY_SIP_TYPE = (CTSVC_PROPERTY_SIP | CTSVC_VIEW_DATA_TYPE_INT) +3,
+       CTSVC_PROPERTY_SIP_LABEL = (CTSVC_PROPERTY_SIP | CTSVC_VIEW_DATA_TYPE_STR) +4,
+
 } ctsvc_property_ids_e;
 
 void ctsvc_view_uri_init();
index 09b2d47..5f529e6 100644 (file)
@@ -106,6 +106,8 @@ static int __ctsvc_ipc_unmarshal_contact(pims_ipc_data_h ipc_data,
                        break;
                if (ctsvc_ipc_unmarshal_child_list(ipc_data, (contacts_list_h*)&pcontact->extensions) != CONTACTS_ERROR_NONE)
                        break;
+               if (ctsvc_ipc_unmarshal_child_list(ipc_data, (contacts_list_h*)&pcontact->sips) != CONTACTS_ERROR_NONE)
+                       break;
 
                return CONTACTS_ERROR_NONE;
        } while (0);
@@ -200,6 +202,8 @@ static int __ctsvc_ipc_marshal_contact(const contacts_record_h record,
                        break;
                if (ctsvc_ipc_marshal_list((contacts_list_h)pcontact->extensions, ipc_data) != CONTACTS_ERROR_NONE)
                        break;
+               if (ctsvc_ipc_marshal_list((contacts_list_h)pcontact->sips, ipc_data) != CONTACTS_ERROR_NONE)
+                       break;
 
                return CONTACTS_ERROR_NONE;
        } while (0);
index a6254fa..fb6a1de 100644 (file)
@@ -58,6 +58,7 @@ 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;
+extern ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_sip_plugin_cb;
 
 static ctsvc_ipc_marshal_record_plugin_cb_s* __ctsvc_ipc_marshal_get_plugin_cb(ctsvc_record_type_e type);
 
@@ -129,6 +130,8 @@ static ctsvc_ipc_marshal_record_plugin_cb_s* __ctsvc_ipc_marshal_get_plugin_cb(c
                return (&_ctsvc_ipc_record_image_plugin_cb);
        case CTSVC_RECORD_EXTENSION:
                return (&_ctsvc_ipc_record_extension_plugin_cb);
+       case CTSVC_RECORD_SIP:
+               return (&_ctsvc_ipc_record_sip_plugin_cb);
        default:
                ASSERT_NOT_REACHED("Unimplemented IPC module (%d)", type);
                return NULL;
diff --git a/common/ipc/ctsvc_ipc_sip.c b/common/ipc/ctsvc_ipc_sip.c
new file mode 100644 (file)
index 0000000..78b73fc
--- /dev/null
@@ -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.
+ *
+ */
+
+#include "ctsvc_internal.h"
+#include "ctsvc_ipc_marshal.h"
+#include "contacts_record.h"
+
+static int __ctsvc_ipc_unmarshal_sip(pims_ipc_data_h ipc_data, const char* view_uri, contacts_record_h record);
+static int __ctsvc_ipc_marshal_sip(const contacts_record_h record, pims_ipc_data_h ipc_data);
+
+ctsvc_ipc_marshal_record_plugin_cb_s _ctsvc_ipc_record_sip_plugin_cb = {
+       .unmarshal_record = __ctsvc_ipc_unmarshal_sip,
+       .marshal_record = __ctsvc_ipc_marshal_sip
+};
+
+
+static int __ctsvc_ipc_unmarshal_sip(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_sip_s* sip_p = (ctsvc_sip_s*) record;
+
+       do {
+               if (ctsvc_ipc_unmarshal_int(ipc_data, &sip_p->id) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_unmarshal_int(ipc_data, &sip_p->contact_id) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_unmarshal_string(ipc_data, &sip_p->address) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_unmarshal_int(ipc_data, &sip_p->type) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_unmarshal_string(ipc_data, &sip_p->label) != CONTACTS_ERROR_NONE) break;
+
+               return CONTACTS_ERROR_NONE;
+       } while (0);
+
+       ERR("_ctsvc_ipc_unmarshal fail");
+       return CONTACTS_ERROR_INVALID_PARAMETER;
+}
+
+static int __ctsvc_ipc_marshal_sip(const contacts_record_h record, pims_ipc_data_h ipc_data)
+{
+       ctsvc_sip_s* sip_p = (ctsvc_sip_s*)record;
+       RETV_IF(ipc_data==NULL,CONTACTS_ERROR_NO_DATA);
+       RETV_IF(sip_p==NULL,CONTACTS_ERROR_NO_DATA);
+
+       do {
+               if (ctsvc_ipc_marshal_int((sip_p->id),ipc_data) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_marshal_int((sip_p->contact_id),ipc_data) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_marshal_string((sip_p->address),ipc_data) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_marshal_int((sip_p->type),ipc_data) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_marshal_string((sip_p->label),ipc_data) != CONTACTS_ERROR_NONE) break;
+
+               return CONTACTS_ERROR_NONE;
+       } while (0);
+
+       ERR("_ctsvc_ipc_marshal fail");
+       return CONTACTS_ERROR_INVALID_PARAMETER;
+}
index 59c7893..eafe975 100644 (file)
@@ -341,6 +341,19 @@ typedef enum {
 }contacts_search_range_e;
 
 /**
+ * @brief Enumeration for SIP(Session Intialion Protocol) type range
+ *
+ * @since_tizen 3.0
+ *
+ */
+typedef enum {
+       CONTACTS_SIP_TYPE_OTHER,            /**< Other sip type */
+       CONTACTS_SIP_TYPE_CUSTOM,           /**< Custom sip type */
+       CONTACTS_SIP_TYPE_HOME,             /**< Home sip type */
+       CONTACTS_SIP_TYPE_WORK,             /**< Work sip type */
+}contacts_sip_type_e;
+
+/**
  * @}
  */
 
index 90289da..4dac44f 100644 (file)
@@ -291,6 +291,7 @@ _CONTACTS_END_READ_ONLY_VIEW(_contacts_simple_contact)
  * <tr><td>record</td><td>relationship</td><td>read, write</td><td> _contacts_relationship child record (multiple)</td></tr>
  * <tr><td>record</td><td>image</td><td>read, write</td><td> _contacts_image child record (multiple)</td></tr>
  * <tr><td>record</td><td>group_relation</td><td>read, write</td><td> _contacts_group_relation child record (multiple)</td></tr>
+ * <tr><td>record</td><td>sip</td><td>read, write</td><td> _contacts_sip child record (multiple) </td></tr>
  * </table>
  */
 _CONTACTS_BEGIN_VIEW()
@@ -323,6 +324,7 @@ _CONTACTS_BEGIN_VIEW()
     _CONTACTS_PROPERTY_CHILD_MULTIPLE(relationship)   /* read, write */
     _CONTACTS_PROPERTY_CHILD_MULTIPLE(group_relation) /* read, write */
     _CONTACTS_PROPERTY_CHILD_MULTIPLE(extension)      /* read, write */
+    _CONTACTS_PROPERTY_CHILD_MULTIPLE(sip)            /* read, write (Since 3.0) */
     _CONTACTS_PROPERTY_STR(message_alert)             /* read, write */
 _CONTACTS_END_VIEW(_contacts_contact)
 
@@ -356,6 +358,7 @@ _CONTACTS_END_VIEW(_contacts_contact)
  * <tr><td>record</td><td>profile</td><td>read, write</td><td> _contacts_profile child record (multiple) </td></tr>
  * <tr><td>record</td><td>relationship</td><td>read, write</td><td> _contacts_relationship child record (multiple) </td></tr>
  * <tr><td>record</td><td>image</td><td>read, write</td><td> _contacts_image child record (multiple) </td></tr>
+ * <tr><td>record</td><td>sip</td><td>read, write</td><td> _contacts_sip child record (multiple) </td></tr>
  * </table>
  */
 _CONTACTS_BEGIN_VIEW()
@@ -379,6 +382,7 @@ _CONTACTS_BEGIN_VIEW()
     _CONTACTS_PROPERTY_CHILD_MULTIPLE(profile)        /* read, write */
     _CONTACTS_PROPERTY_CHILD_MULTIPLE(relationship)   /* read, write */
     _CONTACTS_PROPERTY_CHILD_MULTIPLE(extension)      /* read, write */
+    _CONTACTS_PROPERTY_CHILD_MULTIPLE(sip)            /* read, write (Since 3.0) */
 _CONTACTS_END_VIEW(_contacts_my_profile)
 
 
@@ -1689,6 +1693,32 @@ _CONTACTS_BEGIN_READ_ONLY_VIEW()
     _CONTACTS_PROPERTY_INT(log_type)
 _CONTACTS_END_READ_ONLY_VIEW(_contacts_phone_log_stat)
 
+/**
+ * @addtogroup CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE View/Property
+ * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_sip _contacts_sip view
+ * <table>
+ * <tr>
+ *    <th>Type</th>
+ *    <th>Property ID</th>
+ *    <th>Read, Write</th>
+ *    <th>Description</th>
+ * </tr>
+ * <tr><td>string</td><td>_uri</td><td>read only</td><td> Identifier of this contacts sip view </td></tr>
+ * <tr><td>integer</td><td> id </td><td>read only</td><td> DB record ID of the sip </td></tr>
+ * <tr><td>integer</td><td> contact_id </td><td>read, write once</td><td> Contact ID that the sip belongs to </td></tr>
+ * <tr><td>string/td><td> address </td><td>read, write</td><td> SIP address </td></tr>
+ * <tr><td>integer</td><td> type </td><td>read, write</td><td> sip type, refer to the @ref contacts_sip_type_e </td></tr>
+ * <tr><td>string</td><td> label </td><td>read, write</td><td> Custom sip type label, when the sip type is #CONTACTS_SIP_TYPE_CUSTOM </td></tr>
+ * </table>
+ */
+_CONTACTS_BEGIN_VIEW()                        /* (Since 3.0) */
+    _CONTACTS_PROPERTY_INT(id)                /* read only */
+    _CONTACTS_PROPERTY_INT(contact_id)        /* read, write once */
+    _CONTACTS_PROPERTY_STR(address)           /* read, write */
+    _CONTACTS_PROPERTY_INT(type)              /* read, write */
+    _CONTACTS_PROPERTY_STR(label)             /* read, write */
+_CONTACTS_END_VIEW(_contacts_sip)
+
 #ifdef __cplusplus
 }
 #endif
index 1105104..6ca63db 100644 (file)
@@ -37,6 +37,7 @@ SET(SRCS
        ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_image.c
        ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_sdn.c
        ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_speeddial.c
+       ${CMAKE_SOURCE_DIR}/common/ipc/ctsvc_ipc_sip.c
 
        ${CMAKE_SOURCE_DIR}/common/ctsvc_filter.c
        ${CMAKE_SOURCE_DIR}/common/ctsvc_inotify.c
@@ -105,6 +106,8 @@ SET(SRCS
        db/ctsvc_db_plugin_url.c
        db/ctsvc_db_plugin_sdn.c
        db/ctsvc_db_plugin_speeddial.c
+       db/ctsvc_db_plugin_sip_helper.c
+       db/ctsvc_db_plugin_sip.c
        db/ctsvc_db_query.c
        db/ctsvc_db_sqlite.c
        db/ctsvc_db_utils.c
index c8b7ce9..513b831 100644 (file)
@@ -51,6 +51,7 @@ 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 TLS bool sip_change = false;
 
 void ctsvc_noti_publish_socket_initialize(void)
 {
@@ -286,6 +287,15 @@ static inline void __ctsvc_noti_publish_activity_photo_change(void)
        }
 }
 
+static inline void __ctsvc_noti_publish_sip_change(void)
+{
+       int fd = open(CTSVC_NOTI_SIP_CHANGED, O_TRUNC | O_RDWR);
+       if (0 <= fd) {
+               close(fd);
+               sip_change = false;
+       }
+}
+
 void ctsvc_nofitication_cancel(void)
 {
        contact_change = false;
@@ -313,6 +323,7 @@ void ctsvc_nofitication_cancel(void)
        image_change = false;
        profile_change = false;
        company_change = false;
+       sip_change = false;
 }
 
 void ctsvc_set_contact_noti(void)
@@ -440,6 +451,11 @@ void ctsvc_set_company_noti(void)
        company_change = true;
 }
 
+void ctsvc_set_sip_noti(void)
+{
+       sip_change = true;
+}
+
 void ctsvc_notification_send()
 {
        if (contact_change) __ctsvc_noti_publish_contact_change();
@@ -467,6 +483,7 @@ void ctsvc_notification_send()
        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 (sip_change) __ctsvc_noti_publish_sip_change();
 }
 
 /*
@@ -529,6 +546,9 @@ void ctsvc_db_data_delete_callback(sqlite3_context  *context,
        case CTSVC_DATA_EXTENSION:
                ctsvc_set_data_noti();
                break;
+       case CTSVC_DATA_SIP:
+               ctsvc_set_sip_noti();
+               break;
        default:
                break;
        }
index 0736a92..9860bef 100644 (file)
@@ -47,6 +47,7 @@ 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_set_sip_noti(void);
 
 void ctsvc_notification_send(void);
 void ctsvc_nofitication_cancel(void);
index 8415e26..ae541bf 100644 (file)
@@ -240,6 +240,7 @@ int main(int argc, char *argv[])
        ctsvc_create_file_set_permission(CTSVC_NOTI_ACTIVITY_PHOTO_CHANGED, 0660);
        ctsvc_create_file_set_permission(CTSVC_NOTI_PHONELOG_CHANGED, 0660);
        ctsvc_create_file_set_permission(CTSVC_NOTI_SPEEDDIAL_CHANGED, 0660);
+       ctsvc_create_file_set_permission(CTSVC_NOTI_SIP_CHANGED, 0660);
 
        /* update DB for compatability */
        ctsvc_server_db_update();
index 6ff2c74..29466ca 100644 (file)
@@ -57,6 +57,7 @@ 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;
+extern ctsvc_db_plugin_info_s ctsvc_db_plugin_sip;
 
 
 #ifdef _CONTACTS_NATIVE
@@ -105,6 +106,7 @@ static const db_table_info_s __db_tables[] = {
        {CTSVC_VIEW_URI_MESSENGER,              CTSVC_DB_VIEW_MESSENGER, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
        {CTSVC_VIEW_URI_GROUP_RELATION, CTSVC_DB_VIEW_GROUP_RELATION, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
        {CTSVC_VIEW_URI_EXTENSION,              CTSVC_DB_VIEW_EXTENSION, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
+       {CTSVC_VIEW_URI_SIP,                    CTSVC_DB_VIEW_SIP, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
 
        /* Do not support get_all_records, get_records_with_query, get_count, get_count_with_query */
        /*
@@ -300,6 +302,8 @@ ctsvc_db_plugin_info_s *ctsvc_db_get_plugin_info(ctsvc_record_type_e type)
                return &ctsvc_db_plugin_speeddial;
        case CTSVC_RECORD_SDN:
                return &ctsvc_db_plugin_sdn;
+       case CTSVC_RECORD_SIP:
+               return &ctsvc_db_plugin_sip;
        case CTSVC_RECORD_UPDATED_INFO:
        case CTSVC_RECORD_RESULT:
        default:
@@ -901,6 +905,21 @@ static int __ctsvc_db_create_views()
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
+       /* CTSVC_DB_VIEW_SIP */
+       snprintf(query, sizeof(query),
+               "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_SIP" AS "
+                       "SELECT id, "
+                                       "data.contact_id, "
+                                       "data1 address, "
+                                       "data2 type, "
+                                       "data3 label "
+                       "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_SIP);
+       ret = ctsvc_query_exec(query);
+       RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Fail(%d)", ret);
+
        __ctsvc_db_view_already_created = true;
 
        return CONTACTS_ERROR_NONE;
index 3cfbd1c..da7852e 100644 (file)
@@ -186,6 +186,9 @@ static int __ctsvc_db_get_data(int id, ctsvc_contact_s *contact)
                case CTSVC_DATA_EXTENSION:
                        ctsvc_get_data_info_extension(stmt, (contacts_list_h)contact->extensions);
                        break;
+               case CTSVC_DATA_SIP:
+                       ctsvc_get_data_info_sip(stmt, (contacts_list_h)contact->sips);
+                       break;
                default:
                        ERR("Intenal : Not supported data type (%d)", datatype);
                        break;
@@ -396,6 +399,13 @@ static inline int __ctsvc_contact_update_data(ctsvc_contact_s *contact)
                }
        }
 
+       if (contact->sips) {
+               ret = ctsvc_contact_update_data_sip((contacts_list_h)contact->sips, contact->id, false);
+               if (CONTACTS_ERROR_NONE != ret) {
+                       ERR("ctsvc_contact_update_data_sips() Fail(%d)", ret);
+                       return ret;
+               }
+       }
        return CONTACTS_ERROR_NONE;
 }
 
@@ -1748,6 +1758,15 @@ static int __ctsvc_contact_insert_data(ctsvc_contact_s *contact)
                }
        }
 
+       /* Insert the sips */
+       if (contact->sips) {
+               ret = ctsvc_contact_insert_data_sip((contacts_list_h)contact->sips, contact->id, false);
+               if (CONTACTS_ERROR_NONE != ret) {
+                       ERR("ctsvc_insert_contact_data_sip() Fail(%d)", ret);
+                       return ret;
+               }
+       }
+
        return CONTACTS_ERROR_NONE;
 }
 
index b5c571f..8731a07 100644 (file)
@@ -51,6 +51,7 @@
 #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_sip_helper.h"
 
 #include "ctsvc_server_person.h"
 #include "ctsvc_server_group.h"
@@ -1459,6 +1460,16 @@ int ctsvc_get_data_info_extension(cts_stmt stmt, contacts_list_h list)
        return CONTACTS_ERROR_NONE;
 }
 
+int ctsvc_get_data_info_sip(cts_stmt stmt, contacts_list_h list)
+{
+       contacts_record_h record;
+
+       ctsvc_db_sip_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;
@@ -2130,6 +2141,48 @@ int ctsvc_contact_update_data_extension(contacts_list_h extension_list, int cont
        return ret;
 }
 
+int ctsvc_contact_update_data_sip(contacts_list_h sip_list, int contact_id, bool is_my_profile)
+{
+       CTS_FN_CALL;
+       int ret = CONTACTS_ERROR_NONE;
+       contacts_record_h record = NULL;
+       int count = 0;
+       ctsvc_list_s *list = (ctsvc_list_s*)sip_list;
+       ctsvc_sip_s *sip;
+       GList *cursor;
+
+       RETV_IF(NULL == sip_list, CONTACTS_ERROR_INVALID_PARAMETER);
+
+       for (cursor = list->deleted_records;cursor;cursor=cursor->next) {
+               sip = (ctsvc_sip_s *)cursor->data;
+               ctsvc_db_sip_delete(sip->id, is_my_profile);
+       }
+
+       ret = contacts_list_get_count(sip_list, &count);
+       if (0 == count)
+               return CONTACTS_ERROR_NONE;
+
+       contacts_list_first(sip_list);
+       do {
+               contacts_list_get_current_record_p(sip_list, &record);
+               sip = (ctsvc_sip_s*)record;
+               if (0 < sip->id) {
+                       if (sip->address)
+                               ret = ctsvc_db_sip_update(record, is_my_profile);
+                       else
+                               ret = ctsvc_db_sip_delete(sip->id, is_my_profile);
+               }
+               else
+                       ret = ctsvc_db_sip_insert(record, contact_id, is_my_profile, NULL);
+               if (CONTACTS_ERROR_DB == ret) {
+                       ERR("DB error : return (%d)", ret);
+                       break;
+               }
+       } while (CONTACTS_ERROR_NONE == contacts_list_next(sip_list));
+
+       return ret;
+}
+
 int ctsvc_contact_update_data_number(contacts_list_h number_list,
                int contact_id, bool is_my_profile, bool *had_phonenumber)
 {
@@ -2572,6 +2625,31 @@ int ctsvc_contact_insert_data_extension(contacts_list_h extension_list, int cont
        return ret;
 }
 
+int ctsvc_contact_insert_data_sip(contacts_list_h sip_list, int contact_id, bool is_my_profile)
+{
+       CTS_FN_CALL;
+       int ret = CONTACTS_ERROR_NONE;
+       contacts_record_h record;
+       int count = 0;
+
+       RETV_IF(NULL == sip_list, CONTACTS_ERROR_INVALID_PARAMETER);
+       ret = contacts_list_get_count(sip_list, &count);
+       if (0 == count)
+               return CONTACTS_ERROR_NONE;
+
+       contacts_list_first(sip_list);
+       do {
+               contacts_list_get_current_record_p(sip_list, &record);
+               ret = ctsvc_db_sip_insert(record, contact_id, is_my_profile, NULL);
+               if (CONTACTS_ERROR_DB == ret) {
+                       ERR("DB error : ctsvc_db_sip_insert");
+                       break;
+               }
+       } while (CONTACTS_ERROR_NONE == contacts_list_next(sip_list));
+
+       return ret;
+}
+
 int ctsvc_contact_update_display_name(int contact_id, contacts_display_name_source_type_e changed_record_type)
 {
        int ret = CONTACTS_ERROR_NONE;
index 1f6ab03..de10ba7 100644 (file)
@@ -53,6 +53,7 @@ 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);
+int ctsvc_get_data_info_sip(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);
@@ -88,6 +89,8 @@ 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_update_data_sip(contacts_list_h sip_list, int contact_id,
+               bool is_my_profile);
 
 int ctsvc_contact_insert_data_name(contacts_list_h name_list, int contact_id,
                bool is_my_profile);
@@ -117,5 +120,7 @@ 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);
+int ctsvc_contact_insert_data_sip(contacts_list_h sip_list, int contact_id,
+               bool is_my_profile);
 
 #endif /* __CTSVC_DB_PLUGIN_CONTACT_HELPER_H__ */
index 564a667..c8e5978 100644 (file)
@@ -155,6 +155,9 @@ static int __ctsvc_db_my_profile_get_data(int id, ctsvc_my_profile_s *my_profile
                case CTSVC_DATA_EXTENSION:
                        ctsvc_get_data_info_extension(stmt, (contacts_list_h)my_profile->extensions);
                        break;
+               case CTSVC_DATA_SIP:
+                       ctsvc_get_data_info_sip(stmt, (contacts_list_h)my_profile->sips);
+                       break;
                default:
                        ERR("Intenal : Not supported data type (%d)", datatype);
                        break;
diff --git a/server/db/ctsvc_db_plugin_sip.c b/server/db/ctsvc_db_plugin_sip.c
new file mode 100644 (file)
index 0000000..09b37f1
--- /dev/null
@@ -0,0 +1,395 @@
+/*
+ * Contacts Service
+ *
+ * Copyright (c) 2010 - 2015 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_db_schema.h"
+#include "ctsvc_db_sqlite.h"
+#include "ctsvc_db_utils.h"
+#include "ctsvc_db_init.h"
+#include "ctsvc_db_access_control.h"
+#include "ctsvc_db_plugin_sip_helper.h"
+#include "ctsvc_db_plugin_contact_helper.h"
+#include "ctsvc_record.h"
+#include "ctsvc_db_query.h"
+#include "ctsvc_list.h"
+#include "ctsvc_notification.h"
+
+static int __ctsvc_db_sip_insert_record(contacts_record_h record, int *id);
+static int __ctsvc_db_sip_get_record(int id, contacts_record_h* out_record);
+static int __ctsvc_db_sip_update_record(contacts_record_h record);
+static int __ctsvc_db_sip_delete_record(int id);
+static int __ctsvc_db_sip_get_all_records(int offset, int limit, contacts_list_h* out_list);
+static int __ctsvc_db_sip_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_sip = {
+       .is_query_only = false,
+       .insert_record = __ctsvc_db_sip_insert_record,
+       .get_record = __ctsvc_db_sip_get_record,
+       .update_record = __ctsvc_db_sip_update_record,
+       .delete_record = __ctsvc_db_sip_delete_record,
+       .get_all_records = __ctsvc_db_sip_get_all_records,
+       .get_records_with_query = __ctsvc_db_sip_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_sip_insert_record(contacts_record_h record, int *id)
+{
+       int ret;
+       int addressbook_id;
+       char query[CTS_SQL_MAX_LEN] = {0};
+       ctsvc_sip_s *sip = (ctsvc_sip_s *)record;
+
+       ret = ctsvc_begin_trans();
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("DB error : ctsvc_begin_trans() Fail(%d)", ret);
+               return ret;
+       }
+
+       snprintf(query, sizeof(query),
+                       "SELECT addressbook_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", sip->contact_id);
+       ret = ctsvc_query_get_first_int_result(query, &addressbook_id);
+       if (CONTACTS_ERROR_NONE != ret) {
+               ctsvc_end_trans(false);
+               if (CONTACTS_ERROR_NO_DATA == ret) {
+                       ERR("No data : contact_id (%d) is not exist", sip->contact_id);
+                       return CONTACTS_ERROR_INVALID_PARAMETER;
+               }
+               else {
+                       ERR("ctsvc_query_get_first_int_result Fail(%d)", ret);
+                       return ret;
+               }
+       }
+
+       if (false == ctsvc_have_ab_write_permission(addressbook_id)) {
+               ERR("Does not have permission to update this sip record : addresbook_id(%d)", addressbook_id);
+               ctsvc_end_trans(false);
+               return CONTACTS_ERROR_PERMISSION_DENIED;
+       }
+
+       ret = ctsvc_db_sip_insert(record, sip->contact_id, false, id);
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("DB error : ctsvc_begin_trans() Fail(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+
+       ret = ctsvc_db_contact_update_changed_time(sip->contact_id);
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("DB error : ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+       ctsvc_set_person_noti();
+
+       ret = ctsvc_end_trans(true);
+       if (ret < CONTACTS_ERROR_NONE) {
+               ERR("DB error : ctsvc_end_trans() Fail(%d)", ret);
+               return ret;
+       }
+       else
+               return CONTACTS_ERROR_NONE;
+}
+
+static int __ctsvc_db_sip_get_record(int id, contacts_record_h* out_record)
+{
+       int ret;
+       cts_stmt stmt = NULL;
+       char query[CTS_SQL_MAX_LEN] = {0};
+
+       RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER);
+       *out_record = NULL;
+
+       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_SIP);
+
+       ret = ctsvc_query_prepare(query, &stmt);
+       RETVM_IF(NULL == stmt, ret, "DB error : ctsvc_query_prepare() Fail(%d)", ret);
+
+       ret = ctsvc_stmt_step(stmt);
+       if (1 /*CTS_TRUE*/ != ret) {
+               ERR("ctsvc_stmt_step() Fail(%d)", ret);
+               ctsvc_stmt_finalize(stmt);
+               if (CONTACTS_ERROR_NONE == ret)
+                       return CONTACTS_ERROR_NO_DATA;
+               else
+                       return ret;
+       }
+
+       ctsvc_db_sip_get_value_from_stmt(stmt, out_record, 0);
+
+       ctsvc_stmt_finalize(stmt);
+
+       return CONTACTS_ERROR_NONE;
+}
+
+static int __ctsvc_db_sip_update_record(contacts_record_h record)
+{
+       int ret;
+       int addressbook_id;
+       char query[CTS_SQL_MAX_LEN] = {0};
+       ctsvc_sip_s *sip = (ctsvc_sip_s *)record;
+
+       ret = ctsvc_begin_trans();
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("DB error : ctsvc_begin_trans() Fail(%d)", ret);
+               return ret;
+       }
+
+       snprintf(query, sizeof(query),
+                       "SELECT addressbook_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", sip->contact_id);
+       ret = ctsvc_query_get_first_int_result(query, &addressbook_id);
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("No data : contact_id (%d) is not exist", sip->contact_id);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+
+       if (false == ctsvc_have_ab_write_permission(addressbook_id)) {
+               ERR("Does not have permission to update this sip record : addresbook_id(%d)", addressbook_id);
+               ctsvc_end_trans(false);
+               return CONTACTS_ERROR_PERMISSION_DENIED;
+       }
+
+       ret = ctsvc_db_sip_update(record, false);
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("update record Fail(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+
+       /* TODO ; contact display sip update */
+       ret = ctsvc_db_contact_update_changed_time(sip->contact_id);
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("DB error : ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+       ctsvc_set_person_noti();
+
+       ret = ctsvc_end_trans(true);
+       if (ret < CONTACTS_ERROR_NONE) {
+               ERR("DB error : ctsvc_end_trans() Fail(%d)", ret);
+               return ret;
+       }
+       else
+               return CONTACTS_ERROR_NONE;
+}
+
+static int __ctsvc_db_sip_delete_record(int id)
+{
+       int ret;
+       int contact_id;
+       char query[CTS_SQL_MAX_LEN] = {0};
+       cts_stmt stmt = NULL;
+       int addressbook_id;
+
+       ret = ctsvc_begin_trans();
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("DB error : ctsvc_begin_trans() Fail(%d)", ret);
+               return ret;
+       }
+
+       snprintf(query, sizeof(query),
+                       "SELECT contact_id, addressbook_id FROM "CTSVC_DB_VIEW_CONTACT" "
+                               "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id);
+       ret = ctsvc_query_prepare(query, &stmt);
+       if (NULL == stmt) {
+               ERR("DB error : ctsvc_query_prepare() Fail(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+       ret = ctsvc_stmt_step(stmt);
+       if (1 != ret) {
+               ERR("The id(%d) is Invalid(%d)", id, ret);
+               ctsvc_stmt_finalize(stmt);
+               ctsvc_end_trans(false);
+               if (CONTACTS_ERROR_NONE == ret)
+                       return CONTACTS_ERROR_NO_DATA;
+               else
+                       return ret;
+       }
+
+       contact_id = ctsvc_stmt_get_int(stmt, 0);
+       addressbook_id = ctsvc_stmt_get_int(stmt, 1);
+       ctsvc_stmt_finalize(stmt);
+
+       if (false == ctsvc_have_ab_write_permission(addressbook_id)) {
+               ERR("Does not have permission to delete this sip record : addresbook_id(%d)", addressbook_id);
+               ctsvc_end_trans(false);
+               return CONTACTS_ERROR_PERMISSION_DENIED;
+       }
+
+       ret = ctsvc_db_sip_delete(id, false);
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("DB error : ctsvc_begin_trans() Fail(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+
+       ret = ctsvc_db_contact_update_changed_time(contact_id);
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("DB error : ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+       ctsvc_set_person_noti();
+
+       ret = ctsvc_end_trans(true);
+       if (ret < CONTACTS_ERROR_NONE) {
+               ERR("DB error : ctsvc_end_trans() Fail(%d)", ret);
+               return ret;
+       }
+       else
+               return CONTACTS_ERROR_NONE;
+}
+
+static int __ctsvc_db_sip_get_all_records(int offset, int limit, contacts_list_h* out_list)
+{
+       int len;
+       int ret;
+       contacts_list_h list;
+       ctsvc_sip_s *sip;
+       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_SIP);
+
+       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);
+       }
+
+       ret = ctsvc_query_prepare(query, &stmt);
+       RETVM_IF(NULL == stmt, ret, "DB error : ctsvc_query_prepare() Fail(%d)", ret);
+
+       contacts_list_create(&list);
+       while ((ret = ctsvc_stmt_step(stmt))) {
+               if (1 /*CTS_TRUE */ != ret) {
+                       ERR("DB : ctsvc_stmt_step fail(%d)", ret);
+                       ctsvc_stmt_finalize(stmt);
+                       contacts_list_destroy(list, true);
+                       return ret;
+               }
+               ctsvc_db_sip_get_value_from_stmt(stmt, (contacts_record_h*)&sip, 0);
+               ctsvc_list_prepend(list, (contacts_record_h)sip);
+       }
+       ctsvc_stmt_finalize(stmt);
+       ctsvc_list_reverse(list);
+
+       *out_list = list;
+       return CONTACTS_ERROR_NONE;
+}
+
+static int __ctsvc_db_sip_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_sip_s *sip;
+
+       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 = ctsvc_stmt_step(stmt))) {
+               contacts_record_h record;
+               if (1 /*CTS_TRUE */ != ret) {
+                       ERR("DB error : ctsvc_stmt_step() Fail(%d)", ret);
+                       ctsvc_stmt_finalize(stmt);
+                       contacts_list_destroy(list, true);
+                       return ret;
+               }
+
+               contacts_record_create(_contacts_sip._uri, &record);
+               sip = (ctsvc_sip_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 Fail.\n");
+               }
+
+               for (i=0;i<field_count;i++) {
+                       char *temp;
+                       int property_id;
+                       if (0 == s_query->projection_count)
+                               property_id = s_query->properties[i].property_id;
+                       else
+                               property_id = s_query->projection[i];
+
+                       switch(property_id) {
+                       case CTSVC_PROPERTY_SIP_ID:
+                               sip->id = ctsvc_stmt_get_int(stmt, i);
+                               break;
+                       case CTSVC_PROPERTY_SIP_CONTACT_ID:
+                               sip->contact_id = ctsvc_stmt_get_int(stmt, i);
+                               break;
+                       case CTSVC_PROPERTY_SIP_ADDRESS:
+                               temp = ctsvc_stmt_get_text(stmt, i);
+                               free(sip->address);
+                               sip->address = SAFE_STRDUP(temp);
+                               break;
+                       case CTSVC_PROPERTY_SIP_TYPE:
+                               sip->type = ctsvc_stmt_get_int(stmt, i);
+                               break;
+                       case CTSVC_PROPERTY_SIP_LABEL:
+                               temp = ctsvc_stmt_get_text(stmt, i);
+                               free(sip->label);
+                               sip->label = SAFE_STRDUP(temp);
+                               break;
+                       default:
+                               break;
+                       }
+               }
+               ctsvc_list_prepend(list, record);
+       }
+       ctsvc_stmt_finalize(stmt);
+       ctsvc_list_reverse(list);
+
+       *out_list = list;
+       return CONTACTS_ERROR_NONE;
+}
diff --git a/server/db/ctsvc_db_plugin_sip_helper.c b/server/db/ctsvc_db_plugin_sip_helper.c
new file mode 100644 (file)
index 0000000..158962b
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ * Contacts Service
+ *
+ * Copyright (c) 2010 - 2015 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_db_schema.h"
+#include "ctsvc_db_sqlite.h"
+#include "ctsvc_db_init.h"
+#include "ctsvc_db_query.h"
+#include "ctsvc_db_plugin_sip_helper.h"
+#include "ctsvc_record.h"
+#include "ctsvc_notification.h"
+
+int ctsvc_db_sip_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_sip_s *sip = (ctsvc_sip_s *)record;
+
+       /* These check should be done in client side */
+       RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
+                               "Invalid parameter : contact_id(%d) is mandatory field to insert sip record", sip->contact_id);
+       RETVM_IF(0 < sip->id, CONTACTS_ERROR_INVALID_PARAMETER,
+                               "Invalid parameter : id(%d), This record is already inserted", sip->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_SIP, sip->type);
+       ret = ctsvc_query_prepare(query, &stmt);
+       RETVM_IF(NULL == stmt, ret, "DB error : ctsvc_query_prepare() Fail(%d)", ret);
+
+       if (sip->address)
+               ctsvc_stmt_bind_text(stmt, 1, sip->address);
+       if (sip->label)
+               ctsvc_stmt_bind_text(stmt, 2, sip->label);
+
+       ret = ctsvc_stmt_step(stmt);
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("DB error : ctsvc_stmt_step() Fail(%d)", ret);
+               ctsvc_stmt_finalize(stmt);
+               return ret;
+       }
+
+       /* sip->id = ctsvc_db_get_last_insert_id(); */
+       if (id)
+               *id = ctsvc_db_get_last_insert_id();
+
+       ctsvc_stmt_finalize(stmt);
+
+       if (false == is_my_profile)
+               ctsvc_set_sip_noti();
+
+       return CONTACTS_ERROR_NONE;
+}
+
+int ctsvc_db_sip_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count)
+{
+       int ret;
+       ctsvc_sip_s *sip;
+       char *temp;
+
+       ret = contacts_record_create(_contacts_sip._uri, (contacts_record_h *)&sip);
+       RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create Fail(%d)", ret);
+
+       sip->id = ctsvc_stmt_get_int(stmt, start_count++);
+       sip->contact_id = ctsvc_stmt_get_int(stmt, start_count++);
+       start_count++; // is_default
+       temp = ctsvc_stmt_get_text(stmt, start_count++);
+       sip->address = SAFE_STRDUP(temp);
+       sip->type = ctsvc_stmt_get_int(stmt, start_count++);
+       temp = ctsvc_stmt_get_text(stmt, start_count++);
+       sip->label = SAFE_STRDUP(temp);
+
+       *record = (contacts_record_h)sip;
+
+       return CONTACTS_ERROR_NONE;
+}
+
+int ctsvc_db_sip_update(contacts_record_h record, bool is_my_profile)
+{
+       int id;
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
+       ctsvc_sip_s *sip = (ctsvc_sip_s*)record;
+       char query[CTS_SQL_MAX_LEN] = {0};
+
+       RETVM_IF(0 == sip->id, CONTACTS_ERROR_INVALID_PARAMETER, "sip of contact has no ID.");
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (sip->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
+
+       snprintf(query, sizeof(query),
+                       "SELECT id FROM "CTS_TABLE_DATA" WHERE id = %d", sip->id);
+       ret = ctsvc_query_get_first_int_result(query, &id);
+       RETV_IF(ret != CONTACTS_ERROR_NONE, ret);
+
+       do {
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_DATA, sip->id))) break;
+               if (false == is_my_profile)
+                       ctsvc_set_sip_noti();
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       free(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       free(cursor->data);
+               g_slist_free(bind_text);
+       }
+
+       return ret;
+}
+
+int ctsvc_db_sip_delete(int id, bool is_my_profile)
+{
+       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_SIP);
+
+       ret = ctsvc_query_exec(query);
+       RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
+
+       if (false == is_my_profile)
+               ctsvc_set_sip_noti();
+
+       return CONTACTS_ERROR_NONE;
+}
+
diff --git a/server/db/ctsvc_db_plugin_sip_helper.h b/server/db/ctsvc_db_plugin_sip_helper.h
new file mode 100644 (file)
index 0000000..10ba4e2
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Contacts Service
+ *
+ * Copyright (c) 2010 - 2015 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_SIP_HELPER_H__
+#define __CTSVC_DB_PLUGIN_SIP_HELPER_H__
+
+#include "contacts.h"
+#include "ctsvc_db_sqlite.h"
+
+int ctsvc_db_sip_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id);
+int ctsvc_db_sip_update(contacts_record_h record, bool is_my_profile);
+int ctsvc_db_sip_delete(int id, bool is_my_profile);
+
+int ctsvc_db_sip_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count);
+
+#endif /* __CTSVC_DB_PLUGIN_SIP_HELPER_H__ */
index d2dda18..8a9d36a 100644 (file)
@@ -78,6 +78,7 @@
 #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_SIP "view_sip"
 
 #define CTSVC_DB_VIEW_ACTIVITY "view_activity"
 #define CTSVC_DB_VIEW_ACTIVITY_PHOTOS "view_activity_photos"