gmyth-dbus/src/gmyth-dbus-server.c
author renatofilho
Mon Feb 25 18:40:34 2008 +0000 (2008-02-25)
branchtrunk
changeset 929 00536b0eb88b
parent 912 b200d6198191
child 932 58d43e2186ba
permissions -rw-r--r--
[svn r938] fixed autotools scripts
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@877
    29
#include <glib/gi18n.h>
renatofilho@870
    30
#include <gmyth/gmyth.h>
renatofilho@870
    31
#include <dbus/dbus-glib-bindings.h>
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@877
    38
enum
renatofilho@877
    39
{
renatofilho@881
    40
    SHUTDOWN,
renatofilho@878
    41
    LAST_SIGNAL
renatofilho@878
    42
};
renatofilho@878
    43
renatofilho@878
    44
enum
renatofilho@878
    45
{
renatofilho@877
    46
    GMYTH_DBUS_ERROR_MYTHTV,
renatofilho@877
    47
    GMYTH_DBUS_ERROR_CONNECTION,
renatofilho@877
    48
    GMYTH_DBUS_ERROR_EPG,
renatofilho@877
    49
    GMYTH_DBUS_ERROR_SCHEDULE
renatofilho@877
    50
};
renatofilho@877
    51
renatofilho@877
    52
#define GMYTH_DBUS_ERROR gmyth_dbus_error_quark ()
renatofilho@877
    53
renatofilho@877
    54
GQuark
renatofilho@877
    55
gmyth_dbus_error_quark (void)
renatofilho@877
    56
{
renatofilho@877
    57
      return g_quark_from_static_string ("gmyth-dbus-error-quark");
renatofilho@877
    58
}
renatofilho@877
    59
renatofilho@870
    60
typedef struct _GMythDbusServerPrivate GMythDbusServerPrivate;
renatofilho@870
    61
renatofilho@870
    62
struct _GMythDbusServerPrivate
renatofilho@870
    63
{
renatofilho@870
    64
    GMythBackendInfo *myth_backend;
renatofilho@874
    65
    gboolean         connected;
renatofilho@870
    66
    GMythEPG         *myth_epg;
renatofilho@870
    67
    GMythScheduler   *myth_scheduler;
renatofilho@881
    68
renatofilho@881
    69
    guint            shutdown_cb_id;
renatofilho@870
    70
};
renatofilho@870
    71
renatofilho@870
    72
#define GMYTH_DBUS_SERVER_GET_PRIVATE(o) \
renatofilho@870
    73
    (G_TYPE_INSTANCE_GET_PRIVATE ((o), GMYTH_DBUS_SERVER_TYPE, GMythDbusServerPrivate))
renatofilho@870
    74
renatofilho@881
    75
static void gmyth_dbus_server_class_init        (GMythDbusServerClass *klass);
renatofilho@881
    76
static void gmyth_dbus_server_init              (GMythDbusServer *self);
renatofilho@881
    77
static void gmyth_dbus_server_dispose           (GObject *object);
renatofilho@881
    78
static void gmyth_dbus_server_finalize          (GObject *object);
renatofilho@881
    79
static void gmyth_dbus_server_cancel_shutdown   (GMythDbusServer *self);
renatofilho@881
    80
static gboolean gmyth_dbus_server_shutdown_cb   (GMythDbusServer *self);
renatofilho@870
    81
renatofilho@870
    82
/* Dbus */
renatofilho@870
    83
static gboolean gmyth_dbus_server_connect           (GObject *obj,
renatofilho@870
    84
                                                     const gchar *host,
melunko@904
    85
                                                     gint port,
renatofilho@870
    86
                                                     const gchar *user,
renatofilho@870
    87
                                                     const gchar *password,
renatofilho@870
    88
                                                     GError **error);
melunko@912
    89
static gboolean gmyth_dbus_server_check_db_connection (GObject *self,
melunko@912
    90
                                                     const gchar *host,
melunko@912
    91
                                                     gint port,
melunko@912
    92
                                                     const gchar *user,
melunko@912
    93
                                                     const gchar *password,
melunko@912
    94
                                                     GError **error);
melunko@913
    95
static gboolean
melunko@913
    96
gmyth_dbus_server_check_server_connection (GObject *obj,
melunko@913
    97
                                const gchar *host,
melunko@913
    98
                                gint port,
melunko@913
    99
                                GError **error);
renatofilho@870
   100
static gboolean gmyth_dbus_server_get_channel_list  (GObject *obj,
renatofilho@870
   101
                                                     GPtrArray **channels,
renatofilho@870
   102
                                                     GError **error);
renatofilho@870
   103
static gboolean gmyth_dbus_server_get_channel_info  (GObject *obj,
renatofilho@870
   104
                                                     gint channel_id,
renatofilho@870
   105
                                                     GValueArray **info,
renatofilho@870
   106
                                                     GError **error);
renatofilho@870
   107
static gboolean gmyth_dbus_server_file_exists       (GObject *obj,
renatofilho@870
   108
                                                     const gchar *file_name,
renatofilho@870
   109
                                                     gboolean *exists,
renatofilho@870
   110
                                                     GError **error);
renatofilho@870
   111
static gboolean gmyth_dbus_server_get_recorded_list (GObject *obj,
renatofilho@870
   112
                                                     GPtrArray **channels,
renatofilho@870
   113
                                                     GError **error);
renatofilho@870
   114
static gboolean gmyth_dbus_server_get_recorded_info (GObject *obj,
renatofilho@870
   115
                                                     const gchar *basename,
renatofilho@870
   116
                                                     GValueArray **info,
renatofilho@870
   117
                                                     GError **error);
renatofilho@870
   118
static gboolean gmyth_dbus_server_get_program_list  (GObject *obj,
renatofilho@870
   119
                                                     gint channel_id,
renatofilho@870
   120
                                                     const gchar *start_time,
renatofilho@870
   121
                                                     const gchar *end_time,
renatofilho@877
   122
                                                     GPtrArray **program_list,
renatofilho@877
   123
                                                     GError **error);
renatofilho@870
   124
static gboolean gmyth_dbus_server_get_schedule_list (GObject *obj,
renatofilho@877
   125
                                                     GPtrArray **schedule_list,
renatofilho@877
   126
                                                     GError **error);
renatofilho@870
   127
static gboolean gmyth_dbus_server_connected         (GObject *obj,
renatofilho@870
   128
                                                     gboolean *status,
renatofilho@870
   129
                                                     GError **error);
renatofilho@870
   130
static gboolean gmyth_dbus_server_disconnect        (GObject *obj,
renatofilho@870
   131
                                                     GError **error);
renatofilho@878
   132
static void     gmyth_dbus_server_internal_disconnect
renatofilho@878
   133
                                                    (GObject *obj,
renatofilho@878
   134
                                                     GError **error);
renatofilho@870
   135
static gboolean gmyth_dbus_server_get_server_info   (GObject *obj,
renatofilho@870
   136
                                                     guint64 *total_space,
renatofilho@870
   137
                                                     guint64 *used_space,
renatofilho@870
   138
                                                     guint64 *free_space,
renatofilho@870
   139
                                                     GError **error);
renatofilho@870
   140
static gboolean gmyth_dbus_server_get_thumbnail     (GObject *obj,
renatofilho@870
   141
                                                     const gchar *uri,
renatofilho@870
   142
                                                     GByteArray **image,
renatofilho@870
   143
                                                     GError **error);
renatofilho@870
   144
static gboolean gmyth_dbus_server_get_channel_icon  (GObject *obj,
renatofilho@870
   145
                                                     guint channel_id,
renatofilho@870
   146
                                                     GByteArray **icon,
renatofilho@870
   147
                                                     GError **error);
renatofilho@870
   148
static gboolean gmyth_dbus_server_stop_recording    (GObject *obj,
renatofilho@870
   149
                                                     guint channel_id,
renatofilho@870
   150
                                                     gboolean *result,
renatofilho@870
   151
                                                     GError **error);
renatofilho@870
   152
static gboolean gmyth_dbus_server_add_schedule      (GObject *obj,
melunko@904
   153
                                                     gint channel_id,
renatofilho@891
   154
                                                     const gchar *program_id,
renatofilho@870
   155
                                                     const gchar *start_time,
renatofilho@870
   156
                                                     const gchar *end_time,
renatofilho@870
   157
                                                     gboolean recurring,
renatofilho@870
   158
                                                     const gchar *description,
renatofilho@870
   159
                                                     guint *schedule_id,
renatofilho@870
   160
                                                     GError **error);
renatofilho@870
   161
static gboolean gmyth_dbus_server_add_exception     (GObject *obj,
renatofilho@870
   162
                                                     guint schedule_id,
melunko@904
   163
                                                     gint channel_id,
renatofilho@891
   164
                                                     const gchar *program_id,
renatofilho@870
   165
                                                     const gchar *start_time,
renatofilho@870
   166
                                                     const gchar *end_time,
renatofilho@870
   167
                                                     const gchar *description,
renatofilho@870
   168
                                                     GError **error);
renatofilho@870
   169
static gboolean gmyth_dbus_server_remove_schedule   (GObject *obj,
renatofilho@870
   170
                                                     guint schedule_id,
renatofilho@870
   171
                                                     GError **error);
renatofilho@870
   172
renatofilho@870
   173
renatofilho@870
   174
#include "gmyth-dbus-server-glue.h"
renatofilho@870
   175
renatofilho@870
   176
renatofilho@878
   177
static guint  signals[LAST_SIGNAL] = { 0 };
renatofilho@878
   178
renatofilho@870
   179
G_DEFINE_TYPE (GMythDbusServer, gmyth_dbus_server, G_TYPE_OBJECT);
renatofilho@870
   180
renatofilho@870
   181
static void
renatofilho@870
   182
gmyth_dbus_server_class_init (GMythDbusServerClass *klass)
renatofilho@870
   183
{
renatofilho@870
   184
    GObjectClass *object_class = G_OBJECT_CLASS (klass);
renatofilho@870
   185
renatofilho@870
   186
    g_type_class_add_private (klass, sizeof (GMythDbusServerPrivate));
renatofilho@870
   187
renatofilho@870
   188
    object_class->dispose = gmyth_dbus_server_dispose;
renatofilho@870
   189
    object_class->finalize = gmyth_dbus_server_finalize;
renatofilho@870
   190
renatofilho@881
   191
    signals[SHUTDOWN] = 
renatofilho@881
   192
            g_signal_new ("shutdown",
renatofilho@878
   193
                          G_OBJECT_CLASS_TYPE (object_class),
renatofilho@878
   194
                          G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
renatofilho@878
   195
                          0,
renatofilho@878
   196
                          NULL, NULL,
renatofilho@878
   197
                          g_cclosure_marshal_VOID__VOID,
renatofilho@878
   198
                          G_TYPE_NONE, 0, G_TYPE_NONE);
renatofilho@878
   199
renatofilho@870
   200
    dbus_g_object_type_install_info (GMYTH_DBUS_SERVER_TYPE,
renatofilho@870
   201
                                     &dbus_glib_gmyth_dbus_server_object_info);
renatofilho@870
   202
}
renatofilho@870
   203
renatofilho@870
   204
static void
renatofilho@870
   205
gmyth_dbus_server_init (GMythDbusServer *self)
renatofilho@870
   206
{
renatofilho@870
   207
}
renatofilho@870
   208
renatofilho@870
   209
static void
renatofilho@870
   210
gmyth_dbus_server_dispose (GObject *object)
renatofilho@870
   211
{
renatofilho@870
   212
    G_OBJECT_CLASS (gmyth_dbus_server_parent_class)->dispose (object);
renatofilho@870
   213
}
renatofilho@870
   214
renatofilho@870
   215
static void
renatofilho@870
   216
gmyth_dbus_server_finalize (GObject *object)
renatofilho@870
   217
{
renatofilho@870
   218
    G_OBJECT_CLASS (gmyth_dbus_server_parent_class)->finalize (object);
renatofilho@870
   219
}
renatofilho@870
   220
renatofilho@870
   221
static gboolean
renatofilho@877
   222
gmyth_dbus_server_connect_epg (GMythDbusServer *server, GError **error)
renatofilho@870
   223
{
renatofilho@870
   224
    GMythDbusServerPrivate *priv;
renatofilho@870
   225
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (server);
renatofilho@870
   226
renatofilho@874
   227
    if (!priv->connected)
renatofilho@877
   228
    {
renatofilho@877
   229
        g_set_error (error,
renatofilho@877
   230
                     GMYTH_DBUS_ERROR,
renatofilho@877
   231
                     GMYTH_DBUS_ERROR_CONNECTION,
renatofilho@877
   232
                     _("Not connected"));
renatofilho@877
   233
renatofilho@891
   234
        gmyth_debug ("Not connected with MythTV Server");
renatofilho@874
   235
        return FALSE;
renatofilho@877
   236
    }
renatofilho@874
   237
renatofilho@870
   238
    if (!priv->myth_epg)
renatofilho@870
   239
    {
renatofilho@870
   240
        priv->myth_epg = gmyth_epg_new();
renatofilho@870
   241
        if (!gmyth_epg_connect (priv->myth_epg, priv->myth_backend))
renatofilho@870
   242
        {
renatofilho@870
   243
            g_object_unref (priv->myth_epg);
renatofilho@870
   244
            priv->myth_epg = NULL;
renatofilho@877
   245
renatofilho@877
   246
            g_set_error (error,
renatofilho@877
   247
                         GMYTH_DBUS_ERROR,
renatofilho@877
   248
                         GMYTH_DBUS_ERROR_EPG,
renatofilho@877
   249
                         _("Fail to connect with EPG"));
renatofilho@891
   250
            gmyth_debug ("Fail to connected with EPG");
renatofilho@870
   251
            return FALSE;
renatofilho@879
   252
renatofilho@870
   253
        }
renatofilho@870
   254
    }
renatofilho@870
   255
renatofilho@891
   256
    gmyth_debug ("Connected EPG");
renatofilho@870
   257
    return TRUE;
renatofilho@870
   258
}
renatofilho@870
   259
renatofilho@870
   260
static gboolean
renatofilho@877
   261
gmyth_dbus_server_connect_scheduler (GMythDbusServer *server,
renatofilho@877
   262
                                     GError **error)
renatofilho@870
   263
{
renatofilho@870
   264
    GMythDbusServerPrivate *priv;
renatofilho@870
   265
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (server);
renatofilho@870
   266
renatofilho@874
   267
    if (!priv->connected)
renatofilho@877
   268
    {
renatofilho@877
   269
        g_set_error (error,
renatofilho@877
   270
                     GMYTH_DBUS_ERROR,
renatofilho@877
   271
                     GMYTH_DBUS_ERROR_CONNECTION,
renatofilho@877
   272
                     _("Not connected"));
renatofilho@877
   273
renatofilho@891
   274
        gmyth_debug ("Not connected with MythTV Server");
renatofilho@874
   275
        return FALSE;
renatofilho@877
   276
    }
renatofilho@874
   277
renatofilho@870
   278
    if (!priv->myth_scheduler)
renatofilho@870
   279
    {
renatofilho@870
   280
        priv->myth_scheduler = gmyth_scheduler_new ();
renatofilho@870
   281
        if (!gmyth_scheduler_connect (priv->myth_scheduler,
renatofilho@870
   282
                                      priv->myth_backend))
renatofilho@870
   283
        {
renatofilho@870
   284
            g_object_unref (priv->myth_scheduler);
renatofilho@870
   285
            priv->myth_scheduler = NULL;
renatofilho@877
   286
renatofilho@877
   287
            g_set_error (error,
renatofilho@877
   288
                         GMYTH_DBUS_ERROR,
renatofilho@877
   289
                         GMYTH_DBUS_ERROR_SCHEDULE,
renatofilho@877
   290
                         _("Fail to connect with Schedule"));
renatofilho@877
   291
renatofilho@891
   292
            gmyth_debug (_("Fail to connect with Schedule"));
renatofilho@870
   293
            return FALSE;
renatofilho@870
   294
        }
renatofilho@870
   295
    }
renatofilho@870
   296
renatofilho@891
   297
    gmyth_debug ("Connected with Schedule");
renatofilho@870
   298
    return TRUE;
renatofilho@870
   299
}
renatofilho@870
   300
renatofilho@870
   301
static gboolean
renatofilho@870
   302
gmyth_dbus_server_connect  (GObject *obj,
renatofilho@870
   303
                            const gchar *host,
melunko@904
   304
                            gint port,
renatofilho@870
   305
                            const gchar *user,
renatofilho@870
   306
                            const gchar *password,
renatofilho@870
   307
                            GError **error)
renatofilho@870
   308
{
renatofilho@874
   309
    GMythSocket *s;
renatofilho@870
   310
    GMythDbusServerPrivate *priv;
renatofilho@873
   311
renatofilho@873
   312
renatofilho@891
   313
    gmyth_debug ("");
renatofilho@870
   314
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
   315
renatofilho@877
   316
    if (priv->connected)
renatofilho@876
   317
    {
renatofilho@891
   318
        gmyth_debug ("Release Old connection");
renatofilho@879
   319
        gmyth_dbus_server_internal_disconnect (obj, NULL);
renatofilho@876
   320
    }
renatofilho@870
   321
renatofilho@881
   322
    gmyth_dbus_server_cancel_shutdown (GMYTH_DBUS_SERVER (obj));
renatofilho@881
   323
renatofilho@870
   324
    priv->myth_backend = gmyth_backend_info_new_full (host,
renatofilho@870
   325
                                                      user,
renatofilho@870
   326
                                                      password,
renatofilho@870
   327
                                                      MYTH_DEFAULT_DB,
renatofilho@870
   328
                                                      port);
renatofilho@874
   329
renatofilho@874
   330
    s = gmyth_backend_info_get_connected_socket (priv->myth_backend);
renatofilho@874
   331
    if (s)
renatofilho@874
   332
    {
renatofilho@891
   333
        gmyth_debug ("Connected");
renatofilho@879
   334
        priv->connected = TRUE;
renatofilho@874
   335
        g_object_unref (s);
renatofilho@874
   336
    }
renatofilho@874
   337
    else
renatofilho@874
   338
    {
renatofilho@891
   339
        gmyth_debug ("Fail to connect with MythTVServer");
renatofilho@879
   340
        priv->connected = FALSE;
renatofilho@874
   341
        g_object_unref (priv->myth_backend);
renatofilho@874
   342
        priv->myth_backend = NULL;
renatofilho@877
   343
renatofilho@877
   344
        g_set_error (error,
renatofilho@877
   345
                     GMYTH_DBUS_ERROR,
renatofilho@877
   346
                     GMYTH_DBUS_ERROR_CONNECTION,
renatofilho@877
   347
                     _("Fail to connect with backend"));
renatofilho@874
   348
    }
renatofilho@874
   349
renatofilho@879
   350
    return priv->connected;
renatofilho@870
   351
}
renatofilho@870
   352
renatofilho@870
   353
static gboolean
renatofilho@870
   354
gmyth_dbus_server_connected (GObject *obj,
renatofilho@870
   355
                             gboolean *status,
renatofilho@870
   356
                             GError **error)
renatofilho@870
   357
{
renatofilho@870
   358
    GMythDbusServerPrivate *priv;
renatofilho@873
   359
renatofilho@873
   360
renatofilho@891
   361
    gmyth_debug ("");
renatofilho@870
   362
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
   363
renatofilho@870
   364
    if (priv->myth_backend)
renatofilho@870
   365
        *status = TRUE;
renatofilho@870
   366
    else
renatofilho@870
   367
        *status = FALSE;
renatofilho@870
   368
    return TRUE;
renatofilho@870
   369
}
renatofilho@870
   370
renatofilho@870
   371
static gboolean
renatofilho@870
   372
gmyth_dbus_server_disconnect (GObject *obj,
renatofilho@870
   373
                              GError **error)
renatofilho@870
   374
{
renatofilho@879
   375
    GMythDbusServerPrivate *priv;
renatofilho@878
   376
renatofilho@879
   377
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@879
   378
    if (priv->connected)
renatofilho@879
   379
    {
renatofilho@879
   380
        gmyth_dbus_server_internal_disconnect (obj, error);
renatofilho@881
   381
        priv->shutdown_cb_id = g_timeout_add (60000,
renatofilho@881
   382
                (GSourceFunc) gmyth_dbus_server_shutdown_cb, obj);
renatofilho@879
   383
    }
renatofilho@878
   384
renatofilho@878
   385
    return TRUE;
renatofilho@878
   386
}
renatofilho@878
   387
renatofilho@878
   388
static void
renatofilho@878
   389
gmyth_dbus_server_internal_disconnect (GObject *obj,
renatofilho@878
   390
                                       GError **error)
renatofilho@878
   391
{
renatofilho@870
   392
    GMythDbusServerPrivate *priv;
renatofilho@873
   393
renatofilho@873
   394
    g_debug ("%s:%d", __FUNCTION__, __LINE__);
renatofilho@873
   395
renatofilho@870
   396
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
   397
renatofilho@870
   398
    if (priv->myth_epg)
renatofilho@870
   399
    {
renatofilho@870
   400
        g_object_unref (priv->myth_epg);
renatofilho@870
   401
        priv->myth_epg = NULL;
renatofilho@870
   402
    }
renatofilho@870
   403
renatofilho@870
   404
renatofilho@870
   405
    if (priv->myth_backend)
renatofilho@870
   406
    {
renatofilho@870
   407
        g_object_unref (priv->myth_backend);
renatofilho@870
   408
        priv->myth_backend = NULL;
renatofilho@870
   409
    }
renatofilho@870
   410
renatofilho@870
   411
    if (priv->myth_scheduler)
renatofilho@870
   412
    {
renatofilho@870
   413
        g_object_unref (priv->myth_scheduler);
renatofilho@870
   414
        priv->myth_scheduler = NULL;
renatofilho@870
   415
    }
renatofilho@879
   416
renatofilho@879
   417
    priv->connected = FALSE;
renatofilho@870
   418
}
renatofilho@870
   419
renatofilho@870
   420
static gboolean
renatofilho@870
   421
gmyth_dbus_server_get_server_info (GObject *obj,
renatofilho@870
   422
                                   guint64 *total_space,
renatofilho@870
   423
                                   guint64 *used_space,
renatofilho@870
   424
                                   guint64 *free_space,
renatofilho@870
   425
                                   GError **error)
renatofilho@870
   426
{
renatofilho@870
   427
    GMythBackendDetails *details;
renatofilho@870
   428
    GMythDbusServerPrivate *priv;
renatofilho@870
   429
    gboolean ret = FALSE;
renatofilho@870
   430
    GMythSocket *socket;
renatofilho@870
   431
renatofilho@870
   432
    g_debug ("%s:%d", __FUNCTION__, __LINE__);
renatofilho@870
   433
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
   434
renatofilho@870
   435
    g_return_val_if_fail (priv->myth_backend != NULL, FALSE);
renatofilho@870
   436
renatofilho@870
   437
    socket = gmyth_backend_info_get_connected_socket (priv->myth_backend);
renatofilho@870
   438
renatofilho@877
   439
    if (!socket)
renatofilho@877
   440
    {
renatofilho@877
   441
        g_set_error (error,
renatofilho@877
   442
                     GMYTH_DBUS_ERROR,
renatofilho@877
   443
                     GMYTH_DBUS_ERROR_MYTHTV,
renatofilho@877
   444
                     _("MythTv not avaliable"));
renatofilho@877
   445
        return FALSE;
renatofilho@877
   446
renatofilho@877
   447
    }
renatofilho@877
   448
renatofilho@870
   449
    details = NULL;
renatofilho@870
   450
    gmyth_util_get_backend_details (socket,
renatofilho@870
   451
                                    &details);
renatofilho@870
   452
    if (details)
renatofilho@870
   453
    {
renatofilho@870
   454
        *total_space = details->total_space;
renatofilho@870
   455
        *used_space = details->used_space;
renatofilho@870
   456
        *free_space = *total_space - *used_space;
renatofilho@870
   457
        gmyth_util_backend_details_free (details);
renatofilho@870
   458
renatofilho@870
   459
        ret = TRUE;
renatofilho@870
   460
    }
renatofilho@877
   461
    else
renatofilho@877
   462
    {
renatofilho@877
   463
        g_set_error (error,
renatofilho@877
   464
                     GMYTH_DBUS_ERROR,
renatofilho@877
   465
                     GMYTH_DBUS_ERROR_MYTHTV,
renatofilho@877
   466
                     _("Fail to get MythTv details"));
renatofilho@879
   467
}
renatofilho@870
   468
renatofilho@870
   469
    g_object_unref (socket);
renatofilho@870
   470
renatofilho@870
   471
    return ret;
renatofilho@870
   472
}
renatofilho@870
   473
renatofilho@870
   474
renatofilho@870
   475
static void
renatofilho@870
   476
gmyth_dbus_server_parse_channel_info (GMythChannelInfo *info,
renatofilho@870
   477
                                      GValue *val)
renatofilho@870
   478
{
renatofilho@870
   479
    dbus_g_type_struct_set (val,
renatofilho@870
   480
                            0, info->channel_ID,
renatofilho@870
   481
                            1, info->channel_num->str,
renatofilho@870
   482
                            2, info->channel_name->str,
renatofilho@870
   483
                            3, info->channel_icon->str,
renatofilho@870
   484
                            G_MAXUINT);
renatofilho@870
   485
}
renatofilho@870
   486
renatofilho@870
   487
static gboolean 
renatofilho@870
   488
gmyth_dbus_server_get_channel_info  (GObject *obj,
renatofilho@870
   489
                                     gint channel_id,
renatofilho@870
   490
                                     GValueArray **info,
renatofilho@870
   491
                                     GError **error)
renatofilho@870
   492
{
renatofilho@870
   493
    GType ch_type;
renatofilho@870
   494
    GMythChannelInfo *ch_info;
renatofilho@870
   495
    GMythDbusServerPrivate *priv;
renatofilho@870
   496
renatofilho@870
   497
    g_debug ("%s:%d", __FUNCTION__, __LINE__);
renatofilho@870
   498
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
   499
renatofilho@870
   500
    g_return_val_if_fail (priv->myth_backend != NULL, FALSE);
renatofilho@873
   501
renatofilho@877
   502
    if (!gmyth_dbus_server_connect_epg (GMYTH_DBUS_SERVER (obj), error))
renatofilho@877
   503
    {
renatofilho@873
   504
        return FALSE;
renatofilho@877
   505
    }
renatofilho@870
   506
renatofilho@870
   507
    ch_type = GMYTH_DBUS_CHANNEL_G_TYPE;
renatofilho@870
   508
renatofilho@870
   509
    ch_info = gmyth_epg_get_channel_info (priv->myth_epg, channel_id);
renatofilho@870
   510
    if (ch_info)
renatofilho@870
   511
    {
renatofilho@870
   512
        GValue v = { 0, };
renatofilho@870
   513
        g_value_init (&v, ch_type);
renatofilho@870
   514
        g_value_take_boxed (&v, dbus_g_type_specialized_construct (ch_type));
renatofilho@870
   515
        gmyth_dbus_server_parse_channel_info (ch_info, &v);
renatofilho@870
   516
renatofilho@870
   517
        *info = g_value_get_boxed (&v);
renatofilho@870
   518
        return TRUE;
renatofilho@870
   519
    }
renatofilho@877
   520
    else
renatofilho@877
   521
    {
renatofilho@877
   522
        g_set_error (error,
renatofilho@877
   523
                     GMYTH_DBUS_ERROR,
renatofilho@877
   524
                     GMYTH_DBUS_ERROR_EPG,
renatofilho@877
   525
                     _("no channel info avaliable"));
renatofilho@877
   526
    }
renatofilho@870
   527
renatofilho@870
   528
    return FALSE;
renatofilho@870
   529
}
renatofilho@870
   530
renatofilho@870
   531
renatofilho@870
   532
static gboolean
renatofilho@870
   533
gmyth_dbus_server_get_channel_list (GObject *obj,
renatofilho@870
   534
                                    GPtrArray **channels,
renatofilho@870
   535
                                    GError **error)
renatofilho@870
   536
{
renatofilho@870
   537
    GList *lst;
renatofilho@870
   538
    GList *walk;
renatofilho@870
   539
    int len;
renatofilho@870
   540
    GType ch_type;
renatofilho@870
   541
    GMythDbusServerPrivate *priv;
renatofilho@870
   542
renatofilho@870
   543
    g_debug ("%s:%d", __FUNCTION__, __LINE__);
renatofilho@870
   544
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
   545
renatofilho@870
   546
    g_return_val_if_fail (priv->myth_backend != NULL, FALSE);
renatofilho@877
   547
    if (!gmyth_dbus_server_connect_epg (GMYTH_DBUS_SERVER (obj), error))
renatofilho@873
   548
        return FALSE;
renatofilho@870
   549
renatofilho@870
   550
renatofilho@873
   551
    lst = NULL;
renatofilho@870
   552
    len = gmyth_epg_get_channel_list (priv->myth_epg, &lst);
renatofilho@870
   553
renatofilho@870
   554
    *channels = g_ptr_array_sized_new (len);
renatofilho@870
   555
    ch_type = GMYTH_DBUS_CHANNEL_G_TYPE;
renatofilho@870
   556
renatofilho@870
   557
    for (walk = lst; walk != NULL; walk = walk->next)
renatofilho@870
   558
    {
renatofilho@870
   559
        GValue ch = { 0, };
renatofilho@870
   560
        GMythChannelInfo *data;
renatofilho@870
   561
renatofilho@870
   562
        data = (GMythChannelInfo *) walk->data;
renatofilho@870
   563
renatofilho@870
   564
        g_value_init (&ch, ch_type);
renatofilho@870
   565
        g_value_take_boxed (&ch, dbus_g_type_specialized_construct (ch_type));
renatofilho@870
   566
        gmyth_dbus_server_parse_channel_info (data, &ch);
renatofilho@870
   567
        g_ptr_array_add (*channels, g_value_get_boxed (&ch));
renatofilho@870
   568
    }
renatofilho@870
   569
renatofilho@870
   570
    gmyth_free_channel_list (lst);
renatofilho@870
   571
    return TRUE;
renatofilho@870
   572
}
renatofilho@870
   573
renatofilho@870
   574
static gboolean
renatofilho@870
   575
gmyth_dbus_server_file_exists (GObject *obj,
renatofilho@870
   576
                               const gchar *file_name,
renatofilho@870
   577
                               gboolean *exists,
renatofilho@870
   578
                               GError **error)
renatofilho@870
   579
{
renatofilho@870
   580
    GMythDbusServerPrivate *priv;
renatofilho@870
   581
    g_debug ("%s:%d", __FUNCTION__, __LINE__);
renatofilho@870
   582
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
   583
renatofilho@870
   584
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@870
   585
renatofilho@870
   586
    *exists = gmyth_util_file_exists (priv->myth_backend, file_name);
renatofilho@870
   587
renatofilho@870
   588
    return TRUE;
renatofilho@870
   589
}
renatofilho@870
   590
renatofilho@870
   591
static gboolean
renatofilho@870
   592
gmyth_dbus_server_get_program_list (GObject *obj,
renatofilho@870
   593
                                    gint channel_id,
renatofilho@870
   594
                                    const gchar *start_time,
renatofilho@870
   595
                                    const gchar *end_time,
renatofilho@877
   596
                                    GPtrArray **programs,
renatofilho@877
   597
                                    GError **error)
renatofilho@870
   598
{
renatofilho@870
   599
    GList *list;
renatofilho@870
   600
    GList *walk;
renatofilho@870
   601
    gint len;
renatofilho@870
   602
    GType program_type;
renatofilho@870
   603
    GTimeVal start_time_val;
renatofilho@870
   604
    GTimeVal end_time_val;
renatofilho@870
   605
    GMythDbusServerPrivate *priv;
renatofilho@870
   606
renatofilho@870
   607
    g_debug ("%s:%d", __FUNCTION__, __LINE__);
renatofilho@870
   608
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
   609
renatofilho@870
   610
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@877
   611
    if (!gmyth_dbus_server_connect_epg (GMYTH_DBUS_SERVER (obj), error))
renatofilho@873
   612
        return FALSE;
renatofilho@870
   613
renatofilho@870
   614
    g_time_val_from_iso8601 (start_time, &start_time_val);
renatofilho@870
   615
    g_time_val_from_iso8601 (end_time, &end_time_val);
renatofilho@870
   616
renatofilho@870
   617
    list = NULL;
renatofilho@870
   618
    len = gmyth_epg_get_program_list (priv->myth_epg,
renatofilho@870
   619
                                      &list,
renatofilho@870
   620
                                      channel_id,
renatofilho@870
   621
                                      &start_time_val,
renatofilho@870
   622
                                      &end_time_val);
renatofilho@870
   623
renatofilho@870
   624
    *programs = g_ptr_array_sized_new (len);
renatofilho@870
   625
    program_type = GMYTH_DBUS_PROGRAM_G_TYPE;
renatofilho@870
   626
renatofilho@870
   627
    for (walk = list; walk != NULL; walk = walk->next)
renatofilho@870
   628
    {
renatofilho@870
   629
        GValue program = { 0, };
renatofilho@870
   630
        gchar *start_str;
renatofilho@870
   631
        gchar *end_str;
renatofilho@870
   632
        GMythProgramInfo *data;
renatofilho@870
   633
renatofilho@870
   634
        data = (GMythProgramInfo *) walk->data;
renatofilho@870
   635
renatofilho@870
   636
        if (!data)
renatofilho@870
   637
            continue;
renatofilho@870
   638
renatofilho@870
   639
        g_value_init (&program, program_type);
renatofilho@870
   640
        g_value_take_boxed (&program,
renatofilho@870
   641
                            dbus_g_type_specialized_construct (program_type));
renatofilho@870
   642
renatofilho@870
   643
        start_str = g_time_val_to_iso8601 (data->startts);
renatofilho@870
   644
        end_str = g_time_val_to_iso8601 (data->endts);
renatofilho@870
   645
renatofilho@870
   646
        dbus_g_type_struct_set (&program,
renatofilho@896
   647
                                0, data->channel_id,
renatofilho@870
   648
                                1, start_str,
renatofilho@870
   649
                                2, end_str,
renatofilho@870
   650
                                3, data->title->str,
renatofilho@870
   651
                                4, data->subtitle->str,
renatofilho@870
   652
                                5, data->description->str,
renatofilho@870
   653
                                6, data->category->str,
renatofilho@870
   654
                                G_MAXUINT);
renatofilho@870
   655
renatofilho@870
   656
        g_ptr_array_add (*programs, g_value_get_boxed (&program));
renatofilho@870
   657
        g_free (start_str);
renatofilho@870
   658
        g_free (end_str);
renatofilho@870
   659
    }
renatofilho@870
   660
renatofilho@870
   661
    if (list)
renatofilho@870
   662
        gmyth_free_program_list (list);
renatofilho@870
   663
renatofilho@870
   664
    g_debug ("%s:%d", __FUNCTION__, __LINE__);
renatofilho@870
   665
    return TRUE;
renatofilho@870
   666
}
renatofilho@870
   667
renatofilho@870
   668
static void
renatofilho@870
   669
gmyth_dbus_server_parse_recorded_info (RecordedInfo *info,
renatofilho@870
   670
                                       GValue *val)
renatofilho@870
   671
{
renatofilho@870
   672
    gchar *start_str;
renatofilho@870
   673
    gchar *end_str;
renatofilho@870
   674
renatofilho@870
   675
    start_str = g_time_val_to_iso8601 (info->start_time);
renatofilho@870
   676
    end_str = g_time_val_to_iso8601 (info->end_time);
renatofilho@870
   677
renatofilho@870
   678
    dbus_g_type_struct_set (val,
renatofilho@870
   679
                            0, info->record_id,
renatofilho@896
   680
                            1, info->program_id->str,
renatofilho@896
   681
                            2, info->channel_id,
renatofilho@870
   682
                            3, start_str,
renatofilho@870
   683
                            4, end_str,
renatofilho@870
   684
                            5, info->title->str,
renatofilho@870
   685
                            6, info->subtitle->str,
renatofilho@870
   686
                            7, info->description->str,
renatofilho@870
   687
                            8, info->category->str,
renatofilho@870
   688
                            9, info->basename->str,
renatofilho@870
   689
                            10, info->filesize,
renatofilho@870
   690
                            G_MAXUINT);
renatofilho@870
   691
    g_free (start_str);
renatofilho@870
   692
    g_free (end_str);
renatofilho@870
   693
}
renatofilho@870
   694
renatofilho@870
   695
static gboolean
renatofilho@870
   696
gmyth_dbus_server_get_recorded_info (GObject *obj,
renatofilho@870
   697
                                     const gchar *basename,
renatofilho@870
   698
                                     GValueArray **info,
renatofilho@870
   699
                                     GError **error)
renatofilho@870
   700
{
renatofilho@870
   701
    GType record_type;
renatofilho@870
   702
    GMythDbusServerPrivate *priv;
renatofilho@870
   703
    RecordedInfo *record_info;
renatofilho@870
   704
renatofilho@870
   705
renatofilho@870
   706
    g_debug ("%s:%d", __FUNCTION__, __LINE__);
renatofilho@870
   707
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
   708
renatofilho@870
   709
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@873
   710
renatofilho@877
   711
    if (!gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj), error))
renatofilho@873
   712
        return FALSE;
renatofilho@870
   713
renatofilho@870
   714
    record_type = GMYTH_DBUS_RECORD_G_TYPE;
renatofilho@870
   715
renatofilho@870
   716
    record_info = gmyth_scheduler_get_recorded_info (priv->myth_scheduler,
renatofilho@870
   717
                                                     basename);
renatofilho@870
   718
renatofilho@870
   719
    if (record_info)
renatofilho@870
   720
    {
renatofilho@870
   721
        GValue r = { 0, };
renatofilho@870
   722
renatofilho@870
   723
        g_value_init (&r, record_type);
renatofilho@870
   724
        g_value_take_boxed (&r,
renatofilho@870
   725
                            dbus_g_type_specialized_construct (record_type));
renatofilho@870
   726
renatofilho@870
   727
        gmyth_dbus_server_parse_recorded_info (record_info, &r);
renatofilho@870
   728
        gmyth_recorded_info_free (record_info);
renatofilho@870
   729
renatofilho@870
   730
        *info = g_value_get_boxed (&r);
renatofilho@870
   731
renatofilho@870
   732
        return TRUE;
renatofilho@870
   733
    }
renatofilho@877
   734
    else
renatofilho@877
   735
    {
renatofilho@877
   736
        g_set_error (error,
renatofilho@877
   737
                     GMYTH_DBUS_ERROR,
renatofilho@877
   738
                     GMYTH_DBUS_ERROR_EPG,
renatofilho@877
   739
                     _("no record info avaliable"));
renatofilho@877
   740
renatofilho@877
   741
    }
renatofilho@870
   742
renatofilho@870
   743
    return FALSE;
renatofilho@870
   744
}
renatofilho@870
   745
renatofilho@870
   746
renatofilho@870
   747
static gboolean
renatofilho@870
   748
gmyth_dbus_server_get_recorded_list (GObject *obj,
renatofilho@870
   749
                                     GPtrArray **records,
renatofilho@870
   750
                                     GError **error)
renatofilho@870
   751
{
renatofilho@870
   752
    GList *list;
renatofilho@870
   753
    GList *walk;
renatofilho@870
   754
    gint len;
renatofilho@870
   755
    GType record_type;
renatofilho@870
   756
    GMythDbusServerPrivate *priv;
renatofilho@870
   757
renatofilho@870
   758
    g_debug ("%s:%d", __FUNCTION__, __LINE__);
renatofilho@870
   759
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
   760
renatofilho@874
   761
    g_return_val_if_fail (priv->myth_backend != NULL, FALSE);
renatofilho@877
   762
    if (!gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj), error))
renatofilho@873
   763
        return FALSE;
renatofilho@870
   764
renatofilho@870
   765
renatofilho@870
   766
    len = gmyth_scheduler_get_recorded_list (priv->myth_scheduler,
renatofilho@870
   767
                                             &list);
renatofilho@870
   768
renatofilho@870
   769
    record_type = GMYTH_DBUS_RECORD_G_TYPE;
renatofilho@870
   770
    *records = g_ptr_array_sized_new (len);
renatofilho@870
   771
renatofilho@870
   772
    for (walk = list; walk != NULL; walk = walk->next)
renatofilho@870
   773
    {
renatofilho@870
   774
        GValue record = { 0, };
renatofilho@870
   775
        RecordedInfo *data;
renatofilho@870
   776
renatofilho@870
   777
        data = (RecordedInfo *) walk->data;
renatofilho@870
   778
renatofilho@870
   779
        g_value_init (&record, record_type);
renatofilho@870
   780
        g_value_take_boxed (&record,
renatofilho@870
   781
                            dbus_g_type_specialized_construct (record_type));
renatofilho@870
   782
renatofilho@870
   783
        gmyth_dbus_server_parse_recorded_info (data, &record);
renatofilho@870
   784
renatofilho@870
   785
        g_ptr_array_add (*records, g_value_get_boxed (&record));
renatofilho@870
   786
        //g_value_unset (&record);
renatofilho@870
   787
    }
renatofilho@870
   788
renatofilho@870
   789
    gmyth_recorded_info_list_free (list);
renatofilho@870
   790
renatofilho@870
   791
    return TRUE;
renatofilho@870
   792
renatofilho@870
   793
}
renatofilho@870
   794
renatofilho@870
   795
static gboolean
renatofilho@870
   796
gmyth_dbus_server_get_schedule_list (GObject *obj,
renatofilho@877
   797
                                     GPtrArray **schedules,
renatofilho@877
   798
                                     GError **error)
renatofilho@870
   799
{
renatofilho@870
   800
    GList *list;
renatofilho@870
   801
    GList *walk;
renatofilho@870
   802
    gint len;
renatofilho@870
   803
    GType schedule_type;
renatofilho@870
   804
    GMythDbusServerPrivate *priv;
renatofilho@870
   805
renatofilho@870
   806
    g_debug ("%s:%d", __FUNCTION__, __LINE__);
renatofilho@870
   807
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
   808
renatofilho@870
   809
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@877
   810
    if (!gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj), error))
renatofilho@873
   811
        return FALSE;
renatofilho@870
   812
renatofilho@870
   813
renatofilho@870
   814
    len = gmyth_scheduler_get_schedule_list (priv->myth_scheduler,
renatofilho@870
   815
                                             &list);
renatofilho@870
   816
renatofilho@870
   817
    *schedules = g_ptr_array_sized_new (len);
renatofilho@870
   818
    schedule_type = GMYTH_DBUS_SCHEDULE_G_TYPE;
renatofilho@870
   819
renatofilho@870
   820
    for (walk = list; walk != NULL; walk = walk->next)
renatofilho@870
   821
    {
renatofilho@870
   822
        GValue schedule = { 0, };
renatofilho@870
   823
        ScheduleInfo *data;
renatofilho@870
   824
        gchar *start_str_time;
renatofilho@870
   825
        gchar *end_str_time;
renatofilho@870
   826
renatofilho@870
   827
        data = (ScheduleInfo *) walk->data;
renatofilho@870
   828
renatofilho@870
   829
        g_value_init (&schedule, schedule_type);
renatofilho@870
   830
        g_value_take_boxed (&schedule,
renatofilho@870
   831
                            dbus_g_type_specialized_construct (schedule_type));
renatofilho@870
   832
renatofilho@870
   833
        start_str_time = g_time_val_to_iso8601 (data->start_time);
renatofilho@870
   834
        end_str_time = g_time_val_to_iso8601 (data->end_time);
renatofilho@870
   835
renatofilho@870
   836
        dbus_g_type_struct_set (&schedule,
renatofilho@870
   837
                            0, data->schedule_id,
renatofilho@896
   838
                            1, data->program_id->str,
renatofilho@896
   839
                            2, data->channel_id,
renatofilho@870
   840
                            3, start_str_time,
renatofilho@870
   841
                            4, end_str_time,
renatofilho@870
   842
                            5, data->title->str,
renatofilho@870
   843
                            6, data->subtitle->str,
renatofilho@870
   844
                            7, data->description->str,
renatofilho@870
   845
                            8, data->category->str,
renatofilho@870
   846
                            9, data->type,
renatofilho@870
   847
                            G_MAXUINT);
renatofilho@870
   848
renatofilho@870
   849
        g_ptr_array_add (*schedules, g_value_get_boxed (&schedule));
renatofilho@870
   850
renatofilho@870
   851
        g_free (start_str_time);
renatofilho@870
   852
        g_free (end_str_time);
renatofilho@870
   853
    }
renatofilho@870
   854
renatofilho@870
   855
    gmyth_schedule_info_list_free (list);
renatofilho@870
   856
renatofilho@870
   857
    return TRUE;
renatofilho@870
   858
}
renatofilho@870
   859
renatofilho@870
   860
renatofilho@870
   861
static gboolean
renatofilho@870
   862
gmyth_dbus_server_get_thumbnail (GObject *obj,
renatofilho@870
   863
                                const gchar *uri,
renatofilho@870
   864
                                GByteArray **image,
renatofilho@870
   865
                                GError **error)
renatofilho@870
   866
{
renatofilho@870
   867
    GMythFileTransfer *file_transfer;
renatofilho@870
   868
    glong filesize;
renatofilho@870
   869
    GMythFileReadResult result;
renatofilho@870
   870
    GMythDbusServerPrivate *priv;
renatofilho@870
   871
renatofilho@870
   872
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
   873
renatofilho@873
   874
    file_transfer = NULL;
renatofilho@873
   875
renatofilho@870
   876
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@870
   877
renatofilho@870
   878
    if (!gmyth_util_file_exists (priv->myth_backend, uri))
renatofilho@877
   879
    {
renatofilho@877
   880
        g_set_error (error,
renatofilho@877
   881
                     GMYTH_DBUS_ERROR,
renatofilho@877
   882
                     GMYTH_DBUS_ERROR_MYTHTV,
renatofilho@877
   883
                     _("File not exists"));
renatofilho@877
   884
renatofilho@870
   885
        goto fail;
renatofilho@877
   886
    }
renatofilho@870
   887
renatofilho@870
   888
    file_transfer = gmyth_file_transfer_new (priv->myth_backend);
renatofilho@870
   889
renatofilho@870
   890
    if (!gmyth_file_transfer_open (file_transfer, uri))
renatofilho@877
   891
    {
renatofilho@877
   892
        g_set_error (error,
renatofilho@877
   893
                     GMYTH_DBUS_ERROR,
renatofilho@877
   894
                     GMYTH_DBUS_ERROR_MYTHTV,
renatofilho@877
   895
                     _("Fail to open file"));
renatofilho@870
   896
        goto fail;
renatofilho@877
   897
    }
renatofilho@870
   898
renatofilho@870
   899
    filesize = gmyth_file_transfer_get_filesize (file_transfer);
renatofilho@870
   900
    if (filesize <= 0)
renatofilho@870
   901
        goto fail;
renatofilho@870
   902
renatofilho@870
   903
    *image = g_byte_array_new ();
renatofilho@870
   904
    result = gmyth_file_transfer_read (file_transfer, *image, filesize, FALSE);
renatofilho@870
   905
    if (result == GMYTH_FILE_READ_ERROR)
renatofilho@877
   906
    {
renatofilho@877
   907
        g_set_error (error,
renatofilho@877
   908
                     GMYTH_DBUS_ERROR,
renatofilho@877
   909
                     GMYTH_DBUS_ERROR_MYTHTV,
renatofilho@877
   910
                     _("Fail to read file"));
renatofilho@877
   911
renatofilho@870
   912
       goto fail;
renatofilho@877
   913
    }
renatofilho@870
   914
renatofilho@870
   915
    gmyth_file_transfer_close (file_transfer);
renatofilho@870
   916
    g_object_unref (file_transfer);
renatofilho@870
   917
renatofilho@870
   918
    if (filesize > (*image)->len)
renatofilho@877
   919
    {
renatofilho@877
   920
        g_set_error (error,
renatofilho@877
   921
                     GMYTH_DBUS_ERROR,
renatofilho@877
   922
                     GMYTH_DBUS_ERROR_MYTHTV,
renatofilho@877
   923
                     _("Empty file"));
renatofilho@877
   924
renatofilho@870
   925
        goto fail;
renatofilho@877
   926
    }
renatofilho@870
   927
renatofilho@870
   928
    return TRUE;
renatofilho@870
   929
renatofilho@870
   930
fail:
renatofilho@870
   931
    if (*image)
renatofilho@870
   932
        g_byte_array_free (*image, TRUE);
renatofilho@870
   933
    g_object_unref(file_transfer);
renatofilho@870
   934
    return FALSE;
renatofilho@870
   935
}
renatofilho@870
   936
renatofilho@870
   937
static gboolean
renatofilho@870
   938
gmyth_dbus_server_get_channel_icon (GObject *obj,
renatofilho@870
   939
                                    guint channel_id,
renatofilho@870
   940
                                    GByteArray **icon,
renatofilho@870
   941
                                    GError **error)
renatofilho@870
   942
{
renatofilho@870
   943
    GMythChannelInfo *channel = NULL;
renatofilho@870
   944
    guint8 *icon_data;
renatofilho@870
   945
    guint icon_length;
renatofilho@870
   946
    GMythDbusServerPrivate *priv;
renatofilho@870
   947
renatofilho@870
   948
    g_debug ("%s:%d", __FUNCTION__, __LINE__);
renatofilho@870
   949
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
   950
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@870
   951
renatofilho@870
   952
    channel = gmyth_epg_get_channel_info (priv->myth_epg,
renatofilho@870
   953
                                         (gint) channel_id);
renatofilho@870
   954
renatofilho@870
   955
    *icon = NULL;
renatofilho@870
   956
renatofilho@870
   957
    if (channel == NULL)
renatofilho@877
   958
    {
renatofilho@877
   959
        g_set_error (error,
renatofilho@877
   960
                     GMYTH_DBUS_ERROR,
renatofilho@877
   961
                     GMYTH_DBUS_ERROR_MYTHTV,
renatofilho@877
   962
                     _("Invalid channel"));
renatofilho@877
   963
renatofilho@870
   964
        return FALSE;
renatofilho@877
   965
    }
renatofilho@870
   966
renatofilho@870
   967
    if (!gmyth_epg_channel_has_icon(priv->myth_epg, channel))
renatofilho@870
   968
    {
renatofilho@870
   969
        gmyth_channel_info_free (channel);
renatofilho@877
   970
        g_set_error (error,
renatofilho@877
   971
                     GMYTH_DBUS_ERROR,
renatofilho@877
   972
                     GMYTH_DBUS_ERROR_MYTHTV,
renatofilho@877
   973
                     _("Channel does not have icon available"));
renatofilho@877
   974
renatofilho@870
   975
        return FALSE;
renatofilho@870
   976
    }
renatofilho@870
   977
renatofilho@870
   978
    icon_data = NULL;
renatofilho@870
   979
    icon_length = 0;
renatofilho@870
   980
    if (!gmyth_epg_channel_get_icon (priv->myth_epg,
renatofilho@870
   981
                                     channel,
renatofilho@870
   982
                                     &icon_data,
renatofilho@870
   983
                                     &icon_length)) 
renatofilho@870
   984
    {
renatofilho@870
   985
        gmyth_channel_info_free (channel);
renatofilho@877
   986
        g_set_error (error,
renatofilho@877
   987
                     GMYTH_DBUS_ERROR,
renatofilho@877
   988
                     GMYTH_DBUS_ERROR_MYTHTV,
renatofilho@877
   989
                     _("Could not get channel icon for channel id = %u"),
renatofilho@877
   990
                     channel_id);
renatofilho@870
   991
        return FALSE;
renatofilho@870
   992
    }
renatofilho@870
   993
renatofilho@870
   994
    *icon = g_byte_array_sized_new (icon_length);
renatofilho@870
   995
    *icon = g_byte_array_append (*icon, icon_data, icon_length);
renatofilho@870
   996
renatofilho@870
   997
    g_free (icon_data);
renatofilho@870
   998
    gmyth_channel_info_free(channel);
renatofilho@870
   999
    return TRUE;
renatofilho@870
  1000
}
renatofilho@870
  1001
renatofilho@870
  1002
renatofilho@870
  1003
static gboolean
renatofilho@870
  1004
gmyth_dbus_server_stop_recording (GObject *obj,
renatofilho@870
  1005
                                  guint channel_id,
renatofilho@870
  1006
                                  gboolean *result,
renatofilho@870
  1007
                                  GError **error)
renatofilho@870
  1008
{
renatofilho@870
  1009
    gboolean ret = FALSE;
renatofilho@870
  1010
    GMythDbusServerPrivate *priv;
renatofilho@870
  1011
renatofilho@870
  1012
    g_debug ("%s:%d", __FUNCTION__, __LINE__);
renatofilho@870
  1013
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
  1014
renatofilho@870
  1015
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@877
  1016
    if (!gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj), error))
renatofilho@873
  1017
        return FALSE;
renatofilho@870
  1018
renatofilho@870
  1019
    ret = gmyth_scheduler_stop_recording (priv->myth_scheduler,
renatofilho@870
  1020
                                          channel_id);
renatofilho@870
  1021
renatofilho@870
  1022
    return ret;
renatofilho@870
  1023
}
renatofilho@870
  1024
renatofilho@870
  1025
static ScheduleInfo*
renatofilho@870
  1026
gmyth_dbus_server_new_schedule_info (const gchar* description,
renatofilho@870
  1027
                                     guint channel_id,
renatofilho@891
  1028
                                     const gchar* program_id,
renatofilho@870
  1029
                                     GTimeVal *start_vtime,
renatofilho@870
  1030
                                     GTimeVal *end_vtime)
renatofilho@870
  1031
{
renatofilho@870
  1032
    ScheduleInfo   *new_sched_info;
renatofilho@870
  1033
renatofilho@870
  1034
    new_sched_info = g_new0(ScheduleInfo, 1);
renatofilho@870
  1035
renatofilho@870
  1036
    /* record_id == -1 for generating a new id */
renatofilho@870
  1037
    new_sched_info->schedule_id = -1;
renatofilho@870
  1038
renatofilho@896
  1039
    new_sched_info->channel_id = channel_id;
renatofilho@896
  1040
    new_sched_info->program_id = g_string_new (program_id);
renatofilho@870
  1041
    new_sched_info->start_time = g_new0 (GTimeVal, 1);
renatofilho@870
  1042
    *new_sched_info->start_time = *start_vtime;
renatofilho@870
  1043
    new_sched_info->end_time = g_new0 (GTimeVal, 1);
renatofilho@870
  1044
    *new_sched_info->end_time = *end_vtime;
renatofilho@870
  1045
renatofilho@870
  1046
    /* TODO: there is no frequency field */
renatofilho@870
  1047
    /*new_sched_info->frequency = -1;*/
renatofilho@870
  1048
renatofilho@870
  1049
    if (description != NULL) {
renatofilho@870
  1050
        /* FIXME: description parameter is used as title and description */
renatofilho@870
  1051
        new_sched_info->title = g_string_new(description);
renatofilho@870
  1052
        new_sched_info->description = g_string_new(description);
renatofilho@870
  1053
    }
renatofilho@870
  1054
renatofilho@870
  1055
    return new_sched_info;
renatofilho@870
  1056
}
renatofilho@870
  1057
renatofilho@870
  1058
static gboolean
renatofilho@870
  1059
gmyth_dbus_server_add_schedule (GObject *obj,
melunko@904
  1060
                                gint channel_id,
renatofilho@891
  1061
                                const gchar *program_id,
renatofilho@870
  1062
                                const gchar *start_time,
renatofilho@870
  1063
                                const gchar *end_time,
renatofilho@870
  1064
                                gboolean recurring,
renatofilho@870
  1065
                                const gchar *description,
renatofilho@870
  1066
                                guint *schedule_id,
renatofilho@870
  1067
                                GError **error)
renatofilho@870
  1068
{
renatofilho@870
  1069
    ScheduleInfo *sch_info;
renatofilho@870
  1070
    GTimeVal start_vtime;
renatofilho@870
  1071
    GTimeVal end_vtime;
renatofilho@870
  1072
    GMythDbusServerPrivate *priv;
renatofilho@870
  1073
renatofilho@870
  1074
    g_debug ("%s:%d", __FUNCTION__, __LINE__);
renatofilho@870
  1075
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
  1076
renatofilho@870
  1077
    *schedule_id = 0;
renatofilho@870
  1078
renatofilho@870
  1079
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@873
  1080
renatofilho@877
  1081
    if (!gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj), error))
renatofilho@873
  1082
        return FALSE;
renatofilho@870
  1083
renatofilho@870
  1084
renatofilho@870
  1085
    g_time_val_from_iso8601 (start_time, &start_vtime);
renatofilho@870
  1086
    g_time_val_from_iso8601 (end_time, &end_vtime);
melunko@904
  1087
renatofilho@870
  1088
    sch_info = gmyth_dbus_server_new_schedule_info (description,
renatofilho@870
  1089
                                                    channel_id,
renatofilho@870
  1090
                                                    program_id,
renatofilho@870
  1091
                                                    &start_vtime,
renatofilho@870
  1092
                                                    &end_vtime);
renatofilho@891
  1093
renatofilho@870
  1094
    if (sch_info != NULL) {
renatofilho@870
  1095
        GMythScheduleType type;
renatofilho@870
  1096
        GTimeVal t_now;
renatofilho@870
  1097
        gboolean has_record;
renatofilho@870
  1098
renatofilho@870
  1099
        type = (recurring ?
renatofilho@870
  1100
                GMYTH_SCHEDULE_ALL_OCCURRENCES :
renatofilho@870
  1101
                GMYTH_SCHEDULE_ONE_OCCURRENCE);
renatofilho@870
  1102
renatofilho@870
  1103
        g_get_current_time (&t_now);
renatofilho@870
  1104
renatofilho@870
  1105
        has_record = gmyth_scheduler_was_recorded_before (priv->myth_scheduler, 
renatofilho@870
  1106
                                                          channel_id,
renatofilho@870
  1107
                                                          (time_t) start_vtime.tv_sec);
renatofilho@870
  1108
renatofilho@870
  1109
renatofilho@870
  1110
        if ((t_now.tv_sec >= start_vtime.tv_sec)
renatofilho@870
  1111
            && (t_now.tv_sec <= end_vtime.tv_sec) && has_record)
renatofilho@870
  1112
        {
renatofilho@870
  1113
            GMythSocket    *socket;
renatofilho@870
  1114
            gboolean        res = FALSE;
renatofilho@870
  1115
renatofilho@870
  1116
            socket = gmyth_backend_info_get_connected_socket (priv->myth_backend);
renatofilho@870
  1117
            res = gmyth_scheduler_reactivate_schedule(priv->myth_scheduler,
renatofilho@870
  1118
                                                      channel_id,
renatofilho@870
  1119
                                                      (time_t) start_vtime.tv_sec);
renatofilho@870
  1120
            if (res) {
renatofilho@870
  1121
                GMythStringList *slist = gmyth_string_list_new();
renatofilho@870
  1122
renatofilho@870
  1123
                gmyth_string_list_append_char_array(slist, "RESCHEDULE_RECORDINGS 0");
renatofilho@870
  1124
                gmyth_socket_sendreceive_stringlist(socket, slist);
renatofilho@870
  1125
                res = (gmyth_string_list_get_int(slist, 0) == 1);
renatofilho@870
  1126
                g_object_unref(slist);
renatofilho@870
  1127
            }
renatofilho@870
  1128
renatofilho@870
  1129
            g_object_unref(socket);
renatofilho@870
  1130
            return res;
renatofilho@870
  1131
        }
renatofilho@870
  1132
        else
renatofilho@870
  1133
        {
renatofilho@870
  1134
            if (!gmyth_scheduler_add_schedule_full (priv->myth_scheduler,
renatofilho@870
  1135
                                                    sch_info,
renatofilho@870
  1136
                                                    type))
renatofilho@870
  1137
            {
renatofilho@870
  1138
                g_warning("Could not add schedule entry");
renatofilho@870
  1139
                return FALSE;
renatofilho@870
  1140
            }
renatofilho@870
  1141
renatofilho@870
  1142
            (*schedule_id) = sch_info->schedule_id;
renatofilho@870
  1143
            gmyth_schedule_info_free (sch_info);
renatofilho@870
  1144
            return TRUE;
renatofilho@870
  1145
        }
renatofilho@870
  1146
    }
renatofilho@870
  1147
    return FALSE;
renatofilho@870
  1148
}
renatofilho@870
  1149
renatofilho@870
  1150
static gboolean
renatofilho@870
  1151
gmyth_dbus_server_add_exception (GObject *obj,
renatofilho@870
  1152
                                 guint schedule_id,
melunko@904
  1153
                                 gint channel_id,
renatofilho@891
  1154
                                 const gchar *program_id,
renatofilho@870
  1155
                                 const gchar *start_time,
renatofilho@870
  1156
                                 const gchar *end_time,
renatofilho@870
  1157
                                 const gchar *description,
renatofilho@870
  1158
                                 GError **error)
renatofilho@870
  1159
{
renatofilho@870
  1160
    ScheduleInfo *sch_info;
renatofilho@870
  1161
    GTimeVal start_vtime;
renatofilho@870
  1162
    GTimeVal end_vtime;
renatofilho@870
  1163
    GMythDbusServerPrivate *priv;
renatofilho@870
  1164
renatofilho@870
  1165
    g_debug ("%s:%d", __FUNCTION__, __LINE__);
renatofilho@870
  1166
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
  1167
renatofilho@870
  1168
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@873
  1169
renatofilho@877
  1170
    if (!gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj), error))
renatofilho@873
  1171
        return FALSE;
renatofilho@870
  1172
renatofilho@870
  1173
    g_time_val_from_iso8601 (start_time, &start_vtime);
renatofilho@870
  1174
    g_time_val_from_iso8601 (end_time, &end_vtime);
renatofilho@870
  1175
renatofilho@870
  1176
    sch_info = gmyth_dbus_server_new_schedule_info (description,
renatofilho@870
  1177
                                                   channel_id,
renatofilho@870
  1178
                                                   program_id,
renatofilho@870
  1179
                                                   &start_vtime,
renatofilho@870
  1180
                                                   &end_vtime);
renatofilho@870
  1181
    if (sch_info != NULL)
renatofilho@870
  1182
    {
renatofilho@870
  1183
       if (!gmyth_scheduler_add_exception (priv->myth_scheduler,
renatofilho@870
  1184
                                           schedule_id,
renatofilho@870
  1185
                                           sch_info))
renatofilho@870
  1186
       {
renatofilho@870
  1187
           g_warning ("Could not add schedule exception");
renatofilho@870
  1188
           gmyth_schedule_info_free (sch_info);
renatofilho@870
  1189
           return FALSE;
renatofilho@870
  1190
       }
renatofilho@870
  1191
renatofilho@870
  1192
       gmyth_schedule_info_free (sch_info);
renatofilho@870
  1193
       return TRUE;
renatofilho@870
  1194
    }
renatofilho@870
  1195
    return FALSE;
renatofilho@870
  1196
}
renatofilho@870
  1197
renatofilho@870
  1198
static gboolean
renatofilho@870
  1199
gmyth_dbus_server_remove_schedule (GObject *obj,
renatofilho@870
  1200
                                   guint schedule_id,
renatofilho@870
  1201
                                   GError **error)
renatofilho@870
  1202
{
renatofilho@870
  1203
    GMythDbusServerPrivate *priv;
renatofilho@870
  1204
renatofilho@870
  1205
    g_debug ("%s:%d", __FUNCTION__, __LINE__);
renatofilho@870
  1206
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (obj);
renatofilho@870
  1207
renatofilho@870
  1208
    g_return_val_if_fail (priv->myth_backend, FALSE);
renatofilho@873
  1209
renatofilho@877
  1210
    if (!gmyth_dbus_server_connect_scheduler (GMYTH_DBUS_SERVER (obj), error))
renatofilho@873
  1211
        return FALSE;
renatofilho@870
  1212
renatofilho@870
  1213
    return gmyth_scheduler_delete_schedule (priv->myth_scheduler, schedule_id);
renatofilho@870
  1214
}
renatofilho@870
  1215
renatofilho@870
  1216
GMythDbusServer*
renatofilho@870
  1217
gmyth_dbus_server_start_dbus_service (void)
renatofilho@870
  1218
{
renatofilho@870
  1219
    GError *error = NULL;
renatofilho@870
  1220
    DBusGProxy *proxy;
renatofilho@870
  1221
    DBusGConnection *bus;
renatofilho@870
  1222
    guint request_ret;
renatofilho@870
  1223
    GMythDbusServer *self;
renatofilho@870
  1224
renatofilho@870
  1225
    self = g_object_new (GMYTH_DBUS_SERVER_TYPE, NULL);
renatofilho@870
  1226
    g_return_val_if_fail (self, FALSE);
renatofilho@870
  1227
renatofilho@870
  1228
    /* TODO: should verify if this service was already started */
renatofilho@870
  1229
renatofilho@870
  1230
    /* connect to session bus */
renatofilho@870
  1231
    bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
renatofilho@870
  1232
    if (bus == NULL) 
renatofilho@870
  1233
    {
renatofilho@870
  1234
        g_warning ("Could not connect to dbus: %s", error->message);
renatofilho@870
  1235
        g_error_free (error);
renatofilho@870
  1236
        goto fail;
renatofilho@870
  1237
    }
renatofilho@870
  1238
renatofilho@870
  1239
    /* register dbus object */
renatofilho@870
  1240
    dbus_g_connection_register_g_object (bus,
renatofilho@870
  1241
        GMYTH_DBUS_SERVER_PATH, G_OBJECT (self));
renatofilho@870
  1242
renatofilho@870
  1243
    proxy = dbus_g_proxy_new_for_name (bus, DBUS_SERVICE_DBUS,
renatofilho@870
  1244
                                       DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
renatofilho@870
  1245
renatofilho@870
  1246
    /* registering download manager service */
renatofilho@870
  1247
    if (!org_freedesktop_DBus_request_name (proxy, GMYTH_DBUS_SERVER_IFACE,
renatofilho@870
  1248
                                            0, &request_ret, &error)) 
renatofilho@870
  1249
    {
renatofilho@870
  1250
        g_warning ("Unable to register dbus service: %d %s",
renatofilho@870
  1251
                   error->code, error->message);
renatofilho@870
  1252
        g_error_free (error);
renatofilho@870
  1253
        goto fail;
renatofilho@870
  1254
    }
renatofilho@870
  1255
renatofilho@870
  1256
    if (request_ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) 
renatofilho@870
  1257
    {
renatofilho@870
  1258
        g_warning ("Got result code %u from requesting name", request_ret);
renatofilho@870
  1259
        goto fail;
renatofilho@870
  1260
    }
renatofilho@870
  1261
renatofilho@870
  1262
    return self;
renatofilho@870
  1263
renatofilho@870
  1264
fail:
renatofilho@870
  1265
    g_object_unref (self);
renatofilho@870
  1266
    return NULL;
renatofilho@870
  1267
}
renatofilho@870
  1268
renatofilho@881
  1269
renatofilho@881
  1270
static void 
renatofilho@881
  1271
gmyth_dbus_server_cancel_shutdown (GMythDbusServer *self)
renatofilho@881
  1272
{
renatofilho@881
  1273
    GMythDbusServerPrivate *priv;
renatofilho@881
  1274
renatofilho@881
  1275
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (self);
renatofilho@881
  1276
renatofilho@881
  1277
    if (priv->shutdown_cb_id)
renatofilho@881
  1278
    {
renatofilho@881
  1279
        g_source_remove (priv->shutdown_cb_id);
renatofilho@881
  1280
        priv->shutdown_cb_id = 0;
renatofilho@881
  1281
    }
renatofilho@881
  1282
}
renatofilho@881
  1283
renatofilho@881
  1284
static gboolean
renatofilho@881
  1285
gmyth_dbus_server_shutdown_cb (GMythDbusServer *self)
renatofilho@881
  1286
{
renatofilho@881
  1287
    GMythDbusServerPrivate *priv;
renatofilho@881
  1288
renatofilho@881
  1289
    priv = GMYTH_DBUS_SERVER_GET_PRIVATE (self);
renatofilho@881
  1290
renatofilho@881
  1291
    priv->shutdown_cb_id = 0;
renatofilho@881
  1292
    g_signal_emit (self, signals[SHUTDOWN], 0);
renatofilho@881
  1293
    return FALSE;
renatofilho@881
  1294
}
renatofilho@881
  1295
melunko@912
  1296
static gboolean
melunko@912
  1297
gmyth_dbus_server_check_db_connection (GObject *obj,                             
melunko@912
  1298
                                const gchar *host,
melunko@912
  1299
                                gint port,
melunko@912
  1300
                                const gchar *user,
melunko@912
  1301
                                const gchar *password,
melunko@912
  1302
                                GError **error) 
melunko@912
  1303
{
melunko@912
  1304
    GMythQuery *query = gmyth_query_new ();
melunko@912
  1305
    GMythBackendInfo *binfo;
melunko@912
  1306
    gboolean ret;
melunko@912
  1307
melunko@912
  1308
    gmyth_debug ("");
melunko@912
  1309
melunko@912
  1310
    binfo = gmyth_backend_info_new_full (host, user, password, MYTH_DEFAULT_DB, port);
melunko@912
  1311
melunko@912
  1312
    ret = gmyth_query_connect_with_timeout (query, binfo, 2 /*seconds*/);
melunko@912
  1313
    gmyth_query_disconnect (query);
melunko@912
  1314
melunko@912
  1315
    g_object_unref (query);
melunko@912
  1316
    g_object_unref (binfo);
melunko@912
  1317
melunko@912
  1318
    if (!ret) {
melunko@912
  1319
        g_set_error (error, GMYTH_DBUS_ERROR, GMYTH_DBUS_ERROR_CONNECTION,
melunko@913
  1320
                     _("Fail to connect with backend database"));
melunko@913
  1321
    }
melunko@913
  1322
melunko@913
  1323
    return ret;
melunko@913
  1324
}
melunko@913
  1325
melunko@913
  1326
static gboolean
melunko@913
  1327
gmyth_dbus_server_check_server_connection (GObject *obj,                             
melunko@913
  1328
                                const gchar *host,
melunko@913
  1329
                                gint port,
melunko@913
  1330
                                GError **error) 
melunko@913
  1331
{
melunko@913
  1332
    GMythSocket *msocket = gmyth_socket_new ();
melunko@913
  1333
    gboolean ret;
melunko@913
  1334
melunko@913
  1335
    gmyth_debug ("");
melunko@913
  1336
melunko@913
  1337
    g_debug ("Checking server connection");
melunko@913
  1338
    ret = gmyth_socket_connect_with_timeout (msocket, host, port, 2);
melunko@913
  1339
    g_debug ("Return %s", ret ? "ok" : "bad");
melunko@913
  1340
    gmyth_socket_close_connection (msocket);
melunko@913
  1341
melunko@913
  1342
    g_object_unref (msocket);
melunko@913
  1343
melunko@913
  1344
    if (!ret) {
melunko@913
  1345
        g_set_error (error, GMYTH_DBUS_ERROR, GMYTH_DBUS_ERROR_CONNECTION,
melunko@912
  1346
                     _("Fail to connect with backend"));
melunko@912
  1347
    }
melunko@912
  1348
melunko@912
  1349
    return ret;
melunko@912
  1350
}
melunko@912
  1351