This is a repost, as the first message was refused by the mailinglist.
Apparently I can't submit the screenshot, it's too large. So you can check
out the screenshot here :
http://eth1.mine.nu/editableGenericNetworkProperties.png
Patch attached
--
Christophe
Index: src/VBox/Frontends/VirtualBox/src/selector/UIVMDesktop.cpp
===================================================================
--- src/VBox/Frontends/VirtualBox/src/selector/UIVMDesktop.cpp (revision 37206)
+++ src/VBox/Frontends/VirtualBox/src/selector/UIVMDesktop.cpp (working copy)
@@ -715,6 +715,24 @@
}
}
+/**
+ * Return a text summary of the properties of a generic network adapter
+ */
+static QString getGenericProperties(const CNetworkAdapter &adapter) {
+ QVector<QString> names;
+ QVector<QString> props;
+ props = adapter.GetProperties(QString(), names); // all properties, please
+
+ QString result;
+ for (int i = 0; i < names.size(); i++) {
+ result += names[i] + "=" + props[i];
+ if (i != names.size() - 1)
+ result += ",";
+ }
+
+ return result;
+}
+
void UIDetailsPagePrivate::sltUpdateNetwork()
{
m_secBoxes.value(NetworkSec)->setTitleLinkEnabled(m_fChangeable);
@@ -747,8 +765,8 @@
attType = attType.arg(tr("Host-only adapter, '%1'",
"details report (network)").arg(adapter.GetHostOnlyInterface()));
else if (type == KNetworkAttachmentType_Generic)
- attType = attType.arg(tr("Generic, '%1'",
- "details report (network)").arg(adapter.GetGenericDriver()));
+ attType = attType.arg(tr("Generic bambabies, '%1' { %2 }",
+ "details report (network)").arg(adapter.GetGenericDriver(), getGenericProperties(adapter)));
else
attType = attType.arg(vboxGlobal().toString(type));
Index: src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.h
===================================================================
--- src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.h (revision 37206)
+++ src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.h (working copy)
@@ -43,6 +43,7 @@
, m_strInternalNetworkName(QString())
, m_strHostInterfaceName(QString())
, m_strGenericDriver(QString())
+ , m_strGenericProperties(QString())
, m_strMACAddress(QString())
, m_fCableConnected(false)
, m_redirects(UIPortForwardingDataList()) {}
@@ -58,6 +59,7 @@
(m_strInternalNetworkName == other.m_strInternalNetworkName) &&
(m_strHostInterfaceName == other.m_strHostInterfaceName) &&
(m_strGenericDriver == other.m_strGenericDriver) &&
+ (m_strGenericProperties == other.m_strGenericProperties) &&
(m_strMACAddress == other.m_strMACAddress) &&
(m_fCableConnected == other.m_fCableConnected) &&
(m_redirects == other.m_redirects);
@@ -75,6 +77,7 @@
QString m_strInternalNetworkName;
QString m_strHostInterfaceName;
QString m_strGenericDriver;
+ QString m_strGenericProperties;
QString m_strMACAddress;
bool m_fCableConnected;
UIPortForwardingDataList m_redirects;
@@ -128,6 +131,7 @@
void sltUpdateAttachmentAlternative();
void sltUpdateAlternativeName();
void sltToggleAdvanced();
+ void sltToggleGenericProps();
void sltGenerateMac();
void sltOpenPortForwardingDlg();
@@ -143,6 +147,7 @@
QString m_strIntName;
QString m_strHoiName;
QString m_strGenericDriver;
+ QString m_strGenericProperties;
bool m_fPolished;
UIPortForwardingDataList m_portForwardingRules;
Index: src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.ui
===================================================================
--- src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.ui (revision 37391)
+++ src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.ui (working copy)
@@ -252,7 +252,50 @@
</property>
</widget>
</item>
- <item row="8" column="0" colspan="4">
+ <item row="8" column="0">
+ <layout class="QHBoxLayout" name="m_pGenericButtonLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <spacer name="m_pHorizontalSpacer3z">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QIArrowButtonSwitch" native="1" name="m_pGenericArrow">
+ <property name="text">
+ <string>Generic Properties</string>
+ </property>
+ <property name="whatsThis">
+ <string>Allows you to change generic properties for the network interface</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="9" column="0">
+ <widget class="QLabel" name="m_pGenericPropertiesLabel">
+ <property name="text">
+ <string>Generic properties : </string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="1" colspan="3">
+ <widget class="QTextEdit" name="m_pGenericPropertiesTextEdit"/>
+ </item>
+ <item row="10" column="0" colspan="4">
<spacer name="m_pVerticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
Index: src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.cpp
===================================================================
--- src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.cpp (revision 37206)
+++ src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.cpp (working copy)
@@ -53,6 +53,7 @@
/* Setup connections: */
connect(m_pAdvancedArrow, SIGNAL(clicked()), this, SLOT(sltToggleAdvanced()));
+ connect(m_pGenericArrow, SIGNAL(clicked()), this, SLOT(sltToggleGenericProps()));
connect(m_pMACButton, SIGNAL(clicked()), this, SLOT(sltGenerateMac()));
connect(m_pPortForwardingButton, SIGNAL(clicked()), this, SLOT(sltOpenPortForwardingDlg()));
@@ -73,6 +74,7 @@
attachmentType() != KNetworkAttachmentType_Null &&
attachmentType() != KNetworkAttachmentType_NAT);
m_pAdvancedArrow->setEnabled(m_pParent->isMachineInValidMode());
+ m_pGenericArrow->setEnabled(m_pParent->isMachineInValidMode());
/* Advanced attributes: */
m_pAdapterTypeLabel->setEnabled(m_pParent->isMachineOffline());
@@ -94,6 +96,7 @@
if ((m_pParent->isMachineSaved() || m_pParent->isMachineOnline()) && !m_pAdvancedArrow->isExpanded())
m_pAdvancedArrow->animateClick();
sltToggleAdvanced();
+ sltToggleGenericProps();
}
void UIMachineSettingsNetwork::fetchAdapterCache(const UICacheSettingsMachineNetworkAdapter &adapterCache)
@@ -128,6 +131,10 @@
if (m_strGenericDriver.isEmpty())
m_strGenericDriver = QString();
+ m_strGenericProperties = adapterData.m_strGenericProperties;
+ if (m_strGenericProperties.isEmpty())
+ m_strGenericProperties = QString();
+
sltUpdateAttachmentAlternative();
/* Load adapter type: */
@@ -144,6 +151,9 @@
/* Load port forwarding rules: */
m_portForwardingRules = adapterData.m_redirects;
+
+ /* Generic properties */
+ m_pGenericPropertiesTextEdit->setText(adapterData.m_strGenericProperties);
}
void UIMachineSettingsNetwork::uploadAdapterCache(UICacheSettingsMachineNetworkAdapter &adapterCache)
@@ -173,6 +183,7 @@
break;
case KNetworkAttachmentType_Generic:
adapterData.m_strGenericDriver = alternativeName();
+ adapterData.m_strGenericProperties = m_pGenericPropertiesTextEdit->toPlainText();
break;
default:
break;
@@ -364,6 +375,12 @@
break;
}
+ /* Show or hide "generic" properties editor */
+ m_pGenericArrow->setVisible(attachmentType() == KNetworkAttachmentType_Generic);
+ m_pGenericPropertiesLabel->setVisible(attachmentType() == KNetworkAttachmentType_Generic);
+ m_pGenericPropertiesTextEdit->setVisible(attachmentType() == KNetworkAttachmentType_Generic);
+ sltToggleGenericProps();
+
/* Prepend 'empty' or 'default' item: */
if (m_pAdapterNameCombo->count() == 0)
{
@@ -495,6 +512,12 @@
m_pPortForwardingButton->setVisible(m_pAdvancedArrow->isExpanded());
}
+void UIMachineSettingsNetwork::sltToggleGenericProps()
+{
+ m_pGenericPropertiesLabel->setVisible(m_pGenericArrow->isExpanded());
+ m_pGenericPropertiesTextEdit->setVisible(m_pGenericArrow->isExpanded());
+}
+
void UIMachineSettingsNetwork::sltGenerateMac()
{
m_pMACEditor->setText(vboxGlobal().virtualBox().GetHost().GenerateMACAddress());
@@ -723,6 +746,59 @@
return m_hoiList;
}
+/**
+ * Fill in the list of generic properties
+ */
+QString summarizeGenericProperties(const CNetworkAdapter &adapter) {
+ QVector<QString> names;
+ QVector<QString> props;
+ props = adapter.GetProperties(QString(), names); // all properties, please
+
+ QString result;
+ for (int i = 0; i < names.size(); i++) {
+ result += names[i] + "=" + props[i];
+ if (i != names.size() - 1)
+ result += "\n";
+ }
+
+ return result;
+}
+
+/**
+ * Fill in the list of generic properties
+ */
+void updateGenericProperties(CNetworkAdapter &adapter, const QString & propText) {
+ QStringList newProps = propText.split("\n");
+ QHash<QString, QString> hash;
+
+ for (int i = 0; i < newProps.size(); i++) {
+ QString line = newProps[i];
+ int splitpos = line.indexOf("=");
+ if (splitpos) {
+ QString key = line.left(splitpos);
+ QString val = line.mid(splitpos+1);
+
+ adapter.SetProperty(key, val);
+ hash[key] = val;
+ }
+ }
+
+ // we still need to go over the list of properties to determine which ones
+ // are to be deleted
+ QVector<QString> names;
+ QVector<QString> props;
+ props = adapter.GetProperties(QString(), names); // all properties, please
+
+ for (int i = 0; i < names.size(); i++) {
+ QString name = names[i];
+ QString value = props[i];
+
+ if (value != hash[name]) {
+ adapter.SetProperty(name, hash[name]);
+ }
+ }
+}
+
/* Load data to cashe from corresponding external object(s),
* this task COULD be performed in other than GUI thread: */
void UIMachineSettingsNetworkPage::loadToCacheFrom(QVariant &data)
@@ -769,6 +845,8 @@
if (adapterData.m_strGenericDriver.isEmpty())
adapterData.m_strGenericDriver = QString();
+ adapterData.m_strGenericProperties = summarizeGenericProperties(adapter);
+
/* Gather advanced options: */
adapterData.m_adapterType = adapter.GetAdapterType();
adapterData.m_promiscuousMode = adapter.GetPromiscModePolicy();
@@ -897,6 +975,7 @@
break;
case KNetworkAttachmentType_Generic:
adapter.SetGenericDriver(adapterData.m_strGenericDriver);
+ updateGenericProperties(adapter, adapterData.m_strGenericProperties);
break;
default:
break;
_______________________________________________
vbox-dev mailing list
[email protected]
http://vbox.innotek.de/mailman/listinfo/vbox-dev