comparison src/protocols/qq/buddy_opt.c @ 14021:ef8490f9e823

[gaim-migrate @ 16618] Replaced all C++-style comments with C-style ones. Cleaned up some comments and implemented a more consistent formatting scheme. committer: Tailor Script <tailor@pidgin.im>
author Mark Huetsch <markhuetsch>
date Wed, 02 Aug 2006 15:35:36 +0000
parents 983fd420e86b
children 32a71e64ceae
comparison
equal deleted inserted replaced
14020:13e7ba964993 14021:ef8490f9e823
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software 19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */ 21 */
22 22
23 // START OF FILE 23 #include "debug.h"
24 /*****************************************************************************/ 24 #include "internal.h"
25 #include "debug.h" // gaim_debug 25 #include "notify.h"
26 #include "internal.h" // strlen, _("get_text") 26 #include "request.h"
27 #include "notify.h" // gaim_notify 27
28 #include "request.h" // gaim_request_input 28 #include "buddy_info.h"
29 29 #include "buddy_list.h"
30 #include "utils.h" // uid_to_gaim_name, gaim_name_to_uid
31 #include "packet_parse.h" // create_packet, read_packet
32 #include "buddy_info.h" // qq_send_packet_get_info
33 #include "buddy_list.h" // qq_send_packet_get_buddies_online
34 #include "buddy_opt.h" 30 #include "buddy_opt.h"
35 #include "char_conv.h" // qq_to_utf8 31 #include "char_conv.h"
36 #include "crypt.h" // qq_crypt 32 #include "crypt.h"
37 #include "header_info.h" // cmd alias 33 #include "header_info.h"
38 #include "keep_alive.h" // qq_update_buddy_contact 34 #include "im.h"
39 #include "im.h" // QQ_MSG_IM_MAX 35 #include "keep_alive.h"
40 #include "send_core.h" // qq_send_cmd 36 #include "packet_parse.h"
37 #include "send_core.h"
38 #include "utils.h"
41 39
42 #define GAIM_GROUP_QQ_FORMAT "QQ (%s)" 40 #define GAIM_GROUP_QQ_FORMAT "QQ (%s)"
43 #define GAIM_GROUP_QQ_UNKNOWN "QQ Unknown" 41 #define GAIM_GROUP_QQ_UNKNOWN "QQ Unknown"
44 #define GAIM_GROUP_QQ_BLOCKED "QQ Blocked" 42 #define GAIM_GROUP_QQ_BLOCKED "QQ Blocked"
45 43
46 #define QQ_REMOVE_BUDDY_REPLY_OK 0x00 44 #define QQ_REMOVE_BUDDY_REPLY_OK 0x00
47 #define QQ_REMOVE_SELF_REPLY_OK 0x00 45 #define QQ_REMOVE_SELF_REPLY_OK 0x00
48 #define QQ_ADD_BUDDY_AUTH_REPLY_OK 0x30 // ASCii value of "0" 46 #define QQ_ADD_BUDDY_AUTH_REPLY_OK 0x30 /* ASCII value of "0" */
49 47
50 enum { 48 enum {
51 QQ_MY_AUTH_APPROVE = 0x30, // ASCii value of "0" 49 QQ_MY_AUTH_APPROVE = 0x30, /* ASCII value of "0" */
52 QQ_MY_AUTH_REJECT = 0x31, // ASCii value of "1" 50 QQ_MY_AUTH_REJECT = 0x31, /* ASCII value of "1" */
53 QQ_MY_AUTH_REQUEST = 0x32, // ASCii value of "2" 51 QQ_MY_AUTH_REQUEST = 0x32, /* ASCII value of "2" */
54 }; 52 };
55 53
56 typedef struct _qq_add_buddy_request { 54 typedef struct _qq_add_buddy_request {
57 guint32 uid; 55 guint32 uid;
58 guint16 seq; 56 guint16 seq;
59 } qq_add_buddy_request; 57 } qq_add_buddy_request;
60 58
61 /*****************************************************************************/ 59 /* send packet to remove a buddy from my buddy list */
62 // send packet to remove a buddy from my buddy list 60 static void _qq_send_packet_remove_buddy(GaimConnection *gc, guint32 uid)
63 static void _qq_send_packet_remove_buddy(GaimConnection * gc, guint32 uid)
64 { 61 {
65 gchar *uid_str; 62 gchar *uid_str;
66 63
67 g_return_if_fail(gc != NULL && uid > 0); 64 g_return_if_fail(gc != NULL && uid > 0);
68 65
69 uid_str = g_strdup_printf("%d", uid); 66 uid_str = g_strdup_printf("%d", uid);
70 qq_send_cmd(gc, QQ_CMD_DEL_FRIEND, TRUE, 0, TRUE, uid_str, strlen(uid_str)); 67 qq_send_cmd(gc, QQ_CMD_DEL_FRIEND, TRUE, 0, TRUE, uid_str, strlen(uid_str));
71 68
72 g_free(uid_str); 69 g_free(uid_str);
73 } // _qq_send_packet_remove_buddy 70 }
74 71
75 /*****************************************************************************/ 72 /* try to remove myself from someone's buddy list */
76 // try to remove myself from someone's buddy list 73 static void _qq_send_packet_remove_self_from(GaimConnection *gc, guint32 uid)
77 static void _qq_send_packet_remove_self_from(GaimConnection * gc, guint32 uid)
78 { 74 {
79 guint8 *raw_data, *cursor; 75 guint8 *raw_data, *cursor;
80 76
81 g_return_if_fail(gc != NULL && gc->proto_data != NULL && uid > 0); 77 g_return_if_fail(gc != NULL && gc->proto_data != NULL && uid > 0);
82 78
83 raw_data = g_newa(guint8, 4); 79 raw_data = g_newa(guint8, 4);
84 cursor = raw_data; 80 cursor = raw_data;
85 create_packet_dw(raw_data, &cursor, uid); 81 create_packet_dw(raw_data, &cursor, uid);
86 82
87 qq_send_cmd(gc, QQ_CMD_REMOVE_SELF, TRUE, 0, TRUE, raw_data, 4); 83 qq_send_cmd(gc, QQ_CMD_REMOVE_SELF, TRUE, 0, TRUE, raw_data, 4);
88 84 }
89 } // _qq_send_packet_add_buddy 85
90 86 /* try to add a buddy without authentication */
91 /*****************************************************************************/ 87 static void _qq_send_packet_add_buddy(GaimConnection *gc, guint32 uid)
92 // try to add a buddy without authentication
93 static void _qq_send_packet_add_buddy(GaimConnection * gc, guint32 uid)
94 { 88 {
95 qq_data *qd; 89 qq_data *qd;
96 qq_add_buddy_request *req; 90 qq_add_buddy_request *req;
97 gchar *uid_str; 91 gchar *uid_str;
98 92
99 g_return_if_fail(gc != NULL && gc->proto_data != NULL && uid > 0); 93 g_return_if_fail(gc != NULL && gc->proto_data != NULL && uid > 0);
100 94
101 // we need to send the ascii code of this uid to qq server 95 /* we need to send the ascii code of this uid to qq server */
102 uid_str = g_strdup_printf("%d", uid); 96 uid_str = g_strdup_printf("%d", uid);
103 qq_send_cmd(gc, QQ_CMD_ADD_FRIEND_WO_AUTH, TRUE, 0, TRUE, uid_str, strlen(uid_str)); 97 qq_send_cmd(gc, QQ_CMD_ADD_FRIEND_WO_AUTH, TRUE, 0, TRUE, uid_str, strlen(uid_str));
104 g_free(uid_str); 98 g_free(uid_str);
105 99
106 // must be set after sending packet to get the correct send_seq 100 /* must be set after sending packet to get the correct send_seq */
107 qd = (qq_data *) gc->proto_data; 101 qd = (qq_data *) gc->proto_data;
108 req = g_new0(qq_add_buddy_request, 1); 102 req = g_new0(qq_add_buddy_request, 1);
109 req->seq = qd->send_seq; 103 req->seq = qd->send_seq;
110 req->uid = uid; 104 req->uid = uid;
111 qd->add_buddy_request = g_list_append(qd->add_buddy_request, req); 105 qd->add_buddy_request = g_list_append(qd->add_buddy_request, req);
112 } // _qq_send_packet_add_buddy 106 }
113 107
114 /*****************************************************************************/ 108 /* this buddy needs authentication, text conversion is done at lowest level */
115 // this buddy needs authentication, text conversion is done at lowest level 109 static void _qq_send_packet_buddy_auth(GaimConnection *gc, guint32 uid, const gchar response, const gchar *text)
116 static void _qq_send_packet_buddy_auth(GaimConnection * gc, guint32 uid, const gchar response, const gchar * text)
117 { 110 {
118 gchar *text_qq, *uid_str; 111 gchar *text_qq, *uid_str;
119 guint8 bar, *cursor, *raw_data; 112 guint8 bar, *cursor, *raw_data;
120 113
121 g_return_if_fail(gc != NULL && uid != 0); 114 g_return_if_fail(gc != NULL && uid != 0);
136 g_free(text_qq); 129 g_free(text_qq);
137 } 130 }
138 131
139 qq_send_cmd(gc, QQ_CMD_BUDDY_AUTH, TRUE, 0, TRUE, raw_data, cursor - raw_data); 132 qq_send_cmd(gc, QQ_CMD_BUDDY_AUTH, TRUE, 0, TRUE, raw_data, cursor - raw_data);
140 g_free(uid_str); 133 g_free(uid_str);
141 } // _qq_send_packet_buddy_auth 134 }
142 135
143 136 static void _qq_send_packet_add_buddy_auth_with_gc_and_uid(gc_and_uid *g, const gchar *text)
144 /*****************************************************************************/ 137 {
145 static void _qq_send_packet_add_buddy_auth_with_gc_and_uid(gc_and_uid * g, const gchar * text) {
146 GaimConnection *gc; 138 GaimConnection *gc;
147 guint32 uid; 139 guint32 uid;
148 g_return_if_fail(g != NULL); 140 g_return_if_fail(g != NULL);
149 141
150 gc = g->gc; 142 gc = g->gc;
151 uid = g->uid; 143 uid = g->uid;
152 g_return_if_fail(gc != NULL && uid != 0); 144 g_return_if_fail(gc != NULL && uid != 0);
153 145
154 _qq_send_packet_buddy_auth(gc, uid, QQ_MY_AUTH_REQUEST, text); 146 _qq_send_packet_buddy_auth(gc, uid, QQ_MY_AUTH_REQUEST, text);
155 g_free(g); 147 g_free(g);
156 } // qq_send_packet_add_buddy_auth 148 }
157 149
158 /*****************************************************************************/ 150 /* the real packet to reject and request is sent from here */
159 // the real packet to reject and request is sent from here 151 static void _qq_reject_add_request_real(gc_and_uid *g, const gchar *reason)
160 static void _qq_reject_add_request_real(gc_and_uid * g, const gchar * reason)
161 { 152 {
162 gint uid; 153 gint uid;
163 GaimConnection *gc; 154 GaimConnection *gc;
164 155
165 g_return_if_fail(g != NULL); 156 g_return_if_fail(g != NULL);
168 uid = g->uid; 159 uid = g->uid;
169 g_return_if_fail(gc != NULL && uid != 0); 160 g_return_if_fail(gc != NULL && uid != 0);
170 161
171 _qq_send_packet_buddy_auth(gc, uid, QQ_MY_AUTH_REJECT, reason); 162 _qq_send_packet_buddy_auth(gc, uid, QQ_MY_AUTH_REJECT, reason);
172 g_free(g); 163 g_free(g);
173 } // _qq_reject_add_request_real 164 }
174 165
175 /*****************************************************************************/ 166 /* we approve other's request of adding me as friend */
176 // we approve other's request of adding me as friend 167 void qq_approve_add_request_with_gc_and_uid(gc_and_uid *g)
177 void qq_approve_add_request_with_gc_and_uid(gc_and_uid * g)
178 { 168 {
179 gint uid; 169 gint uid;
180 GaimConnection *gc; 170 GaimConnection *gc;
181 171
182 g_return_if_fail(g != NULL); 172 g_return_if_fail(g != NULL);
185 uid = g->uid; 175 uid = g->uid;
186 g_return_if_fail(gc != NULL && uid != 0); 176 g_return_if_fail(gc != NULL && uid != 0);
187 177
188 _qq_send_packet_buddy_auth(gc, uid, QQ_MY_AUTH_APPROVE, NULL); 178 _qq_send_packet_buddy_auth(gc, uid, QQ_MY_AUTH_APPROVE, NULL);
189 g_free(g); 179 g_free(g);
190 } // qq_approve_add_request_with_gc_and_uid 180 }
191 181
192 /*****************************************************************************/ 182 void qq_do_nothing_with_gc_and_uid(gc_and_uid *g, const gchar *msg)
193 void qq_do_nothing_with_gc_and_uid(gc_and_uid * g, const gchar * msg)
194 { 183 {
195 g_free(g); 184 g_free(g);
196 } // qq_do_nothing_with_gc_and_uid 185 }
197 186
198 /*****************************************************************************/ 187 /* we reject other's request of adding me as friend */
199 // we reject other's request of adding me as friend 188 void qq_reject_add_request_with_gc_and_uid(gc_and_uid *g)
200 void qq_reject_add_request_with_gc_and_uid(gc_and_uid * g)
201 { 189 {
202 gint uid; 190 gint uid;
203 gchar *msg1, *msg2; 191 gchar *msg1, *msg2;
204 GaimConnection *gc; 192 GaimConnection *gc;
205 gc_and_uid *g2; 193 gc_and_uid *g2;
220 msg2 = g_strdup(_("Input your reason:")); 208 msg2 = g_strdup(_("Input your reason:"));
221 209
222 gaim_request_input(gc, _("Reject request"), msg1, msg2, 210 gaim_request_input(gc, _("Reject request"), msg1, msg2,
223 _("Sorry, you are not my type..."), TRUE, FALSE, 211 _("Sorry, you are not my type..."), TRUE, FALSE,
224 NULL, _("Reject"), G_CALLBACK(_qq_reject_add_request_real), _("Cancel"), NULL, g2); 212 NULL, _("Reject"), G_CALLBACK(_qq_reject_add_request_real), _("Cancel"), NULL, g2);
225 213 }
226 } // qq_reject_add_request_with_gc_and_uid 214
227 215 void qq_add_buddy_with_gc_and_uid(gc_and_uid *g)
228 /*****************************************************************************/
229 void qq_add_buddy_with_gc_and_uid(gc_and_uid * g)
230 { 216 {
231 gint uid; 217 gint uid;
232 GaimConnection *gc; 218 GaimConnection *gc;
233 219
234 g_return_if_fail(g != NULL); 220 g_return_if_fail(g != NULL);
237 uid = g->uid; 223 uid = g->uid;
238 g_return_if_fail(gc != NULL && uid != 0); 224 g_return_if_fail(gc != NULL && uid != 0);
239 225
240 _qq_send_packet_add_buddy(gc, uid); 226 _qq_send_packet_add_buddy(gc, uid);
241 g_free(g); 227 g_free(g);
242 } // qq_add_buddy_with_gc_and_uid 228 }
243 229
244 /*****************************************************************************/ 230 void qq_block_buddy_with_gc_and_uid(gc_and_uid *g)
245 void qq_block_buddy_with_gc_and_uid(gc_and_uid * g)
246 { 231 {
247 guint32 uid; 232 guint32 uid;
248 GaimConnection *gc; 233 GaimConnection *gc;
249 GaimBuddy buddy; 234 GaimBuddy buddy;
250 GaimGroup group; 235 GaimGroup group;
258 buddy.name = uid_to_gaim_name(uid); 243 buddy.name = uid_to_gaim_name(uid);
259 group.name = GAIM_GROUP_QQ_BLOCKED; 244 group.name = GAIM_GROUP_QQ_BLOCKED;
260 245
261 qq_remove_buddy(gc, &buddy, &group); 246 qq_remove_buddy(gc, &buddy, &group);
262 _qq_send_packet_remove_self_from(gc, uid); 247 _qq_send_packet_remove_self_from(gc, uid);
263 248 }
264 } // qq_block_buddy_with_gc_and_uid 249
265 250 /* process reply to add_buddy_auth request */
266 /*****************************************************************************/ 251 void qq_process_add_buddy_auth_reply(guint8 *buf, gint buf_len, GaimConnection *gc)
267 // process reply to add_buddy_auth request 252 {
268 void qq_process_add_buddy_auth_reply(guint8 * buf, gint buf_len, GaimConnection * gc) {
269 qq_data *qd; 253 qq_data *qd;
270 gint len; 254 gint len;
271 guint8 *data, *cursor, reply; 255 guint8 *data, *cursor, reply;
272 gchar **segments, *msg_utf8; 256 gchar **segments, *msg_utf8;
273 257
286 if (NULL == (segments = split_data(data, len, "\x1f", 2))) 270 if (NULL == (segments = split_data(data, len, "\x1f", 2)))
287 return; 271 return;
288 msg_utf8 = qq_to_utf8(segments[1], QQ_CHARSET_DEFAULT); 272 msg_utf8 = qq_to_utf8(segments[1], QQ_CHARSET_DEFAULT);
289 gaim_notify_error(gc, NULL, _("Add buddy with auth request fails"), msg_utf8); 273 gaim_notify_error(gc, NULL, _("Add buddy with auth request fails"), msg_utf8);
290 g_free(msg_utf8); 274 g_free(msg_utf8);
291 } else 275 } else {
292 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Add buddy with auth request OK\n"); 276 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Add buddy with auth request OK\n");
293 } else 277 }
278 } else {
294 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Error decrypt add buddy with auth reply\n"); 279 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Error decrypt add buddy with auth reply\n");
295 280 }
296 } // qq_process_add_buddy_auth_reply 281 }
297 282
298 /*****************************************************************************/ 283 /* process the server reply for my request to remove a buddy */
299 // process the server reply for my request to remove a buddy 284 void qq_process_remove_buddy_reply(guint8 *buf, gint buf_len, GaimConnection *gc)
300 void qq_process_remove_buddy_reply(guint8 * buf, gint buf_len, GaimConnection * gc) { 285 {
301 qq_data *qd; 286 qq_data *qd;
302 gint len; 287 gint len;
303 guint8 *data, *cursor, reply; 288 guint8 *data, *cursor, reply;
304 289
305 g_return_if_fail(gc != NULL && gc->proto_data != NULL); 290 g_return_if_fail(gc != NULL && gc->proto_data != NULL);
310 data = g_newa(guint8, len); 295 data = g_newa(guint8, len);
311 296
312 if (qq_crypt(DECRYPT, buf, buf_len, qd->session_key, data, &len)) { 297 if (qq_crypt(DECRYPT, buf, buf_len, qd->session_key, data, &len)) {
313 cursor = data; 298 cursor = data;
314 read_packet_b(data, &cursor, len, &reply); 299 read_packet_b(data, &cursor, len, &reply);
315 if (reply != QQ_REMOVE_BUDDY_REPLY_OK) 300 if (reply != QQ_REMOVE_BUDDY_REPLY_OK) {
316 // there is no reason return from server 301 /* there is no reason return from server */
317 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Remove buddy fails\n"); 302 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Remove buddy fails\n");
318 else { // if reply 303 } else { /* if reply */
319 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Remove buddy OK\n"); 304 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Remove buddy OK\n");
320 gaim_notify_info(gc, NULL, _("You have successfully removed a buddy"), NULL); 305 gaim_notify_info(gc, NULL, _("You have successfully removed a buddy"), NULL);
321 } 306 }
322 } else 307 } else {
323 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Error decrypt remove buddy reply\n"); 308 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Error decrypt remove buddy reply\n");
324 309 }
325 } // qq_process_remove_buddy_reply 310 }
326 311
327 312 /* process the server reply for my request to remove myself from a buddy */
328 /*****************************************************************************/ 313 void qq_process_remove_self_reply(guint8 *buf, gint buf_len, GaimConnection *gc)
329 // process the server reply for my request to remove myself from a buddy 314 {
330 void qq_process_remove_self_reply(guint8 * buf, gint buf_len, GaimConnection * gc) {
331 qq_data *qd; 315 qq_data *qd;
332 gint len; 316 gint len;
333 guint8 *data, *cursor, reply; 317 guint8 *data, *cursor, reply;
334 318
335 g_return_if_fail(gc != NULL && gc->proto_data != NULL); 319 g_return_if_fail(gc != NULL && gc->proto_data != NULL);
341 325
342 if (qq_crypt(DECRYPT, buf, buf_len, qd->session_key, data, &len)) { 326 if (qq_crypt(DECRYPT, buf, buf_len, qd->session_key, data, &len)) {
343 cursor = data; 327 cursor = data;
344 read_packet_b(data, &cursor, len, &reply); 328 read_packet_b(data, &cursor, len, &reply);
345 if (reply != QQ_REMOVE_SELF_REPLY_OK) 329 if (reply != QQ_REMOVE_SELF_REPLY_OK)
346 // there is no reason return from server 330 /* there is no reason return from server */
347 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Remove self fails\n"); 331 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Remove self fails\n");
348 else { // if reply 332 else { /* if reply */
349 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Remove self from a buddy OK\n"); 333 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Remove self from a buddy OK\n");
350 gaim_notify_info(gc, NULL, _("You have successfully removed yourself from a buddy"), NULL); 334 gaim_notify_info(gc, NULL, _("You have successfully removed yourself from a buddy"), NULL);
351 } 335 }
352 } else 336 } else {
353 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Error decrypt remove self reply\n"); 337 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Error decrypt remove self reply\n");
354 338 }
355 } // qq_process_remove_buddy_reply 339 }
356 340
357 /*****************************************************************************/ 341 void qq_process_add_buddy_reply(guint8 *buf, gint buf_len, guint16 seq, GaimConnection *gc)
358 void qq_process_add_buddy_reply(guint8 * buf, gint buf_len, guint16 seq, GaimConnection * gc) { 342 {
359 qq_data *qd; 343 qq_data *qd;
360 gint len, for_uid; 344 gint len, for_uid;
361 gchar *msg, *data, **segments, *uid, *reply; 345 gchar *msg, *data, **segments, *uid, *reply;
362 GList *list; 346 GList *list;
363 GaimBuddy *b; 347 GaimBuddy *b;
372 len = buf_len; 356 len = buf_len;
373 357
374 list = qd->add_buddy_request; 358 list = qd->add_buddy_request;
375 while (list != NULL) { 359 while (list != NULL) {
376 req = (qq_add_buddy_request *) list->data; 360 req = (qq_add_buddy_request *) list->data;
377 if (req->seq == seq) { // reply to this 361 if (req->seq == seq) { /* reply to this */
378 for_uid = req->uid; 362 for_uid = req->uid;
379 qd->add_buddy_request = g_list_remove(qd->add_buddy_request, qd->add_buddy_request->data); 363 qd->add_buddy_request = g_list_remove(qd->add_buddy_request, qd->add_buddy_request->data);
380 g_free(req); 364 g_free(req);
381 break; 365 break;
382 } 366 }
383 list = list->next; 367 list = list->next;
384 } // while list 368 }
385 369
386 if (for_uid == 0) { // we have no record for this 370 if (for_uid == 0) { /* we have no record for this */
387 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "We have no record for add buddy reply [%d], discard\n", seq); 371 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "We have no record for add buddy reply [%d], discard\n", seq);
388 return; 372 return;
389 } else 373 } else {
390 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Add buddy reply [%d] is for id [%d]\n", seq, for_uid); 374 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Add buddy reply [%d] is for id [%d]\n", seq, for_uid);
375 }
391 376
392 data = g_newa(guint8, len); 377 data = g_newa(guint8, len);
393 378
394 if (qq_crypt(DECRYPT, buf, buf_len, qd->session_key, data, &len)) { 379 if (qq_crypt(DECRYPT, buf, buf_len, qd->session_key, data, &len)) {
395 if (NULL == (segments = split_data(data, len, "\x1f", 2))) 380 if (NULL == (segments = split_data(data, len, "\x1f", 2)))
396 return; 381 return;
397 uid = segments[0]; 382 uid = segments[0];
398 reply = segments[1]; 383 reply = segments[1];
399 if (strtol(uid, NULL, 10) != qd->uid) { // should not happen 384 if (strtol(uid, NULL, 10) != qd->uid) { /* should not happen */
400 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Add buddy reply is to [%s], not me!", uid); 385 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Add buddy reply is to [%s], not me!", uid);
401 g_strfreev(segments); 386 g_strfreev(segments);
402 return; 387 return;
403 } // if uid 388 }
404 389
405 if (strtol(reply, NULL, 10) > 0) { // need auth 390 if (strtol(reply, NULL, 10) > 0) { /* need auth */
406 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Add buddy attempt fails, need authentication\n"); 391 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Add buddy attempt fails, need authentication\n");
407 b = gaim_find_buddy(gc->account, uid_to_gaim_name(for_uid)); 392 b = gaim_find_buddy(gc->account, uid_to_gaim_name(for_uid));
408 if (b != NULL) 393 if (b != NULL)
409 gaim_blist_remove_buddy(b); 394 gaim_blist_remove_buddy(b);
410 g = g_new0(gc_and_uid, 1); 395 g = g_new0(gc_and_uid, 1);
417 TRUE, FALSE, NULL, _("Send"), 402 TRUE, FALSE, NULL, _("Send"),
418 G_CALLBACK 403 G_CALLBACK
419 (_qq_send_packet_add_buddy_auth_with_gc_and_uid), 404 (_qq_send_packet_add_buddy_auth_with_gc_and_uid),
420 _("Cancel"), G_CALLBACK(qq_do_nothing_with_gc_and_uid), g); 405 _("Cancel"), G_CALLBACK(qq_do_nothing_with_gc_and_uid), g);
421 g_free(msg); 406 g_free(msg);
422 } else { // add OK 407 } else { /* add OK */
423 qq_add_buddy_by_recv_packet(gc, for_uid, TRUE, TRUE); 408 qq_add_buddy_by_recv_packet(gc, for_uid, TRUE, TRUE);
424 msg = g_strdup_printf(_("You have added %d in buddy list"), for_uid); 409 msg = g_strdup_printf(_("You have added %d in buddy list"), for_uid);
425 gaim_notify_info(gc, NULL, msg, NULL); 410 gaim_notify_info(gc, NULL, msg, NULL);
426 g_free(msg); 411 g_free(msg);
427 } // if reply 412 }
428 g_strfreev(segments); 413 g_strfreev(segments);
429 } else 414 } else {
430 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Error decrypt add buddy reply\n"); 415 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Error decrypt add buddy reply\n");
431 416 }
432 } // qq_process_add_buddy_reply 417 }
433 418
434 /*****************************************************************************/ 419 GaimGroup *qq_get_gaim_group(const gchar *group_name)
435 GaimGroup *qq_get_gaim_group(const gchar * group_name)
436 { 420 {
437 GaimGroup *g; 421 GaimGroup *g;
438 422
439 g_return_val_if_fail(group_name != NULL, NULL); 423 g_return_val_if_fail(group_name != NULL, NULL);
440 424
441 g = gaim_find_group(group_name); 425 g = gaim_find_group(group_name);
442 if (g == NULL) { 426 if (g == NULL) {
443 g = gaim_group_new(group_name); 427 g = gaim_group_new(group_name);
444 gaim_blist_add_group(g, NULL); 428 gaim_blist_add_group(g, NULL);
445 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Add new group: %s\n", group_name); 429 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Add new group: %s\n", group_name);
446 } // if (g == NULL) 430 }
447 431
448 return g; 432 return g;
449 } // qq_get_gaim_group 433 }
450 434
451 /*****************************************************************************/ 435 /* we add new buddy, if the received packet is from someone not in my list
452 // we add new buddy, if the received packet is from someone not in my list 436 * return the GaimBuddy that is just created */
453 // return the GaimBuddy that is just created 437 GaimBuddy *qq_add_buddy_by_recv_packet(GaimConnection *gc, guint32 uid, gboolean is_known, gboolean create)
454 GaimBuddy *qq_add_buddy_by_recv_packet(GaimConnection * gc, guint32 uid, gboolean is_known, gboolean create) { 438 {
455 GaimAccount *a; 439 GaimAccount *a;
456 GaimBuddy *b; 440 GaimBuddy *b;
457 GaimGroup *g; 441 GaimGroup *g;
458 qq_data *qd; 442 qq_data *qd;
459 qq_buddy *q_bud; 443 qq_buddy *q_bud;
470 454
471 g = qq_get_gaim_group(group_name); 455 g = qq_get_gaim_group(group_name);
472 456
473 name = uid_to_gaim_name(uid); 457 name = uid_to_gaim_name(uid);
474 b = gaim_find_buddy(gc->account, name); 458 b = gaim_find_buddy(gc->account, name);
475 // remove old, we can not simply return here 459 /* remove old, we can not simply return here
476 // because there might be old local copy of this buddy 460 * because there might be old local copy of this buddy */
477 if (b != NULL) 461 if (b != NULL)
478 gaim_blist_remove_buddy(b); 462 gaim_blist_remove_buddy(b);
479 463
480 b = gaim_buddy_new(a, name, NULL); 464 b = gaim_buddy_new(a, name, NULL);
481 465
486 q_bud->uid = uid; 470 q_bud->uid = uid;
487 b->proto_data = q_bud; 471 b->proto_data = q_bud;
488 qd->buddies = g_list_append(qd->buddies, q_bud); 472 qd->buddies = g_list_append(qd->buddies, q_bud);
489 qq_send_packet_get_info(gc, q_bud->uid, FALSE); 473 qq_send_packet_get_info(gc, q_bud->uid, FALSE);
490 qq_send_packet_get_buddies_online(gc, QQ_FRIENDS_ONLINE_POSITION_START); 474 qq_send_packet_get_buddies_online(gc, QQ_FRIENDS_ONLINE_POSITION_START);
491 } // if !create 475 }
492 476
493 gaim_blist_add_buddy(b, NULL, g, NULL); 477 gaim_blist_add_buddy(b, NULL, g, NULL);
494 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Add new buddy: [%s]\n", name); 478 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Add new buddy: [%s]\n", name);
495 479
496 g_free(name); 480 g_free(name);
497 g_free(group_name); 481 g_free(group_name);
498 482
499 return b; 483 return b;
500 } // qq_add_buddy_by_recv_packet 484 }
501 485
502 /*****************************************************************************/ 486 /* add a buddy and send packet to QQ server
503 // add a buddy and send packet to QQ server 487 * note that when gaim load local cached buddy list into its blist
504 // note that when gaim load local cached buddy list into its blist 488 * it also calls this funtion, so we have to
505 // it also calls this funtion, so we have to 489 * define qd->logged_in=TRUE AFTER serv_finish_login(gc) */
506 // define qd->logged_in=TRUE AFTER serv_finish_login(gc) 490 void qq_add_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group)
507 void qq_add_buddy(GaimConnection * gc, GaimBuddy * buddy, GaimGroup * group) { 491 {
508 qq_data *qd; 492 qq_data *qd;
509 guint32 uid; 493 guint32 uid;
510 GaimBuddy *b; 494 GaimBuddy *b;
511 495
512 g_return_if_fail(gc != NULL && gc->proto_data != NULL); 496 g_return_if_fail(gc != NULL && gc->proto_data != NULL);
513 497
514 qd = (qq_data *) gc->proto_data; 498 qd = (qq_data *) gc->proto_data;
515 if (!qd->logged_in) 499 if (!qd->logged_in)
516 return; // IMPORTANT ! 500 return; /* IMPORTANT ! */
517 501
518 uid = gaim_name_to_uid(buddy->name); 502 uid = gaim_name_to_uid(buddy->name);
519 if (uid > 0) 503 if (uid > 0)
520 _qq_send_packet_add_buddy(gc, uid); 504 _qq_send_packet_add_buddy(gc, uid);
521 else { 505 else {
524 gaim_blist_remove_buddy(b); 508 gaim_blist_remove_buddy(b);
525 gaim_notify_error(gc, NULL, 509 gaim_notify_error(gc, NULL,
526 _("QQid Error"), 510 _("QQid Error"),
527 _("Invalid QQid, to add buddy 1234567, \nyou should input qq-1234567")); 511 _("Invalid QQid, to add buddy 1234567, \nyou should input qq-1234567"));
528 } 512 }
529 } // _qq_add_buddy 513 }
530 514
531 /*****************************************************************************/ 515 /* remove a buddy and send packet to QQ server accordingly */
532 // remove a buddy and send packet to QQ server accordingly 516 void qq_remove_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group)
533 void qq_remove_buddy(GaimConnection * gc, GaimBuddy * buddy, GaimGroup * group) { 517 {
534 qq_data *qd; 518 qq_data *qd;
535 GaimBuddy *b; 519 GaimBuddy *b;
536 qq_buddy *q_bud; 520 qq_buddy *q_bud;
537 guint32 uid; 521 guint32 uid;
538 522
552 q_bud = (qq_buddy *) b->proto_data; 536 q_bud = (qq_buddy *) b->proto_data;
553 if (q_bud != NULL) 537 if (q_bud != NULL)
554 qd->buddies = g_list_remove(qd->buddies, q_bud); 538 qd->buddies = g_list_remove(qd->buddies, q_bud);
555 else 539 else
556 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "We have no qq_buddy record for %s\n", buddy->name); 540 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "We have no qq_buddy record for %s\n", buddy->name);
557 // remove buddy on blist, this does not trigger qq_remove_buddy again 541 /* remove buddy on blist, this does not trigger qq_remove_buddy again
558 // do this only if the request comes from block request, 542 * do this only if the request comes from block request,
559 // otherwise gaim segmentation fault 543 * otherwise gaim segmentation fault */
560 if (g_ascii_strcasecmp(group->name, GAIM_GROUP_QQ_BLOCKED) 544 if (g_ascii_strcasecmp(group->name, GAIM_GROUP_QQ_BLOCKED) == 0)
561 == 0)
562 gaim_blist_remove_buddy(b); 545 gaim_blist_remove_buddy(b);
563 } // if b != NULL 546 }
564 } // _qq_remove_buddy 547 }
565 548
566 /*****************************************************************************/ 549 /* free add buddy request queue */
567 // free add buddy request queue 550 void qq_add_buddy_request_free(qq_data *qd)
568 void qq_add_buddy_request_free(qq_data * qd)
569 { 551 {
570 gint i; 552 gint i;
571 qq_add_buddy_request *p; 553 qq_add_buddy_request *p;
572 554
573 g_return_if_fail(qd != NULL); 555 g_return_if_fail(qd != NULL);
578 qd->add_buddy_request = g_list_remove(qd->add_buddy_request, p); 560 qd->add_buddy_request = g_list_remove(qd->add_buddy_request, p);
579 g_free(p); 561 g_free(p);
580 i++; 562 i++;
581 } 563 }
582 gaim_debug(GAIM_DEBUG_INFO, "QQ", "%d add buddy requests are freed!\n", i); 564 gaim_debug(GAIM_DEBUG_INFO, "QQ", "%d add buddy requests are freed!\n", i);
583 } // qq_add_buddy_request_free 565 }
584 566
585 /*****************************************************************************/ 567 /* free up all qq_buddy */
586 // free up all qq_buddy 568 void qq_buddies_list_free(GaimAccount *account, qq_data *qd)
587 void qq_buddies_list_free(GaimAccount *account, qq_data * qd)
588 { 569 {
589 gint i; 570 gint i;
590 qq_buddy *p; 571 qq_buddy *p;
591 gchar *name; 572 gchar *name;
592 GaimBuddy *b; 573 GaimBuddy *b;
595 576
596 i = 0; 577 i = 0;
597 while (qd->buddies) { 578 while (qd->buddies) {
598 p = (qq_buddy *) (qd->buddies->data); 579 p = (qq_buddy *) (qd->buddies->data);
599 qd->buddies = g_list_remove(qd->buddies, p); 580 qd->buddies = g_list_remove(qd->buddies, p);
600 // added by gfhuang, for relogin crash bug
601 name = uid_to_gaim_name(p->uid); 581 name = uid_to_gaim_name(p->uid);
602 b = gaim_find_buddy(account, name); 582 b = gaim_find_buddy(account, name);
603 if(b != NULL) b->proto_data = NULL; 583 if(b != NULL)
604 else { 584 b->proto_data = NULL;
585 else
605 gaim_debug(GAIM_DEBUG_INFO, "QQ", "qq_buddy %s not found in gaim proto_data\n", name); 586 gaim_debug(GAIM_DEBUG_INFO, "QQ", "qq_buddy %s not found in gaim proto_data\n", name);
606 }
607 g_free(name); 587 g_free(name);
608 588
609 g_free(p); 589 g_free(p);
610 i++; 590 i++;
611 } 591 }
612 gaim_debug(GAIM_DEBUG_INFO, "QQ", "%d qq_buddy structures are freed!\n", i); 592 gaim_debug(GAIM_DEBUG_INFO, "QQ", "%d qq_buddy structures are freed!\n", i);
613 593 }
614 } // qq_buddies_list_free
615
616 /*****************************************************************************/
617 // END OF FILE