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