/*

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_modify(unsigned long number,unsigned char *address,unsigned long flags,unsigned long groupid,unsigned char *name)
{
//    * Пакет: Изменение контакта
//
//      Имя пакета: MRIM_CS_MODIFY_CONTACT
//      Тип пакета: cs
//      Параметры:
//
//      UL ## id ## номер модифицируемого контакта
//      UL ## flags ##
//          CONTACT_FLAG_GROUP ## Добавляется новая группа, а не контакт (несовместим с остальными). Верхний байт содержит количество уже имеющихся групп в контакт-листе
//          CONTACT_FLAG_INVISIBLE ## Контакт должен попасть в список "Я всегда невидим для"
//          CONTACT_FLAG_VISIBLE ## Контакт должен попасть в список "Я всегда видим для"
//          CONTACT_FLAG_IGNORE ## Контакт должен попасть в список игнорируемых
//          CONTACT_FLAG_SHADOW ## Контакт не должен попасть в основной контакт-лист (применяется в паре с одним из трех предыдущих)
//          CONTACT_FLAG_REMOVED ## Контакт удален
//      UL ## group_id ## Равно 0 для группы
//      LPS ## contact ## Если группа, то имя группы
//      LPS ## name ## Если группа, то имя группы
//
//      Описание: Параметры те же, что и у MRIM_CS_ADD_CONTACT. contact до и после изменения обязаны совпадать.
//    * Пакет: Подтверждение изменения контакта
//
//      Имя пакета: MRIM_CS_MODIFY_CONTACT_ACK
//      Тип пакета: sc
//      Параметры:
//
//      UL ## status ## Результат операции. Значения имеют тот же смысл, что и в MRIM_CS_ADD_CONTACT_ACK
//          CONTACT_OPER_SUCCESS ## добавление произведено успешно
//          CONTACT_OPER_ERROR ## переданные данные были некорректны
//          CONTACT_OPER_INTERR ## при обработке запроса произошла внутренняя ошибка
//          CONTACT_OPER_NO_SUCH_USER ## добавляемого пользователя не существует в системе
//          CONTACT_OPER_INVALID_INFO ## некорректное имя пользователя
//          CONTACT_OPER_USER_EXISTS ## пользователь уже есть в контакт-листе
//          CONTACT_OPER_GROUP_LIMIT ## превышено максимально допустимое количество групп (20)
//
struct _int_packet
    {
    mrim_packet_header_t hdr;
    unsigned char parameters[4096];
    };
unsigned long seq;
struct _int_packet *packet;
unsigned long retval = 1;

#ifdef MRIM_DEBUG
    PrintDebug("mrim_do_modify: started\n");
#endif
if((packet=(struct _int_packet*)malloc(sizeof(struct _int_packet))) != NULL)
    {
    packet->hdr.magic = CS_MAGIC;
    packet->hdr.proto = PROTO_VERSION;
    packet->hdr.seq = seq = GetSequenceNext();
    packet->hdr.msg = MRIM_CS_MODIFY_CONTACT;
    packet->hdr.dlen = 0;
    packet->hdr.from = 0;
    packet->hdr.fromport = 0;

    #ifdef MRIM_DEBUG
        PrintDebug("mrim_do_modify: malloc() ok\n");
    #endif
    //CODEBLOCK
    //    {
    //    sprintf(packet->parameters,
    //        "Number=%lu\r\nFlags=%8.08X\r\ngroupid=%lu\r\nAddress=%s\r\nName=%s\r\n",
    //        number,flags,groupid,address,name);
    //    MessageBox(NULL,packet->parameters,"MRIM_do_modify()",MB_OK);
    //    }
    MRIM_Packet_AddLong(packet,number);
    MRIM_Packet_AddLong(packet,flags);
    MRIM_Packet_AddLong(packet,groupid);
    MRIM_Packet_AddString(packet,address);
    MRIM_Packet_AddString(packet,name);
    MRIM_Packet_AddLong(packet,0);//??

    if(MRIM_sendpacket(packet) == 0)
        {
        #ifdef MRIM_DEBUG
            PrintDebug("mrim_do_modify: MRIM_CS_MODIFY_CONTACT(%lu,%lu,%lu,%s,%s) sended\n",number,flags,groupid,address,name);
        #endif
        //MessageBox(NULL,"Send packet ok","MRIM_do_modify",MB_OK);
        if(MRIM_receivepacket(packet,sizeof(struct _int_packet),seq,MRIM_GetTimeout()) == 0)
            {
            #ifdef MRIM_DEBUG
                PrintDebug("mrim_do_modify: packet received\n");
            #endif
            //MessageBox(NULL,"receive packet ok","MRIM_do_modify",MB_OK);
            if(packet->hdr.msg == MRIM_CS_MODIFY_CONTACT_ACK)
                {
                unsigned long tmppos = 0;
                unsigned long tmpdw = 0;
                #ifdef MRIM_DEBUG
                    PrintDebug("mrim_do_modify: MRIM_CS_MODIFY_CONTACT_ACK received\n");
                #endif
                if(MRIM_Packet_GetLong(&tmppos,&packet,&tmpdw) == 0)// status
                    if(tmpdw == CONTACT_OPER_SUCCESS)
                        {
                        #ifdef MRIM_DEBUG
                            PrintDebug("mrim_do_modify: MRIM_CS_MODIFY_CONTACT_ACK(CONTACT_OPER_SUCCESS)\n");
                            PrintDebug("mrim_do_modify: ok\n");
                        #endif
                        retval = 0;
                        }
                }
            }
        }
    free(packet);
    }
#ifdef MRIM_DEBUG
    PrintDebug("mrim_do_modify: ended\n");
#endif
return(retval);
}
