D-Bus API description for BlueZ
*******************************

Copyright (C) 2004-2007  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) 2005-2006  Eduardo Rocha <eduardo.rocha@indt.org.br>


Constant definitions
====================

The class of device definition from the Bluetooth specification divides into
three different parts. It the major class, the minor class and the service
classes. The D-Bus interface will always use string constants to identify
any of these classes.

Service classes		positioning, networking, rendering, capturing,
			object transfer, audio, telephony, information

Major classes		miscellaneous, computer, phone, access point,
			audio/video, peripheral, imaging, wearable, toy,
			uncategorized

Minor classes computer	uncategorized, desktop, server, laptop, handheld,
			palm, wearable

Minor classes phone	uncategorized, cellular, cordless, smart phone,
			modem, isdn

Minor classes access point	fully, 1-17 percent, 17-33 percent,
			33-50 percent, 50-67 percent, 67-83 percent,
			83-99 percent, not available

Minor classes audio video	uncategorized, headset, handsfree,microphone,
			loudspeaker, headphones, portable audio, car audio,
			set-top box, hifi audio, vcr, video camera, camcorder,
			video monitor, video display and loudspeaker,
			video conferencing, gaming/toy, unknown

Minor classes peripheral	uncategorized, keyboard, pointing, combo

Minor classes imaging	display, camera, scanner, printer

Minor classes wearable	wrist watch, pager, jacket, helmet, glasses

Minor classes toy	robot, vehicle, doll, controller, game

Error hierarchy
===============

Interface	org.bluez.Error

Errors		Failed

			An unknown error occured. The error messages is
			taken from the strerror(errno) function.

		InvalidArguments

			Error returned when the argument list is invalid or
			out of specification for the method.

		NotAuthorized

			Error returned when the caller of a method is not
			authorized. This might happen if a caller tries to
			terminate a connection that it hasn't created.

		OutOfMemory

			Error returned when a memory allocation via malloc()
			fails. This error is similar to ENOMEM.

		NoSuchAdapter

			Error returned when the requested adapter doesn't
			exists. This error is similar to ENODEV.

		NotReady

			Error returned when the adapter is DOWN.

		NotAvailable

			Error returned when a specified record is not
			available.

		NotConnected

			Error returned when the remote device isn't connected
			at the moment.

		ConnectionAttemptFailed

		AlreadyExists

			Error returned if a record for a specific procedure
			already exists and it has been tried create a new
			one. The error message however should indicate the
			procedure that fails. For example "Bonding already
			exists"

		DoesNotExist

			Error returned if a record for a specifc procedure
			doesn't exist. The error message however should
			indicate the procedure that fails. For example
			"Bonding does not exist".

		InProgress

			Error returned if an operation is in progress. Since
			this is a generic error that can be used in various
			situations, the error message should be more clear
			about what is in progress. For example "Bonding in
			progress".

		NotSupported
			The feature is not supported by the remote device

		AuthenticationFailed

		AuthenticationTimeout

		AuthenticationRejected

		AuthenticationCanceled

		UnsupportedMajorClass


Manager hierarchy
=================

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

Methods		uint32 InterfaceVersion()

			Returns the current interface version. At the moment
			only version 0 is supported.

			Possible errors: org.bluez.Error.InvalidArguments

		string DefaultAdapter()

			Returns object path for the default adapter.

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

		string FindAdapter(string pattern)

			Returns object path for the specified adapter. Valid
			patterns are "hci0" or "00:11:22:33:44:55".

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

		array{string} ListAdapters()

			Returns list of adapter object paths under /org/bluez

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

		string FindService(string pattern)

			Returns object path for the specified service. Valid
			patterns are the unqiue identifier or a bus name.

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

		array{string} ListServices()

			Returns list of object paths of current services.

			Possible errors: org.bluez.Error.InvalidArguments

		string ActivateService(string pattern)

			Returns the unqiue bus id of the specified service.
			Valid patterns are the same as for FindService(). If
			the service is not running it will be started.

Signals		void AdapterAdded(string path)

			Parameter is object path of added adapter.

		void AdapterRemoved(string path)

			Parameter is object path of removed adapter.

		void DefaultAdapterChanged(string path)

			Parameter is object path of the new default adapter.

		void ServiceAdded(string path)

			Parameter is object path of registered service agent.

		void ServiceRemoved(string path)

			Parameter is object path of unregistered service agent.


Database hierarchy
==================

Service		org.bluez
Interface	org.bluez.Database
Object path	/org/bluez or /org/bluez/{hci0,hci1,...}

Methods		void RegisterService(string identifier, string name, string description)

			This method registers a new service specified by
			its unique identifier. This is only needed for
			services that are not started through the
			Bluetooth daemon.

		void UnregisterService(string identifier)

			This method unregisters a service specified by
			its unique identifier.

		uint32 AddServiceRecord(array{byte})

			Adds a new service record and returns the assigned
			record handle.

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

		uint32 AddServiceRecordFromXML(string record)

			Adds a new service record and returns the assigned
			record handle.

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

		void UpdateServiceRecord(uint32 handle, array{byte})

			Updates a given service record.

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

		void UpdateServiceRecordFromXML(uint32 handle, string record)

			Updates a given service record provided in the
			XML format.

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

		void RemoveServiceRecord(uint32 handle)

			Remove a service record identified by its handle.

			It is only possible to remove service records that
			where added by the current connection.

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

		void RequestAuthorization(string address, string uuid)

			This method gets called when a service wants to check
			if a remote device is authorized to perform some
			action. The authorization request is forwarded to an
			authorization agent.

			The address parameter is the Bluetooth address of the
			remote device and the uuid is the identifier of the
			profile requesting the authorization. This parameter
			can also be left blank.

		void CancelAuthorizationRequest(string address, string uuid)

			This method cancels an authorization process requested
			by a previous call to RequestAuthorization(). The
			address and uuid parameters must match.


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

Service		org.bluez
Interface	org.bluez.Adapter
Object path	/org/bluez/{hci0,hci1,...}

Methods		dict GetInfo()

			Returns the properties of the local adapter.

		string GetAddress()

			Returns the device address for a given path.

			Example: "00:11:22:33:44:55"

			Possible errors: none

		string GetVersion()

			Returns the version of the Bluetooth chip. This version
			is compiled from the LMP version. In case of EDR the
			features attribute must be checked.

			Example: "Bluetooth 2.0 + EDR"

			Possible errors: none

		string GetRevision()

			Returns the revision of the Bluetooth chip. This is a
			vendor specific value and in most cases it represents
			the firmware version. This might derive from the HCI
			revision and LMP subversion values or via extra vendor
			specific commands.

			In case the revision of a chip is not available. This
			method should return the LMP subversion value as a
			string.

			Example: "HCI 19.2"

			Possible errors: org.bluez.Error.Failed

		string GetManufacturer()

			Returns the manufacturer of the Bluetooth chip. If
			the company id is not know the sting "Company ID %d"
			where %d should be replaced with the numeric value
			from the manufacturer field.

			Example: "Cambridge Silicon Radio"

			Possible errors: org.bluez.Error.Failed

		string GetCompany()

			Returns the company name from the OUI database of the
			Bluetooth device address. This function will need a
			valid and up-to-date oui.txt from the IEEE. This value
			will be different from the manufacturer string in the
			most cases.

			If the oui.txt file is not present or the OUI part of
			the BD_ADDR is not listed, it should return the
			string "OUI %s" where %s is the actual OUI.

			Example: "Apple Computer"

			Possible errors: org.bluez.Error.Failed

		array{string} ListAvailableModes()

			Returns a list of available modes the adapter can
			be switched into.

		string GetMode()

			Returns the current mode of a adapter.

			Valid modes: "off", "connectable", "discoverable",
					"limited".

			Possible errors: none

		void SetMode(string mode)

			Sets mode of the adapter. See GetMode for valid strings
			for the mode parameter.

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

		uint32 GetDiscoverableTimeout()

			Returns 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).

			Possible errors: none

		void SetDiscoverableTimeout(uint32 timeout)

			Sets the discoverable timeout in seconds. A value of
			zero disables the timeout and the adapter would be
			always discoverable/limited.

			Changing this value doesn't set the adapter into
			discoverable/limited mode. The SetMode method must be used.

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

		boolean IsConnectable()

			Returns true if the local adapter is connectable and
			false if it is switched off.

			It is also possible to use GetMode to retrieve this
			information.

			Possible errors: none

		boolean IsDiscoverable()

			Returns true if the local adapter is discoverable/limited
			and false if it is only connectable or switched off.

			It is also possible to use GetMode to retrieve this
			information.

			Possible errors: none

		boolean IsConnected(string address)

			Return true if the local adapter is connected to
			the remote device.

			Possible errors: org.bluez.Error.InvalidArguments

		array{string} ListConnections()

			Returns a list with addresses of currently connected
			remote devices.

			Possible errors: none

		string GetMajorClass()

			Returns the current major class value for this
			system. Currently, only "computer" is supported.
			For the other values, unsupported major class
			error is returned.

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

		array{string} ListAvailableMinorClasses()

			Returns a list of available minor classes for the
			currently used major class. At the moment this should
			only return a list of minor classes if the major
			class is set to "computer".

			If the major class is not "computer" an error should
			be returned.

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

		string GetMinorClass()

			Returns the current minor class value for this
			system where the default major class is "computer".

			If the major class is not "computer" an error should
			be returned.

			Valid values: "uncategorized", "desktop", "server",
			              "laptop", "handheld", "palm", "wearable"

			The default value is "uncategorized".

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

		void SetMinorClass(string minor)

			Sets the local minor class and on success it sends
			a MinorClassChanged signal.

			If the major class is not "computer" an error should
			be returned.

			Possible errors: org.bluez.Error.NotReady
					 org.bluez.Error.InvalidArguments
					 org.bluez.Error.NoSuchAdapter
					 org.bluez.Error.Failed
					 org.bluez.Error.UnsupportedMajorClass

		array{string} GetServiceClasses()

			Returns the current set of service classes.

			In the case no service classes are set (when no
			service has been registered) an empty list should
			be returned.

			Valid values: "positioning", "networking", "rendering",
			              "capturing", "object transfer", "audio",
			              "telephony", "information"

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

		string GetName()

			Returns the local adapter name (friendly name) in UTF-8.

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

		void SetName(string name)

			Sets the local adapter name. If EIR is supported by
			the local hardware this modifies also the extended
			response data value.

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

			Questions: What to do (in case of EIR) if one
			           low-level API call fails.

		dict GetRemoteInfo(string address)

			Returns the properties for a remote device.

		string GetRemoteVersion(string address)

			Get the version info for a remote device. This request
			returns always this information based on its cached
			data. The base for this string is the LMP version
			value and the features for EDR support.

			Not available can be received if the remote device was
			not contacted(connected) previously. Remote data is
			automatically retrieved in the first connection.

			Example: "Bluetooth 2.0 + EDR"

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

		string GetRemoteRevision(string address)

			Get the revision of the Bluetooth chip. This is a
			vendor specific value and in most cases it represents
			the firmware version. This derives only from the LMP
			subversion value.

			Example: "HCI 19.2"

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

		string GetRemoteManufacturer(string address)

			Get the manufacturer of the chip for a remote device.

			Example: "Nokia Mobile Phones"

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

		string GetRemoteCompany(string address)

			Get the company name from the OUI database of the
			Bluetooth device address. This function will need a
			valid and up-to-date oui.txt from the IEEE. This value
			will be different from the manufacturer string in the
			most cases.

			Example: "Microsoft Corporation"

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

		string GetRemoteMajorClass(string address)

			Get the major device class of the specified device.

			Example: "computer"

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

		string GetRemoteMinorClass(string address)

			Get the minor device class of the specified device.

			Example: "laptop"

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

		array{string} GetRemoteServiceClasses(string address)

			Get the service classes of the specified device.

			Example: ["networking", "object transfer"]

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

		uint32 GetRemoteClass(string address)

			Get the remote major, minor, and service classes
			encoded as 32 bit integer.

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

		array{byte} GetRemoteFeatures(string address)

			Get the remote features encoded as bit mask.

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

		string GetRemoteName(string address)

			Get the remote device's name. This request returns always
			a cached name. The service daemon is responsible for
			updating the cache.

			NotAvailable error is returned if the name is not in
			the cache. But if there is a discovery running, then
			this function will return RequestDeferred.  In this
			case the service daemon will queue the request and
			it will try to resolve the name at the next possible
			opportunity. On success a RemoteNameUpdated signal will
			be send and if a failure happens it will be indicated by
			a RemoteNameFailed signal.

			If this is an empty string, the UI might want to
			display the BD_ADDR instead.

			Example: "00:11:22:33:44:55", "Nokia 770"

			Possible errors: org.bluez.Error.InvalidArguments
					 org.bluez.Error.NotAvailable
					 org.bluez.Error.NotReady
					 org.bluez.Error.RequestDeferred

		string GetRemoteAlias(string address)

			Returns alias name for remote device. If this is
			an empty string value, the UI should show the
			remote name instead.

			An alias should supersede the remote name.

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

		void SetRemoteAlias(string address, string alias)

			Sets alias name for remote device. If alias name is
			empty, then no alias is set.

			On success the SetRemoteAlias method will produce a
			RemoteAliasChanged signal which applications can use
			to update their current display of the remote device
			name.

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

		void ClearRemoteAlias(string address)

			Resets alias name for remote device. If there is no
			alias set for the device this method will silently
			succeed, but no RemoteAliasCleared signal has to be
			sent in this case.

			On success the ClearRemoteAlias method will produce
			a RemoteAliasCleared signal.

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

		string LastSeen(string address)

			Returns the date and time when the adapter has been
			seen by a discover procedure.

			Example: "2006-02-08 12:00:00 GMT"

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

			Question: Can we find a better name?

		string LastUsed(string address)

			Returns the date and time of the last time when the
			adapter has been connected.

			Example: "2006-02-08 12:00:00 GMT"

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

			Question: Can we find a better name?

		void DisconnectRemoteDevice(string address)

			This method disconnects a specific remote device by
			terminating the low-level ACL connection. The use of
			this method should be restricted to administrator
			use.

			A RemoteDeviceDisconnectRequested signal will be
			sent and the actual disconnection will only happen 2
			seconds later.  This enables upper-level applications
			to terminate their connections gracefully before the
			ACL connection is terminated.

			Possible errors: org.bluez.Error.NotReady
					 org.bluez.Error.Failed
					 org.bluez.Error.NoSuchAdapter
					 org.bluez.Error.InvalidArguments
					 org.bluez.Error.NotConnected
					 org.bluez.Error.InProgress

		void CreateBonding(string address)

			This method creates a bonding with a remote device.

			If a link key for this adapter already exists, this
			procedure should fail instead of trying to create a
			new pairing.

			If no connection to the remote device exists, a
			low-level ACL connection must be created.

			This function will block and the calling application
			should take care of setting are higher timeout. This
			might be needed in case of a page timeout from the
			low-level HCI commands.

			In case of success it will send a BondingCreated
			signal.

			Possible errors: org.bluez.Error.NotReady
					 org.bluez.Error.Failed
					 org.bluez.Error.InvalidArguments
					 org.bluez.Error.AlreadyExists
					 org.bluez.Error.InProgress
					 org.bluez.Error.NoSuchAdapter
					 org.bluez.Error.ConnectionAttemptFailed
					 org.bluez.Error.AuthenticationFailed
					 org.bluez.Error.AuthenticationTimeout
					 org.bluez.Error.AuthenticationRejected
					 org.bluez.Error.AuthenticationCanceled

		void CancelBondingProcess(string address)

			This method will cancel the CreateBonding process.

			The CreateBonding method will return
			AuthenticationCanceled to signal that an attempt to
			create a bonding has been canceled.

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

		void RemoveBonding(string address)

			This method removes the bonding with a remote device.

			For security reasons this includes removing the actual
			link key and also disconnecting any open connections
			for the remote device.

			If the link key was stored on the Bluetooth chip, it
			must be removed from there, too.

			After deleting the link key this method will send a
			BondingRemoved signal.

			Possible errors: org.bluez.Error.NotReady
					 org.bluez.Error.Failed
					 org.bluez.Error.InvalidArguments
					 org.bluez.Error.NoSuchAdapter
					 org.bluez.Error.DoesNotExist

		boolean HasBonding(string address)

			Returns true if the remote device is bonded and false
			if no link key is available.

			Possible errors: org.bluez.Error.InvalidArguments

		array{string} ListBondings()

			List device addresses of currently bonded adapter.

			Possible errors: none

		uint8 GetPinCodeLength(string address)

			Returns the PIN code length that was used in the
			pairing process.

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

		uint8 GetEncryptionKeySize(string address)

			Returns the currently used encryption key size.

			This method will fail if no connection to the address
			has been established.

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

		void SetTrusted(string address)

			Marks the remote device as trusted. Authorization
			request will automatically succeed.

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

		boolean IsTrusted(string address)

			Returns true if the user is trusted or false otherwise.
			The address parameter must match one of the remote
			devices of the service.

			Possible errors: org.bluez.Error.InvalidArguments

		void RemoveTrust(string address)

			Marks the remote device as not trusted.

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

		void DiscoverDevices()

			This method starts the device discovery procedure. This
			includes an inquiry procedure and remote device name
			resolving.

			On start up this process will generate a DiscoveryStarted
			signal and then return RemoteDeviceFound and also
			RemoteNameUpdated signals. If the procedure has been
			finished an DiscoveryCompleted signal will be sent.

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

		void DiscoverDevicesWithoutNameResolving()

			This method starts the device discovery procedure. This
			includes an inquiry and an optional remote device name
			resolving. The remote names can be retrieved with
			GetRemoteName and in the case a name doesn't exist it
			will be queued for later resolving and GetRemoteName
			will return an error.

			While this procedure is running every found device
			will be returned with RemoteDeviceFound. While
			DiscoverDevices() automatically resolves unknown
			devices names and sends RemoteNameUpdated in this
			case it will only happen if GetRemoteName has been
			called and no previously stored name is available.

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

		void CancelDiscovery()

			This method will cancel any previous DiscoverDevices
			or DiscoverDevicesWithoutNameResolving actions.

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

		void StartPeriodicDiscovery()

			This method starts a periodic discovery.

			Possible errors: org.bluez.error.NotReady
					 org.bluez.Error.Failed
					 org.bluez.Error.InProgress
					 org.bluez.Error.NoSuchAdapter

		void StopPeriodicDiscovery()

			This method stops a periodic discovery. If the
			adapter is not in the periodic inquiry mode an
			error(not authorized) is returned. Everyone can
			request exit from this mode, it is not restricted
			to start requestor.

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

		boolean IsPeriodicDiscovery()

			Returns true if the periodic inquiry is active and
			false if it is switched off.

			Possible errors: none

		void SetPeriodicDiscoveryNameResolving(boolean resolve_names)

			Enable or disable automatic remote name resolving for
			periodic discovery.

			Possible errors: org.bluez.Error.InvalidArguments

		boolean GetPeriodicDiscoveryNameResolving()

			Check if automatic remote name resolving is enabled or not
			for periodic discovery.

			Possible error: org.bluez.Error.InvalidArguments

		array{uint32} GetRemoteServiceHandles(string address, string match)

			This method will request the SDP database of a remote
			device and retrieve the service record handles. To
			request service browse send an empty match string.

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

		array{byte} GetRemoteServiceRecord(string address, uint32 handle)

			This method will request the SDP database of a remote
			device for a service record and return the binary
			stream of it.

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

		string GetRemoteServiceRecordAsXML(string address, uint32 handle)

			This method will request the SDP database of a remote
			device for a service record and return its data in XML
			format.

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

		array{string} GetRemoteServiceIdentifiers(string address)

			This method will request the SDP database of a remote
			device for all supported services. The identifiers are
			returned in UUID 128 string format.

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

		void FinishRemoteServiceTransaction(string address)

			This method will finish all SDP transaction for that
			given address. In general this call is not needed,
			but in cases of resources restricted devices it
			is useful to call this to finish the SDP transaction
			before proceeded with profile specific connections.

		array{string} ListRemoteDevices()

			List addresses of all known remote devices (seen, used or bonded).

			Possible errors: none

		array{string} ListRecentRemoteDevices(string date)

			List addresses of all used or bonded remote devices since date.

			date format is "YYYY-MM-DD HH:MM:SS GMT"

			Possible errors: none

Signals		void ModeChanged(string mode)

			If the current mode is changed with SetMode this signal
			will inform about the new mode.

			This signal can also be triggered by low-level HCI
			commands.

		void DiscoverableTimeoutChanged(uint32 timeout)

			After changing the discoverable timeout this signal
			provide the new timeout value.

		void MinorClassChanged(string minor)

			After changing the minor class with SetMinorClass this
			signal will provide the new class value.

		void NameChanged(string name)

			After changing the local adapter name with SetName this
			signal will provide the new name.

			This signal can also be triggered by low-level HCI
			commands.

		void DiscoveryStarted()

			This signal indicates that a device discovery
			procedure has been started.

		void DiscoveryCompleted()

			This signal indicates that a device discovery
			procedure has been completed.

		void PeriodicDiscoveryStarted()

			This signal indicates that a periodic discovery
			procedure has been started.

		void PeriodicDiscoveryStopped()

			This signal indicates that a periodic discovery
			procedure has been completed.

		void RemoteDeviceFound(string address, uint32 class, int16 rssi)

			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.

		void RemoteDeviceDisappeared(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.

		void RemoteClassUpdated(string address, uint32 class)

			This signal will be send every time the remote class
			of device has been changed. This happens for example
			after a remote connection attempt. This signal will
			not be send if the class of device hasn't changed
			compared to cached one.

		void RemoteNameUpdated(string address, string name)

			This signal will be send every time the service daemon
			detect a new name for a remote device.

		void RemoteIdentifiersUpdated(string address, array{string identifiers})

			This signal is sent to indicate the provided services of a given
			remote device. It will be sent after GetRemoteServiceIdentifiers
			calls. This signal has at least one identifier and it does not
			contain repeated entries.

		void RemoteNameFailed(string address)

			This signal will be sent every time the service daemon
			tries to resolve a remote and this fails.

		void RemoteNameRequested(string address)

			This signal will be sent every time the service daemon
			tries to resolve a remote name during discovery.

		void RemoteAliasChanged(string address, string alias)

			After changing an alias with SetRemoteAlias this
			signal will indicate the new alias.

		void RemoteAliasCleared(string address)

			After removing an alias with ClearRemoteAlias this
			signal will indicate that the alias is no longer
			valid.

		void RemoteDeviceConnected(string address)

			This signal will be send if a low level connection
			between two devices has been created.

		void RemoteDeviceDisconnectRequested(string address)

			This signal will be sent when a low level
			disconnection to a remote device has been requested.
			The actual disconnection will happen 2 seconds later.

		void RemoteDeviceDisconnected(string address)

			This signal will be send if a low level connection
			between two devices has been terminated.

		void BondingCreated(string address)

			Signals that a successful bonding has been created.

		void BondingRemoved(string address)

			Signals that a bonding was removed.


Service hierarchy
=================

Service		org.bluez
Interface	org.bluez.Service
Object path	path from org.bluez.Manager.ListServices()

Methods		dict GetInfo()

			Returns the service properties.

		string GetIdentifier()

			This method returns the service identifier.

		string GetName()

			This method returns the service name.

		string GetDescription()

			This method returns the service description.

		string GetBusName() [experimental]

			Returns the unique bus name of the service if it has
			been started.

			Possible errors: org.bluez.Error.NotAvailable

		void Start()

			This method tells the system to start the
			service.

		void Stop()

			This method tells the system to stop the
			service.

		boolean IsRunning()

			Returns true if the service has been started and
			is currently active. Otherwise, it returns false.

		boolean IsExternal()

			Returns true if the service was registered using the
			Database.RegisterService method instead of a .service
			file. The Start and Stop methods are not applicable to
			external services and will return an error.

		array{string} ListUsers() [experimental]

			Returns list of current users (device addresses)
			of the service.

		void RemoveUser(string address) [experimental]

			Removes a user of the service. The address parameter
			must match one of the current users of the service.

		void SetTrusted(string address) [experimental]

			Marks the user as trusted.

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

		boolean IsTrusted(string address) [experimental]

			Returns true if the user is trusted or false otherwise.
			The address parameter must match one of the
			current users of the service.

			Possible errors: org.bluez.Error.InvalidArguments

		void RemoveTrust(string address) [experimental]

			Marks the user as not trusted.

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

Signals		void Started()

			The object path of this signal contains which service
			was started.

		void Stopped()

			The object path of this signal contains which service
			was stopped.

		void TrustAdded(string address)
			
			Sent when SetTrusted() is called.

		void TrustRemoved(string address)

			Sent when RemoveTrust() is called.


Security hierarchy
==================

Service		org.bluez
Interface	org.bluez.Security
Object path	/org/bluez or /org/bluez/{hci0,hci1,...}

Methods		void RegisterDefaultPasskeyAgent(string path)

			This registers the default passkey agent. It can
			register a passkey for all adapters or for a
			specific device depending on with object path has
			been used.

			The path parameter defines the object path of the
			passkey agent that will be called when a passkey
			needs to be entered.

			If an application disconnects from the bus all
			registered passkey agent will be removed.

			Possible errors: org.bluez.Error.AlreadyExists

		void UnregisterDefaultPasskeyAgent(string path)

			This unregisters a default passkey agent that has
			been previously registered. The object path and
			the path parameter must match the same values that
			has been used on registration.

			Possible errors: org.bluez.Error.DoesNotExist

		void RegisterPasskeyAgent(string path, string address)

			This registers the application passkey agent that
			will be used for any application specific passkey
			tasks.

			The path parameter defines the object path of the
			passkey agent that will be called when a passkey
			needs to be entered. The address defines the remote
			device that it will answer passkey requests for.

			If an application disconnects from the bus all
			registered passkey agent will be removed. It will
			also be unregistered after a timeout and if the
			pairing succeeds or fails. The application has to
			take care of that it reregisters the passkey agent.

			Possible errors: org.bluez.Error.AlreadyExists

		void UnregisterPasskeyAgent(string path, string address)

			This unregisters a passkey agent that has been
			previously registered. The object path and the path
			and address parameter must match the same values
			that has been used on registration.

			The method is actually only needed if an application
			wants to removed the passkey agent and don't wanna
			wait for the automatic timeout.

			Possible errors: org.bluez.Error.DoesNotExist

		void RegisterDefaultAuthorizationAgent(string path)

			This registers the default authorization agent. It can
			register an authorization agent for all adapters or
			for a specific one depending on which object path has
			been used.

			The path parameter defines the object path of the
			authorization agent that will be called when an
			authorization request needs to be answered.

		void UnregisterDefaultAuthorizationAgent(string path)

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


PasskeyAgent hierarchy
======================

Service		unique name
Interface	org.bluez.PasskeyAgent
Object path	freely definable

Methods		string Request(string path, string address, boolean numeric)

			This method gets called when the service daemon
			needs to get the passkey for an authentication. The
			return value is actual passkey.

			The first argument contains the path of the local
			adapter and the second one the remote address. The
			third argument signals if a numeric PIN code is
			expected or not. The default is a 1 to 16 byte PIN
			code in UTF-8 format.

			Possible errors: org.bluez.Error.Rejected
			                 org.bluez.Error.Canceled

		void Confirm(string path, string address, string value)

			This method gets called when the service daemon
			needs to verify a passkey. The verification is
			done by showing the value to the passkey agent
			and returning means a successful confirmation.
			In case the values don't match an error must
			be returned.

			Possible errors: org.bluez.Error.Rejected
			                 org.bluez.Error.Canceled

		void Display(string path, string address, string value)

			This method gets called when the service daemon
			needs to display the passkey value. No return
			value is needed. A successful paring will be
			indicated by the Complete method and a failure
			will be signaled with Cancel.

		void Keypress(string path, string address)

			This method indicates keypresses from the remote
			device. This can happen when pairing with a keyboard.

		void Complete(string path, string address)

			This method gets called to indicate that the
			authentication has been completed.

		void Cancel(string path, string address)

			This method gets called to indicate that the
			authentication request failed before a reply was
			returned by the Request method.

		void Release()

			This method gets called when the service daemon
			unregisters a passkey agent. An agent can use
			it to do cleanup tasks. There is no need to
			unregister the agent, because when this method
			gets called it has already been unregistered.


AuthorizationAgent hierarchy (experimental)
===========================================

Service		unique name
Interface	org.bluez.AuthorizationAgent
Object path	freely definable

Methods		void Authorize(string adapter_path, string address,
					string service_path, string uuid)

			This method gets called when the service daemon wants
			to get an authorization for accessing a service. This
			method should return if the remote user is granted
			access or an error otherwise.

			The adapter_path parameter is the object path of the
			local adapter. The address, service_path and action
			parameters correspond to the remote device address,
			the object path of the service and the uuid of the
			profile.

			Possible errors: org.bluez.Error.Rejected
			                 org.bluez.Error.Canceled

		void Cancel(string adapter_path, string address,
					string service_path, string uuid)

			This method cancels a previous authorization request.
			The adapter_path, address, service_path and uuid
			parameters must match the same values that have been
			used when the Authorize() method was called.

		void Release()

			This method gets called when the service daemon
			unregisters an authorization agent. An agent can
			use it to do cleanup tasks. There is no need to
			unregister the agent, because when this method
			gets called it has already been unregistered.
