Bluetooth network service API description
*****************************************

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


Network Manager hierarchy
=========================

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

Methods		string CreateServer(string uuid)

			Creates a network server object (GN or NAP).

			Possible errors: org.bluez.network.Error.AlreadyExists
			                 org.bluez.network.Error.NotSupported
			                 org.bluez.network.Error.ConnectionAttemptFailed
			                 org.bluez.network.Error.Failed

		void RemoveServer(string path)

			Removes the network server object for given path.

			Possible errors: org.bluez.network.Error.DoesNotExist
			                 org.bluez.network.Error.Failed

		array{string} ListServers()

			Returns an array of available network devices paths.
			Currently only NAP and GN are supported.

		string FindServer(string pattern)

			Returns server path.

			Possible errors: org.bluez.network.Error.DoesNotExist
			                 org.bluez.network.Error.Failed

		string CreateConnection(string address, string uuid)

			Creates a network connection object(NAP or GN).

			Possible errors: org.bluez.network.Error.AlreadyExists
			                 org.bluez.network.Error.NotSupported
			                 org.bluez.network.Error.ConnectionAttemptFailed
			                 org.bluez.network.Error.Failed

		void RemoveConnection(string path)

			Removes a network connection object for a given path.

			Possible errors: org.bluez.network.Error.DoesNotExist
			                 org.bluez.network.Error.Failed

		array{string} ListConnections()

			Returns an array of available network connections paths.

		string FindConnection(string pattern)

			Returns connection path.

			Possible errors: org.bluez.network.Error.DoesNotExist
			                 org.bluez.network.Error.Failed

		string LastConnection()

			Returns last connected connection path, if none is connected
			fallback to last created connection.

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

		string DefaultConnection()

			Returns default connection path.

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

		string ChangeDefaultConnection(string pattern)

			Changes default connection path.

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

Signals		void ServerCreated(string path)

		void ServerRemoved(string path)

		void ConnectionCreated(string path)

		void ConnectionRemoved(string path)

		void DefaultConnectionChanged(string path)


Network Server hierarchy (experimental)
=======================================

Interface	org.bluez.network.Server
Object path	/org/bluez/network/server*

Methods		string GetUUID()

			Returns the UUID-128 string representation of
			the server.

		void Enable()

			Enable server and updates service record.

			Possible errors: org.bluez.network.Error.AlreadyExists
			                 org.bluez.network.Error.Failed

		void Disable()

			Disable server and remove service record.

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

		void SetName(string name)

			Sets the name attribute.

		string GetName()

			Returns the service name.

		void SetAddressRange(string start, string end)

			TBD

		void SetRouting(string interface)

			TBD

		void SetSecurity(bool enable)

			Enable or disable encryption.

		bool GetSecurity()

			Returns server encryption.

		dict GetInfo()

			Returns the server properties.

Signals		void Enabled()

		void Disabled()


Network Connection hierarchy (experimental)
===========================================

Interface	org.bluez.network.Connection
Object path	/org/bluez/network/connection*

Methods		string GetAdapter()

			Returns the Bluetooth address of the adapter.

		string GetAddress()

			Returns the Bluetooth address of the ending point.

		string GetUUID()

			Returns the uuid 128 string representation of
			the connected service.

		string GetName()

			Returns the string representation of connected host.

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

		string GetDescription()

			Returns the string description of connected host.

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

		string GetInterface()

			Returns the string network interface.

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

		string Connect()

			Connects to host and return the network interface
			created.

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

		void CancelConnect()

			Abort connection attempt in case of errors or
			timeouts in the client.

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

		void Disconnect()

			Disconnects to host.

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

		bool IsConnected()

			Returns the connection status.

		dict GetInfo()

			Returns the connection properties.

Signals		void Connected()

		void Disconnected()
