425 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			425 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| //-----------------------------------------------------------------------------
 | |
| // ---------------------------
 | |
| // File ....: maxnet_manager.h
 | |
| // ---------------------------
 | |
| // Author...: Gus J Grubba
 | |
| // Date ....: February 2000
 | |
| // O.S. ....: Windows 2000
 | |
| //
 | |
| // History .: Feb, 15 2000 - Created
 | |
| //
 | |
| // 3D Studio Max Network Rendering Classes
 | |
| // 
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| #ifndef _MAXNET_MANAGER_H_
 | |
| #define _MAXNET_MANAGER_H_
 | |
| 
 | |
| //---------------------------------------------------------
 | |
| //-- Directories and Files
 | |
| 
 | |
| #define MAXEXE			_T("3dsmax.exe")
 | |
| #define COMBEXE			_T("combustionQueue.exe")
 | |
| 
 | |
| #ifdef DESIGN_VER
 | |
| #define VIZEXE			_T("3dsviz.exe")
 | |
| #endif
 | |
| #define SRVTOCOMB		_T("ToCombustion.txt")
 | |
| #define SRVTOMAX		_T("ToMax.txt")
 | |
| #define APPTOSRV		_T("ToServer.txt")
 | |
| #define MAXNETINI		_T("maxnet.ini")
 | |
| #define MGRHST			_T("hosts.ini")
 | |
| #define JOBSTATEFILE	_T("jobs.ini")
 | |
| #define NETDIR			_T("Network")
 | |
| #define REGDIR			_T("Servers")
 | |
| #define JOBDIR			_T("Jobs")
 | |
| #define SRVWORKDIR		_T("ServerJob")
 | |
| #define MAXEXTENSION	_T(".max")
 | |
| #define COMBEXTENSION	_T(".cws")
 | |
| #define JOBDESCRP		_T("Job.txt")
 | |
| #ifndef DESIGN_VER
 | |
| #define MAXLOG			_T("Max.log")
 | |
| #else
 | |
| #define MAXLOG			_T("Viz.log")
 | |
| #endif
 | |
| #define _JOB_DIR_FORMAT_ "%s%08X %s%s"
 | |
| 
 | |
| 
 | |
| #define MGRSERVICENAME	TEXT("Max4Manager")
 | |
| #define SRVSERVICENAME	TEXT("Max4Server")
 | |
| 
 | |
| #define INIT_CFG_CMD_LINE	"INITCONFIG"
 | |
| 
 | |
| //---------------------------------------------------------
 | |
| //-- Special Types
 | |
| 
 | |
| typedef struct tag_HSERVER {
 | |
| 	BYTE addr[8];
 | |
| } HSERVER;
 | |
| 
 | |
| #define HBSERVER	(BYTE *)(void *) 
 | |
| 
 | |
| //---------------------------------------------------------
 | |
| //-- Server Work Schedule
 | |
| 
 | |
| #define HIGHPRIORITY		0
 | |
| #define LOWPRIORITY 		1
 | |
| #define IDLEPRIORITY		2
 | |
| 
 | |
| typedef struct tag_Schedule {
 | |
| 	DWORD hour;						//-- Bitmap (24 bits = 24 hours of the day)
 | |
| } Schedule;							//   0 Allowed to work - 1 Not Allowed
 | |
| 
 | |
| typedef struct tag_WeekSchedule {
 | |
| 	Schedule	day[7];
 | |
| 	int			AttendedPriority;
 | |
| 	int			UnattendedPriority;
 | |
| } WeekSchedule;
 | |
| 
 | |
| //---------------------------------------------------------
 | |
| //-- Time Helpers (All times are kept in ms)
 | |
| 
 | |
| #define _MAX_SECONDS			1000
 | |
| #define _MAX_MINUTES			60 * _MAX_SECONDS
 | |
| #define _MAX_HOURS				_MAX_MINUTES * 60	
 | |
| 
 | |
| //---------------------------------------------------------
 | |
| //-- 3DS Network Rendering Defaults
 | |
| 
 | |
| //-- General
 | |
| 
 | |
| #define DF_SRVPORT				3333					//-- Server Port
 | |
| #define DF_MGRPORT				3334					//-- Manager Port
 | |
| #define DF_READCHUNK			128000					//-- Max Block Size
 | |
| #define DF_NETMASK				0xFFFFFF00				//-- Network Mask
 | |
| 
 | |
| //-- Manager
 | |
| 
 | |
| #define DF_MAXCONASSIGN			4						//-- How many jobs can manager assign concurrently
 | |
| #define DF_RETRYFAILED			1						//-- Should we retry failed servers?
 | |
| #define DF_RESTARTLIMIT			3						//-- How many times to retry a failed server
 | |
| #define DF_TIMEBETWEENRETRY		30 * _MAX_SECONDS		//-- Time to Wait between retries
 | |
| #define DF_MAXLOADTIMEOUT		12 * _MAX_MINUTES		//-- Time to wait for MAX to load
 | |
| #define DF_MAXUNLOADTIMEOUT		30 * _MAX_SECONDS		//-- Time to wait for MAX to unload
 | |
| #define DF_MAXRENDERTIMEOUT		601 * _MAX_MINUTES		//-- Time to wait for MAX to render
 | |
| #define DF_SERVERCOOLOFF		30 * _MAX_SECONDS		//-- When a server fails a frame, it goes into a cool off period
 | |
| 
 | |
| //-- Server
 | |
| 
 | |
| #define DF_AUTOSEARCH			1						//-- Automatically searches for a manager
 | |
| #define DF_MAXMANAGER			"maxmanager"			//-- Default manager name for direct connect (i.e. if above is 0)
 | |
| #define DF_SRVMAXLOADTIMEOUT	10 * _MAX_MINUTES		//-- Time to wait for MAX to load (Server Side)
 | |
| #define DF_SRVMAXRENDERTIMEOUT	10 * _MAX_HOURS			//-- Time to wait for MAX to render (Server Side)
 | |
| #define DF_SRVMAXUNLOADTIMEOUT	20 * _MAX_SECONDS		//-- Time to wait for MAX to unload (Server Side)
 | |
| 
 | |
| //-- Timers
 | |
| 
 | |
| #define DF_ACK_RETRIES			6						//-- How many times to try a silent response
 | |
| #define DF_ACK_TIMEOUT			20 * _MAX_SECONDS		//-- Time between pings
 | |
| #define DF_ACK_FAST_TIMEOUT		4 * _MAX_SECONDS		//-- Time between pings after one is missed
 | |
| 
 | |
| //-- Log
 | |
| 
 | |
| #define DF_LOGDEBUG_FILE		0
 | |
| #define DF_LOGDEBUG_SCREEN		0
 | |
| #define DF_LOGDEBUGEX_FILE		0
 | |
| #define DF_LOGDEBUGEX_SCREEN	0
 | |
| #define DF_LOGERROR_FILE		1
 | |
| #define DF_LOGERROR_SCREEN		1
 | |
| #define DF_LOGINFO_FILE			0
 | |
| #define DF_LOGINFO_SCREEN		1
 | |
| #define DF_LOGWARNING_FILE		0
 | |
| #define DF_LOGWARNING_SCREEN	1
 | |
| #define DF_MAX_SCREEN_LINES		1024
 | |
| 
 | |
| //---------------------------------------------------------
 | |
| //-- Log Flags
 | |
| 
 | |
| #define MAXLOG_ERR				(1<<0)
 | |
| #define MAXLOG_WARN				(1<<1)
 | |
| #define MAXLOG_INFO				(1<<2)
 | |
| #define MAXLOG_DEBUG			(1<<3)
 | |
| #define MAXLOG_DEBUGEX			(1<<4)
 | |
| #define MAXLOG_PGRS				(1<<5)
 | |
| #define MAXLOG_INIT				(1<<6)
 | |
| #define MAXLOG_START_SESSION	(1<<7)
 | |
| #define MAXLOG_END_SESSION		(1<<8)
 | |
| 
 | |
| #define LOG_INFO_TXT     _T("INF")
 | |
| #define LOG_ERROR_TXT    _T("ERR")
 | |
| #define LOG_DEBUG_TXT    _T("DBG")
 | |
| #define LOG_DEBUGX_TXT   _T("DBX")
 | |
| #define LOG_PROGRESS_TXT _T("PRG")
 | |
| #define LOG_INIT_TXT     _T("INI")
 | |
| 
 | |
| //---------------------------------------------------------
 | |
| //-- Network Status
 | |
| //
 | |
| 
 | |
| typedef struct tag_NetworkStatus {
 | |
| 	DWORD		dropped_packets;		//-- Packets dropped due to buffer overflow
 | |
| 	DWORD		bad_packets;			//-- Bad formed packets
 | |
| 	DWORD		tcprequests;			//-- Total number of TCP requests (since boot)
 | |
| 	DWORD		udprequests;			//-- Total number of UDP requests (since boot)
 | |
| 	SYSTEMTIME	boot_time;
 | |
| 	char		reserved[32];
 | |
| } NetworkStatus;
 | |
| 
 | |
| //---------------------------------------------------------
 | |
| //-- Station Configuration Block
 | |
| //
 | |
| 
 | |
| typedef struct tag_ConfigurationBlock {
 | |
| 	DWORD	dwTotalPhys;			//-- GlobalMemoryStatus();
 | |
| 	DWORD	dwNumberOfProcessors;	//-- GetSystemInfo();
 | |
| 	DWORD	dwMajorVersion;			//-- GetVersionEx();	
 | |
| 	DWORD	dwMinorVersion;			//-- GetVersionEx();
 | |
| 	DWORD	dwBuildNumber;			//-- GetVersionEx();
 | |
| 	DWORD	dwPlatformId;			//-- GetVersionEx();
 | |
| 	TCHAR	szCSDVersion[128];		//-- GetVersionEx();
 | |
| 	char	user[MAX_PATH];			//-- GetUserName();
 | |
| 	char	tempdir[MAX_PATH];		//-- ExpandEnvironmentStrings()
 | |
| 	char	name[MAX_PATH];			//-- GetComputerName()
 | |
| 	char	workDisk;				//-- Disk used for Server files (incomming jobs, etc. A = 0, B = 1, etc)
 | |
| 	DWORD	disks;					//-- Available disks (bitmap A=0x1, B=0x2, C=0x4, etc)
 | |
| 	DWORD	diskSpace[26];			//-- Space available on disks in MegaBytes (A=diskSpace[0], B=diskSpace[1], etc.)
 | |
| 	BYTE	mac[8];					//-- Computer NIC address (00:00:00:00:00:00) 6 bytes + 2 padding
 | |
| 	char	reserved[32];			//-- Space to grow
 | |
| } ConfigurationBlock;
 | |
| 
 | |
| //---------------------------------------------------------
 | |
| //-- Manager Info
 | |
| //
 | |
| 
 | |
| #define _MANAGER_INFO_VERSION 400
 | |
| 
 | |
| typedef struct tag_ManagerInfo {
 | |
| 	DWORD				size;			//-- Structure Size ( size = sizeof(ManagerInfo) )
 | |
| 	DWORD				version;
 | |
| 	ConfigurationBlock	cfg;
 | |
| 	NetworkStatus		net_status;
 | |
| 	int			  		servers;		//-- Number of registered servers
 | |
| 	int			  		jobs;			//-- Number of jobs
 | |
| 	char				reserved[32];	//-- Space to grow
 | |
| } ManagerInfo;
 | |
| 
 | |
| //---------------------------------------------------------
 | |
| //-- Server Info
 | |
| //
 | |
| 
 | |
| #define _SERVER_INFO_VERSION 400
 | |
| 
 | |
| typedef struct tag_ServerInfo {
 | |
| 	DWORD				size;			//-- Structure Size ( size = sizeof(ServerInfo) )
 | |
| 	DWORD				version;		
 | |
| 	DWORD				total_frames;	//-- Total number of frames rendered
 | |
| 	float				total_time;		//-- Total time spent rendering (in hours)
 | |
| 	float				index;			//-- Performance index
 | |
| 	ConfigurationBlock	cfg;
 | |
| 	NetworkStatus		net_status;
 | |
| 	char				reserved[32];	//-- Space to grow
 | |
| } ServerInfo;
 | |
| 
 | |
| //---------------------------------------------------------
 | |
| //-- Client Info
 | |
| //
 | |
| 
 | |
| #define _CLIENT_INFO_VERSION 400
 | |
| 
 | |
| typedef struct tag_ClientInfo {
 | |
| 	DWORD				size;			//-- Structure Size ( size = sizeof(ClientInfo) )
 | |
| 	DWORD				version;
 | |
| 	ConfigurationBlock	cfg;
 | |
| 	bool				controller;
 | |
| 	short		  		udp_port;
 | |
| 	char				reserved[32];	//-- Space to grow
 | |
| } ClientInfo;
 | |
| 
 | |
| //-------------------------------------------------------------------
 | |
| //-- Global Server State
 | |
| //
 | |
| 
 | |
| #define SERVER_STATE_ABSENT    0
 | |
| #define SERVER_STATE_IDLE      1
 | |
| #define SERVER_STATE_BUSY      2
 | |
| #define SERVER_STATE_ERROR     3
 | |
| #define SERVER_STATE_SUSPENDED 4
 | |
| 
 | |
| typedef struct tag_ServerList {
 | |
| 	HSERVER		hServer;
 | |
| 	WORD		state;
 | |
| 	ServerInfo	info;
 | |
| 	//-- Current Task
 | |
| 	HJOB  		hJob;			//-- It will be 0 if no current task is defined
 | |
| 	int			frame;			//-- It will be NO_FRAME if loading job (no frames yet assigned)
 | |
| 	SYSTEMTIME	frame_started;	//-- Time frame was assigned
 | |
| } ServerList;
 | |
| 
 | |
| //---------------------------------------------------------
 | |
| //-- Server Statistics
 | |
| //
 | |
| 
 | |
| typedef struct tag_Statistics {
 | |
| 	float		tseconds;
 | |
| 	int			frames;
 | |
| } Statistics;
 | |
| 
 | |
| //-------------------------------------------------------------------
 | |
| //-- Servers in Job Queue -------------------------------------------
 | |
| //
 | |
| //   Server Information for a given Job
 | |
| 
 | |
| #define JOB_SRV_IDLE		0		//-- Idle
 | |
| #define JOB_SRV_BUSY		1		//-- Busy
 | |
| #define JOB_SRV_FAILED		2		//-- Render Error
 | |
| #define JOB_SRV_ABSENT		3		//-- Absent
 | |
| #define JOB_SRV_SUSPENDED	4		//-- Out of work schedule
 | |
| #define JOB_SRV_BUSYOTHER	5		//-- Busy with another job
 | |
| #define JOB_SRV_ERROR		6		//-- Connection Error
 | |
| #define JOB_SRV_COOL_OFF	7		//-- In Error Recovery
 | |
| 
 | |
| typedef struct tagJobServer {
 | |
| 	HSERVER		hServer;			//-- Server Handle
 | |
| 	char	  	status;				//-- JOB_SRV_XXX Status Above
 | |
| 	bool		failed;				//-- Internal Use
 | |
| 	bool		active;				//-- This server is active in the job
 | |
| 	int			cur_frame;			//-- Current Rendering Frame
 | |
| 	float		thours;				//-- Total Hours spent rendering
 | |
| 	int			frames;				//-- Total Number of Frames Rendered
 | |
| } JobServer;
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| //-- Job Frame State
 | |
| 
 | |
| #define NO_FRAME				0x0FFFFFFF
 | |
| 
 | |
| #define FRAME_WAITING   		0
 | |
| #define FRAME_ASSIGNED  		1
 | |
| #define FRAME_COMPLETE  		2
 | |
| 
 | |
| typedef struct tagJobFrames {
 | |
| 	char	state;				//-- FRAME_XXX above
 | |
| 	int		frame;				//-- Frame Number
 | |
| 	HSERVER	hServer;			//-- The server rendering this frame
 | |
| 	DWORD	elapsed;			//-- Time it took to render this frame (milliseconds)
 | |
| } JOBFRAMES;
 | |
| 
 | |
| //-------------------------------------------------------------------
 | |
| //-- Global Server State
 | |
| //
 | |
| 
 | |
| #define JOB_STATE_COMPLETE	0
 | |
| #define JOB_STATE_WAITING	1
 | |
| #define JOB_STATE_BUSY		2
 | |
| #define JOB_STATE_ERROR		3
 | |
| #define JOB_STATE_SUSPENDED	4
 | |
| 
 | |
| typedef struct tag_JobList {
 | |
| 	Job			job;
 | |
| 	HJOB		hJob;
 | |
| 	WORD		state;
 | |
| } JobList;
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| //-- MaxNetCallBack
 | |
| //
 | |
| //	Note: Return as soon as possible from these calls. They block the API thread
 | |
| //  and nothing will happen until you return. If you have to do some processing,
 | |
| //  post a message to your own code and return immediately. Also note that these
 | |
| //  calls may come from a separate thread than your main process thread. 
 | |
| //
 | |
| 
 | |
| class MAXNETEXPORT MaxNetCallBack {
 | |
| 	public:
 | |
| 		//-- Return "true" to cancel, "false" to continue
 | |
| 		virtual bool Progress		(int total, int current){return false;}
 | |
| 		virtual void ProgressMsg	(const TCHAR *message){;}
 | |
| 		//-- Notifies the Manager Went Down
 | |
| 		virtual void ManagerDown	( ){;}
 | |
| 		//-- Notifies something has changed (new job, new server, new frame, etc.)
 | |
| 		virtual void Update			( ){;}
 | |
| 		//-- Notifies someone wants control of the queue; Send grant control msg to manager;
 | |
| 		virtual void QueryControl	( TCHAR* station ){;}
 | |
| 		//-- Notifies someone has taken control of the queue (Another QueueManager for instance)
 | |
| 		virtual void QueueControl	( ){;}
 | |
| };
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| //-- Manager Session Class
 | |
| //
 | |
| 
 | |
| class MAXNETEXPORT MaxNetManager : public MaxNet {
 | |
| 
 | |
| 	public:
 | |
| 
 | |
| 		//-- Optional Call Back
 | |
| 		
 | |
| 		virtual void	SetCallBack				( MaxNetCallBack* cb )=0;
 | |
| 
 | |
| 		//-- Session
 | |
| 
 | |
| 		virtual bool	FindManager				( short port, char* manager, char* netmask = "255.255.255.0" )=0;
 | |
| 		virtual void	Connect					( short port, char* manager = NULL, bool enable_callback = false )=0;
 | |
| 		virtual void	Disconnect				( )=0;
 | |
| 		virtual void	GetManagerInfo			( ManagerInfo* info )=0;
 | |
| 		virtual bool	KillManager				( )=0;
 | |
| 		virtual void	EnableUpdate			( bool enable = true )=0;
 | |
| 		
 | |
| 		virtual bool	QueryManagerControl		( bool wait )=0;
 | |
| 		virtual bool	TakeManagerControl		( )=0;
 | |
| 		virtual void	GrantManagerControl		( bool grant )=0;
 | |
| 		virtual bool	LockControl				( bool lock  )=0;
 | |
| 		virtual int		GetClientCount			( )=0;
 | |
| 		virtual int		ListClients				( int start, int end, ClientInfo* clientList )=0;
 | |
| 
 | |
| 		//-- Jobs
 | |
| 		
 | |
| 		virtual int		GetJobCount				( )=0;
 | |
| 		virtual int		ListJobs				( int start, int end, JobList* jobList )=0;
 | |
| 		virtual void	GetJob					( HJOB hJob, JobList* jobList )=0;
 | |
| 		virtual void	GetJob					( HJOB hJob, Job* job )=0;
 | |
| 		virtual void	GetJobText				( HJOB hJob, CJobText& jobText, int count )=0;
 | |
| 		virtual void	SetJob					( HJOB hJob, Job* job, CJobText& jobText, bool reset )=0;
 | |
| 		virtual int		GetJobPriority			( HJOB hJob )=0;
 | |
| 		virtual bool	SetJobPriority			( HJOB hJob, int priority )=0;
 | |
| 		virtual void	SetJobOrder				( HJOB* hJob, DWORD count )=0;
 | |
| 		virtual void	DeleteJob				( HJOB hJob )=0;
 | |
| 		virtual void	SuspendJob				( HJOB hJob )=0;
 | |
| 		virtual void	ActivateJob				( HJOB hJob )=0;
 | |
| 		virtual int		GetJobServersCount		( HJOB hJob )=0;
 | |
| 		virtual int		GetJobServers			( int start, int end, HJOB hJob, JobServer* servers )=0;
 | |
| 		virtual void	GetJobServerStatus		( HJOB hJob, HSERVER hServer, TCHAR* status_text )=0;
 | |
| 		virtual void	SuspendJobServer		( HJOB hJob, HSERVER hServer )=0;
 | |
| 		virtual void	AssignJobServer			( HJOB hJob, HSERVER hServer )=0;
 | |
| 		virtual int		GetJobFramesCount		( HJOB hJob )=0;
 | |
| 		virtual int		GetJobFrames			( int start, int end, HJOB hJob, JOBFRAMES* frames )=0;
 | |
| 		virtual int		GetJobLog				( int start, int count, HJOB hJob, TCHAR** buffer )=0;
 | |
| 		
 | |
| 		virtual bool	CheckOutputVisibility	( TCHAR* output, TCHAR* err )=0;
 | |
| 		virtual void	AssignJob				( Job* job, TCHAR* archive, HSERVER* servers, CJobText& jobtext, DWORD blocksize = 0 )=0;
 | |
| 		
 | |
| 
 | |
| 		//-- Servers (Global)
 | |
| 
 | |
| 		virtual int		GetServerCount			( )=0;
 | |
| 		virtual int		ListServers				( int start, int end, ServerList* serverList )=0;
 | |
| 		virtual void	GetServer				( HSERVER hServer, ServerList* serverList )=0;
 | |
| 		virtual bool	DeleteServer			( HSERVER hServer )=0;
 | |
| 		virtual bool	ResetServerIndex		( HSERVER hServer )=0;
 | |
| 		virtual void	GetWeekSchedule			( HSERVER hServer, WeekSchedule* schedule )=0;
 | |
| 		virtual void	SetWeekSchedule			( HSERVER hServer, WeekSchedule* schedule )=0;
 | |
| 		virtual void	GetServerNetStat		( HSERVER hServer, NetworkStatus* net_stat )=0;
 | |
| 		
 | |
| 		virtual int		GetServerGroupCount		( )=0;
 | |
| 		virtual int		GetServerGroupXCount	( int group )=0;
 | |
| 		virtual int		GetServerGroup			( int group, int count, HSERVER* grplist, TCHAR* name )=0;
 | |
| 		virtual void	NewServerGroup			( int count, HSERVER* grplist, TCHAR* name )=0;
 | |
| 		virtual void	DeleteServerGroup		( int group )=0;
 | |
| 		
 | |
| 
 | |
| };
 | |
| 
 | |
| #endif
 | |
| 
 | |
| //-- EOF: maxnet_manager.h ----------------------------------------------------
 | 
