- Timestamp:
- 2010-03-14T23:15:05Z (15 years ago)
- Branches:
- master
- Children:
- 81ee561
- Parents:
- 7c5affca (diff), 7e2b593 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- protocols
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
protocols/jabber/io.c
r7c5affca r3330468 375 375 376 376 if( ( c = xt_find_node( node->children, "bind" ) ) ) 377 { 378 reply = xt_new_node( "bind", NULL, xt_new_node( "resource", set_getstr( &ic->acc->set, "resource" ), NULL ) ); 379 xt_add_attr( reply, "xmlns", XMLNS_BIND ); 380 reply = jabber_make_packet( "iq", "set", NULL, reply ); 381 jabber_cache_add( ic, reply, jabber_pkt_bind_sess ); 382 383 if( !jabber_write_packet( ic, reply ) ) 384 return XT_ABORT; 385 386 jd->flags |= JFLAG_WAIT_BIND; 387 } 377 jd->flags |= JFLAG_WANT_BIND; 388 378 389 379 if( ( c = xt_find_node( node->children, "session" ) ) ) 390 { 391 reply = xt_new_node( "session", NULL, NULL ); 392 xt_add_attr( reply, "xmlns", XMLNS_SESSION ); 393 reply = jabber_make_packet( "iq", "set", NULL, reply ); 394 jabber_cache_add( ic, reply, jabber_pkt_bind_sess ); 395 396 if( !jabber_write_packet( ic, reply ) ) 397 return XT_ABORT; 398 399 jd->flags |= JFLAG_WAIT_SESSION; 400 } 380 jd->flags |= JFLAG_WANT_SESSION; 401 381 402 382 /* This flag is already set if we authenticated via SASL, so now 403 383 we can resume the session in the new stream, if we don't have 404 384 to bind/initialize the session. */ 405 if( jd->flags & JFLAG_AUTHENTICATED && ( jd->flags & ( JFLAG_WA IT_BIND | JFLAG_WAIT_SESSION ) ) == 0 )385 if( jd->flags & JFLAG_AUTHENTICATED && ( jd->flags & ( JFLAG_WANT_BIND | JFLAG_WANT_SESSION ) ) == 0 ) 406 386 { 407 387 if( !jabber_get_roster( ic ) ) 408 388 return XT_ABORT; 389 } 390 else if( jd->flags & JFLAG_AUTHENTICATED ) 391 { 392 return jabber_pkt_bind_sess( ic, NULL, NULL ); 409 393 } 410 394 … … 441 425 imcb_log( ic, "Converting stream to TLS" ); 442 426 427 jd->flags |= JFLAG_STARTTLS_DONE; 443 428 jd->ssl = ssl_starttls( jd->fd, jabber_connected_ssl, ic ); 444 429 … … 531 516 jd->r_inpa = b_input_add( jd->fd, B_EV_IO_READ, jabber_read_callback, ic ); 532 517 533 greet = g_strdup_printf( "<?xml version='1.0' ?>" 534 "<stream:stream to=\"%s\" xmlns=\"jabber:client\" " 535 "xmlns:stream=\"http://etherx.jabber.org/streams\" version=\"1.0\">", jd->server ); 518 greet = g_strdup_printf( "%s<stream:stream to=\"%s\" xmlns=\"jabber:client\" " 519 "xmlns:stream=\"http://etherx.jabber.org/streams\" version=\"1.0\">", 520 ( jd->flags & JFLAG_STARTTLS_DONE ) ? "" : "<?xml version='1.0' ?>", 521 jd->server ); 536 522 537 523 st = jabber_write( ic, greet, strlen( greet ) ); -
protocols/jabber/iq.c
r7c5affca r3330468 298 298 { 299 299 struct jabber_data *jd = ic->proto_data; 300 struct xt_node *c ;300 struct xt_node *c, *reply = NULL; 301 301 char *s; 302 302 303 if( ( c = xt_find_node( node->children, "bind" ) ) )303 if( node && ( c = xt_find_node( node->children, "bind" ) ) ) 304 304 { 305 305 c = xt_find_node( c->children, "jid" ); … … 308 308 imcb_log( ic, "Server changed session resource string to `%s'", s + 1 ); 309 309 310 jd->flags &= ~JFLAG_WAIT_BIND; 311 } 312 else 313 { 314 jd->flags &= ~JFLAG_WAIT_SESSION; 315 } 316 317 if( ( jd->flags & ( JFLAG_WAIT_BIND | JFLAG_WAIT_SESSION ) ) == 0 ) 310 jd->flags &= ~JFLAG_WANT_BIND; 311 } 312 else if( node && ( c = xt_find_node( node->children, "session" ) ) ) 313 { 314 jd->flags &= ~JFLAG_WANT_SESSION; 315 } 316 317 if( jd->flags & JFLAG_WANT_BIND ) 318 { 319 reply = xt_new_node( "bind", NULL, xt_new_node( "resource", set_getstr( &ic->acc->set, "resource" ), NULL ) ); 320 xt_add_attr( reply, "xmlns", XMLNS_BIND ); 321 } 322 else if( jd->flags & JFLAG_WANT_SESSION ) 323 { 324 reply = xt_new_node( "session", NULL, NULL ); 325 xt_add_attr( reply, "xmlns", XMLNS_SESSION ); 326 } 327 328 if( reply != NULL ) 329 { 330 reply = jabber_make_packet( "iq", "set", NULL, reply ); 331 jabber_cache_add( ic, reply, jabber_pkt_bind_sess ); 332 333 if( !jabber_write_packet( ic, reply ) ) 334 return XT_ABORT; 335 } 336 else if( ( jd->flags & ( JFLAG_WANT_BIND | JFLAG_WANT_SESSION ) ) == 0 ) 318 337 { 319 338 if( !jabber_get_roster( ic ) ) -
protocols/jabber/jabber.h
r7c5affca r3330468 40 40 JFLAG_STREAM_RESTART = 4, /* Set when we want to restart the stream (after 41 41 SASL or TLS). */ 42 JFLAG_WA IT_SESSION = 8, /* Set if we sent a <session> tag and need a reply42 JFLAG_WANT_SESSION = 8, /* Set if the server wants a <session/> tag 43 43 before we continue. */ 44 JFLAG_WA IT_BIND = 16, /* ... for <bind> tag. */44 JFLAG_WANT_BIND = 16, /* ... for <bind> tag. */ 45 45 JFLAG_WANT_TYPING = 32, /* Set if we ever sent a typing notification, this 46 46 activates all XEP-85 related code. */ 47 47 JFLAG_XMLCONSOLE = 64, /* If the user added an xmlconsole buddy. */ 48 JFLAG_STARTTLS_DONE = 128, /* If a plaintext session was converted to TLS. */ 48 49 } jabber_flags_t; 49 50 -
protocols/msn/msn.c
r7c5affca r3330468 26 26 #include "nogaim.h" 27 27 #include "msn.h" 28 29 int msn_chat_id; 30 GSList *msn_connections; 31 GSList *msn_switchboards; 28 32 29 33 static char *msn_set_display_name( set_t *set, char *value ); -
protocols/msn/msn.h
r7c5affca r3330468 135 135 #define STATUS_SB_CHAT_SPARE 8 /* Same, but also for groupchats (not used yet). */ 136 136 137 int msn_chat_id;137 extern int msn_chat_id; 138 138 extern const struct msn_away_state msn_away_state_list[]; 139 139 extern const struct msn_status_code msn_status_code_list[]; … … 144 144 connection), the callback should check whether it's still listed here 145 145 before doing *anything* else. */ 146 GSList *msn_connections;147 GSList *msn_switchboards;146 extern GSList *msn_connections; 147 extern GSList *msn_switchboards; 148 148 149 149 /* ns.c */ -
protocols/msn/msn_util.c
r7c5affca r3330468 171 171 172 172 /* End of headers? */ 173 if( strncmp( text + i - 2, "\n\n", 2 ) == 0||174 strncmp( text + i - 4, "\r\n\r\n", 4 ) == 0 ||175 strncmp( text + i - 2, "\r\r", 2 ) == 0)173 if( ( i >= 4 && strncmp( text + i - 4, "\r\n\r\n", 4 ) == 0 ) || 174 ( i >= 2 && ( strncmp( text + i - 2, "\n\n", 2 ) == 0 || 175 strncmp( text + i - 2, "\r\r", 2 ) == 0 ) ) ) 176 176 { 177 177 break; -
protocols/msn/ns.c
r7c5affca r3330468 229 229 } 230 230 } 231 else if( num_parts == 7 && strcmp( cmd[2], "OK" ) == 0 )231 else if( num_parts >= 7 && strcmp( cmd[2], "OK" ) == 0 ) 232 232 { 233 233 set_t *s; 234 234 235 http_decode( cmd[4] ); 236 237 strncpy( ic->displayname, cmd[4], sizeof( ic->displayname ) ); 238 ic->displayname[sizeof(ic->displayname)-1] = 0; 239 240 if( ( s = set_find( &ic->acc->set, "display_name" ) ) ) 241 { 242 g_free( s->value ); 243 s->value = g_strdup( cmd[4] ); 235 if( num_parts == 7 ) 236 { 237 http_decode( cmd[4] ); 238 239 strncpy( ic->displayname, cmd[4], sizeof( ic->displayname ) ); 240 ic->displayname[sizeof(ic->displayname)-1] = 0; 241 242 if( ( s = set_find( &ic->acc->set, "display_name" ) ) ) 243 { 244 g_free( s->value ); 245 s->value = g_strdup( cmd[4] ); 246 } 247 } 248 else 249 { 250 imcb_log( ic, "Warning: Friendly name in server response was corrupted" ); 244 251 } 245 252 -
protocols/nogaim.c
r7c5affca r3330468 98 98 void register_protocol (struct prpl *p) 99 99 { 100 protocols = g_list_append(protocols, p); 100 int i; 101 gboolean refused = global.conf->protocols != NULL; 102 103 for (i = 0; global.conf->protocols && global.conf->protocols[i]; i++) 104 { 105 if (g_strcasecmp(p->name, global.conf->protocols[i]) == 0) 106 refused = FALSE; 107 } 108 109 if (refused) 110 log_message(LOGLVL_WARNING, "Protocol %s disabled\n", p->name); 111 else 112 protocols = g_list_append(protocols, p); 101 113 } 102 114 … … 379 391 /* list.c */ 380 392 381 void imcb_add_buddy( struct im_connection *ic, c har *handle,char *group )393 void imcb_add_buddy( struct im_connection *ic, const char *handle, const char *group ) 382 394 { 383 395 user_t *u; … … 453 465 } 454 466 455 void imcb_rename_buddy( struct im_connection *ic, c har *handle,char *realname )467 void imcb_rename_buddy( struct im_connection *ic, const char *handle, const char *realname ) 456 468 { 457 469 user_t *u = user_findhandle( ic, handle ); 470 char *set; 458 471 459 472 if( !u || !realname ) return; … … 468 481 imcb_log( ic, "User `%s' changed name to `%s'", u->nick, u->realname ); 469 482 } 470 } 471 472 void imcb_remove_buddy( struct im_connection *ic, char *handle, char *group ) 483 484 set = set_getstr( &ic->acc->set, "nick_source" ); 485 if( strcmp( set, "handle" ) != 0 ) 486 { 487 char *name = g_strdup( realname ); 488 489 if( strcmp( set, "first_name" ) == 0 ) 490 { 491 int i; 492 for( i = 0; name[i] && !isspace( name[i] ); i ++ ) {} 493 name[i] = '\0'; 494 } 495 496 imcb_buddy_nick_hint( ic, handle, name ); 497 498 g_free( name ); 499 } 500 } 501 502 void imcb_remove_buddy( struct im_connection *ic, const char *handle, char *group ) 473 503 { 474 504 user_t *u; … … 480 510 /* Mainly meant for ICQ (and now also for Jabber conferences) to allow IM 481 511 modules to suggest a nickname for a handle. */ 482 void imcb_buddy_nick_hint( struct im_connection *ic, c har *handle,char *nick )512 void imcb_buddy_nick_hint( struct im_connection *ic, const char *handle, const char *nick ) 483 513 { 484 514 user_t *u = user_findhandle( ic, handle ); … … 692 722 } 693 723 694 void imcb_buddy_msg( struct im_connection *ic, c har *handle, char *msg, uint32_t flags, time_t sent_at )724 void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, uint32_t flags, time_t sent_at ) 695 725 { 696 726 irc_t *irc = ic->irc; … … 825 855 } 826 856 827 void imcb_chat_msg( struct groupchat *c, c har *who, char *msg, uint32_t flags, time_t sent_at )857 void imcb_chat_msg( struct groupchat *c, const char *who, char *msg, uint32_t flags, time_t sent_at ) 828 858 { 829 859 struct im_connection *ic = c->ic; … … 897 927 /* buddy_chat.c */ 898 928 899 void imcb_chat_add_buddy( struct groupchat *b, c har *handle )929 void imcb_chat_add_buddy( struct groupchat *b, const char *handle ) 900 930 { 901 931 user_t *u = user_findhandle( b->ic, handle ); … … 932 962 933 963 /* This function is one BIG hack... :-( EREWRITE */ 934 void imcb_chat_remove_buddy( struct groupchat *b, c har *handle,char *reason )964 void imcb_chat_remove_buddy( struct groupchat *b, const char *handle, const char *reason ) 935 965 { 936 966 user_t *u; … … 1081 1111 int imc_away_send_update( struct im_connection *ic ) 1082 1112 { 1083 char *away, *msg ;1113 char *away, *msg = NULL; 1084 1114 1085 1115 away = set_getstr( &ic->acc->set, "away" ) ? -
protocols/nogaim.h
r7c5affca r3330468 276 276 * user, usually after a login, or if the user added a buddy and the IM 277 277 * server confirms that the add was successful. Don't forget to do this! */ 278 G_MODULE_EXPORT void imcb_add_buddy( struct im_connection *ic, c har *handle,char *group );279 G_MODULE_EXPORT void imcb_remove_buddy( struct im_connection *ic, c har *handle, char *group );278 G_MODULE_EXPORT void imcb_add_buddy( struct im_connection *ic, const char *handle, const char *group ); 279 G_MODULE_EXPORT void imcb_remove_buddy( struct im_connection *ic, const char *handle, char *group ); 280 280 G_MODULE_EXPORT struct buddy *imcb_find_buddy( struct im_connection *ic, char *handle ); 281 G_MODULE_EXPORT void imcb_rename_buddy( struct im_connection *ic, c har *handle,char *realname );282 G_MODULE_EXPORT void imcb_buddy_nick_hint( struct im_connection *ic, c har *handle,char *nick );281 G_MODULE_EXPORT void imcb_rename_buddy( struct im_connection *ic, const char *handle, const char *realname ); 282 G_MODULE_EXPORT void imcb_buddy_nick_hint( struct im_connection *ic, const char *handle, const char *nick ); 283 283 284 284 /* Buddy activity */ … … 290 290 /* Not implemented yet! */ G_MODULE_EXPORT void imcb_buddy_times( struct im_connection *ic, const char *handle, time_t login, time_t idle ); 291 291 /* Call when a handle says something. 'flags' and 'sent_at may be just 0. */ 292 G_MODULE_EXPORT void imcb_buddy_msg( struct im_connection *ic, c har *handle, char *msg, uint32_t flags, time_t sent_at );292 G_MODULE_EXPORT void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, uint32_t flags, time_t sent_at ); 293 293 G_MODULE_EXPORT void imcb_buddy_typing( struct im_connection *ic, char *handle, uint32_t flags ); 294 294 G_MODULE_EXPORT void imcb_clean_handle( struct im_connection *ic, char *handle ); … … 303 303 * user, too. */ 304 304 G_MODULE_EXPORT struct groupchat *imcb_chat_new( struct im_connection *ic, const char *handle ); 305 G_MODULE_EXPORT void imcb_chat_add_buddy( struct groupchat *b, c har *handle );305 G_MODULE_EXPORT void imcb_chat_add_buddy( struct groupchat *b, const char *handle ); 306 306 /* To remove a handle from a group chat. Reason can be NULL. */ 307 G_MODULE_EXPORT void imcb_chat_remove_buddy( struct groupchat *b, c har *handle,char *reason );307 G_MODULE_EXPORT void imcb_chat_remove_buddy( struct groupchat *b, const char *handle, const char *reason ); 308 308 /* To tell BitlBee 'who' said 'msg' in 'c'. 'flags' and 'sent_at' can be 0. */ 309 G_MODULE_EXPORT void imcb_chat_msg( struct groupchat *c, c har *who, char *msg, uint32_t flags, time_t sent_at );309 G_MODULE_EXPORT void imcb_chat_msg( struct groupchat *c, const char *who, char *msg, uint32_t flags, time_t sent_at ); 310 310 /* System messages specific to a groupchat, so they can be displayed in the right context. */ 311 311 G_MODULE_EXPORT void imcb_chat_log( struct groupchat *c, char *format, ... ) G_GNUC_PRINTF( 2, 3 ); -
protocols/yahoo/libyahoo2.c
r7c5affca r3330468 855 855 } 856 856 857 static YList * bud_str2list(char *rawlist)858 {859 YList * l = NULL;860 861 char **lines;862 char **split;863 char **buddies;864 char **tmp, **bud;865 866 lines = y_strsplit(rawlist, "\n", -1);867 for (tmp = lines; *tmp; tmp++) {868 struct yahoo_buddy *newbud;869 870 split = y_strsplit(*tmp, ":", 2);871 if (!split)872 continue;873 if (!split[0] || !split[1]) {874 y_strfreev(split);875 continue;876 }877 buddies = y_strsplit(split[1], ",", -1);878 879 for (bud = buddies; bud && *bud; bud++) {880 newbud = y_new0(struct yahoo_buddy, 1);881 newbud->id = strdup(*bud);882 newbud->group = strdup(split[0]);883 884 if(y_list_find_custom(l, newbud, is_same_bud)) {885 FREE(newbud->id);886 FREE(newbud->group);887 FREE(newbud);888 continue;889 }890 891 newbud->real_name = NULL;892 893 l = y_list_append(l, newbud);894 895 NOTICE(("Added buddy %s to group %s", newbud->id, newbud->group));896 }897 898 y_strfreev(buddies);899 y_strfreev(split);900 }901 y_strfreev(lines);902 903 return l;904 }905 906 857 static char * getcookie(char *rawcookie) 907 858 { … … 1360 1311 } 1361 1312 1362 1363 static void yahoo_process_status(struct yahoo_input_data *yid,struct yahoo_packet *pkt)1313 static void yahoo_process_status(struct yahoo_input_data *yid, 1314 struct yahoo_packet *pkt) 1364 1315 { 1365 1316 YList *l; 1366 1317 struct yahoo_data *yd = yid->yd; 1367 1318 1368 struct user 1369 { 1370 char *name; /* 7 name */ 1371 int state; /* 10 state */ 1372 int flags; /* 13 flags, bit 0 = pager, bit 1 = chat, bit 2 = game */ 1373 int mobile; /* 60 mobile */ 1374 char *msg; /* 19 custom status message */ 1375 int away; /* 47 away (or invisible)*/ 1376 int buddy_session; /* 11 state */ 1377 int f17; /* 17 in chat? then what about flags? */ 1378 int idle; /* 137 seconds idle */ 1379 int f138; /* 138 state */ 1380 char *f184; /* 184 state */ 1381 int f192; /* 192 state */ 1382 int f10001; /* 10001 state */ 1383 int f10002; /* 10002 state */ 1384 int f198; /* 198 state */ 1385 char *f197; /* 197 state */ 1386 char *f205; /* 205 state */ 1387 int f213; /* 213 state */ 1388 } *u; 1319 struct yahoo_process_status_entry *u; 1389 1320 1390 1321 YList *users = 0; 1391 1322 1392 1323 if (pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == -1) { 1393 YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_DUPL, NULL); 1394 return; 1395 } 1324 YAHOO_CALLBACK(ext_yahoo_login_response) (yd->client_id, 1325 YAHOO_LOGIN_DUPL, NULL); 1326 return; 1327 } 1328 1329 /* Status updates may be spread accross multiple packets and not 1330 even on buddy boundaries, so keeping some state is important. 1331 So, continue where we left off, and only add a user entry to 1332 the list once it's complete (301-315 End buddy). */ 1333 u = yd->half_user; 1396 1334 1397 1335 for (l = pkt->hash; l; l = l->next) { … … 1399 1337 1400 1338 switch (pair->key) { 1401 case 0: /* we won't actually do anything with this */ 1339 case 300: /* Begin buddy */ 1340 if (!strcmp(pair->value, "315") && !u) { 1341 u = yd->half_user = y_new0(struct yahoo_process_status_entry, 1); 1342 } 1343 break; 1344 case 301: /* End buddy */ 1345 if (!strcmp(pair->value, "315") && u) { 1346 users = y_list_prepend(users, u); 1347 u = yd->half_user = NULL; 1348 } 1349 break; 1350 case 0: /* we won't actually do anything with this */ 1402 1351 NOTICE(("key %d:%s", pair->key, pair->value)); 1403 1352 break; 1404 case 1: 1353 case 1: /* we don't get the full buddy list here. */ 1405 1354 if (!yd->logged_in) { 1406 yd->logged_in = TRUE;1407 if (yd->current_status < 0)1355 yd->logged_in = 1; 1356 if (yd->current_status < 0) 1408 1357 yd->current_status = yd->initial_status; 1409 YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_OK, NULL); 1358 YAHOO_CALLBACK(ext_yahoo_login_response) (yd-> 1359 client_id, YAHOO_LOGIN_OK, NULL); 1410 1360 } 1411 1361 break; 1412 case 8: 1362 case 8: /* how many online buddies we have */ 1413 1363 NOTICE(("key %d:%s", pair->key, pair->value)); 1414 1364 break; 1415 case 7: /* the current buddy */ 1416 u = y_new0(struct user, 1); 1365 case 7: /* the current buddy */ 1366 if (!u) { 1367 /* This will only happen in case of a single level message */ 1368 u = y_new0(struct yahoo_process_status_entry, 1); 1369 users = y_list_prepend(users, u); 1370 } 1417 1371 u->name = pair->value; 1418 users = y_list_prepend(users, u); 1419 break; 1420 case 10: /* state */ 1421 ((struct user*)users->data)->state = strtol(pair->value, NULL, 10); 1422 break; 1423 case 19: /* custom status message */ 1424 ((struct user*)users->data)->msg = pair->value; 1425 break; 1426 case 47: /* is it an away message or not */ 1427 ((struct user*)users->data)->away = atoi(pair->value); 1428 break; 1429 case 137: /* seconds idle */ 1430 ((struct user*)users->data)->idle = atoi(pair->value); 1431 break; 1432 case 11: /* this is the buddy's session id */ 1433 ((struct user*)users->data)->buddy_session = atoi(pair->value); 1434 break; 1435 case 17: /* in chat? */ 1436 ((struct user*)users->data)->f17 = atoi(pair->value); 1437 break; 1438 case 13: /* bitmask, bit 0 = pager, bit 1 = chat, bit 2 = game */ 1439 ((struct user*)users->data)->flags = atoi(pair->value); 1440 break; 1441 case 60: /* SMS -> 1 MOBILE USER */ 1372 break; 1373 case 10: /* state */ 1374 u->state = strtol(pair->value, NULL, 10); 1375 break; 1376 case 19: /* custom status message */ 1377 u->msg = pair->value; 1378 break; 1379 case 47: /* is it an away message or not. Not applicable for YMSG16 anymore */ 1380 u->away = atoi(pair->value); 1381 break; 1382 case 137: /* seconds idle */ 1383 u->idle = atoi(pair->value); 1384 break; 1385 case 11: /* this is the buddy's session id */ 1386 u->buddy_session = atoi(pair->value); 1387 break; 1388 case 17: /* in chat? */ 1389 u->f17 = atoi(pair->value); 1390 break; 1391 case 13: /* bitmask, bit 0 = pager, bit 1 = chat, bit 2 = game */ 1392 u->flags = atoi(pair->value); 1393 break; 1394 case 60: /* SMS -> 1 MOBILE USER */ 1442 1395 /* sometimes going offline makes this 2, but invisible never sends it */ 1443 ((struct user*)users->data)->mobile = atoi(pair->value);1396 u->mobile = atoi(pair->value); 1444 1397 break; 1445 1398 case 138: 1446 ((struct user*)users->data)->f138 = atoi(pair->value);1399 u->f138 = atoi(pair->value); 1447 1400 break; 1448 1401 case 184: 1449 ((struct user*)users->data)->f184 = pair->value;1402 u->f184 = pair->value; 1450 1403 break; 1451 1404 case 192: 1452 ((struct user*)users->data)->f192 = atoi(pair->value);1405 u->f192 = atoi(pair->value); 1453 1406 break; 1454 1407 case 10001: 1455 ((struct user*)users->data)->f10001 = atoi(pair->value);1408 u->f10001 = atoi(pair->value); 1456 1409 break; 1457 1410 case 10002: 1458 ((struct user*)users->data)->f10002 = atoi(pair->value);1411 u->f10002 = atoi(pair->value); 1459 1412 break; 1460 1413 case 198: 1461 ((struct user*)users->data)->f198 = atoi(pair->value);1414 u->f198 = atoi(pair->value); 1462 1415 break; 1463 1416 case 197: 1464 ((struct user*)users->data)->f197 = pair->value;1417 u->f197 = pair->value; 1465 1418 break; 1466 1419 case 205: 1467 ((struct user*)users->data)->f205 = pair->value;1420 u->f205 = pair->value; 1468 1421 break; 1469 1422 case 213: 1470 ((struct user*)users->data)->f213 = atoi(pair->value); 1471 break; 1472 case 16: /* Custom error message */ 1473 YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, pair->value, 0, E_CUSTOM); 1423 u->f213 = atoi(pair->value); 1424 break; 1425 case 16: /* Custom error message */ 1426 YAHOO_CALLBACK(ext_yahoo_error) (yd->client_id, 1427 pair->value, 0, E_CUSTOM); 1474 1428 break; 1475 1429 default: 1476 WARNING(("unknown status key %d:%s", pair->key, pair->value)); 1477 break; 1478 } 1479 } 1480 1430 WARNING(("unknown status key %d:%s", pair->key, 1431 pair->value)); 1432 break; 1433 } 1434 } 1435 1481 1436 while (users) { 1482 1437 YList *t = users; 1483 struct user*u = users->data;1438 struct yahoo_process_status_entry *u = users->data; 1484 1439 1485 1440 if (u->name != NULL) { 1486 if (pkt->service == YAHOO_SERVICE_LOGOFF) { /* || u->flags == 0) { Not in YMSG16 */ 1487 YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, u->name, YAHOO_STATUS_OFFLINE, NULL, 1, 0, 0); 1441 if (pkt->service == 1442 YAHOO_SERVICE_LOGOFF 1443 /*|| u->flags == 0 No flags for YMSG16 */ ) { 1444 YAHOO_CALLBACK(ext_yahoo_status_changed) (yd-> 1445 client_id, u->name, 1446 YAHOO_STATUS_OFFLINE, NULL, 1, 0, 0); 1488 1447 } else { 1489 1448 /* Key 47 always seems to be 1 for YMSG16 */ 1490 if (!u->state)1449 if (!u->state) 1491 1450 u->away = 0; 1492 1451 else 1493 1452 u->away = 1; 1494 1453 1495 YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, u->name, u->state, u->msg, u->away, u->idle, u->mobile); 1454 YAHOO_CALLBACK(ext_yahoo_status_changed) (yd-> 1455 client_id, u->name, u->state, u->msg, 1456 u->away, u->idle, u->mobile); 1496 1457 } 1497 1458 } … … 1503 1464 } 1504 1465 1505 static void yahoo_process_buddy_list(struct yahoo_input_data *yid, struct yahoo_packet *pkt) 1466 static void yahoo_process_buddy_list(struct yahoo_input_data *yid, 1467 struct yahoo_packet *pkt) 1506 1468 { 1507 1469 struct yahoo_data *yd = yid->yd; … … 1515 1477 struct yahoo_pair *pair = l->data; 1516 1478 1517 switch (pair->key) {1479 switch (pair->key) { 1518 1480 case 300: 1519 1481 case 301: 1520 1482 case 302: 1483 break; /* Separators. Our logic does not need them */ 1521 1484 case 303: 1522 if ( 315 == atoi(pair->value))1485 if (318 == atoi(pair->value)) 1523 1486 last_packet = 1; 1524 1487 break; 1525 1488 case 65: 1526 g_free(cur_group);1527 1489 cur_group = strdup(pair->value); 1528 1490 break; … … 1530 1492 newbud = y_new0(struct yahoo_buddy, 1); 1531 1493 newbud->id = strdup(pair->value); 1532 if (cur_group) {1494 if (cur_group) 1533 1495 newbud->group = strdup(cur_group); 1534 } else { 1535 YList *last; 1536 struct yahoo_buddy *lastbud; 1537 1538 for (last = yd->buddies; last && last->next; last = last->next); 1539 if (last) { 1540 lastbud = last->data; 1541 newbud->group = strdup(lastbud->group); 1542 } else { 1543 newbud->group = strdup("Buddies"); 1544 } 1545 } 1496 else if (yd->buddies) { 1497 struct yahoo_buddy *lastbud = 1498 (struct yahoo_buddy *)y_list_nth(yd-> 1499 buddies, 1500 y_list_length(yd->buddies) - 1)->data; 1501 newbud->group = strdup(lastbud->group); 1502 } else 1503 newbud->group = strdup("Buddies"); 1546 1504 1547 1505 yd->buddies = y_list_append(yd->buddies, newbud); … … 1550 1508 } 1551 1509 } 1552 1553 g_free(cur_group);1554 1510 1555 1511 /* we could be getting multiple packets here */ 1556 if ( last_packet)1557 return; 1558 1559 YAHOO_CALLBACK(ext_yahoo_got_buddies) (yd->client_id, yd->buddies);1560 1561 /* ** We login at the very end of the packet communication */1512 if (pkt->hash && !last_packet) 1513 return; 1514 1515 YAHOO_CALLBACK(ext_yahoo_got_buddies) (yd->client_id, yd->buddies); 1516 1517 /* Logged in */ 1562 1518 if (!yd->logged_in) { 1563 yd->logged_in = TRUE;1564 if (yd->current_status < 0)1519 yd->logged_in = 1; 1520 if (yd->current_status < 0) 1565 1521 yd->current_status = yd->initial_status; 1566 YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_OK, NULL); 1567 } 1568 } 1569 1570 static void yahoo_process_list(struct yahoo_input_data *yid, struct yahoo_packet *pkt) 1522 YAHOO_CALLBACK(ext_yahoo_login_response) (yd->client_id, 1523 YAHOO_LOGIN_OK, NULL); 1524 1525 /* 1526 yahoo_set_away(yd->client_id, yd->initial_status, NULL, 1527 (yd->initial_status == YAHOO_STATUS_AVAILABLE) ? 0 : 1); 1528 1529 yahoo_get_yab(yd->client_id); 1530 */ 1531 } 1532 1533 } 1534 1535 static void yahoo_process_list(struct yahoo_input_data *yid, 1536 struct yahoo_packet *pkt) 1571 1537 { 1572 1538 struct yahoo_data *yd = yid->yd; 1573 1539 YList *l; 1574 1540 1575 if (!yd->logged_in) { 1576 yd->logged_in = TRUE; 1577 if(yd->current_status < 0) 1578 yd->current_status = yd->initial_status; 1579 YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_OK, NULL); 1580 } 1581 1541 /* we could be getting multiple packets here */ 1582 1542 for (l = pkt->hash; l; l = l->next) { 1583 1543 struct yahoo_pair *pair = l->data; 1584 1544 1585 switch(pair->key) { 1586 case 87: /* buddies */ 1587 if(!yd->rawbuddylist) 1588 yd->rawbuddylist = strdup(pair->value); 1589 else { 1590 yd->rawbuddylist = y_string_append(yd->rawbuddylist, pair->value); 1545 switch (pair->key) { 1546 case 89: /* identities */ 1547 { 1548 char **identities = 1549 y_strsplit(pair->value, ",", -1); 1550 int i; 1551 for (i = 0; identities[i]; i++) 1552 yd->identities = 1553 y_list_append(yd->identities, 1554 strdup(identities[i])); 1555 y_strfreev(identities); 1591 1556 } 1592 break; 1593 1594 case 88: /* ignore list */ 1595 if(!yd->ignorelist) 1596 yd->ignorelist = strdup("Ignore:"); 1597 yd->ignorelist = y_string_append(yd->ignorelist, pair->value); 1598 break; 1599 1600 case 89: /* identities */ 1601 { 1602 char **identities = y_strsplit(pair->value, ",", -1); 1603 int i; 1604 for(i=0; identities[i]; i++) 1605 yd->identities = y_list_append(yd->identities, 1606 strdup(identities[i])); 1607 y_strfreev(identities); 1608 } 1609 YAHOO_CALLBACK(ext_yahoo_got_identities)(yd->client_id, yd->identities); 1610 break; 1611 case 59: /* cookies */ 1612 if(yd->ignorelist) { 1613 yd->ignore = bud_str2list(yd->ignorelist); 1614 FREE(yd->ignorelist); 1615 YAHOO_CALLBACK(ext_yahoo_got_ignore)(yd->client_id, yd->ignore); 1616 } 1617 if(yd->rawbuddylist) { 1618 yd->buddies = bud_str2list(yd->rawbuddylist); 1619 FREE(yd->rawbuddylist); 1620 YAHOO_CALLBACK(ext_yahoo_got_buddies)(yd->client_id, yd->buddies); 1621 } 1622 1623 if(pair->value[0]=='Y') { 1557 YAHOO_CALLBACK(ext_yahoo_got_identities) (yd->client_id, 1558 yd->identities); 1559 break; 1560 case 59: /* cookies */ 1561 if (pair->value[0] == 'Y') { 1624 1562 FREE(yd->cookie_y); 1625 1563 FREE(yd->login_cookie); … … 1628 1566 yd->login_cookie = getlcookie(yd->cookie_y); 1629 1567 1630 } else if (pair->value[0]=='T') {1568 } else if (pair->value[0] == 'T') { 1631 1569 FREE(yd->cookie_t); 1632 1570 yd->cookie_t = getcookie(pair->value); 1633 1571 1634 } else if (pair->value[0]=='C') {1572 } else if (pair->value[0] == 'C') { 1635 1573 FREE(yd->cookie_c); 1636 1574 yd->cookie_c = getcookie(pair->value); 1637 } 1638 1639 if(yd->cookie_y && yd->cookie_t)1640 YAHOO_CALLBACK(ext_yahoo_got_cookies)(yd->client_id);1641 1642 break;1643 case 3: /* my id*/1644 case 90: /* 1*/1645 case 100: /*0 */1646 case 101: /* NULL */1647 case 102: /* NULL */1648 case 93: /* 86400/1440 */1649 break; 1650 }1651 }1575 } 1576 1577 break; 1578 case 3: /* my id */ 1579 case 90: /* 1 */ 1580 case 100: /* 0 */ 1581 case 101: /* NULL */ 1582 case 102: /* NULL */ 1583 case 93: /* 86400/1440 */ 1584 break; 1585 } 1586 } 1587 1588 if (yd->cookie_y && yd->cookie_t) /* We don't get cookie_c anymore */ 1589 YAHOO_CALLBACK(ext_yahoo_got_cookies) (yd->client_id); 1652 1590 } 1653 1591 -
protocols/yahoo/yahoo2_types.h
r7c5affca r3330468 196 196 197 197 void *server_settings; 198 199 struct yahoo_process_status_entry *half_user; 198 200 }; 199 201 … … 261 263 }; 262 264 265 struct yahoo_process_status_entry { 266 char *name; /* 7 name */ 267 int state; /* 10 state */ 268 int flags; /* 13 flags, bit 0 = pager, bit 1 = chat, bit 2 = game */ 269 int mobile; /* 60 mobile */ 270 char *msg; /* 19 custom status message */ 271 int away; /* 47 away (or invisible) */ 272 int buddy_session; /* 11 state */ 273 int f17; /* 17 in chat? then what about flags? */ 274 int idle; /* 137 seconds idle */ 275 int f138; /* 138 state */ 276 char *f184; /* 184 state */ 277 int f192; /* 192 state */ 278 int f10001; /* 10001 state */ 279 int f10002; /* 10002 state */ 280 int f198; /* 198 state */ 281 char *f197; /* 197 state */ 282 char *f205; /* 205 state */ 283 int f213; /* 213 state */ 284 }; 285 263 286 #ifdef __cplusplus 264 287 }
Note: See TracChangeset
for help on using the changeset viewer.