ubuntu-22.04.3-desktop-amd64/casper/filesystem/usr/lib/ubiquity/plugins/ubi-wireless.py

243 lines
8.4 KiB
Python

# -*- coding: utf-8; Mode: Python; indent-tabs-mode: nil; tab-width: 4 -*-
# Copyright (C) 2013 Canonical Ltd.
# Written by Evan Dandrea <evan.dandrea@canonical.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
import os
from ubiquity import plugin
NAME = 'wireless'
# after prepare for default install, but language for oem install
AFTER = 'console_setup'
WEIGHT = 12
class WirelessPageBase(plugin.PluginUI):
def __init__(self):
plugin.PluginUI.__init__(self)
self.skip = False
def plugin_set_online_state(self, online):
self.skip = online
def plugin_skip_page(self):
# Set from the command line with --wireless
if 'UBIQUITY_WIRELESS' in os.environ:
return False
from ubiquity import nm
if nm.wireless_hardware_present():
return self.skip
else:
return True
class PageGtk(WirelessPageBase):
plugin_title = 'ubiquity/text/wireless_heading_label'
def __init__(self, controller, *args, **kwargs):
WirelessPageBase.__init__(self)
import dbus
from gi.repository import Gtk
from ubiquity import misc
# NOTE: Import 'nmwidgets' even though it's not used in this function
# as importing it as the side effect of registering
# NetworkManagerWidget which we DO use in the Wireless step UI.
from ubiquity.frontend.gtk_components import nmwidgets
assert nmwidgets # silence, pyflakes
if self.is_automatic:
self.page = None
return
# Check whether we can talk to NM at all (e.g. debugging ubiquity
# over ssh with X forwarding).
try:
misc.has_connection()
except dbus.DBusException:
self.page = None
return
self.controller = controller
builder = Gtk.Builder()
self.controller.add_builder(builder)
builder.add_from_file(os.path.join(
os.environ['UBIQUITY_GLADE'], 'stepWireless.ui'))
builder.connect_signals(self)
self.page = builder.get_object('stepWireless')
self.nmwidget = builder.get_object('nmwidget')
self.nmwidget.connect('connection', self.state_changed)
self.nmwidget.connect('selection_changed', self.selection_changed)
self.no_wireless = builder.get_object('no_wireless')
self.use_wireless = builder.get_object('use_wireless')
self.use_wireless.connect('toggled', self.wireless_toggled)
self.plugin_widgets = self.page
self.have_selection = False
self.state = self.nmwidget.get_state()
self.next_normal = True
self.back_normal = True
self.connect_text = None
self.stop_text = None
self.skip = False
def plugin_translate(self, lang):
get_s = self.controller.get_string
self.connect_text = get_s('ubiquity/text/connect', lang)
self.stop_text = get_s('ubiquity/text/stop', lang)
frontend = self.controller._wizard
if not self.next_normal:
frontend.next.set_label(self.connect_text)
if not self.back_normal:
frontend.back.set_label(self.stop_text)
frontend.status_label.set_text(self.controller.get_string(
'ubiquity/text/connecting_label', lang))
def selection_changed(self, unused):
from ubiquity import nm
self.have_selection = True
self.use_wireless.set_active(True)
assert self.state is not None
frontend = self.controller._wizard
if self.state == nm.NM_STATE_CONNECTING:
frontend.translate_widget(frontend.next)
self.next_normal = True
else:
if (not self.nmwidget.is_row_an_ap() or
self.nmwidget.is_row_connected()):
frontend.translate_widget(frontend.next)
self.next_normal = True
else:
frontend.next.set_label(self.connect_text)
self.next_normal = False
def wireless_toggled(self, unused):
frontend = self.controller._wizard
if self.use_wireless.get_active():
if not self.have_selection:
self.nmwidget.select_usable_row()
self.state_changed(None, self.state)
else:
frontend.status_spinner.hide()
frontend.status_spinner.stop()
frontend.status_label.hide()
frontend.translate_widget(frontend.next)
self.next_normal = True
self.controller.allow_go_forward(True)
def plugin_on_back_clicked(self):
frontend = self.controller._wizard
if frontend.back.get_label() == self.stop_text:
self.nmwidget.disconnect_from_ap()
return True
else:
frontend.status_spinner.hide()
frontend.status_spinner.stop()
frontend.status_label.hide()
self.no_wireless.set_active(True)
return False
def plugin_on_next_clicked(self):
frontend = self.controller._wizard
if frontend.next.get_label() == self.connect_text:
self.nmwidget.connect_to_ap()
return True
else:
frontend.status_spinner.hide()
frontend.status_spinner.stop()
frontend.status_label.hide()
return False
def state_changed(self, unused, state):
from ubiquity import nm
self.state = state
frontend = self.controller._wizard
if not self.use_wireless.get_active():
return
if state != nm.NM_STATE_CONNECTING:
frontend.status_spinner.hide()
frontend.status_spinner.stop()
frontend.status_label.hide()
frontend.translate_widget(frontend.back)
self.back_normal = True
frontend.back.set_sensitive(True)
else:
frontend.status_spinner.show()
frontend.status_spinner.start()
frontend.status_label.show()
self.next_normal = True
frontend.back.set_label(self.stop_text)
self.back_normal = False
frontend.back.set_sensitive(True)
self.selection_changed(None)
class PageKde(WirelessPageBase):
plugin_breadcrumb = 'ubiquity/text/breadcrumb_wireless'
def __init__(self, controller, *args, **kwargs):
WirelessPageBase.__init__(self)
import dbus
from ubiquity import misc
if self.is_automatic:
self.page = None
return
# Check whether we can talk to NM at all (e.g. debugging ubiquity
# over ssh with X forwarding).
try:
misc.has_connection()
except dbus.DBusException:
self.page = None
return
self.controller = controller
self._setup_page()
self.plugin_widgets = self.page
def _setup_page(self):
from PyQt5 import uic, QtWidgets
from ubiquity.frontend.kde_components import nmwidgets
self.nmwidget = nmwidgets.NetworkManagerWidget()
self.nmwidget.state_changed.connect(self._update_ui)
self.page = uic.loadUi('/usr/share/ubiquity/qt/stepWireless.ui')
layout = QtWidgets.QHBoxLayout(self.page.nmwidget_container)
layout.addWidget(self.nmwidget)
self.page.use_wireless.toggled.connect(self._update_ui)
def plugin_translate(self, lang):
dct = dict()
for text in self.nmwidget.get_translation_keys():
dct[text] = self.controller.get_string('ubiquity/text/' + text)
self.nmwidget.translate(dct)
def _update_ui(self):
from ubiquity import nm
if self.page.use_wireless.isChecked():
forward = self.nmwidget.get_state() == nm.NM_STATE_CONNECTED_GLOBAL
else:
forward = True
self.controller.allow_go_forward(forward)