#ifndef _H_MODLOADER
#define _H_MODLOADER
#include <exception>
#include <Security/utilities.h>
#include <Security/osxsigning.h>
#include <Security/cssmint.h>
#include <map>
#include <string>
namespace Security {
class Plugin {
NOCOPY(Plugin)
public:
Plugin() { }
virtual ~Plugin() { }
virtual void load() = 0;
virtual void unload() = 0;
virtual bool isLoaded() const = 0;
virtual CSSM_RETURN CSSM_SPI_ModuleLoad (const CSSM_GUID *CssmGuid,
const CSSM_GUID *ModuleGuid,
CSSM_SPI_ModuleEventHandler CssmNotifyCallback,
void *CssmNotifyCallbackCtx) = 0;
virtual CSSM_RETURN CSSM_SPI_ModuleUnload (const CSSM_GUID *CssmGuid,
const CSSM_GUID *ModuleGuid,
CSSM_SPI_ModuleEventHandler CssmNotifyCallback,
void *CssmNotifyCallbackCtx) = 0;
virtual CSSM_RETURN CSSM_SPI_ModuleAttach (const CSSM_GUID *ModuleGuid,
const CSSM_VERSION *Version,
uint32 SubserviceID,
CSSM_SERVICE_TYPE SubServiceType,
CSSM_ATTACH_FLAGS AttachFlags,
CSSM_MODULE_HANDLE ModuleHandle,
CSSM_KEY_HIERARCHY KeyHierarchy,
const CSSM_GUID *CssmGuid,
const CSSM_GUID *ModuleManagerGuid,
const CSSM_GUID *CallerGuid,
const CSSM_UPCALLS *Upcalls,
CSSM_MODULE_FUNCS_PTR *FuncTbl) = 0;
virtual CSSM_RETURN CSSM_SPI_ModuleDetach (CSSM_MODULE_HANDLE ModuleHandle) = 0;
};
class ModuleLoader {
NOCOPY(ModuleLoader)
public:
ModuleLoader();
Plugin *operator () (const char *path);
private:
typedef map<string, Plugin *> PluginTable;
PluginTable mPlugins;
};
}
#endif //_H_MODLOADER