Mercurial > pidgin
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 |