/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#import "SkEventNotifier.h"
#include "SkEvent.h"
#define SkEventClass @"SkEvenClass"
@implementation SkEventNotifier
- (id)init {
    self = [super init];
    if (self) {
        //Register as an observer for SkEventClass events and call
        //receiveSkEvent: upon receiving the event
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(receiveSkEvent:)
                                                     name:SkEventClass
                                                   object:nil];
    }
    return self;
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

-(BOOL) acceptsFirstResponder {
    return YES;
}

//SkEvent Handers
- (void)receiveSkEvent:(NSNotification *)notification {
    if(SkEvent::ProcessEvent())
        SkEvent::SignalNonEmptyQueue();
}

+ (void)postTimedSkEvent:(NSTimeInterval)timeInterval {
    [NSTimer scheduledTimerWithTimeInterval:timeInterval target:self
                                   selector:@selector(timerFireMethod:)
                                   userInfo:nil repeats:NO];
}

+ (void)timerFireMethod:(NSTimer*)theTimer {
	SkEvent::ServiceQueueTimer();
}

@end
////////////////////////////////////////////////////////////////////////////////
void SkEvent::SignalNonEmptyQueue() {
    //post a SkEventClass event to the default notification queue
    NSNotification* notification = [NSNotification notificationWithName:SkEventClass object:nil];
    [[NSNotificationQueue defaultQueue] enqueueNotification:notification
                                               postingStyle:NSPostWhenIdle
                                               coalesceMask:NSNotificationNoCoalescing
                                                   forModes:nil];
}

void SkEvent::SignalQueueTimer(SkMSec delay) {
	if (delay) {
        //Convert to seconds
        NSTimeInterval ti = delay/(float)SK_MSec1;
        [SkEventNotifier postTimedSkEvent:ti];
	}
}