branches/gmyth-0.1b/src/gmyth_recorder.c
author morphbr
Sat Feb 10 20:01:54 2007 +0000 (2007-02-10)
branchtrunk
changeset 349 7005e696052c
permissions -rw-r--r--
[svn r351] - Bug fix in gmyth_util.c: included support for time without seconds in gmyth_util_string_to_time_val_fmt (XML format from backend)
- Bug fix in gmyth_http.c: fixed bug when there are no channels
- gmyth_vlc.c/h: included support to specify a port when connecting to VLC
- tests: fixed vlc test file regarding the fix above
created script to compile http test app
renatofilho@320
     1
/**
renatofilho@320
     2
 * GMyth Library
renatofilho@320
     3
 *
renatofilho@320
     4
 * @file gmyth/gmyth_remote_encoder.c
renatofilho@320
     5
 * 
renatofilho@320
     6
 * @brief <p> GMythRecorder class defines functions for playing live tv.
renatofilho@320
     7
 *
renatofilho@320
     8
 * The remote encoder is used by gmyth_tvplayer to setup livetv. 
renatofilho@320
     9
 *
renatofilho@320
    10
 * Copyright (C) 2006 INdT - Instituto Nokia de Tecnologia.
renatofilho@320
    11
 * @author Hallyson Luiz de Morais Melo <hallyson.melo@indt.org.br>
renatofilho@320
    12
 *
renatofilho@320
    13
 *//*
renatofilho@320
    14
 * 
renatofilho@320
    15
 * This program is free software; you can redistribute it and/or modify
renatofilho@320
    16
 * it under the terms of the GNU Lesser General Public License as published by
renatofilho@320
    17
 * the Free Software Foundation; either version 2 of the License, or
renatofilho@320
    18
 * (at your option) any later version.
renatofilho@320
    19
 *
renatofilho@320
    20
 * This program is distributed in the hope that it will be useful,
renatofilho@320
    21
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
renatofilho@320
    22
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
renatofilho@320
    23
 * GNU General Public License for more details.
renatofilho@320
    24
 *
renatofilho@320
    25
 * You should have received a copy of the GNU Lesser General Public License
renatofilho@320
    26
 * along with this program; if not, write to the Free Software
renatofilho@320
    27
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
renatofilho@320
    28
 */
renatofilho@320
    29
 
renatofilho@320
    30
#ifdef HAVE_CONFIG_H
renatofilho@320
    31
#include "config.h"
renatofilho@320
    32
#endif
renatofilho@320
    33
renatofilho@320
    34
#include "gmyth_recorder.h"
renatofilho@320
    35
renatofilho@320
    36
#include <assert.h>
renatofilho@320
    37
renatofilho@320
    38
#include "gmyth_stringlist.h"
renatofilho@320
    39
#include "gmyth_util.h"
renatofilho@320
    40
#include "gmyth_debug.h"
renatofilho@320
    41
renatofilho@320
    42
#define	 GMYTHTV_RECORDER_HEADER			"QUERY_RECORDER"
renatofilho@320
    43
renatofilho@320
    44
static void gmyth_recorder_class_init          (GMythRecorderClass *klass);
renatofilho@320
    45
static void gmyth_recorder_init                (GMythRecorder *object);
renatofilho@320
    46
renatofilho@320
    47
static void gmyth_recorder_dispose  (GObject *object);
renatofilho@320
    48
static void gmyth_recorder_finalize (GObject *object);
renatofilho@320
    49
renatofilho@320
    50
G_DEFINE_TYPE(GMythRecorder, gmyth_recorder, G_TYPE_OBJECT)
renatofilho@320
    51
    
renatofilho@320
    52
static void
renatofilho@320
    53
gmyth_recorder_class_init (GMythRecorderClass *klass)
renatofilho@320
    54
{
renatofilho@320
    55
    GObjectClass *gobject_class;
renatofilho@320
    56
renatofilho@320
    57
    gobject_class = (GObjectClass *) klass;
renatofilho@320
    58
	
renatofilho@320
    59
    gobject_class->dispose  = gmyth_recorder_dispose;
renatofilho@320
    60
    gobject_class->finalize = gmyth_recorder_finalize;	
renatofilho@320
    61
}
renatofilho@320
    62
renatofilho@320
    63
static void
renatofilho@320
    64
gmyth_recorder_init (GMythRecorder *gmyth_remote_encoder)
renatofilho@320
    65
{
renatofilho@320
    66
}
renatofilho@320
    67
renatofilho@320
    68
static void
renatofilho@320
    69
gmyth_recorder_dispose  (GObject *object)
renatofilho@320
    70
{
renatofilho@320
    71
    // GMythRecorder *gmyth_remote_encoder = GMYTH_RECORDER(object);
renatofilho@320
    72
    
renatofilho@320
    73
	G_OBJECT_CLASS (gmyth_recorder_parent_class)->dispose (object);
renatofilho@320
    74
}
renatofilho@320
    75
renatofilho@320
    76
renatofilho@320
    77
static void
renatofilho@320
    78
gmyth_recorder_finalize (GObject *object)
renatofilho@320
    79
{
renatofilho@320
    80
	g_signal_handlers_destroy (object);
renatofilho@320
    81
renatofilho@320
    82
  GMythRecorder *recorder = GMYTH_RECORDER(object);
renatofilho@320
    83
renatofilho@320
    84
	gmyth_debug ("[%s] Closing control socket", __FUNCTION__);
renatofilho@320
    85
	gmyth_socket_close_connection(recorder->myth_socket);
renatofilho@320
    86
	g_object_unref (recorder->myth_socket);
renatofilho@320
    87
    
renatofilho@320
    88
  G_OBJECT_CLASS (gmyth_recorder_parent_class)->finalize (object);
renatofilho@320
    89
}
renatofilho@320
    90
renatofilho@320
    91
/** Creates a new instance of GMythRecorder.
renatofilho@320
    92
 * 
renatofilho@320
    93
 * @return a new instance of GMythRecorder.
renatofilho@320
    94
 */
renatofilho@320
    95
GMythRecorder*
renatofilho@320
    96
gmyth_recorder_new (int num, GString *hostname, gshort port)
renatofilho@320
    97
{
renatofilho@320
    98
	GMythRecorder *encoder = GMYTH_RECORDER ( g_object_new (
renatofilho@320
    99
			GMYTH_RECORDER_TYPE, FALSE ));
renatofilho@320
   100
			
renatofilho@320
   101
	encoder->recorder_num = num;
renatofilho@320
   102
	encoder->hostname = g_string_new (hostname->str);
renatofilho@320
   103
	encoder->port = port;
renatofilho@320
   104
	
renatofilho@320
   105
	return encoder;
renatofilho@320
   106
}
renatofilho@320
   107
renatofilho@320
   108
/** Configures the remote encoder instance connecting it to Mythtv backend.
renatofilho@320
   109
 * 
renatofilho@320
   110
 * @param recorder the GMythRecorder instance.
renatofilho@320
   111
 * @return TRUE if successfull, FALSE if any error happens.
renatofilho@320
   112
 */
renatofilho@320
   113
gboolean
renatofilho@320
   114
gmyth_recorder_setup (GMythRecorder *recorder)
renatofilho@320
   115
{
renatofilho@320
   116
	assert (recorder);
renatofilho@320
   117
	gmyth_debug ("[%s] Creating socket and connecting to backend", __FUNCTION__);
renatofilho@320
   118
renatofilho@320
   119
	if (recorder->myth_socket == NULL) {
renatofilho@320
   120
		
renatofilho@320
   121
		recorder->myth_socket = gmyth_socket_new ();
renatofilho@320
   122
		
renatofilho@320
   123
		if (!gmyth_socket_connect_to_backend ( recorder->myth_socket, recorder->hostname->str, 
renatofilho@320
   124
					recorder->port, TRUE ) ) {
renatofilho@320
   125
			g_warning ("GMythRemoteEncoder: Connection to backend failed");	
renatofilho@320
   126
			return FALSE;
renatofilho@320
   127
		}
renatofilho@320
   128
		
renatofilho@320
   129
	} else {
renatofilho@320
   130
		g_warning("Remote encoder socket already created\n");
renatofilho@320
   131
	}
renatofilho@320
   132
renatofilho@320
   133
	return TRUE;
renatofilho@320
   134
}
renatofilho@320
   135
renatofilho@320
   136
/** Sends the SPAWN_LIVETV command through Mythtv protocol. This command
renatofilho@320
   137
 * requests the backend to start capturing TV content.
renatofilho@320
   138
 * 
renatofilho@320
   139
 * @param recorder The GMythRecorder instance.
renatofilho@320
   140
 * @param tvchain_id The tvchain unique id.
renatofilho@320
   141
 * @return true if success, false if any error happens.
renatofilho@320
   142
 */
renatofilho@320
   143
gboolean
renatofilho@320
   144
gmyth_recorder_spawntv (GMythRecorder *recorder, GString *tvchain_id)
renatofilho@320
   145
{
renatofilho@320
   146
	GMythStringList *str_list;
renatofilho@320
   147
	GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER );
renatofilho@320
   148
	
renatofilho@320
   149
	gmyth_debug ("[%s] Spawntv with tvchain_id = %s", __FUNCTION__, tvchain_id->str);
renatofilho@320
   150
	
renatofilho@320
   151
	str_list = gmyth_string_list_new ();
renatofilho@320
   152
	
renatofilho@320
   153
	g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); 
renatofilho@320
   154
	
renatofilho@320
   155
	gmyth_string_list_append_string (str_list, tmp_str);
renatofilho@320
   156
	gmyth_string_list_append_string (str_list, g_string_new ("SPAWN_LIVETV"));
renatofilho@320
   157
	gmyth_string_list_append_string (str_list, tvchain_id);
renatofilho@320
   158
	gmyth_string_list_append_int (str_list, 0); // PIP = FALSE (0)
renatofilho@320
   159
renatofilho@320
   160
	gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list);
renatofilho@320
   161
	
renatofilho@320
   162
    g_string_free (tmp_str, TRUE);
renatofilho@320
   163
    
renatofilho@320
   164
    tmp_str = gmyth_string_list_get_string (str_list, 0);
renatofilho@320
   165
    if (tmp_str == NULL) {
renatofilho@320
   166
    	g_warning ("[%s] Spawntv request returned %s", __FUNCTION__, tmp_str->str);
renatofilho@320
   167
    	return FALSE;
renatofilho@320
   168
	}
renatofilho@320
   169
	
renatofilho@320
   170
    if (g_ascii_strncasecmp (tmp_str->str, "ok", 2)) {
renatofilho@320
   171
    	g_warning ("[%s] Spawntv request returned %s", __FUNCTION__, tmp_str->str);
renatofilho@320
   172
	    g_object_unref (str_list);
renatofilho@320
   173
    	return FALSE;
renatofilho@320
   174
    }
renatofilho@320
   175
renatofilho@320
   176
    g_object_unref (str_list);
renatofilho@320
   177
    return TRUE;
renatofilho@320
   178
renatofilho@320
   179
}
renatofilho@320
   180
renatofilho@320
   181
/** 
renatofilho@320
   182
 * Sends the SPAWN_LIVETV command through Mythtv protocol. This command
renatofilho@320
   183
 * requests the backend to start capturing TV content, but it doesn't need
renatofilho@320
   184
 * the TV chain ID.
renatofilho@320
   185
 * 
renatofilho@320
   186
 * @param recorder The GMythRecorder instance.
renatofilho@320
   187
 * @return true if success, false if any error happens.
renatofilho@320
   188
 */
renatofilho@320
   189
gboolean
renatofilho@320
   190
gmyth_recorder_spawntv_no_tvchain (GMythRecorder *recorder)
renatofilho@320
   191
{
renatofilho@320
   192
	GMythStringList *str_list;
renatofilho@320
   193
	GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER );
renatofilho@320
   194
	
renatofilho@320
   195
	gmyth_debug ("[%s] Spawntv, no TV chain!", __FUNCTION__);
renatofilho@320
   196
	
renatofilho@320
   197
	str_list = gmyth_string_list_new ();
renatofilho@320
   198
	
renatofilho@320
   199
	g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); 
renatofilho@320
   200
	
renatofilho@320
   201
	gmyth_string_list_append_string (str_list, tmp_str);
renatofilho@320
   202
	gmyth_string_list_append_string (str_list, g_string_new ("SPAWN_LIVETV"));
renatofilho@320
   203
renatofilho@320
   204
	gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list);
renatofilho@320
   205
	
renatofilho@320
   206
    g_string_free (tmp_str, TRUE);
renatofilho@320
   207
    
renatofilho@320
   208
    tmp_str = gmyth_string_list_get_string (str_list, 0);
renatofilho@320
   209
    if (tmp_str == NULL) {
renatofilho@320
   210
    	g_warning ("[%s] Spawntv request returned %s", __FUNCTION__, tmp_str->str);
renatofilho@320
   211
    	return FALSE;
renatofilho@320
   212
	}
renatofilho@320
   213
	
renatofilho@320
   214
    if (g_ascii_strncasecmp (tmp_str->str, "ok", 2)) {
renatofilho@320
   215
    	g_warning ("[%s] Spawntv request returned %s", __FUNCTION__, tmp_str->str);
renatofilho@320
   216
	    g_object_unref (str_list);
renatofilho@320
   217
    	return FALSE;
renatofilho@320
   218
    }
renatofilho@320
   219
renatofilho@320
   220
    g_object_unref (str_list);
renatofilho@320
   221
    return TRUE;
renatofilho@320
   222
renatofilho@320
   223
}
renatofilho@320
   224
renatofilho@320
   225
/** Sends the command STOP_LIVETV to Mythtv backend.
renatofilho@320
   226
 * 
renatofilho@320
   227
 * @param recorder the GMythRecorder instance.
renatofilho@320
   228
 * @return true if success, false if any error happens.
renatofilho@320
   229
 */
renatofilho@320
   230
gboolean
renatofilho@320
   231
gmyth_recorder_stop_livetv (GMythRecorder *recorder)
renatofilho@320
   232
{
renatofilho@320
   233
	GMythStringList *str_list;
renatofilho@320
   234
	GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER );
renatofilho@320
   235
renatofilho@320
   236
	gmyth_debug ("[%s]", __FUNCTION__);
renatofilho@320
   237
renatofilho@320
   238
	str_list = gmyth_string_list_new ();
renatofilho@320
   239
renatofilho@320
   240
	g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); 
renatofilho@320
   241
	gmyth_string_list_append_char_array( str_list, "STOP_LIVETV" );
renatofilho@320
   242
renatofilho@320
   243
	gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list);
renatofilho@320
   244
renatofilho@320
   245
	g_string_free (tmp_str, TRUE);
renatofilho@320
   246
renatofilho@320
   247
	tmp_str = gmyth_string_list_get_string (str_list, 0);
renatofilho@320
   248
	if (g_ascii_strncasecmp (tmp_str->str, "ok", 2)) {
renatofilho@320
   249
		g_warning ("[%s] Stop livetv request returned %s", __FUNCTION__, tmp_str->str);
renatofilho@320
   250
		g_object_unref (str_list);
renatofilho@320
   251
		return FALSE;
renatofilho@320
   252
	}
renatofilho@320
   253
renatofilho@320
   254
	g_object_unref (str_list);
renatofilho@320
   255
	return TRUE;
renatofilho@320
   256
renatofilho@320
   257
}
renatofilho@320
   258
renatofilho@320
   259
/** Sends the FRONTEND_READY command through Mythtv protocol. This command
renatofilho@320
   260
 * advertises the backend to start capturing TV content.
renatofilho@320
   261
 * 
renatofilho@320
   262
 * @param recorder The GMythRecorder instance.
renatofilho@320
   263
 * @return TRUE if success, FALSE if any error happens.
renatofilho@320
   264
 */
renatofilho@320
   265
gboolean
renatofilho@320
   266
gmyth_recorder_send_frontend_ready_command (GMythRecorder *recorder)
renatofilho@320
   267
{
renatofilho@320
   268
	GMythStringList *str_list;
renatofilho@320
   269
	GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER );
renatofilho@320
   270
	
renatofilho@320
   271
	gmyth_debug ( "[%s] FRONTEND_READY with recorder id = %d", __FUNCTION__, recorder->recorder_num );
renatofilho@320
   272
	
renatofilho@320
   273
	str_list = gmyth_string_list_new ();
renatofilho@320
   274
	
renatofilho@320
   275
	g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); 
renatofilho@320
   276
	
renatofilho@320
   277
	gmyth_string_list_append_string (str_list, tmp_str);
renatofilho@320
   278
	gmyth_string_list_append_string (str_list, g_string_new ("FRONTEND_READY"));
renatofilho@320
   279
renatofilho@320
   280
	gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list);
renatofilho@320
   281
	
renatofilho@320
   282
  g_string_free (tmp_str, TRUE);
renatofilho@320
   283
    
renatofilho@320
   284
  tmp_str = gmyth_string_list_get_string (str_list, 0);
renatofilho@320
   285
  if (tmp_str == NULL) {
renatofilho@320
   286
  	g_warning ("[%s] FRONTEND_READY command request couldn't returns, reason: %s", __FUNCTION__, tmp_str->str);
renatofilho@320
   287
  	return FALSE;
renatofilho@320
   288
	}
renatofilho@320
   289
	
renatofilho@320
   290
  if (g_ascii_strncasecmp (tmp_str->str, "ok", 2)) {
renatofilho@320
   291
  	g_warning ("[%s] FRONTEND_READY request returned %s", __FUNCTION__, tmp_str->str);
renatofilho@320
   292
    g_object_unref (str_list);
renatofilho@320
   293
  	return FALSE;
renatofilho@320
   294
  }
renatofilho@320
   295
renatofilho@320
   296
  g_object_unref (str_list);
renatofilho@320
   297
  return TRUE;
renatofilho@320
   298
renatofilho@320
   299
}
renatofilho@320
   300
renatofilho@320
   301
/** Send a CHECK_CHANNEL command request to the backend, in order to find if a 
renatofilho@320
   302
 * certain channel actually exists.
renatofilho@320
   303
 * 
renatofilho@320
   304
 * @param recorder The GMythRecorder instance.
renatofilho@320
   305
 * @param channel	 The new channel to be checked (string format).
renatofilho@320
   306
 * @return true if success, false if any error happens.
renatofilho@320
   307
 */
renatofilho@320
   308
gboolean
renatofilho@320
   309
gmyth_recorder_check_channel_name (GMythRecorder *recorder, gchar* channel)
renatofilho@320
   310
{
renatofilho@320
   311
	GMythStringList *str_list;
renatofilho@320
   312
	GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER );
renatofilho@320
   313
	
renatofilho@320
   314
	gmyth_debug ("[%s] CHECK_CHANNEL with channel = %s", __FUNCTION__, channel);
renatofilho@320
   315
	
renatofilho@320
   316
	str_list = gmyth_string_list_new ();
renatofilho@320
   317
	
renatofilho@320
   318
	g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); 
renatofilho@320
   319
	
renatofilho@320
   320
	gmyth_string_list_append_string (str_list, tmp_str);
renatofilho@320
   321
	gmyth_string_list_append_string (str_list, g_string_new ("CHECK_CHANNEL"));
renatofilho@320
   322
	gmyth_string_list_append_char_array (str_list, channel);
renatofilho@320
   323
renatofilho@320
   324
	gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list);
renatofilho@320
   325
	
renatofilho@320
   326
    g_string_free (tmp_str, TRUE);
renatofilho@320
   327
    
renatofilho@320
   328
    tmp_str = gmyth_string_list_get_string (str_list, 0);
renatofilho@320
   329
    if (tmp_str == NULL) {
renatofilho@320
   330
    	g_warning ("[%s] CHECK_CHANNEL request returned %s", __FUNCTION__, tmp_str->str);
renatofilho@320
   331
    	return FALSE;
renatofilho@320
   332
	}
renatofilho@320
   333
	
renatofilho@320
   334
    if (g_ascii_strncasecmp (tmp_str->str, "ok", 2) == 0 || g_ascii_strncasecmp (tmp_str->str, "0", 1) == 0 ) {
renatofilho@320
   335
    	g_warning ("[%s] CHECK_CHANNEL request returned %s", __FUNCTION__, tmp_str->str);
renatofilho@320
   336
	    g_object_unref (str_list);
renatofilho@320
   337
    	return FALSE;
renatofilho@320
   338
    }
renatofilho@320
   339
renatofilho@320
   340
    g_object_unref (str_list);
renatofilho@320
   341
    return TRUE;
renatofilho@320
   342
renatofilho@320
   343
}
renatofilho@320
   344
renatofilho@320
   345
/** Send a CHECK_CHANNEL command request to the backend, in order to find if a 
renatofilho@320
   346
 * certain channel actually exists.
renatofilho@320
   347
 * 
renatofilho@320
   348
 * @param recorder The GMythRecorder instance.
renatofilho@320
   349
 * @param channel	 The new channel to be checked (decimal integer value).
renatofilho@320
   350
 * @return true if success, false if any error happens.
renatofilho@320
   351
 */
renatofilho@320
   352
gboolean
renatofilho@320
   353
gmyth_recorder_check_channel (GMythRecorder *recorder, gint channel)
renatofilho@320
   354
{
renatofilho@320
   355
	return gmyth_recorder_check_channel_name( recorder, g_strdup_printf( "%d", channel ) );
renatofilho@320
   356
}
renatofilho@320
   357
renatofilho@320
   358
/** Send a SET_CHANNEL command request to the backend, to start streaming on another 
renatofilho@320
   359
 * TV content channel.
renatofilho@320
   360
 * 
renatofilho@320
   361
 * @param recorder The GMythRecorder instance.
renatofilho@320
   362
 * @param channel	 The new channel to be loaded.
renatofilho@320
   363
 * @return true if success, false if any error happens.
renatofilho@320
   364
 */
renatofilho@320
   365
gboolean
renatofilho@320
   366
gmyth_recorder_set_channel (GMythRecorder *recorder, gint channel)
renatofilho@320
   367
{
renatofilho@320
   368
	GMythStringList *str_list;
renatofilho@320
   369
	GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER );
renatofilho@320
   370
	
renatofilho@320
   371
	gmyth_debug ("[%s] SET_CHANNEL with channel = %d", __FUNCTION__, channel);
renatofilho@320
   372
	
renatofilho@320
   373
	str_list = gmyth_string_list_new ();
renatofilho@320
   374
	
renatofilho@320
   375
	g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); 
renatofilho@320
   376
	
renatofilho@320
   377
	gmyth_string_list_append_string (str_list, tmp_str);
renatofilho@320
   378
	gmyth_string_list_append_string (str_list, g_string_new ("SET_CHANNEL"));
renatofilho@320
   379
	gmyth_string_list_append_int (str_list, channel);
renatofilho@320
   380
renatofilho@320
   381
	gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list);
renatofilho@320
   382
	
renatofilho@320
   383
    g_string_free (tmp_str, TRUE);
renatofilho@320
   384
    
renatofilho@320
   385
    tmp_str = gmyth_string_list_get_string (str_list, 0);
renatofilho@320
   386
    if (tmp_str == NULL) {
renatofilho@320
   387
    	g_warning ("[%s] SET_CHANNEL request returned %s", __FUNCTION__, tmp_str->str);
renatofilho@320
   388
    	return FALSE;
renatofilho@320
   389
	}
renatofilho@320
   390
	
renatofilho@320
   391
    if (g_ascii_strncasecmp (tmp_str->str, "ok", 2)) {
renatofilho@320
   392
    	g_warning ("[%s] SET_CHANNEL request returned %s", __FUNCTION__, tmp_str->str);
renatofilho@320
   393
	    g_object_unref (str_list);
renatofilho@320
   394
    	return FALSE;
renatofilho@320
   395
    }
renatofilho@320
   396
renatofilho@320
   397
    g_object_unref (str_list);
renatofilho@320
   398
    return TRUE;
renatofilho@320
   399
renatofilho@320
   400
}
renatofilho@320
   401
renatofilho@320
   402
/** Send a SET_CHANNEL command request to the backend, to start streaming on another 
renatofilho@320
   403
 * TV content channel.
renatofilho@320
   404
 * 
renatofilho@320
   405
 * @param recorder The GMythRecorder instance.
renatofilho@320
   406
 * @param channel	 The new channel to be loaded.
renatofilho@320
   407
 * @return true if success, false if any error happens.
renatofilho@320
   408
 */
renatofilho@320
   409
gboolean
renatofilho@320
   410
gmyth_recorder_set_channel_name (GMythRecorder *recorder, const gchar* channel)
renatofilho@320
   411
{
renatofilho@320
   412
	GMythStringList *str_list;
renatofilho@320
   413
	GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER );
renatofilho@320
   414
	
renatofilho@320
   415
	gmyth_debug ("[%s] SET_CHANNEL with channel name = %s", __FUNCTION__, channel);
renatofilho@320
   416
	
renatofilho@320
   417
	str_list = gmyth_string_list_new ();
renatofilho@320
   418
	
renatofilho@320
   419
	g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); 
renatofilho@320
   420
	
renatofilho@320
   421
	gmyth_string_list_append_string (str_list, tmp_str);
renatofilho@320
   422
	gmyth_string_list_append_string (str_list, g_string_new ("SET_CHANNEL"));
renatofilho@320
   423
	gmyth_string_list_append_char_array (str_list, channel);
renatofilho@320
   424
renatofilho@320
   425
	gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list);
renatofilho@320
   426
	
renatofilho@320
   427
    g_string_free (tmp_str, TRUE);
renatofilho@320
   428
    
renatofilho@320
   429
    tmp_str = gmyth_string_list_get_string (str_list, 0);
renatofilho@320
   430
    if (tmp_str == NULL) {
renatofilho@320
   431
    	g_warning ("[%s] SET_CHANNEL name request returned %s", __FUNCTION__, tmp_str->str );
renatofilho@320
   432
    	return FALSE;
renatofilho@320
   433
	}
renatofilho@320
   434
	
renatofilho@320
   435
    if (g_ascii_strncasecmp (tmp_str->str, "ok", 2) || g_ascii_strtoull( tmp_str->str, NULL, 10 ) == 0 ) {
renatofilho@320
   436
    	g_warning ("[%s] SET_CHANNEL name request returned %s", __FUNCTION__, tmp_str->str);
renatofilho@320
   437
	    g_object_unref (str_list);
renatofilho@320
   438
    	return FALSE;
renatofilho@320
   439
    }
renatofilho@320
   440
renatofilho@320
   441
    g_object_unref (str_list);
renatofilho@320
   442
    return TRUE;
renatofilho@320
   443
renatofilho@320
   444
}
renatofilho@320
   445
renatofilho@320
   446
/**
renatofilho@320
   447
 * Changes the channel of the actual Recorder.
renatofilho@320
   448
 * 
renatofilho@320
   449
 * CHANNEL_DIRECTION_UP       - Go up one channel in the listing
renatofilho@320
   450
 *
renatofilho@320
   451
 * CHANNEL_DIRECTION_DOWN     - Go down one channel in the listing
renatofilho@320
   452
 *
renatofilho@320
   453
 * CHANNEL_DIRECTION_FAVORITE - Go to the next favorite channel
renatofilho@320
   454
 *
renatofilho@320
   455
 * CHANNEL_DIRECTION_SAME     - Stay
renatofilho@320
   456
 * 
renatofilho@320
   457
 * @param recorder 	 The GMythRecorder instance.
renatofilho@320
   458
 * @param direction	 The new channel direction where to move to.
renatofilho@320
   459
 * @return true if success, false if any error happens.
renatofilho@320
   460
 */
renatofilho@320
   461
gboolean
renatofilho@320
   462
gmyth_recorder_change_channel (GMythRecorder *recorder, const GMythRecorderChannelChangeDirection direction)
renatofilho@320
   463
{
renatofilho@320
   464
	GMythStringList *str_list;
renatofilho@320
   465
	GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER );
renatofilho@320
   466
	
renatofilho@320
   467
	gmyth_debug ("[%s] CHANGE_CHANNEL to the channel direction = %u", __FUNCTION__, direction);
renatofilho@320
   468
	
renatofilho@320
   469
	str_list = gmyth_string_list_new ();
renatofilho@320
   470
	
renatofilho@320
   471
	g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); 
renatofilho@320
   472
	
renatofilho@320
   473
	gmyth_string_list_append_string (str_list, tmp_str);
renatofilho@320
   474
	gmyth_string_list_append_string (str_list, g_string_new ("CHANGE_CHANNEL"));
renatofilho@320
   475
	gmyth_string_list_append_int (str_list, direction);
renatofilho@320
   476
renatofilho@320
   477
	gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list);
renatofilho@320
   478
	
renatofilho@320
   479
    g_string_free (tmp_str, TRUE);
renatofilho@320
   480
    
renatofilho@320
   481
    tmp_str = gmyth_string_list_get_string (str_list, 0);
renatofilho@320
   482
    if (tmp_str == NULL) {
renatofilho@320
   483
    	g_warning ("[%s] CHANGE_CHANNEL name request returned %s", __FUNCTION__, tmp_str->str );
renatofilho@320
   484
    	return FALSE;
renatofilho@320
   485
	}
renatofilho@320
   486
	
renatofilho@320
   487
    if (g_ascii_strncasecmp (tmp_str->str, "ok", 2) || g_ascii_strtoull( tmp_str->str, NULL, 10 ) == 0 ) {
renatofilho@320
   488
    	g_warning ("[%s] CHANGE_CHANNEL name request returned %s", __FUNCTION__, tmp_str->str);
renatofilho@320
   489
	    g_object_unref (str_list);
renatofilho@320
   490
    	return FALSE;
renatofilho@320
   491
    }
renatofilho@320
   492
renatofilho@320
   493
    g_object_unref (str_list);
renatofilho@320
   494
    return TRUE;
renatofilho@320
   495
renatofilho@320
   496
}
renatofilho@320
   497
renatofilho@320
   498
/** Send a PAUSE command request to the backend, to pause streaming on another 
renatofilho@320
   499
 * TV content channel.
renatofilho@320
   500
 * 
renatofilho@320
   501
 * @param recorder The GMythRecorder instance.
renatofilho@320
   502
 * @return true if success, false if any error happens.
renatofilho@320
   503
 */
renatofilho@320
   504
gboolean
renatofilho@320
   505
gmyth_recorder_pause_recording ( GMythRecorder *recorder )
renatofilho@320
   506
{
renatofilho@320
   507
	GMythStringList *str_list;
renatofilho@320
   508
	GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER );
renatofilho@320
   509
	
renatofilho@320
   510
	gmyth_debug ("[%s] PAUSE", __FUNCTION__);
renatofilho@320
   511
	
renatofilho@320
   512
	str_list = gmyth_string_list_new ();
renatofilho@320
   513
	
renatofilho@320
   514
	g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); 
renatofilho@320
   515
	
renatofilho@320
   516
	gmyth_string_list_append_string (str_list, tmp_str);
renatofilho@320
   517
	gmyth_string_list_append_string (str_list, g_string_new ("PAUSE"));
renatofilho@320
   518
renatofilho@320
   519
	gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list);
renatofilho@320
   520
	
renatofilho@320
   521
    g_string_free (tmp_str, TRUE);
renatofilho@320
   522
    
renatofilho@320
   523
    tmp_str = gmyth_string_list_get_string (str_list, 0);
renatofilho@320
   524
    if (tmp_str == NULL) {
renatofilho@320
   525
    	g_warning ("[%s] PAUSE name request returned %s", __FUNCTION__, tmp_str->str);
renatofilho@320
   526
    	return FALSE;
renatofilho@320
   527
	}
renatofilho@320
   528
	
renatofilho@320
   529
    if (g_ascii_strncasecmp (tmp_str->str, "ok", 2)) {
renatofilho@320
   530
    	g_warning ("[%s] PAUSE name request returned %s", __FUNCTION__, tmp_str->str);
renatofilho@320
   531
	    g_object_unref (str_list);
renatofilho@320
   532
    	return FALSE;
renatofilho@320
   533
    }
renatofilho@320
   534
renatofilho@320
   535
    g_object_unref (str_list);
renatofilho@320
   536
    return TRUE;
renatofilho@320
   537
renatofilho@320
   538
}
renatofilho@320
   539
renatofilho@320
   540
/**
renatofilho@320
   541
 * Requests the actual program info from the MythTV backend server.
renatofilho@320
   542
 * 
renatofilho@320
   543
 * @param recorder The GMythRecorder instance.
renatofilho@320
   544
 * @return The actual program info.
renatofilho@320
   545
 */
renatofilho@320
   546
GMythProgramInfo *
renatofilho@320
   547
gmyth_recorder_get_current_program_info ( GMythRecorder *recorder )
renatofilho@320
   548
{
renatofilho@320
   549
	GMythStringList *str_list;
renatofilho@320
   550
	GMythProgramInfo *program_info = gmyth_program_info_new();
renatofilho@320
   551
	GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER );
renatofilho@320
   552
	
renatofilho@320
   553
	str_list = gmyth_string_list_new ();
renatofilho@320
   554
	
renatofilho@320
   555
	g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); 
renatofilho@320
   556
	
renatofilho@320
   557
	gmyth_string_list_append_string (str_list, tmp_str);
renatofilho@320
   558
	
renatofilho@320
   559
	if ( recorder->myth_socket->mythtv_version >= 26 )
renatofilho@320
   560
		gmyth_string_list_append_string (str_list, g_string_new ("GET_CURRENT_RECORDING"));
renatofilho@320
   561
	else
renatofilho@320
   562
		gmyth_string_list_append_string (str_list, g_string_new ("GET_PROGRAM_INFO"));
renatofilho@320
   563
renatofilho@320
   564
	gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list);
renatofilho@320
   565
renatofilho@320
   566
  g_string_free (tmp_str, TRUE);
renatofilho@320
   567
renatofilho@320
   568
  if (str_list == NULL) {
renatofilho@320
   569
  	g_warning ("[%s] GET_PROGRAM_INFO request returned. Error getting program info, string list equals to NULL!", __FUNCTION__);
renatofilho@320
   570
  	return FALSE;
renatofilho@320
   571
	}
renatofilho@320
   572
  
renatofilho@320
   573
  program_info = gmyth_program_info_from_string_list( str_list );
renatofilho@320
   574
renatofilho@320
   575
  if ( NULL == program_info ) {
renatofilho@320
   576
  	g_warning ("[%s] GET_PROGRAM_INFO request returned. Error getting program info, it is equals to NULL!!!", __FUNCTION__);
renatofilho@320
   577
    g_object_unref (program_info);
renatofilho@320
   578
  	return NULL;
renatofilho@320
   579
  }
renatofilho@320
   580
renatofilho@320
   581
  g_object_unref (str_list);
renatofilho@320
   582
  return program_info;
renatofilho@320
   583
renatofilho@320
   584
}
renatofilho@320
   585
renatofilho@320
   586
gint64
renatofilho@320
   587
gmyth_recorder_get_file_position ( GMythRecorder *recorder )
renatofilho@320
   588
{
renatofilho@320
   589
  gint64 pos = 0;
renatofilho@320
   590
  GString *query = g_string_new( GMYTHTV_RECORDER_HEADER );
renatofilho@320
   591
renatofilho@320
   592
  GMythStringList *str_list = gmyth_string_list_new ();
renatofilho@320
   593
renatofilho@320
   594
  g_string_append_printf( query, " %d", recorder->recorder_num );
renatofilho@320
   595
renatofilho@320
   596
  gmyth_string_list_append_string (str_list, query);
renatofilho@320
   597
  gmyth_string_list_append_char_array( str_list, "GET_FILE_POSITION" );
renatofilho@320
   598
renatofilho@320
   599
  gmyth_socket_sendreceive_stringlist ( recorder->myth_socket, str_list );
renatofilho@320
   600
renatofilho@320
   601
  if ( str_list != NULL && gmyth_string_list_length(str_list) > 0 ) 
renatofilho@320
   602
  {
renatofilho@320
   603
    GString *str = NULL;
renatofilho@320
   604
    if ( ( str = gmyth_string_list_get_string( str_list, 0 ) ) != NULL && strstr ( str->str, "bad" ) == NULL )
renatofilho@320
   605
      pos = gmyth_util_decode_long_long( str_list, 0 );
renatofilho@320
   606
  } 
renatofilho@320
   607
renatofilho@320
   608
#ifndef GMYTHTV_ENABLE_DEBUG
renatofilho@320
   609
  g_print( "[%s] Got file position = %lld\n", __FUNCTION__, pos );
renatofilho@320
   610
#endif
renatofilho@320
   611
  if (str_list!=NULL)
renatofilho@320
   612
    g_object_unref (str_list);
renatofilho@320
   613
renatofilho@320
   614
  return pos;
renatofilho@320
   615
renatofilho@320
   616
}
renatofilho@320
   617
renatofilho@320
   618
gboolean
renatofilho@320
   619
gmyth_recorder_is_recording ( GMythRecorder *recorder )
renatofilho@320
   620
{
renatofilho@320
   621
  gboolean ret = TRUE;
renatofilho@320
   622
  
renatofilho@320
   623
  g_return_val_if_fail( recorder != NULL, FALSE );
renatofilho@320
   624
renatofilho@320
   625
  GMythStringList *str_list = gmyth_string_list_new ();
renatofilho@320
   626
  GString *message = g_string_new ("");
renatofilho@320
   627
renatofilho@320
   628
  g_string_printf( message, "%s %d", GMYTHTV_RECORDER_HEADER, recorder->recorder_num);
renatofilho@320
   629
  gmyth_string_list_append_string (str_list, message);
renatofilho@320
   630
  gmyth_string_list_append_string (str_list, g_string_new ("IS_RECORDING"));
renatofilho@320
   631
renatofilho@320
   632
  gmyth_socket_sendreceive_stringlist ( recorder->myth_socket, str_list );
renatofilho@320
   633
renatofilho@320
   634
  if ( str_list != NULL && gmyth_string_list_length(str_list) > 0 )
renatofilho@320
   635
  {
renatofilho@320
   636
    GString *str = NULL;
renatofilho@320
   637
    if ( ( str = gmyth_string_list_get_string( str_list, 0 ) ) != NULL && strcmp( str->str, "bad" )!= 0 ) 
renatofilho@320
   638
    {
renatofilho@320
   639
      gint is_rec = gmyth_string_list_get_int( str_list, 0 );
renatofilho@320
   640
      if ( is_rec != 0 )
renatofilho@320
   641
        ret = TRUE;
renatofilho@320
   642
      else
renatofilho@320
   643
        ret = FALSE;
renatofilho@320
   644
    }
renatofilho@320
   645
  }
renatofilho@320
   646
  gmyth_debug( "%s, stream is %s being recorded!\n", ret ? "YES" : "NO", ret ? "" : "NOT" );
renatofilho@320
   647
  //g_static_mutex_unlock (&mutex);
renatofilho@320
   648
renatofilho@320
   649
  if ( str_list != NULL )
renatofilho@320
   650
    g_object_unref (str_list);
renatofilho@320
   651
renatofilho@320
   652
  return ret;
renatofilho@320
   653
renatofilho@320
   654
}