# HG changeset patch # User Ma Yuan # Date 1153657150 0 # Node ID b99512bd6d852f7325cd8ebea44daa22cfb84c7c # Parent 23258253c7a0b67be4bb2e9578a371b31ec8a12f [gaim-migrate @ 16547] initial Good version, Can see others' online and offline status. Can chat. Some bug exist! Committed by MaYuan committer: Ethan Blanton diff -r 23258253c7a0 -r b99512bd6d85 src/protocols/msn/contact.c --- a/src/protocols/msn/contact.c Sun Jul 23 09:19:12 2006 +0000 +++ b/src/protocols/msn/contact.c Sun Jul 23 12:19:10 2006 +0000 @@ -28,6 +28,7 @@ #include "soap.h" #include "contact.h" #include "xmlnode.h" +#include "group.h" /*new a contact*/ MsnContact * @@ -220,6 +221,7 @@ xmlnode *groups,*group,*groupname,*groupId,*groupInfo; xmlnode *contacts,*contactNode,*contactId,*contactInfo,*contactType,*passportName,*displayName,*groupIds,*guid; xmlnode *ab; + char *group_name,*group_id; session = contact->session; gaim_debug_misc("xml","parse addressbook:{%s}\nsize:%d\n",contact->soapconn->body,contact->soapconn->body_len); @@ -236,43 +238,64 @@ gaim_debug_misc("xml","response{%p},name:%s\n",response,response->name); result =xmlnode_get_child(response,"ABFindAllResult"); gaim_debug_misc("xml","result{%p},name:%s\n",result,result->name); + + /*Process Group List*/ groups =xmlnode_get_child(result,"groups"); for(group = xmlnode_get_child(groups, "Group"); group; group = xmlnode_get_next_twin(group)){ - char * name,*group_id; - groupId = xmlnode_get_child(group,"groupId"); - group_id = xmlnode_get_data(groupId); - groupInfo = xmlnode_get_child(group,"groupInfo"); - groupname = xmlnode_get_child(groupInfo,"name"); - name = xmlnode_get_data(groupname); + groupId = xmlnode_get_child(group,"groupId"); + group_id = xmlnode_get_data(groupId); + groupInfo = xmlnode_get_child(group,"groupInfo"); + groupname = xmlnode_get_child(groupInfo,"name"); + group_name = xmlnode_get_data(groupname); - msn_group_new(session->userlist, group_id, name); + msn_group_new(session->userlist, group_id, group_name); + + if (group_id == NULL){ + /* Group of ungroupped buddies */ + continue; + } - if (group_id == NULL) - /* Group of ungroupped buddies */ - continue; + gaim_debug_misc("MsnContact","group_id:%s name:%s\n",group_id,group_name); + if ((gaim_find_group(group_name)) == NULL){ + GaimGroup *g = gaim_group_new(group_name); + gaim_blist_add_group(g, NULL); + } + } + /*add a default No group to set up the no group Membership*/ + group_id = g_strdup(MSN_INDIVIDUALS_GROUP_ID); + group_name = g_strdup(MSN_INDIVIDUALS_GROUP_NAME); + msn_group_new(session->userlist,group_id , group_name); + if (group_id != NULL){ + gaim_debug_misc("MsnContact","group_id:%s name:%s,value:%d\n",group_id,group_name,*group_name=='\0'); + if ((gaim_find_group(group_name)) == NULL){ + GaimGroup *g = gaim_group_new(group_name); + gaim_blist_add_group(g, NULL); + } + } + g_free(group_name); + g_free(group_id); - if ((gaim_find_group(name)) == NULL){ - GaimGroup *g = gaim_group_new(name); - gaim_blist_add_group(g, NULL); - } + /*add a default No group to set up the no group Membership*/ + group_id = g_strdup(MSN_NON_IM_GROUP_ID); + group_name = g_strdup(MSN_NON_IM_GROUP_NAME); + msn_group_new(session->userlist,group_id , group_name); + if (group_id != NULL){ + gaim_debug_misc("MsnContact","group_id:%s name:%s,value:%d\n",group_id,group_name,*group_name=='\0'); + if ((gaim_find_group(group_name)) == NULL){ + GaimGroup *g = gaim_group_new(group_name); + gaim_blist_add_group(g, NULL); + } + } + g_free(group_name); + g_free(group_id); - gaim_debug_misc("group","name:%s,Id:{%s}\n",name,group_id); - } - + /*Process contact List*/ contacts =xmlnode_get_child(result,"contacts"); for(contactNode = xmlnode_get_child(contacts, "Contact"); contactNode; contactNode = xmlnode_get_next_twin(contactNode)){ MsnUser *user; - xmlnode *messengerEnableNode; char *passport,*Name,*uid,*type; - char *messengerEnable; - - messengerEnableNode = xmlnode_get_child(contactNode,"isMessengerEnabled"); - messengerEnable = xmlnode_get_data(messengerEnableNode); - if(!g_strcasecmp(messengerEnable,"false")){ - continue; - } contactId= xmlnode_get_child(contactNode,"contactId"); uid = xmlnode_get_data(contactId); @@ -305,38 +328,42 @@ msn_user_set_type(user,msn_get_user_type(type)); user->list_op |= 1; + gaim_debug_misc("MsnContact","\n"); groupIds = xmlnode_get_child(contactInfo,"groupIds"); if(groupIds){ for(guid = xmlnode_get_child(groupIds, "guid");guid; guid = xmlnode_get_next_twin(guid)){ - char *group_id; - group_id = xmlnode_get_data(guid); msn_user_add_group_id(user,group_id); gaim_debug_misc("contact","guid:%s\n",group_id); } }else{ + group_id = g_strdup(MSN_INDIVIDUALS_GROUP_ID); + msn_user_add_group_id(user,group_id); + g_free(group_id); +#if 0 + /*not in any group,Then set default group*/ char *name,*group_id; name = g_strdup(MSN_INDIVIDUALS_GROUP_NAME); group_id = g_strdup(MSN_INDIVIDUALS_GROUP_ID); + gaim_debug_misc("MsnContact","group_id:%s name:%s\n",group_id,name); msn_user_add_group_id(user,group_id); msn_group_new(session->userlist, group_id, name); - if (group_id == NULL) - /* Group of ungroupped buddies */ - continue; - - if ((gaim_find_group(name)) == NULL){ + if (group_id != NULL){ + gaim_debug_misc("MsnContact","group_id:%s name:%s,value:%d\n",group_id,name,*name=='\0'); + if ((gaim_find_group(name)) == NULL){ GaimGroup *g = gaim_group_new(name); gaim_blist_add_group(g, NULL); + } } gaim_debug_misc("contact","guid is NULL\n"); g_free(name); g_free(group_id); - +#endif } } diff -r 23258253c7a0 -r b99512bd6d85 src/protocols/msn/group.h --- a/src/protocols/msn/group.h Sun Jul 23 09:19:12 2006 +0000 +++ b/src/protocols/msn/group.h Sun Jul 23 12:19:10 2006 +0000 @@ -40,9 +40,12 @@ #define MSN_GROUP_IDS "9e57e654-59f0-44d1-aedc-0a7500b7e51f" #define MSN_DELETE_GROUP_TEMPLATE "09607671-1C32-421F-A6A6-CBFAA51AB5F4falseTimerfalse00000000-0000-0000-0000-000000000000%s" -#define MSN_INDIVIDUALS_GROUP_ID "0" +#define MSN_INDIVIDUALS_GROUP_ID "123" #define MSN_INDIVIDUALS_GROUP_NAME "Other Contacts" +#define MSN_NON_IM_GROUP_ID "email" +#define MSN_NON_IM_GROUP_NAME "Non-IM Contacts" + /** * A group. */ diff -r 23258253c7a0 -r b99512bd6d85 src/protocols/msn/notification.c --- a/src/protocols/msn/notification.c Sun Jul 23 09:19:12 2006 +0000 +++ b/src/protocols/msn/notification.c Sun Jul 23 12:19:10 2006 +0000 @@ -713,6 +713,7 @@ GaimConnection *gc; MsnUser *user; MsnObject *msnobj; + int wlmclient; const char *state, *passport, *friendly; session = cmdproc->session; @@ -721,7 +722,8 @@ state = cmd->params[1]; passport = cmd->params[2]; - friendly = gaim_url_decode(cmd->params[3]); + wlmclient = atoi(cmd->params[3]); + friendly = gaim_url_decode(cmd->params[4]); user = msn_userlist_find_user(session->userlist, passport); @@ -729,8 +731,8 @@ msn_user_set_friendly_name(user, friendly); - if (session->protocol_ver >= 9 && cmd->param_count == 6){ - msnobj = msn_object_new_from_string(gaim_url_decode(cmd->params[5])); + if (session->protocol_ver >= 9 && cmd->param_count == 7){ + msnobj = msn_object_new_from_string(gaim_url_decode(cmd->params[6])); msn_user_set_object(user, msnobj); } @@ -762,6 +764,7 @@ MsnUser *user; MsnObject *msnobj; int clientid; + int wlmclient; const char *state, *passport, *friendly; session = cmdproc->session; @@ -770,7 +773,8 @@ state = cmd->params[0]; passport = cmd->params[1]; - friendly = gaim_url_decode(cmd->params[2]); + wlmclient = atoi(cmd->params[2]); + friendly = gaim_url_decode(cmd->params[3]); user = msn_userlist_find_user(session->userlist, passport); @@ -779,15 +783,15 @@ msn_user_set_friendly_name(user, friendly); if (session->protocol_ver >= 9){ - if (cmd->param_count == 5){ - msnobj = msn_object_new_from_string(gaim_url_decode(cmd->params[4])); + if (cmd->param_count == 6){ + msnobj = msn_object_new_from_string(gaim_url_decode(cmd->params[5])); msn_user_set_object(user, msnobj); }else{ msn_user_set_object(user, NULL); } } - clientid = atoi(cmd->params[3]); + clientid = atoi(cmd->params[4]); user->mobile = (clientid & MSN_CLIENT_CAP_MSNMOBILE); msn_user_set_state(user, state); diff -r 23258253c7a0 -r b99512bd6d85 src/protocols/msn/session.c --- a/src/protocols/msn/session.c Sun Jul 23 09:19:12 2006 +0000 +++ b/src/protocols/msn/session.c Sun Jul 23 12:19:10 2006 +0000 @@ -234,12 +234,15 @@ /* The core used to use msn_add_buddy to add all buddies before * being logged in. This no longer happens, so we manually iterate * over the whole buddy list to identify sync issues. */ - - for (gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { + for (gnode = gaim_get_blist()->root; gnode; gnode = gnode->next){ GaimGroup *group = (GaimGroup *)gnode; const char *group_name = group->name; if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) continue; + if(!g_strcasecmp(group_name, MSN_INDIVIDUALS_GROUP_NAME) + || !g_strcasecmp(group_name,MSN_NON_IM_GROUP_NAME)){ + continue; + } for(cnode = gnode->child; cnode; cnode = cnode->next) { if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) continue; @@ -248,7 +251,7 @@ if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) continue; b = (GaimBuddy *)bnode; - if(b->account == gc->account) { + if(b->account == gc->account){ MsnUser *remote_user; gboolean found = FALSE; @@ -256,11 +259,14 @@ remote_user = msn_userlist_find_user(session->userlist, b->name); if ((remote_user != NULL) && (remote_user->list_op & MSN_LIST_FL_OP)){ - char *group_id; + const char *group_id; GList *l; group_id = msn_userlist_find_group_id(remote_user->userlist, group_name); + if(group_id == NULL){ + continue; + } for (l = remote_user->group_ids; l != NULL; l = l->next){ if (!g_strcasecmp(group_id ,l->data)){ diff -r 23258253c7a0 -r b99512bd6d85 src/protocols/msn/user.c --- a/src/protocols/msn/user.c Sun Jul 23 09:19:12 2006 +0000 +++ b/src/protocols/msn/user.c Sun Jul 23 12:19:10 2006 +0000 @@ -261,9 +261,11 @@ group_name = msn_userlist_find_group_name(userlist, id); + gaim_debug_info("User","group id:%s,name:%s,user:%s\n",id,group_name,passport); + g = gaim_find_group(group_name); - if ((id == 0) && (g == NULL)){ + if ((id == NULL) && (g == NULL)){ g = gaim_group_new(group_name); gaim_blist_add_group(g, NULL); } diff -r 23258253c7a0 -r b99512bd6d85 src/protocols/msn/userlist.c --- a/src/protocols/msn/userlist.c Sun Jul 23 09:19:12 2006 +0000 +++ b/src/protocols/msn/userlist.c Sun Jul 23 12:19:10 2006 +0000 @@ -468,11 +468,13 @@ for (l = userlist->users; l != NULL; l = l->next){ MsnUser *user = (MsnUser *)l->data; - +// gaim_debug_info("MsnUserList","user passport:%s,passport:%s\n",user->passport,passport); g_return_val_if_fail(user->passport != NULL, NULL); - if (!g_strcasecmp(passport, user->passport)) + if (!g_strcasecmp(passport, user->passport)){ +// gaim_debug_info("MsnUserList","return:%p\n",user); return user; + } } return NULL; @@ -516,11 +518,10 @@ g_return_val_if_fail(userlist != NULL, NULL); g_return_val_if_fail(name != NULL, NULL); - for (l = userlist->groups; l != NULL; l = l->next) - { + for (l = userlist->groups; l != NULL; l = l->next){ MsnGroup *group = l->data; - if ((group->name != NULL) && !g_ascii_strcasecmp(name, group->name)) + if ((group->name != NULL) && !g_strcasecmp(name, group->name)) return group; }