Exemple #1
0
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;
}
Exemple #2
0
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);
}