ExtPackManagerImpl.h revision 94e055188526aeeb119b5d60fe22bf7a302522dc
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding/* $Id$ */
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding/** @file
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding * VirtualBox Main - interface for Extension Packs, VBoxSVC & VBoxC.
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding */
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding/*
240b85022b73af58a6d971cd3d05d54037d8f682nd * Copyright (C) 2010 Oracle Corporation
240b85022b73af58a6d971cd3d05d54037d8f682nd *
240b85022b73af58a6d971cd3d05d54037d8f682nd * This file is part of VirtualBox Open Source Edition (OSE), as
240b85022b73af58a6d971cd3d05d54037d8f682nd * available from http://www.virtualbox.org. This file is free software;
240b85022b73af58a6d971cd3d05d54037d8f682nd * you can redistribute it and/or modify it under the terms of the GNU
240b85022b73af58a6d971cd3d05d54037d8f682nd * General Public License (GPL) as published by the Free Software
240b85022b73af58a6d971cd3d05d54037d8f682nd * Foundation, in version 2 as it comes in the "COPYING" file of the
240b85022b73af58a6d971cd3d05d54037d8f682nd * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
240b85022b73af58a6d971cd3d05d54037d8f682nd * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes */
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes
9b761068843e8072da6d00a5d59972bdba793426fuankg#ifndef ____H_EXTPACKMANAGERIMPL
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes#define ____H_EXTPACKMANAGERIMPL
eb3171a063fe502d50dd335c2d99c84eb7053935bnicholes
9b761068843e8072da6d00a5d59972bdba793426fuankg#include "VirtualBoxBase.h"
9b761068843e8072da6d00a5d59972bdba793426fuankg#include <VBox/ExtPack/ExtPack.h>
9b761068843e8072da6d00a5d59972bdba793426fuankg#include <iprt/fs.h>
9b761068843e8072da6d00a5d59972bdba793426fuankg
9b761068843e8072da6d00a5d59972bdba793426fuankg/**
eb3171a063fe502d50dd335c2d99c84eb7053935bnicholes * An extension pack file.
eb3171a063fe502d50dd335c2d99c84eb7053935bnicholes */
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholesclass ATL_NO_VTABLE ExtPackFile :
ccc708e8694746878551e07afab3b9a4f14cee84bnicholes public VirtualBoxBase,
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes VBOX_SCRIPTABLE_IMPL(IExtPackFile)
72a9c5f539fe583767651852c0b53ce81a9054b5fuankg{
72a9c5f539fe583767651852c0b53ce81a9054b5fuankgpublic:
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes /** @name COM and internal init/term/mapping cruft.
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes * @{ */
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(ExtPackFile, IExtPackFile)
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes DECLARE_NOT_AGGREGATABLE(ExtPackFile)
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes DECLARE_PROTECT_FINAL_CONSTRUCT()
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes BEGIN_COM_MAP(ExtPackFile)
aa158cddda558cd394ca22c3838bd4927bbe8971bnicholes COM_INTERFACE_ENTRY(ISupportErrorInfo)
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes COM_INTERFACE_ENTRY(IExtPackFile)
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes COM_INTERFACE_ENTRY(IExtPackBase)
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes COM_INTERFACE_ENTRY(IDispatch)
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes END_COM_MAP()
b972d6954acbeafb8e1d6e7020e1e907cb884d0cfuankg DECLARE_EMPTY_CTOR_DTOR(ExtPackFile)
b972d6954acbeafb8e1d6e7020e1e907cb884d0cfuankg
b972d6954acbeafb8e1d6e7020e1e907cb884d0cfuankg HRESULT FinalConstruct();
b972d6954acbeafb8e1d6e7020e1e907cb884d0cfuankg void FinalRelease();
b972d6954acbeafb8e1d6e7020e1e907cb884d0cfuankg HRESULT initWithFile(const char *a_pszFile);
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes void uninit();
b972d6954acbeafb8e1d6e7020e1e907cb884d0cfuankg /** @} */
b972d6954acbeafb8e1d6e7020e1e907cb884d0cfuankg
943fe3052a481f6980c5a489ff767c6effb581e2fuankg /** @name IExtPackBase interfaces
943fe3052a481f6980c5a489ff767c6effb581e2fuankg * @{ */
b972d6954acbeafb8e1d6e7020e1e907cb884d0cfuankg STDMETHOD(COMGETTER(Name))(BSTR *a_pbstrName);
b972d6954acbeafb8e1d6e7020e1e907cb884d0cfuankg STDMETHOD(COMGETTER(Description))(BSTR *a_pbstrDescription);
b972d6954acbeafb8e1d6e7020e1e907cb884d0cfuankg STDMETHOD(COMGETTER(Version))(BSTR *a_pbstrVersion);
943fe3052a481f6980c5a489ff767c6effb581e2fuankg STDMETHOD(COMGETTER(Revision))(ULONG *a_puRevision);
943fe3052a481f6980c5a489ff767c6effb581e2fuankg STDMETHOD(COMGETTER(VRDEModule))(BSTR *a_pbstrVrdeModule);
943fe3052a481f6980c5a489ff767c6effb581e2fuankg STDMETHOD(COMGETTER(PlugIns))(ComSafeArrayOut(IExtPackPlugIn *, a_paPlugIns));
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes STDMETHOD(COMGETTER(Usable))(BOOL *a_pfUsable);
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes STDMETHOD(COMGETTER(WhyUnusable))(BSTR *a_pbstrWhy);
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes /** @} */
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes /** @name IExtPackFile interfaces
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes * @{ */
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes STDMETHOD(COMGETTER(FilePath))(BSTR *a_pbstrPath);
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes STDMETHOD(Install)(void);
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes /** @} */
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholesprivate:
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes struct Data;
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes /** Pointer to the private instance. */
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes Data *m;
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes friend class ExtPackManager;
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes};
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes/**
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes * An installed extension pack.
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes */
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholesclass ATL_NO_VTABLE ExtPack :
7640ae77eade5ef41bb3bf964a9d437e64c55da3bnicholes public VirtualBoxBase,
2a3d4464b68bcf6173f675479b4ec681a83f4bd9fuankg VBOX_SCRIPTABLE_IMPL(IExtPack)
d69ce32f322a3a3958fa2f91ff490744724d05f5fuankg{
d69ce32f322a3a3958fa2f91ff490744724d05f5fuankgpublic:
b972d6954acbeafb8e1d6e7020e1e907cb884d0cfuankg /** @name COM and internal init/term/mapping cruft.
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes * @{ */
43aea3e7c517d422b84242bd4474d94802d3b4e3bnicholes VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(ExtPack, IExtPack)
b972d6954acbeafb8e1d6e7020e1e907cb884d0cfuankg DECLARE_NOT_AGGREGATABLE(ExtPack)
9b761068843e8072da6d00a5d59972bdba793426fuankg DECLARE_PROTECT_FINAL_CONSTRUCT()
9b761068843e8072da6d00a5d59972bdba793426fuankg BEGIN_COM_MAP(ExtPack)
9b761068843e8072da6d00a5d59972bdba793426fuankg COM_INTERFACE_ENTRY(ISupportErrorInfo)
9b761068843e8072da6d00a5d59972bdba793426fuankg COM_INTERFACE_ENTRY(IExtPack)
9b761068843e8072da6d00a5d59972bdba793426fuankg COM_INTERFACE_ENTRY(IExtPackBase)
9b761068843e8072da6d00a5d59972bdba793426fuankg COM_INTERFACE_ENTRY(IDispatch)
9b761068843e8072da6d00a5d59972bdba793426fuankg END_COM_MAP()
9b761068843e8072da6d00a5d59972bdba793426fuankg DECLARE_EMPTY_CTOR_DTOR(ExtPack)
9b761068843e8072da6d00a5d59972bdba793426fuankg
9b761068843e8072da6d00a5d59972bdba793426fuankg HRESULT FinalConstruct();
9b761068843e8072da6d00a5d59972bdba793426fuankg void FinalRelease();
9b761068843e8072da6d00a5d59972bdba793426fuankg HRESULT initWithDir(VBOXEXTPACKCTX a_enmContext, const char *a_pszName, const char *a_pszDir);
9b761068843e8072da6d00a5d59972bdba793426fuankg void uninit();
9b761068843e8072da6d00a5d59972bdba793426fuankg /** @} */
9b761068843e8072da6d00a5d59972bdba793426fuankg
9b761068843e8072da6d00a5d59972bdba793426fuankg /** @name IExtPackBase interfaces
9b761068843e8072da6d00a5d59972bdba793426fuankg * @{ */
9b761068843e8072da6d00a5d59972bdba793426fuankg STDMETHOD(COMGETTER(Name))(BSTR *a_pbstrName);
9b761068843e8072da6d00a5d59972bdba793426fuankg STDMETHOD(COMGETTER(Description))(BSTR *a_pbstrDescription);
9b761068843e8072da6d00a5d59972bdba793426fuankg STDMETHOD(COMGETTER(Version))(BSTR *a_pbstrVersion);
9b761068843e8072da6d00a5d59972bdba793426fuankg STDMETHOD(COMGETTER(Revision))(ULONG *a_puRevision);
9b761068843e8072da6d00a5d59972bdba793426fuankg STDMETHOD(COMGETTER(VRDEModule))(BSTR *a_pbstrVrdeModule);
9b761068843e8072da6d00a5d59972bdba793426fuankg STDMETHOD(COMGETTER(PlugIns))(ComSafeArrayOut(IExtPackPlugIn *, a_paPlugIns));
9b761068843e8072da6d00a5d59972bdba793426fuankg STDMETHOD(COMGETTER(Usable))(BOOL *a_pfUsable);
9b761068843e8072da6d00a5d59972bdba793426fuankg STDMETHOD(COMGETTER(WhyUnusable))(BSTR *a_pbstrWhy);
b972d6954acbeafb8e1d6e7020e1e907cb884d0cfuankg /** @} */
b972d6954acbeafb8e1d6e7020e1e907cb884d0cfuankg
/** @name IExtPack interfaces
* @{ */
STDMETHOD(QueryObject)(IN_BSTR a_bstrObjectId, IUnknown **a_ppUnknown);
/** @} */
/** @name Internal interfaces used by ExtPackManager.
* @{ */
bool callInstalledHook(IVirtualBox *a_pVirtualBox, AutoWriteLock *a_pLock);
HRESULT callUninstallHookAndClose(IVirtualBox *a_pVirtualBox, bool a_fForcedRemoval);
bool callVirtualBoxReadyHook(IVirtualBox *a_pVirtualBox, AutoWriteLock *a_pLock);
bool callConsoleReadyHook(IConsole *a_pConsole, AutoWriteLock *a_pLock);
bool callVmCreatedHook(IVirtualBox *a_pVirtualBox, IMachine *a_pMachine, AutoWriteLock *a_pLock);
bool callVmConfigureVmmHook(IConsole *a_pConsole, PVM a_pVM, AutoWriteLock *a_pLock, int *a_pvrc);
bool callVmPowerOnHook(IConsole *a_pConsole, PVM a_pVM, AutoWriteLock *a_pLock, int *a_pvrc);
bool callVmPowerOffHook(IConsole *a_pConsole, PVM a_pVM, AutoWriteLock *a_pLock);
HRESULT checkVrde(void);
HRESULT getVrdpLibraryName(Utf8Str *a_pstrVrdeLibrary);
bool wantsToBeDefaultVrde(void) const;
HRESULT refresh(bool *pfCanDelete);
/** @} */
protected:
/** @name Internal helper methods.
* @{ */
void probeAndLoad(void);
bool findModule(const char *a_pszName, const char *a_pszExt, VBOXEXTPACKMODKIND a_enmKind,
Utf8Str *a_ppStrFound, bool *a_pfNative, PRTFSOBJINFO a_pObjInfo) const;
static bool objinfoIsEqual(PCRTFSOBJINFO pObjInfo1, PCRTFSOBJINFO pObjInfo2);
/** @} */
/** @name Extension Pack Helpers
* @{ */
static DECLCALLBACK(int) hlpFindModule(PCVBOXEXTPACKHLP pHlp, const char *pszName, const char *pszExt,
VBOXEXTPACKMODKIND enmKind, char *pszFound, size_t cbFound, bool *pfNative);
static DECLCALLBACK(int) hlpGetFilePath(PCVBOXEXTPACKHLP pHlp, const char *pszFilename, char *pszPath, size_t cbPath);
static DECLCALLBACK(VBOXEXTPACKCTX) hlpGetContext(PCVBOXEXTPACKHLP pHlp);
static DECLCALLBACK(int) hlpReservedN(PCVBOXEXTPACKHLP pHlp);
/** @} */
private:
struct Data;
/** Pointer to the private instance. */
Data *m;
friend class ExtPackManager;
};
/**
* Extension pack manager.
*/
class ATL_NO_VTABLE ExtPackManager :
public VirtualBoxBase,
VBOX_SCRIPTABLE_IMPL(IExtPackManager)
{
/** @name COM and internal init/term/mapping cruft.
* @{ */
VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(ExtPackManager, IExtPackManager)
DECLARE_NOT_AGGREGATABLE(ExtPackManager)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(ExtPackManager)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IExtPackManager)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
DECLARE_EMPTY_CTOR_DTOR(ExtPackManager)
HRESULT FinalConstruct();
void FinalRelease();
HRESULT init(VirtualBox *a_pVirtualBox, const char *a_pszDropZonePath, bool a_fCheckDropZone,
VBOXEXTPACKCTX a_enmContext);
void uninit();
/** @} */
/** @name IExtPack interfaces
* @{ */
STDMETHOD(COMGETTER(InstalledExtPacks))(ComSafeArrayOut(IExtPack *, a_paExtPacks));
STDMETHOD(Find)(IN_BSTR a_bstrName, IExtPack **a_pExtPack);
STDMETHOD(OpenExtPackFile)(IN_BSTR a_bstrTarball, IExtPackFile **a_ppExtPackFile);
STDMETHOD(Install)(IN_BSTR a_bstrTarball, BSTR *a_pbstrName);
STDMETHOD(Uninstall)(IN_BSTR a_bstrName, BOOL a_fForcedRemoval);
STDMETHOD(Cleanup)(void);
STDMETHOD(QueryAllPlugInsForFrontend)(IN_BSTR a_bstrFrontend, ComSafeArrayOut(BSTR, a_pabstrPlugInModules));
/** @} */
/** @name Internal interfaces used by other Main classes.
* @{ */
void processDropZone(void);
void callAllVirtualBoxReadyHooks(void);
void callAllConsoleReadyHooks(IConsole *a_pConsole);
void callAllVmCreatedHooks(IMachine *a_pMachine);
int callAllVmConfigureVmmHooks(IConsole *a_pConsole, PVM a_pVM);
int callAllVmPowerOnHooks(IConsole *a_pConsole, PVM a_pVM);
void callAllVmPowerOffHooks(IConsole *a_pConsole, PVM a_pVM);
HRESULT checkVrdeExtPack(Utf8Str const *a_pstrExtPack);
int getVrdeLibraryPathForExtPack(Utf8Str const *a_pstrExtPack, Utf8Str *a_pstrVrdeLibrary);
HRESULT getDefaultVrdeExtPack(Utf8Str *a_pstrExtPack);
/** @} */
private:
HRESULT runSetUidToRootHelper(const char *a_pszCommand, ...);
ExtPack *findExtPack(const char *a_pszName);
void removeExtPack(const char *a_pszName);
HRESULT refreshExtPack(const char *a_pszName, bool a_fUnsuableIsError, ExtPack **a_ppExtPack);
private:
struct Data;
/** Pointer to the private instance. */
Data *m;
};
#endif
/* vi: set tabstop=4 shiftwidth=4 expandtab: */