Changeset 47401 in vbox
- Timestamp:
- Jul 25, 2013 7:12:24 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 26 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/settings.h
r47018 r47401 447 447 { 448 448 USBController() 449 : fEnabled(false), 450 fEnabledEHCI(false) 449 : enmType(USBControllerType_Null) 451 450 {} 452 451 453 452 bool operator==(const USBController &u) const; 454 453 455 bool fEnabled; 456 bool fEnabledEHCI; 454 com::Utf8Str strName; 455 USBControllerType_T enmType; 456 }; 457 typedef std::list<USBController> USBControllerList; 458 459 struct USB 460 { 461 USB() {} 462 463 bool operator==(const USB &u) const; 464 465 /** List of USB controllers present. */ 466 USBControllerList llUSBControllers; 467 /** List of USB device filters. */ 457 468 USBDeviceFiltersList llDeviceFilters; 458 469 }; … … 876 887 877 888 BIOSSettings biosSettings; 878 USB Controller usbController;889 USB usbSettings; 879 890 NetworkAdaptersList llNetworkAdapters; 880 891 SerialPortsList llSerialPorts; -
trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
r47376 r47401 1749 1749 * USB. 1750 1750 */ 1751 ComPtr<IUSBController> USBCtl;1752 rc = machine->COMGETTER(USBController )(USBCtl.asOutParam());1751 SafeIfaceArray<IUSBController> USBCtlColl; 1752 rc = machine->COMGETTER(USBControllers)(ComSafeArrayAsOutParam(USBCtlColl)); 1753 1753 if (SUCCEEDED(rc)) 1754 1754 { 1755 BOOL fEnabled; 1756 BOOL fEHCIEnabled; 1757 rc = USBCtl->COMGETTER(Enabled)(&fEnabled); 1758 if (FAILED(rc)) 1759 fEnabled = false; 1755 bool fOhciEnabled = false; 1756 bool fEhciEnabled = false; 1757 1758 for (unsigned i = 0; i < USBCtlColl.size(); i++) 1759 { 1760 USBControllerType_T enmType; 1761 1762 rc = USBCtlColl[i]->COMGETTER(Type)(&enmType); 1763 if (SUCCEEDED(rc)) 1764 { 1765 switch (enmType) 1766 { 1767 case USBControllerType_OHCI: 1768 fOhciEnabled = true; 1769 break; 1770 case USBControllerType_EHCI: 1771 fEhciEnabled = true; 1772 break; 1773 default: 1774 break; 1775 } 1776 } 1777 } 1778 1760 1779 if (details == VMINFO_MACHINEREADABLE) 1761 RTPrintf("usb=\"%s\"\n", f Enabled ? "on" : "off");1780 RTPrintf("usb=\"%s\"\n", fOhciEnabled ? "on" : "off"); 1762 1781 else 1763 RTPrintf("USB: %s\n", fEnabled ? "enabled" : "disabled"); 1764 1765 rc = USBCtl->COMGETTER(EnabledEHCI)(&fEHCIEnabled); 1766 if (FAILED(rc)) 1767 fEHCIEnabled = false; 1782 RTPrintf("USB: %s\n", fOhciEnabled ? "enabled" : "disabled"); 1783 1768 1784 if (details == VMINFO_MACHINEREADABLE) 1769 RTPrintf("ehci=\"%s\"\n", fE HCIEnabled ? "on" : "off");1785 RTPrintf("ehci=\"%s\"\n", fEhciEnabled ? "on" : "off"); 1770 1786 else 1771 RTPrintf("EHCI: %s\n", fE HCIEnabled ? "enabled" : "disabled");1787 RTPrintf("EHCI: %s\n", fEhciEnabled ? "enabled" : "disabled"); 1772 1788 } 1773 1789 -
trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp
r47246 r47401 1772 1772 { 1773 1773 /* Make sure the OHCI controller is enabled. */ 1774 ComPtr<IUSBController> UsbCtl; 1775 rc = machine->COMGETTER(USBController)(UsbCtl.asOutParam()); 1776 if (SUCCEEDED(rc)) 1774 ULONG cOhciCtrls = 0; 1775 rc = machine->COMGETTER(USBControllerCountByType)(USBControllerType_OHCI, &cOhciCtrls); 1776 if ( SUCCEEDED(rc) 1777 && !cOhciCtrls) 1777 1778 { 1778 BOOL fEnabled; 1779 rc = UsbCtl->COMGETTER(Enabled)(&fEnabled); 1780 if (FAILED(rc)) 1781 fEnabled = false; 1782 if (!fEnabled) 1783 CHECK_ERROR(UsbCtl, COMSETTER(Enabled)(true)); 1779 ComPtr<IUSBController> UsbCtl; 1780 CHECK_ERROR(machine, AddUSBController(Bstr("OHCI").raw(), USBControllerType_OHCI, 1781 UsbCtl.asOutParam())); 1784 1782 } 1785 1783 } … … 1808 1806 { 1809 1807 /* Make sure the OHCI controller is enabled. */ 1810 ComPtr<IUSBController> UsbCtl; 1811 rc = machine->COMGETTER(USBController)(UsbCtl.asOutParam()); 1812 if (SUCCEEDED(rc)) 1808 ULONG cOhciCtrls = 0; 1809 rc = machine->COMGETTER(USBControllerCountByType)(USBControllerType_OHCI, &cOhciCtrls); 1810 if ( SUCCEEDED(rc) 1811 && !cOhciCtrls) 1813 1812 { 1814 BOOL fEnabled; 1815 rc = UsbCtl->COMGETTER(Enabled)(&fEnabled); 1816 if (FAILED(rc)) 1817 fEnabled = false; 1818 if (!fEnabled) 1819 CHECK_ERROR(UsbCtl, COMSETTER(Enabled)(true)); 1813 ComPtr<IUSBController> UsbCtl; 1814 CHECK_ERROR(machine, AddUSBController(Bstr("OHCI").raw(), USBControllerType_OHCI, 1815 UsbCtl.asOutParam())); 1820 1816 } 1821 1817 } … … 2311 2307 case MODIFYVM_USBEHCI: 2312 2308 { 2313 ComPtr<IUSBController> UsbCtl;2314 CHECK_ERROR(machine, COMGETTER(USBController)(UsbCtl.asOutParam()));2309 ULONG cEhciCtrls = 0; 2310 rc = machine->COMGETTER(USBControllerCountByType)(USBControllerType_EHCI, &cEhciCtrls); 2315 2311 if (SUCCEEDED(rc)) 2316 CHECK_ERROR(UsbCtl, COMSETTER(EnabledEHCI)(ValueUnion.f)); 2312 { 2313 if (!cEhciCtrls && ValueUnion.f) 2314 { 2315 ComPtr<IUSBController> UsbCtl; 2316 CHECK_ERROR(machine, AddUSBController(Bstr("EHCI").raw(), USBControllerType_EHCI, 2317 UsbCtl.asOutParam())); 2318 } 2319 else if (cEhciCtrls && !ValueUnion.f) 2320 CHECK_ERROR(machine, RemoveUSBController(Bstr("EHCI").raw())); 2321 } 2317 2322 break; 2318 2323 } … … 2320 2325 case MODIFYVM_USB: 2321 2326 { 2322 ComPtr<IUSBController> UsbCtl;2323 CHECK_ERROR(machine, COMGETTER(USBController)(UsbCtl.asOutParam()));2327 ULONG cOhciCtrls = 0; 2328 rc = machine->COMGETTER(USBControllerCountByType)(USBControllerType_OHCI, &cOhciCtrls); 2324 2329 if (SUCCEEDED(rc)) 2325 CHECK_ERROR(UsbCtl, COMSETTER(Enabled)(ValueUnion.f)); 2330 { 2331 if (!cOhciCtrls && ValueUnion.f) 2332 { 2333 ComPtr<IUSBController> UsbCtl; 2334 CHECK_ERROR(machine, AddUSBController(Bstr("OHCI").raw(), USBControllerType_OHCI, 2335 UsbCtl.asOutParam())); 2336 } 2337 else if (cOhciCtrls && !ValueUnion.f) 2338 CHECK_ERROR(machine, RemoveUSBController(Bstr("OHCI").raw())); 2339 } 2326 2340 break; 2327 2341 } -
trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp
r47376 r47401 1512 1512 QString item; 1513 1513 1514 CUSBController ctl = aMachine.GetUSBController();1515 1514 CUSBDeviceFilters flts = aMachine.GetUSBDeviceFilters(); 1516 if ( !ctl.isNull() 1517 && !flts.isNull() 1518 && ctl.GetProxyAvailable()) 1515 if ( !flts.isNull() 1516 && aMachine.GetUSBProxyAvailable()) 1519 1517 { 1520 1518 /* the USB controller may be unavailable (i.e. in VirtualBox OSE) */ 1521 1519 1522 if (ctl.GetEnabled()) 1520 ULONG cOhciCtls = aMachine.GetUSBControllerCountByType(KUSBControllerType_OHCI); 1521 1522 if (cOhciCtls) 1523 1523 { 1524 1524 CUSBDeviceFilterVector coll = flts.GetDeviceFilters(); -
trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.cpp
r47149 r47401 39 39 #include "CNetworkAdapter.h" 40 40 #include "CUSBController.h" 41 #include "CUSBDeviceFilters.h" 41 42 #include "CUSBDevice.h" 42 43 #include "CSharedFolder.h" … … 388 389 QString strFullData; 389 390 390 const CUSBController &usbctl = machine.GetUSBController(); 391 setState(!usbctl.isNull() && usbctl.GetEnabled() && usbctl.GetProxyAvailable() ? KDeviceActivity_Idle : KDeviceActivity_Null); 392 if (!usbctl.isNull() && usbctl.GetEnabled()) 391 392 /* 393 * Check whether there is at least one OHCI USB controllers with 394 * an available proxy. 395 */ 396 const CUSBDeviceFilters &filters = machine.GetUSBDeviceFilters(); 397 ULONG cOhciCtls = machine.GetUSBControllerCountByType(KUSBControllerType_OHCI); 398 bool fUSBEnabled = !filters.isNull() && cOhciCtls && machine.GetUSBProxyAvailable(); 399 400 setState(fUSBEnabled ? KDeviceActivity_Idle : KDeviceActivity_Null); 401 if (fUSBEnabled) 393 402 { 394 403 const CConsole &console = m_session.GetConsole(); -
trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp
r47396 r47401 68 68 #include "CVRDEServer.h" 69 69 #include "CUSBController.h" 70 #include "CUSBDeviceFilters.h" 70 71 #include "CSnapshot.h" 71 72 … … 1296 1297 /* USB stuff: */ 1297 1298 { 1298 /* Get USB controller: */ 1299 const CUSBController &usbController = machine.GetUSBController(); 1300 bool fUSBControllerEnabled = !usbController.isNull() && usbController.GetEnabled() && usbController.GetProxyAvailable(); 1299 /* 1300 * Check whether there is at least one OHCI USB controllers with 1301 * an available proxy. 1302 */ 1303 const CUSBDeviceFilters &filters = machine.GetUSBDeviceFilters(); 1304 ULONG cOhciCtls = machine.GetUSBControllerCountByType(KUSBControllerType_OHCI); 1305 bool fUSBEnabled = !filters.isNull() && cOhciCtls && machine.GetUSBProxyAvailable(); 1306 1301 1307 /* Show/Hide USB menu depending on controller availability, activity and USB-proxy presence: */ 1302 gActionPool->action(UIActionIndexRuntime_Menu_USBDevices)->setVisible(fUSB ControllerEnabled);1308 gActionPool->action(UIActionIndexRuntime_Menu_USBDevices)->setVisible(fUSBEnabled); 1303 1309 } 1304 1310 } -
trunk/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp
r46831 r47401 47 47 #include "CMediumAttachment.h" 48 48 #include "CUSBController.h" 49 #include "CUSBDeviceFilters.h" 49 50 50 51 UIMachineWindowNormal::UIMachineWindowNormal(UIMachineLogic *pMachineLogic, ulong uScreenId) … … 488 489 if (indicatorsPool()->indicator(IndicatorType_USB)) 489 490 { 490 const CUSBController &usbController = m.GetUSBController(); 491 if ( usbController.isNull() 492 || !usbController.GetEnabled() 493 || !usbController.GetProxyAvailable()) 491 const CUSBDeviceFilters &filters = m.GetUSBDeviceFilters(); 492 ULONG cOhciCtls = m.GetUSBControllerCountByType(KUSBControllerType_OHCI); 493 bool fUSBEnabled = !filters.isNull() && cOhciCtls && m.GetUSBProxyAvailable(); 494 495 if (!fUSBEnabled) 494 496 { 495 497 /* Hide USB menu: */ … … 499 501 { 500 502 /* Toggle USB LED: */ 501 indicatorsPool()->indicator(IndicatorType_USB)->setState( 502 usbController.GetEnabled() ? KDeviceActivity_Idle : KDeviceActivity_Null); 503 indicatorsPool()->indicator(IndicatorType_USB)->setState(KDeviceActivity_Idle); 503 504 } 504 505 } -
trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.cpp
r47376 r47401 889 889 { 890 890 /* Iterate over all the USB filters: */ 891 const CUSB Controller &ctl = machine().GetUSBController();892 if (! ctl.isNull() && ctl.GetProxyAvailable())891 const CUSBDeviceFilters &filters = machine().GetUSBDeviceFilters(); 892 if (!filters.isNull() && machine().GetUSBProxyAvailable()) 893 893 { 894 894 const CUSBDeviceFilters &flts = machine().GetUSBDeviceFilters(); 895 if (!flts.isNull() && ctl.GetEnabled())895 if (!flts.isNull() && machine().GetUSBControllerCountByType(KUSBControllerType_OHCI)) 896 896 { 897 897 const CUSBDeviceFilterVector &coll = flts.GetDeviceFilters(); -
trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsSet.cpp
r45287 r47401 29 29 /* COM includes: */ 30 30 #include "CUSBController.h" 31 #include "CUSBDeviceFilters.h" 31 32 32 33 UIGDetailsSet::UIGDetailsSet(UIGDetailsItem *pParent) … … 96 97 97 98 /* Fetch USB controller restrictions: */ 98 const CUSB Controller &ctl = m_machine.GetUSBController();99 if ( ctl.isNull() || !ctl.GetProxyAvailable())99 const CUSBDeviceFilters &filters = m_machine.GetUSBDeviceFilters(); 100 if (filters.isNull() || !m_machine.GetUSBProxyAvailable()) 100 101 { 101 102 QString strElementTypeOpened = gpConverter->toInternalString(DetailsElementType_USB); -
trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp
r47263 r47401 858 858 if (pSystemPage && pSystemPage->isHIDEnabled()) 859 859 { 860 CUSBController controller = m_machine.GetUSBController();861 if (!c ontroller.isNull())862 controller.SetEnabled(true);860 ULONG cOhciCtls = m_machine.GetUSBControllerCountByType(KUSBControllerType_OHCI); 861 if (!cOhciCtls) 862 m_machine.AddUSBController("OHCI", KUSBControllerType_OHCI); 863 863 } 864 864 … … 1124 1124 if (!isPageAvailable(MachineSettingsPageType_Ports)) 1125 1125 return false; 1126 /* Check if USB is implemented: */ 1127 if (!m_machine.GetUSBProxyAvailable()) 1128 return false; 1126 1129 /* Get the USB controller object: */ 1127 CUSBController controller = m_machine.GetUSBController();1130 CUSBControllerVector controllerColl = m_machine.GetUSBControllers(); 1128 1131 /* Show the machine error message if any: */ 1129 if (!m_machine.isReallyOk() && !controller.isNull() && controller.GetEnabled()) 1132 if ( !m_machine.isReallyOk() 1133 && controllerColl.size() > 0 1134 && m_machine.GetUSBControllerCountByType(KUSBControllerType_OHCI)) 1130 1135 msgCenter().warnAboutUnaccessibleUSB(m_machine, parentWidget()); 1131 /* Check if USB is implemented: */1132 if (controller.isNull() || !controller.GetProxyAvailable())1133 return false;1134 1136 break; 1135 1137 } -
trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.cpp
r47376 r47401 294 294 295 295 /* Check if controller is valid: */ 296 const CUSB Controller &controller = m_machine.GetUSBController();297 if (! controller.isNull())296 const CUSBDeviceFilters &filters = m_machine.GetUSBDeviceFilters(); 297 if (!filters.isNull()) 298 298 { 299 299 /* Gather USB values: */ 300 usbData.m_fUSBEnabled = controller.GetEnabled();301 usbData.m_fEHCIEnabled = controller.GetEnabledEHCI();300 usbData.m_fUSBEnabled = m_machine.GetUSBControllerCountByType(KUSBControllerType_OHCI) > 0; 301 usbData.m_fEHCIEnabled = m_machine.GetUSBControllerCountByType(KUSBControllerType_EHCI) > 0; 302 302 303 303 /* For each USB filter: */ 304 const CUSBDeviceFilter s &filters = m_machine.GetUSBDeviceFilters();305 if (!filters.isNull())304 const CUSBDeviceFilterVector &coll = filters.GetDeviceFilters(); 305 for (int iFilterIndex = 0; iFilterIndex < coll.size(); ++iFilterIndex) 306 306 { 307 const CUSBDeviceFilterVector &coll = filters.GetDeviceFilters(); 308 for (int iFilterIndex = 0; iFilterIndex < coll.size(); ++iFilterIndex) 307 /* Prepare USB filter data: */ 308 UIDataSettingsMachineUSBFilter usbFilterData; 309 310 /* Check if filter is valid: */ 311 const CUSBDeviceFilter &filter = coll[iFilterIndex]; 312 if (!filter.isNull()) 309 313 { 310 /* Prepare USB filter data: */ 311 UIDataSettingsMachineUSBFilter usbFilterData; 312 313 /* Check if filter is valid: */ 314 const CUSBDeviceFilter &filter = coll[iFilterIndex]; 315 if (!filter.isNull()) 316 { 317 usbFilterData.m_fActive = filter.GetActive(); 318 usbFilterData.m_strName = filter.GetName(); 319 usbFilterData.m_strVendorId = filter.GetVendorId(); 320 usbFilterData.m_strProductId = filter.GetProductId(); 321 usbFilterData.m_strRevision = filter.GetRevision(); 322 usbFilterData.m_strManufacturer = filter.GetManufacturer(); 323 usbFilterData.m_strProduct = filter.GetProduct(); 324 usbFilterData.m_strSerialNumber = filter.GetSerialNumber(); 325 usbFilterData.m_strPort = filter.GetPort(); 326 usbFilterData.m_strRemote = filter.GetRemote(); 327 } 328 329 /* Cache USB filter data: */ 330 m_cache.child(iFilterIndex).cacheInitialData(usbFilterData); 314 usbFilterData.m_fActive = filter.GetActive(); 315 usbFilterData.m_strName = filter.GetName(); 316 usbFilterData.m_strVendorId = filter.GetVendorId(); 317 usbFilterData.m_strProductId = filter.GetProductId(); 318 usbFilterData.m_strRevision = filter.GetRevision(); 319 usbFilterData.m_strManufacturer = filter.GetManufacturer(); 320 usbFilterData.m_strProduct = filter.GetProduct(); 321 usbFilterData.m_strSerialNumber = filter.GetSerialNumber(); 322 usbFilterData.m_strPort = filter.GetPort(); 323 usbFilterData.m_strRemote = filter.GetRemote(); 331 324 } 325 326 /* Cache USB filter data: */ 327 m_cache.child(iFilterIndex).cacheInitialData(usbFilterData); 332 328 } 333 329 } … … 491 487 { 492 488 /* Check if controller is valid: */ 493 CUSB Controller controller = m_machine.GetUSBController();494 if (! controller.isNull())489 CUSBDeviceFilters filters = m_machine.GetUSBDeviceFilters(); 490 if (!filters.isNull()) 495 491 { 496 492 /* Get USB data from cache: */ 497 CUSBDeviceFilters filters = m_machine.GetUSBDeviceFilters(); 493 498 494 const UIDataSettingsMachineUSB &usbData = m_cache.data(); 499 495 /* Store USB data: */ 500 496 if (isMachineOffline()) 501 497 { 502 controller.SetEnabled(usbData.m_fUSBEnabled); 503 controller.SetEnabledEHCI(usbData.m_fEHCIEnabled); 498 ULONG cOhciCtls = m_machine.GetUSBControllerCountByType(KUSBControllerType_OHCI); 499 ULONG cEhciCtls = m_machine.GetUSBControllerCountByType(KUSBControllerType_EHCI); 500 501 if (!cOhciCtls && usbData.m_fUSBEnabled) 502 m_machine.AddUSBController("OHCI", KUSBControllerType_OHCI); 503 else if (cOhciCtls && !usbData.m_fUSBEnabled) 504 m_machine.RemoveUSBController("OHCI"); 505 506 if (!cEhciCtls && usbData.m_fEHCIEnabled) 507 m_machine.AddUSBController("EHCI", KUSBControllerType_EHCI); 508 else if (cEhciCtls && !usbData.m_fEHCIEnabled) 509 m_machine.RemoveUSBController("EHCI"); 504 510 } 505 511 /* Store USB filters data: */ 506 if ( isMachineInValidMode() 507 && !filters.isNull()) 512 if (isMachineInValidMode()) 508 513 { 509 514 /* For each USB filter data set: */ -
trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVM.cpp
r45316 r47401 30 30 #include "CAudioAdapter.h" 31 31 #include "CUSBController.h" 32 #include "CUSBDeviceFilters.h" 32 33 #include "CExtPackManager.h" 33 34 #include "CStorageController.h" … … 94 95 95 96 /* Enable the OHCI and EHCI controller by default for new VMs. (new in 2.2): */ 96 CUSBController usbController = m_machine.GetUSBController(); 97 if (!usbController.isNull() && type.GetRecommendedUSB() && usbController.GetProxyAvailable()) 98 { 99 usbController.SetEnabled(true); 97 CUSBDeviceFilters usbDeviceFilters = m_machine.GetUSBDeviceFilters(); 98 bool fOhciEnabled = false; 99 if (!usbDeviceFilters.isNull() && type.GetRecommendedUSB() && m_machine.GetUSBProxyAvailable()) 100 { 101 m_machine.AddUSBController("OHCI", KUSBControllerType_OHCI); 102 fOhciEnabled = true; 100 103 /* USB 2.0 is only available if the proper ExtPack is installed. 101 104 * Note. Configuring EHCI here and providing messages about … … 105 108 CExtPackManager manager = vboxGlobal().virtualBox().GetExtensionPackManager(); 106 109 if (manager.IsExtPackUsable(GUI_ExtPackName)) 107 usbController.SetEnabledEHCI(true);110 m_machine.AddUSBController("EHCI", KUSBControllerType_EHCI); 108 111 } 109 112 … … 162 165 m_machine.SetKeyboardHIDType(KKeyboardHIDType_USBKeyboard); 163 166 m_machine.SetPointingHIDType(KPointingHIDType_USBMouse); 164 if (! usbController.isNull())165 usbController.SetEnabled(true);167 if (!fOhciEnabled && !usbDeviceFilters.isNull()) 168 m_machine.AddUSBController("OHCI", KUSBControllerType_OHCI); 166 169 } 167 170 … … 169 172 { 170 173 m_machine.SetPointingHIDType(KPointingHIDType_USBTablet); 171 if (! usbController.isNull())172 usbController.SetEnabled(true);174 if (!fOhciEnabled && !usbDeviceFilters.isNull()) 175 m_machine.AddUSBController("OHCI", KUSBControllerType_OHCI); 173 176 } 174 177 -
trunk/src/VBox/Main/idl/VirtualBox.xidl
r47393 r47401 545 545 <desc>Settings version "1.14", written by VirtualBox 4.3.x.</desc> 546 546 <!-- 547 Machine changes: default frontend .547 Machine changes: default frontend, USB rework. 548 548 --> 549 549 </const> … … 4127 4127 <interface 4128 4128 name="IMachine" extends="$unknown" 4129 uuid=" 00daa773-1d35-40ae-ac06-336aa64959ef"4129 uuid="b6057c6f-2176-4820-a8d6-cb6687ed1583" 4130 4130 wsmap="managed" 4131 4131 > … … 4524 4524 </attribute> 4525 4525 4526 <attribute name="USBController " type="IUSBController" readonly="yes">4527 <desc> 4528 A ssociated USB controller object.4526 <attribute name="USBControllers" type="IUSBController" readonly="yes" safearray="yes"> 4527 <desc> 4528 Array of USB controllers attached to this machine. 4529 4529 4530 4530 <note> … … 4909 4909 </attribute> 4910 4910 4911 <attribute name="USBProxyAvailable" type="boolean" readonly="yes"> 4912 <desc> 4913 Returns whether there is an USB proxy available. 4914 </desc> 4915 </attribute> 4916 4911 4917 <method name="lockMachine"> 4912 4918 <desc> … … 5947 5953 <param name="name" type="wstring" dir="in"/> 5948 5954 <param name="bootable" type="boolean" dir="in"/> 5955 </method> 5956 5957 <method name="addUSBController"> 5958 <desc> 5959 Adds a new USB controller to the machine and returns it as an instance of 5960 <link to="IUSBController" />. 5961 5962 <result name="VBOX_E_OBJECT_IN_USE"> 5963 A USB controller with given type exists already. 5964 </result> 5965 <result name="E_INVALIDARG"> 5966 Invalid @a controllerType. 5967 </result> 5968 </desc> 5969 <param name="name" type="wstring" dir="in"/> 5970 <param name="type" type="USBControllerType" dir="in"/> 5971 <param name="controller" type="IUSBController" dir="return"/> 5972 </method> 5973 5974 <method name="removeUSBController"> 5975 <desc> 5976 Removes a USB controller from the machine. 5977 5978 <result name="VBOX_E_OBJECT_NOT_FOUND"> 5979 A USB controller with given type doesn't exist. 5980 </result> 5981 </desc> 5982 <param name="name" type="wstring" dir="in"/> 5983 </method> 5984 5985 <method name="getUSBControllerByName" const="yes"> 5986 <desc> 5987 Returns a USB controller with the given type. 5988 5989 <result name="VBOX_E_OBJECT_NOT_FOUND"> 5990 A USB controller with given name doesn't exist. 5991 </result> 5992 </desc> 5993 <param name="name" type="wstring" dir="in"/> 5994 <param name="controller" type="IUSBController" dir="return"/> 5995 </method> 5996 5997 <method name="getUSBControllerCountByType" const="yes"> 5998 <desc> 5999 Returns the number of USB controllers of the given type attached to the VM. 6000 </desc> 6001 <param name="type" type="USBControllerType" dir="in"/> 6002 <param name="controllers" type="unsigned long" dir="return"/> 5949 6003 </method> 5950 6004 … … 8654 8708 name="ISystemProperties" 8655 8709 extends="$unknown" 8656 uuid=" 55699910-cc50-11e2-8b8b-0800200c9a66"8710 uuid="856be1bc-0525-46b1-a27a-fe17d9a4939f" 8657 8711 wsmap="managed" 8658 8712 > … … 9059 9113 <param name="enabled" type="boolean" dir="return"> 9060 9114 <desc>Returned flag indicating the default value</desc> 9115 </param> 9116 </method> 9117 9118 <method name="getMaxInstancesOfUSBControllerType"> 9119 <desc>Returns the maximum number of USB controller instances which 9120 can be configured for each VM. This corresponds to the number of 9121 USB controllers one can have. Value may depend on chipset type 9122 used.</desc> 9123 9124 <param name="chipset" type="ChipsetType" dir="in"> 9125 <desc>The chipset type to get the value for.</desc> 9126 </param> 9127 9128 <param name="type" type="USBControllerType" dir="in"> 9129 <desc>The USB controller type to get the value for.</desc> 9130 </param> 9131 9132 <param name="maxInstances" type="unsigned long" dir="return"> 9133 <desc>The maximum number of instances for the given USB controller type.</desc> 9061 9134 </param> 9062 9135 </method> … … 16455 16528 --> 16456 16529 16530 <enum 16531 name="USBControllerType" 16532 uuid="8fdd1c6a-5412-41da-ab07-7baed7d6e18e" 16533 > 16534 <desc> 16535 The USB controller type. <link to="IUSBController::type" />. 16536 </desc> 16537 <const name="Null" value="0"> 16538 <desc>@c null value. Never used by the API.</desc> 16539 </const> 16540 <const name="OHCI" value="1"/> 16541 <const name="EHCI" value="2"/> 16542 <const name="Last" value="3"> 16543 <desc>Last element (invalid). Used for parameter checks.</desc> 16544 </const> 16545 </enum> 16546 16457 16547 <interface 16458 16548 name="IUSBController" extends="$unknown" 16459 uuid=" f12e6dda-2bad-40c4-8f2e-2d08fe8b74d4"16549 uuid="d2745291-65f7-4d75-9556-38047d802319" 16460 16550 wsmap="managed" 16461 16551 > 16462 <attribute name="enabled" type="boolean"> 16463 <desc> 16464 Flag whether the USB controller is present in the 16465 guest system. If disabled, the virtual guest hardware will 16466 not contain any USB controller. Can only be changed when 16467 the VM is powered off. 16468 </desc> 16469 </attribute> 16470 16471 <attribute name="enabledEHCI" type="boolean"> 16472 <desc> 16473 Flag whether the USB EHCI controller is present in the 16474 guest system. If disabled, the virtual guest hardware will 16475 not contain a USB EHCI controller. Can only be changed when 16476 the VM is powered off. 16477 </desc> 16478 </attribute> 16479 16480 <attribute name="proxyAvailable" type="boolean" readonly="yes"> 16481 <desc> 16482 Flag whether there is an USB proxy available. 16552 16553 <attribute name="name" type="wstring" readonly="yes"> 16554 <desc> 16555 The USB Controller name. 16556 </desc> 16557 </attribute> 16558 16559 <attribute name="type" type="USBControllerType" readonly="yes"> 16560 <desc> 16561 The USB Controller type. 16483 16562 </desc> 16484 16563 </attribute> … … 20899 20978 <desc> 20900 20979 Notification when a property of the virtual 20901 <link to="IMachine::USBController ">USB controller</link> changes.20980 <link to="IMachine::USBControllers">USB controllers</link> changes. 20902 20981 Interested callees should use IUSBController methods and attributes to 20903 20982 find out what has changed. -
trunk/src/VBox/Main/include/MachineImpl.h
r47376 r47401 457 457 STDMETHOD(COMGETTER(VRDEServer))(IVRDEServer **vrdeServer); 458 458 STDMETHOD(COMGETTER(AudioAdapter))(IAudioAdapter **audioAdapter); 459 STDMETHOD(COMGETTER(USBController ))(IUSBController * *aUSBController);459 STDMETHOD(COMGETTER(USBControllers))(ComSafeArrayOut(IUSBController *, aUSBControllers)); 460 460 STDMETHOD(COMGETTER(USBDeviceFilters))(IUSBDeviceFilters * *aUSBDeviceFilters); 461 461 STDMETHOD(COMGETTER(SettingsFilePath))(BSTR *aFilePath); … … 529 529 STDMETHOD(COMGETTER(Icon))(ComSafeArrayOut(BYTE, aIcon)); 530 530 STDMETHOD(COMSETTER(Icon))(ComSafeArrayIn(BYTE, aIcon)); 531 STDMETHOD(COMGETTER(USBProxyAvailable))(BOOL *aAvailable); 531 532 532 533 // IMachine methods … … 593 594 STDMETHOD(GetStorageControllerByInstance(ULONG aInstance, IStorageController **storageController)); 594 595 STDMETHOD(SetStorageControllerBootable)(IN_BSTR aName, BOOL fBootable); 596 STDMETHOD(AddUSBController)(IN_BSTR aName, StorageBus_T aConnectionType, IUSBController **controller); 597 STDMETHOD(RemoveUSBController(IN_BSTR aName)); 598 STDMETHOD(GetUSBControllerByName(IN_BSTR aName, IUSBController **usbController)); 599 STDMETHOD(GetUSBControllerCountByType(USBControllerType_T aType, ULONG *aControllers)); 595 600 STDMETHOD(QuerySavedGuestScreenInfo)(ULONG uScreenId, ULONG *puOriginX, ULONG *puOriginY, ULONG *puWidth, ULONG *puHeight, BOOL *pfEnabled); 596 601 STDMETHOD(QuerySavedThumbnailSize)(ULONG aScreenId, ULONG *aSize, ULONG *aWidth, ULONG *aHeight); … … 886 891 HRESULT getMediumAttachmentsOfController(CBSTR aName, 887 892 MediaData::AttachmentList &aAttachments); 893 894 HRESULT getUSBControllerByName(const Utf8Str &aName, 895 ComObjPtr<USBController> &aUSBController, 896 bool aSetError = false); 897 898 ULONG getUSBControllerCountByType(USBControllerType_T enmType); 888 899 889 900 enum … … 998 1009 const ComObjPtr<ParallelPort> mParallelPorts[SchemaDefs::ParallelPortCount]; 999 1010 const ComObjPtr<AudioAdapter> mAudioAdapter; 1000 const ComObjPtr<USBController> mUSBController;1001 1011 const ComObjPtr<USBDeviceFilters> mUSBDeviceFilters; 1002 1012 const ComObjPtr<BIOSSettings> mBIOSSettings; 1013 const ComObjPtr<BandwidthControl> mBandwidthControl; 1014 1003 1015 typedef std::vector<ComObjPtr<NetworkAdapter> > NetworkAdapterVector; 1004 NetworkAdapterVector mNetworkAdapters; 1005 const ComObjPtr<BandwidthControl> mBandwidthControl; 1016 NetworkAdapterVector mNetworkAdapters; 1006 1017 1007 1018 typedef std::list<ComObjPtr<StorageController> > StorageControllerList; 1008 Backupable<StorageControllerList> mStorageControllers; 1019 Backupable<StorageControllerList> mStorageControllers; 1020 1021 typedef std::list<ComObjPtr<USBController> > USBControllerList; 1022 Backupable<USBControllerList> mUSBControllers; 1009 1023 1010 1024 uint64_t uRegistryNeedsSaving; -
trunk/src/VBox/Main/include/SystemPropertiesImpl.h
r46367 r47401 109 109 STDMETHOD(GetDeviceTypesForStorageBus)(StorageBus_T aBus, ComSafeArrayOut(DeviceType_T, aDeviceTypes)); 110 110 STDMETHOD(GetDefaultIoCacheSettingForStorageController)(StorageControllerType_T aControllerType, BOOL *aEnabled); 111 STDMETHOD(GetMaxInstancesOfUSBControllerType)(ChipsetType_T aChipset, USBControllerType_T aType, ULONG *aMaxInstances); 111 112 112 113 // public methods only for internal purposes -
trunk/src/VBox/Main/include/USBControllerImpl.h
r47376 r47401 52 52 53 53 // public initializer/uninitializer for internal purposes only 54 HRESULT init(Machine *aParent );55 HRESULT init(Machine *aParent, USBController *aThat );54 HRESULT init(Machine *aParent, const Utf8Str &aName, USBControllerType_T enmType); 55 HRESULT init(Machine *aParent, USBController *aThat, bool fReshare = false); 56 56 HRESULT initCopy(Machine *aParent, USBController *aThat); 57 57 void uninit(); 58 58 59 59 // IUSBController properties 60 STDMETHOD(COMGETTER(Enabled))(BOOL *aEnabled); 61 STDMETHOD(COMSETTER(Enabled))(BOOL aEnabled); 62 STDMETHOD(COMGETTER(EnabledEHCI))(BOOL *aEnabled); 63 STDMETHOD(COMSETTER(EnabledEHCI))(BOOL aEnabled); 64 STDMETHOD(COMGETTER(ProxyAvailable))(BOOL *aEnabled); 60 STDMETHOD(COMGETTER(Name))(BSTR *aName); 61 STDMETHOD(COMGETTER(Type))(USBControllerType_T *enmType); 65 62 STDMETHOD(COMGETTER(USBStandard))(USHORT *aUSBStandard); 66 63 67 64 // public methods only for internal purposes 68 65 69 HRESULT loadSettings(const settings::USBController &data);70 HRESULT saveSettings(settings::USBController &data);71 72 66 void rollback(); 73 67 void commit(); 74 68 void copyFrom(USBController *aThat); 69 void unshare(); 70 71 const Utf8Str &getName() const; 72 USBControllerType_T getControllerType() const; 73 74 ComObjPtr<USBController> getPeer(); 75 75 76 76 private: -
trunk/src/VBox/Main/include/USBDeviceFiltersImpl.h
r47377 r47401 28 28 namespace settings 29 29 { 30 struct USB Controller;30 struct USB; 31 31 } 32 32 … … 67 67 // public methods only for internal purposes 68 68 69 HRESULT loadSettings(const settings::USB Controller&data);70 HRESULT saveSettings(settings::USB Controller&data);69 HRESULT loadSettings(const settings::USB &data); 70 HRESULT saveSettings(settings::USB &data); 71 71 72 72 void rollback(); -
trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp
r47342 r47401 2266 2266 2267 2267 /* 2268 * The USB Controller .2268 * The USB Controllers. 2269 2269 */ 2270 ComPtr<IUSBController> USBCtlPtr; 2271 hrc = pMachine->COMGETTER(USBController)(USBCtlPtr.asOutParam()); 2272 if (USBCtlPtr) 2273 { 2274 BOOL fOhciEnabled; 2275 hrc = USBCtlPtr->COMGETTER(Enabled)(&fOhciEnabled); H(); 2276 if (fOhciEnabled) 2277 { 2278 InsertConfigNode(pDevices, "usb-ohci", &pDev); 2279 InsertConfigNode(pDev, "0", &pInst); 2280 InsertConfigNode(pInst, "Config", &pCfg); 2281 InsertConfigInteger(pInst, "Trusted", 1); /* boolean */ 2282 hrc = pBusMgr->assignPCIDevice("usb-ohci", pInst); H(); 2283 InsertConfigNode(pInst, "LUN#0", &pLunL0); 2284 InsertConfigString(pLunL0, "Driver", "VUSBRootHub"); 2285 InsertConfigNode(pLunL0, "Config", &pCfg); 2286 2287 /* 2288 * Attach the status driver. 2289 */ 2290 attachStatusDriver(pInst, &mapUSBLed[0], 0, 0, NULL, NULL, 0); 2291 2292 mfVMHasUsbController = true; 2270 com::SafeIfaceArray<IUSBController> usbCtrls; 2271 hrc = pMachine->COMGETTER(USBControllers)(ComSafeArrayAsOutParam(usbCtrls)); H(); 2272 bool fOhciPresent = false; /**< Flag whether at least one OHCI controller is presnet. */ 2273 2274 for (size_t i = 0; i < usbCtrls.size(); ++i) 2275 { 2276 USBControllerType_T enmCtrlType; 2277 rc = usbCtrls[i]->COMGETTER(Type)(&enmCtrlType); H(); 2278 if (enmCtrlType == USBControllerType_OHCI) 2279 { 2280 fOhciPresent = true; 2281 break; 2282 } 2283 } 2284 2285 /* 2286 * Currently EHCI is only enabled when a OHCI controller is present too. 2287 * This might change when XHCI is supported. 2288 */ 2289 if (fOhciPresent) 2290 mfVMHasUsbController = true; 2291 2292 if (mfVMHasUsbController) 2293 { 2294 for (size_t i = 0; i < usbCtrls.size(); ++i) 2295 { 2296 USBControllerType_T enmCtrlType; 2297 rc = usbCtrls[i]->COMGETTER(Type)(&enmCtrlType); H(); 2298 2299 if (enmCtrlType == USBControllerType_OHCI) 2300 { 2301 InsertConfigNode(pDevices, "usb-ohci", &pDev); 2302 InsertConfigNode(pDev, "0", &pInst); 2303 InsertConfigNode(pInst, "Config", &pCfg); 2304 InsertConfigInteger(pInst, "Trusted", 1); /* boolean */ 2305 hrc = pBusMgr->assignPCIDevice("usb-ohci", pInst); H(); 2306 InsertConfigNode(pInst, "LUN#0", &pLunL0); 2307 InsertConfigString(pLunL0, "Driver", "VUSBRootHub"); 2308 InsertConfigNode(pLunL0, "Config", &pCfg); 2309 2310 /* 2311 * Attach the status driver. 2312 */ 2313 attachStatusDriver(pInst, &mapUSBLed[0], 0, 0, NULL, NULL, 0); 2314 } 2293 2315 #ifdef VBOX_WITH_EHCI 2294 BOOL fEHCIEnabled; 2295 hrc = USBCtlPtr->COMGETTER(EnabledEHCI)(&fEHCIEnabled); H(); 2296 if (fEHCIEnabled) 2316 else if (enmCtrlType == USBControllerType_EHCI) 2297 2317 { 2298 2318 /* … … 2340 2360 } 2341 2361 #endif 2342 2362 } /* for every USB controller. */ 2363 2364 2365 /* 2366 * Virtual USB Devices. 2367 */ 2368 PCFGMNODE pUsbDevices = NULL; 2369 InsertConfigNode(pRoot, "USB", &pUsbDevices); 2370 2371 #ifdef VBOX_WITH_USB 2372 { 2343 2373 /* 2344 * Virtual USB Devices. 2374 * Global USB options, currently unused as we'll apply the 2.0 -> 1.1 morphing 2375 * on a per device level now. 2345 2376 */ 2346 PCFGMNODE pUsbDevices = NULL; 2347 InsertConfigNode(pRoot, "USB", &pUsbDevices); 2348 2349 #ifdef VBOX_WITH_USB 2350 { 2351 /* 2352 * Global USB options, currently unused as we'll apply the 2.0 -> 1.1 morphing 2353 * on a per device level now. 2354 */ 2355 InsertConfigNode(pUsbDevices, "USBProxy", &pCfg); 2356 InsertConfigNode(pCfg, "GlobalConfig", &pCfg); 2357 // This globally enables the 2.0 -> 1.1 device morphing of proxied devices to keep windows quiet. 2358 //InsertConfigInteger(pCfg, "Force11Device", true); 2359 // The following breaks stuff, but it makes MSDs work in vista. (I include it here so 2360 // that it's documented somewhere.) Users needing it can use: 2361 // VBoxManage setextradata "myvm" "VBoxInternal/USB/USBProxy/GlobalConfig/Force11PacketSize" 1 2362 //InsertConfigInteger(pCfg, "Force11PacketSize", true); 2363 } 2377 InsertConfigNode(pUsbDevices, "USBProxy", &pCfg); 2378 InsertConfigNode(pCfg, "GlobalConfig", &pCfg); 2379 // This globally enables the 2.0 -> 1.1 device morphing of proxied devices to keep windows quiet. 2380 //InsertConfigInteger(pCfg, "Force11Device", true); 2381 // The following breaks stuff, but it makes MSDs work in vista. (I include it here so 2382 // that it's documented somewhere.) Users needing it can use: 2383 // VBoxManage setextradata "myvm" "VBoxInternal/USB/USBProxy/GlobalConfig/Force11PacketSize" 1 2384 //InsertConfigInteger(pCfg, "Force11PacketSize", true); 2385 } 2364 2386 #endif 2365 2387 2366 2388 #ifdef VBOX_WITH_USB_VIDEO 2367 BOOL aEmulatedUSBWebcamEnabled = FALSE; 2368 hrc = pMachine->COMGETTER(EmulatedUSBWebcameraEnabled)(&aEmulatedUSBWebcamEnabled); H(); 2369 if (aEmulatedUSBWebcamEnabled) 2370 { 2371 InsertConfigNode(pUsbDevices, "Webcam", &pDev); 2372 InsertConfigNode(pDev, "0", &pInst); 2373 InsertConfigNode(pInst, "Config", &pCfg); 2374 InsertConfigNode(pInst, "LUN#0", &pLunL0); 2375 InsertConfigString(pLunL0, "Driver", "EmWebcam"); 2376 InsertConfigNode(pLunL0, "Config", &pCfg); 2377 InsertConfigInteger(pCfg, "Object", (uintptr_t)mEmWebcam); 2378 } 2379 #endif 2380 2381 #ifdef VBOX_WITH_USB_CARDREADER 2382 BOOL aEmulatedUSBCardReaderEnabled = FALSE; 2383 hrc = pMachine->COMGETTER(EmulatedUSBCardReaderEnabled)(&aEmulatedUSBCardReaderEnabled); H(); 2384 if (aEmulatedUSBCardReaderEnabled) 2385 { 2386 InsertConfigNode(pUsbDevices, "CardReader", &pDev); 2387 InsertConfigNode(pDev, "0", &pInst); 2388 InsertConfigNode(pInst, "Config", &pCfg); 2389 2390 InsertConfigNode(pInst, "LUN#0", &pLunL0); 2391 # ifdef VBOX_WITH_USB_CARDREADER_TEST 2392 InsertConfigString(pLunL0, "Driver", "DrvDirectCardReader"); 2393 InsertConfigNode(pLunL0, "Config", &pCfg); 2394 # else 2395 InsertConfigString(pLunL0, "Driver", "UsbCardReader"); 2396 InsertConfigNode(pLunL0, "Config", &pCfg); 2397 InsertConfigInteger(pCfg, "Object", (uintptr_t)mUsbCardReader); 2398 # endif 2399 } 2400 #endif 2401 2402 # if 0 /* Virtual MSD*/ 2403 2404 InsertConfigNode(pUsbDevices, "Msd", &pDev); 2389 BOOL aEmulatedUSBWebcamEnabled = FALSE; 2390 hrc = pMachine->COMGETTER(EmulatedUSBWebcameraEnabled)(&aEmulatedUSBWebcamEnabled); H(); 2391 if (aEmulatedUSBWebcamEnabled) 2392 { 2393 InsertConfigNode(pUsbDevices, "Webcam", &pDev); 2405 2394 InsertConfigNode(pDev, "0", &pInst); 2406 2395 InsertConfigNode(pInst, "Config", &pCfg); 2407 2396 InsertConfigNode(pInst, "LUN#0", &pLunL0); 2408 2409 InsertConfigString(pLunL0, "Driver", "SCSI"); 2397 InsertConfigString(pLunL0, "Driver", "EmWebcam"); 2410 2398 InsertConfigNode(pLunL0, "Config", &pCfg); 2399 InsertConfigInteger(pCfg, "Object", (uintptr_t)mEmWebcam); 2400 } 2401 #endif 2402 2403 #ifdef VBOX_WITH_USB_CARDREADER 2404 BOOL aEmulatedUSBCardReaderEnabled = FALSE; 2405 hrc = pMachine->COMGETTER(EmulatedUSBCardReaderEnabled)(&aEmulatedUSBCardReaderEnabled); H(); 2406 if (aEmulatedUSBCardReaderEnabled) 2407 { 2408 InsertConfigNode(pUsbDevices, "CardReader", &pDev); 2409 InsertConfigNode(pDev, "0", &pInst); 2410 InsertConfigNode(pInst, "Config", &pCfg); 2411 2412 InsertConfigNode(pInst, "LUN#0", &pLunL0); 2413 # ifdef VBOX_WITH_USB_CARDREADER_TEST 2414 InsertConfigString(pLunL0, "Driver", "DrvDirectCardReader"); 2415 InsertConfigNode(pLunL0, "Config", &pCfg); 2416 # else 2417 InsertConfigString(pLunL0, "Driver", "UsbCardReader"); 2418 InsertConfigNode(pLunL0, "Config", &pCfg); 2419 InsertConfigInteger(pCfg, "Object", (uintptr_t)mUsbCardReader); 2420 # endif 2421 } 2422 #endif 2423 2424 # if 0 /* Virtual MSD*/ 2425 InsertConfigNode(pUsbDevices, "Msd", &pDev); 2426 InsertConfigNode(pDev, "0", &pInst); 2427 InsertConfigNode(pInst, "Config", &pCfg); 2428 InsertConfigNode(pInst, "LUN#0", &pLunL0); 2429 2430 InsertConfigString(pLunL0, "Driver", "SCSI"); 2431 InsertConfigNode(pLunL0, "Config", &pCfg); 2432 2433 InsertConfigNode(pLunL0, "AttachedDriver", &pLunL1); 2434 InsertConfigString(pLunL1, "Driver", "Block"); 2435 InsertConfigNode(pLunL1, "Config", &pCfg); 2436 InsertConfigString(pCfg, "Type", "HardDisk"); 2437 InsertConfigInteger(pCfg, "Mountable", 0); 2438 2439 InsertConfigNode(pLunL1, "AttachedDriver", &pLunL2); 2440 InsertConfigString(pLunL2, "Driver", "VD"); 2441 InsertConfigNode(pLunL2, "Config", &pCfg); 2442 InsertConfigString(pCfg, "Path", "/Volumes/DataHFS/bird/VDIs/linux.vdi"); 2443 InsertConfigString(pCfg, "Format", "VDI"); 2444 # endif 2445 2446 /* Virtual USB Mouse/Tablet */ 2447 if ( aPointingHID == PointingHIDType_USBMouse 2448 || aPointingHID == PointingHIDType_ComboMouse 2449 || aPointingHID == PointingHIDType_USBTablet 2450 || aPointingHID == PointingHIDType_USBMultiTouch) 2451 { 2452 InsertConfigNode(pUsbDevices, "HidMouse", &pDev); 2453 InsertConfigNode(pDev, "0", &pInst); 2454 InsertConfigNode(pInst, "Config", &pCfg); 2455 2456 InsertConfigString(pCfg, "Mode", "relative"); 2457 InsertConfigNode(pInst, "LUN#0", &pLunL0); 2458 InsertConfigString(pLunL0, "Driver", "MouseQueue"); 2459 InsertConfigNode(pLunL0, "Config", &pCfg); 2460 InsertConfigInteger(pCfg, "QueueSize", 128); 2411 2461 2412 2462 InsertConfigNode(pLunL0, "AttachedDriver", &pLunL1); 2413 InsertConfigString(pLunL1, "Driver", "Block");2463 InsertConfigString(pLunL1, "Driver", "MainMouse"); 2414 2464 InsertConfigNode(pLunL1, "Config", &pCfg); 2415 InsertConfigString(pCfg, "Type", "HardDisk"); 2416 InsertConfigInteger(pCfg, "Mountable", 0); 2417 2418 InsertConfigNode(pLunL1, "AttachedDriver", &pLunL2); 2419 InsertConfigString(pLunL2, "Driver", "VD"); 2420 InsertConfigNode(pLunL2, "Config", &pCfg); 2421 InsertConfigString(pCfg, "Path", "/Volumes/DataHFS/bird/VDIs/linux.vdi"); 2422 InsertConfigString(pCfg, "Format", "VDI"); 2423 # endif 2424 2425 /* Virtual USB Mouse/Tablet */ 2426 if ( aPointingHID == PointingHIDType_USBMouse 2427 || aPointingHID == PointingHIDType_ComboMouse 2428 || aPointingHID == PointingHIDType_USBTablet 2429 || aPointingHID == PointingHIDType_USBMultiTouch) 2430 { 2431 InsertConfigNode(pUsbDevices, "HidMouse", &pDev); 2432 InsertConfigNode(pDev, "0", &pInst); 2433 InsertConfigNode(pInst, "Config", &pCfg); 2434 2435 InsertConfigString(pCfg, "Mode", "relative"); 2436 InsertConfigNode(pInst, "LUN#0", &pLunL0); 2437 InsertConfigString(pLunL0, "Driver", "MouseQueue"); 2438 InsertConfigNode(pLunL0, "Config", &pCfg); 2439 InsertConfigInteger(pCfg, "QueueSize", 128); 2440 2441 InsertConfigNode(pLunL0, "AttachedDriver", &pLunL1); 2442 InsertConfigString(pLunL1, "Driver", "MainMouse"); 2443 InsertConfigNode(pLunL1, "Config", &pCfg); 2444 InsertConfigInteger(pCfg, "Object", (uintptr_t)pMouse); 2445 } 2446 if ( aPointingHID == PointingHIDType_USBTablet 2447 || aPointingHID == PointingHIDType_USBMultiTouch) 2448 { 2449 InsertConfigNode(pDev, "1", &pInst); 2450 InsertConfigNode(pInst, "Config", &pCfg); 2451 2452 InsertConfigString(pCfg, "Mode", "absolute"); 2453 InsertConfigNode(pInst, "LUN#0", &pLunL0); 2454 InsertConfigString(pLunL0, "Driver", "MouseQueue"); 2455 InsertConfigNode(pLunL0, "Config", &pCfg); 2456 InsertConfigInteger(pCfg, "QueueSize", 128); 2457 2458 InsertConfigNode(pLunL0, "AttachedDriver", &pLunL1); 2459 InsertConfigString(pLunL1, "Driver", "MainMouse"); 2460 InsertConfigNode(pLunL1, "Config", &pCfg); 2461 InsertConfigInteger(pCfg, "Object", (uintptr_t)pMouse); 2462 } 2463 if (aPointingHID == PointingHIDType_USBMultiTouch) 2464 { 2465 InsertConfigNode(pDev, "2", &pInst); 2466 InsertConfigNode(pInst, "Config", &pCfg); 2467 2468 InsertConfigString(pCfg, "Mode", "multitouch"); 2469 InsertConfigNode(pInst, "LUN#0", &pLunL0); 2470 InsertConfigString(pLunL0, "Driver", "MouseQueue"); 2471 InsertConfigNode(pLunL0, "Config", &pCfg); 2472 InsertConfigInteger(pCfg, "QueueSize", 128); 2473 2474 InsertConfigNode(pLunL0, "AttachedDriver", &pLunL1); 2475 InsertConfigString(pLunL1, "Driver", "MainMouse"); 2476 InsertConfigNode(pLunL1, "Config", &pCfg); 2477 InsertConfigInteger(pCfg, "Object", (uintptr_t)pMouse); 2478 } 2479 2480 /* Virtual USB Keyboard */ 2481 KeyboardHIDType_T aKbdHID; 2482 hrc = pMachine->COMGETTER(KeyboardHIDType)(&aKbdHID); H(); 2483 if (aKbdHID == KeyboardHIDType_USBKeyboard) 2484 { 2485 InsertConfigNode(pUsbDevices, "HidKeyboard", &pDev); 2486 InsertConfigNode(pDev, "0", &pInst); 2487 InsertConfigNode(pInst, "Config", &pCfg); 2488 2489 InsertConfigNode(pInst, "LUN#0", &pLunL0); 2490 InsertConfigString(pLunL0, "Driver", "KeyboardQueue"); 2491 InsertConfigNode(pLunL0, "Config", &pCfg); 2492 InsertConfigInteger(pCfg, "QueueSize", 64); 2493 2494 InsertConfigNode(pLunL0, "AttachedDriver", &pLunL1); 2495 InsertConfigString(pLunL1, "Driver", "MainKeyboard"); 2496 InsertConfigNode(pLunL1, "Config", &pCfg); 2497 pKeyboard = mKeyboard; 2498 InsertConfigInteger(pCfg, "Object", (uintptr_t)pKeyboard); 2499 } 2465 InsertConfigInteger(pCfg, "Object", (uintptr_t)pMouse); 2466 } 2467 if ( aPointingHID == PointingHIDType_USBTablet 2468 || aPointingHID == PointingHIDType_USBMultiTouch) 2469 { 2470 InsertConfigNode(pDev, "1", &pInst); 2471 InsertConfigNode(pInst, "Config", &pCfg); 2472 2473 InsertConfigString(pCfg, "Mode", "absolute"); 2474 InsertConfigNode(pInst, "LUN#0", &pLunL0); 2475 InsertConfigString(pLunL0, "Driver", "MouseQueue"); 2476 InsertConfigNode(pLunL0, "Config", &pCfg); 2477 InsertConfigInteger(pCfg, "QueueSize", 128); 2478 2479 InsertConfigNode(pLunL0, "AttachedDriver", &pLunL1); 2480 InsertConfigString(pLunL1, "Driver", "MainMouse"); 2481 InsertConfigNode(pLunL1, "Config", &pCfg); 2482 InsertConfigInteger(pCfg, "Object", (uintptr_t)pMouse); 2483 } 2484 if (aPointingHID == PointingHIDType_USBMultiTouch) 2485 { 2486 InsertConfigNode(pDev, "2", &pInst); 2487 InsertConfigNode(pInst, "Config", &pCfg); 2488 2489 InsertConfigString(pCfg, "Mode", "multitouch"); 2490 InsertConfigNode(pInst, "LUN#0", &pLunL0); 2491 InsertConfigString(pLunL0, "Driver", "MouseQueue"); 2492 InsertConfigNode(pLunL0, "Config", &pCfg); 2493 InsertConfigInteger(pCfg, "QueueSize", 128); 2494 2495 InsertConfigNode(pLunL0, "AttachedDriver", &pLunL1); 2496 InsertConfigString(pLunL1, "Driver", "MainMouse"); 2497 InsertConfigNode(pLunL1, "Config", &pCfg); 2498 InsertConfigInteger(pCfg, "Object", (uintptr_t)pMouse); 2499 } 2500 2501 /* Virtual USB Keyboard */ 2502 KeyboardHIDType_T aKbdHID; 2503 hrc = pMachine->COMGETTER(KeyboardHIDType)(&aKbdHID); H(); 2504 if (aKbdHID == KeyboardHIDType_USBKeyboard) 2505 { 2506 InsertConfigNode(pUsbDevices, "HidKeyboard", &pDev); 2507 InsertConfigNode(pDev, "0", &pInst); 2508 InsertConfigNode(pInst, "Config", &pCfg); 2509 2510 InsertConfigNode(pInst, "LUN#0", &pLunL0); 2511 InsertConfigString(pLunL0, "Driver", "KeyboardQueue"); 2512 InsertConfigNode(pLunL0, "Config", &pCfg); 2513 InsertConfigInteger(pCfg, "QueueSize", 64); 2514 2515 InsertConfigNode(pLunL0, "AttachedDriver", &pLunL1); 2516 InsertConfigString(pLunL1, "Driver", "MainKeyboard"); 2517 InsertConfigNode(pLunL1, "Config", &pCfg); 2518 pKeyboard = mKeyboard; 2519 InsertConfigInteger(pCfg, "Object", (uintptr_t)pKeyboard); 2500 2520 } 2501 2521 } -
trunk/src/VBox/Main/src-server/ApplianceImplExport.cpp
r46535 r47401 88 88 89 89 // first, call the COM methods, as they request locks 90 ComPtr<IUSBController> pUsbController; 91 rc = COMGETTER(USBController)(pUsbController.asOutParam()); 92 BOOL fUSBEnabled; 93 if (FAILED(rc)) 94 fUSBEnabled = false; 95 else 96 { 97 rc = pUsbController->COMGETTER(Enabled)(&fUSBEnabled); 98 if (FAILED(rc)) throw rc; 90 BOOL fUSBEnabled = FALSE; 91 com::SafeIfaceArray<IUSBController> usbControllers; 92 rc = COMGETTER(USBControllers)(ComSafeArrayAsOutParam(usbControllers)); 93 if (SUCCEEDED(rc)) 94 { 95 for (unsigned i = 0; i < usbControllers.size(); i++) 96 { 97 USBControllerType_T enmType; 98 99 rc = usbControllers[i]->COMGETTER(Type)(&enmType); 100 if (FAILED(rc)) throw rc; 101 102 if (enmType == USBControllerType_OHCI) 103 fUSBEnabled = TRUE; 104 } 99 105 } 100 106 -
trunk/src/VBox/Main/src-server/ApplianceImplImport.cpp
r47340 r47401 354 354 /* If there is a <vbox:Machine>, we always prefer the setting from there. */ 355 355 if ( ( vsysThis.pelmVboxMachine 356 && pNewDesc->m->pConfig->hardwareMachine.usb Controller.fEnabled)356 && pNewDesc->m->pConfig->hardwareMachine.usbSettings.llUSBControllers.size() > 0) 357 357 || vsysThis.fHasUsbController) 358 358 pNewDesc->addEntry(VirtualSystemDescriptionType_USBController, "", "", ""); … … 2619 2619 #ifdef VBOX_WITH_USB 2620 2620 /* USB Controller */ 2621 ComPtr<IUSBController> usbController; 2622 rc = pNewMachine->COMGETTER(USBController)(usbController.asOutParam()); 2623 if (FAILED(rc)) throw rc; 2624 rc = usbController->COMSETTER(Enabled)(stack.fUSBEnabled); 2625 if (FAILED(rc)) throw rc; 2621 if (stack.fUSBEnabled) 2622 { 2623 ComPtr<IUSBController> usbController; 2624 rc = pNewMachine->AddUSBController(Bstr("OHCI").raw(), USBControllerType_OHCI, usbController.asOutParam()); 2625 if (FAILED(rc)) throw rc; 2626 } 2626 2627 #endif /* VBOX_WITH_USB */ 2627 2628 … … 3256 3257 #ifdef VBOX_WITH_USB 3257 3258 /* USB controller */ 3258 config.hardwareMachine.usbController.fEnabled = stack.fUSBEnabled; 3259 if (stack.fUSBEnabled) 3260 { 3261 settings::USBController ctrl; 3262 3263 ctrl.strName = "OHCI"; 3264 ctrl.enmType = USBControllerType_OHCI; 3265 3266 config.hardwareMachine.usbSettings.llUSBControllers.push_back(ctrl); 3267 } 3259 3268 #endif 3260 3269 /* Audio adapter */ -
trunk/src/VBox/Main/src-server/MachineImpl.cpp
r47376 r47401 52 52 #include "MachineImplCloneVM.h" 53 53 #include "AutostartDb.h" 54 #include "SystemPropertiesImpl.h" 54 55 55 56 // generated header … … 2741 2742 } 2742 2743 2743 STDMETHODIMP Machine::COMGETTER(USBController )(IUSBController **aUSBController)2744 STDMETHODIMP Machine::COMGETTER(USBControllers)(ComSafeArrayOut(IUSBController *, aUSBControllers)) 2744 2745 { 2745 2746 #ifdef VBOX_WITH_VUSB 2746 CheckComArgOutPointerValid(aUSBController );2747 CheckComArgOutPointerValid(aUSBControllers); 2747 2748 2748 2749 AutoCaller autoCaller(this); … … 2759 2760 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 2760 2761 2761 return rc = mUSBController.queryInterfaceTo(aUSBController); 2762 SafeIfaceArray<IUSBController> ctrls(*mUSBControllers.data()); 2763 ctrls.detachTo(ComSafeArrayOutArg(aUSBControllers)); 2764 return S_OK; 2762 2765 #else 2763 2766 /* Note: The GUI depends on this method returning E_NOTIMPL with no 2764 2767 * extended error info to indicate that USB is simply not available 2765 2768 * (w/o treating it as a failure), for example, as in OSE */ 2766 NOREF(aUSBController );2769 NOREF(aUSBControllers); 2767 2770 ReturnComNotImplemented(); 2768 2771 #endif /* VBOX_WITH_VUSB */ … … 6554 6557 } 6555 6558 6559 STDMETHODIMP Machine::AddUSBController(IN_BSTR aName, USBControllerType_T aType, 6560 IUSBController **controller) 6561 { 6562 if ( (aType <= USBControllerType_Null) 6563 || (aType >= USBControllerType_Last)) 6564 return setError(E_INVALIDARG, 6565 tr("Invalid USB controller type: %d"), 6566 aType); 6567 6568 AutoCaller autoCaller(this); 6569 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 6570 6571 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 6572 6573 HRESULT rc = checkStateDependency(MutableStateDep); 6574 if (FAILED(rc)) return rc; 6575 6576 /* try to find one with the same type first. */ 6577 ComObjPtr<USBController> ctrl; 6578 6579 rc = getUSBControllerByName(aName, ctrl, false /* aSetError */); 6580 if (SUCCEEDED(rc)) 6581 return setError(VBOX_E_OBJECT_IN_USE, 6582 tr("USB controller named '%ls' already exists"), 6583 aName); 6584 6585 /* Check that we don't exceed the maximum number of USB controllers for the given type. */ 6586 ULONG maxInstances; 6587 rc = mParent->getSystemProperties()->GetMaxInstancesOfUSBControllerType(mHWData->mChipsetType, aType, &maxInstances); 6588 if (FAILED(rc)) 6589 return rc; 6590 6591 ULONG cInstances = getUSBControllerCountByType(aType); 6592 if (cInstances >= maxInstances) 6593 return setError(E_INVALIDARG, 6594 tr("Too many USB controllers of this type")); 6595 6596 ctrl.createObject(); 6597 6598 rc = ctrl->init(this, aName, aType); 6599 if (FAILED(rc)) return rc; 6600 6601 setModified(IsModified_USB); 6602 mUSBControllers.backup(); 6603 mUSBControllers->push_back(ctrl); 6604 6605 ctrl.queryInterfaceTo(controller); 6606 6607 /* inform the direct session if any */ 6608 alock.release(); 6609 onUSBControllerChange(); 6610 6611 return S_OK; 6612 } 6613 6614 STDMETHODIMP Machine::GetUSBControllerByName(IN_BSTR aName, IUSBController **aUSBController) 6615 { 6616 CheckComArgStrNotEmptyOrNull(aName); 6617 6618 AutoCaller autoCaller(this); 6619 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 6620 6621 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 6622 6623 ComObjPtr<USBController> ctrl; 6624 6625 HRESULT rc = getUSBControllerByName(aName, ctrl, true /* aSetError */); 6626 if (SUCCEEDED(rc)) 6627 ctrl.queryInterfaceTo(aUSBController); 6628 6629 return rc; 6630 } 6631 6632 STDMETHODIMP Machine::GetUSBControllerCountByType(USBControllerType_T aType, 6633 ULONG *aControllers) 6634 { 6635 CheckComArgOutPointerValid(aControllers); 6636 6637 if ( (aType <= USBControllerType_Null) 6638 || (aType >= USBControllerType_Last)) 6639 return setError(E_INVALIDARG, 6640 tr("Invalid USB controller type: %d"), 6641 aType); 6642 6643 AutoCaller autoCaller(this); 6644 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 6645 6646 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 6647 6648 ComObjPtr<USBController> ctrl; 6649 6650 *aControllers = getUSBControllerCountByType(aType); 6651 6652 return S_OK; 6653 } 6654 6655 STDMETHODIMP Machine::RemoveUSBController(IN_BSTR aName) 6656 { 6657 CheckComArgStrNotEmptyOrNull(aName); 6658 6659 AutoCaller autoCaller(this); 6660 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 6661 6662 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 6663 6664 HRESULT rc = checkStateDependency(MutableStateDep); 6665 if (FAILED(rc)) return rc; 6666 6667 ComObjPtr<USBController> ctrl; 6668 rc = getUSBControllerByName(aName, ctrl, true /* aSetError */); 6669 if (FAILED(rc)) return rc; 6670 6671 setModified(IsModified_USB); 6672 mUSBControllers.backup(); 6673 6674 ctrl->unshare(); 6675 6676 mUSBControllers->remove(ctrl); 6677 6678 /* inform the direct session if any */ 6679 alock.release(); 6680 onUSBControllerChange(); 6681 6682 return S_OK; 6683 } 6684 6556 6685 STDMETHODIMP Machine::QuerySavedGuestScreenInfo(ULONG uScreenId, 6557 6686 ULONG *puOriginX, … … 7477 7606 } 7478 7607 7608 STDMETHODIMP Machine::COMGETTER(USBProxyAvailable)(BOOL *aAvailable) 7609 { 7610 CheckComArgOutPointerValid(aAvailable); 7611 7612 AutoCaller autoCaller(this); 7613 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 7614 7615 #ifdef VBOX_WITH_USB 7616 *aAvailable = true; 7617 #else 7618 *aAvailable = false; 7619 #endif 7620 return S_OK; 7621 } 7622 7479 7623 STDMETHODIMP Machine::CloneTo(IMachine *pTarget, CloneMode_T mode, ComSafeArrayIn(CloneOptions_T, options), IProgress **pProgress) 7480 7624 { … … 7746 7890 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 7747 7891 7748 BOOL fEnabled = FALSE; 7749 HRESULT rc = mUSBController->COMGETTER(Enabled)(&fEnabled); 7750 if (SUCCEEDED(rc)) 7751 return !!fEnabled; 7752 else 7753 return false; 7892 return (mUSBControllers->size() > 0); 7754 7893 } 7755 7894 … … 8484 8623 mMediaData.allocate(); 8485 8624 mStorageControllers.allocate(); 8625 mUSBControllers.allocate(); 8486 8626 8487 8627 /* initialize mOSTypeId */ … … 8513 8653 unconst(mAudioAdapter).createObject(); 8514 8654 mAudioAdapter->init(this); 8515 8516 /* create the USB controller object (always present, default is disabled) */8517 unconst(mUSBController).createObject();8518 mUSBController->init(this);8519 8655 8520 8656 /* create the USB device filters object (always present) */ … … 8567 8703 unconst(mNetworkAdapters[slot]).setNull(); 8568 8704 } 8569 }8570 8571 if (mUSBController)8572 {8573 mUSBController->uninit();8574 unconst(mUSBController).setNull();8575 8705 } 8576 8706 … … 8661 8791 mMediaData.free(); 8662 8792 mStorageControllers.free(); 8793 mUSBControllers.free(); 8663 8794 mHWData.free(); 8664 8795 mUserData.free(); … … 9174 9305 if (FAILED(rc)) return rc; 9175 9306 9176 /* USB Controller */ 9177 rc = mUSBController->loadSettings(data.usbController); 9178 if (FAILED(rc)) return rc; 9307 /* Shared folders */ 9308 for (settings::USBControllerList::const_iterator it = data.usbSettings.llUSBControllers.begin(); 9309 it != data.usbSettings.llUSBControllers.end(); 9310 ++it) 9311 { 9312 const settings::USBController &settingsCtrl = *it; 9313 ComObjPtr<USBController> newCtrl; 9314 9315 newCtrl.createObject(); 9316 newCtrl->init(this, settingsCtrl.strName, settingsCtrl.enmType); 9317 mUSBControllers->push_back(newCtrl); 9318 } 9179 9319 9180 9320 /* USB device filters */ 9181 rc = mUSBDeviceFilters->loadSettings(data.usb Controller);9321 rc = mUSBDeviceFilters->loadSettings(data.usbSettings); 9182 9322 if (FAILED(rc)) return rc; 9183 9323 … … 9746 9886 aName.c_str()); 9747 9887 return VBOX_E_OBJECT_NOT_FOUND; 9888 } 9889 9890 /** 9891 * Returns a USB controller object with the given name. 9892 * 9893 * @param aName USB controller name to find 9894 * @param aUSBController where to return the found USB controller 9895 * @param aSetError true to set extended error info on failure 9896 */ 9897 HRESULT Machine::getUSBControllerByName(const Utf8Str &aName, 9898 ComObjPtr<USBController> &aUSBController, 9899 bool aSetError /* = false */) 9900 { 9901 AssertReturn(!aName.isEmpty(), E_INVALIDARG); 9902 9903 for (USBControllerList::const_iterator it = mUSBControllers->begin(); 9904 it != mUSBControllers->end(); 9905 ++it) 9906 { 9907 if ((*it)->getName() == aName) 9908 { 9909 aUSBController = (*it); 9910 return S_OK; 9911 } 9912 } 9913 9914 if (aSetError) 9915 return setError(VBOX_E_OBJECT_NOT_FOUND, 9916 tr("Could not find a storage controller named '%s'"), 9917 aName.c_str()); 9918 return VBOX_E_OBJECT_NOT_FOUND; 9919 } 9920 9921 /** 9922 * Returns the number of USB controller instance of the given type. 9923 * 9924 * @param enmType USB controller type. 9925 */ 9926 ULONG Machine::getUSBControllerCountByType(USBControllerType_T enmType) 9927 { 9928 ULONG cCtrls = 0; 9929 9930 for (USBControllerList::const_iterator it = mUSBControllers->begin(); 9931 it != mUSBControllers->end(); 9932 ++it) 9933 { 9934 if ((*it)->getControllerType() == enmType) 9935 cCtrls++; 9936 } 9937 9938 return cCtrls; 9748 9939 } 9749 9940 … … 10416 10607 10417 10608 /* USB Controller (required) */ 10418 rc = mUSBController->saveSettings(data.usbController); 10419 if (FAILED(rc)) throw rc; 10609 for (USBControllerList::const_iterator it = mUSBControllers->begin(); 10610 it != mUSBControllers->end(); 10611 ++it) 10612 { 10613 ComObjPtr<USBController> ctrl = *it; 10614 settings::USBController settingsCtrl; 10615 10616 settingsCtrl.strName = ctrl->getName(); 10617 settingsCtrl.enmType = ctrl->getControllerType(); 10618 10619 data.usbSettings.llUSBControllers.push_back(settingsCtrl); 10620 } 10420 10621 10421 10622 /* USB device filters (required) */ 10422 rc = mUSBDeviceFilters->saveSettings(data.usb Controller);10623 rc = mUSBDeviceFilters->saveSettings(data.usbSettings); 10423 10624 if (FAILED(rc)) throw rc; 10424 10625 … … 11809 12010 } 11810 12011 12012 if (!mUSBControllers.isNull()) 12013 { 12014 if (mUSBControllers.isBackedUp()) 12015 { 12016 /* unitialize all new devices (absent in the backed up list). */ 12017 USBControllerList::const_iterator it = mUSBControllers->begin(); 12018 USBControllerList *backedList = mUSBControllers.backedUpData(); 12019 while (it != mUSBControllers->end()) 12020 { 12021 if ( std::find(backedList->begin(), backedList->end(), *it) 12022 == backedList->end() 12023 ) 12024 { 12025 (*it)->uninit(); 12026 } 12027 ++it; 12028 } 12029 12030 /* restore the list */ 12031 mUSBControllers.rollback(); 12032 } 12033 12034 /* rollback any changes to devices after restoring the list */ 12035 if (mData->flModifications & IsModified_USB) 12036 { 12037 USBControllerList::const_iterator it = mUSBControllers->begin(); 12038 while (it != mUSBControllers->end()) 12039 { 12040 (*it)->rollback(); 12041 ++it; 12042 } 12043 } 12044 } 12045 11811 12046 mUserData.rollback(); 11812 12047 … … 11824 12059 if (mAudioAdapter) 11825 12060 mAudioAdapter->rollback(); 11826 11827 if (mUSBController && (mData->flModifications & IsModified_USB))11828 mUSBController->rollback();11829 12061 11830 12062 if (mUSBDeviceFilters && (mData->flModifications & IsModified_USB)) … … 11934 12166 mVRDEServer->commit(); 11935 12167 mAudioAdapter->commit(); 11936 mUSBController->commit();11937 12168 mUSBDeviceFilters->commit(); 11938 12169 mBandwidthControl->commit(); … … 12065 12296 } 12066 12297 12298 bool commitUSBControllers = false; 12299 12300 if (mUSBControllers.isBackedUp()) 12301 { 12302 mUSBControllers.commit(); 12303 12304 if (mPeer) 12305 { 12306 /* Commit all changes to new controllers (this will reshare data with 12307 * peers for those who have peers) */ 12308 USBControllerList *newList = new USBControllerList(); 12309 USBControllerList::const_iterator it = mUSBControllers->begin(); 12310 while (it != mUSBControllers->end()) 12311 { 12312 (*it)->commit(); 12313 12314 /* look if this controller has a peer device */ 12315 ComObjPtr<USBController> peer = (*it)->getPeer(); 12316 if (!peer) 12317 { 12318 /* no peer means the device is a newly created one; 12319 * create a peer owning data this device share it with */ 12320 peer.createObject(); 12321 peer->init(mPeer, *it, true /* aReshare */); 12322 } 12323 else 12324 { 12325 /* remove peer from the old list */ 12326 mPeer->mUSBControllers->remove(peer); 12327 } 12328 /* and add it to the new list */ 12329 newList->push_back(peer); 12330 12331 ++it; 12332 } 12333 12334 /* uninit old peer's controllers that are left */ 12335 it = mPeer->mUSBControllers->begin(); 12336 while (it != mPeer->mUSBControllers->end()) 12337 { 12338 (*it)->uninit(); 12339 ++it; 12340 } 12341 12342 /* attach new list of controllers to our peer */ 12343 mPeer->mUSBControllers.attach(newList); 12344 } 12345 else 12346 { 12347 /* we have no peer (our parent is the newly created machine); 12348 * just commit changes to devices */ 12349 commitUSBControllers = true; 12350 } 12351 } 12352 else 12353 { 12354 /* the list of controllers itself is not changed, 12355 * just commit changes to controllers themselves */ 12356 commitUSBControllers = true; 12357 } 12358 12359 if (commitUSBControllers) 12360 { 12361 USBControllerList::const_iterator it = mUSBControllers->begin(); 12362 while (it != mUSBControllers->end()) 12363 { 12364 (*it)->commit(); 12365 ++it; 12366 } 12367 } 12368 12067 12369 if (isSessionMachine()) 12068 12370 { … … 12113 12415 mVRDEServer->copyFrom(aThat->mVRDEServer); 12114 12416 mAudioAdapter->copyFrom(aThat->mAudioAdapter); 12115 mUSBController->copyFrom(aThat->mUSBController);12116 12417 mUSBDeviceFilters->copyFrom(aThat->mUSBDeviceFilters); 12117 12418 mBandwidthControl->copyFrom(aThat->mBandwidthControl); … … 12128 12429 ctrl->initCopy(this, *it); 12129 12430 mStorageControllers->push_back(ctrl); 12431 } 12432 12433 /* create private copies of all USB controllers */ 12434 mUSBControllers.backup(); 12435 mUSBControllers->clear(); 12436 for (USBControllerList::iterator it = aThat->mUSBControllers->begin(); 12437 it != aThat->mUSBControllers->end(); 12438 ++it) 12439 { 12440 ComObjPtr<USBController> ctrl; 12441 ctrl.createObject(); 12442 ctrl->initCopy(this, *it); 12443 mUSBControllers->push_back(ctrl); 12130 12444 } 12131 12445 … … 12519 12833 } 12520 12834 12835 mUSBControllers.allocate(); 12836 for (USBControllerList::const_iterator it = aMachine->mUSBControllers->begin(); 12837 it != aMachine->mUSBControllers->end(); 12838 ++it) 12839 { 12840 ComObjPtr<USBController> ctl; 12841 ctl.createObject(); 12842 ctl->init(this, *it); 12843 mUSBControllers->push_back(ctl); 12844 } 12845 12521 12846 unconst(mBIOSSettings).createObject(); 12522 12847 mBIOSSettings->init(this, aMachine->mBIOSSettings); … … 12539 12864 mParallelPorts[slot]->init(this, aMachine->mParallelPorts[slot]); 12540 12865 } 12541 /* create another USB controller object that will be mutable */12542 unconst(mUSBController).createObject();12543 mUSBController->init(this, aMachine->mUSBController);12544 12866 12545 12867 /* create another USB device filters object that will be mutable */ -
trunk/src/VBox/Main/src-server/SnapshotImpl.cpp
r47376 r47401 1078 1078 mAudioAdapter->initCopy(this, pMachine->mAudioAdapter); 1079 1079 1080 unconst(mUSBController).createObject(); 1081 mUSBController->initCopy(this, pMachine->mUSBController); 1080 /* create copies of all USB controllers (mUSBControllerData 1081 * after attaching a copy contains just references to original objects) */ 1082 mUSBControllers.allocate(); 1083 for (USBControllerList::const_iterator 1084 it = aSessionMachine->mUSBControllers->begin(); 1085 it != aSessionMachine->mUSBControllers->end(); 1086 ++it) 1087 { 1088 ComObjPtr<USBController> ctrl; 1089 ctrl.createObject(); 1090 ctrl->initCopy(this, *it); 1091 mUSBControllers->push_back(ctrl); 1092 } 1082 1093 1083 1094 unconst(mUSBDeviceFilters).createObject(); … … 1164 1175 mMediaData.allocate(); 1165 1176 mStorageControllers.allocate(); 1177 mUSBControllers.allocate(); 1166 1178 1167 1179 /* SSData is always unique for SnapshotMachine */ … … 1179 1191 unconst(mAudioAdapter).createObject(); 1180 1192 mAudioAdapter->init(this); 1181 1182 unconst(mUSBController).createObject();1183 mUSBController->init(this);1184 1193 1185 1194 unconst(mUSBDeviceFilters).createObject(); -
trunk/src/VBox/Main/src-server/SystemPropertiesImpl.cpp
r46367 r47401 581 581 AssertMsgFailed(("Invalid controller type %d\n", aControllerType)); 582 582 } 583 return S_OK; 584 } 585 586 STDMETHODIMP SystemProperties::GetMaxInstancesOfUSBControllerType(ChipsetType_T aChipset, 587 USBControllerType_T aType, 588 ULONG *aMaxInstances) 589 { 590 CheckComArgOutPointerValid(aMaxInstances); 591 592 AutoCaller autoCaller(this); 593 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 594 595 ULONG cCtrs = 0; 596 597 /* no need to lock, this is const */ 598 switch (aType) 599 { 600 case USBControllerType_OHCI: 601 case USBControllerType_EHCI: 602 { 603 cCtrs = 1; 604 break; 605 } 606 default: 607 AssertMsgFailed(("Invalid bus type %d\n", aType)); 608 } 609 610 *aMaxInstances = cCtrs; 611 583 612 return S_OK; 584 613 } -
trunk/src/VBox/Main/src-server/USBControllerImpl.cpp
r47376 r47401 42 42 { 43 43 BackupableUSBData() 44 : fEnabled(false), 45 fEnabledEHCI(false) 44 : enmType(USBControllerType_Null) 46 45 { } 47 46 48 BOOL fEnabled;49 BOOL fEnabledEHCI;47 Utf8Str strName; 48 USBControllerType_T enmType; 50 49 }; 51 50 … … 93 92 * @returns COM result indicator. 94 93 * @param aParent Pointer to our parent object. 95 */ 96 HRESULT USBController::init(Machine *aParent) 97 { 98 LogFlowThisFunc(("aParent=%p\n", aParent)); 99 100 ComAssertRet(aParent, E_INVALIDARG); 94 * @param aName The name of the USB controller. 95 * @param enmType The USB controller type. 96 */ 97 HRESULT USBController::init(Machine *aParent, const Utf8Str &aName, USBControllerType_T enmType) 98 { 99 LogFlowThisFunc(("aParent=%p aName=\"%s\"\n", aParent, aName.c_str())); 100 101 ComAssertRet(aParent && !aName.isEmpty(), E_INVALIDARG); 102 if ( (enmType <= USBControllerType_Null) 103 || (enmType > USBControllerType_EHCI)) 104 return setError(E_INVALIDARG, 105 tr("Invalid USB controller type")); 101 106 102 107 /* Enclose the state transition NotReady->InInit->Ready */ … … 109 114 110 115 m->bd.allocate(); 116 m->bd->strName = aName; 117 m->bd->enmType = enmType; 111 118 112 119 /* Confirm a successful initialization */ … … 124 131 * @param aParent Pointer to our parent object. 125 132 * @param aPeer The object to share. 126 * 127 * @note This object must be destroyed before the original object 128 * it shares data with is destroyed. 129 */ 130 HRESULT USBController::init(Machine *aParent, USBController *aPeer) 131 { 132 LogFlowThisFunc(("aParent=%p, aPeer=%p\n", aParent, aPeer)); 133 * @param aReshare 134 * When false, the original object will remain a data owner. 135 * Otherwise, data ownership will be transferred from the original 136 * object to this one. 137 * 138 * @note This object must be destroyed before the original object 139 * it shares data with is destroyed. 140 * 141 * @note Locks @a aThat object for writing if @a aReshare is @c true, or for 142 * reading if @a aReshare is false. 143 */ 144 HRESULT USBController::init(Machine *aParent, USBController *aPeer, 145 bool fReshare /* = false */) 146 { 147 LogFlowThisFunc(("aParent=%p, aPeer=%p, fReshare=%RTbool\n", 148 aParent, aPeer, fReshare)); 133 149 134 150 ComAssertRet(aParent && aPeer, E_INVALIDARG); … … 140 156 m = new Data(aParent); 141 157 142 unconst(m->pPeer) = aPeer; 143 144 AutoWriteLock thatlock(aPeer COMMA_LOCKVAL_SRC_POS); 145 m->bd.share(aPeer->m->bd); 158 /* sanity */ 159 AutoCaller peerCaller(aPeer); 160 AssertComRCReturnRC(peerCaller.rc()); 161 162 if (fReshare) 163 { 164 AutoWriteLock peerLock(aPeer COMMA_LOCKVAL_SRC_POS); 165 166 unconst(aPeer->m->pPeer) = this; 167 m->bd.attach (aPeer->m->bd); 168 } 169 else 170 { 171 unconst(m->pPeer) = aPeer; 172 173 AutoReadLock peerLock(aPeer COMMA_LOCKVAL_SRC_POS); 174 m->bd.share (aPeer->m->bd); 175 } 146 176 147 177 /* Confirm a successful initialization */ … … 206 236 // IUSBController properties 207 237 ///////////////////////////////////////////////////////////////////////////// 208 209 STDMETHODIMP USBController::COMGETTER(Enabled)(BOOL *aEnabled) 210 { 211 CheckComArgOutPointerValid(aEnabled); 238 STDMETHODIMP USBController::COMGETTER(Name) (BSTR *aName) 239 { 240 CheckComArgOutPointerValid(aName); 212 241 213 242 AutoCaller autoCaller(this); 214 243 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 215 244 245 /* strName is constant during life time, no need to lock */ 246 m->bd->strName.cloneTo(aName); 247 248 return S_OK; 249 } 250 251 STDMETHODIMP USBController::COMGETTER(Type)(USBControllerType_T *aType) 252 { 253 CheckComArgOutPointerValid(aType); 254 255 AutoCaller autoCaller(this); 256 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 257 216 258 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 217 259 218 *aEnabled = m->bd->fEnabled; 219 220 return S_OK; 221 } 222 223 224 STDMETHODIMP USBController::COMSETTER(Enabled)(BOOL aEnabled) 225 { 226 LogFlowThisFunc(("aEnabled=%RTbool\n", aEnabled)); 260 *aType = m->bd->enmType; 261 262 return S_OK; 263 } 264 265 STDMETHODIMP USBController::COMGETTER(USBStandard)(USHORT *aUSBStandard) 266 { 267 CheckComArgOutPointerValid(aUSBStandard); 227 268 228 269 AutoCaller autoCaller(this); 229 270 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 230 271 231 /* the machine needs to be mutable */ 232 AutoMutableStateDependency adep(m->pParent); 233 if (FAILED(adep.rc())) return adep.rc(); 234 235 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 236 237 if (m->bd->fEnabled != aEnabled) 272 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 273 274 switch (m->bd->enmType) 238 275 { 239 m->bd.backup(); 240 m->bd->fEnabled = aEnabled; 241 242 // leave the lock for safety 243 alock.release(); 244 245 AutoWriteLock mlock(m->pParent COMMA_LOCKVAL_SRC_POS); 246 m->pParent->setModified(Machine::IsModified_USB); 247 mlock.release(); 248 249 m->pParent->onUSBControllerChange(); 276 case USBControllerType_OHCI: 277 *aUSBStandard = 0x0101; 278 break; 279 case USBControllerType_EHCI: 280 *aUSBStandard = 0x0200; 281 break; 282 default: 283 AssertMsgFailedReturn(("Invalid controller type %d\n", m->bd->enmType), 284 E_FAIL); 250 285 } 251 286 … … 253 288 } 254 289 255 STDMETHODIMP USBController::COMGETTER(EnabledEHCI)(BOOL *aEnabled)256 {257 CheckComArgOutPointerValid(aEnabled);258 259 AutoCaller autoCaller(this);260 if (FAILED(autoCaller.rc())) return autoCaller.rc();261 262 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);263 264 *aEnabled = m->bd->fEnabledEHCI;265 266 return S_OK;267 }268 269 STDMETHODIMP USBController::COMSETTER(EnabledEHCI)(BOOL aEnabled)270 {271 LogFlowThisFunc(("aEnabled=%RTbool\n", aEnabled));272 273 AutoCaller autoCaller(this);274 if (FAILED(autoCaller.rc())) return autoCaller.rc();275 276 /* the machine needs to be mutable */277 AutoMutableStateDependency adep(m->pParent);278 if (FAILED(adep.rc())) return adep.rc();279 280 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);281 282 if (m->bd->fEnabledEHCI != aEnabled)283 {284 m->bd.backup();285 m->bd->fEnabledEHCI = aEnabled;286 287 // leave the lock for safety288 alock.release();289 290 AutoWriteLock mlock(m->pParent COMMA_LOCKVAL_SRC_POS);291 m->pParent->setModified(Machine::IsModified_USB);292 mlock.release();293 294 m->pParent->onUSBControllerChange();295 }296 297 return S_OK;298 }299 300 STDMETHODIMP USBController::COMGETTER(ProxyAvailable)(BOOL *aEnabled)301 {302 CheckComArgOutPointerValid(aEnabled);303 304 AutoCaller autoCaller(this);305 if (FAILED(autoCaller.rc())) return autoCaller.rc();306 307 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);308 309 #ifdef VBOX_WITH_USB310 *aEnabled = true;311 #else312 *aEnabled = false;313 #endif314 315 return S_OK;316 }317 318 STDMETHODIMP USBController::COMGETTER(USBStandard)(USHORT *aUSBStandard)319 {320 CheckComArgOutPointerValid(aUSBStandard);321 322 AutoCaller autoCaller(this);323 if (FAILED(autoCaller.rc())) return autoCaller.rc();324 325 /* not accessing data -- no need to lock */326 327 /** @todo This is no longer correct */328 *aUSBStandard = 0x0101;329 330 return S_OK;331 }332 333 290 // public methods only for internal purposes 334 291 ///////////////////////////////////////////////////////////////////////////// 335 336 /**337 * Loads settings from the given machine node.338 * May be called once right after this object creation.339 *340 * @param aMachineNode <Machine> node.341 *342 * @note Does not lock "this" as Machine::loadHardware, which calls this, does not lock either.343 */344 HRESULT USBController::loadSettings(const settings::USBController &data)345 {346 AutoCaller autoCaller(this);347 AssertComRCReturnRC(autoCaller.rc());348 349 /* Note: we assume that the default values for attributes of optional350 * nodes are assigned in the Data::Data() constructor and don't do it351 * here. It implies that this method may only be called after constructing352 * a new BIOSSettings object while all its data fields are in the default353 * values. Exceptions are fields whose creation time defaults don't match354 * values that should be applied when these fields are not explicitly set355 * in the settings file (for backwards compatibility reasons). This takes356 * place when a setting of a newly created object must default to A while357 * the same setting of an object loaded from the old settings file must358 * default to B. */359 360 m->bd->fEnabled = data.fEnabled;361 m->bd->fEnabledEHCI = data.fEnabledEHCI;362 363 return S_OK;364 }365 366 /**367 * Saves settings to the given machine node.368 *369 * @param aMachineNode <Machine> node.370 *371 * @note Locks this object for reading.372 */373 HRESULT USBController::saveSettings(settings::USBController &data)374 {375 AutoCaller autoCaller(this);376 if (FAILED(autoCaller.rc())) return autoCaller.rc();377 378 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);379 380 data.fEnabled = !!m->bd->fEnabled;381 data.fEnabledEHCI = !!m->bd->fEnabledEHCI;382 383 return S_OK;384 }385 292 386 293 /** @note Locks objects for writing! */ … … 460 367 } 461 368 369 /** 370 * Cancels sharing (if any) by making an independent copy of data. 371 * This operation also resets this object's peer to NULL. 372 * 373 * @note Locks this object for writing, together with the peer object 374 * represented by @a aThat (locked for reading). 375 */ 376 void USBController::unshare() 377 { 378 /* sanity */ 379 AutoCaller autoCaller(this); 380 AssertComRCReturnVoid (autoCaller.rc()); 381 382 /* sanity too */ 383 AutoCaller peerCaller (m->pPeer); 384 AssertComRCReturnVoid (peerCaller.rc()); 385 386 /* peer is not modified, lock it for reading (m->pPeer is "master" so locked 387 * first) */ 388 AutoReadLock rl(m->pPeer COMMA_LOCKVAL_SRC_POS); 389 AutoWriteLock wl(this COMMA_LOCKVAL_SRC_POS); 390 391 if (m->bd.isShared()) 392 { 393 if (!m->bd.isBackedUp()) 394 m->bd.backup(); 395 396 m->bd.commit(); 397 } 398 399 unconst(m->pPeer) = NULL; 400 } 401 402 const Utf8Str& USBController::getName() const 403 { 404 return m->bd->strName; 405 } 406 407 USBControllerType_T USBController::getControllerType() const 408 { 409 return m->bd->enmType; 410 } 411 412 ComObjPtr<USBController> USBController::getPeer() 413 { 414 return m->pPeer; 415 } 416 462 417 // private methods 463 418 ///////////////////////////////////////////////////////////////////////////// -
trunk/src/VBox/Main/src-server/USBDeviceFiltersImpl.cpp
r47390 r47401 497 497 * @note Does not lock "this" as Machine::loadHardware, which calls this, does not lock either. 498 498 */ 499 HRESULT USBDeviceFilters::loadSettings(const settings::USB Controller&data)499 HRESULT USBDeviceFilters::loadSettings(const settings::USB &data) 500 500 { 501 501 AutoCaller autoCaller(this); … … 540 540 * @note Locks this object for reading. 541 541 */ 542 HRESULT USBDeviceFilters::saveSettings(settings::USB Controller&data)542 HRESULT USBDeviceFilters::saveSettings(settings::USB &data) 543 543 { 544 544 AutoCaller autoCaller(this); -
trunk/src/VBox/Main/xml/Settings.cpp
r47246 r47401 1711 1711 { 1712 1712 return ( (this == &u) 1713 || ( (fEnabled == u.fEnabled) 1714 && (fEnabledEHCI == u.fEnabledEHCI) 1715 && (llDeviceFilters == u.llDeviceFilters) 1713 || ( (strName == u.strName) 1714 && (enmType == u.enmType) 1715 ) 1716 ); 1717 } 1718 1719 /** 1720 * Comparison operator. This gets called from MachineConfigFile::operator==, 1721 * which in turn gets called from Machine::saveSettings to figure out whether 1722 * machine settings have really changed and thus need to be written out to disk. 1723 */ 1724 bool USB::operator==(const USB &u) const 1725 { 1726 return ( (this == &u) 1727 || ( (llUSBControllers == u.llUSBControllers) 1728 && (llDeviceFilters == u.llDeviceFilters) 1716 1729 ) 1717 1730 ); … … 1936 1949 && (vrdeSettings == h.vrdeSettings) 1937 1950 && (biosSettings == h.biosSettings) 1938 && (usb Controller == h.usbController)1951 && (usbSettings == h.usbSettings) 1939 1952 && (llNetworkAdapters == h.llNetworkAdapters) 1940 1953 && (llSerialPorts == h.llSerialPorts) … … 2968 2981 } 2969 2982 } 2970 else if (pelmHwChild->nameEquals("USBController")) 2971 { 2972 pelmHwChild->getAttributeValue("enabled", hw.usbController.fEnabled); 2973 pelmHwChild->getAttributeValue("enabledEhci", hw.usbController.fEnabledEHCI); 2983 else if ( (m->sv <= SettingsVersion_v1_14) 2984 && pelmHwChild->nameEquals("USBController")) 2985 { 2986 bool fEnabled = false; 2987 2988 pelmHwChild->getAttributeValue("enabled", fEnabled); 2989 if (fEnabled) 2990 { 2991 /* Create OHCI controller with default name. */ 2992 USBController ctrl; 2993 2994 ctrl.strName = "OHCI"; 2995 ctrl.enmType = USBControllerType_OHCI; 2996 hw.usbSettings.llUSBControllers.push_back(ctrl); 2997 } 2998 2999 pelmHwChild->getAttributeValue("enabledEhci", fEnabled); 3000 if (fEnabled) 3001 { 3002 /* Create OHCI controller with default name. */ 3003 USBController ctrl; 3004 3005 ctrl.strName = "EHCI"; 3006 ctrl.enmType = USBControllerType_EHCI; 3007 hw.usbSettings.llUSBControllers.push_back(ctrl); 3008 } 2974 3009 2975 3010 readUSBDeviceFilters(*pelmHwChild, 2976 hw.usbController.llDeviceFilters); 3011 hw.usbSettings.llDeviceFilters); 3012 } 3013 else if (pelmHwChild->nameEquals("USB")) 3014 { 3015 const xml::ElementNode *pelmUSBChild; 3016 3017 if ((pelmUSBChild = pelmHwChild->findChildElement("Controllers"))) 3018 { 3019 xml::NodesLoop nl2(*pelmUSBChild, "Controller"); 3020 const xml::ElementNode *pelmCtrl; 3021 3022 while ((pelmCtrl = nl2.forAllNodes())) 3023 { 3024 USBController ctrl; 3025 com::Utf8Str strCtrlType; 3026 3027 pelmCtrl->getAttributeValue("name", ctrl.strName); 3028 3029 if (pelmCtrl->getAttributeValue("type", strCtrlType)) 3030 { 3031 if (strCtrlType == "OHCI") 3032 ctrl.enmType = USBControllerType_OHCI; 3033 else if (strCtrlType == "EHCI") 3034 ctrl.enmType = USBControllerType_EHCI; 3035 else 3036 throw ConfigFileError(this, pelmCtrl, N_("Invalid value '%s' for Controller/@type attribute"), strCtrlType.c_str()); 3037 } 3038 3039 hw.usbSettings.llUSBControllers.push_back(ctrl); 3040 } 3041 } 3042 3043 if ((pelmUSBChild = pelmHwChild->findChildElement("DeviceFilters"))) 3044 readUSBDeviceFilters(*pelmUSBChild, hw.usbSettings.llDeviceFilters); 2977 3045 } 2978 3046 else if ( (m->sv < SettingsVersion_v1_7) … … 4206 4274 } 4207 4275 4208 xml::ElementNode *pelmUSB = pelmHardware->createChild("USBController"); 4209 pelmUSB->setAttribute("enabled", hw.usbController.fEnabled); 4210 pelmUSB->setAttribute("enabledEhci", hw.usbController.fEnabledEHCI); 4211 4212 buildUSBDeviceFilters(*pelmUSB, 4213 hw.usbController.llDeviceFilters, 4214 false); // fHostMode 4276 if (m->sv < SettingsVersion_v1_14) 4277 { 4278 bool fOhciEnabled = false; 4279 bool fEhciEnabled = false; 4280 xml::ElementNode *pelmUSB = pelmHardware->createChild("USBController"); 4281 4282 for (USBControllerList::const_iterator it = hardwareMachine.usbSettings.llUSBControllers.begin(); 4283 it != hardwareMachine.usbSettings.llUSBControllers.end(); 4284 ++it) 4285 { 4286 const USBController &ctrl = *it; 4287 4288 switch (ctrl.enmType) 4289 { 4290 case USBControllerType_OHCI: 4291 fOhciEnabled = true; 4292 break; 4293 case USBControllerType_EHCI: 4294 fEhciEnabled = true; 4295 break; 4296 default: 4297 AssertMsgFailed(("Unknown USB controller type %d\n", ctrl.enmType)); 4298 } 4299 } 4300 4301 pelmUSB->setAttribute("enabled", fOhciEnabled); 4302 pelmUSB->setAttribute("enabledEhci", fEhciEnabled); 4303 4304 buildUSBDeviceFilters(*pelmUSB, hw.usbSettings.llDeviceFilters, false /* fHostMode */); 4305 } 4306 else 4307 { 4308 xml::ElementNode *pelmUSB = pelmHardware->createChild("USB"); 4309 xml::ElementNode *pelmCtrls = pelmUSB->createChild("Controllers"); 4310 4311 for (USBControllerList::const_iterator it = hardwareMachine.usbSettings.llUSBControllers.begin(); 4312 it != hardwareMachine.usbSettings.llUSBControllers.end(); 4313 ++it) 4314 { 4315 const USBController &ctrl = *it; 4316 com::Utf8Str strType; 4317 xml::ElementNode *pelmCtrl = pelmCtrls->createChild("Controller"); 4318 4319 switch (ctrl.enmType) 4320 { 4321 case USBControllerType_OHCI: 4322 strType = "OHCI"; 4323 break; 4324 case USBControllerType_EHCI: 4325 strType = "EHCI"; 4326 break; 4327 default: 4328 AssertMsgFailed(("Unknown USB controller type %d\n", ctrl.enmType)); 4329 } 4330 4331 pelmCtrl->setAttribute("name", ctrl.strName); 4332 pelmCtrl->setAttribute("type", strType); 4333 } 4334 4335 xml::ElementNode *pelmFilters = pelmUSB->createChild("DeviceFilters"); 4336 buildUSBDeviceFilters(*pelmFilters, hw.usbSettings.llDeviceFilters, false /* fHostMode */); 4337 } 4215 4338 4216 4339 xml::ElementNode *pelmNetwork = pelmHardware->createChild("Network"); … … 5176 5299 } 5177 5300 5301 if (m->sv < SettingsVersion_v1_14) 5302 { 5303 unsigned cOhciCtrls = 0; 5304 unsigned cEhciCtrls = 0; 5305 bool fNonStdName = false; 5306 5307 for (USBControllerList::const_iterator it = hardwareMachine.usbSettings.llUSBControllers.begin(); 5308 it != hardwareMachine.usbSettings.llUSBControllers.end(); 5309 ++it) 5310 { 5311 const USBController &ctrl = *it; 5312 5313 switch (ctrl.enmType) 5314 { 5315 case USBControllerType_OHCI: 5316 cOhciCtrls++; 5317 if (ctrl.strName != "OHCI") 5318 fNonStdName = true; 5319 break; 5320 case USBControllerType_EHCI: 5321 cEhciCtrls++; 5322 if (ctrl.strName != "EHCI") 5323 fNonStdName = true; 5324 break; 5325 default: 5326 AssertMsgFailed(("Unknown USB controller type %d\n", ctrl.enmType)); 5327 } 5328 5329 /* Skip checking other controllers if the settings bump is necessary. */ 5330 if (cOhciCtrls > 1 || cEhciCtrls > 1 || fNonStdName) 5331 { 5332 m->sv = SettingsVersion_v1_14; 5333 break; 5334 } 5335 } 5336 } 5337 5178 5338 if (m->sv < SettingsVersion_v1_13) 5179 5339 {
Note:
See TracChangeset
for help on using the changeset viewer.