VirtualBox

source: vbox/trunk/src/VBox/Main/include/ExtPackManagerImpl.h@ 76319

Last change on this file since 76319 was 75663, checked in by vboxsync, 6 years ago

Main/ExtPackManager+CloudProviderManager+VirtualBox: Handle runtime install and uninstall of extension packs containing cloud providers. This is a safeguard against uninstalling active cloud providers (which would cause crashes), and makes the install more convcenient. At the same time it eliminated the need to have a special "detect all cloud providers" logic when VBoxSVC is started. It achieves perfect singleton property of the per-extpack CloudProviderManager and the related CloudProvider objects. Nothing is ever created twice (which would cause trouble with coordinating e.g. the profile file updates).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.1 KB
Line 
1/* $Id: ExtPackManagerImpl.h 75663 2018-11-22 14:00:59Z vboxsync $ */
2/** @file
3 * VirtualBox Main - interface for Extension Packs, VBoxSVC & VBoxC.
4 */
5
6/*
7 * Copyright (C) 2010-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_EXTPACKMANAGERIMPL
19#define ____H_EXTPACKMANAGERIMPL
20
21#include "VirtualBoxBase.h"
22#include <VBox/ExtPack/ExtPack.h>
23#include "ExtPackWrap.h"
24#include "ExtPackFileWrap.h"
25#include "ExtPackManagerWrap.h"
26#include <iprt/fs.h>
27
28
29/** The name of the oracle extension back. */
30#define ORACLE_PUEL_EXTPACK_NAME "Oracle VM VirtualBox Extension Pack"
31
32
33#ifndef VBOX_COM_INPROC
34/**
35 * An extension pack file.
36 */
37class ATL_NO_VTABLE ExtPackFile :
38 public ExtPackFileWrap
39{
40public:
41 /** @name COM and internal init/term/mapping cruft.
42 * @{ */
43 DECLARE_EMPTY_CTOR_DTOR(ExtPackFile)
44
45 HRESULT FinalConstruct();
46 void FinalRelease();
47 HRESULT initWithFile(const char *a_pszFile, const char *a_pszDigest, class ExtPackManager *a_pExtPackMgr, VirtualBox *a_pVirtualBox);
48 void uninit();
49 /** @} */
50
51private:
52 /** @name Misc init helpers
53 * @{ */
54 HRESULT initFailed(const char *a_pszWhyFmt, ...);
55 /** @} */
56
57private:
58
59 // wrapped IExtPackFile properties
60 HRESULT getName(com::Utf8Str &aName);
61 HRESULT getDescription(com::Utf8Str &aDescription);
62 HRESULT getVersion(com::Utf8Str &aVersion);
63 HRESULT getRevision(ULONG *aRevision);
64 HRESULT getEdition(com::Utf8Str &aEdition);
65 HRESULT getVRDEModule(com::Utf8Str &aVRDEModule);
66 HRESULT getPlugIns(std::vector<ComPtr<IExtPackPlugIn> > &aPlugIns);
67 HRESULT getUsable(BOOL *aUsable);
68 HRESULT getWhyUnusable(com::Utf8Str &aWhyUnusable);
69 HRESULT getShowLicense(BOOL *aShowLicense);
70 HRESULT getLicense(com::Utf8Str &aLicense);
71 HRESULT getFilePath(com::Utf8Str &aFilePath);
72
73 // wrapped IExtPackFile methods
74 HRESULT queryLicense(const com::Utf8Str &aPreferredLocale,
75 const com::Utf8Str &aPreferredLanguage,
76 const com::Utf8Str &aFormat,
77 com::Utf8Str &aLicenseText);
78 HRESULT install(BOOL aReplace,
79 const com::Utf8Str &aDisplayInfo,
80 ComPtr<IProgress> &aProgess);
81
82 struct Data;
83 /** Pointer to the private instance. */
84 Data *m;
85
86 friend class ExtPackManager;
87 friend class ExtPackInstallTask;
88};
89#endif /* !VBOX_COM_INPROC */
90
91
92/**
93 * An installed extension pack.
94 */
95class ATL_NO_VTABLE ExtPack :
96 public ExtPackWrap
97{
98public:
99 /** @name COM and internal init/term/mapping cruft.
100 * @{ */
101 DECLARE_EMPTY_CTOR_DTOR(ExtPack)
102
103 HRESULT FinalConstruct();
104 void FinalRelease();
105 HRESULT initWithDir(VirtualBox *a_pVirtualBox, VBOXEXTPACKCTX a_enmContext, const char *a_pszName, const char *a_pszDir);
106 void uninit();
107 RTMEMEF_NEW_AND_DELETE_OPERATORS();
108 /** @} */
109
110 /** @name Internal interfaces used by ExtPackManager.
111 * @{ */
112#ifndef VBOX_COM_INPROC
113 bool i_callInstalledHook(IVirtualBox *a_pVirtualBox, AutoWriteLock *a_pLock, PRTERRINFO pErrInfo);
114 HRESULT i_callUninstallHookAndClose(IVirtualBox *a_pVirtualBox, bool a_fForcedRemoval);
115 bool i_callVirtualBoxReadyHook(IVirtualBox *a_pVirtualBox, AutoWriteLock *a_pLock);
116#endif
117#ifdef VBOX_COM_INPROC
118 bool i_callConsoleReadyHook(IConsole *a_pConsole, AutoWriteLock *a_pLock);
119#endif
120#ifndef VBOX_COM_INPROC
121 bool i_callVmCreatedHook(IVirtualBox *a_pVirtualBox, IMachine *a_pMachine, AutoWriteLock *a_pLock);
122#endif
123#ifdef VBOX_COM_INPROC
124 bool i_callVmConfigureVmmHook(IConsole *a_pConsole, PVM a_pVM, AutoWriteLock *a_pLock, int *a_pvrc);
125 bool i_callVmPowerOnHook(IConsole *a_pConsole, PVM a_pVM, AutoWriteLock *a_pLock, int *a_pvrc);
126 bool i_callVmPowerOffHook(IConsole *a_pConsole, PVM a_pVM, AutoWriteLock *a_pLock);
127#endif
128 HRESULT i_checkVrde(void);
129 HRESULT i_getVrdpLibraryName(Utf8Str *a_pstrVrdeLibrary);
130 HRESULT i_getLibraryName(const char *a_pszModuleName, Utf8Str *a_pstrLibrary);
131 bool i_wantsToBeDefaultVrde(void) const;
132 HRESULT i_refresh(bool *pfCanDelete);
133#ifndef VBOX_COM_INPROC
134 bool i_areThereCloudProviderUninstallVetos();
135 void i_notifyCloudProviderManager();
136#endif
137 /** @} */
138
139protected:
140 /** @name Internal helper methods.
141 * @{ */
142 void i_probeAndLoad(void);
143 bool i_findModule(const char *a_pszName, const char *a_pszExt, VBOXEXTPACKMODKIND a_enmKind,
144 Utf8Str *a_ppStrFound, bool *a_pfNative, PRTFSOBJINFO a_pObjInfo) const;
145 static bool i_objinfoIsEqual(PCRTFSOBJINFO pObjInfo1, PCRTFSOBJINFO pObjInfo2);
146 /** @} */
147
148 /** @name Extension Pack Helpers
149 * @{ */
150 static DECLCALLBACK(int) i_hlpFindModule(PCVBOXEXTPACKHLP pHlp, const char *pszName, const char *pszExt,
151 VBOXEXTPACKMODKIND enmKind, char *pszFound, size_t cbFound, bool *pfNative);
152 static DECLCALLBACK(int) i_hlpGetFilePath(PCVBOXEXTPACKHLP pHlp, const char *pszFilename, char *pszPath, size_t cbPath);
153 static DECLCALLBACK(VBOXEXTPACKCTX) i_hlpGetContext(PCVBOXEXTPACKHLP pHlp);
154 static DECLCALLBACK(int) i_hlpLoadHGCMService(PCVBOXEXTPACKHLP pHlp, VBOXEXTPACK_IF_CS(IConsole) *pConsole, const char *pszServiceLibrary, const char *pszServiceName);
155 static DECLCALLBACK(int) i_hlpLoadVDPlugin(PCVBOXEXTPACKHLP pHlp, VBOXEXTPACK_IF_CS(IVirtualBox) *pVirtualBox, const char *pszPluginLibrary);
156 static DECLCALLBACK(int) i_hlpUnloadVDPlugin(PCVBOXEXTPACKHLP pHlp, VBOXEXTPACK_IF_CS(IVirtualBox) *pVirtualBox, const char *pszPluginLibrary);
157 static DECLCALLBACK(uint32_t) i_hlpCreateProgress(PCVBOXEXTPACKHLP pHlp, VBOXEXTPACK_IF_CS(IUnknown) *pInitiator,
158 const char *pcszDescription, uint32_t cOperations,
159 uint32_t uTotalOperationsWeight, const char *pcszFirstOperationDescription,
160 uint32_t uFirstOperationWeight, VBOXEXTPACK_IF_CS(IProgress) **ppProgressOut);
161 static DECLCALLBACK(uint32_t) i_hlpGetCanceledProgress(PCVBOXEXTPACKHLP pHlp, VBOXEXTPACK_IF_CS(IProgress) *pProgress,
162 bool *pfCanceled);
163 static DECLCALLBACK(uint32_t) i_hlpUpdateProgress(PCVBOXEXTPACKHLP pHlp, VBOXEXTPACK_IF_CS(IProgress) *pProgress,
164 uint32_t uPercent);
165 static DECLCALLBACK(uint32_t) i_hlpNextOperationProgress(PCVBOXEXTPACKHLP pHlp, VBOXEXTPACK_IF_CS(IProgress) *pProgress,
166 const char *pcszNextOperationDescription,
167 uint32_t uNextOperationWeight);
168 static DECLCALLBACK(uint32_t) i_hlpWaitOtherProgress(PCVBOXEXTPACKHLP pHlp, VBOXEXTPACK_IF_CS(IProgress) *pProgress,
169 VBOXEXTPACK_IF_CS(IProgress) *pProgressOther,
170 uint32_t cTimeoutMS);
171 static DECLCALLBACK(uint32_t) i_hlpCompleteProgress(PCVBOXEXTPACKHLP pHlp, VBOXEXTPACK_IF_CS(IProgress) *pProgress,
172 uint32_t uResultCode);
173 static DECLCALLBACK(int) i_hlpReservedN(PCVBOXEXTPACKHLP pHlp);
174 /** @} */
175
176private:
177
178 // wrapped IExtPack properties
179 HRESULT getName(com::Utf8Str &aName);
180 HRESULT getDescription(com::Utf8Str &aDescription);
181 HRESULT getVersion(com::Utf8Str &aVersion);
182 HRESULT getRevision(ULONG *aRevision);
183 HRESULT getEdition(com::Utf8Str &aEdition);
184 HRESULT getVRDEModule(com::Utf8Str &aVRDEModule);
185 HRESULT getPlugIns(std::vector<ComPtr<IExtPackPlugIn> > &aPlugIns);
186 HRESULT getUsable(BOOL *aUsable);
187 HRESULT getWhyUnusable(com::Utf8Str &aWhyUnusable);
188 HRESULT getShowLicense(BOOL *aShowLicense);
189 HRESULT getLicense(com::Utf8Str &aLicense);
190
191 // wrapped IExtPack methods
192 HRESULT queryLicense(const com::Utf8Str &aPreferredLocale,
193 const com::Utf8Str &aPreferredLanguage,
194 const com::Utf8Str &aFormat,
195 com::Utf8Str &aLicenseText);
196 HRESULT queryObject(const com::Utf8Str &aObjUuid,
197 ComPtr<IUnknown> &aReturnInterface);
198
199
200 struct Data;
201 /** Pointer to the private instance. */
202 Data *m;
203
204 friend class ExtPackManager;
205};
206
207
208/**
209 * Extension pack manager.
210 */
211class ATL_NO_VTABLE ExtPackManager :
212 public ExtPackManagerWrap
213{
214public:
215 /** @name COM and internal init/term/mapping cruft.
216 * @{ */
217 DECLARE_EMPTY_CTOR_DTOR(ExtPackManager)
218
219 HRESULT FinalConstruct();
220 void FinalRelease();
221 HRESULT initExtPackManager(VirtualBox *a_pVirtualBox, VBOXEXTPACKCTX a_enmContext);
222 void uninit();
223 /** @} */
224
225 /** @name Internal interfaces used by other Main classes.
226 * @{ */
227#ifndef VBOX_COM_INPROC
228 HRESULT i_doInstall(ExtPackFile *a_pExtPackFile, bool a_fReplace, Utf8Str const *a_pstrDisplayInfo);
229 HRESULT i_doUninstall(const Utf8Str *a_pstrName, bool a_fForcedRemoval, const Utf8Str *a_pstrDisplayInfo);
230 void i_callAllVirtualBoxReadyHooks(void);
231 HRESULT i_queryObjects(const com::Utf8Str &aObjUuid, std::vector<ComPtr<IUnknown> > &aObjects, std::vector<com::Utf8Str> *a_pstrExtPackNames);
232#endif
233#ifdef VBOX_COM_INPROC
234 void i_callAllConsoleReadyHooks(IConsole *a_pConsole);
235#endif
236#ifndef VBOX_COM_INPROC
237 void i_callAllVmCreatedHooks(IMachine *a_pMachine);
238#endif
239#ifdef VBOX_COM_INPROC
240 int i_callAllVmConfigureVmmHooks(IConsole *a_pConsole, PVM a_pVM);
241 int i_callAllVmPowerOnHooks(IConsole *a_pConsole, PVM a_pVM);
242 void i_callAllVmPowerOffHooks(IConsole *a_pConsole, PVM a_pVM);
243#endif
244 HRESULT i_checkVrdeExtPack(Utf8Str const *a_pstrExtPack);
245 int i_getVrdeLibraryPathForExtPack(Utf8Str const *a_pstrExtPack, Utf8Str *a_pstrVrdeLibrary);
246 HRESULT i_getLibraryPathForExtPack(const char *a_pszModuleName, const char *a_pszExtPack, Utf8Str *a_pstrLibrary);
247 HRESULT i_getDefaultVrdeExtPack(Utf8Str *a_pstrExtPack);
248 bool i_isExtPackUsable(const char *a_pszExtPack);
249 void i_dumpAllToReleaseLog(void);
250 uint64_t i_getUpdateCounter(void);
251 /** @} */
252
253private:
254 // wrapped IExtPackManager properties
255 HRESULT getInstalledExtPacks(std::vector<ComPtr<IExtPack> > &aInstalledExtPacks);
256
257 // wrapped IExtPackManager methods
258 HRESULT find(const com::Utf8Str &aName,
259 ComPtr<IExtPack> &aReturnData);
260 HRESULT openExtPackFile(const com::Utf8Str &aPath,
261 ComPtr<IExtPackFile> &aFile);
262 HRESULT uninstall(const com::Utf8Str &aName,
263 BOOL aForcedRemoval,
264 const com::Utf8Str &aDisplayInfo,
265 ComPtr<IProgress> &aProgess);
266 HRESULT cleanup();
267 HRESULT queryAllPlugInsForFrontend(const com::Utf8Str &aFrontendName,
268 std::vector<com::Utf8Str> &aPlugInModules);
269 HRESULT isExtPackUsable(const com::Utf8Str &aName,
270 BOOL *aUsable);
271
272 bool i_areThereAnyRunningVMs(void) const;
273 HRESULT i_runSetUidToRootHelper(Utf8Str const *a_pstrDisplayInfo, const char *a_pszCommand, ...);
274 ExtPack *i_findExtPack(const char *a_pszName);
275 void i_removeExtPack(const char *a_pszName);
276 HRESULT i_refreshExtPack(const char *a_pszName, bool a_fUnsuableIsError, ExtPack **a_ppExtPack);
277
278private:
279 struct Data;
280 /** Pointer to the private instance. */
281 Data *m;
282
283 friend class ExtPackUninstallTask;
284};
285
286#endif
287/* 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