// Gemplus (C) 1999
// Version 1.0
// Author: Sergey Ivanov
// Date of creation - 18.05.1999
// Change log:
//

#ifndef __THREAD__
#define __THREAD__
#include "generic.h"
#include "kernel.h"

#pragma PAGEDCODE
class CUSBReader;//TOBE REMOVED
class CTimer;
//class CThread;

typedef
NTSTATUS
(*PCLIENT_THREAD_ROUTINE) (
    IN PVOID RoutineContext
    );
// Default thread pooling interval in ms
#define DEFAULT_THREAD_POOLING_INTERVAL	500

class CThread 
{
public:
	NTSTATUS m_Status;
	SAFE_DESTRUCTORS();
	virtual VOID dispose(){self_delete();};
private:
KEVENT   evKill;	// set to kill polling thread
KEVENT   evStart;	// set when requested to start, clear when need to stop pooling
KEVENT   evIdle;	// Signals that thread stopped and at Idle state
KEVENT   evStopped;	// set when requested to close thread
PKTHREAD thread;	// polling thread object
KSEMAPHORE smOnDemandStart;// request to repeate operation if semaphore is at Signal state

BOOLEAN  StopRequested;	
BOOLEAN  ThreadActive;	

CDebug*  debug;
CEvent*  event;
CSystem* system;
CTimer*  timer;
CSemaphore* semaphore;

ULONG	 PoolingTimeout;

PCLIENT_THREAD_ROUTINE pfClientThreadFunction;
PVOID ClientContext;

//CDevice* device;
//CUSBReader* device;
protected:
	CThread(){};
	virtual ~CThread();
public:
	//CThread(CDevice* device);
	//CThread(CUSBReader* device);
	CThread(PCLIENT_THREAD_ROUTINE ClientThreadFunction, PVOID ClientContext,
				ULONG delay=DEFAULT_THREAD_POOLING_INTERVAL);
	static VOID ThreadFunction(CThread* thread);

	VOID ThreadRoutine(PVOID context) ;
	PKEVENT  getKillObject(){return &evKill;};
	PKEVENT  getStartObject(){return &evStart;};
	VOID	 kill();
	VOID	 start();
	VOID	 stop();
	BOOL	 isThreadActive();
	VOID	 setPoolingInterval(ULONG delay);
	// Force to call thread function...
	// This is on demand start.
	VOID     callThreadFunction();
};

#endif//THREAD