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.AlreadyExists
					org.bluez.serial.Error.NotSupported
					org.bluez.serial.Error.ConnectionAttemptFailed
					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
					org.bluez.serial.Error.Failed

		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.

		void CancelConnectService(string address, string pattern)

			Cancel a previous ConnectService method call.

		void DisconnectService(string device)

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

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/port*

Methods		string GetAddress()

			Returns the Bluetooth address of the ending point.

		string Connect()

			Connects to remote device associated to the port
			object.

			Possible errors:org.bluez.serial.Error.ConnectionAttemptFailed
					org.bluez.serial.Error.Failed

		void Disconnect()

			Disconnects from remote device.

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