From cb4a46e7fbe62d788e66ed6121c717a2d22a4d7c Mon Sep 17 00:00:00 2001 From: watcherhd Date: Thu, 21 Apr 2011 14:14:52 +0000 Subject: svn.miranda.im is moving to a new home! git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@7 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- CyrTranslit/TransliterationProtocol.cpp | 173 ++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 CyrTranslit/TransliterationProtocol.cpp (limited to 'CyrTranslit/TransliterationProtocol.cpp') diff --git a/CyrTranslit/TransliterationProtocol.cpp b/CyrTranslit/TransliterationProtocol.cpp new file mode 100644 index 0000000..f6920c4 --- /dev/null +++ b/CyrTranslit/TransliterationProtocol.cpp @@ -0,0 +1,173 @@ +/** + * CyrTranslit: the Cyrillic transliteration plug-in for Miranda IM. + * Copyright 2005 Ivan Krechetov. + * + * 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; either version 2 + * of the License, or (at your option) any later version. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "plugin.h" +#include "TransliterationProtocol.h" +#include "TransliterationMap.h" + +namespace CyrTranslit +{ + +char *TransliterationProtocol::MODULE_NAME = "ProtoCyrTranslitByIKR"; + +//------------------------------------------------------------------------------ + +void TransliterationProtocol::initialize() +{ + PROTOCOLDESCRIPTOR desc; + desc.cbSize = sizeof(desc); + desc.szName = MODULE_NAME; + desc.type = PROTOTYPE_TRANSLATION; + + CallService( + MS_PROTO_REGISTERMODULE, + 0, + reinterpret_cast(&desc)); + + CreateProtoServiceFunction(MODULE_NAME, PSS_MESSAGE, sendMessageA); + CreateProtoServiceFunction(MODULE_NAME, PSS_MESSAGE"W", sendMessageW); +} + +//------------------------------------------------------------------------------ +void TransliterationProtocol::TranslateMessageUTF(WPARAM wParam, LPARAM lParam) +{ + CCSDATA *ccs = reinterpret_cast(lParam); + + wchar_t* txtWdecoded = mir_utf8decodeW(reinterpret_cast(ccs->lParam)); + std::wstring txtW = txtWdecoded; + mir_free(txtWdecoded); + + txtW = TransliterationMap::getInstance().cyrillicToLatin(txtW); + + char* txtUTFencoded = mir_utf8encodeW(txtW.c_str()); + std::string txtUTF = txtUTFencoded; + mir_free(txtUTFencoded); + + ccs->lParam = reinterpret_cast(mir_alloc(txtUTF.length())); + strcpy(reinterpret_cast(ccs->lParam), txtUTF.c_str()); +} + +void TransliterationProtocol::TranslateMessageW(WPARAM wParam, LPARAM lParam) +{ + CCSDATA *ccs = reinterpret_cast(lParam); + + std::string txtA = reinterpret_cast(ccs->lParam); + int txtAlen = (int)(sizeof(txtA[0]) * (txtA.length() + 1)); + txtA = TransliterationMap::getInstance().cyrillicToLatin(txtA); + + std::wstring txtW = reinterpret_cast(ccs->lParam + txtAlen); + txtW = TransliterationMap::getInstance().cyrillicToLatin(txtW); + + txtAlen = (int)(sizeof(txtA[0]) * (txtA.length() + 1)); + const DWORD newSize = static_cast(txtAlen + (sizeof(txtW[0]) * (txtW.length() + 1))); + + ccs->lParam = reinterpret_cast(mir_alloc(newSize)); + + strcpy(reinterpret_cast(ccs->lParam), txtA.c_str()); + wcscpy(reinterpret_cast(ccs->lParam + txtAlen), txtW.c_str()); +} + +void TransliterationProtocol::TranslateMessageA(WPARAM wParam, LPARAM lParam) +{ + CCSDATA *ccs = reinterpret_cast(lParam); + + std::string txt = reinterpret_cast(ccs->lParam); + txt = TransliterationMap::getInstance().cyrillicToLatin(txt); + + const DWORD newSize = static_cast(txt.length() + 1); + + ccs->lParam = reinterpret_cast(mir_alloc(newSize)); + + strcpy(reinterpret_cast(ccs->lParam), txt.c_str()); +} + +int TransliterationProtocol::sendMessageW(WPARAM wParam, LPARAM lParam) +{ + CCSDATA *ccs = reinterpret_cast(lParam); + LPARAM oldlParam = ccs->lParam; + + TranslateMessageW(wParam, lParam); + + int ret = CallService(MS_PROTO_CHAINSEND /* "W" */, wParam, lParam); + + mir_free(reinterpret_cast(ccs->lParam)); + ccs->lParam = oldlParam; + + return ret; +} +//------------------------------------------------------------------------------ + +int TransliterationProtocol::sendMessageA(WPARAM wParam, LPARAM lParam) +{ + CCSDATA *ccs = reinterpret_cast(lParam); + LPARAM oldlParam = ccs->lParam; + bool msgProcessed = true; + + if(ccs->wParam & PREF_UTF) + { + if(utfi.utf8_decode != 0) + { + TranslateMessageUTF(wParam, lParam); + } + else + { + msgProcessed = false; + } + } + else if(ccs->wParam & PREF_UNICODE) + { + TranslateMessageW(wParam, lParam); + } + else + { + TranslateMessageA(wParam, lParam); + } + + int ret = CallService(MS_PROTO_CHAINSEND, wParam, lParam); + + if(msgProcessed) + { + mir_free(reinterpret_cast(ccs->lParam)); + ccs->lParam = oldlParam; + } + + return ret; +} + +//------------------------------------------------------------------------------ + +void TransliterationProtocol::activateForContact(HANDLE hContact) +{ + CallService( + MS_PROTO_ADDTOCONTACT, + reinterpret_cast(hContact), + reinterpret_cast(MODULE_NAME)); +} + +//------------------------------------------------------------------------------ + +void TransliterationProtocol::deactivateForContact(HANDLE hContact) +{ + CallService( + MS_PROTO_REMOVEFROMCONTACT, + reinterpret_cast(hContact), + reinterpret_cast(MODULE_NAME)); +} + +} -- cgit v1.2.3