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