branches/gmyth-0.1b/src/gmyth_util.c
author rosfran
Tue Feb 06 00:33:35 2007 +0000 (2007-02-06)
branchtrunk
changeset 326 81b1f3006eb2
permissions -rw-r--r--
[svn r328] Some fixes on program info, and some memory clean ups.
renatofilho@320
     1
/**
renatofilho@320
     2
* GMyth Library
renatofilho@320
     3
*
renatofilho@320
     4
* @file gmyth/gmyth_util.c
renatofilho@320
     5
* 
renatofilho@320
     6
* @brief <p> This component provides utility functions.
renatofilho@320
     7
* 
renatofilho@320
     8
* Copyright (C) 2006 INdT - Instituto Nokia de Tecnologia.
renatofilho@320
     9
* @author Hallyson Luiz de Morais Melo <hallyson.melo@indt.org.br>
renatofilho@320
    10
*
renatofilho@320
    11
*//*
renatofilho@320
    12
* 
renatofilho@320
    13
* This program is free software; you can redistribute it and/or modify
renatofilho@320
    14
* it under the terms of the GNU Lesser General Public License as published by
renatofilho@320
    15
* the Free Software Foundation; either version 2 of the License, or
renatofilho@320
    16
* (at your option) any later version.
renatofilho@320
    17
*
renatofilho@320
    18
* This program is distributed in the hope that it will be useful,
renatofilho@320
    19
* but WITHOUT ANY WARRANTY; without even the implied warranty of
renatofilho@320
    20
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
renatofilho@320
    21
* GNU General Public License for more details.
renatofilho@320
    22
*
renatofilho@320
    23
* You should have received a copy of the GNU Lesser General Public License
renatofilho@320
    24
* along with this program; if not, write to the Free Software
renatofilho@320
    25
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
renatofilho@320
    26
*/
renatofilho@320
    27
 
renatofilho@320
    28
#ifdef HAVE_CONFIG_H
renatofilho@320
    29
#include "config.h"
renatofilho@320
    30
#endif
renatofilho@320
    31
renatofilho@320
    32
#define _XOPEN_SOURCE
renatofilho@320
    33
#define _XOPEN_SOURCE_EXTENDED
renatofilho@320
    34
#define __USE_MISC
renatofilho@320
    35
renatofilho@320
    36
#include <glib.h>
renatofilho@320
    37
#include <glib/gprintf.h>
renatofilho@320
    38
#include <time.h>
renatofilho@320
    39
#include <sys/time.h>
renatofilho@320
    40
#include <sys/timex.h>
renatofilho@320
    41
renatofilho@320
    42
#include "gmyth.h"
renatofilho@320
    43
renatofilho@320
    44
#if !GLIB_CHECK_VERSION (2, 10, 0)
renatofilho@320
    45
gchar *
renatofilho@320
    46
g_time_val_to_iso8601 (GTimeVal *time_);
renatofilho@320
    47
gboolean
renatofilho@320
    48
g_time_val_from_iso8601 (const gchar *iso_date,
renatofilho@320
    49
                         GTimeVal    *time_);
renatofilho@320
    50
void
renatofilho@320
    51
g_date_set_time_val (GDate    *date,
renatofilho@320
    52
             GTimeVal *timeval);
renatofilho@320
    53
renatofilho@320
    54
#endif
renatofilho@320
    55
renatofilho@320
    56
static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
renatofilho@320
    57
renatofilho@320
    58
/** Converts a time_t struct in a GString at ISO standard format 
renatofilho@320
    59
 * (e.g. 2006-07-20T09:56:41).
renatofilho@320
    60
 * 
renatofilho@320
    61
 * The returned GString memory should be deallocated from 
renatofilho@320
    62
 * the calling function.
renatofilho@320
    63
 *
renatofilho@320
    64
 * @param time_value the time value to be converted
renatofilho@320
    65
 * @return GString* the converted isoformat string 
renatofilho@320
    66
 */
renatofilho@320
    67
GString*
renatofilho@320
    68
gmyth_util_time_to_isoformat (time_t time_value)
renatofilho@320
    69
{
renatofilho@320
    70
	struct tm tm_time;
renatofilho@320
    71
	GString *result;
renatofilho@320
    72
	
renatofilho@320
    73
	g_static_mutex_lock ( &mutex );
renatofilho@320
    74
	
renatofilho@320
    75
	if (localtime_r(&time_value, &tm_time) == NULL) {
renatofilho@320
    76
	    g_static_mutex_unlock ( &mutex );
renatofilho@320
    77
	    g_warning ("gmyth_util_time_to_isoformat convertion error!\n");
renatofilho@320
    78
            return NULL;
renatofilho@320
    79
	}
renatofilho@320
    80
	
renatofilho@320
    81
	result = g_string_sized_new(20);
renatofilho@320
    82
	g_string_printf(result, "%04d-%02d-%02dT%02d:%02d:%02d",
renatofilho@320
    83
		tm_time.tm_year + 1900, tm_time.tm_mon + 1, tm_time.tm_mday,
renatofilho@320
    84
		tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec);
renatofilho@320
    85
		
renatofilho@320
    86
	gmyth_debug( "Result (ISO 8601) = %s", result->str );
renatofilho@320
    87
renatofilho@320
    88
	g_static_mutex_unlock ( &mutex );
renatofilho@320
    89
	
renatofilho@320
    90
	return result;
renatofilho@320
    91
}
renatofilho@320
    92
renatofilho@320
    93
/** Converts a time_t struct in a GString at ISO standard format 
renatofilho@320
    94
 * (e.g. 2006-07-20T09:56:41).
renatofilho@320
    95
 * 
renatofilho@320
    96
 * The returned GString memory should be deallocated from 
renatofilho@320
    97
 * the calling function.
renatofilho@320
    98
 *
renatofilho@320
    99
 * @param time_value the GTimeValue to be converted
renatofilho@320
   100
 * @return GString* the converted isoformat string 
renatofilho@320
   101
 */
renatofilho@320
   102
gchar*
renatofilho@320
   103
gmyth_util_time_to_isoformat_from_time_val_fmt ( const gchar *fmt_string, const GTimeVal* time_val )
renatofilho@320
   104
{
renatofilho@320
   105
	gchar *result = NULL;
renatofilho@320
   106
	struct tm *tm_time = NULL;
renatofilho@320
   107
	
renatofilho@320
   108
	gint buffer_len = 0;
renatofilho@320
   109
	
renatofilho@320
   110
	g_return_val_if_fail( fmt_string != NULL, NULL );
renatofilho@320
   111
		
renatofilho@320
   112
	g_return_val_if_fail( time_val != NULL, NULL );
renatofilho@320
   113
 
renatofilho@320
   114
	time_t time = time_val->tv_sec;// + (gint)( time_val->tv_usec / G_USEC_PER_SEC );
renatofilho@320
   115
renatofilho@320
   116
	tm_time = g_malloc0( sizeof(struct tm) );
renatofilho@320
   117
renatofilho@320
   118
	g_static_mutex_lock ( &mutex );
renatofilho@320
   119
	
renatofilho@320
   120
	if ( NULL == localtime_r( &time, tm_time ) ) {
renatofilho@320
   121
		g_warning ("gmyth_util_time_to_isoformat convertion error!\n");
renatofilho@320
   122
	}	else {
renatofilho@320
   123
		// we first check the return of strftime to allocate a buffer of the correct size
renatofilho@320
   124
	  buffer_len = strftime( NULL, SSIZE_MAX, fmt_string, tm_time );
renatofilho@320
   125
	  if ( buffer_len > 0 ) {
renatofilho@320
   126
	    result = g_malloc0( buffer_len + 1 );
renatofilho@320
   127
	    if( result == NULL ){
renatofilho@320
   128
				g_static_mutex_unlock ( &mutex );
renatofilho@320
   129
				g_warning ("gmyth_util_time_to_isoformat convertion error!\n");
renatofilho@320
   130
				return NULL;
renatofilho@320
   131
	    }
renatofilho@320
   132
	    strftime( result, buffer_len + 1, fmt_string, tm_time );
renatofilho@320
   133
	    gmyth_debug( "Dateline (ISO result): %s", result );
renatofilho@320
   134
	  }
renatofilho@320
   135
		
renatofilho@320
   136
	}
renatofilho@320
   137
	
renatofilho@320
   138
	gmyth_debug( "Result (strftime) = %s", result );
renatofilho@320
   139
	
renatofilho@320
   140
	//strptime( result, "%Y-%m-%dT%H:%M:%SZ", tm_time ); 
renatofilho@320
   141
	
renatofilho@320
   142
	//strftime( result, strlen(result), fmt_string, tm_time );
renatofilho@320
   143
	
renatofilho@320
   144
	g_static_mutex_unlock ( &mutex );
renatofilho@320
   145
	
renatofilho@320
   146
	gmyth_debug( "Result (ISO 8601) = %s", result  );
renatofilho@320
   147
	
renatofilho@320
   148
	return result;	
renatofilho@320
   149
		
renatofilho@320
   150
}
renatofilho@320
   151
renatofilho@320
   152
/** Converts a time_t struct in a GString at ISO standard format 
renatofilho@320
   153
 * (e.g. 2006-07-20 09:56:41).
renatofilho@320
   154
 * 
renatofilho@320
   155
 * The returned GString memory should be deallocated from 
renatofilho@320
   156
 * the calling function.
renatofilho@320
   157
 *
renatofilho@320
   158
 * @param time_value the GTimeValue to be converted
renatofilho@320
   159
 * @return GString* the converted isoformat string 
renatofilho@320
   160
 */
renatofilho@320
   161
gchar*
renatofilho@320
   162
gmyth_util_time_to_isoformat_from_time_val ( const GTimeVal* time )
renatofilho@320
   163
{
renatofilho@320
   164
	gchar *result = gmyth_util_time_to_isoformat_from_time_val_fmt( "%Y-%m-%d %H:%M:%S", time );
renatofilho@320
   165
	//result[10] = ' ';
renatofilho@320
   166
	//result[ strlen(result) - 1] = '\0';
renatofilho@320
   167
	
renatofilho@320
   168
	return result;	
renatofilho@320
   169
}
renatofilho@320
   170
renatofilho@320
   171
/** Converts a time_t struct in a GString at ISO standard format 2 
renatofilho@320
   172
 * (e.g. 2006-07-20T09:56:41).
renatofilho@320
   173
 * 
renatofilho@320
   174
 * The returned GString memory should be deallocated from 
renatofilho@320
   175
 * the calling function.
renatofilho@320
   176
 *
renatofilho@320
   177
 * @param time_value the GTimeValue to be converted
renatofilho@320
   178
 * @return GString* the converted isoformat string 
renatofilho@320
   179
 */
renatofilho@320
   180
gchar*
renatofilho@320
   181
gmyth_util_time_to_mythformat_from_time_val ( const GTimeVal* time )
renatofilho@320
   182
{
renatofilho@320
   183
	gchar *result = gmyth_util_time_to_isoformat_from_time_val_fmt( "%Y-%m-%dT%H:%M:%S", time );
renatofilho@320
   184
	return result;	
renatofilho@320
   185
}
renatofilho@320
   186
renatofilho@320
   187
/** Converts a time_t struct in a GString at ISO standard format 
renatofilho@320
   188
 * (e.g. 2006-07-20T09:56:41).
renatofilho@320
   189
 * 
renatofilho@320
   190
 * The returned GString memory should be deallocated from 
renatofilho@320
   191
 * the calling function.
renatofilho@320
   192
 *
renatofilho@320
   193
 * @param time_value the GTimeValue to be converted
renatofilho@320
   194
 * @return GString* the converted isoformat string 
renatofilho@320
   195
 */
renatofilho@320
   196
gchar*
renatofilho@320
   197
gmyth_util_time_to_string_only_date ( const GTimeVal* time )
renatofilho@320
   198
{
renatofilho@320
   199
	gchar *result = gmyth_util_time_to_isoformat_from_time_val_fmt( "%Y-%m-%d", time );
renatofilho@320
   200
	//result[10] = ' ';
renatofilho@320
   201
	//result[ strlen(result) - 1] = '\0';
renatofilho@320
   202
	return result;
renatofilho@320
   203
}
renatofilho@320
   204
renatofilho@320
   205
/** Converts a time_t struct in a GString at ISO standard format 
renatofilho@320
   206
 * (e.g. 2006-07-20T09:56:41).
renatofilho@320
   207
 * 
renatofilho@320
   208
 * The returned GString memory should be deallocated from 
renatofilho@320
   209
 * the calling function.
renatofilho@320
   210
 *
renatofilho@320
   211
 * @param time_value the GTimeValue to be converted
renatofilho@320
   212
 * @return GString* the converted isoformat string 
renatofilho@320
   213
 */
renatofilho@320
   214
gchar*
renatofilho@320
   215
gmyth_util_time_to_string_only_time ( const GTimeVal* time )
renatofilho@320
   216
{
renatofilho@320
   217
	gchar *result = gmyth_util_time_to_isoformat_from_time_val_fmt( "%H:%M:%S", time );	 
renatofilho@320
   218
	//result[10] = ' ';
renatofilho@320
   219
	//result[ strlen(result) - 1] = '\0';
renatofilho@320
   220
	return result;
renatofilho@320
   221
}
renatofilho@320
   222
renatofilho@320
   223
/** Converts a time_t struct in a GString to the following 
renatofilho@320
   224
 * format (e.g. 2006-07-20 09:56:41).
renatofilho@320
   225
 * 
renatofilho@320
   226
 * The returned GString memory should be deallocated from 
renatofilho@320
   227
 * the calling function.
renatofilho@320
   228
 *
renatofilho@320
   229
 * @param time_value the time value to be converted
renatofilho@320
   230
 * @return GString* the converted string 
renatofilho@320
   231
 */
renatofilho@320
   232
GString*
renatofilho@320
   233
gmyth_util_time_to_string (time_t time_value)
renatofilho@320
   234
{
renatofilho@320
   235
	GString *result = gmyth_util_time_to_isoformat (time_value);
renatofilho@320
   236
	result->str[10] = ' ';	
renatofilho@320
   237
	result->str[ strlen(result->str) - 1] = '\0';
renatofilho@320
   238
renatofilho@320
   239
	return result;
renatofilho@320
   240
}
renatofilho@320
   241
renatofilho@320
   242
/** Converts a time_t struct in a GString to the following 
renatofilho@320
   243
 * format (e.g. 2006-07-20 09:56:41).
renatofilho@320
   244
 * 
renatofilho@320
   245
 * The returned GString memory should be deallocated from 
renatofilho@320
   246
 * the calling function.
renatofilho@320
   247
 *
renatofilho@320
   248
 * @param time_value the time value to be converted
renatofilho@320
   249
 * @return GString* the converted string 
renatofilho@320
   250
 */
renatofilho@320
   251
gchar*
renatofilho@320
   252
gmyth_util_time_to_string_from_time_val ( const GTimeVal *time_val )
renatofilho@320
   253
{
renatofilho@320
   254
	gchar *result = gmyth_util_time_to_isoformat_from_time_val_fmt ( "%Y-%m-%d %H:%M:%S", time_val );
renatofilho@320
   255
	//result[10] = ' ';
renatofilho@320
   256
renatofilho@320
   257
	return result;
renatofilho@320
   258
}
renatofilho@320
   259
renatofilho@320
   260
/** Converts a GString in the following format 
renatofilho@320
   261
 * (e.g. 2006-07-20 09:56:41) to a time_t struct.
renatofilho@320
   262
 * 
renatofilho@320
   263
 * @param time_str the string to be converted
renatofilho@320
   264
 * @return time_t the time converted value
renatofilho@320
   265
 */
renatofilho@320
   266
time_t
renatofilho@320
   267
gmyth_util_string_to_time (GString* time_str)
renatofilho@320
   268
{
renatofilho@320
   269
	gint year, month, day, hour, min, sec;
renatofilho@320
   270
    
renatofilho@320
   271
	gmyth_debug( "[%s] time_str = %s. [%s]", __FUNCTION__, time_str != NULL ? 
renatofilho@320
   272
					time_str->str : "[time string is NULL!]", time_str->str );
renatofilho@320
   273
renatofilho@320
   274
	if ( sscanf (time_str->str, "%04d-%02d-%02d %02d:%02d:%02d",
renatofilho@320
   275
			&year, &month, &day, &hour, &min, &sec) < 3 ) {
renatofilho@320
   276
		g_warning ("GMythUtil: isoformat_to_time converter error!\n");
renatofilho@320
   277
		return 0;
renatofilho@320
   278
	}
renatofilho@320
   279
	
renatofilho@320
   280
	g_static_mutex_lock ( &mutex );
renatofilho@320
   281
	
renatofilho@320
   282
	struct tm* tm_time = g_malloc0( sizeof(struct tm) );
renatofilho@320
   283
	tm_time->tm_year = year - 1900;
renatofilho@320
   284
	tm_time->tm_mon = month - 1;
renatofilho@320
   285
	tm_time->tm_mday = day;
renatofilho@320
   286
	tm_time->tm_hour = hour;
renatofilho@320
   287
	tm_time->tm_min = min;
renatofilho@320
   288
	tm_time->tm_sec = sec;
renatofilho@320
   289
	
renatofilho@320
   290
	g_static_mutex_unlock ( &mutex );
renatofilho@320
   291
	
renatofilho@320
   292
	return mktime( tm_time );
renatofilho@320
   293
}
renatofilho@320
   294
renatofilho@320
   295
/** Converts a GString in the following format 
renatofilho@320
   296
 * (e.g. 2006-07-20 09:56:41) to a time_t struct.
renatofilho@320
   297
 * 
renatofilho@320
   298
 * @param time_str the string to be converted
renatofilho@320
   299
 * @return time_t the time converted value
renatofilho@320
   300
 */
renatofilho@320
   301
struct tm*
renatofilho@320
   302
gmyth_util_time_val_to_date ( const GTimeVal* time )
renatofilho@320
   303
{
renatofilho@320
   304
	struct tm *date = g_malloc0( sizeof( struct tm ) );
renatofilho@320
   305
	time_t time_micros = time->tv_sec;// + (gint)( time->tv_usec / G_USEC_PER_SEC );
renatofilho@320
   306
    
renatofilho@320
   307
  if ( NULL == date ) { 
renatofilho@320
   308
		g_warning ( "GMythUtil: GDate *gmyth_util_time_val_to_date (GTimeVal* time) - converter error!\n" );
renatofilho@320
   309
		return NULL;
renatofilho@320
   310
	}
renatofilho@320
   311
	
renatofilho@320
   312
	if ( NULL == localtime_r( &time_micros, date ) ) {
renatofilho@320
   313
		g_warning ( "gmyth_util_time_to_isoformat convertion error!\n" );
renatofilho@320
   314
		return NULL;
renatofilho@320
   315
	}
renatofilho@320
   316
renatofilho@320
   317
	gmyth_debug( "Converted from GTimeVal == %s to GDate", asctime( date ) );
renatofilho@320
   318
	
renatofilho@320
   319
	return date;
renatofilho@320
   320
}
renatofilho@320
   321
renatofilho@320
   322
/** Converts a GString in the following format 
renatofilho@320
   323
 * (e.g. 2006-07-20 09:56:41) to a time_t struct.
renatofilho@320
   324
 * 
renatofilho@320
   325
 * @param time_str the string to be converted
renatofilho@320
   326
 * @return time_t the time converted value
renatofilho@320
   327
 */
renatofilho@320
   328
GTimeVal*
renatofilho@320
   329
gmyth_util_string_to_time_val_fmt ( const gchar *fmt_string, const gchar* time_str )
renatofilho@320
   330
{
renatofilho@320
   331
	GTimeVal *time = g_new0( GTimeVal, 1 );
renatofilho@320
   332
	struct tm* tm_time = NULL;
renatofilho@320
   333
	time_t time_micros;
renatofilho@320
   334
	gint result;
renatofilho@320
   335
renatofilho@320
   336
	gmyth_debug( "[%s] time_str = %s. [%s]", time_str, time_str != NULL ? 
renatofilho@320
   337
					time_str : "[time string is NULL!]", time_str );
renatofilho@320
   338
renatofilho@320
   339
	if ( NULL == time_str ) 
renatofilho@320
   340
	{ 
renatofilho@320
   341
		g_warning ("GMythUtil: isoformat_to_time converter error!\n");
renatofilho@320
   342
		return NULL;
renatofilho@320
   343
	}
renatofilho@320
   344
	
renatofilho@320
   345
	g_static_mutex_lock ( &mutex );
renatofilho@320
   346
	
renatofilho@320
   347
	tm_time = g_malloc0( sizeof(struct tm) );
renatofilho@320
   348
renatofilho@320
   349
	/* we first check the return of strftime to allocate a buffer of the correct size */
renatofilho@320
   350
  result = strptime( time_str, "%Y-%m-%dT%H:%M:%S", tm_time );
renatofilho@320
   351
  if ( NULL == result ) {
renatofilho@320
   352
		/* we first check the return of strftime to allocate a buffer of the correct size */
renatofilho@320
   353
	  result = strptime( time_str, "%Y-%m-%dT%H:%M:%SZ", tm_time );
renatofilho@320
   354
	  if ( NULL == result ) {
renatofilho@320
   355
	  	/* we first check the return of strftime to allocate a buffer of the correct size */
renatofilho@320
   356
		  result = strptime( time_str, "%Y-%m-%d %H:%M:%S", tm_time );
renatofilho@320
   357
		  if ( NULL == result ) {
renatofilho@320
   358
		  	g_static_mutex_unlock ( &mutex );
renatofilho@320
   359
		    gmyth_debug( "Dateline (ISO result): %s", result );
renatofilho@320
   360
		    time = NULL;
renatofilho@320
   361
		    //goto done;	    
renatofilho@320
   362
		  }
renatofilho@320
   363
	  }
renatofilho@320
   364
  }
renatofilho@320
   365
  
renatofilho@320
   366
  time_micros = mktime( tm_time );
renatofilho@320
   367
		
renatofilho@320
   368
	time->tv_sec = time_micros; // + (gint)( time_val->tv_usec / G_USEC_PER_SEC );
renatofilho@320
   369
	
renatofilho@320
   370
	gmyth_debug( "After mktime call... = %s", asctime(tm_time) );
renatofilho@320
   371
renatofilho@320
   372
	g_static_mutex_unlock ( &mutex );
renatofilho@320
   373
renatofilho@320
   374
	return time;
renatofilho@320
   375
}
renatofilho@320
   376
renatofilho@320
   377
/** Converts a GString in the following format 
renatofilho@320
   378
 * (e.g. 2006-07-20 09:56:41) to a time_t struct.
renatofilho@320
   379
 * 
renatofilho@320
   380
 * @param time_str the string to be converted
renatofilho@320
   381
 * @return time_t the time converted value
renatofilho@320
   382
 */
renatofilho@320
   383
GTimeVal*
renatofilho@320
   384
gmyth_util_string_to_time_val ( const gchar* time_str )
renatofilho@320
   385
{
renatofilho@320
   386
	GTimeVal *time = gmyth_util_string_to_time_val_fmt ( "%Y-%m-%d %H:%M:%S", time_str );	
renatofilho@320
   387
	
renatofilho@320
   388
	return time;
renatofilho@320
   389
}
renatofilho@320
   390
renatofilho@320
   391
/** Decodes a long long variable from the string list
renatofilho@320
   392
 * format of the myhtprotocol.
renatofilho@320
   393
 * 
renatofilho@320
   394
 * @param strlist the string list of mythprotocol values
renatofilho@320
   395
 * @param offset  the list node offset of the long long variable
renatofilho@320
   396
 * @return gint64  the long long converted value
renatofilho@320
   397
 */
renatofilho@320
   398
gint64
renatofilho@320
   399
gmyth_util_decode_long_long(GMythStringList *strlist, guint offset) 
renatofilho@320
   400
{
renatofilho@320
   401
renatofilho@320
   402
	gint64 ret_value = 0LL;
renatofilho@320
   403
renatofilho@320
   404
	g_return_val_if_fail( strlist != NULL, ret_value );
renatofilho@320
   405
renatofilho@320
   406
	if ( offset > gmyth_string_list_length( strlist ))
renatofilho@320
   407
		g_printerr( "[%s] Offset is greater than the Stringlist (offset = %d)!\n", 
renatofilho@320
   408
                    __FUNCTION__, offset );
renatofilho@320
   409
    
renatofilho@320
   410
	g_return_val_if_fail( offset < gmyth_string_list_length( strlist ), ret_value );
renatofilho@320
   411
renatofilho@320
   412
	gint l1 = gmyth_string_list_get_int( strlist, offset );
renatofilho@320
   413
	gint l2 = gmyth_string_list_get_int( strlist, offset + 1 );
renatofilho@320
   414
renatofilho@320
   415
	ret_value = (l2 /*& 0xffffffffLL*/) | ( (gint64)l1 << 32 );
renatofilho@320
   416
renatofilho@320
   417
	return ret_value;
renatofilho@320
   418
renatofilho@320
   419
}
renatofilho@320
   420
renatofilho@320
   421
gboolean
renatofilho@320
   422
gmyth_util_file_exists (GMythBackendInfo *backend_info, const gchar* filename)
renatofilho@320
   423
{
renatofilho@320
   424
    GMythSocket *socket;
renatofilho@320
   425
    gboolean res;
renatofilho@320
   426
    
renatofilho@320
   427
    socket = gmyth_socket_new ();
renatofilho@320
   428
    res = gmyth_socket_connect_to_backend (socket, backend_info->hostname,
renatofilho@320
   429
		    backend_info->port, TRUE);
renatofilho@320
   430
renatofilho@320
   431
    if (res == TRUE) {
renatofilho@320
   432
        GMythStringList *slist;
renatofilho@320
   433
        GMythProgramInfo *program = NULL;
renatofilho@320
   434
renatofilho@320
   435
        program = gmyth_program_info_new();
renatofilho@320
   436
        program->pathname = g_string_new (filename);
renatofilho@320
   437
renatofilho@320
   438
        slist = gmyth_string_list_new ();
renatofilho@320
   439
        gmyth_string_list_append_char_array (slist, "QUERY_CHECKFILE");
renatofilho@320
   440
renatofilho@320
   441
        gmyth_program_info_to_string_list (program, slist);
renatofilho@320
   442
renatofilho@320
   443
        gmyth_socket_sendreceive_stringlist (socket, slist);
renatofilho@320
   444
renatofilho@320
   445
        res = (gmyth_string_list_get_int (slist, 0) == 1);
renatofilho@320
   446
    
renatofilho@320
   447
        g_object_unref (program);
renatofilho@320
   448
renatofilho@320
   449
        g_object_unref (slist);
renatofilho@320
   450
renatofilho@320
   451
        gmyth_socket_close_connection (socket);
renatofilho@320
   452
    }
renatofilho@320
   453
    g_object_unref (socket);
renatofilho@320
   454
    return res;    
renatofilho@320
   455
}
renatofilho@320
   456
renatofilho@320
   457
renatofilho@320
   458
#if !GLIB_CHECK_VERSION (2, 10, 0)
renatofilho@320
   459
renatofilho@320
   460
/* Hacked from glib 2.10 <gtime.c> */
renatofilho@320
   461
renatofilho@320
   462
static time_t
renatofilho@320
   463
mktime_utc (struct tm *tm)
renatofilho@320
   464
{
renatofilho@320
   465
  time_t retval;
renatofilho@320
   466
  
renatofilho@320
   467
#ifndef HAVE_TIMEGM
renatofilho@320
   468
  static const gint days_before[] =
renatofilho@320
   469
  {
renatofilho@320
   470
    0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
renatofilho@320
   471
  };
renatofilho@320
   472
#endif
renatofilho@320
   473
renatofilho@320
   474
#ifndef HAVE_TIMEGM
renatofilho@320
   475
  if (tm->tm_mon < 0 || tm->tm_mon > 11)
renatofilho@320
   476
    return (time_t) -1;
renatofilho@320
   477
renatofilho@320
   478
  retval = (tm->tm_year - 70) * 365;
renatofilho@320
   479
  retval += (tm->tm_year - 68) / 4;
renatofilho@320
   480
  retval += days_before[tm->tm_mon] + tm->tm_mday - 1;
renatofilho@320
   481
  
renatofilho@320
   482
  if (tm->tm_year % 4 == 0 && tm->tm_mon < 2)
renatofilho@320
   483
    retval -= 1;
renatofilho@320
   484
  
renatofilho@320
   485
  retval = ((((retval * 24) + tm->tm_hour) * 60) + tm->tm_min) * 60 + tm->tm_sec;
renatofilho@320
   486
#else
renatofilho@320
   487
  retval = timegm (tm);
renatofilho@320
   488
#endif /* !HAVE_TIMEGM */
renatofilho@320
   489
  
renatofilho@320
   490
  return retval;
renatofilho@320
   491
}
renatofilho@320
   492
renatofilho@320
   493
gboolean
renatofilho@320
   494
g_time_val_from_iso8601 (const gchar *iso_date,
renatofilho@320
   495
                         GTimeVal    *time_)
renatofilho@320
   496
{
renatofilho@320
   497
  struct tm tm;
renatofilho@320
   498
  long val;
renatofilho@320
   499
renatofilho@320
   500
  g_return_val_if_fail (iso_date != NULL, FALSE);
renatofilho@320
   501
  g_return_val_if_fail (time_ != NULL, FALSE);
renatofilho@320
   502
renatofilho@320
   503
  val = strtoul (iso_date, (char **)&iso_date, 10);
renatofilho@320
   504
  if (*iso_date == '-')
renatofilho@320
   505
    {
renatofilho@320
   506
      /* YYYY-MM-DD */
renatofilho@320
   507
      tm.tm_year = val - 1900;
renatofilho@320
   508
      iso_date++;
renatofilho@320
   509
      tm.tm_mon = strtoul (iso_date, (char **)&iso_date, 10) - 1;
renatofilho@320
   510
      
renatofilho@320
   511
      if (*iso_date++ != '-')
renatofilho@320
   512
        return FALSE;
renatofilho@320
   513
      
renatofilho@320
   514
      tm.tm_mday = strtoul (iso_date, (char **)&iso_date, 10);
renatofilho@320
   515
    }
renatofilho@320
   516
  else
renatofilho@320
   517
    {
renatofilho@320
   518
      /* YYYYMMDD */
renatofilho@320
   519
      tm.tm_mday = val % 100;
renatofilho@320
   520
      tm.tm_mon = (val % 10000) / 100 - 1;
renatofilho@320
   521
      tm.tm_year = val / 10000 - 1900;
renatofilho@320
   522
    }
renatofilho@320
   523
renatofilho@320
   524
  if (*iso_date++ != 'T')
renatofilho@320
   525
    return FALSE;
renatofilho@320
   526
  
renatofilho@320
   527
  val = strtoul (iso_date, (char **)&iso_date, 10);
renatofilho@320
   528
  if (*iso_date == ':')
renatofilho@320
   529
    {
renatofilho@320
   530
      /* hh:mm:ss */
renatofilho@320
   531
      tm.tm_hour = val;
renatofilho@320
   532
      iso_date++;
renatofilho@320
   533
      tm.tm_min = strtoul (iso_date, (char **)&iso_date, 10);
renatofilho@320
   534
      
renatofilho@320
   535
      if (*iso_date++ != ':')
renatofilho@320
   536
        return FALSE;
renatofilho@320
   537
      
renatofilho@320
   538
      tm.tm_sec = strtoul (iso_date, (char **)&iso_date, 10);
renatofilho@320
   539
    }
renatofilho@320
   540
  else
renatofilho@320
   541
    {
renatofilho@320
   542
      /* hhmmss */
renatofilho@320
   543
      tm.tm_sec = val % 100;
renatofilho@320
   544
      tm.tm_min = (val % 10000) / 100;
renatofilho@320
   545
      tm.tm_hour = val / 10000;
renatofilho@320
   546
    }
renatofilho@320
   547
renatofilho@320
   548
  time_->tv_sec = mktime_utc (&tm);
renatofilho@320
   549
  time_->tv_usec = 1;
renatofilho@320
   550
  
renatofilho@320
   551
  if (*iso_date == '.')
renatofilho@320
   552
    time_->tv_usec = strtoul (iso_date + 1, (char **)&iso_date, 10);
renatofilho@320
   553
    
renatofilho@320
   554
  if (*iso_date == '+' || *iso_date == '-')
renatofilho@320
   555
    {
renatofilho@320
   556
      gint sign = (*iso_date == '+') ? -1 : 1;
renatofilho@320
   557
      
renatofilho@320
   558
      val = 60 * strtoul (iso_date + 1, (char **)&iso_date, 10);
renatofilho@320
   559
      
renatofilho@320
   560
      if (*iso_date == ':')
renatofilho@320
   561
    val = 60 * val + strtoul (iso_date + 1, NULL, 10);
renatofilho@320
   562
      else
renatofilho@320
   563
        val = 60 * (val / 100) + (val % 100);
renatofilho@320
   564
renatofilho@320
   565
      time_->tv_sec += (time_t) (val * sign);
renatofilho@320
   566
    }
renatofilho@320
   567
renatofilho@320
   568
  return TRUE;
renatofilho@320
   569
}
renatofilho@320
   570
renatofilho@320
   571
renatofilho@320
   572
gchar *
renatofilho@320
   573
g_time_val_to_iso8601 (GTimeVal *time_)
renatofilho@320
   574
{
renatofilho@320
   575
  gchar *retval;
renatofilho@320
   576
renatofilho@320
   577
  g_return_val_if_fail (time_->tv_usec >= 0 && time_->tv_usec < G_USEC_PER_SEC, NULL);
renatofilho@320
   578
renatofilho@320
   579
#define ISO_8601_LEN    21
renatofilho@320
   580
#define ISO_8601_FORMAT "%Y-%m-%dT%H:%M:%SZ"
renatofilho@320
   581
  retval = g_new0 (gchar, ISO_8601_LEN + 1);
renatofilho@320
   582
  
renatofilho@320
   583
  strftime (retval, ISO_8601_LEN,
renatofilho@320
   584
        ISO_8601_FORMAT,
renatofilho@320
   585
        gmtime (&(time_->tv_sec)));
renatofilho@320
   586
  
renatofilho@320
   587
  return retval;
renatofilho@320
   588
}
renatofilho@320
   589
renatofilho@320
   590
renatofilho@320
   591
/* Hacked from glib 2.10 <gdate.c> */
renatofilho@320
   592
renatofilho@320
   593
void         
renatofilho@320
   594
g_date_set_time_t (GDate *date,
renatofilho@320
   595
           time_t timet)
renatofilho@320
   596
{
renatofilho@320
   597
  struct tm tm;
renatofilho@320
   598
  
renatofilho@320
   599
  g_return_if_fail (date != NULL);
renatofilho@320
   600
  
renatofilho@320
   601
#ifdef HAVE_LOCALTIME_R
renatofilho@320
   602
  localtime_r (&timet, &tm);
renatofilho@320
   603
#else
renatofilho@320
   604
  {
renatofilho@320
   605
    struct tm *ptm = localtime (&timet);
renatofilho@320
   606
renatofilho@320
   607
    if (ptm == NULL)
renatofilho@320
   608
      {
renatofilho@320
   609
    /* Happens at least in Microsoft's C library if you pass a
renatofilho@320
   610
     * negative time_t. Use 2000-01-01 as default date.
renatofilho@320
   611
     */
renatofilho@320
   612
#ifndef G_DISABLE_CHECKS
renatofilho@320
   613
    g_return_if_fail_warning (G_LOG_DOMAIN, "g_date_set_time", "ptm != NULL");
renatofilho@320
   614
#endif
renatofilho@320
   615
renatofilho@320
   616
    tm.tm_mon = 0;
renatofilho@320
   617
    tm.tm_mday = 1;
renatofilho@320
   618
    tm.tm_year = 100;
renatofilho@320
   619
      }
renatofilho@320
   620
    else
renatofilho@320
   621
      memcpy ((void *) &tm, (void *) ptm, sizeof(struct tm));
renatofilho@320
   622
  }
renatofilho@320
   623
#endif
renatofilho@320
   624
  
renatofilho@320
   625
  date->julian = FALSE;
renatofilho@320
   626
  
renatofilho@320
   627
  date->month = tm.tm_mon + 1;
renatofilho@320
   628
  date->day   = tm.tm_mday;
renatofilho@320
   629
  date->year  = tm.tm_year + 1900;
renatofilho@320
   630
  
renatofilho@320
   631
  g_return_if_fail (g_date_valid_dmy (date->day, date->month, date->year));
renatofilho@320
   632
  
renatofilho@320
   633
  date->dmy    = TRUE;
renatofilho@320
   634
}
renatofilho@320
   635
renatofilho@320
   636
renatofilho@320
   637
void
renatofilho@320
   638
g_date_set_time_val (GDate    *date,
renatofilho@320
   639
             GTimeVal *timeval)
renatofilho@320
   640
{
renatofilho@320
   641
  g_date_set_time_t (date, (time_t) timeval->tv_sec);
renatofilho@320
   642
}
renatofilho@320
   643
renatofilho@320
   644
renatofilho@320
   645
renatofilho@320
   646
renatofilho@320
   647
#endif