| 562 return TRUE; /* if return FALSE, timeout callback stops */ |
562 return TRUE; /* if return FALSE, timeout callback stops */ |
| 563 } |
563 } |
| 564 |
564 |
| 565 /* the callback function after socket is built |
565 /* the callback function after socket is built |
| 566 * we setup the qq protocol related configuration here */ |
566 * we setup the qq protocol related configuration here */ |
| |
567 typedef struct _ConnectInfo |
| |
568 { |
| |
569 PurpleConnection * gc; |
| |
570 gint source; |
| |
571 const gchar * error; |
| |
572 } ConnectInfo; |
| |
573 static void qq_connect_cb_continue(PurpleAccount * account, char * password, GError * error, gpointer data); |
| |
574 |
| 567 static void qq_connect_cb(gpointer data, gint source, const gchar *error_message) |
575 static void qq_connect_cb(gpointer data, gint source, const gchar *error_message) |
| 568 { |
576 { |
| |
577 ConnectInfo * info; |
| |
578 PurpleAccount * account; |
| |
579 |
| |
580 info = g_malloc(sizeof(ConnectInfo)); |
| |
581 info->gc = (PurpleConnection *) data; |
| |
582 info->source = source; |
| |
583 info->error =error_message; |
| |
584 |
| |
585 account = purple_connection_get_account(info->gc); |
| |
586 |
| |
587 purple_account_get_password_async(account, qq_connect_cb_continue, info); |
| |
588 |
| |
589 g_free(info); |
| |
590 } |
| |
591 static void qq_connect_cb_continue(PurpleAccount * account, |
| |
592 char * passwd, |
| |
593 GError * error, |
| |
594 gpointer data) |
| |
595 { |
| |
596 ConnectInfo * info = (ConnectInfo *)data; |
| |
597 gint source = info->source; |
| |
598 const gchar *error_message = info->error; |
| |
599 PurpleConnection *gc = info->gc; |
| 569 qq_data *qd; |
600 qq_data *qd; |
| 570 PurpleConnection *gc; |
|
| 571 gchar *conn_msg; |
601 gchar *conn_msg; |
| 572 const gchar *passwd; |
|
| 573 PurpleAccount *account ; |
|
| 574 |
|
| 575 gc = (PurpleConnection *) data; |
|
| 576 |
602 |
| 577 if (!PURPLE_CONNECTION_IS_VALID(gc)) { |
603 if (!PURPLE_CONNECTION_IS_VALID(gc)) { |
| 578 purple_debug(PURPLE_DEBUG_INFO, "QQ_CONN", "Invalid connection\n"); |
604 purple_debug(PURPLE_DEBUG_INFO, "QQ_CONN", "Invalid connection\n"); |
| 579 close(source); |
605 close(source); |
| 580 return; |
606 return; |
| 581 } |
607 } |
| 582 |
608 |
| 583 g_return_if_fail(gc != NULL && gc->proto_data != NULL); |
609 g_return_if_fail(gc != NULL && gc->proto_data != NULL); |
| 584 |
610 |
| 585 qd = (qq_data *) gc->proto_data; |
611 qd = (qq_data *) gc->proto_data; |
| 586 account = purple_connection_get_account(gc); |
|
| 587 |
612 |
| 588 /* Connect is now complete; clear the PurpleProxyConnectData */ |
613 /* Connect is now complete; clear the PurpleProxyConnectData */ |
| 589 qd->connect_data = NULL; |
614 qd->connect_data = NULL; |
| 590 |
615 |
| 591 if (source < 0) { /* socket returns -1 */ |
616 if (source < 0) { /* socket returns -1 */ |
| 601 srandom(time(NULL)); |
626 srandom(time(NULL)); |
| 602 qd->send_seq = random() & 0x0000ffff; |
627 qd->send_seq = random() & 0x0000ffff; |
| 603 qd->fd = source; |
628 qd->fd = source; |
| 604 qd->logged_in = FALSE; |
629 qd->logged_in = FALSE; |
| 605 qd->channel = 1; |
630 qd->channel = 1; |
| 606 qd->uid = strtol(purple_account_get_username(purple_connection_get_account(gc)), NULL, 10); |
631 qd->uid = strtol(purple_account_get_username(account), NULL, 10); |
| 607 |
632 |
| 608 /* now generate md5 processed passwd */ |
633 /* now generate md5 processed passwd */ |
| 609 passwd = purple_account_get_password(purple_connection_get_account(gc)); |
|
| 610 |
634 |
| 611 /* use twice-md5 of user password as session key since QQ 2003iii */ |
635 /* use twice-md5 of user password as session key since QQ 2003iii */ |
| 612 qq_get_md5(qd->password_twice_md5, sizeof(qd->password_twice_md5), |
636 qq_get_md5(qd->password_twice_md5, sizeof(qd->password_twice_md5), |
| 613 (guint8 *)passwd, strlen(passwd)); |
637 (guint8 *)passwd, strlen(passwd)); |
| 614 qq_get_md5(qd->password_twice_md5, sizeof(qd->password_twice_md5), |
638 qq_get_md5(qd->password_twice_md5, sizeof(qd->password_twice_md5), |