${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
|| 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;
}
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);
#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"
#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)
{
return &updated_info_plugin_cbs;
case CTSVC_RECORD_RESULT:
return &result_plugin_cbs;
+ case CTSVC_RECORD_SIP:
+ return &sip_plugin_cbs;
default:
return NULL;
}
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 = {
.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;
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;
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;
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);
free(contact->note);
free(contact->company);
free(contact->name);
+ free(contact->sips);
free(contact);
return CONTACTS_ERROR_OUT_OF_MEMORY;
}
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;
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)
{
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;
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;
}
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;
}
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;
}
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)
{
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;
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");
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;
+}
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);
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;
}
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;
}
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;
}
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");
CTSVC_DATA_RELATIONSHIP = 11,
CTSVC_DATA_NOTE = 12,
CTSVC_DATA_IMAGE = 13,
+ CTSVC_DATA_SIP = 14,
CTSVC_DATA_EXTENSION = 100
};
CTSVC_RECORD_SPEEDDIAL,
CTSVC_RECORD_SDN,
CTSVC_RECORD_RESULT,
+ CTSVC_RECORD_SIP,
} ctsvc_record_type_e;
typedef enum {
ctsvc_list_s *relationships;
ctsvc_list_s *images;
ctsvc_list_s *extensions;
+ ctsvc_list_s *sips;
} ctsvc_contact_s;
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;
} 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 {
.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 = {
.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 = {
.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,
{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 */
{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[] = {
{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 */
{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},
#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"
#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)
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),
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),
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();
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);
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);
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);
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;
--- /dev/null
+/*
+ * 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;
+}
}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;
+
+/**
* @}
*/
* <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()
_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)
* <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()
_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)
_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
${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
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
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)
{
}
}
+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;
image_change = false;
profile_change = false;
company_change = false;
+ sip_change = false;
}
void ctsvc_set_contact_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();
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();
}
/*
case CTSVC_DATA_EXTENSION:
ctsvc_set_data_noti();
break;
+ case CTSVC_DATA_SIP:
+ ctsvc_set_sip_noti();
+ break;
default:
break;
}
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);
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();
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
{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 */
/*
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:
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;
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;
}
}
+ 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;
}
}
}
+ /* 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;
}
#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"
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;
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)
{
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;
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);
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);
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__ */
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;
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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;
+}
+
--- /dev/null
+/*
+ * 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__ */
#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"