| 46 |
46 |
| 47 /* show group conversation window */ |
47 /* show group conversation window */ |
| 48 PurpleConversation *qq_room_conv_open(PurpleConnection *gc, qq_room_data *rmd) |
48 PurpleConversation *qq_room_conv_open(PurpleConnection *gc, qq_room_data *rmd) |
| 49 { |
49 { |
| 50 PurpleConversation *conv; |
50 PurpleConversation *conv; |
| 51 qq_data *qd; |
|
| 52 gchar *topic_utf8; |
51 gchar *topic_utf8; |
| 53 |
52 |
| 54 g_return_val_if_fail(rmd != NULL, NULL); |
53 g_return_val_if_fail(rmd != NULL, NULL); |
| 55 g_return_val_if_fail(rmd->title_utf8, NULL); |
54 g_return_val_if_fail(rmd->title_utf8, NULL); |
| 56 qd = (qq_data *) gc->proto_data; |
|
| 57 |
55 |
| 58 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, |
56 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, |
| 59 rmd->title_utf8, purple_connection_get_account(gc)); |
57 rmd->title_utf8, purple_connection_get_account(gc)); |
| 60 if (conv != NULL) { |
58 if (conv != NULL) { |
| 61 /* show only one conversation per room */ |
59 /* show only one conversation per room */ |
| 205 } |
203 } |
| 206 |
204 |
| 207 /* recv an IM from a group chat */ |
205 /* recv an IM from a group chat */ |
| 208 void qq_process_room_im(guint8 *data, gint data_len, guint32 id, PurpleConnection *gc, guint16 msg_type) |
206 void qq_process_room_im(guint8 *data, gint data_len, guint32 id, PurpleConnection *gc, guint16 msg_type) |
| 209 { |
207 { |
| 210 qq_data *qd; |
|
| 211 gchar *msg_smiley, *msg_fmt, *msg_utf8; |
208 gchar *msg_smiley, *msg_fmt, *msg_utf8; |
| 212 gint bytes, tail_len; |
209 gint bytes, tail_len; |
| 213 struct { |
210 struct { |
| 214 guint32 ext_id; |
211 guint32 ext_id; |
| 215 guint8 type8; |
212 guint8 type8; |
| 227 guint16 msg_id; |
224 guint16 msg_id; |
| 228 qq_im_format *fmt = NULL; |
225 qq_im_format *fmt = NULL; |
| 229 |
226 |
| 230 /* at least include im_text.msg_len */ |
227 /* at least include im_text.msg_len */ |
| 231 g_return_if_fail(data != NULL && data_len > 23); |
228 g_return_if_fail(data != NULL && data_len > 23); |
| 232 qd = (qq_data *) gc->proto_data; |
|
| 233 |
229 |
| 234 /* qq_show_packet("ROOM_IM", data, data_len); */ |
230 /* qq_show_packet("ROOM_IM", data, data_len); */ |
| 235 memset(&im_text, 0, sizeof(im_text)); |
231 memset(&im_text, 0, sizeof(im_text)); |
| 236 bytes = 0; |
232 bytes = 0; |
| 237 bytes += qq_get32(&(im_text.ext_id), data + bytes); |
233 bytes += qq_get32(&(im_text.ext_id), data + bytes); |
| 374 gchar *msg_stripped, *tmp; |
370 gchar *msg_stripped, *tmp; |
| 375 GSList *segments, *it; |
371 GSList *segments, *it; |
| 376 gint msg_len; |
372 gint msg_len; |
| 377 const gchar *start_invalid; |
373 const gchar *start_invalid; |
| 378 gboolean is_smiley_none; |
374 gboolean is_smiley_none; |
| 379 guint8 frag_count, frag_index; |
|
| 380 |
375 |
| 381 g_return_val_if_fail(NULL != gc && NULL != gc->proto_data, -1); |
376 g_return_val_if_fail(NULL != gc && NULL != gc->proto_data, -1); |
| 382 g_return_val_if_fail(id != 0 && what != NULL, -1); |
377 g_return_val_if_fail(id != 0 && what != NULL, -1); |
| 383 |
378 |
| 384 qd = (qq_data *) gc->proto_data; |
379 qd = (qq_data *) gc->proto_data; |
| 385 purple_debug_info("QQ", "Send chat IM to %u, len %" G_GSIZE_FORMAT ":\n%s\n", id, strlen(what), what); |
380 purple_debug_info("QQ", "Send chat IM to %u, len %" G_GSIZE_FORMAT ":\n%s\n", id, strlen(what), what); |
| 386 |
381 |
| 387 /* qq_show_packet("chat IM UTF8", (guint8 *)what, strlen(what)); */ |
382 /* qq_show_packet("chat IM UTF8", (guint8 *)what, strlen(what)); */ |
| 388 |
|
| 389 fmt = qq_im_fmt_new_by_purple(what); |
|
| 390 is_smiley_none = qq_im_smiley_none(what); |
|
| 391 |
383 |
| 392 msg_stripped = purple_markup_strip_html(what); |
384 msg_stripped = purple_markup_strip_html(what); |
| 393 g_return_val_if_fail(msg_stripped != NULL, -1); |
385 g_return_val_if_fail(msg_stripped != NULL, -1); |
| 394 /* qq_show_packet("IM Stripped", (guint8 *)what, strlen(what)); */ |
386 /* qq_show_packet("IM Stripped", (guint8 *)what, strlen(what)); */ |
| 395 |
387 |
| 415 return -1; |
407 return -1; |
| 416 } |
408 } |
| 417 |
409 |
| 418 qd->send_im_id++; |
410 qd->send_im_id++; |
| 419 fmt = qq_im_fmt_new_by_purple(what); |
411 fmt = qq_im_fmt_new_by_purple(what); |
| 420 frag_count = g_slist_length(segments); |
412 for (it = segments; it; it = g_slist_delete_link(it, it)) { |
| 421 frag_index = 0; |
413 request_room_send_im(gc, id, fmt, (gchar *)it->data); |
| 422 /* |
414 g_free(it->data); |
| 423 if (frag_count <= 1) { |
415 } |
| 424 */ |
|
| 425 for (it = segments; it; it = it->next) { |
|
| 426 request_room_send_im(gc, id, fmt, (gchar *)it->data); |
|
| 427 g_free(it->data); |
|
| 428 } |
|
| 429 /* |
|
| 430 } else { |
|
| 431 for (it = segments; it; it = it->next) { |
|
| 432 request_room_send_im_ex(gc, id, fmt, (gchar *)it->data, |
|
| 433 qd->send_im_id, frag_count, frag_index); |
|
| 434 g_free(it->data); |
|
| 435 frag_index++; |
|
| 436 } |
|
| 437 } |
|
| 438 */ |
|
| 439 qq_im_fmt_free(fmt); |
416 qq_im_fmt_free(fmt); |
| 440 g_slist_free(segments); |
|
| 441 return 1; |
417 return 1; |
| 442 } |
418 } |