VirtualBox

Changeset 66566 in vbox


Ignore:
Timestamp:
Apr 13, 2017 4:44:34 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
114593
Message:

FE/Qt: Machine settings: Network page: Rework network settings data/cache structure to handle port forwarding rules separately from each other, adjust loading/saving and check for saving errors.

Location:
trunk/src/VBox/Frontends/VirtualBox/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp

    r66552 r66566  
    5858/* COM includes: */
    5959# include "CAudioAdapter.h"
     60# include "CNATEngine.h"
    6061# include "CParallelPort.h"
    6162# include "CSerialPort.h"
     
    12281229          tr("Cannot save network adapter settings."),
    12291230          formatErrorInfo(comAdapter));
     1231}
     1232
     1233void UIMessageCenter::cannotSaveNATEngineSettings(const CNATEngine &comEngine, QWidget *pParent /* = 0 */)
     1234{
     1235    error(pParent, MessageType_Error,
     1236          tr("Cannot save NAT engine settings."),
     1237          formatErrorInfo(comEngine));
    12301238}
    12311239
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h

    r66552 r66566  
    249249    void cannotSaveNetworkSettings(const CMachine &comMachine, QWidget *pParent = 0);
    250250    void cannotSaveNetworkAdapterSettings(const CNetworkAdapter &comAdapter, QWidget *pParent = 0);
     251    void cannotSaveNATEngineSettings(const CNATEngine &comEngine, QWidget *pParent = 0);
    251252    void cannotSaveParallelSettings(const CMachine &comMachine, QWidget *pParent = 0);
    252253    void cannotSaveParallelPortSettings(const CParallelPort &comPort, QWidget *pParent = 0);
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.cpp

    r66562 r66566  
    7474        , m_strMACAddress(QString())
    7575        , m_fCableConnected(false)
    76         , m_redirects(UIPortForwardingDataList())
    7776    {}
    7877
     
    9493               && (m_strMACAddress == other.m_strMACAddress)
    9594               && (m_fCableConnected == other.m_fCableConnected)
    96                && (m_redirects == other.m_redirects)
    9795               ;
    9896    }
     
    129127    /** Holds whether the network adapter is connected. */
    130128    bool                              m_fCableConnected;
    131     /** Holds the set of network redirection rules. */
    132     UIPortForwardingDataList          m_redirects;
    133129};
    134130
     
    159155
    160156    /* Load / Save API: */
    161     void loadAdapterData(const UIDataSettingsMachineNetworkAdapter &adapterData);
    162     void saveAdapterData(UIDataSettingsMachineNetworkAdapter &adapterData);
     157    void getAdapterDataFromCache(const UISettingsCacheMachineNetworkAdapter &adapterCache);
     158    void putAdapterDataToCache(UISettingsCacheMachineNetworkAdapter &adapterCache);
    163159
    164160    /** Performs validation, updates @a messages list if something is wrong. */
     
    274270}
    275271
    276 void UIMachineSettingsNetwork::loadAdapterData(const UIDataSettingsMachineNetworkAdapter &adapterData)
    277 {
     272void UIMachineSettingsNetwork::getAdapterDataFromCache(const UISettingsCacheMachineNetworkAdapter &adapterCache)
     273{
     274    /* Get old adapter data: */
     275    const UIDataSettingsMachineNetworkAdapter &oldAdapterData = adapterCache.base();
     276
    278277    /* Load slot number: */
    279     m_iSlot = adapterData.m_iSlot;
     278    m_iSlot = oldAdapterData.m_iSlot;
    280279
    281280    /* Load adapter activity state: */
    282     m_pEnableAdapterCheckBox->setChecked(adapterData.m_fAdapterEnabled);
     281    m_pEnableAdapterCheckBox->setChecked(oldAdapterData.m_fAdapterEnabled);
    283282    /* Handle adapter activity change: */
    284283    sltHandleAdapterActivityChange();
    285284
    286285    /* Load attachment type: */
    287     m_pAttachmentTypeComboBox->setCurrentIndex(position(m_pAttachmentTypeComboBox, adapterData.m_attachmentType));
     286    m_pAttachmentTypeComboBox->setCurrentIndex(position(m_pAttachmentTypeComboBox, oldAdapterData.m_attachmentType));
    288287    /* Load alternative name: */
    289     m_strBridgedAdapterName = wipedOutString(adapterData.m_strBridgedAdapterName);
    290     m_strInternalNetworkName = wipedOutString(adapterData.m_strInternalNetworkName);
    291     m_strHostInterfaceName = wipedOutString(adapterData.m_strHostInterfaceName);
    292     m_strGenericDriverName = wipedOutString(adapterData.m_strGenericDriverName);
    293     m_strNATNetworkName = wipedOutString(adapterData.m_strNATNetworkName);
     288    m_strBridgedAdapterName = wipedOutString(oldAdapterData.m_strBridgedAdapterName);
     289    m_strInternalNetworkName = wipedOutString(oldAdapterData.m_strInternalNetworkName);
     290    m_strHostInterfaceName = wipedOutString(oldAdapterData.m_strHostInterfaceName);
     291    m_strGenericDriverName = wipedOutString(oldAdapterData.m_strGenericDriverName);
     292    m_strNATNetworkName = wipedOutString(oldAdapterData.m_strNATNetworkName);
    294293    /* Handle attachment type change: */
    295294    sltHandleAttachmentTypeChange();
    296295
    297296    /* Load adapter type: */
    298     m_pAdapterTypeCombo->setCurrentIndex(position(m_pAdapterTypeCombo, adapterData.m_adapterType));
     297    m_pAdapterTypeCombo->setCurrentIndex(position(m_pAdapterTypeCombo, oldAdapterData.m_adapterType));
    299298
    300299    /* Load promiscuous mode type: */
    301     m_pPromiscuousModeCombo->setCurrentIndex(position(m_pPromiscuousModeCombo, adapterData.m_promiscuousMode));
     300    m_pPromiscuousModeCombo->setCurrentIndex(position(m_pPromiscuousModeCombo, oldAdapterData.m_promiscuousMode));
    302301
    303302    /* Other options: */
    304     m_pMACEditor->setText(adapterData.m_strMACAddress);
    305     m_pGenericPropertiesTextEdit->setText(adapterData.m_strGenericProperties);
    306     m_pCableConnectedCheckBox->setChecked(adapterData.m_fCableConnected);
     303    m_pMACEditor->setText(oldAdapterData.m_strMACAddress);
     304    m_pGenericPropertiesTextEdit->setText(oldAdapterData.m_strGenericProperties);
     305    m_pCableConnectedCheckBox->setChecked(oldAdapterData.m_fCableConnected);
    307306
    308307    /* Load port forwarding rules: */
    309     m_portForwardingRules = adapterData.m_redirects;
    310 }
    311 
    312 void UIMachineSettingsNetwork::saveAdapterData(UIDataSettingsMachineNetworkAdapter &adapterData)
    313 {
     308    m_portForwardingRules.clear();
     309    for (int i = 0; i < adapterCache.childCount(); ++i)
     310        m_portForwardingRules << adapterCache.child(i).base();
     311}
     312
     313void UIMachineSettingsNetwork::putAdapterDataToCache(UISettingsCacheMachineNetworkAdapter &adapterCache)
     314{
     315    /* Prepare new adapter data: */
     316    UIDataSettingsMachineNetworkAdapter newAdapterData;
     317
    314318    /* Save adapter activity state: */
    315     adapterData.m_fAdapterEnabled = m_pEnableAdapterCheckBox->isChecked();
     319    newAdapterData.m_fAdapterEnabled = m_pEnableAdapterCheckBox->isChecked();
    316320
    317321    /* Save attachment type & alternative name: */
    318     adapterData.m_attachmentType = attachmentType();
    319     switch (adapterData.m_attachmentType)
     322    newAdapterData.m_attachmentType = attachmentType();
     323    switch (newAdapterData.m_attachmentType)
    320324    {
    321325        case KNetworkAttachmentType_Null:
     
    324328            break;
    325329        case KNetworkAttachmentType_Bridged:
    326             adapterData.m_strBridgedAdapterName = alternativeName();
     330            newAdapterData.m_strBridgedAdapterName = alternativeName();
    327331            break;
    328332        case KNetworkAttachmentType_Internal:
    329             adapterData.m_strInternalNetworkName = alternativeName();
     333            newAdapterData.m_strInternalNetworkName = alternativeName();
    330334            break;
    331335        case KNetworkAttachmentType_HostOnly:
    332             adapterData.m_strHostInterfaceName = alternativeName();
     336            newAdapterData.m_strHostInterfaceName = alternativeName();
    333337            break;
    334338        case KNetworkAttachmentType_Generic:
    335             adapterData.m_strGenericDriverName = alternativeName();
    336             adapterData.m_strGenericProperties = m_pGenericPropertiesTextEdit->toPlainText();
     339            newAdapterData.m_strGenericDriverName = alternativeName();
     340            newAdapterData.m_strGenericProperties = m_pGenericPropertiesTextEdit->toPlainText();
    337341            break;
    338342        case KNetworkAttachmentType_NATNetwork:
    339             adapterData.m_strNATNetworkName = alternativeName();
     343            newAdapterData.m_strNATNetworkName = alternativeName();
    340344            break;
    341345        default:
     
    344348
    345349    /* Save adapter type: */
    346     adapterData.m_adapterType = (KNetworkAdapterType)m_pAdapterTypeCombo->itemData(m_pAdapterTypeCombo->currentIndex()).toInt();
     350    newAdapterData.m_adapterType = (KNetworkAdapterType)m_pAdapterTypeCombo->itemData(m_pAdapterTypeCombo->currentIndex()).toInt();
    347351
    348352    /* Save promiscuous mode type: */
    349     adapterData.m_promiscuousMode = (KNetworkAdapterPromiscModePolicy)m_pPromiscuousModeCombo->itemData(m_pPromiscuousModeCombo->currentIndex()).toInt();
     353    newAdapterData.m_promiscuousMode = (KNetworkAdapterPromiscModePolicy)m_pPromiscuousModeCombo->itemData(m_pPromiscuousModeCombo->currentIndex()).toInt();
    350354
    351355    /* Other options: */
    352     adapterData.m_strMACAddress = m_pMACEditor->text().isEmpty() ? QString() : m_pMACEditor->text();
    353     adapterData.m_fCableConnected = m_pCableConnectedCheckBox->isChecked();
     356    newAdapterData.m_strMACAddress = m_pMACEditor->text().isEmpty() ? QString() : m_pMACEditor->text();
     357    newAdapterData.m_fCableConnected = m_pCableConnectedCheckBox->isChecked();
    354358
    355359    /* Save port forwarding rules: */
    356     adapterData.m_redirects = m_portForwardingRules;
     360    foreach (const UIDataPortForwardingRule &rule, m_portForwardingRules)
     361        adapterCache.child(rule.name).cacheCurrentData(rule);
     362
     363    /* Cache new adapter data: */
     364    adapterCache.cacheCurrentData(newAdapterData);
    357365}
    358366
     
    605613    m_pGenericPropertiesTextEdit->setVisible(attachmentType() == KNetworkAttachmentType_Generic &&
    606614                                             m_pAdvancedArrow->isExpanded());
    607     /* Update forwarding-rules button availability: */
     615    /* Update forwarding rules button availability: */
    608616    m_pPortForwardingButton->setEnabled(attachmentType() == KNetworkAttachmentType_NAT);
    609617    /* Update alternative-name combo-box whats-this and editable state: */
     
    10541062            oldAdapterData.m_strGenericProperties = loadGenericProperties(comAdapter);
    10551063            oldAdapterData.m_fCableConnected = comAdapter.GetCableConnected();
    1056             foreach (const QString &redirect, comAdapter.GetNATEngine().GetRedirects())
    1057             {
    1058                 const QStringList redirectData = redirect.split(',');
    1059                 AssertMsg(redirectData.size() == 6, ("Redirect rule should be composed of 6 parts!\n"));
    1060                 oldAdapterData.m_redirects << UIDataPortForwardingRule(redirectData.at(0),
    1061                                                                        (KNATProtocol)redirectData.at(1).toUInt(),
    1062                                                                        redirectData.at(2),
    1063                                                                        redirectData.at(3).toUInt(),
    1064                                                                        redirectData.at(4),
    1065                                                                        redirectData.at(5).toUInt());
     1064            foreach (const QString &strRedirect, comAdapter.GetNATEngine().GetRedirects())
     1065            {
     1066                /* Gather old forwarding data & cache key: */
     1067                const QStringList &forwardingData = strRedirect.split(',');
     1068                AssertMsg(forwardingData.size() == 6, ("Redirect rule should be composed of 6 parts!\n"));
     1069                const UIDataPortForwardingRule oldForwardingData(forwardingData.at(0),
     1070                                                                 (KNATProtocol)forwardingData.at(1).toUInt(),
     1071                                                                 forwardingData.at(2),
     1072                                                                 forwardingData.at(3).toUInt(),
     1073                                                                 forwardingData.at(4),
     1074                                                                 forwardingData.at(5).toUInt());
     1075
     1076                const QString &strForwardingKey = forwardingData.at(0);
     1077                /* Cache old forwarding data: */
     1078                m_pCache->child(iSlot).child(strForwardingKey).cacheInitialData(oldForwardingData);
    10661079            }
    10671080        }
     
    10921105
    10931106        /* Load old adapter data from the cache: */
    1094         pTab->loadAdapterData(m_pCache->child(iSlot).base());
     1107        pTab->getAdapterDataFromCache(m_pCache->child(iSlot));
    10951108
    10961109        /* Setup tab order: */
     
    11191132        UIMachineSettingsNetwork *pTab = qobject_cast<UIMachineSettingsNetwork*>(m_pTabWidget->widget(iSlot));
    11201133
    1121         /* Prepare new adapter data: */
    1122         UIDataSettingsMachineNetworkAdapter newAdapterData;
    1123 
    11241134        /* Gather new adapter data: */
    1125         pTab->saveAdapterData(newAdapterData);
    1126 
    1127         /* Cache new adapter data: */
    1128         m_pCache->child(iSlot).cacheCurrentData(newAdapterData);
     1135        pTab->putAdapterDataToCache(m_pCache->child(iSlot));
    11291136    }
    11301137
     
    15831590                fSuccess = comAdapter.isOk();
    15841591            }
    1585             /* Save adapter redirect options: */
    1586             if (   fSuccess && newAdapterData.m_redirects != oldAdapterData.m_redirects
    1587                 && (   oldAdapterData.m_attachmentType == KNetworkAttachmentType_NAT
    1588                     || newAdapterData.m_attachmentType == KNetworkAttachmentType_NAT))
    1589             {
    1590                 foreach (const QString &strOldRedirect, comAdapter.GetNATEngine().GetRedirects())
    1591                     comAdapter.GetNATEngine().RemoveRedirect(strOldRedirect.section(',', 0, 0));
    1592                 foreach (const UIDataPortForwardingRule &newRedirect, newAdapterData.m_redirects)
    1593                     comAdapter.GetNATEngine().AddRedirect(newRedirect.name, newRedirect.protocol,
    1594                                                           newRedirect.hostIp, newRedirect.hostPort.value(),
    1595                                                           newRedirect.guestIp, newRedirect.guestPort.value());
     1592
     1593            /* Get NAT engine for further activities: */
     1594            CNATEngine comEngine;
     1595            if (fSuccess)
     1596            {
     1597                comEngine = comAdapter.GetNATEngine();
     1598                fSuccess = comAdapter.isOk() && comEngine.isNotNull();
    15961599            }
    15971600
     
    15991602            if (!fSuccess)
    16001603                msgCenter().cannotSaveNetworkAdapterSettings(comAdapter, this);
     1604            else
     1605            {
     1606                /* Save adapter port forwarding rules: */
     1607                if (   oldAdapterData.m_attachmentType == KNetworkAttachmentType_NAT
     1608                    || newAdapterData.m_attachmentType == KNetworkAttachmentType_NAT)
     1609                {
     1610                    /* For each rule: */
     1611                    for (int iRule = 0; fSuccess && iRule < m_pCache->child(iSlot).childCount(); ++iRule)
     1612                    {
     1613                        /* Get rule cache: */
     1614                        const UISettingsCachePortForwardingRule &ruleCache = m_pCache->child(iSlot).child(iRule);
     1615
     1616                        /* Remove rule marked for 'remove' or 'update': */
     1617                        if (fSuccess && (ruleCache.wasRemoved() || ruleCache.wasUpdated()))
     1618                        {
     1619                            comEngine.RemoveRedirect(ruleCache.base().name);
     1620                            fSuccess = comEngine.isOk();
     1621                        }
     1622
     1623                        /* Create rule marked for 'create' or 'update': */
     1624                        if (fSuccess && (ruleCache.wasCreated() || ruleCache.wasUpdated()))
     1625                        {
     1626                            comEngine.AddRedirect(ruleCache.data().name, ruleCache.data().protocol,
     1627                                                  ruleCache.data().hostIp, ruleCache.data().hostPort.value(),
     1628                                                  ruleCache.data().guestIp, ruleCache.data().guestPort.value());
     1629                            fSuccess = comEngine.isOk();
     1630                        }
     1631
     1632                        /* Show error message if necessary: */
     1633                        if (!fSuccess)
     1634                            msgCenter().cannotSaveNATEngineSettings(comEngine, this);
     1635                    }
     1636                }
     1637            }
    16011638        }
    16021639    }
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.h

    r66559 r66566  
    2828struct UIDataSettingsMachineNetwork;
    2929struct UIDataSettingsMachineNetworkAdapter;
    30 typedef UISettingsCache<UIDataSettingsMachineNetworkAdapter> UISettingsCacheMachineNetworkAdapter;
     30typedef UISettingsCache<UIDataPortForwardingRule> UISettingsCachePortForwardingRule;
     31typedef UISettingsCachePool<UIDataSettingsMachineNetworkAdapter, UISettingsCachePortForwardingRule> UISettingsCacheMachineNetworkAdapter;
    3132typedef UISettingsCachePool<UIDataSettingsMachineNetwork, UISettingsCacheMachineNetworkAdapter> UISettingsCacheMachineNetwork;
    3233
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette