From: Donghee Ye Date: Thu, 21 Mar 2013 13:33:06 +0000 (+0900) Subject: Merge from Master X-Git-Tag: accepted/tizen_2.1/20130425.033130~13 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0a406ee1c0d13c1cf74a4b30d1c3b60c2a1d67cf;p=platform%2Fcore%2Fpim%2Fcontacts-service.git Merge from Master Update 0.9.55 - Set my_profile image_thumbnail_path as read-only property - Remove groups table join of view_person_contact_grouprel - Fix error : Update contact which has only additional name - Subscribe account change noti : addressbook deletes when account is deleted - Check account_id validation when inserting addressbook - Allow to insert one addressbook with same account_id - Fix bug - image resize - Change group property name : system_id -> extra_data Change-Id: Id11400adfa588c5524cf8c5c518d78569a103306 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index bd3ea75..e11bef7 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,7 @@ SET(EXEC_PREFIX "\${prefix}") SET(LIBDIR "\${prefix}/lib") SET(INCLUDEDIR "\${prefix}/${DEST_INCLUDE_DIR}") SET(VERSION_MAJOR 0) -SET(VERSION "${VERSION_MAJOR}.9.52.1") +SET(VERSION "${VERSION_MAJOR}.9.55") EXECUTE_PROCESS(COMMAND build-util/generator.sh) diff --git a/common/ctsvc_normalize.c b/common/ctsvc_normalize.c index 5dfa096..b56d2b8 100644 --- a/common/ctsvc_normalize.c +++ b/common/ctsvc_normalize.c @@ -81,8 +81,8 @@ static inline bool __ctsvc_check_dirty_number(char digit) case ',': case '.': case ';': + case '+': return false; - case '+': //only first position default: return true; } @@ -95,9 +95,6 @@ int ctsvc_clean_number(const char *src, char *dest, int dest_size) if (NULL == src) CTS_ERR("The parameter(src) is NULL"); else { - if ('+' == src[s_pos]) - dest[d_pos++] = src[s_pos++]; - while (src[s_pos] != 0) { if (d_pos >= dest_size-2) break; diff --git a/common/ctsvc_record_group.c b/common/ctsvc_record_group.c index 7e3bcef..4a323b9 100644 --- a/common/ctsvc_record_group.c +++ b/common/ctsvc_record_group.c @@ -84,7 +84,7 @@ static int __ctsvc_group_destroy(contacts_record_h record, bool delete_child) free(group->ringtone_path); free(group->vibration); free(group->image_thumbnail_path); - free(group->system_id); + free(group->extra_data); free(group); return CONTACTS_ERROR_NONE; @@ -105,7 +105,7 @@ static int __ctsvc_group_clone(contacts_record_h record, contacts_record_h *out_ out_data->is_read_only = src_data->is_read_only; out_data->image_thumbnail_changed = src_data->image_thumbnail_changed; out_data->name = SAFE_STRDUP(src_data->name); - out_data->system_id = SAFE_STRDUP(src_data->system_id); + out_data->extra_data = SAFE_STRDUP(src_data->extra_data); out_data->vibration = SAFE_STRDUP(src_data->vibration); out_data->ringtone_path = SAFE_STRDUP(src_data->ringtone_path); out_data->image_thumbnail_path = SAFE_STRDUP(src_data->image_thumbnail_path); @@ -151,8 +151,8 @@ static int __ctsvc_group_get_str_real(contacts_record_h record, unsigned int pro case CTSVC_PROPERTY_GROUP_VIBRATION: *out_str = GET_STR(copy, group->vibration); break; - case CTSVC_PROPERTY_GROUP_SYSTEM_ID: - *out_str = GET_STR(copy, group->system_id); + case CTSVC_PROPERTY_GROUP_EXTRA_DATA: + *out_str = GET_STR(copy, group->extra_data); break; default : ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(group)", property_id); @@ -213,8 +213,8 @@ static int __ctsvc_group_set_str(contacts_record_h record, unsigned int property case CTSVC_PROPERTY_GROUP_VIBRATION: FREEandSTRDUP(group->vibration, str); break; - case CTSVC_PROPERTY_GROUP_SYSTEM_ID: - FREEandSTRDUP(group->system_id, str); + case CTSVC_PROPERTY_GROUP_EXTRA_DATA: + FREEandSTRDUP(group->extra_data, str); break; default : ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(group)", property_id); diff --git a/common/ctsvc_struct.h b/common/ctsvc_struct.h index 53918a9..1225ce2 100644 --- a/common/ctsvc_struct.h +++ b/common/ctsvc_struct.h @@ -225,7 +225,7 @@ typedef struct { int addressbook_id; bool is_read_only; char *name; - char *system_id; + char *extra_data; char *ringtone_path; char *vibration; char *image_thumbnail_path; diff --git a/common/ctsvc_view.c b/common/ctsvc_view.c index 709ba3b..1c6f1f7 100644 --- a/common/ctsvc_view.c +++ b/common/ctsvc_view.c @@ -41,7 +41,8 @@ API const _contacts_group_property_ids _contacts_group = { .ringtone_path = CTSVC_PROPERTY_GROUP_RINGTONE, .image_path = CTSVC_PROPERTY_GROUP_IMAGE, .vibration = CTSVC_PROPERTY_GROUP_VIBRATION, - .system_id = CTSVC_PROPERTY_GROUP_SYSTEM_ID, + .system_id = CTSVC_PROPERTY_GROUP_EXTRA_DATA, + .extra_data = CTSVC_PROPERTY_GROUP_EXTRA_DATA, .is_read_only = CTSVC_PROPERTY_GROUP_IS_READ_ONLY }; @@ -618,7 +619,7 @@ const property_info_s __property_group[] = { {CTSVC_PROPERTY_GROUP_RINGTONE, CTSVC_SEARCH_PROPERTY_ALL, "ringtone_path"}, {CTSVC_PROPERTY_GROUP_IMAGE, CTSVC_SEARCH_PROPERTY_ALL, "image_thumbnail_path"}, {CTSVC_PROPERTY_GROUP_VIBRATION, CTSVC_SEARCH_PROPERTY_ALL, "vibration"}, - {CTSVC_PROPERTY_GROUP_SYSTEM_ID, CTSVC_SEARCH_PROPERTY_ALL, "system_id"}, + {CTSVC_PROPERTY_GROUP_EXTRA_DATA, CTSVC_SEARCH_PROPERTY_ALL, "extra_data"}, {CTSVC_PROPERTY_GROUP_IS_READ_ONLY, CTSVC_SEARCH_PROPERTY_ALL, "is_read_only"}, }; diff --git a/common/ctsvc_view.h b/common/ctsvc_view.h index 1658708..684eb2f 100644 --- a/common/ctsvc_view.h +++ b/common/ctsvc_view.h @@ -159,7 +159,7 @@ typedef enum { CTSVC_PROPERTY_GROUP_RINGTONE = (CTSVC_PROPERTY_GROUP | CTSVC_VIEW_DATA_TYPE_STR) +3, CTSVC_PROPERTY_GROUP_IMAGE = (CTSVC_PROPERTY_GROUP | CTSVC_VIEW_DATA_TYPE_STR) +4, CTSVC_PROPERTY_GROUP_VIBRATION = (CTSVC_PROPERTY_GROUP | CTSVC_VIEW_DATA_TYPE_STR) +5, - CTSVC_PROPERTY_GROUP_SYSTEM_ID = (CTSVC_PROPERTY_GROUP | CTSVC_VIEW_DATA_TYPE_STR) +6, + CTSVC_PROPERTY_GROUP_EXTRA_DATA = (CTSVC_PROPERTY_GROUP | CTSVC_VIEW_DATA_TYPE_STR) +6, CTSVC_PROPERTY_GROUP_IS_READ_ONLY = (CTSVC_PROPERTY_GROUP | CTSVC_VIEW_DATA_TYPE_BOOL | CTSVC_READ_ONLY_PROPERTY) +7, // person @@ -220,7 +220,7 @@ typedef enum { CTSVC_PROPERTY_MY_PROFILE_DISPLAY_NAME = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +1, CTSVC_PROPERTY_MY_PROFILE_ADDRESSBOOK_ID = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_INT) +2, CTSVC_PROPERTY_MY_PROFILE_IMAGE = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +3, - CTSVC_PROPERTY_MY_PROFILE_IMAGE_THUMBNAIL = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_STR) +4, + CTSVC_PROPERTY_MY_PROFILE_IMAGE_THUMBNAIL = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +4, CTSVC_PROPERTY_MY_PROFILE_UID = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_STR) +5, CTSVC_PROPERTY_MY_PROFILE_CHANGED_TIME = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_INT) +6, CTSVC_PROPERTY_MY_PROFILE_NAME = (CTSVC_PROPERTY_MY_PROFILE | CTSVC_VIEW_DATA_TYPE_REC) +7, diff --git a/common/ipc/ctsvc_ipc_group.c b/common/ipc/ctsvc_ipc_group.c index 35efe16..ca69da1 100644 --- a/common/ipc/ctsvc_ipc_group.c +++ b/common/ipc/ctsvc_ipc_group.c @@ -27,7 +27,7 @@ static int __ctsvc_ipc_unmarshal_group(pims_ipc_data_h ipc_data, const char* vie if (ctsvc_ipc_unmarshal_int(ipc_data, &group_p->addressbook_id) != CONTACTS_ERROR_NONE) break; if (ctsvc_ipc_unmarshal_bool(ipc_data, &group_p->is_read_only) != CONTACTS_ERROR_NONE) break; if (ctsvc_ipc_unmarshal_string(ipc_data, &group_p->name) != CONTACTS_ERROR_NONE) break; - if (ctsvc_ipc_unmarshal_string(ipc_data, &group_p->system_id) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_unmarshal_string(ipc_data, &group_p->extra_data) != CONTACTS_ERROR_NONE) break; if (ctsvc_ipc_unmarshal_string(ipc_data, &group_p->ringtone_path) != CONTACTS_ERROR_NONE) break; if (ctsvc_ipc_unmarshal_string(ipc_data, &group_p->vibration) != CONTACTS_ERROR_NONE) break; if (ctsvc_ipc_unmarshal_string(ipc_data, &group_p->image_thumbnail_path) != CONTACTS_ERROR_NONE) break; @@ -52,7 +52,7 @@ static int __ctsvc_ipc_marshal_group(const contacts_record_h record, pims_ipc_da if (ctsvc_ipc_marshal_int((group_p->addressbook_id),ipc_data) != CONTACTS_ERROR_NONE) break; if (ctsvc_ipc_marshal_bool((group_p->is_read_only),ipc_data) != CONTACTS_ERROR_NONE) break; if (ctsvc_ipc_marshal_string((group_p->name),ipc_data) != CONTACTS_ERROR_NONE) break; - if (ctsvc_ipc_marshal_string((group_p->system_id),ipc_data) != CONTACTS_ERROR_NONE) break; + if (ctsvc_ipc_marshal_string((group_p->extra_data),ipc_data) != CONTACTS_ERROR_NONE) break; if (ctsvc_ipc_marshal_string((group_p->ringtone_path),ipc_data) != CONTACTS_ERROR_NONE) break; if (ctsvc_ipc_marshal_string((group_p->vibration),ipc_data) != CONTACTS_ERROR_NONE) break; if (ctsvc_ipc_marshal_string((group_p->image_thumbnail_path),ipc_data) != CONTACTS_ERROR_NONE) break; diff --git a/contacts-service2.manifest b/contacts-service2.manifest index a47a145..952b4f0 100644 --- a/contacts-service2.manifest +++ b/contacts-service2.manifest @@ -6,12 +6,13 @@ + - + - + diff --git a/include/contacts.h b/include/contacts.h index d859f91..1e904e0 100644 --- a/include/contacts.h +++ b/include/contacts.h @@ -686,7 +686,7 @@ * string ringtone_path read, write * string image_path read, write * string vibration read, write - * string system_id read, write + * string extra_data read, write * boolean is_read_only read only * * @@ -1180,7 +1180,6 @@ * boolean has_email * integer address_book_id * integer group_id * - * string group_name * * * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_phone_log _contacts_person_phone_log view diff --git a/include/contacts_views.h b/include/contacts_views.h index 621f166..4e21722 100755 --- a/include/contacts_views.h +++ b/include/contacts_views.h @@ -47,7 +47,8 @@ _CONTACTS_BEGIN_VIEW() _CONTACTS_PROPERTY_STR( ringtone_path ) // read, write _CONTACTS_PROPERTY_STR( image_path ) // read, write _CONTACTS_PROPERTY_STR( vibration ) // read, write - _CONTACTS_PROPERTY_STR( system_id ) // read, write, string + _CONTACTS_PROPERTY_STR( system_id ) // read, write, string, It should be removed + _CONTACTS_PROPERTY_STR( extra_data ) // read, write, string _CONTACTS_PROPERTY_BOOL( is_read_only ) // read only _CONTACTS_END_VIEW( _contacts_group ) @@ -80,7 +81,7 @@ _CONTACTS_BEGIN_VIEW() _CONTACTS_PROPERTY_INT( address_book_id ) // read, write-once _CONTACTS_PROPERTY_STR( ringtone_path ) // read, write _CONTACTS_PROPERTY_STR( image_thumbnail_path ) // read, write - _CONTACTS_PROPERTY_BOOL( is_favorite ) // read only + _CONTACTS_PROPERTY_BOOL( is_favorite ) // read, write _CONTACTS_PROPERTY_BOOL( has_phonenumber ) // read only _CONTACTS_PROPERTY_BOOL( has_email ) // read only _CONTACTS_PROPERTY_INT( person_id ) // read only @@ -97,7 +98,7 @@ _CONTACTS_BEGIN_VIEW() _CONTACTS_PROPERTY_INT( address_book_id ) // read, write once _CONTACTS_PROPERTY_STR( ringtone_path ) // read, write _CONTACTS_PROPERTY_STR( image_thumbnail_path ) // read, write - _CONTACTS_PROPERTY_BOOL( is_favorite ) // read only + _CONTACTS_PROPERTY_BOOL( is_favorite ) // read, write _CONTACTS_PROPERTY_BOOL( has_phonenumber ) // read only _CONTACTS_PROPERTY_BOOL( has_email ) // read only _CONTACTS_PROPERTY_INT( person_id ) // read only diff --git a/native/CMakeLists.txt b/native/CMakeLists.txt index 8636905..05527a2 100755 --- a/native/CMakeLists.txt +++ b/native/CMakeLists.txt @@ -6,7 +6,7 @@ SET(NATIVE contacts-service3) FILE(GLOB SRCS *.c ../common/*.c) INCLUDE(FindPkgConfig) -pkg_check_modules(service_pkgs REQUIRED sqlite3 db-util capi-media-image-util badge) +pkg_check_modules(service_pkgs REQUIRED sqlite3 db-util capi-media-image-util accounts-svc badge) FOREACH(flag ${service_pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") diff --git a/native/ctsvc_db_init.c b/native/ctsvc_db_init.c index afdf171..7cedd43 100644 --- a/native/ctsvc_db_init.c +++ b/native/ctsvc_db_init.c @@ -139,7 +139,6 @@ int ctsvc_db_plugin_init() int count = sizeof(__db_tables) /sizeof(db_table_info_s); for (i=0;i #include "contacts.h" #include "ctsvc_internal.h" @@ -78,7 +79,6 @@ static int __ctsvc_db_addressbook_value_set(cts_stmt stmt, contacts_record_h *re return CONTACTS_ERROR_NONE; } - static int __ctsvc_db_addressbook_get_record( int id, contacts_record_h* out_record ) { int ret; @@ -92,8 +92,7 @@ static int __ctsvc_db_addressbook_get_record( int id, contacts_record_h* out_rec len = snprintf(query, sizeof(query), "SELECT addressbook_id, addressbook_name, account_id, mode, last_sync_ver " - "FROM "CTS_TABLE_ADDRESSBOOKS" WHERE addressbook_id = %d", - id); + "FROM "CTS_TABLE_ADDRESSBOOKS" WHERE addressbook_id = %d", id); stmt = cts_query_prepare(query); RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed"); @@ -121,6 +120,9 @@ static int __ctsvc_db_addressbook_get_record( int id, contacts_record_h* out_rec static int __ctsvc_db_addressbook_insert_record( contacts_record_h record, int *id ) { + int ret; + cts_stmt stmt = NULL; + char query[CTS_SQL_MAX_LEN] = {0}; ctsvc_addressbook_s *addressbook = (ctsvc_addressbook_s*)record; RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); @@ -128,8 +130,45 @@ static int __ctsvc_db_addressbook_insert_record( contacts_record_h record, int * RETVM_IF(CTSVC_RECORD_ADDRESSBOOK != addressbook->base.r_type, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : record is invalid type(%d)", addressbook->base.r_type); - cts_stmt stmt = NULL; - char query[CTS_SQL_MAX_LEN] = {0}; + ret = ctsvc_begin_trans(); + RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret); + + // Can not insert addressbook which has same account_id + int addresbook_id; + account_h account; + snprintf(query, sizeof(query), + "SELECT addressbook_id FROM "CTS_TABLE_ADDRESSBOOKS" WHERE account_id = %d", + addressbook->account_id); + ret = ctsvc_query_get_first_int_result(query, &addresbook_id); + if (CONTACTS_ERROR_NO_DATA != ret) { + ctsvc_end_trans(false); + if (CONTACTS_ERROR_NONE == ret) { + CTS_ERR("One addressbook which has account_id(%d) already exists", addressbook->account_id); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + else { + CTS_ERR("DB error : ctsvc_query_get_first_int_result() Failed (%d)", ret); + return ret; + } + } + + if (0 < addressbook->account_id) { + // check account_id validation + ret = account_create(&account); + if (ACCOUNT_ERROR_NONE != ret) { + CTS_ERR("account_create() Failed(%d)", ret); + ctsvc_end_trans(false); + return CONTACTS_ERROR_SYSTEM; + } + ret = account_query_account_by_account_id(addressbook->account_id, &account); + if (ACCOUNT_ERROR_NONE != ret) { + CTS_ERR("account_query_account_by_account_id Faild(%d) : account_id(%d)", ret, addressbook->account_id); + account_destroy(account); + ctsvc_end_trans(false); + return CONTACTS_ERROR_INVALID_PARAMETER; + } + account_destroy(account); + } snprintf(query, sizeof(query), "INSERT INTO %s(addressbook_name, account_id, mode) " @@ -139,20 +178,12 @@ static int __ctsvc_db_addressbook_insert_record( contacts_record_h record, int * stmt = cts_query_prepare(query); if (NULL == stmt) { CTS_ERR("DB error : cts_query_prepare() Failed"); + ctsvc_end_trans(false); return CONTACTS_ERROR_DB; } cts_stmt_bind_text(stmt, 1, addressbook->name); - /* BEGIN_TRANSACTION */ - int ret = ctsvc_begin_trans(); - if( ret < CONTACTS_ERROR_NONE ) - { - CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret); - cts_stmt_finalize(stmt); - return ret; - } - /* DOING JOB */ do { ret = cts_stmt_step(stmt); diff --git a/native/ctsvc_db_plugin_addressbook_helper.c b/native/ctsvc_db_plugin_addressbook_helper.c new file mode 100644 index 0000000..8092ed9 --- /dev/null +++ b/native/ctsvc_db_plugin_addressbook_helper.c @@ -0,0 +1,73 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_sqlite.h" +#include "ctsvc_schema.h" +#include "ctsvc_utils.h" +#include "ctsvc_person.h" +#include "ctsvc_notification.h" +#include "ctsvc_db_plugin_addressbook_helper.h" + +int ctsvc_addressbook_delete(int account_id) +{ + CTS_FN_CALL; + int ret; + char query[CTS_SQL_MAX_LEN] = {0}; + RETVM_IF(account_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, "Account_id(%d) is invalid", account_id); + + // delete addressbook whish has account_id + ret = ctsvc_begin_trans(); + RETVM_IF (CONTACTS_ERROR_NONE != ret, ret, "ctsvc_begin_trans() Failed(%d)", ret); + + snprintf(query, sizeof(query), "DELETE FROM %s WHERE account_id = %d", + CTS_TABLE_ADDRESSBOOKS, account_id); + ret = ctsvc_query_exec(query); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ret = cts_db_change(); + if (0 < ret) { + ctsvc_set_my_profile_noti(); + ctsvc_set_contact_noti(); + // person noti will set in ctsvc_person_do_garbage_collection : ctsvc_set_person_noti(); + ctsvc_set_group_noti(); + ctsvc_set_addressbook_noti(); + } + else { + CTS_ERR("There is no addressbook which has account_id (%d)", account_id); + ctsvc_end_trans(false); + return CONTACTS_ERROR_NO_DATA; + } + + ret = ctsvc_person_do_garbage_collection(); + if (CONTACTS_ERROR_NONE != ret) { + CTS_ERR("DB error : cts_person_garbagecollection() Failed(%d)", ret); + ctsvc_end_trans(false); + return ret; + } + + ctsvc_end_trans(true); + return CONTACTS_ERROR_NONE; +} + diff --git a/native/ctsvc_db_plugin_addressbook_helper.h b/native/ctsvc_db_plugin_addressbook_helper.h new file mode 100644 index 0000000..57767b2 --- /dev/null +++ b/native/ctsvc_db_plugin_addressbook_helper.h @@ -0,0 +1,25 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CTSVC_DB_PLUGIN_ADDRESS_BOOK_HELPER_H__ +#define __CTSVC_DB_PLUGIN_ADDRESS_BOOK_HELPER_H__ + +int ctsvc_addressbook_delete(int account_id); + +#endif // __CTSVC_DB_PLUGIN_ADDRESS_BOOK_HELPER_H__ diff --git a/native/ctsvc_db_plugin_contact.c b/native/ctsvc_db_plugin_contact.c index a47298b..1b064f5 100644 --- a/native/ctsvc_db_plugin_contact.c +++ b/native/ctsvc_db_plugin_contact.c @@ -17,6 +17,7 @@ * */ #include +#include #include #include @@ -1169,6 +1170,11 @@ static int __ctsvc_db_contact_update_record( contacts_record_h record ) version = ctsvc_get_next_ver(); + if (CTSVC_PROPERTY_FLAG_DIRTY != (contact->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY)) { + CTS_ERR("No update"); + ret = CONTACTS_ERROR_NONE; + break; + } if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break; if (set && *set) len = snprintf(query_set, sizeof(query_set), "%s, ", set); diff --git a/native/ctsvc_db_plugin_contact_helper.c b/native/ctsvc_db_plugin_contact_helper.c index c97623c..22c0bc7 100644 --- a/native/ctsvc_db_plugin_contact_helper.c +++ b/native/ctsvc_db_plugin_contact_helper.c @@ -17,6 +17,7 @@ * */ #include +#include #include #include #include @@ -277,8 +278,7 @@ void ctsvc_make_contact_display_name(ctsvc_contact_s *contact) name = (ctsvc_name_s *)contact->name->records->data; } - if ( name && ( name->first || name->last) ) { - + if ( name && ( name->first || name->last || name->prefix || name->addition || name->suffix) ) { // make display name display_len = SAFE_STRLEN(name->prefix) + SAFE_STRLEN(name->first) diff --git a/native/ctsvc_db_plugin_group.c b/native/ctsvc_db_plugin_group.c index 1734b09..211aca6 100644 --- a/native/ctsvc_db_plugin_group.c +++ b/native/ctsvc_db_plugin_group.c @@ -88,7 +88,7 @@ static int __ctsvc_db_group_insert_record( contacts_record_h record, int *id ) snprintf(query, sizeof(query), "INSERT INTO "CTS_TABLE_GROUPS"(group_id, addressbook_id, group_name, created_ver, changed_ver, ringtone_path, " - "vibration, image_thumbnail_path, system_id, is_read_only, group_prio) " + "vibration, image_thumbnail_path, extra_data, is_read_only, group_prio) " "VALUES(%d, %d, ?, ?, ?, ?, ?, ?, ?, %d, %lf)", group->id, group->addressbook_id, group->is_read_only, group_prio); @@ -125,8 +125,8 @@ static int __ctsvc_db_group_insert_record( contacts_record_h record, int *id ) cts_stmt_bind_text(stmt, 6, group->image_thumbnail_path); } - if (group->system_id) - cts_stmt_bind_text(stmt, 7, group->system_id); + if (group->extra_data) + cts_stmt_bind_text(stmt, 7, group->extra_data); ret = cts_stmt_step(stmt); if (CONTACTS_ERROR_NONE != ret) { @@ -317,7 +317,7 @@ static int __ctsvc_db_group_value_set(cts_stmt stmt, contacts_record_h *record) temp = ctsvc_stmt_get_text(stmt, i++); group->name = SAFE_STRDUP(temp); temp = ctsvc_stmt_get_text(stmt, i++); - group->system_id = SAFE_STRDUP(temp); + group->extra_data = SAFE_STRDUP(temp); group->is_read_only = ctsvc_stmt_get_int(stmt, i++); temp = ctsvc_stmt_get_text(stmt, i++); group->ringtone_path = SAFE_STRDUP(temp); @@ -344,7 +344,7 @@ static int __ctsvc_db_group_get_record( int id, contacts_record_h *out_record ) *out_record = NULL; len = snprintf(query, sizeof(query), - "SELECT group_id, addressbook_id, group_name, system_id, is_read_only, " + "SELECT group_id, addressbook_id, group_name, extra_data, is_read_only, " "ringtone_path, vibration, image_thumbnail_path " "FROM "CTS_TABLE_GROUPS" WHERE group_id = %d", id); @@ -379,7 +379,7 @@ static int __ctsvc_db_group_get_all_records( int offset, int limit, contacts_lis contacts_list_h list; len = snprintf(query, sizeof(query), - "SELECT group_id, addressbook_id, group_name, system_id, is_read_only, " + "SELECT group_id, addressbook_id, group_name, extra_data, is_read_only, " "ringtone_path, vibration, image_thumbnail_path " "FROM "CTS_TABLE_GROUPS" ORDER BY addressbook_id, group_prio"); @@ -489,9 +489,9 @@ static int __ctsvc_db_group_get_records_with_query( contacts_query_h query, temp = ctsvc_stmt_get_text(stmt, i); group->vibration = SAFE_STRDUP(temp); break; - case CTSVC_PROPERTY_GROUP_SYSTEM_ID: + case CTSVC_PROPERTY_GROUP_EXTRA_DATA: temp = ctsvc_stmt_get_text(stmt, i); - group->system_id = SAFE_STRDUP(temp); + group->extra_data = SAFE_STRDUP(temp); break; case CTSVC_PROPERTY_GROUP_IS_READ_ONLY: group->is_read_only = ctsvc_stmt_get_int(stmt, i); diff --git a/native/ctsvc_service.c b/native/ctsvc_service.c index e57ea8f..6048306 100644 --- a/native/ctsvc_service.c +++ b/native/ctsvc_service.c @@ -25,6 +25,8 @@ #include #include +#include + #include "contacts.h" #include "ctsvc_internal.h" #include "ctsvc_socket.h" @@ -33,17 +35,14 @@ #include "ctsvc_db_init.h" #include "ctsvc_setting.h" -#ifndef _CONTACTS_IPC_CLIENT static int ctsvc_connection = 0; static __thread int thread_connection = 0; -#endif API int contacts_connect2() { CTS_FN_CALL; int ret; -#ifndef _CONTACTS_IPC_CLIENT ctsvc_mutex_lock(CTS_MUTEX_CONNECTION); if (0 == ctsvc_connection) { ret = ctsvc_socket_init(); @@ -62,13 +61,15 @@ API int contacts_connect2() ctsvc_db_plugin_init(); ctsvc_view_uri_init(); ctsvc_register_vconf(); + ret = account_connect(); + if (ACCOUNT_ERROR_NONE != ret) + CTS_ERR("account_connect Failed(%d)", ret); } else CTS_DBG("System : Contacts service has been already connected"); ctsvc_connection++; ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); -#endif if (0 == thread_connection) { ret = ctsvc_db_init(); @@ -92,7 +93,6 @@ API int contacts_disconnect2() } thread_connection--; -#ifndef _CONTACTS_IPC_CLIENT ctsvc_mutex_lock(CTS_MUTEX_CONNECTION); if (1 == ctsvc_connection) { ctsvc_socket_final(); @@ -100,6 +100,7 @@ API int contacts_disconnect2() ctsvc_deregister_vconf(); ctsvc_view_uri_deinit(); ctsvc_db_plugin_deinit(); + account_disconnect(); } else if (1 < ctsvc_connection) CTS_DBG("System : connection count is %d", ctsvc_connection); @@ -110,8 +111,6 @@ API int contacts_disconnect2() } ctsvc_connection--; ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION); -#endif - return CONTACTS_ERROR_NONE; } diff --git a/native/ctsvc_utils.c b/native/ctsvc_utils.c index 24e407e..0384aea 100644 --- a/native/ctsvc_utils.c +++ b/native/ctsvc_utils.c @@ -306,9 +306,9 @@ static bool __ctsvc_image_util_supported_jpeg_colorspace_cb(image_util_colorspac resized_width = width*image_size/height; } - if (!resized_height%8) + if (resized_height%8) resized_height += 8 - (resized_height%8); - if (!resized_width%8) + if (resized_width%8) resized_width += 8 - (resized_width%8); CTS_DBG("size(%d, %d) -> resize(%d,%d)", width, height, resized_width, resized_height); diff --git a/packaging/contacts-service.spec b/packaging/contacts-service.spec index 6552daa..0240570 100644 --- a/packaging/contacts-service.spec +++ b/packaging/contacts-service.spec @@ -1,6 +1,6 @@ Name: contacts-service Summary: Contacts Service -Version: 0.9.52.1 +Version: 0.9.55 Release: 1 Group: TO_BE/FILLED_IN License: Apache-2.0 @@ -18,6 +18,7 @@ BuildRequires: pkgconfig(icu-i18n) BuildRequires: pkgconfig(capi-base-common) BuildRequires: pkgconfig(capi-media-image-util) BuildRequires: pkgconfig(pims-ipc) +BuildRequires: pkgconfig(accounts-svc) BuildRequires: pkgconfig(badge) Requires(post): /usr/bin/sqlite3, /bin/chmod, /bin/chown Requires(post): /usr/bin/vconftool diff --git a/schema.sql b/schema.sql index 5a4875c..0d8a0d4 100755 --- a/schema.sql +++ b/schema.sql @@ -227,7 +227,7 @@ CREATE TABLE groups group_id INTEGER PRIMARY KEY AUTOINCREMENT, addressbook_id INTEGER, group_name TEXT, - system_id TEXT, + extra_data TEXT, is_read_only INTEGER DEFAULT 0, created_ver INTEGER NOT NULL, changed_ver INTEGER NOT NULL, @@ -238,11 +238,11 @@ CREATE TABLE groups group_prio REAL ); -INSERT INTO groups(addressbook_id, group_name, system_id, is_read_only, created_ver, changed_ver, group_prio) +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); -INSERT INTO groups(addressbook_id, group_name, system_id, is_read_only, created_ver, changed_ver, group_prio) +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); -INSERT INTO groups(addressbook_id, group_name, system_id, is_read_only, created_ver, changed_ver, group_prio) +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); CREATE TRIGGER trg_groups_del AFTER DELETE ON groups diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index 144fa1c..c0813b8 100755 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -68,13 +68,19 @@ SET(SRCS ${CMAKE_SOURCE_DIR}/common/ctsvc_view.c ${CMAKE_SOURCE_DIR}/native/ctsvc_activity.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_init.c ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_activity.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_address_helper.c ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_address.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_addressbook.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_addressbook_helper.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_company_helper.c ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_company.c + ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_contact_helper.c ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_contact.c ${CMAKE_SOURCE_DIR}/native/ctsvc_db_plugin_my_profile.c @@ -153,7 +159,7 @@ SET(SRCS ) INCLUDE(FindPkgConfig) -pkg_check_modules(ctsvc_server_pkgs REQUIRED glib-2.0 pims-ipc gobject-2.0 tapi dlog capi-media-image-util badge) +pkg_check_modules(ctsvc_server_pkgs REQUIRED glib-2.0 pims-ipc gobject-2.0 tapi dlog capi-media-image-util accounts-svc badge) FOREACH(flag ${ctsvc_server_pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") diff --git a/server/ctsvc_server_bg.c b/server/ctsvc_server_bg.c index 7416328..0d02a40 100644 --- a/server/ctsvc_server_bg.c +++ b/server/ctsvc_server_bg.c @@ -21,12 +21,15 @@ #include #include //sleep +#include + #include "contacts.h" #include "internal.h" #include "ctsvc_schema.h" #include "ctsvc_sqlite.h" #include "ctsvc_server_bg.h" #include "ctsvc_utils.h" +#include "ctsvc_db_plugin_addressbook_helper.h" #define CTSVC_SERVER_BG_DELETE_COUNT 50 #define CTSVC_SERVER_BG_DELETE_STEP_TIME 1 @@ -50,6 +53,8 @@ GThread *__ctsvc_server_bg_delete_thread = NULL; GCond __ctsvc_server_bg_delete_cond; GMutex __ctsvc_server_bg_delete_mutex; +account_subscribe_h account = NULL; + static int __ctsvc_server_bg_contact_delete_step1(__ctsvc_delete_data_s* data) { char query[CTS_SQL_MIN_LEN] = {0,}; @@ -376,6 +381,14 @@ static void __ctsvc_server_contact_deleted_cb(const char *view_uri, void *data) ctsvc_server_bg_delete_start(); } +static bool __ctsvc_server_account_delete_cb(const char* event_type, int account_id, void* user_data) +{ + SERVER_FN_CALL; + if (strcmp(event_type, ACCOUNT_NOTI_NAME_DELETE) == 0) + ctsvc_addressbook_delete(account_id); + return true; +} + void ctsvc_server_bg_add_cb() { int ret; @@ -383,6 +396,16 @@ void ctsvc_server_bg_add_cb() SERVER_DBG("call contacts_db_add_changed_cb (_contacts_address_book) : return (%d)", ret); ret = contacts_db_add_changed_cb(_contacts_contact._uri, __ctsvc_server_contact_deleted_cb, NULL); SERVER_DBG("call contacts_db_add_changed_cb (_contacts_contact): return (%d)", ret); + + ret = account_subscribe_create(&account); + if (ACCOUNT_ERROR_NONE == ret) { + ret = account_subscribe_notification(account, __ctsvc_server_account_delete_cb, NULL); + if (ACCOUNT_ERROR_NONE != ret) { + SERVER_DBG("account_subscribe_notification Failed (%d)", ret); + } + } + else + SERVER_DBG("account_subscribe_create Failed (%d)", ret); } void ctsvc_server_bg_remove_cb() @@ -392,5 +415,10 @@ void ctsvc_server_bg_remove_cb() SERVER_DBG("call contacts_db_remove_changed_cb (_contacts_address_book): return (%d)", ret); ret = contacts_db_remove_changed_cb(_contacts_contact._uri, __ctsvc_server_contact_deleted_cb, NULL); SERVER_DBG("call contacts_db_remove_changed_cb (_contacts_contact) : return (%d)", ret); + + if (account) { + account_unsubscribe_notification(account); // unsubscirbe & destroy + account = NULL; + } }