VirtualBox

Changeset 35548 in vbox


Ignore:
Timestamp:
Jan 13, 2011 4:45:35 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
69432
Message:

FE/Qt: 5470, 5439: Host-only interface GUI rework (part 1).

Location:
trunk/src/VBox/Frontends/VirtualBox/src/settings/global
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetwork.cpp

    r34740 r35548  
    257257        const CHostNetworkInterface &iface = interfaces[iNetworkIndex];
    258258        if (iface.GetInterfaceType() == KHostNetworkInterfaceType_HostOnly)
    259         {
    260             /* Initialization: */
    261             CDHCPServer dhcp = vboxGlobal().virtualBox().FindDHCPServerByNetworkName(iface.GetNetworkName());
    262             if (dhcp.isNull()) vboxGlobal().virtualBox().CreateDHCPServer(iface.GetNetworkName());
    263             dhcp = vboxGlobal().virtualBox().FindDHCPServerByNetworkName(iface.GetNetworkName());
    264             AssertMsg(!dhcp.isNull(), ("DHCP Server creation failed!\n"));
    265             UIHostNetworkData data;
    266             /* Host-only interface settings */
    267             data.m_interface.m_strName = iface.GetName();
    268             data.m_interface.m_fDhcpClientEnabled = iface.GetDhcpEnabled();
    269             data.m_interface.m_strInterfaceAddress = iface.GetIPAddress();
    270             data.m_interface.m_strInterfaceMask = iface.GetNetworkMask();
    271             data.m_interface.m_fIpv6Supported = iface.GetIPV6Supported();
    272             data.m_interface.m_strInterfaceAddress6 = iface.GetIPV6Address();
    273             data.m_interface.m_strInterfaceMaskLength6 = QString::number(iface.GetIPV6NetworkMaskPrefixLength());
    274             /* DHCP server settings: */
    275             data.m_dhcpserver.m_fDhcpServerEnabled = dhcp.GetEnabled();
    276             data.m_dhcpserver.m_strDhcpServerAddress = dhcp.GetIPAddress();
    277             data.m_dhcpserver.m_strDhcpServerMask = dhcp.GetNetworkMask();
    278             data.m_dhcpserver.m_strDhcpLowerAddress = dhcp.GetLowerIP();
    279             data.m_dhcpserver.m_strDhcpUpperAddress = dhcp.GetUpperIP();
    280             /* Cache: */
    281             m_cache.m_items << data;
    282         }
     259            appendCacheItem(iface);
    283260    }
    284261
     
    293270    /* Fetch from cache: */
    294271    for (int iNetworkIndex = 0; iNetworkIndex < m_cache.m_items.size(); ++iNetworkIndex)
    295     {
    296         const UIHostNetworkData &data = m_cache.m_items[iNetworkIndex];
    297         UIHostInterfaceItem *pItem = new UIHostInterfaceItem;
    298         pItem->fetchNetworkData(data);
    299         m_pInterfacesTree->addTopLevelItem(pItem);
    300     }
     272        appendListItem(m_cache.m_items[iNetworkIndex]);
     273    /* Set first list item as current: */
    301274    m_pInterfacesTree->setCurrentItem(m_pInterfacesTree->topLevelItem(0));
    302275    sltUpdateCurrentItem();
     
    307280void UIGlobalSettingsNetwork::putToCache()
    308281{
     282    /* Eraze cache: */
     283    m_cache.m_items.clear();
    309284    /* Upload to cache: */
    310     m_cache.m_items.clear();
    311285    for (int iNetworkIndex = 0; iNetworkIndex < m_pInterfacesTree->topLevelItemCount(); ++iNetworkIndex)
    312286    {
     
    329303    UISettingsPageGlobal::fetchData(data);
    330304
    331     /* Save from cache: */
     305    /* Prepare useful variables: */
    332306    CVirtualBox vbox = vboxGlobal().virtualBox();
    333307    CHost host = vbox.GetHost();
    334     const CHostNetworkInterfaceVector &interfaces = host.GetNetworkInterfaces();
    335     /* Remove all the old interfaces first: */
    336     for (int iNetworkIndex = 0; iNetworkIndex < interfaces.size() && !failed(); ++iNetworkIndex)
    337     {
    338         /* Get iterated interface: */
    339         const CHostNetworkInterface &iface = interfaces[iNetworkIndex];
    340         if (iface.GetInterfaceType() == KHostNetworkInterfaceType_HostOnly)
    341         {
    342             /* Search for this interface's dhcp sserver: */
    343             CDHCPServer dhcp = vboxGlobal().virtualBox().FindDHCPServerByNetworkName(iface.GetNetworkName());
    344             /* Delete it if its present: */
    345             if (!dhcp.isNull())
    346                 vbox.RemoveDHCPServer(dhcp);
    347             /* Delete interface finally: */
    348             CProgress progress = host.RemoveHostOnlyNetworkInterface(iface.GetId());
    349             if (host.isOk())
     308
     309    /* Update all the host-only interfaces: */
     310    for (int iNetworkIndex = 0; iNetworkIndex < m_cache.m_items.size(); ++iNetworkIndex)
     311    {
     312        /* Get iterated data: */
     313        const UIHostNetworkData &data = m_cache.m_items[iNetworkIndex];
     314        /* Find corresponding interface: */
     315        CHostNetworkInterface iface = host.FindHostNetworkInterfaceByName(data.m_interface.m_strName);
     316        if (!iface.isNull())
     317        {
     318            /* Host-only interface configuring: */
     319            if (data.m_interface.m_fDhcpClientEnabled)
    350320            {
    351                 progress.WaitForCompletion(-1);
    352                 if (progress.GetResultCode() != 0)
    353                 {
    354                     /* Mark the page as failed: */
    355                     setFailed(true);
    356                     /* Show error message: */
    357                     vboxProblem().cannotRemoveHostInterface(progress, iface);
    358                 }
     321                iface.EnableDynamicIpConfig();
    359322            }
    360323            else
    361324            {
    362                 /* Mark the page as failed: */
    363                 setFailed(true);
    364                 /* Show error message: */
    365                 vboxProblem().cannotRemoveHostInterface(host, iface);
     325                AssertMsg(data.m_interface.m_strInterfaceAddress.isEmpty() ||
     326                          QHostAddress(data.m_interface.m_strInterfaceAddress).protocol() == QAbstractSocket::IPv4Protocol,
     327                          ("Interface IPv4 address must be empty or IPv4-valid!\n"));
     328                AssertMsg(data.m_interface.m_strInterfaceMask.isEmpty() ||
     329                          QHostAddress(data.m_interface.m_strInterfaceMask).protocol() == QAbstractSocket::IPv4Protocol,
     330                          ("Interface IPv4 network mask must be empty or IPv4-valid!\n"));
     331                iface.EnableStaticIpConfig(data.m_interface.m_strInterfaceAddress, data.m_interface.m_strInterfaceMask);
     332                if (iface.GetIPV6Supported())
     333                {
     334                    AssertMsg(data.m_interface.m_strInterfaceAddress6.isEmpty() ||
     335                              QHostAddress(data.m_interface.m_strInterfaceAddress6).protocol() == QAbstractSocket::IPv6Protocol,
     336                              ("Interface IPv6 address must be empty or IPv6-valid!\n"));
     337                    iface.EnableStaticIpConfigV6(data.m_interface.m_strInterfaceAddress6, data.m_interface.m_strInterfaceMaskLength6.toULong());
     338                }
    366339            }
    367         }
    368     }
    369     /* Add all the new interfaces finally: */
    370     for (int iNetworkIndex = 0; iNetworkIndex < m_cache.m_items.size() && !failed(); ++iNetworkIndex)
    371     {
    372         /* Get iterated data: */
    373         const UIHostNetworkData &data = m_cache.m_items[iNetworkIndex];
    374         CHostNetworkInterface iface;
    375         /* Create interface: */
    376         CProgress progress = host.CreateHostOnlyNetworkInterface(iface);
    377         if (host.isOk())
    378         {
    379             progress.WaitForCompletion(-1);
    380             if (progress.GetResultCode() == 0)
     340
     341            /* Find corresponding DHCP server: */
     342            CDHCPServer dhcp = vbox.FindDHCPServerByNetworkName(iface.GetNetworkName());
     343            if (!dhcp.isNull())
    381344            {
    382                 /* Create DHCP server: */
    383                 CDHCPServer dhcp = vbox.FindDHCPServerByNetworkName(iface.GetNetworkName());
    384                 if (dhcp.isNull()) vbox.CreateDHCPServer(iface.GetNetworkName());
    385                 dhcp = vbox.FindDHCPServerByNetworkName(iface.GetNetworkName());
    386                 AssertMsg(!dhcp.isNull(), ("DHCP Server creation failed!\n"));
    387                 /* Host-only Interface configuring: */
    388                 if (data.m_interface.m_fDhcpClientEnabled)
    389                 {
    390                     iface.EnableDynamicIpConfig();
    391                 }
    392                 else
    393                 {
    394                     AssertMsg(data.m_interface.m_strInterfaceAddress.isEmpty() ||
    395                               QHostAddress(data.m_interface.m_strInterfaceAddress).protocol() == QAbstractSocket::IPv4Protocol,
    396                               ("Interface IPv4 address must be empty or IPv4-valid!\n"));
    397                     AssertMsg(data.m_interface.m_strInterfaceMask.isEmpty() ||
    398                               QHostAddress(data.m_interface.m_strInterfaceMask).protocol() == QAbstractSocket::IPv4Protocol,
    399                               ("Interface IPv4 network mask must be empty or IPv4-valid!\n"));
    400                     iface.EnableStaticIpConfig(data.m_interface.m_strInterfaceAddress, data.m_interface.m_strInterfaceMask);
    401                     if (iface.GetIPV6Supported())
    402                     {
    403                         AssertMsg(data.m_interface.m_strInterfaceAddress6.isEmpty() ||
    404                                   QHostAddress(data.m_interface.m_strInterfaceAddress6).protocol() == QAbstractSocket::IPv6Protocol,
    405                                   ("Interface IPv6 address must be empty or IPv6-valid!\n"));
    406                         iface.EnableStaticIpConfigV6(data.m_interface.m_strInterfaceAddress6, data.m_interface.m_strInterfaceMaskLength6.toULong());
    407                     }
    408                 }
    409                 /* DHCP Server configuring: */
     345                /* DHCP server configuring: */
    410346                dhcp.SetEnabled(data.m_dhcpserver.m_fDhcpServerEnabled);
    411 //                AssertMsg(QHostAddress(data.m_dhcpserver.m_strDhcpServerAddress).protocol() == QAbstractSocket::IPv4Protocol,
    412 //                          ("DHCP Server IPv4 address must be IPv4-valid!\n"));
    413 //                AssertMsg(QHostAddress(data.m_dhcpserver.m_strDhcpServerMask).protocol() == QAbstractSocket::IPv4Protocol,
    414 //                          ("DHCP Server IPv4 network mask must be IPv4-valid!\n"));
    415 //                AssertMsg(QHostAddress(data.m_dhcpserver.m_strDhcpLowerAddress).protocol() == QAbstractSocket::IPv4Protocol,
    416 //                          ("DHCP Server IPv4 lower bound must be IPv4-valid!\n"));
    417 //                AssertMsg(QHostAddress(data.m_dhcpserver.m_strDhcpUpperAddress).protocol() == QAbstractSocket::IPv4Protocol,
    418 //                          ("DHCP Server IPv4 upper bound must be IPv4-valid!\n"));
     347                AssertMsg(QHostAddress(data.m_dhcpserver.m_strDhcpServerAddress).protocol() == QAbstractSocket::IPv4Protocol,
     348                          ("DHCP server IPv4 address must be IPv4-valid!\n"));
     349                AssertMsg(QHostAddress(data.m_dhcpserver.m_strDhcpServerMask).protocol() == QAbstractSocket::IPv4Protocol,
     350                          ("DHCP server IPv4 network mask must be IPv4-valid!\n"));
     351                AssertMsg(QHostAddress(data.m_dhcpserver.m_strDhcpLowerAddress).protocol() == QAbstractSocket::IPv4Protocol,
     352                          ("DHCP server IPv4 lower bound must be IPv4-valid!\n"));
     353                AssertMsg(QHostAddress(data.m_dhcpserver.m_strDhcpUpperAddress).protocol() == QAbstractSocket::IPv4Protocol,
     354                          ("DHCP server IPv4 upper bound must be IPv4-valid!\n"));
    419355                if (QHostAddress(data.m_dhcpserver.m_strDhcpServerAddress).protocol() == QAbstractSocket::IPv4Protocol &&
    420356                    QHostAddress(data.m_dhcpserver.m_strDhcpServerMask).protocol() == QAbstractSocket::IPv4Protocol &&
     
    424360                                          data.m_dhcpserver.m_strDhcpLowerAddress, data.m_dhcpserver.m_strDhcpUpperAddress);
    425361            }
    426             else
    427             {
    428                 /* Mark the page as failed: */
    429                 setFailed(true);
    430                 /* Show error message: */
    431                 vboxProblem().cannotCreateHostInterface(progress);
    432             }
    433         }
    434         else
    435         {
    436             /* Mark the page as failed: */
    437             setFailed(true);
    438             /* Show error message: */
    439             vboxProblem().cannotCreateHostInterface(host);
    440362        }
    441363    }
     
    487409void UIGlobalSettingsNetwork::sltAddInterface()
    488410{
    489     /* Creating interface item: */
    490     UIHostInterfaceItem *pItem = new UIHostInterfaceItem;
    491     /* Fill item's data: */
    492     UIHostNetworkData data;
    493     /* Interface data: */
    494     // TODO: Make unique name!
    495     data.m_interface.m_strName = tr("New Host-Only Interface");
    496     data.m_interface.m_fDhcpClientEnabled = true;
    497     data.m_interface.m_fIpv6Supported = false;
    498     /* DHCP data: */
    499     data.m_dhcpserver.m_fDhcpServerEnabled = false;
    500     /* Fetch item with data: */
    501     pItem->fetchNetworkData(data);
    502     /* Add new top-level item: */
    503     m_pInterfacesTree->addTopLevelItem(pItem);
    504     m_pInterfacesTree->sortItems(0, Qt::AscendingOrder);
    505     m_pInterfacesTree->setCurrentItem(pItem);
    506     /* Mark dialog as edited: */
    507     m_fChanged = true;
     411    /* Prepare useful variables: */
     412    CVirtualBox vbox = vboxGlobal().virtualBox();
     413    CHost host = vbox.GetHost();
     414
     415    /* Create new host-only interface: */
     416    CHostNetworkInterface iface;
     417    CProgress progress = host.CreateHostOnlyNetworkInterface(iface);
     418    if (host.isOk())
     419    {
     420        vboxProblem().showModalProgressDialog(progress, tr("Creating host-only interface..."),
     421                                              ":/nw_32px.png", this, true, 0);
     422        if (progress.GetResultCode() == 0)
     423        {
     424            /* Create DHCP server: */
     425            CDHCPServer dhcp = vbox.FindDHCPServerByNetworkName(iface.GetNetworkName());
     426            if (dhcp.isNull())
     427            {
     428                vbox.CreateDHCPServer(iface.GetNetworkName());
     429                dhcp = vbox.FindDHCPServerByNetworkName(iface.GetNetworkName());
     430            }
     431            AssertMsg(!dhcp.isNull(), ("DHCP server creation failed!\n"));
     432
     433            /* Append cache with new item: */
     434            appendCacheItem(iface);
     435            /* Append list with new item: */
     436            appendListItem(m_cache.m_items.last());
     437        }
     438        else
     439            vboxProblem().cannotCreateHostInterface(progress);
     440    }
     441    else
     442        vboxProblem().cannotRemoveHostInterface(host, iface);
    508443}
    509444
     
    519454    if (vboxProblem().confirmDeletingHostInterface(strInterfaceName, this) == QIMessageBox::Cancel)
    520455        return;
    521     /* Removing interface: */
    522     delete pItem;
    523     /* Mark dialog as edited: */
    524     m_fChanged = true;
     456
     457    /* Prepare useful variables: */
     458    CVirtualBox vbox = vboxGlobal().virtualBox();
     459    CHost host = vbox.GetHost();
     460
     461    /* Find corresponding interface: */
     462    const CHostNetworkInterface &iface = host.FindHostNetworkInterfaceByName(strInterfaceName);
     463
     464    /* Remove DHCP server first: */
     465    CDHCPServer dhcp = vboxGlobal().virtualBox().FindDHCPServerByNetworkName(iface.GetNetworkName());
     466    if (!dhcp.isNull())
     467        vbox.RemoveDHCPServer(dhcp);
     468
     469    /* Remove interface finally: */
     470    CProgress progress = host.RemoveHostOnlyNetworkInterface(iface.GetId());
     471    if (host.isOk())
     472    {
     473        vboxProblem().showModalProgressDialog(progress, tr("Removing host-only interface..."),
     474                                              ":/nw_32px.png", this, true, 0);
     475        if (progress.GetResultCode() == 0)
     476        {
     477            /* Remove list item: */
     478            removeListItem(pItem);
     479            /* Remove cache item: */
     480            removeCacheItem(strInterfaceName);
     481        }
     482        else
     483            vboxProblem().cannotRemoveHostInterface(progress, iface);
     484    }
     485    else
     486        vboxProblem().cannotRemoveHostInterface(host, iface);
    525487}
    526488
     
    538500        details.putBackToItem();
    539501        pItem->updateInfo();
    540     }
    541     sltUpdateCurrentItem();
    542     m_pValidator->revalidate();
    543     /* Mark dialog as edited: */
    544     m_fChanged = true;
     502        sltUpdateCurrentItem();
     503        m_pValidator->revalidate();
     504        m_fChanged = true;
     505    }
    545506}
    546507
     
    570531        menu.addAction(m_pAddAction);
    571532    }
    572 
    573533    menu.exec(m_pInterfacesTree->mapToGlobal(pos));
    574534}
    575535
     536void UIGlobalSettingsNetwork::appendCacheItem(const CHostNetworkInterface &iface)
     537{
     538    /* Get DHCP server (create if necessary): */
     539    CDHCPServer dhcp = vboxGlobal().virtualBox().FindDHCPServerByNetworkName(iface.GetNetworkName());
     540    if (dhcp.isNull())
     541    {
     542        vboxGlobal().virtualBox().CreateDHCPServer(iface.GetNetworkName());
     543        dhcp = vboxGlobal().virtualBox().FindDHCPServerByNetworkName(iface.GetNetworkName());
     544    }
     545    AssertMsg(!dhcp.isNull(), ("DHCP server creation failed!\n"));
     546
     547    /* Prepare cache item: */
     548    UIHostNetworkData data;
     549
     550    /* Host-only interface settings */
     551    data.m_interface.m_strName = iface.GetName();
     552    data.m_interface.m_fDhcpClientEnabled = iface.GetDhcpEnabled();
     553    data.m_interface.m_strInterfaceAddress = iface.GetIPAddress();
     554    data.m_interface.m_strInterfaceMask = iface.GetNetworkMask();
     555    data.m_interface.m_fIpv6Supported = iface.GetIPV6Supported();
     556    data.m_interface.m_strInterfaceAddress6 = iface.GetIPV6Address();
     557    data.m_interface.m_strInterfaceMaskLength6 = QString::number(iface.GetIPV6NetworkMaskPrefixLength());
     558
     559    /* DHCP server settings: */
     560    data.m_dhcpserver.m_fDhcpServerEnabled = dhcp.GetEnabled();
     561    data.m_dhcpserver.m_strDhcpServerAddress = dhcp.GetIPAddress();
     562    data.m_dhcpserver.m_strDhcpServerMask = dhcp.GetNetworkMask();
     563    data.m_dhcpserver.m_strDhcpLowerAddress = dhcp.GetLowerIP();
     564    data.m_dhcpserver.m_strDhcpUpperAddress = dhcp.GetUpperIP();
     565
     566    /* Append cache item: */
     567    m_cache.m_items << data;
     568}
     569
     570void UIGlobalSettingsNetwork::removeCacheItem(const QString &strInterfaceName)
     571{
     572    /* Search for invalidated cache item: */
     573    for (int iNetworkIndex = 0; iNetworkIndex < m_cache.m_items.size(); ++iNetworkIndex)
     574    {
     575        /* Get iterated data: */
     576        const UIHostNetworkData &data = m_cache.m_items[iNetworkIndex];
     577        if (data.m_interface.m_strName == strInterfaceName)
     578        {
     579            m_cache.m_items.removeAll(data);
     580            break;
     581        }
     582    }
     583}
     584
     585void UIGlobalSettingsNetwork::appendListItem(const UIHostNetworkData &data)
     586{
     587    /* Add new item to the list: */
     588    UIHostInterfaceItem *pItem = new UIHostInterfaceItem;
     589    pItem->fetchNetworkData(data);
     590    m_pInterfacesTree->addTopLevelItem(pItem);
     591}
     592
     593void UIGlobalSettingsNetwork::removeListItem(UIHostInterfaceItem *pItem)
     594{
     595    /* Delete passed item: */
     596    delete pItem;
     597}
     598
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetwork.h

    r34162 r35548  
    3535    QString m_strInterfaceAddress6;
    3636    QString m_strInterfaceMaskLength6;
     37    bool operator==(const UIHostInterfaceData &other) const
     38    {
     39        return m_strName == other.m_strName &&
     40               m_fDhcpClientEnabled == other.m_fDhcpClientEnabled &&
     41               m_strInterfaceAddress == other.m_strInterfaceAddress &&
     42               m_strInterfaceMask == other.m_strInterfaceMask &&
     43               m_fIpv6Supported == other.m_fIpv6Supported &&
     44               m_strInterfaceAddress6 == other.m_strInterfaceAddress6 &&
     45               m_strInterfaceMaskLength6 == other.m_strInterfaceMaskLength6;
     46    }
    3747};
    3848
     
    4656    QString m_strDhcpLowerAddress;
    4757    QString m_strDhcpUpperAddress;
     58    bool operator==(const UIDHCPServerData &other) const
     59    {
     60        return m_fDhcpServerEnabled == other.m_fDhcpServerEnabled &&
     61               m_strDhcpServerAddress == other.m_strDhcpServerAddress &&
     62               m_strDhcpServerMask == other.m_strDhcpServerMask &&
     63               m_strDhcpLowerAddress == other.m_strDhcpLowerAddress &&
     64               m_strDhcpUpperAddress == other.m_strDhcpUpperAddress;
     65    }
    4866};
    4967
     
    5371    UIHostInterfaceData m_interface;
    5472    UIDHCPServerData m_dhcpserver;
     73    bool operator==(const UIHostNetworkData &other) const
     74    {
     75        return m_interface == other.m_interface &&
     76               m_dhcpserver == other.m_dhcpserver;
     77    }
    5578};
    5679
     
    161184private:
    162185
     186    /* Helper members: */
     187    void appendCacheItem(const CHostNetworkInterface &iface);
     188    void removeCacheItem(const QString &strInterfaceName);
     189    void appendListItem(const UIHostNetworkData &data);
     190    void removeListItem(UIHostInterfaceItem *pItem);
     191
    163192    /* Validator: */
    164193    QIWidgetValidator *m_pValidator;
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