//
//  PathWatcher.m
//  Cog
//
//  Created by Vincent Spader on 2/17/08.
//  Copyright 2008 __MyCompanyName__. All rights reserved.
//

#import "PathWatcher.h"

static void myFSEventCallback(
ConstFSEventStreamRef streamRef,
void *clientCallBackInfo,
size_t numEvents,
void *eventPaths,
const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[]) {
	int i;
	char **paths = eventPaths;
	PathWatcher *pathWatcher = (__bridge PathWatcher *)clientCallBackInfo;

	printf("Callback called\n");
	for(i = 0; i < numEvents; i++) {
		NSString *pathString = [[NSString alloc] initWithUTF8String:paths[i]];
		[[pathWatcher delegate] pathDidChange:pathString];
	}
}

@implementation PathWatcher

- (void)cleanUp {
	if(stream) {
		FSEventStreamStop(stream);
		FSEventStreamInvalidate(stream);
		FSEventStreamRelease(stream);
		stream = NULL;
	}
	if(context) {
		free(context);
		context = NULL;
	}
}

- (void)setPath:(NSString *)path {
	[self cleanUp];

	// Create FSEvent stream
	NSArray *pathsToWatch = @[path];

	context = (FSEventStreamContext *)malloc(sizeof(FSEventStreamContext));
	context->version = 0;
	context->info = (__bridge void *)self;
	context->retain = NULL;
	context->release = NULL;

	// Create the stream, passing in a callback
	stream = FSEventStreamCreate(NULL,
	                             &myFSEventCallback,
	                             context,
	                             (__bridge CFArrayRef)pathsToWatch,
	                             kFSEventStreamEventIdSinceNow, // Or a previous event ID
	                             1.0, // latency in seconds
	                             kFSEventStreamCreateFlagNone // Watch this and all its subdirectories
	);

	FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

	FSEventStreamStart(stream);
}

- (void)setDelegate:(id)d {
	delegate = d;
}
- (id)delegate {
	return delegate;
}

- (void)dealloc {
	[self cleanUp];
}

@end
