/*******************************************************************************
* 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();
}