/*
    SieNatJabber Project
    Функции работы с контакт-листом

    Специфический для джаббера разбор XML
*/

#ifndef _JABBER_UTIL_H_
#define _JABBER_UTIL_H_

#include "xml_parser.h"

#define MAX_MSG_LEN 4096

#define PRES_COUNT 12

typedef enum MUC_ADMIN
{
    ADM_KICK,             // Кик
    ADM_BAN,              // Бан
    ADM_VOICE_REMOVE,     // Лишить голоса
    ADM_VOICE_GRANT,      // Предоставить голос
    ADM_PARTICIPANT,      // Participant
    ADM_MEMBER,           // Member
    ADM_MODERATOR,        // Moderator
    ADM_MODERATOR_REMOVE,  // Moderator remove
    ADM_ADMIN,            // Admin
    ADM_OWNER             // Owner
} MUC_ADMIN;

// Для хранения текущей инфы о статусе (чтобы восстановить после реконнекта)
// И для установки в конфу, если зашли позже установки статуса в ростере
typedef struct ONLINEINFO
{
	char status;
	short priority;
	char* txt;
} ONLINEINFO;

/**
  * Функция для отправки настроения
 **/
void Send_Mood(char* mood, char* text);

/*
  Посылка стандартного Jabber Iq
*/
void SendIq(char* to, char* type, char* id, char* xmlns, XMLNode* payload);

/*
  Послать приветствие, на него сервер высылает ответный stream.
  После этого можно общаться с сервером
*/
// Context:HELPER
void Send_Welcome_Packet();

void Send_Welcome_Packet_SASL();

/*
  Послать дисконнект
*/
void Send_Disconnect();

/*
  Авторизация на Jabber-сервере
  Самая тупая, без извращений.
*/
void Send_Auth();

/*
  Послать своё присутствие (в частности, после этого на нас вываливаются
  присутствия остальных, а мы появляемся в ресурсах своего контакта)
*/
// Context: HELPER
void Send_Presence(PRESENCE_INFO* pr_info);

void Send_ShortPresence(char* to, char type);
// Послать запрос о версии пользователю с указанным JID
// JID указываем в UTF-8
void Send_Version_Request(char* dest_jid);

//Запрос времени клиента с JID
void Send_Time_Request(char* dest_jid);
//vcard
void Send_Vcard_Request(char* dest_jid);

//lastactivity
void Send_LastActivity_Request(char* dest_jid);

// Послать запрос disco#info
// JID указываем в UTF-8
void Send_DiscoInfo_Request(char* dest_jid);

/*
  Послать запрос ростера
*/
// Context: HELPER
void Send_Roster_Query();

void _sendandfree(char* str);

/*
 Обработка входящих Iq-запросов
*/
void Process_Iq_Request(XMLNode* nodeEx);


/*
Презенсы :)
*/
void Process_Presence_Change(XMLNode* node);

/*
Входящие сообщения
*/
void Process_Incoming_Message(XMLNode* nodeEx);

// kibab612@jabber.ru/SieJC  => SieJC
char* Get_Resource_Name_By_FullJID(char* full_jid);

/*
Получить внутренний номер данного типа присутствия по строке с присутсвием
*/
unsigned short GetPresenceIndex(char* presence_str);

/*
Получить внутренний номер данного типа роли/полномочий по строке с присутсвием
*/
unsigned short GetAffRoleIndex(char* str);

// Исполнение административных команд
void MUC_Admin_Command(char* room_name, char* room_jid, MUC_ADMIN cmd, char* reason);

typedef struct IPC_MESSAGE_S
{
	char IsGroupChat;
	char IsAttention;
	char* body;
} IPC_MESSAGE_S;

typedef struct MUC_ENTER_PARAM
{
	char* room_nick;
	char* room_name;
	char* pass;
	int mess_num;
} MUC_ENTER_PARAM;


typedef struct BM_ITEM
{
	char* bmname;
	char* mucname;
	char* nick;
	char* pass;
//  char a_join;
//  char *url;
	void* next;
} BM_ITEM;

// Context: HELPER
void SendMessage(char* jid, IPC_MESSAGE_S* mess);

// Context: HELPER
void SendComposing(char* jid, IPC_MESSAGE_S* mess);

// Context: HELPER
void CancelComposing(char* jid, IPC_MESSAGE_S* mess);

// Уничтожить список комнат
void MUCList_Destroy();

// Войти в конференцию
void Enter_Conference(char* room, char* roomnick, char* roompass, char N_messages);

// Выйти из конференции
void Send_Leave_Conference(char* room, char* reason);

// Установить тему конфы
void Set_Conference_Topic(char* room, char* topic);

///////////////////

#endif
