Blame src/goabackend/goamediaserverprovider.c

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
}