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)