aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/basetypes/MCMainThreadMac.mm
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/basetypes/MCMainThreadMac.mm')
-rw-r--r--src/core/basetypes/MCMainThreadMac.mm110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/core/basetypes/MCMainThreadMac.mm b/src/core/basetypes/MCMainThreadMac.mm
new file mode 100644
index 00000000..8ecb7cae
--- /dev/null
+++ b/src/core/basetypes/MCMainThreadMac.mm
@@ -0,0 +1,110 @@
+#include "MCMainThread.h"
+
+#import <Foundation/Foundation.h>
+
+#include "MCAutoreleasePool.h"
+
+using namespace mailcore;
+
+static void destroyDelayedCall(void * caller);
+
+@interface LEPPPMainThreadCaller : NSObject {
+ void (* _function)(void *);
+ void * _context;
+ NSTimer * _timer;
+}
+
+@property (nonatomic, assign) void (* function)(void *);
+@property (nonatomic, assign) void * context;
+@property (nonatomic, retain) NSTimer * timer;
+
+- (void) call;
+- (void) cancel;
+
+@end
+
+@implementation LEPPPMainThreadCaller
+
+@synthesize function = _function;
+@synthesize context = _context;
+@synthesize timer = _timer;
+
+- (id) init
+{
+ self = [super init];
+ return self;
+}
+
+- (void) dealloc
+{
+ [_timer release];
+ [super dealloc];
+}
+
+- (void) call
+{
+ AutoreleasePool * pool = new AutoreleasePool();
+ _function(_context);
+ pool->release();
+
+ [self setTimer:nil];
+
+ destroyDelayedCall((void *) self);
+}
+
+- (void) cancel
+{
+ [_timer invalidate];
+ [self setTimer:nil];
+ destroyDelayedCall((void *) self);
+}
+
+@end
+
+void mailcore::callOnMainThread(void (* function)(void *), void * context)
+{
+ LEPPPMainThreadCaller * caller;
+ caller = [[LEPPPMainThreadCaller alloc] init];
+ [caller setFunction:function];
+ [caller setContext:context];
+ [caller performSelectorOnMainThread:@selector(call) withObject:nil waitUntilDone:NO];
+ //[caller release];
+}
+
+void mailcore::callOnMainThreadAndWait(void (* function)(void *), void * context)
+{
+ LEPPPMainThreadCaller * caller;
+ caller = [[LEPPPMainThreadCaller alloc] init];
+ [caller setFunction:function];
+ [caller setContext:context];
+ [caller performSelectorOnMainThread:@selector(call) withObject:nil waitUntilDone:YES];
+ //[caller release];
+}
+
+void * mailcore::callAfterDelay(void (* function)(void *), void * context, double time)
+{
+ LEPPPMainThreadCaller * caller;
+ caller = [[LEPPPMainThreadCaller alloc] init];
+ [caller setFunction:function];
+ [caller setContext:context];
+
+ NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval) time
+ target:caller
+ selector:@selector(call)
+ userInfo:nil
+ repeats:NO];
+ [caller setTimer:timer];
+
+ return caller;
+}
+
+static void destroyDelayedCall(void * caller)
+{
+ [(LEPPPMainThreadCaller *) caller release];
+}
+
+void mailcore::cancelDelayedCall(void * delayedCall)
+{
+ LEPPPMainThreadCaller * caller = (LEPPPMainThreadCaller *) delayedCall;
+ [caller cancel];
+}