]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/strconv.h
destroy m_impl even if an exception is thrown from the main loop
[wxWidgets.git] / include / wx / strconv.h
index eaecd92657e37307f38b64d3cbda77fe7e556fd1..c25a05017c303f082eea4b3b516000a4d941a41b 100644 (file)
@@ -14,7 +14,7 @@
 #define _WX_STRCONV_H_
 
 #include "wx/defs.h"
-#include "wx/wxchar.h"
+#include "wx/chartype.h"
 #include "wx/buffer.h"
 
 #ifdef __DIGITALMARS__
@@ -191,7 +191,8 @@ class WXDLLIMPEXP_BASE wxConvBrokenFileNames : public wxMBConv
 public:
     wxConvBrokenFileNames(const wxChar *charset);
     wxConvBrokenFileNames(const wxConvBrokenFileNames& conv)
-        : m_conv(conv.m_conv ? conv.m_conv->Clone() : NULL)
+        : wxMBConv(),
+          m_conv(conv.m_conv ? conv.m_conv->Clone() : NULL)
     {
     }
     virtual ~wxConvBrokenFileNames() { delete m_conv; }
@@ -286,15 +287,10 @@ protected:
 class WXDLLIMPEXP_BASE wxMBConvUTF16LE : public wxMBConvUTF16Base
 {
 public:
-#if SIZEOF_WCHAR_T == 2
     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;
-#else
-    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;
-#endif
     virtual wxMBConv *Clone() const { return new wxMBConvUTF16LE; }
 };
 
@@ -305,15 +301,10 @@ public:
 class WXDLLIMPEXP_BASE wxMBConvUTF16BE : public wxMBConvUTF16Base
 {
 public:
-#if SIZEOF_WCHAR_T == 2
     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;
-#else
-    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;
-#endif
     virtual wxMBConv *Clone() const { return new wxMBConvUTF16BE; }
 };
 
@@ -342,15 +333,10 @@ protected:
 class WXDLLIMPEXP_BASE wxMBConvUTF32LE : public wxMBConvUTF32Base
 {
 public:
-#if SIZEOF_WCHAR_T == 2
     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;
-#else
-    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;
-#endif
     virtual wxMBConv *Clone() const { return new wxMBConvUTF32LE; }
 };
 
@@ -361,15 +347,10 @@ public:
 class WXDLLIMPEXP_BASE wxMBConvUTF32BE : public wxMBConvUTF32Base
 {
 public:
-#if SIZEOF_WCHAR_T == 2
     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;
-#else
-    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;
-#endif
     virtual wxMBConv *Clone() const { return new wxMBConvUTF32BE; }
 };
 
@@ -392,13 +373,21 @@ public:
 
     wxCSConv& operator=(const wxCSConv& conv);
 
+    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 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 GetMBNulLen() const;
+
     virtual wxMBConv *Clone() const { return new wxCSConv(*this); }
 
     void Clear();
 
+    // return true if the conversion could be initilized successfully
+    bool IsOk() const;
+
 private:
     // common part of all ctors
     void Init();
@@ -454,9 +443,14 @@ extern WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvFileName;
 // default in a couple of places inside wx (initially same as wxConvLibc)
 extern WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvCurrent;
 
-// ???
+// the conversion corresponding to the current locale
 extern WXDLLIMPEXP_DATA_BASE(wxCSConv&) wxConvLocal;
 
+// the conversion corresponding to the encoding of the standard UI elements
+//
+// by default this is the same as wxConvLocal but may be changed if the program
+// needs to use a fixed encoding
+extern WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvUI;
 
 // ----------------------------------------------------------------------------
 // endianness-dependent conversions
@@ -474,8 +468,8 @@ extern WXDLLIMPEXP_DATA_BASE(wxCSConv&) wxConvLocal;
 // filename conversion macros
 // ----------------------------------------------------------------------------
 
-// filenames are multibyte on Unix and probably widechar on Windows?
-#if defined(__UNIX__) || defined(__BORLANDC__) || defined(__WXMAC__ )
+// filenames are multibyte on Unix and widechar on Windows
+#if defined(__UNIX__) || defined(__WXMAC__)
     #define wxMBFILES 1
 #else
     #define wxMBFILES 0
@@ -527,10 +521,25 @@ extern WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvCurrent;
 #if wxUSE_UNICODE
     #define wxConvertWX2MB(s)   wxConvCurrent->cWX2MB(s)
     #define wxConvertMB2WX(s)   wxConvCurrent->cMB2WX(s)
+
+    // these functions should be used when the conversions really, really have
+    // to succeed (usually because we pass their results to a standard C
+    // function which would crash if we passed NULL to it), so these functions
+    // always return a valid pointer if their argument is non-NULL
+
+    // this function safety is achieved by trying wxConvLibc first, wxConvUTF8
+    // next if it fails and, finally, wxConvISO8859_1 which always succeeds
+    extern WXDLLIMPEXP_BASE wxWCharBuffer wxSafeConvertMB2WX(const char *s);
+
+    // this function uses wxConvLibc and wxConvUTF8(MAP_INVALID_UTF8_TO_OCTAL)
+    // if it fails
+    extern WXDLLIMPEXP_BASE wxCharBuffer wxSafeConvertWX2MB(const wchar_t *ws);
 #else // ANSI
     // no conversions to do
     #define wxConvertWX2MB(s)   (s)
     #define wxConvertMB2WX(s)   (s)
+    #define wxSafeConvertMB2WX(s) (s)
+    #define wxSafeConvertWX2MB(s) (s)
 #endif // Unicode/ANSI
 
 #endif // _WX_STRCONV_H_