*
* 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
#include <config.h>
#endif
+#include <errno.h>
+
#include <gdbus.h>
#include "connman.h"
struct connman_counter {
char *owner;
char *path;
- guint timeout;
+ unsigned int interval;
guint watch;
};
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);
g_hash_table_remove(counter_table, counter->path);
}
-static gboolean counter_timeout(gpointer user_data)
-{
- struct connman_counter *counter = user_data;
- DBusMessage *message;
-
- DBG("owner %s path %s", counter->owner, counter->path);
-
- message = dbus_message_new_method_call(counter->owner, counter->path,
- CONNMAN_COUNTER_INTERFACE, "Usage");
- if (message == NULL)
- return TRUE;
-
- dbus_message_set_no_reply(message, TRUE);
-
- g_dbus_send_message(connection, message);
-
- 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);
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);
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;
}
+void __connman_counter_send_usage(const char *path,
+ DBusMessage *message)
+{
+ struct connman_counter *counter;
+
+ 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);
+
+ g_dbus_send_message(connection, message);
+}
+
static void release_counter(gpointer key, gpointer value, gpointer user_data)
{
struct connman_counter *counter = value;
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)