- Timestamp:
- Oct 25, 2023 7:21:57 PM (16 months ago)
- svn:sync-xref-src-repo-rev:
- 159678
- Location:
- trunk/src/VBox/Frontends/VirtualBox/src/settings/machine
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.cpp
r101591 r101594 158 158 159 159 160 /** Machine settings: Network Adapter tab. */161 class UIMachineSettingsNetwork : public UIEditor162 {163 Q_OBJECT;164 165 signals:166 167 /** Notifies about alternative name was changed. */168 void sigAlternativeNameChanged();169 170 /** Notifies about validity changed. */171 void sigValidityChanged();172 173 public:174 175 /** Constructs tab passing @a pParent to the base-class.176 * @param pParentPage Holds the parent page reference allowing to access some of API there. */177 UIMachineSettingsNetwork(UIEditor *pParent, UIMachineSettingsNetworkPage *pParentPage);178 179 /** Loads adapter data from @a adapterCache. */180 void getAdapterDataFromCache(const UISettingsCacheMachineNetworkAdapter &adapterCache);181 /** Saves adapter data to @a adapterCache. */182 void putAdapterDataToCache(UISettingsCacheMachineNetworkAdapter &adapterCache);183 184 /** Performs validation, updates @a messages list if something is wrong. */185 bool validate(QList<UIValidationMessage> &messages);186 187 /** Configures tab order according to passed @a pWidget. */188 QWidget *setOrderAfter(QWidget *pWidget);189 190 /** Returns tab title. */191 QString tabTitle() const;192 /** Returns tab attachment type. */193 KNetworkAttachmentType attachmentType() const;194 /** Returne tab alternative name for @a enmType specified. */195 QString alternativeName(KNetworkAttachmentType enmType = KNetworkAttachmentType_Null) const;196 197 /** Performs tab polishing. */198 void polishTab();199 /** Reloads tab alternatives. */200 void reloadAlternatives();201 202 protected:203 204 /** Handles translation event. */205 void retranslateUi();206 207 private slots:208 209 /** Handles adapter alternative name change. */210 void sltHandleAlternativeNameChange();211 212 private:213 214 /** Prepares all. */215 void prepare();216 /** Prepares widgets. */217 void prepareWidgets();218 /** Prepares connections. */219 void prepareConnections();220 221 /** Holds parent page reference. */222 UIMachineSettingsNetworkPage *m_pParentPage;223 224 /** Holds tab slot number. */225 int m_iSlot;226 227 /** Holds the network settings editor instance. */228 UINetworkSettingsEditor *m_pEditorNetworkSettings;229 };230 231 232 /*********************************************************************************************************************************233 * Class UIMachineSettingsNetwork implementation. *234 *********************************************************************************************************************************/235 236 UIMachineSettingsNetwork::UIMachineSettingsNetwork(UIEditor *pParent, UIMachineSettingsNetworkPage *pParentPage)237 : UIEditor(pParent)238 , m_pParentPage(pParentPage)239 , m_iSlot(-1)240 , m_pEditorNetworkSettings(0)241 {242 prepare();243 }244 245 void UIMachineSettingsNetwork::getAdapterDataFromCache(const UISettingsCacheMachineNetworkAdapter &adapterCache)246 {247 /* Get old data: */248 const UIDataSettingsMachineNetworkAdapter &oldAdapterData = adapterCache.base();249 250 /* Load slot number: */251 m_iSlot = oldAdapterData.m_iSlot;252 253 if (m_pEditorNetworkSettings)254 {255 /* Load adapter activity state: */256 m_pEditorNetworkSettings->setFeatureEnabled(oldAdapterData.m_fAdapterEnabled);257 258 /* Load attachment type: */259 m_pEditorNetworkSettings->setValueType(oldAdapterData.m_attachmentType);260 /* Load alternative names: */261 m_pEditorNetworkSettings->setValueName(KNetworkAttachmentType_Bridged, wipedOutString(oldAdapterData.m_strBridgedAdapterName));262 m_pEditorNetworkSettings->setValueName(KNetworkAttachmentType_Internal, wipedOutString(oldAdapterData.m_strInternalNetworkName));263 m_pEditorNetworkSettings->setValueName(KNetworkAttachmentType_HostOnly, wipedOutString(oldAdapterData.m_strHostInterfaceName));264 m_pEditorNetworkSettings->setValueName(KNetworkAttachmentType_Generic, wipedOutString(oldAdapterData.m_strGenericDriverName));265 m_pEditorNetworkSettings->setValueName(KNetworkAttachmentType_NATNetwork, wipedOutString(oldAdapterData.m_strNATNetworkName));266 #ifdef VBOX_WITH_CLOUD_NET267 m_pEditorNetworkSettings->setValueName(KNetworkAttachmentType_Cloud, wipedOutString(oldAdapterData.m_strCloudNetworkName));268 #endif269 #ifdef VBOX_WITH_VMNET270 m_pEditorNetworkSettings->setValueName(KNetworkAttachmentType_HostOnlyNetwork, wipedOutString(oldAdapterData.m_strHostOnlyNetworkName));271 #endif272 273 /* Load settings: */274 m_pEditorNetworkSettings->setAdapterType(oldAdapterData.m_adapterType);275 m_pEditorNetworkSettings->setPromiscuousMode(oldAdapterData.m_promiscuousMode);276 m_pEditorNetworkSettings->setMACAddress(oldAdapterData.m_strMACAddress);277 m_pEditorNetworkSettings->setGenericProperties(oldAdapterData.m_strGenericProperties);278 m_pEditorNetworkSettings->setCableConnected(oldAdapterData.m_fCableConnected);279 280 /* Load port forwarding rules: */281 UIPortForwardingDataList portForwardingRules;282 for (int i = 0; i < adapterCache.childCount(); ++i)283 portForwardingRules << adapterCache.child(i).base();284 m_pEditorNetworkSettings->setPortForwardingRules(portForwardingRules);285 }286 287 /* Reload alternatives: */288 reloadAlternatives();289 }290 291 void UIMachineSettingsNetwork::putAdapterDataToCache(UISettingsCacheMachineNetworkAdapter &adapterCache)292 {293 /* Prepare new data: */294 UIDataSettingsMachineNetworkAdapter newAdapterData;295 296 /* Save slot number: */297 newAdapterData.m_iSlot = m_iSlot;298 299 if (m_pEditorNetworkSettings)300 {301 /* Save adapter activity state: */302 newAdapterData.m_fAdapterEnabled = m_pEditorNetworkSettings->isFeatureEnabled();303 304 /* Save attachment type & alternative name: */305 newAdapterData.m_attachmentType = attachmentType();306 newAdapterData.m_strBridgedAdapterName = m_pEditorNetworkSettings->valueName(KNetworkAttachmentType_Bridged);307 newAdapterData.m_strInternalNetworkName = m_pEditorNetworkSettings->valueName(KNetworkAttachmentType_Internal);308 newAdapterData.m_strHostInterfaceName = m_pEditorNetworkSettings->valueName(KNetworkAttachmentType_HostOnly);309 newAdapterData.m_strGenericDriverName = m_pEditorNetworkSettings->valueName(KNetworkAttachmentType_Generic);310 newAdapterData.m_strNATNetworkName = m_pEditorNetworkSettings->valueName(KNetworkAttachmentType_NATNetwork);311 #ifdef VBOX_WITH_CLOUD_NET312 newAdapterData.m_strCloudNetworkName = m_pEditorNetworkSettings->valueName(KNetworkAttachmentType_Cloud);313 #endif314 #ifdef VBOX_WITH_VMNET315 newAdapterData.m_strHostOnlyNetworkName = m_pEditorNetworkSettings->valueName(KNetworkAttachmentType_HostOnlyNetwork);316 #endif317 318 /* Save settings: */319 newAdapterData.m_adapterType = m_pEditorNetworkSettings->adapterType();320 newAdapterData.m_promiscuousMode = m_pEditorNetworkSettings->promiscuousMode();321 newAdapterData.m_strMACAddress = m_pEditorNetworkSettings->macAddress();322 newAdapterData.m_strGenericProperties = m_pEditorNetworkSettings->genericProperties();323 newAdapterData.m_fCableConnected = m_pEditorNetworkSettings->cableConnected();324 325 /* Save port forwarding rules: */326 foreach (const UIDataPortForwardingRule &rule, m_pEditorNetworkSettings->portForwardingRules())327 adapterCache.child(rule.name).cacheCurrentData(rule);328 }329 330 /* Cache new data: */331 adapterCache.cacheCurrentData(newAdapterData);332 }333 334 bool UIMachineSettingsNetwork::validate(QList<UIValidationMessage> &messages)335 {336 /* Pass by default: */337 bool fPass = true;338 339 /* Prepare message: */340 UIValidationMessage message;341 message.first = UITranslator::removeAccelMark(tabTitle());342 343 /* Validate enabled adapter only: */344 if ( m_pEditorNetworkSettings345 && m_pEditorNetworkSettings->isFeatureEnabled())346 {347 /* Validate alternatives: */348 switch (attachmentType())349 {350 case KNetworkAttachmentType_Bridged:351 {352 if (alternativeName().isNull())353 {354 message.second << tr("No bridged network adapter is currently selected.");355 fPass = false;356 }357 break;358 }359 case KNetworkAttachmentType_Internal:360 {361 if (alternativeName().isNull())362 {363 message.second << tr("No internal network name is currently specified.");364 fPass = false;365 }366 break;367 }368 #ifndef VBOX_WITH_VMNET369 case KNetworkAttachmentType_HostOnly:370 {371 if (alternativeName().isNull())372 {373 message.second << tr("No host-only network adapter is currently selected.");374 fPass = false;375 }376 break;377 }378 #else /* VBOX_WITH_VMNET */379 case KNetworkAttachmentType_HostOnly:380 {381 message.second << tr("Host-only adapters are no longer supported, use host-only networks instead.");382 fPass = false;383 break;384 }385 #endif /* VBOX_WITH_VMNET */386 case KNetworkAttachmentType_Generic:387 {388 if (alternativeName().isNull())389 {390 message.second << tr("No generic driver is currently selected.");391 fPass = false;392 }393 break;394 }395 case KNetworkAttachmentType_NATNetwork:396 {397 if (alternativeName().isNull())398 {399 message.second << tr("No NAT network name is currently specified.");400 fPass = false;401 }402 break;403 }404 #ifdef VBOX_WITH_CLOUD_NET405 case KNetworkAttachmentType_Cloud:406 {407 if (alternativeName().isNull())408 {409 message.second << tr("No cloud network name is currently specified.");410 fPass = false;411 }412 break;413 }414 #endif /* VBOX_WITH_CLOUD_NET */415 #ifdef VBOX_WITH_VMNET416 case KNetworkAttachmentType_HostOnlyNetwork:417 {418 if (alternativeName().isNull())419 {420 message.second << tr("No host-only network name is currently specified.");421 fPass = false;422 }423 break;424 }425 #endif /* VBOX_WITH_VMNET */426 default:427 break;428 }429 430 /* Validate MAC-address length: */431 if (m_pEditorNetworkSettings->macAddress().size() < 12)432 {433 message.second << tr("The MAC address must be 12 hexadecimal digits long.");434 fPass = false;435 }436 437 /* Make sure MAC-address is unicast: */438 if (m_pEditorNetworkSettings->macAddress().size() >= 2)439 {440 if (m_pEditorNetworkSettings->macAddress().indexOf(QRegularExpression("^[0-9A-Fa-f][02468ACEace]")) != 0)441 {442 message.second << tr("The second digit in the MAC address may not be odd as only unicast addresses are allowed.");443 fPass = false;444 }445 }446 }447 448 /* Serialize message: */449 if (!message.second.isEmpty())450 messages << message;451 452 /* Return result: */453 return fPass;454 }455 456 QWidget *UIMachineSettingsNetwork::setOrderAfter(QWidget *pWidget)457 {458 setTabOrder(pWidget, m_pEditorNetworkSettings);459 return m_pEditorNetworkSettings;460 }461 462 QString UIMachineSettingsNetwork::tabTitle() const463 {464 return UICommon::tr("Adapter %1").arg(QString("&%1").arg(m_iSlot + 1));465 }466 467 KNetworkAttachmentType UIMachineSettingsNetwork::attachmentType() const468 {469 return m_pEditorNetworkSettings ? m_pEditorNetworkSettings->valueType() : KNetworkAttachmentType_Null;470 }471 472 QString UIMachineSettingsNetwork::alternativeName(KNetworkAttachmentType enmType /* = KNetworkAttachmentType_Null */) const473 {474 if (enmType == KNetworkAttachmentType_Null)475 enmType = attachmentType();476 return m_pEditorNetworkSettings ? m_pEditorNetworkSettings->valueName(enmType) : QString();477 }478 479 void UIMachineSettingsNetwork::polishTab()480 {481 if ( m_pEditorNetworkSettings482 && m_pParentPage)483 {484 /* General stuff: */485 m_pEditorNetworkSettings->setFeatureAvailable(m_pParentPage->isMachineOffline());486 487 /* Attachment stuff: */488 m_pEditorNetworkSettings->setAttachmentOptionsAvailable(m_pParentPage->isMachineInValidMode());489 490 /* Advanced stuff: */491 m_pEditorNetworkSettings->setAdapterOptionsAvailable(m_pParentPage->isMachineOffline());492 m_pEditorNetworkSettings->setPromiscuousOptionsAvailable( attachmentType() != KNetworkAttachmentType_Null493 && attachmentType() != KNetworkAttachmentType_Generic494 && attachmentType() != KNetworkAttachmentType_NAT);495 m_pEditorNetworkSettings->setMACOptionsAvailable(m_pParentPage->isMachineOffline());496 m_pEditorNetworkSettings->setGenericPropertiesAvailable(attachmentType() == KNetworkAttachmentType_Generic);497 m_pEditorNetworkSettings->setCableOptionsAvailable(m_pParentPage->isMachineInValidMode());498 m_pEditorNetworkSettings->setForwardingOptionsAvailable(attachmentType() == KNetworkAttachmentType_NAT);499 }500 }501 502 void UIMachineSettingsNetwork::reloadAlternatives()503 {504 if ( m_pEditorNetworkSettings505 && m_pParentPage)506 {507 m_pEditorNetworkSettings->setValueNames(KNetworkAttachmentType_Bridged, m_pParentPage->bridgedAdapterList());508 m_pEditorNetworkSettings->setValueNames(KNetworkAttachmentType_Internal, m_pParentPage->internalNetworkList());509 m_pEditorNetworkSettings->setValueNames(KNetworkAttachmentType_HostOnly, m_pParentPage->hostInterfaceList());510 m_pEditorNetworkSettings->setValueNames(KNetworkAttachmentType_Generic, m_pParentPage->genericDriverList());511 m_pEditorNetworkSettings->setValueNames(KNetworkAttachmentType_NATNetwork, m_pParentPage->natNetworkList());512 #ifdef VBOX_WITH_CLOUD_NET513 m_pEditorNetworkSettings->setValueNames(KNetworkAttachmentType_Cloud, m_pParentPage->cloudNetworkList());514 #endif515 #ifdef VBOX_WITH_VMNET516 m_pEditorNetworkSettings->setValueNames(KNetworkAttachmentType_HostOnlyNetwork, m_pParentPage->hostOnlyNetworkList());517 #endif518 }519 }520 521 void UIMachineSettingsNetwork::retranslateUi()522 {523 /* Reload alternatives: */524 reloadAlternatives();525 }526 527 void UIMachineSettingsNetwork::sltHandleAlternativeNameChange()528 {529 if (m_pEditorNetworkSettings)530 {531 /* Notify other adapter tabs if alternative name for certain type is changed: */532 switch (attachmentType())533 {534 case KNetworkAttachmentType_Internal:535 case KNetworkAttachmentType_Generic:536 {537 if (!m_pEditorNetworkSettings->valueName(attachmentType()).isNull())538 emit sigAlternativeNameChanged();539 break;540 }541 default:542 break;543 }544 }545 546 /* Notify validity changed: */547 emit sigValidityChanged();548 }549 550 void UIMachineSettingsNetwork::prepare()551 {552 /* Prepare everything: */553 prepareWidgets();554 prepareConnections();555 556 /* Apply language settings: */557 retranslateUi();558 }559 560 void UIMachineSettingsNetwork::prepareWidgets()561 {562 /* Prepare main layout: */563 QVBoxLayout *pLayout = new QVBoxLayout(this);564 if (pLayout)565 {566 pLayout->setContentsMargins(0, 0, 0, 0);567 568 /* Prepare settings editor: */569 m_pEditorNetworkSettings = new UINetworkSettingsEditor(this);570 if (m_pEditorNetworkSettings)571 {572 addEditor(m_pEditorNetworkSettings);573 pLayout->addWidget(m_pEditorNetworkSettings);574 }575 576 pLayout->addStretch();577 }578 }579 580 void UIMachineSettingsNetwork::prepareConnections()581 {582 if (m_pEditorNetworkSettings)583 {584 /* Attachment connections: */585 connect(m_pEditorNetworkSettings, &UINetworkSettingsEditor::sigFeatureStateChanged,586 this, &UIMachineSettingsNetwork::sigValidityChanged);587 connect(m_pEditorNetworkSettings, &UINetworkSettingsEditor::sigAttachmentTypeChanged,588 this, &UIMachineSettingsNetwork::sigValidityChanged);589 connect(m_pEditorNetworkSettings, &UINetworkSettingsEditor::sigAlternativeNameChanged,590 this, &UIMachineSettingsNetwork::sltHandleAlternativeNameChange);591 592 /* Advanced connections: */593 connect(m_pEditorNetworkSettings, &UINetworkSettingsEditor::sigMACAddressChanged,594 this, &UIMachineSettingsNetwork::sigValidityChanged);595 }596 }597 598 599 160 /********************************************************************************************************************************* 600 161 * Class UIMachineSettingsNetworkPage implementation. * … … 712 273 return; 713 274 714 /* Setup tab order: */ 715 AssertPtrReturnVoid(firstWidget()); 716 setTabOrder(firstWidget(), m_pTabWidget->focusProxy()); 717 QWidget *pLastFocusWidget = m_pTabWidget->focusProxy(); 718 719 /* For each adapter: */ 275 /* Load old data from cache: */ 720 276 for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot) 721 { 722 /* Get adapter page: */ 723 UIMachineSettingsNetwork *pTab = m_tabEditors.at(iSlot); 724 AssertPtrReturnVoid(pTab); 725 726 /* Load old data from cache: */ 727 pTab->getAdapterDataFromCache(m_pCache->child(iSlot)); 728 729 /* Setup tab order: */ 730 pLastFocusWidget = pTab->setOrderAfter(pLastFocusWidget); 731 } 277 getFromCache(iSlot, m_pCache->child(iSlot)); 732 278 733 279 /* Apply language settings: */ … … 751 297 UIDataSettingsMachineNetwork newNetworkData; 752 298 753 /* For each adapter: */299 /* Gather new data to cache: */ 754 300 for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot) 755 { 756 /* Get adapter page: */ 757 UIMachineSettingsNetwork *pTab = m_tabEditors.at(iSlot); 758 AssertPtrReturnVoid(pTab); 759 760 /* Gather new data: */ 761 pTab->putAdapterDataToCache(m_pCache->child(iSlot)); 762 } 301 putToCache(iSlot, m_pCache->child(iSlot)); 763 302 764 303 /* Cache new data: */ … … 787 326 bool fValid = true; 788 327 789 /* Delegate validation to adapter tabs: */328 /* Delegate validation to particular tab-editor: */ 790 329 for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot) 791 { 792 UIMachineSettingsNetwork *pTab = m_tabEditors.at(iSlot); 793 AssertPtrReturn(pTab, false); 794 if (!pTab->validate(messages)) 330 if (!validate(iSlot, messages)) 795 331 fValid = false; 796 }797 332 798 333 /* Return result: */ … … 808 343 for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot) 809 344 { 810 UIMachineSettingsNetwork *pTab = m_tabEditors.at(iSlot); 811 AssertPtrReturnVoid(pTab); 812 m_pTabWidget->setTabText(iSlot, pTab->tabTitle()); 345 m_pTabWidget->setTabText(iSlot, tabTitle(iSlot)); 346 reloadAlternatives(iSlot); 813 347 } 814 348 } … … 828 362 m_pCache->childCount() > iSlot && 829 363 m_pCache->child(iSlot).base().m_fAdapterEnabled)); 830 UIMachineSettingsNetwork *pTab = m_tabEditors.at(iSlot); 831 AssertPtrReturnVoid(pTab); 832 pTab->polishTab(); 364 polishTab(iSlot); 833 365 } 834 366 } … … 851 383 return; 852 384 853 /* Determine the sender tab : */854 UI MachineSettingsNetwork *pSender = qobject_cast<UIMachineSettingsNetwork*>(sender());385 /* Determine the sender tab-editor: */ 386 UINetworkSettingsEditor *pSender = qobject_cast<UINetworkSettingsEditor*>(sender()); 855 387 AssertPtrReturnVoid(pSender); 856 388 857 /* Enumerate alternatives for certain types: */ 858 switch (pSender->attachmentType()) 859 { 860 case KNetworkAttachmentType_Internal: refreshInternalNetworkList(); break; 861 case KNetworkAttachmentType_Generic: refreshGenericDriverList(); break; 862 default: break; 389 /* Determine the sender slot: */ 390 const int iSenderSlot = m_tabEditors.indexOf(pSender); 391 392 /* Check if we need to update other adapter tabs if 393 * alternative name for certain type is changed: */ 394 bool fUpdateOthers = false; 395 switch (attachmentType(iSenderSlot)) 396 { 397 case KNetworkAttachmentType_Internal: 398 { 399 if (!pSender->valueName(attachmentType(iSenderSlot)).isNull()) 400 { 401 refreshInternalNetworkList(); 402 fUpdateOthers = true; 403 } 404 break; 405 } 406 case KNetworkAttachmentType_Generic: 407 { 408 if (!pSender->valueName(attachmentType(iSenderSlot)).isNull()) 409 { 410 refreshGenericDriverList(); 411 fUpdateOthers = true; 412 } 413 break; 414 } 415 default: 416 break; 863 417 } 864 418 865 419 /* Update alternatives for all the tabs besides the sender: */ 866 for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot) 867 { 868 /* Get the iterated tab: */ 869 UIMachineSettingsNetwork *pTab = m_tabEditors.at(iSlot); 870 AssertPtrReturnVoid(pTab); 871 872 /* Update all the tabs (except sender): */ 873 if (pTab != pSender) 874 pTab->reloadAlternatives(); 875 } 420 if (fUpdateOthers) 421 for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot) 422 if (iSlot != iSenderSlot) 423 reloadAlternatives(iSlot); 424 425 /* Revalidate full page: */ 426 revalidate(); 876 427 } 877 428 … … 932 483 #endif 933 484 934 /* Prepare name and systemeditor: */935 UI MachineSettingsNetwork *pEditor = new UIMachineSettingsNetwork(pTab,this);485 /* Prepare settings editor: */ 486 UINetworkSettingsEditor *pEditor = new UINetworkSettingsEditor(this); 936 487 if (pEditor) 937 488 { … … 950 501 } 951 502 952 void UIMachineSettingsNetworkPage::prepareConnections(UIMachineSettingsNetwork *pTabEditor) 953 { 954 /* Tab connections: */ 955 connect(pTabEditor, &UIMachineSettingsNetwork::sigAlternativeNameChanged, 503 void UIMachineSettingsNetworkPage::prepareConnections(UINetworkSettingsEditor *pTabEditor) 504 { 505 /* Attachment connections: */ 506 connect(pTabEditor, &UINetworkSettingsEditor::sigFeatureStateChanged, 507 this, &UIMachineSettingsNetworkPage::revalidate); 508 connect(pTabEditor, &UINetworkSettingsEditor::sigAttachmentTypeChanged, 509 this, &UIMachineSettingsNetworkPage::revalidate); 510 connect(pTabEditor, &UINetworkSettingsEditor::sigAlternativeNameChanged, 956 511 this, &UIMachineSettingsNetworkPage::sltHandleAlternativeNameChange); 957 connect(pTabEditor, &UIMachineSettingsNetwork::sigValidityChanged, 512 513 /* Advanced connections: */ 514 connect(pTabEditor, &UINetworkSettingsEditor::sigMACAddressChanged, 958 515 this, &UIMachineSettingsNetworkPage::revalidate); 959 516 } … … 964 521 delete m_pCache; 965 522 m_pCache = 0; 523 } 524 525 void UIMachineSettingsNetworkPage::polishTab(int iSlot) 526 { 527 /* Acquire tab-editor: */ 528 UINetworkSettingsEditor *pTabEditor = m_tabEditors.at(iSlot); 529 AssertPtrReturnVoid(pTabEditor); 530 531 /* General stuff: */ 532 pTabEditor->setFeatureAvailable(isMachineOffline()); 533 534 /* Attachment stuff: */ 535 pTabEditor->setAttachmentOptionsAvailable(isMachineInValidMode()); 536 537 /* Advanced stuff: */ 538 pTabEditor->setAdapterOptionsAvailable(isMachineOffline()); 539 pTabEditor->setPromiscuousOptionsAvailable( attachmentType(iSlot) != KNetworkAttachmentType_Null 540 && attachmentType(iSlot) != KNetworkAttachmentType_Generic 541 && attachmentType(iSlot) != KNetworkAttachmentType_NAT); 542 pTabEditor->setMACOptionsAvailable(isMachineOffline()); 543 pTabEditor->setGenericPropertiesAvailable(attachmentType(iSlot) == KNetworkAttachmentType_Generic); 544 pTabEditor->setCableOptionsAvailable(isMachineInValidMode()); 545 pTabEditor->setForwardingOptionsAvailable(attachmentType(iSlot) == KNetworkAttachmentType_NAT); 546 } 547 548 void UIMachineSettingsNetworkPage::getFromCache(int iSlot, const UISettingsCacheMachineNetworkAdapter &adapterCache) 549 { 550 /* Acquire tab-editor: */ 551 UINetworkSettingsEditor *pTabEditor = m_tabEditors.at(iSlot); 552 AssertPtrReturnVoid(pTabEditor); 553 554 /* Get old data: */ 555 const UIDataSettingsMachineNetworkAdapter &oldAdapterData = adapterCache.base(); 556 557 if (pTabEditor) 558 { 559 /* Load adapter activity state: */ 560 pTabEditor->setFeatureEnabled(oldAdapterData.m_fAdapterEnabled); 561 562 /* Load attachment type: */ 563 pTabEditor->setValueType(oldAdapterData.m_attachmentType); 564 /* Load alternative names: */ 565 pTabEditor->setValueName(KNetworkAttachmentType_Bridged, wipedOutString(oldAdapterData.m_strBridgedAdapterName)); 566 pTabEditor->setValueName(KNetworkAttachmentType_Internal, wipedOutString(oldAdapterData.m_strInternalNetworkName)); 567 pTabEditor->setValueName(KNetworkAttachmentType_HostOnly, wipedOutString(oldAdapterData.m_strHostInterfaceName)); 568 pTabEditor->setValueName(KNetworkAttachmentType_Generic, wipedOutString(oldAdapterData.m_strGenericDriverName)); 569 pTabEditor->setValueName(KNetworkAttachmentType_NATNetwork, wipedOutString(oldAdapterData.m_strNATNetworkName)); 570 #ifdef VBOX_WITH_CLOUD_NET 571 pTabEditor->setValueName(KNetworkAttachmentType_Cloud, wipedOutString(oldAdapterData.m_strCloudNetworkName)); 572 #endif 573 #ifdef VBOX_WITH_VMNET 574 pTabEditor->setValueName(KNetworkAttachmentType_HostOnlyNetwork, wipedOutString(oldAdapterData.m_strHostOnlyNetworkName)); 575 #endif 576 577 /* Load settings: */ 578 pTabEditor->setAdapterType(oldAdapterData.m_adapterType); 579 pTabEditor->setPromiscuousMode(oldAdapterData.m_promiscuousMode); 580 pTabEditor->setMACAddress(oldAdapterData.m_strMACAddress); 581 pTabEditor->setGenericProperties(oldAdapterData.m_strGenericProperties); 582 pTabEditor->setCableConnected(oldAdapterData.m_fCableConnected); 583 584 /* Load port forwarding rules: */ 585 UIPortForwardingDataList portForwardingRules; 586 for (int i = 0; i < adapterCache.childCount(); ++i) 587 portForwardingRules << adapterCache.child(i).base(); 588 pTabEditor->setPortForwardingRules(portForwardingRules); 589 } 590 591 /* Reload alternatives: */ 592 reloadAlternatives(iSlot); 593 } 594 595 void UIMachineSettingsNetworkPage::putToCache(int iSlot, UISettingsCacheMachineNetworkAdapter &adapterCache) 596 { 597 /* Acquire tab-editor: */ 598 UINetworkSettingsEditor *pTabEditor = m_tabEditors.at(iSlot); 599 AssertPtrReturnVoid(pTabEditor); 600 601 /* Prepare new data: */ 602 UIDataSettingsMachineNetworkAdapter newAdapterData; 603 604 /* Save slot number: */ 605 newAdapterData.m_iSlot = iSlot; 606 607 if (pTabEditor) 608 { 609 /* Save adapter activity state: */ 610 newAdapterData.m_fAdapterEnabled = pTabEditor->isFeatureEnabled(); 611 612 /* Save attachment type & alternative name: */ 613 newAdapterData.m_attachmentType = attachmentType(iSlot); 614 newAdapterData.m_strBridgedAdapterName = pTabEditor->valueName(KNetworkAttachmentType_Bridged); 615 newAdapterData.m_strInternalNetworkName = pTabEditor->valueName(KNetworkAttachmentType_Internal); 616 newAdapterData.m_strHostInterfaceName = pTabEditor->valueName(KNetworkAttachmentType_HostOnly); 617 newAdapterData.m_strGenericDriverName = pTabEditor->valueName(KNetworkAttachmentType_Generic); 618 newAdapterData.m_strNATNetworkName = pTabEditor->valueName(KNetworkAttachmentType_NATNetwork); 619 #ifdef VBOX_WITH_CLOUD_NET 620 newAdapterData.m_strCloudNetworkName = pTabEditor->valueName(KNetworkAttachmentType_Cloud); 621 #endif 622 #ifdef VBOX_WITH_VMNET 623 newAdapterData.m_strHostOnlyNetworkName = pTabEditor->valueName(KNetworkAttachmentType_HostOnlyNetwork); 624 #endif 625 626 /* Save settings: */ 627 newAdapterData.m_adapterType = pTabEditor->adapterType(); 628 newAdapterData.m_promiscuousMode = pTabEditor->promiscuousMode(); 629 newAdapterData.m_strMACAddress = pTabEditor->macAddress(); 630 newAdapterData.m_strGenericProperties = pTabEditor->genericProperties(); 631 newAdapterData.m_fCableConnected = pTabEditor->cableConnected(); 632 633 /* Save port forwarding rules: */ 634 foreach (const UIDataPortForwardingRule &rule, pTabEditor->portForwardingRules()) 635 adapterCache.child(rule.name).cacheCurrentData(rule); 636 } 637 638 /* Cache new data: */ 639 adapterCache.cacheCurrentData(newAdapterData); 640 } 641 642 void UIMachineSettingsNetworkPage::reloadAlternatives(int iSlot) 643 { 644 /* Acquire tab-editor: */ 645 UINetworkSettingsEditor *pTabEditor = m_tabEditors.at(iSlot); 646 AssertPtrReturnVoid(pTabEditor); 647 648 pTabEditor->setValueNames(KNetworkAttachmentType_Bridged, bridgedAdapterList()); 649 pTabEditor->setValueNames(KNetworkAttachmentType_Internal, internalNetworkList()); 650 pTabEditor->setValueNames(KNetworkAttachmentType_HostOnly, hostInterfaceList()); 651 pTabEditor->setValueNames(KNetworkAttachmentType_Generic, genericDriverList()); 652 pTabEditor->setValueNames(KNetworkAttachmentType_NATNetwork, natNetworkList()); 653 #ifdef VBOX_WITH_CLOUD_NET 654 pTabEditor->setValueNames(KNetworkAttachmentType_Cloud, cloudNetworkList()); 655 #endif 656 #ifdef VBOX_WITH_VMNET 657 pTabEditor->setValueNames(KNetworkAttachmentType_HostOnlyNetwork, hostOnlyNetworkList()); 658 #endif 659 } 660 661 KNetworkAttachmentType UIMachineSettingsNetworkPage::attachmentType(int iSlot) const 662 { 663 /* Acquire tab-editor: */ 664 UINetworkSettingsEditor *pTabEditor = m_tabEditors.at(iSlot); 665 AssertPtrReturn(pTabEditor, KNetworkAttachmentType_Null); 666 return pTabEditor->valueType(); 667 } 668 669 QString UIMachineSettingsNetworkPage::alternativeName(int iSlot, 670 KNetworkAttachmentType enmType /* = KNetworkAttachmentType_Null */) const 671 { 672 /* Acquire tab-editor: */ 673 UINetworkSettingsEditor *pTabEditor = m_tabEditors.at(iSlot); 674 AssertPtrReturn(pTabEditor, QString()); 675 if (enmType == KNetworkAttachmentType_Null) 676 enmType = attachmentType(iSlot); 677 return pTabEditor->valueName(enmType); 678 } 679 680 bool UIMachineSettingsNetworkPage::validate(int iSlot, QList<UIValidationMessage> &messages) 681 { 682 /* Acquire tab-editor: */ 683 UINetworkSettingsEditor *pTabEditor = m_tabEditors.at(iSlot); 684 AssertPtrReturn(pTabEditor, false); 685 686 /* Pass by default: */ 687 bool fPass = true; 688 689 /* Prepare message: */ 690 UIValidationMessage message; 691 message.first = UITranslator::removeAccelMark(tabTitle(iSlot)); 692 693 /* Validate enabled adapter only: */ 694 if ( pTabEditor 695 && pTabEditor->isFeatureEnabled()) 696 { 697 /* Validate alternatives: */ 698 switch (attachmentType(iSlot)) 699 { 700 case KNetworkAttachmentType_Bridged: 701 { 702 if (alternativeName(iSlot).isNull()) 703 { 704 message.second << tr("No bridged network adapter is currently selected."); 705 fPass = false; 706 } 707 break; 708 } 709 case KNetworkAttachmentType_Internal: 710 { 711 if (alternativeName(iSlot).isNull()) 712 { 713 message.second << tr("No internal network name is currently specified."); 714 fPass = false; 715 } 716 break; 717 } 718 #ifndef VBOX_WITH_VMNET 719 case KNetworkAttachmentType_HostOnly: 720 { 721 if (alternativeName(iSlot).isNull()) 722 { 723 message.second << tr("No host-only network adapter is currently selected."); 724 fPass = false; 725 } 726 break; 727 } 728 #else /* VBOX_WITH_VMNET */ 729 case KNetworkAttachmentType_HostOnly: 730 { 731 message.second << tr("Host-only adapters are no longer supported, use host-only networks instead."); 732 fPass = false; 733 break; 734 } 735 #endif /* VBOX_WITH_VMNET */ 736 case KNetworkAttachmentType_Generic: 737 { 738 if (alternativeName(iSlot).isNull()) 739 { 740 message.second << tr("No generic driver is currently selected."); 741 fPass = false; 742 } 743 break; 744 } 745 case KNetworkAttachmentType_NATNetwork: 746 { 747 if (alternativeName(iSlot).isNull()) 748 { 749 message.second << tr("No NAT network name is currently specified."); 750 fPass = false; 751 } 752 break; 753 } 754 #ifdef VBOX_WITH_CLOUD_NET 755 case KNetworkAttachmentType_Cloud: 756 { 757 if (alternativeName(iSlot).isNull()) 758 { 759 message.second << tr("No cloud network name is currently specified."); 760 fPass = false; 761 } 762 break; 763 } 764 #endif /* VBOX_WITH_CLOUD_NET */ 765 #ifdef VBOX_WITH_VMNET 766 case KNetworkAttachmentType_HostOnlyNetwork: 767 { 768 if (alternativeName(iSlot).isNull()) 769 { 770 message.second << tr("No host-only network name is currently specified."); 771 fPass = false; 772 } 773 break; 774 } 775 #endif /* VBOX_WITH_VMNET */ 776 default: 777 break; 778 } 779 780 /* Validate MAC-address length: */ 781 if (pTabEditor->macAddress().size() < 12) 782 { 783 message.second << tr("The MAC address must be 12 hexadecimal digits long."); 784 fPass = false; 785 } 786 787 /* Make sure MAC-address is unicast: */ 788 if (pTabEditor->macAddress().size() >= 2) 789 { 790 if (pTabEditor->macAddress().indexOf(QRegularExpression("^[0-9A-Fa-f][02468ACEace]")) != 0) 791 { 792 message.second << tr("The second digit in the MAC address may not be odd as only unicast addresses are allowed."); 793 fPass = false; 794 } 795 } 796 } 797 798 /* Serialize message: */ 799 if (!message.second.isEmpty()) 800 messages << message; 801 802 /* Return result: */ 803 return fPass; 966 804 } 967 805 … … 987 825 for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot) 988 826 { 989 UIMachineSettingsNetwork *pTab = m_tabEditors.at(iSlot); 990 AssertPtrReturnVoid(pTab); 991 const QString strName = pTab->alternativeName(KNetworkAttachmentType_Internal); 827 const QString strName = alternativeName(iSlot, KNetworkAttachmentType_Internal); 992 828 if (!strName.isEmpty() && !m_internalNetworkList.contains(strName)) 993 829 m_internalNetworkList << strName; … … 1032 868 for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot) 1033 869 { 1034 UIMachineSettingsNetwork *pTab = m_tabEditors.at(iSlot); 1035 AssertPtrReturnVoid(pTab); 1036 const QString strName = pTab->alternativeName(KNetworkAttachmentType_Generic); 870 const QString strName = alternativeName(iSlot, KNetworkAttachmentType_Generic); 1037 871 if (!strName.isEmpty() && !m_genericDriverList.contains(strName)) 1038 872 m_genericDriverList << strName; … … 1044 878 /* Reload nat networks: */ 1045 879 m_natNetworkList = UINetworkAttachmentEditor::natNetworks(); 880 } 881 882 /* static */ 883 QString UIMachineSettingsNetworkPage::tabTitle(int iSlot) 884 { 885 return UICommon::tr("Adapter %1").arg(QString("&%1").arg(iSlot + 1)); 1046 886 } 1047 887 … … 1332 1172 return fSuccess; 1333 1173 } 1334 1335 # include "UIMachineSettingsNetwork.moc" -
trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.h
r101591 r101594 38 38 /* Forward declarations: */ 39 39 class QITabWidget; 40 class UI MachineSettingsNetwork;40 class UINetworkSettingsEditor; 41 41 struct UIDataSettingsMachineNetwork; 42 42 struct UIDataSettingsMachineNetworkAdapter; … … 123 123 void prepareTab(); 124 124 /** Prepares connections. */ 125 void prepareConnections(UI MachineSettingsNetwork*pTabEditor);125 void prepareConnections(UINetworkSettingsEditor *pTabEditor); 126 126 /** Cleanups all. */ 127 127 void cleanup(); 128 129 /** Performs tab polishing for specified @a iSlot. */ 130 void polishTab(int iSlot); 131 132 /** Loads adapter data for specified @a iSlot from @a adapterCache to corresponding widgets. */ 133 void getFromCache(int iSlot, const UISettingsCacheMachineNetworkAdapter &adapterCache); 134 /** Saves adapter data for specified @a iSlot from corresponding widgets to @a adapterCache. */ 135 void putToCache(int iSlot, UISettingsCacheMachineNetworkAdapter &adapterCache); 136 137 /** Reloads tab alternatives for specified @a iSlot. */ 138 void reloadAlternatives(int iSlot); 139 140 /** Returns tab attachment type for specified @a iSlot. */ 141 KNetworkAttachmentType attachmentType(int iSlot) const; 142 /** Returne tab alternative name for specified @a iSlot and @a enmType. */ 143 QString alternativeName(int iSlot, KNetworkAttachmentType enmType = KNetworkAttachmentType_Null) const; 144 145 /** Performs validation for specified @a iSlot, updates @a messages list if something is wrong. */ 146 bool validate(int iSlot, QList<UIValidationMessage> &messages); 128 147 129 148 /** Repopulates bridged adapter list. */ … … 145 164 void refreshHostOnlyNetworkList(); 146 165 #endif 166 167 /** Returns tab title for specified @a iSlot. */ 168 static QString tabTitle(int iSlot); 147 169 148 170 /** Loads generic properties from passed @a adapter. */ … … 185 207 QITabWidget *m_pTabWidget; 186 208 187 /** Holds the list of tab 188 QList<UI MachineSettingsNetwork*> m_tabEditors;209 /** Holds the list of tab-editors. */ 210 QList<UINetworkSettingsEditor*> m_tabEditors; 189 211 }; 190 212
Note:
See TracChangeset
for help on using the changeset viewer.