1214501Srpaulo/*
2214501Srpaulo * WPA Supplicant / dbus-based control interface
3214501Srpaulo * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc.
4214501Srpaulo * Copyright (c) 2009, Witold Sowa <witold.sowa@gmail.com>
5214501Srpaulo *
6252190Srpaulo * This software may be distributed under the terms of the BSD license.
7252190Srpaulo * See README for more details.
8214501Srpaulo */
9214501Srpaulo
10214501Srpaulo#ifndef WPA_DBUS_CTRL_H
11214501Srpaulo#define WPA_DBUS_CTRL_H
12214501Srpaulo
13214501Srpaulo#include <dbus/dbus.h>
14214501Srpaulo
15281806Srpaulotypedef DBusMessage * (*WPADBusMethodHandler)(DBusMessage *message,
16281806Srpaulo					      void *user_data);
17281806Srpaulotypedef void (*WPADBusArgumentFreeFunction)(void *handler_arg);
18281806Srpaulo
19337817Scystruct wpa_dbus_property_desc;
20337817Scytypedef dbus_bool_t (*WPADBusPropertyAccessor)(
21337817Scy	const struct wpa_dbus_property_desc *property_desc,
22337817Scy	DBusMessageIter *iter, DBusError *error, void *user_data);
23337817Scy#define DECLARE_ACCESSOR(f) \
24337817Scydbus_bool_t f(const struct wpa_dbus_property_desc *property_desc, \
25337817Scy	      DBusMessageIter *iter, DBusError *error, void *user_data)
26214501Srpaulo
27214501Srpaulostruct wpa_dbus_object_desc {
28214501Srpaulo	DBusConnection *connection;
29214501Srpaulo	char *path;
30214501Srpaulo
31214501Srpaulo	/* list of methods, properties and signals registered with object */
32214501Srpaulo	const struct wpa_dbus_method_desc *methods;
33214501Srpaulo	const struct wpa_dbus_signal_desc *signals;
34214501Srpaulo	const struct wpa_dbus_property_desc *properties;
35214501Srpaulo
36214501Srpaulo	/* property changed flags */
37214501Srpaulo	u8 *prop_changed_flags;
38214501Srpaulo
39214501Srpaulo	/* argument for method handlers and properties
40214501Srpaulo	 * getter and setter functions */
41214501Srpaulo	void *user_data;
42214501Srpaulo	/* function used to free above argument */
43214501Srpaulo	WPADBusArgumentFreeFunction user_data_free_func;
44214501Srpaulo};
45214501Srpaulo
46214501Srpauloenum dbus_arg_direction { ARG_IN, ARG_OUT };
47214501Srpaulo
48214501Srpaulostruct wpa_dbus_argument {
49214501Srpaulo	char *name;
50214501Srpaulo	char *type;
51214501Srpaulo	enum dbus_arg_direction dir;
52214501Srpaulo};
53214501Srpaulo
54214501Srpaulo#define END_ARGS { NULL, NULL, ARG_IN }
55214501Srpaulo
56214501Srpaulo/**
57214501Srpaulo * struct wpa_dbus_method_desc - DBus method description
58214501Srpaulo */
59214501Srpaulostruct wpa_dbus_method_desc {
60214501Srpaulo	/* method name */
61214501Srpaulo	const char *dbus_method;
62214501Srpaulo	/* method interface */
63214501Srpaulo	const char *dbus_interface;
64214501Srpaulo	/* method handling function */
65214501Srpaulo	WPADBusMethodHandler method_handler;
66214501Srpaulo	/* array of arguments */
67252190Srpaulo	struct wpa_dbus_argument args[4];
68214501Srpaulo};
69214501Srpaulo
70214501Srpaulo/**
71214501Srpaulo * struct wpa_dbus_signal_desc - DBus signal description
72214501Srpaulo */
73214501Srpaulostruct wpa_dbus_signal_desc {
74214501Srpaulo	/* signal name */
75214501Srpaulo	const char *dbus_signal;
76214501Srpaulo	/* signal interface */
77214501Srpaulo	const char *dbus_interface;
78214501Srpaulo	/* array of arguments */
79252190Srpaulo	struct wpa_dbus_argument args[4];
80214501Srpaulo};
81214501Srpaulo
82214501Srpaulo/**
83214501Srpaulo * struct wpa_dbus_property_desc - DBus property description
84214501Srpaulo */
85214501Srpaulostruct wpa_dbus_property_desc {
86214501Srpaulo	/* property name */
87214501Srpaulo	const char *dbus_property;
88214501Srpaulo	/* property interface */
89214501Srpaulo	const char *dbus_interface;
90214501Srpaulo	/* property type signature in DBus type notation */
91214501Srpaulo	const char *type;
92214501Srpaulo	/* property getter function */
93214501Srpaulo	WPADBusPropertyAccessor getter;
94214501Srpaulo	/* property setter function */
95214501Srpaulo	WPADBusPropertyAccessor setter;
96337817Scy	/* other data */
97337817Scy	const char *data;
98214501Srpaulo};
99214501Srpaulo
100214501Srpaulo
101214501Srpaulo#define WPAS_DBUS_OBJECT_PATH_MAX 150
102214501Srpaulo#define WPAS_DBUS_INTERFACE_MAX 150
103214501Srpaulo#define WPAS_DBUS_METHOD_SIGNAL_PROP_MAX 50
104252190Srpaulo#define WPAS_DBUS_AUTH_MODE_MAX 64
105214501Srpaulo
106214501Srpaulo#define WPA_DBUS_INTROSPECTION_INTERFACE "org.freedesktop.DBus.Introspectable"
107214501Srpaulo#define WPA_DBUS_INTROSPECTION_METHOD "Introspect"
108214501Srpaulo#define WPA_DBUS_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties"
109214501Srpaulo#define WPA_DBUS_PROPERTIES_GET "Get"
110214501Srpaulo#define WPA_DBUS_PROPERTIES_SET "Set"
111214501Srpaulo#define WPA_DBUS_PROPERTIES_GETALL "GetAll"
112214501Srpaulo
113214501Srpaulovoid free_dbus_object_desc(struct wpa_dbus_object_desc *obj_dsc);
114214501Srpaulo
115214501Srpauloint wpa_dbus_ctrl_iface_init(struct wpas_dbus_priv *iface, char *dbus_path,
116214501Srpaulo			     char *dbus_service,
117214501Srpaulo			     struct wpa_dbus_object_desc *obj_desc);
118214501Srpaulo
119214501Srpauloint wpa_dbus_register_object_per_iface(
120214501Srpaulo	struct wpas_dbus_priv *ctrl_iface,
121214501Srpaulo	const char *path, const char *ifname,
122214501Srpaulo	struct wpa_dbus_object_desc *obj_desc);
123214501Srpaulo
124214501Srpauloint wpa_dbus_unregister_object_per_iface(
125214501Srpaulo	struct wpas_dbus_priv *ctrl_iface,
126214501Srpaulo	const char *path);
127214501Srpaulo
128252190Srpaulodbus_bool_t wpa_dbus_get_object_properties(struct wpas_dbus_priv *iface,
129252190Srpaulo					   const char *path,
130252190Srpaulo					   const char *interface,
131252190Srpaulo					   DBusMessageIter *iter);
132214501Srpaulo
133214501Srpaulo
134214501Srpaulovoid wpa_dbus_flush_all_changed_properties(DBusConnection *con);
135214501Srpaulo
136214501Srpaulovoid wpa_dbus_flush_object_changed_properties(DBusConnection *con,
137214501Srpaulo					      const char *path);
138214501Srpaulo
139214501Srpaulovoid wpa_dbus_mark_property_changed(struct wpas_dbus_priv *iface,
140214501Srpaulo				    const char *path, const char *interface,
141214501Srpaulo				    const char *property);
142214501Srpaulo
143214501SrpauloDBusMessage * wpa_dbus_introspect(DBusMessage *message,
144214501Srpaulo				  struct wpa_dbus_object_desc *obj_dsc);
145214501Srpaulo
146281806Srpaulochar * wpas_dbus_new_decompose_object_path(const char *path, const char *sep,
147281806Srpaulo					   char **item);
148252190Srpaulo
149252190SrpauloDBusMessage *wpas_dbus_reply_new_from_error(DBusMessage *message,
150252190Srpaulo					    DBusError *error,
151252190Srpaulo					    const char *fallback_name,
152252190Srpaulo					    const char *fallback_string);
153252190Srpaulo
154214501Srpaulo#endif /* WPA_DBUS_CTRL_H */
155