Mercurial > pidgin.yaz
comparison src/protocols/yahoo/yahoochat.c @ 13200:33bef17125c2
[gaim-migrate @ 15563]
This is the soon-to-be-infamous nonblocking network activity patch that I've been working on. Feel free to yell at me if this makes you unhappy.
committer: Tailor Script <tailor@pidgin.im>
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Thu, 09 Feb 2006 04:17:56 +0000 |
parents | a4ac07e7b077 |
children | aaeb6ea63c56 |
comparison
equal
deleted
inserted
replaced
13199:d8f238864c88 | 13200:33bef17125c2 |
---|---|
1078 } | 1078 } |
1079 | 1079 |
1080 struct yahoo_roomlist { | 1080 struct yahoo_roomlist { |
1081 int fd; | 1081 int fd; |
1082 int inpa; | 1082 int inpa; |
1083 guchar *txbuf; | |
1084 gsize tx_written; | |
1083 guchar *rxqueue; | 1085 guchar *rxqueue; |
1084 int rxlen; | 1086 int rxlen; |
1085 gboolean started; | 1087 gboolean started; |
1086 char *path; | 1088 char *path; |
1087 char *host; | 1089 char *host; |
1093 | 1095 |
1094 static void yahoo_roomlist_destroy(struct yahoo_roomlist *yrl) | 1096 static void yahoo_roomlist_destroy(struct yahoo_roomlist *yrl) |
1095 { | 1097 { |
1096 if (yrl->inpa) | 1098 if (yrl->inpa) |
1097 gaim_input_remove(yrl->inpa); | 1099 gaim_input_remove(yrl->inpa); |
1098 if (yrl->rxqueue) | 1100 g_free(yrl->txbuf); |
1099 g_free(yrl->rxqueue); | 1101 g_free(yrl->rxqueue); |
1100 if (yrl->path) | 1102 g_free(yrl->path); |
1101 g_free(yrl->path); | 1103 g_free(yrl->host); |
1102 if (yrl->host) | |
1103 g_free(yrl->host); | |
1104 if (yrl->parse) | 1104 if (yrl->parse) |
1105 g_markup_parse_context_free(yrl->parse); | 1105 g_markup_parse_context_free(yrl->parse); |
1106 g_free(yrl); | 1106 g_free(yrl); |
1107 } | 1107 } |
1108 | 1108 |
1141 } | 1141 } |
1142 | 1142 |
1143 static void yahoo_chatxml_state_destroy(struct yahoo_chatxml_state *s) | 1143 static void yahoo_chatxml_state_destroy(struct yahoo_chatxml_state *s) |
1144 { | 1144 { |
1145 g_queue_free(s->q); | 1145 g_queue_free(s->q); |
1146 if (s->room.name) | 1146 g_free(s->room.name); |
1147 g_free(s->room.name); | 1147 g_free(s->room.topic); |
1148 if (s->room.topic) | 1148 g_free(s->room.id); |
1149 g_free(s->room.topic); | |
1150 if (s->room.id) | |
1151 g_free(s->room.id); | |
1152 g_free(s); | 1149 g_free(s); |
1153 } | 1150 } |
1154 | 1151 |
1155 static void yahoo_chatlist_start_element(GMarkupParseContext *context, | 1152 static void yahoo_chatlist_start_element(GMarkupParseContext *context, |
1156 const gchar *ename, const gchar **anames, | 1153 const gchar *ename, const gchar **anames, |
1296 guchar *start; | 1293 guchar *start; |
1297 struct yahoo_chatxml_state *s; | 1294 struct yahoo_chatxml_state *s; |
1298 | 1295 |
1299 len = read(yrl->fd, buf, sizeof(buf)); | 1296 len = read(yrl->fd, buf, sizeof(buf)); |
1300 | 1297 |
1298 if (len < 0 && errno == EAGAIN) | |
1299 return; | |
1300 | |
1301 if (len <= 0) { | 1301 if (len <= 0) { |
1302 if (yrl->parse) | 1302 if (yrl->parse) |
1303 g_markup_parse_context_end_parse(yrl->parse, NULL); | 1303 g_markup_parse_context_end_parse(yrl->parse, NULL); |
1304 yahoo_roomlist_cleanup(list, yrl); | 1304 yahoo_roomlist_cleanup(list, yrl); |
1305 return; | 1305 return; |
1336 | 1336 |
1337 static void yahoo_roomlist_got_connected(gpointer data, gint source, GaimInputCondition cond) | 1337 static void yahoo_roomlist_got_connected(gpointer data, gint source, GaimInputCondition cond) |
1338 { | 1338 { |
1339 struct yahoo_roomlist *yrl = data; | 1339 struct yahoo_roomlist *yrl = data; |
1340 GaimRoomlist *list = yrl->list; | 1340 GaimRoomlist *list = yrl->list; |
1341 char *buf, *cookie; | |
1342 struct yahoo_data *yd = gaim_account_get_connection(list->account)->proto_data; | 1341 struct yahoo_data *yd = gaim_account_get_connection(list->account)->proto_data; |
1342 int written, total_len; | |
1343 | 1343 |
1344 if (source < 0) { | 1344 if (source < 0) { |
1345 gaim_notify_error(gaim_account_get_connection(list->account), NULL, _("Unable to connect"), _("Fetching the room list failed.")); | 1345 gaim_notify_error(gaim_account_get_connection(list->account), NULL, _("Unable to connect"), _("Fetching the room list failed.")); |
1346 yahoo_roomlist_cleanup(list, yrl); | 1346 yahoo_roomlist_cleanup(list, yrl); |
1347 return; | 1347 return; |
1348 } | 1348 } |
1349 | 1349 |
1350 yrl->fd = source; | 1350 if (yrl->txbuf == NULL) { |
1351 | 1351 yrl->fd = source; |
1352 cookie = g_strdup_printf("Y=%s; T=%s", yd->cookie_y, yd->cookie_t); | 1352 |
1353 buf = g_strdup_printf("GET http://%s/%s HTTP/1.0\r\nHost: %s\r\nCookie: %s\r\n\r\n", | 1353 yrl->txbuf = g_strdup_printf( |
1354 yrl->host, yrl->path, yrl->host, cookie); | 1354 "GET http://%s/%s HTTP/1.0\r\n" |
1355 write(yrl->fd, buf, strlen(buf)); | 1355 "Host: %s\r\n" |
1356 g_free(cookie); | 1356 "Cookie: Y=%s; T=%s\r\n\r\n", |
1357 g_free(buf); | 1357 yrl->host, yrl->path, yrl->host, yd->cookie_y, |
1358 yrl->inpa = gaim_input_add(yrl->fd, GAIM_INPUT_READ, yahoo_roomlist_pending, yrl); | 1358 yd->cookie_t); |
1359 } | |
1360 | |
1361 total_len = strlen(yrl->txbuf) - yrl->tx_written; | |
1362 written = write(yrl->fd, yrl->txbuf + yrl->tx_written, total_len); | |
1363 | |
1364 if (written < 0 && errno == EAGAIN) | |
1365 written = 0; | |
1366 else if (written <= 0) { | |
1367 if (yrl->inpa) | |
1368 gaim_input_remove(yrl->inpa); | |
1369 yrl->inpa = 0; | |
1370 g_free(yrl->txbuf); | |
1371 yrl->txbuf = NULL; | |
1372 gaim_notify_error(gaim_account_get_connection(list->account), NULL, _("Unable to connect"), _("Fetching the room list failed.")); | |
1373 yahoo_roomlist_cleanup(list, yrl); | |
1374 return; | |
1375 } | |
1376 | |
1377 if (written < total_len) { | |
1378 if (!yrl->inpa) | |
1379 yrl->inpa = gaim_input_add(yrl->fd, | |
1380 GAIM_INPUT_WRITE, yahoo_roomlist_got_connected, | |
1381 yrl); | |
1382 yrl->tx_written += written; | |
1383 return; | |
1384 } | |
1385 | |
1386 g_free(yrl->txbuf); | |
1387 yrl->txbuf = NULL; | |
1388 if (yrl->inpa) | |
1389 gaim_input_remove(yrl->inpa); | |
1390 yrl->inpa = gaim_input_add(yrl->fd, GAIM_INPUT_READ, | |
1391 yahoo_roomlist_pending, yrl); | |
1359 | 1392 |
1360 } | 1393 } |
1361 | 1394 |
1362 GaimRoomlist *yahoo_roomlist_get_list(GaimConnection *gc) | 1395 GaimRoomlist *yahoo_roomlist_get_list(GaimConnection *gc) |
1363 { | 1396 { |