comparison libpurple/protocols/bonjour/mdns_howl.c @ 17739:c96b085ddf5c

Clean up Bonjour service publishing and improve XEP-0174 compliance.
author Daniel Atallah <daniel.atallah@gmail.com>
date Tue, 05 Jun 2007 22:13:10 +0000
parents d7b50cac1c7a
children c921f901c7ea
comparison
equal deleted inserted replaced
17738:bca2780f7669 17739:c96b085ddf5c
111 g_free(buddy->phsh); 111 g_free(buddy->phsh);
112 buddy->phsh = g_strdup(value); 112 buddy->phsh = g_strdup(value);
113 } else if (strcmp(key, "msg") == 0) { 113 } else if (strcmp(key, "msg") == 0) {
114 g_free(buddy->msg); 114 g_free(buddy->msg);
115 buddy->msg = g_strdup(value); 115 buddy->msg = g_strdup(value);
116 } 116 }
117 } 117 }
118 } 118 }
119 119
120 if (!bonjour_buddy_check(buddy)) 120 if (!bonjour_buddy_check(buddy))
121 { 121 {
196 _mdns_publish(BonjourDnsSd *data, PublishType type) 196 _mdns_publish(BonjourDnsSd *data, PublishType type)
197 { 197 {
198 sw_text_record dns_data; 198 sw_text_record dns_data;
199 sw_result publish_result = SW_OKAY; 199 sw_result publish_result = SW_OKAY;
200 char portstring[6]; 200 char portstring[6];
201 const char *jid, *aim, *email;
201 202
202 /* Fill the data for the service */ 203 /* Fill the data for the service */
203 if (sw_text_record_init(&dns_data) != SW_OKAY) 204 if (sw_text_record_init(&dns_data) != SW_OKAY)
204 { 205 {
205 purple_debug_error("bonjour", "Unable to initialize the data for the mDNS.\n"); 206 purple_debug_error("bonjour", "Unable to initialize the data for the mDNS.\n");
207 } 208 }
208 209
209 /* Convert the port to a string */ 210 /* Convert the port to a string */
210 snprintf(portstring, sizeof(portstring), "%d", data->port_p2pj); 211 snprintf(portstring, sizeof(portstring), "%d", data->port_p2pj);
211 212
212 /* Publish standard records */ 213 jid = purple_account_get_string(data->account, "jid", NULL);
213 sw_text_record_add_key_and_string_value(dns_data, "txtvers", data->txtvers); 214 aim = purple_account_get_string(data->account, "AIM", NULL);
214 sw_text_record_add_key_and_string_value(dns_data, "version", data->version); 215 email = purple_account_get_string(data->account, "email", NULL);
216
217 /* We should try to follow XEP-0174, but some clients have "issues", so we humor them.
218 * See http://telepathy.freedesktop.org/wiki/SalutInteroperability
219 */
220
221 /* Needed by iChat */
222 sw_text_record_add_key_and_string_value(dns_data, "txtvers", "1");
223 /* Needed by Gaim/Pidgin <= 2.0.1 (remove at some point) */
215 sw_text_record_add_key_and_string_value(dns_data, "1st", data->first); 224 sw_text_record_add_key_and_string_value(dns_data, "1st", data->first);
225 /* Needed by Gaim/Pidgin <= 2.0.1 (remove at some point) */
216 sw_text_record_add_key_and_string_value(dns_data, "last", data->last); 226 sw_text_record_add_key_and_string_value(dns_data, "last", data->last);
227 /* Needed by Adium */
217 sw_text_record_add_key_and_string_value(dns_data, "port.p2pj", portstring); 228 sw_text_record_add_key_and_string_value(dns_data, "port.p2pj", portstring);
218 sw_text_record_add_key_and_string_value(dns_data, "phsh", data->phsh); 229 /* Needed by iChat, Gaim/Pidgin <= 2.0.1 */
219 sw_text_record_add_key_and_string_value(dns_data, "status", data->status); 230 sw_text_record_add_key_and_string_value(dns_data, "status", data->status);
231 /* Currently always set to "!" since we don't support AV and wont ever be in a conference */
220 sw_text_record_add_key_and_string_value(dns_data, "vc", data->vc); 232 sw_text_record_add_key_and_string_value(dns_data, "vc", data->vc);
221 233 sw_text_record_add_key_and_string_value(dns_data, "ver", VERSION);
222 /* Publish extra records */ 234 if (email != NULL && *email != '\0')
223 if ((data->email != NULL) && (*data->email != '\0')) 235 sw_text_record_add_key_and_string_value(dns_data, "email", email);
224 sw_text_record_add_key_and_string_value(dns_data, "email", data->email); 236 if (jid != NULL && *jid != '\0')
225 237 sw_text_record_add_key_and_string_value(dns_data, "jid", jid);
226 if ((data->jid != NULL) && (*data->jid != '\0')) 238 /* Nonstandard, but used by iChat */
227 sw_text_record_add_key_and_string_value(dns_data, "jid", data->jid); 239 if (aim != NULL && *aim != '\0')
228 240 sw_text_record_add_key_and_string_value(dns_data, "AIM", aim);
229 if ((data->AIM != NULL) && (*data->AIM != '\0')) 241 if (data->msg != NULL && *data->msg != '\0')
230 sw_text_record_add_key_and_string_value(dns_data, "AIM", data->AIM);
231
232 if ((data->msg != NULL) && (*data->msg != '\0'))
233 sw_text_record_add_key_and_string_value(dns_data, "msg", data->msg); 242 sw_text_record_add_key_and_string_value(dns_data, "msg", data->msg);
243 if (data->phsh != NULL && *data->phsh != '\0')
244 sw_text_record_add_key_and_string_value(dns_data, "phsh", data->phsh);
245
246 /* TODO: ext, nick, node */
234 247
235 /* Publish the service */ 248 /* Publish the service */
236 switch (type) 249 switch (type)
237 { 250 {
238 case PUBLISH_START: 251 case PUBLISH_START:
239 publish_result = sw_discovery_publish(data->session, 0, data->name, ICHAT_SERVICE, NULL, 252 publish_result = sw_discovery_publish(data->session, 0, purple_account_get_username(data->account), ICHAT_SERVICE, NULL,
240 NULL, data->port_p2pj, sw_text_record_bytes(dns_data), sw_text_record_len(dns_data), 253 NULL, data->port_p2pj, sw_text_record_bytes(dns_data), sw_text_record_len(dns_data),
241 _publish_reply, NULL, &data->session_id); 254 _publish_reply, NULL, &data->session_id);
242 break; 255 break;
243 case PUBLISH_UPDATE: 256 case PUBLISH_UPDATE:
244 publish_result = sw_discovery_publish_update(data->session, data->session_id, 257 publish_result = sw_discovery_publish_update(data->session, data->session_id,