diff options
author | Eion Robb <eion@robbmob.com> | 2016-06-20 12:33:00 +0300 |
---|---|---|
committer | Eion Robb <eion@robbmob.com> | 2016-06-20 12:33:00 +0300 |
commit | 72f0b003252d0c827e9fa5dcb31005ef4a51b036 (patch) | |
tree | 7474f8d741fd9386491f45d139bfd1437e398649 | |
parent | c6c43cda9064fb593f9f65bf09c16eb676c03de9 (diff) |
Functionerize the plain http request code to get it working (hackily) with libpurple 2.11.0 in preparation for the Big Changes coming soon
-rw-r--r-- | skypeweb/skypeweb_connection.h | 42 | ||||
-rw-r--r-- | skypeweb/skypeweb_contacts.c | 32 | ||||
-rw-r--r-- | skypeweb/skypeweb_login.c | 5 | ||||
-rw-r--r-- | skypeweb/skypeweb_messages.c | 10 | ||||
-rw-r--r-- | skypeweb/skypeweb_util.c | 117 | ||||
-rw-r--r-- | skypeweb/skypeweb_util.h | 2 |
6 files changed, 137 insertions, 71 deletions
diff --git a/skypeweb/skypeweb_connection.h b/skypeweb/skypeweb_connection.h index 4563eda..f24c4f2 100644 --- a/skypeweb/skypeweb_connection.h +++ b/skypeweb/skypeweb_connection.h @@ -69,46 +69,4 @@ void skypeweb_update_cookies(SkypeWebAccount *sa, const gchar *headers); gchar *skypeweb_cookies_to_string(SkypeWebAccount *sa); - -/* Hack needed to stop redirect */ -struct _PurpleUtilFetchUrlData -{ - PurpleUtilFetchUrlCallback callback; - void *user_data; - - struct - { - char *user; - char *passwd; - char *address; - int port; - char *page; - - } website; - - char *url; - int num_times_redirected; - gboolean full; - char *user_agent; - gboolean http11; - char *request; - gsize request_written; - gboolean include_headers; - - gboolean is_ssl; - PurpleSslConnection *ssl_connection; - PurpleProxyConnectData *connect_data; - int fd; - guint inpa; - - gboolean got_headers; - gboolean has_explicit_data_len; - char *webdata; - gsize len; - unsigned long data_len; - gssize max_len; - gboolean chunked; - PurpleAccount *account; -}; - #endif /* SKYPEWEB_CONNECTION_H */ diff --git a/skypeweb/skypeweb_contacts.c b/skypeweb/skypeweb_contacts.c index cfb444f..799bb3d 100644 --- a/skypeweb/skypeweb_contacts.c +++ b/skypeweb/skypeweb_contacts.c @@ -56,15 +56,20 @@ skypeweb_get_icon_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const PurpleBuddy *buddy = user_data;
SkypeWebBuddy *sbuddy = purple_buddy_get_protocol_data(buddy);
SkypeWebAccount *sa = sbuddy->sa;
+ gchar *url = g_dataset_get_data(url_data, "url");
sa->url_datas = g_slist_remove(sa->url_datas, url_data);
active_icon_downloads--;
- if (!buddy)
+ if (!buddy) {
+ g_dataset_destroy(url_data);
return;
+ }
+
+ purple_buddy_icons_set_for_user(purple_buddy_get_account(buddy), purple_buddy_get_name(buddy), g_memdup(url_text, len), len, url);
- purple_buddy_icons_set_for_user(purple_buddy_get_account(buddy), purple_buddy_get_name(buddy), g_memdup(url_text, len), len, url_data->url);
+ g_dataset_destroy(url_data);
}
static void
@@ -72,6 +77,7 @@ skypeweb_get_icon_now(PurpleBuddy *buddy) {
SkypeWebBuddy *sbuddy;
gchar *url;
+ gpointer url_data;
purple_debug_info("skypeweb", "getting new buddy icon for %s\n", purple_buddy_get_name(buddy));
@@ -82,9 +88,8 @@ skypeweb_get_icon_now(PurpleBuddy *buddy) url = g_strdup_printf("https://api.skype.com/users/%s/profile/avatar", purple_url_encode(purple_buddy_get_name(buddy)));
}
- skypeweb_fetch_url_request(sbuddy->sa, url, TRUE, NULL, FALSE, NULL, FALSE, 524288, skypeweb_get_icon_cb, buddy);
-
- g_free(url);
+ url_data = skypeweb_fetch_url_request(sbuddy->sa, url, TRUE, NULL, FALSE, NULL, FALSE, 524288, skypeweb_get_icon_cb, buddy);
+ g_dataset_set_data_full(url_data, "url", url, g_free);
active_icon_downloads++;
}
@@ -119,6 +124,7 @@ skypeweb_got_imagemessage(PurpleUtilFetchUrlData *url_data, gpointer user_data, SkypeWebAccount *sa;
gint icon_id;
gchar *msg_tmp;
+ gchar *location;
// Conversation could have been closed before we retrieved the image
if (!purple_conversation_is_valid(conv)) {
@@ -129,13 +135,10 @@ skypeweb_got_imagemessage(PurpleUtilFetchUrlData *url_data, gpointer user_data, sa = purple_connection_get_protocol_data(pc);
sa->url_datas = g_slist_remove(sa->url_datas, url_data);
- if (url_text == NULL && url_data->data_len) {
- gchar *location;
- location = skypeweb_string_get_chunk(url_data->webdata, url_data->data_len, "Location: https://", "/");
- if (location && *location) {
- skypeweb_download_uri_to_conv(sa, location, conv);
- g_free(location);
- }
+ location = skypeweb_string_get_chunk(url_text, len, "Location: https://", "/");
+ if (location && *location) {
+ skypeweb_download_uri_to_conv(sa, location, conv);
+ g_free(location);
return;
}
@@ -158,7 +161,7 @@ void skypeweb_download_uri_to_conv(SkypeWebAccount *sa, const gchar *uri, PurpleConversation *conv)
{
gchar *headers, *url, *text;
- PurpleUtilFetchUrlData *requestdata;
+ gpointer requestdata;
PurpleHttpURL *httpurl;
httpurl = purple_http_url_parse(uri);
@@ -173,8 +176,7 @@ skypeweb_download_uri_to_conv(SkypeWebAccount *sa, const gchar *uri, PurpleConve requestdata = skypeweb_fetch_url_request(sa, uri, TRUE, NULL, FALSE, headers, FALSE, -1, skypeweb_got_imagemessage, conv);
- if (requestdata != NULL)
- requestdata->num_times_redirected = 10; /* Prevent following redirects */
+ skypeweb_url_prevent_follow_redirects(requestdata);
g_free(headers);
purple_http_url_free(httpurl);
diff --git a/skypeweb/skypeweb_login.c b/skypeweb/skypeweb_login.c index 4b60a25..0f25668 100644 --- a/skypeweb/skypeweb_login.c +++ b/skypeweb/skypeweb_login.c @@ -27,11 +27,6 @@ skypeweb_login_did_auth(PurpleUtilFetchUrlData *url_data, gpointer user_data, co SkypeWebAccount *sa = user_data;
sa->url_datas = g_slist_remove(sa->url_datas, url_data);
-
- if (url_text == NULL) {
- url_text = url_data->webdata;
- len = url_data->data_len;
- }
if (url_text != NULL)
refresh_token = skypeweb_string_get_chunk(url_text, len, "=\"skypetoken\" value=\"", "\"");
diff --git a/skypeweb/skypeweb_messages.c b/skypeweb/skypeweb_messages.c index 667dd59..61266d8 100644 --- a/skypeweb/skypeweb_messages.c +++ b/skypeweb/skypeweb_messages.c @@ -1005,11 +1005,6 @@ skypeweb_got_registration_token(PurpleUtilFetchUrlData *url_data, gpointer user_ sa->url_datas = g_slist_remove(sa->url_datas, url_data);
if (url_text == NULL) {
- url_text = url_data->webdata;
- len = url_data->data_len;
- }
-
- if (url_text == NULL) {
if (purple_major_version == 2 && (
purple_minor_version < 10 ||
(purple_minor_version == 10 && purple_micro_version < 11))
@@ -1063,7 +1058,7 @@ skypeweb_get_registration_token(SkypeWebAccount *sa) gchar *request;
gchar *curtime;
gchar *response;
- PurpleUtilFetchUrlData *requestdata;
+ gpointer requestdata;
g_free(sa->registration_token); sa->registration_token = NULL;
g_free(sa->endpoint); sa->endpoint = NULL;
@@ -1089,8 +1084,7 @@ skypeweb_get_registration_token(SkypeWebAccount *sa) requestdata = skypeweb_fetch_url_request(sa, messages_url, TRUE, NULL, FALSE, request, TRUE, 524288, skypeweb_got_registration_token, sa);
- if (requestdata != NULL)
- requestdata->num_times_redirected = 10; /* Prevent following redirects */
+ skypeweb_url_prevent_follow_redirects(requestdata);
g_free(request);
g_free(curtime);
diff --git a/skypeweb/skypeweb_util.c b/skypeweb/skypeweb_util.c index 77d43de..d67b937 100644 --- a/skypeweb/skypeweb_util.c +++ b/skypeweb/skypeweb_util.c @@ -254,6 +254,112 @@ find_acct(const char *prpl, const char *acct_id) }
+/* Hack needed to stop redirect */
+struct _PurpleUtilFetchUrlData
+{
+ PurpleUtilFetchUrlCallback callback;
+ void *user_data;
+
+ struct
+ {
+ char *user;
+ char *passwd;
+ char *address;
+ int port;
+ char *page;
+
+ } website;
+
+ char *url;
+ int num_times_redirected;
+ gboolean full;
+ char *user_agent;
+ gboolean http11;
+ char *request;
+ gsize request_written;
+ gboolean include_headers;
+
+ gboolean is_ssl;
+ PurpleSslConnection *ssl_connection;
+ PurpleProxyConnectData *connect_data;
+ int fd;
+ guint inpa;
+
+ gboolean got_headers;
+ gboolean has_explicit_data_len;
+ char *webdata;
+ gsize len;
+ unsigned long data_len;
+ gssize max_len;
+ gboolean chunked;
+ PurpleAccount *account;
+};
+
+/* Hack needed to stop redirect */
+struct _PurpleUtilFetchUrlDataTwoEleven
+{
+ PurpleUtilFetchUrlCallback callback;
+ void *user_data;
+
+ struct
+ {
+ char *user;
+ char *passwd;
+ char *address;
+ int port;
+ char *page;
+
+ } website;
+
+ char *url;
+ int num_times_redirected;
+ gboolean full;
+ char *user_agent;
+ gboolean http11;
+ char *request;
+ gsize request_len;
+ gsize request_written;
+ gboolean include_headers;
+
+ gboolean is_ssl;
+ PurpleSslConnection *ssl_connection;
+ PurpleProxyConnectData *connect_data;
+ int fd;
+ guint inpa;
+
+ gboolean got_headers;
+ gboolean has_explicit_data_len;
+ char *webdata;
+ gsize len;
+ unsigned long data_len;
+ gssize max_len;
+ gboolean chunked;
+ PurpleAccount *account;
+};
+
+static void
+skypeweb_fetch_url_request_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message) {
+
+ PurpleUtilFetchUrlCallback callback;
+
+ if (url_text == NULL) {
+ if (purple_major_version == 2 && purple_minor_version >= 11) {
+ struct _PurpleUtilFetchUrlDataTwoEleven *two_eleven_url_data = (struct _PurpleUtilFetchUrlDataTwoEleven *) url_data;
+
+ url_text = two_eleven_url_data->webdata;
+ len = two_eleven_url_data->data_len;
+ } else {
+ url_text = url_data->webdata;
+ len = url_data->data_len;
+ }
+ }
+
+ callback = g_dataset_get_data(url_data, "real_callback");
+ callback(url_data, user_data, url_text, len, error_message);
+
+ g_dataset_destroy(url_data);
+}
+
/* Wrapper of purple_util_fetch_url_request_len_with_account()
* that takes a SkypeWebAccount instead of a PurpleAccount,
* and keeps track of requests in sa->url_datas to cancel them on logout. */
@@ -266,7 +372,8 @@ skypeweb_fetch_url_request(SkypeWebAccount *sa, {
PurpleUtilFetchUrlData *url_data;
- url_data = purple_util_fetch_url_request(sa->account, url, full, user_agent, http11, request, include_headers, max_len, callback, user_data);
+ url_data = purple_util_fetch_url_request(sa->account, url, full, user_agent, http11, request, include_headers, max_len, skypeweb_fetch_url_request_cb, user_data);
+ g_dataset_set_data(url_data, "real_callback", callback);
if (url_data != NULL)
sa->url_datas = g_slist_prepend(sa->url_datas, url_data);
@@ -274,6 +381,14 @@ skypeweb_fetch_url_request(SkypeWebAccount *sa, return url_data;
}
+void
+skypeweb_url_prevent_follow_redirects(PurpleUtilFetchUrlData *requestdata)
+{
+ if (requestdata != NULL) {
+ requestdata->num_times_redirected = 10;
+ }
+}
+
const gchar *
skypeweb_user_url_prefix(const gchar *who)
{
diff --git a/skypeweb/skypeweb_util.h b/skypeweb/skypeweb_util.h index d8ecff2..7ff0b4b 100644 --- a/skypeweb/skypeweb_util.h +++ b/skypeweb/skypeweb_util.h @@ -37,4 +37,6 @@ skypeweb_fetch_url_request(SkypeWebAccount *sa, const char *request, gboolean include_headers, gssize max_len,
PurpleUtilFetchUrlCallback callback, void *user_data);
+void skypeweb_url_prevent_follow_redirects(PurpleUtilFetchUrlData *requestdata);
+
const gchar *skypeweb_user_url_prefix(const gchar *who);
|