void UIGlobalSettingsNetwork::appendCacheItem(const CHostNetworkInterface &iface) { /* Get DHCP server (create if necessary): */ CDHCPServer dhcp = vboxGlobal().virtualBox().FindDHCPServerByNetworkName(iface.GetNetworkName()); if (dhcp.isNull()) { vboxGlobal().virtualBox().CreateDHCPServer(iface.GetNetworkName()); dhcp = vboxGlobal().virtualBox().FindDHCPServerByNetworkName(iface.GetNetworkName()); } AssertMsg(!dhcp.isNull(), ("DHCP server creation failed!\n")); /* Prepare cache item: */ UIHostNetworkData data; /* Host-only interface settings */ data.m_interface.m_strName = iface.GetName(); data.m_interface.m_fDhcpClientEnabled = iface.GetDHCPEnabled(); data.m_interface.m_strInterfaceAddress = iface.GetIPAddress(); data.m_interface.m_strInterfaceMask = iface.GetNetworkMask(); data.m_interface.m_fIpv6Supported = iface.GetIPV6Supported(); data.m_interface.m_strInterfaceAddress6 = iface.GetIPV6Address(); data.m_interface.m_strInterfaceMaskLength6 = QString::number(iface.GetIPV6NetworkMaskPrefixLength()); /* DHCP server settings: */ data.m_dhcpserver.m_fDhcpServerEnabled = dhcp.GetEnabled(); data.m_dhcpserver.m_strDhcpServerAddress = dhcp.GetIPAddress(); data.m_dhcpserver.m_strDhcpServerMask = dhcp.GetNetworkMask(); data.m_dhcpserver.m_strDhcpLowerAddress = dhcp.GetLowerIP(); data.m_dhcpserver.m_strDhcpUpperAddress = dhcp.GetUpperIP(); /* Append cache item: */ m_cache.m_items << data; }
/* Adds new network interface: */ void UIGlobalSettingsNetwork::sltAddInterface() { /* Prepare useful variables: */ CVirtualBox vbox = vboxGlobal().virtualBox(); CHost host = vboxGlobal().host(); /* Create new host-only interface: */ CHostNetworkInterface iface; CProgress progress = host.CreateHostOnlyNetworkInterface(iface); if (host.isOk()) { msgCenter().showModalProgressDialog(progress, tr("Networking"), ":/nw_32px.png", this, true, 0); if (progress.GetResultCode() == 0) { /* Create DHCP server: */ CDHCPServer dhcp = vbox.FindDHCPServerByNetworkName(iface.GetNetworkName()); if (dhcp.isNull()) { vbox.CreateDHCPServer(iface.GetNetworkName()); dhcp = vbox.FindDHCPServerByNetworkName(iface.GetNetworkName()); } AssertMsg(!dhcp.isNull(), ("DHCP server creation failed!\n")); /* Append cache with new item: */ appendCacheItem(iface); /* Append list with new item: */ appendListItem(m_cache.m_items.last(), true); } else msgCenter().cannotCreateHostInterface(progress, this); } else msgCenter().cannotCreateHostInterface(host, this); }
void UIHostNetworkManagerWidget::loadHostNetwork(const CHostNetworkInterface &comInterface, UIDataHostNetwork &data) { /* Gather interface settings: */ if (comInterface.isOk()) data.m_interface.m_strName = comInterface.GetName(); if (comInterface.isOk()) data.m_interface.m_fDHCPEnabled = comInterface.GetDHCPEnabled(); if (comInterface.isOk()) data.m_interface.m_strAddress = comInterface.GetIPAddress(); if (comInterface.isOk()) data.m_interface.m_strMask = comInterface.GetNetworkMask(); if (comInterface.isOk()) data.m_interface.m_fSupportedIPv6 = comInterface.GetIPV6Supported(); if (comInterface.isOk()) data.m_interface.m_strAddress6 = comInterface.GetIPV6Address(); if (comInterface.isOk()) data.m_interface.m_strPrefixLength6 = QString::number(comInterface.GetIPV6NetworkMaskPrefixLength()); /* Get host interface network name for further activities: */ QString strNetworkName; if (comInterface.isOk()) strNetworkName = comInterface.GetNetworkName(); /* Show error message if necessary: */ if (!comInterface.isOk()) msgCenter().cannotAcquireHostNetworkInterfaceParameter(comInterface, this); /* Get VBox for further activities: */ CVirtualBox comVBox = vboxGlobal().virtualBox(); /* Find corresponding DHCP server (create if necessary): */ CDHCPServer comServer = comVBox.FindDHCPServerByNetworkName(strNetworkName); if (!comVBox.isOk() || comServer.isNull()) comServer = comVBox.CreateDHCPServer(strNetworkName); /* Show error message if necessary: */ if (!comVBox.isOk() || comServer.isNull()) msgCenter().cannotCreateDHCPServer(comVBox, strNetworkName, this); else { /* Gather DHCP server settings: */ if (comServer.isOk()) data.m_dhcpserver.m_fEnabled = comServer.GetEnabled(); if (comServer.isOk()) data.m_dhcpserver.m_strAddress = comServer.GetIPAddress(); if (comServer.isOk()) data.m_dhcpserver.m_strMask = comServer.GetNetworkMask(); if (comServer.isOk()) data.m_dhcpserver.m_strLowerAddress = comServer.GetLowerIP(); if (comServer.isOk()) data.m_dhcpserver.m_strUpperAddress = comServer.GetUpperIP(); /* Show error message if necessary: */ if (!comServer.isOk()) return msgCenter().cannotAcquireDHCPServerParameter(comServer, this); } }
void UIHostNetworkManagerWidget::sltCreateHostNetwork() { /* Get host for further activities: */ CHost comHost = vboxGlobal().host(); /* Create interface: */ CHostNetworkInterface comInterface; CProgress progress = comHost.CreateHostOnlyNetworkInterface(comInterface); /* Show error message if necessary: */ if (!comHost.isOk() || progress.isNull()) msgCenter().cannotCreateHostNetworkInterface(comHost, this); else { /* Show interface creation progress: */ msgCenter().showModalProgressDialog(progress, UIHostNetworkManager::tr("Adding network..."), ":/progress_network_interface_90px.png", this, 0); /* Show error message if necessary: */ if (!progress.isOk() || progress.GetResultCode() != 0) msgCenter().cannotCreateHostNetworkInterface(progress, this); else { /* Get network name for further activities: */ const QString strNetworkName = comInterface.GetNetworkName(); /* Show error message if necessary: */ if (!comInterface.isOk()) msgCenter().cannotAcquireHostNetworkInterfaceParameter(comInterface, this); else { /* Get VBox for further activities: */ CVirtualBox comVBox = vboxGlobal().virtualBox(); /* Find corresponding DHCP server (create if necessary): */ CDHCPServer comServer = comVBox.FindDHCPServerByNetworkName(strNetworkName); if (!comVBox.isOk() || comServer.isNull()) comServer = comVBox.CreateDHCPServer(strNetworkName); /* Show error message if necessary: */ if (!comVBox.isOk() || comServer.isNull()) msgCenter().cannotCreateDHCPServer(comVBox, strNetworkName, this); } /* Add interface to the tree: */ UIDataHostNetwork data; loadHostNetwork(comInterface, data); createItemForNetworkHost(data, true); /* Adjust tree-widget: */ sltAdjustTreeWidget(); } } }
/* Removes selected network interface: */ void UIGlobalSettingsNetwork::sltDelInterface() { /* Get interface item: */ UIHostInterfaceItem *pItem = static_cast<UIHostInterfaceItem*>(m_pInterfacesTree->currentItem()); AssertMsg(pItem, ("Current item should present!\n")); /* Get interface name: */ QString strInterfaceName(pItem->name()); /* Asking user about deleting selected network interface: */ if (msgCenter().confirmDeletingHostInterface(strInterfaceName, this) == QIMessageBox::Cancel) return; /* Prepare useful variables: */ CVirtualBox vbox = vboxGlobal().virtualBox(); CHost host = vboxGlobal().host(); /* Find corresponding interface: */ const CHostNetworkInterface &iface = host.FindHostNetworkInterfaceByName(strInterfaceName); /* Remove DHCP server first: */ CDHCPServer dhcp = vboxGlobal().virtualBox().FindDHCPServerByNetworkName(iface.GetNetworkName()); if (!dhcp.isNull()) vbox.RemoveDHCPServer(dhcp); /* Remove interface finally: */ CProgress progress = host.RemoveHostOnlyNetworkInterface(iface.GetId()); if (host.isOk()) { msgCenter().showModalProgressDialog(progress, tr("Networking"), ":/nw_32px.png", this, true, 0); if (progress.GetResultCode() == 0) { /* Remove list item: */ removeListItem(pItem); /* Remove cache item: */ removeCacheItem(strInterfaceName); } else msgCenter().cannotRemoveHostInterface(progress, iface, this); } else msgCenter().cannotRemoveHostInterface(host, iface, this); }
void UIHostNetworkManagerWidget::sltHandleItemChange(QTreeWidgetItem *pItem) { /* Get network item: */ UIItemHostNetwork *pChangedItem = static_cast<UIItemHostNetwork*>(pItem); AssertMsgReturnVoid(pChangedItem, ("Changed item must not be null!\n")); /* Get item data: */ UIDataHostNetwork oldData = *pChangedItem; /* Make sure dhcp server status changed: */ if ( ( oldData.m_dhcpserver.m_fEnabled && pChangedItem->checkState(Column_DHCP) == Qt::Checked) || ( !oldData.m_dhcpserver.m_fEnabled && pChangedItem->checkState(Column_DHCP) == Qt::Unchecked)) return; /* Get host for further activities: */ CHost comHost = vboxGlobal().host(); /* Find corresponding interface: */ CHostNetworkInterface comInterface = comHost.FindHostNetworkInterfaceByName(oldData.m_interface.m_strName); /* Show error message if necessary: */ if (!comHost.isOk() || comInterface.isNull()) msgCenter().cannotFindHostNetworkInterface(comHost, oldData.m_interface.m_strName, this); else { /* Get network name for further activities: */ const QString strNetworkName = comInterface.GetNetworkName(); /* Show error message if necessary: */ if (!comInterface.isOk()) msgCenter().cannotAcquireHostNetworkInterfaceParameter(comInterface, this); else { /* Get VBox for further activities: */ CVirtualBox comVBox = vboxGlobal().virtualBox(); /* Find corresponding DHCP server (create if necessary): */ CDHCPServer comServer = comVBox.FindDHCPServerByNetworkName(strNetworkName); if (!comVBox.isOk() || comServer.isNull()) comServer = comVBox.CreateDHCPServer(strNetworkName); /* Show error message if necessary: */ if (!comVBox.isOk() || comServer.isNull()) msgCenter().cannotCreateDHCPServer(comVBox, strNetworkName, this); else { /* Save whether DHCP server is enabled: */ if (comServer.isOk()) comServer.SetEnabled(!oldData.m_dhcpserver.m_fEnabled); /* Save default DHCP server configuration if current is invalid: */ if ( comServer.isOk() && !oldData.m_dhcpserver.m_fEnabled && ( oldData.m_dhcpserver.m_strAddress == "0.0.0.0" || oldData.m_dhcpserver.m_strMask == "0.0.0.0" || oldData.m_dhcpserver.m_strLowerAddress == "0.0.0.0" || oldData.m_dhcpserver.m_strUpperAddress == "0.0.0.0")) { const QStringList &proposal = makeDhcpServerProposal(oldData.m_interface.m_strAddress, oldData.m_interface.m_strMask); comServer.SetConfiguration(proposal.at(0), proposal.at(1), proposal.at(2), proposal.at(3)); } /* Show error message if necessary: */ if (!comServer.isOk()) msgCenter().cannotSaveDHCPServerParameter(comServer, this); { /* Update interface in the tree: */ UIDataHostNetwork data; loadHostNetwork(comInterface, data); updateItemForNetworkHost(data, true, pChangedItem); /* Make sure current item fetched: */ sltHandleCurrentItemChange(); /* Adjust tree-widget: */ sltAdjustTreeWidget(); } } } } }
void UIHostNetworkManagerWidget::sltApplyHostNetworkDetailsChanges() { /* Get network item: */ UIItemHostNetwork *pItem = static_cast<UIItemHostNetwork*>(m_pTreeWidget->currentItem()); AssertMsgReturnVoid(pItem, ("Current item must not be null!\n")); /* Get item data: */ UIDataHostNetwork oldData = *pItem; UIDataHostNetwork newData = m_pDetailsWidget->data(); /* Get host for further activities: */ CHost comHost = vboxGlobal().host(); /* Find corresponding interface: */ CHostNetworkInterface comInterface = comHost.FindHostNetworkInterfaceByName(oldData.m_interface.m_strName); /* Show error message if necessary: */ if (!comHost.isOk() || comInterface.isNull()) msgCenter().cannotFindHostNetworkInterface(comHost, oldData.m_interface.m_strName, this); else { /* Save automatic interface configuration: */ if (newData.m_interface.m_fDHCPEnabled) { if ( comInterface.isOk() && !oldData.m_interface.m_fDHCPEnabled) comInterface.EnableDynamicIPConfig(); } /* Save manual interface configuration: */ else { /* Save IPv4 interface configuration: */ if ( comInterface.isOk() && ( oldData.m_interface.m_fDHCPEnabled || newData.m_interface.m_strAddress != oldData.m_interface.m_strAddress || newData.m_interface.m_strMask != oldData.m_interface.m_strMask)) comInterface.EnableStaticIPConfig(newData.m_interface.m_strAddress, newData.m_interface.m_strMask); /* Save IPv6 interface configuration: */ if ( comInterface.isOk() && newData.m_interface.m_fSupportedIPv6 && ( oldData.m_interface.m_fDHCPEnabled || newData.m_interface.m_strAddress6 != oldData.m_interface.m_strAddress6 || newData.m_interface.m_strPrefixLength6 != oldData.m_interface.m_strPrefixLength6)) comInterface.EnableStaticIPConfigV6(newData.m_interface.m_strAddress6, newData.m_interface.m_strPrefixLength6.toULong()); } /* Show error message if necessary: */ if (!comInterface.isOk()) msgCenter().cannotSaveHostNetworkInterfaceParameter(comInterface, this); else { /* Get network name for further activities: */ const QString strNetworkName = comInterface.GetNetworkName(); /* Show error message if necessary: */ if (!comInterface.isOk()) msgCenter().cannotAcquireHostNetworkInterfaceParameter(comInterface, this); else { /* Get VBox for further activities: */ CVirtualBox comVBox = vboxGlobal().virtualBox(); /* Find corresponding DHCP server (create if necessary): */ CDHCPServer comServer = comVBox.FindDHCPServerByNetworkName(strNetworkName); if (!comVBox.isOk() || comServer.isNull()) comServer = comVBox.CreateDHCPServer(strNetworkName); /* Show error message if necessary: */ if (!comVBox.isOk() || comServer.isNull()) msgCenter().cannotCreateDHCPServer(comVBox, strNetworkName, this); else { /* Save whether DHCP server is enabled: */ if ( comServer.isOk() && newData.m_dhcpserver.m_fEnabled != oldData.m_dhcpserver.m_fEnabled) comServer.SetEnabled(newData.m_dhcpserver.m_fEnabled); /* Save DHCP server configuration: */ if ( comServer.isOk() && newData.m_dhcpserver.m_fEnabled && ( newData.m_dhcpserver.m_strAddress != oldData.m_dhcpserver.m_strAddress || newData.m_dhcpserver.m_strMask != oldData.m_dhcpserver.m_strMask || newData.m_dhcpserver.m_strLowerAddress != oldData.m_dhcpserver.m_strLowerAddress || newData.m_dhcpserver.m_strUpperAddress != oldData.m_dhcpserver.m_strUpperAddress)) comServer.SetConfiguration(newData.m_dhcpserver.m_strAddress, newData.m_dhcpserver.m_strMask, newData.m_dhcpserver.m_strLowerAddress, newData.m_dhcpserver.m_strUpperAddress); /* Show error message if necessary: */ if (!comServer.isOk()) msgCenter().cannotSaveDHCPServerParameter(comServer, this); } } } /* Find corresponding interface again (if necessary): */ if (!comInterface.isOk()) { comInterface = comHost.FindHostNetworkInterfaceByName(oldData.m_interface.m_strName); /* Show error message if necessary: */ if (!comHost.isOk() || comInterface.isNull()) msgCenter().cannotFindHostNetworkInterface(comHost, oldData.m_interface.m_strName, this); } /* If interface is Ok now: */ if (comInterface.isNotNull() && comInterface.isOk()) { /* Update interface in the tree: */ UIDataHostNetwork data; loadHostNetwork(comInterface, data); updateItemForNetworkHost(data, true, pItem); /* Make sure current item fetched: */ sltHandleCurrentItemChange(); /* Adjust tree-widget: */ sltAdjustTreeWidget(); } } }
/* Save data from cache to corresponding external object(s), * this task COULD be performed in other than GUI thread: */ void UIGlobalSettingsNetwork::saveFromCacheTo(QVariant &data) { /* Ensure settings were changed: */ if (!m_fChanged) return; /* Fetch data to properties & settings: */ UISettingsPageGlobal::fetchData(data); /* Prepare useful variables: */ CVirtualBox vbox = vboxGlobal().virtualBox(); CHost host = vboxGlobal().host(); /* Update all the host-only interfaces: */ for (int iNetworkIndex = 0; iNetworkIndex < m_cache.m_items.size(); ++iNetworkIndex) { /* Get iterated data: */ const UIHostNetworkData &data = m_cache.m_items[iNetworkIndex]; /* Find corresponding interface: */ CHostNetworkInterface iface = host.FindHostNetworkInterfaceByName(data.m_interface.m_strName); if (!iface.isNull()) { /* Host-only interface configuring: */ if (data.m_interface.m_fDhcpClientEnabled) { iface.EnableDynamicIPConfig(); } else { AssertMsg(data.m_interface.m_strInterfaceAddress.isEmpty() || QHostAddress(data.m_interface.m_strInterfaceAddress).protocol() == QAbstractSocket::IPv4Protocol, ("Interface IPv4 address must be empty or IPv4-valid!\n")); AssertMsg(data.m_interface.m_strInterfaceMask.isEmpty() || QHostAddress(data.m_interface.m_strInterfaceMask).protocol() == QAbstractSocket::IPv4Protocol, ("Interface IPv4 network mask must be empty or IPv4-valid!\n")); iface.EnableStaticIPConfig(data.m_interface.m_strInterfaceAddress, data.m_interface.m_strInterfaceMask); if (iface.GetIPV6Supported()) { AssertMsg(data.m_interface.m_strInterfaceAddress6.isEmpty() || QHostAddress(data.m_interface.m_strInterfaceAddress6).protocol() == QAbstractSocket::IPv6Protocol, ("Interface IPv6 address must be empty or IPv6-valid!\n")); iface.EnableStaticIPConfigV6(data.m_interface.m_strInterfaceAddress6, data.m_interface.m_strInterfaceMaskLength6.toULong()); } } /* Find corresponding DHCP server: */ CDHCPServer dhcp = vbox.FindDHCPServerByNetworkName(iface.GetNetworkName()); if (!dhcp.isNull()) { /* DHCP server configuring: */ dhcp.SetEnabled(data.m_dhcpserver.m_fDhcpServerEnabled); AssertMsg(QHostAddress(data.m_dhcpserver.m_strDhcpServerAddress).protocol() == QAbstractSocket::IPv4Protocol, ("DHCP server IPv4 address must be IPv4-valid!\n")); AssertMsg(QHostAddress(data.m_dhcpserver.m_strDhcpServerMask).protocol() == QAbstractSocket::IPv4Protocol, ("DHCP server IPv4 network mask must be IPv4-valid!\n")); AssertMsg(QHostAddress(data.m_dhcpserver.m_strDhcpLowerAddress).protocol() == QAbstractSocket::IPv4Protocol, ("DHCP server IPv4 lower bound must be IPv4-valid!\n")); AssertMsg(QHostAddress(data.m_dhcpserver.m_strDhcpUpperAddress).protocol() == QAbstractSocket::IPv4Protocol, ("DHCP server IPv4 upper bound must be IPv4-valid!\n")); if (QHostAddress(data.m_dhcpserver.m_strDhcpServerAddress).protocol() == QAbstractSocket::IPv4Protocol && QHostAddress(data.m_dhcpserver.m_strDhcpServerMask).protocol() == QAbstractSocket::IPv4Protocol && QHostAddress(data.m_dhcpserver.m_strDhcpLowerAddress).protocol() == QAbstractSocket::IPv4Protocol && QHostAddress(data.m_dhcpserver.m_strDhcpUpperAddress).protocol() == QAbstractSocket::IPv4Protocol) dhcp.SetConfiguration(data.m_dhcpserver.m_strDhcpServerAddress, data.m_dhcpserver.m_strDhcpServerMask, data.m_dhcpserver.m_strDhcpLowerAddress, data.m_dhcpserver.m_strDhcpUpperAddress); } } } /* Upload properties & settings to data: */ UISettingsPageGlobal::uploadData(data); }