VirtualBox

source: vbox/trunk/src/VBox/Main/include/MediumImpl.h@ 31063

Last change on this file since 31063 was 31063, checked in by vboxsync, 15 years ago

Main/Medium: Implement medium type Shareable, and along the way added a method to query the medium variant. Lots of terminology cleanup to make sure the error messages talk about "medium" instead of "hard disk", as the latter sometimes also showed up in errors about floppy/DVD images.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.8 KB
Line 
1/* $Id: MediumImpl.h 31063 2010-07-23 14:36:53Z vboxsync $ */
2
3/** @file
4 *
5 * VirtualBox COM class implementation
6 */
7
8/*
9 * Copyright (C) 2008-2010 Oracle Corporation
10 *
11 * This file is part of VirtualBox Open Source Edition (OSE), as
12 * available from http://www.virtualbox.org. This file is free software;
13 * you can redistribute it and/or modify it under the terms of the GNU
14 * General Public License (GPL) as published by the Free Software
15 * Foundation, in version 2 as it comes in the "COPYING" file of the
16 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
17 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
18 */
19
20#ifndef ____H_MEDIUMIMPL
21#define ____H_MEDIUMIMPL
22
23#include "VirtualBoxBase.h"
24#include "MediumLock.h"
25
26class Progress;
27class MediumFormat;
28
29namespace settings
30{
31 struct Medium;
32}
33
34////////////////////////////////////////////////////////////////////////////////
35
36/**
37 * Medium component class for all media types.
38 */
39class ATL_NO_VTABLE Medium :
40 public VirtualBoxBase,
41 VBOX_SCRIPTABLE_IMPL(IMedium)
42{
43public:
44 VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(Medium, IMedium)
45
46 DECLARE_NOT_AGGREGATABLE(Medium)
47
48 DECLARE_PROTECT_FINAL_CONSTRUCT()
49
50 BEGIN_COM_MAP(Medium)
51 COM_INTERFACE_ENTRY(ISupportErrorInfo)
52 COM_INTERFACE_ENTRY(IMedium)
53 COM_INTERFACE_ENTRY(IDispatch)
54 END_COM_MAP()
55
56 DECLARE_EMPTY_CTOR_DTOR(Medium)
57
58 HRESULT FinalConstruct();
59 void FinalRelease();
60
61 enum HDDOpenMode { OpenReadWrite, OpenReadOnly };
62 // have to use a special enum for the overloaded init() below;
63 // can't use AccessMode_T from XIDL because that's mapped to an int
64 // and would be ambiguous
65
66 // public initializer/uninitializer for internal purposes only
67 HRESULT init(VirtualBox *aVirtualBox,
68 CBSTR aFormat,
69 CBSTR aLocation,
70 bool *pfNeedsSaveSettings);
71 HRESULT init(VirtualBox *aVirtualBox,
72 CBSTR aLocation,
73 HDDOpenMode enOpenMode,
74 DeviceType_T aDeviceType,
75 BOOL aSetImageId,
76 const Guid &aImageId,
77 BOOL aSetParentId,
78 const Guid &aParentId);
79 // initializer used when loading settings
80 HRESULT init(VirtualBox *aVirtualBox,
81 Medium *aParent,
82 DeviceType_T aDeviceType,
83 const settings::Medium &data);
84 // initializer for host floppy/DVD
85 HRESULT init(VirtualBox *aVirtualBox,
86 DeviceType_T aDeviceType,
87 CBSTR aLocation,
88 CBSTR aDescription = NULL);
89 void uninit();
90
91 void deparent();
92 void setParent(const ComObjPtr<Medium> &pParent);
93
94 // IMedium properties
95 STDMETHOD(COMGETTER(Id))(BSTR *aId);
96 STDMETHOD(COMGETTER(Description))(BSTR *aDescription);
97 STDMETHOD(COMSETTER(Description))(IN_BSTR aDescription);
98 STDMETHOD(COMGETTER(State))(MediumState_T *aState);
99 STDMETHOD(COMGETTER(Variant))(MediumVariant_T *aVariant);
100 STDMETHOD(COMGETTER(Location))(BSTR *aLocation);
101 STDMETHOD(COMSETTER(Location))(IN_BSTR aLocation);
102 STDMETHOD(COMGETTER(Name))(BSTR *aName);
103 STDMETHOD(COMGETTER(DeviceType))(DeviceType_T *aDeviceType);
104 STDMETHOD(COMGETTER(HostDrive))(BOOL *aHostDrive);
105 STDMETHOD(COMGETTER(Size))(ULONG64 *aSize);
106 STDMETHOD(COMGETTER(Format))(BSTR *aFormat);
107 STDMETHOD(COMGETTER(MediumFormat))(IMediumFormat **aMediumFormat);
108 STDMETHOD(COMGETTER(Type))(MediumType_T *aType);
109 STDMETHOD(COMSETTER(Type))(MediumType_T aType);
110 STDMETHOD(COMGETTER(Parent))(IMedium **aParent);
111 STDMETHOD(COMGETTER(Children))(ComSafeArrayOut(IMedium *, aChildren));
112 STDMETHOD(COMGETTER(Base))(IMedium **aBase);
113 STDMETHOD(COMGETTER(ReadOnly))(BOOL *aReadOnly);
114 STDMETHOD(COMGETTER(LogicalSize))(ULONG64 *aLogicalSize);
115 STDMETHOD(COMGETTER(AutoReset))(BOOL *aAutoReset);
116 STDMETHOD(COMSETTER(AutoReset))(BOOL aAutoReset);
117 STDMETHOD(COMGETTER(LastAccessError))(BSTR *aLastAccessError);
118 STDMETHOD(COMGETTER(MachineIds))(ComSafeArrayOut(BSTR, aMachineIds));
119
120 // IMedium methods
121 STDMETHOD(RefreshState)(MediumState_T *aState);
122 STDMETHOD(GetSnapshotIds)(IN_BSTR aMachineId,
123 ComSafeArrayOut(BSTR, aSnapshotIds));
124 STDMETHOD(LockRead)(MediumState_T *aState);
125 STDMETHOD(UnlockRead)(MediumState_T *aState);
126 STDMETHOD(LockWrite)(MediumState_T *aState);
127 STDMETHOD(UnlockWrite)(MediumState_T *aState);
128 STDMETHOD(Close)();
129 STDMETHOD(GetProperty)(IN_BSTR aName, BSTR *aValue);
130 STDMETHOD(SetProperty)(IN_BSTR aName, IN_BSTR aValue);
131 STDMETHOD(GetProperties)(IN_BSTR aNames,
132 ComSafeArrayOut(BSTR, aReturnNames),
133 ComSafeArrayOut(BSTR, aReturnValues));
134 STDMETHOD(SetProperties)(ComSafeArrayIn(IN_BSTR, aNames),
135 ComSafeArrayIn(IN_BSTR, aValues));
136 STDMETHOD(CreateBaseStorage)(ULONG64 aLogicalSize,
137 MediumVariant_T aVariant,
138 IProgress **aProgress);
139 STDMETHOD(DeleteStorage)(IProgress **aProgress);
140 STDMETHOD(CreateDiffStorage)(IMedium *aTarget,
141 MediumVariant_T aVariant,
142 IProgress **aProgress);
143 STDMETHOD(MergeTo)(IMedium *aTarget, IProgress **aProgress);
144 STDMETHOD(CloneTo)(IMedium *aTarget, MediumVariant_T aVariant,
145 IMedium *aParent, IProgress **aProgress);
146 STDMETHOD(Compact)(IProgress **aProgress);
147 STDMETHOD(Resize)(ULONG64 aLogicalSize, IProgress **aProgress);
148 STDMETHOD(Reset)(IProgress **aProgress);
149
150 // public methods for internal purposes only
151 const ComObjPtr<Medium>& getParent() const;
152 const MediaList& getChildren() const;
153
154 // unsafe methods for internal purposes only (ensure there is
155 // a caller and a read lock before calling them!)
156 const Guid& getId() const;
157 MediumState_T getState() const;
158 MediumVariant_T getVariant() const;
159 const Utf8Str& getLocation() const;
160 const Utf8Str& getLocationFull() const;
161 const Utf8Str& getFormat() const;
162 const ComObjPtr<MediumFormat> & getMediumFormat() const;
163 uint64_t getSize() const;
164 MediumType_T getType() const;
165 Utf8Str getName();
166
167 HRESULT attachTo(const Guid &aMachineId,
168 const Guid &aSnapshotId = Guid::Empty);
169 HRESULT detachFrom(const Guid &aMachineId,
170 const Guid &aSnapshotId = Guid::Empty);
171
172 const Guid* getFirstMachineBackrefId() const;
173 const Guid* getFirstMachineBackrefSnapshotId() const;
174
175#ifdef DEBUG
176 void dumpBackRefs();
177#endif
178
179 HRESULT updatePath(const char *aOldPath, const char *aNewPath);
180 void updatePaths(const char *aOldPath, const char *aNewPath);
181
182 ComObjPtr<Medium> getBase(uint32_t *aLevel = NULL);
183
184 bool isReadOnly();
185
186 HRESULT saveSettings(settings::Medium &data);
187
188 HRESULT compareLocationTo(const char *aLocation, int &aResult);
189
190 HRESULT createMediumLockList(bool fFailIfInaccessible,
191 bool fMediumLockWrite,
192 Medium *pToBeParent,
193 MediumLockList &mediumLockList);
194
195 HRESULT createDiffStorage(ComObjPtr<Medium> &aTarget,
196 MediumVariant_T aVariant,
197 MediumLockList *pMediumLockList,
198 ComObjPtr<Progress> *aProgress,
199 bool aWait,
200 bool *pfNeedsSaveSettings);
201
202 HRESULT close(bool *pfNeedsSaveSettings, AutoCaller &autoCaller);
203 HRESULT deleteStorage(ComObjPtr<Progress> *aProgress, bool aWait, bool *pfNeedsSaveSettings);
204 HRESULT markForDeletion();
205 HRESULT unmarkForDeletion();
206 HRESULT markLockedForDeletion();
207 HRESULT unmarkLockedForDeletion();
208
209 HRESULT prepareMergeTo(const ComObjPtr<Medium> &pTarget,
210 const Guid *aMachineId,
211 const Guid *aSnapshotId,
212 bool fLockMedia,
213 bool &fMergeForward,
214 ComObjPtr<Medium> &pParentForTarget,
215 MediaList &aChildrenToReparent,
216 MediumLockList * &aMediumLockList);
217 HRESULT mergeTo(const ComObjPtr<Medium> &pTarget,
218 bool fMergeForward,
219 const ComObjPtr<Medium> &pParentForTarget,
220 const MediaList &aChildrenToReparent,
221 MediumLockList *aMediumLockList,
222 ComObjPtr<Progress> *aProgress,
223 bool aWait,
224 bool *pfNeedsSaveSettings);
225 void cancelMergeTo(const MediaList &aChildrenToReparent,
226 MediumLockList *aMediumLockList);
227
228 HRESULT fixParentUuidOfChildren(const MediaList &childrenToReparent);
229
230 /** Returns a preferred format for a differencing hard disk. */
231 Bstr preferredDiffFormat();
232
233private:
234
235 HRESULT queryInfo();
236
237 HRESULT canClose();
238 HRESULT unregisterWithVirtualBox(bool *pfNeedsSaveSettings);
239
240 HRESULT setStateError();
241
242 HRESULT setLocation(const Utf8Str &aLocation, const Utf8Str &aFormat = Utf8Str());
243 HRESULT setFormat(CBSTR aFormat);
244
245 Utf8Str vdError(int aVRC);
246
247 static DECLCALLBACK(void) vdErrorCall(void *pvUser, int rc, RT_SRC_POS_DECL,
248 const char *pszFormat, va_list va);
249
250 static DECLCALLBACK(bool) vdConfigAreKeysValid(void *pvUser,
251 const char *pszzValid);
252 static DECLCALLBACK(int) vdConfigQuerySize(void *pvUser, const char *pszName,
253 size_t *pcbValue);
254 static DECLCALLBACK(int) vdConfigQuery(void *pvUser, const char *pszName,
255 char *pszValue, size_t cchValue);
256
257 class Task;
258 class CreateBaseTask;
259 class CreateDiffTask;
260 class CloneTask;
261 class CompactTask;
262 class ResetTask;
263 class DeleteTask;
264 class MergeTask;
265 friend class Task;
266 friend class CreateBaseTask;
267 friend class CreateDiffTask;
268 friend class CloneTask;
269 friend class CompactTask;
270 friend class ResetTask;
271 friend class DeleteTask;
272 friend class MergeTask;
273
274 HRESULT startThread(Medium::Task *pTask);
275 HRESULT runNow(Medium::Task *pTask, bool *pfNeedsSaveSettings);
276
277 HRESULT taskCreateBaseHandler(Medium::CreateBaseTask &task);
278 HRESULT taskCreateDiffHandler(Medium::CreateDiffTask &task);
279 HRESULT taskMergeHandler(Medium::MergeTask &task);
280 HRESULT taskCloneHandler(Medium::CloneTask &task);
281 HRESULT taskDeleteHandler(Medium::DeleteTask &task);
282 HRESULT taskResetHandler(Medium::ResetTask &task);
283 HRESULT taskCompactHandler(Medium::CompactTask &task);
284
285 struct Data; // opaque data struct, defined in MediumImpl.cpp
286 Data *m;
287};
288
289#endif /* ____H_MEDIUMIMPL */
290
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette