mirror of https://github.com/tongzx/nt5src
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.
270 lines
6.0 KiB
270 lines
6.0 KiB
//____________________________________________________________________________
|
|
//
|
|
// 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;
|
|
}
|
|
|
|
|