BlueZ D-Bus Health API description
**********************************

	Santiago Carot-Nemesio <sancane@gmail.com>
	José Antonio Santos-Cadenas <santoscadenas@gmail.com>
	Elvis Pfützenreuter <epx@signove.com>

Health Device Profile hierarchy
===============================

Service		org.bluez
Interface	org.bluez.HealthManager
Object path	/org/bluez/

Methods:

	object	CreateApplication(dict config)

		Returns the path of the new registered application.

		Dict is defined as bellow:
		{
			"DataType": uint16, (mandatory)
			"Role" : ("Source" or "Sink"), (mandatory)
			"Description" : string, (optional)
			"ChannelType" : ("Reliable" or "Streaming")
						(just for Sources, optional)
		}

		Application will be closed by the call or implicitly when the
		programs leaves the bus.

		Possible errors: org.bluez.Error.InvalidArguments

	void	DestroyApplication(object application)

		Closes the HDP application identified by the object path. Also
		application will be closed if the process that started it leaves
		the bus. Only the creator of the application will be able to
		destroy it.

		Possible errors: org.bluez.Error.InvalidArguments
				org.bluez.Error.NotFound
				org.bluez.Error.NotAllowed

--------------------------------------------------------------------------------

Service		org.bluez
Interface	org.bluez.HealthDevice
Object path	[variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX

Methods:

	Boolean Echo()

		Sends an echo petition to the remote service. Returns True if
		response matches with the buffer sent. If some error is detected
		False value is returned.

		Possible errors: org.bluez.Error.InvalidArguments
				org.bluez.Error.OutOfRange

	object CreateChannel(object application, string configuration)

		Creates a new data channel.
		The configuration should indicate the channel quality of
		service using one of this values "Reliable", "Streaming", "Any".

		Returns the object path that identifies the data channel that
		is already connected.

		Possible errors: org.bluez.Error.InvalidArguments
				org.bluez.Error.HealthError

	void DestroyChannel(object channel)

		Destroys the data channel object. Only the creator of the
		channel or the creator of the HealtApplication that received the
		data channel will be able to destroy it

		Possible errors: org.bluez.Error.InvalidArguments
				org.bluez.Error.NotFound
				org.bluez.Error.NotAllowed

Signals:

	void ChannelConnected(object channel)

		This signal is launched when a new data channel is created or
		when a known data channel is reconnected.

	void ChannelDeleted(object channel)

		This signal is launched when a data channel is deleted.

		After this signal the data channel path will not be valid and
		its path can be reused for future data channels.

	void PropertyChanged(string name, variant value)

		This signal indicates a changed value of the given property.

Properties:

	object MainChannel [readonly]

		The first reliable channel opened. It is needed by upper
		applications in order to send specific protocol data units. The
		first reliable can change after a reconnection.

--------------------------------------------------------------------------------

Service		org.bluez
Interface	org.bluez.HealthChannel
Object path	[variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/
							hdp_YYYY/channel_ZZ

Only the process that created the data channel or the creator of the
HealthApplication that received it will be able to call this methods.

Methods:

	dict GetProperties()

		Returns all properties for the interface. See the properties
		section for available properties.

		Posible errors: org.bluez.Error.NotAllowed

	fd Acquire()

		Returns the file descriptor for this data channel. If the data
		channel is not connected it will also reconnect.

		Possible errors: org.bluez.Error.NotConnected
				org.bluez.Error.NotAllowed

	void Release()

		Releases the fd. Application should also need to close() it.

		Possible errors: org.bluez.Error.NotAcquired
				org.bluez.Error.NotAllowed

Properties:

	string Type [readonly]

		The quality of service of the data channel. ("Reliable" or
		"Streaming")

	object Device [readonly]

		Identifies the Remote Device that is connected with. Maps with
		a HealthDevice object.
