#ifndef _MAIN_H_
#define _MAIN_H_

#include "jabber.h"

////////////////////////////////////////////////////////////////////////////////
//////////////////// Некоторые дополнительные настройки проекта ////////////////
//#define LOG_ALL       // Включить протоколирование входящих / исходящих потоков
// Очень подробный лог, лучше не включать

//#define LOG_XML_TREE    // Включить запись отпарсенного XML-дерева
#ifdef NEWSGOLD
//#define LOG_TO_COM_PORT // Лог данных в ком-порт (по DCA-510) - ТОЛЬКО NEWSGOLD
#endif
//#define LOG_IN_DATA     // Включить запись обрабатываемой порции данных

// Синхронизация прорисовки с помощю:
//#define IDLEUPD //диспатчера ГЕ
// или
//#define SCRP	//ScrP патча и ScrD.elf ельфа

////////////////////////////////////////////////////////////////////////////////

#define TMR_SECOND 216

// Общие функции модуля MAIN.C

#define color(x) (char *)(&(x))

#define SCR_START YDISP


typedef struct IPC_BUFFER
{
	int buf_size;
	char* xml_buffer;
} IPC_BUFFER;


typedef struct MAIN_CSM
{
	CSM_RAM csm;
	int gui_id;
} MAIN_CSM;

typedef struct MAIN_GUI
{
	GUI gui;
	WSHDR* ws1;
	WSHDR* ws2;
	int i1;
} MAIN_GUI;

typedef enum JABBER_STATE
{
    JS_NOT_CONNECTED,           // нет соединения, нет сокета
    JS_CONNECTED_STATE,         // получен stream:stream
    JS_ZLIB_INIT_ACK,           // Ожидание подтверждения юзания ZLib
    JS_ZLIB_STREAM_INIT_ACK,    // Ожидание ответного ZLib-потока
    JS_SASL_NEGOTIATION,        // Обмен приветствиями SASL
    JS_SASL_NEG_ANS_WAIT,       // Ожидание ответа от сервера на посланный SASL
    JS_SASL_AUTH_ACK,           // Ожидание <success/> после ответа на rspauth
    JS_SASL_NEW_STREAM_ACK,     // Ожидание инициализации нового потока
    JS_SASL_RESBIND_ACK,        // Ожидание привязки ресурса
    JS_SASL_SESS_INIT_ACK,      // Ожидание инициализации сессии
    JS_AUTH_OK,                 // Не-SASL: получена авторизация
    JS_AUTH_ERROR,              // Ошибка авторизациии
    JS_ONLINE,                  // Рабочее состояние при установленном подключении
    JS_ERROR                    // Общий дестрой
} JABBER_STATE;

////////////////////////////////
// Кой-какие типы сообщений из http://www.xmpp.org/rfcs/rfc3921.html и + свои
typedef enum MESS_TYPE
{
    MSG_NORMAL, // типа "нормал", по дефолту, See RFC
    MSG_ME,     // от меня контакту
    MSG_CHAT,   // от контакта ко мне
    MSG_GCHAT,   // конференция
    MSG_NICKGCHAT,   // из конференции, c нашим ником
    MSG_SYSTEM,  // всякого рода сервисные сообщения
    MSG_STATUS,   // Статусные сообщения
    MSG_SUBJECT   // Тема конференции
} MESS_TYPE;


// Типы узлов в списке контактов
typedef enum RES_TYPE
{
    T_NORMAL,       // Обычный (просто ресурс)
    T_VIRTUAL,      // Создаётся при создании контакта, для удаления
    T_CONF_ROOT,    // Корень конференции (место доставки публичных сообщений)
    T_CONF_NODE,    // Участник конференции (отображаем только "ресурс" жида)
    T_TRANSPORT,    // Транспортный агент
    T_GROUP         // Группа
} RES_TYPE;

typedef struct LOG_MESSAGE
{
	MESS_TYPE mtype;
	char* muc_author;// Имеет смысл использовать только в конференциях
	char* mess;
	void* next;
} LOG_MESSAGE;

typedef struct CONF_DATA
{
	JABBER_GC_AFFILIATION aff;
	JABBER_GC_ROLE role;
	char* real_jid;
} CONF_DATA;

typedef char** VCARD;

typedef struct TRESOURCE
{
	char* name;                   // Отображаемое имя ресурса
	char* full_name;              // Полный JID (jid/resource)
	RES_TYPE entry_type;          // Тип записи (см. RES_TYPE)
	char status;                  // Статус
	char compos: 1;               // Сообшение о наборе
	char* status_msg;             // Статусное сообщение
	short priority;               // Приоритет ресурса
	unsigned int has_unread_msg;  // Есть ли непрочитанные и сколько
	unsigned int total_msg_count; // Общее количество сообщений
	LOG_MESSAGE* log;             // Начало лога сообщений
	CONF_DATA muc_privs;          // Тут для конференционных контактов - про роли и риал-жид
	VCARD vcard;                  // Здесь хранится vCard для участников конференций
	//char *client;				  // Префикс имени клиента для иконки
	void* next;                   // Следующий экземпляр
} TRESOURCE;

typedef struct CLIST
{
	char* JID;
	char IsVisible;             // Показывать ли в списке (связано с группами)
	int ResourceCount;
	TRESOURCE* res_list;
	char* name;
	JABBER_SUBSCRIPTION subscription;
	char wants_subscription;
	char group;     // >128 -> конференции
	VCARD vcard; // Полученная VCard, для контактов ростера
	void* next;
} CLIST;


// Для списка конференций
typedef struct MUC_ITEM
{
	char* conf_jid; //UTF-8
	char* muctema;
	void* next;
} MUC_ITEM;

// Для задания своих параметров присутсвия в сети
typedef struct PRESENCE_INFO
{
	short priority;
	char status;
	char* message;
} PRESENCE_INFO;

#pragma pack(push)
#pragma pack(1)
typedef struct DEF_SETTINGS
{
	unsigned char
	vibra_status: 1,
	              sound_status: 1,
	              off_contacts: 1,
	              auto_status: 1,
	              smiles_status: 1;
	char color_name[32];
	short priority;
	char status;
	char status_text[510];
} DEF_SETTINGS;
#pragma pack(pop)

#ifdef NEWSGOLD
#define CBOX_CHECKED 0xE116
#define CBOX_UNCHECKED 0xE117
#else
#define CBOX_CHECKED 0xE10B
#define CBOX_UNCHECKED 0xE10C
#endif

void SendAnswer(char* str);

void Vibrate(int Req_Vibra_Count);

void Play(const char* fname);

void QuitCallbackProc(int decision);

void OpenSettings(void);

#endif
