renatofilho@320: /** renatofilho@320: * GMyth Library renatofilho@320: * renatofilho@320: * @file gmyth/gmyth_util.c renatofilho@320: * renatofilho@320: * @brief

This component provides utility functions. renatofilho@320: * renatofilho@320: * Copyright (C) 2006 INdT - Instituto Nokia de Tecnologia. renatofilho@320: * @author Hallyson Luiz de Morais Melo renatofilho@320: * renatofilho@320: *//* renatofilho@320: * renatofilho@320: * This program is free software; you can redistribute it and/or modify renatofilho@320: * it under the terms of the GNU Lesser General Public License as published by renatofilho@320: * the Free Software Foundation; either version 2 of the License, or renatofilho@320: * (at your option) any later version. renatofilho@320: * renatofilho@320: * This program is distributed in the hope that it will be useful, renatofilho@320: * but WITHOUT ANY WARRANTY; without even the implied warranty of renatofilho@320: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the renatofilho@320: * GNU General Public License for more details. renatofilho@320: * renatofilho@320: * You should have received a copy of the GNU Lesser General Public License renatofilho@320: * along with this program; if not, write to the Free Software renatofilho@320: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA renatofilho@320: */ renatofilho@320: renatofilho@320: #ifdef HAVE_CONFIG_H renatofilho@320: #include "config.h" renatofilho@320: #endif renatofilho@320: renatofilho@320: #define _XOPEN_SOURCE renatofilho@320: #define _XOPEN_SOURCE_EXTENDED renatofilho@320: #define __USE_MISC renatofilho@320: renatofilho@320: #include renatofilho@320: #include renatofilho@320: #include renatofilho@320: #include renatofilho@320: #include renatofilho@320: renatofilho@320: #include "gmyth.h" renatofilho@320: renatofilho@320: #if !GLIB_CHECK_VERSION (2, 10, 0) renatofilho@320: gchar * renatofilho@320: g_time_val_to_iso8601 (GTimeVal *time_); renatofilho@320: gboolean renatofilho@320: g_time_val_from_iso8601 (const gchar *iso_date, renatofilho@320: GTimeVal *time_); renatofilho@320: void renatofilho@320: g_date_set_time_val (GDate *date, renatofilho@320: GTimeVal *timeval); renatofilho@320: renatofilho@320: #endif renatofilho@320: renatofilho@320: static GStaticMutex mutex = G_STATIC_MUTEX_INIT; renatofilho@320: renatofilho@320: /** Converts a time_t struct in a GString at ISO standard format renatofilho@320: * (e.g. 2006-07-20T09:56:41). renatofilho@320: * renatofilho@320: * The returned GString memory should be deallocated from renatofilho@320: * the calling function. renatofilho@320: * renatofilho@320: * @param time_value the time value to be converted renatofilho@320: * @return GString* the converted isoformat string renatofilho@320: */ renatofilho@320: GString* renatofilho@320: gmyth_util_time_to_isoformat (time_t time_value) renatofilho@320: { renatofilho@320: struct tm tm_time; renatofilho@320: GString *result; renatofilho@320: renatofilho@320: g_static_mutex_lock ( &mutex ); renatofilho@320: renatofilho@320: if (localtime_r(&time_value, &tm_time) == NULL) { renatofilho@320: g_static_mutex_unlock ( &mutex ); renatofilho@320: g_warning ("gmyth_util_time_to_isoformat convertion error!\n"); renatofilho@320: return NULL; renatofilho@320: } renatofilho@320: renatofilho@320: result = g_string_sized_new(20); renatofilho@320: g_string_printf(result, "%04d-%02d-%02dT%02d:%02d:%02d", renatofilho@320: tm_time.tm_year + 1900, tm_time.tm_mon + 1, tm_time.tm_mday, renatofilho@320: tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec); renatofilho@320: renatofilho@320: gmyth_debug( "Result (ISO 8601) = %s", result->str ); renatofilho@320: renatofilho@320: g_static_mutex_unlock ( &mutex ); renatofilho@320: renatofilho@320: return result; renatofilho@320: } renatofilho@320: renatofilho@320: /** Converts a time_t struct in a GString at ISO standard format renatofilho@320: * (e.g. 2006-07-20T09:56:41). renatofilho@320: * renatofilho@320: * The returned GString memory should be deallocated from renatofilho@320: * the calling function. renatofilho@320: * renatofilho@320: * @param time_value the GTimeValue to be converted renatofilho@320: * @return GString* the converted isoformat string renatofilho@320: */ renatofilho@320: gchar* renatofilho@320: gmyth_util_time_to_isoformat_from_time_val_fmt ( const gchar *fmt_string, const GTimeVal* time_val ) renatofilho@320: { renatofilho@320: gchar *result = NULL; renatofilho@320: struct tm *tm_time = NULL; renatofilho@320: renatofilho@320: gint buffer_len = 0; renatofilho@320: renatofilho@320: g_return_val_if_fail( fmt_string != NULL, NULL ); renatofilho@320: renatofilho@320: g_return_val_if_fail( time_val != NULL, NULL ); renatofilho@320: renatofilho@320: time_t time = time_val->tv_sec;// + (gint)( time_val->tv_usec / G_USEC_PER_SEC ); renatofilho@320: renatofilho@320: tm_time = g_malloc0( sizeof(struct tm) ); renatofilho@320: renatofilho@320: g_static_mutex_lock ( &mutex ); renatofilho@320: renatofilho@320: if ( NULL == localtime_r( &time, tm_time ) ) { renatofilho@320: g_warning ("gmyth_util_time_to_isoformat convertion error!\n"); renatofilho@320: } else { renatofilho@320: // we first check the return of strftime to allocate a buffer of the correct size renatofilho@320: buffer_len = strftime( NULL, SSIZE_MAX, fmt_string, tm_time ); renatofilho@320: if ( buffer_len > 0 ) { renatofilho@320: result = g_malloc0( buffer_len + 1 ); renatofilho@320: if( result == NULL ){ renatofilho@320: g_static_mutex_unlock ( &mutex ); renatofilho@320: g_warning ("gmyth_util_time_to_isoformat convertion error!\n"); renatofilho@320: return NULL; renatofilho@320: } renatofilho@320: strftime( result, buffer_len + 1, fmt_string, tm_time ); renatofilho@320: gmyth_debug( "Dateline (ISO result): %s", result ); renatofilho@320: } renatofilho@320: renatofilho@320: } renatofilho@320: renatofilho@320: gmyth_debug( "Result (strftime) = %s", result ); renatofilho@320: renatofilho@320: //strptime( result, "%Y-%m-%dT%H:%M:%SZ", tm_time ); renatofilho@320: renatofilho@320: //strftime( result, strlen(result), fmt_string, tm_time ); renatofilho@320: renatofilho@320: g_static_mutex_unlock ( &mutex ); renatofilho@320: renatofilho@320: gmyth_debug( "Result (ISO 8601) = %s", result ); renatofilho@320: renatofilho@320: return result; renatofilho@320: renatofilho@320: } renatofilho@320: renatofilho@320: /** Converts a time_t struct in a GString at ISO standard format renatofilho@320: * (e.g. 2006-07-20 09:56:41). renatofilho@320: * renatofilho@320: * The returned GString memory should be deallocated from renatofilho@320: * the calling function. renatofilho@320: * renatofilho@320: * @param time_value the GTimeValue to be converted renatofilho@320: * @return GString* the converted isoformat string renatofilho@320: */ renatofilho@320: gchar* renatofilho@320: gmyth_util_time_to_isoformat_from_time_val ( const GTimeVal* time ) renatofilho@320: { renatofilho@320: gchar *result = gmyth_util_time_to_isoformat_from_time_val_fmt( "%Y-%m-%d %H:%M:%S", time ); renatofilho@320: //result[10] = ' '; renatofilho@320: //result[ strlen(result) - 1] = '\0'; renatofilho@320: renatofilho@320: return result; renatofilho@320: } renatofilho@320: renatofilho@320: /** Converts a time_t struct in a GString at ISO standard format 2 renatofilho@320: * (e.g. 2006-07-20T09:56:41). renatofilho@320: * renatofilho@320: * The returned GString memory should be deallocated from renatofilho@320: * the calling function. renatofilho@320: * renatofilho@320: * @param time_value the GTimeValue to be converted renatofilho@320: * @return GString* the converted isoformat string renatofilho@320: */ renatofilho@320: gchar* renatofilho@320: gmyth_util_time_to_mythformat_from_time_val ( const GTimeVal* time ) renatofilho@320: { renatofilho@320: gchar *result = gmyth_util_time_to_isoformat_from_time_val_fmt( "%Y-%m-%dT%H:%M:%S", time ); renatofilho@320: return result; renatofilho@320: } renatofilho@320: renatofilho@320: /** Converts a time_t struct in a GString at ISO standard format renatofilho@320: * (e.g. 2006-07-20T09:56:41). renatofilho@320: * renatofilho@320: * The returned GString memory should be deallocated from renatofilho@320: * the calling function. renatofilho@320: * renatofilho@320: * @param time_value the GTimeValue to be converted renatofilho@320: * @return GString* the converted isoformat string renatofilho@320: */ renatofilho@320: gchar* renatofilho@320: gmyth_util_time_to_string_only_date ( const GTimeVal* time ) renatofilho@320: { renatofilho@320: gchar *result = gmyth_util_time_to_isoformat_from_time_val_fmt( "%Y-%m-%d", time ); renatofilho@320: //result[10] = ' '; renatofilho@320: //result[ strlen(result) - 1] = '\0'; renatofilho@320: return result; renatofilho@320: } renatofilho@320: renatofilho@320: /** Converts a time_t struct in a GString at ISO standard format renatofilho@320: * (e.g. 2006-07-20T09:56:41). renatofilho@320: * renatofilho@320: * The returned GString memory should be deallocated from renatofilho@320: * the calling function. renatofilho@320: * renatofilho@320: * @param time_value the GTimeValue to be converted renatofilho@320: * @return GString* the converted isoformat string renatofilho@320: */ renatofilho@320: gchar* renatofilho@320: gmyth_util_time_to_string_only_time ( const GTimeVal* time ) renatofilho@320: { renatofilho@320: gchar *result = gmyth_util_time_to_isoformat_from_time_val_fmt( "%H:%M:%S", time ); renatofilho@320: //result[10] = ' '; renatofilho@320: //result[ strlen(result) - 1] = '\0'; renatofilho@320: return result; renatofilho@320: } renatofilho@320: renatofilho@320: /** Converts a time_t struct in a GString to the following renatofilho@320: * format (e.g. 2006-07-20 09:56:41). renatofilho@320: * renatofilho@320: * The returned GString memory should be deallocated from renatofilho@320: * the calling function. renatofilho@320: * renatofilho@320: * @param time_value the time value to be converted renatofilho@320: * @return GString* the converted string renatofilho@320: */ renatofilho@320: GString* renatofilho@320: gmyth_util_time_to_string (time_t time_value) renatofilho@320: { renatofilho@320: GString *result = gmyth_util_time_to_isoformat (time_value); renatofilho@320: result->str[10] = ' '; renatofilho@320: result->str[ strlen(result->str) - 1] = '\0'; renatofilho@320: renatofilho@320: return result; renatofilho@320: } renatofilho@320: renatofilho@320: /** Converts a time_t struct in a GString to the following renatofilho@320: * format (e.g. 2006-07-20 09:56:41). renatofilho@320: * renatofilho@320: * The returned GString memory should be deallocated from renatofilho@320: * the calling function. renatofilho@320: * renatofilho@320: * @param time_value the time value to be converted renatofilho@320: * @return GString* the converted string renatofilho@320: */ renatofilho@320: gchar* renatofilho@320: gmyth_util_time_to_string_from_time_val ( const GTimeVal *time_val ) renatofilho@320: { renatofilho@320: gchar *result = gmyth_util_time_to_isoformat_from_time_val_fmt ( "%Y-%m-%d %H:%M:%S", time_val ); renatofilho@320: //result[10] = ' '; renatofilho@320: renatofilho@320: return result; renatofilho@320: } renatofilho@320: renatofilho@320: /** Converts a GString in the following format renatofilho@320: * (e.g. 2006-07-20 09:56:41) to a time_t struct. renatofilho@320: * renatofilho@320: * @param time_str the string to be converted renatofilho@320: * @return time_t the time converted value renatofilho@320: */ renatofilho@320: time_t renatofilho@320: gmyth_util_string_to_time (GString* time_str) renatofilho@320: { renatofilho@320: gint year, month, day, hour, min, sec; renatofilho@320: renatofilho@320: gmyth_debug( "[%s] time_str = %s. [%s]", __FUNCTION__, time_str != NULL ? renatofilho@320: time_str->str : "[time string is NULL!]", time_str->str ); renatofilho@320: renatofilho@320: if ( sscanf (time_str->str, "%04d-%02d-%02d %02d:%02d:%02d", renatofilho@320: &year, &month, &day, &hour, &min, &sec) < 3 ) { renatofilho@320: g_warning ("GMythUtil: isoformat_to_time converter error!\n"); renatofilho@320: return 0; renatofilho@320: } renatofilho@320: renatofilho@320: g_static_mutex_lock ( &mutex ); renatofilho@320: renatofilho@320: struct tm* tm_time = g_malloc0( sizeof(struct tm) ); renatofilho@320: tm_time->tm_year = year - 1900; renatofilho@320: tm_time->tm_mon = month - 1; renatofilho@320: tm_time->tm_mday = day; renatofilho@320: tm_time->tm_hour = hour; renatofilho@320: tm_time->tm_min = min; renatofilho@320: tm_time->tm_sec = sec; renatofilho@320: renatofilho@320: g_static_mutex_unlock ( &mutex ); renatofilho@320: renatofilho@320: return mktime( tm_time ); renatofilho@320: } renatofilho@320: renatofilho@320: /** Converts a GString in the following format renatofilho@320: * (e.g. 2006-07-20 09:56:41) to a time_t struct. renatofilho@320: * renatofilho@320: * @param time_str the string to be converted renatofilho@320: * @return time_t the time converted value renatofilho@320: */ renatofilho@320: struct tm* renatofilho@320: gmyth_util_time_val_to_date ( const GTimeVal* time ) renatofilho@320: { renatofilho@320: struct tm *date = g_malloc0( sizeof( struct tm ) ); renatofilho@320: time_t time_micros = time->tv_sec;// + (gint)( time->tv_usec / G_USEC_PER_SEC ); renatofilho@320: renatofilho@320: if ( NULL == date ) { renatofilho@320: g_warning ( "GMythUtil: GDate *gmyth_util_time_val_to_date (GTimeVal* time) - converter error!\n" ); renatofilho@320: return NULL; renatofilho@320: } renatofilho@320: renatofilho@320: if ( NULL == localtime_r( &time_micros, date ) ) { renatofilho@320: g_warning ( "gmyth_util_time_to_isoformat convertion error!\n" ); renatofilho@320: return NULL; renatofilho@320: } renatofilho@320: renatofilho@320: gmyth_debug( "Converted from GTimeVal == %s to GDate", asctime( date ) ); renatofilho@320: renatofilho@320: return date; renatofilho@320: } renatofilho@320: renatofilho@320: /** Converts a GString in the following format renatofilho@320: * (e.g. 2006-07-20 09:56:41) to a time_t struct. renatofilho@320: * renatofilho@320: * @param time_str the string to be converted renatofilho@320: * @return time_t the time converted value renatofilho@320: */ renatofilho@320: GTimeVal* renatofilho@320: gmyth_util_string_to_time_val_fmt ( const gchar *fmt_string, const gchar* time_str ) renatofilho@320: { renatofilho@320: GTimeVal *time = g_new0( GTimeVal, 1 ); renatofilho@320: struct tm* tm_time = NULL; renatofilho@320: time_t time_micros; renatofilho@320: gint result; renatofilho@320: renatofilho@320: gmyth_debug( "[%s] time_str = %s. [%s]", time_str, time_str != NULL ? renatofilho@320: time_str : "[time string is NULL!]", time_str ); renatofilho@320: renatofilho@320: if ( NULL == time_str ) renatofilho@320: { renatofilho@320: g_warning ("GMythUtil: isoformat_to_time converter error!\n"); renatofilho@320: return NULL; renatofilho@320: } renatofilho@320: renatofilho@320: g_static_mutex_lock ( &mutex ); renatofilho@320: renatofilho@320: tm_time = g_malloc0( sizeof(struct tm) ); renatofilho@320: renatofilho@320: /* we first check the return of strftime to allocate a buffer of the correct size */ renatofilho@320: result = strptime( time_str, "%Y-%m-%dT%H:%M:%S", tm_time ); renatofilho@320: if ( NULL == result ) { renatofilho@320: /* we first check the return of strftime to allocate a buffer of the correct size */ renatofilho@320: result = strptime( time_str, "%Y-%m-%dT%H:%M:%SZ", tm_time ); renatofilho@320: if ( NULL == result ) { renatofilho@320: /* we first check the return of strftime to allocate a buffer of the correct size */ renatofilho@320: result = strptime( time_str, "%Y-%m-%d %H:%M:%S", tm_time ); renatofilho@320: if ( NULL == result ) { renatofilho@320: g_static_mutex_unlock ( &mutex ); renatofilho@320: gmyth_debug( "Dateline (ISO result): %s", result ); renatofilho@320: time = NULL; renatofilho@320: //goto done; renatofilho@320: } renatofilho@320: } renatofilho@320: } renatofilho@320: renatofilho@320: time_micros = mktime( tm_time ); renatofilho@320: renatofilho@320: time->tv_sec = time_micros; // + (gint)( time_val->tv_usec / G_USEC_PER_SEC ); renatofilho@320: renatofilho@320: gmyth_debug( "After mktime call... = %s", asctime(tm_time) ); renatofilho@320: renatofilho@320: g_static_mutex_unlock ( &mutex ); renatofilho@320: renatofilho@320: return time; renatofilho@320: } renatofilho@320: renatofilho@320: /** Converts a GString in the following format renatofilho@320: * (e.g. 2006-07-20 09:56:41) to a time_t struct. renatofilho@320: * renatofilho@320: * @param time_str the string to be converted renatofilho@320: * @return time_t the time converted value renatofilho@320: */ renatofilho@320: GTimeVal* renatofilho@320: gmyth_util_string_to_time_val ( const gchar* time_str ) renatofilho@320: { renatofilho@320: GTimeVal *time = gmyth_util_string_to_time_val_fmt ( "%Y-%m-%d %H:%M:%S", time_str ); renatofilho@320: renatofilho@320: return time; renatofilho@320: } renatofilho@320: renatofilho@320: /** Decodes a long long variable from the string list renatofilho@320: * format of the myhtprotocol. renatofilho@320: * renatofilho@320: * @param strlist the string list of mythprotocol values renatofilho@320: * @param offset the list node offset of the long long variable renatofilho@320: * @return gint64 the long long converted value renatofilho@320: */ renatofilho@320: gint64 renatofilho@320: gmyth_util_decode_long_long(GMythStringList *strlist, guint offset) renatofilho@320: { renatofilho@320: renatofilho@320: gint64 ret_value = 0LL; renatofilho@320: renatofilho@320: g_return_val_if_fail( strlist != NULL, ret_value ); renatofilho@320: renatofilho@320: if ( offset > gmyth_string_list_length( strlist )) renatofilho@320: g_printerr( "[%s] Offset is greater than the Stringlist (offset = %d)!\n", renatofilho@320: __FUNCTION__, offset ); renatofilho@320: renatofilho@320: g_return_val_if_fail( offset < gmyth_string_list_length( strlist ), ret_value ); renatofilho@320: renatofilho@320: gint l1 = gmyth_string_list_get_int( strlist, offset ); renatofilho@320: gint l2 = gmyth_string_list_get_int( strlist, offset + 1 ); renatofilho@320: renatofilho@320: ret_value = (l2 /*& 0xffffffffLL*/) | ( (gint64)l1 << 32 ); renatofilho@320: renatofilho@320: return ret_value; renatofilho@320: renatofilho@320: } renatofilho@320: renatofilho@320: gboolean renatofilho@320: gmyth_util_file_exists (GMythBackendInfo *backend_info, const gchar* filename) renatofilho@320: { renatofilho@320: GMythSocket *socket; renatofilho@320: gboolean res; renatofilho@320: renatofilho@320: socket = gmyth_socket_new (); renatofilho@320: res = gmyth_socket_connect_to_backend (socket, backend_info->hostname, renatofilho@320: backend_info->port, TRUE); renatofilho@320: renatofilho@320: if (res == TRUE) { renatofilho@320: GMythStringList *slist; renatofilho@320: GMythProgramInfo *program = NULL; renatofilho@320: renatofilho@320: program = gmyth_program_info_new(); renatofilho@320: program->pathname = g_string_new (filename); renatofilho@320: renatofilho@320: slist = gmyth_string_list_new (); renatofilho@320: gmyth_string_list_append_char_array (slist, "QUERY_CHECKFILE"); renatofilho@320: renatofilho@320: gmyth_program_info_to_string_list (program, slist); renatofilho@320: renatofilho@320: gmyth_socket_sendreceive_stringlist (socket, slist); renatofilho@320: renatofilho@320: res = (gmyth_string_list_get_int (slist, 0) == 1); renatofilho@320: renatofilho@320: g_object_unref (program); renatofilho@320: renatofilho@320: g_object_unref (slist); renatofilho@320: renatofilho@320: gmyth_socket_close_connection (socket); renatofilho@320: } renatofilho@320: g_object_unref (socket); renatofilho@320: return res; renatofilho@320: } renatofilho@320: renatofilho@320: renatofilho@320: #if !GLIB_CHECK_VERSION (2, 10, 0) renatofilho@320: renatofilho@320: /* Hacked from glib 2.10 */ renatofilho@320: renatofilho@320: static time_t renatofilho@320: mktime_utc (struct tm *tm) renatofilho@320: { renatofilho@320: time_t retval; renatofilho@320: renatofilho@320: #ifndef HAVE_TIMEGM renatofilho@320: static const gint days_before[] = renatofilho@320: { renatofilho@320: 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 renatofilho@320: }; renatofilho@320: #endif renatofilho@320: renatofilho@320: #ifndef HAVE_TIMEGM renatofilho@320: if (tm->tm_mon < 0 || tm->tm_mon > 11) renatofilho@320: return (time_t) -1; renatofilho@320: renatofilho@320: retval = (tm->tm_year - 70) * 365; renatofilho@320: retval += (tm->tm_year - 68) / 4; renatofilho@320: retval += days_before[tm->tm_mon] + tm->tm_mday - 1; renatofilho@320: renatofilho@320: if (tm->tm_year % 4 == 0 && tm->tm_mon < 2) renatofilho@320: retval -= 1; renatofilho@320: renatofilho@320: retval = ((((retval * 24) + tm->tm_hour) * 60) + tm->tm_min) * 60 + tm->tm_sec; renatofilho@320: #else renatofilho@320: retval = timegm (tm); renatofilho@320: #endif /* !HAVE_TIMEGM */ renatofilho@320: renatofilho@320: return retval; renatofilho@320: } renatofilho@320: renatofilho@320: gboolean renatofilho@320: g_time_val_from_iso8601 (const gchar *iso_date, renatofilho@320: GTimeVal *time_) renatofilho@320: { renatofilho@320: struct tm tm; renatofilho@320: long val; renatofilho@320: renatofilho@320: g_return_val_if_fail (iso_date != NULL, FALSE); renatofilho@320: g_return_val_if_fail (time_ != NULL, FALSE); renatofilho@320: renatofilho@320: val = strtoul (iso_date, (char **)&iso_date, 10); renatofilho@320: if (*iso_date == '-') renatofilho@320: { renatofilho@320: /* YYYY-MM-DD */ renatofilho@320: tm.tm_year = val - 1900; renatofilho@320: iso_date++; renatofilho@320: tm.tm_mon = strtoul (iso_date, (char **)&iso_date, 10) - 1; renatofilho@320: renatofilho@320: if (*iso_date++ != '-') renatofilho@320: return FALSE; renatofilho@320: renatofilho@320: tm.tm_mday = strtoul (iso_date, (char **)&iso_date, 10); renatofilho@320: } renatofilho@320: else renatofilho@320: { renatofilho@320: /* YYYYMMDD */ renatofilho@320: tm.tm_mday = val % 100; renatofilho@320: tm.tm_mon = (val % 10000) / 100 - 1; renatofilho@320: tm.tm_year = val / 10000 - 1900; renatofilho@320: } renatofilho@320: renatofilho@320: if (*iso_date++ != 'T') renatofilho@320: return FALSE; renatofilho@320: renatofilho@320: val = strtoul (iso_date, (char **)&iso_date, 10); renatofilho@320: if (*iso_date == ':') renatofilho@320: { renatofilho@320: /* hh:mm:ss */ renatofilho@320: tm.tm_hour = val; renatofilho@320: iso_date++; renatofilho@320: tm.tm_min = strtoul (iso_date, (char **)&iso_date, 10); renatofilho@320: renatofilho@320: if (*iso_date++ != ':') renatofilho@320: return FALSE; renatofilho@320: renatofilho@320: tm.tm_sec = strtoul (iso_date, (char **)&iso_date, 10); renatofilho@320: } renatofilho@320: else renatofilho@320: { renatofilho@320: /* hhmmss */ renatofilho@320: tm.tm_sec = val % 100; renatofilho@320: tm.tm_min = (val % 10000) / 100; renatofilho@320: tm.tm_hour = val / 10000; renatofilho@320: } renatofilho@320: renatofilho@320: time_->tv_sec = mktime_utc (&tm); renatofilho@320: time_->tv_usec = 1; renatofilho@320: renatofilho@320: if (*iso_date == '.') renatofilho@320: time_->tv_usec = strtoul (iso_date + 1, (char **)&iso_date, 10); renatofilho@320: renatofilho@320: if (*iso_date == '+' || *iso_date == '-') renatofilho@320: { renatofilho@320: gint sign = (*iso_date == '+') ? -1 : 1; renatofilho@320: renatofilho@320: val = 60 * strtoul (iso_date + 1, (char **)&iso_date, 10); renatofilho@320: renatofilho@320: if (*iso_date == ':') renatofilho@320: val = 60 * val + strtoul (iso_date + 1, NULL, 10); renatofilho@320: else renatofilho@320: val = 60 * (val / 100) + (val % 100); renatofilho@320: renatofilho@320: time_->tv_sec += (time_t) (val * sign); renatofilho@320: } renatofilho@320: renatofilho@320: return TRUE; renatofilho@320: } renatofilho@320: renatofilho@320: renatofilho@320: gchar * renatofilho@320: g_time_val_to_iso8601 (GTimeVal *time_) renatofilho@320: { renatofilho@320: gchar *retval; renatofilho@320: renatofilho@320: g_return_val_if_fail (time_->tv_usec >= 0 && time_->tv_usec < G_USEC_PER_SEC, NULL); renatofilho@320: renatofilho@320: #define ISO_8601_LEN 21 renatofilho@320: #define ISO_8601_FORMAT "%Y-%m-%dT%H:%M:%SZ" renatofilho@320: retval = g_new0 (gchar, ISO_8601_LEN + 1); renatofilho@320: renatofilho@320: strftime (retval, ISO_8601_LEN, renatofilho@320: ISO_8601_FORMAT, renatofilho@320: gmtime (&(time_->tv_sec))); renatofilho@320: renatofilho@320: return retval; renatofilho@320: } renatofilho@320: renatofilho@320: renatofilho@320: /* Hacked from glib 2.10 */ renatofilho@320: renatofilho@320: void renatofilho@320: g_date_set_time_t (GDate *date, renatofilho@320: time_t timet) renatofilho@320: { renatofilho@320: struct tm tm; renatofilho@320: renatofilho@320: g_return_if_fail (date != NULL); renatofilho@320: renatofilho@320: #ifdef HAVE_LOCALTIME_R renatofilho@320: localtime_r (&timet, &tm); renatofilho@320: #else renatofilho@320: { renatofilho@320: struct tm *ptm = localtime (&timet); renatofilho@320: renatofilho@320: if (ptm == NULL) renatofilho@320: { renatofilho@320: /* Happens at least in Microsoft's C library if you pass a renatofilho@320: * negative time_t. Use 2000-01-01 as default date. renatofilho@320: */ renatofilho@320: #ifndef G_DISABLE_CHECKS renatofilho@320: g_return_if_fail_warning (G_LOG_DOMAIN, "g_date_set_time", "ptm != NULL"); renatofilho@320: #endif renatofilho@320: renatofilho@320: tm.tm_mon = 0; renatofilho@320: tm.tm_mday = 1; renatofilho@320: tm.tm_year = 100; renatofilho@320: } renatofilho@320: else renatofilho@320: memcpy ((void *) &tm, (void *) ptm, sizeof(struct tm)); renatofilho@320: } renatofilho@320: #endif renatofilho@320: renatofilho@320: date->julian = FALSE; renatofilho@320: renatofilho@320: date->month = tm.tm_mon + 1; renatofilho@320: date->day = tm.tm_mday; renatofilho@320: date->year = tm.tm_year + 1900; renatofilho@320: renatofilho@320: g_return_if_fail (g_date_valid_dmy (date->day, date->month, date->year)); renatofilho@320: renatofilho@320: date->dmy = TRUE; renatofilho@320: } renatofilho@320: renatofilho@320: renatofilho@320: void renatofilho@320: g_date_set_time_val (GDate *date, renatofilho@320: GTimeVal *timeval) renatofilho@320: { renatofilho@320: g_date_set_time_t (date, (time_t) timeval->tv_sec); renatofilho@320: } renatofilho@320: renatofilho@320: renatofilho@320: renatofilho@320: renatofilho@320: #endif