X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fcounter.c;h=1dd7d6d002e759ac77caf9d7744a192897b478a7;hb=0c4159770e177475cb222770f03e0d0ff034f136;hp=bf9da9024e8d50500a58c5d157acb6746d83f391;hpb=e4fb1ca873f840acd1e0a72a6f266843f65854ae;p=framework%2Fconnectivity%2Fconnman.git diff --git a/src/counter.c b/src/counter.c index bf9da90..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,22 +23,17 @@ #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; @@ -46,25 +41,16 @@ struct connman_counter { 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); + __connman_service_counter_unregister(counter->path); + g_free(counter->owner); g_free(counter->path); g_free(counter); @@ -84,6 +70,7 @@ 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); @@ -98,6 +85,14 @@ 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); @@ -123,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->tx_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; @@ -200,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) @@ -218,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, @@ -241,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); }