252 lines
6.9 KiB
C++
252 lines
6.9 KiB
C++
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Job Scheduler Service
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1996.
|
||
|
//
|
||
|
// File: sch_cls.hxx
|
||
|
//
|
||
|
// Contents: job scheduler service classes header
|
||
|
//
|
||
|
// Classes: CSchedule, CScheduleCF, CEnumJobs
|
||
|
//
|
||
|
// History: 20-Sep-95 EricB created
|
||
|
//
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
#ifndef _SCH_CLS_HXX_
|
||
|
#define _SCH_CLS_HXX_
|
||
|
|
||
|
#include "dll.hxx"
|
||
|
#include "job_cls.hxx"
|
||
|
#include <mstask.h>
|
||
|
#include "common.hxx"
|
||
|
|
||
|
// constants
|
||
|
|
||
|
const TCHAR SCH_NEXTATJOBID_VALUE[] = TEXT("NextAtJobId");
|
||
|
const TCHAR SCH_ATTASKMAXHOURS_VALUE[] = TEXT("AtTaskMaxHours");
|
||
|
|
||
|
#define DEFAULT_MAXRUNTIME_HOURS 72
|
||
|
|
||
|
struct DIRSTACK
|
||
|
{
|
||
|
DIRSTACK(void) : pdsNext(NULL) {};
|
||
|
TCHAR tszDir[MAX_PATH];
|
||
|
struct DIRSTACK * pdsNext;
|
||
|
};
|
||
|
|
||
|
typedef struct DIRSTACK * PDIRSTACK;
|
||
|
|
||
|
//
|
||
|
// Helper functions
|
||
|
//
|
||
|
|
||
|
void
|
||
|
GetNextAtID(LPDWORD pdwAtID);
|
||
|
|
||
|
VOID
|
||
|
CalcDomTriggerDates(
|
||
|
DWORD dwDaysOfMonth,
|
||
|
const SYSTEMTIME &stNow,
|
||
|
const SYSTEMTIME &stStart,
|
||
|
SYSTEMTIME *pstStart1,
|
||
|
SYSTEMTIME *pstEnd1,
|
||
|
SYSTEMTIME *pstStart2,
|
||
|
SYSTEMTIME *pstEnd2);
|
||
|
|
||
|
VOID
|
||
|
CalcDowTriggerDate(
|
||
|
const SYSTEMTIME &stNow,
|
||
|
const SYSTEMTIME &stStart,
|
||
|
SYSTEMTIME *pstDowStart,
|
||
|
SYSTEMTIME *pstDowEnd);
|
||
|
|
||
|
|
||
|
// classes
|
||
|
|
||
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CEnumJobs
|
||
|
//
|
||
|
// Purpose: OLE job enumerator object class
|
||
|
//
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CEnumJobs : public IEnumWorkItems
|
||
|
{
|
||
|
public:
|
||
|
CEnumJobs();
|
||
|
~CEnumJobs();
|
||
|
|
||
|
// IUnknown methods
|
||
|
STDMETHOD(QueryInterface)(REFIID riid, void ** ppvObject);
|
||
|
STDMETHOD_(ULONG, AddRef)(void);
|
||
|
STDMETHOD_(ULONG, Release)(void);
|
||
|
|
||
|
// IEnumJobs methods
|
||
|
STDMETHOD(Next)(ULONG cJobs, LPWSTR ** rgpwszNames,
|
||
|
ULONG * pcNamesFetched);
|
||
|
STDMETHOD(Skip)(ULONG cJobs);
|
||
|
STDMETHOD(Reset)(void);
|
||
|
STDMETHOD(Clone)(IEnumWorkItems ** ppEnumJobs);
|
||
|
|
||
|
HRESULT Init(TCHAR * ptszFolderPath);
|
||
|
|
||
|
private:
|
||
|
HRESULT PushDir(LPCTSTR ptszDir);
|
||
|
HRESULT PopDir(LPTSTR ptszDir);
|
||
|
void ClearDirStack(void);
|
||
|
HRESULT CheckFound(LPWIN32_FIND_DATA pFindData);
|
||
|
HRESULT GetNext(LPTSTR * pptszName);
|
||
|
|
||
|
HANDLE m_hFind;
|
||
|
PDIRSTACK m_pdsHead;
|
||
|
TCHAR * m_ptszFolderPath;
|
||
|
TCHAR m_tszCurDir[MAX_PATH]; // current relative dir path
|
||
|
TCHAR m_tszJobExt[SCH_SMBUF_LEN];
|
||
|
// TCHAR m_tszQueExt[SCH_SMBUF_LEN];
|
||
|
ULONG m_cFound;
|
||
|
BOOL m_fInitialized;
|
||
|
BOOL m_fFindOverrun;
|
||
|
unsigned long m_uRefs;
|
||
|
CDllRef m_DllRef;
|
||
|
};
|
||
|
|
||
|
class CScheduleCF;
|
||
|
class CSchedWorker;
|
||
|
|
||
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CSchedule
|
||
|
//
|
||
|
// Purpose: schedule service object class
|
||
|
//
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CSchedule : public ITaskScheduler
|
||
|
{
|
||
|
public:
|
||
|
friend CScheduleCF;
|
||
|
friend CSchedWorker;
|
||
|
|
||
|
CSchedule();
|
||
|
~CSchedule();
|
||
|
|
||
|
//
|
||
|
// IUnknown methods
|
||
|
//
|
||
|
STDMETHOD(QueryInterface)(REFIID riid, void ** ppvObject);
|
||
|
STDMETHOD_(ULONG, AddRef)(void);
|
||
|
STDMETHOD_(ULONG, Release)(void);
|
||
|
|
||
|
//
|
||
|
// ITaskScheduler methods
|
||
|
//
|
||
|
STDMETHOD(SetTargetComputer)(LPCWSTR pwszComputer);
|
||
|
STDMETHOD(GetTargetComputer)(LPWSTR * ppwszComputer);
|
||
|
|
||
|
STDMETHOD(Enum)(IEnumWorkItems ** ppEnumWorkItems);
|
||
|
|
||
|
STDMETHOD(Activate)(LPCWSTR pwszName, REFIID riid, IUnknown ** ppunk);
|
||
|
|
||
|
STDMETHOD(Delete)(LPCWSTR pwszName);
|
||
|
|
||
|
STDMETHOD(NewWorkItem)(LPCWSTR pwszJobName, REFCLSID rclsid,
|
||
|
REFIID riid, IUnknown ** ppunk);
|
||
|
|
||
|
STDMETHOD(AddWorkItem)(LPCWSTR pwszWorkItemName,
|
||
|
IScheduledWorkItem * pWorkItem);
|
||
|
|
||
|
STDMETHOD(IsOfType)(LPCWSTR pwszName, REFIID riid);
|
||
|
|
||
|
//
|
||
|
// CSchedule methods
|
||
|
//
|
||
|
#if !defined(_CHICAGO_) // these are not needed for Chicago version
|
||
|
|
||
|
// Client-side API for adding AT jobs (used by mstinit.exe
|
||
|
// to create AT jobs from info in the registry)
|
||
|
STDMETHOD(AddAtJob)(const AT_INFO &At, DWORD * pID);
|
||
|
|
||
|
// Server-side API for adding AT jobs (used by mstask.exe
|
||
|
// for NetJobAdd calls)
|
||
|
STDMETHOD(AddAtJobWithHash)(const AT_INFO &At, DWORD * pID);
|
||
|
|
||
|
STDMETHOD(GetAtJob)(LPCWSTR pwszFileName, AT_INFO * pAt,
|
||
|
LPWSTR pwszCommand, DWORD * pcchCommand);
|
||
|
|
||
|
HRESULT IncrementAndSaveID(void);
|
||
|
|
||
|
HRESULT InitAtID(void);
|
||
|
|
||
|
HRESULT ResetAtID(void);
|
||
|
|
||
|
#endif // #if !defined(_CHICAGO_)
|
||
|
|
||
|
const TCHAR * GetFolderPath(void) {return m_ptszFolderPath;}
|
||
|
const TCHAR * GetTargetMachine(void) { return m_ptszTargetMachine; }
|
||
|
HRESULT Init(void);
|
||
|
HRESULT ActivateJob(LPCTSTR pwszName, CJob ** ppJob,
|
||
|
BOOL fAllData);
|
||
|
|
||
|
private:
|
||
|
|
||
|
//HRESULT ActivateQueue(LPCWSTR pwszName, CQueue ** ppQueue);
|
||
|
//void IsJobOrQueue(LPCWSTR pwszName, LPBOOL pfJob,
|
||
|
// LPBOOL pfQueue);
|
||
|
HRESULT CheckJobName(LPCWSTR pwszPath,
|
||
|
LPTSTR * pptszFullPathName);
|
||
|
HRESULT _AtTaskExists();
|
||
|
|
||
|
HRESULT AddAtJobCommon(const AT_INFO &At,
|
||
|
DWORD *pID,
|
||
|
CJob **ppJob,
|
||
|
WCHAR wszName[],
|
||
|
WCHAR wszID[]);
|
||
|
HRESULT GetAtTaskMaxHours(DWORD* pdwMaxHours);
|
||
|
|
||
|
CRITICAL_SECTION m_CriticalSection;
|
||
|
DWORD m_dwNextID;
|
||
|
TCHAR * m_ptszTargetMachine;
|
||
|
TCHAR * m_ptszFolderPath;
|
||
|
unsigned long m_uRefs;
|
||
|
CDllRef m_DllRef;
|
||
|
};
|
||
|
|
||
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CScheduleCF
|
||
|
//
|
||
|
// Purpose: schedule service object class factory
|
||
|
//
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CScheduleCF : public IClassFactory
|
||
|
{
|
||
|
public:
|
||
|
CScheduleCF();
|
||
|
~CScheduleCF();
|
||
|
|
||
|
// IUnknown methods
|
||
|
STDMETHOD(QueryInterface)(REFIID riid, void ** ppvObject);
|
||
|
STDMETHOD_(ULONG, AddRef)();
|
||
|
STDMETHOD_(ULONG, Release)();
|
||
|
|
||
|
// IClassFactory methods
|
||
|
STDMETHOD(CreateInstance)(IUnknown * pUnkOuter,
|
||
|
REFIID riid,
|
||
|
void ** ppvObject);
|
||
|
STDMETHOD(LockServer)(BOOL fLock);
|
||
|
|
||
|
static IClassFactory * Create(void);
|
||
|
|
||
|
private:
|
||
|
|
||
|
unsigned long m_uRefs;
|
||
|
CDllRef m_DllRef;
|
||
|
};
|
||
|
|
||
|
// global definitions
|
||
|
extern CScheduleCF g_ScheduleCF;
|
||
|
|
||
|
#endif // _SCH_CLS_HXX_
|