/pidgin/main: ea42b0dd066f: HTTP: removing extra yahoo HTTP impl...
Tomasz Wasilczyk
tomkiewicz at cpw.pidgin.im
Wed Aug 7 04:38:46 EDT 2013
Changeset: ea42b0dd066f7023a11916c0071cc5ae43234855
Author: Tomasz Wasilczyk <tomkiewicz at cpw.pidgin.im>
Date: 2013-08-07 10:38 +0200
Branch: default
URL: https://hg.pidgin.im/pidgin/main/rev/ea42b0dd066f
Description:
HTTP: removing extra yahoo HTTP implementations - chat list browser
diffstat:
libpurple/protocols/yahoo/yahoochat.c | 198 ++++++++-------------------------
1 files changed, 47 insertions(+), 151 deletions(-)
diffs (287 lines):
diff --git a/libpurple/protocols/yahoo/yahoochat.c b/libpurple/protocols/yahoo/yahoochat.c
--- a/libpurple/protocols/yahoo/yahoochat.c
+++ b/libpurple/protocols/yahoo/yahoochat.c
@@ -1175,31 +1175,19 @@ void yahoo_c_invite(PurpleConnection *gc
}
struct yahoo_roomlist {
- int fd;
- int inpa;
- gchar *txbuf;
- gsize tx_written;
- guchar *rxqueue;
- int rxlen;
- gboolean started;
- char *path;
- char *host;
+ PurpleHttpConnection *hc;
+ gchar *url;
+
PurpleRoomlist *list;
PurpleRoomlistRoom *cat;
PurpleRoomlistRoom *ucat;
- GMarkupParseContext *parse;
};
static void yahoo_roomlist_destroy(struct yahoo_roomlist *yrl)
{
- if (yrl->inpa)
- purple_input_remove(yrl->inpa);
- g_free(yrl->txbuf);
- g_free(yrl->rxqueue);
- g_free(yrl->path);
- g_free(yrl->host);
- if (yrl->parse)
- g_markup_parse_context_free(yrl->parse);
+ purple_http_conn_cancel(yrl->hc);
+ g_free(yrl->url);
+
g_free(yrl);
}
@@ -1380,121 +1368,63 @@ static void yahoo_roomlist_cleanup(Purpl
purple_roomlist_unref(list);
}
-static void yahoo_roomlist_pending(gpointer data, gint source, PurpleInputCondition cond)
+static void
+yahoo_roomlist_got(PurpleHttpConnection *http_conn,
+ PurpleHttpResponse *response, gpointer _yrl)
{
- struct yahoo_roomlist *yrl = data;
- PurpleRoomlist *list = yrl->list;
- char buf[1024];
- int len;
- guchar *start;
- struct yahoo_chatxml_state *s;
+ struct yahoo_roomlist *yrl = _yrl;
+ PurpleConnection *gc;
+ GMarkupParseContext *parse;
- len = read(yrl->fd, buf, sizeof(buf));
+ yrl->hc = NULL;
- if (len < 0 && errno == EAGAIN)
- return;
+ gc = purple_account_get_connection(purple_roomlist_get_account(
+ yrl->list));
- if (len <= 0) {
- if (yrl->parse)
- g_markup_parse_context_end_parse(yrl->parse, NULL);
- yahoo_roomlist_cleanup(list, yrl);
+ if (!purple_http_response_is_successfull(response)) {
+ purple_notify_error(gc, NULL, _("Unable to connect"),
+ _("Fetching the room list failed."));
+ yahoo_roomlist_cleanup(yrl->list, yrl);
return;
}
- yrl->rxqueue = g_realloc(yrl->rxqueue, len + yrl->rxlen);
- memcpy(yrl->rxqueue + yrl->rxlen, buf, len);
- yrl->rxlen += len;
+ parse = g_markup_parse_context_new(&parser, 0,
+ yahoo_chatxml_state_new(yrl->list, yrl),
+ (GDestroyNotify)yahoo_chatxml_state_destroy);
- if (!yrl->started) {
- yrl->started = TRUE;
- start = (guchar *)g_strstr_len((char *)yrl->rxqueue, yrl->rxlen, "\r\n\r\n");
- if (!start || (start - yrl->rxqueue + 4) >= yrl->rxlen)
- return;
- start += 4;
- } else {
- start = yrl->rxqueue;
- }
-
- if (yrl->parse == NULL) {
- s = yahoo_chatxml_state_new(list, yrl);
- yrl->parse = g_markup_parse_context_new(&parser, 0, s,
- (GDestroyNotify)yahoo_chatxml_state_destroy);
- }
-
- if (!g_markup_parse_context_parse(yrl->parse, (char *)start, (yrl->rxlen - (start - yrl->rxqueue)), NULL)) {
-
- yahoo_roomlist_cleanup(list, yrl);
+ if (!g_markup_parse_context_parse(parse,
+ purple_http_response_get_data(response, NULL),
+ purple_http_response_get_data_len(response), NULL))
+ {
+ purple_debug_error("yahoo", "Couldn't parse the room list\n");
+ yahoo_roomlist_cleanup(yrl->list, yrl);
return;
}
- yrl->rxlen = 0;
+ g_markup_parse_context_free(parse);
}
-static void yahoo_roomlist_send_cb(gpointer data, gint source, PurpleInputCondition cond)
+static void
+yahoo_roomlist_make_request(struct yahoo_roomlist *yrl)
{
- struct yahoo_roomlist *yrl;
- PurpleRoomlist *list;
- int written, remaining;
-
- yrl = data;
- list = yrl->list;
-
- remaining = strlen(yrl->txbuf) - yrl->tx_written;
- written = write(yrl->fd, yrl->txbuf + yrl->tx_written, remaining);
-
- if (written < 0 && errno == EAGAIN)
- written = 0;
- else if (written <= 0) {
- purple_input_remove(yrl->inpa);
- yrl->inpa = 0;
- g_free(yrl->txbuf);
- yrl->txbuf = NULL;
- purple_notify_error(purple_account_get_connection(purple_roomlist_get_account(list)), NULL, _("Unable to connect"), _("Fetching the room list failed."));
- yahoo_roomlist_cleanup(list, yrl);
- return;
- }
-
- if (written < remaining) {
- yrl->tx_written += written;
- return;
- }
-
- g_free(yrl->txbuf);
- yrl->txbuf = NULL;
-
- purple_input_remove(yrl->inpa);
- yrl->inpa = purple_input_add(yrl->fd, PURPLE_INPUT_READ,
- yahoo_roomlist_pending, yrl);
-
-}
-
-static void yahoo_roomlist_got_connected(gpointer data, gint source, const gchar *error_message)
-{
- struct yahoo_roomlist *yrl = data;
PurpleRoomlist *list = yrl->list;
PurpleAccount *account = purple_roomlist_get_account(list);
PurpleConnection *pc = purple_account_get_connection(account);
YahooData *yd = purple_connection_get_protocol_data(pc);
+ PurpleHttpRequest *req;
+ PurpleHttpCookieJar *cjar;
+ PurpleConnection *gc;
- if (source < 0) {
- purple_notify_error(pc, NULL, _("Unable to connect"), _("Fetching the room list failed."));
- yahoo_roomlist_cleanup(list, yrl);
- return;
- }
+ gc = purple_account_get_connection(purple_roomlist_get_account(
+ yrl->list));
- yrl->fd = source;
+ req = purple_http_request_new(yrl->url);
+ cjar = purple_http_request_get_cookie_jar(req);
+ purple_http_cookie_jar_set(cjar, "Y", yd->cookie_y);
+ purple_http_cookie_jar_set(cjar, "T", yd->cookie_t);
- yrl->txbuf = g_strdup_printf(
- "GET http://%s/%s HTTP/1.0\r\n"
- "Host: %s\r\n"
- "Cookie: Y=%s; T=%s\r\n\r\n",
- yrl->host, yrl->path, yrl->host, yd->cookie_y,
- yd->cookie_t);
-
-
- yrl->inpa = purple_input_add(yrl->fd, PURPLE_INPUT_WRITE,
- yahoo_roomlist_send_cb, yrl);
- yahoo_roomlist_send_cb(yrl, yrl->fd, PURPLE_INPUT_WRITE);
+ yrl->hc = purple_http_request(gc, req, yahoo_roomlist_got, yrl);
+ purple_http_request_unref(req);
}
PurpleRoomlist *yahoo_roomlist_get_list(PurpleConnection *gc)
@@ -1502,7 +1432,6 @@ PurpleRoomlist *yahoo_roomlist_get_list(
PurpleAccount *account;
PurpleRoomlist *rl;
PurpleRoomlistField *f;
- PurpleHttpURL *url_p;
GList *fields = NULL;
struct yahoo_roomlist *yrl;
const char *rll, *rlurl;
@@ -1527,15 +1456,7 @@ PurpleRoomlist *yahoo_roomlist_get_list(
rl = purple_roomlist_new(account);
yrl->list = rl;
- url_p = purple_http_url_parse(url);
- g_free(url);
- if (!url_p) {
- purple_debug_error("yahoo", "Couldn't parse URL\n");
- return NULL;
- }
- yrl->host = g_strdup(purple_http_url_get_host(url_p));
- yrl->path = g_strdup(purple_http_url_get_path(url_p));
- purple_http_url_free(url_p);
+ yrl->url = url;
f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, "", "room", TRUE);
fields = g_list_append(fields, f);
@@ -1557,19 +1478,13 @@ PurpleRoomlist *yahoo_roomlist_get_list(
purple_roomlist_set_fields(rl, fields);
- if (purple_proxy_connect(gc, account, yrl->host, 80,
- yahoo_roomlist_got_connected, yrl) == NULL)
- {
- purple_notify_error(gc, NULL, _("Connection problem"), _("Unable to fetch room list."));
- yahoo_roomlist_cleanup(rl, yrl);
- return NULL;
- }
-
proto_data = purple_roomlist_get_proto_data(rl);
proto_data = g_list_append(proto_data, yrl);
purple_roomlist_set_proto_data(rl, proto_data);
+ yahoo_roomlist_make_request(yrl);
purple_roomlist_set_in_progress(rl, TRUE);
+
return rl;
}
@@ -1592,7 +1507,6 @@ void yahoo_roomlist_cancel(PurpleRoomlis
void yahoo_roomlist_expand_category(PurpleRoomlist *list, PurpleRoomlistRoom *category)
{
PurpleAccount *account;
- PurpleHttpURL *url_p;
struct yahoo_roomlist *yrl;
char *url;
char *id;
@@ -1629,30 +1543,12 @@ void yahoo_roomlist_expand_category(Purp
proto_data = g_list_append(proto_data, yrl);
purple_roomlist_set_proto_data(list, proto_data);
- url_p = purple_http_url_parse(url);
- g_free(url);
- if (!url_p) {
- purple_debug_error("yahoo", "Couldn't parse URL\n");
- return;
- }
- yrl->host = g_strdup(purple_http_url_get_host(url_p));
- yrl->path = g_strdup(purple_http_url_get_path(url_p));
- purple_http_url_free(url_p);
+ yrl->url = url;
yrl->ucat = purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_CATEGORY, _("User Rooms"), yrl->cat);
purple_roomlist_room_add(list, yrl->ucat);
- if (purple_proxy_connect(purple_account_get_connection(account),
- account, yrl->host, 80,
- yahoo_roomlist_got_connected, yrl) == NULL)
- {
- purple_notify_error(purple_account_get_connection(account),
- NULL, _("Connection problem"), _("Unable to fetch room list."));
- purple_roomlist_ref(list);
- yahoo_roomlist_cleanup(list, yrl);
- return;
- }
-
+ yahoo_roomlist_make_request(yrl);
purple_roomlist_set_in_progress(list, TRUE);
purple_roomlist_ref(list);
}
More information about the Commits
mailing list