#ifndef _H_NOTIFICATIONS
#define _H_NOTIFICATIONS
#include <security_utilities/mach++.h>
#include <security_utilities/machserver.h>
#include <security_utilities/globalizer.h>
#include <securityd_client/ssclient.h>
#include <map>
#include <queue>
#include "SharedMemoryServer.h"
using MachPlusPlus::Port;
using MachPlusPlus::MachServer;
using SecurityServer::NotificationDomain;
using SecurityServer::NotificationEvent;
using SecurityServer::NotificationMask;
class SharedMemoryListener;
class Listener: public RefCount {
public:
Listener(NotificationDomain domain, NotificationMask events,
mach_port_t port = MACH_PORT_NULL);
virtual ~Listener();
static void notify(NotificationDomain domain,
NotificationEvent event, const CssmData &data);
static void notify(NotificationDomain domain,
NotificationEvent event, uint32 sequence, const CssmData &data);
static bool remove(Port port);
const NotificationDomain domain;
const NotificationMask events;
bool wants(NotificationEvent event)
{ return (1 << event) & events; }
protected:
class Notification : public RefCount {
public:
Notification(NotificationDomain domain, NotificationEvent event,
uint32 seq, const CssmData &data);
virtual ~Notification();
const NotificationDomain domain;
const NotificationEvent event;
const uint32 sequence;
const CssmAutoData data;
size_t size() const
{ return data.length(); } };
virtual void notifyMe(Notification *message) = 0;
public:
class JitterBuffer {
public:
JitterBuffer() : mNotifyLast(0) { }
bool inSequence(Notification *message);
RefPointer<Notification> popNotification();
private:
uint32 mNotifyLast; typedef std::map<uint32, RefPointer<Notification> > JBuffer;
JBuffer mBuffer; };
private:
static void sendNotification(Notification *message);
private:
typedef multimap<mach_port_t, RefPointer<Listener> > ListenerMap;
static ListenerMap& listeners;
static Mutex setLock;
};
class SharedMemoryListener : public Listener, public SharedMemoryServer, public Security::MachPlusPlus::MachServer::Timer
{
protected:
virtual void action ();
virtual void notifyMe(Notification *message);
bool mActive;
public:
SharedMemoryListener (const char* serverName, u_int32_t serverSize);
virtual ~SharedMemoryListener ();
};
#endif