package org.objectstyle.wolips.goodies.core.mac.jna; import org.objectstyle.wolips.goodies.core.mac.jna.CoreFoundation.CFAllocationReleaseCallaback; import org.objectstyle.wolips.goodies.core.mac.jna.CoreFoundation.CFAllocationRetainCallback; import org.objectstyle.wolips.goodies.core.mac.jna.CoreFoundation.CFAllocatorCopyDescriptionCallBack; import com.sun.jna.Callback; import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.Structure; public interface CoreServices extends Library { public final CoreServices INSTANCE = (CoreServices) Native.loadLibrary("CoreServices", CoreServices.class); public interface FSEventStreamCallback extends Callback { void callback(Pointer streamRef, Pointer clientCallbackInfo, int numEvents, Pointer eventPaths, Pointer eventFlags, Pointer eventIds); } public class FSEventStreamContext extends Structure { public int version = 0; public Pointer info = null; public CFAllocationRetainCallback retain = null; public CFAllocationReleaseCallaback release = null; public CFAllocatorCopyDescriptionCallBack copyDescription = null; } public class FSEventStreamRef extends Structure { // empty } public static final int kFSEventStreamCreateFlagNone = 0; public static final int kFSEventStreamCreateFlagUseCFTypes = 1; public static final int kFSEventStreamCreateFlagNoDefer = 2; public static final int kFSEventStreamCreateFlagWatchRoot = 4; public static final int gestaltSystemVersion = ('s'<<24) + ('y'<<16) + ('s'<<8) + 'v'; public long FSEventsGetCurrentEventId(); public Pointer FSEventStreamCreate(Pointer allocator, FSEventStreamCallback callback, FSEventStreamContext context, Pointer pathsToWatch, long sinceWhen, double latency, int flags); public void FSEventStreamFlushSync(Pointer streamRef); public void FSEventStreamInvalidate(Pointer streamRef); public void FSEventStreamRelease(Pointer streamRef); public void FSEventStreamScheduleWithRunLoop(Pointer streamRef, Pointer runLoop, Pointer runLoopMod); public boolean FSEventStreamStart(Pointer streamRef); public void FSEventStreamStop(Pointer streamRef); public int Gestalt(int selector, int[] response); public static class CoreServicesWrapper implements CoreServices { private static final CoreServices coreServices = CoreServices.INSTANCE; private static final CoreServicesWrapper wrapper = new CoreServicesWrapper(); public static CoreServicesWrapper defaultInstance() { return wrapper; } private CoreServicesWrapper() { } public long FSEventsGetCurrentEventId() { return coreServices.FSEventsGetCurrentEventId(); } public Pointer FSEventStreamCreate(Pointer allocator, FSEventStreamCallback callback, FSEventStreamContext context, Pointer pathsToWatch, long sinceWhen, double latency, int flags) { return coreServices.FSEventStreamCreate(allocator, callback, context, pathsToWatch, sinceWhen, latency, flags); } public void FSEventStreamFlushSync(Pointer streamRef) { coreServices.FSEventStreamFlushSync(streamRef); } public void FSEventStreamInvalidate(Pointer streamRef) { coreServices.FSEventStreamInvalidate(streamRef); } public void FSEventStreamRelease(Pointer streamRef) { coreServices.FSEventStreamRelease(streamRef); } public void FSEventStreamScheduleWithRunLoop(Pointer streamRef, Pointer runLoop, Pointer runLoopMod) { coreServices.FSEventStreamScheduleWithRunLoop(streamRef, runLoop, runLoopMod); } public boolean FSEventStreamStart(Pointer streamRef) { return coreServices.FSEventStreamStart(streamRef); } public void FSEventStreamStop(Pointer streamRef) { coreServices.FSEventStreamStop(streamRef); } public int Gestalt(int selector, int[] response) { return coreServices.Gestalt(selector, response); } public int SystemVersion() { int[] response = new int[1]; coreServices.Gestalt(gestaltSystemVersion, response); return response[0]; } } }