cog/FileTree/PathWatcher.m

90 lines
1.8 KiB
Matlab
Raw Normal View History

//
// 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