myth-dbus/src/gmyth-dbus-server.c
author renatofilho
Wed Oct 24 20:01:02 2007 +0100 (2007-10-24)
branchtrunk
changeset 865 3eeb6b565018
child 866 640fc18c9f37
permissions -rw-r--r--
[svn r871] created myth dbus service
renatofilho@865
     1
/**
renatofilho@865
     2
 * GMyth Library
renatofilho@865
     3
 *
renatofilho@865
     4
 * @file gmyth/gmyth_backend_info.c
renatofilho@865
     5
 * 
renatofilho@865
     6
 * @brief <p> This component represents all the MythTV backend server
renatofilho@865
     7
 * 						configuration information.
renatofilho@865
     8
 *
renatofilho@865
     9
 * Copyright (C) 2006 INdT - Instituto Nokia de Tecnologia.
renatofilho@865
    10
 * @author Renato Filho  <renato.filho@indt.org.br>
renatofilho@865
    11
 *
renatofilho@865
    12
 *
renatofilho@865
    13
 * This program is free software; you can redistribute it and/or modify
renatofilho@865
    14
 * it under the terms of the GNU Lesser General Public License as published by
renatofilho@865
    15
 * the Free Software Foundation; either version 2 of the License, or
renatofilho@865
    16
 * (at your option) any later version.
renatofilho@865
    17
 *
renatofilho@865
    18
 * This program is distributed in the hope that it will be useful,
renatofilho@865
    19
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
renatofilho@865
    20
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
renatofilho@865
    21
 * GNU General Public License for more details.
renatofilho@865
    22
 *
renatofilho@865
    23
 * You should have received a copy of the GNU Lesser General Public License
renatofilho@865
    24
 * along with this program; if not, write to the Free Software
renatofilho@865
    25
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
renatofilho@865
    26
 */
renatofilho@865
    27
renatofilho@865
    28
renatofilho@865
    29
#ifdef HAVE_CONFIG_H
renatofilho@865
    30
#include "config.h"
renatofilho@865
    31
#endif
renatofilho@865
    32
renatofilho@865
    33
renatofilho@865
    34
#include <gmyth/gmyth.h>
renatofilho@865
    35
#include <dbus/dbus-glib-bindings.h>
renatofilho@865
    36
renatofilho@865
    37
renatofilho@865
    38
#include "gmyth-dbus-common.h"
renatofilho@865
    39
#include "gmyth-dbus-server.h"
renatofilho@865
    40
renatofilho@865
    41
#define MYTH_DEFAULT_DB             "mythconverg"
renatofilho@865
    42
renatofilho@865
    43
renatofilho@865
    44
typedef struct _GMythDbusServerPrivate GMythDbusServerPrivate;
renatofilho@865
    45
renatofilho@865
    46
struct _GMythDbusServerPrivate
renatofilho@865
    47
{
renatofilho@865
    48
    GMythBackendInfo *myth_backend;
renatofilho@865
    49
    GMythEPG         *myth_epg;
renatofilho@865
    50
    GMythScheduler   *myth_scheduler;
renatofilho@865
    51
};
renatofilho@865
    52
renatofilho@865
    53
#define GMYTH_DBUS_SERVER_GET_PRIVATE(o) \
renatofilho@865
    54
    (G_TYPE_INSTANCE_GET_PRIVATE ((o), GMYTH_DBUS_SERVER_TYPE, GMythDbusServerPrivate))
renatofilho@865
    55
renatofilho@865
    56
static void gmyth_dbus_server_class_init (GMythDbusServerClass *klass);
renatofilho@865
    57
static void gmyth_dbus_server_init       (GMythDbusServer *self);
renatofilho@865
    58
static void gmyth_dbus_server_dispose    (GObject *object);
renatofilho@865
    59
static void gmyth_dbus_server_finalize   (GObject *object);
renatofilho@865
    60
renatofilho@865
    61
/* Dbus */
renatofilho@865
    62
static gboolean gmyth_dbus_server_connect           (GObject *obj,
renatofilho@865
    63
                                                     const gchar *host,
renatofilho@865
    64
                                                     guint port,
renatofilho@865
    65
                                                     const gchar *user,
renatofilho@865
    66
                                                     const gchar *password,
renatofilho@865
    67
                                                     gboolean *result,
renatofilho@865
    68
                                                     GError **error);
renatofilho@865
    69
static gboolean gmyth_dbus_server_get_channel_list  (GObject *obj,
renatofilho@865
    70
                                                     GPtrArray **channels,
renatofilho@865
    71
                                                     GError **error);
renatofilho@865
    72
static gboolean gmyth_dbus_server_get_channel_info  (GObject *obj,
renatofilho@865
    73
                                                     gint channel_id,
renatofilho@865
    74
                                                     GValue **info,
renatofilho@865
    75
                                                     GError **error);
renatofilho@865
    76
static gboolean gmyth_dbus_server_file_exists       (GObject *obj,
renatofilho@865
    77
                                                     const gchar *file_name,
renatofilho@865
    78
                                                     gboolean *exists,
renatofilho@865
    79
                                                     GError **error);
renatofilho@865
    80
static gboolean gmyth_dbus_server_get_recorded_list (GObject *obj,
renatofilho@865
    81
                                                     GPtrArray **channels,
renatofilho@865
    82
                                                     GError **error);
renatofilho@865
    83
static gboolean gmyth_dbus_server_get_recorded_info (GObject *obj,
renatofilho@865
    84
                                                     const gchar *basename,
renatofilho@865
    85
                                                     GValue **info,
renatofilho@865
    86
                                                     GError **error);
renatofilho@865
    87
static gboolean gmyth_dbus_server_get_program_list  (GObject *obj,
renatofilho@865
    88
                                                     gint channel_id,
renatofilho@865
    89
                                                     const gchar *start_time,
renatofilho@865
    90
                                                     const gchar *end_time,
renatofilho@865
    91
                                                     GPtrArray **program_list);
renatofilho@865
    92
static gboolean gmyth_dbus_server_get_schedule_list (GObject *obj,
renatofilho@865
    93
                                                     GPtrArray **schedule_list);
renatofilho@865
    94
renatofilho@865
    95
static gboolean gmyth_dbus_server_connected         (GObject *obj,
renatofilho@865
    96
                                                     gboolean *status,
renatofilho@865
    97
                                                     GError **error);
renatofilho@865
    98
static gboolean gmyth_dbus_server_disconnect        (GObject *obj,
renatofilho@865
    99
                                                     GError **error);
renatofilho@865
   100
static gboolean gmyth_dbus_server_get_server_info   (GObject *obj,
renatofilho@865
   101
                                                     guint64 *total_space,
renatofilho@865
   102
                                                     guint64 *used_space,
renatofilho@865
   103
                                                     guint64 *free_space,
renatofilho@865
   104
                                                     GError **error);
renatofilho@865
   105
static gboolean gmyth_dbus_server_get_thumbnail     (GObject *obj,
renatofilho@865
   106
                                                     const gchar *uri,
renatofilho@865
   107
                                                     GByteArray **image,
renatofilho@865
   108
                                                     GError **error);
renatofilho@865
   109
static gboolean gmyth_dbus_server_get_channel_icon  (GObject *obj,
renatofilho@865
   110
                                                     guint channel_id,
renatofilho@865
   111
                                                     GByteArray **icon,
renatofilho@865
   112
                                                     GError **error);
renatofilho@865
   113
static gboolean gmyth_dbus_server_stop_recording    (GObject *obj,
renatofilho@865
   114
                                                     guint channel_id,
renatofilho@865
   115
                                                     gboolean *result,
renatofilho@865
   116
                                                     GError **error);
renatofilho@865
   117
static gboolean gmyth_dbus_server_add_schedule      (GObject *obj,
renatofilho@865
   118
                                                     guint channel_id,
renatofilho@865
   119
                                                     guint program_id,
renatofilho@865
   120
                                                     const gchar *start_time,
renatofilho@865
   121
                                                     const gchar *end_time,
renatofilho@865
   122
                                                     gboolean recurring,
renatofilho@865
   123
                                                     const gchar *description,
renatofilho@865
   124
                                                     guint *schedule_id,
renatofilho@865
   125
                                                     GError **error);
renatofilho@865
   126
static gboolean gmyth_dbus_server_add_exception     (GObject *obj,
renatofilho@865
   127
                                                     guint schedule_id,
renatofilho@865
   128
                                                     guint channel_id,
renatofilho@865
   129
                                                     guint program_id,
renatofilho@865
   130
                                                     const gchar *start_time,
renatofilho@865
   131
                                                     const gchar *end_time,
renatofilho@865
   132
                                                     const gchar *description,
renatofilho@865
   133
                                                     GError **error);
renatofilho@865
   134
static gboolean gmyth_dbus_server_remove_schedule   (GObject *obj,
renatofilho@865
   135
                                                     guint schedule_id,
renatofilho@865
   136
                                                     GError **error);
renatofilho@865
   137
renatofilho@865
   138
renatofilho@865
   139
#include "gmyth-dbus-server-glue.h"
renatofilho@865
   140
renatofilho@865
   141
renatofilho@865
   142
G_DEFINE_TYPE (GMythDbusServer, gmyth_dbus_server, G_TYPE_OBJECT);
renatofilho@865
   143
renatofilho@865
   144
static void
renatofilho@865
   145
gmyth_dbus_server_class_init (GMythDbusServerClass *klass)
renatofilho@865
   146
{
renatofilho@865
   147
    GObjectClass *object_class = G_OBJECT_CLASS (klass);
renatofilho@865
   148
renatofilho@865
   149
    g_type_class_add_private (klass, sizeof (GMythDbusServerPrivate));
renatofilho@865
   150
renatofilho@865
   151
    object_class->dispose = gmyth_dbus_server_dispose;
renatofilho@865
   152
    object_class->finalize = gmyth_dbus_server_finalize;
renatofilho@865
   153
renatofilho@865
   154
    dbus_g_object_type_install_info (GMYTH_DBUS_SERVER_TYPE,
renatofilho@865
   155
                                     &dbus_glib_gmyth_dbus_server_object_info);
renatofilho@865
   156
}
renatofilho@865
   157
renatofilho@865
   158
static void
renatofilho@865
   159
gmyth_dbus_server_init (GMythDbusServer *self)
renatofilho@865
   160
{
renatofilho@865
   161
}
renatofilho@865
   162
renatofilho@865
   163
static void
renatofilho@865
   164
gmyth_dbus_server_dispose (GObject *object)
renatofilho@865
   165
{
renatofilho@865
   166
    G_OBJECT_CLASS (gmyth_dbus_server_parent_class)->dispose (object);
renatofilho@865
   167
}
renatofilho@865
   168
renatofilho@865
   169
static void
renatofilho@865
   170
gmyth_dbus_server_finalize (GObject *object)
renatofilho@865
   171
{
renatofilho@865
   172
    G_OBJECT_CLASS (gmyth_dbus_server_parent_class)->finalize (object);
renatofilho@865
   173
}
renatofilho@865
   174
renatofilho@865
   175
static gboolean
renatofilho@865
   176
gmyth_dbus_server_connect_epg (GMythDbusServer *server)
renatofilho@865
   177
{
renatofilho@865
   178
    GMythDbusServerPrivate *priv;
renatofilho@865
   179
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (server);
renatofilho@865
   180
renatofilho@865
   181
    if (!priv->myth_epg)
renatofilho@865
   182
    {
renatofilho@865
   183
        priv->myth_epg = gmyth_epg_new();
renatofilho@865
   184
        if (!gmyth_epg_connect (priv->myth_epg, priv->myth_backend))
renatofilho@865
   185
        {
renatofilho@865
   186
            g_object_unref (priv->myth_epg);
renatofilho@865
   187
            priv->myth_epg = NULL;
renatofilho@865
   188
            return FALSE;
renatofilho@865
   189
        }
renatofilho@865
   190
    }
renatofilho@865
   191
renatofilho@865
   192
    return TRUE;
renatofilho@865
   193
}
renatofilho@865
   194
renatofilho@865
   195
static gboolean
renatofilho@865
   196
gmyth_dbus_server_connect_scheduler (GMythDbusServer *server)
renatofilho@865
   197
{
renatofilho@865
   198
    GMythDbusServerPrivate *priv;
renatofilho@865
   199
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (server);
renatofilho@865
   200
renatofilho@865
   201
    if (!priv->myth_scheduler)
renatofilho@865
   202
    {
renatofilho@865
   203
        priv->myth_scheduler = gmyth_scheduler_new ();
renatofilho@865
   204
        if (!gmyth_scheduler_connect (priv->myth_scheduler,
renatofilho@865
   205
                                      priv->myth_backend))
renatofilho@865
   206
        {
renatofilho@865
   207
            g_object_unref (priv->myth_scheduler);
renatofilho@865
   208
            priv->myth_scheduler = NULL;
renatofilho@865
   209
            return FALSE;
renatofilho@865
   210
        }
renatofilho@865
   211
    }
renatofilho@865
   212
renatofilho@865
   213
    return TRUE;
renatofilho@865
   214
}
renatofilho@865
   215
renatofilho@865
   216
static gboolean
renatofilho@865
   217
gmyth_dbus_server_connect  (GObject *obj,
renatofilho@865
   218
                            const gchar *host,
renatofilho@865
   219
                            guint port,
renatofilho@865
   220
                            const gchar *user,
renatofilho@865
   221
                            const gchar *password,
renatofilho@865
   222
                            gboolean *result,
renatofilho@865
   223
                            GError **error)
renatofilho@865
   224
{
renatofilho@865
   225
    GMythDbusServerPrivate *priv;
renatofilho@865
   226
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   227
renatofilho@865
   228
    if (priv->myth_backend)
renatofilho@865
   229
        return TRUE;
renatofilho@865
   230
renatofilho@865
   231
    priv->myth_backend = gmyth_backend_info_new_full (host,
renatofilho@865
   232
                                                      user,
renatofilho@865
   233
                                                      password,
renatofilho@865
   234
                                                      MYTH_DEFAULT_DB,
renatofilho@865
   235
                                                      port);
renatofilho@865
   236
    *result = TRUE;
renatofilho@865
   237
    return TRUE;
renatofilho@865
   238
}
renatofilho@865
   239
renatofilho@865
   240
static gboolean
renatofilho@865
   241
gmyth_dbus_server_connected (GObject *obj,
renatofilho@865
   242
                             gboolean *status,
renatofilho@865
   243
                             GError **error)
renatofilho@865
   244
{
renatofilho@865
   245
    GMythDbusServerPrivate *priv;
renatofilho@865
   246
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   247
renatofilho@865
   248
    if (priv->myth_backend)
renatofilho@865
   249
        *status = TRUE;
renatofilho@865
   250
    else
renatofilho@865
   251
        *status = FALSE;
renatofilho@865
   252
    return TRUE;
renatofilho@865
   253
}
renatofilho@865
   254
renatofilho@865
   255
static gboolean
renatofilho@865
   256
gmyth_dbus_server_disconnect (GObject *obj,
renatofilho@865
   257
                              GError **error)
renatofilho@865
   258
{
renatofilho@865
   259
    GMythDbusServerPrivate *priv;
renatofilho@865
   260
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   261
renatofilho@865
   262
    if (priv->myth_epg)
renatofilho@865
   263
    {
renatofilho@865
   264
        g_object_unref (priv->myth_epg);
renatofilho@865
   265
        priv->myth_epg = NULL;
renatofilho@865
   266
    }
renatofilho@865
   267
renatofilho@865
   268
renatofilho@865
   269
    if (priv->myth_backend)
renatofilho@865
   270
    {
renatofilho@865
   271
        g_object_unref (priv->myth_backend);
renatofilho@865
   272
        priv->myth_backend = NULL;
renatofilho@865
   273
    }
renatofilho@865
   274
renatofilho@865
   275
    if (priv->myth_scheduler)
renatofilho@865
   276
    {
renatofilho@865
   277
        g_object_unref (priv->myth_scheduler);
renatofilho@865
   278
        priv->myth_scheduler = NULL;
renatofilho@865
   279
    }
renatofilho@865
   280
renatofilho@865
   281
renatofilho@865
   282
    return TRUE;
renatofilho@865
   283
}
renatofilho@865
   284
renatofilho@865
   285
static gboolean
renatofilho@865
   286
gmyth_dbus_server_get_server_info (GObject *obj,
renatofilho@865
   287
                                   guint64 *total_space,
renatofilho@865
   288
                                   guint64 *used_space,
renatofilho@865
   289
                                   guint64 *free_space,
renatofilho@865
   290
                                   GError **error)
renatofilho@865
   291
{
renatofilho@865
   292
    GMythBackendDetails *details;
renatofilho@865
   293
    GMythDbusServerPrivate *priv;
renatofilho@865
   294
    gboolean ret = FALSE;
renatofilho@865
   295
    GMythSocket *socket;
renatofilho@865
   296
renatofilho@865
   297
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   298
renatofilho@865
   299
    g_return_val_if_fail (priv->myth_backend != NULL, FALSE);
renatofilho@865
   300
renatofilho@865
   301
    socket = gmyth_backend_info_get_connected_socket (priv->myth_backend);
renatofilho@865
   302
renatofilho@865
   303
    details = NULL;
renatofilho@865
   304
    gmyth_util_get_backend_details (socket,
renatofilho@865
   305
                                    &details);
renatofilho@865
   306
    if (details)
renatofilho@865
   307
    {
renatofilho@865
   308
        *total_space = details->total_space;
renatofilho@865
   309
        *used_space = details->used_space;
renatofilho@865
   310
        *free_space = *total_space - *used_space;
renatofilho@865
   311
        gmyth_util_backend_details_free (details);
renatofilho@865
   312
renatofilho@865
   313
        ret = TRUE;
renatofilho@865
   314
    }
renatofilho@865
   315
renatofilho@865
   316
    g_object_unref (socket);
renatofilho@865
   317
renatofilho@865
   318
    return ret;
renatofilho@865
   319
}
renatofilho@865
   320
renatofilho@865
   321
renatofilho@865
   322
static void
renatofilho@865
   323
gmyth_dbus_server_parse_channel_info (GMythChannelInfo *info,
renatofilho@865
   324
                                      GValue *val)
renatofilho@865
   325
{
renatofilho@865
   326
    dbus_g_type_struct_set (val,
renatofilho@865
   327
                            0, info->channel_ID,
renatofilho@865
   328
                            1, info->channel_num->str,
renatofilho@865
   329
                            2, info->channel_name->str,
renatofilho@865
   330
                            3, info->channel_icon->str,
renatofilho@865
   331
                            G_MAXUINT);
renatofilho@865
   332
}
renatofilho@865
   333
renatofilho@865
   334
static gboolean 
renatofilho@865
   335
gmyth_dbus_server_get_channel_info  (GObject *obj,
renatofilho@865
   336
                                     gint channel_id,
renatofilho@865
   337
                                     GValue **info,
renatofilho@865
   338
                                     GError **error)
renatofilho@865
   339
{
renatofilho@865
   340
    GType ch_type;
renatofilho@865
   341
    GMythChannelInfo *ch_info;
renatofilho@865
   342
    GMythDbusServerPrivate *priv;
renatofilho@865
   343
renatofilho@865
   344
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   345
renatofilho@865
   346
    g_return_val_if_fail (priv->myth_backend != NULL, FALSE);
renatofilho@865
   347
    g_return_val_if_fail (gmyth_dbus_server_connect_epg (GMYTH_DBUS_SERVER (obj)), FALSE);
renatofilho@865
   348
renatofilho@865
   349
    ch_type = GMYTH_DBUS_CHANNEL_G_TYPE;
renatofilho@865
   350
renatofilho@865
   351
    ch_info = gmyth_epg_get_channel_info (priv->myth_epg, channel_id);
renatofilho@865
   352
    if (ch_info)
renatofilho@865
   353
    {
renatofilho@865
   354
        *info = g_new0 (GValue, 1);
renatofilho@865
   355
        g_value_init (*info, ch_type);
renatofilho@865
   356
        g_value_set_static_boxed (*info, dbus_g_type_specialized_construct (ch_type));
renatofilho@865
   357
        gmyth_dbus_server_parse_channel_info (ch_info, *info);
renatofilho@865
   358
        return TRUE;
renatofilho@865
   359
    }
renatofilho@865
   360
renatofilho@865
   361
    return FALSE;
renatofilho@865
   362
}
renatofilho@865
   363
renatofilho@865
   364
renatofilho@865
   365
static gboolean
renatofilho@865
   366
gmyth_dbus_server_get_channel_list (GObject *obj,
renatofilho@865
   367
                                    GPtrArray **channels,
renatofilho@865
   368
                                    GError **error)
renatofilho@865
   369
{
renatofilho@865
   370
    GList *lst;
renatofilho@865
   371
    GList *walk;
renatofilho@865
   372
    int len;
renatofilho@865
   373
    GType ch_type;
renatofilho@865
   374
    GMythDbusServerPrivate *priv;
renatofilho@865
   375
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   376
renatofilho@865
   377
    g_return_val_if_fail (priv->myth_backend != NULL, FALSE);
renatofilho@865
   378
    g_return_val_if_fail (gmyth_dbus_server_connect_epg (GMYTH_DBUS_SERVER (obj)), FALSE);
renatofilho@865
   379
renatofilho@865
   380
renatofilho@865
   381
    len = gmyth_epg_get_channel_list (priv->myth_epg, &lst);
renatofilho@865
   382
renatofilho@865
   383
    *channels = g_ptr_array_sized_new (len);
renatofilho@865
   384
    ch_type = GMYTH_DBUS_CHANNEL_G_TYPE;
renatofilho@865
   385
renatofilho@865
   386
    for (walk = lst; walk != NULL; walk = walk->next)
renatofilho@865
   387
    {
renatofilho@865
   388
        GValue ch = { 0, };
renatofilho@865
   389
        GMythChannelInfo *data;
renatofilho@865
   390
renatofilho@865
   391
        data = (GMythChannelInfo *) walk->data;
renatofilho@865
   392
renatofilho@865
   393
        g_value_init (&ch, ch_type);
renatofilho@865
   394
        g_value_set_static_boxed (&ch, dbus_g_type_specialized_construct (ch_type));
renatofilho@865
   395
        gmyth_dbus_server_parse_channel_info (data, &ch);
renatofilho@865
   396
        g_ptr_array_add (*channels, g_value_get_boxed (&ch));
renatofilho@865
   397
    }
renatofilho@865
   398
renatofilho@865
   399
    gmyth_free_channel_list (lst);
renatofilho@865
   400
    return TRUE;
renatofilho@865
   401
}
renatofilho@865
   402
renatofilho@865
   403
static gboolean
renatofilho@865
   404
gmyth_dbus_server_file_exists (GObject *obj,
renatofilho@865
   405
                               const gchar *file_name,
renatofilho@865
   406
                               gboolean *exists,
renatofilho@865
   407
                               GError **error)
renatofilho@865
   408
{
renatofilho@865
   409
    GMythDbusServerPrivate *priv;
renatofilho@865
   410
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   411
renatofilho@865
   412
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@865
   413
renatofilho@865
   414
    *exists = gmyth_util_file_exists (priv->myth_backend, file_name);
renatofilho@865
   415
renatofilho@865
   416
    return TRUE;
renatofilho@865
   417
}
renatofilho@865
   418
renatofilho@865
   419
static gboolean
renatofilho@865
   420
gmyth_dbus_server_get_program_list (GObject *obj,
renatofilho@865
   421
                                    gint program_id,
renatofilho@865
   422
                                    const gchar *start_time,
renatofilho@865
   423
                                    const gchar *end_time,
renatofilho@865
   424
                                    GPtrArray **programs)
renatofilho@865
   425
{
renatofilho@865
   426
    GList *list;
renatofilho@865
   427
    GList *walk;
renatofilho@865
   428
    gint len;
renatofilho@865
   429
    GType program_type;
renatofilho@865
   430
    GTimeVal start_time_val;
renatofilho@865
   431
    GTimeVal end_time_val;
renatofilho@865
   432
    GMythDbusServerPrivate *priv;
renatofilho@865
   433
renatofilho@865
   434
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   435
renatofilho@865
   436
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@865
   437
    g_return_val_if_fail (gmyth_dbus_server_connect_epg (GMYTH_DBUS_SERVER (obj)), FALSE);
renatofilho@865
   438
renatofilho@865
   439
renatofilho@865
   440
    g_time_val_from_iso8601 (start_time, &start_time_val);
renatofilho@865
   441
    g_time_val_from_iso8601 (end_time, &end_time_val);
renatofilho@865
   442
renatofilho@865
   443
    len = gmyth_epg_get_program_list (priv->myth_epg,
renatofilho@865
   444
                                      &list,
renatofilho@865
   445
                                      program_id,
renatofilho@865
   446
                                      &start_time_val,
renatofilho@865
   447
                                      &end_time_val);
renatofilho@865
   448
renatofilho@865
   449
    *programs = g_ptr_array_sized_new (len);
renatofilho@865
   450
    program_type = GMYTH_DBUS_PROGRAM_G_TYPE;
renatofilho@865
   451
renatofilho@865
   452
    for (walk = list; walk != NULL; walk = walk->next)
renatofilho@865
   453
    {
renatofilho@865
   454
        GValue program = { 0, };
renatofilho@865
   455
        gchar *start_str;
renatofilho@865
   456
        gchar *end_str;
renatofilho@865
   457
        GMythProgramInfo *data;
renatofilho@865
   458
renatofilho@865
   459
        data = (GMythProgramInfo *) walk->data;
renatofilho@865
   460
renatofilho@865
   461
        g_value_init (&program, program_type);
renatofilho@865
   462
        g_value_set_static_boxed (&program,
renatofilho@865
   463
                                  dbus_g_type_specialized_construct (program_type));
renatofilho@865
   464
renatofilho@865
   465
        start_str = g_time_val_to_iso8601 (data->startts);
renatofilho@865
   466
        end_str = g_time_val_to_iso8601 (data->endts);
renatofilho@865
   467
renatofilho@865
   468
        dbus_g_type_struct_set (&program,
renatofilho@865
   469
                                0, data->chanid,
renatofilho@865
   470
                                1, start_str,
renatofilho@865
   471
                                2, end_str,
renatofilho@865
   472
                                3, data->title->str,
renatofilho@865
   473
                                4, data->subtitle->str,
renatofilho@865
   474
                                5, data->description->str,
renatofilho@865
   475
                                6, data->category->str,
renatofilho@865
   476
                                G_MAXUINT);
renatofilho@865
   477
renatofilho@865
   478
        g_ptr_array_add (*programs, g_value_get_boxed (&program));
renatofilho@865
   479
        g_free (start_str);
renatofilho@865
   480
        g_free (end_str);
renatofilho@865
   481
    }
renatofilho@865
   482
renatofilho@865
   483
    gmyth_free_program_list (list);
renatofilho@865
   484
renatofilho@865
   485
    return TRUE;
renatofilho@865
   486
}
renatofilho@865
   487
renatofilho@865
   488
static void
renatofilho@865
   489
gmyth_dbus_server_parse_recorded_info (RecordedInfo *info,
renatofilho@865
   490
                                       GValue *val)
renatofilho@865
   491
{
renatofilho@865
   492
    gchar *start_str;
renatofilho@865
   493
    gchar *end_str;
renatofilho@865
   494
renatofilho@865
   495
    start_str = g_time_val_to_iso8601 (info->start_time);
renatofilho@865
   496
    end_str = g_time_val_to_iso8601 (info->end_time);
renatofilho@865
   497
    dbus_g_type_struct_set (val,
renatofilho@865
   498
                            0, info->record_id,
renatofilho@865
   499
                            1, info->program_id,
renatofilho@865
   500
                            2, info->channel_id,
renatofilho@865
   501
                            3, start_str,
renatofilho@865
   502
                            4, end_str,
renatofilho@865
   503
                            5, info->title->str,
renatofilho@865
   504
                            6, info->subtitle->str,
renatofilho@865
   505
                            7, info->description->str,
renatofilho@865
   506
                            8, info->category->str,
renatofilho@865
   507
                            9, info->basename->str,
renatofilho@865
   508
                            10, info->filesize,
renatofilho@865
   509
                            G_MAXUINT);
renatofilho@865
   510
renatofilho@865
   511
    g_free (start_str);
renatofilho@865
   512
    g_free (end_str);
renatofilho@865
   513
}
renatofilho@865
   514
renatofilho@865
   515
static gboolean
renatofilho@865
   516
gmyth_dbus_server_get_recorded_info (GObject *obj,
renatofilho@865
   517
                                     const gchar *basename,
renatofilho@865
   518
                                     GValue **info,
renatofilho@865
   519
                                     GError **error)
renatofilho@865
   520
{
renatofilho@865
   521
    GType record_type;
renatofilho@865
   522
    GMythDbusServerPrivate *priv;
renatofilho@865
   523
    RecordedInfo *record_info;
renatofilho@865
   524
renatofilho@865
   525
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   526
renatofilho@865
   527
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@865
   528
    g_return_val_if_fail (gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj)), FALSE);
renatofilho@865
   529
renatofilho@865
   530
    record_type = GMYTH_DBUS_RECORD_G_TYPE;
renatofilho@865
   531
renatofilho@865
   532
    record_info = gmyth_scheduler_get_recorded_info (priv->myth_scheduler,
renatofilho@865
   533
                                                     basename);
renatofilho@865
   534
renatofilho@865
   535
    if (record_info)
renatofilho@865
   536
    {
renatofilho@865
   537
        *info = g_new0 (GValue, 1);
renatofilho@865
   538
        g_value_init (*info, record_type);
renatofilho@865
   539
        g_value_set_static_boxed (*info,
renatofilho@865
   540
                                  dbus_g_type_specialized_construct (record_type));
renatofilho@865
   541
        gmyth_dbus_server_parse_recorded_info (record_info, *info);
renatofilho@865
   542
renatofilho@865
   543
        gmyth_recorded_info_free (record_info);
renatofilho@865
   544
renatofilho@865
   545
        return TRUE;
renatofilho@865
   546
    }
renatofilho@865
   547
renatofilho@865
   548
    return FALSE;
renatofilho@865
   549
}
renatofilho@865
   550
renatofilho@865
   551
renatofilho@865
   552
static gboolean
renatofilho@865
   553
gmyth_dbus_server_get_recorded_list (GObject *obj,
renatofilho@865
   554
                                     GPtrArray **records,
renatofilho@865
   555
                                     GError **error)
renatofilho@865
   556
{
renatofilho@865
   557
    GList *list;
renatofilho@865
   558
    GList *walk;
renatofilho@865
   559
    gint len;
renatofilho@865
   560
    GType record_type;
renatofilho@865
   561
    GMythDbusServerPrivate *priv;
renatofilho@865
   562
renatofilho@865
   563
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   564
renatofilho@865
   565
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@865
   566
    g_return_val_if_fail (gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj)), FALSE);
renatofilho@865
   567
renatofilho@865
   568
renatofilho@865
   569
    len = gmyth_scheduler_get_recorded_list (priv->myth_scheduler,
renatofilho@865
   570
                                             &list);
renatofilho@865
   571
renatofilho@865
   572
    *records = g_ptr_array_sized_new (len);
renatofilho@865
   573
    record_type = GMYTH_DBUS_RECORD_G_TYPE;
renatofilho@865
   574
renatofilho@865
   575
    for (walk = list; walk != NULL; walk = walk->next)
renatofilho@865
   576
    {
renatofilho@865
   577
        GValue record = { 0, };
renatofilho@865
   578
        RecordedInfo *data;
renatofilho@865
   579
renatofilho@865
   580
        data = (RecordedInfo *) walk->data;
renatofilho@865
   581
renatofilho@865
   582
        g_value_init (&record, record_type);
renatofilho@865
   583
        g_value_set_static_boxed (&record,
renatofilho@865
   584
                                  dbus_g_type_specialized_construct (record_type));
renatofilho@865
   585
        gmyth_dbus_server_parse_recorded_info (data, &record);
renatofilho@865
   586
        g_ptr_array_add (*records, g_value_get_boxed (&record));
renatofilho@865
   587
    }
renatofilho@865
   588
renatofilho@865
   589
    gmyth_recorded_info_list_free (list);
renatofilho@865
   590
renatofilho@865
   591
    return TRUE;
renatofilho@865
   592
renatofilho@865
   593
}
renatofilho@865
   594
renatofilho@865
   595
static gboolean
renatofilho@865
   596
gmyth_dbus_server_get_schedule_list (GObject *obj,
renatofilho@865
   597
                                     GPtrArray **schedules)
renatofilho@865
   598
{
renatofilho@865
   599
    GList *list;
renatofilho@865
   600
    GList *walk;
renatofilho@865
   601
    gint len;
renatofilho@865
   602
    GType schedule_type;
renatofilho@865
   603
    GMythDbusServerPrivate *priv;
renatofilho@865
   604
renatofilho@865
   605
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   606
renatofilho@865
   607
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@865
   608
    g_return_val_if_fail (gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj)), FALSE);
renatofilho@865
   609
renatofilho@865
   610
renatofilho@865
   611
    len = gmyth_scheduler_get_schedule_list (priv->myth_scheduler,
renatofilho@865
   612
                                             &list);
renatofilho@865
   613
renatofilho@865
   614
    *schedules = g_ptr_array_sized_new (len);
renatofilho@865
   615
    schedule_type = GMYTH_DBUS_SCHEDULE_G_TYPE;
renatofilho@865
   616
renatofilho@865
   617
    for (walk = list; walk != NULL; walk = walk->next)
renatofilho@865
   618
    {
renatofilho@865
   619
        GValue schedule = { 0, };
renatofilho@865
   620
        ScheduleInfo *data;
renatofilho@865
   621
        gchar *start_str_time;
renatofilho@865
   622
        gchar *end_str_time;
renatofilho@865
   623
renatofilho@865
   624
        data = (ScheduleInfo *) walk->data;
renatofilho@865
   625
renatofilho@865
   626
        g_value_init (&schedule, schedule_type);
renatofilho@865
   627
        g_value_set_static_boxed (&schedule,
renatofilho@865
   628
                                  dbus_g_type_specialized_construct (schedule_type));
renatofilho@865
   629
renatofilho@865
   630
        start_str_time = g_time_val_to_iso8601 (data->start_time);
renatofilho@865
   631
        end_str_time = g_time_val_to_iso8601 (data->end_time);
renatofilho@865
   632
renatofilho@865
   633
        dbus_g_type_struct_set (&schedule,
renatofilho@865
   634
                            0, data->schedule_id,
renatofilho@865
   635
                            1, data->program_id,
renatofilho@865
   636
                            2, data->channel_id,
renatofilho@865
   637
                            3, start_str_time,
renatofilho@865
   638
                            4, end_str_time,
renatofilho@865
   639
                            5, data->title->str,
renatofilho@865
   640
                            6, data->subtitle->str,
renatofilho@865
   641
                            7, data->description->str,
renatofilho@865
   642
                            8, data->category->str,
renatofilho@865
   643
                            9, data->type,
renatofilho@865
   644
                            G_MAXUINT);
renatofilho@865
   645
renatofilho@865
   646
        g_ptr_array_add (*schedules, g_value_get_boxed (&schedule));
renatofilho@865
   647
renatofilho@865
   648
        g_free (start_str_time);
renatofilho@865
   649
        g_free (end_str_time);
renatofilho@865
   650
    }
renatofilho@865
   651
renatofilho@865
   652
    gmyth_schedule_info_list_free (list);
renatofilho@865
   653
renatofilho@865
   654
    return TRUE;
renatofilho@865
   655
}
renatofilho@865
   656
renatofilho@865
   657
renatofilho@865
   658
static gboolean
renatofilho@865
   659
gmyth_dbus_server_get_thumbnail (GObject *obj,
renatofilho@865
   660
                                const gchar *uri,
renatofilho@865
   661
                                GByteArray **image,
renatofilho@865
   662
                                GError **error)
renatofilho@865
   663
{
renatofilho@865
   664
    GMythFileTransfer *file_transfer;
renatofilho@865
   665
    glong filesize;
renatofilho@865
   666
    GMythFileReadResult result;
renatofilho@865
   667
    GMythDbusServerPrivate *priv;
renatofilho@865
   668
renatofilho@865
   669
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   670
renatofilho@865
   671
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@865
   672
renatofilho@865
   673
    if (!gmyth_util_file_exists (priv->myth_backend, uri))
renatofilho@865
   674
        goto fail;
renatofilho@865
   675
renatofilho@865
   676
    file_transfer = gmyth_file_transfer_new (priv->myth_backend);
renatofilho@865
   677
renatofilho@865
   678
    if (!gmyth_file_transfer_open (file_transfer, uri))
renatofilho@865
   679
        goto fail;
renatofilho@865
   680
renatofilho@865
   681
    filesize = gmyth_file_transfer_get_filesize (file_transfer);
renatofilho@865
   682
    if (filesize <= 0)
renatofilho@865
   683
        goto fail;
renatofilho@865
   684
renatofilho@865
   685
    *image = g_byte_array_new ();
renatofilho@865
   686
    result = gmyth_file_transfer_read (file_transfer, *image, filesize, FALSE);
renatofilho@865
   687
    if (result == GMYTH_FILE_READ_ERROR)
renatofilho@865
   688
       goto fail;
renatofilho@865
   689
renatofilho@865
   690
    gmyth_file_transfer_close (file_transfer);
renatofilho@865
   691
    g_object_unref (file_transfer);
renatofilho@865
   692
renatofilho@865
   693
    if (filesize > (*image)->len)
renatofilho@865
   694
        goto fail;
renatofilho@865
   695
renatofilho@865
   696
    return TRUE;
renatofilho@865
   697
renatofilho@865
   698
fail:
renatofilho@865
   699
    g_object_unref(file_transfer);
renatofilho@865
   700
    return FALSE;
renatofilho@865
   701
}
renatofilho@865
   702
renatofilho@865
   703
static gboolean
renatofilho@865
   704
gmyth_dbus_server_get_channel_icon (GObject *obj,
renatofilho@865
   705
                                    guint channel_id,
renatofilho@865
   706
                                    GByteArray **icon,
renatofilho@865
   707
                                    GError **error)
renatofilho@865
   708
{
renatofilho@865
   709
    GMythChannelInfo *channel = NULL;
renatofilho@865
   710
    guint8 *icon_data;
renatofilho@865
   711
    guint icon_length;
renatofilho@865
   712
    GMythDbusServerPrivate *priv;
renatofilho@865
   713
renatofilho@865
   714
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   715
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@865
   716
renatofilho@865
   717
    channel = gmyth_epg_get_channel_info (priv->myth_epg,
renatofilho@865
   718
                                         (gint) channel_id);
renatofilho@865
   719
renatofilho@865
   720
    *icon = NULL;
renatofilho@865
   721
renatofilho@865
   722
    if (channel == NULL)
renatofilho@865
   723
        return FALSE;
renatofilho@865
   724
renatofilho@865
   725
    if (!gmyth_epg_channel_has_icon(priv->myth_epg, channel))
renatofilho@865
   726
    {
renatofilho@865
   727
        gmyth_channel_info_free (channel);
renatofilho@865
   728
        g_debug("Channel does not have icon available");
renatofilho@865
   729
        return FALSE;
renatofilho@865
   730
    }
renatofilho@865
   731
renatofilho@865
   732
    icon_data = NULL;
renatofilho@865
   733
    icon_length = 0;
renatofilho@865
   734
    if (!gmyth_epg_channel_get_icon (priv->myth_epg,
renatofilho@865
   735
                                     channel,
renatofilho@865
   736
                                     &icon_data,
renatofilho@865
   737
                                     &icon_length)) 
renatofilho@865
   738
    {
renatofilho@865
   739
        gmyth_channel_info_free (channel);
renatofilho@865
   740
        g_warning("Could not get channel icon for channel id = %u", channel_id);
renatofilho@865
   741
        return FALSE;
renatofilho@865
   742
    }
renatofilho@865
   743
renatofilho@865
   744
    *icon = g_byte_array_sized_new (icon_length);
renatofilho@865
   745
    *icon = g_byte_array_append (*icon, icon_data, icon_length);
renatofilho@865
   746
renatofilho@865
   747
    g_free (icon_data);
renatofilho@865
   748
    gmyth_channel_info_free(channel);
renatofilho@865
   749
    return TRUE;
renatofilho@865
   750
}
renatofilho@865
   751
renatofilho@865
   752
renatofilho@865
   753
static gboolean
renatofilho@865
   754
gmyth_dbus_server_stop_recording (GObject *obj,
renatofilho@865
   755
                                  guint channel_id,
renatofilho@865
   756
                                  gboolean *result,
renatofilho@865
   757
                                  GError **error)
renatofilho@865
   758
{
renatofilho@865
   759
    gboolean ret = FALSE;
renatofilho@865
   760
    GMythDbusServerPrivate *priv;
renatofilho@865
   761
renatofilho@865
   762
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   763
renatofilho@865
   764
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@865
   765
    g_return_val_if_fail (gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj)), FALSE);
renatofilho@865
   766
renatofilho@865
   767
    ret = gmyth_scheduler_stop_recording (priv->myth_scheduler,
renatofilho@865
   768
                                          channel_id);
renatofilho@865
   769
renatofilho@865
   770
    return ret;
renatofilho@865
   771
}
renatofilho@865
   772
renatofilho@865
   773
static ScheduleInfo*
renatofilho@865
   774
gmyth_dbus_server_new_schedule_info (const gchar* description,
renatofilho@865
   775
                                     guint channel_id,
renatofilho@865
   776
                                     guint program_id,
renatofilho@865
   777
                                     GTimeVal *start_vtime,
renatofilho@865
   778
                                     GTimeVal *end_vtime)
renatofilho@865
   779
{
renatofilho@865
   780
    ScheduleInfo   *new_sched_info;
renatofilho@865
   781
renatofilho@865
   782
    new_sched_info = g_new0(ScheduleInfo, 1);
renatofilho@865
   783
renatofilho@865
   784
    /* record_id == -1 for generating a new id */
renatofilho@865
   785
    new_sched_info->schedule_id = -1;
renatofilho@865
   786
renatofilho@865
   787
    new_sched_info->channel_id = channel_id;
renatofilho@865
   788
    new_sched_info->program_id = program_id;
renatofilho@865
   789
    new_sched_info->start_time = g_new0 (GTimeVal, 1);
renatofilho@865
   790
    *new_sched_info->start_time = *start_vtime;
renatofilho@865
   791
    new_sched_info->end_time = g_new0 (GTimeVal, 1);
renatofilho@865
   792
    *new_sched_info->end_time = *end_vtime;
renatofilho@865
   793
renatofilho@865
   794
    /* TODO: there is no frequency field */
renatofilho@865
   795
    /*new_sched_info->frequency = -1;*/
renatofilho@865
   796
renatofilho@865
   797
    if (description != NULL) {
renatofilho@865
   798
        /* FIXME: description parameter is used as title and description */
renatofilho@865
   799
        new_sched_info->title = g_string_new(description);
renatofilho@865
   800
        new_sched_info->description = g_string_new(description);
renatofilho@865
   801
    }
renatofilho@865
   802
renatofilho@865
   803
    return new_sched_info;
renatofilho@865
   804
}
renatofilho@865
   805
renatofilho@865
   806
static gboolean
renatofilho@865
   807
gmyth_dbus_server_add_schedule (GObject *obj,
renatofilho@865
   808
                                guint channel_id,
renatofilho@865
   809
                                guint program_id,
renatofilho@865
   810
                                const gchar *start_time,
renatofilho@865
   811
                                const gchar *end_time,
renatofilho@865
   812
                                gboolean recurring,
renatofilho@865
   813
                                const gchar *description,
renatofilho@865
   814
                                guint *schedule_id,
renatofilho@865
   815
                                GError **error)
renatofilho@865
   816
{
renatofilho@865
   817
    ScheduleInfo *sch_info;
renatofilho@865
   818
    GTimeVal start_vtime;
renatofilho@865
   819
    GTimeVal end_vtime;
renatofilho@865
   820
    GMythDbusServerPrivate *priv;
renatofilho@865
   821
renatofilho@865
   822
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   823
renatofilho@865
   824
    *schedule_id = 0;
renatofilho@865
   825
renatofilho@865
   826
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@865
   827
    g_return_val_if_fail (gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj)), FALSE);
renatofilho@865
   828
renatofilho@865
   829
renatofilho@865
   830
    g_time_val_from_iso8601 (start_time, &start_vtime);
renatofilho@865
   831
    g_time_val_from_iso8601 (end_time, &end_vtime);
renatofilho@865
   832
    sch_info = gmyth_dbus_server_new_schedule_info (description,
renatofilho@865
   833
                                                    channel_id,
renatofilho@865
   834
                                                    program_id,
renatofilho@865
   835
                                                    &start_vtime,
renatofilho@865
   836
                                                    &end_vtime);
renatofilho@865
   837
    if (sch_info != NULL) {
renatofilho@865
   838
        GMythScheduleType type;
renatofilho@865
   839
        GTimeVal t_now;
renatofilho@865
   840
        gboolean has_record;
renatofilho@865
   841
renatofilho@865
   842
        type = (recurring ?
renatofilho@865
   843
                GMYTH_SCHEDULE_ALL_OCCURRENCES :
renatofilho@865
   844
                GMYTH_SCHEDULE_ONE_OCCURRENCE);
renatofilho@865
   845
renatofilho@865
   846
        g_get_current_time (&t_now);
renatofilho@865
   847
renatofilho@865
   848
        has_record = gmyth_scheduler_was_recorded_before (priv->myth_scheduler, 
renatofilho@865
   849
                                                          channel_id,
renatofilho@865
   850
                                                          (time_t) start_vtime.tv_sec);
renatofilho@865
   851
renatofilho@865
   852
renatofilho@865
   853
        if ((t_now.tv_sec >= start_vtime.tv_sec)
renatofilho@865
   854
            && (t_now.tv_sec <= end_vtime.tv_sec) && has_record)
renatofilho@865
   855
        {
renatofilho@865
   856
            GMythSocket    *socket;
renatofilho@865
   857
            gboolean        res = FALSE;
renatofilho@865
   858
renatofilho@865
   859
            socket = gmyth_backend_info_get_connected_socket (priv->myth_backend);
renatofilho@865
   860
            res = gmyth_scheduler_reactivate_schedule(priv->myth_scheduler,
renatofilho@865
   861
                                                      channel_id,
renatofilho@865
   862
                                                      (time_t) start_vtime.tv_sec);
renatofilho@865
   863
            if (res) {
renatofilho@865
   864
                GMythStringList *slist = gmyth_string_list_new();
renatofilho@865
   865
renatofilho@865
   866
                gmyth_string_list_append_char_array(slist, "RESCHEDULE_RECORDINGS 0");
renatofilho@865
   867
                gmyth_socket_sendreceive_stringlist(socket, slist);
renatofilho@865
   868
                res = (gmyth_string_list_get_int(slist, 0) == 1);
renatofilho@865
   869
                g_object_unref(slist);
renatofilho@865
   870
            }
renatofilho@865
   871
renatofilho@865
   872
            g_object_unref(socket);
renatofilho@865
   873
            return res;
renatofilho@865
   874
        }
renatofilho@865
   875
        else
renatofilho@865
   876
        {
renatofilho@865
   877
            if (!gmyth_scheduler_add_schedule_full (priv->myth_scheduler,
renatofilho@865
   878
                                                    sch_info,
renatofilho@865
   879
                                                    type))
renatofilho@865
   880
            {
renatofilho@865
   881
                g_warning("Could not add schedule entry");
renatofilho@865
   882
                return FALSE;
renatofilho@865
   883
            }
renatofilho@865
   884
renatofilho@865
   885
            (*schedule_id) = sch_info->schedule_id;
renatofilho@865
   886
            gmyth_schedule_info_free (sch_info);
renatofilho@865
   887
            return TRUE;
renatofilho@865
   888
        }
renatofilho@865
   889
    }
renatofilho@865
   890
    return FALSE;
renatofilho@865
   891
}
renatofilho@865
   892
renatofilho@865
   893
static gboolean
renatofilho@865
   894
gmyth_dbus_server_add_exception (GObject *obj,
renatofilho@865
   895
                                 guint schedule_id,
renatofilho@865
   896
                                 guint channel_id,
renatofilho@865
   897
                                 guint program_id,
renatofilho@865
   898
                                 const gchar *start_time,
renatofilho@865
   899
                                 const gchar *end_time,
renatofilho@865
   900
                                 const gchar *description,
renatofilho@865
   901
                                 GError **error)
renatofilho@865
   902
{
renatofilho@865
   903
    ScheduleInfo *sch_info;
renatofilho@865
   904
    GTimeVal start_vtime;
renatofilho@865
   905
    GTimeVal end_vtime;
renatofilho@865
   906
    GMythDbusServerPrivate *priv;
renatofilho@865
   907
renatofilho@865
   908
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   909
renatofilho@865
   910
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@865
   911
    g_return_val_if_fail (gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj)), FALSE);
renatofilho@865
   912
renatofilho@865
   913
    g_time_val_from_iso8601 (start_time, &start_vtime);
renatofilho@865
   914
    g_time_val_from_iso8601 (end_time, &end_vtime);
renatofilho@865
   915
renatofilho@865
   916
    sch_info = gmyth_dbus_server_new_schedule_info (description,
renatofilho@865
   917
                                                   channel_id,
renatofilho@865
   918
                                                   program_id,
renatofilho@865
   919
                                                   &start_vtime,
renatofilho@865
   920
                                                   &end_vtime);
renatofilho@865
   921
    if (sch_info != NULL)
renatofilho@865
   922
    {
renatofilho@865
   923
       if (!gmyth_scheduler_add_exception (priv->myth_scheduler,
renatofilho@865
   924
                                           schedule_id,
renatofilho@865
   925
                                           sch_info))
renatofilho@865
   926
       {
renatofilho@865
   927
           g_warning ("Could not add schedule exception");
renatofilho@865
   928
           gmyth_schedule_info_free (sch_info);
renatofilho@865
   929
           return FALSE;
renatofilho@865
   930
       }
renatofilho@865
   931
renatofilho@865
   932
       gmyth_schedule_info_free (sch_info);
renatofilho@865
   933
       return TRUE;
renatofilho@865
   934
    }
renatofilho@865
   935
    return FALSE;
renatofilho@865
   936
}
renatofilho@865
   937
renatofilho@865
   938
static gboolean
renatofilho@865
   939
gmyth_dbus_server_remove_schedule (GObject *obj,
renatofilho@865
   940
                                   guint schedule_id,
renatofilho@865
   941
                                   GError **error)
renatofilho@865
   942
{
renatofilho@865
   943
    GMythDbusServerPrivate *priv;
renatofilho@865
   944
renatofilho@865
   945
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@865
   946
renatofilho@865
   947
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@865
   948
    g_return_val_if_fail (gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj)), FALSE);
renatofilho@865
   949
renatofilho@865
   950
    return gmyth_scheduler_delete_schedule (priv->myth_scheduler, schedule_id);
renatofilho@865
   951
}
renatofilho@865
   952
renatofilho@865
   953
GMythDbusServer*
renatofilho@865
   954
gmyth_dbus_server_start_dbus_service (void)
renatofilho@865
   955
{
renatofilho@865
   956
    GError *error = NULL;
renatofilho@865
   957
    DBusGProxy *proxy;
renatofilho@865
   958
    DBusGConnection *bus;
renatofilho@865
   959
    guint request_ret;
renatofilho@865
   960
    GMythDbusServer *self;
renatofilho@865
   961
renatofilho@865
   962
    self = g_object_new (GMYTH_DBUS_SERVER_TYPE, NULL);
renatofilho@865
   963
    g_return_val_if_fail (self, FALSE);
renatofilho@865
   964
renatofilho@865
   965
    /* TODO: should verify if this service was already started */
renatofilho@865
   966
renatofilho@865
   967
    /* connect to session bus */
renatofilho@865
   968
    bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
renatofilho@865
   969
    if (bus == NULL) 
renatofilho@865
   970
    {
renatofilho@865
   971
        g_warning ("Could not connect to dbus: %s", error->message);
renatofilho@865
   972
        g_error_free (error);
renatofilho@865
   973
        goto fail;
renatofilho@865
   974
    }
renatofilho@865
   975
renatofilho@865
   976
    /* register dbus object */
renatofilho@865
   977
    dbus_g_connection_register_g_object (bus,
renatofilho@865
   978
        GMYTH_DBUS_SERVER_PATH, G_OBJECT (self));
renatofilho@865
   979
renatofilho@865
   980
    proxy = dbus_g_proxy_new_for_name (bus, DBUS_SERVICE_DBUS,
renatofilho@865
   981
                                       DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
renatofilho@865
   982
renatofilho@865
   983
    /* registering download manager service */
renatofilho@865
   984
    if (!org_freedesktop_DBus_request_name (proxy, GMYTH_DBUS_SERVER_IFACE,
renatofilho@865
   985
                                            0, &request_ret, &error)) 
renatofilho@865
   986
    {
renatofilho@865
   987
        g_warning ("Unable to register dbus service: %d %s",
renatofilho@865
   988
                   error->code, error->message);
renatofilho@865
   989
        g_error_free (error);
renatofilho@865
   990
        goto fail;
renatofilho@865
   991
    }
renatofilho@865
   992
renatofilho@865
   993
    if (request_ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) 
renatofilho@865
   994
    {
renatofilho@865
   995
        g_warning ("Got result code %u from requesting name", request_ret);
renatofilho@865
   996
        goto fail;
renatofilho@865
   997
    }
renatofilho@865
   998
renatofilho@865
   999
    return self;
renatofilho@865
  1000
renatofilho@865
  1001
fail:
renatofilho@865
  1002
    g_object_unref (self);
renatofilho@865
  1003
    return NULL;
renatofilho@865
  1004
}
renatofilho@865
  1005