diff deps/Platinum/ThirdParty/Neptune/Source/System/Cocoa/NptCocoaMessageQueue.mm @ 0:3425707ddbf6

Initial import (hopefully this mercurial stuff works...)
author fraserofthenight
date Mon, 06 Jul 2009 08:06:28 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/ThirdParty/Neptune/Source/System/Cocoa/NptCocoaMessageQueue.mm	Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,98 @@
+/*****************************************************************
+|
+|      Neptune - Cocoa Message Queue
+|
+|      (c) 2001-2008 Gilles Boccon-Gibod
+|      Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+|   includes
++---------------------------------------------------------------------*/
+#include "NptCocoaMessageQueue.h"
+#include <Cocoa/Cocoa.h>
+
+/*----------------------------------------------------------------------
+|   NPT_CocoaMessageWrapper
++---------------------------------------------------------------------*/
+@interface NPT_CocoaMessageCapsule : NSObject
+{
+    NPT_Message*        message;
+    NPT_MessageHandler* handler;
+}
+-(id)   initWithMessage: (NPT_Message*) message andHandler: (NPT_MessageHandler*) handler;
+-(void) handle;
+@end
+
+@implementation NPT_CocoaMessageCapsule
+-(id) initWithMessage: (NPT_Message*) aMessage andHandler: (NPT_MessageHandler*) aHandler
+{
+    if ((self = [super init])) {
+        message = aMessage;
+        handler = aHandler;
+    }
+    return self;
+}
+
+-(void) dealloc
+{
+    [super dealloc];
+    delete message;
+}
+
+-(void) handle 
+{
+    if (handler && message) {
+        handler->HandleMessage(message);
+    }
+}
+@end
+
+/*----------------------------------------------------------------------
+|   NPT_CocoaMessageQueue::NPT_CocoaMessageQueue
++---------------------------------------------------------------------*/
+NPT_CocoaMessageQueue::NPT_CocoaMessageQueue()
+{
+}
+
+/*----------------------------------------------------------------------
+|   NPT_CocoaMessageQueue::~NPT_CocoaMessageQueue
++---------------------------------------------------------------------*/
+NPT_CocoaMessageQueue::~NPT_CocoaMessageQueue() 
+{
+}
+
+/*----------------------------------------------------------------------
+|   NPT_CocoaMessageQueue::PumpMessage
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_CocoaMessageQueue::PumpMessage(NPT_Timeout)
+{
+    // you cannot pump messages on this type of queue, since they will
+    // be pumped by the main application message loop 
+    return NPT_ERROR_NOT_SUPPORTED; 
+}
+
+/*----------------------------------------------------------------------
+|   NPT_CocoaMessageQueue::QueueMessage
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_CocoaMessageQueue::QueueMessage(NPT_Message*        message,
+                                    NPT_MessageHandler* handler)
+{
+    // create a capsule to represent the message and handler
+    NPT_CocoaMessageCapsule* capsule = [NPT_CocoaMessageCapsule alloc];
+    [capsule initWithMessage: message andHandler: handler];
+    
+    // trigger the handling of the message on the main thread
+    [capsule performSelectorOnMainThread: @selector(handle)
+                              withObject: nil
+                           waitUntilDone: FALSE];
+     
+    // we no longer hold a reference to the capsule (it will be released
+    // by the receiving thread)
+    [capsule release];
+    
+    return NPT_SUCCESS;
+}