Agent hierarchy
===============

Service		unique name
Interface	net.connman.Agent
Object path	freely definable

Methods		void Release()

			This method gets called when the service daemon
			unregisters the 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.

		void ReportError(object service, string error)

			This method gets called when an error has to be
			reported to the user.

			A special return value can be used to trigger a
			retry of the failed transaction.

			Possible Errors: net.connman.Agent.Error.Retry

		void RequestBrowser(object service, string url)

			This method gets called when it is required
			to ask the user to open a website to procceed
			with login handling.

			This can happen if connected to a hotspot portal
			page without WISPr support.

			Possible Errors: net.connman.Agent.Error.Canceled

		dict RequestInput(object service, dict fields)

			This method gets called when trying to connect to
			a service and some extra input is required. For
			example a passphrase or the name of a hidden network.

			The return value should be a dictionary where the
			keys are the field names and the values are the
			actual fields. Alternatively an error indicating that
			the request got canceled can be returned.

			Most common return field names are "Name" and of
			course "Passphrase".

			The dictionary arguments contains field names with
			their input parameters.

			In case of WISPr credentials requests and if the user
			prefers to login through the browser by himself, agent
			will have to return a LaunchBrowser error (see below).

			Possible Errors: net.connman.Agent.Error.Canceled
					 net.connman.Agent.Error.LaunchBrowser

		void Cancel()

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

Fields		string Name

			The name of a network. This field will be requested
			when trying to connect to a hidden network.

		array{byte} SSID

			This field is an alternative to "Name" for WiFi
			networks and can be used to return the exact binary
			representation of a network name.

			Normally returning the "Name" field is the better
			option here.

		string Identity

			Identity (username) for EAP authentication methods.

		string Passphrase

			The passphrase for authentication. For example a WEP
			key, a PSK passphrase or a passphrase for EAP
			authentication methods.

		string PreviousPassphrase

			The previous passphrase successfully saved, i.e.
			which lead to a successfull connection. This field is
			provided as an informational argument when connecting
			with it does not work anymore, for instance when it
			has been changed on the AP. Such argument appears when
			a RequestInput is raised after a retry. In case of WPS
			association through PIN method: when retrying, the
			previous wpspin will be provided.

		string WPS

			This field requests the use of WPS to get associated.
			This is an alternate choice against Passphrase when
			requested service supports WPS. The reply can contain
			either empty pin, if user wants to use push-button
			method, or a pin code if user wants to use the pin
			method.

		string Username

			Username for WISPr authentication. This field will be
			requested when connecting to a WISPr-enabled hotspot.

		string Password

			Password for WISPr authentication. This field will be
			requested when connecting to a WISPr-enabled hotspot.

Arguments	string Type

			Contains the type of a field. For example "psk", "wep"
			"passphrase", "response", "ssid", "wpspin" or plain
			"string".

		string Requirement

			Contains the requirement option. Valid values are
			"mandatory", "optional", "alternate" or
			"informational".

			The "alternate" value specifies that this field can be
			returned as an alternative to another one. An example
			would be the network name or SSID.

			All "mandatory" fields must be returned, while the
			"optional" can be returned if available.

			Nothing needs to be returned for "informational", as it
			is here only to provide an information so a value is
			attached to it.

		array{string} Alternates

			Contains the list of alternate field names this
			field can be represented by.

		string Value

			Contains data as a string, relatively to an
			"informational" argument.

Examples	Requesting a passphrase for WPA2 network

			RequestInput("/service1",
				{ "Passphrase" : { "Type"        : "psk",
						   "Requirement" : "mandatory"
						 }
				}
			==> { "Passphrase" : "secret123" }

		Requesting a passphrase after an error on the previous one:

			RequestInput("/service1",
				{ "Passphrase" : { "Type"        : "psk",
						   "Requirement" : "mandatory"
						 },
				  "PreviousPassphrase" :
					{ "Type"       : "psk",
					  "Requirement : "informational",
					  "Value"      : "secret123"
					}
				}

		Requesting name for hidden network

			RequestInput("/service2",
				{ "Name" : { "Type"        : "string",
					     "Requirement" : "mandatory",
					     "Alternates"  : [ "SSID" ]
					   },
				  "SSID" : { "Type"        : "ssid",
					     "Requirement" : "alternate"
					   }
				}
			==> { "Name" : "My hidden network" }

		Requesting a passphrase for a WPA2 network with WPS alternative:

			RequestInput("/service3",
				{ "Passphrase" : { "Type"        : "psk",
						   "Requirement" : "mandatory",
						   "Alternates"  : [ "WPS" ]
						 },
				  "WPS"        : { "Type"        : "wpspin",
						   "Requirement" : "alternate"
						 }
				}

			==> { "WPS" : "123456" }

		Requesting a passphrase for a WPA2 network with WPS alternative
		after an error on the previous one:

			RequestInput("/service3",
				{ "Passphrase" : { "Type"        : "psk",
						   "Requirement" : "mandatory",
						   "Alternates"  : [ "WPS" ]
					         },
				"WPS"          : { "Type"        : "wpspin",
						   "Requirement" : "alternate"
						 }
				"PreviousPassphrase" :
						{ "Type"       : "wpspin",
					  	"Requirement : "informational",
					  	"Value"      : "123456"
						}

		Requesting passphrase for a WPA-Enterprise network:

			RequestInput("/service4",
				{ "Identity"   : { "Type"        : "string",
						   "Requirement" : "mandatory"
						 },
				  "Passphrase" : { "Type"        : "passphrase",
						   "Requirement" : "mandatory"
						 }
				}

			==> { "Identity" : "alice", "Passphrase": "secret123" }

		Requesting challenge response for a WPA-Enterprise network:

			RequestInput("/service4",
				{ "Identity"   : { "Type"        : "string",
						   "Requirement" : "mandatory"
						 },
				  "Passphrase" : { "Type"        : "response",
						   "Requirement" : "mandatory"
						 }
				}

			==> { "Identity" : "bob", "Passphrase": "secret123" }

		Requesting username and password for a WISPr-enabled hotspot:

			RequestInput("/service5",
				{ "Username"   : { "Type"        : "string",
						   "Requirement" : "mandatory"
						 },
				  "Password"   : { "Type"        : "passphrase",
						   "Requirement" : "mandatory"
						 }
				}

			==> { "Username" : "foo", "Password": "secret" }
