diff options
| author | Marcel Holtmann <marcel@holtmann.org> | 2008-09-24 03:31:50 +0200 | 
|---|---|---|
| committer | Marcel Holtmann <marcel@holtmann.org> | 2008-09-24 03:31:50 +0200 | 
| commit | 175702e7b18701999d34e9fd3067098dbd6fa0f0 (patch) | |
| tree | ef7552508fd06067add04d4021db9dc79aa1b96f | |
| parent | 5475636b22ecf822cb163d4b3a03e3d5a29cbd51 (diff) | |
| parent | 3686ae20cd9a72a28d9d018ac88b06e5eed1768a (diff) | |
Merge branch 'for-upstream' of git://gitorious.org/bluez/vudentzs-clone
| -rw-r--r-- | doc/adapter-api.txt | 2 | ||||
| -rw-r--r-- | serial/proxy.c | 4 | ||||
| -rw-r--r-- | src/adapter.c | 166 | 
3 files changed, 155 insertions, 17 deletions
| diff --git a/doc/adapter-api.txt b/doc/adapter-api.txt index 16f35918..fe19de2f 100644 --- a/doc/adapter-api.txt +++ b/doc/adapter-api.txt @@ -62,7 +62,7 @@ Methods		dict GetProperties()  			Possible Errors: org.bluez.Error.Rejected -		void ReleaseSession{} +		void ReleaseSession()  			Release a previous requested session. diff --git a/serial/proxy.c b/serial/proxy.c index 7128bdbc..643e19aa 100644 --- a/serial/proxy.c +++ b/serial/proxy.c @@ -1002,9 +1002,11 @@ static void manager_path_unregister(void *data)  	/* Remove proxy objects */  	for (l = adapter->proxies; l; l = l->next) {  		struct serial_proxy *prx = l->data; +		char *path = g_strdup(prx->path); -		g_dbus_unregister_interface(adapter->conn, prx->path, +		g_dbus_unregister_interface(adapter->conn, path,  					SERIAL_PROXY_INTERFACE); +		g_free(path);  	}  	if (adapter->conn) diff --git a/src/adapter.c b/src/adapter.c index 4a6ea8c2..94171eb7 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -597,6 +597,36 @@ done:  	return dbus_message_new_method_return(msg);  } +static DBusMessage *set_powered(DBusConnection *conn, DBusMessage *msg, +				gboolean powered, void *data) +{ +	struct btd_adapter *adapter = data; +	uint8_t mode; + +	mode = powered ? get_mode(&adapter->bdaddr, "on") : MODE_OFF; + +	if (mode == adapter->mode) +		return dbus_message_new_method_return(msg); + +	return set_mode(conn, msg, mode, data); +} + +static DBusMessage *set_discoverable(DBusConnection *conn, DBusMessage *msg, +				gboolean discoverable, void *data) +{ +	struct btd_adapter *adapter = data; +	const char *strmode; +	uint8_t mode; + +	strmode = discoverable ? "discoverable" : "connectable"; +	mode = get_mode(&adapter->bdaddr, strmode); + +	if (mode == adapter->mode) +		return dbus_message_new_method_return(msg); + +	return set_mode(conn, msg, mode, data); +} +  static struct session_req *find_session(GSList *list, DBusMessage *msg)  {  	GSList *l; @@ -1509,7 +1539,7 @@ static DBusMessage *get_properties(DBusConnection *conn,  	DBusMessageIter iter;  	DBusMessageIter dict;  	char str[249], srcaddr[18]; -	gboolean discov_active; +	gboolean bproperty;  	char **devices;  	int i;  	GSList *l; @@ -1549,18 +1579,28 @@ static DBusMessage *get_properties(DBusConnection *conn,  	dbus_message_iter_append_dict_entry(&dict, "Mode",  						DBUS_TYPE_STRING, &property); +	/* Powered */ +	bproperty = adapter->up ? TRUE : FALSE; +	dbus_message_iter_append_dict_entry(&dict, "Powered", +					DBUS_TYPE_BOOLEAN, &bproperty); + +	/* Discoverable */ +	bproperty = adapter->scan_mode == SCAN_INQUIRY ? TRUE : FALSE; +	dbus_message_iter_append_dict_entry(&dict, "Discoverable", +					DBUS_TYPE_BOOLEAN, &bproperty); +  	/* DiscoverableTimeout */  	dbus_message_iter_append_dict_entry(&dict, "DiscoverableTimeout",  				DBUS_TYPE_UINT32, &adapter->discov_timeout);  	if (adapter->state & PERIODIC_INQUIRY || adapter->state & STD_INQUIRY) -		discov_active = TRUE; +		bproperty = TRUE;  	else -		discov_active = FALSE; +		bproperty = FALSE;  	/* Discovering */  	dbus_message_iter_append_dict_entry(&dict, "Discovering", -					DBUS_TYPE_BOOLEAN, &discov_active); +					DBUS_TYPE_BOOLEAN, &bproperty);  	/* Devices */  	devices = g_new0(char *, g_slist_length(adapter->devices) + 1); @@ -1635,15 +1675,33 @@ static DBusMessage *set_property(DBusConnection *conn,  		return set_mode(conn, msg, get_mode(&adapter->bdaddr, mode),  				data); +	} else if (g_str_equal("Powered", property)) { +		gboolean powered; + +		if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN) +			return invalid_args(msg); + +		dbus_message_iter_get_basic(&sub, &powered); + +		return set_powered(conn, msg, powered, data); +	} else if (g_str_equal("Discoverable", property)) { +		gboolean discoverable; + +		if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN) +			return invalid_args(msg); + +		dbus_message_iter_get_basic(&sub, &discoverable); + +		return set_discoverable(conn, msg, discoverable, data);  	}  	return invalid_args(msg);  } -static DBusMessage *request_mode(DBusConnection *conn, -					DBusMessage *msg, void *data) +static DBusMessage *mode_request(DBusConnection *conn, +					DBusMessage *msg, const char *mode, +					void *data)  { -	const char *mode;  	struct btd_adapter *adapter = data;  	struct session_req *req;  	uint8_t new_mode; @@ -1652,10 +1710,6 @@ static DBusMessage *request_mode(DBusConnection *conn,  	ba2str(&adapter->bdaddr, srcaddr); -	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &mode, -						DBUS_TYPE_INVALID)) -		return invalid_args(msg); -  	new_mode = get_mode(&adapter->bdaddr, mode);  	if (new_mode != MODE_CONNECTABLE && new_mode != MODE_DISCOVERABLE)  		return invalid_args(msg); @@ -1695,7 +1749,25 @@ static DBusMessage *request_mode(DBusConnection *conn,  	return NULL;  } -static DBusMessage *release_mode(DBusConnection *conn, +static DBusMessage *request_mode(DBusConnection *conn, +					DBusMessage *msg, void *data) +{ +	const char *mode; + +	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &mode, +						DBUS_TYPE_INVALID)) +		return invalid_args(msg); + +	return mode_request(conn, msg, mode, data); +} + +static DBusMessage *request_session(DBusConnection *conn, +					DBusMessage *msg, void *data) +{ +	return mode_request(conn, msg, "connectable", data); +} + +static DBusMessage *release_session(DBusConnection *conn,  					DBusMessage *msg, void *data)  {  	struct btd_adapter *adapter = data; @@ -1981,8 +2053,13 @@ static GDBusMethodTable adapter_methods[] = {  	{ "SetProperty",	"sv",	"",	set_property,  						G_DBUS_METHOD_FLAG_ASYNC},  	{ "RequestMode",	"s",	"",	request_mode, +						G_DBUS_METHOD_FLAG_ASYNC | +						G_DBUS_METHOD_FLAG_DEPRECATED}, +	{ "ReleaseMode",	"",	"",	release_session, +						G_DBUS_METHOD_FLAG_DEPRECATED}, +	{ "RequestSession",	"",	"",	request_session,  						G_DBUS_METHOD_FLAG_ASYNC}, -	{ "ReleaseMode",	"",	"",	release_mode		}, +	{ "ReleaseSession",	"",	"",	release_session		},  	{ "StartDiscovery",	"",	"",	adapter_start_discovery },  	{ "StopDiscovery",	"",	"",	adapter_stop_discovery,  						G_DBUS_METHOD_FLAG_ASYNC}, @@ -2233,6 +2310,8 @@ static void adapter_up(struct btd_adapter *adapter, int dd)  	const char *pmode;  	char mode[14], srcaddr[18];  	int i; +	gboolean powered; +	gboolean discoverable;  	ba2str(&adapter->bdaddr, srcaddr); @@ -2305,6 +2384,19 @@ static void adapter_up(struct btd_adapter *adapter, int dd)  					ADAPTER_INTERFACE, "Mode",  					DBUS_TYPE_STRING, &pmode); +	powered = adapter->scan_mode == SCAN_DISABLED ? FALSE : TRUE; + +	dbus_connection_emit_property_changed(connection, adapter->path, +					ADAPTER_INTERFACE, "Powered", +					DBUS_TYPE_BOOLEAN, &powered); + +	discoverable = adapter->scan_mode == (SCAN_PAGE | SCAN_INQUIRY) ? TRUE  +				: FALSE; + +	dbus_connection_emit_property_changed(connection, adapter->path, +					ADAPTER_INTERFACE, "Discoverable", +					DBUS_TYPE_BOOLEAN, &discoverable); +  	load_drivers(adapter);  	load_devices(adapter);  } @@ -2473,6 +2565,7 @@ static void unload_drivers(struct btd_adapter *adapter)  int adapter_stop(struct btd_adapter *adapter)  {  	const char *mode = "off"; +	gboolean powered, discoverable;  	/* cancel pending timeout */  	if (adapter->discov_timeout_id) { @@ -2518,6 +2611,20 @@ int adapter_stop(struct btd_adapter *adapter)  					ADAPTER_INTERFACE, "Mode",  					DBUS_TYPE_STRING, &mode); +	powered = FALSE; + +	dbus_connection_emit_property_changed(connection, adapter->path, +					ADAPTER_INTERFACE, "Powered", +					DBUS_TYPE_BOOLEAN, &powered); + +	if (adapter->scan_mode == (SCAN_PAGE | SCAN_INQUIRY)) { +		discoverable = FALSE; + +		dbus_connection_emit_property_changed(connection, adapter->path, +					ADAPTER_INTERFACE, "Discoverable", +					DBUS_TYPE_BOOLEAN, &discoverable); +	} +  	adapter->up = 0;  	adapter->scan_mode = SCAN_DISABLED;  	adapter->mode = MODE_OFF; @@ -2921,17 +3028,33 @@ void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode)  {  	const char *mode;  	const gchar *path = adapter_get_path(adapter); - -	adapter_set_scan_mode(adapter, scan_mode); +	gboolean powered; +	gboolean discoverable;  	switch (scan_mode) {  	case SCAN_DISABLED:  		mode = "off";  		adapter_set_mode(adapter, MODE_OFF); +		powered = FALSE; +		dbus_connection_emit_property_changed(connection, path, +						ADAPTER_INTERFACE, "Powered", +						DBUS_TYPE_BOOLEAN, &powered);  		break;  	case SCAN_PAGE:  		mode = "connectable";  		adapter_set_mode(adapter, MODE_CONNECTABLE); + +		if (adapter->scan_mode == SCAN_DISABLED) { +			powered = TRUE; +			dbus_connection_emit_property_changed(connection, path, +						ADAPTER_INTERFACE, "Powered", +						DBUS_TYPE_BOOLEAN, &powered); +		} else { +			discoverable = FALSE; +			dbus_connection_emit_property_changed(connection, path, +						ADAPTER_INTERFACE, "Discoverable", +						DBUS_TYPE_BOOLEAN, &discoverable); +		}  		break;  	case (SCAN_PAGE | SCAN_INQUIRY): @@ -2944,6 +3067,17 @@ void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode)  			adapter_set_mode(adapter, MODE_DISCOVERABLE);  			mode = "discoverable";  		} + +		if (adapter->scan_mode == SCAN_DISABLED) { +			powered = TRUE; +			dbus_connection_emit_property_changed(connection, path, +						ADAPTER_INTERFACE, "powered", +						DBUS_TYPE_BOOLEAN, &powered); +		} +		discoverable = TRUE; +		dbus_connection_emit_property_changed(connection, path, +						ADAPTER_INTERFACE, "Discoverable", +						DBUS_TYPE_BOOLEAN, &discoverable);  		break;  	case SCAN_INQUIRY:  		/* Address the scenario where another app changed the scan mode */ @@ -2959,6 +3093,8 @@ void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode)  	dbus_connection_emit_property_changed(connection, path,  					ADAPTER_INTERFACE, "Mode",  					DBUS_TYPE_STRING, &mode); + +	adapter_set_scan_mode(adapter, scan_mode);  }  struct agent *adapter_get_agent(struct btd_adapter *adapter) | 
