comparison 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
comparison
equal deleted inserted replaced
17197:c2ecc135867d 20418:0f6747c5dcc2
40 session->notification = msn_notification_new(session); 40 session->notification = msn_notification_new(session);
41 session->userlist = msn_userlist_new(session); 41 session->userlist = msn_userlist_new(session);
42 42
43 session->user = msn_user_new(session->userlist, 43 session->user = msn_user_new(session->userlist,
44 purple_account_get_username(account), NULL); 44 purple_account_get_username(account), NULL);
45 45 session->bnode = NULL;
46 session->protocol_ver = 9; 46
47 /*if you want to chat with Yahoo Messenger*/
48 //session->protocol_ver = WLM_YAHOO_PROT_VER;
49 session->protocol_ver = WLM_PROT_VER;
47 session->conv_seq = 1; 50 session->conv_seq = 1;
48 51
49 return session; 52 return session;
50 } 53 }
51 54
68 while (session->slplinks != NULL) 71 while (session->slplinks != NULL)
69 msn_slplink_destroy(session->slplinks->data); 72 msn_slplink_destroy(session->slplinks->data);
70 73
71 msn_userlist_destroy(session->userlist); 74 msn_userlist_destroy(session->userlist);
72 75
76 g_free(session->passport_info.t);
77 g_free(session->passport_info.p);
73 g_free(session->passport_info.kv); 78 g_free(session->passport_info.kv);
74 g_free(session->passport_info.sid); 79 g_free(session->passport_info.sid);
75 g_free(session->passport_info.mspauth); 80 g_free(session->passport_info.mspauth);
76 g_free(session->passport_info.client_ip); 81 g_free(session->passport_info.client_ip);
77 82
85 msn_sync_destroy(session->sync); 90 msn_sync_destroy(session->sync);
86 91
87 if (session->nexus != NULL) 92 if (session->nexus != NULL)
88 msn_nexus_destroy(session->nexus); 93 msn_nexus_destroy(session->nexus);
89 94
95 if (session->contact != NULL)
96 msn_contact_destroy(session->contact);
97 if (session->oim != NULL)
98 msn_oim_destroy(session->oim);
99
90 if (session->user != NULL) 100 if (session->user != NULL)
91 msn_user_destroy(session->user); 101 msn_user_destroy(session->user);
92 102
93 g_free(session); 103 g_free(session);
94 } 104 }
150 if ((swboard->im_user != NULL) && !strcmp(username, swboard->im_user)) 160 if ((swboard->im_user != NULL) && !strcmp(username, swboard->im_user))
151 return swboard; 161 return swboard;
152 } 162 }
153 163
154 return NULL; 164 return NULL;
165 }
166
167 /*get the conversation*/
168 PurpleConversation *
169 msn_session_get_conv(MsnSession *session,const char *passport)
170 {
171 PurpleAccount *account;
172 PurpleConversation * conv;
173
174 g_return_val_if_fail(session != NULL, NULL);
175 account = session->account;
176
177 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM,
178 passport, account);
179 if(conv == NULL){
180 conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, passport);
181 }
182 return conv;
183 }
184
185 /* put Message to User Conversation
186 *
187 * passport - the one want to talk to you
188 */
189 void
190 msn_session_report_user(MsnSession *session,const char *passport,char *msg,PurpleMessageFlags flags)
191 {
192 PurpleConversation * conv;
193
194 if ((conv = msn_session_get_conv(session,passport)) != NULL){
195 purple_conversation_write(conv, NULL, msg, flags, time(NULL));
196 }
155 } 197 }
156 198
157 MsnSwitchBoard * 199 MsnSwitchBoard *
158 msn_session_find_swboard_with_conv(MsnSession *session, PurpleConversation *conv) 200 msn_session_find_swboard_with_conv(MsnSession *session, PurpleConversation *conv)
159 { 201 {
217 swboard->flag |= flag; 259 swboard->flag |= flag;
218 260
219 return swboard; 261 return swboard;
220 } 262 }
221 263
222 static void 264 /*setup the bnode, for MSN SOAP contact/address book op*/
223 msn_session_sync_users(MsnSession *session) 265 void
266 msn_session_set_bnode(MsnSession *session)
224 { 267 {
225 PurpleBlistNode *gnode, *cnode, *bnode; 268 PurpleBlistNode *gnode, *cnode, *bnode;
226 PurpleConnection *gc = purple_account_get_connection(session->account); 269 PurpleConnection *gc = purple_account_get_connection(session->account);
227 270
228 g_return_if_fail(gc != NULL); 271 g_return_if_fail(gc != NULL);
229 272
230 /* The core used to use msn_add_buddy to add all buddies before 273 /* The core used to use msn_add_buddy to add all buddies before
231 * being logged in. This no longer happens, so we manually iterate 274 * being logged in. This no longer happens, so we manually iterate
232 * over the whole buddy list to identify sync issues. */ 275 * over the whole buddy list to identify sync issues. */
233 276 for (gnode = purple_get_blist()->root; gnode; gnode = gnode->next)
234 for (gnode = purple_blist_get_root(); gnode; gnode = gnode->next) { 277 {
278 if(!PURPLE_BLIST_NODE_IS_GROUP(gnode))
279 continue;
280 for(cnode = gnode->child; cnode; cnode = cnode->next) {
281 if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
282 continue;
283 for(bnode = cnode->child; bnode; bnode = bnode->next) {
284 PurpleBuddy *b;
285 if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
286 continue;
287 b = (PurpleBuddy *)bnode;
288 if(b->account == gc->account){
289 session->bnode = bnode;
290 return;
291 }
292 }
293 }
294 }
295 session->bnode = NULL;
296 }
297
298 /*get bnode*/
299 PurpleBlistNode *
300 msn_session_get_bnode(MsnSession *session)
301 {
302 #if 1
303 return session->bnode;
304 #else
305 return purple_get_blist()->root;
306 #endif
307 }
308
309 static void
310 msn_session_sync_users(MsnSession *session)
311 {
312 PurpleBlistNode *gnode, *cnode, *bnode;
313 PurpleConnection *gc = purple_account_get_connection(session->account);
314
315 g_return_if_fail(gc != NULL);
316
317 /* The core used to use msn_add_buddy to add all buddies before
318 * being logged in. This no longer happens, so we manually iterate
319 * over the whole buddy list to identify sync issues.
320 */
321 for (gnode = purple_get_blist()->root; gnode; gnode = gnode->next) {
235 PurpleGroup *group = (PurpleGroup *)gnode; 322 PurpleGroup *group = (PurpleGroup *)gnode;
236 const char *group_name = group->name; 323 const char *group_name = group->name;
237 if(!PURPLE_BLIST_NODE_IS_GROUP(gnode)) 324 if(!PURPLE_BLIST_NODE_IS_GROUP(gnode))
238 continue; 325 continue;
326 if(!g_strcasecmp(group_name, MSN_INDIVIDUALS_GROUP_NAME)
327 || !g_strcasecmp(group_name,MSN_NON_IM_GROUP_NAME)){
328 continue;
329 }
239 for(cnode = gnode->child; cnode; cnode = cnode->next) { 330 for(cnode = gnode->child; cnode; cnode = cnode->next) {
240 if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) 331 if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
241 continue; 332 continue;
242 for(bnode = cnode->child; bnode; bnode = bnode->next) { 333 for(bnode = cnode->child; bnode; bnode = bnode->next) {
243 PurpleBuddy *b; 334 PurpleBuddy *b;
250 341
251 remote_user = msn_userlist_find_user(session->userlist, purple_buddy_get_name(b)); 342 remote_user = msn_userlist_find_user(session->userlist, purple_buddy_get_name(b));
252 343
253 if ((remote_user != NULL) && (remote_user->list_op & MSN_LIST_FL_OP)) 344 if ((remote_user != NULL) && (remote_user->list_op & MSN_LIST_FL_OP))
254 { 345 {
255 int group_id; 346 const char *group_id;
256 GList *l; 347 GList *l;
257 348
349 purple_debug_info("MaYuan","remote user:{%s}\n",b->name);
258 group_id = msn_userlist_find_group_id(remote_user->userlist, 350 group_id = msn_userlist_find_group_id(remote_user->userlist,
259 group_name); 351 group_name);
352 if(group_id == NULL){
353 continue;
354 }
355 purple_debug_info("MaYuan","group_id:{%s}\n",group_id);
260 356
261 for (l = remote_user->group_ids; l != NULL; l = l->next) 357 for (l = remote_user->group_ids; l != NULL; l = l->next)
262 { 358 {
263 if (group_id == GPOINTER_TO_INT(l->data)) 359 purple_debug_info("MaYuan","l->data:{%s}\n",l->data);
360 if (!g_strcasecmp(group_id ,l->data))
264 { 361 {
265 found = TRUE; 362 found = TRUE;
266 break; 363 break;
267 } 364 }
268 } 365 }
269
270 } 366 }
271 367
272 if (!found) 368 if (!found)
273 { 369 {
274 /* The user was not on the server list or not in that group 370 /* The user was not on the server list or not in that group
275 * on the server list */ 371 * on the server list */
276 msn_show_sync_issue(session, purple_buddy_get_name(b), group_name); 372 msn_show_sync_issue(session, b->name, group_name);
277 } 373 }
278 } 374 }
279 } 375 }
280 } 376 }
281 } 377 }
408 * and @msn.com accounts don't automatically get the initial email 504 * and @msn.com accounts don't automatically get the initial email
409 * notification so we always request it on login 505 * notification so we always request it on login
410 */ 506 */
411 msn_cmdproc_send(session->notification->cmdproc, "URL", "%s", "INBOX"); 507 msn_cmdproc_send(session->notification->cmdproc, "URL", "%s", "INBOX");
412 } 508 }
509