X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fcounter.c;h=1dd7d6d002e759ac77caf9d7744a192897b478a7;hb=6c8213f23b60fb46e6cd2572a6adc7ce4da13691;hp=5d286d46fe92bf936be6808806fd244d6c885cc4;hpb=768862d982e091d469d69cfa996ae8a41401a1f5;p=framework%2Fconnectivity%2Fconnman.git diff --git a/src/counter.c b/src/counter.c index 5d286d4..1dd7d6d 100644 --- a/src/counter.c +++ b/src/counter.c @@ -2,7 +2,7 @@ * * Connection Manager * - * Copyright (C) 2007-2010 Intel Corporation. All rights reserved. + * Copyright (C) 2007-2012 Intel Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -23,48 +23,33 @@ #include #endif +#include + #include #include "connman.h" static DBusConnection *connection; -static GHashTable *stats_table; static GHashTable *counter_table; static GHashTable *owner_mapping; -struct connman_stats { - char *interface; - unsigned int rx_bytes; - unsigned int tx_bytes; -}; - struct connman_counter { char *owner; char *path; - guint timeout; + unsigned int interval; guint watch; }; -static void remove_stats(gpointer user_data) -{ - struct connman_stats *stats = user_data; - - g_free(stats->interface); - g_free(stats); -} - static void remove_counter(gpointer user_data) { struct connman_counter *counter = user_data; DBG("owner %s path %s", counter->owner, counter->path); - if (counter->watch > 0) - g_dbus_remove_watch(connection, counter->watch); + __connman_rtnl_update_interval_remove(counter->interval); - if (counter->timeout > 0) - g_source_remove(counter->timeout); + __connman_service_counter_unregister(counter->path); g_free(counter->owner); g_free(counter->path); @@ -81,27 +66,14 @@ static void owner_disconnect(DBusConnection *connection, void *user_data) g_hash_table_remove(counter_table, counter->path); } -static gboolean counter_timeout(gpointer user_data) -{ - struct connman_counter *counter = user_data; - - DBG("owner %s path %s", counter->owner, counter->path); - - __connman_rtnl_request_update(); - - return TRUE; -} - int __connman_counter_register(const char *owner, const char *path, unsigned int interval) { struct connman_counter *counter; + int err; DBG("owner %s path %s interval %u", owner, path, interval); - if (interval < 1) - return -EINVAL; - counter = g_hash_table_lookup(counter_table, path); if (counter != NULL) return -EEXIST; @@ -113,17 +85,23 @@ int __connman_counter_register(const char *owner, const char *path, counter->owner = g_strdup(owner); counter->path = g_strdup(path); + err = __connman_service_counter_register(counter->path); + if (err < 0) { + g_free(counter->owner); + g_free(counter->path); + g_free(counter); + return err; + } + g_hash_table_replace(counter_table, counter->path, counter); g_hash_table_replace(owner_mapping, counter->owner, counter); - counter->timeout = g_timeout_add_seconds(interval, - counter_timeout, counter); + counter->interval = interval; + __connman_rtnl_update_interval_add(counter->interval); counter->watch = g_dbus_add_disconnect_watch(connection, owner, owner_disconnect, counter, NULL); - __connman_rtnl_request_update(); - return 0; } @@ -140,76 +118,33 @@ int __connman_counter_unregister(const char *owner, const char *path) if (g_strcmp0(owner, counter->owner) != 0) return -EACCES; + if (counter->watch > 0) + g_dbus_remove_watch(connection, counter->watch); + g_hash_table_remove(owner_mapping, counter->owner); g_hash_table_remove(counter_table, counter->path); return 0; } -static void send_usage(struct connman_counter *counter, - struct connman_stats *stats) +void __connman_counter_send_usage(const char *path, + DBusMessage *message) { - DBusMessage *message; - DBusMessageIter array, dict; + struct connman_counter *counter; - message = dbus_message_new_method_call(counter->owner, counter->path, - CONNMAN_COUNTER_INTERFACE, "Usage"); - if (message == NULL) + counter = g_hash_table_lookup(counter_table, path); + if (counter == NULL) return; + dbus_message_set_destination(message, counter->owner); + dbus_message_set_path(message, counter->path); + dbus_message_set_interface(message, CONNMAN_COUNTER_INTERFACE); + dbus_message_set_member(message, "Usage"); dbus_message_set_no_reply(message, TRUE); - dbus_message_iter_init_append(message, &array); - - connman_dbus_dict_open(&array, &dict); - - connman_dbus_dict_append_basic(&dict, "Interface", - DBUS_TYPE_STRING, &stats->interface); - connman_dbus_dict_append_basic(&dict, "RX.Bytes", - DBUS_TYPE_UINT32, &stats->rx_bytes); - connman_dbus_dict_append_basic(&dict, "TX.Bytes", - DBUS_TYPE_UINT32, &stats->tx_bytes); - - connman_dbus_dict_close(&array, &dict); - g_dbus_send_message(connection, message); } -void __connman_counter_notify(const char *interface, - unsigned int rx_bytes, unsigned int tx_bytes) -{ - struct connman_stats *stats; - GHashTableIter iter; - gpointer key, value; - - stats = g_hash_table_lookup(stats_table, interface); - if (stats != NULL) - goto update; - - stats = g_try_new0(struct connman_stats, 1); - if (stats == NULL) - return; - - stats->interface = g_strdup(interface); - - g_hash_table_replace(stats_table, stats->interface, stats); - -update: - if (stats->rx_bytes == rx_bytes && stats->rx_bytes == tx_bytes) - return; - - stats->rx_bytes = rx_bytes; - stats->tx_bytes = tx_bytes; - - g_hash_table_iter_init(&iter, counter_table); - - while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) { - struct connman_counter *counter = value; - - send_usage(counter, stats); - } -} - static void release_counter(gpointer key, gpointer value, gpointer user_data) { struct connman_counter *counter = value; @@ -217,6 +152,9 @@ static void release_counter(gpointer key, gpointer value, gpointer user_data) DBG("owner %s path %s", counter->owner, counter->path); + if (counter->watch > 0) + g_dbus_remove_watch(connection, counter->watch); + message = dbus_message_new_method_call(counter->owner, counter->path, CONNMAN_COUNTER_INTERFACE, "Release"); if (message == NULL) @@ -235,9 +173,6 @@ int __connman_counter_init(void) if (connection == NULL) return -1; - stats_table = g_hash_table_new_full(g_str_hash, g_str_equal, - NULL, remove_stats); - counter_table = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, remove_counter); owner_mapping = g_hash_table_new_full(g_str_hash, g_str_equal, @@ -258,7 +193,5 @@ void __connman_counter_cleanup(void) g_hash_table_destroy(owner_mapping); g_hash_table_destroy(counter_table); - g_hash_table_destroy(stats_table); - dbus_connection_unref(connection); }