summaryrefslogtreecommitdiff
path: root/plugins/SecureIM/mmi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/SecureIM/mmi.cpp')
-rw-r--r--plugins/SecureIM/mmi.cpp155
1 files changed, 155 insertions, 0 deletions
diff --git a/plugins/SecureIM/mmi.cpp b/plugins/SecureIM/mmi.cpp
new file mode 100644
index 0000000000..17195563e1
--- /dev/null
+++ b/plugins/SecureIM/mmi.cpp
@@ -0,0 +1,155 @@
+#include "commonheaders.h"
+
+
+void *operator new(size_t sz) {
+ return mir_alloc(sz);
+}
+
+
+void *operator new[](size_t size) {
+ return operator new(size);
+}
+
+
+void operator delete(void *p) {
+ mir_free(p);
+}
+
+
+void operator delete[](void * p) {
+ operator delete(p);
+}
+
+
+// ANSIzUCS2z + ANSIzUCS2z = ANSIzUCS2z
+char *m_wwstrcat(LPCSTR strA, LPCSTR strB) {
+ int lenA = (int)strlen(strA);
+ int lenB = (int)strlen(strB);
+ LPSTR str = (LPSTR)mir_alloc((lenA+lenB+1)*(sizeof(WCHAR)+1));
+ memcpy(str, strA, lenA);
+ memcpy(str+lenA, strB, lenB+1);
+ memcpy(str+lenA+lenB+1, strA+lenA+1, lenA*sizeof(WCHAR));
+ memcpy(str+lenA+lenB+1+lenA*sizeof(WCHAR), strB+lenB+1, (lenB+1)*sizeof(WCHAR));
+ return str;
+}
+
+
+// ANSIz + ANSIzUCS2z = ANSIzUCS2z
+char *m_awstrcat(LPCSTR strA, LPCSTR strB) {
+ int lenA = (int)strlen(strA);
+ LPSTR tmpA = (LPSTR)mir_alloc((lenA+1)*(sizeof(WCHAR)+1));
+ strcpy(tmpA, strA);
+ MultiByteToWideChar(CP_ACP, 0, strA, -1, (LPWSTR)(tmpA+lenA+1), (lenA+1)*sizeof(WCHAR));
+ LPSTR str = m_wwstrcat(tmpA, strB);
+ mir_free(tmpA);
+ return str;
+}
+
+
+// ANSIz + ANSIz = ANSIzUCS2z
+char *m_aastrcat(LPCSTR strA, LPCSTR strB) {
+ int lenA = (int)strlen(strA);
+ int lenB = (int)strlen(strB);
+ LPSTR str = (LPSTR)mir_alloc((lenA+lenB+1)*(sizeof(WCHAR)+1));
+ strcpy(str,strA);
+ strcat(str,strB);
+ MultiByteToWideChar(CP_ACP, 0, str, -1, (LPWSTR)(str+lenA+lenB+1), (lenA+lenB+1)*sizeof(WCHAR));
+ return str;
+}
+
+
+LPSTR m_string = NULL;
+
+// ANSIz + ANSIz = ANSIz
+char *m_ustrcat(LPCSTR strA, LPCSTR strB) {
+ SAFE_FREE(m_string);
+ m_string = (LPSTR) mir_alloc(strlen(strA)+strlen(strB)+1);
+ strcpy(m_string,strA); strcat(m_string,strB);
+ return m_string;
+}
+
+
+LPSTR m_hex = NULL;
+
+LPSTR to_hex(PBYTE bin, int len) {
+ SAFE_FREE(m_hex);
+ m_hex = (LPSTR) mir_alloc(len*3+1);
+ LPSTR m_ptr = m_hex;
+ for( int i=0; i<len; i++ ) {
+ if( i ) {
+ *m_ptr = ' '; m_ptr++;
+ }
+ mir_snprintf(m_ptr,4,"%02X",bin[i]);
+ m_ptr += 2;
+ }
+ *m_ptr = 0;
+ return m_hex;
+}
+
+
+void __fastcall safe_free(void** p)
+{
+ if (*p) {
+ mir_free(*p);
+ *p = NULL;
+ }
+}
+
+
+void __fastcall safe_delete(void** p)
+{
+ if (*p) {
+ delete(*p);
+ *p = NULL;
+ }
+}
+
+
+// преобразуем текст из чистого UTF8 в формат миранды
+LPSTR utf8_to_miranda(LPCSTR szUtfMsg, DWORD& flags) {
+ LPSTR szNewMsg;
+ if( iCoreVersion < 0x00060000 ) {
+ flags &= ~(PREF_UTF|PREF_UNICODE);
+ LPWSTR wszMsg = exp->utf8decode(szUtfMsg);
+ LPSTR szMsg = mir_u2a(wszMsg);
+ if( bCoreUnicode ) {
+ flags |= PREF_UNICODE;
+ int olen = (int)wcslen((LPWSTR)wszMsg)+1;
+ int nlen = olen*(sizeof(WCHAR)+1);
+ szNewMsg = (LPSTR) mir_alloc(nlen);
+ memcpy(szNewMsg,szMsg,olen);
+ memcpy(szNewMsg+olen,wszMsg,olen*sizeof(WCHAR));
+ mir_free(szMsg);
+ }
+ else {
+ szNewMsg = szMsg;
+ }
+ }
+ else {
+ flags &= ~PREF_UNICODE; flags |= PREF_UTF;
+ szNewMsg = (LPSTR) mir_strdup(szUtfMsg);
+ }
+ return szNewMsg;
+}
+
+
+// преобразуем текст из формата миранды в чистый UTF8
+LPSTR miranda_to_utf8(LPCSTR szMirMsg, DWORD flags) {
+ LPSTR szNewMsg;
+ if(flags & PREF_UTF) {
+ szNewMsg = (LPSTR) szMirMsg;
+ }
+ else
+ if(flags & PREF_UNICODE) {
+ szNewMsg = exp->utf8encode((LPCWSTR)(szMirMsg+strlen(szMirMsg)+1));
+ }
+ else {
+ LPWSTR wszMirMsg = mir_a2u(szMirMsg);
+ szNewMsg = exp->utf8encode((LPCWSTR)wszMirMsg);
+ mir_free(wszMirMsg);
+ }
+ return mir_strdup(szNewMsg);
+}
+
+
+// EOF