Add internal send change noti API for c# API 27/192627/3
authorjusung son <jusung07.son@samsung.com>
Wed, 7 Nov 2018 05:56:16 +0000 (14:56 +0900)
committerjusung son <jusung07.son@samsung.com>
Thu, 8 Nov 2018 00:04:36 +0000 (09:04 +0900)
 - data_control_provider_send_data_change_noti_by_data_id

Change-Id: I8e631da830381e4795e79dd03ee48099021e6a03
Signed-off-by: jusung son <jusung07.son@samsung.com>
src/data_control_provider.c

index 1962df9978755716af22d1048577595cf6682791..61639a5847732ea88c42651559bfe88460e8d8fb 100755 (executable)
@@ -82,6 +82,7 @@ typedef struct datacontrol_consumer {
        char *appid;
        char *object_path;
        char *unique_id;
+       data_control_h provider;
 } datacontrol_consumer_info;
 
 typedef struct {
@@ -185,7 +186,26 @@ static int __noti_consumer_app_list_compare_cb(gconstpointer a, gconstpointer b)
        return strcmp(info_a->unique_id, info_b->unique_id);
 }
 
-static void __free_consumer_info(const gchar *name)
+static void __free_consumer_info(datacontrol_consumer_info *info)
+{
+       if (info == NULL)
+               return;
+
+       if (info->appid)
+               free(info->appid);
+       if (info->object_path)
+               free(info->object_path);
+       if (info->unique_id)
+               free(info->unique_id);
+       if (info->provider)
+               _destroy_data_control_h(info->provider, false);
+       if (info->monitor_id > 0)
+               g_bus_unwatch_name(info->monitor_id);
+
+       free(info);
+}
+
+static void __free_consumer_info_by_name(const gchar *name)
 {
        datacontrol_consumer_info find_key;
        datacontrol_consumer_info *info;
@@ -205,18 +225,11 @@ static void __free_consumer_info(const gchar *name)
        if (result != DATA_CONTROL_ERROR_NONE)
                _LOGE("__delete_consumer_list_db_info fail %d", result);
 
-       if (info->appid)
-               free(info->appid);
-       if (info->object_path)
-               free(info->object_path);
-       if (info->unique_id)
-               free(info->unique_id);
-       g_bus_unwatch_name(info->monitor_id);
-
        __noti_consumer_app_list =
                g_list_remove(__noti_consumer_app_list, find_list->data);
 
-       free(info);
+       __free_consumer_info(info);
+
        _LOGI("__free_consumer_info done");
 }
 static int __check_consumer_cert(const char *provider_id,
@@ -356,7 +369,7 @@ static void __on_name_vanished(GDBusConnection *connection,
                gpointer         user_data)
 {
        _LOGI("name vanished : %s", name);
-       __free_consumer_info(name);
+       __free_consumer_info_by_name(name);
 }
 
 static int __init_changed_noti_consumer_list()
@@ -364,13 +377,16 @@ static int __init_changed_noti_consumer_list()
        char *app_id = NULL;
        char *unique_id = NULL;
        char *object_path = NULL;
+       char *provider_id = NULL;
+       char *data_id = NULL;
        int ret = DATA_CONTROL_ERROR_NONE;
        sqlite3_stmt *stmt = NULL;
        char query[QUERY_MAXLEN];
        datacontrol_consumer_info *consumer_info = NULL;
+       data_control_h provider = NULL;
 
        sqlite3_snprintf(QUERY_MAXLEN, query,
-                       "SELECT app_id, object_path, unique_id " \
+                       "SELECT app_id, object_path, unique_id, provider_id, data_id " \
                        "FROM data_control_consumer_path_list");
 
        _LOGI("__init_changed_noti_consumer_list query : %s", query);
@@ -398,6 +414,19 @@ static int __init_changed_noti_consumer_list()
                        _LOGE("Failed to get unique_id\n");
                        continue;
                }
+
+               provider_id = (char *)sqlite3_column_text(stmt, 3);
+               if (!provider_id) {
+                       _LOGE("Failed to get provider_id\n");
+                       continue;
+               }
+
+               data_id = (char *)sqlite3_column_text(stmt, 4);
+               if (!data_id) {
+                       _LOGE("Failed to get data_id\n");
+                       continue;
+               }
+
                _LOGI("sql : app_id : %s, object_path : %s, unique_id : %s",
                                app_id, object_path, unique_id);
 
@@ -412,7 +441,7 @@ static int __init_changed_noti_consumer_list()
                consumer_info->appid = strdup(app_id);
                if (consumer_info->appid == NULL) {
                        _LOGE("out of memory.");
-                       free(consumer_info);
+                       __free_consumer_info(consumer_info);
                        ret = DATA_CONTROL_ERROR_OUT_OF_MEMORY;
                        break;
                }
@@ -420,8 +449,7 @@ static int __init_changed_noti_consumer_list()
                consumer_info->object_path = strdup(object_path);
                if (consumer_info->object_path == NULL) {
                        _LOGE("out of memory.");
-                       free(consumer_info->appid);
-                       free(consumer_info);
+                       __free_consumer_info(consumer_info);
                        ret = DATA_CONTROL_ERROR_OUT_OF_MEMORY;
                        break;
                }
@@ -429,9 +457,32 @@ static int __init_changed_noti_consumer_list()
                consumer_info->unique_id = strdup(unique_id);
                if (consumer_info->unique_id == NULL) {
                        _LOGE("out of memory.");
-                       free(consumer_info->appid);
-                       free(consumer_info->object_path);
-                       free(consumer_info);
+                       __free_consumer_info(consumer_info);
+                       ret = DATA_CONTROL_ERROR_OUT_OF_MEMORY;
+                       break;
+               }
+
+               ret = _create_data_control_h(&provider);
+               if (ret != DATA_CONTROL_ERROR_NONE) {
+                       _LOGE("out of memory.");
+                       __free_consumer_info(consumer_info);
+                       ret = DATA_CONTROL_ERROR_OUT_OF_MEMORY;
+                       break;
+               }
+               consumer_info->provider = provider;
+
+               provider->provider_id = strdup(provider_id);
+               if (provider->provider_id == NULL) {
+                       _LOGE("out of memory.");
+                       __free_consumer_info(consumer_info);
+                       ret = DATA_CONTROL_ERROR_OUT_OF_MEMORY;
+                       break;
+               }
+
+               provider->data_id = strdup(data_id);
+               if (provider->data_id == NULL) {
+                       _LOGE("out of memory.");
+                       __free_consumer_info(consumer_info);
                        ret = DATA_CONTROL_ERROR_OUT_OF_MEMORY;
                        break;
                }
@@ -447,11 +498,7 @@ static int __init_changed_noti_consumer_list()
 
                if (consumer_info->monitor_id == 0) {
                        _LOGE("g_bus_watch_name_on_connection fail");
-
-                       free(consumer_info->appid);
-                       free(consumer_info->object_path);
-                       free(consumer_info->unique_id);
-                       free(consumer_info);
+                       __free_consumer_info(consumer_info);
                        continue;
                }
 
@@ -594,14 +641,13 @@ static int __insert_consumer_list_db_info(char *app_id, char *provider_id,
        return DATA_CONTROL_ERROR_NONE;
 }
 
-static int __set_consumer_app_list(
-               char *caller,
-               char *object_path,
-               char *unique_id)
+static int __set_consumer_app_list(char *caller, char *object_path,
+               char *unique_id, char *provider_id, char *data_id)
 {
        datacontrol_consumer_info find_key;
        datacontrol_consumer_info *consumer_info;
        GList *find_list = NULL;
+       data_control_h provider = NULL;
        int ret = DATA_CONTROL_ERROR_NONE;
        _LOGI("set consumer_app_list caller : %s, path : %s, unique_id : %s",
                        caller, object_path, unique_id);
@@ -640,6 +686,29 @@ static int __set_consumer_app_list(
                        goto EXCEPTION;
                }
 
+               ret = _create_data_control_h(&provider);
+               if (ret != DATA_CONTROL_ERROR_NONE) {
+                       _LOGE("out of memory.");
+                       ret = DATA_CONTROL_ERROR_OUT_OF_MEMORY;
+                       goto EXCEPTION;
+               }
+               consumer_info->provider = provider;
+
+               provider->provider_id = strdup(provider_id);
+               if (provider->provider_id == NULL) {
+                       _LOGE("out of memory.");
+                       ret = DATA_CONTROL_ERROR_OUT_OF_MEMORY;
+                       goto EXCEPTION;
+               }
+
+               provider->data_id = strdup(data_id);
+               if (provider->data_id == NULL) {
+                       _LOGE("out of memory.");
+                       __free_consumer_info(consumer_info);
+                       ret = DATA_CONTROL_ERROR_OUT_OF_MEMORY;
+                       goto EXCEPTION;
+               }
+
                consumer_info->monitor_id = g_bus_watch_name_on_connection(
                                _get_dbus_connection(),
                                consumer_info->unique_id,
@@ -663,16 +732,7 @@ static int __set_consumer_app_list(
        return ret;
 
 EXCEPTION:
-       if (consumer_info) {
-               if (consumer_info->appid)
-                       free(consumer_info->appid);
-               if (consumer_info->object_path)
-                       free(consumer_info->object_path);
-               if (consumer_info->unique_id)
-                       free(consumer_info->unique_id);
-
-               free(consumer_info);
-       }
+       __free_consumer_info(consumer_info);
        return ret;
 }
 
@@ -1449,7 +1509,9 @@ static int __provider_noti_process(bundle *b, datacontrol_request_type type)
                        result = __set_consumer_app_list(
                                        caller_app_id,
                                        path,
-                                       unique_id);
+                                       unique_id,
+                                       provider->provider_id,
+                                       provider->data_id);
                        if (result != DATA_CONTROL_ERROR_NONE)
                                _LOGE("fail to __set_consumer_app_list");
 
@@ -1464,7 +1526,7 @@ static int __provider_noti_process(bundle *b, datacontrol_request_type type)
                _LOGI("DATACONTROL_NOTI_REMOVE_DATA_CHANGED_CB called");
                result_type = DATACONTROL_DATA_CHANGE_CALLBACK_REMOVE_RESULT;
                if (__noti_consumer_app_list) {
-                       __free_consumer_info(unique_id);
+                       __free_consumer_info_by_name(unique_id);
                        _LOGI("unregister %s from __noti_consumer_app_list", unique_id);
                } else {
                        _LOGI("empty __consumer_app_list");
@@ -2932,7 +2994,7 @@ EXPORT_API int data_control_provider_send_data_change_noti(
                        type > DATA_CONTROL_DATA_CHANGE_MAP_REMOVE)
                return DATA_CONTROL_ERROR_INVALID_PARAMETER;
 
-       _LOGE("datacontrol_provider_send_data_change_noti %d, %d",
+       _LOGI("datacontrol_provider_send_data_change_noti %d, %d",
                        g_list_length(__noti_consumer_app_list), type);
        consumer_iter = g_list_first(__noti_consumer_app_list);
        for (; consumer_iter != NULL; consumer_iter = consumer_iter->next) {
@@ -2955,6 +3017,50 @@ EXPORT_API int data_control_provider_send_data_change_noti(
        return retval;
 }
 
+EXPORT_API int data_control_provider_send_data_change_noti_by_data_id(
+               char *data_id, data_control_data_change_type_e type, bundle *data)
+{
+       int retval = _check_privilege(PRIVILEGE_PROVIDER);
+       GList *consumer_iter = NULL;
+       datacontrol_consumer_info *consumer_info = NULL;
+
+       if (retval != DATA_CONTROL_ERROR_NONE)
+               return retval;
+
+       if (data_id == NULL)
+               return DATA_CONTROL_ERROR_INVALID_PARAMETER;
+
+       if (type < DATA_CONTROL_DATA_CHANGE_SQL_UPDATE ||
+                       type > DATA_CONTROL_DATA_CHANGE_MAP_REMOVE)
+               return DATA_CONTROL_ERROR_INVALID_PARAMETER;
+
+       _LOGI("datacontrol_provider_send_data_change_noti %d, %d",
+                       g_list_length(__noti_consumer_app_list), type);
+       consumer_iter = g_list_first(__noti_consumer_app_list);
+       for (; consumer_iter != NULL; consumer_iter = consumer_iter->next) {
+               consumer_info = (datacontrol_consumer_info *)consumer_iter->data;
+               if (strcmp(data_id, consumer_info->provider->data_id) != 0)
+                       continue;
+
+               if (__check_consumer_cert(consumer_info->provider->provider_id,
+                                       consumer_info->appid,
+                                       type) != DATA_CONTROL_ERROR_NONE)
+                       continue;
+
+               retval = __send_signal_to_consumer(
+                               consumer_info->provider,
+                               consumer_info->unique_id,
+                               consumer_info->object_path,
+                               type,
+                               data);
+               if (retval != DATA_CONTROL_ERROR_NONE) {
+                       _LOGE("__send_signal_to_consumer fail : %d", retval);
+                       break;
+               }
+       }
+       return retval;
+}
+
 EXPORT_API int data_control_provider_foreach_data_change_consumer(
                data_control_h provider,
                data_control_provider_data_change_consumer_cb list_cb,