|
Packit Service |
c6b9b0 |
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
Packit Service |
c6b9b0 |
/*
|
|
Packit Service |
c6b9b0 |
* Copyright © 2014 Pranav Kant
|
|
Packit Service |
c6b9b0 |
*
|
|
Packit Service |
c6b9b0 |
* This library is free software; you can redistribute it and/or
|
|
Packit Service |
c6b9b0 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit Service |
c6b9b0 |
* License as published by the Free Software Foundation; either
|
|
Packit Service |
c6b9b0 |
* version 2 of the License, or (at your option) any later version.
|
|
Packit Service |
c6b9b0 |
*
|
|
Packit Service |
c6b9b0 |
* This library is distributed in the hope that it will be useful,
|
|
Packit Service |
c6b9b0 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
c6b9b0 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
c6b9b0 |
* Lesser General Public License for more details.
|
|
Packit Service |
c6b9b0 |
*
|
|
Packit Service |
c6b9b0 |
* You should have received a copy of the GNU Lesser General
|
|
Packit Service |
c6b9b0 |
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
Packit Service |
c6b9b0 |
*/
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
#include "config.h"
|
|
Packit Service |
c6b9b0 |
#include <glib/gi18n-lib.h>
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
#include "goaprovider.h"
|
|
Packit Service |
c6b9b0 |
#include "goaobjectskeletonutils.h"
|
|
Packit Service |
c6b9b0 |
#include "goautils.h"
|
|
Packit Service |
c6b9b0 |
#include "goaprovider-priv.h"
|
|
Packit Service |
c6b9b0 |
#include "goamediaserverprovider.h"
|
|
Packit Service |
c6b9b0 |
#include "goadleynaservermanager.h"
|
|
Packit Service |
c6b9b0 |
#include "goadleynaservermediadevice.h"
|
|
Packit Service |
c6b9b0 |
#include "goadlnaservermanager.h"
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
struct _GoaMediaServerProvider
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
GoaProvider parent_instance;
|
|
Packit Service |
c6b9b0 |
GoaDlnaServerManager *dlna_mngr;
|
|
Packit Service |
c6b9b0 |
};
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
typedef struct _GoaMediaServerProviderClass GoaMediaServerProviderClass;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
struct _GoaMediaServerProviderClass
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
GoaProviderClass parent_class;
|
|
Packit Service |
c6b9b0 |
};
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
G_DEFINE_TYPE_WITH_CODE (GoaMediaServerProvider, goa_media_server_provider, GOA_TYPE_PROVIDER,
|
|
Packit Service |
c6b9b0 |
goa_provider_ensure_extension_points_registered ();
|
|
Packit Service |
c6b9b0 |
g_io_extension_point_implement (GOA_PROVIDER_EXTENSION_POINT_NAME,
|
|
Packit Service |
c6b9b0 |
g_define_type_id,
|
|
Packit Service |
c6b9b0 |
GOA_MEDIA_SERVER_NAME,
|
|
Packit Service |
c6b9b0 |
0));
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* ---------------------------------------------------------------------------------------------------- */
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static const gchar *
|
|
Packit Service |
c6b9b0 |
get_provider_type (GoaProvider *provider)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
return GOA_MEDIA_SERVER_NAME;
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static gchar *
|
|
Packit Service |
c6b9b0 |
get_provider_name (GoaProvider *provider,
|
|
Packit Service |
c6b9b0 |
GoaObject *object)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
return g_strdup (_("Media Server"));
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static GoaProviderGroup
|
|
Packit Service |
c6b9b0 |
get_provider_group (GoaProvider *provider)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
return GOA_PROVIDER_GROUP_BRANDED;
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static GoaProviderFeatures
|
|
Packit Service |
c6b9b0 |
get_provider_features (GoaProvider *provider)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
return GOA_PROVIDER_FEATURE_BRANDED |
|
|
Packit Service |
c6b9b0 |
GOA_PROVIDER_FEATURE_PHOTOS;
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static GIcon *
|
|
Packit Service |
c6b9b0 |
get_provider_icon (GoaProvider *provider, GoaObject *object)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
return g_themed_icon_new_with_default_fallbacks ("network-server-symbolic");
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* ---------------------------------------------------------------------------------------------------- */
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static gboolean
|
|
Packit Service |
c6b9b0 |
build_object (GoaProvider *provider,
|
|
Packit Service |
c6b9b0 |
GoaObjectSkeleton *object,
|
|
Packit Service |
c6b9b0 |
GKeyFile *key_file,
|
|
Packit Service |
c6b9b0 |
const gchar *group,
|
|
Packit Service |
c6b9b0 |
GDBusConnection *connection,
|
|
Packit Service |
c6b9b0 |
gboolean just_added,
|
|
Packit Service |
c6b9b0 |
GError **error)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
gboolean ret;
|
|
Packit Service |
c6b9b0 |
GoaAccount *account;
|
|
Packit Service |
c6b9b0 |
GoaMediaServer *mediaserver;
|
|
Packit Service |
c6b9b0 |
const gchar *udn;
|
|
Packit Service |
c6b9b0 |
gboolean photos_enabled;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
mediaserver = NULL;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
account = NULL;
|
|
Packit Service |
c6b9b0 |
ret = FALSE;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* Chain up */
|
|
Packit Service |
c6b9b0 |
if (!GOA_PROVIDER_CLASS (goa_media_server_provider_parent_class)->build_object (provider,
|
|
Packit Service |
c6b9b0 |
object,
|
|
Packit Service |
c6b9b0 |
key_file,
|
|
Packit Service |
c6b9b0 |
group,
|
|
Packit Service |
c6b9b0 |
connection,
|
|
Packit Service |
c6b9b0 |
just_added,
|
|
Packit Service |
c6b9b0 |
error))
|
|
Packit Service |
c6b9b0 |
goto out;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
account = goa_object_get_account (GOA_OBJECT (object));
|
|
Packit Service |
c6b9b0 |
udn = goa_account_get_identity (account);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* Photos */
|
|
Packit Service |
c6b9b0 |
photos_enabled = g_key_file_get_boolean (key_file, group, "PhotosEnabled", NULL);
|
|
Packit Service |
c6b9b0 |
goa_object_skeleton_attach_photos (object, photos_enabled);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* Media Server */
|
|
Packit Service |
c6b9b0 |
mediaserver = goa_object_get_media_server (GOA_OBJECT (object));
|
|
Packit Service |
c6b9b0 |
if (mediaserver == NULL)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
mediaserver = goa_media_server_skeleton_new ();
|
|
Packit Service |
c6b9b0 |
g_object_set (G_OBJECT (mediaserver),
|
|
Packit Service |
c6b9b0 |
"dlna-supported", TRUE,
|
|
Packit Service |
c6b9b0 |
"udn", udn,
|
|
Packit Service |
c6b9b0 |
NULL);
|
|
Packit Service |
c6b9b0 |
goa_object_skeleton_set_media_server (object, mediaserver);
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
if (just_added)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
goa_account_set_photos_disabled (account, !photos_enabled);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
g_signal_connect (account,
|
|
Packit Service |
c6b9b0 |
"notify::photos-disabled",
|
|
Packit Service |
c6b9b0 |
G_CALLBACK (goa_util_account_notify_property_cb),
|
|
Packit Service |
c6b9b0 |
(gpointer) "PhotosEnabled");
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
ret = TRUE;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
out:
|
|
Packit Service |
c6b9b0 |
g_clear_object (&account);
|
|
Packit Service |
c6b9b0 |
g_clear_object (&mediaserver);
|
|
Packit Service |
c6b9b0 |
return ret;
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* ---------------------------------------------------------------------------------------------------- */
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static gboolean
|
|
Packit Service |
c6b9b0 |
ensure_credentials_sync (GoaProvider *provider,
|
|
Packit Service |
c6b9b0 |
GoaObject *object,
|
|
Packit Service |
c6b9b0 |
gint *out_expires_in,
|
|
Packit Service |
c6b9b0 |
GCancellable *cancellable,
|
|
Packit Service |
c6b9b0 |
GError **error)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
if (out_expires_in != NULL)
|
|
Packit Service |
c6b9b0 |
*out_expires_in = 0;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
return TRUE;
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* ---------------------------------------------------------------------------------------------------- */
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static void
|
|
Packit Service |
c6b9b0 |
add_list_box_row (GtkWidget *list_box,
|
|
Packit Service |
c6b9b0 |
DleynaServerMediaDevice *server)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
GtkWidget *label;
|
|
Packit Service |
c6b9b0 |
GtkWidget *row;
|
|
Packit Service |
c6b9b0 |
const gchar *name;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
row = gtk_list_box_row_new ();
|
|
Packit Service |
c6b9b0 |
g_object_set_data_full (G_OBJECT (row), "server", g_object_ref (server), g_object_unref);
|
|
Packit Service |
c6b9b0 |
gtk_container_add (GTK_CONTAINER (list_box), row);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
name = dleyna_server_media_device_get_friendly_name (server);
|
|
Packit Service |
c6b9b0 |
label = gtk_label_new (name);
|
|
Packit Service |
c6b9b0 |
gtk_widget_set_margin_start (label, 20);
|
|
Packit Service |
c6b9b0 |
gtk_widget_set_margin_end (label, 20);
|
|
Packit Service |
c6b9b0 |
gtk_widget_set_margin_top (label, 12);
|
|
Packit Service |
c6b9b0 |
gtk_widget_set_margin_bottom (label, 12);
|
|
Packit Service |
c6b9b0 |
gtk_label_set_xalign (GTK_LABEL (label), 0.0);
|
|
Packit Service |
c6b9b0 |
gtk_container_add (GTK_CONTAINER (row), label);
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* ---------------------------------------------------------------------------------------------------- */
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
typedef struct
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
GtkDialog *dialog;
|
|
Packit Service |
c6b9b0 |
GMainLoop *loop;
|
|
Packit Service |
c6b9b0 |
GoaDlnaServerManager *dlna_mngr;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
gchar *friendly_name;
|
|
Packit Service |
c6b9b0 |
gchar *udn;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
gchar *account_object_path;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
GError *error;
|
|
Packit Service |
c6b9b0 |
} AddAccountData;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* ---------------------------------------------------------------------------------------------------- */
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static void
|
|
Packit Service |
c6b9b0 |
server_found_cb (GoaDlnaServerManager *dlna_mngr,
|
|
Packit Service |
c6b9b0 |
DleynaServerMediaDevice *server,
|
|
Packit Service |
c6b9b0 |
GtkWidget *list_box)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
add_list_box_row (list_box, server);
|
|
Packit Service |
c6b9b0 |
gtk_widget_show_all (list_box);
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static void
|
|
Packit Service |
c6b9b0 |
server_lost_cb (GoaDlnaServerManager *dlna_mngr,
|
|
Packit Service |
c6b9b0 |
DleynaServerMediaDevice *server,
|
|
Packit Service |
c6b9b0 |
GtkWidget *list_box)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
GList *children;
|
|
Packit Service |
c6b9b0 |
GList *l;
|
|
Packit Service |
c6b9b0 |
const gchar *udn;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
children = gtk_container_get_children (GTK_CONTAINER (list_box));
|
|
Packit Service |
c6b9b0 |
udn = dleyna_server_media_device_get_udn (server);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
for (l = children; l != NULL; l = l->next)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
DleynaServerMediaDevice *tmp_server;
|
|
Packit Service |
c6b9b0 |
GtkWidget *row = GTK_WIDGET (l->data);
|
|
Packit Service |
c6b9b0 |
const gchar *tmp_udn;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
tmp_server = DLEYNA_SERVER_MEDIA_DEVICE (g_object_get_data (G_OBJECT (row), "server"));
|
|
Packit Service |
c6b9b0 |
tmp_udn = dleyna_server_media_device_get_udn (tmp_server);
|
|
Packit Service |
c6b9b0 |
if (g_strcmp0 (tmp_udn, udn) == 0)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
gtk_container_remove (GTK_CONTAINER (list_box), row);
|
|
Packit Service |
c6b9b0 |
break;
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
g_list_free (children);
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static void
|
|
Packit Service |
c6b9b0 |
list_box_activate_cb (GtkListBox *list_box,
|
|
Packit Service |
c6b9b0 |
GtkListBoxRow *row,
|
|
Packit Service |
c6b9b0 |
gpointer user_data)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
AddAccountData *data = user_data;
|
|
Packit Service |
c6b9b0 |
DleynaServerMediaDevice *device;
|
|
Packit Service |
c6b9b0 |
const gchar *friendly_name;
|
|
Packit Service |
c6b9b0 |
const gchar *udn;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
device = DLEYNA_SERVER_MEDIA_DEVICE (g_object_get_data (G_OBJECT (row), "server"));
|
|
Packit Service |
c6b9b0 |
friendly_name = dleyna_server_media_device_get_friendly_name (device);
|
|
Packit Service |
c6b9b0 |
udn = dleyna_server_media_device_get_udn (device);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
data->udn = g_strdup (udn);
|
|
Packit Service |
c6b9b0 |
data->friendly_name = g_strdup (friendly_name);
|
|
Packit Service |
c6b9b0 |
gtk_dialog_response (data->dialog, GTK_RESPONSE_OK);
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static void
|
|
Packit Service |
c6b9b0 |
update_header_func (GtkListBoxRow *row,
|
|
Packit Service |
c6b9b0 |
GtkListBoxRow *before,
|
|
Packit Service |
c6b9b0 |
gpointer user_data)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
GtkWidget *current;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
if (before == NULL)
|
|
Packit Service |
c6b9b0 |
return;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
current = gtk_list_box_row_get_header (row);
|
|
Packit Service |
c6b9b0 |
if (current == NULL)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
current = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
|
|
Packit Service |
c6b9b0 |
gtk_widget_show (current);
|
|
Packit Service |
c6b9b0 |
gtk_list_box_row_set_header (row, current);
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static void
|
|
Packit Service |
c6b9b0 |
create_account_details_ui (GoaProvider *provider,
|
|
Packit Service |
c6b9b0 |
GtkDialog *dialog,
|
|
Packit Service |
c6b9b0 |
GtkBox *vbox,
|
|
Packit Service |
c6b9b0 |
AddAccountData *data)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
GList *l;
|
|
Packit Service |
c6b9b0 |
GList *servers;
|
|
Packit Service |
c6b9b0 |
GtkStyleContext *context;
|
|
Packit Service |
c6b9b0 |
GtkWidget *label;
|
|
Packit Service |
c6b9b0 |
GtkWidget *list_box;
|
|
Packit Service |
c6b9b0 |
GtkWidget *grid0;
|
|
Packit Service |
c6b9b0 |
GtkWidget *grid1;
|
|
Packit Service |
c6b9b0 |
GtkWidget *scrolled_window;
|
|
Packit Service |
c6b9b0 |
gchar *markup;
|
|
Packit Service |
c6b9b0 |
gint height;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
goa_utils_set_dialog_title (provider, dialog, TRUE);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
grid0 = gtk_grid_new ();
|
|
Packit Service |
c6b9b0 |
gtk_container_set_border_width (GTK_CONTAINER (grid0), 5);
|
|
Packit Service |
c6b9b0 |
gtk_widget_set_margin_bottom (grid0, 6);
|
|
Packit Service |
c6b9b0 |
gtk_widget_set_margin_start (grid0, 36);
|
|
Packit Service |
c6b9b0 |
gtk_widget_set_margin_end (grid0, 36);
|
|
Packit Service |
c6b9b0 |
gtk_orientable_set_orientation (GTK_ORIENTABLE (grid0), GTK_ORIENTATION_VERTICAL);
|
|
Packit Service |
c6b9b0 |
gtk_grid_set_row_spacing (GTK_GRID (grid0), 12);
|
|
Packit Service |
c6b9b0 |
gtk_container_add (GTK_CONTAINER (vbox), grid0);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
label = gtk_label_new (_("Personal content can be added to your applications through a media server account."));
|
|
Packit Service |
c6b9b0 |
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
|
|
Packit Service |
c6b9b0 |
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
|
|
Packit Service |
c6b9b0 |
gtk_label_set_max_width_chars (GTK_LABEL (label), 40);
|
|
Packit Service |
c6b9b0 |
gtk_label_set_xalign (GTK_LABEL (label), 0.0);
|
|
Packit Service |
c6b9b0 |
gtk_container_add (GTK_CONTAINER (grid0), label);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
grid1 = gtk_grid_new ();
|
|
Packit Service |
c6b9b0 |
gtk_orientable_set_orientation (GTK_ORIENTABLE (grid1), GTK_ORIENTATION_VERTICAL);
|
|
Packit Service |
c6b9b0 |
gtk_grid_set_row_spacing (GTK_GRID (grid1), 6);
|
|
Packit Service |
c6b9b0 |
gtk_container_add (GTK_CONTAINER (grid0), grid1);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
label = gtk_label_new ("");
|
|
Packit Service |
c6b9b0 |
markup = g_strdup_printf ("%s", _("Available Media Servers"));
|
|
Packit Service |
c6b9b0 |
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
Packit Service |
c6b9b0 |
gtk_label_set_xalign (GTK_LABEL (label), 0.0);
|
|
Packit Service |
c6b9b0 |
g_free (markup);
|
|
Packit Service |
c6b9b0 |
gtk_container_add (GTK_CONTAINER (grid1), label);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
|
|
Packit Service |
c6b9b0 |
gtk_widget_set_hexpand (scrolled_window, TRUE);
|
|
Packit Service |
c6b9b0 |
gtk_widget_set_vexpand (scrolled_window, TRUE);
|
|
Packit Service |
c6b9b0 |
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
|
|
Packit Service |
c6b9b0 |
GTK_POLICY_AUTOMATIC,
|
|
Packit Service |
c6b9b0 |
GTK_POLICY_AUTOMATIC);
|
|
Packit Service |
c6b9b0 |
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN);
|
|
Packit Service |
c6b9b0 |
gtk_container_add (GTK_CONTAINER (grid1), scrolled_window);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
list_box = gtk_list_box_new ();
|
|
Packit Service |
c6b9b0 |
gtk_list_box_set_header_func (GTK_LIST_BOX (list_box), update_header_func, NULL, NULL);
|
|
Packit Service |
c6b9b0 |
gtk_container_add (GTK_CONTAINER (scrolled_window), list_box);
|
|
Packit Service |
c6b9b0 |
g_signal_connect (list_box, "row-activated", G_CALLBACK (list_box_activate_cb), data);
|
|
Packit Service |
c6b9b0 |
g_signal_connect_object (data->dlna_mngr, "server-found", G_CALLBACK (server_found_cb), list_box, 0);
|
|
Packit Service |
c6b9b0 |
g_signal_connect_object (data->dlna_mngr, "server-lost", G_CALLBACK (server_lost_cb), list_box, 0);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
servers = goa_dlna_server_manager_dup_servers (data->dlna_mngr);
|
|
Packit Service |
c6b9b0 |
for (l = servers; l != NULL; l = l->next)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
DleynaServerMediaDevice *server = DLEYNA_SERVER_MEDIA_DEVICE (l->data);
|
|
Packit Service |
c6b9b0 |
add_list_box_row (list_box, server);
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
g_list_free_full (servers, g_object_unref);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
label = gtk_label_new (_("No media servers found"));
|
|
Packit Service |
c6b9b0 |
context = gtk_widget_get_style_context (label);
|
|
Packit Service |
c6b9b0 |
gtk_style_context_add_class (context, "dim-label");
|
|
Packit Service |
c6b9b0 |
gtk_list_box_set_placeholder (GTK_LIST_BOX (list_box), label);
|
|
Packit Service |
c6b9b0 |
gtk_widget_show (label);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
gtk_window_get_size (GTK_WINDOW (data->dialog), NULL, &height);
|
|
Packit Service |
c6b9b0 |
gtk_window_set_default_size (GTK_WINDOW (data->dialog), -1, height);
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* ---------------------------------------------------------------------------------------------------- */
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static void
|
|
Packit Service |
c6b9b0 |
add_account_cb (GoaManager *manager, GAsyncResult *res, gpointer user_data)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
AddAccountData *data = user_data;
|
|
Packit Service |
c6b9b0 |
goa_manager_call_add_account_finish (manager,
|
|
Packit Service |
c6b9b0 |
&data->account_object_path,
|
|
Packit Service |
c6b9b0 |
res,
|
|
Packit Service |
c6b9b0 |
&data->error);
|
|
Packit Service |
c6b9b0 |
g_main_loop_quit (data->loop);
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* ---------------------------------------------------------------------------------------------------- */
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static GoaObject *
|
|
Packit Service |
c6b9b0 |
add_account (GoaProvider *provider,
|
|
Packit Service |
c6b9b0 |
GoaClient *client,
|
|
Packit Service |
c6b9b0 |
GtkDialog *dialog,
|
|
Packit Service |
c6b9b0 |
GtkBox *vbox,
|
|
Packit Service |
c6b9b0 |
GError **error)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
GoaMediaServerProvider *self = GOA_MEDIA_SERVER_PROVIDER (provider);
|
|
Packit Service |
c6b9b0 |
AddAccountData data;
|
|
Packit Service |
c6b9b0 |
GVariantBuilder details;
|
|
Packit Service |
c6b9b0 |
GVariantBuilder credentials;
|
|
Packit Service |
c6b9b0 |
GoaObject *ret;
|
|
Packit Service |
c6b9b0 |
const gchar *provider_type;
|
|
Packit Service |
c6b9b0 |
gint response;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
ret = NULL;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
memset (&data, 0, sizeof (AddAccountData));
|
|
Packit Service |
c6b9b0 |
data.loop = g_main_loop_new (NULL, FALSE);
|
|
Packit Service |
c6b9b0 |
data.dialog = dialog;
|
|
Packit Service |
c6b9b0 |
data.error = NULL;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
if (self->dlna_mngr == NULL)
|
|
Packit Service |
c6b9b0 |
self->dlna_mngr = goa_dlna_server_manager_dup_singleton ();
|
|
Packit Service |
c6b9b0 |
data.dlna_mngr = self->dlna_mngr;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
create_account_details_ui (provider, dialog, vbox, &data);
|
|
Packit Service |
c6b9b0 |
gtk_widget_show_all (GTK_WIDGET (vbox));
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
response = gtk_dialog_run (dialog);
|
|
Packit Service |
c6b9b0 |
if (response != GTK_RESPONSE_OK)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
g_set_error (&data.error,
|
|
Packit Service |
c6b9b0 |
GOA_ERROR,
|
|
Packit Service |
c6b9b0 |
GOA_ERROR_DIALOG_DISMISSED,
|
|
Packit Service |
c6b9b0 |
_("Dialog was dismissed"));
|
|
Packit Service |
c6b9b0 |
goto out;
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* See if there's already an account of this type with the
|
|
Packit Service |
c6b9b0 |
* given identity.
|
|
Packit Service |
c6b9b0 |
*/
|
|
Packit Service |
c6b9b0 |
provider_type = goa_provider_get_provider_type (provider);
|
|
Packit Service |
c6b9b0 |
if (!goa_utils_check_duplicate (client,
|
|
Packit Service |
c6b9b0 |
data.udn,
|
|
Packit Service |
c6b9b0 |
data.friendly_name,
|
|
Packit Service |
c6b9b0 |
provider_type,
|
|
Packit Service |
c6b9b0 |
(GoaPeekInterfaceFunc) goa_object_peek_account,
|
|
Packit Service |
c6b9b0 |
&data.error))
|
|
Packit Service |
c6b9b0 |
goto out;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
gtk_widget_hide (GTK_WIDGET (dialog));
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* No authentication required, so passing an empty variant. */
|
|
Packit Service |
c6b9b0 |
g_variant_builder_init (&credentials, G_VARIANT_TYPE_VARDICT);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
g_variant_builder_init (&details, G_VARIANT_TYPE ("a{ss}"));
|
|
Packit Service |
c6b9b0 |
g_variant_builder_add (&details, "{ss}", "PhotosEnabled", "true");
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* OK, everything is dandy, add the account */
|
|
Packit Service |
c6b9b0 |
/* we want the GoaClient to update before this method returns (so it
|
|
Packit Service |
c6b9b0 |
* can create a proxy for the new object) so run the mainloop while
|
|
Packit Service |
c6b9b0 |
* waiting for this to complete
|
|
Packit Service |
c6b9b0 |
*/
|
|
Packit Service |
c6b9b0 |
goa_manager_call_add_account (goa_client_get_manager (client),
|
|
Packit Service |
c6b9b0 |
goa_provider_get_provider_type (provider),
|
|
Packit Service |
c6b9b0 |
data.udn,
|
|
Packit Service |
c6b9b0 |
data.friendly_name,
|
|
Packit Service |
c6b9b0 |
g_variant_builder_end (&credentials),
|
|
Packit Service |
c6b9b0 |
g_variant_builder_end (&details),
|
|
Packit Service |
c6b9b0 |
NULL,
|
|
Packit Service |
c6b9b0 |
(GAsyncReadyCallback) add_account_cb,
|
|
Packit Service |
c6b9b0 |
&data);
|
|
Packit Service |
c6b9b0 |
g_main_loop_run (data.loop);
|
|
Packit Service |
c6b9b0 |
if (data.error != NULL)
|
|
Packit Service |
c6b9b0 |
goto out;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
ret = GOA_OBJECT (g_dbus_object_manager_get_object (goa_client_get_object_manager (client),
|
|
Packit Service |
c6b9b0 |
data.account_object_path));
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
out:
|
|
Packit Service |
c6b9b0 |
/* We might have an object even when data.error is set.
|
|
Packit Service |
c6b9b0 |
* eg., if we failed to store the credentials in the keyring.
|
|
Packit Service |
c6b9b0 |
*/
|
|
Packit Service |
c6b9b0 |
if (data.error != NULL)
|
|
Packit Service |
c6b9b0 |
g_propagate_error (error, data.error);
|
|
Packit Service |
c6b9b0 |
else
|
|
Packit Service |
c6b9b0 |
g_assert (ret != NULL);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
g_free (data.account_object_path);
|
|
Packit Service |
c6b9b0 |
g_free (data.friendly_name);
|
|
Packit Service |
c6b9b0 |
g_free (data.udn);
|
|
Packit Service |
c6b9b0 |
g_clear_pointer (&data.loop, (GDestroyNotify) g_main_loop_unref);
|
|
Packit Service |
c6b9b0 |
return ret;
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* ---------------------------------------------------------------------------------------------------- */
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static gboolean
|
|
Packit Service |
c6b9b0 |
refresh_account (GoaProvider *provider,
|
|
Packit Service |
c6b9b0 |
GoaClient *client,
|
|
Packit Service |
c6b9b0 |
GoaObject *object,
|
|
Packit Service |
c6b9b0 |
GtkWindow *parent,
|
|
Packit Service |
c6b9b0 |
GError **error)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
GoaAccount *account;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
account = goa_object_peek_account (object);
|
|
Packit Service |
c6b9b0 |
goa_account_call_ensure_credentials (account,
|
|
Packit Service |
c6b9b0 |
NULL, /* GCancellable */
|
|
Packit Service |
c6b9b0 |
NULL, NULL); /* callback, user_data */
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
return TRUE;
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* ---------------------------------------------------------------------------------------------------- */
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static void
|
|
Packit Service |
c6b9b0 |
goa_media_server_provider_dispose (GObject *object)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
GoaMediaServerProvider *self = GOA_MEDIA_SERVER_PROVIDER (object);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
g_clear_object (&self->dlna_mngr);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
G_OBJECT_CLASS (goa_media_server_provider_parent_class)->dispose (object);
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static void
|
|
Packit Service |
c6b9b0 |
goa_media_server_provider_init (GoaMediaServerProvider *self)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static void
|
|
Packit Service |
c6b9b0 |
goa_media_server_provider_class_init (GoaMediaServerProviderClass *klass)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
Packit Service |
c6b9b0 |
GoaProviderClass *provider_class = GOA_PROVIDER_CLASS (klass);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
object_class->dispose = goa_media_server_provider_dispose;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
provider_class->get_provider_type = get_provider_type;
|
|
Packit Service |
c6b9b0 |
provider_class->get_provider_name = get_provider_name;
|
|
Packit Service |
c6b9b0 |
provider_class->get_provider_group = get_provider_group;
|
|
Packit Service |
c6b9b0 |
provider_class->get_provider_features = get_provider_features;
|
|
Packit Service |
c6b9b0 |
provider_class->get_provider_icon = get_provider_icon;
|
|
Packit Service |
c6b9b0 |
provider_class->add_account = add_account;
|
|
Packit Service |
c6b9b0 |
provider_class->refresh_account = refresh_account;
|
|
Packit Service |
c6b9b0 |
provider_class->build_object = build_object;
|
|
Packit Service |
c6b9b0 |
provider_class->ensure_credentials_sync = ensure_credentials_sync;
|
|
Packit Service |
c6b9b0 |
}
|