gmyth/src/gmyth_util.c
author renatofilho
Fri Feb 01 19:21:52 2008 +0000 (2008-02-01)
branchtrunk
changeset 907 9fa6794e53fb
parent 798 19626dc62c16
permissions -rw-r--r--
[svn r913] fixed gmyth version on control packages
leo_sobral@1
     1
/**
rosfran@420
     2
 * GMyth Library
rosfran@420
     3
 *
rosfran@420
     4
 * @file gmyth/gmyth_util.c
rosfran@420
     5
 * 
rosfran@420
     6
 * @brief <p> This component provides utility functions 
rosfran@420
     7
 * 	(dealing with dates, time, string formatting, etc.).
rosfran@420
     8
 * 
rosfran@420
     9
 * Copyright (C) 2006 INdT - Instituto Nokia de Tecnologia.
rosfran@420
    10
 * @author Hallyson Luiz de Morais Melo <hallyson.melo@indt.org.br>
rosfran@420
    11
 * @author Rosfran Borges <rosfran.borges@indt.org.br>
rosfran@420
    12
 *
rosfran@701
    13
 * 
rosfran@701
    14
 * This program is free software; you can redistribute it and/or modify
rosfran@701
    15
 * it under the terms of the GNU Lesser General Public License as published by
rosfran@701
    16
 * the Free Software Foundation; either version 2 of the License, or
rosfran@701
    17
 * (at your option) any later version.
rosfran@701
    18
 *
rosfran@701
    19
 * This program is distributed in the hope that it will be useful,
rosfran@701
    20
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
rosfran@701
    21
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
rosfran@701
    22
 * GNU General Public License for more details.
rosfran@701
    23
 *
rosfran@701
    24
 * You should have received a copy of the GNU Lesser General Public License
rosfran@701
    25
 * along with this program; if not, write to the Free Software
rosfran@701
    26
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
rosfran@701
    27
 */
rosfran@698
    28
leo_sobral@213
    29
#ifdef HAVE_CONFIG_H
leo_sobral@213
    30
#include "config.h"
leo_sobral@213
    31
#endif
leo_sobral@213
    32
rosfran@214
    33
#define _XOPEN_SOURCE
rosfran@214
    34
#define _XOPEN_SOURCE_EXTENDED
rosfran@223
    35
#define __USE_MISC
leo_sobral@1
    36
melunko@125
    37
#include <glib.h>
melunko@125
    38
#include <glib/gprintf.h>
rosfran@214
    39
#include <time.h>
rosfran@214
    40
#include <sys/time.h>
rosfran@223
    41
#include <sys/timex.h>
melunko@125
    42
melunko@587
    43
#include "gmyth_socket.h"
melunko@587
    44
#include "gmyth_recorder.h"
melunko@587
    45
#include "gmyth_common.h"
melunko@587
    46
#include "gmyth_debug.h"
melunko@125
    47
melunko@798
    48
#include "gmyth_util.h"
melunko@798
    49
renatofilho@222
    50
#if !GLIB_CHECK_VERSION (2, 10, 0)
renatofilho@754
    51
gchar          *g_time_val_to_iso8601(GTimeVal * time_);
renatofilho@754
    52
gboolean        g_time_val_from_iso8601(const gchar * iso_date,
renatofilho@754
    53
                                        GTimeVal * time_);
renatofilho@754
    54
void            g_date_set_time_val(GDate * date, GTimeVal * timeval);
renatofilho@222
    55
renatofilho@222
    56
#endif
renatofilho@222
    57
leo_sobral@1
    58
/** Converts a time_t struct in a GString at ISO standard format 
leo_sobral@1
    59
 * (e.g. 2006-07-20T09:56:41).
leo_sobral@1
    60
 * 
leo_sobral@1
    61
 * The returned GString memory should be deallocated from 
leo_sobral@1
    62
 * the calling function.
leo_sobral@1
    63
 *
leo_sobral@1
    64
 * @param time_value the time value to be converted
leo_sobral@1
    65
 * @return GString* the converted isoformat string 
leo_sobral@1
    66
 */
renatofilho@754
    67
GString        *
renatofilho@750
    68
gmyth_util_time_to_isoformat(time_t time_value)
leo_sobral@1
    69
{
renatofilho@754
    70
    struct tm       tm_time;
renatofilho@754
    71
    GString        *result;
rosfran@223
    72
renatofilho@754
    73
    if (localtime_r(&time_value, &tm_time) == NULL) {
renatofilho@754
    74
        gmyth_debug("gmyth_util_time_to_isoformat convertion error!\n");
renatofilho@754
    75
        return NULL;
renatofilho@754
    76
    }
rosfran@698
    77
renatofilho@754
    78
    result = g_string_sized_new(20);
renatofilho@754
    79
    g_string_printf(result, "%04d-%02d-%02dT%02d:%02d:%02d",
renatofilho@754
    80
                    tm_time.tm_year + 1900, tm_time.tm_mon + 1,
renatofilho@754
    81
                    tm_time.tm_mday, tm_time.tm_hour, tm_time.tm_min,
renatofilho@754
    82
                    tm_time.tm_sec);
rosfran@698
    83
renatofilho@754
    84
    gmyth_debug("Result (ISO 8601) = %s", result->str);
rosfran@698
    85
renatofilho@754
    86
    return result;
rosfran@214
    87
}
rosfran@214
    88
rosfran@214
    89
/** Converts a time_t struct in a GString at ISO standard format 
rosfran@214
    90
 * (e.g. 2006-07-20T09:56:41).
rosfran@214
    91
 * 
rosfran@214
    92
 * The returned GString memory should be deallocated from 
rosfran@214
    93
 * the calling function.
rosfran@214
    94
 *
rosfran@214
    95
 * @param time_value the GTimeValue to be converted
rosfran@214
    96
 * @return GString* the converted isoformat string 
rosfran@214
    97
 */
renatofilho@754
    98
gchar          *
renatofilho@750
    99
gmyth_util_time_to_isoformat_from_time_val_fmt(const gchar * fmt_string,
renatofilho@754
   100
                                               const GTimeVal * time_val)
rosfran@214
   101
{
renatofilho@754
   102
    gchar          *result = NULL;
renatofilho@754
   103
    struct tm      *tm_time = NULL;
renatofilho@754
   104
    time_t          time;
rosfran@399
   105
renatofilho@754
   106
    gint            buffer_len = 0;
rosfran@214
   107
renatofilho@754
   108
    g_return_val_if_fail(fmt_string != NULL, NULL);
rosfran@221
   109
renatofilho@754
   110
    g_return_val_if_fail(time_val != NULL, NULL);
leo_sobral@446
   111
renatofilho@754
   112
    time = time_val->tv_sec;    // + (gint)( time_val->tv_usec /
renatofilho@754
   113
    // G_USEC_PER_SEC );
rosfran@698
   114
renatofilho@754
   115
    tm_time = g_malloc0(sizeof(struct tm));
rosfran@698
   116
renatofilho@754
   117
    if (NULL == localtime_r(&time, tm_time)) {
renatofilho@754
   118
        gmyth_debug("gmyth_util_time_to_isoformat convertion error!\n");
renatofilho@754
   119
    } else {
renatofilho@754
   120
        /*
renatofilho@754
   121
         * we first check the return of strftime to allocate a buffer of
renatofilho@754
   122
         * the correct size 
renatofilho@754
   123
         */
renatofilho@754
   124
        buffer_len = strftime(NULL, SSIZE_MAX, fmt_string, tm_time);
renatofilho@754
   125
        if (buffer_len > 0) {
renatofilho@754
   126
            result = g_malloc0(buffer_len + 1);
renatofilho@754
   127
            if (result == NULL) {
renatofilho@754
   128
                gmyth_debug
renatofilho@754
   129
                    ("gmyth_util_time_to_isoformat convertion error!\n");
renatofilho@754
   130
                return NULL;
renatofilho@754
   131
            }
renatofilho@754
   132
            strftime(result, buffer_len + 1, fmt_string, tm_time);
renatofilho@754
   133
            gmyth_debug("Dateline (ISO result): %s", result);
renatofilho@754
   134
        }
renatofilho@754
   135
    }                           /* if */
rosfran@698
   136
renatofilho@754
   137
    gmyth_debug("Result (strftime) = %s", result);
rosfran@698
   138
renatofilho@754
   139
    // strptime( result, "%Y-%m-%dT%H:%M:%SZ", tm_time ); 
rosfran@698
   140
renatofilho@754
   141
    // strftime( result, strlen(result), fmt_string, tm_time );
rosfran@698
   142
renatofilho@754
   143
    g_free(tm_time);
rosfran@698
   144
renatofilho@754
   145
    gmyth_debug("Result (ISO 8601) = %s", result);
rosfran@698
   146
renatofilho@754
   147
    return result;
rosfran@214
   148
}
rosfran@214
   149
rosfran@214
   150
/** Converts a time_t struct in a GString at ISO standard format 
morphbr@306
   151
 * (e.g. 2006-07-20 09:56:41).
rosfran@214
   152
 * 
rosfran@214
   153
 * The returned GString memory should be deallocated from 
rosfran@214
   154
 * the calling function.
rosfran@214
   155
 *
rosfran@214
   156
 * @param time_value the GTimeValue to be converted
rosfran@214
   157
 * @return GString* the converted isoformat string 
rosfran@214
   158
 */
renatofilho@754
   159
gchar          *
renatofilho@750
   160
gmyth_util_time_to_isoformat_from_time_val(const GTimeVal * time)
rosfran@214
   161
{
renatofilho@754
   162
    gchar          *result =
renatofilho@754
   163
        gmyth_util_time_to_isoformat_from_time_val_fmt("%Y-%m-%d %H:%M:%S",
renatofilho@754
   164
                                                       time);
rosfran@698
   165
renatofilho@754
   166
    // result[10] = ' ';
renatofilho@754
   167
    // result[ strlen(result) - 1] = '\0';
rosfran@698
   168
renatofilho@754
   169
    return result;
rosfran@214
   170
}
rosfran@214
   171
morphbr@306
   172
/** Converts a time_t struct in a GString at ISO standard format 2 
morphbr@306
   173
 * (e.g. 2006-07-20T09:56:41).
morphbr@306
   174
 * 
morphbr@306
   175
 * The returned GString memory should be deallocated from 
morphbr@306
   176
 * the calling function.
morphbr@306
   177
 *
morphbr@306
   178
 * @param time_value the GTimeValue to be converted
morphbr@306
   179
 * @return GString* the converted isoformat string 
morphbr@306
   180
 */
renatofilho@754
   181
gchar          *
renatofilho@750
   182
gmyth_util_time_to_mythformat_from_time_val(const GTimeVal * time)
morphbr@306
   183
{
renatofilho@754
   184
    gchar          *result =
renatofilho@754
   185
        gmyth_util_time_to_isoformat_from_time_val_fmt("%Y-%m-%dT%H:%M:%S",
renatofilho@754
   186
                                                       time);
rosfran@698
   187
renatofilho@754
   188
    return result;
morphbr@306
   189
}
morphbr@306
   190
rosfran@214
   191
/** Converts a time_t struct in a GString at ISO standard format 
rosfran@214
   192
 * (e.g. 2006-07-20T09:56:41).
rosfran@214
   193
 * 
rosfran@214
   194
 * The returned GString memory should be deallocated from 
rosfran@214
   195
 * the calling function.
rosfran@214
   196
 *
rosfran@214
   197
 * @param time_value the GTimeValue to be converted
rosfran@214
   198
 * @return GString* the converted isoformat string 
rosfran@214
   199
 */
renatofilho@754
   200
gchar          *
renatofilho@750
   201
gmyth_util_time_to_string_only_date(const GTimeVal * time)
rosfran@214
   202
{
renatofilho@754
   203
    gchar          *result =
renatofilho@754
   204
        gmyth_util_time_to_isoformat_from_time_val_fmt("%Y-%m-%d", time);
renatofilho@754
   205
    // result[10] = ' ';
renatofilho@754
   206
    // result[ strlen(result) - 1] = '\0';
renatofilho@754
   207
    return result;
rosfran@214
   208
}
rosfran@214
   209
rosfran@214
   210
/** Converts a time_t struct in a GString at ISO standard format 
rosfran@214
   211
 * (e.g. 2006-07-20T09:56:41).
rosfran@214
   212
 * 
rosfran@214
   213
 * The returned GString memory should be deallocated from 
rosfran@214
   214
 * the calling function.
rosfran@214
   215
 *
rosfran@214
   216
 * @param time_value the GTimeValue to be converted
rosfran@214
   217
 * @return GString* the converted isoformat string 
rosfran@214
   218
 */
renatofilho@754
   219
gchar          *
renatofilho@750
   220
gmyth_util_time_to_string_only_time(const GTimeVal * time)
rosfran@214
   221
{
renatofilho@754
   222
    gchar          *result =
renatofilho@754
   223
        gmyth_util_time_to_isoformat_from_time_val_fmt("%H:%M:%S", time);
renatofilho@754
   224
    // result[10] = ' ';
renatofilho@754
   225
    // result[ strlen(result) - 1] = '\0';
renatofilho@754
   226
    return result;
leo_sobral@1
   227
}
leo_sobral@1
   228
leo_sobral@1
   229
/** Converts a time_t struct in a GString to the following 
leo_sobral@1
   230
 * format (e.g. 2006-07-20 09:56:41).
leo_sobral@1
   231
 * 
leo_sobral@1
   232
 * The returned GString memory should be deallocated from 
leo_sobral@1
   233
 * the calling function.
leo_sobral@1
   234
 *
leo_sobral@1
   235
 * @param time_value the time value to be converted
leo_sobral@1
   236
 * @return GString* the converted string 
leo_sobral@1
   237
 */
renatofilho@754
   238
GString        *
renatofilho@750
   239
gmyth_util_time_to_string(time_t time_value)
leo_sobral@1
   240
{
renatofilho@754
   241
    GString        *result = gmyth_util_time_to_isoformat(time_value);
leo_sobral@1
   242
renatofilho@754
   243
    result->str[10] = ' ';
renatofilho@754
   244
    result->str[strlen(result->str) - 1] = '\0';
rosfran@698
   245
renatofilho@754
   246
    return result;
leo_sobral@1
   247
}
leo_sobral@1
   248
rosfran@214
   249
/** Converts a time_t struct in a GString to the following 
rosfran@214
   250
 * format (e.g. 2006-07-20 09:56:41).
rosfran@214
   251
 * 
rosfran@214
   252
 * The returned GString memory should be deallocated from 
rosfran@214
   253
 * the calling function.
rosfran@214
   254
 *
rosfran@214
   255
 * @param time_value the time value to be converted
rosfran@214
   256
 * @return GString* the converted string 
rosfran@214
   257
 */
renatofilho@754
   258
gchar          *
renatofilho@750
   259
gmyth_util_time_to_string_from_time_val(const GTimeVal * time_val)
rosfran@214
   260
{
renatofilho@754
   261
    gchar          *result =
renatofilho@754
   262
        gmyth_util_time_to_isoformat_from_time_val_fmt("%Y-%m-%d %H:%M:%S",
renatofilho@754
   263
                                                       time_val);
rosfran@214
   264
renatofilho@754
   265
    // result[10] = ' ';
rosfran@698
   266
renatofilho@754
   267
    return result;
rosfran@214
   268
}
rosfran@214
   269
leo_sobral@1
   270
/** Converts a GString in the following format 
leo_sobral@1
   271
 * (e.g. 2006-07-20 09:56:41) to a time_t struct.
leo_sobral@1
   272
 * 
leo_sobral@1
   273
 * @param time_str the string to be converted
leo_sobral@1
   274
 * @return time_t the time converted value
leo_sobral@1
   275
 */
leo_sobral@1
   276
time_t
renatofilho@750
   277
gmyth_util_string_to_time(GString * time_str)
leo_sobral@1
   278
{
renatofilho@754
   279
    gint            year,
renatofilho@754
   280
                    month,
renatofilho@754
   281
                    day,
renatofilho@754
   282
                    hour,
renatofilho@754
   283
                    min,
renatofilho@754
   284
                    sec;
leo_sobral@1
   285
renatofilho@754
   286
    gmyth_debug("[%s] time_str = %s. [%s]", __FUNCTION__,
renatofilho@754
   287
                time_str !=
renatofilho@754
   288
                NULL ? time_str->str : "[time string is NULL!]",
renatofilho@754
   289
                time_str->str);
rosfran@698
   290
renatofilho@754
   291
    if (sscanf(time_str->str, "%04d-%02d-%02d %02d:%02d:%02d",
renatofilho@754
   292
               &year, &month, &day, &hour, &min, &sec) < 3) {
renatofilho@754
   293
        gmyth_debug("GMythUtil: isoformat_to_time converter error!\n");
renatofilho@754
   294
        return 0;
renatofilho@754
   295
    }
rosfran@698
   296
renatofilho@754
   297
    struct tm      *tm_time = g_malloc0(sizeof(struct tm));
rosfran@698
   298
renatofilho@754
   299
    tm_time->tm_year = year - 1900;
renatofilho@754
   300
    tm_time->tm_mon = month - 1;
renatofilho@754
   301
    tm_time->tm_mday = day;
renatofilho@754
   302
    tm_time->tm_hour = hour;
renatofilho@754
   303
    tm_time->tm_min = min;
renatofilho@754
   304
    tm_time->tm_sec = sec;
rosfran@698
   305
renatofilho@754
   306
    return mktime(tm_time);
rosfran@214
   307
}
rosfran@214
   308
rosfran@214
   309
/** Converts a GString in the following format 
rosfran@214
   310
 * (e.g. 2006-07-20 09:56:41) to a time_t struct.
rosfran@214
   311
 * 
rosfran@214
   312
 * @param time_str the string to be converted
rosfran@214
   313
 * @return time_t the time converted value
rosfran@214
   314
 */
renatofilho@754
   315
struct tm      *
renatofilho@750
   316
gmyth_util_time_val_to_date(const GTimeVal * time)
rosfran@214
   317
{
renatofilho@754
   318
    struct tm      *date = g_malloc0(sizeof(struct tm));
renatofilho@754
   319
    time_t          time_micros = time->tv_sec; // + (gint)( time->tv_usec 
renatofilho@754
   320
                                                // 
renatofilho@754
   321
    // 
renatofilho@754
   322
    // / G_USEC_PER_SEC );
rosfran@223
   323
renatofilho@754
   324
    if (NULL == date) {
renatofilho@754
   325
        gmyth_debug
renatofilho@754
   326
            ("GMythUtil: GDate *gmyth_util_time_val_to_date (GTimeVal* time) - converter error!\n");
renatofilho@754
   327
        return NULL;
renatofilho@754
   328
    }
rosfran@698
   329
renatofilho@754
   330
    if (NULL == localtime_r(&time_micros, date)) {
renatofilho@754
   331
        gmyth_debug("gmyth_util_time_to_isoformat convertion error!\n");
renatofilho@754
   332
        return NULL;
renatofilho@754
   333
    }
rosfran@698
   334
renatofilho@754
   335
    gmyth_debug("Converted from GTimeVal == %s to GDate", asctime(date));
rosfran@698
   336
renatofilho@754
   337
    return date;
rosfran@214
   338
}
rosfran@214
   339
rosfran@214
   340
/** Converts a GString in the following format 
rosfran@214
   341
 * (e.g. 2006-07-20 09:56:41) to a time_t struct.
rosfran@214
   342
 * 
rosfran@214
   343
 * @param time_str the string to be converted
rosfran@214
   344
 * @return time_t the time converted value
rosfran@214
   345
 */
renatofilho@754
   346
GTimeVal       *
renatofilho@750
   347
gmyth_util_string_to_time_val_fmt(const gchar * fmt_string,
renatofilho@754
   348
                                  const gchar * time_str)
rosfran@214
   349
{
renatofilho@754
   350
    GTimeVal       *time = g_new0(GTimeVal, 1);
renatofilho@754
   351
    struct tm      *tm_time = NULL;
renatofilho@754
   352
    time_t          time_micros;
renatofilho@754
   353
    gchar          *result;
rosfran@698
   354
renatofilho@754
   355
    gmyth_debug("[%s] time_str = %s. [%s]", time_str, time_str != NULL ?
renatofilho@754
   356
                time_str : "[time string is NULL!]", time_str);
rosfran@698
   357
renatofilho@754
   358
    if (NULL == time_str) {
renatofilho@754
   359
        gmyth_debug("GMythUtil: isoformat_to_time converter error!\n");
renatofilho@754
   360
        return NULL;
renatofilho@754
   361
    }
rosfran@698
   362
renatofilho@754
   363
    tm_time = g_malloc0(sizeof(struct tm));
rosfran@698
   364
renatofilho@754
   365
    /*
renatofilho@754
   366
     * we first check the return of strftime to allocate a buffer of the
renatofilho@754
   367
     * correct size 
renatofilho@754
   368
     */
renatofilho@754
   369
    result = strptime(time_str, "%Y-%m-%dT%H:%M:%S", tm_time);
renatofilho@754
   370
    if (NULL == result) {
renatofilho@754
   371
        /*
renatofilho@754
   372
         * we first check the return of strftime to allocate a buffer of
renatofilho@754
   373
         * the correct size 
renatofilho@754
   374
         */
renatofilho@754
   375
        result = strptime(time_str, "%Y-%m-%dT%H:%M:%SZ", tm_time);
renatofilho@754
   376
        if (NULL == result) {
renatofilho@754
   377
            /*
renatofilho@754
   378
             * we first check the return of strftime to allocate a buffer
renatofilho@754
   379
             * of the correct size 
renatofilho@754
   380
             */
renatofilho@754
   381
            result = strptime(time_str, "%Y-%m-%d %H:%M:%S", tm_time);
renatofilho@754
   382
            if (NULL == result) {
renatofilho@754
   383
                result = strptime(time_str, "%Y-%m-%dT%H:%M", tm_time);
renatofilho@754
   384
                if (NULL == result) {
renatofilho@754
   385
                    gmyth_debug("Dateline (ISO result): %s", result);
renatofilho@754
   386
                    g_free(tm_time);
renatofilho@754
   387
                    return NULL;
renatofilho@754
   388
                    // goto done; 
renatofilho@754
   389
                }
renatofilho@754
   390
            }
renatofilho@754
   391
        }
renatofilho@754
   392
    }
rosfran@698
   393
renatofilho@754
   394
    time_micros = mktime(tm_time);
rosfran@698
   395
renatofilho@754
   396
    time->tv_sec = time_micros; // + (gint)( time_val->tv_usec /
renatofilho@754
   397
    // G_USEC_PER_SEC );
rosfran@698
   398
renatofilho@754
   399
    gmyth_debug("After mktime call... = %s", asctime(tm_time));
rosfran@698
   400
renatofilho@754
   401
    g_free(tm_time);
rosfran@698
   402
renatofilho@754
   403
    return time;
rosfran@223
   404
}
rosfran@223
   405
rosfran@223
   406
/** Converts a GString in the following format 
rosfran@223
   407
 * (e.g. 2006-07-20 09:56:41) to a time_t struct.
rosfran@223
   408
 * 
rosfran@223
   409
 * @param time_str the string to be converted
rosfran@223
   410
 * @return time_t the time converted value
rosfran@223
   411
 */
renatofilho@754
   412
GTimeVal       *
renatofilho@750
   413
gmyth_util_string_to_time_val(const gchar * time_str)
rosfran@223
   414
{
renatofilho@754
   415
    GTimeVal       *time =
renatofilho@754
   416
        gmyth_util_string_to_time_val_fmt("%Y-%m-%d %H:%M:%S", time_str);
rosfran@698
   417
renatofilho@754
   418
    return time;
leo_sobral@1
   419
}
leo_sobral@1
   420
rosfran@420
   421
/** 
rosfran@420
   422
 * Checks if the given remote file exists.
rosfran@420
   423
 * 
rosfran@420
   424
 * @param backend_info The GMythBackendInfo instance.
rosfran@420
   425
 * @param filename The file name of the remote file.
rosfran@420
   426
 * 
rosfran@420
   427
 * @return <code>true</code>, if the remote file exists.
rosfran@420
   428
 */
melunko@125
   429
gboolean
renatofilho@750
   430
gmyth_util_file_exists(GMythBackendInfo * backend_info,
renatofilho@754
   431
                       const gchar * filename)
melunko@125
   432
{
renatofilho@754
   433
    GMythSocket    *socket;
renatofilho@769
   434
    gboolean        res = FALSE;
rosfran@698
   435
renatofilho@754
   436
    gmyth_debug("Check if file %s exists", filename);
melunko@412
   437
renatofilho@754
   438
    g_return_val_if_fail(backend_info != NULL, FALSE);
renatofilho@754
   439
    g_return_val_if_fail(filename != NULL, FALSE);
melunko@412
   440
renatofilho@769
   441
    socket = gmyth_backend_info_get_connected_socket (backend_info);
renatofilho@769
   442
    if (socket != NULL) {
renatofilho@769
   443
        res = gmyth_util_file_exists_from_socket (socket, filename);
renatofilho@770
   444
        g_object_unref(socket);
renatofilho@754
   445
    }
renatofilho@754
   446
    return res;
melunko@125
   447
}
melunko@125
   448
renatofilho@769
   449
gboolean
renatofilho@769
   450
gmyth_util_file_exists_from_socket (GMythSocket *sock, 
renatofilho@769
   451
                                    const gchar *filename)
renatofilho@769
   452
{
melunko@798
   453
    gboolean res = FALSE;
melunko@798
   454
    gint length = 0;
renatofilho@769
   455
    GMythStringList *slist;
renatofilho@769
   456
    GMythProgramInfo *program = NULL;
renatofilho@769
   457
renatofilho@769
   458
    program = gmyth_program_info_new();
renatofilho@769
   459
    program->pathname = g_string_new(filename);
renatofilho@769
   460
renatofilho@769
   461
    slist = gmyth_string_list_new();
renatofilho@769
   462
    gmyth_string_list_append_char_array(slist, "QUERY_CHECKFILE");
melunko@798
   463
    gmyth_program_info_to_string_list(program, slist);
renatofilho@769
   464
melunko@798
   465
    length = gmyth_socket_sendreceive_stringlist (sock, slist);
melunko@798
   466
    if (length > 0)
melunko@798
   467
        res = (gmyth_string_list_get_int(slist, 0) == 1);
renatofilho@769
   468
renatofilho@769
   469
    g_object_unref(program);
renatofilho@769
   470
    g_object_unref(slist);
renatofilho@769
   471
renatofilho@769
   472
    return res;
renatofilho@769
   473
}
melunko@798
   474
 
melunko@798
   475
gboolean
melunko@798
   476
gmyth_util_get_backend_details (GMythSocket *sock, GMythBackendDetails **details)
melunko@798
   477
{
melunko@798
   478
    gboolean res = FALSE;
melunko@798
   479
    gint length = 0;
melunko@798
   480
    GMythStringList *slist;
melunko@798
   481
melunko@798
   482
    slist = gmyth_string_list_new();
melunko@798
   483
    gmyth_string_list_append_char_array(slist, "QUERY_FREE_SPACE");
melunko@798
   484
melunko@798
   485
    length = gmyth_socket_sendreceive_stringlist (sock, slist);
melunko@798
   486
    if (length >= 8) {
melunko@798
   487
        *details = g_new0 (GMythBackendDetails, 1);
melunko@799
   488
        (*details)->total_space = gmyth_string_list_get_uint64 (slist, 4) * 1024;
melunko@799
   489
        (*details)->used_space = gmyth_string_list_get_uint64 (slist, 6) * 1024;
melunko@798
   490
        res = TRUE;
melunko@798
   491
    }
melunko@798
   492
melunko@798
   493
    g_object_unref(slist);
melunko@798
   494
melunko@798
   495
    return res;
melunko@798
   496
}
melunko@798
   497
melunko@798
   498
void
melunko@798
   499
gmyth_util_backend_details_free (GMythBackendDetails *details)
melunko@798
   500
{
melunko@798
   501
    g_free (details);
melunko@798
   502
}
melunko@798
   503
                     
renatofilho@769
   504
rosfran@420
   505
/** 
rosfran@420
   506
 * Checks if the given remote file exists, and gets its remote directory.
rosfran@420
   507
 * 
rosfran@420
   508
 * @param backend_info The GMythBackendInfo instance.
rosfran@420
   509
 * @param filename The file name of the remote file.
rosfran@420
   510
 * @param current_dir String pointer to the directory where the remote file is stored.
rosfran@420
   511
 * 
rosfran@420
   512
 * @return <code>true</code>, if the remote file exists.
rosfran@420
   513
 */
rosfran@384
   514
gboolean
renatofilho@750
   515
gmyth_util_file_exists_and_get_remote_dir(GMythBackendInfo * backend_info,
renatofilho@754
   516
                                          const gchar * filename,
renatofilho@754
   517
                                          gchar ** current_dir)
rosfran@384
   518
{
renatofilho@754
   519
    GMythSocket    *socket;
renatofilho@754
   520
    gboolean        res;
rosfran@698
   521
renatofilho@754
   522
    *current_dir = NULL;
rosfran@698
   523
renatofilho@754
   524
    socket = gmyth_socket_new();
renatofilho@754
   525
    res = gmyth_socket_connect_to_backend(socket, backend_info->hostname,
renatofilho@754
   526
                                          backend_info->port, TRUE);
rosfran@384
   527
renatofilho@754
   528
    if (res == TRUE) {
renatofilho@754
   529
        GMythStringList *slist;
renatofilho@754
   530
        GMythProgramInfo *program = NULL;
rosfran@384
   531
renatofilho@754
   532
        program = gmyth_program_info_new();
renatofilho@754
   533
        program->pathname = g_string_new(filename);
rosfran@384
   534
renatofilho@754
   535
        slist = gmyth_string_list_new();
renatofilho@754
   536
        gmyth_string_list_append_char_array(slist, "QUERY_CHECKFILE");
rosfran@384
   537
renatofilho@754
   538
        gmyth_program_info_to_string_list(program, slist);
rosfran@384
   539
renatofilho@754
   540
        gmyth_socket_sendreceive_stringlist(socket, slist);
rosfran@384
   541
renatofilho@754
   542
        res = (gmyth_string_list_get_int(slist, 0) == 1);
rosfran@698
   543
renatofilho@754
   544
        if ((gmyth_string_list_length(slist) > 1) &&
renatofilho@754
   545
            gmyth_string_list_get_char_array(slist, 1) != NULL)
renatofilho@754
   546
            *current_dir =
renatofilho@754
   547
                g_strdup(gmyth_string_list_get_char_array(slist, 1));
rosfran@698
   548
renatofilho@754
   549
        if (*current_dir != NULL)
renatofilho@754
   550
            gmyth_debug("Current directory = %s.", (*current_dir != NULL)
renatofilho@754
   551
                        ? *current_dir : "[directory not found]");
rosfran@698
   552
renatofilho@754
   553
        g_object_unref(program);
rosfran@384
   554
renatofilho@754
   555
        g_object_unref(slist);
rosfran@384
   556
renatofilho@754
   557
        gmyth_socket_close_connection(socket);
renatofilho@754
   558
    }
renatofilho@754
   559
    g_object_unref(socket);
renatofilho@754
   560
    return res;
rosfran@384
   561
}
rosfran@384
   562
rosfran@420
   563
/** 
rosfran@420
   564
 * Creates a file name to a possible existing remote file,
rosfran@420
   565
 * based on some fields of the LiveTV/recorded program info.
rosfran@420
   566
 * 
rosfran@420
   567
 * @param chan_id The channel ID number.
rosfran@420
   568
 * @param start_time The start time of the recording.
rosfran@420
   569
 * 
rosfran@420
   570
 * @return The string representing the file name.
rosfran@420
   571
 */
renatofilho@754
   572
gchar          *
renatofilho@750
   573
gmyth_util_create_filename(const gint chan_id, const GTimeVal * start_time)
rosfran@698
   574
{
renatofilho@754
   575
    gchar          *basename = NULL;
rosfran@384
   576
renatofilho@754
   577
    g_return_val_if_fail(start_time != NULL, NULL);
rosfran@384
   578
renatofilho@754
   579
    gchar          *isodate =
renatofilho@754
   580
        gmyth_util_time_to_isoformat_from_time_val_fmt("%Y%m%d%H%M%S",
renatofilho@754
   581
                                                       start_time);
rosfran@384
   582
renatofilho@754
   583
    basename = g_strdup_printf("%d_%s", chan_id, isodate);
rosfran@698
   584
renatofilho@754
   585
    gmyth_debug("Basename (from chan_id and start_time): %s", basename);
rosfran@698
   586
renatofilho@754
   587
    if (isodate)
renatofilho@754
   588
        g_free(isodate);
rosfran@698
   589
renatofilho@754
   590
    return basename;
rosfran@384
   591
}
renatofilho@222
   592
rosfran@479
   593
/** 
rosfran@479
   594
 * Gets the channel list.
rosfran@479
   595
 * 
rosfran@479
   596
 * @param backend_info The GMythBackendInfo instance.
rosfran@479
   597
 * 
rosfran@479
   598
 * @return a pointer to a GList with all the channels.
rosfran@479
   599
 */
renatofilho@754
   600
GList          *
renatofilho@750
   601
gmyth_util_get_channel_list(GMythBackendInfo * backend_info)
rosfran@479
   602
{
renatofilho@754
   603
    GMythRecorder  *recorder;
renatofilho@754
   604
    GList          *channel_list = NULL;
renatofilho@754
   605
    gboolean        res = FALSE;
rosfran@698
   606
renatofilho@754
   607
    gmyth_debug("Gets channel list.");
rosfran@479
   608
renatofilho@754
   609
    g_return_val_if_fail(backend_info != NULL, FALSE);
rosfran@479
   610
renatofilho@754
   611
    recorder =
renatofilho@754
   612
        gmyth_recorder_new(1,
renatofilho@754
   613
                           g_string_new(gmyth_backend_info_get_hostname
renatofilho@754
   614
                                        (backend_info)),
renatofilho@754
   615
                           gmyth_backend_info_get_port(backend_info));
renatofilho@754
   616
    res = gmyth_recorder_setup(recorder);
rosfran@479
   617
renatofilho@754
   618
    if (res == TRUE) {
renatofilho@754
   619
        // GList* channel_list = gmyth_recorder_get_channel_list( recorder 
renatofilho@754
   620
        // 
renatofilho@754
   621
        // 
renatofilho@754
   622
        // ); 
renatofilho@754
   623
        gmyth_debug("Yeah, got channel list!!!");
renatofilho@754
   624
        GList          *ch = NULL;
renatofilho@754
   625
        GMythChannelInfo *channel_info = NULL;
rosfran@698
   626
renatofilho@754
   627
        for (ch = gmyth_recorder_get_channel_list(recorder); ch != NULL;) {
renatofilho@754
   628
            channel_info = g_malloc0(sizeof(GMythChannelInfo));
renatofilho@754
   629
            channel_info->channel_ID = 0;
renatofilho@754
   630
            channel_info->channel_num =
renatofilho@754
   631
                g_string_new(g_strdup((gchar *) ch->data));
renatofilho@754
   632
            channel_info->channel_name = g_string_new("");
renatofilho@754
   633
            gmyth_debug("Printing channel info... (%s)",
renatofilho@754
   634
                        channel_info->channel_num->str);
renatofilho@754
   635
            channel_list =
renatofilho@754
   636
                g_list_append(channel_list,
renatofilho@754
   637
                              g_memdup(channel_info,
renatofilho@754
   638
                                       sizeof(GMythChannelInfo)));
rosfran@698
   639
renatofilho@754
   640
            ch = g_list_next(ch);
rosfran@698
   641
renatofilho@754
   642
            if (channel_info != NULL)
renatofilho@754
   643
                g_free(channel_info);
renatofilho@754
   644
        }
rosfran@480
   645
renatofilho@754
   646
    } /* if */
renatofilho@754
   647
    else {
renatofilho@754
   648
        gmyth_debug("No, couldn't get the channel list!!!");
renatofilho@754
   649
    }
rosfran@698
   650
renatofilho@754
   651
    gmyth_debug("Got %d channels!!!", g_list_length(channel_list));
rosfran@698
   652
rosfran@698
   653
renatofilho@754
   654
    g_object_unref(recorder);
rosfran@698
   655
renatofilho@754
   656
    return channel_list;
rosfran@479
   657
}
rosfran@479
   658
rosfran@568
   659
/** 
rosfran@568
   660
 * Gets all the recordings from remote encoder.
rosfran@568
   661
 * 
rosfran@568
   662
 * @param backend_info The GMythBackendInfo instance.
rosfran@568
   663
 * 
rosfran@568
   664
 * @return The program info's listage.
rosfran@568
   665
 */
renatofilho@754
   666
GSList         *
renatofilho@750
   667
gmyth_util_get_all_recordings(GMythBackendInfo * backend_info)
rosfran@568
   668
{
renatofilho@754
   669
    GSList         *program_list = NULL;
renatofilho@754
   670
    GMythSocket    *socket;
renatofilho@754
   671
    gboolean        res;
rosfran@698
   672
renatofilho@754
   673
    socket = gmyth_socket_new();
renatofilho@754
   674
    res = gmyth_socket_connect_to_backend(socket, backend_info->hostname,
renatofilho@754
   675
                                          backend_info->port, TRUE);
rosfran@568
   676
renatofilho@754
   677
    if (res == TRUE) {
renatofilho@754
   678
        GMythStringList *slist = gmyth_string_list_new();
renatofilho@754
   679
        guint           pos = 0;
rosfran@698
   680
renatofilho@754
   681
        gmyth_string_list_append_char_array(slist,
renatofilho@754
   682
                                            "QUERY_RECORDINGS Play");
rosfran@568
   683
renatofilho@754
   684
        gmyth_socket_sendreceive_stringlist(socket, slist);
rosfran@568
   685
renatofilho@754
   686
        if (slist != NULL && (gmyth_string_list_length(slist) > 0)) {
renatofilho@754
   687
            GMythProgramInfo *program = NULL;
rosfran@698
   688
renatofilho@754
   689
            gmyth_debug("OK! Got the program list [size=%d].",
renatofilho@754
   690
                        gmyth_string_list_length(slist));
rosfran@698
   691
renatofilho@754
   692
            do {
renatofilho@754
   693
                program =
renatofilho@754
   694
                    gmyth_program_info_from_string_list_from_pos(slist,
renatofilho@754
   695
                                                                 pos);
rosfran@698
   696
renatofilho@754
   697
                if (program != NULL) {
renatofilho@754
   698
                    pos += 41;
rosfran@698
   699
renatofilho@754
   700
                    program_list = g_slist_append(program_list, program);
renatofilho@754
   701
                } else
renatofilho@754
   702
                    break;
rosfran@698
   703
renatofilho@754
   704
            }
renatofilho@754
   705
            while (gmyth_string_list_length(slist) > pos);
rosfran@698
   706
renatofilho@754
   707
        }
renatofilho@754
   708
        /*
renatofilho@754
   709
         * if 
renatofilho@754
   710
         */
renatofilho@754
   711
        g_object_unref(slist);
rosfran@568
   712
renatofilho@754
   713
        gmyth_socket_close_connection(socket);
renatofilho@754
   714
    }
renatofilho@754
   715
    g_object_unref(socket);
rosfran@698
   716
renatofilho@754
   717
    return program_list;
rosfran@568
   718
}
rosfran@568
   719
rosfran@568
   720
/** 
rosfran@568
   721
 * Checks if the given remote file exists, and gets its remote directory.
rosfran@568
   722
 * 
rosfran@568
   723
 * @param backend_info The GMythBackendInfo instance.
rosfran@568
   724
 * @param channel The channel name of the program info.
rosfran@568
   725
 * 
rosfran@568
   726
 * @return The requested program info.
rosfran@568
   727
 */
rosfran@568
   728
GMythProgramInfo *
renatofilho@750
   729
gmyth_util_get_recording_from_channel(GMythBackendInfo * backend_info,
renatofilho@754
   730
                                      const gchar * channel)
rosfran@568
   731
{
renatofilho@754
   732
    GSList         *program_list = NULL;
renatofilho@754
   733
    GMythProgramInfo *program = NULL;
rosfran@568
   734
renatofilho@754
   735
    program_list = gmyth_util_get_all_recordings(backend_info);
rosfran@698
   736
renatofilho@754
   737
    if (program_list != NULL && g_slist_length(program_list) > 0) {
renatofilho@754
   738
        GMythProgramInfo *program = NULL;
renatofilho@754
   739
        guint           pos = 0;
rosfran@698
   740
renatofilho@754
   741
        gmyth_debug("OK! Got the program list [size=%d].",
renatofilho@754
   742
                    g_slist_length(program_list));
rosfran@698
   743
renatofilho@754
   744
        while (pos < g_slist_length(program_list)) {
renatofilho@754
   745
            program =
renatofilho@754
   746
                (GMythProgramInfo *) g_slist_nth_data(program_list, pos);
rosfran@698
   747
renatofilho@754
   748
            if (program != NULL && program->channame != NULL &&
renatofilho@754
   749
                g_ascii_strncasecmp(program->channame->str, channel,
renatofilho@754
   750
                                    strlen(channel)) == 0) {
renatofilho@754
   751
                break;
renatofilho@754
   752
            }
rosfran@698
   753
renatofilho@754
   754
            ++pos;
rosfran@698
   755
renatofilho@754
   756
        }                       /* while */
rosfran@698
   757
renatofilho@754
   758
    }
renatofilho@754
   759
    /*
renatofilho@754
   760
     * if 
renatofilho@754
   761
     */
renatofilho@754
   762
    return program;
rosfran@568
   763
}
rosfran@568
   764
renatofilho@222
   765
#if !GLIB_CHECK_VERSION (2, 10, 0)
renatofilho@222
   766
renatofilho@754
   767
/*
renatofilho@754
   768
 * Hacked from glib 2.10 <gtime.c> 
renatofilho@754
   769
 */
renatofilho@222
   770
renatofilho@754
   771
static          time_t
renatofilho@750
   772
mktime_utc(struct tm *tm)
renatofilho@222
   773
{
renatofilho@754
   774
    time_t          retval;
rosfran@698
   775
renatofilho@222
   776
#ifndef HAVE_TIMEGM
renatofilho@754
   777
    static const gint days_before[] = {
renatofilho@754
   778
        0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
renatofilho@754
   779
    };
renatofilho@222
   780
#endif
renatofilho@222
   781
renatofilho@222
   782
#ifndef HAVE_TIMEGM
renatofilho@754
   783
    if (tm->tm_mon < 0 || tm->tm_mon > 11)
renatofilho@754
   784
        return (time_t) - 1;
renatofilho@222
   785
renatofilho@754
   786
    retval = (tm->tm_year - 70) * 365;
renatofilho@754
   787
    retval += (tm->tm_year - 68) / 4;
renatofilho@754
   788
    retval += days_before[tm->tm_mon] + tm->tm_mday - 1;
rosfran@698
   789
renatofilho@754
   790
    if (tm->tm_year % 4 == 0 && tm->tm_mon < 2)
renatofilho@754
   791
        retval -= 1;
rosfran@698
   792
renatofilho@754
   793
    retval =
renatofilho@754
   794
        ((((retval * 24) + tm->tm_hour) * 60) + tm->tm_min) * 60 +
renatofilho@754
   795
        tm->tm_sec;
renatofilho@222
   796
#else
renatofilho@754
   797
    retval = timegm(tm);
renatofilho@754
   798
#endif                          /* !HAVE_TIMEGM */
rosfran@698
   799
renatofilho@754
   800
    return retval;
renatofilho@222
   801
}
renatofilho@222
   802
renatofilho@222
   803
gboolean
renatofilho@750
   804
g_time_val_from_iso8601(const gchar * iso_date, GTimeVal * time_)
renatofilho@222
   805
{
renatofilho@754
   806
    struct tm       tm;
renatofilho@754
   807
    long            val;
renatofilho@222
   808
renatofilho@754
   809
    g_return_val_if_fail(iso_date != NULL, FALSE);
renatofilho@754
   810
    g_return_val_if_fail(time_ != NULL, FALSE);
renatofilho@222
   811
renatofilho@754
   812
    val = strtoul(iso_date, (char **) &iso_date, 10);
renatofilho@754
   813
    if (*iso_date == '-') {
renatofilho@754
   814
        /*
renatofilho@754
   815
         * YYYY-MM-DD 
renatofilho@754
   816
         */
renatofilho@754
   817
        tm.tm_year = val - 1900;
renatofilho@754
   818
        iso_date++;
renatofilho@754
   819
        tm.tm_mon = strtoul(iso_date, (char **) &iso_date, 10) - 1;
rosfran@698
   820
renatofilho@754
   821
        if (*iso_date++ != '-')
renatofilho@754
   822
            return FALSE;
rosfran@698
   823
renatofilho@754
   824
        tm.tm_mday = strtoul(iso_date, (char **) &iso_date, 10);
renatofilho@754
   825
    } else {
renatofilho@754
   826
        /*
renatofilho@754
   827
         * YYYYMMDD 
renatofilho@754
   828
         */
renatofilho@754
   829
        tm.tm_mday = val % 100;
renatofilho@754
   830
        tm.tm_mon = (val % 10000) / 100 - 1;
renatofilho@754
   831
        tm.tm_year = val / 10000 - 1900;
renatofilho@754
   832
    }
renatofilho@222
   833
renatofilho@754
   834
    if (*iso_date++ != 'T')
renatofilho@754
   835
        return FALSE;
rosfran@698
   836
renatofilho@754
   837
    val = strtoul(iso_date, (char **) &iso_date, 10);
renatofilho@754
   838
    if (*iso_date == ':') {
renatofilho@754
   839
        /*
renatofilho@754
   840
         * hh:mm:ss 
renatofilho@754
   841
         */
renatofilho@754
   842
        tm.tm_hour = val;
renatofilho@754
   843
        iso_date++;
renatofilho@754
   844
        tm.tm_min = strtoul(iso_date, (char **) &iso_date, 10);
rosfran@698
   845
renatofilho@754
   846
        if (*iso_date++ != ':')
renatofilho@754
   847
            return FALSE;
rosfran@698
   848
renatofilho@754
   849
        tm.tm_sec = strtoul(iso_date, (char **) &iso_date, 10);
renatofilho@754
   850
    } else {
renatofilho@754
   851
        /*
renatofilho@754
   852
         * hhmmss 
renatofilho@754
   853
         */
renatofilho@754
   854
        tm.tm_sec = val % 100;
renatofilho@754
   855
        tm.tm_min = (val % 10000) / 100;
renatofilho@754
   856
        tm.tm_hour = val / 10000;
renatofilho@754
   857
    }
renatofilho@222
   858
renatofilho@754
   859
    time_->tv_sec = mktime_utc(&tm);
renatofilho@754
   860
    time_->tv_usec = 1;
renatofilho@222
   861
renatofilho@754
   862
    if (*iso_date == '.')
renatofilho@754
   863
        time_->tv_usec = strtoul(iso_date + 1, (char **) &iso_date, 10);
rosfran@698
   864
renatofilho@754
   865
    if (*iso_date == '+' || *iso_date == '-') {
renatofilho@754
   866
        gint            sign = (*iso_date == '+') ? -1 : 1;
rosfran@698
   867
renatofilho@754
   868
        val = 60 * strtoul(iso_date + 1, (char **) &iso_date, 10);
rosfran@698
   869
renatofilho@754
   870
        if (*iso_date == ':')
renatofilho@754
   871
            val = 60 * val + strtoul(iso_date + 1, NULL, 10);
renatofilho@754
   872
        else
renatofilho@754
   873
            val = 60 * (val / 100) + (val % 100);
rosfran@698
   874
renatofilho@754
   875
        time_->tv_sec += (time_t) (val * sign);
renatofilho@754
   876
    }
renatofilho@222
   877
renatofilho@754
   878
    return TRUE;
renatofilho@222
   879
}
renatofilho@222
   880
renatofilho@222
   881
renatofilho@754
   882
gchar          *
renatofilho@750
   883
g_time_val_to_iso8601(GTimeVal * time_)
renatofilho@222
   884
{
renatofilho@754
   885
    gchar          *retval;
renatofilho@222
   886
renatofilho@754
   887
    g_return_val_if_fail(time_->tv_usec >= 0
renatofilho@754
   888
                         && time_->tv_usec < G_USEC_PER_SEC, NULL);
renatofilho@222
   889
renatofilho@222
   890
#define ISO_8601_LEN    21
renatofilho@222
   891
#define ISO_8601_FORMAT "%Y-%m-%dT%H:%M:%SZ"
renatofilho@754
   892
    retval = g_new0(gchar, ISO_8601_LEN + 1);
rosfran@698
   893
renatofilho@754
   894
    strftime(retval, ISO_8601_LEN, ISO_8601_FORMAT,
renatofilho@754
   895
             gmtime(&(time_->tv_sec)));
rosfran@698
   896
renatofilho@754
   897
    return retval;
renatofilho@222
   898
}
renatofilho@222
   899
renatofilho@222
   900
renatofilho@754
   901
/*
renatofilho@754
   902
 * Hacked from glib 2.10 <gdate.c> 
renatofilho@754
   903
 */
renatofilho@222
   904
rosfran@698
   905
void
renatofilho@750
   906
g_date_set_time_t(GDate * date, time_t timet)
renatofilho@222
   907
{
renatofilho@754
   908
    struct tm       tm;
rosfran@698
   909
renatofilho@754
   910
    g_return_if_fail(date != NULL);
rosfran@698
   911
renatofilho@222
   912
#ifdef HAVE_LOCALTIME_R
renatofilho@754
   913
    localtime_r(&timet, &tm);
renatofilho@222
   914
#else
renatofilho@754
   915
    {
renatofilho@754
   916
        struct tm      *ptm = localtime(&timet);
renatofilho@222
   917
renatofilho@754
   918
        if (ptm == NULL) {
renatofilho@754
   919
            /*
renatofilho@754
   920
             * Happens at least in Microsoft's C library if you pass a
renatofilho@754
   921
             * negative time_t. Use 2000-01-01 as default date. 
renatofilho@754
   922
             */
renatofilho@222
   923
#ifndef G_DISABLE_CHECKS
renatofilho@754
   924
            g_return_if_fail_warning(G_LOG_DOMAIN, "g_date_set_time",
renatofilho@754
   925
                                     "ptm != NULL");
renatofilho@222
   926
#endif
renatofilho@222
   927
renatofilho@754
   928
            tm.tm_mon = 0;
renatofilho@754
   929
            tm.tm_mday = 1;
renatofilho@754
   930
            tm.tm_year = 100;
renatofilho@754
   931
        } else
renatofilho@754
   932
            memcpy((void *) &tm, (void *) ptm, sizeof(struct tm));
renatofilho@754
   933
    }
renatofilho@222
   934
#endif
rosfran@698
   935
renatofilho@754
   936
    date->julian = FALSE;
rosfran@698
   937
renatofilho@754
   938
    date->month = tm.tm_mon + 1;
renatofilho@754
   939
    date->day = tm.tm_mday;
renatofilho@754
   940
    date->year = tm.tm_year + 1900;
rosfran@698
   941
renatofilho@754
   942
    g_return_if_fail(g_date_valid_dmy(date->day, date->month, date->year));
rosfran@698
   943
renatofilho@754
   944
    date->dmy = TRUE;
renatofilho@222
   945
}
renatofilho@222
   946
renatofilho@222
   947
renatofilho@222
   948
void
renatofilho@750
   949
g_date_set_time_val(GDate * date, GTimeVal * timeval)
renatofilho@222
   950
{
renatofilho@754
   951
    g_date_set_time_t(date, (time_t) timeval->tv_sec);
renatofilho@222
   952
}
renatofilho@222
   953
renatofilho@222
   954
renatofilho@222
   955
renatofilho@222
   956
renatofilho@222
   957
#endif