/*

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 char *MRIM_do_getinfo(unsigned char *address)
{
//    * Пакет: Поиск контакта
//
//      Имя пакета: MRIM_CS_WP_REQUEST
//      Тип пакета: cs
//      Параметры:
//
//      UL ## field ## параметр поиска ##
//
//      MRIM_CS_WP_REQUEST_PARAM_USER ## логин (без домена), обязан комбинироваться с доменом
//      MRIM_CS_WP_REQUEST_PARAM_DOMAIN ## почтовый домен
//      MRIM_CS_WP_REQUEST_PARAM_NICKNAME ## ник
//      MRIM_CS_WP_REQUEST_PARAM_FIRSTNAME ## имя
//      MRIM_CS_WP_REQUEST_PARAM_LASTNAME ## фамилия, * в конце ника/имени/фамилии указывает на возможность любого продолжения имени
//      MRIM_CS_WP_REQUEST_PARAM_SEX ## пол. 1 - мужской, 2 - женский
//      MRIM_CS_WP_REQUEST_PARAM_DATE1 ## минимальный возраст (в годах)
//      MRIM_CS_WP_REQUEST_PARAM_DATE2 ## максимальный возраст (в годах)
//      MRIM_CS_WP_REQUEST_PARAM_CITY_ID ## ID региона проживания
//      MRIM_CS_WP_REQUEST_PARAM_ZODIAC ## Знак зодиака (Овен - 1, ..., Рыбы - 12)
//      MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_MONTH ## Месяц рождения (Январь - 1, ..., Декабрь - 12)
//      MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_DAY ## День рождения (обязан комбинироваться с месяцем рождения)
//      MRIM_CS_WP_REQUEST_PARAM_COUNTRY_ID ## ID страны проживания
//      MRIM_CS_WP_REQUEST_PARAM_ONLINE ## ищем ли мы только подключенных в данный момент пользователей (1)
//
//      LPS ## value все параметры в строковом формате, включая числа
//
//      Описание: Поиск контактов в базе агента. Параметры поиска передаются парами
//                параметр-значение. Передача нескольких параметров имеет семантику
//                "и", т. е. все найденные результаты должны соответствовать всем
//                переданным параметрам. Комбинироваться могут все параметры за
//                исключением логина и домена (они обязаны идти парой и не могут
//                комбинироваться с другими параметрами) в порядке соответствующем
//                порядку описания (за исключением требования для
//                MRIM_CS_WP_REQUEST_PARAM_ONLINE быть последним в списке).
//    * Пакет: Найденные пользователи
//
//      Имя пакета: MRIM_CS_ANKETA_INFO
//      Тип пакета: cs
//      Параметры:
//
//      UL ## status ## успешность запроса ##
//
//      MRIM_ANKETA_INFO_STATUS_OK ## поиск успешно завершен
//      MRIM_ANKETA_INFO_STATUS_NOUSER ## не найдено ни одной подходящей записи
//      MRIM_ANKETA_INFO_STATUS_RATELIMERR ## слишком много запросов, поиск временно запрещен
//
//      UL ## fields_num ## количество полей в анкете каждого пользователя
//      UL ## max_rows ## текущее ограничение на количество результатов поиска (может быть больше, чем количество строк в данном ответе)
//      UL ## server_time ## текущее время на сервере (должно использоваться для вычисления возраста). Формат времени: Количество секунд с 00:00:00 1 января 1970 года.
//      LPS, LPS, ... ## fields ## названия полей текущей анкеты (всего fields_num штук)
//      LPS, LPS, ... ## values ## значения полей анкеты для каждого найденного по запросу пользователя в том же порядке, что в списке полей, по fields_num штук на каждого
//
//      Описание: Результат поиска контактов. Возвращает анкеты найденных пользователей
//                (их адреса являются полями анкеты).

struct _int_packet
    {
    mrim_packet_header_t hdr;
    unsigned char data[1024];
    };
unsigned long seq;
unsigned char *login;
unsigned char *domain;
struct _int_packet *packet;
unsigned char *retval = NULL;
unsigned char *cptr = NULL;

if((packet=(struct _int_packet*)malloc(sizeof(struct _int_packet))) != NULL)
    {
    login = &(packet->data[50]);
    strcpy(login,address);
    if((domain=strchr(login,'@')) != NULL)
        {
        domain[0] = 0;
        domain++;
        packet->hdr.magic = CS_MAGIC;
        packet->hdr.proto = PROTO_VERSION;
        packet->hdr.seq = seq = GetSequenceNext();
        packet->hdr.msg = MRIM_CS_WP_REQUEST;
        packet->hdr.dlen = 0;
        packet->hdr.from = 0;
        packet->hdr.fromport = 0;
        MRIM_Packet_AddLong(packet,MRIM_CS_WP_REQUEST_PARAM_USER);
        MRIM_Packet_AddString(packet,login);
        MRIM_Packet_AddLong(packet,MRIM_CS_WP_REQUEST_PARAM_DOMAIN);
        MRIM_Packet_AddString(packet,domain);

        if(MRIM_sendpacket(packet) == 0)
            {
            if(MRIM_receivepacket(packet,sizeof(struct _int_packet),seq,MRIM_GetTimeout()) == 0)
                {
                if(packet->hdr.msg == MRIM_CS_ANKETA_INFO)
                    {
                    unsigned long tmppos = 0;
                    unsigned long tmpposn;
                    unsigned long tmpdw;
                    unsigned long fields_num;
                    if(MRIM_Packet_GetLong(&tmppos,packet,&tmpdw) == 0)// status
                        {
                        if(tmpdw == MRIM_ANKETA_INFO_STATUS_OK)
                            {
                            if(MRIM_Packet_GetLong(&tmppos,packet,&fields_num) == 0)
                                {
                                if(MRIM_Packet_GetLong(&tmppos,packet,&tmpdw) == 0)//max_rows
                                    {
                                    if(MRIM_Packet_GetLong(&tmppos,packet,&tmpdw) == 0)//server_time
                                        {
                                        if((retval=malloc(packet->hdr.dlen)) != NULL)
                                            {
                                            cptr = retval;
                                            tmpposn = tmppos;
                                            for(tmpdw=0;tmpdw<fields_num;tmpdw++)//read filed names
                                                {
                                                if(MRIM_Packet_GetString(&tmppos,packet,cptr) != 0)
                                                    {
                                                    free(retval);
                                                    cptr = retval = NULL;
                                                    goto _endloop_;
                                                    }
                                                }
                                            for(tmpdw=0;tmpdw<fields_num;tmpdw++)//read filed names & values
                                                {
                                                //read name
                                                if(MRIM_Packet_GetString(&tmpposn,packet,cptr) != 0)
                                                    {
                                                    free(retval);
                                                    cptr = retval = NULL;
                                                    goto _endloop_;
                                                    }
                                                while(cptr[0] != 0)cptr++;
                                                cptr++;
                                                //read value
                                                if(MRIM_Packet_GetString(&tmppos,packet,cptr) != 0)
                                                    {
                                                    free(retval);
                                                    cptr = retval = NULL;
                                                    goto _endloop_;
                                                    }
                                                while(cptr[0] != 0)cptr++;
                                                cptr++;
                                                }
                                            _endloop_:;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    free(packet);
    }
if(cptr != NULL)
    {
    cptr[0] = 0;
    cptr[1] = 0;
    cptr[2] = 0;
    }
return(retval);
}

int MRIM_GetInfo(WPARAM wParam,LPARAM lParam)
{
CCSDATA* ccs = (CCSDATA*)lParam;
DBVARIANT dbv;
DBCONTACTGETSETTING cgs;
unsigned char *contactinfo;

if(ccs != NULL)
    {
    cgs.szModule = ProtoName;
    cgs.szSetting = DB_SETTING_EMAIL;
    cgs.pValue = &dbv;
    if(CallService(MS_DB_CONTACT_GETSETTING,(WPARAM)(ccs->hContact),(LPARAM)&cgs) == 0)
        {
        //MessageBox(NULL,"called","GetInfo",MB_OK);
        DBWriteContactSettingString(ccs->hContact,ProtoName,"e-mail",dbv.pszVal);
        if((contactinfo=MRIM_do_getinfo(dbv.pszVal)) != NULL)
            {
            unsigned char *name;
            unsigned char *val;
            unsigned char *cptr;

            cptr = contactinfo;
            while(cptr[0] != 0)
                {
                name = cptr;
                while(cptr[0] != 0)cptr++;
                cptr++;
                val = cptr;
                while(cptr[0] != 0)cptr++;
                // record to database
                if(strcmp(name,"FirstName") == 0)
                    {
                    DBWriteContactSettingString(ccs->hContact,ProtoName,name,val);
                    }
                else if(strcmp(name,"LastName") == 0)
                    {
                    DBWriteContactSettingString(ccs->hContact,ProtoName,name,val);
                    }
                else if(strcmp(name,"Location") == 0)
                    {
                    DBWriteContactSettingString(ccs->hContact,ProtoName,name,val);
                    }
                else if(strcmp(name,"Nickname") == 0)
                    {
                    DBWriteContactSettingString(ccs->hContact,ProtoName,"Nick",val);
                    }
                else if(strcmp(name,"Phone") == 0)
                    {
                    DBWriteContactSettingString(ccs->hContact,ProtoName,name,val);
                    }
                else if(strcmp(name,"BDay") == 0)
                    {
                    DBWriteContactSettingByte(ccs->hContact,ProtoName,"BirthDay",atoi(val));
                    }
                else if(strcmp(name,"BMonth") == 0)
                    {
                    DBWriteContactSettingByte(ccs->hContact,ProtoName,"BirthMonth",atoi(val));
                    }
                else if(strcmp(name,"Birthday") == 0)
                    {
                    unsigned long y,m,d;
                    //MessageBox(NULL,val,"Birthday",MB_OK);
                    if(sscanf(val,"%lu-%lu-%lu",&y,&m,&d) == 3)
                        {
                        //MessageBox(NULL,"sscanf() ok","Birthday",MB_OK);
                        DBWriteContactSettingWord(ccs->hContact,ProtoName,"BirthYear",y);
                        DBWriteContactSettingByte(ccs->hContact,ProtoName,"BirthMonth",m);
                        DBWriteContactSettingByte(ccs->hContact,ProtoName,"BirthDay",d);
                        }
                    }
                else if(strcmp(name,"Sex") == 0)
                    {
                    if(strcmp(val,"1") == 0)DBWriteContactSettingByte(ccs->hContact,ProtoName,"Gender",77);//male
                    else if(strcmp(val,"2") == 0)DBWriteContactSettingByte(ccs->hContact,ProtoName,"Gender",70);//female
                    else DBWriteContactSettingByte(ccs->hContact,ProtoName,"Gender",0);//???
                    }
                else if(strcmp(name,"Zodiac") == 0)DBWriteContactSettingString(ccs->hContact,ProtoName,name,val);
                else if(strcmp(name,"City_id") == 0)DBWriteContactSettingString(ccs->hContact,ProtoName,name,val);
                else if(strcmp(name,"Country_id") == 0)DBWriteContactSettingString(ccs->hContact,ProtoName,name,val);
                //else if(strcmp(name,"Username") == 0)DBWriteContactSettingString(ccs->hContact,ProtoName,name,val);
                //else if(strcmp(name,"Domain") == 0)DBWriteContactSettingString(ccs->hContact,ProtoName,name,val);
                cptr++;
                }
            ProtoBroadcastAck(ProtoName,ccs->hContact,ACKTYPE_GETINFO,ACKRESULT_SUCCESS,(HANDLE)1,0);
            free(contactinfo);
            }
        else{
            ProtoBroadcastAck(ProtoName,ccs->hContact,ACKTYPE_GETINFO,ACKRESULT_FAILED,(HANDLE)1,0);
            }
        DBFreeVariant(&dbv);
        return(0);
        }
    }
return(1);
}
