hostapd/wpa_supplicant/dbus/dbus_new_helpers.h
Jouni Malinen e90bd80cf5 dbus: Remove duplication of object methods/signals/properties
There is no need to duplicate the method/signal/property arrays that
were registered for objects. The registration was using static arrays
on methods/signals/properties in all places and we can as well use
those throughout without having to allocate memory and copy all the
entries for every object. This reduces number of allocations and
amount of unnecessary code quite a bit.
2010-01-03 00:52:30 +02:00

140 lines
4 KiB
C

/*
* WPA Supplicant / dbus-based control interface
* Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc.
* Copyright (c) 2009, Witold Sowa <witold.sowa@gmail.com>
*
* 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
* published by the Free Software Foundation.
*
* Alternatively, this software may be distributed under the terms of BSD
* license.
*
* See README and COPYING for more details.
*/
#ifndef WPA_DBUS_CTRL_H
#define WPA_DBUS_CTRL_H
#include <dbus/dbus.h>
typedef DBusMessage * (* WPADBusMethodHandler)(DBusMessage *message,
void *user_data);
typedef void (* WPADBusArgumentFreeFunction)(void *handler_arg);
typedef DBusMessage * (* WPADBusPropertyAccessor)(DBusMessage *message,
const void *user_data);
struct wpa_dbus_object_desc {
DBusConnection *connection;
/* list of methods, properties and signals registered with object */
const struct wpa_dbus_method_desc *methods;
const struct wpa_dbus_signal_desc *signals;
const struct wpa_dbus_property_desc *properties;
/* argument for method handlers and properties
* getter and setter functions */
void *user_data;
/* function used to free above argument */
WPADBusArgumentFreeFunction user_data_free_func;
};
enum dbus_prop_access { R, W, RW };
enum dbus_arg_direction { ARG_IN, ARG_OUT };
struct wpa_dbus_argument {
char *name;
char *type;
enum dbus_arg_direction dir;
};
#define END_ARGS { NULL, NULL, ARG_IN }
/**
* struct wpa_dbus_method_desc - DBus method description
*/
struct wpa_dbus_method_desc {
/* method name */
const char *dbus_method;
/* method interface */
const char *dbus_interface;
/* method handling function */
WPADBusMethodHandler method_handler;
/* array of arguments */
struct wpa_dbus_argument args[3];
};
/**
* struct wpa_dbus_signal_desc - DBus signal description
*/
struct wpa_dbus_signal_desc {
/* signal name */
const char *dbus_signal;
/* signal interface */
const char *dbus_interface;
/* array of arguments */
struct wpa_dbus_argument args[3];
};
/**
* struct wpa_dbus_property_desc - DBus property description
*/
struct wpa_dbus_property_desc {
/* property name */
const char *dbus_property;
/* property interface */
const char *dbus_interface;
/* property type signature in DBus type notation */
const char *type;
/* property getter function */
WPADBusPropertyAccessor getter;
/* property setter function */
WPADBusPropertyAccessor setter;
/* property access permissions */
enum dbus_prop_access access;
};
#define WPAS_DBUS_OBJECT_PATH_MAX 150
#define WPAS_DBUS_INTERFACE_MAX 150
#define WPAS_DBUS_METHOD_SIGNAL_PROP_MAX 50
#define WPA_DBUS_INTROSPECTION_INTERFACE "org.freedesktop.DBus.Introspectable"
#define WPA_DBUS_INTROSPECTION_METHOD "Introspect"
#define WPA_DBUS_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties"
#define WPA_DBUS_PROPERTIES_GET "Get"
#define WPA_DBUS_PROPERTIES_SET "Set"
#define WPA_DBUS_PROPERTIES_GETALL "GetAll"
void free_dbus_object_desc(struct wpa_dbus_object_desc *obj_dsc);
int wpa_dbus_ctrl_iface_init(struct wpas_dbus_priv *iface, char *dbus_path,
char *dbus_service,
struct wpa_dbus_object_desc *obj_desc);
int wpa_dbus_register_object_per_iface(
struct wpas_dbus_priv *ctrl_iface,
const char *path, const char *ifname,
struct wpa_dbus_object_desc *obj_desc);
int wpa_dbus_unregister_object_per_iface(
struct wpas_dbus_priv *ctrl_iface,
const char *path);
void wpa_dbus_signal_property_changed(struct wpas_dbus_priv *iface,
WPADBusPropertyAccessor property_getter,
void *getter_arg,
const char *path,
const char *interface_name,
const char *property_name);
void wpa_dbus_get_object_properties(struct wpas_dbus_priv *iface,
const char *path, const char *interface,
DBusMessageIter *dict_iter);
DBusMessage * wpa_dbus_introspect(DBusMessage *message,
struct wpa_dbus_object_desc *obj_dsc);
#endif /* WPA_DBUS_CTRL_H */