Merge from Master
authorDonghee Ye <donghee.ye@samsung.com>
Thu, 21 Mar 2013 13:33:06 +0000 (22:33 +0900)
committerDonghee Ye <donghee.ye@samsung.com>
Thu, 21 Mar 2013 13:33:06 +0000 (22:33 +0900)
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

24 files changed:
CMakeLists.txt
common/ctsvc_normalize.c
common/ctsvc_record_group.c
common/ctsvc_struct.h
common/ctsvc_view.c
common/ctsvc_view.h
common/ipc/ctsvc_ipc_group.c
contacts-service2.manifest
include/contacts.h
include/contacts_views.h
native/CMakeLists.txt
native/ctsvc_db_init.c
native/ctsvc_db_plugin_addressbook.c
native/ctsvc_db_plugin_addressbook_helper.c [new file with mode: 0644]
native/ctsvc_db_plugin_addressbook_helper.h [new file with mode: 0644]
native/ctsvc_db_plugin_contact.c
native/ctsvc_db_plugin_contact_helper.c
native/ctsvc_db_plugin_group.c
native/ctsvc_service.c
native/ctsvc_utils.c
packaging/contacts-service.spec
schema.sql
server/CMakeLists.txt
server/ctsvc_server_bg.c

index bd3ea75..e11bef7 100755 (executable)
@@ -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)
 
index 5dfa096..b56d2b8 100644 (file)
@@ -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;
index 7e3bcef..4a323b9 100644 (file)
@@ -84,7 +84,7 @@ static int __ctsvc_group_destroy(contacts_record_h record, bool delete_child)
        free(group->ringtone_path);\r
        free(group->vibration);\r
        free(group->image_thumbnail_path);\r
-       free(group->system_id);\r
+       free(group->extra_data);\r
        free(group);\r
 \r
        return CONTACTS_ERROR_NONE;\r
@@ -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;\r
        out_data->image_thumbnail_changed = src_data->image_thumbnail_changed;\r
        out_data->name = SAFE_STRDUP(src_data->name);\r
-       out_data->system_id = SAFE_STRDUP(src_data->system_id);\r
+       out_data->extra_data = SAFE_STRDUP(src_data->extra_data);\r
        out_data->vibration = SAFE_STRDUP(src_data->vibration);\r
        out_data->ringtone_path = SAFE_STRDUP(src_data->ringtone_path);\r
        out_data->image_thumbnail_path = SAFE_STRDUP(src_data->image_thumbnail_path);\r
@@ -151,8 +151,8 @@ static int __ctsvc_group_get_str_real(contacts_record_h record, unsigned int pro
        case CTSVC_PROPERTY_GROUP_VIBRATION:\r
                *out_str = GET_STR(copy, group->vibration);\r
                break;\r
-       case CTSVC_PROPERTY_GROUP_SYSTEM_ID:\r
-               *out_str = GET_STR(copy, group->system_id);\r
+       case CTSVC_PROPERTY_GROUP_EXTRA_DATA:\r
+               *out_str = GET_STR(copy, group->extra_data);\r
                break;\r
        default :\r
                ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(group)", property_id);\r
@@ -213,8 +213,8 @@ static int __ctsvc_group_set_str(contacts_record_h record, unsigned int property
        case CTSVC_PROPERTY_GROUP_VIBRATION:\r
                FREEandSTRDUP(group->vibration, str);\r
                break;\r
-       case CTSVC_PROPERTY_GROUP_SYSTEM_ID:\r
-               FREEandSTRDUP(group->system_id, str);\r
+       case CTSVC_PROPERTY_GROUP_EXTRA_DATA:\r
+               FREEandSTRDUP(group->extra_data, str);\r
                break;\r
        default :\r
                ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(group)", property_id);\r
index 53918a9..1225ce2 100644 (file)
@@ -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;
index 709ba3b..1c6f1f7 100644 (file)
@@ -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"},
 };
 
index 1658708..684eb2f 100644 (file)
@@ -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,
index 35efe16..ca69da1 100644 (file)
@@ -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;
index a47a145..952b4f0 100644 (file)
@@ -6,12 +6,13 @@
                </provide>
                <request>
                        <smack request="sys-assert::core" type="rwxat"/>
+                       <smack request="libaccounts-svc::db" type="rw"/>
                </request>
        </define>
        <assign>
-               <filesystem path="/usr/lib/libcontacts-service2.so.0.9.52.1" label="_"/>
+               <filesystem path="/usr/lib/libcontacts-service2.so.0.9.55" label="_"/>
                <filesystem path="/usr/lib/libcontacts-service2.so.0" label="_"/>
-               <filesystem path="/usr/lib/libcontacts-service3.so.0.9.52.1" label="_"/>
+               <filesystem path="/usr/lib/libcontacts-service3.so.0.9.55" 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"/>
index d859f91..1e904e0 100644 (file)
  * <tr><td>string</td><td> ringtone_path </td><td>read, write</td><td> </td></tr>
  * <tr><td>string</td><td> image_path </td><td>read, write</td><td> </td></tr>
  * <tr><td>string</td><td> vibration </td><td>read, write</td><td> </td></tr>
- * <tr><td>string</td><td> system_id </td><td>read, write</td><td> </td></tr>
+ * <tr><td>string</td><td> extra_data </td><td>read, write</td><td> </td></tr>
  * <tr><td>boolean</td><td> is_read_only </td><td>read only</td><td> </td></tr>
  * </table>
  *
  * <tr><td>boolean</td><td> has_email </td><td></td><td> </td></tr>
  * <tr><td>integer</td><td> address_book_id </td><td></td><td> </td></tr>
  * <tr><td>integer</td><td> group_id </td><td>*</td><td> </td></tr>
- * <tr><td>string</td><td> group_name </td><td></td><td> </td></tr>
  * </table>
  *
  * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_phone_log _contacts_person_phone_log view
index 621f166..4e21722 100755 (executable)
@@ -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
index 8636905..05527a2 100755 (executable)
@@ -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}")
index afdf171..7cedd43 100644 (file)
@@ -139,7 +139,6 @@ int ctsvc_db_plugin_init()
                int count = sizeof(__db_tables) /sizeof(db_table_info_s);
                for (i=0;i<count;i++)
                        g_hash_table_insert(__ctsvc_db_view_hash_table, __db_tables[i].view_uri, GINT_TO_POINTER(&(__db_tables[i])));
-
        }
        return CONTACTS_ERROR_NONE;
 }
@@ -735,11 +734,10 @@ static int __ctsvc_db_create_views()
        snprintf(query, sizeof(query),
                "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_GROUP" AS "
                        "SELECT * FROM "CTSVC_DB_VIEW_PERSON_CONTACT" "
-                       "LEFT JOIN (SELECT group_relations.group_id, "
-                                               "group_name, "
+                       "LEFT JOIN (SELECT group_id, "
                                                "contact_id contact_id_in_group "
-                                       "FROM "CTS_TABLE_GROUP_RELATIONS", "CTS_TABLE_GROUPS" "
-                                       "ON group_relations.group_id = groups.group_id AND deleted = 0) temp_group "
+                                       "FROM "CTS_TABLE_GROUP_RELATIONS" "
+                                       "WHERE deleted = 0) temp_group "
                        "ON temp_group.contact_id_in_group = "CTSVC_DB_VIEW_PERSON_CONTACT".contact_id");
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret);
@@ -862,6 +860,7 @@ int ctsvc_db_deinit()
                CTS_ERR("ctsvc_db_close() Failed(%d)", ret);
                return ret;
        }
+
        return CONTACTS_ERROR_NONE;
 }
 
index c338fa7..8b27e5c 100644 (file)
@@ -16,6 +16,7 @@
  * limitations under the License.
  *
  */
+#include <account.h>
 
 #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 (file)
index 0000000..8092ed9
--- /dev/null
@@ -0,0 +1,73 @@
+/*\r
+ * Contacts Service\r
+ *\r
+ * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ */\r
+\r
+#include "contacts.h"\r
+#include "ctsvc_internal.h"\r
+#include "ctsvc_sqlite.h"\r
+#include "ctsvc_schema.h"\r
+#include "ctsvc_utils.h"\r
+#include "ctsvc_person.h"\r
+#include "ctsvc_notification.h"\r
+#include "ctsvc_db_plugin_addressbook_helper.h"\r
+\r
+int ctsvc_addressbook_delete(int account_id)\r
+{\r
+       CTS_FN_CALL;\r
+       int ret;\r
+       char query[CTS_SQL_MAX_LEN] = {0};\r
+       RETVM_IF(account_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, "Account_id(%d) is invalid", account_id);\r
+\r
+       // delete addressbook whish has account_id\r
+       ret = ctsvc_begin_trans();\r
+       RETVM_IF (CONTACTS_ERROR_NONE != ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);\r
+\r
+       snprintf(query, sizeof(query), "DELETE FROM %s WHERE account_id = %d",\r
+                       CTS_TABLE_ADDRESSBOOKS, account_id);\r
+       ret = ctsvc_query_exec(query);\r
+       if (CONTACTS_ERROR_NONE != ret) {\r
+               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);\r
+               ctsvc_end_trans(false);\r
+               return ret;\r
+       }\r
+\r
+       ret = cts_db_change();\r
+       if (0 < ret) {\r
+               ctsvc_set_my_profile_noti();\r
+               ctsvc_set_contact_noti();\r
+               // person noti will set in ctsvc_person_do_garbage_collection : ctsvc_set_person_noti();\r
+               ctsvc_set_group_noti();\r
+               ctsvc_set_addressbook_noti();\r
+       }\r
+       else {\r
+               CTS_ERR("There is no addressbook which has account_id (%d)", account_id);\r
+               ctsvc_end_trans(false);\r
+               return CONTACTS_ERROR_NO_DATA;\r
+       }\r
+\r
+       ret = ctsvc_person_do_garbage_collection();\r
+       if (CONTACTS_ERROR_NONE != ret) {\r
+               CTS_ERR("DB error : cts_person_garbagecollection() Failed(%d)", ret);\r
+               ctsvc_end_trans(false);\r
+               return ret;\r
+       }\r
+\r
+       ctsvc_end_trans(true);\r
+       return CONTACTS_ERROR_NONE;\r
+}\r
+\r
diff --git a/native/ctsvc_db_plugin_addressbook_helper.h b/native/ctsvc_db_plugin_addressbook_helper.h
new file mode 100644 (file)
index 0000000..57767b2
--- /dev/null
@@ -0,0 +1,25 @@
+/*\r
+ * Contacts Service\r
+ *\r
+ * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ */\r
+\r
+#ifndef __CTSVC_DB_PLUGIN_ADDRESS_BOOK_HELPER_H__\r
+#define __CTSVC_DB_PLUGIN_ADDRESS_BOOK_HELPER_H__\r
+\r
+int ctsvc_addressbook_delete(int account_id);\r
+\r
+#endif // __CTSVC_DB_PLUGIN_ADDRESS_BOOK_HELPER_H__\r
index a47298b..1b064f5 100644 (file)
@@ -17,6 +17,7 @@
  *
  */
 #include <sys/types.h>
+#include <sys/syscall.h>
 #include <fcntl.h>
 #include <unistd.h>
 
@@ -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);
index c97623c..22c0bc7 100644 (file)
@@ -17,6 +17,7 @@
  *
  */
 #include <sys/types.h>
+#include <sys/syscall.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <vconf.h>
@@ -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)
index 1734b09..211aca6 100644 (file)
@@ -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);
index e57ea8f..6048306 100644 (file)
@@ -25,6 +25,8 @@
 #include <sys/un.h>
 #include <unistd.h>
 
+#include <account.h>
+
 #include "contacts.h"
 #include "ctsvc_internal.h"
 #include "ctsvc_socket.h"
 #include "ctsvc_db_init.h"
 #include "ctsvc_setting.h"
 
-#ifndef _CONTACTS_IPC_CLIENT
 static int ctsvc_connection = 0;
 static __thread int thread_connection = 0;
-#endif
 
 API int contacts_connect2()
 {
        CTS_FN_CALL;
        int ret;
 
-#ifndef _CONTACTS_IPC_CLIENT
        ctsvc_mutex_lock(CTS_MUTEX_CONNECTION);
        if (0 == ctsvc_connection) {
                ret = ctsvc_socket_init();
@@ -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;
 }
index 24e407e..0384aea 100644 (file)
@@ -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);
index 6552daa..0240570 100644 (file)
@@ -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
index 5a4875c..0d8a0d4 100755 (executable)
@@ -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
index 144fa1c..c0813b8 100755 (executable)
@@ -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}")
index 7416328..0d02a40 100644 (file)
 #include <stdlib.h>\r
 #include <unistd.h>    //sleep\r
 \r
+#include <account.h>
+
 #include "contacts.h"\r
 #include "internal.h"\r
 #include "ctsvc_schema.h"\r
 #include "ctsvc_sqlite.h"\r
 #include "ctsvc_server_bg.h"\r
 #include "ctsvc_utils.h"\r
+#include "ctsvc_db_plugin_addressbook_helper.h"
 \r
 #define CTSVC_SERVER_BG_DELETE_COUNT 50\r
 #define CTSVC_SERVER_BG_DELETE_STEP_TIME 1\r
@@ -50,6 +53,8 @@ GThread *__ctsvc_server_bg_delete_thread = NULL;
 GCond __ctsvc_server_bg_delete_cond;\r
 GMutex __ctsvc_server_bg_delete_mutex;\r
 \r
+account_subscribe_h account = NULL;
+
 static int __ctsvc_server_bg_contact_delete_step1(__ctsvc_delete_data_s* data)\r
 {\r
        char query[CTS_SQL_MIN_LEN] = {0,};\r
@@ -376,6 +381,14 @@ static void __ctsvc_server_contact_deleted_cb(const char *view_uri, void *data)
        ctsvc_server_bg_delete_start();
 }\r
 \r
+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()
 {\r
        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;
+       }
 }\r
 \r