VirtualBox

Changeset 48548 in vbox for trunk/src/VBox/Frontends


Ignore:
Timestamp:
Sep 19, 2013 4:31:07 PM (11 years ago)
Author:
vboxsync
Message:

FE/Qt: Global properties / Network page / NAT network tab: IPv6 port forwarding UI.

Location:
trunk/src/VBox/Frontends/VirtualBox
Files:
8 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk

    r48533 r48548  
    357357        src/settings/global/UIGlobalSettingsNetworkDetailsNAT.h \
    358358        src/settings/global/UIGlobalSettingsNetworkDetailsHost.h \
     359        src/settings/global/UIGlobalSettingsPortForwardingDlg.h \
    359360        src/settings/global/UIGlobalSettingsProxy.h \
    360361        src/settings/global/UIGlobalSettingsUpdate.h \
     
    612613        src/settings/global/UIGlobalSettingsNetworkDetailsNAT.cpp \
    613614        src/settings/global/UIGlobalSettingsNetworkDetailsHost.cpp \
     615        src/settings/global/UIGlobalSettingsPortForwardingDlg.cpp \
    614616        src/settings/global/UIGlobalSettingsProxy.cpp \
    615617        src/settings/global/UIGlobalSettingsUpdate.cpp \
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetwork.cpp

    r48524 r48548  
    923923    data.m_fAdvertiseDefaultIPv6Route = network.GetAdvertiseDefaultIPv6RouteEnabled();
    924924
    925     /* Load redirect options: */
    926     QVector<QString> redirects = network.GetPortForwardRules4();
    927     foreach (const QString &strRedirect, redirects)
    928     {
    929         QStringList redirectData = strRedirect.split(':');
    930         Assert(redirectData.size() == 6);
    931         if (redirectData.size() != 6)
     925    /* Load IPv4 rules: */
     926    QVector<QString> ipv4rules = network.GetPortForwardRules4();
     927    foreach (QString strIPv4Rule, ipv4rules)
     928    {
     929        /* Replace all ':' with ',' first: */
     930        strIPv4Rule.replace(':', ',');
     931        /* Parse rules: */
     932        QStringList rules = strIPv4Rule.split(',');
     933        Assert(rules.size() == 6);
     934        if (rules.size() != 6)
    932935            continue;
    933         data.m_redirects << UIPortForwardingData(redirectData[0],
    934                                                  gpConverter->fromInternalString<KNATProtocol>(redirectData[1]),
    935                                                  QString(redirectData[2]).remove('[').remove(']'),
    936                                                  redirectData[3].toUInt(),
    937                                                  QString(redirectData[4]).remove('[').remove(']'),
    938                                                  redirectData[5].toUInt());
     936        data.m_ipv4rules << UIPortForwardingData(rules[0],
     937                                                 gpConverter->fromInternalString<KNATProtocol>(rules[1]),
     938                                                 QString(rules[2]).remove('[').remove(']'),
     939                                                 rules[3].toUInt(),
     940                                                 QString(rules[4]).remove('[').remove(']'),
     941                                                 rules[5].toUInt());
     942    }
     943
     944    /* Load IPv6 rules: */
     945    QVector<QString> ipv6rules = network.GetPortForwardRules6();
     946    foreach (QString strIPv6Rule, ipv6rules)
     947    {
     948        /* Replace all ':' with ',' first: */
     949        strIPv6Rule.replace(':', ',');
     950        /* But replace ',' back with ':' for addresses: */
     951        QRegExp re("\\[[^:]+\\]");
     952        re.setMinimal(true);
     953        while (re.indexIn(strIPv6Rule) != -1)
     954        {
     955            QString strCapOld = re.cap(0);
     956            QString strCapNew = strCapOld;
     957            strCapNew.replace(',', ':');
     958            strIPv6Rule.replace(strCapOld, strCapNew);
     959        }
     960        /* Parse rules: */
     961        QStringList rules = strIPv6Rule.split(',');
     962        Assert(rules.size() == 6);
     963        if (rules.size() != 6)
     964        {
     965            printf("strIPv6Rule = {%s}\n", strIPv6Rule.toAscii().constData());
     966            continue;
     967        }
     968        data.m_ipv6rules << UIPortForwardingData(rules[0],
     969                                                 gpConverter->fromInternalString<KNATProtocol>(rules[1]),
     970                                                 QString(rules[2]).remove('[').remove(']'),
     971                                                 rules[3].toUInt(),
     972                                                 QString(rules[4]).remove('[').remove(']'),
     973                                                 rules[5].toUInt());
    939974    }
    940975
     
    958993    network.SetAdvertiseDefaultIPv6RouteEnabled(data.m_fAdvertiseDefaultIPv6Route);
    959994
    960     /* Rewrite redirect options: */
    961     QVector<QString> oldRedirects = network.GetPortForwardRules4();
    962     foreach (const QString &strRedirect, oldRedirects)
    963         network.RemovePortForwardRule(false, strRedirect.section(':', 0, 0));
    964     foreach (const UIPortForwardingData &newRedirect, data.m_redirects)
     995    /* Rewrite IPv4 rules: */
     996    QVector<QString> oldIPv4Rules = network.GetPortForwardRules4();
     997    foreach (const QString &strRule, oldIPv4Rules)
     998        network.RemovePortForwardRule(false, strRule.section(':', 0, 0));
     999    foreach (const UIPortForwardingData &newRule, data.m_ipv4rules)
    9651000        network.AddPortForwardRule(false,
    966                                    newRedirect.name, newRedirect.protocol,
    967                                    newRedirect.hostIp, newRedirect.hostPort.value(),
    968                                    newRedirect.guestIp, newRedirect.guestPort.value());
     1001                                   newRule.name, newRule.protocol,
     1002                                   newRule.hostIp, newRule.hostPort.value(),
     1003                                   newRule.guestIp, newRule.guestPort.value());
     1004
     1005    /* Rewrite IPv6 rules: */
     1006    QVector<QString> oldIPv6Rules = network.GetPortForwardRules6();
     1007    foreach (const QString &strRule, oldIPv6Rules)
     1008        network.RemovePortForwardRule(true, strRule.section(':', 0, 0));
     1009    foreach (const UIPortForwardingData &newRule, data.m_ipv6rules)
     1010        network.AddPortForwardRule(true,
     1011                                   newRule.name, newRule.protocol,
     1012                                   newRule.hostIp, newRule.hostPort.value(),
     1013                                   newRule.guestIp, newRule.guestPort.value());
    9691014}
    9701015
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetwork.h

    r48524 r48548  
    2323#include "UISettingsPage.h"
    2424#include "UIGlobalSettingsNetwork.gen.h"
    25 #include "UIMachineSettingsPortForwardingDlg.h"
     25#include "UIPortForwardingTable.h"
    2626
    2727/* Forward declarations: */
     
    4141    bool m_fSupportsIPv6;
    4242    bool m_fAdvertiseDefaultIPv6Route;
    43     UIPortForwardingDataList m_redirects;
     43    UIPortForwardingDataList m_ipv4rules;
     44    UIPortForwardingDataList m_ipv6rules;
    4445    bool operator==(const UIDataNetworkNAT &other) const
    4546    {
     
    5152               m_fSupportsIPv6 == other.m_fSupportsIPv6 &&
    5253               m_fAdvertiseDefaultIPv6Route == other.m_fAdvertiseDefaultIPv6Route &&
    53                m_redirects == other.m_redirects;
     54               m_ipv4rules == other.m_ipv4rules &&
     55               m_ipv6rules == other.m_ipv6rules;
    5456    }
    5557};
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetworkDetailsNAT.cpp

    r48524 r48548  
    2424#include "UIGlobalSettingsNetwork.h"
    2525#include "UIGlobalSettingsNetworkDetailsNAT.h"
     26#include "UIGlobalSettingsPortForwardingDlg.h"
    2627
    2728UIGlobalSettingsNetworkDetailsNAT::UIGlobalSettingsNetworkDetailsNAT(QWidget *pParent, UIDataNetworkNAT &data)
     
    7273{
    7374    /* Open dialog to edit port-forwarding rules: */
    74     UIMachineSettingsPortForwardingDlg dlg(this, m_data.m_redirects);
     75    UIGlobalSettingsPortForwardingDlg dlg(this, m_data.m_ipv4rules, m_data.m_ipv6rules);
    7576    if (dlg.exec() == QDialog::Accepted)
    76         m_data.m_redirects = dlg.rules();
     77    {
     78        m_data.m_ipv4rules = dlg.ipv4rules();
     79        m_data.m_ipv6rules = dlg.ipv6rules();
     80    }
    7781}
    7882
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsPortForwardingDlg.cpp

    r48533 r48548  
    33 *
    44 * VBox frontends: Qt4 GUI ("VirtualBox"):
    5  * UIMachineSettingsPortForwardingDlg class implementation
     5 * UIGlobalSettingsPortForwardingDlg class implementation
    66 */
    77
     
    2121#include <QVBoxLayout>
    2222#include <QPushButton>
     23#include <QTabWidget>
    2324
    2425/* GUI includes: */
    25 #include "UIMachineSettingsPortForwardingDlg.h"
     26#include "UIGlobalSettingsPortForwardingDlg.h"
    2627#include "UIIconPool.h"
    2728#include "QIDialogButtonBox.h"
    2829
    29 UIMachineSettingsPortForwardingDlg::UIMachineSettingsPortForwardingDlg(QWidget *pParent,
    30                                                                        const UIPortForwardingDataList &rules)
     30UIGlobalSettingsPortForwardingDlg::UIGlobalSettingsPortForwardingDlg(QWidget *pParent,
     31                                                                     const UIPortForwardingDataList &ipv4rules,
     32                                                                     const UIPortForwardingDataList &ipv6rules)
    3133    : QIWithRetranslateUI<QIDialog>(pParent)
    32     , m_pTable(0)
     34    , m_pIPv4Table(0)
     35    , m_pIPv6Table(0)
    3336    , m_pButtonBox(0)
    3437{
     
    3942    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
    4043    {
    41         /* Create table: */
    42         m_pTable = new UIPortForwardingTable(rules);
     44        /* Create tab-widget: */
     45        m_pTabWidget = new QTabWidget;
     46        {
     47            /* Create table tabs: */
     48            m_pIPv4Table = new UIPortForwardingTable(ipv4rules, false);
     49            m_pIPv6Table = new UIPortForwardingTable(ipv6rules, true);
     50            /* Add widgets into tab-widget: */
     51            m_pTabWidget->addTab(m_pIPv4Table, QString());
     52            m_pTabWidget->addTab(m_pIPv6Table, QString());
     53        }
    4354        /* Create button-box: */
    4455        m_pButtonBox = new QIDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal);
     
    4960        }
    5061        /* Add widgets into layout: */
    51         pMainLayout->addWidget(m_pTable);
     62        pMainLayout->addWidget(m_pTabWidget);
    5263        pMainLayout->addWidget(m_pButtonBox);
    5364    }
     
    5768}
    5869
    59 const UIPortForwardingDataList& UIMachineSettingsPortForwardingDlg::rules() const
     70const UIPortForwardingDataList& UIGlobalSettingsPortForwardingDlg::ipv4rules() const
    6071{
    61     return m_pTable->rules();
     72    return m_pIPv4Table->rules();
    6273}
    6374
    64 void UIMachineSettingsPortForwardingDlg::accept()
     75const UIPortForwardingDataList& UIGlobalSettingsPortForwardingDlg::ipv6rules() const
     76{
     77    return m_pIPv6Table->rules();
     78}
     79
     80void UIGlobalSettingsPortForwardingDlg::accept()
    6581{
    6682    /* Validate table: */
    67     bool fPassed = m_pTable->validate();
     83    bool fPassed = m_pIPv4Table->validate() && m_pIPv6Table->validate();
    6884    if (!fPassed)
    6985        return;
     
    7288}
    7389
    74 void UIMachineSettingsPortForwardingDlg::reject()
     90void UIGlobalSettingsPortForwardingDlg::reject()
    7591{
    7692    /* Discard table: */
    77     bool fPassed = m_pTable->discard();
     93    bool fPassed = m_pIPv4Table->discard() && m_pIPv6Table->discard();
    7894    if (!fPassed)
    7995        return;
     
    8298}
    8399
    84 void UIMachineSettingsPortForwardingDlg::retranslateUi()
     100void UIGlobalSettingsPortForwardingDlg::retranslateUi()
    85101{
    86102    /* Set window title: */
    87103    setWindowTitle(tr("Port Forwarding Rules"));
     104    /* Set tab-widget tab names: */
     105    m_pTabWidget->setTabText(0, tr("IPv4"));
     106    m_pTabWidget->setTabText(1, tr("IPv6"));
    88107}
    89108
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsPortForwardingDlg.h

    r48533 r48548  
    1717 */
    1818
    19 #ifndef __UIMachineSettingsPortForwardingDlg_h__
    20 #define __UIMachineSettingsPortForwardingDlg_h__
     19#ifndef __UIGlobalSettingsPortForwardingDlg_h__
     20#define __UIGlobalSettingsPortForwardingDlg_h__
    2121
    2222/* GUI includes: */
     
    2626
    2727/* Forward declarations: */
     28class QTabWidget;
    2829class QIDialogButtonBox;
    2930
    30 /* Machine settings / Network page / NAT attachment / Port forwarding dialog: */
    31 class UIMachineSettingsPortForwardingDlg : public QIWithRetranslateUI<QIDialog>
     31/* Global settings / Network page / NAT network tab / Port forwarding dialog: */
     32class UIGlobalSettingsPortForwardingDlg : public QIWithRetranslateUI<QIDialog>
    3233{
    3334    Q_OBJECT;
     
    3637
    3738    /* Constructor/destructor: */
    38     UIMachineSettingsPortForwardingDlg(QWidget *pParent,
    39                                        const UIPortForwardingDataList &rules = UIPortForwardingDataList());
     39    UIGlobalSettingsPortForwardingDlg(QWidget *pParent,
     40                                      const UIPortForwardingDataList &ipv4rules,
     41                                      const UIPortForwardingDataList &ipv6rules);
    4042
    4143    /* API: Rules stuff: */
    42     const UIPortForwardingDataList& rules() const;
     44    const UIPortForwardingDataList& ipv4rules() const;
     45    const UIPortForwardingDataList& ipv6rules() const;
    4346
    4447private slots:
     
    5457
    5558    /* Widgets: */
    56     UIPortForwardingTable *m_pTable;
     59    QTabWidget *m_pTabWidget;
     60    UIPortForwardingTable *m_pIPv4Table;
     61    UIPortForwardingTable *m_pIPv6Table;
    5762    QIDialogButtonBox *m_pButtonBox;
    5863};
    5964
    60 #endif // __UIMachineSettingsPortForwardingDlg_h__
     65#endif // __UIGlobalSettingsPortForwardingDlg_h__
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsPortForwardingDlg.cpp

    r48533 r48548  
    4040    {
    4141        /* Create table: */
    42         m_pTable = new UIPortForwardingTable(rules);
     42        m_pTable = new UIPortForwardingTable(rules, false);
    4343        /* Create button-box: */
    4444        m_pButtonBox = new QIDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal);
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsPortForwardingDlg.h

    r48533 r48548  
    3636
    3737    /* Constructor/destructor: */
    38     UIMachineSettingsPortForwardingDlg(QWidget *pParent,
    39                                        const UIPortForwardingDataList &rules = UIPortForwardingDataList());
     38    UIMachineSettingsPortForwardingDlg(QWidget *pParent, const UIPortForwardingDataList &rules);
    4039
    4140    /* API: Rules stuff: */
  • trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIPortForwardingTable.cpp

    r48533 r48548  
    4343#include <math.h>
    4444
    45 /* IP validator: */
    46 class IPValidator : public QValidator
     45/* IPv4 validator: */
     46class IPv4Validator : public QValidator
    4747{
    4848    Q_OBJECT;
     
    5151
    5252    /* Constructor/destructor: */
    53     IPValidator(QObject *pParent) : QValidator(pParent) {}
    54     ~IPValidator() {}
     53    IPv4Validator(QObject *pParent) : QValidator(pParent) {}
     54    ~IPv4Validator() {}
    5555
    5656    /* Handler: Validation stuff: */
     
    7272};
    7373
     74/* IPv6 validator: */
     75class IPv6Validator : public QValidator
     76{
     77    Q_OBJECT;
     78
     79public:
     80
     81    /* Constructor/destructor: */
     82    IPv6Validator(QObject *pParent) : QValidator(pParent) {}
     83    ~IPv6Validator() {}
     84
     85    /* Handler: Validation stuff: */
     86    QValidator::State validate(QString &strInput, int& /*iPos*/) const
     87    {
     88        QString strStringToValidate(strInput);
     89        strStringToValidate.remove(' ');
     90        QString strDigits("([0-9a-fA-F]{0,4})");
     91        QRegExp intRegExp(QString("^%1(:%1(:%1(:%1(:%1(:%1(:%1(:%1)?)?)?)?)?)?)?$").arg(strDigits));
     92        if (intRegExp.indexIn(strStringToValidate) != -1)
     93            return QValidator::Acceptable;
     94        else
     95            return QValidator::Invalid;
     96    }
     97};
     98
    7499/* Name editor: */
    75100class NameEditor : public QLineEdit
     
    140165};
    141166
    142 /* IP editor: */
    143 class IPEditor : public QLineEdit
     167/* IPv4 editor: */
     168class IPv4Editor : public QLineEdit
    144169{
    145170    Q_OBJECT;
     
    149174
    150175    /* Constructor: */
    151     IPEditor(QWidget *pParent = 0) : QLineEdit(pParent)
     176    IPv4Editor(QWidget *pParent = 0) : QLineEdit(pParent)
    152177    {
    153178        setFrame(false);
    154179        setAlignment(Qt::AlignCenter);
    155         setValidator(new IPValidator(this));
     180        setValidator(new IPv4Validator(this));
    156181        setInputMask("000.000.000.000");
     182    }
     183
     184private:
     185
     186    /* API: IP stuff: */
     187    void setIp(IpData ip)
     188    {
     189        setText(ip);
     190    }
     191
     192    /* API: IP stuff: */
     193    IpData ip() const
     194    {
     195        return text() == "..." ? QString() : text();
     196    }
     197};
     198
     199/* IPv6 editor: */
     200class IPv6Editor : public QLineEdit
     201{
     202    Q_OBJECT;
     203    Q_PROPERTY(IpData ip READ ip WRITE setIp USER true);
     204
     205public:
     206
     207    /* Constructor: */
     208    IPv6Editor(QWidget *pParent = 0) : QLineEdit(pParent)
     209    {
     210        setFrame(false);
     211        setAlignment(Qt::AlignCenter);
     212        setValidator(new IPv6Validator(this));
     213        // setInputMask("000.000.000.000"); // No mask for now...
    157214    }
    158215
     
    435492
    436493
    437 UIPortForwardingTable::UIPortForwardingTable(const UIPortForwardingDataList &rules)
     494UIPortForwardingTable::UIPortForwardingTable(const UIPortForwardingDataList &rules, bool fIPv6)
    438495    : m_fIsTableDataChanged(false)
    439496    , m_pTableView(0)
     
    534591            int iIpId = qRegisterMetaType<IpData>();
    535592            /* Register ip editor: */
    536             QStandardItemEditorCreator<IPEditor> *pIpEditorItemCreator = new QStandardItemEditorCreator<IPEditor>();
    537             /* Link ip type & editor: */
    538             pNewItemEditorFactory->registerEditor((QVariant::Type)iIpId, pIpEditorItemCreator);
     593            if (!fIPv6)
     594            {
     595                QStandardItemEditorCreator<IPv4Editor> *pIPv4EditorItemCreator = new QStandardItemEditorCreator<IPv4Editor>();
     596                /* Link ip type & editor: */
     597                pNewItemEditorFactory->registerEditor((QVariant::Type)iIpId, pIPv4EditorItemCreator);
     598            }
     599            else
     600            {
     601                QStandardItemEditorCreator<IPv6Editor> *pIPv6EditorItemCreator = new QStandardItemEditorCreator<IPv6Editor>();
     602                /* Link ip type & editor: */
     603                pNewItemEditorFactory->registerEditor((QVariant::Type)iIpId, pIPv6EditorItemCreator);
     604            }
    539605
    540606            /* Register port type: */
  • trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIPortForwardingTable.h

    r48533 r48548  
    109109
    110110    /* Constructor: */
    111     UIPortForwardingTable(const UIPortForwardingDataList &rules = UIPortForwardingDataList());
     111    UIPortForwardingTable(const UIPortForwardingDataList &rules, bool fIPv6);
    112112
    113113    /* API: Rules stuff: */
Note: See TracChangeset for help on using the changeset viewer.

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