Mercurial > pidgin.yaz
diff libpurple/protocols/msn/session.c @ 20418:0f6747c5dcc2
propagate from branch 'im.pidgin.pidgin' (head b0fb787915db137be9b01af88d1fb0c107f66cd6)
to branch 'im.pidgin.cpw.khc.msnp14' (head b26eeab8d7655cb97d30c814bd37041707f692df)
author | Stu Tomlinson <stu@nosnilmot.com> |
---|---|
date | Sun, 20 May 2007 15:48:51 +0000 |
parents | d92776c252b8 7c0a2ef88018 |
children | 703fc3437ab5 |
line wrap: on
line diff
--- a/libpurple/protocols/msn/session.c Sun May 20 15:09:59 2007 +0000 +++ b/libpurple/protocols/msn/session.c Sun May 20 15:48:51 2007 +0000 @@ -42,8 +42,11 @@ session->user = msn_user_new(session->userlist, purple_account_get_username(account), NULL); - - session->protocol_ver = 9; + session->bnode = NULL; + + /*if you want to chat with Yahoo Messenger*/ + //session->protocol_ver = WLM_YAHOO_PROT_VER; + session->protocol_ver = WLM_PROT_VER; session->conv_seq = 1; return session; @@ -70,6 +73,8 @@ msn_userlist_destroy(session->userlist); + g_free(session->passport_info.t); + g_free(session->passport_info.p); g_free(session->passport_info.kv); g_free(session->passport_info.sid); g_free(session->passport_info.mspauth); @@ -87,6 +92,11 @@ if (session->nexus != NULL) msn_nexus_destroy(session->nexus); + if (session->contact != NULL) + msn_contact_destroy(session->contact); + if (session->oim != NULL) + msn_oim_destroy(session->oim); + if (session->user != NULL) msn_user_destroy(session->user); @@ -154,6 +164,38 @@ return NULL; } +/*get the conversation*/ +PurpleConversation * +msn_session_get_conv(MsnSession *session,const char *passport) +{ + PurpleAccount *account; + PurpleConversation * conv; + + g_return_val_if_fail(session != NULL, NULL); + account = session->account; + + conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, + passport, account); + if(conv == NULL){ + conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, passport); + } + return conv; +} + +/* put Message to User Conversation + * + * passport - the one want to talk to you + */ +void +msn_session_report_user(MsnSession *session,const char *passport,char *msg,PurpleMessageFlags flags) +{ + PurpleConversation * conv; + + if ((conv = msn_session_get_conv(session,passport)) != NULL){ + purple_conversation_write(conv, NULL, msg, flags, time(NULL)); + } +} + MsnSwitchBoard * msn_session_find_swboard_with_conv(MsnSession *session, PurpleConversation *conv) { @@ -219,6 +261,51 @@ return swboard; } +/*setup the bnode, for MSN SOAP contact/address book op*/ +void +msn_session_set_bnode(MsnSession *session) +{ + PurpleBlistNode *gnode, *cnode, *bnode; + PurpleConnection *gc = purple_account_get_connection(session->account); + + g_return_if_fail(gc != NULL); + + /* 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 = purple_get_blist()->root; gnode; gnode = gnode->next) + { + if(!PURPLE_BLIST_NODE_IS_GROUP(gnode)) + continue; + for(cnode = gnode->child; cnode; cnode = cnode->next) { + if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) + continue; + for(bnode = cnode->child; bnode; bnode = bnode->next) { + PurpleBuddy *b; + if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) + continue; + b = (PurpleBuddy *)bnode; + if(b->account == gc->account){ + session->bnode = bnode; + return; + } + } + } + } + session->bnode = NULL; +} + +/*get bnode*/ +PurpleBlistNode * +msn_session_get_bnode(MsnSession *session) +{ +#if 1 + return session->bnode; +#else + return purple_get_blist()->root; +#endif +} + static void msn_session_sync_users(MsnSession *session) { @@ -229,13 +316,17 @@ /* 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 = purple_blist_get_root(); gnode; gnode = gnode->next) { + * over the whole buddy list to identify sync issues. + */ + for (gnode = purple_get_blist()->root; gnode; gnode = gnode->next) { PurpleGroup *group = (PurpleGroup *)gnode; const char *group_name = group->name; if(!PURPLE_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(!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) continue; @@ -252,28 +343,33 @@ if ((remote_user != NULL) && (remote_user->list_op & MSN_LIST_FL_OP)) { - int group_id; + const char *group_id; GList *l; + purple_debug_info("MaYuan","remote user:{%s}\n",b->name); group_id = msn_userlist_find_group_id(remote_user->userlist, group_name); + if(group_id == NULL){ + continue; + } + purple_debug_info("MaYuan","group_id:{%s}\n",group_id); for (l = remote_user->group_ids; l != NULL; l = l->next) { - if (group_id == GPOINTER_TO_INT(l->data)) + purple_debug_info("MaYuan","l->data:{%s}\n",l->data); + if (!g_strcasecmp(group_id ,l->data)) { found = TRUE; break; } } - } if (!found) { /* The user was not on the server list or not in that group * on the server list */ - msn_show_sync_issue(session, purple_buddy_get_name(b), group_name); + msn_show_sync_issue(session, b->name, group_name); } } } @@ -410,3 +506,4 @@ */ msn_cmdproc_send(session->notification->cmdproc, "URL", "%s", "INBOX"); } +