|
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 |
}
|