Changeset 35548 in vbox
- Timestamp:
- Jan 13, 2011 4:45:35 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 69432
- 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 257 257 const CHostNetworkInterface &iface = interfaces[iNetworkIndex]; 258 258 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); 283 260 } 284 261 … … 293 270 /* Fetch from cache: */ 294 271 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: */ 301 274 m_pInterfacesTree->setCurrentItem(m_pInterfacesTree->topLevelItem(0)); 302 275 sltUpdateCurrentItem(); … … 307 280 void UIGlobalSettingsNetwork::putToCache() 308 281 { 282 /* Eraze cache: */ 283 m_cache.m_items.clear(); 309 284 /* Upload to cache: */ 310 m_cache.m_items.clear();311 285 for (int iNetworkIndex = 0; iNetworkIndex < m_pInterfacesTree->topLevelItemCount(); ++iNetworkIndex) 312 286 { … … 329 303 UISettingsPageGlobal::fetchData(data); 330 304 331 /* Save from cache: */305 /* Prepare useful variables: */ 332 306 CVirtualBox vbox = vboxGlobal().virtualBox(); 333 307 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) 350 320 { 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(); 359 322 } 360 323 else 361 324 { 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 } 366 339 } 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()) 381 344 { 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: */ 410 346 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")); 419 355 if (QHostAddress(data.m_dhcpserver.m_strDhcpServerAddress).protocol() == QAbstractSocket::IPv4Protocol && 420 356 QHostAddress(data.m_dhcpserver.m_strDhcpServerMask).protocol() == QAbstractSocket::IPv4Protocol && … … 424 360 data.m_dhcpserver.m_strDhcpLowerAddress, data.m_dhcpserver.m_strDhcpUpperAddress); 425 361 } 426 else427 {428 /* Mark the page as failed: */429 setFailed(true);430 /* Show error message: */431 vboxProblem().cannotCreateHostInterface(progress);432 }433 }434 else435 {436 /* Mark the page as failed: */437 setFailed(true);438 /* Show error message: */439 vboxProblem().cannotCreateHostInterface(host);440 362 } 441 363 } … … 487 409 void UIGlobalSettingsNetwork::sltAddInterface() 488 410 { 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); 508 443 } 509 444 … … 519 454 if (vboxProblem().confirmDeletingHostInterface(strInterfaceName, this) == QIMessageBox::Cancel) 520 455 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); 525 487 } 526 488 … … 538 500 details.putBackToItem(); 539 501 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 } 545 506 } 546 507 … … 570 531 menu.addAction(m_pAddAction); 571 532 } 572 573 533 menu.exec(m_pInterfacesTree->mapToGlobal(pos)); 574 534 } 575 535 536 void 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 570 void 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 585 void 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 593 void 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 35 35 QString m_strInterfaceAddress6; 36 36 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 } 37 47 }; 38 48 … … 46 56 QString m_strDhcpLowerAddress; 47 57 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 } 48 66 }; 49 67 … … 53 71 UIHostInterfaceData m_interface; 54 72 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 } 55 78 }; 56 79 … … 161 184 private: 162 185 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 163 192 /* Validator: */ 164 193 QIWidgetValidator *m_pValidator;
Note:
See TracChangeset
for help on using the changeset viewer.