MediumImpl.h revision 68b7971bd3dc7072763235a81c6015b4863751a1
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/* $Id$ */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/** @file
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * VirtualBox COM class implementation
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync/*
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Copyright (C) 2008-2009 Sun Microsystems, Inc.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * available from http://www.virtualbox.org. This file is free software;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * you can redistribute it and/or modify it under the terms of the GNU
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * General Public License (GPL) as published by the Free Software
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * additional information or have any questions.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#ifndef ____H_MEDIUMIMPL
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#define ____H_MEDIUMIMPL
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#include "VirtualBoxBase.h"
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#include <VBox/com/SupportErrorInfo.h>
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncclass VirtualBox;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncclass Progress;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncstruct VM;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncnamespace settings
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync struct Medium;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync////////////////////////////////////////////////////////////////////////////////
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Medium component class for all media types.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncclass ATL_NO_VTABLE Medium :
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync public VirtualBoxBaseWithTypedChildren<Medium>,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync public com::SupportErrorInfoImpl<Medium, IMedium>,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync public VirtualBoxSupportTranslation<Medium>,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync VBOX_SCRIPTABLE_IMPL(IMedium)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncpublic:
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync typedef VirtualBoxBaseWithTypedChildren<Medium>::DependentChildren List;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync class MergeChain;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync class ImageChain;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(Medium)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync DECLARE_NOT_AGGREGATABLE(Medium)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync DECLARE_PROTECT_FINAL_CONSTRUCT()
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync BEGIN_COM_MAP(Medium)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync COM_INTERFACE_ENTRY(ISupportErrorInfo)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync COM_INTERFACE_ENTRY(IMedium)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync END_COM_MAP()
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync DECLARE_EMPTY_CTOR_DTOR(Medium)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync enum HDDOpenMode { OpenReadWrite, OpenReadOnly };
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // have to use a special enum for the overloaded init() below;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // can't use AccessMode_T from XIDL because that's mapped to an int
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // and would be ambiguous
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // public initializer/uninitializer for internal purposes only
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT init(VirtualBox *aVirtualBox,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync CBSTR aFormat,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync CBSTR aLocation);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT init(VirtualBox *aVirtualBox,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync CBSTR aLocation,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HDDOpenMode enOpenMode,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync DeviceType_T aDeviceType,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync BOOL aSetImageId,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const Guid &aImageId,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync BOOL aSetParentId,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const Guid &aParentId);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // initializer used when loading settings
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT init(VirtualBox *aVirtualBox,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Medium *aParent,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync DeviceType_T aDeviceType,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const settings::Medium &data);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // initializer for host floppy/DVD
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT init(VirtualBox *aVirtualBox,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync DeviceType_T aDeviceType,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync CBSTR aLocation,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync CBSTR aDescription = NULL);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync void uninit();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // IMedium properties
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(Id))(BSTR *aId);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(Description))(BSTR *aDescription);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMSETTER(Description))(IN_BSTR aDescription);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(State))(MediumState_T *aState);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(Location))(BSTR *aLocation);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMSETTER(Location))(IN_BSTR aLocation);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(Name))(BSTR *aName);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(DeviceType))(DeviceType_T *aDeviceType);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(HostDrive))(BOOL *aHostDrive);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(Size))(ULONG64 *aSize);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(Format))(BSTR *aFormat);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(Type))(MediumType_T *aType);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMSETTER(Type))(MediumType_T aType);
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync STDMETHOD(COMGETTER(Parent))(IMedium **aParent);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(Children))(ComSafeArrayOut(IMedium *, aChildren));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(Base))(IMedium **aBase);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(ReadOnly))(BOOL *aReadOnly);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(LogicalSize))(ULONG64 *aLogicalSize);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(AutoReset))(BOOL *aAutoReset);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMSETTER(AutoReset))(BOOL aAutoReset);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(LastAccessError))(BSTR *aLastAccessError);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(MachineIds))(ComSafeArrayOut(BSTR, aMachineIds));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // IMedium methods
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(RefreshState)(MediumState_T *aState);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(GetSnapshotIds)(IN_BSTR aMachineId,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComSafeArrayOut(BSTR, aSnapshotIds));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(LockRead)(MediumState_T *aState);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(UnlockRead)(MediumState_T *aState);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(LockWrite)(MediumState_T *aState);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(UnlockWrite)(MediumState_T *aState);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(Close)();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(GetProperty)(IN_BSTR aName, BSTR *aValue);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(SetProperty)(IN_BSTR aName, IN_BSTR aValue);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(GetProperties)(IN_BSTR aNames,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComSafeArrayOut(BSTR, aReturnNames),
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComSafeArrayOut(BSTR, aReturnValues));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(SetProperties)(ComSafeArrayIn(IN_BSTR, aNames),
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComSafeArrayIn(IN_BSTR, aValues));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(CreateBaseStorage)(ULONG64 aLogicalSize,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync MediumVariant_T aVariant,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync IProgress **aProgress);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(DeleteStorage)(IProgress **aProgress);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(CreateDiffStorage)(IMedium *aTarget,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync MediumVariant_T aVariant,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync IProgress **aProgress);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(MergeTo)(IN_BSTR aTargetId, IProgress **aProgress);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(CloneTo)(IMedium *aTarget, MediumVariant_T aVariant,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync IMedium *aParent, IProgress **aProgress);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(Compact)(IProgress **aProgress);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(Resize)(ULONG64 aLogicalSize, IProgress **aProgress);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(Reset)(IProgress **aProgress);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // public methods for internal purposes only
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT FinalConstruct();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync void FinalRelease();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT updatePath(const char *aOldPath, const char *aNewPath);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT attachTo(const Guid &aMachineId,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const Guid &aSnapshotId = Guid::Empty);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT detachFrom(const Guid &aMachineId,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const Guid &aSnapshotId = Guid::Empty);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#ifdef DEBUG
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync void dumpBackRefs();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#endif
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const Guid& getId() const;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync MediumState_T getState() const;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const Utf8Str& getLocation() const;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const Utf8Str& getLocationFull() const;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync uint64_t getSize() const;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const Guid* getFirstMachineBackrefId() const;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const Guid* getFirstMachineBackrefSnapshotId() const;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Shortcut to VirtualBoxBaseWithTypedChildrenNEXT::dependentChildren().
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const List& getChildren() const { return dependentChildren(); }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync void updatePaths(const char *aOldPath, const char *aNewPath);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComObjPtr<Medium> getBase(uint32_t *aLevel = NULL);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync bool isReadOnly();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT saveSettings(settings::Medium &data);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT compareLocationTo(const char *aLocation, int &aResult);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Shortcut to #deleteStorage() that doesn't wait for operation completion
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * and implies the progress object will be used for waiting.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT deleteStorageNoWait(ComObjPtr<Progress> &aProgress)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync { return deleteStorage(&aProgress, false /* aWait */); }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Shortcut to #deleteStorage() that wait for operation completion by
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * blocking the current thread.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT deleteStorageAndWait(ComObjPtr<Progress> *aProgress = NULL)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync { return deleteStorage(aProgress, true /* aWait */); }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Shortcut to #createDiffStorage() that doesn't wait for operation
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * completion and implies the progress object will be used for waiting.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT createDiffStorageNoWait(ComObjPtr<Medium> &aTarget,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync MediumVariant_T aVariant,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComObjPtr<Progress> &aProgress)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync { return createDiffStorage(aTarget, aVariant, &aProgress, false /* aWait */); }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Shortcut to #createDiffStorage() that wait for operation completion by
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * blocking the current thread.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT createDiffStorageAndWait(ComObjPtr<Medium> &aTarget,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync MediumVariant_T aVariant,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComObjPtr<Progress> *aProgress = NULL)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync { return createDiffStorage(aTarget, aVariant, aProgress, true /* aWait */); }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT prepareMergeTo(Medium *aTarget, MergeChain * &aChain,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync bool aIgnoreAttachments = false);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Shortcut to #mergeTo() that doesn't wait for operation completion and
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * implies the progress object will be used for waiting.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT mergeToNoWait(MergeChain *aChain,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComObjPtr<Progress> &aProgress)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync { return mergeTo(aChain, &aProgress, false /* aWait */); }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Shortcut to #mergeTo() that wait for operation completion by
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * blocking the current thread.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT mergeToAndWait(MergeChain *aChain,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComObjPtr<Progress> *aProgress = NULL)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync { return mergeTo(aChain, aProgress, true /* aWait */); }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync void cancelMergeTo(MergeChain *aChain);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Utf8Str getName();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT prepareDiscard(MergeChain * &aChain);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT discard(ComObjPtr<Progress> &aProgress, ULONG ulWeight, MergeChain *aChain);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync void cancelDiscard(MergeChain *aChain);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /** Returns a preferred format for a differencing hard disk. */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Bstr preferredDiffFormat();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // unsafe inline public methods for internal purposes only (ensure there is
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // a caller and a read lock before calling them!)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComObjPtr<Medium> getParent() const { return static_cast<Medium *>(mParent); }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync MediumType_T getType() const;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync /** For com::SupportErrorInfoImpl. */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync static const char *ComponentName() { return "Medium"; }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncprotected:
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync RWLockHandle* getTreeLock();
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync
fb1975a6972d89de9e515bed0248db93f04ec9d8vboxsync /** Reimplements VirtualBoxWithTypedChildren::childrenLock() to return
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync * treeLock(). */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync RWLockHandle *childrenLock() { return getTreeLock(); }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsyncprivate:
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync HRESULT queryInfo();
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync /**
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync * Performs extra checks if the medium can be closed and returns S_OK in
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync * this case. Otherwise, returns a respective error message. Called by
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Close() from within this object's AutoMayUninitSpan and from under
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * mVirtualBox write lock.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT canClose();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Unregisters this medium with mVirtualBox. Called by Close() from within
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * this object's AutoMayUninitSpan and from under mVirtualBox write lock.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT unregisterWithVirtualBox();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT setStateError();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /** weak VirtualBox parent */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const ComObjPtr<VirtualBox, ComWeakRef> mVirtualBox;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT deleteStorage(ComObjPtr<Progress> *aProgress, bool aWait);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT createDiffStorage(ComObjPtr<Medium> &aTarget,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync MediumVariant_T aVariant,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComObjPtr<Progress> *aProgress,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync bool aWait);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT mergeTo(MergeChain *aChain,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComObjPtr<Progress> *aProgress,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync bool aWait);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT setLocation(const Utf8Str &aLocation, const Utf8Str &aFormat = Utf8Str());
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT setFormat(CBSTR aFormat);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Utf8Str vdError(int aVRC);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync static DECLCALLBACK(void) vdErrorCall(void *pvUser, int rc, RT_SRC_POS_DECL,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const char *pszFormat, va_list va);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync static DECLCALLBACK(int) vdProgressCall(VM* /* pVM */, unsigned uPercent,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync void *pvUser);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync static DECLCALLBACK(bool) vdConfigAreKeysValid(void *pvUser,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const char *pszzValid);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync static DECLCALLBACK(int) vdConfigQuerySize(void *pvUser, const char *pszName,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync size_t *pcbValue);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync static DECLCALLBACK(int) vdConfigQuery(void *pvUser, const char *pszName,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync char *pszValue, size_t cchValue);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync static DECLCALLBACK(int) taskThread(RTTHREAD thread, void *pvUser);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /** weak parent */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComObjPtr<Medium, ComWeakRef> mParent;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync struct Task;
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync friend struct Task;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync struct Data; // opaque data struct, defined in MediumImpl.cpp
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Data *m;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync};
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#endif /* ____H_MEDIUMIMPL */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync