00001
00029
00030
00031 #include "debug.h"
00032 #include "server.h"
00033
00034 #include "utils.h"
00035 #include "packet_parse.h"
00036 #include "buddy_list.h"
00037 #include "buddy_status.h"
00038 #include "crypt.h"
00039 #include "header_info.h"
00040 #include "keep_alive.h"
00041 #include "send_core.h"
00042
00043 #define QQ_UPDATE_ONLINE_INTERVAL 300 // in sec
00044
00045
00046
00047 void qq_send_packet_keep_alive(GaimConnection * gc)
00048 {
00049 qq_data *qd;
00050 guint8 *raw_data, *cursor;
00051
00052 g_return_if_fail(gc != NULL && gc->proto_data != NULL);
00053
00054 qd = (qq_data *) gc->proto_data;
00055 raw_data = g_newa(guint8, 4);
00056 cursor = raw_data;
00057
00058
00059
00060
00061 create_packet_dw(raw_data, &cursor, qd->uid);
00062
00063 qq_send_cmd(gc, QQ_CMD_KEEP_ALIVE, TRUE, 0, TRUE, raw_data, 4);
00064
00065 }
00066
00067
00068
00069 void qq_process_keep_alive_reply(guint8 * buf, gint buf_len, GaimConnection * gc) {
00070 qq_data *qd;
00071 gint len;
00072 gchar *data, **segments;
00073
00074 g_return_if_fail(gc != NULL && gc->proto_data != NULL);
00075 g_return_if_fail(buf != NULL && buf_len != 0);
00076
00077 qd = (qq_data *) gc->proto_data;
00078 len = buf_len;
00079 data = g_newa(guint8, len);
00080
00081 if (qq_crypt(DECRYPT, buf, buf_len, qd->session_key, data, &len)) {
00082 if (NULL == (segments = split_data(data, len, "\x1f", 6)))
00083 return;
00084
00085 qd->all_online = strtol(segments[2], NULL, 10);
00086 g_free(qd->my_ip);
00087 qd->my_ip = g_strdup(segments[3]);
00088 qd->my_port = strtol(segments[4], NULL, 10);
00089 g_strfreev(segments);
00090 } else
00091 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Error decrypt keep alive reply\n");
00092
00093
00094
00095 if ((time(NULL) - qd->last_get_online) >= QQ_UPDATE_ONLINE_INTERVAL)
00096 qq_send_packet_get_buddies_online(gc, QQ_FRIENDS_ONLINE_POSITION_START);
00097
00098 }
00099
00100
00101
00102
00103 void qq_refresh_all_buddy_status(GaimConnection * gc)
00104 {
00105 time_t now;
00106 GList *list;
00107 qq_data *qd;
00108 qq_buddy *q_bud;
00109
00110 g_return_if_fail(gc != NULL && gc->proto_data != NULL);
00111
00112 qd = (qq_data *) (gc->proto_data);
00113 now = time(NULL);
00114 list = qd->buddies;
00115 g_return_if_fail(qd != NULL);
00116
00117 while (list != NULL) {
00118 q_bud = (qq_buddy *) list->data;
00119 if (q_bud != NULL && now > q_bud->last_refresh + QQ_UPDATE_ONLINE_INTERVAL) {
00120 q_bud->status = QQ_BUDDY_ONLINE_OFFLINE;
00121 qq_update_buddy_contact(gc, q_bud);
00122 }
00123 list = list->next;
00124 }
00125 }
00126
00127
00128 void qq_update_buddy_contact(GaimConnection * gc, qq_buddy * q_bud)
00129 {
00130 gchar *name;
00131 gboolean online;
00132 GaimBuddy *bud;
00133 g_return_if_fail(gc != NULL && q_bud != NULL);
00134
00135 online = is_online(q_bud->status);
00136 name = uid_to_gaim_name(q_bud->uid);
00137 bud = gaim_find_buddy(gc->account, name);
00138 if (bud == NULL) return;
00139
00140 if (bud != NULL) {
00141 gaim_blist_alias_buddy(bud, q_bud->nickname);
00142 q_bud->last_refresh = time(NULL);
00143
00144
00145
00146 serv_got_update(gc, name, online, 0, q_bud->signon, q_bud->idle, bud->uc);
00147 }
00148
00149 g_free(name);
00150 }
00151
00152
00153