/*

MAgen.dll: Miranda plugin for mail.ru message exchange.

Copyright 2005-2010 Lenik.
Project home at http://www.lenik.ru/win32/magent
Author contact: lenik@lenik.ru

This program is free software.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

*/

unsigned long MRIM_do_sendmessage(unsigned char *address,unsigned char *message)
{
struct _int_packet
    {
    mrim_packet_header_t hdr;
    unsigned char parameters[];
    };
unsigned long seq;
unsigned long plen;
unsigned long retval = 1;
struct _int_packet *packet;
//      Имя пакета: MRIM_CS_MESSAGE
//      Тип пакета: cs
//      поле seq должно содержать номер, который в последствии будет содержаться в заголовке пакета MRIM_CS_MESSAGE_STATUS, оповещающем клиента о статусе доставки данного сообщения.
//      Параметры:
//
//      UL ## flags ## флаги ##
//
//      MESSAGE_FLAG_OFFLINE ## Сообщение пришло, пока клиент был отключен
//      MESSAGE_FLAG_NORECV ## Отправителю сообщения не требуется подтверждения доставки
//      MESSAGE_FLAG_AUTHORIZE ## Сообщение является запросом на авторизацию
//      MESSAGE_FLAG_SYSTEM ## Сообщение является системным уведомлением администрации
//      MESSAGE_FLAG_RTF ## В сообщении содержится форматированная часть
//      MESSAGE_FLAG_CONTACT ## Сообщение представляет из себя пересланный список контактов. Текст сообщения в этом случае должен представлять из себя список адресов и ников пересылаемых контактов, перечисленных через точку с запятой. <адрес1>;<ник1>;<адрес2>;<ник2>;<адрес3>;<ник3>;...
//      MESSAGE_FLAG_NOTIFY ## Это сообщение-уведомление "Вам пишут". Должно посылаться каждые 10 секунд, при более длинной паузе клиент-получатель должен считать, что отправитель прекратил написание. Текст такого сообщения должен состоять из одного пробела.
//      MESSAGE_FLAG_MULTICAST ## Сообщение направлено списку получателей, а не одному. Поле to в таком случае состоит из списка получателей, перечисленных через запятую. Максимальная длина списка - 50 адресов.
//
//      LPS ## to ## email получателя
//      LPS ## message ## текстовая версия отправляемого сообщения
//      LPS ## rtf-message ## отформатированная версия отправляемого сообщения, в случае наличия обоих версий сообщения приоритет имеет rtf-версия. Она должна содержать rtf-текст упакованный gzip в base64 представлении. То есть:
//
//BASE64(
//        GZIP(
//            UL количество LPS (должно быть не менее 2)
//            LPS rtf_text_with_all_rtf_headers_and_tags
//            LPS цвет фона в виде UL
//             )
//         ) 
//                    
//
//      Описание: Основной пакет взаимодействия между двумя клиентами. Может быть отправлено в любой момент по инициативе клиента. Ни текстовая, ни rtf части сообщений не могут быть пустыми, при необходимости следует использовать строку из одного пробела.
#ifdef MRIM_DEBUG
    PrintDebug("mrim_do_sendmessage: started\n");
#endif

plen = sizeof(struct _int_packet) + 4 + 4+strlen(address) + 4+strlen(message) + 4+strlen(message) + 4;
if((packet=(struct _int_packet*)malloc(plen)) != NULL)
    {
    packet->hdr.magic = CS_MAGIC;
    packet->hdr.proto = PROTO_VERSION;
    packet->hdr.seq = seq = GetSequenceNext();
    packet->hdr.msg = MRIM_CS_MESSAGE;
    packet->hdr.dlen = 0;
    packet->hdr.from = 0;
    packet->hdr.fromport = 0;

    #ifdef MRIM_DEBUG
        PrintDebug("mrim_do_sendmessage: malloc() ok\n");
    #endif
    MRIM_Packet_AddLong(packet,0);
    MRIM_Packet_AddString(packet,address);
    MRIM_Packet_AddString(packet,message);
    MRIM_Packet_AddString(packet," ");
    //MRIM_Packet_AddString(&packet,message);

    //DumpMem(&packet,sizeof(mrim_packet_header_t) + packet->hdr.dlen);
    if(MRIM_sendpacket(packet) == 0)
        {
        #ifdef MRIM_DEBUG
            PrintDebug("mrim_do_sendmessage: MRIM_CS_MESSAGE(%lu,%s,%s,%s) sended\n",0,address,message,"");
        #endif
        //MessageBox(NULL,"Send packet ok","MRIM_do_sendmessage",MB_OK);
        if(MRIM_receivepacket(packet,plen,seq,MRIM_GetTimeout()) == 0)
            {
            #ifdef MRIM_DEBUG
                PrintDebug("mrim_do_sendmessage: packet received\n");
            #endif
            //MessageBox(NULL,"receive packet ok","MRIM_do_sendmessage",MB_OK);
            if(packet->hdr.msg == MRIM_CS_MESSAGE_STATUS)
                {
                unsigned long tmppos = 0;
                unsigned long tmpdw = 0;
                #ifdef MRIM_DEBUG
                    PrintDebug("mrim_do_sendmessage: MRIM_CS_MESSAGE_STATUS received\n");
                #endif
                MRIM_Packet_GetLong(&tmppos,packet,&tmpdw);// status
                if(tmpdw == MESSAGE_DELIVERED)
                    {
                    #ifdef MRIM_DEBUG
                        PrintDebug("mrim_do_sendmessage: MRIM_CS_MESSAGE_STATUS(MESSAGE_DELIVERED) received\n");
                        PrintDebug("mrim_do_sendmessage: ok\n");
                    #endif
                    retval = 0;
                    }
                }
            }
        }
    free(packet);
    }
#ifdef MRIM_DEBUG
    PrintDebug("mrim_do_sendmessage: ended\n");
#endif
return(retval);
}
