comparison libpurple/protocols/bonjour/mdns_win32.c @ 18799:83719d57a8ee

Implement bonjour buddy icons in the win32 implementation. Avahi's howl wrapper doesn't implement sw_discovery_query_record(), so we can't do it elsewhere yet.
author Daniel Atallah <daniel.atallah@gmail.com>
date Sun, 05 Aug 2007 02:50:48 +0000
parents ed1def07d86e
children b839f427cbb2
comparison
equal deleted inserted replaced
18798:ed1def07d86e 18799:83719d57a8ee
27 typedef struct _ResolveCallbackArgs { 27 typedef struct _ResolveCallbackArgs {
28 DNSServiceRef resolver; 28 DNSServiceRef resolver;
29 guint resolver_handler; 29 guint resolver_handler;
30 30
31 PurpleDnsQueryData *query; 31 PurpleDnsQueryData *query;
32 gchar *fqn;
33 32
34 BonjourBuddy* buddy; 33 BonjourBuddy* buddy;
35 } ResolveCallbackArgs; 34 } ResolveCallbackArgs;
36 35
37 /* data used by win32 bonjour implementation */ 36 /* data used by win32 bonjour implementation */
43 } Win32SessionImplData; 42 } Win32SessionImplData;
44 43
45 typedef struct _win32_buddy_impl_data { 44 typedef struct _win32_buddy_impl_data {
46 DNSServiceRef txt_query; 45 DNSServiceRef txt_query;
47 guint txt_query_handler; 46 guint txt_query_handler;
47 DNSServiceRef null_query;
48 guint null_query_handler;
48 } Win32BuddyImplData; 49 } Win32BuddyImplData;
49 50
50 static void 51 static void
51 _mdns_handle_event(gpointer data, gint source, PurpleInputCondition condition) { 52 _mdns_handle_event(gpointer data, gint source, PurpleInputCondition condition) {
52 DNSServiceProcessResult((DNSServiceRef) data); 53 DNSServiceProcessResult((DNSServiceRef) data);
75 76
76 if (kDNSServiceErr_NoError != errorCode) 77 if (kDNSServiceErr_NoError != errorCode)
77 purple_debug_error("bonjour", "record query - callback error.\n"); 78 purple_debug_error("bonjour", "record query - callback error.\n");
78 else if (flags & kDNSServiceFlagsAdd) 79 else if (flags & kDNSServiceFlagsAdd)
79 { 80 {
80 /* New Buddy */ 81 if (rrtype == kDNSServiceType_TXT) {
81 BonjourBuddy *buddy = (BonjourBuddy*) context; 82 /* New Buddy */
82 _mdns_parse_text_record(buddy, rdata, rdlen); 83 BonjourBuddy *buddy = (BonjourBuddy*) context;
83 bonjour_buddy_add_to_purple(buddy); 84 _mdns_parse_text_record(buddy, rdata, rdlen);
85 bonjour_buddy_add_to_purple(buddy);
86 } else if (rrtype == kDNSServiceType_NULL) {
87 /* Buddy Icon response */
88 BonjourBuddy *buddy = (BonjourBuddy*) context;
89 Win32BuddyImplData *idata = buddy->mdns_impl_data;
90
91 g_return_if_fail(idata != NULL);
92
93 purple_buddy_icons_set_for_user(buddy->account, buddy->name,
94 g_memdup(rdata, rdlen), rdlen, buddy->phsh);
95
96 /* We've got what we need; stop listening */
97 purple_input_remove(idata->null_query_handler);
98 idata->null_query_handler = -1;
99 DNSServiceRefDeallocate(idata->null_query);
100 idata->null_query = NULL;
101 }
84 } 102 }
85 } 103 }
86 104
87 static void 105 static void
88 _mdns_resolve_host_callback(GSList *hosts, gpointer data, const char *error_message) 106 _mdns_resolve_host_callback(GSList *hosts, gpointer data, const char *error_message)
118 /* free the hosts list*/ 136 /* free the hosts list*/
119 g_slist_free(hosts); 137 g_slist_free(hosts);
120 138
121 /* free the remaining args memory */ 139 /* free the remaining args memory */
122 purple_dnsquery_destroy(args->query); 140 purple_dnsquery_destroy(args->query);
123 g_free(args->fqn);
124 g_free(args); 141 g_free(args);
125 } 142 }
126 143
127 static void DNSSD_API 144 static void DNSSD_API
128 _mdns_service_resolve_callback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, 145 _mdns_service_resolve_callback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode,
146 163
147 /* parse the text record */ 164 /* parse the text record */
148 _mdns_parse_text_record(args->buddy, txtRecord, txtLen); 165 _mdns_parse_text_record(args->buddy, txtRecord, txtLen);
149 166
150 /* set more arguments, and start the host resolver */ 167 /* set more arguments, and start the host resolver */
151 args->fqn = g_strdup(fullname); 168 args->buddy->full_service_name = g_strdup(fullname);
152 169
153 if (!(args->query = 170 if (!(args->query =
154 purple_dnsquery_a(hosttarget, port, _mdns_resolve_host_callback, args))) 171 purple_dnsquery_a(hosttarget, port, _mdns_resolve_host_callback, args)))
155 { 172 {
156 purple_debug_error("bonjour", "service resolver - host resolution failed.\n"); 173 purple_debug_error("bonjour", "service resolver - host resolution failed.\n");
157 bonjour_buddy_delete(args->buddy); 174 bonjour_buddy_delete(args->buddy);
158 g_free(args->fqn);
159 g_free(args); 175 g_free(args);
160 } 176 }
161 } 177 }
162 178
163 } 179 }
359 if (idata->txt_query != NULL) { 375 if (idata->txt_query != NULL) {
360 purple_input_remove(idata->txt_query_handler); 376 purple_input_remove(idata->txt_query_handler);
361 DNSServiceRefDeallocate(idata->txt_query); 377 DNSServiceRefDeallocate(idata->txt_query);
362 } 378 }
363 379
380 if (idata->null_query != NULL) {
381 purple_input_remove(idata->null_query_handler);
382 DNSServiceRefDeallocate(idata->null_query);
383 }
384
364 g_free(idata); 385 g_free(idata);
365 386
366 buddy->mdns_impl_data = NULL; 387 buddy->mdns_impl_data = NULL;
367 } 388 }
368 389
390 void bonjour_dns_sd_retrieve_buddy_icon(BonjourBuddy* buddy) {
391 Win32BuddyImplData *idata = buddy->mdns_impl_data;
392
393 g_return_if_fail(idata != NULL);
394
395 /* Cancel any existing query */
396 if (idata->null_query != NULL) {
397 purple_input_remove(idata->null_query_handler);
398 idata->null_query_handler = 0;
399 DNSServiceRefDeallocate(idata->null_query);
400 idata->null_query = NULL;
401 }
402
403 if (kDNSServiceErr_NoError == DNSServiceQueryRecord(&idata->null_query, 0, 0, buddy->full_service_name,
404 kDNSServiceType_NULL, kDNSServiceClass_IN, _mdns_text_record_query_callback, buddy)) {
405 int fd = DNSServiceRefSockFD(idata->null_query);
406 idata->null_query_handler = purple_input_add(fd, PURPLE_INPUT_READ, _mdns_handle_event, idata->null_query);
407 }
408
409 }
410