Mercurial > pidgin.yaz
comparison libpurple/protocols/qq/group_network.c @ 23050:9a5d140400f1
patch-02-fix-multiarch
author | SHiNE CsyFeK <csyfek@gmail.com> |
---|---|
date | Tue, 24 Jun 2008 11:58:57 +0000 |
parents | 217fffe3f46f |
children | 190bc4ecf6c3 |
comparison
equal
deleted
inserted
replaced
23048:13a9b56f83b0 | 23050:9a5d140400f1 |
---|---|
79 return "Unknown QQ Group Command"; | 79 return "Unknown QQ Group Command"; |
80 } | 80 } |
81 } | 81 } |
82 | 82 |
83 /* default process of reply error */ | 83 /* default process of reply error */ |
84 static void _qq_process_group_cmd_reply_error_default(guint8 reply, guint8 *cursor, gint len, PurpleConnection *gc) | 84 static void _qq_process_group_cmd_reply_error_default(guint8 reply, guint8 *data, gint len, PurpleConnection *gc) |
85 { | 85 { |
86 gchar *msg, *msg_utf8; | 86 gchar *msg, *msg_utf8; |
87 g_return_if_fail(cursor != NULL && len > 0); | 87 g_return_if_fail(data != NULL && len > 0); |
88 | 88 |
89 msg = g_strndup((gchar *) cursor, len); /* it will append 0x00 */ | 89 msg = g_strndup((gchar *) data, len); /* it will append 0x00 */ |
90 msg_utf8 = qq_to_utf8(msg, QQ_CHARSET_DEFAULT); | 90 msg_utf8 = qq_to_utf8(msg, QQ_CHARSET_DEFAULT); |
91 g_free(msg); | 91 g_free(msg); |
92 msg = g_strdup_printf(_("Code [0x%02X]: %s"), reply, msg_utf8); | 92 msg = g_strdup_printf(_("Code [0x%02X]: %s"), reply, msg_utf8); |
93 purple_notify_error(gc, NULL, _("Group Operation Error"), msg); | 93 purple_notify_error(gc, NULL, _("Group Operation Error"), msg); |
94 g_free(msg); | 94 g_free(msg); |
95 g_free(msg_utf8); | 95 g_free(msg_utf8); |
96 } | 96 } |
97 | 97 |
98 /* default process, dump only */ | 98 /* default process, dump only */ |
99 static void _qq_process_group_cmd_reply_default(guint8 *data, guint8 **cursor, gint len, PurpleConnection *gc) | 99 static void _qq_process_group_cmd_reply_default(guint8 *data, gint len, PurpleConnection *gc) |
100 { | 100 { |
101 gchar *hex_dump; | 101 gchar *hex_dump; |
102 g_return_if_fail(data != NULL && len > 0); | 102 g_return_if_fail(data != NULL && len > 0); |
103 | 103 |
104 hex_dump = hex_dump_to_str(data, len); | 104 hex_dump = hex_dump_to_str(data, len); |
134 { | 134 { |
135 qq_group *group; | 135 qq_group *group; |
136 qq_data *qd; | 136 qq_data *qd; |
137 gint len, bytes; | 137 gint len, bytes; |
138 guint32 internal_group_id; | 138 guint32 internal_group_id; |
139 guint8 *data, *cursor, sub_cmd, reply; | 139 guint8 *data, sub_cmd, reply; |
140 | 140 |
141 g_return_if_fail(buf != NULL && buf_len != 0); | 141 g_return_if_fail(buf != NULL && buf_len != 0); |
142 | 142 |
143 qd = (qq_data *) gc->proto_data; | 143 qd = (qq_data *) gc->proto_data; |
144 len = buf_len; | 144 len = buf_len; |
147 if (!qq_group_find_internal_group_id_by_seq(gc, seq, &internal_group_id)) { | 147 if (!qq_group_find_internal_group_id_by_seq(gc, seq, &internal_group_id)) { |
148 purple_debug(PURPLE_DEBUG_WARNING, "QQ", "We have no record of group cmd, seq [%d]\n", seq); | 148 purple_debug(PURPLE_DEBUG_WARNING, "QQ", "We have no record of group cmd, seq [%d]\n", seq); |
149 return; | 149 return; |
150 } | 150 } |
151 | 151 |
152 if (qq_decrypt(buf, buf_len, qd->session_key, data, &len)) { | 152 if ( !qq_decrypt(buf, buf_len, qd->session_key, data, &len) ) { |
153 if (len <= 2) { | 153 purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt group cmd reply\n"); |
154 purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Group cmd reply is too short, only %d bytes\n", len); | 154 return; |
155 return; | 155 } |
156 } | 156 |
157 | 157 if (len <= 2) { |
158 bytes = 0; | 158 purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Group cmd reply is too short, only %d bytes\n", len); |
159 cursor = data; | 159 return; |
160 bytes += read_packet_b(data, &cursor, len, &sub_cmd); | 160 } |
161 bytes += read_packet_b(data, &cursor, len, &reply); | 161 |
162 | 162 bytes = 0; |
163 group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); | 163 bytes += qq_get8(&sub_cmd, data + bytes); |
164 | 164 bytes += qq_get8(&reply, data + bytes); |
165 if (reply != QQ_GROUP_CMD_REPLY_OK) { | 165 |
166 purple_debug(PURPLE_DEBUG_WARNING, "QQ", | 166 group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); |
167 "Group cmd reply says cmd %s fails\n", qq_group_cmd_get_desc(sub_cmd)); | 167 |
168 | 168 if (reply != QQ_GROUP_CMD_REPLY_OK) { |
169 if (group != NULL) | 169 purple_debug(PURPLE_DEBUG_WARNING, "QQ", |
170 qq_set_pending_id(&qd->joining_groups, group->external_group_id, FALSE); | 170 "Group cmd reply says cmd %s fails\n", qq_group_cmd_get_desc(sub_cmd)); |
171 | 171 |
172 switch (reply) { /* this should be all errors */ | 172 if (group != NULL) |
173 case QQ_GROUP_CMD_REPLY_NOT_MEMBER: | 173 qq_set_pending_id(&qd->joining_groups, group->external_group_id, FALSE); |
174 if (group != NULL) { | 174 |
175 purple_debug(PURPLE_DEBUG_WARNING, | 175 switch (reply) { /* this should be all errors */ |
176 "QQ", | 176 case QQ_GROUP_CMD_REPLY_NOT_MEMBER: |
177 "You are not a member of group \"%s\"\n", group->group_name_utf8); | |
178 group->my_status = QQ_GROUP_MEMBER_STATUS_NOT_MEMBER; | |
179 qq_group_refresh(gc, group); | |
180 } | |
181 break; | |
182 case QQ_GROUP_CMD_REPLY_SEARCH_ERROR: | |
183 if (qd->roomlist != NULL) { | |
184 if (purple_roomlist_get_in_progress(qd->roomlist)) | |
185 purple_roomlist_set_in_progress(qd->roomlist, FALSE); | |
186 } | |
187 _qq_process_group_cmd_reply_error_default(reply, cursor, len - bytes, gc); | |
188 break; | |
189 default: | |
190 _qq_process_group_cmd_reply_error_default(reply, cursor, len - bytes, gc); | |
191 } | |
192 return; | |
193 } | |
194 | |
195 /* seems ok so far, so we process the reply according to sub_cmd */ | |
196 switch (sub_cmd) { | |
197 case QQ_GROUP_CMD_GET_GROUP_INFO: | |
198 qq_process_group_cmd_get_group_info(data, &cursor, len, gc); | |
199 if (group != NULL) { | 177 if (group != NULL) { |
200 qq_send_cmd_group_get_members_info(gc, group); | 178 purple_debug(PURPLE_DEBUG_WARNING, |
201 qq_send_cmd_group_get_online_members(gc, group); | 179 "QQ", |
180 "You are not a member of group \"%s\"\n", group->group_name_utf8); | |
181 group->my_status = QQ_GROUP_MEMBER_STATUS_NOT_MEMBER; | |
182 qq_group_refresh(gc, group); | |
202 } | 183 } |
203 break; | 184 break; |
204 case QQ_GROUP_CMD_CREATE_GROUP: | 185 case QQ_GROUP_CMD_REPLY_SEARCH_ERROR: |
205 qq_group_process_create_group_reply(data, &cursor, len, gc); | 186 if (qd->roomlist != NULL) { |
206 break; | 187 if (purple_roomlist_get_in_progress(qd->roomlist)) |
207 case QQ_GROUP_CMD_MODIFY_GROUP_INFO: | 188 purple_roomlist_set_in_progress(qd->roomlist, FALSE); |
208 qq_group_process_modify_info_reply(data, &cursor, len, gc); | 189 } |
209 break; | 190 _qq_process_group_cmd_reply_error_default(reply, data + bytes, len - bytes, gc); |
210 case QQ_GROUP_CMD_MEMBER_OPT: | |
211 qq_group_process_modify_members_reply(data, &cursor, len, gc); | |
212 break; | |
213 case QQ_GROUP_CMD_ACTIVATE_GROUP: | |
214 qq_group_process_activate_group_reply(data, &cursor, len, gc); | |
215 break; | |
216 case QQ_GROUP_CMD_SEARCH_GROUP: | |
217 qq_process_group_cmd_search_group(data, &cursor, len, gc); | |
218 break; | |
219 case QQ_GROUP_CMD_JOIN_GROUP: | |
220 qq_process_group_cmd_join_group(data, &cursor, len, gc); | |
221 break; | |
222 case QQ_GROUP_CMD_JOIN_GROUP_AUTH: | |
223 qq_process_group_cmd_join_group_auth(data, &cursor, len, gc); | |
224 break; | |
225 case QQ_GROUP_CMD_EXIT_GROUP: | |
226 qq_process_group_cmd_exit_group(data, &cursor, len, gc); | |
227 break; | |
228 case QQ_GROUP_CMD_SEND_MSG: | |
229 qq_process_group_cmd_im(data, &cursor, len, gc); | |
230 break; | |
231 case QQ_GROUP_CMD_GET_ONLINE_MEMBER: | |
232 qq_process_group_cmd_get_online_members(data, &cursor, len, gc); | |
233 if (group != NULL) | |
234 qq_group_conv_refresh_online_member(gc, group); | |
235 break; | |
236 case QQ_GROUP_CMD_GET_MEMBER_INFO: | |
237 qq_process_group_cmd_get_members_info(data, &cursor, len, gc); | |
238 if (group != NULL) | |
239 qq_group_conv_refresh_online_member(gc, group); | |
240 break; | 191 break; |
241 default: | 192 default: |
242 purple_debug(PURPLE_DEBUG_WARNING, "QQ", | 193 _qq_process_group_cmd_reply_error_default(reply, data + bytes, len - bytes, gc); |
243 "Group cmd %s is processed by default\n", qq_group_cmd_get_desc(sub_cmd)); | |
244 _qq_process_group_cmd_reply_default(data, &cursor, len, gc); | |
245 } | 194 } |
246 | 195 return; |
247 } else { | 196 } |
248 purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt group cmd reply\n"); | 197 |
249 } | 198 /* seems ok so far, so we process the reply according to sub_cmd */ |
250 } | 199 switch (sub_cmd) { |
200 case QQ_GROUP_CMD_GET_GROUP_INFO: | |
201 qq_process_group_cmd_get_group_info(data + bytes, len - bytes, gc); | |
202 if (group != NULL) { | |
203 qq_send_cmd_group_get_members_info(gc, group); | |
204 qq_send_cmd_group_get_online_members(gc, group); | |
205 } | |
206 break; | |
207 case QQ_GROUP_CMD_CREATE_GROUP: | |
208 qq_group_process_create_group_reply(data + bytes, len - bytes, gc); | |
209 break; | |
210 case QQ_GROUP_CMD_MODIFY_GROUP_INFO: | |
211 qq_group_process_modify_info_reply(data + bytes, len - bytes, gc); | |
212 break; | |
213 case QQ_GROUP_CMD_MEMBER_OPT: | |
214 qq_group_process_modify_members_reply(data + bytes, len - bytes, gc); | |
215 break; | |
216 case QQ_GROUP_CMD_ACTIVATE_GROUP: | |
217 qq_group_process_activate_group_reply(data + bytes, len - bytes, gc); | |
218 break; | |
219 case QQ_GROUP_CMD_SEARCH_GROUP: | |
220 qq_process_group_cmd_search_group(data + bytes, len - bytes, gc); | |
221 break; | |
222 case QQ_GROUP_CMD_JOIN_GROUP: | |
223 qq_process_group_cmd_join_group(data + bytes, len - bytes, gc); | |
224 break; | |
225 case QQ_GROUP_CMD_JOIN_GROUP_AUTH: | |
226 qq_process_group_cmd_join_group_auth(data + bytes, len - bytes, gc); | |
227 break; | |
228 case QQ_GROUP_CMD_EXIT_GROUP: | |
229 qq_process_group_cmd_exit_group(data + bytes, len - bytes, gc); | |
230 break; | |
231 case QQ_GROUP_CMD_SEND_MSG: | |
232 qq_process_group_cmd_im(data + bytes, len - bytes, gc); | |
233 break; | |
234 case QQ_GROUP_CMD_GET_ONLINE_MEMBER: | |
235 qq_process_group_cmd_get_online_members(data + bytes, len - bytes, gc); | |
236 if (group != NULL) | |
237 qq_group_conv_refresh_online_member(gc, group); | |
238 break; | |
239 case QQ_GROUP_CMD_GET_MEMBER_INFO: | |
240 qq_process_group_cmd_get_members_info(data + bytes, len - bytes, gc); | |
241 if (group != NULL) | |
242 qq_group_conv_refresh_online_member(gc, group); | |
243 break; | |
244 default: | |
245 purple_debug(PURPLE_DEBUG_WARNING, "QQ", | |
246 "Group cmd %s is processed by default\n", qq_group_cmd_get_desc(sub_cmd)); | |
247 _qq_process_group_cmd_reply_default(data + bytes, len, gc); | |
248 } | |
249 } |