pidgin/pidgin

3da74e727e78
Remove purple_base64_encode/decode() wrappers

The utility functions purple_base64_encode() & purple_base64_decode()
are but thin wrappers around g_base64_encode() & g_base64_decode().
This patch removes the former and replaces all current usage to the
latter.
--- a/ChangeLog.API Sun Jun 04 18:13:19 2017 +0000
+++ b/ChangeLog.API Thu Jun 01 19:59:58 2017 -0500
@@ -417,6 +417,7 @@
* purple_account_add_buddies_with_invite
* purple_account_add_buddy_with_invite
* purple_account_set_current_error
+ * purple_base64_*. Use g_base64_* instead
* purple_blist_load
* purple_blist_new
* purple_set_blist
--- a/libpurple/http.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/http.c Thu Jun 01 19:59:58 2017 -0500
@@ -859,7 +859,7 @@
tmp = g_strdup_printf("%s:%s", proxy_username, proxy_password);
len = strlen(tmp);
- proxy_auth = purple_base64_encode((const guchar *)tmp, len);
+ proxy_auth = g_base64_encode((const guchar *)tmp, len);
memset(tmp, 0, len);
g_free(tmp);
--- a/libpurple/mime.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/mime.c Thu Jun 01 19:59:58 2017 -0500
@@ -345,7 +345,7 @@
*data = purple_base16_decode(part->data->str, len);
} else if(! g_ascii_strcasecmp(enc, "base64")) {
- *data = purple_base64_decode(part->data->str, len);
+ *data = g_base64_decode(part->data->str, len);
} else if(! g_ascii_strcasecmp(enc, "quoted-printable")) {
*data = purple_quotedp_decode(part->data->str, len);
--- a/libpurple/ntlm.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/ntlm.c Thu Jun 01 19:59:58 2017 -0500
@@ -139,7 +139,7 @@
memcpy(msg + host_off, hostname, hostnamelen);
memcpy(msg + dom_off, domain, domainlen);
- tmp = purple_base64_encode(msg, sizeof(struct type1_message) + hostnamelen + domainlen);
+ tmp = g_base64_encode(msg, sizeof(struct type1_message) + hostnamelen + domainlen);
g_free(msg);
return tmp;
@@ -153,7 +153,7 @@
struct type2_message tmsg;
static guint8 nonce[8];
- buff = purple_base64_decode(type2, &retlen);
+ buff = g_base64_decode(type2, &retlen);
if (buff != NULL && retlen >= (sizeof(struct type2_message) - 1)) {
memcpy(&tmsg, buff, MIN(retlen, sizeof(tmsg)));
@@ -397,7 +397,7 @@
/*tmsg->flags2 = 0x0a280105;
tmsg->flags3 = 0x0f000000;*/
- tmp = purple_base64_encode((guchar *)tmsg, msglen);
+ tmp = g_base64_encode((guchar *)tmsg, msglen);
g_free(tmsg);
return tmp;
--- a/libpurple/plugins/keyrings/internalkeyring.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/plugins/keyrings/internalkeyring.c Thu Jun 01 19:59:58 2017 -0500
@@ -138,7 +138,7 @@
guchar *data;
gsize len;
- data = purple_base64_decode(base64, &len);
+ data = g_base64_decode(base64, &len);
return intkeyring_buff_new(data, len);
}
@@ -278,7 +278,7 @@
if (encrypted_size < 0)
return NULL;
- return purple_base64_encode(encrypted_raw, encrypted_size);
+ return g_base64_encode(encrypted_raw, encrypted_size);
}
@@ -300,7 +300,7 @@
cipher = purple_aes_cipher_new();
g_return_val_if_fail(cipher != NULL, NULL);
- encrypted_raw = purple_base64_decode(str, &encrypted_size);
+ encrypted_raw = g_base64_decode(str, &encrypted_size);
g_return_val_if_fail(encrypted_raw != NULL, NULL);
iv_len = purple_cipher_get_block_size(cipher);
@@ -374,7 +374,7 @@
* but it's not a problem.
*/
verifier = intkeyring_encrypt(key, INTKEYRING_VERIFY_STR);
- salt_b64 = purple_base64_encode(salt->data, salt->len);
+ salt_b64 = g_base64_encode(salt->data, salt->len);
}
if (!verifier || !salt_b64) {
--- a/libpurple/protocols/gg/avatar.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/protocols/gg/avatar.c Thu Jun 01 19:59:58 2017 -0500
@@ -353,7 +353,7 @@
}
own_data->img = NULL;
- img_data = purple_base64_encode(purple_image_get_data(img),
+ img_data = g_base64_encode(purple_image_get_data(img),
purple_image_get_data_size(img));
img_data_e = g_uri_escape_string(img_data, NULL, FALSE);
g_free(img_data);
--- a/libpurple/protocols/gg/oauth/oauth.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/protocols/gg/oauth/oauth.c Thu Jun 01 19:59:58 2017 -0500
@@ -56,7 +56,7 @@
g_hmac_get_digest(hmac, digest, &digest_len);
g_hmac_unref(hmac);
- return purple_base64_encode(digest, sizeof(digest));
+ return g_base64_encode(digest, sizeof(digest));
}
static char *
--- a/libpurple/protocols/irc/msgs.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/protocols/irc/msgs.c Thu Jun 01 19:59:58 2017 -0500
@@ -1660,7 +1660,7 @@
return;
if (arg[0] != '+')
- serverin = (char *)purple_base64_decode(arg, &serverinlen);
+ serverin = (char *)g_base64_decode(arg, &serverinlen);
ret = sasl_client_step(irc->sasl_conn, serverin, serverinlen,
NULL, &c_out, &clen);
@@ -1678,7 +1678,7 @@
}
if (clen > 0)
- authinfo = purple_base64_encode((const guchar*)c_out, clen);
+ authinfo = g_base64_encode((const guchar*)c_out, clen);
else
authinfo = g_strdup("+");
--- a/libpurple/protocols/jabber/auth_cyrus.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/protocols/jabber/auth_cyrus.c Thu Jun 01 19:59:58 2017 -0500
@@ -336,7 +336,7 @@
if (coutlen == 0) {
purple_xmlnode_insert_data(auth, "=", -1);
} else {
- enc_out = purple_base64_encode((unsigned char*)clientout, coutlen);
+ enc_out = g_base64_encode((unsigned char*)clientout, coutlen);
purple_xmlnode_insert_data(auth, enc_out, -1);
g_free(enc_out);
}
@@ -458,7 +458,7 @@
unsigned int clen;
gsize declen;
- dec_in = purple_base64_decode(enc_in, &declen);
+ dec_in = g_base64_decode(enc_in, &declen);
js->sasl_state = sasl_client_step(js->sasl, (char*)dec_in, declen,
NULL, &c_out, &clen);
@@ -486,10 +486,10 @@
if (!purple_strequal(js->current_mech, "DIGEST-MD5") ||
strstr(c_out, ",charset="))
/* If we're not using DIGEST-MD5 or Cyrus SASL is fixed */
- enc_out = purple_base64_encode((unsigned char*)c_out, clen);
+ enc_out = g_base64_encode((unsigned char*)c_out, clen);
else {
char *tmp = g_strdup_printf("%s,charset=utf-8", c_out);
- enc_out = purple_base64_encode((unsigned char*)tmp, clen + 14);
+ enc_out = g_base64_encode((unsigned char*)tmp, clen + 14);
g_free(tmp);
}
@@ -519,7 +519,7 @@
gsize declen = 0;
if(enc_in != NULL)
- dec_in = purple_base64_decode(enc_in, &declen);
+ dec_in = g_base64_decode(enc_in, &declen);
js->sasl_state = sasl_client_step(js->sasl, (char*)dec_in, declen, NULL, &c_out, &clen);
--- a/libpurple/protocols/jabber/auth_digest_md5.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/protocols/jabber/auth_digest_md5.c Thu Jun 01 19:59:58 2017 -0500
@@ -155,6 +155,7 @@
char *enc_in = purple_xmlnode_get_data(packet);
char *dec_in;
char *enc_out;
+ gsize size = 0;
GHashTable *parts;
JabberSaslState state = JABBER_SASL_STATE_CONTINUE;
@@ -163,10 +164,10 @@
return JABBER_SASL_STATE_FAIL;
}
- dec_in = (char *)purple_base64_decode(enc_in, NULL);
+ dec_in = (char *)g_base64_decode(enc_in, &size);
purple_debug_misc("jabber", "decoded challenge (%"
G_GSIZE_FORMAT "): %s\n",
- strlen(dec_in),
+ size,
dec_in);
parts = jabber_auth_digest_md5_parse(dec_in);
@@ -238,7 +239,7 @@
g_free(auth_resp);
g_free(cnonce);
- enc_out = purple_base64_encode((guchar *)response->str, response->len);
+ enc_out = g_base64_encode((guchar *)response->str, response->len);
purple_debug_misc("jabber", "decoded response (%"
G_GSIZE_FORMAT "): %s\n",
--- a/libpurple/protocols/jabber/auth_plain.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/protocols/jabber/auth_plain.c Thu Jun 01 19:59:58 2017 -0500
@@ -50,7 +50,7 @@
response = g_string_append(response,
purple_connection_get_password(js->gc));
- enc_out = purple_base64_encode((guchar *)response->str, response->len);
+ enc_out = g_base64_encode((guchar *)response->str, response->len);
purple_xmlnode_set_attrib(auth, "mechanism", "PLAIN");
purple_xmlnode_insert_data(auth, enc_out, -1);
--- a/libpurple/protocols/jabber/auth_scram.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/protocols/jabber/auth_scram.c Thu Jun 01 19:59:58 2017 -0500
@@ -246,7 +246,7 @@
if (token[0] != 's' || token[1] != '=')
goto err;
- decoded = (gchar *)purple_base64_decode(token + 2, &len);
+ decoded = (gchar *)g_base64_decode(token + 2, &len);
if (!decoded || *decoded == '\0') {
g_free(decoded);
goto err;
@@ -337,7 +337,7 @@
return FALSE;
}
- proof = purple_base64_encode((guchar *)data->client_proof->str, data->client_proof->len);
+ proof = g_base64_encode((guchar *)data->client_proof->str, data->client_proof->len);
*out = g_strdup_printf("c=%s,r=%s,p=%s", "biws", nonce, proof);
g_free(nonce);
g_free(proof);
@@ -349,7 +349,7 @@
if (!ret)
return FALSE;
- server_sig = (gchar *)purple_base64_decode(enc_server_sig, &len);
+ server_sig = (gchar *)g_base64_decode(enc_server_sig, &len);
g_free(enc_server_sig);
if (server_sig == NULL || len != data->server_signature->len) {
@@ -421,7 +421,7 @@
data->channel_binding = TRUE;
#endif
cnonce = ((guint64)g_random_int() << 32) | g_random_int();
- data->cnonce = purple_base64_encode((guchar *)&cnonce, sizeof(cnonce));
+ data->cnonce = g_base64_encode((guchar *)&cnonce, sizeof(cnonce));
data->auth_message = g_string_new(NULL);
g_string_printf(data->auth_message, "n=%s,r=%s",
@@ -436,7 +436,7 @@
/* TODO: Channel binding */
dec_out = g_strdup_printf("%c,,%s", 'n', data->auth_message->str);
- enc_out = purple_base64_encode((guchar *)dec_out, strlen(dec_out));
+ enc_out = g_base64_encode((guchar *)dec_out, strlen(dec_out));
purple_debug_misc("jabber", "initial SCRAM message '%s'\n", dec_out);
purple_xmlnode_insert_data(reply, enc_out, -1);
@@ -467,7 +467,7 @@
goto out;
}
- dec_in = (gchar *)purple_base64_decode(enc_in, &len);
+ dec_in = (gchar *)g_base64_decode(enc_in, &len);
if (!dec_in || len != strlen(dec_in)) {
/* Danger afoot; SCRAM shouldn't contain NUL bytes */
reply = purple_xmlnode_new("abort");
@@ -494,7 +494,7 @@
purple_debug_misc("jabber", "decoded response: %s\n", dec_out ? dec_out : "(null)");
if (dec_out) {
- enc_out = purple_base64_encode((guchar *)dec_out, strlen(dec_out));
+ enc_out = g_base64_encode((guchar *)dec_out, strlen(dec_out));
purple_xmlnode_insert_data(reply, enc_out, -1);
}
@@ -540,7 +540,7 @@
return JABBER_SASL_STATE_FAIL;
}
- dec_in = (gchar *)purple_base64_decode(enc_in, &len);
+ dec_in = (gchar *)g_base64_decode(enc_in, &len);
g_free(enc_in);
if (!dec_in || len != strlen(dec_in)) {
/* Danger afoot; SCRAM shouldn't contain NUL bytes */
--- a/libpurple/protocols/jabber/buddy.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/protocols/jabber/buddy.c Thu Jun 01 19:59:58 2017 -0500
@@ -528,7 +528,7 @@
type = purple_xmlnode_new_child(photo, "TYPE");
purple_xmlnode_insert_data(type, "image/png", -1);
binval = purple_xmlnode_new_child(photo, "BINVAL");
- enc = purple_base64_encode(avatar_data, avatar_len);
+ enc = g_base64_encode(avatar_data, avatar_len);
js->avatar_hash = g_compute_checksum_for_data(G_CHECKSUM_SHA1,
avatar_data, avatar_len);
@@ -957,7 +957,7 @@
gsize size;
char *bintext = purple_xmlnode_get_data(binval);
if (bintext) {
- guchar *data = purple_base64_decode(bintext, &size);
+ guchar *data = g_base64_decode(bintext, &size);
g_free(bintext);
if (data) {
@@ -1201,7 +1201,7 @@
guchar *data;
gboolean photo = (strcmp(child->name, "PHOTO") == 0);
- data = purple_base64_decode(bintext, &size);
+ data = g_base64_decode(bintext, &size);
if (data) {
PurpleImage *img;
guint img_id;
--- a/libpurple/protocols/jabber/caps.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/protocols/jabber/caps.c Thu Jun 01 19:59:58 2017 -0500
@@ -924,7 +924,7 @@
/* generate hash */
g_checksum_get_digest(hash, checksum, &checksum_size);
- ret = purple_base64_encode(checksum, checksum_size);
+ ret = g_base64_encode(checksum, checksum_size);
g_free(checksum);
return ret;
--- a/libpurple/protocols/jabber/data.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/protocols/jabber/data.c Thu Jun 01 19:59:58 2017 -0500
@@ -109,7 +109,7 @@
}
data = g_new0(JabberData, 1);
- data->data = purple_base64_decode(raw_data, &data->size);
+ data->data = g_base64_decode(raw_data, &data->size);
g_free(raw_data);
if (data->data == NULL) {
@@ -174,7 +174,7 @@
g_return_val_if_fail(data != NULL, NULL);
tag = purple_xmlnode_new("data");
- base64data = purple_base64_encode(data->data, data->size);
+ base64data = g_base64_encode(data->data, data->size);
purple_xmlnode_set_namespace(tag, NS_BOB);
purple_xmlnode_set_attrib(tag, "cid", data->cid);
--- a/libpurple/protocols/jabber/ibb.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/protocols/jabber/ibb.c Thu Jun 01 19:59:58 2017 -0500
@@ -335,7 +335,7 @@
JabberIq *set = jabber_iq_new(jabber_ibb_session_get_js(sess),
JABBER_IQ_SET);
PurpleXmlNode *data_element = purple_xmlnode_new("data");
- char *base64 = purple_base64_encode(data, size);
+ char *base64 = g_base64_encode(data, size);
char seq[10];
g_snprintf(seq, sizeof(seq), "%u", jabber_ibb_session_get_send_seq(sess));
@@ -415,7 +415,7 @@
if (sess->data_received_cb) {
gchar *base64 = purple_xmlnode_get_data(child);
gsize size;
- gpointer rawdata = purple_base64_decode(base64, &size);
+ gpointer rawdata = g_base64_decode(base64, &size);
g_free(base64);
--- a/libpurple/protocols/jabber/presence.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/protocols/jabber/presence.c Thu Jun 01 19:59:58 2017 -0500
@@ -458,7 +458,7 @@
if ((binval = purple_xmlnode_get_child(photo, "BINVAL")) &&
(text = purple_xmlnode_get_data(binval))) {
- data = purple_base64_decode(text, &size);
+ data = g_base64_decode(text, &size);
g_free(text);
if (data)
--- a/libpurple/protocols/jabber/useravatar.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/protocols/jabber/useravatar.c Thu Jun 01 19:59:58 2017 -0500
@@ -158,7 +158,7 @@
G_CHECKSUM_SHA1,
purple_image_get_data(img),
purple_image_get_data_size(img));
- char *base64avatar = purple_base64_encode(
+ char *base64avatar = g_base64_encode(
purple_image_get_data(img),
purple_image_get_data_size(img));
@@ -315,7 +315,7 @@
if(!b64data)
return;
- img = purple_base64_decode(b64data, &size);
+ img = g_base64_decode(b64data, &size);
if(!img) {
g_free(b64data);
return;
--- a/libpurple/protocols/oscar/clientlogin.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/protocols/oscar/clientlogin.c Thu Jun 01 19:59:58 2017 -0500
@@ -128,7 +128,7 @@
g_hmac_get_digest(hmac, digest, &digest_len);
g_hmac_unref(hmac);
- return purple_base64_encode(digest, sizeof(digest));
+ return g_base64_encode(digest, sizeof(digest));
}
/**
@@ -339,7 +339,7 @@
if (!parse_start_oscar_session_response(gc, got_data, got_len, &host, &port, &cookie, &tls_certname))
return;
- cookiedata = purple_base64_decode(cookie, &cookiedata_len);
+ cookiedata = g_base64_decode(cookie, &cookiedata_len);
oscar_connect_to_bos(gc, od, host, port, cookiedata, cookiedata_len, tls_certname);
g_free(cookiedata);
--- a/libpurple/protocols/sametime/sametime.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/protocols/sametime/sametime.c Thu Jun 01 19:59:58 2017 -0500
@@ -3879,7 +3879,7 @@
/* obtain and base64 encode the image data, and put it in the
mime part */
size = purple_image_get_data_size(img);
- data = purple_base64_encode(purple_image_get_data(img), size);
+ data = g_base64_encode(purple_image_get_data(img), size);
purple_mime_part_set_data(part, data);
g_free(data);
--- a/libpurple/tests/test_util.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/tests/test_util.c Thu Jun 01 19:59:58 2017 -0500
@@ -43,24 +43,6 @@
}
/******************************************************************************
- * base 64 tests
- *****************************************************************************/
-static void
-test_util_base_64_encode(void) {
- gchar *in = purple_base64_encode((const unsigned char *)"forty-two", 10);
- g_assert_cmpstr("Zm9ydHktdHdvAA==", ==, in);
-}
-
-static void
-test_util_base_64_decode(void) {
- gsize sz = 0;
- guchar *out = purple_base64_decode("b3d0LXl0cm9mAA==", &sz);
-
- g_assert_cmpint(sz, ==, 10);
- g_assert_cmpstr("owt-ytrof", ==, (gchar *)out);
-}
-
-/******************************************************************************
* filename escape tests
*****************************************************************************/
static void
@@ -512,11 +494,6 @@
g_test_add_func("/util/base/16/decode",
test_util_base_16_decode);
- g_test_add_func("/util/base/64/encode",
- test_util_base_64_encode);
- g_test_add_func("/util/base/64/decode",
- test_util_base_64_decode);
-
g_test_add_func("/util/filename/escape",
test_util_filename_escape);
g_test_add_func("/util/filename/unescape",
--- a/libpurple/util.c Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/util.c Thu Jun 01 19:59:58 2017 -0500
@@ -254,34 +254,12 @@
return ascii;
}
-
/**************************************************************************
- * Base64 Functions
+ * Quoted Printable Functions (see RFC 2045).
**************************************************************************/
static const char xdigits[] =
"0123456789abcdef";
-gchar *
-purple_base64_encode(const guchar *data, gsize len)
-{
- return g_base64_encode(data, len);
-}
-
-guchar *
-purple_base64_decode(const char *str, gsize *ret_len)
-{
- /*
- * We want to allow ret_len to be NULL for backward compatibility,
- * but g_base64_decode() requires a valid length variable. So if
- * ret_len is NULL then pass in a dummy variable.
- */
- gsize unused;
- return g_base64_decode(str, ret_len != NULL ? ret_len : &unused);
-}
-
-/**************************************************************************
- * Quoted Printable Functions (see RFC 2045).
- **************************************************************************/
guchar *
purple_quotedp_decode(const char *str, gsize *ret_len)
{
@@ -441,7 +419,7 @@
if (g_ascii_strcasecmp(encoding, "Q") == 0)
decoded = purple_quotedp_decode(encoded_text, &dec_len);
else if (g_ascii_strcasecmp(encoding, "B") == 0)
- decoded = purple_base64_decode(encoded_text, &dec_len);
+ decoded = g_base64_decode(encoded_text, &dec_len);
else
decoded = NULL;
if (decoded) {
--- a/libpurple/util.h Sun Jun 04 18:13:19 2017 +0000
+++ b/libpurple/util.h Thu Jun 01 19:59:58 2017 -0500
@@ -287,43 +287,6 @@
*/
gchar *purple_base16_encode_chunked(const guchar *data, gsize len);
-
-/**************************************************************************/
-/* Base64 Functions */
-/**************************************************************************/
-
-/**
- * purple_base64_encode:
- * @data: The data to convert.
- * @len: The length of the data.
- *
- * Converts a chunk of binary data to its base-64 equivalent.
- *
- * See purple_base64_decode()
- *
- * Returns: The base-64 string in the ASCII encoding. Must be
- * g_free'd when no longer needed.
- */
-gchar *purple_base64_encode(const guchar *data, gsize len);
-
-/**
- * purple_base64_decode:
- * @str: The base-64 string to convert to raw data.
- * @ret_len: The length of the returned data. You can
- * pass in NULL if you're sure that you know
- * the length of the decoded data, or if you
- * know you'll be able to use strlen to
- * determine the length, etc.
- *
- * Converts an ASCII string of base-64 encoded data to
- * the binary equivalent.
- *
- * See purple_base64_encode()
- *
- * Returns: The raw data. Must be g_free'd when no longer needed.
- */
-guchar *purple_base64_decode(const char *str, gsize *ret_len);
-
/**************************************************************************/
/* Quoted Printable Functions */
/**************************************************************************/
--- a/pidgin/gtkwebview.c Sun Jun 04 18:13:19 2017 +0000
+++ b/pidgin/gtkwebview.c Thu Jun 01 19:59:58 2017 -0500
@@ -204,8 +204,7 @@
gchar *b64, *src;
const gchar *type;
- b64 = purple_base64_encode(
- purple_image_get_data(img),
+ b64 = g_base64_encode(purple_image_get_data(img),
purple_image_get_data_size(img));
type = purple_image_get_mimetype(img);
src = g_strdup_printf("data:%s;base64,%s", type, b64);
--- a/pidgin/plugins/imgupload.c Sun Jun 04 18:13:19 2017 +0000
+++ b/pidgin/plugins/imgupload.c Thu Jun 01 19:59:58 2017 -0500
@@ -121,7 +121,7 @@
"Client-ID " IMGUP_IMGUR_CLIENT_ID);
/* TODO: make it a plain, multipart/form-data request */
- img_data = purple_base64_encode(purple_image_get_data(image),
+ img_data = g_base64_encode(purple_image_get_data(image),
purple_image_get_data_size(image));
img_data_e = g_uri_escape_string(img_data, NULL, FALSE);
g_free(img_data);