Sun, 28 Jan 2007 15:05:23 +0000
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.
|
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 |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
4 | * |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
5 | * gaim |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
6 | * |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
7 | * Gaim is the legal property of its developers, whose names are too numerous |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
8 | * 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
|
9 | * source distribution. |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
10 | * |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
11 | * 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
|
12 | * 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
|
13 | * the Free Software Foundation; either version 2 of the License, or |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
14 | * (at your option) any later version. |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
15 | * |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
16 | * 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
|
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
19 | * GNU General Public License for more details. |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
20 | * |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
21 | * 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
|
22 | * along with this program; if not, write to the Free Software |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
24 | */ |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
25 | #include "internal.h" |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
26 | |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
27 | #include "debug.h" |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
28 | #include "util.h" |
|
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
29 | #include "proxy.h" |
|
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
30 | #include "xmlnode.h" |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
31 | #include "network.h" |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
32 | #include "eventloop.h" |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
33 | #include "upnp.h" |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
34 | |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
35 | |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
36 | /*************************************************************** |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
37 | ** General Defines * |
|
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 | #define HTTP_OK "200 OK" |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
40 | #define DEFAULT_HTTP_PORT 80 |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
41 | #define DISCOVERY_TIMEOUT 1000 |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
42 | |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
43 | /*************************************************************** |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
44 | ** Discovery/Description Defines * |
|
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 | #define NUM_UDP_ATTEMPTS 2 |
|
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 | /* Address and port of an SSDP request used for discovery */ |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
49 | #define HTTPMU_HOST_ADDRESS "239.255.255.250" |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
50 | #define HTTPMU_HOST_PORT 1900 |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
51 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
52 | #define SEARCH_REQUEST_DEVICE "urn:schemas-upnp-org:service:%s" |
|
11195
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_STRING \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
55 | "M-SEARCH * HTTP/1.1\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
56 | "MX: 2\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
57 | "HOST: 239.255.255.250:1900\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
58 | "MAN: \"ssdp:discover\"\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
59 | "ST: urn:schemas-upnp-org:service:%s\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
60 | "\r\n" |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
61 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
62 | #define WAN_IP_CONN_SERVICE "WANIPConnection:1" |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
63 | #define WAN_PPP_CONN_SERVICE "WANPPPConnection:1" |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
64 | |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
65 | /****************************************************************** |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
66 | ** Action Defines * |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
67 | *******************************************************************/ |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
68 | #define HTTP_HEADER_ACTION \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
69 | "POST /%s HTTP/1.1\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
70 | "HOST: %s:%d\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
71 | "SOAPACTION: \"urn:schemas-upnp-org:service:%s#%s\"\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
72 | "CONTENT-TYPE: text/xml ; charset=\"utf-8\"\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
73 | "CONTENT-LENGTH: %" G_GSIZE_FORMAT "\r\n\r\n" |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
74 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
75 | #define SOAP_ACTION \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
76 | "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
77 | "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" " \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
78 | "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
79 | "<s:Body>\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
80 | "<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
|
81 | "%s" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
82 | "</u:%s>\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
83 | "</s:Body>\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
84 | "</s:Envelope>" |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
85 | |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
86 | #define PORT_MAPPING_LEASE_TIME "0" |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
87 | #define PORT_MAPPING_DESCRIPTION "GAIM_UPNP_PORT_FORWARD" |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
88 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
89 | #define ADD_PORT_MAPPING_PARAMS \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
90 | "<NewRemoteHost></NewRemoteHost>\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
91 | "<NewExternalPort>%i</NewExternalPort>\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
92 | "<NewProtocol>%s</NewProtocol>\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
93 | "<NewInternalPort>%i</NewInternalPort>\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
94 | "<NewInternalClient>%s</NewInternalClient>\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
95 | "<NewEnabled>1</NewEnabled>\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
96 | "<NewPortMappingDescription>" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
97 | PORT_MAPPING_DESCRIPTION \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
98 | "</NewPortMappingDescription>\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
99 | "<NewLeaseDuration>" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
100 | PORT_MAPPING_LEASE_TIME \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
101 | "</NewLeaseDuration>\r\n" |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
102 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
103 | #define DELETE_PORT_MAPPING_PARAMS \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
104 | "<NewRemoteHost></NewRemoteHost>\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
105 | "<NewExternalPort>%i</NewExternalPort>\r\n" \ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
106 | "<NewProtocol>%s</NewProtocol>\r\n" |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
107 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
108 | typedef enum { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
109 | GAIM_UPNP_STATUS_UNDISCOVERED = -1, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
110 | GAIM_UPNP_STATUS_UNABLE_TO_DISCOVER, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
111 | GAIM_UPNP_STATUS_DISCOVERING, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
112 | GAIM_UPNP_STATUS_DISCOVERED |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
113 | } GaimUPnPStatus; |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
114 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
115 | typedef struct { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
116 | GaimUPnPStatus status; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
117 | gchar* control_url; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
118 | gchar service_type[20]; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
119 | char publicip[16]; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
120 | char internalip[16]; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
121 | time_t lookup_time; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
122 | } GaimUPnPControlInfo; |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
123 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
124 | typedef struct { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
125 | guint inpa; /* gaim_input_add handle */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
126 | guint tima; /* gaim_timeout_add handle */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
127 | int fd; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
128 | struct sockaddr_in server; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
129 | gchar service_type[25]; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
130 | int retry_count; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
131 | gchar *full_url; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
132 | } UPnPDiscoveryData; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
133 | |
|
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
|
134 | 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
|
135 | { |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
136 | unsigned short portmap; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
137 | gchar protocol[4]; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
138 | gboolean add; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
139 | GaimUPnPCallback cb; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
140 | gpointer cb_data; |
|
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
|
141 | guint tima; /* gaim_timeout_add handle */ |
|
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
|
142 | GaimUtilFetchUrlData *gfud; |
|
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
|
143 | }; |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
144 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
145 | static GaimUPnPControlInfo control_info = { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
146 | GAIM_UPNP_STATUS_UNDISCOVERED, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
147 | NULL, "\0", "\0", "\0", 0}; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
148 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
149 | static GSList *discovery_callbacks = NULL; |
|
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 void gaim_upnp_discover_send_broadcast(UPnPDiscoveryData *dd); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
152 | static void lookup_public_ip(void); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
153 | static void lookup_internal_ip(void); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
154 | |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
155 | static void |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
156 | fire_discovery_callbacks(gboolean success) |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
157 | { |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
158 | while(discovery_callbacks) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
159 | gpointer data; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
160 | GaimUPnPCallback cb = discovery_callbacks->data; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
161 | discovery_callbacks = g_slist_remove(discovery_callbacks, cb); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
162 | data = discovery_callbacks->data; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
163 | discovery_callbacks = g_slist_remove(discovery_callbacks, data); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
164 | cb(success, data); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
165 | } |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
166 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
167 | |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
168 | static gboolean |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
169 | gaim_upnp_compare_device(const xmlnode* device, const gchar* deviceType) |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
170 | { |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
171 | xmlnode* deviceTypeNode = xmlnode_get_child(device, "deviceType"); |
|
13622
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
172 | char *tmp; |
|
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
173 | gboolean ret; |
|
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
174 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
175 | if(deviceTypeNode == NULL) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
176 | return FALSE; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
177 | } |
|
13622
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
178 | |
|
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
179 | tmp = xmlnode_get_data(deviceTypeNode); |
|
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
180 | ret = !g_ascii_strcasecmp(tmp, deviceType); |
|
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
181 | g_free(tmp); |
|
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
182 | |
|
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
183 | return ret; |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
184 | } |
|
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
185 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
186 | static gboolean |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
187 | gaim_upnp_compare_service(const xmlnode* service, const gchar* serviceType) |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
188 | { |
| 13793 | 189 | xmlnode* serviceTypeNode; |
|
13622
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
190 | char *tmp; |
|
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
191 | gboolean ret; |
|
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
192 | |
| 13793 | 193 | if(service == NULL) { |
| 194 | return FALSE; | |
| 195 | } | |
| 196 | ||
| 197 | serviceTypeNode = xmlnode_get_child(service, "serviceType"); | |
| 198 | ||
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
199 | if(serviceTypeNode == NULL) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
200 | return FALSE; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
201 | } |
|
13622
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
202 | |
|
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
203 | tmp = xmlnode_get_data(serviceTypeNode); |
|
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
204 | ret = !g_ascii_strcasecmp(tmp, serviceType); |
|
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
205 | g_free(tmp); |
|
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
206 | |
|
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
207 | return ret; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
208 | } |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
209 | |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
210 | static gchar* |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
211 | gaim_upnp_parse_description_response(const gchar* httpResponse, gsize len, |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
212 | const gchar* httpURL, const gchar* serviceType) |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
213 | { |
|
13622
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
214 | gchar *xmlRoot, *baseURL, *controlURL, *service; |
|
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
215 | xmlnode *xmlRootNode, *serviceTypeNode, *controlURLNode, *baseURLNode; |
|
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
216 | char *tmp; |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
217 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
218 | /* make sure we have a valid http response */ |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
219 | if(g_strstr_len(httpResponse, len, HTTP_OK) == NULL) { |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
220 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
221 | "parse_description_response(): Failed In HTTP_OK\n"); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
222 | return NULL; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
223 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
224 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
225 | /* find the root of the xml document */ |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
226 | if((xmlRoot = g_strstr_len(httpResponse, len, "<root")) == NULL) { |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
227 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
228 | "parse_description_response(): Failed finding root\n"); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
229 | return NULL; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
230 | } |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
231 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
232 | /* create the xml root node */ |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
233 | if((xmlRootNode = xmlnode_from_str(xmlRoot, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
234 | len - (xmlRoot - httpResponse))) == NULL) { |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
235 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
236 | "parse_description_response(): Could not parse xml root node\n"); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
237 | return NULL; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
238 | } |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
239 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
240 | /* get the baseURL of the device */ |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
241 | if((baseURLNode = xmlnode_get_child(xmlRootNode, "URLBase")) != NULL) { |
|
13622
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
242 | baseURL = xmlnode_get_data(baseURLNode); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
243 | } else { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
244 | baseURL = g_strdup(httpURL); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
245 | } |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
246 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
247 | /* 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
|
248 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
249 | /* get urn:schemas-upnp-org:device:InternetGatewayDevice:1 and its devicelist */ |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
250 | serviceTypeNode = xmlnode_get_child(xmlRootNode, "device"); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
251 | while(!gaim_upnp_compare_device(serviceTypeNode, |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
252 | "urn:schemas-upnp-org:device:InternetGatewayDevice:1") && |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
253 | serviceTypeNode != NULL) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
254 | serviceTypeNode = xmlnode_get_next_twin(serviceTypeNode); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
255 | } |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
256 | if(serviceTypeNode == NULL) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
257 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
258 | "parse_description_response(): could not get serviceTypeNode 1\n"); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
259 | g_free(baseURL); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
260 | xmlnode_free(xmlRootNode); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
261 | return NULL; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
262 | } |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
263 | serviceTypeNode = xmlnode_get_child(serviceTypeNode, "deviceList"); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
264 | if(serviceTypeNode == NULL) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
265 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
266 | "parse_description_response(): could not get serviceTypeNode 2\n"); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
267 | g_free(baseURL); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
268 | xmlnode_free(xmlRootNode); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
269 | return NULL; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
270 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
271 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
272 | /* get urn:schemas-upnp-org:device:WANDevice:1 and its devicelist */ |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
273 | serviceTypeNode = xmlnode_get_child(serviceTypeNode, "device"); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
274 | while(!gaim_upnp_compare_device(serviceTypeNode, |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
275 | "urn:schemas-upnp-org:device:WANDevice:1") && |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
276 | serviceTypeNode != NULL) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
277 | serviceTypeNode = xmlnode_get_next_twin(serviceTypeNode); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
278 | } |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
279 | if(serviceTypeNode == NULL) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
280 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
281 | "parse_description_response(): could not get serviceTypeNode 3\n"); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
282 | g_free(baseURL); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
283 | xmlnode_free(xmlRootNode); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
284 | return NULL; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
285 | } |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
286 | serviceTypeNode = xmlnode_get_child(serviceTypeNode, "deviceList"); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
287 | if(serviceTypeNode == NULL) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
288 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
289 | "parse_description_response(): could not get serviceTypeNode 4\n"); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
290 | g_free(baseURL); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
291 | xmlnode_free(xmlRootNode); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
292 | return NULL; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
293 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
294 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
295 | /* get urn:schemas-upnp-org:device:WANConnectionDevice:1 and its servicelist */ |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
296 | serviceTypeNode = xmlnode_get_child(serviceTypeNode, "device"); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
297 | while(serviceTypeNode && !gaim_upnp_compare_device(serviceTypeNode, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
298 | "urn:schemas-upnp-org:device:WANConnectionDevice:1")) { |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
299 | serviceTypeNode = xmlnode_get_next_twin(serviceTypeNode); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
300 | } |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
301 | if(serviceTypeNode == NULL) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
302 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
303 | "parse_description_response(): could not get serviceTypeNode 5\n"); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
304 | g_free(baseURL); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
305 | xmlnode_free(xmlRootNode); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
306 | return NULL; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
307 | } |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
308 | serviceTypeNode = xmlnode_get_child(serviceTypeNode, "serviceList"); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
309 | if(serviceTypeNode == NULL) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
310 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
311 | "parse_description_response(): could not get serviceTypeNode 6\n"); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
312 | g_free(baseURL); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
313 | xmlnode_free(xmlRootNode); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
314 | return NULL; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
315 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
316 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
317 | /* get the serviceType variable passed to this function */ |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
318 | service = g_strdup_printf(SEARCH_REQUEST_DEVICE, serviceType); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
319 | serviceTypeNode = xmlnode_get_child(serviceTypeNode, "service"); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
320 | while(!gaim_upnp_compare_service(serviceTypeNode, service) && |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
321 | serviceTypeNode != NULL) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
322 | serviceTypeNode = xmlnode_get_next_twin(serviceTypeNode); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
323 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
324 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
325 | g_free(service); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
326 | if(serviceTypeNode == NULL) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
327 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
328 | "parse_description_response(): could not get serviceTypeNode 7\n"); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
329 | g_free(baseURL); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
330 | xmlnode_free(xmlRootNode); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
331 | return NULL; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
332 | } |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
333 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
334 | /* get the controlURL of the service */ |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
335 | if((controlURLNode = xmlnode_get_child(serviceTypeNode, |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
336 | "controlURL")) == NULL) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
337 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
338 | "parse_description_response(): Could not find controlURL\n"); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
339 | g_free(baseURL); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
340 | xmlnode_free(xmlRootNode); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
341 | return NULL; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
342 | } |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
343 | |
|
13622
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
344 | tmp = xmlnode_get_data(controlURLNode); |
|
15290
98dfd5bef14b
[gaim-migrate @ 18018]
Daniel Atallah <datallah@pidgin.im>
parents:
14899
diff
changeset
|
345 | if(baseURL && !gaim_str_has_prefix(tmp, "http://") && |
|
13622
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
346 | !gaim_str_has_prefix(tmp, "HTTP://")) { |
| 15348 | 347 | /* Handle absolute paths in a relative URL. This probably |
| 348 | * belongs in util.c. */ | |
| 349 | if (tmp[0] == '/') { | |
| 350 | size_t length; | |
| 351 | const char *path, *start = strstr(baseURL, "://"); | |
| 352 | start = start ? start + 3 : baseURL; | |
| 353 | path = strchr(start, '/'); | |
| 354 | length = path ? path - baseURL : strlen(baseURL); | |
| 355 | controlURL = g_strdup_printf("%.*s%s", length, baseURL, tmp); | |
| 356 | } else { | |
| 357 | controlURL = g_strdup_printf("%s%s", baseURL, tmp); | |
| 358 | } | |
|
13622
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
359 | g_free(tmp); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
360 | }else{ |
|
13622
9311eed487c7
[gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents:
13201
diff
changeset
|
361 | controlURL = tmp; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
362 | } |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
363 | g_free(baseURL); |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
364 | xmlnode_free(xmlRootNode); |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
365 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
366 | return controlURL; |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
367 | } |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
368 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
369 | static void |
|
14416
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
370 | upnp_parse_description_cb(GaimUtilFetchUrlData *url_data, gpointer user_data, |
|
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
371 | const gchar *httpResponse, gsize len, const gchar *error_message) |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
372 | { |
|
14416
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
373 | UPnPDiscoveryData *dd = user_data; |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
374 | gchar *control_url = NULL; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
375 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
376 | if (len > 0) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
377 | control_url = gaim_upnp_parse_description_response( |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
378 | httpResponse, len, dd->full_url, dd->service_type); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
379 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
380 | g_free(dd->full_url); |
|
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 | if(control_url == NULL) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
383 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
384 | "gaim_upnp_parse_description(): control URL is NULL\n"); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
385 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
386 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
387 | control_info.status = control_url ? GAIM_UPNP_STATUS_DISCOVERED |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
388 | : GAIM_UPNP_STATUS_UNABLE_TO_DISCOVER; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
389 | control_info.lookup_time = time(NULL); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
390 | control_info.control_url = control_url; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
391 | strncpy(control_info.service_type, dd->service_type, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
392 | sizeof(control_info.service_type)); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
393 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
394 | fire_discovery_callbacks(control_url != NULL); |
|
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 | /* Look up the public and internal IPs */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
397 | if(control_url != NULL) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
398 | lookup_public_ip(); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
399 | lookup_internal_ip(); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
400 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
401 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
402 | g_free(dd); |
|
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 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
405 | static void |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
406 | gaim_upnp_parse_description(const gchar* descriptionURL, UPnPDiscoveryData *dd) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
407 | { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
408 | gchar* httpRequest; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
409 | gchar* descriptionXMLAddress; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
410 | gchar* descriptionAddress; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
411 | int port = 0; |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
412 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
413 | /* parse the 4 above variables out of the descriptionURL |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
414 | 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
|
415 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
416 | /* parse the url into address, port, path variables */ |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
417 | if(!gaim_url_parse(descriptionURL, &descriptionAddress, |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
418 | &port, &descriptionXMLAddress, NULL, NULL)) { |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
419 | return; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
420 | } |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
421 | if(port == 0 || port == -1) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
422 | port = DEFAULT_HTTP_PORT; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
423 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
424 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
425 | /* for example... |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
426 | 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
|
427 | httpRequest = g_strdup_printf( |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
428 | "GET /%s HTTP/1.1\r\n" |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
429 | "Connection: close\r\n" |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
430 | "Host: %s:%d\r\n\r\n", |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
431 | descriptionXMLAddress, descriptionAddress, port); |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
432 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
433 | g_free(descriptionXMLAddress); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
434 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
435 | dd->full_url = g_strdup_printf("http://%s:%d", |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
436 | descriptionAddress, port); |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13097
diff
changeset
|
437 | g_free(descriptionAddress); |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
438 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
439 | /* Remove the timeout because everything it is waiting for has |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
440 | * successfully completed */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
441 | gaim_timeout_remove(dd->tima); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
442 | dd->tima = 0; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
443 | |
|
14416
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
444 | gaim_util_fetch_url_request(descriptionURL, TRUE, NULL, TRUE, httpRequest, |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
445 | TRUE, upnp_parse_description_cb, dd); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
446 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
447 | g_free(httpRequest); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
448 | |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
449 | } |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
450 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
451 | static void |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
452 | gaim_upnp_parse_discover_response(const gchar* buf, unsigned int buf_len, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
453 | UPnPDiscoveryData *dd) |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
454 | { |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
455 | gchar* startDescURL; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
456 | gchar* endDescURL; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
457 | gchar* descURL; |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
458 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
459 | if(g_strstr_len(buf, buf_len, HTTP_OK) == NULL) { |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
460 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
461 | "parse_discover_response(): Failed In HTTP_OK\n"); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
462 | return; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
463 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
464 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
465 | if((startDescURL = g_strstr_len(buf, buf_len, "http://")) == NULL) { |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
466 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
467 | "parse_discover_response(): Failed In finding http://\n"); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
468 | return; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
469 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
470 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
471 | endDescURL = g_strstr_len(startDescURL, buf_len - (startDescURL - buf), |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
472 | "\r"); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
473 | if(endDescURL == NULL) { |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
474 | endDescURL = g_strstr_len(startDescURL, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
475 | buf_len - (startDescURL - buf), "\n"); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
476 | if(endDescURL == NULL) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
477 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
478 | "parse_discover_response(): Failed In endDescURL\n"); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
479 | return; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
480 | } |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
481 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
482 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
483 | /* XXX: I'm not sure how this could ever happen */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
484 | if(endDescURL == startDescURL) { |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
485 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
486 | "parse_discover_response(): endDescURL == startDescURL\n"); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
487 | return; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
488 | } |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
489 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
490 | descURL = g_strndup(startDescURL, endDescURL - startDescURL); |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
491 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
492 | gaim_upnp_parse_description(descURL, dd); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
493 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
494 | g_free(descURL); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
495 | |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
496 | } |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
497 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
498 | static gboolean |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
499 | gaim_upnp_discover_timeout(gpointer data) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
500 | { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
501 | UPnPDiscoveryData* dd = data; |
|
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 | if (dd->inpa) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
504 | gaim_input_remove(dd->inpa); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
505 | dd->inpa = 0; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
506 | dd->tima = 0; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
507 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
508 | if (dd->retry_count < NUM_UDP_ATTEMPTS) { |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
509 | /* 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
|
510 | dd->retry_count++; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
511 | gaim_upnp_discover_send_broadcast(dd); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
512 | } else { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
513 | if (dd->fd) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
514 | close(dd->fd); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
515 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
516 | control_info.status = GAIM_UPNP_STATUS_UNABLE_TO_DISCOVER; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
517 | control_info.lookup_time = time(NULL); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
518 | control_info.service_type[0] = '\0'; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
519 | g_free(control_info.control_url); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
520 | control_info.control_url = NULL; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
521 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
522 | fire_discovery_callbacks(FALSE); |
|
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 | g_free(dd); |
|
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 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
527 | return FALSE; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
528 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
529 | |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
530 | static void |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
531 | gaim_upnp_discover_udp_read(gpointer data, gint sock, GaimInputCondition cond) |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
532 | { |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
533 | int len; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
534 | UPnPDiscoveryData *dd = data; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
535 | gchar buf[65536]; |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
536 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
537 | do { |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
538 | len = recv(dd->fd, buf, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
539 | sizeof(buf) - 1, 0); |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
540 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
541 | if(len > 0) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
542 | buf[len] = '\0'; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
543 | break; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
544 | } else if(errno != EINTR) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
545 | /* We'll either get called again, or time out */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
546 | return; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
547 | } |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
548 | } while (errno == EINTR); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
549 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
550 | gaim_input_remove(dd->inpa); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
551 | dd->inpa = 0; |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
552 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
553 | close(dd->fd); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
554 | dd->fd = 0; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
555 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
556 | /* parse the response, and see if it was a success */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
557 | gaim_upnp_parse_discover_response(buf, len, dd); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
558 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
559 | /* We'll either time out or continue successfully */ |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
560 | } |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
561 | |
|
14416
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
562 | static void |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
563 | gaim_upnp_discover_send_broadcast(UPnPDiscoveryData *dd) |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
564 | { |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
565 | gchar *sendMessage = NULL; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
566 | gsize totalSize; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
567 | gboolean sentSuccess; |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
568 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
569 | /* because we are sending over UDP, if there is a failure |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
570 | we should retry the send NUM_UDP_ATTEMPTS times. Also, |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
571 | try different requests for WANIPConnection and WANPPPConnection*/ |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
572 | for(; dd->retry_count < NUM_UDP_ATTEMPTS; dd->retry_count++) { |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13097
diff
changeset
|
573 | sentSuccess = FALSE; |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
574 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
575 | if((dd->retry_count % 2) == 0) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
576 | 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
|
577 | } else { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
578 | 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
|
579 | } |
|
11213
837e1970689d
[gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11204
diff
changeset
|
580 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
581 | 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
|
582 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
583 | totalSize = strlen(sendMessage); |
|
11213
837e1970689d
[gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11204
diff
changeset
|
584 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
585 | do { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
586 | if(sendto(dd->fd, sendMessage, totalSize, 0, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
587 | (struct sockaddr*) &(dd->server), |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
588 | sizeof(struct sockaddr_in) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
589 | ) == totalSize) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
590 | sentSuccess = TRUE; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
591 | break; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
592 | } |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13097
diff
changeset
|
593 | } while (errno == EINTR || errno == EAGAIN); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
594 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
595 | g_free(sendMessage); |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
596 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
597 | if(sentSuccess) { |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
598 | dd->tima = gaim_timeout_add(DISCOVERY_TIMEOUT, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
599 | gaim_upnp_discover_timeout, dd); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
600 | dd->inpa = gaim_input_add(dd->fd, GAIM_INPUT_READ, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
601 | gaim_upnp_discover_udp_read, dd); |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
602 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
603 | return; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
604 | } |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
605 | } |
|
11213
837e1970689d
[gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11204
diff
changeset
|
606 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
607 | /* 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
|
608 | * doesn't get called before the original function returns */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
609 | gaim_timeout_add(10, gaim_upnp_discover_timeout, dd); |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
610 | } |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
611 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
612 | void |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
613 | gaim_upnp_discover(GaimUPnPCallback cb, gpointer cb_data) |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
614 | { |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
615 | /* Socket Setup Variables */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
616 | int sock; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
617 | struct hostent* hp; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
618 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
619 | /* UDP RECEIVE VARIABLES */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
620 | UPnPDiscoveryData *dd; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
621 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
622 | if (control_info.status == GAIM_UPNP_STATUS_DISCOVERING) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
623 | if (cb) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
624 | discovery_callbacks = g_slist_append( |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
625 | discovery_callbacks, 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_data); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
628 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
629 | return; |
|
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 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
632 | dd = g_new0(UPnPDiscoveryData, 1); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
633 | if (cb) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
634 | discovery_callbacks = g_slist_append(discovery_callbacks, cb); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
635 | discovery_callbacks = g_slist_append(discovery_callbacks, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
636 | cb_data); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
637 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
638 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
639 | /* Set up the sockets */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
640 | sock = socket(AF_INET, SOCK_DGRAM, 0); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
641 | if(sock == -1) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
642 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
643 | "gaim_upnp_discover(): Failed In sock creation\n"); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
644 | /* Short circuit the retry attempts */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
645 | dd->retry_count = NUM_UDP_ATTEMPTS; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
646 | gaim_timeout_add(10, gaim_upnp_discover_timeout, dd); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
647 | return; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
648 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
649 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
650 | dd->fd = sock; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
651 | |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
652 | /* TODO: Non-blocking! */ |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
653 | if((hp = gethostbyname(HTTPMU_HOST_ADDRESS)) == NULL) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
654 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
655 | "gaim_upnp_discover(): Failed In gethostbyname\n"); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
656 | /* Short circuit the retry attempts */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
657 | dd->retry_count = NUM_UDP_ATTEMPTS; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
658 | gaim_timeout_add(10, gaim_upnp_discover_timeout, dd); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
659 | return; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
660 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
661 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
662 | memset(&(dd->server), 0, sizeof(struct sockaddr)); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
663 | dd->server.sin_family = AF_INET; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
664 | 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
|
665 | dd->server.sin_port = htons(HTTPMU_HOST_PORT); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
666 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
667 | control_info.status = GAIM_UPNP_STATUS_DISCOVERING; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
668 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
669 | gaim_upnp_discover_send_broadcast(dd); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
670 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
671 | |
|
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
|
672 | static GaimUtilFetchUrlData* |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
673 | gaim_upnp_generate_action_message_and_send(const gchar* actionName, |
|
14416
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
674 | const gchar* actionParams, GaimUtilFetchUrlCallback cb, |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
675 | gpointer cb_data) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
676 | { |
|
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
|
677 | GaimUtilFetchUrlData* gfud; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
678 | gchar* soapMessage; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
679 | gchar* totalSendMessage; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
680 | gchar* pathOfControl; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
681 | gchar* addressOfControl; |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
682 | int port = 0; |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
683 | |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
684 | /* parse the url into address, port, path variables */ |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
685 | if(!gaim_url_parse(control_info.control_url, &addressOfControl, |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
686 | &port, &pathOfControl, NULL, NULL)) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
687 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
688 | "generate_action_message_and_send(): Failed In Parse URL\n"); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
689 | /* XXX: This should probably be async */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
690 | if(cb) |
|
14416
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
691 | cb(NULL, cb_data, NULL, 0, NULL); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
692 | } |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
693 | if(port == 0 || port == -1) { |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
694 | port = DEFAULT_HTTP_PORT; |
|
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
695 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
696 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
697 | /* set the soap message */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
698 | soapMessage = g_strdup_printf(SOAP_ACTION, actionName, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
699 | control_info.service_type, actionParams, actionName); |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
700 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
701 | /* set the HTTP Header, and append the body to it */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
702 | totalSendMessage = g_strdup_printf(HTTP_HEADER_ACTION "%s", |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
703 | pathOfControl, addressOfControl, port, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
704 | control_info.service_type, actionName, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
705 | strlen(soapMessage), soapMessage); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
706 | g_free(pathOfControl); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
707 | g_free(soapMessage); |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
708 | |
|
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
|
709 | gfud = gaim_util_fetch_url_request(control_info.control_url, FALSE, NULL, TRUE, |
|
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
|
710 | totalSendMessage, TRUE, cb, cb_data); |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
711 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
712 | g_free(totalSendMessage); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
713 | 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
|
714 | |
|
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
|
715 | return gfud; |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
716 | } |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
717 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
718 | const gchar * |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
719 | gaim_upnp_get_public_ip() |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
720 | { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
721 | if (control_info.status == GAIM_UPNP_STATUS_DISCOVERED |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
722 | && control_info.publicip |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
723 | && strlen(control_info.publicip) > 0) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
724 | return control_info.publicip; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
725 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
726 | /* Trigger another UPnP discovery if 5 minutes have elapsed since the |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
727 | * last one, and it wasn't successful */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
728 | if (control_info.status < GAIM_UPNP_STATUS_DISCOVERING |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
729 | && (time(NULL) - control_info.lookup_time) > 300) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
730 | gaim_upnp_discover(NULL, NULL); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
731 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
732 | return NULL; |
|
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 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
735 | static void |
|
14416
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
736 | looked_up_public_ip_cb(GaimUtilFetchUrlData *url_data, gpointer user_data, |
|
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
737 | const gchar *httpResponse, gsize len, const gchar *error_message) |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
738 | { |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
739 | gchar* temp, *temp2; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
740 | |
|
14416
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
741 | if ((error_message != NULL) || (httpResponse == NULL)) |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
742 | return; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
743 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
744 | /* extract the ip, or see if there is an error */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
745 | if((temp = g_strstr_len(httpResponse, len, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
746 | "<NewExternalIPAddress")) == NULL) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
747 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
748 | "looked_up_public_ip_cb(): Failed Finding <NewExternalIPAddress\n"); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
749 | return; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
750 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
751 | if(!(temp = g_strstr_len(temp, len - (temp - httpResponse), ">"))) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
752 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
753 | "looked_up_public_ip_cb(): Failed In Finding >\n"); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
754 | return; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
755 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
756 | if(!(temp2 = g_strstr_len(temp, len - (temp - httpResponse), "<"))) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
757 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
758 | "looked_up_public_ip_cb(): Failed In Finding <\n"); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
759 | return; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
760 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
761 | *temp2 = '\0'; |
|
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 | strncpy(control_info.publicip, temp + 1, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
764 | sizeof(control_info.publicip)); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
765 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
766 | gaim_debug_info("upnp", "NAT Returned IP: %s\n", control_info.publicip); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
767 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
768 | |
|
14416
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
769 | static void |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
770 | lookup_public_ip() |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
771 | { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
772 | gaim_upnp_generate_action_message_and_send("GetExternalIPAddress", "", |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
773 | looked_up_public_ip_cb, NULL); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
774 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
775 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
776 | /* TODO: This could be exported */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
777 | static const gchar * |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
778 | gaim_upnp_get_internal_ip() |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
779 | { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
780 | if (control_info.status == GAIM_UPNP_STATUS_DISCOVERED |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
781 | && control_info.internalip |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
782 | && strlen(control_info.internalip) > 0) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
783 | return control_info.internalip; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
784 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
785 | /* Trigger another UPnP discovery if 5 minutes have elapsed since the |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
786 | * last one, and it wasn't successful */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
787 | if (control_info.status < GAIM_UPNP_STATUS_DISCOVERING |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
788 | && (time(NULL) - control_info.lookup_time) > 300) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
789 | gaim_upnp_discover(NULL, NULL); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
790 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
791 | return NULL; |
|
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 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
794 | static void |
|
14183
bdde840e984c
[gaim-migrate @ 16755]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
795 | 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
|
796 | { |
|
14151
34427f138b1f
[gaim-migrate @ 16712]
Mark Doliner <markdoliner@pidgin.im>
parents:
13793
diff
changeset
|
797 | if (source) { |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
798 | strncpy(control_info.internalip, |
|
14151
34427f138b1f
[gaim-migrate @ 16712]
Mark Doliner <markdoliner@pidgin.im>
parents:
13793
diff
changeset
|
799 | gaim_network_get_local_system_ip(source), |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
800 | sizeof(control_info.internalip)); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
801 | gaim_debug_info("upnp", "Local IP: %s\n", |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
802 | control_info.internalip); |
|
14151
34427f138b1f
[gaim-migrate @ 16712]
Mark Doliner <markdoliner@pidgin.im>
parents:
13793
diff
changeset
|
803 | close(source); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
804 | } else |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
805 | gaim_debug_info("upnp", "Unable to look up local IP\n"); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
806 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
807 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
808 | |
|
14416
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
809 | static void |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
810 | lookup_internal_ip() |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
811 | { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
812 | gchar* addressOfControl; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
813 | int port = 0; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
814 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
815 | if(!gaim_url_parse(control_info.control_url, &addressOfControl, &port, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
816 | NULL, NULL, NULL)) { |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
817 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
818 | "lookup_internal_ip(): Failed In Parse URL\n"); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
819 | return; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
820 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
821 | if(port == 0 || port == -1) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
822 | port = DEFAULT_HTTP_PORT; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
823 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
824 | |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
825 | if(gaim_proxy_connect(NULL, NULL, addressOfControl, port, |
|
14170
f611621bc8a0
[gaim-migrate @ 16742]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
826 | looked_up_internal_ip_cb, NULL) == NULL) |
|
14151
34427f138b1f
[gaim-migrate @ 16712]
Mark Doliner <markdoliner@pidgin.im>
parents:
13793
diff
changeset
|
827 | { |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
828 | gaim_debug_error("upnp", "Get Local IP Connect Failed: Address: %s @@@ Port %d\n", |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
829 | addressOfControl, port); |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
830 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
831 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
832 | g_free(addressOfControl); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
833 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
834 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
835 | static void |
|
14416
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
836 | done_port_mapping_cb(GaimUtilFetchUrlData *url_data, gpointer user_data, |
|
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
837 | const gchar *httpResponse, gsize len, const gchar *error_message) |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
838 | { |
|
14416
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
839 | UPnPMappingAddRemove *ar = user_data; |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
840 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
841 | gboolean success = TRUE; |
|
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 | /* determine if port mapping was a success */ |
|
14416
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
844 | if ((error_message != NULL) || (httpResponse == NULL) || |
|
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
845 | (g_strstr_len(httpResponse, len, HTTP_OK) == NULL)) |
|
c95ffd983a39
[gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
846 | { |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
847 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
848 | "gaim_upnp_set_port_mapping(): Failed HTTP_OK\n%s\n", |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
849 | httpResponse ? httpResponse : "(null)"); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
850 | success = FALSE; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
851 | } else |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
852 | gaim_debug_info("upnp", "Successfully completed port mapping operation\n"); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
853 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
854 | if (ar->cb) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
855 | ar->cb(success, ar->cb_data); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
856 | g_free(ar); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
857 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
858 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
859 | static void |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
860 | do_port_mapping_cb(gboolean has_control_mapping, gpointer data) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
861 | { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
862 | UPnPMappingAddRemove *ar = data; |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
863 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
864 | if (has_control_mapping) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
865 | gchar action_name[25]; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
866 | gchar *action_params; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
867 | if(ar->add) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
868 | const gchar *internal_ip; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
869 | /* get the internal IP */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
870 | if(!(internal_ip = gaim_upnp_get_internal_ip())) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
871 | gaim_debug_error("upnp", |
|
14899
c65f0b4fb351
[gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents:
14552
diff
changeset
|
872 | "gaim_upnp_set_port_mapping(): couldn't get local ip\n"); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
873 | /* UGLY */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
874 | if (ar->cb) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
875 | ar->cb(FALSE, ar->cb_data); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
876 | g_free(ar); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
877 | return; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
878 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
879 | strncpy(action_name, "AddPortMapping", |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
880 | sizeof(action_name)); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
881 | action_params = g_strdup_printf( |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
882 | ADD_PORT_MAPPING_PARAMS, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
883 | ar->portmap, ar->protocol, ar->portmap, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
884 | internal_ip); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
885 | } else { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
886 | strncpy(action_name, "DeletePortMapping", sizeof(action_name)); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
887 | action_params = g_strdup_printf( |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
888 | DELETE_PORT_MAPPING_PARAMS, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
889 | ar->portmap, ar->protocol); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
890 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
891 | |
|
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
|
892 | ar->gfud = gaim_upnp_generate_action_message_and_send(action_name, |
|
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
|
893 | action_params, done_port_mapping_cb, ar); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
894 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
895 | g_free(action_params); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
896 | return; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
897 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
898 | |
|
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
899 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
900 | if (ar->cb) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
901 | ar->cb(FALSE, ar->cb_data); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
902 | g_free(ar); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
903 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
904 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
905 | static gboolean |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
906 | fire_port_mapping_failure_cb(gpointer data) |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
907 | { |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
908 | do_port_mapping_cb(FALSE, data); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
909 | return FALSE; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
910 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
911 | |
|
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
|
912 | void gaim_upnp_cancel_port_mapping(UPnPMappingAddRemove *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
|
913 | { |
|
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
|
914 | 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
|
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 | /* 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
|
917 | * 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
|
918 | 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
|
919 | 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
|
920 | { |
|
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 | 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
|
922 | 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
|
923 | 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
|
924 | } |
|
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 | |
|
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 | 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
|
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 | |
|
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 | if (ar->tima > 0) |
|
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 | gaim_timeout_remove(ar->tima); |
|
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 | |
|
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
|
932 | if (ar->gfud) |
|
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 | gaim_util_fetch_url_cancel(ar->gfud); |
|
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 | |
|
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
|
935 | 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
|
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 | |
|
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 | UPnPMappingAddRemove * |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
939 | gaim_upnp_set_port_mapping(unsigned short portmap, const gchar* protocol, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
940 | GaimUPnPCallback cb, gpointer cb_data) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
941 | { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
942 | UPnPMappingAddRemove *ar; |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
943 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
944 | ar = g_new0(UPnPMappingAddRemove, 1); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
945 | ar->cb = cb; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
946 | ar->cb_data = cb_data; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
947 | ar->add = TRUE; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
948 | ar->portmap = portmap; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
949 | strncpy(ar->protocol, protocol, sizeof(ar->protocol)); |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
950 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
951 | /* If we're waiting for a discovery, add to the callbacks list */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
952 | if(control_info.status == GAIM_UPNP_STATUS_DISCOVERING) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
953 | /* TODO: This will fail because when this cb is triggered, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
954 | * the internal IP lookup won't be complete */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
955 | discovery_callbacks = g_slist_append( |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
956 | discovery_callbacks, do_port_mapping_cb); |
|
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, 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
|
959 | return ar; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
960 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
961 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
962 | /* 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
|
963 | * elapsed since the last try, try again */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
964 | if(control_info.status == GAIM_UPNP_STATUS_UNDISCOVERED || |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
965 | (control_info.status == GAIM_UPNP_STATUS_UNABLE_TO_DISCOVER |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
966 | && (time(NULL) - control_info.lookup_time) > 300)) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
967 | gaim_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
|
968 | return ar; |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
969 | } else if(control_info.status == GAIM_UPNP_STATUS_UNABLE_TO_DISCOVER) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
970 | if (cb) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
971 | /* Asynchronously trigger a failed response */ |
|
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
|
972 | ar->tima = gaim_timeout_add(10, fire_port_mapping_failure_cb, ar); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
973 | } else { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
974 | /* No need to do anything if nobody expects a response*/ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
975 | 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
|
976 | ar = NULL; |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
977 | } |
|
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 | return ar; |
|
12734
69569600b471
[gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents:
12207
diff
changeset
|
979 | } |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
980 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
981 | 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
|
982 | return ar; |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
983 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
984 | |
|
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
|
985 | UPnPMappingAddRemove * |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
986 | gaim_upnp_remove_port_mapping(unsigned short portmap, const char* protocol, |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
987 | GaimUPnPCallback cb, gpointer cb_data) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
988 | { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
989 | UPnPMappingAddRemove *ar; |
|
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 | ar = g_new0(UPnPMappingAddRemove, 1); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
992 | ar->cb = cb; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
993 | ar->cb_data = cb_data; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
994 | ar->add = FALSE; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
995 | ar->portmap = portmap; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
996 | strncpy(ar->protocol, protocol, sizeof(ar->protocol)); |
|
11391
d172e72988cc
[gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents:
11213
diff
changeset
|
997 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
998 | /* If we're waiting for a discovery, add to the callbacks list */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
999 | if(control_info.status == GAIM_UPNP_STATUS_DISCOVERING) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1000 | discovery_callbacks = g_slist_append( |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1001 | discovery_callbacks, do_port_mapping_cb); |
|
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, 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
|
1004 | return ar; |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1005 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1006 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1007 | /* 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
|
1008 | * elapsed since the last try, try again */ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1009 | if(control_info.status == GAIM_UPNP_STATUS_UNDISCOVERED || |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1010 | (control_info.status == GAIM_UPNP_STATUS_UNABLE_TO_DISCOVER |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1011 | && (time(NULL) - control_info.lookup_time) > 300)) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1012 | gaim_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
|
1013 | return ar; |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1014 | } else if(control_info.status == GAIM_UPNP_STATUS_UNABLE_TO_DISCOVER) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1015 | if (cb) { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1016 | /* Asynchronously trigger a failed response */ |
|
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
|
1017 | ar->tima = gaim_timeout_add(10, fire_port_mapping_failure_cb, ar); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1018 | } else { |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1019 | /* No need to do anything if nobody expects a response*/ |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1020 | 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
|
1021 | ar = NULL; |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1022 | } |
|
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 | return ar; |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1024 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1025 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12734
diff
changeset
|
1026 | 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
|
1027 | return ar; |
|
11195
d84d542a04ac
[gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff
changeset
|
1028 | } |