Author: pschweitzer Date: Sat Mar 29 21:12:17 2014 New Revision: 62581
URL: http://svn.reactos.org/svn/reactos?rev=62581&view=rev Log: [ROSTESTS] Add notifications test application. It is: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365261%28v=vs.85%2... It properly works in ReactOS since r62446
CORE-2582
Added: trunk/rostests/win32/kernel32/CMakeLists.txt (with props) trunk/rostests/win32/kernel32/notificationtest/ trunk/rostests/win32/kernel32/notificationtest/CMakeLists.txt (with props) trunk/rostests/win32/kernel32/notificationtest/notificationtest.c (with props)
Added: trunk/rostests/win32/kernel32/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/rostests/win32/kernel32/CMakeLists.... ============================================================================== --- trunk/rostests/win32/kernel32/CMakeLists.txt (added) +++ trunk/rostests/win32/kernel32/CMakeLists.txt [iso-8859-1] Sat Mar 29 21:12:17 2014 @@ -0,0 +1 @@ +add_subdirectory(notificationtest)
Propchange: trunk/rostests/win32/kernel32/CMakeLists.txt ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rostests/win32/kernel32/notificationtest/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/rostests/win32/kernel32/notificatio... ============================================================================== --- trunk/rostests/win32/kernel32/notificationtest/CMakeLists.txt (added) +++ trunk/rostests/win32/kernel32/notificationtest/CMakeLists.txt [iso-8859-1] Sat Mar 29 21:12:17 2014 @@ -0,0 +1,9 @@ + +list(APPEND SOURCE + notificationtest.c) + +add_executable(notificationtest ${SOURCE}) +target_link_libraries(notificationtest wine ${PSEH_LIB}) +set_module_type(notificationtest win32cui) +add_importlibs(notificationtest gdi32 user32 shlwapi msvcrt kernel32 ntdll) +add_cd_file(TARGET notificationtest DESTINATION reactos/bin FOR all)
Propchange: trunk/rostests/win32/kernel32/notificationtest/CMakeLists.txt ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rostests/win32/kernel32/notificationtest/notificationtest.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/win32/kernel32/notificatio... ============================================================================== --- trunk/rostests/win32/kernel32/notificationtest/notificationtest.c (added) +++ trunk/rostests/win32/kernel32/notificationtest/notificationtest.c [iso-8859-1] Sat Mar 29 21:12:17 2014 @@ -0,0 +1,157 @@ +/* + * FILE: notificationtest.c + * PURPOSE: Files notifications testing + * NOTES: MSDN code from: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365261%28v=vs.85%2... + */ + +#include <windows.h> +#include <stdlib.h> +#include <stdio.h> +#include <tchar.h> + +#if defined(_tsplitpath) && !defined(_tsplitpath_s) +#define _tsplitpath_s(f, d,dl, p,pl, n,nl, e,el) _tsplitpath(f, d, p, n, e) +#else +#define _wsplitpath_s(f, d,dl, p,pl, n,nl, e,el) _wsplitpath(f, d, p, n, e) +#define _splitpath_s(f, d,dl, p,pl, n,nl, e,el) _splitpath(f, d, p, n, e) +#endif + +void RefreshDirectory(LPTSTR); +void RefreshTree(LPTSTR); +void WatchDirectory(LPTSTR); + +int _tmain(int argc, TCHAR *argv[]) +{ + if(argc != 2) + { + _tprintf(TEXT("Usage: %s <dir>\n"), argv[0]); + return -1; + } + + WatchDirectory(argv[1]); + + return 0; +} + +void WatchDirectory(LPTSTR lpDir) +{ + DWORD dwWaitStatus; + HANDLE dwChangeHandles[2]; + TCHAR lpDrive[4]; + TCHAR lpFile[_MAX_FNAME]; + TCHAR lpExt[_MAX_EXT]; + + _tsplitpath_s(lpDir, lpDrive, 4, NULL, 0, lpFile, _MAX_FNAME, lpExt, _MAX_EXT); + + lpDrive[2] = (TCHAR)'\'; + lpDrive[3] = (TCHAR)'\0'; + +// Watch the directory for file creation and deletion. + + dwChangeHandles[0] = FindFirstChangeNotification( + lpDir, // directory to watch + FALSE, // do not watch subtree + FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes + + if (dwChangeHandles[0] == INVALID_HANDLE_VALUE) + { + printf("\n ERROR: FindFirstChangeNotification function failed.\n"); + ExitProcess(GetLastError()); + } + +// Watch the subtree for directory creation and deletion. + + dwChangeHandles[1] = FindFirstChangeNotification( + lpDrive, // directory to watch + TRUE, // watch the subtree + FILE_NOTIFY_CHANGE_DIR_NAME); // watch dir name changes + + if (dwChangeHandles[1] == INVALID_HANDLE_VALUE) + { + printf("\n ERROR: FindFirstChangeNotification function failed.\n"); + ExitProcess(GetLastError()); + } + + +// Make a final validation check on our handles. + + if ((dwChangeHandles[0] == NULL) || (dwChangeHandles[1] == NULL)) + { + printf("\n ERROR: Unexpected NULL from FindFirstChangeNotification.\n"); + ExitProcess(GetLastError()); + } + +// Change notification is set. Now wait on both notification +// handles and refresh accordingly. + + while (TRUE) + { + // Wait for notification. + + printf("\nWaiting for notification...\n"); + + dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles, + FALSE, INFINITE); + + switch (dwWaitStatus) + { + case WAIT_OBJECT_0: + + // A file was created, renamed, or deleted in the directory. + // Refresh this directory and restart the notification. + + RefreshDirectory(lpDir); + if ( FindNextChangeNotification(dwChangeHandles[0]) == FALSE ) + { + printf("\n ERROR: FindNextChangeNotification function failed.\n"); + ExitProcess(GetLastError()); + } + break; + + case WAIT_OBJECT_0 + 1: + + // A directory was created, renamed, or deleted. + // Refresh the tree and restart the notification. + + RefreshTree(lpDrive); + if (FindNextChangeNotification(dwChangeHandles[1]) == FALSE ) + { + printf("\n ERROR: FindNextChangeNotification function failed.\n"); + ExitProcess(GetLastError()); + } + break; + + case WAIT_TIMEOUT: + + // A timeout occurred, this would happen if some value other + // than INFINITE is used in the Wait call and no changes occur. + // In a single-threaded environment you might not want an + // INFINITE wait. + + printf("\nNo changes in the timeout period.\n"); + break; + + default: + printf("\n ERROR: Unhandled dwWaitStatus.\n"); + ExitProcess(GetLastError()); + break; + } + } +} + +void RefreshDirectory(LPTSTR lpDir) +{ + // This is where you might place code to refresh your + // directory listing, but not the subtree because it + // would not be necessary. + + _tprintf(TEXT("Directory (%s) changed.\n"), lpDir); +} + +void RefreshTree(LPTSTR lpDrive) +{ + // This is where you might place code to refresh your + // directory listing, including the subtree. + + _tprintf(TEXT("Directory tree (%s) changed.\n"), lpDrive); +}
Propchange: trunk/rostests/win32/kernel32/notificationtest/notificationtest.c ------------------------------------------------------------------------------ svn:eol-style = native