#ifdef __MWERKS__
#define _CPP_CSSMPLUGIN
#endif
#include <Security/cssmplugin.h>
#include <Security/pluginsession.h>
ModuleNexus<CssmPlugin::SessionMap> CssmPlugin::sessionMap;
CssmPlugin::CssmPlugin()
{
haveCallback = false;
}
CssmPlugin::~CssmPlugin()
{
}
void CssmPlugin::moduleLoad(const Guid &cssmGuid,
const Guid &moduleGuid,
const ModuleCallback &newCallback)
{
if (haveCallback) CssmError::throwMe(CSSM_ERRCODE_INTERNAL_ERROR);
mMyGuid = moduleGuid;
load();
callback = newCallback;
haveCallback = true;
}
void CssmPlugin::moduleUnload(const Guid &cssmGuid,
const Guid &moduleGuid,
const ModuleCallback &oldCallback)
{
if (!haveCallback || oldCallback != callback)
CssmError::throwMe(CSSM_ERRCODE_INTERNAL_ERROR);
unload();
haveCallback = false;
}
void CssmPlugin::moduleAttach(CSSM_MODULE_HANDLE theHandle,
const Guid &newCssmGuid,
const Guid &moduleGuid,
const Guid &moduleManagerGuid,
const Guid &callerGuid,
const CSSM_VERSION &version,
uint32 subserviceId,
CSSM_SERVICE_TYPE subserviceType,
CSSM_ATTACH_FLAGS attachFlags,
CSSM_KEY_HIERARCHY keyHierarchy,
const CSSM_UPCALLS &upcalls,
CSSM_MODULE_FUNCS_PTR &funcTbl)
{
PluginSession *session = makeSession(theHandle,
version,
subserviceId, subserviceType,
attachFlags,
upcalls);
try {
funcTbl = session->construct();
StLock<Mutex> _(sessionMap());
sessionMap()[theHandle] = session;
} catch (...) {
delete session;
throw;
}
}
void CssmPlugin::moduleDetach(CSSM_MODULE_HANDLE handle)
{
PluginSession *session;
{
StLock<Mutex> _(sessionMap());
SessionMap::iterator it = sessionMap().find(handle);
if (it == sessionMap().end())
CssmError::throwMe(CSSMERR_CSSM_INVALID_ADDIN_HANDLE);
session = it->second;
sessionMap().erase(it);
}
try {
session->detach();
} catch (...) {
StLock<Mutex> _(sessionMap());
sessionMap()[handle] = session;
throw;
}
delete session;
}
void CssmPlugin::sendCallback(CSSM_MODULE_EVENT event, uint32 subId,
CSSM_SERVICE_TYPE serviceType) const
{
assert(haveCallback);
callback(event, mMyGuid, subId, serviceType);
}
void CssmPlugin::load() { }
void CssmPlugin::unload() { }