Mercurial > pidgin.yaz
comparison libgaim/protocols/qq/group_join.c @ 14404:8ff8f1c897b5
[gaim-migrate @ 17112]
Fixed chat support.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Huetsch <markhuetsch> |
---|---|
date | Fri, 01 Sep 2006 11:03:18 +0000 |
parents | 60b1bc8dbf37 |
children | 6b8bc59414f0 |
comparison
equal
deleted
inserted
replaced
14403:646dcf11b4eb | 14404:8ff8f1c897b5 |
---|---|
28 #include "buddy_opt.h" | 28 #include "buddy_opt.h" |
29 #include "char_conv.h" | 29 #include "char_conv.h" |
30 #include "group_conv.h" | 30 #include "group_conv.h" |
31 #include "group_find.h" | 31 #include "group_find.h" |
32 #include "group_free.h" | 32 #include "group_free.h" |
33 #include "group_hash.h" | 33 #include "group_internal.h" |
34 #include "group_info.h" | 34 #include "group_info.h" |
35 #include "group_join.h" | 35 #include "group_join.h" |
36 #include "group_opt.h" | 36 #include "group_opt.h" |
37 #include "group_network.h" | 37 #include "group_network.h" |
38 #include "group_search.h" | |
38 | 39 |
39 enum { | 40 enum { |
40 QQ_GROUP_JOIN_OK = 0x01, | 41 QQ_GROUP_JOIN_OK = 0x01, |
41 QQ_GROUP_JOIN_NEED_AUTH = 0x02, | 42 QQ_GROUP_JOIN_NEED_AUTH = 0x02, |
42 }; | 43 }; |
49 | 50 |
50 g_return_if_fail(g != NULL && g->gc != NULL && g->uid > 0); | 51 g_return_if_fail(g != NULL && g->gc != NULL && g->uid > 0); |
51 gc = g->gc; | 52 gc = g->gc; |
52 internal_group_id = g->uid; | 53 internal_group_id = g->uid; |
53 | 54 |
54 group = qq_group_find_by_internal_group_id(gc, internal_group_id); | 55 group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); |
55 g_return_if_fail(group != NULL); | 56 g_return_if_fail(group != NULL); |
56 | 57 |
57 qq_send_cmd_group_exit_group(gc, group); | 58 qq_send_cmd_group_exit_group(gc, group); |
58 } | 59 } |
59 | 60 |
60 /* send packet to join a group without auth */ | 61 /* send packet to join a group without auth */ |
61 static void _qq_send_cmd_group_join_group(GaimConnection *gc, qq_group *group) | 62 void qq_send_cmd_group_join_group(GaimConnection *gc, qq_group *group) |
62 { | 63 { |
63 guint8 *raw_data, *cursor; | 64 guint8 *raw_data, *cursor; |
64 gint bytes, data_len; | 65 gint bytes, data_len; |
65 | 66 |
66 g_return_if_fail(gc != NULL && group != NULL); | 67 g_return_if_fail(gc != NULL && group != NULL); |
68 | |
67 if (group->my_status == QQ_GROUP_MEMBER_STATUS_NOT_MEMBER) { | 69 if (group->my_status == QQ_GROUP_MEMBER_STATUS_NOT_MEMBER) { |
68 group->my_status = QQ_GROUP_MEMBER_STATUS_APPLYING; | 70 group->my_status = QQ_GROUP_MEMBER_STATUS_APPLYING; |
69 qq_group_refresh(gc, group); | 71 qq_group_refresh(gc, group); |
70 } | 72 } |
71 | 73 |
74 switch (group->auth_type) { | |
75 case QQ_GROUP_AUTH_TYPE_NO_AUTH: | |
76 case QQ_GROUP_AUTH_TYPE_NEED_AUTH: | |
77 break; | |
78 case QQ_GROUP_AUTH_TYPE_NO_ADD: | |
79 gaim_notify_warning(gc, NULL, _("This group does not allow others to join"), NULL); | |
80 return; | |
81 default: | |
82 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Unknown group auth type: %d\n", group->auth_type); | |
83 break; | |
84 } | |
85 | |
72 data_len = 5; | 86 data_len = 5; |
73 raw_data = g_newa(guint8, data_len); | 87 raw_data = g_newa(guint8, data_len); |
74 cursor = raw_data; | 88 cursor = raw_data; |
75 | 89 |
76 bytes = 0; | 90 bytes = 0; |
92 | 106 |
93 g_return_if_fail(g != NULL && g->gc != NULL && g->uid > 0); | 107 g_return_if_fail(g != NULL && g->gc != NULL && g->uid > 0); |
94 gc = g->gc; | 108 gc = g->gc; |
95 internal_group_id = g->uid; | 109 internal_group_id = g->uid; |
96 | 110 |
97 group = qq_group_find_by_internal_group_id(gc, internal_group_id); | 111 group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); |
98 if (group == NULL) { | 112 if (group == NULL) { |
99 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Can not find qq_group by internal_id: %d\n", internal_group_id); | 113 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Can not find qq_group by internal_id: %d\n", internal_group_id); |
100 return; | 114 return; |
101 } else { /* everything is OK */ | 115 } else { /* everything is OK */ |
102 qq_send_cmd_group_auth(gc, group, QQ_GROUP_AUTH_REQUEST_APPLY, 0, reason_utf8); | 116 qq_send_cmd_group_auth(gc, group, QQ_GROUP_AUTH_REQUEST_APPLY, 0, reason_utf8); |
161 "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_JOIN_GROUP_AUTH)); | 175 "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_JOIN_GROUP_AUTH)); |
162 else | 176 else |
163 qq_send_group_cmd(gc, group, raw_data, data_len); | 177 qq_send_group_cmd(gc, group, raw_data, data_len); |
164 } | 178 } |
165 | 179 |
166 /* send packet to exit one group | 180 /* send a packet to exit a group */ |
167 * In fact, this will never be used for GAIM | |
168 * when we remove a GaimChat node, there is no user controlable callback | |
169 * so we only remove the GaimChat node, | |
170 * but we never use this cmd to update the server side | |
171 * anyway, it is function, as when we remove the GaimChat node, | |
172 * user has no way to start up the chat conversation window | |
173 * therefore even we are still in it, | |
174 * the group IM will not show up to bother us. (Limited by GAIM) */ | |
175 void qq_send_cmd_group_exit_group(GaimConnection *gc, qq_group *group) | 181 void qq_send_cmd_group_exit_group(GaimConnection *gc, qq_group *group) |
176 { | 182 { |
177 guint8 *raw_data, *cursor; | 183 guint8 *raw_data, *cursor; |
178 gint bytes, data_len; | 184 gint bytes, data_len; |
179 | 185 |
210 bytes = 0; | 216 bytes = 0; |
211 expected_bytes = 4; | 217 expected_bytes = 4; |
212 bytes += read_packet_dw(data, cursor, len, &internal_group_id); | 218 bytes += read_packet_dw(data, cursor, len, &internal_group_id); |
213 | 219 |
214 if (bytes == expected_bytes) { | 220 if (bytes == expected_bytes) { |
215 group = qq_group_find_by_internal_group_id(gc, internal_group_id); | 221 group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); |
216 if (group != NULL) { | 222 if (group != NULL) { |
217 chat = | 223 chat = |
218 gaim_blist_find_chat | 224 gaim_blist_find_chat |
219 (gaim_connection_get_account(gc), g_strdup_printf("%d", group->external_group_id)); | 225 (gaim_connection_get_account(gc), g_strdup_printf("%d", group->external_group_id)); |
220 if (chat != NULL) | 226 if (chat != NULL) |
221 gaim_blist_remove_chat(chat); | 227 gaim_blist_remove_chat(chat); |
222 qq_group_remove_by_internal_group_id(qd, internal_group_id); | 228 qq_group_delete_internal_record(qd, internal_group_id); |
223 } | 229 } |
224 gaim_notify_info(gc, _("QQ Qun Operation"), _("You have successfully exit group"), NULL); | 230 gaim_notify_info(gc, _("QQ Qun Operation"), _("You have successfully exited the group"), NULL); |
225 } else { | 231 } else { |
226 gaim_debug(GAIM_DEBUG_ERROR, "QQ", | 232 gaim_debug(GAIM_DEBUG_ERROR, "QQ", |
227 "Invalid exit group reply, expect %d bytes, read %d bytes\n", expected_bytes, bytes); | 233 "Invalid exit group reply, expect %d bytes, read %d bytes\n", expected_bytes, bytes); |
228 } | 234 } |
229 } | 235 } |
244 bytes += read_packet_dw(data, cursor, len, &internal_group_id); | 250 bytes += read_packet_dw(data, cursor, len, &internal_group_id); |
245 g_return_if_fail(internal_group_id > 0); | 251 g_return_if_fail(internal_group_id > 0); |
246 | 252 |
247 if (bytes == expected_bytes) | 253 if (bytes == expected_bytes) |
248 gaim_notify_info | 254 gaim_notify_info |
249 (gc, _("QQ Group Auth"), _("You authorization operation has been accepted by QQ server"), NULL); | 255 (gc, _("QQ Group Auth"), |
256 _("Your authorization operation has been accepted by the QQ server"), NULL); | |
250 else | 257 else |
251 gaim_debug(GAIM_DEBUG_ERROR, "QQ", | 258 gaim_debug(GAIM_DEBUG_ERROR, "QQ", |
252 "Invalid join group reply, expect %d bytes, read %d bytes\n", expected_bytes, bytes); | 259 "Invalid join group reply, expect %d bytes, read %d bytes\n", expected_bytes, bytes); |
253 } | 260 } |
254 | 261 |
270 if (bytes != expected_bytes) { | 277 if (bytes != expected_bytes) { |
271 gaim_debug(GAIM_DEBUG_ERROR, "QQ", | 278 gaim_debug(GAIM_DEBUG_ERROR, "QQ", |
272 "Invalid join group reply, expect %d bytes, read %d bytes\n", expected_bytes, bytes); | 279 "Invalid join group reply, expect %d bytes, read %d bytes\n", expected_bytes, bytes); |
273 return; | 280 return; |
274 } else { /* join group OK */ | 281 } else { /* join group OK */ |
275 group = qq_group_find_by_internal_group_id(gc, internal_group_id); | 282 group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); |
276 /* need to check if group is NULL or not. */ | 283 /* need to check if group is NULL or not. */ |
277 g_return_if_fail(group != NULL); | 284 g_return_if_fail(group != NULL); |
278 switch (reply) { | 285 switch (reply) { |
279 case QQ_GROUP_JOIN_OK: | 286 case QQ_GROUP_JOIN_OK: |
280 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Succeed joining group \"%s\"\n", group->group_name_utf8); | 287 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Succeed joining group \"%s\"\n", group->group_name_utf8); |
281 group->my_status = QQ_GROUP_MEMBER_STATUS_IS_MEMBER; | 288 group->my_status = QQ_GROUP_MEMBER_STATUS_IS_MEMBER; |
282 qq_group_refresh(gc, group); | 289 qq_group_refresh(gc, group); |
283 /* this must be show before getting online member */ | 290 /* this must be shown before getting online members */ |
284 qq_group_conv_show_window(gc, group); | 291 qq_group_conv_show_window(gc, group); |
285 qq_send_cmd_group_get_group_info(gc, group); | 292 qq_send_cmd_group_get_group_info(gc, group); |
286 break; | 293 break; |
287 case QQ_GROUP_JOIN_NEED_AUTH: | 294 case QQ_GROUP_JOIN_NEED_AUTH: |
288 gaim_debug(GAIM_DEBUG_INFO, "QQ", | 295 gaim_debug(GAIM_DEBUG_INFO, "QQ", |
298 group->external_group_id, group->group_name_utf8, reply); | 305 group->external_group_id, group->group_name_utf8, reply); |
299 } | 306 } |
300 } | 307 } |
301 } | 308 } |
302 | 309 |
303 /* Apply to join one group without auth */ | 310 /* Attempt to join a group without auth */ |
304 void qq_group_join(GaimConnection *gc, GHashTable *data) | 311 void qq_group_join(GaimConnection *gc, GHashTable *data) |
305 { | 312 { |
306 gchar *internal_group_id_ptr; | 313 qq_data *qd; |
307 guint32 internal_group_id; | 314 gchar *external_group_id_ptr; |
308 qq_group *group; | 315 guint32 external_group_id; |
309 | 316 qq_group *group; |
310 g_return_if_fail(gc != NULL && data != NULL); | 317 |
311 | 318 g_return_if_fail(gc != NULL && gc->proto_data != NULL && data != NULL); |
312 internal_group_id_ptr = g_hash_table_lookup(data, "internal_group_id"); | 319 qd = (qq_data *) gc->proto_data; |
313 internal_group_id = strtol(internal_group_id_ptr, NULL, 10); | 320 |
314 | 321 external_group_id_ptr = g_hash_table_lookup(data, QQ_GROUP_KEY_EXTERNAL_ID); |
315 g_return_if_fail(internal_group_id > 0); | 322 g_return_if_fail(external_group_id_ptr != NULL); |
316 | 323 errno = 0; |
317 /* for those we have subscribed, they should have been put into | 324 external_group_id = strtol(external_group_id_ptr, NULL, 10); |
318 * qd->groups in qq_group_init subroutine */ | 325 if (errno != 0) { |
319 group = qq_group_find_by_internal_group_id(gc, internal_group_id); | 326 gaim_notify_error(gc, _("Error"), |
320 if (group == NULL) | 327 _("You inputted a group id outside the acceptable range"), NULL); |
321 group = qq_group_from_hashtable(gc, data); | 328 return; |
322 | 329 } |
323 g_return_if_fail(group != NULL); | 330 |
324 | 331 group = qq_group_find_by_id(gc, external_group_id, QQ_EXTERNAL_ID); |
325 switch (group->auth_type) { | 332 if (group) { |
326 case QQ_GROUP_AUTH_TYPE_NO_AUTH: | 333 qq_send_cmd_group_join_group(gc, group); |
327 case QQ_GROUP_AUTH_TYPE_NEED_AUTH: | 334 } else { |
328 _qq_send_cmd_group_join_group(gc, group); | 335 qq_set_pending_id(&qd->joining_groups, external_group_id, TRUE); |
329 break; | 336 qq_send_cmd_group_search_group(gc, external_group_id); |
330 case QQ_GROUP_AUTH_TYPE_NO_ADD: | |
331 gaim_notify_warning(gc, NULL, _("This group does not allow others to join"), NULL); | |
332 break; | |
333 default: | |
334 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Unknown group auth type: %d\n", group->auth_type); | |
335 } | 337 } |
336 } | 338 } |
337 | 339 |
338 void qq_group_exit(GaimConnection *gc, GHashTable *data) | 340 void qq_group_exit(GaimConnection *gc, GHashTable *data) |
339 { | 341 { |