DVDDriveImpl.cpp revision 70bb61ea2f96e80150e807529ce5df435607706b
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync/* $Id$ */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync/** @file
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync *
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * VirtualBox COM class implementation
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync/*
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * Copyright (C) 2006-2009 Sun Microsystems, Inc.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync *
10cdf5733351fdcd857d439ca32189e812f18682vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
10cdf5733351fdcd857d439ca32189e812f18682vboxsync * available from http://www.virtualbox.org. This file is free software;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * you can redistribute it and/or modify it under the terms of the GNU
438870735e3606c923d51fce19d9fc3b6ebffde1vboxsync * General Public License (GPL) as published by the Free Software
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a74782eac5771b0de57834e8c8c0247c55e8dd57vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a74782eac5771b0de57834e8c8c0247c55e8dd57vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a74782eac5771b0de57834e8c8c0247c55e8dd57vboxsync *
a74782eac5771b0de57834e8c8c0247c55e8dd57vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
a74782eac5771b0de57834e8c8c0247c55e8dd57vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
a74782eac5771b0de57834e8c8c0247c55e8dd57vboxsync * additional information or have any questions.
a74782eac5771b0de57834e8c8c0247c55e8dd57vboxsync */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync#include "DVDDriveImpl.h"
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync#include "MachineImpl.h"
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync#include "HostImpl.h"
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync#include "HostDVDDriveImpl.h"
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync#include "VirtualBoxImpl.h"
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync#include "Global.h"
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync#include "Logging.h"
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync#include <iprt/string.h>
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync#include <iprt/cpputils.h>
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync#include <VBox/settings.h>
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync// constructor / destructor
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync////////////////////////////////////////////////////////////////////////////////
9019681d4e9b8399b951793a9dd92b63c195e0eevboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncDEFINE_EMPTY_CTOR_DTOR (DVDDrive)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncHRESULT DVDDrive::FinalConstruct()
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync return S_OK;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync}
0270d1440bcecad2d4d12bd37c82252b6ee5afdbvboxsync
0270d1440bcecad2d4d12bd37c82252b6ee5afdbvboxsyncvoid DVDDrive::FinalRelease()
0270d1440bcecad2d4d12bd37c82252b6ee5afdbvboxsync{
0270d1440bcecad2d4d12bd37c82252b6ee5afdbvboxsync uninit();
0270d1440bcecad2d4d12bd37c82252b6ee5afdbvboxsync}
0270d1440bcecad2d4d12bd37c82252b6ee5afdbvboxsync
0270d1440bcecad2d4d12bd37c82252b6ee5afdbvboxsync// public initializer/uninitializer for internal purposes only
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync////////////////////////////////////////////////////////////////////////////////
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync/**
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * Initializes the DVD drive object.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync *
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * @param aParent Handle of the parent object.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncHRESULT DVDDrive::init (Machine *aParent)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync LogFlowThisFunc (("aParent=%p\n", aParent));
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
c9dbeac49601b9e10f0941b1c8e4f97853d4fab5vboxsync ComAssertRet (aParent, E_INVALIDARG);
c9dbeac49601b9e10f0941b1c8e4f97853d4fab5vboxsync
c9dbeac49601b9e10f0941b1c8e4f97853d4fab5vboxsync /* Enclose the state transition NotReady->InInit->Ready */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoInitSpan autoInitSpan (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertReturn (autoInitSpan.isOk(), E_FAIL);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync unconst (mParent) = aParent;
23179f1443b03947d85eccc81cbc6b5153a4abf3vboxsync /* mPeer is left null */
b8908d384db2324f04a2f68a13e67ea32ebf609avboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m.allocate();
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* Confirm a successful initialization */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync autoInitSpan.setSucceeded();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync return S_OK;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync}
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync/**
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * Initializes the DVD drive object given another DVD drive object
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * (a kind of copy constructor). This object shares data with
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * the object passed as an argument.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync *
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * @note This object must be destroyed before the original object
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * it shares data with is destroyed.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync *
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * @note Locks @a aThat object for reading.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync */
583008eb7eb336e25724785bc04833bd33271fd6vboxsyncHRESULT DVDDrive::init (Machine *aParent, DVDDrive *aThat)
7c25c3096025ea7ef66d660f76150013e77744f9vboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync LogFlowThisFunc (("aParent=%p, aThat=%p\n", aParent, aThat));
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync ComAssertRet (aParent && aThat, E_INVALIDARG);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* Enclose the state transition NotReady->InInit->Ready */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoInitSpan autoInitSpan (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertReturn (autoInitSpan.isOk(), E_FAIL);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync unconst (mParent) = aParent;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync unconst (mPeer) = aThat;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoCaller thatCaller (aThat);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertComRCReturnRC (thatCaller.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoReadLock thatLock (aThat);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m.share (aThat->m);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* Confirm a successful initialization */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync autoInitSpan.setSucceeded();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync return S_OK;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync}
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync/**
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * Initializes the DVD drive object given another DVD drive object
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * (a kind of copy constructor). This object makes a private copy of data
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * of the original object passed as an argument.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync *
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * @note Locks @a aThat object for reading.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncHRESULT DVDDrive::initCopy (Machine *aParent, DVDDrive *aThat)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync LogFlowThisFunc (("aParent=%p, aThat=%p\n", aParent, aThat));
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync ComAssertRet (aParent && aThat, E_INVALIDARG);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* Enclose the state transition NotReady->InInit->Ready */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoInitSpan autoInitSpan (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertReturn (autoInitSpan.isOk(), E_FAIL);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync unconst (mParent) = aParent;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* mPeer is left null */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoCaller thatCaller (aThat);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertComRCReturnRC (thatCaller.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoReadLock thatLock (aThat);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m.attachCopy (aThat->m);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* at present, this must be a snapshot machine */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Assert (!aParent->snapshotId().isEmpty());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (m->state == DriveState_ImageMounted)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* associate the DVD image media with the snapshot */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync HRESULT rc = m->image->attachTo (aParent->id(),
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync aParent->snapshotId());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertComRC (rc);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* Confirm a successful initialization */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync autoInitSpan.setSucceeded();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync return S_OK;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync}
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync/**
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * Uninitializes the instance and sets the ready flag to FALSE.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * Called either from FinalRelease() or by the parent when it gets destroyed.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncvoid DVDDrive::uninit()
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync LogFlowThisFunc (("\n"));
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* Enclose the state transition Ready->InUninit->NotReady */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoUninitSpan autoUninitSpan (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (autoUninitSpan.uninitDone())
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync return;
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync if ((mParent->type() == Machine::IsMachine ||
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync mParent->type() == Machine::IsSnapshotMachine) &&
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync m->state == DriveState_ImageMounted)
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync {
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync /* Deassociate the DVD image (only when mParent is a real Machine or a
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync * SnapshotMachine instance; SessionMachine instances
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync * refer to real Machine hard disks). This is necessary for a clean
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync * re-initialization of the VM after successfully re-checking the
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync * accessibility state. */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync HRESULT rc = m->image->detachFrom (mParent->id(),
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mParent->snapshotId());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertComRC (rc);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m.free();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync unconst (mPeer).setNull();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync unconst (mParent).setNull();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync}
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync// IDVDDrive properties
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync////////////////////////////////////////////////////////////////////////////////
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncSTDMETHODIMP DVDDrive::COMGETTER(State) (DriveState_T *aState)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComArgOutPointerValid(aState);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoCaller autoCaller (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComRCReturnRC (autoCaller.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoReadLock alock (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync *aState = m->state;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync return S_OK;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync}
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncSTDMETHODIMP DVDDrive::COMGETTER(Passthrough) (BOOL *aPassthrough)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComArgOutPointerValid(aPassthrough);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoCaller autoCaller (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComRCReturnRC (autoCaller.rc());
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync AutoReadLock alock (this);
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync *aPassthrough = m->passthrough;
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync return S_OK;
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync}
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsyncSTDMETHODIMP DVDDrive::COMSETTER(Passthrough) (BOOL aPassthrough)
fadf3b452e8a0c58afb43fd56f445fa8583d9d0cvboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoCaller autoCaller (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComRCReturnRC (autoCaller.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* the machine needs to be mutable */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Machine::AutoMutableStateDependency adep (mParent);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComRCReturnRC (adep.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoWriteLock alock (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (m->passthrough != aPassthrough)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m.backup();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m->passthrough = aPassthrough;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync return S_OK;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync}
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync// IDVDDrive methods
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync////////////////////////////////////////////////////////////////////////////////
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncSTDMETHODIMP DVDDrive::MountImage (IN_GUID aImageId)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Guid imageId = aImageId;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComArgExpr(aImageId, !imageId.isEmpty());
bde2993862d2d76510aca28c77db01c889301ccavboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoCaller autoCaller (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComRCReturnRC (autoCaller.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* the machine needs to be mutable */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Machine::AutoMutableStateDependency adep (mParent);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComRCReturnRC (adep.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoWriteLock alock (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync HRESULT rc = E_FAIL;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* Our lifetime is bound to mParent's lifetime, so we don't add caller.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * We also don't lock mParent since its mParent field is const. */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync ComObjPtr<DVDImage> image;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync rc = mParent->virtualBox()->findDVDImage(&imageId, NULL,
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync true /* aSetError */, &image);
9c018242ae5f17c24459d2d277dea63836bf7120vboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (SUCCEEDED (rc))
bde2993862d2d76510aca28c77db01c889301ccavboxsync {
bde2993862d2d76510aca28c77db01c889301ccavboxsync if (m->state != DriveState_ImageMounted ||
bde2993862d2d76510aca28c77db01c889301ccavboxsync !m->image.equalsTo (image))
bde2993862d2d76510aca28c77db01c889301ccavboxsync {
bde2993862d2d76510aca28c77db01c889301ccavboxsync rc = image->attachTo (mParent->id(), mParent->snapshotId());
bde2993862d2d76510aca28c77db01c889301ccavboxsync if (SUCCEEDED (rc))
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* umount() will backup data */
0270d1440bcecad2d4d12bd37c82252b6ee5afdbvboxsync rc = unmount();
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync if (SUCCEEDED (rc))
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync {
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync /* lock the image for reading if the VM is online. It will
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync * be unlocked either when unmounted from this drive or by
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync * SessionMachine::setMachineState() when the VM is
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync * terminated */
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync if (Global::IsOnline (adep.machineState()))
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync rc = image->LockRead (NULL);
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync }
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync if (SUCCEEDED (rc))
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m->image = image;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m->state = DriveState_ImageMounted;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* leave the lock before informing callbacks */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync alock.unlock();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mParent->onDVDDriveChange();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync return rc;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync}
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncSTDMETHODIMP DVDDrive::CaptureHostDrive (IHostDVDDrive *aHostDVDDrive)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComArgNotNull(aHostDVDDrive);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoCaller autoCaller (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComRCReturnRC (autoCaller.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* the machine needs to be mutable */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Machine::AutoMutableStateDependency adep (mParent);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComRCReturnRC (adep.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoWriteLock alock (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (m->state != DriveState_HostDriveCaptured ||
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync !m->hostDrive.equalsTo (aHostDVDDrive))
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* umount() will backup data */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync HRESULT rc = unmount();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (SUCCEEDED (rc))
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m->hostDrive = aHostDVDDrive;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m->state = DriveState_HostDriveCaptured;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* leave the lock before informing callbacks */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync alock.unlock();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mParent->onDVDDriveChange();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync return S_OK;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync}
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncSTDMETHODIMP DVDDrive::Unmount()
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoCaller autoCaller (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComRCReturnRC (autoCaller.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* the machine needs to be mutable */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Machine::AutoMutableStateDependency adep (mParent);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComRCReturnRC (adep.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoWriteLock alock (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (m->state != DriveState_NotMounted)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* umount() will backup data */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync HRESULT rc = unmount();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (SUCCEEDED (rc))
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m->state = DriveState_NotMounted;
28a02a9abdb21adbaaeeae87339534ca0346f97avboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* leave the lock before informing callbacks */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync alock.unlock();
28a02a9abdb21adbaaeeae87339534ca0346f97avboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mParent->onDVDDriveChange();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync return S_OK;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync}
9019681d4e9b8399b951793a9dd92b63c195e0eevboxsync
28a02a9abdb21adbaaeeae87339534ca0346f97avboxsyncSTDMETHODIMP DVDDrive::GetImage (IDVDImage **aDVDImage)
28a02a9abdb21adbaaeeae87339534ca0346f97avboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComArgOutPointerValid(aDVDImage);
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoCaller autoCaller (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComRCReturnRC (autoCaller.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoReadLock alock (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m->image.queryInterfaceTo (aDVDImage);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync return S_OK;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync}
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncSTDMETHODIMP DVDDrive::GetHostDrive(IHostDVDDrive **aHostDrive)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComArgOutPointerValid(aHostDrive);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoCaller autoCaller (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComRCReturnRC (autoCaller.rc());
28a02a9abdb21adbaaeeae87339534ca0346f97avboxsync
28a02a9abdb21adbaaeeae87339534ca0346f97avboxsync AutoReadLock alock (this);
28a02a9abdb21adbaaeeae87339534ca0346f97avboxsync
28a02a9abdb21adbaaeeae87339534ca0346f97avboxsync m->hostDrive.queryInterfaceTo (aHostDrive);
28a02a9abdb21adbaaeeae87339534ca0346f97avboxsync
28a02a9abdb21adbaaeeae87339534ca0346f97avboxsync return S_OK;
28a02a9abdb21adbaaeeae87339534ca0346f97avboxsync}
0270d1440bcecad2d4d12bd37c82252b6ee5afdbvboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync// public methods only for internal purposes
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync////////////////////////////////////////////////////////////////////////////////
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync/**
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * Loads settings from the given machine node. May be called once right after
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * this object creation.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync *
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * @param aMachineNode <Machine> node.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync *
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * @note Locks this object for writing.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncHRESULT DVDDrive::loadSettings (const settings::Key &aMachineNode)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync using namespace settings;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
0270d1440bcecad2d4d12bd37c82252b6ee5afdbvboxsync AssertReturn (!aMachineNode.isNull(), E_FAIL);
0270d1440bcecad2d4d12bd37c82252b6ee5afdbvboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoCaller autoCaller (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertComRCReturnRC (autoCaller.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoWriteLock alock (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* Note: we assume that the default values for attributes of optional
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * nodes are assigned in the Data::Data() constructor and don't do it
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * here. It implies that this method may only be called after constructing
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * a new BIOSSettings object while all its data fields are in the default
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * values. Exceptions are fields whose creation time defaults don't match
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * values that should be applied when these fields are not explicitly set
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * in the settings file (for backwards compatibility reasons). This takes
28a02a9abdb21adbaaeeae87339534ca0346f97avboxsync * place when a setting of a newly created object must default to A while
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * the same setting of an object loaded from the old settings file must
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * default to B. */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync HRESULT rc = S_OK;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* DVD drive (required, contains either Image or HostDrive or nothing) */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Key dvdDriveNode = aMachineNode.key ("DVDDrive");
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* optional, defaults to false */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m->passthrough = dvdDriveNode.value <bool> ("passthrough");
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Key typeNode;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (!(typeNode = dvdDriveNode.findKey ("Image")).isNull())
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Guid uuid = typeNode.value <Guid> ("uuid");
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync rc = MountImage (uuid);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComRCReturnRC (rc);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync else if (!(typeNode = dvdDriveNode.findKey ("HostDrive")).isNull())
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Bstr src = typeNode.stringValue ("src");
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* find the corresponding object */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync ComObjPtr <Host> host = mParent->virtualBox()->host();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync com::SafeIfaceArray <IHostDVDDrive> coll;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync rc = host->COMGETTER(DVDDrives) (ComSafeArrayAsOutParam(coll));
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertComRC (rc);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync ComPtr <IHostDVDDrive> drive;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync rc = host->FindHostDVDDrive (src, drive.asOutParam());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (SUCCEEDED (rc))
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync rc = CaptureHostDrive (drive);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComRCReturnRC (rc);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync else if (rc == E_INVALIDARG)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* the host DVD drive is not currently available. we
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * assume it will be available later and create an
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * extra object now */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync ComObjPtr <HostDVDDrive> hostDrive;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync hostDrive.createObject();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync rc = hostDrive->init (src);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertComRC (rc);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync rc = CaptureHostDrive (hostDrive);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync CheckComRCReturnRC (rc);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync else
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertComRC (rc);
dcd00536124b3d756c0198d5b51e74e93a7903d4vboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync return S_OK;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync}
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync/**
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * Saves settings to the given machine node.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync *
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * @param aMachineNode <Machine> node.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync *
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * @note Locks this object for reading.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncHRESULT DVDDrive::saveSettings (settings::Key &aMachineNode)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync using namespace settings;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertReturn (!aMachineNode.isNull(), E_FAIL);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoCaller autoCaller (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertComRCReturnRC (autoCaller.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoReadLock alock (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Key node = aMachineNode.createKey ("DVDDrive");
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync node.setValue <bool> ("passthrough", !!m->passthrough);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync switch (m->state)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync case DriveState_ImageMounted:
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Assert (!m->image.isNull());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Guid id;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync HRESULT rc = m->image->COMGETTER(Id) (id.asOutParam());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertComRC (rc);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Assert (!id.isEmpty());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Key imageNode = node.createKey ("Image");
6bace994141628622511ae44b06facc8e31f24fdvboxsync imageNode.setValue <Guid> ("uuid", id);
6bace994141628622511ae44b06facc8e31f24fdvboxsync break;
6bace994141628622511ae44b06facc8e31f24fdvboxsync }
6bace994141628622511ae44b06facc8e31f24fdvboxsync case DriveState_HostDriveCaptured:
6bace994141628622511ae44b06facc8e31f24fdvboxsync {
6bace994141628622511ae44b06facc8e31f24fdvboxsync Assert (!m->hostDrive.isNull());
6bace994141628622511ae44b06facc8e31f24fdvboxsync
6bace994141628622511ae44b06facc8e31f24fdvboxsync Bstr name;
6bace994141628622511ae44b06facc8e31f24fdvboxsync HRESULT rc = m->hostDrive->COMGETTER(Name) (name.asOutParam());
6bace994141628622511ae44b06facc8e31f24fdvboxsync AssertComRC (rc);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Assert (!name.isEmpty());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Key hostDriveNode = node.createKey ("HostDrive");
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync hostDriveNode.setValue <Bstr> ("src", name);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync break;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync case DriveState_NotMounted:
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* do nothing, i.e.leave the drive node empty */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync break;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync default:
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync ComAssertMsgFailedRet (("Invalid drive state: %d", m->state),
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync E_FAIL);
7c25c3096025ea7ef66d660f76150013e77744f9vboxsync }
7c25c3096025ea7ef66d660f76150013e77744f9vboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync return S_OK;
7c25c3096025ea7ef66d660f76150013e77744f9vboxsync}
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync/**
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * @note Locks this object for writing.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncbool DVDDrive::rollback()
01b2e367e947049139a5d5813ccc1fa162b11f76vboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* sanity */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoCaller autoCaller (this);
f7f5cd7b1e530eb5636da51c974b48ae0c1775b3vboxsync AssertComRCReturn (autoCaller.rc(), false);
01cfd051d439d6d1d5f7e5aa3f64d34014254065vboxsync
01cfd051d439d6d1d5f7e5aa3f64d34014254065vboxsync /* we need adep for the state check */
01cfd051d439d6d1d5f7e5aa3f64d34014254065vboxsync Machine::AutoAnyStateDependency adep (mParent);
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync AssertComRCReturn (adep.rc(), false);
01cfd051d439d6d1d5f7e5aa3f64d34014254065vboxsync
01cfd051d439d6d1d5f7e5aa3f64d34014254065vboxsync AutoWriteLock alock (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync bool changed = false;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
28a02a9abdb21adbaaeeae87339534ca0346f97avboxsync if (m.isBackedUp())
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* we need to check all data to see whether anything will be changed
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * after rollback */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync changed = m.hasActualChanges();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (changed)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync Data *oldData = m.backedUpData();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (!m->image.isNull() &&
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync !oldData->image.equalsTo (m->image))
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* detach the current image that will go away after rollback */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m->image->detachFrom (mParent->id(), mParent->snapshotId());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
6bace994141628622511ae44b06facc8e31f24fdvboxsync /* unlock the image for reading if the VM is online */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (Global::IsOnline (adep.machineState()))
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync HRESULT rc = m->image->UnlockRead (NULL);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertComRC (rc);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
0270d1440bcecad2d4d12bd37c82252b6ee5afdbvboxsync }
cc9b7957f36eef072546fb6e528a6e437b8e1c77vboxsync }
cc9b7957f36eef072546fb6e528a6e437b8e1c77vboxsync
cc9b7957f36eef072546fb6e528a6e437b8e1c77vboxsync m.rollback();
cc9b7957f36eef072546fb6e528a6e437b8e1c77vboxsync }
cc9b7957f36eef072546fb6e528a6e437b8e1c77vboxsync
cc9b7957f36eef072546fb6e528a6e437b8e1c77vboxsync return changed;
cc9b7957f36eef072546fb6e528a6e437b8e1c77vboxsync}
cc9b7957f36eef072546fb6e528a6e437b8e1c77vboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync/**
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * @note Locks this object for writing, together with the peer object (also for
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * writing) if there is one.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncvoid DVDDrive::commit()
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* sanity */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoCaller autoCaller (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertComRCReturnVoid (autoCaller.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* sanity too */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoCaller peerCaller (mPeer);
c2ce5189c8cbdecf46df173d22e4cb7a6e2f6c83vboxsync AssertComRCReturnVoid (peerCaller.rc());
a12c113a863b1f7a3132da4c008b786218516e2fvboxsync
a12c113a863b1f7a3132da4c008b786218516e2fvboxsync /* we need adep for the state check */
a12c113a863b1f7a3132da4c008b786218516e2fvboxsync Machine::AutoAnyStateDependency adep (mParent);
a12c113a863b1f7a3132da4c008b786218516e2fvboxsync AssertComRCReturnVoid (adep.rc());
c2ce5189c8cbdecf46df173d22e4cb7a6e2f6c83vboxsync
c2ce5189c8cbdecf46df173d22e4cb7a6e2f6c83vboxsync /* lock both for writing since we modify both (mPeer is "master" so locked
c2ce5189c8cbdecf46df173d22e4cb7a6e2f6c83vboxsync * first) */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoMultiWriteLock2 alock (mPeer, this);
0270d1440bcecad2d4d12bd37c82252b6ee5afdbvboxsync
2738bcf18cad2bbc505529d49a8e0f60b79c0c35vboxsync if (m.isBackedUp())
2738bcf18cad2bbc505529d49a8e0f60b79c0c35vboxsync {
f7f5cd7b1e530eb5636da51c974b48ae0c1775b3vboxsync Data *oldData = m.backedUpData();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (!oldData->image.isNull() &&
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync !oldData->image.equalsTo (m->image))
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* detach the old image that will go away after commit */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync oldData->image->detachFrom (mParent->id(), mParent->snapshotId());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* unlock the image for reading if the VM is online */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (Global::IsOnline (adep.machineState()))
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync HRESULT rc = oldData->image->UnlockRead (NULL);
28a02a9abdb21adbaaeeae87339534ca0346f97avboxsync AssertComRC (rc);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m.commit();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (mPeer)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync {
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync /* attach new data to the peer and reshare it */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mPeer->m.attach (m);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync }
0270d1440bcecad2d4d12bd37c82252b6ee5afdbvboxsync }
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync}
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync/**
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * @note Locks this object for writing, together with the peer object
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * represented by @a aThat (locked for reading).
6bace994141628622511ae44b06facc8e31f24fdvboxsync */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncvoid DVDDrive::copyFrom (DVDDrive *aThat)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertReturnVoid (aThat != NULL);
0270d1440bcecad2d4d12bd37c82252b6ee5afdbvboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* sanity */
0270d1440bcecad2d4d12bd37c82252b6ee5afdbvboxsync AutoCaller autoCaller (this);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertComRCReturnVoid (autoCaller.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* sanity too */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoCaller thatCaller (aThat);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertComRCReturnVoid (thatCaller.rc());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* peer is not modified, lock it for reading (aThat is "master" so locked
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * first) */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AutoMultiLock2 alock (aThat->rlock(), this->wlock());
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync /* this will back up current data */
6bace994141628622511ae44b06facc8e31f24fdvboxsync m.assignCopy (aThat->m);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync}
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync/**
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * Helper to unmount a drive.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync *
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync * @note Must be called from under this object's write lock.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncHRESULT DVDDrive::unmount()
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync{
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync AssertReturn (isWriteLockOnCurrentThread(), E_FAIL);
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m.backup();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (m->image)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m->image.setNull();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync if (m->hostDrive)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m->hostDrive.setNull();
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync m->state = DriveState_NotMounted;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync return S_OK;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync}
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync// private methods
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync////////////////////////////////////////////////////////////////////////////////
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync/* vi: set tabstop=4 shiftwidth=4 expandtab: */
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync