# HG changeset patch
# User melunko
# Date 1204544029 0
# Node ID 067904b6921f750c085c2d1ec0f2d15be3f1a40f
# Parent  608cb47819c6c35fc2f96370f336261af5c3a041
[svn r944] Now add/cancel a schedule recording while livetv is running is finnaly working fine.

diff -r 608cb47819c6 -r 067904b6921f gmyth/gmyth/gmyth_scheduler.c
--- a/gmyth/gmyth/gmyth_scheduler.c	Sat Mar 01 23:15:42 2008 +0000
+++ b/gmyth/gmyth/gmyth_scheduler.c	Mon Mar 03 11:33:49 2008 +0000
@@ -61,6 +61,10 @@
                                      GMythProgramInfo *prog_info,
                                      gchar *new_group);
 
+static gint
+gmyth_scheduler_query_schedule_list (GMythScheduler * scheduler,
+                                     GList ** schedule_list,
+                                     gchar *filter);
 
 
 static gboolean update_backend(GMythScheduler * scheduler, gint record_id);
@@ -225,25 +229,62 @@
  * @return The amount of schedules retrieved from database, or -1 if error.
  */
 gint
-gmyth_scheduler_get_schedule_list(GMythScheduler * scheduler,
-                                  GList ** schedule_list)
+gmyth_scheduler_get_schedule_list (GMythScheduler * scheduler,
+                                   GList ** schedule_list)
 {
+    return gmyth_scheduler_query_schedule_list (scheduler, schedule_list, NULL);
+}
+
+ScheduleInfo*
+gmyth_scheduler_get_schedule (GMythScheduler * scheduler, gint sched_id)
+{
+    GList *sched_list = NULL;
+    ScheduleInfo *schedule = NULL;
+    gchar *filter;
+    gint count;
+
+    filter = g_strdup_printf ("WHERE recordid=%d", sched_id);
+
+    count = gmyth_scheduler_query_schedule_list (scheduler, &sched_list, filter);
+    if ((count > 0) && (sched_list != NULL)) {
+        schedule = (ScheduleInfo*) sched_list->data;
+	g_list_free (sched_list);
+    }
+
+    g_free (filter);
+    return schedule;
+}
+
+static gint
+gmyth_scheduler_query_schedule_list (GMythScheduler * scheduler,
+		                     GList ** schedule_list,
+				     gchar *filter)
+{
+	
     ScheduleInfo   *schedule;
     MYSQL_RES      *msql_res;
     GString        *query_str = g_string_new("");
     gchar          *date_time = NULL;
 
     assert(scheduler);
-
-    g_string_printf(query_str,
-                    "SELECT recordid,programid,chanid,starttime,startdate,"
-                    "endtime,enddate,title,subtitle,description,category,type,parentid,seriesid FROM record;");
-
     if (scheduler->msqlquery == NULL) {
         g_warning("[%s] Scheduler db connection not initialized",
                   __FUNCTION__);
         return -1;
     }
+
+    if (filter == NULL) {
+        g_string_printf(query_str,
+                        "SELECT recordid,programid,chanid,starttime,startdate,"
+                        "endtime,enddate,title,subtitle,description,category,type,parentid,seriesid FROM record;");
+    } else {
+        g_string_printf(query_str,
+                        "SELECT recordid,programid,chanid,starttime,startdate,"
+                        "endtime,enddate,title,subtitle,description,category,type,parentid,seriesid FROM record "
+			"%s;", filter);
+
+    }
+
     msql_res =
         gmyth_query_process_statement(scheduler->msqlquery,
                                       query_str->str);
@@ -496,7 +537,7 @@
                              ScheduleInfo * schedule_info, GMythScheduleType type)
 {
     MYSQL_RES      *msql_res;
-    gchar          *query_str = "INSERT record (recordid) VALUE (0);";
+    gchar          *query_str = NULL;
     gchar          *station = NULL;
     gulong          rec_id;
 
@@ -521,9 +562,9 @@
 	gint recorder_num = 
                 gmyth_scheduler_is_program_live_recorded (scheduler, schedule_info,
                                                           &prog_info);
-	if (recorder_num > 0) {
-	    g_debug ("Recording already found in livetv... setting live record");
+	if ((recorder_num > 0) && (prog_info != NULL)) {
             gmyth_scheduler_change_record_group (scheduler, prog_info, "Default");
+	    schedule_info->schedule_id = prog_info->recordid;
 
             return gmyth_scheduler_set_live_record (scheduler, schedule_info,
 			recorder_num, TRUE);
@@ -532,7 +573,8 @@
 
     msql_res =
         gmyth_query_process_statement_with_increment(scheduler->msqlquery,
-                                                     query_str, &rec_id);
+			              "INSERT record (recordid) VALUE (0);",
+                                      &rec_id);
     mysql_free_result(msql_res);
 
     // Retrieves the station info
@@ -665,13 +707,12 @@
         GList *iter = list;
 	while (iter) {
 	    GMythRecorder *recorder = GMYTH_RECORDER ( iter->data );
-	    g_debug ("XXXX verifying the recorder %d", recorder->recorder_num);
 	    
             if (gmyth_recorder_is_recording (recorder)) {
                 GMythProgramInfo *pinfo = gmyth_recorder_get_current_program_info (recorder);
 		if (pinfo != NULL) {
-		    if ((schedule_info->channel_id == pinfo->channel_id)) {
-			g_debug ("XXXXXX recorder %d is recording the program", recorder->recorder_num);
+		    if ((schedule_info->channel_id == pinfo->channel_id) &&
+			(schedule_info->start_time->tv_sec == pinfo->startts->tv_sec)) {
 			recorder_num = recorder->recorder_num;
                         *prog_info = pinfo;
 			break;
@@ -708,7 +749,6 @@
 
     socket = gmyth_backend_info_get_connected_socket (scheduler->backend_info);
     if (socket != NULL) {
-	    g_debug ("XXXX sending command for live recording");
         ret = (gmyth_socket_sendreceive_stringlist(socket, strlist) > 0);
         g_object_unref (socket);
     } else {
@@ -734,10 +774,8 @@
         return FALSE;
     }
 
-    //prog_info->recstartts->tv_sec += 60*60*2;
     startts = gmyth_util_time_to_string_from_time_val (prog_info->recstartts);
 
-    g_debug ("\n\n%s\n\n", startts);
     query_str = g_strdup_printf("UPDATE recorded SET recgroup = \"%s\" "
                     "WHERE chanid = \"%d\" AND starttime = \"%s\"",
                      new_group, prog_info->channel_id, startts);
@@ -759,11 +797,10 @@
  * @return gboolean TRUE if success, FALSE if error
  */
 gboolean
-gmyth_scheduler_delete_schedule(GMythScheduler * scheduler, gint schedule_id)
+gmyth_scheduler_delete_schedule (GMythScheduler * scheduler, gint schedule_id)
 {
-
-    MYSQL_RES      *msql_res;
-    GString        *query_str = NULL;
+    MYSQL_RES *msql_res;
+    GString *query_str = NULL;
 
     g_return_val_if_fail (scheduler != NULL, FALSE);
 
@@ -774,6 +811,28 @@
         return FALSE;
     }
 
+    {
+        /* Before adding the schedule, we need to check if program is been played */
+        GMythProgramInfo *prog_info = NULL;
+        ScheduleInfo *sched_info = NULL;
+
+        sched_info = gmyth_scheduler_get_schedule (scheduler, schedule_id);
+        if (sched_info != NULL) {
+            gint recorder_num =
+                gmyth_scheduler_is_program_live_recorded (scheduler, sched_info,
+                                                          &prog_info);
+            if ((recorder_num > 0) && (prog_info != NULL)) {
+		gboolean ret;
+                gmyth_scheduler_change_record_group (scheduler, prog_info, "LiveTV");
+
+                ret = gmyth_scheduler_set_live_record (scheduler, sched_info,
+                            recorder_num, FALSE);
+                gmyth_schedule_info_free (sched_info);
+		return ret;		
+            } 
+	}
+    }
+
     query_str = g_string_new("");
     g_string_printf(query_str,
                     "DELETE FROM record WHERE recordid=%d", schedule_id);
@@ -883,175 +942,6 @@
     return FALSE;
 }
 
-
-gboolean gmyth_scheduler_reactivate_schedule(GMythScheduler* scheduler, gint channel_id,
-                                             time_t start_time)
-
-{
-    MYSQL_RES      *msql_res;
-    GString        *query_str = g_string_new("");
-
-    assert(scheduler);
-    g_string_printf(query_str, "SELECT callsign FROM channel "
-                    "WHERE chanid = \"%d\"", channel_id);
-
-    msql_res = gmyth_query_process_statement(scheduler->msqlquery, query_str->str);
-    if (msql_res) {
-        MYSQL_ROW msql_row = mysql_fetch_row(msql_res);
-        if (msql_row) {
-            GString* callsign = g_string_new(msql_row[0]);
-            GString* startts = gmyth_util_time_to_string(start_time);
-            g_string_printf(query_str, "UPDATE oldrecorded SET reactivate = 1 "
-                            "WHERE station = \"%s\" AND starttime = \"%s\"",
-                            callsign->str, startts->str);
-            gmyth_query_process_statement(scheduler->msqlquery, query_str->str);
-            g_string_free(callsign, TRUE);
-            g_string_free(startts, TRUE);
-            g_string_free(query_str, TRUE);
-            return TRUE;
-        }
-
-    }
-
-    return FALSE;
-}
-
-
-/*
- * This should only be used in special situations. We do not know the time that
- * the recording was set. We just know that it is an "ongoing" record and then
- * we have to use this to get it's info. It's always the oldest one -> first on list
- *
- */
-GMythProgramInfo*
-gmyth_scheduler_get_recorded_on_time(GMythScheduler* scheduler,
-                                     guint channel_id)
-{
-    MYSQL_RES      *msql_res;
-    GMythProgramInfo *proginfo = NULL;
-    GString        *query_str = g_string_new("");
-
-    assert(scheduler);
-
-    g_string_printf(query_str,
-                    "SELECT recorded.chanid,starttime,endtime,title,"
-                    "subtitle,description,channel.channum,"
-                    "channel.callsign,channel.name,channel.commfree,"
-                    "channel.outputfilters,seriesid,programid,filesize,"
-                    "lastmodified,stars,previouslyshown,originalairdate,"
-                    "hostname,recordid,transcoder,playgroup,"
-                    "recorded.recpriority,progstart,progend,basename,recgroup,"
-                    "category,findid,duplicate "
-                    "FROM recorded " "LEFT JOIN channel "
-                    "ON recorded.chanid = channel.chanid "
-                    "WHERE recorded.chanid = %d "
-                    "ORDER BY starttime DESC", channel_id);
-
-    msql_res =
-        gmyth_query_process_statement(scheduler->msqlquery, query_str->str);
-
-    if (msql_res) {
-        MYSQL_ROW msql_row = mysql_fetch_row(msql_res);
-
-        if (msql_row) {
-            proginfo = gmyth_program_info_new();
-
-            proginfo->channel_id = (gint) g_ascii_strtoull (msql_row[0], NULL, 10);
-            proginfo->recstartts = gmyth_util_string_to_time_val(msql_row[1]);
-            proginfo->recendts = gmyth_util_string_to_time_val(msql_row[2]);
-
-            proginfo->title = g_string_new(msql_row[3]);
-            proginfo->subtitle = g_string_new(msql_row[4]);
-            proginfo->description = g_string_new(msql_row[5]);
-
-            proginfo->chanstr = g_string_new(msql_row[6]);
-            proginfo->chansign = g_string_new(msql_row[7]);
-            proginfo->channame = g_string_new(msql_row[8]);
-            proginfo->chancommfree = (gint) g_ascii_strtoull(msql_row[9], NULL, 10);
-            proginfo->chanOutputFilters = g_string_new(msql_row[10]);
-            proginfo->seriesid = g_string_new(msql_row[11]);
-            proginfo->program_id = g_string_new(msql_row[12]);
-            proginfo->filesize = g_ascii_strtoull(msql_row[13], NULL, 10);
-
-            proginfo->lastmodified = gmyth_util_string_to_time_val(msql_row[14]);
-            proginfo->stars = g_ascii_strtod(msql_row[15], NULL);
-            proginfo->repeat = (gint)g_ascii_strtoull(msql_row[16], NULL, 10);
-
-            if (msql_row[17] == NULL) {
-                proginfo->originalAirDate = 0;
-                proginfo->hasAirDate = FALSE;
-            } else {
-                proginfo->originalAirDate = gmyth_util_string_to_time_val(msql_row[17]);
-                proginfo->hasAirDate = TRUE;
-            }
-
-            proginfo->hostname = g_string_new(msql_row[18]);
-            proginfo->recordid = (gint) g_ascii_strtoull(msql_row[19], NULL, 10);
-            proginfo->transcoder = (gint) g_ascii_strtoull(msql_row[20], NULL, 10);
-
-            proginfo->playgroup = g_string_new(msql_row[21]);
-            proginfo->recpriority = (gint) g_ascii_strtoull(msql_row[22], NULL, 10);
-
-            proginfo->startts = gmyth_util_string_to_time_val(msql_row[23]);
-            proginfo->endts = gmyth_util_string_to_time_val(msql_row[24]);
-            proginfo->pathname = g_string_new(g_strdup(msql_row[25]));
-            proginfo->recgroup = g_string_new(msql_row[26]);
-            proginfo->category = g_string_new(msql_row[27]);
-            proginfo->findid = (gint) g_ascii_strtoull(msql_row[28], NULL, 10);
-
-            proginfo->recpriority2 = 0;
-
-            g_string_printf(query_str,
-                            "SELECT dupmethod,dupin,parentid,type "
-                            "FROM record WHERE recordid = \"%d\"", proginfo->recordid);
-
-            msql_res =
-                gmyth_query_process_statement(scheduler->msqlquery,
-                                              query_str->str);
-
-            if (msql_res) {
-                MYSQL_ROW msql_row = mysql_fetch_row(msql_res);
-
-                if (msql_row) {
-                    proginfo->dupmethod = (gint) g_ascii_strtoull(msql_row[0], NULL, 10);
-                    proginfo->dupin = (gint) g_ascii_strtoull(msql_row[1], NULL, 10);
-                    proginfo->parentid = (gint) g_ascii_strtoull(msql_row[2], NULL, 10);
-                    proginfo->rectype = 0;
-                }
-            }
-
-
-            g_string_printf(query_str,
-                            "SELECT sourceid,cardid,cardinputid,shareable "
-                            "FROM cardinput");
-
-            msql_res =
-                gmyth_query_process_statement(scheduler->msqlquery,
-                                              query_str->str);
-
-            if (msql_res) {
-                MYSQL_ROW msql_row = mysql_fetch_row(msql_res);
-
-                if (msql_row) {
-                    proginfo->sourceid = 0;
-                    proginfo->cardid = 0;
-                    proginfo->inputid = 0;
-                    if (msql_row[3] != NULL && g_ascii_strcasecmp("Y", msql_row[3]) == 0)
-                        proginfo->shareable = 1;
-                    else
-                        proginfo->shareable = 0;
-                }
-            }
-
-
-
-        }
-    }
-
-    g_string_free(query_str, TRUE);
-    return proginfo;
-}
-
 /** Retrieves an existing recorded item information from database. The information
  * is used to fill the returned GMythProgramInfo.
  * 
@@ -1167,114 +1057,6 @@
     return proginfo;
 }
 
-gboolean
-gmyth_scheduler_stop_recording (GMythScheduler * scheduler,
-                                gint channel_id)
-{
-    GMythProgramInfo *program;
-    GMythSocket    *socket;
-    gboolean        res = FALSE;
-    GMythStringList *slist;
-
-    socket = gmyth_backend_info_get_connected_socket (scheduler->backend_info);
-    program = gmyth_scheduler_get_recorded_on_time (scheduler, channel_id);
-
-    if (program) {
-        slist = gmyth_string_list_new();
-        gmyth_string_list_append_char_array(slist, "STOP_RECORDING");
-
-        gmyth_string_list_append_string(slist, program->title);        /* 0 */
-        gmyth_string_list_append_string(slist, program->subtitle);     /* 1 */
-        gmyth_string_list_append_string(slist, program->description);  /* 2 */
-        gmyth_string_list_append_string(slist, program->category);     /* 3 */
-        gmyth_string_list_append_int(slist, program->channel_id);   /* 4 */
-        gmyth_string_list_append_string(slist, program->chanstr);      /* 5 */
-        gmyth_string_list_append_string(slist, program->chansign);     /* 6 */
-        gmyth_string_list_append_string(slist, program->channame);     /* 7 */
-        gmyth_string_list_append_string(slist, program->pathname);     /* 8 */
-        gmyth_string_list_append_int64(slist, program->filesize);      /* 9 */
-
-        if (program->startts)
-            gmyth_string_list_append_int(slist, program->startts->tv_sec); /* 10 */
-        else
-            gmyth_string_list_append_int(slist, 0);
-
-        if (program->endts)
-            gmyth_string_list_append_int(slist, program->endts->tv_sec);   /* 11 */
-        else
-            gmyth_string_list_append_int(slist, 0);
-
-        gmyth_string_list_append_int(slist, program->duplicate);   /* 12 */
-        gmyth_string_list_append_int(slist, program->shareable);   /* 13 */
-        gmyth_string_list_append_int(slist, program->findid);      /* 14 */
-        gmyth_string_list_append_string(slist, program->hostname); /* 15 */
-        gmyth_string_list_append_int(slist, program->sourceid);    /* 16 */
-        gmyth_string_list_append_int(slist, program->cardid);      /* 17 */
-        gmyth_string_list_append_int(slist, program->inputid);     /* 18 */
-        gmyth_string_list_append_int(slist, program->recpriority); /* 19 */
-
-        // recstatus == recording
-        gmyth_string_list_append_int(slist, -3);                   /* 20 */
-
-        gmyth_string_list_append_int(slist, program->recordid);    /* 21 */
-        gmyth_string_list_append_int(slist, program->rectype);     /* 22 */
-        gmyth_string_list_append_int(slist, program->dupin);       /* 23 */
-        gmyth_string_list_append_int(slist, program->dupmethod);   /* 24 */
-
-
-        //fixme
-        program->recstartts->tv_sec -= (60*60);
-
-        gmyth_string_list_append_int(slist, 
-                                     program->recstartts != NULL ?
-                                     program->recstartts->tv_sec : 0);   /* 26 */
-
-        gmyth_string_list_append_int(slist, 
-                                     program->recendts != NULL ?
-                                     program->recendts->tv_sec : 0);    /* 27 */
-
-        gmyth_string_list_append_int(slist, program->repeat);       /* 28 */
-        gmyth_string_list_append_int(slist, program->programflags); /* 29 */
-
-        gmyth_string_list_append_char_array(slist, 
-                                            program->recgroup != NULL ?
-                                            program->recgroup->str : "Default");  /* 30 */
-
-        gmyth_string_list_append_int(slist, program->chancommfree);         /* 31 */
-        gmyth_string_list_append_string(slist, program->chanOutputFilters); /* 32 */
-        gmyth_string_list_append_string(slist, program->seriesid);          /* 33 */
-        gmyth_string_list_append_string(slist, program->program_id);     /* 34 */
-
-        gmyth_string_list_append_int(slist,
-                                     program->lastmodified != NULL ?
-                                     program->lastmodified->tv_sec : 0);   /* 35 */
-
-        gmyth_string_list_append_float(slist, program->stars); /* 36 */
-
-        gmyth_string_list_append_int(slist,
-                                     program->originalAirDate != NULL ?
-                                     program->originalAirDate->tv_sec : 0); /* 37 */
-
-        gmyth_string_list_append_int(slist, program->hasAirDate);  /* 38 */
-
-        gmyth_string_list_append_char_array(slist,
-                                            program->playgroup != NULL ?
-                                            program->playgroup->str : "Default");  /* 39 */
-
-        gmyth_string_list_append_int(slist, program->recpriority2); /* 40 */
-        gmyth_string_list_append_int(slist, program->recpriority2); /* 40 */
-
-        gmyth_socket_sendreceive_stringlist(socket, slist);
-        res = (gmyth_string_list_get_int(slist, 0) == 1);
-
-        g_object_unref (program);
-        g_object_unref (slist);
-    }
-
-    g_object_unref (socket);
-    return res;
-}
-
 
 /** Notifies the backend of an update in the db.
  * 
diff -r 608cb47819c6 -r 067904b6921f gmyth/gmyth/gmyth_scheduler.h
--- a/gmyth/gmyth/gmyth_scheduler.h	Sat Mar 01 23:15:42 2008 +0000
+++ b/gmyth/gmyth/gmyth_scheduler.h	Mon Mar 03 11:33:49 2008 +0000
@@ -149,18 +149,12 @@
 gboolean            gmyth_scheduler_disconnect              (GMythScheduler * scheduler);
 gint                gmyth_scheduler_get_schedule_list       (GMythScheduler * scheduler,
                                                              GList ** sched_list);
+ScheduleInfo*       gmyth_scheduler_get_schedule            (GMythScheduler * scheduler,
+		                                             gint schedule_id);
 gint                gmyth_scheduler_get_recorded_list       (GMythScheduler * scheduler,
                                                              GList ** rec_list);
 RecordedInfo*       gmyth_scheduler_get_recorded_info       (GMythScheduler *scheduler,
                                                              const char *basename);
-gboolean            gmyth_scheduler_was_recorded_before     (GMythScheduler* scheduler,
-                                                             gint channel_id,
-                                                             time_t start_time);
-gboolean            gmyth_scheduler_reactivate_schedule     (GMythScheduler* scheduler,
-                                                             gint channel_id,
-                                                             time_t start_time);
-GMythProgramInfo*   gmyth_scheduler_get_recorded_on_time    (GMythScheduler* scheduler,
-                                                             guint channel_id);
 GMythProgramInfo*   gmyth_scheduler_get_recorded            (GMythScheduler * scheduler,
                                                              GString * channel,
                                                              GTimeVal * starttime);
@@ -179,8 +173,6 @@
                                                              gint record_id);
 gint                gmyth_scheduler_delete_recorded         (GMythScheduler * scheduler,
                                                              gint record_id);
-gboolean            gmyth_scheduler_stop_recording          (GMythScheduler * scheduler,
-                                                             gint channel_id);
 void                gmyth_scheduler_recorded_info_get_preview(RecordedInfo * info,
                                                              GByteArray * data);
 
diff -r 608cb47819c6 -r 067904b6921f gmyth/gmyth/gmyth_util.c
--- a/gmyth/gmyth/gmyth_util.c	Sat Mar 01 23:15:42 2008 +0000
+++ b/gmyth/gmyth/gmyth_util.c	Mon Mar 03 11:33:49 2008 +0000
@@ -95,7 +95,7 @@
  * @param time_value the GTimeValue to be converted
  * @return GString* the converted isoformat string 
  */
-gchar          *
+gchar*
 gmyth_util_time_to_isoformat_from_time_val_fmt(const gchar * fmt_string,
                                                const GTimeVal * time_val)
 {