pidgin/pidgin

Convert GG file transfers to libsoup.

2019-10-12, Elliott Sales de Andrade
7668af6d772c
Parents dad0e4c75135
Children 63b74980bff0
Convert GG file transfers to libsoup.
--- a/libpurple/protocols/gg/edisc.c Sat Oct 12 00:16:15 2019 -0400
+++ b/libpurple/protocols/gg/edisc.c Sat Oct 12 04:17:36 2019 -0400
@@ -53,10 +53,10 @@
GHashTable *xfers_initialized;
GHashTable *xfers_history;
- PurpleHttpCookieJar *cookies;
+ SoupSession *session;
gchar *security_token;
- PurpleHttpConnection *auth_request;
+ SoupMessage *auth_request;
gboolean auth_done;
GList *auth_pending;
};
@@ -71,9 +71,7 @@
gboolean allowed, ready;
PurpleConnection *gc;
- PurpleHttpConnection *hc;
-
- gsize already_read;
+ SoupMessage *msg;
};
typedef enum
@@ -103,14 +101,17 @@
return accdata->edisc_data;
}
-void ggp_edisc_setup(PurpleConnection *gc)
+void
+ggp_edisc_setup(PurpleConnection *gc, GProxyResolver *resolver)
{
GGPInfo *accdata = purple_connection_get_protocol_data(gc);
ggp_edisc_session_data *sdata = g_new0(ggp_edisc_session_data, 1);
accdata->edisc_data = sdata;
- sdata->cookies = purple_http_cookie_jar_new();
+ sdata->session = soup_session_new_with_options(
+ SOUP_SESSION_PROXY_RESOLVER, resolver,
+ SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_COOKIE_JAR, NULL);
sdata->xfers_initialized = g_hash_table_new(g_str_hash, g_str_equal);
sdata->xfers_history = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
}
@@ -121,11 +122,11 @@
g_return_if_fail(sdata != NULL);
- purple_http_conn_cancel(sdata->auth_request);
+ soup_session_abort(sdata->session);
g_list_free_full(sdata->auth_pending, g_free);
g_free(sdata->security_token);
- purple_http_cookie_jar_unref(sdata->cookies);
+ g_object_unref(sdata->session);
g_hash_table_destroy(sdata->xfers_initialized);
g_hash_table_destroy(sdata->xfers_history);
@@ -136,27 +137,32 @@
* Misc.
******************************************************************************/
-static void ggp_edisc_set_defaults(PurpleHttpRequest *req)
+static void
+ggp_edisc_set_defaults(SoupMessage *msg)
{
- purple_http_request_set_max_len(req, GGP_EDISC_RESPONSE_MAX);
- purple_http_request_header_set(req, "X-gged-api-version",
- GGP_EDISC_API);
+ // purple_http_request_set_max_len(msg, GGP_EDISC_RESPONSE_MAX);
+ soup_message_headers_replace(msg->request_headers, "X-gged-api-version",
+ GGP_EDISC_API);
/* optional fields */
- purple_http_request_header_set(req, "User-Agent", "Mozilla/5.0 (Windows"
- " NT 6.1; rv:11.0) Gecko/20120613 GG/11.0.0.8169 (WINNT_x86-msv"
- "c; pl; beta; standard)");
- purple_http_request_header_set(req, "Accept", "text/html,application/xh"
- "tml+xml,application/xml;q=0.9,*/*;q=0.8");
- purple_http_request_header_set(req, "Accept-Language",
- "pl,en-us;q=0.7,en;q=0.3");
- /* purple_http_request_header_set(req, "Accept-Encoding",
- * "gzip, deflate"); */
- purple_http_request_header_set(req, "Accept-Charset",
- "ISO-8859-2,utf-8;q=0.7,*;q=0.7");
- purple_http_request_header_set(req, "Connection", "keep-alive");
- purple_http_request_header_set(req, "Content-Type",
- "application/x-www-form-urlencoded; charset=UTF-8");
+ soup_message_headers_replace(
+ msg->request_headers, "User-Agent",
+ "Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20120613 "
+ "GG/11.0.0.8169 (WINNT_x86-msvc; pl; beta; standard)");
+ soup_message_headers_replace(
+ msg->request_headers, "Accept",
+ "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
+ soup_message_headers_replace(msg->request_headers, "Accept-Language",
+ "pl,en-us;q=0.7,en;q=0.3");
+ /* soup_message_headers_replace(msg->request_headers, "Accept-Encoding",
+ * "gzip, deflate"); */
+ soup_message_headers_replace(msg->request_headers, "Accept-Charset",
+ "ISO-8859-2,utf-8;q=0.7,*;q=0.7");
+ soup_message_headers_replace(msg->request_headers, "Connection",
+ "keep-alive");
+ soup_message_headers_replace(
+ msg->request_headers, "Content-Type",
+ "application/x-www-form-urlencoded; charset=UTF-8");
}
static int ggp_edisc_parse_error(const gchar *data)
@@ -226,30 +232,6 @@
purple_xfer_end(xfer);
}
-static void ggp_edisc_xfer_progress_watcher(PurpleHttpConnection *hc,
- gboolean reading_state, int processed, int total, gpointer _xfer)
-{
- PurpleXfer *xfer = _xfer;
- gboolean eof;
- int total_real;
-
- if (purple_xfer_get_xfer_type(xfer) == PURPLE_XFER_TYPE_RECEIVE) {
- if (!reading_state)
- return;
- } else {
- if (reading_state)
- return;
- }
-
- eof = (processed >= total);
- total_real = purple_xfer_get_size(xfer);
- if (eof || processed > total_real)
- processed = total_real; /* just to be sure */
-
- purple_xfer_set_bytes_sent(xfer, processed);
- purple_xfer_update_progress(xfer);
-}
-
/*******************************************************************************
* Authentication.
******************************************************************************/
@@ -283,10 +265,10 @@
}
static void
-ggp_ggdrive_auth_done(PurpleHttpConnection *hc, PurpleHttpResponse *response,
+ggp_ggdrive_auth_done(G_GNUC_UNUSED SoupSession *session, SoupMessage *msg,
gpointer user_data)
{
- PurpleConnection *gc = purple_http_conn_get_purple_connection(hc);
+ PurpleConnection *gc = user_data;
ggp_edisc_session_data *sdata = ggp_edisc_get_sdata(gc);
JsonParser *parser;
JsonObject *result;
@@ -296,16 +278,16 @@
sdata->auth_request = NULL;
- if (!purple_http_response_is_successful(response)) {
+ if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) {
purple_debug_misc("gg",
"ggp_ggdrive_auth_done: authentication failed due to "
"unsuccessful request (code = %d)",
- purple_http_response_get_code(response));
+ msg->status_code);
ggp_ggdrive_auth_results(gc, FALSE);
return;
}
- parser = ggp_json_parse(purple_http_response_get_data(response, NULL));
+ parser = ggp_json_parse(msg->response_body->data);
result = json_node_get_object(json_parser_get_root(parser));
result = json_object_get_object_member(result, "result");
if (json_object_has_member(result, "status"))
@@ -319,14 +301,14 @@
status);
if (purple_debug_is_verbose()) {
purple_debug_misc("gg", "ggp_ggdrive_auth_done: result = %s",
- purple_http_response_get_data(response, NULL));
+ msg->response_body->data);
}
ggp_ggdrive_auth_results(gc, FALSE);
return;
}
- sdata->security_token = g_strdup(
- purple_http_response_get_header(response, "X-gged-security-token"));
+ sdata->security_token = g_strdup(soup_message_headers_get_one(
+ msg->response_headers, "X-gged-security-token"));
if (!sdata->security_token) {
purple_debug_misc("gg", "ggp_ggdrive_auth_done: authentication failed "
"due to missing security token header");
@@ -350,7 +332,8 @@
ggp_edisc_auth_data *auth;
const gchar *imtoken;
gchar *metadata;
- PurpleHttpRequest *req;
+ gchar *tmp;
+ SoupMessage *msg;
g_return_if_fail(sdata != NULL);
@@ -376,11 +359,8 @@
purple_debug_info("gg", "ggp_ggdrive_auth(gc=%p)", gc);
- req = purple_http_request_new("https://drive.mpa.gg.pl/signin");
- purple_http_request_set_method(req, "PUT");
-
- ggp_edisc_set_defaults(req);
- purple_http_request_set_cookie_jar(req, sdata->cookies);
+ msg = soup_message_new("PUT", "https://drive.mpa.gg.pl/signin");
+ ggp_edisc_set_defaults(msg);
metadata =
g_strdup_printf("{"
@@ -392,16 +372,18 @@
g_random_int_range(1, 1 << 16),
purple_get_host_name(), ggp_libgaduw_version(gc));
- purple_http_request_header_set_printf(req, "Authorization", "IMToken %s",
- imtoken);
- purple_http_request_header_set_printf(req, "X-gged-user", "gg/pl:%u",
- accdata->session->uin);
- purple_http_request_header_set(req, "X-gged-client-metadata", metadata);
+ tmp = g_strdup_printf("IMToken %s", imtoken);
+ soup_message_headers_replace(msg->request_headers, "Authorization", tmp);
+ g_free(tmp);
+ tmp = g_strdup_printf("gg/pl:%u", accdata->session->uin);
+ soup_message_headers_replace(msg->request_headers, "X-gged-user", tmp);
+ g_free(tmp);
+ soup_message_headers_replace(msg->request_headers, "X-gged-client-metadata",
+ metadata);
g_free(metadata);
- sdata->auth_request =
- purple_http_request(gc, req, ggp_ggdrive_auth_done, NULL);
- purple_http_request_unref(req);
+ soup_session_queue_message(sdata->session, msg, ggp_ggdrive_auth_done, gc);
+ sdata->auth_request = msg;
}
static void
@@ -460,14 +442,13 @@
return PURPLE_BUDDY_IS_ONLINE(buddy);
}
-static void ggp_edisc_xfer_send_init_ticket_created(PurpleHttpConnection *hc,
- PurpleHttpResponse *response, gpointer _xfer)
+static void
+ggp_edisc_xfer_send_init_ticket_created(G_GNUC_UNUSED SoupSession *session,
+ SoupMessage *msg, gpointer _xfer)
{
- ggp_edisc_session_data *sdata = ggp_edisc_get_sdata(
- purple_http_conn_get_purple_connection(hc));
PurpleXfer *xfer = _xfer;
GGPXfer *edisc_xfer = GGP_XFER(xfer);
- const gchar *data = purple_http_response_get_data(response, NULL);
+ ggp_edisc_session_data *sdata = ggp_edisc_get_sdata(edisc_xfer->gc);
ggp_edisc_xfer_ack_status ack_status;
JsonParser *parser;
JsonObject *ticket;
@@ -477,10 +458,10 @@
g_return_if_fail(sdata != NULL);
- edisc_xfer->hc = NULL;
+ edisc_xfer->msg = NULL;
- if (!purple_http_response_is_successful(response)) {
- int error_id = ggp_edisc_parse_error(data);
+ if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) {
+ int error_id = ggp_edisc_parse_error(msg->response_body->data);
if (error_id == 206) /* recipient not logged in */
ggp_edisc_xfer_error(xfer,
_("Recipient not logged in"));
@@ -493,7 +474,7 @@
return;
}
- parser = ggp_json_parse(data);
+ parser = ggp_json_parse(msg->response_body->data);
ticket = json_node_get_object(json_parser_get_root(parser));
ticket = json_object_get_object_member(ticket, "result");
ticket = json_object_get_object_member(ticket, "send_ticket");
@@ -530,7 +511,7 @@
gpointer _xfer)
{
ggp_edisc_session_data *sdata = ggp_edisc_get_sdata(gc);
- PurpleHttpRequest *req;
+ SoupMessage *msg;
PurpleXfer *xfer = _xfer;
GGPXfer *edisc_xfer = GGP_XFER(xfer);
gchar *data;
@@ -546,14 +527,11 @@
g_return_if_fail(sdata != NULL);
- req = purple_http_request_new("https://drive.mpa.gg.pl/send_ticket");
- purple_http_request_set_method(req, "PUT");
+ msg = soup_message_new("PUT", "https://drive.mpa.gg.pl/send_ticket");
+ ggp_edisc_set_defaults(msg);
- ggp_edisc_set_defaults(req);
- purple_http_request_set_cookie_jar(req, sdata->cookies);
-
- purple_http_request_header_set(req, "X-gged-security-token",
- sdata->security_token);
+ soup_message_headers_replace(msg->request_headers, "X-gged-security-token",
+ sdata->security_token);
data = g_strdup_printf("{\"send_ticket\":{"
"\"recipient\":\"%s\","
@@ -563,12 +541,13 @@
purple_xfer_get_remote_user(xfer),
edisc_xfer->filename,
(int)purple_xfer_get_size(xfer));
- purple_http_request_set_contents(req, data, -1);
- g_free(data);
+ soup_message_set_request(msg,
+ "application/x-www-form-urlencoded; charset=UTF-8",
+ SOUP_MEMORY_TAKE, data, -1);
- edisc_xfer->hc = purple_http_request(
- gc, req, ggp_edisc_xfer_send_init_ticket_created, xfer);
- purple_http_request_unref(req);
+ soup_session_queue_message(sdata->session, msg,
+ ggp_edisc_xfer_send_init_ticket_created, xfer);
+ edisc_xfer->msg = msg;
}
static void
@@ -585,47 +564,38 @@
xfer);
}
-static void ggp_edisc_xfer_send_reader(PurpleHttpConnection *hc,
- gchar *buffer, size_t offset, size_t length, gpointer _xfer,
- PurpleHttpContentReaderCb cb)
+static void
+ggp_edisc_xfer_send_reader(SoupMessage *msg, gpointer _xfer)
{
PurpleXfer *xfer = _xfer;
- GGPXfer *edisc_xfer;
- int stored;
- gboolean success, eof = FALSE;
+ guchar *buffer;
+ /* FIXME: The read/write xfer implementation sizes this dynamically. */
+ gsize length = 4096;
+ gssize stored;
- g_return_if_fail(xfer != NULL);
- edisc_xfer = GGP_XFER(xfer);
- g_return_if_fail(edisc_xfer != NULL);
+ buffer = g_new(guchar, length);
+ stored = purple_xfer_read_file(xfer, buffer, length);
- if (edisc_xfer->already_read != offset) {
- purple_debug_error("gg", "ggp_edisc_xfer_send_reader: "
- "Invalid offset (%" G_GSIZE_FORMAT " != %" G_GSIZE_FORMAT ")\n",
- edisc_xfer->already_read, offset);
- ggp_edisc_xfer_error(xfer, _("Error while reading a file"));
+ if (stored < 0) {
+ GGPXfer *edisc_xfer = GGP_XFER(xfer);
+ ggp_edisc_session_data *sdata = ggp_edisc_get_sdata(edisc_xfer->gc);
+ soup_session_cancel_message(sdata->session, msg, SOUP_STATUS_IO_ERROR);
return;
}
- stored = purple_xfer_read_file(xfer, (guchar *)buffer, length);
-
- if (stored < 0)
- success = FALSE;
- else {
- success = TRUE;
- edisc_xfer->already_read += stored;
- eof = ((goffset)edisc_xfer->already_read >= purple_xfer_get_size(xfer));
+ soup_message_body_append(msg->request_body, SOUP_MEMORY_TAKE, buffer,
+ stored);
+ if (purple_xfer_get_bytes_sent(xfer) >= purple_xfer_get_size(xfer)) {
+ soup_message_body_complete(msg->request_body);
}
-
- cb(hc, success, eof, stored);
}
static void
-ggp_edisc_xfer_send_done(PurpleHttpConnection *hc, PurpleHttpResponse *response,
+ggp_edisc_xfer_send_done(G_GNUC_UNUSED SoupSession *session, SoupMessage *msg,
gpointer _xfer)
{
PurpleXfer *xfer = _xfer;
GGPXfer *edisc_xfer = GGP_XFER(xfer);
- const gchar *data = purple_http_response_get_data(response, NULL);
JsonParser *parser;
JsonObject *result;
int result_status = -1;
@@ -636,14 +606,14 @@
g_return_if_fail(edisc_xfer != NULL);
- edisc_xfer->hc = NULL;
+ edisc_xfer->msg = NULL;
- if (!purple_http_response_is_successful(response)) {
+ if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) {
ggp_edisc_xfer_error(xfer, _("Error while sending a file"));
return;
}
- parser = ggp_json_parse(data);
+ parser = ggp_json_parse(msg->response_body->data);
result = json_node_get_object(json_parser_get_root(parser));
result = json_object_get_object_member(result, "result");
if (json_object_has_member(result, "status")) {
@@ -664,7 +634,7 @@
ggp_edisc_session_data *sdata;
GGPXfer *edisc_xfer;
gchar *upload_url, *filename_e;
- PurpleHttpRequest *req;
+ SoupMessage *msg;
g_return_if_fail(xfer != NULL);
edisc_xfer = GGP_XFER(xfer);
@@ -676,30 +646,30 @@
upload_url = g_strdup_printf("https://drive.mpa.gg.pl/me/file/outbox/"
"%s%%2C%s", edisc_xfer->ticket_id, filename_e);
g_free(filename_e);
- req = purple_http_request_new(upload_url);
+ msg = soup_message_new("PUT", upload_url);
g_free(upload_url);
- purple_http_request_set_method(req, "PUT");
- purple_http_request_set_timeout(req, -1);
+ ggp_edisc_set_defaults(msg);
- ggp_edisc_set_defaults(req);
- purple_http_request_set_cookie_jar(req, sdata->cookies);
+ soup_message_headers_replace(msg->request_headers, "X-gged-local-revision",
+ "0");
+ soup_message_headers_replace(msg->request_headers, "X-gged-security-token",
+ sdata->security_token);
+ soup_message_headers_replace(msg->request_headers, "X-gged-metadata",
+ "{\"node_type\": \"file\"}");
- purple_http_request_header_set(req, "X-gged-local-revision", "0");
- purple_http_request_header_set(req, "X-gged-security-token",
- sdata->security_token);
- purple_http_request_header_set(req, "X-gged-metadata",
- "{\"node_type\": \"file\"}");
+ soup_message_set_flags(msg, SOUP_MESSAGE_CAN_REBUILD);
+ soup_message_body_set_accumulate(msg->request_body, FALSE);
+ soup_message_headers_set_content_length(msg->request_headers,
+ purple_xfer_get_size(xfer));
+ g_signal_connect(msg, "wrote-headers",
+ G_CALLBACK(ggp_edisc_xfer_send_reader), xfer);
+ g_signal_connect(msg, "wrote-chunk", G_CALLBACK(ggp_edisc_xfer_send_reader),
+ xfer);
- purple_http_request_set_contents_reader(req, ggp_edisc_xfer_send_reader,
- purple_xfer_get_size(xfer), xfer);
-
- edisc_xfer->hc = purple_http_request(edisc_xfer->gc, req,
- ggp_edisc_xfer_send_done, xfer);
- purple_http_request_unref(req);
-
- purple_http_conn_set_progress_watcher(edisc_xfer->hc,
- ggp_edisc_xfer_progress_watcher, xfer, 250000);
+ soup_session_queue_message(sdata->session, msg, ggp_edisc_xfer_send_done,
+ xfer);
+ edisc_xfer->msg = msg;
}
PurpleXfer * ggp_edisc_xfer_send_new(PurpleProtocolXfer *prplxfer, PurpleConnection *gc, const char *who)
@@ -762,8 +732,8 @@
}
static void
-ggp_edisc_xfer_recv_ack_done(PurpleHttpConnection *hc,
- PurpleHttpResponse *response, gpointer _xfer)
+ggp_edisc_xfer_recv_ack_done(G_GNUC_UNUSED SoupSession *session,
+ SoupMessage *msg, gpointer _xfer)
{
PurpleXfer *xfer = _xfer;
GGPXfer *edisc_xfer;
@@ -773,45 +743,43 @@
}
edisc_xfer = GGP_XFER(xfer);
- edisc_xfer->hc = NULL;
+ edisc_xfer->msg = NULL;
- if (!purple_http_response_is_successful(response)) {
+ if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) {
ggp_edisc_xfer_error(xfer, _("Cannot confirm file transfer."));
return;
}
purple_debug_info("gg", "ggp_edisc_xfer_recv_ack_done: [%s]\n",
- purple_http_response_get_data(response, NULL));
+ msg->response_body->data);
}
static void ggp_edisc_xfer_recv_ack(PurpleXfer *xfer, gboolean accept)
{
GGPXfer *edisc_xfer = GGP_XFER(xfer);
ggp_edisc_session_data *sdata = ggp_edisc_get_sdata(edisc_xfer->gc);
- PurpleHttpRequest *req;
+ SoupMessage *msg;
g_return_if_fail(sdata != NULL);
edisc_xfer->allowed = accept;
- req = purple_http_request_new(ggp_edisc_xfer_ticket_url(
- edisc_xfer->ticket_id));
- purple_http_request_set_method(req, "PUT");
+ msg = soup_message_new("PUT",
+ ggp_edisc_xfer_ticket_url(edisc_xfer->ticket_id));
+ ggp_edisc_set_defaults(msg);
- ggp_edisc_set_defaults(req);
- purple_http_request_set_cookie_jar(req, sdata->cookies);
- purple_http_request_header_set(req, "X-gged-security-token",
- sdata->security_token);
+ soup_message_headers_replace(msg->request_headers, "X-gged-security-token",
+ sdata->security_token);
+ soup_message_headers_replace(msg->request_headers, "X-gged-ack-status",
+ accept ? "allow" : "reject");
- purple_http_request_header_set(req, "X-gged-ack-status",
- accept ? "allow" : "reject");
-
- edisc_xfer->hc = purple_http_request(edisc_xfer->gc, req,
- accept ? ggp_edisc_xfer_recv_ack_done : NULL, xfer);
- purple_http_request_unref(req);
+ soup_session_queue_message(sdata->session, msg,
+ accept ? ggp_edisc_xfer_recv_ack_done : NULL,
+ xfer);
+ edisc_xfer->msg = msg;
if (!accept) {
- edisc_xfer->hc = NULL;
+ edisc_xfer->msg = NULL;
}
}
@@ -838,42 +806,37 @@
purple_xfer_start(xfer, -1, NULL, 0);
}
-static gboolean ggp_edisc_xfer_recv_writer(PurpleHttpConnection *http_conn,
- PurpleHttpResponse *response, const gchar *buffer, size_t offset,
- size_t length, gpointer _xfer)
+static void
+ggp_edisc_xfer_recv_writer(SoupMessage *msg, SoupBuffer *chunk, gpointer _xfer)
{
PurpleXfer *xfer = _xfer;
- gssize stored;
-
- g_return_val_if_fail(xfer != NULL, FALSE);
+ GGPXfer *edisc_xfer = GGP_XFER(xfer);
+ ggp_edisc_session_data *sdata = ggp_edisc_get_sdata(edisc_xfer->gc);
+ gboolean stored;
- stored = purple_xfer_write_file(xfer, (guchar *)buffer, length) ?
- (gssize)length : -1;
-
- if (stored < 0 || (gsize)stored != length) {
- purple_debug_error("gg", "ggp_edisc_xfer_recv_writer: "
- "saved too less\n");
- return FALSE;
+ if (chunk->length > purple_xfer_get_bytes_remaining(xfer)) {
+ purple_debug_error(
+ "gg",
+ "ggp_edisc_xfer_recv_writer: saved too much (%" G_GSIZE_FORMAT
+ " > %" G_GOFFSET_FORMAT ")",
+ chunk->length, purple_xfer_get_bytes_remaining(xfer));
+ soup_session_cancel_message(sdata->session, msg, SOUP_STATUS_IO_ERROR);
+ return;
}
- if (stored > purple_xfer_get_bytes_remaining(xfer)) {
- purple_debug_error("gg", "ggp_edisc_xfer_recv_writer: "
- "saved too much (%" G_GSSIZE_FORMAT " > %" G_GOFFSET_FORMAT ")\n",
- stored, purple_xfer_get_bytes_remaining(xfer));
- return FALSE;
- }
+ stored = purple_xfer_write_file(xfer, (const guchar *)chunk->data,
+ chunk->length);
- /* May look redundant with ggp_edisc_xfer_progress_watcher,
- * but it isn't!
- */
- purple_xfer_set_bytes_sent(xfer,
- purple_xfer_get_bytes_sent(xfer) + stored);
-
- return TRUE;
+ if (!stored) {
+ purple_debug_error("gg", "ggp_edisc_xfer_recv_writer: saved too less");
+ soup_session_cancel_message(sdata->session, msg, SOUP_STATUS_IO_ERROR);
+ return;
+ }
}
-static void ggp_edisc_xfer_recv_done(PurpleHttpConnection *hc,
- PurpleHttpResponse *response, gpointer _xfer)
+static void
+ggp_edisc_xfer_recv_done(G_GNUC_UNUSED SoupSession *session, SoupMessage *msg,
+ gpointer _xfer)
{
PurpleXfer *xfer = _xfer;
GGPXfer *edisc_xfer = GGP_XFER(xfer);
@@ -881,9 +844,9 @@
if (purple_xfer_is_cancelled(xfer))
return;
- edisc_xfer->hc = NULL;
+ edisc_xfer->msg = NULL;
- if (!purple_http_response_is_successful(response)) {
+ if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) {
ggp_edisc_xfer_error(xfer, _("Error while receiving a file"));
return;
}
@@ -904,7 +867,7 @@
ggp_edisc_session_data *sdata;
GGPXfer *edisc_xfer;
gchar *upload_url;
- PurpleHttpRequest *req;
+ SoupMessage *msg;
g_return_if_fail(xfer != NULL);
edisc_xfer = GGP_XFER(xfer);
@@ -918,32 +881,26 @@
edisc_xfer->ticket_id,
purple_url_encode(purple_xfer_get_filename(xfer)),
GGP_EDISC_API, sdata->security_token);
- req = purple_http_request_new(upload_url);
+ msg = soup_message_new("GET", upload_url);
g_free(upload_url);
- purple_http_request_set_timeout(req, -1);
-
- ggp_edisc_set_defaults(req);
- purple_http_request_set_max_len(req, purple_xfer_get_size(xfer) + 1);
- purple_http_request_set_cookie_jar(req, sdata->cookies);
+ ggp_edisc_set_defaults(msg);
+ // purple_http_request_set_max_len(msg, purple_xfer_get_size(xfer) + 1);
- purple_http_request_set_response_writer(req, ggp_edisc_xfer_recv_writer,
- xfer);
+ soup_message_body_set_accumulate(msg->response_body, FALSE);
+ g_signal_connect(msg, "got-chunk", G_CALLBACK(ggp_edisc_xfer_recv_writer),
+ xfer);
- edisc_xfer->hc = purple_http_request(edisc_xfer->gc, req,
- ggp_edisc_xfer_recv_done, xfer);
- purple_http_request_unref(req);
-
- purple_http_conn_set_progress_watcher(
- edisc_xfer->hc, ggp_edisc_xfer_progress_watcher, xfer, 250000);
+ soup_session_queue_message(sdata->session, msg, ggp_edisc_xfer_recv_done,
+ xfer);
+ edisc_xfer->msg = msg;
}
static void
-ggp_edisc_xfer_recv_ticket_update_got(PurpleHttpConnection *hc,
- PurpleHttpResponse *response,
- gpointer user_data)
+ggp_edisc_xfer_recv_ticket_update_got(G_GNUC_UNUSED SoupSession *session,
+ SoupMessage *msg, gpointer user_data)
{
- PurpleConnection *gc = purple_http_conn_get_purple_connection(hc);
+ PurpleConnection *gc = user_data;
PurpleXfer *xfer;
GGPXfer *edisc_xfer;
JsonParser *parser;
@@ -955,18 +912,18 @@
uin_t sender, recipient;
int file_size;
- if (!purple_http_response_is_successful(response)) {
+ if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) {
purple_debug_error("gg",
"ggp_edisc_xfer_recv_ticket_update_got: cannot "
"fetch update for ticket (code=%d)",
- purple_http_response_get_code(response));
+ msg->status_code);
return;
}
sdata = ggp_edisc_get_sdata(gc);
g_return_if_fail(sdata != NULL);
- parser = ggp_json_parse(purple_http_response_get_data(response, NULL));
+ parser = ggp_json_parse(msg->response_body->data);
result = json_node_get_object(json_parser_get_root(parser));
result = json_object_get_object_member(result, "result");
if (json_object_has_member(result, "status"))
@@ -1046,7 +1003,7 @@
gpointer _ticket)
{
ggp_edisc_session_data *sdata = ggp_edisc_get_sdata(gc);
- PurpleHttpRequest *req;
+ SoupMessage *msg;
gchar *ticket = _ticket;
g_return_if_fail(sdata != NULL);
@@ -1061,17 +1018,16 @@
return;
}
- req = purple_http_request_new(ggp_edisc_xfer_ticket_url(ticket));
+ msg = soup_message_new("GET", ggp_edisc_xfer_ticket_url(ticket));
g_free(ticket);
- ggp_edisc_set_defaults(req);
- purple_http_request_set_cookie_jar(req, sdata->cookies);
+ ggp_edisc_set_defaults(msg);
- purple_http_request_header_set(req, "X-gged-security-token",
- sdata->security_token);
+ soup_message_headers_replace(msg->request_headers, "X-gged-security-token",
+ sdata->security_token);
- purple_http_request(gc, req, ggp_edisc_xfer_recv_ticket_update_got, NULL);
- purple_http_request_unref(req);
+ soup_session_queue_message(sdata->session, msg,
+ ggp_edisc_xfer_recv_ticket_update_got, gc);
}
static void
@@ -1190,10 +1146,11 @@
GGPXfer *edisc_xfer = GGP_XFER(obj);
ggp_edisc_session_data *sdata;
+ sdata = ggp_edisc_get_sdata(edisc_xfer->gc);
+
g_free(edisc_xfer->filename);
- purple_http_conn_cancel(edisc_xfer->hc);
-
- sdata = ggp_edisc_get_sdata(edisc_xfer->gc);
+ soup_session_cancel_message(sdata->session, edisc_xfer->msg,
+ SOUP_STATUS_CANCELLED);
if (edisc_xfer->ticket_id != NULL) {
g_hash_table_remove(sdata->xfers_initialized,
--- a/libpurple/protocols/gg/edisc.h Sat Oct 12 00:16:15 2019 -0400
+++ b/libpurple/protocols/gg/edisc.h Sat Oct 12 04:17:36 2019 -0400
@@ -41,7 +41,7 @@
void ggp_xfer_register(GTypeModule *module);
/* Setting up. */
-void ggp_edisc_setup(PurpleConnection *gc);
+void ggp_edisc_setup(PurpleConnection *gc, GProxyResolver *resolver);
void ggp_edisc_cleanup(PurpleConnection *gc);
/* General xfer functions. */
--- a/libpurple/protocols/gg/gg.c Sat Oct 12 00:16:15 2019 -0400
+++ b/libpurple/protocols/gg/gg.c Sat Oct 12 04:17:36 2019 -0400
@@ -730,7 +730,6 @@
info->http = soup_session_new_with_options(SOUP_SESSION_PROXY_RESOLVER,
resolver, NULL);
- g_object_unref(resolver);
ggp_tcpsocket_setup(gc, glp);
ggp_image_setup(gc);
@@ -740,7 +739,8 @@
ggp_status_setup(gc);
ggp_chat_setup(gc);
ggp_message_setup(gc);
- ggp_edisc_setup(gc);
+ ggp_edisc_setup(gc, resolver);
+ g_object_unref(resolver);
glp->uin = ggp_str_to_uin(purple_account_get_username(account));
glp->password =