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

Service		unique name
Interface	net.connman.vpn.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.vpn.Agent.Error.Retry

		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 password or username.

			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 "Username" and of
			course "Password".

			The dictionary arguments contains field names with
			their input parameters.

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

		void Cancel()

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

Fields		string Username

			Username for authentication. This field will be
			requested when connecting to L2TP and PPTP.

		string Password

			Password for authentication.

		boolean SaveCredentials

			Tells if the user wants the user credentials
			be saved by connman-vpnd.

		string Host

			End point of this VPN link i.e., the VPN gateway
			we are trying to connect to.

		string Name

			Name of the VPN connection we are trying to connect to.

		string OpenConnect.CACert

			Informational field containing a path name for an
			additional Certificate Authority file.

		string OpenConnect.ClientCert

			Informational field containing a pkcs11 URL or a path
                        name for the client certificate.

		string OpenConnect.Cookie

			Return the OpenConnect cookie value that is used for
			authenticating the VPN session.

		string OpenConnect.ServerCert

			Return the OpenConnect server hash used to identify
			the final server after possible web authentication
			logins, selections and redirections.

		string OpenConnect.VPNHost

			Return the final VPN server to use after possible
			web authentication logins, selections and redirections.

Arguments	string Type

			Contains the type of a field. For example "password",
			"response", "boolean" 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.

			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 username and password for L2TP network

			RequestInput("/vpn1",
				{ "Username" : { "Type"        : "string",
						 "Requirement" : "mandatory"
						} }
				{ "Password" : { "Type"        : "password",
						 "Requirement" : "mandatory"
						} }
				{ "SaveCredentials" : { "Type" : "boolean",
						"Requirement" : "optional"
						}
				}
			==> { "Username" : "foo", "Password" : "secret123",
				"SaveCredentials" : true }

		Requesting a OpenConnect cookie

			RequestInput("/vpn2",
				{ "OpenConnect.Cookie" : { "Type" : "string",
						 "Requirement" : "mandatory"
							} }
				{ "Host" : { "Type" : "string",
					 "Requirement" : "informational"
							} }
				{ "Name" : { "Type" : "string",
					 "Requirement" : "informational"
							} }
			==> { "OpenConnect.Cookie" : "0123456@adfsf@asasdf" }
