1/* $Id$ */ 2 3/*** 4 This file is part of avahi. 5 6 avahi is free software; you can redistribute it and/or modify it 7 under the terms of the GNU Lesser General Public License as 8 published by the Free Software Foundation; either version 2.1 of the 9 License, or (at your option) any later version. 10 11 avahi is distributed in the hope that it will be useful, but WITHOUT 12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 14 Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public 17 License along with avahi; if not, write to the Free Software 18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 19 USA. 20***/ 21 22#ifdef HAVE_CONFIG_H 23#include <config.h> 24#endif 25 26#include <string.h> 27 28#include <avahi-common/malloc.h> 29#include <avahi-common/dbus.h> 30#include <avahi-common/error.h> 31#include <avahi-core/log.h> 32 33#include "dbus-util.h" 34#include "dbus-internal.h" 35#include "main.h" 36 37void avahi_dbus_sync_service_resolver_free(SyncServiceResolverInfo *i) { 38 assert(i); 39 40 if (i->service_resolver) 41 avahi_s_service_resolver_free(i->service_resolver); 42 dbus_message_unref(i->message); 43 AVAHI_LLIST_REMOVE(SyncServiceResolverInfo, sync_service_resolvers, i->client->sync_service_resolvers, i); 44 45 i->client->n_objects--; 46 assert(i->client->n_objects >= 0); 47 48 avahi_free(i); 49} 50 51void avahi_dbus_sync_service_resolver_callback( 52 AvahiSServiceResolver *r, 53 AvahiIfIndex interface, 54 AvahiProtocol protocol, 55 AvahiResolverEvent event, 56 const char *name, 57 const char *type, 58 const char *domain, 59 const char *host_name, 60 const AvahiAddress *a, 61 uint16_t port, 62 AvahiStringList *txt, 63 AvahiLookupResultFlags flags, 64 void* userdata) { 65 66 SyncServiceResolverInfo *i = userdata; 67 68 assert(r); 69 assert(i); 70 71 if (event == AVAHI_RESOLVER_FOUND) { 72 char t[AVAHI_ADDRESS_STR_MAX], *pt = t; 73 int32_t i_interface, i_protocol, i_aprotocol; 74 uint32_t u_flags; 75 DBusMessage *reply; 76 77 assert(host_name); 78 79 if (!name) 80 name = ""; 81 82 if (a) 83 avahi_address_snprint(t, sizeof(t), a); 84 else 85 t[0] = 0; 86 87 /* Patch in AVAHI_LOOKUP_RESULT_OUR_OWN */ 88 89 if (avahi_dbus_is_our_own_service(i->client, interface, protocol, name, type, domain) > 0) 90 flags |= AVAHI_LOOKUP_RESULT_OUR_OWN; 91 92 i_interface = (int32_t) interface; 93 i_protocol = (int32_t) protocol; 94 if (a) 95 i_aprotocol = (int32_t) a->proto; 96 else 97 i_aprotocol = AVAHI_PROTO_UNSPEC; 98 u_flags = (uint32_t) flags; 99 100 reply = dbus_message_new_method_return(i->message); 101 dbus_message_append_args( 102 reply, 103 DBUS_TYPE_INT32, &i_interface, 104 DBUS_TYPE_INT32, &i_protocol, 105 DBUS_TYPE_STRING, &name, 106 DBUS_TYPE_STRING, &type, 107 DBUS_TYPE_STRING, &domain, 108 DBUS_TYPE_STRING, &host_name, 109 DBUS_TYPE_INT32, &i_aprotocol, 110 DBUS_TYPE_STRING, &pt, 111 DBUS_TYPE_UINT16, &port, 112 DBUS_TYPE_INVALID); 113 114 avahi_dbus_append_string_list(reply, txt); 115 116 dbus_message_append_args( 117 reply, 118 DBUS_TYPE_UINT32, &u_flags, 119 DBUS_TYPE_INVALID); 120 121 dbus_connection_send(server->bus, reply, NULL); 122 dbus_message_unref(reply); 123 } else { 124 assert(event == AVAHI_RESOLVER_FAILURE); 125 126 avahi_dbus_respond_error(server->bus, i->message, avahi_server_errno(avahi_server), NULL); 127 } 128 129 avahi_dbus_sync_service_resolver_free(i); 130} 131