More support for pre-Epoch dates for Windows.
[claws.git] / src / procheader.c
index fa4ef49bbb4af51f6635b1504d85b80f6851fb62..a9bfa5ddd058117ef2e93c2930b6decac56eff3a 100644 (file)
@@ -841,9 +841,8 @@ static gint procheader_scan_date_string(const gchar *str,
        *weekday = '\0';
 
        /* RFC3339 subset, with fraction of second */
-       result = sscanf(str, "%4d-%2d-%2d%c%2d:%2d:%2d.%1d%6s",
+       result = sscanf(str, "%4d-%2d-%2d%c%2d:%2d:%2d.%d%6s",
                        year, &month_n, day, &sep1, hh, mm, ss, &secfract, zonestr);
-       debug_print("str |%s|, result %d\n", str, result);
        if (result == 9
                        && (sep1 == 'T' || sep1 == 't' || sep1 == ' ')) {
                if (month_n >= 1 && month_n <= 12) {
@@ -861,12 +860,11 @@ static gint procheader_scan_date_string(const gchar *str,
        /* RFC3339 subset, no fraction of second */
        result = sscanf(str, "%4d-%2d-%2d%c%2d:%2d:%2d%6s",
                        year, &month_n, day, &sep1, hh, mm, ss, zonestr);
-       debug_print("str |%s|, result %d\n", str, result);
        if (result == 8
                        && (sep1 == 'T' || sep1 == 't' || sep1 == ' ')) {
                if (month_n >= 1 && month_n <= 12) {
                        strncpy2(month, monthstr+((month_n-1)*3), 4);
-                       if (offset_sign == 'z' || offset_sign == 'Z') {
+                       if (zonestr[0] == 'z' || zonestr[0] == 'Z') {
                                strcat(zone, "+00:00");
                        } else if (sscanf(zonestr, "%c%2d:%2d",
                                                &offset_sign, &zone1, &zone2) == 3) {
@@ -913,7 +911,7 @@ gboolean procheader_date_parse_to_tm(const gchar *src, struct tm *t, char *zone)
 
        if (procheader_scan_date_string(src, weekday, &day, month, &year,
                                        &hh, &mm, &ss, zone) < 0) {
-               g_warning("Invalid date: %s\n", src);
+               g_warning("Invalid date: %s", src);
                return FALSE;
        }
 
@@ -929,7 +927,7 @@ gboolean procheader_date_parse_to_tm(const gchar *src, struct tm *t, char *zone)
        if ((p = strstr(monthstr, month)) != NULL)
                dmonth = (gint)(p - monthstr) / 3 + 1;
        else {
-               g_warning("Invalid month: %s\n", month);
+               g_warning("Invalid month: %s", month);
                dmonth = G_DATE_BAD_MONTH;
        }
 
@@ -957,10 +955,8 @@ time_t procheader_date_parse(gchar *dest, const gchar *src, gint len)
        gint hh, mm, ss;
        gchar zone[7];
        GDateMonth dmonth = G_DATE_BAD_MONTH;
-       struct tm t;
        gchar *p;
        time_t timer;
-       time_t tz_offset;
 
        if (procheader_scan_date_string(src, weekday, &day, month, &year,
                                        &hh, &mm, &ss, zone) < 0) {
@@ -969,14 +965,6 @@ time_t procheader_date_parse(gchar *dest, const gchar *src, gint len)
                return 0;
        }
 
-       /* Y2K compliant :) */
-       if (year < 1000) {
-               if (year < 50)
-                       year += 2000;
-               else
-                       year += 1900;
-       }
-
        month[3] = '\0';
        for (p = monthstr; *p != '\0'; p += 3) {
                if (!g_ascii_strncasecmp(p, month, 3)) {
@@ -985,6 +973,30 @@ time_t procheader_date_parse(gchar *dest, const gchar *src, gint len)
                }
        }
 
+#ifdef G_OS_WIN32
+       GTimeZone *tz;
+       GDateTime *dt;
+
+       tz = g_time_zone_new(zone);
+       dt = g_date_time_new(tz, year, dmonth, day, hh, mm, ss);
+
+       timer = g_date_time_to_unix(dt);
+
+       g_date_time_unref(dt);
+       g_time_zone_unref(tz);
+
+#else
+       struct tm t;
+       time_t tz_offset;
+
+       /* Y2K compliant :) */
+       if (year < 1000) {
+               if (year < 50)
+                       year += 2000;
+               else
+                       year += 1900;
+       }
+
        t.tm_sec = ss;
        t.tm_min = mm;
        t.tm_hour = hh;
@@ -1002,6 +1014,7 @@ time_t procheader_date_parse(gchar *dest, const gchar *src, gint len)
 
        if (dest)
                procheader_date_get_localtime(dest, len, timer);
+#endif
 
        return timer;
 }