Mercurial > pidgin
comparison libpurple/network.c @ 30578:0accc8adb18a
merge of '2f6318bd834113559a405ec68cdb178f2180b680'
and '64e02b98551e11e093e4649f1516f3aceaa321e2'
author | Elliott Sales de Andrade <qulogic@pidgin.im> |
---|---|
date | Sun, 26 Sep 2010 20:16:15 +0000 |
parents | 47ea27481972 |
children | 18d56b13fe8b |
comparison
equal
deleted
inserted
replaced
30577:7b761c8601f7 | 30578:0accc8adb18a |
---|---|
96 gboolean retry; | 96 gboolean retry; |
97 gboolean adding; | 97 gboolean adding; |
98 PurpleNetworkListenCallback cb; | 98 PurpleNetworkListenCallback cb; |
99 gpointer cb_data; | 99 gpointer cb_data; |
100 UPnPMappingAddRemove *mapping_data; | 100 UPnPMappingAddRemove *mapping_data; |
101 int timer; | |
101 }; | 102 }; |
102 | 103 |
103 #ifdef HAVE_NETWORKMANAGER | 104 #ifdef HAVE_NETWORKMANAGER |
104 static NMState nm_get_network_state(void); | 105 static NMState nm_get_network_state(void); |
105 #endif | 106 #endif |
371 PurpleNetworkListenData *listen_data; | 372 PurpleNetworkListenData *listen_data; |
372 gint *key = g_new(gint, 1); | 373 gint *key = g_new(gint, 1); |
373 gint *value = g_new(gint, 1); | 374 gint *value = g_new(gint, 1); |
374 | 375 |
375 listen_data = data; | 376 listen_data = data; |
377 listen_data->timer = 0; | |
376 | 378 |
377 /* add port mapping to hash table */ | 379 /* add port mapping to hash table */ |
378 *key = purple_network_get_port_from_fd(listen_data->listenfd); | 380 *key = purple_network_get_port_from_fd(listen_data->listenfd); |
379 *value = listen_data->socket_type; | 381 *value = listen_data->socket_type; |
380 g_hash_table_insert(nat_pmp_port_mappings, key, value); | 382 g_hash_table_insert(nat_pmp_port_mappings, key, value); |
502 if (!purple_socket_speaks_ipv4(listenfd) || !listen_map_external || | 504 if (!purple_socket_speaks_ipv4(listenfd) || !listen_map_external || |
503 !purple_prefs_get_bool("/purple/network/map_ports")) | 505 !purple_prefs_get_bool("/purple/network/map_ports")) |
504 { | 506 { |
505 purple_debug_info("network", "Skipping external port mapping.\n"); | 507 purple_debug_info("network", "Skipping external port mapping.\n"); |
506 /* The pmp_map_cb does what we want to do */ | 508 /* The pmp_map_cb does what we want to do */ |
507 purple_timeout_add(0, purple_network_finish_pmp_map_cb, listen_data); | 509 listen_data->timer = purple_timeout_add(0, purple_network_finish_pmp_map_cb, listen_data); |
508 } | 510 } |
509 /* Attempt a NAT-PMP Mapping, which will return immediately */ | 511 /* Attempt a NAT-PMP Mapping, which will return immediately */ |
510 else if (purple_pmp_create_map(((socket_type == SOCK_STREAM) ? PURPLE_PMP_TYPE_TCP : PURPLE_PMP_TYPE_UDP), | 512 else if (purple_pmp_create_map(((socket_type == SOCK_STREAM) ? PURPLE_PMP_TYPE_TCP : PURPLE_PMP_TYPE_UDP), |
511 actual_port, actual_port, PURPLE_PMP_LIFETIME)) | 513 actual_port, actual_port, PURPLE_PMP_LIFETIME)) |
512 { | 514 { |
513 purple_debug_info("network", "Created NAT-PMP mapping on port %i\n", actual_port); | 515 purple_debug_info("network", "Created NAT-PMP mapping on port %i\n", actual_port); |
514 /* We want to return listen_data now, and on the next run loop trigger the cb and destroy listen_data */ | 516 /* We want to return listen_data now, and on the next run loop trigger the cb and destroy listen_data */ |
515 purple_timeout_add(0, purple_network_finish_pmp_map_cb, listen_data); | 517 listen_data->timer = purple_timeout_add(0, purple_network_finish_pmp_map_cb, listen_data); |
516 } | 518 } |
517 else | 519 else |
518 { | 520 { |
519 /* Attempt a UPnP Mapping */ | 521 /* Attempt a UPnP Mapping */ |
520 listen_data->mapping_data = purple_upnp_set_port_mapping( | 522 listen_data->mapping_data = purple_upnp_set_port_mapping( |
581 | 583 |
582 void purple_network_listen_cancel(PurpleNetworkListenData *listen_data) | 584 void purple_network_listen_cancel(PurpleNetworkListenData *listen_data) |
583 { | 585 { |
584 if (listen_data->mapping_data != NULL) | 586 if (listen_data->mapping_data != NULL) |
585 purple_upnp_cancel_port_mapping(listen_data->mapping_data); | 587 purple_upnp_cancel_port_mapping(listen_data->mapping_data); |
588 | |
589 if (listen_data->timer > 0) | |
590 purple_timeout_remove(listen_data->timer); | |
586 | 591 |
587 g_free(listen_data); | 592 g_free(listen_data); |
588 } | 593 } |
589 | 594 |
590 unsigned short | 595 unsigned short |
686 return FALSE; | 691 return FALSE; |
687 } | 692 } |
688 | 693 |
689 static gboolean _print_debug_msg(gpointer data) { | 694 static gboolean _print_debug_msg(gpointer data) { |
690 gchar *msg = data; | 695 gchar *msg = data; |
691 purple_debug_warning("network", msg); | 696 purple_debug_warning("network", "%s", msg); |
692 g_free(msg); | 697 g_free(msg); |
693 return FALSE; | 698 return FALSE; |
694 } | 699 } |
695 | 700 |
696 static gpointer wpurple_network_change_thread(gpointer data) | 701 static gpointer wpurple_network_change_thread(gpointer data) |
1070 int port = purple_network_get_port_from_fd(fd); | 1075 int port = purple_network_get_port_from_fd(fd); |
1071 gint *protocol = g_hash_table_lookup(upnp_port_mappings, &port); | 1076 gint *protocol = g_hash_table_lookup(upnp_port_mappings, &port); |
1072 | 1077 |
1073 if (protocol) { | 1078 if (protocol) { |
1074 purple_network_upnp_mapping_remove(&port, protocol, NULL); | 1079 purple_network_upnp_mapping_remove(&port, protocol, NULL); |
1075 g_hash_table_remove(upnp_port_mappings, protocol); | |
1076 } else { | 1080 } else { |
1077 protocol = g_hash_table_lookup(nat_pmp_port_mappings, &port); | 1081 protocol = g_hash_table_lookup(nat_pmp_port_mappings, &port); |
1078 if (protocol) { | 1082 if (protocol) { |
1079 purple_network_nat_pmp_mapping_remove(&port, protocol, NULL); | 1083 purple_network_nat_pmp_mapping_remove(&port, protocol, NULL); |
1080 g_hash_table_remove(nat_pmp_port_mappings, protocol); | |
1081 } | 1084 } |
1082 } | 1085 } |
1083 } | 1086 } |
1084 | 1087 |
1085 int purple_network_convert_idn_to_ascii(const gchar *in, gchar **out) | 1088 int purple_network_convert_idn_to_ascii(const gchar *in, gchar **out) |