From 6532896923fdf6e3d3b341ce21153b913fcda3dc Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Thu, 30 Nov 2017 07:57:29 +0300 Subject: [PATCH] Tlen moved to deprecated (#1050) --- bin15/mir_full.sln | 10 - bin15/mir_icons.sln | 12 +- protocols/Tlen/CMakeLists.txt | 4 - protocols/Tlen/docs/InstallScript.xml | 26 - protocols/Tlen/docs/changelog.txt | 274 --- protocols/Tlen/docs/gpl.txt | 340 --- protocols/Tlen/docs/gpl_comment.txt | 20 - protocols/Tlen/docs/readme.txt | 53 - protocols/Tlen/proto_tlen/CMakeLists.txt | 2 - protocols/Tlen/proto_tlen/Proto_Tlen.vcxproj | 28 - .../proto_tlen/Proto_Tlen.vcxproj.filters | 4 - protocols/Tlen/proto_tlen/res/Away.ico | Bin 5430 -> 0 bytes protocols/Tlen/proto_tlen/res/DND.ico | Bin 5430 -> 0 bytes protocols/Tlen/proto_tlen/res/FFC.ico | Bin 5430 -> 0 bytes protocols/Tlen/proto_tlen/res/Invisible.ico | Bin 5430 -> 0 bytes protocols/Tlen/proto_tlen/res/NA.ico | Bin 5430 -> 0 bytes protocols/Tlen/proto_tlen/res/Offline.ico | Bin 5430 -> 0 bytes protocols/Tlen/proto_tlen/res/Online.ico | Bin 5430 -> 0 bytes protocols/Tlen/proto_tlen/res/Proto_Tlen.rc | 75 - protocols/Tlen/proto_tlen/src/resource.h | 22 - protocols/Tlen/res/groupchats.ico | Bin 1150 -> 0 bytes protocols/Tlen/res/image.ico | Bin 1150 -> 0 bytes protocols/Tlen/res/mail.ico | Bin 1150 -> 0 bytes protocols/Tlen/res/microphone.ico | Bin 1150 -> 0 bytes protocols/Tlen/res/speaker.ico | Bin 1150 -> 0 bytes protocols/Tlen/res/tlen.ico | Bin 1150 -> 0 bytes protocols/Tlen/res/tlen.rc | 386 --- protocols/Tlen/res/tlenchats.ico | Bin 1150 -> 0 bytes protocols/Tlen/res/version.rc | 55 - protocols/Tlen/res/voicechat.ico | Bin 1150 -> 0 bytes protocols/Tlen/src/codec/gsm.h | 65 - protocols/Tlen/src/codec/gsm_codec.c | 283 --- protocols/Tlen/src/codec/gsm_long.c | 183 -- protocols/Tlen/src/codec/gsm_lpc.c | 208 -- protocols/Tlen/src/codec/gsm_preprocess.c | 103 - protocols/Tlen/src/codec/gsm_rpe.c | 248 -- protocols/Tlen/src/codec/gsm_short.c | 211 -- protocols/Tlen/src/commons.h | 6 - protocols/Tlen/src/crypto/aes.c | 1336 ----------- protocols/Tlen/src/crypto/bignum.c | 2097 ----------------- protocols/Tlen/src/crypto/padlock.c | 162 -- protocols/Tlen/src/crypto/polarssl/aes.h | 167 -- protocols/Tlen/src/crypto/polarssl/bignum.h | 587 ----- protocols/Tlen/src/crypto/polarssl/bn_mul.h | 738 ------ protocols/Tlen/src/crypto/polarssl/config.h | 625 ----- protocols/Tlen/src/crypto/polarssl/padlock.h | 100 - protocols/Tlen/src/resource.h | 145 -- protocols/Tlen/src/stdafx.cxx | 18 - protocols/Tlen/src/stdafx.h | 493 ---- protocols/Tlen/src/tlen.cpp | 370 --- protocols/Tlen/src/tlen_advsearch.cpp | 113 - protocols/Tlen/src/tlen_avatar.cpp | 434 ---- protocols/Tlen/src/tlen_avatar.h | 34 - protocols/Tlen/src/tlen_file.cpp | 682 ------ protocols/Tlen/src/tlen_file.h | 34 - protocols/Tlen/src/tlen_iq.cpp | 108 - protocols/Tlen/src/tlen_iq.h | 54 - protocols/Tlen/src/tlen_iqid.cpp | 625 ----- protocols/Tlen/src/tlen_list.cpp | 292 --- protocols/Tlen/src/tlen_list.h | 90 - protocols/Tlen/src/tlen_misc.cpp | 110 - protocols/Tlen/src/tlen_muc.cpp | 237 -- protocols/Tlen/src/tlen_muc.h | 35 - protocols/Tlen/src/tlen_opt.cpp | 697 ------ protocols/Tlen/src/tlen_p2p_new.cpp | 343 --- protocols/Tlen/src/tlen_p2p_old.cpp | 522 ---- protocols/Tlen/src/tlen_p2p_old.h | 70 - protocols/Tlen/src/tlen_picture.cpp | 312 --- protocols/Tlen/src/tlen_picture.h | 33 - protocols/Tlen/src/tlen_presence.cpp | 341 --- protocols/Tlen/src/tlen_presence.h | 29 - protocols/Tlen/src/tlen_svc.cpp | 1208 ---------- protocols/Tlen/src/tlen_thread.cpp | 1321 ----------- protocols/Tlen/src/tlen_userinfo.cpp | 328 --- protocols/Tlen/src/tlen_util.cpp | 444 ---- protocols/Tlen/src/tlen_voice.cpp | 1109 --------- protocols/Tlen/src/tlen_voice.h | 68 - protocols/Tlen/src/tlen_ws.cpp | 157 -- protocols/Tlen/src/tlen_xml.cpp | 572 ----- protocols/Tlen/src/tlen_xml.h | 79 - protocols/Tlen/src/version.h | 17 - protocols/Tlen/tlen.vcxproj | 40 - protocols/Tlen/tlen.vcxproj.filters | 4 - 83 files changed, 1 insertion(+), 19997 deletions(-) delete mode 100644 protocols/Tlen/CMakeLists.txt delete mode 100644 protocols/Tlen/docs/InstallScript.xml delete mode 100644 protocols/Tlen/docs/changelog.txt delete mode 100644 protocols/Tlen/docs/gpl.txt delete mode 100644 protocols/Tlen/docs/gpl_comment.txt delete mode 100644 protocols/Tlen/docs/readme.txt delete mode 100644 protocols/Tlen/proto_tlen/CMakeLists.txt delete mode 100644 protocols/Tlen/proto_tlen/Proto_Tlen.vcxproj delete mode 100644 protocols/Tlen/proto_tlen/Proto_Tlen.vcxproj.filters delete mode 100644 protocols/Tlen/proto_tlen/res/Away.ico delete mode 100644 protocols/Tlen/proto_tlen/res/DND.ico delete mode 100644 protocols/Tlen/proto_tlen/res/FFC.ico delete mode 100644 protocols/Tlen/proto_tlen/res/Invisible.ico delete mode 100644 protocols/Tlen/proto_tlen/res/NA.ico delete mode 100644 protocols/Tlen/proto_tlen/res/Offline.ico delete mode 100644 protocols/Tlen/proto_tlen/res/Online.ico delete mode 100644 protocols/Tlen/proto_tlen/res/Proto_Tlen.rc delete mode 100644 protocols/Tlen/proto_tlen/src/resource.h delete mode 100644 protocols/Tlen/res/groupchats.ico delete mode 100644 protocols/Tlen/res/image.ico delete mode 100644 protocols/Tlen/res/mail.ico delete mode 100644 protocols/Tlen/res/microphone.ico delete mode 100644 protocols/Tlen/res/speaker.ico delete mode 100644 protocols/Tlen/res/tlen.ico delete mode 100644 protocols/Tlen/res/tlen.rc delete mode 100644 protocols/Tlen/res/tlenchats.ico delete mode 100644 protocols/Tlen/res/version.rc delete mode 100644 protocols/Tlen/res/voicechat.ico delete mode 100644 protocols/Tlen/src/codec/gsm.h delete mode 100644 protocols/Tlen/src/codec/gsm_codec.c delete mode 100644 protocols/Tlen/src/codec/gsm_long.c delete mode 100644 protocols/Tlen/src/codec/gsm_lpc.c delete mode 100644 protocols/Tlen/src/codec/gsm_preprocess.c delete mode 100644 protocols/Tlen/src/codec/gsm_rpe.c delete mode 100644 protocols/Tlen/src/codec/gsm_short.c delete mode 100644 protocols/Tlen/src/commons.h delete mode 100644 protocols/Tlen/src/crypto/aes.c delete mode 100644 protocols/Tlen/src/crypto/bignum.c delete mode 100644 protocols/Tlen/src/crypto/padlock.c delete mode 100644 protocols/Tlen/src/crypto/polarssl/aes.h delete mode 100644 protocols/Tlen/src/crypto/polarssl/bignum.h delete mode 100644 protocols/Tlen/src/crypto/polarssl/bn_mul.h delete mode 100644 protocols/Tlen/src/crypto/polarssl/config.h delete mode 100644 protocols/Tlen/src/crypto/polarssl/padlock.h delete mode 100644 protocols/Tlen/src/resource.h delete mode 100644 protocols/Tlen/src/stdafx.cxx delete mode 100644 protocols/Tlen/src/stdafx.h delete mode 100644 protocols/Tlen/src/tlen.cpp delete mode 100644 protocols/Tlen/src/tlen_advsearch.cpp delete mode 100644 protocols/Tlen/src/tlen_avatar.cpp delete mode 100644 protocols/Tlen/src/tlen_avatar.h delete mode 100644 protocols/Tlen/src/tlen_file.cpp delete mode 100644 protocols/Tlen/src/tlen_file.h delete mode 100644 protocols/Tlen/src/tlen_iq.cpp delete mode 100644 protocols/Tlen/src/tlen_iq.h delete mode 100644 protocols/Tlen/src/tlen_iqid.cpp delete mode 100644 protocols/Tlen/src/tlen_list.cpp delete mode 100644 protocols/Tlen/src/tlen_list.h delete mode 100644 protocols/Tlen/src/tlen_misc.cpp delete mode 100644 protocols/Tlen/src/tlen_muc.cpp delete mode 100644 protocols/Tlen/src/tlen_muc.h delete mode 100644 protocols/Tlen/src/tlen_opt.cpp delete mode 100644 protocols/Tlen/src/tlen_p2p_new.cpp delete mode 100644 protocols/Tlen/src/tlen_p2p_old.cpp delete mode 100644 protocols/Tlen/src/tlen_p2p_old.h delete mode 100644 protocols/Tlen/src/tlen_picture.cpp delete mode 100644 protocols/Tlen/src/tlen_picture.h delete mode 100644 protocols/Tlen/src/tlen_presence.cpp delete mode 100644 protocols/Tlen/src/tlen_presence.h delete mode 100644 protocols/Tlen/src/tlen_svc.cpp delete mode 100644 protocols/Tlen/src/tlen_thread.cpp delete mode 100644 protocols/Tlen/src/tlen_userinfo.cpp delete mode 100644 protocols/Tlen/src/tlen_util.cpp delete mode 100644 protocols/Tlen/src/tlen_voice.cpp delete mode 100644 protocols/Tlen/src/tlen_voice.h delete mode 100644 protocols/Tlen/src/tlen_ws.cpp delete mode 100644 protocols/Tlen/src/tlen_xml.cpp delete mode 100644 protocols/Tlen/src/tlen_xml.h delete mode 100644 protocols/Tlen/src/version.h delete mode 100644 protocols/Tlen/tlen.vcxproj delete mode 100644 protocols/Tlen/tlen.vcxproj.filters diff --git a/bin15/mir_full.sln b/bin15/mir_full.sln index 82f00f6bd70..0a2fc7dc24d 100644 --- a/bin15/mir_full.sln +++ b/bin15/mir_full.sln @@ -282,8 +282,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PackUpdater", "..\plugins\P EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "QuickContacts", "..\plugins\QuickContacts\quickcontacts.vcxproj", "{7FC00D59-03D3-4A6C-AEFE-67349C9C9E10}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Tlen", "..\protocols\Tlen\tlen.vcxproj", "{F3208C96-3C21-46AA-8695-C794E28CDC34}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MobileState", "..\plugins\MobileState\mobilestate.vcxproj", "{AE677E3A-DAC5-42FD-8762-47370C57639B}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NoHistory", "..\plugins\NoHistory\NoHistory.vcxproj", "{ABF05E2C-C335-4BD1-8C3E-4C63285362CF}" @@ -1382,14 +1380,6 @@ Global {7FC00D59-03D3-4A6C-AEFE-67349C9C9E10}.Release|Win32.Build.0 = Release|Win32 {7FC00D59-03D3-4A6C-AEFE-67349C9C9E10}.Release|x64.ActiveCfg = Release|x64 {7FC00D59-03D3-4A6C-AEFE-67349C9C9E10}.Release|x64.Build.0 = Release|x64 - {F3208C96-3C21-46AA-8695-C794E28CDC34}.Debug|Win32.ActiveCfg = Debug|Win32 - {F3208C96-3C21-46AA-8695-C794E28CDC34}.Debug|Win32.Build.0 = Debug|Win32 - {F3208C96-3C21-46AA-8695-C794E28CDC34}.Debug|x64.ActiveCfg = Debug|x64 - {F3208C96-3C21-46AA-8695-C794E28CDC34}.Debug|x64.Build.0 = Debug|x64 - {F3208C96-3C21-46AA-8695-C794E28CDC34}.Release|Win32.ActiveCfg = Release|Win32 - {F3208C96-3C21-46AA-8695-C794E28CDC34}.Release|Win32.Build.0 = Release|Win32 - {F3208C96-3C21-46AA-8695-C794E28CDC34}.Release|x64.ActiveCfg = Release|x64 - {F3208C96-3C21-46AA-8695-C794E28CDC34}.Release|x64.Build.0 = Release|x64 {AE677E3A-DAC5-42FD-8762-47370C57639B}.Debug|Win32.ActiveCfg = Debug|Win32 {AE677E3A-DAC5-42FD-8762-47370C57639B}.Debug|Win32.Build.0 = Debug|Win32 {AE677E3A-DAC5-42FD-8762-47370C57639B}.Debug|x64.ActiveCfg = Debug|x64 diff --git a/bin15/mir_icons.sln b/bin15/mir_icons.sln index d876e14b8ac..08102f9b2bf 100644 --- a/bin15/mir_icons.sln +++ b/bin15/mir_icons.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26730.10 +VisualStudioVersion = 15.0.27004.2010 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Toolbar_icons", "..\plugins\Clist_modern\icons_pack\Toolbar_icons.vcxproj", "{796B43EF-DACE-4145-8571-31886F45A2C0}" EndProject @@ -46,8 +46,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TabSRMM_icons", "..\plugins EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TabSRMM_icons_XP", "..\plugins\TabSRMM\TabSRMM_icons\XP\iconsxp_15.vcxproj", "{987C5A57-A46B-4779-BB85-077E21F7BF7F}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Proto_Tlen", "..\protocols\Tlen\proto_tlen\Proto_Tlen.vcxproj", "{1AA0A504-0644-4F00-A1AD-F55D69E50DD1}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Proto_mRadio", "..\plugins\mRadio\proto_mradio\Proto_mRadio.vcxproj", "{2BCC460C-E7C0-4AA8-B680-B9DE561A8408}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Proto_NewsAggregator", "..\plugins\NewsAggregator\proto_newsaggregator\Proto_NewsAggregator.vcxproj", "{B97882DC-7462-41DB-A390-BDFCE5295265}" @@ -266,14 +264,6 @@ Global {987C5A57-A46B-4779-BB85-077E21F7BF7F}.Release|Win32.Build.0 = Release|Win32 {987C5A57-A46B-4779-BB85-077E21F7BF7F}.Release|x64.ActiveCfg = Release|x64 {987C5A57-A46B-4779-BB85-077E21F7BF7F}.Release|x64.Build.0 = Release|x64 - {1AA0A504-0644-4F00-A1AD-F55D69E50DD1}.Debug|Win32.ActiveCfg = Debug|Win32 - {1AA0A504-0644-4F00-A1AD-F55D69E50DD1}.Debug|Win32.Build.0 = Debug|Win32 - {1AA0A504-0644-4F00-A1AD-F55D69E50DD1}.Debug|x64.ActiveCfg = Debug|x64 - {1AA0A504-0644-4F00-A1AD-F55D69E50DD1}.Debug|x64.Build.0 = Debug|x64 - {1AA0A504-0644-4F00-A1AD-F55D69E50DD1}.Release|Win32.ActiveCfg = Release|Win32 - {1AA0A504-0644-4F00-A1AD-F55D69E50DD1}.Release|Win32.Build.0 = Release|Win32 - {1AA0A504-0644-4F00-A1AD-F55D69E50DD1}.Release|x64.ActiveCfg = Release|x64 - {1AA0A504-0644-4F00-A1AD-F55D69E50DD1}.Release|x64.Build.0 = Release|x64 {2BCC460C-E7C0-4AA8-B680-B9DE561A8408}.Debug|Win32.ActiveCfg = Debug|Win32 {2BCC460C-E7C0-4AA8-B680-B9DE561A8408}.Debug|Win32.Build.0 = Debug|Win32 {2BCC460C-E7C0-4AA8-B680-B9DE561A8408}.Debug|x64.ActiveCfg = Debug|x64 diff --git a/protocols/Tlen/CMakeLists.txt b/protocols/Tlen/CMakeLists.txt deleted file mode 100644 index 6fe51db6d5c..00000000000 --- a/protocols/Tlen/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -file(GLOB SOURCES "src/*.h" "src/crypto/polarssl/*.h" "src/codec/*.h" "src/*.cpp" "src/crypto/*.c" "src/codec/*.c" "res/*.rc") -set(TARGET Tlen) -include(${CMAKE_SOURCE_DIR}/cmake/plugin.cmake) -add_subdirectory(proto_tlen) \ No newline at end of file diff --git a/protocols/Tlen/docs/InstallScript.xml b/protocols/Tlen/docs/InstallScript.xml deleted file mode 100644 index 7cfcdec5ae5..00000000000 --- a/protocols/Tlen/docs/InstallScript.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - Tlen Protocol - Santithorn Bunchua - 0.1.0.2 - Plugin - - - - Main Files - tlen.dll - - - - - Documentation - readme_tlen.txt - - - - - readme_tlen.txt - - - diff --git a/protocols/Tlen/docs/changelog.txt b/protocols/Tlen/docs/changelog.txt deleted file mode 100644 index e83e75caa2f..00000000000 --- a/protocols/Tlen/docs/changelog.txt +++ /dev/null @@ -1,274 +0,0 @@ -Version 2.1.0.0 -------- -* adopted to Miranda NG as line 2.1.x.x -* plugin tlen_czaty.dll removed beacouse its service was turned off - -Version 2.0.5.0 -------- -* Project cleanup - + change mucc.dll to tlen_czaty.dll - + compile tlen_czaty in Unicode and x64 -* fix warnings, project files changes -Version 2.0.4.1 -------- -- fix accounts... dialog -Version 2.0.4.0 -------- -+ x64 version -* set timeout to NETLIBOPENCONNECTION (patch by piotrw) -* fix for display texts at comboboxes in unicode (patch by piotrw) -* fixes in Find/Add Contacts search (by piotrw, dezeath and wsx22) -* fix warnings, project files changes (add VS2010) -Version 2.0.3.2 -------- -* update PolarSSL library to polarssl-1.0.0 -* change compile options to not require microsoft visual studio runtime libs on user system, (100KB larger file but no problems with msvcr90.dll not found on user system) -Version 2.0.2.0 -------- -* "Leave status message after disconnection", "Send and receive client version information" and "Log alerts as messages" options enabled by default (AL|EN suggestion) -Version 2.0.1.0 -------- -merge changes from wsx22 mod -* fix in typing notify message handling -* fix in logging to server message -Version 2.0.0.0 -------- -+ Image transfer -* other bug fixes and improvements -Version 1.8.0.2 -------- -improved icons handling -minor fixes on account unloading -1.8.0.1 -------- -* bugfix: removed ME_SYSTEM_MODULESLOADED hook -1.8.0.0 -------- -+ support for account manager (requires MIM 0.8) -* many bugfixes and small improvements -1.1.0.0 -------- -* avatar support improvements -1.0.9.2 -------- -* avatar management UI changes -* user info page changes -* some clean-up and bugfixes -* fix for advertisement blocking -* fix for file transfers -1.0.9.1 -------- -* avatar management improvements -1.0.9.0 -------- -+ message encryption -* improved search (up to 200 results displayed) -* some avatar-related fixes -* MIM 0.7 compatibility -1.0.7.7 -------- -* new icons by Angelika -1.0.7.6 -------- -+ support for Tlen avatars -1.0.7.5 -------- -* bugfix: settings changes were not loaded properly -1.0.7.4 -------- -* p2p connections refactoring -* UPnP support -* managed services/hooks -* support for IcoLib -* new icons -* support for Miranda Memory Manager -1.0.7.3 --------- -* bugfix: offline status message -1.0.7.2 --------- -! fixed compatibility issues with new versions of IEView (1.0.9.0 or higher) -+ support for Nudge plugin -* improved avatar support -* improved sending/receiving client version info -1.0.7.1 ---------- -* bugfix: sending/receiving client version info -1.0.7.0 ---------- -+ full support for avatars (compatible with tAvatar 0.0.2.1 or higher) -+ sending and receiving full client version info -* optimized DB usage -* code cleanup -1.0.6.9 ---------- -+ experimental client recognition -+ voice chat notification sound -* bugfix: offline message timestamp -* code clean-up -1.0.6.8 ---------- -* bugfix: compatibility with Unicode contact lists -* bugfix: user login is always converted to lower case -* bugfix: typing notifications -* other bugfixes -1.0.6.7 ---------- -+ possibility to send files to offline users -+ public status visibility settings -* bugfixes -1.0.6.6 ---------- -* fixed IEView support (text scrolling issue) -* code cleanup -1.0.6.5 ---------- -+ option to ignore advertisements -* bugfixes -1.0.6.4 ---------- -+ alert, voice chat and group chat policies -+ received alerts are logged as messages -* offline message timestamp improvements (thanks to Atay for the idea) -* removed obsolete, Jabber-specific code -* a lot of more or less important bugfixes -1.0.6.3 ---------- -+ group names encoding -+ log saving in IEView mode -* simplified option page -1.0.6.2 ---------- -+ support for IEView group chats (IEView 1.0.3.0 or later) -+ improvements of group chats in RichEdit mode (context menu, better scrolling) -1.0.6.1 ---------- -* bugfix: proper filename encoding -* options page rearranged -* code cleanup, other fixes and improvements -1.0.6.0 ---------- -+ group chat window flashing -+ message icons in tabbed mode -+ web messages grouped as a single contact -* offline message timestamp handling fixed (again) -1.0.5.10 RC2 ---------- -+ tabbed mode available in group chat window -+ saving chat log to file -+ smiley selection button in group chat window -+ new shortcuts: ctrl+w (close), ctrl+a (select all) -+ saving chat fonts setting -+ new menu items: request and grant authorization -* several bugfixes in MUCC plugin, better MUCC architecture -1.0.5.9 RC ---------- -+ voice chat improvements (better sound quality and smarter delay reduction, bugfixes) -+ separate group for Global Owners in chat user list -* bugfix: web messages receiving (fix by MoMaT) -1.0.5.8 ---------- -+ playback and recording device selection -+ sending and receiving alerts (use to send) -+ enabling/disabling Always Visible support -* bugfixes -1.0.5.7 ---------- -+ chat room administration window (user administration and browser) -+ unban option -+ dynamic user groups -+ voice chat p2p connection negotiation -+ voice chat status display -+ incoming voice chat invitation dialog -+ removing contacts from roster on authorization denial -+ offline status message selection -* a lot of fixes in group chats interface -1.0.5.6 ---------- -+ voice chats ! (experimental) -+ chat room administration: destroying room, changing users' roles, kick & ban -+ MUCC option: send on Enter -+ status messages of offline contacts (use mToolTip to read them) -* bugfix: contact name encoding when adding new contact -* bugfix: offline messages time ('more inteligent' Daylight Saving Time handling) -* bugfix: closing all file transfers at shutdown -* other minor fixes -1.0.5.5 ---------- -+ improved file transfer (p2p connection negotiation, error notification) -+ MUCC options page (fonts, colors, default filters) -+ chat room events logging (user has joined etc.) -+ registering and uregistering nick names -+ creating chat rooms -+ chat room topic displaying and setting -+ improved errors handling -* look & feel improvements -* bugfix: correct chat room name returned by search -* bugfix: removing users from contact list groups -* source code refactoring -1.0.5.4 ---------- -+ group chats error handling -+ message log formatting options -+ chat room searching -+ list of contacts in 'invite to group chat' dialog -+ Multi-User Conference item in contact menu -+ some look & feel improvements (better resizing, new icons) -+ internal history of messages -* a lot of bugfixes and code improvements -* code clean-up -1.0.5.3 ---------- -+ full text formatting (font name, font size) -+ private messaging sessions -+ displaying user details (administrator/moderator/registered nickname) -+ displaying chat room details icons (moderated/members only/anonymous nicknames not allowed) -+ browsing own chat rooms/registered nicknames -* code clean-up -* bugfixes -1.0.5.2 ---------- -+ text formatting (bold, italic, underline, text color for now) -+ chat rooms browsing page by page -* bugfixes and code clean-up -1.0.5.1 ---------- -+ initial multi-user conferences and chats support -+ MUCC plugin responsible for chats GUI (manager window (groups/rooms), messanging window, helper dialogs) - -2004-09-23 Version 1.0.4.0 - Jabber and Tlen now have separate source trees (Tlen plugin is compliant with GCC now) - File transfer with forwarding and SOCKS4/5 proxy support - vCard viewing and editing - Web messages receiving - Incoming email notification through the popup plugin and sounds - User typing notification (patch by Adam Libura) - Searching users by login - New user details page - Invisible status message - Option to leave offline status message - Option to show offline users with status message as invisible - Link to create new account - Fixed bug: adjust offline message time - A lot of other fixes and improvements - -2003-08-19 Version 0.1.0.2 - Fixed bug: crash when receiving some invisible presence - Fixed bug: incorrect newline encoding/decoding (tlen uses \r\n while jabber uses \n) - Fixed bug: User detail text is not decoded - Use new invisible presence (now conform to Jabber invisible presence) - Advanced search - Based on Jabber plugin 0.1.1.2 - -2003-05-12 Version 0.1.0.1 - Fixed bug: slightly incorrect online presence - Based on Jabber plugin 0.1.1.0 - -2003-01-19 Version 0.1.0.0 - Based on Jabber plugin 0.1.0.7 - Tlen basic user info - Tlen invisible status - Tlen visible/invisible list - Option to show invisible users as invisible - Find/add users using tlen user database - Rebase DLL to 0x32600000 diff --git a/protocols/Tlen/docs/gpl.txt b/protocols/Tlen/docs/gpl.txt deleted file mode 100644 index 45645b4b53c..00000000000 --- a/protocols/Tlen/docs/gpl.txt +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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 - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/protocols/Tlen/docs/gpl_comment.txt b/protocols/Tlen/docs/gpl_comment.txt deleted file mode 100644 index 3e51542c78e..00000000000 --- a/protocols/Tlen/docs/gpl_comment.txt +++ /dev/null @@ -1,20 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2012 Santithorn Bunchua, Piotr Piastucki - -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. - -*/ diff --git a/protocols/Tlen/docs/readme.txt b/protocols/Tlen/docs/readme.txt deleted file mode 100644 index 9e1f45f6bc5..00000000000 --- a/protocols/Tlen/docs/readme.txt +++ /dev/null @@ -1,53 +0,0 @@ -Tlen Protocol Plugin for Miranda NG -=================================== - -Introduction: - Tlen is a protocol used by a propritary instant messaging network - at tlen.pl. It is based on Jabber, and, therefore, this plugin - is very much based on Jabber protocol plugin for Miranda. All - necessary helps to create this Tlen plugin are from Adam Strzelecki. - -Installation: - Copy tlen.dll to Miranda's plugins directory, - and create new account in Miranda Accounts... dialog. - -More information: - Web: http://mtlen.berlios.de - E-mail: the_leech@users.berlios.de - -Copyright (c) 2002-2012 Santithorn Bunchua (keh@au.edu), Piotr Piastucki - -Acknowledgement: - We would like to thank the following people for their helps and/or comments - (alphabetically listed): - Dmitry Balabanov - Nikola Dachev - Sam Kothari - Adam Libura - Jörgen Persson - Robert Rainwater - Adam Strzelecki - Michal Wojciechowski - Szymon Tokarz (wsx22) - -================================================================ - -Tlen Protocol Plugin for Miranda NG -Copyright (C) - 2002-2012 Santithorn Bunchua, Piotr Piastucki (Miranga IM) - 2012 Szymon Tokarz (Miranda IM / NG) -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. - -================================================================ diff --git a/protocols/Tlen/proto_tlen/CMakeLists.txt b/protocols/Tlen/proto_tlen/CMakeLists.txt deleted file mode 100644 index 4dec7da57c7..00000000000 --- a/protocols/Tlen/proto_tlen/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -set(TARGET Proto_Tlen) -include(${CMAKE_SOURCE_DIR}/cmake/icons.cmake) \ No newline at end of file diff --git a/protocols/Tlen/proto_tlen/Proto_Tlen.vcxproj b/protocols/Tlen/proto_tlen/Proto_Tlen.vcxproj deleted file mode 100644 index 87b9871f737..00000000000 --- a/protocols/Tlen/proto_tlen/Proto_Tlen.vcxproj +++ /dev/null @@ -1,28 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - Proto_Tlen - {1AA0A504-0644-4F00-A1AD-F55D69E50DD1} - - - - - \ No newline at end of file diff --git a/protocols/Tlen/proto_tlen/Proto_Tlen.vcxproj.filters b/protocols/Tlen/proto_tlen/Proto_Tlen.vcxproj.filters deleted file mode 100644 index e39f86d5d6b..00000000000 --- a/protocols/Tlen/proto_tlen/Proto_Tlen.vcxproj.filters +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/protocols/Tlen/proto_tlen/res/Away.ico b/protocols/Tlen/proto_tlen/res/Away.ico deleted file mode 100644 index dc65d378ae83eabb327dc818c229803bb9e55920..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5430 zcmdT`U2IfU5I$R5vcx83O=waRk{XG@2Obm~FtM9TLh6G76@Q>LB7sm#f3(IzO$b&V zj3HVRYpHF)5E5uBMSZ|FKrOaFvi!ufqzy>6)~+S6b#Y6}(m#@M=5*)e?C!a@yQ_`y zCX+d5&V2LDnLFp6D}+O&h$Tw|>TK~&st`{IA+odQ<}GNiLE8$n;SfFM?5K-&Z)B5D(eYtNd-TA{Y@}G;bwFks$KTRFWj`m0#P3XCQZ$inO z1>}04r$S-;kg|oV$Fn?Ibqy*HS?qYKYHjplZ}#xLf<2+hxu4nY|L?@ zq@%3aQ}Arj&h@K`XdJdV#q}w$6ONOp&dkhw2svDpudlAEDRPIX&+ALqLPObF+54Yu zcf;x@9|h;4)VONtz`obTE+3c6CAs%+b6=|~c^;Z;_d?g1Q_$VrErrJ4fAa;QqHZHz23N_^LP^+D9?xB zok0Bj`|irVWnR|EzlM6P@0ZIkJUkqikS}4bU%i|dzaaJYJ49?M@J<` z^qBn!^Yh7;#QCFgAbvV$BO@c=^ZC?06AT88WAY(i!klk!jo{~AGiu^x(RzXFKXhXN zh?Dls;`jT3gy*EmhkQ--H}dkgm$_Mob3p#|vQ4@0Q_EK{HZ~^rGd(>Gv-n@6%goG- zTqB>(=31yNTc`Suc}?e$*VNu)`JFk9hh#l({(b`{CMNKoXEKI+YHCWZ-ST;*Z+lCl zI)BWO3_qPq=SMeTOTjB}_=6X~|Hp5t22=+YicM?eQ@?9d!rz~m{Zk!~TT1m`Du;UP z>vP{Vs63c=;KGkUYoC;El-%Rv;}N}Q+B?~}Hn#kfOE`y|(grAd?K#0nI`!i}A+7p0WL0@!<-12=ydQXYw>(8- z&NWauEFizmWi{qnB~xcB49B$M)a~rM5L)N48ZQJd$F$8S^8iq6rL5ou3HPAh=%SvSOhvK7O6&aL?O&FYo)xrCjT5&wb8$&htFK z-+9jSzVDSJgET_&@sXG|N{b(pq;ZlY8I1$$QfA-EY!jG`O_|4lohj7;z%a(|9sdyH zdx?R58xi(Ixhz4CZ-Mv7v2YvV2^K61#Ry@s?o1L{TyNylWr#H%mL+O*8N#2cz?rH> z^z`(y5bzu#mNbi<5IAYi#rScDXd6F#+luLdN4Tan+25FY98C=tTB^k-5$BZfqc~aF z#(mD6v~o>rveUlz$N-tY^lm+*DjWF_{xaI1JLLoy5ldRwXn$|s37(VJA^kL@V;sZa zwd)ekpFZ;>l(FPYYqC>()zM3T$It&B(u$uU)dTJo7K{xoK-$cse7~-`9ZTj^gES4Y zr_L^QI6vpG(`0wy)NF~>^Qi^zN$Gt8JlZQh*;~+6EtS8~_<^!*h&+=N)dFjrS zxFUf=Ji7;p>dE>`Z}1qqk20Rc7^EGno)3vv=H~HxYskd=Smah}rN8rBE#BEjZ%y%R z$j^{{trz03rxwpSvAjdo0-yQ+qe1T(BalQpF!`Jk}&dlhEIo*+gyAT&@#=;%pzTkjOTo%r)LF~jMFiqT#IWtRf*V2LR?(T;QyLa&n%6+Zm;_mM5 z5fPl785Nv|#PAd7>+2(~_&DP-VuLHWWG%bMz7suYYP2Fg)ZymMn=%IuZ2wue@&@-IUy7-#X>tu;g#*K1loV5jw3LfT zOTL7Z$+cLSegUnmtqvU4EN?(^Yz_BGPx*=Q_zETa>s`lp;z0O`kzZo>rWRzRUq|xf zAF)2;D!+#Z4<5)IHfG*NYJ445Ex68oUx_G2Nl~2xzUVboO}Ii7y&&peu>BWgufBz% zoI9{utvqjYb2I1B+dJ@$EGxW=PqS_zcXJD`f9<(j!^2n9fZ>mdi!o!vs%tn@)CQZ) zhWq#LqrJTyIh$`|%i0D$Cl2&%R37TUnx$8e5RotUpE$4D^Cu~@jhaJvO@FXp3Q&nfx&6Bxt7XLsSY#)_BX z4r2E7uVLO{!Qm1cc4u3V|G5?UTif~kn*%nscNen~Dlq@`gD$^+2A$u22mD*Iu2beP zCCrTM%my6DwV|w_lS^@q4WF&PgLw9TY~GxG9J{Nl%i-?T&Q3N_8(na8U*~_58it<(kx$W5hHoh7svblt>(|2+ng^w1d(k{oToPSUa6uIR% z9h(wIYcA&@d`0aETMJ(+*Kq6)!*}3dKkIOCv|?m@m9vW)$Q&Laz7k7oF1Tu)WjJ<` zQwvjR7ru`|D{-{uj{;ZZ)WX!W^YomhjihIov&wTT8o|m(}Gz9e)Ac CGHw|F diff --git a/protocols/Tlen/proto_tlen/res/FFC.ico b/protocols/Tlen/proto_tlen/res/FFC.ico deleted file mode 100644 index 02ee661796463c1fe74d6cb832d895bf28663b1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5430 zcmdT`TWFm{5Z?csq&=~LTx#QkEe$?sK#GD0eXI!DfcPM`f~`p^jj^qX^@54FC@GN! zZLmW7;8P$|ZmYwaCfG&D411oQC0w`ky(8??H%#t_mm z1PjghGR6+IclOZO*qGr)9+-dG^8-Ct|1sVC?H1sE_$RdQ&2g$~ZKpBTA~MH%!Cl); z{_2Hmq`sd*IPlkDJ$idOP_TaP+bi&2k8!Av)Rjq0oq}_NI%iDq!PnL@?i(0fx1){+ zx=0-#Cv}Y|(sPSc<=`Y_UvDu#nBN`KmJ9|z#0|T^)v6A2{C|;uRka> z-mL+0$f^C6iVwDvDu3QnfAHe$re^0nnR)P>gW_DAP>3S=1-j0t750lWlXJHNc<_7< z3iaf=B>ObR^|A4canvVV&lGq&w#K*h!=(FIV%ysGk01Nt<9(9Nf#=WMA$Oh(;#u>< z>zp`lx?1?z{~vvLXG&T2u;4uk`h-vPrt+!?OFql)$YTd;@*dq^gRyIis2fX^Oe9XG zx}>Be%p66V_f|AG&%7SPecgJviMAg(se9kq{|bfg*+nXMQ(Coj9EWU4mQPVpk>(EV zJAOT{;vIVRbQ|^d_IjkH?F+(MXm4d&IoRA7C*#MyLr=eaeaF!j>hJGQD)1?*`+$Cr z{z}=Zn=oy<= z#^@_P+t}HQJv2Hxss(2cPFrA;^|N1f)0WD&DLOTsK7Z4k?pxs%&HTF&dt_vU#>dC$ z)P+lQsqZH}##{t8tYHpcV0s6KGvoKkf%$82rua>bMx$v7e1SRBc{y|bxE#R0wfY22 zOia+^3EG*FC;$i~#($bP%!#aGMKkG2}PdKvS*Kc{_AC&u4J?*Uh$n+CxV2i|t z&;5t%Gk$*(_K!O78EAQbnv|OZ_SX9KcP0^YaNl;%jTEO;Ud3;^q*p zxk!0cO}fACtZt^AFMX)T#nnx^=6HA0|c69=W(0Vdr@-U_?be-x+%2dK5`1T z>0V3cy|p>*v2Pvx`0ZRUcJGfJE1R*z@ti{{e!06oI@28f&-|I})$B9w+>G5mU#>rX z2lXAa?J|ywkxm|lCk|`u65HkexA}u|%!uEo-wfVoEr`>$8@$i{6KdeYVemd{Hc!yl z;K6Uz9^66vL9w#2r{eeI;O;RSo*<0j_u0GDz~r!j{5Dt6SaJ>8OEz|i8N_MZ#djmL s%@Z`<2wsU9#F@-){-<#7cz(a+F54PDt|W_@?V7|6(wWBPy8Nf#-#6@@OaK4? diff --git a/protocols/Tlen/proto_tlen/res/Invisible.ico b/protocols/Tlen/proto_tlen/res/Invisible.ico deleted file mode 100644 index 0930c080182c4fcefd9955744931f15fcd3ed7d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5430 zcmd5;YfKbZ6rRBsN{zM=t1$|xg^;#CFs3$X)5g?l|J2Z?RTC=(srUeF1S`IZyrgIY zsEvtI38jjO75M{*Q3{$Y3TW4Au@9ApbysCYiReBkF8lSKp=UA~XV+b+ZEte++0>4eZOE zg~n5ra5x@_a40z#M|xKD^T9a@a^C*J`Dkx%hqbW^cMqh)a=Kbs@7ww&>MJ+l=8bCv ze+0iMCL%09DHNA4oyJ{r9k4VAh?n5`bOi4F)PP?vG$3t(gbB|DtMzZ#umQETwUkc& zq5ui=l9n{(J2${1Lkmo@{{#^9#(72EAv(h0GR0?;{#n^y1MC<|8e}C?OMtL<*Uy z6S7S_Zu$`o%@@6jHeVofk$a4g>598RAij+>uB^FH5qVAs3A zSFZuvUInsV2G&i1Cv~#wr`X(O!B51muYvkc{C95OL~n1eA_HZMfsz=Y_&s39TS^U{ zjS;G!Vu@ehe?Ds?O}s4HyCC?3^Hajm@ta9}i#QbNKU*%2M~v^|fp0_&q7M%%H>-Y% z-SK(EBlpjUmu<|=nrj#s7zo69wqA_o{x1 zttd%C?*qGX{>)+YEV7SzSu?-brCfdD1ag*#z|wwJ`L>|%4R1m*`N`wNvv5_td(819 z{8R_kv}MaG6t0Cn-ikP5D}M zby))9eq0~)``7k{=Ul%w*OSaS59cNQf9L0#jdY+r;2eSMpD{-I-{cR3OJ6Hv*{ln)4GUasSi&%%|6Z@N=xcTF+&)=3GYm*Y|*9{nbW%dK>2= zer@lK&VXa}Ifk<4oZk4gJ>b}(@aeIf(`fJ91FnH%^*M&J=A2qCZ*z_v3ZEX!IlXae y?Hv0ww3f%){AuuVPH&vP>~v>X`1$pwIqq@y%om?8pEkeI+!xl!C;IZAj=una7w3oo diff --git a/protocols/Tlen/proto_tlen/res/NA.ico b/protocols/Tlen/proto_tlen/res/NA.ico deleted file mode 100644 index daa5d83994568078ec4c11e09f39f7859a446688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5430 zcmdT`e@xX?6#qUHhl5Sn9Lqmk49jeaicO-nTFd-Fx?qwyl<)^z8itT#px`DF1%;Bo z7`4e3K}yuJ)WE<%gvtU9u~O-wf;f;LnJl(89G}j)ynFk;_rBl9d#_yUZfEy?&$*xT zIp^GS?|YhN(R{SPK#k@QZSzD;o2hA9NXXcC1?dY(H;Z(%q#a{=nhXa3OXA{(f-_&7 zvos|t6oqSME7=w`0}nsokI9oJfWS%^BZaWOj3wN?ij?`N-ubkWiqyyOZhROzS{re1 zWP~6PJ|vcB!p|aX>nCZEsLfsKB&;vZSc#sl4u%`yS8&V?1uIR3?bE0FtN687TA$@fXk4v3e|q zwN=nkJE64zQ>r_Vwk{f{@?z0eo+gC%$u;ZCw%g|~Vo3TKTH_z^`F;eUTfW4eHDRcE zCk~e?cPim;u77)Lld8Xp!Bzu~Ve)Gi5gNA-X>{Hks}$yC?9iP7hN&U=C7xo?C>9@! z1ylSdi8^zwIA1<9dF~2K3p+fWgU0ow{&F=0#$xV9`62r$8CP@8KW48KOkrI+~L~n=g^e5#4V}KUW7dxB5`N1-+lg^yP|I$V<7%W z?z8U-qC67DTy1OijNc#z;@^}464o803YlbuP zO40R#tbbR{URtNAXK(BCZ}u5;oq`c`8rj-`@6vUH*o= z@_mrpa<;`l`~fMk;kfYOHrzU0fSXmj(fLItE`5}W&KoyG?XQ29CUk7$Jp7A_-8V=!h{Q+33-iDQW!g?|fy^>m F{sLtpU$FoH diff --git a/protocols/Tlen/proto_tlen/res/Offline.ico b/protocols/Tlen/proto_tlen/res/Offline.ico deleted file mode 100644 index 651eba3c953814cddb6334658f4d2a86eeba820e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5430 zcmds(Jx&8L5QV+K0dj<`5Xay+Na<3gNyiqEA}X330Es$9nn*NhXgLdl*7$AmR>NrQ z_5O(;OV-%ldGpQ8dIQcC?!wJxF4)rDT{(B{oGZ)I{yCgKgtMD)7M8)|bRLX3y!QoX zaPT>k{@Oy@HqJf`lQFj2ZO!hZ-|zQ+xm-r|x+eHSLv~89Yr=l9Soqy;SL=_*qu*>c zNxrNJ`uTkBtE%$Q_R%B8YPIr*!=cu%*XuebovY-^HT>8E@R190>Z3;v$OT$X$+Fgx zkKUu7ZEP7^>O=ej{cqFDJm8D_1}!FIODp~L+R|&E)E@dUns4B|Pf5N#v-CLYGRY5` zK?A=tWtg{N;`b;v$jh}auWvpzbK~Utg}giUukkM~y%RH+r~R6EUGorZ?!!MK8(R< zuPw{^Eq;vMwSJ4sGs)LE4CRwy-BCXKt^8E&UHjjqe!heM&Sy`odw|-fuKzFd*)z+s zu3XC)@;hwnKQ)%k<wMaW5)Qh2lO4n(^|%~YG)6a1ATRj zA$!J@tk{~qLwH)tm@%e2r|%S2a$@T#xQrQNrp|F^IQjj?EdAQCgWS{l-7C{ I`tqaW3p$=HcK`qY diff --git a/protocols/Tlen/proto_tlen/res/Online.ico b/protocols/Tlen/proto_tlen/res/Online.ico deleted file mode 100644 index 6ebb3932e7f1db79c391d1fd1df0fe059350324e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5430 zcmds(J5B^K3_v}I1MCr|LL7s8P|+YnMS(Z~2cX~tl$?Nqf&v|^ty#3*wgR?j1ZENglpH5#KJbi9_oUa^EOa=9)SbPkj20jLgg<`6)rx+*}iYauN zuQu=SsrCi2OW)ES{Wox39y`V3?eV;kEp_%SNBU?r&EC@0TT8NooTTjV5j%UYRoGg;q}Yqda0jMJ&Ze^-!b#1X`Jk(yi{)tQ|d}K%~QW6 zYhUM(|9ZW4HJxKB;jvEK-^-6!`x-XcFrR#~|J>-=#N|Fw{@&j}3_bRg`Ex!-3@UpL zKKWE)n1UboTD!BHzrr`!Bl9ojCoycxXRdZf_**>BTnDiSKgrLsN7jE-{$UUPJD+Q! zo&!7sbLao3`Pw^D`Fl`R|6juAJuDexo=KgeoZp{t|LC{aJcEgkN%L@r;&*B=CqJpXtU-)n zMt;iE)?BNaI$JjEQ{$yF)}3QaS=xFIF8kDYLo$Ci@Z5Cn2;bv$WW9lNHpH~PcVZDN NmRoj~9P9F~Wz4FB~L3o-Jw>_LaNly? zFAR^D252#f3sWi1trSYvyV)}+m<@irgB2_<5?zUmWe(~-|8Gb2j7uQCe4|UbCYmi?lJLrn7BQ=zS6U-N4TCj zxF0LN!`FA%@be*iQg}QHPLa$(2m9GTY3|@){~~+Zf2huuWpRE9?pjcvN~M(EklP3U zz4V`v=3V{7H1dI|@LYS>`xdTZzaj3<39QE5m%^s3$RX;W?h&S0W|{|=U#of@DjgeD zDb{%n-VWdf_|mJMWWGdgd8W(*rUkg~!0;Q*zqPPJll+U0-(-JeZvw6tmu4>=B?_?95#<_11gENe~ljGp475V~y z3^}pqiY9i#UGtYOyhX&l_$Gbqi#~nSn(LN1W!?(~-4)+mrGGhZ%b%#kr3MGERu3$) q$JU%5dHhDdV#J>O_L++@!HgBG0#uCApO}iVOJGJH#awc`82b%9(>E;u diff --git a/protocols/Tlen/res/image.ico b/protocols/Tlen/res/image.ico deleted file mode 100644 index 8e1ff9824d9e8c3f9d7a40817d7c8a1aa14f6eff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmbu8u}eZx6vmIxP)BSbY$W2$`q z!>?o8#Bz=0a@oMI`){CW8nQ8xB2mN0&IU%d@>Q!<1HTo#L$B8xuwp&)zR(`%2bN>h z>vaRaa~TJ>l?VZ!Vjl&^wt811&#{`#rh(tTO-P>S6sM2z^c9C*?RMM1A4DHVyvm`^ z$?Q8cDYp4v>G$8v>sgLx=DXc4EV}b!=2Z=9)Yr~-zu#B+<@p`)gRhvXAJ#ALk1zS0 z;u!9561!Iq*bd!e^DKlsLaud4K-V#VGCitAMoY8?qxY AlmGw# diff --git a/protocols/Tlen/res/mail.ico b/protocols/Tlen/res/mail.ico deleted file mode 100644 index 165a17c729b288e7df0f4fa8fb3c7079f640cc3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmbW0O-lkn7{|wU?G|{5=-8p4Pmq@`eu6$k1)b|09eWWWvX_e#nH0UMqy||Ok(Z<* zgtQ_`Ln$I51nE#bJ^$HV*=&Q&k^es9%>4fIJhMAOIQZvs34V5nAytSrAw)Nehj>IA z=U~~~ZnuM_u$+2S^*;Vv3G-Orq(}6dSuLzqR=W*h9oB=x9_V+n(0XkM>$+Irl(EqP zAB*g2u)psL2HcQ`>YW&-*!C=C(z{g5CjS)XV_SZ?4|B*9wK~DSKBZ|dJTE=U`4rU) zYqZqK8Ze6@W2!=rd}MDL|DLIj&&_Uh@PqC)ntwUt{%LWKOydJl29<>0#pW{^k2iC0Bm4 shL6ePG#NDVNBy<$4>{Ns@9)!DeE*H!KinI|@>2h6FyIlQF%bnk-zXs%hyVZp diff --git a/protocols/Tlen/res/microphone.ico b/protocols/Tlen/res/microphone.ico deleted file mode 100644 index f3d369087986bc38ed6cc1c1e8e4ac2ae20e24b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmb7DJ4_T&6n)HoSOEitf;41;#H=QE_Uy6=yUfH!6JQZ!L9@Svf={tp5ZA0LKP?Om z$xxwW`IJ-?WD`O`Pi;0B6GLTbVKSaG&Kq}TNrX2!^X|Lvo^$V=_eO{&JRKbZZ&hUd zLUalt!T? zO$~Bk_W~+?0QVS!O8*V46&s=Doc>wXAald_1^X&+3kU&Lyi~xNxq~Y?eT!V!U9VG# zWM+6U20Kh0>cZ{;+JPY8)Bsy4XSAo13!S6&xhLjQRwu8D{Rh-|^HLjw-3_o0r7pj+ zwK!oeJWuq$&uVMbk^JI|xLHbTpJtNrA^Urf-{#@_c1zQ&yPGrl+vU8KpM0BlzmDIE zSYKWK2L9g1`Rni%Z~lXgqKiNLIQGbs-{~Lzs;rx}6O|7O&fOtTqVR0s1hqGN`uA7f zPF3lr&bRZg=HcF^d3Jhi&34{<%)=Of=j}Q_td&A4(Lz4C7eBr`8aBTVF*gC;KiB=K z`;GzfIjAA)u=#hue%^3VU75NWB uZwEf+b@hB1SNagk9s_{Yr)@Xnt@(^-t;vX1#ntc=@x-rYBl^4Di2ea7Gg`O+ diff --git a/protocols/Tlen/res/speaker.ico b/protocols/Tlen/res/speaker.ico deleted file mode 100644 index a62e4a7c79c95c9f22bdb4d0021096f3cb8d4e67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmcJNKS%;m9LHY}v^q5hIkdU9#YLNNLt{e)4N4#l5f0HGA%cT$ifFmWCCF$pXpu}J zBq&0HB%&ghYA9$CB!pkz?|JVyNihdcKE8MNexKj_dQYYL@Ck(!zK2x2U#UT*)Cj;M zJZU_~(9>&vCK?72FbXC-q8Lpu4!B0bor0i-j(`G)bgB=oYj=AiMxQkKpC8Y5us%2s zx_8&PKR#Xd4LY2|OMpipTtC=dk%!WSEX60;!v=1KR<7r>#`TWVmYimGEWH9?{m*~XBf<*b71WH|Ev2jH;C%{UX3D-Q5bNH+L~j0CmrK8<{0Y{Fb0M_IA3V2 Lv4*vEaSXb@0ZttI diff --git a/protocols/Tlen/res/tlen.ico b/protocols/Tlen/res/tlen.ico deleted file mode 100644 index 0019bb2ae4b56e59151af9a86cab5d1e1178bd7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmaizO=uHQ5Xaxkhcz2ptAdv*5xrOu)PojJrVs@Wf)uX>(TiR*q9P(_6_p|?*ph(I zA{wj)#OOhZ6iOp$P-{Vp2r=ekQ>z$hlWdv~liiLpFK)D&(6{_{9`oiuvv1!##yCE$ ztqkAm*bx(Bs~KY(5pPNHau-okh#AuDiw@Pt&pY?OBn^^vC(y=NS+JS2=h=iCC zth8`Qv4qW(R!%nge}ts_a#9*h6bY**nrwa)9$y)Hb$Nr!z5RC%!veJm9Xzbv+j6PD z(sjrIjc9rC(YNBw1m*anSD}qX;4b%SLN`9~8tOqgrQ0$rc{}r9>6fpzS`HPCF(2f) zyQ-i3@E&xA1AaJqrn~k%*4`MHhtdVwr}zgdw6hQdmyP!k|Mn|DG>98v%=J z8cZW|K|`s$iQ&GPAEMkn5By?9)Jaas@Gst{9tBr3^byS-oc+$V$HV_LQCuC zdQU(mlYwlu3i${{$qFmokiqQB#*K5uJy^e;k7!Y<8ife?Z-;es?^cbGOX6hl_ zhf}Yi+rc3h*wFm*Rz{+nx=uOs!*v^pjn>(@U2rDoeo^lrM$)6DduPJ^tmQw|<2WpI2Sq_nxoH9 yEITO%W9j}0E$ROo)RQVWL~l@kP>+$X&PecqPGS`4VO1E~dg$xIVtmOq(D@6<9!;|V diff --git a/protocols/Tlen/res/tlen.rc b/protocols/Tlen/res/tlen.rc deleted file mode 100644 index 9a410410a4a..00000000000 --- a/protocols/Tlen/res/tlen.rc +++ /dev/null @@ -1,386 +0,0 @@ -#include "..\src\resource.h" -#include -#ifndef IDC_STATIC -#define IDC_STATIC (-1) -#endif -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif -#ifdef APSTUDIO_INVOKED - -1 TEXTINCLUDE -BEGIN - "..\\src\\resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""winres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_ACCMGRUI DIALOGEX 0, 0, 186, 134 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -EXSTYLE WS_EX_CONTROLPARENT -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Username:",IDC_STATIC,0,14,38,12,SS_CENTERIMAGE - EDITTEXT IDC_EDIT_USERNAME,65,14,115,12,ES_AUTOHSCROLL - LTEXT "Password:",IDC_STATIC,0,30,38,12,SS_CENTERIMAGE - EDITTEXT IDC_EDIT_PASSWORD,65,30,115,12,ES_PASSWORD | ES_AUTOHSCROLL - CONTROL "Save password",IDC_SAVEPASSWORD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,65,46,115,10 - CONTROL "Create new account",IDC_REGISTERACCOUNT,"Hyperlink", - 0x0,0,62,100,8 -END - - -IDD_OPTIONS_BASIC DIALOGEX 0, 0, 304, 200 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -EXSTYLE WS_EX_CONTROLPARENT -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - GROUPBOX "Tlen",IDC_TLEN,0,0,304,42 - LTEXT "Username:",IDC_STATIC,8,12,52,8 - EDITTEXT IDC_EDIT_USERNAME,70,10,86,12,ES_AUTOHSCROLL - CONTROL "Create new account",IDC_REGISTERACCOUNT,"Hyperlink", - 0x0,170,12,100,8 - LTEXT "Password:",IDC_STATIC,8,26,52,8 - EDITTEXT IDC_EDIT_PASSWORD,70,24,86,12,ES_PASSWORD | - ES_AUTOHSCROLL - CONTROL "Save password",IDC_SAVEPASSWORD,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,170,26,100,10 - GROUPBOX "Options",IDC_SIMPLE,0,44,304,156 - CONTROL "Automatically reconnect after unintentional disconnection", - IDC_RECONNECT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8, 56,239,10 - CONTROL "Leave status message after disconnection", - IDC_OFFLINE_MESSAGE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,8,68,168,10 - COMBOBOX IDC_OFFLINE_MESSAGE_OPTION,190,67,75,140, - CBS_DROPDOWNLIST | WS_TABSTOP - CONTROL "Ignore advertisements", - IDC_IGNORE_ADVERTISEMENTS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8, 80,250,10 - CONTROL "Automatically delete contacts not in my roster", - IDC_ROSTER_SYNC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8, 92,250,10 - CONTROL "Show offline users with status messages as invisible in contact list", - IDC_SHOW_OFFLINE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, 8,104,250,10 - CONTROL "Enable avatars", - IDC_AVATARS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, 8,116,250,10 - CONTROL "Send and receive client version information", - IDC_VERSIONINFO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, 8,128,250,10 - LTEXT "Alert policy",IDC_STATIC,8,140,70,8 - COMBOBOX IDC_ALERT_POLICY,95,139,190,100, - CBS_DROPDOWNLIST | WS_TABSTOP - CONTROL "Use Nudge plugin", - IDC_NUDGE_SUPPORT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 24,153,120,10 - CONTROL "Log alerts as messages", - IDC_LOG_ALERTS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 150,153,130,10 - LTEXT "Group chat policy",IDC_STATIC,8,168,70,8 - COMBOBOX IDC_MUC_POLICY,95,166,190,100, - CBS_DROPDOWNLIST | WS_TABSTOP - LTEXT "Image transfer policy",IDC_STATIC,8,183,70,8 - COMBOBOX IDC_IMAGE_POLICY,95,181,190,100, - CBS_DROPDOWNLIST | WS_TABSTOP -END - - -IDD_OPTIONS_VOICE DIALOGEX 0, 0, 304, 200 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -EXSTYLE WS_EX_CONTROLPARENT -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - GROUPBOX "Voice Chats",IDC_STATIC,0,0,304,57 - LTEXT "Voice chat policy",IDC_STATIC,8,12,70,8 - COMBOBOX IDC_VOICE_POLICY,95,10,190,100, - CBS_DROPDOWNLIST | WS_TABSTOP - LTEXT "Recording device:",IDC_STATIC,8,26,105,8 - COMBOBOX IDC_VOICE_DEVICE_IN,120,24,110,100,CBS_DROPDOWNLIST | - WS_TABSTOP - LTEXT "Playback device:",IDC_STATIC,8,40,105,8 - COMBOBOX IDC_VOICE_DEVICE_OUT,120,38,110,100,CBS_DROPDOWNLIST | - WS_TABSTOP -END - -IDD_OPTIONS_ADVANCED DIALOGEX 0, 0, 304, 200 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -EXSTYLE WS_EX_CONTROLPARENT -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - GROUPBOX "Expert Options",IDC_STATIC,0,0,304,74 - LTEXT "Login server:",IDC_STATIC,8,18,75,8 - EDITTEXT IDC_EDIT_LOGIN_SERVER,90,16,90,12,ES_AUTOHSCROLL - LTEXT "Connection Host:",IDC_STATIC,8,32,75,8 - EDITTEXT IDC_HOST,90,30,90,12,ES_AUTOHSCROLL | WS_DISABLED - LTEXT "Port:",IDC_STATIC,194,32,35,8 - EDITTEXT IDC_HOSTPORT,230,30,26,12,ES_AUTOHSCROLL | ES_NUMBER | - WS_DISABLED - CONTROL "Keep connection alive",IDC_KEEPALIVE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,8,47,250,10 - CONTROL "Enable encryption",IDC_USE_SSL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,8,60,250,10 - - CONTROL "Enable Always Visible and Never Visible", - IDC_VISIBILITY_SUPPORT,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | - WS_TABSTOP,8,60,250,10 - - GROUPBOX "P2P Connections",IDC_STATIC,0,100,304,98 - CONTROL "Use proxy for incoming connections",IDC_FILE_USE_PROXY, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,114,271,10 - LTEXT "Proxy type:",IDC_FILE_PROXY_TYPE_LABEL,10,130,48,8, - WS_DISABLED - COMBOBOX IDC_FILE_PROXY_TYPE,68,128,80,48,CBS_DROPDOWNLIST | - WS_DISABLED | WS_VSCROLL | WS_TABSTOP - LTEXT "Proxy server:",IDC_FILE_PROXY_HOST_LABEL,10,145,48,8, - WS_DISABLED - EDITTEXT IDC_FILE_PROXY_HOST,68,143,80,12,ES_AUTOHSCROLL | - WS_DISABLED | WS_GROUP - LTEXT "Port:",IDC_FILE_PROXY_PORT_LABEL,174,145,25,8, - WS_DISABLED - EDITTEXT IDC_FILE_PROXY_PORT,204,143,30,12,ES_AUTOHSCROLL | - ES_NUMBER | WS_DISABLED - CONTROL "Proxy requires authorization",IDC_FILE_PROXY_USE_AUTH, - "Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,8, - 160,271,10 - LTEXT "Username:",IDC_FILE_PROXY_USER_LABEL,10,176,47,8, - WS_DISABLED - EDITTEXT IDC_FILE_PROXY_USER,68,175,80,12,ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "Password:",IDC_FILE_PROXY_PASSWORD_LABEL,153,176,45,8, - WS_DISABLED - EDITTEXT IDC_FILE_PROXY_PASSWORD,204,175,81,12,ES_PASSWORD | - ES_AUTOHSCROLL | WS_DISABLED - - -END - -IDD_OPTIONS_POPUPS DIALOGEX DISCARDABLE 0, 0, 304, 143 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -EXSTYLE WS_EX_CONTROLPARENT -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - - GROUPBOX "Mail Notification",IDC_STATIC,0,0,304,110 - CONTROL "Enable incoming mail notification",IDC_ENABLEPOPUP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,12,267,10 - GROUPBOX "Colors",IDC_STATIC,8,26,140,55 - LTEXT "Background",IDC_STATIC,47,43,95,8 - LTEXT "Text",IDC_STATIC,47,62,96,8 - CONTROL "",IDC_COLORBKG,"ColourPicker",WS_TABSTOP,17,41,24,12 - CONTROL "",IDC_COLORTXT,"ColourPicker",WS_TABSTOP,17,59,24,12 - GROUPBOX "Delay",IDC_STATIC,157,26,140,55 - CONTROL "&From popup plugin",IDC_DELAY_POPUP,"Button", - BS_AUTORADIOBUTTON,164,40,125,10 - CONTROL "&Custom",IDC_DELAY_CUSTOM,"Button",BS_AUTORADIOBUTTON, - 164,53,98,10 - EDITTEXT IDC_DELAY,267,51,21,14,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "P&ermanent",IDC_DELAY_PERMANENT,"Button", - BS_AUTORADIOBUTTON,164,67,123,10 - PUSHBUTTON "Preview",IDC_PREVIEW,119,90,70,14 -END - -IDD_PASSWORD DIALOG DISCARDABLE 0, 0, 151, 63 -STYLE DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | - WS_VISIBLE | WS_CAPTION -CAPTION "Tlen Password" -FONT 8, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_JID,7,7,137,12,ES_READONLY | NOT WS_BORDER | NOT - WS_TABSTOP - EDITTEXT IDC_PASSWORD,7,22,137,12,ES_PASSWORD | ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,23,42,50,14 - PUSHBUTTON "Cancel",IDCANCEL,77,42,50,14 -END - -IDD_USER_VCARD DIALOGEX 0, 0, 222, 140 -STYLE DS_FIXEDSYS | WS_CHILD -EXSTYLE WS_EX_CONTROLPARENT -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Nickname:",IDC_STATIC,5,8,51,8 - EDITTEXT IDC_NICKNAME,58,6,102,12,ES_AUTOHSCROLL - LTEXT "First name:",IDC_STATIC,5,21,51,8 - EDITTEXT IDC_FIRSTNAME,58,19,102,12,ES_AUTOHSCROLL - LTEXT "Last name:",IDC_STATIC,5,34,51,8 - EDITTEXT IDC_LASTNAME,58,32,102,12,ES_AUTOHSCROLL - LTEXT "E-mail:",IDC_STATIC,5,47,51,8 - EDITTEXT IDC_EMAIL,58,45,102,12,ES_AUTOHSCROLL - LTEXT "Gender:",IDC_STATIC,5,61,51,8 - COMBOBOX IDC_GENDER,58,59,55,52,CBS_DROPDOWN | WS_VSCROLL | - WS_TABSTOP - LTEXT "Year of birth:",IDC_STATIC,120,61,53,8 - EDITTEXT IDC_AGE,176,59,27,12,ES_AUTOHSCROLL - LTEXT "City:",IDC_STATIC,6,75,51,8 - EDITTEXT IDC_CITY,58,73,102,12,ES_AUTOHSCROLL - LTEXT "School:",IDC_STATIC,5,88,51,8 - EDITTEXT IDC_SCHOOL,58,86,102,12,ES_AUTOHSCROLL - LTEXT "Occupation:",IDC_STATIC,5,102,51,8 - COMBOBOX IDC_OCCUPATION,57,100,102,96,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Looking for:",IDC_STATIC,5,116,51,8 - COMBOBOX IDC_LOOKFOR,57,114,102,96,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - CONTROL "Voice chats",IDC_VOICECONVERSATIONS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,130,107,10 - CONTROL "Publicly visible status",IDC_PUBLICSTATUS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,112,130,107,10 - PUSHBUTTON "Save changes",IDC_SAVE,164,111,53,16 -END - -IDD_USER_CHANGEAVATAR DIALOGEX 0, 0, 180, 80 -STYLE DS_SETFONT | DS_3DLOOK | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -CAPTION "Avatar" -BEGIN - GROUPBOX "Avatar Options",IDC_STATIC,5,2,170,55 - CONTROL "Public avatar",IDC_PUBLICAVATAR,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,15,15,150,13 - PUSHBUTTON "OK",IDOK,115,62,60,13 -END - - -IDD_USER_INFO DIALOG DISCARDABLE 0, 0, 222, 146 -STYLE DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Tlen login:",IDC_STATIC,5,2,48,8 - EDITTEXT IDC_INFO_JID,53,2,73,12,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER - LTEXT "Subscription:",IDC_STATIC,5,14,48,8,NOT WS_GROUP - EDITTEXT IDC_SUBSCRIPTION,53,14,131,12,ES_READONLY | NOT WS_BORDER | - NOT WS_TABSTOP - LTEXT "School:",IDC_STATIC,5,44,48,8 - EDITTEXT IDC_SCHOOL,53,44,131,12,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER - LTEXT "Occupation:",IDC_STATIC,5,56,48,8 - EDITTEXT IDC_OCCUPATION_TEXT,53,56,135,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER - LTEXT "Looking for:",IDC_STATIC,5,68,48,8 - EDITTEXT IDC_LOOKFOR_TEXT,53,68,136,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER - LTEXT "Software:",IDC_STATIC,5,100,48,8 - EDITTEXT IDC_SOFTWARE,54,100,140,12,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "Version:",IDC_STATIC,5,112,48,8 - EDITTEXT IDC_VERSION,54,112,140,12,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "System:",IDC_STATIC,5,124,48,8 - EDITTEXT IDC_SYSTEM,54,124,140,12,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP -END - -IDD_ADVSEARCH DIALOGEX 0, 0, 334, 178 -STYLE DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_BORDER -EXSTYLE WS_EX_CONTROLPARENT -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - GROUPBOX "Personal Information",IDC_PERSONALGROUP,7,7,156,164 - LTEXT "First name:",IDC_STATIC,15,22,50,8 - EDITTEXT IDC_FIRSTNAME,65,20,91,12,ES_AUTOHSCROLL - LTEXT "Last name:",IDC_STATIC,15,37,50,8 - EDITTEXT IDC_LASTNAME,65,35,91,12,ES_AUTOHSCROLL - LTEXT "Nickname:",IDC_STATIC,15,52,50,8 - EDITTEXT IDC_NICK,65,50,91,12,ES_AUTOHSCROLL - LTEXT "E-mail:",IDC_STATIC,15,67,50,8 - EDITTEXT IDC_EMAIL,65,65,91,12,ES_AUTOHSCROLL - LTEXT "Gender:",IDC_STATIC,15,85,50,8 - COMBOBOX IDC_GENDER,65,83,91,51,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Age:",IDC_STATIC,15,100,50,8 - EDITTEXT IDC_AGEFROM,65,98,27,12,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "to",IDC_STATIC,98,100,21,8 - EDITTEXT IDC_AGETO,123,98,27,12,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "City:",IDC_STATIC,15,118,50,8 - EDITTEXT IDC_CITY,65,116,91,12,ES_AUTOHSCROLL - LTEXT "Occupation:",IDC_STATIC,15,135,50,8 - COMBOBOX IDC_OCCUPATION,65,133,91,93,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "School:",IDC_STATIC,15,150,50,8 - EDITTEXT IDC_SCHOOL,65,148,91,12,ES_AUTOHSCROLL - GROUPBOX "Extra Search Criteria",IDC_EXTRAGROUP,171,7,156,67 - LTEXT "Status:",IDC_STATIC,177,22,50,8 - COMBOBOX IDC_STATUS,227,20,91,113,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Looking for:",IDC_STATIC,177,37,50,8 - COMBOBOX IDC_LOOKFOR,227,35,91,172,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Plan:",IDC_STATIC,177,52,50,8,WS_DISABLED - COMBOBOX IDC_PLAN,227,50,91,113,CBS_DROPDOWNLIST | WS_DISABLED | - WS_VSCROLL | WS_TABSTOP -END - -IDD_VOICE DIALOG DISCARDABLE 0, 0, 151, 122 -STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | - WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "Tlen Voice Chat" -FONT 8, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_MICROPHONE,"MButtonClass",0x0,12,7,16,16, - 0x18000000L - CONTROL "",IDC_VUMETERIN,"Static",SS_OWNERDRAW,47,10,120,8 - CONTROL "",IDC_SPEAKER,"MButtonClass",0x0,12,29,16,16, - 0x18000000L - CONTROL "",IDC_VUMETEROUT,"Static",SS_OWNERDRAW,47,31,120,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,53,140,4 - LTEXT "Quality",IDC_STATIC,10,64,45,8 - COMBOBOX IDC_VCQUALITY,55,62,88,100,CBS_DROPDOWNLIST | WS_VSCROLL - LTEXT "In",IDC_STATIC,10,80,25,8 - LTEXT "",IDC_BYTESIN,35,80,30,8 - LTEXT "Out",IDC_STATIC,90,80,25,8 - LTEXT "",IDC_BYTESOUT,115,80,30,8 - EDITTEXT IDC_STATUS,10,91,131,8,ES_CENTER | ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_BORDER - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,100,140,4 - PUSHBUTTON "Finish",IDCANCEL,50,106,50,14 -END - -IDD_ACCEPT_VOICE DIALOG DISCARDABLE 0, 0, 210, 70 -STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_POPUP | - WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Tlen Voice Chat Invitation" -FONT 8, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "&Accept",IDC_ACCEPT,98,50,50,14 - PUSHBUTTON "Cancel",IDCANCEL,155,50,50,14 - LTEXT "From:",IDC_STATIC,25,24,60,8 - LTEXT "The following invitation to join a voice chat is received.", - IDC_STATIC,3,4,204,8 - EDITTEXT IDC_FROM,85,20,100,12,ES_AUTOHSCROLL | ES_READONLY - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,3,40,203,4 -END - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_TLEN ICON "tlen.ico" -IDI_MAIL ICON "mail.ico" -IDI_MUC ICON "groupchats.ico" -IDI_CHATS ICON "tlenchats.ico" -IDI_VOICE ICON "voicechat.ico" -IDI_MICROPHONE ICON "microphone.ico" -IDI_SPEAKER ICON "speaker.ico" -IDI_IMAGE ICON "image.ico" -#endif // English (U.S.) resources - - - diff --git a/protocols/Tlen/res/tlenchats.ico b/protocols/Tlen/res/tlenchats.ico deleted file mode 100644 index 9743bde1527cff0788b60354b7c0f23cc88084ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmb7@Jxjw-7=^F>f>Ok)D30Q!;1~D@>e_!$1?MUb;;IOuZf>rEn}f5s_y;P2Lra%t z5DFbiplLD`r+Ymoy>E<>pr$;1?|pMl-a|f=n!vAIR`_33^_)`kN~vXl7CPfT%Ab!) zrIG^$Py*9nCIHba-6PqEgFwtlWpQkFNGi8qn|> z%n|9aj%S^t_pQ|sw5-{Ob_2|UJm6edxe^R@LZv{+(9KEgAhM>8ouHWwoTGs3n_|^cQOX%;ko5rG9Mdx|00oqos#m{FF z`MZu|Ec)_bJY(n&jPH9S%+G83=-K(=&oh6&hpb~FEp-o1cP0pi->`mphDEt|o{Oxm z8~R71kx9e)`MgSJJJlQd{QqO8;<{U7Rfo2dUV1-<1H^B?^< diff --git a/protocols/Tlen/res/version.rc b/protocols/Tlen/res/version.rc deleted file mode 100644 index fdeb14668c1..00000000000 --- a/protocols/Tlen/res/version.rc +++ /dev/null @@ -1,55 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#ifdef APSTUDIO_INVOKED -#error this file is not editable by Microsoft Visual C++ -#endif //APSTUDIO_INVOKED - -#include "..\src\version.h" - -#define APSTUDIO_READONLY_SYMBOLS -#include "afxres.h" -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -VS_VERSION_INFO VERSIONINFO - FILEVERSION __FILEVERSION_STRING - PRODUCTVERSION __FILEVERSION_STRING - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "000004b0" - BEGIN - VALUE "Author", __AUTHOR - VALUE "FileDescription", __DESCRIPTION - VALUE "FileVersion", __VERSION_STRING - VALUE "InternalName", __PLUGIN_NAME - VALUE "LegalCopyright", __COPYRIGHT - VALUE "OriginalFilename", __FILENAME - VALUE "ProductName", __PLUGIN_NAME - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0, 1200 - END -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// diff --git a/protocols/Tlen/res/voicechat.ico b/protocols/Tlen/res/voicechat.ico deleted file mode 100644 index deb6398784f500598357b2d748391c2a3f870d8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmbW1&r2IY6vxN>sG^`Nf(S(jMM7ewy?V)--GV;~_R_>nETk*6#(*heNv+!IDF~i= zXm9q{)l2EczoDldT6<|L1!)VC(qsc&Xl!Tted`P)ilMmSlNsK=&%Bx4moV0XkEStv zhuBz51h&2x9Ez^eIPwNA(j-2~3DuTt_ zwMp`j+Y8QvFtKRqwOrCjNH>VF9drV%j_!@@RdPe~Q|1hVV&-^2+6sI1b%IUX=V_&JSMtx~F^%@mBa9lv8nj3dbpXsP!Dgl%GwQ z`qB-P-|L>T&!#G+u&j8C=3J{x@C71^)mJq}4M3 diff --git a/protocols/Tlen/src/codec/gsm.h b/protocols/Tlen/src/codec/gsm.h deleted file mode 100644 index f522739d102..00000000000 --- a/protocols/Tlen/src/codec/gsm.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2004 Piotr Piastucki - -This program is based on GSM 06.10 source code developed by -Jutta Degener and Carsten Bormann, -Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, -Technische Universitaet Berlin - -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 - -#define P_MAX 8 /* order p of LPC analysis, typically 8..14 */ - -typedef struct { - int LARpp[2][8]; /* LAR coefficients for previous and current frame */ - int j; /* current frame index in LARpp[j][] */ - int qLARs[8]; /* quantized LARs for current frame */ - int u[8]; /* used by short term analysis filter */ - int v[9]; /* used by short term synthesis filter */ - int subframe; /* subframe index (0..3)*/ - short dp0[ 280 ]; /* previous short-term filter output/prediction, used by long term analysis*/ - int e[160]; /* errors (residuals) */ - int nrp; /* long term synthesis */ - int Nc[4], bc[4]; /* long-term lag and gain for current frame */ - int Mc[4]; /* RPE grid index (0..3) */ - int xMaxc[4]; /* RPE maximum error quantized and encoded (mantissa + exp) */ - int xMc[52]; /* quantized residuals (errors) 4 * 13 */ - - int z1; /* preprocessing.c, Offset_com. */ - int z2; /* Offset_com. */ - int mp; /* Preemphasis */ - int msr; /* decoder.c, Postprocessing */ - - unsigned char gsmFrame[33]; -}gsm_state; - -extern gsm_state * gsm_create() ; -extern void gsm_release(gsm_state *ptr); -extern void gsm_encode(gsm_state *state, short *in); -extern void gsm_decode(gsm_state *state, short *out); - -extern void gsm_preprocessing( gsm_state *state, short *in, short *out); -extern void shortTermAnalysis(gsm_state *state, short *in); -extern void longTermAnalysis(gsm_state *state, short *in); -extern void encodeRPE(gsm_state *state); -extern void decodeRPE(gsm_state *state); -extern void longTermSynthesis(gsm_state *state); -extern void shortTermSynthesis(gsm_state *state, short *in, short *out); -extern void gsm_postprocessing( gsm_state *state, short *in, short *out); diff --git a/protocols/Tlen/src/codec/gsm_codec.c b/protocols/Tlen/src/codec/gsm_codec.c deleted file mode 100644 index afa1ef32deb..00000000000 --- a/protocols/Tlen/src/codec/gsm_codec.c +++ /dev/null @@ -1,283 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2004-2007 Piotr Piastucki - -This program is based on GSM 06.10 source code developed by -Jutta Degener and Carsten Bormann, -Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, -Technische Universitaet Berlin - -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 "gsm.h" -#include -#include -#include -#define GSM_MAGIC 0xD - -gsm_state * gsm_create() -{ - gsm_state * state = (gsm_state *)malloc(sizeof(gsm_state)); - memset(state, 0, sizeof(gsm_state)); - state->nrp = 40; - return state; -} - -void gsm_release(gsm_state *ptr) -{ - free(ptr); -} - -void gsm_encode(gsm_state *state, short *in) -{ int i, j; - unsigned char *c = state->gsmFrame; - short temp_in[160]; - - gsm_preprocessing(state, in, temp_in); - shortTermAnalysis(state, temp_in); - for (i = 0; i < 4; i++) { - state->subframe = i; - longTermAnalysis(state, temp_in + 40 * i); - encodeRPE(state); - for (j = 0; j < 40; j++) { - int ii = (int) state->dp0[120 + i * 40 + j] + state->e[i * 40 + j]; - if (ii<-32768) ii = -32768; - else if (ii>32767) ii=32767; - state->dp0[120 + i * 40 + j] = ii; - } - } - memcpy(state->dp0, state->dp0 + 160, 120 * sizeof(short)); - state->j ^= 1; - *c++ = ((GSM_MAGIC & 0xF) << 4) - | ((state->qLARs[0] >> 2) & 0xF); - *c++ = ((state->qLARs[0] & 0x3) << 6) - | (state->qLARs[1] & 0x3F); - *c++ = ((state->qLARs[2] & 0x1F) << 3) - | ((state->qLARs[3] >> 2) & 0x7); - *c++ = ((state->qLARs[3] & 0x3) << 6) - | ((state->qLARs[4] & 0xF) << 2) - | ((state->qLARs[5] >> 2) & 0x3); - *c++ = ((state->qLARs[5] & 0x3) << 6) - | ((state->qLARs[6] & 0x7) << 3) - | (state->qLARs[7] & 0x7); - *c++ = ((state->Nc[0] & 0x7F) << 1) - | ((state->bc[0] >> 1) & 0x1); - *c++ = ((state->bc[0] & 0x1) << 7) - | ((state->Mc[0] & 0x3) << 5) - | ((state->xMaxc[0] >> 1) & 0x1F); - *c++ = ((state->xMaxc[0] & 0x1) << 7) - | ((state->xMc[0] & 0x7) << 4) - | ((state->xMc[1] & 0x7) << 1) - | ((state->xMc[2] >> 2) & 0x1); - *c++ = ((state->xMc[2] & 0x3) << 6) - | ((state->xMc[3] & 0x7) << 3) - | (state->xMc[4] & 0x7); - *c++ = ((state->xMc[5] & 0x7) << 5) - | ((state->xMc[6] & 0x7) << 2) - | ((state->xMc[7] >> 1) & 0x3); - *c++ = ((state->xMc[7] & 0x1) << 7) - | ((state->xMc[8] & 0x7) << 4) - | ((state->xMc[9] & 0x7) << 1) - | ((state->xMc[10] >> 2) & 0x1); - *c++ = ((state->xMc[10] & 0x3) << 6) - | ((state->xMc[11] & 0x7) << 3) - | (state->xMc[12] & 0x7); - *c++ = ((state->Nc[1] & 0x7F) << 1) - | ((state->bc[1] >> 1) & 0x1); - *c++ = ((state->bc[1] & 0x1) << 7) - | ((state->Mc[1] & 0x3) << 5) - | ((state->xMaxc[1] >> 1) & 0x1F); - *c++ = ((state->xMaxc[1] & 0x1) << 7) - | ((state->xMc[13] & 0x7) << 4) - | ((state->xMc[14] & 0x7) << 1) - | ((state->xMc[15] >> 2) & 0x1); - *c++ = ((state->xMc[15] & 0x3) << 6) - | ((state->xMc[16] & 0x7) << 3) - | (state->xMc[17] & 0x7); - *c++ = ((state->xMc[18] & 0x7) << 5) - | ((state->xMc[19] & 0x7) << 2) - | ((state->xMc[20] >> 1) & 0x3); - *c++ = ((state->xMc[20] & 0x1) << 7) - | ((state->xMc[21] & 0x7) << 4) - | ((state->xMc[22] & 0x7) << 1) - | ((state->xMc[23] >> 2) & 0x1); - *c++ = ((state->xMc[23] & 0x3) << 6) - | ((state->xMc[24] & 0x7) << 3) - | (state->xMc[25] & 0x7); - *c++ = ((state->Nc[2] & 0x7F) << 1) - | ((state->bc[2] >> 1) & 0x1); - *c++ = ((state->bc[2] & 0x1) << 7) - | ((state->Mc[2] & 0x3) << 5) - | ((state->xMaxc[2] >> 1) & 0x1F); - *c++ = ((state->xMaxc[2] & 0x1) << 7) - | ((state->xMc[26] & 0x7) << 4) - | ((state->xMc[27] & 0x7) << 1) - | ((state->xMc[28] >> 2) & 0x1); - *c++ = ((state->xMc[28] & 0x3) << 6) - | ((state->xMc[29] & 0x7) << 3) - | (state->xMc[30] & 0x7); - *c++ = ((state->xMc[31] & 0x7) << 5) - | ((state->xMc[32] & 0x7) << 2) - | ((state->xMc[33] >> 1) & 0x3); - *c++ = ((state->xMc[33] & 0x1) << 7) - | ((state->xMc[34] & 0x7) << 4) - | ((state->xMc[35] & 0x7) << 1) - | ((state->xMc[36] >> 2) & 0x1); - *c++ = ((state->xMc[36] & 0x3) << 6) - | ((state->xMc[37] & 0x7) << 3) - | (state->xMc[38] & 0x7); - *c++ = ((state->Nc[3] & 0x7F) << 1) - | ((state->bc[3] >> 1) & 0x1); - *c++ = ((state->bc[3] & 0x1) << 7) - | ((state->Mc[3] & 0x3) << 5) - | ((state->xMaxc[3] >> 1) & 0x1F); - *c++ = ((state->xMaxc[3] & 0x1) << 7) - | ((state->xMc[39] & 0x7) << 4) - | ((state->xMc[40] & 0x7) << 1) - | ((state->xMc[41] >> 2) & 0x1); - *c++ = ((state->xMc[41] & 0x3) << 6) - | ((state->xMc[42] & 0x7) << 3) - | (state->xMc[43] & 0x7); - *c++ = ((state->xMc[44] & 0x7) << 5) - | ((state->xMc[45] & 0x7) << 2) - | ((state->xMc[46] >> 1) & 0x3); - *c++ = ((state->xMc[46] & 0x1) << 7) - | ((state->xMc[47] & 0x7) << 4) - | ((state->xMc[48] & 0x7) << 1) - | ((state->xMc[49] >> 2) & 0x1); - *c++ = ((state->xMc[49] & 0x3) << 6) - | ((state->xMc[50] & 0x7) << 3) - | (state->xMc[51] & 0x7); -} - -void gsm_decode(gsm_state *state, short *out) -{ - int i; - unsigned char *c = state->gsmFrame; - - if (((*c >> 4) & 0x0F) != GSM_MAGIC) return ; - state->qLARs[0] = (*c++ & 0xF) << 2; - state->qLARs[0] |= (*c >> 6) & 0x3; - state->qLARs[1] = *c++ & 0x3F; - state->qLARs[2] = (*c >> 3) & 0x1F; - state->qLARs[3] = (*c++ & 0x7) << 2; - state->qLARs[3] |= (*c >> 6) & 0x3; - state->qLARs[4] = (*c >> 2) & 0xF; - state->qLARs[5] = (*c++ & 0x3) << 2; - state->qLARs[5] |= (*c >> 6) & 0x3; - state->qLARs[6] = (*c >> 3) & 0x7; - state->qLARs[7] = *c++ & 0x7; - state->Nc[0] = (*c >> 1) & 0x7F; - state->bc[0] = (*c++ & 0x1) << 1; - state->bc[0] |= (*c >> 7) & 0x1; - state->Mc[0] = (*c >> 5) & 0x3; - state->xMaxc[0] = (*c++ & 0x1F) << 1; - state->xMaxc[0] |= (*c >> 7) & 0x1; - state->xMc[0] = (*c >> 4) & 0x7; - state->xMc[1] = (*c >> 1) & 0x7; - state->xMc[2] = (*c++ & 0x1) << 2; - state->xMc[2] |= (*c >> 6) & 0x3; - state->xMc[3] = (*c >> 3) & 0x7; - state->xMc[4] = *c++ & 0x7; - state->xMc[5] = (*c >> 5) & 0x7; - state->xMc[6] = (*c >> 2) & 0x7; - state->xMc[7] = (*c++ & 0x3) << 1; - state->xMc[7] |= (*c >> 7) & 0x1; - state->xMc[8] = (*c >> 4) & 0x7; - state->xMc[9] = (*c >> 1) & 0x7; - state->xMc[10] = (*c++ & 0x1) << 2; - state->xMc[10] |= (*c >> 6) & 0x3; - state->xMc[11] = (*c >> 3) & 0x7; - state->xMc[12] = *c++ & 0x7; - state->Nc[1] = (*c >> 1) & 0x7F; - state->bc[1] = (*c++ & 0x1) << 1; - state->bc[1] |= (*c >> 7) & 0x1; - state->Mc[1] = (*c >> 5) & 0x3; - state->xMaxc[1] = (*c++ & 0x1F) << 1; - state->xMaxc[1] |= (*c >> 7) & 0x1; - state->xMc[13] = (*c >> 4) & 0x7; - state->xMc[14] = (*c >> 1) & 0x7; - state->xMc[15] = (*c++ & 0x1) << 2; - state->xMc[15] |= (*c >> 6) & 0x3; - state->xMc[16] = (*c >> 3) & 0x7; - state->xMc[17] = *c++ & 0x7; - state->xMc[18] = (*c >> 5) & 0x7; - state->xMc[19] = (*c >> 2) & 0x7; - state->xMc[20] = (*c++ & 0x3) << 1; - state->xMc[20] |= (*c >> 7) & 0x1; - state->xMc[21] = (*c >> 4) & 0x7; - state->xMc[22] = (*c >> 1) & 0x7; - state->xMc[23] = (*c++ & 0x1) << 2; - state->xMc[23] |= (*c >> 6) & 0x3; - state->xMc[24] = (*c >> 3) & 0x7; - state->xMc[25] = *c++ & 0x7; - state->Nc[2] = (*c >> 1) & 0x7F; - state->bc[2] = (*c++ & 0x1) << 1; - state->bc[2] |= (*c >> 7) & 0x1; - state->Mc[2] = (*c >> 5) & 0x3; - state->xMaxc[2] = (*c++ & 0x1F) << 1; - state->xMaxc[2] |= (*c >> 7) & 0x1; - state->xMc[26] = (*c >> 4) & 0x7; - state->xMc[27] = (*c >> 1) & 0x7; - state->xMc[28] = (*c++ & 0x1) << 2; - state->xMc[28] |= (*c >> 6) & 0x3; - state->xMc[29] = (*c >> 3) & 0x7; - state->xMc[30] = *c++ & 0x7; - state->xMc[31] = (*c >> 5) & 0x7; - state->xMc[32] = (*c >> 2) & 0x7; - state->xMc[33] = (*c++ & 0x3) << 1; - state->xMc[33] |= (*c >> 7) & 0x1; - state->xMc[34] = (*c >> 4) & 0x7; - state->xMc[35] = (*c >> 1) & 0x7; - state->xMc[36] = (*c++ & 0x1) << 2; - state->xMc[36] |= (*c >> 6) & 0x3; - state->xMc[37] = (*c >> 3) & 0x7; - state->xMc[38] = *c++ & 0x7; - state->Nc[3] = (*c >> 1) & 0x7F; - state->bc[3] = (*c++ & 0x1) << 1; - state->bc[3] |= (*c >> 7) & 0x1; - state->Mc[3] = (*c >> 5) & 0x3; - state->xMaxc[3] = (*c++ & 0x1F) << 1; - state->xMaxc[3] |= (*c >> 7) & 0x1; - state->xMc[39] = (*c >> 4) & 0x7; - state->xMc[40] = (*c >> 1) & 0x7; - state->xMc[41] = (*c++ & 0x1) << 2; - state->xMc[41] |= (*c >> 6) & 0x3; - state->xMc[42] = (*c >> 3) & 0x7; - state->xMc[43] = *c++ & 0x7; - state->xMc[44] = (*c >> 5) & 0x7; - state->xMc[45] = (*c >> 2) & 0x7; - state->xMc[46] = (*c++ & 0x3) << 1; - state->xMc[46] |= (*c >> 7) & 0x1; - state->xMc[47] = (*c >> 4) & 0x7; - state->xMc[48] = (*c >> 1) & 0x7; - state->xMc[49] = (*c++ & 0x1) << 2; - state->xMc[49] |= (*c >> 6) & 0x3; - state->xMc[50] = (*c >> 3) & 0x7; - state->xMc[51] = *c & 0x7; - - for (i = 0; i < 4; i++) { - state->subframe = i; - decodeRPE(state); - longTermSynthesis(state); - } - memcpy(state->dp0, state->dp0 + 160, 120 * sizeof(short)); - shortTermSynthesis(state, &state->dp0[120], out); - gsm_postprocessing(state, out, out); - state->j ^= 1; -} diff --git a/protocols/Tlen/src/codec/gsm_long.c b/protocols/Tlen/src/codec/gsm_long.c deleted file mode 100644 index 56d83f78737..00000000000 --- a/protocols/Tlen/src/codec/gsm_long.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2004-2007 Piotr Piastucki - -This program is based on GSM 06.10 source code developed by -Jutta Degener and Carsten Bormann, -Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, -Technische Universitaet Berlin - -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 "gsm.h" -#include -#include -#include - -/* Decision levels */ -const static int gsm_DLB[4] = { 6554, 16384, 26214, 32767 }; -/* Quantization levels */ -const static int gsm_QLB[4] = { 3277, 11469, 21299, 32767 }; - -/* - * Long term parameters calculation - lag (Nc) and gain (bc). - */ -static void longTermLTPCalculation(gsm_state *state, short *in, short *in_1) -{ - int k, lambda; - int Nc, bc; - float in_1_float_base[120], * in_1_float = in_1_float_base + 120; - float in_float[40]; - float L_result, L_max, L_power; - - for (k = -120; k < 0; k++) in_1_float[k] = (float)in_1[k]; - for (k = 0; k < 40; k++) in_float[k] = (float)in[k]; - - /* Search for the maximum cross-correlation and coding of the LTP lag */ - - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - - for (lambda = 40; lambda < 121; lambda++) { - for (L_result = 0, L_power = 0, k = 0; k < 40; k++) { - L_result += in_float[k] * in_1_float[k - lambda]; -// L_power += in_1_float[k - lambda] * in_1_float[k - lambda]; - } -// L_result = L_result / L_power; - if (L_result > L_max) { - Nc = lambda; - L_max = L_result; - } - } - state->Nc[state->subframe] = Nc; - if (L_max <= 0.) { - state->bc[state->subframe] = 0; - return; - } - /* Compute the power of the reconstructed short term residual signal dp[..] */ - in_1_float -= Nc; - L_power = 0; - for (k = 0; k < 40; k++) { - float f = in_1_float[k]; - L_power += f * f; - } - if (L_max >= L_power) { //1.0 - state->bc[state->subframe] = 3; - return; - } - /* Coding of the LTP gain - * Table gsm_DLB must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ -// lambda = L_max * 32768.; - lambda = (int)(L_max * 32768. / L_power); - for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break; - state->bc[state->subframe] = bc; -} - -/* - * Here we decode the bc parameter and compute samples of the estimate out[0..39]. - * The decoding of bc needs the gsm_QLB table. - * The long term residual signal e[0..39] is then calculated to be fed to the - * RPE encoding section. - */ -static void longTermAnalysisFilter(int Nc, int bc, short *in, short *in_1, short *out, int *e) -{ - int gain, k, l; - gain = gsm_QLB[bc]; - for (k = 0; k < 40; k++) { - l = (gain * (int)in_1[k - Nc] + 16384) >> 15; - if (l < -32768) l = -32768; - else if (l > 32767) l = 32767; - out[k] = l; - e[k] = in[k] - l; - } -} - -/* - * This procedure uses the bcr and Ncr parameter to realize the - * long term synthesis filtering. The decoding of bcr needs table gsm_QLB. - */ -static void longTermSynthesisFilter(gsm_state * state, int Ncr, int bcr, int *e, short *out) -{ - int k; - int brp, Nr; - - /* Check the limits of Nr. */ - Nr = Ncr < 40 || Ncr > 120 ? state->nrp : Ncr; - state->nrp = Nr; - /* Decoding of the LTP gain bcr */ - brp = gsm_QLB[ bcr ]; - - /* Computation of the reconstructed short term residual - * signal drp[0..39] - */ - for (k = 0; k < 40; k++) { - int temp = (brp * (int)out[ k-Nr ] + 16384) >> 15; - out[k] = e[k] + temp; - } -} - -/* - * This procedure performs long term analysis. - */ -void longTermAnalysis(gsm_state *state, short *in) -{ - short *in_1 = state->dp0 + 120 + state->subframe * 40; - short *out = state->dp0 + 120 + state->subframe * 40; - int *e = state->e + state->subframe * 40; -/* - - int i; - printf("Long-term in: \n"); - for (i=0;i<40;i++) { - printf("%7d ", in[i]); - } - printf("\n"); - */ - longTermLTPCalculation(state, in, in_1); - /* printf("Nc: %d, bc: %d \n", state->Nc[state->subframe], state->bc[state->subframe]); - */ - longTermAnalysisFilter(state->Nc[state->subframe], state->bc[state->subframe], in, in_1, out, e); -/* - printf("Long-term out: \n"); - for (i=0;i<40;i++) { - printf("%7d ", out[i]); - } - printf("\n"); - */ -} - -/* - * This procedure performs long term synthesis. - */ -void longTermSynthesis(gsm_state *state) -{ - int Nc = state->Nc[state->subframe]; - int bc = state->bc[state->subframe]; - int *e = state->e + state->subframe * 40; - short *out = state->dp0 + 120 + state->subframe * 40; - //int i; - longTermSynthesisFilter(state, Nc, bc, e, out); - /* - printf("Long-term reconstructed: \n"); - for (i=0;i<160;i++) { - printf("%7d ", state->dp0[i]); - } - printf("\n"); - */ -} diff --git a/protocols/Tlen/src/codec/gsm_lpc.c b/protocols/Tlen/src/codec/gsm_lpc.c deleted file mode 100644 index 538a03ad92b..00000000000 --- a/protocols/Tlen/src/codec/gsm_lpc.c +++ /dev/null @@ -1,208 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2004-2007 Piotr Piastucki - -This program is based on GSM 06.10 source code developed by -Jutta Degener and Carsten Bormann, -Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, -Technische Universitaet Berlin - -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. - -*/ - -/* LPC- and Reflection Coefficients - * The next two functions calculate linear prediction coefficients - * and/or the related reflection coefficients from the first P_MAX+1 - * values of the autocorrelation function. - */ -#include "gsm.h" /* for P_MAX */ -#include -#include -#include - -/* Compute the autocorrelation - * ,--, - * ac(l) = > x(i) * x(i-l) for all i - * `--' - * for lags l between 0 and lag-1, and x(i) == 0 for i < 0 or i >= n - * @param n: number of samples - * @param lax: max lag (order) - * @param in: [0...n-1] samples x - * @param out: [0...lag-1] autocorrelation - */ -static void autocorrelation(int n, float const *x, int lag, float *ac) -{ - float d; - int i, j; - for (j = 0; j < lag; j++) { - for (i = j, d = 0; i < n; i++) d += x[i] * x[i-j]; - ac[j] = d; - } - d = (float)fabs(ac[0]); - if (d != 0) { - for (j = 0; j < lag; j++) ac[j] /= d; - } -} - -/* The Levinson-Durbin algorithm was invented by N. Levinson in 1947 - * and modified by J. Durbin in 1959. - * @param in: [0...p] autocorrelation values - * @param out: [0...p-1] reflection coefficients - * @param lpc: [0...p-1] LPC coefficients - * @return minimum mean square error - */ -/* -static float levinson_durbin (float const *ac, float *ref, float *lpc) -{ - int i, j; - float r, error = ac[0]; - - if (ac[0] == 0) { - for (i = 0; i < P_MAX; i++) ref[i] = 0; - return 0; - } - - for (i = 0; i < P_MAX; i++) { - - r = -ac[i + 1]; - for (j = 0; j < i; j++) r -= lpc[j] * ac[i - j]; - ref[i] = r /= error; - - // Update LPC coefficients and total error. - lpc[i] = r; - for (j = 0; j < i / 2; j++) { - float tmp = lpc[j]; - lpc[j] = r * lpc[i - 1 - j]; - lpc[i - 1 - j] += r * tmp; - } - if (i % 2) lpc[j] += lpc[j] * r; - - error *= 1 - r * r; - } - return error; -} -*/ -/* I. Schur's recursion from 1917 is related to the Levinson-Durbin method, - * but faster on parallel architectures; where Levinson-Durbin would take time - * proportional to p * log(p), Schur only requires time proportional to p. The - * GSM coder uses an integer version of the Schur recursion. - * @param in: [0...p] autocorrelation values - * @param out: [0...p-1] reflection coefficients - * @return the minimum mean square error - */ -static float schur(float const *ac, float *ref) -{ - int i, m; - float error=ac[0], r, G[2][P_MAX]; - - if (ac[0] == 0.0) { - for (i = 0; i < P_MAX; i++) ref[i] = 0; - return 0; - } - - /* Initialize the rows of the generator matrix G to ac[1...p]. */ - for (i = 0; i < P_MAX; i++) G[0][i] = G[1][i] = ac[i + 1]; - - for (i = 0;;) { - /* Calculate this iteration's reflection coefficient and error. */ - ref[i] = r = -G[1][0] / error; - error += G[1][0] * r; - - if (++i >= P_MAX) return error; - - /* Update the generator matrix. Unlike Levinson-Durbin's summing of - * reflection coefficients, this loop could be executed in parallel - * by p processors in constant time. - */ - for (m = 0; m < P_MAX - i; m++) { - G[1][m] = G[1][m + 1] + r * G[0][m]; - G[0][m] = G[1][m + 1] * r + G[0][m]; - } - } -} - - - /* 0..7 IN/OUT */ -static void rToLAR(int *r) -/* - * The following scaling for r[..] and LAR[..] has been used: - * - * r[..] = integer( real_r[..]*32768. ); -1 <= real_r < 1. - * LAR[..] = integer( real_LAR[..] * 16384 ); - * with -1.625 <= real_LAR <= 1.625 - */ -{ - int temp; - int i; - - /* Computation of the LAR[0..7] from the r[0..7] - */ - for (i = 0; i < 8; i++) { - temp = abs(r[i]); //GSM_ABS(temp); - if (temp < 22118) { - temp >>= 1; - } else if (temp < 31130) { - temp -= 11059; - } else { - temp -= 26112; - temp <<= 2; - } - r[i] = r[i] < 0 ? -temp : temp; - } -} - -static void quantizeLARs(int *LARs, int *qLARs) -{ int qA[]={20480, 20480, 20480, 20480, 13964, 15360, 8534, 9036}; - int qB[]={0, 0, 2048, -2560, 94, -1792, -341, -1144}; - int qMin[]={-32, -32, -16, -16, -8, -8, -4, -4}; - int qMax[]={31, 31, 15, 15, 7, 7, 3, 3}; - int i; - for (i = 0; i < 8; i++) { - int temp; - temp = (((LARs[i] * qA[i]) >> 15) + qB[i] + 256) >> 9; - if (temp < qMin[i]) temp = 0; - else if (temp > qMax[i]) temp = qMax[i] - qMin[i]; - else temp = temp - qMin[i]; - qLARs[i] = temp; - } -} - -void lpcAnalysis(gsm_state *state, short *in) -{ float error; - float samples[160]; - float ac[9]; - float ref[8]; - int i; - int * qLARs = state->qLARs; - for (i = 0; i < 160; i++) { - samples[i] = in[i]; - } - autocorrelation(160, samples, 9, ac); - error=schur(ac, ref); - /* - printf("reff: "); - for (i=0;i<8;i++) { - printf("%5.5f ", ref[i]);//((float)i_lpc[i])/32768.0f); - } - printf("\n"); - */ - for (i = 0; i < 8; i++) { - qLARs[i] = (int) (32768 * ref[i]); - } - rToLAR(qLARs); - quantizeLARs(qLARs, qLARs); -} diff --git a/protocols/Tlen/src/codec/gsm_preprocess.c b/protocols/Tlen/src/codec/gsm_preprocess.c deleted file mode 100644 index 462b8e6c17e..00000000000 --- a/protocols/Tlen/src/codec/gsm_preprocess.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2004-2007 Piotr Piastucki - -This program is based on GSM 06.10 source code developed by -Jutta Degener and Carsten Bormann, -Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, -Technische Universitaet Berlin - -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 "gsm.h" -#include - -/* 4.2.0 .. 4.2.3 PREPROCESSING SECTION - * - * After A-law to linear conversion (or directly from the - * Ato D converter) the following scaling is assumed for - * input to the RPE-LTP algorithm: - * - * - * Where S is the sign bit, v a valid bit, and * a "don't care" bit. - * The original signal is called sop[..] - * - */ - - -void gsm_preprocessing( gsm_state *state, short *in, short *out) -{ - int z1 = state->z1; - int z2 = state->z2; - int mp = state->mp; - int so, s1; - int msp, lsp; - - int k = 160; - - while (k--) { - /* Downscaling of the input signal - * in: 0.1.....................12 - * S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.* - * out: 0.1................... 12 - * S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0 - */ - so = (*in >> 3) << 2; - in++; - /* 4.2.2 Offset compensation - * - * This part implements a high-pass filter and requires extended - * arithmetic precision for the recursive part of this filter. - * The input of this procedure is the array so[0...159] and the - * output the array sof[ 0...159 ]. - */ - /* Compute the non-recursive part - */ - s1 = (so - z1) << 15; - z1 = so; - msp = z2 >> 15; - lsp = z2 - (msp << 15); - s1 += ((lsp * 32735) + 16384) >> 15; - z2 = msp * 32735 + s1; - /* 4.2.3 Preemphasis - */ - msp = (-28180 * mp + 16384) >> 15; - mp = (z2 + 16384) >> 15; - *out++ = mp + msp; - } - state->z1 = z1; - state->z2 = z2; - state->mp = mp; -/* - printf("preprocessed: \n"); - for (k=0;k<160;k++) { - printf("%7d ", out[k]);//((float)i_lpc[i])/32768.0f); - } - printf("\n"); - */ -} - -void gsm_postprocessing( gsm_state *state, short *in, short *out) -{ - int k; - int msr = state->msr; - for (k = 160; k--; in++, out++) { - msr = *in + ((msr * 28180 + 16384) >>15); /* Deemphasis */ - *out = (msr + msr ) & 0xFFF8; /* Truncation & Upscaling */ - } - state->msr = msr; -} diff --git a/protocols/Tlen/src/codec/gsm_rpe.c b/protocols/Tlen/src/codec/gsm_rpe.c deleted file mode 100644 index 21c5419672c..00000000000 --- a/protocols/Tlen/src/codec/gsm_rpe.c +++ /dev/null @@ -1,248 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2004-2007 Piotr Piastucki - -This program is based on GSM 06.10 source code developed by -Jutta Degener and Carsten Bormann, -Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, -Technische Universitaet Berlin - -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 "gsm.h" -#include -#include -#include - -static const int gsm_H[11] = {-134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 }; -static const int gsm_NRFAC[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 }; -static const int gsm_FAC[8] = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 }; -/* - * The coefficients of the weighting filter are stored in the gsm_H table. - * The following scaling is used: - * - * gsm_H[0..10] = integer( real_H[ 0..10] * 8192 ); - */ -static void weightingFilter (int *e, int *x) -{ - int L_result; - int k, i; - for (k = 0; k < 40; k++) { - L_result = 4096; - for (i = 0; i < 11; i++) { - int ix = i + k; - if (ix>4 && ix<45) L_result += e[ix - 5] * gsm_H[i]; - } - L_result >>= 13; - x[k] = (L_result < -32768 ? -32768 : (L_result > 32767 ? 32767 : L_result)); - } -} - -/* - * The signal x[0..39] is used to select the RPE grid which is - * represented by Mc. - */ -static void gridSelection( int *x, int *xM, int *Mc_out) -{ - int m, i; - int L_result, L_temp; - int EM, Mc; - - EM = 0; - Mc = 0; - - for (m = 0; m < 4; m++) { - L_result = 0; - for (i = 0; i < 13; i++) { - int temp = x[m + 3*i] >> 2; - L_temp = temp * temp << 1; - L_result += L_temp; - } - if (L_result > EM) { - Mc = m; - EM = L_result; - } - } - /* Down-sampling by a factor 3 to get the selected xM[0..12] - * RPE sequence. - */ - for (i = 0; i < 13; i ++) xM[i] = x[Mc + 3*i]; - *Mc_out = Mc; -} - -/* - * This procedure computes the reconstructed long term residual signal - * ep[0..39] for the LTP analysis filter. The inputs are the Mc - * which is the grid position selection and the xMp[0..12] decoded - * RPE samples which are upsampled by a factor of 3 by inserting zero - * values. - */ -static void gridPositioning (int Mc, int *xMp, int *ep) -{ - int i, k; - for (k = 0; k < 40; k++) ep[k] = 0; - for (i = 0; i < 13; i++) { - ep[ Mc + (3*i) ] = xMp[i]; - } -} - -static void APCMXmaxcToExpMant (int xmaxc, int *exp_out, int *mant_out ) -{ - int exp, mant; - /* Compute exponent and mantissa of the decoded version of xmaxc - */ - exp = 0; - if (xmaxc > 15) exp = (xmaxc >> 3) - 1; - mant = xmaxc - (exp << 3); - - if (mant == 0) { - exp = -4; - mant = 7; - } - else { - while (mant < 8) { - mant = mant << 1 | 1; - exp--; - } - mant -= 8; - } - - *exp_out = exp; - *mant_out = mant; -} - -static void APCMQuantization (int *xM, int *xMc, int *mant_out, int *exp_out, int *xmaxc_out) -{ - int i, itest; - int xmax, xmaxc, temp, temp1, temp2; - int exp, mant; - - - /* Find the maximum absolute value xmax of xM[0..12]. - */ - - xmax = 0; - for (i = 0; i < 13; i++) { - temp = abs(xM[i]); - if (temp > xmax) xmax = temp; - } - if (xmax > 32767) xmax = 32767; - /* Qantizing and coding of xmax to get xmaxc. - */ - - exp = 0; - temp = xmax >> 9; - itest = 0; - - for (i = 0; i < 6; i++) { - if (temp != 0) exp++; - temp = temp >> 1; - } - - temp = exp + 5; - - xmaxc = (xmax >> temp) + (exp << 3); - - /* Quantizing and coding of the xM[0..12] RPE sequence - * to get the xMc[0..12] - */ - APCMXmaxcToExpMant( xmaxc, &exp, &mant ); - - /* This computation uses the fact that the decoded version of xmaxc - * can be calculated by using the exponent and the mantissa part of - * xmaxc (logarithmic table). - * So, this method avoids any division and uses only a scaling - * of the RPE samples by a function of the exponent. A direct - * multiplication by the inverse of the mantissa (NRFAC[0..7] - * found in table 4.5) gives the 3 bit coded version xMc[0..12] - * of the RPE samples. - */ - - /* Direct computation of xMc[0..12] using table 4.5 - */ - temp = (mant|8)<<(5+exp); - temp1 = 6 - exp; - temp2 = gsm_NRFAC[ mant ]; - for (i = 0; i < 13; i++) { - xMc[i] = ((xM[i] << temp1) * temp2 >> 27) + 4; - } - - /* NOTE: This equation is used to make all the xMc[i] positive. - */ - - *mant_out = mant; - *exp_out = exp; - *xmaxc_out = xmaxc; -} - -static void APCMDequantization (int *xMc, int mant, int exp, int *xMp) -{ - int i, temp1, temp2, temp3; - temp1 = gsm_FAC[ mant ]; - temp2 = 6 - exp; - if (temp2 <= 0) { - temp3 = 1 >> (1 - temp2); - } else { - temp3 = 1 << (temp2 - 1); - } - for (i = 0; i < 13; i++) { - xMp[i] = ((((((xMc[i]<<1)-7)<<12)*temp1+16384)>>15)+temp3)>>temp2; - } -} - -void encodeRPE(gsm_state *state) -{ int x[40]; - int xM[13], xMp[13]; - int mant, exp; - int *Mc = state->Mc + state->subframe; - int *xMaxc = state->xMaxc + state->subframe; - int *xMc = state->xMc + state->subframe * 13; - int *e = state->e + state->subframe * 40; - //int i; - /* - printf("RPE in: \n"); - for (i=0;i<40;i++) { - printf("%7d ", e[i]); - } - printf("\n"); - */ - weightingFilter(e, x); - /* - printf("RPE weighting filter: \n"); - for (i=0;i<40;i++) { - printf("%7d ", x[i]); - } - printf("\n"); - */ - gridSelection(x, xM, Mc); - APCMQuantization(xM, xMc, &mant, &exp, xMaxc); - /* printf("RPE Mc(grid #)=%d xmaxc=%d mant=%d exp=%d \n", *Mc, *xMaxc, mant, exp); */ - APCMDequantization(xMc, mant, exp, xMp); - gridPositioning(*Mc, xMp, e); -} - -void decodeRPE(gsm_state *state) -{ - int exp, mant; - int xMp[ 13 ]; - int *xMc = state->xMc + state->subframe * 13; - int *e = state->e + state->subframe * 40; - - APCMXmaxcToExpMant(state->xMaxc[state->subframe], &exp, &mant); - APCMDequantization(xMc, mant, exp, xMp); - gridPositioning(state->Mc[state->subframe], xMp, e); -} diff --git a/protocols/Tlen/src/codec/gsm_short.c b/protocols/Tlen/src/codec/gsm_short.c deleted file mode 100644 index 4b02515a726..00000000000 --- a/protocols/Tlen/src/codec/gsm_short.c +++ /dev/null @@ -1,211 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2004-2007 Piotr Piastucki - -This program is based on GSM 06.10 source code developed by -Jutta Degener and Carsten Bormann, -Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, -Technische Universitaet Berlin - -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 "gsm.h" -#include -#include -#include -extern void lpcAnalysis(gsm_state *state, short *in); - -/* - * Dequantize LAR coefficients - */ -static void dequantizeLARs(int *qLARs, int *LARs) -{ - int dqA[]={13107, 13107, 13107, 13107, 19223, 17476, 31454, 29708}; - int dqB[]={0, 0, 2048, -2560, 94, -1792, -341, -1144}; - int dqMin[]={-32, -32, -16, -16, -8, -8, -4, -4}; - int i; - for (i = 0; i < 8; i++) { - int temp; - temp = ((((qLARs[i] + dqMin[i]) << 10) - (dqB[i] << 1)) * dqA[i] + 16384) >> 15; - LARs[i] = temp + temp; - } -} -/* - * Interpolate LAR coefficients (samples 0..12) - */ -static void interpolateLARs_0_12 (int *LARpp_j_1, int *LARpp_j, int *LARp) -{ int i; - for (i = 0; i < 8; i++) { - LARp[i] = (LARpp_j_1[i] >> 1) + (LARpp_j_1[i] >> 2) + (LARpp_j[i] >> 2); - } -} -/* - * Interpolate LAR coefficients (samples 13..26) - */ -static void interpolateLARs_13_26 (int *LARpp_j_1, int *LARpp_j, int *LARp) -{ int i; - for (i = 0; i < 8; i++) { - LARp[i] = (LARpp_j_1[i] >> 1) + (LARpp_j[i] >> 1); - } -} -/* - * Interpolate LAR coefficients (samples 27..39) - */ -static void interpolateLARs_27_39 (int *LARpp_j_1, int *LARpp_j, int *LARp) -{ int i; - for (i = 0; i < 8; i++) { - LARp[i] = (LARpp_j[i] >> 1) + (LARpp_j_1[i] >> 2) + (LARpp_j[i] >> 2); - } -} -/* - * Interpolate LAR coefficients (samples 40..159) - */ -static void interpolateLARs_40_159 (int *LARpp_j_1, int *LARpp_j, int *LARp) -{ int i; - for (i = 0; i < 8; i++) { - LARp[i] = LARpp_j[i]; - } -} -/* - * Convert LAR coefficients to reflection coefficients - */ -static void LARToR( int * LARp) -{ - int i; - int temp; - for (i = 0; i < 8; i++) { - temp = abs(LARp[i]); - if (temp < 11059) temp <<= 1; - else if (temp < 20070) temp += 11059; - else temp = (temp >> 2) + 26112; - LARp[i] = LARp[i] < 0 ? -temp : temp; - } -} - -/* - * This procedure computes the short term residual signal d[..] to be fed - * to the RPE-LTP loop from the s[..] signal and from the local rp[..] - * array (quantized reflection coefficients). As the call of this - * procedure can be done in many ways (see the interpolation of the LAR - * coefficient), it is assumed that the computation begins with index - * k_start (for arrays d[..] and s[..]) and stops with index k_end - * (k_start and k_end are defined in 4.2.9.1). This procedure also - * needs to keep the array u[0..7] in memory for each call. - */ -static void shortTermAnalysisFilter (gsm_state * state, int * rp, int len, short * in) -{ - int * u = state->u; - int i; - int di, ui, sav, rpi; - for (; len--; in++) { - di = sav = *in; - for (i = 0; i < 8; i++) { - ui = u[i]; - rpi = rp[i]; - u[i] = sav; - sav = ui + ((rpi * di + 16384) >> 15); - di = di + ((rpi * ui + 16384) >> 15); - } - *in = di; - } -} - -static void shortTermSynthesisFilter(gsm_state * state, int * rrp, int len, short * in, short *out) -{ - int * v = state->v; - int i; - int sri; - for (; len--; in++, out++) { - sri = *in; - for (i = 8; i--;) { - sri -= (rrp[i] * v[i] + 16384) >> 15; - if (sri < -32768) sri = -32768; - else if (sri > 32767) sri = 32767; - v[i+1] = v[i] + ((rrp[i] * sri + 16384) >> 15); - if (v[i+1] < -32768) v[i+1] = -32768; - else if (v[i+1] > 32767) v[i+1] = 32767; - } - *out = v[0] = sri; - } -} - -void shortTermAnalysis(gsm_state *state, short *in) -{ - int * qLARs = state->qLARs; - int * LARpp_j = state->LARpp[state->j]; - int * LARpp_j_1 = state->LARpp[state->j ^1]; - int LARp[8]; -// int i; - - lpcAnalysis(state, in);//i_samples); -/* - printf("short term in: \n"); - for (i=0;i<160;i++) { - printf("%7d ", in[i]);//((float)i_lpc[i])/32768.0f); - } - printf("\n"); - */ - dequantizeLARs(qLARs, LARpp_j); - interpolateLARs_0_12(LARpp_j_1, LARpp_j, LARp); - LARToR(LARp); - shortTermAnalysisFilter(state, LARp, 13, in); - interpolateLARs_13_26(LARpp_j_1, LARpp_j, LARp); - LARToR(LARp); - shortTermAnalysisFilter(state, LARp, 14, in+13); - interpolateLARs_27_39(LARpp_j_1, LARpp_j, LARp); - LARToR(LARp); - shortTermAnalysisFilter(state, LARp, 13, in+27); - interpolateLARs_40_159(LARpp_j_1, LARpp_j, LARp); - LARToR(LARp); - shortTermAnalysisFilter(state, LARp, 120, in+40); - /* - printf("short-term residuals: \n"); - for (i=0;i<160;i++) { - printf("%7d ", in[i]);//((float)i_lpc[i])/32768.0f); - } - printf("\n"); - */ -} - -void shortTermSynthesis(gsm_state *state, short *in, short *out) -{ - int * qLARs = state->qLARs; - int * LARpp_j = state->LARpp[state->j]; - int * LARpp_j_1 = state->LARpp[state->j ^1]; - int LARp[8]; -// int i; - - dequantizeLARs(qLARs, LARpp_j); - interpolateLARs_0_12(LARpp_j_1, LARpp_j, LARp); - LARToR(LARp); - shortTermSynthesisFilter(state, LARp, 13, in, out); - interpolateLARs_13_26(LARpp_j_1, LARpp_j, LARp); - LARToR(LARp); - shortTermSynthesisFilter(state, LARp, 14, in+13, out+13); - interpolateLARs_27_39(LARpp_j_1, LARpp_j, LARp); - LARToR(LARp); - shortTermSynthesisFilter(state, LARp, 13, in+27, out+27); - interpolateLARs_40_159(LARpp_j_1, LARpp_j, LARp); - LARToR(LARp); - shortTermSynthesisFilter(state, LARp, 120, in+40, out+40); - /* - printf("samples[reconstructed]: \n"); - for (i=0;i<160;i++) { - printf("%7d ", out[i]); - } - */ -} diff --git a/protocols/Tlen/src/commons.h b/protocols/Tlen/src/commons.h deleted file mode 100644 index 37f81198e31..00000000000 --- a/protocols/Tlen/src/commons.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _TLENCOMMONS_INC -#define _TLENCOMMONS_INC - -#include "version.h" - -#endif //ifndef _TLENCOMMONS_INC diff --git a/protocols/Tlen/src/crypto/aes.c b/protocols/Tlen/src/crypto/aes.c deleted file mode 100644 index 7bccdf93a10..00000000000 --- a/protocols/Tlen/src/crypto/aes.c +++ /dev/null @@ -1,1336 +0,0 @@ -/* - * FIPS-197 compliant AES implementation - * - * Copyright (C) 2006-2010, Brainspark B.V. - * - * This file is part of PolarSSL (http://www.polarssl.org) - * Lead Maintainer: Paul Bakker - * - * All rights reserved. - * - * 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ -/* - * The AES block cipher was designed by Vincent Rijmen and Joan Daemen. - * - * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf - * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf - */ - -#include "polarssl/config.h" - -#if defined(POLARSSL_AES_C) - -#include "polarssl/aes.h" -#include "polarssl/padlock.h" - -/* - * 32-bit integer manipulation macros (little endian) - */ -#ifndef GET_ULONG_LE -#define GET_ULONG_LE(n,b,i) \ -{ \ - (n) = ( (unsigned long) (b)[(i) ] ) \ - | ( (unsigned long) (b)[(i) + 1] << 8 ) \ - | ( (unsigned long) (b)[(i) + 2] << 16 ) \ - | ( (unsigned long) (b)[(i) + 3] << 24 ); \ -} -#endif - -#ifndef PUT_ULONG_LE -#define PUT_ULONG_LE(n,b,i) \ -{ \ - (b)[(i) ] = (unsigned char) ( (n) ); \ - (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \ - (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \ - (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \ -} -#endif - -#if defined(POLARSSL_AES_ROM_TABLES) -/* - * Forward S-box - */ -static const unsigned char FSb[256] = -{ - 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, - 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, - 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, - 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, - 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, - 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, - 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, - 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, - 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, - 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, - 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, - 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, - 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, - 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, - 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, - 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, - 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, - 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, - 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, - 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, - 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, - 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, - 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, - 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, - 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, - 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, - 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, - 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, - 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, - 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, - 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, - 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 -}; - -/* - * Forward tables - */ -#define FT \ -\ - V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \ - V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \ - V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \ - V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \ - V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \ - V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \ - V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \ - V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \ - V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \ - V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \ - V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \ - V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \ - V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \ - V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \ - V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \ - V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \ - V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \ - V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \ - V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \ - V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \ - V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \ - V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \ - V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \ - V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \ - V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \ - V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \ - V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \ - V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \ - V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \ - V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \ - V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \ - V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \ - V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \ - V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \ - V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \ - V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \ - V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \ - V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \ - V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \ - V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \ - V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \ - V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \ - V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \ - V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \ - V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \ - V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \ - V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \ - V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \ - V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \ - V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \ - V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \ - V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \ - V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \ - V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \ - V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \ - V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \ - V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \ - V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \ - V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \ - V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \ - V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \ - V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \ - V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \ - V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C) - -#define V(a,b,c,d) 0x##a##b##c##d -static const unsigned long FT0[256] = { FT }; -#undef V - -#define V(a,b,c,d) 0x##b##c##d##a -static const unsigned long FT1[256] = { FT }; -#undef V - -#define V(a,b,c,d) 0x##c##d##a##b -static const unsigned long FT2[256] = { FT }; -#undef V - -#define V(a,b,c,d) 0x##d##a##b##c -static const unsigned long FT3[256] = { FT }; -#undef V - -#undef FT - -/* - * Reverse S-box - */ -static const unsigned char RSb[256] = -{ - 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, - 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, - 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, - 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, - 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, - 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, - 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, - 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, - 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, - 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, - 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, - 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, - 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, - 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, - 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, - 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, - 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, - 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, - 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, - 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, - 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, - 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, - 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, - 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, - 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, - 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, - 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, - 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, - 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, - 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, - 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D -}; - -/* - * Reverse tables - */ -#define RT \ -\ - V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \ - V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \ - V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \ - V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \ - V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \ - V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \ - V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \ - V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \ - V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \ - V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \ - V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \ - V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \ - V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \ - V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \ - V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \ - V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \ - V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \ - V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \ - V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \ - V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \ - V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \ - V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \ - V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \ - V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \ - V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \ - V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \ - V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \ - V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \ - V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \ - V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \ - V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \ - V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \ - V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \ - V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \ - V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \ - V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \ - V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \ - V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \ - V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \ - V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \ - V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \ - V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \ - V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \ - V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \ - V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \ - V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \ - V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \ - V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \ - V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \ - V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \ - V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \ - V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \ - V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \ - V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \ - V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \ - V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \ - V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \ - V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \ - V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \ - V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \ - V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \ - V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \ - V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \ - V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0) - -#define V(a,b,c,d) 0x##a##b##c##d -static const unsigned long RT0[256] = { RT }; -#undef V - -#define V(a,b,c,d) 0x##b##c##d##a -static const unsigned long RT1[256] = { RT }; -#undef V - -#define V(a,b,c,d) 0x##c##d##a##b -static const unsigned long RT2[256] = { RT }; -#undef V - -#define V(a,b,c,d) 0x##d##a##b##c -static const unsigned long RT3[256] = { RT }; -#undef V - -#undef RT - -/* - * Round constants - */ -static const unsigned long RCON[10] = -{ - 0x00000001, 0x00000002, 0x00000004, 0x00000008, - 0x00000010, 0x00000020, 0x00000040, 0x00000080, - 0x0000001B, 0x00000036 -}; - -#else - -/* - * Forward S-box & tables - */ -static unsigned char FSb[256]; -static unsigned long FT0[256]; -static unsigned long FT1[256]; -static unsigned long FT2[256]; -static unsigned long FT3[256]; - -/* - * Reverse S-box & tables - */ -static unsigned char RSb[256]; -static unsigned long RT0[256]; -static unsigned long RT1[256]; -static unsigned long RT2[256]; -static unsigned long RT3[256]; - -/* - * Round constants - */ -static unsigned long RCON[10]; - -/* - * Tables generation code - */ -#define ROTL8(x) ( ( x << 8 ) & 0xFFFFFFFF ) | ( x >> 24 ) -#define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) ) -#define MUL(x,y) ( ( x && y ) ? pow[(log[x]+log[y]) % 255] : 0 ) - -static int aes_init_done = 0; - -static void aes_gen_tables( void ) -{ - int i, x, y, z; - int pow[256]; - int log[256]; - - /* - * compute pow and log tables over GF(2^8) - */ - for( i = 0, x = 1; i < 256; i++ ) - { - pow[i] = x; - log[x] = i; - x = ( x ^ XTIME( x ) ) & 0xFF; - } - - /* - * calculate the round constants - */ - for( i = 0, x = 1; i < 10; i++ ) - { - RCON[i] = (unsigned long) x; - x = XTIME( x ) & 0xFF; - } - - /* - * generate the forward and reverse S-boxes - */ - FSb[0x00] = 0x63; - RSb[0x63] = 0x00; - - for( i = 1; i < 256; i++ ) - { - x = pow[255 - log[i]]; - - y = x; y = ( (y << 1) | (y >> 7) ) & 0xFF; - x ^= y; y = ( (y << 1) | (y >> 7) ) & 0xFF; - x ^= y; y = ( (y << 1) | (y >> 7) ) & 0xFF; - x ^= y; y = ( (y << 1) | (y >> 7) ) & 0xFF; - x ^= y ^ 0x63; - - FSb[i] = (unsigned char) x; - RSb[x] = (unsigned char) i; - } - - /* - * generate the forward and reverse tables - */ - for( i = 0; i < 256; i++ ) - { - x = FSb[i]; - y = XTIME( x ) & 0xFF; - z = ( y ^ x ) & 0xFF; - - FT0[i] = ( (unsigned long) y ) ^ - ( (unsigned long) x << 8 ) ^ - ( (unsigned long) x << 16 ) ^ - ( (unsigned long) z << 24 ); - - FT1[i] = ROTL8( FT0[i] ); - FT2[i] = ROTL8( FT1[i] ); - FT3[i] = ROTL8( FT2[i] ); - - x = RSb[i]; - - RT0[i] = ( (unsigned long) MUL( 0x0E, x ) ) ^ - ( (unsigned long) MUL( 0x09, x ) << 8 ) ^ - ( (unsigned long) MUL( 0x0D, x ) << 16 ) ^ - ( (unsigned long) MUL( 0x0B, x ) << 24 ); - - RT1[i] = ROTL8( RT0[i] ); - RT2[i] = ROTL8( RT1[i] ); - RT3[i] = ROTL8( RT2[i] ); - } -} - -#endif - -/* - * AES key schedule (encryption) - */ -int aes_setkey_enc( aes_context *ctx, const unsigned char *key, unsigned int keysize ) -{ - unsigned int i; - unsigned long *RK; - -#if !defined(POLARSSL_AES_ROM_TABLES) - if( aes_init_done == 0 ) - { - aes_gen_tables(); - aes_init_done = 1; - } -#endif - - switch( keysize ) - { - case 128: ctx->nr = 10; break; - case 192: ctx->nr = 12; break; - case 256: ctx->nr = 14; break; - default : return( POLARSSL_ERR_AES_INVALID_KEY_LENGTH ); - } - -#if defined(PADLOCK_ALIGN16) - ctx->rk = RK = PADLOCK_ALIGN16( ctx->buf ); -#else - ctx->rk = RK = ctx->buf; -#endif - - for( i = 0; i < (keysize >> 5); i++ ) - { - GET_ULONG_LE( RK[i], key, i << 2 ); - } - - switch( ctx->nr ) - { - case 10: - - for( i = 0; i < 10; i++, RK += 4 ) - { - RK[4] = RK[0] ^ RCON[i] ^ - ( (unsigned long) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^ - ( (unsigned long) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^ - ( (unsigned long) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^ - ( (unsigned long) FSb[ ( RK[3] ) & 0xFF ] << 24 ); - - RK[5] = RK[1] ^ RK[4]; - RK[6] = RK[2] ^ RK[5]; - RK[7] = RK[3] ^ RK[6]; - } - break; - - case 12: - - for( i = 0; i < 8; i++, RK += 6 ) - { - RK[6] = RK[0] ^ RCON[i] ^ - ( (unsigned long) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^ - ( (unsigned long) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^ - ( (unsigned long) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^ - ( (unsigned long) FSb[ ( RK[5] ) & 0xFF ] << 24 ); - - RK[7] = RK[1] ^ RK[6]; - RK[8] = RK[2] ^ RK[7]; - RK[9] = RK[3] ^ RK[8]; - RK[10] = RK[4] ^ RK[9]; - RK[11] = RK[5] ^ RK[10]; - } - break; - - case 14: - - for( i = 0; i < 7; i++, RK += 8 ) - { - RK[8] = RK[0] ^ RCON[i] ^ - ( (unsigned long) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^ - ( (unsigned long) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^ - ( (unsigned long) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^ - ( (unsigned long) FSb[ ( RK[7] ) & 0xFF ] << 24 ); - - RK[9] = RK[1] ^ RK[8]; - RK[10] = RK[2] ^ RK[9]; - RK[11] = RK[3] ^ RK[10]; - - RK[12] = RK[4] ^ - ( (unsigned long) FSb[ ( RK[11] ) & 0xFF ] ) ^ - ( (unsigned long) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^ - ( (unsigned long) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^ - ( (unsigned long) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 ); - - RK[13] = RK[5] ^ RK[12]; - RK[14] = RK[6] ^ RK[13]; - RK[15] = RK[7] ^ RK[14]; - } - break; - - default: - - break; - } - - return( 0 ); -} - -/* - * AES key schedule (decryption) - */ -int aes_setkey_dec( aes_context *ctx, const unsigned char *key, unsigned int keysize ) -{ - int i, j; - aes_context cty; - unsigned long *RK; - unsigned long *SK; - int ret; - - switch( keysize ) - { - case 128: ctx->nr = 10; break; - case 192: ctx->nr = 12; break; - case 256: ctx->nr = 14; break; - default : return( POLARSSL_ERR_AES_INVALID_KEY_LENGTH ); - } - -#if defined(PADLOCK_ALIGN16) - ctx->rk = RK = PADLOCK_ALIGN16( ctx->buf ); -#else - ctx->rk = RK = ctx->buf; -#endif - - ret = aes_setkey_enc( &cty, key, keysize ); - if( ret != 0 ) - return( ret ); - - SK = cty.rk + cty.nr * 4; - - *RK++ = *SK++; - *RK++ = *SK++; - *RK++ = *SK++; - *RK++ = *SK++; - - for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 ) - { - for( j = 0; j < 4; j++, SK++ ) - { - *RK++ = RT0[ FSb[ ( *SK ) & 0xFF ] ] ^ - RT1[ FSb[ ( *SK >> 8 ) & 0xFF ] ] ^ - RT2[ FSb[ ( *SK >> 16 ) & 0xFF ] ] ^ - RT3[ FSb[ ( *SK >> 24 ) & 0xFF ] ]; - } - } - - *RK++ = *SK++; - *RK++ = *SK++; - *RK++ = *SK++; - *RK++ = *SK++; - - memset( &cty, 0, sizeof( aes_context ) ); - - return( 0 ); -} - -#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ -{ \ - X0 = *RK++ ^ FT0[ ( Y0 ) & 0xFF ] ^ \ - FT1[ ( Y1 >> 8 ) & 0xFF ] ^ \ - FT2[ ( Y2 >> 16 ) & 0xFF ] ^ \ - FT3[ ( Y3 >> 24 ) & 0xFF ]; \ - \ - X1 = *RK++ ^ FT0[ ( Y1 ) & 0xFF ] ^ \ - FT1[ ( Y2 >> 8 ) & 0xFF ] ^ \ - FT2[ ( Y3 >> 16 ) & 0xFF ] ^ \ - FT3[ ( Y0 >> 24 ) & 0xFF ]; \ - \ - X2 = *RK++ ^ FT0[ ( Y2 ) & 0xFF ] ^ \ - FT1[ ( Y3 >> 8 ) & 0xFF ] ^ \ - FT2[ ( Y0 >> 16 ) & 0xFF ] ^ \ - FT3[ ( Y1 >> 24 ) & 0xFF ]; \ - \ - X3 = *RK++ ^ FT0[ ( Y3 ) & 0xFF ] ^ \ - FT1[ ( Y0 >> 8 ) & 0xFF ] ^ \ - FT2[ ( Y1 >> 16 ) & 0xFF ] ^ \ - FT3[ ( Y2 >> 24 ) & 0xFF ]; \ -} - -#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ -{ \ - X0 = *RK++ ^ RT0[ ( Y0 ) & 0xFF ] ^ \ - RT1[ ( Y3 >> 8 ) & 0xFF ] ^ \ - RT2[ ( Y2 >> 16 ) & 0xFF ] ^ \ - RT3[ ( Y1 >> 24 ) & 0xFF ]; \ - \ - X1 = *RK++ ^ RT0[ ( Y1 ) & 0xFF ] ^ \ - RT1[ ( Y0 >> 8 ) & 0xFF ] ^ \ - RT2[ ( Y3 >> 16 ) & 0xFF ] ^ \ - RT3[ ( Y2 >> 24 ) & 0xFF ]; \ - \ - X2 = *RK++ ^ RT0[ ( Y2 ) & 0xFF ] ^ \ - RT1[ ( Y1 >> 8 ) & 0xFF ] ^ \ - RT2[ ( Y0 >> 16 ) & 0xFF ] ^ \ - RT3[ ( Y3 >> 24 ) & 0xFF ]; \ - \ - X3 = *RK++ ^ RT0[ ( Y3 ) & 0xFF ] ^ \ - RT1[ ( Y2 >> 8 ) & 0xFF ] ^ \ - RT2[ ( Y1 >> 16 ) & 0xFF ] ^ \ - RT3[ ( Y0 >> 24 ) & 0xFF ]; \ -} - -/* - * AES-ECB block encryption/decryption - */ -int aes_crypt_ecb( aes_context *ctx, - int mode, - const unsigned char input[16], - unsigned char output[16] ) -{ - int i; - unsigned long *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3; - -#if defined(POLARSSL_PADLOCK_C) && defined(POLARSSL_HAVE_X86) - if( padlock_supports( PADLOCK_ACE ) ) - { - if( padlock_xcryptecb( ctx, mode, input, output ) == 0 ) - return( 0 ); - - // If padlock data misaligned, we just fall back to - // unaccelerated mode - // - } -#endif - - RK = ctx->rk; - - GET_ULONG_LE( X0, input, 0 ); X0 ^= *RK++; - GET_ULONG_LE( X1, input, 4 ); X1 ^= *RK++; - GET_ULONG_LE( X2, input, 8 ); X2 ^= *RK++; - GET_ULONG_LE( X3, input, 12 ); X3 ^= *RK++; - - if( mode == AES_DECRYPT ) - { - for( i = (ctx->nr >> 1) - 1; i > 0; i-- ) - { - AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); - AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); - } - - AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); - - X0 = *RK++ ^ \ - ( (unsigned long) RSb[ ( Y0 ) & 0xFF ] ) ^ - ( (unsigned long) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^ - ( (unsigned long) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^ - ( (unsigned long) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 ); - - X1 = *RK++ ^ \ - ( (unsigned long) RSb[ ( Y1 ) & 0xFF ] ) ^ - ( (unsigned long) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^ - ( (unsigned long) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^ - ( (unsigned long) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 ); - - X2 = *RK++ ^ \ - ( (unsigned long) RSb[ ( Y2 ) & 0xFF ] ) ^ - ( (unsigned long) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^ - ( (unsigned long) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^ - ( (unsigned long) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 ); - - X3 = *RK++ ^ \ - ( (unsigned long) RSb[ ( Y3 ) & 0xFF ] ) ^ - ( (unsigned long) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^ - ( (unsigned long) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^ - ( (unsigned long) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 ); - } - else /* AES_ENCRYPT */ - { - for( i = (ctx->nr >> 1) - 1; i > 0; i-- ) - { - AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); - AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); - } - - AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); - - X0 = *RK++ ^ \ - ( (unsigned long) FSb[ ( Y0 ) & 0xFF ] ) ^ - ( (unsigned long) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^ - ( (unsigned long) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^ - ( (unsigned long) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 ); - - X1 = *RK++ ^ \ - ( (unsigned long) FSb[ ( Y1 ) & 0xFF ] ) ^ - ( (unsigned long) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^ - ( (unsigned long) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^ - ( (unsigned long) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 ); - - X2 = *RK++ ^ \ - ( (unsigned long) FSb[ ( Y2 ) & 0xFF ] ) ^ - ( (unsigned long) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^ - ( (unsigned long) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^ - ( (unsigned long) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 ); - - X3 = *RK++ ^ \ - ( (unsigned long) FSb[ ( Y3 ) & 0xFF ] ) ^ - ( (unsigned long) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^ - ( (unsigned long) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^ - ( (unsigned long) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 ); - } - - PUT_ULONG_LE( X0, output, 0 ); - PUT_ULONG_LE( X1, output, 4 ); - PUT_ULONG_LE( X2, output, 8 ); - PUT_ULONG_LE( X3, output, 12 ); - - return( 0 ); -} - -/* - * AES-CBC buffer encryption/decryption - */ -int aes_crypt_cbc( aes_context *ctx, - int mode, - size_t length, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ) -{ - int i; - unsigned char temp[16]; - - if( length % 16 ) - return( POLARSSL_ERR_AES_INVALID_INPUT_LENGTH ); - -#if defined(POLARSSL_PADLOCK_C) && defined(POLARSSL_HAVE_X86) - if( padlock_supports( PADLOCK_ACE ) ) - { - if( padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 ) - return( 0 ); - - // If padlock data misaligned, we just fall back to - // unaccelerated mode - // - } -#endif - - if( mode == AES_DECRYPT ) - { - while( length > 0 ) - { - memcpy( temp, input, 16 ); - aes_crypt_ecb( ctx, mode, input, output ); - - for( i = 0; i < 16; i++ ) - output[i] = (unsigned char)( output[i] ^ iv[i] ); - - memcpy( iv, temp, 16 ); - - input += 16; - output += 16; - length -= 16; - } - } - else - { - while( length > 0 ) - { - for( i = 0; i < 16; i++ ) - output[i] = (unsigned char)( input[i] ^ iv[i] ); - - aes_crypt_ecb( ctx, mode, output, output ); - memcpy( iv, output, 16 ); - - input += 16; - output += 16; - length -= 16; - } - } - - return( 0 ); -} - -#if defined(POLARSSL_CIPHER_MODE_CFB) -/* - * AES-CFB128 buffer encryption/decryption - */ -int aes_crypt_cfb128( aes_context *ctx, - int mode, - size_t length, - size_t *iv_off, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ) -{ - int c; - size_t n = *iv_off; - - if( mode == AES_DECRYPT ) - { - while( length-- ) - { - if( n == 0 ) - aes_crypt_ecb( ctx, AES_ENCRYPT, iv, iv ); - - c = *input++; - *output++ = (unsigned char)( c ^ iv[n] ); - iv[n] = (unsigned char) c; - - n = (n + 1) & 0x0F; - } - } - else - { - while( length-- ) - { - if( n == 0 ) - aes_crypt_ecb( ctx, AES_ENCRYPT, iv, iv ); - - iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ ); - - n = (n + 1) & 0x0F; - } - } - - *iv_off = n; - - return( 0 ); -} -#endif /*POLARSSL_CIPHER_MODE_CFB */ - -#if defined(POLARSSL_CIPHER_MODE_CTR) -/* - * AES-CTR buffer encryption/decryption - */ -int aes_crypt_ctr( aes_context *ctx, - size_t length, - size_t *nc_off, - unsigned char nonce_counter[16], - unsigned char stream_block[16], - const unsigned char *input, - unsigned char *output ) -{ - int c, i, cb; - size_t n = *nc_off; - - while( length-- ) - { - if( n == 0 ) { - aes_crypt_ecb( ctx, AES_ENCRYPT, nonce_counter, stream_block ); - - i = 15; - do { - nonce_counter[i]++; - cb = nonce_counter[i] == 0; - } while( i-- && cb ); - - } - c = *input++; - *output++ = (unsigned char)( c ^ stream_block[n] ); - - n = (n + 1) & 0x0F; - } - - *nc_off = n; - - return( 0 ); -} -#endif /* POLARSSL_CIPHER_MODE_CTR */ - -#if defined(POLARSSL_SELF_TEST) - -#include - -/* - * AES test vectors from: - * - * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip - */ -static const unsigned char aes_test_ecb_dec[3][16] = -{ - { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58, - 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 }, - { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2, - 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 }, - { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D, - 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE } -}; - -static const unsigned char aes_test_ecb_enc[3][16] = -{ - { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73, - 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F }, - { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11, - 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 }, - { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D, - 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 } -}; - -static const unsigned char aes_test_cbc_dec[3][16] = -{ - { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73, - 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 }, - { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75, - 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B }, - { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75, - 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 } -}; - -static const unsigned char aes_test_cbc_enc[3][16] = -{ - { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84, - 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D }, - { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB, - 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 }, - { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5, - 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 } -}; - -#if defined(POLARSSL_CIPHER_MODE_CFB) -/* - * AES-CFB128 test vectors from: - * - * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf - */ -static const unsigned char aes_test_cfb128_key[3][32] = -{ - { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, - 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }, - { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52, - 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5, - 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }, - { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE, - 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81, - 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7, - 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 } -}; - -static const unsigned char aes_test_cfb128_iv[16] = -{ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F -}; - -static const unsigned char aes_test_cfb128_pt[64] = -{ - 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, - 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A, - 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C, - 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51, - 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11, - 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF, - 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17, - 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10 -}; - -static const unsigned char aes_test_cfb128_ct[3][64] = -{ - { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20, - 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A, - 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F, - 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B, - 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40, - 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF, - 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E, - 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 }, - { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB, - 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74, - 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21, - 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A, - 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1, - 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9, - 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0, - 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF }, - { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B, - 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60, - 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8, - 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B, - 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92, - 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9, - 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8, - 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 } -}; -#endif /* POLARSSL_CIPHER_MODE_CFB */ - -#if defined(POLARSSL_CIPHER_MODE_CTR) -/* - * AES-CTR test vectors from: - * - * http://www.faqs.org/rfcs/rfc3686.html - */ - -static const unsigned char aes_test_ctr_key[3][16] = -{ - { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC, - 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E }, - { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7, - 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 }, - { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8, - 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC } -}; - -static const unsigned char aes_test_ctr_nonce_counter[3][16] = -{ - { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, - { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59, - 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 }, - { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F, - 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 } -}; - -static const unsigned char aes_test_ctr_pt[3][48] = -{ - { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62, - 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 }, - - { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F }, - - { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, - 0x20, 0x21, 0x22, 0x23 } -}; - -static const unsigned char aes_test_ctr_ct[3][48] = -{ - { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79, - 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 }, - { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9, - 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88, - 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8, - 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 }, - { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9, - 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7, - 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36, - 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53, - 0x25, 0xB2, 0x07, 0x2F } -}; - -static const int aes_test_ctr_len[3] = - { 16, 32, 36 }; -#endif /* POLARSSL_CIPHER_MODE_CTR */ - -/* - * Checkup routine - */ -int aes_self_test( int verbose ) -{ - int i, j, u, v; - unsigned char key[32]; - unsigned char buf[64]; - unsigned char prv[16]; - unsigned char iv[16]; -#if defined(POLARSSL_CIPHER_MODE_CTR) || defined(POLARSSL_CIPHER_MODE_CFB) - size_t offset; -#endif -#if defined(POLARSSL_CIPHER_MODE_CTR) - int len; - unsigned char nonce_counter[16]; - unsigned char stream_block[16]; -#endif - aes_context ctx; - - memset( key, 0, 32 ); - - /* - * ECB mode - */ - for( i = 0; i < 6; i++ ) - { - u = i >> 1; - v = i & 1; - - if( verbose != 0 ) - printf( " AES-ECB-%3d (%s): ", 128 + u * 64, - ( v == AES_DECRYPT ) ? "dec" : "enc" ); - - memset( buf, 0, 16 ); - - if( v == AES_DECRYPT ) - { - aes_setkey_dec( &ctx, key, 128 + u * 64 ); - - for( j = 0; j < 10000; j++ ) - aes_crypt_ecb( &ctx, v, buf, buf ); - - if( memcmp( buf, aes_test_ecb_dec[u], 16 ) != 0 ) - { - if( verbose != 0 ) - printf( "failed\n" ); - - return( 1 ); - } - } - else - { - aes_setkey_enc( &ctx, key, 128 + u * 64 ); - - for( j = 0; j < 10000; j++ ) - aes_crypt_ecb( &ctx, v, buf, buf ); - - if( memcmp( buf, aes_test_ecb_enc[u], 16 ) != 0 ) - { - if( verbose != 0 ) - printf( "failed\n" ); - - return( 1 ); - } - } - - if( verbose != 0 ) - printf( "passed\n" ); - } - - if( verbose != 0 ) - printf( "\n" ); - - /* - * CBC mode - */ - for( i = 0; i < 6; i++ ) - { - u = i >> 1; - v = i & 1; - - if( verbose != 0 ) - printf( " AES-CBC-%3d (%s): ", 128 + u * 64, - ( v == AES_DECRYPT ) ? "dec" : "enc" ); - - memset( iv , 0, 16 ); - memset( prv, 0, 16 ); - memset( buf, 0, 16 ); - - if( v == AES_DECRYPT ) - { - aes_setkey_dec( &ctx, key, 128 + u * 64 ); - - for( j = 0; j < 10000; j++ ) - aes_crypt_cbc( &ctx, v, 16, iv, buf, buf ); - - if( memcmp( buf, aes_test_cbc_dec[u], 16 ) != 0 ) - { - if( verbose != 0 ) - printf( "failed\n" ); - - return( 1 ); - } - } - else - { - aes_setkey_enc( &ctx, key, 128 + u * 64 ); - - for( j = 0; j < 10000; j++ ) - { - unsigned char tmp[16]; - - aes_crypt_cbc( &ctx, v, 16, iv, buf, buf ); - - memcpy( tmp, prv, 16 ); - memcpy( prv, buf, 16 ); - memcpy( buf, tmp, 16 ); - } - - if( memcmp( prv, aes_test_cbc_enc[u], 16 ) != 0 ) - { - if( verbose != 0 ) - printf( "failed\n" ); - - return( 1 ); - } - } - - if( verbose != 0 ) - printf( "passed\n" ); - } - - if( verbose != 0 ) - printf( "\n" ); - -#if defined(POLARSSL_CIPHER_MODE_CFB) - /* - * CFB128 mode - */ - for( i = 0; i < 6; i++ ) - { - u = i >> 1; - v = i & 1; - - if( verbose != 0 ) - printf( " AES-CFB128-%3d (%s): ", 128 + u * 64, - ( v == AES_DECRYPT ) ? "dec" : "enc" ); - - memcpy( iv, aes_test_cfb128_iv, 16 ); - memcpy( key, aes_test_cfb128_key[u], 16 + u * 8 ); - - offset = 0; - aes_setkey_enc( &ctx, key, 128 + u * 64 ); - - if( v == AES_DECRYPT ) - { - memcpy( buf, aes_test_cfb128_ct[u], 64 ); - aes_crypt_cfb128( &ctx, v, 64, &offset, iv, buf, buf ); - - if( memcmp( buf, aes_test_cfb128_pt, 64 ) != 0 ) - { - if( verbose != 0 ) - printf( "failed\n" ); - - return( 1 ); - } - } - else - { - memcpy( buf, aes_test_cfb128_pt, 64 ); - aes_crypt_cfb128( &ctx, v, 64, &offset, iv, buf, buf ); - - if( memcmp( buf, aes_test_cfb128_ct[u], 64 ) != 0 ) - { - if( verbose != 0 ) - printf( "failed\n" ); - - return( 1 ); - } - } - - if( verbose != 0 ) - printf( "passed\n" ); - } - - if( verbose != 0 ) - printf( "\n" ); -#endif /* POLARSSL_CIPHER_MODE_CFB */ - -#if defined(POLARSSL_CIPHER_MODE_CTR) - /* - * CTR mode - */ - for( i = 0; i < 6; i++ ) - { - u = i >> 1; - v = i & 1; - - if( verbose != 0 ) - printf( " AES-CTR-128 (%s): ", - ( v == AES_DECRYPT ) ? "dec" : "enc" ); - - memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 ); - memcpy( key, aes_test_ctr_key[u], 16 ); - - offset = 0; - aes_setkey_enc( &ctx, key, 128 ); - - if( v == AES_DECRYPT ) - { - len = aes_test_ctr_len[u]; - memcpy( buf, aes_test_ctr_ct[u], len ); - - aes_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block, buf, buf ); - - if( memcmp( buf, aes_test_ctr_pt[u], len ) != 0 ) - { - if( verbose != 0 ) - printf( "failed\n" ); - - return( 1 ); - } - } - else - { - len = aes_test_ctr_len[u]; - memcpy( buf, aes_test_ctr_pt[u], len ); - - aes_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block, buf, buf ); - - if( memcmp( buf, aes_test_ctr_ct[u], len ) != 0 ) - { - if( verbose != 0 ) - printf( "failed\n" ); - - return( 1 ); - } - } - - if( verbose != 0 ) - printf( "passed\n" ); - } - - if( verbose != 0 ) - printf( "\n" ); -#endif /* POLARSSL_CIPHER_MODE_CTR */ - - return( 0 ); -} - -#endif - -#endif diff --git a/protocols/Tlen/src/crypto/bignum.c b/protocols/Tlen/src/crypto/bignum.c deleted file mode 100644 index eabfbfe6f99..00000000000 --- a/protocols/Tlen/src/crypto/bignum.c +++ /dev/null @@ -1,2097 +0,0 @@ -/* - * Multi-precision integer library - * - * Copyright (C) 2006-2010, Brainspark B.V. - * - * This file is part of PolarSSL (http://www.polarssl.org) - * Lead Maintainer: Paul Bakker - * - * All rights reserved. - * - * 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ -/* - * This MPI implementation is based on: - * - * http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf - * http://www.stillhq.com/extracted/gnupg-api/mpi/ - * http://math.libtomcrypt.com/files/tommath.pdf - */ - -#include "polarssl/config.h" - -#if defined(POLARSSL_BIGNUM_C) - -#include "polarssl/bignum.h" -#include "polarssl/bn_mul.h" - -#include - -#define ciL (sizeof(t_uint)) /* chars in limb */ -#define biL (ciL << 3) /* bits in limb */ -#define biH (ciL << 2) /* half limb size */ - -/* - * Convert between bits/chars and number of limbs - */ -#define BITS_TO_LIMBS(i) (((i) + biL - 1) / biL) -#define CHARS_TO_LIMBS(i) (((i) + ciL - 1) / ciL) - -/* - * Initialize one MPI - */ -void mpi_init( mpi *X ) -{ - if( X == NULL ) - return; - - X->s = 1; - X->n = 0; - X->p = NULL; -} - -/* - * Unallocate one MPI - */ -void mpi_free( mpi *X ) -{ - if( X == NULL ) - return; - - if( X->p != NULL ) - { - memset( X->p, 0, X->n * ciL ); - free( X->p ); - } - - X->s = 1; - X->n = 0; - X->p = NULL; -} - -/* - * Enlarge to the specified number of limbs - */ -int mpi_grow( mpi *X, size_t nblimbs ) -{ - t_uint *p; - - if( nblimbs > POLARSSL_MPI_MAX_LIMBS ) - return( 1 ); - - if( X->n < nblimbs ) - { - if( ( p = (t_uint *) malloc( nblimbs * ciL ) ) == NULL ) - return( 1 ); - - memset( p, 0, nblimbs * ciL ); - - if( X->p != NULL ) - { - memcpy( p, X->p, X->n * ciL ); - memset( X->p, 0, X->n * ciL ); - free( X->p ); - } - - X->n = nblimbs; - X->p = p; - } - - return( 0 ); -} - -/* - * Copy the contents of Y into X - */ -int mpi_copy( mpi *X, const mpi *Y ) -{ - int ret; - size_t i; - - if( X == Y ) - return( 0 ); - - for( i = Y->n - 1; i > 0; i-- ) - if( Y->p[i] != 0 ) - break; - i++; - - X->s = Y->s; - - MPI_CHK( mpi_grow( X, i ) ); - - memset( X->p, 0, X->n * ciL ); - memcpy( X->p, Y->p, i * ciL ); - -cleanup: - - return( ret ); -} - -/* - * Swap the contents of X and Y - */ -void mpi_swap( mpi *X, mpi *Y ) -{ - mpi T; - - memcpy( &T, X, sizeof( mpi ) ); - memcpy( X, Y, sizeof( mpi ) ); - memcpy( Y, &T, sizeof( mpi ) ); -} - -/* - * Set value from integer - */ -int mpi_lset( mpi *X, t_sint z ) -{ - int ret; - - MPI_CHK( mpi_grow( X, 1 ) ); - memset( X->p, 0, X->n * ciL ); - - X->p[0] = ( z < 0 ) ? -z : z; - X->s = ( z < 0 ) ? -1 : 1; - -cleanup: - - return( ret ); -} - -/* - * Get a specific bit - */ -int mpi_get_bit( mpi *X, size_t pos ) -{ - if( X->n * biL <= pos ) - return( 0 ); - - return ( X->p[pos / biL] >> ( pos % biL ) ) & 0x01; -} - -/* - * Set a bit to a specific value of 0 or 1 - */ -int mpi_set_bit( mpi *X, size_t pos, unsigned char val ) -{ - int ret = 0; - size_t off = pos / biL; - size_t idx = pos % biL; - - if( val != 0 && val != 1 ) - return POLARSSL_ERR_MPI_BAD_INPUT_DATA; - - if( X->n * biL <= pos ) - { - if( val == 0 ) - return ( 0 ); - - MPI_CHK( mpi_grow( X, off + 1 ) ); - } - - X->p[off] = ( X->p[off] & ~( 0x01 << idx ) ) | ( val << idx ); - -cleanup: - - return( ret ); -} - -/* - * Return the number of least significant bits - */ -size_t mpi_lsb( const mpi *X ) -{ - size_t i, j, count = 0; - - for( i = 0; i < X->n; i++ ) - for( j = 0; j < biL; j++, count++ ) - if( ( ( X->p[i] >> j ) & 1 ) != 0 ) - return( count ); - - return( 0 ); -} - -/* - * Return the number of most significant bits - */ -size_t mpi_msb( const mpi *X ) -{ - size_t i, j; - - for( i = X->n - 1; i > 0; i-- ) - if( X->p[i] != 0 ) - break; - - for( j = biL; j > 0; j-- ) - if( ( ( X->p[i] >> ( j - 1 ) ) & 1 ) != 0 ) - break; - - return( ( i * biL ) + j ); -} - -/* - * Return the total size in bytes - */ -size_t mpi_size( const mpi *X ) -{ - return( ( mpi_msb( X ) + 7 ) >> 3 ); -} - -/* - * Convert an ASCII character to digit value - */ -static int mpi_get_digit( t_uint *d, int radix, char c ) -{ - *d = 255; - - if( c >= 0x30 && c <= 0x39 ) *d = c - 0x30; - if( c >= 0x41 && c <= 0x46 ) *d = c - 0x37; - if( c >= 0x61 && c <= 0x66 ) *d = c - 0x57; - - if( *d >= (t_uint) radix ) - return( POLARSSL_ERR_MPI_INVALID_CHARACTER ); - - return( 0 ); -} - -/* - * Import from an ASCII string - */ -int mpi_read_string( mpi *X, int radix, const char *s ) -{ - int ret; - size_t i, j, slen, n; - t_uint d; - mpi T; - - if( radix < 2 || radix > 16 ) - return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); - - mpi_init( &T ); - - slen = strlen( s ); - - if( radix == 16 ) - { - n = BITS_TO_LIMBS( slen << 2 ); - - MPI_CHK( mpi_grow( X, n ) ); - MPI_CHK( mpi_lset( X, 0 ) ); - - for( i = slen, j = 0; i > 0; i--, j++ ) - { - if( i == 1 && s[i - 1] == '-' ) - { - X->s = -1; - break; - } - - MPI_CHK( mpi_get_digit( &d, radix, s[i - 1] ) ); - X->p[j / (2 * ciL)] |= d << ( (j % (2 * ciL)) << 2 ); - } - } - else - { - MPI_CHK( mpi_lset( X, 0 ) ); - - for( i = 0; i < slen; i++ ) - { - if( i == 0 && s[i] == '-' ) - { - X->s = -1; - continue; - } - - MPI_CHK( mpi_get_digit( &d, radix, s[i] ) ); - MPI_CHK( mpi_mul_int( &T, X, radix ) ); - - if( X->s == 1 ) - { - MPI_CHK( mpi_add_int( X, &T, d ) ); - } - else - { - MPI_CHK( mpi_sub_int( X, &T, d ) ); - } - } - } - -cleanup: - - mpi_free( &T ); - - return( ret ); -} - -/* - * Helper to write the digits high-order first - */ -static int mpi_write_hlp( mpi *X, int radix, char **p ) -{ - int ret; - t_uint r; - - if( radix < 2 || radix > 16 ) - return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); - - MPI_CHK( mpi_mod_int( &r, X, radix ) ); - MPI_CHK( mpi_div_int( X, NULL, X, radix ) ); - - if( mpi_cmp_int( X, 0 ) != 0 ) - MPI_CHK( mpi_write_hlp( X, radix, p ) ); - - if( r < 10 ) - *(*p)++ = (char)( r + 0x30 ); - else - *(*p)++ = (char)( r + 0x37 ); - -cleanup: - - return( ret ); -} - -/* - * Export into an ASCII string - */ -int mpi_write_string( const mpi *X, int radix, char *s, size_t *slen ) -{ - int ret = 0; - size_t n; - char *p; - mpi T; - - if( radix < 2 || radix > 16 ) - return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); - - n = mpi_msb( X ); - if( radix >= 4 ) n >>= 1; - if( radix >= 16 ) n >>= 1; - n += 3; - - if( *slen < n ) - { - *slen = n; - return( POLARSSL_ERR_MPI_BUFFER_TOO_SMALL ); - } - - p = s; - mpi_init( &T ); - - if( X->s == -1 ) - *p++ = '-'; - - if( radix == 16 ) - { - int c; - size_t i, j, k; - - for( i = X->n, k = 0; i > 0; i-- ) - { - for( j = ciL; j > 0; j-- ) - { - c = ( X->p[i - 1] >> ( ( j - 1 ) << 3) ) & 0xFF; - - if( c == 0 && k == 0 && ( i + j + 3 ) != 0 ) - continue; - - p += sprintf( p, "%02X", c ); - k = 1; - } - } - } - else - { - MPI_CHK( mpi_copy( &T, X ) ); - - if( T.s == -1 ) - T.s = 1; - - MPI_CHK( mpi_write_hlp( &T, radix, &p ) ); - } - - *p++ = '\0'; - *slen = p - s; - -cleanup: - - mpi_free( &T ); - - return( ret ); -} - -#if defined(POLARSSL_FS_IO) -/* - * Read X from an opened file - */ -int mpi_read_file( mpi *X, int radix, FILE *fin ) -{ - t_uint d; - size_t slen; - char *p; - char s[1024]; - - memset( s, 0, sizeof( s ) ); - if( fgets( s, sizeof( s ) - 1, fin ) == NULL ) - return( POLARSSL_ERR_MPI_FILE_IO_ERROR ); - - slen = strlen( s ); - if( s[slen - 1] == '\n' ) { slen--; s[slen] = '\0'; } - if( s[slen - 1] == '\r' ) { slen--; s[slen] = '\0'; } - - p = s + slen; - while( --p >= s ) - if( mpi_get_digit( &d, radix, *p ) != 0 ) - break; - - return( mpi_read_string( X, radix, p + 1 ) ); -} - -/* - * Write X into an opened file (or stdout if fout == NULL) - */ -int mpi_write_file( const char *p, const mpi *X, int radix, FILE *fout ) -{ - int ret; - size_t n, slen, plen; - char s[2048]; - - n = sizeof( s ); - memset( s, 0, n ); - n -= 2; - - MPI_CHK( mpi_write_string( X, radix, s, (size_t *) &n ) ); - - if( p == NULL ) p = ""; - - plen = strlen( p ); - slen = strlen( s ); - s[slen++] = '\r'; - s[slen++] = '\n'; - - if( fout != NULL ) - { - if( fwrite( p, 1, plen, fout ) != plen || - fwrite( s, 1, slen, fout ) != slen ) - return( POLARSSL_ERR_MPI_FILE_IO_ERROR ); - } - else - printf( "%s%s", p, s ); - -cleanup: - - return( ret ); -} -#endif /* POLARSSL_FS_IO */ - -/* - * Import X from unsigned binary data, big endian - */ -int mpi_read_binary( mpi *X, const unsigned char *buf, size_t buflen ) -{ - int ret; - size_t i, j, n; - - for( n = 0; n < buflen; n++ ) - if( buf[n] != 0 ) - break; - - MPI_CHK( mpi_grow( X, CHARS_TO_LIMBS( buflen - n ) ) ); - MPI_CHK( mpi_lset( X, 0 ) ); - - for( i = buflen, j = 0; i > n; i--, j++ ) - X->p[j / ciL] |= ((t_uint) buf[i - 1]) << ((j % ciL) << 3); - -cleanup: - - return( ret ); -} - -/* - * Export X into unsigned binary data, big endian - */ -int mpi_write_binary( const mpi *X, unsigned char *buf, size_t buflen ) -{ - size_t i, j, n; - - n = mpi_size( X ); - - if( buflen < n ) - return( POLARSSL_ERR_MPI_BUFFER_TOO_SMALL ); - - memset( buf, 0, buflen ); - - for( i = buflen - 1, j = 0; n > 0; i--, j++, n-- ) - buf[i] = (unsigned char)( X->p[j / ciL] >> ((j % ciL) << 3) ); - - return( 0 ); -} - -/* - * Left-shift: X <<= count - */ -int mpi_shift_l( mpi *X, size_t count ) -{ - int ret; - size_t i, v0, t1; - t_uint r0 = 0, r1; - - v0 = count / (biL ); - t1 = count & (biL - 1); - - i = mpi_msb( X ) + count; - - if( X->n * biL < i ) - MPI_CHK( mpi_grow( X, BITS_TO_LIMBS( i ) ) ); - - ret = 0; - - /* - * shift by count / limb_size - */ - if( v0 > 0 ) - { - for( i = X->n; i > v0; i-- ) - X->p[i - 1] = X->p[i - v0 - 1]; - - for( ; i > 0; i-- ) - X->p[i - 1] = 0; - } - - /* - * shift by count % limb_size - */ - if( t1 > 0 ) - { - for( i = v0; i < X->n; i++ ) - { - r1 = X->p[i] >> (biL - t1); - X->p[i] <<= t1; - X->p[i] |= r0; - r0 = r1; - } - } - -cleanup: - - return( ret ); -} - -/* - * Right-shift: X >>= count - */ -int mpi_shift_r( mpi *X, size_t count ) -{ - size_t i, v0, v1; - t_uint r0 = 0, r1; - - v0 = count / biL; - v1 = count & (biL - 1); - - /* - * shift by count / limb_size - */ - if( v0 > 0 ) - { - for( i = 0; i < X->n - v0; i++ ) - X->p[i] = X->p[i + v0]; - - for( ; i < X->n; i++ ) - X->p[i] = 0; - } - - /* - * shift by count % limb_size - */ - if( v1 > 0 ) - { - for( i = X->n; i > 0; i-- ) - { - r1 = X->p[i - 1] << (biL - v1); - X->p[i - 1] >>= v1; - X->p[i - 1] |= r0; - r0 = r1; - } - } - - return( 0 ); -} - -/* - * Compare unsigned values - */ -int mpi_cmp_abs( const mpi *X, const mpi *Y ) -{ - size_t i, j; - - for( i = X->n; i > 0; i-- ) - if( X->p[i - 1] != 0 ) - break; - - for( j = Y->n; j > 0; j-- ) - if( Y->p[j - 1] != 0 ) - break; - - if( i == 0 && j == 0 ) - return( 0 ); - - if( i > j ) return( 1 ); - if( j > i ) return( -1 ); - - for( ; i > 0; i-- ) - { - if( X->p[i - 1] > Y->p[i - 1] ) return( 1 ); - if( X->p[i - 1] < Y->p[i - 1] ) return( -1 ); - } - - return( 0 ); -} - -/* - * Compare signed values - */ -int mpi_cmp_mpi( const mpi *X, const mpi *Y ) -{ - size_t i, j; - - for( i = X->n; i > 0; i-- ) - if( X->p[i - 1] != 0 ) - break; - - for( j = Y->n; j > 0; j-- ) - if( Y->p[j - 1] != 0 ) - break; - - if( i == 0 && j == 0 ) - return( 0 ); - - if( i > j ) return( X->s ); - if( j > i ) return( -X->s ); - - if( X->s > 0 && Y->s < 0 ) return( 1 ); - if( Y->s > 0 && X->s < 0 ) return( -1 ); - - for( ; i > 0; i-- ) - { - if( X->p[i - 1] > Y->p[i - 1] ) return( X->s ); - if( X->p[i - 1] < Y->p[i - 1] ) return( -X->s ); - } - - return( 0 ); -} - -/* - * Compare signed values - */ -int mpi_cmp_int( const mpi *X, t_sint z ) -{ - mpi Y; - t_uint p[1]; - - *p = ( z < 0 ) ? -z : z; - Y.s = ( z < 0 ) ? -1 : 1; - Y.n = 1; - Y.p = p; - - return( mpi_cmp_mpi( X, &Y ) ); -} - -/* - * Unsigned addition: X = |A| + |B| (HAC 14.7) - */ -int mpi_add_abs( mpi *X, const mpi *A, const mpi *B ) -{ - int ret; - size_t i, j; - t_uint *o, *p, c; - - if( X == B ) - { - const mpi *T = A; A = X; B = T; - } - - if( X != A ) - MPI_CHK( mpi_copy( X, A ) ); - - /* - * X should always be positive as a result of unsigned additions. - */ - X->s = 1; - - for( j = B->n; j > 0; j-- ) - if( B->p[j - 1] != 0 ) - break; - - MPI_CHK( mpi_grow( X, j ) ); - - o = B->p; p = X->p; c = 0; - - for( i = 0; i < j; i++, o++, p++ ) - { - *p += c; c = ( *p < c ); - *p += *o; c += ( *p < *o ); - } - - while( c != 0 ) - { - if( i >= X->n ) - { - MPI_CHK( mpi_grow( X, i + 1 ) ); - p = X->p + i; - } - - *p += c; c = ( *p < c ); i++; - } - -cleanup: - - return( ret ); -} - -/* - * Helper for mpi substraction - */ -static void mpi_sub_hlp( size_t n, t_uint *s, t_uint *d ) -{ - size_t i; - t_uint c, z; - - for( i = c = 0; i < n; i++, s++, d++ ) - { - z = ( *d < c ); *d -= c; - c = ( *d < *s ) + z; *d -= *s; - } - - while( c != 0 ) - { - z = ( *d < c ); *d -= c; - c = z; i++; d++; - } -} - -/* - * Unsigned substraction: X = |A| - |B| (HAC 14.9) - */ -int mpi_sub_abs( mpi *X, const mpi *A, const mpi *B ) -{ - mpi TB; - int ret; - size_t n; - - if( mpi_cmp_abs( A, B ) < 0 ) - return( POLARSSL_ERR_MPI_NEGATIVE_VALUE ); - - mpi_init( &TB ); - - if( X == B ) - { - MPI_CHK( mpi_copy( &TB, B ) ); - B = &TB; - } - - if( X != A ) - MPI_CHK( mpi_copy( X, A ) ); - - /* - * X should always be positive as a result of unsigned substractions. - */ - X->s = 1; - - ret = 0; - - for( n = B->n; n > 0; n-- ) - if( B->p[n - 1] != 0 ) - break; - - mpi_sub_hlp( n, B->p, X->p ); - -cleanup: - - mpi_free( &TB ); - - return( ret ); -} - -/* - * Signed addition: X = A + B - */ -int mpi_add_mpi( mpi *X, const mpi *A, const mpi *B ) -{ - int ret, s = A->s; - - if( A->s * B->s < 0 ) - { - if( mpi_cmp_abs( A, B ) >= 0 ) - { - MPI_CHK( mpi_sub_abs( X, A, B ) ); - X->s = s; - } - else - { - MPI_CHK( mpi_sub_abs( X, B, A ) ); - X->s = -s; - } - } - else - { - MPI_CHK( mpi_add_abs( X, A, B ) ); - X->s = s; - } - -cleanup: - - return( ret ); -} - -/* - * Signed substraction: X = A - B - */ -int mpi_sub_mpi( mpi *X, const mpi *A, const mpi *B ) -{ - int ret, s = A->s; - - if( A->s * B->s > 0 ) - { - if( mpi_cmp_abs( A, B ) >= 0 ) - { - MPI_CHK( mpi_sub_abs( X, A, B ) ); - X->s = s; - } - else - { - MPI_CHK( mpi_sub_abs( X, B, A ) ); - X->s = -s; - } - } - else - { - MPI_CHK( mpi_add_abs( X, A, B ) ); - X->s = s; - } - -cleanup: - - return( ret ); -} - -/* - * Signed addition: X = A + b - */ -int mpi_add_int( mpi *X, const mpi *A, t_sint b ) -{ - mpi _B; - t_uint p[1]; - - p[0] = ( b < 0 ) ? -b : b; - _B.s = ( b < 0 ) ? -1 : 1; - _B.n = 1; - _B.p = p; - - return( mpi_add_mpi( X, A, &_B ) ); -} - -/* - * Signed substraction: X = A - b - */ -int mpi_sub_int( mpi *X, const mpi *A, t_sint b ) -{ - mpi _B; - t_uint p[1]; - - p[0] = ( b < 0 ) ? -b : b; - _B.s = ( b < 0 ) ? -1 : 1; - _B.n = 1; - _B.p = p; - - return( mpi_sub_mpi( X, A, &_B ) ); -} - -/* - * Helper for mpi multiplication - */ -static void mpi_mul_hlp( size_t i, t_uint *s, t_uint *d, t_uint b ) -{ - t_uint c = 0, t = 0; - -#if defined(MULADDC_HUIT) - for( ; i >= 8; i -= 8 ) - { - MULADDC_INIT - MULADDC_HUIT - MULADDC_STOP - } - - for( ; i > 0; i-- ) - { - MULADDC_INIT - MULADDC_CORE - MULADDC_STOP - } -#else - for( ; i >= 16; i -= 16 ) - { - MULADDC_INIT - MULADDC_CORE MULADDC_CORE - MULADDC_CORE MULADDC_CORE - MULADDC_CORE MULADDC_CORE - MULADDC_CORE MULADDC_CORE - - MULADDC_CORE MULADDC_CORE - MULADDC_CORE MULADDC_CORE - MULADDC_CORE MULADDC_CORE - MULADDC_CORE MULADDC_CORE - MULADDC_STOP - } - - for( ; i >= 8; i -= 8 ) - { - MULADDC_INIT - MULADDC_CORE MULADDC_CORE - MULADDC_CORE MULADDC_CORE - - MULADDC_CORE MULADDC_CORE - MULADDC_CORE MULADDC_CORE - MULADDC_STOP - } - - for( ; i > 0; i-- ) - { - MULADDC_INIT - MULADDC_CORE - MULADDC_STOP - } -#endif - - t++; - - do { - *d += c; c = ( *d < c ); d++; - } - while( c != 0 ); -} - -/* - * Baseline multiplication: X = A * B (HAC 14.12) - */ -int mpi_mul_mpi( mpi *X, const mpi *A, const mpi *B ) -{ - int ret; - size_t i, j; - mpi TA, TB; - - mpi_init( &TA ); mpi_init( &TB ); - - if( X == A ) { MPI_CHK( mpi_copy( &TA, A ) ); A = &TA; } - if( X == B ) { MPI_CHK( mpi_copy( &TB, B ) ); B = &TB; } - - for( i = A->n; i > 0; i-- ) - if( A->p[i - 1] != 0 ) - break; - - for( j = B->n; j > 0; j-- ) - if( B->p[j - 1] != 0 ) - break; - - MPI_CHK( mpi_grow( X, i + j ) ); - MPI_CHK( mpi_lset( X, 0 ) ); - - for( i++; j > 0; j-- ) - mpi_mul_hlp( i - 1, A->p, X->p + j - 1, B->p[j - 1] ); - - X->s = A->s * B->s; - -cleanup: - - mpi_free( &TB ); mpi_free( &TA ); - - return( ret ); -} - -/* - * Baseline multiplication: X = A * b - */ -int mpi_mul_int( mpi *X, const mpi *A, t_sint b ) -{ - mpi _B; - t_uint p[1]; - - _B.s = 1; - _B.n = 1; - _B.p = p; - p[0] = b; - - return( mpi_mul_mpi( X, A, &_B ) ); -} - -/* - * Division by mpi: A = Q * B + R (HAC 14.20) - */ -int mpi_div_mpi( mpi *Q, mpi *R, const mpi *A, const mpi *B ) -{ - int ret; - size_t i, n, t, k; - mpi X, Y, Z, T1, T2; - - if( mpi_cmp_int( B, 0 ) == 0 ) - return( POLARSSL_ERR_MPI_DIVISION_BY_ZERO ); - - mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); - mpi_init( &T1 ); mpi_init( &T2 ); - - if( mpi_cmp_abs( A, B ) < 0 ) - { - if( Q != NULL ) MPI_CHK( mpi_lset( Q, 0 ) ); - if( R != NULL ) MPI_CHK( mpi_copy( R, A ) ); - return( 0 ); - } - - MPI_CHK( mpi_copy( &X, A ) ); - MPI_CHK( mpi_copy( &Y, B ) ); - X.s = Y.s = 1; - - MPI_CHK( mpi_grow( &Z, A->n + 2 ) ); - MPI_CHK( mpi_lset( &Z, 0 ) ); - MPI_CHK( mpi_grow( &T1, 2 ) ); - MPI_CHK( mpi_grow( &T2, 3 ) ); - - k = mpi_msb( &Y ) % biL; - if( k < biL - 1 ) - { - k = biL - 1 - k; - MPI_CHK( mpi_shift_l( &X, k ) ); - MPI_CHK( mpi_shift_l( &Y, k ) ); - } - else k = 0; - - n = X.n - 1; - t = Y.n - 1; - mpi_shift_l( &Y, biL * (n - t) ); - - while( mpi_cmp_mpi( &X, &Y ) >= 0 ) - { - Z.p[n - t]++; - mpi_sub_mpi( &X, &X, &Y ); - } - mpi_shift_r( &Y, biL * (n - t) ); - - for( i = n; i > t ; i-- ) - { - if( X.p[i] >= Y.p[t] ) - Z.p[i - t - 1] = ~0; - else - { -#if defined(POLARSSL_HAVE_LONGLONG) - t_dbl r; - - r = (t_dbl) X.p[i] << biL; - r |= (t_dbl) X.p[i - 1]; - r /= Y.p[t]; - if( r > ((t_dbl) 1 << biL) - 1) - r = ((t_dbl) 1 << biL) - 1; - - Z.p[i - t - 1] = (t_uint) r; -#else - /* - * __udiv_qrnnd_c, from gmp/longlong.h - */ - t_uint q0, q1, r0, r1; - t_uint d0, d1, d, m; - - d = Y.p[t]; - d0 = ( d << biH ) >> biH; - d1 = ( d >> biH ); - - q1 = X.p[i] / d1; - r1 = X.p[i] - d1 * q1; - r1 <<= biH; - r1 |= ( X.p[i - 1] >> biH ); - - m = q1 * d0; - if( r1 < m ) - { - q1--, r1 += d; - while( r1 >= d && r1 < m ) - q1--, r1 += d; - } - r1 -= m; - - q0 = r1 / d1; - r0 = r1 - d1 * q0; - r0 <<= biH; - r0 |= ( X.p[i - 1] << biH ) >> biH; - - m = q0 * d0; - if( r0 < m ) - { - q0--, r0 += d; - while( r0 >= d && r0 < m ) - q0--, r0 += d; - } - r0 -= m; - - Z.p[i - t - 1] = ( q1 << biH ) | q0; -#endif - } - - Z.p[i - t - 1]++; - do - { - Z.p[i - t - 1]--; - - MPI_CHK( mpi_lset( &T1, 0 ) ); - T1.p[0] = (t < 1) ? 0 : Y.p[t - 1]; - T1.p[1] = Y.p[t]; - MPI_CHK( mpi_mul_int( &T1, &T1, Z.p[i - t - 1] ) ); - - MPI_CHK( mpi_lset( &T2, 0 ) ); - T2.p[0] = (i < 2) ? 0 : X.p[i - 2]; - T2.p[1] = (i < 1) ? 0 : X.p[i - 1]; - T2.p[2] = X.p[i]; - } - while( mpi_cmp_mpi( &T1, &T2 ) > 0 ); - - MPI_CHK( mpi_mul_int( &T1, &Y, Z.p[i - t - 1] ) ); - MPI_CHK( mpi_shift_l( &T1, biL * (i - t - 1) ) ); - MPI_CHK( mpi_sub_mpi( &X, &X, &T1 ) ); - - if( mpi_cmp_int( &X, 0 ) < 0 ) - { - MPI_CHK( mpi_copy( &T1, &Y ) ); - MPI_CHK( mpi_shift_l( &T1, biL * (i - t - 1) ) ); - MPI_CHK( mpi_add_mpi( &X, &X, &T1 ) ); - Z.p[i - t - 1]--; - } - } - - if( Q != NULL ) - { - mpi_copy( Q, &Z ); - Q->s = A->s * B->s; - } - - if( R != NULL ) - { - mpi_shift_r( &X, k ); - mpi_copy( R, &X ); - - R->s = A->s; - if( mpi_cmp_int( R, 0 ) == 0 ) - R->s = 1; - } - -cleanup: - - mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); - mpi_free( &T1 ); mpi_free( &T2 ); - - return( ret ); -} - -/* - * Division by int: A = Q * b + R - * - * Returns 0 if successful - * 1 if memory allocation failed - * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if b == 0 - */ -int mpi_div_int( mpi *Q, mpi *R, const mpi *A, t_sint b ) -{ - mpi _B; - t_uint p[1]; - - p[0] = ( b < 0 ) ? -b : b; - _B.s = ( b < 0 ) ? -1 : 1; - _B.n = 1; - _B.p = p; - - return( mpi_div_mpi( Q, R, A, &_B ) ); -} - -/* - * Modulo: R = A mod B - */ -int mpi_mod_mpi( mpi *R, const mpi *A, const mpi *B ) -{ - int ret; - - if( mpi_cmp_int( B, 0 ) < 0 ) - return POLARSSL_ERR_MPI_NEGATIVE_VALUE; - - MPI_CHK( mpi_div_mpi( NULL, R, A, B ) ); - - while( mpi_cmp_int( R, 0 ) < 0 ) - MPI_CHK( mpi_add_mpi( R, R, B ) ); - - while( mpi_cmp_mpi( R, B ) >= 0 ) - MPI_CHK( mpi_sub_mpi( R, R, B ) ); - -cleanup: - - return( ret ); -} - -/* - * Modulo: r = A mod b - */ -int mpi_mod_int( t_uint *r, const mpi *A, t_sint b ) -{ - size_t i; - t_uint x, y, z; - - if( b == 0 ) - return( POLARSSL_ERR_MPI_DIVISION_BY_ZERO ); - - if( b < 0 ) - return POLARSSL_ERR_MPI_NEGATIVE_VALUE; - - /* - * handle trivial cases - */ - if( b == 1 ) - { - *r = 0; - return( 0 ); - } - - if( b == 2 ) - { - *r = A->p[0] & 1; - return( 0 ); - } - - /* - * general case - */ - for( i = A->n, y = 0; i > 0; i-- ) - { - x = A->p[i - 1]; - y = ( y << biH ) | ( x >> biH ); - z = y / b; - y -= z * b; - - x <<= biH; - y = ( y << biH ) | ( x >> biH ); - z = y / b; - y -= z * b; - } - - /* - * If A is negative, then the current y represents a negative value. - * Flipping it to the positive side. - */ - if( A->s < 0 && y != 0 ) - y = b - y; - - *r = y; - - return( 0 ); -} - -/* - * Fast Montgomery initialization (thanks to Tom St Denis) - */ -static void mpi_montg_init( t_uint *mm, const mpi *N ) -{ - t_uint x, m0 = N->p[0]; - - x = m0; - x += ( ( m0 + 2 ) & 4 ) << 1; - x *= ( 2 - ( m0 * x ) ); - - if( biL >= 16 ) x *= ( 2 - ( m0 * x ) ); - if( biL >= 32 ) x *= ( 2 - ( m0 * x ) ); - if( biL >= 64 ) x *= ( 2 - ( m0 * x ) ); - - *mm = ~x + 1; -} - -/* - * Montgomery multiplication: A = A * B * R^-1 mod N (HAC 14.36) - */ -static void mpi_montmul( mpi *A, const mpi *B, const mpi *N, t_uint mm, const mpi *T ) -{ - size_t i, n, m; - t_uint u0, u1, *d; - - memset( T->p, 0, T->n * ciL ); - - d = T->p; - n = N->n; - m = ( B->n < n ) ? B->n : n; - - for( i = 0; i < n; i++ ) - { - /* - * T = (T + u0*B + u1*N) / 2^biL - */ - u0 = A->p[i]; - u1 = ( d[0] + u0 * B->p[0] ) * mm; - - mpi_mul_hlp( m, B->p, d, u0 ); - mpi_mul_hlp( n, N->p, d, u1 ); - - *d++ = u0; d[n + 1] = 0; - } - - memcpy( A->p, d, (n + 1) * ciL ); - - if( mpi_cmp_abs( A, N ) >= 0 ) - mpi_sub_hlp( n, N->p, A->p ); - else - /* prevent timing attacks */ - mpi_sub_hlp( n, A->p, T->p ); -} - -/* - * Montgomery reduction: A = A * R^-1 mod N - */ -static void mpi_montred( mpi *A, const mpi *N, t_uint mm, const mpi *T ) -{ - t_uint z = 1; - mpi U; - - U.n = U.s = z; - U.p = &z; - - mpi_montmul( A, &U, N, mm, T ); -} - -/* - * Sliding-window exponentiation: X = A^E mod N (HAC 14.85) - */ -int mpi_exp_mod( mpi *X, const mpi *A, const mpi *E, const mpi *N, mpi *_RR ) -{ - int ret; - size_t wbits, wsize, one = 1; - size_t i, j, nblimbs; - size_t bufsize, nbits; - t_uint ei, mm, state; - mpi RR, T, W[64]; - - if( mpi_cmp_int( N, 0 ) < 0 || ( N->p[0] & 1 ) == 0 ) - return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); - - /* - * Init temps and window size - */ - mpi_montg_init( &mm, N ); - mpi_init( &RR ); mpi_init( &T ); - memset( W, 0, sizeof( W ) ); - - i = mpi_msb( E ); - - wsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 : - ( i > 79 ) ? 4 : ( i > 23 ) ? 3 : 1; - - j = N->n + 1; - MPI_CHK( mpi_grow( X, j ) ); - MPI_CHK( mpi_grow( &W[1], j ) ); - MPI_CHK( mpi_grow( &T, j * 2 ) ); - - /* - * If 1st call, pre-compute R^2 mod N - */ - if( _RR == NULL || _RR->p == NULL ) - { - MPI_CHK( mpi_lset( &RR, 1 ) ); - MPI_CHK( mpi_shift_l( &RR, N->n * 2 * biL ) ); - MPI_CHK( mpi_mod_mpi( &RR, &RR, N ) ); - - if( _RR != NULL ) - memcpy( _RR, &RR, sizeof( mpi ) ); - } - else - memcpy( &RR, _RR, sizeof( mpi ) ); - - /* - * W[1] = A * R^2 * R^-1 mod N = A * R mod N - */ - if( mpi_cmp_mpi( A, N ) >= 0 ) - mpi_mod_mpi( &W[1], A, N ); - else mpi_copy( &W[1], A ); - - mpi_montmul( &W[1], &RR, N, mm, &T ); - - /* - * X = R^2 * R^-1 mod N = R mod N - */ - MPI_CHK( mpi_copy( X, &RR ) ); - mpi_montred( X, N, mm, &T ); - - if( wsize > 1 ) - { - /* - * W[1 << (wsize - 1)] = W[1] ^ (wsize - 1) - */ - j = one << (wsize - 1); - - MPI_CHK( mpi_grow( &W[j], N->n + 1 ) ); - MPI_CHK( mpi_copy( &W[j], &W[1] ) ); - - for( i = 0; i < wsize - 1; i++ ) - mpi_montmul( &W[j], &W[j], N, mm, &T ); - - /* - * W[i] = W[i - 1] * W[1] - */ - for( i = j + 1; i < (one << wsize); i++ ) - { - MPI_CHK( mpi_grow( &W[i], N->n + 1 ) ); - MPI_CHK( mpi_copy( &W[i], &W[i - 1] ) ); - - mpi_montmul( &W[i], &W[1], N, mm, &T ); - } - } - - nblimbs = E->n; - bufsize = 0; - nbits = 0; - wbits = 0; - state = 0; - - while( 1 ) - { - if( bufsize == 0 ) - { - if( nblimbs-- == 0 ) - break; - - bufsize = sizeof( t_uint ) << 3; - } - - bufsize--; - - ei = (E->p[nblimbs] >> bufsize) & 1; - - /* - * skip leading 0s - */ - if( ei == 0 && state == 0 ) - continue; - - if( ei == 0 && state == 1 ) - { - /* - * out of window, square X - */ - mpi_montmul( X, X, N, mm, &T ); - continue; - } - - /* - * add ei to current window - */ - state = 2; - - nbits++; - wbits |= (ei << (wsize - nbits)); - - if( nbits == wsize ) - { - /* - * X = X^wsize R^-1 mod N - */ - for( i = 0; i < wsize; i++ ) - mpi_montmul( X, X, N, mm, &T ); - - /* - * X = X * W[wbits] R^-1 mod N - */ - mpi_montmul( X, &W[wbits], N, mm, &T ); - - state--; - nbits = 0; - wbits = 0; - } - } - - /* - * process the remaining bits - */ - for( i = 0; i < nbits; i++ ) - { - mpi_montmul( X, X, N, mm, &T ); - - wbits <<= 1; - - if( (wbits & (one << wsize)) != 0 ) - mpi_montmul( X, &W[1], N, mm, &T ); - } - - /* - * X = A^E * R * R^-1 mod N = A^E mod N - */ - mpi_montred( X, N, mm, &T ); - -cleanup: - - for( i = (one << (wsize - 1)); i < (one << wsize); i++ ) - mpi_free( &W[i] ); - - mpi_free( &W[1] ); mpi_free( &T ); - - if( _RR == NULL ) - mpi_free( &RR ); - - return( ret ); -} - -/* - * Greatest common divisor: G = gcd(A, B) (HAC 14.54) - */ -int mpi_gcd( mpi *G, const mpi *A, const mpi *B ) -{ - int ret; - size_t lz, lzt; - mpi TG, TA, TB; - - mpi_init( &TG ); mpi_init( &TA ); mpi_init( &TB ); - - MPI_CHK( mpi_copy( &TA, A ) ); - MPI_CHK( mpi_copy( &TB, B ) ); - - lz = mpi_lsb( &TA ); - lzt = mpi_lsb( &TB ); - - if ( lzt < lz ) - lz = lzt; - - MPI_CHK( mpi_shift_r( &TA, lz ) ); - MPI_CHK( mpi_shift_r( &TB, lz ) ); - - TA.s = TB.s = 1; - - while( mpi_cmp_int( &TA, 0 ) != 0 ) - { - MPI_CHK( mpi_shift_r( &TA, mpi_lsb( &TA ) ) ); - MPI_CHK( mpi_shift_r( &TB, mpi_lsb( &TB ) ) ); - - if( mpi_cmp_mpi( &TA, &TB ) >= 0 ) - { - MPI_CHK( mpi_sub_abs( &TA, &TA, &TB ) ); - MPI_CHK( mpi_shift_r( &TA, 1 ) ); - } - else - { - MPI_CHK( mpi_sub_abs( &TB, &TB, &TA ) ); - MPI_CHK( mpi_shift_r( &TB, 1 ) ); - } - } - - MPI_CHK( mpi_shift_l( &TB, lz ) ); - MPI_CHK( mpi_copy( G, &TB ) ); - -cleanup: - - mpi_free( &TG ); mpi_free( &TA ); mpi_free( &TB ); - - return( ret ); -} - -int mpi_fill_random( mpi *X, size_t size, int (*f_rng)(void *), void *p_rng ) -{ - int ret; - size_t k; - unsigned char *p; - - MPI_CHK( mpi_grow( X, size ) ); - MPI_CHK( mpi_lset( X, 0 ) ); - - p = (unsigned char *) X->p; - for( k = 0; k < X->n * ciL; k++ ) - *p++ = (unsigned char) f_rng( p_rng ); - -cleanup: - return( ret ); -} - -#if defined(POLARSSL_GENPRIME) - -/* - * Modular inverse: X = A^-1 mod N (HAC 14.61 / 14.64) - */ -int mpi_inv_mod( mpi *X, const mpi *A, const mpi *N ) -{ - int ret; - mpi G, TA, TU, U1, U2, TB, TV, V1, V2; - - if( mpi_cmp_int( N, 0 ) <= 0 ) - return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); - - mpi_init( &TA ); mpi_init( &TU ); mpi_init( &U1 ); mpi_init( &U2 ); - mpi_init( &G ); mpi_init( &TB ); mpi_init( &TV ); - mpi_init( &V1 ); mpi_init( &V2 ); - - MPI_CHK( mpi_gcd( &G, A, N ) ); - - if( mpi_cmp_int( &G, 1 ) != 0 ) - { - ret = POLARSSL_ERR_MPI_NOT_ACCEPTABLE; - goto cleanup; - } - - MPI_CHK( mpi_mod_mpi( &TA, A, N ) ); - MPI_CHK( mpi_copy( &TU, &TA ) ); - MPI_CHK( mpi_copy( &TB, N ) ); - MPI_CHK( mpi_copy( &TV, N ) ); - - MPI_CHK( mpi_lset( &U1, 1 ) ); - MPI_CHK( mpi_lset( &U2, 0 ) ); - MPI_CHK( mpi_lset( &V1, 0 ) ); - MPI_CHK( mpi_lset( &V2, 1 ) ); - - do - { - while( ( TU.p[0] & 1 ) == 0 ) - { - MPI_CHK( mpi_shift_r( &TU, 1 ) ); - - if( ( U1.p[0] & 1 ) != 0 || ( U2.p[0] & 1 ) != 0 ) - { - MPI_CHK( mpi_add_mpi( &U1, &U1, &TB ) ); - MPI_CHK( mpi_sub_mpi( &U2, &U2, &TA ) ); - } - - MPI_CHK( mpi_shift_r( &U1, 1 ) ); - MPI_CHK( mpi_shift_r( &U2, 1 ) ); - } - - while( ( TV.p[0] & 1 ) == 0 ) - { - MPI_CHK( mpi_shift_r( &TV, 1 ) ); - - if( ( V1.p[0] & 1 ) != 0 || ( V2.p[0] & 1 ) != 0 ) - { - MPI_CHK( mpi_add_mpi( &V1, &V1, &TB ) ); - MPI_CHK( mpi_sub_mpi( &V2, &V2, &TA ) ); - } - - MPI_CHK( mpi_shift_r( &V1, 1 ) ); - MPI_CHK( mpi_shift_r( &V2, 1 ) ); - } - - if( mpi_cmp_mpi( &TU, &TV ) >= 0 ) - { - MPI_CHK( mpi_sub_mpi( &TU, &TU, &TV ) ); - MPI_CHK( mpi_sub_mpi( &U1, &U1, &V1 ) ); - MPI_CHK( mpi_sub_mpi( &U2, &U2, &V2 ) ); - } - else - { - MPI_CHK( mpi_sub_mpi( &TV, &TV, &TU ) ); - MPI_CHK( mpi_sub_mpi( &V1, &V1, &U1 ) ); - MPI_CHK( mpi_sub_mpi( &V2, &V2, &U2 ) ); - } - } - while( mpi_cmp_int( &TU, 0 ) != 0 ); - - while( mpi_cmp_int( &V1, 0 ) < 0 ) - MPI_CHK( mpi_add_mpi( &V1, &V1, N ) ); - - while( mpi_cmp_mpi( &V1, N ) >= 0 ) - MPI_CHK( mpi_sub_mpi( &V1, &V1, N ) ); - - MPI_CHK( mpi_copy( X, &V1 ) ); - -cleanup: - - mpi_free( &TA ); mpi_free( &TU ); mpi_free( &U1 ); mpi_free( &U2 ); - mpi_free( &G ); mpi_free( &TB ); mpi_free( &TV ); - mpi_free( &V1 ); mpi_free( &V2 ); - - return( ret ); -} - -static const int small_prime[] = -{ - 3, 5, 7, 11, 13, 17, 19, 23, - 29, 31, 37, 41, 43, 47, 53, 59, - 61, 67, 71, 73, 79, 83, 89, 97, - 101, 103, 107, 109, 113, 127, 131, 137, - 139, 149, 151, 157, 163, 167, 173, 179, - 181, 191, 193, 197, 199, 211, 223, 227, - 229, 233, 239, 241, 251, 257, 263, 269, - 271, 277, 281, 283, 293, 307, 311, 313, - 317, 331, 337, 347, 349, 353, 359, 367, - 373, 379, 383, 389, 397, 401, 409, 419, - 421, 431, 433, 439, 443, 449, 457, 461, - 463, 467, 479, 487, 491, 499, 503, 509, - 521, 523, 541, 547, 557, 563, 569, 571, - 577, 587, 593, 599, 601, 607, 613, 617, - 619, 631, 641, 643, 647, 653, 659, 661, - 673, 677, 683, 691, 701, 709, 719, 727, - 733, 739, 743, 751, 757, 761, 769, 773, - 787, 797, 809, 811, 821, 823, 827, 829, - 839, 853, 857, 859, 863, 877, 881, 883, - 887, 907, 911, 919, 929, 937, 941, 947, - 953, 967, 971, 977, 983, 991, 997, -103 -}; - -/* - * Miller-Rabin primality test (HAC 4.24) - */ -int mpi_is_prime( mpi *X, int (*f_rng)(void *), void *p_rng ) -{ - int ret, xs; - size_t i, j, n, s; - mpi W, R, T, A, RR; - - if( mpi_cmp_int( X, 0 ) == 0 || - mpi_cmp_int( X, 1 ) == 0 ) - return( POLARSSL_ERR_MPI_NOT_ACCEPTABLE ); - - if( mpi_cmp_int( X, 2 ) == 0 ) - return( 0 ); - - mpi_init( &W ); mpi_init( &R ); mpi_init( &T ); mpi_init( &A ); - mpi_init( &RR ); - - xs = X->s; X->s = 1; - - /* - * test trivial factors first - */ - if( ( X->p[0] & 1 ) == 0 ) - return( POLARSSL_ERR_MPI_NOT_ACCEPTABLE ); - - for( i = 0; small_prime[i] > 0; i++ ) - { - t_uint r; - - if( mpi_cmp_int( X, small_prime[i] ) <= 0 ) - return( 0 ); - - MPI_CHK( mpi_mod_int( &r, X, small_prime[i] ) ); - - if( r == 0 ) - return( POLARSSL_ERR_MPI_NOT_ACCEPTABLE ); - } - - /* - * W = |X| - 1 - * R = W >> lsb( W ) - */ - MPI_CHK( mpi_sub_int( &W, X, 1 ) ); - s = mpi_lsb( &W ); - MPI_CHK( mpi_copy( &R, &W ) ); - MPI_CHK( mpi_shift_r( &R, s ) ); - - i = mpi_msb( X ); - /* - * HAC, table 4.4 - */ - n = ( ( i >= 1300 ) ? 2 : ( i >= 850 ) ? 3 : - ( i >= 650 ) ? 4 : ( i >= 350 ) ? 8 : - ( i >= 250 ) ? 12 : ( i >= 150 ) ? 18 : 27 ); - - for( i = 0; i < n; i++ ) - { - /* - * pick a random A, 1 < A < |X| - 1 - */ - mpi_fill_random( &A, X->n, f_rng, p_rng ); - - if( mpi_cmp_mpi( &A, &W ) >= 0 ) - { - j = mpi_msb( &A ) - mpi_msb( &W ); - MPI_CHK( mpi_shift_r( &A, j + 1 ) ); - } - A.p[0] |= 3; - - /* - * A = A^R mod |X| - */ - MPI_CHK( mpi_exp_mod( &A, &A, &R, X, &RR ) ); - - if( mpi_cmp_mpi( &A, &W ) == 0 || - mpi_cmp_int( &A, 1 ) == 0 ) - continue; - - j = 1; - while( j < s && mpi_cmp_mpi( &A, &W ) != 0 ) - { - /* - * A = A * A mod |X| - */ - MPI_CHK( mpi_mul_mpi( &T, &A, &A ) ); - MPI_CHK( mpi_mod_mpi( &A, &T, X ) ); - - if( mpi_cmp_int( &A, 1 ) == 0 ) - break; - - j++; - } - - /* - * not prime if A != |X| - 1 or A == 1 - */ - if( mpi_cmp_mpi( &A, &W ) != 0 || - mpi_cmp_int( &A, 1 ) == 0 ) - { - ret = POLARSSL_ERR_MPI_NOT_ACCEPTABLE; - break; - } - } - -cleanup: - - X->s = xs; - - mpi_free( &W ); mpi_free( &R ); mpi_free( &T ); mpi_free( &A ); - mpi_free( &RR ); - - return( ret ); -} - -/* - * Prime number generation - */ -int mpi_gen_prime( mpi *X, size_t nbits, int dh_flag, - int (*f_rng)(void *), void *p_rng ) -{ - int ret; - size_t k, n; - mpi Y; - - if( nbits < 3 || nbits > 4096 ) - return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); - - mpi_init( &Y ); - - n = BITS_TO_LIMBS( nbits ); - - mpi_fill_random( X, n, f_rng, p_rng ); - - k = mpi_msb( X ); - if( k < nbits ) MPI_CHK( mpi_shift_l( X, nbits - k ) ); - if( k > nbits ) MPI_CHK( mpi_shift_r( X, k - nbits ) ); - - X->p[0] |= 3; - - if( dh_flag == 0 ) - { - while( ( ret = mpi_is_prime( X, f_rng, p_rng ) ) != 0 ) - { - if( ret != POLARSSL_ERR_MPI_NOT_ACCEPTABLE ) - goto cleanup; - - MPI_CHK( mpi_add_int( X, X, 2 ) ); - } - } - else - { - MPI_CHK( mpi_sub_int( &Y, X, 1 ) ); - MPI_CHK( mpi_shift_r( &Y, 1 ) ); - - while( 1 ) - { - if( ( ret = mpi_is_prime( X, f_rng, p_rng ) ) == 0 ) - { - if( ( ret = mpi_is_prime( &Y, f_rng, p_rng ) ) == 0 ) - break; - - if( ret != POLARSSL_ERR_MPI_NOT_ACCEPTABLE ) - goto cleanup; - } - - if( ret != POLARSSL_ERR_MPI_NOT_ACCEPTABLE ) - goto cleanup; - - MPI_CHK( mpi_add_int( &Y, X, 1 ) ); - MPI_CHK( mpi_add_int( X, X, 2 ) ); - MPI_CHK( mpi_shift_r( &Y, 1 ) ); - } - } - -cleanup: - - mpi_free( &Y ); - - return( ret ); -} - -#endif - -#if defined(POLARSSL_SELF_TEST) - -#define GCD_PAIR_COUNT 3 - -static const int gcd_pairs[GCD_PAIR_COUNT][3] = -{ - { 693, 609, 21 }, - { 1764, 868, 28 }, - { 768454923, 542167814, 1 } -}; - -/* - * Checkup routine - */ -int mpi_self_test( int verbose ) -{ - int ret, i; - mpi A, E, N, X, Y, U, V; - - mpi_init( &A ); mpi_init( &E ); mpi_init( &N ); mpi_init( &X ); - mpi_init( &Y ); mpi_init( &U ); mpi_init( &V ); - - MPI_CHK( mpi_read_string( &A, 16, - "EFE021C2645FD1DC586E69184AF4A31E" \ - "D5F53E93B5F123FA41680867BA110131" \ - "944FE7952E2517337780CB0DB80E61AA" \ - "E7C8DDC6C5C6AADEB34EB38A2F40D5E6" ) ); - - MPI_CHK( mpi_read_string( &E, 16, - "B2E7EFD37075B9F03FF989C7C5051C20" \ - "34D2A323810251127E7BF8625A4F49A5" \ - "F3E27F4DA8BD59C47D6DAABA4C8127BD" \ - "5B5C25763222FEFCCFC38B832366C29E" ) ); - - MPI_CHK( mpi_read_string( &N, 16, - "0066A198186C18C10B2F5ED9B522752A" \ - "9830B69916E535C8F047518A889A43A5" \ - "94B6BED27A168D31D4A52F88925AA8F5" ) ); - - MPI_CHK( mpi_mul_mpi( &X, &A, &N ) ); - - MPI_CHK( mpi_read_string( &U, 16, - "602AB7ECA597A3D6B56FF9829A5E8B85" \ - "9E857EA95A03512E2BAE7391688D264A" \ - "A5663B0341DB9CCFD2C4C5F421FEC814" \ - "8001B72E848A38CAE1C65F78E56ABDEF" \ - "E12D3C039B8A02D6BE593F0BBBDA56F1" \ - "ECF677152EF804370C1A305CAF3B5BF1" \ - "30879B56C61DE584A0F53A2447A51E" ) ); - - if( verbose != 0 ) - printf( " MPI test #1 (mul_mpi): " ); - - if( mpi_cmp_mpi( &X, &U ) != 0 ) - { - if( verbose != 0 ) - printf( "failed\n" ); - - return( 1 ); - } - - if( verbose != 0 ) - printf( "passed\n" ); - - MPI_CHK( mpi_div_mpi( &X, &Y, &A, &N ) ); - - MPI_CHK( mpi_read_string( &U, 16, - "256567336059E52CAE22925474705F39A94" ) ); - - MPI_CHK( mpi_read_string( &V, 16, - "6613F26162223DF488E9CD48CC132C7A" \ - "0AC93C701B001B092E4E5B9F73BCD27B" \ - "9EE50D0657C77F374E903CDFA4C642" ) ); - - if( verbose != 0 ) - printf( " MPI test #2 (div_mpi): " ); - - if( mpi_cmp_mpi( &X, &U ) != 0 || - mpi_cmp_mpi( &Y, &V ) != 0 ) - { - if( verbose != 0 ) - printf( "failed\n" ); - - return( 1 ); - } - - if( verbose != 0 ) - printf( "passed\n" ); - - MPI_CHK( mpi_exp_mod( &X, &A, &E, &N, NULL ) ); - - MPI_CHK( mpi_read_string( &U, 16, - "36E139AEA55215609D2816998ED020BB" \ - "BD96C37890F65171D948E9BC7CBAA4D9" \ - "325D24D6A3C12710F10A09FA08AB87" ) ); - - if( verbose != 0 ) - printf( " MPI test #3 (exp_mod): " ); - - if( mpi_cmp_mpi( &X, &U ) != 0 ) - { - if( verbose != 0 ) - printf( "failed\n" ); - - return( 1 ); - } - - if( verbose != 0 ) - printf( "passed\n" ); - -#if defined(POLARSSL_GENPRIME) - MPI_CHK( mpi_inv_mod( &X, &A, &N ) ); - - MPI_CHK( mpi_read_string( &U, 16, - "003A0AAEDD7E784FC07D8F9EC6E3BFD5" \ - "C3DBA76456363A10869622EAC2DD84EC" \ - "C5B8A74DAC4D09E03B5E0BE779F2DF61" ) ); - - if( verbose != 0 ) - printf( " MPI test #4 (inv_mod): " ); - - if( mpi_cmp_mpi( &X, &U ) != 0 ) - { - if( verbose != 0 ) - printf( "failed\n" ); - - return( 1 ); - } - - if( verbose != 0 ) - printf( "passed\n" ); -#endif - - if( verbose != 0 ) - printf( " MPI test #5 (simple gcd): " ); - - for ( i = 0; i < GCD_PAIR_COUNT; i++) - { - MPI_CHK( mpi_lset( &X, gcd_pairs[i][0] ) ); - MPI_CHK( mpi_lset( &Y, gcd_pairs[i][1] ) ); - - MPI_CHK( mpi_gcd( &A, &X, &Y ) ); - - if( mpi_cmp_int( &A, gcd_pairs[i][2] ) != 0 ) - { - if( verbose != 0 ) - printf( "failed at %d\n", i ); - - return( 1 ); - } - } - - if( verbose != 0 ) - printf( "passed\n" ); - -cleanup: - - if( ret != 0 && verbose != 0 ) - printf( "Unexpected error, return code = %08X\n", ret ); - - mpi_free( &A ); mpi_free( &E ); mpi_free( &N ); mpi_free( &X ); - mpi_free( &Y ); mpi_free( &U ); mpi_free( &V ); - - if( verbose != 0 ) - printf( "\n" ); - - return( ret ); -} - -#endif - -#endif diff --git a/protocols/Tlen/src/crypto/padlock.c b/protocols/Tlen/src/crypto/padlock.c deleted file mode 100644 index 2e2e4775ffd..00000000000 --- a/protocols/Tlen/src/crypto/padlock.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * VIA PadLock support functions - * - * Copyright (C) 2006-2010, Brainspark B.V. - * - * This file is part of PolarSSL (http://www.polarssl.org) - * Lead Maintainer: Paul Bakker - * - * All rights reserved. - * - * 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ -/* - * This implementation is based on the VIA PadLock Programming Guide: - * - * http://www.via.com.tw/en/downloads/whitepapers/initiatives/padlock/ - * programming_guide.pdf - */ - -#include "polarssl/config.h" - -#if defined(POLARSSL_PADLOCK_C) - -#include "polarssl/padlock.h" - -#if defined(POLARSSL_HAVE_X86) - -/* - * PadLock detection routine - */ -int padlock_supports( int feature ) -{ - static int flags = -1; - int ebx, edx; - - if( flags == -1 ) - { - asm( "movl %%ebx, %0 \n" \ - "movl $0xC0000000, %%eax \n" \ - "cpuid \n" \ - "cmpl $0xC0000001, %%eax \n" \ - "movl $0, %%edx \n" \ - "jb unsupported \n" \ - "movl $0xC0000001, %%eax \n" \ - "cpuid \n" \ - "unsupported: \n" \ - "movl %%edx, %1 \n" \ - "movl %2, %%ebx \n" - : "=m" (ebx), "=m" (edx) - : "m" (ebx) - : "eax", "ecx", "edx" ); - - flags = edx; - } - - return( flags & feature ); -} - -/* - * PadLock AES-ECB block en(de)cryption - */ -int padlock_xcryptecb( aes_context *ctx, - int mode, - const unsigned char input[16], - unsigned char output[16] ) -{ - int ebx; - unsigned long *rk; - unsigned long *blk; - unsigned long *ctrl; - unsigned char buf[256]; - - rk = ctx->rk; - blk = PADLOCK_ALIGN16( buf ); - memcpy( blk, input, 16 ); - - ctrl = blk + 4; - *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + ( mode^1 ) - 10 ) << 9 ); - - asm( "pushfl; popfl \n" \ - "movl %%ebx, %0 \n" \ - "movl $1, %%ecx \n" \ - "movl %2, %%edx \n" \ - "movl %3, %%ebx \n" \ - "movl %4, %%esi \n" \ - "movl %4, %%edi \n" \ - ".byte 0xf3,0x0f,0xa7,0xc8\n" \ - "movl %1, %%ebx \n" - : "=m" (ebx) - : "m" (ebx), "m" (ctrl), "m" (rk), "m" (blk) - : "ecx", "edx", "esi", "edi" ); - - memcpy( output, blk, 16 ); - - return( 0 ); -} - -/* - * PadLock AES-CBC buffer en(de)cryption - */ -int padlock_xcryptcbc( aes_context *ctx, - int mode, - size_t length, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ) -{ - int ebx; - size_t count; - unsigned long *rk; - unsigned long *iw; - unsigned long *ctrl; - unsigned char buf[256]; - - if( ( (long) input & 15 ) != 0 || - ( (long) output & 15 ) != 0 ) - return( POLARSSL_ERR_PADLOCK_DATA_MISALIGNED ); - - rk = ctx->rk; - iw = PADLOCK_ALIGN16( buf ); - memcpy( iw, iv, 16 ); - - ctrl = iw + 4; - *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + (mode^1) - 10 ) << 9 ); - - count = (length + 15) >> 4; - - asm( "pushfl; popfl \n" \ - "movl %%ebx, %0 \n" \ - "movl %2, %%ecx \n" \ - "movl %3, %%edx \n" \ - "movl %4, %%ebx \n" \ - "movl %5, %%esi \n" \ - "movl %6, %%edi \n" \ - "movl %7, %%eax \n" \ - ".byte 0xf3,0x0f,0xa7,0xd0\n" \ - "movl %1, %%ebx \n" - : "=m" (ebx) - : "m" (ebx), "m" (count), "m" (ctrl), - "m" (rk), "m" (input), "m" (output), "m" (iw) - : "eax", "ecx", "edx", "esi", "edi" ); - - memcpy( iv, iw, 16 ); - - return( 0 ); -} - -#endif - -#endif diff --git a/protocols/Tlen/src/crypto/polarssl/aes.h b/protocols/Tlen/src/crypto/polarssl/aes.h deleted file mode 100644 index efc13daf5b4..00000000000 --- a/protocols/Tlen/src/crypto/polarssl/aes.h +++ /dev/null @@ -1,167 +0,0 @@ -/** - * \file aes.h - * - * \brief AES block cipher - * - * Copyright (C) 2006-2010, Brainspark B.V. - * - * This file is part of PolarSSL (http://www.polarssl.org) - * Lead Maintainer: Paul Bakker - * - * All rights reserved. - * - * 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ -#ifndef POLARSSL_AES_H -#define POLARSSL_AES_H - -#include - -#define AES_ENCRYPT 1 -#define AES_DECRYPT 0 - -#define POLARSSL_ERR_AES_INVALID_KEY_LENGTH -0x0020 /**< Invalid key length. */ -#define POLARSSL_ERR_AES_INVALID_INPUT_LENGTH -0x0022 /**< Invalid data input length. */ - -/** - * \brief AES context structure - */ -typedef struct -{ - int nr; /*!< number of rounds */ - unsigned long *rk; /*!< AES round keys */ - unsigned long buf[68]; /*!< unaligned data */ -} -aes_context; - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief AES key schedule (encryption) - * - * \param ctx AES context to be initialized - * \param key encryption key - * \param keysize must be 128, 192 or 256 - * - * \return 0 if successful, or POLARSSL_ERR_AES_INVALID_KEY_LENGTH - */ -int aes_setkey_enc( aes_context *ctx, const unsigned char *key, unsigned int keysize ); - -/** - * \brief AES key schedule (decryption) - * - * \param ctx AES context to be initialized - * \param key decryption key - * \param keysize must be 128, 192 or 256 - * - * \return 0 if successful, or POLARSSL_ERR_AES_INVALID_KEY_LENGTH - */ -int aes_setkey_dec( aes_context *ctx, const unsigned char *key, unsigned int keysize ); - -/** - * \brief AES-ECB block encryption/decryption - * - * \param ctx AES context - * \param mode AES_ENCRYPT or AES_DECRYPT - * \param input 16-byte input block - * \param output 16-byte output block - * - * \return 0 if successful - */ -int aes_crypt_ecb( aes_context *ctx, - int mode, - const unsigned char input[16], - unsigned char output[16] ); - -/** - * \brief AES-CBC buffer encryption/decryption - * Length should be a multiple of the block - * size (16 bytes) - * - * \param ctx AES context - * \param mode AES_ENCRYPT or AES_DECRYPT - * \param length length of the input data - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful, or POLARSSL_ERR_AES_INVALID_INPUT_LENGTH - */ -int aes_crypt_cbc( aes_context *ctx, - int mode, - size_t length, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ); - -/** - * \brief AES-CFB128 buffer encryption/decryption. - * - * \param ctx AES context - * \param mode AES_ENCRYPT or AES_DECRYPT - * \param length length of the input data - * \param iv_off offset in IV (updated after use) - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful - */ -int aes_crypt_cfb128( aes_context *ctx, - int mode, - size_t length, - size_t *iv_off, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ); - -/* - * \brief AES-CTR buffer encryption/decryption - * - * Warning: You have to keep the maximum use of your counter in mind! - * - * \param length The length of the data - * \param nc_off The offset in the current stream_block (for resuming - * within current cipher stream). The offset pointer to - * should be 0 at the start of a stream. - * \param nonce_counter The 128-bit nonce and counter. - * \param stream_block The saved stream-block for resuming. Is overwritten - * by the function. - * \param input The input data stream - * \param output The output data stream - * - * \return 0 if successful - */ -int aes_crypt_ctr( aes_context *ctx, - size_t length, - size_t *nc_off, - unsigned char nonce_counter[16], - unsigned char stream_block[16], - const unsigned char *input, - unsigned char *output ); -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int aes_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* aes.h */ diff --git a/protocols/Tlen/src/crypto/polarssl/bignum.h b/protocols/Tlen/src/crypto/polarssl/bignum.h deleted file mode 100644 index 7938406708a..00000000000 --- a/protocols/Tlen/src/crypto/polarssl/bignum.h +++ /dev/null @@ -1,587 +0,0 @@ -/** - * \file bignum.h - * - * \brief Multi-precision integer library - * - * Copyright (C) 2006-2010, Brainspark B.V. - * - * This file is part of PolarSSL (http://www.polarssl.org) - * Lead Maintainer: Paul Bakker - * - * All rights reserved. - * - * 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ -#ifndef POLARSSL_BIGNUM_H -#define POLARSSL_BIGNUM_H - -#include -#include - -#define POLARSSL_ERR_MPI_FILE_IO_ERROR -0x0002 /**< An error occurred while reading from or writing to a file. */ -#define POLARSSL_ERR_MPI_BAD_INPUT_DATA -0x0004 /**< Bad input parameters to function. */ -#define POLARSSL_ERR_MPI_INVALID_CHARACTER -0x0006 /**< There is an invalid character in the digit string. */ -#define POLARSSL_ERR_MPI_BUFFER_TOO_SMALL -0x0008 /**< The output buffer is too small to write too. */ -#define POLARSSL_ERR_MPI_NEGATIVE_VALUE -0x000A /**< The input arguments are negative or result in illegal output. */ -#define POLARSSL_ERR_MPI_DIVISION_BY_ZERO -0x000C /**< The input argument for division is zero, which is not allowed. */ -#define POLARSSL_ERR_MPI_NOT_ACCEPTABLE -0x000E /**< The input arguments are not acceptable. */ - -#define MPI_CHK(f) if( ( ret = f ) != 0 ) goto cleanup - -/* - * Maximum size MPIs are allowed to grow to in number of limbs. - */ -#define POLARSSL_MPI_MAX_LIMBS 10000 - -/* - * Define the base integer type, architecture-wise - */ -#if defined(POLARSSL_HAVE_INT8) -typedef signed char t_sint; -typedef unsigned char t_uint; -typedef unsigned short t_udbl; -#else -#if defined(POLARSSL_HAVE_INT16) -typedef signed short t_sint; -typedef unsigned short t_uint; -typedef unsigned long t_udbl; -#else - typedef signed long t_sint; - typedef unsigned long t_uint; - #if defined(_MSC_VER) && defined(_M_IX86) - typedef unsigned __int64 t_udbl; - #else - #if defined(__amd64__) || defined(__x86_64__) || \ - defined(__ppc64__) || defined(__powerpc64__) || \ - defined(__ia64__) || defined(__alpha__) - typedef unsigned int t_udbl __attribute__((mode(TI))); - #else - #if defined(POLARSSL_HAVE_LONGLONG) - typedef unsigned long long t_udbl; - #endif - #endif - #endif -#endif -#endif - -/** - * \brief MPI structure - */ -typedef struct -{ - int s; /*!< integer sign */ - size_t n; /*!< total # of limbs */ - t_uint *p; /*!< pointer to limbs */ -} -mpi; - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Initialize one MPI - * - * \param X One MPI to initialize. - */ -void mpi_init( mpi *X ); - -/** - * \brief Unallocate one MPI - * - * \param X One MPI to unallocate. - */ -void mpi_free( mpi *X ); - -/** - * \brief Enlarge to the specified number of limbs - * - * \param X MPI to grow - * \param nblimbs The target number of limbs - * - * \return 0 if successful, - * 1 if memory allocation failed - */ -int mpi_grow( mpi *X, size_t nblimbs ); - -/** - * \brief Copy the contents of Y into X - * - * \param X Destination MPI - * \param Y Source MPI - * - * \return 0 if successful, - * 1 if memory allocation failed - */ -int mpi_copy( mpi *X, const mpi *Y ); - -/** - * \brief Swap the contents of X and Y - * - * \param X First MPI value - * \param Y Second MPI value - */ -void mpi_swap( mpi *X, mpi *Y ); - -/** - * \brief Set value from integer - * - * \param X MPI to set - * \param z Value to use - * - * \return 0 if successful, - * 1 if memory allocation failed - */ -int mpi_lset( mpi *X, t_sint z ); - -/* - * \brief Get a specific bit from X - * - * \param X MPI to use - * \param pos Zero-based index of the bit in X - * - * \return Either a 0 or a 1 - */ -int mpi_get_bit( mpi *X, size_t pos ); - -/* - * \brief Set a bit of X to a specific value of 0 or 1 - * - * \note Will grow X if necessary to set a bit to 1 in a not yet - * existing limb. Will not grow if bit should be set to 0 - * - * \param X MPI to use - * \param pos Zero-based index of the bit in X - * \param val The value to set the bit to (0 or 1) - * - * \return 0 if successful, - * 1 if memory allocation failed, - * POLARSSL_ERR_MPI_BAD_INPUT_DATA if val is not 0 or 1 - */ -int mpi_set_bit( mpi *X, size_t pos, unsigned char val ); - -/** - * \brief Return the number of least significant bits - * - * \param X MPI to use - */ -size_t mpi_lsb( const mpi *X ); - -/** - * \brief Return the number of most significant bits - * - * \param X MPI to use - */ -size_t mpi_msb( const mpi *X ); - -/** - * \brief Return the total size in bytes - * - * \param X MPI to use - */ -size_t mpi_size( const mpi *X ); - -/** - * \brief Import from an ASCII string - * - * \param X Destination MPI - * \param radix Input numeric base - * \param s Null-terminated string buffer - * - * \return 0 if successful, or an POLARSSL_ERR_MPI_XXX error code - */ -int mpi_read_string( mpi *X, int radix, const char *s ); - -/** - * \brief Export into an ASCII string - * - * \param X Source MPI - * \param radix Output numeric base - * \param s String buffer - * \param slen String buffer size - * - * \return 0 if successful, or an POLARSSL_ERR_MPI_XXX error code. - * *slen is always updated to reflect the amount - * of data that has (or would have) been written. - * - * \note Call this function with *slen = 0 to obtain the - * minimum required buffer size in *slen. - */ -int mpi_write_string( const mpi *X, int radix, char *s, size_t *slen ); - -/** - * \brief Read X from an opened file - * - * \param X Destination MPI - * \param radix Input numeric base - * \param fin Input file handle - * - * \return 0 if successful, or an POLARSSL_ERR_MPI_XXX error code - */ -int mpi_read_file( mpi *X, int radix, FILE *fin ); - -/** - * \brief Write X into an opened file, or stdout if fout is NULL - * - * \param p Prefix, can be NULL - * \param X Source MPI - * \param radix Output numeric base - * \param fout Output file handle (can be NULL) - * - * \return 0 if successful, or an POLARSSL_ERR_MPI_XXX error code - * - * \note Set fout == NULL to print X on the console. - */ -int mpi_write_file( const char *p, const mpi *X, int radix, FILE *fout ); - -/** - * \brief Import X from unsigned binary data, big endian - * - * \param X Destination MPI - * \param buf Input buffer - * \param buflen Input buffer size - * - * \return 0 if successful, - * 1 if memory allocation failed - */ -int mpi_read_binary( mpi *X, const unsigned char *buf, size_t buflen ); - -/** - * \brief Export X into unsigned binary data, big endian - * - * \param X Source MPI - * \param buf Output buffer - * \param buflen Output buffer size - * - * \return 0 if successful, - * POLARSSL_ERR_MPI_BUFFER_TOO_SMALL if buf isn't large enough - */ -int mpi_write_binary( const mpi *X, unsigned char *buf, size_t buflen ); - -/** - * \brief Left-shift: X <<= count - * - * \param X MPI to shift - * \param count Amount to shift - * - * \return 0 if successful, - * 1 if memory allocation failed - */ -int mpi_shift_l( mpi *X, size_t count ); - -/** - * \brief Right-shift: X >>= count - * - * \param X MPI to shift - * \param count Amount to shift - * - * \return 0 if successful, - * 1 if memory allocation failed - */ -int mpi_shift_r( mpi *X, size_t count ); - -/** - * \brief Compare unsigned values - * - * \param X Left-hand MPI - * \param Y Right-hand MPI - * - * \return 1 if |X| is greater than |Y|, - * -1 if |X| is lesser than |Y| or - * 0 if |X| is equal to |Y| - */ -int mpi_cmp_abs( const mpi *X, const mpi *Y ); - -/** - * \brief Compare signed values - * - * \param X Left-hand MPI - * \param Y Right-hand MPI - * - * \return 1 if X is greater than Y, - * -1 if X is lesser than Y or - * 0 if X is equal to Y - */ -int mpi_cmp_mpi( const mpi *X, const mpi *Y ); - -/** - * \brief Compare signed values - * - * \param X Left-hand MPI - * \param z The integer value to compare to - * - * \return 1 if X is greater than z, - * -1 if X is lesser than z or - * 0 if X is equal to z - */ -int mpi_cmp_int( const mpi *X, t_sint z ); - -/** - * \brief Unsigned addition: X = |A| + |B| - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * 1 if memory allocation failed - */ -int mpi_add_abs( mpi *X, const mpi *A, const mpi *B ); - -/** - * \brief Unsigned substraction: X = |A| - |B| - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * POLARSSL_ERR_MPI_NEGATIVE_VALUE if B is greater than A - */ -int mpi_sub_abs( mpi *X, const mpi *A, const mpi *B ); - -/** - * \brief Signed addition: X = A + B - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * 1 if memory allocation failed - */ -int mpi_add_mpi( mpi *X, const mpi *A, const mpi *B ); - -/** - * \brief Signed substraction: X = A - B - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * 1 if memory allocation failed - */ -int mpi_sub_mpi( mpi *X, const mpi *A, const mpi *B ); - -/** - * \brief Signed addition: X = A + b - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param b The integer value to add - * - * \return 0 if successful, - * 1 if memory allocation failed - */ -int mpi_add_int( mpi *X, const mpi *A, t_sint b ); - -/** - * \brief Signed substraction: X = A - b - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param b The integer value to subtract - * - * \return 0 if successful, - * 1 if memory allocation failed - */ -int mpi_sub_int( mpi *X, const mpi *A, t_sint b ); - -/** - * \brief Baseline multiplication: X = A * B - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * 1 if memory allocation failed - */ -int mpi_mul_mpi( mpi *X, const mpi *A, const mpi *B ); - -/** - * \brief Baseline multiplication: X = A * b - * Note: b is an unsigned integer type, thus - * Negative values of b are ignored. - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param b The integer value to multiply with - * - * \return 0 if successful, - * 1 if memory allocation failed - */ -int mpi_mul_int( mpi *X, const mpi *A, t_sint b ); - -/** - * \brief Division by mpi: A = Q * B + R - * - * \param Q Destination MPI for the quotient - * \param R Destination MPI for the rest value - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * 1 if memory allocation failed, - * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if B == 0 - * - * \note Either Q or R can be NULL. - */ -int mpi_div_mpi( mpi *Q, mpi *R, const mpi *A, const mpi *B ); - -/** - * \brief Division by int: A = Q * b + R - * - * \param Q Destination MPI for the quotient - * \param R Destination MPI for the rest value - * \param A Left-hand MPI - * \param b Integer to divide by - * - * \return 0 if successful, - * 1 if memory allocation failed, - * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if b == 0 - * - * \note Either Q or R can be NULL. - */ -int mpi_div_int( mpi *Q, mpi *R, const mpi *A, t_sint b ); - -/** - * \brief Modulo: R = A mod B - * - * \param R Destination MPI for the rest value - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * 1 if memory allocation failed, - * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if B == 0, - * POLARSSL_ERR_MPI_NEGATIVE_VALUE if B < 0 - */ -int mpi_mod_mpi( mpi *R, const mpi *A, const mpi *B ); - -/** - * \brief Modulo: r = A mod b - * - * \param r Destination t_uint - * \param A Left-hand MPI - * \param b Integer to divide by - * - * \return 0 if successful, - * 1 if memory allocation failed, - * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if b == 0, - * POLARSSL_ERR_MPI_NEGATIVE_VALUE if b < 0 - */ -int mpi_mod_int( t_uint *r, const mpi *A, t_sint b ); - -/** - * \brief Sliding-window exponentiation: X = A^E mod N - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param E Exponent MPI - * \param N Modular MPI - * \param _RR Speed-up MPI used for recalculations - * - * \return 0 if successful, - * 1 if memory allocation failed, - * POLARSSL_ERR_MPI_BAD_INPUT_DATA if N is negative or even - * - * \note _RR is used to avoid re-computing R*R mod N across - * multiple calls, which speeds up things a bit. It can - * be set to NULL if the extra performance is unneeded. - */ -int mpi_exp_mod( mpi *X, const mpi *A, const mpi *E, const mpi *N, mpi *_RR ); - -/** - * \brief Fill an MPI X with size bytes of random - * - * \param X Destination MPI - * \param size Size in bytes - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful, - * 1 if memory allocation failed - */ -int mpi_fill_random( mpi *X, size_t size, int (*f_rng)(void *), void *p_rng ); - -/** - * \brief Greatest common divisor: G = gcd(A, B) - * - * \param G Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * 1 if memory allocation failed - */ -int mpi_gcd( mpi *G, const mpi *A, const mpi *B ); - -/** - * \brief Modular inverse: X = A^-1 mod N - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param N Right-hand MPI - * - * \return 0 if successful, - * 1 if memory allocation failed, - * POLARSSL_ERR_MPI_BAD_INPUT_DATA if N is negative or nil - POLARSSL_ERR_MPI_NOT_ACCEPTABLE if A has no inverse mod N - */ -int mpi_inv_mod( mpi *X, const mpi *A, const mpi *N ); - -/** - * \brief Miller-Rabin primality test - * - * \param X MPI to check - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful (probably prime), - * 1 if memory allocation failed, - * POLARSSL_ERR_MPI_NOT_ACCEPTABLE if X is not prime - */ -int mpi_is_prime( mpi *X, int (*f_rng)(void *), void *p_rng ); - -/** - * \brief Prime number generation - * - * \param X Destination MPI - * \param nbits Required size of X in bits ( 3 <= nbits <= 4096 ) - * \param dh_flag If 1, then (X-1)/2 will be prime too - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful (probably prime), - * 1 if memory allocation failed, - * POLARSSL_ERR_MPI_BAD_INPUT_DATA if nbits is < 3 - */ -int mpi_gen_prime( mpi *X, size_t nbits, int dh_flag, - int (*f_rng)(void *), void *p_rng ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mpi_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* bignum.h */ diff --git a/protocols/Tlen/src/crypto/polarssl/bn_mul.h b/protocols/Tlen/src/crypto/polarssl/bn_mul.h deleted file mode 100644 index 59a32857cbf..00000000000 --- a/protocols/Tlen/src/crypto/polarssl/bn_mul.h +++ /dev/null @@ -1,738 +0,0 @@ -/** - * \file bn_mul.h - * - * \brief Multi-precision integer library - * - * Copyright (C) 2006-2010, Brainspark B.V. - * - * This file is part of PolarSSL (http://www.polarssl.org) - * Lead Maintainer: Paul Bakker - * - * All rights reserved. - * - * 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ -/* - * Multiply source vector [s] with b, add result - * to destination vector [d] and set carry c. - * - * Currently supports: - * - * . IA-32 (386+) . AMD64 / EM64T - * . IA-32 (SSE2) . Motorola 68000 - * . PowerPC, 32-bit . MicroBlaze - * . PowerPC, 64-bit . TriCore - * . SPARC v8 . ARM v3+ - * . Alpha . MIPS32 - * . C, longlong . C, generic - */ -#ifndef POLARSSL_BN_MUL_H -#define POLARSSL_BN_MUL_H - -#include "polarssl/config.h" - -#if defined(POLARSSL_HAVE_ASM) - -#if defined(__GNUC__) -#if defined(__i386__) - -#define MULADDC_INIT \ - asm( " \ - movl %%ebx, %0; \ - movl %5, %%esi; \ - movl %6, %%edi; \ - movl %7, %%ecx; \ - movl %8, %%ebx; \ - " - -#define MULADDC_CORE \ - " \ - lodsl; \ - mull %%ebx; \ - addl %%ecx, %%eax; \ - adcl $0, %%edx; \ - addl (%%edi), %%eax; \ - adcl $0, %%edx; \ - movl %%edx, %%ecx; \ - stosl; \ - " - -#if defined(POLARSSL_HAVE_SSE2) - -#define MULADDC_HUIT \ - " \ - movd %%ecx, %%mm1; \ - movd %%ebx, %%mm0; \ - movd (%%edi), %%mm3; \ - paddq %%mm3, %%mm1; \ - movd (%%esi), %%mm2; \ - pmuludq %%mm0, %%mm2; \ - movd 4(%%esi), %%mm4; \ - pmuludq %%mm0, %%mm4; \ - movd 8(%%esi), %%mm6; \ - pmuludq %%mm0, %%mm6; \ - movd 12(%%esi), %%mm7; \ - pmuludq %%mm0, %%mm7; \ - paddq %%mm2, %%mm1; \ - movd 4(%%edi), %%mm3; \ - paddq %%mm4, %%mm3; \ - movd 8(%%edi), %%mm5; \ - paddq %%mm6, %%mm5; \ - movd 12(%%edi), %%mm4; \ - paddq %%mm4, %%mm7; \ - movd %%mm1, (%%edi); \ - movd 16(%%esi), %%mm2; \ - pmuludq %%mm0, %%mm2; \ - psrlq $32, %%mm1; \ - movd 20(%%esi), %%mm4; \ - pmuludq %%mm0, %%mm4; \ - paddq %%mm3, %%mm1; \ - movd 24(%%esi), %%mm6; \ - pmuludq %%mm0, %%mm6; \ - movd %%mm1, 4(%%edi); \ - psrlq $32, %%mm1; \ - movd 28(%%esi), %%mm3; \ - pmuludq %%mm0, %%mm3; \ - paddq %%mm5, %%mm1; \ - movd 16(%%edi), %%mm5; \ - paddq %%mm5, %%mm2; \ - movd %%mm1, 8(%%edi); \ - psrlq $32, %%mm1; \ - paddq %%mm7, %%mm1; \ - movd 20(%%edi), %%mm5; \ - paddq %%mm5, %%mm4; \ - movd %%mm1, 12(%%edi); \ - psrlq $32, %%mm1; \ - paddq %%mm2, %%mm1; \ - movd 24(%%edi), %%mm5; \ - paddq %%mm5, %%mm6; \ - movd %%mm1, 16(%%edi); \ - psrlq $32, %%mm1; \ - paddq %%mm4, %%mm1; \ - movd 28(%%edi), %%mm5; \ - paddq %%mm5, %%mm3; \ - movd %%mm1, 20(%%edi); \ - psrlq $32, %%mm1; \ - paddq %%mm6, %%mm1; \ - movd %%mm1, 24(%%edi); \ - psrlq $32, %%mm1; \ - paddq %%mm3, %%mm1; \ - movd %%mm1, 28(%%edi); \ - addl $32, %%edi; \ - addl $32, %%esi; \ - psrlq $32, %%mm1; \ - movd %%mm1, %%ecx; \ - " - -#define MULADDC_STOP \ - " \ - emms; \ - movl %4, %%ebx; \ - movl %%ecx, %1; \ - movl %%edi, %2; \ - movl %%esi, %3; \ - " \ - : "=m" (t), "=m" (c), "=m" (d), "=m" (s) \ - : "m" (t), "m" (s), "m" (d), "m" (c), "m" (b) \ - : "eax", "ecx", "edx", "esi", "edi" \ - ); - -#else - -#define MULADDC_STOP \ - " \ - movl %4, %%ebx; \ - movl %%ecx, %1; \ - movl %%edi, %2; \ - movl %%esi, %3; \ - " \ - : "=m" (t), "=m" (c), "=m" (d), "=m" (s) \ - : "m" (t), "m" (s), "m" (d), "m" (c), "m" (b) \ - : "eax", "ecx", "edx", "esi", "edi" \ - ); -#endif /* SSE2 */ -#endif /* i386 */ - -#if defined(__amd64__) || defined (__x86_64__) - -#define MULADDC_INIT \ - asm( "movq %0, %%rsi " :: "m" (s)); \ - asm( "movq %0, %%rdi " :: "m" (d)); \ - asm( "movq %0, %%rcx " :: "m" (c)); \ - asm( "movq %0, %%rbx " :: "m" (b)); \ - asm( "xorq %r8, %r8 " ); - -#define MULADDC_CORE \ - asm( "movq (%rsi),%rax " ); \ - asm( "mulq %rbx " ); \ - asm( "addq $8, %rsi " ); \ - asm( "addq %rcx, %rax " ); \ - asm( "movq %r8, %rcx " ); \ - asm( "adcq $0, %rdx " ); \ - asm( "nop " ); \ - asm( "addq %rax, (%rdi) " ); \ - asm( "adcq %rdx, %rcx " ); \ - asm( "addq $8, %rdi " ); - -#define MULADDC_STOP \ - asm( "movq %%rcx, %0 " : "=m" (c)); \ - asm( "movq %%rdi, %0 " : "=m" (d)); \ - asm( "movq %%rsi, %0 " : "=m" (s) :: \ - "rax", "rcx", "rdx", "rbx", "rsi", "rdi", "r8" ); - -#endif /* AMD64 */ - -#if defined(__mc68020__) || defined(__mcpu32__) - -#define MULADDC_INIT \ - asm( "movl %0, %%a2 " :: "m" (s)); \ - asm( "movl %0, %%a3 " :: "m" (d)); \ - asm( "movl %0, %%d3 " :: "m" (c)); \ - asm( "movl %0, %%d2 " :: "m" (b)); \ - asm( "moveq #0, %d0 " ); - -#define MULADDC_CORE \ - asm( "movel %a2@+, %d1 " ); \ - asm( "mulul %d2, %d4:%d1 " ); \ - asm( "addl %d3, %d1 " ); \ - asm( "addxl %d0, %d4 " ); \ - asm( "moveq #0, %d3 " ); \ - asm( "addl %d1, %a3@+ " ); \ - asm( "addxl %d4, %d3 " ); - -#define MULADDC_STOP \ - asm( "movl %%d3, %0 " : "=m" (c)); \ - asm( "movl %%a3, %0 " : "=m" (d)); \ - asm( "movl %%a2, %0 " : "=m" (s) :: \ - "d0", "d1", "d2", "d3", "d4", "a2", "a3" ); - -#define MULADDC_HUIT \ - asm( "movel %a2@+, %d1 " ); \ - asm( "mulul %d2, %d4:%d1 " ); \ - asm( "addxl %d3, %d1 " ); \ - asm( "addxl %d0, %d4 " ); \ - asm( "addl %d1, %a3@+ " ); \ - asm( "movel %a2@+, %d1 " ); \ - asm( "mulul %d2, %d3:%d1 " ); \ - asm( "addxl %d4, %d1 " ); \ - asm( "addxl %d0, %d3 " ); \ - asm( "addl %d1, %a3@+ " ); \ - asm( "movel %a2@+, %d1 " ); \ - asm( "mulul %d2, %d4:%d1 " ); \ - asm( "addxl %d3, %d1 " ); \ - asm( "addxl %d0, %d4 " ); \ - asm( "addl %d1, %a3@+ " ); \ - asm( "movel %a2@+, %d1 " ); \ - asm( "mulul %d2, %d3:%d1 " ); \ - asm( "addxl %d4, %d1 " ); \ - asm( "addxl %d0, %d3 " ); \ - asm( "addl %d1, %a3@+ " ); \ - asm( "movel %a2@+, %d1 " ); \ - asm( "mulul %d2, %d4:%d1 " ); \ - asm( "addxl %d3, %d1 " ); \ - asm( "addxl %d0, %d4 " ); \ - asm( "addl %d1, %a3@+ " ); \ - asm( "movel %a2@+, %d1 " ); \ - asm( "mulul %d2, %d3:%d1 " ); \ - asm( "addxl %d4, %d1 " ); \ - asm( "addxl %d0, %d3 " ); \ - asm( "addl %d1, %a3@+ " ); \ - asm( "movel %a2@+, %d1 " ); \ - asm( "mulul %d2, %d4:%d1 " ); \ - asm( "addxl %d3, %d1 " ); \ - asm( "addxl %d0, %d4 " ); \ - asm( "addl %d1, %a3@+ " ); \ - asm( "movel %a2@+, %d1 " ); \ - asm( "mulul %d2, %d3:%d1 " ); \ - asm( "addxl %d4, %d1 " ); \ - asm( "addxl %d0, %d3 " ); \ - asm( "addl %d1, %a3@+ " ); \ - asm( "addxl %d0, %d3 " ); - -#endif /* MC68000 */ - -#if defined(__powerpc__) || defined(__ppc__) -#if defined(__powerpc64__) || defined(__ppc64__) - -#if defined(__MACH__) && defined(__APPLE__) - -#define MULADDC_INIT \ - asm( "ld r3, %0 " :: "m" (s)); \ - asm( "ld r4, %0 " :: "m" (d)); \ - asm( "ld r5, %0 " :: "m" (c)); \ - asm( "ld r6, %0 " :: "m" (b)); \ - asm( "addi r3, r3, -8 " ); \ - asm( "addi r4, r4, -8 " ); \ - asm( "addic r5, r5, 0 " ); - -#define MULADDC_CORE \ - asm( "ldu r7, 8(r3) " ); \ - asm( "mulld r8, r7, r6 " ); \ - asm( "mulhdu r9, r7, r6 " ); \ - asm( "adde r8, r8, r5 " ); \ - asm( "ld r7, 8(r4) " ); \ - asm( "addze r5, r9 " ); \ - asm( "addc r8, r8, r7 " ); \ - asm( "stdu r8, 8(r4) " ); - -#define MULADDC_STOP \ - asm( "addze r5, r5 " ); \ - asm( "addi r4, r4, 8 " ); \ - asm( "addi r3, r3, 8 " ); \ - asm( "std r5, %0 " : "=m" (c)); \ - asm( "std r4, %0 " : "=m" (d)); \ - asm( "std r3, %0 " : "=m" (s) :: \ - "r3", "r4", "r5", "r6", "r7", "r8", "r9" ); - -#else - -#define MULADDC_INIT \ - asm( "ld %%r3, %0 " :: "m" (s)); \ - asm( "ld %%r4, %0 " :: "m" (d)); \ - asm( "ld %%r5, %0 " :: "m" (c)); \ - asm( "ld %%r6, %0 " :: "m" (b)); \ - asm( "addi %r3, %r3, -8 " ); \ - asm( "addi %r4, %r4, -8 " ); \ - asm( "addic %r5, %r5, 0 " ); - -#define MULADDC_CORE \ - asm( "ldu %r7, 8(%r3) " ); \ - asm( "mulld %r8, %r7, %r6 " ); \ - asm( "mulhdu %r9, %r7, %r6 " ); \ - asm( "adde %r8, %r8, %r5 " ); \ - asm( "ld %r7, 8(%r4) " ); \ - asm( "addze %r5, %r9 " ); \ - asm( "addc %r8, %r8, %r7 " ); \ - asm( "stdu %r8, 8(%r4) " ); - -#define MULADDC_STOP \ - asm( "addze %r5, %r5 " ); \ - asm( "addi %r4, %r4, 8 " ); \ - asm( "addi %r3, %r3, 8 " ); \ - asm( "std %%r5, %0 " : "=m" (c)); \ - asm( "std %%r4, %0 " : "=m" (d)); \ - asm( "std %%r3, %0 " : "=m" (s) :: \ - "r3", "r4", "r5", "r6", "r7", "r8", "r9" ); - -#endif - -#else /* PPC32 */ - -#if defined(__MACH__) && defined(__APPLE__) - -#define MULADDC_INIT \ - asm( "lwz r3, %0 " :: "m" (s)); \ - asm( "lwz r4, %0 " :: "m" (d)); \ - asm( "lwz r5, %0 " :: "m" (c)); \ - asm( "lwz r6, %0 " :: "m" (b)); \ - asm( "addi r3, r3, -4 " ); \ - asm( "addi r4, r4, -4 " ); \ - asm( "addic r5, r5, 0 " ); - -#define MULADDC_CORE \ - asm( "lwzu r7, 4(r3) " ); \ - asm( "mullw r8, r7, r6 " ); \ - asm( "mulhwu r9, r7, r6 " ); \ - asm( "adde r8, r8, r5 " ); \ - asm( "lwz r7, 4(r4) " ); \ - asm( "addze r5, r9 " ); \ - asm( "addc r8, r8, r7 " ); \ - asm( "stwu r8, 4(r4) " ); - -#define MULADDC_STOP \ - asm( "addze r5, r5 " ); \ - asm( "addi r4, r4, 4 " ); \ - asm( "addi r3, r3, 4 " ); \ - asm( "stw r5, %0 " : "=m" (c)); \ - asm( "stw r4, %0 " : "=m" (d)); \ - asm( "stw r3, %0 " : "=m" (s) :: \ - "r3", "r4", "r5", "r6", "r7", "r8", "r9" ); - -#else - -#define MULADDC_INIT \ - asm( "lwz %%r3, %0 " :: "m" (s)); \ - asm( "lwz %%r4, %0 " :: "m" (d)); \ - asm( "lwz %%r5, %0 " :: "m" (c)); \ - asm( "lwz %%r6, %0 " :: "m" (b)); \ - asm( "addi %r3, %r3, -4 " ); \ - asm( "addi %r4, %r4, -4 " ); \ - asm( "addic %r5, %r5, 0 " ); - -#define MULADDC_CORE \ - asm( "lwzu %r7, 4(%r3) " ); \ - asm( "mullw %r8, %r7, %r6 " ); \ - asm( "mulhwu %r9, %r7, %r6 " ); \ - asm( "adde %r8, %r8, %r5 " ); \ - asm( "lwz %r7, 4(%r4) " ); \ - asm( "addze %r5, %r9 " ); \ - asm( "addc %r8, %r8, %r7 " ); \ - asm( "stwu %r8, 4(%r4) " ); - -#define MULADDC_STOP \ - asm( "addze %r5, %r5 " ); \ - asm( "addi %r4, %r4, 4 " ); \ - asm( "addi %r3, %r3, 4 " ); \ - asm( "stw %%r5, %0 " : "=m" (c)); \ - asm( "stw %%r4, %0 " : "=m" (d)); \ - asm( "stw %%r3, %0 " : "=m" (s) :: \ - "r3", "r4", "r5", "r6", "r7", "r8", "r9" ); - -#endif - -#endif /* PPC32 */ -#endif /* PPC64 */ - -#if defined(__sparc__) - -#define MULADDC_INIT \ - asm( "ld %0, %%o0 " :: "m" (s)); \ - asm( "ld %0, %%o1 " :: "m" (d)); \ - asm( "ld %0, %%o2 " :: "m" (c)); \ - asm( "ld %0, %%o3 " :: "m" (b)); - -#define MULADDC_CORE \ - asm( "ld [%o0], %o4 " ); \ - asm( "inc 4, %o0 " ); \ - asm( "ld [%o1], %o5 " ); \ - asm( "umul %o3, %o4, %o4 " ); \ - asm( "addcc %o4, %o2, %o4 " ); \ - asm( "rd %y, %g1 " ); \ - asm( "addx %g1, 0, %g1 " ); \ - asm( "addcc %o4, %o5, %o4 " ); \ - asm( "st %o4, [%o1] " ); \ - asm( "addx %g1, 0, %o2 " ); \ - asm( "inc 4, %o1 " ); - -#define MULADDC_STOP \ - asm( "st %%o2, %0 " : "=m" (c)); \ - asm( "st %%o1, %0 " : "=m" (d)); \ - asm( "st %%o0, %0 " : "=m" (s) :: \ - "g1", "o0", "o1", "o2", "o3", "o4", "o5" ); - -#endif /* SPARCv8 */ - -#if defined(__microblaze__) || defined(microblaze) - -#define MULADDC_INIT \ - asm( "lwi r3, %0 " :: "m" (s)); \ - asm( "lwi r4, %0 " :: "m" (d)); \ - asm( "lwi r5, %0 " :: "m" (c)); \ - asm( "lwi r6, %0 " :: "m" (b)); \ - asm( "andi r7, r6, 0xffff" ); \ - asm( "bsrli r6, r6, 16 " ); - -#define MULADDC_CORE \ - asm( "lhui r8, r3, 0 " ); \ - asm( "addi r3, r3, 2 " ); \ - asm( "lhui r9, r3, 0 " ); \ - asm( "addi r3, r3, 2 " ); \ - asm( "mul r10, r9, r6 " ); \ - asm( "mul r11, r8, r7 " ); \ - asm( "mul r12, r9, r7 " ); \ - asm( "mul r13, r8, r6 " ); \ - asm( "bsrli r8, r10, 16 " ); \ - asm( "bsrli r9, r11, 16 " ); \ - asm( "add r13, r13, r8 " ); \ - asm( "add r13, r13, r9 " ); \ - asm( "bslli r10, r10, 16 " ); \ - asm( "bslli r11, r11, 16 " ); \ - asm( "add r12, r12, r10 " ); \ - asm( "addc r13, r13, r0 " ); \ - asm( "add r12, r12, r11 " ); \ - asm( "addc r13, r13, r0 " ); \ - asm( "lwi r10, r4, 0 " ); \ - asm( "add r12, r12, r10 " ); \ - asm( "addc r13, r13, r0 " ); \ - asm( "add r12, r12, r5 " ); \ - asm( "addc r5, r13, r0 " ); \ - asm( "swi r12, r4, 0 " ); \ - asm( "addi r4, r4, 4 " ); - -#define MULADDC_STOP \ - asm( "swi r5, %0 " : "=m" (c)); \ - asm( "swi r4, %0 " : "=m" (d)); \ - asm( "swi r3, %0 " : "=m" (s) :: \ - "r3", "r4" , "r5" , "r6" , "r7" , "r8" , \ - "r9", "r10", "r11", "r12", "r13" ); - -#endif /* MicroBlaze */ - -#if defined(__tricore__) - -#define MULADDC_INIT \ - asm( "ld.a %%a2, %0 " :: "m" (s)); \ - asm( "ld.a %%a3, %0 " :: "m" (d)); \ - asm( "ld.w %%d4, %0 " :: "m" (c)); \ - asm( "ld.w %%d1, %0 " :: "m" (b)); \ - asm( "xor %d5, %d5 " ); - -#define MULADDC_CORE \ - asm( "ld.w %d0, [%a2+] " ); \ - asm( "madd.u %e2, %e4, %d0, %d1 " ); \ - asm( "ld.w %d0, [%a3] " ); \ - asm( "addx %d2, %d2, %d0 " ); \ - asm( "addc %d3, %d3, 0 " ); \ - asm( "mov %d4, %d3 " ); \ - asm( "st.w [%a3+], %d2 " ); - -#define MULADDC_STOP \ - asm( "st.w %0, %%d4 " : "=m" (c)); \ - asm( "st.a %0, %%a3 " : "=m" (d)); \ - asm( "st.a %0, %%a2 " : "=m" (s) :: \ - "d0", "d1", "e2", "d4", "a2", "a3" ); - -#endif /* TriCore */ - -#if defined(__arm__) - -#define MULADDC_INIT \ - asm( "ldr r0, %0 " :: "m" (s)); \ - asm( "ldr r1, %0 " :: "m" (d)); \ - asm( "ldr r2, %0 " :: "m" (c)); \ - asm( "ldr r3, %0 " :: "m" (b)); - -#define MULADDC_CORE \ - asm( "ldr r4, [r0], #4 " ); \ - asm( "mov r5, #0 " ); \ - asm( "ldr r6, [r1] " ); \ - asm( "umlal r2, r5, r3, r4 " ); \ - asm( "adds r7, r6, r2 " ); \ - asm( "adc r2, r5, #0 " ); \ - asm( "str r7, [r1], #4 " ); - -#define MULADDC_STOP \ - asm( "str r2, %0 " : "=m" (c)); \ - asm( "str r1, %0 " : "=m" (d)); \ - asm( "str r0, %0 " : "=m" (s) :: \ - "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7" ); - -#endif /* ARMv3 */ - -#if defined(__alpha__) - -#define MULADDC_INIT \ - asm( "ldq $1, %0 " :: "m" (s)); \ - asm( "ldq $2, %0 " :: "m" (d)); \ - asm( "ldq $3, %0 " :: "m" (c)); \ - asm( "ldq $4, %0 " :: "m" (b)); - -#define MULADDC_CORE \ - asm( "ldq $6, 0($1) " ); \ - asm( "addq $1, 8, $1 " ); \ - asm( "mulq $6, $4, $7 " ); \ - asm( "umulh $6, $4, $6 " ); \ - asm( "addq $7, $3, $7 " ); \ - asm( "cmpult $7, $3, $3 " ); \ - asm( "ldq $5, 0($2) " ); \ - asm( "addq $7, $5, $7 " ); \ - asm( "cmpult $7, $5, $5 " ); \ - asm( "stq $7, 0($2) " ); \ - asm( "addq $2, 8, $2 " ); \ - asm( "addq $6, $3, $3 " ); \ - asm( "addq $5, $3, $3 " ); - -#define MULADDC_STOP \ - asm( "stq $3, %0 " : "=m" (c)); \ - asm( "stq $2, %0 " : "=m" (d)); \ - asm( "stq $1, %0 " : "=m" (s) :: \ - "$1", "$2", "$3", "$4", "$5", "$6", "$7" ); - -#endif /* Alpha */ - -#if defined(__mips__) - -#define MULADDC_INIT \ - asm( "lw $10, %0 " :: "m" (s)); \ - asm( "lw $11, %0 " :: "m" (d)); \ - asm( "lw $12, %0 " :: "m" (c)); \ - asm( "lw $13, %0 " :: "m" (b)); - -#define MULADDC_CORE \ - asm( "lw $14, 0($10) " ); \ - asm( "multu $13, $14 " ); \ - asm( "addi $10, $10, 4 " ); \ - asm( "mflo $14 " ); \ - asm( "mfhi $9 " ); \ - asm( "addu $14, $12, $14 " ); \ - asm( "lw $15, 0($11) " ); \ - asm( "sltu $12, $14, $12 " ); \ - asm( "addu $15, $14, $15 " ); \ - asm( "sltu $14, $15, $14 " ); \ - asm( "addu $12, $12, $9 " ); \ - asm( "sw $15, 0($11) " ); \ - asm( "addu $12, $12, $14 " ); \ - asm( "addi $11, $11, 4 " ); - -#define MULADDC_STOP \ - asm( "sw $12, %0 " : "=m" (c)); \ - asm( "sw $11, %0 " : "=m" (d)); \ - asm( "sw $10, %0 " : "=m" (s) :: \ - "$9", "$10", "$11", "$12", "$13", "$14", "$15" ); - -#endif /* MIPS */ -#endif /* GNUC */ - -#if (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__) - -#define MULADDC_INIT \ - __asm mov esi, s \ - __asm mov edi, d \ - __asm mov ecx, c \ - __asm mov ebx, b - -#define MULADDC_CORE \ - __asm lodsd \ - __asm mul ebx \ - __asm add eax, ecx \ - __asm adc edx, 0 \ - __asm add eax, [edi] \ - __asm adc edx, 0 \ - __asm mov ecx, edx \ - __asm stosd - -#if defined(POLARSSL_HAVE_SSE2) - -#define EMIT __asm _emit - -#define MULADDC_HUIT \ - EMIT 0x0F EMIT 0x6E EMIT 0xC9 \ - EMIT 0x0F EMIT 0x6E EMIT 0xC3 \ - EMIT 0x0F EMIT 0x6E EMIT 0x1F \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ - EMIT 0x0F EMIT 0x6E EMIT 0x16 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \ - EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x04 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \ - EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x08 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \ - EMIT 0x0F EMIT 0x6E EMIT 0x7E EMIT 0x0C \ - EMIT 0x0F EMIT 0xF4 EMIT 0xF8 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCA \ - EMIT 0x0F EMIT 0x6E EMIT 0x5F EMIT 0x04 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xDC \ - EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x08 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xEE \ - EMIT 0x0F EMIT 0x6E EMIT 0x67 EMIT 0x0C \ - EMIT 0x0F EMIT 0xD4 EMIT 0xFC \ - EMIT 0x0F EMIT 0x7E EMIT 0x0F \ - EMIT 0x0F EMIT 0x6E EMIT 0x56 EMIT 0x10 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x14 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ - EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x18 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x04 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0x6E EMIT 0x5E EMIT 0x1C \ - EMIT 0x0F EMIT 0xF4 EMIT 0xD8 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCD \ - EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x10 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xD5 \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x08 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCF \ - EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x14 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xE5 \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x0C \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCA \ - EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x18 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xF5 \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x10 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCC \ - EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x1C \ - EMIT 0x0F EMIT 0xD4 EMIT 0xDD \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x14 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCE \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x18 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x1C \ - EMIT 0x83 EMIT 0xC7 EMIT 0x20 \ - EMIT 0x83 EMIT 0xC6 EMIT 0x20 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0x7E EMIT 0xC9 - -#define MULADDC_STOP \ - EMIT 0x0F EMIT 0x77 \ - __asm mov c, ecx \ - __asm mov d, edi \ - __asm mov s, esi \ - -#else - -#define MULADDC_STOP \ - __asm mov c, ecx \ - __asm mov d, edi \ - __asm mov s, esi \ - -#endif /* SSE2 */ -#endif /* MSVC */ - -#endif /* POLARSSL_HAVE_ASM */ - -#if !defined(MULADDC_CORE) -#if defined(POLARSSL_HAVE_LONGLONG) - -#define MULADDC_INIT \ -{ \ - t_udbl r; \ - t_uint r0, r1; - -#define MULADDC_CORE \ - r = *(s++) * (t_udbl) b; \ - r0 = r; \ - r1 = r >> biL; \ - r0 += c; r1 += (r0 < c); \ - r0 += *d; r1 += (r0 < *d); \ - c = r1; *(d++) = r0; - -#define MULADDC_STOP \ -} - -#else -#define MULADDC_INIT \ -{ \ - t_uint s0, s1, b0, b1; \ - t_uint r0, r1, rx, ry; \ - b0 = ( b << biH ) >> biH; \ - b1 = ( b >> biH ); - -#define MULADDC_CORE \ - s0 = ( *s << biH ) >> biH; \ - s1 = ( *s >> biH ); s++; \ - rx = s0 * b1; r0 = s0 * b0; \ - ry = s1 * b0; r1 = s1 * b1; \ - r1 += ( rx >> biH ); \ - r1 += ( ry >> biH ); \ - rx <<= biH; ry <<= biH; \ - r0 += rx; r1 += (r0 < rx); \ - r0 += ry; r1 += (r0 < ry); \ - r0 += c; r1 += (r0 < c); \ - r0 += *d; r1 += (r0 < *d); \ - c = r1; *(d++) = r0; - -#define MULADDC_STOP \ -} - -#endif /* C (generic) */ -#endif /* C (longlong) */ - -#endif /* bn_mul.h */ diff --git a/protocols/Tlen/src/crypto/polarssl/config.h b/protocols/Tlen/src/crypto/polarssl/config.h deleted file mode 100644 index 61500a75ee8..00000000000 --- a/protocols/Tlen/src/crypto/polarssl/config.h +++ /dev/null @@ -1,625 +0,0 @@ -/** - * \file config.h - * - * \brief Configuration options (set of defines) - * - * Copyright (C) 2006-2010, Brainspark B.V. - * - * This file is part of PolarSSL (http://www.polarssl.org) - * Lead Maintainer: Paul Bakker - * - * All rights reserved. - * - * 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * This set of compile-time options may be used to enable - * or disable features selectively, and reduce the global - * memory footprint. - */ -#ifndef POLARSSL_CONFIG_H -#define POLARSSL_CONFIG_H - -#ifndef _CRT_SECURE_NO_DEPRECATE -#define _CRT_SECURE_NO_DEPRECATE 1 -#endif - -/** - * \name SECTION: System support - * - * This section sets system specific settings. - * \{ - */ - -/** - * \def POLARSSL_HAVE_INT8 - * - * The system uses 8-bit wide native integers. - * - * Uncomment if native integers are 8-bit wide. -#define POLARSSL_HAVE_INT8 - */ - -/** - * \def POLARSSL_HAVE_INT16 - * - * The system uses 16-bit wide native integers. - * - * Uncomment if native integers are 16-bit wide. -#define POLARSSL_HAVE_INT16 - */ - -/** - * \def POLARSSL_HAVE_LONGLONG - * - * The compiler supports the use of long long. - * - * Uncomment if the compiler supports long long. -#define POLARSSL_HAVE_LONGLONG - */ - -/** - * \def POLARSSL_HAVE_ASM - * - * The compiler has support for asm() - * - * Uncomment to enable the use of assembly code. - * - * Requires support for asm() in compiler. - * - * Used in: - * library/timing.c - * library/padlock.c - * include/polarssl/bn_mul.h - * - */ -#define POLARSSL_HAVE_ASM - -/** - * \def POLARSSL_HAVE_SSE2 - * - * CPI supports SSE2 instruction set. - * - * Uncomment if the CPU supports SSE2 (IA-32 specific). - * -#define POLARSSL_HAVE_SSE2 - */ -/* \} name */ - -/** - * \name SECTION: PolarSSL feature support - * - * This section sets support for features that are or are not needed - * within the modules that are enabled. - * \{ - */ - -/** - * \def POLARSSL_AES_ROM_TABLES - * - * Store the AES tables in ROM. - * - * Uncomment this macro to store the AES tables in ROM. - * -#define POLARSSL_AES_ROM_TABLES - */ - -/** - * \def POLARSSL_CIPHER_MODE_CFB - * - * Enable Cipher Feedback mode (CFB) for symmetric ciphers. - */ -#define POLARSSL_CIPHER_MODE_CFB - -/** - * \def POLARSSL_CIPHER_MODE_CTR - * - * Enable Counter Block Cipher mode (CTR) for symmetric ciphers. - */ -#define POLARSSL_CIPHER_MODE_CTR - -/** - * \def POLARSSL_DEBUG_MSG - * - * Requires: POLARSSL_DEBUG_C - * - * Enable all SSL/TLS debugging messages. - */ -#define POLARSSL_DEBUG_MSG - -/** - * \def POLARSSL_GENPRIME - * - * Requires: POLARSSL_BIGNUM_C, POLARSSL_RSA_C - * - * Enable the RSA prime-number generation code. - */ -#define POLARSSL_GENPRIME - -/** - * \def POLARSSL_FS_IO - * - * Enable functions that use the filesystem. - */ -#define POLARSSL_FS_IO - -/** - * \def POLARSSL_PKCS1_V21 - * - * Requires: POLARSSL_MD_C, POLARSSL_RSA_C - * - * Enable support for PKCS#1 v2.1 encoding. - * This enables support for RSAES-OAEP and RSASSA-PSS operations. - */ -#define POLARSSL_PKCS1_V21 - -/** - * \def POLARSSL_RSA_NO_CRT - * - * Do not use the Chinese Remainder Theorem for the RSA private operation. - * - * Uncomment this macro to disable the use of CRT in RSA. - * -#define POLARSSL_RSA_NO_CRT - */ - -/** - * \def POLARSSL_SELF_TEST - * - * Enable the checkup functions (*_self_test). - */ -#define POLARSSL_SELF_TEST - -/** - * \def POLARSSL_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION - * - * If set, the X509 parser will not break-off when parsing an X509 certificate - * and encountering an unknown critical extension. - * - * Uncomment to prevent an error. - * -#define POLARSSL_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION - */ -/* \} name */ - -/** - * \name SECTION: PolarSSL modules - * - * This section enables or disables entire modules in PolarSSL - * \{ - */ - -/** - * \def POLARSSL_AES_C - * - * Enable the AES block cipher. - * - * Module: library/aes.c - * Caller: library/ssl_tls.c - * library/pem.c - * - * This module enables the following ciphersuites: - * SSL_RSA_AES_128_SHA - * SSL_RSA_AES_256_SHA - * SSL_EDH_RSA_AES_256_SHA - */ -#define POLARSSL_AES_C - -/** - * \def POLARSSL_ARC4_C - * - * Enable the ARCFOUR stream cipher. - * - * Module: library/arc4.c - * Caller: library/ssl_tls.c - * - * This module enables the following ciphersuites: - * SSL_RSA_RC4_128_MD5 - * SSL_RSA_RC4_128_SHA - */ -#define POLARSSL_ARC4_C - -/** - * \def POLARSSL_BASE64_C - * - * Enable the Base64 module. - * - * Module: library/base64.c - * Caller: library/pem.c - * - * This module is required for PEM support (required by X.509). - */ -#define POLARSSL_BASE64_C - -/** - * \def POLARSSL_BIGNUM_C - * - * Enable the multo-precision integer library. - * - * Module: library/bignum.c - * Caller: library/dhm.c - * library/rsa.c - * library/ssl_tls.c - * library/x509parse.c - * - * This module is required for RSA and DHM support. - */ -#define POLARSSL_BIGNUM_C - -/** - * \def POLARSSL_CAMELLIA_C - * - * Enable the Camellia block cipher. - * - * Module: library/camellia.c - * Caller: library/ssl_tls.c - * - * This module enabled the following cipher suites: - * SSL_RSA_CAMELLIA_128_SHA - * SSL_RSA_CAMELLIA_256_SHA - * SSL_EDH_RSA_CAMELLIA_256_SHA - */ -#define POLARSSL_CAMELLIA_C - -/** - * \def POLARSSL_CERTS_C - * - * Enable the test certificates. - * - * Module: library/certs.c - * Caller: - * - * This module is used for testing (ssl_client/server). - */ -#define POLARSSL_CERTS_C - -/** - * \def POLARSSL_CIPHER_C - * - * Enable the generic cipher layer. - * - * Module: library/cipher.c - * Caller: - * - * Uncomment to enable generic cipher wrappers. - */ -#define POLARSSL_CIPHER_C - -/** - * \def POLARSSL_DEBUG_C - * - * Enable the debug functions. - * - * Module: library/debug.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * - * This module provides debugging functions. - */ -#define POLARSSL_DEBUG_C - -/** - * \def POLARSSL_DES_C - * - * Enable the DES block cipher. - * - * Module: library/des.c - * Caller: library/ssl_tls.c - * - * This module enables the following ciphersuites: - * SSL_RSA_DES_168_SHA - * SSL_EDH_RSA_DES_168_SHA - */ -#define POLARSSL_DES_C - -/** - * \def POLARSSL_DHM_C - * - * Enable the Diffie-Hellman-Merkle key exchange. - * - * Module: library/dhm.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * - * This module enables the following ciphersuites: - * SSL_EDH_RSA_DES_168_SHA - * SSL_EDH_RSA_AES_256_SHA - * SSL_EDH_RSA_CAMELLIA_256_SHA - */ -#define POLARSSL_DHM_C - -/** - * \def POLARSSL_ERROR_C - * - * Enable error code to error string conversion. - * - * Module: library/error.c - * Caller: - * - * This module enables err_strerror(). - */ -#define POLARSSL_ERROR_C - -/** - * \def POLARSSL_HAVEGE_C - * - * Enable the HAVEGE random generator. - * - * Module: library/havege.c - * Caller: - * - * Requires: POLARSSL_TIMING_C - * - * This module enables the HAVEGE random number generator. - */ -#define POLARSSL_HAVEGE_C - -/** - * \def POLARSSL_MD_C - * - * Enable the generic message digest layer. - * - * Module: library/md.c - * Caller: - * - * Uncomment to enable generic message digest wrappers. - */ -#define POLARSSL_MD_C - -/** - * \def POLARSSL_MD2_C - * - * Enable the MD2 hash algorithm - * - * Module: library/md2.c - * Caller: library/x509parse.c - * - * Uncomment to enable support for (rare) MD2-signed X.509 certs. - * -#define POLARSSL_MD2_C - */ - -/** - * \def POLARSSL_MD4_C - * - * Enable the MD4 hash algorithm - * - * Module: library/md4.c - * Caller: library/x509parse.c - * - * Uncomment to enable support for (rare) MD4-signed X.509 certs. - * -#define POLARSSL_MD4_C - */ - -/** - * \def POLARSSL_MD5_C - * - * Enable the MD5 hash algorithm - * - * Module: library/md5.c - * Caller: library/ssl_tls.c - * library/x509parse.c - * - * This module is required for SSL/TLS and X.509. - */ -#define POLARSSL_MD5_C - -/** - * \def POLARSSL_NET_C - * - * Enable the TCP/IP networking routines. - * - * Module: library/net.c - * Caller: - * - * This module provides TCP/IP networking routines. - */ -#define POLARSSL_NET_C - -/** - * \def POLARSSL_PADLOCK_C - * - * Enable VIA Padlock support on x86. - * - * Module: library/padlock.c - * Caller: library/aes.c - * - * This modules adds support for the VIA PadLock on x86. - */ -#define POLARSSL_PADLOCK_C - -/** - * \def POLARSSL_PEM_C - * - * Enable PEM decoding - * - * Module: library/pem.c - * Caller: library/x509parse.c - * - * Requires: POLARSSL_BASE64_C - * - * This modules adds support for decoding PEM files. - */ -#define POLARSSL_PEM_C - -/** - * \def POLARSSL_PKCS11_C - * - * Enable support for PKCS#11 smartcard support. - * - * Module: library/ssl_srv.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * - * Requires: POLARSSL_SSL_TLS_C - * - * This module is required for SSL/TLS PKCS #11 smartcard support. - * Requires the presence of the PKCS#11 helper library (libpkcs11-helper) -#define POLARSSL_PKCS11_C - */ - -/** - * \def POLARSSL_RSA_C - * - * Enable the RSA public-key cryptosystem. - * - * Module: library/rsa.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * library/x509.c - * - * Requires: POLARSSL_BIGNUM_C - * - * This module is required for SSL/TLS and MD5-signed certificates. - */ -#define POLARSSL_RSA_C - -/** - * \def POLARSSL_SHA1_C - * - * Enable the SHA1 cryptographic hash algorithm. - * - * Module: library/sha1.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * library/x509parse.c - * - * This module is required for SSL/TLS and SHA1-signed certificates. - */ -#define POLARSSL_SHA1_C - -/** - * \def POLARSSL_SHA2_C - * - * Enable the SHA-224 and SHA-256 cryptographic hash algorithms. - * - * Module: library/sha2.c - * Caller: library/md_wrap.c - * library/x509parse.c - * - * This module adds support for SHA-224 and SHA-256. - */ -#define POLARSSL_SHA2_C - -/** - * \def POLARSSL_SHA4_C - * - * Enable the SHA-384 and SHA-512 cryptographic hash algorithms. - * - * Module: library/sha4.c - * Caller: library/md_wrap.c - * library/x509parse.c - * - * This module adds support for SHA-384 and SHA-512. - */ -#define POLARSSL_SHA4_C - -/** - * \def POLARSSL_SSL_CLI_C - * - * Enable the SSL/TLS client code. - * - * Module: library/ssl_cli.c - * Caller: - * - * Requires: POLARSSL_SSL_TLS_C - * - * This module is required for SSL/TLS client support. - */ -#define POLARSSL_SSL_CLI_C - -/* - * \def POLARSSL_SSL_SRV_C - * - * Enable the SSL/TLS server code. - * - * Module: library/ssl_srv.c - * Caller: - * - * Requires: POLARSSL_SSL_TLS_C - * - * This module is required for SSL/TLS server support. - */ -#define POLARSSL_SSL_SRV_C - -/** - * \def POLARSSL_SSL_TLS_C - * - * Enable the generic SSL/TLS code. - * - * Module: library/ssl_tls.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * - * Requires: POLARSSL_MD5_C, POLARSSL_SHA1_C, POLARSSL_X509_PARSE_C - * - * This module is required for SSL/TLS. - */ -#define POLARSSL_SSL_TLS_C - -/** - * \def POLARSSL_TIMING_C - * - * Enable the portable timing interface. - * - * Module: library/timing.c - * Caller: library/havege.c - * - * This module is used by the HAVEGE random number generator. - */ -#define POLARSSL_TIMING_C - -/** - * \def POLARSSL_VERSION_C - * - * Enable run-time version information. - * - * Module: library/version.c - * - * This module provides run-time version information. - */ -#define POLARSSL_VERSION_C - -/** - * \def POLARSSL_X509_PARSE_C - * - * Enable X.509 certificate parsing. - * - * Module: library/x509parse.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * - * Requires: POLARSSL_BIGNUM_C, POLARSSL_RSA_C - * - * This module is required for X.509 certificate parsing. - */ -#define POLARSSL_X509_PARSE_C - -/** - * \def POLARSSL_XTEA_C - * - * Enable the XTEA block cipher. - * - * Module: library/xtea.c - * Caller: - */ -#define POLARSSL_XTEA_C -/* \} name */ - -#endif /* config.h */ diff --git a/protocols/Tlen/src/crypto/polarssl/padlock.h b/protocols/Tlen/src/crypto/polarssl/padlock.h deleted file mode 100644 index 08fbe825c9a..00000000000 --- a/protocols/Tlen/src/crypto/polarssl/padlock.h +++ /dev/null @@ -1,100 +0,0 @@ -/** - * \file padlock.h - * - * \brief VIA PadLock ACE for HW encryption/decryption supported by some processors - * - * Copyright (C) 2006-2010, Brainspark B.V. - * - * This file is part of PolarSSL (http://www.polarssl.org) - * Lead Maintainer: Paul Bakker - * - * All rights reserved. - * - * 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ -#ifndef POLARSSL_PADLOCK_H -#define POLARSSL_PADLOCK_H - -#include "polarssl/aes.h" - -#define POLARSSL_ERR_PADLOCK_DATA_MISALIGNED -0x0030 /**< Input data should be aligned. */ - -#if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && defined(__i386__) - -#ifndef POLARSSL_HAVE_X86 -#define POLARSSL_HAVE_X86 -#endif - -#define PADLOCK_RNG 0x000C -#define PADLOCK_ACE 0x00C0 -#define PADLOCK_PHE 0x0C00 -#define PADLOCK_PMM 0x3000 - -#define PADLOCK_ALIGN16(x) (unsigned long *) (16 + ((long) x & ~15)) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief PadLock detection routine - * - * \param The feature to detect - * - * \return 1 if CPU has support for the feature, 0 otherwise - */ -int padlock_supports( int feature ); - -/** - * \brief PadLock AES-ECB block en(de)cryption - * - * \param ctx AES context - * \param mode AES_ENCRYPT or AES_DECRYPT - * \param input 16-byte input block - * \param output 16-byte output block - * - * \return 0 if success, 1 if operation failed - */ -int padlock_xcryptecb( aes_context *ctx, - int mode, - const unsigned char input[16], - unsigned char output[16] ); - -/** - * \brief PadLock AES-CBC buffer en(de)cryption - * - * \param ctx AES context - * \param mode AES_ENCRYPT or AES_DECRYPT - * \param length length of the input data - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if success, 1 if operation failed - */ -int padlock_xcryptcbc( aes_context *ctx, - int mode, - size_t length, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ); - -#ifdef __cplusplus -} -#endif - -#endif /* HAVE_X86 */ - -#endif /* padlock.h */ diff --git a/protocols/Tlen/src/resource.h b/protocols/Tlen/src/resource.h deleted file mode 100644 index 4ce70c58b26..00000000000 --- a/protocols/Tlen/src/resource.h +++ /dev/null @@ -1,145 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by Tlen.rc -// - -#define IDI_TLEN 100 -#define IDI_MAIL 101 -#define IDI_MUC 102 -#define IDI_CHATS 103 -#define IDI_VOICE 106 -#define IDI_MICROPHONE 107 -#define IDI_SPEAKER 108 -#define IDI_IMAGE 109 - -#define IDD_OPTIONS_BASIC 151 -#define IDD_OPTIONS_VOICE 152 -#define IDD_OPTIONS_POPUPS 153 -#define IDD_OPTIONS_ADVANCED 154 -#define IDD_USER_INFO 155 -#define IDD_USER_VCARD 156 -#define IDD_PASSWORD 157 -#define IDD_ADVSEARCH 158 -#define IDD_VOICE 159 -#define IDD_ACCEPT_VOICE 160 -#define IDD_USER_CHANGEAVATAR 161 -#define IDD_ACCMGRUI 162 - -#define IDC_TABS 1000 -#define IDC_EDIT_USERNAME 1001 -#define IDC_SAVE 1002 -#define IDC_EDIT_PASSWORD 1003 -#define IDC_EDIT_LOGIN_SERVER 1004 -#define IDC_INFO_JID 1007 -#define IDC_INFO_RESOURCE 1008 -#define IDC_SHOW_OFFLINE 1012 -#define IDC_OFFLINE_MESSAGE 1013 -#define IDC_OFFLINE_MESSAGE_OPTION 1014 -#define IDC_VISIBILITY_SUPPORT 1015 -#define IDC_NUDGE_SUPPORT 1016 -#define IDC_LOG_ALERTS 1017 - -#define IDC_SUBSCRIPTION 1039 -#define IDC_REGISTERACCOUNT 1040 -#define IDC_SIMPLE 1041 -#define IDC_KEEPALIVE 1042 -#define IDC_HOST 1043 -#define IDC_HOSTPORT 1044 -#define IDC_USE_SSL 1045 -#define IDC_SAVEPASSWORD 1048 -#define IDC_ROSTER_ALERTS 1049 -#define IDC_PASSWORD 1050 -#define IDC_RECONNECT 1050 -#define IDC_JID 1051 -#define IDC_ROSTER_SYNC 1052 -#define IDC_ALERT_POLICY 1053 -#define IDC_MUC_POLICY 1054 -#define IDC_VOICE_POLICY 1055 -#define IDC_IGNORE_ADVERTISEMENTS 1056 -#define IDC_AVATARS 1057 -#define IDC_VERSIONINFO 1058 -#define IDC_IMAGE_POLICY 1059 -#define IDC_CITY 1060 -#define IDC_FULLNAME 1061 -#define IDC_NICKNAME 1062 -#define IDC_FIRSTNAME 1063 -#define IDC_LASTNAME 1064 -#define IDC_BIRTH 1065 -#define IDC_AGE 1065 -#define IDC_OCCUPATION 1066 -#define IDC_EMAIL 1073 -#define IDC_GENDER 1096 -#define IDC_VOICECONVERSATIONS 1097 -#define IDC_PUBLICSTATUS 1098 -#define IDC_VCQUALITY 1100 -#define IDC_VUMETERIN 1101 -#define IDC_VUMETEROUT 1102 -#define IDC_BYTESIN 1103 -#define IDC_BYTESOUT 1104 -#define IDC_MICROPHONE 1105 -#define IDC_SPEAKER 1106 -#define IDC_ACCEPT 1107 - -#define IDC_FILE_PROXY_TYPE_LABEL 1108 -#define IDC_FILE_PROXY_TYPE 1109 -#define IDC_FILE_PROXY_HOST_LABEL 1110 -#define IDC_FILE_PROXY_HOST 1111 -#define IDC_FILE_PROXY_PORT_LABEL 1112 -#define IDC_FILE_PROXY_PORT 1113 -#define IDC_FILE_PROXY_USE_AUTH 1114 -#define IDC_FILE_PROXY_USER 1115 -#define IDC_FILE_PROXY_USER_LABEL 1116 -#define IDC_FILE_PROXY_PASSWORD_LABEL 1117 -#define IDC_FILE_PROXY_PASSWORD 1118 -#define IDC_FILE_USE_PROXY 1119 -#define IDC_VOICE_DEVICE_IN 1120 -#define IDC_VOICE_DEVICE_OUT 1121 - -#define IDC_MSG_ACK 1124 -#define IDC_SERVER 1125 -#define IDC_NICK 1129 -#define IDC_LIST 1133 -#define IDC_ENTER 1144 -#define IDC_AGEFROM 1152 -#define IDC_AGETO 1153 -#define IDC_LOOKFOR 1154 -#define IDC_SCHOOL 1155 -#define IDC_FROM 1175 -#define IDC_DELAY 1180 -#define IDC_COLORBKG 1181 -#define IDC_COLORTXT 1182 -#define IDC_PREVIEW 1183 -#define IDC_ENABLEPOPUP 1184 -#define IDC_DELAY_PERMANENT 1185 -#define IDC_DELAY_CUSTOM 1186 -#define IDC_DELAY_POPUP 1187 -#define IDC_TLEN 1190 -#define IDC_GENDER_TEXT 1195 -#define IDC_OCCUPATION_TEXT 1199 -#define IDC_LOOKFOR_TEXT 1200 -#define IDC_GROUP 1203 -#define IDC_SOFTWARE 1204 -#define IDC_VERSION 1205 -#define IDC_SYSTEM 1206 -#define IDC_AVATAR 1210 -#define IDC_SETAVATAR 1211 -#define IDC_DELETEAVATAR 1212 -#define IDC_AVATAR_LIST 1213 -#define IDC_OLD_AVATAR 1214 -#define IDC_BROWSEAVATAR 1215 -#define IDC_PUBLICAVATAR 1216 - -#define IDC_STATUS 1414 -#define IDC_PLAN 1415 -#define IDC_PERSONALGROUP 1434 -#define IDC_EXTRAGROUP 1435 -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 190 -#define _APS_NEXT_COMMAND_VALUE 40017 -#define _APS_NEXT_CONTROL_VALUE 1204 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/protocols/Tlen/src/stdafx.cxx b/protocols/Tlen/src/stdafx.cxx deleted file mode 100644 index b05ed73bc59..00000000000 --- a/protocols/Tlen/src/stdafx.cxx +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright (C) 2012-17 Miranda NG project (https://miranda-ng.org) - -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 . -*/ - -#include "stdafx.h" \ No newline at end of file diff --git a/protocols/Tlen/src/stdafx.h b/protocols/Tlen/src/stdafx.h deleted file mode 100644 index 079d700eb88..00000000000 --- a/protocols/Tlen/src/stdafx.h +++ /dev/null @@ -1,493 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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. - -*/ - -#ifndef _TLEN_H_ -#define _TLEN_H_ - -#define __try -#define __except(x) if (0) -#define __finally - -#define _try __try -#define _except __except -#define _finally __finally - -#ifdef _DEBUG -#define _CRTDBG_MAP_ALLOC -#include -#include -#endif -#define ENABLE_LOGGING - -/******************************************************************* - * Global compilation flags - *******************************************************************/ - -/******************************************************************* - * Global header files - *******************************************************************/ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "tlen_xml.h" -#include "crypto/polarssl/aes.h" -#include "crypto/polarssl/bignum.h" - -/******************************************************************* - * Global constants - *******************************************************************/ -#define TLEN_DEFAULT_PORT 443 -#define TLEN_IQID "mim_" -#define TLEN_REGISTER "http://reg.tlen.pl/" -#define TLEN_MAX_SEARCH_RESULTS_PER_PAGE 20 - -// User-defined message -#define WM_TLEN_REFRESH (WM_USER + 100) -// Error code -#define TLEN_ERROR_REDIRECT 302 -#define TLEN_ERROR_BAD_REQUEST 400 -#define TLEN_ERROR_UNAUTHORIZED 401 -#define TLEN_ERROR_PAYMENT_REQUIRED 402 -#define TLEN_ERROR_FORBIDDEN 403 -#define TLEN_ERROR_NOT_FOUND 404 -#define TLEN_ERROR_NOT_ALLOWED 405 -#define TLEN_ERROR_NOT_ACCEPTABLE 406 -#define TLEN_ERROR_REGISTRATION_REQUIRED 407 -#define TLEN_ERROR_REQUEST_TIMEOUT 408 -#define TLEN_ERROR_CONFLICT 409 -#define TLEN_ERROR_INTERNAL_SERVER_ERROR 500 -#define TLEN_ERROR_NOT_IMPLEMENTED 501 -#define TLEN_ERROR_REMOTE_SERVER_ERROR 502 -#define TLEN_ERROR_SERVICE_UNAVAILABLE 503 -#define TLEN_ERROR_REMOTE_SERVER_TIMEOUT 504 - -#define TLEN_ALERTS_ACCEPT_ALL 0 -#define TLEN_ALERTS_IGNORE_NIR 1 -#define TLEN_ALERTS_IGNORE_ALL 2 - -#define TLEN_IMAGES_ACCEPT_ALL 0 -#define TLEN_IMAGES_IGNORE_NIR 1 -#define TLEN_IMAGES_IGNORE_ALL 2 - -#define TLEN_MUC_ASK 0 -#define TLEN_MUC_ACCEPT_IR 1 -#define TLEN_MUC_ACCEPT_ALL 2 -#define TLEN_MUC_IGNORE_NIR 3 -#define TLEN_MUC_IGNORE_ALL 4 - -#define IDC_STATIC (-1) - -/******************************************************************* - * Global data structures and data type definitions - *******************************************************************/ - -typedef enum { - LIST_ROSTER, // Roster list - LIST_CHATROOM, // Groupchat room currently joined - LIST_FILE, // Current file transfer session - LIST_INVITATIONS,// Invitations to be sent - LIST_SEARCH, // Rooms names being searched - LIST_VOICE, - LIST_PICTURE -} TLEN_LIST; - -typedef enum { - IQ_PROC_NONE, - IQ_PROC_GETSEARCH -} TLEN_IQ_PROCID; - -typedef enum { - SUB_NONE, - SUB_TO, - SUB_FROM, - SUB_BOTH -} TLEN_SUBSCRIPTION; - -typedef struct { - char *szOnline; - char *szAway; - char *szNa; - char *szDnd; - char *szFreechat; - char *szInvisible; -} TLEN_MODEMSGS; - -typedef struct { - char mailBase[256]; - char mailMsg[256]; - int mailMsgMthd; - char mailIndex[256]; - int mailIndexMthd; - char mailLogin[256]; - int mailLoginMthd; - char mailCompose[256]; - int mailComposeMthd; - char avatarGet[256]; - int avatarGetMthd; - char avatarUpload[256]; - int avatarUploadMthd; - char avatarRemove[256]; - int avatarRemoveMthd; -} TlenConfiguration; - -typedef struct { - BOOL useEncryption; - BOOL reconnect; - BOOL rosterSync; - BOOL offlineAsInvisible; - BOOL leaveOfflineMessage; - int offlineMessageOption; - BOOL ignoreAdvertisements; - int alertPolicy; - int groupChatPolicy; - int voiceChatPolicy; - int imagePolicy; - BOOL enableAvatars; - BOOL enableVersion; - BOOL useNudge; - BOOL logAlerts; - BOOL useNewP2P; - BOOL sendKeepAlive; - BOOL savePassword; -} TlenOptions; - - -struct TLEN_IQ_FUNC_STRUCT; -struct TLEN_LIST_ITEM_STRUCT; -struct TLEN_VOICE_CONTROL_STRUCT; - -struct TlenProtocol : public PROTO -{ - TlenProtocol( const char*, const wchar_t* ); - ~TlenProtocol(); - - //==================================================================================== - // PROTO_INTERFACE - //==================================================================================== - - virtual MCONTACT __cdecl AddToList(int flags, PROTOSEARCHRESULT* psr); - virtual MCONTACT __cdecl AddToListByEvent(int flags, int iContact, MEVENT hDbEvent); - - virtual int __cdecl Authorize(MEVENT hDbEvent); - virtual int __cdecl AuthDeny(MEVENT hDbEvent, const wchar_t* szReason); - - virtual HANDLE __cdecl FileAllow(MCONTACT hContact, HANDLE hTransfer, const wchar_t* szPath); - virtual int __cdecl FileCancel(MCONTACT hContact, HANDLE hTransfer); - virtual int __cdecl FileDeny(MCONTACT hContact, HANDLE hTransfer, const wchar_t* szReason); - virtual int __cdecl FileResume(HANDLE hTransfer, int* action, const wchar_t** szFilename); - - virtual DWORD_PTR __cdecl GetCaps(int type, MCONTACT hContact = NULL); - virtual int __cdecl GetInfo(MCONTACT hContact, int infoType); - - virtual HANDLE __cdecl SearchBasic(const wchar_t* id); - virtual HANDLE __cdecl SearchByEmail(const wchar_t* email); - virtual HANDLE __cdecl SearchByName(const wchar_t* nick, const wchar_t* firstName, const wchar_t* lastName); - virtual HWND __cdecl SearchAdvanced(HWND owner); - virtual HWND __cdecl CreateExtendedSearchUI(HWND owner); - - virtual HANDLE __cdecl SendFile(MCONTACT hContact, const wchar_t* szDescription, wchar_t** ppszFiles); - virtual int __cdecl SendMsg(MCONTACT hContact, int flags, const char* msg); - - virtual int __cdecl SetApparentMode(MCONTACT hContact, int mode); - virtual int __cdecl SetStatus(int iNewStatus); - - virtual HANDLE __cdecl GetAwayMsg(MCONTACT hContact); - virtual int __cdecl RecvAwayMsg(MCONTACT hContact, int mode, PROTORECVEVENT* evt); - virtual int __cdecl SetAwayMsg(int iStatus, const wchar_t* msg); - - virtual int __cdecl UserIsTyping(MCONTACT hContact, int type); - - virtual int __cdecl OnEvent(PROTOEVENTTYPE iEventType, WPARAM wParam, LPARAM lParam); - - //==================================================================================== - // Services - - INT_PTR __cdecl GetName(WPARAM wParam, LPARAM lParam); - INT_PTR __cdecl GetAvatarInfo(WPARAM wParam, LPARAM lParam); - INT_PTR __cdecl SendAlert(WPARAM wParam, LPARAM lParam); - INT_PTR __cdecl GetAvatarCaps(WPARAM wParam, LPARAM lParam); - INT_PTR __cdecl SetMyAvatar(WPARAM wParam, LPARAM lParam); - INT_PTR __cdecl GetMyAvatar(WPARAM wParam, LPARAM lParam); - INT_PTR __cdecl GetStatus(WPARAM wParam, LPARAM lParam); - INT_PTR __cdecl AccMgrUI(WPARAM wParam, LPARAM lParam); - - INT_PTR __cdecl MUCMenuHandleChats(WPARAM wParam, LPARAM lParam); - INT_PTR __cdecl MUCMenuHandleMUC(WPARAM wParam, LPARAM lParam); - INT_PTR __cdecl MenuHandleInbox(WPARAM wParam, LPARAM lParam); - INT_PTR __cdecl ContactMenuHandleSendPicture(WPARAM wParam, LPARAM lParam); - INT_PTR __cdecl MUCContactMenuHandleMUC(WPARAM wParam, LPARAM lParam); - INT_PTR __cdecl VoiceContactMenuHandleVoice(WPARAM wParam, LPARAM lParam); - INT_PTR __cdecl ContactMenuHandleRequestAuth(WPARAM wParam, LPARAM lParam); - INT_PTR __cdecl ContactMenuHandleGrantAuth(WPARAM wParam, LPARAM lParam); - - //==================================================================================== - // Events - - int __cdecl OnModulesLoaded(WPARAM wParam, LPARAM lParam); - int __cdecl OptionsInit(WPARAM wParam, LPARAM lParam); - int __cdecl TlenDbSettingChanged(WPARAM wParam, LPARAM lParam); - int __cdecl TlenContactDeleted(WPARAM wParam, LPARAM lParam); - int __cdecl PrebuildContactMenu(WPARAM wParam, LPARAM lParam); - int __cdecl PreShutdown(WPARAM wParam, LPARAM lParam); - - int __cdecl UserInfoInit(WPARAM wParam, LPARAM lParam); - - int __cdecl MUCHandleEvent(WPARAM wParam, LPARAM lParam); - - //==================================================================================== - HNETLIBUSER hFileNetlibUser; - - TLEN_MODEMSGS modeMsgs; - - struct ThreadDataStruct *threadData; - HANDLE hTlenNudge; - HGENMENU hMenuMUC; - HGENMENU hMenuChats; - HGENMENU hMenuInbox; - HGENMENU hMenuContactMUC; - HGENMENU hMenuContactVoice; - HGENMENU hMenuContactGrantAuth; - HGENMENU hMenuContactRequestAuth; - HGENMENU hMenuPicture; - - int listsCount; - struct TLEN_LIST_ITEM_STRUCT *lists; - mir_cs csLists; - - int iqCount; - int iqAlloced; - struct TLEN_IQ_FUNC_STRUCT *iqList; - mir_cs csIqList; - - mir_cs csSerial; - unsigned int serial; - BOOL isOnline; - BOOL isConnected; - - mir_cs modeMsgMutex; - - void initMenuItems(); - HGENMENU hMenuRoot; - - char *searchJID; - int searchID; - int searchIndex; - char *searchQuery; - int searchQueryLen; - - mir_cs csSend; - - HWND voiceDlgHWND; - struct TLEN_VOICE_CONTROL_STRUCT *playbackControl; - struct TLEN_VOICE_CONTROL_STRUCT *recordingControl; - int framesAvailableForPlayback; - int availOverrunValue; - - TlenOptions tlenOptions; - -}; - - - -typedef struct ThreadDataStruct{ - HANDLE hThread; - char *streamId; - char username[128]; - char password[128]; - char server[128]; - char manualHost[128]; - char avatarToken[128]; - char avatarHash[64]; - int avatarFormat; - WORD port; - BOOL useEncryption; - - HNETLIBCONN s; - aes_context aes_in_context; - aes_context aes_out_context; - unsigned char aes_in_iv[16]; - unsigned char aes_out_iv[16]; - - BOOL useAES; - TlenConfiguration tlenConfig; - TlenProtocol *proto; -} ThreadData; - - -typedef enum { FT_CONNECTING, FT_INITIALIZING, FT_RECEIVING, FT_DONE, FT_ERROR, FT_DENIED, FT_SWITCH } TLEN_FILE_STATE; -typedef enum { FT_RECV, FT_SEND} TLEN_FILE_MODE; -typedef struct TLEN_FILE_TRANSFER_STRUCT{ - MCONTACT hContact; - HNETLIBCONN s; - NETLIBNEWCONNECTIONPROC_V2 pfnNewConnectionV2; - TLEN_FILE_STATE state; - char *jid; - int fileId; - char *iqId; - int mode; - - // Used by file receiving only - char *hostName; - WORD wPort; - char *localName; - WORD wLocalPort; - char *szSavePath; - long fileReceivedBytes; - long fileTotalSize; - - // Used by file sending only - HANDLE hFileEvent; - int fileCount; - char **files; - long *filesSize; - //long fileTotalSize; // Size of the current file (file being sent) - long allFileTotalSize; - long allFileReceivedBytes; - char *szDescription; - int currentFile; - - // New p2p - BOOL newP2P; - char *id2; - SOCKET udps; - aes_context aes_context; - unsigned char aes_iv[16]; - TlenProtocol *proto; - -} TLEN_FILE_TRANSFER; - -typedef struct { - PROTOSEARCHRESULT hdr; - char jid[256]; -} TLEN_SEARCH_RESULT; - -typedef struct { - char *iqId; - PROTOSEARCHRESULT hdr; - char jid[256]; -} TLEN_CONFERENCE; - - -typedef struct { - int id; - wchar_t *name; -} TLEN_FIELD_MAP; - - -/******************************************************************* - * Global variables - *******************************************************************/ -extern HINSTANCE hInst; -extern HANDLE hMainThread; - -/******************************************************************* - * Function declarations - *******************************************************************/ -HICON GetIcolibIcon(int iconId); -HANDLE GetIconHandle(int iconId); -void ReleaseIcolibIcon(HICON hIcon); - -void __cdecl TlenServerThread(ThreadData *info); -// tlen_ws.cpp -BOOL TlenWsInit(TlenProtocol *proto); -void TlenWsUninit(TlenProtocol *proto); -HNETLIBCONN TlenWsConnect(TlenProtocol *proto, char *host, WORD port); -int TlenWsSend(TlenProtocol *proto, HNETLIBCONN s, char *data, int datalen); -int TlenWsRecv(TlenProtocol *proto, HNETLIBCONN s, char *data, long datalen); -int TlenWsSendAES(TlenProtocol *proto, char *data, int datalen, aes_context *aes_ctx, unsigned char *aes_iv); -int TlenWsRecvAES(TlenProtocol *proto, char *data, long datalen, aes_context *aes_ctx, unsigned char *aes_iv); - -// tlen_util.cpp -void TlenSerialInit(TlenProtocol *proto); -unsigned int TlenSerialNext(TlenProtocol *proto); -int TlenSend(TlenProtocol *proto, const char *fmt, ...); -MCONTACT TlenHContactFromJID(TlenProtocol *proto, const char *jid); -char *TlenJIDFromHContact(TlenProtocol *proto, MCONTACT hContact); -char *TlenLoginFromJID(const char *jid); -char *TlenResourceFromJID(const char *jid); -char *TlenNickFromJID(const char *jid); -char *TlenLocalNickFromJID(const char *jid); -char *TlenGroupEncode(const char *str); -char *TlenGroupDecode(const char *str); -char *TlenSha1(char *str); -char *TlenSha1(char *str, int len); -char *TlenPasswordHash(const char *str); -void TlenUrlDecode(char *str); -char *TlenUrlEncode(const char *str); -char *TlenTextEncode(const char *str); -char *TlenTextDecode(const char *str); -void TlenLogMessage(TlenProtocol *proto, MCONTACT hContact, DWORD flags, const char *message); -BOOL IsAuthorized(TlenProtocol *proto, const char *jid); -//char *TlenGetVersionText(); -time_t TlenIsoToUnixTime(char *stamp); -time_t TlenTimeToUTC(time_t time); -void TlenSendPresence(TlenProtocol *proto,int status); -void TlenStringAppend(char **str, int *sizeAlloced, const char *fmt, ...); -//char *TlenGetClientJID(char *jid); -// tlen_misc.cpp -void TlenDBAddEvent(TlenProtocol *proto, MCONTACT hContact, int eventType, DWORD flags, PBYTE pBlob, DWORD cbBlob); -void TlenDBAddAuthRequest(TlenProtocol *proto, char *jid, char *nick); -MCONTACT TlenDBCreateContact(TlenProtocol *proto, char *jid, char *nick, BOOL temporary); -// tlen_svc.cpp -int TlenRunSearch(TlenProtocol *proto); -// tlen_opt.cpp -void TlenLoadOptions(TlenProtocol *proto); -// tlen_voice.cpp -int TlenVoiceCancelAll(TlenProtocol *proto); -// tlen_advsearch.cpp -extern TLEN_FIELD_MAP tlenFieldGender[]; -extern TLEN_FIELD_MAP tlenFieldLookfor[]; -extern TLEN_FIELD_MAP tlenFieldStatus[]; -extern TLEN_FIELD_MAP tlenFieldOccupation[]; -extern TLEN_FIELD_MAP tlenFieldPlan[]; -// tlen_advsearch.cpp -INT_PTR CALLBACK TlenAdvSearchDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); -char *TlenAdvSearchCreateQuery(HWND hwndDlg, int iqId); - - -#endif diff --git a/protocols/Tlen/src/tlen.cpp b/protocols/Tlen/src/tlen.cpp deleted file mode 100644 index 452a641a0a4..00000000000 --- a/protocols/Tlen/src/tlen.cpp +++ /dev/null @@ -1,370 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" -#include "commons.h" -#include "tlen_muc.h" -#include "tlen_file.h" -#include "tlen_voice.h" -#include "tlen_list.h" -#include "tlen_iq.h" -#include "resource.h" -#include "tlen_picture.h" -#include -#include -#include -#include - -CLIST_INTERFACE *pcli; -int hLangpack; -HINSTANCE hInst; -HANDLE hMainThread; - -PLUGININFOEX pluginInfo = { - sizeof(PLUGININFOEX), - __PLUGIN_NAME, - PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM), - __DESCRIPTION, - __AUTHOR, - __AUTHOREMAIL, - __COPYRIGHT, - __AUTHORWEB, - UNICODE_AWARE, - // {748F8934-781A-528D-5208-001265404AB3} - {0x748f8934, 0x781a, 0x528d, {0x52, 0x08, 0x00, 0x12, 0x65, 0x40, 0x4a, 0xb3}} -}; - -// Main tlen server connection thread global variables - -BOOL WINAPI DllMain(HINSTANCE hModule, DWORD, LPVOID) -{ - hInst = hModule; - return TRUE; -} - -extern "C" __declspec(dllexport) PLUGININFOEX *MirandaPluginInfoEx(DWORD) -{ - return &pluginInfo; -} - -extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = { MIID_PROTOCOL, MIID_LAST }; - -static IconItem iconList[] = -{ - { LPGEN("Protocol icon"), "PROTO", IDI_TLEN }, - { LPGEN("Tlen inbox"), "MAIL", IDI_MAIL }, - { LPGEN("Group chats"), "MUC", IDI_MUC }, - { LPGEN("Tlen chats"), "CHATS", IDI_CHATS }, - { LPGEN("Voice chat"), "VOICE", IDI_VOICE }, - { LPGEN("Microphone"), "MICROPHONE", IDI_MICROPHONE }, - { LPGEN("Speaker"), "SPEAKER", IDI_SPEAKER }, - { LPGEN("Send image"), "IMAGE", IDI_IMAGE } -}; - -HANDLE GetIconHandle(int iconId) -{ - for (int i = 0; i < _countof(iconList); i++) - if (iconList[i].defIconID == iconId) - return iconList[i].hIcolib; - - return nullptr; -} - -HICON GetIcolibIcon(int iconId) -{ - HANDLE handle = GetIconHandle(iconId); - if (handle != nullptr) - return IcoLib_GetIconByHandle(handle); - - return nullptr; -} - -void ReleaseIcolibIcon(HICON hIcon) -{ - IcoLib_ReleaseIcon(hIcon); -} - -static void TlenRegisterIcons() -{ - Icon_Register(hInst, "Protocols/Tlen", iconList, _countof(iconList), "TLEN"); -} - -int TlenProtocol::PrebuildContactMenu(WPARAM hContact, LPARAM) -{ - if (hContact != NULL && isOnline) { - DBVARIANT dbv; - if (!db_get(hContact, m_szModuleName, "jid", &dbv)) { - TLEN_LIST_ITEM *item = TlenListGetItemPtr(this, LIST_ROSTER, dbv.pszVal); - db_free(&dbv); - if (item != nullptr) { - Menu_ShowItem(hMenuContactRequestAuth, item->subscription == SUB_NONE || item->subscription == SUB_FROM); - Menu_ShowItem(hMenuContactGrantAuth, item->subscription == SUB_NONE || item->subscription == SUB_TO); - Menu_ShowItem(hMenuContactMUC, item->status != ID_STATUS_OFFLINE); - Menu_ShowItem(hMenuContactVoice, item->status != ID_STATUS_OFFLINE && !TlenVoiceIsInUse(this)); - Menu_ShowItem(hMenuPicture, item->status != ID_STATUS_OFFLINE); - return 0; - } - } - } - - Menu_ShowItem(hMenuContactMUC, false); - Menu_ShowItem(hMenuContactVoice, false); - Menu_ShowItem(hMenuContactRequestAuth, false); - Menu_ShowItem(hMenuContactGrantAuth, false); - return 0; -} - -INT_PTR TlenProtocol::ContactMenuHandleRequestAuth(WPARAM hContact, LPARAM) -{ - if (hContact != NULL && isOnline) { - DBVARIANT dbv; - if (!db_get(hContact, m_szModuleName, "jid", &dbv)) { - TlenSend(this, "", dbv.pszVal); - db_free(&dbv); - } - } - return 0; -} - -INT_PTR TlenProtocol::ContactMenuHandleGrantAuth(WPARAM hContact, LPARAM) -{ - if (hContact != NULL && isOnline) { - DBVARIANT dbv; - if (!db_get(hContact, m_szModuleName, "jid", &dbv)) { - TlenSend(this, "", dbv.pszVal); - db_free(&dbv); - } - } - return 0; -} - -INT_PTR TlenProtocol::ContactMenuHandleSendPicture(WPARAM hContact, LPARAM) -{ - if (hContact != NULL && isOnline) - SendPicture(this, hContact); - return 0; -} - -INT_PTR TlenProtocol::MenuHandleInbox(WPARAM, LPARAM) -{ - char szFileName[MAX_PATH]; - DBVARIANT dbv; - NETLIBHTTPREQUEST req; - NETLIBHTTPHEADER headers[2]; - NETLIBHTTPREQUEST *resp; - char *login = nullptr, *password = nullptr; - char form[1024]; - char cookie[1024]; - if (!db_get(NULL, m_szModuleName, "LoginName", &dbv)) { - login = mir_strdup(dbv.pszVal); - db_free(&dbv); - } - - if (db_get_b(NULL, m_szModuleName, "SavePassword", TRUE) == TRUE) - password = db_get_sa(NULL, m_szModuleName, "Password"); - else if (threadData != nullptr && mir_strlen(threadData->password) > 0) - password = mir_strdup(threadData->password); - - memset(&cookie, 0, sizeof(cookie)); - if (login != nullptr && password != nullptr) { - mir_snprintf(form, "username=%s&password=%s", login, password); - headers[0].szName = "Content-Type"; - headers[0].szValue = "application/x-www-form-urlencoded"; - memset(&req, 0, sizeof(req)); - req.cbSize = sizeof(req); - req.requestType = REQUEST_POST; - req.flags = 0; - req.headersCount = 1; - req.headers = headers; - req.pData = form; - req.dataLength = (int)mir_strlen(form); - req.szUrl = "http://poczta.o2.pl/login.html"; - resp = Netlib_HttpTransaction(m_hNetlibUser, &req); - if (resp != nullptr) { - if (resp->resultCode / 100 == 2 || resp->resultCode == 302) { - int i; - for (i = 0; i < resp->headersCount; i++) { - if (strcmpi(resp->headers[i].szName, "Set-Cookie") == 0) { - char *start = strstr(resp->headers[i].szValue, "ssid="); - if (start != nullptr) { - char *end = strstr(resp->headers[i].szValue, ";"); - start = start + 5; - if (end == nullptr) { - end = resp->headers[i].szValue + mir_strlen(resp->headers[i].szValue); - } - strncpy(cookie, start, (end - start)); - break; - } - } - } - } - Netlib_FreeHttpRequest(resp); - } - } - mir_free(login); - mir_free(password); - - mir_snprintf(szFileName, "http://poczta.o2.pl/login.html?sid=%s", cookie); - Utils_OpenUrl(szFileName); - return 0; -} - -int TlenProtocol::OnModulesLoaded(WPARAM, LPARAM) -{ - /* Set all contacts to offline */ - for (MCONTACT hContact = db_find_first(m_szModuleName); hContact; hContact = db_find_next(hContact, m_szModuleName)) - if (db_get_w(hContact, m_szModuleName, "Status", ID_STATUS_OFFLINE) != ID_STATUS_OFFLINE) - db_set_w(hContact, m_szModuleName, "Status", ID_STATUS_OFFLINE); - - Skin_AddSound("TlenMailNotify", m_tszUserName, LPGENW("Incoming mail")); - Skin_AddSound("TlenAlertNotify", m_tszUserName, LPGENW("Alert")); - Skin_AddSound("TlenVoiceNotify", m_tszUserName, LPGENW("Voice chat")); - - HookProtoEvent(ME_USERINFO_INITIALISE, &TlenProtocol::UserInfoInit); - return 0; -} - - -int TlenProtocol::PreShutdown(WPARAM, LPARAM) -{ - debugLogA("TLEN TlenPreShutdown"); - return 0; -} - -void TlenProtocol::initMenuItems() -{ - char text[MAX_PATH]; - strncpy_s(text, m_szModuleName, _TRUNCATE); - char *pSvcName = text + mir_strlen(text); - - CMenuItem mi; - mi.root = hMenuRoot = Menu_CreateRoot(MO_MAIN, m_tszUserName, -1999901009, GetIconHandle(IDI_TLEN)); - mi.pszService = text; - - hMenuChats = nullptr; - - // "Multi-User Conference" - SET_UID(mi,0x4984828, 0x2066, 0x43da, 0x87, 0x9e, 0x71, 0x23, 0xc6, 0xe2, 0x46, 0xd5); - mir_strcpy(pSvcName, "/MainMenuMUC"); - CreateProtoService(pSvcName, &TlenProtocol::MUCMenuHandleMUC); - mi.name.a = LPGEN("Multi-User Conference"); - mi.position = 2000050002; - mi.hIcolibItem = GetIconHandle(IDI_MUC); - mi.pszService = text; - hMenuMUC = Menu_AddMainMenuItem(&mi); - - SET_UID(mi, 0x594133f1, 0xc5b1, 0x4825, 0xa3, 0x8d, 0x33, 0x0, 0x33, 0x74, 0x3a, 0x29); - mir_strcpy(pSvcName, "/MainMenuInbox"); - CreateProtoService(pSvcName, &TlenProtocol::MenuHandleInbox); - mi.name.a = LPGEN("Tlen Mail"); - mi.position = 2000050003; - mi.hIcolibItem = GetIconHandle(IDI_MAIL); - mi.pszService = text; - hMenuInbox = Menu_AddMainMenuItem(&mi); - - // contact menu items - mi.root = nullptr; - - // "Send picture" - SET_UID(mi, 0x12c66fb1, 0x6e57, 0x4acd, 0x90, 0x16, 0xc, 0x83, 0xae, 0x16, 0xe3, 0x12); - mi.pszService = "/SendPicture"; - CreateProtoService(mi.pszService, &TlenProtocol::ContactMenuHandleSendPicture); - mi.name.a = LPGEN("Send picture"); - mi.position = -2000019030; - mi.hIcolibItem = GetIconHandle(IDI_IMAGE); - hMenuPicture = Menu_AddContactMenuItem(&mi, m_szModuleName); - - // "Invite to MUC" - SET_UID(mi, 0x4728c863, 0xe95f, 0x4203, 0x9b, 0xe8, 0x1, 0xbf, 0x5e, 0x57, 0x88, 0x43); - mi.pszService = "/ContactMenuMUC"; - CreateProtoService(mi.pszService, &TlenProtocol::MUCContactMenuHandleMUC); - mi.name.a = LPGEN("Multi-User Conference"); - mi.position = -2000019020; - mi.hIcolibItem = GetIconHandle(IDI_MUC); - hMenuContactMUC = Menu_AddContactMenuItem(&mi, m_szModuleName); - - // "Invite to voice chat" - SET_UID(mi, 0x53f919b6, 0x313c, 0x4ed4, 0x96, 0xbc, 0xf6, 0xa2, 0x67, 0x10, 0x7b, 0xa2); - mi.pszService = "/ContactMenuVoice"; - CreateProtoService(mi.pszService, &TlenProtocol::VoiceContactMenuHandleVoice); - mi.name.a = LPGEN("Voice Chat"); - mi.position = -2000019010; - mi.hIcolibItem = GetIconHandle(IDI_VOICE); - hMenuContactVoice = Menu_AddContactMenuItem(&mi, m_szModuleName); - - // "Request authorization" - SET_UID(mi, 0x36375a1f, 0xc142, 0x4d6e, 0xa6, 0x57, 0xe4, 0x76, 0x5d, 0xbc, 0x59, 0x8e); - mi.pszService = "/RequestAuth"; - CreateProtoService(mi.pszService, &TlenProtocol::ContactMenuHandleRequestAuth); - mi.name.a = LPGEN("Request authorization"); - mi.position = -2000001001; - mi.hIcolibItem = Skin_GetIconHandle(SKINICON_AUTH_REQUEST); - hMenuContactRequestAuth = Menu_AddContactMenuItem(&mi, m_szModuleName); - - // "Grant authorization" - SET_UID(mi, 0x4c90452a, 0x869a, 0x4a81, 0xaf, 0xa8, 0x28, 0x34, 0xaf, 0x2b, 0x6b, 0x30); - mi.pszService = "/GrantAuth"; - CreateProtoService(mi.pszService, &TlenProtocol::ContactMenuHandleGrantAuth); - mi.name.a = LPGEN("Grant authorization"); - mi.position = -2000001000; - mi.hIcolibItem = Skin_GetIconHandle(SKINICON_AUTH_GRANT); - hMenuContactGrantAuth = Menu_AddContactMenuItem(&mi, m_szModuleName); -} - -TlenProtocol* tlenProtoInit(const char* pszProtoName, const wchar_t* tszUserName) -{ - TlenProtocol* ppro = new TlenProtocol(pszProtoName, tszUserName); - return ppro; -} - -static int tlenProtoUninit(TlenProtocol* ppro) -{ - delete ppro; - return 0; -} - -extern "C" int __declspec(dllexport) Load(void) -{ - mir_getLP(&pluginInfo); - pcli = Clist_GetInterface(); - - DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &hMainThread, THREAD_SET_CONTEXT, FALSE, 0); - - srand((unsigned)time(nullptr)); - - TlenRegisterIcons(); - - // Register protocol module - PROTOCOLDESCRIPTOR pd = { 0 }; - pd.cbSize = sizeof(pd); - pd.szName = "TLEN"; - pd.fnInit = (pfnInitProto)tlenProtoInit; - pd.fnUninit = (pfnUninitProto)tlenProtoUninit; - pd.type = PROTOTYPE_PROTOCOL; - Proto_RegisterModule(&pd); - return 0; -} - -extern "C" int __declspec(dllexport) Unload(void) -{ - return 0; -} diff --git a/protocols/Tlen/src/tlen_advsearch.cpp b/protocols/Tlen/src/tlen_advsearch.cpp deleted file mode 100644 index a8fe15d7893..00000000000 --- a/protocols/Tlen/src/tlen_advsearch.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" -#include "resource.h" - -static void InitComboBox(HWND hwndCombo, TLEN_FIELD_MAP *fieldMap) -{ - int i, n; - - n = SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM)L""); - SendMessage(hwndCombo, CB_SETITEMDATA, n, 0); - SendMessage(hwndCombo, CB_SETCURSEL, n, 0); - for (i=0;;i++) { - if (fieldMap[i].name == nullptr) - break; - n = SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM) TranslateW(fieldMap[i].name)); - SendMessage(hwndCombo, CB_SETITEMDATA, n, fieldMap[i].id); - } -} - -INT_PTR CALLBACK TlenAdvSearchDlgProc(HWND hwndDlg, UINT msg, WPARAM, LPARAM) -{ - switch(msg) { - case WM_INITDIALOG: - TranslateDialogDefault(hwndDlg); - InitComboBox(GetDlgItem(hwndDlg, IDC_GENDER), tlenFieldGender); - InitComboBox(GetDlgItem(hwndDlg, IDC_LOOKFOR), tlenFieldLookfor); - InitComboBox(GetDlgItem(hwndDlg, IDC_STATUS), tlenFieldStatus); - InitComboBox(GetDlgItem(hwndDlg, IDC_OCCUPATION), tlenFieldOccupation); - InitComboBox(GetDlgItem(hwndDlg, IDC_PLAN), tlenFieldPlan); - return TRUE; - } - return FALSE; -} - -static void FetchField(HWND hwndDlg, UINT idCtrl, char *fieldName, char **str, int *strSize) -{ - char text[512]; - char *localFieldName, *localText; - - if (hwndDlg == nullptr || fieldName == nullptr || str == nullptr || strSize == nullptr) - return; - GetDlgItemTextA(hwndDlg, idCtrl, text, _countof(text)); - if (text[0]) { - if ((localFieldName=TlenTextEncode(fieldName)) != nullptr) { - if ((localText=TlenTextEncode(text)) != nullptr) { - TlenStringAppend(str, strSize, "<%s>%s", localFieldName, localText, localFieldName); - mir_free(localText); - } - mir_free(localFieldName); - } - } -} - -static void FetchCombo(HWND hwndDlg, UINT idCtrl, char *fieldName, char **str, int *strSize) -{ - int value; - char *localFieldName; - - if (hwndDlg == nullptr || fieldName == nullptr || str == nullptr || strSize == nullptr) - return; - value = (int) SendDlgItemMessage(hwndDlg, idCtrl, CB_GETITEMDATA, SendDlgItemMessage(hwndDlg, idCtrl, CB_GETCURSEL, 0, 0), 0); - if (value > 0) { - if ((localFieldName=TlenTextEncode(fieldName)) != nullptr) { - TlenStringAppend(str, strSize, "<%s>%d", localFieldName, value, localFieldName); - mir_free(localFieldName); - } - } -} - -char *TlenAdvSearchCreateQuery(HWND hwndDlg, int) -{ - char *str; - int strSize; - - if (hwndDlg == nullptr) return nullptr; - str = nullptr; - FetchField(hwndDlg, IDC_FIRSTNAME, "first", &str, &strSize); - FetchField(hwndDlg, IDC_LASTNAME, "last", &str, &strSize); - FetchField(hwndDlg, IDC_NICK, "nick", &str, &strSize); - FetchField(hwndDlg, IDC_EMAIL, "email", &str, &strSize); - FetchCombo(hwndDlg, IDC_GENDER, "s", &str, &strSize); - FetchField(hwndDlg, IDC_AGEFROM, "d", &str, &strSize); - FetchField(hwndDlg, IDC_AGETO, "u", &str, &strSize); - FetchField(hwndDlg, IDC_CITY, "c", &str, &strSize); - FetchCombo(hwndDlg, IDC_OCCUPATION, "j", &str, &strSize); - FetchField(hwndDlg, IDC_SCHOOL, "e", &str, &strSize); - FetchCombo(hwndDlg, IDC_STATUS, "m", &str, &strSize); - FetchCombo(hwndDlg, IDC_LOOKFOR, "r", &str, &strSize); - FetchCombo(hwndDlg, IDC_PLAN, "p", &str, &strSize); - return str; -} diff --git a/protocols/Tlen/src/tlen_avatar.cpp b/protocols/Tlen/src/tlen_avatar.cpp deleted file mode 100644 index 998265a326d..00000000000 --- a/protocols/Tlen/src/tlen_avatar.cpp +++ /dev/null @@ -1,434 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" -#include "tlen_list.h" -#include "tlen_avatar.h" -#include -#include -#include -#include -#include - -/* TlenGetAvatarFileName() - gets a file name for the avatar image */ - -void TlenGetAvatarFileName(TlenProtocol *proto, TLEN_LIST_ITEM *item, wchar_t* ptszDest, int cbLen) -{ - int tPathLen = mir_snwprintf(ptszDest, cbLen, TEXT("%s\\%S"), VARSW(TEXT("%miranda_avatarcache%")), proto->m_szModuleName); - if (_waccess(ptszDest, 0)) { - int ret = CreateDirectoryTreeW(ptszDest); - if (ret == 0) - proto->debugLogW(L"getAvatarFilename(): Created new directory for avatar cache: %s.", ptszDest); - else { - proto->debugLogW(L"getAvatarFilename(): Can not create directory for avatar cache: %s. errno=%d: %s", ptszDest, errno, strerror(errno)); - wchar_t buffer[512]; - mir_snwprintf(buffer, TranslateT("Cannot create avatars cache directory. ERROR: %d: %s\n%s"), errno, _wcserror(errno), ptszDest); - PUShowMessageT(buffer, SM_WARNING); - } - } - - int format = PA_FORMAT_PNG; - - ptszDest[tPathLen++] = '\\'; - if (item != nullptr) - format = item->avatarFormat; - else if (proto->threadData != nullptr) - format = proto->threadData->avatarFormat; - else - format = db_get_dw(NULL, proto->m_szModuleName, "AvatarFormat", PA_FORMAT_UNKNOWN); - - const wchar_t *tszFileType = ProtoGetAvatarExtension(format); - if (item != nullptr) - mir_snwprintf(ptszDest + tPathLen, MAX_PATH - tPathLen, TEXT("%S%s"), ptrA(TlenSha1(item->jid)), tszFileType); - else - mir_snwprintf(ptszDest + tPathLen, MAX_PATH - tPathLen, TEXT("%S_avatar%s"), proto->m_szModuleName, tszFileType); -} - -static void RemoveAvatar(TlenProtocol *proto, MCONTACT hContact) -{ - wchar_t tFileName[MAX_PATH]; - if (hContact == NULL) - proto->threadData->avatarHash[0] = '\0'; - - TlenGetAvatarFileName(proto, nullptr, tFileName, _countof(tFileName) - 1); - DeleteFile(tFileName); - db_unset(hContact, "ContactPhoto", "File"); - db_unset(hContact, proto->m_szModuleName, "AvatarHash"); - db_unset(hContact, proto->m_szModuleName, "AvatarFormat"); - ProtoBroadcastAck(proto->m_szModuleName, NULL, ACKTYPE_AVATAR, ACKRESULT_STATUS, nullptr, 0); -} - -static void SetAvatar(TlenProtocol *proto, MCONTACT hContact, TLEN_LIST_ITEM *item, char *data, int len, DWORD format) -{ - wchar_t filename[MAX_PATH]; - char md5[33]; - mir_md5_state_t ctx; - DWORD digest[4]; - - if (format == PA_FORMAT_UNKNOWN && len > 4) - format = ProtoGetBufferFormat(data); - - mir_md5_init(&ctx); - mir_md5_append(&ctx, (BYTE*)data, len); - mir_md5_finish(&ctx, (BYTE*)digest); - - sprintf(md5, "%08x%08x%08x%08x", (int)htonl(digest[0]), (int)htonl(digest[1]), (int)htonl(digest[2]), (int)htonl(digest[3])); //!!!!!!!!!!!!!! - if (item != nullptr) { - char *hash = item->avatarHash; - item->avatarFormat = format; - item->avatarHash = mir_strdup(md5); - mir_free(hash); - } - else { - proto->threadData->avatarFormat = format; - mir_strcpy(proto->threadData->avatarHash, md5); - } - TlenGetAvatarFileName(proto, item, filename, _countof(filename) - 1); - DeleteFile(filename); - FILE *out = _wfopen(filename, TEXT("wb")); - if (out != nullptr) { - fwrite(data, len, 1, out); - fclose(out); - db_set_ws(hContact, "ContactPhoto", "File", filename); - db_set_s(hContact, proto->m_szModuleName, "AvatarHash", md5); - db_set_dw(hContact, proto->m_szModuleName, "AvatarFormat", format); - } - else { - wchar_t buffer[128]; - mir_snwprintf(buffer, TranslateT("Cannot save new avatar file \"%s\" Error:\n\t%s (Error: %d)"), filename, _wcserror(errno), errno); - PUShowMessageT(buffer, SM_WARNING); - proto->debugLogW(buffer); - return; - } - ProtoBroadcastAck(proto->m_szModuleName, hContact, ACKTYPE_AVATAR, ACKRESULT_STATUS, nullptr, 0); -} - -int TlenProcessAvatarNode(TlenProtocol *proto, XmlNode *avatarNode, TLEN_LIST_ITEM *item) -{ - XmlNode *aNode; - char *oldHash = nullptr; - char *md5 = nullptr, *type = nullptr; - MCONTACT hContact = NULL; - if (item != nullptr) - if ((hContact = TlenHContactFromJID(proto, item->jid)) == NULL) - return 0; - - if (item == nullptr) - oldHash = proto->threadData->avatarHash; - else - oldHash = item->avatarHash; - - if (avatarNode != nullptr) { - aNode = TlenXmlGetChild(avatarNode, "a"); - if (aNode != nullptr) { - type = TlenXmlGetAttrValue(aNode, "type"); - md5 = TlenXmlGetAttrValue(aNode, "md5"); - } - } - - if (md5 != nullptr) { - /* check contact's avatar hash - md5 */ - if (oldHash == nullptr || mir_strcmp(oldHash, md5)) { - if (item != nullptr) { - item->newAvatarDownloading = TRUE; - } - TlenGetAvatar(proto, hContact); - return 1; - } - } - else { - /* remove avatar */ - if (oldHash != nullptr) { - if (item != nullptr) { - item->avatarHash = nullptr; - mir_free(oldHash); - item->newAvatarDownloading = FALSE; - } - RemoveAvatar(proto, hContact); - return 1; - } - } - return 0; -} - -void TlenProcessPresenceAvatar(TlenProtocol *proto, XmlNode *node, TLEN_LIST_ITEM *item) -{ - MCONTACT hContact=TlenHContactFromJID(proto, item->jid); - if (hContact != NULL) - TlenProcessAvatarNode(proto, TlenXmlGetChild(node, "avatar"), item); -} - -static char *replaceTokens(const char *base, const char *uri, const char *login, const char* token, int type, int access) -{ - char *result; - int i, l, size; - l = (int)mir_strlen(uri); - size = (int)mir_strlen(base); - for (i = 0; i < l; ) { - if (!strncmp(uri + i, "^login^", 7)) { - size += (int)mir_strlen(login); - i += 7; - } else if (!strncmp(uri + i, "^type^", 6)) { - size++; - i += 6; - } else if (!strncmp(uri + i, "^token^", 7)) { - size += (int)mir_strlen(token); - i += 7; - } else if (!strncmp(uri + i, "^access^", 8)) { - size++; - i += 8; - } else { - size++; - i++; - } - } - result = (char *)mir_alloc(size +1); - mir_strcpy(result, base); - size = (int)mir_strlen(base); - for (i = 0; i < l; ) { - if (!strncmp(uri + i, "^login^", 7)) { - mir_strcpy(result + size, login); - size += (int)mir_strlen(login); - i += 7; - } else if (!strncmp(uri + i, "^type^", 6)) { - result[size++] = '0' + type; - i += 6; - } else if (!strncmp(uri + i, "^token^", 7)) { - mir_strcpy(result + size, token); - size += (int)mir_strlen(token); - i += 7; - } else if (!strncmp(uri + i, "^access^", 8)) { - result[size++] = '0' + access; - i += 8; - } else { - result[size++] = uri[i++]; - } - } - result[size] = '\0'; - return result; -} - -static int getAvatarMutex = 0; - -struct TLENGETAVATARTHREADDATA -{ - TlenProtocol *proto; - MCONTACT hContact; -}; - -static void TlenGetAvatarThread(void *ptr) -{ - TLEN_LIST_ITEM *item = nullptr; - TLENGETAVATARTHREADDATA *data = (TLENGETAVATARTHREADDATA *)ptr; - MCONTACT hContact = data->hContact; - char *login = nullptr; - if (hContact != NULL) { - char *jid = TlenJIDFromHContact(data->proto, hContact); - login = TlenNickFromJID(jid); - item = TlenListGetItemPtr(data->proto, LIST_ROSTER, jid); - mir_free(jid); - } - else { - if (data->proto->threadData != nullptr) - login = mir_strdup(data->proto->threadData->username); - } - - if ((data->proto->threadData != nullptr && hContact == NULL) || item != nullptr) { - DWORD format = PA_FORMAT_UNKNOWN; - if (item != nullptr) - item->newAvatarDownloading = TRUE; - - char *request = replaceTokens(data->proto->threadData->tlenConfig.mailBase, data->proto->threadData->tlenConfig.avatarGet, login, data->proto->threadData->avatarToken, 0, 0); - NETLIBHTTPREQUEST req; - memset(&req, 0, sizeof(req)); - req.cbSize = sizeof(req); - req.requestType = data->proto->threadData->tlenConfig.avatarGetMthd; - req.flags = 0; - req.headersCount = 0; - req.headers = nullptr; - req.dataLength = 0; - req.szUrl = request; - NETLIBHTTPREQUEST *resp = Netlib_HttpTransaction(data->proto->m_hNetlibUser, &req); - if (item != nullptr) - item->newAvatarDownloading = FALSE; - - if (resp != nullptr) { - if (resp->resultCode/100 == 2) { - if (resp->dataLength > 0) { - for (int i=0; iheadersCount; i++ ) { - if (!strcmpi(resp->headers[i].szName, "Content-Type")) { - format = ProtoGetAvatarFormatByMimeType(_A2T(resp->headers[i].szValue)); - break; - } - } - SetAvatar(data->proto, hContact, item, resp->pData, resp->dataLength, format); - } - else RemoveAvatar(data->proto, hContact); - } - Netlib_FreeHttpRequest(resp); - } - mir_free(request); - mir_free(login); - } - - if (hContact == NULL) - getAvatarMutex = 0; - - mir_free(login); - mir_free(data); -} - -void TlenGetAvatar(TlenProtocol *proto, MCONTACT hContact) -{ - if (hContact == NULL) { - if (getAvatarMutex != 0) - return; - - getAvatarMutex = 1; - } - - TLENGETAVATARTHREADDATA *data = (TLENGETAVATARTHREADDATA *)mir_alloc(sizeof(TLENGETAVATARTHREADDATA)); - data->proto = proto; - data->hContact = hContact; - mir_forkthread(TlenGetAvatarThread, data); -} - -struct TLENREMOVEAVATARTHREADDATA -{ - TlenProtocol *proto; - NETLIBHTTPREQUEST *req; -}; - -static void TlenRemoveAvatarRequestThread(void *ptr) { - TLENREMOVEAVATARTHREADDATA *data = (TLENREMOVEAVATARTHREADDATA*)ptr; - NETLIBHTTPREQUEST *req = (NETLIBHTTPREQUEST *)data->req; - NETLIBHTTPREQUEST *resp = Netlib_HttpTransaction(data->proto->m_hNetlibUser, req); - mir_free(req->szUrl); - mir_free(req->headers); - mir_free(req->pData); - mir_free(req); - if (resp != nullptr) { - Netlib_FreeHttpRequest(resp); - RemoveAvatar(data->proto, NULL); - } - mir_free(data); - -} - -struct TLENUPLOADAVATARTHREADDATA -{ - TlenProtocol *proto; - NETLIBHTTPREQUEST *req; - char *data; - int length; -}; - -boolean checkUploadAvatarResponse(TlenProtocol *proto, NETLIBHTTPREQUEST *resp) -{ - if (resp == nullptr) { - proto->debugLogA("Error while setting avatar on Tlen account (no response)"); - PUShowMessageT(TranslateT("Error while setting avatar on Tlen account (no response)"), SM_WARNING); - return false; - } - if (resp->resultCode != 200 || !resp->dataLength || !resp->pData) { - proto->debugLogA("Error while setting avatar on Tlen account (invalid response) resultCode=%d, dataLength=%d", resp->resultCode, resp->dataLength); - PUShowMessageT(TranslateT("Error while setting avatar on Tlen account (invalid response)"), SM_WARNING); - return false; - } - if (strncmp(resp->pData, "debugLogA("Error while setting avatar on Tlen account: %s", resp->pData); - PUShowMessageT(TranslateT("Error while setting avatar on Tlen account"), SM_WARNING); - return false; - } - return true; -} - -static void TlenUploadAvatarRequestThread(void *ptr) -{ - TLENUPLOADAVATARTHREADDATA *data = (TLENUPLOADAVATARTHREADDATA *) ptr; - NETLIBHTTPREQUEST *req = data->req; - NETLIBHTTPREQUEST *resp = Netlib_HttpTransaction(data->proto->m_hNetlibUser, req); - if (checkUploadAvatarResponse(data->proto, resp)) { - Netlib_FreeHttpRequest(resp); - SetAvatar(data->proto, NULL, nullptr, data->data, data->length, PA_FORMAT_PNG); - } - mir_free(req->szUrl); - mir_free(req->headers); - mir_free(req->pData); - mir_free(req); - mir_free(data->data); - mir_free(data); -} - -void TlenRemoveAvatar(TlenProtocol *proto) -{ - if (proto->threadData != nullptr) { - TLENREMOVEAVATARTHREADDATA *data = (TLENREMOVEAVATARTHREADDATA *)mir_alloc(sizeof(TLENREMOVEAVATARTHREADDATA)); - NETLIBHTTPREQUEST *req = (NETLIBHTTPREQUEST *)mir_alloc(sizeof(NETLIBHTTPREQUEST)); - data->proto = proto; - data->req = req; - char *request = replaceTokens(proto->threadData->tlenConfig.mailBase, proto->threadData->tlenConfig.avatarRemove, "", proto->threadData->avatarToken, 0, 0); - memset(req, 0, sizeof(NETLIBHTTPREQUEST)); - req->cbSize = sizeof(NETLIBHTTPREQUEST); - req->requestType = proto->threadData->tlenConfig.avatarGetMthd; - req->szUrl = request; - mir_forkthread(TlenRemoveAvatarRequestThread, data); - } -} - -void TlenUploadAvatar(TlenProtocol *proto, unsigned char *data, int dataLen, int access) -{ - NETLIBHTTPHEADER *headers; - unsigned char *buffer; - if (proto->threadData != nullptr && dataLen > 0 && data != nullptr) { - char *mpartHead = "--AaB03x\r\nContent-Disposition: form-data; name=\"filename\"; filename=\"plik.png\"\r\nContent-Type: image/png\r\n\r\n"; - char *mpartTail = "\r\n--AaB03x--\r\n"; - int size, sizeHead = (int)mir_strlen(mpartHead), sizeTail = (int)mir_strlen(mpartTail); - char *request = replaceTokens(proto->threadData->tlenConfig.mailBase, proto->threadData->tlenConfig.avatarUpload, "", proto->threadData->avatarToken, 0, access); - TLENUPLOADAVATARTHREADDATA *threadData = (TLENUPLOADAVATARTHREADDATA *)mir_alloc(sizeof(TLENUPLOADAVATARTHREADDATA)); - threadData->proto = proto; - NETLIBHTTPREQUEST *req = (NETLIBHTTPREQUEST *)mir_alloc(sizeof(NETLIBHTTPREQUEST)); - headers = (NETLIBHTTPHEADER *)mir_alloc(sizeof(NETLIBHTTPHEADER)); - memset(req, 0, sizeof(NETLIBHTTPREQUEST)); - req->cbSize = sizeof(NETLIBHTTPREQUEST); - req->requestType = proto->threadData->tlenConfig.avatarUploadMthd; - req->szUrl = request; - req->flags = 0; - headers[0].szName = "Content-Type"; - headers[0].szValue = "multipart/form-data; boundary=AaB03x"; - req->headersCount = 1; - req->headers = headers; - size = dataLen + sizeHead + sizeTail; - buffer = (unsigned char *)mir_alloc(size); - memcpy(buffer, mpartHead, sizeHead); - memcpy(buffer + sizeHead, data, dataLen); - memcpy(buffer + sizeHead + dataLen, mpartTail, sizeTail); - req->dataLength = size; - req->pData = (char*)buffer; - threadData->req = req; - threadData->data = (char*)mir_alloc(dataLen); - memcpy(threadData->data, data, dataLen); - threadData->length = dataLen; - mir_forkthread(TlenUploadAvatarRequestThread, threadData); - } -} - diff --git a/protocols/Tlen/src/tlen_avatar.h b/protocols/Tlen/src/tlen_avatar.h deleted file mode 100644 index d994713a54a..00000000000 --- a/protocols/Tlen/src/tlen_avatar.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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. - -*/ - -#ifndef _TLEN_AVATAR_H_ -#define _TLEN_AVATAR_H_ - -void TlenProcessPresenceAvatar(TlenProtocol *proto, XmlNode *node, TLEN_LIST_ITEM *item); -int TlenProcessAvatarNode(TlenProtocol *proto, XmlNode *avatarNode, TLEN_LIST_ITEM *item); -void TlenGetAvatarFileName(TlenProtocol *proto, TLEN_LIST_ITEM *item, wchar_t* psztDest, int cbLen); -void TlenGetAvatar(TlenProtocol *proto, MCONTACT hContact); -void TlenUploadAvatar(TlenProtocol *proto, unsigned char *data, int dataLen, int access); -void TlenRemoveAvatar(TlenProtocol *proto); - -#endif // _TLEN_AVATAR_H_ diff --git a/protocols/Tlen/src/tlen_file.cpp b/protocols/Tlen/src/tlen_file.cpp deleted file mode 100644 index d80baba3e64..00000000000 --- a/protocols/Tlen/src/tlen_file.cpp +++ /dev/null @@ -1,682 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" -#include -#include -#include -#include -#include "tlen_list.h" -#include "tlen_p2p_old.h" - -static void TlenFileReceiveParse(TLEN_FILE_TRANSFER *ft) -{ - int i; - char *p; - TLEN_FILE_PACKET *rpacket = nullptr, *packet; - if (ft->state == FT_CONNECTING) { - rpacket = TlenP2PPacketReceive(ft->s); - if (rpacket != nullptr) { - p = rpacket->packet; - if (rpacket->type == TLEN_FILE_PACKET_FILE_LIST) { // list of files (length & name) - ft->fileCount = (int)(*((DWORD*)p)); - ft->files = (char **)mir_alloc(sizeof(char *) * ft->fileCount); - ft->filesSize = (long *)mir_alloc(sizeof(long) * ft->fileCount); - ft->currentFile = 0; - ft->allFileTotalSize = 0; - ft->allFileReceivedBytes = 0; - p += sizeof(DWORD); - for (i = 0; i < ft->fileCount; i++) { - ft->filesSize[i] = (long)(*((DWORD*)p)); - ft->allFileTotalSize += ft->filesSize[i]; - p += sizeof(DWORD); - ft->files[i] = (char *)mir_alloc(256); - memcpy(ft->files[i], p, 256); - p += 256; - } - - if ((packet = TlenP2PPacketCreate(3 * sizeof(DWORD))) == nullptr) - ft->state = FT_ERROR; - else { - TlenP2PPacketSetType(packet, TLEN_FILE_PACKET_FILE_LIST_ACK); - TlenP2PPacketSend(ft->s, packet); - TlenP2PPacketFree(packet); - ft->state = FT_INITIALIZING; - ft->proto->debugLogA("Change to FT_INITIALIZING"); - } - } - TlenP2PPacketFree(rpacket); - } - else ft->state = FT_ERROR; - } - else if (ft->state == FT_INITIALIZING) { - char *fullFileName; - if ((packet = TlenP2PPacketCreate(3 * sizeof(DWORD))) != nullptr) { - TlenP2PPacketSetType(packet, TLEN_FILE_PACKET_FILE_REQUEST); // file request - TlenP2PPacketPackDword(packet, ft->currentFile); - TlenP2PPacketPackDword(packet, 0); - TlenP2PPacketPackDword(packet, 0); - TlenP2PPacketSend(ft->s, packet); - TlenP2PPacketFree(packet); - - fullFileName = (char *)mir_alloc(mir_strlen(ft->szSavePath) + mir_strlen(ft->files[ft->currentFile]) + 2); - mir_strcpy(fullFileName, ft->szSavePath); - if (fullFileName[mir_strlen(fullFileName) - 1] != '\\') - mir_strcat(fullFileName, "\\"); - mir_strcat(fullFileName, ft->files[ft->currentFile]); - ft->fileId = _open(fullFileName, _O_BINARY | _O_WRONLY | _O_CREAT | _O_TRUNC, _S_IREAD | _S_IWRITE); - ft->fileReceivedBytes = 0; - ft->fileTotalSize = ft->filesSize[ft->currentFile]; - ft->proto->debugLogA("Saving to [%s] [%d]", fullFileName, ft->filesSize[ft->currentFile]); - mir_free(fullFileName); - ft->state = FT_RECEIVING; - ft->proto->debugLogA("Change to FT_RECEIVING"); - } - else ft->state = FT_ERROR; - } - else if (ft->state == FT_RECEIVING) { - PROTOFILETRANSFERSTATUS pfts; - memset(&pfts, 0, sizeof(PROTOFILETRANSFERSTATUS)); - pfts.cbSize = sizeof(PROTOFILETRANSFERSTATUS); - pfts.hContact = ft->hContact; - pfts.pszFiles = ft->files; - pfts.totalFiles = ft->fileCount; - pfts.currentFileNumber = ft->currentFile; - pfts.totalBytes = ft->allFileTotalSize; - pfts.szWorkingDir = nullptr; - pfts.szCurrentFile = ft->files[ft->currentFile]; - pfts.currentFileSize = ft->filesSize[ft->currentFile]; - pfts.currentFileTime = 0; - ft->proto->debugLogA("Receiving data..."); - while (ft->state == FT_RECEIVING) { - rpacket = TlenP2PPacketReceive(ft->s); - if (rpacket != nullptr) { - p = rpacket->packet; - if (rpacket->type == TLEN_FILE_PACKET_FILE_DATA) { // file data - int writeSize; - writeSize = rpacket->len - 2 * sizeof(DWORD); // skip file offset - if (_write(ft->fileId, p + 2 * sizeof(DWORD), writeSize) != writeSize) { - ft->state = FT_ERROR; - } - else { - ft->fileReceivedBytes += writeSize; - ft->allFileReceivedBytes += writeSize; - pfts.totalProgress = ft->allFileReceivedBytes; - pfts.currentFileProgress = ft->fileReceivedBytes; - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&pfts); - } - } - else if (rpacket->type == TLEN_FILE_PACKET_END_OF_FILE) { // end of file - _close(ft->fileId); - ft->proto->debugLogA("Finishing this file..."); - if (ft->currentFile >= ft->fileCount - 1) { - ft->state = FT_DONE; - } - else { - ft->currentFile++; - ft->state = FT_INITIALIZING; - ft->proto->debugLogA("File received, advancing to the next file..."); - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, ft, 0); - } - } - TlenP2PPacketFree(rpacket); - } - else ft->state = FT_ERROR; - } - } -} - -static void TlenFileReceivingConnection(HNETLIBCONN hConnection, DWORD, void * pExtra) -{ - TlenProtocol *proto = (TlenProtocol *)pExtra; - TLEN_FILE_TRANSFER *ft = TlenP2PEstablishIncomingConnection(proto, hConnection, LIST_FILE, TRUE); - if (ft != nullptr) { - HNETLIBCONN slisten = ft->s; - ft->s = hConnection; - ft->proto->debugLogA("Set ft->s to %d (saving %d)", hConnection, slisten); - ft->proto->debugLogA("Entering send loop for this file connection... (ft->s is hConnection)"); - while (ft->state != FT_DONE && ft->state != FT_ERROR) - TlenFileReceiveParse(ft); - - if (ft->state == FT_DONE) - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, ft, 0); - else - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); - ft->proto->debugLogA("Closing connection for this file transfer... (ft->s is now hBind)"); - ft->s = slisten; - ft->proto->debugLogA("ft->s is restored to %d", ft->s); - - if (ft->s != hConnection) - Netlib_CloseHandle(hConnection); - if (ft->hFileEvent != nullptr) - SetEvent(ft->hFileEvent); - } - else Netlib_CloseHandle(hConnection); -} - -static void __cdecl TlenFileReceiveThread(void *arg) -{ - TLEN_FILE_TRANSFER *ft = (TLEN_FILE_TRANSFER *)arg; - ft->proto->debugLogA("Thread started: type=file_receive server='%s' port='%d'", ft->hostName, ft->wPort); - ft->mode = FT_RECV; - - NETLIBOPENCONNECTION nloc = { sizeof(nloc) }; - nloc.szHost = ft->hostName; - nloc.wPort = ft->wPort; - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTING, ft, 0); - HNETLIBCONN s = Netlib_OpenConnection(ft->proto->m_hNetlibUser, &nloc); - if (s != nullptr) { - ft->s = s; - ft->proto->debugLogA("Entering file receive loop"); - TlenP2PEstablishOutgoingConnection(ft, TRUE); - while (ft->state != FT_DONE && ft->state != FT_ERROR) - TlenFileReceiveParse(ft); - - if (ft->s) { - Netlib_CloseHandle(s); - ft->s = nullptr; - } - } - else { - ft->pfnNewConnectionV2 = TlenFileReceivingConnection; - ft->proto->debugLogA("Connection failed - receiving as server"); - s = TlenP2PListen(ft); - if (s != nullptr) { - ft->s = s; - HANDLE hEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); - ft->hFileEvent = hEvent; - ft->currentFile = 0; - ft->state = FT_CONNECTING; - char *nick = TlenNickFromJID(ft->jid); - TlenSend(ft->proto, "", nick, ft->iqId, ft->localName, ft->wLocalPort); - mir_free(nick); - ft->proto->debugLogA("Waiting for the file to be received..."); - WaitForSingleObject(hEvent, INFINITE); - ft->hFileEvent = nullptr; - CloseHandle(hEvent); - ft->proto->debugLogA("Finish all files"); - Netlib_CloseHandle(s); - } - else { - ft->state = FT_ERROR; - } - } - TlenListRemove(ft->proto, LIST_FILE, ft->iqId); - if (ft->state == FT_DONE) - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, ft, 0); - else { - char *nick = TlenNickFromJID(ft->jid); - TlenSend(ft->proto, "", nick, ft->iqId); - mir_free(nick); - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); - } - - ft->proto->debugLogA("Thread ended: type=file_receive server='%s'", ft->hostName); - TlenP2PFreeFileTransfer(ft); -} - - - -static void TlenFileSendParse(TLEN_FILE_TRANSFER *ft) -{ - int i; - char *p, *t; - int currentFile, numRead; - char *fileBuffer; - TLEN_FILE_PACKET *packet; - - if (ft->state == FT_CONNECTING) { - char filename[256]; // Must be 256 (0x100) - if ((packet = TlenP2PPacketCreate(sizeof(DWORD) + (ft->fileCount*(sizeof(filename) + sizeof(DWORD))))) != nullptr) { - // Must pause a bit, sending these two packets back to back - // will break the session because the receiver cannot take it :) - SleepEx(1000, TRUE); - TlenP2PPacketSetLen(packet, 0); // Reuse packet - TlenP2PPacketSetType(packet, TLEN_FILE_PACKET_FILE_LIST); - TlenP2PPacketPackDword(packet, (DWORD)ft->fileCount); - for (i = 0; i < ft->fileCount; i++) { - // struct _stat statbuf; - // _stat(ft->files[i], &statbuf); - // TlenP2PPacketPackDword(packet, statbuf.st_size); - TlenP2PPacketPackDword(packet, ft->filesSize[i]); - memset(filename, 0, sizeof(filename)); - if ((t = strrchr(ft->files[i], '\\')) != nullptr) - t++; - else - t = ft->files[i]; - strncpy_s(filename, t, _TRUNCATE); - TlenP2PPacketPackBuffer(packet, filename, sizeof(filename)); - } - TlenP2PPacketSend(ft->s, packet); - TlenP2PPacketFree(packet); - - ft->allFileReceivedBytes = 0; - ft->state = FT_INITIALIZING; - ft->proto->debugLogA("Change to FT_INITIALIZING"); - } - else ft->state = FT_ERROR; - } - else if (ft->state == FT_INITIALIZING) { // FT_INITIALIZING - TLEN_FILE_PACKET *rpacket = TlenP2PPacketReceive(ft->s); - ft->proto->debugLogA("FT_INITIALIZING: recv %d", rpacket); - if (rpacket == nullptr) { - ft->state = FT_ERROR; - return; - } - ft->proto->debugLogA("FT_INITIALIZING: recv type %d", rpacket->type); - p = rpacket->packet; - // TYPE: TLEN_FILE_PACKET_FILE_LIST_ACK will be ignored - // LEN: 0 - /*if (rpacket->type == TLEN_FILE_PACKET_FILE_LIST_ACK) { - - } - // Then the receiver will request each file - // TYPE: TLEN_FILE_PACKET_REQUEST - // LEN: - // (DWORD) file number - // (DWORD) 0 - // (DWORD) 0 - else */if (rpacket->type == TLEN_FILE_PACKET_FILE_REQUEST) { - PROTOFILETRANSFERSTATUS pfts; - //struct _stat statbuf; - - currentFile = *((DWORD*)p); - if (currentFile != ft->currentFile) { - ft->proto->debugLogA("Requested file (#%d) is invalid (must be %d)", currentFile, ft->currentFile); - ft->state = FT_ERROR; - } - else { - // _stat(ft->files[currentFile], &statbuf); // file size in statbuf.st_size - ft->proto->debugLogA("Sending [%s] [%d]", ft->files[currentFile], ft->filesSize[currentFile]); - if ((ft->fileId = _open(ft->files[currentFile], _O_BINARY | _O_RDONLY)) < 0) { - ft->proto->debugLogA("File cannot be opened"); - ft->state = FT_ERROR; - } - else { - memset(&pfts, 0, sizeof(PROTOFILETRANSFERSTATUS)); - pfts.cbSize = sizeof(PROTOFILETRANSFERSTATUS); - pfts.hContact = ft->hContact; - pfts.flags = PFTS_SENDING; - pfts.pszFiles = ft->files; - pfts.totalFiles = ft->fileCount; - pfts.currentFileNumber = ft->currentFile; - pfts.totalBytes = ft->allFileTotalSize; - pfts.szWorkingDir = nullptr; - pfts.szCurrentFile = ft->files[ft->currentFile]; - pfts.currentFileSize = ft->filesSize[ft->currentFile]; //statbuf.st_size; - pfts.currentFileTime = 0; - ft->fileReceivedBytes = 0; - if ((packet = TlenP2PPacketCreate(2 * sizeof(DWORD) + 2048)) == nullptr) { - ft->state = FT_ERROR; - } - else { - TlenP2PPacketSetType(packet, TLEN_FILE_PACKET_FILE_DATA); - fileBuffer = (char *)mir_alloc(2048); - ft->proto->debugLogA("Sending file data..."); - while ((numRead = _read(ft->fileId, fileBuffer, 2048)) > 0) { - TlenP2PPacketSetLen(packet, 0); // Reuse packet - TlenP2PPacketPackDword(packet, (DWORD)ft->fileReceivedBytes); - TlenP2PPacketPackDword(packet, 0); - TlenP2PPacketPackBuffer(packet, fileBuffer, numRead); - if (TlenP2PPacketSend(ft->s, packet)) { - ft->fileReceivedBytes += numRead; - ft->allFileReceivedBytes += numRead; - pfts.totalProgress = ft->allFileReceivedBytes; - pfts.currentFileProgress = ft->fileReceivedBytes; - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&pfts); - } - else { - ft->state = FT_ERROR; - break; - } - } - mir_free(fileBuffer); - _close(ft->fileId); - if (ft->state != FT_ERROR) { - if (ft->currentFile >= ft->fileCount - 1) - ft->state = FT_DONE; - else { - ft->currentFile++; - ft->state = FT_INITIALIZING; - ft->proto->debugLogA("File sent, advancing to the next file..."); - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, ft, 0); - } - } - ft->proto->debugLogA("Finishing this file..."); - TlenP2PPacketSetLen(packet, 0); // Reuse packet - TlenP2PPacketSetType(packet, TLEN_FILE_PACKET_END_OF_FILE); - TlenP2PPacketPackDword(packet, currentFile); - TlenP2PPacketSend(ft->s, packet); - TlenP2PPacketFree(packet); - } - } - } - TlenP2PPacketFree(rpacket); - } - else { - TlenP2PPacketFree(rpacket); - ft->state = FT_ERROR; - } - } -} - -static void TlenFileSendingConnection(HNETLIBCONN hConnection, DWORD, void * pExtra) -{ - HNETLIBCONN slisten; - TlenProtocol *proto = (TlenProtocol *)pExtra; - - TLEN_FILE_TRANSFER *ft = TlenP2PEstablishIncomingConnection(proto, hConnection, LIST_FILE, TRUE); - if (ft != nullptr) { - slisten = ft->s; - ft->s = hConnection; - ft->proto->debugLogA("Set ft->s to %d (saving %d)", hConnection, slisten); - - ft->proto->debugLogA("Entering send loop for this file connection... (ft->s is hConnection)"); - while (ft->state != FT_DONE && ft->state != FT_ERROR) { - TlenFileSendParse(ft); - } - if (ft->state == FT_DONE) - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, ft, 0); - else - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); - ft->proto->debugLogA("Closing connection for this file transfer... (ft->s is now hBind)"); - ft->s = slisten; - ft->proto->debugLogA("ft->s is restored to %d", ft->s); - - if (ft->s != hConnection) - Netlib_CloseHandle(hConnection); - if (ft->hFileEvent != nullptr) - SetEvent(ft->hFileEvent); - } - else Netlib_CloseHandle(hConnection); -} - -int TlenFileCancelAll(TlenProtocol *proto) -{ - HANDLE hEvent; - int i = 0; - - while ((i = TlenListFindNext(proto, LIST_FILE, 0)) >= 0) { - TLEN_LIST_ITEM *item = TlenListGetItemPtrFromIndex(proto, i); - if (item != nullptr) { - TLEN_FILE_TRANSFER *ft = item->ft; - TlenListRemoveByIndex(proto, i); - if (ft != nullptr) { - if (ft->s) { - //ProtoBroadcastAck(m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); - ft->proto->debugLogA("Closing ft->s = %d", ft->s); - ft->state = FT_ERROR; - Netlib_CloseHandle(ft->s); - ft->s = nullptr; - if (ft->hFileEvent != nullptr) { - hEvent = ft->hFileEvent; - ft->hFileEvent = nullptr; - SetEvent(hEvent); - } - } - else { - ft->proto->debugLogA("freeing ft struct"); - TlenP2PFreeFileTransfer(ft); - } - } - } - } - return 0; -} - -static void __cdecl TlenFileSendingThread(void *arg) -{ - TLEN_FILE_TRANSFER *ft = (TLEN_FILE_TRANSFER *)arg; - char *nick; - - ft->proto->debugLogA("Thread started: type=tlen_file_send"); - ft->mode = FT_SEND; - ft->pfnNewConnectionV2 = TlenFileSendingConnection; - HNETLIBCONN s = TlenP2PListen(ft); - if (s != nullptr) { - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTING, ft, 0); - ft->s = s; - //TlenLog("ft->s = %d", s); - //TlenLog("fileCount = %d", ft->fileCount); - - HANDLE hEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); - ft->hFileEvent = hEvent; - ft->currentFile = 0; - ft->state = FT_CONNECTING; - - nick = TlenNickFromJID(ft->jid); - TlenSend(ft->proto, "", nick, ft->iqId, ft->localName, ft->wLocalPort); - mir_free(nick); - ft->proto->debugLogA("Waiting for the file to be sent..."); - WaitForSingleObject(hEvent, INFINITE); - ft->hFileEvent = nullptr; - CloseHandle(hEvent); - ft->proto->debugLogA("Finish all files"); - Netlib_CloseHandle(s); - ft->s = nullptr; - ft->proto->debugLogA("ft->s is NULL"); - - if (ft->state == FT_SWITCH) { - ft->proto->debugLogA("Sending as client..."); - ft->state = FT_CONNECTING; - - NETLIBOPENCONNECTION nloc = { sizeof(nloc) }; - nloc.szHost = ft->hostName; - nloc.wPort = ft->wPort; - HNETLIBCONN hConn = Netlib_OpenConnection(ft->proto->m_hNetlibUser, &nloc); - if (hConn != nullptr) { - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTING, ft, 0); - ft->s = hConn; - TlenP2PEstablishOutgoingConnection(ft, TRUE); - ft->proto->debugLogA("Entering send loop for this file connection..."); - while (ft->state != FT_DONE && ft->state != FT_ERROR) - TlenFileSendParse(ft); - - if (ft->state == FT_DONE) - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, ft, 0); - else - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); - ft->proto->debugLogA("Closing connection for this file transfer... "); - Netlib_CloseHandle(hConn); - } - else ft->state = FT_ERROR; - } - } - else { - ft->proto->debugLogA("Cannot allocate port to bind for file server thread, thread ended."); - ft->state = FT_ERROR; - } - TlenListRemove(ft->proto, LIST_FILE, ft->iqId); - - switch (ft->state) { - case FT_DONE: - ft->proto->debugLogA("Finish successfully"); - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, ft, 0); - break; - case FT_DENIED: - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_DENIED, ft, 0); - break; - default: // FT_ERROR: - nick = TlenNickFromJID(ft->jid); - TlenSend(ft->proto, "", nick, ft->iqId); - mir_free(nick); - ft->proto->debugLogA("Finish with errors"); - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); - break; - } - ft->proto->debugLogA("Thread ended: type=file_send"); - TlenP2PFreeFileTransfer(ft); -} - - -TLEN_FILE_TRANSFER *TlenFileCreateFT(TlenProtocol *proto, const char *jid) -{ - TLEN_FILE_TRANSFER *ft = (TLEN_FILE_TRANSFER *)mir_alloc(sizeof(TLEN_FILE_TRANSFER)); - memset(ft, 0, sizeof(TLEN_FILE_TRANSFER)); - ft->proto = proto; - ft->jid = mir_strdup(jid); - return ft; -} - - -/* - * File transfer - */ -void TlenProcessF(XmlNode *node, ThreadData *info) -{ - char *p; - char jid[128], szFilename[MAX_PATH]; - int numFiles; - TLEN_LIST_ITEM *item; - - // if (!node->name || mir_strcmp(node->name, "f")) return; - if (info == nullptr) return; - - char *from = TlenXmlGetAttrValue(node, "f"); - if (from != nullptr) { - if (strchr(from, '@') == nullptr) - mir_snprintf(jid, "%s@%s", from, info->server); - else - strncpy_s(jid, from, _TRUNCATE); - - char *e = TlenXmlGetAttrValue(node, "e"); - if (e != nullptr) { - if (!mir_strcmp(e, "1")) { - // FILE_RECV : e='1' : File transfer request - TLEN_FILE_TRANSFER *ft = TlenFileCreateFT(info->proto, jid); - ft->hContact = TlenHContactFromJID(info->proto, jid); - - if ((p = TlenXmlGetAttrValue(node, "i")) != nullptr) - ft->iqId = mir_strdup(p); - - szFilename[0] = '\0'; - if ((p = TlenXmlGetAttrValue(node, "c")) != nullptr) { - numFiles = atoi(p); - if (numFiles == 1) { - if ((p = TlenXmlGetAttrValue(node, "n")) != nullptr) { - p = TlenTextDecode(p); - strncpy(szFilename, p, sizeof(szFilename) - 1); - mir_free(p); - } - else mir_strcpy(szFilename, Translate("1 File")); - } - else if (numFiles > 1) - mir_snprintf(szFilename, Translate("%d Files"), numFiles); - } - - if (szFilename[0] != '\0' && ft->iqId != nullptr) { - wchar_t* filenameT = mir_utf8decodeW((char*)szFilename); - PROTORECVFILET pre = { 0 }; - pre.dwFlags = PRFF_UNICODE; - pre.fileCount = 1; - pre.timestamp = time(nullptr); - pre.descr.w = filenameT; - pre.files.w = &filenameT; - pre.lParam = (LPARAM)ft; - ft->proto->debugLogA("sending chainrecv"); - ProtoChainRecvFile(ft->hContact, &pre); - mir_free(filenameT); - } - else { - // malformed request, reject - if (ft->iqId) - TlenSend(ft->proto, "", ft->iqId, from); - else - TlenSend(ft->proto, "", from); - TlenP2PFreeFileTransfer(ft); - } - } - else if (!mir_strcmp(e, "3")) { - // FILE_RECV : e='3' : invalid transfer error - if ((p = TlenXmlGetAttrValue(node, "i")) != nullptr) { - if ((item = TlenListGetItemPtr(info->proto, LIST_FILE, p)) != nullptr) { - if (item->ft != nullptr) { - ProtoBroadcastAck(info->proto->m_szModuleName, item->ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, item->ft, 0); - info->proto->FileCancel(NULL, item->ft); - } - TlenListRemove(info->proto, LIST_FILE, p); - } - } - } - else if (!mir_strcmp(e, "4")) { - // FILE_SEND : e='4' : File sending request was denied by the remote client - if ((p = TlenXmlGetAttrValue(node, "i")) != nullptr) { - if ((item = TlenListGetItemPtr(info->proto, LIST_FILE, p)) != nullptr) { - if (!mir_strcmp(item->ft->jid, jid)) { - ProtoBroadcastAck(info->proto->m_szModuleName, item->ft->hContact, ACKTYPE_FILE, ACKRESULT_DENIED, item->ft, 0); - TlenListRemove(info->proto, LIST_FILE, p); - } - } - } - } - else if (!mir_strcmp(e, "5")) { - // FILE_SEND : e='5' : File sending request was accepted - if ((p = TlenXmlGetAttrValue(node, "i")) != nullptr) - if ((item = TlenListGetItemPtr(info->proto, LIST_FILE, p)) != nullptr) - if (!mir_strcmp(item->ft->jid, jid)) - mir_forkthread(TlenFileSendingThread, item->ft); - } - else if (!mir_strcmp(e, "6")) { - // FILE_RECV : e='6' : IP and port information to connect to get file - if ((p = TlenXmlGetAttrValue(node, "i")) != nullptr) { - if ((item = TlenListGetItemPtr(info->proto, LIST_FILE, p)) != nullptr) { - if ((p = TlenXmlGetAttrValue(node, "a")) != nullptr) { - item->ft->hostName = mir_strdup(p); - if ((p = TlenXmlGetAttrValue(node, "p")) != nullptr) { - item->ft->wPort = atoi(p); - mir_forkthread(TlenFileReceiveThread, item->ft); - } - } - } - } - } - else if (!mir_strcmp(e, "7")) { - // FILE_RECV : e='7' : IP and port information to connect to send file - // in case the conection to the given server was not successful - if ((p = TlenXmlGetAttrValue(node, "i")) != nullptr) { - if ((item = TlenListGetItemPtr(info->proto, LIST_FILE, p)) != nullptr) { - if ((p = TlenXmlGetAttrValue(node, "a")) != nullptr) { - if (item->ft->hostName != nullptr) mir_free(item->ft->hostName); - item->ft->hostName = mir_strdup(p); - if ((p = TlenXmlGetAttrValue(node, "p")) != nullptr) { - item->ft->wPort = atoi(p); - item->ft->state = FT_SWITCH; - SetEvent(item->ft->hFileEvent); - } - } - } - } - } - else if (!mir_strcmp(e, "8")) { - // FILE_RECV : e='8' : transfer error - if ((p = TlenXmlGetAttrValue(node, "i")) != nullptr) { - if ((item = TlenListGetItemPtr(info->proto, LIST_FILE, p)) != nullptr) { - item->ft->state = FT_ERROR; - if (item->ft->hFileEvent != nullptr) - SetEvent(item->ft->hFileEvent); - else - ProtoBroadcastAck(info->proto->m_szModuleName, item->ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, item->ft, 0); - } - } - } - } - } -} diff --git a/protocols/Tlen/src/tlen_file.h b/protocols/Tlen/src/tlen_file.h deleted file mode 100644 index 346ec886acd..00000000000 --- a/protocols/Tlen/src/tlen_file.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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. - -*/ - -#ifndef _TLEN_FILE_H_ -#define _TLEN_FILE_H_ - -#include -#include "stdafx.h" - -extern int TlenFileCancelAll(TlenProtocol *proto); -extern void TlenProcessF(XmlNode *node, ThreadData *userdata); -extern TLEN_FILE_TRANSFER *TlenFileCreateFT(TlenProtocol *proto, const char *jid); -#endif - diff --git a/protocols/Tlen/src/tlen_iq.cpp b/protocols/Tlen/src/tlen_iq.cpp deleted file mode 100644 index 82923570b33..00000000000 --- a/protocols/Tlen/src/tlen_iq.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua - -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 "stdafx.h" -#include "tlen_iq.h" - - -void TlenIqInit(TlenProtocol *proto) -{ - proto->iqList = nullptr; - proto->iqCount = 0; - proto->iqAlloced = 0; -} - -void TlenIqUninit(TlenProtocol *proto) -{ - if (proto->iqList) mir_free(proto->iqList); - proto->iqList = nullptr; - proto->iqCount = 0; - proto->iqAlloced = 0; -} - -static void TlenIqRemove(TlenProtocol *proto, int index) -{ - mir_cslock lck(proto->csIqList); - if (index >= 0 && indexiqCount) { - memmove(proto->iqList+index, proto->iqList+index+1, sizeof(TLEN_IQ_FUNC)*(proto->iqCount-index-1)); - proto->iqCount--; - } -} - -static void TlenIqExpire(TlenProtocol *proto) -{ - int i; - time_t expire; - - mir_cslock lck(proto->csIqList); - expire = time(nullptr) - 120; // 2 minute - i = 0; - while (i < proto->iqCount) { - if (proto->iqList[i].requestTime < expire) - TlenIqRemove(proto, i); - else - i++; - } -} - -TLEN_IQ_PFUNC TlenIqFetchFunc(TlenProtocol *proto, int iqId) -{ - int i; - TLEN_IQ_PFUNC res; - - mir_cslock lck(proto->csIqList); - TlenIqExpire(proto); - for (i=0; iiqCount && proto->iqList[i].iqId != iqId; i++); - if (i < proto->iqCount) { - res = proto->iqList[i].func; - TlenIqRemove(proto, i); - } - else { - res = (TLEN_IQ_PFUNC) nullptr; - } - return res; -} - -void TlenIqAdd(TlenProtocol *proto, unsigned int iqId, TLEN_IQ_PROCID procId, TLEN_IQ_PFUNC func) -{ - int i; - - mir_cslock lck(proto->csIqList); - if (procId == IQ_PROC_NONE) - i = proto->iqCount; - else - for (i=0; iiqCount && proto->iqList[i].procId != procId; i++); - - if (i >= proto->iqCount && proto->iqCount >= proto->iqAlloced) { - proto->iqAlloced = proto->iqCount + 8; - proto->iqList = (TLEN_IQ_FUNC*)mir_realloc(proto->iqList, sizeof(TLEN_IQ_FUNC)*proto->iqAlloced); - } - - if (proto->iqList != nullptr) { - proto->iqList[i].iqId = iqId; - proto->iqList[i].procId = procId; - proto->iqList[i].func = func; - proto->iqList[i].requestTime = time(nullptr); - if (i == proto->iqCount) proto->iqCount++; - } -} - diff --git a/protocols/Tlen/src/tlen_iq.h b/protocols/Tlen/src/tlen_iq.h deleted file mode 100644 index 6966de74fb3..00000000000 --- a/protocols/Tlen/src/tlen_iq.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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. - -*/ -#ifndef _TLEN_IQ_H_ -#define _TLEN_IQ_H_ - -#include "tlen_xml.h" -#include "stdafx.h" - -typedef void (*TLEN_IQ_PFUNC)(TlenProtocol *proto, XmlNode *iqNode); - -typedef struct TLEN_IQ_FUNC_STRUCT { - int iqId; // id to match IQ get/set with IQ result - TLEN_IQ_PROCID procId; // must be unique in the list, except for IQ_PROC_NONE which can have multiple entries - TLEN_IQ_PFUNC func; // callback function - time_t requestTime; // time the request was sent, used to remove relinquent entries -} TLEN_IQ_FUNC; - -void TlenIqInit(TlenProtocol *proto); -void TlenIqUninit(TlenProtocol *proto); -TLEN_IQ_PFUNC TlenIqFetchFunc(TlenProtocol *proto, int iqId); -void TlenIqAdd(TlenProtocol *proto, unsigned int iqId, TLEN_IQ_PROCID procId, TLEN_IQ_PFUNC func); - -void TlenIqResultAuth(TlenProtocol *proto, XmlNode *iqNode); -void TlenIqResultRoster(TlenProtocol *proto, XmlNode *iqNode); -void TlenIqResultVcard(TlenProtocol *proto, XmlNode *iqNode); -void TlenIqResultSearch(TlenProtocol *proto, XmlNode *iqNode); -void TlenIqResultVersion(TlenProtocol *proto, XmlNode *iqNode); -void TlenIqResultInfo(TlenProtocol *proto, XmlNode *iqNode); -void TlenIqResultTcfg(TlenProtocol *proto, XmlNode *iqNode); - -//void TlenIqResultSetPassword(XmlNode *iqNode, void *userdata); - -#endif - diff --git a/protocols/Tlen/src/tlen_iqid.cpp b/protocols/Tlen/src/tlen_iqid.cpp deleted file mode 100644 index 39024a544a0..00000000000 --- a/protocols/Tlen/src/tlen_iqid.cpp +++ /dev/null @@ -1,625 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" -#include "resource.h" -#include "tlen_list.h" -#include "tlen_iq.h" -#include "tlen_muc.h" - -// RECVED: authentication result -// ACTION: if successfully logged in, continue by requesting roster list and set my initial status -void TlenIqResultAuth(TlenProtocol *proto, XmlNode *iqNode) -{ - char *type = TlenXmlGetAttrValue(iqNode, "type"); - if (type == nullptr) - return; - - if (!mir_strcmp(type, "result")) { - DBVARIANT dbv; - - if (db_get(NULL, proto->m_szModuleName, "Nick", &dbv)) - db_set_s(NULL, proto->m_szModuleName, "Nick", proto->threadData->username); - else - db_free(&dbv); - // iqId = TlenSerialNext(); - // TlenIqAdd(iqId, IQ_PROC_NONE, TlenIqResultGetRoster); - // TlenSend(info, "", iqId); - - TlenSend(proto, ""); - TlenSend(proto, ""); - } - // What to do if password error? etc... - else if (!mir_strcmp(type, "error")) { - char text[128]; - - TlenSend(proto, ""); - mir_snprintf(text, Translate("Authentication failed for %s@%s."), proto->threadData->username, proto->threadData->server); - MessageBoxA(nullptr, text, Translate("Tlen Authentication"), MB_OK | MB_ICONSTOP | MB_SETFOREGROUND); - ProtoBroadcastAck(proto->m_szModuleName, NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, nullptr, LOGINERR_WRONGPASSWORD); - proto->threadData = nullptr; // To disallow auto reconnect - } -} - -void TlenResultSetRoster(TlenProtocol *proto, XmlNode *queryNode) { - DBVARIANT dbv; - XmlNode *groupNode; - MCONTACT hContact; - char *name, *nick; - - for (int i = 0; i < queryNode->numChild; i++) { - XmlNode *itemNode = queryNode->child[i]; - if (!mir_strcmp(itemNode->name, "item")) { - char *jid = TlenXmlGetAttrValue(itemNode, "jid"); - if (jid != nullptr) { - char *str = TlenXmlGetAttrValue(itemNode, "subscription"); - if (str == nullptr) - continue; - else if (!mir_strcmp(str, "remove")) { - if ((hContact = TlenHContactFromJID(proto, jid)) != NULL) { - if (db_get_w(hContact, proto->m_szModuleName, "Status", ID_STATUS_OFFLINE) != ID_STATUS_OFFLINE) - db_set_w(hContact, proto->m_szModuleName, "Status", ID_STATUS_OFFLINE); - } - TlenListRemove(proto, LIST_ROSTER, jid); - } - else { - TLEN_LIST_ITEM *item = TlenListAdd(proto, LIST_ROSTER, jid); - if (item != nullptr) { - if (!mir_strcmp(str, "both")) - item->subscription = SUB_BOTH; - else if (!mir_strcmp(str, "to")) - item->subscription = SUB_TO; - else if (!mir_strcmp(str, "from")) - item->subscription = SUB_FROM; - else - item->subscription = SUB_NONE; - if ((name = TlenXmlGetAttrValue(itemNode, "name")) != nullptr) { - nick = TlenTextDecode(name); - } - else { - nick = TlenLocalNickFromJID(jid); - } - if (nick != nullptr) { - if (item->nick) mir_free(item->nick); - item->nick = nick; - - if ((hContact = TlenHContactFromJID(proto, jid)) == NULL) { - // Received roster has a new JID. - // Add the jid (with empty resource) to Miranda contact list. - hContact = TlenDBCreateContact(proto, jid, nick, FALSE); - } - db_set_s(hContact, "CList", "MyHandle", nick); - if (item->group) mir_free(item->group); - if ((groupNode = TlenXmlGetChild(itemNode, "group")) != nullptr && groupNode->text != nullptr) { - item->group = TlenGroupDecode(groupNode->text); - Clist_GroupCreate(0, _A2T(item->group)); - // Don't set group again if already correct, or Miranda may show wrong group count in some case - if (!db_get(hContact, "CList", "Group", &dbv)) { - if (mir_strcmp(dbv.pszVal, item->group)) - db_set_s(hContact, "CList", "Group", item->group); - db_free(&dbv); - } - else - db_set_s(hContact, "CList", "Group", item->group); - } - else { - item->group = nullptr; - db_unset(hContact, "CList", "Group"); - } - } - } - } - } - } - } -} - -// RECVED: roster information -// ACTION: populate LIST_ROSTER and create contact for any new rosters -void TlenIqResultRoster(TlenProtocol *proto, XmlNode *iqNode) -{ - char *type = TlenXmlGetAttrValue(iqNode, "type"); - if (type == nullptr) return; - XmlNode *queryNode = TlenXmlGetChild(iqNode, "query"); - if (queryNode == nullptr) return; - - if (!mir_strcmp(type, "result")) { - char *str = TlenXmlGetAttrValue(queryNode, "xmlns"); - if (str != nullptr && !mir_strcmp(str, "jabber:iq:roster")) { - DBVARIANT dbv; - XmlNode *itemNode, *groupNode; - TLEN_SUBSCRIPTION sub; - TLEN_LIST_ITEM *item; - char *jid, *name, *nick; - int i; - - for (i = 0; i < queryNode->numChild; i++) { - itemNode = queryNode->child[i]; - if (!mir_strcmp(itemNode->name, "item")) { - str = TlenXmlGetAttrValue(itemNode, "subscription"); - if (str == nullptr) sub = SUB_NONE; - else if (!mir_strcmp(str, "both")) sub = SUB_BOTH; - else if (!mir_strcmp(str, "to")) sub = SUB_TO; - else if (!mir_strcmp(str, "from")) sub = SUB_FROM; - else sub = SUB_NONE; - //if (str != NULL && (!mir_strcmp(str, "to") || !mir_strcmp(str, "both"))) { - if ((jid = TlenXmlGetAttrValue(itemNode, "jid")) != nullptr) { - if ((name = TlenXmlGetAttrValue(itemNode, "name")) != nullptr) - nick = TlenTextDecode(name); - else - nick = TlenLocalNickFromJID(jid); - - if (nick != nullptr) { - MCONTACT hContact; - item = TlenListAdd(proto, LIST_ROSTER, jid); - if (item->nick) mir_free(item->nick); - item->nick = nick; - item->subscription = sub; - if ((hContact = TlenHContactFromJID(proto, jid)) == NULL) { - // Received roster has a new JID. - // Add the jid (with empty resource) to Miranda contact list. - hContact = TlenDBCreateContact(proto, jid, nick, FALSE); - } - db_set_s(hContact, "CList", "MyHandle", nick); - if (item->group) mir_free(item->group); - if ((groupNode = TlenXmlGetChild(itemNode, "group")) != nullptr && groupNode->text != nullptr) { - item->group = TlenGroupDecode(groupNode->text); - Clist_GroupCreate(0, _A2T(item->group)); - // Don't set group again if already correct, or Miranda may show wrong group count in some case - if (!db_get(hContact, "CList", "Group", &dbv)) { - if (mir_strcmp(dbv.pszVal, item->group)) - db_set_s(hContact, "CList", "Group", item->group); - db_free(&dbv); - } - else db_set_s(hContact, "CList", "Group", item->group); - } - else { - item->group = nullptr; - db_unset(hContact, "CList", "Group"); - } - - ptrA szAvatarHash(proto->getStringA(hContact, "AvatarHash")); - if (szAvatarHash != NULL) { - replaceStr(item->avatarHash, szAvatarHash); - proto->debugLogA("Setting hash [%s] = %s", nick, item->avatarHash); - } - item->avatarFormat = db_get_dw(hContact, proto->m_szModuleName, "AvatarFormat", PA_FORMAT_UNKNOWN); - } - } - } - } - - // Delete orphaned contacts (if roster sync is enabled) - if (db_get_b(NULL, proto->m_szModuleName, "RosterSync", FALSE) == TRUE) { - for (MCONTACT hContact = db_find_first(proto->m_szModuleName); hContact; ) { - MCONTACT hNext = hContact = db_find_next(hContact, proto->m_szModuleName); - ptrA szJid(proto->getStringA(hContact, "szJid")); - if (szJid != NULL) { - if (!TlenListExist(proto, LIST_ROSTER, szJid)) { - proto->debugLogA("Syncing roster: deleting 0x%x", hContact); - db_delete_contact(hContact); - } - } - hContact = hNext; - } - } - - } - } -} - - -// Tlen actually use jabber:iq:search for other users vCard or jabber:iq:register for own vCard -void TlenIqResultVcard(TlenProtocol *proto, XmlNode *iqNode) -{ - char text[128]; - MCONTACT hContact; - char *nText; - - // TlenLog(" iqIdGetVcard (tlen)"); - char *type = TlenXmlGetAttrValue(iqNode, "type"); - if (type == nullptr) return; - - if (!mir_strcmp(type, "result")) { - DBVARIANT dbv; - - XmlNode *queryNode = TlenXmlGetChild(iqNode, "query"); - if (queryNode == nullptr) return; - XmlNode *itemNode = TlenXmlGetChild(queryNode, "item"); - if (itemNode == nullptr) return; - char *jid = TlenXmlGetAttrValue(itemNode, "jid"); - if (jid != nullptr) { - if (db_get(NULL, proto->m_szModuleName, "LoginServer", &dbv)) return; - if (strchr(jid, '@') != nullptr) { - strncpy_s(text, jid, _TRUNCATE); - } - else { - mir_snprintf(text, "%s@%s", jid, dbv.pszVal); // Add @tlen.pl - } - db_free(&dbv); - if ((hContact = TlenHContactFromJID(proto, text)) == NULL) { - if (db_get(NULL, proto->m_szModuleName, "LoginName", &dbv)) return; - if (mir_strcmp(dbv.pszVal, jid)) { - db_free(&dbv); - return; - } - db_free(&dbv); - } - } - else { - hContact = NULL; - } - bool hasFirst = false, hasLast = false, hasNick = false, hasEmail = false, hasCity = false, hasAge = false, - hasGender = false, hasSchool = false, hasLookFor = false, hasOccupation = false; - for (int i = 0; i < itemNode->numChild; i++) { - XmlNode *n = itemNode->child[i]; - if (n == nullptr || n->name == nullptr) continue; - if (!mir_strcmp(n->name, "first")) { - if (n->text != nullptr) { - hasFirst = true; - nText = TlenTextDecode(n->text); - db_set_s(hContact, proto->m_szModuleName, "FirstName", nText); - mir_free(nText); - } - } - else if (!mir_strcmp(n->name, "last")) { - if (n->text != nullptr) { - hasLast = true; - nText = TlenTextDecode(n->text); - db_set_s(hContact, proto->m_szModuleName, "LastName", nText); - mir_free(nText); - } - } - else if (!mir_strcmp(n->name, "nick")) { - if (n->text != nullptr) { - hasNick = true; - nText = TlenTextDecode(n->text); - db_set_s(hContact, proto->m_szModuleName, "Nick", nText); - mir_free(nText); - } - } - else if (!mir_strcmp(n->name, "email")) { - if (n->text != nullptr) { - hasEmail = true; - nText = TlenTextDecode(n->text); - db_set_s(hContact, proto->m_szModuleName, "e-mail", nText); - mir_free(nText); - } - } - else if (!mir_strcmp(n->name, "c")) { - if (n->text != nullptr) { - hasCity = true; - nText = TlenTextDecode(n->text); - db_set_s(hContact, proto->m_szModuleName, "City", nText); - mir_free(nText); - } - } - else if (!mir_strcmp(n->name, "b")) { - if (n->text != nullptr) { - WORD nAge = atoi(n->text); - hasAge = true; - db_set_w(hContact, proto->m_szModuleName, "Age", nAge); - } - } - else if (!mir_strcmp(n->name, "s")) { - if (n->text != nullptr && n->text[1] == '\0' && (n->text[0] == '1' || n->text[0] == '2')) { - hasGender = true; - db_set_b(hContact, proto->m_szModuleName, "Gender", (BYTE)(n->text[0] == '1' ? 'M' : 'F')); - } - } - else if (!mir_strcmp(n->name, "e")) { - if (n->text != nullptr) { - hasSchool = true; - nText = TlenTextDecode(n->text); - db_set_s(hContact, proto->m_szModuleName, "School", nText); - mir_free(nText); - } - } - else if (!mir_strcmp(n->name, "j")) { - if (n->text != nullptr) { - hasOccupation = true; - WORD nOccupation = atoi(n->text); - db_set_w(hContact, proto->m_szModuleName, "Occupation", nOccupation); - } - } - else if (!mir_strcmp(n->name, "r")) { - if (n->text != nullptr) { - WORD nLookFor = atoi(n->text); - hasLookFor = true; - db_set_w(hContact, proto->m_szModuleName, "LookingFor", nLookFor); - } - } - else if (!mir_strcmp(n->name, "g")) { // voice chat enabled - if (n->text != nullptr) { - BYTE bVoice = atoi(n->text); - db_set_w(hContact, proto->m_szModuleName, "VoiceChat", bVoice); - } - } - else if (!mir_strcmp(n->name, "v")) { // status visibility - if (n->text != nullptr) { - BYTE bPublic = atoi(n->text); - db_set_w(hContact, proto->m_szModuleName, "PublicStatus", bPublic); - } - } - } - if (!hasFirst) - db_unset(hContact, proto->m_szModuleName, "FirstName"); - if (!hasLast) - db_unset(hContact, proto->m_szModuleName, "LastName"); - // We are not removing "Nick" -// if (!hasNick) -// db_unset(hContact, m_szModuleName, "Nick"); - if (!hasEmail) - db_unset(hContact, proto->m_szModuleName, "e-mail"); - if (!hasCity) - db_unset(hContact, proto->m_szModuleName, "City"); - if (!hasAge) - db_unset(hContact, proto->m_szModuleName, "Age"); - if (!hasGender) - db_unset(hContact, proto->m_szModuleName, "Gender"); - if (!hasSchool) - db_unset(hContact, proto->m_szModuleName, "School"); - if (!hasOccupation) - db_unset(hContact, proto->m_szModuleName, "Occupation"); - if (!hasLookFor) - db_unset(hContact, proto->m_szModuleName, "LookingFor"); - ProtoBroadcastAck(proto->m_szModuleName, hContact, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, (HANDLE)1, 0); - } -} - -void TlenIqResultSearch(TlenProtocol *proto, XmlNode *iqNode) -{ - XmlNode *queryNode, *itemNode, *n; - char *jid; - int i, found = 0; - TLEN_SEARCH_RESULT jsr = { 0 }; - DBVARIANT dbv = { 0 }; - - // TlenLog(" iqIdGetSearch"); - char *type = TlenXmlGetAttrValue(iqNode, "type"); - if (type == nullptr) - return; - char *str = TlenXmlGetAttrValue(iqNode, "id"); - if (str == nullptr) - return; - int id = atoi(str + mir_strlen(TLEN_IQID)); - - if (!mir_strcmp(type, "result")) { - if ((queryNode = TlenXmlGetChild(iqNode, "query")) == nullptr) return; - if (!db_get(NULL, proto->m_szModuleName, "LoginServer", &dbv)) { - jsr.hdr.cbSize = sizeof(TLEN_SEARCH_RESULT); - jsr.hdr.flags = PSR_UNICODE; - for (i = 0; i < queryNode->numChild; i++) { - itemNode = queryNode->child[i]; - if (!mir_strcmp(itemNode->name, "item")) { - if ((jid = TlenXmlGetAttrValue(itemNode, "jid")) != nullptr) { - if (strchr(jid, '@') != nullptr) { - strncpy_s(jsr.jid, jid, _TRUNCATE); - } - else { - mir_snprintf(jsr.jid, "%s@%s", jid, dbv.pszVal); - } - jsr.jid[sizeof(jsr.jid) - 1] = '\0'; - jsr.hdr.id.w = mir_a2u(jid); - if ((n = TlenXmlGetChild(itemNode, "nick")) != nullptr && n->text != nullptr) { - char* buf = TlenTextDecode(n->text); - jsr.hdr.nick.w = mir_a2u(buf); - mir_free(buf); - } - else { - jsr.hdr.nick.w = mir_wstrdup(TEXT("")); - } - if ((n = TlenXmlGetChild(itemNode, "first")) != nullptr && n->text != nullptr) { - char* buf = TlenTextDecode(n->text); - jsr.hdr.firstName.w = mir_a2u(buf); - mir_free(buf); - } - else { - jsr.hdr.firstName.w = mir_wstrdup(TEXT("")); - } - if ((n = TlenXmlGetChild(itemNode, "last")) != nullptr && n->text != nullptr) { - char* buf = TlenTextDecode(n->text); - jsr.hdr.lastName.w = mir_a2u(buf); - mir_free(buf); - } - else { - jsr.hdr.lastName.w = mir_wstrdup(TEXT("")); - } - if ((n = TlenXmlGetChild(itemNode, "email")) != nullptr && n->text != nullptr) { - char* buf = TlenTextDecode(n->text); - jsr.hdr.email.w = mir_a2u(buf); - mir_free(buf); - } - else { - jsr.hdr.email.w = mir_wstrdup(TEXT("")); - } - - ProtoBroadcastAck(proto->m_szModuleName, NULL, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE)id, (LPARAM)&jsr); - found = 1; - mir_free(jsr.hdr.id.w); - mir_free(jsr.hdr.nick.w); - mir_free(jsr.hdr.firstName.w); - mir_free(jsr.hdr.lastName.w); - mir_free(jsr.hdr.email.w); - } - } - } - if (proto->searchJID != nullptr) { - if (!found) { - if (strchr(proto->searchJID, '@') != nullptr) - strncpy_s(jsr.jid, proto->searchJID, _TRUNCATE); - else - mir_snprintf(jsr.jid, "%s@%s", proto->searchJID, dbv.pszVal); - - jsr.hdr.nick.w = jsr.hdr.firstName.w = jsr.hdr.lastName.w = jsr.hdr.email.w = jsr.hdr.id.w = TEXT(""); - ProtoBroadcastAck(proto->m_szModuleName, NULL, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE)id, (LPARAM)&jsr); - } - mir_free(proto->searchJID); - proto->searchJID = nullptr; - } - db_free(&dbv); - } - found = 0; - if (queryNode->numChild == TLEN_MAX_SEARCH_RESULTS_PER_PAGE) { - found = TlenRunSearch(proto); - } - if (!found) { - ProtoBroadcastAck(proto->m_szModuleName, NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)id, 0); - } - } - else if (!mir_strcmp(type, "error")) { - // ProtoBroadcastAck(proto->m_szModuleName, NULL, ACKTYPE_SEARCH, ACKRESULT_FAILED, (HANDLE) id, 0); - // There is no ACKRESULT_FAILED for ACKTYPE_SEARCH :) look at findadd.c - // So we will just send a SUCCESS - ProtoBroadcastAck(proto->m_szModuleName, NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)id, 0); - } -} - - -void GetConfigItem(XmlNode *node, char *dest, BOOL bMethod, int *methodDest) { - mir_strcpy(dest, node->text); - TlenUrlDecode(dest); - if (bMethod) { - char *method = TlenXmlGetAttrValue(node, "method"); - if (method != nullptr && !strcmpi(method, "POST")) { - *methodDest = REQUEST_POST; - } - else { - *methodDest = REQUEST_GET; - } - } -} - -void TlenIqResultTcfg(TlenProtocol *proto, XmlNode *iqNode) -{ - XmlNode *queryNode, *miniMailNode, *node; - - char *type = TlenXmlGetAttrValue(iqNode, "type"); - if (type == nullptr) return; - if (!mir_strcmp(type, "result")) { - if ((queryNode = TlenXmlGetChild(iqNode, "query")) == nullptr) return; - if ((miniMailNode = TlenXmlGetChild(queryNode, "mini-mail")) == nullptr) return; - if ((node = TlenXmlGetChild(miniMailNode, "base")) != nullptr) { - GetConfigItem(node, proto->threadData->tlenConfig.mailBase, FALSE, nullptr); - } - if ((node = TlenXmlGetChild(miniMailNode, "msg")) != nullptr) { - GetConfigItem(node, proto->threadData->tlenConfig.mailMsg, TRUE, &proto->threadData->tlenConfig.mailMsgMthd); - } - if ((node = TlenXmlGetChild(miniMailNode, "index")) != nullptr) { - GetConfigItem(node, proto->threadData->tlenConfig.mailIndex, TRUE, &proto->threadData->tlenConfig.mailIndexMthd); - } - if ((node = TlenXmlGetChild(miniMailNode, "login")) != nullptr) { - GetConfigItem(node, proto->threadData->tlenConfig.mailLogin, TRUE, &proto->threadData->tlenConfig.mailLoginMthd); - } - if ((node = TlenXmlGetChild(miniMailNode, "compose")) != nullptr) { - GetConfigItem(node, proto->threadData->tlenConfig.mailCompose, TRUE, &proto->threadData->tlenConfig.mailComposeMthd); - } - if ((node = TlenXmlGetChild(miniMailNode, "avatar-get")) != nullptr) { - GetConfigItem(node, proto->threadData->tlenConfig.avatarGet, TRUE, &proto->threadData->tlenConfig.avatarGetMthd); - } - if ((node = TlenXmlGetChild(miniMailNode, "avatar-upload")) != nullptr) { - GetConfigItem(node, proto->threadData->tlenConfig.avatarUpload, TRUE, &proto->threadData->tlenConfig.avatarUploadMthd); - } - if ((node = TlenXmlGetChild(miniMailNode, "avatar-remove")) != nullptr) { - GetConfigItem(node, proto->threadData->tlenConfig.avatarRemove, TRUE, &proto->threadData->tlenConfig.avatarRemoveMthd); - } - - - //continue connecting - Menu_ModifyItem(proto->hMenuMUC, nullptr, INVALID_HANDLE_VALUE, 0); - if (proto->hMenuChats != nullptr) - Menu_ModifyItem(proto->hMenuChats, nullptr, INVALID_HANDLE_VALUE, 0); - - proto->isOnline = TRUE; - proto->debugLogA("Status changed via THREADSTART"); - int oldStatus = proto->m_iStatus; - TlenSendPresence(proto, proto->m_iDesiredStatus); - ProtoBroadcastAck(proto->m_szModuleName, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)oldStatus, proto->m_iStatus); - - } -} - -void TlenIqResultVersion(TlenProtocol *proto, XmlNode *iqNode) -{ - XmlNode *queryNode = TlenXmlGetChild(iqNode, "query"); - if (queryNode != nullptr) { - char *from = TlenXmlGetAttrValue(iqNode, "from"); - if (from != nullptr) { - TLEN_LIST_ITEM *item = TlenListGetItemPtr(proto, LIST_ROSTER, from); - if (item != nullptr) { - XmlNode *n; - if (item->software) mir_free(item->software); - if (item->version) mir_free(item->version); - if (item->system) mir_free(item->system); - if ((n = TlenXmlGetChild(queryNode, "name")) != nullptr && n->text) { - item->software = TlenTextDecode(n->text); - } - else - item->software = nullptr; - if ((n = TlenXmlGetChild(queryNode, "version")) != nullptr && n->text) - item->version = TlenTextDecode(n->text); - else - item->version = nullptr; - if ((n = TlenXmlGetChild(queryNode, "os")) != nullptr && n->text) - item->system = TlenTextDecode(n->text); - else - item->system = nullptr; - MCONTACT hContact = TlenHContactFromJID(proto, item->jid); - if (hContact != NULL) { - if (item->software != nullptr) { - db_set_s(hContact, proto->m_szModuleName, "MirVer", item->software); - } - else { - db_unset(hContact, proto->m_szModuleName, "MirVer"); - } - } - } - } - } -} - -void TlenIqResultInfo(TlenProtocol *proto, XmlNode *iqNode) -{ - XmlNode *queryNode = TlenXmlGetChild(iqNode, "query"); - if (queryNode != nullptr) { - char *from = TlenXmlGetAttrValue(queryNode, "from"); - if (from != nullptr) { - TLEN_LIST_ITEM *item = TlenListGetItemPtr(proto, LIST_ROSTER, from); - if (item != nullptr) { - XmlNode *version = TlenXmlGetChild(queryNode, "version"); - if (version != nullptr) { - item->protocolVersion = TlenTextDecode(version->text); - MCONTACT hContact = TlenHContactFromJID(proto, item->jid); - if (hContact != NULL) { - if (item->software == nullptr) { - char str[128]; - mir_snprintf(str, "Tlen Protocol %s", item->protocolVersion); - db_set_s(hContact, proto->m_szModuleName, "MirVer", str); - } - } - } - } - } - } -} - diff --git a/protocols/Tlen/src/tlen_list.cpp b/protocols/Tlen/src/tlen_list.cpp deleted file mode 100644 index f7a141cea64..00000000000 --- a/protocols/Tlen/src/tlen_list.cpp +++ /dev/null @@ -1,292 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" -#include "tlen_list.h" - - -static void TlenListFreeItemInternal(TLEN_LIST_ITEM *item); - -void TlenListInit(TlenProtocol *proto) -{ - proto->lists = nullptr; - proto->listsCount = 0; -} - -void TlenListUninit(TlenProtocol *proto) -{ - TlenListWipe(proto); -} - -void TlenListWipe(TlenProtocol *proto) -{ - int i; - - mir_cslock lck(proto->csLists); - for (i=0; ilistsCount; i++) - TlenListFreeItemInternal(&(proto->lists[i])); - if (proto->lists != nullptr) { - mir_free(proto->lists); - proto->lists = nullptr; - } - proto->listsCount=0; -} - -void TlenListWipeSpecial(TlenProtocol *proto) -{ - int i; - mir_cslock lck(proto->csLists); - for (i=0; ilistsCount; i++) { - if (proto->lists[i].list != LIST_FILE && proto->lists[i].list != LIST_VOICE) { - TlenListFreeItemInternal(&(proto->lists[i])); - proto->listsCount--; - memmove(proto->lists+i, proto->lists+i+1, sizeof(TLEN_LIST_ITEM)*(proto->listsCount-i)); - i--; - } - } - proto->lists = (TLEN_LIST_ITEM *) mir_realloc(proto->lists, sizeof(TLEN_LIST_ITEM)*proto->listsCount); -} - -static void TlenListFreeItemInternal(TLEN_LIST_ITEM *item) -{ - if (item == nullptr) - return; - - if (item->jid) mir_free(item->jid); - if (item->nick) mir_free(item->nick); - if (item->statusMessage) mir_free(item->statusMessage); - if (item->group) mir_free(item->group); - if (item->messageEventIdStr) mir_free(item->messageEventIdStr); -// if (item->type) mir_free(item->type); - //if (item->ft) TlenFileFreeFt(item->ft); // No need to free (it is always free when exit from TlenFileServerThread()) - if (item->roomName) mir_free(item->roomName); - if (item->version) mir_free(item->version); - if (item->software) mir_free(item->software); - if (item->system) mir_free(item->system); - if (item->avatarHash) mir_free(item->avatarHash); - - if (item->protocolVersion) mir_free(item->protocolVersion); - if (item->id2) mir_free(item->id2); -} - -static char * GetItemId(TLEN_LIST list, const char *jid) -{ - char *s, *p, *q; - s = mir_strdup(jid); - if (list != LIST_PICTURE) { - _strlwr(s); - // strip resouce name if any - if ((p=strchr(s, '@')) != nullptr) { - if ((q=strchr(p, '/')) != nullptr) - *q = '\0'; - } - } - return s; -} - - -int TlenListExist(TlenProtocol *proto, TLEN_LIST list, const char *jid) -{ - int i; - size_t len; - char *s, *p; - s = GetItemId(list, jid); - len = mir_strlen(s); - - mir_cslock lck(proto->csLists); - for (i=0; ilistsCount; i++) - if (proto->lists[i].list == list) { - p = proto->lists[i].jid; - if (p && mir_strlen(p) >= len && (p[(int)len] == '\0' || p[(int)len] == '/') && !strncmp(p, s, len)) { - mir_free(s); - return i+1; - } - } - mir_free(s); - return 0; -} - -TLEN_LIST_ITEM *TlenListAdd(TlenProtocol *proto, TLEN_LIST list, const char *jid) -{ - char *s; - TLEN_LIST_ITEM *item; - - mir_cslock lck(proto->csLists); - if ((item=TlenListGetItemPtr(proto, list, jid)) != nullptr) { - return item; - } - - s = GetItemId(list, jid); - proto->lists = (TLEN_LIST_ITEM *) mir_realloc(proto->lists, sizeof(TLEN_LIST_ITEM)*(proto->listsCount+1)); - item = &(proto->lists[proto->listsCount]); - memset(item, 0, sizeof(TLEN_LIST_ITEM)); - item->list = list; - item->jid = s; - item->nick = nullptr; - item->status = ID_STATUS_OFFLINE; - item->statusMessage = nullptr; - item->group = nullptr; - item->messageEventIdStr = nullptr; - item->wantComposingEvent = FALSE; - item->isTyping = FALSE; -// item->type = NULL; - item->ft = nullptr; - item->roomName = nullptr; - item->version = nullptr; - item->software = nullptr; - item->system = nullptr; - item->avatarHash = nullptr; - item->avatarFormat = PA_FORMAT_UNKNOWN; - item->newAvatarDownloading = FALSE; - item->versionRequested = FALSE; - item->infoRequested = FALSE; - proto->listsCount++; - - return item; -} - -void TlenListRemove(TlenProtocol *proto, TLEN_LIST list, const char *jid) -{ - int i; - - mir_cslock lck(proto->csLists); - i = TlenListExist(proto, list, jid); - if (!i) { - return; - } - i--; - TlenListFreeItemInternal(&(proto->lists[i])); - proto->listsCount--; - memmove(proto->lists+i, proto->lists+i+1, sizeof(TLEN_LIST_ITEM)*(proto->listsCount-i)); - proto->lists = (TLEN_LIST_ITEM *) mir_realloc(proto->lists, sizeof(TLEN_LIST_ITEM)*proto->listsCount); -} - -void TlenListRemoveList(TlenProtocol *proto, TLEN_LIST list) -{ - int i; - - i = 0; - while ((i=TlenListFindNext(proto, list, i)) >= 0) { - TlenListRemoveByIndex(proto, i); - } -} - -void TlenListRemoveByIndex(TlenProtocol *proto, int index) -{ - mir_cslock lck(proto->csLists); - if (index >= 0 && indexlistsCount) { - TlenListFreeItemInternal(&(proto->lists[index])); - proto->listsCount--; - memmove(proto->lists+index, proto->lists+index+1, sizeof(TLEN_LIST_ITEM)*(proto->listsCount-index)); - proto->lists = (TLEN_LIST_ITEM *) mir_realloc(proto->lists, sizeof(TLEN_LIST_ITEM)*proto->listsCount); - } -} - -void TlenListAddResource(TlenProtocol *proto, TLEN_LIST list, const char *jid, int, const char *statusMessage) -{ - int i; - - mir_cslock lck(proto->csLists); - i = TlenListExist(proto, list, jid); - if (!i) { - return; - } - i--; - - if (proto->lists[i].statusMessage != nullptr) - mir_free(proto->lists[i].statusMessage); - if (statusMessage) - proto->lists[i].statusMessage = mir_strdup(statusMessage); - else - proto->lists[i].statusMessage = nullptr; -} - -void TlenListRemoveResource(TlenProtocol *proto, TLEN_LIST list, const char *jid) -{ - int i; - mir_cslock lck(proto->csLists); - i = TlenListExist(proto, list, jid); - if (!i) { - return; - } - i--; -} - -int TlenListFindNext(TlenProtocol *proto, TLEN_LIST list, int fromOffset) -{ - int i; - - mir_cslock lck(proto->csLists); - i = (fromOffset >= 0) ? fromOffset : 0; - for (; ilistsCount; i++) - if (proto->lists[i].list == list) { - return i; - } - return -1; -} - -TLEN_LIST_ITEM *TlenListGetItemPtr(TlenProtocol *proto, TLEN_LIST list, const char *jid) -{ - int i; - - mir_cslock lck(proto->csLists); - i = TlenListExist(proto, list, jid); - if (!i) { - return nullptr; - } - i--; - return &(proto->lists[i]); -} - -TLEN_LIST_ITEM *TlenListFindItemPtrById2(TlenProtocol *proto, TLEN_LIST list, const char *id) -{ - - int i; - size_t len; - char *p; - - len = mir_strlen(id); - - mir_cslock lck(proto->csLists); - for (i=0; ilistsCount; i++) { - if (proto->lists[i].list == list) { - p = proto->lists[i].id2; - if (p != nullptr) { - if (!strncmp(p, id, len)) { - return &(proto->lists[i]); - } - } - } - } - return nullptr; -} - -TLEN_LIST_ITEM *TlenListGetItemPtrFromIndex(TlenProtocol *proto, int index) -{ - mir_cslock lck(proto->csLists); - if (index >= 0 && indexlistsCount) { - return &(proto->lists[index]); - } - return nullptr; -} - diff --git a/protocols/Tlen/src/tlen_list.h b/protocols/Tlen/src/tlen_list.h deleted file mode 100644 index 3130f41c149..00000000000 --- a/protocols/Tlen/src/tlen_list.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" - -#ifndef _TLEN_LIST_H_ -#define _TLEN_LIST_H_ - -typedef struct TLEN_LIST_ITEM_STRUCT { - TLEN_LIST list; - char *jid; - char *id2; - - // LIST_ROSTER - // jid = jid of the contact - char *nick; - int status; // Main status, currently useful for transport where no resource information is kept. - // On normal contact, this is the same status as shown on contact list. - TLEN_SUBSCRIPTION subscription; - char *statusMessage; // Status message when the update is to JID with no resource specified (e.g. transport user) - char *software; - char *version; - char *system; - char *group; - char *protocolVersion; - int avatarFormat; - char *avatarHash; - BOOL newAvatarDownloading; - BOOL versionRequested; - BOOL infoRequested; - int idMsgAckPending; - char *messageEventIdStr; - BOOL wantComposingEvent; - BOOL isTyping; - - // LIST_ROOM - // jid = room JID - // char *name; // room name - //char *type; // room type - - // LIST_CHATROOM - // jid = room JID - // char *nick; // my nick in this chat room (SPECIAL: in UTF8) - // TLEN_RESOURCE_STATUS *resource; // participant nicks in this room - char *roomName; - - // LIST_FILE - struct TLEN_FILE_TRANSFER_STRUCT *ft; -} TLEN_LIST_ITEM; - - -void TlenListInit(TlenProtocol *proto); -void TlenListUninit(TlenProtocol *proto); -void TlenListWipe(TlenProtocol *proto); -void TlenListWipeSpecial(TlenProtocol *proto); -int TlenListExist(TlenProtocol *proto, TLEN_LIST list, const char *jid); -TLEN_LIST_ITEM *TlenListAdd(TlenProtocol *proto, TLEN_LIST list, const char *jid); -void TlenListRemove(TlenProtocol *proto, TLEN_LIST list, const char *jid); -void TlenListRemoveList(TlenProtocol *proto, TLEN_LIST list); -void TlenListRemoveByIndex(TlenProtocol *proto, int index); -int TlenListFindNext(TlenProtocol *proto, TLEN_LIST list, int fromOffset); -TLEN_LIST_ITEM *TlenListGetItemPtr(TlenProtocol *proto, TLEN_LIST list, const char *jid); -TLEN_LIST_ITEM *TlenListGetItemPtrFromIndex(TlenProtocol *proto, int index); -TLEN_LIST_ITEM *TlenListFindItemPtrById2(TlenProtocol *proto, TLEN_LIST list, const char *id); - -void TlenListAddResource(TlenProtocol *proto, TLEN_LIST list, const char *jid, int status, const char *statusMessage); -void TlenListRemoveResource(TlenProtocol *proto, TLEN_LIST list, const char *jid); - -#endif - diff --git a/protocols/Tlen/src/tlen_misc.cpp b/protocols/Tlen/src/tlen_misc.cpp deleted file mode 100644 index 4cb071da5a8..00000000000 --- a/protocols/Tlen/src/tlen_misc.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" -#include "tlen_list.h" - -void TlenDBAddEvent(TlenProtocol *proto, MCONTACT hContact, int eventType, DWORD flags, PBYTE pBlob, DWORD cbBlob) -{ - DBEVENTINFO dbei = {}; - dbei.szModule = proto->m_szModuleName; - dbei.timestamp = (DWORD) time(nullptr); - dbei.flags = flags; - dbei.eventType = eventType; - dbei.cbBlob = cbBlob; - dbei.pBlob = pBlob; - db_event_add(hContact, &dbei); -} - -void TlenDBAddAuthRequest(TlenProtocol *proto, char *jid, char *nick) -{ - MCONTACT hContact = TlenHContactFromJID(proto, jid); - if (hContact == NULL) { - hContact = db_add_contact(); - Proto_AddToContact(hContact, proto->m_szModuleName); - // strip resource if present - char *s = TlenLoginFromJID(jid); - _strlwr(s); - db_set_s(hContact, proto->m_szModuleName, "jid", s); - mir_free(s); - } - else db_unset(hContact, proto->m_szModuleName, "Hidden"); - - db_set_s(hContact, proto->m_szModuleName, "Nick", nick); - - proto->debugLogA("auth request: %s, %s", jid, nick); - DB_AUTH_BLOB blob(hContact, nick, nullptr, nullptr, jid, nullptr); - TlenDBAddEvent(proto, NULL, EVENTTYPE_AUTHREQUEST, 0, blob, blob.size()); -} - -char *TlenJIDFromHContact(TlenProtocol *proto, MCONTACT hContact) -{ - char *p = nullptr; - DBVARIANT dbv; - if (!db_get(hContact, proto->m_szModuleName, "jid", &dbv)) { - p = mir_strdup(dbv.pszVal); - db_free(&dbv); - } - return p; -} - -MCONTACT TlenHContactFromJID(TlenProtocol *proto, const char *jid) -{ - DBVARIANT dbv; - char *p; - if (jid == nullptr) - return NULL; - - for (MCONTACT hContact = db_find_first(proto->m_szModuleName); hContact; hContact = db_find_next(hContact, proto->m_szModuleName)) { - if ( db_get_s(hContact, proto->m_szModuleName, "jid", &dbv)) - continue; - - if ((p=dbv.pszVal) != nullptr) { - if (!mir_strcmpi(p, jid)) { // exact match (node@domain/resource) - db_free(&dbv); - return hContact; - } - } - db_free(&dbv); - } - - return NULL; -} - -MCONTACT TlenDBCreateContact(TlenProtocol *proto, char *jid, char *nick, BOOL temporary) -{ - MCONTACT hContact; - if (jid == nullptr || jid[0] == '\0') - return NULL; - - if ((hContact=TlenHContactFromJID(proto, jid)) == NULL) { - hContact = db_add_contact(); - Proto_AddToContact(hContact, proto->m_szModuleName); - db_set_s(hContact, proto->m_szModuleName, "jid", jid); - if (nick != nullptr && nick[0] != '\0') - db_set_s(hContact, proto->m_szModuleName, "Nick", nick); - if (temporary) - db_set_b(hContact, "CList", "NotOnList", 1); - } - return hContact; -} diff --git a/protocols/Tlen/src/tlen_muc.cpp b/protocols/Tlen/src/tlen_muc.cpp deleted file mode 100644 index 475ffa504d9..00000000000 --- a/protocols/Tlen/src/tlen_muc.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" -#include "tlen_list.h" -#include "tlen_iq.h" -#include "resource.h" -#include "tlen_muc.h" - -static int TlenMUCHandleEvent(void *ptr, WPARAM wParam, LPARAM lParam); -static int TlenMUCQueryContacts(TlenProtocol *proto, const char *roomId); -static int TlenMUCSendInvitation(TlenProtocol *proto, const char *roomID, const char *user); -static int TlenMUCSendPresence(TlenProtocol *proto, const char *roomID, const char *nick, int desiredStatus); -static int TlenMUCSendQuery(TlenProtocol *proto, int type, const char *parent, int page); - -static int isSelf(TlenProtocol *proto, const char *roomID, const char *nick) -{ - TLEN_LIST_ITEM *item; - int result; - result=0; - item = TlenListGetItemPtr(proto, LIST_CHATROOM, roomID); - if (item != nullptr) { - if (item->nick == nullptr) { - if (!mir_strcmp(nick, proto->threadData->username)) result = 1; - } else if (nick[0] == '~') { - if (!mir_strcmp(nick+1, item->nick)) { - result = 1; - } - } - } - return result; -} - -static int stringToHex(const char *str) -{ - int i, val; - val = 0; - for (i=0;i<2;i++) { - val <<= 4; - if (str[i] >= 'A' && str[i] <= 'F') { - val += 10 + str[i]-'A'; - } else if (str[i] >= '0' && str[i] <= '9') { - val += str[i]-'0'; - } - } - return val; - -} -static char *getDisplayName(TlenProtocol *proto, const char *id) -{ - char jid[256]; - MCONTACT hContact; - DBVARIANT dbv; - if (!db_get(NULL, proto->m_szModuleName, "LoginServer", &dbv)) { - mir_snprintf(jid, "%s@%s", id, dbv.pszVal); - db_free(&dbv); - if (((hContact = TlenHContactFromJID(proto, jid)) != NULL) || !mir_strcmp(id, proto->threadData->username)) { - ptrW szName(Contact_GetInfo(CNF_DISPLAY, hContact, proto->m_szModuleName)); - if (szName) - return mir_u2a(szName); - } - } - return mir_strdup(id); -} - -int TlenMUCRecvInvitation(TlenProtocol *proto, const char *roomId, const char*, const char *from, const char*) -{ - int ignore, ask, groupChatPolicy; - if (roomId == nullptr) return 1; - groupChatPolicy = db_get_w(NULL, proto->m_szModuleName, "GroupChatPolicy", 0); - ask = TRUE; - ignore = FALSE; - if (groupChatPolicy == TLEN_MUC_ASK) { - ignore = FALSE; - ask = TRUE; - } else if (groupChatPolicy == TLEN_MUC_IGNORE_ALL) { - ignore = TRUE; - } else if (groupChatPolicy == TLEN_MUC_IGNORE_NIR) { - char jid[256]; - DBVARIANT dbv; - if (!db_get(NULL, proto->m_szModuleName, "LoginServer", &dbv)) { - mir_snprintf(jid, "%s@%s", from, dbv.pszVal); - db_free(&dbv); - } else { - mir_strcpy(jid, from); - } - ignore = !IsAuthorized(proto, jid); - ask = TRUE; - } else if (groupChatPolicy == TLEN_MUC_ACCEPT_IR) { - char jid[256]; - TLEN_LIST_ITEM *item; - DBVARIANT dbv; - if (!db_get(NULL, proto->m_szModuleName, "LoginServer", &dbv)) { - mir_snprintf(jid, "%s@%s", from, dbv.pszVal); - db_free(&dbv); - } else { - mir_strcpy(jid, from); - } - item = TlenListGetItemPtr(proto, LIST_ROSTER, jid); - ask = !IsAuthorized(proto, jid); - ignore = FALSE; - } else if (groupChatPolicy == TLEN_MUC_ACCEPT_ALL) { - ask = FALSE; - ignore = FALSE; - } - return 0; -} - -static int TlenMUCSendInvitation(TlenProtocol *proto, const char *roomID, const char *user) -{ - if (!proto->isOnline) { - return 1; - } - TlenSend(proto, "", roomID, user); - return 0; -} - -static int TlenMUCSendPresence(TlenProtocol *proto, const char *roomID, const char *nick, int desiredStatus) -{ - char str[512]; - char *jid; - TLEN_LIST_ITEM *item; - if (!proto->isOnline) { - return 1; - } - if (nick != nullptr) { - mir_snprintf(str, "%s/%s", roomID, nick); - } else { - strncpy_s(str, roomID, _TRUNCATE); - } - if ((jid = TlenTextEncode(str)) != nullptr) { - switch (desiredStatus) { - case ID_STATUS_ONLINE: - TlenSend(proto, "

", jid); - item = TlenListGetItemPtr(proto, LIST_CHATROOM, roomID); - if (item != nullptr) { - if (item->nick != nullptr) mir_free(item->nick); - item->nick = nullptr; - if (nick != nullptr) { - item->nick = mir_strdup(nick); - } - } - break; - default: - item = TlenListGetItemPtr(proto, LIST_CHATROOM, roomID); - if (item != nullptr) { - TlenSend(proto, "

unavailable

", jid); - TlenListRemove(proto, LIST_CHATROOM, roomID); - } - break; - } - mir_free(jid); - } - return 0; -} - -static int TlenMUCSendQuery(TlenProtocol *proto, int type, const char *parent, int page) -{ - if (!proto->isOnline) { - return 1; - } - if (type == 3) { // find chat room by name - char serialId[32]; - TLEN_LIST_ITEM *item; - mir_snprintf(serialId, TLEN_IQID"%d", TlenSerialNext(proto)); - item = TlenListAdd(proto, LIST_SEARCH, serialId); - item->roomName = mir_strdup(parent); - TlenSend(proto, "", parent, serialId); - } else { - if (parent == nullptr) { - TlenSend(proto, "", type); - } else { // 1 - groups, 2 - chat rooms, 7 - user nicks, 8 - user rooms - if (type == 1 || (type == 2 && page == 0) || type == 7 || type == 8) { - TlenSend(proto, "", type, parent); - } else if (type == 2) { - TlenSend(proto, "", type, parent, page); - } else if (type == 6) { - if (page) { - TlenSend(proto, "", type, parent); - } else { - TlenSend(proto, "", type, parent); - } - } else if (type == 4) { // list of users, admins etc. - TlenSend(proto, "", parent, type, page); - } - } - } - return 0; -} - -INT_PTR TlenProtocol::MUCMenuHandleMUC(WPARAM, LPARAM) -{ - if (!isOnline) - return 1; - - TlenSend(this, "

", TlenSerialNext(this)); - return 0; -} - -INT_PTR TlenProtocol::MUCContactMenuHandleMUC(WPARAM wParam, LPARAM) -{ - MCONTACT hContact; - DBVARIANT dbv; - TLEN_LIST_ITEM *item; - if (!isOnline) - return 1; - - if ((hContact=wParam) != NULL && isOnline) { - if (!db_get(hContact, m_szModuleName, "jid", &dbv)) { - char serialId[32]; - mir_snprintf(serialId, TLEN_IQID"%d", TlenSerialNext(this)); - item = TlenListAdd(this, LIST_INVITATIONS, serialId); - item->nick = mir_strdup(dbv.pszVal); - TlenSend(this, "

", serialId); - db_free(&dbv); - } - } - return 0; -} diff --git a/protocols/Tlen/src/tlen_muc.h b/protocols/Tlen/src/tlen_muc.h deleted file mode 100644 index 419bf9ea2b7..00000000000 --- a/protocols/Tlen/src/tlen_muc.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2004-2007 Piotr Piastucki - -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. - -*/ - -#ifndef _TLEN_MUC_H_ -#define _TLEN_MUC_H_ - -#include - -#define USER_FLAGS_OWNER 0x01 -#define USER_FLAGS_ADMIN 0x02 -#define USER_FLAGS_REGISTERED 0x04 -#define USER_FLAGS_GLOBALOWNER 0x08 -#define USER_FLAGS_KICKED 0x80 - -extern int TlenMUCRecvInvitation(TlenProtocol *proto, const char *roomJid, const char *roomName, const char *from, const char *reason); - -#endif diff --git a/protocols/Tlen/src/tlen_opt.cpp b/protocols/Tlen/src/tlen_opt.cpp deleted file mode 100644 index 2c7486e555c..00000000000 --- a/protocols/Tlen/src/tlen_opt.cpp +++ /dev/null @@ -1,697 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" -#include "tlen_list.h" -#include "tlen_voice.h" -#include -#include "resource.h" - -static INT_PTR CALLBACK TlenBasicOptDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); -static INT_PTR CALLBACK TlenVoiceOptDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); -static INT_PTR CALLBACK TlenAdvOptDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); -static INT_PTR CALLBACK TlenPopupsDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); - -typedef struct TabDefStruct { - DLGPROC dlgProc; - DWORD dlgId; - wchar_t *tabName; -} TabDef; - -static TabDef tabPages[] = { - {TlenBasicOptDlgProc, IDD_OPTIONS_BASIC, LPGENW("General")}, - {TlenVoiceOptDlgProc, IDD_OPTIONS_VOICE, LPGENW("Voice Chats")}, - {TlenAdvOptDlgProc, IDD_OPTIONS_ADVANCED, LPGENW("Advanced")}, - {TlenPopupsDlgProc, IDD_OPTIONS_POPUPS, LPGENW("Notifications")} - }; - -void TlenLoadOptions(TlenProtocol *proto) -{ - proto->tlenOptions.savePassword = db_get_b(NULL, proto->m_szModuleName, "SavePassword", TRUE); - proto->tlenOptions.useEncryption = db_get_b(NULL, proto->m_szModuleName, "UseEncryption", TRUE); - proto->tlenOptions.reconnect = db_get_b(NULL, proto->m_szModuleName, "Reconnect", TRUE); - proto->tlenOptions.alertPolicy = db_get_w(NULL, proto->m_szModuleName, "AlertPolicy", TLEN_ALERTS_IGNORE_NIR); - proto->tlenOptions.rosterSync = db_get_b(NULL, proto->m_szModuleName, "RosterSync", FALSE); - proto->tlenOptions.offlineAsInvisible = db_get_b(NULL, proto->m_szModuleName, "OfflineAsInvisible", FALSE); - proto->tlenOptions.leaveOfflineMessage = db_get_b(NULL, proto->m_szModuleName, "LeaveOfflineMessage", TRUE); - proto->tlenOptions.offlineMessageOption = db_get_w(NULL, proto->m_szModuleName, "OfflineMessageOption", 0); - proto->tlenOptions.ignoreAdvertisements = db_get_b(NULL, proto->m_szModuleName, "IgnoreAdvertisements", TRUE); - proto->tlenOptions.groupChatPolicy = db_get_w(NULL, proto->m_szModuleName, "GroupChatPolicy", TLEN_MUC_ASK); - proto->tlenOptions.voiceChatPolicy = db_get_w(NULL, proto->m_szModuleName, "VoiceChatPolicy", TLEN_MUC_ASK); - proto->tlenOptions.imagePolicy = db_get_w(NULL, proto->m_szModuleName, "ImagePolicy",TLEN_IMAGES_IGNORE_NIR); - proto->tlenOptions.enableAvatars = db_get_b(NULL, proto->m_szModuleName, "EnableAvatars", TRUE); - proto->tlenOptions.enableVersion = db_get_b(NULL, proto->m_szModuleName, "EnableVersion", TRUE); - proto->tlenOptions.useNudge = db_get_b(NULL, proto->m_szModuleName, "UseNudge", FALSE); - proto->tlenOptions.logAlerts = db_get_b(NULL, proto->m_szModuleName, "LogAlerts", TRUE); - proto->tlenOptions.sendKeepAlive = db_get_b(NULL, proto->m_szModuleName, "KeepAlive", TRUE); - proto->tlenOptions.useNewP2P = TRUE; -} - -static int changed = 0; - -static void ApplyChanges(TlenProtocol *proto, int i) { - changed &= ~i; - if (changed == 0) { - TlenLoadOptions(proto); - } -} - -static void MarkChanges(int i, HWND hWnd) { - SendMessage(GetParent(hWnd), PSM_CHANGED, 0, 0); - changed |= i; -} - - -int TlenProtocol::OptionsInit(WPARAM wParam, LPARAM) -{ - OPTIONSDIALOGPAGE odp = { 0 }; - odp.hInstance = hInst; - odp.szGroup.w = LPGENW("Network"); - odp.szTitle.w = m_tszUserName; - odp.flags = ODPF_BOLDGROUPS | ODPF_UNICODE; - odp.dwInitParam = (LPARAM)this; - for (int i = 0; i < _countof(tabPages); i++) { - odp.pszTemplate = MAKEINTRESOURCEA(tabPages[i].dlgId); - odp.pfnDlgProc = tabPages[i].dlgProc; - odp.szTab.w = tabPages[i].tabName; - Options_AddPage(wParam, &odp); - } - return 0; -} - -static LRESULT CALLBACK TlenValidateUsernameWndProc(HWND hwndEdit, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) { - case WM_CHAR: - if (strchr("\"&'/:<>@", wParam&0xff) != nullptr) - return 0; - break; - } - return mir_callNextSubclass(hwndEdit, TlenValidateUsernameWndProc, msg, wParam, lParam); -} - -INT_PTR CALLBACK TlenAccMgrUIDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - char text[256]; - - TlenProtocol *proto = (TlenProtocol *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - switch (msg) { - case WM_INITDIALOG: - { - DBVARIANT dbv; - proto = (TlenProtocol *)lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)proto); - TranslateDialogDefault(hwndDlg); - if (!db_get_ws(NULL, proto->m_szModuleName, "LoginName", &dbv)) { - SetDlgItemText(hwndDlg, IDC_EDIT_USERNAME, dbv.ptszVal); - db_free(&dbv); - } - if (!db_get(NULL, proto->m_szModuleName, "Password", &dbv)) { - SetDlgItemTextA(hwndDlg, IDC_EDIT_PASSWORD, dbv.pszVal); - db_free(&dbv); - } - CheckDlgButton(hwndDlg, IDC_SAVEPASSWORD, db_get_b(NULL, proto->m_szModuleName, "SavePassword", BST_CHECKED)); - - mir_subclassWindow(GetDlgItem(hwndDlg, IDC_EDIT_USERNAME), TlenValidateUsernameWndProc); - } - return TRUE; - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDC_EDIT_USERNAME: - case IDC_EDIT_PASSWORD: - if ((HWND)lParam == GetFocus() && HIWORD(wParam) == EN_CHANGE) - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - break; - case IDC_SAVEPASSWORD: - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - break; - case IDC_REGISTERACCOUNT: - Utils_OpenUrl(TLEN_REGISTER); - break; - } - break; - case WM_NOTIFY: - switch (((LPNMHDR) lParam)->code) { - case PSN_APPLY: - { - bool reconnectRequired = false; - DBVARIANT dbv; - - GetDlgItemTextA(hwndDlg, IDC_EDIT_USERNAME, text, _countof(text)); - if (db_get(NULL, proto->m_szModuleName, "LoginName", &dbv)) { - reconnectRequired = true; - } - else { - if(mir_strcmp(text, dbv.pszVal)) - reconnectRequired = true; - db_free(&dbv); - } - db_set_s(NULL, proto->m_szModuleName, "LoginName", strlwr(text)); - - if (IsDlgButtonChecked(hwndDlg, IDC_SAVEPASSWORD)) { - GetDlgItemTextA(hwndDlg, IDC_EDIT_PASSWORD, text, _countof(text)); - if (db_get(NULL, proto->m_szModuleName, "Password", &dbv)) { - reconnectRequired = true; - } - else { - if(mir_strcmp(text, dbv.pszVal)) - reconnectRequired = true; - db_free(&dbv); - } - db_set_s(NULL, proto->m_szModuleName, "Password", text); - } - else - db_unset(NULL, proto->m_szModuleName, "Password"); - - db_set_b(NULL, proto->m_szModuleName, "SavePassword", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_SAVEPASSWORD)); - if (reconnectRequired && proto->isConnected) - MessageBox(hwndDlg, TranslateT("These changes will take effect the next time you connect to the Tlen network."), TranslateT("Tlen Protocol Option"), MB_OK|MB_SETFOREGROUND); - TlenLoadOptions(proto); - return TRUE; - } - } - break; - } - return FALSE; -} - -static INT_PTR CALLBACK TlenBasicOptDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - char text[256]; - - TlenProtocol *proto = (TlenProtocol *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - switch (msg) { - case WM_INITDIALOG: - { - DBVARIANT dbv; - proto = (TlenProtocol *)lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)proto); - TranslateDialogDefault(hwndDlg); - if (!db_get_ws(NULL, proto->m_szModuleName, "LoginName", &dbv)) { - SetDlgItemText(hwndDlg, IDC_EDIT_USERNAME, dbv.ptszVal); - db_free(&dbv); - } - if (!db_get(NULL, proto->m_szModuleName, "Password", &dbv)) { - SetDlgItemTextA(hwndDlg, IDC_EDIT_PASSWORD, dbv.pszVal); - db_free(&dbv); - } - CheckDlgButton(hwndDlg, IDC_SAVEPASSWORD, db_get_b(NULL, proto->m_szModuleName, "SavePassword", BST_CHECKED)); - - CheckDlgButton(hwndDlg, IDC_RECONNECT, proto->tlenOptions.reconnect ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_ROSTER_SYNC, proto->tlenOptions.rosterSync ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_SHOW_OFFLINE, proto->tlenOptions.offlineAsInvisible ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_OFFLINE_MESSAGE, proto->tlenOptions.leaveOfflineMessage ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_IGNORE_ADVERTISEMENTS, proto->tlenOptions.ignoreAdvertisements ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_AVATARS, proto->tlenOptions.enableAvatars ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_VERSIONINFO, proto->tlenOptions.enableVersion ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_NUDGE_SUPPORT, proto->tlenOptions.useNudge ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_LOG_ALERTS, proto->tlenOptions.logAlerts ? BST_CHECKED : BST_UNCHECKED); - - SendDlgItemMessage(hwndDlg, IDC_ALERT_POLICY, CB_ADDSTRING, 0, (LPARAM)TranslateT("Accept all alerts")); - SendDlgItemMessage(hwndDlg, IDC_ALERT_POLICY, CB_ADDSTRING, 0, (LPARAM)TranslateT("Ignore alerts from unauthorized contacts")); - SendDlgItemMessage(hwndDlg, IDC_ALERT_POLICY, CB_ADDSTRING, 0, (LPARAM)TranslateT("Ignore all alerts")); - SendDlgItemMessage(hwndDlg, IDC_ALERT_POLICY, CB_SETCURSEL, proto->tlenOptions.alertPolicy, 0); - - SendDlgItemMessage(hwndDlg, IDC_MUC_POLICY, CB_ADDSTRING, 0, (LPARAM)TranslateT("Always ask me")); - SendDlgItemMessage(hwndDlg, IDC_MUC_POLICY, CB_ADDSTRING, 0, (LPARAM)TranslateT("Accept invitations from authorized contacts")); - SendDlgItemMessage(hwndDlg, IDC_MUC_POLICY, CB_ADDSTRING, 0, (LPARAM)TranslateT("Accept all invitations")); - SendDlgItemMessage(hwndDlg, IDC_MUC_POLICY, CB_ADDSTRING, 0, (LPARAM)TranslateT("Ignore invitations from unauthorized contacts")); - SendDlgItemMessage(hwndDlg, IDC_MUC_POLICY, CB_ADDSTRING, 0, (LPARAM)TranslateT("Ignore all invitation")); - SendDlgItemMessage(hwndDlg, IDC_MUC_POLICY, CB_SETCURSEL, proto->tlenOptions.groupChatPolicy, 0); - - SendDlgItemMessage(hwndDlg, IDC_IMAGE_POLICY, CB_ADDSTRING, 0, (LPARAM)TranslateT("Accept all images")); - SendDlgItemMessage(hwndDlg, IDC_IMAGE_POLICY, CB_ADDSTRING, 0, (LPARAM)TranslateT("Ignore images from unauthorized contacts")); - SendDlgItemMessage(hwndDlg, IDC_IMAGE_POLICY, CB_ADDSTRING, 0, (LPARAM)TranslateT("Ignore all images")); - SendDlgItemMessage(hwndDlg, IDC_IMAGE_POLICY, CB_SETCURSEL, proto->tlenOptions.imagePolicy, 0); - - SendDlgItemMessage(hwndDlg, IDC_OFFLINE_MESSAGE_OPTION, CB_ADDSTRING, 0, (LPARAM)TranslateT("")); - SendDlgItemMessage(hwndDlg, IDC_OFFLINE_MESSAGE_OPTION, CB_ADDSTRING, 0, (LPARAM)pcli->pfnGetStatusModeDescription(ID_STATUS_ONLINE, 0)); - SendDlgItemMessage(hwndDlg, IDC_OFFLINE_MESSAGE_OPTION, CB_ADDSTRING, 0, (LPARAM)pcli->pfnGetStatusModeDescription(ID_STATUS_AWAY, 0)); - SendDlgItemMessage(hwndDlg, IDC_OFFLINE_MESSAGE_OPTION, CB_ADDSTRING, 0, (LPARAM)pcli->pfnGetStatusModeDescription(ID_STATUS_NA, 0)); - SendDlgItemMessage(hwndDlg, IDC_OFFLINE_MESSAGE_OPTION, CB_ADDSTRING, 0, (LPARAM)pcli->pfnGetStatusModeDescription(ID_STATUS_DND, 0)); - SendDlgItemMessage(hwndDlg, IDC_OFFLINE_MESSAGE_OPTION, CB_ADDSTRING, 0, (LPARAM)pcli->pfnGetStatusModeDescription(ID_STATUS_FREECHAT, 0)); - SendDlgItemMessage(hwndDlg, IDC_OFFLINE_MESSAGE_OPTION, CB_ADDSTRING, 0, (LPARAM)pcli->pfnGetStatusModeDescription(ID_STATUS_INVISIBLE, 0)); - SendDlgItemMessage(hwndDlg, IDC_OFFLINE_MESSAGE_OPTION, CB_SETCURSEL, proto->tlenOptions.offlineMessageOption, 0); - - mir_subclassWindow(GetDlgItem(hwndDlg, IDC_EDIT_USERNAME), TlenValidateUsernameWndProc); - return TRUE; - } - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDC_EDIT_USERNAME: - case IDC_EDIT_PASSWORD: - if ((HWND)lParam == GetFocus() && HIWORD(wParam) == EN_CHANGE) - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - break; - // Fall through - case IDC_SAVEPASSWORD: - case IDC_RECONNECT: - case IDC_ROSTER_SYNC: - case IDC_IGNORE_ADVERTISEMENTS: - case IDC_SHOW_OFFLINE: - case IDC_OFFLINE_MESSAGE: - MarkChanges(1, hwndDlg); - break; - case IDC_LOG_ALERTS: - CheckDlgButton(hwndDlg, IDC_NUDGE_SUPPORT, BST_UNCHECKED); - MarkChanges(1, hwndDlg); - break; - case IDC_NUDGE_SUPPORT: - CheckDlgButton(hwndDlg, IDC_LOG_ALERTS, BST_UNCHECKED); - MarkChanges(1, hwndDlg); - break; - case IDC_REGISTERACCOUNT: - Utils_OpenUrl(TLEN_REGISTER); - break; - case IDC_OFFLINE_MESSAGE_OPTION: - case IDC_ALERT_POLICY: - case IDC_MUC_POLICY: - if (HIWORD(wParam) == CBN_SELCHANGE) - MarkChanges(1, hwndDlg); - break; - default: - MarkChanges(1, hwndDlg); - break; - } - break; - case WM_NOTIFY: - switch (((LPNMHDR) lParam)->code) { - case PSN_APPLY: - { - bool reconnectRequired = false; - DBVARIANT dbv; - - GetDlgItemTextA(hwndDlg, IDC_EDIT_USERNAME, text, _countof(text)); - if (db_get(NULL, proto->m_szModuleName, "LoginName", &dbv)) { - reconnectRequired = true; - } - else { - if(mir_strcmp(text, dbv.pszVal)) - reconnectRequired = true; - db_free(&dbv); - } - db_set_s(NULL, proto->m_szModuleName, "LoginName", strlwr(text)); - - if (IsDlgButtonChecked(hwndDlg, IDC_SAVEPASSWORD)) { - GetDlgItemTextA(hwndDlg, IDC_EDIT_PASSWORD, text, _countof(text)); - if (db_get(NULL, proto->m_szModuleName, "Password", &dbv)) { - reconnectRequired = true; - } - else { - if(mir_strcmp(text, dbv.pszVal)) - reconnectRequired = true; - db_free(&dbv); - } - db_set_s(NULL, proto->m_szModuleName, "Password", text); - } - else - db_unset(NULL, proto->m_szModuleName, "Password"); - - db_set_b(NULL, proto->m_szModuleName, "SavePassword", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_SAVEPASSWORD)); - db_set_b(NULL, proto->m_szModuleName, "Reconnect", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_RECONNECT)); - db_set_b(NULL, proto->m_szModuleName, "RosterSync", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_ROSTER_SYNC)); - db_set_b(NULL, proto->m_szModuleName, "OfflineAsInvisible", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_SHOW_OFFLINE)); - db_set_b(NULL, proto->m_szModuleName, "IgnoreAdvertisements", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_IGNORE_ADVERTISEMENTS)); - db_set_b(NULL, proto->m_szModuleName, "LeaveOfflineMessage", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_OFFLINE_MESSAGE)); - db_set_w(NULL, proto->m_szModuleName, "OfflineMessageOption", (WORD) SendDlgItemMessage(hwndDlg, IDC_OFFLINE_MESSAGE_OPTION, CB_GETCURSEL, 0, 0)); - db_set_w(NULL, proto->m_szModuleName, "AlertPolicy", (WORD) SendDlgItemMessage(hwndDlg, IDC_ALERT_POLICY, CB_GETCURSEL, 0, 0)); - db_set_w(NULL, proto->m_szModuleName, "GroupChatPolicy", (WORD) SendDlgItemMessage(hwndDlg, IDC_MUC_POLICY, CB_GETCURSEL, 0, 0)); - db_set_w(NULL, proto->m_szModuleName, "ImagePolicy", (WORD) SendDlgItemMessage(hwndDlg, IDC_IMAGE_POLICY, CB_GETCURSEL, 0, 0)); - db_set_b(NULL, proto->m_szModuleName, "EnableAvatars", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_AVATARS)); - db_set_b(NULL, proto->m_szModuleName, "EnableVersion", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_VERSIONINFO)); - db_set_b(NULL, proto->m_szModuleName, "UseNudge", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_NUDGE_SUPPORT)); - db_set_b(NULL, proto->m_szModuleName, "LogAlerts", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_LOG_ALERTS)); - if (reconnectRequired && proto->isConnected) - MessageBox(hwndDlg, TranslateT("These changes will take effect the next time you connect to the Tlen network."), TranslateT("Tlen Protocol Option"), MB_OK|MB_SETFOREGROUND); - ApplyChanges(proto, 1); - return TRUE; - } - } - break; - } - return FALSE; -} - -static INT_PTR CALLBACK TlenVoiceOptDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - TlenProtocol *proto = (TlenProtocol *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - switch (msg) { - case WM_INITDIALOG: - { - TranslateDialogDefault(hwndDlg); - proto = (TlenProtocol *)lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)proto); - SendDlgItemMessage(hwndDlg, IDC_VOICE_POLICY, CB_ADDSTRING, 0, (LPARAM)TranslateT("Always ask me")); - SendDlgItemMessage(hwndDlg, IDC_VOICE_POLICY, CB_ADDSTRING, 0, (LPARAM)TranslateT("Accept invitations from authorized contacts")); - SendDlgItemMessage(hwndDlg, IDC_VOICE_POLICY, CB_ADDSTRING, 0, (LPARAM)TranslateT("Accept all invitations")); - SendDlgItemMessage(hwndDlg, IDC_VOICE_POLICY, CB_ADDSTRING, 0, (LPARAM)TranslateT("Ignore invitations from unauthorized contacts")); - SendDlgItemMessage(hwndDlg, IDC_VOICE_POLICY, CB_ADDSTRING, 0, (LPARAM)TranslateT("Ignore all invitation")); - SendDlgItemMessage(hwndDlg, IDC_VOICE_POLICY, CB_SETCURSEL, proto->tlenOptions.voiceChatPolicy, 0); - TlenVoiceBuildInDeviceList(proto, GetDlgItem(hwndDlg, IDC_VOICE_DEVICE_IN)); - TlenVoiceBuildOutDeviceList(proto, GetDlgItem(hwndDlg, IDC_VOICE_DEVICE_OUT)); - return TRUE; - } - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDC_VOICE_POLICY: - case IDC_VOICE_DEVICE_IN: - case IDC_VOICE_DEVICE_OUT: - if (HIWORD(wParam) == CBN_SELCHANGE) - MarkChanges(2, hwndDlg); - break; - } - break; - case WM_NOTIFY: - switch (((LPNMHDR) lParam)->code) { - case PSN_APPLY: - { - db_set_w(NULL, proto->m_szModuleName, "VoiceChatPolicy", (WORD) SendDlgItemMessage(hwndDlg, IDC_VOICE_POLICY, CB_GETCURSEL, 0, 0)); - db_set_w(NULL, proto->m_szModuleName, "VoiceDeviceIn", (WORD) SendDlgItemMessage(hwndDlg, IDC_VOICE_DEVICE_IN, CB_GETCURSEL, 0, 0)); - db_set_w(NULL, proto->m_szModuleName, "VoiceDeviceOut", (WORD) SendDlgItemMessage(hwndDlg, IDC_VOICE_DEVICE_OUT, CB_GETCURSEL, 0, 0)); - ApplyChanges(proto, 2); - return TRUE; - } - } - break; - } - - return FALSE; -} - -static INT_PTR CALLBACK TlenAdvOptDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - char text[256]; - BOOL bChecked; - TlenProtocol *proto = (TlenProtocol *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - - switch (msg) { - case WM_INITDIALOG: - { - DBVARIANT dbv; - proto = (TlenProtocol *)lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)proto); - TranslateDialogDefault(hwndDlg); - if (!db_get_ws(NULL, proto->m_szModuleName, "LoginServer", &dbv)) { - SetDlgItemText(hwndDlg, IDC_EDIT_LOGIN_SERVER, dbv.ptszVal); - db_free(&dbv); - } - else SetDlgItemText(hwndDlg, IDC_EDIT_LOGIN_SERVER, L"tlen.pl"); - - EnableWindow(GetDlgItem(hwndDlg, IDC_HOST), TRUE); - EnableWindow(GetDlgItem(hwndDlg, IDC_HOSTPORT), TRUE); - - if (!db_get_ws(NULL, proto->m_szModuleName, "ManualHost", &dbv)) { - SetDlgItemText(hwndDlg, IDC_HOST, dbv.ptszVal); - db_free(&dbv); - } - else SetDlgItemText(hwndDlg, IDC_HOST, L"s1.tlen.pl"); - - SetDlgItemInt(hwndDlg, IDC_HOSTPORT, db_get_w(NULL, proto->m_szModuleName, "ManualPort", TLEN_DEFAULT_PORT), FALSE); - - CheckDlgButton(hwndDlg, IDC_KEEPALIVE, db_get_b(NULL, proto->m_szModuleName, "KeepAlive", TRUE) ? BST_CHECKED : BST_UNCHECKED); - - CheckDlgButton(hwndDlg, IDC_USE_SSL, db_get_b(NULL, proto->m_szModuleName, "UseEncryption", TRUE) ? BST_CHECKED : BST_UNCHECKED); - - CheckDlgButton(hwndDlg, IDC_VISIBILITY_SUPPORT, db_get_b(NULL, proto->m_szModuleName, "VisibilitySupport", FALSE) ? BST_CHECKED : BST_UNCHECKED); - // File transfer options - bChecked = FALSE; - if (db_get_b(NULL, proto->m_szModuleName, "UseFileProxy", FALSE) == TRUE) { - bChecked = TRUE; - CheckDlgButton(hwndDlg, IDC_FILE_USE_PROXY, BST_CHECKED); - } - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_TYPE_LABEL), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_TYPE), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_HOST_LABEL), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_HOST), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_PORT_LABEL), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_PORT), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_USE_AUTH), bChecked); - if (db_get_b(NULL, proto->m_szModuleName, "FileProxyAuth", FALSE) == TRUE) - CheckDlgButton(hwndDlg, IDC_FILE_PROXY_USE_AUTH, BST_CHECKED); - else - bChecked = FALSE; - - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_USER_LABEL), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_USER), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_PASSWORD_LABEL), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_PASSWORD), bChecked); - - SendDlgItemMessage(hwndDlg, IDC_FILE_PROXY_TYPE, CB_ADDSTRING, 0, (LPARAM)TranslateT("Forwarding")); - SendDlgItemMessage(hwndDlg, IDC_FILE_PROXY_TYPE, CB_ADDSTRING, 0, (LPARAM)L"SOCKS4"); - SendDlgItemMessage(hwndDlg, IDC_FILE_PROXY_TYPE, CB_ADDSTRING, 0, (LPARAM)L"SOCKS5"); - SendDlgItemMessage(hwndDlg, IDC_FILE_PROXY_TYPE, CB_SETCURSEL, db_get_w(NULL, proto->m_szModuleName, "FileProxyType", 0), 0); - if (!db_get_ws(NULL, proto->m_szModuleName, "FileProxyHost", &dbv)) { - SetDlgItemText(hwndDlg, IDC_FILE_PROXY_HOST, dbv.ptszVal); - db_free(&dbv); - } - SetDlgItemInt(hwndDlg, IDC_FILE_PROXY_PORT, db_get_w(NULL, proto->m_szModuleName, "FileProxyPort", 0), FALSE); - if (!db_get_ws(NULL, proto->m_szModuleName, "FileProxyUsername", &dbv)) { - SetDlgItemText(hwndDlg, IDC_FILE_PROXY_USER, dbv.ptszVal); - db_free(&dbv); - } - if (!db_get_s(NULL, proto->m_szModuleName, "FileProxyPassword", &dbv)) { - SetDlgItemTextA(hwndDlg, IDC_FILE_PROXY_PASSWORD, dbv.pszVal); - db_free(&dbv); - } - return TRUE; - } - case WM_COMMAND: - { - switch (LOWORD(wParam)) { - case IDC_FILE_PROXY_TYPE: - if (HIWORD(wParam) == CBN_SELCHANGE) - MarkChanges(4, hwndDlg); - break; - case IDC_EDIT_LOGIN_SERVER: - case IDC_HOST: - case IDC_HOSTPORT: - case IDC_FILE_PROXY_HOST: - case IDC_FILE_PROXY_PORT: - case IDC_FILE_PROXY_USER: - case IDC_FILE_PROXY_PASSWORD: - if ((HWND)lParam == GetFocus() && HIWORD(wParam) == EN_CHANGE) - MarkChanges(4, hwndDlg); - break; - case IDC_FILE_USE_PROXY: - bChecked = IsDlgButtonChecked(hwndDlg, IDC_FILE_USE_PROXY); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_TYPE_LABEL), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_TYPE), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_HOST_LABEL), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_HOST), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_PORT_LABEL), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_PORT), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_USE_AUTH), bChecked); - case IDC_FILE_PROXY_USE_AUTH: - bChecked = IsDlgButtonChecked(hwndDlg, IDC_FILE_PROXY_USE_AUTH) & IsDlgButtonChecked(hwndDlg, IDC_FILE_USE_PROXY); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_USER_LABEL), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_USER), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_PASSWORD_LABEL), bChecked); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILE_PROXY_PASSWORD), bChecked); - MarkChanges(4, hwndDlg); - break; - case IDC_KEEPALIVE: - case IDC_VISIBILITY_SUPPORT: - case IDC_USE_SSL: - MarkChanges(4, hwndDlg); - break; - } - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR) lParam)->code) { - case PSN_APPLY: - WORD port; - BOOL useEncryption; - bool reconnectRequired = false; - DBVARIANT dbv; - - GetDlgItemTextA(hwndDlg, IDC_EDIT_LOGIN_SERVER, text, _countof(text)); - if (db_get(NULL, proto->m_szModuleName, "LoginServer", &dbv)) { - reconnectRequired = true; - } - else { - if(mir_strcmp(text, dbv.pszVal)) - reconnectRequired = true; - db_free(&dbv); - } - db_set_s(NULL, proto->m_szModuleName, "LoginServer", strlwr(text)); - - GetDlgItemTextA(hwndDlg, IDC_HOST, text, _countof(text)); - if (db_get(NULL, proto->m_szModuleName, "ManualHost", &dbv)) { - reconnectRequired = true; - } - else { - if(mir_strcmp(text, dbv.pszVal)) - reconnectRequired = true; - db_free(&dbv); - } - db_set_s(NULL, proto->m_szModuleName, "ManualHost", text); - - port = (WORD) GetDlgItemInt(hwndDlg, IDC_HOSTPORT, nullptr, FALSE); - if (db_get_w(NULL, proto->m_szModuleName, "ManualPort", TLEN_DEFAULT_PORT) != port) - reconnectRequired = true; - db_set_w(NULL, proto->m_szModuleName, "ManualPort", port); - - proto->tlenOptions.sendKeepAlive = IsDlgButtonChecked(hwndDlg, IDC_KEEPALIVE); - db_set_b(NULL, proto->m_szModuleName, "KeepAlive", (BYTE) proto->tlenOptions.sendKeepAlive); - - useEncryption = IsDlgButtonChecked(hwndDlg, IDC_USE_SSL); - if (db_get_b(NULL, proto->m_szModuleName, "UseEncryption", TRUE) != useEncryption) - reconnectRequired = true; - db_set_b(NULL, proto->m_szModuleName, "UseEncryption", (BYTE) useEncryption); - - db_set_b(NULL, proto->m_szModuleName, "VisibilitySupport", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_VISIBILITY_SUPPORT)); - - // File transfer options - db_set_b(NULL, proto->m_szModuleName, "UseFileProxy", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_FILE_USE_PROXY)); - db_set_w(NULL, proto->m_szModuleName, "FileProxyType", (WORD) SendDlgItemMessage(hwndDlg, IDC_FILE_PROXY_TYPE, CB_GETCURSEL, 0, 0)); - - GetDlgItemTextA(hwndDlg, IDC_FILE_PROXY_HOST, text, _countof(text)); - db_set_s(NULL, proto->m_szModuleName, "FileProxyHost", text); - - db_set_w(NULL, proto->m_szModuleName, "FileProxyPort", (WORD) GetDlgItemInt(hwndDlg, IDC_FILE_PROXY_PORT, nullptr, FALSE)); - db_set_b(NULL, proto->m_szModuleName, "FileProxyAuth", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_FILE_PROXY_USE_AUTH)); - - GetDlgItemTextA(hwndDlg, IDC_FILE_PROXY_USER, text, _countof(text)); - db_set_s(NULL, proto->m_szModuleName, "FileProxyUsername", text); - - GetDlgItemTextA(hwndDlg, IDC_FILE_PROXY_PASSWORD, text, _countof(text)); - db_set_s(NULL, proto->m_szModuleName, "FileProxyPassword", text); - - if (reconnectRequired && proto->isConnected) - MessageBox(hwndDlg, TranslateT("These changes will take effect the next time you connect to the Tlen network."), TranslateT("Tlen Protocol Option"), MB_OK|MB_SETFOREGROUND); - ApplyChanges(proto, 4); - return TRUE; - } - break; - } - - return FALSE; -} - -#define POPUP_DEFAULT_COLORBKG 0xDCBDA5 -#define POPUP_DEFAULT_COLORTXT 0x000000 - -static void MailPopupPreview(DWORD colorBack, DWORD colorText, wchar_t *title, wchar_t *emailInfo, int delay) -{ - if (!ServiceExists(MS_POPUP_ADDPOPUPT)) - return; - POPUPDATAT ppd = { 0 }; - HICON hIcon = GetIcolibIcon(IDI_MAIL); - ppd.lchIcon = CopyIcon(hIcon); - ReleaseIcolibIcon(hIcon); - wcsncpy(ppd.lptzContactName, title, MAX_CONTACTNAME-1); - wcsncpy(ppd.lptzText, emailInfo,MAX_SECONDLINE-1); - ppd.colorBack = colorBack; - ppd.colorText = colorText; - ppd.iSeconds = delay; - PUAddPopupT(&ppd); -} - -static INT_PTR CALLBACK TlenPopupsDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - TlenProtocol *proto = (TlenProtocol *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - switch (msg) { - case WM_INITDIALOG: - { - BYTE delayMode; - proto = (TlenProtocol *)lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)proto); - TranslateDialogDefault(hwndDlg); - CheckDlgButton(hwndDlg, IDC_ENABLEPOPUP, db_get_b(NULL, proto->m_szModuleName, "MailPopupEnabled", TRUE) ? BST_CHECKED : BST_UNCHECKED); - SendDlgItemMessage(hwndDlg, IDC_COLORBKG, CPM_SETCOLOUR, 0, db_get_dw(NULL, proto->m_szModuleName, "MailPopupBack", POPUP_DEFAULT_COLORBKG)); - SendDlgItemMessage(hwndDlg, IDC_COLORTXT, CPM_SETCOLOUR, 0, db_get_dw(NULL, proto->m_szModuleName, "MailPopupText", POPUP_DEFAULT_COLORTXT)); - SetDlgItemInt(hwndDlg, IDC_DELAY, db_get_dw(NULL, proto->m_szModuleName, "MailPopupDelay", 4), FALSE); - delayMode = db_get_b(NULL, proto->m_szModuleName, "MailPopupDelayMode", 0); - if (delayMode == 1) { - CheckDlgButton(hwndDlg, IDC_DELAY_CUSTOM, BST_CHECKED); - } else if (delayMode == 2) { - CheckDlgButton(hwndDlg, IDC_DELAY_PERMANENT, BST_CHECKED); - } else { - CheckDlgButton(hwndDlg, IDC_DELAY_POPUP, BST_CHECKED); - } - return TRUE; - } - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDC_COLORTXT: - case IDC_COLORBKG: - case IDC_ENABLEPOPUP: - case IDC_DELAY: - case IDC_DELAY_POPUP: - case IDC_DELAY_CUSTOM: - case IDC_DELAY_PERMANENT: - MarkChanges(8, hwndDlg); - break; - case IDC_PREVIEW: - { - int delay; - wchar_t title[256]; - if (IsDlgButtonChecked(hwndDlg, IDC_DELAY_POPUP)) { - delay=0; - } else if (IsDlgButtonChecked(hwndDlg, IDC_DELAY_PERMANENT)) { - delay=-1; - } else { - delay=GetDlgItemInt(hwndDlg, IDC_DELAY, nullptr, FALSE); - } - mir_snwprintf(title, TranslateT("%S mail"), proto->m_szModuleName); - MailPopupPreview((DWORD) SendDlgItemMessage(hwndDlg,IDC_COLORBKG,CPM_GETCOLOUR,0,0), - (DWORD) SendDlgItemMessage(hwndDlg,IDC_COLORTXT,CPM_GETCOLOUR,0,0), - title, - L"From: test@test.test\nSubject: test", - delay); - } - - } - break; - - - case WM_NOTIFY: - switch (((LPNMHDR) lParam)->code) { - case PSN_APPLY: - { - BYTE delayMode; - db_set_b(NULL, proto->m_szModuleName, "MailPopupEnabled", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_ENABLEPOPUP)); - db_set_dw(NULL, proto->m_szModuleName, "MailPopupBack", (DWORD) SendDlgItemMessage(hwndDlg,IDC_COLORBKG,CPM_GETCOLOUR,0,0)); - db_set_dw(NULL, proto->m_szModuleName, "MailPopupText", (DWORD) SendDlgItemMessage(hwndDlg,IDC_COLORTXT,CPM_GETCOLOUR,0,0)); - db_set_dw(NULL, proto->m_szModuleName, "MailPopupDelay", (DWORD) GetDlgItemInt(hwndDlg,IDC_DELAY, nullptr, FALSE)); - delayMode=0; - if (IsDlgButtonChecked(hwndDlg, IDC_DELAY_CUSTOM)) { - delayMode=1; - } else if (IsDlgButtonChecked(hwndDlg, IDC_DELAY_PERMANENT)) { - delayMode=2; - - } - db_set_b(NULL, proto->m_szModuleName, "MailPopupDelayMode", delayMode); - ApplyChanges(proto, 8); - return TRUE; - } - } - break; - - } - return FALSE; -} - diff --git a/protocols/Tlen/src/tlen_p2p_new.cpp b/protocols/Tlen/src/tlen_p2p_new.cpp deleted file mode 100644 index f8c8c0d15ac..00000000000 --- a/protocols/Tlen/src/tlen_p2p_new.cpp +++ /dev/null @@ -1,343 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" -#include "tlen_p2p_old.h" -#include -#include -#include -#include -#include "tlen_list.h" - - -static void logInfo(const char *filename, const char *fmt, ...) { - va_list vararg; - FILE *flog=fopen(filename,"at"); - if (flog != nullptr) { - SYSTEMTIME time; - GetLocalTime(&time); - va_start(vararg, fmt); - int strsize=2048; - char *str = (char *) mir_alloc(strsize); - while (mir_vsnprintf(str, strsize, fmt, vararg) == -1) - str = (char *) realloc(str, strsize+=2048); - va_end(vararg); - fprintf(flog,"%04d-%02d-%02d %02d:%02d:%02d,%03d [%s]",time.wYear,time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond,time.wMilliseconds, "INFO"); - fprintf(flog," %s\n",str); - mir_free(str); - fclose(flog); - } -} - -void __cdecl TlenNewFileReceiveThread(TLEN_FILE_TRANSFER *ft) -{ - ft->proto->debugLogA("P2P receive thread started"); - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTING, ft, 0); -// ft->mode = FT_RECV; -// ft->currentFile = 0; -// ft->state = FT_CONNECTING; - { - FILE * fout = fopen("tlen_recv.dxx", "wt"); - SOCKADDR_IN toad; - toad.sin_family = AF_INET; - toad.sin_addr.s_addr = inet_addr(ft->hostName); - toad.sin_port = htons(ft->wPort); - if (fout != nullptr) { - fprintf(fout, "START:\n"); - } - if (fout != nullptr) { - fclose(fout); - } - while (ft->udps != INVALID_SOCKET) { - SOCKADDR_IN cad; - int alen; - int j, n; - unsigned char buff[1024]; - alen = sizeof(struct sockaddr); - n=recvfrom(ft->udps, (char*)buff,sizeof(buff),0, (struct sockaddr *) &cad, &alen); - if (n<0) { - break; - } - logInfo("tlen_recv.dxx", "UDP"); - fout = fopen("tlen_recv.dxx", "at"); - if (fout != nullptr) { - fprintf(fout, "\n|RECV %d bytes from %s:%d|",n, inet_ntoa(cad.sin_addr), cad.sin_port); - for (j = 0; j < n; j++) { - fprintf(fout, "%02X-", buff[j]); - } - } - if (n == 1) { - alen = sizeof(struct sockaddr); - n = sendto(ft->udps, (char*)buff, n, 0,(struct sockaddr *) &toad, alen); - if (fout != nullptr) { - fprintf(fout, "\n|SEND |"); - for (j = 0; j < n; j++) { - fprintf(fout, "%02X-", buff[j]); - } - } - } - if (fout != nullptr) { - fprintf(fout, "\n"); - fclose(fout); - } - } - } - if (ft->udps != INVALID_SOCKET) { - closesocket(ft->udps); - } - - TlenListRemove(ft->proto, LIST_FILE, ft->iqId); - if (ft->state == FT_DONE) - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, ft, 0); - else { - ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); - } - ft->proto->debugLogA("P2P receive thread ended"); - TlenP2PFreeFileTransfer(ft); -} - -void __cdecl TlenNewFileSendThread(TLEN_FILE_TRANSFER *ft) -{ - ft->proto->debugLogA("P2P send thread started"); -// ft->mode = FT_RECV; -// ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTING, ft, 0); -// ft->currentFile = 0; -// ft->state = FT_CONNECTING; - { - FILE * fout = fopen("tlen_send.gxx", "wt"); - int step = 0; - SOCKADDR_IN toad; - toad.sin_family = AF_INET; - toad.sin_addr.s_addr = inet_addr(ft->hostName); - toad.sin_port = htons(ft->wPort); - - if (fout != nullptr) { - fprintf(fout, "START:"); - } - for (step = 0; step < 10; step ++) { -// while (ft->udps != INVALID_SOCKET) { - int alen; - int j, n; - unsigned char buff[1024]; - alen = sizeof(struct sockaddr); - if (step < 3 || step > 5) { - buff[0] = 1; - n = 1; - } else { - buff[0] = '$'; - buff[1] = '^'; - buff[2] = '&'; - buff[3] = '%'; - n = 4; - } - n=sendto(ft->udps, (char*)buff, n, 0, (struct sockaddr *)&toad, alen); - logInfo("tlen_send.dxx", "UDP"); - if (fout != nullptr) { - fprintf(fout, "|send: %d %s %d|",n, inet_ntoa(toad.sin_addr), toad.sin_port); - for (j = 0; j < n; j++) { - fprintf(fout, "%02X-", buff[j]); - } - } - if (fout != nullptr) { - fprintf(fout, "\n"); - } - SleepEx(1000, TRUE); - } - if (fout != nullptr) { - fclose(fout); - } - } - ft->proto->debugLogA("P2P send thread ended"); -} - -void TlenBindUDPSocket(TLEN_FILE_TRANSFER *ft) -{ - ft->proto->debugLogA("Binding UDP socket"); - ft->udps = socket(PF_INET, SOCK_DGRAM, 0); - if (ft->udps != INVALID_SOCKET) { - SOCKADDR_IN sin; - int len = sizeof(struct sockaddr); - memset((char *)&sin,0,sizeof(sin)); - sin.sin_family = AF_INET; - sin.sin_addr.s_addr = htonl(INADDR_ANY); - sin.sin_port = 0; - if (bind(ft->udps, (struct sockaddr *)&sin, sizeof(sin)) >= 0) { - if (!getsockname((SOCKET)ft->udps,(SOCKADDR *)&sin,&len)) { - struct hostent *hp; - char host_name[256]; - gethostname(host_name, sizeof(host_name)); - hp = gethostbyname(host_name); - mir_snprintf(host_name, "%u.%u.%u.%u", (unsigned char)hp->h_addr_list[0][0], - (unsigned char)hp->h_addr_list[0][1], - (unsigned char)hp->h_addr_list[0][2], - (unsigned char)hp->h_addr_list[0][3]); - - ft->wLocalPort = ntohs(sin.sin_port); - ft->localName= mir_strdup(host_name); - ft->proto->debugLogA("UDP socket bound to %s:%d", ft->localName, ft->wLocalPort); - } - } - } -} - - -/* -aaa sends a file to bbb: - -1) aaa wants to SEND bbb a file -A SEND: -B RECV: - -2) bbb ACCEPTs -B SEND: -A RECV: - -3) aaa tries to establish p2p connection: -A SEND: -B SEND: - -3) bbb sends IP/port details -B SEND: - -*/ - -void __cdecl TlenProcessP2P(XmlNode *node, ThreadData *info) { - XmlNode *queryNode; - TLEN_LIST_ITEM *item; - char *from; - - if (info == nullptr) return; - - queryNode = TlenXmlGetChild(node, "query"); - if ((from=TlenXmlGetAttrValue(node, "from")) != nullptr) { - XmlNode *fs , *vs, *dcng, *dc; - /* file send */ - fs = TlenXmlGetChild(queryNode, "fs"); - /* voice send */ - vs = TlenXmlGetChild(queryNode, "vs"); - dcng = TlenXmlGetChild(queryNode, "dcng"); - dc = TlenXmlGetChild(queryNode, "dc"); - if (fs != nullptr) { - char *e, *id; - /* e - step in the process (starting with 1)*/ - /* i - id of the file */ - /* s - size of the file */ - /* c - number of files */ - /* v - ??? */ - e = TlenXmlGetAttrValue(fs, "e"); - id = TlenXmlGetAttrValue(fs, "i"); - if (e != nullptr) { - if (!mir_strcmp(e, "1")) { - TLEN_FILE_TRANSFER * ft = (TLEN_FILE_TRANSFER *) mir_alloc(sizeof(TLEN_FILE_TRANSFER)); - memset(ft, 0, sizeof(TLEN_FILE_TRANSFER)); - char *c = TlenXmlGetAttrValue(fs, "c"); - char *s = TlenXmlGetAttrValue(fs, "s"); - ft->jid = mir_strdup(from); - ft->proto = info->proto; - ft->hContact = TlenHContactFromJID(info->proto, from); - ft->iqId = mir_strdup(id); - ft->fileTotalSize = atoi(s); - ft->newP2P = TRUE; - if ((item=TlenListAdd(ft->proto, LIST_FILE, ft->iqId)) != nullptr) { - char fileInfo[128]; - item->ft = ft; - mir_snprintf(fileInfo, "%s file(s), %s bytes", c, s); - wchar_t* filenameT = mir_utf8decodeW((char*)fileInfo); - PROTORECVFILET pre = { 0 }; - pre.dwFlags = PRFF_UNICODE; - pre.fileCount = 1; - pre.timestamp = time(nullptr); - pre.descr.w = filenameT; - pre.files.w = &filenameT; - pre.lParam = (LPARAM)ft; - ft->proto->debugLogA("sending chainrecv"); - ProtoChainRecvFile(ft->hContact, &pre); - mir_free(filenameT); - } - } else if (!mir_strcmp(e, "3")) { - /* transfer error */ - } else if (!mir_strcmp(e, "4")) { - /* transfer denied */ - } else if (!mir_strcmp(e, "5")) { - /* transfer accepted */ - if ((item=TlenListGetItemPtr(info->proto, LIST_FILE, id)) != nullptr) { - item->id2 = mir_strdup("84273372"); - item->ft->id2 = mir_strdup("84273372"); - TlenSend(info->proto, "", from, item->id2, id); - } - } - } - } else if (vs != nullptr) { - - } else if (dcng != nullptr) { - info->proto->debugLogA("DCNG"); - char *s = TlenXmlGetAttrValue(dcng, "s"); - char *id2 = TlenXmlGetAttrValue(dcng, "i"); - char *id = TlenXmlGetAttrValue(dcng, "mi"); - if (!mir_strcmp(s, "1")) { - /* Keys */ - /* s - step */ - /* i - id of the file */ - /* ks - key size (in bytes) */ - /* mi - p2p connection id */ - /* ck - aes key */ - /* iv - aes initial vector */ - /* k - ? */ - /* v - ? */ - char *n = TlenXmlGetAttrValue(dcng, "n"); // n - name (file_send) - if (!mir_strcmp(n, "file_send")) { - if ((item=TlenListGetItemPtr(info->proto, LIST_FILE, id)) != nullptr) { - item->id2 = mir_strdup(id2); - item->ft->id2 = mir_strdup(id2); - TlenBindUDPSocket(item->ft); - TlenSend(info->proto, "", - item->ft->jid, item->ft->localName, item->ft->wLocalPort, item->ft->localName, item->ft->wLocalPort, item->ft->id2); - } - } - } else if (!mir_strcmp(s, "2")) { - info->proto->debugLogA("step = 2"); - info->proto->debugLogA("%s",from); - info->proto->debugLogA("%s",id2); - /* IP and port */ - if ((item=TlenListFindItemPtrById2(info->proto, LIST_FILE, id2)) != nullptr) { - item->ft->hostName = mir_strdup(TlenXmlGetAttrValue(dcng, "pa")); - item->ft->wPort = atoi(TlenXmlGetAttrValue(dcng, "pp")); - TlenBindUDPSocket(item->ft); - TlenSend(info->proto, "", - item->ft->jid, item->ft->localName, item->ft->wLocalPort, item->ft->localName, item->ft->wLocalPort, item->ft->id2); - mir_forkthread((pThreadFunc)TlenNewFileReceiveThread, item->ft); - mir_forkthread((pThreadFunc)TlenNewFileSendThread, item->ft); - } - } else if (!mir_strcmp(s, "4")) { - /* IP and port */ - if ((item=TlenListFindItemPtrById2(info->proto, LIST_FILE, id2)) != nullptr) { - info->proto->debugLogA("step = 4"); - item->ft->hostName = mir_strdup(TlenXmlGetAttrValue(dcng, "pa")); - item->ft->wPort = atoi(TlenXmlGetAttrValue(dcng, "pp")); - mir_forkthread((pThreadFunc)TlenNewFileReceiveThread, item->ft); - } - } - - } else if (dc != nullptr) { - - } - } -} diff --git a/protocols/Tlen/src/tlen_p2p_old.cpp b/protocols/Tlen/src/tlen_p2p_old.cpp deleted file mode 100644 index d5a71a204e1..00000000000 --- a/protocols/Tlen/src/tlen_p2p_old.cpp +++ /dev/null @@ -1,522 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" -#include "tlen_p2p_old.h" -#include -#include -#include -#include -#include "tlen_list.h" - - -void TlenP2PFreeFileTransfer(TLEN_FILE_TRANSFER *ft) -{ - if (ft->jid) mir_free(ft->jid); - if (ft->iqId) mir_free(ft->iqId); - if (ft->id2) mir_free(ft->id2); - if (ft->hostName) mir_free(ft->hostName); - if (ft->localName) mir_free(ft->localName); - if (ft->szSavePath) mir_free(ft->szSavePath); - if (ft->szDescription) mir_free(ft->szDescription); - if (ft->filesSize) mir_free(ft->filesSize); - if (ft->files) { - for (int i=0; ifileCount; i++) { - if (ft->files[i]) mir_free(ft->files[i]); - } - mir_free(ft->files); - } - mir_free(ft); -} - -TLEN_FILE_PACKET *TlenP2PPacketCreate(int datalen) -{ - TLEN_FILE_PACKET *packet=(TLEN_FILE_PACKET *) mir_alloc(sizeof(TLEN_FILE_PACKET)); - if (packet == nullptr) - return nullptr; - packet->packet = nullptr; - if (datalen > 0) { - if ((packet->packet=(char *) mir_alloc(datalen)) == nullptr) { - mir_free(packet); - return nullptr; - } - } - packet->maxDataLen = datalen; - packet->type=0; - packet->len=0; - return packet; -} - -void TlenP2PPacketFree(TLEN_FILE_PACKET *packet) -{ - if (packet != nullptr) { - if (packet->packet != nullptr) - mir_free(packet->packet); - mir_free(packet); - } -} - -void TlenP2PPacketSetType(TLEN_FILE_PACKET *packet, DWORD type) -{ - if (packet != nullptr) { - packet->type = type; - } -} - -void TlenP2PPacketSetLen(TLEN_FILE_PACKET *packet, DWORD len) -{ - if (packet != nullptr) { - packet->len = len; - } -} - -void TlenP2PPacketPackDword(TLEN_FILE_PACKET *packet, DWORD data) -{ - if (packet != nullptr && packet->packet != nullptr) { - if (packet->len + sizeof(DWORD) <= packet->maxDataLen) { - (*((DWORD*)((packet->packet)+(packet->len)))) = data; - packet->len += sizeof(DWORD); - } - } -} - -void TlenP2PPacketPackBuffer(TLEN_FILE_PACKET *packet, char *buffer, int len) -{ - if (packet != nullptr && packet->packet != nullptr) { - if (packet->len + len <= packet->maxDataLen) { - memcpy((packet->packet)+(packet->len), buffer, len); - packet->len += len; - } - } -} - -void TlenP2PInit() { -} - -void TlenP2PUninit() { -} - -int TlenP2PPacketSend(HNETLIBCONN s, TLEN_FILE_PACKET *packet) -{ - DWORD sendResult; - if (packet != nullptr && packet->packet != nullptr) { - Netlib_Send(s, (char *)&packet->type, 4, MSG_NODUMP); - Netlib_Send(s, (char *)&packet->len, 4, MSG_NODUMP); - sendResult=Netlib_Send(s, packet->packet, packet->len, MSG_NODUMP); - if (sendResult == SOCKET_ERROR || sendResult != packet->len) return 0; - } - return 1; -} - -TLEN_FILE_PACKET* TlenP2PPacketReceive(HNETLIBCONN s) -{ - DWORD type, len, pos; - DWORD recvResult = Netlib_Recv(s, (char *)&type, 4, MSG_NODUMP); - if (recvResult == 0 || recvResult == SOCKET_ERROR) return nullptr; - recvResult = Netlib_Recv(s, (char *)&len, 4, MSG_NODUMP); - if (recvResult == 0 || recvResult == SOCKET_ERROR) return nullptr; - TLEN_FILE_PACKET *packet = TlenP2PPacketCreate(len); - TlenP2PPacketSetType(packet, type); - TlenP2PPacketSetLen(packet, len); - pos = 0; - while (len > 0) { - recvResult = Netlib_Recv(s, packet->packet+pos, len, MSG_NODUMP); - if (recvResult == 0 || recvResult == SOCKET_ERROR) { - TlenP2PPacketFree(packet); - return nullptr; - } - len -= recvResult; - pos += recvResult; - } - return packet; -} - -void TlenP2PEstablishOutgoingConnection(TLEN_FILE_TRANSFER *ft, BOOL sendAck) -{ - char str[300]; - TlenProtocol *proto = ft->proto; - - proto->debugLogA("Establishing outgoing connection."); - ft->state = FT_ERROR; - TLEN_FILE_PACKET *packet = TlenP2PPacketCreate(2*sizeof(DWORD) + 20); - if (packet != nullptr) { - TlenP2PPacketSetType(packet, TLEN_FILE_PACKET_CONNECTION_REQUEST); - TlenP2PPacketPackDword(packet, 1); - TlenP2PPacketPackDword(packet, (DWORD) atoi(ft->iqId)); - size_t srt_len = mir_snprintf(str, "%08X%s%d", atoi(ft->iqId), proto->threadData->username, atoi(ft->iqId)); - char *hash = TlenSha1(str, (int)srt_len); - TlenP2PPacketPackBuffer(packet, hash, 20); - mir_free(hash); - TlenP2PPacketSend(ft->s, packet); - TlenP2PPacketFree(packet); - packet = TlenP2PPacketReceive(ft->s); - if (packet != nullptr) { - if (packet->type == TLEN_FILE_PACKET_CONNECTION_REQUEST_ACK) { // acknowledge - if ((int)(*((DWORD*)packet->packet)) == atoi(ft->iqId)) { - ft->state = FT_CONNECTING; - if (sendAck) { - ProtoBroadcastAck(proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, ft, 0); - } - } - } - TlenP2PPacketFree(packet); - } - } -} - -TLEN_FILE_TRANSFER* TlenP2PEstablishIncomingConnection(TlenProtocol *proto, HNETLIBCONN s, TLEN_LIST list, BOOL sendAck) -{ - char str[300]; - DWORD iqId; - // TYPE: 0x1 - // LEN: - // (DWORD) 0x1 - // (DWORD) id - // (BYTE) hash[20] - TLEN_FILE_PACKET *packet = TlenP2PPacketReceive(s); - if (packet == nullptr || packet->type != TLEN_FILE_PACKET_CONNECTION_REQUEST || packet->len<28) { - if (packet != nullptr) { - TlenP2PPacketFree(packet); - } - return nullptr; - } - iqId = *((DWORD *)(packet->packet+sizeof(DWORD))); - int i = 0; - TLEN_LIST_ITEM *item; - while ((i=TlenListFindNext(proto, list, i)) >= 0) { - item = TlenListGetItemPtrFromIndex(proto, i); - if (item != nullptr) { - mir_snprintf(str, "%d", iqId); - if (!mir_strcmp(item->ft->iqId, str)) { - char *hash, *nick; - int j; - nick = TlenNickFromJID(item->ft->jid); - j = mir_snprintf(str, "%08X%s%d", iqId, nick, iqId); - mir_free(nick); - hash = TlenSha1(str, j); - for (j=0;j<20;j++) { - if (hash[j] != packet->packet[2*sizeof(DWORD)+j]) break; - } - mir_free(hash); - if (j == 20) break; - } - } - i++; - } - TlenP2PPacketFree(packet); - if (i >=0) { - if ((packet=TlenP2PPacketCreate(sizeof(DWORD))) != nullptr) { - // Send connection establishment acknowledgement - TlenP2PPacketSetType(packet, TLEN_FILE_PACKET_CONNECTION_REQUEST_ACK); - TlenP2PPacketPackDword(packet, (DWORD) atoi(item->ft->iqId)); - TlenP2PPacketSend(s, packet); - TlenP2PPacketFree(packet); - item->ft->state = FT_CONNECTING; - if (sendAck) { - ProtoBroadcastAck(item->ft->proto->m_szModuleName, item->ft->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, item->ft, 0); - } - return item->ft; - } - } - return nullptr; -} - -static void __cdecl TlenFileBindSocks4Thread(TLEN_FILE_TRANSFER* ft) -{ - BYTE buf[8]; - -// TlenLog("Waiting for the file to be sent via SOCKS..."); - int status = Netlib_Recv(ft->s, (char*)buf, 8, MSG_NODUMP); -// TlenLog("accepted connection !!!"); - if ( status == SOCKET_ERROR || status < 8 || buf[1] != 90) { - status = 1; - } else { - status = 0; - } - if (!status) { - ft->pfnNewConnectionV2(ft->s, 0, nullptr); - } else { - if (ft->state != FT_SWITCH) { - ft->state = FT_ERROR; - } - } - ft->proto->debugLogA("Closing connection for this file transfer..."); -// Netlib_CloseHandle(ft->s); - if (ft->hFileEvent != nullptr) - SetEvent(ft->hFileEvent); - -} -static void __cdecl TlenFileBindSocks5Thread(TLEN_FILE_TRANSFER* ft) -{ - BYTE buf[256]; - -// TlenLog("Waiting for the file to be sent via SOCKS..."); - int status = Netlib_Recv(ft->s, (char*)buf, sizeof(buf), MSG_NODUMP); -// TlenLog("accepted connection !!!"); - if ( status == SOCKET_ERROR || status < 7 || buf[1] != 0) { - status = 1; - } else { - status = 0; - } - if (!status) { - ft->pfnNewConnectionV2(ft->s, 0, nullptr); - } else { - if (ft->state != FT_SWITCH) { - ft->state = FT_ERROR; - } - } -// TlenLog("Closing connection for this file transfer..."); -// Netlib_CloseHandle(ft->s); - if (ft->hFileEvent != nullptr) - SetEvent(ft->hFileEvent); - -} - -static HNETLIBCONN TlenP2PBindSocks4(SOCKSBIND * sb, TLEN_FILE_TRANSFER *ft) -{ //rfc1928 - int len; - BYTE buf[256]; - int status; - struct in_addr in; - - NETLIBOPENCONNECTION nloc = { sizeof(nloc) }; - nloc.szHost = sb->szHost; - nloc.wPort = sb->wPort; - HNETLIBCONN s = Netlib_OpenConnection(ft->proto->hFileNetlibUser, &nloc); - if (s == nullptr) { -// TlenLog("Connection failed (%d), thread ended", WSAGetLastError()); - return nullptr; - } - buf[0] = 4; //socks4 - buf[1] = 2; //2-bind, 1-connect - *(PWORD)(buf+2) = htons(0); // port - *(PDWORD)(buf+4) = INADDR_ANY; - if (sb->useAuth) { - mir_strcpy((char*)buf+8, sb->szUser); - len = (int)mir_strlen(sb->szUser); - } else { - buf[8] = 0; - len = 0; - } - len += 9; - status = Netlib_Send(s, (char*)buf, len, MSG_NODUMP); - if (status == SOCKET_ERROR || status < len) { -// TlenLog("Send failed (%d), thread ended", WSAGetLastError()); - Netlib_CloseHandle(s); - return nullptr; - } - status = Netlib_Recv(s, (char*)buf, 8, MSG_NODUMP); - if (status == SOCKET_ERROR || status < 8 || buf[1] != 90) { -// TlenLog("SOCKS4 negotiation failed"); - Netlib_CloseHandle(s); - return nullptr; - } - status = Netlib_Recv(s, (char*)buf, sizeof(buf), MSG_NODUMP); - if ( status == SOCKET_ERROR || status < 7 || buf[0] != 5 || buf[1] != 0) { -// TlenLog("SOCKS5 request failed"); - Netlib_CloseHandle(s); - return nullptr; - } - in.S_un.S_addr = *(PDWORD)(buf+4); - strncpy(sb->szHost, inet_ntoa(in), sizeof(sb->szHost)-1); - sb->wPort = htons(*(PWORD)(buf+2)); - ft->s = s; - mir_forkthread(pThreadFunc(TlenFileBindSocks4Thread), ft); - return s; -} - -static HNETLIBCONN TlenP2PBindSocks5(SOCKSBIND * sb, TLEN_FILE_TRANSFER *ft) -{ //rfc1928 - BYTE buf[512]; - int len, status; - struct in_addr in; - - NETLIBOPENCONNECTION nloc = { sizeof(nloc) }; - nloc.szHost = sb->szHost; - nloc.wPort = sb->wPort; - HNETLIBCONN s = Netlib_OpenConnection(ft->proto->hFileNetlibUser, &nloc); - if (s == nullptr) { - ft->proto->debugLogA("Connection failed (%d), thread ended", WSAGetLastError()); - return nullptr; - } - buf[0] = 5; //yep, socks5 - buf[1] = 1; //one auth method - buf[2] = sb->useAuth?2:0; // authorization - status = Netlib_Send(s, (char*)buf, 3, MSG_NODUMP); - if (status == SOCKET_ERROR || status < 3) { - ft->proto->debugLogA("Send failed (%d), thread ended", WSAGetLastError()); - Netlib_CloseHandle(s); - return nullptr; - } - status = Netlib_Recv(s, (char*)buf, 2, MSG_NODUMP); - if (status == SOCKET_ERROR || status < 2 || (buf[1] != 0 && buf[1] != 2)) { - ft->proto->debugLogA("SOCKS5 negotiation failed"); - Netlib_CloseHandle(s); - return nullptr; - } - if (buf[1] == 2) { //rfc1929 - int nUserLen, nPassLen; - PBYTE pAuthBuf; - - nUserLen = (int)mir_strlen(sb->szUser); - nPassLen = (int)mir_strlen(sb->szPassword); - pAuthBuf = (PBYTE)mir_alloc(3+nUserLen+nPassLen); - pAuthBuf[0] = 1; //auth version - pAuthBuf[1] = nUserLen; - memcpy(pAuthBuf+2, sb->szUser, nUserLen); - pAuthBuf[2+nUserLen]=nPassLen; - memcpy(pAuthBuf+3+nUserLen,sb->szPassword,nPassLen); - status = Netlib_Send(s, (char*)pAuthBuf, 3+nUserLen+nPassLen, MSG_NODUMP); - mir_free(pAuthBuf); - if (status == SOCKET_ERROR || status < 3 + nUserLen+nPassLen) { - ft->proto->debugLogA("Send failed (%d), thread ended", WSAGetLastError()); - Netlib_CloseHandle(s); - return nullptr; - } - status = Netlib_Recv(s, (char*)buf, sizeof(buf), MSG_NODUMP); - if (status == SOCKET_ERROR || status < 2 || buf[1] != 0) { - ft->proto->debugLogA("SOCKS5 sub-negotiation failed"); - Netlib_CloseHandle(s); - return nullptr; - } - } - - { PBYTE pInit; - int nHostLen=4; - DWORD hostIP=INADDR_ANY; - pInit=(PBYTE)mir_alloc(6+nHostLen); - pInit[0]=5; //SOCKS5 - pInit[1]=2; //bind - pInit[2]=0; //reserved - pInit[3]=1; - *(PDWORD)(pInit+4)=hostIP; - *(PWORD)(pInit+4+nHostLen)=htons(0); - status = Netlib_Send(s, (char*)pInit, 6+nHostLen, MSG_NODUMP); - mir_free(pInit); - if (status == SOCKET_ERROR || status < 6 + nHostLen) { -// TlenLog("Send failed (%d), thread ended", WSAGetLastError()); - Netlib_CloseHandle(s); - return nullptr; - } - } - status = Netlib_Recv(s, (char*)buf, sizeof(buf), MSG_NODUMP); - if ( status == SOCKET_ERROR || status < 7 || buf[0] != 5 || buf[1] != 0) { -// TlenLog("SOCKS5 request failed"); - Netlib_CloseHandle(s); - return nullptr; - } - if (buf[2] == 1) { // domain - len = buf[4]; - memcpy(sb->szHost, buf+5, len); - sb->szHost[len]=0; - len += 4; - } else { // ip address - in.S_un.S_addr = *(PDWORD)(buf+4); - mir_strcpy(sb->szHost, inet_ntoa(in)); - len = 8; - } - sb->wPort = htons(*(PWORD)(buf+len)); - ft->s = s; - - mir_forkthread(pThreadFunc(TlenFileBindSocks5Thread), ft); - return s; -} - - -HNETLIBCONN TlenP2PListen(TLEN_FILE_TRANSFER *ft) -{ - HNETLIBCONN s = nullptr; - int useProxy; - DBVARIANT dbv; - SOCKSBIND sb; - struct in_addr in; - TlenProtocol *proto = ft->proto; - useProxy=0; - if (ft->localName != nullptr) mir_free(ft->localName); - ft->localName = nullptr; - ft->wPort = 0; - if (db_get_b(NULL, proto->m_szModuleName, "UseFileProxy", FALSE)) { - if (!db_get(NULL, proto->m_szModuleName, "FileProxyHost", &dbv)) { - mir_strcpy(sb.szHost, dbv.pszVal); - db_free(&dbv); - sb.wPort = db_get_w(NULL, proto->m_szModuleName, "FileProxyPort", 0); - sb.useAuth = FALSE; - mir_strcpy(sb.szUser, ""); - mir_strcpy(sb.szPassword, ""); - if (db_get_b(NULL, proto->m_szModuleName, "FileProxyAuth", FALSE)) { - sb.useAuth = TRUE; - if (!db_get_s(NULL, proto->m_szModuleName, "FileProxyUsername", &dbv)) { - strncpy(sb.szUser, dbv.pszVal, sizeof(sb.szUser)-1); - db_free(&dbv); - } - if (!db_get_s(NULL, proto->m_szModuleName, "FileProxyPassword", &dbv)) { - strncpy(sb.szPassword, dbv.pszVal, sizeof(sb.szPassword)-1); - db_free(&dbv); - } - } - switch (db_get_w(NULL, proto->m_szModuleName, "FileProxyType", 0)) { - case 0: // forwarding - useProxy = 1; - break; - case 1: // socks4 - s = TlenP2PBindSocks4(&sb, ft); - useProxy = 2; - break; - case 2: // socks5 - s = TlenP2PBindSocks5(&sb, ft); - useProxy = 2; - break; - } - ft->localName = mir_strdup(sb.szHost); - ft->wPort = sb.wPort; - ft->wLocalPort = sb.wPort; - } - } - - NETLIBBIND nlb = {}; - if (useProxy<2) { - nlb.pfnNewConnectionV2 = ft->pfnNewConnectionV2; - nlb.wPort = 0; // Use user-specified incoming port ranges, if available - nlb.pExtra = proto; - ft->proto->debugLogA("Calling MS_NETLIB_BINDPORT"); - s = (HNETLIBCONN)Netlib_BindPort(ft->proto->m_hNetlibUser, &nlb); - ft->proto->debugLogA("listening on %d",s); - } - if (useProxy == 0) { - in.S_un.S_addr = htonl(nlb.dwExternalIP); - ft->localName = mir_strdup(inet_ntoa(in)); - ft->wPort = nlb.wPort; - ft->wLocalPort = nlb.wExPort; - } - if (s != nullptr) { -// listenCount++; - } - return s; -} - -void TlenP2PStopListening(HANDLE s) { - if (s != nullptr) { -// listenCount--; -// if (listenCount <= 0) { -// Netlib_CloseHandle(s); -// } - } -} diff --git a/protocols/Tlen/src/tlen_p2p_old.h b/protocols/Tlen/src/tlen_p2p_old.h deleted file mode 100644 index 8b5a6ffde41..00000000000 --- a/protocols/Tlen/src/tlen_p2p_old.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" - -#ifndef _TLEN_P2P_OLD_H_ -#define _TLEN_P2P_OLD_H_ - -enum { - TLEN_FILE_PACKET_CONNECTION_REQUEST = 0x01, - TLEN_FILE_PACKET_CONNECTION_REQUEST_ACK = 0x02, - TLEN_FILE_PACKET_FILE_LIST = 0x32, - TLEN_FILE_PACKET_FILE_LIST_ACK = 0x33, - TLEN_FILE_PACKET_FILE_REQUEST = 0x34, - TLEN_FILE_PACKET_FILE_DATA = 0x35, - TLEN_FILE_PACKET_END_OF_FILE = 0x37, - TLEN_VOICE_PACKET = 0x96 -}; - -typedef struct { - unsigned int maxDataLen; - char *packet; - DWORD type; - DWORD len; -} TLEN_FILE_PACKET; - -typedef struct { - char szHost[256]; - int wPort; - int useAuth; - char szUser[256]; - char szPassword[256]; -}SOCKSBIND; - -extern void TlenP2PFreeFileTransfer(TLEN_FILE_TRANSFER *ft); -extern TLEN_FILE_PACKET *TlenP2PPacketCreate(int datalen); -extern void TlenP2PPacketFree(TLEN_FILE_PACKET *packet); -extern void TlenP2PPacketSetType(TLEN_FILE_PACKET *packet, DWORD type); -extern void TlenP2PPacketSetLen(TLEN_FILE_PACKET *packet, DWORD len); -extern void TlenP2PPacketPackDword(TLEN_FILE_PACKET *packet, DWORD data); -extern void TlenP2PPacketPackBuffer(TLEN_FILE_PACKET *packet, char *buffer, int len); -extern int TlenP2PPacketSend(HNETLIBCONN s, TLEN_FILE_PACKET *packet); -extern TLEN_FILE_PACKET* TlenP2PPacketReceive(HNETLIBCONN s); -extern void TlenP2PEstablishOutgoingConnection(TLEN_FILE_TRANSFER *ft, BOOL sendAck); -extern TLEN_FILE_TRANSFER* TlenP2PEstablishIncomingConnection(TlenProtocol *proto, HNETLIBCONN s, TLEN_LIST list, BOOL sendAck); -extern HNETLIBCONN TlenP2PListen(TLEN_FILE_TRANSFER *ft); -extern void TlenP2PStopListening(HNETLIBCONN s); - -void __cdecl TlenProcessP2P(XmlNode *node, void *userdata); - - -#endif diff --git a/protocols/Tlen/src/tlen_picture.cpp b/protocols/Tlen/src/tlen_picture.cpp deleted file mode 100644 index f75e0a42e6c..00000000000 --- a/protocols/Tlen/src/tlen_picture.cpp +++ /dev/null @@ -1,312 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2009 Piotr Piastucki - -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 "stdafx.h" -#include "tlen_list.h" -#include "tlen_file.h" -#include "tlen_p2p_old.h" - -typedef struct { - TlenProtocol *proto; - TLEN_LIST_ITEM *item; -} TLENPSREQUESTTHREADDATA; - -static void LogPictureMessage(TlenProtocol *proto, const char *jid, const char *filename, BOOL isSent) -{ - char message[1024]; - const char *msg = isSent ? LPGEN("Image sent file://%s") : LPGEN("Image received file://%s"); - mir_snprintf(message, Translate(msg), filename); - TlenLogMessage(proto, TlenHContactFromJID(proto, jid), isSent ? DBEF_SENT : 0, message); -} - -static void TlenPsPostThread(void *ptr) { - TLENPSREQUESTTHREADDATA *data = (TLENPSREQUESTTHREADDATA *)ptr; - TlenProtocol *proto = data->proto; - TLEN_LIST_ITEM *item = data->item; - HNETLIBCONN socket = TlenWsConnect(proto, "ps.tlen.pl", 443); - BOOL bSent = FALSE; - if (socket != nullptr) { - char header[512]; - item->ft->s = socket; - item->ft->hFileEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); - int ret = mir_snprintf(header, "", proto->threadData->username, item->ft->jid, item->ft->fileTotalSize, item->jid); - TlenWsSend(proto, socket, header, ret); - ret = WaitForSingleObject(item->ft->hFileEvent, 1000 * 60 * 5); - if (ret == WAIT_OBJECT_0) { - FILE *fp = fopen( item->ft->files[0], "rb" ); - if (fp) { - char fileBuffer[2048]; - ret = mir_snprintf(header, "", item->ft->iqId, item->jid); - TlenWsSend(proto, socket, header, ret); - proto->debugLogA("Sending picture data..."); - for (int i = item->ft->filesSize[0]; i > 0; ) { - int toread = min(2048, i); - int readcount = (int)fread(fileBuffer, (size_t)1, (size_t)toread, fp); - i -= readcount; - if (readcount > 0) - TlenWsSend(proto, socket, fileBuffer, readcount); - - if (toread != readcount) - break; - } - fclose(fp); - SleepEx(3000, TRUE); - bSent = TRUE; - } - } - Netlib_CloseHandle(socket); - if (bSent) { - TlenSend(proto, "", item->ft->jid, item->jid, item->ft->id2); - LogPictureMessage(proto, item->ft->jid, item->ft->files[0], TRUE); - } - TlenP2PFreeFileTransfer(item->ft); - TlenListRemove(proto, LIST_PICTURE, item->jid); - } - - mir_free(data); -} - -static void TlenPsPost(TlenProtocol *proto, TLEN_LIST_ITEM *item) { - TLENPSREQUESTTHREADDATA *threadData = (TLENPSREQUESTTHREADDATA *)mir_alloc(sizeof(TLENPSREQUESTTHREADDATA)); - threadData->proto = proto; - threadData->item = item; - mir_forkthread(TlenPsPostThread, threadData); -} - -static void TlenPsGetThread(void *ptr) { - TLENPSREQUESTTHREADDATA *data = (TLENPSREQUESTTHREADDATA *)ptr; - TlenProtocol *proto = data->proto; - TLEN_LIST_ITEM *item = data->item; - FILE *fp; - fp = fopen( item->ft->files[0], "wb" ); - if (fp) { - HNETLIBCONN socket = TlenWsConnect(proto, "ps.tlen.pl", 443); - if (socket != nullptr) { - XmlState xmlState; - char header[512]; - char fileBuffer[2048]; - TlenXmlInitState(&xmlState); - int header_len = mir_snprintf(header, "", proto->threadData->username, item->ft->jid, item->jid, item->ft->id2); - TlenWsSend(proto, socket, header, header_len); - proto->debugLogA("Reveiving picture data..."); - { - int totalcount = 0; - int size = item->ft->filesSize[0]; - BOOL bHeader = TRUE; - while (TRUE) { - int readcount = TlenWsRecv(proto, socket, fileBuffer, 2048 - totalcount); - if (readcount == 0) { - break; - } - totalcount += readcount; - if (bHeader) { - char * tagend = (char*)memchr(fileBuffer, '/', totalcount); - tagend = (char*)memchr(tagend + 1, '>', totalcount - (tagend - fileBuffer) - 1); - if (tagend != nullptr) { - int parsed = TlenXmlParse(&xmlState, fileBuffer, tagend - fileBuffer + 1); - if (parsed == 0) { - continue; - } - bHeader = FALSE; - totalcount -= parsed; - memmove(fileBuffer, fileBuffer+parsed, totalcount); - } - } - if (!bHeader) { - if (totalcount > 0) { - fwrite(fileBuffer, 1, totalcount, fp); - size -= totalcount; - totalcount = 0; - } - if (size == 0) { - break; - } - } - } - } - Netlib_CloseHandle(socket); - proto->debugLogA("Picture received..."); - LogPictureMessage(proto, item->ft->jid, item->ft->files[0], FALSE); - } else { - /* cannot connect to ps server */ - } - fclose(fp); - } else { - /* cannot create file */ - } - TlenP2PFreeFileTransfer(item->ft); - TlenListRemove(proto, LIST_PICTURE, item->jid); - mir_free(data); -} - -static void TlenPsGet(TlenProtocol *proto, TLEN_LIST_ITEM *item) { - TLENPSREQUESTTHREADDATA *threadData = (TLENPSREQUESTTHREADDATA *)mir_alloc(sizeof(TLENPSREQUESTTHREADDATA)); - threadData->proto = proto; - threadData->item = item; - mir_forkthread(TlenPsGetThread, threadData); -} - -void TlenProcessPic(XmlNode *node, TlenProtocol *proto) { - TLEN_LIST_ITEM *item = nullptr; - char *crc, *crc_c, *idt, *size, *from, *fromRaw, *rt; - from = TlenXmlGetAttrValue(node, "from"); - fromRaw = TlenLoginFromJID(from); - idt = TlenXmlGetAttrValue(node, "idt"); - size = TlenXmlGetAttrValue(node, "size"); - crc_c = TlenXmlGetAttrValue(node, "crc_c"); - crc = TlenXmlGetAttrValue(node, "crc"); - rt = TlenXmlGetAttrValue(node, "rt"); - if (idt != nullptr) { - item = TlenListGetItemPtr(proto, LIST_PICTURE, idt); - } - if (item != nullptr) { - if (!mir_strcmp(from, "ps")) { - char *st = TlenXmlGetAttrValue(node, "st"); - if (st != nullptr) { - item->ft->iqId = mir_strdup(st); - item->ft->id2 = mir_strdup(rt); - if (item->ft->hFileEvent != nullptr) { - SetEvent(item->ft->hFileEvent); - item->ft->hFileEvent = nullptr; - } - } - } else if (!mir_strcmp(item->ft->jid, fromRaw)) { - if (crc_c != nullptr) { - if (!mir_strcmp(crc_c, "n")) { - /* crc_c = n, picture transfer accepted */ - TlenPsPost(proto, item); - } else if (!mir_strcmp(crc_c, "f")) { - /* crc_c = f, picture cached, no need to transfer again */ - LogPictureMessage(proto, item->ft->jid, item->ft->files[0], TRUE); - TlenP2PFreeFileTransfer(item->ft); - TlenListRemove(proto, LIST_PICTURE, idt); - } - } else if (rt != nullptr) { - item->ft->id2 = mir_strdup(rt); - TlenPsGet(proto, item); - } - } - } else if (crc != nullptr) { - BOOL bAccept = proto->tlenOptions.imagePolicy == TLEN_IMAGES_ACCEPT_ALL || (proto->tlenOptions.imagePolicy == TLEN_IMAGES_IGNORE_NIR && IsAuthorized(proto, from)); - if (bAccept) { - FILE* fp; - char fileName[MAX_PATH]; - char *ext = TlenXmlGetAttrValue(node, "ext"); - char *tmpPath = Utils_ReplaceVars( "%miranda_userdata%" ); - int tPathLen = mir_snprintf(fileName, "%s\\Images\\Tlen", tmpPath); - long oldSize = 0, lSize = atol(size); - DWORD dwAttributes = GetFileAttributesA( fileName ); - if ( dwAttributes == 0xffffffff || ( dwAttributes & FILE_ATTRIBUTE_DIRECTORY ) == 0 ) - CreateDirectoryTree(fileName); - - mir_free(tmpPath); - fileName[ tPathLen++ ] = '\\'; - mir_snprintf( fileName + tPathLen, _countof(fileName) - tPathLen, "%s.%s", crc, ext ); - fp = fopen( fileName, "rb" ); - if (fp) { - fseek(fp, 0, SEEK_END); - oldSize = ftell(fp); - fclose(fp); - } - if (oldSize != lSize) { - item = TlenListAdd(proto, LIST_PICTURE, idt); - item->ft = TlenFileCreateFT(proto, from); - item->ft->files = (char **) mir_alloc(sizeof(char *)); - item->ft->filesSize = (long *) mir_alloc(sizeof(long)); - item->ft->files[0] = mir_strdup(fileName); - item->ft->filesSize[0] = lSize; - item->ft->fileTotalSize = item->ft->filesSize[0]; - TlenSend(proto, "", from, idt); - } else { - TlenSend(proto, "", from, idt); - LogPictureMessage(proto, from, fileName, FALSE); - } - } - } - mir_free(fromRaw); -} - -BOOL SendPicture(TlenProtocol *proto, MCONTACT hContact) { - DBVARIANT dbv; - if (!db_get(hContact, proto->m_szModuleName, "jid", &dbv)) { - char *jid = dbv.pszVal; - - wchar_t tszFilter[512], tszFileName[MAX_PATH]; - Bitmap_GetFilter(tszFilter, _countof(tszFilter)); - tszFileName[0] = '\0'; - - OPENFILENAME ofn = {0}; - ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; - ofn.lpstrFilter = tszFilter; - ofn.lpstrCustomFilter = nullptr; - ofn.lpstrFile = tszFileName; - ofn.nMaxFile = _MAX_PATH; - ofn.Flags = OFN_FILEMUSTEXIST; - if (GetOpenFileName(&ofn)) { - long size; - FILE* fp = _wfopen(tszFileName, L"rb"); - if (fp) { - fseek(fp, 0, SEEK_END); - size = ftell(fp); - if (size > 0 && size < 256*1024) { - TLEN_LIST_ITEM *item; - mir_sha1_ctx sha; - DWORD digest[5]; - int i; - char idStr[10]; - char fileBuffer[2048]; - int id = TlenSerialNext(proto); - T2Utf szFileName(tszFileName); - mir_snprintf(idStr, "%d", id); - item = TlenListAdd(proto, LIST_PICTURE, idStr); - item->ft = TlenFileCreateFT(proto, jid); - item->ft->files = (char **) mir_alloc(sizeof(char *)); - item->ft->filesSize = (long *) mir_alloc(sizeof(long)); - item->ft->files[0] = szFileName; - item->ft->filesSize[0] = size; - item->ft->fileTotalSize = size; - fseek(fp, 0, SEEK_SET); - mir_sha1_init( &sha ); - for (i = item->ft->filesSize[0]; i > 0; ) { - int toread = min(2048, i); - int readcount = (int)fread(fileBuffer, (size_t)1, (size_t)toread, fp); - i -= readcount; - if (readcount > 0) { - mir_sha1_append( &sha, (BYTE* )fileBuffer, readcount); - } - if (toread != readcount) { - break; - } - } - mir_sha1_finish( &sha, (BYTE* )digest ); - TlenSend(proto, "", jid, - (int)htonl(digest[0]), (int)htonl(digest[1]), (int)htonl(digest[2]), (int)htonl(digest[3]), (int)htonl(digest[4]), idStr, item->ft->filesSize[0], "jpg"); - } else { - /* file too big */ - } - fclose(fp); - } - } - db_free(&dbv); - } - return FALSE; -} diff --git a/protocols/Tlen/src/tlen_picture.h b/protocols/Tlen/src/tlen_picture.h deleted file mode 100644 index 07e608c90ca..00000000000 --- a/protocols/Tlen/src/tlen_picture.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2009 Piotr Piastucki - -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. - -*/ -#ifndef _TLEN_PICTURE_H -#define _TLEN_PICTURE_H - -#include -#include "stdafx.h" - -void TlenProcessPic(XmlNode *node, TlenProtocol *proto); -BOOL SendPicture(TlenProtocol *, MCONTACT hContact); - -#endif /* _TLEN_PICTURE_H */ - diff --git a/protocols/Tlen/src/tlen_presence.cpp b/protocols/Tlen/src/tlen_presence.cpp deleted file mode 100644 index 3e127615824..00000000000 --- a/protocols/Tlen/src/tlen_presence.cpp +++ /dev/null @@ -1,341 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2009 Piotr Piastucki - -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 "stdafx.h" -#include "tlen_list.h" -#include "tlen_avatar.h" - -void TlenProcessPresence(XmlNode *node, TlenProtocol *proto) -{ - MCONTACT hContact; - XmlNode *showNode, *statusNode; - TLEN_LIST_ITEM *item; - char *from, *type, *nick, *show; - int status, laststatus = ID_STATUS_OFFLINE; - char *p; - - if ((from=TlenXmlGetAttrValue(node, "from")) != nullptr) { - if (TlenListExist(proto, LIST_CHATROOM, from)); //TlenGroupchatProcessPresence(node, userdata); - - else { - type = TlenXmlGetAttrValue(node, "type"); - item = TlenListGetItemPtr(proto, LIST_ROSTER, from); - if (item != nullptr) { - if (proto->tlenOptions.enableAvatars) { - TlenProcessPresenceAvatar(proto, node, item); - } - } - if (type == nullptr || (!mir_strcmp(type, "available"))) { - if ((nick=TlenLocalNickFromJID(from)) != nullptr) { - if ((hContact=TlenHContactFromJID(proto, from)) == NULL) - hContact = TlenDBCreateContact(proto, from, nick, FALSE); - if (!TlenListExist(proto, LIST_ROSTER, from)) { - proto->debugLogA("Receive presence online from %s (who is not in my roster)", from); - TlenListAdd(proto, LIST_ROSTER, from); - } - status = ID_STATUS_ONLINE; - if ((showNode=TlenXmlGetChild(node, "show")) != nullptr) { - if ((show=showNode->text) != nullptr) { - if (!mir_strcmp(show, "away")) status = ID_STATUS_AWAY; - else if (!mir_strcmp(show, "xa")) status = ID_STATUS_NA; - else if (!mir_strcmp(show, "dnd")) status = ID_STATUS_DND; - else if (!mir_strcmp(show, "chat")) status = ID_STATUS_FREECHAT; - else if (!mir_strcmp(show, "unavailable")) { - // Always show invisible (on old Tlen client) as invisible (not offline) - status = ID_STATUS_OFFLINE; - } - } - } - - statusNode = TlenXmlGetChild(node, "status"); - if (statusNode) - p = TlenTextDecode(statusNode->text); - else - p = nullptr; - TlenListAddResource(proto, LIST_ROSTER, from, status, statusNode?p:nullptr); - if (p != nullptr && *p) { - char* statusMsg_utf8 = mir_utf8encode(p); - db_set_utf(hContact, "CList", "StatusMsg", statusMsg_utf8); - mir_free(statusMsg_utf8); - mir_free(p); - } else { - db_unset(hContact, "CList", "StatusMsg"); - } - // Determine status to show for the contact and request version information - if (item != nullptr) { - laststatus = item->status; - item->status = status; - } - if (strchr(from, '@') != nullptr || db_get_b(NULL, proto->m_szModuleName, "ShowTransport", TRUE) == TRUE) { - if (db_get_w(hContact, proto->m_szModuleName, "Status", ID_STATUS_OFFLINE) != status) - db_set_w(hContact, proto->m_szModuleName, "Status", (WORD) status); - } - if (item != nullptr) { - if (!item->infoRequested) { - int iqId = TlenSerialNext(proto); - item->infoRequested = TRUE; - TlenSend( proto, "", iqId, from); - } - if (proto->tlenOptions.enableVersion && !item->versionRequested) { - item->versionRequested = TRUE; - if (proto->m_iStatus != ID_STATUS_INVISIBLE) { - TlenSend( proto, "", from ); - } - } - } - proto->debugLogA("%s (%s) online, set contact status to %d", nick, from, status); - mir_free(nick); - } - } - else if (!mir_strcmp(type, "unavailable")) { - if (!TlenListExist(proto, LIST_ROSTER, from)) { - proto->debugLogA("Receive presence offline from %s (who is not in my roster)", from); - TlenListAdd(proto, LIST_ROSTER, from); - } - else { - TlenListRemoveResource(proto, LIST_ROSTER, from); - } - status = ID_STATUS_OFFLINE; - statusNode = TlenXmlGetChild(node, "status"); - if (statusNode) { - if (proto->tlenOptions.offlineAsInvisible) { - status = ID_STATUS_INVISIBLE; - } - p = TlenTextDecode(statusNode->text); - } - else - p = nullptr; - TlenListAddResource(proto, LIST_ROSTER, from, status, p); - if ((hContact=TlenHContactFromJID(proto, from)) != NULL) { - if (p != nullptr && *p) { - char* statusMsg_utf8 = mir_utf8encode(p); - db_set_utf(hContact, "CList", "StatusMsg", statusMsg_utf8); - mir_free(statusMsg_utf8); - mir_free(p); - } else { - db_unset(hContact, "CList", "StatusMsg"); - } - } - if ((item=TlenListGetItemPtr(proto, LIST_ROSTER, from)) != nullptr) { - // Determine status to show for the contact based on the remaining resources - item->status = status; - item->versionRequested = FALSE; - item->infoRequested = FALSE; - } - if ((hContact=TlenHContactFromJID(proto, from)) != NULL) { - if (strchr(from, '@') != nullptr || db_get_b(NULL, proto->m_szModuleName, "ShowTransport", TRUE) == TRUE) { - if (db_get_w(hContact, proto->m_szModuleName, "Status", ID_STATUS_OFFLINE) != status) - db_set_w(hContact, proto->m_szModuleName, "Status", (WORD) status); - } - if (item != nullptr && item->isTyping) { - item->isTyping = FALSE; - CallService(MS_PROTO_CONTACTISTYPING, hContact, PROTOTYPE_CONTACTTYPING_OFF); - } - proto->debugLogA("%s offline, set contact status to %d", from, status); - } - } - else if (!mir_strcmp(type, "subscribe")) { - if (strchr(from, '@') == nullptr) { - // automatically send authorization allowed to agent/transport - TlenSend(proto, "", from); - } - else if ((nick=TlenNickFromJID(from)) != nullptr) { - proto->debugLogA("%s (%s) requests authorization", nick, from); - TlenDBAddAuthRequest(proto, from, nick); - mir_free(nick); - } - } - else if (!mir_strcmp(type, "subscribed")) { - if ((item=TlenListGetItemPtr(proto, LIST_ROSTER, from)) != nullptr) { - if (item->subscription == SUB_FROM) item->subscription = SUB_BOTH; - else if (item->subscription == SUB_NONE) { - item->subscription = SUB_TO; - } - } - } - } - } -} - -/* change status and status msg on own contact on contact list (if present) */ -void setOwnStatusOnCList(TlenProtocol *proto, int status, char *statusMsg) -{ - ptrA ownJid(db_get_sa(NULL, proto->m_szModuleName, "jid")); - MCONTACT hContact = TlenHContactFromJID(proto, ownJid); - if(hContact){ - if (db_get_w(hContact, proto->m_szModuleName, "Status", ID_STATUS_OFFLINE) != status) - db_set_w(hContact, proto->m_szModuleName, "Status", (WORD)status); - if (statusMsg != nullptr && *statusMsg) { - char* statusMsg_utf8 = mir_utf8encode(statusMsg); - db_set_utf(hContact, "CList", "StatusMsg", statusMsg_utf8); - mir_free(statusMsg_utf8); - } else { - db_unset(hContact, "CList", "StatusMsg"); - } - } -} - -static void TlenSendPresenceTo(TlenProtocol *proto, int status, char*) -{ - char *showBody, *statusMsg, *presenceType; - char *ptr = nullptr; - - if (!proto->isOnline) return; - - // Send update for status (we won't handle ID_STATUS_OFFLINE here) - // Note: tlenModeMsg is already encoded using TlenTextEncode() - mir_cslock lck(proto->modeMsgMutex); - - showBody = nullptr; - statusMsg = nullptr; - presenceType = nullptr; - switch (status) { - case ID_STATUS_ONLINE: - showBody = "available"; - statusMsg = proto->modeMsgs.szOnline; - break; - case ID_STATUS_AWAY: - case ID_STATUS_ONTHEPHONE: - case ID_STATUS_OUTTOLUNCH: - showBody = "away"; - statusMsg = proto->modeMsgs.szAway; - break; - case ID_STATUS_NA: - showBody = "xa"; - statusMsg = proto->modeMsgs.szNa; - break; - case ID_STATUS_DND: - case ID_STATUS_OCCUPIED: - showBody = "dnd"; - statusMsg = proto->modeMsgs.szDnd; - break; - case ID_STATUS_FREECHAT: - showBody = "chat"; - statusMsg = proto->modeMsgs.szFreechat; - break; - case ID_STATUS_INVISIBLE: - presenceType = "invisible"; - statusMsg = proto->modeMsgs.szInvisible; - break; - case ID_STATUS_OFFLINE: - presenceType = "unavailable"; - if (db_get_b(NULL, proto->m_szModuleName, "LeaveOfflineMessage", FALSE)) { - int offlineMessageOption = db_get_w(NULL, proto->m_szModuleName, "OfflineMessageOption", 0); - if (offlineMessageOption == 0) { - switch (proto->m_iStatus) { - case ID_STATUS_ONLINE: - ptr = mir_strdup(proto->modeMsgs.szOnline); - break; - case ID_STATUS_AWAY: - case ID_STATUS_ONTHEPHONE: - case ID_STATUS_OUTTOLUNCH: - ptr = mir_strdup(proto->modeMsgs.szAway); - break; - case ID_STATUS_NA: - ptr = mir_strdup(proto->modeMsgs.szNa); - break; - case ID_STATUS_DND: - case ID_STATUS_OCCUPIED: - ptr = mir_strdup(proto->modeMsgs.szDnd); - break; - case ID_STATUS_FREECHAT: - ptr = mir_strdup(proto->modeMsgs.szFreechat); - break; - case ID_STATUS_INVISIBLE: - ptr = mir_strdup(proto->modeMsgs.szInvisible); - break; - } - } else if (offlineMessageOption == 99) { - - } else if (offlineMessageOption < 7) { - DBVARIANT dbv; - const char *statusNames[] = {"OnDefault", "AwayDefault", "NaDefault", "DndDefault", "FreeChatDefault", "InvDefault"}; - if (!db_get(NULL, "SRAway", statusNames[offlineMessageOption-1], &dbv)) { - int i; - char substituteStr[128]; - ptr = mir_strdup(dbv.pszVal); - db_free(&dbv); - for (i=0;ptr[i];i++) { - if (ptr[i] != '%') continue; - if (!_strnicmp(ptr+i,"%time%",6)) - GetTimeFormatA(LOCALE_USER_DEFAULT,TIME_NOSECONDS,nullptr,nullptr,substituteStr,sizeof(substituteStr)); - else if (!_strnicmp(ptr+i,"%date%",6)) - GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,nullptr,nullptr,substituteStr,sizeof(substituteStr)); - else continue; - if (mir_strlen(substituteStr)>6) ptr=(char*)mir_realloc(ptr,mir_strlen(ptr)+1+mir_strlen(substituteStr)-6); - memmove(ptr+i+mir_strlen(substituteStr),ptr+i+6,mir_strlen(ptr)-i-5); - memcpy(ptr+i,substituteStr,mir_strlen(substituteStr)); - } - } - } - } - mir_free(statusMsg); - statusMsg = ptr; - break; - default: - // Should not reach here - break; - } - proto->m_iStatus = status; - if (presenceType) { - if (statusMsg != nullptr && *statusMsg) - TlenSend(proto, "%s", presenceType, ptrA(TlenTextEncode(statusMsg))); - else - TlenSend(proto, "", presenceType); - } else { - if (statusMsg != nullptr && *statusMsg) - TlenSend(proto, "%s%s", showBody, ptrA(TlenTextEncode(statusMsg))); - else - TlenSend(proto, "%s", showBody); - } - - setOwnStatusOnCList(proto, proto->m_iStatus, statusMsg); -} - - - -void TlenSendPresence(TlenProtocol *proto, int statusIn) -{ - int statusOut; - switch (statusIn) { - case ID_STATUS_ONLINE: - case ID_STATUS_OFFLINE: - case ID_STATUS_NA: - case ID_STATUS_FREECHAT: - case ID_STATUS_INVISIBLE: - statusOut = statusIn; - break; - case ID_STATUS_AWAY: - case ID_STATUS_ONTHEPHONE: - case ID_STATUS_OUTTOLUNCH: - default: - statusOut = ID_STATUS_AWAY; - break; - case ID_STATUS_DND: - case ID_STATUS_OCCUPIED: - statusOut = ID_STATUS_DND; - break; - } - TlenSendPresenceTo(proto, statusOut, nullptr); -} - - diff --git a/protocols/Tlen/src/tlen_presence.h b/protocols/Tlen/src/tlen_presence.h deleted file mode 100644 index caf92ddab58..00000000000 --- a/protocols/Tlen/src/tlen_presence.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2009 Piotr Piastucki - -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. - -*/ -#ifndef _TLEN_PRESENCE_H -#define _TLEN_PRESENCE_H - -void TlenProcessPresence(XmlNode *node, TlenProtocol *proto); - -#endif /* _TLEN_PRESENCE_H */ - diff --git a/protocols/Tlen/src/tlen_svc.cpp b/protocols/Tlen/src/tlen_svc.cpp deleted file mode 100644 index 1366155ccba..00000000000 --- a/protocols/Tlen/src/tlen_svc.cpp +++ /dev/null @@ -1,1208 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" -#include -#include -#include -#include -#include "resource.h" -#include "tlen_list.h" -#include "tlen_iq.h" -#include "tlen_p2p_old.h" -#include "tlen_avatar.h" -#include "tlen_file.h" - -DWORD_PTR TlenProtocol::GetCaps(int type, MCONTACT) -{ - switch (type) { - case PFLAGNUM_1: - return PF1_IM | PF1_AUTHREQ | PF1_SERVERCLIST | PF1_MODEMSG | PF1_BASICSEARCH | PF1_SEARCHBYEMAIL | PF1_EXTSEARCH | PF1_EXTSEARCHUI | PF1_SEARCHBYNAME | PF1_FILE;//|PF1_VISLIST|PF1_INVISLIST; - case PFLAGNUM_2: - return PF2_ONLINE | PF2_INVISIBLE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_HEAVYDND | PF2_FREECHAT; - case PFLAGNUM_3: - return PF2_ONLINE | PF2_INVISIBLE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_HEAVYDND | PF2_FREECHAT; - case PFLAGNUM_4: - return PF4_FORCEAUTH | PF4_NOCUSTOMAUTH | PF4_SUPPORTTYPING | PF4_AVATARS | PF4_IMSENDOFFLINE | PF4_OFFLINEFILES; - case PFLAG_UNIQUEIDTEXT: - return (INT_PTR)Translate("Tlen login"); - case PFLAG_UNIQUEIDSETTING: - return (INT_PTR) "jid"; - default: - return 0; - } -} - -INT_PTR TlenProtocol::GetName(WPARAM wParam, LPARAM lParam) -{ - strncpy((char*)lParam, m_szModuleName, wParam); - return 0; -} - -int TlenRunSearch(TlenProtocol *proto) { - int iqId = 0; - if (!proto->isOnline) return 0; - if (proto->searchQuery != nullptr && proto->searchIndex < 10) { - iqId = proto->searchID; - TlenIqAdd(proto, iqId, IQ_PROC_GETSEARCH, TlenIqResultSearch); - if (proto->searchIndex == 0) { - TlenSend(proto, "%s", iqId, proto->searchQuery); - } - else { - TlenSend(proto, "%s%d", iqId, proto->searchQuery, proto->searchIndex * TLEN_MAX_SEARCH_RESULTS_PER_PAGE); - } - proto->searchIndex++; - } - return iqId; -} - -void TlenResetSearchQuery(TlenProtocol *proto) { - if (proto->searchQuery != nullptr) { - mir_free(proto->searchQuery); - proto->searchQuery = nullptr; - } - proto->searchQueryLen = 0; - proto->searchIndex = 0; - proto->searchID = TlenSerialNext(proto); -} - -HANDLE TlenProtocol::SearchBasic(const wchar_t* id) -{ - int iqId = 0; - if (!isOnline) return nullptr; - if (id == nullptr) return nullptr; - char* id_A = mir_u2a(id); - char *jid = TlenTextEncode(id_A); - if (jid != nullptr) { - searchJID = mir_strdup(id_A); - TlenResetSearchQuery(this); - TlenStringAppend(&searchQuery, &searchQueryLen, "%s", jid); - iqId = TlenRunSearch(this); - mir_free(jid); - } - mir_free(id_A); - return (HANDLE)iqId; -} - -HANDLE TlenProtocol::SearchByEmail(const wchar_t* email) -{ - int iqId = 0; - - if (!isOnline) return nullptr; - if (email == nullptr) return nullptr; - - char* email_A = mir_u2a(email); - char *emailEnc = TlenTextEncode(email_A); - if (emailEnc != nullptr) { - TlenResetSearchQuery(this); - TlenStringAppend(&searchQuery, &searchQueryLen, "%s", emailEnc); - iqId = TlenRunSearch(this); - mir_free(emailEnc); - } - mir_free(email_A); - return (HANDLE)iqId; -} - -HANDLE TlenProtocol::SearchByName(const wchar_t* nickT, const wchar_t* firstNameT, const wchar_t* lastNameT) -{ - if (!isOnline) return nullptr; - - char *nick = mir_u2a(nickT); - char *firstName = mir_u2a(firstNameT); - char *lastName = mir_u2a(lastNameT); - - char *p; - int iqId = 0; - - TlenResetSearchQuery(this); - - if (nick != nullptr && nick[0] != '\0') { - if ((p = TlenTextEncode(nick)) != nullptr) { - TlenStringAppend(&searchQuery, &searchQueryLen, "%s", p); - mir_free(p); - } - } - if (firstName != nullptr && firstName[0] != '\0') { - if ((p = TlenTextEncode(firstName)) != nullptr) { - TlenStringAppend(&searchQuery, &searchQueryLen, "%s", p); - mir_free(p); - } - } - if (lastName != nullptr && lastName[0] != '\0') { - if ((p = TlenTextEncode(lastName)) != nullptr) { - TlenStringAppend(&searchQuery, &searchQueryLen, "%s", p); - mir_free(p); - } - } - - iqId = TlenRunSearch(this); - return (HANDLE)iqId; -} - -HWND TlenProtocol::CreateExtendedSearchUI(HWND owner) -{ - return (HWND)CreateDialog(hInst, MAKEINTRESOURCE(IDD_ADVSEARCH), owner, TlenAdvSearchDlgProc); -} - -HWND TlenProtocol::SearchAdvanced(HWND owner) -{ - if (!isOnline) return nullptr; - - TlenResetSearchQuery(this); - int iqId = TlenSerialNext(this); - if ((searchQuery = TlenAdvSearchCreateQuery(owner, iqId)) != nullptr) { - iqId = TlenRunSearch(this); - } - return (HWND)iqId; -} - - -static MCONTACT AddToListByJID(TlenProtocol *proto, const char *newJid, DWORD flags) -{ - MCONTACT hContact = TlenHContactFromJID(proto, newJid); - if (hContact == NULL) { - // not already there: add - char *jid = mir_strdup(newJid); _strlwr(jid); - hContact = db_add_contact(); - Proto_AddToContact(hContact, proto->m_szModuleName); - db_set_s(hContact, proto->m_szModuleName, "jid", jid); - char *nick = TlenNickFromJID(newJid); - if (nick == nullptr) - nick = mir_strdup(newJid); - db_set_s(hContact, "CList", "MyHandle", nick); - mir_free(nick); - mir_free(jid); - - // Note that by removing or disable the "NotOnList" will trigger - // the plugin to add a particular contact to the roster list. - // See DBSettingChanged hook at the bottom part of this source file. - // But the add module will delete "NotOnList". So we will not do it here. - // Also because we need "MyHandle" and "Group" info, which are set after - // PS_ADDTOLIST is called but before the add dialog issue deletion of - // "NotOnList". - // If temporary add, "NotOnList" won't be deleted, and that's expected. - db_set_b(hContact, "CList", "NotOnList", 1); - if (flags & PALF_TEMPORARY) - db_set_b(hContact, "CList", "Hidden", 1); - } - else { - // already exist - // Set up a dummy "NotOnList" when adding permanently only - if (!(flags&PALF_TEMPORARY)) - db_set_b(hContact, "CList", "NotOnList", 1); - } - - return hContact; -} - -MCONTACT TlenProtocol::AddToList(int flags, PROTOSEARCHRESULT *psr) -{ - TLEN_SEARCH_RESULT *jsr = (TLEN_SEARCH_RESULT*)psr; - if (jsr->hdr.cbSize != sizeof(TLEN_SEARCH_RESULT)) - return NULL; - return AddToListByJID(this, jsr->jid, flags);// wParam is flag e.g. PALF_TEMPORARY -} - -MCONTACT TlenProtocol::AddToListByEvent(int flags, int, MEVENT hDbEvent) -{ - DBEVENTINFO dbei = {}; - if ((dbei.cbBlob = db_event_getBlobSize(hDbEvent)) == (DWORD)(-1)) - return NULL; - if ((dbei.pBlob = (PBYTE)mir_alloc(dbei.cbBlob)) == nullptr) - return NULL; - if (db_event_get(hDbEvent, &dbei)) { - mir_free(dbei.pBlob); - return NULL; - } - if (mir_strcmp(dbei.szModule, m_szModuleName)) { - mir_free(dbei.pBlob); - return NULL; - } - - /* - // EVENTTYPE_CONTACTS is when adding from when we receive contact list (not used in Tlen) - // EVENTTYPE_ADDED is when adding from when we receive "You are added" (also not used in Tlen) - // Tlen will only handle the case of EVENTTYPE_AUTHREQUEST - // EVENTTYPE_AUTHREQUEST is when adding from the authorization request dialog - */ - - if (dbei.eventType != EVENTTYPE_AUTHREQUEST) { - mir_free(dbei.pBlob); - return NULL; - } - - DB_AUTH_BLOB blob(dbei.pBlob); - MCONTACT hContact = (MCONTACT)AddToListByJID(this, blob.get_email(), flags); - mir_free(dbei.pBlob); - return hContact; -} - -int TlenProtocol::Authorize(MEVENT hDbEvent) -{ - if (!isOnline) - return 1; - - DBEVENTINFO dbei = {}; - if ((dbei.cbBlob = db_event_getBlobSize(hDbEvent)) == (DWORD)-1) - return 1; - if ((dbei.pBlob = (PBYTE)mir_alloc(dbei.cbBlob)) == nullptr) - return 1; - if (db_event_get(hDbEvent, &dbei)) { - mir_free(dbei.pBlob); - return 1; - } - if (dbei.eventType != EVENTTYPE_AUTHREQUEST) { - mir_free(dbei.pBlob); - return 1; - } - if (mir_strcmp(dbei.szModule, m_szModuleName)) { - mir_free(dbei.pBlob); - return 1; - } - - DB_AUTH_BLOB blob(dbei.pBlob); - TlenSend(this, "", blob.get_email()); - - // Automatically add this user to my roster if option is enabled - if (db_get_b(NULL, m_szModuleName, "AutoAdd", TRUE) == TRUE) { - MCONTACT hContact; - TLEN_LIST_ITEM *item = TlenListGetItemPtr(this, LIST_ROSTER, blob.get_email()); - - if (item == nullptr || (item->subscription != SUB_BOTH && item->subscription != SUB_TO)) { - debugLogA("Try adding contact automatically jid=%s", blob.get_email()); - if ((hContact = AddToListByJID(this, blob.get_email(), 0)) != NULL) { - // Trigger actual add by removing the "NotOnList" added by AddToListByJID() - // See AddToListByJID() and TlenDbSettingChanged(). - db_unset(hContact, "CList", "NotOnList"); - } - } - } - - mir_free(dbei.pBlob); - return 0; -} - -int TlenProtocol::AuthDeny(MEVENT hDbEvent, const wchar_t*) -{ - if (!isOnline) - return 1; - - DBEVENTINFO dbei = {}; - if ((dbei.cbBlob = db_event_getBlobSize(hDbEvent)) == (DWORD)(-1)) - return 1; - if ((dbei.pBlob = (PBYTE)mir_alloc(dbei.cbBlob)) == nullptr) - return 1; - if (db_event_get(hDbEvent, &dbei)) { - mir_free(dbei.pBlob); - return 1; - } - if (dbei.eventType != EVENTTYPE_AUTHREQUEST) { - mir_free(dbei.pBlob); - return 1; - } - if (mir_strcmp(dbei.szModule, m_szModuleName)) { - mir_free(dbei.pBlob); - return 1; - } - - DB_AUTH_BLOB blob(dbei.pBlob); - TlenSend(this, "", blob.get_email()); - TlenSend(this, "", blob.get_email()); - mir_free(dbei.pBlob); - return 0; -} - -static void TlenConnect(TlenProtocol *proto, int initialStatus) -{ - if (!proto->isConnected) { - ThreadData *thread = (ThreadData *)mir_alloc(sizeof(ThreadData)); - memset(thread, 0, sizeof(ThreadData)); - thread->proto = proto; - proto->m_iDesiredStatus = initialStatus; - - int oldStatus = proto->m_iStatus; - proto->m_iStatus = ID_STATUS_CONNECTING; - ProtoBroadcastAck(proto->m_szModuleName, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)oldStatus, proto->m_iStatus); - thread->hThread = mir_forkthread((pThreadFunc)TlenServerThread, thread); - } -} - -int TlenProtocol::SetStatus(int iNewStatus) -{ - int oldStatus; - HANDLE s; - - m_iDesiredStatus = iNewStatus; - - if (iNewStatus == ID_STATUS_OFFLINE) { - if (threadData) { - if (isConnected) { - TlenSendPresence(this, ID_STATUS_OFFLINE); - } - - // TODO bug? s = proto; - s = threadData->s; - - threadData = nullptr; - if (isConnected) { - Sleep(200); - // TlenSend(s, ""); - // Force closing connection - isConnected = FALSE; - isOnline = FALSE; - Netlib_CloseHandle(s); - } - } - else { - if (m_iStatus != ID_STATUS_OFFLINE) { - oldStatus = m_iStatus; - m_iStatus = ID_STATUS_OFFLINE; - ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)oldStatus, m_iStatus); - } - } - } - else if (iNewStatus != m_iStatus) { - if (!isConnected) { - TlenConnect(this, iNewStatus); - } - else { - // change status - oldStatus = m_iStatus; - // send presence update - TlenSendPresence(this, iNewStatus); - ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)oldStatus, m_iStatus); - } - } - return 0; -} - -INT_PTR TlenProtocol::GetStatus(WPARAM, LPARAM) -{ - return m_iStatus; -} - -int TlenProtocol::SetAwayMsg(int iStatus, const wchar_t* msg) -{ - char **szMsg; - char *newModeMsg; - - newModeMsg = mir_u2a(msg); - - debugLogA("SetAwayMsg called, wParam=%d lParam=%s", iStatus, newModeMsg); - - mir_cslock lck(modeMsgMutex); - - switch (iStatus) { - case ID_STATUS_ONLINE: - szMsg = &modeMsgs.szOnline; - break; - case ID_STATUS_AWAY: - case ID_STATUS_ONTHEPHONE: - case ID_STATUS_OUTTOLUNCH: - szMsg = &modeMsgs.szAway; - break; - case ID_STATUS_NA: - szMsg = &modeMsgs.szNa; - break; - case ID_STATUS_DND: - case ID_STATUS_OCCUPIED: - szMsg = &modeMsgs.szDnd; - break; - case ID_STATUS_FREECHAT: - szMsg = &modeMsgs.szFreechat; - break; - case ID_STATUS_INVISIBLE: - szMsg = &modeMsgs.szInvisible; - break; - default: - return 1; - } - - if ((*szMsg == nullptr && newModeMsg == nullptr) || - (*szMsg != nullptr && newModeMsg != nullptr && !mir_strcmp(*szMsg, newModeMsg))) { - // Message is the same, no update needed - if (newModeMsg != nullptr) mir_free(newModeMsg); - } - else { - // Update with the new mode message - if (*szMsg != nullptr) mir_free(*szMsg); - *szMsg = newModeMsg; - // Send a presence update if needed - if (iStatus == m_iStatus) { - TlenSendPresence(this, m_iStatus); - } - } - - return 0; -} - -int TlenProtocol::GetInfo(MCONTACT hContact, int) -{ - DBVARIANT dbv; - int iqId; - char *nick, *pNick; - - if (!isOnline) return 1; - if (hContact == NULL) { - iqId = TlenSerialNext(this); - TlenIqAdd(this, iqId, IQ_PROC_NONE, TlenIqResultVcard); - TlenSend(this, "", iqId); - } - else { - if (db_get(hContact, m_szModuleName, "jid", &dbv)) return 1; - if ((nick = TlenNickFromJID(dbv.pszVal)) != nullptr) { - if ((pNick = TlenTextEncode(nick)) != nullptr) { - iqId = TlenSerialNext(this); - TlenIqAdd(this, iqId, IQ_PROC_NONE, TlenIqResultVcard); - TlenSend(this, "%s", iqId, pNick); - mir_free(pNick); - } - mir_free(nick); - } - db_free(&dbv); - } - return 0; -} - -int TlenProtocol::SetApparentMode(MCONTACT hContact, int mode) -{ - DBVARIANT dbv; - int oldMode; - char *jid; - - if (!isOnline) return 0; - if (!db_get_b(NULL, m_szModuleName, "VisibilitySupport", FALSE)) return 0; - if (mode != 0 && mode != ID_STATUS_ONLINE && mode != ID_STATUS_OFFLINE) return 1; - oldMode = db_get_w(hContact, m_szModuleName, "ApparentMode", 0); - if ((int)mode == oldMode) return 1; - db_set_w(hContact, m_szModuleName, "ApparentMode", (WORD)mode); - if (!db_get(hContact, m_szModuleName, "jid", &dbv)) { - jid = dbv.pszVal; - switch (mode) { - case ID_STATUS_ONLINE: - if (m_iStatus == ID_STATUS_INVISIBLE || oldMode == ID_STATUS_OFFLINE) - TlenSend(this, "available", jid); - break; - case ID_STATUS_OFFLINE: - if (m_iStatus != ID_STATUS_INVISIBLE || oldMode == ID_STATUS_ONLINE) - TlenSend(this, "", jid); - break; - case 0: - if (oldMode == ID_STATUS_ONLINE && m_iStatus == ID_STATUS_INVISIBLE) - TlenSend(this, "", jid); - else if (oldMode == ID_STATUS_OFFLINE && m_iStatus != ID_STATUS_INVISIBLE) - TlenSend(this, "available", jid); - break; - } - db_free(&dbv); - } - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -struct SENDACKTHREADDATA -{ - __inline SENDACKTHREADDATA(TlenProtocol *_ppro, MCONTACT _hContact, int _msgid = 0) : - proto(_ppro), hContact(_hContact), msgid(_msgid) - {} - - TlenProtocol *proto; - MCONTACT hContact; - int msgid; -}; - -static void __cdecl TlenSendMessageAckThread(void *ptr) -{ - SENDACKTHREADDATA *data = (SENDACKTHREADDATA *)ptr; - SleepEx(10, TRUE); - ProtoBroadcastAck(data->proto->m_szModuleName, data->hContact, ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, (HANDLE)data->msgid, 0); - delete data; -} - -static void __cdecl TlenSendMessageFailedThread(void *ptr) -{ - SENDACKTHREADDATA *data = (SENDACKTHREADDATA *)ptr; - SleepEx(10, TRUE); - ProtoBroadcastAck(data->proto->m_szModuleName, data->hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED, (HANDLE)data->msgid, 0); - delete data; -} - -static void __cdecl TlenGetAwayMsgThread(void *ptr) -{ - DBVARIANT dbv; - SENDACKTHREADDATA *data = (SENDACKTHREADDATA *)ptr; - - Sleep(50); - - if (!db_get(data->hContact, data->proto->m_szModuleName, "jid", &dbv)) { - TLEN_LIST_ITEM *item = TlenListGetItemPtr(data->proto, LIST_ROSTER, dbv.pszVal); - if (item != nullptr) { - db_free(&dbv); - ProtoBroadcastAck(data->proto->m_szModuleName, data->hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE)1, - item->statusMessage == NULL ? NULL : _A2T(item->statusMessage)); - } - else { - ptrA ownJid(db_get_sa(NULL, data->proto->m_szModuleName, "jid")); - if (!mir_strcmp(ownJid, dbv.pszVal)) { - DBVARIANT dbv2; - if (!db_get_s(data->hContact, "CList", "StatusMsg", &dbv2, DBVT_WCHAR)) { - data->proto->ProtoBroadcastAck(data->hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE)1, (LPARAM)dbv2.ptszVal); - db_free(&dbv2); - } - else { - data->proto->ProtoBroadcastAck(data->hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE)1, NULL); - } - } - db_free(&dbv); - } - } - else { - data->proto->ProtoBroadcastAck(data->hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE)1, NULL); - } - - delete data; -} - -INT_PTR TlenProtocol::SendAlert(WPARAM hContact, LPARAM) -{ - DBVARIANT dbv; - if (isOnline && !db_get(hContact, m_szModuleName, "jid", &dbv)) { - TlenSend(this, "", dbv.pszVal); - - db_free(&dbv); - } - return 0; -} - -int TlenProtocol::SendMsg(MCONTACT hContact, int, const char* msgRAW) -{ - DBVARIANT dbv; - if (!isOnline || db_get(hContact, m_szModuleName, "jid", &dbv)) { - mir_forkthread(TlenSendMessageFailedThread, new SENDACKTHREADDATA(this, hContact, 2)); - return 2; - } - - TLEN_LIST_ITEM *item; - char msgType[16]; - - char* msg = mir_utf8decodeA(msgRAW); - int id = TlenSerialNext(this); - - if (!mir_strcmp(msg, "")) { - TlenSend(this, "", dbv.pszVal); - mir_forkthread(TlenSendMessageAckThread, new SENDACKTHREADDATA(this, hContact, id)); - } - else if (!mir_strcmp(msg, "")) { - TlenSend(this, "", dbv.pszVal, "pic", 0x757f044, id); - mir_forkthread(TlenSendMessageAckThread, new SENDACKTHREADDATA(this, hContact, id)); - } - else { - char *msgEnc = TlenTextEncode(msg); - if (msgEnc != nullptr) { - if (TlenListExist(this, LIST_CHATROOM, dbv.pszVal) && strchr(dbv.pszVal, '/') == nullptr) - mir_strcpy(msgType, "groupchat"); - else if (db_get_b(hContact, m_szModuleName, "bChat", FALSE)) - mir_strcpy(msgType, "privchat"); - else - mir_strcpy(msgType, "chat"); - - if (!mir_strcmp(msgType, "groupchat") || db_get_b(NULL, m_szModuleName, "MsgAck", FALSE) == FALSE) { - if (!mir_strcmp(msgType, "groupchat")) - TlenSend(this, "%s", dbv.pszVal, msgType, msgEnc); - else if (!mir_strcmp(msgType, "privchat")) - TlenSend(this, "%s", dbv.pszVal, msgEnc); - else - TlenSend(this, "%s", dbv.pszVal, msgType, id, msgEnc); - - mir_forkthread(TlenSendMessageAckThread, new SENDACKTHREADDATA(this, hContact, id)); - } - else { - if ((item = TlenListGetItemPtr(this, LIST_ROSTER, dbv.pszVal)) != nullptr) - item->idMsgAckPending = id; - TlenSend(this, "%s", dbv.pszVal, msgType, id, msgEnc); - } - } - mir_free(msgEnc); - } - - mir_free(msg); - db_free(&dbv); - return id; -} - -///////////////////////////////////////////////////////////////////////////////////////// -// TlenGetAvatarInfo - retrieves the avatar info - -INT_PTR TlenProtocol::GetAvatarInfo(WPARAM wParam, LPARAM lParam) -{ - if (!tlenOptions.enableAvatars) return GAIR_NOAVATAR; - BOOL downloadingAvatar = FALSE; - char *avatarHash = nullptr; - TLEN_LIST_ITEM *item = nullptr; - DBVARIANT dbv; - PROTO_AVATAR_INFORMATION *pai = (PROTO_AVATAR_INFORMATION*)lParam; - - if (pai->hContact != NULL) { - if (!db_get(pai->hContact, m_szModuleName, "jid", &dbv)) { - item = TlenListGetItemPtr(this, LIST_ROSTER, dbv.pszVal); - db_free(&dbv); - if (item != nullptr) { - downloadingAvatar = item->newAvatarDownloading; - avatarHash = item->avatarHash; - } - } - } - else if (threadData != nullptr) - avatarHash = threadData->avatarHash; - - if ((avatarHash == nullptr || avatarHash[0] == '\0') && !downloadingAvatar) - return GAIR_NOAVATAR; - - if (avatarHash != nullptr && !downloadingAvatar) { - TlenGetAvatarFileName(this, item, pai->filename, _countof(pai->filename) - 1); - pai->format = (pai->hContact == NULL) ? threadData->avatarFormat : item->avatarFormat; - return GAIR_SUCCESS; - } - - /* get avatar */ - if ((wParam & GAIF_FORCE) != 0 && pai->hContact != NULL && isOnline) - return GAIR_WAITFOR; - - return GAIR_NOAVATAR; -} - -HANDLE TlenProtocol::GetAwayMsg(MCONTACT hContact) -{ - SENDACKTHREADDATA *tdata = new SENDACKTHREADDATA(this, hContact, 0); - mir_forkthread((pThreadFunc)TlenGetAwayMsgThread, tdata); - return (HANDLE)1; -} - -int TlenProtocol::RecvAwayMsg(MCONTACT, int, PROTORECVEVENT*) -{ - return 0; -} - -HANDLE TlenProtocol::FileAllow(MCONTACT, HANDLE hTransfer, const wchar_t* szPath) -{ - if (!isOnline) return nullptr; - - TLEN_FILE_TRANSFER *ft = (TLEN_FILE_TRANSFER *)hTransfer; - ft->szSavePath = mir_strdup(mir_u2a(szPath)); //TODO convert to wchar_t* - TLEN_LIST_ITEM *item = TlenListAdd(this, LIST_FILE, ft->iqId); - if (item != nullptr) { - item->ft = ft; - } - char *nick = TlenNickFromJID(ft->jid); - if (ft->newP2P) { - TlenSend(this, "", ft->jid, ft->jid, ft->iqId); - } - else { - TlenSend(this, "", nick, ft->iqId); - } - mir_free(nick); - return (HANDLE)hTransfer; -} - -int TlenProtocol::FileDeny(MCONTACT, HANDLE hTransfer, const wchar_t*) -{ - if (!isOnline) return 1; - - TLEN_FILE_TRANSFER *ft = (TLEN_FILE_TRANSFER *)hTransfer; - char *nick = TlenNickFromJID(ft->jid); - TlenSend(this, "", ft->iqId, nick); \ - mir_free(nick); - TlenP2PFreeFileTransfer(ft); - return 0; -} - -int TlenProtocol::FileResume(HANDLE, int*, const wchar_t**) -{ - return 0; -} - -int TlenProtocol::FileCancel(MCONTACT, HANDLE hTransfer) -{ - TLEN_FILE_TRANSFER *ft = (TLEN_FILE_TRANSFER *)hTransfer; - debugLogA("Invoking FileCancel()"); - if (ft->s != nullptr) { - ft->state = FT_ERROR; - Netlib_CloseHandle(ft->s); - ft->s = nullptr; - if (ft->hFileEvent != nullptr) { - HANDLE hEvent = ft->hFileEvent; - ft->hFileEvent = nullptr; - SetEvent(hEvent); - } - } - else { - TlenP2PFreeFileTransfer(ft); - } - return 0; -} - -HANDLE TlenProtocol::SendFile(MCONTACT hContact, const wchar_t* szDescription, wchar_t** ppszFiles) -{ - int i, j; - struct _stat statbuf; - DBVARIANT dbv; - char *nick, *p, idStr[10]; - - if (!isOnline) return nullptr; - // if (db_get_w(ccs->hContact, m_szModuleName, "Status", ID_STATUS_OFFLINE) == ID_STATUS_OFFLINE) return 0; - if (db_get(hContact, m_szModuleName, "jid", &dbv)) return nullptr; - TLEN_FILE_TRANSFER *ft = TlenFileCreateFT(this, dbv.pszVal); - for (ft->fileCount = 0; ppszFiles[ft->fileCount]; ft->fileCount++); - ft->files = (char **)mir_alloc(sizeof(char *) * ft->fileCount); - ft->filesSize = (long *)mir_alloc(sizeof(long) * ft->fileCount); - ft->allFileTotalSize = 0; - for (i = j = 0; i < ft->fileCount; i++) { - char* ppszFiles_i_A = mir_u2a(ppszFiles[i]); - if (_stat(ppszFiles_i_A, &statbuf)) - debugLogA("'%s' is an invalid filename", ppszFiles[i]); - else { - ft->filesSize[j] = statbuf.st_size; - ft->files[j++] = mir_strdup(ppszFiles_i_A); - ft->allFileTotalSize += statbuf.st_size; - } - mir_free(ppszFiles_i_A); - } - ft->fileCount = j; - ft->szDescription = mir_u2a(szDescription); - ft->hContact = hContact; - ft->currentFile = 0; - db_free(&dbv); - - int id = TlenSerialNext(this); - mir_snprintf(idStr, "%d", id); - TLEN_LIST_ITEM *item = TlenListAdd(this, LIST_FILE, idStr); - if (item != nullptr) { - ft->iqId = mir_strdup(idStr); - nick = TlenNickFromJID(ft->jid); - item->ft = ft; - if (tlenOptions.useNewP2P) { - TlenSend(this, "", - ft->jid, ft->jid, idStr, ft->fileCount, ft->allFileTotalSize, ft->fileCount); - - ft->newP2P = TRUE; - } - else { - if (ft->fileCount == 1) { - char* ppszFiles_0_A = mir_u2a(ppszFiles[0]); - if ((p = strrchr(ppszFiles_0_A, '\\')) != nullptr) { - p++; - } - else { - p = ppszFiles_0_A; - } - p = TlenTextEncode(p); - TlenSend(this, "", nick, p, idStr, ft->allFileTotalSize); - mir_free(ppszFiles[0]); - mir_free(p); - } - else { - TlenSend(this, "", nick, idStr, ft->fileCount, ft->allFileTotalSize); - } - } - mir_free(nick); - } - - return (HANDLE)ft; -} - -static char* settingToChar(DBCONTACTWRITESETTING* cws) -{ - switch (cws->value.type) { - case DBVT_ASCIIZ: - return mir_strdup(cws->value.pszVal); - case DBVT_UTF8: - return mir_utf8decode(mir_strdup(cws->value.pszVal), nullptr); - } - return nullptr; -} - -int TlenProtocol::TlenDbSettingChanged(WPARAM wParam, LPARAM lParam) -{ - MCONTACT hContact = (MCONTACT)wParam; - DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING *)lParam; - // no action for hContact == NULL or when offline - if (hContact == NULL) return 0; - if (!isConnected) return 0; - - if (!strcmp(cws->szModule, "CList")) { - DBVARIANT dbv; - TLEN_LIST_ITEM *item; - char *nick, *jid, *group; - - char *szProto = GetContactProto(hContact); - if (szProto == nullptr || strcmp(szProto, m_szModuleName)) return 0; - // A contact's group is changed - if (!strcmp(cws->szSetting, "Group")) { - if (!db_get(hContact, m_szModuleName, "jid", &dbv)) { - if ((item = TlenListGetItemPtr(this, LIST_ROSTER, dbv.pszVal)) != nullptr) { - db_free(&dbv); - if (!db_get(hContact, "CList", "MyHandle", &dbv)) { - nick = TlenTextEncode(dbv.pszVal); - db_free(&dbv); - } - else if (!db_get(hContact, this->m_szModuleName, "Nick", &dbv)) { - nick = TlenTextEncode(dbv.pszVal); - db_free(&dbv); - } - else nick = TlenNickFromJID(item->jid); - - if (nick != nullptr) { - // Note: we need to compare with item->group to prevent infinite loop - if (cws->value.type == DBVT_DELETED && item->group != nullptr) { - debugLogA("Group set to nothing"); - TlenSend(this, "", nick, item->jid); - } - else if (cws->value.pszVal != nullptr) { - char *newGroup = settingToChar(cws); - if (item->group == nullptr || strcmp(newGroup, item->group)) { - debugLogA("Group set to %s", newGroup); - if ((group = TlenGroupEncode(newGroup)) != nullptr) { - TlenSend(this, "%s", nick, item->jid, group); - mir_free(group); - } - } - mir_free(newGroup); - } - mir_free(nick); - } - } - else { - db_free(&dbv); - } - } - } - // A contact is renamed - else if (!strcmp(cws->szSetting, "MyHandle")) { - char *newNick; - - // hContact = (MCONTACT) wParam; - // szProto = GetContactProto(hContact); - // if (szProto == NULL || strcmp(szProto, proto->m_szModuleName)) return 0; - - if (!db_get(hContact, m_szModuleName, "jid", &dbv)) { - jid = dbv.pszVal; - if ((item = TlenListGetItemPtr(this, LIST_ROSTER, dbv.pszVal)) != nullptr) { - if (cws->value.type == DBVT_DELETED) { - newNick = mir_u2a(pcli->pfnGetContactDisplayName(hContact, GCDNF_NOMYHANDLE)); - } - else if (cws->value.pszVal != nullptr) { - newNick = settingToChar(cws); - } - else { - newNick = nullptr; - } - // Note: we need to compare with item->nick to prevent infinite loop - if (newNick != nullptr && (item->nick == nullptr || (item->nick != nullptr && strcmp(item->nick, newNick)))) { - if ((nick = TlenTextEncode(newNick)) != nullptr) { - debugLogA("Nick set to %s", newNick); - if (item->group != nullptr && (group = TlenGroupEncode(item->group)) != nullptr) { - TlenSend(this, "%s", nick, jid, group); - mir_free(group); - } - else { - TlenSend(this, "", nick, jid); - } - mir_free(nick); - } - } - if (newNick != nullptr) mir_free(newNick); - } - db_free(&dbv); - } - } - // A temporary contact has been added permanently - else if (!strcmp(cws->szSetting, "NotOnList")) { - if (cws->value.type == DBVT_DELETED || (cws->value.type == DBVT_BYTE && cws->value.bVal == 0)) { - ptrA szJid(db_get_sa(hContact, m_szModuleName, "jid")); - if (szJid != NULL) { - char *szNick, *pGroup; - debugLogA("Add %s permanently to list", szJid); - if (!db_get(hContact, "CList", "MyHandle", &dbv)) { - szNick = TlenTextEncode(dbv.pszVal); //Utf8Encode - db_free(&dbv); - } - else szNick = TlenNickFromJID(szJid); - - if (szNick != nullptr) { - debugLogA("jid=%s szNick=%s", szJid, szNick); - if (!db_get(hContact, "CList", "Group", &dbv)) { - if ((pGroup = TlenGroupEncode(dbv.pszVal)) != nullptr) { - TlenSend(this, "%s", szNick, szJid, pGroup); - TlenSend(this, "", szJid); - mir_free(pGroup); - } - db_free(&dbv); - } - else { - TlenSend(this, "", szNick, szJid); - TlenSend(this, "", szJid); - } - mir_free(szNick); - db_unset(hContact, "CList", "Hidden"); - } - } - } - } - } - - return 0; -} - -int TlenProtocol::TlenContactDeleted(WPARAM wParam, LPARAM) -{ - if (!isOnline) // should never happen - return 0; - - char *szProto = GetContactProto(wParam); - if (szProto == nullptr || mir_strcmp(szProto, m_szModuleName)) - return 0; - - DBVARIANT dbv; - if (!db_get(wParam, m_szModuleName, "jid", &dbv)) { - char *p, *q; - - char *jid = dbv.pszVal; - if ((p = strchr(jid, '@')) != nullptr) { - if ((q = strchr(p, '/')) != nullptr) - *q = '\0'; - } - - // Remove from roster, server also handles the presence unsubscription process. - if (TlenListExist(this, LIST_ROSTER, jid)) - TlenSend(this, "", jid); - - db_free(&dbv); - } - return 0; -} - -int TlenProtocol::UserIsTyping(MCONTACT hContact, int type) -{ - DBVARIANT dbv; - - if (!isOnline) return 0; - if (!db_get(hContact, m_szModuleName, "jid", &dbv)) { - TLEN_LIST_ITEM *item = TlenListGetItemPtr(this, LIST_ROSTER, dbv.pszVal); - if (item != nullptr /*&& item->wantComposingEvent == TRUE*/) { - switch (type) { - case PROTOTYPE_SELFTYPING_OFF: - TlenSend(this, "", dbv.pszVal); - break; - case PROTOTYPE_SELFTYPING_ON: - TlenSend(this, "", dbv.pszVal); - break; - } - } - db_free(&dbv); - } - return 0; -} - -INT_PTR TlenProtocol::GetMyAvatar(WPARAM wParam, LPARAM lParam) -{ - wchar_t* buf = (wchar_t*)wParam; - int size = (int)lParam; - if (buf == nullptr || size <= 0) - return -1; - - TlenGetAvatarFileName(this, nullptr, buf, size); - return 0; -} - -static INT_PTR CALLBACK TlenChangeAvatarDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM) -{ - switch (msg) { - case WM_INITDIALOG: - TranslateDialogDefault(hwndDlg); - Window_SetIcon_IcoLib(hwndDlg, GetIconHandle(IDI_TLEN)); - CheckDlgButton(hwndDlg, IDC_PUBLICAVATAR, BST_CHECKED); - return TRUE; - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDOK: - { - int result = LOWORD(wParam); - if (IsDlgButtonChecked(hwndDlg, IDC_PUBLICAVATAR)) { - result |= 0x10000; - } - EndDialog(hwndDlg, result); - } - return TRUE; - } - break; - } - return 0; -} - -INT_PTR TlenProtocol::SetMyAvatar(WPARAM, LPARAM lParam) -{ - if (!isOnline) { - PUShowMessageT(TranslateT("You need to be connected to Tlen account to set avatar."), SM_WARNING); - return 1; - } - wchar_t* szFileName = (wchar_t*)lParam; - wchar_t tFileName[MAX_PATH]; - if (szFileName != nullptr) { - int result = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_USER_CHANGEAVATAR), nullptr, TlenChangeAvatarDlgProc, (LPARAM)NULL); - TlenGetAvatarFileName(this, nullptr, tFileName, MAX_PATH); - if (CopyFile(szFileName, tFileName, FALSE) == FALSE) - return 1; - - char* tFileNameA = mir_u2a(tFileName); //TODO - drop io.h - int fileIn = open(tFileNameA, O_RDWR | O_BINARY, S_IREAD | S_IWRITE); - if (fileIn != -1) { - long dwPngSize = filelength(fileIn); - BYTE* pResult = (BYTE *)mir_alloc(dwPngSize); - if (pResult != nullptr) { - read(fileIn, pResult, dwPngSize); - close(fileIn); - TlenUploadAvatar(this, pResult, dwPngSize, (result & 0x10000) != 0); - mir_free(pResult); - } - } - else debugLogA("SetMyAvatar open error"); - mir_free(tFileName); - mir_free(tFileNameA); - } - else TlenRemoveAvatar(this); - - return 0; -} - -INT_PTR TlenProtocol::GetAvatarCaps(WPARAM wParam, LPARAM lParam) -{ - switch (wParam) { - case AF_MAXSIZE: - { - POINT* size = (POINT*)lParam; - if (size) - size->x = size->y = 64; - } - return 0; - case AF_PROPORTION: - return PIP_SQUARE; - case AF_FORMATSUPPORTED: - return (lParam == PA_FORMAT_PNG) ? 1 : 0; - case AF_ENABLED: - return tlenOptions.enableAvatars; - case AF_DONTNEEDDELAYS: - return 1; - case AF_MAXFILESIZE: - return 10 * 1024; - case AF_FETCHIFCONTACTOFFLINE: - return 1; - default: - return 0; - } -} - -int TlenProtocol::OnEvent(PROTOEVENTTYPE iEventType, WPARAM wParam, LPARAM lParam) -{ - //TlenProtocol *proto = (TlenProtocol *)ptr; - switch (iEventType) { - case EV_PROTO_ONLOAD: return OnModulesLoaded(0, 0); - case EV_PROTO_ONOPTIONS: return OptionsInit(wParam, lParam); - case EV_PROTO_ONEXIT: return PreShutdown(0, 0); - - case EV_PROTO_ONRENAME: - Menu_ModifyItem(hMenuRoot, m_tszUserName); - } - return 1; -} - -extern INT_PTR CALLBACK TlenAccMgrUIDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); - -INT_PTR TlenProtocol::AccMgrUI(WPARAM, LPARAM lParam) -{ - return (INT_PTR)CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_ACCMGRUI), (HWND)lParam, TlenAccMgrUIDlgProc, (LPARAM)this); -} - -void TlenInitServicesVTbl(TlenProtocol *proto) -{ - proto->CreateProtoService(PS_GETNAME, &TlenProtocol::GetName); - proto->CreateProtoService(PS_GETAVATARINFO, &TlenProtocol::GetAvatarInfo); - proto->CreateProtoService(PS_SEND_NUDGE, &TlenProtocol::SendAlert); - proto->CreateProtoService(PS_GETAVATARCAPS, &TlenProtocol::GetAvatarCaps); - proto->CreateProtoService(PS_SETMYAVATAR, &TlenProtocol::SetMyAvatar); - proto->CreateProtoService(PS_GETMYAVATAR, &TlenProtocol::GetMyAvatar); - proto->CreateProtoService(PS_GETSTATUS, &TlenProtocol::GetStatus); - proto->CreateProtoService(PS_CREATEACCMGRUI, &TlenProtocol::AccMgrUI); -} - -TlenProtocol::TlenProtocol(const char *aProtoName, const wchar_t *aUserName) : - PROTO(aProtoName, aUserName) -{ - TlenInitServicesVTbl(this); - - hTlenNudge = CreateProtoEvent("/Nudge"); - - HookProtoEvent(ME_OPT_INITIALISE, &TlenProtocol::OptionsInit); - HookProtoEvent(ME_DB_CONTACT_SETTINGCHANGED, &TlenProtocol::TlenDbSettingChanged); - HookProtoEvent(ME_DB_CONTACT_DELETED, &TlenProtocol::TlenContactDeleted); - HookProtoEvent(ME_CLIST_PREBUILDCONTACTMENU, &TlenProtocol::PrebuildContactMenu); - - DBVARIANT dbv; - if (!db_get(NULL, m_szModuleName, "LoginServer", &dbv)) - db_free(&dbv); - else - db_set_s(NULL, m_szModuleName, "LoginServer", "tlen.pl"); - - if (!db_get(NULL, m_szModuleName, "ManualHost", &dbv)) - db_free(&dbv); - else - db_set_s(NULL, m_szModuleName, "ManualHost", "s1.tlen.pl"); - - TlenLoadOptions(this); - - TlenWsInit(this); - TlenSerialInit(this); - TlenIqInit(this); - TlenListInit(this); - - initMenuItems(); -} - -TlenProtocol::~TlenProtocol() -{ - TlenVoiceCancelAll(this); - TlenFileCancelAll(this); - if (hTlenNudge) - DestroyHookableEvent(hTlenNudge); - TlenListUninit(this); - TlenIqUninit(this); - TlenWsUninit(this); - - mir_free(modeMsgs.szOnline); - mir_free(modeMsgs.szAway); - mir_free(modeMsgs.szNa); - mir_free(modeMsgs.szDnd); - mir_free(modeMsgs.szFreechat); - mir_free(modeMsgs.szInvisible); -} diff --git a/protocols/Tlen/src/tlen_thread.cpp b/protocols/Tlen/src/tlen_thread.cpp deleted file mode 100644 index 0cbe1c4819b..00000000000 --- a/protocols/Tlen/src/tlen_thread.cpp +++ /dev/null @@ -1,1321 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" - -#include "commons.h" -#include "tlen_list.h" -#include "tlen_iq.h" -#include "resource.h" -#include "tlen_p2p_old.h" -#include "tlen_file.h" -#include "tlen_muc.h" -#include "tlen_voice.h" -#include "tlen_avatar.h" -#include "tlen_presence.h" -#include "tlen_picture.h" -#include -#include -#include - - -extern void __cdecl TlenProcessP2P(XmlNode *node, ThreadData *info); - - -//static void __cdecl TlenProcessInvitation(struct ThreadData *info); -static void __cdecl TlenKeepAliveThread(void *ptr); -static void TlenProcessStreamOpening(XmlNode *node, ThreadData *info); -static void TlenProcessStreamClosing(XmlNode *node, ThreadData *info); -static void TlenProcessProtocol(XmlNode *node, ThreadData *info); -static void TlenProcessMessage(XmlNode *node, ThreadData *info); -static void TlenProcessIq(XmlNode *node, ThreadData *info); -static void TlenProcessW(XmlNode *node, ThreadData *info); -static void TlenProcessM(XmlNode *node, ThreadData *info); -static void TlenProcessN(XmlNode *node, ThreadData *info); -static void TlenProcessP(XmlNode *node, ThreadData *info); -static void TlenProcessV(XmlNode *node, ThreadData *info); -static void TlenProcessAvatar(XmlNode* node, ThreadData *info); -static void TlenProcessCipher(XmlNode *node, ThreadData *info); - -static VOID NTAPI TlenDummyApcFunc(ULONG_PTR) -{ - return; -} - -static char onlinePassword[128]; -static HANDLE hEventPasswdDlg; - -static INT_PTR CALLBACK TlenPasswordDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - char text[128]; - - switch (msg) { - case WM_INITDIALOG: - TranslateDialogDefault(hwndDlg); - mir_snprintf(text, Translate("Enter password for %s"), (char *) lParam); - SetDlgItemTextA(hwndDlg, IDC_JID, text); - return TRUE; - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDOK: - GetDlgItemTextA(hwndDlg, IDC_PASSWORD, onlinePassword, _countof(onlinePassword)); - //EndDialog(hwndDlg, (int) onlinePassword); - //return TRUE; - // Fall through - case IDCANCEL: - //EndDialog(hwndDlg, 0); - SetEvent(hEventPasswdDlg); - DestroyWindow(hwndDlg); - return TRUE; - } - break; - } - - return FALSE; -} - -static VOID NTAPI TlenPasswordCreateDialogApcProc(ULONG_PTR param) -{ - CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_PASSWORD), nullptr, TlenPasswordDlgProc, (LPARAM) param); -} - -void __cdecl TlenServerThread(ThreadData *info) -{ - char *connectHost; - int datalen; - XmlState xmlState; - int tlenNetworkBufferSize; - int oldStatus = ID_STATUS_OFFLINE; - int reconnectMaxTime; - int numRetry; - int reconnectTime; - int loginErr = 0; - info->proto->debugLogA("Thread started"); - - // Normal server connection, we will fetch all connection parameters - // e.g. username, password, etc. from the database. - - if (info->proto->threadData != nullptr) { - // Will not start another connection thread if a thread is already running. - // Make APC call to the main thread. This will immediately wake the thread up - // in case it is asleep in the reconnect loop so that it will immediately - // reconnect. - QueueUserAPC(TlenDummyApcFunc, info->proto->threadData->hThread, 0); - info->proto->debugLogA("Thread ended, another normal thread is running"); - mir_free(info); - return; - } - - info->proto->threadData = info; - - DBVARIANT dbv; - if (!db_get(NULL, info->proto->m_szModuleName, "LoginName", &dbv)) { - strncpy(info->username, dbv.pszVal, sizeof(info->username)); - info->username[sizeof(info->username)-1] = '\0'; - _strlwr(info->username); - db_set_s(NULL, info->proto->m_szModuleName, "LoginName", info->username); - db_free(&dbv); - - } else { - info->proto->debugLogA("Thread ended, login name is not configured"); - loginErr = LOGINERR_BADUSERID; - } - - if (loginErr == 0) { - if (!db_get(NULL, info->proto->m_szModuleName, "LoginServer", &dbv)) { - strncpy(info->server, dbv.pszVal, sizeof(info->server)); - info->server[sizeof(info->server)-1] = '\0'; - _strlwr(info->server); - db_set_s(NULL, info->proto->m_szModuleName, "LoginServer", info->server); - db_free(&dbv); - } else { - info->proto->debugLogA("Thread ended, login server is not configured"); - loginErr = LOGINERR_NONETWORK; - } - } - - char jidStr[128]; - if (loginErr == 0) { - if (!info->proto->tlenOptions.savePassword) { - // Ugly hack: continue logging on only the return value is &(onlinePassword[0]) - // because if WM_QUIT while dialog box is still visible, p is returned with some - // exit code which may not be NULL. - // Should be better with modeless. - onlinePassword[0] = (char) -1; - hEventPasswdDlg = CreateEvent(nullptr, FALSE, FALSE, nullptr); - QueueUserAPC(TlenPasswordCreateDialogApcProc, hMainThread, (UINT_PTR)jidStr); - WaitForSingleObject(hEventPasswdDlg, INFINITE); - CloseHandle(hEventPasswdDlg); - - if (onlinePassword[0] != (char) -1) { - strncpy(info->password, onlinePassword, sizeof(info->password)); - info->password[sizeof(info->password)-1] = '\0'; - } - else { - info->proto->debugLogA("Thread ended, password request dialog was canceled"); - loginErr = LOGINERR_BADUSERID; - } - } - else { - if (!db_get(NULL, info->proto->m_szModuleName, "Password", &dbv)) { - strncpy(info->password, dbv.pszVal, sizeof(info->password)); - info->password[sizeof(info->password)-1] = '\0'; - db_free(&dbv); - } - else { - info->proto->debugLogA("Thread ended, password is not configured"); - loginErr = LOGINERR_BADUSERID; - } - } - } - - tlenNetworkBufferSize = 2048; - char *buffer = (char *) mir_alloc(tlenNetworkBufferSize+1); // +1 is for '\0' when debug logging this buffer - if (buffer == nullptr) { - info->proto->debugLogA("Thread ended, network buffer cannot be allocated"); - loginErr = LOGINERR_NONETWORK; - } - - if (loginErr != 0) { - info->proto->threadData = nullptr; - oldStatus = info->proto->m_iStatus; - info->proto->m_iStatus = ID_STATUS_OFFLINE; - ProtoBroadcastAck(info->proto->m_szModuleName, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE) oldStatus, info->proto->m_iStatus); - ProtoBroadcastAck(info->proto->m_szModuleName, NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, nullptr, loginErr); - mir_free(info); - mir_free(buffer); - return; - } - - mir_snprintf(jidStr, "%s@%s", info->username, info->server); - db_set_s(NULL, info->proto->m_szModuleName, "jid", jidStr); - - if (!db_get(NULL, info->proto->m_szModuleName, "ManualHost", &dbv)) { - strncpy(info->manualHost, dbv.pszVal, sizeof(info->manualHost)); - info->manualHost[sizeof(info->manualHost)-1] = '\0'; - db_free(&dbv); - } - info->port = db_get_w(NULL, info->proto->m_szModuleName, "ManualPort", TLEN_DEFAULT_PORT); - info->useEncryption = info->proto->tlenOptions.useEncryption; - - if (info->manualHost[0]) - connectHost = info->manualHost; - else - connectHost = info->server; - - info->proto->debugLogA("Thread server='%s' port='%d'", connectHost, info->port); - - - if (!db_get(NULL, info->proto->m_szModuleName, "AvatarHash", &dbv)) { - strncpy(info->proto->threadData->avatarHash, dbv.pszVal, sizeof(info->proto->threadData->avatarHash)-1); - db_free(&dbv); - } - info->avatarFormat = db_get_dw(NULL, info->proto->m_szModuleName, "AvatarFormat", PA_FORMAT_UNKNOWN); - - - reconnectMaxTime = 10; - numRetry = 0; - - for (;;) { // Reconnect loop - - info->s = TlenWsConnect(info->proto, connectHost, info->port); - if (info->s == nullptr) { - info->proto->debugLogA("Connection failed (%d)", WSAGetLastError()); - if (info->proto->threadData == info) { - oldStatus = info->proto->m_iStatus; - info->proto->m_iStatus = ID_STATUS_OFFLINE; - ProtoBroadcastAck(info->proto->m_szModuleName, NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, nullptr, LOGINERR_NONETWORK); - ProtoBroadcastAck(info->proto->m_szModuleName, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE) oldStatus, info->proto->m_iStatus); - if (info->proto->tlenOptions.reconnect == TRUE) { - reconnectTime = rand() % reconnectMaxTime; - info->proto->debugLogA("Sleeping %d seconds before automatic reconnecting...", reconnectTime); - SleepEx(reconnectTime * 1000, TRUE); - if (reconnectMaxTime < 10*60) // Maximum is 10 minutes - reconnectMaxTime *= 2; - if (info->proto->threadData == info) { // Make sure this is still the active thread for the main Tlen connection - info->proto->debugLogA("Reconnecting to the network..."); - if (numRetry < MAX_CONNECT_RETRIES) - numRetry++; - oldStatus = info->proto->m_iStatus; - info->proto->m_iStatus = ID_STATUS_CONNECTING + numRetry; - ProtoBroadcastAck(info->proto->m_szModuleName, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE) oldStatus, info->proto->m_iStatus); - continue; - } - else { - info->proto->debugLogA("Thread ended, connection failed"); - mir_free(buffer); - mir_free(info); - return; - } - } - info->proto->threadData = nullptr; - } - info->proto->debugLogA("Thread ended, connection failed"); - mir_free(buffer); - mir_free(info); - return; - } - - // User may change status to OFFLINE while we are connecting above - if (info->proto->m_iDesiredStatus != ID_STATUS_OFFLINE) { - - info->proto->isConnected = TRUE; - mir_forkthread(TlenKeepAliveThread, info->proto); - - TlenXmlInitState(&xmlState); - TlenXmlSetCallback(&xmlState, 1, ELEM_OPEN, (void (__cdecl *)(XmlNode *,void *))TlenProcessStreamOpening, info); - TlenXmlSetCallback(&xmlState, 1, ELEM_CLOSE, (void (__cdecl *)(XmlNode *,void *))TlenProcessStreamClosing, info); - TlenXmlSetCallback(&xmlState, 2, ELEM_CLOSE, (void (__cdecl *)(XmlNode *,void *))TlenProcessProtocol, info); - - info->useAES = FALSE; - - if (info->useEncryption) { - TlenSend(info->proto, ""); - - } else { - TlenSend(info->proto, ""); - } - - info->proto->debugLogA("Entering main recv loop"); - datalen = 0; - - for (;;) { - int recvResult, bytesParsed; - - if (info->useAES) { - recvResult = TlenWsRecvAES(info->proto, buffer+datalen, tlenNetworkBufferSize-datalen, &info->aes_in_context, info->aes_in_iv); - } else { - recvResult = TlenWsRecv(info->proto, info->s, buffer+datalen, tlenNetworkBufferSize-datalen); - } - - if (recvResult <= 0) - break; - datalen += recvResult; - - buffer[datalen] = '\0'; - info->proto->debugLogA("RECV:%s", buffer); - - bytesParsed = TlenXmlParse(&xmlState, buffer, datalen); - info->proto->debugLogA("bytesParsed = %d", bytesParsed); - if (bytesParsed > 0) { - if (bytesParsed < datalen) - memmove(buffer, buffer+bytesParsed, datalen-bytesParsed); - datalen -= bytesParsed; - } - else if (datalen == tlenNetworkBufferSize) { - tlenNetworkBufferSize += 2048; - info->proto->debugLogA("Increasing network buffer size to %d", tlenNetworkBufferSize); - if ((buffer=(char *) mir_realloc(buffer, tlenNetworkBufferSize+1)) == nullptr) { - info->proto->debugLogA("Cannot reallocate more network buffer, go offline now"); - break; - } - } - else { - info->proto->debugLogA("Unknown state: bytesParsed=%d, datalen=%d, tlenNetworkBufferSize=%d", bytesParsed, datalen, tlenNetworkBufferSize); - } - } - - TlenXmlDestroyState(&xmlState); - - info->proto->isOnline = FALSE; - info->proto->isConnected = FALSE; - - Menu_EnableItem(info->proto->hMenuMUC, false); - if (info->proto->hMenuChats != nullptr) - Menu_EnableItem(info->proto->hMenuChats, false); - - // Set status to offline - char *szProto = info->proto->m_szModuleName; - oldStatus = info->proto->m_iStatus; - info->proto->m_iStatus = ID_STATUS_OFFLINE; - ProtoBroadcastAck(szProto, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE) oldStatus, info->proto->m_iStatus); - - // Set all contacts to offline - for (MCONTACT hContact = db_find_first(szProto); hContact; hContact = db_find_next(hContact, szProto)) - if (db_get_w(hContact, szProto, "Status", ID_STATUS_OFFLINE) != ID_STATUS_OFFLINE) - db_set_w(hContact, szProto, "Status", ID_STATUS_OFFLINE); - - TlenListWipeSpecial(info->proto); - } - else { - oldStatus = info->proto->m_iStatus; - info->proto->m_iStatus = ID_STATUS_OFFLINE; - ProtoBroadcastAck(info->proto->m_szModuleName, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE) oldStatus, info->proto->m_iStatus); - } - - Netlib_CloseHandle(info->s); - - if (info->proto->tlenOptions.reconnect == FALSE) - break; - - if (info->proto->threadData != info) // Make sure this is still the main Tlen connection thread - break; - reconnectTime = rand() % 10; - info->proto->debugLogA("Sleeping %d seconds before automatic reconnecting...", reconnectTime); - SleepEx(reconnectTime * 1000, TRUE); - reconnectMaxTime = 20; - if (info->proto->threadData != info) // Make sure this is still the main Tlen connection thread - break; - info->proto->debugLogA("Reconnecting to the network..."); - info->proto->m_iDesiredStatus = oldStatus; // Reconnect to my last status - oldStatus = info->proto->m_iStatus; - info->proto->m_iStatus = ID_STATUS_CONNECTING; - numRetry = 1; - ProtoBroadcastAck(info->proto->m_szModuleName, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE) oldStatus, info->proto->m_iStatus); - } - - info->proto->debugLogA("Thread ended: server='%s'", info->server); - - if (info->proto->threadData == info) { - info->proto->threadData = nullptr; - } - - mir_free(buffer); - if (info->streamId) mir_free(info->streamId); - info->proto->debugLogA("Exiting ServerThread"); - mir_free(info); -} - -static void TlenSendAuth(TlenProtocol *proto) { - int iqId; - char text[128]; - char *str = TlenPasswordHash(proto->threadData->password); - mir_snprintf(text, "%s%s", proto->threadData->streamId, str); - mir_free(str); - str = TlenSha1(text); - char *p=TlenTextEncode(proto->threadData->username); - if (p != nullptr) { - iqId = TlenSerialNext(proto->threadData->proto); - TlenIqAdd(proto, iqId, IQ_PROC_NONE, TlenIqResultAuth); - TlenSend(proto, "%s%sttlen.pl", iqId, p /*info->username*/, str); - mir_free(p); - } - mir_free(str); -} - -/* processing tag sent from server on session opening */ -static void TlenProcessStreamOpening(XmlNode *node, ThreadData *info) -{ - if (node->name == nullptr || mir_strcmp(node->name, "s")) - return; - - char *sid=TlenXmlGetAttrValue(node, "i"); - if (sid != nullptr) { - if (info->streamId) mir_free(info->streamId); - info->streamId = mir_strdup(sid); - } - char *s=TlenXmlGetAttrValue(node, "s"); - if (s != nullptr && !mir_strcmp(s, "1")) { - int i; - unsigned char aes_key[32]; - char aes_key_str[140], aes_iv_str[40]; - mpi k1_mpi, k2_mpi, aes_mpi; - size_t slen; - - char *k1=TlenXmlGetAttrValue(node, "k1"); - char *k2=TlenXmlGetAttrValue(node, "k2"); - char *k3=TlenXmlGetAttrValue(node, "k3"); - - memset(&info->aes_in_context, 0, sizeof (aes_context)); - memset(&info->aes_out_context, 0, sizeof (aes_context)); - memset(&aes_mpi, 0, sizeof (mpi)); - mpi_read_string(&aes_mpi, 16, k3); - mpi_write_binary(&aes_mpi, info->aes_in_iv, 16); - for (i = 0; i < 16; i++) { - info->aes_out_iv[i] = rand(); - aes_key[i] = rand(); - } - memset(&aes_mpi, 0, sizeof (mpi)); - mpi_read_binary(&aes_mpi, info->aes_out_iv, 16); - slen = 40; - mpi_write_string(&aes_mpi, 16, aes_iv_str, &slen); - aes_setkey_dec(&info->aes_in_context, aes_key, 128); - aes_setkey_enc(&info->aes_out_context, aes_key, 128); - memset(&aes_mpi, 0, sizeof (mpi)); - mpi_read_binary(&aes_mpi, aes_key, 16); - memset(&k1_mpi, 0, sizeof (mpi)); - mpi_read_string( &k1_mpi, 16, k1 ); - memset(&k2_mpi, 0, sizeof (mpi)); - mpi_read_string( &k2_mpi, 16, k2 ); - memset(&aes_mpi, 0, sizeof (mpi)); - mpi_read_binary(&aes_mpi, (unsigned char *)aes_key, 16); - mpi_exp_mod( &aes_mpi, &aes_mpi, &k1_mpi, &k2_mpi, nullptr ); - slen = 140; - mpi_write_string(&aes_mpi, 16, aes_key_str, &slen); - TlenSend(info->proto, "", aes_key_str, aes_iv_str); - } else { - TlenSendAuth(info->proto); - } -} - -/* processing tag sent from server on session close */ -static void TlenProcessStreamClosing(XmlNode *node, ThreadData *info) -{ - Netlib_CloseHandle(info->proto); - if (node->name && !mir_strcmp(node->name, "stream:error") && node->text){ - char buffer[1024]; - mir_snprintf(buffer, "%s\n%s", Translate("Tlen Connection Error"), Translate(node->text)); - PUShowMessage(buffer, SM_WARNING); - } else if (!mir_strcmp(node->name, "s")){ - info->proto->debugLogA("Disconnected server message"); - } -} - -/* processing session tags sent from server */ -static void TlenProcessProtocol(XmlNode *node, ThreadData *info) -{ - if (!mir_strcmp(node->name, "message")) - TlenProcessMessage(node, info); - else if (!mir_strcmp(node->name, "presence")) - TlenProcessPresence(node, info->proto); - else if (!mir_strcmp(node->name, "iq")) - TlenProcessIq(node, info); - else if (!mir_strcmp(node->name, "f")) - TlenProcessF(node, info); - else if (!mir_strcmp(node->name, "w")) - TlenProcessW(node, info); - else if (!mir_strcmp(node->name, "m")) - TlenProcessM(node, info); - else if (!mir_strcmp(node->name, "n")) - TlenProcessN(node, info); - else if (!mir_strcmp(node->name, "p")) - TlenProcessP(node, info); - else if (!mir_strcmp(node->name, "v")) - TlenProcessV(node, info); - else if (!mir_strcmp(node->name, "avatar")) - TlenProcessAvatar(node, info); - else if (!mir_strcmp(node->name, "cipher")) - TlenProcessCipher(node, info); - else - info->proto->debugLogA("Invalid top-level tag (only

and allowed)"); - -} - -static void TlenProcessCipher(XmlNode*, ThreadData *info) -{ - info->useAES = TRUE; - TlenSend(info->proto, ""); - TlenSendAuth(info->proto); -} - -static void TlenProcessIqGetVersion(TlenProtocol *proto, XmlNode *node) -{ - OSVERSIONINFO osvi = { 0 }; - char mversion[256]; - char *mver; - char* os = nullptr; - - if (proto->m_iStatus == ID_STATUS_INVISIBLE) return; - if (!proto->tlenOptions.enableVersion) return; - char *from = TlenXmlGetAttrValue(node, "from"); - if (from == nullptr) - return; - - TLEN_LIST_ITEM *item = TlenListGetItemPtr(proto, LIST_ROSTER, from); - if (item == nullptr) - return; - - char *version = TlenTextEncode(TLEN_VERSION_STRING); - osvi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO ); - if ( GetVersionEx( &osvi )) { - switch ( osvi.dwPlatformId ) { - case VER_PLATFORM_WIN32_NT: - if ( osvi.dwMajorVersion == 5 ) { - if ( osvi.dwMinorVersion == 2 ) os = TlenTextEncode("Windows Server 2003"); - else if ( osvi.dwMinorVersion == 1 ) os = TlenTextEncode("Windows XP"); - else if ( osvi.dwMinorVersion == 0 ) os = TlenTextEncode("Windows 2000"); - } - else if ( osvi.dwMajorVersion <= 4 ) { - os = TlenTextEncode("Windows NT"); - } - break; - case VER_PLATFORM_WIN32_WINDOWS: - if ( osvi.dwMajorVersion == 4 ) { - if ( osvi.dwMinorVersion == 0 ) os = TlenTextEncode("Windows 95"); - if ( osvi.dwMinorVersion == 10 ) os = TlenTextEncode("Windows 98"); - if ( osvi.dwMinorVersion == 90 ) os = TlenTextEncode("Windows ME"); - } - break; - } } - - if ( os == nullptr ) os = TlenTextEncode("Windows"); - - mir_strcpy(mversion, "Miranda NG "); - Miranda_GetVersionText(mversion + 11, sizeof(mversion) - 11); - mir_strcat(mversion, " (Tlen v."); - mir_strcat(mversion, TLEN_VERSION_STRING); - mir_strcat(mversion, ")"); - mver = TlenTextEncode( mversion ); - TlenSend( proto, "%s%s%s", from, mver?mver:"", version?version:"", os?os:"" ); - if (!item->versionRequested) { - item->versionRequested = TRUE; - TlenSend(proto, "", from); - } - - if ( mver ) mir_free( mver ); - if ( version ) mir_free( version ); - if ( os ) mir_free( os ); -} - -// Support for Tlen avatars - avatar token used to access web interface -static void TlenProcessAvatar(XmlNode* node, ThreadData *info) -{ - XmlNode *tokenNode = TlenXmlGetChild(node, "token"); - XmlNode *aNode = TlenXmlGetChild(node, "a"); - if (tokenNode != nullptr) { - char *token = tokenNode->text; - strncpy(info->avatarToken, token, sizeof(info->avatarToken)-1); - } - if (aNode != nullptr) { - if (TlenProcessAvatarNode(info->proto, node, nullptr)) { - } - } -} - -static void TlenProcessMessage(XmlNode *node, ThreadData *info) -{ - MCONTACT hContact; - XmlNode *bodyNode, *subjectNode, *xNode, *n; - char *nick, *p, *localMessage, *idStr; - DWORD msgTime; - BOOL delivered, composing; - int i; - - if (!node->name || mir_strcmp(node->name, "message")) return; - - char *type=TlenXmlGetAttrValue(node, "type"); - if (type != nullptr && !mir_strcmp(type, "error")) { - } - else { - char *from=TlenXmlGetAttrValue(node, "from"); - if (from != nullptr) { - if (info->proto->tlenOptions.ignoreAdvertisements && strstr(from, "b73@tlen.pl") == from) { - return; - } - char *fromJid = TlenLoginFromJID(from); - // If message is from a stranger (not in roster), item is NULL - TLEN_LIST_ITEM *item = TlenListGetItemPtr(info->proto, LIST_ROSTER, fromJid); - BOOL isChatRoomJid = TlenListExist(info->proto, LIST_CHATROOM, from); - - if (isChatRoomJid && type != nullptr && !mir_strcmp(type, "groupchat")) { - //TlenGroupchatProcessMessage(node, userdata); - } else if (type != nullptr && !mir_strcmp(type, "pic")) { - TlenProcessPic(node, info->proto); - } else if (type != nullptr && !mir_strcmp(type, "iq")) { - XmlNode *iqNode; - // Tlen-compatible iq - if ((iqNode=TlenXmlGetChild(node, "iq")) != nullptr) { - TlenXmlAddAttr(iqNode, "from", from); - TlenProcessIq(iqNode, info); - } - } else { - if ((bodyNode=TlenXmlGetChild(node, "body")) != nullptr) { - if (bodyNode->text != nullptr) { - if ((subjectNode=TlenXmlGetChild(node, "subject")) != nullptr && subjectNode->text != nullptr && subjectNode->text[0] != '\0') { - size_t size = mir_strlen(subjectNode->text)+mir_strlen(bodyNode->text)+5; - p = (char *)mir_alloc(size); - mir_snprintf(p, size, "%s\r\n%s", subjectNode->text, bodyNode->text); - localMessage = TlenTextDecode(p); - mir_free(p); - } else { - localMessage = TlenTextDecode(bodyNode->text); - } - - msgTime = 0; - delivered = composing = FALSE; - i = 1; - while ((xNode=TlenXmlGetNthChild(node, "x", i)) != nullptr) { - if ((p=TlenXmlGetAttrValue(xNode, "xmlns")) != nullptr) { - if (!mir_strcmp(p, "jabber:x:delay") && msgTime==0) { - if ((p=TlenXmlGetAttrValue(xNode, "stamp")) != nullptr) { - msgTime = TlenIsoToUnixTime(p); - } - } - else if (!mir_strcmp(p, "jabber:x:event")) { - // Check whether any event is requested - if (!delivered && (n=TlenXmlGetChild(xNode, "delivered")) != nullptr) { - delivered = TRUE; - idStr = TlenXmlGetAttrValue(node, "id"); - TlenSend(info->proto, "%s", from, (idStr != nullptr)?idStr:""); - } - if (item != nullptr && TlenXmlGetChild(xNode, "composing") != nullptr) { - composing = TRUE; - if (item->messageEventIdStr) - mir_free(item->messageEventIdStr); - idStr = TlenXmlGetAttrValue(node, "id"); - item->messageEventIdStr = (idStr == nullptr)?nullptr:mir_strdup(idStr); - } - } - } - i++; - } - - if (item != nullptr) { - item->wantComposingEvent = composing; - if (item->isTyping) { - item->isTyping = FALSE; - if ((hContact=TlenHContactFromJID(info->proto, fromJid)) != NULL) - CallService(MS_PROTO_CONTACTISTYPING, hContact, PROTOTYPE_CONTACTTYPING_OFF); - } - } - - if ((hContact=TlenHContactFromJID(info->proto, fromJid)) == NULL) { - // Create a temporary contact - if (isChatRoomJid) { - if ((p=strchr(from, '/')) != nullptr && p[1]!='\0') - p++; - else - p = from; - nick = TlenTextEncode(p); - hContact = TlenDBCreateContact(info->proto, from, nick, TRUE); - } - else { - nick = TlenLocalNickFromJID(from); - hContact = TlenDBCreateContact(info->proto, from, nick, TRUE); - } - mir_free(nick); - } - - if (msgTime == 0) { - msgTime = time(nullptr); - } else { - MEVENT hDbEvent = db_event_last(hContact); - if (hDbEvent != NULL) { - DBEVENTINFO dbei = {}; - db_event_get( hDbEvent, &dbei); - if (msgTime < dbei.timestamp) { - msgTime = dbei.timestamp + 1; - } - } - if (msgTime > (DWORD)time(nullptr)) { - msgTime = time(nullptr); - } - } - char* localMessage_Utf8 = mir_utf8encode(localMessage); - - PROTORECVEVENT recv = { 0 }; - recv.timestamp = (DWORD) msgTime; - recv.szMessage = localMessage_Utf8; - recv.lParam = 0; - ProtoChainRecvMsg(hContact, &recv); - - mir_free(localMessage_Utf8); - mir_free(localMessage); - } - } - } - mir_free(fromJid); - } - } -} - -static void TlenProcessIq(XmlNode *node, ThreadData *info) -{ - MCONTACT hContact; - XmlNode *queryNode = nullptr; - char *jid, *nick; - char *xmlns = nullptr; - char *idStr, *str; - int id; - int i; - - if (!node->name || mir_strcmp(node->name, "iq")) return; - char *type=TlenXmlGetAttrValue(node, "type"); -// if ((type=TlenXmlGetAttrValue(node, "type")) == NULL) return; - - id = -1; - if ((idStr=TlenXmlGetAttrValue(node, "id")) != nullptr) { - if (!strncmp(idStr, TLEN_IQID, mir_strlen(TLEN_IQID))) - id = atoi(idStr+mir_strlen(TLEN_IQID)); - } - - queryNode = TlenXmlGetChild(node, "query"); - if (queryNode != nullptr) { - xmlns = TlenXmlGetAttrValue(queryNode, "xmlns"); - } - - - ///////////////////////////////////////////////////////////////////////// - // MATCH BY ID - ///////////////////////////////////////////////////////////////////////// - TLEN_IQ_PFUNC pfunc=TlenIqFetchFunc(info->proto, id); - if (pfunc != nullptr) { - info->proto->debugLogA("Handling iq request for id=%d", id); - pfunc(info->proto, node); - ///////////////////////////////////////////////////////////////////////// - // MORE GENERAL ROUTINES, WHEN ID DOES NOT MATCH - ///////////////////////////////////////////////////////////////////////// - // new p2p connections - } else if (xmlns != nullptr && !mir_strcmp(xmlns, "p2p")) { - if (info->proto->tlenOptions.useNewP2P) { - TlenProcessP2P(node, info); - } - } - // RECVED: proto->debugLogA(" Got roster push, query has %d children", queryNode->numChild); - for (i=0; inumChild; i++) { - itemNode = queryNode->child[i]; - if (!mir_strcmp(itemNode->name, "item")) { - if ((jid=TlenXmlGetAttrValue(itemNode, "jid")) != nullptr) { - if ((str=TlenXmlGetAttrValue(itemNode, "subscription")) != nullptr) { - // we will not add new account when subscription=remove - if (!mir_strcmp(str, "to") || !mir_strcmp(str, "both") || !mir_strcmp(str, "from") || !mir_strcmp(str, "none")) { - if ((name=TlenXmlGetAttrValue(itemNode, "name")) != nullptr) { - nick = TlenTextDecode(name); - } else { - nick = TlenLocalNickFromJID(jid); - } - if (nick != nullptr) { - if ((item=TlenListAdd(info->proto, LIST_ROSTER, jid)) != nullptr) { - if (item->nick) mir_free(item->nick); - item->nick = nick; - if ((hContact=TlenHContactFromJID(info->proto, jid)) == NULL) { - // Received roster has a new JID. - // Add the jid (with empty resource) to Miranda contact list. - hContact = TlenDBCreateContact(info->proto, jid, nick, FALSE); - } - db_set_s(hContact, "CList", "MyHandle", nick); - if (item->group) mir_free(item->group); - if ((groupNode=TlenXmlGetChild(itemNode, "group")) != nullptr && groupNode->text != nullptr) { - item->group = TlenGroupDecode(groupNode->text); - Clist_GroupCreate(0, _A2T(item->group)); - db_set_s(hContact, "CList", "Group", item->group); - } - else { - item->group = nullptr; - db_unset(hContact, "CList", "Group"); - } - if (!mir_strcmp(str, "none") || (!mir_strcmp(str, "from") && strchr(jid, '@') != nullptr)) { - if (db_get_w(hContact, info->proto->m_szModuleName, "Status", ID_STATUS_OFFLINE) != ID_STATUS_OFFLINE) - db_set_w(hContact, info->proto->m_szModuleName, "Status", ID_STATUS_OFFLINE); - } - } - else { - mir_free(nick); - } - } - } - if ((item=TlenListGetItemPtr(info->proto, LIST_ROSTER, jid)) != nullptr) { - if (!mir_strcmp(str, "both")) - item->subscription = SUB_BOTH; - else if (!mir_strcmp(str, "to")) - item->subscription = SUB_TO; - else if (!mir_strcmp(str, "from")) - item->subscription = SUB_FROM; - else - item->subscription = SUB_NONE; - info->proto->debugLogA("Roster push for jid=%s, set subscription to %s", jid, str); - // subscription = remove is to remove from roster list - // but we will just set the contact to offline and not actually - // remove, so that history will be retained. - if (!mir_strcmp(str, "remove")) { - if ((hContact=TlenHContactFromJID(info->proto, jid)) != NULL) { - if (db_get_w(hContact, info->proto->m_szModuleName, "Status", ID_STATUS_OFFLINE) != ID_STATUS_OFFLINE) - db_set_w(hContact, info->proto->m_szModuleName, "Status", ID_STATUS_OFFLINE); - TlenListRemove(info->proto, LIST_ROSTER, jid); - } - } - } - } - } - } - } - } - - } - // RECVED: proto, node); - } - // RECVED: proto, node); - } else if ( !mir_strcmp( xmlns, "jabber:iq:version" )) { - TlenIqResultVersion(info->proto, node); - } else if ( !mir_strcmp( xmlns, "jabber:iq:info" )) { - TlenIqResultInfo(info->proto, node); - } - } else { - char *from; - if (( from=TlenXmlGetAttrValue( node, "from" )) != nullptr ) { - if ( !mir_strcmp(from, "tcfg" )) { - TlenIqResultTcfg(info->proto, node); - } - } - } - } - // RECVED: ... - else if (!mir_strcmp(type, "error")) { - TLEN_LIST_ITEM *item; - // Check for file transfer deny by comparing idStr with ft->iqId - i = 0; - while ((i=TlenListFindNext(info->proto, LIST_FILE, i)) >= 0) { - item = TlenListGetItemPtrFromIndex(info->proto,i); - if (item->ft->state==FT_CONNECTING && !mir_strcmp(idStr, item->ft->iqId)) { - item->ft->state = FT_DENIED; - if (item->ft->hFileEvent != nullptr) - SetEvent(item->ft->hFileEvent); // Simulate the termination of file server connection - } - i++; - } - } -} - -/* - * Web messages - */ -static void TlenProcessW(XmlNode *node, ThreadData *info) -{ - char *e, *s; - char *str, *localMessage; - int strSize; - - if (!node->name || mir_strcmp(node->name, "w")) - return; - - char *body=node->text; - if (body == nullptr) - return; - - char *f = TlenXmlGetAttrValue(node, "f"); - if (f != nullptr) { - char webContactName[128]; - mir_snprintf(webContactName, Translate("%s Web Messages"), info->proto->m_szModuleName); - MCONTACT hContact = TlenHContactFromJID(info->proto, webContactName); - if (hContact == NULL) { - hContact = TlenDBCreateContact(info->proto, webContactName, webContactName, TRUE); - } - - s = TlenXmlGetAttrValue(node, "s"); - e = TlenXmlGetAttrValue(node, "e"); - - str = nullptr; - strSize = 0; - TlenStringAppend(&str, &strSize, "%s\r\n%s: ", Translate("Web message"), Translate("From")); - - if (f != nullptr) - TlenStringAppend(&str, &strSize, "%s", f); - TlenStringAppend(&str, &strSize, "\r\n%s: ", Translate("E-mail")); - if (e != nullptr) - TlenStringAppend(&str, &strSize, "%s", e); - TlenStringAppend(&str, &strSize, "\r\n\r\n%s", body); - - localMessage = TlenTextDecode(str); - char* localMessage_Utf8 = mir_utf8encode(localMessage); - - PROTORECVEVENT recv = { 0 }; - recv.timestamp = (DWORD) time(nullptr); - recv.szMessage = localMessage_Utf8; - ProtoChainRecvMsg(hContact, &recv); - - mir_free(localMessage_Utf8); - mir_free(localMessage); - mir_free(str); - } -} - -/* - * Typing notification, multi-user conference messages and invitations - */ -static void TlenProcessM(XmlNode *node, ThreadData *info) -{ - char *p, *n, *r, *s, *str, *localMessage; - int i; - XmlNode *xNode, *invNode, *bNode; - - if (!node->name || mir_strcmp(node->name, "m")) return; - - char *f = TlenXmlGetAttrValue(node, "f"); //, *from;//username - if (f != nullptr) { - char *fLogin = TlenLoginFromJID(f); - MCONTACT hContact=TlenHContactFromJID(info->proto, fLogin); - if (hContact != NULL) { - char *tp=TlenXmlGetAttrValue(node, "tp");//typing start/stop - if (tp != nullptr) { - TLEN_LIST_ITEM *item = TlenListGetItemPtr(info->proto, LIST_ROSTER, fLogin); - if (!mir_strcmp(tp, "t")) { //contact is writing - if (item != nullptr ) { - item->isTyping = TRUE; - CallService(MS_PROTO_CONTACTISTYPING, hContact, (LPARAM)PROTOTYPE_CONTACTTYPING_INFINITE); - } - } - else if (!mir_strcmp(tp, "u")) {//contact stopped writing - if (item != nullptr) { - item->isTyping = FALSE; - CallService(MS_PROTO_CONTACTISTYPING, hContact, (LPARAM)PROTOTYPE_CONTACTTYPING_OFF); - } - } - else if (!mir_strcmp(tp, "a")) {//alert was received - int bAlert = TRUE; - if (info->proto->tlenOptions.alertPolicy == TLEN_ALERTS_IGNORE_ALL) { - bAlert = FALSE; - } else if (info->proto->tlenOptions.alertPolicy == TLEN_ALERTS_IGNORE_NIR) { - bAlert = IsAuthorized(info->proto, fLogin); - } - if (bAlert) { - if (info->proto->tlenOptions.useNudge) - NotifyEventHooks(info->proto->hTlenNudge, hContact, 0); - else { - if (info->proto->tlenOptions.logAlerts) - TlenLogMessage(info->proto, hContact, 0, Translate("An alert has been received.")); - Skin_PlaySound("TlenAlertNotify"); - } - } - } - } - } - mir_free(fLogin); - if ((p=strchr(f, '@')) != nullptr) { - if ((p=strchr(p, '/')) != nullptr && p[1]!='\0') { // message from user - time_t timestamp; - s = TlenXmlGetAttrValue(node, "s"); - if (s != nullptr) { - timestamp = TlenTimeToUTC(atol(s)); - if (timestamp > time(nullptr)) { - timestamp = time(nullptr); - } - } else { - timestamp = time(nullptr); - } - char *tp=TlenXmlGetAttrValue(node, "tp");//typing start/stop - bNode = TlenXmlGetChild(node, "b"); - f = TlenTextDecode(f); - if (bNode != nullptr && bNode->text != nullptr) { - if (tp != nullptr && !mir_strcmp(tp, "p")) { - /* MUC private message */ - str = TlenResourceFromJID(f); - hContact = TlenDBCreateContact(info->proto, f, str, TRUE); - db_set_b(hContact, info->proto->m_szModuleName, "bChat", TRUE); - mir_free(str); - localMessage = TlenTextDecode(bNode->text); - char* localMessage_Utf8 = mir_utf8encode(localMessage); - - PROTORECVEVENT recv = { 0 }; - recv.timestamp = (DWORD) timestamp; - recv.szMessage = localMessage_Utf8; - ProtoChainRecvMsg(hContact, &recv); - - mir_free(localMessage_Utf8); - mir_free(localMessage); - } - } - mir_free(f); - } - } - i=1; - while ((xNode=TlenXmlGetNthChild(node, "x", i)) != nullptr) { - invNode=TlenXmlGetChild(xNode, "inv"); - if (invNode != nullptr) { - r = TlenTextDecode(f); - f = TlenXmlGetAttrValue(invNode, "f"); - f = TlenTextDecode(f); - n = TlenXmlGetAttrValue(invNode, "n"); - if (n != nullptr && strstr(r, n) != r) { - n = TlenTextDecode(n); - } else { - n = mir_strdup(Translate("Private conference")); - //n = TlenNickFromJID(r); - } - TlenMUCRecvInvitation(info->proto, r, n, f, ""); - mir_free(n); - mir_free(r); - mir_free(f); - break; - } - i++; - } - } -} - -static void TlenMailPopup(TlenProtocol *proto, char *title, char *emailInfo) -{ - if ( !ServiceExists(MS_POPUP_ADDPOPUPT)) - return; - if (!db_get_b(NULL, proto->m_szModuleName, "MailPopupEnabled", TRUE)) - return; - - POPUPDATAT ppd = { 0 }; - ppd.lchIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_MAIL)); - wcsncpy(ppd.lptzContactName, _A2T(title), MAX_CONTACTNAME -1); - wcsncpy(ppd.lptzText, _A2T(emailInfo), MAX_SECONDLINE - 1); - ppd.colorBack = db_get_dw(NULL, proto->m_szModuleName, "MailPopupBack", 0); - ppd.colorText = db_get_dw(NULL, proto->m_szModuleName, "MailPopupText", 0); - BYTE delayMode = db_get_b(NULL, proto->m_szModuleName, "MailPopupDelayMode", 0); - if (delayMode == 1) - ppd.iSeconds = db_get_dw(NULL, proto->m_szModuleName, "MailPopupDelay", 4); - else if (delayMode == 2) - ppd.iSeconds = -1; - PUAddPopupT(&ppd); -} -/* - * Incoming e-mail notification - */ -static void TlenProcessN(XmlNode *node, ThreadData *info) -{ - char *str, *popupTitle, *popupText; - int strSize; - - if (!node->name || mir_strcmp(node->name, "n")) return; - - char *s = TlenXmlGetAttrValue(node, "s"); - char *f = TlenXmlGetAttrValue(node, "f"); - if (s != nullptr && f != nullptr) { - str = nullptr; - strSize = 0; - - TlenStringAppend(&str, &strSize, Translate("%s mail"), info->proto->m_szModuleName); - popupTitle = TlenTextDecode(str); - mir_free(str); - - str = nullptr; - strSize = 0; - - TlenStringAppend(&str, &strSize, "%s: %s\n", Translate("From"), f); - TlenStringAppend(&str, &strSize, "%s: %s", Translate("Subject"), s); - popupText = TlenTextDecode(str); - TlenMailPopup(info->proto, popupTitle, popupText); - Skin_PlaySound("TlenMailNotify"); - - mir_free(popupTitle); - mir_free(popupText); - mir_free(str); - } -} - -/* - * Presence is chat rooms - */ -static void TlenProcessP(XmlNode *node, ThreadData*) -{ - char *f, *a, *k; - XmlNode *sNode, *xNode, *iNode, *kNode; - int status, flags; - - if (!node->name || mir_strcmp(node->name, "p")) return; - -// presence from users in chat room - flags = 0; - status = ID_STATUS_ONLINE; - f = TlenXmlGetAttrValue(node, "f"); - xNode = TlenXmlGetChild(node, "x"); - if (xNode != nullptr) { // x subtag present (message from chat room) - change user rights only - char *temp, *iStr; - iNode = TlenXmlGetChild(xNode, "i"); - if (iNode != nullptr) { - iStr = TlenXmlGetAttrValue(iNode, "i"); - temp = (char*)mir_alloc(mir_strlen(f)+mir_strlen(iStr)+2); - mir_strcpy(temp, f); - mir_strcat(temp, "/"); - mir_strcat(temp, iStr); - f = TlenTextDecode(temp); - mir_free(temp); - node = iNode; - status = 0; - } else { - f = TlenTextDecode(f); - } - } else { - f = TlenTextDecode(f); - } - a = TlenXmlGetAttrValue(node, "z"); - if (a != nullptr) { - if (atoi(a) &1 ) { - flags |= USER_FLAGS_REGISTERED; - } - } - a = TlenXmlGetAttrValue(node, "a"); - if (a != nullptr) { - if (atoi(a) == 2) { - flags |= USER_FLAGS_ADMIN; - } - if (atoi(a) == 1) { - flags |= USER_FLAGS_OWNER; - } - if (atoi(a) == 3) { - //flags |= USER_FLAGS_MEMBER; - } - if (atoi(a) == 5) { - flags |= USER_FLAGS_GLOBALOWNER; - } - } - sNode = TlenXmlGetChild(node, "s"); - if (sNode != nullptr) { - if (!mir_strcmp(sNode->text, "unavailable")) { - status = ID_STATUS_OFFLINE; - } - } - kNode = TlenXmlGetChild(node, "kick"); - k = nullptr; - if (kNode != nullptr) { - k = TlenXmlGetAttrValue(kNode, "r"); - if (k == nullptr) { - k = ""; - } - k = TlenTextDecode(k); - } - if (k != nullptr) { - mir_free(k); - } - mir_free(f); -} -/* - * Voice chat - */ -static void TlenProcessV(XmlNode *node, ThreadData *info) -{ - char jid[128]; - TLEN_LIST_ITEM *item; - char *id, *e, *p; -// if (!node->name || mir_strcmp(node->name, "v")) return; - - char *from=TlenXmlGetAttrValue(node, "f"); - if (from != nullptr) { - if (strchr(from, '@') == nullptr) { - mir_snprintf(jid, "%s@%s", from, info->server); - } else { - strncpy_s(jid, from, _TRUNCATE); - } - if ((e=TlenXmlGetAttrValue(node, "e")) != nullptr) { - if (!mir_strcmp(e, "1")) { - if ((id=TlenXmlGetAttrValue(node, "i")) != nullptr) { - Skin_PlaySound("TlenVoiceNotify"); - TlenVoiceAccept(info->proto, id, from); - } - } else if (!mir_strcmp(e, "3")) { - // FILE_RECV : e='3' : invalid transfer error - if ((p=TlenXmlGetAttrValue(node, "i")) != nullptr) { - if ((item=TlenListGetItemPtr(info->proto, LIST_VOICE, p)) != nullptr) { - if (item->ft != nullptr) { - HANDLE hEvent = item->ft->hFileEvent; - item->ft->hFileEvent = nullptr; - item->ft->state = FT_ERROR; - if (item->ft->s != nullptr) { - Netlib_CloseHandle(item->ft->s); - item->ft->s = nullptr; - if (hEvent != nullptr) { - SetEvent(hEvent); - } - } else { - TlenP2PFreeFileTransfer(item->ft); - } - } else { - TlenListRemove(info->proto, LIST_VOICE, p); - } - } - } - } else if (!mir_strcmp(e, "4")) { - // FILE_SEND : e='4' : File sending request was denied by the remote client - if ((p=TlenXmlGetAttrValue(node, "i")) != nullptr) { - if ((item=TlenListGetItemPtr(info->proto, LIST_VOICE, p)) != nullptr) { - if (!mir_strcmp(item->ft->jid, jid)) { - TlenVoiceCancelAll(info->proto); - //TlenListRemove(info->proto, LIST_VOICE, p); - } - } - } - } else if (!mir_strcmp(e, "5")) { - // FILE_SEND : e='5' : Voice request was accepted - if ((p=TlenXmlGetAttrValue(node, "i")) != nullptr) { - if ((item=TlenListGetItemPtr(info->proto, LIST_VOICE, p)) != nullptr) { - info->proto->debugLogA("should start voice 1 ? %s ?? %s", jid, item->ft->jid); - if (!mir_strcmp(item->ft->jid, jid)) { - info->proto->debugLogA("starting voice 1"); - TlenVoiceStart(item->ft, 1); - } - } - } - } else if (!mir_strcmp(e, "6")) { - // FILE_RECV : e='6' : IP and port information to connect to get file - if ((p=TlenXmlGetAttrValue(node, "i")) != nullptr) { - if ((item=TlenListGetItemPtr(info->proto, LIST_VOICE, p)) != nullptr) { - if ((p=TlenXmlGetAttrValue(node, "a")) != nullptr) { - item->ft->hostName = mir_strdup(p); - if ((p=TlenXmlGetAttrValue(node, "p")) != nullptr) { - item->ft->wPort = atoi(p); - TlenVoiceStart(item->ft, 0); - //forkthread((pThreadFunc)TlenVoiceReceiveThread, 0, item->ft); - } - } - } - } - } - else if (!mir_strcmp(e, "7")) { - // FILE_RECV : e='7' : IP and port information to connect to send file - // in case the conection to the given server was not successful - if ((p=TlenXmlGetAttrValue(node, "i")) != nullptr) { - if ((item=TlenListGetItemPtr(info->proto, LIST_VOICE, p)) != nullptr) { - if ((p=TlenXmlGetAttrValue(node, "a")) != nullptr) { - if (item->ft->hostName != nullptr) mir_free(item->ft->hostName); - item->ft->hostName = mir_strdup(p); - if ((p=TlenXmlGetAttrValue(node, "p")) != nullptr) { - item->ft->wPort = atoi(p); - item->ft->state = FT_SWITCH; - SetEvent(item->ft->hFileEvent); - } - } - } - } - } - else if (!mir_strcmp(e, "8")) { - // FILE_RECV : e='8' : transfer error - if ((p=TlenXmlGetAttrValue(node, "i")) != nullptr) { - if ((item=TlenListGetItemPtr(info->proto, LIST_VOICE, p)) != nullptr) { - item->ft->state = FT_ERROR; - SetEvent(item->ft->hFileEvent); - } - } - } - - } - } -} - -static void __cdecl TlenKeepAliveThread(void *ptr) -{ - TlenProtocol *proto = (TlenProtocol *)ptr; - - NETLIBSELECT nls = {}; - nls.dwTimeout = 60000; // 60000 millisecond (1 minute) - nls.hExceptConns[0] = proto->threadData->s; - for (;;) { - if (Netlib_Select(&nls) != 0) - break; - if (proto->tlenOptions.sendKeepAlive) - TlenSend(proto, " \t "); - } - proto->debugLogA("Exiting KeepAliveThread"); -} - diff --git a/protocols/Tlen/src/tlen_userinfo.cpp b/protocols/Tlen/src/tlen_userinfo.cpp deleted file mode 100644 index 8bf7c070457..00000000000 --- a/protocols/Tlen/src/tlen_userinfo.cpp +++ /dev/null @@ -1,328 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" -#include -#include -#include -#include -#include -#include "tlen_list.h" -#include "resource.h" -#include "tlen_avatar.h" - -TLEN_FIELD_MAP tlenFieldGender[] = { - { 1, L"Male" }, - { 2, L"Female" }, - { 0, nullptr } -}; -TLEN_FIELD_MAP tlenFieldLookfor[] = { - { 1, L"Somebody to talk" }, - { 2, L"Friendship" }, - { 3, L"Flirt/romance" }, - { 4, L"Love" }, - { 5, L"Nothing" }, - { 0, nullptr } -}; -TLEN_FIELD_MAP tlenFieldStatus[] = { - { 1, L"All" }, - { 2, L"Available" }, - { 3, L"Free for chat" }, - { 0, nullptr } -}; -TLEN_FIELD_MAP tlenFieldOccupation[] = { - { 1, L"Student" }, - { 2, L"College student" }, - { 3, L"Farmer" }, - { 4, L"Manager" }, - { 5, L"Specialist" }, - { 6, L"Clerk" }, - { 7, L"Unemployed" }, - { 8, L"Pensioner" }, - { 9, L"Housekeeper" }, - { 10, L"Teacher" }, - { 11, L"Doctor" }, - { 12, L"Other" }, - { 0, nullptr } -}; -TLEN_FIELD_MAP tlenFieldPlan[] = { - { 1, L"I'd like to go downtown" }, - { 2, L"I'd like to go to the cinema" }, - { 3, L"I'd like to take a walk" }, - { 4, L"I'd like to go to the disco" }, - { 5, L"I'd like to go on a blind date" }, - { 6, L"Waiting for suggestion" }, - { 0, nullptr } -}; - -static INT_PTR CALLBACK TlenUserInfoDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); - -static void InitComboBox(HWND hwndCombo, TLEN_FIELD_MAP *fieldMap) -{ - int i, n; - - n = SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM)L""); - SendMessage(hwndCombo, CB_SETITEMDATA, n, 0); - SendMessage(hwndCombo, CB_SETCURSEL, n, 0); - for (i=0;;i++) { - if (fieldMap[i].name == nullptr) - break; - n = SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM) TranslateW(fieldMap[i].name)); - SendMessage(hwndCombo, CB_SETITEMDATA, n, fieldMap[i].id); - } -} - -static void FetchField(HWND hwndDlg, UINT idCtrl, char *fieldName, char **str, int *strSize) -{ - char text[512]; - char *localFieldName, *localText; - - if (hwndDlg == nullptr || fieldName == nullptr || str == nullptr || strSize == nullptr) - return; - GetDlgItemTextA(hwndDlg, idCtrl, text, _countof(text)); - if (text[0]) { - if ((localFieldName=TlenTextEncode(fieldName)) != nullptr) { - if ((localText=TlenTextEncode(text)) != nullptr) { - TlenStringAppend(str, strSize, "<%s>%s", localFieldName, localText, localFieldName); - mir_free(localText); - } - mir_free(localFieldName); - } - } -} - -static void FetchCombo(HWND hwndDlg, UINT idCtrl, char *fieldName, char **str, int *strSize) -{ - if (hwndDlg == nullptr || fieldName == nullptr || str == nullptr || strSize == nullptr) - return; - - int value = (int) SendDlgItemMessage(hwndDlg, idCtrl, CB_GETITEMDATA, SendDlgItemMessage(hwndDlg, idCtrl, CB_GETCURSEL, 0, 0), 0); - if (value > 0) { - if (char *localFieldName = TlenTextEncode(fieldName)) { - TlenStringAppend(str, strSize, "<%s>%d", localFieldName, value, localFieldName); - mir_free(localFieldName); - } - } -} - -int TlenProtocol::UserInfoInit(WPARAM wParam, LPARAM lParam) -{ - if (!Proto_GetAccount(m_szModuleName)) - return 0; - - MCONTACT hContact = (MCONTACT) lParam; - char *szProto = GetContactProto(hContact); - if ((szProto != nullptr && !mir_strcmp(szProto, m_szModuleName)) || !lParam) { - OPTIONSDIALOGPAGE odp = { 0 }; - odp.hInstance = hInst; - odp.flags = ODPF_UNICODE; - odp.pfnDlgProc = TlenUserInfoDlgProc; - odp.position = -2000000000; - odp.pszTemplate = ((HANDLE)lParam != nullptr) ? MAKEINTRESOURCEA(IDD_USER_INFO):MAKEINTRESOURCEA(IDD_USER_VCARD); - odp.szTitle.w = (hContact != NULL) ? LPGENW("Account") : m_tszUserName; - odp.dwInitParam = (LPARAM)this; - UserInfo_AddPage(wParam, &odp); - - } - if (!lParam && isOnline) { - CCSDATA ccs = {0}; - GetInfo(0, (LPARAM) &ccs); - } - return 0; -} - -typedef struct { - TlenProtocol *proto; - MCONTACT hContact; -}TLENUSERINFODLGDATA; - - -static INT_PTR CALLBACK TlenUserInfoDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - TLENUSERINFODLGDATA *data = (TLENUSERINFODLGDATA *) GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - switch (msg) { - case WM_INITDIALOG: - - data = (TLENUSERINFODLGDATA*)mir_alloc(sizeof(TLENUSERINFODLGDATA)); - data->hContact = (MCONTACT) lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)data); - // lParam is hContact - TranslateDialogDefault(hwndDlg); - InitComboBox(GetDlgItem(hwndDlg, IDC_GENDER), tlenFieldGender); - InitComboBox(GetDlgItem(hwndDlg, IDC_OCCUPATION), tlenFieldOccupation); - InitComboBox(GetDlgItem(hwndDlg, IDC_LOOKFOR), tlenFieldLookfor); - - return TRUE; - case WM_TLEN_REFRESH: - { - DBVARIANT dbv; - char *jid; - int i; - TLEN_LIST_ITEM *item; - - SetDlgItemText(hwndDlg, IDC_INFO_JID, L""); - SetDlgItemText(hwndDlg, IDC_SUBSCRIPTION, L""); - SetFocus(GetDlgItem(hwndDlg, IDC_STATIC)); - - if (!db_get_ws(data->hContact, data->proto->m_szModuleName, "FirstName", &dbv)) { - SetDlgItemText(hwndDlg, IDC_FIRSTNAME, dbv.ptszVal); - db_free(&dbv); - } else SetDlgItemText(hwndDlg, IDC_FIRSTNAME, L""); - if (!db_get_ws(data->hContact, data->proto->m_szModuleName, "LastName", &dbv)) { - SetDlgItemText(hwndDlg, IDC_LASTNAME, dbv.ptszVal); - db_free(&dbv); - } else SetDlgItemText(hwndDlg, IDC_LASTNAME, L""); - if (!db_get_ws(data->hContact, data->proto->m_szModuleName, "Nick", &dbv)) { - SetDlgItemText(hwndDlg, IDC_NICKNAME, dbv.ptszVal); - db_free(&dbv); - } else SetDlgItemText(hwndDlg, IDC_NICKNAME, L""); - if (!db_get_ws(data->hContact, data->proto->m_szModuleName, "e-mail", &dbv)) { - SetDlgItemText(hwndDlg, IDC_EMAIL, dbv.ptszVal); - db_free(&dbv); - } else SetDlgItemText(hwndDlg, IDC_EMAIL, L""); - if (!db_get(data->hContact, data->proto->m_szModuleName, "Age", &dbv)) { - SetDlgItemInt(hwndDlg, IDC_AGE, dbv.wVal, FALSE); - db_free(&dbv); - } else SetDlgItemText(hwndDlg, IDC_AGE, L""); - if (!db_get_ws(data->hContact, data->proto->m_szModuleName, "City", &dbv)) { - SetDlgItemText(hwndDlg, IDC_CITY, dbv.ptszVal); - db_free(&dbv); - } else SetDlgItemText(hwndDlg, IDC_CITY, L""); - if (!db_get_ws(data->hContact, data->proto->m_szModuleName, "School", &dbv)) { - SetDlgItemText(hwndDlg, IDC_SCHOOL, dbv.ptszVal); - db_free(&dbv); - } else SetDlgItemText(hwndDlg, IDC_SCHOOL, L""); - switch (db_get_b(data->hContact, data->proto->m_szModuleName, "Gender", '?')) { - case 'M': - SendDlgItemMessage(hwndDlg, IDC_GENDER, CB_SETCURSEL, 1, 0); - SetDlgItemText(hwndDlg, IDC_GENDER_TEXT, TranslateW(tlenFieldGender[0].name)); - break; - case 'F': - SendDlgItemMessage(hwndDlg, IDC_GENDER, CB_SETCURSEL, 2, 0); - SetDlgItemText(hwndDlg, IDC_GENDER_TEXT, TranslateW(tlenFieldGender[1].name)); - break; - default: - SendDlgItemMessage(hwndDlg, IDC_GENDER, CB_SETCURSEL, 0, 0); - SetDlgItemText(hwndDlg, IDC_GENDER_TEXT, L""); - break; - } - i = db_get_w(data->hContact, data->proto->m_szModuleName, "Occupation", 0); - if (i>0 && i<13) { - SetDlgItemText(hwndDlg, IDC_OCCUPATION_TEXT, TranslateW(tlenFieldOccupation[i-1].name)); - SendDlgItemMessage(hwndDlg, IDC_OCCUPATION, CB_SETCURSEL, i, 0); - } else { - SetDlgItemText(hwndDlg, IDC_OCCUPATION_TEXT, L""); - SendDlgItemMessage(hwndDlg, IDC_OCCUPATION, CB_SETCURSEL, 0, 0); - } - i = db_get_w(data->hContact, data->proto->m_szModuleName, "LookingFor", 0); - if (i>0 && i<6) { - SetDlgItemText(hwndDlg, IDC_LOOKFOR_TEXT, TranslateW(tlenFieldLookfor[i-1].name)); - SendDlgItemMessage(hwndDlg, IDC_LOOKFOR, CB_SETCURSEL, i, 0); - } else { - SetDlgItemText(hwndDlg, IDC_LOOKFOR_TEXT, L""); - SendDlgItemMessage(hwndDlg, IDC_LOOKFOR, CB_SETCURSEL, 0, 0); - } - i = db_get_w(data->hContact, data->proto->m_szModuleName, "VoiceChat", 0); - CheckDlgButton(hwndDlg, IDC_VOICECONVERSATIONS, i ? BST_CHECKED : BST_UNCHECKED); - i = db_get_w(data->hContact, data->proto->m_szModuleName, "PublicStatus", 0); - CheckDlgButton(hwndDlg, IDC_PUBLICSTATUS, i ? BST_CHECKED : BST_UNCHECKED); - if (!db_get(data->hContact, data->proto->m_szModuleName, "jid", &dbv)) { - jid = TlenTextDecode(dbv.pszVal); - SetDlgItemTextA(hwndDlg, IDC_INFO_JID, jid); - mir_free(jid); - jid = dbv.pszVal; - if (data->proto->isOnline) { - if ((item=TlenListGetItemPtr(data->proto, LIST_ROSTER, jid)) != nullptr) { - switch (item->subscription) { - case SUB_BOTH: - SetDlgItemText(hwndDlg, IDC_SUBSCRIPTION, TranslateT("both")); - break; - case SUB_TO: - SetDlgItemText(hwndDlg, IDC_SUBSCRIPTION, TranslateT("to")); - break; - case SUB_FROM: - SetDlgItemText(hwndDlg, IDC_SUBSCRIPTION, TranslateT("from")); - break; - default: - SetDlgItemText(hwndDlg, IDC_SUBSCRIPTION, TranslateT("none")); - break; - } - SetDlgItemTextA(hwndDlg, IDC_SOFTWARE, item->software); - SetDlgItemTextA(hwndDlg, IDC_VERSION, item->version); - SetDlgItemTextA(hwndDlg, IDC_SYSTEM, item->system); - } else { - SetDlgItemText(hwndDlg, IDC_SUBSCRIPTION, TranslateT("not on roster")); - } - } - db_free(&dbv); - } - } - break; - case WM_NOTIFY: - switch (((LPNMHDR)lParam)->idFrom) { - case 0: - switch (((LPNMHDR)lParam)->code) { - case PSN_INFOCHANGED: - { - MCONTACT hContact = (MCONTACT) ((LPPSHNOTIFY) lParam)->lParam; - SendMessage(hwndDlg, WM_TLEN_REFRESH, 0, (LPARAM) hContact); - } - break; - case PSN_PARAMCHANGED: - { - data->proto = ( TlenProtocol* )(( LPPSHNOTIFY )lParam )->lParam; - SendMessage(hwndDlg, WM_TLEN_REFRESH, 0, 0); - } - } - break; - } - break; - case WM_COMMAND: - if (LOWORD(wParam) == IDC_SAVE && HIWORD(wParam) == BN_CLICKED) { - char *str = nullptr; - int strSize; - TlenStringAppend(&str, &strSize, "", TlenSerialNext(data->proto)); - FetchField(hwndDlg, IDC_FIRSTNAME, "first", &str, &strSize); - FetchField(hwndDlg, IDC_LASTNAME, "last", &str, &strSize); - FetchField(hwndDlg, IDC_NICKNAME, "nick", &str, &strSize); - FetchField(hwndDlg, IDC_EMAIL, "email", &str, &strSize); - FetchCombo(hwndDlg, IDC_GENDER, "s", &str, &strSize); - FetchField(hwndDlg, IDC_AGE, "b", &str, &strSize); - FetchField(hwndDlg, IDC_CITY, "c", &str, &strSize); - FetchCombo(hwndDlg, IDC_OCCUPATION, "j", &str, &strSize); - FetchField(hwndDlg, IDC_SCHOOL, "e", &str, &strSize); - FetchCombo(hwndDlg, IDC_LOOKFOR, "r", &str, &strSize); - TlenStringAppend(&str, &strSize, "%d", IsDlgButtonChecked(hwndDlg, IDC_VOICECONVERSATIONS) ? 1 : 0); - TlenStringAppend(&str, &strSize, "%d", IsDlgButtonChecked(hwndDlg, IDC_PUBLICSTATUS) ? 1 : 0); - TlenStringAppend(&str, &strSize, ""); - TlenSend(data->proto, "%s", str); - mir_free(str); - data->proto->GetInfo(NULL, 0); - } - break; - case WM_DESTROY: - mir_free(data); - break; - } - return FALSE; -} diff --git a/protocols/Tlen/src/tlen_util.cpp b/protocols/Tlen/src/tlen_util.cpp deleted file mode 100644 index b0efd769ba6..00000000000 --- a/protocols/Tlen/src/tlen_util.cpp +++ /dev/null @@ -1,444 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" -#include "tlen_list.h" -#include -#include - -void TlenSerialInit(TlenProtocol *proto) -{ - proto->serial = 0; -} - -unsigned int TlenSerialNext(TlenProtocol *proto) -{ - unsigned int ret; - - mir_cslock lck(proto->csSerial); - ret = proto->serial; - proto->serial++; - return ret; -} - -// Caution: DO NOT use TlenSend() to send binary (non-string) data - -int TlenSend(TlenProtocol *proto, const char *fmt, ...) -{ - char *str; - int size; - va_list vararg; - int result = 0; - - mir_cslock lck(proto->csSend); - - va_start(vararg, fmt); - size = 512; - str = (char *)mir_alloc(size); - while (mir_vsnprintf(str, size, fmt, vararg) == -1) { - size += 512; - str = (char *)mir_realloc(str, size); - } - va_end(vararg); - - proto->debugLogA("SEND:%s", str); - size = (int)mir_strlen(str); - if (proto->threadData != nullptr) { - if (proto->threadData->useAES) { - result = TlenWsSendAES(proto, str, size, &proto->threadData->aes_out_context, proto->threadData->aes_out_iv); - } - else { - result = TlenWsSend(proto, proto->threadData->s, str, size); - } - } - - mir_free(str); - return result; -} - -char *TlenResourceFromJID(const char *jid2) -{ - char *p; - char *nick; - char* jid = mir_strdup(jid2); - - p = strchr(jid, '/'); - if (p != nullptr && p[1] != '\0') { - p++; - if ((nick = (char *)mir_alloc(1 + mir_strlen(jid) - (p - jid))) != nullptr) { - strncpy(nick, p, mir_strlen(jid) - (p - jid)); - nick[mir_strlen(jid) - (p - jid)] = '\0'; - } - } - else { - nick = mir_strdup(jid); - } - - mir_free(jid); - return nick; -} - -char *TlenNickFromJID(const char *jid2) -{ - char *p; - char *nick; - char* jid = mir_strdup(jid2); - - if ((p = strchr(jid, '@')) == nullptr) - p = strchr(jid, '/'); - if (p != nullptr) { - if ((nick = (char *)mir_alloc((p - jid) + 1)) != nullptr) { - strncpy(nick, jid, p - jid); - nick[p - jid] = '\0'; - } - } - else { - nick = mir_strdup(jid); - } - - mir_free(jid); - return nick; -} - -char *TlenLoginFromJID(const char *jid2) -{ - char *p; - char *nick; - char* jid = mir_strdup(jid2); - - p = strchr(jid, '/'); - if (p != nullptr) { - if ((nick = (char *)mir_alloc((p - jid) + 1)) != nullptr) { - strncpy(nick, jid, p - jid); - nick[p - jid] = '\0'; - } - } - else { - nick = mir_strdup(jid); - } - - mir_free(jid); - return nick; -} - -char *TlenLocalNickFromJID(const char *jid) -{ - char *p; - char *localNick; - - p = TlenNickFromJID(jid); - localNick = TlenTextDecode(p); - mir_free(p); - return localNick; -} - -char *TlenSha1(char *str) -{ - mir_sha1_ctx sha; - DWORD digest[5]; - char* result; - - if (str == nullptr) - return nullptr; - - mir_sha1_init(&sha); - mir_sha1_append(&sha, (BYTE*)str, (int)mir_strlen(str)); - mir_sha1_finish(&sha, (BYTE*)digest); - if ((result = (char *)mir_alloc(41)) == nullptr) - return nullptr; - sprintf(result, "%08x%08x%08x%08x%08x", (int)htonl(digest[0]), (int)htonl(digest[1]), (int)htonl(digest[2]), (int)htonl(digest[3]), (int)htonl(digest[4])); //!!!!!!!!!!! - return result; -} - -char *TlenSha1(char *str, int len) -{ - mir_sha1_ctx sha; - BYTE digest[20]; - char* result; - int i; - - if (str == nullptr) - return nullptr; - - mir_sha1_init(&sha); - mir_sha1_append(&sha, (BYTE*)str, len); - mir_sha1_finish(&sha, digest); - if ((result = (char*)mir_alloc(20)) == nullptr) - return nullptr; - for (i = 0; i < 20; i++) - result[i] = digest[4 * (i >> 2) + (3 - (i & 0x3))]; - return result; -} - -char *TlenPasswordHash(const char *str) -{ - int magic1 = 0x50305735, magic2 = 0x12345671, sum = 7; - char *p, *res; - - if (str == nullptr) return nullptr; - for (p = (char *)str; *p != '\0'; p++) { - if (*p != ' ' && *p != '\t') { - magic1 ^= (((magic1 & 0x3f) + sum) * ((char)*p)) + (magic1 << 8); - magic2 += (magic2 << 8) ^ magic1; - sum += ((char)*p); - } - } - magic1 &= 0x7fffffff; - magic2 &= 0x7fffffff; - res = (char *)mir_alloc(17); - sprintf(res, "%08x%08x", magic1, magic2); //!!!!!!!!!!! - return res; -} - -char *TlenUrlEncode(const char *str) -{ - char *p, *q, *res; - unsigned char c; - - if (str == nullptr) return nullptr; - res = (char *)mir_alloc(3 * mir_strlen(str) + 1); - for (p = (char *)str, q = res; *p != '\0'; p++, q++) { - if (*p == ' ') { - *q = '+'; - } - else if (*p < 0x20 || *p >= 0x7f || strchr("%&+:'<>\"", *p) != nullptr) { - // Convert first from CP1252 to ISO8859-2 - switch ((unsigned char)*p) { - case 0xa5: c = (unsigned char)0xa1; break; - case 0x8c: c = (unsigned char)0xa6; break; - case 0x8f: c = (unsigned char)0xac; break; - case 0xb9: c = (unsigned char)0xb1; break; - case 0x9c: c = (unsigned char)0xb6; break; - case 0x9f: c = (unsigned char)0xbc; break; - default: c = (unsigned char)*p; break; - } - sprintf(q, "%%%02X", c); //!!!!!!!!!!! - q += 2; - } - else { - *q = *p; - } - } - *q = '\0'; - return res; -} - -void TlenUrlDecode(char *str) -{ - char *p, *q; - unsigned int code; - - if (str == nullptr) return; - for (p = q = str; *p != '\0'; p++, q++) { - if (*p == '+') { - *q = ' '; - } - else if (*p == '%' && *(p + 1) != '\0' && isxdigit(*(p + 1)) && *(p + 2) != '\0' && isxdigit(*(p + 2))) { - sscanf(p + 1, "%2x", &code); - *q = (char)code; - // Convert from ISO8859-2 to CP1252 - switch ((unsigned char)*q) { - case 0xa1: *q = (char)0xa5; break; - case 0xa6: *q = (char)0x8c; break; - case 0xac: *q = (char)0x8f; break; - case 0xb1: *q = (char)0xb9; break; - case 0xb6: *q = (char)0x9c; break; - case 0xbc: *q = (char)0x9f; break; - } - p += 2; - } - else { - *q = *p; - } - } - *q = '\0'; -} - -char * TlenGroupDecode(const char *str) -{ - char *p, *q; - if (str == nullptr) return nullptr; - p = q = TlenTextDecode(str); - for (; *p != '\0'; p++) { - if (*p == '/') { - *p = '\\'; - } - } - return q; -} - -char * TlenGroupEncode(const char *str) -{ - char *p, *q; - if (str == nullptr) return nullptr; - p = q = mir_strdup(str); - for (; *p != '\0'; p++) { - if (*p == '\\') { - *p = '/'; - } - } - p = TlenTextEncode(q); - mir_free(q); - return p; -} - -char *TlenTextEncode(const char *str) -{ - char *s1; - - if (str == nullptr) return nullptr; - if ((s1 = TlenUrlEncode(str)) == nullptr) - return nullptr; - return s1; -} - -char *TlenTextDecode(const char *str) -{ - char *s1; - - if (str == nullptr) return nullptr; - s1 = mir_strdup(str); - TlenUrlDecode(s1); - return s1; -} - -/* - * Apply Polish Daylight Saving Time rules to get "DST-unbiased" timestamp - */ - -time_t TlenTimeToUTC(time_t time) { - struct tm *timestamp; - timestamp = gmtime(&time); - if ((timestamp->tm_mon > 2 && timestamp->tm_mon < 9) || - (timestamp->tm_mon == 2 && timestamp->tm_mday - timestamp->tm_wday >= 25) || - (timestamp->tm_mon == 9 && timestamp->tm_mday - timestamp->tm_wday < 25)) { - //time -= 3600; - } - else { - //time += 3600; - } - return time; -} - -time_t TlenIsoToUnixTime(char *stamp) -{ - struct tm timestamp; - char date[9]; - char *p; - int i, y; - time_t t; - - if (stamp == nullptr) return (time_t)0; - - p = stamp; - - // Get the date part - for (i = 0; *p != '\0' && i < 8 && isdigit(*p); p++, i++) - date[i] = *p; - - // Parse year - if (i == 6) { - // 2-digit year (1970-2069) - y = (date[0] - '0') * 10 + (date[1] - '0'); - if (y < 70) y += 100; - } - else if (i == 8) { - // 4-digit year - y = (date[0] - '0') * 1000 + (date[1] - '0') * 100 + (date[2] - '0') * 10 + date[3] - '0'; - y -= 1900; - } - else - return (time_t)0; - timestamp.tm_year = y; - // Parse month - timestamp.tm_mon = (date[i - 4] - '0') * 10 + date[i - 3] - '0' - 1; - // Parse date - timestamp.tm_mday = (date[i - 2] - '0') * 10 + date[i - 1] - '0'; - - // Skip any date/time delimiter - for (; *p != '\0' && !isdigit(*p); p++); - - // Parse time - if (sscanf(p, "%d:%d:%d", &(timestamp.tm_hour), &(timestamp.tm_min), &(timestamp.tm_sec)) != 3) - return (time_t)0; - - timestamp.tm_isdst = 0; // DST is already present in _timezone below - _tzset(); - t = mktime(×tamp); - t -= _timezone; - t = TlenTimeToUTC(t); - - if (t >= 0) - return t; - else - return (time_t)0; -} - -void TlenStringAppend(char **str, int *sizeAlloced, const char *fmt, ...) -{ - va_list vararg; - char *p; - int size, len; - - if (str == nullptr) return; - - if (*str == nullptr || *sizeAlloced <= 0) { - *sizeAlloced = size = 2048; - *str = (char *)mir_alloc(size); - len = 0; - } - else { - len = (int)mir_strlen(*str); - size = *sizeAlloced - (int)mir_strlen(*str); - } - - p = *str + len; - va_start(vararg, fmt); - while (mir_vsnprintf(p, size, fmt, vararg) == -1) { - size += 2048; - (*sizeAlloced) += 2048; - *str = (char *)mir_realloc(*str, *sizeAlloced); - p = *str + len; - } - va_end(vararg); -} - -BOOL IsAuthorized(TlenProtocol *proto, const char *jid) -{ - TLEN_LIST_ITEM *item = TlenListGetItemPtr(proto, LIST_ROSTER, jid); - if (item != nullptr) { - return item->subscription == SUB_BOTH || item->subscription == SUB_FROM; - } - return FALSE; -} - - -void TlenLogMessage(TlenProtocol *proto, MCONTACT hContact, DWORD flags, const char *message) -{ - int size = (int)mir_strlen(message) + 2; - char *localMessage = (char *)mir_alloc(size); - mir_strcpy(localMessage, message); - localMessage[size - 1] = '\0'; - TlenDBAddEvent(proto, hContact, EVENTTYPE_MESSAGE, flags, (PBYTE)message, (DWORD)size); - mir_free(localMessage); -} diff --git a/protocols/Tlen/src/tlen_voice.cpp b/protocols/Tlen/src/tlen_voice.cpp deleted file mode 100644 index a209ea3edd9..00000000000 --- a/protocols/Tlen/src/tlen_voice.cpp +++ /dev/null @@ -1,1109 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" -#include -#include -#include -#include -#include -#include -//#include -#include "resource.h" -#include "tlen_list.h" -#include "tlen_voice.h" -#include "tlen_p2p_old.h" -#include "tlen_file.h" - -static int MODE_FREQUENCY[] = { 0, 0, 8000, 11025, 22050, 44100 }; -static int MODE_FRAME_SIZE[] = { 0, 0, 5, 5, 10, 25 }; -static int FRAMES_AVAILABLE_MAX_LIMIT = 2; -static int VU_METER_HEIGHT = 64; -static int VU_METER_WIDTH = 20; -static int VU_METER_LEVELS = 16; -static HBITMAP vuMeterBitmaps[100]; - -static void TlenVoiceReceiveParse(TLEN_FILE_TRANSFER *ft); -static void TlenVoiceSendParse(TLEN_FILE_TRANSFER *ft); -static void TlenVoiceReceivingConnection(HNETLIBCONN hNewConnection, DWORD dwRemoteIP, void * pExtra); - -static void CALLBACK TlenVoicePlaybackCallback(HWAVEOUT hwo, UINT uMsg, DWORD* dwInstance, DWORD dwParam1, DWORD) -{ - if (uMsg == WOM_DONE) { - TLEN_VOICE_CONTROL *control = (TLEN_VOICE_CONTROL *)dwInstance; - waveOutUnprepareHeader(hwo, (WAVEHDR *)dwParam1, sizeof(WAVEHDR)); - if (control->proto->framesAvailableForPlayback > 0) { - control->proto->framesAvailableForPlayback--; - } - // playbackControl->waveHeaders[playbackControl->waveHeadersPos].dwFlags = WHDR_DONE; - // playbackControl->waveHeaders[playbackControl->waveHeadersPos].lpData = (char *) (playbackControl->waveData + playbackControl->waveHeadersPos * playbackControl->waveFrameSize); - // playbackControl->waveHeaders[playbackControl->waveHeadersPos].dwBufferLength = playbackControl->waveFrameSize * 2; - // waveOutPrepareHeader(playbackControl->hWaveOut, &playbackControl->waveHeaders[playbackControl->waveHeadersPos], sizeof(WAVEHDR)); - // waveOutWrite(playbackControl->hWaveOut, &playbackControl->waveHeaders[playbackControl->waveHeadersPos], sizeof(WAVEHDR)); - - } -} - -static void __cdecl TlenVoiceRecordingThreadProc(void *param) -{ - TLEN_VOICE_CONTROL *control = (TLEN_VOICE_CONTROL *)param; - MSG msg; - HWAVEIN hWaveIn; - WAVEHDR *hWaveHdr; - control->isRunning = 1; - control->stopThread = 0; - while (TRUE) { - GetMessage(&msg, nullptr, 0, 0); - if (msg.message == MM_WIM_DATA) { - // TlenLog("recording thread running...%d", msg.message); - hWaveIn = (HWAVEIN)msg.wParam; - hWaveHdr = (WAVEHDR *)msg.lParam; - waveInUnprepareHeader(hWaveIn, hWaveHdr, sizeof(WAVEHDR)); - if (hWaveHdr->dwBytesRecorded > 0 && !control->bDisable) { - control->recordingData = (short *)hWaveHdr->lpData; - TlenVoiceSendParse(control->ft); - } - if (!control->stopThread) { - waveInPrepareHeader(hWaveIn, &control->waveHeaders[control->waveHeadersPos], sizeof(WAVEHDR)); - waveInAddBuffer(hWaveIn, &control->waveHeaders[control->waveHeadersPos], sizeof(WAVEHDR)); - control->waveHeadersPos = (control->waveHeadersPos + 1) % control->waveHeadersNum; - } - } - else if (msg.message == MM_WIM_CLOSE) { - break; - } - } - control->isRunning = 0; - control->proto->debugLogA("recording thread ended..."); -} - -static int TlenVoicePlaybackStart(TLEN_VOICE_CONTROL *control) -{ - int i; - int iNumDevs, iSelDev; - WAVEOUTCAPS wic; - - WAVEFORMATEX wfm; - memset(&wfm, 0, sizeof(wfm)); - wfm.cbSize = sizeof(WAVEFORMATEX); - wfm.nChannels = 1; - wfm.wBitsPerSample = 16; - wfm.nSamplesPerSec = MODE_FREQUENCY[control->codec]; - wfm.nAvgBytesPerSec = wfm.nSamplesPerSec * wfm.nChannels * wfm.wBitsPerSample / 8; - wfm.nBlockAlign = 2 * wfm.nChannels; - wfm.wFormatTag = WAVE_FORMAT_PCM; - - control->waveMode = 0; - control->waveFrameSize = MODE_FRAME_SIZE[control->codec] * 160 * wfm.nChannels;// * wfm.wBitsPerSample / 8; - control->waveHeadersPos = 0; - control->waveHeadersNum = FRAMES_AVAILABLE_MAX_LIMIT + 2; - - int j = db_get_w(NULL, control->proto->m_szModuleName, "VoiceDeviceOut", 0); - iSelDev = WAVE_MAPPER; - if (j != 0) { - iNumDevs = waveOutGetNumDevs(); - for (i = 0; i < iNumDevs; i++) { - if (!waveOutGetDevCaps(i, &wic, sizeof(WAVEOUTCAPS))) { - if (wic.dwFormats != 0) { - j--; - if (j == 0) { - iSelDev = i; - break; - } - } - } - } - } - if (!waveOutGetDevCaps(iSelDev, &wic, sizeof(WAVEOUTCAPS))) { - control->proto->debugLogA("Playback device ID #%u: %s\r\n", iSelDev, wic.szPname); - } - - MMRESULT mmres = waveOutOpen(&control->hWaveOut, iSelDev, &wfm, (UINT_PTR)&TlenVoicePlaybackCallback, (UINT_PTR)control, CALLBACK_FUNCTION); - if (mmres != MMSYSERR_NOERROR) { - control->proto->debugLogA("TlenVoiceStart FAILED!"); - return 1; - } - control->waveData = (short *)mir_alloc(control->waveHeadersNum * control->waveFrameSize * 2); - memset(control->waveData, 0, control->waveHeadersNum * control->waveFrameSize * 2); - control->waveHeaders = (WAVEHDR *)mir_alloc(control->waveHeadersNum * sizeof(WAVEHDR)); - control->proto->debugLogA("TlenVoiceStart OK!"); - return 0; -} - - -static int TlenVoiceRecordingStart(TLEN_VOICE_CONTROL *control) -{ - WAVEFORMATEX wfm; - int i, j; - int iNumDevs, iSelDev; - WAVEINCAPS wic; - - memset(&wfm, 0, sizeof(wfm)); - wfm.cbSize = sizeof(WAVEFORMATEX); - wfm.nChannels = 1; - wfm.wBitsPerSample = 16; - wfm.nSamplesPerSec = MODE_FREQUENCY[control->codec]; - wfm.nAvgBytesPerSec = wfm.nSamplesPerSec * wfm.nChannels * wfm.wBitsPerSample / 8; - wfm.nBlockAlign = 2 * wfm.nChannels; - wfm.wFormatTag = WAVE_FORMAT_PCM; - - - control->waveMode = 0; - // control->isRunning = 1; - control->waveFrameSize = MODE_FRAME_SIZE[control->codec] * 160 * wfm.nChannels;// * wfm.wBitsPerSample / 8; - control->waveHeadersPos = 0; - control->waveHeadersNum = 2; - - control->hThread = mir_forkthread(TlenVoiceRecordingThreadProc, control); - - - SetThreadPriority(control->hThread, THREAD_PRIORITY_ABOVE_NORMAL); - - j = db_get_w(NULL, control->proto->m_szModuleName, "VoiceDeviceIn", 0); - iSelDev = WAVE_MAPPER; - if (j != 0) { - iNumDevs = waveInGetNumDevs(); - for (i = 0; i < iNumDevs; i++) { - if (!waveInGetDevCaps(i, &wic, sizeof(WAVEINCAPS))) { - if (wic.dwFormats != 0) { - j--; - if (j == 0) { - iSelDev = i; - break; - } - } - } - } - } - if (!waveInGetDevCaps(iSelDev, &wic, sizeof(WAVEINCAPS))) { - control->proto->debugLogA("Recording device ID #%u: %s\r\n", iSelDev, wic.szPname); - } - - MMRESULT mmres = waveInOpen(&control->hWaveIn, iSelDev, &wfm, control->threadID, 0, CALLBACK_THREAD); - // mmres = waveInOpen(&control->hWaveIn, 3, &wfm, (DWORD) &TlenVoiceRecordingCallback, (DWORD) control, CALLBACK_FUNCTION); - if (mmres != MMSYSERR_NOERROR) { - PostThreadMessage(control->threadID, WIM_CLOSE, 0, 0); - control->proto->debugLogA("TlenVoiceStart FAILED %d!", mmres); - return 1; - } - control->waveData = (short *)mir_alloc(control->waveHeadersNum * control->waveFrameSize * 2); - memset(control->waveData, 0, control->waveHeadersNum * control->waveFrameSize * 2); - control->waveHeaders = (WAVEHDR *)mir_alloc(control->waveHeadersNum * sizeof(WAVEHDR)); - for (i = 0; i < control->waveHeadersNum; i++) { - control->waveHeaders[i].dwFlags = 0;//WHDR_DONE; - control->waveHeaders[i].lpData = (char *)(control->waveData + i * control->waveFrameSize); - control->waveHeaders[i].dwBufferLength = control->waveFrameSize * 2; - mmres = waveInPrepareHeader(control->hWaveIn, &control->waveHeaders[i], sizeof(WAVEHDR)); - if (mmres != MMSYSERR_NOERROR) { - waveInClose(control->hWaveIn); - // PostThreadMessage(control->threadID, WIM_CLOSE, 0, 0); - control->proto->debugLogA("TlenVoiceStart FAILED #2!"); - return 1; - } - } - for (i = 0; i < control->waveHeadersNum; i++) { - waveInAddBuffer(control->hWaveIn, &control->waveHeaders[i], sizeof(WAVEHDR)); - } - waveInStart(control->hWaveIn); - control->proto->debugLogA("TlenVoiceRStart OK!"); - return 0; -} - - -static TLEN_VOICE_CONTROL *TlenVoiceCreateVC(TlenProtocol *proto, int codec) -{ - TLEN_VOICE_CONTROL *vc = (TLEN_VOICE_CONTROL *)mir_alloc(sizeof(TLEN_VOICE_CONTROL)); - memset(vc, 0, sizeof(TLEN_VOICE_CONTROL)); - vc->gsmstate = gsm_create(); - vc->codec = codec; - vc->proto = proto; - return vc; -} -static void TlenVoiceFreeVc(TLEN_VOICE_CONTROL *vc) -{ - vc->proto->debugLogA("-> TlenVoiceFreeVc"); - vc->stopThread = 1; - PostThreadMessage(vc->threadID, MM_WIM_CLOSE, 0, 0); - while (vc->isRunning) { - Sleep(50); - } - if (vc->hThread != nullptr) CloseHandle(vc->hThread); - if (vc->hWaveIn) { - for (int i = 0; i < vc->waveHeadersNum; i++) { - while (waveInUnprepareHeader(vc->hWaveIn, &vc->waveHeaders[i], sizeof(WAVEHDR)) == WAVERR_STILLPLAYING) { - Sleep(50); - } - } - while (waveInClose(vc->hWaveIn) == WAVERR_STILLPLAYING) { - Sleep(50); - } - } - if (vc->hWaveOut) { - for (int i = 0; i < vc->waveHeadersNum; i++) { - while (waveOutUnprepareHeader(vc->hWaveOut, &vc->waveHeaders[i], sizeof(WAVEHDR)) == WAVERR_STILLPLAYING) { - Sleep(50); - } - } - while (waveOutClose(vc->hWaveOut) == WAVERR_STILLPLAYING) { - Sleep(50); - } - } - if (vc->waveData) mir_free(vc->waveData); - if (vc->waveHeaders) mir_free(vc->waveHeaders); - if (vc->gsmstate) gsm_release(vc->gsmstate); - vc->proto->debugLogA("<- TlenVoiceFreeVc"); - mir_free(vc); -} - -static void TlenVoiceCrypt(char *buffer, int len) -{ - int i, j, k; - j = 0x71; - for (i = 0; i < len; i++) { - k = j; - j = j << 6; - j += k; - j = k + (j << 1); - j += 0xBB; - buffer[i] ^= j; - } -} - -static void __cdecl TlenVoiceReceiveThread(void *arg) -{ - TLEN_FILE_TRANSFER *ft = (TLEN_FILE_TRANSFER *)arg; - ft->proto->debugLogA("Thread started: type=file_receive server='%s' port='%d'", ft->hostName, ft->wPort); - - SetDlgItemText(ft->proto->voiceDlgHWND, IDC_STATUS, TranslateT("...Connecting...")); - - NETLIBOPENCONNECTION nloc = { sizeof(nloc) }; - nloc.szHost = ft->hostName; - nloc.wPort = ft->wPort; - HNETLIBCONN s = Netlib_OpenConnection(ft->proto->m_hNetlibUser, &nloc); - if (s != nullptr) { - ft->s = s; - ft->proto->debugLogA("Entering file receive loop"); - TlenP2PEstablishOutgoingConnection(ft, FALSE); - if (ft->state != FT_ERROR) { - ft->proto->playbackControl = nullptr; - ft->proto->recordingControl = TlenVoiceCreateVC(ft->proto, 3); - ft->proto->recordingControl->ft = ft; - TlenVoiceRecordingStart(ft->proto->recordingControl); - while (ft->state != FT_DONE && ft->state != FT_ERROR) { - TlenVoiceReceiveParse(ft); - } - TlenVoiceFreeVc(ft->proto->recordingControl); - ft->proto->playbackControl = nullptr; - ft->proto->recordingControl = nullptr; - } - if (ft->s) { - Netlib_CloseHandle(s); - } - ft->s = nullptr; - } - else { - ft->proto->debugLogA("Connection failed - receiving as server"); - ft->pfnNewConnectionV2 = TlenVoiceReceivingConnection; - s = (HNETLIBCONN)TlenP2PListen(ft); - if (s != nullptr) { - SetDlgItemText(ft->proto->voiceDlgHWND, IDC_STATUS, TranslateT("...Waiting for connection...")); - ft->s = s; - HANDLE hEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); - ft->hFileEvent = hEvent; - ft->currentFile = 0; - ft->state = FT_CONNECTING; - char *nick = TlenNickFromJID(ft->jid); - TlenSend(ft->proto, "", nick, ft->iqId, ft->localName, ft->wLocalPort); - mir_free(nick); - ft->proto->debugLogA("Waiting for the file to be received..."); - WaitForSingleObject(hEvent, INFINITE); - ft->hFileEvent = nullptr; - CloseHandle(hEvent); - ft->proto->debugLogA("Finish all files"); - Netlib_CloseHandle(s); - } - else { - ft->state = FT_ERROR; - } - } - TlenListRemove(ft->proto, LIST_VOICE, ft->iqId); - if (ft->state == FT_DONE) { - SetDlgItemText(ft->proto->voiceDlgHWND, IDC_STATUS, TranslateT("...Finished...")); - //ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, ft, 0); - } - else { - char *nick; - nick = TlenNickFromJID(ft->jid); - TlenSend(ft->proto, "", nick, ft->iqId); - mir_free(nick); - SetDlgItemText(ft->proto->voiceDlgHWND, IDC_STATUS, TranslateT("...Error...")); - //ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); - } - ft->proto->debugLogA("Thread ended: type=file_receive server='%s'", ft->hostName); - - TlenP2PFreeFileTransfer(ft); -} - -static void TlenVoiceReceivingConnection(HNETLIBCONN hConnection, DWORD, void * pExtra) -{ - HNETLIBCONN slisten; - TlenProtocol *proto = (TlenProtocol *)pExtra; - - TLEN_FILE_TRANSFER *ft = TlenP2PEstablishIncomingConnection(proto, hConnection, LIST_VOICE, FALSE); - if (ft != nullptr) { - slisten = ft->s; - ft->s = hConnection; - ft->proto->debugLogA("Set ft->s to %d (saving %d)", hConnection, slisten); - ft->proto->debugLogA("Entering send loop for this file connection... (ft->s is hConnection)"); - proto->playbackControl = nullptr; - proto->recordingControl = TlenVoiceCreateVC(proto, 3); - proto->recordingControl->ft = ft; - TlenVoiceRecordingStart(proto->recordingControl); - while (ft->state != FT_DONE && ft->state != FT_ERROR) { - TlenVoiceReceiveParse(ft); - } - TlenVoiceFreeVc(proto->recordingControl); - proto->playbackControl = nullptr; - proto->recordingControl = nullptr; - if (ft->state == FT_DONE) { - SetDlgItemText(proto->voiceDlgHWND, IDC_STATUS, TranslateT("...Finished...")); - // ProtoBroadcastAck(proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, ft, 0); - } - else { - // ProtoBroadcastAck(proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); - SetDlgItemText(ft->proto->voiceDlgHWND, IDC_STATUS, TranslateT("...Error...")); - } - ft->proto->debugLogA("Closing connection for this file transfer... (ft->s is now hBind)"); - ft->s = slisten; - ft->proto->debugLogA("ft->s is restored to %d", ft->s); - } - Netlib_CloseHandle(hConnection); - if (ft != nullptr && ft->hFileEvent != nullptr) - SetEvent(ft->hFileEvent); -} - -static void TlenVoiceReceiveParse(TLEN_FILE_TRANSFER *ft) -{ - char *statusTxt; - int i, j; - char *p; - float val; - TLEN_FILE_PACKET *packet = TlenP2PPacketReceive(ft->s); - if (packet != nullptr) { - statusTxt = " Unknown packet "; - p = packet->packet; - if (packet->type == TLEN_VOICE_PACKET) { - short *out; - int codec, chunkNum; - statusTxt = " OK "; - TlenVoiceCrypt(packet->packet + 4, packet->len - 4); - codec = *((int *)packet->packet); - if (codec < 2 || codec>5) { - statusTxt = " Unknown codec "; - } - else { - if (ft->proto->playbackControl == nullptr) { - ft->proto->playbackControl = TlenVoiceCreateVC(ft->proto, codec); - TlenVoicePlaybackStart(ft->proto->playbackControl); - ft->proto->framesAvailableForPlayback = 0; - ft->proto->availOverrunValue = 0; - } - else if (ft->proto->playbackControl->codec != codec) { - TlenVoiceFreeVc(ft->proto->playbackControl); - ft->proto->playbackControl = TlenVoiceCreateVC(ft->proto, codec); - TlenVoicePlaybackStart(ft->proto->playbackControl); - ft->proto->framesAvailableForPlayback = 0; - ft->proto->availOverrunValue = 0; - } - if (!ft->proto->playbackControl->bDisable) { - ft->proto->playbackControl->waveHeaders[ft->proto->playbackControl->waveHeadersPos].dwFlags = WHDR_DONE; - ft->proto->playbackControl->waveHeaders[ft->proto->playbackControl->waveHeadersPos].lpData = (char *)(ft->proto->playbackControl->waveData + ft->proto->playbackControl->waveHeadersPos * ft->proto->playbackControl->waveFrameSize); - ft->proto->playbackControl->waveHeaders[ft->proto->playbackControl->waveHeadersPos].dwBufferLength = ft->proto->playbackControl->waveFrameSize * 2; - /* - if (availPlayback == 0) { - statusTxt = "!! Buffer is empty !!"; - availPlayback++; - waveOutPrepareHeader(playbackControl->hWaveOut, &playbackControl->waveHeaders[playbackControl->waveHeadersPos], sizeof(WAVEHDR)); - waveOutWrite(playbackControl->hWaveOut, &playbackControl->waveHeaders[playbackControl->waveHeadersPos], sizeof(WAVEHDR)); - playbackControl->waveHeadersPos = (playbackControl->waveHeadersPos +1) % playbackControl->waveHeadersNum; - playbackControl->waveHeaders[playbackControl->waveHeadersPos].dwFlags = WHDR_DONE; - playbackControl->waveHeaders[playbackControl->waveHeadersPos].lpData = (char *) (playbackControl->waveData + playbackControl->waveHeadersPos * playbackControl->waveFrameSize); - playbackControl->waveHeaders[playbackControl->waveHeadersPos].dwBufferLength = playbackControl->waveFrameSize * 2; - } - */ - chunkNum = min(MODE_FRAME_SIZE[codec], (int)(packet->len - 4) / 33); - out = (short *)ft->proto->playbackControl->waveHeaders[ft->proto->playbackControl->waveHeadersPos].lpData; - for (i = 0; i < chunkNum; i++) { - for (j = 0; j < 33; j++) { - ft->proto->playbackControl->gsmstate->gsmFrame[j] = packet->packet[i * 33 + j + 4]; - } - gsm_decode(ft->proto->playbackControl->gsmstate, out); - out += 160; - } - out = (short *)ft->proto->playbackControl->waveHeaders[ft->proto->playbackControl->waveHeadersPos].lpData; - val = 0; - for (i = 0; i VU_METER_LEVELS - 1) { - j = VU_METER_LEVELS - 1; - } - else if (j < 0) { - j = 0; - } - ft->proto->playbackControl->vuMeter = j; - ft->proto->playbackControl->bytesSum += 8 + packet->len; - /* Simple logic to avoid huge delays. If a delay is detected a frame is not played */ - j = ft->proto->availOverrunValue > 0 ? -1 : 0; - while (ft->proto->framesAvailableForPlayback > FRAMES_AVAILABLE_MAX_LIMIT) { - j = 1; - SleepEx(5, FALSE); - } - ft->proto->availOverrunValue += j; - /* 40 frames - 800ms/8kHz */ - if (ft->proto->availOverrunValue < 40) { - ft->proto->framesAvailableForPlayback++; - waveOutPrepareHeader(ft->proto->playbackControl->hWaveOut, &ft->proto->playbackControl->waveHeaders[ft->proto->playbackControl->waveHeadersPos], sizeof(WAVEHDR)); - waveOutWrite(ft->proto->playbackControl->hWaveOut, &ft->proto->playbackControl->waveHeaders[ft->proto->playbackControl->waveHeadersPos], sizeof(WAVEHDR)); - ft->proto->playbackControl->waveHeadersPos = (ft->proto->playbackControl->waveHeadersPos + 1) % ft->proto->playbackControl->waveHeadersNum; - } - else { - ft->proto->availOverrunValue -= 10; - statusTxt = "!! Skipping frame !!"; - } - } - } - } - { - char ttt[2048]; - mir_snprintf(ttt, "%s %d %d ", statusTxt, ft->proto->framesAvailableForPlayback, ft->proto->availOverrunValue); - SetDlgItemTextA(ft->proto->voiceDlgHWND, IDC_STATUS, ttt); - } - TlenP2PPacketFree(packet); - } - else { - if (ft->proto->playbackControl != nullptr) { - TlenVoiceFreeVc(ft->proto->playbackControl); - ft->proto->playbackControl = nullptr; - } - ft->state = FT_ERROR; - } -} - - -static void __cdecl TlenVoiceSendingThread(void *arg) -{ - TLEN_FILE_TRANSFER *ft = (TLEN_FILE_TRANSFER *)arg; - char *nick; - - ft->proto->debugLogA("Thread started: type=voice_send"); - ft->pfnNewConnectionV2 = TlenVoiceReceivingConnection; - HNETLIBCONN s = (HNETLIBCONN)TlenP2PListen(ft); - if (s != nullptr) { - SetDlgItemText(ft->proto->voiceDlgHWND, IDC_STATUS, TranslateT("...Waiting for connection...")); - //ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTING, ft, 0); - ft->s = s; - //TlenLog("ft->s = %d", s); - //TlenLog("fileCount = %d", ft->fileCount); - - HANDLE hEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); - ft->hFileEvent = hEvent; - ft->currentFile = 0; - ft->state = FT_CONNECTING; - - nick = TlenNickFromJID(ft->jid); - TlenSend(ft->proto, "", nick, ft->iqId, ft->localName, ft->wLocalPort); - mir_free(nick); - ft->proto->debugLogA("Waiting for the voice data to be sent..."); - WaitForSingleObject(hEvent, INFINITE); - ft->hFileEvent = nullptr; - CloseHandle(hEvent); - ft->proto->debugLogA("Finish voice"); - Netlib_CloseHandle(s); - ft->s = nullptr; - ft->proto->debugLogA("ft->s is NULL"); - - if (ft->state == FT_SWITCH) { - ft->proto->debugLogA("Sending as client..."); - ft->state = FT_CONNECTING; - - NETLIBOPENCONNECTION nloc = { sizeof(nloc) }; - nloc.szHost = ft->hostName; - nloc.wPort = ft->wPort; - HNETLIBCONN sock = Netlib_OpenConnection(ft->proto->m_hNetlibUser, &nloc); - if (sock != nullptr) { - SetDlgItemText(ft->proto->voiceDlgHWND, IDC_STATUS, TranslateT("...Connecting...")); - //ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTING, ft, 0); - ft->s = sock; - TlenP2PEstablishOutgoingConnection(ft, FALSE); - if (ft->state != FT_ERROR) { - ft->proto->debugLogA("Entering send loop for this file connection..."); - ft->proto->playbackControl = nullptr; - ft->proto->recordingControl = TlenVoiceCreateVC(ft->proto, 3); - ft->proto->recordingControl->ft = ft; - TlenVoiceRecordingStart(ft->proto->recordingControl); - while (ft->state != FT_DONE && ft->state != FT_ERROR) { - TlenVoiceReceiveParse(ft); - } - } - ft->proto->debugLogA("Closing connection for this file transfer... "); - Netlib_CloseHandle(sock); - } - else ft->state = FT_ERROR; - } - } - else { - ft->proto->debugLogA("Cannot allocate port to bind for file server thread, thread ended."); - ft->state = FT_ERROR; - } - TlenListRemove(ft->proto, LIST_VOICE, ft->iqId); - switch (ft->state) { - case FT_DONE: - ft->proto->debugLogA("Finish successfully"); - SetDlgItemText(ft->proto->voiceDlgHWND, IDC_STATUS, TranslateT("...Finished...")); - //ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, ft, 0); - break; - case FT_DENIED: - SetDlgItemText(ft->proto->voiceDlgHWND, IDC_STATUS, TranslateT("...Denied...")); - //ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_DENIED, ft, 0); - break; - default: // FT_ERROR: - nick = TlenNickFromJID(ft->jid); - TlenSend(ft->proto, "", nick, ft->iqId); - mir_free(nick); - ft->proto->debugLogA("Finish with errors"); - SetDlgItemText(ft->proto->voiceDlgHWND, IDC_STATUS, TranslateT("...Error...")); - //ProtoBroadcastAck(ft->proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); - break; - } - ft->proto->debugLogA("Thread ended: type=voice_send"); - TlenP2PFreeFileTransfer(ft); -} - -static void TlenVoiceSendParse(TLEN_FILE_TRANSFER *ft) -{ - int i; - - int codec = ft->proto->recordingControl->codec; - TLEN_FILE_PACKET *packet = TlenP2PPacketCreate(sizeof(DWORD) + MODE_FRAME_SIZE[codec] * 33); - if (packet != nullptr) { - short *in; - float val; - in = ft->proto->recordingControl->recordingData; - TlenP2PPacketSetType(packet, 0x96); - packet->packet[0] = codec; - TlenP2PPacketPackDword(packet, codec); - val = 0; - for (i = 0; i VU_METER_LEVELS - 1) { - i = VU_METER_LEVELS - 1; - } - else if (i < 0) { - i = 0; - } - ft->proto->recordingControl->vuMeter = i; - for (i = 0; i < MODE_FRAME_SIZE[codec]; i++) { - gsm_encode(ft->proto->recordingControl->gsmstate, in + i * 160); - TlenP2PPacketPackBuffer(packet, (char*)ft->proto->recordingControl->gsmstate->gsmFrame, 33); - } - TlenVoiceCrypt(packet->packet + 4, packet->len - 4); - if (!TlenP2PPacketSend(ft->s, packet)) { - ft->state = FT_ERROR; - } - ft->proto->recordingControl->bytesSum += 8 + packet->len; - TlenP2PPacketFree(packet); - } - else { - ft->state = FT_ERROR; - } -} - -int TlenVoiceCancelAll(TlenProtocol *proto) -{ - HANDLE hEvent; - int i = 0; - - while ((i = TlenListFindNext(proto, LIST_VOICE, 0)) >= 0) { - TLEN_LIST_ITEM *item = TlenListGetItemPtrFromIndex(proto, i); - if (item != nullptr) { - TLEN_FILE_TRANSFER *ft = item->ft; - TlenListRemoveByIndex(proto, i); - if (ft != nullptr) { - if (ft->s) { - //ProtoBroadcastAck(proto->m_szModuleName, ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); - proto->debugLogA("Closing ft->s = %d", ft->s); - ft->state = FT_ERROR; - Netlib_CloseHandle(ft->s); - ft->s = nullptr; - if (ft->hFileEvent != nullptr) { - hEvent = ft->hFileEvent; - ft->hFileEvent = nullptr; - SetEvent(hEvent); - } - } - else { - proto->debugLogA("freeing (V) ft struct"); - TlenP2PFreeFileTransfer(ft); - } - } - } - } - if (proto->voiceDlgHWND != nullptr) { - EndDialog(proto->voiceDlgHWND, 0); - } - return 0; -} - -INT_PTR TlenProtocol::VoiceContactMenuHandleVoice(WPARAM wParam, LPARAM) -{ - if (!isOnline) - return 1; - - MCONTACT hContact = (MCONTACT)wParam; - if (hContact != NULL) { - DBVARIANT dbv; - if (!db_get(hContact, m_szModuleName, "jid", &dbv)) { - char serialId[32]; - mir_snprintf(serialId, "%d", TlenSerialNext(this)); - TLEN_LIST_ITEM *item = TlenListAdd(this, LIST_VOICE, serialId); - if (item != nullptr) { - TLEN_FILE_TRANSFER *ft = TlenFileCreateFT(this, dbv.pszVal); - ft->iqId = mir_strdup(serialId); - item->ft = ft; - TlenVoiceStart(ft, 2); - TlenSend(ft->proto, "", ft->jid, serialId); - } - db_free(&dbv); - } - } - return 0; -} - -int TlenVoiceIsInUse(TlenProtocol *proto) { - if (TlenListFindNext(proto, LIST_VOICE, 0) >= 0 || proto->voiceDlgHWND != nullptr) { - proto->debugLogA("voice in use ? %d", proto->voiceDlgHWND); - return 1; - } - return 0; -} - -static HBITMAP TlenVoiceMakeBitmap(int w, int h, int bpp, void *ptr) -{ - BITMAPINFO bmih; - bmih.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bmih.bmiHeader.biWidth = w & 0xFFFFFFFC; - bmih.bmiHeader.biHeight = h;//&0xFFFFFFFC; - bmih.bmiHeader.biPlanes = 1; // musi byc 1 - bmih.bmiHeader.biBitCount = bpp; - bmih.bmiHeader.biCompression = BI_RGB; - bmih.bmiHeader.biSizeImage = 0; - bmih.bmiHeader.biXPelsPerMeter = 0; - bmih.bmiHeader.biYPelsPerMeter = 0; - bmih.bmiHeader.biClrUsed = 0; - bmih.bmiHeader.biClrImportant = 0; - HDC hdc = CreateDC(L"DISPLAY", nullptr, nullptr, nullptr); - HBITMAP hbm = CreateDIBitmap(hdc, (PBITMAPINFOHEADER)&bmih, CBM_INIT, ptr, &bmih, DIB_RGB_COLORS); - ReleaseDC(nullptr, hdc); - return hbm; -} - -static void TlenVoiceInitVUMeters() -{ - int i, v, y, x, x0, col, col0; - unsigned char *pBits; - int ledWidth, ledHeight; - ledWidth = 9; - ledHeight = 6; - VU_METER_HEIGHT = ledHeight; - VU_METER_WIDTH = (VU_METER_LEVELS - 1) * ledWidth; - VU_METER_WIDTH = (VU_METER_WIDTH + 3) & (~3); - pBits = (unsigned char *)mir_alloc(3 * VU_METER_WIDTH*VU_METER_HEIGHT); - memset(pBits, 0x80, 3 * VU_METER_WIDTH*VU_METER_HEIGHT); - for (i = 0; i < VU_METER_LEVELS; i++) { - for (v = 0; v < VU_METER_LEVELS - 1; v++) { - if (v >= i) { - if (v < 10) col0 = 0x104010; - else if (v < 13) col0 = 0x404010; - else col0 = 0x401010; - } - else { - if (v < 10) col0 = 0x00f000; - else if (v < 13) col0 = 0xf0f000; - else col0 = 0xf00000; - } - x0 = v * ledWidth; - for (y = 1; y < VU_METER_HEIGHT - 1; y++) { - col = col0; - for (x = 1; x < ledWidth; x++) { - pBits[3 * (x + x0 + y*VU_METER_WIDTH)] = col & 0xFF; - pBits[3 * (x + x0 + y*VU_METER_WIDTH) + 1] = (col >> 8) & 0xFF; - pBits[3 * (x + x0 + y*VU_METER_WIDTH) + 2] = (col >> 16) & 0xFF; - } - } - } - vuMeterBitmaps[i] = TlenVoiceMakeBitmap(VU_METER_WIDTH, VU_METER_HEIGHT, 24, pBits); - } - mir_free(pBits); -} - -static INT_PTR CALLBACK TlenVoiceDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - HDC hDC, hMemDC; - int v; - static int counter; - TlenProtocol *proto = (TlenProtocol *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - switch (msg) { - case WM_INITDIALOG: - proto = (TlenProtocol *)lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)proto); - proto->voiceDlgHWND = hwndDlg; - TranslateDialogDefault(hwndDlg); - SendDlgItemMessage(hwndDlg, IDC_VCQUALITY, CB_ADDSTRING, 0, (LPARAM)L"8000 Hz / 13.8 kbps"); - SendDlgItemMessage(hwndDlg, IDC_VCQUALITY, CB_ADDSTRING, 0, (LPARAM)L"11025 Hz / 19.1 kbps"); - SendDlgItemMessage(hwndDlg, IDC_VCQUALITY, CB_ADDSTRING, 0, (LPARAM)L"22050 Hz / 36.8 kbps"); - SendDlgItemMessage(hwndDlg, IDC_VCQUALITY, CB_ADDSTRING, 0, (LPARAM)L"44100 Hz / 72 kbps"); - SendDlgItemMessage(hwndDlg, IDC_VCQUALITY, CB_SETCURSEL, 1, 0); - SendDlgItemMessage(hwndDlg, IDC_MICROPHONE, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hwndDlg, IDC_SPEAKER, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hwndDlg, IDC_MICROPHONE, BUTTONSETASPUSHBTN, TRUE, 0); - SendDlgItemMessage(hwndDlg, IDC_SPEAKER, BUTTONSETASPUSHBTN, TRUE, 0); - { - HICON hIcon = GetIcolibIcon(IDI_MICROPHONE); - SendDlgItemMessage(hwndDlg, IDC_MICROPHONE, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); - ReleaseIcolibIcon(hIcon); - hIcon = GetIcolibIcon(IDI_SPEAKER); - SendDlgItemMessage(hwndDlg, IDC_SPEAKER, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); - ReleaseIcolibIcon(hIcon); - } - CheckDlgButton(hwndDlg, IDC_MICROPHONE, BST_CHECKED); - CheckDlgButton(hwndDlg, IDC_SPEAKER, BST_CHECKED); - TlenVoiceInitVUMeters(); - SetDlgItemText(hwndDlg, IDC_STATUS, TranslateT("...???...")); - counter = 0; - SetTimer(hwndDlg, 1, 100, nullptr); - return FALSE; - case WM_TIMER: - if (proto->recordingControl != nullptr && !proto->recordingControl->bDisable) { - v = proto->recordingControl->vuMeter % VU_METER_LEVELS; - if (proto->recordingControl->vuMeter > 0) { - proto->recordingControl->vuMeter--; - } - } - else { - v = 0; - } - hDC = GetDC(GetDlgItem(hwndDlg, IDC_VUMETERIN)); - if (nullptr != (hMemDC = CreateCompatibleDC(hDC))) { - SelectObject(hMemDC, vuMeterBitmaps[v]); - BitBlt(hDC, 0, 0, VU_METER_WIDTH, VU_METER_HEIGHT, hMemDC, 0, 0, SRCCOPY); - DeleteDC(hMemDC); - } - ReleaseDC(GetDlgItem(hwndDlg, IDC_PLAN), hDC); - if (proto->playbackControl != nullptr && !proto->playbackControl->bDisable) { - v = proto->playbackControl->vuMeter % VU_METER_LEVELS; - if (proto->playbackControl->vuMeter > 0) { - proto->playbackControl->vuMeter--; - } - } - else { - v = 0; - } - hDC = GetDC(GetDlgItem(hwndDlg, IDC_VUMETEROUT)); - if (nullptr != (hMemDC = CreateCompatibleDC(hDC))) { - SelectObject(hMemDC, vuMeterBitmaps[v]); - BitBlt(hDC, 0, 0, VU_METER_WIDTH, VU_METER_HEIGHT, hMemDC, 0, 0, SRCCOPY); - DeleteDC(hMemDC); - } - ReleaseDC(GetDlgItem(hwndDlg, IDC_PLAN), hDC); - counter++; - if (counter % 10 == 0) { - char str[50]; - float fv; - if (proto->recordingControl != nullptr) { - fv = (float)proto->recordingControl->bytesSum; - proto->recordingControl->bytesSum = 0; - } - else { - fv = 0; - } - mir_snprintf(str, "%.1f kB/s", fv / 1024); - SetDlgItemTextA(hwndDlg, IDC_BYTESOUT, str); - if (proto->playbackControl != nullptr) { - fv = (float)proto->playbackControl->bytesSum; - proto->playbackControl->bytesSum = 0; - } - else { - fv = 0; - } - mir_snprintf(str, "%.1f kB/s", fv / 1024); - SetDlgItemTextA(hwndDlg, IDC_BYTESIN, str); - } - break; - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDCANCEL: - EndDialog(hwndDlg, 0); - return TRUE; - case IDC_VCQUALITY: - if (HIWORD(wParam) == CBN_SELCHANGE) { - if (proto->recordingControl != nullptr) { - int codec = SendDlgItemMessage(hwndDlg, IDC_VCQUALITY, CB_GETCURSEL, 0, 0) + 2; - if (codec != proto->recordingControl->codec && codec > 1 && codec < 6) { - TLEN_FILE_TRANSFER *ft = proto->recordingControl->ft; - TlenVoiceFreeVc(proto->recordingControl); - proto->recordingControl = TlenVoiceCreateVC(ft->proto, codec); - proto->recordingControl->ft = ft; - TlenVoiceRecordingStart(proto->recordingControl); - } - } - } - break; - case IDC_MICROPHONE: - if (proto->recordingControl != nullptr) { - proto->recordingControl->bDisable = BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_MICROPHONE); - } - break; - case IDC_SPEAKER: - if (proto->playbackControl != nullptr) { - proto->playbackControl->bDisable = BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_SPEAKER); - } - break; - } - break; - case WM_CLOSE: - EndDialog(hwndDlg, 0); - break; - case WM_DESTROY: - proto->voiceDlgHWND = nullptr; - break; - - } - return FALSE; -} - -static void __cdecl TlenVoiceDlgThread(void *ptr) -{ - - TLEN_FILE_TRANSFER *ft = (TLEN_FILE_TRANSFER *)ptr; - TlenProtocol *proto = ft->proto; - DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_VOICE), nullptr, TlenVoiceDlgProc, (LPARAM)proto); - TlenVoiceCancelAll(proto); -} - -int TlenVoiceStart(TLEN_FILE_TRANSFER *ft, int mode) -{ - - ft->proto->debugLogA("starting voice %d", mode); - if (mode == 0) { - mir_forkthread(TlenVoiceReceiveThread, ft); - } - else if (mode == 1) { - mir_forkthread(TlenVoiceSendingThread, ft); - } - else { - mir_forkthread(TlenVoiceDlgThread, ft); - } - return 0; -} - -static char *getDisplayName(TlenProtocol *proto, const char *id) -{ - char jid[256]; - MCONTACT hContact; - DBVARIANT dbv; - if (!db_get(NULL, proto->m_szModuleName, "LoginServer", &dbv)) { - mir_snprintf(jid, "%s@%s", id, dbv.pszVal); - db_free(&dbv); - if ((hContact = TlenHContactFromJID(proto, jid)) != NULL) - return mir_u2a(pcli->pfnGetContactDisplayName(hContact, 0)); - } - return mir_strdup(id); -} - -typedef struct { - TlenProtocol *proto; - TLEN_LIST_ITEM *item; -}ACCEPTDIALOGDATA; - -static INT_PTR CALLBACK TlenVoiceAcceptDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - ACCEPTDIALOGDATA * data; - char *str; - switch (msg) { - case WM_INITDIALOG: - TranslateDialogDefault(hwndDlg); - data = (ACCEPTDIALOGDATA *)lParam; - str = getDisplayName(data->proto, data->item->nick); - SetDlgItemTextA(hwndDlg, IDC_FROM, str); - mir_free(str); - return FALSE; - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDC_ACCEPT: - EndDialog(hwndDlg, 1); - return TRUE; - case IDCANCEL: - case IDCLOSE: - EndDialog(hwndDlg, 0); - return TRUE; - } - break; - case WM_CLOSE: - EndDialog(hwndDlg, 0); - break; - } - return FALSE; -} - -static void __cdecl TlenVoiceAcceptDlgThread(void *ptr) -{ - - ACCEPTDIALOGDATA *data = (ACCEPTDIALOGDATA *)ptr; - int result = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_ACCEPT_VOICE), nullptr, TlenVoiceAcceptDlgProc, (LPARAM)data); - if (result && data->proto->isOnline) { - data->item->ft = TlenFileCreateFT(data->proto, data->item->nick); - data->item->ft->iqId = mir_strdup(data->item->jid); - TlenVoiceStart(data->item->ft, 2); - TlenSend(data->proto, "", data->item->nick, data->item->jid); - } - else { - if (data->proto->isOnline) { - TlenSend(data->proto, "", data->item->nick, data->item->jid); - } - TlenListRemove(data->proto, LIST_VOICE, data->item->jid); - } - mir_free(data); -} - -int TlenVoiceAccept(TlenProtocol *proto, const char *id, const char *from) -{ - if (!TlenVoiceIsInUse(proto)) { - TLEN_LIST_ITEM *item = TlenListAdd(proto, LIST_VOICE, id); - if (item != nullptr) { - bool ask = true, ignore = false; - int voiceChatPolicy = db_get_w(NULL, proto->m_szModuleName, "VoiceChatPolicy", 0); - if (voiceChatPolicy == TLEN_MUC_ASK) { - ignore = false; - ask = true; - } - else if (voiceChatPolicy == TLEN_MUC_IGNORE_ALL) { - ignore = true; - } - else if (voiceChatPolicy == TLEN_MUC_IGNORE_NIR) { - char jid[256]; - DBVARIANT dbv; - if (!db_get(NULL, proto->m_szModuleName, "LoginServer", &dbv)) { - mir_snprintf(jid, "%s@%s", from, dbv.pszVal); - db_free(&dbv); - } - else { - strncpy(jid, from, _countof(jid) - 1); - } - ignore = !IsAuthorized(proto, jid); - ask = true; - } - else if (voiceChatPolicy == TLEN_MUC_ACCEPT_IR) { - char jid[256]; - DBVARIANT dbv; - if (!db_get(NULL, proto->m_szModuleName, "LoginServer", &dbv)) { - mir_snprintf(jid, "%s@%s", from, dbv.pszVal); - db_free(&dbv); - } - else { - strncpy(jid, from, _countof(jid) - 1); - } - ask = !IsAuthorized(proto, jid); - ignore = false; - } - else if (voiceChatPolicy == TLEN_MUC_ACCEPT_ALL) { - ask = false; - ignore = false; - } - if (ignore) { - if (proto->isOnline) { - TlenSend(proto, "", from, id); - } - TlenListRemove(proto, LIST_VOICE, id); - } - else { - item->nick = mir_strdup(from); - if (ask) { - ACCEPTDIALOGDATA *data = (ACCEPTDIALOGDATA *)mir_alloc(sizeof(ACCEPTDIALOGDATA)); - data->proto = proto; - data->item = item; - mir_forkthread(TlenVoiceAcceptDlgThread, data); - } - else if (proto->isOnline) { - item->ft = TlenFileCreateFT(proto, from); - item->ft->iqId = mir_strdup(id); - TlenVoiceStart(item->ft, 2); - TlenSend(proto, "", item->nick, item->jid); - } - } - return 1; - } - } - return 0; -} - -int TlenVoiceBuildInDeviceList(TlenProtocol *proto, HWND hWnd) -{ - int i, j, iNumDevs; - WAVEINCAPS wic; - iNumDevs = waveInGetNumDevs(); - SendMessage(hWnd, CB_ADDSTRING, 0, (LPARAM)TranslateT("Default")); - for (i = j = 0; i < iNumDevs; i++) { - if (!waveInGetDevCaps(i, &wic, sizeof(WAVEINCAPS))) { - if (wic.dwFormats != 0) { - SendMessage(hWnd, CB_ADDSTRING, 0, (LPARAM)wic.szPname); - j++; - } - } - } - i = db_get_w(NULL, proto->m_szModuleName, "VoiceDeviceIn", 0); - if (i > j) i = 0; - SendMessage(hWnd, CB_SETCURSEL, i, 0); - return 0; -} - -int TlenVoiceBuildOutDeviceList(TlenProtocol *proto, HWND hWnd) -{ - int i, j, iNumDevs; - WAVEOUTCAPS woc; - iNumDevs = waveInGetNumDevs(); - SendMessage(hWnd, CB_ADDSTRING, 0, (LPARAM)TranslateT("Default")); - for (i = j = 0; i < iNumDevs; i++) { - if (!waveOutGetDevCaps(i, &woc, sizeof(WAVEOUTCAPS))) { - if (woc.dwFormats != 0) { - SendMessage(hWnd, CB_ADDSTRING, 0, (LPARAM)woc.szPname); - j++; - } - } - } - i = db_get_w(NULL, proto->m_szModuleName, "VoiceDeviceOut", 0); - if (i > j) i = 0; - SendMessage(hWnd, CB_SETCURSEL, i, 0); - return 0; -} diff --git a/protocols/Tlen/src/tlen_voice.h b/protocols/Tlen/src/tlen_voice.h deleted file mode 100644 index daaa13eda42..00000000000 --- a/protocols/Tlen/src/tlen_voice.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2004-2007 Piotr Piastucki - -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. - -*/ - -#ifndef _TLEN_VOICE_H_ -#define _TLEN_VOICE_H_ - -#include -#include - -#include "stdafx.h" -extern "C" { - #include "codec/gsm.h" -} - -typedef struct TLEN_VOICE_CONTROL_STRUCT { - int waveMode; - int codec; - int bDisable; - - short *recordingData; - short *waveData; - WAVEHDR *waveHeaders; - int waveFrameSize; - int waveHeadersPos; - int waveHeadersNum; - -// HANDLE hEvent; - HANDLE hThread; - DWORD threadID; - HWAVEOUT hWaveOut; - HWAVEIN hWaveIn; - int isRunning; - int stopThread; - gsm_state *gsmstate; - TLEN_FILE_TRANSFER *ft; - int vuMeter; - int bytesSum; - TlenProtocol *proto; -} TLEN_VOICE_CONTROL; - - -int TlenVoiceStart(TLEN_FILE_TRANSFER *ft, int mode) ; -int TlenVoiceAccept(TlenProtocol *proto, const char *id, const char *from); -int TlenVoiceIsInUse(TlenProtocol *proto); -int TlenVoiceCancelAll(TlenProtocol *proto); -int TlenVoiceBuildInDeviceList(TlenProtocol *proto, HWND hWnd); -int TlenVoiceBuildOutDeviceList(TlenProtocol *proto, HWND hWnd); - -#endif - diff --git a/protocols/Tlen/src/tlen_ws.cpp b/protocols/Tlen/src/tlen_ws.cpp deleted file mode 100644 index 1cf07644d8a..00000000000 --- a/protocols/Tlen/src/tlen_ws.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" - -BOOL TlenWsInit(TlenProtocol *proto) -{ - wchar_t name[128]; - - NETLIBUSER nlu = {}; - nlu.szDescriptiveName.w = name; - nlu.szSettingsModule = proto->m_szModuleName; - - nlu.flags = NUF_OUTGOING | NUF_INCOMING | NUF_HTTPCONNS | NUF_UNICODE; - mir_snwprintf(name, TranslateT("%s connection"), proto->m_tszUserName); - proto->m_hNetlibUser = Netlib_RegisterUser(&nlu); - - nlu.flags = NUF_OUTGOING | NUF_INCOMING | NUF_NOOPTIONS | NUF_UNICODE; - mir_snwprintf(name, TranslateT("%s SOCKS connection"), proto->m_tszUserName); - proto->hFileNetlibUser = Netlib_RegisterUser(&nlu); - - NETLIBUSERSETTINGS nlus = {0}; - nlus.cbSize = sizeof(nlus); - nlus.useProxy = 0; - Netlib_SetUserSettings(proto->hFileNetlibUser, &nlus); - - return (proto->m_hNetlibUser != nullptr)?TRUE:FALSE; -} - -void TlenWsUninit(TlenProtocol *proto) -{ - if (proto->m_hNetlibUser != nullptr) Netlib_CloseHandle(proto->m_hNetlibUser); - if (proto->hFileNetlibUser != nullptr) Netlib_CloseHandle(proto->hFileNetlibUser); - proto->m_hNetlibUser = nullptr; - proto->hFileNetlibUser = nullptr; -} - -HNETLIBCONN TlenWsConnect(TlenProtocol *proto, char *host, WORD port) -{ - NETLIBOPENCONNECTION nloc = {}; - nloc.cbSize = sizeof(NETLIBOPENCONNECTION); //NETLIBOPENCONNECTION_V1_SIZE; - nloc.szHost = host; - nloc.wPort = port; - nloc.flags = 0; - nloc.timeout = 6; - return Netlib_OpenConnection(proto->m_hNetlibUser, &nloc); -} - -int TlenWsSend(TlenProtocol *proto, HNETLIBCONN s, char *data, int datalen) -{ - int len; - if ((len=Netlib_Send(s, data, datalen, /*MSG_NODUMP|*/MSG_DUMPASTEXT)) == SOCKET_ERROR || len != datalen) { - proto->debugLogA("Netlib_Send() failed, error=%d", WSAGetLastError()); - return FALSE; - } - return TRUE; -} - -int TlenWsRecv(TlenProtocol *proto, HNETLIBCONN s, char *data, long datalen) -{ - int ret; - ret = Netlib_Recv(s, data, datalen, /*MSG_NODUMP|*/MSG_DUMPASTEXT); - if (ret == SOCKET_ERROR) { - proto->debugLogA("Netlib_Recv() failed, error=%d", WSAGetLastError()); - return 0; - } - if (ret == 0) { - proto->debugLogA("Connection closed gracefully"); - return 0; - } - return ret; -} - - -int TlenWsSendAES(TlenProtocol *proto, char *data, int datalen, aes_context *aes_ctx, unsigned char *aes_iv) -{ - int len, sendlen; - unsigned char aes_input[16]; - unsigned char aes_output[256]; - if (proto->threadData == nullptr) { - return FALSE; - } - while (datalen > 0) { - len = 0; - while (datalen > 0 && len < 256) { - int pad = datalen < 16 ? 16 - datalen : 0; - memcpy(aes_input, data, datalen < 16 ? datalen : 16); - memset(aes_input + 16 - pad, ' ', pad); - aes_crypt_cbc(aes_ctx, AES_ENCRYPT, 16, aes_iv, aes_input, aes_output + len); - datalen -= 16; - data += 16; - len += 16; - } - if (len > 0) { - proto->debugLogA("Sending %d bytes", len); - if ((sendlen=Netlib_Send(proto->threadData->s, (char *)aes_output, len, MSG_NODUMP)) == SOCKET_ERROR || len != sendlen) { - proto->debugLogA("Netlib_Send() failed, error=%d", WSAGetLastError()); - return FALSE; - } - } - } - return TRUE; -} - -int TlenWsRecvAES(TlenProtocol *proto, char *data, long datalen, aes_context *aes_ctx, unsigned char *aes_iv) -{ - int ret, len = 0, maxlen = datalen; - unsigned char aes_input[16]; - unsigned char *aes_output = (unsigned char *)data; - if (proto->threadData == nullptr) { - return 0; - } - for (maxlen = maxlen & ~0xF; maxlen != 0; maxlen = maxlen & 0xF) { - ret = Netlib_Recv(proto->threadData->s, data, maxlen, MSG_NODUMP); - if (ret == SOCKET_ERROR) { - proto->debugLogA("Netlib_Recv() failed, error=%d", WSAGetLastError()); - return 0; - } - if (ret == 0) { - proto->debugLogA("Connection closed gracefully"); - return 0; - } - data += ret; - len += ret; - maxlen -= ret; - } - - ret = len; - while (len > 15) { - memcpy(aes_input, aes_output, 16); - aes_crypt_cbc(aes_ctx, AES_DECRYPT, 16, aes_iv, aes_input, aes_output); - aes_output += 16; - len -= 16; - } - return ret; -} - diff --git a/protocols/Tlen/src/tlen_xml.cpp b/protocols/Tlen/src/tlen_xml.cpp deleted file mode 100644 index 68ddc29145f..00000000000 --- a/protocols/Tlen/src/tlen_xml.cpp +++ /dev/null @@ -1,572 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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 "stdafx.h" -#include - -static BOOL TlenXmlProcessElem(XmlState *xmlState, XmlElemType elemType, char *elemText, char *elemAttr); -static void TlenXmlRemoveChild(XmlNode *node, XmlNode *child); - -void TlenXmlInitState(XmlState *xmlState) -{ - if (xmlState == nullptr) return; - xmlState->root.name = nullptr; - xmlState->root.depth = 0; - xmlState->root.numAttr = 0; - xmlState->root.maxNumAttr = 0; - xmlState->root.attr = nullptr; - xmlState->root.numChild = 0; - xmlState->root.maxNumChild = 0; - xmlState->root.child = nullptr; - xmlState->root.text = nullptr; - xmlState->root.state = NODE_OPEN; - xmlState->callback1_open = nullptr; - xmlState->callback1_close = nullptr; - xmlState->callback2_open = nullptr; - xmlState->callback2_close = nullptr; - xmlState->userdata1_open = nullptr; - xmlState->userdata1_close = nullptr; - xmlState->userdata2_open = nullptr; - xmlState->userdata2_close = nullptr; -} - -void TlenXmlDestroyState(XmlState *xmlState) -{ - int i; - XmlNode *node; - - if (xmlState == nullptr) - return; - // Note: cannot use TlenXmlFreeNode() to free xmlState->root - // because it will do mir_free(xmlState->root) which is not freeable. - node = &(xmlState->root); - // Free all children first - for (i=0; inumChild; i++) - TlenXmlFreeNode(node->child[i]); - mir_free(node->child); - // Free all attributes - for (i=0; inumAttr; i++) { - mir_free(node->attr[i]->name); - mir_free(node->attr[i]->value); - mir_free(node->attr[i]); - } - mir_free(node->attr); - // Free string field - mir_free(node->text); - mir_free(node->name); - /* mir_free(xmlState) - no need, work with static. */ -} - -BOOL TlenXmlSetCallback(XmlState *xmlState, int depth, XmlElemType type, void (*callback)(XmlNode*, void*), void *userdata) -{ - if (depth == 1 && type == ELEM_OPEN) { - xmlState->callback1_open = callback; - xmlState->userdata1_open = userdata; - } - else if (depth == 1 && type == ELEM_CLOSE) { - xmlState->callback1_close = callback; - xmlState->userdata1_close = userdata; - } - else if (depth == 2 && type == ELEM_OPEN) { - xmlState->callback2_open = callback; - xmlState->userdata2_open = userdata; - } - else if (depth == 2 && type == ELEM_CLOSE) { - xmlState->callback2_close = callback; - xmlState->userdata2_close = userdata; - } - else - return FALSE; - - return TRUE; -} - -#define TAG_MAX_LEN 50 -#define ATTR_MAX_LEN 1024 -int TlenXmlParse(XmlState *xmlState, char *buffer, int datalen) -{ - char *p, *q, *r, *eob; - char *str; - int num; - char tag[TAG_MAX_LEN]; - char attr[ATTR_MAX_LEN]; - XmlElemType elemType = ELEM_OPEN; - - eob = buffer + datalen; - num = 0; - // Skip leading whitespaces - for (p=buffer; p TAG_MAX_LEN) { -// TlenLog("TAG_MAX_LEN too small, ignore current tag"); - } - else { - if (*(p+1) == '/') { // closing tag - strncpy(tag, p+2, r-(p+2)); - tag[r-(p+2)] = '\0'; - elemType = ELEM_CLOSE; - } - else { - if (*(r-1) == '/') { // single open/close tag - strncpy(tag, p+1, r-(p+1)-1); - tag[r-(p+1)-1] = '\0'; - elemType = ELEM_OPENCLOSE; - } - else { - strncpy(tag, p+1, r-(p+1)); - tag[r-(p+1)] = '\0'; - elemType = ELEM_OPEN; - } - } - for (;r ATTR_MAX_LEN) { -// TlenLog("ATTR_MAX_LEN too small, ignore current tag"); - } - else { - strncpy(attr, r, q-r); - if ((q-r)>0 && attr[q-r-1] == '/') { - attr[q-r-1] = '\0'; - elemType = ELEM_OPENCLOSE; - } - else - attr[q-r] = '\0'; - TlenXmlProcessElem(xmlState, elemType, tag, attr); - } - } - num += (q-p+1); - p = q + 1; - if (elemType == ELEM_CLOSE || elemType == ELEM_OPENCLOSE) { - // Skip whitespaces after end tags - for (; pnumAttr >= node->maxNumAttr) { - node->maxNumAttr = node->numAttr + 20; - node->attr = (XmlAttr **) mir_realloc(node->attr, node->maxNumAttr*sizeof(XmlAttr *)); - } - a = node->attr[node->numAttr] = (XmlAttr *) mir_alloc(sizeof(XmlAttr)); - node->numAttr++; - - // Skip possible whitespaces between key and '=' - for (;*p != '\0' && (*p == ' ' || *p == '\t'); p++); - - if (*p == '\0') { - a->name = (char *) mir_alloc(klen+1); - strncpy(a->name, kstart, klen); - a->name[klen] = '\0'; - a->value = mir_strdup(""); - break; - } - - if (*p != '=') { - a->name = (char *) mir_alloc(klen+1); - strncpy(a->name, kstart, klen); - a->name[klen] = '\0'; - a->value = mir_strdup(""); - continue; - } - - // Found '=' - p++; - - // Skip possible whitespaces between '=' and value - for (;*p != '\0' && (*p == ' ' || *p == '\t'); p++); - - if (*p == '\0') { - a->name = (char *) mir_alloc(klen+1); - strncpy(a->name, kstart, klen); - a->name[klen] = '\0'; - a->value = mir_strdup(""); - break; - } - - // Fetch value - if (*p == '\'' || *p == '"') { - p++; - vstart = p; - for (;*p != '\0' && *p != *(vstart-1); p++); - vlen = p-vstart; - if (*p != '\0') p++; - } - else { - vstart = p; - for (;*p != '\0' && *p != ' ' && *p != '\t'; p++); - vlen = p-vstart; - } - - a->name = (char *) mir_alloc(klen+1); - strncpy(a->name, kstart, klen); - a->name[klen] = '\0'; - a->value = (char *) mir_alloc(vlen+1); - strncpy(a->value, vstart, vlen); - a->value[vlen] = '\0'; - } -} - -static BOOL TlenXmlProcessElem(XmlState *xmlState, XmlElemType elemType, char *elemText, char *elemAttr) -{ - XmlNode *node, *parentNode, *n; - //BOOL activateCallback = FALSE; - char *text, *attr; - - if (elemText == nullptr) return FALSE; - - if (elemType == ELEM_OPEN && !mir_strcmp(elemText, "?xml")) { -// TlenLog("XML: skip tag"); - return TRUE; - } - - // Find active node - node = &(xmlState->root); - parentNode = nullptr; - while (node->numChild>0 && node->child[node->numChild-1]->state == NODE_OPEN) { - parentNode = node; - node = node->child[node->numChild-1]; - } - - if (node->state != NODE_OPEN) return FALSE; - - text = mir_strdup(elemText); - - if (elemAttr) - attr = mir_strdup(elemAttr); - else - attr = nullptr; - - switch (elemType) { - case ELEM_OPEN: - if (node->numChild >= node->maxNumChild) { - node->maxNumChild = node->numChild + 20; - node->child = (XmlNode **) mir_realloc(node->child, node->maxNumChild*sizeof(XmlNode *)); - } - n = node->child[node->numChild] = (XmlNode *) mir_alloc(sizeof(XmlNode)); - node->numChild++; - n->name = text; - n->depth = node->depth + 1; - n->state = NODE_OPEN; - n->numChild = n->maxNumChild = 0; - n->child = nullptr; - n->numAttr = n->maxNumAttr = 0; - n->attr = nullptr; - TlenXmlParseAttr(n, attr); - n->text = nullptr; - if (n->depth == 1 && xmlState->callback1_open != nullptr) - (*(xmlState->callback1_open))(n, xmlState->userdata1_open); - if (n->depth == 2 && xmlState->callback2_open != nullptr) - (*xmlState->callback2_open)(n, xmlState->userdata2_open); - break; - case ELEM_OPENCLOSE: - if (node->numChild >= node->maxNumChild) { - node->maxNumChild = node->numChild + 20; - node->child = (XmlNode **) mir_realloc(node->child, node->maxNumChild*sizeof(XmlNode *)); - } - n = node->child[node->numChild] = (XmlNode *) mir_alloc(sizeof(XmlNode)); - node->numChild++; - n->name = text; - n->depth = node->depth + 1; - n->state = NODE_CLOSE; - n->numChild = n->maxNumAttr = 0; - n->child = nullptr; - n->numAttr = n->maxNumAttr = 0; - n->attr = nullptr; - TlenXmlParseAttr(n, attr); - n->text = nullptr; - if (n->depth == 1 && xmlState->callback1_close != nullptr) { - (*(xmlState->callback1_close))(n, xmlState->userdata1_close); - TlenXmlRemoveChild(node, n); - } - if (n->depth == 2 && xmlState->callback2_close != nullptr) { - (*xmlState->callback2_close)(n, xmlState->userdata2_close); - TlenXmlRemoveChild(node, n); - } - break; - case ELEM_CLOSE: - if (node->name != nullptr && !mir_strcmp(node->name, text)) { - node->state = NODE_CLOSE; - int nodeDepth = node->depth; - if (nodeDepth == 1 && xmlState->callback1_close != nullptr) { - (*(xmlState->callback1_close))(node, xmlState->userdata1_close); - TlenXmlRemoveChild(parentNode, node); - } - if (nodeDepth == 2 && xmlState->callback2_close != nullptr) { - (*xmlState->callback2_close)(node, xmlState->userdata2_close); - TlenXmlRemoveChild(parentNode, node); - } - mir_free(text); - } - else { -// TlenLog("XML: Closing without opening tag", text); - mir_free(text); - if (attr) mir_free(attr); - return FALSE; - } - break; - case ELEM_TEXT: - node->text = text; - break; - default: - mir_free(text); - if (attr) mir_free(attr); - return FALSE; - } - - if (attr) mir_free(attr); - - return TRUE; -} - -char *TlenXmlGetAttrValue(XmlNode *node, char *key) -{ - int i; - - if (node == nullptr || node->numAttr <= 0 || key == nullptr || mir_strlen(key) <= 0) - return nullptr; - for (i=0; inumAttr; i++) { - if (node->attr[i]->name && !mir_strcmp(key, node->attr[i]->name)) - return node->attr[i]->value; - } - return nullptr; -} - -XmlNode *TlenXmlGetChild(XmlNode *node, char *tag) -{ - return TlenXmlGetNthChild(node, tag, 1); -} - -XmlNode *TlenXmlGetNthChild(XmlNode *node, char *tag, int nth) -{ - int i, num; - - if (node == nullptr || node->numChild <= 0 || tag == nullptr || mir_strlen(tag) <= 0 || nth < 1) - return nullptr; - num = 1; - for (i=0; inumChild; i++) { - if (node->child[i]->name && !mir_strcmp(tag, node->child[i]->name)) { - if (num == nth) { - return node->child[i]; - } - num++; - } - } - return nullptr; -} - -XmlNode *TlenXmlGetChildWithGivenAttrValue(XmlNode *node, char *tag, char *attrKey, char *attrValue) -{ - int i; - char *str; - - if (node == nullptr || node->numChild <= 0 || tag == nullptr || mir_strlen(tag) <= 0 || attrKey == nullptr || mir_strlen(attrKey) <= 0 || attrValue == nullptr || mir_strlen(attrValue) <= 0) - return nullptr; - for (i=0; inumChild; i++) { - if (node->child[i]->name && !mir_strcmp(tag, node->child[i]->name)) { - if ((str=TlenXmlGetAttrValue(node->child[i], attrKey)) != nullptr) - if (!mir_strcmp(str, attrValue)) - return node->child[i]; - } - } - return nullptr; -} - -static void TlenXmlRemoveChild(XmlNode *node, XmlNode *child) -{ - int i; - - if (node == nullptr || child == nullptr || node->numChild <= 0) return; - for (i=0; inumChild; i++) { - if (node->child[i] == child) - break; - } - if (i < node->numChild) { - for (++i; inumChild; i++) - node->child[i-1] = node->child[i]; - node->numChild--; - TlenXmlFreeNode(child); - } -} - -void TlenXmlFreeNode(XmlNode *node) -{ - int i; - - if (node == nullptr) - return; - // Free all children first - for (i=0; inumChild; i++) - TlenXmlFreeNode(node->child[i]); - mir_free(node->child); - // Free all attributes - for (i=0; inumAttr; i++) { - mir_free(node->attr[i]->name); - mir_free(node->attr[i]->value); - mir_free(node->attr[i]); - } - mir_free(node->attr); - // Free string field - mir_free(node->text); - mir_free(node->name); - // Free the node itself - mir_free(node); -} - -XmlNode *TlenXmlCopyNode(XmlNode *node) -{ - XmlNode *n; - int i; - - if (node == nullptr) return nullptr; - n = (XmlNode *) mir_alloc(sizeof(XmlNode)); - // Copy attributes - if (node->numAttr > 0) { - n->attr = (XmlAttr **) mir_alloc(node->numAttr*sizeof(XmlAttr *)); - for (i=0; inumAttr; i++) { - n->attr[i] = (XmlAttr *) mir_alloc(sizeof(XmlAttr)); - if (node->attr[i]->name) n->attr[i]->name = mir_strdup(node->attr[i]->name); - else n->attr[i]->name = nullptr; - if (node->attr[i]->value) n->attr[i]->value = mir_strdup(node->attr[i]->value); - else n->attr[i]->value = nullptr; - } - } - else - n->attr = nullptr; - // Recursively copy children - if (node->numChild > 0) { - n->child = (XmlNode **) mir_alloc(node->numChild*sizeof(XmlNode *)); - for (i=0; inumChild; i++) - n->child[i] = TlenXmlCopyNode(node->child[i]); - } - else - n->child = nullptr; - // Copy other fields - n->numAttr = node->numAttr; - n->maxNumAttr = node->numAttr; - n->numChild = node->numChild; - n->maxNumChild = node->numChild; - n->depth = node->depth; - n->state = node->state; - n->name = (node->name)?mir_strdup(node->name):nullptr; - n->text = (node->text)?mir_strdup(node->text):nullptr; - - return n; -} - -XmlNode *TlenXmlCreateNode(char *name) -{ - XmlNode *n; - - if (name == nullptr) - return nullptr; - - n = (XmlNode *) mir_alloc(sizeof(XmlNode)); - memset(n, 0, sizeof(XmlNode)); - n->name = mir_strdup(name); - return n; -} - -void TlenXmlAddAttr(XmlNode *n, char *name, char *value) -{ - int i; - - if (n == nullptr || name == nullptr || value == nullptr) - return; - - i = n->numAttr; - (n->numAttr)++; - n->attr = (XmlAttr **) mir_realloc(n->attr, sizeof(XmlAttr *) * n->numAttr); - n->attr[i] = (XmlAttr *) mir_alloc(sizeof(XmlAttr)); - n->attr[i]->name = mir_strdup(name); - n->attr[i]->value = mir_strdup(value); -} - -XmlNode *TlenXmlAddChild(XmlNode *n, char *name) -{ - int i; - - if (n == nullptr || name == nullptr) - return nullptr; - - i = n->numChild; - n->numChild++; - n->child = (XmlNode **) mir_realloc(n->child, sizeof(XmlNode *) * n->numChild); - n->child[i] = (XmlNode *) mir_alloc(sizeof(XmlNode)); - memset(n->child[i], 0, sizeof(XmlNode)); - n->child[i]->name = mir_strdup(name); - return n->child[i]; -} - -void TlenXmlAddText(XmlNode *n, char *text) -{ - if (n != nullptr && text != nullptr) { - if (n->text) mir_free(n->text); - n->text = mir_strdup(text); - } -} - diff --git a/protocols/Tlen/src/tlen_xml.h b/protocols/Tlen/src/tlen_xml.h deleted file mode 100644 index 9b5a078149b..00000000000 --- a/protocols/Tlen/src/tlen_xml.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - -Jabber Protocol Plugin for Miranda IM -Tlen Protocol Plugin for Miranda NG -Copyright (C) 2002-2004 Santithorn Bunchua -Copyright (C) 2004-2007 Piotr Piastucki - -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. - -*/ - -#ifndef _TLEN_XML_H_ -#define _TLEN_XML_H_ - -typedef enum { ELEM_OPEN, ELEM_CLOSE, ELEM_OPENCLOSE, ELEM_TEXT } XmlElemType; -typedef enum { NODE_OPEN, NODE_CLOSE } XmlNodeType; - -typedef struct tagXmlAttr { - char *name; - char *value; -} XmlAttr; - -typedef struct tagXmlNode { - int depth; // depth of the current node (1=root) - char *name; // tag name of the current node - int numAttr; // number of attributes - int maxNumAttr; // internal use (num of slots currently allocated to attr) - XmlAttr **attr; // attribute list - int numChild; // number of direct child nodes - int maxNumChild; // internal use (num of slots currently allocated to child) - struct tagXmlNode **child; // child node list - char *text; - XmlNodeType state; // internal use by parser -} XmlNode; - - -typedef struct tagXmlState { - XmlNode root; // root is the document (depth = 0); - // callback for depth=n element on opening/closing - void (*callback1_open)(XmlNode *,void *); - void (*callback1_close)(XmlNode *,void *); - void (*callback2_open)(XmlNode *,void *); - void (*callback2_close)(XmlNode *,void *); - void *userdata1_open; - void *userdata1_close; - void *userdata2_open; - void *userdata2_close; -} XmlState; - -void TlenXmlInitState(XmlState *xmlState); -void TlenXmlDestroyState(XmlState *xmlState); -BOOL TlenXmlSetCallback(XmlState *xmlState, int depth, XmlElemType type, void (*callback)(XmlNode*, void*), void *userdata); -int TlenXmlParse(XmlState *xmlState, char *buffer, int datalen); -char *TlenXmlGetAttrValue(XmlNode *node, char *key); -XmlNode *TlenXmlGetChild(XmlNode *node, char *tag); -XmlNode *TlenXmlGetNthChild(XmlNode *node, char *tag, int nth); -XmlNode *TlenXmlGetChildWithGivenAttrValue(XmlNode *node, char *tag, char *attrKey, char *attrValue); -void TlenXmlFreeNode(XmlNode *node); -XmlNode *TlenXmlCopyNode(XmlNode *node); - -XmlNode *TlenXmlCreateNode(char *name); -void TlenXmlAddAttr(XmlNode *n, char *name, char *value); -XmlNode *TlenXmlAddChild(XmlNode *n, char *name); -void TlenXmlAddText(XmlNode *n, char *text); - -#endif - diff --git a/protocols/Tlen/src/version.h b/protocols/Tlen/src/version.h deleted file mode 100644 index ca7a54d4090..00000000000 --- a/protocols/Tlen/src/version.h +++ /dev/null @@ -1,17 +0,0 @@ -#define __MAJOR_VERSION 2 -#define __MINOR_VERSION 1 -#define __RELEASE_NUM 0 -#define __BUILD_NUM 0 - -#include - -#define TLENMUCC_VERSION_STRING "2.1.0.0" -#define TLEN_VERSION_STRING TLENMUCC_VERSION_STRING - -#define __PLUGIN_NAME "Tlen protocol" -#define __FILENAME "Tlen.dll" -#define __DESCRIPTION "Tlen protocol support for Miranda NG." -#define __AUTHOR "Santithorn Bunchua, Adam Strzelecki, Piotr Piastucki" -#define __AUTHOREMAIL "the_leech@users.berlios.de" -#define __AUTHORWEB "https://miranda-ng.org/p/Tlen/" -#define __COPYRIGHT "© 2002-2012 Santithorn Bunchua, Piotr Piastucki" diff --git a/protocols/Tlen/tlen.vcxproj b/protocols/Tlen/tlen.vcxproj deleted file mode 100644 index bfc2cf4a79d..00000000000 --- a/protocols/Tlen/tlen.vcxproj +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - Tlen - {F3208C96-3C21-46AA-8695-C794E28CDC34} - - - - - - - NotUsing - - - NotUsing - - - - - - - \ No newline at end of file diff --git a/protocols/Tlen/tlen.vcxproj.filters b/protocols/Tlen/tlen.vcxproj.filters deleted file mode 100644 index de5ad9f66cc..00000000000 --- a/protocols/Tlen/tlen.vcxproj.filters +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file