char *appid;
char *object_path;
char *unique_id;
+ data_control_h provider;
} datacontrol_consumer_info;
typedef struct {
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;
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,
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()
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);
_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);
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;
}
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;
}
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;
}
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;
}
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);
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,
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;
}
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");
_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");
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) {
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,