79 lines
2.1 KiB
Ruby
79 lines
2.1 KiB
Ruby
module FSSM::Backends
|
|
class FSEvents
|
|
def initialize(options={})
|
|
@streams = []
|
|
@handlers = {}
|
|
@allocator = options[:allocator] || OSX::KCFAllocatorDefault
|
|
@context = options[:context] || nil
|
|
@since = options[:since] || OSX::KFSEventStreamEventIdSinceNow
|
|
@latency = options[:latency] || 0.0
|
|
@flags = options[:flags] || 0
|
|
end
|
|
|
|
def add_path(path, preload=true)
|
|
@handlers["#{path}"] = FSSM::State.new(path, preload)
|
|
|
|
cb = lambda do |stream, context, number, paths, flags, ids|
|
|
paths.regard_as('*')
|
|
watched = OSX.FSEventStreamCopyPathsBeingWatched(stream).first
|
|
@handlers["#{watched}"].refresh
|
|
# TODO: support this level of granularity
|
|
# number.times do |n|
|
|
# @handlers["#{watched}"].refresh_path(paths[n])
|
|
# end
|
|
end
|
|
|
|
@streams << create_stream(cb, "#{path}")
|
|
end
|
|
|
|
def run
|
|
@streams.each do |stream|
|
|
schedule_stream(stream)
|
|
start_stream(stream)
|
|
end
|
|
|
|
begin
|
|
OSX.CFRunLoopRun
|
|
rescue Interrupt
|
|
@streams.each do |stream|
|
|
stop_stream(stream)
|
|
invalidate_stream(stream)
|
|
release_stream(stream)
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
private
|
|
|
|
def create_stream(callback, paths)
|
|
paths = [paths] unless paths.is_a?(Array)
|
|
OSX.FSEventStreamCreate(@allocator, callback, @context, paths, @since, @latency, @flags)
|
|
end
|
|
|
|
def schedule_stream(stream, options={})
|
|
run_loop = options[:run_loop] || OSX.CFRunLoopGetCurrent
|
|
loop_mode = options[:loop_mode] || OSX::KCFRunLoopDefaultMode
|
|
|
|
OSX.FSEventStreamScheduleWithRunLoop(stream, run_loop, loop_mode)
|
|
end
|
|
|
|
def start_stream(stream)
|
|
OSX.FSEventStreamStart(stream)
|
|
end
|
|
|
|
def stop_stream(stream)
|
|
OSX.FSEventStreamStop(stream)
|
|
end
|
|
|
|
def invalidate_stream(stream)
|
|
OSX.FSEventStreamInvalidate(stream)
|
|
end
|
|
|
|
def release_stream(stream)
|
|
OSX.FSEventStreamRelease(stream)
|
|
end
|
|
|
|
end
|
|
end
|