FloppyDriveImpl.cpp revision d46ee884c41b808b239563b1978468aae12e33a2
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/** @file
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync *
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * VirtualBox COM class implementation
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2006-2007 innotek GmbH
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync *
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * available from http://www.virtualbox.org. This file is free software;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * you can redistribute it and/or modify it under the terms of the GNU
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * General Public License (GPL) as published by the Free Software
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync#include "FloppyDriveImpl.h"
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync#include "MachineImpl.h"
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync#include "HostImpl.h"
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync#include "HostFloppyDriveImpl.h"
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync#include "VirtualBoxImpl.h"
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync#include "Logging.h"
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync#include <iprt/string.h>
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync#include <iprt/cpputils.h>
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync// constructor / destructor
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/////////////////////////////////////////////////////////////////////////////
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncDEFINE_EMPTY_CTOR_DTOR (FloppyDrive)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncHRESULT FloppyDrive::FinalConstruct()
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return S_OK;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncvoid FloppyDrive::FinalRelease()
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync uninit();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync// public initializer/uninitializer for internal purposes only
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/////////////////////////////////////////////////////////////////////////////
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/**
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * Initializes the Floppy drive object.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync *
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @param aParent Handle of the parent object.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncHRESULT FloppyDrive::init (Machine *aParent)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync LogFlowThisFunc (("aParent=%p\n", aParent));
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync ComAssertRet (aParent, E_INVALIDARG);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* Enclose the state transition NotReady->InInit->Ready */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoInitSpan autoInitSpan (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertReturn (autoInitSpan.isOk(), E_UNEXPECTED);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync unconst (mParent) = aParent;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* mPeer is left null */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData.allocate();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* Confirm a successful initialization */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync autoInitSpan.setSucceeded();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return S_OK;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/**
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * Initializes the Floppy drive object given another Floppy drive object
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * (a kind of copy constructor). This object shares data with
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * the object passed as an argument.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync *
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @note This object must be destroyed before the original object
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * it shares data with is destroyed.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync *
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @note Locks @a aThat object for reading.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncHRESULT FloppyDrive::init (Machine *aParent, FloppyDrive *aThat)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync LogFlowThisFunc (("aParent=%p, aThat=%p\n", aParent, aThat));
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync ComAssertRet (aParent && aThat, E_INVALIDARG);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* Enclose the state transition NotReady->InInit->Ready */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoInitSpan autoInitSpan (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertReturn (autoInitSpan.isOk(), E_UNEXPECTED);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync unconst (mParent) = aParent;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync unconst (mPeer) = aThat;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller thatCaller (aThat);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertComRCReturnRC (thatCaller.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoReaderLock thatLock (aThat);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData.share (aThat->mData);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* Confirm a successful initialization */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync autoInitSpan.setSucceeded();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return S_OK;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/**
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * Initializes the guest object given another guest object
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * (a kind of copy constructor). This object makes a private copy of data
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * of the original object passed as an argument.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync *
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @note Locks @a aThat object for reading.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncHRESULT FloppyDrive::initCopy (Machine *aParent, FloppyDrive *aThat)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync LogFlowThisFunc (("aParent=%p, aThat=%p\n", aParent, aThat));
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync ComAssertRet (aParent && aThat, E_INVALIDARG);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* Enclose the state transition NotReady->InInit->Ready */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoInitSpan autoInitSpan (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertReturn (autoInitSpan.isOk(), E_UNEXPECTED);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync unconst (mParent) = aParent;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* mPeer is left null */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller thatCaller (aThat);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertComRCReturnRC (thatCaller.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoReaderLock thatLock (aThat);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData.attachCopy (aThat->mData);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* Confirm a successful initialization */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync autoInitSpan.setSucceeded();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return S_OK;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/**
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * Uninitializes the instance and sets the ready flag to FALSE.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * Called either from FinalRelease() or by the parent when it gets destroyed.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncvoid FloppyDrive::uninit()
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync LogFlowThisFunc (("\n"));
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* Enclose the state transition Ready->InUninit->NotReady */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoUninitSpan autoUninitSpan (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (autoUninitSpan.uninitDone())
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData.free();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync unconst (mPeer).setNull();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync unconst (mParent).setNull();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync// IFloppyDrive properties
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/////////////////////////////////////////////////////////////////////////////
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncSTDMETHODIMP FloppyDrive::COMGETTER(Enabled) (BOOL *aEnabled)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (!aEnabled)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return E_POINTER;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller autoCaller (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync CheckComRCReturnRC (autoCaller.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoReaderLock alock (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync *aEnabled = mData->mEnabled;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return S_OK;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncSTDMETHODIMP FloppyDrive::COMSETTER(Enabled) (BOOL aEnabled)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync LogFlowThisFunc (("aEnabled=%RTbool\n", aEnabled));
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller autoCaller (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync CheckComRCReturnRC (autoCaller.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* the machine needs to be mutable */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Machine::AutoMutableStateDependency adep (mParent);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync CheckComRCReturnRC (adep.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoLock alock (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (mData->mEnabled != aEnabled)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync {
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData.backup();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData->mEnabled = aEnabled;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* leave the lock before informing callbacks */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync alock.unlock();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mParent->onFloppyDriveChange();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync }
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return S_OK;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncSTDMETHODIMP FloppyDrive::COMGETTER(State) (DriveState_T *aDriveState)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (!aDriveState)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return E_POINTER;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller autoCaller (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync CheckComRCReturnRC (autoCaller.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoReaderLock alock (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync *aDriveState = mData->mDriveState;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return S_OK;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync// IFloppyDrive methods
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/////////////////////////////////////////////////////////////////////////////
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncSTDMETHODIMP FloppyDrive::MountImage (INPTR GUIDPARAM aImageId)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (Guid::isEmpty (aImageId))
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return E_INVALIDARG;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller autoCaller (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync CheckComRCReturnRC (autoCaller.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* the machine needs to be mutable */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Machine::AutoMutableStateDependency adep (mParent);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync CheckComRCReturnRC (adep.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoLock alock (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync HRESULT rc = E_FAIL;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* Our lifetime is bound to mParent's lifetime, so we don't add caller.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * We also don't lock mParent since its mParent field is const. */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync ComPtr <IFloppyImage> image;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync rc = mParent->virtualBox()->GetFloppyImage (aImageId, image.asOutParam());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (SUCCEEDED (rc))
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync {
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (mData->mDriveState != DriveState_ImageMounted ||
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync !mData->mFloppyImage.equalsTo (image))
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync {
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData.backup();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync unmount();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData->mFloppyImage = image;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData->mDriveState = DriveState_ImageMounted;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* leave the lock before informing callbacks */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync alock.unlock();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mParent->onFloppyDriveChange();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync }
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync }
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return rc;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncSTDMETHODIMP FloppyDrive::CaptureHostDrive (IHostFloppyDrive *aHostFloppyDrive)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (!aHostFloppyDrive)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return E_INVALIDARG;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller autoCaller (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync CheckComRCReturnRC (autoCaller.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* the machine needs to be mutable */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Machine::AutoMutableStateDependency adep (mParent);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync CheckComRCReturnRC (adep.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoLock alock (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (mData->mDriveState != DriveState_HostDriveCaptured ||
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync !mData->mHostDrive.equalsTo (aHostFloppyDrive))
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync {
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData.backup();
280173a9a1d01b33c087a762ffb9e522efe5c0d5vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync unmount();
280173a9a1d01b33c087a762ffb9e522efe5c0d5vboxsync
280173a9a1d01b33c087a762ffb9e522efe5c0d5vboxsync mData->mHostDrive = aHostFloppyDrive;
280173a9a1d01b33c087a762ffb9e522efe5c0d5vboxsync mData->mDriveState = DriveState_HostDriveCaptured;
280173a9a1d01b33c087a762ffb9e522efe5c0d5vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* leave the lock before informing callbacks */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync alock.unlock();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mParent->onFloppyDriveChange();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync }
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return S_OK;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncSTDMETHODIMP FloppyDrive::Unmount()
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller autoCaller (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync CheckComRCReturnRC (autoCaller.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* the machine needs to be mutable */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Machine::AutoMutableStateDependency adep (mParent);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync CheckComRCReturnRC (adep.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoLock alock (this);
280173a9a1d01b33c087a762ffb9e522efe5c0d5vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (mData->mDriveState != DriveState_NotMounted)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync {
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData.backup();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync unmount();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData->mDriveState = DriveState_NotMounted;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* leave the lock before informing callbacks */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync alock.unlock();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mParent->onFloppyDriveChange();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync }
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return S_OK;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncSTDMETHODIMP FloppyDrive::GetImage (IFloppyImage **aFloppyImage)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (!aFloppyImage)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return E_POINTER;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller autoCaller (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync CheckComRCReturnRC (autoCaller.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoReaderLock alock (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData->mFloppyImage.queryInterfaceTo (aFloppyImage);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return S_OK;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncSTDMETHODIMP FloppyDrive::GetHostDrive (IHostFloppyDrive **aHostDrive)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (!aHostDrive)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return E_POINTER;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller autoCaller (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync CheckComRCReturnRC (autoCaller.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoReaderLock alock (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData->mHostDrive.queryInterfaceTo (aHostDrive);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return S_OK;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync// public methods only for internal purposes
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/////////////////////////////////////////////////////////////////////////////
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/**
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * Loads settings from the given machine node.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * May be called once right after this object creation.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync *
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @param aMachineNode <Machine> node.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync *
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @note Locks this object for writing.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncHRESULT FloppyDrive::loadSettings (const settings::Key &aMachineNode)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync using namespace settings;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertReturn (!aMachineNode.isNull(), E_FAIL);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller autoCaller (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertComRCReturnRC (autoCaller.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoLock alock (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* Note: we assume that the default values for attributes of optional
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * nodes are assigned in the Data::Data() constructor and don't do it
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * here. It implies that this method may only be called after constructing
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * a new BIOSSettings object while all its data fields are in the default
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * values. Exceptions are fields whose creation time defaults don't match
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * values that should be applied when these fields are not explicitly set
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * in the settings file (for backwards compatibility reasons). This takes
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * place when a setting of a newly created object must default to A while
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * the same setting of an object loaded from the old settings file must
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * default to B. */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync HRESULT rc = S_OK;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* Floppy drive (required, contains either Image or HostDrive or nothing) */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Key floppyDriveNode = aMachineNode.key ("FloppyDrive");
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* optional, defaults to true */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData->mEnabled = floppyDriveNode.value <bool> ("enabled");
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Key typeNode;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (!(typeNode = floppyDriveNode.findKey ("Image")).isNull())
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync {
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Guid uuid = typeNode.value <Guid> ("uuid");
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync rc = MountImage (uuid);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync CheckComRCReturnRC (rc);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync }
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync else if (!(typeNode = floppyDriveNode.findKey ("HostDrive")).isNull())
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync {
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Bstr src = typeNode.stringValue ("src");
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* find the correspoding object */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync ComObjPtr <Host> host = mParent->virtualBox()->host();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync ComPtr <IHostFloppyDriveCollection> coll;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync rc = host->COMGETTER(FloppyDrives) (coll.asOutParam());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertComRC (rc);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync ComPtr <IHostFloppyDrive> drive;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync rc = coll->FindByName (src, drive.asOutParam());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (SUCCEEDED (rc))
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync {
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync rc = CaptureHostDrive (drive);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync CheckComRCReturnRC (rc);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync }
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync else if (rc == E_INVALIDARG)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync {
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* the host DVD drive is not currently available. we
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * assume it will be available later and create an
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * extra object now */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync ComObjPtr <HostFloppyDrive> hostDrive;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync hostDrive.createObject();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync rc = hostDrive->init (src);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertComRC (rc);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync rc = CaptureHostDrive (hostDrive);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync CheckComRCReturnRC (rc);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync }
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync else
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertComRC (rc);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync }
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return S_OK;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/**
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * Saves settings to the given machine node.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync *
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @param aMachineNode <Machine> node.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync *
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @note Locks this object for reading.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncHRESULT FloppyDrive::saveSettings (settings::Key &aMachineNode)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync using namespace settings;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertReturn (!aMachineNode.isNull(), E_FAIL);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller autoCaller (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertComRCReturnRC (autoCaller.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoReaderLock alock (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Key node = aMachineNode.createKey ("FloppyDrive");
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync node.setValue <bool> ("enabled", !!mData->mEnabled);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync switch (mData->mDriveState)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync {
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync case DriveState_ImageMounted:
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync {
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Assert (!mData->mFloppyImage.isNull());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Guid id;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync HRESULT rc = mData->mFloppyImage->COMGETTER(Id) (id.asOutParam());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertComRC (rc);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Assert (!id.isEmpty());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Key imageNode = node.createKey ("Image");
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync imageNode.setValue <Guid> ("uuid", id);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync break;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync }
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync case DriveState_HostDriveCaptured:
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync {
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Assert (!mData->mHostDrive.isNull());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Bstr name;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync HRESULT rc = mData->mHostDrive->COMGETTER(Name) (name.asOutParam());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertComRC (rc);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Assert (!name.isEmpty());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Key hostDriveNode = node.createKey ("HostDrive");
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync hostDriveNode.setValue <Bstr> ("src", name);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync break;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync }
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync case DriveState_NotMounted:
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* do nothing, i.e.leave the drive node empty */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync break;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync default:
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync ComAssertMsgFailedRet (("Invalid drive state: %d\n",
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData->mDriveState),
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync E_FAIL);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync }
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return S_OK;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/**
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @note Locks this object for writing.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncbool FloppyDrive::rollback()
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* sanity */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller autoCaller (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertComRCReturn (autoCaller.rc(), false);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoLock alock (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync bool changed = false;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (mData.isBackedUp())
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync {
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* we need to check all data to see whether anything will be changed
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * after rollback */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync changed = mData.hasActualChanges();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData.rollback();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync }
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return changed;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/**
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @note Locks this object for writing, together with the peer object (also
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * for writing) if there is one.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncvoid FloppyDrive::commit()
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* sanity */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller autoCaller (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertComRCReturnVoid (autoCaller.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* sanity too */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller thatCaller (mPeer);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertComRCReturnVoid (thatCaller.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* lock both for writing since we modify both */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoMultiLock <2> alock (this->wlock(), AutoLock::maybeWlock (mPeer));
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (mData.isBackedUp())
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync {
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData.commit();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (mPeer)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync {
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* attach new data to the peer and reshare it */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mPeer->mData.attach (mData);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync }
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync }
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/**
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @note Locks this object for writing, together with the peer object (locked
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * for reading) if there is one.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncvoid FloppyDrive::copyFrom (FloppyDrive *aThat)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* sanity */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller autoCaller (this);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertComRCReturnVoid (autoCaller.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* sanity too */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoCaller thatCaller (mPeer);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertComRCReturnVoid (thatCaller.rc());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* peer is not modified, lock it for reading */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoMultiLock <2> alock (this->wlock(), AutoLock::maybeRlock (mPeer));
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* this will back up current data */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData.assignCopy (aThat->mData);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync// private methods
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/////////////////////////////////////////////////////////////////////////////
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/**
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * Helper to unmount a drive.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync *
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @return COM status code
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncHRESULT FloppyDrive::unmount()
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync{
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AssertReturn (isLockedOnCurrentThread(), E_FAIL);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (mData->mFloppyImage)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData->mFloppyImage.setNull();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (mData->mHostDrive)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData->mHostDrive.setNull();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync return S_OK;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync}
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync