+class WXDLLIMPEXP_FWD_BASE wxString;
+
+// the error value returned by wxMBConv methods
+#define wxCONV_FAILED ((size_t)-1)
+
+// ----------------------------------------------------------------------------
+// wxMBConv (abstract base class for conversions)
+// ----------------------------------------------------------------------------
+
+// When deriving a new class from wxMBConv you must reimplement ToWChar() and
+// FromWChar() methods which are not pure virtual only for historical reasons,
+// don't let the fact that the existing classes implement MB2WC/WC2MB() instead
+// confuse you.
+//
+// You also have to implement Clone() to allow copying the conversions
+// polymorphically.
+//
+// And you might need to override GetMBNulLen() as well.
+class WXDLLIMPEXP_BASE wxMBConv
+{
+public:
+ // The functions doing actual conversion from/to narrow to/from wide
+ // character strings.
+ //
+ // On success, the return value is the length (i.e. the number of
+ // characters, not bytes) of the converted string including any trailing
+ // L'\0' or (possibly multiple) '\0'(s). If the conversion fails or if
+ // there is not enough space for everything, including the trailing NUL
+ // character(s), in the output buffer, wxCONV_FAILED is returned.
+ //
+ // In the special case when dst is NULL (the value of dstLen is ignored
+ // then) the return value is the length of the needed buffer but nothing
+ // happens otherwise. If srcLen is wxNO_LEN, the entire string, up to and
+ // including the trailing NUL(s), is converted, otherwise exactly srcLen
+ // bytes are.
+ //
+ // Typical usage:
+ //
+ // size_t dstLen = conv.ToWChar(NULL, 0, src);
+ // if ( dstLen == wxCONV_FAILED )
+ // ... handle error ...
+ // wchar_t *wbuf = new wchar_t[dstLen];
+ // conv.ToWChar(wbuf, dstLen, src);
+ // ... work with wbuf ...
+ // delete [] wbuf;
+ //
+ 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;
+
+
+ // Convenience functions for translating NUL-terminated strings: returns
+ // the buffer containing the converted string or NULL pointer if the
+ // conversion failed.
+ const wxWCharBuffer cMB2WC(const char *in) const;
+ const wxCharBuffer cWC2MB(const wchar_t *in) const;
+
+ // Convenience functions for converting strings which may contain embedded
+ // NULs and don't have to be NUL-terminated.
+ //
+ // inLen is the length of the buffer including trailing NUL if any or
+ // wxNO_LEN if the input is NUL-terminated.
+ //
+ // outLen receives, if not NULL, the length of the converted string or 0 if
+ // the conversion failed (returning 0 and not -1 in this case makes it
+ // difficult to distinguish between failed conversion and empty input but
+ // this is done for backwards compatibility). Notice that the rules for
+ // whether outLen accounts or not for the last NUL are the same as for
+ // To/FromWChar() above: if inLen is specified, outLen is exactly the
+ // number of characters converted, whether the last one of them was NUL or
+ // not. But if inLen == wxNO_LEN then outLen doesn't account for the last
+ // NUL even though it is present.
+ const wxWCharBuffer
+ cMB2WC(const char *in, size_t inLen, size_t *outLen) const;
+ const wxCharBuffer
+ cWC2MB(const wchar_t *in, size_t inLen, size_t *outLen) const;
+
+ // And yet more convenience functions for converting the entire buffers:
+ // these are the simplest and least error-prone as you never need to bother
+ // with lengths/sizes directly.
+ const wxWCharBuffer cMB2WC(const wxScopedCharBuffer& in) const;
+ const wxCharBuffer cWC2MB(const wxScopedWCharBuffer& in) const;
+
+ // convenience functions for converting MB or WC to/from wxWin default
+#if wxUSE_UNICODE
+ const wxWCharBuffer cMB2WX(const char *psz) const { return cMB2WC(psz); }
+ const wxCharBuffer cWX2MB(const wchar_t *psz) const { return cWC2MB(psz); }
+ const wchar_t* cWC2WX(const wchar_t *psz) const { return psz; }
+ const wchar_t* cWX2WC(const wchar_t *psz) const { return psz; }
+#else // ANSI
+ const char* cMB2WX(const char *psz) const { return psz; }
+ const char* cWX2MB(const char *psz) const { return psz; }
+ const wxCharBuffer cWC2WX(const wchar_t *psz) const { return cWC2MB(psz); }
+ const wxWCharBuffer cWX2WC(const char *psz) const { return cMB2WC(psz); }
+#endif // Unicode/ANSI
+
+ // this function is used in the implementation of cMB2WC() to distinguish
+ // between the following cases:
+ //
+ // a) var width encoding with strings terminated by a single NUL
+ // (usual multibyte encodings): return 1 in this case
+ // b) fixed width encoding with 2 bytes/char and so terminated by
+ // 2 NULs (UTF-16/UCS-2 and variants): return 2 in this case
+ // c) fixed width encoding with 4 bytes/char and so terminated by
+ // 4 NULs (UTF-32/UCS-4 and variants): return 4 in this case
+ //
+ // anything else is not supported currently and -1 should be returned
+ virtual size_t GetMBNulLen() const { return 1; }
+
+ // return the maximal value currently returned by GetMBNulLen() for any
+ // encoding
+ static size_t GetMaxMBNulLen() { return 4 /* for UTF-32 */; }
+
+#if wxUSE_UNICODE_UTF8
+ // return true if the converter's charset is UTF-8, i.e. char* strings
+ // decoded using this object can be directly copied to wxString's internal
+ // storage without converting to WC and than back to UTF-8 MB string
+ virtual bool IsUTF8() const { return false; }
+#endif