comparison src/protocols/bonjour/dns_sd.c @ 13909:8264f52a1142

[gaim-migrate @ 16406] More of sf patch #1490646, from Jonty Wareing & Jono Cole "The screen name + hostname of the sending user is sent in the outgoing jabber message, fixing a sporadic problem with iChat. The port in use has been fixed to the one described in the Bonjour specification and can no longer be changed in the prpl preferences - modifiying this just stops the client from being able to start a chat. The option for a buddy icon has been removed for now as no code actually uses it yet - we plan to change this in the future. This update also introduces automatic local port retry for up to ten attempts if the port is in use (e.g. if multiple instances of gaim are running)." committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Mon, 03 Jul 2006 00:37:41 +0000
parents b986b6e2441b
children
comparison
equal deleted inserted replaced
13908:cab785a7c766 13909:8264f52a1142
19 #include "dns_sd.h" 19 #include "dns_sd.h"
20 #include "bonjour.h" 20 #include "bonjour.h"
21 #include "buddy.h" 21 #include "buddy.h"
22 #include "debug.h" 22 #include "debug.h"
23 23
24 /* Private data */
25
26 typedef struct _dns_sd_packet
27 {
28 gchar *name;
29 gchar *txtvers;
30 gchar *version;
31 gchar *first;
32 gchar *last;
33 gint port_p2pj;
34 gchar *phsh;
35 gchar *status;
36 gchar *message;
37 gchar *email;
38 gchar *vc;
39 gchar *jid;
40 gchar *AIM;
41 } dns_sd_packet;
42
43 /* End private data */
44
45 /* Private functions */ 24 /* Private functions */
46 25
47 static sw_result HOWL_API 26 static sw_result HOWL_API
48 _publish_reply(sw_discovery discovery, sw_discovery_oid oid, 27 _publish_reply(sw_discovery discovery, sw_discovery_oid oid,
49 sw_discovery_publish_status status, sw_opaque extra) 28 sw_discovery_publish_status status, sw_opaque extra)
81 BonjourBuddy *buddy; 60 BonjourBuddy *buddy;
82 GaimAccount *account = (GaimAccount*)extra; 61 GaimAccount *account = (GaimAccount*)extra;
83 gchar *txtvers = NULL; 62 gchar *txtvers = NULL;
84 gchar *version = NULL; 63 gchar *version = NULL;
85 gchar *first = NULL; 64 gchar *first = NULL;
86 gint port_p2pj = -1;
87 gchar *phsh = NULL; 65 gchar *phsh = NULL;
88 gchar *status = NULL; 66 gchar *status = NULL;
89 gchar *email = NULL; 67 gchar *email = NULL;
90 gchar *last = NULL; 68 gchar *last = NULL;
91 gchar *jid = NULL; 69 gchar *jid = NULL;
117 txtvers = g_strdup(value); 95 txtvers = g_strdup(value);
118 } else if (strcmp(key, "version") == 0) { 96 } else if (strcmp(key, "version") == 0) {
119 version = g_strdup(value); 97 version = g_strdup(value);
120 } else if (strcmp(key, "1st") == 0) { 98 } else if (strcmp(key, "1st") == 0) {
121 first = g_strdup(value); 99 first = g_strdup(value);
122 } else if (strcmp(key, "port.p2pj") == 0) {
123 port_p2pj = atoi(value);
124 } else if (strcmp(key, "status") == 0) { 100 } else if (strcmp(key, "status") == 0) {
125 status = g_strdup(value); 101 status = g_strdup(value);
126 } else if (strcmp(key, "email") == 0) { 102 } else if (strcmp(key, "email") == 0) {
127 email = g_strdup(value); 103 email = g_strdup(value);
128 } else if (strcmp(key, "last") == 0) { 104 } else if (strcmp(key, "last") == 0) {
141 } 117 }
142 } 118 }
143 119
144 /* Put the parameters of the text_record in a buddy and add the buddy to */ 120 /* Put the parameters of the text_record in a buddy and add the buddy to */
145 /* the buddy list */ 121 /* the buddy list */
146 buddy = bonjour_buddy_new(name, first, port_p2pj, phsh, 122 buddy = bonjour_buddy_new(name, first, port, phsh,
147 status, email, last, jid, AIM, vc, ip, msg); 123 status, email, last, jid, AIM, vc, ip, msg);
148 124
149 if (bonjour_buddy_check(buddy) == FALSE) 125 if (bonjour_buddy_check(buddy) == FALSE)
150 { 126 {
151 bonjour_buddy_delete(buddy); 127 bonjour_buddy_delete(buddy);
198 break; 174 break;
199 case SW_DISCOVERY_BROWSE_REMOVE_DOMAIN: 175 case SW_DISCOVERY_BROWSE_REMOVE_DOMAIN:
200 gaim_debug_warning("bonjour", "_browser_reply --> Remove domain\n"); 176 gaim_debug_warning("bonjour", "_browser_reply --> Remove domain\n");
201 break; 177 break;
202 case SW_DISCOVERY_BROWSE_ADD_SERVICE: 178 case SW_DISCOVERY_BROWSE_ADD_SERVICE:
203 /* A new peer has join the network and uses iChat bonjour */ 179 /* A new peer has joined the network and uses iChat bonjour */
204 gaim_debug_info("bonjour", "_browser_reply --> Add service\n"); 180 gaim_debug_info("bonjour", "_browser_reply --> Add service\n");
205 if (g_ascii_strcasecmp(name, account->username) != 0) 181 if (g_ascii_strcasecmp(name, account->username) != 0)
206 { 182 {
207 if (sw_discovery_resolve(discovery, interface_index, name, type, 183 if (sw_discovery_resolve(discovery, interface_index, name, type,
208 domain, _resolve_reply, extra, &rid) != SW_OKAY) 184 domain, _resolve_reply, extra, &rid) != SW_OKAY)
233 static int 209 static int
234 _dns_sd_publish(BonjourDnsSd *data, PublishType type) 210 _dns_sd_publish(BonjourDnsSd *data, PublishType type)
235 { 211 {
236 sw_text_record dns_data; 212 sw_text_record dns_data;
237 sw_result publish_result = SW_OKAY; 213 sw_result publish_result = SW_OKAY;
214 char portstring[6];
238 215
239 /* Fill the data for the service */ 216 /* Fill the data for the service */
240 if (sw_text_record_init(&dns_data) != SW_OKAY) 217 if (sw_text_record_init(&dns_data) != SW_OKAY)
241 { 218 {
242 gaim_debug_error("bonjour", "Unable to initialize the data for the mDNS.\n"); 219 gaim_debug_error("bonjour", "Unable to initialize the data for the mDNS.\n");
243 return -1; 220 return -1;
244 } 221 }
245 222
223 /* Convert the port to a string */
224 snprintf(portstring, sizeof(portstring), "%d", data->port_p2pj);
225
226 /* Publish standard records */
246 sw_text_record_add_key_and_string_value(dns_data, "txtvers", data->txtvers); 227 sw_text_record_add_key_and_string_value(dns_data, "txtvers", data->txtvers);
247 sw_text_record_add_key_and_string_value(dns_data, "version", data->version); 228 sw_text_record_add_key_and_string_value(dns_data, "version", data->version);
248 sw_text_record_add_key_and_string_value(dns_data, "1st", data->first); 229 sw_text_record_add_key_and_string_value(dns_data, "1st", data->first);
249 sw_text_record_add_key_and_string_value(dns_data, "last", data->last); 230 sw_text_record_add_key_and_string_value(dns_data, "last", data->last);
250 /* sw_text_record_add_key_and_string_value(dns_data, "port.p2pj", itoa(data->port_p2pj)); */ 231 sw_text_record_add_key_and_string_value(dns_data, "port.p2pj", portstring);
251 sw_text_record_add_key_and_string_value(dns_data, "port.p2pj", BONJOUR_DEFAULT_PORT);
252 sw_text_record_add_key_and_string_value(dns_data, "phsh", data->phsh); 232 sw_text_record_add_key_and_string_value(dns_data, "phsh", data->phsh);
253 sw_text_record_add_key_and_string_value(dns_data, "status", data->status); 233 sw_text_record_add_key_and_string_value(dns_data, "status", data->status);
254 sw_text_record_add_key_and_string_value(dns_data, "vc", data->vc); 234 sw_text_record_add_key_and_string_value(dns_data, "vc", data->vc);
255 235
236 /* Publish extra records */
256 if ((data->email != NULL) && (*data->email != '\0')) 237 if ((data->email != NULL) && (*data->email != '\0'))
257 sw_text_record_add_key_and_string_value(dns_data, "email", data->email); 238 sw_text_record_add_key_and_string_value(dns_data, "email", data->email);
258 239
259 if ((data->jid != NULL) && (*data->jid != '\0')) 240 if ((data->jid != NULL) && (*data->jid != '\0'))
260 sw_text_record_add_key_and_string_value(dns_data, "jid", data->jid); 241 sw_text_record_add_key_and_string_value(dns_data, "jid", data->jid);
278 sw_text_record_bytes(dns_data), sw_text_record_len(dns_data)); 259 sw_text_record_bytes(dns_data), sw_text_record_len(dns_data));
279 break; 260 break;
280 } 261 }
281 if (publish_result != SW_OKAY) 262 if (publish_result != SW_OKAY)
282 { 263 {
283 gaim_debug_error("bonjour", "Unable to publish or change the status of the _presence._tcp service."); 264 gaim_debug_error("bonjour", "Unable to publish or change the status of the _presence._tcp service.\n");
284 return -1; 265 return -1;
285 } 266 }
286 267
287 /* Free the memory used by temp data */ 268 /* Free the memory used by temp data */
288 sw_text_record_fina(dns_data); 269 sw_text_record_fina(dns_data);