BlueZ D-Bus Adapter API description
***********************************

Copyright (C) 2004-2008  Marcel Holtmann <marcel@holtmann.org>
Copyright (C) 2005-2006  Johan Hedberg <johan.hedberg@nokia.com>
Copyright (C) 2005-2006  Claudio Takahasi <claudio.takahasi@indt.org.br>
Copyright (C) 2006-2007  Luiz von Dentz <luiz.dentz@indt.org.br>


Adapter hierarchy
=================

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

Methods		dict GetProperties()

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

			Possible Errors: org.bluez.Error.DoesNotExist
					 org.bluez.Error.InvalidArguments

		void SetProperty(string name, variant value)

			Changes the value of the specified property. Only
			properties that are listed a read-write are changeable.
			On success this will emit a PropertyChanged signal.

			Possible Errors: org.bluez.Error.DoesNotExist
					 org.bluez.Error.InvalidArguments

		void RequestSession()

			This method will request a client session that
			provides operational Bluetooth. A possible mode
			change must be confirmed by the user via the agent.

			Possible Errors: org.bluez.Error.Rejected

		void ReleaseSession()

			Release a previous requested session.

			Possible Errors: org.bluez.Error.DoesNotExist

		void StartDiscovery()

			This method starts the device discovery session. This
			includes an inquiry procedure and remote device name
			resolving. Use StopDiscovery to release the sessions
			acquired.

			This process will start emitting DeviceFound and
			PropertyChanged "Discovering" signals.

			Possible errors: org.bluez.Error.NotReady
					 org.bluez.Error.Failed

		void StopDiscovery()

			This method will cancel any previous StartDiscovery
			transaction.

			Note that a discovery procedure is shared between all
			discovery sessions thus calling StopDiscovery will only
			release a single session.

			Possible errors: org.bluez.Error.NotReady
					 org.bluez.Error.Failed
					 org.bluez.Error.NotAuthorized

		object FindDevice(string address)

			Returns the object path of device for given address.
			The device object needs to be first created via
			CreateDevice or CreatePairedDevice.

			Possible Errors: org.bluez.Error.DoesNotExist
					 org.bluez.Error.InvalidArguments

		array{object} ListDevices()

			Returns list of device object paths.

			Possible errors: org.bluez.Error.InvalidArguments
					 org.bluez.Error.Failed
					 org.bluez.Error.OutOfMemory

		object CreateDevice(string address)

			Creates a new object path for a remote device. This
			method will connect to the remote device and retrieve
			all SDP records.

			If the object for the remote device already exists
			this method will fail.

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

		object CreatePairedDevice(string address, object agent,
							string capability)

			Creates a new object path for a remote device. This
			method will connect to the remote device and retrieve
			all SDP records and then initiate the pairing.

			If previously CreateDevice was used successfully,
			this method will only initiate the pairing.

			Compared to CreateDevice this method will fail if
			the pairing already exists, but not if the object
			path already has been created. This allows applications
			to use CreateDevice first and the if needed use
			CreatePairedDevice to initiate pairing.

			The agent object path is assumed to reside within the
			process (D-Bus connection instance) that calls this
			method. No separate registration procedure is needed
			for it and it gets automatically released once the
			pairing operation is complete.

			The capability parameter is the same as for the
			RegisterAgent method.

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

		void CancelDeviceCreation(string address)

			Aborts either a CreateDevice call or a
			CreatePairedDevice call.

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

		void RemoveDevice(object device)

			This removes the remote device object at the given
			path. It will remove also the pairing information.

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

		void RegisterAgent(object agent, string capability)

			This registers the adapter wide agent.

			The object path defines the path the of the agent
			that will be called when user input is needed.

			If an application disconnects from the bus all
			of its registered agents will be removed.

			The capability parameter can have the values
			"DisplayOnly", "DisplayYesNo", "KeyboardOnly" and
			"NoInputNoOutput" which reflects the input and output
			capabilities of the agent. If an empty string is
			used it will fallback to "DisplayYesNo".

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

		void UnregisterAgent(object agent)

			This unregisters the agent that has been previously
			registered. The object path parameter must match the
			same value that has been used on registration.

			Possible errors: org.bluez.Error.DoesNotExist

Signals		PropertyChanged(string name, variant value)

			This signal indicates a changed value of the given
			property.

		DeviceFound(string address, dict values)

			This signal will be send every time an inquiry result
			has been found by the service daemon. In general they
			only appear during a device discovery.

			The dictionary can contain bascially the same values
			that we be returned by the GetProperties method
			from the org.bluez.Device interface. In addition there
			can be values for the RSSI and the TX power level.

		DeviceDisappeared(string address)

			This signal will be send when an inquiry session for
			a periodic discovery finishes and previously found
			devices are no longer in range or visible.

		DeviceCreated(object device)

			Parameter is object path of created device.

		DeviceRemoved(object device)

			Parameter is object path of removed device.

Properties	string Address [readonly]

			The Bluetooth device address.

		string Name [readwrite]

			The Bluetooth friendly name. This value can be
			changed and a PropertyChanged signal will be emitted.

		boolean Powered [readwrite]

			Switch an adapter on or off. This will also set the
			appropiate connectable state.

		boolean Discoverable [readwrite]

			Switch an adapter to discoverable or non-discoverable
			to either make it visible or hide it. This is a global
			setting and should only be used by the settings
			application.

			If the DiscoverableTimeout is set to a non-zero
			value then the system will set this value back to
			false after the timer expired.

			In case the adapter is switched off, setting this
			value will fail.

			When changing the Powered property the new state of
			this property will be updated via a PropertyChanged
			signal.

		boolean Pairable [readwrite]

			Switch an adapter to pairable or non-pairable. This is
			a global setting and should only be used by the
			settings application.

			Note that this property only affects incoming pairing
			requests.

		uint32 PaireableTimeout [readwrite]

			The pairable timeout in seconds. A value of zero
			means that the timeout is disabled and it will stay in
			pareable mode forever.

		uint32 DiscoverableTimeout [readwrite]

			The discoverable timeout in seconds. A value of zero
			means that the timeout is disabled and it will stay in
			discoverable/limited mode forever.

			The default value for the discoverable timeout should
			be 180 seconds (3 minutes).

		boolean Discovering [readonly]

			Indicates that a device discovery procedure is active.

		array{object} Devices [readonly]

			List of device object paths.
