2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include "table-restrictions.h"
19 #include "stc-restriction.h"
20 #include "stc-manager-gdbus.h"
21 #include "stc-monitor.h"
23 #define RESTRICTION_DBUS_ERROR_NAME "net.stc.restriction.Error.Failed"
25 #define STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, err_num) \
26 g_dbus_method_invocation_return_dbus_error((invocation), \
27 RESTRICTION_DBUS_ERROR_NAME, \
28 stc_err_strs[-(err_num)])
30 static const gchar *stc_err_strs[] = {
43 void __initialize_rstn_rule(table_restrictions_info *rule)
47 rule->iftype = STC_IFACE_ALL;
48 rule->rstn_type = STC_RSTN_TYPE_UNKNOWN;
50 rule->data_warn_limit = 0;
51 rule->roaming = STC_ROAMING_DISABLE;
52 rule->subscriber_id = NULL;
55 gboolean __validate_rstn_rule(table_restrictions_info *rule,
56 enum traffic_restriction_type rstn_type)
58 __STC_LOG_FUNC_ENTER__;
61 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
62 return FALSE; //LCOV_EXCL_LINE
65 if (rstn_type <= RST_UNDEFINDED || rstn_type >= RST_MAX_VALUE) {
66 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
67 return FALSE; //LCOV_EXCL_LINE
70 if (rule->iftype <= STC_IFACE_UNKNOWN ||
71 rule->iftype >= STC_IFACE_LAST_ELEM) {
72 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
73 return FALSE; //LCOV_EXCL_LINE
76 if (rule->roaming >= STC_ROAMING_LAST_ELEM) {
77 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
78 return FALSE; //LCOV_EXCL_LINE
81 if (rule->subscriber_id == NULL) {
82 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
83 return FALSE; //LCOV_EXCL_LINE
86 if (rule->app_id == NULL) {
87 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
88 return FALSE; //LCOV_EXCL_LINE
91 __STC_LOG_FUNC_EXIT__;
95 void __stc_restriction_app_info_builder_add(GVariantBuilder *builder,
96 const table_restrictions_info *info)
98 __STC_LOG_FUNC_ENTER__;
100 if (!builder || !info) {
101 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
102 return; //LCOV_EXCL_LINE
105 g_variant_builder_add(builder, "{sv}", "app_id",
106 g_variant_new_string(info->app_id));
108 g_variant_builder_add(builder, "{sv}", "ifname",
109 g_variant_new_string(info->ifname));
111 g_variant_builder_add(builder, "{sv}", "iftype",
112 g_variant_new_uint16(info->iftype));
114 g_variant_builder_add(builder, "{sv}", "rstn_type",
115 g_variant_new_uint16(info->rstn_type));
117 g_variant_builder_add(builder, "{sv}", "data_limit",
118 g_variant_new_int64(info->data_limit));
120 g_variant_builder_add(builder, "{sv}", "data_warn_limit",
121 g_variant_new_int64(info->data_warn_limit));
123 g_variant_builder_add(builder, "{sv}", "roaming",
124 g_variant_new_uint16(info->roaming));
126 g_variant_builder_add(builder, "{sv}", "subscriber_id",
127 g_variant_new_string(info->subscriber_id));
129 __STC_LOG_FUNC_EXIT__;
132 stc_cb_ret_e __table_restrictions_foreach_app_cb(const table_restrictions_info *info,
135 __STC_LOG_FUNC_ENTER__;
136 GVariantBuilder *builder = (GVariantBuilder *)user_data;
137 GVariantBuilder sub_builder;
139 if (!info || !builder) {
140 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
141 return STC_CANCEL; //LCOV_EXCL_LINE
144 g_variant_builder_init(&sub_builder, G_VARIANT_TYPE("a{sv}"));
145 __stc_restriction_app_info_builder_add(&sub_builder, info);
147 g_variant_builder_add_value(builder,
148 g_variant_builder_end(&sub_builder));
150 __STC_LOG_FUNC_EXIT__;
154 stc_cb_ret_e __table_restrictions_per_app_cb(const table_restrictions_info *info,
157 __STC_LOG_FUNC_ENTER__;
158 GVariantBuilder *builder = (GVariantBuilder *)user_data;
160 if (!info || !builder) {
161 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
162 return STC_CANCEL; //LCOV_EXCL_LINE
165 __stc_restriction_app_info_builder_add(builder, info);
167 __STC_LOG_FUNC_EXIT__;
171 static void __stc_extract_restriction_rule(const char *key, GVariant *value,
174 __STC_LOG_FUNC_ENTER__;
176 table_restrictions_info *rule =
177 (table_restrictions_info *) user_data;
179 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
180 return; //LCOV_EXCL_LINE
183 if (!g_strcmp0(key, "app_id")) {
185 const gchar *str = g_variant_get_string(value, &str_length);
186 rule->app_id = g_strdup(str);
187 STC_LOGD("app_id: [%s]", (unsigned int) rule->app_id);
189 } else if (!g_strcmp0(key, "ifname")) {
191 const gchar *str = g_variant_get_string(value, &str_length);
192 rule->ifname = g_strdup(str);
193 STC_LOGD("ifname: [%s]", rule->ifname);
195 } else if (!g_strcmp0(key, "iftype")) {
196 rule->iftype = g_variant_get_uint16(value);
197 STC_LOGD("iftype: [%u]", (unsigned int) rule->iftype);
199 } else if (!g_strcmp0(key, "data_limit")) {
200 rule->data_limit = g_variant_get_int64(value);
201 STC_LOGD("data_limit: [%lld]", rule->data_limit);
203 } else if (!g_strcmp0(key, "data_warn_limit")) {
204 rule->data_warn_limit = g_variant_get_int64(value);
205 STC_LOGD("data_warn_limit: [%lld]", rule->data_warn_limit);
207 } else if (!g_strcmp0(key, "roaming")) {
208 rule->roaming = g_variant_get_uint16(value);
209 STC_LOGD("roaming: [%u]", rule->roaming);
211 } else if (!g_strcmp0(key, "subscriber_id")) {
213 const gchar *str = g_variant_get_string(value, &str_length);
214 rule->subscriber_id = g_strdup(str);
215 STC_LOGD("subscriber_id: [%s]", rule->subscriber_id);
218 STC_LOGD("Unknown select rule"); //LCOV_EXCL_LINE
221 __STC_LOG_FUNC_EXIT__;
224 gboolean handle_restriction_set(StcRestriction *object,
225 GDBusMethodInvocation *invocation,
226 GVariant *parameters,
229 __STC_LOG_FUNC_ENTER__;
230 GVariantIter *iter = NULL;
231 table_restrictions_info rule;
233 memset(&rule, 0, sizeof(table_restrictions_info));
234 __initialize_rstn_rule(&rule);
236 g_variant_get(parameters, "a{sv}", &iter);
238 stc_manager_gdbus_dict_foreach(iter,
239 __stc_extract_restriction_rule,
241 g_variant_iter_free(iter);
244 rule.rstn_type = STC_RSTN_TYPE_DROP;
246 if (__validate_rstn_rule(&rule, RST_SET) == FALSE) {
247 STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE
248 STC_ERROR_INVALID_PARAMETER);
249 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
253 table_restrictions_update(&rule);
254 /* update restriction rule in runtime structure */
255 stc_monitor_rstns_tree_add(&rule);
257 STC_DBUS_REPLY_ERROR_NONE(invocation);
258 __STC_LOG_FUNC_EXIT__;
262 gboolean handle_restriction_exclude(StcRestriction *object,
263 GDBusMethodInvocation *invocation,
264 GVariant *parameters,
267 __STC_LOG_FUNC_ENTER__;
268 GVariantIter *iter = NULL;
269 table_restrictions_info rule;
271 memset(&rule, 0, sizeof(table_restrictions_info));
272 __initialize_rstn_rule(&rule);
274 g_variant_get(parameters, "a{sv}", &iter);
276 stc_manager_gdbus_dict_foreach(iter,
277 __stc_extract_restriction_rule,
279 g_variant_iter_free(iter);
282 rule.rstn_type = STC_RSTN_TYPE_ACCEPT;
284 if (__validate_rstn_rule(&rule, RST_EXCLUDE) == FALSE) {
285 STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE
286 STC_ERROR_INVALID_PARAMETER);
287 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
291 table_restrictions_update(&rule);
292 /* update restriction rule in runtime structure */
293 stc_monitor_rstns_tree_add(&rule);
295 STC_DBUS_REPLY_ERROR_NONE(invocation);
296 __STC_LOG_FUNC_EXIT__;
300 gboolean handle_restriction_unset(StcRestriction *object,
301 GDBusMethodInvocation *invocation,
302 GVariant *parameters,
305 __STC_LOG_FUNC_ENTER__;
306 GVariantIter *iter = NULL;
307 table_restrictions_info rule;
309 memset(&rule, 0, sizeof(table_restrictions_info));
310 __initialize_rstn_rule(&rule);
312 g_variant_get(parameters, "a{sv}", &iter);
314 stc_manager_gdbus_dict_foreach(iter,
315 __stc_extract_restriction_rule,
317 g_variant_iter_free(iter);
320 if (__validate_rstn_rule(&rule, RST_UNSET) == FALSE) {
321 STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE
322 STC_ERROR_INVALID_PARAMETER);
323 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
327 table_restrictions_delete(rule.app_id, rule.iftype, rule.subscriber_id);
328 /* remove restriction rule from runtime structure */
329 stc_monitor_rstns_tree_remove(&rule);
331 STC_DBUS_REPLY_ERROR_NONE(invocation);
332 __STC_LOG_FUNC_EXIT__;
336 gboolean handle_restriction_get(StcRestriction *object,
337 GDBusMethodInvocation *invocation,
341 __STC_LOG_FUNC_ENTER__;
342 GVariantBuilder *builder = NULL;
343 GVariant *return_parameters = NULL;
346 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
348 ret = table_restrictions_per_app(app_id,
349 __table_restrictions_per_app_cb,
351 if (ret < STC_ERROR_NONE) {
352 g_variant_builder_unref(builder); //LCOV_EXCL_LINE
353 STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE
354 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
355 return TRUE; //LCOV_EXCL_LINE
358 return_parameters = g_variant_new("(ia{sv})", STC_ERROR_NONE, builder);
359 g_variant_builder_unref(builder);
361 DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
362 STC_DBUS_REPLY(invocation, return_parameters);
363 __STC_LOG_FUNC_EXIT__;
367 gboolean handle_restriction_get_all(StcRestriction *object,
368 GDBusMethodInvocation *invocation,
371 __STC_LOG_FUNC_ENTER__;
372 GVariantBuilder *builder = NULL;
373 GVariant *return_parameters = NULL;
376 builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
378 ret = table_restrictions_foreach(__table_restrictions_foreach_app_cb,
380 if (ret < STC_ERROR_NONE) {
381 g_variant_builder_unref(builder); //LCOV_EXCL_LINE
382 STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE
383 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
384 return TRUE; //LCOV_EXCL_LINE
387 return_parameters = g_variant_new("(iaa{sv})", STC_ERROR_NONE, builder);
388 g_variant_builder_unref(builder);
390 DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
391 STC_DBUS_REPLY(invocation, return_parameters);
392 __STC_LOG_FUNC_EXIT__;
396 gboolean handle_restriction_get_type(StcRestriction *object,
397 GDBusMethodInvocation *invocation,
402 __STC_LOG_FUNC_ENTER__;
403 GVariant *return_parameters = NULL;
404 stc_rstn_type_e type = STC_RSTN_TYPE_UNKNOWN;
407 ret = table_restrictions_get_restriction_type(app_id, iftype, &type);
408 if (ret < STC_ERROR_NONE) {
409 STC_RESTRICTION_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE
410 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
414 return_parameters = g_variant_new("(ii)", STC_ERROR_NONE, type);
415 STC_DBUS_REPLY(invocation, return_parameters);
416 __STC_LOG_FUNC_EXIT__;