[libvirt] [PATCH 3/3] virt-manager: Learn to add USB redirection devices

Marc-André Lureau marcandre.lureau at gmail.com
Thu Aug 25 22:50:14 UTC 2011


---
 src/virtManager/addhardware.py |   35 +++++++-
 src/vmm-add-hardware.glade     |  208 +++++++++++++++++++++++++++++++++++++++-
 2 files changed, 237 insertions(+), 6 deletions(-)

diff --git a/src/virtManager/addhardware.py b/src/virtManager/addhardware.py
index b846170..33badb3 100644
--- a/src/virtManager/addhardware.py
+++ b/src/virtManager/addhardware.py
@@ -26,7 +26,8 @@ import gtk
 import virtinst
 from virtinst import (VirtualCharDevice, VirtualDevice,
                       VirtualVideoDevice, VirtualWatchdog,
-                      VirtualFilesystem, VirtualSmartCardDevice)
+                      VirtualFilesystem, VirtualSmartCardDevice,
+                      VirtualHostDeviceUSBRedir)
 
 import virtManager.util as util
 import virtManager.uihelpers as uihelpers
@@ -47,6 +48,7 @@ PAGE_VIDEO = 8
 PAGE_WATCHDOG = 9
 PAGE_FILESYSTEM = 10
 PAGE_SMARTCARD = 11
+PAGE_USBREDIR = 12
 
 char_widget_mappings = {
     "source_path" : "char-path",
@@ -393,6 +395,8 @@ class vmmAddHardware(vmmGObjectUI):
                         "combination."))
         add_hw_option("Smartcard", "device_serial", PAGE_SMARTCARD,
                       True, None)
+        add_hw_option("USB Redirection", "device_usb", PAGE_USBREDIR,
+                      True, None)
 
     def reset_state(self):
         # Storage init
@@ -727,6 +731,16 @@ class vmmAddHardware(vmmGObjectUI):
         modestr = mode.get_model().get_value(mode.get_active_iter(), 0)
         return modestr
 
+    # USB redir getters
+    def get_config_usbredir_host(self):
+        host = self.widget("usbredir-host")
+        hoststr = host.get_text()
+        return hoststr
+
+    def get_config_usbredir_service(self):
+        service = self.widget("usbredir-service")
+        return int(service.get_value())
+
     ################
     # UI listeners #
     ################
@@ -912,6 +926,8 @@ class vmmAddHardware(vmmGObjectUI):
             return _("Filesystem Passthrough")
         if page == PAGE_SMARTCARD:
             return _("Smartcard")
+        if page == PAGE_USBREDIR:
+            return _("USB Redirection")
 
         if page == PAGE_CHAR:
             return self.get_char_type().capitalize() + " Device"
@@ -1083,6 +1099,8 @@ class vmmAddHardware(vmmGObjectUI):
             return self.validate_page_filesystem()
         elif page_num == PAGE_SMARTCARD:
             return self.validate_page_smartcard()
+        elif page_num == PAGE_USBREDIR:
+            return self.validate_page_usbredir()
 
     def validate_page_storage(self):
         bus, device = self.get_config_disk_target()
@@ -1347,7 +1365,20 @@ class vmmAddHardware(vmmGObjectUI):
         try:
             self._dev = VirtualSmartCardDevice(conn, mode)
         except Exception, e:
-            return self.err.val_err(_("Video device parameter error"),
+            return self.err.val_err(_("Smartcard device parameter error"),
+                                    str(e))
+
+    def validate_page_usbredir(self):
+        conn = self.conn.vmm
+        host = self.get_config_usbredir_host()
+        service = self.get_config_usbredir_service()
+
+        try:
+            self._dev = VirtualHostDeviceUSBRedir(conn)
+            self._dev.host = host
+            self._dev.service = service
+        except Exception, e:
+            return self.err.val_err(_("USB redirected device parameter error"),
                                     str(e))
 
 
diff --git a/src/vmm-add-hardware.glade b/src/vmm-add-hardware.glade
index 879676f..eba3b61 100644
--- a/src/vmm-add-hardware.glade
+++ b/src/vmm-add-hardware.glade
@@ -2210,6 +2210,17 @@ access in the guest.</property>
                           </packing>
                         </child>
                         <child>
+                          <widget class="GtkLabel" id="label32">
+                            <property name="visible">True</property>
+                            <property name="label">fs</property>
+                          </widget>
+                          <packing>
+                            <property name="position">10</property>
+                            <property name="tab_fill">False</property>
+                            <property name="type">tab</property>
+                          </packing>
+                        </child>
+                        <child>
                           <widget class="GtkVBox" id="page5-box1">
                             <property name="visible">True</property>
                             <property name="border_width">1</property>
@@ -2279,16 +2290,205 @@ access in the guest.</property>
                             </child>
                           </widget>
                           <packing>
-                            <property name="position">5</property>
+                            <property name="position">11</property>
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkLabel" id="label32">
+                          <widget class="GtkLabel" id="label3212">
                             <property name="visible">True</property>
-                            <property name="label">fs</property>
+                            <property name="label">sc</property>
                           </widget>
                           <packing>
-                            <property name="position">10</property>
+                            <property name="position">11</property>
+                            <property name="tab_fill">False</property>
+                            <property name="type">tab</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkVBox" id="vbox58">
+                            <property name="visible">True</property>
+                            <property name="homogeneous">False</property>
+                            <property name="spacing">12</property>
+
+                            <child>
+                              <widget class="GtkLabel" id="label437">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Please indicate the address of the redirection server.</property>
+                                <property name="use_underline">False</property>
+                                <property name="use_markup">True</property>
+                                <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                <property name="wrap">True</property>
+                                <property name="selectable">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0.5</property>
+                                <property name="xpad">0</property>
+                                <property name="ypad">0</property>
+                                <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                <property name="width_chars">-1</property>
+                                <property name="single_line_mode">False</property>
+                                <property name="angle">0</property>
+                              </widget>
+                              <packing>
+                                <property name="padding">0</property>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                              </packing>
+                            </child>
+
+                            <child>
+                              <widget class="GtkAlignment" id="alignment162">
+                                <property name="visible">True</property>
+                                <property name="xalign">0.5</property>
+                                <property name="yalign">0.5</property>
+                                <property name="xscale">1</property>
+                                <property name="yscale">1</property>
+                                <property name="top_padding">0</property>
+                                <property name="bottom_padding">0</property>
+                                <property name="left_padding">24</property>
+                                <property name="right_padding">0</property>
+
+                                <child>
+                                  <widget class="GtkTable" id="table39">
+                                    <property name="visible">True</property>
+                                    <property name="n_rows">1</property>
+                                    <property name="n_columns">2</property>
+                                    <property name="homogeneous">False</property>
+                                    <property name="row_spacing">12</property>
+                                    <property name="column_spacing">12</property>
+
+                                    <child>
+                                      <widget class="GtkLabel" id="label438">
+                                        <property name="visible">True</property>
+                                        <property name="label" translatable="yes">_Host:</property>
+                                        <property name="use_underline">True</property>
+                                        <property name="use_markup">False</property>
+                                        <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                        <property name="wrap">False</property>
+                                        <property name="selectable">False</property>
+                                        <property name="xalign">1</property>
+                                        <property name="yalign">0.5</property>
+                                        <property name="xpad">0</property>
+                                        <property name="ypad">0</property>
+                                        <property name="mnemonic_widget">graphics-port</property>
+                                        <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                        <property name="width_chars">-1</property>
+                                        <property name="single_line_mode">False</property>
+                                        <property name="angle">0</property>
+                                      </widget>
+                                      <packing>
+                                        <property name="left_attach">0</property>
+                                        <property name="right_attach">1</property>
+                                        <property name="top_attach">0</property>
+                                        <property name="bottom_attach">1</property>
+                                        <property name="x_options">fill</property>
+                                        <property name="y_options"></property>
+                                      </packing>
+                                    </child>
+
+                                    <child>
+                                      <widget class="GtkHBox" id="hbox68">
+                                        <property name="visible">True</property>
+                                        <property name="homogeneous">False</property>
+                                        <property name="spacing">6</property>
+
+                                        <child>
+                                          <widget class="GtkEntry" id="usbredir-host">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="editable">True</property>
+                                            <property name="visibility">True</property>
+                                            <property name="max_length">0</property>
+                                            <property name="text" translatable="yes"></property>
+                                            <property name="has_frame">True</property>
+                                            <property name="invisible_char">•</property>
+                                            <property name="activates_default">False</property>
+                                            <signal name="focus_in_event" handler="char_host_focus_in"/>
+                                          </widget>
+                                          <packing>
+                                            <property name="padding">0</property>
+                                            <property name="expand">True</property>
+                                            <property name="fill">True</property>
+                                          </packing>
+                                        </child>
+
+                                        <child>
+                                          <widget class="GtkLabel" id="label439">
+                                            <property name="visible">True</property>
+                                            <property name="label" translatable="yes">_Port:</property>
+                                            <property name="use_underline">True</property>
+                                            <property name="use_markup">False</property>
+                                            <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                            <property name="wrap">False</property>
+                                            <property name="selectable">False</property>
+                                            <property name="xalign">0</property>
+                                            <property name="yalign">0.5</property>
+                                            <property name="xpad">0</property>
+                                            <property name="ypad">0</property>
+                                            <property name="mnemonic_widget">char-port</property>
+                                            <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                            <property name="width_chars">-1</property>
+                                            <property name="single_line_mode">False</property>
+                                            <property name="angle">0</property>
+                                          </widget>
+                                          <packing>
+                                            <property name="padding">0</property>
+                                            <property name="expand">False</property>
+                                            <property name="fill">True</property>
+                                          </packing>
+                                        </child>
+
+                                        <child>
+                                          <widget class="GtkSpinButton" id="usbredir-service">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="climb_rate">1</property>
+                                            <property name="digits">0</property>
+                                            <property name="numeric">False</property>
+                                            <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                                            <property name="snap_to_ticks">False</property>
+                                            <property name="wrap">False</property>
+                                            <property name="adjustment">0 0 67000 1 10 0</property>
+                                            <signal name="focus_in_event" handler="char_host_focus_in"/>
+                                          </widget>
+                                          <packing>
+                                            <property name="padding">0</property>
+                                            <property name="expand">False</property>
+                                            <property name="fill">True</property>
+                                          </packing>
+                                        </child>
+                                      </widget>
+                                      <packing>
+                                        <property name="left_attach">1</property>
+                                        <property name="right_attach">2</property>
+                                        <property name="top_attach">0</property>
+                                        <property name="bottom_attach">1</property>
+                                        <property name="y_options">fill</property>
+                                      </packing>
+                                    </child>
+                                  </widget>
+                                </child>
+                              </widget>
+                              <packing>
+                                <property name="padding">0</property>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                              </packing>
+                            </child>
+                          </widget>
+                          <packing>
+                            <property name="position">12</property>
+                            <property name="tab_expand">False</property>
+                            <property name="tab_fill">True</property>
+                          </packing>
+                        </child>
+
+                        <child>
+                          <widget class="GtkLabel" id="label436">
+                            <property name="visible">True</property>
+                            <property name="label">usbr</property>
+                          </widget>
+                          <packing>
+                            <property name="position">12</property>
                             <property name="tab_fill">False</property>
                             <property name="type">tab</property>
                           </packing>
-- 
1.7.6




More information about the libvir-list mailing list