

//---------------------------------------------------------------------------
//
// Модуль для работы с именованными каналами Цштвщцы для организации
// взаимодействия между процессами бота
//
// Версия 1.0
//
//---------------------------------------------------------------------------

#ifndef PipesH
#define PipesH

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

#include <windows.h>
#include "BotClasses.h"


// Описание структуры
typedef struct TProcessPipe
{
	PCHAR  Name;                // Имя канала
	HANDLE Handle;              // Идентификатор канала
	PList  Handlers;            // Список зарегистрированных обработчиков сообщений
	RTL_CRITICAL_SECTION Lock;  // Структура блокировки канала
	HANDLE Event;               // Для внутреннего использования
    bool Terminated;            // Признак того, что прервана работа канала
}*PProcessPipe;



typedef struct TPipeMessage
{
	DWORD PID;         // Идентификатор процесса, отправителя сообщения
	PCHAR ProcessName; // Имя процесса, отправителя сообщения
	DWORD MsgSize;     // Размер сообщения
	PCHAR Message;     // Текст Сообщения
	DWORD MessageHash; // Хэш сообщения
	PCHAR Data;        // Данные сообщения
	DWORD DataSize;    // Размер данных
} *PPipeMessage;


//------------------------------------------------------------
// TPipeMessageHandler - Функция, обработчик сообщения
//						 именованного канала
//
// Data - Данные которые передавались при регистрации
//		  обработчика
//
// Message - Указатель на структуру распакованного сообщения
//
// Cancel - Указание прервать дальнейшую обработку сообщения.
//------------------------------------------------------------
typedef void (WINAPI *TPipeMessageHandler)(LPVOID Data, PPipeMessage Message, bool &Cancel);


//*************************************************************
//  Методы для работы с именованными каналами
//*************************************************************
namespace PIPE
{
	//-----------------------------------------------------------
	//  Create - Функция создаёт объект именованного канала
	//
	//  Name - Короткое имя канала. WIN API для работы с
	//         именованными каналами вместе с именем требуют
	//         полный путь. Для данной функции нужно указать
	//         только имя канала, без пути к директории каналов.
	//
	//  Результат: В случае успеха функция возвращает
	//             идентификатор канала. В случае провала
	//			   функция возвращает NULL
	//-----------------------------------------------------------
	HANDLE Create(PCHAR Name);


	//-----------------------------------------------------------
	//  CreateProcessPipe - Функция создаёт глобальный канал
	//					    процесса и запускает процесс
	//				        ожидания сообщений
	//
	//  PipeName - имя канала
	//
	//  StartPipe - Признак немедленного старта записи
	//
	//  Результат: В случае успеха ункция возвращает указатель
	//			   на структуру канала
	//-----------------------------------------------------------
	PProcessPipe        CreateProcessPipe(const PCHAR PipeName, bool StartPipe);
	PProcessPipe inline CreateProcessPipe(const string &PipeName, bool StartPipe) { return CreateProcessPipe(PipeName.t_str(), StartPipe); }

	//-----------------------------------------------------------
	//  StartProcessPipe - Функция стартует работу канада
	//-----------------------------------------------------------
	bool StartProcessPipe(PProcessPipe Pipe);

	//-----------------------------------------------------------
	//  FreeProcessPipe функция уничтожает пайп процесса
	//-----------------------------------------------------------
	void FreeProcessPipe(PProcessPipe Pipe);

	//-----------------------------------------------------------
	//  InitializeProcessPipe - Функция инициализировет канал
	//						    процесса.
	//-----------------------------------------------------------
   //	bool InitializeProcessPipe(PCHAR Name, PProcessPipe Pipe);

	//-----------------------------------------------------------
	//  StartProcessPipe - Функция стартует поток приёма команд
	//
	//
	//  Pipe - Канал созданный функцией InitializeProcessPipe
	//-----------------------------------------------------------
   //	void StartProcessPipe(PProcessPipe Pipe);

   	//-----------------------------------------------------------
	//  SendMessage - Функция отправляет указанному каналу
	//				 сообщение
	//-----------------------------------------------------------
	bool        SendMessage(PCHAR PipeName, PCHAR Msg, PCHAR Data, DWORD DataSize, void* Answer );
	bool        SendMessage(PCHAR PipeName, PCHAR Msg);
	bool inline SendMessage(const string &PipeName, const string &Msg) { return SendMessage(PipeName.t_str(), Msg.t_str());}

	//-----------------------------------------------------------
	//  Ping - Функция процеряет существование канала PipeName
	//
	//  Результат:
	//
	//  В случае успеха функция вернёт PID процесса который
	//  ответил.
	//  В случае неудачи функция вернёт ноль
	//-----------------------------------------------------------
	DWORD Ping(PCHAR PipeName);

	//-----------------------------------------------------------
	//  RegisterMessageHandler - Функция регистрирует обработчик
	//							 сообщения
	//  PProcessPipe - Процессный именной канал.
	//
	//  Handler - Обработчик сообщения
	//
	//  DATA - Данные, которые будут переданы в обработчик
	//
	//  Message - Сообщение для которого регистрируется
	//			  обработчик. Не обязательный параметрю
	//
	//  MessageHash - Хэш ообщения для которого регистрируется
	//				  обработчик. Задайте 0 если параметр не
	//				  нужен.
	//
	//  Если указаны Message или MessageHash то обработчик
	//  будет вызываться только для указанного сообщения, в
	//  противном случае обработчик будет вызываться для
	//  всех сообщений.
	//  При получении сообщения проверяется значение Message,
	//  если оно не указано (NULL) то проверяется MessageHash.
	//
	//-----------------------------------------------------------
	bool RegisterMessageHandler(PProcessPipe Pipe, TPipeMessageHandler Handler,
								LPVOID Data, PCHAR Message, DWORD MessageHash);

}


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