VirtualBox

source: vbox/trunk/src/VBox/Main/SystemPropertiesImpl.cpp@ 14953

Last change on this file since 14953 was 14772, checked in by vboxsync, 16 years ago

Added vim modelines to aid following coding guidelines, like no tabs,
similar to what is already in the xidl file.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.8 KB
Line 
1/* $Id: SystemPropertiesImpl.cpp 14772 2008-11-28 12:41:22Z vboxsync $ */
2
3/** @file
4 *
5 * VirtualBox COM class implementation
6 */
7
8/*
9 * Copyright (C) 2006-2008 Sun Microsystems, Inc.
10 *
11 * This file is part of VirtualBox Open Source Edition (OSE), as
12 * available from http://www.virtualbox.org. This file is free software;
13 * you can redistribute it and/or modify it under the terms of the GNU
14 * General Public License (GPL) as published by the Free Software
15 * Foundation, in version 2 as it comes in the "COPYING" file of the
16 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
17 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
20 * Clara, CA 95054 USA or visit http://www.sun.com if you need
21 * additional information or have any questions.
22 */
23
24#include "SystemPropertiesImpl.h"
25#include "VirtualBoxImpl.h"
26#include "MachineImpl.h"
27#include "Logging.h"
28
29// generated header
30#include "SchemaDefs.h"
31
32#include <iprt/path.h>
33#include <iprt/dir.h>
34#include <VBox/param.h>
35#include <VBox/err.h>
36
37// defines
38/////////////////////////////////////////////////////////////////////////////
39
40// constructor / destructor
41/////////////////////////////////////////////////////////////////////////////
42
43DEFINE_EMPTY_CTOR_DTOR (SystemProperties)
44
45HRESULT SystemProperties::FinalConstruct()
46{
47 return S_OK;
48}
49
50void SystemProperties::FinalRelease()
51{
52 uninit ();
53}
54
55// public methods only for internal purposes
56/////////////////////////////////////////////////////////////////////////////
57
58/**
59 * Initializes the system information object.
60 *
61 * @returns COM result indicator
62 */
63HRESULT SystemProperties::init (VirtualBox *aParent)
64{
65 LogFlowThisFunc (("aParent=%p\n", aParent));
66
67 ComAssertRet (aParent, E_FAIL);
68
69 /* Enclose the state transition NotReady->InInit->Ready */
70 AutoInitSpan autoInitSpan (this);
71 AssertReturn (autoInitSpan.isOk(), E_FAIL);
72
73 unconst (mParent) = aParent;
74
75 setDefaultMachineFolder (NULL);
76 setDefaultHardDiskFolder (NULL);
77 setDefaultHardDiskFormat (NULL);
78
79 setRemoteDisplayAuthLibrary (NULL);
80
81 mHWVirtExEnabled = false;
82 mLogHistoryCount = 3;
83
84 HRESULT rc = S_OK;
85
86 /* Fetch info of all available hd backends. */
87
88 /// @todo NEWMEDIA VDBackendInfo needs to be improved to let us enumerate
89 /// any number of backends
90
91 /// @todo We currently leak memory because it's not actually clear what to
92 /// free in structures returned by VDBackendInfo. Must be fixed ASAP!
93
94 VDBACKENDINFO aVDInfo [100];
95 unsigned cEntries;
96 int vrc = VDBackendInfo (RT_ELEMENTS (aVDInfo), aVDInfo, &cEntries);
97 AssertRC (vrc);
98 if (RT_SUCCESS (vrc))
99 {
100 for (unsigned i = 0; i < cEntries; ++ i)
101 {
102 ComObjPtr <HardDiskFormat> hdf;
103 rc = hdf.createObject();
104 CheckComRCBreakRC (rc);
105
106 rc = hdf->init (&aVDInfo [i]);
107 CheckComRCBreakRC (rc);
108
109 mHardDiskFormats.push_back (hdf);
110 }
111 }
112
113 /* Confirm a successful initialization */
114 if (SUCCEEDED (rc))
115 autoInitSpan.setSucceeded();
116
117 return rc;
118}
119
120/**
121 * Uninitializes the instance and sets the ready flag to FALSE.
122 * Called either from FinalRelease() or by the parent when it gets destroyed.
123 */
124void SystemProperties::uninit()
125{
126 LogFlowThisFunc (("\n"));
127
128 /* Enclose the state transition Ready->InUninit->NotReady */
129 AutoUninitSpan autoUninitSpan (this);
130 if (autoUninitSpan.uninitDone())
131 return;
132
133 unconst (mParent).setNull();
134}
135
136// ISystemProperties properties
137/////////////////////////////////////////////////////////////////////////////
138
139
140STDMETHODIMP SystemProperties::COMGETTER(MinGuestRAM)(ULONG *minRAM)
141{
142 if (!minRAM)
143 return E_POINTER;
144
145 AutoCaller autoCaller (this);
146 CheckComRCReturnRC (autoCaller.rc());
147
148 /* no need to lock, this is const */
149 *minRAM = SchemaDefs::MinGuestRAM;
150
151 return S_OK;
152}
153
154STDMETHODIMP SystemProperties::COMGETTER(MaxGuestRAM)(ULONG *maxRAM)
155{
156 if (!maxRAM)
157 return E_POINTER;
158
159 AutoCaller autoCaller (this);
160 CheckComRCReturnRC (autoCaller.rc());
161
162 /* no need to lock, this is const */
163 *maxRAM = SchemaDefs::MaxGuestRAM;
164
165 return S_OK;
166}
167
168STDMETHODIMP SystemProperties::COMGETTER(MinGuestVRAM)(ULONG *minVRAM)
169{
170 if (!minVRAM)
171 return E_POINTER;
172
173 AutoCaller autoCaller (this);
174 CheckComRCReturnRC (autoCaller.rc());
175
176 /* no need to lock, this is const */
177 *minVRAM = SchemaDefs::MinGuestVRAM;
178
179 return S_OK;
180}
181
182STDMETHODIMP SystemProperties::COMGETTER(MaxGuestVRAM)(ULONG *maxVRAM)
183{
184 if (!maxVRAM)
185 return E_POINTER;
186
187 AutoCaller autoCaller (this);
188 CheckComRCReturnRC (autoCaller.rc());
189
190 /* no need to lock, this is const */
191 *maxVRAM = SchemaDefs::MaxGuestVRAM;
192
193 return S_OK;
194}
195
196STDMETHODIMP SystemProperties::COMGETTER(MaxGuestMonitors)(ULONG *maxMonitors)
197{
198 if (!maxMonitors)
199 return E_POINTER;
200
201 AutoCaller autoCaller (this);
202 CheckComRCReturnRC (autoCaller.rc());
203
204 /* no need to lock, this is const */
205 *maxMonitors = SchemaDefs::MaxGuestMonitors;
206
207 return S_OK;
208}
209
210STDMETHODIMP SystemProperties::COMGETTER(MaxVDISize)(ULONG64 *maxVDISize)
211{
212 if (!maxVDISize)
213 return E_POINTER;
214
215 AutoCaller autoCaller (this);
216 CheckComRCReturnRC (autoCaller.rc());
217
218 /** The BIOS supports currently 32 bit LBA numbers (implementing the full
219 * 48 bit range is in theory trivial, but the crappy compiler makes things
220 * more difficult). This translates to almost 2 TBytes (to be on the safe
221 * side, the reported limit is 1 MiByte less than that, as the total number
222 * of sectors should fit in 32 bits, too), which should bei enough for
223 * the moment. The virtual ATA disks support complete LBA48 (although for
224 * example iSCSI is also currently limited to 32 bit LBA), so the
225 * theoretical maximum disk size is 128 PiByte. The user interface cannot
226 * cope with this in a reasonable way yet. */
227 /* no need to lock, this is const */
228 *maxVDISize = 2048 * 1024 - 1;
229
230 return S_OK;
231}
232
233STDMETHODIMP SystemProperties::COMGETTER(NetworkAdapterCount)(ULONG *count)
234{
235 if (!count)
236 return E_POINTER;
237
238 AutoCaller autoCaller (this);
239 CheckComRCReturnRC (autoCaller.rc());
240
241 /* no need to lock, this is const */
242 *count = SchemaDefs::NetworkAdapterCount;
243
244 return S_OK;
245}
246
247STDMETHODIMP SystemProperties::COMGETTER(SerialPortCount)(ULONG *count)
248{
249 if (!count)
250 return E_POINTER;
251
252 AutoCaller autoCaller (this);
253 CheckComRCReturnRC (autoCaller.rc());
254
255 /* no need to lock, this is const */
256 *count = SchemaDefs::SerialPortCount;
257
258 return S_OK;
259}
260
261STDMETHODIMP SystemProperties::COMGETTER(ParallelPortCount)(ULONG *count)
262{
263 if (!count)
264 return E_POINTER;
265
266 AutoCaller autoCaller (this);
267 CheckComRCReturnRC (autoCaller.rc());
268
269 /* no need to lock, this is const */
270 *count = SchemaDefs::ParallelPortCount;
271
272 return S_OK;
273}
274
275STDMETHODIMP SystemProperties::COMGETTER(MaxBootPosition)(ULONG *aMaxBootPosition)
276{
277 if (!aMaxBootPosition)
278 return E_POINTER;
279
280 AutoCaller autoCaller (this);
281 CheckComRCReturnRC (autoCaller.rc());
282
283 /* no need to lock, this is const */
284 *aMaxBootPosition = SchemaDefs::MaxBootPosition;
285
286 return S_OK;
287}
288
289STDMETHODIMP SystemProperties::COMGETTER(DefaultMachineFolder) (BSTR *aDefaultMachineFolder)
290{
291 if (!aDefaultMachineFolder)
292 return E_POINTER;
293
294 AutoCaller autoCaller (this);
295 CheckComRCReturnRC (autoCaller.rc());
296
297 AutoReadLock alock (this);
298
299 mDefaultMachineFolderFull.cloneTo (aDefaultMachineFolder);
300
301 return S_OK;
302}
303
304STDMETHODIMP SystemProperties::COMSETTER(DefaultMachineFolder) (INPTR BSTR aDefaultMachineFolder)
305{
306 AutoCaller autoCaller (this);
307 CheckComRCReturnRC (autoCaller.rc());
308
309 /* VirtualBox::saveSettings() needs a write lock */
310 AutoMultiWriteLock2 alock (mParent, this);
311
312 HRESULT rc = setDefaultMachineFolder (aDefaultMachineFolder);
313 if (SUCCEEDED (rc))
314 rc = mParent->saveSettings();
315
316 return rc;
317}
318
319STDMETHODIMP SystemProperties::COMGETTER(DefaultHardDiskFolder) (BSTR *aDefaultHardDiskFolder)
320{
321 if (!aDefaultHardDiskFolder)
322 return E_POINTER;
323
324 AutoCaller autoCaller (this);
325 CheckComRCReturnRC (autoCaller.rc());
326
327 AutoReadLock alock (this);
328
329 mDefaultHardDiskFolderFull.cloneTo (aDefaultHardDiskFolder);
330
331 return S_OK;
332}
333
334STDMETHODIMP SystemProperties::COMSETTER(DefaultHardDiskFolder) (INPTR BSTR aDefaultHardDiskFolder)
335{
336 AutoCaller autoCaller (this);
337 CheckComRCReturnRC (autoCaller.rc());
338
339 /* VirtualBox::saveSettings() needs a write lock */
340 AutoMultiWriteLock2 alock (mParent, this);
341
342 HRESULT rc = setDefaultHardDiskFolder (aDefaultHardDiskFolder);
343 if (SUCCEEDED (rc))
344 rc = mParent->saveSettings();
345
346 return rc;
347}
348
349STDMETHODIMP SystemProperties::
350COMGETTER(HardDiskFormats) (ComSafeArrayOut (IHardDiskFormat *, aHardDiskFormats))
351{
352 if (ComSafeArrayOutIsNull (aHardDiskFormats))
353 return E_POINTER;
354
355 AutoCaller autoCaller (this);
356 CheckComRCReturnRC (autoCaller.rc());
357
358 AutoReadLock alock (this);
359
360 SafeIfaceArray <IHardDiskFormat> hardDiskFormats (mHardDiskFormats);
361 hardDiskFormats.detachTo (ComSafeArrayOutArg (aHardDiskFormats));
362
363 return S_OK;
364}
365
366STDMETHODIMP SystemProperties::COMGETTER(DefaultHardDiskFormat) (BSTR *aDefaultHardDiskFormat)
367{
368 if (!aDefaultHardDiskFormat)
369 return E_POINTER;
370
371 AutoCaller autoCaller (this);
372 CheckComRCReturnRC (autoCaller.rc());
373
374 AutoReadLock alock (this);
375
376 mDefaultHardDiskFormat.cloneTo (aDefaultHardDiskFormat);
377
378 return S_OK;
379}
380
381STDMETHODIMP SystemProperties::COMSETTER(DefaultHardDiskFormat) (INPTR BSTR aDefaultHardDiskFormat)
382{
383 AutoCaller autoCaller (this);
384 CheckComRCReturnRC (autoCaller.rc());
385
386 /* VirtualBox::saveSettings() needs a write lock */
387 AutoMultiWriteLock2 alock (mParent, this);
388
389 HRESULT rc = setDefaultHardDiskFormat (aDefaultHardDiskFormat);
390 if (SUCCEEDED (rc))
391 rc = mParent->saveSettings();
392
393 return rc;
394}
395
396STDMETHODIMP SystemProperties::COMGETTER(RemoteDisplayAuthLibrary) (BSTR *aRemoteDisplayAuthLibrary)
397{
398 if (!aRemoteDisplayAuthLibrary)
399 return E_POINTER;
400
401 AutoCaller autoCaller (this);
402 CheckComRCReturnRC (autoCaller.rc());
403
404 AutoReadLock alock (this);
405
406 mRemoteDisplayAuthLibrary.cloneTo (aRemoteDisplayAuthLibrary);
407
408 return S_OK;
409}
410
411STDMETHODIMP SystemProperties::COMSETTER(RemoteDisplayAuthLibrary) (INPTR BSTR aRemoteDisplayAuthLibrary)
412{
413 AutoCaller autoCaller (this);
414 CheckComRCReturnRC (autoCaller.rc());
415
416 /* VirtualBox::saveSettings() needs a write lock */
417 AutoMultiWriteLock2 alock (mParent, this);
418
419 HRESULT rc = setRemoteDisplayAuthLibrary (aRemoteDisplayAuthLibrary);
420 if (SUCCEEDED (rc))
421 rc = mParent->saveSettings();
422
423 return rc;
424}
425
426STDMETHODIMP SystemProperties::COMGETTER(WebServiceAuthLibrary) (BSTR *aWebServiceAuthLibrary)
427{
428 if (!aWebServiceAuthLibrary)
429 return E_POINTER;
430
431 AutoCaller autoCaller (this);
432 CheckComRCReturnRC (autoCaller.rc());
433
434 AutoReadLock alock (this);
435
436 mWebServiceAuthLibrary.cloneTo (aWebServiceAuthLibrary);
437
438 return S_OK;
439}
440
441STDMETHODIMP SystemProperties::COMSETTER(WebServiceAuthLibrary) (INPTR BSTR aWebServiceAuthLibrary)
442{
443 AutoCaller autoCaller (this);
444 CheckComRCReturnRC (autoCaller.rc());
445
446 /* VirtualBox::saveSettings() needs a write lock */
447 AutoMultiWriteLock2 alock (mParent, this);
448
449 HRESULT rc = setWebServiceAuthLibrary (aWebServiceAuthLibrary);
450 if (SUCCEEDED (rc))
451 rc = mParent->saveSettings();
452
453 return rc;
454}
455
456STDMETHODIMP SystemProperties::COMGETTER(HWVirtExEnabled) (BOOL *enabled)
457{
458 if (!enabled)
459 return E_POINTER;
460
461 AutoCaller autoCaller (this);
462 CheckComRCReturnRC (autoCaller.rc());
463
464 AutoReadLock alock (this);
465
466 *enabled = mHWVirtExEnabled;
467
468 return S_OK;
469}
470
471STDMETHODIMP SystemProperties::COMSETTER(HWVirtExEnabled) (BOOL enabled)
472{
473 AutoCaller autoCaller (this);
474 CheckComRCReturnRC (autoCaller.rc());
475
476 /* VirtualBox::saveSettings() needs a write lock */
477 AutoMultiWriteLock2 alock (mParent, this);
478
479 mHWVirtExEnabled = enabled;
480
481 HRESULT rc = mParent->saveSettings();
482
483 return rc;
484}
485
486STDMETHODIMP SystemProperties::COMGETTER(LogHistoryCount) (ULONG *count)
487{
488 if (!count)
489 return E_POINTER;
490
491 AutoCaller autoCaller (this);
492 CheckComRCReturnRC (autoCaller.rc());
493
494 AutoReadLock alock (this);
495
496 *count = mLogHistoryCount;
497
498 return S_OK;
499}
500
501STDMETHODIMP SystemProperties::COMSETTER(LogHistoryCount) (ULONG count)
502{
503 AutoCaller autoCaller (this);
504 CheckComRCReturnRC (autoCaller.rc());
505
506 /* VirtualBox::saveSettings() needs a write lock */
507 AutoMultiWriteLock2 alock (mParent, this);
508
509 mLogHistoryCount = count;
510
511 HRESULT rc = mParent->saveSettings();
512
513 return rc;
514}
515
516// public methods only for internal purposes
517/////////////////////////////////////////////////////////////////////////////
518
519HRESULT SystemProperties::loadSettings (const settings::Key &aGlobal)
520{
521 using namespace settings;
522
523 AutoCaller autoCaller (this);
524 CheckComRCReturnRC (autoCaller.rc());
525
526 AutoWriteLock alock (this);
527
528 AssertReturn (!aGlobal.isNull(), E_FAIL);
529
530 HRESULT rc = S_OK;
531
532 Key properties = aGlobal.key ("SystemProperties");
533
534 Bstr bstr;
535
536 bstr = properties.stringValue ("defaultMachineFolder");
537 rc = setDefaultMachineFolder (bstr);
538 CheckComRCReturnRC (rc);
539
540 bstr = properties.stringValue ("defaultHardDiskFolder");
541 rc = setDefaultHardDiskFolder (bstr);
542 CheckComRCReturnRC (rc);
543
544 bstr = properties.stringValue ("defaultHardDiskFormat");
545 rc = setDefaultHardDiskFormat (bstr);
546 CheckComRCReturnRC (rc);
547
548 bstr = properties.stringValue ("remoteDisplayAuthLibrary");
549 rc = setRemoteDisplayAuthLibrary (bstr);
550 CheckComRCReturnRC (rc);
551
552 bstr = properties.stringValue ("webServiceAuthLibrary");
553 rc = setWebServiceAuthLibrary (bstr);
554 CheckComRCReturnRC (rc);
555
556 /* Note: not <BOOL> because Win32 defines BOOL as int */
557 mHWVirtExEnabled = properties.valueOr <bool> ("HWVirtExEnabled", false);
558
559 mLogHistoryCount = properties.valueOr <ULONG> ("LogHistoryCount", 3);
560
561 return S_OK;
562}
563
564HRESULT SystemProperties::saveSettings (settings::Key &aGlobal)
565{
566 using namespace settings;
567
568 AutoCaller autoCaller (this);
569 CheckComRCReturnRC (autoCaller.rc());
570
571 AutoReadLock alock (this);
572
573 ComAssertRet (!aGlobal.isNull(), E_FAIL);
574
575 /* first, delete the entry */
576 Key properties = aGlobal.findKey ("SystemProperties");
577 if (!properties.isNull())
578 properties.zap();
579 /* then, recreate it */
580 properties = aGlobal.createKey ("SystemProperties");
581
582 if (mDefaultMachineFolder)
583 properties.setValue <Bstr> ("defaultMachineFolder", mDefaultMachineFolder);
584
585 if (mDefaultHardDiskFolder)
586 properties.setValue <Bstr> ("defaultHardDiskFolder", mDefaultHardDiskFolder);
587
588 if (mDefaultHardDiskFormat)
589 properties.setValue <Bstr> ("defaultHardDiskFormat", mDefaultHardDiskFormat);
590
591 if (mRemoteDisplayAuthLibrary)
592 properties.setValue <Bstr> ("remoteDisplayAuthLibrary", mRemoteDisplayAuthLibrary);
593
594 if (mWebServiceAuthLibrary)
595 properties.setValue <Bstr> ("webServiceAuthLibrary", mWebServiceAuthLibrary);
596
597 properties.setValue <bool> ("HWVirtExEnabled", !!mHWVirtExEnabled);
598
599 properties.setValue <ULONG> ("LogHistoryCount", mLogHistoryCount);
600
601 return S_OK;
602}
603
604/**
605 * Rerurns a hard disk format object corresponding to the given format
606 * identifier or null if no such format.
607 *
608 * @param aFormat Format identifier.
609 *
610 * @return ComObjPtr<HardDiskFormat>
611 */
612ComObjPtr <HardDiskFormat> SystemProperties::hardDiskFormat (const BSTR aFormat)
613{
614 ComObjPtr <HardDiskFormat> format;
615
616 AutoCaller autoCaller (this);
617 AssertComRCReturn (autoCaller.rc(), format);
618
619 AutoReadLock alock (this);
620
621 for (HardDiskFormatList::const_iterator it = mHardDiskFormats.begin();
622 it != mHardDiskFormats.end(); ++ it)
623 {
624 /* HardDiskFormat is all const, no need to lock */
625
626 if ((*it)->id() == aFormat)
627 {
628 format = *it;
629 break;
630 }
631 }
632
633 return format;
634}
635
636// private methods
637/////////////////////////////////////////////////////////////////////////////
638
639HRESULT SystemProperties::setDefaultMachineFolder (const BSTR aPath)
640{
641 Utf8Str path;
642 if (aPath && *aPath)
643 path = aPath;
644 else
645 path = "Machines";
646
647 /* get the full file name */
648 Utf8Str folder;
649 int vrc = mParent->calculateFullPath (path, folder);
650 if (RT_FAILURE (vrc))
651 return setError (E_FAIL,
652 tr ("Invalid default machine folder '%ls' (%Rrc)"),
653 path.raw(), vrc);
654
655 mDefaultMachineFolder = path;
656 mDefaultMachineFolderFull = folder;
657
658 return S_OK;
659}
660
661HRESULT SystemProperties::setDefaultHardDiskFolder (const BSTR aPath)
662{
663 Utf8Str path;
664 if (aPath && *aPath)
665 path = aPath;
666 else
667 path = "HardDisks";
668
669 /* get the full file name */
670 Utf8Str folder;
671 int vrc = mParent->calculateFullPath (path, folder);
672 if (RT_FAILURE (vrc))
673 return setError (E_FAIL,
674 tr ("Invalid default hard disk folder '%ls' (%Rrc)"),
675 path.raw(), vrc);
676
677 mDefaultHardDiskFolder = path;
678 mDefaultHardDiskFolderFull = folder;
679
680 return S_OK;
681}
682
683HRESULT SystemProperties::setDefaultHardDiskFormat (const BSTR aFormat)
684{
685 if (aFormat && *aFormat)
686 mDefaultHardDiskFormat = aFormat;
687 else
688 mDefaultHardDiskFormat = "VDI";
689
690 return S_OK;
691}
692
693HRESULT SystemProperties::setRemoteDisplayAuthLibrary (const BSTR aPath)
694{
695 if (aPath && *aPath)
696 mRemoteDisplayAuthLibrary = aPath;
697 else
698 mRemoteDisplayAuthLibrary = "VRDPAuth";
699
700 return S_OK;
701}
702
703HRESULT SystemProperties::setWebServiceAuthLibrary (const BSTR aPath)
704{
705 if (aPath && *aPath)
706 mWebServiceAuthLibrary = aPath;
707 else
708 mWebServiceAuthLibrary = "VRDPAuth";
709
710 return S_OK;
711}
712/* vi: set tabstop=4 shiftwidth=4 expandtab: */
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette