| 189 purple_debug_error("QQ", |
190 purple_debug_error("QQ", |
| 190 "Fail creating group_im packet, expect %d bytes, build %d bytes\n", data_len, bytes); |
191 "Fail creating group_im packet, expect %d bytes, build %d bytes\n", data_len, bytes); |
| 191 } |
192 } |
| 192 |
193 |
| 193 /* this is the ACK */ |
194 /* this is the ACK */ |
| 194 void qq_process_group_cmd_im(guint8 *data, gint len, PurpleConnection *gc) |
195 void qq_process_room_send_im(PurpleConnection *gc, guint8 *data, gint len) |
| 195 { |
196 { |
| 196 /* return should be the internal group id |
197 /* return should be the internal group id |
| 197 * but we have nothing to do with it */ |
198 * but we have nothing to do with it */ |
| 198 return; |
199 return; |
| 199 } |
|
| 200 |
|
| 201 /* receive an application to join the group */ |
|
| 202 void qq_process_room_msg_apply_join(guint8 *data, gint len, guint32 id, PurpleConnection *gc) |
|
| 203 { |
|
| 204 guint32 ext_id, user_uid; |
|
| 205 guint8 type8; |
|
| 206 gchar *reason_utf8, *msg, *reason; |
|
| 207 group_member_opt *g; |
|
| 208 gchar *nombre; |
|
| 209 gint bytes = 0; |
|
| 210 |
|
| 211 g_return_if_fail(id > 0 && data != NULL && len > 0); |
|
| 212 |
|
| 213 /* FIXME: check length here */ |
|
| 214 |
|
| 215 bytes += qq_get32(&ext_id, data + bytes); |
|
| 216 bytes += qq_get8(&type8, data + bytes); |
|
| 217 bytes += qq_get32(&user_uid, data + bytes); |
|
| 218 |
|
| 219 g_return_if_fail(ext_id > 0 && user_uid > 0); |
|
| 220 |
|
| 221 bytes += qq_get_vstr(&reason_utf8, QQ_CHARSET_DEFAULT, data + bytes); |
|
| 222 |
|
| 223 msg = g_strdup_printf(_("%d request to join Qun %d"), user_uid, ext_id); |
|
| 224 reason = g_strdup_printf(_("Message: %s"), reason_utf8); |
|
| 225 |
|
| 226 g = g_new0(group_member_opt, 1); |
|
| 227 g->gc = gc; |
|
| 228 g->id = id; |
|
| 229 g->member = user_uid; |
|
| 230 |
|
| 231 nombre = uid_to_purple_name(user_uid); |
|
| 232 |
|
| 233 purple_request_action(gc, _("QQ Qun Operation"), |
|
| 234 msg, reason, |
|
| 235 PURPLE_DEFAULT_ACTION_NONE, |
|
| 236 purple_connection_get_account(gc), nombre, NULL, |
|
| 237 g, 3, |
|
| 238 _("Approve"), |
|
| 239 G_CALLBACK |
|
| 240 (qq_group_approve_application_with_struct), |
|
| 241 _("Reject"), |
|
| 242 G_CALLBACK |
|
| 243 (qq_group_reject_application_with_struct), |
|
| 244 _("Search"), G_CALLBACK(qq_group_search_application_with_struct)); |
|
| 245 |
|
| 246 g_free(nombre); |
|
| 247 g_free(reason); |
|
| 248 g_free(msg); |
|
| 249 g_free(reason_utf8); |
|
| 250 } |
200 } |
| 251 |
201 |
| 252 void qq_room_got_chat_in(PurpleConnection *gc, |
202 void qq_room_got_chat_in(PurpleConnection *gc, |
| 253 guint32 room_id, guint32 uid_from, const gchar *msg, time_t in_time) |
203 guint32 room_id, guint32 uid_from, const gchar *msg, time_t in_time) |
| 254 { |
204 { |
| 283 } |
233 } |
| 284 serv_got_chat_in(gc, room_id, from, 0, msg, in_time); |
234 serv_got_chat_in(gc, room_id, from, 0, msg, in_time); |
| 285 g_free(from); |
235 g_free(from); |
| 286 } |
236 } |
| 287 |
237 |
| 288 /* the request to join a group is rejected */ |
|
| 289 void qq_process_room_msg_been_rejected(guint8 *data, gint len, guint32 id, PurpleConnection *gc) |
|
| 290 { |
|
| 291 guint32 ext_id, admin_uid; |
|
| 292 guint8 type8; |
|
| 293 gchar *reason_utf8, *msg, *reason; |
|
| 294 qq_room_data *rmd; |
|
| 295 gint bytes; |
|
| 296 |
|
| 297 g_return_if_fail(data != NULL && len > 0); |
|
| 298 |
|
| 299 /* FIXME: check length here */ |
|
| 300 bytes = 0; |
|
| 301 bytes += qq_get32(&ext_id, data + bytes); |
|
| 302 bytes += qq_get8(&type8, data + bytes); |
|
| 303 bytes += qq_get32(&admin_uid, data + bytes); |
|
| 304 |
|
| 305 g_return_if_fail(ext_id > 0 && admin_uid > 0); |
|
| 306 |
|
| 307 bytes += qq_get_vstr(&reason_utf8, QQ_CHARSET_DEFAULT, data + bytes); |
|
| 308 |
|
| 309 msg = g_strdup_printf |
|
| 310 (_("Failed to join Qun %d, operated by admin %d"), ext_id, admin_uid); |
|
| 311 reason = g_strdup_printf(_("Message: %s"), reason_utf8); |
|
| 312 |
|
| 313 purple_notify_warning(gc, _("QQ Qun Operation"), msg, reason); |
|
| 314 |
|
| 315 qq_room_find_or_new(gc, id, ext_id); |
|
| 316 rmd = qq_room_data_find(gc, id); |
|
| 317 if (rmd != NULL) { |
|
| 318 rmd->my_role = QQ_ROOM_ROLE_NO; |
|
| 319 } |
|
| 320 |
|
| 321 g_free(msg); |
|
| 322 g_free(reason); |
|
| 323 g_free(reason_utf8); |
|
| 324 } |
|
| 325 |
|
| 326 /* the request to join a group is approved */ |
|
| 327 void qq_process_room_msg_been_approved(guint8 *data, gint len, guint32 id, PurpleConnection *gc) |
|
| 328 { |
|
| 329 guint32 ext_id, admin_uid; |
|
| 330 guint8 type8; |
|
| 331 gchar *msg, *reason; |
|
| 332 qq_room_data *rmd; |
|
| 333 gint bytes; |
|
| 334 time_t now; |
|
| 335 |
|
| 336 g_return_if_fail(data != NULL && len > 0); |
|
| 337 |
|
| 338 /* FIXME: check length here */ |
|
| 339 bytes = 0; |
|
| 340 bytes += qq_get32(&ext_id, data + bytes); |
|
| 341 bytes += qq_get8(&type8, data + bytes); |
|
| 342 bytes += qq_get32(&admin_uid, data + bytes); |
|
| 343 |
|
| 344 g_return_if_fail(ext_id > 0 && admin_uid > 0); |
|
| 345 /* it is also a "无" here, so do not display */ |
|
| 346 bytes += qq_get_vstr(&reason, QQ_CHARSET_DEFAULT, data + bytes); |
|
| 347 |
|
| 348 qq_room_find_or_new(gc, id, ext_id); |
|
| 349 rmd = qq_room_data_find(gc, id); |
|
| 350 if (rmd != NULL) { |
|
| 351 rmd->my_role = QQ_ROOM_ROLE_YES; |
|
| 352 } |
|
| 353 |
|
| 354 msg = g_strdup_printf(_("<b>Joinning Qun %d is approved by Admin %d for %s</b>"), |
|
| 355 ext_id, admin_uid, reason); |
|
| 356 now = time(NULL); |
|
| 357 qq_room_got_chat_in(gc, id, 0, msg, now); |
|
| 358 |
|
| 359 g_free(msg); |
|
| 360 g_free(reason); |
|
| 361 } |
|
| 362 |
|
| 363 /* process the packet when removed from a group */ |
|
| 364 void qq_process_room_msg_been_removed(guint8 *data, gint len, guint32 id, PurpleConnection *gc) |
|
| 365 { |
|
| 366 guint32 ext_id, uid; |
|
| 367 guint8 type8; |
|
| 368 gchar *msg; |
|
| 369 qq_room_data *rmd; |
|
| 370 gint bytes = 0; |
|
| 371 time_t now = time(NULL); |
|
| 372 |
|
| 373 g_return_if_fail(data != NULL && len > 0); |
|
| 374 |
|
| 375 /* FIXME: check length here */ |
|
| 376 bytes = 0; |
|
| 377 bytes += qq_get32(&ext_id, data + bytes); |
|
| 378 bytes += qq_get8(&type8, data + bytes); |
|
| 379 bytes += qq_get32(&uid, data + bytes); |
|
| 380 |
|
| 381 g_return_if_fail(ext_id > 0 && uid > 0); |
|
| 382 |
|
| 383 qq_room_find_or_new(gc, id, ext_id); |
|
| 384 rmd = qq_room_data_find(gc, id); |
|
| 385 if (rmd != NULL) { |
|
| 386 rmd->my_role = QQ_ROOM_ROLE_NO; |
|
| 387 } |
|
| 388 |
|
| 389 msg = g_strdup_printf(_("<b>Removed buddy %d.</b>"), uid); |
|
| 390 qq_room_got_chat_in(gc, id, 0, msg, now); |
|
| 391 g_free(msg); |
|
| 392 } |
|
| 393 |
|
| 394 /* process the packet when added to a group */ |
|
| 395 void qq_process_room_msg_been_added(guint8 *data, gint len, guint32 id, PurpleConnection *gc) |
|
| 396 { |
|
| 397 guint32 ext_id, uid; |
|
| 398 guint8 type8; |
|
| 399 qq_room_data *rmd; |
|
| 400 gint bytes; |
|
| 401 gchar *msg; |
|
| 402 time_t now = time(NULL); |
|
| 403 |
|
| 404 g_return_if_fail(data != NULL && len > 0); |
|
| 405 |
|
| 406 /* FIXME: check length here */ |
|
| 407 bytes = 0; |
|
| 408 bytes += qq_get32(&ext_id, data + bytes); |
|
| 409 bytes += qq_get8(&type8, data + bytes); |
|
| 410 bytes += qq_get32(&uid, data + bytes); |
|
| 411 |
|
| 412 g_return_if_fail(ext_id > 0 && id > 0); |
|
| 413 |
|
| 414 qq_room_find_or_new(gc, id, ext_id); |
|
| 415 rmd = qq_room_data_find(gc, id); |
|
| 416 g_return_if_fail(rmd != NULL); |
|
| 417 |
|
| 418 rmd->my_role = QQ_ROOM_ROLE_YES; |
|
| 419 |
|
| 420 qq_update_room(gc, 0, rmd->id); |
|
| 421 |
|
| 422 msg = g_strdup_printf(_("<b>Added new buddy %d.</b>"), uid); |
|
| 423 qq_room_got_chat_in(gc, id, 0, msg, now); |
|
| 424 g_free(msg); |
|
| 425 } |
|
| 426 |
|
| 427 /* recv an IM from a group chat */ |
238 /* recv an IM from a group chat */ |
| 428 void qq_process_room_msg_normal(guint8 *data, gint data_len, guint32 id, PurpleConnection *gc, guint16 msg_type) |
239 void qq_process_room_im(guint8 *data, gint data_len, guint32 id, PurpleConnection *gc, guint16 msg_type) |
| 429 { |
240 { |
| 430 gchar *msg_with_purple_smiley, *msg_utf8_encoded; |
241 gchar *msg_with_purple_smiley, *msg_utf8_encoded; |
| 431 qq_data *qd; |
242 qq_data *qd; |
| 432 gint skip_len; |
243 gint skip_len; |
| 433 gint bytes ; |
244 gint bytes ; |
| 504 packet.font_attr = g_memdup(data + bytes, packet.font_attr_len); |
315 packet.font_attr = g_memdup(data + bytes, packet.font_attr_len); |
| 505 qq_show_packet("font_attr", packet.font_attr, packet.font_attr_len); |
316 qq_show_packet("font_attr", packet.font_attr, packet.font_attr_len); |
| 506 } else { |
317 } else { |
| 507 packet.font_attr = NULL; |
318 packet.font_attr = NULL; |
| 508 } |
319 } |
| 509 |
320 |
| 510 /* group im_group has no flag to indicate whether it has font_attr or not */ |
321 /* group im_group has no flag to indicate whether it has font_attr or not */ |
| 511 msg_with_purple_smiley = qq_smiley_to_purple(packet.msg); |
322 msg_with_purple_smiley = qq_smiley_to_purple(packet.msg); |
| 512 if (packet.font_attr_len > 0) { |
323 if (packet.font_attr_len > 0) { |
| 513 msg_utf8_encoded = qq_encode_to_purple(packet.font_attr, |
324 msg_utf8_encoded = qq_encode_to_purple(packet.font_attr, |
| 514 packet.font_attr_len, msg_with_purple_smiley, qd->client_version); |
325 packet.font_attr_len, msg_with_purple_smiley, qd->client_version); |