libpurple/upnp.c

Wed, 06 Feb 2008 18:06:44 +0000

author
John Bailey <rekkanoryo@rekkanoryo.org>
date
Wed, 06 Feb 2008 18:06:44 +0000
branch
cpw.rekkanoryo.yahoop15ft
changeset 22401
5fe1761a4a15
parent 22104
56970903b8e9
child 24011
0cff24bf7dba
permissions
-rw-r--r--

Simplified version of the newest patch on #4533 to not try Yahoo protocol
version 15 file transfer on Yahoo Japan.

11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1 /**
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
2 * @file upnp.c UPnP Implementation
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
3 * @ingroup core
20330
650a7af9c238 remove gpl boilerplate from doxygen docs
Sean Egan <seanegan@pidgin.im>
parents: 19859
diff changeset
4 */
650a7af9c238 remove gpl boilerplate from doxygen docs
Sean Egan <seanegan@pidgin.im>
parents: 19859
diff changeset
5
650a7af9c238 remove gpl boilerplate from doxygen docs
Sean Egan <seanegan@pidgin.im>
parents: 19859
diff changeset
6 /* purple
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
7 *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
8 * Purple is the legal property of its developers, whose names are too numerous
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
9 * to list here. Please refer to the COPYRIGHT file distributed with this
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
10 * source distribution.
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
11 *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
12 * This program is free software; you can redistribute it and/or modify
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
13 * it under the terms of the GNU General Public License as published by
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
14 * the Free Software Foundation; either version 2 of the License, or
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
15 * (at your option) any later version.
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
16 *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
17 * This program is distributed in the hope that it will be useful,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
20 * GNU General Public License for more details.
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
21 *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
22 * You should have received a copy of the GNU General Public License
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
23 * along with this program; if not, write to the Free Software
19859
71d37b57eff2 The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 16035
diff changeset
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
25 */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
26 #include "internal.h"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
27
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
28 #include "upnp.h"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
29
16035
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
30 #include "debug.h"
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
31 #include "eventloop.h"
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
32 #include "network.h"
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
33 #include "proxy.h"
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
34 #include "signals.h"
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
35 #include "util.h"
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
36 #include "xmlnode.h"
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
37
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
38 /***************************************************************
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
39 ** General Defines *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
40 ****************************************************************/
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
41 #define HTTP_OK "200 OK"
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
42 #define DEFAULT_HTTP_PORT 80
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
43 #define DISCOVERY_TIMEOUT 1000
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
44
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
45 /***************************************************************
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
46 ** Discovery/Description Defines *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
47 ****************************************************************/
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
48 #define NUM_UDP_ATTEMPTS 2
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
49
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
50 /* Address and port of an SSDP request used for discovery */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
51 #define HTTPMU_HOST_ADDRESS "239.255.255.250"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
52 #define HTTPMU_HOST_PORT 1900
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
53
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
54 #define SEARCH_REQUEST_DEVICE "urn:schemas-upnp-org:service:%s"
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
55
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
56 #define SEARCH_REQUEST_STRING \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
57 "M-SEARCH * HTTP/1.1\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
58 "MX: 2\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
59 "HOST: 239.255.255.250:1900\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
60 "MAN: \"ssdp:discover\"\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
61 "ST: urn:schemas-upnp-org:service:%s\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
62 "\r\n"
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
63
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
64 #define WAN_IP_CONN_SERVICE "WANIPConnection:1"
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
65 #define WAN_PPP_CONN_SERVICE "WANPPPConnection:1"
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
66
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
67 /******************************************************************
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
68 ** Action Defines *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
69 *******************************************************************/
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
70 #define HTTP_HEADER_ACTION \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
71 "POST /%s HTTP/1.1\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
72 "HOST: %s:%d\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
73 "SOAPACTION: \"urn:schemas-upnp-org:service:%s#%s\"\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
74 "CONTENT-TYPE: text/xml ; charset=\"utf-8\"\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
75 "CONTENT-LENGTH: %" G_GSIZE_FORMAT "\r\n\r\n"
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
76
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
77 #define SOAP_ACTION \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
78 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
79 "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" " \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
80 "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
81 "<s:Body>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
82 "<u:%s xmlns:u=\"urn:schemas-upnp-org:service:%s\">\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
83 "%s" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
84 "</u:%s>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
85 "</s:Body>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
86 "</s:Envelope>"
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
87
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
88 #define PORT_MAPPING_LEASE_TIME "0"
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
89 #define PORT_MAPPING_DESCRIPTION "PURPLE_UPNP_PORT_FORWARD"
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
90
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
91 #define ADD_PORT_MAPPING_PARAMS \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
92 "<NewRemoteHost></NewRemoteHost>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
93 "<NewExternalPort>%i</NewExternalPort>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
94 "<NewProtocol>%s</NewProtocol>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
95 "<NewInternalPort>%i</NewInternalPort>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
96 "<NewInternalClient>%s</NewInternalClient>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
97 "<NewEnabled>1</NewEnabled>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
98 "<NewPortMappingDescription>" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
99 PORT_MAPPING_DESCRIPTION \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
100 "</NewPortMappingDescription>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
101 "<NewLeaseDuration>" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
102 PORT_MAPPING_LEASE_TIME \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
103 "</NewLeaseDuration>\r\n"
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
104
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
105 #define DELETE_PORT_MAPPING_PARAMS \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
106 "<NewRemoteHost></NewRemoteHost>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
107 "<NewExternalPort>%i</NewExternalPort>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
108 "<NewProtocol>%s</NewProtocol>\r\n"
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
109
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
110 typedef enum {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
111 PURPLE_UPNP_STATUS_UNDISCOVERED = -1,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
112 PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
113 PURPLE_UPNP_STATUS_DISCOVERING,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
114 PURPLE_UPNP_STATUS_DISCOVERED
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
115 } PurpleUPnPStatus;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
116
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
117 typedef struct {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
118 PurpleUPnPStatus status;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
119 gchar* control_url;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
120 gchar service_type[20];
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
121 char publicip[16];
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
122 char internalip[16];
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
123 time_t lookup_time;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
124 } PurpleUPnPControlInfo;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
125
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
126 typedef struct {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
127 guint inpa; /* purple_input_add handle */
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
128 guint tima; /* purple_timeout_add handle */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
129 int fd;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
130 struct sockaddr_in server;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
131 gchar service_type[25];
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
132 int retry_count;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
133 gchar *full_url;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
134 } UPnPDiscoveryData;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
135
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
136 struct _UPnPMappingAddRemove
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
137 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
138 unsigned short portmap;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
139 gchar protocol[4];
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
140 gboolean add;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
141 PurpleUPnPCallback cb;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
142 gpointer cb_data;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
143 guint tima; /* purple_timeout_add handle */
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
144 PurpleUtilFetchUrlData *gfud;
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
145 };
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
146
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
147 static PurpleUPnPControlInfo control_info = {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
148 PURPLE_UPNP_STATUS_UNDISCOVERED,
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
149 NULL, "\0", "\0", "\0", 0};
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
150
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
151 static GSList *discovery_callbacks = NULL;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
152
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
153 static void purple_upnp_discover_send_broadcast(UPnPDiscoveryData *dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
154 static void lookup_public_ip(void);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
155 static void lookup_internal_ip(void);
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
156
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
157 static void
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
158 fire_discovery_callbacks(gboolean success)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
159 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
160 while(discovery_callbacks) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
161 gpointer data;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
162 PurpleUPnPCallback cb = discovery_callbacks->data;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
163 discovery_callbacks = g_slist_remove(discovery_callbacks, cb);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
164 data = discovery_callbacks->data;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
165 discovery_callbacks = g_slist_remove(discovery_callbacks, data);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
166 cb(success, data);
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
167 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
168 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
169
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
170 static gboolean
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
171 purple_upnp_compare_device(const xmlnode* device, const gchar* deviceType)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
172 {
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
173 xmlnode* deviceTypeNode = xmlnode_get_child(device, "deviceType");
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
174 char *tmp;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
175 gboolean ret;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
176
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
177 if(deviceTypeNode == NULL) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
178 return FALSE;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
179 }
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
180
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
181 tmp = xmlnode_get_data(deviceTypeNode);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
182 ret = !g_ascii_strcasecmp(tmp, deviceType);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
183 g_free(tmp);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
184
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
185 return ret;
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
186 }
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
187
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
188 static gboolean
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
189 purple_upnp_compare_service(const xmlnode* service, const gchar* serviceType)
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
190 {
13793
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
191 xmlnode* serviceTypeNode;
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
192 char *tmp;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
193 gboolean ret;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
194
13793
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
195 if(service == NULL) {
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
196 return FALSE;
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
197 }
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
198
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
199 serviceTypeNode = xmlnode_get_child(service, "serviceType");
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
200
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
201 if(serviceTypeNode == NULL) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
202 return FALSE;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
203 }
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
204
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
205 tmp = xmlnode_get_data(serviceTypeNode);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
206 ret = !g_ascii_strcasecmp(tmp, serviceType);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
207 g_free(tmp);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
208
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
209 return ret;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
210 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
211
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
212 static gchar*
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
213 purple_upnp_parse_description_response(const gchar* httpResponse, gsize len,
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
214 const gchar* httpURL, const gchar* serviceType)
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
215 {
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
216 gchar *xmlRoot, *baseURL, *controlURL, *service;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
217 xmlnode *xmlRootNode, *serviceTypeNode, *controlURLNode, *baseURLNode;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
218 char *tmp;
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
219
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
220 /* make sure we have a valid http response */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
221 if(g_strstr_len(httpResponse, len, HTTP_OK) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
222 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
223 "parse_description_response(): Failed In HTTP_OK\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
224 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
225 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
226
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
227 /* find the root of the xml document */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
228 if((xmlRoot = g_strstr_len(httpResponse, len, "<root")) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
229 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
230 "parse_description_response(): Failed finding root\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
231 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
232 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
233
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
234 /* create the xml root node */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
235 if((xmlRootNode = xmlnode_from_str(xmlRoot,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
236 len - (xmlRoot - httpResponse))) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
237 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
238 "parse_description_response(): Could not parse xml root node\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
239 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
240 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
241
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
242 /* get the baseURL of the device */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
243 if((baseURLNode = xmlnode_get_child(xmlRootNode, "URLBase")) != NULL) {
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
244 baseURL = xmlnode_get_data(baseURLNode);
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
245 } else {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
246 baseURL = g_strdup(httpURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
247 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
248
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
249 /* get the serviceType child that has the service type as its data */
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
250
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
251 /* get urn:schemas-upnp-org:device:InternetGatewayDevice:1 and its devicelist */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
252 serviceTypeNode = xmlnode_get_child(xmlRootNode, "device");
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
253 while(!purple_upnp_compare_device(serviceTypeNode,
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
254 "urn:schemas-upnp-org:device:InternetGatewayDevice:1") &&
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
255 serviceTypeNode != NULL) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
256 serviceTypeNode = xmlnode_get_next_twin(serviceTypeNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
257 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
258 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
259 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
260 "parse_description_response(): could not get serviceTypeNode 1\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
261 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
262 xmlnode_free(xmlRootNode);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
263 return NULL;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
264 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
265 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "deviceList");
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
266 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
267 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
268 "parse_description_response(): could not get serviceTypeNode 2\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
269 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
270 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
271 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
272 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
273
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
274 /* get urn:schemas-upnp-org:device:WANDevice:1 and its devicelist */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
275 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "device");
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
276 while(!purple_upnp_compare_device(serviceTypeNode,
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
277 "urn:schemas-upnp-org:device:WANDevice:1") &&
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
278 serviceTypeNode != NULL) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
279 serviceTypeNode = xmlnode_get_next_twin(serviceTypeNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
280 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
281 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
282 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
283 "parse_description_response(): could not get serviceTypeNode 3\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
284 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
285 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
286 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
287 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
288 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "deviceList");
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
289 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
290 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
291 "parse_description_response(): could not get serviceTypeNode 4\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
292 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
293 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
294 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
295 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
296
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
297 /* get urn:schemas-upnp-org:device:WANConnectionDevice:1 and its servicelist */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
298 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "device");
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
299 while(serviceTypeNode && !purple_upnp_compare_device(serviceTypeNode,
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
300 "urn:schemas-upnp-org:device:WANConnectionDevice:1")) {
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
301 serviceTypeNode = xmlnode_get_next_twin(serviceTypeNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
302 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
303 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
304 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
305 "parse_description_response(): could not get serviceTypeNode 5\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
306 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
307 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
308 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
309 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
310 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "serviceList");
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
311 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
312 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
313 "parse_description_response(): could not get serviceTypeNode 6\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
314 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
315 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
316 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
317 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
318
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
319 /* get the serviceType variable passed to this function */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
320 service = g_strdup_printf(SEARCH_REQUEST_DEVICE, serviceType);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
321 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "service");
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
322 while(!purple_upnp_compare_service(serviceTypeNode, service) &&
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
323 serviceTypeNode != NULL) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
324 serviceTypeNode = xmlnode_get_next_twin(serviceTypeNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
325 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
326
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
327 g_free(service);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
328 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
329 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
330 "parse_description_response(): could not get serviceTypeNode 7\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
331 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
332 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
333 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
334 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
335
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
336 /* get the controlURL of the service */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
337 if((controlURLNode = xmlnode_get_child(serviceTypeNode,
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
338 "controlURL")) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
339 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
340 "parse_description_response(): Could not find controlURL\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
341 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
342 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
343 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
344 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
345
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
346 tmp = xmlnode_get_data(controlURLNode);
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
347 if(baseURL && !purple_str_has_prefix(tmp, "http://") &&
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
348 !purple_str_has_prefix(tmp, "HTTP://")) {
15348
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
349 /* Handle absolute paths in a relative URL. This probably
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
350 * belongs in util.c. */
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
351 if (tmp[0] == '/') {
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
352 size_t length;
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
353 const char *path, *start = strstr(baseURL, "://");
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
354 start = start ? start + 3 : baseURL;
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
355 path = strchr(start, '/');
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
356 length = path ? path - baseURL : strlen(baseURL);
15683
9421e229cb97 Minor warning fix
Mark Doliner <markdoliner@pidgin.im>
parents: 15502
diff changeset
357 controlURL = g_strdup_printf("%.*s%s", (int)length, baseURL, tmp);
15348
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
358 } else {
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
359 controlURL = g_strdup_printf("%s%s", baseURL, tmp);
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
360 }
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
361 g_free(tmp);
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
362 }else{
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
363 controlURL = tmp;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
364 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
365 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
366 xmlnode_free(xmlRootNode);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
367
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
368 return controlURL;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
369 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
370
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
371 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
372 upnp_parse_description_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data,
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
373 const gchar *httpResponse, gsize len, const gchar *error_message)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
374 {
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
375 UPnPDiscoveryData *dd = user_data;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
376 gchar *control_url = NULL;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
377
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
378 if (len > 0)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
379 control_url = purple_upnp_parse_description_response(
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
380 httpResponse, len, dd->full_url, dd->service_type);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
381
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
382 g_free(dd->full_url);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
383
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
384 if(control_url == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
385 purple_debug_error("upnp",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
386 "purple_upnp_parse_description(): control URL is NULL\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
387 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
388
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
389 control_info.status = control_url ? PURPLE_UPNP_STATUS_DISCOVERED
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
390 : PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
391 control_info.lookup_time = time(NULL);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
392 control_info.control_url = control_url;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
393 strncpy(control_info.service_type, dd->service_type,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
394 sizeof(control_info.service_type));
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
395
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
396 fire_discovery_callbacks(control_url != NULL);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
397
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
398 /* Look up the public and internal IPs */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
399 if(control_url != NULL) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
400 lookup_public_ip();
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
401 lookup_internal_ip();
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
402 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
403
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
404 g_free(dd);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
405 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
406
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
407 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
408 purple_upnp_parse_description(const gchar* descriptionURL, UPnPDiscoveryData *dd)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
409 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
410 gchar* httpRequest;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
411 gchar* descriptionXMLAddress;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
412 gchar* descriptionAddress;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
413 int port = 0;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
414
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
415 /* parse the 4 above variables out of the descriptionURL
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
416 example description URL: http://192.168.1.1:5678/rootDesc.xml */
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
417
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
418 /* parse the url into address, port, path variables */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
419 if(!purple_url_parse(descriptionURL, &descriptionAddress,
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
420 &port, &descriptionXMLAddress, NULL, NULL)) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
421 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
422 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
423 if(port == 0 || port == -1) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
424 port = DEFAULT_HTTP_PORT;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
425 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
426
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
427 /* for example...
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
428 GET /rootDesc.xml HTTP/1.1\r\nHost: 192.168.1.1:5678\r\n\r\n */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
429 httpRequest = g_strdup_printf(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
430 "GET /%s HTTP/1.1\r\n"
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
431 "Connection: close\r\n"
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
432 "Host: %s:%d\r\n\r\n",
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
433 descriptionXMLAddress, descriptionAddress, port);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
434
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
435 g_free(descriptionXMLAddress);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
436
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
437 dd->full_url = g_strdup_printf("http://%s:%d",
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
438 descriptionAddress, port);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13097
diff changeset
439 g_free(descriptionAddress);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
440
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
441 /* Remove the timeout because everything it is waiting for has
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
442 * successfully completed */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
443 purple_timeout_remove(dd->tima);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
444 dd->tima = 0;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
445
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
446 purple_util_fetch_url_request(descriptionURL, TRUE, NULL, TRUE, httpRequest,
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
447 TRUE, upnp_parse_description_cb, dd);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
448
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
449 g_free(httpRequest);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
450
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
451 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
452
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
453 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
454 purple_upnp_parse_discover_response(const gchar* buf, unsigned int buf_len,
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
455 UPnPDiscoveryData *dd)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
456 {
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
457 gchar* startDescURL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
458 gchar* endDescURL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
459 gchar* descURL;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
460
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
461 if(g_strstr_len(buf, buf_len, HTTP_OK) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
462 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
463 "parse_discover_response(): Failed In HTTP_OK\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
464 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
465 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
466
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
467 if((startDescURL = g_strstr_len(buf, buf_len, "http://")) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
468 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
469 "parse_discover_response(): Failed In finding http://\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
470 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
471 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
472
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
473 endDescURL = g_strstr_len(startDescURL, buf_len - (startDescURL - buf),
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
474 "\r");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
475 if(endDescURL == NULL) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
476 endDescURL = g_strstr_len(startDescURL,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
477 buf_len - (startDescURL - buf), "\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
478 if(endDescURL == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
479 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
480 "parse_discover_response(): Failed In endDescURL\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
481 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
482 }
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
483 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
484
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
485 /* XXX: I'm not sure how this could ever happen */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
486 if(endDescURL == startDescURL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
487 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
488 "parse_discover_response(): endDescURL == startDescURL\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
489 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
490 }
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
491
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
492 descURL = g_strndup(startDescURL, endDescURL - startDescURL);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
493
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
494 purple_upnp_parse_description(descURL, dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
495
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
496 g_free(descURL);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
497
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
498 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
499
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
500 static gboolean
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
501 purple_upnp_discover_timeout(gpointer data)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
502 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
503 UPnPDiscoveryData* dd = data;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
504
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
505 if (dd->inpa)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
506 purple_input_remove(dd->inpa);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
507 dd->inpa = 0;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
508 dd->tima = 0;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
509
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
510 if (dd->retry_count < NUM_UDP_ATTEMPTS) {
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
511 /* TODO: We probably shouldn't be incrementing retry_count in two places */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
512 dd->retry_count++;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
513 purple_upnp_discover_send_broadcast(dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
514 } else {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
515 if (dd->fd)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
516 close(dd->fd);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
517
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
518 control_info.status = PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
519 control_info.lookup_time = time(NULL);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
520 control_info.service_type[0] = '\0';
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
521 g_free(control_info.control_url);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
522 control_info.control_url = NULL;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
523
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
524 fire_discovery_callbacks(FALSE);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
525
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
526 g_free(dd);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
527 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
528
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
529 return FALSE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
530 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
531
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
532 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
533 purple_upnp_discover_udp_read(gpointer data, gint sock, PurpleInputCondition cond)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
534 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
535 int len;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
536 UPnPDiscoveryData *dd = data;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
537 gchar buf[65536];
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
538
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
539 do {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
540 len = recv(dd->fd, buf,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
541 sizeof(buf) - 1, 0);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
542
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
543 if(len > 0) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
544 buf[len] = '\0';
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
545 break;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
546 } else if(errno != EINTR) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
547 /* We'll either get called again, or time out */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
548 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
549 }
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
550 } while (errno == EINTR);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
551
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
552 purple_input_remove(dd->inpa);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
553 dd->inpa = 0;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
554
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
555 close(dd->fd);
20636
1a34ffdcd8bb Reset file descriptors to -1 instead of 0. This should fix some weird unexpected
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 20330
diff changeset
556 dd->fd = -1;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
557
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
558 /* parse the response, and see if it was a success */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
559 purple_upnp_parse_discover_response(buf, len, dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
560
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
561 /* We'll either time out or continue successfully */
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
562 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
563
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
564 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
565 purple_upnp_discover_send_broadcast(UPnPDiscoveryData *dd)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
566 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
567 gchar *sendMessage = NULL;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
568 gsize totalSize;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
569 gboolean sentSuccess;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
570
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
571 /* because we are sending over UDP, if there is a failure
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
572 we should retry the send NUM_UDP_ATTEMPTS times. Also,
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
573 try different requests for WANIPConnection and WANPPPConnection*/
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
574 for(; dd->retry_count < NUM_UDP_ATTEMPTS; dd->retry_count++) {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13097
diff changeset
575 sentSuccess = FALSE;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
576
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
577 if((dd->retry_count % 2) == 0) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
578 strncpy(dd->service_type, WAN_IP_CONN_SERVICE, sizeof(dd->service_type));
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
579 } else {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
580 strncpy(dd->service_type, WAN_PPP_CONN_SERVICE, sizeof(dd->service_type));
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
581 }
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
582
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
583 sendMessage = g_strdup_printf(SEARCH_REQUEST_STRING, dd->service_type);
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
584
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
585 totalSize = strlen(sendMessage);
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
586
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
587 do {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
588 if(sendto(dd->fd, sendMessage, totalSize, 0,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
589 (struct sockaddr*) &(dd->server),
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
590 sizeof(struct sockaddr_in)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
591 ) == totalSize) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
592 sentSuccess = TRUE;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
593 break;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
594 }
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13097
diff changeset
595 } while (errno == EINTR || errno == EAGAIN);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
596
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
597 g_free(sendMessage);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
598
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
599 if(sentSuccess) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
600 dd->tima = purple_timeout_add(DISCOVERY_TIMEOUT,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
601 purple_upnp_discover_timeout, dd);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
602 dd->inpa = purple_input_add(dd->fd, PURPLE_INPUT_READ,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
603 purple_upnp_discover_udp_read, dd);
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
604
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
605 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
606 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
607 }
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
608
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
609 /* We have already done all our retries. Make sure that the callback
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
610 * doesn't get called before the original function returns */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
611 purple_timeout_add(10, purple_upnp_discover_timeout, dd);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
612 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
613
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
614 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
615 purple_upnp_discover(PurpleUPnPCallback cb, gpointer cb_data)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
616 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
617 /* Socket Setup Variables */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
618 int sock;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
619 struct hostent* hp;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
620
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
621 /* UDP RECEIVE VARIABLES */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
622 UPnPDiscoveryData *dd;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
623
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
624 if (control_info.status == PURPLE_UPNP_STATUS_DISCOVERING) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
625 if (cb) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
626 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
627 discovery_callbacks, cb);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
628 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
629 discovery_callbacks, cb_data);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
630 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
631 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
632 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
633
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
634 dd = g_new0(UPnPDiscoveryData, 1);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
635 if (cb) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
636 discovery_callbacks = g_slist_append(discovery_callbacks, cb);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
637 discovery_callbacks = g_slist_append(discovery_callbacks,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
638 cb_data);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
639 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
640
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
641 /* Set up the sockets */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
642 sock = socket(AF_INET, SOCK_DGRAM, 0);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
643 if(sock == -1) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
644 purple_debug_error("upnp",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
645 "purple_upnp_discover(): Failed In sock creation\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
646 /* Short circuit the retry attempts */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
647 dd->retry_count = NUM_UDP_ATTEMPTS;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
648 purple_timeout_add(10, purple_upnp_discover_timeout, dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
649 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
650 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
651
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
652 dd->fd = sock;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
653
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
654 /* TODO: Non-blocking! */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
655 if((hp = gethostbyname(HTTPMU_HOST_ADDRESS)) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
656 purple_debug_error("upnp",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
657 "purple_upnp_discover(): Failed In gethostbyname\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
658 /* Short circuit the retry attempts */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
659 dd->retry_count = NUM_UDP_ATTEMPTS;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
660 purple_timeout_add(10, purple_upnp_discover_timeout, dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
661 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
662 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
663
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
664 memset(&(dd->server), 0, sizeof(struct sockaddr));
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
665 dd->server.sin_family = AF_INET;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
666 memcpy(&(dd->server.sin_addr), hp->h_addr_list[0], hp->h_length);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
667 dd->server.sin_port = htons(HTTPMU_HOST_PORT);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
668
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
669 control_info.status = PURPLE_UPNP_STATUS_DISCOVERING;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
670
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
671 purple_upnp_discover_send_broadcast(dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
672 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
673
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
674 static PurpleUtilFetchUrlData*
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
675 purple_upnp_generate_action_message_and_send(const gchar* actionName,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
676 const gchar* actionParams, PurpleUtilFetchUrlCallback cb,
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
677 gpointer cb_data)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
678 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
679 PurpleUtilFetchUrlData* gfud;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
680 gchar* soapMessage;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
681 gchar* totalSendMessage;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
682 gchar* pathOfControl;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
683 gchar* addressOfControl;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
684 int port = 0;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
685
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
686 /* parse the url into address, port, path variables */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
687 if(!purple_url_parse(control_info.control_url, &addressOfControl,
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
688 &port, &pathOfControl, NULL, NULL)) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
689 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
690 "generate_action_message_and_send(): Failed In Parse URL\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
691 /* XXX: This should probably be async */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
692 if(cb)
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
693 cb(NULL, cb_data, NULL, 0, NULL);
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
694 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
695 if(port == 0 || port == -1) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
696 port = DEFAULT_HTTP_PORT;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
697 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
698
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
699 /* set the soap message */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
700 soapMessage = g_strdup_printf(SOAP_ACTION, actionName,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
701 control_info.service_type, actionParams, actionName);
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
702
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
703 /* set the HTTP Header, and append the body to it */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
704 totalSendMessage = g_strdup_printf(HTTP_HEADER_ACTION "%s",
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
705 pathOfControl, addressOfControl, port,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
706 control_info.service_type, actionName,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
707 strlen(soapMessage), soapMessage);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
708 g_free(pathOfControl);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
709 g_free(soapMessage);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
710
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
711 gfud = purple_util_fetch_url_request(control_info.control_url, FALSE, NULL, TRUE,
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
712 totalSendMessage, TRUE, cb, cb_data);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
713
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
714 g_free(totalSendMessage);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
715 g_free(addressOfControl);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
716
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
717 return gfud;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
718 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
719
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
720 const gchar *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
721 purple_upnp_get_public_ip()
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
722 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
723 if (control_info.status == PURPLE_UPNP_STATUS_DISCOVERED
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
724 && control_info.publicip
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
725 && strlen(control_info.publicip) > 0)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
726 return control_info.publicip;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
727
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
728 /* Trigger another UPnP discovery if 5 minutes have elapsed since the
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
729 * last one, and it wasn't successful */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
730 if (control_info.status < PURPLE_UPNP_STATUS_DISCOVERING
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
731 && (time(NULL) - control_info.lookup_time) > 300)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
732 purple_upnp_discover(NULL, NULL);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
733
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
734 return NULL;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
735 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
736
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
737 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
738 looked_up_public_ip_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data,
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
739 const gchar *httpResponse, gsize len, const gchar *error_message)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
740 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
741 gchar* temp, *temp2;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
742
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
743 if ((error_message != NULL) || (httpResponse == NULL))
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
744 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
745
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
746 /* extract the ip, or see if there is an error */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
747 if((temp = g_strstr_len(httpResponse, len,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
748 "<NewExternalIPAddress")) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
749 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
750 "looked_up_public_ip_cb(): Failed Finding <NewExternalIPAddress\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
751 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
752 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
753 if(!(temp = g_strstr_len(temp, len - (temp - httpResponse), ">"))) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
754 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
755 "looked_up_public_ip_cb(): Failed In Finding >\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
756 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
757 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
758 if(!(temp2 = g_strstr_len(temp, len - (temp - httpResponse), "<"))) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
759 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
760 "looked_up_public_ip_cb(): Failed In Finding <\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
761 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
762 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
763 *temp2 = '\0';
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
764
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
765 strncpy(control_info.publicip, temp + 1,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
766 sizeof(control_info.publicip));
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
767
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
768 purple_debug_info("upnp", "NAT Returned IP: %s\n", control_info.publicip);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
769 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
770
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
771 static void
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
772 lookup_public_ip()
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
773 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
774 purple_upnp_generate_action_message_and_send("GetExternalIPAddress", "",
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
775 looked_up_public_ip_cb, NULL);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
776 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
777
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
778 /* TODO: This could be exported */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
779 static const gchar *
22104
56970903b8e9 Probe for -Wstrict-prototypes to get some more warnings. I then cleaned up
Richard Laager <rlaager@pidgin.im>
parents: 20636
diff changeset
780 purple_upnp_get_internal_ip(void)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
781 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
782 if (control_info.status == PURPLE_UPNP_STATUS_DISCOVERED
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
783 && control_info.internalip
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
784 && strlen(control_info.internalip) > 0)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
785 return control_info.internalip;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
786
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
787 /* Trigger another UPnP discovery if 5 minutes have elapsed since the
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
788 * last one, and it wasn't successful */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
789 if (control_info.status < PURPLE_UPNP_STATUS_DISCOVERING
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
790 && (time(NULL) - control_info.lookup_time) > 300)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
791 purple_upnp_discover(NULL, NULL);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
792
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
793 return NULL;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
794 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
795
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
796 static void
14183
bdde840e984c [gaim-migrate @ 16755]
Mark Doliner <markdoliner@pidgin.im>
parents: 14170
diff changeset
797 looked_up_internal_ip_cb(gpointer data, gint source, const gchar *error_message)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
798 {
14151
34427f138b1f [gaim-migrate @ 16712]
Mark Doliner <markdoliner@pidgin.im>
parents: 13793
diff changeset
799 if (source) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
800 strncpy(control_info.internalip,
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
801 purple_network_get_local_system_ip(source),
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
802 sizeof(control_info.internalip));
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
803 purple_debug_info("upnp", "Local IP: %s\n",
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
804 control_info.internalip);
14151
34427f138b1f [gaim-migrate @ 16712]
Mark Doliner <markdoliner@pidgin.im>
parents: 13793
diff changeset
805 close(source);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
806 } else
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
807 purple_debug_info("upnp", "Unable to look up local IP\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
808
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
809 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
810
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
811 static void
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
812 lookup_internal_ip()
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
813 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
814 gchar* addressOfControl;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
815 int port = 0;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
816
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
817 if(!purple_url_parse(control_info.control_url, &addressOfControl, &port,
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
818 NULL, NULL, NULL)) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
819 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
820 "lookup_internal_ip(): Failed In Parse URL\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
821 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
822 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
823 if(port == 0 || port == -1) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
824 port = DEFAULT_HTTP_PORT;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
825 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
826
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
827 if(purple_proxy_connect(NULL, NULL, addressOfControl, port,
14170
f611621bc8a0 [gaim-migrate @ 16742]
Mark Doliner <markdoliner@pidgin.im>
parents: 14151
diff changeset
828 looked_up_internal_ip_cb, NULL) == NULL)
14151
34427f138b1f [gaim-migrate @ 16712]
Mark Doliner <markdoliner@pidgin.im>
parents: 13793
diff changeset
829 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
830 purple_debug_error("upnp", "Get Local IP Connect Failed: Address: %s @@@ Port %d\n",
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
831 addressOfControl, port);
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
832 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
833
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
834 g_free(addressOfControl);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
835 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
836
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
837 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
838 done_port_mapping_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data,
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
839 const gchar *httpResponse, gsize len, const gchar *error_message)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
840 {
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
841 UPnPMappingAddRemove *ar = user_data;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
842
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
843 gboolean success = TRUE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
844
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
845 /* determine if port mapping was a success */
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
846 if ((error_message != NULL) || (httpResponse == NULL) ||
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
847 (g_strstr_len(httpResponse, len, HTTP_OK) == NULL))
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
848 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
849 purple_debug_error("upnp",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
850 "purple_upnp_set_port_mapping(): Failed HTTP_OK\n%s\n",
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
851 httpResponse ? httpResponse : "(null)");
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
852 success = FALSE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
853 } else
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
854 purple_debug_info("upnp", "Successfully completed port mapping operation\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
855
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
856 if (ar->cb)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
857 ar->cb(success, ar->cb_data);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
858 g_free(ar);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
859 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
860
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
861 static void
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
862 do_port_mapping_cb(gboolean has_control_mapping, gpointer data)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
863 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
864 UPnPMappingAddRemove *ar = data;
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
865
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
866 if (has_control_mapping) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
867 gchar action_name[25];
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
868 gchar *action_params;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
869 if(ar->add) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
870 const gchar *internal_ip;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
871 /* get the internal IP */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
872 if(!(internal_ip = purple_upnp_get_internal_ip())) {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
873 purple_debug_error("upnp",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
874 "purple_upnp_set_port_mapping(): couldn't get local ip\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
875 /* UGLY */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
876 if (ar->cb)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
877 ar->cb(FALSE, ar->cb_data);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
878 g_free(ar);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
879 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
880 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
881 strncpy(action_name, "AddPortMapping",
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
882 sizeof(action_name));
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
883 action_params = g_strdup_printf(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
884 ADD_PORT_MAPPING_PARAMS,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
885 ar->portmap, ar->protocol, ar->portmap,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
886 internal_ip);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
887 } else {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
888 strncpy(action_name, "DeletePortMapping", sizeof(action_name));
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
889 action_params = g_strdup_printf(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
890 DELETE_PORT_MAPPING_PARAMS,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
891 ar->portmap, ar->protocol);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
892 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
893
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
894 ar->gfud = purple_upnp_generate_action_message_and_send(action_name,
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
895 action_params, done_port_mapping_cb, ar);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
896
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
897 g_free(action_params);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
898 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
899 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
900
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
901
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
902 if (ar->cb)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
903 ar->cb(FALSE, ar->cb_data);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
904 g_free(ar);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
905 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
906
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
907 static gboolean
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
908 fire_port_mapping_failure_cb(gpointer data)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
909 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
910 do_port_mapping_cb(FALSE, data);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
911 return FALSE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
912 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
913
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
914 void purple_upnp_cancel_port_mapping(UPnPMappingAddRemove *ar)
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
915 {
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
916 GSList *l;
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
917
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
918 /* Remove ar from discovery_callbacks if present; it was inserted after a cb.
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
919 * The same cb may be in the list multple times, so be careful to remove the one assocaited with ar. */
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
920 l = discovery_callbacks;
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
921 while (l)
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
922 {
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
923 if (l->next && (l->next->data == ar)) {
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
924 discovery_callbacks = g_slist_delete_link(discovery_callbacks, l->next);
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
925 discovery_callbacks = g_slist_delete_link(discovery_callbacks, l);
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
926 }
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
927
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
928 l = l->next;
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
929 }
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
930
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
931 if (ar->tima > 0)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
932 purple_timeout_remove(ar->tima);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
933
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
934 if (ar->gfud)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
935 purple_util_fetch_url_cancel(ar->gfud);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
936
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
937 g_free(ar);
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
938 }
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
939
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
940 UPnPMappingAddRemove *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
941 purple_upnp_set_port_mapping(unsigned short portmap, const gchar* protocol,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
942 PurpleUPnPCallback cb, gpointer cb_data)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
943 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
944 UPnPMappingAddRemove *ar;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
945
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
946 ar = g_new0(UPnPMappingAddRemove, 1);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
947 ar->cb = cb;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
948 ar->cb_data = cb_data;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
949 ar->add = TRUE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
950 ar->portmap = portmap;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
951 strncpy(ar->protocol, protocol, sizeof(ar->protocol));
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
952
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
953 /* If we're waiting for a discovery, add to the callbacks list */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
954 if(control_info.status == PURPLE_UPNP_STATUS_DISCOVERING) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
955 /* TODO: This will fail because when this cb is triggered,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
956 * the internal IP lookup won't be complete */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
957 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
958 discovery_callbacks, do_port_mapping_cb);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
959 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
960 discovery_callbacks, ar);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
961 return ar;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
962 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
963
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
964 /* If we haven't had a successful UPnP discovery, check if 5 minutes has
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
965 * elapsed since the last try, try again */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
966 if(control_info.status == PURPLE_UPNP_STATUS_UNDISCOVERED ||
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
967 (control_info.status == PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
968 && (time(NULL) - control_info.lookup_time) > 300)) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
969 purple_upnp_discover(do_port_mapping_cb, ar);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
970 return ar;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
971 } else if(control_info.status == PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
972 if (cb) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
973 /* Asynchronously trigger a failed response */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
974 ar->tima = purple_timeout_add(10, fire_port_mapping_failure_cb, ar);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
975 } else {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
976 /* No need to do anything if nobody expects a response*/
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
977 g_free(ar);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
978 ar = NULL;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
979 }
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
980 return ar;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
981 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
982
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
983 do_port_mapping_cb(TRUE, ar);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
984 return ar;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
985 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
986
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
987 UPnPMappingAddRemove *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
988 purple_upnp_remove_port_mapping(unsigned short portmap, const char* protocol,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
989 PurpleUPnPCallback cb, gpointer cb_data)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
990 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
991 UPnPMappingAddRemove *ar;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
992
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
993 ar = g_new0(UPnPMappingAddRemove, 1);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
994 ar->cb = cb;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
995 ar->cb_data = cb_data;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
996 ar->add = FALSE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
997 ar->portmap = portmap;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
998 strncpy(ar->protocol, protocol, sizeof(ar->protocol));
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
999
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1000 /* If we're waiting for a discovery, add to the callbacks list */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1001 if(control_info.status == PURPLE_UPNP_STATUS_DISCOVERING) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1002 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1003 discovery_callbacks, do_port_mapping_cb);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1004 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1005 discovery_callbacks, ar);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
1006 return ar;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1007 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1008
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1009 /* If we haven't had a successful UPnP discovery, check if 5 minutes has
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1010 * elapsed since the last try, try again */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1011 if(control_info.status == PURPLE_UPNP_STATUS_UNDISCOVERED ||
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1012 (control_info.status == PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1013 && (time(NULL) - control_info.lookup_time) > 300)) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1014 purple_upnp_discover(do_port_mapping_cb, ar);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
1015 return ar;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1016 } else if(control_info.status == PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1017 if (cb) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1018 /* Asynchronously trigger a failed response */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1019 ar->tima = purple_timeout_add(10, fire_port_mapping_failure_cb, ar);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1020 } else {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1021 /* No need to do anything if nobody expects a response*/
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1022 g_free(ar);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
1023 ar = NULL;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1024 }
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
1025 return ar;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1026 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1027
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1028 do_port_mapping_cb(TRUE, ar);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
1029 return ar;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1030 }
16035
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1031
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1032 static void
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1033 purple_upnp_network_config_changed_cb(void *data)
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1034 {
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1035 /* Reset the control_info to default values */
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1036 control_info.status = PURPLE_UPNP_STATUS_UNDISCOVERED;
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1037 g_free(control_info.control_url);
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1038 control_info.control_url = NULL;
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1039 control_info.service_type[0] = '\0';
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1040 control_info.publicip[0] = '\0';
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1041 control_info.internalip[0] = '\0';
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1042 control_info.lookup_time = 0;
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1043 }
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1044
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1045 static void*
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1046 purple_upnp_get_handle(void)
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1047 {
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1048 static int handle;
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1049
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1050 return &handle;
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1051 }
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1052
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1053 void
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1054 purple_upnp_init()
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1055 {
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1056 purple_signal_connect(purple_network_get_handle(), "network-configuration-changed",
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1057 purple_upnp_get_handle(), PURPLE_CALLBACK(purple_upnp_network_config_changed_cb),
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1058 GINT_TO_POINTER(0));
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1059 }

mercurial