summaryrefslogtreecommitdiffstats
path: root/hcid/dbus.h
blob: 8c20c4a3273bea31078de5ce81fab54d751019f0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
/*
 *
 *  BlueZ - Bluetooth protocol stack for Linux
 *
 *  Copyright (C) 2004-2006  Marcel Holtmann <marcel@holtmann.org>
 *
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

#ifndef __H_BLUEZ_DBUS_H__
#define __H_BLUEZ_DBUS_H__

#include <stdint.h>

#define __END_SIG__ DBUS_TYPE_INVALID_AS_STRING

#define BASE_PATH		"/org/bluez"
#define BASE_INTERFACE		"org.bluez"

#define ADAPTER_PATH		BASE_PATH "/Adapter"
#define ADAPTER_INTERFACE	BASE_INTERFACE ".Adapter"

#define MANAGER_PATH		BASE_PATH "/Manager"
#define MANAGER_INTERFACE	BASE_INTERFACE ".Manager"

#define ERROR_INTERFACE		BASE_INTERFACE ".Error"

#define MANAGER_PATH_MASK	(1 << 15)
#define ADAPTER_PATH_MASK	(1 << 14)

/* /org/bluez/Manager */
#define MANAGER_ROOT_ID		MANAGER_PATH_MASK

/* /org/bluez/Adapter */
#define ADAPTER_ROOT_ID		ADAPTER_PATH_MASK

/* E.g. /org/bluez/Adapter/hci0 */
#define ADAPTER_PATH_ID		(ADAPTER_PATH_MASK | 0x0001)

#define INVALID_PATH_ID		0xFFFF
#define INVALID_DEV_ID		0xFFFF

#define MAX_PATH_LENGTH		64

typedef DBusMessage* (service_handler_func_t) (DBusMessage *, void *);

struct service_data {
	const char		*name;
	service_handler_func_t	*handler_func;
	const char		*signature;
};

typedef int (timeout_handler_func_t) (void *data);

struct hci_dbus_data {
	uint16_t dev_id;
	uint16_t path_id;
	uint32_t discoverable_timeout;
	uint32_t timeout_hits;
	timeout_handler_func_t *timeout_handler;
	uint8_t  mode;
};

typedef int register_function_t(DBusConnection *conn, uint16_t id);
typedef int unregister_function_t(DBusConnection *conn, uint16_t id);

DBusHandlerResult msg_func_device(DBusConnection *conn, DBusMessage *msg, void *data);
DBusHandlerResult msg_func_manager(DBusConnection *conn, DBusMessage *msg, void *data);

DBusMessage *bluez_new_failure_msg(DBusMessage *msg, const uint32_t ecode);

DBusMessage *dev_signal_factory(const int devid, const char *prop_name, const int first, ...);

DBusConnection *get_dbus_connection(void);

int get_default_dev_id(void);

DBusMessage *error_failed(DBusMessage *msg, int err);
DBusMessage *error_invalid_arguments(DBusMessage *msg);
DBusMessage *error_not_authorized(DBusMessage *msg);
DBusMessage *error_out_of_memory(DBusMessage *msg);
DBusMessage *error_no_such_adapter(DBusMessage *msg);
DBusMessage *error_unknown_address(DBusMessage *msg);
DBusMessage *error_not_available(DBusMessage *msg);
DBusMessage *error_not_connected(DBusMessage *msg);

DBusMessage *error_bonding_already_exists(DBusMessage *msg);
DBusMessage *error_bonding_does_not_exists(DBusMessage *msg);
DBusMessage *error_bonding_in_progress(DBusMessage *msg);


typedef void (*name_cb_t)(const char *name, void *user_data);

int name_listener_add(DBusConnection *connection, const char *name,
				name_cb_t func, void *user_data);
int name_listener_remove(DBusConnection *connection, const char *name,
				name_cb_t func, void *user_data);


/*======================================================================== 
    BlueZ D-Bus Manager service definitions "/org/bluez/Manager"
 *========================================================================*/

#define MGR_LIST_ADAPTERS	"ListAdapters"
#define MGR_DEFAULT_ADAPTER	"DefaultAdapter"

/* Signals sent in the Manager path */
#define BLUEZ_MGR_DEV_ADDED		"AdapterAdded"
#define BLUEZ_MGR_DEV_REMOVED		"AdapterRemoved"

/* Manager Signatures */
#define MGR_LIST_ADAPTERS_SIGNATURE		__END_SIG__
#define MGR_DEFAULT_ADAPTER_SIGNATURE		__END_SIG__

#define MGR_REPLY_ADAPTER_LIST_SIGNATURE	DBUS_TYPE_ARRAY_AS_STRING \
						__END_SIG__

/*======================================================================== 
    BlueZ D-Bus Adapter path definitions "/org/bluez/Adapter"
 *========================================================================*/
#define DEV_GET_ADDRESS			"GetAddress"
#define DEV_GET_VERSION			"GetVersion"
#define DEV_GET_REVISION		"GetRevision"
#define DEV_GET_MANUFACTURER		"GetManufacturer"
#define DEV_GET_COMPANY			"GetCompany"
#define DEV_GET_FEATURES		"GetFeatures"
#define DEV_GET_MODE			"GetMode"
#define DEV_SET_MODE			"SetMode"
#define DEV_GET_DISCOVERABLE_TO		"GetDiscoverableTimeout"
#define DEV_SET_DISCOVERABLE_TO		"SetDiscoverableTimeout"
#define DEV_IS_CONNECTABLE		"IsConnectable"
#define DEV_IS_DISCOVERABLE		"IsDiscoverable"
#define DEV_GET_MAJOR_CLASS		"GetMajorClass"
#define DEV_GET_MINOR_CLASS		"GetMinorClass"
#define DEV_SET_MINOR_CLASS		"SetMinorClass"
#define DEV_GET_SERVICE_CLASSES		"GetServiceClasses"
#define DEV_GET_NAME			"GetName"
#define DEV_SET_NAME			"SetName"
#define DEV_GET_REMOTE_VERSION		"GetRemoteVersion"
#define DEV_GET_REMOTE_REVISION		"GetRemoteRevision"
#define DEV_GET_REMOTE_MANUFACTURER	"GetRemoteManufacturer"
#define DEV_GET_REMOTE_COMPANY		"GetRemoteCompany"
#define DEV_GET_REMOTE_NAME		"GetRemoteName"
#define DEV_GET_REMOTE_ALIAS		"GetRemoteAlias"
#define DEV_SET_REMOTE_ALIAS		"SetRemoteAlias"
#define DEV_LAST_SEEN			"LastSeen"
#define DEV_LAST_USED			"LastUsed"
#define DEV_CREATE_BONDING		"CreateBonding"
#define DEV_REMOVE_BONDING		"RemoveBonding"
#define DEV_HAS_BONDING_NAME		"HasBonding"
#define DEV_LIST_BONDINGS		"ListBondings"
#define DEV_GET_PIN_CODE_LENGTH		"GetPinCodeLength"
#define DEV_GET_ENCRYPTION_KEY_SIZE	"GetEncryptionKeySize"
#define DEV_DISCOVER_DEVICES		"DiscoverdDevices"
#define DEV_CANCEL_DISCOVERY		"CancelDiscovery"
#define DEV_DISCOVER_CACHE		"DiscoverCache"
#define DEV_DISCOVER_SERVICE		"DiscoverService"

/*FIXME: maybe this section can be moved to a internal header file */
/* Adapter service signature */
#define DEV_GET_ADDRESS_SIGNATURE		__END_SIG__
#define DEV_GET_VERSION_SIGNATURE		__END_SIG__
#define DEV_GET_REVISION_SIGNATURE		__END_SIG__
#define DEV_GET_MANUFACTURER_SIGNATURE		__END_SIG__
#define DEV_GET_COMPANY_SIGNATURE		__END_SIG__
#define DEV_GET_FEATURES_SIGNATURE		__END_SIG__
#define DEV_GET_MODE_SIGNATURE			__END_SIG__
#define DEV_SET_MODE_SIGNATURE			DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_GET_DISCOVERABLE_TO_SIGNATURE	__END_SIG__
#define DEV_SET_DISCOVERABLE_TO_SIGNATURE	DBUS_TYPE_UINT32_AS_STRING \
						__END_SIG__
#define DEV_IS_CONNECTABLE_SIGNATURE		__END_SIG__
#define DEV_IS_DISCOVERABLE_SIGNATURE		__END_SIG__
#define DEV_GET_MAJOR_CLASS_SIGNATURE		__END_SIG__
#define DEV_GET_MINOR_CLASS_SIGNATURE		__END_SIG__
#define DEV_SET_MINOR_CLASS_SIGNATURE		DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_GET_SERVICE_CLASSES_SIGNATURE	__END_SIG__
#define DEV_GET_NAME_SIGNATURE			__END_SIG__
#define DEV_SET_NAME_SIGNATURE			DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_GET_REMOTE_VERSION_SIGNATURE	DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_GET_REMOTE_REVISION_SIGNATURE	DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_GET_REMOTE_MANUFACTURER_SIGNATURE	DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_GET_REMOTE_COMPANY_SIGNATURE	DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_GET_REMOTE_NAME_SIGNATURE		DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_GET_REMOTE_ALIAS_SIGNATURE		DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_SET_REMOTE_ALIAS_SIGNATURE		DBUS_TYPE_STRING_AS_STRING \
						DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_LAST_SEEN_SIGNATURE			DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_LAST_USED_SIGNATURE			DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_CREATE_BONDING_SIGNATURE		DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_REMOVE_BONDING_SIGNATURE		DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_HAS_BONDING_SIGNATURE		DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_LIST_BONDINGS_SIGNATURE		__END_SIG__
#define DEV_GET_PIN_CODE_LENGTH_SIGNATURE	DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_GET_ENCRYPTION_KEY_SIZE_SIGNATURE	DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__
#define DEV_DISCOVER_DEVICES_SIGNATURE		__END_SIG__
#define DEV_CANCEL_DISCOVERY_SIGNATURE		__END_SIG__
#define DEV_DISCOVER_CACHE_SIGNATURE		__END_SIG__
#define DEV_DISCOVER_SERVICE_SIGNATURE		DBUS_TYPE_STRING_AS_STRING \
						__END_SIG__

/* Signals sent in the adapter based path /org/bluez/Adapter/{hci0, hci1, ...} */
#define DEV_SIG_MODE_CHANGED		"ModeChanged"
#define DEV_SIG_NAME_CHANGED		"NameChanged"
#define DEV_SIG_MINOR_CLASS_CHANGED	"MinorClassChanged"
#define DEV_SIG_REMOTE_NAME_UPDATED	"RemoteNameUpdated"
#define DEV_SIG_REMOTE_ALIAS_CHANGED	"RemoteAliasChanged"
#define DEV_SIG_BONDING_CREATED		"BondingCreated"
#define DEV_SIG_BONDING_FAILED		"BondingFailed"
#define DEV_SIG_BONDING_REMOVED		"BondingRemoved"
#define DEV_SIG_DISCOVER_START		"DiscoveryStart"
#define DEV_SIG_DISCOVER_COMPLETE	"DiscoveryCompleted"
#define DEV_SIG_REMOTE_DEVICE_FOUND	"RemoteDeviceFound"

/*
 * Scanning modes, used by DEV_SET_MODE
 * off: remote devices are not allowed to find or connect to this device
 * connectable: remote devices are allowed to connect, but they are not
 *              allowed to find it.
 * discoverable: remote devices are allowed to connect and find this device
 * unknown: reserved to not allowed/future modes
 */
#define MODE_OFF		"off"
#define MODE_CONNECTABLE	"connectable"
#define MODE_DISCOVERABLE	"discoverable"
#define MODE_UNKNOWN		"unknown"

#define DFT_DISCOVERABLE_TIMEOUT	180	/* 3 seconds */
#define DISCOVERABLE_TIMEOUT_OFF	0

/* BLUEZ_DBUS_ERROR 
 * EFailed error messages signature is : su
 * Where the first argument is a string(error message description),
 * the last  is a uint32 that contains the error class(system, dbus or hci). */

/* Error code offsets */
#define BLUEZ_EBT_OFFSET		(0x00000000) /* see Bluetooth error code */
#define BLUEZ_EBT_EXT_OFFSET		(0x00000100)
#define BLUEZ_EDBUS_OFFSET		(0x00010000)
#define BLUEZ_ESYSTEM_OFFSET		(0x00020000)
#define BLUEZ_EFUTURE_OFFSET		(0x00040000)

/* D-Bus error code, class BLUEZ_EDBUS_OFFSET */
#define BLUEZ_EDBUS_UNKNOWN_METHOD	(0x01 | BLUEZ_EDBUS_OFFSET)
#define BLUEZ_EDBUS_WRONG_SIGNATURE	(0x02 | BLUEZ_EDBUS_OFFSET)
#define BLUEZ_EDBUS_WRONG_PARAM		(0x03 | BLUEZ_EDBUS_OFFSET)
#define BLUEZ_EDBUS_RECORD_NOT_FOUND	(0x04 | BLUEZ_EDBUS_OFFSET)
#define BLUEZ_EDBUS_NO_MEM   		(0x05 | BLUEZ_EDBUS_OFFSET)
#define BLUEZ_EDBUS_CONN_NOT_FOUND	(0x06 | BLUEZ_EDBUS_OFFSET)
#define BLUEZ_EDBUS_UNKNOWN_PATH	(0x07 | BLUEZ_EDBUS_OFFSET)
#define BLUEZ_EDBUS_NOT_IMPLEMENTED	(0x08 | BLUEZ_EDBUS_OFFSET)

#endif /* __H_BLUEZ_DBUS_H__ */