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.

			In case of P2P technology, results will be signaled
			via the PeersChanged 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 technology is connected.

			This is just a convenience property for allowing the
			UI to easily show if this technology 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.

			In case of P2P technology, this property indicates
			if the peer is fully connected to another peer.

		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.
