#include "generated-code.h"
#define STC_DBUS_SERVICE "net.stc"
+#define STC_DBUS_INTERFACE_RESTRICTION STC_DBUS_SERVICE ".restriction"
#define STC_DBUS_SERVICE_PATH "/net/stc"
#define STC_DBUS_SERVICE_STATISTICS_PATH "/net/stc/statistics"
#define STC_DBUS_SERVICE_RESTRICTION_PATH "/net/stc/restriction"
guint subscription_id);
void stc_manager_gdbus_dict_foreach(GVariantIter *iter, dbus_dict_cb cb,
void *user_data);
+gboolean stc_manager_dbus_emit_signal(GDBusConnection *connection,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters);
#endif /* __STC_MANAGER_GDBUS_H__ */
case NFACCT_COUNTER_IN:
rstn_value->counter.in_bytes += context->bytes;
+ if (rstn_value->counter.in_bytes >= rstn_value->warn_limit.in_bytes
+ && rstn_value->warn_limit_crossed_notified == FALSE) {
+ gboolean rv = FALSE;
+ stc_s *stc = (stc_s *)stc_get_manager();
+ ret_value_msg_if(stc == NULL, FALSE, "failed to get stc data");
+
+ rv = stc_manager_dbus_emit_signal(stc->connection,
+ STC_DBUS_SERVICE_RESTRICTION_PATH,
+ STC_DBUS_INTERFACE_RESTRICTION,
+ "WarnThresholdCrossed",
+ g_variant_new("(s)", rstn_key->app_id));
+ if (rv == TRUE)
+ rstn_value->warn_limit_crossed_notified = TRUE;
+ }
+
/* block immediately */
if (rstn_value->counter.in_bytes >= rstn_value->limit.in_bytes) {
__del_iptables_in(context->counter);
case NFACCT_COUNTER_OUT:
rstn_value->counter.out_bytes += context->bytes;
+ if (rstn_value->counter.out_bytes >= rstn_value->limit.out_bytes
+ && rstn_value->warn_limit_crossed_notified == FALSE) {
+ gboolean rv = FALSE;
+ stc_s *stc = (stc_s *)stc_get_manager();
+ ret_value_msg_if(stc == NULL, FALSE, "failed to get stc data");
+
+ rv = stc_manager_dbus_emit_signal(stc->connection,
+ STC_DBUS_SERVICE_RESTRICTION_PATH,
+ STC_DBUS_INTERFACE_RESTRICTION,
+ "WarnThresholdCrossed",
+ g_variant_new("(s)", rstn_key->app_id));
+ if (rv == TRUE)
+ rstn_value->warn_limit_crossed_notified = TRUE;
+ }
+
/* block immediately */
if (rstn_value->counter.out_bytes >= rstn_value->limit.out_bytes) {
__del_iptables_out(context->counter);
rstn_value->warn_limit.out_bytes = value->warn_limit.out_bytes;
rstn_value->counter.in_bytes = 0;
rstn_value->counter.out_bytes = 0;
+ rstn_value->warn_limit_crossed_notified = FALSE;
if (debug == TRUE)
__add_restriction_debug(key, rstn_value, NULL);
__STC_LOG_FUNC_EXIT__;
}
+
+gboolean stc_manager_dbus_emit_signal(GDBusConnection *connection,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters)
+{
+ gboolean rv = FALSE;
+ GError *error = NULL;
+
+ if (connection == NULL) {
+ STC_LOGE("GDBusconnection is NULL");
+ return 0;
+ }
+
+ DEBUG_GDBUS_VARIANT("Signal params: ", parameters);
+
+ rv = g_dbus_connection_emit_signal(connection,
+ NULL,
+ object_path,
+ interface_name,
+ signal_name,
+ parameters,
+ &error);
+ if (rv != TRUE) {
+ STC_LOGE("Failed to emit signal [%s] interface [%s] Error [%s]",
+ signal_name, interface_name, error->message);
+ g_error_free(error);
+ } else {
+ STC_LOGD("[%s] signal sent on [%s] interface", signal_name,
+ interface_name);
+ }
+
+ return rv;
+}