windows-nt/Source/XPSP1/NT/admin/services/sched/folderui/jfnotify.cxx
2020-09-26 16:20:57 +08:00

271 lines
6 KiB
C++

//____________________________________________________________________________
//
// 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;
}