/* this buddy needs authentication, text conversion is done at lowest level */ static void request_add_buddy_auth(PurpleConnection *gc, guint32 uid, const gchar response, const gchar *text) { guint8 raw_data[MAX_PACKET_SIZE - 16]; gint bytes; gchar *msg, uid_str[11]; guint8 bar; g_return_if_fail(uid != 0); g_snprintf(uid_str, sizeof(uid_str), "%u", uid); bar = 0x1f; bytes = 0; bytes += qq_putdata(raw_data + bytes, (guint8 *) uid_str, strlen(uid_str)); bytes += qq_put8(raw_data + bytes, bar); bytes += qq_put8(raw_data + bytes, response); if (text != NULL) { msg = utf8_to_qq(text, QQ_CHARSET_DEFAULT); bytes += qq_put8(raw_data + bytes, bar); bytes += qq_putdata(raw_data + bytes, (guint8 *) msg, strlen(msg)); g_free(msg); } qq_send_cmd(gc, QQ_CMD_ADD_BUDDY_AUTH, raw_data, bytes); }
static void im_convert_and_merge(GString *dest, GString *append) { gchar *converted; g_return_if_fail(dest != NULL && append != NULL); if (append->str == NULL || append->len <= 0) { return; } /* purple_debug_info("QQ", "Append:\n%s\n", append->str); */ converted = utf8_to_qq(append->str, QQ_CHARSET_DEFAULT); g_string_append(dest, converted); g_string_set_size(append, 0); g_free(converted); }
/* prepare segments to be sent, string all convert to qq charset */ static void memo_modify_ok_cb(modify_memo_request *memo_request, PurpleRequestFields *fields) { PurpleConnection *gc; guint32 bd_uid; gchar **segments; const gchar *utf8_str; gchar *value = NULL; gint index; g_return_if_fail(NULL != memo_request); gc = (PurpleConnection *)memo_request->gc; segments = (gchar **)memo_request->segments; g_return_if_fail(NULL != gc && NULL != segments); bd_uid = (guint32)memo_request->bd_uid; for (index = 0; index < QQ_MEMO_SIZE; index++) { utf8_str = purple_request_fields_get_string(fields, memo_id[index]); /* update alias */ if (QQ_MEMO_ALIAS == index) { update_buddy_memo(gc, bd_uid, segments[QQ_MEMO_ALIAS]); } if (NULL == utf8_str) { value = g_strdup(""); } else { value = utf8_to_qq(utf8_str, QQ_CHARSET_DEFAULT); /* Warnning: value will be string "(NULL)" instead of NULL */ if (!qq_strcmp("(NULL)", value)) { value = g_strdup(""); } } g_free(segments[index]); segments[index] = value; } memo_debug(segments); /* send segments */ request_change_memo(gc, bd_uid, segments); /* free segments */ memo_free(segments); g_free(memo_request); }
/* parse fields and send info packet */ static void info_modify_ok_cb(modify_info_request *info_request, PurpleRequestFields *fields) { PurpleConnection *gc; qq_data *qd; gchar **segments; int index; const char *utf8_str; gchar *value; int choice_num; gc = info_request->gc; g_return_if_fail(gc != NULL && info_request->gc); qd = (qq_data *) gc->proto_data; segments = info_request->segments; g_return_if_fail(segments != NULL); for (index = 1; segments[index] != NULL && index < QQ_INFO_LAST; index++) { if (field_infos[index].iclass == QQ_FIELD_UNUSED) { continue; } if (!purple_request_fields_exists(fields, field_infos[index].id)) { continue; } switch (field_infos[index].type) { case QQ_FIELD_BOOL: value = purple_request_fields_get_bool(fields, field_infos[index].id) ? g_strdup("1") : g_strdup("0"); g_free(segments[index]); segments[index] = value; break; case QQ_FIELD_CHOICE: choice_num = purple_request_fields_get_choice(fields, field_infos[index].id); if (choice_num < 0 || choice_num >= field_infos[index].choice_size) choice_num = 0; if (index == QQ_INFO_GENDER) { /* QQ Server only recept gender in Chinese */ value = g_strdup(genders_zh[choice_num]); } else { value = g_strdup_printf("%d", choice_num); } g_free(segments[index]); segments[index] = value; break; case QQ_FIELD_LABEL: case QQ_FIELD_STRING: case QQ_FIELD_MULTI: default: utf8_str = purple_request_fields_get_string(fields, field_infos[index].id); if (utf8_str == NULL) { value = g_strdup("-"); } else { value = utf8_to_qq(utf8_str, QQ_CHARSET_DEFAULT); if (value == NULL) value = g_strdup("-"); } g_free(segments[index]); segments[index] = value; break; } } request_change_info(gc, segments); g_strfreev(segments); g_free(info_request); }