]> gitweb.factorcode.org Git - factor.git/blob - basis/core-foundation/fsevents/fsevents.factor
use assoc-reject instead of [ ... not ] assoc-filter.
[factor.git] / basis / core-foundation / fsevents / fsevents.factor
1 ! Copyright (C) 2008 Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien alien.c-types alien.data alien.strings
4 alien.syntax arrays assocs classes.struct combinators
5 core-foundation core-foundation.arrays core-foundation.run-loop
6 core-foundation.strings core-foundation.time destructors init
7 io.encodings.utf8 kernel locals namespaces sequences
8 specialized-arrays unix.types ;
9 FROM: namespaces => change-global ;
10 IN: core-foundation.fsevents
11
12 SPECIALIZED-ARRAY: void*
13 SPECIALIZED-ARRAY: uint
14 SPECIALIZED-ARRAY: ulonglong
15
16 CONSTANT: kFSEventStreamCreateFlagNone 0x00000000
17 CONSTANT: kFSEventStreamCreateFlagUseCFTypes 0x00000001
18 CONSTANT: kFSEventStreamCreateFlagNoDefer 0x00000002
19 CONSTANT: kFSEventStreamCreateFlagWatchRoot 0x00000004
20 CONSTANT: kFSEventStreamCreateFlagIgnoreSelf 0x00000008
21 CONSTANT: kFSEventStreamCreateFlagFileEvents 0x00000010
22
23 CONSTANT: kFSEventStreamEventFlagMustScanSubDirs 0x00000001
24 CONSTANT: kFSEventStreamEventFlagUserDropped 0x00000002
25 CONSTANT: kFSEventStreamEventFlagKernelDropped 0x00000004
26 CONSTANT: kFSEventStreamEventFlagEventIdsWrapped 0x00000008
27 CONSTANT: kFSEventStreamEventFlagHistoryDone 0x00000010
28 CONSTANT: kFSEventStreamEventFlagRootChanged 0x00000020
29 CONSTANT: kFSEventStreamEventFlagMount 0x00000040
30 CONSTANT: kFSEventStreamEventFlagUnmount 0x00000080
31
32 CONSTANT: kFSEventStreamEventFlagItemCreated 0x00000100
33 CONSTANT: kFSEventStreamEventFlagItemRemoved 0x00000200
34 CONSTANT: kFSEventStreamEventFlagItemInodeMetaMod 0x00000400
35 CONSTANT: kFSEventStreamEventFlagItemRenamed 0x00000800
36 CONSTANT: kFSEventStreamEventFlagItemModified 0x00001000
37 CONSTANT: kFSEventStreamEventFlagItemFinderInfoMod 0x00002000
38 CONSTANT: kFSEventStreamEventFlagItemChangeOwner 0x00004000
39 CONSTANT: kFSEventStreamEventFlagItemXattrMod 0x00008000
40 CONSTANT: kFSEventStreamEventFlagItemIsFile 0x00010000
41 CONSTANT: kFSEventStreamEventFlagItemIsDir 0x00020000
42 CONSTANT: kFSEventStreamEventFlagItemIsSymlink 0x00040000
43
44 TYPEDEF: uint FSEventStreamCreateFlags
45 TYPEDEF: uint FSEventStreamEventFlags
46 TYPEDEF: ulonglong FSEventStreamEventId
47 TYPEDEF: void* FSEventStreamRef
48
49 STRUCT: FSEventStreamContext
50     { version CFIndex }
51     { info void* }
52     { retain void* }
53     { release void* }
54     { copyDescription void* } ;
55
56 CALLBACK: void FSEventStreamCallback ( FSEventStreamRef streamRef, void* clientCallBackInfo, size_t numEvents, void* eventPaths, FSEventStreamEventFlags* eventFlags, FSEventStreamEventId* eventIds ) ;
57
58 CONSTANT: FSEventStreamEventIdSinceNow 0xFFFFFFFFFFFFFFFF
59
60 FUNCTION: FSEventStreamRef FSEventStreamCreate (
61     CFAllocatorRef           allocator,
62     FSEventStreamCallback    callback,
63     FSEventStreamContext*    context,
64     CFArrayRef               pathsToWatch,
65     FSEventStreamEventId     sinceWhen,
66     CFTimeInterval           latency,
67     FSEventStreamCreateFlags flags ) ;
68
69 FUNCTION: FSEventStreamRef FSEventStreamCreateRelativeToDevice (
70     CFAllocatorRef           allocator,
71     FSEventStreamCallback    callback,
72     FSEventStreamContext*    context,
73     dev_t                    deviceToWatch,
74     CFArrayRef               pathsToWatchRelativeToDevice,
75     FSEventStreamEventId     sinceWhen,
76     CFTimeInterval           latency,
77     FSEventStreamCreateFlags flags ) ;
78
79 FUNCTION: FSEventStreamEventId FSEventStreamGetLatestEventId ( FSEventStreamRef streamRef ) ;
80
81 FUNCTION: dev_t FSEventStreamGetDeviceBeingWatched ( FSEventStreamRef streamRef ) ;
82
83 FUNCTION: CFArrayRef FSEventStreamCopyPathsBeingWatched ( FSEventStreamRef streamRef ) ;
84
85 FUNCTION: FSEventStreamEventId FSEventsGetCurrentEventId ( ) ;
86
87 FUNCTION: CFUUIDRef FSEventsCopyUUIDForDevice ( dev_t dev ) ;
88
89 FUNCTION: FSEventStreamEventId FSEventsGetLastEventIdForDeviceBeforeTime (
90     dev_t          dev,
91     CFAbsoluteTime time ) ;
92
93 FUNCTION: Boolean FSEventsPurgeEventsForDeviceUpToEventId (
94     dev_t                dev,
95     FSEventStreamEventId eventId ) ;
96
97 FUNCTION: void FSEventStreamRetain ( FSEventStreamRef streamRef ) ;
98
99 FUNCTION: void FSEventStreamRelease ( FSEventStreamRef streamRef ) ;
100
101 FUNCTION: void FSEventStreamScheduleWithRunLoop (
102     FSEventStreamRef streamRef,
103     CFRunLoopRef     runLoop,
104     CFStringRef      runLoopMode ) ;
105
106 FUNCTION: void FSEventStreamUnscheduleFromRunLoop (
107     FSEventStreamRef streamRef,
108     CFRunLoopRef     runLoop,
109     CFStringRef      runLoopMode ) ;
110
111 FUNCTION: void FSEventStreamInvalidate ( FSEventStreamRef streamRef ) ;
112
113 FUNCTION: Boolean FSEventStreamStart ( FSEventStreamRef streamRef ) ;
114
115 FUNCTION: FSEventStreamEventId FSEventStreamFlushAsync ( FSEventStreamRef streamRef ) ;
116
117 FUNCTION: void FSEventStreamFlushSync ( FSEventStreamRef streamRef ) ;
118
119 FUNCTION: void FSEventStreamStop ( FSEventStreamRef streamRef ) ;
120
121 FUNCTION: void FSEventStreamShow ( FSEventStreamRef streamRef ) ;
122
123 FUNCTION: CFStringRef FSEventStreamCopyDescription ( FSEventStreamRef streamRef ) ;
124
125 : make-FSEventStreamContext ( info -- alien )
126     FSEventStreamContext <struct>
127         swap >>info ;
128
129 :: <FSEventStream> ( callback info paths latency flags -- event-stream )
130     f ! allocator
131     callback
132     info make-FSEventStreamContext
133     paths <CFStringArray>
134     FSEventStreamEventIdSinceNow ! sinceWhen
135     latency
136     flags
137     FSEventStreamCreate ;
138
139 C-GLOBAL: void* kCFRunLoopCommonModes
140
141 : schedule-event-stream ( event-stream -- )
142     CFRunLoopGetMain
143     kCFRunLoopCommonModes
144     FSEventStreamScheduleWithRunLoop ;
145
146 : unschedule-event-stream ( event-stream -- )
147     CFRunLoopGetMain
148     kCFRunLoopCommonModes
149     FSEventStreamUnscheduleFromRunLoop ;
150
151 : enable-event-stream ( event-stream -- )
152     dup
153     schedule-event-stream
154     dup FSEventStreamStart [
155         drop
156     ] [
157         dup unschedule-event-stream
158         FSEventStreamRelease
159         "Cannot enable FSEventStream" throw
160     ] if ;
161
162 : disable-event-stream ( event-stream -- )
163     dup FSEventStreamStop
164     unschedule-event-stream ;
165
166 SYMBOL: event-stream-callbacks
167
168 : event-stream-counter ( -- n )
169     \ event-stream-counter counter ;
170
171 [
172     event-stream-callbacks
173     [ [ drop expired? ] assoc-reject H{ } assoc-like ] change-global
174 ] "core-foundation" add-startup-hook
175
176 : add-event-source-callback ( quot -- id )
177     event-stream-counter <alien>
178     [ event-stream-callbacks get set-at ] keep ;
179
180 : remove-event-source-callback ( id -- )
181     event-stream-callbacks get delete-at ;
182
183 :: (master-event-source-callback) ( eventStream info numEvents eventPaths eventFlags eventIds -- )
184     eventPaths numEvents void* <c-direct-array> [ utf8 alien>string ] { } map-as
185     eventFlags numEvents uint <c-direct-array>
186     eventIds numEvents ulonglong <c-direct-array>
187     3array flip
188     info event-stream-callbacks get at [ drop ] or call( changes -- ) ;
189
190 : master-event-source-callback ( -- alien )
191     [ (master-event-source-callback) ] FSEventStreamCallback ;
192
193 TUPLE: event-stream < disposable info handle ;
194
195 : <event-stream> ( quot paths latency flags -- event-stream )
196     [
197         add-event-source-callback
198         [ master-event-source-callback ] keep
199     ] 3dip <FSEventStream>
200     dup enable-event-stream
201     event-stream new-disposable swap >>handle swap >>info ;
202
203 M: event-stream dispose*
204     {
205         [ info>> remove-event-source-callback ]
206         [ handle>> disable-event-stream ]
207         [ handle>> FSEventStreamInvalidate ]
208         [ handle>> FSEventStreamRelease ]
209     } cleave ;