MediumAttachmentImpl.cpp revision d9dbe2e6150d8025f5ff837b11a95ca18b511fb8
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync/** @file
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync *
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * VirtualBox COM class implementation
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync */
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync/*
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * Copyright (C) 2006-2009 Sun Microsystems, Inc.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync *
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * available from http://www.virtualbox.org. This file is free software;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * you can redistribute it and/or modify it under the terms of the GNU
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * General Public License (GPL) as published by the Free Software
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync *
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * additional information or have any questions.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync */
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync#include "MediumAttachmentImpl.h"
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync#include "MachineImpl.h"
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync#include "MediumImpl.h"
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync#include "Global.h"
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync#include "Logging.h"
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync////////////////////////////////////////////////////////////////////////////////
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync//
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync// private member data definition
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync//
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync////////////////////////////////////////////////////////////////////////////////
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsyncstruct BackupableMediumAttachmentData
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync{
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync BackupableMediumAttachmentData()
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync : lPort(0),
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync lDevice(0),
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync type(DeviceType_Null),
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync fPassthrough(false),
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync fImplicit(false)
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync { }
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync bool operator==(const BackupableMediumAttachmentData &that) const
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync {
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync return this == &that
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync || (fPassthrough == that.fPassthrough);
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync }
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync ComObjPtr<Medium> pMedium;
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync /* Since MediumAttachment is not a first class citizen when it
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * comes to managing settings, having a reference to the storage
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync * controller will not work - when settings are changed it will point
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * to the old, uninitialized instance. Changing this requires
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync * substantial changes to MediumImpl.cpp. */
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync const Bstr bstrControllerName;
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync const LONG lPort;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync const LONG lDevice;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync const DeviceType_T type;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync bool fPassthrough : 1;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync bool fImplicit : 1;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync};
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsyncstruct MediumAttachment::Data
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync{
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync Data()
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync { }
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync /** Reference to Machine object, for checking mutable state. */
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync const ComObjPtr<Machine, ComWeakRef> pMachine;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync /* later: const ComObjPtr<MediumAttachment> mPeer; */
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync Backupable<BackupableMediumAttachmentData> bd;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync};
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync// constructor / destructor
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync/////////////////////////////////////////////////////////////////////////////
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsyncHRESULT MediumAttachment::FinalConstruct()
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync{
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync LogFlowThisFunc(("\n"));
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync return S_OK;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync}
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsyncvoid MediumAttachment::FinalRelease()
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync{
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync LogFlowThisFuncEnter();
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync uninit();
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync LogFlowThisFuncLeave();
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync}
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync// public initializer/uninitializer for internal purposes only
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync/////////////////////////////////////////////////////////////////////////////
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync/**
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * Initializes the medium attachment object.
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync *
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * @param aParent Machine object.
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * @param aMedium Medium object.
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * @param aController Controller the hard disk is attached to.
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * @param aPort Port number.
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * @param aDevice Device number on the port.
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * @param aPassthrough Wether accesses are directly passed to the host drive.
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync */
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsyncHRESULT MediumAttachment::init(Machine *aParent,
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync Medium *aMedium,
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync const Bstr &aControllerName,
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync LONG aPort,
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync LONG aDevice,
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync DeviceType_T aType,
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync bool aPassthrough)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync{
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync LogFlowThisFuncEnter();
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync LogFlowThisFunc(("aParent=%p aMedium=%p aControllerName=%ls aPort=%d aDevice=%d aType=%d aPassthrough=%d\n", aParent, aMedium, aControllerName.raw(), aPort, aDevice, aType, aPassthrough));
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync if (aType == DeviceType_HardDisk)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync AssertReturn(aMedium, E_INVALIDARG);
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync /* Enclose the state transition NotReady->InInit->Ready */
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync AutoInitSpan autoInitSpan(this);
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync AssertReturn(autoInitSpan.isOk(), E_FAIL);
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync m = new Data();
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync unconst(m->pMachine) = aParent;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync m->bd.allocate();
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync m->bd->pMedium = aMedium;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync unconst(m->bd->bstrControllerName) = aControllerName;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync unconst(m->bd->lPort) = aPort;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync unconst(m->bd->lDevice) = aDevice;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync unconst(m->bd->type) = aType;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync m->bd->fPassthrough = aPassthrough;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync /* Newly created attachments never have an implicitly created medium
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * associated with them. Implicit diff image creation happens later. */
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync m->bd->fImplicit = false;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync /* Confirm a successful initialization when it's the case */
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync autoInitSpan.setSucceeded();
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync /* Construct a short log name for this attachment. */
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync Utf8Str ctlName(aControllerName);
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync const char *psz = strpbrk(ctlName.c_str(), " \t:-");
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync mLogName = Utf8StrFmt("MA%p[%.*s:%u:%u:%s%s]",
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync this,
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync psz ? psz - ctlName.c_str() : 4, ctlName.c_str(),
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync aPort, aDevice, Global::stringifyDeviceType(aType),
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync m->bd->fImplicit ? ":I" : "");
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync LogFlowThisFunc(("LEAVE - %s\n", getLogName()));
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync return S_OK;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync}
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync/**
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * Uninitializes the instance.
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * Called from FinalRelease().
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync */
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsyncvoid MediumAttachment::uninit()
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync{
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync LogFlowThisFunc(("ENTER - %s\n", getLogName()));
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync /* Enclose the state transition Ready->InUninit->NotReady */
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync AutoUninitSpan autoUninitSpan(this);
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync if (autoUninitSpan.uninitDone())
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync return;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync m->bd.free();
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync unconst(m->pMachine).setNull();
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync delete m;
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync m = NULL;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync LogFlowThisFuncLeave();
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync}
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync// IHardDiskAttachment properties
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync/////////////////////////////////////////////////////////////////////////////
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsyncSTDMETHODIMP MediumAttachment::COMGETTER(Medium)(IMedium **aHardDisk)
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync{
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync LogFlowThisFuncEnter();
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync CheckComArgOutPointerValid(aHardDisk);
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync AutoCaller autoCaller(this);
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync m->bd->pMedium.queryInterfaceTo(aHardDisk);
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync LogFlowThisFuncLeave();
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync return S_OK;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync}
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsyncSTDMETHODIMP MediumAttachment::COMGETTER(Controller)(BSTR *aController)
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync{
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync LogFlowThisFuncEnter();
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync CheckComArgOutPointerValid(aController);
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync AutoCaller autoCaller(this);
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync /* m->controller is constant during life time, no need to lock */
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync m->bd->bstrControllerName.cloneTo(aController);
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync LogFlowThisFuncLeave();
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync return S_OK;
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync}
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsyncSTDMETHODIMP MediumAttachment::COMGETTER(Port)(LONG *aPort)
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync{
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync LogFlowThisFuncEnter();
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync CheckComArgOutPointerValid(aPort);
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync AutoCaller autoCaller(this);
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync /* m->bd->port is constant during life time, no need to lock */
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync *aPort = m->bd->lPort;
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync LogFlowThisFuncLeave();
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync return S_OK;
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync}
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsyncSTDMETHODIMP MediumAttachment::COMGETTER(Device)(LONG *aDevice)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync{
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync LogFlowThisFuncEnter();
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync CheckComArgOutPointerValid(aDevice);
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync AutoCaller autoCaller(this);
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync /* m->bd->device is constant during life time, no need to lock */
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync *aDevice = m->bd->lDevice;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync LogFlowThisFuncLeave();
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync return S_OK;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync}
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsyncSTDMETHODIMP MediumAttachment::COMGETTER(Type)(DeviceType_T *aType)
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync{
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync LogFlowThisFuncEnter();
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync CheckComArgOutPointerValid(aType);
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
bf11cc8a816102c7f343cb5cc113e7a08fa129a0vboxsync AutoCaller autoCaller(this);
bf11cc8a816102c7f343cb5cc113e7a08fa129a0vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync /* m->bd->type is constant during life time, no need to lock */
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync *aType = m->bd->type;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync LogFlowThisFuncLeave();
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync return S_OK;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync}
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsyncSTDMETHODIMP MediumAttachment::COMGETTER(Passthrough)(BOOL *aPassthrough)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync{
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync LogFlowThisFuncEnter();
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync CheckComArgOutPointerValid(aPassthrough);
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync AutoCaller autoCaller(this);
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync AutoReadLock lock(this COMMA_LOCKVAL_SRC_POS);
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync *aPassthrough = m->bd->fPassthrough;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync LogFlowThisFuncLeave();
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync return S_OK;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync}
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync/**
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * @note Locks this object for writing.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync */
71955773a7f477f9a159a491f765ba97e1f00e1avboxsyncbool MediumAttachment::rollback()
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync{
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync LogFlowThisFunc(("ENTER - %s\n", getLogName()));
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync /* sanity */
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync AutoCaller autoCaller(this);
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync AssertComRCReturn (autoCaller.rc(), false);
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync bool changed = false;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync if (m->bd.isBackedUp())
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync {
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync /* we need to check all data to see whether anything will be changed
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * after rollback */
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync changed = m->bd.hasActualChanges();
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync m->bd.rollback();
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync }
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync LogFlowThisFunc(("LEAVE - %s - returning %RTbool\n", getLogName(), changed));
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync return changed;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync}
/**
* @note Locks this object for writing.
*/
void MediumAttachment::commit()
{
LogFlowThisFuncEnter();
/* sanity */
AutoCaller autoCaller(this);
AssertComRCReturnVoid (autoCaller.rc());
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
if (m->bd.isBackedUp())
m->bd.commit();
LogFlowThisFuncLeave();
}
bool MediumAttachment::isImplicit() const
{
return m->bd->fImplicit;
}
void MediumAttachment::setImplicit(bool aImplicit)
{
m->bd->fImplicit = aImplicit;
}
const ComObjPtr<Medium>& MediumAttachment::getMedium() const
{
return m->bd->pMedium;
}
Bstr MediumAttachment::getControllerName() const
{
return m->bd->bstrControllerName;
}
LONG MediumAttachment::getPort() const
{
return m->bd->lPort;
}
LONG MediumAttachment::getDevice() const
{
return m->bd->lDevice;
}
DeviceType_T MediumAttachment::getType() const
{
return m->bd->type;
}
bool MediumAttachment::getPassthrough() const
{
AutoReadLock lock(this COMMA_LOCKVAL_SRC_POS);
return m->bd->fPassthrough;
}
bool MediumAttachment::matches(CBSTR aControllerName, LONG aPort, LONG aDevice)
{
return ( aControllerName == m->bd->bstrControllerName
&& aPort == m->bd->lPort
&& aDevice == m->bd->lDevice);
}
/** Must be called from under this object's write lock. */
void MediumAttachment::updateMedium(const ComObjPtr<Medium> &aMedium, bool aImplicit)
{
m->bd.backup();
m->bd->pMedium = aMedium;
m->bd->fImplicit = aImplicit;
}
/** Must be called from under this object's write lock. */
void MediumAttachment::updatePassthrough(bool aPassthrough)
{
m->bd.backup();
m->bd->fPassthrough = aPassthrough;
}