VirtualBox

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

Last change on this file since 5627 was 5150, checked in by vboxsync, 17 years ago

implemented LogHistoryCount system property (Main+VBoxManage)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.6 KB
Line 
1/** @file
2 *
3 * VirtualBox COM class implementation
4 */
5
6/*
7 * Copyright (C) 2006-2007 innotek GmbH
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License as published by the Free Software Foundation,
13 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
14 * distribution. VirtualBox OSE is distributed in the hope that it will
15 * be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#include "SystemPropertiesImpl.h"
19#include "VirtualBoxImpl.h"
20#include "MachineImpl.h"
21#include "Logging.h"
22
23// generated header
24#include "SchemaDefs.h"
25
26#include <iprt/path.h>
27#include <iprt/dir.h>
28#include <VBox/param.h>
29#include <VBox/err.h>
30
31// defines
32/////////////////////////////////////////////////////////////////////////////
33
34// constructor / destructor
35/////////////////////////////////////////////////////////////////////////////
36
37HRESULT SystemProperties::FinalConstruct()
38{
39 return S_OK;
40}
41
42void SystemProperties::FinalRelease()
43{
44 if (isReady())
45 uninit ();
46}
47
48// public methods only for internal purposes
49/////////////////////////////////////////////////////////////////////////////
50
51/**
52 * Initializes the system information object.
53 *
54 * @returns COM result indicator
55 */
56HRESULT SystemProperties::init (VirtualBox *aParent)
57{
58 LogFlowMember (("SystemProperties::init()\n"));
59
60 ComAssertRet (aParent, E_FAIL);
61
62 AutoLock alock (this);
63 ComAssertRet (!isReady(), E_UNEXPECTED);
64
65 mParent = aParent;
66
67 setDefaultVDIFolder (NULL);
68 setDefaultMachineFolder (NULL);
69 setRemoteDisplayAuthLibrary (NULL);
70
71 mHWVirtExEnabled = false;
72 mLogHistoryCount = 3;
73
74 setReady(true);
75 return S_OK;
76}
77
78/**
79 * Uninitializes the instance and sets the ready flag to FALSE.
80 * Called either from FinalRelease() or by the parent when it gets destroyed.
81 */
82void SystemProperties::uninit()
83{
84 LogFlowMember (("SystemProperties::uninit()\n"));
85
86 AutoLock alock (this);
87 AssertReturn (isReady(), (void) 0);
88
89 setReady (false);
90}
91
92// ISystemProperties properties
93/////////////////////////////////////////////////////////////////////////////
94
95
96STDMETHODIMP SystemProperties::COMGETTER(MinGuestRAM)(ULONG *minRAM)
97{
98 if (!minRAM)
99 return E_POINTER;
100 AutoLock lock(this);
101 CHECK_READY();
102
103 *minRAM = SchemaDefs::MinGuestRAM;
104
105 return S_OK;
106}
107
108STDMETHODIMP SystemProperties::COMGETTER(MaxGuestRAM)(ULONG *maxRAM)
109{
110 if (!maxRAM)
111 return E_POINTER;
112 AutoLock lock(this);
113 CHECK_READY();
114
115 *maxRAM = SchemaDefs::MaxGuestRAM;
116
117 return S_OK;
118}
119
120STDMETHODIMP SystemProperties::COMGETTER(MinGuestVRAM)(ULONG *minVRAM)
121{
122 if (!minVRAM)
123 return E_POINTER;
124 AutoLock lock(this);
125 CHECK_READY();
126
127 *minVRAM = SchemaDefs::MinGuestVRAM;
128
129 return S_OK;
130}
131
132STDMETHODIMP SystemProperties::COMGETTER(MaxGuestVRAM)(ULONG *maxVRAM)
133{
134 if (!maxVRAM)
135 return E_POINTER;
136 AutoLock lock(this);
137 CHECK_READY();
138
139 *maxVRAM = SchemaDefs::MaxGuestVRAM;
140
141 return S_OK;
142}
143
144STDMETHODIMP SystemProperties::COMGETTER(MaxGuestMonitors)(ULONG *maxMonitors)
145{
146 if (!maxMonitors)
147 return E_POINTER;
148 AutoLock lock(this);
149 CHECK_READY();
150
151 *maxMonitors = SchemaDefs::MaxGuestMonitors;
152
153 return S_OK;
154}
155
156STDMETHODIMP SystemProperties::COMGETTER(MaxVDISize)(ULONG64 *maxVDISize)
157{
158 if (!maxVDISize)
159 return E_POINTER;
160 AutoLock lock(this);
161 CHECK_READY();
162
163 /** The BIOS supports currently 32 bit LBA numbers (implementing the full
164 * 48 bit range is in theory trivial, but the crappy compiler makes things
165 * more difficult). This translates to almost 2 TBytes (to be on the safe
166 * side, the reported limit is 1 MiByte less than that, as the total number
167 * of sectors should fit in 32 bits, too), which should bei enough for
168 * the moment. The virtual ATA disks support complete LBA48 (although for
169 * example iSCSI is also currently limited to 32 bit LBA), so the
170 * theoretical maximum disk size is 128 PiByte. The user interface cannot
171 * cope with this in a reasonable way yet. */
172 *maxVDISize = 2048 * 1024 - 1;
173
174 return S_OK;
175}
176
177STDMETHODIMP SystemProperties::COMGETTER(NetworkAdapterCount)(ULONG *count)
178{
179 if (!count)
180 return E_POINTER;
181 AutoLock lock (this);
182 CHECK_READY();
183
184 *count = SchemaDefs::NetworkAdapterCount;
185
186 return S_OK;
187}
188
189STDMETHODIMP SystemProperties::COMGETTER(SerialPortCount)(ULONG *count)
190{
191 if (!count)
192 return E_POINTER;
193 AutoLock lock (this);
194 CHECK_READY();
195
196 *count = SchemaDefs::SerialPortCount;
197
198 return S_OK;
199}
200
201STDMETHODIMP SystemProperties::COMGETTER(ParallelPortCount)(ULONG *count)
202{
203 if (!count)
204 return E_POINTER;
205 AutoLock lock (this);
206 CHECK_READY();
207
208 *count = SchemaDefs::ParallelPortCount;
209
210 return S_OK;
211}
212
213STDMETHODIMP SystemProperties::COMGETTER(MaxBootPosition)(ULONG *aMaxBootPosition)
214{
215 if (!aMaxBootPosition)
216 return E_POINTER;
217 AutoLock lock (this);
218 CHECK_READY();
219
220 *aMaxBootPosition = SchemaDefs::MaxBootPosition;
221
222 return S_OK;
223}
224
225STDMETHODIMP SystemProperties::COMGETTER(DefaultVDIFolder) (BSTR *aDefaultVDIFolder)
226{
227 if (!aDefaultVDIFolder)
228 return E_POINTER;
229
230 AutoLock alock (this);
231 CHECK_READY();
232
233 mDefaultVDIFolderFull.cloneTo (aDefaultVDIFolder);
234
235 return S_OK;
236}
237
238STDMETHODIMP SystemProperties::COMSETTER(DefaultVDIFolder) (INPTR BSTR aDefaultVDIFolder)
239{
240 AutoLock alock (this);
241 CHECK_READY();
242
243 HRESULT rc = setDefaultVDIFolder (aDefaultVDIFolder);
244 if (FAILED (rc))
245 return rc;
246
247 alock.unlock();
248 return mParent->saveSettings();
249}
250
251STDMETHODIMP SystemProperties::COMGETTER(DefaultMachineFolder) (BSTR *aDefaultMachineFolder)
252{
253 if (!aDefaultMachineFolder)
254 return E_POINTER;
255
256 AutoLock alock (this);
257 CHECK_READY();
258
259 mDefaultMachineFolderFull.cloneTo (aDefaultMachineFolder);
260
261 return S_OK;
262}
263
264STDMETHODIMP SystemProperties::COMSETTER(DefaultMachineFolder) (INPTR BSTR aDefaultMachineFolder)
265{
266 AutoLock alock (this);
267 CHECK_READY();
268
269 HRESULT rc = setDefaultMachineFolder (aDefaultMachineFolder);
270 if (FAILED (rc))
271 return rc;
272
273 alock.unlock();
274 return mParent->saveSettings();
275}
276
277STDMETHODIMP SystemProperties::COMGETTER(RemoteDisplayAuthLibrary) (BSTR *aRemoteDisplayAuthLibrary)
278{
279 if (!aRemoteDisplayAuthLibrary)
280 return E_POINTER;
281
282 AutoLock alock (this);
283 CHECK_READY();
284
285 mRemoteDisplayAuthLibrary.cloneTo (aRemoteDisplayAuthLibrary);
286
287 return S_OK;
288}
289
290STDMETHODIMP SystemProperties::COMSETTER(RemoteDisplayAuthLibrary) (INPTR BSTR aRemoteDisplayAuthLibrary)
291{
292 AutoLock alock (this);
293 CHECK_READY();
294
295 HRESULT rc = setRemoteDisplayAuthLibrary (aRemoteDisplayAuthLibrary);
296 if (FAILED (rc))
297 return rc;
298
299 alock.unlock();
300 return mParent->saveSettings();
301}
302
303STDMETHODIMP SystemProperties::COMGETTER(HWVirtExEnabled) (BOOL *enabled)
304{
305 if (!enabled)
306 return E_POINTER;
307
308 AutoLock alock (this);
309 CHECK_READY();
310
311 *enabled = mHWVirtExEnabled;
312
313 return S_OK;
314}
315
316STDMETHODIMP SystemProperties::COMSETTER(HWVirtExEnabled) (BOOL enabled)
317{
318 AutoLock alock (this);
319 CHECK_READY();
320
321 mHWVirtExEnabled = enabled;
322
323 alock.unlock();
324 return mParent->saveSettings();
325}
326
327STDMETHODIMP SystemProperties::COMGETTER(LogHistoryCount) (ULONG *count)
328{
329 if (!count)
330 return E_POINTER;
331
332 AutoLock alock (this);
333 CHECK_READY();
334
335 *count = mLogHistoryCount;
336
337 return S_OK;
338}
339
340STDMETHODIMP SystemProperties::COMSETTER(LogHistoryCount) (ULONG count)
341{
342 AutoLock alock (this);
343 CHECK_READY();
344
345 mLogHistoryCount = count;
346
347 alock.unlock();
348 return mParent->saveSettings();
349}
350
351// public methods only for internal purposes
352/////////////////////////////////////////////////////////////////////////////
353
354HRESULT SystemProperties::loadSettings (CFGNODE aGlobal)
355{
356 AutoLock lock (this);
357 CHECK_READY();
358
359 ComAssertRet (aGlobal, E_FAIL);
360
361 CFGNODE properties = NULL;
362 CFGLDRGetChildNode (aGlobal, "SystemProperties", 0, &properties);
363 ComAssertRet (properties, E_FAIL);
364
365 HRESULT rc = E_FAIL;
366
367 do
368 {
369 Bstr bstr;
370
371 CFGLDRQueryBSTR (properties, "defaultVDIFolder",
372 bstr.asOutParam());
373 rc = setDefaultVDIFolder (bstr);
374 if (FAILED (rc))
375 break;
376
377 CFGLDRQueryBSTR (properties, "defaultMachineFolder",
378 bstr.asOutParam());
379 rc = setDefaultMachineFolder (bstr);
380 if (FAILED (rc))
381 break;
382
383 CFGLDRQueryBSTR (properties, "remoteDisplayAuthLibrary",
384 bstr.asOutParam());
385 rc = setRemoteDisplayAuthLibrary (bstr);
386 if (FAILED (rc))
387 break;
388
389 CFGLDRQueryBool (properties, "HWVirtExEnabled", (bool*)&mHWVirtExEnabled);
390
391 uint32_t u32Count = 3;
392 CFGLDRQueryUInt32 (properties, "LogHistoryCount", &u32Count);
393 mLogHistoryCount = u32Count;
394 }
395 while (0);
396
397 CFGLDRReleaseNode (properties);
398
399 return rc;
400}
401
402HRESULT SystemProperties::saveSettings (CFGNODE aGlobal)
403{
404 AutoLock lock (this);
405 CHECK_READY();
406
407 ComAssertRet (aGlobal, E_FAIL);
408
409 // first, delete the entry
410 CFGNODE properties = NULL;
411 int vrc = CFGLDRGetChildNode (aGlobal, "SystemProperties", 0, &properties);
412 if (VBOX_SUCCESS (vrc))
413 {
414 vrc = CFGLDRDeleteNode (properties);
415 ComAssertRCRet (vrc, E_FAIL);
416 }
417 // then, recreate it
418 vrc = CFGLDRCreateChildNode (aGlobal, "SystemProperties", &properties);
419 ComAssertRCRet (vrc, E_FAIL);
420
421 if (mDefaultVDIFolder)
422 CFGLDRSetBSTR (properties, "defaultVDIFolder",
423 mDefaultVDIFolder);
424
425 if (mDefaultMachineFolder)
426 CFGLDRSetBSTR (properties, "defaultMachineFolder",
427 mDefaultMachineFolder);
428
429 if (mRemoteDisplayAuthLibrary)
430 CFGLDRSetBSTR (properties, "remoteDisplayAuthLibrary",
431 mRemoteDisplayAuthLibrary);
432
433 CFGLDRSetBool (properties, "HWVirtExEnabled", !!mHWVirtExEnabled);
434
435 CFGLDRSetUInt32 (properties, "LogHistoryCount", mLogHistoryCount);
436
437 return S_OK;
438}
439
440// private methods
441/////////////////////////////////////////////////////////////////////////////
442
443HRESULT SystemProperties::setDefaultVDIFolder (const BSTR aPath)
444{
445 Utf8Str path;
446 if (aPath && *aPath)
447 path = aPath;
448 else
449 path = "VDI";
450
451 // get the full file name
452 char folder [RTPATH_MAX];
453 int vrc = RTPathAbsEx (mParent->homeDir(), path, folder, sizeof (folder));
454 if (VBOX_FAILURE (vrc))
455 return setError (E_FAIL,
456 tr ("Cannot set the default VDI folder to '%ls' (%Vrc)"),
457 path.raw(), vrc);
458
459 mDefaultVDIFolder = path;
460 mDefaultVDIFolderFull = folder;
461
462 return S_OK;
463}
464
465HRESULT SystemProperties::setDefaultMachineFolder (const BSTR aPath)
466{
467 Utf8Str path;
468 if (aPath && *aPath)
469 path = aPath;
470 else
471 path = "Machines";
472
473 // get the full file name
474 char folder [RTPATH_MAX];
475 int vrc = RTPathAbsEx (mParent->homeDir(), path, folder, sizeof (folder));
476 if (VBOX_FAILURE (vrc))
477 return setError (E_FAIL,
478 tr ("Cannot set the default machines folder to '%ls' (%Vrc)"),
479 path.raw(), vrc);
480
481 mDefaultMachineFolder = path;
482 mDefaultMachineFolderFull = folder;
483
484 return S_OK;
485}
486
487HRESULT SystemProperties::setRemoteDisplayAuthLibrary (const BSTR aPath)
488{
489 Utf8Str path;
490 if (aPath && *aPath)
491 path = aPath;
492 else
493 path = "VRDPAuth";
494
495 mRemoteDisplayAuthLibrary = path;
496
497 return S_OK;
498}
499
Note: See TracBrowser for help on using the repository browser.

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