gmyth/src/gmyth_scheduler.c
author melunko
Mon Aug 13 22:54:55 2007 +0100 (2007-08-13)
branchtrunk
changeset 801 e51af4d0caf5
parent 798 19626dc62c16
child 814 8a6b143057d7
permissions -rw-r--r--
[svn r807] Added gmyth_scheduler_add_schedule_full() method
leo_sobral@1
     1
/**
leo_sobral@1
     2
 * GMyth Library
leo_sobral@1
     3
 *
leo_sobral@1
     4
 * @file gmyth/gmyth_scheduler.c
renatofilho@771
     5
 *
leo_sobral@1
     6
 * @brief <p> The scheduler encapsulates all functions for browsing, scheduling
leo_sobral@1
     7
 * and modifying the recorded content.
leo_sobral@1
     8
 *
leo_sobral@1
     9
 * Copyright (C) 2006 INdT - Instituto Nokia de Tecnologia.
leo_sobral@1
    10
 * @author Alexsandro Jose Virginio dos Santos <alexsandro.santos@indt.org.br>
leo_sobral@1
    11
 *
renatofilho@771
    12
 *
rosfran@701
    13
 * This program is free software; you can redistribute it and/or modify
rosfran@701
    14
 * it under the terms of the GNU Lesser General Public License as published by
rosfran@701
    15
 * the Free Software Foundation; either version 2 of the License, or
rosfran@701
    16
 * (at your option) any later version.
rosfran@701
    17
 *
rosfran@701
    18
 * This program is distributed in the hope that it will be useful,
rosfran@701
    19
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
rosfran@701
    20
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
rosfran@701
    21
 * GNU General Public License for more details.
rosfran@701
    22
 *
rosfran@701
    23
 * You should have received a copy of the GNU Lesser General Public License
rosfran@701
    24
 * along with this program; if not, write to the Free Software
rosfran@701
    25
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
rosfran@701
    26
 */
rosfran@698
    27
leo_sobral@213
    28
#ifdef HAVE_CONFIG_H
leo_sobral@213
    29
#include "config.h"
leo_sobral@213
    30
#endif
leo_sobral@1
    31
leo_sobral@213
    32
#include <assert.h>
leo_sobral@1
    33
rosfran@214
    34
#include <glib/gprintf.h>
rosfran@214
    35
rosfran@214
    36
#include "gmyth_scheduler.h"
leo_sobral@1
    37
#include "gmyth_util.h"
leo_sobral@1
    38
#include "gmyth_query.h"
melunko@117
    39
#include "gmyth_socket.h"
renatofilho@131
    40
#include "gmyth_debug.h"
leo_sobral@1
    41
renatofilho@754
    42
static void     gmyth_scheduler_class_init(GMythSchedulerClass * klass);
renatofilho@754
    43
static void     gmyth_scheduler_init(GMythScheduler * object);
leo_sobral@1
    44
renatofilho@754
    45
static void     gmyth_scheduler_dispose(GObject * object);
renatofilho@754
    46
static void     gmyth_scheduler_finalize(GObject * object);
leo_sobral@1
    47
renatofilho@750
    48
static gboolean update_backend(GMythScheduler * scheduler, gint record_id);
leo_sobral@1
    49
renatofilho@750
    50
G_DEFINE_TYPE(GMythScheduler, gmyth_scheduler, G_TYPE_OBJECT)
renatofilho@754
    51
    static void     gmyth_scheduler_class_init(GMythSchedulerClass * klass)
leo_sobral@1
    52
{
renatofilho@754
    53
    GObjectClass   *gobject_class;
leo_sobral@1
    54
renatofilho@754
    55
    gobject_class = (GObjectClass *) klass;
leo_sobral@1
    56
renatofilho@754
    57
    gobject_class->dispose = gmyth_scheduler_dispose;
renatofilho@754
    58
    gobject_class->finalize = gmyth_scheduler_finalize;
leo_sobral@1
    59
}
leo_sobral@1
    60
leo_sobral@1
    61
static void
renatofilho@750
    62
gmyth_scheduler_init(GMythScheduler * sched)
leo_sobral@1
    63
{
renatofilho@754
    64
    sched->recordid = 0;
renatofilho@754
    65
    sched->type = 0;
renatofilho@754
    66
    sched->search = 0;
renatofilho@754
    67
    sched->profile = g_string_new("");
rosfran@698
    68
renatofilho@754
    69
    sched->dupin = 0;
renatofilho@754
    70
    sched->dupmethod = 0;
renatofilho@754
    71
    sched->autoexpire = 0;
renatofilho@754
    72
    sched->autotranscode = 0;
renatofilho@754
    73
    sched->transcoder = 0;
leo_sobral@1
    74
renatofilho@754
    75
    sched->autocommflag = 0;
renatofilho@754
    76
    sched->autouserjob1 = 0;
renatofilho@754
    77
    sched->autouserjob2 = 0;
renatofilho@754
    78
    sched->autouserjob3 = 0;
renatofilho@754
    79
    sched->autouserjob4 = 0;
rosfran@698
    80
renatofilho@754
    81
    sched->startoffset = 0;
renatofilho@754
    82
    sched->endoffset = 0;
renatofilho@754
    83
    sched->maxepisodes = 0;
renatofilho@754
    84
    sched->maxnewest = 0;
leo_sobral@1
    85
renatofilho@754
    86
    sched->recpriority = 0;
renatofilho@754
    87
    sched->recgroup = g_string_new("");
renatofilho@754
    88
    sched->playgroup = g_string_new("");
rosfran@698
    89
renatofilho@754
    90
    sched->prefinput = 0;
renatofilho@754
    91
    sched->inactive = 0;
rosfran@698
    92
renatofilho@754
    93
    sched->search_type = g_string_new("");
renatofilho@754
    94
    sched->search_what = g_string_new("");
rosfran@698
    95
renatofilho@754
    96
    sched->msqlquery = gmyth_query_new();
leo_sobral@1
    97
}
leo_sobral@1
    98
leo_sobral@1
    99
static void
renatofilho@750
   100
gmyth_scheduler_dispose(GObject * object)
leo_sobral@1
   101
{
renatofilho@754
   102
    GMythScheduler *scheduler = GMYTH_SCHEDULER(object);
melunko@117
   103
renatofilho@754
   104
    if (scheduler->backend_info) {
renatofilho@754
   105
        g_object_unref(scheduler->backend_info);
renatofilho@754
   106
        scheduler->backend_info = NULL;
renatofilho@754
   107
    }
melunko@117
   108
renatofilho@754
   109
    if (scheduler->msqlquery) {
renatofilho@754
   110
        g_object_unref(scheduler->msqlquery);
renatofilho@754
   111
        scheduler->msqlquery = NULL;
renatofilho@754
   112
    }
leo_sobral@387
   113
renatofilho@754
   114
    g_string_free(scheduler->profile, TRUE);
renatofilho@754
   115
    g_string_free(scheduler->recgroup, TRUE);
renatofilho@754
   116
    g_string_free(scheduler->playgroup, TRUE);
renatofilho@754
   117
    g_string_free(scheduler->search_type, TRUE);
renatofilho@754
   118
    g_string_free(scheduler->search_what, TRUE);
leo_sobral@387
   119
renatofilho@754
   120
    G_OBJECT_CLASS(gmyth_scheduler_parent_class)->dispose(object);
leo_sobral@1
   121
}
leo_sobral@1
   122
leo_sobral@1
   123
static void
renatofilho@750
   124
gmyth_scheduler_finalize(GObject * object)
leo_sobral@1
   125
{
renatofilho@754
   126
    g_signal_handlers_destroy(object);
leo_sobral@1
   127
renatofilho@754
   128
    G_OBJECT_CLASS(gmyth_scheduler_parent_class)->finalize(object);
leo_sobral@1
   129
}
leo_sobral@1
   130
leo_sobral@1
   131
/** Creates a new instance of GMythScheduler.
leo_sobral@1
   132
 * 
leo_sobral@1
   133
 * @return a new instance of GMythScheduler.
leo_sobral@1
   134
 */
rosfran@698
   135
GMythScheduler *
renatofilho@750
   136
gmyth_scheduler_new()
leo_sobral@1
   137
{
renatofilho@754
   138
    GMythScheduler *scheduler =
renatofilho@754
   139
        GMYTH_SCHEDULER(g_object_new(GMYTH_SCHEDULER_TYPE, NULL));
rosfran@698
   140
renatofilho@754
   141
    return scheduler;
leo_sobral@1
   142
}
leo_sobral@1
   143
melunko@257
   144
gboolean
renatofilho@750
   145
gmyth_scheduler_connect(GMythScheduler * scheduler,
renatofilho@754
   146
                        GMythBackendInfo * backend_info)
melunko@257
   147
{
renatofilho@754
   148
    return gmyth_scheduler_connect_with_timeout(scheduler, backend_info,
renatofilho@754
   149
                                                0);
melunko@257
   150
}
melunko@257
   151
leo_sobral@1
   152
/** Connects to the Mysql database in the backend. The backend address
leo_sobral@1
   153
 * is loaded from the GMythSettings instance.
morphbr@766
   154
 *
leo_sobral@1
   155
 * @param scheduler the GMythScheduler instance to be connected.
leo_sobral@1
   156
 * @return true if connection was success, false if failed.
leo_sobral@1
   157
 */
leo_sobral@1
   158
gboolean
renatofilho@750
   159
gmyth_scheduler_connect_with_timeout(GMythScheduler * scheduler,
renatofilho@754
   160
                                     GMythBackendInfo * backend_info,
renatofilho@754
   161
                                     guint timeout)
leo_sobral@1
   162
{
renatofilho@754
   163
    assert(scheduler);
renatofilho@754
   164
    g_return_val_if_fail(backend_info != NULL, FALSE);
rosfran@698
   165
renatofilho@754
   166
    if (scheduler->backend_info)
renatofilho@754
   167
        g_object_unref(scheduler->backend_info);
rosfran@698
   168
renatofilho@754
   169
    scheduler->backend_info = g_object_ref(backend_info);
leo_sobral@1
   170
renatofilho@754
   171
    if (scheduler->msqlquery == NULL) {
renatofilho@754
   172
        g_warning("[%s] GMythScheduler db initializing", __FUNCTION__);
renatofilho@754
   173
        scheduler->msqlquery = gmyth_query_new();
renatofilho@754
   174
    }
leo_sobral@1
   175
renatofilho@754
   176
    if (!gmyth_query_connect_with_timeout(scheduler->msqlquery,
renatofilho@754
   177
                                          scheduler->backend_info,
renatofilho@754
   178
                                          timeout)) {
renatofilho@754
   179
        g_warning("[%s] Error while connecting to db", __FUNCTION__);
renatofilho@754
   180
        return FALSE;
renatofilho@754
   181
    }
leo_sobral@1
   182
renatofilho@754
   183
    return TRUE;
leo_sobral@1
   184
}
leo_sobral@1
   185
leo_sobral@1
   186
/** Disconnects from the Mysql database in the backend.
morphbr@766
   187
 *
leo_sobral@1
   188
 * @param scheduler the GMythScheduler instance to be disconnected
leo_sobral@1
   189
 * @return true if disconnection was success, false if failed.
leo_sobral@1
   190
 */
leo_sobral@1
   191
gboolean
renatofilho@750
   192
gmyth_scheduler_disconnect(GMythScheduler * scheduler)
leo_sobral@1
   193
{
renatofilho@754
   194
    assert(scheduler);
leo_sobral@1
   195
renatofilho@754
   196
    if (scheduler->msqlquery != NULL) {
renatofilho@754
   197
        gmyth_query_disconnect(scheduler->msqlquery);
renatofilho@754
   198
    }
leo_sobral@1
   199
renatofilho@754
   200
    return TRUE;
leo_sobral@1
   201
}
leo_sobral@1
   202
leo_sobral@1
   203
/** Retrieves from the backend Mysql database the list of recording schedules.
leo_sobral@1
   204
 * 
leo_sobral@1
   205
 * @param scheduler The GMythScheduler instance.
leo_sobral@1
   206
 * @param schedule_list the GList pointer to be filled with the loaded list of ScheduleInfo items.
leo_sobral@1
   207
 * @return The amount of schedules retrieved from database, or -1 if error.
leo_sobral@1
   208
 */
leo_sobral@1
   209
gint
renatofilho@750
   210
gmyth_scheduler_get_schedule_list(GMythScheduler * scheduler,
renatofilho@754
   211
                                  GList ** schedule_list)
leo_sobral@1
   212
{
renatofilho@754
   213
    ScheduleInfo   *schedule;
renatofilho@754
   214
    MYSQL_RES      *msql_res;
renatofilho@754
   215
    GString        *query_str = g_string_new("");
renatofilho@754
   216
    gchar          *date_time = NULL;
rosfran@698
   217
renatofilho@754
   218
    assert(scheduler);
rosfran@698
   219
renatofilho@754
   220
    g_string_printf(query_str,
renatofilho@754
   221
                    "SELECT recordid,programid,chanid,starttime,startdate,"
renatofilho@754
   222
                    "endtime,enddate,title,subtitle,description,category FROM record;");
leo_sobral@1
   223
renatofilho@754
   224
    if (scheduler->msqlquery == NULL) {
renatofilho@754
   225
        g_warning("[%s] Scheduler db connection not initialized",
renatofilho@754
   226
                  __FUNCTION__);
renatofilho@754
   227
        return -1;
renatofilho@754
   228
    }
renatofilho@754
   229
    msql_res =
renatofilho@754
   230
        gmyth_query_process_statement(scheduler->msqlquery,
renatofilho@754
   231
                                      query_str->str);
leo_sobral@1
   232
renatofilho@754
   233
    if (msql_res == NULL) {
renatofilho@754
   234
        g_warning("DB retrieval of schedule list failed");
renatofilho@754
   235
        return -1;
renatofilho@754
   236
    } else {
renatofilho@754
   237
        MYSQL_ROW       row;
rosfran@698
   238
renatofilho@754
   239
        *schedule_list = NULL;
rosfran@698
   240
renatofilho@754
   241
        while ((row = mysql_fetch_row(msql_res)) != NULL) {
renatofilho@754
   242
            schedule = g_new0(ScheduleInfo, 1);
rosfran@698
   243
renatofilho@754
   244
            schedule->schedule_id =
renatofilho@754
   245
                (guint) g_ascii_strtoull(row[0], NULL, 10);
renatofilho@754
   246
            schedule->program_id =
renatofilho@754
   247
                (guint) g_ascii_strtoull(row[1], NULL, 10);
renatofilho@754
   248
            schedule->channel_id =
renatofilho@754
   249
                (guint) g_ascii_strtoull(row[2], NULL, 10);
rosfran@698
   250
renatofilho@754
   251
            /*
renatofilho@754
   252
             * generate a time_t from a time and a date db field 
renatofilho@754
   253
             */
renatofilho@754
   254
            date_time = g_strdup_printf("%sT%s", row[4], row[3]);
renatofilho@754
   255
            schedule->start_time =
renatofilho@754
   256
                gmyth_util_string_to_time_val(date_time);
renatofilho@754
   257
            g_free(date_time);
rosfran@698
   258
renatofilho@754
   259
            /*
renatofilho@754
   260
             * generate a time_t from a time and a date db field 
renatofilho@754
   261
             */
renatofilho@754
   262
            date_time = g_strdup_printf("%sT%s", row[6], row[5]);
renatofilho@754
   263
            schedule->end_time = gmyth_util_string_to_time_val(date_time);
renatofilho@754
   264
            g_free(date_time);
leo_sobral@1
   265
renatofilho@754
   266
            schedule->title = g_string_new(row[7]);
renatofilho@754
   267
            schedule->subtitle = g_string_new(row[8]);
renatofilho@754
   268
            schedule->description = g_string_new(row[9]);
renatofilho@754
   269
            schedule->category = g_string_new(row[10]);
leo_sobral@1
   270
renatofilho@754
   271
            (*schedule_list) = g_list_append(*(schedule_list), schedule);
renatofilho@754
   272
        }
renatofilho@754
   273
    }
leo_sobral@1
   274
renatofilho@754
   275
    mysql_free_result(msql_res);
renatofilho@754
   276
    g_string_free(query_str, TRUE);
leo_sobral@1
   277
renatofilho@754
   278
    return (*schedule_list == NULL) ? 0 : g_list_length(*schedule_list);
leo_sobral@1
   279
}
leo_sobral@1
   280
leo_sobral@1
   281
/** Retrieves from the backend Mysql database the list of recorded programs.
leo_sobral@1
   282
 * 
leo_sobral@1
   283
 * @param scheduler The GMythScheduler instance.
leo_sobral@1
   284
 * @param recorded_list the GList pointer to be filled with the loaded RecordInfo items.
leo_sobral@1
   285
 * @return The amount of recorded retrieved from database, or -1 if error.
leo_sobral@1
   286
 */
leo_sobral@1
   287
gint
renatofilho@750
   288
gmyth_scheduler_get_recorded_list(GMythScheduler * scheduler,
renatofilho@754
   289
                                  GList ** recorded_list)
leo_sobral@1
   290
{
renatofilho@754
   291
    RecordedInfo   *record;
renatofilho@754
   292
    MYSQL_RES      *msql_res;
renatofilho@754
   293
    GString        *query_str = g_string_new("");
rosfran@698
   294
renatofilho@754
   295
    assert(scheduler);
rosfran@698
   296
renatofilho@754
   297
    g_string_printf(query_str,
renatofilho@754
   298
                    "SELECT recordid,programid,chanid,starttime,progstart,"
renatofilho@754
   299
                    "endtime,progend,title,subtitle,description,category,"
renatofilho@754
   300
                    "filesize,basename FROM recorded WHERE recgroup != 'LiveTV'");
leo_sobral@1
   301
renatofilho@754
   302
    if (scheduler->msqlquery == NULL) {
renatofilho@754
   303
        g_warning("[%s] Scheduler db connection not initialized",
renatofilho@754
   304
                  __FUNCTION__);
renatofilho@754
   305
        return -1;
renatofilho@754
   306
    }
leo_sobral@1
   307
renatofilho@754
   308
    msql_res =
renatofilho@754
   309
        gmyth_query_process_statement(scheduler->msqlquery,
renatofilho@754
   310
                                      query_str->str);
leo_sobral@1
   311
renatofilho@754
   312
    if (msql_res == NULL) {
renatofilho@754
   313
        g_warning("DB retrieval of recording list failed");
renatofilho@754
   314
        return -1;
renatofilho@754
   315
    } else {
renatofilho@754
   316
        MYSQL_ROW       row;
rosfran@698
   317
renatofilho@754
   318
        (*recorded_list) = NULL;
rosfran@698
   319
renatofilho@754
   320
        while ((row = mysql_fetch_row(msql_res)) != NULL) {
renatofilho@754
   321
            record = g_new0(RecordedInfo, 1);
rosfran@698
   322
renatofilho@754
   323
            record->record_id = (guint) g_ascii_strtoull(row[0], NULL, 10);
renatofilho@754
   324
            record->program_id =
renatofilho@754
   325
                (guint) g_ascii_strtoull(row[1], NULL, 10);
renatofilho@754
   326
            record->channel_id =
renatofilho@754
   327
                (guint) g_ascii_strtoull(row[2], NULL, 10);
rosfran@698
   328
renatofilho@754
   329
            record->start_time = gmyth_util_string_to_time_val(row[3]);
renatofilho@754
   330
            record->end_time = gmyth_util_string_to_time_val(row[5]);
rosfran@698
   331
renatofilho@754
   332
            record->title = g_string_new(row[7]);
renatofilho@754
   333
            record->subtitle = g_string_new(row[8]);
renatofilho@754
   334
            record->description = g_string_new(row[9]);
renatofilho@754
   335
            record->category = g_string_new(row[10]);
renatofilho@754
   336
            record->filesize = g_ascii_strtoull(row[11], NULL, 10);
renatofilho@754
   337
            record->basename = g_string_new(row[12]);
leo_sobral@1
   338
renatofilho@754
   339
            (*recorded_list) = g_list_append((*recorded_list), record);
renatofilho@754
   340
        }
renatofilho@754
   341
    }
rosfran@698
   342
renatofilho@754
   343
    mysql_free_result(msql_res);
renatofilho@754
   344
    g_string_free(query_str, TRUE);
leo_sobral@1
   345
renatofilho@754
   346
    return (*recorded_list == NULL) ? 0 : g_list_length(*recorded_list);
leo_sobral@1
   347
}
leo_sobral@1
   348
renatofilho@771
   349
RecordedInfo*
renatofilho@755
   350
gmyth_scheduler_get_recorded_info (GMythScheduler *scheduler,
renatofilho@771
   351
                                   const gchar* basename)
renatofilho@755
   352
{
renatofilho@769
   353
    RecordedInfo   *record = NULL;
renatofilho@755
   354
    MYSQL_RES      *msql_res;
renatofilho@755
   355
    GString        *query_str = g_string_new("");
renatofilho@755
   356
renatofilho@755
   357
    assert(scheduler);
renatofilho@755
   358
renatofilho@755
   359
    g_string_printf(query_str,
renatofilho@755
   360
                    "SELECT recordid,programid,chanid,starttime,progstart,"
renatofilho@755
   361
                    "endtime,progend,title,subtitle,description,category,"
renatofilho@755
   362
                    "filesize,basename FROM recorded "
renatofilho@771
   363
                    "WHERE recgroup != 'LiveTV' AND basename = '%s'", basename);
renatofilho@755
   364
renatofilho@755
   365
    if (scheduler->msqlquery == NULL) {
renatofilho@755
   366
        g_warning("[%s] Scheduler db connection not initialized", 
renatofilho@755
   367
                        __FUNCTION__);
renatofilho@769
   368
        return NULL;
renatofilho@755
   369
    }
renatofilho@755
   370
renatofilho@755
   371
    msql_res =
renatofilho@755
   372
        gmyth_query_process_statement(scheduler->msqlquery,
renatofilho@755
   373
                                      query_str->str);
renatofilho@755
   374
renatofilho@755
   375
    if (msql_res == NULL) {
renatofilho@755
   376
        g_warning("DB retrieval of recording list failed");
renatofilho@769
   377
        return NULL;
renatofilho@755
   378
    } else {
renatofilho@755
   379
        MYSQL_ROW       row;
renatofilho@755
   380
        row = mysql_fetch_row(msql_res);
renatofilho@755
   381
        if (row != NULL) {
renatofilho@755
   382
            record = g_new0(RecordedInfo, 1);
renatofilho@755
   383
            record->record_id = (guint) g_ascii_strtoull(row[0], NULL, 10);
renatofilho@755
   384
            record->program_id = (guint) g_ascii_strtoull(row[1], NULL, 10);
renatofilho@755
   385
            record->channel_id = (guint) g_ascii_strtoull(row[2], NULL, 10);
renatofilho@755
   386
            record->start_time = gmyth_util_string_to_time_val(row[3]);
renatofilho@755
   387
            record->end_time = gmyth_util_string_to_time_val(row[5]);
renatofilho@755
   388
            record->title = g_string_new(row[7]);
renatofilho@755
   389
            record->subtitle = g_string_new(row[8]);
renatofilho@755
   390
            record->description = g_string_new(row[9]);
renatofilho@755
   391
            record->category = g_string_new(row[10]);
renatofilho@755
   392
            record->filesize = g_ascii_strtoull(row[11], NULL, 10);
renatofilho@755
   393
            record->basename = g_string_new(row[12]);
renatofilho@755
   394
        }
renatofilho@755
   395
    }
renatofilho@755
   396
renatofilho@755
   397
    mysql_free_result(msql_res);
renatofilho@755
   398
    g_string_free(query_str, TRUE);
renatofilho@755
   399
renatofilho@755
   400
    return record;
renatofilho@755
   401
}
renatofilho@755
   402
renatofilho@755
   403
melunko@567
   404
static void
renatofilho@754
   405
_set_value(GMythQuery * myth_query, char *field, gchar * value,
renatofilho@754
   406
           gint rec_id)
melunko@567
   407
{
renatofilho@754
   408
    gchar          *query =
renatofilho@754
   409
        g_strdup_printf
renatofilho@754
   410
        ("UPDATE record SET recordid = %d, %s = \"%s\" WHERE recordid = %d;",
renatofilho@754
   411
         rec_id, field, value, rec_id);
melunko@567
   412
renatofilho@754
   413
    gmyth_query_process_statement(myth_query, query);
renatofilho@754
   414
    g_free(query);
melunko@567
   415
}
melunko@567
   416
melunko@567
   417
static void
renatofilho@754
   418
_set_int_value(GMythQuery * myth_query, char *field, gint value,
renatofilho@754
   419
               gint rec_id)
melunko@567
   420
{
renatofilho@754
   421
    gchar          *str_value = g_strdup_printf("%d", value);
rosfran@698
   422
renatofilho@754
   423
    _set_value(myth_query, field, str_value, rec_id);
renatofilho@754
   424
    g_free(str_value);
melunko@567
   425
}
melunko@567
   426
leo_sobral@1
   427
gboolean
melunko@801
   428
gmyth_scheduler_add_schedule_full (GMythScheduler * scheduler,
melunko@801
   429
                             ScheduleInfo * schedule_info, GMythScheduleType type)
leo_sobral@1
   430
{
renatofilho@754
   431
    MYSQL_RES      *msql_res;
renatofilho@754
   432
    gchar          *query_str = "INSERT record (recordid) VALUE (0);";
renatofilho@754
   433
    gchar          *station = NULL;
renatofilho@754
   434
    gulong          rec_id;
rosfran@698
   435
renatofilho@754
   436
    assert(scheduler);
rosfran@698
   437
renatofilho@754
   438
    if (scheduler->msqlquery == NULL) {
renatofilho@754
   439
        g_warning("[%s] Scheduler db connection not initialized",
renatofilho@754
   440
                  __FUNCTION__);
renatofilho@754
   441
        return FALSE;
renatofilho@754
   442
    }
melunko@567
   443
renatofilho@754
   444
    msql_res =
renatofilho@754
   445
        gmyth_query_process_statement_with_increment(scheduler->msqlquery,
renatofilho@754
   446
                                                     query_str, &rec_id);
renatofilho@754
   447
    mysql_free_result(msql_res);
rosfran@698
   448
renatofilho@754
   449
    // Retrieves the station info
renatofilho@754
   450
    query_str =
renatofilho@754
   451
        g_strdup_printf
renatofilho@754
   452
        ("SELECT callsign FROM channel WHERE chanid = \"%d\";",
renatofilho@754
   453
         schedule_info->channel_id);
renatofilho@754
   454
    msql_res =
renatofilho@754
   455
        gmyth_query_process_statement(scheduler->msqlquery, query_str);
renatofilho@754
   456
    if (msql_res == NULL) {
renatofilho@754
   457
        g_warning("[%s] msql query returned NULL MYSQL_RES", __FUNCTION__);
renatofilho@754
   458
        return FALSE;
renatofilho@754
   459
    } else {
renatofilho@754
   460
        MYSQL_ROW       row;
rosfran@698
   461
renatofilho@754
   462
        if ((row = mysql_fetch_row(msql_res)) != NULL) {
renatofilho@754
   463
            station = g_strdup(row[0]);
renatofilho@754
   464
        }
renatofilho@754
   465
    }
renatofilho@754
   466
    mysql_free_result(msql_res);
renatofilho@754
   467
    g_free(query_str);
leo_sobral@1
   468
renatofilho@754
   469
    // _set_value (field, value, id);
renatofilho@754
   470
    _set_int_value(scheduler->msqlquery, "chanid",
renatofilho@754
   471
                   schedule_info->channel_id, rec_id);
renatofilho@754
   472
    _set_value(scheduler->msqlquery, "station", station, rec_id);
renatofilho@754
   473
    _set_value(scheduler->msqlquery, "title", schedule_info->title->str,
renatofilho@754
   474
               rec_id);
renatofilho@754
   475
    // / subtitle, description 
renatofilho@754
   476
    _set_value(scheduler->msqlquery, "starttime",
renatofilho@754
   477
               gmyth_util_time_to_string_only_time(schedule_info->
renatofilho@754
   478
                                                   start_time), rec_id);
renatofilho@754
   479
    _set_value(scheduler->msqlquery, "startdate",
renatofilho@754
   480
               gmyth_util_time_to_string_only_date(schedule_info->
renatofilho@754
   481
                                                   start_time), rec_id);
renatofilho@754
   482
    _set_value(scheduler->msqlquery, "endtime",
renatofilho@754
   483
               gmyth_util_time_to_string_only_time(schedule_info->
renatofilho@754
   484
                                                   end_time), rec_id);
renatofilho@754
   485
    _set_value(scheduler->msqlquery, "enddate",
renatofilho@754
   486
               gmyth_util_time_to_string_only_date(schedule_info->
renatofilho@754
   487
                                                   end_time), rec_id);
renatofilho@754
   488
    // / category, series id, program id
renatofilho@754
   489
    // _set_value (scheduler->msqlquery, "findday",
renatofilho@754
   490
    // (gmyth_util_time_val_to_date( schedule_info->start_time
renatofilho@754
   491
    // ))->tm_wday, rec_id);
renatofilho@754
   492
    // _set_value (scheduler->msqlquery, "findtime",
renatofilho@754
   493
    // gmyth_util_time_to_string_only_time( schedule_info->start_time),
renatofilho@754
   494
    // rec_id);
renatofilho@754
   495
    // _set_int_value (scheduler->msqlquery, "findid",
renatofilho@754
   496
    // (gint)(schedule_info->start_time->tv_sec/60/60/24 + 719528),
renatofilho@754
   497
    // rec_id);
melunko@801
   498
renatofilho@754
   499
    _set_value(scheduler->msqlquery, "parentid", "0", rec_id);
renatofilho@754
   500
    _set_value(scheduler->msqlquery, "search", "0", rec_id);
melunko@801
   501
melunko@801
   502
    if (type == GMYTH_SCHEDULE_ALL_OCCURRENCES) {
melunko@801
   503
        _set_value(scheduler->msqlquery, "type", "4", rec_id);
melunko@801
   504
    } else {
melunko@801
   505
        _set_value(scheduler->msqlquery, "type", "1", rec_id);
melunko@801
   506
    }
melunko@801
   507
renatofilho@754
   508
    _set_value(scheduler->msqlquery, "recpriority", "0", rec_id);
renatofilho@754
   509
    _set_value(scheduler->msqlquery, "startoffset", "0", rec_id);
renatofilho@754
   510
    _set_value(scheduler->msqlquery, "endoffset", "0", rec_id);
renatofilho@754
   511
    _set_value(scheduler->msqlquery, "dupmethod", "6", rec_id); // ?
renatofilho@754
   512
    _set_value(scheduler->msqlquery, "dupin", "15", rec_id);    // ?
melunko@567
   513
renatofilho@754
   514
    _set_value(scheduler->msqlquery, "prefinput", "0", rec_id);
renatofilho@754
   515
    _set_value(scheduler->msqlquery, "inactive", "0", rec_id);
renatofilho@754
   516
    _set_value(scheduler->msqlquery, "profile", "Default", rec_id);
renatofilho@754
   517
    _set_value(scheduler->msqlquery, "recgroup", "Default", rec_id);
renatofilho@754
   518
    _set_value(scheduler->msqlquery, "storagegroup", "Default", rec_id);
renatofilho@754
   519
    _set_value(scheduler->msqlquery, "playgroup", "Default", rec_id);
renatofilho@754
   520
    _set_value(scheduler->msqlquery, "autoexpire", "1", rec_id);
renatofilho@754
   521
    _set_value(scheduler->msqlquery, "maxepisodes", "0", rec_id);
renatofilho@754
   522
    _set_value(scheduler->msqlquery, "maxnewest", "0", rec_id);
renatofilho@754
   523
    _set_value(scheduler->msqlquery, "autocommflag", "1", rec_id);
renatofilho@754
   524
    _set_value(scheduler->msqlquery, "autotranscode", "0", rec_id);
renatofilho@754
   525
    _set_value(scheduler->msqlquery, "transcoder", "0", rec_id);
melunko@567
   526
renatofilho@754
   527
    _set_value(scheduler->msqlquery, "autouserjob1", "0", rec_id);
renatofilho@754
   528
    _set_value(scheduler->msqlquery, "autouserjob2", "0", rec_id);
renatofilho@754
   529
    _set_value(scheduler->msqlquery, "autouserjob3", "0", rec_id);
renatofilho@754
   530
    _set_value(scheduler->msqlquery, "autouserjob4", "0", rec_id);
melunko@567
   531
renatofilho@754
   532
    schedule_info->schedule_id = rec_id;
melunko@581
   533
renatofilho@754
   534
    /*
renatofilho@754
   535
     * Notify the backend of changes 
renatofilho@754
   536
     */
renatofilho@754
   537
    return update_backend(scheduler, rec_id);
leo_sobral@1
   538
}
leo_sobral@1
   539
melunko@801
   540
/** Requests the Mysql database in the backend to add a new schedule.
melunko@801
   541
 * 
melunko@801
   542
 * @param scheduler the GMythScheduler instance.
melunko@801
   543
 * @param schedule_info the ScheduleInfo with recording schedule information
melunko@801
   544
 * to be added. record_id = -1 to add a new schedule, otherwise this
melunko@801
   545
 * function will update the schedule in the db
melunko@801
   546
 * @return gboolean returns FALSE if some error occurs, TRUE otherwise
melunko@801
   547
 */
melunko@801
   548
gboolean
melunko@801
   549
gmyth_scheduler_add_schedule (GMythScheduler * scheduler,
melunko@801
   550
                             ScheduleInfo * schedule_info)
melunko@801
   551
{
melunko@801
   552
    return gmyth_scheduler_add_schedule_full (scheduler, schedule_info, 
melunko@801
   553
                                              GMYTH_SCHEDULE_ONE_OCCURRENCE);
melunko@801
   554
}
melunko@801
   555
leo_sobral@1
   556
/** Requests the Mysql database in the backend to remove an existing schedule.
leo_sobral@1
   557
 * 
leo_sobral@1
   558
 * @param scheduler the GMythScheduler instance.
leo_sobral@1
   559
 * @param record_id The schedule's record id to be removed
leo_sobral@1
   560
 * @return gboolean TRUE if success, FALSE if error
leo_sobral@1
   561
 */
leo_sobral@1
   562
gboolean
renatofilho@750
   563
gmyth_scheduler_delete_schedule(GMythScheduler * scheduler, gint record_id)
leo_sobral@1
   564
{
leo_sobral@1
   565
renatofilho@754
   566
    MYSQL_RES      *msql_res;
renatofilho@754
   567
    GString        *query_str = g_string_new("");
leo_sobral@1
   568
renatofilho@754
   569
    assert(scheduler);
rosfran@698
   570
renatofilho@754
   571
    if (scheduler->msqlquery == NULL) {
renatofilho@754
   572
        g_warning("[%s] Scheduler db connection not initialized",
renatofilho@754
   573
                  __FUNCTION__);
renatofilho@754
   574
        return FALSE;
renatofilho@754
   575
    }
renatofilho@754
   576
    // ========================================
renatofilho@754
   577
    g_string_printf(query_str,
renatofilho@754
   578
                    "DELETE FROM record WHERE recordid=%d", record_id);
leo_sobral@1
   579
renatofilho@754
   580
    msql_res =
renatofilho@754
   581
        gmyth_query_process_statement(scheduler->msqlquery,
renatofilho@754
   582
                                      query_str->str);
leo_sobral@1
   583
leo_sobral@1
   584
renatofilho@754
   585
    mysql_free_result(msql_res);
renatofilho@754
   586
    g_string_free(query_str, TRUE);
rosfran@698
   587
renatofilho@754
   588
    // Notify the backend of the changes
renatofilho@754
   589
    return update_backend(scheduler, record_id);
leo_sobral@1
   590
}
leo_sobral@1
   591
leo_sobral@1
   592
/** Requests the Mysql database in the backend to remove an existing recorded item.
leo_sobral@1
   593
 * 
leo_sobral@1
   594
 * @param scheduler the GMythScheduler instance.
leo_sobral@1
   595
 * @param record_id The recorded item id to be removed
leo_sobral@1
   596
 * @return gboolean TRUE if success, FALSE if error
leo_sobral@1
   597
 */
leo_sobral@1
   598
gboolean
renatofilho@750
   599
gmyth_scheduler_delete_recorded(GMythScheduler * scheduler, gint record_id)
leo_sobral@1
   600
{
leo_sobral@1
   601
renatofilho@754
   602
    MYSQL_RES      *msql_res;
melunko@117
   603
renatofilho@754
   604
    GString        *query_str = g_string_new("");
leo_sobral@1
   605
renatofilho@754
   606
    assert(scheduler);
rosfran@698
   607
renatofilho@754
   608
    if (scheduler->msqlquery == NULL) {
renatofilho@754
   609
        g_warning("[%s] Scheduler db connection not initialized",
renatofilho@754
   610
                  __FUNCTION__);
renatofilho@754
   611
        return FALSE;
renatofilho@754
   612
    }
renatofilho@754
   613
    // ========================================
renatofilho@754
   614
    g_string_printf(query_str,
renatofilho@754
   615
                    "DELETE FROM recorded WHERE recordid=%d", record_id);
leo_sobral@1
   616
renatofilho@754
   617
    // FIXME: Mythtv implementation runs also: DELETE FROM oldfind WHERE
renatofilho@754
   618
    // recordid = x
melunko@526
   619
renatofilho@754
   620
    msql_res =
renatofilho@754
   621
        gmyth_query_process_statement(scheduler->msqlquery,
renatofilho@754
   622
                                      query_str->str);
rosfran@698
   623
renatofilho@754
   624
    mysql_free_result(msql_res);
renatofilho@754
   625
    g_string_free(query_str, TRUE);
rosfran@698
   626
renatofilho@754
   627
    // Notify the backend of the changes
renatofilho@754
   628
    return update_backend(scheduler, record_id);
leo_sobral@1
   629
}
leo_sobral@1
   630
leo_sobral@1
   631
/** Retrieves an existing recorded item information from database. The information
leo_sobral@1
   632
 * is used to fill the returned GMythProgramInfo.
leo_sobral@1
   633
 * 
leo_sobral@1
   634
 * @param scheduler The GMythScheduler instance.
leo_sobral@1
   635
 * @param channel The channel associated to the record
leo_sobral@1
   636
 * @param starttime The record start time
leo_sobral@1
   637
 * @return A GMythProgramInfo struct with the requested record item
leo_sobral@1
   638
 * information, or NULL if error.
leo_sobral@1
   639
 */
rosfran@698
   640
GMythProgramInfo *
renatofilho@750
   641
gmyth_scheduler_get_recorded(GMythScheduler * scheduler,
renatofilho@754
   642
                             GString * channel, GTimeVal * starttime)
leo_sobral@1
   643
{
renatofilho@754
   644
    MYSQL_RES      *msql_res;
renatofilho@754
   645
    GMythProgramInfo *proginfo = NULL;
renatofilho@754
   646
    GString        *query_str = g_string_new("");
renatofilho@754
   647
    gchar          *time_str =
renatofilho@754
   648
        gmyth_util_time_to_string_from_time_val(starttime);
leo_sobral@1
   649
renatofilho@754
   650
    assert(scheduler);
melunko@412
   651
renatofilho@754
   652
    gmyth_debug("[%s] channel: %s", __FUNCTION__, channel->str);
rosfran@698
   653
renatofilho@754
   654
    if (scheduler->msqlquery == NULL) {
renatofilho@754
   655
        g_warning("[%s] Scheduler db connection not initialized",
renatofilho@754
   656
                  __FUNCTION__);
renatofilho@754
   657
        return NULL;
renatofilho@754
   658
    }
leo_sobral@1
   659
renatofilho@754
   660
    g_string_printf(query_str,
renatofilho@754
   661
                    "SELECT recorded.chanid,starttime,endtime,title, "
renatofilho@754
   662
                    "subtitle,description,channel.channum, "
renatofilho@754
   663
                    "channel.callsign,channel.name,channel.commfree, "
renatofilho@754
   664
                    "channel.outputfilters,seriesid,programid,filesize, "
renatofilho@754
   665
                    "lastmodified,stars,previouslyshown,originalairdate, "
renatofilho@754
   666
                    "hostname,recordid,transcoder,playgroup, "
renatofilho@754
   667
                    "recorded.recpriority,progstart,progend,basename,recgroup "
renatofilho@754
   668
                    "FROM recorded " "LEFT JOIN channel "
renatofilho@754
   669
                    "ON recorded.chanid = channel.chanid "
renatofilho@754
   670
                    "WHERE recorded.chanid = \"%s\" "
renatofilho@754
   671
                    "AND starttime = \"%s\" ;", channel->str, time_str);
leo_sobral@1
   672
renatofilho@754
   673
    msql_res =
renatofilho@754
   674
        gmyth_query_process_statement(scheduler->msqlquery,
renatofilho@754
   675
                                      query_str->str);
leo_sobral@1
   676
renatofilho@754
   677
    if (msql_res /* && query.size() > 0 */ ) {
renatofilho@754
   678
        MYSQL_ROW       msql_row = mysql_fetch_row(msql_res);
rosfran@698
   679
renatofilho@754
   680
        if (msql_row) {
renatofilho@754
   681
            proginfo = gmyth_program_info_new();
leo_sobral@1
   682
renatofilho@754
   683
            proginfo->chanid = g_string_new(msql_row[0]);
renatofilho@754
   684
            proginfo->startts =
renatofilho@754
   685
                gmyth_util_string_to_time_val(msql_row[23]);
renatofilho@754
   686
            proginfo->endts = gmyth_util_string_to_time_val(msql_row[24]);
renatofilho@754
   687
            proginfo->recstartts =
renatofilho@754
   688
                gmyth_util_string_to_time_val(msql_row[1]);
renatofilho@754
   689
            proginfo->recendts =
renatofilho@754
   690
                gmyth_util_string_to_time_val(msql_row[2]);
renatofilho@754
   691
            proginfo->title = g_string_new(msql_row[3]);
renatofilho@754
   692
            proginfo->subtitle = g_string_new(msql_row[4]);
renatofilho@754
   693
            proginfo->description = g_string_new(msql_row[5]);
leo_sobral@390
   694
renatofilho@754
   695
            proginfo->chanstr = g_string_new(msql_row[6]);
renatofilho@754
   696
            proginfo->chansign = g_string_new(msql_row[7]);
renatofilho@754
   697
            proginfo->channame = g_string_new(msql_row[0]);
renatofilho@754
   698
            proginfo->chancommfree =
renatofilho@754
   699
                (gint) g_ascii_strtoull(msql_row[9], NULL, 10);
renatofilho@754
   700
            proginfo->chanOutputFilters = g_string_new(msql_row[10]);
renatofilho@754
   701
            proginfo->seriesid = g_string_new(msql_row[11]);
renatofilho@754
   702
            proginfo->programid = g_string_new(msql_row[12]);
renatofilho@754
   703
            proginfo->filesize = g_ascii_strtoull(msql_row[13], NULL, 10);
leo_sobral@1
   704
renatofilho@754
   705
            proginfo->lastmodified =
renatofilho@754
   706
                gmyth_util_string_to_time_val(msql_row[14]);
renatofilho@754
   707
            proginfo->stars = g_ascii_strtod(msql_row[15], NULL);
renatofilho@754
   708
            proginfo->repeat =
renatofilho@754
   709
                (gint) g_ascii_strtoull(msql_row[16], NULL, 10);
leo_sobral@390
   710
renatofilho@754
   711
            if (msql_row[17] == NULL) {
renatofilho@754
   712
                proginfo->originalAirDate = 0;
renatofilho@754
   713
                proginfo->hasAirDate = FALSE;
renatofilho@754
   714
            } else {
renatofilho@754
   715
                proginfo->originalAirDate =
renatofilho@754
   716
                    gmyth_util_string_to_time_val(msql_row[17]);
renatofilho@754
   717
                proginfo->hasAirDate = TRUE;
renatofilho@754
   718
            }
leo_sobral@390
   719
renatofilho@754
   720
            proginfo->hostname = g_string_new(msql_row[18]);
renatofilho@754
   721
            proginfo->recordid =
renatofilho@754
   722
                (gint) g_ascii_strtoull(msql_row[19], NULL, 10);
renatofilho@754
   723
            proginfo->transcoder =
renatofilho@754
   724
                (gint) g_ascii_strtoull(msql_row[20], NULL, 10);
renatofilho@754
   725
            // proginfo->spread = -1;
renatofilho@754
   726
            // proginfo->programflags = proginfo->getProgramFlags();
leo_sobral@391
   727
renatofilho@754
   728
            proginfo->recgroup = g_string_new(msql_row[26]);
renatofilho@754
   729
            proginfo->playgroup = g_string_new(msql_row[21]);
renatofilho@754
   730
            proginfo->recpriority =
renatofilho@754
   731
                (gint) g_ascii_strtoull(msql_row[22], NULL, 10);
leo_sobral@391
   732
renatofilho@754
   733
            proginfo->pathname = g_string_new(g_strdup(msql_row[25]));
leo_sobral@391
   734
renatofilho@754
   735
            gmyth_debug("One program info loaded from mysql database\n");
renatofilho@754
   736
        }
renatofilho@754
   737
    }
leo_sobral@1
   738
renatofilho@754
   739
    mysql_free_result(msql_res);
renatofilho@754
   740
    g_string_free(query_str, TRUE);
renatofilho@754
   741
    g_free(time_str);
leo_sobral@1
   742
renatofilho@754
   743
    return proginfo;
leo_sobral@1
   744
}
leo_sobral@1
   745
leo_sobral@1
   746
/** Notifies the backend of an update in the db.
leo_sobral@1
   747
 * 
leo_sobral@1
   748
 * @param record_id the id of the modified recording.
leo_sobral@1
   749
 */
renatofilho@769
   750
// fixme: put void and discovery record_id inside
renatofilho@769
   751
static gboolean
renatofilho@769
   752
update_backend (GMythScheduler * scheduler, 
renatofilho@769
   753
                gint record_id)  
leo_sobral@1
   754
{
renatofilho@754
   755
    GMythSocket    *socket;
renatofilho@754
   756
    GMythStringList *strlist = gmyth_string_list_new();
renatofilho@754
   757
    GString        *datastr = g_string_new("RESCHEDULE_RECORDINGS ");
renatofilho@754
   758
    gboolean        ret = FALSE;
leo_sobral@1
   759
renatofilho@754
   760
    g_string_append_printf(datastr, "%d", record_id);
renatofilho@754
   761
    gmyth_string_list_append_string(strlist, datastr);
leo_sobral@1
   762
renatofilho@769
   763
    socket = gmyth_backend_info_get_connected_socket (scheduler->backend_info);
renatofilho@769
   764
    if (socket != NULL) { 
renatofilho@754
   765
        ret = (gmyth_socket_sendreceive_stringlist(socket, strlist) > 0);
renatofilho@769
   766
        g_object_unref (socket);
renatofilho@754
   767
    } else {
renatofilho@754
   768
        g_warning("[%s] Connection to backend failed!", __FUNCTION__);
renatofilho@754
   769
    }
rosfran@698
   770
renatofilho@754
   771
    g_string_free(datastr, TRUE);
renatofilho@754
   772
    g_object_unref(strlist);
renatofilho@754
   773
    return ret;
leo_sobral@1
   774
}
renatofilho@129
   775
renatofilho@129
   776
void
renatofilho@750
   777
gmyth_scheduler_recorded_info_get_preview(RecordedInfo * info,
renatofilho@754
   778
                                          GByteArray * data)
renatofilho@129
   779
{
renatofilho@129
   780
}
renatofilho@129
   781
renatofilho@129
   782
void
renatofilho@750
   783
gmyth_recorded_info_free(RecordedInfo * info)
renatofilho@129
   784
{
renatofilho@754
   785
    if (info->title != NULL)
renatofilho@754
   786
        g_string_free(info->title, TRUE);
renatofilho@129
   787
renatofilho@754
   788
    if (info->subtitle != NULL)
renatofilho@754
   789
        g_string_free(info->subtitle, TRUE);
renatofilho@129
   790
renatofilho@754
   791
    if (info->description != NULL)
renatofilho@754
   792
        g_string_free(info->description, TRUE);
renatofilho@129
   793
renatofilho@754
   794
    if (info->category != NULL)
renatofilho@754
   795
        g_string_free(info->category, TRUE);
renatofilho@129
   796
renatofilho@754
   797
    if (info->basename != NULL)
renatofilho@754
   798
        g_string_free(info->basename, TRUE);
renatofilho@129
   799
renatofilho@754
   800
    if (info != NULL)
renatofilho@754
   801
        g_free(info->start_time);
leo_sobral@387
   802
renatofilho@754
   803
    if (info != NULL)
renatofilho@754
   804
        g_free(info->end_time);
leo_sobral@387
   805
renatofilho@754
   806
    g_free(info);
renatofilho@129
   807
}
renatofilho@129
   808
melunko@591
   809
static void
renatofilho@750
   810
free_recorded_info_item(gpointer data, gpointer user_data)
melunko@591
   811
{
renatofilho@754
   812
    RecordedInfo   *info = (RecordedInfo *) data;
melunko@591
   813
renatofilho@754
   814
    gmyth_recorded_info_free(info);
melunko@591
   815
}
melunko@591
   816
renatofilho@129
   817
void
renatofilho@750
   818
gmyth_recorded_info_list_free(GList * list)
renatofilho@129
   819
{
renatofilho@754
   820
    g_return_if_fail(list != NULL);
melunko@591
   821
renatofilho@754
   822
    g_list_foreach(list, free_recorded_info_item, NULL);
renatofilho@754
   823
    g_list_free(list);
melunko@591
   824
}
melunko@591
   825
melunko@591
   826
void
renatofilho@750
   827
gmyth_schedule_info_free(ScheduleInfo * info)
melunko@591
   828
{
melunko@591
   829
renatofilho@754
   830
    g_return_if_fail(info != NULL);
melunko@591
   831
renatofilho@754
   832
    if (info->title != NULL)
renatofilho@754
   833
        g_string_free(info->title, TRUE);
renatofilho@129
   834
renatofilho@754
   835
    if (info->subtitle != NULL)
renatofilho@754
   836
        g_string_free(info->subtitle, TRUE);
renatofilho@129
   837
renatofilho@754
   838
    if (info->description != NULL)
renatofilho@754
   839
        g_string_free(info->description, TRUE);
renatofilho@129
   840
renatofilho@754
   841
    if (info->category != NULL)
renatofilho@754
   842
        g_string_free(info->category, TRUE);
renatofilho@129
   843
renatofilho@754
   844
    if (info != NULL)
renatofilho@754
   845
        g_free(info->start_time);
leo_sobral@387
   846
renatofilho@754
   847
    if (info != NULL)
renatofilho@754
   848
        g_free(info->end_time);
leo_sobral@387
   849
renatofilho@754
   850
    g_free(info);
renatofilho@129
   851
}
renatofilho@129
   852
melunko@591
   853
static void
renatofilho@750
   854
free_schedule_info_item(gpointer data, gpointer user_data)
melunko@591
   855
{
renatofilho@754
   856
    ScheduleInfo   *info = (ScheduleInfo *) data;
melunko@591
   857
renatofilho@754
   858
    gmyth_schedule_info_free(info);
melunko@591
   859
}
melunko@591
   860
melunko@591
   861
void
renatofilho@750
   862
gmyth_schedule_info_list_free(GList * list)
melunko@591
   863
{
renatofilho@754
   864
    g_return_if_fail(list != NULL);
melunko@591
   865
renatofilho@754
   866
    g_list_foreach(list, free_schedule_info_item, NULL);
renatofilho@754
   867
    g_list_free(list);
melunko@591
   868
}