]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/strconv.h
fix bug with parsing negative time zones in ParseRfc822Date()
[wxWidgets.git] / include / wx / strconv.h
index 4360b7f6a32928eeffb0ab7628a40f8a1c3eb38d..96dc8d8a70b1511ab7b1dee9a78f43f94f55f139 100644 (file)
@@ -29,6 +29,8 @@
 
 #if wxUSE_WCHAR_T
 
 
 #if wxUSE_WCHAR_T
 
+class WXDLLIMPEXP_FWD_BASE wxString;
+
 // the error value returned by wxMBConv methods
 #define wxCONV_FAILED ((size_t)-1)
 
 // the error value returned by wxMBConv methods
 #define wxCONV_FAILED ((size_t)-1)
 
@@ -199,7 +201,7 @@ public:
 class WXDLLIMPEXP_BASE wxConvBrokenFileNames : public wxMBConv
 {
 public:
 class WXDLLIMPEXP_BASE wxConvBrokenFileNames : public wxMBConv
 {
 public:
-    wxConvBrokenFileNames(const wxChar *charset);
+    wxConvBrokenFileNames(const wxString& charset);
     wxConvBrokenFileNames(const wxConvBrokenFileNames& conv)
         : wxMBConv(),
           m_conv(conv.m_conv ? conv.m_conv->Clone() : NULL)
     wxConvBrokenFileNames(const wxConvBrokenFileNames& conv)
         : wxMBConv(),
           m_conv(conv.m_conv ? conv.m_conv->Clone() : NULL)
@@ -223,6 +225,10 @@ public:
         return m_conv->GetMBNulLen();
     }
 
         return m_conv->GetMBNulLen();
     }
 
+#if wxUSE_UNICODE_UTF8
+    virtual bool IsUTF8() const { return m_conv->IsUTF8(); }
+#endif
+
     virtual wxMBConv *Clone() const { return new wxConvBrokenFileNames(*this); }
 
 private:
     virtual wxMBConv *Clone() const { return new wxConvBrokenFileNames(*this); }
 
 private:
@@ -251,11 +257,31 @@ public:
 // wxMBConvUTF8 (for conversion using UTF8 encoding)
 // ----------------------------------------------------------------------------
 
 // wxMBConvUTF8 (for conversion using UTF8 encoding)
 // ----------------------------------------------------------------------------
 
-class WXDLLIMPEXP_BASE wxMBConvUTF8 : public wxMBConv
+// this is the real UTF-8 conversion class, it has to be called "strict UTF-8"
+// for compatibility reasons: the wxMBConvUTF8 class below also supports lossy
+// conversions if it is created with non default options
+class WXDLLIMPEXP_BASE wxMBConvStrictUTF8 : public wxMBConv
+{
+public:
+    // compiler-generated default ctor and other methods are ok
+
+    virtual size_t ToWChar(wchar_t *dst, size_t dstLen,
+                           const char *src, size_t srcLen = wxNO_LEN) const;
+    virtual size_t FromWChar(char *dst, size_t dstLen,
+                             const wchar_t *src, size_t srcLen = wxNO_LEN) const;
+
+    virtual wxMBConv *Clone() const { return new wxMBConvStrictUTF8(); }
+
+#if wxUSE_UNICODE_UTF8
+    // NB: other mapping modes are not, strictly speaking, UTF-8, so we can't
+    //     take the shortcut in that case
+    virtual bool IsUTF8() const { return true; }
+#endif
+};
+
+class WXDLLIMPEXP_BASE wxMBConvUTF8 : public wxMBConvStrictUTF8
 {
 public:
 {
 public:
-    // FIXME-UTF8: split this class into multiple classes, one strict and
-    //             other lossy (PUA, OCTAL mappings)
     enum
     {
         MAP_INVALID_UTF8_NOT = 0,
     enum
     {
         MAP_INVALID_UTF8_NOT = 0,
@@ -264,8 +290,11 @@ public:
     };
 
     wxMBConvUTF8(int options = MAP_INVALID_UTF8_NOT) : m_options(options) { }
     };
 
     wxMBConvUTF8(int options = MAP_INVALID_UTF8_NOT) : m_options(options) { }
-    virtual size_t MB2WC(wchar_t *outputBuf, const char *psz, size_t outputSize) const;
-    virtual size_t WC2MB(char *outputBuf, const wchar_t *psz, size_t outputSize) const;
+
+    virtual size_t ToWChar(wchar_t *dst, size_t dstLen,
+                           const char *src, size_t srcLen = wxNO_LEN) const;
+    virtual size_t FromWChar(char *dst, size_t dstLen,
+                             const wchar_t *src, size_t srcLen = wxNO_LEN) const;
 
     virtual wxMBConv *Clone() const { return new wxMBConvUTF8(m_options); }
 
 
     virtual wxMBConv *Clone() const { return new wxMBConvUTF8(m_options); }
 
@@ -383,7 +412,7 @@ class WXDLLIMPEXP_BASE wxCSConv : public wxMBConv
 public:
     // we can be created either from charset name or from an encoding constant
     // but we can't have both at once
 public:
     // we can be created either from charset name or from an encoding constant
     // but we can't have both at once
-    wxCSConv(const wxChar *charset);
+    wxCSConv(const wxString& charset);
     wxCSConv(wxFontEncoding encoding);
 
     wxCSConv(const wxCSConv& conv);
     wxCSConv(wxFontEncoding encoding);
 
     wxCSConv(const wxCSConv& conv);
@@ -399,6 +428,10 @@ public:
     virtual size_t WC2MB(char *outputBuf, const wchar_t *psz, size_t outputSize) const;
     virtual size_t GetMBNulLen() const;
 
     virtual size_t WC2MB(char *outputBuf, const wchar_t *psz, size_t outputSize) const;
     virtual size_t GetMBNulLen() const;
 
+#if wxUSE_UNICODE_UTF8
+    virtual bool IsUTF8() const;
+#endif
+
     virtual wxMBConv *Clone() const { return new wxCSConv(*this); }
 
     void Clear();
     virtual wxMBConv *Clone() const { return new wxCSConv(*this); }
 
     void Clear();
@@ -418,12 +451,12 @@ private:
 
     // set the name (may be only called when m_name == NULL), makes copy of
     // charset string
 
     // set the name (may be only called when m_name == NULL), makes copy of
     // charset string
-    void SetName(const wxChar *charset);
+    void SetName(const char *charset);
 
 
     // note that we can't use wxString here because of compilation
     // dependencies: we're included from wx/string.h
 
 
     // note that we can't use wxString here because of compilation
     // dependencies: we're included from wx/string.h
-    wxChar *m_name;
+    char *m_name;
     wxFontEncoding m_encoding;
 
     // use CreateConvIfNeeded() before accessing m_convReal!
     wxFontEncoding m_encoding;
 
     // use CreateConvIfNeeded() before accessing m_convReal!
@@ -442,7 +475,7 @@ private:
 // instead.
 #define WX_DECLARE_GLOBAL_CONV(klass, name)                             \
     extern WXDLLIMPEXP_DATA_BASE(klass*) name##Ptr;                     \
 // instead.
 #define WX_DECLARE_GLOBAL_CONV(klass, name)                             \
     extern WXDLLIMPEXP_DATA_BASE(klass*) name##Ptr;                     \
-    extern klass* WXDLLIMPEXP_BASE wxGet_##name##Ptr();                 \
+    extern WXDLLIMPEXP_BASE klass* wxGet_##name##Ptr();                 \
     inline klass& wxGet_##name()                                        \
     {                                                                   \
         if ( !name##Ptr )                                               \
     inline klass& wxGet_##name()                                        \
     {                                                                   \
         if ( !name##Ptr )                                               \
@@ -460,7 +493,7 @@ WX_DECLARE_GLOBAL_CONV(wxMBConv, wxConvLibc)
 WX_DECLARE_GLOBAL_CONV(wxCSConv, wxConvISO8859_1)
 #define wxConvISO8859_1 wxGet_wxConvISO8859_1()
 
 WX_DECLARE_GLOBAL_CONV(wxCSConv, wxConvISO8859_1)
 #define wxConvISO8859_1 wxGet_wxConvISO8859_1()
 
-WX_DECLARE_GLOBAL_CONV(wxMBConvUTF8, wxConvUTF8)
+WX_DECLARE_GLOBAL_CONV(wxMBConvStrictUTF8, wxConvUTF8)
 #define wxConvUTF8 wxGet_wxConvUTF8()
 
 WX_DECLARE_GLOBAL_CONV(wxMBConvUTF7, wxConvUTF7)
 #define wxConvUTF8 wxGet_wxConvUTF8()
 
 WX_DECLARE_GLOBAL_CONV(wxMBConvUTF7, wxConvUTF7)
@@ -511,12 +544,6 @@ extern WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvUI;
 // ----------------------------------------------------------------------------
 
 // filenames are multibyte on Unix and widechar on Windows
 // ----------------------------------------------------------------------------
 
 // filenames are multibyte on Unix and widechar on Windows
-#if defined(__UNIX__) || defined(__WXMAC__)
-    #define wxMBFILES 1
-#else
-    #define wxMBFILES 0
-#endif
-
 #if wxMBFILES && wxUSE_UNICODE
     #define wxFNCONV(name) wxConvFileName->cWX2MB(name)
     #define wxFNSTRINGCAST wxMBSTRINGCAST
 #if wxMBFILES && wxUSE_UNICODE
     #define wxFNCONV(name) wxConvFileName->cWX2MB(name)
     #define wxFNSTRINGCAST wxMBSTRINGCAST