]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/datetime.h
adapting to autorelease of factory methods
[wxWidgets.git] / include / wx / datetime.h
index 7677de54eda156e8cfb33cfe2d53144aa8829ad9..95a38f562ab66553cdb48488dc9a36c697517db0 100644 (file)
@@ -30,6 +30,9 @@
 class WXDLLIMPEXP_FWD_BASE wxDateTime;
 class WXDLLIMPEXP_FWD_BASE wxTimeSpan;
 class WXDLLIMPEXP_FWD_BASE wxDateSpan;
+#ifdef __WXMSW__
+struct _SYSTEMTIME;
+#endif
 
 #include "wx/dynarray.h"
 
@@ -130,6 +133,40 @@ extern WXDLLIMPEXP_DATA_BASE(const wxDateTime) wxDefaultDateTime;
 
 #define wxInvalidDateTime wxDefaultDateTime
 
+
+// ----------------------------------------------------------------------------
+// conditional compilation
+// ----------------------------------------------------------------------------
+
+#if defined(HAVE_STRPTIME) && defined(__GLIBC__) && \
+        ((__GLIBC__ == 2) && (__GLIBC_MINOR__ == 0))
+    // glibc 2.0.7 strptime() is broken - the following snippet causes it to
+    // crash (instead of just failing):
+    //
+    //      strncpy(buf, "Tue Dec 21 20:25:40 1999", 128);
+    //      strptime(buf, "%x", &tm);
+    //
+    // so don't use it
+    #undef HAVE_STRPTIME
+#endif // broken strptime()
+
+#if defined(HAVE_STRPTIME) && defined(__DARWIN__) && defined(_MSL_USING_MW_C_HEADERS) && _MSL_USING_MW_C_HEADERS
+    // configure detects strptime as linkable because it's in the OS X
+    // System library but MSL headers don't declare it.
+
+//    char *strptime(const char *, const char *, struct tm *);
+    // However, we DON'T want to just provide it here because we would
+    // crash and/or overwrite data when strptime from OS X tries
+    // to fill in MW's struct tm which is two fields shorter (no TZ stuff)
+    // So for now let's just say we don't have strptime
+    #undef HAVE_STRPTIME
+#endif
+
+// everyone has strftime except Win CE unless VC8 is used
+#if !defined(__WXWINCE__) || defined(__VISUALC8__)
+    #define HAVE_STRFTIME
+#endif
+
 // ----------------------------------------------------------------------------
 // wxDateTime represents an absolute moment in the time
 // ----------------------------------------------------------------------------
@@ -230,7 +267,7 @@ public:
         // adoption of the Gregorian calendar (see IsGregorian())
         //
         // All data and comments taken verbatim from "The Calendar FAQ (v 2.0)"
-        // by Claus Tøndering, http://www.pip.dknet.dk/~c-t/calendar.html
+        // by Claus Tndering, http://www.pip.dknet.dk/~c-t/calendar.html
         // except for the comments "we take".
         //
         // Symbol "->" should be read as "was followed by" in the comments
@@ -598,6 +635,12 @@ public:
                       wxDateTime_t minute = 0,
                       wxDateTime_t second = 0,
                       wxDateTime_t millisec = 0);
+#ifdef __WXMSW__
+    wxDateTime(const struct _SYSTEMTIME& st)
+    {
+        SetFromMSWSysTime(st);
+    }
+#endif
 
         // default copy ctor ok
 
@@ -697,7 +740,7 @@ public:
     wxDateTime& SetToPrevWeekDay(WeekDay weekday);
     inline wxDateTime GetPrevWeekDay(WeekDay weekday) const;
 
-        // set to Nth occurence of given weekday in the given month of the
+        // set to Nth occurrence of given weekday in the given month of the
         // given year (time is set to 0), return true on success and false on
         // failure. n may be positive (1..5) or negative to count from the end
         // of the month (see helper function SetToLastWeekDay())
@@ -912,6 +955,17 @@ public:
         // pack the date in DOS format
     unsigned long GetAsDOS() const;
 
+    // SYSTEMTIME format
+    // ------------------------------------------------------------------------
+#ifdef __WXMSW__
+
+    // convert SYSTEMTIME to wxDateTime
+    wxDateTime& SetFromMSWSysTime(const struct _SYSTEMTIME&);
+
+    // convert wxDateTime to SYSTEMTIME
+    void GetAsMSWSysTime(struct _SYSTEMTIME*) const;
+#endif // __WXMSW__
+
     // comparison (see also functions below for operator versions)
     // ------------------------------------------------------------------------
 
@@ -1068,22 +1122,39 @@ public:
         // the missing (in the string) fields with the values of dateDef (by
         // default, they will not change if they had valid values or will
         // default to Today() otherwise)
+
+        // notice that we unfortunately need all those overloads because we use
+        // the type of the date string to select the return value of the
+        // function: it's wchar_t if a wide string is passed for compatibility
+        // with the code doing "const wxChar *p = dt.ParseFormat(_T("..."))",
+        // but char* in all other cases for compatibility with ANSI build which
+        // allowed code like "const char *p = dt.ParseFormat("...")"
+        //
+        // so we need wchar_t overload and now passing s.c_str() as first
+        // argument is ambiguous because it's convertible to both wxString and
+        // wchar_t* and now it's passing char* which becomes ambiguous as it is
+        // convertible to both wxString and wxCStrData hence we need char*
+        // overload too
+        //
+        // and to make our life more miserable we also pay for having the
+        // optional dateDef parameter: as it's almost never used, we want to
+        // allow people to omit it when specifying the end iterator output
+        // parameter but we still have to allow specifying dateDef too, so we
+        // need another overload for this
+        //
+        // FIXME: all this mess could be avoided by using some class similar to
+        //        wxFormatString, i.e. remembering string [pointer] of any type
+        //        and convertible to either char* or wchar_t* as wxCStrData and
+        //        having only 1 (or 2, because of the last paragraph above)
+        //        overload taking it, see #9560
     const char *ParseFormat(const wxString& date,
                             const wxString& format = wxDefaultDateTimeFormat,
                             const wxDateTime& dateDef = wxDefaultDateTime,
                             wxString::const_iterator *end = NULL);
 
     const char *ParseFormat(const wxString& date,
-                            const char *format = wxDefaultDateTimeFormat,
-                            const wxDateTime& dateDef = wxDefaultDateTime,
-                            wxString::const_iterator *end = NULL)
-    {
-        return ParseFormat(date, wxString(format), dateDef, end);
-    }
-
-    const char *ParseFormat(const wxString& date,
-                            const wxString& format = wxDefaultDateTimeFormat,
-                            wxString::const_iterator *end = NULL)
+                            const wxString& format,
+                            wxString::const_iterator *end)
     {
         return ParseFormat(date, format, wxDefaultDateTime, end);
     }
@@ -1115,12 +1186,6 @@ public:
         return ParseFormat(wxString(date), format, dateDef);
     }
 
-    const char *ParseFormat(const char *date,
-                            const char *format = wxDefaultDateTimeFormat,
-                            const wxDateTime& dateDef = wxDefaultDateTime)
-    {
-        return ParseFormat(wxString(date), wxString(format), dateDef);
-    }
 
         // parse a string containing date, time or both in ISO 8601 format
         //
@@ -1239,7 +1304,7 @@ public:
     inline wxLongLong GetValue() const;
 
     // a helper function to get the current time_t
-    static time_t GetTimeNow() { return time((time_t *)NULL); }
+    static time_t GetTimeNow() { return time(NULL); }
 
     // another one to get the current time broken down
     static struct tm *GetTmNow()
@@ -1413,7 +1478,7 @@ public:
         // compare two timestamps: works with the absolute values, i.e. 1
         // hour is shorter than -2 hours. Also, it will return false if the
         // timespans are equal in absolute value.
-    bool IsShorterThan(const wxTimeSpan& t) const { return !IsLongerThan(t); }
+    bool IsShorterThan(const wxTimeSpan& t) const;
 
     inline bool operator<(const wxTimeSpan &ts) const
     {
@@ -2183,6 +2248,11 @@ inline bool wxTimeSpan::IsLongerThan(const wxTimeSpan& ts) const
     return GetValue().Abs() > ts.GetValue().Abs();
 }
 
+inline bool wxTimeSpan::IsShorterThan(const wxTimeSpan& ts) const
+{
+    return GetValue().Abs() < ts.GetValue().Abs();
+}
+
 // ----------------------------------------------------------------------------
 // wxDateSpan
 // ----------------------------------------------------------------------------