/* Process the reply to group_auth subcmd */ void qq_process_group_cmd_join_group_auth(guint8 *data, gint len, PurpleConnection *gc) { gint bytes; guint32 id; qq_room_data *rmd; gchar *msg; g_return_if_fail(data != NULL && len > 0); if (len < 4) { purple_debug_error("QQ", "Invalid join room reply, expect %d bytes, read %d bytes\n", 4, len); return; } bytes = 0; bytes += qq_get32(&id, data + bytes); g_return_if_fail(id > 0); rmd = qq_room_data_find(gc, id); if (rmd != NULL) { msg = g_strdup_printf(_("Successfully joined Qun %s (%u)"), rmd->title_utf8, rmd->ext_id); qq_got_message(gc, msg); g_free(msg); } else { qq_got_message(gc, _("Successfully joined Qun")); } }
static void do_server_news(PurpleConnection *gc, guint8 *data, gint data_len) { qq_data *qd = (qq_data *) gc->proto_data; gint bytes; gchar *title, *brief, *url; gchar *content; g_return_if_fail(data != NULL && data_len != 0); /* qq_show_packet("Rcv news", data, data_len); */ bytes = 4; /* skip unknown 4 bytes */ bytes += qq_get_vstr(&title, QQ_CHARSET_DEFAULT, sizeof(guint8), data + bytes); bytes += qq_get_vstr(&brief, QQ_CHARSET_DEFAULT, sizeof(guint8), data + bytes); bytes += qq_get_vstr(&url, QQ_CHARSET_DEFAULT, sizeof(guint8), data + bytes); content = g_strdup_printf(_("Server News:\n%s\n%s\n%s"), title, brief, url); if (qd->is_show_news) { qq_got_message(gc, content); } else { purple_debug_info("QQ", "QQ Server news:\n%s\n", content); } g_free(title); g_free(brief); g_free(url); g_free(content); }
static void do_server_notice(PurpleConnection *gc, gchar *from, gchar *to, guint8 *data, gint data_len) { qq_data *qd = (qq_data *) gc->proto_data; gchar *msg, *msg_utf8; gchar *title, *content; g_return_if_fail(from != NULL && to != NULL && data_len > 0); msg = g_strndup((gchar *)data, data_len); msg_utf8 = qq_to_utf8(msg, QQ_CHARSET_DEFAULT); g_free(msg); if (msg_utf8 == NULL) { purple_debug_error("QQ", "Recv NULL sys msg from %s to %s, discard\n", from, to); return; } title = g_strdup_printf(_("From %s:"), from); content = g_strdup_printf(_("Server notice From %s: \n%s"), from, msg_utf8); if (qd->is_show_notice) { qq_got_message(gc, content); } else { purple_debug_info("QQ", "QQ Server notice from %s:\n%s\n", from, msg_utf8); } g_free(msg_utf8); g_free(title); g_free(content); }
static void do_got_sms(PurpleConnection *gc, guint8 *data, gint data_len) { gint bytes; gchar *mobile = NULL; gchar *msg = NULL; gchar *msg_utf8 = NULL; gchar *msg_formated; g_return_if_fail(data != NULL && data_len > 26); qq_show_packet("Rcv sms", data, data_len); bytes = 0; bytes += 1; /* skip 0x00 */ mobile = g_strndup((gchar *)data + bytes, 20); bytes += 20; bytes += 5; /* skip 0x(49 11 98 d5 03)*/ if (bytes < data_len) { msg = g_strndup((gchar *)data + bytes, data_len - bytes); msg_utf8 = qq_to_utf8(msg, QQ_CHARSET_DEFAULT); g_free(msg); } else { msg_utf8 = g_strdup(""); } msg_formated = g_strdup_printf(_("%s:%s"), mobile, msg_utf8); qq_got_message(gc, msg_formated); g_free(msg_formated); g_free(msg_utf8); g_free(mobile); }
/* process the reply of modify_info packet */ void qq_process_change_info(PurpleConnection *gc, guint8 *data, gint data_len) { qq_data *qd; g_return_if_fail(data != NULL && data_len != 0); qd = (qq_data *) gc->proto_data; data[data_len] = '\0'; if (qd->uid != atoi((gchar *) data)) { /* return should be my uid */ purple_debug_info("QQ", "Failed Updating info\n"); qq_got_message(gc, _("Could not change buddy information.")); } }
static void do_msg_sys(PurpleConnection *gc, guint8 *data, gint data_len) { guint8 reply; gchar *msg, *msg_esc; qq_data * qd; g_return_if_fail(gc != NULL && gc->proto_data != NULL && data != NULL && data_len != 0); qd = (qq_data *)gc->proto_data; qq_get8(&reply, data+4); qq_get_vstr(&msg, NULL, sizeof(guint8), data+5); if (reply == 0x01) { purple_debug_error("QQ", "We are kicked out by QQ server\n"); msg_esc = purple_markup_escape_text(msg, -1); purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, msg_esc); g_free(msg); g_free(msg_esc); return; } qq_got_message(gc, msg); }