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