Changeset 7f34ce2


Ignore:
Timestamp:
2010-08-11T23:03:33Z (9 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
ca7de3a
Parents:
523fb23
Message:

Get contact list/address book info. Next step: We have to send it back.
Seriously. Wish I were joking.

Location:
protocols/msn
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • protocols/msn/msn.c

    r523fb23 r7f34ce2  
    332332           user. */
    333333        return msn_set_display_name( ic, value ) ? value : NULL;
     334}
     335
     336static void msn_buddy_data_add( bee_user_t *bu )
     337{
     338        bu->data = g_new0( struct msn_buddy_data, 1 );
     339}
     340
     341static void msn_buddy_data_free( bee_user_t *bu )
     342{
     343        g_free( bu->data );
    334344}
    335345
     
    360370        ret->send_typing = msn_send_typing;
    361371        ret->handle_cmp = g_strcasecmp;
     372        ret->buddy_data_add = msn_buddy_data_add;
     373        ret->buddy_data_free = msn_buddy_data_free;
     374       
    362375        //ret->transfer_request = msn_ftp_transfer_request;
    363376
  • protocols/msn/msn.h

    r523fb23 r7f34ce2  
    149149        int (*exec_command) ( gpointer data, char **cmd, int count );
    150150        int (*exec_message) ( gpointer data, char *msg, int msglen, char **cmd, int count );
     151};
     152
     153typedef enum
     154{
     155        MSN_BUDDY_FL = 1,
     156        MSN_BUDDY_AL = 2,
     157        MSN_BUDDY_BL = 4,
     158        MSN_BUDDY_RL = 8,
     159        MSN_BUDDY_PL = 16,
     160} msn_buddy_flags_t;
     161
     162struct msn_buddy_data
     163{
     164        char *cid;
     165        msn_buddy_flags_t flags;
    151166};
    152167
  • protocols/msn/soap.c

    r523fb23 r7f34ce2  
    423423/* memlist: Fetching the membership list (NOT address book) */
    424424
    425 #if 0
    426 struct msn_soap_oim_send_data
    427 {
    428         char *to;
    429         char *msg;
    430         int number;
    431         int need_retry;
    432 };
    433 #endif
    434 
    435425static int msn_soap_memlist_build_request( struct msn_soap_req_data *soap_req )
    436426{
     427        struct msn_data *md = soap_req->ic->proto_data;
     428       
    437429        soap_req->url = g_strdup( SOAP_MEMLIST_URL );
    438430        soap_req->action = g_strdup( SOAP_MEMLIST_ACTION );
    439         soap_req->payload = g_strdup( SOAP_MEMLIST_PAYLOAD );
     431        soap_req->payload = g_markup_printf_escaped( SOAP_MEMLIST_PAYLOAD, md->tokens[1] );
    440432       
    441433        return 1;
    442434}
    443435
     436static xt_status msn_soap_memlist_member( struct xt_node *node, gpointer data )
     437{
     438        bee_user_t *bu;
     439        struct msn_buddy_data *bd;
     440        struct xt_node *p;
     441        char *role = NULL, *handle = NULL;
     442        struct msn_soap_req_data *soap_req = data;
     443        struct im_connection *ic = soap_req->ic;
     444       
     445        if( ( p = node->parent ) && ( p = p->parent ) &&
     446            ( p = xt_find_node( p->children, "MemberRole" ) ) )
     447                role = p->text;
     448       
     449        if( ( p = xt_find_node( node->children, "PassportName" ) ) )
     450                handle = p->text;
     451       
     452        if( !role || !handle ||
     453            !( ( bu = bee_user_by_handle( ic->bee, ic, handle ) ) ||
     454               ( bu = bee_user_new( ic->bee, ic, handle, 0 ) ) ) )
     455                return XT_HANDLED;
     456       
     457        bd = bu->data;
     458        if( strcmp( role, "Allow" ) == 0 )
     459                bd->flags |= MSN_BUDDY_AL;
     460        else if( strcmp( role, "Block" ) == 0 )
     461                bd->flags |= MSN_BUDDY_BL;
     462        else if( strcmp( role, "Reverse" ) == 0 )
     463                bd->flags |= MSN_BUDDY_RL;
     464        else if( strcmp( role, "Pending" ) == 0 )
     465                bd->flags |= MSN_BUDDY_PL;
     466       
     467        return XT_HANDLED;
     468}
     469
    444470static const struct xt_handler_entry msn_soap_memlist_parser[] = {
     471        { "Member", "Members", msn_soap_memlist_member },
    445472        { NULL,               NULL,     NULL                        }
    446473};
     
    448475static int msn_soap_memlist_handle_response( struct msn_soap_req_data *soap_req )
    449476{
    450         return 0;
     477        msn_soap_addressbook_request( soap_req->ic );
     478       
     479        return MSN_SOAP_OK;
    451480}
    452481
     
    463492                                         msn_soap_memlist_free_data );
    464493}
     494
     495
     496/* addressbook: Fetching the membership list (NOT address book) */
     497
     498static int msn_soap_addressbook_build_request( struct msn_soap_req_data *soap_req )
     499{
     500        struct msn_data *md = soap_req->ic->proto_data;
     501       
     502        soap_req->url = g_strdup( SOAP_ADDRESSBOOK_URL );
     503        soap_req->action = g_strdup( SOAP_ADDRESSBOOK_ACTION );
     504        soap_req->payload = g_markup_printf_escaped( SOAP_ADDRESSBOOK_PAYLOAD, md->tokens[1] );
     505       
     506        return 1;
     507}
     508
     509static xt_status msn_soap_addressbook_group( struct xt_node *node, gpointer data )
     510{
     511        struct xt_node *p;
     512        char *id = NULL, *name = NULL;
     513        struct msn_soap_req_data *soap_req = data;
     514        struct im_connection *ic = soap_req->ic;
     515       
     516        if( ( p = node->parent ) &&
     517            ( p = xt_find_node( p->children, "groupId" ) ) )
     518                id = p->text;
     519       
     520        if( ( p = xt_find_node( node->children, "name" ) ) )
     521                name = p->text;
     522       
     523        printf( "%s %s\n", id, name );
     524       
     525        return XT_HANDLED;
     526}
     527
     528static xt_status msn_soap_addressbook_contact( struct xt_node *node, gpointer data )
     529{
     530        bee_user_t *bu;
     531        struct msn_buddy_data *bd;
     532        struct xt_node *p;
     533        char *id = NULL, *type = NULL, *handle = NULL, *display_name = NULL;
     534        struct msn_soap_req_data *soap_req = data;
     535        struct im_connection *ic = soap_req->ic;
     536       
     537        if( ( p = node->parent ) &&
     538            ( p = xt_find_node( p->children, "contactId" ) ) )
     539                id = p->text;
     540        if( ( p = xt_find_node( node->children, "contactType" ) ) )
     541                type = p->text;
     542        if( ( p = xt_find_node( node->children, "passportName" ) ) )
     543                handle = p->text;
     544        if( ( p = xt_find_node( node->children, "displayName" ) ) )
     545                display_name = p->text;
     546       
     547        if( type && g_strcasecmp( type, "me" ) == 0 )
     548        {
     549                set_t *set = set_find( &ic->acc->set, "display_name" );
     550                g_free( set->value );
     551                set->value = g_strdup( display_name );
     552               
     553                return XT_HANDLED;
     554        }
     555       
     556        if( !( bu = bee_user_by_handle( ic->bee, ic, handle ) ) &&
     557            !( bu = bee_user_new( ic->bee, ic, handle, 0 ) ) )
     558                return XT_HANDLED;
     559       
     560        bd = bu->data;
     561        bd->flags |= MSN_BUDDY_FL;
     562        g_free( bd->cid );
     563        bd->cid = g_strdup( id );
     564       
     565        imcb_rename_buddy( ic, handle, display_name );
     566       
     567        printf( "%s %s %s %s\n", id, type, handle, display_name );
     568       
     569        return XT_HANDLED;
     570}
     571
     572static const struct xt_handler_entry msn_soap_addressbook_parser[] = {
     573        { "contactInfo", "Contact", msn_soap_addressbook_contact },
     574        { "groupInfo", "Group", msn_soap_addressbook_group },
     575        { NULL,               NULL,     NULL                        }
     576};
     577
     578static int msn_soap_addressbook_handle_response( struct msn_soap_req_data *soap_req )
     579{
     580        return MSN_SOAP_OK;
     581}
     582
     583static int msn_soap_addressbook_free_data( struct msn_soap_req_data *soap_req )
     584{
     585        return 0;
     586}
     587
     588int msn_soap_addressbook_request( struct im_connection *ic )
     589{
     590        return msn_soap_start( ic, NULL, msn_soap_addressbook_build_request,
     591                                         msn_soap_addressbook_parser,
     592                                         msn_soap_addressbook_handle_response,
     593                                         msn_soap_addressbook_free_data );
     594}
  • protocols/msn/soap.h

    r523fb23 r7f34ce2  
    152152
    153153
    154 #define SOAP_MEMLIST_URL "https://byrdr.omega.contacts.msn.com/abservice/SharingService.asmx"
     154#define SOAP_MEMLIST_URL "http://contacts.msn.com/abservice/SharingService.asmx"
    155155#define SOAP_MEMLIST_ACTION "http://www.msn.com/webservices/AddressBook/FindMembership"
    156156
     
    166166    "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">" \
    167167      "<ManagedGroupRequest xmlns=\"http://www.msn.com/webservices/AddressBook\">false</ManagedGroupRequest>" \
     168      "<TicketToken>%s</TicketToken>" \
    168169    "</ABAuthHeader>" \
    169170  "</soap:Header>" \
     
    177178
    178179
     180#define SOAP_ADDRESSBOOK_URL "http://contacts.msn.com/abservice/abservice.asmx"
     181#define SOAP_ADDRESSBOOK_ACTION "http://www.msn.com/webservices/AddressBook/ABFindAll"
     182
     183#define SOAP_ADDRESSBOOK_PAYLOAD \
     184"<?xml version=\"1.0\" encoding=\"utf-8\"?>" \
     185"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">" \
     186  "<soap:Header>" \
     187    "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">" \
     188      "<ApplicationId>CFE80F9D-180F-4399-82AB-413F33A1FA11</ApplicationId>" \
     189      "<IsMigration>false</IsMigration>" \
     190      "<PartnerScenario>Initial</PartnerScenario>" \
     191    "</ABApplicationHeader>" \
     192    "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">" \
     193      "<ManagedGroupRequest>false</ManagedGroupRequest>" \
     194      "<TicketToken>%s</TicketToken>" \
     195    "</ABAuthHeader>" \
     196  "</soap:Header>" \
     197  "<soap:Body>" \
     198    "<ABFindAll xmlns=\"http://www.msn.com/webservices/AddressBook\">" \
     199      "<abId>00000000-0000-0000-0000-000000000000</abId>" \
     200      "<abView>Full</abView>" \
     201      "<deltasOnly>false</deltasOnly>" \
     202      "<lastChange>0001-01-01T00:00:00.0000000-08:00</lastChange>" \
     203    "</ABFindAll>" \
     204  "</soap:Body>" \
     205"</soap:Envelope>"
     206
     207int msn_soap_addressbook_request( struct im_connection *ic );
     208
     209
    179210#endif /* __SOAP_H__ */
Note: See TracChangeset for help on using the changeset viewer.