Mercurial > pidgin
comparison libpurple/proxy.c @ 32802:fa666e7f747e
propagate from branch 'im.pidgin.pidgin.2.x.y' (head 55372aac7eca74e2a3121931b867702d2fdfe299)
to branch 'im.pidgin.pidgin' (head 1f233991b11d30d7bd9d1e058e19fe162a9600f3)
author | Elliott Sales de Andrade <qulogic@pidgin.im> |
---|---|
date | Fri, 25 May 2012 19:41:04 +0000 |
parents | 0c2efa69492b 5ae7e1f36b43 |
children | 2c6510167895 |
comparison
equal
deleted
inserted
replaced
32782:90ae6701eaf2 | 32802:fa666e7f747e |
---|---|
67 * This contains alternating length/char* values. The char* | 67 * This contains alternating length/char* values. The char* |
68 * values need to be freed when removed from the linked list. | 68 * values need to be freed when removed from the linked list. |
69 */ | 69 */ |
70 GSList *hosts; | 70 GSList *hosts; |
71 | 71 |
72 PurpleProxyConnectData *child; | |
73 | |
72 /* | 74 /* |
73 * All of the following variables are used when establishing a | 75 * All of the following variables are used when establishing a |
74 * connection through a proxy. | 76 * connection through a proxy. |
75 */ | 77 */ |
76 guchar *write_buffer; | 78 guchar *write_buffer; |
567 * connection was successful then pass in null. | 569 * connection was successful then pass in null. |
568 */ | 570 */ |
569 static void | 571 static void |
570 purple_proxy_connect_data_disconnect(PurpleProxyConnectData *connect_data, const gchar *error_message) | 572 purple_proxy_connect_data_disconnect(PurpleProxyConnectData *connect_data, const gchar *error_message) |
571 { | 573 { |
574 if (connect_data->child != NULL) | |
575 { | |
576 purple_proxy_connect_cancel(connect_data->child); | |
577 connect_data->child = NULL; | |
578 } | |
579 | |
572 if (connect_data->inpa > 0) | 580 if (connect_data->inpa > 0) |
573 { | 581 { |
574 purple_input_remove(connect_data->inpa); | 582 purple_input_remove(connect_data->inpa); |
575 connect_data->inpa = 0; | 583 connect_data->inpa = 0; |
576 } | 584 } |
2413 static void socks5_connected_to_proxy(gpointer data, gint source, | 2421 static void socks5_connected_to_proxy(gpointer data, gint source, |
2414 const gchar *error_message) { | 2422 const gchar *error_message) { |
2415 /* This is the PurpleProxyConnectData for the overall SOCKS5 connection */ | 2423 /* This is the PurpleProxyConnectData for the overall SOCKS5 connection */ |
2416 PurpleProxyConnectData *connect_data = data; | 2424 PurpleProxyConnectData *connect_data = data; |
2417 | 2425 |
2426 purple_debug_error("proxy", "Connect Data is %p\n", connect_data); | |
2427 | |
2418 /* Check that the overall SOCKS5 connection wasn't cancelled while we were | 2428 /* Check that the overall SOCKS5 connection wasn't cancelled while we were |
2419 * connecting to it (we don't have a way of associating the process of | 2429 * connecting to it (we don't have a way of associating the process of |
2420 * connecting to the SOCKS5 server to the overall PurpleProxyConnectData) | 2430 * connecting to the SOCKS5 server to the overall PurpleProxyConnectData) |
2421 */ | 2431 */ |
2422 if (!PURPLE_PROXY_CONNECT_DATA_IS_VALID(connect_data)) | 2432 if (!PURPLE_PROXY_CONNECT_DATA_IS_VALID(connect_data)) { |
2423 return; | 2433 purple_debug_error("proxy", "Data had gone out of scope :(\n"); |
2434 return; | |
2435 } | |
2436 | |
2437 /* Break the link between the two PurpleProxyConnectDatas */ | |
2438 connect_data->child = NULL; | |
2424 | 2439 |
2425 if (error_message != NULL) { | 2440 if (error_message != NULL) { |
2426 purple_debug_error("proxy", "Unable to connect to SOCKS5 host.\n"); | 2441 purple_debug_error("proxy", "Unable to connect to SOCKS5 host.\n"); |
2427 connect_data->connect_cb(connect_data->data, source, error_message); | 2442 connect_data->connect_cb(connect_data->data, source, error_message); |
2428 return; | 2443 return; |
2482 purple_debug_error("proxy", "Unable to initiate connection to account proxy.\n"); | 2497 purple_debug_error("proxy", "Unable to initiate connection to account proxy.\n"); |
2483 purple_proxy_connect_data_destroy(connect_data); | 2498 purple_proxy_connect_data_destroy(connect_data); |
2484 return NULL; | 2499 return NULL; |
2485 } | 2500 } |
2486 | 2501 |
2487 /* The API doesn't really provide us with a way to cancel the specific | 2502 connect_data->child = account_proxy_conn_data; |
2488 * proxy connection attempt (account_proxy_conn_data) when the overall | |
2489 * SOCKS5 connection (connect_data) attempt is cancelled :( | |
2490 */ | |
2491 | 2503 |
2492 handles = g_slist_prepend(handles, connect_data); | 2504 handles = g_slist_prepend(handles, connect_data); |
2493 | 2505 |
2494 return connect_data; | 2506 return connect_data; |
2495 } | 2507 } |
2496 | 2508 |
2497 void | 2509 void |
2498 purple_proxy_connect_cancel(PurpleProxyConnectData *connect_data) | 2510 purple_proxy_connect_cancel(PurpleProxyConnectData *connect_data) |
2499 { | 2511 { |
2512 g_return_if_fail(connect_data != NULL); | |
2513 | |
2500 purple_proxy_connect_data_disconnect(connect_data, NULL); | 2514 purple_proxy_connect_data_disconnect(connect_data, NULL); |
2501 purple_proxy_connect_data_destroy(connect_data); | 2515 purple_proxy_connect_data_destroy(connect_data); |
2502 } | 2516 } |
2503 | 2517 |
2504 void | 2518 void |