Blame src/gom-dlna-servers-manager.c

Packit f01ec2
/*
Packit f01ec2
 * GNOME Online Miners - crawls through your online content
Packit f01ec2
 * Copyright (c) 2014 Pranav Kant
Packit f01ec2
 *
Packit f01ec2
 * This program is free software; you can redistribute it and/or
Packit f01ec2
 * modify it under the terms of the GNU General Public License
Packit f01ec2
 * as published by the Free Software Foundation; either version 2
Packit f01ec2
 * of the License, or (at your option) any later version.
Packit f01ec2
 *
Packit f01ec2
 * This program is distributed in the hope that it will be useful,
Packit f01ec2
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit f01ec2
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit f01ec2
 * GNU General Public License for more details.
Packit f01ec2
 *
Packit f01ec2
 * You should have received a copy of the GNU General Public License
Packit f01ec2
 * along with this program; if not, write to the Free Software
Packit f01ec2
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit f01ec2
 * 02110-1301, USA.
Packit f01ec2
 *
Packit f01ec2
 * Author: Pranav Kant <pranav913@gmail.com>
Packit f01ec2
 *
Packit f01ec2
 */
Packit f01ec2
Packit f01ec2
#include "config.h"
Packit f01ec2
Packit f01ec2
#include <gio/gio.h>
Packit f01ec2
Packit f01ec2
#include "gom-dleyna-server-manager.h"
Packit f01ec2
#include "gom-dlna-servers-manager.h"
Packit f01ec2
#include "gom-dlna-server.h"
Packit f01ec2
Packit f01ec2
struct _GomDlnaServersManagerPrivate
Packit f01ec2
{
Packit f01ec2
  DleynaServerManager *proxy;
Packit f01ec2
  GHashTable *servers;
Packit f01ec2
  GHashTable *udn_to_server;
Packit f01ec2
  GError *error;
Packit f01ec2
};
Packit f01ec2
Packit f01ec2
enum
Packit f01ec2
{
Packit f01ec2
  SERVER_FOUND,
Packit f01ec2
  SERVER_LOST,
Packit f01ec2
  LAST_SIGNAL
Packit f01ec2
};
Packit f01ec2
Packit f01ec2
static guint signals[LAST_SIGNAL] = { 0 };
Packit f01ec2
Packit f01ec2
Packit f01ec2
G_DEFINE_TYPE_WITH_PRIVATE (GomDlnaServersManager, gom_dlna_servers_manager, G_TYPE_OBJECT)
Packit f01ec2
Packit f01ec2
Packit f01ec2
static GObject *gom_dlna_servers_manager_singleton = NULL;
Packit f01ec2
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
gom_dlna_servers_manager_dispose (GObject *object)
Packit f01ec2
{
Packit f01ec2
  GomDlnaServersManager *self = GOM_DLNA_SERVERS_MANAGER (object);
Packit f01ec2
  GomDlnaServersManagerPrivate *priv = self->priv;
Packit f01ec2
Packit f01ec2
  g_clear_object (&priv->proxy);
Packit f01ec2
  g_clear_pointer (&priv->servers, g_hash_table_unref);
Packit f01ec2
  g_clear_pointer (&priv->udn_to_server, g_hash_table_unref);
Packit f01ec2
  g_clear_error (&priv->error);
Packit f01ec2
Packit f01ec2
  G_OBJECT_CLASS (gom_dlna_servers_manager_parent_class)->dispose (object);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
gom_dlna_servers_manager_server_found_cb (GomDlnaServersManager *self,
Packit f01ec2
                                          const gchar           *object_path,
Packit f01ec2
                                          gpointer              *data)
Packit f01ec2
{
Packit f01ec2
  GomDlnaServersManagerPrivate *priv = self->priv;
Packit f01ec2
  GError *error = NULL;
Packit f01ec2
  GomDlnaServer *server;
Packit f01ec2
  const gchar *udn;
Packit f01ec2
Packit f01ec2
  server = gom_dlna_server_new_for_bus (G_BUS_TYPE_SESSION,
Packit f01ec2
                                        G_DBUS_PROXY_FLAGS_NONE,
Packit f01ec2
                                        "com.intel.dleyna-server",
Packit f01ec2
                                        object_path,
Packit f01ec2
                                        NULL, /* GCancellable */
Packit f01ec2
                                        &error);
Packit f01ec2
Packit f01ec2
  if (error != NULL)
Packit f01ec2
    {
Packit f01ec2
      g_warning ("Error initializing new Server : %s",
Packit f01ec2
                 error->message);
Packit f01ec2
      g_error_free (error);
Packit f01ec2
      return;
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  udn = gom_dlna_server_get_udn (server);
Packit f01ec2
  g_debug ("%s '%s' %s %s",
Packit f01ec2
           G_STRFUNC,
Packit f01ec2
           gom_dlna_server_get_friendly_name (server),
Packit f01ec2
           udn,
Packit f01ec2
           object_path);
Packit f01ec2
  g_hash_table_insert (priv->servers, (gpointer) object_path, server);
Packit f01ec2
  g_hash_table_insert (priv->udn_to_server, (gpointer) udn, server);
Packit f01ec2
  g_signal_emit (self, signals[SERVER_FOUND], 0, server);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
gom_dlna_servers_manager_server_lost_cb (GomDlnaServersManager *self,
Packit f01ec2
                                         const gchar           *object_path,
Packit f01ec2
                                         gpointer              *data)
Packit f01ec2
{
Packit f01ec2
  GomDlnaServersManagerPrivate *priv = self->priv;
Packit f01ec2
  GomDlnaServer *server;
Packit f01ec2
  const gchar *udn;
Packit f01ec2
Packit f01ec2
  server = GOM_DLNA_SERVER (g_hash_table_lookup (priv->servers, object_path));
Packit f01ec2
  g_return_if_fail (server != NULL);
Packit f01ec2
Packit f01ec2
  udn = gom_dlna_server_get_udn (server);
Packit f01ec2
  /* By using g_hash_table_steal instead of remove, we delay deallocation
Packit f01ec2
     of 'server' until all of its associations from all
Packit f01ec2
     hashtables are removed. */
Packit f01ec2
  g_hash_table_steal (priv->udn_to_server, udn);
Packit f01ec2
  g_hash_table_steal (priv->servers, object_path);
Packit f01ec2
Packit f01ec2
  g_signal_emit (self, signals[SERVER_LOST], 0, server);
Packit f01ec2
  /* Server is deallocated now after destroying all its associations
Packit f01ec2
     from all hashtables */
Packit f01ec2
  g_object_unref (server);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
gom_dlna_servers_manager_proxy_get_servers_cb (GObject      *source_object,
Packit f01ec2
                                               GAsyncResult *res,
Packit f01ec2
                                               gpointer      user_data)
Packit f01ec2
{
Packit f01ec2
  GomDlnaServersManager *self = user_data;
Packit f01ec2
  GomDlnaServersManagerPrivate *priv = self->priv;
Packit f01ec2
  gchar **object_paths = NULL;
Packit f01ec2
  GError *error = NULL;
Packit f01ec2
  guint i;
Packit f01ec2
Packit f01ec2
  dleyna_server_manager_call_get_servers_finish (priv->proxy, &object_paths, res, &error);
Packit f01ec2
  if (error != NULL)
Packit f01ec2
    {
Packit f01ec2
      g_warning ("Unable to Call GetServers : %s",
Packit f01ec2
                 error->message);
Packit f01ec2
      g_error_free (error);
Packit f01ec2
      g_propagate_error (&priv->error, error);
Packit f01ec2
      goto out;
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  for (i = 0; object_paths[i] != NULL; i++)
Packit f01ec2
    gom_dlna_servers_manager_server_found_cb (self, object_paths[i], NULL);
Packit f01ec2
Packit f01ec2
 out:
Packit f01ec2
  g_strfreev (object_paths);
Packit f01ec2
  g_object_unref (self);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
gom_dlna_servers_manager_proxy_new_cb (GObject      *source_object,
Packit f01ec2
                                       GAsyncResult *res,
Packit f01ec2
                                       gpointer      user_data)
Packit f01ec2
{
Packit f01ec2
  GomDlnaServersManager *self = user_data;
Packit f01ec2
  GomDlnaServersManagerPrivate *priv = self->priv;
Packit f01ec2
  GError *error = NULL;
Packit f01ec2
Packit f01ec2
  priv->proxy = dleyna_server_manager_proxy_new_for_bus_finish (res, &error);
Packit f01ec2
  if (error != NULL)
Packit f01ec2
    {
Packit f01ec2
      g_warning ("Unable to connect to the dlnaservers.Manager DBus object: %s",
Packit f01ec2
                 error->message);
Packit f01ec2
      g_error_free (error);
Packit f01ec2
      g_propagate_error (&priv->error, error);
Packit f01ec2
      goto out;
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  g_debug ("%s DLNA Servers Manager initialized", G_STRFUNC);
Packit f01ec2
Packit f01ec2
  g_signal_connect_swapped (priv->proxy,
Packit f01ec2
                            "found-server",
Packit f01ec2
                            G_CALLBACK (gom_dlna_servers_manager_server_found_cb),
Packit f01ec2
                            self);
Packit f01ec2
Packit f01ec2
  g_signal_connect_swapped (priv->proxy,
Packit f01ec2
                            "lost-server",
Packit f01ec2
                            G_CALLBACK (gom_dlna_servers_manager_server_lost_cb),
Packit f01ec2
                            self);
Packit f01ec2
Packit f01ec2
  dleyna_server_manager_call_get_servers (priv->proxy, NULL,
Packit f01ec2
                                          gom_dlna_servers_manager_proxy_get_servers_cb,
Packit f01ec2
                                          g_object_ref (self));
Packit f01ec2
Packit f01ec2
 out:
Packit f01ec2
  g_object_unref (self);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
Packit f01ec2
static GObject *
Packit f01ec2
gom_dlna_servers_manager_constructor (GType                  type,
Packit f01ec2
                                      guint                  n_construct_params,
Packit f01ec2
                                      GObjectConstructParam *construct_params)
Packit f01ec2
{
Packit f01ec2
  if (gom_dlna_servers_manager_singleton == NULL)
Packit f01ec2
    {
Packit f01ec2
      gom_dlna_servers_manager_singleton
Packit f01ec2
        = G_OBJECT_CLASS (gom_dlna_servers_manager_parent_class)->constructor (type,
Packit f01ec2
                                                                               n_construct_params,
Packit f01ec2
                                                                               construct_params);
Packit f01ec2
      g_object_add_weak_pointer (gom_dlna_servers_manager_singleton,
Packit f01ec2
                                 (gpointer) &gom_dlna_servers_manager_singleton);
Packit f01ec2
      return gom_dlna_servers_manager_singleton;
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  return g_object_ref (gom_dlna_servers_manager_singleton);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
gom_dlna_servers_manager_init (GomDlnaServersManager *self)
Packit f01ec2
{
Packit f01ec2
  GomDlnaServersManagerPrivate *priv;
Packit f01ec2
Packit f01ec2
  self->priv = priv = gom_dlna_servers_manager_get_instance_private (self);
Packit f01ec2
Packit f01ec2
  dleyna_server_manager_proxy_new_for_bus (G_BUS_TYPE_SESSION,
Packit f01ec2
                                           G_DBUS_PROXY_FLAGS_NONE,
Packit f01ec2
                                           "com.intel.dleyna-server",
Packit f01ec2
                                           "/com/intel/dLeynaServer",
Packit f01ec2
                                           NULL,
Packit f01ec2
                                           gom_dlna_servers_manager_proxy_new_cb,
Packit f01ec2
                                           g_object_ref (self));
Packit f01ec2
Packit f01ec2
  priv->servers = g_hash_table_new (g_str_hash, g_str_equal);
Packit f01ec2
  priv->udn_to_server = g_hash_table_new (g_str_hash, g_str_equal);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
gom_dlna_servers_manager_class_init (GomDlnaServersManagerClass *class)
Packit f01ec2
{
Packit f01ec2
  GObjectClass *object_class = G_OBJECT_CLASS (class);
Packit f01ec2
Packit f01ec2
  object_class->constructor = gom_dlna_servers_manager_constructor;
Packit f01ec2
  object_class->dispose = gom_dlna_servers_manager_dispose;
Packit f01ec2
Packit f01ec2
  signals[SERVER_FOUND] = g_signal_new ("server-found",
Packit f01ec2
                                        G_TYPE_FROM_CLASS (class),
Packit f01ec2
                                        G_SIGNAL_RUN_LAST,
Packit f01ec2
                                        0,
Packit f01ec2
                                        NULL,
Packit f01ec2
                                        NULL,
Packit f01ec2
                                        g_cclosure_marshal_VOID__OBJECT,
Packit f01ec2
                                        G_TYPE_NONE,
Packit f01ec2
                                        1,
Packit f01ec2
                                        GOM_TYPE_DLNA_SERVER);
Packit f01ec2
Packit f01ec2
  signals[SERVER_LOST] = g_signal_new ("server-lost",
Packit f01ec2
                                       G_TYPE_FROM_CLASS (class),
Packit f01ec2
                                       G_SIGNAL_RUN_LAST,
Packit f01ec2
                                       0,
Packit f01ec2
                                       NULL,
Packit f01ec2
                                       NULL,
Packit f01ec2
                                       g_cclosure_marshal_VOID__OBJECT,
Packit f01ec2
                                       G_TYPE_NONE,
Packit f01ec2
                                       1,
Packit f01ec2
                                       GOM_TYPE_DLNA_SERVER);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
Packit f01ec2
GomDlnaServer *
Packit f01ec2
gom_dlna_servers_manager_get_server (GomDlnaServersManager *self,
Packit f01ec2
                                     const gchar           *udn)
Packit f01ec2
{
Packit f01ec2
  return g_hash_table_lookup (self->priv->udn_to_server, udn);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
Packit f01ec2
GomDlnaServersManager *
Packit f01ec2
gom_dlna_servers_manager_dup_singleton (void)
Packit f01ec2
{
Packit f01ec2
  return g_object_new (GOM_TYPE_DLNA_SERVERS_MANAGER, NULL);
Packit f01ec2
}