VirtualBox

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

Last change on this file since 72090 was 68828, checked in by vboxsync, 7 years ago

ExtPack: Split up main module of extension pack, have a mandatory one for VBoxSVC and an optional one for the VM process. This finally eliminates the need to drag VBoxVMM into VBoxSVC on some platforms. Many other small cleanups, including reliably calling the unload hook from within a VM process, copy/paste with forgotten adjustments (e.g. extpacks still talking about skeleton) and spelling fixes.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.1 KB
Line 
1/* $Id: ExtPackManagerImpl.h 68828 2017-09-22 14:15:57Z 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(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 /** @} */
134
135protected:
136 /** @name Internal helper methods.
137 * @{ */
138 void i_probeAndLoad(void);
139 bool i_findModule(const char *a_pszName, const char *a_pszExt, VBOXEXTPACKMODKIND a_enmKind,
140 Utf8Str *a_ppStrFound, bool *a_pfNative, PRTFSOBJINFO a_pObjInfo) const;
141 static bool i_objinfoIsEqual(PCRTFSOBJINFO pObjInfo1, PCRTFSOBJINFO pObjInfo2);
142 /** @} */
143
144 /** @name Extension Pack Helpers
145 * @{ */
146 static DECLCALLBACK(int) i_hlpFindModule(PCVBOXEXTPACKHLP pHlp, const char *pszName, const char *pszExt,
147 VBOXEXTPACKMODKIND enmKind, char *pszFound, size_t cbFound, bool *pfNative);
148 static DECLCALLBACK(int) i_hlpGetFilePath(PCVBOXEXTPACKHLP pHlp, const char *pszFilename, char *pszPath, size_t cbPath);
149 static DECLCALLBACK(VBOXEXTPACKCTX) i_hlpGetContext(PCVBOXEXTPACKHLP pHlp);
150 static DECLCALLBACK(int) i_hlpLoadHGCMService(PCVBOXEXTPACKHLP pHlp, VBOXEXTPACK_IF_CS(IConsole) *pConsole, const char *pszServiceLibrary, const char *pszServiceName);
151 static DECLCALLBACK(int) i_hlpLoadVDPlugin(PCVBOXEXTPACKHLP pHlp, VBOXEXTPACK_IF_CS(IVirtualBox) *pVirtualBox, const char *pszPluginLibrary);
152 static DECLCALLBACK(int) i_hlpUnloadVDPlugin(PCVBOXEXTPACKHLP pHlp, VBOXEXTPACK_IF_CS(IVirtualBox) *pVirtualBox, const char *pszPluginLibrary);
153 static DECLCALLBACK(int) i_hlpReservedN(PCVBOXEXTPACKHLP pHlp);
154 /** @} */
155
156private:
157
158 // wrapped IExtPack properties
159 HRESULT getName(com::Utf8Str &aName);
160 HRESULT getDescription(com::Utf8Str &aDescription);
161 HRESULT getVersion(com::Utf8Str &aVersion);
162 HRESULT getRevision(ULONG *aRevision);
163 HRESULT getEdition(com::Utf8Str &aEdition);
164 HRESULT getVRDEModule(com::Utf8Str &aVRDEModule);
165 HRESULT getPlugIns(std::vector<ComPtr<IExtPackPlugIn> > &aPlugIns);
166 HRESULT getUsable(BOOL *aUsable);
167 HRESULT getWhyUnusable(com::Utf8Str &aWhyUnusable);
168 HRESULT getShowLicense(BOOL *aShowLicense);
169 HRESULT getLicense(com::Utf8Str &aLicense);
170
171 // wrapped IExtPack methods
172 HRESULT queryLicense(const com::Utf8Str &aPreferredLocale,
173 const com::Utf8Str &aPreferredLanguage,
174 const com::Utf8Str &aFormat,
175 com::Utf8Str &aLicenseText);
176 HRESULT queryObject(const com::Utf8Str &aObjUuid,
177 ComPtr<IUnknown> &aReturnInterface);
178
179
180 struct Data;
181 /** Pointer to the private instance. */
182 Data *m;
183
184 friend class ExtPackManager;
185};
186
187
188/**
189 * Extension pack manager.
190 */
191class ATL_NO_VTABLE ExtPackManager :
192 public ExtPackManagerWrap
193{
194public:
195 /** @name COM and internal init/term/mapping cruft.
196 * @{ */
197 DECLARE_EMPTY_CTOR_DTOR(ExtPackManager)
198
199 HRESULT FinalConstruct();
200 void FinalRelease();
201 HRESULT initExtPackManager(VirtualBox *a_pVirtualBox, VBOXEXTPACKCTX a_enmContext);
202 void uninit();
203 /** @} */
204
205 /** @name Internal interfaces used by other Main classes.
206 * @{ */
207#ifndef VBOX_COM_INPROC
208 HRESULT i_doInstall(ExtPackFile *a_pExtPackFile, bool a_fReplace, Utf8Str const *a_pstrDisplayInfo);
209 HRESULT i_doUninstall(const Utf8Str *a_pstrName, bool a_fForcedRemoval, const Utf8Str *a_pstrDisplayInfo);
210 void i_callAllVirtualBoxReadyHooks(void);
211#endif
212#ifdef VBOX_COM_INPROC
213 void i_callAllConsoleReadyHooks(IConsole *a_pConsole);
214#endif
215#ifndef VBOX_COM_INPROC
216 void i_callAllVmCreatedHooks(IMachine *a_pMachine);
217#endif
218#ifdef VBOX_COM_INPROC
219 int i_callAllVmConfigureVmmHooks(IConsole *a_pConsole, PVM a_pVM);
220 int i_callAllVmPowerOnHooks(IConsole *a_pConsole, PVM a_pVM);
221 void i_callAllVmPowerOffHooks(IConsole *a_pConsole, PVM a_pVM);
222#endif
223 HRESULT i_checkVrdeExtPack(Utf8Str const *a_pstrExtPack);
224 int i_getVrdeLibraryPathForExtPack(Utf8Str const *a_pstrExtPack, Utf8Str *a_pstrVrdeLibrary);
225 HRESULT i_getLibraryPathForExtPack(const char *a_pszModuleName, const char *a_pszExtPack, Utf8Str *a_pstrLibrary);
226 HRESULT i_getDefaultVrdeExtPack(Utf8Str *a_pstrExtPack);
227 bool i_isExtPackUsable(const char *a_pszExtPack);
228 void i_dumpAllToReleaseLog(void);
229 /** @} */
230
231private:
232 // wrapped IExtPackManager properties
233 HRESULT getInstalledExtPacks(std::vector<ComPtr<IExtPack> > &aInstalledExtPacks);
234
235 // wrapped IExtPackManager methods
236 HRESULT find(const com::Utf8Str &aName,
237 ComPtr<IExtPack> &aReturnData);
238 HRESULT openExtPackFile(const com::Utf8Str &aPath,
239 ComPtr<IExtPackFile> &aFile);
240 HRESULT uninstall(const com::Utf8Str &aName,
241 BOOL aForcedRemoval,
242 const com::Utf8Str &aDisplayInfo,
243 ComPtr<IProgress> &aProgess);
244 HRESULT cleanup();
245 HRESULT queryAllPlugInsForFrontend(const com::Utf8Str &aFrontendName,
246 std::vector<com::Utf8Str> &aPlugInModules);
247 HRESULT isExtPackUsable(const com::Utf8Str &aName,
248 BOOL *aUsable);
249
250 bool i_areThereAnyRunningVMs(void) const;
251 HRESULT i_runSetUidToRootHelper(Utf8Str const *a_pstrDisplayInfo, const char *a_pszCommand, ...);
252 ExtPack *i_findExtPack(const char *a_pszName);
253 void i_removeExtPack(const char *a_pszName);
254 HRESULT i_refreshExtPack(const char *a_pszName, bool a_fUnsuableIsError, ExtPack **a_ppExtPack);
255
256private:
257 struct Data;
258 /** Pointer to the private instance. */
259 Data *m;
260
261 friend class ExtPackUninstallTask;
262};
263
264#endif
265/* 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