diff options
| -rw-r--r-- | hcid/adapter.c | 183 | 
1 files changed, 101 insertions, 82 deletions
| diff --git a/hcid/adapter.c b/hcid/adapter.c index 6b618599..20b4ca1f 100644 --- a/hcid/adapter.c +++ b/hcid/adapter.c @@ -4125,94 +4125,20 @@ static DBusMessage *remove_service_record(DBusConnection *conn,  	return dbus_message_new_method_return(msg);  } -const char *major_class_str(uint32_t class) +static DBusMessage *request_authorization(DBusConnection *conn, +						DBusMessage *msg, void *data)  { -	uint8_t index = (class >> 8) & 0x1F; - -	if (index > 8) -		return major_cls[9]; /* uncategorized */ +	/* FIXME implement the request */ -	return major_cls[index]; -} - -const char *minor_class_str(uint32_t class) -{ -	uint8_t major_index = (class >> 8) & 0x1F; -	uint8_t minor_index; - -	switch (major_index) { -	case 1: /* computer */ -		minor_index = (class >> 2) & 0x3F; -		if (minor_index < NUM_ELEMENTS(computer_minor_cls)) -			return computer_minor_cls[minor_index]; -		else -			return ""; -	case 2: /* phone */ -		minor_index = (class >> 2) & 0x3F; -		if (minor_index < NUM_ELEMENTS(phone_minor_cls)) -			return phone_minor_cls[minor_index]; -		return ""; -	case 3: /* access point */ -		minor_index = (class >> 5) & 0x07; -		if (minor_index < NUM_ELEMENTS(access_point_minor_cls)) -			return access_point_minor_cls[minor_index]; -		else -			return ""; -	case 4: /* audio/video */ -		minor_index = (class >> 2) & 0x3F; -		if (minor_index < NUM_ELEMENTS(audio_video_minor_cls)) -			return audio_video_minor_cls[minor_index]; -		else -			return ""; -	case 5: /* peripheral */ -		minor_index = (class >> 6) & 0x03; -		if (minor_index < NUM_ELEMENTS(peripheral_minor_cls)) -			return peripheral_minor_cls[minor_index]; -		else -			return ""; -	case 6: /* imaging */ -		{ -			uint8_t shift_minor = 0; - -			minor_index = (class >> 4) & 0x0F; -			while (shift_minor < (sizeof(imaging_minor_cls) / sizeof(*imaging_minor_cls))) { -				if (((minor_index >> shift_minor) & 0x01) == 0x01) -					return imaging_minor_cls[shift_minor]; -				shift_minor++; -			} -		} -		break; -	case 7: /* wearable */ -		minor_index = (class >> 2) & 0x3F; -		if (minor_index < NUM_ELEMENTS(wearable_minor_cls)) -			return wearable_minor_cls[minor_index]; -		else -			return ""; -	case 8: /* toy */ -		minor_index = (class >> 2) & 0x3F; -		if (minor_index < NUM_ELEMENTS(toy_minor_cls)) -			return toy_minor_cls[minor_index]; -		else -			return ""; -	} - -	return ""; +	return NULL;  } -GSList *service_classes_str(uint32_t class) +static DBusMessage *cancel_authorization(DBusConnection *conn, +						DBusMessage *msg, void *data)  { -	uint8_t services = class >> 16; -	GSList *l = NULL; -	int i; - -	for (i = 0; i < (sizeof(service_cls) / sizeof(*service_cls)); i++) { -		if (!(services & (1 << i))) -			continue; - -		l = g_slist_append(l, (void *) service_cls[i]); -	} +	/* FIXME implement cancel request */ -	return l; +	return dbus_message_new_method_return(msg);  }  /* BlueZ 4.0 API */ @@ -4238,6 +4164,9 @@ static GDBusMethodTable adapter_methods[] = {  	{ "AddServiceRecord",	"s",	"u",	add_service_record	},  	{ "UpdateServiceRecord","us",	"",	update_service_record	},  	{ "RemoveServiceRecord","u",	"",	remove_service_record	}, +	{ "RequestAuthorization","su",	"",	request_authorization, +						G_DBUS_METHOD_FLAG_ASYNC}, +	{ "CancelAuthorization","",	"",	cancel_authorization	},  	{ }  }; @@ -4437,3 +4366,93 @@ dbus_bool_t adapter_init(DBusConnection *conn,  			old_adapter_methods, old_adapter_signals,  			NULL, adapter, NULL);  } + +const char *major_class_str(uint32_t class) +{ +	uint8_t index = (class >> 8) & 0x1F; + +	if (index > 8) +		return major_cls[9]; /* uncategorized */ + +	return major_cls[index]; +} + +const char *minor_class_str(uint32_t class) +{ +	uint8_t major_index = (class >> 8) & 0x1F; +	uint8_t minor_index; + +	switch (major_index) { +	case 1: /* computer */ +		minor_index = (class >> 2) & 0x3F; +		if (minor_index < NUM_ELEMENTS(computer_minor_cls)) +			return computer_minor_cls[minor_index]; +		else +			return ""; +	case 2: /* phone */ +		minor_index = (class >> 2) & 0x3F; +		if (minor_index < NUM_ELEMENTS(phone_minor_cls)) +			return phone_minor_cls[minor_index]; +		return ""; +	case 3: /* access point */ +		minor_index = (class >> 5) & 0x07; +		if (minor_index < NUM_ELEMENTS(access_point_minor_cls)) +			return access_point_minor_cls[minor_index]; +		else +			return ""; +	case 4: /* audio/video */ +		minor_index = (class >> 2) & 0x3F; +		if (minor_index < NUM_ELEMENTS(audio_video_minor_cls)) +			return audio_video_minor_cls[minor_index]; +		else +			return ""; +	case 5: /* peripheral */ +		minor_index = (class >> 6) & 0x03; +		if (minor_index < NUM_ELEMENTS(peripheral_minor_cls)) +			return peripheral_minor_cls[minor_index]; +		else +			return ""; +	case 6: /* imaging */ +		{ +			uint8_t shift_minor = 0; + +			minor_index = (class >> 4) & 0x0F; +			while (shift_minor < (sizeof(imaging_minor_cls) / sizeof(*imaging_minor_cls))) { +				if (((minor_index >> shift_minor) & 0x01) == 0x01) +					return imaging_minor_cls[shift_minor]; +				shift_minor++; +			} +		} +		break; +	case 7: /* wearable */ +		minor_index = (class >> 2) & 0x3F; +		if (minor_index < NUM_ELEMENTS(wearable_minor_cls)) +			return wearable_minor_cls[minor_index]; +		else +			return ""; +	case 8: /* toy */ +		minor_index = (class >> 2) & 0x3F; +		if (minor_index < NUM_ELEMENTS(toy_minor_cls)) +			return toy_minor_cls[minor_index]; +		else +			return ""; +	} + +	return ""; +} + +GSList *service_classes_str(uint32_t class) +{ +	uint8_t services = class >> 16; +	GSList *l = NULL; +	int i; + +	for (i = 0; i < (sizeof(service_cls) / sizeof(*service_cls)); i++) { +		if (!(services & (1 << i))) +			continue; + +		l = g_slist_append(l, (void *) service_cls[i]); +	} + +	return l; +} | 
