]> gitweb.factorcode.org Git - factor.git/blob - basis/core-foundation/fsevents/fsevents.factor
Specialized array overhaul
[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.run-loop core-foundation.strings
8 core-foundation.time ;
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(FSEventStreamRef streamRef, void *clientCallBackInfo, size_t numEvents, void *eventPaths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]);
40 TYPEDEF: void* FSEventStreamCallback
41
42 CONSTANT: FSEventStreamEventIdSinceNow HEX: FFFFFFFFFFFFFFFF
43
44 FUNCTION: FSEventStreamRef FSEventStreamCreate (
45     CFAllocatorRef           allocator,
46     FSEventStreamCallback    callback,
47     FSEventStreamContext*    context,
48     CFArrayRef               pathsToWatch,
49     FSEventStreamEventId     sinceWhen,
50     CFTimeInterval           latency,
51     FSEventStreamCreateFlags flags ) ;
52
53 FUNCTION: FSEventStreamRef FSEventStreamCreateRelativeToDevice (
54     CFAllocatorRef           allocator,
55     FSEventStreamCallback    callback,
56     FSEventStreamContext*    context,
57     dev_t                    deviceToWatch,
58     CFArrayRef               pathsToWatchRelativeToDevice,
59     FSEventStreamEventId     sinceWhen,
60     CFTimeInterval           latency,
61     FSEventStreamCreateFlags flags ) ;
62
63 FUNCTION: FSEventStreamEventId FSEventStreamGetLatestEventId ( FSEventStreamRef streamRef ) ;
64
65 FUNCTION: dev_t FSEventStreamGetDeviceBeingWatched ( FSEventStreamRef streamRef ) ;
66
67 FUNCTION: CFArrayRef FSEventStreamCopyPathsBeingWatched ( FSEventStreamRef streamRef ) ;
68
69 FUNCTION: FSEventStreamEventId FSEventsGetCurrentEventId ( ) ;
70
71 FUNCTION: CFUUIDRef FSEventsCopyUUIDForDevice ( dev_t dev ) ;
72
73 FUNCTION: FSEventStreamEventId FSEventsGetLastEventIdForDeviceBeforeTime (
74     dev_t          dev,
75     CFAbsoluteTime time ) ;
76
77 FUNCTION: Boolean FSEventsPurgeEventsForDeviceUpToEventId (
78     dev_t                dev,
79     FSEventStreamEventId eventId ) ;
80
81 FUNCTION: void FSEventStreamRetain ( FSEventStreamRef streamRef ) ;
82
83 FUNCTION: void FSEventStreamRelease ( FSEventStreamRef streamRef ) ;
84
85 FUNCTION: void FSEventStreamScheduleWithRunLoop (
86     FSEventStreamRef streamRef,
87     CFRunLoopRef     runLoop,
88     CFStringRef      runLoopMode ) ;
89
90 FUNCTION: void FSEventStreamUnscheduleFromRunLoop (
91     FSEventStreamRef streamRef,
92     CFRunLoopRef     runLoop,
93     CFStringRef      runLoopMode ) ;
94
95 FUNCTION: void FSEventStreamInvalidate ( FSEventStreamRef streamRef ) ;
96
97 FUNCTION: Boolean FSEventStreamStart ( FSEventStreamRef streamRef ) ;
98
99 FUNCTION: FSEventStreamEventId FSEventStreamFlushAsync ( FSEventStreamRef streamRef ) ;
100
101 FUNCTION: void FSEventStreamFlushSync ( FSEventStreamRef streamRef ) ;
102
103 FUNCTION: void FSEventStreamStop ( FSEventStreamRef streamRef ) ;
104
105 FUNCTION: void FSEventStreamShow ( FSEventStreamRef streamRef ) ;
106
107 FUNCTION: CFStringRef FSEventStreamCopyDescription ( FSEventStreamRef streamRef ) ;
108
109 : make-FSEventStreamContext ( info -- alien )
110     FSEventStreamContext <struct>
111         swap >>info ;
112
113 :: <FSEventStream> ( callback info paths latency flags -- event-stream )
114     f ! allocator
115     callback
116     info make-FSEventStreamContext
117     paths <CFStringArray>
118     FSEventStreamEventIdSinceNow ! sinceWhen
119     latency
120     flags
121     FSEventStreamCreate ;
122
123 : kCFRunLoopCommonModes ( -- string )
124     &: kCFRunLoopCommonModes *void* ;
125
126 : schedule-event-stream ( event-stream -- )
127     CFRunLoopGetMain
128     kCFRunLoopCommonModes
129     FSEventStreamScheduleWithRunLoop ;
130
131 : unschedule-event-stream ( event-stream -- )
132     CFRunLoopGetMain
133     kCFRunLoopCommonModes
134     FSEventStreamUnscheduleFromRunLoop ;
135
136 : enable-event-stream ( event-stream -- )
137     dup
138     schedule-event-stream
139     dup FSEventStreamStart [
140         drop
141     ] [
142         dup unschedule-event-stream
143         FSEventStreamRelease
144         "Cannot enable FSEventStream" throw
145     ] if ;
146
147 : disable-event-stream ( event-stream -- )
148     dup FSEventStreamStop
149     unschedule-event-stream ;
150
151 SYMBOL: event-stream-callbacks
152
153 : event-stream-counter ( -- n )
154     \ event-stream-counter counter ;
155
156 [
157     event-stream-callbacks
158     [ [ drop expired? not ] assoc-filter H{ } assoc-like ] change-global
159 ] "core-foundation" add-init-hook
160
161 : add-event-source-callback ( quot -- id )
162     event-stream-counter <alien>
163     [ event-stream-callbacks get set-at ] keep ;
164
165 : remove-event-source-callback ( id -- )
166     event-stream-callbacks get delete-at ;
167
168 :: (master-event-source-callback) ( eventStream info numEvents eventPaths eventFlags eventIds -- )
169     eventPaths numEvents <direct-void*-array> [ utf8 alien>string ] { } map-as
170     eventFlags numEvents <direct-int-array>
171     eventIds numEvents <direct-longlong-array>
172     3array flip
173     info event-stream-callbacks get at [ drop ] or call( changes -- ) ;
174
175 : master-event-source-callback ( -- alien )
176     "void"
177     {
178         "FSEventStreamRef"
179         "void*"                     ! info
180         "size_t"                    ! numEvents
181         "void*"                     ! eventPaths
182         "FSEventStreamEventFlags*"
183         "FSEventStreamEventId*"
184     }
185     "cdecl" [ (master-event-source-callback) ] alien-callback ;
186
187 TUPLE: event-stream < disposable info handle ;
188
189 : <event-stream> ( quot paths latency flags -- event-stream )
190     [
191         add-event-source-callback
192         [ master-event-source-callback ] keep
193     ] 3dip <FSEventStream>
194     dup enable-event-stream
195     event-stream new-disposable swap >>handle swap >>info ;
196
197 M: event-stream dispose*
198     {
199         [ info>> remove-event-source-callback ]
200         [ handle>> disable-event-stream ]
201         [ handle>> FSEventStreamInvalidate ]
202         [ handle>> FSEventStreamRelease ]
203     } cleave ;