From 40ac5040ce7de5b2849c01543cace239ad8a7639 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 12 Sep 2009 22:40:25 +0000 Subject: [PATCH] Add convenient wxMBConv::cMB2WC/WC2MB overloads taking buffers. These overloads allow not to worry about buffer lengths and just convert between wxCharBuffer and wxWCharBuffer directly in a convenient way. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61896 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + include/wx/strconv.h | 6 ++++++ interface/wx/strconv.h | 34 ++++++++++++++++++++++++++++++++++ src/common/strconv.cpp | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+) diff --git a/docs/changes.txt b/docs/changes.txt index 8043a1d7b7..805c8b5bcc 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -380,6 +380,7 @@ All: - Added bilinear image resizing algorithm to wxImage (bishop). - Fix bug with position argument in wxImage::Size() (Byron Sorgdrager). - Fix bug with parsing concatenated switches in wxCmdLineParser (Mike Funduc). +- Added wxMBConv::cMB2WC(wxCharBuffer) and cWC2MB(wxWCharBuffer) overloads. All (GUI): diff --git a/include/wx/strconv.h b/include/wx/strconv.h index 0061aa770c..87911259a3 100644 --- a/include/wx/strconv.h +++ b/include/wx/strconv.h @@ -108,6 +108,12 @@ public: 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); } diff --git a/interface/wx/strconv.h b/interface/wx/strconv.h index 174133388e..2f1f55eda8 100644 --- a/interface/wx/strconv.h +++ b/interface/wx/strconv.h @@ -177,6 +177,23 @@ public: size_t inLen, size_t *outLen) const; + /** + Converts a char buffer to wide char one. + + This is the most convenient and safest conversion function as you + don't have to deal with the buffer lengths directly. Use it if the + input buffer is known not to be empty or if you are sure that the + conversion is going to succeed -- otherwise, use the overload above to + be able to distinguish between empty input and conversion failure. + + @return + The buffer containing the converted text, empty if the input was + empty or if the conversion failed. + + @since 2.9.1 + */ + const wxWCharBuffer cMB2WC(const wxCharBuffer& buf) const; + //@{ /** Converts from multibyte encoding to the current wxChar type (which @@ -204,6 +221,23 @@ public: size_t inLen, size_t *outLen) const; + /** + Converts a wide char buffer to char one. + + This is the most convenient and safest conversion function as you + don't have to deal with the buffer lengths directly. Use it if the + input buffer is known not to be empty or if you are sure that the + conversion is going to succeed -- otherwise, use the overload above to + be able to distinguish between empty input and conversion failure. + + @return + The buffer containing the converted text, empty if the input was + empty or if the conversion failed. + + @since 2.9.1 + */ + const wxCharBuffer cWC2MB(const wxWCharBuffer& buf) const; + //@{ /** Converts from Unicode to the current wxChar type. diff --git a/src/common/strconv.cpp b/src/common/strconv.cpp index bf207f880b..c0d9daf06b 100644 --- a/src/common/strconv.cpp +++ b/src/common/strconv.cpp @@ -490,6 +490,42 @@ wxMBConv::cWC2MB(const wchar_t *inBuff, size_t inLen, size_t *outLen) const return wxCharBuffer(); } +const wxWCharBuffer wxMBConv::cMB2WC(const wxScopedCharBuffer& buf) const +{ + const size_t srcLen = buf.length(); + if ( srcLen ) + { + const size_t dstLen = ToWChar(NULL, 0, buf, srcLen); + if ( dstLen != wxCONV_FAILED ) + { + wxWCharBuffer wbuf(dstLen); + wbuf.data()[dstLen] = L'\0'; + if ( ToWChar(wbuf.data(), dstLen, buf, srcLen) != wxCONV_FAILED ) + return wbuf; + } + } + + return wxWCharBuffer(); +} + +const wxCharBuffer wxMBConv::cWC2MB(const wxScopedWCharBuffer& wbuf) const +{ + const size_t srcLen = wbuf.length(); + if ( srcLen ) + { + const size_t dstLen = FromWChar(NULL, 0, wbuf, srcLen); + if ( dstLen != wxCONV_FAILED ) + { + wxCharBuffer buf(dstLen); + buf.data()[dstLen] = '\0'; + if ( FromWChar(buf.data(), dstLen, wbuf, srcLen) != wxCONV_FAILED ) + return buf; + } + } + + return wxCharBuffer(); +} + // ---------------------------------------------------------------------------- // wxMBConvLibc // ---------------------------------------------------------------------------- -- 2.45.2