/******************************************************************************* * Copyright (c) 2002, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM - Initial API and implementation *******************************************************************************/ package org.eclipse.core.internal.resources.refresh.win32; /** * Hooks for native methods involved with win32 auto-refresh callbacks. */ public class Win32Natives { /* general purpose */ /** * A general use constant expressing the value of an * invalid handle. */ public static final long INVALID_HANDLE_VALUE; /** * An error constant which indicates that the previous function * succeeded. */ public static final int ERROR_SUCCESS; /** * An error constant which indicates that a handle is or has become * invalid. */ public static final int ERROR_INVALID_HANDLE; /** * The combination of all of the error constants. */ public static int FILE_NOTIFY_ALL; /** * A constant which indicates the maximum number of objects * that can be passed into WaitForMultipleObjects. */ public static final int MAXIMUM_WAIT_OBJECTS; /** * A constant which indicates the maximum length of a pathname. */ public static final int MAX_PATH; /** * A constant which expresses the concept of the infinite. */ public static final int INFINITE; /* wait return values */ /** * A constant used returned WaitForMultipleObjects when the function times out. */ public static final int WAIT_TIMEOUT; /** * A constant used by WaitForMultipleObjects to indicate the object which was * signaled. */ public static final int WAIT_OBJECT_0; /** * A constant returned by WaitForMultipleObjects which indicates * that the wait failed. */ public static final int WAIT_FAILED; /* wait notification filter masks */ /** * Change filter for monitoring file rename, creation or deletion. */ public static final int FILE_NOTIFY_CHANGE_FILE_NAME; /** * Change filter for monitoring directory creation or deletion. */ public static final int FILE_NOTIFY_CHANGE_DIR_NAME; /** * Change filter for monitoring file/directory attribute changes. */ public static final int FILE_NOTIFY_CHANGE_ATTRIBUTES; /** * Change filter for monitoring file size changes. */ public static final int FILE_NOTIFY_CHANGE_SIZE; /** * Change filter for monitoring the file write timestamp */ public static final int FILE_NOTIFY_CHANGE_LAST_WRITE; /** * Change filter for monitoring the security descriptors * of files. */ public static final int FILE_NOTIFY_CHANGE_SECURITY; /** * Flag indicating whether or not the OS supports unicode calls. */ public static final boolean UNICODE; /* * Make requests to set the constants. */ static { System.loadLibrary("win32refresh"); //$NON-NLS-1$ UNICODE= IsUnicode(); INVALID_HANDLE_VALUE= INVALID_HANDLE_VALUE(); ERROR_SUCCESS= ERROR_SUCCESS(); ERROR_INVALID_HANDLE= ERROR_INVALID_HANDLE(); MAXIMUM_WAIT_OBJECTS= MAXIMUM_WAIT_OBJECTS(); MAX_PATH= MAX_PATH(); INFINITE= INFINITE(); WAIT_TIMEOUT= WAIT_TIMEOUT(); WAIT_OBJECT_0= WAIT_OBJECT_0(); WAIT_FAILED= WAIT_FAILED(); FILE_NOTIFY_CHANGE_FILE_NAME= FILE_NOTIFY_CHANGE_FILE_NAME(); FILE_NOTIFY_CHANGE_DIR_NAME= FILE_NOTIFY_CHANGE_DIR_NAME(); FILE_NOTIFY_CHANGE_ATTRIBUTES= FILE_NOTIFY_CHANGE_ATTRIBUTES(); FILE_NOTIFY_CHANGE_SIZE= FILE_NOTIFY_CHANGE_SIZE(); FILE_NOTIFY_CHANGE_LAST_WRITE= FILE_NOTIFY_CHANGE_LAST_WRITE(); FILE_NOTIFY_CHANGE_SECURITY= FILE_NOTIFY_CHANGE_SECURITY(); FILE_NOTIFY_ALL= FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_SECURITY; } /** * Creates a change notification object for the given path. The notification * object allows the client to monitor changes to the directory and the * subtree under the directory using FindNextChangeNotification or * WaitForMultipleObjects. * <p> * If the OS supports unicode the path must be no longer than 2^15 - 1 characters. * Otherwise, the path cannot be longer than MAX_PATH. In either case, if the given * path is too long ERROR_INVALID_HANDLE is returned. * * @param lpPathName The path of the file. * @param bWatchSubtree If <code>true</code>, specifies that the entire * tree under the given path should be monitored. If <code>false</code> * specifies that just the named path should be monitored. * @param dwNotifyFilter Any combination of FILE_NOTIFY_CHANGE_FILE_NAME, * FILE_NOTIFY_CHANGE_DIR_NAME, FILE_NOTIFY_CHANGE_ATTRIBUTES, * FILE_NOTIFY_CHANGE_SIZE, FILE_NOTIFY_CHANGE_LAST_WRITE, or * FILE_NOTIFY_CHANGE_SECURITY. * @return long The handle to the find change notification object or * ERROR_INVALID_HANDLE if the attempt fails. */ public static long FindFirstChangeNotification(String lpPathName, boolean bWatchSubtree, int dwNotifyFilter) { if (UNICODE) return FindFirstChangeNotificationW(lpPathName, bWatchSubtree, dwNotifyFilter); return FindFirstChangeNotificationA(Convert.toPlatformBytes(lpPathName), bWatchSubtree, dwNotifyFilter); } /** * Creates a change notification object for the given path. This notification object * allows the client to monitor changes to the directory and the subtree * under the directory using FindNextChangeNotification or * WaitForMultipleObjects. * * @param lpPathName The path to the directory to be monitored. Cannot be <code>null</code>, * or longer than 2^15 - 1 characters. * @param bWatchSubtree If <code>true</code>, specifies that the entire * tree under the given path should be monitored. If <code>false</code> * specifies that just the named path should be monitored. * @param dwNotifyFilter Any combination of FILE_NOTIFY_CHANGE_FILE_NAME, * FILE_NOTIFY_CHANGE_DIR_NAME, FILE_NOTIFY_CHANGE_ATTRIBUTES, * FILE_NOTIFY_CHANGE_SIZE, FILE_NOTIFY_CHANGE_LAST_WRITE, or * FILE_NOTIFY_CHANGE_SECURITY. * @return long The handle to the find change notification object or * ERROR_INVALID_HANDLE if the attempt fails. */ private static native long FindFirstChangeNotificationW(String lpPathName, boolean bWatchSubtree, int dwNotifyFilter); /** * Creates a change notification object for the given path. This notification object * allows the client to monitor changes to the directory and the subtree * under the directory using FindNextChangeNotification or * WaitForMultipleObjects. * * @param lpPathName The path to the directory to be monitored, cannot be <code>null</code>, * or be longer * than MAX_PATH. This path must be in platform bytes converted. * @param bWatchSubtree If <code>true</code>, specifies that the entire * tree under the given path should be monitored. If <code>false</code> * specifies that just the named path should be monitored. * @param dwNotifyFilter Any combination of FILE_NOTIFY_CHANGE_FILE_NAME, * FILE_NOTIFY_CHANGE_DIR_NAME, FILE_NOTIFY_CHANGE_ATTRIBUTES, * FILE_NOTIFY_CHANGE_SIZE, FILE_NOTIFY_CHANGE_LAST_WRITE, or * FILE_NOTIFY_CHANGE_SECURITY. * @return long The handle to the find change notification object or * ERROR_INVALID_HANDLE if the attempt fails. */ private static native long FindFirstChangeNotificationA(byte[] lpPathName, boolean bWatchSubtree, int dwNotifyFilter); /** * Stops and disposes of the change notification object that corresponds to the given * handle. The handle cannot be used in future calls to FindNextChangeNotification or * WaitForMultipleObjects * * @param hChangeHandle a handle which was created with FindFirstChangeNotification * @return boolean <code>true</code> if the method succeeds, <code>false</code> * otherwise. */ public static native boolean FindCloseChangeNotification(long hChangeHandle); /** * Requests that the next change detected be signaled. This method should only be * called after FindFirstChangeNotification or WaitForMultipleObjects. Once this * method has been called on a given handle, further notification requests can be made * through the WaitForMultipleObjects call. * @param hChangeHandle a handle which was created with FindFirstChangeNotification * @return boolean <code>true</code> if the method succeeds, <code>false</code> otherwise. */ public static native boolean FindNextChangeNotification(long hChangeHandle); /** * Returns when one of the following occurs. * <ul> * <li>One of the objects is signaled, when bWaitAll is <code>false</code></li> * <li>All of the objects are signaled, when bWaitAll is <code>true</code></li> * <li>The timeout interval of dwMilliseconds elapses.</li> * </ul> * @param nCount The number of handles, cannot be greater than MAXIMUM_WAIT_OBJECTS. * @param lpHandles The array of handles to objects to be waited upon cannot contain * duplicate handles. * @param bWaitAll If <code>true</code> requires all objects to be signaled before this * method returns. If <code>false</code>, indicates that only one object need be * signaled for this method to return. * @param dwMilliseconds A timeout value in milliseconds. If zero, the function tests * the objects and returns immediately. If INFINITE, the function will only return * when the objects have been signaled. * @return int WAIT_TIMEOUT when the function times out before recieving a signal. * WAIT_OBJECT_0 + n when a signal for the handle at index n. WAIT_FAILED when this * function fails. */ public static native int WaitForMultipleObjects(int nCount, long[] lpHandles, boolean bWaitAll, int dwMilliseconds); /** * Answers <code>true</code> if the operating system supports * long filenames. * @return boolean <code>true</code> if the operating system supports * long filenames, <code>false</code> otherwise. */ private static native boolean IsUnicode(); /** * Answers the last error set in the current thread. * @return int the last error */ public static native int GetLastError(); /** * Returns the constant FILE_NOTIFY_CHANGE_LAST_WRITE. * @return int */ private static native int FILE_NOTIFY_CHANGE_LAST_WRITE(); /** * Returns the constant FILE_NOTIFY_CHANGE_DIR_NAME. * @return int */ private static native int FILE_NOTIFY_CHANGE_DIR_NAME(); /** * Returns the constant FILE_NOTIFY_CHANGE_ATTRIBUTES. * @return int */ private static native int FILE_NOTIFY_CHANGE_ATTRIBUTES(); /** * Returns the constant FILE_NOTIFY_CHANGE_SIZE. * @return int */ private static native int FILE_NOTIFY_CHANGE_SIZE(); /** * Returns the constant FILE_NOTIFY_CHANGE_FILE_NAME. * @return int */ private static native int FILE_NOTIFY_CHANGE_FILE_NAME(); /** * Returns the constant FILE_NOTIFY_CHANGE_SECURITY. * @return int */ private static native int FILE_NOTIFY_CHANGE_SECURITY(); /** * Returns the constant MAXIMUM_WAIT_OBJECTS. * @return int */ private static native int MAXIMUM_WAIT_OBJECTS(); /** * Returns the constant MAX_PATH. * @return int */ private static native int MAX_PATH(); /** * Returns the constant INFINITE. * @return int */ private static native int INFINITE(); /** * Returns the constant WAIT_OBJECT_0. * @return int */ private static native int WAIT_OBJECT_0(); /** * Returns the constant WAIT_FAILED. * @return int */ private static native int WAIT_FAILED(); /** * Returns the constant WAIT_TIMEOUT. * @return int */ private static native int WAIT_TIMEOUT(); /** * Returns the constant ERROR_INVALID_HANDLE. * @return int */ private static native int ERROR_INVALID_HANDLE(); /** * Returns the constant ERROR_SUCCESS. * @return int */ private static native int ERROR_SUCCESS(); /** * Returns the constant INVALID_HANDLE_VALUE. * @return long */ private static native long INVALID_HANDLE_VALUE(); }