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