#include <gio/gunixfdlist.h>
#include <unistd.h>
#endif
+#include <pthread.h>
#include <vconf.h>
#include <dbg.h>
#define VCONF_OK 0
+static GDBusConnection *_connection = NULL;
static AccountManager *_acc_mgr = NULL;
+static int _instance_count = 0;
+static pthread_mutex_t _account_proxy_instance_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static void _account_manager_increase_count()
+{
+ _instance_count++;
+}
+
+static void _account_manager_decrease_count()
+{
+ _instance_count--;
+}
+
+static void _account_manager_destroy_instance()
+{
+ g_object_unref(_connection);
+ _connection = NULL;
+ g_object_unref(_acc_mgr);
+ _acc_mgr = NULL;
+}
+
+static void _account_manager_release_instance()
+{
+ pthread_mutex_lock(&_account_proxy_instance_mutex);
+ _account_manager_decrease_count();
+
+ if (_instance_count <= 0)
+ _account_manager_destroy_instance();
+ pthread_mutex_unlock(&_account_proxy_instance_mutex);
+}
static char *_account_get_text(const char *text_data)
{
return text_value;
}
-AccountManager *
+static AccountManager *
_account_manager_get_instance()
{
_INFO("_account_manager_get_instance");
+ pthread_mutex_lock(&_account_proxy_instance_mutex);
if (_acc_mgr != NULL) {
_INFO("instance already created.");
+ _account_manager_increase_count();
+ pthread_mutex_unlock(&_account_proxy_instance_mutex);
return _acc_mgr;
}
g_type_init();
#endif
- GDBusConnection *connection = NULL;
GError *error = NULL;
- connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+ _connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
_INFO("after g_bus_get_sync");
- if (!connection) {
+ if (!_connection) {
if (error) {
_ERR("Unable to connect to gdbus: %s", error->message);
g_clear_error(&error);
}
+ pthread_mutex_unlock(&_account_proxy_instance_mutex);
return NULL;
}
/* Create the object */
_acc_mgr =
- account_manager_proxy_new_sync(connection,
+ account_manager_proxy_new_sync(_connection,
G_DBUS_PROXY_FLAGS_NONE,
"org.tizen.account.manager",
"/org/tizen/account/manager",
_ERR("Unable account_manager_proxy_new_sync: %s", error->message);
g_clear_error(&error);
}
- if (connection)
- g_object_unref(connection);
+ if (_connection) {
+ g_object_unref(_connection);
+ _connection = NULL;
+ }
+ pthread_mutex_unlock(&_account_proxy_instance_mutex);
return NULL;
}
g_clear_error(&error);
+
+ _account_manager_increase_count();
_INFO("_account_manager_get_instance end");
+ pthread_mutex_unlock(&_account_proxy_instance_mutex);
return _acc_mgr;
}
_INFO("3. Before account_manager_call_account_add_sync");
bool is_success = account_manager_call_account_add_sync(acc_mgr, account_serialized, (int)getuid(), &db_id, NULL, &error);
+ _account_manager_release_instance();
ACCOUNT_CATCH_ERROR((is_success != false), {}, _account_get_error_code(is_success, error), "Failed to get dbus.");
g_clear_error(&error);
CATCH:
g_clear_error(&error);
_ERR("account_manager_call_account_add_sync()=[%d]", error_code);
-
return error_code;
}
error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
_ERR("account_manager_call_account_query_account_by_account_id_sync failed [%d]", error_code);
+ _account_manager_release_instance();
return error_code;
}
g_clear_error(&error);
_INFO("3. Before account_manager_call_account_delete_from_db_by_id_sync");
is_success = account_manager_call_account_delete_from_db_by_id_sync(acc_mgr, account_db_id, (int)getuid(), NULL, &error);
+ _account_manager_release_instance();
if (!is_success) {
error_code = _account_get_error_code(is_success, error);
error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
if (error_code != ACCOUNT_ERROR_NONE) {
+ _account_manager_release_instance();
_ERR("account_query_account_by_user_name error=[%d]", error_code);
return error_code;
}
GSList *account_list = unmarshal_account_list(account_list_variant);
g_variant_unref(account_list_variant);
- if (account_list == NULL)
+ if (account_list == NULL) {
+ _account_manager_release_instance();
return ACCOUNT_ERROR_NO_DATA;
+ }
is_success = account_manager_call_account_delete_from_db_by_user_name_sync(acc_mgr, user_name, package_name, (int)getuid(), NULL, &error);
+ _account_manager_release_instance();
if (!is_success) {
error_code = _account_get_error_code(is_success, error);
error_code = _account_get_error_code(is_success, error);
if (error_code != ACCOUNT_ERROR_NONE)
{
+ _account_manager_release_instance();
return error_code;
}
_INFO("after unmarshal_account_list");
if (account_list == NULL)
{
+ _account_manager_release_instance();
return ACCOUNT_ERROR_NO_DATA;
}
*/
bool is_success = account_manager_call_account_delete_from_db_by_package_name_sync(acc_mgr, package_name, permission, (int)getuid(), NULL, &error);
+ _account_manager_release_instance();
if (!is_success) {
error_code = _account_get_error_code(is_success, error);
if (!is_success) {
error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
+ _account_manager_release_instance();
_ERR("account_manager_call_account_query_account_by_account_id_sync failed [%d]", error_code);
return error_code;
}
_INFO("3. Before account_manager_call_account_update_to_db_by_id_sync");
GVariant *account_serialized = marshal_account((account_s *)account);
is_success = account_manager_call_account_update_to_db_by_id_sync(acc_mgr, account_serialized, account_id, (int)getuid(), NULL, &error);
+ _account_manager_release_instance();
if (!is_success) {
error_code = _account_get_error_code(is_success, error);
error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
_ERR("account_manager_call_account_query_account_by_account_id_sync failed [%d]", error_code);
+ _account_manager_release_instance();
return error_code;
}
g_clear_error(&error);
_INFO("after marshal() : account_id[%d]", account_id);
if (account_serialized == NULL) {
_ERR("Invalid input");
+ _account_manager_release_instance();
return ACCOUNT_ERROR_INVALID_PARAMETER;
}
is_success = account_manager_call_account_update_to_db_by_id_ex_sync(acc_mgr, account_serialized, account_id, (int)getuid(), NULL, &error);
_INFO("after call update() : is_success=%d", is_success);
+ _account_manager_release_instance();
+
if (!is_success) {
error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
if (!is_success) {
error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
+ _account_manager_release_instance();
_ERR("account_manager_call_account_query_account_by_account_id_sync failed [%d]", error_code);
return error_code;
}
GVariant *account_serialized = marshal_account(account_data);
is_success = account_manager_call_account_update_to_db_by_user_name_sync(acc_mgr, account_serialized, user_name, package_name, (int)getuid(), NULL, &error);
+ _account_manager_release_instance();
if (!is_success) {
error_code = _account_get_error_code(is_success, error);
GVariant *account_list_variant = NULL;
bool is_success = account_manager_call_account_query_all_sync(acc_mgr, (int)getuid(), &account_list_variant, NULL, &error);
+ _account_manager_release_instance();
int error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
GVariant *account_variant = NULL;
bool is_success = account_manager_call_account_query_account_by_account_id_sync(acc_mgr, account_db_id, (int)getuid(), &account_variant, NULL, &error);
+ _account_manager_release_instance();
int error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
GVariant *account_list_variant = NULL;
bool is_success = account_manager_call_account_query_account_by_user_name_sync(acc_mgr, user_name, (int)getuid(), &account_list_variant, NULL, &error);
+ _account_manager_release_instance();
int error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
GVariant *account_list_variant = NULL;
bool is_success = account_manager_call_account_query_account_by_package_name_sync(acc_mgr, package_name, (int)getuid(), &account_list_variant, NULL, &error);
+ _account_manager_release_instance();
int error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
GVariant *account_list_variant = NULL;
bool is_success = account_manager_call_account_query_account_by_capability_sync(acc_mgr, capability_type, capability_value, (int)getuid(), &account_list_variant, NULL, &error);
+ _account_manager_release_instance();
int error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
GVariant *account_list_variant = NULL;
bool is_success = account_manager_call_account_query_account_by_capability_type_sync(acc_mgr, capability_type, (int)getuid(), &account_list_variant, NULL, &error);
+ _account_manager_release_instance();
int error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
GVariant *capability_list_variant = NULL;
bool is_success = account_manager_call_account_query_capability_by_account_id_sync(acc_mgr, account_id, (int)getuid(), &capability_list_variant, NULL, &error);
+ _account_manager_release_instance();
int error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
int temp_count = -1;
bool is_success = account_manager_call_account_get_total_count_from_db_sync(acc_mgr, include_hidden, (int)getuid(), &temp_count, NULL, &error);
+ _account_manager_release_instance();
+
int error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
if (error_code != ACCOUNT_ERROR_NONE)
}
bool is_success = account_manager_call_account_update_sync_status_by_id_sync(acc_mgr, account_db_id, sync_status, (int)getuid(), NULL, &error);
+ _account_manager_release_instance();
error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
GVariant *feature_list_variant = NULL;
bool is_success = account_manager_call_account_type_query_provider_feature_by_app_id_sync(acc_mgr, app_id, (int)getuid(), &feature_list_variant, NULL, &error);
+ _account_manager_release_instance();
_INFO("account_manager_call_account_type_query_provider_feature_by_app_id_sync end=[%d]", is_success);
}
bool is_success = account_manager_call_account_type_query_supported_feature_sync(acc_mgr, app_id, capability, (int)getuid(), &is_supported, NULL, &error);
+ _account_manager_release_instance();
_INFO("account_manager_call_account_type_query_supported_feature_sync end=[%d]", is_success);
int db_id = -1;
GVariant *account_type_serialized = marshal_account_type((account_type_s *)account_type);
bool is_success = account_manager_call_account_type_add_sync(acc_mgr, account_type_serialized, (int)getuid(), &db_id, NULL, &error);
+ _account_manager_release_instance();
int ret = _account_get_error_code(is_success, error);
g_clear_error(&error);
GVariant *account_type_variant = marshal_account_type((account_type_s *)account_type);
if (account_type_variant == NULL) {
_ERR("Failed to serialize");
+ _account_manager_release_instance();
return ACCOUNT_ERROR_INVALID_PARAMETER;
}
bool is_success = account_manager_call_account_type_update_to_db_by_app_id_sync(acc_mgr, account_type_variant, app_id, (int)getuid(), NULL, &error);
+ _account_manager_release_instance();
error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
}
bool is_success = account_manager_call_account_type_delete_by_app_id_sync(acc_mgr, app_id, (int)getuid(), NULL, &error);
+ _account_manager_release_instance();
error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);
GVariant *label_list_variant = NULL;
bool is_success = account_manager_call_account_type_query_label_by_app_id_sync(acc_mgr, app_id, (int)getuid(), &label_list_variant, NULL, &error);
+ _account_manager_release_instance();
int ret = _account_get_error_code(is_success, error);
g_clear_error(&error);
account_type_s *in_data = (account_type_s *)*account_type;
bool is_success = account_manager_call_account_type_query_by_app_id_sync(acc_mgr, app_id, (int)getuid(), &account_type_variant, NULL, &error);
+ _account_manager_release_instance();
int ret = _account_get_error_code(is_success, error);
g_clear_error(&error);
GVariant *account_type_list_variant = NULL;
_INFO("before account_type_query_all_sync()");
bool is_success = account_manager_call_account_type_query_all_sync(acc_mgr, (int)getuid(), &account_type_list_variant, NULL, &error);
+ _account_manager_release_instance();
_INFO("after account_type_query_all_sync()");
int ret = _account_get_error_code(is_success, error);
char *label_temp = NULL;
_INFO("before account_type_query_label_by_locale_sync()");
bool is_success = account_manager_call_account_type_query_label_by_locale_sync(acc_mgr, app_id, locale, (int)getuid(), &label_temp, NULL, &error);
+ _account_manager_release_instance();
_INFO("after account_type_query_label_by_locale_sync() : is_success=%d", is_success);
int ret = _account_get_error_code(is_success, error);
GVariant *account_type_list_variant = NULL;
bool is_success = account_manager_call_account_type_query_by_provider_feature_sync(acc_mgr, key, (int)getuid(), &account_type_list_variant, NULL, &error);
+ _account_manager_release_instance();
int ret = _account_get_error_code(is_success, error);
g_clear_error(&error);
}
bool is_success = account_manager_call_account_type_query_app_id_exist_sync(acc_mgr, app_id, (int)getuid(), NULL, &error);
+ _account_manager_release_instance();
error_code = _account_get_error_code(is_success, error);
g_clear_error(&error);