// NTFlTask.h: interface for the NTFlTask class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_NTFLTASK_H__3F0053BD_CE83_11D3_B776_00104B457E71__INCLUDED_)
#define AFX_NTFLTASK_H__3F0053BD_CE83_11D3_B776_00104B457E71__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "stdafx.h"
#include "FlNTsys.h"
#include "flobj.h"
#include "keyfilter.h"
#include "registration.h"


//CT archive definitions
#define CTID_KEYSTROKES           1
#define CTID_SHUTDOWNS            2
#define CTID_MESSAGEBOX           3
#define CTID_EVENTLOG             4

typedef struct  _ct_keystroke
{

  TAG           fltag;
  TAG           flget;
  TAG           flstate;
  TAG           flcompl;
  u16           key;
  u16           shift;
  u16           control;
  u16           alt;
  u16           replace;

} CT_KEYSTROKE;

typedef  struct  _ct_shutdown
{

  TAG           fltag;
  TAG           paratag;
  TAG           flcompl;
  u16           flag;
  u16           para;

} CT_SHUTDOWN;

typedef  struct  _ct_messagebox
{

  TAG           fltag;
  TAG           flresult;
  TAG           fltitle;
  TAG           fltext;
  u16           icon;
  u16           type;
  u16           topmost;
  u16           disptime;
  char          title[82];
  char          text[ 256];

} CT_MESSAGEBOX;

typedef  struct  _ct_eventlog
{

  TAG           fltag;
  TAG           flevent;
  TAG           fltext;
  TAG           flcompl;
  u16           type;
  char          text[ 256];

} CT_EVENTLOG;

class NTFlTask;

class CKeyStroke : public CObject  
{
public:
  unsigned short GetKey() { return key;};
  unsigned short GetAlt() { return alt;};
  unsigned short GetShift() { return shift;};
  unsigned short GetControl() { return control;};
  unsigned short GetReplaceKey() { return replace;};
  NTFlTask *theTask;
  CKeyStroke( CT_KEYSTROKE *k, NTFlTask *t)
    : theTag( k->fltag), flget( k->flget), flstate( k->flstate), flcompl( k->flcompl)
  { key = k->key;
    shift = k->shift;
    control = k->control;
    alt = k->alt;
    replace = k->replace;
    theTask = t;
    test = &theTag;
  };
  FlTag theTag;
  FlTag flget;
  FlTag flstate;
  FlTag flcompl;
  FlTag *test;
  //virtual ~CKeyStroke() {};
private:
  u16 key;
  u16 shift;
  u16 control;
  u16 alt;
  u16 replace;
};

typedef CTypedPtrArray <CObArray, CKeyStroke*> CKeyStrokeArray;


class CShutdown : public CObject  
{
public:
  unsigned short GetFlag() { return flag;};
  u16 para;
  FlTag paratag;
  FlTag fltag;
  FlTag flcompl;
  NTFlTask *theTask;
  CShutdown( CT_SHUTDOWN *s, NTFlTask *t)
    : fltag( s->fltag), paratag( s->paratag), flcompl( s->flcompl)
  { flag = s->flag;
    para = s->para;
    theTask = t;
  };
  //virtual ~CShutdown() {};
private:
  u16 flag;
};

typedef CTypedPtrArray <CObArray, CShutdown*> CShutdownArray;


class CMbox : public CObject  
{
public:
	void ToFront();
	BOOL Kill();
	BOOL TimeOut( BOOL update = TRUE);
	void ResetCounter();
  FlTag fltag;
  FlTag flresult;
  FlTag fltitle;
  FlTag fltext;
  int dialog_time;
  int dialog_icon;
  int dialog_type;
  int dialog_topmost;
  char dialog_title[82];
  char dialog_text[ 256];
  int m_iT;
  CWinThread *m_Thread;
  NTFlTask *theTask;
  CMbox( CT_MESSAGEBOX *m, NTFlTask *t)
    : fltag( m->fltag), flresult(m->flresult), fltitle(m->fltitle), fltext(m->fltext)
  { strcpy( dialog_title, m->title);
    strcpy( dialog_text, m->text);
    dialog_topmost = m->topmost;
    dialog_type = m->type;
    dialog_icon = m->icon;
    dialog_time = m->disptime;
    theTask = t;
    m_Thread = NULL;
    ResetCounter();
  };
  virtual ~CMbox() { if (m_Thread) { Kill(); delete m_Thread; m_Thread = NULL;}};
private:

protected:
	HWND m_hMbox;
	int m_iCounter50;
};

typedef CTypedPtrArray <CObArray, CMbox*> CMboxArray;


class C2EventLog : public CObject  
{
public:
//  void SetLogText( char *text) { strcpy( log_text, text);};
  char *GetLogText() { if (fltext.IsValid()) strcpy( log_text, (char *)fltext);
                       return log_text;};
  char GetEventType(){ if (flevent.IsValid()) m_iType = (int)flevent;
                       m_iType = m_iType < 0 ? 0: m_iType;
                       m_iType = m_iType > 2 ? 2: m_iType; 
                       return m_iType;};
  FlTag fltag;
  FlTag flevent;
  FlTag fltext;
  FlTag flcompl;
  NTFlTask *theTask;
  C2EventLog( CT_EVENTLOG *e, NTFlTask *t)
    : fltag( e->fltag), flevent(e->flevent), fltext(e->fltext), flcompl(e->flcompl)
  { strcpy( log_text, e->text);
    m_iType = e->type;
    theTask = t;
  };
  //virtual ~C2EventLog() { if (m_Thread) { Kill(); delete m_Thread; m_Thread = NULL;}};
private:

protected:
  char log_text[ 256];
	int m_iType;
};

typedef CTypedPtrArray <CObArray, C2EventLog*> C2EventLogArray;


class NTFlTask : public FlTask  
{
public:
	int GetUseMB();
	int GetUseGB();
  char *GetTimeZone();
	void SetFlStop( BOOL flag = false);
  CRegistration *DlgRegistration;
	void LockSystem();
  CKeyFilter m_oKeyFilter;
	void SetShutdown( long Flag);
	void ShutdownSystem();
	virtual void Stopping();
	virtual void Starting();
	void CTload();
	NTFlTask( char *Name, char *Desc);
	virtual ~NTFlTask();
private:
	int m_iUseMB;
  int m_iUseGB;
  CString m_sTimeZoneName;
  C2EventLogArray m_aEventLog;
  CShutdownArray  m_aShutdown;
  CMboxArray      m_aMessageBox;
  CKeyStrokeArray m_aKey;
	virtual void Polling();
	void Registration();
  FlTag *FlShutdown;
  int m_iShutdown;
  long m_lShutdownFlag;
  BOOL m_bFlStop;
};


#endif // !defined(AFX_NTFLTASK_H__3F0053BD_CE83_11D3_B776_00104B457E71__INCLUDED_)
