67
68
HRESULT SystemProperties::init (VirtualBox *aParent)
69
LogFlowThisFunc (("aParent=%p\n", aParent));
70
LogFlowThisFunc(("aParent=%p\n", aParent));
71
72
ComAssertRet (aParent, E_FAIL);
73
74
/* Enclose the state transition NotReady->InInit->Ready */
74
AutoInitSpan autoInitSpan (this);
75
AssertReturn (autoInitSpan.isOk(), E_FAIL);
77
unconst (mParent) = aParent;
79
setDefaultMachineFolder (NULL);
80
setDefaultHardDiskFolder (NULL);
81
setDefaultHardDiskFormat (NULL);
83
setRemoteDisplayAuthLibrary (NULL);
75
AutoInitSpan autoInitSpan(this);
76
AssertReturn(autoInitSpan.isOk(), E_FAIL);
78
unconst(mParent) = aParent;
80
setDefaultMachineFolder(Utf8Str::Null);
81
setDefaultHardDiskFolder(Utf8Str::Null);
82
setDefaultHardDiskFormat(Utf8Str::Null);
84
setRemoteDisplayAuthLibrary(Utf8Str::Null);
85
86
mLogHistoryCount = 3;
365
STDMETHODIMP SystemProperties::GetMaxDevicesPerPortForStorageBus (StorageBus_T aBus, ULONG *aMaxDevicesPerPort)
367
CheckComArgOutPointerValid(aMaxDevicesPerPort);
369
AutoCaller autoCaller(this);
370
CheckComRCReturnRC(autoCaller.rc());
372
/* no need to lock, this is const */
375
case StorageBus_SATA:
376
case StorageBus_SCSI:
378
/* SATA and both SCSI controllers only support one device per port. */
379
*aMaxDevicesPerPort = 1;
383
case StorageBus_Floppy:
385
/* The IDE and Floppy controllers support 2 devices. One as master
386
* and one as slave (or floppy drive 0 and 1). */
387
*aMaxDevicesPerPort = 2;
391
AssertMsgFailed(("Invalid bus type %d\n", aBus));
397
STDMETHODIMP SystemProperties::GetMinPortCountForStorageBus (StorageBus_T aBus, ULONG *aMinPortCount)
399
CheckComArgOutPointerValid(aMinPortCount);
401
AutoCaller autoCaller(this);
402
CheckComRCReturnRC(autoCaller.rc());
404
/* no need to lock, this is const */
407
case StorageBus_SATA:
412
case StorageBus_SCSI:
422
case StorageBus_Floppy:
428
AssertMsgFailed(("Invalid bus type %d\n", aBus));
434
STDMETHODIMP SystemProperties::GetMaxPortCountForStorageBus (StorageBus_T aBus, ULONG *aMaxPortCount)
436
CheckComArgOutPointerValid(aMaxPortCount);
438
AutoCaller autoCaller(this);
439
CheckComRCReturnRC(autoCaller.rc());
441
/* no need to lock, this is const */
444
case StorageBus_SATA:
449
case StorageBus_SCSI:
459
case StorageBus_Floppy:
465
AssertMsgFailed(("Invalid bus type %d\n", aBus));
471
STDMETHODIMP SystemProperties::GetMaxInstancesOfStorageBus(StorageBus_T aBus, ULONG *aMaxInstances)
473
CheckComArgOutPointerValid(aMaxInstances);
475
AutoCaller autoCaller(this);
476
CheckComRCReturnRC(autoCaller.rc());
478
/* no need to lock, this is const */
481
case StorageBus_SATA:
482
case StorageBus_SCSI:
484
case StorageBus_Floppy:
486
/** @todo raise the limits ASAP, per bus type */
491
AssertMsgFailed(("Invalid bus type %d\n", aBus));
497
STDMETHODIMP SystemProperties::GetDeviceTypesForStorageBus(StorageBus_T aBus,
498
ComSafeArrayOut(DeviceType_T, aDeviceTypes))
500
CheckComArgOutSafeArrayPointerValid(aDeviceTypes);
502
AutoCaller autoCaller(this);
503
CheckComRCReturnRC(autoCaller.rc());
505
/* no need to lock, this is const */
510
com::SafeArray<DeviceType_T> saDeviceTypes(2);
511
saDeviceTypes[0] = DeviceType_DVD;
512
saDeviceTypes[1] = DeviceType_HardDisk;
513
saDeviceTypes.detachTo(ComSafeArrayOutArg(aDeviceTypes));
516
case StorageBus_SATA:
517
case StorageBus_SCSI:
519
com::SafeArray<DeviceType_T> saDeviceTypes(1);
520
saDeviceTypes[0] = DeviceType_HardDisk;
521
saDeviceTypes.detachTo(ComSafeArrayOutArg(aDeviceTypes));
524
case StorageBus_Floppy:
526
com::SafeArray<DeviceType_T> saDeviceTypes(1);
527
saDeviceTypes[0] = DeviceType_Floppy;
528
saDeviceTypes.detachTo(ComSafeArrayOutArg(aDeviceTypes));
532
AssertMsgFailed(("Invalid bus type %d\n", aBus));
364
538
STDMETHODIMP SystemProperties::COMGETTER(DefaultMachineFolder) (BSTR *aDefaultMachineFolder)
366
540
CheckComArgOutPointerValid(aDefaultMachineFolder);
368
AutoCaller autoCaller (this);
369
CheckComRCReturnRC (autoCaller.rc());
371
AutoReadLock alock (this);
373
mDefaultMachineFolderFull.cloneTo (aDefaultMachineFolder);
542
AutoCaller autoCaller(this);
543
CheckComRCReturnRC(autoCaller.rc());
545
AutoReadLock alock(this);
547
m_strDefaultMachineFolderFull.cloneTo(aDefaultMachineFolder);
378
552
STDMETHODIMP SystemProperties::COMSETTER(DefaultMachineFolder) (IN_BSTR aDefaultMachineFolder)
380
AutoCaller autoCaller (this);
381
CheckComRCReturnRC (autoCaller.rc());
554
AutoCaller autoCaller(this);
555
CheckComRCReturnRC(autoCaller.rc());
383
557
/* VirtualBox::saveSettings() needs a write lock */
384
558
AutoMultiWriteLock2 alock (mParent, this);
386
560
HRESULT rc = setDefaultMachineFolder (aDefaultMachineFolder);
388
562
rc = mParent->saveSettings();
395
569
CheckComArgOutPointerValid(aDefaultHardDiskFolder);
397
AutoCaller autoCaller (this);
398
CheckComRCReturnRC (autoCaller.rc());
400
AutoReadLock alock (this);
402
mDefaultHardDiskFolderFull.cloneTo (aDefaultHardDiskFolder);
571
AutoCaller autoCaller(this);
572
CheckComRCReturnRC(autoCaller.rc());
574
AutoReadLock alock(this);
576
m_strDefaultHardDiskFolderFull.cloneTo(aDefaultHardDiskFolder);
407
581
STDMETHODIMP SystemProperties::COMSETTER(DefaultHardDiskFolder) (IN_BSTR aDefaultHardDiskFolder)
409
AutoCaller autoCaller (this);
410
CheckComRCReturnRC (autoCaller.rc());
583
AutoCaller autoCaller(this);
584
CheckComRCReturnRC(autoCaller.rc());
412
586
/* VirtualBox::saveSettings() needs a write lock */
413
587
AutoMultiWriteLock2 alock (mParent, this);
415
589
HRESULT rc = setDefaultHardDiskFolder (aDefaultHardDiskFolder);
417
591
rc = mParent->saveSettings();
422
596
STDMETHODIMP SystemProperties::
423
COMGETTER(HardDiskFormats) (ComSafeArrayOut (IHardDiskFormat *, aHardDiskFormats))
597
COMGETTER(MediumFormats) (ComSafeArrayOut(IMediumFormat *, aMediumFormats))
425
if (ComSafeArrayOutIsNull (aHardDiskFormats))
599
if (ComSafeArrayOutIsNull(aMediumFormats))
426
600
return E_POINTER;
428
AutoCaller autoCaller (this);
429
CheckComRCReturnRC (autoCaller.rc());
431
AutoReadLock alock (this);
433
SafeIfaceArray <IHardDiskFormat> hardDiskFormats (mHardDiskFormats);
434
hardDiskFormats.detachTo (ComSafeArrayOutArg (aHardDiskFormats));
602
AutoCaller autoCaller(this);
603
CheckComRCReturnRC(autoCaller.rc());
605
AutoReadLock alock(this);
607
SafeIfaceArray<IMediumFormat> mediumFormats (mMediumFormats);
608
mediumFormats.detachTo(ComSafeArrayOutArg(aMediumFormats));
441
615
CheckComArgOutPointerValid(aDefaultHardDiskFormat);
443
AutoCaller autoCaller (this);
444
CheckComRCReturnRC (autoCaller.rc());
446
AutoReadLock alock (this);
448
mDefaultHardDiskFormat.cloneTo (aDefaultHardDiskFormat);
617
AutoCaller autoCaller(this);
618
CheckComRCReturnRC(autoCaller.rc());
620
AutoReadLock alock(this);
622
m_strDefaultHardDiskFormat.cloneTo(aDefaultHardDiskFormat);
453
627
STDMETHODIMP SystemProperties::COMSETTER(DefaultHardDiskFormat) (IN_BSTR aDefaultHardDiskFormat)
455
AutoCaller autoCaller (this);
456
CheckComRCReturnRC (autoCaller.rc());
629
AutoCaller autoCaller(this);
630
CheckComRCReturnRC(autoCaller.rc());
458
632
/* VirtualBox::saveSettings() needs a write lock */
459
633
AutoMultiWriteLock2 alock (mParent, this);
461
635
HRESULT rc = setDefaultHardDiskFormat (aDefaultHardDiskFormat);
463
637
rc = mParent->saveSettings();
470
644
CheckComArgOutPointerValid(aRemoteDisplayAuthLibrary);
472
AutoCaller autoCaller (this);
473
CheckComRCReturnRC (autoCaller.rc());
475
AutoReadLock alock (this);
477
mRemoteDisplayAuthLibrary.cloneTo (aRemoteDisplayAuthLibrary);
646
AutoCaller autoCaller(this);
647
CheckComRCReturnRC(autoCaller.rc());
649
AutoReadLock alock(this);
651
m_strRemoteDisplayAuthLibrary.cloneTo(aRemoteDisplayAuthLibrary);
482
656
STDMETHODIMP SystemProperties::COMSETTER(RemoteDisplayAuthLibrary) (IN_BSTR aRemoteDisplayAuthLibrary)
484
AutoCaller autoCaller (this);
485
CheckComRCReturnRC (autoCaller.rc());
658
AutoCaller autoCaller(this);
659
CheckComRCReturnRC(autoCaller.rc());
487
661
/* VirtualBox::saveSettings() needs a write lock */
488
662
AutoMultiWriteLock2 alock (mParent, this);
490
664
HRESULT rc = setRemoteDisplayAuthLibrary (aRemoteDisplayAuthLibrary);
492
666
rc = mParent->saveSettings();
499
673
CheckComArgOutPointerValid(aWebServiceAuthLibrary);
501
AutoCaller autoCaller (this);
502
CheckComRCReturnRC (autoCaller.rc());
504
AutoReadLock alock (this);
506
mWebServiceAuthLibrary.cloneTo (aWebServiceAuthLibrary);
675
AutoCaller autoCaller(this);
676
CheckComRCReturnRC(autoCaller.rc());
678
AutoReadLock alock(this);
680
m_strWebServiceAuthLibrary.cloneTo(aWebServiceAuthLibrary);
511
685
STDMETHODIMP SystemProperties::COMSETTER(WebServiceAuthLibrary) (IN_BSTR aWebServiceAuthLibrary)
513
AutoCaller autoCaller (this);
514
CheckComRCReturnRC (autoCaller.rc());
687
AutoCaller autoCaller(this);
688
CheckComRCReturnRC(autoCaller.rc());
516
690
/* VirtualBox::saveSettings() needs a write lock */
517
691
AutoMultiWriteLock2 alock (mParent, this);
519
693
HRESULT rc = setWebServiceAuthLibrary (aWebServiceAuthLibrary);
521
695
rc = mParent->saveSettings();
571
745
// public methods only for internal purposes
572
746
/////////////////////////////////////////////////////////////////////////////
574
HRESULT SystemProperties::loadSettings (const settings::Key &aGlobal)
748
HRESULT SystemProperties::loadSettings(const settings::SystemProperties &data)
576
using namespace settings;
578
AutoCaller autoCaller (this);
579
CheckComRCReturnRC (autoCaller.rc());
581
AutoWriteLock alock (this);
583
AssertReturn (!aGlobal.isNull(), E_FAIL);
750
AutoCaller autoCaller(this);
751
CheckComRCReturnRC(autoCaller.rc());
753
AutoWriteLock alock(this);
585
755
HRESULT rc = S_OK;
587
Key properties = aGlobal.key ("SystemProperties");
591
bstr = properties.stringValue ("defaultMachineFolder");
592
rc = setDefaultMachineFolder (bstr);
593
CheckComRCReturnRC (rc);
595
bstr = properties.stringValue ("defaultHardDiskFolder");
596
rc = setDefaultHardDiskFolder (bstr);
597
CheckComRCReturnRC (rc);
599
bstr = properties.stringValue ("defaultHardDiskFormat");
600
rc = setDefaultHardDiskFormat (bstr);
601
CheckComRCReturnRC (rc);
603
bstr = properties.stringValue ("remoteDisplayAuthLibrary");
604
rc = setRemoteDisplayAuthLibrary (bstr);
605
CheckComRCReturnRC (rc);
607
bstr = properties.stringValue ("webServiceAuthLibrary");
608
rc = setWebServiceAuthLibrary (bstr);
609
CheckComRCReturnRC (rc);
611
mLogHistoryCount = properties.valueOr <ULONG> ("LogHistoryCount", 3);
757
rc = setDefaultMachineFolder(data.strDefaultMachineFolder);
758
CheckComRCReturnRC(rc);
760
rc = setDefaultHardDiskFolder(data.strDefaultHardDiskFolder);
761
CheckComRCReturnRC(rc);
763
rc = setDefaultHardDiskFormat(data.strDefaultHardDiskFormat);
764
CheckComRCReturnRC(rc);
766
rc = setRemoteDisplayAuthLibrary(data.strRemoteDisplayAuthLibrary);
767
CheckComRCReturnRC(rc);
769
rc = setWebServiceAuthLibrary(data.strWebServiceAuthLibrary);
770
CheckComRCReturnRC(rc);
772
mLogHistoryCount = data.ulLogHistoryCount;
616
HRESULT SystemProperties::saveSettings (settings::Key &aGlobal)
777
HRESULT SystemProperties::saveSettings(settings::SystemProperties &data)
618
using namespace settings;
620
AutoCaller autoCaller (this);
621
CheckComRCReturnRC (autoCaller.rc());
623
AutoReadLock alock (this);
625
ComAssertRet (!aGlobal.isNull(), E_FAIL);
627
/* first, delete the entry */
628
Key properties = aGlobal.findKey ("SystemProperties");
629
if (!properties.isNull())
631
/* then, recreate it */
632
properties = aGlobal.createKey ("SystemProperties");
634
if (mDefaultMachineFolder)
635
properties.setValue <Bstr> ("defaultMachineFolder", mDefaultMachineFolder);
637
if (mDefaultHardDiskFolder)
638
properties.setValue <Bstr> ("defaultHardDiskFolder", mDefaultHardDiskFolder);
640
if (mDefaultHardDiskFormat)
641
properties.setValue <Bstr> ("defaultHardDiskFormat", mDefaultHardDiskFormat);
643
if (mRemoteDisplayAuthLibrary)
644
properties.setValue <Bstr> ("remoteDisplayAuthLibrary", mRemoteDisplayAuthLibrary);
646
if (mWebServiceAuthLibrary)
647
properties.setValue <Bstr> ("webServiceAuthLibrary", mWebServiceAuthLibrary);
649
properties.setValue <ULONG> ("LogHistoryCount", mLogHistoryCount);
779
AutoCaller autoCaller(this);
780
CheckComRCReturnRC(autoCaller.rc());
782
AutoReadLock alock(this);
784
data.strDefaultMachineFolder = m_strDefaultMachineFolder;
785
data.strDefaultHardDiskFolder = m_strDefaultHardDiskFolder;
786
data.strDefaultHardDiskFormat = m_strDefaultHardDiskFormat;
787
data.strRemoteDisplayAuthLibrary = m_strRemoteDisplayAuthLibrary;
788
data.strWebServiceAuthLibrary = m_strWebServiceAuthLibrary;
789
data.ulLogHistoryCount = mLogHistoryCount;
655
* Rerurns a hard disk format object corresponding to the given format
795
* Returns a medium format object corresponding to the given format
656
796
* identifier or null if no such format.
658
798
* @param aFormat Format identifier.
660
* @return ComObjPtr<HardDiskFormat>
800
* @return ComObjPtr<MediumFormat>
662
ComObjPtr <HardDiskFormat> SystemProperties::hardDiskFormat (CBSTR aFormat)
802
ComObjPtr<MediumFormat> SystemProperties::mediumFormat (CBSTR aFormat)
664
ComObjPtr <HardDiskFormat> format;
804
ComObjPtr<MediumFormat> format;
666
AutoCaller autoCaller (this);
806
AutoCaller autoCaller(this);
667
807
AssertComRCReturn (autoCaller.rc(), format);
669
AutoReadLock alock (this);
809
AutoReadLock alock(this);
671
for (HardDiskFormatList::const_iterator it = mHardDiskFormats.begin();
672
it != mHardDiskFormats.end(); ++ it)
811
for (MediumFormatList::const_iterator it = mMediumFormats.begin();
812
it != mMediumFormats.end(); ++ it)
674
/* HardDiskFormat is all const, no need to lock */
814
/* MediumFormat is all const, no need to lock */
676
816
if ((*it)->id().compareIgnoreCase (aFormat) == 0)
686
826
// private methods
687
827
/////////////////////////////////////////////////////////////////////////////
689
HRESULT SystemProperties::setDefaultMachineFolder (CBSTR aPath)
829
HRESULT SystemProperties::setDefaultMachineFolder(const Utf8Str &aPath)
695
833
path = "Machines";
697
835
/* get the full file name */
699
int vrc = mParent->calculateFullPath (path, folder);
700
if (RT_FAILURE (vrc))
701
return setError (E_FAIL,
702
tr ("Invalid default machine folder '%ls' (%Rrc)"),
837
int vrc = mParent->calculateFullPath(path, folder);
839
return setError(E_FAIL,
840
tr("Invalid default machine folder '%s' (%Rrc)"),
705
mDefaultMachineFolder = path;
706
mDefaultMachineFolderFull = folder;
844
m_strDefaultMachineFolder = path;
845
m_strDefaultMachineFolderFull = folder;
711
HRESULT SystemProperties::setDefaultHardDiskFolder (CBSTR aPath)
850
HRESULT SystemProperties::setDefaultHardDiskFolder(const Utf8Str &aPath)
717
854
path = "HardDisks";
719
856
/* get the full file name */
721
int vrc = mParent->calculateFullPath (path, folder);
722
if (RT_FAILURE (vrc))
723
return setError (E_FAIL,
724
tr ("Invalid default hard disk folder '%ls' (%Rrc)"),
727
mDefaultHardDiskFolder = path;
728
mDefaultHardDiskFolderFull = folder;
733
HRESULT SystemProperties::setDefaultHardDiskFormat (CBSTR aFormat)
735
if (aFormat && *aFormat)
736
mDefaultHardDiskFormat = aFormat;
738
mDefaultHardDiskFormat = "VDI";
743
HRESULT SystemProperties::setRemoteDisplayAuthLibrary (CBSTR aPath)
746
mRemoteDisplayAuthLibrary = aPath;
748
mRemoteDisplayAuthLibrary = "VRDPAuth";
753
HRESULT SystemProperties::setWebServiceAuthLibrary (CBSTR aPath)
756
mWebServiceAuthLibrary = aPath;
758
mWebServiceAuthLibrary = "VRDPAuth";
762
/* vi: set tabstop=4 shiftwidth=4 expandtab: */
858
int vrc = mParent->calculateFullPath(path, folder);
860
return setError(E_FAIL,
861
tr("Invalid default hard disk folder '%s' (%Rrc)"),
865
m_strDefaultHardDiskFolder = path;
866
m_strDefaultHardDiskFolderFull = folder;
871
HRESULT SystemProperties::setDefaultHardDiskFormat(const Utf8Str &aFormat)
873
if (!aFormat.isEmpty())
874
m_strDefaultHardDiskFormat = aFormat;
876
m_strDefaultHardDiskFormat = "VDI";
881
HRESULT SystemProperties::setRemoteDisplayAuthLibrary(const Utf8Str &aPath)
883
if (!aPath.isEmpty())
884
m_strRemoteDisplayAuthLibrary = aPath;
886
m_strRemoteDisplayAuthLibrary = "VRDPAuth";
891
HRESULT SystemProperties::setWebServiceAuthLibrary(const Utf8Str &aPath)
893
if (!aPath.isEmpty())
894
m_strWebServiceAuthLibrary = aPath;
896
m_strWebServiceAuthLibrary = "VRDPAuth";