1/*
2 * WPA Supplicant / dbus-based control interface
3 * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc.
4 * Copyright (c) 2009, Witold Sowa <witold.sowa@gmail.com>
5 *
6 * This software may be distributed under the terms of the BSD license.
7 * See README for more details.
8 */
9
10#ifndef WPA_DBUS_CTRL_H
11#define WPA_DBUS_CTRL_H
12
13#include <dbus/dbus.h>
14
15typedef DBusMessage * (*WPADBusMethodHandler)(DBusMessage *message,
16					      void *user_data);
17typedef void (*WPADBusArgumentFreeFunction)(void *handler_arg);
18
19struct wpa_dbus_property_desc;
20typedef dbus_bool_t (*WPADBusPropertyAccessor)(
21	const struct wpa_dbus_property_desc *property_desc,
22	DBusMessageIter *iter, DBusError *error, void *user_data);
23#define DECLARE_ACCESSOR(f) \
24dbus_bool_t f(const struct wpa_dbus_property_desc *property_desc, \
25	      DBusMessageIter *iter, DBusError *error, void *user_data)
26
27struct wpa_dbus_object_desc {
28	DBusConnection *connection;
29	char *path;
30
31	/* list of methods, properties and signals registered with object */
32	const struct wpa_dbus_method_desc *methods;
33	const struct wpa_dbus_signal_desc *signals;
34	const struct wpa_dbus_property_desc *properties;
35
36	/* property changed flags */
37	u8 *prop_changed_flags;
38
39	/* argument for method handlers and properties
40	 * getter and setter functions */
41	void *user_data;
42	/* function used to free above argument */
43	WPADBusArgumentFreeFunction user_data_free_func;
44};
45
46enum dbus_arg_direction { ARG_IN, ARG_OUT };
47
48struct wpa_dbus_argument {
49	char *name;
50	char *type;
51	enum dbus_arg_direction dir;
52};
53
54#define END_ARGS { NULL, NULL, ARG_IN }
55
56/**
57 * struct wpa_dbus_method_desc - DBus method description
58 */
59struct wpa_dbus_method_desc {
60	/* method name */
61	const char *dbus_method;
62	/* method interface */
63	const char *dbus_interface;
64	/* method handling function */
65	WPADBusMethodHandler method_handler;
66	/* array of arguments */
67	struct wpa_dbus_argument args[4];
68};
69
70/**
71 * struct wpa_dbus_signal_desc - DBus signal description
72 */
73struct wpa_dbus_signal_desc {
74	/* signal name */
75	const char *dbus_signal;
76	/* signal interface */
77	const char *dbus_interface;
78	/* array of arguments */
79	struct wpa_dbus_argument args[4];
80};
81
82/**
83 * struct wpa_dbus_property_desc - DBus property description
84 */
85struct wpa_dbus_property_desc {
86	/* property name */
87	const char *dbus_property;
88	/* property interface */
89	const char *dbus_interface;
90	/* property type signature in DBus type notation */
91	const char *type;
92	/* property getter function */
93	WPADBusPropertyAccessor getter;
94	/* property setter function */
95	WPADBusPropertyAccessor setter;
96	/* other data */
97	const char *data;
98};
99
100
101#define WPAS_DBUS_OBJECT_PATH_MAX 150
102#define WPAS_DBUS_INTERFACE_MAX 150
103#define WPAS_DBUS_METHOD_SIGNAL_PROP_MAX 50
104#define WPAS_DBUS_AUTH_MODE_MAX 64
105
106#define WPA_DBUS_INTROSPECTION_INTERFACE "org.freedesktop.DBus.Introspectable"
107#define WPA_DBUS_INTROSPECTION_METHOD "Introspect"
108#define WPA_DBUS_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties"
109#define WPA_DBUS_PROPERTIES_GET "Get"
110#define WPA_DBUS_PROPERTIES_SET "Set"
111#define WPA_DBUS_PROPERTIES_GETALL "GetAll"
112
113void free_dbus_object_desc(struct wpa_dbus_object_desc *obj_dsc);
114
115int wpa_dbus_ctrl_iface_init(struct wpas_dbus_priv *iface, char *dbus_path,
116			     char *dbus_service,
117			     struct wpa_dbus_object_desc *obj_desc);
118
119int wpa_dbus_register_object_per_iface(
120	struct wpas_dbus_priv *ctrl_iface,
121	const char *path, const char *ifname,
122	struct wpa_dbus_object_desc *obj_desc);
123
124int wpa_dbus_unregister_object_per_iface(
125	struct wpas_dbus_priv *ctrl_iface,
126	const char *path);
127
128dbus_bool_t wpa_dbus_get_object_properties(struct wpas_dbus_priv *iface,
129					   const char *path,
130					   const char *interface,
131					   DBusMessageIter *iter);
132
133
134void wpa_dbus_flush_all_changed_properties(DBusConnection *con);
135
136void wpa_dbus_flush_object_changed_properties(DBusConnection *con,
137					      const char *path);
138
139void wpa_dbus_mark_property_changed(struct wpas_dbus_priv *iface,
140				    const char *path, const char *interface,
141				    const char *property);
142
143DBusMessage * wpa_dbus_introspect(DBusMessage *message,
144				  struct wpa_dbus_object_desc *obj_dsc);
145
146char * wpas_dbus_new_decompose_object_path(const char *path, const char *sep,
147					   char **item);
148
149DBusMessage *wpas_dbus_reply_new_from_error(DBusMessage *message,
150					    DBusError *error,
151					    const char *fallback_name,
152					    const char *fallback_string);
153
154#endif /* WPA_DBUS_CTRL_H */
155