#ifndef _H_CALLBACK
#define _H_CALLBACK
#include <Security/utilities.h>
#include <Security/threading.h>
#include <map>
#ifdef _CPP_CALLBACK
#pragma export on
#endif
namespace Security
{
class ModuleCallback {
public:
ModuleCallback() : mCallback(0), mContext(0) { }
ModuleCallback(CSSM_API_ModuleEventHandler callback, void *context)
: mCallback(callback), mContext(context) { }
void operator () (CSSM_MODULE_EVENT event,
const Guid &guid, uint32 subId,
CSSM_SERVICE_TYPE serviceType) const;
operator bool () const { return mCallback || mContext; }
bool operator ! () const { return !bool(*this); }
bool operator == (const ModuleCallback &cb) const
{ return mCallback == cb.mCallback && mContext == cb.mContext; }
bool operator < (const ModuleCallback &cb) const
{ return mCallback < cb.mCallback
|| mCallback == cb.mCallback && mContext < cb.mContext; }
private:
CSSM_API_ModuleEventHandler mCallback;
void *mContext;
};
class ModuleCallbackSet {
public:
unsigned int size() const { return callbacks.size(); }
void insert(const ModuleCallback &newCallback);
void erase(const ModuleCallback &oldCallback);
void operator () (CSSM_MODULE_EVENT event,
const Guid &guid, uint32 subId,
CSSM_SERVICE_TYPE serviceType) const;
private:
typedef multimap<ModuleCallback, CountingMutex *> CallbackMap;
mutable CallbackMap callbacks;
struct Runner : public Thread {
Runner(CallbackMap &inCallbacks,
CSSM_MODULE_EVENT inEvent,
const Guid &inGuid,
uint32 inSSId,
CSSM_SERVICE_TYPE inServiceType)
: callbacks(inCallbacks), event(inEvent), guid(inGuid),
subserviceId(inSSId), serviceType(inServiceType) { }
CallbackMap callbacks; const CSSM_MODULE_EVENT event;
const Guid guid;
const uint32 subserviceId;
const CSSM_SERVICE_TYPE serviceType;
void action();
};
};
}
#ifdef _CPP_CALLBACK
#pragma export off
#endif
#endif //_H_CALLBACK