Technology hierarchy
====================

Service		net.connman
Interface	net.connman.Technology
Object path	[variable prefix]/{technology0,technology1,...}

Methods		dict GetProperties()  [deprecated]

			Returns properties for the technology object. See
			the properties section for available properties.

			Usage of this method is highly discouraged. Use
			the Manager.GetTechnologies() method instead.

			Possible Errors: [service].Error.InvalidArguments

		void SetProperty(string name, variant value)

			Changes the value of the specified property. Only
			properties that are listed as read-write are
			changeable. On success a PropertyChanged signal
			will be emitted.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.InvalidProperty

		void Scan()

			Trigger a scan for this specific technology. The
			method call will return when a scan has been
			finished and results are available. So setting
			a longer D-Bus timeout might be a really good
			idea.

			Results will be signaled via the ServicesChanged
			signal from the manager interface.

Signals		PropertyChanged(string name, variant value)

			This signal indicates a changed value of the given
			property.

Properties	boolean Powered [readwrite]

			Boolean representing the power state of the
			technology. False means that the technology is
			off (and is available RF-Killed) while True means
			that the technology is enabled.

		boolean Connected [readonly]

			Boolean representing if a technolgy is connected.

			This is just a convience property for allowing the
			UI to easily show if this technolgy has an active
			connection or not.

			If this property is True it means that at least one
			service of this technology is in ready state.

		string Name [readonly]

			Name of this technology.

		string Type [readonly]

			The technology type (for example "ethernet" etc.)

			This information should only be used to determine
			advanced properties or showing the correct icon
			to the user.

		boolean Tethering [readwrite]

			This option allows to enable or disable the support
			for tethering. When tethering is enabled then the
			default service is bridged to all clients connected
			through the technology.

		string TetheringIdentifier [readwrite]

			The tethering broadcasted identifier.

			This property is only valid for the WiFi technology,
			and is then mapped to the WiFi AP SSID clients will
			have to join in order to gain internet connectivity.

		string TetheringPassphrase [readwrite]

			The tethering connection passphrase.

			This property is only valid for the WiFi technology,
			and is then mapped to the WPA pre-shared key clients
			will have to use in order to establish a connection.

		uint32  IdleTimeout [readwrite] [experimental]

			If the technology is idle for given period then it
			will go offline if no Service with this technology
			has AutoConnect set to True.

			If the timeout is 0, this feature is disabled.
