/******************************************************************************

	Copyright(c) Microsoft Corporation

	Module Name:

		create.h

	Abstract:

		This module contains the macros, user defined structures & function 
		definitions needed by create.cpp , createvalidations.cpp files.

	Author:

		B.Raghu Babu  10-oct-2000 

	Revision History:

		B.Raghu Babu	 10-oct-2000 : Created it
		G.Surender Reddy 25-oct-2000 : Modified it
									   [ Added macro constants,Function 
									    definitions ]
		
******************************************************************************/ 

#ifndef __CREATE_H
#define __CREATE_H

#pragma once


// Constants declarations
#define MAX_TASKNAME_LEN	512
#define MAX_USERNAME_LEN	300
#define MAX_TIMESTR_LEN		32
#define MAX_SCHEDTYPE_LEN   32
#define MAX_DATESTR_LEN		32
#define MAX_CREATE_OPTIONS	15  // Total Number of sub-options in -create option.
#define MAX_JOB_LEN         239 //Maximum length of task name 
#define MAX_TASK_LEN		262 //Max.length of task run
#define MAX_BUF_SIZE        128 //Maximum buffer size for format message 

 
#define MINUTES_PER_HOUR    60 // Minutes per hour
#define SECS_PER_MINUTE		60 // Minutes per hour
#define HOURS_PER_DAY		24 // Minutes per hour
#define HOURS_PER_DAY_MINUS_ONE	 23 // Minutes per hour minus one
#define MAX_MONTH_STR_LEN	60 // Maximum length of months

#define MIN_YEAR		1752 // Minimum year
#define MAX_YEAR		9999 // Maximum year

#define CASE_SENSITIVE_VAL  0  // case sensitive.
#define BASE_TEN			10 // Base value for AsLong ()function.
#define MAX_DATE_STR_LEN	50  
#define MAX_TIME_STR_LEN	5  
#define MAX_ERROR_STRLEN	2056  // max string len for error messages.

#define OPTION_COUNT		1 // No of times an option can be repeated.(Max)
#define DEFAULT_MODIFIER    1 // Default value for the modifier value.
#define DEFAULT_MODIFIER_SZ    _T("1") // Default value[string] for the modifier value.


#define DATE_SEPARATOR_CHAR			_T('/') 
#define DATE_SEPARATOR_STR			_T("/") 
#define FIRST_DATESEPARATOR_POS		2 
#define SECOND_DATESEPARATOR_POS    5 
#define FOURTH_DATESEPARATOR_POS	4 
#define SEVENTH_DATESEPARATOR_POS   7 

#define SCHEDULER_NOT_RUNNING_ERROR_CODE	0x80041315
#define UNABLE_TO_ESTABLISH_ACCOUNT			0x80041310
#define RPC_SERVER_NOT_AVAILABLE			0x800706B5

#define DATESTR_LEN					10
#define MAX_TOKENS_LENGTH				60

#define TIME_SEPARATOR_CHAR    _T(':')
#define TIME_SEPARATOR_STR    _T(":") 
#define FIRST_TIMESEPARATOR_POS		2 
#define SECOND_TIMESEPARATOR_POS    5 
#define TIMESTR_LEN					8 
#define HOURSPOS_IN_TIMESTR			1 
#define MINSPOS_IN_TIMESTR			2 
#define SECSPOS_IN_TIMESTR			3 
#define EXE_LENGTH					4

#define OI_SERVER			1 // Index of -s option in cmdOptions structure.
#define OI_RUNASUSERNAME	2 // Index of -ru option in cmdOptions structure.
#define OI_RUNASPASSWORD	3 // Index of -rp option in cmdOptions structure.
#define OI_USERNAME			4 // Index of -u option in cmdOptions structure.
#define OI_PASSWORD			5 // Index of -p option in cmdOptions structure.
#define OI_SCHEDTYPE		6 // Index of -scheduletype option in cmdOptions structure.
#define OI_MODIFIER			7 // Index of -modifier option in cmdOptions structure.
#define OI_DAY				8 // Index of -day option in cmdOptions structure.
#define OI_MONTHS			9 // Index of -months option in cmdOptions structure.
#define OI_IDLETIME			10 // Index of -idletime option in cmdOptions structure.
#define OI_TASKNAME			11 // Index of -taskname option in cmdOptions structure.
#define OI_TASKRUN			12 // Index of -taskrun option in cmdOptions structure.
#define OI_STARTTIME		13 // Index of -starttime option in cmdOptions structure.
#define OI_STARTDATE		14 // Index of -startdate option in cmdOptions structure.
#define OI_ENDDATE			15 // Index of -enddate option in cmdOptions structure.
#define OI_USAGE			16 // Index of -? option in cmdOptions structure.

#define OI_RUNANDUSER		6

// Schedule Types
#define SCHED_TYPE_MINUTE	1
#define SCHED_TYPE_HOURLY	2
#define SCHED_TYPE_DAILY	3
#define SCHED_TYPE_WEEKLY	4
#define SCHED_TYPE_MONTHLY	5
#define SCHED_TYPE_ONETIME	6
#define SCHED_TYPE_ONSTART	7
#define SCHED_TYPE_ONLOGON	8
#define SCHED_TYPE_ONIDLE	9

// Months Indices.
#define IND_JAN			1  // January
#define IND_FEB			2  // February
#define IND_MAR			3  // March
#define IND_APR			4  // April
#define IND_MAY			5  // May
#define IND_JUN			6  // June
#define IND_JUL			7  // July
#define IND_AUG			8  // August
#define IND_SEP			9  // September
#define IND_OCT			10 // October
#define IND_NOV			11 // November
#define IND_DEC			12 // December


// Return Values
#define RETVAL_SUCCESS		0
#define RETVAL_FAIL			1

typedef struct __tagCreateSubOps
{
	TCHAR   szServer [ _MAX_PATH ];				// Server Name
	TCHAR	szRunAsUser [ MAX_STRING_LENGTH ] ;		//Run As User Name
	TCHAR	szRunAsPassword [ MAX_STRING_LENGTH ];		// Run As Password
	TCHAR	szUser [ MAX_STRING_LENGTH ] ;		// User Name
	TCHAR	szPassword [ MAX_STRING_LENGTH ];		// Password
	TCHAR	szSchedType [ MAX_TASKNAME_LEN ];	// Schedule Type  
	TCHAR	szModifier [ MAX_SCHEDTYPE_LEN ];	// Modifier Value
	TCHAR	szDays [ MAX_DATE_STR_LEN ];			// Days			  
	TCHAR	szMonths [ MAX_DATE_STR_LEN];		// Months		  
	TCHAR	szIdleTime [ MAX_TIMESTR_LEN];		// Idle Time	  
	TCHAR	szTaskName [ MAX_TASKNAME_LEN];		// Task Name	  
	TCHAR	szStartTime [ MAX_STRING_LENGTH ];		// Task start time  
	TCHAR	szStartDate [ MAX_STRING_LENGTH];		// Task start date
	TCHAR	szEndDate [ MAX_STRING_LENGTH ];		// End Date of the Task
	TCHAR	szTaskRun [ _MAX_PATH ];				// executable name of task
	DWORD	bCreate; // Create option
	DWORD	bUsage;	 // Usage option.
			
} TCREATESUBOPTS;


typedef struct __tagCreateOpsVals
{
	BOOL	bSetStartDateToCurDate;	// Is start date to be set to current date 
	BOOL	bSetStartTimeToCurTime;	// Is start date to be set to current date 
	BOOL	bPassword;
	BOOL	bRunAsPassword;
			
} TCREATEOPVALS;


DWORD DisplayCreateUsage();
HRESULT CreateTask(TCREATESUBOPTS tcresubops, TCREATEOPVALS &tcreoptvals, 
						DWORD dwScheduleType, WORD wUserStatus);
DWORD ProcessCreateOptions(DWORD argc, LPCTSTR argv[],TCREATESUBOPTS &tcresubops,
			TCREATEOPVALS &tcreoptvals, DWORD* pdwRetScheType, WORD *pwUserStatus);
DWORD ValidateSuboptVal(TCREATESUBOPTS& tcresubops, TCREATEOPVALS &tcreoptvals,
						TCMDPARSER cmdOptions[], DWORD dwScheduleType);
DWORD ValidateRemoteSysInfo(LPTSTR szServer, LPTSTR szUser, LPTSTR szPassword, 
			TCMDPARSER cmdOptions[] , TCREATESUBOPTS& tcresubops, TCREATEOPVALS &tcreoptvals);
DWORD ValidateModifierVal(LPCTSTR szModifier, DWORD dwScheduleType,
						  DWORD dwModOptActCnt, DWORD dwDayOptCnt, 
						  DWORD dwMonOptCnt, BOOL &bIsDefltValMod);
DWORD ValidateDayAndMonth(LPTSTR szDay, LPTSTR szMonths, DWORD dwSchedType, 
	DWORD dwDayOptCnt, DWORD dwMonOptCnt, DWORD dwModifier,LPTSTR szModifier);
DWORD ValidateStartDate(LPTSTR szStartDate, DWORD dwSchedType, DWORD dwStDtOptCnt,
						BOOL &bIsCurrentDate);
DWORD ValidateEndDate(LPTSTR szEndDate, DWORD dwSchedType, DWORD dwEndDtOptCnt);
DWORD ValidateStartTime(LPTSTR szStartTime, DWORD dwSchedType, DWORD dwStTimeOptCnt,
						BOOL &bIsCurrentTime);
DWORD ValidateIdleTimeVal(LPTSTR szIdleTime, DWORD dwSchedType, 
						  DWORD dwIdlTimeOptCnt);
DWORD ValidateDateString(LPTSTR szDate);
DWORD ValidateTimeString(LPTSTR szTime);
DWORD GetDateFieldEntities(LPTSTR szDate, WORD* pdwDate, WORD* pdwMon,
						   WORD* pdwYear);
DWORD ValidateDateFields( DWORD dwDate, DWORD dwMon, DWORD dwyear);
DWORD GetTimeFieldEntities(LPTSTR szTime, WORD* pdwHours, WORD* pdwMins,
						   WORD* pdwSecs);
DWORD ValidateTimeFields( DWORD dwHours, DWORD dwMins, DWORD dwSecs);
WORD GetTaskTrigwDayForDay(LPTSTR szDay);
WORD GetTaskTrigwMonthForMonth(LPTSTR szMonth);
DWORD ValidateMonth(LPTSTR szMonths);
DWORD ValidateDay(LPTSTR szDays);
WORD GetMonthId(DWORD dwMonthId);
DWORD GetNumDaysInaMonth(TCHAR* szMonths, WORD wStartYear);
BOOL VerifyJobName(_TCHAR* pszJobName);
DWORD GetDateFieldFormat(WORD* pdwDate);
DWORD GetDateFormatString(LPTSTR szFormat);
DWORD ProcessFilePath(LPTSTR szInput,LPTSTR szFirstString,LPTSTR szSecondString);


#endif // __CREATE_H