diff options
author | Hoa V. Dinh <dinh.viet.hoa@gmail.com> | 2014-11-11 14:58:31 -0800 |
---|---|---|
committer | Hoa V. Dinh <dinh.viet.hoa@gmail.com> | 2014-11-11 14:59:23 -0800 |
commit | 7ab26b37e88ba43de5717b1477ef68c805af4dc0 (patch) | |
tree | 026733ab42f92ac787a0d0cfed6e1b93d904a1d5 /src/core/basetypes/MCMainThreadMac.mm | |
parent | bc302535ca56f7a68219c5add1334319027264af (diff) |
Renamed MCMainThread.mm to MCMainThreadMac.mm
Diffstat (limited to 'src/core/basetypes/MCMainThreadMac.mm')
-rw-r--r-- | src/core/basetypes/MCMainThreadMac.mm | 110 |
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]; +} |