From 3a56ba391bf176c11cc5bde6f860759a3ce4477c Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Thu, 5 Jul 2012 13:27:02 +0000 Subject: BasicHistory: folder structure change git-svn-id: http://svn.miranda-ng.org/main/trunk@773 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/BasicHistory/src/codecvt_CodePage.h | 98 +++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 plugins/BasicHistory/src/codecvt_CodePage.h (limited to 'plugins/BasicHistory/src/codecvt_CodePage.h') diff --git a/plugins/BasicHistory/src/codecvt_CodePage.h b/plugins/BasicHistory/src/codecvt_CodePage.h new file mode 100644 index 0000000000..37b6b7d26f --- /dev/null +++ b/plugins/BasicHistory/src/codecvt_CodePage.h @@ -0,0 +1,98 @@ +/* +Basic History plugin +Copyright (C) 2011-2012 Krzysztof Kral + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 +of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#pragma once + +template +class codecvt_CodePage : public std::codecvt<_Elem, char, mbstate_t> +{ +private: + UINT codePage; +public: + typedef std::codecvt<_Elem, char, mbstate_t> _Mybase; + typedef typename _Mybase::result result; + typedef char _Byte; + typedef _Elem intern_type; + typedef _Byte extern_type; + typedef mbstate_t state_type; + + explicit codecvt_CodePage(UINT _codePage) + : _Mybase(0), + codePage(_codePage) + { // construct with ref count + } + + virtual ~codecvt_CodePage() + { // destroy the object + } + +protected: + virtual result do_in(mbstate_t& _State, const _Byte *_First1, const _Byte *_Last1, const _Byte *& _Mid1, _Elem *_First2, _Elem *_Last2, _Elem *& _Mid2) const + { // convert bytes [_First1, _Last1) to [_First2, _Last) + return (_Mybase::error); // not implemented + } + + virtual result do_out(mbstate_t& _State, const _Elem *_First1, const _Elem *_Last1, const _Elem *& _Mid1, _Byte *_First2, _Byte *_Last2, _Byte *& _Mid2) const + { // convert [_First1, _Last1) to bytes [_First2, _Last) + _Mid1 = _First1; + _Mid2 = _First2; + + int conv = WideCharToMultiByte(codePage, 0, _First1, _Last1 - _First1, _First2, _Last2 - _First2, NULL, NULL); + if(conv == 0) + { + if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) + return (_Mybase::partial); + else + return (_Mybase::error); + } + else + { + _Mid1 = _Last1; + _Mid2 = _First2 + conv; + } + + return (_Mybase::ok); + } + + virtual result do_unshift(mbstate_t&, + _Byte *_First2, _Byte *, _Byte *& _Mid2) const + { // generate bytes to return to default shift state + _Mid2 = _First2; + return (_Mybase::ok); + } + + virtual int do_length(const mbstate_t& _State, const _Byte *_First1, const _Byte *_Last1, size_t _Count) const _THROW0() + { // return min(_Count, converted length of bytes [_First1, _Last1)) + return (int)_Count; // not implemented + } + + virtual bool do_always_noconv() const _THROW0() + { // return true if conversions never change input + return (false); + } + + virtual int do_max_length() const _THROW0() + { // return maximum length required for a conversion + return 6; + } + + virtual int do_encoding() const _THROW0() + { // return length of code sequence (from codecvt) + return 0; // -1 => state dependent, 0 => varying length + } +}; -- cgit v1.2.3