Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/EionRobb/skype4pidgin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEion Robb <eion@robbmob.com>2016-06-20 12:33:00 +0300
committerEion Robb <eion@robbmob.com>2016-06-20 12:33:00 +0300
commit72f0b003252d0c827e9fa5dcb31005ef4a51b036 (patch)
tree7474f8d741fd9386491f45d139bfd1437e398649
parentc6c43cda9064fb593f9f65bf09c16eb676c03de9 (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.h42
-rw-r--r--skypeweb/skypeweb_contacts.c32
-rw-r--r--skypeweb/skypeweb_login.c5
-rw-r--r--skypeweb/skypeweb_messages.c10
-rw-r--r--skypeweb/skypeweb_util.c117
-rw-r--r--skypeweb/skypeweb_util.h2
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);