Changeset 25198 in vbox
- Timestamp:
- Dec 4, 2009 5:53:00 PM (15 years ago)
- Location:
- trunk/src/VBox/Main
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/MachineImpl.cpp
r25194 r25198 3830 3830 ++it) 3831 3831 { 3832 if ((*it)-> storageBus() == aConnectionType)3833 { 3834 ULONG ulCurInst = (*it)-> instance();3832 if ((*it)->getStorageBus() == aConnectionType) 3833 { 3834 ULONG ulCurInst = (*it)->getInstance(); 3835 3835 3836 3836 if (ulCurInst >= ulInstance) … … 3885 3885 ++it) 3886 3886 { 3887 if ((*it)-> instance() == aInstance)3887 if ((*it)->getInstance() == aInstance) 3888 3888 { 3889 3889 (*it).queryInterfaceTo(aStorageController); … … 6194 6194 return setError(E_FAIL, 6195 6195 tr("Duplicate attachments for storage controller '%s', port %d, device %d of the virtual machine '%ls'"), 6196 aStorageController-> name().raw(), (*it).lPort, (*it).lDevice, mUserData->mName.raw());6196 aStorageController->getName().raw(), (*it).lPort, (*it).lDevice, mUserData->mName.raw()); 6197 6197 } 6198 6198 } … … 6338 6338 break; 6339 6339 6340 const Bstr controllerName = aStorageController-> name();6340 const Bstr controllerName = aStorageController->getName(); 6341 6341 ComObjPtr<MediumAttachment> pAttachment; 6342 6342 pAttachment.createObject(); … … 6461 6461 ++it) 6462 6462 { 6463 if ((*it)-> name() == aName)6463 if ((*it)->getName() == aName) 6464 6464 { 6465 6465 aStorageController = (*it); … … 7095 7095 7096 7096 settings::StorageController ctl; 7097 ctl.strName = pCtl-> name();7098 ctl.controllerType = pCtl-> controllerType();7099 ctl.storageBus = pCtl-> storageBus();7100 ctl.ulInstance = pCtl-> instance();7097 ctl.strName = pCtl->getName(); 7098 ctl.controllerType = pCtl->getControllerType(); 7099 ctl.storageBus = pCtl->getStorageBus(); 7100 ctl.ulInstance = pCtl->getInstance(); 7101 7101 7102 7102 /* Save the port count. */ … … 7135 7135 MediaData::AttachmentList atts; 7136 7136 7137 HRESULT rc = getMediumAttachmentsOfController(Bstr(aStorageController-> name()), atts);7137 HRESULT rc = getMediumAttachmentsOfController(Bstr(aStorageController->getName()), atts); 7138 7138 if (FAILED(rc)) return rc; 7139 7139 … … 8171 8171 8172 8172 /* look if this controller has a peer device */ 8173 ComObjPtr<StorageController> peer = (*it)-> peer();8173 ComObjPtr<StorageController> peer = (*it)->getPeer(); 8174 8174 if (!peer) 8175 8175 { -
trunk/src/VBox/Main/StorageControllerImpl.cpp
r25149 r25198 38 38 ///////////////////////////////////////////////////////////////////////////// 39 39 40 struct BackupableStorageControllerData 41 { 42 /* Constructor. */ 43 BackupableStorageControllerData() 44 : mStorageBus(StorageBus_IDE), 45 mStorageControllerType(StorageControllerType_PIIX4), 46 mInstance(0), 47 mPortCount(2), 48 mPortIde0Master(0), 49 mPortIde0Slave(1), 50 mPortIde1Master(2), 51 mPortIde1Slave(3) 52 { } 53 54 bool operator==(const BackupableStorageControllerData &that) const 55 { 56 return this == &that 57 || ( (mStorageControllerType == that.mStorageControllerType) 58 && (strName == that.strName) 59 && (mPortCount == that.mPortCount) 60 && (mPortIde0Master == that.mPortIde0Master) 61 && (mPortIde0Slave == that.mPortIde0Slave) 62 && (mPortIde1Master == that.mPortIde1Master) 63 && (mPortIde1Slave == that.mPortIde1Slave)); 64 } 65 66 /** Unique name of the storage controller. */ 67 Utf8Str strName; 68 /** The connection type of thestorage controller. */ 69 StorageBus_T mStorageBus; 70 /** Type of the Storage controller. */ 71 StorageControllerType_T mStorageControllerType; 72 /** Instance number of the storage controller. */ 73 ULONG mInstance; 74 /** Number of usable ports. */ 75 ULONG mPortCount; 76 77 /** The following is only for the SATA controller atm. */ 78 /** Port which acts as primary master for ide emulation. */ 79 ULONG mPortIde0Master; 80 /** Port which acts as primary slave for ide emulation. */ 81 ULONG mPortIde0Slave; 82 /** Port which acts as secondary master for ide emulation. */ 83 ULONG mPortIde1Master; 84 /** Port which acts as secondary slave for ide emulation. */ 85 ULONG mPortIde1Slave; 86 }; 87 88 struct StorageController::Data 89 { 90 const ComObjPtr<Machine, ComWeakRef> pParent; 91 const ComObjPtr<StorageController> pPeer; 92 93 Backupable<BackupableStorageControllerData> bd; 94 }; 95 40 96 // constructor / destructor 41 97 ///////////////////////////////////////////////////////////////////////////// 42 43 DEFINE_EMPTY_CTOR_DTOR (StorageController)44 98 45 99 HRESULT StorageController::FinalConstruct() … … 82 136 AssertReturn(autoInitSpan.isOk(), E_FAIL); 83 137 84 unconst(mParent) = aParent; 85 /* mPeer is left null */ 138 m = new Data(); 139 140 unconst(m->pParent) = aParent; 141 /* m->pPeer is left null */ 86 142 87 143 /* register with parent early, since uninit() will unconditionally 88 144 * unregister on failure */ 89 m Parent->addDependentChild (this);90 91 m Data.allocate();92 93 m Data->strName = aName;94 m Data->mInstance = aInstance;95 m Data->mStorageBus = aStorageBus;145 m->pParent->addDependentChild (this); 146 147 m->bd.allocate(); 148 149 m->bd->strName = aName; 150 m->bd->mInstance = aInstance; 151 m->bd->mStorageBus = aStorageBus; 96 152 97 153 switch (aStorageBus) 98 154 { 99 155 case StorageBus_IDE: 100 m Data->mPortCount = 2;101 m Data->mStorageControllerType = StorageControllerType_PIIX4;156 m->bd->mPortCount = 2; 157 m->bd->mStorageControllerType = StorageControllerType_PIIX4; 102 158 break; 103 159 case StorageBus_SATA: 104 m Data->mPortCount = 30;105 m Data->mStorageControllerType = StorageControllerType_IntelAhci;160 m->bd->mPortCount = 30; 161 m->bd->mStorageControllerType = StorageControllerType_IntelAhci; 106 162 break; 107 163 case StorageBus_SCSI: 108 m Data->mPortCount = 16;109 m Data->mStorageControllerType = StorageControllerType_LsiLogic;164 m->bd->mPortCount = 16; 165 m->bd->mStorageControllerType = StorageControllerType_LsiLogic; 110 166 break; 111 167 case StorageBus_Floppy: 112 168 /** @todo allow 2 floppies later */ 113 m Data->mPortCount = 1;114 m Data->mStorageControllerType = StorageControllerType_I82078;169 m->bd->mPortCount = 1; 170 m->bd->mStorageControllerType = StorageControllerType_I82078; 115 171 break; 116 172 } … … 138 194 * reading if @a aReshare is false. 139 195 */ 140 HRESULT StorageController::init 141 142 196 HRESULT StorageController::init(Machine *aParent, 197 StorageController *aThat, 198 bool aReshare /* = false */) 143 199 { 144 200 LogFlowThisFunc(("aParent=%p, aThat=%p, aReshare=%RTbool\n", … … 151 207 AssertReturn(autoInitSpan.isOk(), E_FAIL); 152 208 153 unconst(mParent) = aParent; 209 m = new Data(); 210 211 unconst(m->pParent) = aParent; 154 212 155 213 /* register with parent early, since uninit() will unconditionally 156 214 * unregister on failure */ 157 m Parent->addDependentChild (this);215 m->pParent->addDependentChild (this); 158 216 159 217 /* sanity */ … … 165 223 AutoWriteLock thatLock (aThat); 166 224 167 unconst(aThat->m Peer) = this;168 m Data.attach (aThat->mData);225 unconst(aThat->m->pPeer) = this; 226 m->bd.attach (aThat->m->bd); 169 227 } 170 228 else 171 229 { 172 unconst(m Peer) = aThat;230 unconst(m->pPeer) = aThat; 173 231 174 232 AutoReadLock thatLock (aThat); 175 m Data.share (aThat->mData);233 m->bd.share (aThat->m->bd); 176 234 } 177 235 … … 187 245 * of the original object passed as an argument. 188 246 */ 189 HRESULT StorageController::initCopy 247 HRESULT StorageController::initCopy(Machine *aParent, StorageController *aThat) 190 248 { 191 249 LogFlowThisFunc(("aParent=%p, aThat=%p\n", aParent, aThat)); … … 197 255 AssertReturn(autoInitSpan.isOk(), E_FAIL); 198 256 199 unconst(mParent) = aParent; 200 /* mPeer is left null */ 201 202 mParent->addDependentChild (this); 257 m = new Data(); 258 259 unconst(m->pParent) = aParent; 260 /* m->pPeer is left null */ 261 262 m->pParent->addDependentChild (this); 203 263 204 264 AutoCaller thatCaller (aThat); … … 206 266 207 267 AutoReadLock thatlock (aThat); 208 m Data.attachCopy (aThat->mData);268 m->bd.attachCopy (aThat->m->bd); 209 269 210 270 /* Confirm a successful initialization */ … … 228 288 return; 229 289 230 mData.free(); 231 232 mParent->removeDependentChild (this); 233 234 unconst(mPeer).setNull(); 235 unconst(mParent).setNull(); 290 m->bd.free(); 291 292 m->pParent->removeDependentChild (this); 293 294 unconst(m->pPeer).setNull(); 295 unconst(m->pParent).setNull(); 296 297 delete m; 298 m = NULL; 236 299 } 237 300 … … 247 310 248 311 /* mName is constant during life time, no need to lock */ 249 m Data.data()->strName.cloneTo(aName);312 m->bd.data()->strName.cloneTo(aName); 250 313 251 314 return S_OK; … … 261 324 AutoReadLock alock(this); 262 325 263 *aBus = m Data->mStorageBus;326 *aBus = m->bd->mStorageBus; 264 327 265 328 return S_OK; … … 275 338 AutoReadLock alock(this); 276 339 277 *aControllerType = m Data->mStorageControllerType;340 *aControllerType = m->bd->mStorageControllerType; 278 341 279 342 return S_OK; … … 289 352 HRESULT rc = S_OK; 290 353 291 switch (m Data->mStorageBus)354 switch (m->bd->mStorageBus) 292 355 { 293 356 case StorageBus_IDE: … … 319 382 } 320 383 default: 321 AssertMsgFailed(("Invalid controller type %d\n", m Data->mStorageBus));384 AssertMsgFailed(("Invalid controller type %d\n", m->bd->mStorageBus)); 322 385 } 323 386 … … 327 390 aControllerType); 328 391 329 m Data->mStorageControllerType = aControllerType;392 m->bd->mStorageControllerType = aControllerType; 330 393 331 394 return S_OK; … … 342 405 343 406 ComPtr<IVirtualBox> VBox; 344 HRESULT rc = m Parent->COMGETTER(Parent)(VBox.asOutParam());407 HRESULT rc = m->pParent->COMGETTER(Parent)(VBox.asOutParam()); 345 408 if (FAILED(rc)) 346 409 return rc; … … 351 414 return rc; 352 415 353 rc = sysProps->GetMaxDevicesPerPortForStorageBus(m Data->mStorageBus, aMaxDevices);416 rc = sysProps->GetMaxDevicesPerPortForStorageBus(m->bd->mStorageBus, aMaxDevices); 354 417 return rc; 355 418 } … … 365 428 366 429 ComPtr<IVirtualBox> VBox; 367 HRESULT rc = m Parent->COMGETTER(Parent)(VBox.asOutParam());430 HRESULT rc = m->pParent->COMGETTER(Parent)(VBox.asOutParam()); 368 431 if (FAILED(rc)) 369 432 return rc; … … 374 437 return rc; 375 438 376 rc = sysProps->GetMinPortCountForStorageBus(m Data->mStorageBus, aMinPortCount);439 rc = sysProps->GetMinPortCountForStorageBus(m->bd->mStorageBus, aMinPortCount); 377 440 return rc; 378 441 } … … 388 451 389 452 ComPtr<IVirtualBox> VBox; 390 HRESULT rc = m Parent->COMGETTER(Parent)(VBox.asOutParam());453 HRESULT rc = m->pParent->COMGETTER(Parent)(VBox.asOutParam()); 391 454 if (FAILED(rc)) 392 455 return rc; … … 397 460 return rc; 398 461 399 rc = sysProps->GetMaxPortCountForStorageBus(m Data->mStorageBus, aMaxPortCount);462 rc = sysProps->GetMaxPortCountForStorageBus(m->bd->mStorageBus, aMaxPortCount); 400 463 return rc; 401 464 } … … 411 474 AutoReadLock alock(this); 412 475 413 *aPortCount = m Data->mPortCount;476 *aPortCount = m->bd->mPortCount; 414 477 415 478 return S_OK; … … 421 484 LogFlowThisFunc(("aPortCount=%u\n", aPortCount)); 422 485 423 switch (m Data->mStorageBus)486 switch (m->bd->mStorageBus) 424 487 { 425 488 case StorageBus_SATA: … … 470 533 } 471 534 default: 472 AssertMsgFailed(("Invalid controller type %d\n", m Data->mStorageBus));535 AssertMsgFailed(("Invalid controller type %d\n", m->bd->mStorageBus)); 473 536 } 474 537 … … 477 540 478 541 /* the machine needs to be mutable */ 479 Machine::AutoMutableStateDependency adep(m Parent);542 Machine::AutoMutableStateDependency adep(m->pParent); 480 543 if (FAILED(adep.rc())) return adep.rc(); 481 544 482 545 AutoWriteLock alock(this); 483 546 484 if (m Data->mPortCount != aPortCount)485 { 486 m Data.backup();487 m Data->mPortCount = aPortCount;547 if (m->bd->mPortCount != aPortCount) 548 { 549 m->bd.backup(); 550 m->bd->mPortCount = aPortCount; 488 551 489 552 /* leave the lock for safety */ 490 553 alock.leave(); 491 554 492 m Parent->onStorageControllerChange ();555 m->pParent->onStorageControllerChange (); 493 556 } 494 557 … … 505 568 AutoReadLock alock(this); 506 569 507 *aInstance = m Data->mInstance;570 *aInstance = m->bd->mInstance; 508 571 509 572 return S_OK; … … 519 582 AutoWriteLock alock(this); 520 583 521 m Data->mInstance = aInstance;584 m->bd->mInstance = aInstance; 522 585 523 586 return S_OK; … … 536 599 AutoReadLock alock(this); 537 600 538 if (m Data->mStorageControllerType != StorageControllerType_IntelAhci)601 if (m->bd->mStorageControllerType != StorageControllerType_IntelAhci) 539 602 return setError (E_NOTIMPL, 540 603 tr ("Invalid controller type")); … … 543 606 { 544 607 case 0: 545 *aPortNumber = m Data->mPortIde0Master;608 *aPortNumber = m->bd->mPortIde0Master; 546 609 break; 547 610 case 1: 548 *aPortNumber = m Data->mPortIde0Slave;611 *aPortNumber = m->bd->mPortIde0Slave; 549 612 break; 550 613 case 2: 551 *aPortNumber = m Data->mPortIde1Master;614 *aPortNumber = m->bd->mPortIde1Master; 552 615 break; 553 616 case 3: 554 *aPortNumber = m Data->mPortIde1Slave;617 *aPortNumber = m->bd->mPortIde1Slave; 555 618 break; 556 619 default: … … 567 630 568 631 /* the machine needs to be mutable */ 569 Machine::AutoMutableStateDependency adep(m Parent);632 Machine::AutoMutableStateDependency adep(m->pParent); 570 633 if (FAILED(adep.rc())) return adep.rc(); 571 634 AutoWriteLock alock(this); 572 635 573 if (m Data->mStorageControllerType != StorageControllerType_IntelAhci)636 if (m->bd->mStorageControllerType != StorageControllerType_IntelAhci) 574 637 return setError (E_NOTIMPL, 575 638 tr ("Invalid controller type")); … … 583 646 { 584 647 case 0: 585 m Data->mPortIde0Master = aPortNumber;648 m->bd->mPortIde0Master = aPortNumber; 586 649 break; 587 650 case 1: 588 m Data->mPortIde0Slave = aPortNumber;651 m->bd->mPortIde0Slave = aPortNumber; 589 652 break; 590 653 case 2: 591 m Data->mPortIde1Master = aPortNumber;654 m->bd->mPortIde1Master = aPortNumber; 592 655 break; 593 656 case 3: 594 m Data->mPortIde1Slave = aPortNumber;657 m->bd->mPortIde1Slave = aPortNumber; 595 658 break; 596 659 default: … … 604 667 ///////////////////////////////////////////////////////////////////////////// 605 668 669 670 const Utf8Str& StorageController::getName() const 671 { 672 return m->bd->strName; 673 } 674 675 StorageControllerType_T StorageController::getControllerType() const 676 { 677 return m->bd->mStorageControllerType; 678 } 679 680 StorageBus_T StorageController::getStorageBus() const 681 { 682 return m->bd->mStorageBus; 683 } 684 685 ULONG StorageController::getInstance() const 686 { 687 return m->bd->mInstance; 688 } 689 690 bool StorageController::isModified() 691 { 692 AutoWriteLock alock(this); 693 return m->bd.isBackedUp(); 694 } 695 696 bool StorageController::isReallyModified() 697 { 698 AutoWriteLock alock(this); 699 return m->bd.hasActualChanges(); 700 } 701 606 702 /** @note Locks objects for writing! */ 607 703 bool StorageController::rollback() … … 614 710 bool dataChanged = false; 615 711 616 if (m Data.isBackedUp())712 if (m->bd.isBackedUp()) 617 713 { 618 714 /* we need to check all data to see whether anything will be changed 619 715 * after rollback */ 620 dataChanged = m Data.hasActualChanges();621 m Data.rollback();716 dataChanged = m->bd.hasActualChanges(); 717 m->bd.rollback(); 622 718 } 623 719 … … 636 732 637 733 /* sanity too */ 638 AutoCaller peerCaller (m Peer);734 AutoCaller peerCaller (m->pPeer); 639 735 AssertComRCReturnVoid (peerCaller.rc()); 640 736 641 /* lock both for writing since we modify both (m Peer is "master" so locked737 /* lock both for writing since we modify both (m->pPeer is "master" so locked 642 738 * first) */ 643 AutoMultiWriteLock2 alock (m Peer, this);644 645 if (m Data.isBackedUp())646 { 647 m Data.commit();648 if (m Peer)739 AutoMultiWriteLock2 alock (m->pPeer, this); 740 741 if (m->bd.isBackedUp()) 742 { 743 m->bd.commit(); 744 if (m->pPeer) 649 745 { 650 746 // attach new data to the peer and reshare it 651 m Peer->mData.attach (mData);747 m->pPeer->m->bd.attach (m->bd); 652 748 } 653 749 } … … 668 764 669 765 /* sanity too */ 670 AutoCaller peerCaller (m Peer);766 AutoCaller peerCaller (m->pPeer); 671 767 AssertComRCReturnVoid (peerCaller.rc()); 672 768 673 /* peer is not modified, lock it for reading (m Peer is "master" so locked769 /* peer is not modified, lock it for reading (m->pPeer is "master" so locked 674 770 * first) */ 675 AutoMultiLock2 alock (mPeer->rlock(), this->wlock()); 676 677 if (mData.isShared()) 678 { 679 if (!mData.isBackedUp()) 680 mData.backup(); 681 682 mData.commit(); 683 } 684 685 unconst(mPeer).setNull(); 771 AutoMultiLock2 alock (m->pPeer->rlock(), this->wlock()); 772 773 if (m->bd.isShared()) 774 { 775 if (!m->bd.isBackedUp()) 776 m->bd.backup(); 777 778 m->bd.commit(); 779 } 780 781 unconst(m->pPeer).setNull(); 782 } 783 784 const ComObjPtr<Machine, ComWeakRef>& StorageController::getMachine() 785 { 786 return m->pParent; 787 } 788 789 ComObjPtr<StorageController> StorageController::getPeer() 790 { 791 return m->pPeer; 686 792 } 687 793 688 794 // private methods 689 795 ///////////////////////////////////////////////////////////////////////////// 796 797 690 798 /* vi: set tabstop=4 shiftwidth=4 expandtab: */ -
trunk/src/VBox/Main/USBDeviceImpl.cpp
r25149 r25198 23 23 24 24 #include "USBDeviceImpl.h" 25 25 #include "Logging.h" 26 26 27 27 // constructor / destructor -
trunk/src/VBox/Main/include/StorageControllerImpl.h
r25184 r25198 27 27 #include "VirtualBoxBase.h" 28 28 29 #include <list>30 31 29 class Machine; 32 30 … … 37 35 VBOX_SCRIPTABLE_IMPL(IStorageController) 38 36 { 39 private:40 41 struct Data42 {43 /* Constructor. */44 Data() : mStorageBus (StorageBus_IDE),45 mStorageControllerType (StorageControllerType_PIIX4),46 mInstance (0),47 mPortCount (2),48 mPortIde0Master (0),49 mPortIde0Slave (1),50 mPortIde1Master (2),51 mPortIde1Slave (3) { }52 53 bool operator== (const Data &that) const54 {55 return this == &that56 || ( (mStorageControllerType == that.mStorageControllerType)57 && (strName == that.strName)58 && (mPortCount == that.mPortCount)59 && (mPortIde0Master == that.mPortIde0Master)60 && (mPortIde0Slave == that.mPortIde0Slave)61 && (mPortIde1Master == that.mPortIde1Master)62 && (mPortIde1Slave == that.mPortIde1Slave));63 }64 65 /** Unique name of the storage controller. */66 Utf8Str strName;67 /** The connection type of thestorage controller. */68 StorageBus_T mStorageBus;69 /** Type of the Storage controller. */70 StorageControllerType_T mStorageControllerType;71 /** Instance number of the storage controller. */72 ULONG mInstance;73 /** Number of usable ports. */74 ULONG mPortCount;75 76 /** The following is only for the SATA controller atm. */77 /** Port which acts as primary master for ide emulation. */78 ULONG mPortIde0Master;79 /** Port which acts as primary slave for ide emulation. */80 ULONG mPortIde0Slave;81 /** Port which acts as secondary master for ide emulation. */82 ULONG mPortIde1Master;83 /** Port which acts as secondary slave for ide emulation. */84 ULONG mPortIde1Slave;85 };86 87 37 public: 88 38 … … 99 49 END_COM_MAP() 100 50 101 DECLARE_EMPTY_CTOR_DTOR (StorageController) 51 StorageController() { }; 52 ~StorageController() { }; 102 53 103 54 HRESULT FinalConstruct(); … … 135 86 // public methods only for internal purposes 136 87 137 const Utf8Str & name() const { return mData->strName; }138 StorageControllerType_T controllerType() const { return mData->mStorageControllerType; }139 StorageBus_T storageBus() const { return mData->mStorageBus; }140 ULONG instance() const { return mData->mInstance; }88 const Utf8Str &getName() const; 89 StorageControllerType_T getControllerType() const; 90 StorageBus_T getStorageBus() const; 91 ULONG getInstance() const; 141 92 142 bool isModified() { AutoWriteLock alock (this); return mData.isBackedUp(); }143 bool isReallyModified() { AutoWriteLock alock (this); return mData.hasActualChanges(); }93 bool isModified(); 94 bool isReallyModified(); 144 95 bool rollback(); 145 96 void commit(); … … 151 102 152 103 /** @note this doesn't require a read lock since mParent is constant. */ 153 const ComObjPtr<Machine, ComWeakRef> &parent() { return mParent; };104 const ComObjPtr<Machine, ComWeakRef>& getMachine(); 154 105 155 const Backupable<Data> &data() { return mData; } 156 ComObjPtr<StorageController> peer() { return mPeer; } 106 ComObjPtr<StorageController> getPeer(); 157 107 158 108 // for VirtualBoxSupportErrorInfoImpl … … 163 113 void printList(); 164 114 165 /** Parent object. */ 166 const ComObjPtr<Machine, ComWeakRef> mParent; 167 /** Peer object. */ 168 const ComObjPtr<StorageController> mPeer; 169 /** Data. */ 170 Backupable<Data> mData; 115 struct Data; 116 Data *m; 171 117 }; 172 118 -
trunk/src/VBox/Main/include/USBDeviceImpl.h
r23223 r25198 25 25 26 26 #include "VirtualBoxBase.h" 27 #include "Logging.h"28 29 27 30 28 /**
Note:
See TracChangeset
for help on using the changeset viewer.