MediumImpl.h revision 68b7971bd3dc7072763235a81c6015b4863751a1
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * VirtualBox COM class implementation
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Copyright (C) 2008-2009 Sun Microsystems, Inc.
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 * 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 * Medium component class for all media types.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync typedef VirtualBoxBaseWithTypedChildren<Medium>::DependentChildren List;
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 // public initializer/uninitializer for internal purposes only
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // initializer used when loading settings
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // initializer for host floppy/DVD
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // IMedium properties
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(Description))(BSTR *aDescription);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMSETTER(Description))(IN_BSTR aDescription);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(State))(MediumState_T *aState);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(DeviceType))(DeviceType_T *aDeviceType);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(Children))(ComSafeArrayOut(IMedium *, aChildren));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(LogicalSize))(ULONG64 *aLogicalSize);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(LastAccessError))(BSTR *aLastAccessError);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(COMGETTER(MachineIds))(ComSafeArrayOut(BSTR, aMachineIds));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // IMedium methods
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(GetProperty)(IN_BSTR aName, BSTR *aValue);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(SetProperty)(IN_BSTR aName, IN_BSTR aValue);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(SetProperties)(ComSafeArrayIn(IN_BSTR, aNames),
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(MergeTo)(IN_BSTR aTargetId, IProgress **aProgress);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(CloneTo)(IMedium *aTarget, MediumVariant_T aVariant,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync STDMETHOD(Resize)(ULONG64 aLogicalSize, IProgress **aProgress);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // public methods for internal purposes only
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT updatePath(const char *aOldPath, const char *aNewPath);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const Guid* getFirstMachineBackrefSnapshotId() const;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Shortcut to VirtualBoxBaseWithTypedChildrenNEXT::dependentChildren().
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const List& getChildren() const { return dependentChildren(); }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync void updatePaths(const char *aOldPath, const char *aNewPath);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComObjPtr<Medium> getBase(uint32_t *aLevel = NULL);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT compareLocationTo(const char *aLocation, int &aResult);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Shortcut to #deleteStorage() that doesn't wait for operation completion
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * and implies the progress object will be used for waiting.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT deleteStorageNoWait(ComObjPtr<Progress> &aProgress)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync { return deleteStorage(&aProgress, false /* aWait */); }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Shortcut to #deleteStorage() that wait for operation completion by
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * blocking the current thread.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT deleteStorageAndWait(ComObjPtr<Progress> *aProgress = NULL)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync { return deleteStorage(aProgress, true /* aWait */); }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Shortcut to #createDiffStorage() that doesn't wait for operation
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * completion and implies the progress object will be used for waiting.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT createDiffStorageNoWait(ComObjPtr<Medium> &aTarget,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync { return createDiffStorage(aTarget, aVariant, &aProgress, false /* aWait */); }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Shortcut to #createDiffStorage() that wait for operation completion by
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * blocking the current thread.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT createDiffStorageAndWait(ComObjPtr<Medium> &aTarget,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync { return createDiffStorage(aTarget, aVariant, aProgress, true /* aWait */); }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT prepareMergeTo(Medium *aTarget, MergeChain * &aChain,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Shortcut to #mergeTo() that doesn't wait for operation completion and
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * implies the progress object will be used for waiting.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync { return mergeTo(aChain, &aProgress, false /* aWait */); }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Shortcut to #mergeTo() that wait for operation completion by
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * blocking the current thread.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync { return mergeTo(aChain, aProgress, true /* aWait */); }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT discard(ComObjPtr<Progress> &aProgress, ULONG ulWeight, MergeChain *aChain);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /** Returns a preferred format for a differencing hard disk. */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // unsafe inline public methods for internal purposes only (ensure there is
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // a caller and a read lock before calling them!)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComObjPtr<Medium> getParent() const { return static_cast<Medium *>(mParent); }
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync /** For com::SupportErrorInfoImpl. */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync static const char *ComponentName() { return "Medium"; }
fb1975a6972d89de9e515bed0248db93f04ec9d8vboxsync /** Reimplements VirtualBoxWithTypedChildren::childrenLock() to return
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync * treeLock(). */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync RWLockHandle *childrenLock() { return getTreeLock(); }
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 * Unregisters this medium with mVirtualBox. Called by Close() from within
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * this object's AutoMayUninitSpan and from under mVirtualBox write lock.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /** weak VirtualBox parent */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const ComObjPtr<VirtualBox, ComWeakRef> mVirtualBox;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT deleteStorage(ComObjPtr<Progress> *aProgress, bool aWait);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT createDiffStorage(ComObjPtr<Medium> &aTarget,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT setLocation(const Utf8Str &aLocation, const Utf8Str &aFormat = Utf8Str());
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync static DECLCALLBACK(void) vdErrorCall(void *pvUser, int rc, RT_SRC_POS_DECL,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync static DECLCALLBACK(int) vdProgressCall(VM* /* pVM */, unsigned uPercent,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync static DECLCALLBACK(bool) vdConfigAreKeysValid(void *pvUser,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const char *pszzValid);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync static DECLCALLBACK(int) vdConfigQuerySize(void *pvUser, const char *pszName,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync static DECLCALLBACK(int) vdConfigQuery(void *pvUser, const char *pszName,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync static DECLCALLBACK(int) taskThread(RTTHREAD thread, void *pvUser);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /** weak parent */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync struct Data; // opaque data struct, defined in MediumImpl.cpp
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#endif /* ____H_MEDIUMIMPL */