//////////////////////////////////////////////////////////////////////////////
//
//  CCallbackList.hpp
//  Win32::Daemon Perl extension callback list class header file
//
//  Copyright (c) 1998-2008 Dave Roth
//  Courtesy of Roth Consulting
//  http://www.roth.net/
//
//  This file may be copied or modified only under the terms of either 
//  the Artistic License or the GNU General Public License, which may 
//  be found in the Perl 5.0 source kit.
//
//  2008.03.24  :Date
//  20080324    :Version
//////////////////////////////////////////////////////////////////////////////

#ifndef _CCALLBACKLIST_H_
#define _CCALLBACKLIST_H_

#include "CONSTANT.h"

//  Define a unique value to identify the callback "running"
//  timer. This is the ID we pass into CCallbackTimer class to manage
//	the Win32 timer.
#define CALLBACK_TIMER_ID				0x0101

#define	CALLBACK_TIMER					SERVICE_CONTROL_TIMER				 //	 Our own definition
#define CALLBACK_START					SERVICE_CONTROL_START                //  Our own definition
#define CALLBACK_STOP					SERVICE_CONTROL_STOP                   
#define CALLBACK_PAUSE					SERVICE_CONTROL_PAUSE                  
#define CALLBACK_CONTINUE				SERVICE_CONTROL_CONTINUE               
#define CALLBACK_INTERROGATE			SERVICE_CONTROL_INTERROGATE            
#define CALLBACK_SHUTDOWN				SERVICE_CONTROL_SHUTDOWN               
#define CALLBACK_PARAMCHANGE			SERVICE_CONTROL_PARAMCHANGE            
#define CALLBACK_NETBINDADD				SERVICE_CONTROL_NETBINDADD             
#define CALLBACK_NETBINDREMOVE			SERVICE_CONTROL_NETBINDREMOVE          
#define CALLBACK_NETBINDENABLE			SERVICE_CONTROL_NETBINDENABLE          
#define CALLBACK_NETBINDDISABLE			SERVICE_CONTROL_NETBINDDISABLE         
#define CALLBACK_DEVICEEVENT			SERVICE_CONTROL_DEVICEEVENT            
#define CALLBACK_HARDWAREPROFILECHANGE  SERVICE_CONTROL_HARDWAREPROFILECHANGE  
#define CALLBACK_POWEREVENT				SERVICE_CONTROL_POWEREVENT             
#define CALLBACK_SESSIONCHANGE			SERVICE_CONTROL_SESSIONCHANGE   
#ifdef SERVICE_CONTROL_PRESHUTDOWN
	#define CALLBACK_PRESHUTDOWN			SERVICE_CONTROL_PRESHUTDOWN
#endif	//	SERVICE_CONTROL_PRESHUTDOWN

#define	CALLBACK_TIMER_INDEX					0x00
#define CALLBACK_START_INDEX					0x01
#define CALLBACK_STOP_INDEX						0x02
#define CALLBACK_PAUSE_INDEX					0x03
#define CALLBACK_CONTINUE_INDEX					0x04
#define CALLBACK_INTERROGATE_INDEX				0x05
#define CALLBACK_SHUTDOWN_INDEX					0x06
#define CALLBACK_PARAMCHANGE_INDEX				0x07
#define CALLBACK_NETBINDADD_INDEX				0x08
#define CALLBACK_NETBINDREMOVE_INDEX			0x09
#define CALLBACK_NETBINDENABLE_INDEX			0x0a
#define CALLBACK_NETBINDDISABLE_INDEX			0x0b
#define CALLBACK_DEVICEEVENT_INDEX				0x0c
#define CALLBACK_HARDWAREPROFILECHANGE_INDEX	0x0d
#define CALLBACK_POWEREVENT_INDEX				0x0e
#define CALLBACK_SESSIONCHANGE_INDEX			0x0f
#define CALLBACK_PRESHUTDOWN_INDEX				0x10
#define CALLBACK_USERDEFINED_INDEX				0x11
#define CALLBACK_RUNNING_INDEX					0x12
//	Next one is the total (non zero based index) of callback entries.
//	This is used to create an array to hold all of these callback 
//	pointers.
#define	TOTAL_CALLBACK							0x13

#define CALLBACK_USER_DEFINED					SERVICE_CONTROL_USER_DEFINED   //  Our own definition
#define CALLBACK_RUNNING						SERVICE_CONTROL_RUNNING        //  Our own definition


// Control callback function names
#define CALLBACK_NAME_TIMER					TEXT( "timer" )
#define CALLBACK_NAME_START                 TEXT( "start" )
#define CALLBACK_NAME_STOP					TEXT( "stop" )
#define CALLBACK_NAME_PAUSE					TEXT( "pause" )
#define CALLBACK_NAME_CONTINUE				TEXT( "continue" )
#define CALLBACK_NAME_INTERROGATE			TEXT( "interrogate" )
#define CALLBACK_NAME_SHUTDOWN				TEXT( "shutdown" )
#define CALLBACK_NAME_PARAMCHANGE			TEXT( "param_change" )
#define CALLBACK_NAME_NETBINDADD			TEXT( "net_bind_add" )
#define CALLBACK_NAME_NETBINDREMOVE			TEXT( "net_bind_remove" )
#define CALLBACK_NAME_NETBINDENABLE			TEXT( "net_bind_enable" )
#define CALLBACK_NAME_NETBINDDISABLE		TEXT( "net_bind_disable" )
#define CALLBACK_NAME_DEVICEEVENT	        TEXT( "device_event" )
#define CALLBACK_NAME_HARDWAREPROFILECHANGE TEXT( "hardware_profile_change" )
#define CALLBACK_NAME_POWEREVENT            TEXT( "power_event" )
#define CALLBACK_NAME_SESSIONCHANGE         TEXT( "session_change" ) 
#ifdef SERVICE_CONTROL_PRESHUTDOWN
	#define CALLBACK_NAME_PRESHUTDOWN		TEXT( "preshutdown" )
#endif	//	SERVICE_CONTROL_PRESHUTDOWN

// Control callback function names for misc stuff...
#define CALLBACK_NAME_USER_DEFINED			TEXT( "user_defined" )
#define CALLBACK_NAME_RUNNING               TEXT( "running" )


class CCallbackList
{
	public:
		CCallbackList();
		~CCallbackList();

		PVOID Get( DWORD dwCommand );
		BOOL Set( DWORD dwCommand, PVOID pCallbackRoutine );
        DWORD GetCount();
		
	private:
		DWORD GetCallbackIndex( DWORD dwCommand );
		
		PVOID m_pSvList[TOTAL_CALLBACK];
        DWORD m_dwCount;

};

#endif	//	_CCALLBACKLIST_H_