ctsvc_client_handle_remove in CTS_MUTEX_CONNECTION during disconnect_on_thread
[platform/core/pim/contacts-service.git] / client / ctsvc_client_service_helper.c
index ffff946..83d5d42 100644 (file)
@@ -31,6 +31,7 @@
 #include "ctsvc_mutex.h"
 #include "ctsvc_inotify.h"
 #include "ctsvc_client_ipc.h"
+#include "ctsvc_client_utils.h"
 #include "ctsvc_client_handle.h"
 #include "ctsvc_client_service_helper.h"
 
@@ -75,16 +76,14 @@ int ctsvc_client_connect_with_flags(contacts_h contact, unsigned int flags)
        return ret;
 }
 
-static void _ctsvc_ipc_disconnected_cb(void *user_data)
-{
-       ctsvc_ipc_set_disconnected(true);
-}
-
 static void _ctsvc_ipc_initialized_cb(void *user_data)
 {
-       ctsvc_ipc_recovery();
-       ctsvc_ipc_recover_for_change_subscription();
-       ctsvc_ipc_set_disconnected(false);
+       CTS_FN_CALL;
+       if (true == ctsvc_ipc_get_disconnected()) {
+               ctsvc_ipc_set_disconnected(false);
+               ctsvc_ipc_recovery();
+               ctsvc_ipc_recover_for_change_subscription();
+       }
 }
 
 int ctsvc_client_connect(contacts_h contact)
@@ -92,13 +91,11 @@ int ctsvc_client_connect(contacts_h contact)
        CTS_FN_CALL;
        int ret;
        ctsvc_base_s *base = (ctsvc_base_s *)contact;
+       RETV_IF(NULL == base, CONTACTS_ERROR_INVALID_PARAMETER);
 
        ctsvc_mutex_lock(CTS_MUTEX_CONNECTION);
        if (0 == base->connection_count) {
-               char ipc_key[CTSVC_STR_SHORT_LEN] = {0};
-               ctsvc_ipc_get_pid_str(ipc_key, sizeof(ipc_key));
-
-               ret = ctsvc_ipc_connect(contact, ipc_key);
+               ret = ctsvc_ipc_connect(contact, ctsvc_client_get_pid());
                if (ret != CONTACTS_ERROR_NONE) {
                        CTS_ERR("ctsvc_ipc_connect() Fail(%d)", ret);
                        ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION);
@@ -124,7 +121,6 @@ int ctsvc_client_connect(contacts_h contact)
                }
                ctsvc_view_uri_init();
                ctsvc_ipc_create_for_change_subscription();
-               ctsvc_ipc_set_disconnected_cb(_ctsvc_ipc_disconnected_cb, NULL);
        }
        else
                CTS_DBG("System : Contacts service has been already connected(%d)", _ctsvc_connection + 1);
@@ -142,42 +138,44 @@ int ctsvc_client_disconnect(contacts_h contact)
 {
        CTS_FN_CALL;
        int ret;
+       ctsvc_base_s *base = (ctsvc_base_s *)contact;
+       RETV_IF(NULL == base, CONTACTS_ERROR_INVALID_PARAMETER);
+
        ctsvc_mutex_lock(CTS_MUTEX_CONNECTION);
 
-       ctsvc_base_s *base = (ctsvc_base_s *)contact;
        if (1 == base->connection_count) {
-               char ipc_key[CTSVC_STR_SHORT_LEN] = {0};
-               ctsvc_ipc_get_pid_str(ipc_key, sizeof(ipc_key));
-
-               ret = ctsvc_ipc_disconnect(contact, ipc_key, _ctsvc_connection);
+               ret = ctsvc_ipc_disconnect(contact, ctsvc_client_get_pid(), _ctsvc_connection);
                if (ret != CONTACTS_ERROR_NONE) {
                        ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION);
                        CTS_ERR("ctsvc_ipc_disconnect() Fail(%d)", ret);
                        return ret;
                }
                ctsvc_inotify_unsubscribe_ipc_ready(contact);
-               ctsvc_client_handle_remove((contacts_h)base);
-       }
-       else {
-               base->connection_count--;
        }
+       base->connection_count--;
 
        if (1 == _ctsvc_connection) {
                ctsvc_ipc_destroy_for_change_subscription();
                ctsvc_view_uri_deinit();
                ctsvc_inotify_close();
                ctsvc_socket_final();
-               ctsvc_ipc_unset_disconnected_cb();
+
        }
        else if (1 < _ctsvc_connection)
                CTS_DBG("System : connection count is %d", _ctsvc_connection);
        else {
                CTS_DBG("System : please call contacts_connect(), connection count is (%d)", _ctsvc_connection);
                ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               return CONTACTS_ERROR_DB;
        }
 
        _ctsvc_connection--;
+
+       if (0 == base->connection_count) {
+               CTS_INFO("connection_count is 0. remove handle");
+               ret = ctsvc_client_handle_remove(ctsvc_client_get_pid(), contact);
+               WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_client_handle_remove() Fail(%d)", ret);
+       }
        ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION);
 
        return CONTACTS_ERROR_NONE;
@@ -187,15 +185,12 @@ int ctsvc_client_connect_on_thread(contacts_h contact)
 {
        int ret;
        ctsvc_base_s *base = (ctsvc_base_s *)contact;
+       RETV_IF(NULL == base, CONTACTS_ERROR_INVALID_PARAMETER);
 
        ctsvc_mutex_lock(CTS_MUTEX_CONNECTION);
 
        if (0 == base->connection_count) {
-
-               char ipc_key[CTSVC_STR_SHORT_LEN] = {0};
-               ctsvc_ipc_get_tid_str(ipc_key, sizeof(ipc_key));
-
-               ret = ctsvc_ipc_connect(contact, ipc_key);
+               ret = ctsvc_ipc_connect(contact, ctsvc_client_get_tid());
                if (ret != CONTACTS_ERROR_NONE) {
                        CTS_ERR("ctsvc_ipc_connect() Fail(%d)", ret);
                        ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION);
@@ -221,7 +216,6 @@ int ctsvc_client_connect_on_thread(contacts_h contact)
                }
                ctsvc_view_uri_init();
                ctsvc_ipc_create_for_change_subscription();
-               ctsvc_ipc_set_disconnected_cb(_ctsvc_ipc_disconnected_cb, NULL);
        }
        else if (0 < _ctsvc_connection_on_thread)
                CTS_DBG("System : Contacts service has been already connected");
@@ -240,32 +234,26 @@ int ctsvc_client_disconnect_on_thread(contacts_h contact)
 {
        int ret;
        ctsvc_base_s *base = (ctsvc_base_s *)contact;
+       RETV_IF(NULL == base, CONTACTS_ERROR_INVALID_PARAMETER);
 
        ctsvc_mutex_lock(CTS_MUTEX_CONNECTION);
 
        if (1 == base->connection_count) {
-               char ipc_key[CTSVC_STR_SHORT_LEN] = {0};
-               ctsvc_ipc_get_tid_str(ipc_key, sizeof(ipc_key));
-
-               ret = ctsvc_ipc_disconnect(contact, ipc_key, _ctsvc_connection_on_thread);
+               ret = ctsvc_ipc_disconnect(contact, ctsvc_client_get_tid(), _ctsvc_connection_on_thread);
                if (ret != CONTACTS_ERROR_NONE) {
-                       CTS_ERR("ctsvc_ipc_disconnect_on_thread() Fail(%d)", ret);
+                       CTS_ERR("ctsvc_ipc_disconnect() Fail(%d)", ret);
                        ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION);
                        return ret;
                }
                ctsvc_inotify_unsubscribe_ipc_ready(contact);
-               ctsvc_client_handle_remove((contacts_h)base);
-       }
-       else {
-               base->connection_count--;
        }
+       base->connection_count--;
 
        if (1 == _ctsvc_connection_on_thread) {
                ctsvc_ipc_destroy_for_change_subscription();
                ctsvc_view_uri_deinit();
                ctsvc_inotify_close();
                ctsvc_socket_final();
-               ctsvc_ipc_unset_disconnected_cb();
                CTS_DBG("System : connection_on_thread was destroyed successfully");
        }
        else if (1 < _ctsvc_connection_on_thread) {
@@ -274,11 +262,16 @@ int ctsvc_client_disconnect_on_thread(contacts_h contact)
        else {
                CTS_DBG("System : please call contacts_connect_on_thread(), connection count is (%d)", _ctsvc_connection_on_thread);
                ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               return CONTACTS_ERROR_DB;
        }
 
        _ctsvc_connection_on_thread--;
 
+       if (0 == base->connection_count) {
+               CTS_INFO("connection_count is 0. remove handle");
+               ret = ctsvc_client_handle_remove(ctsvc_client_get_tid(), contact);
+               WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_client_handle_remove() Fail(%d)", ret);
+       }
        ctsvc_mutex_unlock(CTS_MUTEX_CONNECTION);
 
        return CONTACTS_ERROR_NONE;