Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//____________________________________________________________________________
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995 - 1996.
//
// File: Routines to watch the Jobs directory and handle change
// notifications.
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 2/15/1996 RaviR Created
//
//____________________________________________________________________________
#include "..\pch\headers.hxx"
#pragma hdrstop
#include "dbg.h"
#include "macros.h"
#include "jobfldr.hxx"
//#undef DEB_TRACE
//#define DEB_TRACE DEB_USER1
class CNotifyWatch;
class CNotifyWatch { public: CNotifyWatch(CJobFolder * pjf) : m_hWatch(INVALID_HANDLE_VALUE), m_pJobFolder(pjf) {}
~CNotifyWatch() { if (m_hWatch != INVALID_HANDLE_VALUE) { FindCloseChangeNotification(m_hWatch); m_hWatch = INVALID_HANDLE_VALUE; } }
HANDLE m_hWatch; // Returned from FindFirstChangeNotify.
CJobFolder * m_pJobFolder;
private: CNotifyWatch(void); };
//------------------------------------------------------------------------
// FUNCTION: NotifyWatchProc
//
//------------------------------------------------------------------------
//____________________________________________________________________________
//
// Function: NotifyWatchProc
//
// Synopsis: Watch the jobs directory and notify CJobFolder when something
// has changed.
//
// Arguments: [pNotify] -- IN
//
// Returns: DWORD
//
// History: 2/20/1996 RaviR Created
//
//____________________________________________________________________________
DWORD NotifyWatchProc( CNotifyWatch * pNotify) { TRACE_FUNCTION(NotifyWatchProc);
DWORD dwRet; BOOL bFileChange = FALSE; UINT cChanges = 0;
if (pNotify == NULL) { return((DWORD) -1); }
Sleep(7000);
while (1) { //
// Wait for the Jobs folder to change.
//
dwRet = WaitForSingleObject(pNotify->m_hWatch, 3000);
switch( dwRet ) { case WAIT_OBJECT_0: //
// We could handle the change at this point, but we might
// as well wait for a time out and do it all at once.
// Doing nothing just causes us to wait
// another 1.5 secs; i.e. reset the timeout.
//
bFileChange = TRUE;
++cChanges;
if (FindNextChangeNotification(pNotify->m_hWatch) == FALSE) { CHECK_LASTERROR(GetLastError()); }
break;
case WAIT_TIMEOUT: if (bFileChange == TRUE) { DEBUG_OUT((DEB_USER1, "Count of changes = %d\n", cChanges));
pNotify->m_pJobFolder->CheckForChanges();
bFileChange = FALSE;
cChanges = 0; }
break;
default: break; }
}
return 0; }
//____________________________________________________________________________
//
// Member: CJobFolder::CheckForChanges
//
// Synopsis: S
//
// Returns: void
//
// History: 2/20/1996 RaviR Created
//
//____________________________________________________________________________
void CJobFolder::CheckForChanges(void) { DEBUG_OUT((DEB_USER1, "CJobFolder::CheckForChanges <<--\n"));
LRESULT lr = ERROR_SUCCESS; static TCHAR s_szSearchPath[MAX_PATH] = TEXT("");
if (s_szSearchPath[0] == TEXT('\0')) { lstrcpy(s_szSearchPath, m_pszFolderPath); lstrcat(s_szSearchPath, TEXT("\\*") TSZ_DOTJOB); }
WIN32_FIND_DATA fd; HANDLE hFind = FindFirstFile(s_szSearchPath, &fd);
if (hFind == INVALID_HANDLE_VALUE) { if (GetLastError() != ERROR_FILE_NOT_FOUND) { CHECK_LASTERROR(GetLastError()); } else if (GetLastError() != ERROR_NO_MORE_FILES) { if (m_pShellView != NULL) { m_pShellView->Refresh(); } } } else { UINT cJobs = 0; BOOL fRefresh = FALSE;
while (1) { ++cJobs;
if (CompareFileTime(&fd.ftLastWriteTime, &m_ftLastChecked) > 0) { if (CompareFileTime(&fd.ftCreationTime, &m_ftLastChecked) > 0) { // this is a new job
DEBUG_OUT((DEB_USER1, "-----------------------------\n")); DEBUG_OUT((DEB_USER1, "New File <%ws>\n", fd.cFileName)); DEBUG_OUT((DEB_USER1, "-----------------------------\n")); } //
// Job file changed since last check.
//
else if (_UpdateJob(fd.cFileName) == FALSE) { fRefresh = TRUE; break; } }
//
// Get the next file.
//
if (FindNextFile(hFind, &fd) == FALSE) { if (GetLastError() != ERROR_NO_MORE_FILES) { CHECK_LASTERROR(GetLastError()); }
break; } }
FindClose(hFind);
//
// Refresh if either (fRefresh == TRUE) or
// the count of objects has changed.
//
if (fRefresh == FALSE) { ULONG ulObjCount = ShellFolderView_GetObjectCount(m_hwndOwner);
if (ulObjCount != cJobs) { fRefresh = TRUE; } }
if (fRefresh == TRUE) { if (m_pShellView != NULL) { //m_pShellView->Refresh();
} }
//
// Save the current time now that the UI is up to date.
//
SYSTEMTIME st; GetSystemTime(&st); SystemTimeToFileTime(&st, &m_ftLastChecked); }
return; }
|