Leaked source code of windows server 2003
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.
 
 
 
 
 
 

253 lines
7.2 KiB

//+----------------------------------------------------------------------------
//
// 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 + 1];
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 PopDir(LPTSTR ptszDir, size_t cchBuff);
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 + 1]; // 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
//
// 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);
// non COM-based Enum function. (uses thread token for access check rather thann CoGetCallContext)
STDMETHOD(EnumInternal)(IEnumWorkItems ** ppEnumWorkItems);
// 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);
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[],
size_t cchBuff,
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_