VirtualBox

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

Last change on this file since 60952 was 59319, checked in by vboxsync, 9 years ago

ExtPackManager.cpp/h: Fine to VMs running when installing an extpack, unless we're replacing an existing one that's actually installed. Fixed i_areThereAnyRunningVMs state checks (missing 8 or so states). Restored original error handling and task deletion structure, making sure we delete the task when someone throws stuff (like the Init method). Folded the [un]installThreadProc methods into their tasks (should've been obvious). Numerous style fixes. Untested, hope it works.

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