Mercurial > pidgin
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 |