VirtualBox

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

Last change on this file since 3516 was 3494, checked in by vboxsync, 17 years ago

added support for serial ports to Main and VBoxManage

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