FloppyDriveImpl.cpp revision d46ee884c41b808b239563b1978468aae12e33a2
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * VirtualBox COM class implementation
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2006-2007 innotek GmbH
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// constructor / destructor
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/////////////////////////////////////////////////////////////////////////////
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync// public initializer/uninitializer for internal purposes only
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/////////////////////////////////////////////////////////////////////////////
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * Initializes the Floppy drive object.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @param aParent Handle of the parent object.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* Enclose the state transition NotReady->InInit->Ready */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* mPeer is left null */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* Confirm a successful initialization */
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 * @note This object must be destroyed before the original object
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * it shares data with is destroyed.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @note Locks @a aThat object for reading.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncHRESULT FloppyDrive::init (Machine *aParent, FloppyDrive *aThat)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync LogFlowThisFunc (("aParent=%p, aThat=%p\n", aParent, aThat));
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* Enclose the state transition NotReady->InInit->Ready */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* Confirm a successful initialization */
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 * @note Locks @a aThat object for reading.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncHRESULT FloppyDrive::initCopy (Machine *aParent, FloppyDrive *aThat)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync LogFlowThisFunc (("aParent=%p, aThat=%p\n", aParent, aThat));
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* Enclose the state transition NotReady->InInit->Ready */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* mPeer is left null */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* Confirm a successful initialization */
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 /* Enclose the state transition Ready->InUninit->NotReady */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync// IFloppyDrive properties
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/////////////////////////////////////////////////////////////////////////////
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncSTDMETHODIMP FloppyDrive::COMGETTER(Enabled) (BOOL *aEnabled)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncSTDMETHODIMP FloppyDrive::COMSETTER(Enabled) (BOOL aEnabled)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync LogFlowThisFunc (("aEnabled=%RTbool\n", aEnabled));
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* the machine needs to be mutable */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Machine::AutoMutableStateDependency adep (mParent);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* leave the lock before informing callbacks */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncSTDMETHODIMP FloppyDrive::COMGETTER(State) (DriveState_T *aDriveState)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync// IFloppyDrive methods
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/////////////////////////////////////////////////////////////////////////////
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncSTDMETHODIMP FloppyDrive::MountImage (INPTR GUIDPARAM aImageId)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* the machine needs to be mutable */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Machine::AutoMutableStateDependency adep (mParent);
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 rc = mParent->virtualBox()->GetFloppyImage (aImageId, image.asOutParam());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (mData->mDriveState != DriveState_ImageMounted ||
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* leave the lock before informing callbacks */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncSTDMETHODIMP FloppyDrive::CaptureHostDrive (IHostFloppyDrive *aHostFloppyDrive)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* the machine needs to be mutable */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Machine::AutoMutableStateDependency adep (mParent);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (mData->mDriveState != DriveState_HostDriveCaptured ||
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* leave the lock before informing callbacks */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* the machine needs to be mutable */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Machine::AutoMutableStateDependency adep (mParent);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* leave the lock before informing callbacks */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncSTDMETHODIMP FloppyDrive::GetImage (IFloppyImage **aFloppyImage)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData->mFloppyImage.queryInterfaceTo (aFloppyImage);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncSTDMETHODIMP FloppyDrive::GetHostDrive (IHostFloppyDrive **aHostDrive)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync// public methods only for internal purposes
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/////////////////////////////////////////////////////////////////////////////
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * Loads settings from the given machine node.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * May be called once right after this object creation.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @param aMachineNode <Machine> node.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @note Locks this object for writing.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncHRESULT FloppyDrive::loadSettings (const settings::Key &aMachineNode)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync using namespace settings;
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 /* Floppy drive (required, contains either Image or HostDrive or nothing) */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync Key floppyDriveNode = aMachineNode.key ("FloppyDrive");
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* optional, defaults to true */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync mData->mEnabled = floppyDriveNode.value <bool> ("enabled");
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync if (!(typeNode = floppyDriveNode.findKey ("Image")).isNull())
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync else if (!(typeNode = floppyDriveNode.findKey ("HostDrive")).isNull())
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* find the correspoding object */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync ComObjPtr <Host> host = mParent->virtualBox()->host();
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync rc = host->COMGETTER(FloppyDrives) (coll.asOutParam());
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 * Saves settings to the given machine node.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @param aMachineNode <Machine> node.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @note Locks this object for reading.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsyncHRESULT FloppyDrive::saveSettings (settings::Key &aMachineNode)
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync using namespace settings;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync node.setValue <bool> ("enabled", !!mData->mEnabled);
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync HRESULT rc = mData->mFloppyImage->COMGETTER(Id) (id.asOutParam());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync HRESULT rc = mData->mHostDrive->COMGETTER(Name) (name.asOutParam());
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* do nothing, i.e.leave the drive node empty */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync ComAssertMsgFailedRet (("Invalid drive state: %d\n",
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @note Locks this object for writing.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* sanity */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync bool changed = false;
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* we need to check all data to see whether anything will be changed
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * after rollback */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @note Locks this object for writing, together with the peer object (also
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * for writing) if there is one.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* sanity */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* sanity too */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* lock both for writing since we modify both */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoMultiLock <2> alock (this->wlock(), AutoLock::maybeWlock (mPeer));
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* attach new data to the peer and reshare it */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @note Locks this object for writing, together with the peer object (locked
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * for reading) if there is one.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* sanity */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* sanity too */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* peer is not modified, lock it for reading */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync AutoMultiLock <2> alock (this->wlock(), AutoLock::maybeRlock (mPeer));
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync /* this will back up current data */
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync// private methods
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync/////////////////////////////////////////////////////////////////////////////
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * Helper to unmount a drive.
8c48cf39dfb84c1f26e0e7fbd1c407e25a34eef1vboxsync * @return COM status code