gchar * g_vfs_normalize_encoded_dns_sd_triple (const gchar *encoded_triple) { char *service_name; char *service_type; char *domain; char *ret; ret = NULL; if (!g_vfs_decode_dns_sd_triple (encoded_triple, &service_name, &service_type, &domain, NULL)) goto out; ret = g_vfs_encode_dns_sd_triple (service_name, service_type, domain); g_free (service_name); g_free (service_type); g_free (domain); out: return ret; }
static void g_vfs_dns_sd_resolver_constructed (GObject *object) { GVfsDnsSdResolver *resolver; resolver = G_VFS_DNS_SD_RESOLVER (object); if (resolver->encoded_triple != NULL) { GError *error; if (resolver->service_name != NULL) { g_warning ("Ignoring service-name since encoded-triple is already set"); g_free (resolver->service_name); resolver->service_name = NULL; } if (resolver->service_type != NULL) { g_warning ("Ignoring service-type since encoded-triple is already set"); g_free (resolver->service_type); resolver->service_type = NULL; } if (resolver->domain != NULL) { g_warning ("Ignoring domain since encoded-triple is already set"); g_free (resolver->domain); resolver->domain = NULL; } error = NULL; if (!g_vfs_decode_dns_sd_triple (resolver->encoded_triple, &(resolver->service_name), &(resolver->service_type), &(resolver->domain), &error)) { /* GObject construction can't fail. So whine if the triple isn't valid. */ g_warning ("Malformed construction data passed: %s", error->message); g_error_free (error); g_free (resolver->encoded_triple); g_free (resolver->service_name); g_free (resolver->service_type); g_free (resolver->domain); resolver->encoded_triple = NULL; resolver->service_name = NULL; resolver->service_type = NULL; resolver->domain = NULL; goto out; } } /* Always set encoded triple to what we encode; this is because we can decode * an encoded triple that isn't 100% properly URI encoded, e.g. * * "davidz's public files on quad.fubar.dk._webdav._tcp.local" * * will be properly decoded. But we want to return a properly URI encoded triple * * "davidz%27s%20public%20files%20on%20quad%2efubar%2edk._webdav._tcp.local" * * for e.g. setting the GMountSpec. This is useful because the use can * put the former into the pathbar in a file manager and then it will * be properly rewritten on mount. */ g_free (resolver->encoded_triple); resolver->encoded_triple = g_vfs_encode_dns_sd_triple (resolver->service_name, resolver->service_type, resolver->domain); /* start resolving immediately */ ensure_avahi_resolver (resolver); resolvers = g_list_prepend (resolvers, resolver); out: if (G_OBJECT_CLASS (g_vfs_dns_sd_resolver_parent_class)->constructed != NULL) G_OBJECT_CLASS (g_vfs_dns_sd_resolver_parent_class)->constructed (object); }