VirtualBox

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

Last change on this file since 61609 was 61003, checked in by vboxsync, 9 years ago

Main/Appliance: get rid of "Controller" in storage controller names (following the convention established in 4.x) for importing true OVF appliances, and clean up settings.h including, as it limits recompilation

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.9 KB
Line 
1/* $Id: ApplianceImpl.h 61003 2016-05-17 13:41:19Z vboxsync $ */
2/** @file
3 * VirtualBox COM class implementation
4 */
5
6/*
7 * Copyright (C) 2006-2016 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
42typedef enum applianceIOName { applianceIOTar, applianceIOFile, applianceIOSha } APPLIANCEIONAME;
43
44namespace ovf
45{
46 struct HardDiskController;
47 struct VirtualSystem;
48 class OVFReader;
49 struct DiskImage;
50 struct EnvelopeData;
51}
52
53namespace xml
54{
55 class Document;
56 class ElementNode;
57}
58
59namespace settings
60{
61 class MachineConfigFile;
62}
63
64class ATL_NO_VTABLE Appliance :
65 public ApplianceWrap
66{
67public:
68
69 DECLARE_EMPTY_CTOR_DTOR(Appliance)
70
71 HRESULT FinalConstruct();
72 void FinalRelease();
73
74
75 HRESULT init(VirtualBox *aVirtualBox);
76 void uninit();
77
78 /* public methods only for internal purposes */
79
80 static HRESULT i_setErrorStatic(HRESULT aResultCode,
81 const Utf8Str &aText)
82 {
83 return setErrorInternal(aResultCode, getStaticClassIID(), getStaticComponentName(), aText, false, true);
84 }
85
86 /* private instance data */
87private:
88 // wrapped IAppliance properties
89 HRESULT getPath(com::Utf8Str &aPath);
90 HRESULT getDisks(std::vector<com::Utf8Str> &aDisks);
91 HRESULT getCertificate(ComPtr<ICertificate> &aCertificateInfo);
92 HRESULT getVirtualSystemDescriptions(std::vector<ComPtr<IVirtualSystemDescription> > &aVirtualSystemDescriptions);
93 HRESULT getMachines(std::vector<com::Utf8Str> &aMachines);
94
95 // wrapped IAppliance methods
96 HRESULT read(const com::Utf8Str &aFile,
97 ComPtr<IProgress> &aProgress);
98 HRESULT interpret();
99 HRESULT importMachines(const std::vector<ImportOptions_T> &aOptions,
100 ComPtr<IProgress> &aProgress);
101 HRESULT createVFSExplorer(const com::Utf8Str &aURI,
102 ComPtr<IVFSExplorer> &aExplorer);
103 HRESULT write(const com::Utf8Str &aFormat,
104 const std::vector<ExportOptions_T> &aOptions,
105 const com::Utf8Str &aPath,
106 ComPtr<IProgress> &aProgress);
107 HRESULT getWarnings(std::vector<com::Utf8Str> &aWarnings);
108 HRESULT getPasswordIds(std::vector<com::Utf8Str> &aIdentifiers);
109 HRESULT getMediumIdsForPasswordId(const com::Utf8Str &aPasswordId, std::vector<com::Guid> &aIdentifiers);
110 HRESULT addPasswords(const std::vector<com::Utf8Str> &aIdentifiers,
111 const std::vector<com::Utf8Str> &aPasswords);
112
113 /** weak VirtualBox parent */
114 VirtualBox* const mVirtualBox;
115
116 struct ImportStack;
117 class TaskOVF;
118 struct Data; // opaque, defined in ApplianceImpl.cpp
119 Data *m;
120
121 enum SetUpProgressMode { ImportFile, ImportS3, WriteFile, WriteS3 };
122
123 /** @name General stuff
124 * @{
125 */
126 bool i_isApplianceIdle();
127 HRESULT i_searchUniqueVMName(Utf8Str& aName) const;
128 HRESULT i_searchUniqueDiskImageFilePath(Utf8Str& aName) const;
129 HRESULT i_setUpProgress(ComObjPtr<Progress> &pProgress,
130 const Utf8Str &strDescription,
131 SetUpProgressMode mode);
132 void i_waitForAsyncProgress(ComObjPtr<Progress> &pProgressThis, ComPtr<IProgress> &pProgressAsync);
133 void i_addWarning(const char* aWarning, ...);
134 void i_disksWeight();
135 void i_parseBucket(Utf8Str &aPath, Utf8Str &aBucket);
136
137 static DECLCALLBACK(int) i_taskThreadImportOrExport(RTTHREAD aThread, void *pvUser);
138
139 HRESULT i_initSetOfSupportedStandardsURI();
140
141 Utf8Str i_typeOfVirtualDiskFormatFromURI(Utf8Str type) const;
142
143 std::set<Utf8Str> i_URIFromTypeOfVirtualDiskFormat(Utf8Str type);
144
145 HRESULT i_initApplianceIONameMap();
146
147 Utf8Str i_applianceIOName(APPLIANCEIONAME type) const;
148
149 HRESULT i_findMediumFormatFromDiskImage(const ovf::DiskImage &di, ComObjPtr<MediumFormat>& mf);
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 &controllerType,
181 int32_t &lControllerPort,
182 int32_t &lDevice);
183
184 void i_importOneDiskImage(const ovf::DiskImage &di,
185 Utf8Str *strTargetPath,
186 ComObjPtr<Medium> &pTargetHD,
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_importSetupDigestCalculationForGivenIoStream(RTVFSIOSTREAM hVfsIos, const char *pszManifestEntry);
201 RTVFSIOSTREAM i_importOpenSourceFile(ImportStack &stack, Utf8Str const &rstrSrcPath, const char *pszManifestEntry);
202 HRESULT i_importCreateAndWriteDestinationFile(Utf8Str const &rstrDstPath,
203 RTVFSIOSTREAM hVfsIosSrc, Utf8Str const &rstrSrcLogNm);
204
205 void i_importCopyFile(ImportStack &stack, Utf8Str const &rstrSrcPath, Utf8Str const &rstrDstPath,
206 const char *pszManifestEntry);
207 void i_importDecompressFile(ImportStack &stack, Utf8Str const &rstrSrcPath, Utf8Str const &rstrDstPath,
208 const char *pszManifestEntry);
209 /** @} */
210
211 /** @name Write stuff
212 * @{
213 */
214 HRESULT i_writeImpl(ovf::OVFVersion_T aFormat, const LocationInfo &aLocInfo, ComObjPtr<Progress> &aProgress);
215
216 HRESULT i_writeFS(TaskOVF *pTask);
217 HRESULT i_writeFSOVF(TaskOVF *pTask, AutoWriteLockBase& writeLock);
218 HRESULT i_writeFSOVA(TaskOVF *pTask, AutoWriteLockBase& writeLock);
219 HRESULT i_writeFSImpl(TaskOVF *pTask, AutoWriteLockBase& writeLock, PVDINTERFACEIO pCallbacks, PSHASTORAGE pStorage);
220
221 struct XMLStack;
222
223 void i_buildXML(AutoWriteLockBase& writeLock,
224 xml::Document &doc,
225 XMLStack &stack,
226 const Utf8Str &strPath,
227 ovf::OVFVersion_T enFormat);
228 void i_buildXMLForOneVirtualSystem(AutoWriteLockBase& writeLock,
229 xml::ElementNode &elmToAddVirtualSystemsTo,
230 std::list<xml::ElementNode*> *pllElementsWithUuidAttributes,
231 ComObjPtr<VirtualSystemDescription> &vsdescThis,
232 ovf::OVFVersion_T enFormat,
233 XMLStack &stack);
234 /** @} */
235
236 friend class Machine;
237 friend class Certificate;
238};
239
240void i_parseURI(Utf8Str strUri, LocationInfo &locInfo);
241
242struct VirtualSystemDescriptionEntry
243{
244 uint32_t ulIndex; ///< zero-based index of this entry within array
245 VirtualSystemDescriptionType_T type; ///< type of this entry
246 Utf8Str strRef; ///< reference number (hard disk controllers only)
247 Utf8Str strOvf; ///< original OVF value (type-dependent)
248 Utf8Str strVBoxSuggested; ///< configuration value (type-dependent); original value suggested by interpret()
249 Utf8Str strVBoxCurrent; ///< configuration value (type-dependent); current value, either from interpret() or setFinalValue()
250 Utf8Str strExtraConfigSuggested; ///< extra configuration key=value strings (type-dependent); original value suggested by interpret()
251 Utf8Str strExtraConfigCurrent; ///< extra configuration key=value strings (type-dependent); current value, either from interpret() or setFinalValue()
252
253 uint32_t ulSizeMB; ///< hard disk images only: a copy of ovf::DiskImage::ulSuggestedSizeMB
254 bool skipIt; ///< used during export to skip some parts if it's needed
255};
256
257class ATL_NO_VTABLE VirtualSystemDescription :
258 public VirtualSystemDescriptionWrap
259{
260 friend class Appliance;
261
262public:
263
264 DECLARE_EMPTY_CTOR_DTOR(VirtualSystemDescription)
265
266 HRESULT FinalConstruct();
267 void FinalRelease();
268
269 HRESULT init();
270 void uninit();
271
272 /* public methods only for internal purposes */
273 void i_addEntry(VirtualSystemDescriptionType_T aType,
274 const Utf8Str &strRef,
275 const Utf8Str &aOvfValue,
276 const Utf8Str &aVBoxValue,
277 uint32_t ulSizeMB = 0,
278 const Utf8Str &strExtraConfig = "");
279
280 std::list<VirtualSystemDescriptionEntry*> i_findByType(VirtualSystemDescriptionType_T aType);
281 const VirtualSystemDescriptionEntry* i_findControllerFromID(uint32_t id);
282
283 void i_importVBoxMachineXML(const xml::ElementNode &elmMachine);
284 const settings::MachineConfigFile* i_getMachineConfig() const;
285
286 /* private instance data */
287private:
288
289 // wrapped IVirtualSystemDescription properties
290 HRESULT getCount(ULONG *aCount);
291
292 // wrapped IVirtualSystemDescription methods
293 HRESULT getDescription(std::vector<VirtualSystemDescriptionType_T> &aTypes,
294 std::vector<com::Utf8Str> &aRefs,
295 std::vector<com::Utf8Str> &aOVFValues,
296 std::vector<com::Utf8Str> &aVBoxValues,
297 std::vector<com::Utf8Str> &aExtraConfigValues);
298 HRESULT getDescriptionByType(VirtualSystemDescriptionType_T aType,
299 std::vector<VirtualSystemDescriptionType_T> &aTypes,
300 std::vector<com::Utf8Str> &aRefs,
301 std::vector<com::Utf8Str> &aOVFValues,
302 std::vector<com::Utf8Str> &aVBoxValues,
303 std::vector<com::Utf8Str> &aExtraConfigValues);
304 HRESULT getValuesByType(VirtualSystemDescriptionType_T aType,
305 VirtualSystemDescriptionValueType_T aWhich,
306 std::vector<com::Utf8Str> &aValues);
307 HRESULT setFinalValues(const std::vector<BOOL> &aEnabled,
308 const std::vector<com::Utf8Str> &aVBoxValues,
309 const std::vector<com::Utf8Str> &aExtraConfigValues);
310 HRESULT addDescription(VirtualSystemDescriptionType_T aType,
311 const com::Utf8Str &aVBoxValue,
312 const com::Utf8Str &aExtraConfigValue);
313 void i_removeByType(VirtualSystemDescriptionType_T aType);
314
315 struct Data;
316 Data *m;
317
318 friend class Machine;
319};
320
321#endif // !____H_APPLIANCEIMPL
322/* vi: set tabstop=4 shiftwidth=4 expandtab: */
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