VirtualBox

source: vbox/trunk/src/VBox/Main/BIOSSettingsImpl.cpp@ 28766

Last change on this file since 28766 was 27607, checked in by vboxsync, 15 years ago

Main: remove templates for 'weak' com pointers which do nothing anyway

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 15.7 KB
Line 
1/** @file
2 *
3 * VirtualBox COM class implementation
4 */
5
6/*
7 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
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 (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22#include "BIOSSettingsImpl.h"
23#include "MachineImpl.h"
24#include "GuestOSTypeImpl.h"
25
26#include <iprt/cpp/utils.h>
27#include <VBox/settings.h>
28
29#include "AutoStateDep.h"
30#include "AutoCaller.h"
31#include "Logging.h"
32
33////////////////////////////////////////////////////////////////////////////////
34//
35// BIOSSettings private data definition
36//
37////////////////////////////////////////////////////////////////////////////////
38
39struct BIOSSettings::Data
40{
41 Data()
42 : pMachine(NULL)
43 { }
44
45 Machine * const pMachine;
46 ComObjPtr<BIOSSettings> pPeer;
47
48 // use the XML settings structure in the members for simplicity
49 Backupable<settings::BIOSSettings> bd;
50};
51
52// constructor / destructor
53/////////////////////////////////////////////////////////////////////////////
54
55HRESULT BIOSSettings::FinalConstruct()
56{
57 return S_OK;
58}
59
60void BIOSSettings::FinalRelease()
61{
62 uninit ();
63}
64
65// public initializer/uninitializer for internal purposes only
66/////////////////////////////////////////////////////////////////////////////
67
68/**
69 * Initializes the audio adapter object.
70 *
71 * @returns COM result indicator
72 */
73HRESULT BIOSSettings::init(Machine *aParent)
74{
75 LogFlowThisFuncEnter();
76 LogFlowThisFunc(("aParent: %p\n", aParent));
77
78 ComAssertRet(aParent, E_INVALIDARG);
79
80 /* Enclose the state transition NotReady->InInit->Ready */
81 AutoInitSpan autoInitSpan(this);
82 AssertReturn(autoInitSpan.isOk(), E_FAIL);
83
84 m = new Data();
85
86 /* share the parent weakly */
87 unconst(m->pMachine) = aParent;
88
89 m->bd.allocate();
90
91 autoInitSpan.setSucceeded();
92
93 LogFlowThisFuncLeave();
94 return S_OK;
95}
96
97/**
98 * Initializes the audio adapter object given another audio adapter object
99 * (a kind of copy constructor). This object shares data with
100 * the object passed as an argument.
101 *
102 * @note This object must be destroyed before the original object
103 * it shares data with is destroyed.
104 */
105HRESULT BIOSSettings::init(Machine *aParent, BIOSSettings *that)
106{
107 LogFlowThisFuncEnter();
108 LogFlowThisFunc(("aParent: %p, that: %p\n", aParent, that));
109
110 ComAssertRet(aParent && that, E_INVALIDARG);
111
112 /* Enclose the state transition NotReady->InInit->Ready */
113 AutoInitSpan autoInitSpan(this);
114 AssertReturn(autoInitSpan.isOk(), E_FAIL);
115
116 m = new Data();
117
118 unconst(m->pMachine) = aParent;
119 m->pPeer = that;
120
121 AutoWriteLock thatlock(that COMMA_LOCKVAL_SRC_POS);
122 m->bd.share(that->m->bd);
123
124 autoInitSpan.setSucceeded();
125
126 LogFlowThisFuncLeave();
127 return S_OK;
128}
129
130/**
131 * Initializes the guest object given another guest object
132 * (a kind of copy constructor). This object makes a private copy of data
133 * of the original object passed as an argument.
134 */
135HRESULT BIOSSettings::initCopy(Machine *aParent, BIOSSettings *that)
136{
137 LogFlowThisFuncEnter();
138 LogFlowThisFunc(("aParent: %p, that: %p\n", aParent, that));
139
140 ComAssertRet(aParent && that, E_INVALIDARG);
141
142 /* Enclose the state transition NotReady->InInit->Ready */
143 AutoInitSpan autoInitSpan(this);
144 AssertReturn(autoInitSpan.isOk(), E_FAIL);
145
146 m = new Data();
147
148 unconst(m->pMachine) = aParent;
149 // mPeer is left null
150
151 AutoWriteLock thatlock(that COMMA_LOCKVAL_SRC_POS);
152 m->bd.attachCopy(that->m->bd);
153
154 autoInitSpan.setSucceeded();
155
156 LogFlowThisFuncLeave();
157 return S_OK;
158}
159
160/**
161 * Uninitializes the instance and sets the ready flag to FALSE.
162 * Called either from FinalRelease() or by the parent when it gets destroyed.
163 */
164void BIOSSettings::uninit()
165{
166 LogFlowThisFuncEnter();
167
168 /* Enclose the state transition Ready->InUninit->NotReady */
169 AutoUninitSpan autoUninitSpan(this);
170 if (autoUninitSpan.uninitDone())
171 return;
172
173 m->bd.free();
174
175 unconst(m->pPeer) = NULL;
176 unconst(m->pMachine) = NULL;
177
178 delete m;
179 m = NULL;
180
181 LogFlowThisFuncLeave();
182}
183
184// IBIOSSettings properties
185/////////////////////////////////////////////////////////////////////////////
186
187STDMETHODIMP BIOSSettings::COMGETTER(LogoFadeIn)(BOOL *enabled)
188{
189 if (!enabled)
190 return E_POINTER;
191
192 AutoCaller autoCaller(this);
193 if (FAILED(autoCaller.rc())) return autoCaller.rc();
194
195 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
196
197 *enabled = m->bd->fLogoFadeIn;
198
199 return S_OK;
200}
201
202STDMETHODIMP BIOSSettings::COMSETTER(LogoFadeIn)(BOOL enable)
203{
204 AutoCaller autoCaller(this);
205 if (FAILED(autoCaller.rc())) return autoCaller.rc();
206
207 /* the machine needs to be mutable */
208 AutoMutableStateDependency adep(m->pMachine);
209 if (FAILED(adep.rc())) return adep.rc();
210
211 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
212
213 m->bd.backup();
214 m->bd->fLogoFadeIn = !!enable;
215
216 alock.release();
217 AutoWriteLock mlock(m->pMachine COMMA_LOCKVAL_SRC_POS); // mParent is const, needs no locking
218 m->pMachine->setModified(Machine::IsModified_BIOS);
219
220 return S_OK;
221}
222
223STDMETHODIMP BIOSSettings::COMGETTER(LogoFadeOut)(BOOL *enabled)
224{
225 if (!enabled)
226 return E_POINTER;
227
228 AutoCaller autoCaller(this);
229 if (FAILED(autoCaller.rc())) return autoCaller.rc();
230
231 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
232
233 *enabled = m->bd->fLogoFadeOut;
234
235 return S_OK;
236}
237
238STDMETHODIMP BIOSSettings::COMSETTER(LogoFadeOut)(BOOL enable)
239{
240 AutoCaller autoCaller(this);
241 if (FAILED(autoCaller.rc())) return autoCaller.rc();
242
243 /* the machine needs to be mutable */
244 AutoMutableStateDependency adep(m->pMachine);
245 if (FAILED(adep.rc())) return adep.rc();
246
247 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
248
249 m->bd.backup();
250 m->bd->fLogoFadeOut = !!enable;
251
252 alock.release();
253 AutoWriteLock mlock(m->pMachine COMMA_LOCKVAL_SRC_POS); // mParent is const, needs no locking
254 m->pMachine->setModified(Machine::IsModified_BIOS);
255
256 return S_OK;
257}
258
259STDMETHODIMP BIOSSettings::COMGETTER(LogoDisplayTime)(ULONG *displayTime)
260{
261 if (!displayTime)
262 return E_POINTER;
263
264 AutoCaller autoCaller(this);
265 if (FAILED(autoCaller.rc())) return autoCaller.rc();
266
267 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
268
269 *displayTime = m->bd->ulLogoDisplayTime;
270
271 return S_OK;
272}
273
274STDMETHODIMP BIOSSettings::COMSETTER(LogoDisplayTime)(ULONG displayTime)
275{
276 AutoCaller autoCaller(this);
277 if (FAILED(autoCaller.rc())) return autoCaller.rc();
278
279 /* the machine needs to be mutable */
280 AutoMutableStateDependency adep(m->pMachine);
281 if (FAILED(adep.rc())) return adep.rc();
282
283 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
284
285 m->bd.backup();
286 m->bd->ulLogoDisplayTime = displayTime;
287
288 alock.release();
289 AutoWriteLock mlock(m->pMachine COMMA_LOCKVAL_SRC_POS); // mParent is const, needs no locking
290 m->pMachine->setModified(Machine::IsModified_BIOS);
291
292 return S_OK;
293}
294
295STDMETHODIMP BIOSSettings::COMGETTER(LogoImagePath)(BSTR *imagePath)
296{
297 if (!imagePath)
298 return E_POINTER;
299
300 AutoCaller autoCaller(this);
301 if (FAILED(autoCaller.rc())) return autoCaller.rc();
302
303 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
304
305 m->bd->strLogoImagePath.cloneTo(imagePath);
306 return S_OK;
307}
308
309STDMETHODIMP BIOSSettings::COMSETTER(LogoImagePath)(IN_BSTR imagePath)
310{
311 /* NULL strings are not allowed */
312 if (!imagePath)
313 return E_INVALIDARG;
314
315 AutoCaller autoCaller(this);
316 if (FAILED(autoCaller.rc())) return autoCaller.rc();
317
318 /* the machine needs to be mutable */
319 AutoMutableStateDependency adep(m->pMachine);
320 if (FAILED(adep.rc())) return adep.rc();
321
322 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
323
324 m->bd.backup();
325 m->bd->strLogoImagePath = imagePath;
326
327 alock.release();
328 AutoWriteLock mlock(m->pMachine COMMA_LOCKVAL_SRC_POS); // mParent is const, needs no locking
329 m->pMachine->setModified(Machine::IsModified_BIOS);
330
331 return S_OK;
332}
333
334STDMETHODIMP BIOSSettings::COMGETTER(BootMenuMode)(BIOSBootMenuMode_T *bootMenuMode)
335{
336 if (!bootMenuMode)
337 return E_POINTER;
338
339 AutoCaller autoCaller(this);
340 if (FAILED(autoCaller.rc())) return autoCaller.rc();
341
342 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
343
344 *bootMenuMode = m->bd->biosBootMenuMode;
345 return S_OK;
346}
347
348STDMETHODIMP BIOSSettings::COMSETTER(BootMenuMode)(BIOSBootMenuMode_T bootMenuMode)
349{
350 AutoCaller autoCaller(this);
351 if (FAILED(autoCaller.rc())) return autoCaller.rc();
352
353 /* the machine needs to be mutable */
354 AutoMutableStateDependency adep(m->pMachine);
355 if (FAILED(adep.rc())) return adep.rc();
356
357 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
358
359 m->bd.backup();
360 m->bd->biosBootMenuMode = bootMenuMode;
361
362 alock.release();
363 AutoWriteLock mlock(m->pMachine COMMA_LOCKVAL_SRC_POS); // mParent is const, needs no locking
364 m->pMachine->setModified(Machine::IsModified_BIOS);
365
366 return S_OK;
367}
368
369STDMETHODIMP BIOSSettings::COMGETTER(ACPIEnabled)(BOOL *enabled)
370{
371 if (!enabled)
372 return E_POINTER;
373
374 AutoCaller autoCaller(this);
375 if (FAILED(autoCaller.rc())) return autoCaller.rc();
376
377 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
378
379 *enabled = m->bd->fACPIEnabled;
380
381 return S_OK;
382}
383
384STDMETHODIMP BIOSSettings::COMSETTER(ACPIEnabled)(BOOL enable)
385{
386 AutoCaller autoCaller(this);
387 if (FAILED(autoCaller.rc())) return autoCaller.rc();
388
389 /* the machine needs to be mutable */
390 AutoMutableStateDependency adep(m->pMachine);
391 if (FAILED(adep.rc())) return adep.rc();
392
393 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
394
395 m->bd.backup();
396 m->bd->fACPIEnabled = !!enable;
397
398 alock.release();
399 AutoWriteLock mlock(m->pMachine COMMA_LOCKVAL_SRC_POS); // mParent is const, needs no locking
400 m->pMachine->setModified(Machine::IsModified_BIOS);
401
402 return S_OK;
403}
404
405STDMETHODIMP BIOSSettings::COMGETTER(IOAPICEnabled)(BOOL *enabled)
406{
407 if (!enabled)
408 return E_POINTER;
409
410 AutoCaller autoCaller(this);
411 if (FAILED(autoCaller.rc())) return autoCaller.rc();
412
413 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
414
415 *enabled = m->bd->fIOAPICEnabled;
416
417 return S_OK;
418}
419
420STDMETHODIMP BIOSSettings::COMSETTER(IOAPICEnabled)(BOOL enable)
421{
422 AutoCaller autoCaller(this);
423 if (FAILED(autoCaller.rc())) return autoCaller.rc();
424
425 /* the machine needs to be mutable */
426 AutoMutableStateDependency adep(m->pMachine);
427 if (FAILED(adep.rc())) return adep.rc();
428
429 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
430
431 m->bd.backup();
432 m->bd->fIOAPICEnabled = !!enable;
433
434 alock.release();
435 AutoWriteLock mlock(m->pMachine COMMA_LOCKVAL_SRC_POS); // mParent is const, needs no locking
436 m->pMachine->setModified(Machine::IsModified_BIOS);
437
438 return S_OK;
439}
440
441STDMETHODIMP BIOSSettings::COMGETTER(PXEDebugEnabled)(BOOL *enabled)
442{
443 if (!enabled)
444 return E_POINTER;
445
446 AutoCaller autoCaller(this);
447 if (FAILED(autoCaller.rc())) return autoCaller.rc();
448
449 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
450
451 *enabled = m->bd->fPXEDebugEnabled;
452
453 return S_OK;
454}
455
456STDMETHODIMP BIOSSettings::COMSETTER(PXEDebugEnabled)(BOOL enable)
457{
458 AutoCaller autoCaller(this);
459 if (FAILED(autoCaller.rc())) return autoCaller.rc();
460
461 /* the machine needs to be mutable */
462 AutoMutableStateDependency adep(m->pMachine);
463 if (FAILED(adep.rc())) return adep.rc();
464
465 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
466
467 m->bd.backup();
468 m->bd->fPXEDebugEnabled = !!enable;
469
470 alock.release();
471 AutoWriteLock mlock(m->pMachine COMMA_LOCKVAL_SRC_POS); // mParent is const, needs no locking
472 m->pMachine->setModified(Machine::IsModified_BIOS);
473
474 return S_OK;
475}
476
477STDMETHODIMP BIOSSettings::COMGETTER(TimeOffset)(LONG64 *offset)
478{
479 if (!offset)
480 return E_POINTER;
481
482 AutoCaller autoCaller(this);
483 if (FAILED(autoCaller.rc())) return autoCaller.rc();
484
485 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
486
487 *offset = m->bd->llTimeOffset;
488
489 return S_OK;
490}
491
492STDMETHODIMP BIOSSettings::COMSETTER(TimeOffset)(LONG64 offset)
493{
494 AutoCaller autoCaller(this);
495 if (FAILED(autoCaller.rc())) return autoCaller.rc();
496
497 /* the machine needs to be mutable */
498 AutoMutableStateDependency adep(m->pMachine);
499 if (FAILED(adep.rc())) return adep.rc();
500
501 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
502
503 m->bd.backup();
504 m->bd->llTimeOffset = offset;
505
506 alock.release();
507 AutoWriteLock mlock(m->pMachine COMMA_LOCKVAL_SRC_POS); // mParent is const, needs no locking
508 m->pMachine->setModified(Machine::IsModified_BIOS);
509
510 return S_OK;
511}
512
513
514// IBIOSSettings methods
515/////////////////////////////////////////////////////////////////////////////
516
517// public methods only for internal purposes
518/////////////////////////////////////////////////////////////////////////////
519
520/**
521 * Loads settings from the given machine node.
522 * May be called once right after this object creation.
523 *
524 * @param aMachineNode <Machine> node.
525 *
526 * @note Locks this object for writing.
527 */
528HRESULT BIOSSettings::loadSettings(const settings::BIOSSettings &data)
529{
530 AutoCaller autoCaller(this);
531 AssertComRCReturnRC(autoCaller.rc());
532
533 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
534
535 // simply copy
536 *m->bd.data() = data;
537
538 return S_OK;
539}
540
541/**
542 * Saves settings to the given machine node.
543 *
544 * @param aMachineNode <Machine> node.
545 *
546 * @note Locks this object for reading.
547 */
548HRESULT BIOSSettings::saveSettings(settings::BIOSSettings &data)
549{
550 AutoCaller autoCaller(this);
551 AssertComRCReturnRC(autoCaller.rc());
552
553 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
554
555 data = *m->bd.data();
556
557 return S_OK;
558}
559
560void BIOSSettings::rollback()
561{
562 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
563 m->bd.rollback();
564}
565
566void BIOSSettings::commit()
567{
568 /* sanity */
569 AutoCaller autoCaller(this);
570 AssertComRCReturnVoid(autoCaller.rc());
571
572 /* sanity too */
573 AutoCaller peerCaller(m->pPeer);
574 AssertComRCReturnVoid(peerCaller.rc());
575
576 /* lock both for writing since we modify both (mPeer is "master" so locked
577 * first) */
578 AutoMultiWriteLock2 alock(m->pPeer, this COMMA_LOCKVAL_SRC_POS);
579
580 if (m->bd.isBackedUp())
581 {
582 m->bd.commit();
583 if (m->pPeer)
584 {
585 /* attach new data to the peer and reshare it */
586 AutoWriteLock peerlock(m->pPeer COMMA_LOCKVAL_SRC_POS);
587 m->pPeer->m->bd.attach(m->bd);
588 }
589 }
590}
591
592void BIOSSettings::copyFrom (BIOSSettings *aThat)
593{
594 AssertReturnVoid (aThat != NULL);
595
596 /* sanity */
597 AutoCaller autoCaller(this);
598 AssertComRCReturnVoid (autoCaller.rc());
599
600 /* sanity too */
601 AutoCaller thatCaller (aThat);
602 AssertComRCReturnVoid (thatCaller.rc());
603
604 /* peer is not modified, lock it for reading (aThat is "master" so locked
605 * first) */
606 AutoReadLock rl(aThat COMMA_LOCKVAL_SRC_POS);
607 AutoWriteLock wl(this COMMA_LOCKVAL_SRC_POS);
608
609 /* this will back up current data */
610 m->bd.assignCopy(aThat->m->bd);
611}
612
613void BIOSSettings::applyDefaults (GuestOSType *aOsType)
614{
615 AssertReturnVoid (aOsType != NULL);
616
617 /* sanity */
618 AutoCaller autoCaller(this);
619 AssertComRCReturnVoid (autoCaller.rc());
620
621 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
622
623 /* Initialize default BIOS settings here */
624 m->bd->fIOAPICEnabled = aOsType->recommendedIOAPIC();
625}
626
627/* vi: set tabstop=4 shiftwidth=4 expandtab: */
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