1.1 --- a/myth-dbus/src/gmyth-dbus-server.c Thu Oct 25 15:38:08 2007 +0100
1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1.3 @@ -1,1029 +0,0 @@
1.4 -/**
1.5 - * GMyth Library
1.6 - *
1.7 - * Copyright (C) 2006 INdT - Instituto Nokia de Tecnologia.
1.8 - * @author Renato Filho <renato.filho@indt.org.br>
1.9 - *
1.10 - *
1.11 - * This program is free software; you can redistribute it and/or modify
1.12 - * it under the terms of the GNU Lesser General Public License as published by
1.13 - * the Free Software Foundation; either version 2 of the License, or
1.14 - * (at your option) any later version.
1.15 - *
1.16 - * This program is distributed in the hope that it will be useful,
1.17 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
1.18 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1.19 - * GNU General Public License for more details.
1.20 - *
1.21 - * You should have received a copy of the GNU Lesser General Public License
1.22 - * along with this program; if not, write to the Free Software
1.23 - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1.24 - */
1.25 -
1.26 -
1.27 -#ifdef HAVE_CONFIG_H
1.28 -#include "config.h"
1.29 -#endif
1.30 -
1.31 -
1.32 -#include <gmyth/gmyth.h>
1.33 -#include <dbus/dbus-glib-bindings.h>
1.34 -
1.35 -
1.36 -#include "gmyth-dbus-common.h"
1.37 -#include "gmyth-dbus-server.h"
1.38 -
1.39 -#define MYTH_DEFAULT_DB "mythconverg"
1.40 -
1.41 -typedef struct _GMythDbusServerPrivate GMythDbusServerPrivate;
1.42 -
1.43 -struct _GMythDbusServerPrivate
1.44 -{
1.45 - GMythBackendInfo *myth_backend;
1.46 - GMythEPG *myth_epg;
1.47 - GMythScheduler *myth_scheduler;
1.48 -};
1.49 -
1.50 -#define GMYTH_DBUS_SERVER_GET_PRIVATE(o) \
1.51 - (G_TYPE_INSTANCE_GET_PRIVATE ((o), GMYTH_DBUS_SERVER_TYPE, GMythDbusServerPrivate))
1.52 -
1.53 -static void gmyth_dbus_server_class_init (GMythDbusServerClass *klass);
1.54 -static void gmyth_dbus_server_init (GMythDbusServer *self);
1.55 -static void gmyth_dbus_server_dispose (GObject *object);
1.56 -static void gmyth_dbus_server_finalize (GObject *object);
1.57 -
1.58 -/* Dbus */
1.59 -static gboolean gmyth_dbus_server_connect (GObject *obj,
1.60 - const gchar *host,
1.61 - guint port,
1.62 - const gchar *user,
1.63 - const gchar *password,
1.64 - gboolean *result,
1.65 - GError **error);
1.66 -static gboolean gmyth_dbus_server_get_channel_list (GObject *obj,
1.67 - GPtrArray **channels,
1.68 - GError **error);
1.69 -static gboolean gmyth_dbus_server_get_channel_info (GObject *obj,
1.70 - gint channel_id,
1.71 - GValueArray **info,
1.72 - GError **error);
1.73 -static gboolean gmyth_dbus_server_file_exists (GObject *obj,
1.74 - const gchar *file_name,
1.75 - gboolean *exists,
1.76 - GError **error);
1.77 -static gboolean gmyth_dbus_server_get_recorded_list (GObject *obj,
1.78 - GPtrArray **channels,
1.79 - GError **error);
1.80 -static gboolean gmyth_dbus_server_get_recorded_info (GObject *obj,
1.81 - const gchar *basename,
1.82 - GValueArray **info,
1.83 - GError **error);
1.84 -static gboolean gmyth_dbus_server_get_program_list (GObject *obj,
1.85 - gint channel_id,
1.86 - const gchar *start_time,
1.87 - const gchar *end_time,
1.88 - GPtrArray **program_list);
1.89 -static gboolean gmyth_dbus_server_get_schedule_list (GObject *obj,
1.90 - GPtrArray **schedule_list);
1.91 -
1.92 -static gboolean gmyth_dbus_server_connected (GObject *obj,
1.93 - gboolean *status,
1.94 - GError **error);
1.95 -static gboolean gmyth_dbus_server_disconnect (GObject *obj,
1.96 - GError **error);
1.97 -static gboolean gmyth_dbus_server_get_server_info (GObject *obj,
1.98 - guint64 *total_space,
1.99 - guint64 *used_space,
1.100 - guint64 *free_space,
1.101 - GError **error);
1.102 -static gboolean gmyth_dbus_server_get_thumbnail (GObject *obj,
1.103 - const gchar *uri,
1.104 - GByteArray **image,
1.105 - GError **error);
1.106 -static gboolean gmyth_dbus_server_get_channel_icon (GObject *obj,
1.107 - guint channel_id,
1.108 - GByteArray **icon,
1.109 - GError **error);
1.110 -static gboolean gmyth_dbus_server_stop_recording (GObject *obj,
1.111 - guint channel_id,
1.112 - gboolean *result,
1.113 - GError **error);
1.114 -static gboolean gmyth_dbus_server_add_schedule (GObject *obj,
1.115 - guint channel_id,
1.116 - guint program_id,
1.117 - const gchar *start_time,
1.118 - const gchar *end_time,
1.119 - gboolean recurring,
1.120 - const gchar *description,
1.121 - guint *schedule_id,
1.122 - GError **error);
1.123 -static gboolean gmyth_dbus_server_add_exception (GObject *obj,
1.124 - guint schedule_id,
1.125 - guint channel_id,
1.126 - guint program_id,
1.127 - const gchar *start_time,
1.128 - const gchar *end_time,
1.129 - const gchar *description,
1.130 - GError **error);
1.131 -static gboolean gmyth_dbus_server_remove_schedule (GObject *obj,
1.132 - guint schedule_id,
1.133 - GError **error);
1.134 -
1.135 -
1.136 -#include "gmyth-dbus-server-glue.h"
1.137 -
1.138 -
1.139 -G_DEFINE_TYPE (GMythDbusServer, gmyth_dbus_server, G_TYPE_OBJECT);
1.140 -
1.141 -static void
1.142 -gmyth_dbus_server_class_init (GMythDbusServerClass *klass)
1.143 -{
1.144 - GObjectClass *object_class = G_OBJECT_CLASS (klass);
1.145 -
1.146 - g_type_class_add_private (klass, sizeof (GMythDbusServerPrivate));
1.147 -
1.148 - object_class->dispose = gmyth_dbus_server_dispose;
1.149 - object_class->finalize = gmyth_dbus_server_finalize;
1.150 -
1.151 - dbus_g_object_type_install_info (GMYTH_DBUS_SERVER_TYPE,
1.152 - &dbus_glib_gmyth_dbus_server_object_info);
1.153 -}
1.154 -
1.155 -static void
1.156 -gmyth_dbus_server_init (GMythDbusServer *self)
1.157 -{
1.158 -}
1.159 -
1.160 -static void
1.161 -gmyth_dbus_server_dispose (GObject *object)
1.162 -{
1.163 - G_OBJECT_CLASS (gmyth_dbus_server_parent_class)->dispose (object);
1.164 -}
1.165 -
1.166 -static void
1.167 -gmyth_dbus_server_finalize (GObject *object)
1.168 -{
1.169 - G_OBJECT_CLASS (gmyth_dbus_server_parent_class)->finalize (object);
1.170 -}
1.171 -
1.172 -static gboolean
1.173 -gmyth_dbus_server_connect_epg (GMythDbusServer *server)
1.174 -{
1.175 - GMythDbusServerPrivate *priv;
1.176 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (server);
1.177 -
1.178 - if (!priv->myth_epg)
1.179 - {
1.180 - priv->myth_epg = gmyth_epg_new();
1.181 - if (!gmyth_epg_connect (priv->myth_epg, priv->myth_backend))
1.182 - {
1.183 - g_object_unref (priv->myth_epg);
1.184 - priv->myth_epg = NULL;
1.185 - return FALSE;
1.186 - }
1.187 - }
1.188 -
1.189 - return TRUE;
1.190 -}
1.191 -
1.192 -static gboolean
1.193 -gmyth_dbus_server_connect_scheduler (GMythDbusServer *server)
1.194 -{
1.195 - GMythDbusServerPrivate *priv;
1.196 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (server);
1.197 -
1.198 - if (!priv->myth_scheduler)
1.199 - {
1.200 - priv->myth_scheduler = gmyth_scheduler_new ();
1.201 - if (!gmyth_scheduler_connect (priv->myth_scheduler,
1.202 - priv->myth_backend))
1.203 - {
1.204 - g_object_unref (priv->myth_scheduler);
1.205 - priv->myth_scheduler = NULL;
1.206 - return FALSE;
1.207 - }
1.208 - }
1.209 -
1.210 - return TRUE;
1.211 -}
1.212 -
1.213 -static gboolean
1.214 -gmyth_dbus_server_connect (GObject *obj,
1.215 - const gchar *host,
1.216 - guint port,
1.217 - const gchar *user,
1.218 - const gchar *password,
1.219 - gboolean *result,
1.220 - GError **error)
1.221 -{
1.222 - GMythDbusServerPrivate *priv;
1.223 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.224 -
1.225 - if (priv->myth_backend)
1.226 - return TRUE;
1.227 -
1.228 - priv->myth_backend = gmyth_backend_info_new_full (host,
1.229 - user,
1.230 - password,
1.231 - MYTH_DEFAULT_DB,
1.232 - port);
1.233 - *result = TRUE;
1.234 - return TRUE;
1.235 -}
1.236 -
1.237 -static gboolean
1.238 -gmyth_dbus_server_connected (GObject *obj,
1.239 - gboolean *status,
1.240 - GError **error)
1.241 -{
1.242 - GMythDbusServerPrivate *priv;
1.243 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.244 -
1.245 - if (priv->myth_backend)
1.246 - *status = TRUE;
1.247 - else
1.248 - *status = FALSE;
1.249 - return TRUE;
1.250 -}
1.251 -
1.252 -static gboolean
1.253 -gmyth_dbus_server_disconnect (GObject *obj,
1.254 - GError **error)
1.255 -{
1.256 - GMythDbusServerPrivate *priv;
1.257 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.258 -
1.259 - if (priv->myth_epg)
1.260 - {
1.261 - g_object_unref (priv->myth_epg);
1.262 - priv->myth_epg = NULL;
1.263 - }
1.264 -
1.265 -
1.266 - if (priv->myth_backend)
1.267 - {
1.268 - g_object_unref (priv->myth_backend);
1.269 - priv->myth_backend = NULL;
1.270 - }
1.271 -
1.272 - if (priv->myth_scheduler)
1.273 - {
1.274 - g_object_unref (priv->myth_scheduler);
1.275 - priv->myth_scheduler = NULL;
1.276 - }
1.277 -
1.278 -
1.279 - return TRUE;
1.280 -}
1.281 -
1.282 -static gboolean
1.283 -gmyth_dbus_server_get_server_info (GObject *obj,
1.284 - guint64 *total_space,
1.285 - guint64 *used_space,
1.286 - guint64 *free_space,
1.287 - GError **error)
1.288 -{
1.289 - GMythBackendDetails *details;
1.290 - GMythDbusServerPrivate *priv;
1.291 - gboolean ret = FALSE;
1.292 - GMythSocket *socket;
1.293 -
1.294 - g_debug ("%s:%d", __FUNCTION__, __LINE__);
1.295 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.296 -
1.297 - g_return_val_if_fail (priv->myth_backend != NULL, FALSE);
1.298 -
1.299 - socket = gmyth_backend_info_get_connected_socket (priv->myth_backend);
1.300 -
1.301 - details = NULL;
1.302 - gmyth_util_get_backend_details (socket,
1.303 - &details);
1.304 - if (details)
1.305 - {
1.306 - *total_space = details->total_space;
1.307 - *used_space = details->used_space;
1.308 - *free_space = *total_space - *used_space;
1.309 - gmyth_util_backend_details_free (details);
1.310 -
1.311 - ret = TRUE;
1.312 - }
1.313 -
1.314 - g_object_unref (socket);
1.315 -
1.316 - return ret;
1.317 -}
1.318 -
1.319 -
1.320 -static void
1.321 -gmyth_dbus_server_parse_channel_info (GMythChannelInfo *info,
1.322 - GValue *val)
1.323 -{
1.324 - dbus_g_type_struct_set (val,
1.325 - 0, info->channel_ID,
1.326 - 1, info->channel_num->str,
1.327 - 2, info->channel_name->str,
1.328 - 3, info->channel_icon->str,
1.329 - G_MAXUINT);
1.330 -}
1.331 -
1.332 -static gboolean
1.333 -gmyth_dbus_server_get_channel_info (GObject *obj,
1.334 - gint channel_id,
1.335 - GValueArray **info,
1.336 - GError **error)
1.337 -{
1.338 - GType ch_type;
1.339 - GMythChannelInfo *ch_info;
1.340 - GMythDbusServerPrivate *priv;
1.341 -
1.342 - g_debug ("%s:%d", __FUNCTION__, __LINE__);
1.343 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.344 -
1.345 - g_return_val_if_fail (priv->myth_backend != NULL, FALSE);
1.346 - g_return_val_if_fail (gmyth_dbus_server_connect_epg (GMYTH_DBUS_SERVER (obj)), FALSE);
1.347 -
1.348 - ch_type = GMYTH_DBUS_CHANNEL_G_TYPE;
1.349 -
1.350 - ch_info = gmyth_epg_get_channel_info (priv->myth_epg, channel_id);
1.351 - if (ch_info)
1.352 - {
1.353 - GValue v = { 0, };
1.354 - g_value_init (&v, ch_type);
1.355 - g_value_take_boxed (&v, dbus_g_type_specialized_construct (ch_type));
1.356 - gmyth_dbus_server_parse_channel_info (ch_info, &v);
1.357 -
1.358 - *info = g_value_get_boxed (&v);
1.359 - return TRUE;
1.360 - }
1.361 -
1.362 - return FALSE;
1.363 -}
1.364 -
1.365 -
1.366 -static gboolean
1.367 -gmyth_dbus_server_get_channel_list (GObject *obj,
1.368 - GPtrArray **channels,
1.369 - GError **error)
1.370 -{
1.371 - GList *lst;
1.372 - GList *walk;
1.373 - int len;
1.374 - GType ch_type;
1.375 - GMythDbusServerPrivate *priv;
1.376 -
1.377 - g_debug ("%s:%d", __FUNCTION__, __LINE__);
1.378 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.379 -
1.380 - g_return_val_if_fail (priv->myth_backend != NULL, FALSE);
1.381 - g_return_val_if_fail (gmyth_dbus_server_connect_epg (GMYTH_DBUS_SERVER (obj)), FALSE);
1.382 -
1.383 -
1.384 - len = gmyth_epg_get_channel_list (priv->myth_epg, &lst);
1.385 -
1.386 - *channels = g_ptr_array_sized_new (len);
1.387 - ch_type = GMYTH_DBUS_CHANNEL_G_TYPE;
1.388 -
1.389 - for (walk = lst; walk != NULL; walk = walk->next)
1.390 - {
1.391 - GValue ch = { 0, };
1.392 - GMythChannelInfo *data;
1.393 -
1.394 - data = (GMythChannelInfo *) walk->data;
1.395 -
1.396 - g_value_init (&ch, ch_type);
1.397 - g_value_take_boxed (&ch, dbus_g_type_specialized_construct (ch_type));
1.398 - gmyth_dbus_server_parse_channel_info (data, &ch);
1.399 - g_ptr_array_add (*channels, g_value_get_boxed (&ch));
1.400 - }
1.401 -
1.402 - gmyth_free_channel_list (lst);
1.403 - return TRUE;
1.404 -}
1.405 -
1.406 -static gboolean
1.407 -gmyth_dbus_server_file_exists (GObject *obj,
1.408 - const gchar *file_name,
1.409 - gboolean *exists,
1.410 - GError **error)
1.411 -{
1.412 - GMythDbusServerPrivate *priv;
1.413 - g_debug ("%s:%d", __FUNCTION__, __LINE__);
1.414 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.415 -
1.416 - g_return_val_if_fail (priv->myth_backend, FALSE);
1.417 -
1.418 - *exists = gmyth_util_file_exists (priv->myth_backend, file_name);
1.419 -
1.420 - return TRUE;
1.421 -}
1.422 -
1.423 -static gboolean
1.424 -gmyth_dbus_server_get_program_list (GObject *obj,
1.425 - gint channel_id,
1.426 - const gchar *start_time,
1.427 - const gchar *end_time,
1.428 - GPtrArray **programs)
1.429 -{
1.430 - GList *list;
1.431 - GList *walk;
1.432 - gint len;
1.433 - GType program_type;
1.434 - GTimeVal start_time_val;
1.435 - GTimeVal end_time_val;
1.436 - GMythDbusServerPrivate *priv;
1.437 -
1.438 - g_debug ("%s:%d", __FUNCTION__, __LINE__);
1.439 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.440 -
1.441 - g_return_val_if_fail (priv->myth_backend, FALSE);
1.442 - g_return_val_if_fail (gmyth_dbus_server_connect_epg (GMYTH_DBUS_SERVER (obj)), FALSE);
1.443 -
1.444 - g_time_val_from_iso8601 (start_time, &start_time_val);
1.445 - g_time_val_from_iso8601 (end_time, &end_time_val);
1.446 -
1.447 - list = NULL;
1.448 - len = gmyth_epg_get_program_list (priv->myth_epg,
1.449 - &list,
1.450 - channel_id,
1.451 - &start_time_val,
1.452 - &end_time_val);
1.453 -
1.454 - *programs = g_ptr_array_sized_new (len);
1.455 - program_type = GMYTH_DBUS_PROGRAM_G_TYPE;
1.456 -
1.457 - for (walk = list; walk != NULL; walk = walk->next)
1.458 - {
1.459 - GValue program = { 0, };
1.460 - gchar *start_str;
1.461 - gchar *end_str;
1.462 - GMythProgramInfo *data;
1.463 -
1.464 - data = (GMythProgramInfo *) walk->data;
1.465 -
1.466 - if (!data)
1.467 - continue;
1.468 -
1.469 - g_value_init (&program, program_type);
1.470 - g_value_take_boxed (&program,
1.471 - dbus_g_type_specialized_construct (program_type));
1.472 -
1.473 - start_str = g_time_val_to_iso8601 (data->startts);
1.474 - end_str = g_time_val_to_iso8601 (data->endts);
1.475 -
1.476 - dbus_g_type_struct_set (&program,
1.477 - 0, data->chanid->str,
1.478 - 1, start_str,
1.479 - 2, end_str,
1.480 - 3, data->title->str,
1.481 - 4, data->subtitle->str,
1.482 - 5, data->description->str,
1.483 - 6, data->category->str,
1.484 - G_MAXUINT);
1.485 -
1.486 - g_ptr_array_add (*programs, g_value_get_boxed (&program));
1.487 - g_free (start_str);
1.488 - g_free (end_str);
1.489 - }
1.490 -
1.491 - if (list)
1.492 - gmyth_free_program_list (list);
1.493 -
1.494 - g_debug ("%s:%d", __FUNCTION__, __LINE__);
1.495 - return TRUE;
1.496 -}
1.497 -
1.498 -static void
1.499 -gmyth_dbus_server_parse_recorded_info (RecordedInfo *info,
1.500 - GValue *val)
1.501 -{
1.502 - gchar *start_str;
1.503 - gchar *end_str;
1.504 -
1.505 - start_str = g_time_val_to_iso8601 (info->start_time);
1.506 - end_str = g_time_val_to_iso8601 (info->end_time);
1.507 -
1.508 - dbus_g_type_struct_set (val,
1.509 - 0, info->record_id,
1.510 - 1, info->program_id,
1.511 - 2, info->channel_id,
1.512 - 3, start_str,
1.513 - 4, end_str,
1.514 - 5, info->title->str,
1.515 - 6, info->subtitle->str,
1.516 - 7, info->description->str,
1.517 - 8, info->category->str,
1.518 - 9, info->basename->str,
1.519 - 10, info->filesize,
1.520 - G_MAXUINT);
1.521 - g_free (start_str);
1.522 - g_free (end_str);
1.523 -}
1.524 -
1.525 -static gboolean
1.526 -gmyth_dbus_server_get_recorded_info (GObject *obj,
1.527 - const gchar *basename,
1.528 - GValueArray **info,
1.529 - GError **error)
1.530 -{
1.531 - GType record_type;
1.532 - GMythDbusServerPrivate *priv;
1.533 - RecordedInfo *record_info;
1.534 -
1.535 -
1.536 - g_debug ("%s:%d", __FUNCTION__, __LINE__);
1.537 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.538 -
1.539 - g_return_val_if_fail (priv->myth_backend, FALSE);
1.540 - g_return_val_if_fail (gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj)), FALSE);
1.541 -
1.542 - record_type = GMYTH_DBUS_RECORD_G_TYPE;
1.543 -
1.544 - record_info = gmyth_scheduler_get_recorded_info (priv->myth_scheduler,
1.545 - basename);
1.546 -
1.547 - if (record_info)
1.548 - {
1.549 - GValue r = { 0, };
1.550 -
1.551 - g_value_init (&r, record_type);
1.552 - g_value_take_boxed (&r,
1.553 - dbus_g_type_specialized_construct (record_type));
1.554 -
1.555 - gmyth_dbus_server_parse_recorded_info (record_info, &r);
1.556 - gmyth_recorded_info_free (record_info);
1.557 -
1.558 - *info = g_value_get_boxed (&r);
1.559 -
1.560 - return TRUE;
1.561 - }
1.562 -
1.563 - return FALSE;
1.564 -}
1.565 -
1.566 -
1.567 -static gboolean
1.568 -gmyth_dbus_server_get_recorded_list (GObject *obj,
1.569 - GPtrArray **records,
1.570 - GError **error)
1.571 -{
1.572 - GList *list;
1.573 - GList *walk;
1.574 - gint len;
1.575 - GType record_type;
1.576 - GMythDbusServerPrivate *priv;
1.577 -
1.578 - g_debug ("%s:%d", __FUNCTION__, __LINE__);
1.579 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.580 -
1.581 - g_return_val_if_fail (priv->myth_backend, FALSE);
1.582 - g_return_val_if_fail (gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj)), FALSE);
1.583 -
1.584 -
1.585 - len = gmyth_scheduler_get_recorded_list (priv->myth_scheduler,
1.586 - &list);
1.587 -
1.588 - record_type = GMYTH_DBUS_RECORD_G_TYPE;
1.589 - *records = g_ptr_array_sized_new (len);
1.590 -
1.591 - for (walk = list; walk != NULL; walk = walk->next)
1.592 - {
1.593 - GValue record = { 0, };
1.594 - RecordedInfo *data;
1.595 -
1.596 - data = (RecordedInfo *) walk->data;
1.597 -
1.598 - g_value_init (&record, record_type);
1.599 - g_value_take_boxed (&record,
1.600 - dbus_g_type_specialized_construct (record_type));
1.601 -
1.602 - gmyth_dbus_server_parse_recorded_info (data, &record);
1.603 -
1.604 - g_ptr_array_add (*records, g_value_get_boxed (&record));
1.605 - //g_value_unset (&record);
1.606 - }
1.607 -
1.608 - gmyth_recorded_info_list_free (list);
1.609 -
1.610 - return TRUE;
1.611 -
1.612 -}
1.613 -
1.614 -static gboolean
1.615 -gmyth_dbus_server_get_schedule_list (GObject *obj,
1.616 - GPtrArray **schedules)
1.617 -{
1.618 - GList *list;
1.619 - GList *walk;
1.620 - gint len;
1.621 - GType schedule_type;
1.622 - GMythDbusServerPrivate *priv;
1.623 -
1.624 - g_debug ("%s:%d", __FUNCTION__, __LINE__);
1.625 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.626 -
1.627 - g_return_val_if_fail (priv->myth_backend, FALSE);
1.628 - g_return_val_if_fail (gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj)), FALSE);
1.629 -
1.630 -
1.631 - len = gmyth_scheduler_get_schedule_list (priv->myth_scheduler,
1.632 - &list);
1.633 -
1.634 - *schedules = g_ptr_array_sized_new (len);
1.635 - schedule_type = GMYTH_DBUS_SCHEDULE_G_TYPE;
1.636 -
1.637 - for (walk = list; walk != NULL; walk = walk->next)
1.638 - {
1.639 - GValue schedule = { 0, };
1.640 - ScheduleInfo *data;
1.641 - gchar *start_str_time;
1.642 - gchar *end_str_time;
1.643 -
1.644 - data = (ScheduleInfo *) walk->data;
1.645 -
1.646 - g_value_init (&schedule, schedule_type);
1.647 - g_value_take_boxed (&schedule,
1.648 - dbus_g_type_specialized_construct (schedule_type));
1.649 -
1.650 - start_str_time = g_time_val_to_iso8601 (data->start_time);
1.651 - end_str_time = g_time_val_to_iso8601 (data->end_time);
1.652 -
1.653 - dbus_g_type_struct_set (&schedule,
1.654 - 0, data->schedule_id,
1.655 - 1, data->program_id,
1.656 - 2, data->channel_id,
1.657 - 3, start_str_time,
1.658 - 4, end_str_time,
1.659 - 5, data->title->str,
1.660 - 6, data->subtitle->str,
1.661 - 7, data->description->str,
1.662 - 8, data->category->str,
1.663 - 9, data->type,
1.664 - G_MAXUINT);
1.665 -
1.666 - g_ptr_array_add (*schedules, g_value_get_boxed (&schedule));
1.667 -
1.668 - g_free (start_str_time);
1.669 - g_free (end_str_time);
1.670 - }
1.671 -
1.672 - gmyth_schedule_info_list_free (list);
1.673 -
1.674 - return TRUE;
1.675 -}
1.676 -
1.677 -
1.678 -static gboolean
1.679 -gmyth_dbus_server_get_thumbnail (GObject *obj,
1.680 - const gchar *uri,
1.681 - GByteArray **image,
1.682 - GError **error)
1.683 -{
1.684 - GMythFileTransfer *file_transfer;
1.685 - glong filesize;
1.686 - GMythFileReadResult result;
1.687 - GMythDbusServerPrivate *priv;
1.688 -
1.689 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.690 -
1.691 - g_return_val_if_fail (priv->myth_backend, FALSE);
1.692 -
1.693 - if (!gmyth_util_file_exists (priv->myth_backend, uri))
1.694 - goto fail;
1.695 -
1.696 - file_transfer = gmyth_file_transfer_new (priv->myth_backend);
1.697 -
1.698 - if (!gmyth_file_transfer_open (file_transfer, uri))
1.699 - goto fail;
1.700 -
1.701 - filesize = gmyth_file_transfer_get_filesize (file_transfer);
1.702 - if (filesize <= 0)
1.703 - goto fail;
1.704 -
1.705 - *image = g_byte_array_new ();
1.706 - result = gmyth_file_transfer_read (file_transfer, *image, filesize, FALSE);
1.707 - if (result == GMYTH_FILE_READ_ERROR)
1.708 - goto fail;
1.709 -
1.710 - gmyth_file_transfer_close (file_transfer);
1.711 - g_object_unref (file_transfer);
1.712 -
1.713 - if (filesize > (*image)->len)
1.714 - goto fail;
1.715 -
1.716 - return TRUE;
1.717 -
1.718 -fail:
1.719 - if (*image)
1.720 - g_byte_array_free (*image, TRUE);
1.721 - g_object_unref(file_transfer);
1.722 - return FALSE;
1.723 -}
1.724 -
1.725 -static gboolean
1.726 -gmyth_dbus_server_get_channel_icon (GObject *obj,
1.727 - guint channel_id,
1.728 - GByteArray **icon,
1.729 - GError **error)
1.730 -{
1.731 - GMythChannelInfo *channel = NULL;
1.732 - guint8 *icon_data;
1.733 - guint icon_length;
1.734 - GMythDbusServerPrivate *priv;
1.735 -
1.736 - g_debug ("%s:%d", __FUNCTION__, __LINE__);
1.737 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.738 - g_return_val_if_fail (priv->myth_backend, FALSE);
1.739 -
1.740 - channel = gmyth_epg_get_channel_info (priv->myth_epg,
1.741 - (gint) channel_id);
1.742 -
1.743 - *icon = NULL;
1.744 -
1.745 - if (channel == NULL)
1.746 - return FALSE;
1.747 -
1.748 - if (!gmyth_epg_channel_has_icon(priv->myth_epg, channel))
1.749 - {
1.750 - gmyth_channel_info_free (channel);
1.751 - g_debug("Channel does not have icon available");
1.752 - return FALSE;
1.753 - }
1.754 -
1.755 - icon_data = NULL;
1.756 - icon_length = 0;
1.757 - if (!gmyth_epg_channel_get_icon (priv->myth_epg,
1.758 - channel,
1.759 - &icon_data,
1.760 - &icon_length))
1.761 - {
1.762 - gmyth_channel_info_free (channel);
1.763 - g_warning("Could not get channel icon for channel id = %u", channel_id);
1.764 - return FALSE;
1.765 - }
1.766 -
1.767 - *icon = g_byte_array_sized_new (icon_length);
1.768 - *icon = g_byte_array_append (*icon, icon_data, icon_length);
1.769 -
1.770 - g_free (icon_data);
1.771 - gmyth_channel_info_free(channel);
1.772 - return TRUE;
1.773 -}
1.774 -
1.775 -
1.776 -static gboolean
1.777 -gmyth_dbus_server_stop_recording (GObject *obj,
1.778 - guint channel_id,
1.779 - gboolean *result,
1.780 - GError **error)
1.781 -{
1.782 - gboolean ret = FALSE;
1.783 - GMythDbusServerPrivate *priv;
1.784 -
1.785 - g_debug ("%s:%d", __FUNCTION__, __LINE__);
1.786 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.787 -
1.788 - g_return_val_if_fail (priv->myth_backend, FALSE);
1.789 - g_return_val_if_fail (gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj)), FALSE);
1.790 -
1.791 - ret = gmyth_scheduler_stop_recording (priv->myth_scheduler,
1.792 - channel_id);
1.793 -
1.794 - return ret;
1.795 -}
1.796 -
1.797 -static ScheduleInfo*
1.798 -gmyth_dbus_server_new_schedule_info (const gchar* description,
1.799 - guint channel_id,
1.800 - guint program_id,
1.801 - GTimeVal *start_vtime,
1.802 - GTimeVal *end_vtime)
1.803 -{
1.804 - ScheduleInfo *new_sched_info;
1.805 -
1.806 - new_sched_info = g_new0(ScheduleInfo, 1);
1.807 -
1.808 - /* record_id == -1 for generating a new id */
1.809 - new_sched_info->schedule_id = -1;
1.810 -
1.811 - new_sched_info->channel_id = channel_id;
1.812 - new_sched_info->program_id = program_id;
1.813 - new_sched_info->start_time = g_new0 (GTimeVal, 1);
1.814 - *new_sched_info->start_time = *start_vtime;
1.815 - new_sched_info->end_time = g_new0 (GTimeVal, 1);
1.816 - *new_sched_info->end_time = *end_vtime;
1.817 -
1.818 - /* TODO: there is no frequency field */
1.819 - /*new_sched_info->frequency = -1;*/
1.820 -
1.821 - if (description != NULL) {
1.822 - /* FIXME: description parameter is used as title and description */
1.823 - new_sched_info->title = g_string_new(description);
1.824 - new_sched_info->description = g_string_new(description);
1.825 - }
1.826 -
1.827 - return new_sched_info;
1.828 -}
1.829 -
1.830 -static gboolean
1.831 -gmyth_dbus_server_add_schedule (GObject *obj,
1.832 - guint channel_id,
1.833 - guint program_id,
1.834 - const gchar *start_time,
1.835 - const gchar *end_time,
1.836 - gboolean recurring,
1.837 - const gchar *description,
1.838 - guint *schedule_id,
1.839 - GError **error)
1.840 -{
1.841 - ScheduleInfo *sch_info;
1.842 - GTimeVal start_vtime;
1.843 - GTimeVal end_vtime;
1.844 - GMythDbusServerPrivate *priv;
1.845 -
1.846 - g_debug ("%s:%d", __FUNCTION__, __LINE__);
1.847 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.848 -
1.849 - *schedule_id = 0;
1.850 -
1.851 - g_return_val_if_fail (priv->myth_backend, FALSE);
1.852 - g_return_val_if_fail (gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj)), FALSE);
1.853 -
1.854 -
1.855 - g_time_val_from_iso8601 (start_time, &start_vtime);
1.856 - g_time_val_from_iso8601 (end_time, &end_vtime);
1.857 - sch_info = gmyth_dbus_server_new_schedule_info (description,
1.858 - channel_id,
1.859 - program_id,
1.860 - &start_vtime,
1.861 - &end_vtime);
1.862 - if (sch_info != NULL) {
1.863 - GMythScheduleType type;
1.864 - GTimeVal t_now;
1.865 - gboolean has_record;
1.866 -
1.867 - type = (recurring ?
1.868 - GMYTH_SCHEDULE_ALL_OCCURRENCES :
1.869 - GMYTH_SCHEDULE_ONE_OCCURRENCE);
1.870 -
1.871 - g_get_current_time (&t_now);
1.872 -
1.873 - has_record = gmyth_scheduler_was_recorded_before (priv->myth_scheduler,
1.874 - channel_id,
1.875 - (time_t) start_vtime.tv_sec);
1.876 -
1.877 -
1.878 - if ((t_now.tv_sec >= start_vtime.tv_sec)
1.879 - && (t_now.tv_sec <= end_vtime.tv_sec) && has_record)
1.880 - {
1.881 - GMythSocket *socket;
1.882 - gboolean res = FALSE;
1.883 -
1.884 - socket = gmyth_backend_info_get_connected_socket (priv->myth_backend);
1.885 - res = gmyth_scheduler_reactivate_schedule(priv->myth_scheduler,
1.886 - channel_id,
1.887 - (time_t) start_vtime.tv_sec);
1.888 - if (res) {
1.889 - GMythStringList *slist = gmyth_string_list_new();
1.890 -
1.891 - gmyth_string_list_append_char_array(slist, "RESCHEDULE_RECORDINGS 0");
1.892 - gmyth_socket_sendreceive_stringlist(socket, slist);
1.893 - res = (gmyth_string_list_get_int(slist, 0) == 1);
1.894 - g_object_unref(slist);
1.895 - }
1.896 -
1.897 - g_object_unref(socket);
1.898 - return res;
1.899 - }
1.900 - else
1.901 - {
1.902 - if (!gmyth_scheduler_add_schedule_full (priv->myth_scheduler,
1.903 - sch_info,
1.904 - type))
1.905 - {
1.906 - g_warning("Could not add schedule entry");
1.907 - return FALSE;
1.908 - }
1.909 -
1.910 - (*schedule_id) = sch_info->schedule_id;
1.911 - gmyth_schedule_info_free (sch_info);
1.912 - return TRUE;
1.913 - }
1.914 - }
1.915 - return FALSE;
1.916 -}
1.917 -
1.918 -static gboolean
1.919 -gmyth_dbus_server_add_exception (GObject *obj,
1.920 - guint schedule_id,
1.921 - guint channel_id,
1.922 - guint program_id,
1.923 - const gchar *start_time,
1.924 - const gchar *end_time,
1.925 - const gchar *description,
1.926 - GError **error)
1.927 -{
1.928 - ScheduleInfo *sch_info;
1.929 - GTimeVal start_vtime;
1.930 - GTimeVal end_vtime;
1.931 - GMythDbusServerPrivate *priv;
1.932 -
1.933 - g_debug ("%s:%d", __FUNCTION__, __LINE__);
1.934 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.935 -
1.936 - g_return_val_if_fail (priv->myth_backend, FALSE);
1.937 - g_return_val_if_fail (gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj)), FALSE);
1.938 -
1.939 - g_time_val_from_iso8601 (start_time, &start_vtime);
1.940 - g_time_val_from_iso8601 (end_time, &end_vtime);
1.941 -
1.942 - sch_info = gmyth_dbus_server_new_schedule_info (description,
1.943 - channel_id,
1.944 - program_id,
1.945 - &start_vtime,
1.946 - &end_vtime);
1.947 - if (sch_info != NULL)
1.948 - {
1.949 - if (!gmyth_scheduler_add_exception (priv->myth_scheduler,
1.950 - schedule_id,
1.951 - sch_info))
1.952 - {
1.953 - g_warning ("Could not add schedule exception");
1.954 - gmyth_schedule_info_free (sch_info);
1.955 - return FALSE;
1.956 - }
1.957 -
1.958 - gmyth_schedule_info_free (sch_info);
1.959 - return TRUE;
1.960 - }
1.961 - return FALSE;
1.962 -}
1.963 -
1.964 -static gboolean
1.965 -gmyth_dbus_server_remove_schedule (GObject *obj,
1.966 - guint schedule_id,
1.967 - GError **error)
1.968 -{
1.969 - GMythDbusServerPrivate *priv;
1.970 -
1.971 - g_debug ("%s:%d", __FUNCTION__, __LINE__);
1.972 - priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
1.973 -
1.974 - g_return_val_if_fail (priv->myth_backend, FALSE);
1.975 - g_return_val_if_fail (gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj)), FALSE);
1.976 -
1.977 - return gmyth_scheduler_delete_schedule (priv->myth_scheduler, schedule_id);
1.978 -}
1.979 -
1.980 -GMythDbusServer*
1.981 -gmyth_dbus_server_start_dbus_service (void)
1.982 -{
1.983 - GError *error = NULL;
1.984 - DBusGProxy *proxy;
1.985 - DBusGConnection *bus;
1.986 - guint request_ret;
1.987 - GMythDbusServer *self;
1.988 -
1.989 - self = g_object_new (GMYTH_DBUS_SERVER_TYPE, NULL);
1.990 - g_return_val_if_fail (self, FALSE);
1.991 -
1.992 - /* TODO: should verify if this service was already started */
1.993 -
1.994 - /* connect to session bus */
1.995 - bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
1.996 - if (bus == NULL)
1.997 - {
1.998 - g_warning ("Could not connect to dbus: %s", error->message);
1.999 - g_error_free (error);
1.1000 - goto fail;
1.1001 - }
1.1002 -
1.1003 - /* register dbus object */
1.1004 - dbus_g_connection_register_g_object (bus,
1.1005 - GMYTH_DBUS_SERVER_PATH, G_OBJECT (self));
1.1006 -
1.1007 - proxy = dbus_g_proxy_new_for_name (bus, DBUS_SERVICE_DBUS,
1.1008 - DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
1.1009 -
1.1010 - /* registering download manager service */
1.1011 - if (!org_freedesktop_DBus_request_name (proxy, GMYTH_DBUS_SERVER_IFACE,
1.1012 - 0, &request_ret, &error))
1.1013 - {
1.1014 - g_warning ("Unable to register dbus service: %d %s",
1.1015 - error->code, error->message);
1.1016 - g_error_free (error);
1.1017 - goto fail;
1.1018 - }
1.1019 -
1.1020 - if (request_ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
1.1021 - {
1.1022 - g_warning ("Got result code %u from requesting name", request_ret);
1.1023 - goto fail;
1.1024 - }
1.1025 -
1.1026 - return self;
1.1027 -
1.1028 -fail:
1.1029 - g_object_unref (self);
1.1030 - return NULL;
1.1031 -}
1.1032 -