VirtualBox

source: vbox/trunk/src/VBox/Main/include/ApplianceImpl.h@ 73768

Last change on this file since 73768 was 73743, checked in by vboxsync, 6 years ago

Main/Progress+Appliance+Machine: Turn IProgress::waitForAsyncProgressCompletion into an internal method. It is not needed by any client code outside the API, it's simply is too special. Also include the error propagation which it originally skipped (leding to reduntant code in the calling code). Remove a replicated version of it from the Appliance code which seems to be the half-forgotten ancestor of the method in IProgress. Adapt the users of the method to the new internal method, which made the code easier to read.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 13.0 KB
Line 
1/* $Id: ApplianceImpl.h 73743 2018-08-17 17:56:34Z vboxsync $ */
2/** @file
3 * VirtualBox COM class implementation
4 */
5
6/*
7 * Copyright (C) 2006-2017 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#ifndef ____H_APPLIANCEIMPL
19#define ____H_APPLIANCEIMPL
20
21/* VBox includes */
22#include "VirtualSystemDescriptionWrap.h"
23#include "ApplianceWrap.h"
24#include "MediumFormatImpl.h"
25
26/* Todo: This file needs massive cleanup. Split IAppliance in a public and
27 * private classes. */
28#include <iprt/tar.h>
29#include "ovfreader.h"
30#include <set>
31
32/* VBox forward declarations */
33class Certificate;
34class Progress;
35class VirtualSystemDescription;
36struct VirtualSystemDescriptionEntry;
37struct LocationInfo;
38typedef struct VDINTERFACE *PVDINTERFACE;
39typedef struct VDINTERFACEIO *PVDINTERFACEIO;
40typedef struct SHASTORAGE *PSHASTORAGE;
41
42namespace ovf
43{
44 struct HardDiskController;
45 struct VirtualSystem;
46 class OVFReader;
47 struct DiskImage;
48 struct EnvelopeData;
49}
50
51namespace xml
52{
53 class Document;
54 class ElementNode;
55}
56
57namespace settings
58{
59 class MachineConfigFile;
60}
61
62class ATL_NO_VTABLE Appliance :
63 public ApplianceWrap
64{
65public:
66
67 DECLARE_EMPTY_CTOR_DTOR(Appliance)
68
69 HRESULT FinalConstruct();
70 void FinalRelease();
71
72
73 HRESULT init(VirtualBox *aVirtualBox);
74 void uninit();
75
76 /* public methods only for internal purposes */
77
78 static HRESULT i_setErrorStatic(HRESULT aResultCode,
79 const Utf8Str &aText)
80 {
81 return setErrorInternal(aResultCode, getStaticClassIID(), getStaticComponentName(), aText, false, true);
82 }
83
84 /* private instance data */
85private:
86 // wrapped IAppliance properties
87 HRESULT getPath(com::Utf8Str &aPath);
88 HRESULT getDisks(std::vector<com::Utf8Str> &aDisks);
89 HRESULT getCertificate(ComPtr<ICertificate> &aCertificateInfo);
90 HRESULT getVirtualSystemDescriptions(std::vector<ComPtr<IVirtualSystemDescription> > &aVirtualSystemDescriptions);
91 HRESULT getMachines(std::vector<com::Utf8Str> &aMachines);
92
93 // wrapped IAppliance methods
94 HRESULT read(const com::Utf8Str &aFile,
95 ComPtr<IProgress> &aProgress);
96 HRESULT interpret();
97 HRESULT importMachines(const std::vector<ImportOptions_T> &aOptions,
98 ComPtr<IProgress> &aProgress);
99 HRESULT createVFSExplorer(const com::Utf8Str &aURI,
100 ComPtr<IVFSExplorer> &aExplorer);
101 HRESULT write(const com::Utf8Str &aFormat,
102 const std::vector<ExportOptions_T> &aOptions,
103 const com::Utf8Str &aPath,
104 ComPtr<IProgress> &aProgress);
105 HRESULT getWarnings(std::vector<com::Utf8Str> &aWarnings);
106 HRESULT getPasswordIds(std::vector<com::Utf8Str> &aIdentifiers);
107 HRESULT getMediumIdsForPasswordId(const com::Utf8Str &aPasswordId, std::vector<com::Guid> &aIdentifiers);
108 HRESULT addPasswords(const std::vector<com::Utf8Str> &aIdentifiers,
109 const std::vector<com::Utf8Str> &aPasswords);
110
111 /** weak VirtualBox parent */
112 VirtualBox* const mVirtualBox;
113
114 struct ImportStack;
115 class TaskOVF;
116 struct Data; // opaque, defined in ApplianceImpl.cpp
117 Data *m;
118
119 enum SetUpProgressMode { ImportFile, ImportS3, WriteFile, WriteS3 };
120
121 /** @name General stuff
122 * @{
123 */
124 bool i_isApplianceIdle();
125 HRESULT i_searchUniqueVMName(Utf8Str& aName) const;
126 HRESULT i_searchUniqueImageFilePath(const Utf8Str &aMachineFolder,
127 DeviceType_T aDeviceType,
128 Utf8Str &aName) const;
129 HRESULT i_setUpProgress(ComObjPtr<Progress> &pProgress,
130 const Utf8Str &strDescription,
131 SetUpProgressMode mode);
132 void i_addWarning(const char* aWarning, ...);
133 void i_disksWeight();
134 void i_parseBucket(Utf8Str &aPath, Utf8Str &aBucket);
135
136 static void i_importOrExportThreadTask(TaskOVF *pTask);
137
138 HRESULT i_initBackendNames();
139
140 Utf8Str i_typeOfVirtualDiskFormatFromURI(Utf8Str type) const;
141
142#if 0 /* unused */
143 std::set<Utf8Str> i_URIFromTypeOfVirtualDiskFormat(Utf8Str type);
144#endif
145
146 HRESULT i_findMediumFormatFromDiskImage(const ovf::DiskImage &di, ComObjPtr<MediumFormat>& mf);
147
148 RTVFSIOSTREAM i_manifestSetupDigestCalculationForGivenIoStream(RTVFSIOSTREAM hVfsIos, const char *pszManifestEntry,
149 bool fRead = true);
150 /** @} */
151
152 /** @name Read stuff
153 * @{
154 */
155 void i_readImpl(const LocationInfo &aLocInfo, ComObjPtr<Progress> &aProgress);
156
157 HRESULT i_readFS(TaskOVF *pTask);
158 HRESULT i_readFSOVF(TaskOVF *pTask);
159 HRESULT i_readFSOVA(TaskOVF *pTask);
160 HRESULT i_readOVFFile(TaskOVF *pTask, RTVFSIOSTREAM hIosOvf, const char *pszManifestEntry);
161 HRESULT i_readManifestFile(TaskOVF *pTask, RTVFSIOSTREAM hIosMf, const char *pszSubFileNm);
162 HRESULT i_readSignatureFile(TaskOVF *pTask, RTVFSIOSTREAM hIosCert, const char *pszSubFileNm);
163 HRESULT i_readTailProcessing(TaskOVF *pTask);
164 /** @} */
165
166 /** @name Import stuff
167 * @}
168 */
169 HRESULT i_importImpl(const LocationInfo &aLocInfo, ComObjPtr<Progress> &aProgress);
170
171 HRESULT i_importFS(TaskOVF *pTask);
172 HRESULT i_importFSOVF(TaskOVF *pTask, AutoWriteLockBase &rWriteLock);
173 HRESULT i_importFSOVA(TaskOVF *pTask, AutoWriteLockBase &rWriteLock);
174 HRESULT i_importDoIt(TaskOVF *pTask, AutoWriteLockBase &rWriteLock, RTVFSFSSTREAM hVfsFssOva = NIL_RTVFSFSSTREAM);
175
176 HRESULT i_verifyManifestFile(ImportStack &stack);
177
178 void i_convertDiskAttachmentValues(const ovf::HardDiskController &hdc,
179 uint32_t ulAddressOnParent,
180 Utf8Str &controllerName,
181 int32_t &lControllerPort,
182 int32_t &lDevice);
183
184 void i_importOneDiskImage(const ovf::DiskImage &di,
185 const Utf8Str &strDstPath,
186 ComObjPtr<Medium> &pTargetMedium,
187 ImportStack &stack);
188
189 void i_importMachineGeneric(const ovf::VirtualSystem &vsysThis,
190 ComObjPtr<VirtualSystemDescription> &vsdescThis,
191 ComPtr<IMachine> &pNewMachine,
192 ImportStack &stack);
193 void i_importVBoxMachine(ComObjPtr<VirtualSystemDescription> &vsdescThis,
194 ComPtr<IMachine> &pNewMachine,
195 ImportStack &stack);
196 void i_importMachines(ImportStack &stack);
197
198 HRESULT i_preCheckImageAvailability(ImportStack &stack);
199 bool i_importEnsureOvaLookAhead(ImportStack &stack);
200 RTVFSIOSTREAM i_importOpenSourceFile(ImportStack &stack, Utf8Str const &rstrSrcPath, const char *pszManifestEntry);
201 HRESULT i_importCreateAndWriteDestinationFile(Utf8Str const &rstrDstPath,
202 RTVFSIOSTREAM hVfsIosSrc, Utf8Str const &rstrSrcLogNm);
203
204 void i_importCopyFile(ImportStack &stack, Utf8Str const &rstrSrcPath, Utf8Str const &rstrDstPath,
205 const char *pszManifestEntry);
206 void i_importDecompressFile(ImportStack &stack, Utf8Str const &rstrSrcPath, Utf8Str const &rstrDstPath,
207 const char *pszManifestEntry);
208 /** @} */
209
210 /** @name Write stuff
211 * @{
212 */
213 HRESULT i_writeImpl(ovf::OVFVersion_T aFormat, const LocationInfo &aLocInfo, ComObjPtr<Progress> &aProgress);
214
215 HRESULT i_writeFS(TaskOVF *pTask);
216 HRESULT i_writeFSOVF(TaskOVF *pTask, AutoWriteLockBase& writeLock);
217 HRESULT i_writeFSOVA(TaskOVF *pTask, AutoWriteLockBase& writeLock);
218 HRESULT i_writeFSOPC(TaskOVF *pTask, AutoWriteLockBase& writeLock);
219 HRESULT i_writeFSImpl(TaskOVF *pTask, AutoWriteLockBase &writeLock, RTVFSFSSTREAM hVfsFssDst);
220 HRESULT i_writeBufferToFile(RTVFSFSSTREAM hVfsFssDst, const char *pszFilename, const void *pvContent, size_t cbContent);
221
222 struct XMLStack;
223
224 void i_buildXML(AutoWriteLockBase& writeLock,
225 xml::Document &doc,
226 XMLStack &stack,
227 const Utf8Str &strPath,
228 ovf::OVFVersion_T enFormat);
229 void i_buildXMLForOneVirtualSystem(AutoWriteLockBase& writeLock,
230 xml::ElementNode &elmToAddVirtualSystemsTo,
231 std::list<xml::ElementNode*> *pllElementsWithUuidAttributes,
232 ComObjPtr<VirtualSystemDescription> &vsdescThis,
233 ovf::OVFVersion_T enFormat,
234 XMLStack &stack);
235 /** @} */
236
237 friend class Machine;
238 friend class Certificate;
239};
240
241void i_parseURI(Utf8Str strUri, LocationInfo &locInfo);
242
243struct VirtualSystemDescriptionEntry
244{
245 uint32_t ulIndex; ///< zero-based index of this entry within array
246 VirtualSystemDescriptionType_T type; ///< type of this entry
247 Utf8Str strRef; ///< reference number (hard disk controllers only)
248 Utf8Str strOvf; ///< original OVF value (type-dependent)
249 Utf8Str strVBoxSuggested; ///< configuration value (type-dependent); original value suggested by interpret()
250 Utf8Str strVBoxCurrent; ///< configuration value (type-dependent); current value, either from interpret() or setFinalValue()
251 Utf8Str strExtraConfigSuggested; ///< extra configuration key=value strings (type-dependent); original value suggested by interpret()
252 Utf8Str strExtraConfigCurrent; ///< extra configuration key=value strings (type-dependent); current value, either from interpret() or setFinalValue()
253
254 uint32_t ulSizeMB; ///< hard disk images only: a copy of ovf::DiskImage::ulSuggestedSizeMB
255 bool skipIt; ///< used during export to skip some parts if it's needed
256};
257
258class ATL_NO_VTABLE VirtualSystemDescription :
259 public VirtualSystemDescriptionWrap
260{
261 friend class Appliance;
262
263public:
264
265 DECLARE_EMPTY_CTOR_DTOR(VirtualSystemDescription)
266
267 HRESULT FinalConstruct();
268 void FinalRelease();
269
270 HRESULT init();
271 void uninit();
272
273 /* public methods only for internal purposes */
274 void i_addEntry(VirtualSystemDescriptionType_T aType,
275 const Utf8Str &strRef,
276 const Utf8Str &aOvfValue,
277 const Utf8Str &aVBoxValue,
278 uint32_t ulSizeMB = 0,
279 const Utf8Str &strExtraConfig = "");
280
281 std::list<VirtualSystemDescriptionEntry*> i_findByType(VirtualSystemDescriptionType_T aType);
282 const VirtualSystemDescriptionEntry* i_findControllerFromID(uint32_t id);
283
284 void i_importVBoxMachineXML(const xml::ElementNode &elmMachine);
285 const settings::MachineConfigFile* i_getMachineConfig() const;
286
287 /* private instance data */
288private:
289
290 // wrapped IVirtualSystemDescription properties
291 HRESULT getCount(ULONG *aCount);
292
293 // wrapped IVirtualSystemDescription methods
294 HRESULT getDescription(std::vector<VirtualSystemDescriptionType_T> &aTypes,
295 std::vector<com::Utf8Str> &aRefs,
296 std::vector<com::Utf8Str> &aOVFValues,
297 std::vector<com::Utf8Str> &aVBoxValues,
298 std::vector<com::Utf8Str> &aExtraConfigValues);
299 HRESULT getDescriptionByType(VirtualSystemDescriptionType_T aType,
300 std::vector<VirtualSystemDescriptionType_T> &aTypes,
301 std::vector<com::Utf8Str> &aRefs,
302 std::vector<com::Utf8Str> &aOVFValues,
303 std::vector<com::Utf8Str> &aVBoxValues,
304 std::vector<com::Utf8Str> &aExtraConfigValues);
305 HRESULT getValuesByType(VirtualSystemDescriptionType_T aType,
306 VirtualSystemDescriptionValueType_T aWhich,
307 std::vector<com::Utf8Str> &aValues);
308 HRESULT setFinalValues(const std::vector<BOOL> &aEnabled,
309 const std::vector<com::Utf8Str> &aVBoxValues,
310 const std::vector<com::Utf8Str> &aExtraConfigValues);
311 HRESULT addDescription(VirtualSystemDescriptionType_T aType,
312 const com::Utf8Str &aVBoxValue,
313 const com::Utf8Str &aExtraConfigValue);
314 void i_removeByType(VirtualSystemDescriptionType_T aType);
315
316 struct Data;
317 Data *m;
318
319 friend class Machine;
320};
321
322#endif // !____H_APPLIANCEIMPL
323/* vi: set tabstop=4 shiftwidth=4 expandtab: */
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use