forked from goonj/goonj
-
Notifications
You must be signed in to change notification settings - Fork 1
/
GDirectoryWatcher.m
99 lines (78 loc) · 2.97 KB
/
GDirectoryWatcher.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
File: GDirectoryWatcher.m
Description: Watches directories for changes. Implementation.
This file is part of Goonj.
Goonj is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Goonj is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Goonj. If not, see <http://www.gnu.org/licenses/>.
Copyright 2009 Pratul Kalia.
Copyright 2009 Ankur Sethi.
*/
#import "GDirectoryWatcher.h"
void FSEventCallback(
ConstFSEventStreamRef streamRef,
void *clientCallbackInfo,
size_t numEvents,
void *eventPaths,
const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[])
{
int i;
char **paths = eventPaths;
NSMutableArray *directoriesToScan = [[NSMutableArray alloc]
initWithCapacity:numEvents];
for(i = 0 ; i < numEvents ; i++) {
[directoriesToScan addObject:[NSString stringWithCString:paths[i]
encoding:NSUTF8StringEncoding]];
}
[[NSNotificationCenter defaultCenter]
postNotificationName:@"GoonjWatchDirectoriesChangedNotification"
object:directoriesToScan];
}
@implementation GDirectoryWatcher
- (id) initWithDirectories:(NSArray *)theDirectories
{
if (self = [super init]) {
watchedDirectories = [NSMutableArray arrayWithArray:theDirectories];
// TODO: save the last fsevent ID to the plist.
eventStream = FSEventStreamCreate(NULL, &FSEventCallback, NULL,
(CFArrayRef)watchedDirectories, kFSEventStreamEventIdSinceNow,
1, kFSEventStreamCreateFlagNone);
return self;
}
return nil;
}
- (id) initWithDefaultWatchDirectories
{
if (self = [super init]) {
NSArray *paths = [[NSUserDefaults standardUserDefaults]
arrayForKey:@"LibraryFolderLocations"];
watchedDirectories = [[NSMutableArray alloc]
initWithCapacity:[paths count]];
for (NSString *directory in paths) {
directory = [directory stringByExpandingTildeInPath];
[watchedDirectories addObject:directory];
}
eventStream = FSEventStreamCreate(NULL, &FSEventCallback, NULL,
(CFArrayRef)watchedDirectories, kFSEventStreamEventIdSinceNow,
1, kFSEventStreamCreateFlagNone);
return self;
}
return nil;
}
- (void) startWatching
{
FSEventStreamScheduleWithRunLoop(eventStream,
[[NSRunLoop currentRunLoop] getCFRunLoop],
kCFRunLoopCommonModes);
FSEventStreamStart(eventStream);
[[NSRunLoop currentRunLoop] run];
}
@end