SET(LIBDIR "\${prefix}/lib")
SET(INCLUDEDIR "\${prefix}/${DEST_INCLUDE_DIR}")
SET(VERSION_MAJOR 0)
-SET(VERSION "${VERSION_MAJOR}.9.55")
+SET(VERSION "${VERSION_MAJOR}.9.56.1")
EXECUTE_PROCESS(COMMAND build-util/generator.sh)
#define CTS_DBG(fmt, arg...)
#define CTS_WARN(fmt, arg...)
- #define CTS_ERR(fmt, arg...) ERR(IPC_ROLE" "fmt, ##arg)
+ #define CTS_ERR(fmt, arg...) ERR(fmt, ##arg)
#define CTS_INFO(fmt, arg...)
#define CTS_VERBOSE(fmt, arg...)
{
int ret;
+ RETV_IF(NULL == src, CONTACTS_ERROR_INVALID_PARAMETER);
+ RETV_IF(NULL == dest, CONTACTS_ERROR_INVALID_PARAMETER);
+
ret = __ctsvc_normalize_number(src, dest, dest_size, min_match);
if (ret != CONTACTS_ERROR_NONE) {
CTS_ERR("__ctsvc_normalize_number(src) failed(%d)", src, ret);
*value = group->is_read_only;\r
break;\r
default:\r
- ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(company)", property_id);\r
+ ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(group)", property_id);\r
return CONTACTS_ERROR_INVALID_PARAMETER;\r
}\r
return CONTACTS_ERROR_NONE;\r
RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY,\r
"Out of memeory : calloc(ctsvc_phonelog_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY);\r
\r
- out_data->id = src_data->id;\r
+ out_data->id = src_data->id;\r
out_data->address = SAFE_STRDUP(src_data->address);\r
out_data->person_id = src_data->person_id;\r
out_data->log_time = src_data->log_time;\r
#include "ctsvc_localize.h"
static int name_display_order = -1;
+static int name_sorting_order = -1;
static int primary_sort = -1;
static int secondary_sort = -1;
static const char *CTSVC_VCONF_DISPLAY_ORDER = VCONFKEY_CONTACTS_SVC_NAME_DISPLAY_ORDER;
+static const char *CTSVC_VCONF_SORTING_ORDER = VCONFKEY_CONTACTS_SVC_NAME_SORTING_ORDER;
const char* ctsvc_get_default_language_vconfkey(void)
{
int ret;
if (name_display_order < 0)
{
- ret = vconf_get_int(VCONFKEY_CONTACTS_SVC_NAME_DISPLAY_ORDER, &name_display_order);
+ ret = vconf_get_int(CTSVC_VCONF_DISPLAY_ORDER, &name_display_order);
RETVM_IF(ret<0, CONTACTS_ERROR_SYSTEM, "System : vconf_get_int() Failed(%d)", ret);
}
RETVM_IF(CONTACTS_NAME_DISPLAY_ORDER_FIRSTLAST != order && CONTACTS_NAME_DISPLAY_ORDER_LASTFIRST != order,
CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : The parameter(order:%d) is Invalid", name_display_order);
- ret = vconf_set_int(VCONFKEY_CONTACTS_SVC_NAME_DISPLAY_ORDER, order);
- RETVM_IF(ret<0, CONTACTS_ERROR_SYSTEM, "System : vconf_set_int(%s) Failed(%d)", VCONFKEY_CONTACTS_SVC_NAME_DISPLAY_ORDER, ret);
+ ret = vconf_set_int(CTSVC_VCONF_DISPLAY_ORDER, order);
+ RETVM_IF(ret<0, CONTACTS_ERROR_SYSTEM, "System : vconf_set_int(%s) Failed(%d)", CTSVC_VCONF_DISPLAY_ORDER, ret);
name_display_order = order;
return CONTACTS_ERROR_NONE;
}
-static void ctsvc_vconf_diplay_order_cb(keynode_t *key, void *data)
+API int contacts_setting_get_name_sorting_order(contacts_name_sorting_order_e *order)
+{
+ int ret;
+ if (name_sorting_order < 0)
+ {
+ ret = vconf_get_int(CTSVC_VCONF_SORTING_ORDER, &name_sorting_order);
+ RETVM_IF(ret<0, CONTACTS_ERROR_SYSTEM, "System : vconf_get_int() Failed(%d)", ret);
+ }
+
+ *order = name_sorting_order;
+
+ return CONTACTS_ERROR_NONE;
+}
+
+API int contacts_setting_set_name_sorting_order(contacts_name_sorting_order_e order)
+{
+ int ret;
+ RETVM_IF(CONTACTS_NAME_SORTING_ORDER_FIRSTLAST != order && CONTACTS_NAME_SORTING_ORDER_LASTFIRST != order,
+ CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : The parameter(order:%d) is Invalid", name_sorting_order);
+
+ ret = vconf_set_int(CTSVC_VCONF_SORTING_ORDER, order);
+ RETVM_IF(ret<0, CONTACTS_ERROR_SYSTEM, "System : vconf_set_int(%s) Failed(%d)", CTSVC_VCONF_SORTING_ORDER, ret);
+
+ name_sorting_order = order;
+
+ return CONTACTS_ERROR_NONE;
+}
+
+static void ctsvc_vconf_display_order_cb(keynode_t *key, void *data)
{
name_display_order = vconf_keynode_get_int(key);
}
+static void ctsvc_vconf_sorting_order_cb(keynode_t *key, void *data)
+{
+ name_sorting_order = vconf_keynode_get_int(key);
+}
+
static void ctsvc_vconf_language_cb(keynode_t *key, void *data)
{
+
primary_sort = vconf_keynode_get_int(key);
{
if (primary_sort==CTSVC_SORT_KOREAN)
name_display_order = CONTACTS_NAME_DISPLAY_ORDER_FIRSTLAST;
}
+ ret = vconf_get_int(CTSVC_VCONF_SORTING_ORDER, &name_sorting_order);
+ if (ret < 0) {
+ CTS_ERR("vconf_get_int() Failed(%d)", ret);
+ name_sorting_order = CONTACTS_NAME_SORTING_ORDER_FIRSTLAST;
+ }
+
ret = vconf_get_int(ctsvc_get_default_language_vconfkey(), &primary_sort);
WARN_IF(ret < 0, "vconf_get_int() Failed(%d)", ret);
}
ret = vconf_notify_key_changed(CTSVC_VCONF_DISPLAY_ORDER,
- ctsvc_vconf_diplay_order_cb, NULL);
+ ctsvc_vconf_display_order_cb, NULL);
RETVM_IF(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_notify_key_changed(%s) Failed(%d)",
CTSVC_VCONF_DISPLAY_ORDER, ret);
+ ret = vconf_notify_key_changed(CTSVC_VCONF_SORTING_ORDER,
+ ctsvc_vconf_sorting_order_cb, NULL);
+ RETVM_IF(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_notify_key_changed(%s) Failed(%d)",
+ CTSVC_VCONF_SORTING_ORDER, ret);
ret = vconf_notify_key_changed(ctsvc_get_default_language_vconfkey(),
ctsvc_vconf_language_cb, NULL);
RETVM_IF(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_notify_key_changed(%s) Failed(%d)",
{
int ret;
- ret = vconf_ignore_key_changed(CTSVC_VCONF_DISPLAY_ORDER, ctsvc_vconf_diplay_order_cb);
+ ret = vconf_ignore_key_changed(CTSVC_VCONF_DISPLAY_ORDER, ctsvc_vconf_display_order_cb);
RETM_IF(ret<0,"vconf_ignore_key_changed(%s) Failed(%d)",CTSVC_VCONF_DISPLAY_ORDER,ret);
+ ret = vconf_ignore_key_changed(CTSVC_VCONF_SORTING_ORDER, ctsvc_vconf_sorting_order_cb);
+ RETM_IF(ret<0,"vconf_ignore_key_changed(%s) Failed(%d)",CTSVC_VCONF_SORTING_ORDER,ret);
+
ret = vconf_ignore_key_changed(ctsvc_get_default_language_vconfkey(), ctsvc_vconf_language_cb);
RETM_IF(ret<0,"vconf_ignore_key_changed(%s) Failed(%d)", ctsvc_get_default_language_vconfkey(),ret);
}
</request>
</define>
<assign>
- <filesystem path="/usr/lib/libcontacts-service2.so.0.9.55" label="_"/>
+ <filesystem path="/usr/lib/libcontacts-service2.so.0.9.56.1" label="_"/>
<filesystem path="/usr/lib/libcontacts-service2.so.0" label="_"/>
- <filesystem path="/usr/lib/libcontacts-service3.so.0.9.55" label="_"/>
+ <filesystem path="/usr/lib/libcontacts-service3.so.0.9.56.1" label="_"/>
<filesystem path="/usr/lib/libcontacts-service3.so.0" label="_"/>
<filesystem path="/opt/usr/dbspace/.contacts-svc.db" label="contacts-service::db"/>
<filesystem path="/opt/usr/dbspace/.contacts-svc.db-journal" label="contacts-service::db"/>
*/
API int contacts_setting_set_name_display_order(contacts_name_display_order_e name_display_order);
+
+/**
+ * @brief Enumerations of name display order
+ */
+typedef enum
+{
+ CONTACTS_NAME_SORTING_ORDER_FIRSTLAST, /**< Contacts are first sorted based on the first name */
+ CONTACTS_NAME_SORTING_ORDER_LASTFIRST /**< Contacts are first sorted based on the last name */
+} contacts_name_sorting_order_e;
+
+
+/**
+ * @brief Gets the contacts name sorting order in which contacts are returned.
+ *
+ * @param[out] name_sorting_order The name sorting order
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #CONTACTS_ERROR_NONE Successful
+ * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CONTACTS_ERROR_DB Database operation failure
+ *
+ * @pre This function requires an open connection to the contacts service by contacts_connect2().
+ *
+ * @see contacts_connect2()
+ */
+API int contacts_setting_get_name_sorting_order(contacts_name_sorting_order_e *name_sort_order);
+
+/**
+ * @brief Sets the contacts name sorting order in which contacts are returned.
+ *
+ * @param[in] name_sorting_order The name sorting order
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #CONTACTS_ERROR_NONE Successful
+ * @retval #CONTACTS_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CONTACTS_ERROR_DB Database operation failure
+ *
+ * @pre This function requires an open connection to the contacts service by contacts_connect2().
+ *
+ * @see contacts_connect2()
+ */
+API int contacts_setting_set_name_sorting_order(contacts_name_sorting_order_e name_sorting_order);
+
/**
* @}
*/
_CONTACTS_PROPERTY_INT( id ) // read only
_CONTACTS_PROPERTY_STR( display_name ) // read only
_CONTACTS_PROPERTY_INT( address_book_id ) // read, write once
- _CONTACTS_PROPERTY_STR( image_thumbnail_path ) // read, write
+ _CONTACTS_PROPERTY_STR( image_thumbnail_path ) // read only
_CONTACTS_PROPERTY_STR( uid ) // read, write
_CONTACTS_PROPERTY_INT( changed_time ) // read only
_CONTACTS_PROPERTY_CHILD_SINGLE( name ) // read, write
char* set = NULL;
GSList *bind_text = NULL;
GSList *cursor = NULL;
- ctsvc_address_s *address = (ctsvc_address_s*)record;
+ ctsvc_address_s *address = (ctsvc_address_s*)record;
char query[CTS_SQL_MAX_LEN] = {0};
RETVM_IF(address->id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
// Can not insert addressbook which has same account_id
int addresbook_id;
- account_h account;
+ account_h account = NULL;
snprintf(query, sizeof(query),
"SELECT addressbook_id FROM "CTS_TABLE_ADDRESSBOOKS" WHERE account_id = %d",
addressbook->account_id);
{
int ret, len = 0;
int rel_changed = 0;
- int count;
+ int id;
int version;
char *set = NULL;
char query[CTS_SQL_MAX_LEN] = {0};
RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
snprintf(query, sizeof(query),
- "SELECT count(contact_id) FROM "CTS_TABLE_CONTACTS" "
+ "SELECT contact_id FROM "CTS_TABLE_CONTACTS" "
"WHERE contact_id = %d AND deleted = 0", contact->id);
- ret = ctsvc_query_get_first_int_result(query, &count);
+ ret = ctsvc_query_get_first_int_result(query, &id);
if (CONTACTS_ERROR_NONE != ret) {
CTS_ERR("The index(%d) is Invalid. %d Record(s) is(are) found", contact->id, ret);
ctsvc_end_trans(false);
static int __ctsvc_db_group_delete_record( int id );
static int __ctsvc_db_group_get_all_records( int offset, int limit, contacts_list_h* out_list );
static int __ctsvc_db_group_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list );
-static double __ctsvc_db_group_get_next_group_prio(void);
//static int __ctsvc_db_group_insert_records(const contacts_list_h in_list, int **ids);
//static int __ctsvc_db_group_update_records(const contacts_list_h in_list);
//static int __ctsvc_db_group_delete_records( int ids[], int count);
.replace_records = NULL,
};
+static double __ctsvc_db_group_get_next_group_prio(void)
+{
+ int ret;
+ double prio = 0.0;
+ cts_stmt stmt;
+ char query[CTS_SQL_MAX_LEN] = {0};
+
+ snprintf(query, sizeof(query), "SELECT MAX(group_prio) FROM "CTS_TABLE_GROUPS" ");
+
+ stmt = cts_query_prepare(query);
+ RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "cts_query_prepare() Failed");
+
+ ret = cts_stmt_step(stmt);
+ if (1 /*CTS_TRUE*/ == ret)
+ prio = ctsvc_stmt_get_dbl(stmt, 0);
+ cts_stmt_finalize(stmt);
+
+ return prio + 1.0;
+}
+
static int __ctsvc_db_group_insert_record( contacts_record_h record, int *id )
{
int ret;
ret = ctsvc_begin_trans();
if( ret < CONTACTS_ERROR_NONE ) {
CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
- ctsvc_end_trans(false);
return ret;
}
char* set = NULL;
GSList *bind_text = NULL;
GSList *cursor = NULL;
- ctsvc_group_s *group = (ctsvc_group_s*)record;
+ ctsvc_group_s *group = (ctsvc_group_s*)record;
char query[CTS_SQL_MAX_LEN] = {0};
+ cts_stmt stmt = NULL;
+ bool is_read_only = false;
RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER);
RETVM_IF(CTSVC_RECORD_GROUP != group->base.r_type, CONTACTS_ERROR_INVALID_PARAMETER,
RETVM_IF(NULL == group->name, CONTACTS_ERROR_INVALID_PARAMETER,
"Invalid parameter : The name of group is empty.");
+ ret = ctsvc_begin_trans();
+ RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
+
snprintf(query, sizeof(query),
- "SELECT addressbook_id FROM %s WHERE group_id = %d",
+ "SELECT addressbook_id, is_read_only FROM %s WHERE group_id = %d",
CTS_TABLE_GROUPS, group->id);
- ret = ctsvc_query_get_first_int_result(query, &addressbook_id);
- if ( ret < CONTACTS_ERROR_NONE) {
- CTS_ERR("DB error : The group record(%d) is Invalid(%d)", group->id, ret);
- return ret;
+ stmt = cts_query_prepare(query);
+ if (NULL == stmt) {
+ CTS_ERR("DB error : cts_query_prepare() Failed");
+ ctsvc_end_trans(false);
+ return CONTACTS_ERROR_DB;
+ }
+
+ ret = cts_stmt_step(stmt);
+ if (1 != ret) {
+ CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret);
+ cts_stmt_finalize(stmt);
+ ctsvc_end_trans(false);
+ if (CONTACTS_ERROR_NONE == ret) {
+ CTS_ERR("DB error : The group record(%d) is Invalid(%d)", group->id, ret);
+ return CONTACTS_ERROR_NO_DATA;
+ }
+ else
+ return ret;
+ }
+
+ addressbook_id = ctsvc_stmt_get_int(stmt, 0);
+ is_read_only = ctsvc_stmt_get_int(stmt, 1);
+ CTS_DBG("addressbook_id : %d, person_id : %d", addressbook_id, person_id);
+ cts_stmt_finalize(stmt);
+
+ if (is_read_only && ctsvc_record_check_property_flag((ctsvc_record_s *)record, _contacts_group.name, CTSVC_PROPERTY_FLAG_DIRTY)) {
+ CTS_ERR("Can not change the group name. It is a read-only group (group_id : %d)", group->id);
+ ctsvc_end_trans(false);
+ return CONTACTS_ERROR_INVALID_PARAMETER;
}
if (group->image_thumbnail_changed) {
group->image_thumbnail_changed = false;
}
- ret = ctsvc_begin_trans();
- RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
-
do {
char query[CTS_SQL_MAX_LEN] = {0};
char query_set[CTS_SQL_MAX_LEN] = {0};
return CONTACTS_ERROR_NONE;
}
-double __ctsvc_db_group_get_next_group_prio(void)
-{
- int ret;
- double prio = 0.0;
- cts_stmt stmt;
- char query[CTS_SQL_MAX_LEN] = {0};
-
- snprintf(query, sizeof(query), "SELECT MAX(group_prio) FROM "CTS_TABLE_GROUPS" ");
-
- stmt = cts_query_prepare(query);
- RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "cts_query_prepare() Failed");
-
- ret = cts_stmt_step(stmt);
- if (1 /*CTS_TRUE*/ == ret)
- prio = ctsvc_stmt_get_dbl(stmt, 0);
- cts_stmt_finalize(stmt);
-
- return prio + 1.0;
-}
//static int __ctsvc_db_group_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; }
//static int __ctsvc_db_group_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; }
//static int __ctsvc_db_group_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; }
static int __ctsvc_db_my_profile_update_record( contacts_record_h record )
{
int ret, len;
- int count;
+ int id;
char query[CTS_SQL_MAX_LEN] = {0};
ctsvc_my_profile_s *my_profile = (ctsvc_my_profile_s*)record;
cts_stmt stmt;
RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
snprintf(query, sizeof(query),
- "SELECT count(my_profile_id) FROM "CTSVC_DB_VIEW_MY_PROFILE" WHERE my_profile_id = %d", my_profile->id);
- ret = ctsvc_query_get_first_int_result(query, &count);
+ "SELECT my_profile_id FROM "CTSVC_DB_VIEW_MY_PROFILE" WHERE my_profile_id = %d", my_profile->id);
+ ret = ctsvc_query_get_first_int_result(query, &id);
if (CONTACTS_ERROR_NONE != ret) {
CTS_ERR("The index(%d) is Invalid. %d Record(s) is(are) found", my_profile->id, ret);
ctsvc_end_trans(false);
return ret;
}
- snprintf(query, sizeof(query),
- "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", url->contact_id);
- ret = ctsvc_query_get_first_int_result(query, &contact_id);
- if (CONTACTS_ERROR_NONE != ret) {
- CTS_ERR("No data : contact_id (%d) is not exist", contact_id);
- ctsvc_end_trans(false);
- return CONTACTS_ERROR_INVALID_PARAMETER;
- }
-
ret = ctsvc_db_contact_update_changed_time(url->contact_id);
if (CONTACTS_ERROR_NONE != ret) {
CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
static int __ctsvc_db_search_records_exec(const char *view_uri, const property_info_s* properties,
int ids_count, const char *projection, const char *keyword, int offset, int limit, contacts_list_h* out_list )
{
- char query[CTS_SQL_MAX_LEN] = {0};
+ char query[CTS_SQL_MAX_LEN*8] = {0}; // temporarily extend
const char *table;
int len;
int ret;
static inline int __ctsvc_db_search_records_with_query_exec(ctsvc_query_s *s_query, const char *projection,
const char *condition, GSList *bind, const char *keyword, int offset, int limit, contacts_list_h * out_list )
{
- char query[CTS_SQL_MAX_LEN] = {0};
+ char query[CTS_SQL_MAX_LEN*8] = {0}; // temporarily extend
int len;
int ret;
int i;
if (is_favorite && ((ctsvc_contact_s*)record)->is_favorite) {
snprintf(query, sizeof(query),
- "INSERT INTO "CTS_TABLE_FAVORITES" values(%d, %f)", id, priority);
+ "INSERT OR REPLACE INTO "CTS_TABLE_FAVORITES" values(%d, %f)", id, priority);
ret = ctsvc_query_exec(query);
if (CONTACTS_ERROR_NONE != ret) {
CTS_ERR("ctsvc_query_exec() Failed(%d)", ret);
Name: contacts-service
Summary: Contacts Service
-Version: 0.9.55
+Version: 0.9.56.1
Release: 1
Group: TO_BE/FILLED_IN
License: Apache-2.0
);
INSERT INTO groups(addressbook_id, group_name, extra_data, is_read_only, created_ver, changed_ver, group_prio)
- VALUES(0, 'coworkers', 'coworkers', 0, 0, 0, 1);
+ VALUES(0, 'Co-workers', 'coworkers', 0, 0, 0, 1);
INSERT INTO groups(addressbook_id, group_name, extra_data, is_read_only, created_ver, changed_ver, group_prio)
- VALUES(0, 'family', 'family', 0, 0, 0, 2);
+ VALUES(0, 'Family', 'family', 0, 0, 0, 2);
INSERT INTO groups(addressbook_id, group_name, extra_data, is_read_only, created_ver, changed_ver, group_prio)
- VALUES(0, 'friends', 'friends',0, 0, 0, 3);
+ VALUES(0, 'Friends', 'friends',0, 0, 0, 3);
CREATE TRIGGER trg_groups_del AFTER DELETE ON groups
BEGIN