Do not automatically remove watches for service names
[framework/connectivity/connman.git] / gdbus / object.c
index ee69791..ff69641 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  D-Bus helper library
  *
- *  Copyright (C) 2004-2009  Marcel Holtmann <marcel@holtmann.org>
+ *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
  *
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -45,9 +45,9 @@ struct generic_data {
 
 struct interface_data {
        char *name;
-       GDBusMethodTable *methods;
-       GDBusSignalTable *signals;
-       GDBusPropertyTable *properties;
+       const GDBusMethodTable *methods;
+       const GDBusSignalTable *signals;
+       const GDBusPropertyTable *properties;
        void *user_data;
        GDBusDestroyFunction destroy;
 };
@@ -114,8 +114,8 @@ static void print_arguments(GString *gstr, const char *sig,
 
 static void generate_interface_xml(GString *gstr, struct interface_data *iface)
 {
-       GDBusMethodTable *method;
-       GDBusSignalTable *signal;
+       const GDBusMethodTable *method;
+       const GDBusSignalTable *signal;
 
        for (method = iface->methods; method && method->name; method++) {
                if (!strlen(method->signature) && !strlen(method->reply))
@@ -238,7 +238,7 @@ static DBusHandlerResult generic_message(DBusConnection *connection,
 {
        struct generic_data *data = user_data;
        struct interface_data *iface;
-       GDBusMethodTable *method;
+       const GDBusMethodTable *method;
        const char *interface;
 
        interface = dbus_message_get_interface(message);
@@ -308,8 +308,10 @@ static void invalidate_parent_data(DBusConnection *conn, const char *child_path)
                goto done;
 
        if (!dbus_connection_get_object_path_data(conn, parent_path,
-                                                       (void *) &data))
+                                                       (void *) &data)) {
+               invalidate_parent_data(conn, parent_path);
                goto done;
+       }
 
        if (!data)
                goto done;
@@ -327,9 +329,9 @@ static GDBusMethodTable introspect_methods[] = {
 };
 
 static void add_interface(struct generic_data *data, const char *name,
-                               GDBusMethodTable *methods,
-                               GDBusSignalTable *signals,
-                               GDBusPropertyTable *properties,
+                               const GDBusMethodTable *methods,
+                               const GDBusSignalTable *signals,
+                               const GDBusPropertyTable *properties,
                                void *user_data,
                                GDBusDestroyFunction destroy)
 {
@@ -428,7 +430,7 @@ static gboolean check_signal(DBusConnection *conn, const char *path,
 {
        struct generic_data *data = NULL;
        struct interface_data *iface;
-       GDBusSignalTable *signal;
+       const GDBusSignalTable *signal;
 
        *args = NULL;
        if (!dbus_connection_get_object_path_data(conn, path,
@@ -502,9 +504,9 @@ fail:
 
 gboolean g_dbus_register_interface(DBusConnection *connection,
                                        const char *path, const char *name,
-                                       GDBusMethodTable *methods,
-                                       GDBusSignalTable *signals,
-                                       GDBusPropertyTable *properties,
+                                       const GDBusMethodTable *methods,
+                                       const GDBusSignalTable *signals,
+                                       const GDBusPropertyTable *properties,
                                        void *user_data,
                                        GDBusDestroyFunction destroy)
 {
@@ -514,8 +516,10 @@ gboolean g_dbus_register_interface(DBusConnection *connection,
        if (data == NULL)
                return FALSE;
 
-       if (find_interface(data->interfaces, name))
+       if (find_interface(data->interfaces, name)) {
+               object_path_unref(connection, path);
                return FALSE;
+       }
 
        add_interface(data, name, methods, signals,
                        properties, user_data, destroy);