*/
int stc_save_restriction_list(stc_restriction_list_h list_h);
+/**
+ * @brief Loads the restriction list.
+ * @since_tizen 5.5
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/network.get
+ *
+ * @param[in] stc The stc handle
+ * @param[in] list_cb The callback is called for each restriction list
+ * @param[in] user_data User data will be passed to the callback function
+ *
+ * @return 0 on success, otherwise a negative error value
+ * @retval #STC_ERROR_NONE Successful
+ * @retval #STC_ERROR_OPERATION_FAILED General error
+ * @retval #STC_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #STC_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #STC_ERROR_INVALID_OPERATION Invalid operation
+ * @retval #STC_ERROR_NOT_INITIALIZED Not initialized
+ * @retval #STC_ERROR_NOT_SUPPORTED Not supported
+ * @retval #STC_ERROR_PERMISSION_DENIED Permission denied
+ *
+ * @see #stc_restriction_list_h
+ * @see #stc_restriction_rule_h
+ * @see stc_initialize()
+ * @see stc_restriction_rule_create()
+ * @see stc_restriction_rule_destroy()
+ * @see stc_restriction_rule_set_app_id()
+ * @see stc_restriction_rule_set_iface_name()
+ * @see stc_restriction_rule_set_iface_type()
+ * @see stc_restriction_rule_set_limit()
+ * @see stc_restriction_rule_set_warning_limit()
+ * @see stc_restriction_rule_set_roaming_type()
+ * @see stc_restriction_rule_set_subscriber_id()
+ * @see stc_restriction_rule_get_app_id()
+ * @see stc_restriction_rule_get_iface_type()
+ * @see stc_restriction_rule_get_limit()
+ * @see stc_restriction_rule_get_warning_limit()
+ * @see stc_restriction_rule_get_roaming_type()
+ * @see stc_restriction_rule_get_subscriber_id()
+ * @see stc_restriction_rule_get_process_state()
+ * @see stc_restriction_list_create()
+ * @see stc_add_restriction_rule_to_list()
+ * @see stc_remove_restriction_rule_from_list()
+ * @see stc_set_restriction_list()
+ * @see stc_unset_restriction_list()
+ */
+int stc_load_restriction_list(stc_h stc, stc_restriction_list_cb list_cb, void *user_data);
+
/**
* @brief Sets the restriction list.
* @since_tizen 5.5
static GSList *g_restriction_rule = NULL;
static GSList *g_restriction_list = NULL;
+static GSList *g_restriction_load_list = NULL;
/*****************************************************************************
* Local Functions Definition
{
g_strlcpy(list->name, name, STC_LIST_NAME_LEN);
list->rules = NULL;
+ list->state = STC_RSTN_STATE_DEACTIVATED;
}
-static void __stc_restriction_deinit_list(stc_restriction_list_h list)
+static void __stc_restriction_deinit_list(stc_restriction_list_h list_h)
{
- g_free(list);
+ stc_restriction_list_s *data = (stc_restriction_list_s *)list_h;
+ g_slist_free_full(data->rules, __stc_restriction_deinit_rule);
+ g_free(list_h);
}
static void __stc_restriction_rule_make_params(
}
-static void __stc_restriction_print_rule(
- stc_restriction_rule_s *rule)
+static void __stc_restriction_extract_list_cb(const char *key,
+ GVariant *value, void *user_data)
+{
+ stc_restriction_list_s *restriction_list =
+ (stc_restriction_list_s *)user_data;
+
+ if (restriction_list == NULL)
+ return;
+
+ if (!g_strcmp0(key, STC_RESTRICTION_LIST_NAME)) {
+ const char *name = g_variant_get_string(value, NULL);
+ if (name != NULL)
+ g_strlcpy(restriction_list->name, name, STC_LIST_NAME_LEN);
+
+ } else if (!g_strcmp0(key, STC_RESTRICTION_LIST_STATE)) {
+ restriction_list->state = g_variant_get_uint16(value);
+
+ }
+
+}
+
+static void __stc_restriction_print_rule(stc_restriction_rule_s *rule)
{
STC_LOGD(STC_HR_SINGLE);
STC_LOGD(STC_HR_SINGLE);
}
+static void __stc_restriction_print_list(stc_restriction_list_s *list)
+{
+ STC_LOGD(STC_HR_SINGLE);
+
+ STC_LOGD("Name: [%s]", list->name);
+ STC_LOGD("State: [%u]", list->state);
+
+ STC_LOGD(STC_HR_SINGLE);
+}
+
+bool __stc_restriction_check_list_validity(stc_restriction_list_h list_h)
+{
+ if (!list_h)
+ return false;
+
+ if (g_slist_find(g_restriction_list, list_h))
+ return true;
+
+ return false;
+}
+
+static void __stc_restriction_load_list_reply(
+ GObject *source_object, GAsyncResult *res, gpointer user_data)
+{
+ GDBusConnection *conn = NULL;
+ GError *dbus_error = NULL;
+ GVariant *dbus_data = NULL;
+ GVariantIter *iter = NULL;
+ GVariantIter *iter_row = NULL;
+ stc_error_e dbus_result = STC_ERROR_NONE;
+ stc_error_e error = STC_ERROR_NONE;
+ stc_restriction_list_s *restriction_list = NULL;
+ stc_event_info_s event_data = { 0, };
+
+ conn = G_DBUS_CONNECTION(source_object);
+ dbus_data = g_dbus_connection_call_finish(conn, res, &dbus_error);
+ if (dbus_error != NULL) {
+ error = _stc_convert_error_string_to_enum(dbus_error->message);
+ g_error_free(dbus_error);
+ }
+
+ if (_stc_event_get_request_table_state(STC_REQUEST_TABLE_RESTRICTION_LOAD_LIST))
+ _stc_event_set_request_table_state(STC_REQUEST_TABLE_RESTRICTION_LOAD_LIST, false);
+
+ if (error == STC_ERROR_NONE) {
+ g_variant_get(dbus_data, "(iaa{sv})", &dbus_result, &iter);
+
+ _stc_restriction_clear_load_list();
+
+ while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
+ restriction_list = g_try_malloc0(sizeof(stc_restriction_list_s));
+ if (restriction_list) {
+ _stc_dbus_dictionary_foreach(iter_row,
+ __stc_restriction_extract_list_cb, restriction_list);
+
+ __stc_restriction_print_list(restriction_list);
+
+ _stc_restriction_add_to_load_list(restriction_list);
+ }
+ g_variant_iter_free(iter_row);
+ }
+ g_variant_iter_free(iter);
+
+ event_data.event = STC_EVENT_RESTRICTION_LOAD_LIST_RSP;
+ event_data.info_data = g_restriction_load_list;
+ event_data.datalength = 0;
+ event_data.error = dbus_result;
+ } else {
+ STC_LOGE("Load restriction list response error [%s]",
+ _stc_convert_error_type_to_string(error));
+
+ event_data.event = STC_EVENT_RESTRICTION_LOAD_LIST_RSP;
+ event_data.info_data = NULL;
+ event_data.datalength = 0;
+ event_data.error = error;
+ }
+
+ _stc_event_add_client_idle_cb(&event_data, user_data);
+}
+
static void __stc_restriction_get_per_app_id_reply(
GObject *source_object, GAsyncResult *res, gpointer user_data)
{
return false;
}
-bool _stc_restriction_add_rule_to_list(stc_restriction_list_h list,
+bool _stc_restriction_add_rule_to_list(stc_restriction_list_h list_h,
stc_restriction_rule_h rule)
{
- GSList *find = g_slist_find(g_restriction_list, list);
+ GSList *find = g_slist_find(g_restriction_list, list_h);
if (find) {
stc_restriction_list_s *list_data = (stc_restriction_list_s *)find->data;
list_data->rules = g_slist_append(list_data->rules, rule);
return true;
} else {
- return false;
+ find = g_slist_find(g_restriction_load_list, list_h);
+ if (find) {
+ stc_restriction_list_s *list_data = (stc_restriction_list_s *)find->data;
+ list_data->rules = g_slist_append(list_data->rules, rule);
+ return true;
+ } else {
+ return false;
+ }
}
}
-bool _stc_restriction_remove_rule_from_list(stc_restriction_list_h list,
+bool _stc_restriction_remove_rule_from_list(stc_restriction_list_h list_h,
stc_restriction_rule_h rule)
{
- GSList *find = g_slist_find(g_restriction_list, list);
+ GSList *find = g_slist_find(g_restriction_list, list_h);
if (find) {
stc_restriction_list_s *list_data = (stc_restriction_list_s *)find->data;
- list_data->rules = g_slist_append(list_data->rules, rule);
+ list_data->rules = g_slist_remove(list_data->rules, rule);
return true;
} else {
- return false;
+ find = g_slist_find(g_restriction_load_list, list_h);
+ if (find) {
+ stc_restriction_list_s *list_data = (stc_restriction_list_s *)find->data;
+ list_data->rules = g_slist_remove(list_data->rules, rule);
+ return true;
+ } else {
+ return false;
+ }
}
}
-void _stc_restriction_add_list(stc_restriction_list_h list)
+void _stc_restriction_add_to_list(stc_restriction_list_h list_h)
{
- g_restriction_list = g_slist_append(g_restriction_list, list);
+ g_restriction_list = g_slist_append(g_restriction_list, list_h);
}
-void _stc_restriction_remove_list(stc_restriction_list_h list)
+void _stc_restriction_remove_from_list(stc_restriction_list_h list_h)
{
- g_restriction_list = g_slist_remove(g_restriction_list, list);
+ g_restriction_list = g_slist_remove(g_restriction_list, list_h);
+ __stc_restriction_deinit_list(list_h);
}
-bool _stc_restriction_check_list_validity(stc_restriction_list_h list)
+bool _stc_restriction_check_list_validity(stc_restriction_list_h list_h)
{
- if (!list)
+ if (!list_h)
return false;
- if (g_slist_find(g_restriction_list, list))
+ if (g_slist_find(g_restriction_list, list_h))
return true;
- else
- return false;
+ else if (g_slist_find(g_restriction_load_list, list_h))
+ return true;
+
+ return false;
+}
+
+GSList * _stc_restriction_get_load_list_handle(void)
+{
+ return g_restriction_load_list;
+}
+
+void _stc_restriction_add_to_load_list(stc_restriction_list_h list_h)
+{
+ g_restriction_load_list = g_slist_append(g_restriction_load_list, list_h);
+}
+
+void _stc_restriction_remove_from_load_list(stc_restriction_list_h list_h)
+{
+ g_restriction_load_list = g_slist_remove(g_restriction_load_list, list_h);
+ __stc_restriction_deinit_list(list_h);
+}
+
+void _stc_restriction_clear_load_list(void)
+{
+ if (g_restriction_load_list) {
+ g_slist_free_full(g_restriction_load_list, __stc_restriction_deinit_list);
+ g_restriction_load_list = NULL;
+ }
}
stc_error_e _stc_restriction_save_list(stc_restriction_list_h list_h)
return STC_ERROR_NONE;
}
+stc_error_e _stc_restriction_load_list(void)
+{
+ stc_error_e error = STC_ERROR_NONE;
+
+ STC_RETURN_VAL_IF(_stc_event_get_ref_count() < 1,
+ STC_ERROR_NOT_INITIALIZED,
+ "Event callback is not registered");
+
+ STC_RETURN_VAL_IF(
+ _stc_event_get_request_table_state(
+ STC_REQUEST_TABLE_RESTRICTION_LOAD_LIST),
+ STC_ERROR_IN_PROGRESS,
+ "Request in progress");
+
+ _stc_event_set_request_table_state(
+ STC_REQUEST_TABLE_RESTRICTION_LOAD_LIST, true);
+
+ error = _stc_dbus_invoke_method_nonblock(
+ STC_MANAGER_SERVICE,
+ STC_MANAGER_RESTRICTION_PATH,
+ STC_MANAGER_RESTRICTION_INTERFACE,
+ STC_MANAGER_METHOD_RESTRICTION_LOAD_LIST,
+ NULL,
+ STC_DBUS_REPLY_TIMEOUT,
+ __stc_restriction_load_list_reply,
+ NULL);
+
+ if (error != STC_ERROR_NONE) {
+ STC_LOGE("Failed to invoke dbus method nonblock");
+
+ _stc_event_set_request_table_state(
+ STC_REQUEST_TABLE_RESTRICTION_LOAD_LIST, false);
+ return error;
+ }
+
+ return STC_ERROR_NONE;
+}
+
stc_error_e _stc_restriction_validate_rule(
stc_restriction_rule_h rule)
}
__stc_restriction_init_list(restriction_list, name);
- _stc_restriction_add_list((stc_restriction_list_h)restriction_list);
+ _stc_restriction_add_to_list((stc_restriction_list_h)restriction_list);
*list_h = (stc_restriction_list_h)restriction_list;
STC_LOGI("Restriction list successfully created [%s]", name);
return STC_ERROR_NONE;
}
-EXPORT_API int stc_restriction_list_destroy(stc_restriction_list_h list)
+EXPORT_API int stc_restriction_list_destroy(stc_restriction_list_h list_h)
{
CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_STC);
- if (_stc_restriction_check_list_validity(list) == false) {
+ if (__stc_restriction_check_list_validity(list_h) == false) {
STC_LOGE("Invalid parameter");
return STC_ERROR_INVALID_PARAMETER;
}
- _stc_restriction_remove_list(list);
- __stc_restriction_deinit_list(list);
+ _stc_restriction_remove_from_list(list_h);
STC_LOGI("Restriction list successfully destroyed");