---
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