*
* 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
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;
};
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))
{
struct generic_data *data = user_data;
struct interface_data *iface;
- GDBusMethodTable *method;
+ const GDBusMethodTable *method;
const char *interface;
interface = dbus_message_get_interface(message);
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;
};
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)
{
{
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,
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)
{
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);