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 {