Monitor pac file with GCD instead of FSEventStreamCreate.

Old approach is not working on new version MacOS.
This commit is contained in:
Charlie Qiu
2017-01-11 10:43:37 +08:00
parent 78f0aa9c63
commit cb4e6d7f19

View File

@ -211,45 +211,34 @@ FSEventStreamRef fsEventStream;
} }
} }
void onPACChange(
ConstFSEventStreamRef streamRef,
void *clientCallBackInfo,
size_t numEvents,
void *eventPaths,
const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[])
{
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
if ([defaults boolForKey:@"ShadowsocksOn"]) {
if ([[defaults stringForKey:@"ShadowsocksRunningMode"] isEqualToString:@"auto"]) {
[ProxyConfHelper disableProxy];
[ProxyConfHelper enablePACProxy];
}
}
}
+ (void)startMonitorPAC { + (void)startMonitorPAC {
NSString* PACFilePath = [self getPACFilePath]; NSString* PACFilePath = [self getPACFilePath];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
if (fsEventStream) { int fileId = open([PACFilePath UTF8String], O_EVTONLY);
return; __block dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE, fileId,
} DISPATCH_VNODE_DELETE | DISPATCH_VNODE_WRITE | DISPATCH_VNODE_EXTEND | DISPATCH_VNODE_ATTRIB | DISPATCH_VNODE_LINK | DISPATCH_VNODE_RENAME | DISPATCH_VNODE_REVOKE,
CFStringRef mypath = (__bridge CFStringRef)(PACFilePath); queue);
CFArrayRef pathsToWatch = CFArrayCreate(NULL, (const void **)&mypath, 1, NULL); dispatch_source_set_event_handler(source, ^
void *callbackInfo = NULL; // could put stream-specific data here. {
CFAbsoluteTime latency = 3.0; /* Latency in seconds */ unsigned long flags = dispatch_source_get_data(source);
if(flags & DISPATCH_VNODE_DELETE)
/* Create the stream, passing in a callback */ {
fsEventStream = FSEventStreamCreate(NULL, dispatch_source_cancel(source);
&onPACChange, } else {
callbackInfo, NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
pathsToWatch, if ([defaults boolForKey:@"ShadowsocksOn"]) {
kFSEventStreamEventIdSinceNow, /* Or a previous event ID */ if ([[defaults stringForKey:@"ShadowsocksRunningMode"] isEqualToString:@"auto"]) {
latency, [ProxyConfHelper disableProxy];
kFSEventStreamCreateFlagNone /* Flags explained in reference */ [ProxyConfHelper enablePACProxy];
); }
FSEventStreamScheduleWithRunLoop(fsEventStream, [[NSRunLoop mainRunLoop] getCFRunLoop], (__bridge CFStringRef)NSDefaultRunLoopMode); }
FSEventStreamStart(fsEventStream); }
});
dispatch_source_set_cancel_handler(source, ^(void)
{
close(fileId);
});
dispatch_resume(source);
} }
@end @end