# HG changeset patch # User Daniel Atallah # Date 1181081590 0 # Node ID c96b085ddf5c93836be07807af0b44b516643cbb # Parent bca2780f7669f76e636fa813a5a1049ff8de2488 Clean up Bonjour service publishing and improve XEP-0174 compliance. diff -r bca2780f7669 -r c96b085ddf5c libpurple/protocols/bonjour/bonjour.c --- a/libpurple/protocols/bonjour/bonjour.c Tue Jun 05 21:32:28 2007 +0000 +++ b/libpurple/protocols/bonjour/bonjour.c Tue Jun 05 22:13:10 2007 +0000 @@ -120,17 +120,11 @@ /* Connect to the mDNS daemon looking for buddies in the LAN */ bd->dns_sd_data = bonjour_dns_sd_new(); - bd->dns_sd_data->name = purple_account_get_username(account); - bd->dns_sd_data->txtvers = g_strdup("1"); - bd->dns_sd_data->version = g_strdup("1"); bd->dns_sd_data->first = g_strdup(purple_account_get_string(account, "first", default_firstname)); bd->dns_sd_data->last = g_strdup(purple_account_get_string(account, "last", default_lastname)); bd->dns_sd_data->port_p2pj = bd->jabber_data->port; - bd->dns_sd_data->phsh = g_strdup(""); - bd->dns_sd_data->email = g_strdup(purple_account_get_string(account, "email", "")); - bd->dns_sd_data->vc = g_strdup(""); - bd->dns_sd_data->jid = g_strdup(purple_account_get_string(account, "jid", "")); - bd->dns_sd_data->AIM = g_strdup(purple_account_get_string(account, "AIM", "")); + /* Not engaged in AV conference */ + bd->dns_sd_data->vc = g_strdup("!"); status = purple_account_get_active_status(account); presence = purple_account_get_presence(account); diff -r bca2780f7669 -r c96b085ddf5c libpurple/protocols/bonjour/mdns_common.c --- a/libpurple/protocols/bonjour/mdns_common.c Tue Jun 05 21:32:28 2007 +0000 +++ b/libpurple/protocols/bonjour/mdns_common.c Tue Jun 05 22:13:10 2007 +0000 @@ -42,7 +42,10 @@ { g_free(data->first); g_free(data->last); - g_free(data->email); + g_free(data->phsh); + g_free(data->status); + g_free(data->vc); + g_free(data->msg); g_free(data); } @@ -82,8 +85,7 @@ gc = purple_account_get_connection(account); /* Initialize the dns-sd data and session */ - -#ifndef USE_BONJOUR_APPLE +#ifndef USE_BONJOUR_APPLE if (sw_discovery_init(&data->session) != SW_OKAY) { purple_debug_error("bonjour", "Unable to initialize an mDNS session.\n"); @@ -105,7 +107,6 @@ /* Advise the daemon that we are waiting for connections */ #ifdef USE_BONJOUR_APPLE - printf("account pointer here is %x\n,", account); if (DNSServiceBrowse(&data->browser, 0, 0, ICHAT_SERVICE, NULL, _mdns_service_browse_callback, account) != kDNSServiceErr_NoError) #else /* USE_BONJOUR_HOWL */ @@ -120,16 +121,16 @@ /* Get the socket that communicates with the mDNS daemon and bind it to a */ /* callback that will handle the dns_sd packets */ -#ifdef USE_BONJOUR_APPLE +#ifdef USE_BONJOUR_APPLE dns_sd_socket = DNSServiceRefSockFD(data->browser); opaque_data = data->browser; #else /* USE_BONJOUR_HOWL */ dns_sd_socket = sw_discovery_socket(data->session); opaque_data = data->session; #endif - + gc->inpa = purple_input_add(dns_sd_socket, PURPLE_INPUT_READ, - _mdns_handle_event, opaque_data); + _mdns_handle_event, opaque_data); return TRUE; } @@ -144,14 +145,14 @@ PurpleAccount *account; PurpleConnection *gc; -#ifdef USE_BONJOUR_APPLE - if (NULL == data->advertisement || NULL == data->browser) +#ifdef USE_BONJOUR_APPLE + if (data->advertisement == NULL || data->browser == NULL) #else /* USE_BONJOUR_HOWL */ if (data->session == NULL) #endif return; -#ifdef USE_BONJOUR_HOWL +#ifdef USE_BONJOUR_HOWL sw_discovery_cancel(data->session, data->session_id); #endif @@ -159,7 +160,7 @@ gc = purple_account_get_connection(account); purple_input_remove(gc->inpa); -#ifdef USE_BONJOUR_APPLE +#ifdef USE_BONJOUR_APPLE /* hack: for win32, we need to stop listening to the advertisement pipe too */ purple_input_remove(data->advertisement_fd); diff -r bca2780f7669 -r c96b085ddf5c libpurple/protocols/bonjour/mdns_howl.c --- a/libpurple/protocols/bonjour/mdns_howl.c Tue Jun 05 21:32:28 2007 +0000 +++ b/libpurple/protocols/bonjour/mdns_howl.c Tue Jun 05 22:13:10 2007 +0000 @@ -113,7 +113,7 @@ } else if (strcmp(key, "msg") == 0) { g_free(buddy->msg); buddy->msg = g_strdup(value); - } + } } } @@ -198,6 +198,7 @@ sw_text_record dns_data; sw_result publish_result = SW_OKAY; char portstring[6]; + const char *jid, *aim, *email; /* Fill the data for the service */ if (sw_text_record_init(&dns_data) != SW_OKAY) @@ -209,34 +210,46 @@ /* Convert the port to a string */ snprintf(portstring, sizeof(portstring), "%d", data->port_p2pj); - /* Publish standard records */ - sw_text_record_add_key_and_string_value(dns_data, "txtvers", data->txtvers); - sw_text_record_add_key_and_string_value(dns_data, "version", data->version); - sw_text_record_add_key_and_string_value(dns_data, "1st", data->first); - sw_text_record_add_key_and_string_value(dns_data, "last", data->last); - sw_text_record_add_key_and_string_value(dns_data, "port.p2pj", portstring); - sw_text_record_add_key_and_string_value(dns_data, "phsh", data->phsh); - sw_text_record_add_key_and_string_value(dns_data, "status", data->status); - sw_text_record_add_key_and_string_value(dns_data, "vc", data->vc); + jid = purple_account_get_string(data->account, "jid", NULL); + aim = purple_account_get_string(data->account, "AIM", NULL); + email = purple_account_get_string(data->account, "email", NULL); + + /* We should try to follow XEP-0174, but some clients have "issues", so we humor them. + * See http://telepathy.freedesktop.org/wiki/SalutInteroperability + */ - /* Publish extra records */ - if ((data->email != NULL) && (*data->email != '\0')) - sw_text_record_add_key_and_string_value(dns_data, "email", data->email); + /* Needed by iChat */ + sw_text_record_add_key_and_string_value(dns_data, "txtvers", "1"); + /* Needed by Gaim/Pidgin <= 2.0.1 (remove at some point) */ + sw_text_record_add_key_and_string_value(dns_data, "1st", data->first); + /* Needed by Gaim/Pidgin <= 2.0.1 (remove at some point) */ + sw_text_record_add_key_and_string_value(dns_data, "last", data->last); + /* Needed by Adium */ + sw_text_record_add_key_and_string_value(dns_data, "port.p2pj", portstring); + /* Needed by iChat, Gaim/Pidgin <= 2.0.1 */ + sw_text_record_add_key_and_string_value(dns_data, "status", data->status); + /* Currently always set to "!" since we don't support AV and wont ever be in a conference */ + sw_text_record_add_key_and_string_value(dns_data, "vc", data->vc); + sw_text_record_add_key_and_string_value(dns_data, "ver", VERSION); + if (email != NULL && *email != '\0') + sw_text_record_add_key_and_string_value(dns_data, "email", email); + if (jid != NULL && *jid != '\0') + sw_text_record_add_key_and_string_value(dns_data, "jid", jid); + /* Nonstandard, but used by iChat */ + if (aim != NULL && *aim != '\0') + sw_text_record_add_key_and_string_value(dns_data, "AIM", aim); + if (data->msg != NULL && *data->msg != '\0') + sw_text_record_add_key_and_string_value(dns_data, "msg", data->msg); + if (data->phsh != NULL && *data->phsh != '\0') + sw_text_record_add_key_and_string_value(dns_data, "phsh", data->phsh); - if ((data->jid != NULL) && (*data->jid != '\0')) - sw_text_record_add_key_and_string_value(dns_data, "jid", data->jid); - - if ((data->AIM != NULL) && (*data->AIM != '\0')) - sw_text_record_add_key_and_string_value(dns_data, "AIM", data->AIM); - - if ((data->msg != NULL) && (*data->msg != '\0')) - sw_text_record_add_key_and_string_value(dns_data, "msg", data->msg); + /* TODO: ext, nick, node */ /* Publish the service */ switch (type) { case PUBLISH_START: - publish_result = sw_discovery_publish(data->session, 0, data->name, ICHAT_SERVICE, NULL, + publish_result = sw_discovery_publish(data->session, 0, purple_account_get_username(data->account), ICHAT_SERVICE, NULL, NULL, data->port_p2pj, sw_text_record_bytes(dns_data), sw_text_record_len(dns_data), _publish_reply, NULL, &data->session_id); break; diff -r bca2780f7669 -r c96b085ddf5c libpurple/protocols/bonjour/mdns_types.h --- a/libpurple/protocols/bonjour/mdns_types.h Tue Jun 05 21:32:28 2007 +0000 +++ b/libpurple/protocols/bonjour/mdns_types.h Tue Jun 05 22:13:10 2007 +0000 @@ -21,7 +21,7 @@ #include "account.h" #include "config.h" -#ifdef USE_BONJOUR_APPLE +#ifdef USE_BONJOUR_APPLE #include "dns_sd_proxy.h" #else /* USE_BONJOUR_HOWL */ #include @@ -34,10 +34,10 @@ */ typedef struct _BonjourDnsSd { -#ifdef USE_BONJOUR_APPLE +#ifdef USE_BONJOUR_APPLE DNSServiceRef advertisement; DNSServiceRef browser; - + int advertisement_fd; /* hack... windows bonjour is broken, so we have to have this */ #else /* USE_BONJOUR_HOWL */ sw_discovery session; @@ -45,20 +45,13 @@ #endif PurpleAccount *account; - const char *name; - gchar *txtvers; - gchar *version; gchar *first; gchar *last; gint port_p2pj; gchar *phsh; gchar *status; - gchar *email; gchar *vc; - gchar *jid; - gchar *AIM; gchar *msg; - GHashTable *buddies; } BonjourDnsSd; typedef enum _PublishType { diff -r bca2780f7669 -r c96b085ddf5c libpurple/protocols/bonjour/mdns_win32.c --- a/libpurple/protocols/bonjour/mdns_win32.c Tue Jun 05 21:32:28 2007 +0000 +++ b/libpurple/protocols/bonjour/mdns_win32.c Tue Jun 05 22:13:10 2007 +0000 @@ -235,46 +235,56 @@ TXTRecordRef dns_data; char portstring[6]; int ret = 0; - + const char *jid, *aim, *email; + DNSServiceErrorType set_ret; + TXTRecordCreate(&dns_data, 256, NULL); /* Convert the port to a string */ snprintf(portstring, sizeof(portstring), "%d", data->port_p2pj); - - /* Publish standard records */ + + jid = purple_account_get_string(data->account, "jid", NULL); + aim = purple_account_get_string(data->account, "AIM", NULL); + email = purple_account_get_string(data->account, "email", NULL); + + /* We should try to follow XEP-0174, but some clients have "issues", so we humor them. + * See http://telepathy.freedesktop.org/wiki/SalutInteroperability + */ - if (kDNSServiceErr_NoError != TXTRecordSetValue(&dns_data, "txtvers", strlen(data->txtvers), data->txtvers) || - kDNSServiceErr_NoError != TXTRecordSetValue(&dns_data, "version", strlen(data->version), data->version) || - kDNSServiceErr_NoError != TXTRecordSetValue(&dns_data, "1st", strlen(data->first), data->first) || - kDNSServiceErr_NoError != TXTRecordSetValue(&dns_data, "last", strlen(data->last), data->last) || - kDNSServiceErr_NoError != TXTRecordSetValue(&dns_data, "port", strlen(portstring), portstring) || - kDNSServiceErr_NoError != TXTRecordSetValue(&dns_data, "phsh", strlen(data->phsh), data->phsh) || - kDNSServiceErr_NoError != TXTRecordSetValue(&dns_data, "status", strlen(data->status), data->status) || - kDNSServiceErr_NoError != TXTRecordSetValue(&dns_data, "vc", strlen(data->vc), data->vc)) - { - purple_debug_error("bonjour", "Unable to allocate memory for text record.\n"); - ret = -1; - } - else if ((data->email != NULL) && (*data->email != '\0') && - kDNSServiceErr_NoError != TXTRecordSetValue(&dns_data, "email", strlen(data->email), data->email)) - { - purple_debug_error("bonjour", "Unable to allocate memory for text record.\n"); - ret = -1; - } - else if ((data->jid != NULL) && (*data->jid != '\0') && - kDNSServiceErr_NoError != TXTRecordSetValue(&dns_data, "email", strlen(data->jid), data->jid)) - { - purple_debug_error("bonjour", "Unable to allocate memory for text record.\n"); - ret = -1; - } - else if ((data->AIM != NULL) && (*data->AIM != '\0') && - kDNSServiceErr_NoError != TXTRecordSetValue(&dns_data, "AIM", strlen(data->AIM), data->AIM)) - { - purple_debug_error("bonjour", "Unable to allocate memory for text record.\n"); - ret = -1; - } - else if ((data->msg != NULL) && (*data->msg != '\0') && - kDNSServiceErr_NoError != TXTRecordSetValue(&dns_data, "msg", strlen(data->msg), data->msg)) + /* Needed by iChat */ + set_ret = TXTRecordSetValue(&dns_data, "txtvers", 1, "1"); + /* Needed by Gaim/Pidgin <= 2.0.1 (remove at some point) */ + if (set_ret == kDNSServiceErr_NoError) + set_ret = TXTRecordSetValue(&dns_data, "1st", strlen(data->first), data->first); + /* Needed by Gaim/Pidgin <= 2.0.1 (remove at some point) */ + if (set_ret == kDNSServiceErr_NoError) + set_ret = TXTRecordSetValue(&dns_data, "last", strlen(data->last), data->last); + /* Needed by Adium */ + if (set_ret == kDNSServiceErr_NoError) + set_ret = TXTRecordSetValue(&dns_data, "port.p2pj", strlen(portstring), portstring); + /* Needed by iChat, Gaim/Pidgin <= 2.0.1 */ + if (set_ret == kDNSServiceErr_NoError) + set_ret = TXTRecordSetValue(&dns_data, "status", strlen(data->status), data->status); + if (set_ret == kDNSServiceErr_NoError) + set_ret = TXTRecordSetValue(&dns_data, "ver", strlen(VERSION), VERSION); + /* Currently always set to "!" since we don't support AV and wont ever be in a conference */ + if (set_ret == kDNSServiceErr_NoError) + set_ret = TXTRecordSetValue(&dns_data, "vc", strlen(data->vc), data->vc); + if (set_ret == kDNSServiceErr_NoError && email != NULL && *email != '\0') + set_ret = TXTRecordSetValue(&dns_data, "email", strlen(email), email); + if (set_ret == kDNSServiceErr_NoError && jid != NULL && *jid != '\0') + set_ret = TXTRecordSetValue(&dns_data, "jid", strlen(jid), jid); + /* Nonstandard, but used by iChat */ + if (set_ret == kDNSServiceErr_NoError && aim != NULL && *aim != '\0') + set_ret = TXTRecordSetValue(&dns_data, "AIM", strlen(aim), aim); + if (set_ret == kDNSServiceErr_NoError && data->msg != NULL && *data->msg != '\0') + set_ret = TXTRecordSetValue(&dns_data, "msg", strlen(data->msg), data->msg); + if (set_ret == kDNSServiceErr_NoError && data->phsh != NULL && *data->phsh != '\0') + set_ret = TXTRecordSetValue(&dns_data, "phsh", strlen(data->phsh), data->phsh); + + /* TODO: ext, nick, node */ + + if (set_ret != kDNSServiceErr_NoError) { purple_debug_error("bonjour", "Unable to allocate memory for text record.\n"); ret = -1; @@ -288,7 +298,7 @@ switch (type) { case PUBLISH_START: - err = DNSServiceRegister(&data->advertisement, 0, 0, data->name, ICHAT_SERVICE, + err = DNSServiceRegister(&data->advertisement, 0, 0, purple_account_get_username(data->account), ICHAT_SERVICE, NULL, NULL, data->port_p2pj, TXTRecordGetLength(&dns_data), TXTRecordGetBytesPtr(&dns_data), _mdns_service_register_callback, NULL); break;