]> git.saurik.com Git - apple/security.git/blobdiff - SecurityServer/eventlistener.cpp
Security-163.tar.gz
[apple/security.git] / SecurityServer / eventlistener.cpp
diff --git a/SecurityServer/eventlistener.cpp b/SecurityServer/eventlistener.cpp
new file mode 100644 (file)
index 0000000..e5b227e
--- /dev/null
@@ -0,0 +1,118 @@
+#include "eventlistener.h"
+
+
+namespace Security {
+namespace SecurityServer {
+
+EventListener::EventListener (CssmAllocator &standard, CssmAllocator &returning) : mClientSession (standard, returning),
+                                                                                                                                                                       mMachPortRef (NULL),
+                                                                                                                                                                       mRunLoopSourceRef (NULL)
+
+{
+       Initialize ();
+}
+
+
+
+EventListener::~EventListener ()
+{
+       if (mMachPortRef != NULL)
+       {
+               mach_port_t mp = CFMachPortGetPort (mMachPortRef);
+               mClientSession.stopNotification (mp);
+               CFRelease (mMachPortRef);
+       }
+       
+       if (mRunLoopSourceRef != NULL)
+       {
+               CFRelease (mRunLoopSourceRef);
+       }
+}
+
+
+
+void EventListener::Callback (CFMachPortRef port, void *msg, CFIndex size, void *info)
+{
+       reinterpret_cast<EventListener*>(info)->HandleCallback (port, msg, size);
+}
+
+
+
+void EventListener::Initialize ()
+{
+       // create a callback information structure
+       CFMachPortContext context = {1, this, NULL, NULL, NULL};
+       
+       // create the CFMachPort
+       mMachPortRef = CFMachPortCreate (NULL, Callback, &context, NULL);
+       if (mMachPortRef == NULL)
+       {
+               return;
+       }
+       
+    // set the buffer limit for the port
+       mach_port_t mp = CFMachPortGetPort (mMachPortRef);
+
+    mach_port_limits_t limits;
+    limits.mpl_qlimit = MACH_PORT_QLIMIT_MAX;
+    kern_return_t result =
+        mach_port_set_attributes (mach_task_self (), mp, MACH_PORT_LIMITS_INFO,
+                                  mach_port_info_t (&limits), MACH_PORT_LIMITS_INFO_COUNT);
+
+    if (result != KERN_SUCCESS)
+    {
+        secdebug ("notify", "Got error %d when trying to maximize queue size", result);
+    }
+    
+       // make a run loop source for this ref
+       mRunLoopSourceRef = CFMachPortCreateRunLoopSource (NULL, mMachPortRef, NULL);
+       if (mRunLoopSourceRef == NULL)
+       {
+               CFRelease (mMachPortRef);
+               return;
+       }
+       
+       // attach this run loop source to the main run loop
+       CFRunLoopAddSource (CFRunLoopGetCurrent (), mRunLoopSourceRef, kCFRunLoopDefaultMode);
+       
+       // extract the actual port from the run loop, and request callbacks on that port
+       mClientSession.requestNotification (mp, Listener::databaseNotifications,
+                                                                                       Listener::allEvents);
+}
+
+
+
+void EventListener::HandleCallback (CFMachPortRef port, void *msg, CFIndex size)
+{
+       // we need to parse the message and see what happened
+       mClientSession.dispatchNotification (reinterpret_cast<mach_msg_header_t *>(msg), ProcessMessage, this);
+}
+
+
+
+OSStatus EventListener::ProcessMessage (Listener::Domain domain, Listener::Event event, const void *data, size_t dataLength, void *context)
+{
+       reinterpret_cast<EventListener*>(context)->EventReceived (domain, event, data, dataLength);
+       return noErr;
+}
+
+
+
+void EventListener::RequestEvents (Listener::Domain whichDomain, Listener::EventMask whichEvents)
+{
+       // stop the old event request and change to the new one
+       mach_port_t mp = CFMachPortGetPort (mMachPortRef);
+       mClientSession.stopNotification (mp);
+       mClientSession.requestNotification (mp, whichDomain, whichEvents);
+}
+
+
+
+void EventListener::EventReceived (Listener::Domain domain, Listener::Event event, const void* data, size_t dataLength)
+{
+}
+
+
+
+};
+};