Bluetooth serial service API description
****************************************

Copyright (C) 2006-2007  Marcel Holtmann <marcel@holtmann.org>


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

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

Methods		string CreatePort(string address, string pattern) [experimental]

			Creates a serial port object.

			Possible errors:org.bluez.serial.Error.InvalidArguments
					org.bluez.serial.Error.ConnectionCanceled
					org.bluez.serial.Error.ConnectionInProgress
					org.bluez.serial.Error.ConnectionAttemptFailed
					org.bluez.serial.Error.NotSupported
					org.bluez.serial.Error.Failed

		void RemovePort(string path) [experimental]

			Removes the serial port object for given path.

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

		array{string} ListPorts() [experimental]

			Returns an array of available serial port paths.

		string ConnectService(string address, string pattern)

			Connects to a specific RFCOMM based service on a
			remote device and then creates a RFCOMM TTY
			device for it. The RFCOMM TTY device is returned.

			Possible errors:org.bluez.serial.Error.InvalidArguments
					org.bluez.serial.Error.ConnectionCanceled
					org.bluez.serial.Error.ConnectionInProgress
					org.bluez.serial.Error.ConnectionAttemptFailed
					org.bluez.serial.Error.NotSupported
					org.bluez.serial.Error.Failed

		void CancelConnectService(string address, string pattern)

			Cancel a previous ConnectService method call.

			Possible errors:org.bluez.serial.Error.InvalidArguments
					org.bluez.serial.Error.ConnectionNotInProgress

		void DisconnectService(string device)

			Disconnect a RFCOMM TTY device that has been
			created via the ConnectService method.

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

Signals		void PortCreated(string path) [experimental]

		void PortRemoved(string path) [experimental]

		void ServiceConnected(string device)

		void ServiceDisconnected(string device)


Port hierarchy (experimental)
=============================

Interface	org.bluez.serial.Port
Object path	/org/bluez/serial/rfcomm*

Methods		string GetAddress() [experimental]

			Returns the Bluetooth address of the ending point.

		string GetInfo() [experimental]

			Returns the port properties.
