From 036428b1f75d480617d5df454dc28a5adb941d26 Mon Sep 17 00:00:00 2001 From: mataes2007 Date: Wed, 4 May 2011 19:12:23 +0000 Subject: added MRA git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@67 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- .../0.gif" | Bin 0 -> 103 bytes .../1.gif" | Bin 0 -> 35 bytes .../WindowOpen.js" | 44 + .../_mail.gif" | Bin 0 -> 929 bytes .../agentlogo.gif" | Bin 0 -> 1866 bytes .../cards-all.gif" | Bin 0 -> 240 bytes .../cars-all.gif" | Bin 0 -> 249 bytes .../chat-all.gif" | Bin 0 -> 1039 bytes .../content-all.gif" | Bin 0 -> 599 bytes .../go-all.gif" | Bin 0 -> 1019 bytes .../index.css" | 501 ++ .../love-all.gif" | Bin 0 -> 558 bytes .../molotok-all.gif" | Bin 0 -> 362 bytes .../proto.css" | 39 + .../tour-all.gif" | Bin 0 -> 256 bytes ...u \320\220\320\263\320\265\320\275\321\202.htm" | 635 +++ MRA/Docs/MraPlaces.h | 3174 +++++++++++ MRA/Docs/docs.rar | Bin 0 -> 32163 bytes MRA/Docs/proto.htm | 103 + MRA/Docs/region.txt | 3353 +++++++++++ MRA/Docs/region_m.txt | 3150 +++++++++++ MRA/Icons/Alarm.ico | Bin 0 -> 1406 bytes MRA/Icons/AuthGrant.ico | Bin 0 -> 2550 bytes MRA/Icons/AuthReguest.ico | Bin 0 -> 2550 bytes MRA/Icons/Bagz.ico | Bin 0 -> 2550 bytes MRA/Icons/BlogStatus.ico | Bin 0 -> 894 bytes MRA/Icons/Blogs.ico | Bin 0 -> 2550 bytes MRA/Icons/Chat.ico | Bin 0 -> 2550 bytes MRA/Icons/Info.ico | Bin 0 -> 2550 bytes MRA/Icons/Magent.ico | Bin 0 -> 2550 bytes MRA/Icons/Mail.ico | Bin 0 -> 2550 bytes MRA/Icons/MailNotify.ico | Bin 0 -> 2550 bytes MRA/Icons/Phone.ico | Bin 0 -> 2550 bytes MRA/Icons/Photo.ico | Bin 0 -> 2550 bytes MRA/Icons/PostCards.ico | Bin 0 -> 2550 bytes MRA/Icons/WebSearch.ico | Bin 0 -> 2550 bytes MRA/Icons/answers.ico | Bin 0 -> 1406 bytes MRA/Icons/my world.ico | Bin 0 -> 1406 bytes MRA/Icons/video.ico | Bin 0 -> 1406 bytes MRA/Mra.cpp | 912 +++ MRA/Mra.h | 431 ++ MRA/Mra.vcproj | 1209 ++++ MRA/Mra.vcxproj | 437 ++ MRA/Mra.vcxproj.filters | 400 ++ MRA/MraAdvancedSearch.cpp | 361 ++ MRA/MraAntiSpam.cpp | 540 ++ MRA/MraAntiSpam.h | 24 + MRA/MraAvatars.cpp | 912 +++ MRA/MraAvatars.h | 35 + MRA/MraChat.cpp | 389 ++ MRA/MraChat.h | 30 + MRA/MraConstans.h | 667 +++ MRA/MraFilesQueue.cpp | 1443 +++++ MRA/MraFilesQueue.h | 26 + MRA/MraFilesQueue_mod.cpp | 1298 +++++ MRA/MraIcons.cpp | 151 + MRA/MraIcons.h | 20 + MRA/MraMPop.cpp | 241 + MRA/MraMPop.h | 26 + MRA/MraMRIMProxy.cpp | 239 + MRA/MraMRIMProxy.h | 21 + MRA/MraOfflineMsg.cpp | 432 ++ MRA/MraOfflineMsg.h | 19 + MRA/MraPlaces.h | 5959 ++++++++++++++++++++ MRA/MraPopUp.cpp | 308 + MRA/MraPopUp.h | 34 + MRA/MraRTFMsg.cpp | 341 ++ MRA/MraRTFMsg.h | 19 + MRA/MraSelectEMail.cpp | 187 + MRA/MraSelectEMail.h | 25 + MRA/MraSendCommand.cpp | 878 +++ MRA/MraSendCommand.h | 36 + MRA/MraSendQueue.cpp | 225 + MRA/MraSendQueue.h | 23 + MRA/Mra_functions.cpp | 2417 ++++++++ MRA/Mra_options.cpp | 239 + MRA/Mra_proto.cpp | 2581 +++++++++ MRA/Mra_svcs.cpp | 2302 ++++++++ MRA/Readme_MRA.txt | 502 ++ MRA/Sdk/Base64.h | 380 ++ MRA/Sdk/BuffToLowerCase.h | 98 + MRA/Sdk/DebugFunctions.h | 148 + MRA/Sdk/FIFOMT.h | 133 + MRA/Sdk/InterlockedFunctions.h | 156 + MRA/Sdk/InternetTime.h | 473 ++ MRA/Sdk/ListMT.h | 358 ++ MRA/Sdk/MemoryCompare.h | 101 + MRA/Sdk/MemoryFind.h | 80 + MRA/Sdk/MemoryFindByte.h | 97 + MRA/Sdk/MemoryReplace.h | 150 + MRA/Sdk/RC4.h | 103 + MRA/Sdk/SHA1.h | 596 ++ MRA/Sdk/SocketFunctions.h | 485 ++ MRA/Sdk/StrHexToNum.h | 634 +++ MRA/Sdk/StrToNum.h | 447 ++ MRA/Sdk/m_music.h | 360 ++ MRA/Sdk/m_nudge.h | 3 + MRA/Sdk/m_proto_listeningto.h | 144 + MRA/Sdk/timefuncs.h | 131 + MRA/Sdk/zlib.h | 1357 +++++ MRA/TODO.txt | 28 + MRA/langpack_MRA_russian.txt | 663 +++ MRA/proto.h | 618 ++ MRA/resource.h | 142 + MRA/resource.rc | 485 ++ MRA/xstatus_MRA/XStatus_icons/10.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/11.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/12.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/13.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/14.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/15.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/16.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/17.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/18.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/19.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/20.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/21.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/22.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/23.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/24.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/25.txt | 2 + MRA/xstatus_MRA/XStatus_icons/26.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/27.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/28.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/29.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/30.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/31.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/32.txt | 2 + MRA/xstatus_MRA/XStatus_icons/33.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/34.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/35.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/36.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/37.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/38.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/39.ico | Bin 0 -> 1462 bytes MRA/xstatus_MRA/XStatus_icons/4.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/40.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/41.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/42.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/43.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/44.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/45.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/46.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/47.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/48.ico | Bin 0 -> 318 bytes MRA/xstatus_MRA/XStatus_icons/49.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/5.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/50.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/51.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/52.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/53.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/54.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons/6.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/7.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/8.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/9.ico | Bin 0 -> 894 bytes MRA/xstatus_MRA/XStatus_icons/icon1.ico | Bin 0 -> 1078 bytes MRA/xstatus_MRA/XStatus_icons/unknown.ico | Bin 0 -> 1078 bytes MRA/xstatus_MRA/XStatus_icons_original/10.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/11.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/12.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/13.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/14.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/15.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/16.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/17.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/18.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/19.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/20.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/21.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/22.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/23.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/24.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/25.txt | 2 + MRA/xstatus_MRA/XStatus_icons_original/26.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/27.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/28.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/29.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/30.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/31.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/32.txt | 2 + MRA/xstatus_MRA/XStatus_icons_original/33.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/34.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/35.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/36.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/37.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/38.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/39.ico | Bin 0 -> 1462 bytes MRA/xstatus_MRA/XStatus_icons_original/4.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/40.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/41.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/42.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/43.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/44.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/45.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/46.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/47.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/48.ico | Bin 0 -> 1078 bytes MRA/xstatus_MRA/XStatus_icons_original/49.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/5.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/50.ico | Bin 0 -> 1150 bytes MRA/xstatus_MRA/XStatus_icons_original/51.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/52.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/53.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/6.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/7.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/8.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/9.ico | Bin 0 -> 5430 bytes MRA/xstatus_MRA/XStatus_icons_original/unknown.ico | Bin 0 -> 1078 bytes MRA/xstatus_MRA/resource.h | 67 + MRA/xstatus_MRA/xstatus_MRA.rc | 144 + MRA/xstatus_MRA/xstatus_MRA.vcproj | 786 +++ 212 files changed, 46713 insertions(+) create mode 100644 "MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/0.gif" create mode 100644 "MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/1.gif" create mode 100644 "MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/WindowOpen.js" create mode 100644 "MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/_mail.gif" create mode 100644 "MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/agentlogo.gif" create mode 100644 "MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/cards-all.gif" create mode 100644 "MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/cars-all.gif" create mode 100644 "MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/chat-all.gif" create mode 100644 "MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/content-all.gif" create mode 100644 "MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/go-all.gif" create mode 100644 "MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/index.css" create mode 100644 "MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/love-all.gif" create mode 100644 "MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/molotok-all.gif" create mode 100644 "MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/proto.css" create mode 100644 "MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/tour-all.gif" create mode 100644 "MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.htm" create mode 100644 MRA/Docs/MraPlaces.h create mode 100644 MRA/Docs/docs.rar create mode 100644 MRA/Docs/proto.htm create mode 100644 MRA/Docs/region.txt create mode 100644 MRA/Docs/region_m.txt create mode 100644 MRA/Icons/Alarm.ico create mode 100644 MRA/Icons/AuthGrant.ico create mode 100644 MRA/Icons/AuthReguest.ico create mode 100644 MRA/Icons/Bagz.ico create mode 100644 MRA/Icons/BlogStatus.ico create mode 100644 MRA/Icons/Blogs.ico create mode 100644 MRA/Icons/Chat.ico create mode 100644 MRA/Icons/Info.ico create mode 100644 MRA/Icons/Magent.ico create mode 100644 MRA/Icons/Mail.ico create mode 100644 MRA/Icons/MailNotify.ico create mode 100644 MRA/Icons/Phone.ico create mode 100644 MRA/Icons/Photo.ico create mode 100644 MRA/Icons/PostCards.ico create mode 100644 MRA/Icons/WebSearch.ico create mode 100644 MRA/Icons/answers.ico create mode 100644 MRA/Icons/my world.ico create mode 100644 MRA/Icons/video.ico create mode 100644 MRA/Mra.cpp create mode 100644 MRA/Mra.h create mode 100644 MRA/Mra.vcproj create mode 100644 MRA/Mra.vcxproj create mode 100644 MRA/Mra.vcxproj.filters create mode 100644 MRA/MraAdvancedSearch.cpp create mode 100644 MRA/MraAntiSpam.cpp create mode 100644 MRA/MraAntiSpam.h create mode 100644 MRA/MraAvatars.cpp create mode 100644 MRA/MraAvatars.h create mode 100644 MRA/MraChat.cpp create mode 100644 MRA/MraChat.h create mode 100644 MRA/MraConstans.h create mode 100644 MRA/MraFilesQueue.cpp create mode 100644 MRA/MraFilesQueue.h create mode 100644 MRA/MraFilesQueue_mod.cpp create mode 100644 MRA/MraIcons.cpp create mode 100644 MRA/MraIcons.h create mode 100644 MRA/MraMPop.cpp create mode 100644 MRA/MraMPop.h create mode 100644 MRA/MraMRIMProxy.cpp create mode 100644 MRA/MraMRIMProxy.h create mode 100644 MRA/MraOfflineMsg.cpp create mode 100644 MRA/MraOfflineMsg.h create mode 100644 MRA/MraPlaces.h create mode 100644 MRA/MraPopUp.cpp create mode 100644 MRA/MraPopUp.h create mode 100644 MRA/MraRTFMsg.cpp create mode 100644 MRA/MraRTFMsg.h create mode 100644 MRA/MraSelectEMail.cpp create mode 100644 MRA/MraSelectEMail.h create mode 100644 MRA/MraSendCommand.cpp create mode 100644 MRA/MraSendCommand.h create mode 100644 MRA/MraSendQueue.cpp create mode 100644 MRA/MraSendQueue.h create mode 100644 MRA/Mra_functions.cpp create mode 100644 MRA/Mra_options.cpp create mode 100644 MRA/Mra_proto.cpp create mode 100644 MRA/Mra_svcs.cpp create mode 100644 MRA/Readme_MRA.txt create mode 100644 MRA/Sdk/Base64.h create mode 100644 MRA/Sdk/BuffToLowerCase.h create mode 100644 MRA/Sdk/DebugFunctions.h create mode 100644 MRA/Sdk/FIFOMT.h create mode 100644 MRA/Sdk/InterlockedFunctions.h create mode 100644 MRA/Sdk/InternetTime.h create mode 100644 MRA/Sdk/ListMT.h create mode 100644 MRA/Sdk/MemoryCompare.h create mode 100644 MRA/Sdk/MemoryFind.h create mode 100644 MRA/Sdk/MemoryFindByte.h create mode 100644 MRA/Sdk/MemoryReplace.h create mode 100644 MRA/Sdk/RC4.h create mode 100644 MRA/Sdk/SHA1.h create mode 100644 MRA/Sdk/SocketFunctions.h create mode 100644 MRA/Sdk/StrHexToNum.h create mode 100644 MRA/Sdk/StrToNum.h create mode 100644 MRA/Sdk/m_music.h create mode 100644 MRA/Sdk/m_nudge.h create mode 100644 MRA/Sdk/m_proto_listeningto.h create mode 100644 MRA/Sdk/timefuncs.h create mode 100644 MRA/Sdk/zlib.h create mode 100644 MRA/TODO.txt create mode 100644 MRA/langpack_MRA_russian.txt create mode 100644 MRA/proto.h create mode 100644 MRA/resource.h create mode 100644 MRA/resource.rc create mode 100644 MRA/xstatus_MRA/XStatus_icons/10.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/11.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/12.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/13.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/14.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/15.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/16.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/17.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/18.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/19.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/20.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/21.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/22.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/23.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/24.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/25.txt create mode 100644 MRA/xstatus_MRA/XStatus_icons/26.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/27.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/28.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/29.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/30.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/31.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/32.txt create mode 100644 MRA/xstatus_MRA/XStatus_icons/33.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/34.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/35.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/36.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/37.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/38.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/39.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/4.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/40.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/41.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/42.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/43.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/44.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/45.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/46.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/47.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/48.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/49.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/5.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/50.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/51.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/52.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/53.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/54.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/6.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/7.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/8.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/9.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/icon1.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons/unknown.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/10.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/11.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/12.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/13.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/14.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/15.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/16.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/17.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/18.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/19.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/20.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/21.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/22.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/23.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/24.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/25.txt create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/26.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/27.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/28.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/29.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/30.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/31.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/32.txt create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/33.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/34.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/35.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/36.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/37.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/38.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/39.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/4.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/40.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/41.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/42.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/43.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/44.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/45.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/46.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/47.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/48.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/49.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/5.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/50.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/51.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/52.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/53.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/6.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/7.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/8.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/9.ico create mode 100644 MRA/xstatus_MRA/XStatus_icons_original/unknown.ico create mode 100644 MRA/xstatus_MRA/resource.h create mode 100644 MRA/xstatus_MRA/xstatus_MRA.rc create mode 100644 MRA/xstatus_MRA/xstatus_MRA.vcproj diff --git "a/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/0.gif" "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/0.gif" new file mode 100644 index 0000000..427c96b Binary files /dev/null and "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/0.gif" differ diff --git "a/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/1.gif" "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/1.gif" new file mode 100644 index 0000000..1d0c3f9 Binary files /dev/null and "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/1.gif" differ diff --git "a/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/WindowOpen.js" "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/WindowOpen.js" new file mode 100644 index 0000000..e5f140e --- /dev/null +++ "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/WindowOpen.js" @@ -0,0 +1,44 @@ +// +// Proxomitron Anti-popup code +// + +var PrxLC=new Date(0); +var PrxModAtr=0; +var PrxLd=1; +var PrxInst; if(!PrxInst++) PrxRealOpen=window.open; + +function PrxOMUp(){PrxLC=new Date();} +function PrxNW(){return(this.window);} +function PrxOpen(url,nam,atr){ + if(PrxLC){ + var cdt=new Date(); + cdt.setTime(cdt.getTime()-PrxLC.getTime()); + if(!PrxLd && cdt.getSeconds()<2){ + if(atr){ return(PrxRealOpen(url,nam,PrxWOA(atr))); } + else{ return(PrxRealOpen(url,nam)); } + } + } + return(new PrxNW()); +} + +function PrxWOA(atr){ + var xatr="location=yes,status=yes,resizable=yes,toolbar=yes,scrollbars=yes"; + if(!PrxModAtr) return(atr); + if(atr){ + var hm; + hm=atr.match(/height\=[0-9]+/i); + if(hm) xatr+="," + hm; + hm=atr.match(/width\=[0-9]+/i); + if(hm) xatr+="," + hm; + } + return(xatr); +} + +function PrxRST(){ + if(document.layers){document.captureEvents(Event.MOUSEUP);} + document.onmouseup=PrxOMUp; + PrxLd=0; +} + +window.open=PrxOpen; +submit=PrxOpen; \ No newline at end of file diff --git "a/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/_mail.gif" "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/_mail.gif" new file mode 100644 index 0000000..c86e89d Binary files /dev/null and "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/_mail.gif" differ diff --git "a/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/agentlogo.gif" "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/agentlogo.gif" new file mode 100644 index 0000000..5ce7a19 Binary files /dev/null and "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/agentlogo.gif" differ diff --git "a/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/cards-all.gif" "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/cards-all.gif" new file mode 100644 index 0000000..2ea481c Binary files /dev/null and "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/cards-all.gif" differ diff --git "a/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/cars-all.gif" "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/cars-all.gif" new file mode 100644 index 0000000..908409d Binary files /dev/null and "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/cars-all.gif" differ diff --git "a/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/chat-all.gif" "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/chat-all.gif" new file mode 100644 index 0000000..438ee19 Binary files /dev/null and "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/chat-all.gif" differ diff --git "a/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/content-all.gif" "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/content-all.gif" new file mode 100644 index 0000000..72bc124 Binary files /dev/null and "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/content-all.gif" differ diff --git "a/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/go-all.gif" "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/go-all.gif" new file mode 100644 index 0000000..e6ae399 Binary files /dev/null and "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/go-all.gif" differ diff --git "a/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/index.css" "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/index.css" new file mode 100644 index 0000000..7842a50 --- /dev/null +++ "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/index.css" @@ -0,0 +1,501 @@ +A.ag { + COLOR: black; FONT-FAMILY: Arial,Sans-Serif; TEXT-DECORATION: underline +} +P.sog { + PADDING-RIGHT: 25px; PADDING-LEFT: 20px; FONT-SIZE: 65%; PADDING-BOTTOM: 0px; PADDING-TOP: 3px +} +P.sog A { + COLOR: white; FONT-FAMILY: Arial,Sans-Serif +} +P.sog A:hover { + COLOR: #cce8ff +} +A.font { + FONT-SIZE: 70%; COLOR: black; TEXT-DECORATION: none +} +A.ag:hover { + TEXT-DECORATION: none +} +.ag { + FONT-WEIGHT: normal; PADDING-BOTTOM: 5px; COLOR: black; FONT-FAMILY: Arial,Sans-Serif +} +A.quest { + DISPLAY: block; FONT-SIZE: 90%; MARGIN: 3px 0px 0px +} +.dmar { + PADDING-RIGHT: 170px; FONT-SIZE: 75%; MARGIN: 10px 0px 0px 5px +} +.mar { + MARGIN-TOP: 10px; FONT-SIZE: 75% +} +.yas { + FONT-SIZE: 70%; MARGIN: 0px 0px 15px; COLOR: #676a71 +} +.yas A { + COLOR: #0956a6; TEXT-DECORATION: none +} +.m { + FONT-SIZE: 70%; MARGIN: 0px 0px 0px 10px +} +UL.dpic { + PADDING-RIGHT: 260px; PADDING-LEFT: 10px; FONT-SIZE: 75% +} +UL.pic { + PADDING-LEFT: 10px; FONT-SIZE: 75%; MARGIN-BOTTOM: 15px +} +UL.pic LI.p1 { + PADDING-RIGHT: 0px; PADDING-LEFT: 10px; LIST-STYLE-IMAGE: url(http://img.mail.ru/mail/ru/images/agent/ima1.gif); PADDING-BOTTOM: 2px; PADDING-TOP: 0px +} +UL.pic LI.p2 { + PADDING-RIGHT: 0px; PADDING-LEFT: 10px; LIST-STYLE-IMAGE: url(http://img.mail.ru/mail/ru/images/agent/ima2.gif); PADDING-BOTTOM: 2px; PADDING-TOP: 0px +} +UL.pic LI.p3 { + PADDING-RIGHT: 0px; PADDING-LEFT: 10px; LIST-STYLE-IMAGE: url(http://img.mail.ru/mail/ru/images/agent/ima3.gif); PADDING-BOTTOM: 2px; PADDING-TOP: 0px +} +SPAN.or { + COLOR: #f26d00 +} +UL { + PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0px 17px; PADDING-TOP: 0px +} +LI { + PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 3px 0px 0px; LINE-HEIGHT: 120%; PADDING-TOP: 0px +} +.bottom { + PADDING-RIGHT: 0px; PADDING-LEFT: 5px; FLOAT: left; PADDING-BOTTOM: 1px; MARGIN: 0px; PADDING-TOP: 0px +} +.right { + PADDING-RIGHT: 20px; FLOAT: right +} +.img { + PADDING-RIGHT: 320px; BACKGROUND-POSITION: left center; PADDING-LEFT: 40px; FONT-SIZE: 75%; BACKGROUND-IMAGE: url(http://img.mail.ru/mail/ru/images/agent/kar.gif); PADDING-BOTTOM: 10px; MARGIN: 5px 0px 7px 5px; PADDING-TOP: 7px; BACKGROUND-REPEAT: no-repeat +} +.bg1 { + BACKGROUND-POSITION: right bottom; BACKGROUND-IMAGE: url(http://img.mail.ru/mail/ru/images/agent/bg1.gif); BACKGROUND-REPEAT: no-repeat; HEIGHT: 220px +} +.bg12 { + BACKGROUND-POSITION: right top; BACKGROUND-IMAGE: url(http://img.mail.ru/mail/ru/images/agent/bg1_2.gif); MARGIN: 0px; BACKGROUND-REPEAT: no-repeat; HEIGHT: 12px +} +.bg2 { + BACKGROUND-POSITION: right bottom; BACKGROUND-IMAGE: url(http://img.mail.ru/mail/ru/images/agent/bg3.gif); BACKGROUND-REPEAT: no-repeat; HEIGHT: 240px +} +.bg21 { + BACKGROUND-POSITION: right top; BACKGROUND-IMAGE: url(http://img.mail.ru/mail/ru/images/agent/bg3_2.gif); MARGIN: 0px; BACKGROUND-REPEAT: no-repeat; HEIGHT: 12px +} +.bg3 { + BACKGROUND-POSITION: right bottom; BACKGROUND-IMAGE: url(http://img.mail.ru/mail/ru/images/agent/developers.gif); BACKGROUND-REPEAT: no-repeat; HEIGHT: 220px +} +.button { + BORDER-RIGHT: medium none; PADDING-RIGHT: 5px; BORDER-TOP: medium none; PADDING-LEFT: 35px; FONT-WEIGHT: bold; FONT-SIZE: 12px; BACKGROUND: url(http://img.mail.ru/mail/ru/images/agent/button2.gif) no-repeat; PADDING-BOTTOM: 8px; MARGIN: 5px 0px 5px 5px; BORDER-LEFT: medium none; WIDTH: 171px; COLOR: white; PADDING-TOP: 4px; BORDER-BOTTOM: medium none; FONT-FAMILY: Arial,Sans-Serif; HEIGHT: 24px; TEXT-DECORATION: none +} +.button2 { + BORDER-RIGHT: medium none; PADDING-RIGHT: 0px; BORDER-TOP: medium none; PADDING-LEFT: 32px; FONT-WEIGHT: bold; FONT-SIZE: 12px; BACKGROUND: url(http://img.mail.ru/mail/ru/images/agent/button.gif) no-repeat; FLOAT: right; PADDING-BOTTOM: 0px; MARGIN: 12px 0px 5px 5px; BORDER-LEFT: medium none; WIDTH: 123px; COLOR: white; PADDING-TOP: 3px; BORDER-BOTTOM: medium none; FONT-FAMILY: Arial,Sans-Serif; HEIGHT: 24px; TEXT-DECORATION: none +} +A.but { + COLOR: white; TEXT-DECORATION: none +} +A.but:hover { + COLOR: white; TEXT-DECORATION: none +} +TD.gif { + PADDING-RIGHT: 0px; BACKGROUND-POSITION: right 50%; PADDING-LEFT: 0px; BACKGROUND-IMAGE: url(http://img.mail.ru/mail/ru/images/agent/1.gif); PADDING-BOTTOM: 0px; PADDING-TOP: 0px; BACKGROUND-REPEAT: no-repeat +} +A { + COLOR: #0857a6; TEXT-DECORATION: underline +} +A:hover { + COLOR: #f26d00; TEXT-DECORATION: none +} +BODY { + FONT-WEIGHT: normal; FONT-FAMILY: Arial,Sans-Serif +} +TABLE TD { + FONT-WEIGHT: normal; FONT-FAMILY: Arial,Sans-Serif +} +INPUT { + FONT-WEIGHT: normal; FONT-FAMILY: Arial,Sans-Serif +} +SELECT { + FONT-WEIGHT: normal; FONT-FAMILY: Arial,Sans-Serif +} +LABEL { + FONT-WEIGHT: normal; FONT-FAMILY: Arial,Sans-Serif +} +DIV { + FONT-WEIGHT: normal; FONT-FAMILY: Arial,Sans-Serif +} +P { + PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px +} +TABLE.pop TD.up { + PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 80%; PADDING-BOTTOM: 10px; COLOR: black; PADDING-TOP: 10px +} +TABLE.pop H1 { + PADDING-RIGHT: 0px; PADDING-LEFT: 10px; PADDING-BOTTOM: 7px; MARGIN: 0px; PADDING-TOP: 7px +} +H1 { + FONT-SIZE: 100%; FONT-FAMILY: Arial,Sans-Serif +} +H2 { + FONT-SIZE: 90%; MARGIN: 0px 0px 5px; COLOR: #003073; FONT-FAMILY: Arial,Sans-Serif +} +H3 { + FONT-SIZE: 80%; MARGIN: 0px 0px 2px; COLOR: #202020; FONT-FAMILY: Arial,Sans-Serif +} +H3 I { + FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal +} +H4 { + FONT-SIZE: 75%; MARGIN: 8px 0px 0px; COLOR: #003073; FONT-FAMILY: Arial,Sans-Serif +} +H4 I { + FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: normal +} +H5 { + FONT-WEIGHT: bold; FONT-SIZE: 70%; MARGIN: 8px 0px 2px; COLOR: #202020; FONT-FAMILY: Arial,Sans-Serif +} +H5 A { + FONT-WEIGHT: bold +} +H5 I A { + FONT-STYLE: normal +} +TABLE.frame { + MARGIN-BOTTOM: 10px +} +TABLE.top { + MARGIN-BOTTOM: 10px +} +TABLE.frame TD.cor { + PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND-IMAGE: url(http://img.mail.ru/mail/ru/images/agent/1.gif); PADDING-BOTTOM: 0px; PADDING-TOP: 0px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-COLOR: #d9d9d9 +} +TABLE.top TD.cor { + PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND-IMAGE: url(http://img.mail.ru/mail/ru/images/agent/1.gif); PADDING-BOTTOM: 0px; PADDING-TOP: 0px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-COLOR: #d9d9d9 +} +TABLE.frame TD.cont { + BORDER-RIGHT: #d9d9d9 1px solid; PADDING-RIGHT: 14px; PADDING-LEFT: 14px; PADDING-BOTTOM: 8px; MARGIN: 0px; BORDER-LEFT: #d9d9d9 1px solid; PADDING-TOP: 8px +} +TD.hd { + BACKGROUND-COLOR: #fedba5 +} +TD.hd H1 { + FONT-WEIGHT: bold; MARGIN: 4px 4px 4px 0px; COLOR: black +} +TD.menuor { + PADDING-BOTTOM: 10px +} +TD.menuor DIV.menur { + BORDER-RIGHT: white 1px solid; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 2px; BORDER-LEFT: white 1px solid; PADDING-TOP: 0px; BACKGROUND-COLOR: #ffd57f +} +TD.menuor DIV.bord { + BORDER-RIGHT: #ffa901 2px solid; PADDING-RIGHT: 14px; BORDER-TOP: #ffa901 1px solid; PADDING-LEFT: 15px; FONT-SIZE: 75%; PADDING-BOTTOM: 4px; MARGIN: 0px; BORDER-LEFT: #ffa901 2px solid; PADDING-TOP: 4px; BORDER-BOTTOM: #ffa901 1px solid +} +TD.menuor DIV.bor SPAN.small { + FONT-SIZE: 90%; COLOR: red +} +TD.menuor DIV.bor A { + COLOR: #413f40; TEXT-DECORATION: underline +} +TD.menuor DIV.bor A:hover { + TEXT-DECORATION: none +} +TD.menuor DIV.bor { + BORDER-RIGHT: #ffd57f 1px solid; PADDING-RIGHT: 14px; PADDING-LEFT: 14px; FONT-SIZE: 75%; PADDING-BOTTOM: 4px; MARGIN: 0px 2px; BORDER-LEFT: #ffd57f 1px solid; PADDING-TOP: 4px; BACKGROUND-COLOR: #fff2d8 +} +TD.menuor DIV.b { + BORDER-RIGHT: #ffd57f 1px solid; MARGIN: 0px 2px; BORDER-LEFT: #ffd57f 1px solid; BACKGROUND-COLOR: #fff2d8 +} +.prop { + PADDING-RIGHT: 15px; PADDING-LEFT: 0px; FONT-SIZE: 80%; PADDING-BOTTOM: 10px; PADDING-TOP: 5px +} +TD.prop P { + MARGIN: 0px; COLOR: #00458e; FONT-FAMILY: Arial,Sans-Serif +} +TD.text P { + PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 75%; PADDING-BOTTOM: 5px; PADDING-TOP: 0px +} +TD.text H4 { + MARGIN: 12px 0px 3px +} +TD.text H1 { + FONT-WEIGHT: bold; MARGIN: 10px 0px 5px; COLOR: #003073 +} +TD.text OL { + PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0px; FONT-SIZE: 75%; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 7px 30px; PADDING-TOP: 0px +} +TD.text UL { + PADDING-RIGHT: 0px; MARGIN-TOP: 0px; PADDING-LEFT: 0px; FONT-SIZE: 75%; MARGIN-BOTTOM: 0px; PADDING-BOTTOM: 0px; MARGIN-RIGHT: 0px; PADDING-TOP: 0px +} +LI { + PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 3px 0px 0px; LINE-HEIGHT: 120%; PADDING-TOP: 0px +} +TD.vo { + PADDING-LEFT: 25px +} +TD.vo P { + PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 80%; PADDING-BOTTOM: 5px; PADDING-TOP: 0px +} +TD.vo UL { + PADDING-RIGHT: 0px; MARGIN-TOP: 0px; PADDING-LEFT: 0px; FONT-SIZE: 80%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px +} +TD.vo UL LI { + PADDING-RIGHT: 0px; MARGIN-TOP: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px +} +TABLE.frame TD.cont UL { + FONT-SIZE: 70% +} +TABLE.frame TD.cont P { + FONT-SIZE: 70% +} +TABLE.frame TD.menu { + BORDER-RIGHT: #d9d9d9 1px solid; PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 8px; BORDER-LEFT: #d9d9d9 1px solid; PADDING-TOP: 8px; TEXT-ALIGN: right +} +TABLE.frame TD.menu TABLE TD { + FONT-SIZE: 80% +} +TABLE.top TD { + PADDING-RIGHT: 4px; PADDING-LEFT: 4px; FONT-SIZE: 70%; PADDING-BOTTOM: 4px; PADDING-TOP: 4px +} +TABLE.top TD.cor IMG { + MARGIN: 0px +} +TABLE.top TD.left { + PADDING-LEFT: 22px; BORDER-LEFT: #d9d9d9 1px solid +} +TABLE.top TD.right { + BORDER-RIGHT: #d9d9d9 1px solid; PADDING-RIGHT: 22px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; PADDING-TOP: 5px +} +TABLE.top TD IMG.pic { + MARGIN-RIGHT: 2px +} +TD.form { + PADDING-BOTTOM: 10px +} +TD.title { + PADDING-RIGHT: 5px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 10px; PADDING-TOP: 0px +} +TD.pic { + PADDING-RIGHT: 10px; PADDING-LEFT: 0px; PADDING-BOTTOM: 5px; PADDING-TOP: 5px +} +TABLE.footer TD { + FONT-SIZE: 70%; COLOR: white +} +TABLE.footer TD A { + COLOR: white +} +TABLE.footer TD A:hover { + COLOR: #cce8ff +} +TABLE.footer TD.hide { + FONT-SIZE: 70%; COLOR: #00468c +} +TABLE.footer TD.hide A { + COLOR: #00468c +} +TABLE.footer TD.hide A:hover { + COLOR: #00468c +} +TD.entry { + BACKGROUND-POSITION: left bottom; BACKGROUND-IMAGE: url(http://img.mail.ru/mail/ru/images/agent/dot.gif); WIDTH: 100%; BACKGROUND-REPEAT: repeat-x +} +TABLE.rating TD.entry A { + BACKGROUND-COLOR: white +} +TD.centcol DIV.cor { + MARGIN-BOTTOM: 15px +} +TABLE.menu TD { + BACKGROUND-COLOR: white +} +TD.item { + PADDING-RIGHT: 10px; BORDER-TOP: white 3px solid; PADDING-LEFT: 10px; FONT-SIZE: 75%; PADDING-BOTTOM: 20px; PADDING-TOP: 2px +} +TD.cur { + PADDING-RIGHT: 10px; BORDER-TOP: white 3px solid; PADDING-LEFT: 10px; FONT-SIZE: 75%; PADDING-BOTTOM: 20px; PADDING-TOP: 2px +} +TD.head { + PADDING-LEFT: 15px +} +TD.head2 { + PADDING-RIGHT: 10px; PADDING-LEFT: 5px +} +IMG.pre { + BORDER-RIGHT: #ffb31a 1px solid; BORDER-TOP: #ffb31a 1px solid; MARGIN-BOTTOM: 5px; BORDER-LEFT: #ffb31a 1px solid; BORDER-BOTTOM: #ffb31a 1px solid +} +DIV.footer { + FONT-SIZE: 80%; MARGIN: 10px 0px 20px; TEXT-ALIGN: center +} +DIV.plash { + WIDTH: 100%; BACKGROUND-COLOR: #00468c; TEXT-ALIGN: center +} +DIV.cor { + BACKGROUND-IMAGE: url(http://img.mail.ru/mail/ru/images/agent/1.gif); WIDTH: 100%; BACKGROUND-REPEAT: no-repeat; HEIGHT: 1px; BACKGROUND-COLOR: #d9d9d9; TEXT-ALIGN: right +} +DIV.plash DIV.cor { + BACKGROUND-COLOR: #00468c +} +TD.bg1 DIV.cor { + BACKGROUND-COLOR: #00468c +} +TD.header DIV.cor { + BACKGROUND-COLOR: #00468c +} +DIV.cmnt2 { + MARGIN-TOP: 7px; FONT-SIZE: 70%; MARGIN-BOTTOM: 12px; COLOR: #616161 +} +UNKNOWN { + MARGIN-BOTTOM: 10px +} +UNKNOWN { + MARGIN: 0px +} +TD.header { + BACKGROUND-COLOR: #00468c +} +TD.header TD.text { + PADDING-RIGHT: 15px; PADDING-LEFT: 0px; FONT-SIZE: 70%; PADDING-BOTTOM: 0px; COLOR: white; PADDING-TOP: 1px; FONT-FAMILY: Tahoma +} +.kill { + TEXT-DECORATION: line-through +} +.warn { + BORDER-RIGHT: #ff0000 2px solid; PADDING-RIGHT: 3px; BORDER-TOP: #ff0000 1px solid; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; BORDER-LEFT: #ff0000 2px solid; PADDING-TOP: 3px; BORDER-BOTTOM: #ff0000 1px solid +} +.knopi { + PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-WEIGHT: bold; FONT-SIZE: 12px; PADDING-BOTTOM: 0px; COLOR: white; PADDING-TOP: 0px; FONT-FAMILY: Arial,Sans-Serif; TEXT-DECORATION: none +} +TD.fail { + BACKGROUND-POSITION: left bottom; BACKGROUND-IMAGE: url(http://img.mail.ru/mail/ru/images/agent/point1.gif); BACKGROUND-REPEAT: repeat-x +} +TD.fail1 { + BACKGROUND-POSITION: left bottom; BACKGROUND-IMAGE: url(http://img.mail.ru/mail/ru/images/agent/point1.gif); BACKGROUND-REPEAT: repeat-x; TEXT-ALIGN: right +} +TD.fail B { + PADDING-RIGHT: 2px; FONT-WEIGHT: normal; BACKGROUND-COLOR: #fff3de +} +TD.fail1 B { + PADDING-RIGHT: 5px; PADDING-LEFT: 3px; FONT-WEIGHT: normal; PADDING-BOTTOM: 0px; COLOR: #676a73; PADDING-TOP: 0px; BACKGROUND-COLOR: #fff3de +} +DIV.gr_line { + BACKGROUND-COLOR: #dadce5 +} +TABLE.stat { + PADDING-RIGHT: 10px; MARGIN-BOTTOM: 20px; BACKGROUND-COLOR: #ffffff; TEXT-ALIGN: left +} +TABLE.stat TR TD { + PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 75%; PADDING-BOTTOM: 5px; PADDING-TOP: 5px; FONT-FAMILY: arial +} +TABLE.stat TR.head TD { + PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 70%; PADDING-BOTTOM: 0px; PADDING-TOP: 3px; FONT-FAMILY: tahoma; BACKGROUND-COLOR: #e6e8ed +} +TABLE.stat TR TD.iskl { + PADDING-RIGHT: 0px; PADDING-LEFT: 4px +} +TABLE.stat TR.head TD A { + COLOR: #393b40 +} +TABLE.stat TR.head TD A:hover { + COLOR: #000000 +} +TR.head TD { + BORDER-BOTTOM: #e6e8ed 3px solid +} +TR.head TD.nizh { + COLOR: #000000; PADDING-TOP: 5px; BORDER-BOTTOM: #acafbf 3px solid +} +TABLE.stat TR.last_tr TD { + PADDING-RIGHT: 0px; BORDER-TOP: #dadde5 3px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px +} +TR.weekend TD { + BACKGROUND-COLOR: #fffbed +} +TR.forced TD { + FONT-WEIGHT: bold +} +TR.or_vid TD { + BACKGROUND-COLOR: #fff7e5 +} +TR.st_vid TD { + BACKGROUND-COLOR: #ffffff +} +TR.cherez TD { + BACKGROUND-COLOR: #f5f5f2 +} +TABLE.frame TD.cont UL.mmenu { + FONT-SIZE: 80% +} +TABLE.frame TD.cont UL.mmenu LI { + MARGIN-BOTTOM: 4px; COLOR: #dbe0e6 +} +TABLE.frame TD.cont UL.mmenu LI .speak { + COLOR: #0857a6 +} +TABLE.frame TD.cont UL.mmenu LI.ai { + COLOR: #000000 +} +TABLE.frame TD.cont UL.mmenu LI UL.smenu { + FONT-SIZE: 85%; MARGIN-BOTTOM: 6px +} +TABLE.frame TD.cont UL.mmenu LI UL.smenu LI { + MARGIN-TOP: 4px; COLOR: #dbe0e6 +} +TABLE.frame TD.cont UL.mmenu LI UL.smenu LI.ai { + COLOR: #000000 +} +TABLE.talkme TD { + PADDING-RIGHT: 5px; PADDING-LEFT: 0px; FONT-SIZE: 70%; PADDING-BOTTOM: 4px; PADDING-TOP: 0px +} +TABLE.talkme TD IMG.avat { + BORDER-RIGHT: #d9d9d9 1px solid; BORDER-TOP: #d9d9d9 1px solid; MARGIN-BOTTOM: 5px; BORDER-LEFT: #d9d9d9 1px solid; BORDER-BOTTOM: #d9d9d9 1px solid +} +TABLE.talkme TD.all { + PADDING-BOTTOM: 13px +} +TABLE.talkme TD.all A { + COLOR: #696973; TEXT-DECORATION: underline +} +TABLE.frame TD.contfr { + BORDER-RIGHT: #d9d9d9 1px solid; PADDING-RIGHT: 60px; PADDING-LEFT: 14px; BACKGROUND: url(http://img.mail.ru/mail/ru/images/agent/friend.jpg) no-repeat right bottom; PADDING-BOTTOM: 8px; MARGIN: 0px; BORDER-LEFT: #d9d9d9 1px solid; PADDING-TOP: 8px +} +TABLE.frame TD.contfr TD { + PADDING-RIGHT: 3px; PADDING-LEFT: 0px; FONT-SIZE: 70%; PADDING-BOTTOM: 0px; COLOR: #646b75; PADDING-TOP: 3px +} +TABLE.frame TD.contfr TD SPAN { + FONT-SIZE: 90% +} +TABLE.frame TD.contfr TD A { + TEXT-DECORATION: none +} +TABLE.frame TD.contfr TD.all { + PADDING-BOTTOM: 13px +} +TABLE.frame TD.contfr TD.all A { + COLOR: #696973; TEXT-DECORATION: underline +} +TABLE.frame TD H2 { + MARGIN-BOTTOM: 10px +} +.pbgla { + BACKGROUND: url(http://img.mail.ru/mail/ru/images/agent/pbg_l1.gif) no-repeat center bottom +} +.pbglba { + BACKGROUND: url(http://img.mail.ru/mail/ru/images/agent/pbg_l2-1.gif) no-repeat left top +} +.pbglbb { + BACKGROUND: url(http://img.mail.ru/mail/ru/images/agent/pbg_l2-2.gif) no-repeat right top +} +TABLE.top_menu { + MARGIN-BOTTOM: 7px +} +TABLE.top_menu TD { + PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 80%; PADDING-BOTTOM: 4px; PADDING-TOP: 2px +} +TABLE.top_menu TD.bord_b { + PADDING-RIGHT: 0px; BACKGROUND-POSITION: right top; PADDING-LEFT: 0px; BACKGROUND-IMAGE: url(http://img.mail.ru/1.gif); PADDING-BOTTOM: 0px; PADDING-TOP: 0px; BACKGROUND-REPEAT: no-repeat; HEIGHT: 1px; BACKGROUND-COLOR: #c2c3cc +} +TABLE.top_menu TD.bord_l { + BORDER-LEFT: #c2c3cc 1px solid +} +TABLE.top_menu TD.bord_r { + BORDER-RIGHT: #c2c3cc 1px solid +} diff --git "a/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/love-all.gif" "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/love-all.gif" new file mode 100644 index 0000000..c53ccf0 Binary files /dev/null and "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/love-all.gif" differ diff --git "a/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/molotok-all.gif" "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/molotok-all.gif" new file mode 100644 index 0000000..8182aba Binary files /dev/null and "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/molotok-all.gif" differ diff --git "a/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/proto.css" "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/proto.css" new file mode 100644 index 0000000..f471cb4 --- /dev/null +++ "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/proto.css" @@ -0,0 +1,39 @@ +TD.text .blue { + COLOR: #003073 +} +TD.text CODE { + MARGIN: 0px 3px; COLOR: #333333 +} +TD.text SPAN.c { + FONT-SIZE: 110%; MARGIN-LEFT: 3px; COLOR: #333333; FONT-STYLE: normal; FONT-FAMILY: Courier New +} +TD.text B { + COLOR: #333333 +} +TD.text PRE { + BORDER-RIGHT: #666666 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #666666 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: #666666 1px solid; COLOR: #333333; PADDING-TOP: 5px; BORDER-BOTTOM: #666666 1px solid +} +TD.text .pt10 { + PADDING-TOP: 10px +} +TD.text UL.pack LI { + MARGIN-TOP: 12px +} +TD.text UL.pack U { + FONT-SIZE: 100%; TEXT-DECORATION: none +} +TD.text UL.pack P { + FONT-SIZE: 100% +} +TD.text P.pack2 { + LINE-HEIGHT: 1.3em; PADDING-TOP: 4px +} +TD.text P.code { + PADDING-RIGHT: 4px; PADDING-LEFT: 10px; PADDING-BOTTOM: 4px; COLOR: #333333; LINE-HEIGHT: 1.5em; PADDING-TOP: 0px; FONT-FAMILY: Courier New +} +TD.text P.pack2 U { + FONT-SIZE: 90%; COLOR: #666666; TEXT-DECORATION: none +} +TD.text UL.par { + PADDING-RIGHT: 0px; PADDING-LEFT: 35px; PADDING-BOTTOM: 10px; MARGIN-LEFT: 0px; PADDING-TOP: 0px +} diff --git "a/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/tour-all.gif" "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/tour-all.gif" new file mode 100644 index 0000000..23ae14b Binary files /dev/null and "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.files/tour-all.gif" differ diff --git "a/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.htm" "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.htm" new file mode 100644 index 0000000..574ed83 --- /dev/null +++ "b/MRA/Docs/Mail_ru \320\220\320\263\320\265\320\275\321\202.htm" @@ -0,0 +1,635 @@ + + +Mail.ru Агент + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
Поиск ПоискЗнакомства ЗнакомстваОткрытки ОткрыткиЧаты ЧатыРассылки РассылкиМолоток МолотокПутешествия ПутешествияАвто АвтоВсе проекты
+ + + + + + + + + + + + +
[Rambler's Top100]
+ + + + + +
+
+ + + + + +
Агентmail.ru +

загрузить

+

Пользовательское
соглашение


+
+ + + + + +
+ + + + + + + +
+

+

Описание протокола

+

MMP - протокол соединения Mail.Ru Агента с общей сетью Mail.Ru. + Рекомендованный для соединения сервер в любой момент времени можно + получить в текстовом формате ip:port по адресу mrim.mail.ru:443 и mrim.mail.ru:2042. + Взаимодействие с сервером происходит поверх постоянно установленного + tcp-соединения посредством асинхронного обмена командами. Инициатором + установления соединения может быть только клиент, команды могут посылаться + как клиентом, так и сервером.

+

MMP бинарный протокол. Все числовые данные передаются как + четырехбайтные целые НЕ в сетевом формате, т. е. первым идет старший байт, + последним младший. Четырехбайтовые беззнаковые целые обозначаются + UL.

+

Текстовые данные передаются с префексированной длиной, т. е. сначала + UL, а потом строка (в кодировке windows-1251) длины UL без + завершающего нуля. Обозначение в дальнейшем - LPS.

+

Тип данных UIDL используется только при работе с оставленными на + сервере сообщениями. UIDL - последовательность из 8 символов из + множества [a-z A-Z 0-9 _ - = +].

+

Каждая команда или ответ на нее начинаются с заголовка. Поля + указываемые в заголовке: +

    +
  • волшебный ключ, указывающий на то, что это действительно пакет MMP - + версия MMP, поддерживаемая отправителем пакета (текущая версия - 1.7) +
  • номер отправляемой команды в текущем соединении. Ответ на команду + должен иметь тот же номер, что и сама команда. +
  • тип пакета, номер команды и/или ответа +
  • длинна данных пакета (без учета заголовка). При обработке посылаемых + сервером данных длина пакета должна иметь приоритет перед списком его + параметров, т. к. в следующих версиях протокола могут появляться новые + параметры и все они будут дописываться в конец пакета. +
  • порт и ip (в inet_aton() формате) с которых установлено + соединение
+


+

В синтаксисе языка С:

Заголовок пакета
+{
+    u_long	magic;	
+    u_long	proto;
+    u_long	seq;
+    u_long	msg;
+    u_long	dlen;
+    u_long	from;
+    u_long	fromport;
+    u_char	reserved[16];
+}
+
+

Вам понадобится заголовочный файл на языке C. Взять его можно здесь.

+

 

+

Последовательность команд

+

После установки tcp-соединения клиент обязан сразу послать MRIM_CS_HELLO, дождаться MRIM_CS_HELLO_ACK, после чего отправить MRIM_CS_LOGIN2 и начать посылать MRIM_CS_PING с установленным в MRIM_CS_HELLO_ACK интервалом. В случае успешной авторизации + дальнейшие пакеты (кроме MRIM_CS_PING) должны + отправляться только в случае пользовательских действий (написания новых + сообщений и т. п.) или ответа на пакеты получаемые от сервера.

+

Типы пакетов

+

Тип пакета: cs - Client -> Server
Тип + пакета: sc - Server -> Client

+

Пакеты

+
    +
  • Пакет: Установка соединения +

    Имя пакета: MRIM_CS_HELLO
    Ответ: MRIM_CS_HELLO_ACK
    Тип пакета: + cs
    Описание: Первый пакет, отправляемый на сервер.

    +
  • Пакет: Подтверждение установки соединения +

    Имя пакета: MRIM_CS_HELLO_ACK
    Тип пакета: + sc
    Параметры:

    +

    UL ## ping_period ## Ожидаемая частота подтверждения + соединения (в секундах)

    +

    Описание: Подтверждает возможность соединения и + сообщает клиенту интервал, с которым надо отправлять пакеты контроля + соединения.

    +
  • Пакет: Успешная авторизация +

    Имя пакета: MRIM_CS_LOGIN_ACK
    Тип пакета: + sc
    Описание: Сообщает, что пара логин-пароль была верна и + клиент успешно авторизовался в сети агента.

    +
  • Пакет: Неверная авторизация +

    Имя пакета: MRIM_CS_LOGIN_REJ
    Тип пакета: + sc
    Параметры:

    +

    LPS ## reason ## причина отказа

    +

    Описание: Сообщает, что пара логин-пароль была + неверна, и соединение будет завершено.

    +
  • Пакет: Контроль соединения +

    Имя пакета: MRIM_CS_PING
    Тип пакета: cs
    Описание: + Отправка этого пакета подтверждает для сервера, что клиент активен. + Пакет должен отправляться с интервалом, определенным в MRIM_CS_HELLO_ACK.

    +
  • Пакет: Сообщение +

    Имя пакета: MRIM_CS_MESSAGE
    Тип пакета: cs
    поле seq + должно содержать номер, который в последствии будет содержаться в + заголовке пакета MRIM_CS_MESSAGE_STATUS, + оповещающем клиента о статусе доставки данного + сообщения.
    Параметры:

    +

    UL ## flags ## флаги ##

    +

    MESSAGE_FLAG_OFFLINE ## + Сообщение пришло, пока клиент был отключен
    MESSAGE_FLAG_NORECV ## + Отправителю сообщения не требуется подтверждения + доставки
    MESSAGE_FLAG_AUTHORIZE ## Сообщение является запросом на + авторизацию
    MESSAGE_FLAG_SYSTEM ## Сообщение является системным + уведомлением администрации
    MESSAGE_FLAG_RTF ## В сообщении содержится + форматированная часть
    MESSAGE_FLAG_CONTACT ## Сообщение представляет + из себя пересланный список контактов. Текст сообщения в этом случае + должен представлять из себя список адресов и ников пересылаемых + контактов, перечисленных через точку с запятой. + <адрес1>;<ник1>;<адрес2>;<ник2>;<адрес3>;<ник3>;...
    MESSAGE_FLAG_NOTIFY + ## Это сообщение-уведомление "Вам пишут". Должно посылаться каждые 10 + секунд, при более длинной паузе клиент-получатель должен считать, что + отправитель прекратил написание. Текст такого сообщения должен состоять + из одного пробела.
    MESSAGE_FLAG_MULTICAST ## Сообщение направлено + списку получателей, а не одному. Поле to в таком случае состоит из + списка получателей, перечисленных через запятую. Максимальная длина + списка - 50 адресов.

    +

    LPS ## to ## email получателя
    LPS ## message ## + текстовая версия отправляемого сообщения
    LPS ## rtf-message ## + отформатированная версия отправляемого сообщения, в случае наличия обоих + версий сообщения приоритет имеет rtf-версия. Она должна содержать + rtf-текст упакованный gzip в base64 представлении. То есть:

    BASE64(
    +  		GZIP(
    +  			UL количество LPS (должно быть не менее 2)
    +  			LPS rtf_text_with_all_rtf_headers_and_tags
    +  			LPS цвет фона в виде UL
    + 			 )
    + 		 ) 
    +					
    +

    +

    Описание: Основной пакет взаимодействия между + двумя клиентами. Может быть отправлено в любой момент по инициативе + клиента. Ни текстовая, ни rtf части сообщений не могут быть пустыми, при + необходимости следует использовать строку из одного пробела.

    +
  • Пакет: Доставка сообщения +

    Имя пакета: MRIM_CS_MESSAGE_ACK
    Тип пакета: + sc
    Параметры:

    +

    UL ## msg_id ## Номер пакета (Sequence) этого сообщения + для отправителя
    UL ## flags ## Возможные значения описаны в + MRIM_CS_MESSAGE
    LPS ## from ## Адрес отправителя
    LPS ## message ## + текстовая версия сообщения
    LPS ## rtf-message ## форматированная + версия сообщения

    +

    Описание:

    +
  • Пакет: Подтверждение получения сообщения +

    Имя пакета: MRIM_CS_MESSAGE_RECV
    Тип пакета: + cs
    Параметры:

    +

    LPS ## from ##
    UL ## msg_id ##

    +

    Описание: Отправляется получателем сообщения сразу + после прихода MRIM_CS_MESSAGE_ACK, если флаги MRIM_CS_MESSAGE_ACK не содержали MESSAGE_FLAG_NORECV. from и msg_id должны быть скопированы из MRIM_CS_MESSAGE_ACK и имеют то же значение.

    +
  • Пакет: Подтверждение доставки сообщения +

    Имя пакета: MRIM_CS_MESSAGE_STATUS
    Тип пакета: sc
    Поле + seq численно равно полю seq пакета MRIM_CS_MESSAGE
    Параметры:

    +

    UL ## status ## статус доставки ##

    +

    MESSAGE_DELIVERED ## Сообщение + успешно доставлено
    MESSAGE_REJECTED_INTERR ## Произошла внутренняя + ошибка
    MESSAGE_REJECTED_NOUSER ## Не существует + пользователя-получателя сообщения
    MESSAGE_REJECTED_LIMIT_EXCEEDED ## + Пользователь-получатель в данный момент отключен от сети, и сообщение не + помещается в его почтовый ящик
    MESSAGE_REJECTED_TOO_LARGE ## Размер + сообщения превышает максимально + допустимый
    MESSAGE_REJECTED_DENY_OFFMSG ## Пользователь-получатель в + данный момент отключен от сети, а настройки его почтового ящика не + допускают наличие оффлайновых сообщений агента

    +

    Описание: Отправленное сообщение считается + доставленным только после получения этого ответа сервера. Сервер НЕ + ГАРАНТИРУЕТ доставку сообщения. В случае отстутствия MRIM_CS_MESSAGE_STATUS более интервала подтверждения + соединения, программа клиент должна послать сообщение повторно или + проинформировать пользователя о невозможности доставки из-за проблем + связи получателя.

    +
  • Пакет: Смена статуса другого пользователя +

    Имя пакета: MRIM_CS_USER_STATUS
    Тип пакета: + sc
    Параметры:

    +

    UL ## status ## новый статус пользователя ##

    +

    STATUS_OFFLINE ## Пользователь + отключен от сети Агента
    STATUS_ONLINE ## Пользователь находится в + сети
    STATUS_AWAY ## Пользователь в сети, но отошел от + компьютера
    STATUS_UNDETERMINATED ## Настройки пользователя запрещают + показывать его статус
    STATUS_FLAG_INVISIBLE ## Пользователь находится + в сети, но невидим для всех, кроме привилегированных пользователей из + его списка видимости.

    LPS ## user ## email сменившего свой статус + пользователя +

    +

    Описание: Это сообщение отправляется сервером при + смене статуса пользователям всем тем, у кого он находится в + контакт-листе (за исключением группы "Жду Авторизации" и тех, кого он + включил в список игнорируемых или невидящих). Данное сообщение может + быть доставлено клиенту ДО получения им контакт-листа. В такой ситуации + оно должно игнорироваться.

    +
  • Пакет: Закрытие соединения +

    Имя пакета: MRIM_CS_LOGOUT
    Тип пакета: + sc
    Параметры:

    +

    UL ## reason ## причина отключения ##

    +

    LOGOUT_NO_RELOGIN_FLAG ## + Пользователь отключен из-за параллельного входа с его логином. Клиент не + должен осуществлять автоматический перезаход в этом случае.

    +
  • Пакет: Изменение параметров соединения +

    Имя пакета: MRIM_CS_CONNECTION_PARAM
    Тип пакета: + sc
    Параметры:

    +

    UL ## ping_period ## новая ожидаемая частота подтверждения + соединения

    +

    Описание: Ближайший MRIM_CS_PING следует отправлять уже исходя из новой + частоты.

    +
  • Пакет: Добавление нового контакта +

    Имя пакета: MRIM_CS_ADD_CONTACT
    Тип пакета: + cs
    Параметры:

    +

    UL ## flags ## флаги ##

    +

    CONTACT_FLAG_GROUP ## + Добавляется новая группа, а не контакт (несовместим с остальными). + Верхний байт содержит количество уже имеющихся групп в + контакт-листе
    CONTACT_FLAG_INVISIBLE ## Контакт должен попасть в + список "Я всегда невидим для"
    CONTACT_FLAG_VISIBLE ## Контакт должен + попасть в список "Я всегда видим для"
    CONTACT_FLAG_IGNORE ## Контакт + должен попасть в список игнорируемых
    CONTACT_FLAG_SHADOW ## Контакт + не должен попасть в основной контакт-лист (применяется в паре с одним из + трех предыдущих)
    CONTACT_FLAG_REMOVED ## Контакт удален

    +

    UL ## group_id ## группа, в которую должен быть добавлен + контакт (для CONTACT_FLAG_GROUP равно 0)
    LPS ## email ## добавляемый + адрес (имя группы для CONTACT_FLAG_GROUP)
    LPS ## name ## ник + добавляемого пользователя (для отображения в контакт-листе, не + посылается для CONTACT_FLAG_GROUP) LPS ## unused ## неиспользуемый + параметр

    +
  • Пакет: Подтверждение добавления контакта +

    Имя пакета: MRIM_CS_ADD_CONTACT_ACK
    Тип пакета: + sc
    Параметры:

    +

    UL ## status ## результат операции ##

    +

    CONTACT_OPER_SUCCESS ## + добавление произведено успешно
    CONTACT_OPER_ERROR ## переданные + данные были некорректны
    CONTACT_OPER_INTERR ## при обработке запроса + произошла внутренняя ошибка
    CONTACT_OPER_NO_SUCH_USER ## добавляемого + пользователя не существует в системе
    CONTACT_OPER_INVALID_INFO ## + некорректное имя пользователя
    CONTACT_OPER_USER_EXISTS ## + пользователь уже есть в контакт-листе
    CONTACT_OPER_GROUP_LIMIT ## + превышено максимально допустимое количество групп (20)

    +

    ## UL ## contact_id ## присвоенный новому контакту + номер

    +

    Описание: Приходит в ответ на MRIM_CS_ADD_CONTACT. -1 если status + не равен CONTACT_OPER_SUCCESS.

    +
  • Пакет: Изменение контакта +

    Имя пакета: MRIM_CS_MODIFY_CONTACT
    Тип пакета: + cs
    Параметры:

    +

    UL ## id ## номер модифицируемого контакта
    UL ## flags + ##
    UL ## group_id ## Равно 0 для группы
    LPS ## contact ## Если + группа, то имя группы
    LPS ## name ## Если группа, то имя группы

    +

    Описание: Параметры те же, что и у MRIM_CS_ADD_CONTACT. contact до и + после изменения обязаны совпадать.

    +
  • Пакет: Подтверждение изменения контакта +

    Имя пакета: MRIM_CS_MODIFY_CONTACT_ACK
    Тип пакета: + sc
    Параметры:

    +

    UL ## status ## Результат операции. Значения имеют тот же + смысл, что и в MRIM_CS_ADD_CONTACT_ACK

    +
  • Пакет: Сообщение доставленное, пока пользователь не был + подключен к сети +

    Имя пакета: MRIM_CS_OFFLINE_MESSAGE_ACK
    Тип пакета: + sc
    Параметры:

    +

    UIDL ## uidl ## id сообщения
    LPS ## message ## + сообщение. Сообщение приходит в формате RFC/822 письма. Отправитель + сообщения хранится в заголовке From, дата в заголовке Date, флаги + сообщения в X-MRIM-FLAGS, текстовая и форматированная версии сообщения + составляют текст письма и разделяются между собой разделителем из + заголовка Boundary.

    +

    Описание: Каждое полученное за время отсутствия + сообщение приходит отдельным пакетом в том порядке, в каком они + поступали на сервер.

    +
  • Пакет: Удаление сохраненного сообщения +

    Имя пакета: MRIM_CS_OFFLINE_MESSAGE_DEL
    Тип пакета: + cs
    Параметры:

    +

    UIDL ## uidl

    +

    Описание: На каждый полученный MRIM_CS_OFFLINE_MESSAGE_ACK клиент обязан отправить MRIM_CS_OFFLINE_MESSAGE_DEL с тем же uidl, подтверждающий получение данного сообщения. + Сообщение стирается на сервере только при получении этой команды.

    +
  • Пакет: Авторизация пользователя на добавление в + контакт-лист +

    Имя пакета: MRIM_CS_AUTHORIZE
    Тип пакета: + cs
    Параметры:

    +

    LPS ## user ## email пользователя

    +

    Описание: Отправляется, чтобы разрешить user добавление пользователя в контакт-лист и наблюдение + за его статусом.

    +
  • Пакет: Информация об авторизации +

    Имя пакета: MRIM_CS_AUTHORIZE_ACK
    Тип пакета: + sc
    Параметры:

    +

    LPS ## user ## email авторизовавшего пользователя

    +

    Описание: Отсылается сервером после получением им + MRIM_CS_AUTHORIZE от user + тому, кого user авторизовал.

    +
  • Пакет: Изменение статуса +

    Имя пакета: MRIM_CS_CHANGE_STATUS
    Тип пакета: + cs
    Параметры:

    +

    UL ## status ## возможные значения совпадают с + MRIM_CS_USER_STATUS, но не могут посылаться статусы + STATUS_UNDETERMINATED и STATUS_OFFLINE

    +
  • Пакет: Требование ключа для web-авторизации +

    Имя пакета: MRIM_CS_GET_MPOP_SESSION
    Тип пакета: + cs
    Описание: Пользователь агента может заходить в почтовый + ящик Mail.Ru без дополнительной авторизации и не передавая свой пароль в + GET-запросе, для этого используется механизм ключей.

    +
  • Пакет: Ключ для web-авторизации +

    Имя пакета: MRIM_CS_GET_MPOP_SESSION_ACK
    Тип пакета: + sc
    Параметры:

    +

    UL ## status ## успешность операции (1 - ключ получен, 0 - + произошла ошибка)
    LPS ## session ## сам ключ

    +

    Описание: Для входа в ящик можно использовать URL + win.mail.ru/cgi-bin/auth?Login=email&agent=ключ.

    +
  • Пакет: Поиск контакта +

    Имя пакета: MRIM_CS_WP_REQUEST
    Тип пакета: + cs
    Параметры:

    +

    UL ## field ## параметр поиска ##

    +

    MRIM_CS_WP_REQUEST_PARAM_USER ## + логин (без домена), обязан комбинироваться с + доменом
    MRIM_CS_WP_REQUEST_PARAM_DOMAIN ## почтовый + домен
    MRIM_CS_WP_REQUEST_PARAM_NICKNAME ## + ник
    MRIM_CS_WP_REQUEST_PARAM_FIRSTNAME ## имя +
    MRIM_CS_WP_REQUEST_PARAM_LASTNAME ## фамилия, * в конце + ника/имени/фамилии указывает на возможность любого продолжения + имени
    MRIM_CS_WP_REQUEST_PARAM_SEX ## пол. 1 - мужской, 2 - + женский
    MRIM_CS_WP_REQUEST_PARAM_DATE1 ## минимальный возраст (в + годах)
    MRIM_CS_WP_REQUEST_PARAM_DATE2 ## максимальный возраст (в + годах)
    MRIM_CS_WP_REQUEST_PARAM_CITY_ID ## ID региона проживания +
    MRIM_CS_WP_REQUEST_PARAM_ZODIAC ## Знак зодиака (Овен - 1, ..., Рыбы + - 12)
    MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_MONTH ## Месяц рождения + (Январь - 1, ..., Декабрь - 12)
    MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_DAY + ## День рождения (обязан комбинироваться с месяцем + рождения)
    MRIM_CS_WP_REQUEST_PARAM_COUNTRY_ID ## ID страны + проживания
    MRIM_CS_WP_REQUEST_PARAM_ONLINE ## ищем ли мы только + подключенных в данный момент пользователей (1)

    +

    LPS ## value все параметры в строковом формате, включая + числа

    +

    Описание: Поиск контактов в базе агента. Параметры + поиска передаются парами параметр-значение. Передача нескольких + параметров имеет семантику "и", т. е. все найденные результаты должны + соответствовать всем переданным параметрам. Комбинироваться могут все + параметры за исключением логина и домена (они обязаны идти парой и не + могут комбинироваться с другими параметрами) в порядке соответствующем + порядку описания (за исключением требования для MRIM_CS_WP_REQUEST_PARAM_ONLINE быть последним в списке). +

    +
  • Пакет: Найденные пользователи +

    Имя пакета: MRIM_CS_ANKETA_INFO
    Тип пакета: + cs
    Параметры:

    +

    UL ## status ## успешность запроса ##

    +

    MRIM_ANKETA_INFO_STATUS_OK ## + поиск успешно завершен
    MRIM_ANKETA_INFO_STATUS_NOUSER ## не найдено + ни одной подходящей записи
    MRIM_ANKETA_INFO_STATUS_RATELIMERR ## + слишком много запросов, поиск временно запрещен

    +

    UL ## fields_num ## количество полей в анкете каждого + пользователя
    UL ## max_rows ## текущее ограничение на количество + результатов поиска (может быть больше, чем количество строк в данном + ответе)
    UL ## server_time ## текущее время на сервере (должно + использоваться для вычисления возраста). Формат времени: Количество + секунд с 00:00:00 1 января 1970 года.
    LPS, LPS, ... ## fields ## + названия полей текущей анкеты (всего fields_num штук)
    LPS, LPS, ... + ## values ## значения полей анкеты для каждого найденного по запросу + пользователя в том же порядке, что в списке полей, по fields_num штук на + каждого

    +

    Описание: Результат поиска контактов. Возвращает + анкеты найденных пользователей (их адреса являются полями анкеты).

    +
  • Пакет: Количество писем в почтовом ящике +

    Имя пакета: MRIM_CS_MAILBOX_STATUS
    Тип пакета: + sc
    Параметры:

    +

    UL ## status ## количество непрочитанных писем

    +

    Описание: Приходит при получении новой почты или + любом другом изменении числа непрочитанных писем в ящике.

    +
  • Пакет: Контакт-лист +

    Имя пакета: MRIM_CS_CONTACT_LIST2
    Тип пакета: + sc
    Параметры:

    +

    UL ## status ## результат запроса контакт-листа

    +

    GET_CONTACTS_OK ## поиск + выполнен успешно
    GET_CONTACTS_ERROR ## найденный контакт-лист + некорректен
    GET_CONTACTS_INTERR ## произошла внутренняя ошибка

    +

    UL ## groups_number ## количество групп в + контакт-листе
    LPS ## group_mask ## маска-описание группы, состоит из + символов 's' (LPS),'u' (UL),'z' (строка оканчивающаяся бинарным нулем, в + данный момент не используется), сейчас "us" - флаги и название, при + расширении описания старые поля сохранят свое расположение
    LPS ## + contacts_mask ## маска-описание пользователя (синтаксис такой же как и у + group_mask), сейчас uussuu (флаги, группа, адрес, ник, серверные флаги, + текущий статус в сети)
    ## groups ## группы (всего groups_number + штук)
    ## contacts ## контакты

    +

    Описание: Контакт-лист пользователя хранится на + сервере. Клиент может хранить локальную копию контакт-листа, но + серверная должна иметь приоритет. Флаги контакта имеют тот же смысл, что + в MRIM_CS_ADD_CONTACT, статус - тот же смысл, что в + MRIM_CS_USER_STATUS. Серверный флаг в данный момент + определён один - CONTACT_INTFLAG_NOT_AUTHORIZED + означает, что контакт еще не авторизовал пользователя и находится в + группе "Жду авторизации". Если маска контакта или группы содержит больше + символов, чем необходимо, клиент должен прочитать значения этих полей и + проигнорировать их.

    +
  • Пакет: Авторизация +

    Имя пакета: MRIM_CS_LOGIN2
    Тип пакета: + cs
    Параметры:

    +

    LPS ## login ## email авторизующегося пользователя
    LPS + ## password ## пароль
    UL ## status ## статус (см. + MRIM_CS_CHANGE_STATUS)
    LPS ## user_agent ## текстовое описание + клиента пользователя, например "Mail.Ru Miranda Plugin v + 1.0"


+ + + +
+

+ + diff --git a/MRA/Docs/MraPlaces.h b/MRA/Docs/MraPlaces.h new file mode 100644 index 0000000..b51e415 --- /dev/null +++ b/MRA/Docs/MraPlaces.h @@ -0,0 +1,3174 @@ +#if !defined(AFX_MRA_PLACES_H__INCLUDED_) +#define AFX_MRA_PLACES_H__INCLUDED_ + + + +typedef struct +{ + DWORD dwCountryID; + DWORD dwCityID; + DWORD dwPlaceID; + LPWSTR lpszData; +} MRA_PLACE; + + + +MRA_PLACE mrapPlaces[]= +{ + {24, 0, 0, L"Россия"}, + {81, 0, 0, L"Азербайджан"}, + {82, 0, 0, L"Армения"}, + {97, 0, 0, L"Афганистан"}, + {96, 0, 0, L"Бангладеш"}, + {99, 0, 0, L"Бахрейн"}, + {100, 0, 0, L"Бруней-Даруссалам"}, + {101, 0, 0, L"Бутан"}, + {102, 0, 0, L"Вьетнам"}, + {83, 0, 0, L"Грузия"}, + {86, 0, 0, L"Израиль"}, + {95, 0, 0, L"Индия"}, + {103, 0, 0, L"Индонезия"}, + {79, 0, 0, L"Иордания"}, + {85, 0, 0, L"Ирак"}, + {87, 0, 0, L"Иран"}, + {104, 0, 0, L"Йемен"}, + {84, 0, 0, L"Казахстан"}, + {105, 0, 0, L"Камбоджа"}, + {106, 0, 0, L"Катар"}, + {107, 0, 0, L"Кипр"}, + {92, 0, 0, L"Киргизия (Кыргызстан)"}, + {76, 0, 0, L"Китай"}, + {3215, 0, 0, L"Кокосовые острова (Австр.)"}, + {29, 0, 0, L"Корея (КНДР)"}, + {108, 0, 0, L"Корея"}, + {88, 0, 0, L"Кувейт"}, + {109, 0, 0, L"Лаос"}, + {110, 0, 0, L"Ливан"}, + {111, 0, 0, L"Малайзия"}, + {112, 0, 0, L"Мальдивы"}, + {113, 0, 0, L"Монголия"}, + {114, 0, 0, L"Мьянма"}, + {115, 0, 0, L"Непал"}, + {116, 0, 0, L"Объединенные Арабские Эмираты"}, + {117, 0, 0, L"Оман"}, + {3216, 0, 0, L"Остров Рождества (Австр.)"}, + {122, 0, 0, L"Пакистан"}, + {89, 0, 0, L"Палестина"}, + {94, 0, 0, L"Саудовская Аравия"}, + {118, 0, 0, L"Сингапур"}, + {78, 0, 0, L"Сирия"}, + {91, 0, 0, L"Таджикистан"}, + {119, 0, 0, L"Таиланд"}, + {120, 0, 0, L"Тайвань"}, + {132, 0, 0, L"Тимор"}, + {90, 0, 0, L"Туркмения"}, + {77, 0, 0, L"Турция"}, + {93, 0, 0, L"Узбекистан"}, + {121, 0, 0, L"Филиппины"}, + {98, 0, 0, L"Шри Ланка"}, + {75, 0, 0, L"Япония"}, + {123, 0, 0, L"Австралия"}, + {454, 0, 0, L"Американское Самоа"}, + {124, 0, 0, L"Вануату"}, + {453, 0, 0, L"Гуам (США)"}, + {126, 0, 0, L"Кирибати"}, + {127, 0, 0, L"Маршалловы Острова"}, + {128, 0, 0, L"Микронезия (Федеративные Штаты Микронезии)"}, + {129, 0, 0, L"Науру"}, + {3220, 0, 0, L"Ниуэ (Н.Зел.)"}, + {130, 0, 0, L"Новая Зеландия"}, + {3218, 0, 0, L"Новая Каледония (Фр.)"}, + {3221, 0, 0, L"Острова Кука (Н.Зел.)"}, + {3230, 0, 0, L"Острова Херд и Макдональд (Австр.)"}, + {131, 0, 0, L"Палау"}, + {133, 0, 0, L"Папуа - Новая Гвинея"}, + {3222, 0, 0, L"Питкерн (Брит.)"}, + {125, 0, 0, L"Самоа"}, + {3219, 0, 0, L"Сев. Марианские острова (США)"}, + {134, 0, 0, L"Соломоновы Острова"}, + {3223, 0, 0, L"Токелау (Н.Зел.)"}, + {135, 0, 0, L"Тонга"}, + {136, 0, 0, L"Тувалу"}, + {3224, 0, 0, L"Уоллис и Футуна острова (Фр.)"}, + {137, 0, 0, L"Фиджи"}, + {3226, 0, 0, L"Французская Полинезия"}, + {3225, 0, 0, L"Французские Южные территории"}, + {138, 0, 0, L"Канада"}, + {139, 0, 0, L"США"}, + {3200, 0, 0, L"Ангилья (Брит.)"}, + {140, 0, 0, L"Антигуа и Барбуда"}, + {141, 0, 0, L"Аргентина"}, + {3202, 0, 0, L"Аруба (Нид.)"}, + {142, 0, 0, L"Багамы"}, + {143, 0, 0, L"Барбадос"}, + {146, 0, 0, L"Белиз"}, + {3203, 0, 0, L"Бермуды (Брит.)"}, + {144, 0, 0, L"Боливия"}, + {145, 0, 0, L"Бразилия"}, + {147, 0, 0, L"Венесуэла"}, + {3204, 0, 0, L"Виргинские острова (Брит.)"}, + {452, 0, 0, L"Виргинские острова (США)"}, + {149, 0, 0, L"Гаити"}, + {148, 0, 0, L"Гайана"}, + {3205, 0, 0, L"Гваделупа (Фр.)"}, + {173, 0, 0, L"Гватемала"}, + {150, 0, 0, L"Гондурас"}, + {151, 0, 0, L"Гренада"}, + {152, 0, 0, L"Гренландия (Дат.)"}, + {153, 0, 0, L"Доминика"}, + {154, 0, 0, L"Доминиканская Республика"}, + {155, 0, 0, L"Колумбия"}, + {156, 0, 0, L"Коста-Рика"}, + {157, 0, 0, L"Куба"}, + {3208, 0, 0, L"Мартиника (Фр.)"}, + {158, 0, 0, L"Мексика"}, + {3209, 0, 0, L"Монтсеррат (Брит)"}, + {3201, 0, 0, L"Нидерландские Антилы"}, + {159, 0, 0, L"Никарагуа"}, + {3207, 0, 0, L"Остров Кайман (Брит.)"}, + {3211, 0, 0, L"Острова Теркс и Кайкос (Брит.)"}, + {160, 0, 0, L"Панама"}, + {161, 0, 0, L"Парагвай"}, + {162, 0, 0, L"Перу"}, + {163, 0, 0, L"Сальвадор"}, + {164, 0, 0, L"Сент-Винсент и Гренадины"}, + {165, 0, 0, L"Сент-Китс и Невис"}, + {166, 0, 0, L"Сент-Люсия"}, + {3210, 0, 0, L"Сент-Пьер и Микелон (Фр.)"}, + {167, 0, 0, L"Суринам"}, + {168, 0, 0, L"Тринидат и Тобаго"}, + {169, 0, 0, L"Уругвай"}, + {3212, 0, 0, L"Фолклендские острова (Брит.)"}, + {3206, 0, 0, L"Французская Гвиана"}, + {170, 0, 0, L"Чили"}, + {171, 0, 0, L"Эквадор"}, + {3213, 0, 0, L"Юж. Джорджия и Юж. Сандвичевы о-ва (Брит.)"}, + {172, 0, 0, L"Ямайка"}, + {174, 0, 0, L"Алжир"}, + {175, 0, 0, L"Ангола"}, + {176, 0, 0, L"Бенин"}, + {177, 0, 0, L"Ботсвана"}, + {3228, 0, 0, L"Британская территория в Индийском океане"}, + {178, 0, 0, L"Буркина-Фасо"}, + {179, 0, 0, L"Бурунди"}, + {180, 0, 0, L"Габон"}, + {181, 0, 0, L"Гамбия"}, + {182, 0, 0, L"Гана"}, + {183, 0, 0, L"Гвинея"}, + {184, 0, 0, L"Гвинея-Бисау"}, + {185, 0, 0, L"Джибути"}, + {186, 0, 0, L"Египет"}, + {187, 0, 0, L"Замбия"}, + {3198, 0, 0, L"Зап. Сахара"}, + {23, 0, 0, L"Зимбабве"}, + {188, 0, 0, L"Кабо-Верде"}, + {189, 0, 0, L"Камерун"}, + {190, 0, 0, L"Кения"}, + {191, 0, 0, L"Коморы"}, + {193, 0, 0, L"Конго (Заир)"}, + {192, 0, 0, L"Конго"}, + {194, 0, 0, L"Кот-д`Ивуар"}, + {195, 0, 0, L"Лесото"}, + {196, 0, 0, L"Либерия"}, + {197, 0, 0, L"Ливия"}, + {198, 0, 0, L"Маврикий"}, + {199, 0, 0, L"Мавритания"}, + {200, 0, 0, L"Мадагаскар"}, + {3229, 0, 0, L"Майотт (Фр.)"}, + {201, 0, 0, L"Малави"}, + {202, 0, 0, L"Мали"}, + {203, 0, 0, L"Марокко"}, + {204, 0, 0, L"Мозамбик"}, + {205, 0, 0, L"Намибия"}, + {206, 0, 0, L"Нигер"}, + {207, 0, 0, L"Нигерия"}, + {3227, 0, 0, L"Остров Буве (Норв.)"}, + {3197, 0, 0, L"Реюньон (Фр.)"}, + {208, 0, 0, L"Руанда"}, + {209, 0, 0, L"Сан-Томе и Принсипи"}, + {210, 0, 0, L"Свазиленд"}, + {3199, 0, 0, L"Святая Елена (Брит.)"}, + {211, 0, 0, L"Сейшелы"}, + {212, 0, 0, L"Сенегал"}, + {213, 0, 0, L"Сомали"}, + {214, 0, 0, L"Судан"}, + {215, 0, 0, L"Сьерра-Леоне"}, + {216, 0, 0, L"Танзания"}, + {217, 0, 0, L"Того"}, + {218, 0, 0, L"Тунис"}, + {219, 0, 0, L"Уганда"}, + {220, 0, 0, L"Центральноафриканская Республика"}, + {222, 0, 0, L"Чад"}, + {223, 0, 0, L"Экваториальная Гвинея"}, + {221, 0, 0, L"Эритрея"}, + {224, 0, 0, L"Эфиопия"}, + {225, 0, 0, L"Южно-Африканская Республика (ЮАР)"}, + {39, 0, 0, L"Украина"}, + {40, 0, 0, L"Австрия"}, + {32, 0, 0, L"Албания"}, + {33, 0, 0, L"Андорра"}, + {340, 0, 0, L"Белоруссия"}, + {38, 0, 0, L"Бельгия"}, + {41, 0, 0, L"Болгария"}, + {42, 0, 0, L"Босния и Герцеговина"}, + {43, 0, 0, L"Ватикан"}, + {45, 0, 0, L"Великобритания"}, + {44, 0, 0, L"Венгрия"}, + {46, 0, 0, L"Германия"}, + {3193, 0, 0, L"Гернси (Брит.)"}, + {47, 0, 0, L"Гибралтар (Брит.)"}, + {48, 0, 0, L"Греция"}, + {49, 0, 0, L"Дания"}, + {3194, 0, 0, L"Джерси (Брит.)"}, + {50, 0, 0, L"Ирландия"}, + {51, 0, 0, L"Исландия"}, + {34, 0, 0, L"Испания"}, + {52, 0, 0, L"Италия"}, + {53, 0, 0, L"Латвия"}, + {54, 0, 0, L"Литва"}, + {55, 0, 0, L"Лихтенштейн"}, + {56, 0, 0, L"Люксембург"}, + {57, 0, 0, L"Македония"}, + {58, 0, 0, L"Мальта"}, + {59, 0, 0, L"Молдавия"}, + {36, 0, 0, L"Монако"}, + {60, 0, 0, L"Нидерланды"}, + {61, 0, 0, L"Норвегия"}, + {3195, 0, 0, L"Остров Мэн (Брит.)"}, + {62, 0, 0, L"Польша"}, + {35, 0, 0, L"Португалия"}, + {63, 0, 0, L"Румыния"}, + {64, 0, 0, L"Сан-Марино"}, + {74, 0, 0, L"Сербия и Черногория"}, + {65, 0, 0, L"Словакия"}, + {66, 0, 0, L"Словения"}, + {67, 0, 0, L"Фарерские о-ва (Дания)"}, + {68, 0, 0, L"Финляндия"}, + {37, 0, 0, L"Франция"}, + {69, 0, 0, L"Хорватия"}, + {70, 0, 0, L"Чехия"}, + {71, 0, 0, L"Швейцария"}, + {72, 0, 0, L"Швеция"}, + {3196, 0, 0, L"Шпицберген (Норв.)"}, + {73, 0, 0, L"Эстония"}, + {24, 25, 0, L"Москва"}, + {24, 226, 0, L"Санкт-Петербург"}, + {24, 233, 0, L"Саха (Якутия)"}, + {24, 232, 0, L"Приморский край"}, + {24, 235, 0, L"Хабаровский край"}, + {24, 227, 0, L"Амурская обл."}, + {24, 229, 0, L"Камчатская обл."}, + {24, 231, 0, L"Магаданская обл."}, + {24, 234, 0, L"Сахалинская обл."}, + {24, 228, 0, L"Еврейская АО"}, + {24, 230, 0, L"Корякский АО"}, + {24, 236, 0, L"Чукотский АО"}, + {24, 237, 0, L"Башкортостан"}, + {24, 240, 0, L"Марий-Эл"}, + {24, 241, 0, L"Мордовия"}, + {24, 248, 0, L"Татарстан"}, + {24, 249, 0, L"Удмуртия"}, + {24, 251, 0, L"Чувашия"}, + {24, 238, 0, L"Кировская обл."}, + {24, 242, 0, L"Нижегородская обл."}, + {24, 243, 0, L"Оренбургская обл."}, + {24, 244, 0, L"Пензенская обл."}, + {24, 245, 0, L"Пермская обл."}, + {24, 246, 0, L"Самарская обл."}, + {24, 247, 0, L"Саратовская обл."}, + {24, 250, 0, L"Ульяновская обл."}, + {24, 239, 0, L"Коми-Пермяцкий АО"}, + {24, 255, 0, L"Карелия"}, + {24, 256, 0, L"Коми"}, + {24, 252, 0, L"Архангельская обл."}, + {24, 253, 0, L"Вологодская обл."}, + {24, 254, 0, L"Калининградская обл."}, + {24, 257, 0, L"Ленинградская обл."}, + {24, 258, 0, L"Мурманская обл."}, + {24, 260, 0, L"Новгородская обл."}, + {24, 261, 0, L"Псковская обл."}, + {24, 259, 0, L"Ненецкий АО"}, + {24, 265, 0, L"Бурятия"}, + {24, 263, 0, L"Республика Алтай"}, + {24, 273, 0, L"Тыва"}, + {24, 275, 0, L"Хакасия"}, + {24, 264, 0, L"Алтайский край"}, + {24, 268, 0, L"Красноярский край"}, + {24, 266, 0, L"Иркутская обл."}, + {24, 267, 0, L"Кемеровская обл."}, + {24, 269, 0, L"Новосибирская обл."}, + {24, 270, 0, L"Омская обл."}, + {24, 272, 0, L"Томская обл."}, + {24, 276, 0, L"Читинская обл."}, + {24, 262, 0, L"Агинский Бурятский АО"}, + {24, 271, 0, L"Таймырский АО"}, + {24, 274, 0, L"Усть-Ордынский Бурятский АО"}, + {24, 277, 0, L"Эвенкийский АО"}, + {24, 278, 0, L"Курганская обл."}, + {24, 279, 0, L"Свердловская обл."}, + {24, 280, 0, L"Тюменская обл."}, + {24, 282, 0, L"Челябинская обл."}, + {24, 281, 0, L"Ханты-Мансийский АО - Югра"}, + {24, 283, 0, L"Ямало-Ненецкий АО"}, + {24, 284, 0, L"Белгородская обл."}, + {24, 285, 0, L"Брянская обл."}, + {24, 286, 0, L"Владимирская обл."}, + {24, 287, 0, L"Воронежская обл."}, + {24, 288, 0, L"Ивановская обл."}, + {24, 289, 0, L"Калужская обл."}, + {24, 290, 0, L"Костромская обл."}, + {24, 291, 0, L"Курская обл."}, + {24, 292, 0, L"Липецкая обл."}, + {24, 293, 0, L"Московская обл."}, + {24, 294, 0, L"Орловская обл."}, + {24, 295, 0, L"Рязанская обл."}, + {24, 296, 0, L"Смоленская обл."}, + {24, 297, 0, L"Тамбовская обл."}, + {24, 298, 0, L"Тверская обл."}, + {24, 299, 0, L"Тульская обл."}, + {24, 300, 0, L"Ярославская обл."}, + {24, 301, 0, L"Адыгея"}, + {24, 304, 0, L"Дагестан"}, + {24, 305, 0, L"Ингушетия"}, + {24, 306, 0, L"Кабардино-Балкария"}, + {24, 307, 0, L"Калмыкия"}, + {24, 308, 0, L"Карачаево-Черкессия"}, + {24, 311, 0, L"Северная Осетия - Алания"}, + {24, 313, 0, L"Чечня"}, + {24, 309, 0, L"Краснодарский край"}, + {24, 312, 0, L"Ставропольский край"}, + {24, 302, 0, L"Астраханская обл."}, + {24, 303, 0, L"Волгоградская обл."}, + {24, 310, 0, L"Ростовская обл."}, + {81, 1055, 0, L"Баку"}, + {81, 1058, 0, L"Гянджа"}, + {81, 1056, 0, L"Нахичевань"}, + {81, 1057, 0, L"Ханкенди"}, + {81, 3153, 0, L"Шеки"}, + {81, 2291, 0, L"Другое"}, + {82, 2932, 0, L"Абовян"}, + {82, 1060, 0, L"Аштарак"}, + {82, 3084, 0, L"Ванадзор"}, + {82, 3011, 0, L"Гюмри"}, + {82, 3306, 0, L"Дилижан"}, + {82, 1059, 0, L"Ереван"}, + {82, 3145, 0, L"Ханкенди"}, + {82, 2292, 0, L"Другое"}, + {97, 1061, 0, L"Кабул"}, + {97, 2293, 0, L"Другое"}, + {96, 1062, 0, L"Дакка"}, + {96, 2294, 0, L"Другое"}, + {99, 1063, 0, L"Манама"}, + {99, 2295, 0, L"Другое"}, + {100, 1064, 0, L"Бандар-Сери-Бегаван"}, + {100, 2296, 0, L"Другое"}, + {101, 1065, 0, L"Тхимпху"}, + {101, 2297, 0, L"Другое"}, + {102, 1066, 0, L"Ханой"}, + {102, 2298, 0, L"Другое"}, + {83, 1067, 0, L"Батуми"}, + {83, 3158, 0, L"Боржоми"}, + {83, 1068, 0, L"Поти"}, + {83, 3129, 0, L"Рустави"}, + {83, 1069, 0, L"Сухуми"}, + {83, 1070, 0, L"Тбилиси"}, + {83, 2299, 0, L"Другое"}, + {86, 3345, 0, L"Ариэль"}, + {86, 1071, 0, L"Афула"}, + {86, 2992, 0, L"Ашдод"}, + {86, 3175, 0, L"Ашкелон"}, + {86, 3363, 0, L"Бат-Ям"}, + {86, 2884, 0, L"Беер-Яков"}, + {86, 3243, 0, L"Бейт-Шемеш"}, + {86, 1074, 0, L"Беэр-Шева"}, + {86, 3348, 0, L"Герцелия"}, + {86, 3241, 0, L"Димона"}, + {86, 1075, 0, L"Иерусалим"}, + {86, 3350, 0, L"Йокнеам-Иллит"}, + {86, 2982, 0, L"Кармиэль"}, + {86, 2971, 0, L"Кфар-Саба"}, + {86, 3136, 0, L"Назарет"}, + {86, 1080, 0, L"Натания"}, + {86, 3303, 0, L"Офаким"}, + {86, 3050, 0, L"Раанана"}, + {86, 3151, 0, L"Рамат Ган"}, + {86, 3141, 0, L"Реховот"}, + {86, 3012, 0, L"Ришон ле Цион"}, + {86, 1081, 0, L"Тверия"}, + {86, 1077, 0, L"Тель-Авив"}, + {86, 1079, 0, L"Хадера"}, + {86, 1078, 0, L"Хайфа"}, + {86, 1076, 0, L"Хеврон"}, + {86, 2929, 0, L"Цфат"}, + {86, 2928, 0, L"Эйлат"}, + {86, 2300, 0, L"Другое"}, + {95, 3315, 0, L"Бангалор"}, + {95, 1082, 0, L"Дели"}, + {95, 1083, 0, L"Джайпур"}, + {95, 3144, 0, L"Калькутта"}, + {95, 3025, 0, L"Мумбаи"}, + {95, 3277, 0, L"Панаджи"}, + {95, 1084, 0, L"Ченнаи"}, + {95, 2301, 0, L"Другое"}, + {103, 1085, 0, L"Джакарта"}, + {103, 2302, 0, L"Другое"}, + {79, 1086, 0, L"Амман"}, + {79, 2303, 0, L"Другое"}, + {85, 1087, 0, L"Багдад"}, + {85, 2304, 0, L"Другое"}, + {87, 1088, 0, L"Тегеран"}, + {87, 2305, 0, L"Другое"}, + {104, 1089, 0, L"Сана"}, + {104, 2306, 0, L"Другое"}, + {84, 1090, 0, L"Актау"}, + {84, 1091, 0, L"Актюбинск"}, + {84, 1092, 0, L"Алма-Ата"}, + {84, 3242, 0, L"Аршалы"}, + {84, 1093, 0, L"Астана"}, + {84, 1094, 0, L"Атырау (Гурьев)"}, + {84, 1095, 0, L"Байконур"}, + {84, 3245, 0, L"Балхаш"}, + {84, 3083, 0, L"Жезказган"}, + {84, 1096, 0, L"Капчагай"}, + {84, 1097, 0, L"Караганда"}, + {84, 1098, 0, L"Кокшетау"}, + {84, 1099, 0, L"Кустанай"}, + {84, 2868, 0, L"Лисаковск"}, + {84, 1100, 0, L"Павлодар"}, + {84, 1101, 0, L"Петропавловск (Сев.-Каз. обл.)"}, + {84, 1102, 0, L"Рудный"}, + {84, 1103, 0, L"Семипалатинск"}, + {84, 1104, 0, L"Степногорск"}, + {84, 3166, 0, L"Талгар"}, + {84, 1105, 0, L"Талды-Курган"}, + {84, 2927, 0, L"Тараз"}, + {84, 1106, 0, L"Темиртау"}, + {84, 1107, 0, L"Уральск"}, + {84, 1108, 0, L"Усть-Каменогорск"}, + {84, 1109, 0, L"Чимкент"}, + {84, 1110, 0, L"Экибастуз"}, + {84, 2307, 0, L"Другое"}, + {105, 1111, 0, L"Пномпень"}, + {105, 2308, 0, L"Другое"}, + {106, 1112, 0, L"Доха"}, + {106, 2309, 0, L"Другое"}, + {107, 1113, 0, L"Ларнака"}, + {107, 1114, 0, L"Лимассол"}, + {107, 1115, 0, L"Никосия"}, + {107, 2954, 0, L"Пафос"}, + {107, 2310, 0, L"Другое"}, + {92, 1116, 0, L"Бишкек"}, + {92, 1117, 0, L"Джалал-Абад"}, + {92, 3027, 0, L"Кара-Балта"}, + {92, 1118, 0, L"Каракол"}, + {92, 1119, 0, L"Ош"}, + {92, 1120, 0, L"Талас"}, + {92, 2933, 0, L"Хайдаркен"}, + {92, 2311, 0, L"Другое"}, + {76, 3214, 0, L"Аомынь (Макао)"}, + {76, 1121, 0, L"Гонконг"}, + {76, 2869, 0, L"Гуанчжоу"}, + {76, 3262, 0, L"Далянь"}, + {76, 1122, 0, L"Пекин"}, + {76, 1123, 0, L"Харбин"}, + {76, 1124, 0, L"Шанхай"}, + {76, 3043, 0, L"Шеньян"}, + {76, 2312, 0, L"Другое"}, + {29, 1125, 0, L"Пхеньян"}, + {29, 2313, 0, L"Другое"}, + {108, 1126, 0, L"Сеул"}, + {108, 3240, 0, L"Тейджон"}, + {108, 2314, 0, L"Другое"}, + {88, 1127, 0, L"Эль-Кувейт"}, + {88, 2315, 0, L"Другое"}, + {109, 1128, 0, L"Вьентьян"}, + {109, 2316, 0, L"Другое"}, + {110, 1129, 0, L"Бейрут"}, + {110, 2317, 0, L"Другое"}, + {111, 1130, 0, L"Джохор-Бару"}, + {111, 1131, 0, L"Куала-Лумпур"}, + {111, 2318, 0, L"Другое"}, + {112, 1132, 0, L"Мале"}, + {112, 2319, 0, L"Другое"}, + {113, 1133, 0, L"Улан-Батор"}, + {113, 1134, 0, L"Эрдэнэт"}, + {113, 2320, 0, L"Другое"}, + {114, 1135, 0, L"Янгон"}, + {114, 2321, 0, L"Другое"}, + {115, 1136, 0, L"Катманду"}, + {115, 2322, 0, L"Другое"}, + {116, 1137, 0, L"Абу-Даби"}, + {116, 1138, 0, L"Дубай"}, + {116, 1139, 0, L"Шарджа"}, + {116, 2323, 0, L"Другое"}, + {117, 1140, 0, L"Маскат"}, + {117, 2324, 0, L"Другое"}, + {122, 1141, 0, L"Исламабад"}, + {122, 2325, 0, L"Другое"}, + {89, 1072, 0, L"Ашдод"}, + {89, 1073, 0, L"Ашкелон"}, + {89, 1142, 0, L"Газа"}, + {89, 2326, 0, L"Другое"}, + {94, 3250, 0, L"Медина"}, + {94, 1143, 0, L"Эр-Рияд"}, + {94, 2327, 0, L"Другое"}, + {78, 1144, 0, L"Дамаск"}, + {78, 2328, 0, L"Другое"}, + {91, 1145, 0, L"Душанбе"}, + {91, 3307, 0, L"Кайраккум"}, + {91, 3308, 0, L"Худжанд"}, + {91, 2329, 0, L"Другое"}, + {119, 1146, 0, L"Бангкок"}, + {119, 1147, 0, L"Пхукет"}, + {119, 2330, 0, L"Другое"}, + {120, 1148, 0, L"Тайбэй"}, + {120, 2331, 0, L"Другое"}, + {132, 1149, 0, L"Дили"}, + {132, 2332, 0, L"Другое"}, + {90, 1150, 0, L"Ашхабад"}, + {90, 3079, 0, L"Безмеин"}, + {90, 2333, 0, L"Другое"}, + {77, 1152, 0, L"Анкара"}, + {77, 1153, 0, L"Анталия"}, + {77, 3080, 0, L"Бурса"}, + {77, 1151, 0, L"Мармарис"}, + {77, 1154, 0, L"Стамбул"}, + {77, 1155, 0, L"Трабзон"}, + {77, 2334, 0, L"Другое"}, + {93, 3362, 0, L"Алмалык"}, + {93, 3137, 0, L"Андижан"}, + {93, 3273, 0, L"Асака"}, + {93, 1156, 0, L"Ахангаран"}, + {93, 1157, 0, L"Бухара"}, + {93, 3167, 0, L"Джизак"}, + {93, 3347, 0, L"Кунград"}, + {93, 1158, 0, L"Навои"}, + {93, 1159, 0, L"Наманган"}, + {93, 1160, 0, L"Самарканд"}, + {93, 1161, 0, L"Ташкент"}, + {93, 1162, 0, L"Ургенч"}, + {93, 1163, 0, L"Фергана"}, + {93, 1164, 0, L"Чирчик"}, + {93, 2335, 0, L"Другое"}, + {121, 1165, 0, L"Манила"}, + {121, 3319, 0, L"Себу"}, + {121, 2336, 0, L"Другое"}, + {98, 1166, 0, L"Коломбо"}, + {98, 2337, 0, L"Другое"}, + {75, 3176, 0, L"Исесаки"}, + {75, 3339, 0, L"Корияма"}, + {75, 1167, 0, L"Саппоро"}, + {75, 1168, 0, L"Токио"}, + {75, 2338, 0, L"Другое"}, + {123, 1914, 0, L"Аделаида"}, + {123, 2957, 0, L"Блэк Рок"}, + {123, 1915, 0, L"Брисбен"}, + {123, 3331, 0, L"Горокан"}, + {123, 1916, 0, L"Канберра"}, + {123, 3001, 0, L"Лидкомб"}, + {123, 1917, 0, L"Мельбурн"}, + {123, 3217, 0, L"Норфолк"}, + {123, 3064, 0, L"Перт"}, + {123, 3020, 0, L"Санта Люсиа"}, + {123, 1918, 0, L"Сидней"}, + {123, 3238, 0, L"Энеабба"}, + {123, 2339, 0, L"Другое"}, + {454, 1192, 0, L"Паго-Паго"}, + {454, 2366, 0, L"Другое"}, + {124, 1919, 0, L"Порт-Вила"}, + {124, 2340, 0, L"Другое"}, + {453, 1193, 0, L"Аганья"}, + {453, 2368, 0, L"Другое"}, + {126, 1921, 0, L"Баирики"}, + {126, 2342, 0, L"Другое"}, + {127, 1922, 0, L"Маджуро"}, + {127, 2343, 0, L"Другое"}, + {128, 1923, 0, L"Паликир"}, + {128, 2344, 0, L"Другое"}, + {129, 1924, 0, L"Ярен"}, + {129, 2345, 0, L"Другое"}, + {130, 1925, 0, L"Веллингтон"}, + {130, 1926, 0, L"Гамильтон"}, + {130, 1928, 0, L"Данидин"}, + {130, 1929, 0, L"Крайстчерч"}, + {130, 3235, 0, L"Кромвель"}, + {130, 1927, 0, L"Окленд"}, + {130, 3323, 0, L"Тауранга"}, + {130, 2346, 0, L"Другое"}, + {131, 1930, 0, L"Корор"}, + {131, 2347, 0, L"Другое"}, + {133, 1931, 0, L"Порт-Морсби"}, + {133, 2348, 0, L"Другое"}, + {125, 1920, 0, L"Апиа"}, + {125, 2341, 0, L"Другое"}, + {134, 1932, 0, L"Хониара"}, + {134, 2349, 0, L"Другое"}, + {135, 1933, 0, L"Нукуалофа"}, + {135, 2350, 0, L"Другое"}, + {136, 1934, 0, L"Фунафути"}, + {136, 2351, 0, L"Другое"}, + {137, 1935, 0, L"Сува"}, + {137, 2352, 0, L"Другое"}, + {138, 3055, 0, L"Барлингтон"}, + {138, 3049, 0, L"Броссард"}, + {138, 3330, 0, L"Бурнаби"}, + {138, 1169, 0, L"Ванкувер"}, + {138, 3106, 0, L"Ватерлоо"}, + {138, 1170, 0, L"Виннипег"}, + {138, 1171, 0, L"Галифакс"}, + {138, 1172, 0, L"Гамильтон"}, + {138, 3365, 0, L"Денвер"}, + {138, 1173, 0, L"Калгари"}, + {138, 3104, 0, L"Камлупс"}, + {138, 3366, 0, L"Каннингтон"}, + {138, 1174, 0, L"Квебек"}, + {138, 2964, 0, L"Кингстон"}, + {138, 3113, 0, L"Коквитлам"}, + {138, 1175, 0, L"Монреаль"}, + {138, 2920, 0, L"Ниагара-Фолс"}, + {138, 2889, 0, L"Норд-Йорк"}, + {138, 1176, 0, L"Оттава"}, + {138, 2903, 0, L"Порт Алберни"}, + {138, 1177, 0, L"Ричмонд"}, + {138, 1178, 0, L"Тимминс"}, + {138, 2946, 0, L"Торнхилл"}, + {138, 1179, 0, L"Торонто"}, + {138, 1180, 0, L"Эдмонтон"}, + {138, 2353, 0, L"Другое"}, + {139, 407, 0, L"Вашингтон"}, + {139, 426, 0, L"Айдахо"}, + {139, 378, 0, L"Айова"}, + {139, 412, 0, L"Алабама"}, + {139, 446, 0, L"Аляска"}, + {139, 434, 0, L"Аризона"}, + {139, 416, 0, L"Арканзас"}, + {139, 428, 0, L"Вайоминг"}, + {139, 440, 0, L"Вашингтон"}, + {139, 352, 0, L"Вермонт"}, + {139, 394, 0, L"Виргиния"}, + {139, 374, 0, L"Висконсин"}, + {139, 448, 0, L"Гавайи"}, + {139, 390, 0, L"Делавер"}, + {139, 402, 0, L"Джорджия"}, + {139, 396, 0, L"Западная Виргиния"}, + {139, 370, 0, L"Иллинойс"}, + {139, 368, 0, L"Индиана"}, + {139, 444, 0, L"Калифорния"}, + {139, 388, 0, L"Канзас"}, + {139, 408, 0, L"Кентукки"}, + {139, 430, 0, L"Колорадо"}, + {139, 358, 0, L"Коннектикут"}, + {139, 418, 0, L"Луизиана"}, + {139, 354, 0, L"Массачусетс"}, + {139, 376, 0, L"Миннесота"}, + {139, 414, 0, L"Миссисипи"}, + {139, 380, 0, L"Миссури"}, + {139, 372, 0, L"Мичиган"}, + {139, 424, 0, L"Монтана"}, + {139, 348, 0, L"Мэн"}, + {139, 392, 0, L"Мэриленд"}, + {139, 386, 0, L"Небраска"}, + {139, 438, 0, L"Невада"}, + {139, 362, 0, L"Нью-Джерси"}, + {139, 360, 0, L"Нью-Йорк"}, + {139, 432, 0, L"Нью-Мексико"}, + {139, 350, 0, L"Нью-Хэмпшир"}, + {139, 366, 0, L"Огайо"}, + {139, 420, 0, L"Оклахома"}, + {139, 442, 0, L"Орегон"}, + {139, 364, 0, L"Пенсильвания"}, + {139, 450, 0, L"Пуэрто-Рико"}, + {139, 356, 0, L"Род-Айленд"}, + {139, 382, 0, L"Северная Дакота"}, + {139, 398, 0, L"Северная Каролина"}, + {139, 410, 0, L"Теннесси"}, + {139, 422, 0, L"Техас"}, + {139, 406, 0, L"Федеральный округ Колумбия"}, + {139, 404, 0, L"Флорида"}, + {139, 384, 0, L"Южная Дакота"}, + {139, 400, 0, L"Южная Каролина"}, + {139, 436, 0, L"Юта"}, + {140, 1238, 0, L"Сент-Джонс"}, + {140, 2442, 0, L"Другое"}, + {141, 1239, 0, L"Буэнос-Айрес"}, + {141, 2441, 0, L"Другое"}, + {142, 1240, 0, L"Нассау"}, + {142, 2440, 0, L"Другое"}, + {143, 1241, 0, L"Бриджтаун"}, + {143, 2439, 0, L"Другое"}, + {146, 1242, 0, L"Бельмопан"}, + {146, 2438, 0, L"Другое"}, + {144, 1243, 0, L"Ла-Пас"}, + {144, 2437, 0, L"Другое"}, + {145, 1244, 0, L"Бразилиа"}, + {145, 3094, 0, L"Пассо Фундо"}, + {145, 1245, 0, L"Рио-де-Жанейро"}, + {145, 1246, 0, L"Сан-Паулу"}, + {145, 2436, 0, L"Другое"}, + {147, 1247, 0, L"Каракас"}, + {147, 2435, 0, L"Другое"}, + {452, 1190, 0, L"Шарлотта-Амалия"}, + {452, 2364, 0, L"Другое"}, + {149, 1248, 0, L"Порт-о-Пренс"}, + {149, 2434, 0, L"Другое"}, + {148, 1249, 0, L"Джоржтаун"}, + {148, 2433, 0, L"Другое"}, + {173, 1250, 0, L"Гватемала"}, + {173, 2432, 0, L"Другое"}, + {150, 1251, 0, L"Тегусигальпа"}, + {150, 2431, 0, L"Другое"}, + {151, 1252, 0, L"Сент-Джорджес"}, + {151, 2430, 0, L"Другое"}, + {152, 1253, 0, L"Уманак"}, + {152, 2429, 0, L"Другое"}, + {153, 1254, 0, L"Розо"}, + {153, 2428, 0, L"Другое"}, + {154, 1255, 0, L"Санто-Доминго"}, + {154, 2427, 0, L"Другое"}, + {155, 1256, 0, L"Богота"}, + {155, 2426, 0, L"Другое"}, + {156, 1257, 0, L"Сан-Хосе"}, + {156, 2425, 0, L"Другое"}, + {157, 1258, 0, L"Гавана"}, + {157, 2424, 0, L"Другое"}, + {158, 1259, 0, L"Акапулько"}, + {158, 1260, 0, L"Мехико"}, + {158, 2423, 0, L"Другое"}, + {159, 1261, 0, L"Манагуа"}, + {159, 2422, 0, L"Другое"}, + {160, 1262, 0, L"Панама"}, + {160, 2421, 0, L"Другое"}, + {161, 1263, 0, L"Асунсьон"}, + {161, 2420, 0, L"Другое"}, + {162, 1264, 0, L"Лима"}, + {162, 2419, 0, L"Другое"}, + {163, 1265, 0, L"Сан-Сальвадор"}, + {163, 2418, 0, L"Другое"}, + {164, 1266, 0, L"Кингстаун"}, + {164, 2417, 0, L"Другое"}, + {165, 1267, 0, L"Бастер"}, + {165, 2416, 0, L"Другое"}, + {166, 1268, 0, L"Кастри"}, + {166, 2415, 0, L"Другое"}, + {167, 1269, 0, L"Парамарибо"}, + {167, 2414, 0, L"Другое"}, + {168, 1270, 0, L"Порт-оф-Спейн"}, + {168, 2413, 0, L"Другое"}, + {169, 1271, 0, L"Монтевидео"}, + {169, 2412, 0, L"Другое"}, + {170, 1272, 0, L"Сантьяго"}, + {170, 2411, 0, L"Другое"}, + {171, 1273, 0, L"Гуаякиль"}, + {171, 1274, 0, L"Кито"}, + {171, 2410, 0, L"Другое"}, + {172, 1275, 0, L"Кингстон"}, + {172, 2409, 0, L"Другое"}, + {174, 1854, 0, L"Алжир"}, + {174, 2495, 0, L"Другое"}, + {175, 1855, 0, L"Луанда"}, + {175, 2494, 0, L"Другое"}, + {176, 1856, 0, L"Котону"}, + {176, 1857, 0, L"Порто-Ново"}, + {176, 2493, 0, L"Другое"}, + {177, 1858, 0, L"Габороне"}, + {177, 2492, 0, L"Другое"}, + {178, 1859, 0, L"Уагадугу"}, + {178, 2491, 0, L"Другое"}, + {179, 1860, 0, L"Бужумбуру"}, + {179, 2490, 0, L"Другое"}, + {180, 1861, 0, L"Либревиль"}, + {180, 2489, 0, L"Другое"}, + {181, 1862, 0, L"Банжул"}, + {181, 2488, 0, L"Другое"}, + {182, 1863, 0, L"Аккра"}, + {182, 2487, 0, L"Другое"}, + {183, 1864, 0, L"Конакри"}, + {183, 2486, 0, L"Другое"}, + {184, 1865, 0, L"Бисау"}, + {184, 2485, 0, L"Другое"}, + {185, 1866, 0, L"Джибути"}, + {185, 2484, 0, L"Другое"}, + {186, 3312, 0, L"Дахаб"}, + {186, 1867, 0, L"Каир"}, + {186, 1868, 0, L"Хургада"}, + {186, 2483, 0, L"Другое"}, + {187, 1869, 0, L"Лусака"}, + {187, 2482, 0, L"Другое"}, + {23, 1870, 0, L"Хараре"}, + {23, 2481, 0, L"Другое"}, + {188, 1871, 0, L"Прая"}, + {188, 2480, 0, L"Другое"}, + {189, 1872, 0, L"Яунде"}, + {189, 2479, 0, L"Другое"}, + {190, 1873, 0, L"Найроби"}, + {190, 2478, 0, L"Другое"}, + {191, 1874, 0, L"Морони"}, + {191, 2477, 0, L"Другое"}, + {193, 1875, 0, L"Киншаса"}, + {193, 2476, 0, L"Другое"}, + {192, 1876, 0, L"Браззавиль"}, + {192, 2475, 0, L"Другое"}, + {194, 1877, 0, L"Ямусукро"}, + {194, 2474, 0, L"Другое"}, + {195, 1878, 0, L"Масеру"}, + {195, 2473, 0, L"Другое"}, + {196, 1879, 0, L"Монровия"}, + {196, 2472, 0, L"Другое"}, + {197, 1880, 0, L"Триполи"}, + {197, 2471, 0, L"Другое"}, + {198, 1881, 0, L"Порт-Луи"}, + {198, 2470, 0, L"Другое"}, + {199, 1882, 0, L"Нуакшот"}, + {199, 2469, 0, L"Другое"}, + {200, 1883, 0, L"Антананариву"}, + {200, 2468, 0, L"Другое"}, + {201, 1884, 0, L"Лилонгве"}, + {201, 2467, 0, L"Другое"}, + {202, 1885, 0, L"Бамако"}, + {202, 2466, 0, L"Другое"}, + {203, 1886, 0, L"Агадир"}, + {203, 1887, 0, L"Рабат"}, + {203, 2465, 0, L"Другое"}, + {204, 1888, 0, L"Мапуту"}, + {204, 2464, 0, L"Другое"}, + {205, 1889, 0, L"Виндхук"}, + {205, 2463, 0, L"Другое"}, + {206, 1890, 0, L"Ниамей"}, + {206, 2462, 0, L"Другое"}, + {207, 1891, 0, L"Абуджа"}, + {207, 2461, 0, L"Другое"}, + {208, 1892, 0, L"Кигали"}, + {208, 2460, 0, L"Другое"}, + {209, 1893, 0, L"Сан-Томе"}, + {209, 2459, 0, L"Другое"}, + {210, 1894, 0, L"Мбабане"}, + {210, 2458, 0, L"Другое"}, + {211, 1895, 0, L"Виктория"}, + {211, 2457, 0, L"Другое"}, + {212, 1896, 0, L"Дакар"}, + {212, 2456, 0, L"Другое"}, + {213, 1897, 0, L"Могадишо"}, + {213, 2455, 0, L"Другое"}, + {214, 1898, 0, L"Хартум"}, + {214, 2454, 0, L"Другое"}, + {215, 1899, 0, L"Фритаун"}, + {215, 2453, 0, L"Другое"}, + {216, 1900, 0, L"Дар-эс-Салам"}, + {216, 1901, 0, L"Додома"}, + {216, 2452, 0, L"Другое"}, + {217, 1902, 0, L"Ломе"}, + {217, 2451, 0, L"Другое"}, + {218, 1903, 0, L"Тунис"}, + {218, 2450, 0, L"Другое"}, + {219, 1904, 0, L"Кампала"}, + {219, 2449, 0, L"Другое"}, + {220, 1905, 0, L"Банги"}, + {220, 2448, 0, L"Другое"}, + {222, 1906, 0, L"Нджамена"}, + {222, 2447, 0, L"Другое"}, + {223, 1907, 0, L"Малабо"}, + {223, 2446, 0, L"Другое"}, + {221, 1908, 0, L"Асмэра"}, + {221, 2445, 0, L"Другое"}, + {224, 1909, 0, L"Аддис-Абеба"}, + {224, 2444, 0, L"Другое"}, + {225, 1910, 0, L"Дурбан"}, + {225, 1913, 0, L"Йоханнесбург"}, + {225, 1912, 0, L"Кейптаун"}, + {225, 3033, 0, L"Пайнтаун"}, + {225, 1911, 0, L"Претория"}, + {225, 2443, 0, L"Другое"}, + {39, 314, 0, L"Киев"}, + {39, 315, 0, L"Винницкая обл."}, + {39, 316, 0, L"Волынская обл."}, + {39, 317, 0, L"Днепропетровская обл."}, + {39, 318, 0, L"Донецкая обл."}, + {39, 319, 0, L"Житомирская обл."}, + {39, 320, 0, L"Закарпатская обл."}, + {39, 321, 0, L"Запорожская обл."}, + {39, 322, 0, L"Ивано-Франковская обл."}, + {39, 323, 0, L"Киевская обл."}, + {39, 324, 0, L"Кировоградская обл."}, + {39, 325, 0, L"Крым"}, + {39, 326, 0, L"Луганская обл."}, + {39, 327, 0, L"Львовская обл."}, + {39, 328, 0, L"Николаевская обл."}, + {39, 329, 0, L"Одесская обл."}, + {39, 330, 0, L"Полтавская обл."}, + {39, 331, 0, L"Ровенская обл."}, + {39, 332, 0, L"Сумская обл."}, + {39, 333, 0, L"Тернопольская обл."}, + {39, 334, 0, L"Харьковская обл."}, + {39, 335, 0, L"Херсонская обл."}, + {39, 336, 0, L"Хмельницкая обл."}, + {39, 337, 0, L"Черкасская обл."}, + {39, 338, 0, L"Черниговская обл."}, + {39, 339, 0, L"Черновицкая обл."}, + {40, 602, 0, L"Бад Халл"}, + {40, 604, 0, L"Брегенц"}, + {40, 603, 0, L"Вена"}, + {40, 608, 0, L"Грац"}, + {40, 606, 0, L"Зальцбург"}, + {40, 3099, 0, L"Зель-ам-Зее"}, + {40, 605, 0, L"Инсбрук"}, + {40, 3174, 0, L"Кирхберг"}, + {40, 609, 0, L"Клагенфурт"}, + {40, 607, 0, L"Линц"}, + {40, 610, 0, L"Обдах"}, + {40, 611, 0, L"Щтубайтал"}, + {40, 2541, 0, L"Другое"}, + {32, 612, 0, L"Тирана"}, + {32, 2540, 0, L"Другое"}, + {33, 613, 0, L"Андорра-ла-Велья"}, + {33, 2539, 0, L"Другое"}, + {340, 341, 0, L"Минск"}, + {340, 342, 0, L"Брестская обл."}, + {340, 343, 0, L"Витебская обл."}, + {340, 344, 0, L"Гомельская обл."}, + {340, 345, 0, L"Гродненская обл."}, + {340, 346, 0, L"Минская обл."}, + {340, 347, 0, L"Могилевская обл."}, + {38, 760, 0, L"Антверпен"}, + {38, 767, 0, L"Арлон"}, + {38, 762, 0, L"Брюгге"}, + {38, 761, 0, L"Брюссель"}, + {38, 763, 0, L"Гент"}, + {38, 769, 0, L"Лувен"}, + {38, 765, 0, L"Льеж"}, + {38, 764, 0, L"Монс"}, + {38, 3117, 0, L"Мортсель"}, + {38, 766, 0, L"Намюр"}, + {38, 768, 0, L"Хасселт"}, + {38, 2532, 0, L"Другое"}, + {41, 3098, 0, L"Банско"}, + {41, 792, 0, L"Благоевград"}, + {41, 770, 0, L"Бургас"}, + {41, 771, 0, L"Бяла"}, + {41, 773, 0, L"Варна"}, + {41, 776, 0, L"Велико-Тырново"}, + {41, 788, 0, L"Видин"}, + {41, 789, 0, L"Враца"}, + {41, 796, 0, L"Габрово"}, + {41, 777, 0, L"Димитровград"}, + {41, 781, 0, L"Каварна"}, + {41, 786, 0, L"Кырджали"}, + {41, 791, 0, L"Кюстендил"}, + {41, 793, 0, L"Лазарджик"}, + {41, 795, 0, L"Ловеч"}, + {41, 787, 0, L"Михайловград"}, + {41, 790, 0, L"Перник"}, + {41, 3133, 0, L"Пирдоп"}, + {41, 794, 0, L"Плевен"}, + {41, 782, 0, L"Пловдив"}, + {41, 780, 0, L"Разград"}, + {41, 779, 0, L"Русе"}, + {41, 774, 0, L"Силистра"}, + {41, 784, 0, L"Сливен"}, + {41, 772, 0, L"София"}, + {41, 775, 0, L"Толбухин"}, + {41, 3116, 0, L"Тырново"}, + {41, 785, 0, L"Хасково"}, + {41, 778, 0, L"Шумен"}, + {41, 783, 0, L"Ямбол"}, + {41, 2531, 0, L"Другое"}, + {42, 797, 0, L"Баня-Лука"}, + {42, 799, 0, L"Зеница"}, + {42, 798, 0, L"Сараево"}, + {42, 800, 0, L"Тузла"}, + {42, 2530, 0, L"Другое"}, + {45, 802, 0, L"Абердин"}, + {45, 3075, 0, L"Айслворт"}, + {45, 801, 0, L"Алнвик"}, + {45, 804, 0, L"Бидефорд"}, + {45, 803, 0, L"Бирмингем"}, + {45, 805, 0, L"Блоксвич"}, + {45, 3168, 0, L"Бостон"}, + {45, 806, 0, L"Брайтон"}, + {45, 807, 0, L"Бредфорд"}, + {45, 808, 0, L"Бристоль"}, + {45, 809, 0, L"Вилленхолл"}, + {45, 3131, 0, L"Воррингтон"}, + {45, 810, 0, L"Вудбридж"}, + {45, 3342, 0, L"Гилфорд"}, + {45, 811, 0, L"Глазго"}, + {45, 812, 0, L"Дадли"}, + {45, 813, 0, L"Дарем"}, + {45, 814, 0, L"Дуглас"}, + {45, 3089, 0, L"Кардиф"}, + {45, 815, 0, L"Кембридж"}, + {45, 816, 0, L"Кентербери"}, + {45, 817, 0, L"Ливерпуль"}, + {45, 818, 0, L"Лидс"}, + {45, 819, 0, L"Лондон"}, + {45, 820, 0, L"Манчестер"}, + {45, 2976, 0, L"Митчем"}, + {45, 2988, 0, L"Мэйденхед"}, + {45, 821, 0, L"Ноттингем"}, + {45, 3088, 0, L"Ньюпорт"}, + {45, 822, 0, L"Оксфорд"}, + {45, 823, 0, L"Плимут"}, + {45, 824, 0, L"Портсмут"}, + {45, 825, 0, L"Престон"}, + {45, 3343, 0, L"Райд"}, + {45, 2867, 0, L"Ридинг"}, + {45, 2986, 0, L"Сент-Албанс"}, + {45, 826, 0, L"Стаффорд"}, + {45, 3063, 0, L"Стокпорт"}, + {45, 827, 0, L"Уэймут"}, + {45, 3140, 0, L"Челтенхэм"}, + {45, 828, 0, L"Честер"}, + {45, 829, 0, L"Шеффилд"}, + {45, 830, 0, L"Эдинбург"}, + {45, 2529, 0, L"Другое"}, + {44, 831, 0, L"Будапешт"}, + {44, 832, 0, L"Геделле"}, + {44, 836, 0, L"Дебрецен"}, + {44, 835, 0, L"Мишкольц"}, + {44, 834, 0, L"Сегед"}, + {44, 833, 0, L"Шиофок"}, + {44, 2528, 0, L"Другое"}, + {46, 3007, 0, L"Аахен"}, + {46, 837, 0, L"Аугсбург"}, + {46, 838, 0, L"Баден-Баден"}, + {46, 3371, 0, L"Бамберг"}, + {46, 839, 0, L"Бергиш-Гладбах"}, + {46, 840, 0, L"Берлин"}, + {46, 841, 0, L"Билефельд"}, + {46, 3163, 0, L"Бовенден"}, + {46, 842, 0, L"Бонн"}, + {46, 843, 0, L"Браденбург"}, + {46, 3015, 0, L"Брауншвейг"}, + {46, 844, 0, L"Бремен"}, + {46, 2921, 0, L"Варштайн"}, + {46, 845, 0, L"Веймар"}, + {46, 846, 0, L"Вупперталь"}, + {46, 847, 0, L"Гамбург"}, + {46, 848, 0, L"Ганновер"}, + {46, 849, 0, L"Гарделеген"}, + {46, 3010, 0, L"Гейдельберг"}, + {46, 850, 0, L"Гота"}, + {46, 851, 0, L"Дармштадт"}, + {46, 3072, 0, L"Дессау"}, + {46, 852, 0, L"Детмольд"}, + {46, 853, 0, L"Дортмунд"}, + {46, 854, 0, L"Дрезден"}, + {46, 855, 0, L"Дюссельдорф"}, + {46, 3082, 0, L"Иффецхайм"}, + {46, 3309, 0, L"Кассел"}, + {46, 856, 0, L"Кельн"}, + {46, 857, 0, L"Киль"}, + {46, 3138, 0, L"Кобленц"}, + {46, 858, 0, L"Крефельд"}, + {46, 859, 0, L"Лейпциг"}, + {46, 2872, 0, L"Лимбург"}, + {46, 2965, 0, L"Линген"}, + {46, 3135, 0, L"Любек"}, + {46, 3156, 0, L"Мангейм"}, + {46, 3192, 0, L"Меерсбург"}, + {46, 860, 0, L"Мюнстер"}, + {46, 861, 0, L"Мюнхен"}, + {46, 2864, 0, L"Нойштадт"}, + {46, 862, 0, L"Нюрнберг"}, + {46, 3009, 0, L"Оффенбург"}, + {46, 2993, 0, L"Падерборн"}, + {46, 863, 0, L"Равенсбург"}, + {46, 864, 0, L"Регенсбург"}, + {46, 865, 0, L"Рейнен"}, + {46, 866, 0, L"Росток"}, + {46, 3191, 0, L"Саарбрюкен"}, + {46, 2974, 0, L"Санкт-Августин"}, + {46, 3127, 0, L"Тюринген"}, + {46, 867, 0, L"Фрайберг"}, + {46, 868, 0, L"Фрайбург"}, + {46, 869, 0, L"Франкфурт-на-Майне"}, + {46, 3373, 0, L"Хемнитц"}, + {46, 3313, 0, L"Хильден"}, + {46, 870, 0, L"Штутгарт"}, + {46, 3045, 0, L"Эрланген"}, + {46, 2906, 0, L"Эшборн"}, + {46, 2527, 0, L"Другое"}, + {48, 871, 0, L"Афины"}, + {48, 873, 0, L"Ираклион"}, + {48, 3147, 0, L"Корфу"}, + {48, 872, 0, L"Салоники"}, + {48, 3178, 0, L"Халкидики"}, + {48, 2526, 0, L"Другое"}, + {49, 3006, 0, L"Архус"}, + {49, 874, 0, L"Копенгаген"}, + {49, 875, 0, L"Оденсе"}, + {49, 3285, 0, L"Ольборг"}, + {49, 876, 0, L"Сванеке"}, + {49, 3126, 0, L"Скиве"}, + {49, 2525, 0, L"Другое"}, + {50, 3377, 0, L"Виклоу"}, + {50, 3067, 0, L"Голвей"}, + {50, 877, 0, L"Дублин"}, + {50, 3065, 0, L"Килларней"}, + {50, 3066, 0, L"Корк"}, + {50, 878, 0, L"Лимерик"}, + {50, 3069, 0, L"Нейс"}, + {50, 3068, 0, L"Типперэри"}, + {50, 2524, 0, L"Другое"}, + {51, 879, 0, L"Рейкьявик"}, + {51, 2523, 0, L"Другое"}, + {34, 880, 0, L"Аликанте"}, + {34, 3125, 0, L"Альмерия"}, + {34, 881, 0, L"Барселона"}, + {34, 890, 0, L"Бильбао"}, + {34, 3076, 0, L"Бланес"}, + {34, 882, 0, L"Валенсия"}, + {34, 3070, 0, L"Ибица"}, + {34, 888, 0, L"Кадис"}, + {34, 886, 0, L"Картахена"}, + {34, 891, 0, L"Ла-Корунья"}, + {34, 3310, 0, L"Лорет де Мар"}, + {34, 883, 0, L"Мадрид"}, + {34, 884, 0, L"Малага"}, + {34, 885, 0, L"Марбелья"}, + {34, 892, 0, L"Овьедо"}, + {34, 3179, 0, L"Пальма де Майорка"}, + {34, 3177, 0, L"Сан-Агустин"}, + {34, 3289, 0, L"Санта-Крус-де-Тенерифе"}, + {34, 889, 0, L"Сарагоса"}, + {34, 887, 0, L"Севилья"}, + {34, 893, 0, L"Хихон"}, + {34, 2522, 0, L"Другое"}, + {52, 3318, 0, L"Аоста"}, + {52, 3278, 0, L"Беллариа"}, + {52, 906, 0, L"Болонья"}, + {52, 894, 0, L"Брешиа"}, + {52, 895, 0, L"Венеция"}, + {52, 905, 0, L"Верона"}, + {52, 896, 0, L"Генуя"}, + {52, 897, 0, L"Лекко"}, + {52, 3369, 0, L"Ливорно"}, + {52, 3327, 0, L"Марсала"}, + {52, 898, 0, L"Милан"}, + {52, 899, 0, L"Модена"}, + {52, 907, 0, L"Неаполь"}, + {52, 908, 0, L"Перуджа"}, + {52, 900, 0, L"Пиза"}, + {52, 901, 0, L"Рим"}, + {52, 3368, 0, L"Сан-Ремо"}, + {52, 3384, 0, L"Сиракуза"}, + {52, 3252, 0, L"Терамо"}, + {52, 902, 0, L"Триест"}, + {52, 903, 0, L"Турин"}, + {52, 3130, 0, L"Фано"}, + {52, 904, 0, L"Флоренция"}, + {52, 2521, 0, L"Другое"}, + {53, 2939, 0, L"Айзкраукле"}, + {53, 3054, 0, L"Валка"}, + {53, 909, 0, L"Даугавпилс"}, + {53, 2934, 0, L"Екабпилс"}, + {53, 913, 0, L"Елгава"}, + {53, 2935, 0, L"Кокнесе"}, + {53, 912, 0, L"Лиепая"}, + {53, 2905, 0, L"Резекне"}, + {53, 911, 0, L"Рига"}, + {53, 2936, 0, L"Саласпилс"}, + {53, 2937, 0, L"Смилтене"}, + {53, 910, 0, L"Юрмала"}, + {53, 2520, 0, L"Другое"}, + {54, 914, 0, L"Вильнюс"}, + {54, 915, 0, L"Висагинас"}, + {54, 916, 0, L"Каунас"}, + {54, 918, 0, L"Клайпеда"}, + {54, 919, 0, L"Паланга"}, + {54, 3173, 0, L"Пеневежис"}, + {54, 917, 0, L"Шауляй"}, + {54, 2519, 0, L"Другое"}, + {55, 920, 0, L"Вадуц"}, + {55, 2518, 0, L"Другое"}, + {56, 3376, 0, L"Бетцдорф"}, + {56, 921, 0, L"Люксембург"}, + {56, 2517, 0, L"Другое"}, + {57, 3142, 0, L"Битола"}, + {57, 922, 0, L"Скопье"}, + {57, 2516, 0, L"Другое"}, + {58, 923, 0, L"Валлетта"}, + {58, 3154, 0, L"Мзида"}, + {58, 924, 0, L"Слима"}, + {58, 2515, 0, L"Другое"}, + {59, 925, 0, L"Бельцы"}, + {59, 926, 0, L"Бендеры"}, + {59, 3234, 0, L"Дубоссары"}, + {59, 3275, 0, L"Кахул"}, + {59, 927, 0, L"Кишинев"}, + {59, 3321, 0, L"Резина"}, + {59, 928, 0, L"Рыбница"}, + {59, 929, 0, L"Тирасполь"}, + {59, 3281, 0, L"Чадыр-Лунга"}, + {59, 2514, 0, L"Другое"}, + {36, 930, 0, L"Монте-Карло"}, + {36, 2513, 0, L"Другое"}, + {60, 931, 0, L"Амстердам"}, + {60, 933, 0, L"Бреда"}, + {60, 932, 0, L"Гаага"}, + {60, 934, 0, L"Гауда"}, + {60, 935, 0, L"Делфт"}, + {60, 2977, 0, L"Донген"}, + {60, 3030, 0, L"Зволле"}, + {60, 3091, 0, L"Ниймеген"}, + {60, 936, 0, L"Роттердам"}, + {60, 937, 0, L"Утрехт"}, + {60, 3044, 0, L"Эйндховен"}, + {60, 3380, 0, L"Эншеде"}, + {60, 2512, 0, L"Другое"}, + {61, 3190, 0, L"Кристиансанд"}, + {61, 2857, 0, L"Лиллехаммер"}, + {61, 938, 0, L"Осло"}, + {61, 3355, 0, L"Ставангер"}, + {61, 939, 0, L"Тронхейм"}, + {61, 2511, 0, L"Другое"}, + {62, 940, 0, L"Белосток"}, + {62, 941, 0, L"Варшава"}, + {62, 3164, 0, L"Вроцлав"}, + {62, 942, 0, L"Гданьск"}, + {62, 943, 0, L"Гливице"}, + {62, 3237, 0, L"Закопане"}, + {62, 3165, 0, L"Зелена Гура"}, + {62, 944, 0, L"Катовице"}, + {62, 945, 0, L"Краков"}, + {62, 3008, 0, L"Лодзь"}, + {62, 3150, 0, L"Ольштын"}, + {62, 946, 0, L"Познань"}, + {62, 947, 0, L"Радом"}, + {62, 948, 0, L"Сопот"}, + {62, 2958, 0, L"Тыхы"}, + {62, 2510, 0, L"Другое"}, + {35, 949, 0, L"Лиссабон"}, + {35, 950, 0, L"Порто"}, + {35, 2509, 0, L"Другое"}, + {63, 952, 0, L"Брашов"}, + {63, 951, 0, L"Бухарест"}, + {63, 954, 0, L"Констанца"}, + {63, 955, 0, L"Плоешти"}, + {63, 953, 0, L"Яссы"}, + {63, 2508, 0, L"Другое"}, + {64, 956, 0, L"Сан-Марино"}, + {64, 2507, 0, L"Другое"}, + {74, 957, 0, L"Белград"}, + {74, 960, 0, L"Ниш"}, + {74, 958, 0, L"Нови-Сад"}, + {74, 959, 0, L"Сараево"}, + {74, 2506, 0, L"Другое"}, + {65, 961, 0, L"Братислава"}, + {65, 962, 0, L"Кошице"}, + {65, 3101, 0, L"Липтов"}, + {65, 963, 0, L"Попрад"}, + {65, 964, 0, L"Прешов"}, + {65, 965, 0, L"Ружемберок"}, + {65, 966, 0, L"Тврдошин"}, + {65, 2505, 0, L"Другое"}, + {66, 968, 0, L"Копар"}, + {66, 967, 0, L"Любляна"}, + {66, 969, 0, L"Марибор"}, + {66, 2504, 0, L"Другое"}, + {67, 970, 0, L"Торсхавн"}, + {67, 2503, 0, L"Другое"}, + {68, 2888, 0, L"Вантаа"}, + {68, 971, 0, L"Васа"}, + {68, 979, 0, L"Котка"}, + {68, 972, 0, L"Коувола"}, + {68, 980, 0, L"Лахти"}, + {68, 973, 0, L"Оулу"}, + {68, 3375, 0, L"Риихимяки"}, + {68, 3159, 0, L"Руовеси"}, + {68, 974, 0, L"Тампере"}, + {68, 975, 0, L"Турку"}, + {68, 976, 0, L"Хельсинки"}, + {68, 977, 0, L"Эспо"}, + {68, 978, 0, L"Ювяскюля"}, + {68, 2502, 0, L"Другое"}, + {37, 996, 0, L"Авиньон"}, + {37, 983, 0, L"Бержерак"}, + {37, 997, 0, L"Блуа"}, + {37, 984, 0, L"Бордо"}, + {37, 998, 0, L"Дижон"}, + {37, 987, 0, L"Канн"}, + {37, 988, 0, L"Кастр"}, + {37, 993, 0, L"Клермон-Ферран"}, + {37, 3037, 0, L"Лилль"}, + {37, 989, 0, L"Лион"}, + {37, 985, 0, L"Марсель"}, + {37, 991, 0, L"Мец"}, + {37, 3161, 0, L"Мобеж"}, + {37, 990, 0, L"Нанси"}, + {37, 994, 0, L"Нант"}, + {37, 995, 0, L"Ницца"}, + {37, 999, 0, L"Орлеан"}, + {37, 981, 0, L"Париж"}, + {37, 3374, 0, L"Перпиньян"}, + {37, 992, 0, L"Руан"}, + {37, 982, 0, L"Страсбург"}, + {37, 986, 0, L"Тулуза"}, + {37, 3314, 0, L"Шамбери"}, + {37, 2501, 0, L"Другое"}, + {69, 1003, 0, L"Дубровник"}, + {69, 1000, 0, L"Загреб"}, + {69, 1001, 0, L"Задар"}, + {69, 1004, 0, L"Риека"}, + {69, 1002, 0, L"Сплит"}, + {69, 2500, 0, L"Другое"}, + {70, 1005, 0, L"Брно"}, + {70, 3291, 0, L"Гавличкув-Брод"}, + {70, 1007, 0, L"Градец-Кралове"}, + {70, 1008, 0, L"Карлови-Вари"}, + {70, 3019, 0, L"Кладрубы"}, + {70, 1010, 0, L"Лоуни"}, + {70, 1009, 0, L"Острава"}, + {70, 1015, 0, L"Пльзень"}, + {70, 3105, 0, L"Правчицка Брана"}, + {70, 1006, 0, L"Прага"}, + {70, 3246, 0, L"Тачов"}, + {70, 1011, 0, L"Тршебич"}, + {70, 1012, 0, L"Усти-над-Лабем"}, + {70, 1014, 0, L"Ческе-Будеевице"}, + {70, 1013, 0, L"Яблонец-над-Нисоу"}, + {70, 2499, 0, L"Другое"}, + {71, 1016, 0, L"Арау"}, + {71, 1019, 0, L"Баден"}, + {71, 1017, 0, L"Базель"}, + {71, 1018, 0, L"Берн"}, + {71, 1020, 0, L"Биль"}, + {71, 1021, 0, L"Винтертур"}, + {71, 1022, 0, L"Давос"}, + {71, 3189, 0, L"Делемонт"}, + {71, 1023, 0, L"Женева"}, + {71, 1024, 0, L"Золотурн"}, + {71, 1025, 0, L"Лозанна"}, + {71, 1026, 0, L"Локарно"}, + {71, 1027, 0, L"Лугано"}, + {71, 1028, 0, L"Люцерн"}, + {71, 1029, 0, L"Монтре"}, + {71, 1030, 0, L"Цюрих"}, + {71, 2498, 0, L"Другое"}, + {72, 2883, 0, L"Арбога"}, + {72, 1031, 0, L"Гетеборг"}, + {72, 1032, 0, L"Кальмар"}, + {72, 1037, 0, L"Лахольм"}, + {72, 1036, 0, L"Лулео"}, + {72, 1042, 0, L"Лунд"}, + {72, 1033, 0, L"Мальме"}, + {72, 1034, 0, L"Стокгольм"}, + {72, 1041, 0, L"Умео"}, + {72, 1039, 0, L"Фалун"}, + {72, 1043, 0, L"Хельсинборг"}, + {72, 1040, 0, L"Хернесанд"}, + {72, 1038, 0, L"Эстерсунд"}, + {72, 2497, 0, L"Другое"}, + {73, 3013, 0, L"Валга"}, + {73, 1044, 0, L"Кейла"}, + {73, 1045, 0, L"Кохтла-Ярве"}, + {73, 1046, 0, L"Маарду"}, + {73, 1047, 0, L"Мыйзакюла"}, + {73, 1048, 0, L"Нарва"}, + {73, 1049, 0, L"Пярну"}, + {73, 1050, 0, L"Раквере"}, + {73, 1051, 0, L"Силламяэ"}, + {73, 1052, 0, L"Таллин"}, + {73, 1053, 0, L"Тарту"}, + {73, 1054, 0, L"Хаапсалу"}, + {24, 233, 474, L"Алдан"}, + {24, 233, 2809, L"Верхоянск"}, + {24, 233, 2804, L"Вилюйск"}, + {24, 233, 475, L"Ленск"}, + {24, 233, 477, L"Мирный"}, + {24, 233, 476, L"Нерюнгри"}, + {24, 233, 2806, L"Олекминск"}, + {24, 233, 3115, L"Покровск"}, + {24, 233, 2808, L"Среднеколымск"}, + {24, 233, 2807, L"Томмот"}, + {24, 233, 2805, L"Удачный"}, + {24, 233, 478, L"Усть-Нера"}, + {24, 233, 479, L"Якутск"}, + {24, 233, 2263, L"Другое"}, + {24, 232, 2819, L"Арсеньев"}, + {24, 232, 464, L"Артем"}, + {24, 232, 465, L"Большой Камень"}, + {24, 232, 466, L"Владивосток"}, + {24, 232, 2817, L"Дальнегорск"}, + {24, 232, 2818, L"Дальнереченск"}, + {24, 232, 3359, L"Кавалерово"}, + {24, 232, 467, L"Камень-Рыболов"}, + {24, 232, 468, L"Лесозаводск"}, + {24, 232, 469, L"Лучегорск"}, + {24, 232, 470, L"Находка"}, + {24, 232, 471, L"Партизанск"}, + {24, 232, 472, L"Пластун"}, + {24, 232, 2816, L"Спасск-Дальний"}, + {24, 232, 473, L"Уссурийск"}, + {24, 232, 2258, L"Другое"}, + {24, 235, 487, L"Амурск"}, + {24, 235, 2821, L"Бикин"}, + {24, 235, 488, L"Ванино"}, + {24, 235, 2820, L"Вяземский"}, + {24, 235, 489, L"Комсомольск-на-Амуре"}, + {24, 235, 490, L"Николаевск-на-Амуре"}, + {24, 235, 491, L"Советская Гавань"}, + {24, 235, 3353, L"Солнечный"}, + {24, 235, 492, L"Хабаровск"}, + {24, 235, 2280, L"Другое"}, + {24, 227, 455, L"Белогорск"}, + {24, 227, 456, L"Благовещенск"}, + {24, 227, 2814, L"Завитинск"}, + {24, 227, 2813, L"Зея"}, + {24, 227, 2815, L"Райчихинск"}, + {24, 227, 2812, L"Свободный"}, + {24, 227, 2811, L"Сковородино"}, + {24, 227, 457, L"Тында"}, + {24, 227, 2217, L"Шимановск"}, + {24, 227, 2218, L"Другое"}, + {24, 229, 460, L"Елизово"}, + {24, 229, 2822, L"Ключи"}, + {24, 229, 459, L"Петропавловск-Камч."}, + {24, 229, 2234, L"Другое"}, + {24, 231, 462, L"Магадан"}, + {24, 231, 2823, L"Сусуман"}, + {24, 231, 463, L"Ягодное"}, + {24, 231, 2246, L"Другое"}, + {24, 234, 480, L"Александровск-Сахалинский"}, + {24, 234, 2829, L"Анива"}, + {24, 234, 2833, L"Горнозаводск"}, + {24, 234, 2825, L"Долинск"}, + {24, 234, 481, L"Корсаков"}, + {24, 234, 482, L"Красногорск"}, + {24, 234, 2826, L"Курильск"}, + {24, 234, 2832, L"Лесогорск"}, + {24, 234, 2836, L"Макаров"}, + {24, 234, 2830, L"Невельск"}, + {24, 234, 483, L"Оха"}, + {24, 234, 2828, L"Поронайск"}, + {24, 234, 2824, L"Северо-Курильск"}, + {24, 234, 2827, L"Томари"}, + {24, 234, 2831, L"Углегорск"}, + {24, 234, 484, L"Холмск"}, + {24, 234, 2834, L"Чехов"}, + {24, 234, 2835, L"Шахтерск"}, + {24, 234, 485, L"Южно-Курильск"}, + {24, 234, 486, L"Южно-Сахалинск"}, + {24, 234, 2264, L"Другое"}, + {24, 228, 458, L"Биробиджан"}, + {24, 228, 2810, L"Облучье"}, + {24, 228, 2226, L"Другое"}, + {24, 230, 461, L"Полана"}, + {24, 230, 2239, L"Другое"}, + {24, 236, 493, L"Анадырь"}, + {24, 236, 2287, L"Другое"}, + {24, 237, 2850, L"Агидель"}, + {24, 237, 2851, L"Агидель"}, + {24, 237, 2657, L"Баймак"}, + {24, 237, 2662, L"Белебей"}, + {24, 237, 494, L"Белорецк"}, + {24, 237, 2658, L"Бирск"}, + {24, 237, 2660, L"Благовещенск"}, + {24, 237, 2659, L"Давлеканово"}, + {24, 237, 2663, L"Дюртюли"}, + {24, 237, 495, L"Ишимбай"}, + {24, 237, 496, L"Кумертау"}, + {24, 237, 2655, L"Мелеуз"}, + {24, 237, 497, L"Нефтекамск"}, + {24, 237, 2654, L"Октябрьский"}, + {24, 237, 499, L"Салават"}, + {24, 237, 2656, L"Сибай"}, + {24, 237, 498, L"Стерлитамак"}, + {24, 237, 500, L"Туймазы"}, + {24, 237, 2661, L"Туймазы"}, + {24, 237, 501, L"Уфа"}, + {24, 237, 502, L"Учалы"}, + {24, 237, 2664, L"Янаул"}, + {24, 237, 2220, L"Другое"}, + {24, 240, 509, L"Волжск"}, + {24, 240, 510, L"Звенигово"}, + {24, 240, 511, L"Йошкар-Ола"}, + {24, 240, 512, L"Козьмодемьянск"}, + {24, 240, 2247, L"Другое"}, + {24, 241, 513, L"Зубова Поляна"}, + {24, 241, 2147, L"Инсар"}, + {24, 241, 2150, L"Ковылкино"}, + {24, 241, 2148, L"Краснослободск"}, + {24, 241, 2910, L"Лямбирь"}, + {24, 241, 515, L"Рузаевка"}, + {24, 241, 514, L"Саранск"}, + {24, 241, 2149, L"Темников"}, + {24, 241, 2923, L"Чамзинка"}, + {24, 241, 2248, L"Другое"}, + {24, 248, 2569, L"Агрыз"}, + {24, 248, 2575, L"Азнакаево"}, + {24, 248, 569, L"Альметьевск"}, + {24, 248, 570, L"Апастово"}, + {24, 248, 2571, L"Болгар"}, + {24, 248, 571, L"Бугульма"}, + {24, 248, 2570, L"Буинск"}, + {24, 248, 572, L"Джалиль"}, + {24, 248, 573, L"Елабуга"}, + {24, 248, 2576, L"Заинск"}, + {24, 248, 574, L"Зеленодольск"}, + {24, 248, 575, L"Казань"}, + {24, 248, 2577, L"Лениногорск"}, + {24, 248, 2572, L"Мамадыш"}, + {24, 248, 576, L"Менделеевск"}, + {24, 248, 2573, L"Мензелинск"}, + {24, 248, 577, L"Набережные Челны"}, + {24, 248, 578, L"Нижнекамск"}, + {24, 248, 579, L"Нурлат"}, + {24, 248, 2574, L"Тетюши"}, + {24, 248, 580, L"Чистополь"}, + {24, 248, 2271, L"Другое"}, + {24, 249, 3311, L"Вавож"}, + {24, 249, 581, L"Воткинск"}, + {24, 249, 582, L"Глазов"}, + {24, 249, 583, L"Игра"}, + {24, 249, 584, L"Ижевск"}, + {24, 249, 2665, L"Камбарка"}, + {24, 249, 585, L"Можга"}, + {24, 249, 586, L"Сарапул"}, + {24, 249, 587, L"Ува"}, + {24, 249, 2277, L"Другое"}, + {24, 251, 2158, L"Алатырь"}, + {24, 251, 2156, L"Канаш"}, + {24, 251, 2151, L"Козловка"}, + {24, 251, 2152, L"Марьинский Посад"}, + {24, 251, 2155, L"Новочебоксарск"}, + {24, 251, 2153, L"Цивильск"}, + {24, 251, 592, L"Чебоксары"}, + {24, 251, 2157, L"Шумерля"}, + {24, 251, 2154, L"Ядрин"}, + {24, 251, 2286, L"Другое"}, + {24, 238, 2168, L"Белая Холуница"}, + {24, 238, 503, L"Вятские Поляны"}, + {24, 238, 2164, L"Зуевка"}, + {24, 238, 504, L"Киров"}, + {24, 238, 505, L"Кирово-Чепецк"}, + {24, 238, 2160, L"Кирс"}, + {24, 238, 506, L"Котельнич"}, + {24, 238, 2167, L"Луза"}, + {24, 238, 2159, L"Малмыж"}, + {24, 238, 2169, L"Мураши"}, + {24, 238, 2163, L"Нолинск"}, + {24, 238, 2170, L"Омутнинск"}, + {24, 238, 2166, L"Слободской"}, + {24, 238, 2165, L"Советск"}, + {24, 238, 2162, L"Сосновка"}, + {24, 238, 2171, L"Уржум"}, + {24, 238, 2161, L"Халтурин"}, + {24, 238, 507, L"Яранск"}, + {24, 238, 2237, L"Другое"}, + {24, 242, 516, L"Арзамас"}, + {24, 242, 517, L"Балахна"}, + {24, 242, 2139, L"Богородск"}, + {24, 242, 518, L"Бор"}, + {24, 242, 519, L"Вахтан"}, + {24, 242, 520, L"Ветлуга"}, + {24, 242, 2140, L"Володарск"}, + {24, 242, 2138, L"Ворсма"}, + {24, 242, 521, L"Выкса"}, + {24, 242, 2137, L"Горбатов"}, + {24, 242, 522, L"Городец"}, + {24, 242, 523, L"Дзержинск"}, + {24, 242, 524, L"Заволжье"}, + {24, 242, 2891, L"Ильиногорск"}, + {24, 242, 525, L"Кстово"}, + {24, 242, 2145, L"Кулебаки"}, + {24, 242, 2143, L"Лукоянов"}, + {24, 242, 2144, L"Лысково"}, + {24, 242, 2146, L"Навашино"}, + {24, 242, 526, L"Нижний Новгород"}, + {24, 242, 527, L"Павлово"}, + {24, 242, 2135, L"Первомайск"}, + {24, 242, 528, L"Саров"}, + {24, 242, 529, L"Семенов"}, + {24, 242, 530, L"Сергач"}, + {24, 242, 2141, L"Урень"}, + {24, 242, 2136, L"Чкаловск"}, + {24, 242, 2897, L"Шатки"}, + {24, 242, 2142, L"Шахунья"}, + {24, 242, 2251, L"Другое"}, + {24, 243, 2678, L"Абдулино"}, + {24, 243, 2673, L"Бугуруслан"}, + {24, 243, 531, L"Бузулук"}, + {24, 243, 532, L"Гай"}, + {24, 243, 2674, L"Кувандык"}, + {24, 243, 2675, L"Медногорск"}, + {24, 243, 533, L"Новотроицк"}, + {24, 243, 535, L"Оренбург"}, + {24, 243, 536, L"Орск"}, + {24, 243, 3360, L"Саракташ"}, + {24, 243, 2677, L"Соль-Илецк"}, + {24, 243, 2676, L"Сорочинск"}, + {24, 243, 537, L"Тоцкое"}, + {24, 243, 538, L"Ясный"}, + {24, 243, 2254, L"Другое"}, + {24, 244, 539, L"Беднодемьяновск"}, + {24, 244, 2597, L"Белинский"}, + {24, 244, 2595, L"Городище"}, + {24, 244, 2593, L"Каменка"}, + {24, 244, 540, L"Кузнецк"}, + {24, 244, 2598, L"Нижний Ломов"}, + {24, 244, 2592, L"Никольск"}, + {24, 244, 541, L"Пенза"}, + {24, 244, 3304, L"Русский Камешкир"}, + {24, 244, 2596, L"Сердобск"}, + {24, 244, 2594, L"Сурск"}, + {24, 244, 2256, L"Другое"}, + {24, 245, 2690, L"Александровск"}, + {24, 245, 542, L"Березники"}, + {24, 245, 2679, L"Верещагино"}, + {24, 245, 2680, L"Горнозаводск"}, + {24, 245, 2687, L"Гремячинск"}, + {24, 245, 2686, L"Губаха"}, + {24, 245, 543, L"Добрянка"}, + {24, 245, 544, L"Кизел"}, + {24, 245, 2681, L"Красновишерск"}, + {24, 245, 545, L"Краснокамск"}, + {24, 245, 546, L"Кунгур"}, + {24, 245, 547, L"Лысьва"}, + {24, 245, 548, L"Нытва"}, + {24, 245, 2683, L"Оса"}, + {24, 245, 2684, L"Оханск"}, + {24, 245, 2682, L"Очер"}, + {24, 245, 549, L"Пермь"}, + {24, 245, 550, L"Соликамск"}, + {24, 245, 2685, L"Усолье"}, + {24, 245, 551, L"Чайковский"}, + {24, 245, 2689, L"Чердынь"}, + {24, 245, 2688, L"Чермоз"}, + {24, 245, 552, L"Чернушка"}, + {24, 245, 553, L"Чусовой"}, + {24, 245, 2257, L"Другое"}, + {24, 246, 554, L"Волжский"}, + {24, 246, 555, L"Жигулевск"}, + {24, 246, 2599, L"Кинель"}, + {24, 246, 3293, L"Красный Яр"}, + {24, 246, 2602, L"Нефтегорск"}, + {24, 246, 556, L"Новокуйбышевск"}, + {24, 246, 2600, L"Октябрьск"}, + {24, 246, 557, L"Отрадный"}, + {24, 246, 558, L"Похвистнево"}, + {24, 246, 559, L"Самара"}, + {24, 246, 560, L"Сызрань"}, + {24, 246, 561, L"Тольятти"}, + {24, 246, 2601, L"Чапаевск"}, + {24, 246, 562, L"Шигоны"}, + {24, 246, 2261, L"Другое"}, + {24, 247, 2613, L"Аркадак"}, + {24, 247, 2606, L"Аткарск"}, + {24, 247, 563, L"Балаково"}, + {24, 247, 564, L"Балашов"}, + {24, 247, 565, L"Вольск"}, + {24, 247, 2608, L"Ершов"}, + {24, 247, 2607, L"Калининск"}, + {24, 247, 2609, L"Красноармейск"}, + {24, 247, 2610, L"Красный Кут"}, + {24, 247, 2605, L"Маркс"}, + {24, 247, 566, L"Новоузенск"}, + {24, 247, 2603, L"Петровск"}, + {24, 247, 2604, L"Пугачев"}, + {24, 247, 2612, L"Ртищево"}, + {24, 247, 567, L"Саратов"}, + {24, 247, 2611, L"Хвалынск"}, + {24, 247, 568, L"Энгельс"}, + {24, 247, 3267, L"Энгельс-12"}, + {24, 247, 2262, L"Другое"}, + {24, 250, 2614, L"Барыш"}, + {24, 250, 588, L"Димитровград"}, + {24, 250, 2615, L"Инза"}, + {24, 250, 589, L"Новоспасское"}, + {24, 250, 2616, L"Новоульяновск"}, + {24, 250, 590, L"Сенгилей"}, + {24, 250, 591, L"Ульяновск"}, + {24, 250, 2278, L"Другое"}, + {24, 239, 508, L"Кудымкар"}, + {24, 239, 2238, L"Другое"}, + {24, 255, 1355, L"Беломорск"}, + {24, 255, 1356, L"Кемь"}, + {24, 255, 1357, L"Кондопога"}, + {24, 255, 1358, L"Костомукша"}, + {24, 255, 1359, L"Коткозеро"}, + {24, 255, 1360, L"Лахденпохья"}, + {24, 255, 1362, L"Лоухи"}, + {24, 255, 1361, L"Медвежьегорск"}, + {24, 255, 3286, L"Муезерский"}, + {24, 255, 1937, L"Олонец"}, + {24, 255, 1363, L"Петрозаводск"}, + {24, 255, 1938, L"Питкяранта"}, + {24, 255, 3287, L"Пряжа"}, + {24, 255, 1936, L"Пудож"}, + {24, 255, 1364, L"Сегежа"}, + {24, 255, 1365, L"Сортавала"}, + {24, 255, 1939, L"Суоярви"}, + {24, 255, 2201, L"Другое"}, + {24, 256, 1366, L"Воркута"}, + {24, 256, 1367, L"Вуктыл"}, + {24, 256, 2202, L"Емва"}, + {24, 256, 1368, L"Инта"}, + {24, 256, 1940, L"Микунь"}, + {24, 256, 1369, L"Печора"}, + {24, 256, 1941, L"Сосногорск"}, + {24, 256, 1370, L"Сыктывкар"}, + {24, 256, 1371, L"Усинск"}, + {24, 256, 1372, L"Ухта"}, + {24, 256, 2203, L"Другое"}, + {24, 252, 593, L"Архангельск"}, + {24, 252, 594, L"Вельск"}, + {24, 252, 1945, L"Каргополь"}, + {24, 252, 595, L"Коряжма"}, + {24, 252, 596, L"Котлас"}, + {24, 252, 1944, L"Мезень"}, + {24, 252, 597, L"Мирный"}, + {24, 252, 598, L"Новодвинск"}, + {24, 252, 1946, L"Няндома"}, + {24, 252, 599, L"Онега"}, + {24, 252, 600, L"Пинега"}, + {24, 252, 601, L"Северодвинск"}, + {24, 252, 1942, L"Сольвычегодск"}, + {24, 252, 3239, L"Холмогоры"}, + {24, 252, 1943, L"Шенкурск"}, + {24, 252, 2204, L"Другое"}, + {24, 253, 1950, L"Бабаево"}, + {24, 253, 1949, L"Белозерск"}, + {24, 253, 1338, L"Великий Устюг"}, + {24, 253, 1339, L"Вологда"}, + {24, 253, 1951, L"Вытегра"}, + {24, 253, 1340, L"Грязовец"}, + {24, 253, 1952, L"Кадников"}, + {24, 253, 2871, L"Кадуй"}, + {24, 253, 1341, L"Кириллов"}, + {24, 253, 1955, L"Красавино"}, + {24, 253, 1342, L"Михайловка"}, + {24, 253, 1947, L"Никольск"}, + {24, 253, 1343, L"Сокол"}, + {24, 253, 1953, L"Тотьма"}, + {24, 253, 1954, L"Устюжна"}, + {24, 253, 1948, L"Харовск"}, + {24, 253, 1344, L"Череповец"}, + {24, 253, 2205, L"Другое"}, + {24, 254, 2838, L"Багратионовск"}, + {24, 254, 1345, L"Балтийск"}, + {24, 254, 2846, L"Гвардейск"}, + {24, 254, 2843, L"Гурьевск"}, + {24, 254, 1346, L"Гусев"}, + {24, 254, 1347, L"Зеленоградск"}, + {24, 254, 1348, L"Калининград"}, + {24, 254, 2842, L"Краснознаменск"}, + {24, 254, 2845, L"Ладушкин"}, + {24, 254, 2848, L"Мамоново"}, + {24, 254, 2837, L"Неман"}, + {24, 254, 2844, L"Нестеров"}, + {24, 254, 1349, L"Озерск"}, + {24, 254, 2841, L"Полесск"}, + {24, 254, 2839, L"Правдинск"}, + {24, 254, 1350, L"Приморск"}, + {24, 254, 1351, L"Светлогорск"}, + {24, 254, 1352, L"Светлый"}, + {24, 254, 2840, L"Славск"}, + {24, 254, 1353, L"Советск"}, + {24, 254, 1354, L"Черняховск"}, + {24, 254, 2231, L"Другое"}, + {24, 257, 1985, L"Бокситогорск"}, + {24, 257, 1374, L"Волхов"}, + {24, 257, 1373, L"Всеволожск"}, + {24, 257, 1375, L"Выборг"}, + {24, 257, 1995, L"Высоцк"}, + {24, 257, 1376, L"Гатчина"}, + {24, 257, 1378, L"Ивангород"}, + {24, 257, 1993, L"Каменногорск"}, + {24, 257, 1379, L"Кингисепп"}, + {24, 257, 1380, L"Кириши"}, + {24, 257, 1381, L"Кировск"}, + {24, 257, 1384, L"Кузьмоловский"}, + {24, 257, 1984, L"Лодейное Поле"}, + {24, 257, 1990, L"Луга"}, + {24, 257, 1994, L"Любань"}, + {24, 257, 1386, L"Никольское"}, + {24, 257, 1987, L"Новая Ладога"}, + {24, 257, 1996, L"Отрадное"}, + {24, 257, 1986, L"Пикалево"}, + {24, 257, 1983, L"Подпорожье"}, + {24, 257, 1992, L"Приморск"}, + {24, 257, 1988, L"Приозерск"}, + {24, 257, 3071, L"Пушкин"}, + {24, 257, 1989, L"Светогорск"}, + {24, 257, 1389, L"Сертолово"}, + {24, 257, 1991, L"Сланцы"}, + {24, 257, 1391, L"Сосновый Бор"}, + {24, 257, 1392, L"Тихвин"}, + {24, 257, 1393, L"Тосно"}, + {24, 257, 1394, L"Шлиссельбург"}, + {24, 257, 2207, L"Другое"}, + {24, 258, 1395, L"Апатиты"}, + {24, 258, 1959, L"Заполярный"}, + {24, 258, 1396, L"Зареченск"}, + {24, 258, 1397, L"Кандалакша"}, + {24, 258, 1398, L"Кировск"}, + {24, 258, 1399, L"Ковдор"}, + {24, 258, 1958, L"Кола"}, + {24, 258, 1400, L"Мончегорск"}, + {24, 258, 1401, L"Мурманск"}, + {24, 258, 1402, L"Мурмаши"}, + {24, 258, 1403, L"Оленегорск"}, + {24, 258, 1404, L"Полярные Зори"}, + {24, 258, 1956, L"Полярный"}, + {24, 258, 1957, L"Североморск"}, + {24, 258, 3288, L"Снежногорск"}, + {24, 258, 2206, L"Другое"}, + {24, 260, 1406, L"Батецкий"}, + {24, 260, 2001, L"Боровичи"}, + {24, 260, 2003, L"Валдай"}, + {24, 260, 1407, L"Великий Новгород"}, + {24, 260, 1408, L"Крестцы"}, + {24, 260, 2002, L"Малая Вишера"}, + {24, 260, 1409, L"Окуловка"}, + {24, 260, 2000, L"Пестово"}, + {24, 260, 1997, L"Сольцы"}, + {24, 260, 1410, L"Старая Русса"}, + {24, 260, 1998, L"Холм"}, + {24, 260, 1999, L"Чудово"}, + {24, 260, 2208, L"Другое"}, + {24, 261, 1412, L"Великие Луки"}, + {24, 261, 2004, L"Гдов"}, + {24, 261, 2009, L"Дно"}, + {24, 261, 2005, L"Невель"}, + {24, 261, 1413, L"Новоржев"}, + {24, 261, 2006, L"Опочка"}, + {24, 261, 2008, L"Остров"}, + {24, 261, 1414, L"Печоры"}, + {24, 261, 1415, L"Порхов"}, + {24, 261, 1411, L"Псков"}, + {24, 261, 1416, L"Пустошка"}, + {24, 261, 2007, L"Пыталово"}, + {24, 261, 1417, L"Себеж"}, + {24, 261, 2209, L"Другое"}, + {24, 259, 1405, L"Нарьян-Мар"}, + {24, 259, 2250, L"Другое"}, + {24, 265, 2764, L"Бабушкин"}, + {24, 265, 2760, L"Гусиноозерск"}, + {24, 265, 2762, L"Закаменск"}, + {24, 265, 2763, L"Кяхта"}, + {24, 265, 2761, L"Северобайкальск"}, + {24, 265, 1446, L"Улан-Удэ"}, + {24, 265, 2222, L"Другое"}, + {24, 263, 1439, L"Горно-Алтайск"}, + {24, 263, 2215, L"Другое"}, + {24, 273, 2766, L"Ак-Довурак"}, + {24, 273, 1494, L"Кызыл"}, + {24, 273, 2768, L"Новый Шагонар"}, + {24, 273, 2767, L"Туран"}, + {24, 273, 2765, L"Чадан"}, + {24, 273, 2275, L"Другое"}, + {24, 275, 2769, L"Абаза"}, + {24, 275, 1496, L"Абакан"}, + {24, 275, 1497, L"Саяногорск"}, + {24, 275, 2770, L"Сорск"}, + {24, 275, 2771, L"Черногорск"}, + {24, 275, 2281, L"Другое"}, + {24, 264, 1440, L"Алейск"}, + {24, 264, 1441, L"Барнаул"}, + {24, 264, 1442, L"Белокуриха"}, + {24, 264, 1443, L"Бийск"}, + {24, 264, 2728, L"Горняк"}, + {24, 264, 2731, L"Заринск"}, + {24, 264, 2729, L"Змеиногорск"}, + {24, 264, 2732, L"Камень-на-Оби"}, + {24, 264, 3292, L"Кулунда"}, + {24, 264, 2730, L"Новоалтайск"}, + {24, 264, 1444, L"Рубцовск"}, + {24, 264, 1445, L"Славгород"}, + {24, 264, 3231, L"Яровое"}, + {24, 264, 2216, L"Другое"}, + {24, 268, 2781, L"Артемовск"}, + {24, 268, 1469, L"Ачинск"}, + {24, 268, 2784, L"Боготол"}, + {24, 268, 2773, L"Бородино"}, + {24, 268, 2774, L"Дивногорск"}, + {24, 268, 3122, L"Емельяновск"}, + {24, 268, 2772, L"Енисейск"}, + {24, 268, 3294, L"Железногорск"}, + {24, 268, 2777, L"Заозерный"}, + {24, 268, 1470, L"Игарка"}, + {24, 268, 2778, L"Иланский"}, + {24, 268, 2782, L"Канск"}, + {24, 268, 2783, L"Кодинский"}, + {24, 268, 1471, L"Красноярск"}, + {24, 268, 1472, L"Лесосибирск"}, + {24, 268, 1473, L"Минусинск"}, + {24, 268, 2775, L"Назарово"}, + {24, 268, 2776, L"Сосновоборск"}, + {24, 268, 2780, L"Ужур"}, + {24, 268, 2779, L"Уяр"}, + {24, 268, 2785, L"Шарыпово"}, + {24, 268, 1474, L"Шушенское"}, + {24, 268, 2242, L"Другое"}, + {24, 266, 2792, L"Алзамай"}, + {24, 266, 1447, L"Ангарск"}, + {24, 266, 1448, L"Байкальск"}, + {24, 266, 2791, L"Бирюсинск"}, + {24, 266, 1450, L"Бодайбо"}, + {24, 266, 1451, L"Братск"}, + {24, 266, 2793, L"Вихоревка"}, + {24, 266, 2789, L"Железногорск-Илимский"}, + {24, 266, 2786, L"Зима"}, + {24, 266, 1452, L"Иркутск"}, + {24, 266, 2794, L"Киренск"}, + {24, 266, 2787, L"Нижнеудинск"}, + {24, 266, 1449, L"Саянск"}, + {24, 266, 2790, L"Свирск"}, + {24, 266, 1453, L"Слюдянка"}, + {24, 266, 2788, L"Тайшет"}, + {24, 266, 1454, L"Тулун"}, + {24, 266, 1455, L"Усолье-Сибирское"}, + {24, 266, 2908, L"Усольск"}, + {24, 266, 1456, L"Усть-Илимск"}, + {24, 266, 1457, L"Усть-Кут"}, + {24, 266, 1458, L"Хужир"}, + {24, 266, 1459, L"Черемхово"}, + {24, 266, 2795, L"Шелехов"}, + {24, 266, 2229, L"Другое"}, + {24, 267, 2737, L"Анжеро-Суджинск"}, + {24, 267, 2740, L"Белово"}, + {24, 267, 2746, L"Березовский"}, + {24, 267, 2739, L"Гурьевск"}, + {24, 267, 2742, L"Калтан"}, + {24, 267, 1460, L"Кемерово"}, + {24, 267, 1461, L"Киселевск"}, + {24, 267, 2738, L"Ленинск-Кузнецкий"}, + {24, 267, 2745, L"Мариинск"}, + {24, 267, 1462, L"Междуреченск"}, + {24, 267, 1463, L"Мыски"}, + {24, 267, 1464, L"Новокузнецк"}, + {24, 267, 2744, L"Осинники"}, + {24, 267, 3358, L"Полысаево"}, + {24, 267, 1465, L"Прокопьевск"}, + {24, 267, 1466, L"Салаир"}, + {24, 267, 2743, L"Тайга"}, + {24, 267, 2741, L"Таштагол"}, + {24, 267, 1467, L"Топки"}, + {24, 267, 1468, L"Юрга"}, + {24, 267, 2236, L"Другое"}, + {24, 269, 1475, L"Баган"}, + {24, 269, 1476, L"Барабинск"}, + {24, 269, 1477, L"Бердск"}, + {24, 269, 2750, L"Болотное"}, + {24, 269, 1478, L"Искитим"}, + {24, 269, 2752, L"Карасук"}, + {24, 269, 2751, L"Каргат"}, + {24, 269, 3107, L"Краснообск"}, + {24, 269, 2753, L"Куйбышев"}, + {24, 269, 2755, L"Купино"}, + {24, 269, 1479, L"Новосибирск"}, + {24, 269, 2759, L"Обь"}, + {24, 269, 2756, L"Татарск"}, + {24, 269, 2758, L"Тогучин"}, + {24, 269, 2757, L"Черепаново"}, + {24, 269, 2754, L"Чулым"}, + {24, 269, 2252, L"Другое"}, + {24, 270, 2733, L"Исилькуль"}, + {24, 270, 1480, L"Калачинск"}, + {24, 270, 1481, L"Марьяновка"}, + {24, 270, 2735, L"Называевск"}, + {24, 270, 1482, L"Омск"}, + {24, 270, 2734, L"Тара"}, + {24, 270, 2736, L"Тюкалинск"}, + {24, 270, 2253, L"Другое"}, + {24, 272, 1488, L"Асино"}, + {24, 272, 1489, L"Белый Яр"}, + {24, 272, 3295, L"Каргасок"}, + {24, 272, 1491, L"Колпашево"}, + {24, 272, 1492, L"Северск"}, + {24, 272, 1493, L"Стрежевой"}, + {24, 272, 1490, L"Томск"}, + {24, 272, 2273, L"Другое"}, + {24, 276, 2803, L"Балей"}, + {24, 276, 2799, L"Борзя"}, + {24, 276, 1499, L"Краснокаменск"}, + {24, 276, 2801, L"Могоча"}, + {24, 276, 2800, L"Нерчинск"}, + {24, 276, 2802, L"Петровск-Забайкальский"}, + {24, 276, 2798, L"Сретенск"}, + {24, 276, 2796, L"Хилок"}, + {24, 276, 1498, L"Чита"}, + {24, 276, 2797, L"Шилка"}, + {24, 276, 2285, L"Другое"}, + {24, 262, 1438, L"Агинское"}, + {24, 262, 2213, L"Другое"}, + {24, 271, 3233, L"Диксон"}, + {24, 271, 1485, L"Дудинка"}, + {24, 271, 1487, L"Кайеркан"}, + {24, 271, 1483, L"Норильск"}, + {24, 271, 1484, L"Талнах"}, + {24, 271, 1486, L"Хатанга"}, + {24, 271, 2269, L"Другое"}, + {24, 274, 1495, L"Усть-Ордынский"}, + {24, 274, 2279, L"Другое"}, + {24, 277, 1500, L"Тура"}, + {24, 277, 2288, L"Другое"}, + {24, 278, 2668, L"Далматово"}, + {24, 278, 2667, L"Катайск"}, + {24, 278, 1524, L"Курган"}, + {24, 278, 2669, L"Куртамыш"}, + {24, 278, 2666, L"Макушино"}, + {24, 278, 2671, L"Петухово"}, + {24, 278, 1525, L"Шадринск"}, + {24, 278, 2670, L"Шумиха"}, + {24, 278, 2672, L"Щучье"}, + {24, 278, 2243, L"Другое"}, + {24, 279, 1526, L"Алапаевск"}, + {24, 279, 1527, L"Арамиль"}, + {24, 279, 2691, L"Артемовский"}, + {24, 279, 1528, L"Асбест"}, + {24, 279, 2924, L"Белоярский"}, + {24, 279, 2707, L"Березовский"}, + {24, 279, 1529, L"Богданович"}, + {24, 279, 2698, L"Верхний Тагил"}, + {24, 279, 1530, L"Верхняя Пышма"}, + {24, 279, 1531, L"Верхняя Салда"}, + {24, 279, 1532, L"Верхняя Синячиха"}, + {24, 279, 2696, L"Верхняя Тура"}, + {24, 279, 2692, L"Верхотурье"}, + {24, 279, 2706, L"Волчанск"}, + {24, 279, 2709, L"Дегтярск"}, + {24, 279, 1533, L"Екатеринбург"}, + {24, 279, 1534, L"Заречный"}, + {24, 279, 1535, L"Ивдель"}, + {24, 279, 1536, L"Ирбит"}, + {24, 279, 1537, L"Каменск-Уральский"}, + {24, 279, 1538, L"Камышлов"}, + {24, 279, 2708, L"Карпинск"}, + {24, 279, 1539, L"Качканар"}, + {24, 279, 2712, L"Кировград"}, + {24, 279, 1540, L"Краснотурьинск"}, + {24, 279, 2694, L"Красноуральск"}, + {24, 279, 2693, L"Красноуфимск"}, + {24, 279, 1541, L"Кушва"}, + {24, 279, 2711, L"Михайловск"}, + {24, 279, 2713, L"Михайловск"}, + {24, 279, 1542, L"Невьянск"}, + {24, 279, 2702, L"Нижние Серги"}, + {24, 279, 1543, L"Нижний Тагил"}, + {24, 279, 2695, L"Нижняя Салда"}, + {24, 279, 2697, L"Нижняя Тура"}, + {24, 279, 2699, L"Новая Ляля"}, + {24, 279, 2909, L"Новоуральск"}, + {24, 279, 1544, L"Первоуральск"}, + {24, 279, 1545, L"Полевской"}, + {24, 279, 1546, L"Ревда"}, + {24, 279, 1547, L"Реж"}, + {24, 279, 3296, L"Рефтинский"}, + {24, 279, 2700, L"Североуральск"}, + {24, 279, 1548, L"Серов"}, + {24, 279, 2710, L"Среднеуральск"}, + {24, 279, 2701, L"Сухой Лог"}, + {24, 279, 2703, L"Сысерть"}, + {24, 279, 1549, L"Тавда"}, + {24, 279, 2704, L"Талица"}, + {24, 279, 2705, L"Туринск"}, + {24, 279, 2265, L"Другое"}, + {24, 280, 1550, L"Заводоуковск"}, + {24, 280, 1551, L"Ишим"}, + {24, 280, 3326, L"Сургут"}, + {24, 280, 1552, L"Тобольск"}, + {24, 280, 1553, L"Тюмень"}, + {24, 280, 2748, L"Ялуторовск"}, + {24, 280, 2276, L"Другое"}, + {24, 282, 1564, L"Аша"}, + {24, 282, 2723, L"Бакал"}, + {24, 282, 2724, L"Верхнеуральск"}, + {24, 282, 2716, L"Верхний Уфалей"}, + {24, 282, 3297, L"Всеволожск"}, + {24, 282, 2725, L"Еманжелинск"}, + {24, 282, 1565, L"Златоуст"}, + {24, 282, 2722, L"Карабаш"}, + {24, 282, 1566, L"Карталы"}, + {24, 282, 2718, L"Касли"}, + {24, 282, 2720, L"Катав-Ивановск"}, + {24, 282, 1567, L"Копейск"}, + {24, 282, 2721, L"Коркино"}, + {24, 282, 2715, L"Куса"}, + {24, 282, 1568, L"Кыштым"}, + {24, 282, 1569, L"Магнитогорск"}, + {24, 282, 1570, L"Миасс"}, + {24, 282, 2726, L"Миньяр"}, + {24, 282, 2717, L"Нязепетровск"}, + {24, 282, 3100, L"Озерск"}, + {24, 282, 1571, L"Пласт"}, + {24, 282, 2719, L"Сатка"}, + {24, 282, 2727, L"Сим"}, + {24, 282, 1572, L"Снежинск"}, + {24, 282, 3332, L"Трехгорный"}, + {24, 282, 1573, L"Троицк"}, + {24, 282, 1574, L"Усть-Катав"}, + {24, 282, 1575, L"Чебаркуль"}, + {24, 282, 1576, L"Челябинск"}, + {24, 282, 1577, L"Южноуральск"}, + {24, 282, 2714, L"Юрюзань"}, + {24, 282, 2283, L"Другое"}, + {24, 281, 2749, L"Белоярский"}, + {24, 281, 1554, L"Игрим"}, + {24, 281, 1555, L"Когалым"}, + {24, 281, 1556, L"Лангепас"}, + {24, 281, 1561, L"Мегион"}, + {24, 281, 1562, L"Нефтеюганск"}, + {24, 281, 1559, L"Нижневартовск"}, + {24, 281, 2852, L"Нягань"}, + {24, 281, 2853, L"Нягань"}, + {24, 281, 2854, L"Пыть-Ях"}, + {24, 281, 1560, L"Радужный"}, + {24, 281, 1563, L"Советский"}, + {24, 281, 2747, L"Сургут"}, + {24, 281, 1557, L"Урай"}, + {24, 281, 1558, L"Ханты-Мансийск"}, + {24, 281, 3344, L"Югорск"}, + {24, 281, 2282, L"Другое"}, + {24, 283, 3298, L"Губкинский"}, + {24, 283, 1578, L"Лабытнанги"}, + {24, 283, 2856, L"Муравленко"}, + {24, 283, 1579, L"Надым"}, + {24, 283, 1580, L"Новый Уренгой"}, + {24, 283, 1581, L"Ноябрьск"}, + {24, 283, 1582, L"Салехард"}, + {24, 283, 1583, L"Уренгой"}, + {24, 283, 2289, L"Другое"}, + {24, 284, 1625, L"Алексеевка"}, + {24, 284, 1626, L"Белгород"}, + {24, 284, 2172, L"Валуйки"}, + {24, 284, 2173, L"Грайворон"}, + {24, 284, 1627, L"Губкин"}, + {24, 284, 2174, L"Короча"}, + {24, 284, 2175, L"Новый Оскол"}, + {24, 284, 1628, L"Старый Оскол"}, + {24, 284, 1629, L"Шебекино"}, + {24, 284, 2221, L"Другое"}, + {24, 285, 1630, L"Брянск"}, + {24, 285, 3283, L"Дебрянск"}, + {24, 285, 1631, L"Дятьково"}, + {24, 285, 2013, L"Жуковка"}, + {24, 285, 2015, L"Злынка"}, + {24, 285, 1632, L"Карачев"}, + {24, 285, 1633, L"Клинцы"}, + {24, 285, 1634, L"Мглин"}, + {24, 285, 2016, L"Новозыбков"}, + {24, 285, 2018, L"Почеп"}, + {24, 285, 2017, L"Севск"}, + {24, 285, 2020, L"Сельцо"}, + {24, 285, 2014, L"Стародуб"}, + {24, 285, 2010, L"Сураж"}, + {24, 285, 2012, L"Трубчевск"}, + {24, 285, 2011, L"Унеча"}, + {24, 285, 2019, L"Фокино"}, + {24, 285, 2210, L"Другое"}, + {24, 286, 1635, L"Александров"}, + {24, 286, 1636, L"Владимир"}, + {24, 286, 2021, L"Вязники"}, + {24, 286, 1637, L"Головино"}, + {24, 286, 2022, L"Гороховец"}, + {24, 286, 1638, L"Гусь-Хрустальный"}, + {24, 286, 2023, L"Камешково"}, + {24, 286, 2031, L"Карабаново"}, + {24, 286, 2024, L"Киржач"}, + {24, 286, 1639, L"Ковров"}, + {24, 286, 1640, L"Кольчугино"}, + {24, 286, 2026, L"Костерево"}, + {24, 286, 3299, L"Красная Горбатка"}, + {24, 286, 2033, L"Лакинск"}, + {24, 286, 2025, L"Меленки"}, + {24, 286, 1641, L"Муром"}, + {24, 286, 1642, L"Петушки"}, + {24, 286, 2027, L"Покров"}, + {24, 286, 2211, L"Радужный"}, + {24, 286, 2028, L"Собинка"}, + {24, 286, 2032, L"Струнино"}, + {24, 286, 2029, L"Судогда"}, + {24, 286, 1643, L"Суздаль"}, + {24, 286, 2030, L"Юрьев-Польский"}, + {24, 286, 2212, L"Другое"}, + {24, 287, 1644, L"Бобров"}, + {24, 287, 1645, L"Богучар"}, + {24, 287, 1646, L"Борисоглебск"}, + {24, 287, 1647, L"Бутурлиновка"}, + {24, 287, 1648, L"Воронеж"}, + {24, 287, 2178, L"Калач"}, + {24, 287, 2176, L"Лиски"}, + {24, 287, 1649, L"Нововоронеж"}, + {24, 287, 2177, L"Новохоперск"}, + {24, 287, 2180, L"Острогожск"}, + {24, 287, 1650, L"Павловск"}, + {24, 287, 2181, L"Поворино"}, + {24, 287, 1651, L"Россошь"}, + {24, 287, 2179, L"Семилуки"}, + {24, 287, 2182, L"Эртиль"}, + {24, 287, 2224, L"Другое"}, + {24, 288, 1652, L"Вичуга"}, + {24, 288, 2036, L"Гаврилов Посад"}, + {24, 288, 1657, L"Заволжск"}, + {24, 288, 1653, L"Иваново"}, + {24, 288, 1656, L"Кинешма"}, + {24, 288, 2040, L"Комсомольск"}, + {24, 288, 2037, L"Кохма"}, + {24, 288, 2043, L"Наволоки"}, + {24, 288, 3300, L"Палех"}, + {24, 288, 2039, L"Плес"}, + {24, 288, 2038, L"Приволжск"}, + {24, 288, 2042, L"Пучеж"}, + {24, 288, 2044, L"Родники"}, + {24, 288, 1655, L"Тейково"}, + {24, 288, 2034, L"Фурманов"}, + {24, 288, 1654, L"Шуя"}, + {24, 288, 2041, L"Южа"}, + {24, 288, 2035, L"Юрьевец"}, + {24, 288, 2227, L"Другое"}, + {24, 289, 2050, L"Балабаново"}, + {24, 289, 2051, L"Боровск"}, + {24, 289, 3301, L"Воротынск"}, + {24, 289, 2052, L"Жиздра"}, + {24, 289, 1660, L"Жуковка"}, + {24, 289, 1658, L"Калуга"}, + {24, 289, 2046, L"Киров"}, + {24, 289, 1661, L"Козельск"}, + {24, 289, 2053, L"Кондрово"}, + {24, 289, 2049, L"Людиново"}, + {24, 289, 1659, L"Малоярославец"}, + {24, 289, 2054, L"Медынь"}, + {24, 289, 2055, L"Мещовск"}, + {24, 289, 2047, L"Мосальск"}, + {24, 289, 1662, L"Обнинск"}, + {24, 289, 2057, L"Сосенский"}, + {24, 289, 2056, L"Спас-Демянск"}, + {24, 289, 2045, L"Сухиничи"}, + {24, 289, 1663, L"Таруса"}, + {24, 289, 2131, L"Чекалин"}, + {24, 289, 2048, L"Юхнов"}, + {24, 289, 2233, L"Другое"}, + {24, 290, 1664, L"Буй"}, + {24, 290, 1665, L"Волгореченск"}, + {24, 290, 1666, L"Галич"}, + {24, 290, 2059, L"Кологрив"}, + {24, 290, 1667, L"Кострома"}, + {24, 290, 3302, L"Красное-на-Волге"}, + {24, 290, 1668, L"Макарьев"}, + {24, 290, 2060, L"Мантурово"}, + {24, 290, 1669, L"Нерехта"}, + {24, 290, 2061, L"Нея"}, + {24, 290, 2062, L"Солигалич"}, + {24, 290, 2058, L"Чухлома"}, + {24, 290, 1670, L"Шарья"}, + {24, 290, 2240, L"Другое"}, + {24, 291, 1671, L"Дмитриев-Льговский"}, + {24, 291, 1673, L"Железногорск"}, + {24, 291, 3279, L"Железногорск"}, + {24, 291, 1672, L"Курск"}, + {24, 291, 2187, L"Курчатов"}, + {24, 291, 2188, L"Льгов"}, + {24, 291, 2184, L"Обоянь"}, + {24, 291, 2185, L"Рыльск"}, + {24, 291, 2183, L"Суджа"}, + {24, 291, 2189, L"Фатеж"}, + {24, 291, 2186, L"Щигры"}, + {24, 291, 2244, L"Другое"}, + {24, 292, 2194, L"Грязи"}, + {24, 292, 2193, L"Данков"}, + {24, 292, 1674, L"Елец"}, + {24, 292, 2190, L"Задонск"}, + {24, 292, 2195, L"Лебедянь"}, + {24, 292, 1675, L"Липецк"}, + {24, 292, 2192, L"Усмань"}, + {24, 292, 2191, L"Чаплыгин"}, + {24, 292, 2245, L"Другое"}, + {24, 293, 1733, L"Апрелевка"}, + {24, 293, 1732, L"Балашиха"}, + {24, 293, 1731, L"Бронницы"}, + {24, 293, 1730, L"Верея"}, + {24, 293, 2063, L"Видное"}, + {24, 293, 2064, L"Волоколамск"}, + {24, 293, 1729, L"Воскресенск"}, + {24, 293, 1728, L"Высоковск"}, + {24, 293, 1727, L"Голицыно"}, + {24, 293, 2065, L"Дедовск"}, + {24, 293, 1726, L"Дзержинский"}, + {24, 293, 1725, L"Дмитров"}, + {24, 293, 1724, L"Долгопрудный"}, + {24, 293, 1723, L"Домодедово"}, + {24, 293, 2066, L"Дрезна"}, + {24, 293, 1722, L"Дубна"}, + {24, 293, 1721, L"Егорьевск"}, + {24, 293, 1720, L"Железнодорожный"}, + {24, 293, 1719, L"Жуковский"}, + {24, 293, 2067, L"Зарайск"}, + {24, 293, 1718, L"Звенигород"}, + {24, 293, 1715, L"Ивантеевка"}, + {24, 293, 1717, L"Истра"}, + {24, 293, 2068, L"Калининград"}, + {24, 293, 2069, L"Кашира"}, + {24, 293, 1716, L"Климовск"}, + {24, 293, 1714, L"Клин"}, + {24, 293, 1713, L"Коломна"}, + {24, 293, 1712, L"Королев"}, + {24, 293, 1711, L"Красноармейск"}, + {24, 293, 1710, L"Красногорск"}, + {24, 293, 2070, L"Краснозаводск"}, + {24, 293, 2071, L"Куровское"}, + {24, 293, 1709, L"Ликино-Дулево"}, + {24, 293, 1708, L"Лобня"}, + {24, 293, 2072, L"Лосино-Петровский"}, + {24, 293, 1707, L"Луховицы"}, + {24, 293, 1706, L"Лыткарино"}, + {24, 293, 1705, L"Люберцы"}, + {24, 293, 1704, L"Менделеево"}, + {24, 293, 1703, L"Можайск"}, + {24, 293, 1702, L"Мытищи"}, + {24, 293, 1701, L"Наро-Фоминск"}, + {24, 293, 1700, L"Ногинск"}, + {24, 293, 1698, L"Одинцово"}, + {24, 293, 2073, L"Ожерелье"}, + {24, 293, 2074, L"Озеры"}, + {24, 293, 1699, L"Орехово-Зуево"}, + {24, 293, 1697, L"Павловский Посад"}, + {24, 293, 1696, L"Подольск"}, + {24, 293, 1695, L"Протвино"}, + {24, 293, 1694, L"Пушкино"}, + {24, 293, 1693, L"Пущино"}, + {24, 293, 1692, L"Раменское"}, + {24, 293, 1691, L"Реутов"}, + {24, 293, 1690, L"Решетников"}, + {24, 293, 2075, L"Рошаль"}, + {24, 293, 2076, L"Руза"}, + {24, 293, 1689, L"Сергиев Посад"}, + {24, 293, 1688, L"Серпухов"}, + {24, 293, 1687, L"Солнечногорск"}, + {24, 293, 1686, L"Ступино"}, + {24, 293, 2077, L"Сходня"}, + {24, 293, 2078, L"Талдом"}, + {24, 293, 1685, L"Троицк"}, + {24, 293, 1684, L"Фрязино"}, + {24, 293, 1683, L"Химки"}, + {24, 293, 1682, L"Хотьково"}, + {24, 293, 1681, L"Черноголовка"}, + {24, 293, 1680, L"Чехов"}, + {24, 293, 1679, L"Шатура"}, + {24, 293, 1678, L"Щелково"}, + {24, 293, 2080, L"Щербинка"}, + {24, 293, 1677, L"Электрогорск"}, + {24, 293, 1676, L"Электросталь"}, + {24, 293, 2079, L"Электроугли"}, + {24, 293, 3031, L"Юбилейный"}, + {24, 293, 2081, L"Яхрома"}, + {24, 293, 2249, L"Другое"}, + {24, 294, 2083, L"Болхов"}, + {24, 294, 2082, L"Дмитровск-Орловский"}, + {24, 294, 3160, L"Залегощь"}, + {24, 294, 1736, L"Ливны"}, + {24, 294, 2084, L"Малоархангельск"}, + {24, 294, 1737, L"Мценск"}, + {24, 294, 2085, L"Новосиль"}, + {24, 294, 1735, L"Орел"}, + {24, 294, 2255, L"Другое"}, + {24, 295, 1740, L"Гусь-Железный"}, + {24, 295, 1741, L"Касимов"}, + {24, 295, 2086, L"Кораблино"}, + {24, 295, 2087, L"Михайлов"}, + {24, 295, 2089, L"Новомичуринск"}, + {24, 295, 2091, L"Рыбное"}, + {24, 295, 2093, L"Ряжск"}, + {24, 295, 1738, L"Рязань"}, + {24, 295, 3305, L"Сапожок"}, + {24, 295, 1739, L"Сасово"}, + {24, 295, 2090, L"Скопин"}, + {24, 295, 2088, L"Спас-Клепики"}, + {24, 295, 2092, L"Спасск-Рязанский"}, + {24, 295, 2094, L"Шацк"}, + {24, 295, 3320, L"Шилово"}, + {24, 295, 2260, L"Другое"}, + {24, 296, 2095, L"Велиж"}, + {24, 296, 1743, L"Вязьма"}, + {24, 296, 1744, L"Гагарин"}, + {24, 296, 2096, L"Демидов"}, + {24, 296, 1745, L"Десногорск"}, + {24, 296, 1746, L"Дорогубуж"}, + {24, 296, 2097, L"Духовщина"}, + {24, 296, 2098, L"Ельня"}, + {24, 296, 2099, L"Починок"}, + {24, 296, 2100, L"Рославль"}, + {24, 296, 2101, L"Рудня"}, + {24, 296, 1747, L"Сафоново"}, + {24, 296, 1742, L"Смоленск"}, + {24, 296, 2102, L"Сычевка"}, + {24, 296, 1748, L"Ярцево"}, + {24, 296, 2267, L"Другое"}, + {24, 297, 2198, L"Жердевка"}, + {24, 297, 2199, L"Кирсанов"}, + {24, 297, 1752, L"Котовск"}, + {24, 297, 1751, L"Мичуринск"}, + {24, 297, 2196, L"Моршанск"}, + {24, 297, 1750, L"Рассказово"}, + {24, 297, 3271, L"Сатинка"}, + {24, 297, 1749, L"Тамбов"}, + {24, 297, 3272, L"Тулиновка"}, + {24, 297, 2197, L"Уварово"}, + {24, 297, 2270, L"Другое"}, + {24, 298, 2103, L"Андреаполь"}, + {24, 298, 2104, L"Бежецк"}, + {24, 298, 2105, L"Белый"}, + {24, 298, 2106, L"Бологое"}, + {24, 298, 2107, L"Весьегонск"}, + {24, 298, 1753, L"Вышний Волочек"}, + {24, 298, 2108, L"Западная Двина"}, + {24, 298, 2109, L"Зубцов"}, + {24, 298, 2110, L"Калязин"}, + {24, 298, 2111, L"Кашин"}, + {24, 298, 1758, L"Кимры"}, + {24, 298, 1756, L"Конаково"}, + {24, 298, 2112, L"Красный Холм"}, + {24, 298, 1759, L"Кувшиново"}, + {24, 298, 1760, L"Лихославль"}, + {24, 298, 1761, L"Нелидово"}, + {24, 298, 2113, L"Осташков"}, + {24, 298, 1757, L"Ржев"}, + {24, 298, 2114, L"Старица"}, + {24, 298, 1754, L"Тверь"}, + {24, 298, 2115, L"Торжок"}, + {24, 298, 2116, L"Торопец"}, + {24, 298, 1755, L"Удомля"}, + {24, 298, 2272, L"Другое"}, + {24, 299, 2127, L"Алексин"}, + {24, 299, 2126, L"Белев"}, + {24, 299, 2118, L"Богородицк"}, + {24, 299, 2122, L"Болохово"}, + {24, 299, 2129, L"Венев"}, + {24, 299, 1762, L"Донской"}, + {24, 299, 2128, L"Ефремов"}, + {24, 299, 3354, L"Заокский"}, + {24, 299, 2124, L"Киреевск"}, + {24, 299, 1763, L"Климовск"}, + {24, 299, 2123, L"Липки"}, + {24, 299, 1764, L"Новомосковск"}, + {24, 299, 2117, L"Плавск"}, + {24, 299, 2130, L"Северо-Задонск"}, + {24, 299, 2120, L"Советск"}, + {24, 299, 2119, L"Сокольники"}, + {24, 299, 2125, L"Суворов"}, + {24, 299, 1765, L"Тула"}, + {24, 299, 1766, L"Узловая"}, + {24, 299, 2121, L"Щекино"}, + {24, 299, 1767, L"Ясногорск"}, + {24, 299, 2274, L"Другое"}, + {24, 300, 3053, L"Большое Село"}, + {24, 300, 3268, L"Брейтово"}, + {24, 300, 1773, L"Гаврилов-Ям"}, + {24, 300, 2132, L"Данилов"}, + {24, 300, 3269, L"Красные Ткачи"}, + {24, 300, 2133, L"Любим"}, + {24, 300, 3270, L"Мокеевское"}, + {24, 300, 1774, L"Мышкин"}, + {24, 300, 2994, L"Некоуз"}, + {24, 300, 1775, L"Переславль-Залесский"}, + {24, 300, 2134, L"Пошехонье"}, + {24, 300, 1769, L"Ростов"}, + {24, 300, 1771, L"Рыбинск"}, + {24, 300, 1772, L"Тутаев"}, + {24, 300, 1770, L"Углич"}, + {24, 300, 1768, L"Ярославль"}, + {24, 300, 2290, L"Другое"}, + {24, 301, 2849, L"Адыгейск"}, + {24, 301, 1776, L"Майкоп"}, + {24, 301, 2214, L"Другое"}, + {24, 304, 2617, L"Буйнакск"}, + {24, 304, 1791, L"Гуниб"}, + {24, 304, 1788, L"Дербент"}, + {24, 304, 2619, L"Избербаш"}, + {24, 304, 1789, L"Каспийск"}, + {24, 304, 2618, L"Кизилюрт"}, + {24, 304, 1790, L"Кизляр"}, + {24, 304, 1792, L"Махачкала"}, + {24, 304, 2620, L"Хасавюрт"}, + {24, 304, 2225, L"Другое"}, + {24, 305, 3052, L"Магас"}, + {24, 305, 1787, L"Назрань"}, + {24, 305, 2228, L"Другое"}, + {24, 306, 2621, L"Баксан"}, + {24, 306, 1794, L"Майский"}, + {24, 306, 1793, L"Нальчик"}, + {24, 306, 2622, L"Нарткала"}, + {24, 306, 1795, L"Прохладный"}, + {24, 306, 2623, L"Терек"}, + {24, 306, 2624, L"Тырныауз"}, + {24, 306, 3274, L"Чегем"}, + {24, 306, 2230, L"Другое"}, + {24, 307, 2567, L"Городовиково"}, + {24, 307, 2568, L"Лагань"}, + {24, 307, 3324, L"Троицкое"}, + {24, 307, 1796, L"Элиста"}, + {24, 307, 2232, L"Другое"}, + {24, 308, 1799, L"Домбай"}, + {24, 308, 1798, L"Карачаевск"}, + {24, 308, 2626, L"Теберда"}, + {24, 308, 2625, L"Усть-Джегута"}, + {24, 308, 1797, L"Черкесск"}, + {24, 308, 2235, L"Другое"}, + {24, 311, 2630, L"Алагир"}, + {24, 311, 2631, L"Ардон"}, + {24, 311, 2628, L"Беслан"}, + {24, 311, 1839, L"Владикавказ"}, + {24, 311, 2629, L"Дигора"}, + {24, 311, 2627, L"Моздок"}, + {24, 311, 2266, L"Другое"}, + {24, 313, 2632, L"Аргун"}, + {24, 313, 1853, L"Грозный"}, + {24, 313, 2633, L"Гудермес"}, + {24, 313, 2284, L"Другое"}, + {24, 309, 2636, L"Абинск"}, + {24, 309, 1800, L"Анапа"}, + {24, 309, 1801, L"Апшеронск"}, + {24, 309, 1802, L"Армавир"}, + {24, 309, 1803, L"Белореченск"}, + {24, 309, 1804, L"Геленджик"}, + {24, 309, 1805, L"Горячий Ключ"}, + {24, 309, 2637, L"Гулькевичи"}, + {24, 309, 1806, L"Динская"}, + {24, 309, 1807, L"Ейск"}, + {24, 309, 2638, L"Кореновск"}, + {24, 309, 1808, L"Краснодар"}, + {24, 309, 1809, L"Кропоткин"}, + {24, 309, 1810, L"Крымск"}, + {24, 309, 1811, L"Курганинск"}, + {24, 309, 3232, L"Лабинск"}, + {24, 309, 2639, L"Новокубанск"}, + {24, 309, 1812, L"Новороссийск"}, + {24, 309, 1813, L"Пластуновская"}, + {24, 309, 1814, L"Приморско-Ахтарск"}, + {24, 309, 3102, L"Северская"}, + {24, 309, 1815, L"Славянск-на-Кубани"}, + {24, 309, 1816, L"Сочи"}, + {24, 309, 3266, L"Староминская"}, + {24, 309, 3039, L"Тамань"}, + {24, 309, 1817, L"Темрюк"}, + {24, 309, 2635, L"Тимашевск"}, + {24, 309, 1818, L"Тихорецк"}, + {24, 309, 1819, L"Туапсе"}, + {24, 309, 1820, L"Усть-Лабинск"}, + {24, 309, 2634, L"Хадыженск"}, + {24, 309, 2241, L"Другое"}, + {24, 312, 1840, L"Александровское"}, + {24, 312, 2644, L"Благодарный"}, + {24, 312, 1841, L"Буденновск"}, + {24, 312, 1842, L"Георгиевск"}, + {24, 312, 1843, L"Ессентуки"}, + {24, 312, 1844, L"Железноводск"}, + {24, 312, 2647, L"Зеленокумск"}, + {24, 312, 2641, L"Изобильный"}, + {24, 312, 2642, L"Ипатово"}, + {24, 312, 1845, L"Кисловодск"}, + {24, 312, 1846, L"Кочубеевское"}, + {24, 312, 3367, L"Курсавка"}, + {24, 312, 3265, L"Левокумское"}, + {24, 312, 1847, L"Лермонтов"}, + {24, 312, 1848, L"Минеральные Воды"}, + {24, 312, 1849, L"Невинномысск"}, + {24, 312, 2645, L"Нефтекумск"}, + {24, 312, 2643, L"Новоалександровск"}, + {24, 312, 1850, L"Новопавловск"}, + {24, 312, 1851, L"Новоселицкое"}, + {24, 312, 1852, L"Пятигорск"}, + {24, 312, 2646, L"Светлоград"}, + {24, 312, 2640, L"Ставрополь"}, + {24, 312, 2268, L"Другое"}, + {24, 302, 1777, L"Астрахань"}, + {24, 302, 1778, L"Ахтубинск"}, + {24, 302, 3383, L"Знаменск"}, + {24, 302, 2578, L"Камызяк"}, + {24, 302, 2579, L"Нариманов"}, + {24, 302, 1786, L"Харабали"}, + {24, 302, 2219, L"Другое"}, + {24, 303, 1779, L"Волгоград"}, + {24, 303, 1780, L"Волжский"}, + {24, 303, 2584, L"Дубовка"}, + {24, 303, 1781, L"Жирновск"}, + {24, 303, 1782, L"Калач-на-Дону"}, + {24, 303, 1783, L"Камышин"}, + {24, 303, 2588, L"Котельниково"}, + {24, 303, 2591, L"Котово"}, + {24, 303, 2587, L"Краснослободск"}, + {24, 303, 2582, L"Ленинск"}, + {24, 303, 2590, L"Михайловка"}, + {24, 303, 1784, L"Николаевск"}, + {24, 303, 2581, L"Новоаннинский"}, + {24, 303, 2583, L"Палласовка"}, + {24, 303, 2580, L"Петров Вал"}, + {24, 303, 2589, L"Серафимович"}, + {24, 303, 2585, L"Суровикино"}, + {24, 303, 1785, L"Урюпинск"}, + {24, 303, 2586, L"Фролово"}, + {24, 303, 2223, L"Другое"}, + {24, 310, 1821, L"Азов"}, + {24, 310, 1822, L"Аксай"}, + {24, 310, 1823, L"Багаевская"}, + {24, 310, 1824, L"Батайск"}, + {24, 310, 1825, L"Белая Калитва"}, + {24, 310, 1826, L"Волгодонск"}, + {24, 310, 1827, L"Гуково"}, + {24, 310, 2651, L"Донецк"}, + {24, 310, 1828, L"Зерноград"}, + {24, 310, 3264, L"Каменоломни"}, + {24, 310, 2652, L"Каменск-Шахтинский"}, + {24, 310, 2649, L"Константиновск"}, + {24, 310, 2648, L"Красный Сулин"}, + {24, 310, 1829, L"Миллерово"}, + {24, 310, 2653, L"Морозовск"}, + {24, 310, 1830, L"Новочеркасск"}, + {24, 310, 1831, L"Новошахтинск"}, + {24, 310, 1832, L"Пролетарск"}, + {24, 310, 1833, L"Ростов-на-Дону"}, + {24, 310, 1834, L"Сальск"}, + {24, 310, 1835, L"Семикаракорск"}, + {24, 310, 1836, L"Таганрог"}, + {24, 310, 1837, L"Усть-Донецкий"}, + {24, 310, 3263, L"Целина"}, + {24, 310, 2650, L"Цимлянск"}, + {24, 310, 1838, L"Шахты"}, + {24, 310, 2259, L"Другое"}, + {139, 407, 407, L" столица"}, + {139, 426, 427, L"Бойсе"}, + {139, 426, 2354, L"Другое"}, + {139, 378, 3109, L"Айова Сити"}, + {139, 378, 379, L"Де-Мойн"}, + {139, 378, 2963, L"Декора"}, + {139, 378, 2355, L"Другое"}, + {139, 412, 3236, L"Бирмингем"}, + {139, 412, 413, L"Монтгомери"}, + {139, 412, 1181, L"Хантсвилл"}, + {139, 412, 2356, L"Другое"}, + {139, 446, 1182, L"Анкоридж"}, + {139, 446, 447, L"Джуно"}, + {139, 446, 1183, L"Фэрбенкс"}, + {139, 446, 2357, L"Другое"}, + {139, 434, 2917, L"Темпе"}, + {139, 434, 1184, L"Тусон"}, + {139, 434, 435, L"Финикс"}, + {139, 434, 3061, L"Чандлер"}, + {139, 434, 2358, L"Другое"}, + {139, 416, 417, L"Литл-Рок"}, + {139, 416, 2359, L"Другое"}, + {139, 428, 3017, L"Ларами"}, + {139, 428, 429, L"Шайенн"}, + {139, 428, 2360, L"Другое"}, + {139, 440, 2956, L"Беллевью"}, + {139, 440, 2967, L"Бремертон"}, + {139, 440, 3385, L"Ванкувер"}, + {139, 440, 2865, L"Линден"}, + {139, 440, 441, L"Олимпия"}, + {139, 440, 3352, L"Порт Орчард"}, + {139, 440, 2876, L"Редмонт"}, + {139, 440, 3003, L"Рентон"}, + {139, 440, 1185, L"Сиэтл"}, + {139, 440, 2983, L"Снохомиш"}, + {139, 440, 1186, L"Такома"}, + {139, 440, 3152, L"Фрайди Харбор"}, + {139, 440, 2886, L"Эверет"}, + {139, 440, 2361, L"Другое"}, + {139, 352, 353, L"Монтпильер"}, + {139, 352, 2861, L"Норвич"}, + {139, 352, 2362, L"Другое"}, + {139, 394, 1188, L"Александрия"}, + {139, 394, 1187, L"Арлингтон"}, + {139, 394, 2969, L"Даллес"}, + {139, 394, 1189, L"Манассас"}, + {139, 394, 3114, L"Норфолк"}, + {139, 394, 2885, L"Ньюпорт-Ньюс"}, + {139, 394, 2979, L"Раунд Хил"}, + {139, 394, 3338, L"Рестон"}, + {139, 394, 395, L"Ричмонд"}, + {139, 394, 3005, L"Уоррентон"}, + {139, 394, 2991, L"Херндон"}, + {139, 394, 2996, L"Центрвиль"}, + {139, 394, 3097, L"Чантилли"}, + {139, 394, 2981, L"Шарлотесвиль"}, + {139, 394, 2363, L"Другое"}, + {139, 374, 2995, L"Грин-Бей"}, + {139, 374, 375, L"Мадисон"}, + {139, 374, 2365, L"Другое"}, + {139, 448, 449, L"Гонолулу"}, + {139, 448, 1191, L"Хило"}, + {139, 448, 2367, L"Другое"}, + {139, 390, 3021, L"Вильмингтон"}, + {139, 390, 391, L"Довер"}, + {139, 390, 2973, L"Льюис"}, + {139, 390, 2369, L"Другое"}, + {139, 402, 403, L"Атланта"}, + {139, 402, 2370, L"Другое"}, + {139, 396, 397, L"Чарлстон"}, + {139, 396, 2371, L"Другое"}, + {139, 370, 2911, L"Вестмонт"}, + {139, 370, 3074, L"Гарвард"}, + {139, 370, 371, L"Спрингфилд"}, + {139, 370, 2930, L"Урбана"}, + {139, 370, 1194, L"Чикаго"}, + {139, 370, 2372, L"Другое"}, + {139, 368, 369, L"Индианаполис"}, + {139, 368, 1195, L"Эвансвил"}, + {139, 368, 2373, L"Другое"}, + {139, 444, 2959, L"Анахайм"}, + {139, 444, 2961, L"Аптос"}, + {139, 444, 2912, L"Артезия"}, + {139, 444, 2899, L"Беверли Хилз"}, + {139, 444, 1196, L"Беркли"}, + {139, 444, 3249, L"Бреа"}, + {139, 444, 3014, L"Брисбейн"}, + {139, 444, 3048, L"Венис"}, + {139, 444, 2901, L"Вест-Голливуд"}, + {139, 444, 2926, L"Вестлейк Вилладж"}, + {139, 444, 2922, L"Гардена"}, + {139, 444, 1203, L"Глендейл"}, + {139, 444, 2978, L"Денвиль"}, + {139, 444, 2990, L"Дублин"}, + {139, 444, 3077, L"Дэвис"}, + {139, 444, 2918, L"Ирвайн"}, + {139, 444, 2881, L"Карсон"}, + {139, 444, 3247, L"Кипресс"}, + {139, 444, 3092, L"Коста Меса"}, + {139, 444, 2948, L"Купертино"}, + {139, 444, 1197, L"Лонг-Бич"}, + {139, 444, 1198, L"Лос-Анджелес"}, + {139, 444, 3058, L"Лос-Гатос"}, + {139, 444, 3328, L"Марина-дель-Рей"}, + {139, 444, 2874, L"Маунтин-Вью"}, + {139, 444, 2998, L"Милпитас"}, + {139, 444, 3087, L"Монтерей"}, + {139, 444, 2947, L"Окленд"}, + {139, 444, 2900, L"Пало Альто"}, + {139, 444, 1199, L"Пасадена"}, + {139, 444, 3335, L"Редвуд"}, + {139, 444, 2966, L"Розамонд"}, + {139, 444, 445, L"Сакраменто"}, + {139, 444, 1200, L"Сан-Диего"}, + {139, 444, 3317, L"Сан-Мартин"}, + {139, 444, 1201, L"Сан-Франциско"}, + {139, 444, 1202, L"Сан-Хосе"}, + {139, 444, 2878, L"Саннивейл"}, + {139, 444, 2925, L"Санта-Барбара"}, + {139, 444, 2875, L"Санта-Клара"}, + {139, 444, 1204, L"Санта-Круз"}, + {139, 444, 2859, L"Санта-Моника"}, + {139, 444, 3157, L"Студио Сити"}, + {139, 444, 3146, L"Торранс"}, + {139, 444, 2970, L"Тысяча Дубов"}, + {139, 444, 2949, L"Универсал-Сити"}, + {139, 444, 3057, L"Форт Брэгг"}, + {139, 444, 3032, L"Фостер-Сити"}, + {139, 444, 3381, L"Фремонт"}, + {139, 444, 3028, L"Фуллертон"}, + {139, 444, 2858, L"Эмервиль"}, + {139, 444, 3040, L"Эскондидо"}, + {139, 444, 2374, L"Другое"}, + {139, 388, 3041, L"Лоуренс"}, + {139, 388, 389, L"Топика"}, + {139, 388, 2375, L"Другое"}, + {139, 408, 3004, L"Лексингтон"}, + {139, 408, 1205, L"Луисвилл"}, + {139, 408, 409, L"Франкфорт"}, + {139, 408, 2376, L"Другое"}, + {139, 430, 1206, L"Боулдер"}, + {139, 430, 3095, L"Грили"}, + {139, 430, 431, L"Денвер"}, + {139, 430, 1207, L"Колорадо-Спрингс"}, + {139, 430, 3046, L"Литлтон"}, + {139, 430, 2377, L"Другое"}, + {139, 358, 2968, L"Дариен"}, + {139, 358, 3018, L"Денбери"}, + {139, 358, 2882, L"Стэмфорд"}, + {139, 358, 359, L"Хартфорд"}, + {139, 358, 3047, L"Шелтон"}, + {139, 358, 2378, L"Другое"}, + {139, 418, 419, L"Батон-Руж"}, + {139, 418, 1208, L"Новый Орлеан"}, + {139, 418, 2408, L"Другое"}, + {139, 354, 2931, L"Аттлеборо"}, + {139, 354, 3334, L"Билерика"}, + {139, 354, 355, L"Бостон"}, + {139, 354, 3059, L"Вестгемптон"}, + {139, 354, 2919, L"Вобурн"}, + {139, 354, 2902, L"Дедхэм"}, + {139, 354, 1209, L"Кеймбридж"}, + {139, 354, 3336, L"Нидхем"}, + {139, 354, 2985, L"Ньютонвиль"}, + {139, 354, 3022, L"Уолтхэм"}, + {139, 354, 2407, L"Другое"}, + {139, 376, 1210, L"Миннеаполис"}, + {139, 376, 2980, L"Плимут"}, + {139, 376, 377, L"Сент-Пол"}, + {139, 376, 3035, L"Эден Прейри"}, + {139, 376, 2406, L"Другое"}, + {139, 414, 415, L"Джэксон"}, + {139, 414, 2405, L"Другое"}, + {139, 380, 381, L"Джефферсон-Сити"}, + {139, 380, 3062, L"Канзас Сити"}, + {139, 380, 3038, L"Ли Саммит"}, + {139, 380, 1211, L"Сент-Луис"}, + {139, 380, 2895, L"Эллисвил"}, + {139, 380, 2404, L"Другое"}, + {139, 372, 3357, L"Вест Блюмфельд"}, + {139, 372, 1212, L"Гранд-Рапидс"}, + {139, 372, 1213, L"Детройт"}, + {139, 372, 3103, L"Каламазу"}, + {139, 372, 373, L"Лансинг"}, + {139, 372, 2987, L"Новай"}, + {139, 372, 2887, L"Сагино"}, + {139, 372, 2403, L"Другое"}, + {139, 424, 1214, L"Грейт-Фолс"}, + {139, 424, 425, L"Хелина"}, + {139, 424, 2402, L"Другое"}, + {139, 348, 349, L"Огаста"}, + {139, 348, 3000, L"Ярмут"}, + {139, 348, 2401, L"Другое"}, + {139, 392, 393, L"Аннаполис"}, + {139, 392, 1215, L"Балтимор"}, + {139, 392, 3143, L"Гринбелт"}, + {139, 392, 3337, L"Колледж Парк"}, + {139, 392, 2904, L"Маунт Эйри"}, + {139, 392, 3329, L"Роквилль"}, + {139, 392, 2400, L"Другое"}, + {139, 386, 387, L"Линкольн"}, + {139, 386, 1216, L"Омаха"}, + {139, 386, 2399, L"Другое"}, + {139, 438, 439, L"Карсон-Сити"}, + {139, 438, 1217, L"Лас-Вегас"}, + {139, 438, 2890, L"Рено"}, + {139, 438, 2398, L"Другое"}, + {139, 362, 1219, L"Атлантик-Сити"}, + {139, 362, 1218, L"Ньюарк"}, + {139, 362, 3276, L"Оклин"}, + {139, 362, 3073, L"Принстон"}, + {139, 362, 2955, L"Рузерфорд"}, + {139, 362, 3349, L"Сомервиль"}, + {139, 362, 363, L"Трентон"}, + {139, 362, 3078, L"Хакеттстоун"}, + {139, 362, 3248, L"Черри Хилл"}, + {139, 362, 2397, L"Другое"}, + {139, 360, 3134, L"Баффало"}, + {139, 360, 3081, L"Бингхэмптон"}, + {139, 360, 2997, L"Бруклин"}, + {139, 360, 2999, L"Варвик"}, + {139, 360, 3139, L"Ирвингтон"}, + {139, 360, 3060, L"Итака"}, + {139, 360, 1220, L"Нью-Йорк"}, + {139, 360, 361, L"Олбани"}, + {139, 360, 2914, L"Погкипси"}, + {139, 360, 3056, L"Саратога Спрингс"}, + {139, 360, 2396, L"Другое"}, + {139, 432, 1222, L"Альбукерке"}, + {139, 432, 433, L"Санта-Фе"}, + {139, 432, 2395, L"Другое"}, + {139, 350, 2989, L"Амхерст"}, + {139, 350, 351, L"Конкорд"}, + {139, 350, 2950, L"Лондондерри"}, + {139, 350, 1221, L"Манчестер"}, + {139, 350, 3111, L"Рочестер"}, + {139, 350, 2898, L"Салем"}, + {139, 350, 2938, L"Хадсон"}, + {139, 350, 2394, L"Другое"}, + {139, 366, 2953, L"Варрен"}, + {139, 366, 3112, L"Гроув Сити"}, + {139, 366, 1223, L"Кливленд"}, + {139, 366, 367, L"Колумбус"}, + {139, 366, 2951, L"Лавленд"}, + {139, 366, 2862, L"Оберлин"}, + {139, 366, 3034, L"Рейнольдсбург"}, + {139, 366, 2860, L"Цинциннати"}, + {139, 366, 2393, L"Другое"}, + {139, 420, 421, L"Оклахома-Сити"}, + {139, 420, 1224, L"Талса"}, + {139, 420, 2392, L"Другое"}, + {139, 442, 2877, L"Кламат-Фолс"}, + {139, 442, 2945, L"Коттедж-Гроув"}, + {139, 442, 1225, L"Портленд"}, + {139, 442, 443, L"Сейлем"}, + {139, 442, 1226, L"Юджин"}, + {139, 442, 2391, L"Другое"}, + {139, 364, 3316, L"Вифлием"}, + {139, 364, 3282, L"Колледжвиль"}, + {139, 364, 2972, L"Нью Фридом"}, + {139, 364, 1227, L"Питтсбург"}, + {139, 364, 2893, L"Рандор"}, + {139, 364, 3110, L"Слиппери Рок"}, + {139, 364, 1228, L"Филадельфия"}, + {139, 364, 365, L"Харрисберг"}, + {139, 364, 2390, L"Другое"}, + {139, 450, 451, L"Понсе"}, + {139, 450, 3093, L"Сан-Хуан"}, + {139, 450, 2389, L"Другое"}, + {139, 356, 357, L"Провиденс"}, + {139, 356, 2388, L"Другое"}, + {139, 382, 383, L"Бисмарк"}, + {139, 382, 2387, L"Другое"}, + {139, 398, 2960, L"Вильмингтон"}, + {139, 398, 2915, L"Дурхам"}, + {139, 398, 399, L"Роли"}, + {139, 398, 2386, L"Другое"}, + {139, 410, 2863, L"Мемфис"}, + {139, 410, 411, L"Нашвилл"}, + {139, 410, 1229, L"Ноксвилл"}, + {139, 410, 2385, L"Другое"}, + {139, 422, 3085, L"Бедфорд"}, + {139, 422, 2913, L"Брейди"}, + {139, 422, 1233, L"Даллас"}, + {139, 422, 2916, L"Ирвинг"}, + {139, 422, 3123, L"Кингсвилл"}, + {139, 422, 2873, L"Конрой"}, + {139, 422, 3096, L"Корпус Кристи"}, + {139, 422, 423, L"Остин"}, + {139, 422, 1232, L"Сан-Антонио"}, + {139, 422, 3023, L"Уайли"}, + {139, 422, 1231, L"Хьюстон"}, + {139, 422, 1230, L"Эль-Пасо"}, + {139, 422, 2384, L"Другое"}, + {139, 406, 2383, L"Другое"}, + {139, 404, 2879, L"Бока-Рейтон"}, + {139, 404, 2880, L"Гейнсвил"}, + {139, 404, 3086, L"Джексонвиль"}, + {139, 404, 3002, L"Киссимми"}, + {139, 404, 3124, L"Корал Гейблс"}, + {139, 404, 2894, L"Корал-Спрингс"}, + {139, 404, 3290, L"Лейк-Ворт"}, + {139, 404, 1234, L"Майами"}, + {139, 404, 1236, L"Орландо"}, + {139, 404, 3372, L"Пинеллас Парк"}, + {139, 404, 2952, L"Пунта-Горда"}, + {139, 404, 3340, L"Сарасота"}, + {139, 404, 1235, L"Сент-Питерсберг"}, + {139, 404, 405, L"Таллахасси"}, + {139, 404, 2962, L"Форт Лаудердейл"}, + {139, 404, 2382, L"Другое"}, + {139, 384, 385, L"Пирр"}, + {139, 384, 2381, L"Другое"}, + {139, 400, 401, L"Колумбия"}, + {139, 400, 3090, L"Спартанбург"}, + {139, 400, 1237, L"Чарлстон"}, + {139, 400, 2380, L"Другое"}, + {139, 436, 3036, L"Кейсвилл"}, + {139, 436, 3024, L"Линдон"}, + {139, 436, 3108, L"Орем"}, + {139, 436, 2866, L"Сент-Джордж"}, + {139, 436, 437, L"Солт-Лейк-Сити"}, + {139, 436, 2379, L"Другое"}, + {39, 315, 614, L"Винница"}, + {39, 315, 615, L"Хмельник"}, + {39, 315, 2566, L"Другое"}, + {39, 316, 2940, L"Ковель"}, + {39, 316, 616, L"Луцк"}, + {39, 316, 2565, L"Другое"}, + {39, 317, 617, L"Днепродзержинск"}, + {39, 317, 618, L"Днепропетровск"}, + {39, 317, 619, L"Кривой Рог"}, + {39, 317, 620, L"Никополь"}, + {39, 317, 621, L"Новомосковск"}, + {39, 317, 622, L"Орджоникидзе"}, + {39, 317, 623, L"Павлоград"}, + {39, 317, 2564, L"Другое"}, + {39, 318, 624, L"Артемовск"}, + {39, 318, 625, L"Горловка"}, + {39, 318, 626, L"Донецк"}, + {39, 318, 627, L"Дружковка"}, + {39, 318, 628, L"Енакиево"}, + {39, 318, 629, L"Константиновка"}, + {39, 318, 630, L"Краматорск"}, + {39, 318, 2944, L"Красноармейск"}, + {39, 318, 631, L"Макеевка"}, + {39, 318, 632, L"Мариуполь"}, + {39, 318, 633, L"Николаевка"}, + {39, 318, 634, L"Славянск"}, + {39, 318, 635, L"Харцызск"}, + {39, 318, 2563, L"Другое"}, + {39, 319, 636, L"Бердичев"}, + {39, 319, 637, L"Житомир"}, + {39, 319, 2942, L"Коростень"}, + {39, 319, 638, L"Коростышев"}, + {39, 319, 2907, L"Малин"}, + {39, 319, 639, L"Новоград-Волынский"}, + {39, 319, 2562, L"Другое"}, + {39, 320, 640, L"Берегово"}, + {39, 320, 641, L"Воловец"}, + {39, 320, 3119, L"Мукачево"}, + {39, 320, 3162, L"Свалява"}, + {39, 320, 642, L"Ужгород"}, + {39, 320, 643, L"Хуст"}, + {39, 320, 2561, L"Другое"}, + {39, 321, 644, L"Бердянск"}, + {39, 321, 3128, L"Гуляйполе"}, + {39, 321, 645, L"Запорожье"}, + {39, 321, 646, L"Мелитополь"}, + {39, 321, 3121, L"Приморск"}, + {39, 321, 3378, L"Энергодар"}, + {39, 321, 2560, L"Другое"}, + {39, 322, 3379, L"Галич"}, + {39, 322, 647, L"Ивано-Франковск"}, + {39, 322, 3170, L"Яремче"}, + {39, 322, 2559, L"Другое"}, + {39, 323, 648, L"Белая Церковь"}, + {39, 323, 649, L"Борисполь"}, + {39, 323, 651, L"Бровары"}, + {39, 323, 650, L"Васильков"}, + {39, 323, 652, L"Ирпень"}, + {39, 323, 3341, L"Переяслав-Хмельницкий"}, + {39, 323, 653, L"Славутич"}, + {39, 323, 654, L"Фастов"}, + {39, 323, 655, L"Чернобыль"}, + {39, 323, 2558, L"Другое"}, + {39, 324, 656, L"Александрия"}, + {39, 324, 657, L"Кировоград"}, + {39, 324, 658, L"Светловодск"}, + {39, 324, 2557, L"Другое"}, + {39, 325, 659, L"Алушта"}, + {39, 325, 2984, L"Армянск"}, + {39, 325, 3042, L"Балаклава"}, + {39, 325, 660, L"Бахчисарай"}, + {39, 325, 662, L"Гурзуф"}, + {39, 325, 3382, L"Джанкой"}, + {39, 325, 663, L"Евпатория"}, + {39, 325, 667, L"Керчь"}, + {39, 325, 666, L"Коктебель"}, + {39, 325, 668, L"Мысовое"}, + {39, 325, 669, L"Саки"}, + {39, 325, 665, L"Севастополь"}, + {39, 325, 661, L"Симферополь"}, + {39, 325, 3370, L"Старый Крым"}, + {39, 325, 670, L"Судак"}, + {39, 325, 664, L"Феодосия"}, + {39, 325, 3148, L"Черноморское"}, + {39, 325, 671, L"Ялта"}, + {39, 325, 2556, L"Другое"}, + {39, 326, 672, L"Алчевск"}, + {39, 326, 673, L"Антрацит"}, + {39, 326, 674, L"Лисичанск"}, + {39, 326, 675, L"Луганск"}, + {39, 326, 3364, L"Молодогвардейск"}, + {39, 326, 676, L"Петровское"}, + {39, 326, 677, L"Ровеньки"}, + {39, 326, 678, L"Рубежное"}, + {39, 326, 679, L"Северодонецк"}, + {39, 326, 680, L"Стаханов"}, + {39, 326, 2555, L"Другое"}, + {39, 327, 3284, L"Дрогобыч"}, + {39, 327, 681, L"Львов"}, + {39, 327, 682, L"Трускавец"}, + {39, 327, 2554, L"Другое"}, + {39, 328, 3322, L"Вознесенск"}, + {39, 328, 2870, L"Жовтневое"}, + {39, 328, 683, L"Николаев"}, + {39, 328, 3118, L"Очаков"}, + {39, 328, 3325, L"Южноукраинск"}, + {39, 328, 2553, L"Другое"}, + {39, 329, 684, L"Белгород-Днестровский"}, + {39, 329, 685, L"Измаил"}, + {39, 329, 689, L"Ильичевск"}, + {39, 329, 686, L"Одесса"}, + {39, 329, 688, L"Рени"}, + {39, 329, 687, L"Слободка"}, + {39, 329, 2552, L"Другое"}, + {39, 330, 690, L"Гадяч"}, + {39, 330, 691, L"Комсомольск"}, + {39, 330, 693, L"Кременчуг"}, + {39, 330, 694, L"Лубны"}, + {39, 330, 695, L"Миргород"}, + {39, 330, 692, L"Полтава"}, + {39, 330, 2551, L"Другое"}, + {39, 331, 696, L"Здолбунов"}, + {39, 331, 697, L"Ровно"}, + {39, 331, 3361, L"Сарны"}, + {39, 331, 2550, L"Другое"}, + {39, 332, 3356, L"Бурынь"}, + {39, 332, 698, L"Конотоп"}, + {39, 332, 700, L"Ромны"}, + {39, 332, 699, L"Сумы"}, + {39, 332, 701, L"Шостка"}, + {39, 332, 2549, L"Другое"}, + {39, 333, 702, L"Бережаны"}, + {39, 333, 3171, L"Борщев"}, + {39, 333, 703, L"Тернополь"}, + {39, 333, 704, L"Чортков"}, + {39, 333, 2548, L"Другое"}, + {39, 334, 705, L"Изюм"}, + {39, 334, 3346, L"Купянск"}, + {39, 334, 3351, L"Купянск"}, + {39, 334, 706, L"Лозовая"}, + {39, 334, 708, L"Мерефа"}, + {39, 334, 707, L"Харьков"}, + {39, 334, 709, L"Чугуев"}, + {39, 334, 2547, L"Другое"}, + {39, 335, 710, L"Геническ"}, + {39, 335, 711, L"Каховка"}, + {39, 335, 712, L"Новая Каховка"}, + {39, 335, 3280, L"Скадовск"}, + {39, 335, 713, L"Херсон"}, + {39, 335, 2546, L"Другое"}, + {39, 336, 714, L"Каменец-Подольский"}, + {39, 336, 715, L"Красилов"}, + {39, 336, 2941, L"Нетишин"}, + {39, 336, 716, L"Полонное"}, + {39, 336, 3120, L"Сатанов"}, + {39, 336, 2943, L"Славута"}, + {39, 336, 717, L"Хмельницкий"}, + {39, 336, 3155, L"Чемировцы"}, + {39, 336, 2542, L"Другое"}, + {39, 337, 3169, L"Золотоноша"}, + {39, 337, 3016, L"Канев"}, + {39, 337, 3333, L"Полонное"}, + {39, 337, 718, L"Умань"}, + {39, 337, 719, L"Христиновка"}, + {39, 337, 720, L"Черкассы"}, + {39, 337, 2545, L"Другое"}, + {39, 338, 721, L"Нежин"}, + {39, 338, 722, L"Прилуки"}, + {39, 338, 723, L"Чернигов"}, + {39, 338, 2544, L"Другое"}, + {39, 339, 724, L"Черновцы"}, + {39, 339, 2543, L"Другое"}, + {340, 342, 725, L"Барановичи"}, + {340, 342, 726, L"Белоозерск"}, + {340, 342, 727, L"Береза"}, + {340, 342, 728, L"Брест"}, + {340, 342, 3172, L"Дрогичин"}, + {340, 342, 729, L"Кобрин"}, + {340, 342, 730, L"Ляховичи"}, + {340, 342, 731, L"Малорита"}, + {340, 342, 732, L"Пинск"}, + {340, 342, 2538, L"Другое"}, + {340, 343, 733, L"Браслав"}, + {340, 343, 735, L"Витебск"}, + {340, 343, 734, L"Новолукомоль"}, + {340, 343, 736, L"Новополоцк"}, + {340, 343, 737, L"Орша"}, + {340, 343, 738, L"Толочин"}, + {340, 343, 2537, L"Другое"}, + {340, 344, 739, L"Гомель"}, + {340, 344, 740, L"Жлобин"}, + {340, 344, 741, L"Мозырь"}, + {340, 344, 742, L"Речица"}, + {340, 344, 743, L"Рогачев"}, + {340, 344, 744, L"Светлогорск"}, + {340, 344, 2536, L"Другое"}, + {340, 345, 745, L"Волковыск"}, + {340, 345, 746, L"Гродно"}, + {340, 345, 747, L"Лида"}, + {340, 345, 3244, L"Слоним"}, + {340, 345, 748, L"Сморгонь"}, + {340, 345, 2535, L"Другое"}, + {340, 346, 3149, L"Березино"}, + {340, 346, 749, L"Борисов"}, + {340, 346, 750, L"Вилейка"}, + {340, 346, 751, L"Жодино"}, + {340, 346, 752, L"Марьина Горка"}, + {340, 346, 753, L"Молодечно"}, + {340, 346, 2896, L"Слуцк"}, + {340, 346, 754, L"Смолевичи"}, + {340, 346, 755, L"Солигорск"}, + {340, 346, 756, L"Червень"}, + {340, 346, 2534, L"Другое"}, + {340, 347, 757, L"Бобруйск"}, + {340, 347, 758, L"Могилев"}, + {340, 347, 759, L"Осиповичи"}, + {340, 347, 2533, L"Другое"}, + {0, 0, 0, NULL} +}; + + + + +#endif // !defined(AFX_MRA_PLACES_H__INCLUDED_) \ No newline at end of file diff --git a/MRA/Docs/docs.rar b/MRA/Docs/docs.rar new file mode 100644 index 0000000..0542097 Binary files /dev/null and b/MRA/Docs/docs.rar differ diff --git a/MRA/Docs/proto.htm b/MRA/Docs/proto.htm new file mode 100644 index 0000000..ec334ff --- /dev/null +++ b/MRA/Docs/proto.htm @@ -0,0 +1,103 @@ + + + + + +//*************************************************************************** +// $Id: proto.h,v 1.141 2005/10/24 15:32:33 shingrus Exp $ +//*************************************************************************** +#ifndef MRIM_PROTO_H #define MRIM_PROTO_H #include #define +PROTO_VERSION_MAJOR 1 #define PROTO_VERSION_MINOR 10 #define PROTO_VERSION +((((u_long)(PROTO_VERSION_MAJOR))<<16)|(u_long)(PROTO_VERSION_MINOR)) +#define PROTO_MAJOR(p) (((p)&0xFFFF0000)>>16) #define PROTO_MINOR(p) +((p)&0x0000FFFF) typedef struct mrim_packet_header_t { u_long magic; // +Magic u_long proto; // Версия протокола u_long seq; // Sequence u_long msg; // +Тип пакета u_long dlen; // Длина данных u_long from; // Адрес отправителя u_long +fromport; // Порт отправителя u_char reserved[16]; // Зарезервировано } +mrim_packet_header_t; #define CS_MAGIC 0xDEADBEEF // Клиентский Magic ( C +<-> S ) +/*************************************************************************** +ПРОТОКОЛ СВЯЗИ КЛИЕНТ-СЕРВЕР +***************************************************************************/ +#define MRIM_CS_HELLO 0x1001 // C -> S // empty #define MRIM_CS_HELLO_ACK +0x1002 // S -> C // mrim_connection_params_t #define MRIM_CS_LOGIN_ACK 0x1004 +// S -> C // empty #define MRIM_CS_LOGIN_REJ 0x1005 // S -> C // LPS +reason #define MRIM_CS_PING 0x1006 // C -> S // empty #define MRIM_CS_MESSAGE +0x1008 // C -> S // UL flags // LPS to // LPS message // LPS rtf-formatted +message (>=1.1) #define MESSAGE_FLAG_OFFLINE 0x00000001 #define +MESSAGE_FLAG_NORECV 0x00000004 #define MESSAGE_FLAG_AUTHORIZE 0x00000008 // +X-MRIM-Flags: 00000008 #define MESSAGE_FLAG_SYSTEM 0x00000040 #define +MESSAGE_FLAG_RTF 0x00000080 #define MESSAGE_FLAG_CONTACT 0x00000200 #define +MESSAGE_FLAG_NOTIFY 0x00000400 #define MESSAGE_FLAG_MULTICAST 0x00001000 #define +MAX_MULTICAST_RECIPIENTS 50 #define MESSAGE_USERFLAGS_MASK 0x000036A8 // Flags +that user is allowed to set himself #define MRIM_CS_MESSAGE_ACK 0x1009 // S +-> C // UL msg_id // UL flags // LPS from // LPS message // LPS rtf-formatted +message (>=1.1) #define MRIM_CS_MESSAGE_RECV 0x1011 // C -> S // LPS from +// UL msg_id #define MRIM_CS_MESSAGE_STATUS 0x1012 // S -> C // UL status +#define MESSAGE_DELIVERED 0x0000 // Message delivered directly to user #define +MESSAGE_REJECTED_NOUSER 0x8001 // Message rejected - no such user #define +MESSAGE_REJECTED_INTERR 0x8003 // Internal server error #define +MESSAGE_REJECTED_LIMIT_EXCEEDED 0x8004 // Offline messages limit exceeded +#define MESSAGE_REJECTED_TOO_LARGE 0x8005 // Message is too large #define +MESSAGE_REJECTED_DENY_OFFMSG 0x8006 // User does not accept offline messages +#define MRIM_CS_USER_STATUS 0x100F // S -> C // UL status #define +STATUS_OFFLINE 0x00000000 #define STATUS_ONLINE 0x00000001 #define STATUS_AWAY +0x00000002 #define STATUS_UNDETERMINATED 0x00000003 #define +STATUS_FLAG_INVISIBLE 0x80000000 // LPS user #define MRIM_CS_LOGOUT 0x1013 // S +-> C // UL reason #define LOGOUT_NO_RELOGIN_FLAG 0x0010 // Logout due to +double login #define MRIM_CS_CONNECTION_PARAMS 0x1014 // S -> C // +mrim_connection_params_t #define MRIM_CS_USER_INFO 0x1015 // S -> C // (LPS +key, LPS value)* X #define MRIM_CS_ADD_CONTACT 0x1019 // C -> S // UL flags +(group(2) or usual(0) // UL group id (unused if contact is group) // LPS contact +// LPS name #define CONTACT_FLAG_REMOVED 0x00000001 #define CONTACT_FLAG_GROUP +0x00000002 #define CONTACT_FLAG_INVISIBLE 0x00000004 #define +CONTACT_FLAG_VISIBLE 0x00000008 #define CONTACT_FLAG_IGNORE 0x00000010 #define +CONTACT_FLAG_SHADOW 0x00000020 #define MRIM_CS_ADD_CONTACT_ACK 0x101A // S -> +C // UL status // UL contact_id or (u_long)-1 if status is not OK #define +CONTACT_OPER_SUCCESS 0x0000 #define CONTACT_OPER_ERROR 0x0001 #define +CONTACT_OPER_INTERR 0x0002 #define CONTACT_OPER_NO_SUCH_USER 0x0003 #define +CONTACT_OPER_INVALID_INFO 0x0004 #define CONTACT_OPER_USER_EXISTS 0x0005 #define +CONTACT_OPER_GROUP_LIMIT 0x6 #define MRIM_CS_MODIFY_CONTACT 0x101B // C -> S +// UL id // UL flags - same as for MRIM_CS_ADD_CONTACT // UL group id (unused if +contact is group) // LPS contact // LPS name #define MRIM_CS_MODIFY_CONTACT_ACK +0x101C // S -> C // UL status, same as for MRIM_CS_ADD_CONTACT_ACK #define +MRIM_CS_OFFLINE_MESSAGE_ACK 0x101D // S -> C // UIDL // LPS offline message +#define MRIM_CS_DELETE_OFFLINE_MESSAGE 0x101E // C -> S // UIDL #define +MRIM_CS_AUTHORIZE 0x1020 // C -> S // LPS user #define MRIM_CS_AUTHORIZE_ACK +0x1021 // S -> C // LPS user #define MRIM_CS_CHANGE_STATUS 0x1022 // C -> +S // UL new status #define MRIM_CS_GET_MPOP_SESSION 0x1024 // C -> S #define +MRIM_CS_MPOP_SESSION 0x1025 // S -> C #define MRIM_GET_SESSION_FAIL 0 #define +MRIM_GET_SESSION_SUCCESS 1 //UL status // LPS mpop session //white pages! +#define MRIM_CS_WP_REQUEST 0x1029 //C->S //DWORD field, LPS value #define +PARAMS_NUMBER_LIMIT 50 #define PARAM_VALUE_LENGTH_LIMIT 64 //if last symbol in +value eq '*' it will be replaced by LIKE '%' // params define // must be in +consecutive order (0..N) to quick check in check_anketa_info_request enum { +MRIM_CS_WP_REQUEST_PARAM_USER = 0, MRIM_CS_WP_REQUEST_PARAM_DOMAIN, +MRIM_CS_WP_REQUEST_PARAM_NICKNAME, MRIM_CS_WP_REQUEST_PARAM_FIRSTNAME, +MRIM_CS_WP_REQUEST_PARAM_LASTNAME, MRIM_CS_WP_REQUEST_PARAM_SEX , +MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY, MRIM_CS_WP_REQUEST_PARAM_DATE1 , +MRIM_CS_WP_REQUEST_PARAM_DATE2 , //!!!!!!!!!!!!!!!!!!!online request param must +be at end of request!!!!!!!!!!!!!!! MRIM_CS_WP_REQUEST_PARAM_ONLINE , +MRIM_CS_WP_REQUEST_PARAM_STATUS , // we do not used it, yet +MRIM_CS_WP_REQUEST_PARAM_CITY_ID, MRIM_CS_WP_REQUEST_PARAM_ZODIAC, +MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_MONTH, MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_DAY, +MRIM_CS_WP_REQUEST_PARAM_COUNTRY_ID, MRIM_CS_WP_REQUEST_PARAM_MAX }; #define +MRIM_CS_ANKETA_INFO 0x1028 //S->C //DWORD status #define +MRIM_ANKETA_INFO_STATUS_OK 1 #define MRIM_ANKETA_INFO_STATUS_NOUSER 0 #define +MRIM_ANKETA_INFO_STATUS_DBERR 2 #define MRIM_ANKETA_INFO_STATUS_RATELIMERR 3 +//DWORD fields_num //DWORD max_rows //DWORD server_time sec since 1970 +(unixtime) // fields set //%fields_num == 0 //values set //%fields_num == 0 +//LPS value (numbers too) #define MRIM_CS_MAILBOX_STATUS 0x1033 //DWORD new +messages in mailbox #define MRIM_CS_CONTACT_LIST2 0x1037 //S->C // UL status +#define GET_CONTACTS_OK 0x0000 #define GET_CONTACTS_ERROR 0x0001 #define +GET_CONTACTS_INTERR 0x0002 //DWORD status - if ...OK than this staff: //DWORD +groups number //mask symbols table: //'s' - lps //'u' - unsigned long //'z' - +zero terminated string //LPS groups fields mask //LPS contacts fields mask +//group fields //contacts fields //groups mask 'us' == flags, name //contact +mask 'uussuu' flags, flags, internal flags, status #define +CONTACT_INTFLAG_NOT_AUTHORIZED 0x0001 //old packet cs_login with cs_statistic +#define MRIM_CS_LOGIN2 0x1038 // C -> S #define MAX_CLIENT_DESCRIPTION 256 // +LPS login // LPS password // DWORD status //+ statistic packet data: // LPS +client description //max 256 typedef struct mrim_connection_params_t { unsigned +long ping_period; } mrim_connection_params_t; #endif // MRIM_PROTO_H + diff --git a/MRA/Docs/region.txt b/MRA/Docs/region.txt new file mode 100644 index 0000000..9beac55 --- /dev/null +++ b/MRA/Docs/region.txt @@ -0,0 +1,3353 @@ +id city_id country_id name +24 0 24 Россия +25 25 24 Россия,Москва +1734 25 24 Россия,Москва,г. Зеленоград +3256 25 24 Россия,Москва,Восточный АО +1503 25 24 Россия,Москва,Восточный АО,ст. Авиамоторная +1507 25 24 Россия,Москва,Восточный АО,ст. Выхино +1435 25 24 Россия,Москва,Восточный АО,ст. Измайловская +1434 25 24 Россия,Москва,Восточный АО,ст. Измайловский парк +1506 25 24 Россия,Москва,Восточный АО,ст. Новогиреево +1436 25 24 Россия,Москва,Восточный АО,ст. Первомайская +1505 25 24 Россия,Москва,Восточный АО,ст. Перово +1324 25 24 Россия,Москва,Восточный АО,ст. Преображенская площадь +1433 25 24 Россия,Москва,Восточный АО,ст. Семеновская +1325 25 24 Россия,Москва,Восточный АО,ст. Сокольники +534 25 24 Россия,Москва,Восточный АО,ст. Улица Подбельского +1323 25 24 Россия,Москва,Восточный АО,ст. Черкизовская +1504 25 24 Россия,Москва,Восточный АО,ст. Шоссе Энтузиастов +1437 25 24 Россия,Москва,Восточный АО,ст. Щелковская +1432 25 24 Россия,Москва,Восточный АО,ст. Электрозаводская +3260 25 24 Россия,Москва,Западный АО +1422 25 24 Россия,Москва,Западный АО,ст. Багратионовская +1616 25 24 Россия,Москва,Западный АО,ст. Киевская +1418 25 24 Россия,Москва,Западный АО,ст. Крылатское +1420 25 24 Россия,Москва,Западный АО,ст. Кунцевская +1425 25 24 Россия,Москва,Западный АО,ст. Кутузовская +1419 25 24 Россия,Москва,Западный АО,ст. Молодежная +3187 25 24 Россия,Москва,Западный АО,ст. Парк Победы +1421 25 24 Россия,Москва,Западный АО,ст. Пионерская +1336 25 24 Россия,Москва,Западный АО,ст. Проспект Вернадского +1426 25 24 Россия,Москва,Западный АО,ст. Студенческая +1423 25 24 Россия,Москва,Западный АО,ст. Филевский парк +1424 25 24 Россия,Москва,Западный АО,ст. Фили +1337 25 24 Россия,Москва,Западный АО,ст. Юго-Западная +3254 25 24 Россия,Москва,Северный АО +1517 25 24 Россия,Москва,Северный АО,ст. Беговая +1614 25 24 Россия,Москва,Северный АО,ст. Белорусская +1609 25 24 Россия,Москва,Северный АО,ст. Аэропорт +1612 25 24 Россия,Москва,Северный АО,ст. Водный стадион +1611 25 24 Россия,Москва,Северный АО,ст. Войковская +1608 25 24 Россия,Москва,Северный АО,ст. Динамо +1282 25 24 Россия,Москва,Северный АО,ст. Дмитровская +1280 25 24 Россия,Москва,Северный АО,ст. Петровско-Разумовская +1518 25 24 Россия,Москва,Северный АО,ст. Полежаевская +1613 25 24 Россия,Москва,Северный АО,ст. Речной вокзал +1283 25 24 Россия,Москва,Северный АО,ст. Савеловская +1610 25 24 Россия,Москва,Северный АО,ст. Сокол +1281 25 24 Россия,Москва,Северный АО,ст. Тимирязевская +3255 25 24 Россия,Москва,Северо-восточный АО +1316 25 24 Россия,Москва,Северо-восточный АО,ст. Рижская +1276 25 24 Россия,Москва,Северо-восточный АО,ст. Алтуфьево +1317 25 24 Россия,Москва,Северо-восточный АО,ст. Алексеевская +1321 25 24 Россия,Москва,Северо-восточный АО,ст. Бабушкинская +1277 25 24 Россия,Москва,Северо-восточный АО,ст. Бибирево +1319 25 24 Россия,Москва,Северо-восточный АО,ст. Ботанический сад +1318 25 24 Россия,Москва,Северо-восточный АО,ст. ВДНХ +1279 25 24 Россия,Москва,Северо-восточный АО,ст. Владыкино +1322 25 24 Россия,Москва,Северо-восточный АО,ст. Медведково +1278 25 24 Россия,Москва,Северо-восточный АО,ст. Отрадное +1320 25 24 Россия,Москва,Северо-восточный АО,ст. Свиблово +3261 25 24 Россия,Москва,Северо-западный АО +1519 25 24 Россия,Москва,Северо-западный АО,ст. Октябрьское поле +1523 25 24 Россия,Москва,Северо-западный АО,ст. Планерная +1522 25 24 Россия,Москва,Северо-западный АО,ст. Сходненская +1521 25 24 Россия,Москва,Северо-западный АО,ст. Тушинская +1520 25 24 Россия,Москва,Северо-западный АО,ст. Щукинская +3251 25 24 Россия,Москва,Центральный АО +1429 25 24 Россия,Москва,Центральный АО,ст. Александровский сад +1428 25 24 Россия,Москва,Центральный АО,ст. Арбатская +1515 25 24 Россия,Москва,Центральный АО,ст. Баррикадная +1431 25 24 Россия,Москва,Центральный АО,ст. Бауманская +1331 25 24 Россия,Москва,Центральный АО,ст. Библиотека им. Ленина +1287 25 24 Россия,Москва,Центральный АО,ст. Боровицкая +1618 25 24 Россия,Москва,Центральный АО,ст. Добрынинская +1313 25 24 Россия,Москва,Центральный АО,ст. Китай-город +1622 25 24 Россия,Москва,Центральный АО,ст. Комсомольская +1615 25 24 Россия,Москва,Центральный АО,ст. Краснопресненская +1326 25 24 Россия,Москва,Центральный АО,ст. Красносельская +1327 25 24 Россия,Москва,Центральный АО,ст. Красные ворота +1586 25 24 Россия,Москва,Центральный АО,ст. Крестьянская застава +3132 25 24 Россия,Москва,Центральный АО,ст. Кропоткинская +1513 25 24 Россия,Москва,Центральный АО,ст. Кузнецкий мост +1621 25 24 Россия,Москва,Центральный АО,ст. Курская +1329 25 24 Россия,Москва,Центральный АО,ст. Лубянка +1501 25 24 Россия,Москва,Центральный АО,ст. Марксистская +1607 25 24 Россия,Москва,Центральный АО,ст. Маяковская +1284 25 24 Россия,Москва,Центральный АО,ст. Менделеевская +1604 25 24 Россия,Москва,Центральный АО,ст. Новокузнецкая +1624 25 24 Россия,Москва,Центральный АО,ст. Новослободская +1311 25 24 Россия,Москва,Центральный АО,ст. Октябрьская +1330 25 24 Россия,Москва,Центральный АО,ст. Охотный ряд +1619 25 24 Россия,Москва,Центральный АО,ст. Павелецкая +1617 25 24 Россия,Москва,Центральный АО,ст. Парк Культуры +1502 25 24 Россия,Москва,Центральный АО,ст. Площадь Ильича +1430 25 24 Россия,Москва,Центральный АО,ст. Площадь Революции +1288 25 24 Россия,Москва,Центральный АО,ст. Полянка +1512 25 24 Россия,Москва,Центральный АО,ст. Пролетарская +1623 25 24 Россия,Москва,Центральный АО,ст. Проспект Мира +1514 25 24 Россия,Москва,Центральный АО,ст. Пушкинская +1584 25 24 Россия,Москва,Центральный АО,ст. Римская +1289 25 24 Россия,Москва,Центральный АО,ст. Серпуховская +1427 25 24 Россия,Москва,Центральный АО,ст. Смоленская +1333 25 24 Россия,Москва,Центральный АО,ст. Спортивная +1315 25 24 Россия,Москва,Центральный АО,ст. Сухаревская +1620 25 24 Россия,Москва,Центральный АО,ст. Таганская +1606 25 24 Россия,Москва,Центральный АО,ст. Тверская +1605 25 24 Россия,Москва,Центральный АО,ст. Театральная +1312 25 24 Россия,Москва,Центральный АО,ст. Третьяковская +3253 25 24 Россия,Москва,Центральный АО,ст. Тургеневская +1516 25 24 Россия,Москва,Центральный АО,ст. Улица 1905 года +1332 25 24 Россия,Москва,Центральный АО,ст. Фрунзенская +1285 25 24 Россия,Москва,Центральный АО,ст. Цветной бульвар +1286 25 24 Россия,Москва,Центральный АО,ст. Чеховская +1328 25 24 Россия,Москва,Центральный АО,ст. Чистые пруды +1585 25 24 Россия,Москва,Центральный АО,ст. Чкаловская +3257 25 24 Россия,Москва,Юго-восточный АО +1592 25 24 Россия,Москва,Юго-восточный АО,ст. Братиславская +1511 25 24 Россия,Москва,Юго-восточный АО,ст. Волгоградский проспект +1590 25 24 Россия,Москва,Юго-восточный АО,ст. Волжская +1587 25 24 Россия,Москва,Юго-восточный АО,ст. Дубровка +1588 25 24 Россия,Москва,Юго-восточный АО,ст. Кожуховская +1509 25 24 Россия,Москва,Юго-восточный АО,ст. Кузьминки +1591 25 24 Россия,Москва,Юго-восточный АО,ст. Люблино +1593 25 24 Россия,Москва,Юго-восточный АО,ст. Марьино +1589 25 24 Россия,Москва,Юго-восточный АО,ст. Печатники +1508 25 24 Россия,Москва,Юго-восточный АО,ст. Рязанский проспект +1510 25 24 Россия,Москва,Юго-восточный АО,ст. Текстильщики +3259 25 24 Россия,Москва,Юго-западный АО +1309 25 24 Россия,Москва,Юго-западный АО,ст. Ленинский проспект +1295 25 24 Россия,Москва,Юго-западный АО,ст. Чертановская +1308 25 24 Россия,Москва,Юго-западный АО,ст. Академическая +1304 25 24 Россия,Москва,Юго-западный АО,ст. Беляево +1300 25 24 Россия,Москва,Юго-западный АО,ст. Битцевский парк +3188 25 24 Россия,Москва,Юго-западный АО,ст. Бульвар Дмитрия Донского +1305 25 24 Россия,Москва,Юго-западный АО,ст. Калужская +1595 25 24 Россия,Москва,Юго-западный АО,ст. Каховская +1303 25 24 Россия,Москва,Юго-западный АО,ст. Коньково +1334 25 24 Россия,Москва,Юго-западный АО,ст. Ленинские горы +1293 25 24 Россия,Москва,Юго-западный АО,ст. Нахимовский проспект +1306 25 24 Россия,Москва,Юго-западный АО,ст. Новые Черемушки +1307 25 24 Россия,Москва,Юго-западный АО,ст. Профсоюзная +1294 25 24 Россия,Москва,Юго-западный АО,ст. Севастопольская +1302 25 24 Россия,Москва,Юго-западный АО,ст. Теплый Стан +1335 25 24 Россия,Москва,Юго-западный АО,ст. Университет +1301 25 24 Россия,Москва,Юго-западный АО,ст. Ясенево +3258 25 24 Россия,Москва,Южный АО +1603 25 24 Россия,Москва,Южный АО,ст. Автозаводская +1298 25 24 Россия,Москва,Южный АО,ст. Аннино +1594 25 24 Россия,Москва,Южный АО,ст. Варшавская +1597 25 24 Россия,Москва,Южный АО,ст. Домодедовская +1600 25 24 Россия,Москва,Южный АО,ст. Кантемировская +1601 25 24 Россия,Москва,Южный АО,ст. Каширская +1602 25 24 Россия,Москва,Южный АО,ст. Коломенская +1596 25 24 Россия,Москва,Южный АО,ст. Красногвардейская +1291 25 24 Россия,Москва,Южный АО,ст. Нагатинская +1292 25 24 Россия,Москва,Южный АО,ст. Нагорная +1598 25 24 Россия,Москва,Южный АО,ст. Орехово +1297 25 24 Россия,Москва,Южный АО,ст. Пражская +1290 25 24 Россия,Москва,Южный АО,ст. Тульская +1299 25 24 Россия,Москва,Южный АО,ст. Улица Академика Янгеля +1599 25 24 Россия,Москва,Южный АО,ст. Царицыно +1310 25 24 Россия,Москва,Южный АО,ст. Шаболовская +1296 25 24 Россия,Москва,Южный АО,ст. Южная +226 226 24 Россия,Санкт-Петербург +1970 226 24 Россия,Санкт-Петербург,Адмиралтейский р-н +1968 226 24 Россия,Санкт-Петербург,Василеостровский р-н +1964 226 24 Россия,Санкт-Петербург,Выборгский р-н +1377 226 24 Россия,Санкт-Петербург,Зеленогорск +1965 226 24 Россия,Санкт-Петербург,Калининский р-н +1971 226 24 Россия,Санкт-Петербург,Кировский р-н +1961 226 24 Россия,Санкт-Петербург,Колпино +1975 226 24 Россия,Санкт-Петербург,Колпинский р-н +1966 226 24 Россия,Санкт-Петербург,Красногвардейский р-н +1383 226 24 Россия,Санкт-Петербург,Красное Село +1978 226 24 Россия,Санкт-Петербург,Красносельский р-н +1981 226 24 Россия,Санкт-Петербург,Кронштадский р-н +1382 226 24 Россия,Санкт-Петербург,Кронштадт +1962 226 24 Россия,Санкт-Петербург,Курортный р-н +1385 226 24 Россия,Санкт-Петербург,Ломоносов +1980 226 24 Россия,Санкт-Петербург,Ломоносовский р-н +1972 226 24 Россия,Санкт-Петербург,Московский р-н +1974 226 24 Россия,Санкт-Петербург,Невский р-н +1387 226 24 Россия,Санкт-Петербург,Павловск +1977 226 24 Россия,Санкт-Петербург,Павловский р-н +1982 226 24 Россия,Санкт-Петербург,Петергоф +1967 226 24 Россия,Санкт-Петербург,Петроградский р-н +1960 226 24 Россия,Санкт-Петербург,Петродворец +1979 226 24 Россия,Санкт-Петербург,Петродворцовый р-н +1963 226 24 Россия,Санкт-Петербург,Приморский р-н +1388 226 24 Россия,Санкт-Петербург,Пушкин +1976 226 24 Россия,Санкт-Петербург,Пушкинский р-н +1390 226 24 Россия,Санкт-Петербург,Сестрорецк +1973 226 24 Россия,Санкт-Петербург,Фрунзенский р-н +1969 226 24 Россия,Санкт-Петербург,Центральный р-н +3186 0 24 Россия,Дальневосточный ФО +233 233 24 Россия,Дальневосточный ФО,Саха (Якутия) +474 233 24 Россия,Дальневосточный ФО,Саха (Якутия),Алдан +2809 233 24 Россия,Дальневосточный ФО,Саха (Якутия),Верхоянск +2804 233 24 Россия,Дальневосточный ФО,Саха (Якутия),Вилюйск +475 233 24 Россия,Дальневосточный ФО,Саха (Якутия),Ленск +477 233 24 Россия,Дальневосточный ФО,Саха (Якутия),Мирный +476 233 24 Россия,Дальневосточный ФО,Саха (Якутия),Нерюнгри +2806 233 24 Россия,Дальневосточный ФО,Саха (Якутия),Олекминск +3115 233 24 Россия,Дальневосточный ФО,Саха (Якутия),Покровск +2808 233 24 Россия,Дальневосточный ФО,Саха (Якутия),Среднеколымск +2807 233 24 Россия,Дальневосточный ФО,Саха (Якутия),Томмот +2805 233 24 Россия,Дальневосточный ФО,Саха (Якутия),Удачный +478 233 24 Россия,Дальневосточный ФО,Саха (Якутия),Усть-Нера +479 233 24 Россия,Дальневосточный ФО,Саха (Якутия),Якутск +2263 233 24 Россия,Дальневосточный ФО,Саха (Якутия),Другое +232 232 24 Россия,Дальневосточный ФО,Приморский край +2819 232 24 Россия,Дальневосточный ФО,Приморский край,Арсеньев +464 232 24 Россия,Дальневосточный ФО,Приморский край,Артем +465 232 24 Россия,Дальневосточный ФО,Приморский край,Большой Камень +466 232 24 Россия,Дальневосточный ФО,Приморский край,Владивосток +2817 232 24 Россия,Дальневосточный ФО,Приморский край,Дальнегорск +2818 232 24 Россия,Дальневосточный ФО,Приморский край,Дальнереченск +3359 232 24 Россия,Дальневосточный ФО,Приморский край,Кавалерово +467 232 24 Россия,Дальневосточный ФО,Приморский край,Камень-Рыболов +468 232 24 Россия,Дальневосточный ФО,Приморский край,Лесозаводск +469 232 24 Россия,Дальневосточный ФО,Приморский край,Лучегорск +470 232 24 Россия,Дальневосточный ФО,Приморский край,Находка +471 232 24 Россия,Дальневосточный ФО,Приморский край,Партизанск +472 232 24 Россия,Дальневосточный ФО,Приморский край,Пластун +2816 232 24 Россия,Дальневосточный ФО,Приморский край,Спасск-Дальний +473 232 24 Россия,Дальневосточный ФО,Приморский край,Уссурийск +2258 232 24 Россия,Дальневосточный ФО,Приморский край,Другое +235 235 24 Россия,Дальневосточный ФО,Хабаровский край +487 235 24 Россия,Дальневосточный ФО,Хабаровский край,Амурск +2821 235 24 Россия,Дальневосточный ФО,Хабаровский край,Бикин +488 235 24 Россия,Дальневосточный ФО,Хабаровский край,Ванино +2820 235 24 Россия,Дальневосточный ФО,Хабаровский край,Вяземский +489 235 24 Россия,Дальневосточный ФО,Хабаровский край,Комсомольск-на-Амуре +490 235 24 Россия,Дальневосточный ФО,Хабаровский край,Николаевск-на-Амуре +491 235 24 Россия,Дальневосточный ФО,Хабаровский край,Советская Гавань +3353 235 24 Россия,Дальневосточный ФО,Хабаровский край,Солнечный +492 235 24 Россия,Дальневосточный ФО,Хабаровский край,Хабаровск +2280 235 24 Россия,Дальневосточный ФО,Хабаровский край,Другое +227 227 24 Россия,Дальневосточный ФО,Амурская обл. +455 227 24 Россия,Дальневосточный ФО,Амурская обл.,Белогорск +456 227 24 Россия,Дальневосточный ФО,Амурская обл.,Благовещенск +2814 227 24 Россия,Дальневосточный ФО,Амурская обл.,Завитинск +2813 227 24 Россия,Дальневосточный ФО,Амурская обл.,Зея +2815 227 24 Россия,Дальневосточный ФО,Амурская обл.,Райчихинск +2812 227 24 Россия,Дальневосточный ФО,Амурская обл.,Свободный +2811 227 24 Россия,Дальневосточный ФО,Амурская обл.,Сковородино +457 227 24 Россия,Дальневосточный ФО,Амурская обл.,Тында +2217 227 24 Россия,Дальневосточный ФО,Амурская обл.,Шимановск +2218 227 24 Россия,Дальневосточный ФО,Амурская обл.,Другое +229 229 24 Россия,Дальневосточный ФО,Камчатская обл. +460 229 24 Россия,Дальневосточный ФО,Камчатская обл.,Елизово +2822 229 24 Россия,Дальневосточный ФО,Камчатская обл.,Ключи +459 229 24 Россия,Дальневосточный ФО,Камчатская обл.,Петропавловск-Камч. +2234 229 24 Россия,Дальневосточный ФО,Камчатская обл.,Другое +231 231 24 Россия,Дальневосточный ФО,Магаданская обл. +462 231 24 Россия,Дальневосточный ФО,Магаданская обл.,Магадан +2823 231 24 Россия,Дальневосточный ФО,Магаданская обл.,Сусуман +463 231 24 Россия,Дальневосточный ФО,Магаданская обл.,Ягодное +2246 231 24 Россия,Дальневосточный ФО,Магаданская обл.,Другое +234 234 24 Россия,Дальневосточный ФО,Сахалинская обл. +480 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Александровск-Сахалинский +2829 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Анива +2833 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Горнозаводск +2825 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Долинск +481 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Корсаков +482 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Красногорск +2826 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Курильск +2832 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Лесогорск +2836 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Макаров +2830 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Невельск +483 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Оха +2828 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Поронайск +2824 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Северо-Курильск +2827 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Томари +2831 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Углегорск +484 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Холмск +2834 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Чехов +2835 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Шахтерск +485 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Южно-Курильск +486 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Южно-Сахалинск +2264 234 24 Россия,Дальневосточный ФО,Сахалинская обл.,Другое +228 228 24 Россия,Дальневосточный ФО,Еврейская АО +458 228 24 Россия,Дальневосточный ФО,Еврейская АО,Биробиджан +2810 228 24 Россия,Дальневосточный ФО,Еврейская АО,Облучье +2226 228 24 Россия,Дальневосточный ФО,Еврейская АО,Другое +230 230 24 Россия,Дальневосточный ФО,Корякский АО +461 230 24 Россия,Дальневосточный ФО,Корякский АО,Полана +2239 230 24 Россия,Дальневосточный ФО,Корякский АО,Другое +236 236 24 Россия,Дальневосточный ФО,Чукотский АО +493 236 24 Россия,Дальневосточный ФО,Чукотский АО,Анадырь +2287 236 24 Россия,Дальневосточный ФО,Чукотский АО,Другое +3183 236 24 Россия,Приволжский ФО +237 237 24 Россия,Приволжский ФО,Башкортостан +2850 237 24 Россия,Приволжский ФО,Башкортостан,Агидель +2851 237 24 Россия,Приволжский ФО,Башкортостан,Агидель +2657 237 24 Россия,Приволжский ФО,Башкортостан,Баймак +2662 237 24 Россия,Приволжский ФО,Башкортостан,Белебей +494 237 24 Россия,Приволжский ФО,Башкортостан,Белорецк +2658 237 24 Россия,Приволжский ФО,Башкортостан,Бирск +2660 237 24 Россия,Приволжский ФО,Башкортостан,Благовещенск +2659 237 24 Россия,Приволжский ФО,Башкортостан,Давлеканово +2663 237 24 Россия,Приволжский ФО,Башкортостан,Дюртюли +495 237 24 Россия,Приволжский ФО,Башкортостан,Ишимбай +496 237 24 Россия,Приволжский ФО,Башкортостан,Кумертау +2655 237 24 Россия,Приволжский ФО,Башкортостан,Мелеуз +497 237 24 Россия,Приволжский ФО,Башкортостан,Нефтекамск +2654 237 24 Россия,Приволжский ФО,Башкортостан,Октябрьский +499 237 24 Россия,Приволжский ФО,Башкортостан,Салават +2656 237 24 Россия,Приволжский ФО,Башкортостан,Сибай +498 237 24 Россия,Приволжский ФО,Башкортостан,Стерлитамак +500 237 24 Россия,Приволжский ФО,Башкортостан,Туймазы +2661 237 24 Россия,Приволжский ФО,Башкортостан,Туймазы +501 237 24 Россия,Приволжский ФО,Башкортостан,Уфа +502 237 24 Россия,Приволжский ФО,Башкортостан,Учалы +2664 237 24 Россия,Приволжский ФО,Башкортостан,Янаул +2220 237 24 Россия,Приволжский ФО,Башкортостан,Другое +240 240 24 Россия,Приволжский ФО,Марий-Эл +509 240 24 Россия,Приволжский ФО,Марий-Эл,Волжск +510 240 24 Россия,Приволжский ФО,Марий-Эл,Звенигово +511 240 24 Россия,Приволжский ФО,Марий-Эл,Йошкар-Ола +512 240 24 Россия,Приволжский ФО,Марий-Эл,Козьмодемьянск +2247 240 24 Россия,Приволжский ФО,Марий-Эл,Другое +241 241 24 Россия,Приволжский ФО,Мордовия +513 241 24 Россия,Приволжский ФО,Мордовия,Зубова Поляна +2147 241 24 Россия,Приволжский ФО,Мордовия,Инсар +2150 241 24 Россия,Приволжский ФО,Мордовия,Ковылкино +2148 241 24 Россия,Приволжский ФО,Мордовия,Краснослободск +2910 241 24 Россия,Приволжский ФО,Мордовия,Лямбирь +515 241 24 Россия,Приволжский ФО,Мордовия,Рузаевка +514 241 24 Россия,Приволжский ФО,Мордовия,Саранск +2149 241 24 Россия,Приволжский ФО,Мордовия,Темников +2923 241 24 Россия,Приволжский ФО,Мордовия,Чамзинка +2248 241 24 Россия,Приволжский ФО,Мордовия,Другое +248 248 24 Россия,Приволжский ФО,Татарстан +2569 248 24 Россия,Приволжский ФО,Татарстан,Агрыз +2575 248 24 Россия,Приволжский ФО,Татарстан,Азнакаево +569 248 24 Россия,Приволжский ФО,Татарстан,Альметьевск +570 248 24 Россия,Приволжский ФО,Татарстан,Апастово +2571 248 24 Россия,Приволжский ФО,Татарстан,Болгар +571 248 24 Россия,Приволжский ФО,Татарстан,Бугульма +2570 248 24 Россия,Приволжский ФО,Татарстан,Буинск +572 248 24 Россия,Приволжский ФО,Татарстан,Джалиль +573 248 24 Россия,Приволжский ФО,Татарстан,Елабуга +2576 248 24 Россия,Приволжский ФО,Татарстан,Заинск +574 248 24 Россия,Приволжский ФО,Татарстан,Зеленодольск +575 248 24 Россия,Приволжский ФО,Татарстан,Казань +2577 248 24 Россия,Приволжский ФО,Татарстан,Лениногорск +2572 248 24 Россия,Приволжский ФО,Татарстан,Мамадыш +576 248 24 Россия,Приволжский ФО,Татарстан,Менделеевск +2573 248 24 Россия,Приволжский ФО,Татарстан,Мензелинск +577 248 24 Россия,Приволжский ФО,Татарстан,Набережные Челны +578 248 24 Россия,Приволжский ФО,Татарстан,Нижнекамск +579 248 24 Россия,Приволжский ФО,Татарстан,Нурлат +2574 248 24 Россия,Приволжский ФО,Татарстан,Тетюши +580 248 24 Россия,Приволжский ФО,Татарстан,Чистополь +2271 248 24 Россия,Приволжский ФО,Татарстан,Другое +249 249 24 Россия,Приволжский ФО,Удмуртия +3311 249 24 Россия,Приволжский ФО,Удмуртия,Вавож +581 249 24 Россия,Приволжский ФО,Удмуртия,Воткинск +582 249 24 Россия,Приволжский ФО,Удмуртия,Глазов +583 249 24 Россия,Приволжский ФО,Удмуртия,Игра +584 249 24 Россия,Приволжский ФО,Удмуртия,Ижевск +2665 249 24 Россия,Приволжский ФО,Удмуртия,Камбарка +585 249 24 Россия,Приволжский ФО,Удмуртия,Можга +586 249 24 Россия,Приволжский ФО,Удмуртия,Сарапул +587 249 24 Россия,Приволжский ФО,Удмуртия,Ува +2277 249 24 Россия,Приволжский ФО,Удмуртия,Другое +251 251 24 Россия,Приволжский ФО,Чувашия +2158 251 24 Россия,Приволжский ФО,Чувашия,Алатырь +2156 251 24 Россия,Приволжский ФО,Чувашия,Канаш +2151 251 24 Россия,Приволжский ФО,Чувашия,Козловка +2152 251 24 Россия,Приволжский ФО,Чувашия,Марьинский Посад +2155 251 24 Россия,Приволжский ФО,Чувашия,Новочебоксарск +2153 251 24 Россия,Приволжский ФО,Чувашия,Цивильск +592 251 24 Россия,Приволжский ФО,Чувашия,Чебоксары +2157 251 24 Россия,Приволжский ФО,Чувашия,Шумерля +2154 251 24 Россия,Приволжский ФО,Чувашия,Ядрин +2286 251 24 Россия,Приволжский ФО,Чувашия,Другое +238 238 24 Россия,Приволжский ФО,Кировская обл. +2168 238 24 Россия,Приволжский ФО,Кировская обл.,Белая Холуница +503 238 24 Россия,Приволжский ФО,Кировская обл.,Вятские Поляны +2164 238 24 Россия,Приволжский ФО,Кировская обл.,Зуевка +504 238 24 Россия,Приволжский ФО,Кировская обл.,Киров +505 238 24 Россия,Приволжский ФО,Кировская обл.,Кирово-Чепецк +2160 238 24 Россия,Приволжский ФО,Кировская обл.,Кирс +506 238 24 Россия,Приволжский ФО,Кировская обл.,Котельнич +2167 238 24 Россия,Приволжский ФО,Кировская обл.,Луза +2159 238 24 Россия,Приволжский ФО,Кировская обл.,Малмыж +2169 238 24 Россия,Приволжский ФО,Кировская обл.,Мураши +2163 238 24 Россия,Приволжский ФО,Кировская обл.,Нолинск +2170 238 24 Россия,Приволжский ФО,Кировская обл.,Омутнинск +2166 238 24 Россия,Приволжский ФО,Кировская обл.,Слободской +2165 238 24 Россия,Приволжский ФО,Кировская обл.,Советск +2162 238 24 Россия,Приволжский ФО,Кировская обл.,Сосновка +2171 238 24 Россия,Приволжский ФО,Кировская обл.,Уржум +2161 238 24 Россия,Приволжский ФО,Кировская обл.,Халтурин +507 238 24 Россия,Приволжский ФО,Кировская обл.,Яранск +2237 238 24 Россия,Приволжский ФО,Кировская обл.,Другое +242 242 24 Россия,Приволжский ФО,Нижегородская обл. +516 242 24 Россия,Приволжский ФО,Нижегородская обл.,Арзамас +517 242 24 Россия,Приволжский ФО,Нижегородская обл.,Балахна +2139 242 24 Россия,Приволжский ФО,Нижегородская обл.,Богородск +518 242 24 Россия,Приволжский ФО,Нижегородская обл.,Бор +519 242 24 Россия,Приволжский ФО,Нижегородская обл.,Вахтан +520 242 24 Россия,Приволжский ФО,Нижегородская обл.,Ветлуга +2140 242 24 Россия,Приволжский ФО,Нижегородская обл.,Володарск +2138 242 24 Россия,Приволжский ФО,Нижегородская обл.,Ворсма +521 242 24 Россия,Приволжский ФО,Нижегородская обл.,Выкса +2137 242 24 Россия,Приволжский ФО,Нижегородская обл.,Горбатов +522 242 24 Россия,Приволжский ФО,Нижегородская обл.,Городец +523 242 24 Россия,Приволжский ФО,Нижегородская обл.,Дзержинск +524 242 24 Россия,Приволжский ФО,Нижегородская обл.,Заволжье +2891 242 24 Россия,Приволжский ФО,Нижегородская обл.,Ильиногорск +525 242 24 Россия,Приволжский ФО,Нижегородская обл.,Кстово +2145 242 24 Россия,Приволжский ФО,Нижегородская обл.,Кулебаки +2143 242 24 Россия,Приволжский ФО,Нижегородская обл.,Лукоянов +2144 242 24 Россия,Приволжский ФО,Нижегородская обл.,Лысково +2146 242 24 Россия,Приволжский ФО,Нижегородская обл.,Навашино +526 242 24 Россия,Приволжский ФО,Нижегородская обл.,Нижний Новгород +527 242 24 Россия,Приволжский ФО,Нижегородская обл.,Павлово +2135 242 24 Россия,Приволжский ФО,Нижегородская обл.,Первомайск +528 242 24 Россия,Приволжский ФО,Нижегородская обл.,Саров +529 242 24 Россия,Приволжский ФО,Нижегородская обл.,Семенов +530 242 24 Россия,Приволжский ФО,Нижегородская обл.,Сергач +2141 242 24 Россия,Приволжский ФО,Нижегородская обл.,Урень +2136 242 24 Россия,Приволжский ФО,Нижегородская обл.,Чкаловск +2897 242 24 Россия,Приволжский ФО,Нижегородская обл.,Шатки +2142 242 24 Россия,Приволжский ФО,Нижегородская обл.,Шахунья +2251 242 24 Россия,Приволжский ФО,Нижегородская обл.,Другое +243 243 24 Россия,Приволжский ФО,Оренбургская обл. +2678 243 24 Россия,Приволжский ФО,Оренбургская обл.,Абдулино +2673 243 24 Россия,Приволжский ФО,Оренбургская обл.,Бугуруслан +531 243 24 Россия,Приволжский ФО,Оренбургская обл.,Бузулук +532 243 24 Россия,Приволжский ФО,Оренбургская обл.,Гай +2674 243 24 Россия,Приволжский ФО,Оренбургская обл.,Кувандык +2675 243 24 Россия,Приволжский ФО,Оренбургская обл.,Медногорск +533 243 24 Россия,Приволжский ФО,Оренбургская обл.,Новотроицк +535 243 24 Россия,Приволжский ФО,Оренбургская обл.,Оренбург +536 243 24 Россия,Приволжский ФО,Оренбургская обл.,Орск +3360 243 24 Россия,Приволжский ФО,Оренбургская обл.,Саракташ +2677 243 24 Россия,Приволжский ФО,Оренбургская обл.,Соль-Илецк +2676 243 24 Россия,Приволжский ФО,Оренбургская обл.,Сорочинск +537 243 24 Россия,Приволжский ФО,Оренбургская обл.,Тоцкое +538 243 24 Россия,Приволжский ФО,Оренбургская обл.,Ясный +2254 243 24 Россия,Приволжский ФО,Оренбургская обл.,Другое +244 244 24 Россия,Приволжский ФО,Пензенская обл. +539 244 24 Россия,Приволжский ФО,Пензенская обл.,Беднодемьяновск +2597 244 24 Россия,Приволжский ФО,Пензенская обл.,Белинский +2595 244 24 Россия,Приволжский ФО,Пензенская обл.,Городище +2593 244 24 Россия,Приволжский ФО,Пензенская обл.,Каменка +540 244 24 Россия,Приволжский ФО,Пензенская обл.,Кузнецк +2598 244 24 Россия,Приволжский ФО,Пензенская обл.,Нижний Ломов +2592 244 24 Россия,Приволжский ФО,Пензенская обл.,Никольск +541 244 24 Россия,Приволжский ФО,Пензенская обл.,Пенза +3304 244 24 Россия,Приволжский ФО,Пензенская обл.,Русский Камешкир +2596 244 24 Россия,Приволжский ФО,Пензенская обл.,Сердобск +2594 244 24 Россия,Приволжский ФО,Пензенская обл.,Сурск +2256 244 24 Россия,Приволжский ФО,Пензенская обл.,Другое +245 245 24 Россия,Приволжский ФО,Пермская обл. +2690 245 24 Россия,Приволжский ФО,Пермская обл.,Александровск +542 245 24 Россия,Приволжский ФО,Пермская обл.,Березники +2679 245 24 Россия,Приволжский ФО,Пермская обл.,Верещагино +2680 245 24 Россия,Приволжский ФО,Пермская обл.,Горнозаводск +2687 245 24 Россия,Приволжский ФО,Пермская обл.,Гремячинск +2686 245 24 Россия,Приволжский ФО,Пермская обл.,Губаха +543 245 24 Россия,Приволжский ФО,Пермская обл.,Добрянка +544 245 24 Россия,Приволжский ФО,Пермская обл.,Кизел +2681 245 24 Россия,Приволжский ФО,Пермская обл.,Красновишерск +545 245 24 Россия,Приволжский ФО,Пермская обл.,Краснокамск +546 245 24 Россия,Приволжский ФО,Пермская обл.,Кунгур +547 245 24 Россия,Приволжский ФО,Пермская обл.,Лысьва +548 245 24 Россия,Приволжский ФО,Пермская обл.,Нытва +2683 245 24 Россия,Приволжский ФО,Пермская обл.,Оса +2684 245 24 Россия,Приволжский ФО,Пермская обл.,Оханск +2682 245 24 Россия,Приволжский ФО,Пермская обл.,Очер +549 245 24 Россия,Приволжский ФО,Пермская обл.,Пермь +550 245 24 Россия,Приволжский ФО,Пермская обл.,Соликамск +2685 245 24 Россия,Приволжский ФО,Пермская обл.,Усолье +551 245 24 Россия,Приволжский ФО,Пермская обл.,Чайковский +2689 245 24 Россия,Приволжский ФО,Пермская обл.,Чердынь +2688 245 24 Россия,Приволжский ФО,Пермская обл.,Чермоз +552 245 24 Россия,Приволжский ФО,Пермская обл.,Чернушка +553 245 24 Россия,Приволжский ФО,Пермская обл.,Чусовой +2257 245 24 Россия,Приволжский ФО,Пермская обл.,Другое +246 246 24 Россия,Приволжский ФО,Самарская обл. +554 246 24 Россия,Приволжский ФО,Самарская обл.,Волжский +555 246 24 Россия,Приволжский ФО,Самарская обл.,Жигулевск +2599 246 24 Россия,Приволжский ФО,Самарская обл.,Кинель +3293 246 24 Россия,Приволжский ФО,Самарская обл.,Красный Яр +2602 246 24 Россия,Приволжский ФО,Самарская обл.,Нефтегорск +556 246 24 Россия,Приволжский ФО,Самарская обл.,Новокуйбышевск +2600 246 24 Россия,Приволжский ФО,Самарская обл.,Октябрьск +557 246 24 Россия,Приволжский ФО,Самарская обл.,Отрадный +558 246 24 Россия,Приволжский ФО,Самарская обл.,Похвистнево +559 246 24 Россия,Приволжский ФО,Самарская обл.,Самара +560 246 24 Россия,Приволжский ФО,Самарская обл.,Сызрань +561 246 24 Россия,Приволжский ФО,Самарская обл.,Тольятти +2601 246 24 Россия,Приволжский ФО,Самарская обл.,Чапаевск +562 246 24 Россия,Приволжский ФО,Самарская обл.,Шигоны +2261 246 24 Россия,Приволжский ФО,Самарская обл.,Другое +247 247 24 Россия,Приволжский ФО,Саратовская обл. +2613 247 24 Россия,Приволжский ФО,Саратовская обл.,Аркадак +2606 247 24 Россия,Приволжский ФО,Саратовская обл.,Аткарск +563 247 24 Россия,Приволжский ФО,Саратовская обл.,Балаково +564 247 24 Россия,Приволжский ФО,Саратовская обл.,Балашов +565 247 24 Россия,Приволжский ФО,Саратовская обл.,Вольск +2608 247 24 Россия,Приволжский ФО,Саратовская обл.,Ершов +2607 247 24 Россия,Приволжский ФО,Саратовская обл.,Калининск +2609 247 24 Россия,Приволжский ФО,Саратовская обл.,Красноармейск +2610 247 24 Россия,Приволжский ФО,Саратовская обл.,Красный Кут +2605 247 24 Россия,Приволжский ФО,Саратовская обл.,Маркс +566 247 24 Россия,Приволжский ФО,Саратовская обл.,Новоузенск +2603 247 24 Россия,Приволжский ФО,Саратовская обл.,Петровск +2604 247 24 Россия,Приволжский ФО,Саратовская обл.,Пугачев +2612 247 24 Россия,Приволжский ФО,Саратовская обл.,Ртищево +567 247 24 Россия,Приволжский ФО,Саратовская обл.,Саратов +2611 247 24 Россия,Приволжский ФО,Саратовская обл.,Хвалынск +568 247 24 Россия,Приволжский ФО,Саратовская обл.,Энгельс +3267 247 24 Россия,Приволжский ФО,Саратовская обл.,Энгельс-12 +2262 247 24 Россия,Приволжский ФО,Саратовская обл.,Другое +250 250 24 Россия,Приволжский ФО,Ульяновская обл. +2614 250 24 Россия,Приволжский ФО,Ульяновская обл.,Барыш +588 250 24 Россия,Приволжский ФО,Ульяновская обл.,Димитровград +2615 250 24 Россия,Приволжский ФО,Ульяновская обл.,Инза +589 250 24 Россия,Приволжский ФО,Ульяновская обл.,Новоспасское +2616 250 24 Россия,Приволжский ФО,Ульяновская обл.,Новоульяновск +590 250 24 Россия,Приволжский ФО,Ульяновская обл.,Сенгилей +591 250 24 Россия,Приволжский ФО,Ульяновская обл.,Ульяновск +2278 250 24 Россия,Приволжский ФО,Ульяновская обл.,Другое +239 239 24 Россия,Приволжский ФО,Коми-Пермяцкий АО +508 239 24 Россия,Приволжский ФО,Коми-Пермяцкий АО,Кудымкар +2238 239 24 Россия,Приволжский ФО,Коми-Пермяцкий АО,Другое +3181 239 24 Россия,Северо-Западный ФО +255 255 24 Россия,Северо-Западный ФО,Карелия +1355 255 24 Россия,Северо-Западный ФО,Карелия,Беломорск +1356 255 24 Россия,Северо-Западный ФО,Карелия,Кемь +1357 255 24 Россия,Северо-Западный ФО,Карелия,Кондопога +1358 255 24 Россия,Северо-Западный ФО,Карелия,Костомукша +1359 255 24 Россия,Северо-Западный ФО,Карелия,Коткозеро +1360 255 24 Россия,Северо-Западный ФО,Карелия,Лахденпохья +1362 255 24 Россия,Северо-Западный ФО,Карелия,Лоухи +1361 255 24 Россия,Северо-Западный ФО,Карелия,Медвежьегорск +3286 255 24 Россия,Северо-Западный ФО,Карелия,Муезерский +1937 255 24 Россия,Северо-Западный ФО,Карелия,Олонец +1363 255 24 Россия,Северо-Западный ФО,Карелия,Петрозаводск +1938 255 24 Россия,Северо-Западный ФО,Карелия,Питкяранта +3287 255 24 Россия,Северо-Западный ФО,Карелия,Пряжа +1936 255 24 Россия,Северо-Западный ФО,Карелия,Пудож +1364 255 24 Россия,Северо-Западный ФО,Карелия,Сегежа +1365 255 24 Россия,Северо-Западный ФО,Карелия,Сортавала +1939 255 24 Россия,Северо-Западный ФО,Карелия,Суоярви +2201 255 24 Россия,Северо-Западный ФО,Карелия,Другое +256 256 24 Россия,Северо-Западный ФО,Коми +1366 256 24 Россия,Северо-Западный ФО,Коми,Воркута +1367 256 24 Россия,Северо-Западный ФО,Коми,Вуктыл +2202 256 24 Россия,Северо-Западный ФО,Коми,Емва +1368 256 24 Россия,Северо-Западный ФО,Коми,Инта +1940 256 24 Россия,Северо-Западный ФО,Коми,Микунь +1369 256 24 Россия,Северо-Западный ФО,Коми,Печора +1941 256 24 Россия,Северо-Западный ФО,Коми,Сосногорск +1370 256 24 Россия,Северо-Западный ФО,Коми,Сыктывкар +1371 256 24 Россия,Северо-Западный ФО,Коми,Усинск +1372 256 24 Россия,Северо-Западный ФО,Коми,Ухта +2203 256 24 Россия,Северо-Западный ФО,Коми,Другое +252 252 24 Россия,Северо-Западный ФО,Архангельская обл. +593 252 24 Россия,Северо-Западный ФО,Архангельская обл.,Архангельск +594 252 24 Россия,Северо-Западный ФО,Архангельская обл.,Вельск +1945 252 24 Россия,Северо-Западный ФО,Архангельская обл.,Каргополь +595 252 24 Россия,Северо-Западный ФО,Архангельская обл.,Коряжма +596 252 24 Россия,Северо-Западный ФО,Архангельская обл.,Котлас +1944 252 24 Россия,Северо-Западный ФО,Архангельская обл.,Мезень +597 252 24 Россия,Северо-Западный ФО,Архангельская обл.,Мирный +598 252 24 Россия,Северо-Западный ФО,Архангельская обл.,Новодвинск +1946 252 24 Россия,Северо-Западный ФО,Архангельская обл.,Няндома +599 252 24 Россия,Северо-Западный ФО,Архангельская обл.,Онега +600 252 24 Россия,Северо-Западный ФО,Архангельская обл.,Пинега +601 252 24 Россия,Северо-Западный ФО,Архангельская обл.,Северодвинск +1942 252 24 Россия,Северо-Западный ФО,Архангельская обл.,Сольвычегодск +3239 252 24 Россия,Северо-Западный ФО,Архангельская обл.,Холмогоры +1943 252 24 Россия,Северо-Западный ФО,Архангельская обл.,Шенкурск +2204 252 24 Россия,Северо-Западный ФО,Архангельская обл.,Другое +253 253 24 Россия,Северо-Западный ФО,Вологодская обл. +1950 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Бабаево +1949 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Белозерск +1338 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Великий Устюг +1339 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Вологда +1951 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Вытегра +1340 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Грязовец +1952 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Кадников +2871 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Кадуй +1341 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Кириллов +1955 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Красавино +1342 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Михайловка +1947 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Никольск +1343 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Сокол +1953 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Тотьма +1954 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Устюжна +1948 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Харовск +1344 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Череповец +2205 253 24 Россия,Северо-Западный ФО,Вологодская обл.,Другое +254 254 24 Россия,Северо-Западный ФО,Калининградская обл. +2838 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Багратионовск +1345 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Балтийск +2846 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Гвардейск +2843 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Гурьевск +1346 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Гусев +1347 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Зеленоградск +1348 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Калининград +2842 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Краснознаменск +2845 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Ладушкин +2848 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Мамоново +2837 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Неман +2844 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Нестеров +1349 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Озерск +2841 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Полесск +2839 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Правдинск +1350 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Приморск +1351 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Светлогорск +1352 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Светлый +2840 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Славск +1353 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Советск +1354 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Черняховск +2231 254 24 Россия,Северо-Западный ФО,Калининградская обл.,Другое +257 257 24 Россия,Северо-Западный ФО,Ленинградская обл. +1985 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Бокситогорск +1374 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Волхов +1373 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Всеволожск +1375 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Выборг +1995 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Высоцк +1376 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Гатчина +1378 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Ивангород +1993 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Каменногорск +1379 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Кингисепп +1380 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Кириши +1381 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Кировск +1384 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Кузьмоловский +1984 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Лодейное Поле +1990 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Луга +1994 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Любань +1386 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Никольское +1987 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Новая Ладога +1996 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Отрадное +1986 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Пикалево +1983 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Подпорожье +1992 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Приморск +1988 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Приозерск +3071 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Пушкин +1989 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Светогорск +1389 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Сертолово +1991 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Сланцы +1391 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Сосновый Бор +1392 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Тихвин +1393 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Тосно +1394 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Шлиссельбург +2207 257 24 Россия,Северо-Западный ФО,Ленинградская обл.,Другое +258 258 24 Россия,Северо-Западный ФО,Мурманская обл. +1395 258 24 Россия,Северо-Западный ФО,Мурманская обл.,Апатиты +1959 258 24 Россия,Северо-Западный ФО,Мурманская обл.,Заполярный +1396 258 24 Россия,Северо-Западный ФО,Мурманская обл.,Зареченск +1397 258 24 Россия,Северо-Западный ФО,Мурманская обл.,Кандалакша +1398 258 24 Россия,Северо-Западный ФО,Мурманская обл.,Кировск +1399 258 24 Россия,Северо-Западный ФО,Мурманская обл.,Ковдор +1958 258 24 Россия,Северо-Западный ФО,Мурманская обл.,Кола +1400 258 24 Россия,Северо-Западный ФО,Мурманская обл.,Мончегорск +1401 258 24 Россия,Северо-Западный ФО,Мурманская обл.,Мурманск +1402 258 24 Россия,Северо-Западный ФО,Мурманская обл.,Мурмаши +1403 258 24 Россия,Северо-Западный ФО,Мурманская обл.,Оленегорск +1404 258 24 Россия,Северо-Западный ФО,Мурманская обл.,Полярные Зори +1956 258 24 Россия,Северо-Западный ФО,Мурманская обл.,Полярный +1957 258 24 Россия,Северо-Западный ФО,Мурманская обл.,Североморск +3288 258 24 Россия,Северо-Западный ФО,Мурманская обл.,Снежногорск +2206 258 24 Россия,Северо-Западный ФО,Мурманская обл.,Другое +260 260 24 Россия,Северо-Западный ФО,Новгородская обл. +1406 260 24 Россия,Северо-Западный ФО,Новгородская обл.,Батецкий +2001 260 24 Россия,Северо-Западный ФО,Новгородская обл.,Боровичи +2003 260 24 Россия,Северо-Западный ФО,Новгородская обл.,Валдай +1407 260 24 Россия,Северо-Западный ФО,Новгородская обл.,Великий Новгород +1408 260 24 Россия,Северо-Западный ФО,Новгородская обл.,Крестцы +2002 260 24 Россия,Северо-Западный ФО,Новгородская обл.,Малая Вишера +1409 260 24 Россия,Северо-Западный ФО,Новгородская обл.,Окуловка +2000 260 24 Россия,Северо-Западный ФО,Новгородская обл.,Пестово +1997 260 24 Россия,Северо-Западный ФО,Новгородская обл.,Сольцы +1410 260 24 Россия,Северо-Западный ФО,Новгородская обл.,Старая Русса +1998 260 24 Россия,Северо-Западный ФО,Новгородская обл.,Холм +1999 260 24 Россия,Северо-Западный ФО,Новгородская обл.,Чудово +2208 260 24 Россия,Северо-Западный ФО,Новгородская обл.,Другое +261 261 24 Россия,Северо-Западный ФО,Псковская обл. +1412 261 24 Россия,Северо-Западный ФО,Псковская обл.,Великие Луки +2004 261 24 Россия,Северо-Западный ФО,Псковская обл.,Гдов +2009 261 24 Россия,Северо-Западный ФО,Псковская обл.,Дно +2005 261 24 Россия,Северо-Западный ФО,Псковская обл.,Невель +1413 261 24 Россия,Северо-Западный ФО,Псковская обл.,Новоржев +2006 261 24 Россия,Северо-Западный ФО,Псковская обл.,Опочка +2008 261 24 Россия,Северо-Западный ФО,Псковская обл.,Остров +1414 261 24 Россия,Северо-Западный ФО,Псковская обл.,Печоры +1415 261 24 Россия,Северо-Западный ФО,Псковская обл.,Порхов +1411 261 24 Россия,Северо-Западный ФО,Псковская обл.,Псков +1416 261 24 Россия,Северо-Западный ФО,Псковская обл.,Пустошка +2007 261 24 Россия,Северо-Западный ФО,Псковская обл.,Пыталово +1417 261 24 Россия,Северо-Западный ФО,Псковская обл.,Себеж +2209 261 24 Россия,Северо-Западный ФО,Псковская обл.,Другое +259 259 24 Россия,Северо-Западный ФО,Ненецкий АО +1405 259 24 Россия,Северо-Западный ФО,Ненецкий АО,Нарьян-Мар +2250 259 24 Россия,Северо-Западный ФО,Ненецкий АО,Другое +3185 259 24 Россия,Сибирский ФО +265 265 24 Россия,Сибирский ФО,Бурятия +2764 265 24 Россия,Сибирский ФО,Бурятия,Бабушкин +2760 265 24 Россия,Сибирский ФО,Бурятия,Гусиноозерск +2762 265 24 Россия,Сибирский ФО,Бурятия,Закаменск +2763 265 24 Россия,Сибирский ФО,Бурятия,Кяхта +2761 265 24 Россия,Сибирский ФО,Бурятия,Северобайкальск +1446 265 24 Россия,Сибирский ФО,Бурятия,Улан-Удэ +2222 265 24 Россия,Сибирский ФО,Бурятия,Другое +263 263 24 Россия,Сибирский ФО,Республика Алтай +1439 263 24 Россия,Сибирский ФО,Республика Алтай,Горно-Алтайск +2215 263 24 Россия,Сибирский ФО,Республика Алтай,Другое +273 273 24 Россия,Сибирский ФО,Тыва +2766 273 24 Россия,Сибирский ФО,Тыва,Ак-Довурак +1494 273 24 Россия,Сибирский ФО,Тыва,Кызыл +2768 273 24 Россия,Сибирский ФО,Тыва,Новый Шагонар +2767 273 24 Россия,Сибирский ФО,Тыва,Туран +2765 273 24 Россия,Сибирский ФО,Тыва,Чадан +2275 273 24 Россия,Сибирский ФО,Тыва,Другое +275 275 24 Россия,Сибирский ФО,Хакасия +2769 275 24 Россия,Сибирский ФО,Хакасия,Абаза +1496 275 24 Россия,Сибирский ФО,Хакасия,Абакан +1497 275 24 Россия,Сибирский ФО,Хакасия,Саяногорск +2770 275 24 Россия,Сибирский ФО,Хакасия,Сорск +2771 275 24 Россия,Сибирский ФО,Хакасия,Черногорск +2281 275 24 Россия,Сибирский ФО,Хакасия,Другое +264 264 24 Россия,Сибирский ФО,Алтайский край +1440 264 24 Россия,Сибирский ФО,Алтайский край,Алейск +1441 264 24 Россия,Сибирский ФО,Алтайский край,Барнаул +1442 264 24 Россия,Сибирский ФО,Алтайский край,Белокуриха +1443 264 24 Россия,Сибирский ФО,Алтайский край,Бийск +2728 264 24 Россия,Сибирский ФО,Алтайский край,Горняк +2731 264 24 Россия,Сибирский ФО,Алтайский край,Заринск +2729 264 24 Россия,Сибирский ФО,Алтайский край,Змеиногорск +2732 264 24 Россия,Сибирский ФО,Алтайский край,Камень-на-Оби +3292 264 24 Россия,Сибирский ФО,Алтайский край,Кулунда +2730 264 24 Россия,Сибирский ФО,Алтайский край,Новоалтайск +1444 264 24 Россия,Сибирский ФО,Алтайский край,Рубцовск +1445 264 24 Россия,Сибирский ФО,Алтайский край,Славгород +3231 264 24 Россия,Сибирский ФО,Алтайский край,Яровое +2216 264 24 Россия,Сибирский ФО,Алтайский край,Другое +268 268 24 Россия,Сибирский ФО,Красноярский край +2781 268 24 Россия,Сибирский ФО,Красноярский край,Артемовск +1469 268 24 Россия,Сибирский ФО,Красноярский край,Ачинск +2784 268 24 Россия,Сибирский ФО,Красноярский край,Боготол +2773 268 24 Россия,Сибирский ФО,Красноярский край,Бородино +2774 268 24 Россия,Сибирский ФО,Красноярский край,Дивногорск +3122 268 24 Россия,Сибирский ФО,Красноярский край,Емельяновск +2772 268 24 Россия,Сибирский ФО,Красноярский край,Енисейск +3294 268 24 Россия,Сибирский ФО,Красноярский край,Железногорск +2777 268 24 Россия,Сибирский ФО,Красноярский край,Заозерный +1470 268 24 Россия,Сибирский ФО,Красноярский край,Игарка +2778 268 24 Россия,Сибирский ФО,Красноярский край,Иланский +2782 268 24 Россия,Сибирский ФО,Красноярский край,Канск +2783 268 24 Россия,Сибирский ФО,Красноярский край,Кодинский +1471 268 24 Россия,Сибирский ФО,Красноярский край,Красноярск +1472 268 24 Россия,Сибирский ФО,Красноярский край,Лесосибирск +1473 268 24 Россия,Сибирский ФО,Красноярский край,Минусинск +2775 268 24 Россия,Сибирский ФО,Красноярский край,Назарово +2776 268 24 Россия,Сибирский ФО,Красноярский край,Сосновоборск +2780 268 24 Россия,Сибирский ФО,Красноярский край,Ужур +2779 268 24 Россия,Сибирский ФО,Красноярский край,Уяр +2785 268 24 Россия,Сибирский ФО,Красноярский край,Шарыпово +1474 268 24 Россия,Сибирский ФО,Красноярский край,Шушенское +2242 268 24 Россия,Сибирский ФО,Красноярский край,Другое +266 266 24 Россия,Сибирский ФО,Иркутская обл. +2792 266 24 Россия,Сибирский ФО,Иркутская обл.,Алзамай +1447 266 24 Россия,Сибирский ФО,Иркутская обл.,Ангарск +1448 266 24 Россия,Сибирский ФО,Иркутская обл.,Байкальск +2791 266 24 Россия,Сибирский ФО,Иркутская обл.,Бирюсинск +1450 266 24 Россия,Сибирский ФО,Иркутская обл.,Бодайбо +1451 266 24 Россия,Сибирский ФО,Иркутская обл.,Братск +2793 266 24 Россия,Сибирский ФО,Иркутская обл.,Вихоревка +2789 266 24 Россия,Сибирский ФО,Иркутская обл.,Железногорск-Илимский +2786 266 24 Россия,Сибирский ФО,Иркутская обл.,Зима +1452 266 24 Россия,Сибирский ФО,Иркутская обл.,Иркутск +2794 266 24 Россия,Сибирский ФО,Иркутская обл.,Киренск +2787 266 24 Россия,Сибирский ФО,Иркутская обл.,Нижнеудинск +1449 266 24 Россия,Сибирский ФО,Иркутская обл.,Саянск +2790 266 24 Россия,Сибирский ФО,Иркутская обл.,Свирск +1453 266 24 Россия,Сибирский ФО,Иркутская обл.,Слюдянка +2788 266 24 Россия,Сибирский ФО,Иркутская обл.,Тайшет +1454 266 24 Россия,Сибирский ФО,Иркутская обл.,Тулун +1455 266 24 Россия,Сибирский ФО,Иркутская обл.,Усолье-Сибирское +2908 266 24 Россия,Сибирский ФО,Иркутская обл.,Усольск +1456 266 24 Россия,Сибирский ФО,Иркутская обл.,Усть-Илимск +1457 266 24 Россия,Сибирский ФО,Иркутская обл.,Усть-Кут +1458 266 24 Россия,Сибирский ФО,Иркутская обл.,Хужир +1459 266 24 Россия,Сибирский ФО,Иркутская обл.,Черемхово +2795 266 24 Россия,Сибирский ФО,Иркутская обл.,Шелехов +2229 266 24 Россия,Сибирский ФО,Иркутская обл.,Другое +267 267 24 Россия,Сибирский ФО,Кемеровская обл. +2737 267 24 Россия,Сибирский ФО,Кемеровская обл.,Анжеро-Суджинск +2740 267 24 Россия,Сибирский ФО,Кемеровская обл.,Белово +2746 267 24 Россия,Сибирский ФО,Кемеровская обл.,Березовский +2739 267 24 Россия,Сибирский ФО,Кемеровская обл.,Гурьевск +2742 267 24 Россия,Сибирский ФО,Кемеровская обл.,Калтан +1460 267 24 Россия,Сибирский ФО,Кемеровская обл.,Кемерово +1461 267 24 Россия,Сибирский ФО,Кемеровская обл.,Киселевск +2738 267 24 Россия,Сибирский ФО,Кемеровская обл.,Ленинск-Кузнецкий +2745 267 24 Россия,Сибирский ФО,Кемеровская обл.,Мариинск +1462 267 24 Россия,Сибирский ФО,Кемеровская обл.,Междуреченск +1463 267 24 Россия,Сибирский ФО,Кемеровская обл.,Мыски +1464 267 24 Россия,Сибирский ФО,Кемеровская обл.,Новокузнецк +2744 267 24 Россия,Сибирский ФО,Кемеровская обл.,Осинники +3358 267 24 Россия,Сибирский ФО,Кемеровская обл.,Полысаево +1465 267 24 Россия,Сибирский ФО,Кемеровская обл.,Прокопьевск +1466 267 24 Россия,Сибирский ФО,Кемеровская обл.,Салаир +2743 267 24 Россия,Сибирский ФО,Кемеровская обл.,Тайга +2741 267 24 Россия,Сибирский ФО,Кемеровская обл.,Таштагол +1467 267 24 Россия,Сибирский ФО,Кемеровская обл.,Топки +1468 267 24 Россия,Сибирский ФО,Кемеровская обл.,Юрга +2236 267 24 Россия,Сибирский ФО,Кемеровская обл.,Другое +269 269 24 Россия,Сибирский ФО,Новосибирская обл. +1475 269 24 Россия,Сибирский ФО,Новосибирская обл.,Баган +1476 269 24 Россия,Сибирский ФО,Новосибирская обл.,Барабинск +1477 269 24 Россия,Сибирский ФО,Новосибирская обл.,Бердск +2750 269 24 Россия,Сибирский ФО,Новосибирская обл.,Болотное +1478 269 24 Россия,Сибирский ФО,Новосибирская обл.,Искитим +2752 269 24 Россия,Сибирский ФО,Новосибирская обл.,Карасук +2751 269 24 Россия,Сибирский ФО,Новосибирская обл.,Каргат +3107 269 24 Россия,Сибирский ФО,Новосибирская обл.,Краснообск +2753 269 24 Россия,Сибирский ФО,Новосибирская обл.,Куйбышев +2755 269 24 Россия,Сибирский ФО,Новосибирская обл.,Купино +1479 269 24 Россия,Сибирский ФО,Новосибирская обл.,Новосибирск +2759 269 24 Россия,Сибирский ФО,Новосибирская обл.,Обь +2756 269 24 Россия,Сибирский ФО,Новосибирская обл.,Татарск +2758 269 24 Россия,Сибирский ФО,Новосибирская обл.,Тогучин +2757 269 24 Россия,Сибирский ФО,Новосибирская обл.,Черепаново +2754 269 24 Россия,Сибирский ФО,Новосибирская обл.,Чулым +2252 269 24 Россия,Сибирский ФО,Новосибирская обл.,Другое +270 270 24 Россия,Сибирский ФО,Омская обл. +2733 270 24 Россия,Сибирский ФО,Омская обл.,Исилькуль +1480 270 24 Россия,Сибирский ФО,Омская обл.,Калачинск +1481 270 24 Россия,Сибирский ФО,Омская обл.,Марьяновка +2735 270 24 Россия,Сибирский ФО,Омская обл.,Называевск +1482 270 24 Россия,Сибирский ФО,Омская обл.,Омск +2734 270 24 Россия,Сибирский ФО,Омская обл.,Тара +2736 270 24 Россия,Сибирский ФО,Омская обл.,Тюкалинск +2253 270 24 Россия,Сибирский ФО,Омская обл.,Другое +272 272 24 Россия,Сибирский ФО,Томская обл. +1488 272 24 Россия,Сибирский ФО,Томская обл.,Асино +1489 272 24 Россия,Сибирский ФО,Томская обл.,Белый Яр +3295 272 24 Россия,Сибирский ФО,Томская обл.,Каргасок +1491 272 24 Россия,Сибирский ФО,Томская обл.,Колпашево +1492 272 24 Россия,Сибирский ФО,Томская обл.,Северск +1493 272 24 Россия,Сибирский ФО,Томская обл.,Стрежевой +1490 272 24 Россия,Сибирский ФО,Томская обл.,Томск +2273 272 24 Россия,Сибирский ФО,Томская обл.,Другое +276 276 24 Россия,Сибирский ФО,Читинская обл. +2803 276 24 Россия,Сибирский ФО,Читинская обл.,Балей +2799 276 24 Россия,Сибирский ФО,Читинская обл.,Борзя +1499 276 24 Россия,Сибирский ФО,Читинская обл.,Краснокаменск +2801 276 24 Россия,Сибирский ФО,Читинская обл.,Могоча +2800 276 24 Россия,Сибирский ФО,Читинская обл.,Нерчинск +2802 276 24 Россия,Сибирский ФО,Читинская обл.,Петровск-Забайкальский +2798 276 24 Россия,Сибирский ФО,Читинская обл.,Сретенск +2796 276 24 Россия,Сибирский ФО,Читинская обл.,Хилок +1498 276 24 Россия,Сибирский ФО,Читинская обл.,Чита +2797 276 24 Россия,Сибирский ФО,Читинская обл.,Шилка +2285 276 24 Россия,Сибирский ФО,Читинская обл.,Другое +262 262 24 Россия,Сибирский ФО,Агинский Бурятский АО +1438 262 24 Россия,Сибирский ФО,Агинский Бурятский АО,Агинское +2213 262 24 Россия,Сибирский ФО,Агинский Бурятский АО,Другое +271 271 24 Россия,Сибирский ФО,Таймырский АО +3233 271 24 Россия,Сибирский ФО,Таймырский АО,Диксон +1485 271 24 Россия,Сибирский ФО,Таймырский АО,Дудинка +1487 271 24 Россия,Сибирский ФО,Таймырский АО,Кайеркан +1483 271 24 Россия,Сибирский ФО,Таймырский АО,Норильск +1484 271 24 Россия,Сибирский ФО,Таймырский АО,Талнах +1486 271 24 Россия,Сибирский ФО,Таймырский АО,Хатанга +2269 271 24 Россия,Сибирский ФО,Таймырский АО,Другое +274 274 24 Россия,Сибирский ФО,Усть-Ордынский Бурятский АО +1495 274 24 Россия,Сибирский ФО,Усть-Ордынский Бурятский АО,Усть-Ордынский +2279 274 24 Россия,Сибирский ФО,Усть-Ордынский Бурятский АО,Другое +277 277 24 Россия,Сибирский ФО,Эвенкийский АО +1500 277 24 Россия,Сибирский ФО,Эвенкийский АО,Тура +2288 277 24 Россия,Сибирский ФО,Эвенкийский АО,Другое +3184 277 24 Россия,Уральский ФО +278 278 24 Россия,Уральский ФО,Курганская обл. +2668 278 24 Россия,Уральский ФО,Курганская обл.,Далматово +2667 278 24 Россия,Уральский ФО,Курганская обл.,Катайск +1524 278 24 Россия,Уральский ФО,Курганская обл.,Курган +2669 278 24 Россия,Уральский ФО,Курганская обл.,Куртамыш +2666 278 24 Россия,Уральский ФО,Курганская обл.,Макушино +2671 278 24 Россия,Уральский ФО,Курганская обл.,Петухово +1525 278 24 Россия,Уральский ФО,Курганская обл.,Шадринск +2670 278 24 Россия,Уральский ФО,Курганская обл.,Шумиха +2672 278 24 Россия,Уральский ФО,Курганская обл.,Щучье +2243 278 24 Россия,Уральский ФО,Курганская обл.,Другое +279 279 24 Россия,Уральский ФО,Свердловская обл. +1526 279 24 Россия,Уральский ФО,Свердловская обл.,Алапаевск +1527 279 24 Россия,Уральский ФО,Свердловская обл.,Арамиль +2691 279 24 Россия,Уральский ФО,Свердловская обл.,Артемовский +1528 279 24 Россия,Уральский ФО,Свердловская обл.,Асбест +2924 279 24 Россия,Уральский ФО,Свердловская обл.,Белоярский +2707 279 24 Россия,Уральский ФО,Свердловская обл.,Березовский +1529 279 24 Россия,Уральский ФО,Свердловская обл.,Богданович +2698 279 24 Россия,Уральский ФО,Свердловская обл.,Верхний Тагил +1530 279 24 Россия,Уральский ФО,Свердловская обл.,Верхняя Пышма +1531 279 24 Россия,Уральский ФО,Свердловская обл.,Верхняя Салда +1532 279 24 Россия,Уральский ФО,Свердловская обл.,Верхняя Синячиха +2696 279 24 Россия,Уральский ФО,Свердловская обл.,Верхняя Тура +2692 279 24 Россия,Уральский ФО,Свердловская обл.,Верхотурье +2706 279 24 Россия,Уральский ФО,Свердловская обл.,Волчанск +2709 279 24 Россия,Уральский ФО,Свердловская обл.,Дегтярск +1533 279 24 Россия,Уральский ФО,Свердловская обл.,Екатеринбург +1534 279 24 Россия,Уральский ФО,Свердловская обл.,Заречный +1535 279 24 Россия,Уральский ФО,Свердловская обл.,Ивдель +1536 279 24 Россия,Уральский ФО,Свердловская обл.,Ирбит +1537 279 24 Россия,Уральский ФО,Свердловская обл.,Каменск-Уральский +1538 279 24 Россия,Уральский ФО,Свердловская обл.,Камышлов +2708 279 24 Россия,Уральский ФО,Свердловская обл.,Карпинск +1539 279 24 Россия,Уральский ФО,Свердловская обл.,Качканар +2712 279 24 Россия,Уральский ФО,Свердловская обл.,Кировград +1540 279 24 Россия,Уральский ФО,Свердловская обл.,Краснотурьинск +2694 279 24 Россия,Уральский ФО,Свердловская обл.,Красноуральск +2693 279 24 Россия,Уральский ФО,Свердловская обл.,Красноуфимск +1541 279 24 Россия,Уральский ФО,Свердловская обл.,Кушва +2711 279 24 Россия,Уральский ФО,Свердловская обл.,Михайловск +2713 279 24 Россия,Уральский ФО,Свердловская обл.,Михайловск +1542 279 24 Россия,Уральский ФО,Свердловская обл.,Невьянск +2702 279 24 Россия,Уральский ФО,Свердловская обл.,Нижние Серги +1543 279 24 Россия,Уральский ФО,Свердловская обл.,Нижний Тагил +2695 279 24 Россия,Уральский ФО,Свердловская обл.,Нижняя Салда +2697 279 24 Россия,Уральский ФО,Свердловская обл.,Нижняя Тура +2699 279 24 Россия,Уральский ФО,Свердловская обл.,Новая Ляля +2909 279 24 Россия,Уральский ФО,Свердловская обл.,Новоуральск +1544 279 24 Россия,Уральский ФО,Свердловская обл.,Первоуральск +1545 279 24 Россия,Уральский ФО,Свердловская обл.,Полевской +1546 279 24 Россия,Уральский ФО,Свердловская обл.,Ревда +1547 279 24 Россия,Уральский ФО,Свердловская обл.,Реж +3296 279 24 Россия,Уральский ФО,Свердловская обл.,Рефтинский +2700 279 24 Россия,Уральский ФО,Свердловская обл.,Североуральск +1548 279 24 Россия,Уральский ФО,Свердловская обл.,Серов +2710 279 24 Россия,Уральский ФО,Свердловская обл.,Среднеуральск +2701 279 24 Россия,Уральский ФО,Свердловская обл.,Сухой Лог +2703 279 24 Россия,Уральский ФО,Свердловская обл.,Сысерть +1549 279 24 Россия,Уральский ФО,Свердловская обл.,Тавда +2704 279 24 Россия,Уральский ФО,Свердловская обл.,Талица +2705 279 24 Россия,Уральский ФО,Свердловская обл.,Туринск +2265 279 24 Россия,Уральский ФО,Свердловская обл.,Другое +280 280 24 Россия,Уральский ФО,Тюменская обл. +1550 280 24 Россия,Уральский ФО,Тюменская обл.,Заводоуковск +1551 280 24 Россия,Уральский ФО,Тюменская обл.,Ишим +3326 280 24 Россия,Уральский ФО,Тюменская обл.,Сургут +1552 280 24 Россия,Уральский ФО,Тюменская обл.,Тобольск +1553 280 24 Россия,Уральский ФО,Тюменская обл.,Тюмень +2748 280 24 Россия,Уральский ФО,Тюменская обл.,Ялуторовск +2276 280 24 Россия,Уральский ФО,Тюменская обл.,Другое +282 282 24 Россия,Уральский ФО,Челябинская обл. +1564 282 24 Россия,Уральский ФО,Челябинская обл.,Аша +2723 282 24 Россия,Уральский ФО,Челябинская обл.,Бакал +2724 282 24 Россия,Уральский ФО,Челябинская обл.,Верхнеуральск +2716 282 24 Россия,Уральский ФО,Челябинская обл.,Верхний Уфалей +3297 282 24 Россия,Уральский ФО,Челябинская обл.,Всеволожск +2725 282 24 Россия,Уральский ФО,Челябинская обл.,Еманжелинск +1565 282 24 Россия,Уральский ФО,Челябинская обл.,Златоуст +2722 282 24 Россия,Уральский ФО,Челябинская обл.,Карабаш +1566 282 24 Россия,Уральский ФО,Челябинская обл.,Карталы +2718 282 24 Россия,Уральский ФО,Челябинская обл.,Касли +2720 282 24 Россия,Уральский ФО,Челябинская обл.,Катав-Ивановск +1567 282 24 Россия,Уральский ФО,Челябинская обл.,Копейск +2721 282 24 Россия,Уральский ФО,Челябинская обл.,Коркино +2715 282 24 Россия,Уральский ФО,Челябинская обл.,Куса +1568 282 24 Россия,Уральский ФО,Челябинская обл.,Кыштым +1569 282 24 Россия,Уральский ФО,Челябинская обл.,Магнитогорск +1570 282 24 Россия,Уральский ФО,Челябинская обл.,Миасс +2726 282 24 Россия,Уральский ФО,Челябинская обл.,Миньяр +2717 282 24 Россия,Уральский ФО,Челябинская обл.,Нязепетровск +3100 282 24 Россия,Уральский ФО,Челябинская обл.,Озерск +1571 282 24 Россия,Уральский ФО,Челябинская обл.,Пласт +2719 282 24 Россия,Уральский ФО,Челябинская обл.,Сатка +2727 282 24 Россия,Уральский ФО,Челябинская обл.,Сим +1572 282 24 Россия,Уральский ФО,Челябинская обл.,Снежинск +3332 282 24 Россия,Уральский ФО,Челябинская обл.,Трехгорный +1573 282 24 Россия,Уральский ФО,Челябинская обл.,Троицк +1574 282 24 Россия,Уральский ФО,Челябинская обл.,Усть-Катав +1575 282 24 Россия,Уральский ФО,Челябинская обл.,Чебаркуль +1576 282 24 Россия,Уральский ФО,Челябинская обл.,Челябинск +1577 282 24 Россия,Уральский ФО,Челябинская обл.,Южноуральск +2714 282 24 Россия,Уральский ФО,Челябинская обл.,Юрюзань +2283 282 24 Россия,Уральский ФО,Челябинская обл.,Другое +281 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра +2749 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Белоярский +1554 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Игрим +1555 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Когалым +1556 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Лангепас +1561 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Мегион +1562 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Нефтеюганск +1559 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Нижневартовск +2852 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Нягань +2853 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Нягань +2854 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Пыть-Ях +1560 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Радужный +1563 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Советский +2747 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Сургут +1557 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Урай +1558 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Ханты-Мансийск +3344 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Югорск +2282 281 24 Россия,Уральский ФО,Ханты-Мансийский АО - Югра,Другое +283 283 24 Россия,Уральский ФО,Ямало-Ненецкий АО +3298 283 24 Россия,Уральский ФО,Ямало-Ненецкий АО,Губкинский +1578 283 24 Россия,Уральский ФО,Ямало-Ненецкий АО,Лабытнанги +2856 283 24 Россия,Уральский ФО,Ямало-Ненецкий АО,Муравленко +1579 283 24 Россия,Уральский ФО,Ямало-Ненецкий АО,Надым +1580 283 24 Россия,Уральский ФО,Ямало-Ненецкий АО,Новый Уренгой +1581 283 24 Россия,Уральский ФО,Ямало-Ненецкий АО,Ноябрьск +1582 283 24 Россия,Уральский ФО,Ямало-Ненецкий АО,Салехард +1583 283 24 Россия,Уральский ФО,Ямало-Ненецкий АО,Уренгой +2289 283 24 Россия,Уральский ФО,Ямало-Ненецкий АО,Другое +3180 283 24 Россия,Центральный ФО +284 284 24 Россия,Центральный ФО,Белгородская обл. +1625 284 24 Россия,Центральный ФО,Белгородская обл.,Алексеевка +1626 284 24 Россия,Центральный ФО,Белгородская обл.,Белгород +2172 284 24 Россия,Центральный ФО,Белгородская обл.,Валуйки +2173 284 24 Россия,Центральный ФО,Белгородская обл.,Грайворон +1627 284 24 Россия,Центральный ФО,Белгородская обл.,Губкин +2174 284 24 Россия,Центральный ФО,Белгородская обл.,Короча +2175 284 24 Россия,Центральный ФО,Белгородская обл.,Новый Оскол +1628 284 24 Россия,Центральный ФО,Белгородская обл.,Старый Оскол +1629 284 24 Россия,Центральный ФО,Белгородская обл.,Шебекино +2221 284 24 Россия,Центральный ФО,Белгородская обл.,Другое +285 285 24 Россия,Центральный ФО,Брянская обл. +1630 285 24 Россия,Центральный ФО,Брянская обл.,Брянск +3283 285 24 Россия,Центральный ФО,Брянская обл.,Дебрянск +1631 285 24 Россия,Центральный ФО,Брянская обл.,Дятьково +2013 285 24 Россия,Центральный ФО,Брянская обл.,Жуковка +2015 285 24 Россия,Центральный ФО,Брянская обл.,Злынка +1632 285 24 Россия,Центральный ФО,Брянская обл.,Карачев +1633 285 24 Россия,Центральный ФО,Брянская обл.,Клинцы +1634 285 24 Россия,Центральный ФО,Брянская обл.,Мглин +2016 285 24 Россия,Центральный ФО,Брянская обл.,Новозыбков +2018 285 24 Россия,Центральный ФО,Брянская обл.,Почеп +2017 285 24 Россия,Центральный ФО,Брянская обл.,Севск +2020 285 24 Россия,Центральный ФО,Брянская обл.,Сельцо +2014 285 24 Россия,Центральный ФО,Брянская обл.,Стародуб +2010 285 24 Россия,Центральный ФО,Брянская обл.,Сураж +2012 285 24 Россия,Центральный ФО,Брянская обл.,Трубчевск +2011 285 24 Россия,Центральный ФО,Брянская обл.,Унеча +2019 285 24 Россия,Центральный ФО,Брянская обл.,Фокино +2210 285 24 Россия,Центральный ФО,Брянская обл.,Другое +286 286 24 Россия,Центральный ФО,Владимирская обл. +1635 286 24 Россия,Центральный ФО,Владимирская обл.,Александров +1636 286 24 Россия,Центральный ФО,Владимирская обл.,Владимир +2021 286 24 Россия,Центральный ФО,Владимирская обл.,Вязники +1637 286 24 Россия,Центральный ФО,Владимирская обл.,Головино +2022 286 24 Россия,Центральный ФО,Владимирская обл.,Гороховец +1638 286 24 Россия,Центральный ФО,Владимирская обл.,Гусь-Хрустальный +2023 286 24 Россия,Центральный ФО,Владимирская обл.,Камешково +2031 286 24 Россия,Центральный ФО,Владимирская обл.,Карабаново +2024 286 24 Россия,Центральный ФО,Владимирская обл.,Киржач +1639 286 24 Россия,Центральный ФО,Владимирская обл.,Ковров +1640 286 24 Россия,Центральный ФО,Владимирская обл.,Кольчугино +2026 286 24 Россия,Центральный ФО,Владимирская обл.,Костерево +3299 286 24 Россия,Центральный ФО,Владимирская обл.,Красная Горбатка +2033 286 24 Россия,Центральный ФО,Владимирская обл.,Лакинск +2025 286 24 Россия,Центральный ФО,Владимирская обл.,Меленки +1641 286 24 Россия,Центральный ФО,Владимирская обл.,Муром +1642 286 24 Россия,Центральный ФО,Владимирская обл.,Петушки +2027 286 24 Россия,Центральный ФО,Владимирская обл.,Покров +2211 286 24 Россия,Центральный ФО,Владимирская обл.,Радужный +2028 286 24 Россия,Центральный ФО,Владимирская обл.,Собинка +2032 286 24 Россия,Центральный ФО,Владимирская обл.,Струнино +2029 286 24 Россия,Центральный ФО,Владимирская обл.,Судогда +1643 286 24 Россия,Центральный ФО,Владимирская обл.,Суздаль +2030 286 24 Россия,Центральный ФО,Владимирская обл.,Юрьев-Польский +2212 286 24 Россия,Центральный ФО,Владимирская обл.,Другое +287 287 24 Россия,Центральный ФО,Воронежская обл. +1644 287 24 Россия,Центральный ФО,Воронежская обл.,Бобров +1645 287 24 Россия,Центральный ФО,Воронежская обл.,Богучар +1646 287 24 Россия,Центральный ФО,Воронежская обл.,Борисоглебск +1647 287 24 Россия,Центральный ФО,Воронежская обл.,Бутурлиновка +1648 287 24 Россия,Центральный ФО,Воронежская обл.,Воронеж +2178 287 24 Россия,Центральный ФО,Воронежская обл.,Калач +2176 287 24 Россия,Центральный ФО,Воронежская обл.,Лиски +1649 287 24 Россия,Центральный ФО,Воронежская обл.,Нововоронеж +2177 287 24 Россия,Центральный ФО,Воронежская обл.,Новохоперск +2180 287 24 Россия,Центральный ФО,Воронежская обл.,Острогожск +1650 287 24 Россия,Центральный ФО,Воронежская обл.,Павловск +2181 287 24 Россия,Центральный ФО,Воронежская обл.,Поворино +1651 287 24 Россия,Центральный ФО,Воронежская обл.,Россошь +2179 287 24 Россия,Центральный ФО,Воронежская обл.,Семилуки +2182 287 24 Россия,Центральный ФО,Воронежская обл.,Эртиль +2224 287 24 Россия,Центральный ФО,Воронежская обл.,Другое +288 288 24 Россия,Центральный ФО,Ивановская обл. +1652 288 24 Россия,Центральный ФО,Ивановская обл.,Вичуга +2036 288 24 Россия,Центральный ФО,Ивановская обл.,Гаврилов Посад +1657 288 24 Россия,Центральный ФО,Ивановская обл.,Заволжск +1653 288 24 Россия,Центральный ФО,Ивановская обл.,Иваново +1656 288 24 Россия,Центральный ФО,Ивановская обл.,Кинешма +2040 288 24 Россия,Центральный ФО,Ивановская обл.,Комсомольск +2037 288 24 Россия,Центральный ФО,Ивановская обл.,Кохма +2043 288 24 Россия,Центральный ФО,Ивановская обл.,Наволоки +3300 288 24 Россия,Центральный ФО,Ивановская обл.,Палех +2039 288 24 Россия,Центральный ФО,Ивановская обл.,Плес +2038 288 24 Россия,Центральный ФО,Ивановская обл.,Приволжск +2042 288 24 Россия,Центральный ФО,Ивановская обл.,Пучеж +2044 288 24 Россия,Центральный ФО,Ивановская обл.,Родники +1655 288 24 Россия,Центральный ФО,Ивановская обл.,Тейково +2034 288 24 Россия,Центральный ФО,Ивановская обл.,Фурманов +1654 288 24 Россия,Центральный ФО,Ивановская обл.,Шуя +2041 288 24 Россия,Центральный ФО,Ивановская обл.,Южа +2035 288 24 Россия,Центральный ФО,Ивановская обл.,Юрьевец +2227 288 24 Россия,Центральный ФО,Ивановская обл.,Другое +289 289 24 Россия,Центральный ФО,Калужская обл. +2050 289 24 Россия,Центральный ФО,Калужская обл.,Балабаново +2051 289 24 Россия,Центральный ФО,Калужская обл.,Боровск +3301 289 24 Россия,Центральный ФО,Калужская обл.,Воротынск +2052 289 24 Россия,Центральный ФО,Калужская обл.,Жиздра +1660 289 24 Россия,Центральный ФО,Калужская обл.,Жуковка +1658 289 24 Россия,Центральный ФО,Калужская обл.,Калуга +2046 289 24 Россия,Центральный ФО,Калужская обл.,Киров +1661 289 24 Россия,Центральный ФО,Калужская обл.,Козельск +2053 289 24 Россия,Центральный ФО,Калужская обл.,Кондрово +2049 289 24 Россия,Центральный ФО,Калужская обл.,Людиново +1659 289 24 Россия,Центральный ФО,Калужская обл.,Малоярославец +2054 289 24 Россия,Центральный ФО,Калужская обл.,Медынь +2055 289 24 Россия,Центральный ФО,Калужская обл.,Мещовск +2047 289 24 Россия,Центральный ФО,Калужская обл.,Мосальск +1662 289 24 Россия,Центральный ФО,Калужская обл.,Обнинск +2057 289 24 Россия,Центральный ФО,Калужская обл.,Сосенский +2056 289 24 Россия,Центральный ФО,Калужская обл.,Спас-Демянск +2045 289 24 Россия,Центральный ФО,Калужская обл.,Сухиничи +1663 289 24 Россия,Центральный ФО,Калужская обл.,Таруса +2131 289 24 Россия,Центральный ФО,Калужская обл.,Чекалин +2048 289 24 Россия,Центральный ФО,Калужская обл.,Юхнов +2233 289 24 Россия,Центральный ФО,Калужская обл.,Другое +290 290 24 Россия,Центральный ФО,Костромская обл. +1664 290 24 Россия,Центральный ФО,Костромская обл.,Буй +1665 290 24 Россия,Центральный ФО,Костромская обл.,Волгореченск +1666 290 24 Россия,Центральный ФО,Костромская обл.,Галич +2059 290 24 Россия,Центральный ФО,Костромская обл.,Кологрив +1667 290 24 Россия,Центральный ФО,Костромская обл.,Кострома +3302 290 24 Россия,Центральный ФО,Костромская обл.,Красное-на-Волге +1668 290 24 Россия,Центральный ФО,Костромская обл.,Макарьев +2060 290 24 Россия,Центральный ФО,Костромская обл.,Мантурово +1669 290 24 Россия,Центральный ФО,Костромская обл.,Нерехта +2061 290 24 Россия,Центральный ФО,Костромская обл.,Нея +2062 290 24 Россия,Центральный ФО,Костромская обл.,Солигалич +2058 290 24 Россия,Центральный ФО,Костромская обл.,Чухлома +1670 290 24 Россия,Центральный ФО,Костромская обл.,Шарья +2240 290 24 Россия,Центральный ФО,Костромская обл.,Другое +291 291 24 Россия,Центральный ФО,Курская обл. +1671 291 24 Россия,Центральный ФО,Курская обл.,Дмитриев-Льговский +1673 291 24 Россия,Центральный ФО,Курская обл.,Железногорск +3279 291 24 Россия,Центральный ФО,Курская обл.,Железногорск +1672 291 24 Россия,Центральный ФО,Курская обл.,Курск +2187 291 24 Россия,Центральный ФО,Курская обл.,Курчатов +2188 291 24 Россия,Центральный ФО,Курская обл.,Льгов +2184 291 24 Россия,Центральный ФО,Курская обл.,Обоянь +2185 291 24 Россия,Центральный ФО,Курская обл.,Рыльск +2183 291 24 Россия,Центральный ФО,Курская обл.,Суджа +2189 291 24 Россия,Центральный ФО,Курская обл.,Фатеж +2186 291 24 Россия,Центральный ФО,Курская обл.,Щигры +2244 291 24 Россия,Центральный ФО,Курская обл.,Другое +292 292 24 Россия,Центральный ФО,Липецкая обл. +2194 292 24 Россия,Центральный ФО,Липецкая обл.,Грязи +2193 292 24 Россия,Центральный ФО,Липецкая обл.,Данков +1674 292 24 Россия,Центральный ФО,Липецкая обл.,Елец +2190 292 24 Россия,Центральный ФО,Липецкая обл.,Задонск +2195 292 24 Россия,Центральный ФО,Липецкая обл.,Лебедянь +1675 292 24 Россия,Центральный ФО,Липецкая обл.,Липецк +2192 292 24 Россия,Центральный ФО,Липецкая обл.,Усмань +2191 292 24 Россия,Центральный ФО,Липецкая обл.,Чаплыгин +2245 292 24 Россия,Центральный ФО,Липецкая обл.,Другое +293 293 24 Россия,Центральный ФО,Московская обл. +1733 293 24 Россия,Центральный ФО,Московская обл.,Апрелевка +1732 293 24 Россия,Центральный ФО,Московская обл.,Балашиха +1731 293 24 Россия,Центральный ФО,Московская обл.,Бронницы +1730 293 24 Россия,Центральный ФО,Московская обл.,Верея +2063 293 24 Россия,Центральный ФО,Московская обл.,Видное +2064 293 24 Россия,Центральный ФО,Московская обл.,Волоколамск +1729 293 24 Россия,Центральный ФО,Московская обл.,Воскресенск +1728 293 24 Россия,Центральный ФО,Московская обл.,Высоковск +1727 293 24 Россия,Центральный ФО,Московская обл.,Голицыно +2065 293 24 Россия,Центральный ФО,Московская обл.,Дедовск +1726 293 24 Россия,Центральный ФО,Московская обл.,Дзержинский +1725 293 24 Россия,Центральный ФО,Московская обл.,Дмитров +1724 293 24 Россия,Центральный ФО,Московская обл.,Долгопрудный +1723 293 24 Россия,Центральный ФО,Московская обл.,Домодедово +2066 293 24 Россия,Центральный ФО,Московская обл.,Дрезна +1722 293 24 Россия,Центральный ФО,Московская обл.,Дубна +1721 293 24 Россия,Центральный ФО,Московская обл.,Егорьевск +1720 293 24 Россия,Центральный ФО,Московская обл.,Железнодорожный +1719 293 24 Россия,Центральный ФО,Московская обл.,Жуковский +2067 293 24 Россия,Центральный ФО,Московская обл.,Зарайск +1718 293 24 Россия,Центральный ФО,Московская обл.,Звенигород +1715 293 24 Россия,Центральный ФО,Московская обл.,Ивантеевка +1717 293 24 Россия,Центральный ФО,Московская обл.,Истра +2068 293 24 Россия,Центральный ФО,Московская обл.,Калининград +2069 293 24 Россия,Центральный ФО,Московская обл.,Кашира +1716 293 24 Россия,Центральный ФО,Московская обл.,Климовск +1714 293 24 Россия,Центральный ФО,Московская обл.,Клин +1713 293 24 Россия,Центральный ФО,Московская обл.,Коломна +1712 293 24 Россия,Центральный ФО,Московская обл.,Королев +1711 293 24 Россия,Центральный ФО,Московская обл.,Красноармейск +1710 293 24 Россия,Центральный ФО,Московская обл.,Красногорск +2070 293 24 Россия,Центральный ФО,Московская обл.,Краснозаводск +2071 293 24 Россия,Центральный ФО,Московская обл.,Куровское +1709 293 24 Россия,Центральный ФО,Московская обл.,Ликино-Дулево +1708 293 24 Россия,Центральный ФО,Московская обл.,Лобня +2072 293 24 Россия,Центральный ФО,Московская обл.,Лосино-Петровский +1707 293 24 Россия,Центральный ФО,Московская обл.,Луховицы +1706 293 24 Россия,Центральный ФО,Московская обл.,Лыткарино +1705 293 24 Россия,Центральный ФО,Московская обл.,Люберцы +1704 293 24 Россия,Центральный ФО,Московская обл.,Менделеево +1703 293 24 Россия,Центральный ФО,Московская обл.,Можайск +1702 293 24 Россия,Центральный ФО,Московская обл.,Мытищи +1701 293 24 Россия,Центральный ФО,Московская обл.,Наро-Фоминск +1700 293 24 Россия,Центральный ФО,Московская обл.,Ногинск +1698 293 24 Россия,Центральный ФО,Московская обл.,Одинцово +2073 293 24 Россия,Центральный ФО,Московская обл.,Ожерелье +2074 293 24 Россия,Центральный ФО,Московская обл.,Озеры +1699 293 24 Россия,Центральный ФО,Московская обл.,Орехово-Зуево +1697 293 24 Россия,Центральный ФО,Московская обл.,Павловский Посад +1696 293 24 Россия,Центральный ФО,Московская обл.,Подольск +1695 293 24 Россия,Центральный ФО,Московская обл.,Протвино +1694 293 24 Россия,Центральный ФО,Московская обл.,Пушкино +1693 293 24 Россия,Центральный ФО,Московская обл.,Пущино +1692 293 24 Россия,Центральный ФО,Московская обл.,Раменское +1691 293 24 Россия,Центральный ФО,Московская обл.,Реутов +1690 293 24 Россия,Центральный ФО,Московская обл.,Решетников +2075 293 24 Россия,Центральный ФО,Московская обл.,Рошаль +2076 293 24 Россия,Центральный ФО,Московская обл.,Руза +1689 293 24 Россия,Центральный ФО,Московская обл.,Сергиев Посад +1688 293 24 Россия,Центральный ФО,Московская обл.,Серпухов +1687 293 24 Россия,Центральный ФО,Московская обл.,Солнечногорск +1686 293 24 Россия,Центральный ФО,Московская обл.,Ступино +2077 293 24 Россия,Центральный ФО,Московская обл.,Сходня +2078 293 24 Россия,Центральный ФО,Московская обл.,Талдом +1685 293 24 Россия,Центральный ФО,Московская обл.,Троицк +1684 293 24 Россия,Центральный ФО,Московская обл.,Фрязино +1683 293 24 Россия,Центральный ФО,Московская обл.,Химки +1682 293 24 Россия,Центральный ФО,Московская обл.,Хотьково +1681 293 24 Россия,Центральный ФО,Московская обл.,Черноголовка +1680 293 24 Россия,Центральный ФО,Московская обл.,Чехов +1679 293 24 Россия,Центральный ФО,Московская обл.,Шатура +1678 293 24 Россия,Центральный ФО,Московская обл.,Щелково +2080 293 24 Россия,Центральный ФО,Московская обл.,Щербинка +1677 293 24 Россия,Центральный ФО,Московская обл.,Электрогорск +1676 293 24 Россия,Центральный ФО,Московская обл.,Электросталь +2079 293 24 Россия,Центральный ФО,Московская обл.,Электроугли +3031 293 24 Россия,Центральный ФО,Московская обл.,Юбилейный +2081 293 24 Россия,Центральный ФО,Московская обл.,Яхрома +2249 293 24 Россия,Центральный ФО,Московская обл.,Другое +294 294 24 Россия,Центральный ФО,Орловская обл. +2083 294 24 Россия,Центральный ФО,Орловская обл.,Болхов +2082 294 24 Россия,Центральный ФО,Орловская обл.,Дмитровск-Орловский +3160 294 24 Россия,Центральный ФО,Орловская обл.,Залегощь +1736 294 24 Россия,Центральный ФО,Орловская обл.,Ливны +2084 294 24 Россия,Центральный ФО,Орловская обл.,Малоархангельск +1737 294 24 Россия,Центральный ФО,Орловская обл.,Мценск +2085 294 24 Россия,Центральный ФО,Орловская обл.,Новосиль +1735 294 24 Россия,Центральный ФО,Орловская обл.,Орел +2255 294 24 Россия,Центральный ФО,Орловская обл.,Другое +295 295 24 Россия,Центральный ФО,Рязанская обл. +1740 295 24 Россия,Центральный ФО,Рязанская обл.,Гусь-Железный +1741 295 24 Россия,Центральный ФО,Рязанская обл.,Касимов +2086 295 24 Россия,Центральный ФО,Рязанская обл.,Кораблино +2087 295 24 Россия,Центральный ФО,Рязанская обл.,Михайлов +2089 295 24 Россия,Центральный ФО,Рязанская обл.,Новомичуринск +2091 295 24 Россия,Центральный ФО,Рязанская обл.,Рыбное +2093 295 24 Россия,Центральный ФО,Рязанская обл.,Ряжск +1738 295 24 Россия,Центральный ФО,Рязанская обл.,Рязань +3305 295 24 Россия,Центральный ФО,Рязанская обл.,Сапожок +1739 295 24 Россия,Центральный ФО,Рязанская обл.,Сасово +2090 295 24 Россия,Центральный ФО,Рязанская обл.,Скопин +2088 295 24 Россия,Центральный ФО,Рязанская обл.,Спас-Клепики +2092 295 24 Россия,Центральный ФО,Рязанская обл.,Спасск-Рязанский +2094 295 24 Россия,Центральный ФО,Рязанская обл.,Шацк +3320 295 24 Россия,Центральный ФО,Рязанская обл.,Шилово +2260 295 24 Россия,Центральный ФО,Рязанская обл.,Другое +296 296 24 Россия,Центральный ФО,Смоленская обл. +2095 296 24 Россия,Центральный ФО,Смоленская обл.,Велиж +1743 296 24 Россия,Центральный ФО,Смоленская обл.,Вязьма +1744 296 24 Россия,Центральный ФО,Смоленская обл.,Гагарин +2096 296 24 Россия,Центральный ФО,Смоленская обл.,Демидов +1745 296 24 Россия,Центральный ФО,Смоленская обл.,Десногорск +1746 296 24 Россия,Центральный ФО,Смоленская обл.,Дорогубуж +2097 296 24 Россия,Центральный ФО,Смоленская обл.,Духовщина +2098 296 24 Россия,Центральный ФО,Смоленская обл.,Ельня +2099 296 24 Россия,Центральный ФО,Смоленская обл.,Починок +2100 296 24 Россия,Центральный ФО,Смоленская обл.,Рославль +2101 296 24 Россия,Центральный ФО,Смоленская обл.,Рудня +1747 296 24 Россия,Центральный ФО,Смоленская обл.,Сафоново +1742 296 24 Россия,Центральный ФО,Смоленская обл.,Смоленск +2102 296 24 Россия,Центральный ФО,Смоленская обл.,Сычевка +1748 296 24 Россия,Центральный ФО,Смоленская обл.,Ярцево +2267 296 24 Россия,Центральный ФО,Смоленская обл.,Другое +297 297 24 Россия,Центральный ФО,Тамбовская обл. +2198 297 24 Россия,Центральный ФО,Тамбовская обл.,Жердевка +2199 297 24 Россия,Центральный ФО,Тамбовская обл.,Кирсанов +1752 297 24 Россия,Центральный ФО,Тамбовская обл.,Котовск +1751 297 24 Россия,Центральный ФО,Тамбовская обл.,Мичуринск +2196 297 24 Россия,Центральный ФО,Тамбовская обл.,Моршанск +1750 297 24 Россия,Центральный ФО,Тамбовская обл.,Рассказово +3271 297 24 Россия,Центральный ФО,Тамбовская обл.,Сатинка +1749 297 24 Россия,Центральный ФО,Тамбовская обл.,Тамбов +3272 297 24 Россия,Центральный ФО,Тамбовская обл.,Тулиновка +2197 297 24 Россия,Центральный ФО,Тамбовская обл.,Уварово +2270 297 24 Россия,Центральный ФО,Тамбовская обл.,Другое +298 298 24 Россия,Центральный ФО,Тверская обл. +2103 298 24 Россия,Центральный ФО,Тверская обл.,Андреаполь +2104 298 24 Россия,Центральный ФО,Тверская обл.,Бежецк +2105 298 24 Россия,Центральный ФО,Тверская обл.,Белый +2106 298 24 Россия,Центральный ФО,Тверская обл.,Бологое +2107 298 24 Россия,Центральный ФО,Тверская обл.,Весьегонск +1753 298 24 Россия,Центральный ФО,Тверская обл.,Вышний Волочек +2108 298 24 Россия,Центральный ФО,Тверская обл.,Западная Двина +2109 298 24 Россия,Центральный ФО,Тверская обл.,Зубцов +2110 298 24 Россия,Центральный ФО,Тверская обл.,Калязин +2111 298 24 Россия,Центральный ФО,Тверская обл.,Кашин +1758 298 24 Россия,Центральный ФО,Тверская обл.,Кимры +1756 298 24 Россия,Центральный ФО,Тверская обл.,Конаково +2112 298 24 Россия,Центральный ФО,Тверская обл.,Красный Холм +1759 298 24 Россия,Центральный ФО,Тверская обл.,Кувшиново +1760 298 24 Россия,Центральный ФО,Тверская обл.,Лихославль +1761 298 24 Россия,Центральный ФО,Тверская обл.,Нелидово +2113 298 24 Россия,Центральный ФО,Тверская обл.,Осташков +1757 298 24 Россия,Центральный ФО,Тверская обл.,Ржев +2114 298 24 Россия,Центральный ФО,Тверская обл.,Старица +1754 298 24 Россия,Центральный ФО,Тверская обл.,Тверь +2115 298 24 Россия,Центральный ФО,Тверская обл.,Торжок +2116 298 24 Россия,Центральный ФО,Тверская обл.,Торопец +1755 298 24 Россия,Центральный ФО,Тверская обл.,Удомля +2272 298 24 Россия,Центральный ФО,Тверская обл.,Другое +299 299 24 Россия,Центральный ФО,Тульская обл. +2127 299 24 Россия,Центральный ФО,Тульская обл.,Алексин +2126 299 24 Россия,Центральный ФО,Тульская обл.,Белев +2118 299 24 Россия,Центральный ФО,Тульская обл.,Богородицк +2122 299 24 Россия,Центральный ФО,Тульская обл.,Болохово +2129 299 24 Россия,Центральный ФО,Тульская обл.,Венев +1762 299 24 Россия,Центральный ФО,Тульская обл.,Донской +2128 299 24 Россия,Центральный ФО,Тульская обл.,Ефремов +3354 299 24 Россия,Центральный ФО,Тульская обл.,Заокский +2124 299 24 Россия,Центральный ФО,Тульская обл.,Киреевск +1763 299 24 Россия,Центральный ФО,Тульская обл.,Климовск +2123 299 24 Россия,Центральный ФО,Тульская обл.,Липки +1764 299 24 Россия,Центральный ФО,Тульская обл.,Новомосковск +2117 299 24 Россия,Центральный ФО,Тульская обл.,Плавск +2130 299 24 Россия,Центральный ФО,Тульская обл.,Северо-Задонск +2120 299 24 Россия,Центральный ФО,Тульская обл.,Советск +2119 299 24 Россия,Центральный ФО,Тульская обл.,Сокольники +2125 299 24 Россия,Центральный ФО,Тульская обл.,Суворов +1765 299 24 Россия,Центральный ФО,Тульская обл.,Тула +1766 299 24 Россия,Центральный ФО,Тульская обл.,Узловая +2121 299 24 Россия,Центральный ФО,Тульская обл.,Щекино +1767 299 24 Россия,Центральный ФО,Тульская обл.,Ясногорск +2274 299 24 Россия,Центральный ФО,Тульская обл.,Другое +300 300 24 Россия,Центральный ФО,Ярославская обл. +3053 300 24 Россия,Центральный ФО,Ярославская обл.,Большое Село +3268 300 24 Россия,Центральный ФО,Ярославская обл.,Брейтово +1773 300 24 Россия,Центральный ФО,Ярославская обл.,Гаврилов-Ям +2132 300 24 Россия,Центральный ФО,Ярославская обл.,Данилов +3269 300 24 Россия,Центральный ФО,Ярославская обл.,Красные Ткачи +2133 300 24 Россия,Центральный ФО,Ярославская обл.,Любим +3270 300 24 Россия,Центральный ФО,Ярославская обл.,Мокеевское +1774 300 24 Россия,Центральный ФО,Ярославская обл.,Мышкин +2994 300 24 Россия,Центральный ФО,Ярославская обл.,Некоуз +1775 300 24 Россия,Центральный ФО,Ярославская обл.,Переславль-Залесский +2134 300 24 Россия,Центральный ФО,Ярославская обл.,Пошехонье +1769 300 24 Россия,Центральный ФО,Ярославская обл.,Ростов +1771 300 24 Россия,Центральный ФО,Ярославская обл.,Рыбинск +1772 300 24 Россия,Центральный ФО,Ярославская обл.,Тутаев +1770 300 24 Россия,Центральный ФО,Ярославская обл.,Углич +1768 300 24 Россия,Центральный ФО,Ярославская обл.,Ярославль +2290 300 24 Россия,Центральный ФО,Ярославская обл.,Другое +3182 300 24 Россия,Южный ФО +301 301 24 Россия,Южный ФО,Адыгея +2849 301 24 Россия,Южный ФО,Адыгея,Адыгейск +1776 301 24 Россия,Южный ФО,Адыгея,Майкоп +2214 301 24 Россия,Южный ФО,Адыгея,Другое +304 304 24 Россия,Южный ФО,Дагестан +2617 304 24 Россия,Южный ФО,Дагестан,Буйнакск +1791 304 24 Россия,Южный ФО,Дагестан,Гуниб +1788 304 24 Россия,Южный ФО,Дагестан,Дербент +2619 304 24 Россия,Южный ФО,Дагестан,Избербаш +1789 304 24 Россия,Южный ФО,Дагестан,Каспийск +2618 304 24 Россия,Южный ФО,Дагестан,Кизилюрт +1790 304 24 Россия,Южный ФО,Дагестан,Кизляр +1792 304 24 Россия,Южный ФО,Дагестан,Махачкала +2620 304 24 Россия,Южный ФО,Дагестан,Хасавюрт +2225 304 24 Россия,Южный ФО,Дагестан,Другое +305 305 24 Россия,Южный ФО,Ингушетия +3052 305 24 Россия,Южный ФО,Ингушетия,Магас +1787 305 24 Россия,Южный ФО,Ингушетия,Назрань +2228 305 24 Россия,Южный ФО,Ингушетия,Другое +306 306 24 Россия,Южный ФО,Кабардино-Балкария +2621 306 24 Россия,Южный ФО,Кабардино-Балкария,Баксан +1794 306 24 Россия,Южный ФО,Кабардино-Балкария,Майский +1793 306 24 Россия,Южный ФО,Кабардино-Балкария,Нальчик +2622 306 24 Россия,Южный ФО,Кабардино-Балкария,Нарткала +1795 306 24 Россия,Южный ФО,Кабардино-Балкария,Прохладный +2623 306 24 Россия,Южный ФО,Кабардино-Балкария,Терек +2624 306 24 Россия,Южный ФО,Кабардино-Балкария,Тырныауз +3274 306 24 Россия,Южный ФО,Кабардино-Балкария,Чегем +2230 306 24 Россия,Южный ФО,Кабардино-Балкария,Другое +307 307 24 Россия,Южный ФО,Калмыкия +2567 307 24 Россия,Южный ФО,Калмыкия,Городовиково +2568 307 24 Россия,Южный ФО,Калмыкия,Лагань +3324 307 24 Россия,Южный ФО,Калмыкия,Троицкое +1796 307 24 Россия,Южный ФО,Калмыкия,Элиста +2232 307 24 Россия,Южный ФО,Калмыкия,Другое +308 308 24 Россия,Южный ФО,Карачаево-Черкессия +1799 308 24 Россия,Южный ФО,Карачаево-Черкессия,Домбай +1798 308 24 Россия,Южный ФО,Карачаево-Черкессия,Карачаевск +2626 308 24 Россия,Южный ФО,Карачаево-Черкессия,Теберда +2625 308 24 Россия,Южный ФО,Карачаево-Черкессия,Усть-Джегута +1797 308 24 Россия,Южный ФО,Карачаево-Черкессия,Черкесск +2235 308 24 Россия,Южный ФО,Карачаево-Черкессия,Другое +311 311 24 Россия,Южный ФО,Северная Осетия - Алания +2630 311 24 Россия,Южный ФО,Северная Осетия - Алания,Алагир +2631 311 24 Россия,Южный ФО,Северная Осетия - Алания,Ардон +2628 311 24 Россия,Южный ФО,Северная Осетия - Алания,Беслан +1839 311 24 Россия,Южный ФО,Северная Осетия - Алания,Владикавказ +2629 311 24 Россия,Южный ФО,Северная Осетия - Алания,Дигора +2627 311 24 Россия,Южный ФО,Северная Осетия - Алания,Моздок +2266 311 24 Россия,Южный ФО,Северная Осетия - Алания,Другое +313 313 24 Россия,Южный ФО,Чечня +2632 313 24 Россия,Южный ФО,Чечня,Аргун +1853 313 24 Россия,Южный ФО,Чечня,Грозный +2633 313 24 Россия,Южный ФО,Чечня,Гудермес +2284 313 24 Россия,Южный ФО,Чечня,Другое +309 309 24 Россия,Южный ФО,Краснодарский край +2636 309 24 Россия,Южный ФО,Краснодарский край,Абинск +1800 309 24 Россия,Южный ФО,Краснодарский край,Анапа +1801 309 24 Россия,Южный ФО,Краснодарский край,Апшеронск +1802 309 24 Россия,Южный ФО,Краснодарский край,Армавир +1803 309 24 Россия,Южный ФО,Краснодарский край,Белореченск +1804 309 24 Россия,Южный ФО,Краснодарский край,Геленджик +1805 309 24 Россия,Южный ФО,Краснодарский край,Горячий Ключ +2637 309 24 Россия,Южный ФО,Краснодарский край,Гулькевичи +1806 309 24 Россия,Южный ФО,Краснодарский край,Динская +1807 309 24 Россия,Южный ФО,Краснодарский край,Ейск +2638 309 24 Россия,Южный ФО,Краснодарский край,Кореновск +1808 309 24 Россия,Южный ФО,Краснодарский край,Краснодар +1809 309 24 Россия,Южный ФО,Краснодарский край,Кропоткин +1810 309 24 Россия,Южный ФО,Краснодарский край,Крымск +1811 309 24 Россия,Южный ФО,Краснодарский край,Курганинск +3232 309 24 Россия,Южный ФО,Краснодарский край,Лабинск +2639 309 24 Россия,Южный ФО,Краснодарский край,Новокубанск +1812 309 24 Россия,Южный ФО,Краснодарский край,Новороссийск +1813 309 24 Россия,Южный ФО,Краснодарский край,Пластуновская +1814 309 24 Россия,Южный ФО,Краснодарский край,Приморско-Ахтарск +3102 309 24 Россия,Южный ФО,Краснодарский край,Северская +1815 309 24 Россия,Южный ФО,Краснодарский край,Славянск-на-Кубани +1816 309 24 Россия,Южный ФО,Краснодарский край,Сочи +3266 309 24 Россия,Южный ФО,Краснодарский край,Староминская +3039 309 24 Россия,Южный ФО,Краснодарский край,Тамань +1817 309 24 Россия,Южный ФО,Краснодарский край,Темрюк +2635 309 24 Россия,Южный ФО,Краснодарский край,Тимашевск +1818 309 24 Россия,Южный ФО,Краснодарский край,Тихорецк +1819 309 24 Россия,Южный ФО,Краснодарский край,Туапсе +1820 309 24 Россия,Южный ФО,Краснодарский край,Усть-Лабинск +2634 309 24 Россия,Южный ФО,Краснодарский край,Хадыженск +2241 309 24 Россия,Южный ФО,Краснодарский край,Другое +312 312 24 Россия,Южный ФО,Ставропольский край +1840 312 24 Россия,Южный ФО,Ставропольский край,Александровское +2644 312 24 Россия,Южный ФО,Ставропольский край,Благодарный +1841 312 24 Россия,Южный ФО,Ставропольский край,Буденновск +1842 312 24 Россия,Южный ФО,Ставропольский край,Георгиевск +1843 312 24 Россия,Южный ФО,Ставропольский край,Ессентуки +1844 312 24 Россия,Южный ФО,Ставропольский край,Железноводск +2647 312 24 Россия,Южный ФО,Ставропольский край,Зеленокумск +2641 312 24 Россия,Южный ФО,Ставропольский край,Изобильный +2642 312 24 Россия,Южный ФО,Ставропольский край,Ипатово +1845 312 24 Россия,Южный ФО,Ставропольский край,Кисловодск +1846 312 24 Россия,Южный ФО,Ставропольский край,Кочубеевское +3367 312 24 Россия,Южный ФО,Ставропольский край,Курсавка +3265 312 24 Россия,Южный ФО,Ставропольский край,Левокумское +1847 312 24 Россия,Южный ФО,Ставропольский край,Лермонтов +1848 312 24 Россия,Южный ФО,Ставропольский край,Минеральные Воды +1849 312 24 Россия,Южный ФО,Ставропольский край,Невинномысск +2645 312 24 Россия,Южный ФО,Ставропольский край,Нефтекумск +2643 312 24 Россия,Южный ФО,Ставропольский край,Новоалександровск +1850 312 24 Россия,Южный ФО,Ставропольский край,Новопавловск +1851 312 24 Россия,Южный ФО,Ставропольский край,Новоселицкое +1852 312 24 Россия,Южный ФО,Ставропольский край,Пятигорск +2646 312 24 Россия,Южный ФО,Ставропольский край,Светлоград +2640 312 24 Россия,Южный ФО,Ставропольский край,Ставрополь +2268 312 24 Россия,Южный ФО,Ставропольский край,Другое +302 302 24 Россия,Южный ФО,Астраханская обл. +1777 302 24 Россия,Южный ФО,Астраханская обл.,Астрахань +1778 302 24 Россия,Южный ФО,Астраханская обл.,Ахтубинск +3383 302 24 Россия,Южный ФО,Астраханская обл.,Знаменск +2578 302 24 Россия,Южный ФО,Астраханская обл.,Камызяк +2579 302 24 Россия,Южный ФО,Астраханская обл.,Нариманов +1786 302 24 Россия,Южный ФО,Астраханская обл.,Харабали +2219 302 24 Россия,Южный ФО,Астраханская обл.,Другое +303 303 24 Россия,Южный ФО,Волгоградская обл. +1779 303 24 Россия,Южный ФО,Волгоградская обл.,Волгоград +1780 303 24 Россия,Южный ФО,Волгоградская обл.,Волжский +2584 303 24 Россия,Южный ФО,Волгоградская обл.,Дубовка +1781 303 24 Россия,Южный ФО,Волгоградская обл.,Жирновск +1782 303 24 Россия,Южный ФО,Волгоградская обл.,Калач-на-Дону +1783 303 24 Россия,Южный ФО,Волгоградская обл.,Камышин +2588 303 24 Россия,Южный ФО,Волгоградская обл.,Котельниково +2591 303 24 Россия,Южный ФО,Волгоградская обл.,Котово +2587 303 24 Россия,Южный ФО,Волгоградская обл.,Краснослободск +2582 303 24 Россия,Южный ФО,Волгоградская обл.,Ленинск +2590 303 24 Россия,Южный ФО,Волгоградская обл.,Михайловка +1784 303 24 Россия,Южный ФО,Волгоградская обл.,Николаевск +2581 303 24 Россия,Южный ФО,Волгоградская обл.,Новоаннинский +2583 303 24 Россия,Южный ФО,Волгоградская обл.,Палласовка +2580 303 24 Россия,Южный ФО,Волгоградская обл.,Петров Вал +2589 303 24 Россия,Южный ФО,Волгоградская обл.,Серафимович +2585 303 24 Россия,Южный ФО,Волгоградская обл.,Суровикино +1785 303 24 Россия,Южный ФО,Волгоградская обл.,Урюпинск +2586 303 24 Россия,Южный ФО,Волгоградская обл.,Фролово +2223 303 24 Россия,Южный ФО,Волгоградская обл.,Другое +310 310 24 Россия,Южный ФО,Ростовская обл. +1821 310 24 Россия,Южный ФО,Ростовская обл.,Азов +1822 310 24 Россия,Южный ФО,Ростовская обл.,Аксай +1823 310 24 Россия,Южный ФО,Ростовская обл.,Багаевская +1824 310 24 Россия,Южный ФО,Ростовская обл.,Батайск +1825 310 24 Россия,Южный ФО,Ростовская обл.,Белая Калитва +1826 310 24 Россия,Южный ФО,Ростовская обл.,Волгодонск +1827 310 24 Россия,Южный ФО,Ростовская обл.,Гуково +2651 310 24 Россия,Южный ФО,Ростовская обл.,Донецк +1828 310 24 Россия,Южный ФО,Ростовская обл.,Зерноград +3264 310 24 Россия,Южный ФО,Ростовская обл.,Каменоломни +2652 310 24 Россия,Южный ФО,Ростовская обл.,Каменск-Шахтинский +2649 310 24 Россия,Южный ФО,Ростовская обл.,Константиновск +2648 310 24 Россия,Южный ФО,Ростовская обл.,Красный Сулин +1829 310 24 Россия,Южный ФО,Ростовская обл.,Миллерово +2653 310 24 Россия,Южный ФО,Ростовская обл.,Морозовск +1830 310 24 Россия,Южный ФО,Ростовская обл.,Новочеркасск +1831 310 24 Россия,Южный ФО,Ростовская обл.,Новошахтинск +1832 310 24 Россия,Южный ФО,Ростовская обл.,Пролетарск +1833 310 24 Россия,Южный ФО,Ростовская обл.,Ростов-на-Дону +1834 310 24 Россия,Южный ФО,Ростовская обл.,Сальск +1835 310 24 Россия,Южный ФО,Ростовская обл.,Семикаракорск +1836 310 24 Россия,Южный ФО,Ростовская обл.,Таганрог +1837 310 24 Россия,Южный ФО,Ростовская обл.,Усть-Донецкий +3263 310 24 Россия,Южный ФО,Ростовская обл.,Целина +2650 310 24 Россия,Южный ФО,Ростовская обл.,Цимлянск +1838 310 24 Россия,Южный ФО,Ростовская обл.,Шахты +2259 310 24 Россия,Южный ФО,Ростовская обл.,Другое +28 0 0 Азия +81 0 81 Азия,Азербайджан +1055 1055 81 Азия,Азербайджан,Баку +1058 1058 81 Азия,Азербайджан,Гянджа +1056 1056 81 Азия,Азербайджан,Нахичевань +1057 1057 81 Азия,Азербайджан,Ханкенди +3153 3153 81 Азия,Азербайджан,Шеки +2291 2291 81 Азия,Азербайджан,Другое +82 0 82 Азия,Армения +2932 2932 82 Азия,Армения,Абовян +1060 1060 82 Азия,Армения,Аштарак +3084 3084 82 Азия,Армения,Ванадзор +3011 3011 82 Азия,Армения,Гюмри +3306 3306 82 Азия,Армения,Дилижан +1059 1059 82 Азия,Армения,Ереван +3145 3145 82 Азия,Армения,Ханкенди +2292 2292 82 Азия,Армения,Другое +97 0 97 Азия,Афганистан +1061 1061 97 Азия,Афганистан,Кабул +2293 2293 97 Азия,Афганистан,Другое +96 0 96 Азия,Бангладеш +1062 1062 96 Азия,Бангладеш,Дакка +2294 2294 96 Азия,Бангладеш,Другое +99 0 99 Азия,Бахрейн +1063 1063 99 Азия,Бахрейн,Манама +2295 2295 99 Азия,Бахрейн,Другое +100 0 100 Азия,Бруней-Даруссалам +1064 1064 100 Азия,Бруней-Даруссалам,Бандар-Сери-Бегаван +2296 2296 100 Азия,Бруней-Даруссалам,Другое +101 0 101 Азия,Бутан +1065 1065 101 Азия,Бутан,Тхимпху +2297 2297 101 Азия,Бутан,Другое +102 0 102 Азия,Вьетнам +1066 1066 102 Азия,Вьетнам,Ханой +2298 2298 102 Азия,Вьетнам,Другое +83 0 83 Азия,Грузия +1067 1067 83 Азия,Грузия,Батуми +3158 3158 83 Азия,Грузия,Боржоми +1068 1068 83 Азия,Грузия,Поти +3129 3129 83 Азия,Грузия,Рустави +1069 1069 83 Азия,Грузия,Сухуми +1070 1070 83 Азия,Грузия,Тбилиси +2299 2299 83 Азия,Грузия,Другое +86 0 86 Азия,Израиль +3345 3345 86 Азия,Израиль,Ариэль +1071 1071 86 Азия,Израиль,Афула +2992 2992 86 Азия,Израиль,Ашдод +3175 3175 86 Азия,Израиль,Ашкелон +3363 3363 86 Азия,Израиль,Бат-Ям +2884 2884 86 Азия,Израиль,Беер-Яков +3243 3243 86 Азия,Израиль,Бейт-Шемеш +1074 1074 86 Азия,Израиль,Беэр-Шева +3348 3348 86 Азия,Израиль,Герцелия +3241 3241 86 Азия,Израиль,Димона +1075 1075 86 Азия,Израиль,Иерусалим +3350 3350 86 Азия,Израиль,Йокнеам-Иллит +2982 2982 86 Азия,Израиль,Кармиэль +2971 2971 86 Азия,Израиль,Кфар-Саба +3136 3136 86 Азия,Израиль,Назарет +1080 1080 86 Азия,Израиль,Натания +3303 3303 86 Азия,Израиль,Офаким +3050 3050 86 Азия,Израиль,Раанана +3151 3151 86 Азия,Израиль,Рамат Ган +3141 3141 86 Азия,Израиль,Реховот +3012 3012 86 Азия,Израиль,Ришон ле Цион +1081 1081 86 Азия,Израиль,Тверия +1077 1077 86 Азия,Израиль,Тель-Авив +1079 1079 86 Азия,Израиль,Хадера +1078 1078 86 Азия,Израиль,Хайфа +1076 1076 86 Азия,Израиль,Хеврон +2929 2929 86 Азия,Израиль,Цфат +2928 2928 86 Азия,Израиль,Эйлат +2300 2300 86 Азия,Израиль,Другое +95 0 95 Азия,Индия +3315 3315 95 Азия,Индия,Бангалор +1082 1082 95 Азия,Индия,Дели +1083 1083 95 Азия,Индия,Джайпур +3144 3144 95 Азия,Индия,Калькутта +3025 3025 95 Азия,Индия,Мумбаи +3277 3277 95 Азия,Индия,Панаджи +1084 1084 95 Азия,Индия,Ченнаи +2301 2301 95 Азия,Индия,Другое +103 0 103 Азия,Индонезия +1085 1085 103 Азия,Индонезия,Джакарта +2302 2302 103 Азия,Индонезия,Другое +79 0 79 Азия,Иордания +1086 1086 79 Азия,Иордания,Амман +2303 2303 79 Азия,Иордания,Другое +85 0 85 Азия,Ирак +1087 1087 85 Азия,Ирак,Багдад +2304 2304 85 Азия,Ирак,Другое +87 0 87 Азия,Иран +1088 1088 87 Азия,Иран,Тегеран +2305 2305 87 Азия,Иран,Другое +104 0 104 Азия,Йемен +1089 1089 104 Азия,Йемен,Сана +2306 2306 104 Азия,Йемен,Другое +84 0 84 Азия,Казахстан +1090 1090 84 Азия,Казахстан,Актау +1091 1091 84 Азия,Казахстан,Актюбинск +1092 1092 84 Азия,Казахстан,Алма-Ата +3242 3242 84 Азия,Казахстан,Аршалы +1093 1093 84 Азия,Казахстан,Астана +1094 1094 84 Азия,Казахстан,Атырау (Гурьев) +1095 1095 84 Азия,Казахстан,Байконур +3245 3245 84 Азия,Казахстан,Балхаш +3083 3083 84 Азия,Казахстан,Жезказган +1096 1096 84 Азия,Казахстан,Капчагай +1097 1097 84 Азия,Казахстан,Караганда +1098 1098 84 Азия,Казахстан,Кокшетау +1099 1099 84 Азия,Казахстан,Кустанай +2868 2868 84 Азия,Казахстан,Лисаковск +1100 1100 84 Азия,Казахстан,Павлодар +1101 1101 84 Азия,Казахстан,Петропавловск (Сев.-Каз. обл.) +1102 1102 84 Азия,Казахстан,Рудный +1103 1103 84 Азия,Казахстан,Семипалатинск +1104 1104 84 Азия,Казахстан,Степногорск +3166 3166 84 Азия,Казахстан,Талгар +1105 1105 84 Азия,Казахстан,Талды-Курган +2927 2927 84 Азия,Казахстан,Тараз +1106 1106 84 Азия,Казахстан,Темиртау +1107 1107 84 Азия,Казахстан,Уральск +1108 1108 84 Азия,Казахстан,Усть-Каменогорск +1109 1109 84 Азия,Казахстан,Чимкент +1110 1110 84 Азия,Казахстан,Экибастуз +2307 2307 84 Азия,Казахстан,Другое +105 0 105 Азия,Камбоджа +1111 1111 105 Азия,Камбоджа,Пномпень +2308 2308 105 Азия,Камбоджа,Другое +106 0 106 Азия,Катар +1112 1112 106 Азия,Катар,Доха +2309 2309 106 Азия,Катар,Другое +107 0 107 Азия,Кипр +1113 1113 107 Азия,Кипр,Ларнака +1114 1114 107 Азия,Кипр,Лимассол +1115 1115 107 Азия,Кипр,Никосия +2954 2954 107 Азия,Кипр,Пафос +2310 2310 107 Азия,Кипр,Другое +92 0 92 Азия,Киргизия (Кыргызстан) +1116 1116 92 Азия,Киргизия (Кыргызстан),Бишкек +1117 1117 92 Азия,Киргизия (Кыргызстан),Джалал-Абад +3027 3027 92 Азия,Киргизия (Кыргызстан),Кара-Балта +1118 1118 92 Азия,Киргизия (Кыргызстан),Каракол +1119 1119 92 Азия,Киргизия (Кыргызстан),Ош +1120 1120 92 Азия,Киргизия (Кыргызстан),Талас +2933 2933 92 Азия,Киргизия (Кыргызстан),Хайдаркен +2311 2311 92 Азия,Киргизия (Кыргызстан),Другое +76 0 76 Азия,Китай +3214 3214 76 Азия,Китай,Аомынь (Макао) +1121 1121 76 Азия,Китай,Гонконг +2869 2869 76 Азия,Китай,Гуанчжоу +3262 3262 76 Азия,Китай,Далянь +1122 1122 76 Азия,Китай,Пекин +1123 1123 76 Азия,Китай,Харбин +1124 1124 76 Азия,Китай,Шанхай +3043 3043 76 Азия,Китай,Шеньян +2312 2312 76 Азия,Китай,Другое +3215 0 3215 Азия,Кокосовые острова (Австр.) +29 0 29 Азия,Корея (КНДР) +1125 1125 29 Азия,Корея (КНДР),Пхеньян +2313 2313 29 Азия,Корея (КНДР),Другое +108 0 108 Азия,Корея, Республика +1126 1126 108 Азия,Корея, Республика,Сеул +3240 3240 108 Азия,Корея, Республика,Тейджон +2314 2314 108 Азия,Корея, Республика,Другое +88 0 88 Азия,Кувейт +1127 1127 88 Азия,Кувейт,Эль-Кувейт +2315 2315 88 Азия,Кувейт,Другое +109 0 109 Азия,Лаос +1128 1128 109 Азия,Лаос,Вьентьян +2316 2316 109 Азия,Лаос,Другое +110 0 110 Азия,Ливан +1129 1129 110 Азия,Ливан,Бейрут +2317 2317 110 Азия,Ливан,Другое +111 0 111 Азия,Малайзия +1130 1130 111 Азия,Малайзия,Джохор-Бару +1131 1131 111 Азия,Малайзия,Куала-Лумпур +2318 2318 111 Азия,Малайзия,Другое +112 0 112 Азия,Мальдивы +1132 1132 112 Азия,Мальдивы,Мале +2319 2319 112 Азия,Мальдивы,Другое +113 0 113 Азия,Монголия +1133 1133 113 Азия,Монголия,Улан-Батор +1134 1134 113 Азия,Монголия,Эрдэнэт +2320 2320 113 Азия,Монголия,Другое +114 0 114 Азия,Мьянма +1135 1135 114 Азия,Мьянма,Янгон +2321 2321 114 Азия,Мьянма,Другое +115 0 115 Азия,Непал +1136 1136 115 Азия,Непал,Катманду +2322 2322 115 Азия,Непал,Другое +116 0 116 Азия,Объединенные Арабские Эмираты +1137 1137 116 Азия,Объединенные Арабские Эмираты,Абу-Даби +1138 1138 116 Азия,Объединенные Арабские Эмираты,Дубай +1139 1139 116 Азия,Объединенные Арабские Эмираты,Шарджа +2323 2323 116 Азия,Объединенные Арабские Эмираты,Другое +117 0 117 Азия,Оман +1140 1140 117 Азия,Оман,Маскат +2324 2324 117 Азия,Оман,Другое +3216 0 3216 Азия,Остров Рождества (Австр.) +122 0 122 Азия,Пакистан +1141 1141 122 Азия,Пакистан,Исламабад +2325 2325 122 Азия,Пакистан,Другое +89 0 89 Азия,Палестина +1072 1072 89 Азия,Палестина,Ашдод +1073 1073 89 Азия,Палестина,Ашкелон +1142 1142 89 Азия,Палестина,Газа +2326 2326 89 Азия,Палестина,Другое +94 0 94 Азия,Саудовская Аравия +3250 3250 94 Азия,Саудовская Аравия,Медина +1143 1143 94 Азия,Саудовская Аравия,Эр-Рияд +2327 2327 94 Азия,Саудовская Аравия,Другое +118 0 118 Азия,Сингапур +78 0 78 Азия,Сирия +1144 1144 78 Азия,Сирия,Дамаск +2328 2328 78 Азия,Сирия,Другое +91 0 91 Азия,Таджикистан +1145 1145 91 Азия,Таджикистан,Душанбе +3307 3307 91 Азия,Таджикистан,Кайраккум +3308 3308 91 Азия,Таджикистан,Худжанд +2329 2329 91 Азия,Таджикистан,Другое +119 0 119 Азия,Таиланд +1146 1146 119 Азия,Таиланд,Бангкок +1147 1147 119 Азия,Таиланд,Пхукет +2330 2330 119 Азия,Таиланд,Другое +120 0 120 Азия,Тайвань +1148 1148 120 Азия,Тайвань,Тайбэй +2331 2331 120 Азия,Тайвань,Другое +132 0 132 Азия,Тимор +1149 1149 132 Азия,Тимор,Дили +2332 2332 132 Азия,Тимор,Другое +90 0 90 Азия,Туркмения +1150 1150 90 Азия,Туркмения,Ашхабад +3079 3079 90 Азия,Туркмения,Безмеин +2333 2333 90 Азия,Туркмения,Другое +77 0 77 Азия,Турция +1152 1152 77 Азия,Турция,Анкара +1153 1153 77 Азия,Турция,Анталия +3080 3080 77 Азия,Турция,Бурса +1151 1151 77 Азия,Турция,Мармарис +1154 1154 77 Азия,Турция,Стамбул +1155 1155 77 Азия,Турция,Трабзон +2334 2334 77 Азия,Турция,Другое +93 0 93 Азия,Узбекистан +3362 3362 93 Азия,Узбекистан,Алмалык +3137 3137 93 Азия,Узбекистан,Андижан +3273 3273 93 Азия,Узбекистан,Асака +1156 1156 93 Азия,Узбекистан,Ахангаран +1157 1157 93 Азия,Узбекистан,Бухара +3167 3167 93 Азия,Узбекистан,Джизак +3347 3347 93 Азия,Узбекистан,Кунград +1158 1158 93 Азия,Узбекистан,Навои +1159 1159 93 Азия,Узбекистан,Наманган +1160 1160 93 Азия,Узбекистан,Самарканд +1161 1161 93 Азия,Узбекистан,Ташкент +1162 1162 93 Азия,Узбекистан,Ургенч +1163 1163 93 Азия,Узбекистан,Фергана +1164 1164 93 Азия,Узбекистан,Чирчик +2335 2335 93 Азия,Узбекистан,Другое +121 0 121 Азия,Филиппины +1165 1165 121 Азия,Филиппины,Манила +3319 3319 121 Азия,Филиппины,Себу +2336 2336 121 Азия,Филиппины,Другое +98 0 98 Азия,Шри Ланка +1166 1166 98 Азия,Шри Ланка,Коломбо +2337 2337 98 Азия,Шри Ланка,Другое +75 0 75 Азия,Япония +3176 3176 75 Азия,Япония,Исесаки +3339 3339 75 Азия,Япония,Корияма +1167 1167 75 Азия,Япония,Саппоро +1168 1168 75 Азия,Япония,Токио +2338 2338 75 Азия,Япония,Другое +31 0 0 Австралия и Океания +123 0 123 Австралия и Океания,Австралия +1914 1914 123 Австралия и Океания,Австралия,Аделаида +2957 2957 123 Австралия и Океания,Австралия,Блэк Рок +1915 1915 123 Австралия и Океания,Австралия,Брисбен +3331 3331 123 Австралия и Океания,Австралия,Горокан +1916 1916 123 Австралия и Океания,Австралия,Канберра +3001 3001 123 Австралия и Океания,Австралия,Лидкомб +1917 1917 123 Австралия и Океания,Австралия,Мельбурн +3217 3217 123 Австралия и Океания,Австралия,Норфолк +3064 3064 123 Австралия и Океания,Австралия,Перт +3020 3020 123 Австралия и Океания,Австралия,Санта Люсиа +1918 1918 123 Австралия и Океания,Австралия,Сидней +3238 3238 123 Австралия и Океания,Австралия,Энеабба +2339 2339 123 Австралия и Океания,Австралия,Другое +454 0 454 Австралия и Океания,Американское Самоа +1192 1192 454 Австралия и Океания,Американское Самоа,Паго-Паго +2366 2366 454 Австралия и Океания,Американское Самоа,Другое +124 0 124 Австралия и Океания,Вануату +1919 1919 124 Австралия и Океания,Вануату,Порт-Вила +2340 2340 124 Австралия и Океания,Вануату,Другое +453 0 453 Австралия и Океания,Гуам (США) +1193 1193 453 Австралия и Океания,Гуам (США),Аганья +2368 2368 453 Австралия и Океания,Гуам (США),Другое +126 0 126 Австралия и Океания,Кирибати +1921 1921 126 Австралия и Океания,Кирибати,Баирики +2342 2342 126 Австралия и Океания,Кирибати,Другое +127 0 127 Австралия и Океания,Маршалловы Острова +1922 1922 127 Австралия и Океания,Маршалловы Острова,Маджуро +2343 2343 127 Австралия и Океания,Маршалловы Острова,Другое +128 0 128 Австралия и Океания,Микронезия (Федеративные Штаты Микронезии) +1923 1923 128 Австралия и Океания,Микронезия (Федеративные Штаты Микронезии),Паликир +2344 2344 128 Австралия и Океания,Микронезия (Федеративные Штаты Микронезии),Другое +129 0 129 Австралия и Океания,Науру +1924 1924 129 Австралия и Океания,Науру,Ярен +2345 2345 129 Австралия и Океания,Науру,Другое +3220 0 3220 Австралия и Океания,Ниуэ (Н.Зел.) +130 0 130 Австралия и Океания,Новая Зеландия +1925 1925 130 Австралия и Океания,Новая Зеландия,Веллингтон +1926 1926 130 Австралия и Океания,Новая Зеландия,Гамильтон +1928 1928 130 Австралия и Океания,Новая Зеландия,Данидин +1929 1929 130 Австралия и Океания,Новая Зеландия,Крайстчерч +3235 3235 130 Австралия и Океания,Новая Зеландия,Кромвель +1927 1927 130 Австралия и Океания,Новая Зеландия,Окленд +3323 3323 130 Австралия и Океания,Новая Зеландия,Тауранга +2346 2346 130 Австралия и Океания,Новая Зеландия,Другое +3218 0 3218 Австралия и Океания,Новая Каледония (Фр.) +3221 0 3221 Австралия и Океания,Острова Кука (Н.Зел.) +3230 0 3230 Австралия и Океания,Острова Херд и Макдональд (Австр.) +131 0 131 Австралия и Океания,Палау +1930 1930 131 Австралия и Океания,Палау,Корор +2347 2347 131 Австралия и Океания,Палау,Другое +133 0 133 Австралия и Океания,Папуа - Новая Гвинея +1931 1931 133 Австралия и Океания,Папуа - Новая Гвинея,Порт-Морсби +2348 2348 133 Австралия и Океания,Папуа - Новая Гвинея,Другое +3222 0 3222 Австралия и Океания,Питкерн (Брит.) +125 0 125 Австралия и Океания,Самоа +1920 1920 125 Австралия и Океания,Самоа,Апиа +2341 2341 125 Австралия и Океания,Самоа,Другое +3219 0 3219 Австралия и Океания,Сев. Марианские острова (США) +134 0 134 Австралия и Океания,Соломоновы Острова +1932 1932 134 Австралия и Океания,Соломоновы Острова,Хониара +2349 2349 134 Австралия и Океания,Соломоновы Острова,Другое +3223 0 3223 Австралия и Океания,Токелау (Н.Зел.) +135 0 135 Австралия и Океания,Тонга +1933 1933 135 Австралия и Океания,Тонга,Нукуалофа +2350 2350 135 Австралия и Океания,Тонга,Другое +136 0 136 Австралия и Океания,Тувалу +1934 1934 136 Австралия и Океания,Тувалу,Фунафути +2351 2351 136 Австралия и Океания,Тувалу,Другое +3224 0 3224 Австралия и Океания,Уоллис и Футуна острова (Фр.) +137 0 137 Австралия и Океания,Фиджи +1935 1935 137 Австралия и Океания,Фиджи,Сува +2352 2352 137 Австралия и Океания,Фиджи,Другое +3226 0 3226 Австралия и Океания,Французская Полинезия +3225 0 3225 Австралия и Океания,Французские Южные территории +30 0 0 Америка +138 0 138 Америка,Канада +3055 3055 138 Америка,Канада,Барлингтон +3049 3049 138 Америка,Канада,Броссард +3330 3330 138 Америка,Канада,Бурнаби +1169 1169 138 Америка,Канада,Ванкувер +3106 3106 138 Америка,Канада,Ватерлоо +1170 1170 138 Америка,Канада,Виннипег +1171 1171 138 Америка,Канада,Галифакс +1172 1172 138 Америка,Канада,Гамильтон +3365 3365 138 Америка,Канада,Денвер +1173 1173 138 Америка,Канада,Калгари +3104 3104 138 Америка,Канада,Камлупс +3366 3366 138 Америка,Канада,Каннингтон +1174 1174 138 Америка,Канада,Квебек +2964 2964 138 Америка,Канада,Кингстон +3113 3113 138 Америка,Канада,Коквитлам +1175 1175 138 Америка,Канада,Монреаль +2920 2920 138 Америка,Канада,Ниагара-Фолс +2889 2889 138 Америка,Канада,Норд-Йорк +1176 1176 138 Америка,Канада,Оттава +2903 2903 138 Америка,Канада,Порт Алберни +1177 1177 138 Америка,Канада,Ричмонд +1178 1178 138 Америка,Канада,Тимминс +2946 2946 138 Америка,Канада,Торнхилл +1179 1179 138 Америка,Канада,Торонто +1180 1180 138 Америка,Канада,Эдмонтон +2353 2353 138 Америка,Канада,Другое +139 0 139 Америка,США +407 407 139 Америка,США,Вашингтон, столица +426 426 139 Америка,США,Айдахо +427 426 139 Америка,США,Айдахо,Бойсе +2354 426 139 Америка,США,Айдахо,Другое +378 378 139 Америка,США,Айова +3109 378 139 Америка,США,Айова,Айова Сити +379 378 139 Америка,США,Айова,Де-Мойн +2963 378 139 Америка,США,Айова,Декора +2355 378 139 Америка,США,Айова,Другое +412 412 139 Америка,США,Алабама +3236 412 139 Америка,США,Алабама,Бирмингем +413 412 139 Америка,США,Алабама,Монтгомери +1181 412 139 Америка,США,Алабама,Хантсвилл +2356 412 139 Америка,США,Алабама,Другое +446 446 139 Америка,США,Аляска +1182 446 139 Америка,США,Аляска,Анкоридж +447 446 139 Америка,США,Аляска,Джуно +1183 446 139 Америка,США,Аляска,Фэрбенкс +2357 446 139 Америка,США,Аляска,Другое +434 434 139 Америка,США,Аризона +2917 434 139 Америка,США,Аризона,Темпе +1184 434 139 Америка,США,Аризона,Тусон +435 434 139 Америка,США,Аризона,Финикс +3061 434 139 Америка,США,Аризона,Чандлер +2358 434 139 Америка,США,Аризона,Другое +416 416 139 Америка,США,Арканзас +417 416 139 Америка,США,Арканзас,Литл-Рок +2359 416 139 Америка,США,Арканзас,Другое +428 428 139 Америка,США,Вайоминг +3017 428 139 Америка,США,Вайоминг,Ларами +429 428 139 Америка,США,Вайоминг,Шайенн +2360 428 139 Америка,США,Вайоминг,Другое +440 440 139 Америка,США,Вашингтон +2956 440 139 Америка,США,Вашингтон,Беллевью +2967 440 139 Америка,США,Вашингтон,Бремертон +3385 440 139 Америка,США,Вашингтон,Ванкувер +2865 440 139 Америка,США,Вашингтон,Линден +441 440 139 Америка,США,Вашингтон,Олимпия +3352 440 139 Америка,США,Вашингтон,Порт Орчард +2876 440 139 Америка,США,Вашингтон,Редмонт +3003 440 139 Америка,США,Вашингтон,Рентон +1185 440 139 Америка,США,Вашингтон,Сиэтл +2983 440 139 Америка,США,Вашингтон,Снохомиш +1186 440 139 Америка,США,Вашингтон,Такома +3152 440 139 Америка,США,Вашингтон,Фрайди Харбор +2886 440 139 Америка,США,Вашингтон,Эверет +2361 440 139 Америка,США,Вашингтон,Другое +352 352 139 Америка,США,Вермонт +353 352 139 Америка,США,Вермонт,Монтпильер +2861 352 139 Америка,США,Вермонт,Норвич +2362 352 139 Америка,США,Вермонт,Другое +394 394 139 Америка,США,Виргиния +1188 394 139 Америка,США,Виргиния,Александрия +1187 394 139 Америка,США,Виргиния,Арлингтон +2969 394 139 Америка,США,Виргиния,Даллес +1189 394 139 Америка,США,Виргиния,Манассас +3114 394 139 Америка,США,Виргиния,Норфолк +2885 394 139 Америка,США,Виргиния,Ньюпорт-Ньюс +2979 394 139 Америка,США,Виргиния,Раунд Хил +3338 394 139 Америка,США,Виргиния,Рестон +395 394 139 Америка,США,Виргиния,Ричмонд +3005 394 139 Америка,США,Виргиния,Уоррентон +2991 394 139 Америка,США,Виргиния,Херндон +2996 394 139 Америка,США,Виргиния,Центрвиль +3097 394 139 Америка,США,Виргиния,Чантилли +2981 394 139 Америка,США,Виргиния,Шарлотесвиль +2363 394 139 Америка,США,Виргиния,Другое +374 374 139 Америка,США,Висконсин +2995 374 139 Америка,США,Висконсин,Грин-Бей +375 374 139 Америка,США,Висконсин,Мадисон +2365 374 139 Америка,США,Висконсин,Другое +448 448 139 Америка,США,Гавайи +449 448 139 Америка,США,Гавайи,Гонолулу +1191 448 139 Америка,США,Гавайи,Хило +2367 448 139 Америка,США,Гавайи,Другое +390 390 139 Америка,США,Делавер +3021 390 139 Америка,США,Делавер,Вильмингтон +391 390 139 Америка,США,Делавер,Довер +2973 390 139 Америка,США,Делавер,Льюис +2369 390 139 Америка,США,Делавер,Другое +402 402 139 Америка,США,Джорджия +403 402 139 Америка,США,Джорджия,Атланта +2370 402 139 Америка,США,Джорджия,Другое +396 396 139 Америка,США,Западная Виргиния +397 396 139 Америка,США,Западная Виргиния,Чарлстон +2371 396 139 Америка,США,Западная Виргиния,Другое +370 370 139 Америка,США,Иллинойс +2911 370 139 Америка,США,Иллинойс,Вестмонт +3074 370 139 Америка,США,Иллинойс,Гарвард +371 370 139 Америка,США,Иллинойс,Спрингфилд +2930 370 139 Америка,США,Иллинойс,Урбана +1194 370 139 Америка,США,Иллинойс,Чикаго +2372 370 139 Америка,США,Иллинойс,Другое +368 368 139 Америка,США,Индиана +369 368 139 Америка,США,Индиана,Индианаполис +1195 368 139 Америка,США,Индиана,Эвансвил +2373 368 139 Америка,США,Индиана,Другое +444 444 139 Америка,США,Калифорния +2959 444 139 Америка,США,Калифорния,Анахайм +2961 444 139 Америка,США,Калифорния,Аптос +2912 444 139 Америка,США,Калифорния,Артезия +2899 444 139 Америка,США,Калифорния,Беверли Хилз +1196 444 139 Америка,США,Калифорния,Беркли +3249 444 139 Америка,США,Калифорния,Бреа +3014 444 139 Америка,США,Калифорния,Брисбейн +3048 444 139 Америка,США,Калифорния,Венис +2901 444 139 Америка,США,Калифорния,Вест-Голливуд +2926 444 139 Америка,США,Калифорния,Вестлейк Вилладж +2922 444 139 Америка,США,Калифорния,Гардена +1203 444 139 Америка,США,Калифорния,Глендейл +2978 444 139 Америка,США,Калифорния,Денвиль +2990 444 139 Америка,США,Калифорния,Дублин +3077 444 139 Америка,США,Калифорния,Дэвис +2918 444 139 Америка,США,Калифорния,Ирвайн +2881 444 139 Америка,США,Калифорния,Карсон +3247 444 139 Америка,США,Калифорния,Кипресс +3092 444 139 Америка,США,Калифорния,Коста Меса +2948 444 139 Америка,США,Калифорния,Купертино +1197 444 139 Америка,США,Калифорния,Лонг-Бич +1198 444 139 Америка,США,Калифорния,Лос-Анджелес +3058 444 139 Америка,США,Калифорния,Лос-Гатос +3328 444 139 Америка,США,Калифорния,Марина-дель-Рей +2874 444 139 Америка,США,Калифорния,Маунтин-Вью +2998 444 139 Америка,США,Калифорния,Милпитас +3087 444 139 Америка,США,Калифорния,Монтерей +2947 444 139 Америка,США,Калифорния,Окленд +2900 444 139 Америка,США,Калифорния,Пало Альто +1199 444 139 Америка,США,Калифорния,Пасадена +3335 444 139 Америка,США,Калифорния,Редвуд +2966 444 139 Америка,США,Калифорния,Розамонд +445 444 139 Америка,США,Калифорния,Сакраменто +1200 444 139 Америка,США,Калифорния,Сан-Диего +3317 444 139 Америка,США,Калифорния,Сан-Мартин +1201 444 139 Америка,США,Калифорния,Сан-Франциско +1202 444 139 Америка,США,Калифорния,Сан-Хосе +2878 444 139 Америка,США,Калифорния,Саннивейл +2925 444 139 Америка,США,Калифорния,Санта-Барбара +2875 444 139 Америка,США,Калифорния,Санта-Клара +1204 444 139 Америка,США,Калифорния,Санта-Круз +2859 444 139 Америка,США,Калифорния,Санта-Моника +3157 444 139 Америка,США,Калифорния,Студио Сити +3146 444 139 Америка,США,Калифорния,Торранс +2970 444 139 Америка,США,Калифорния,Тысяча Дубов +2949 444 139 Америка,США,Калифорния,Универсал-Сити +3057 444 139 Америка,США,Калифорния,Форт Брэгг +3032 444 139 Америка,США,Калифорния,Фостер-Сити +3381 444 139 Америка,США,Калифорния,Фремонт +3028 444 139 Америка,США,Калифорния,Фуллертон +2858 444 139 Америка,США,Калифорния,Эмервиль +3040 444 139 Америка,США,Калифорния,Эскондидо +2374 444 139 Америка,США,Калифорния,Другое +388 388 139 Америка,США,Канзас +3041 388 139 Америка,США,Канзас,Лоуренс +389 388 139 Америка,США,Канзас,Топика +2375 388 139 Америка,США,Канзас,Другое +408 408 139 Америка,США,Кентукки +3004 408 139 Америка,США,Кентукки,Лексингтон +1205 408 139 Америка,США,Кентукки,Луисвилл +409 408 139 Америка,США,Кентукки,Франкфорт +2376 408 139 Америка,США,Кентукки,Другое +430 430 139 Америка,США,Колорадо +1206 430 139 Америка,США,Колорадо,Боулдер +3095 430 139 Америка,США,Колорадо,Грили +431 430 139 Америка,США,Колорадо,Денвер +1207 430 139 Америка,США,Колорадо,Колорадо-Спрингс +3046 430 139 Америка,США,Колорадо,Литлтон +2377 430 139 Америка,США,Колорадо,Другое +358 358 139 Америка,США,Коннектикут +2968 358 139 Америка,США,Коннектикут,Дариен +3018 358 139 Америка,США,Коннектикут,Денбери +2882 358 139 Америка,США,Коннектикут,Стэмфорд +359 358 139 Америка,США,Коннектикут,Хартфорд +3047 358 139 Америка,США,Коннектикут,Шелтон +2378 358 139 Америка,США,Коннектикут,Другое +418 418 139 Америка,США,Луизиана +419 418 139 Америка,США,Луизиана,Батон-Руж +1208 418 139 Америка,США,Луизиана,Новый Орлеан +2408 418 139 Америка,США,Луизиана,Другое +354 354 139 Америка,США,Массачусетс +2931 354 139 Америка,США,Массачусетс,Аттлеборо +3334 354 139 Америка,США,Массачусетс,Билерика +355 354 139 Америка,США,Массачусетс,Бостон +3059 354 139 Америка,США,Массачусетс,Вестгемптон +2919 354 139 Америка,США,Массачусетс,Вобурн +2902 354 139 Америка,США,Массачусетс,Дедхэм +1209 354 139 Америка,США,Массачусетс,Кеймбридж +3336 354 139 Америка,США,Массачусетс,Нидхем +2985 354 139 Америка,США,Массачусетс,Ньютонвиль +3022 354 139 Америка,США,Массачусетс,Уолтхэм +2407 354 139 Америка,США,Массачусетс,Другое +376 376 139 Америка,США,Миннесота +1210 376 139 Америка,США,Миннесота,Миннеаполис +2980 376 139 Америка,США,Миннесота,Плимут +377 376 139 Америка,США,Миннесота,Сент-Пол +3035 376 139 Америка,США,Миннесота,Эден Прейри +2406 376 139 Америка,США,Миннесота,Другое +414 414 139 Америка,США,Миссисипи +415 414 139 Америка,США,Миссисипи,Джэксон +2405 414 139 Америка,США,Миссисипи,Другое +380 380 139 Америка,США,Миссури +381 380 139 Америка,США,Миссури,Джефферсон-Сити +3062 380 139 Америка,США,Миссури,Канзас Сити +3038 380 139 Америка,США,Миссури,Ли Саммит +1211 380 139 Америка,США,Миссури,Сент-Луис +2895 380 139 Америка,США,Миссури,Эллисвил +2404 380 139 Америка,США,Миссури,Другое +372 372 139 Америка,США,Мичиган +3357 372 139 Америка,США,Мичиган,Вест Блюмфельд +1212 372 139 Америка,США,Мичиган,Гранд-Рапидс +1213 372 139 Америка,США,Мичиган,Детройт +3103 372 139 Америка,США,Мичиган,Каламазу +373 372 139 Америка,США,Мичиган,Лансинг +2987 372 139 Америка,США,Мичиган,Новай +2887 372 139 Америка,США,Мичиган,Сагино +2403 372 139 Америка,США,Мичиган,Другое +424 424 139 Америка,США,Монтана +1214 424 139 Америка,США,Монтана,Грейт-Фолс +425 424 139 Америка,США,Монтана,Хелина +2402 424 139 Америка,США,Монтана,Другое +348 348 139 Америка,США,Мэн +349 348 139 Америка,США,Мэн,Огаста +3000 348 139 Америка,США,Мэн,Ярмут +2401 348 139 Америка,США,Мэн,Другое +392 392 139 Америка,США,Мэриленд +393 392 139 Америка,США,Мэриленд,Аннаполис +1215 392 139 Америка,США,Мэриленд,Балтимор +3143 392 139 Америка,США,Мэриленд,Гринбелт +3337 392 139 Америка,США,Мэриленд,Колледж Парк +2904 392 139 Америка,США,Мэриленд,Маунт Эйри +3329 392 139 Америка,США,Мэриленд,Роквилль +2400 392 139 Америка,США,Мэриленд,Другое +386 386 139 Америка,США,Небраска +387 386 139 Америка,США,Небраска,Линкольн +1216 386 139 Америка,США,Небраска,Омаха +2399 386 139 Америка,США,Небраска,Другое +438 438 139 Америка,США,Невада +439 438 139 Америка,США,Невада,Карсон-Сити +1217 438 139 Америка,США,Невада,Лас-Вегас +2890 438 139 Америка,США,Невада,Рено +2398 438 139 Америка,США,Невада,Другое +362 362 139 Америка,США,Нью-Джерси +1219 362 139 Америка,США,Нью-Джерси,Атлантик-Сити +1218 362 139 Америка,США,Нью-Джерси,Ньюарк +3276 362 139 Америка,США,Нью-Джерси,Оклин +3073 362 139 Америка,США,Нью-Джерси,Принстон +2955 362 139 Америка,США,Нью-Джерси,Рузерфорд +3349 362 139 Америка,США,Нью-Джерси,Сомервиль +363 362 139 Америка,США,Нью-Джерси,Трентон +3078 362 139 Америка,США,Нью-Джерси,Хакеттстоун +3248 362 139 Америка,США,Нью-Джерси,Черри Хилл +2397 362 139 Америка,США,Нью-Джерси,Другое +360 360 139 Америка,США,Нью-Йорк +3134 360 139 Америка,США,Нью-Йорк,Баффало +3081 360 139 Америка,США,Нью-Йорк,Бингхэмптон +2997 360 139 Америка,США,Нью-Йорк,Бруклин +2999 360 139 Америка,США,Нью-Йорк,Варвик +3139 360 139 Америка,США,Нью-Йорк,Ирвингтон +3060 360 139 Америка,США,Нью-Йорк,Итака +1220 360 139 Америка,США,Нью-Йорк,Нью-Йорк +361 360 139 Америка,США,Нью-Йорк,Олбани +2914 360 139 Америка,США,Нью-Йорк,Погкипси +3056 360 139 Америка,США,Нью-Йорк,Саратога Спрингс +2396 360 139 Америка,США,Нью-Йорк,Другое +432 432 139 Америка,США,Нью-Мексико +1222 432 139 Америка,США,Нью-Мексико,Альбукерке +433 432 139 Америка,США,Нью-Мексико,Санта-Фе +2395 432 139 Америка,США,Нью-Мексико,Другое +350 350 139 Америка,США,Нью-Хэмпшир +2989 350 139 Америка,США,Нью-Хэмпшир,Амхерст +351 350 139 Америка,США,Нью-Хэмпшир,Конкорд +2950 350 139 Америка,США,Нью-Хэмпшир,Лондондерри +1221 350 139 Америка,США,Нью-Хэмпшир,Манчестер +3111 350 139 Америка,США,Нью-Хэмпшир,Рочестер +2898 350 139 Америка,США,Нью-Хэмпшир,Салем +2938 350 139 Америка,США,Нью-Хэмпшир,Хадсон +2394 350 139 Америка,США,Нью-Хэмпшир,Другое +366 366 139 Америка,США,Огайо +2953 366 139 Америка,США,Огайо,Варрен +3112 366 139 Америка,США,Огайо,Гроув Сити +1223 366 139 Америка,США,Огайо,Кливленд +367 366 139 Америка,США,Огайо,Колумбус +2951 366 139 Америка,США,Огайо,Лавленд +2862 366 139 Америка,США,Огайо,Оберлин +3034 366 139 Америка,США,Огайо,Рейнольдсбург +2860 366 139 Америка,США,Огайо,Цинциннати +2393 366 139 Америка,США,Огайо,Другое +420 420 139 Америка,США,Оклахома +421 420 139 Америка,США,Оклахома,Оклахома-Сити +1224 420 139 Америка,США,Оклахома,Талса +2392 420 139 Америка,США,Оклахома,Другое +442 442 139 Америка,США,Орегон +2877 442 139 Америка,США,Орегон,Кламат-Фолс +2945 442 139 Америка,США,Орегон,Коттедж-Гроув +1225 442 139 Америка,США,Орегон,Портленд +443 442 139 Америка,США,Орегон,Сейлем +1226 442 139 Америка,США,Орегон,Юджин +2391 442 139 Америка,США,Орегон,Другое +364 364 139 Америка,США,Пенсильвания +3316 364 139 Америка,США,Пенсильвания,Вифлием +3282 364 139 Америка,США,Пенсильвания,Колледжвиль +2972 364 139 Америка,США,Пенсильвания,Нью Фридом +1227 364 139 Америка,США,Пенсильвания,Питтсбург +2893 364 139 Америка,США,Пенсильвания,Рандор +3110 364 139 Америка,США,Пенсильвания,Слиппери Рок +1228 364 139 Америка,США,Пенсильвания,Филадельфия +365 364 139 Америка,США,Пенсильвания,Харрисберг +2390 364 139 Америка,США,Пенсильвания,Другое +450 450 139 Америка,США,Пуэрто-Рико +451 450 139 Америка,США,Пуэрто-Рико,Понсе +3093 450 139 Америка,США,Пуэрто-Рико,Сан-Хуан +2389 450 139 Америка,США,Пуэрто-Рико,Другое +356 356 139 Америка,США,Род-Айленд +357 356 139 Америка,США,Род-Айленд,Провиденс +2388 356 139 Америка,США,Род-Айленд,Другое +382 382 139 Америка,США,Северная Дакота +383 382 139 Америка,США,Северная Дакота,Бисмарк +2387 382 139 Америка,США,Северная Дакота,Другое +398 398 139 Америка,США,Северная Каролина +2960 398 139 Америка,США,Северная Каролина,Вильмингтон +2915 398 139 Америка,США,Северная Каролина,Дурхам +399 398 139 Америка,США,Северная Каролина,Роли +2386 398 139 Америка,США,Северная Каролина,Другое +410 410 139 Америка,США,Теннесси +2863 410 139 Америка,США,Теннесси,Мемфис +411 410 139 Америка,США,Теннесси,Нашвилл +1229 410 139 Америка,США,Теннесси,Ноксвилл +2385 410 139 Америка,США,Теннесси,Другое +422 422 139 Америка,США,Техас +3085 422 139 Америка,США,Техас,Бедфорд +2913 422 139 Америка,США,Техас,Брейди +1233 422 139 Америка,США,Техас,Даллас +2916 422 139 Америка,США,Техас,Ирвинг +3123 422 139 Америка,США,Техас,Кингсвилл +2873 422 139 Америка,США,Техас,Конрой +3096 422 139 Америка,США,Техас,Корпус Кристи +423 422 139 Америка,США,Техас,Остин +1232 422 139 Америка,США,Техас,Сан-Антонио +3023 422 139 Америка,США,Техас,Уайли +1231 422 139 Америка,США,Техас,Хьюстон +1230 422 139 Америка,США,Техас,Эль-Пасо +2384 422 139 Америка,США,Техас,Другое +406 406 139 Америка,США,Федеральный округ Колумбия +2383 406 139 Америка,США,Федеральный округ Колумбия,Другое +404 404 139 Америка,США,Флорида +2879 404 139 Америка,США,Флорида,Бока-Рейтон +2880 404 139 Америка,США,Флорида,Гейнсвил +3086 404 139 Америка,США,Флорида,Джексонвиль +3002 404 139 Америка,США,Флорида,Киссимми +3124 404 139 Америка,США,Флорида,Корал Гейблс +2894 404 139 Америка,США,Флорида,Корал-Спрингс +3290 404 139 Америка,США,Флорида,Лейк-Ворт +1234 404 139 Америка,США,Флорида,Майами +1236 404 139 Америка,США,Флорида,Орландо +3372 404 139 Америка,США,Флорида,Пинеллас Парк +2952 404 139 Америка,США,Флорида,Пунта-Горда +3340 404 139 Америка,США,Флорида,Сарасота +1235 404 139 Америка,США,Флорида,Сент-Питерсберг +405 404 139 Америка,США,Флорида,Таллахасси +2962 404 139 Америка,США,Флорида,Форт Лаудердейл +2382 404 139 Америка,США,Флорида,Другое +384 384 139 Америка,США,Южная Дакота +385 384 139 Америка,США,Южная Дакота,Пирр +2381 384 139 Америка,США,Южная Дакота,Другое +400 400 139 Америка,США,Южная Каролина +401 400 139 Америка,США,Южная Каролина,Колумбия +3090 400 139 Америка,США,Южная Каролина,Спартанбург +1237 400 139 Америка,США,Южная Каролина,Чарлстон +2380 400 139 Америка,США,Южная Каролина,Другое +436 436 139 Америка,США,Юта +3036 436 139 Америка,США,Юта,Кейсвилл +3024 436 139 Америка,США,Юта,Линдон +3108 436 139 Америка,США,Юта,Орем +2866 436 139 Америка,США,Юта,Сент-Джордж +437 436 139 Америка,США,Юта,Солт-Лейк-Сити +2379 436 139 Америка,США,Юта,Другое +3200 0 3200 Америка,Ангилья (Брит.) +140 0 140 Америка,Антигуа и Барбуда +1238 1238 140 Америка,Антигуа и Барбуда,Сент-Джонс +2442 2442 140 Америка,Антигуа и Барбуда,Другое +141 0 141 Америка,Аргентина +1239 1239 141 Америка,Аргентина,Буэнос-Айрес +2441 2441 141 Америка,Аргентина,Другое +3202 0 3202 Америка,Аруба (Нид.) +142 0 142 Америка,Багамы +1240 1240 142 Америка,Багамы,Нассау +2440 2440 142 Америка,Багамы,Другое +143 0 143 Америка,Барбадос +1241 1241 143 Америка,Барбадос,Бриджтаун +2439 2439 143 Америка,Барбадос,Другое +146 0 146 Америка,Белиз +1242 1242 146 Америка,Белиз,Бельмопан +2438 2438 146 Америка,Белиз,Другое +3203 0 3203 Америка,Бермуды (Брит.) +144 0 144 Америка,Боливия +1243 1243 144 Америка,Боливия,Ла-Пас +2437 2437 144 Америка,Боливия,Другое +145 0 145 Америка,Бразилия +1244 1244 145 Америка,Бразилия,Бразилиа +3094 3094 145 Америка,Бразилия,Пассо Фундо +1245 1245 145 Америка,Бразилия,Рио-де-Жанейро +1246 1246 145 Америка,Бразилия,Сан-Паулу +2436 2436 145 Америка,Бразилия,Другое +147 0 147 Америка,Венесуэла +1247 1247 147 Америка,Венесуэла,Каракас +2435 2435 147 Америка,Венесуэла,Другое +3204 0 3204 Америка,Виргинские острова (Брит.) +452 0 452 Америка,Виргинские острова (США) +1190 1190 452 Америка,Виргинские острова (США),Шарлотта-Амалия +2364 2364 452 Америка,Виргинские острова (США),Другое +149 0 149 Америка,Гаити +1248 1248 149 Америка,Гаити,Порт-о-Пренс +2434 2434 149 Америка,Гаити,Другое +148 0 148 Америка,Гайана +1249 1249 148 Америка,Гайана,Джоржтаун +2433 2433 148 Америка,Гайана,Другое +3205 0 3205 Америка,Гваделупа (Фр.) +173 0 173 Америка,Гватемала +1250 1250 173 Америка,Гватемала,Гватемала +2432 2432 173 Америка,Гватемала,Другое +150 0 150 Америка,Гондурас +1251 1251 150 Америка,Гондурас,Тегусигальпа +2431 2431 150 Америка,Гондурас,Другое +151 0 151 Америка,Гренада +1252 1252 151 Америка,Гренада,Сент-Джорджес +2430 2430 151 Америка,Гренада,Другое +152 0 152 Америка,Гренландия (Дат.) +1253 1253 152 Америка,Гренландия (Дат.),Уманак +2429 2429 152 Америка,Гренландия (Дат.),Другое +153 0 153 Америка,Доминика +1254 1254 153 Америка,Доминика,Розо +2428 2428 153 Америка,Доминика,Другое +154 0 154 Америка,Доминиканская Республика +1255 1255 154 Америка,Доминиканская Республика,Санто-Доминго +2427 2427 154 Америка,Доминиканская Республика,Другое +155 0 155 Америка,Колумбия +1256 1256 155 Америка,Колумбия,Богота +2426 2426 155 Америка,Колумбия,Другое +156 0 156 Америка,Коста-Рика +1257 1257 156 Америка,Коста-Рика,Сан-Хосе +2425 2425 156 Америка,Коста-Рика,Другое +157 0 157 Америка,Куба +1258 1258 157 Америка,Куба,Гавана +2424 2424 157 Америка,Куба,Другое +3208 0 3208 Америка,Мартиника (Фр.) +158 0 158 Америка,Мексика +1259 1259 158 Америка,Мексика,Акапулько +1260 1260 158 Америка,Мексика,Мехико +2423 2423 158 Америка,Мексика,Другое +3209 0 3209 Америка,Монтсеррат (Брит) +3201 0 3201 Америка,Нидерландские Антилы +159 0 159 Америка,Никарагуа +1261 1261 159 Америка,Никарагуа,Манагуа +2422 2422 159 Америка,Никарагуа,Другое +3207 0 3207 Америка,Остров Кайман (Брит.) +3211 0 3211 Америка,Острова Теркс и Кайкос (Брит.) +160 0 160 Америка,Панама +1262 1262 160 Америка,Панама,Панама +2421 2421 160 Америка,Панама,Другое +161 0 161 Америка,Парагвай +1263 1263 161 Америка,Парагвай,Асунсьон +2420 2420 161 Америка,Парагвай,Другое +162 0 162 Америка,Перу +1264 1264 162 Америка,Перу,Лима +2419 2419 162 Америка,Перу,Другое +163 0 163 Америка,Сальвадор +1265 1265 163 Америка,Сальвадор,Сан-Сальвадор +2418 2418 163 Америка,Сальвадор,Другое +164 0 164 Америка,Сент-Винсент и Гренадины +1266 1266 164 Америка,Сент-Винсент и Гренадины,Кингстаун +2417 2417 164 Америка,Сент-Винсент и Гренадины,Другое +165 0 165 Америка,Сент-Китс и Невис +1267 1267 165 Америка,Сент-Китс и Невис,Бастер +2416 2416 165 Америка,Сент-Китс и Невис,Другое +166 0 166 Америка,Сент-Люсия +1268 1268 166 Америка,Сент-Люсия,Кастри +2415 2415 166 Америка,Сент-Люсия,Другое +3210 0 3210 Америка,Сент-Пьер и Микелон (Фр.) +167 0 167 Америка,Суринам +1269 1269 167 Америка,Суринам,Парамарибо +2414 2414 167 Америка,Суринам,Другое +168 0 168 Америка,Тринидат и Тобаго +1270 1270 168 Америка,Тринидат и Тобаго,Порт-оф-Спейн +2413 2413 168 Америка,Тринидат и Тобаго,Другое +169 0 169 Америка,Уругвай +1271 1271 169 Америка,Уругвай,Монтевидео +2412 2412 169 Америка,Уругвай,Другое +3212 0 3212 Америка,Фолклендские острова (Брит.) +3206 0 3206 Америка,Французская Гвиана +170 0 170 Америка,Чили +1272 1272 170 Америка,Чили,Сантьяго +2411 2411 170 Америка,Чили,Другое +171 0 171 Америка,Эквадор +1273 1273 171 Америка,Эквадор,Гуаякиль +1274 1274 171 Америка,Эквадор,Кито +2410 2410 171 Америка,Эквадор,Другое +3213 0 3213 Америка,Юж. Джорджия и Юж. Сандвичевы о-ва (Брит.) +172 0 172 Америка,Ямайка +1275 1275 172 Америка,Ямайка,Кингстон +2409 2409 172 Америка,Ямайка,Другое +27 0 0 Африка +174 0 174 Африка,Алжир +1854 1854 174 Африка,Алжир,Алжир +2495 2495 174 Африка,Алжир,Другое +175 0 175 Африка,Ангола +1855 1855 175 Африка,Ангола,Луанда +2494 2494 175 Африка,Ангола,Другое +176 0 176 Африка,Бенин +1856 1856 176 Африка,Бенин,Котону +1857 1857 176 Африка,Бенин,Порто-Ново +2493 2493 176 Африка,Бенин,Другое +177 0 177 Африка,Ботсвана +1858 1858 177 Африка,Ботсвана,Габороне +2492 2492 177 Африка,Ботсвана,Другое +3228 0 3228 Африка,Британская территория в Индийском океане +178 0 178 Африка,Буркина-Фасо +1859 1859 178 Африка,Буркина-Фасо,Уагадугу +2491 2491 178 Африка,Буркина-Фасо,Другое +179 0 179 Африка,Бурунди +1860 1860 179 Африка,Бурунди,Бужумбуру +2490 2490 179 Африка,Бурунди,Другое +180 0 180 Африка,Габон +1861 1861 180 Африка,Габон,Либревиль +2489 2489 180 Африка,Габон,Другое +181 0 181 Африка,Гамбия +1862 1862 181 Африка,Гамбия,Банжул +2488 2488 181 Африка,Гамбия,Другое +182 0 182 Африка,Гана +1863 1863 182 Африка,Гана,Аккра +2487 2487 182 Африка,Гана,Другое +183 0 183 Африка,Гвинея +1864 1864 183 Африка,Гвинея,Конакри +2486 2486 183 Африка,Гвинея,Другое +184 0 184 Африка,Гвинея-Бисау +1865 1865 184 Африка,Гвинея-Бисау,Бисау +2485 2485 184 Африка,Гвинея-Бисау,Другое +185 0 185 Африка,Джибути +1866 1866 185 Африка,Джибути,Джибути +2484 2484 185 Африка,Джибути,Другое +186 0 186 Африка,Египет +3312 3312 186 Африка,Египет,Дахаб +1867 1867 186 Африка,Египет,Каир +1868 1868 186 Африка,Египет,Хургада +2483 2483 186 Африка,Египет,Другое +187 0 187 Африка,Замбия +1869 1869 187 Африка,Замбия,Лусака +2482 2482 187 Африка,Замбия,Другое +3198 0 3198 Африка,Зап. Сахара +23 0 23 Африка,Зимбабве +1870 1870 23 Африка,Зимбабве,Хараре +2481 2481 23 Африка,Зимбабве,Другое +188 0 188 Африка,Кабо-Верде +1871 1871 188 Африка,Кабо-Верде,Прая +2480 2480 188 Африка,Кабо-Верде,Другое +189 0 189 Африка,Камерун +1872 1872 189 Африка,Камерун,Яунде +2479 2479 189 Африка,Камерун,Другое +190 0 190 Африка,Кения +1873 1873 190 Африка,Кения,Найроби +2478 2478 190 Африка,Кения,Другое +191 0 191 Африка,Коморы +1874 1874 191 Африка,Коморы,Морони +2477 2477 191 Африка,Коморы,Другое +193 0 193 Африка,Конго (Заир) +1875 1875 193 Африка,Конго (Заир),Киншаса +2476 2476 193 Африка,Конго (Заир),Другое +192 0 192 Африка,Конго, Республика +1876 1876 192 Африка,Конго, Республика,Браззавиль +2475 2475 192 Африка,Конго, Республика,Другое +194 0 194 Африка,Кот-д`Ивуар +1877 1877 194 Африка,Кот-д`Ивуар,Ямусукро +2474 2474 194 Африка,Кот-д`Ивуар,Другое +195 0 195 Африка,Лесото +1878 1878 195 Африка,Лесото,Масеру +2473 2473 195 Африка,Лесото,Другое +196 0 196 Африка,Либерия +1879 1879 196 Африка,Либерия,Монровия +2472 2472 196 Африка,Либерия,Другое +197 0 197 Африка,Ливия +1880 1880 197 Африка,Ливия,Триполи +2471 2471 197 Африка,Ливия,Другое +198 0 198 Африка,Маврикий +1881 1881 198 Африка,Маврикий,Порт-Луи +2470 2470 198 Африка,Маврикий,Другое +199 0 199 Африка,Мавритания +1882 1882 199 Африка,Мавритания,Нуакшот +2469 2469 199 Африка,Мавритания,Другое +200 0 200 Африка,Мадагаскар +1883 1883 200 Африка,Мадагаскар,Антананариву +2468 2468 200 Африка,Мадагаскар,Другое +3229 0 3229 Африка,Майотт (Фр.) +201 0 201 Африка,Малави +1884 1884 201 Африка,Малави,Лилонгве +2467 2467 201 Африка,Малави,Другое +202 0 202 Африка,Мали +1885 1885 202 Африка,Мали,Бамако +2466 2466 202 Африка,Мали,Другое +203 0 203 Африка,Марокко +1886 1886 203 Африка,Марокко,Агадир +1887 1887 203 Африка,Марокко,Рабат +2465 2465 203 Африка,Марокко,Другое +204 0 204 Африка,Мозамбик +1888 1888 204 Африка,Мозамбик,Мапуту +2464 2464 204 Африка,Мозамбик,Другое +205 0 205 Африка,Намибия +1889 1889 205 Африка,Намибия,Виндхук +2463 2463 205 Африка,Намибия,Другое +206 0 206 Африка,Нигер +1890 1890 206 Африка,Нигер,Ниамей +2462 2462 206 Африка,Нигер,Другое +207 0 207 Африка,Нигерия +1891 1891 207 Африка,Нигерия,Абуджа +2461 2461 207 Африка,Нигерия,Другое +3227 0 3227 Африка,Остров Буве (Норв.) +3197 0 3197 Африка,Реюньон (Фр.) +208 0 208 Африка,Руанда +1892 1892 208 Африка,Руанда,Кигали +2460 2460 208 Африка,Руанда,Другое +209 0 209 Африка,Сан-Томе и Принсипи +1893 1893 209 Африка,Сан-Томе и Принсипи,Сан-Томе +2459 2459 209 Африка,Сан-Томе и Принсипи,Другое +210 0 210 Африка,Свазиленд +1894 1894 210 Африка,Свазиленд,Мбабане +2458 2458 210 Африка,Свазиленд,Другое +3199 0 3199 Африка,Святая Елена (Брит.) +211 0 211 Африка,Сейшелы +1895 1895 211 Африка,Сейшелы,Виктория +2457 2457 211 Африка,Сейшелы,Другое +212 0 212 Африка,Сенегал +1896 1896 212 Африка,Сенегал,Дакар +2456 2456 212 Африка,Сенегал,Другое +213 0 213 Африка,Сомали +1897 1897 213 Африка,Сомали,Могадишо +2455 2455 213 Африка,Сомали,Другое +214 0 214 Африка,Судан +1898 1898 214 Африка,Судан,Хартум +2454 2454 214 Африка,Судан,Другое +215 0 215 Африка,Сьерра-Леоне +1899 1899 215 Африка,Сьерра-Леоне,Фритаун +2453 2453 215 Африка,Сьерра-Леоне,Другое +216 0 216 Африка,Танзания +1900 1900 216 Африка,Танзания,Дар-эс-Салам +1901 1901 216 Африка,Танзания,Додома +2452 2452 216 Африка,Танзания,Другое +217 0 217 Африка,Того +1902 1902 217 Африка,Того,Ломе +2451 2451 217 Африка,Того,Другое +218 0 218 Африка,Тунис +1903 1903 218 Африка,Тунис,Тунис +2450 2450 218 Африка,Тунис,Другое +219 0 219 Африка,Уганда +1904 1904 219 Африка,Уганда,Кампала +2449 2449 219 Африка,Уганда,Другое +220 0 220 Африка,Центральноафриканская Республика +1905 1905 220 Африка,Центральноафриканская Республика,Банги +2448 2448 220 Африка,Центральноафриканская Республика,Другое +222 0 222 Африка,Чад +1906 1906 222 Африка,Чад,Нджамена +2447 2447 222 Африка,Чад,Другое +223 0 223 Африка,Экваториальная Гвинея +1907 1907 223 Африка,Экваториальная Гвинея,Малабо +2446 2446 223 Африка,Экваториальная Гвинея,Другое +221 0 221 Африка,Эритрея +1908 1908 221 Африка,Эритрея,Асмэра +2445 2445 221 Африка,Эритрея,Другое +224 0 224 Африка,Эфиопия +1909 1909 224 Африка,Эфиопия,Аддис-Абеба +2444 2444 224 Африка,Эфиопия,Другое +225 0 225 Африка,Южно-Африканская Республика (ЮАР) +1910 1910 225 Африка,Южно-Африканская Республика (ЮАР),Дурбан +1913 1913 225 Африка,Южно-Африканская Республика (ЮАР),Йоханнесбург +1912 1912 225 Африка,Южно-Африканская Республика (ЮАР),Кейптаун +3033 3033 225 Африка,Южно-Африканская Республика (ЮАР),Пайнтаун +1911 1911 225 Африка,Южно-Африканская Республика (ЮАР),Претория +2443 2443 225 Африка,Южно-Африканская Республика (ЮАР),Другое +26 0 0 Европа +39 0 39 Европа,Украина +314 314 39 Европа,Украина,Киев +315 315 39 Европа,Украина,Винницкая обл. +614 315 39 Европа,Украина,Винницкая обл.,Винница +615 315 39 Европа,Украина,Винницкая обл.,Хмельник +2566 315 39 Европа,Украина,Винницкая обл.,Другое +316 316 39 Европа,Украина,Волынская обл. +2940 316 39 Европа,Украина,Волынская обл.,Ковель +616 316 39 Европа,Украина,Волынская обл.,Луцк +2565 316 39 Европа,Украина,Волынская обл.,Другое +317 317 39 Европа,Украина,Днепропетровская обл. +617 317 39 Европа,Украина,Днепропетровская обл.,Днепродзержинск +618 317 39 Европа,Украина,Днепропетровская обл.,Днепропетровск +619 317 39 Европа,Украина,Днепропетровская обл.,Кривой Рог +620 317 39 Европа,Украина,Днепропетровская обл.,Никополь +621 317 39 Европа,Украина,Днепропетровская обл.,Новомосковск +622 317 39 Европа,Украина,Днепропетровская обл.,Орджоникидзе +623 317 39 Европа,Украина,Днепропетровская обл.,Павлоград +2564 317 39 Европа,Украина,Днепропетровская обл.,Другое +318 318 39 Европа,Украина,Донецкая обл. +624 318 39 Европа,Украина,Донецкая обл.,Артемовск +625 318 39 Европа,Украина,Донецкая обл.,Горловка +626 318 39 Европа,Украина,Донецкая обл.,Донецк +627 318 39 Европа,Украина,Донецкая обл.,Дружковка +628 318 39 Европа,Украина,Донецкая обл.,Енакиево +629 318 39 Европа,Украина,Донецкая обл.,Константиновка +630 318 39 Европа,Украина,Донецкая обл.,Краматорск +2944 318 39 Европа,Украина,Донецкая обл.,Красноармейск +631 318 39 Европа,Украина,Донецкая обл.,Макеевка +632 318 39 Европа,Украина,Донецкая обл.,Мариуполь +633 318 39 Европа,Украина,Донецкая обл.,Николаевка +634 318 39 Европа,Украина,Донецкая обл.,Славянск +635 318 39 Европа,Украина,Донецкая обл.,Харцызск +2563 318 39 Европа,Украина,Донецкая обл.,Другое +319 319 39 Европа,Украина,Житомирская обл. +636 319 39 Европа,Украина,Житомирская обл.,Бердичев +637 319 39 Европа,Украина,Житомирская обл.,Житомир +2942 319 39 Европа,Украина,Житомирская обл.,Коростень +638 319 39 Европа,Украина,Житомирская обл.,Коростышев +2907 319 39 Европа,Украина,Житомирская обл.,Малин +639 319 39 Европа,Украина,Житомирская обл.,Новоград-Волынский +2562 319 39 Европа,Украина,Житомирская обл.,Другое +320 320 39 Европа,Украина,Закарпатская обл. +640 320 39 Европа,Украина,Закарпатская обл.,Берегово +641 320 39 Европа,Украина,Закарпатская обл.,Воловец +3119 320 39 Европа,Украина,Закарпатская обл.,Мукачево +3162 320 39 Европа,Украина,Закарпатская обл.,Свалява +642 320 39 Европа,Украина,Закарпатская обл.,Ужгород +643 320 39 Европа,Украина,Закарпатская обл.,Хуст +2561 320 39 Европа,Украина,Закарпатская обл.,Другое +321 321 39 Европа,Украина,Запорожская обл. +644 321 39 Европа,Украина,Запорожская обл.,Бердянск +3128 321 39 Европа,Украина,Запорожская обл.,Гуляйполе +645 321 39 Европа,Украина,Запорожская обл.,Запорожье +646 321 39 Европа,Украина,Запорожская обл.,Мелитополь +3121 321 39 Европа,Украина,Запорожская обл.,Приморск +3378 321 39 Европа,Украина,Запорожская обл.,Энергодар +2560 321 39 Европа,Украина,Запорожская обл.,Другое +322 322 39 Европа,Украина,Ивано-Франковская обл. +3379 322 39 Европа,Украина,Ивано-Франковская обл.,Галич +647 322 39 Европа,Украина,Ивано-Франковская обл.,Ивано-Франковск +3170 322 39 Европа,Украина,Ивано-Франковская обл.,Яремче +2559 322 39 Европа,Украина,Ивано-Франковская обл.,Другое +323 323 39 Европа,Украина,Киевская обл. +648 323 39 Европа,Украина,Киевская обл.,Белая Церковь +649 323 39 Европа,Украина,Киевская обл.,Борисполь +651 323 39 Европа,Украина,Киевская обл.,Бровары +650 323 39 Европа,Украина,Киевская обл.,Васильков +652 323 39 Европа,Украина,Киевская обл.,Ирпень +3341 323 39 Европа,Украина,Киевская обл.,Переяслав-Хмельницкий +653 323 39 Европа,Украина,Киевская обл.,Славутич +654 323 39 Европа,Украина,Киевская обл.,Фастов +655 323 39 Европа,Украина,Киевская обл.,Чернобыль +2558 323 39 Европа,Украина,Киевская обл.,Другое +324 324 39 Европа,Украина,Кировоградская обл. +656 324 39 Европа,Украина,Кировоградская обл.,Александрия +657 324 39 Европа,Украина,Кировоградская обл.,Кировоград +658 324 39 Европа,Украина,Кировоградская обл.,Светловодск +2557 324 39 Европа,Украина,Кировоградская обл.,Другое +325 325 39 Европа,Украина,Крым +659 325 39 Европа,Украина,Крым,Алушта +2984 325 39 Европа,Украина,Крым,Армянск +3042 325 39 Европа,Украина,Крым,Балаклава +660 325 39 Европа,Украина,Крым,Бахчисарай +662 325 39 Европа,Украина,Крым,Гурзуф +3382 325 39 Европа,Украина,Крым,Джанкой +663 325 39 Европа,Украина,Крым,Евпатория +667 325 39 Европа,Украина,Крым,Керчь +666 325 39 Европа,Украина,Крым,Коктебель +668 325 39 Европа,Украина,Крым,Мысовое +669 325 39 Европа,Украина,Крым,Саки +665 325 39 Европа,Украина,Крым,Севастополь +661 325 39 Европа,Украина,Крым,Симферополь +3370 325 39 Европа,Украина,Крым,Старый Крым +670 325 39 Европа,Украина,Крым,Судак +664 325 39 Европа,Украина,Крым,Феодосия +3148 325 39 Европа,Украина,Крым,Черноморское +671 325 39 Европа,Украина,Крым,Ялта +2556 325 39 Европа,Украина,Крым,Другое +326 326 39 Европа,Украина,Луганская обл. +672 326 39 Европа,Украина,Луганская обл.,Алчевск +673 326 39 Европа,Украина,Луганская обл.,Антрацит +674 326 39 Европа,Украина,Луганская обл.,Лисичанск +675 326 39 Европа,Украина,Луганская обл.,Луганск +3364 326 39 Европа,Украина,Луганская обл.,Молодогвардейск +676 326 39 Европа,Украина,Луганская обл.,Петровское +677 326 39 Европа,Украина,Луганская обл.,Ровеньки +678 326 39 Европа,Украина,Луганская обл.,Рубежное +679 326 39 Европа,Украина,Луганская обл.,Северодонецк +680 326 39 Европа,Украина,Луганская обл.,Стаханов +2555 326 39 Европа,Украина,Луганская обл.,Другое +327 327 39 Европа,Украина,Львовская обл. +3284 327 39 Европа,Украина,Львовская обл.,Дрогобыч +681 327 39 Европа,Украина,Львовская обл.,Львов +682 327 39 Европа,Украина,Львовская обл.,Трускавец +2554 327 39 Европа,Украина,Львовская обл.,Другое +328 328 39 Европа,Украина,Николаевская обл. +3322 328 39 Европа,Украина,Николаевская обл.,Вознесенск +2870 328 39 Европа,Украина,Николаевская обл.,Жовтневое +683 328 39 Европа,Украина,Николаевская обл.,Николаев +3118 328 39 Европа,Украина,Николаевская обл.,Очаков +3325 328 39 Европа,Украина,Николаевская обл.,Южноукраинск +2553 328 39 Европа,Украина,Николаевская обл.,Другое +329 329 39 Европа,Украина,Одесская обл. +684 329 39 Европа,Украина,Одесская обл.,Белгород-Днестровский +685 329 39 Европа,Украина,Одесская обл.,Измаил +689 329 39 Европа,Украина,Одесская обл.,Ильичевск +686 329 39 Европа,Украина,Одесская обл.,Одесса +688 329 39 Европа,Украина,Одесская обл.,Рени +687 329 39 Европа,Украина,Одесская обл.,Слободка +2552 329 39 Европа,Украина,Одесская обл.,Другое +330 330 39 Европа,Украина,Полтавская обл. +690 330 39 Европа,Украина,Полтавская обл.,Гадяч +691 330 39 Европа,Украина,Полтавская обл.,Комсомольск +693 330 39 Европа,Украина,Полтавская обл.,Кременчуг +694 330 39 Европа,Украина,Полтавская обл.,Лубны +695 330 39 Европа,Украина,Полтавская обл.,Миргород +692 330 39 Европа,Украина,Полтавская обл.,Полтава +2551 330 39 Европа,Украина,Полтавская обл.,Другое +331 331 39 Европа,Украина,Ровенская обл. +696 331 39 Европа,Украина,Ровенская обл.,Здолбунов +697 331 39 Европа,Украина,Ровенская обл.,Ровно +3361 331 39 Европа,Украина,Ровенская обл.,Сарны +2550 331 39 Европа,Украина,Ровенская обл.,Другое +332 332 39 Европа,Украина,Сумская обл. +3356 332 39 Европа,Украина,Сумская обл.,Бурынь +698 332 39 Европа,Украина,Сумская обл.,Конотоп +700 332 39 Европа,Украина,Сумская обл.,Ромны +699 332 39 Европа,Украина,Сумская обл.,Сумы +701 332 39 Европа,Украина,Сумская обл.,Шостка +2549 332 39 Европа,Украина,Сумская обл.,Другое +333 333 39 Европа,Украина,Тернопольская обл. +702 333 39 Европа,Украина,Тернопольская обл.,Бережаны +3171 333 39 Европа,Украина,Тернопольская обл.,Борщев +703 333 39 Европа,Украина,Тернопольская обл.,Тернополь +704 333 39 Европа,Украина,Тернопольская обл.,Чортков +2548 333 39 Европа,Украина,Тернопольская обл.,Другое +334 334 39 Европа,Украина,Харьковская обл. +705 334 39 Европа,Украина,Харьковская обл.,Изюм +3346 334 39 Европа,Украина,Харьковская обл.,Купянск +3351 334 39 Европа,Украина,Харьковская обл.,Купянск +706 334 39 Европа,Украина,Харьковская обл.,Лозовая +708 334 39 Европа,Украина,Харьковская обл.,Мерефа +707 334 39 Европа,Украина,Харьковская обл.,Харьков +709 334 39 Европа,Украина,Харьковская обл.,Чугуев +2547 334 39 Европа,Украина,Харьковская обл.,Другое +335 335 39 Европа,Украина,Херсонская обл. +710 335 39 Европа,Украина,Херсонская обл.,Геническ +711 335 39 Европа,Украина,Херсонская обл.,Каховка +712 335 39 Европа,Украина,Херсонская обл.,Новая Каховка +3280 335 39 Европа,Украина,Херсонская обл.,Скадовск +713 335 39 Европа,Украина,Херсонская обл.,Херсон +2546 335 39 Европа,Украина,Херсонская обл.,Другое +336 336 39 Европа,Украина,Хмельницкая обл. +714 336 39 Европа,Украина,Хмельницкая обл.,Каменец-Подольский +715 336 39 Европа,Украина,Хмельницкая обл.,Красилов +2941 336 39 Европа,Украина,Хмельницкая обл.,Нетишин +716 336 39 Европа,Украина,Хмельницкая обл.,Полонное +3120 336 39 Европа,Украина,Хмельницкая обл.,Сатанов +2943 336 39 Европа,Украина,Хмельницкая обл.,Славута +717 336 39 Европа,Украина,Хмельницкая обл.,Хмельницкий +3155 336 39 Европа,Украина,Хмельницкая обл.,Чемировцы +2542 336 39 Европа,Украина,Хмельницкая обл.,Другое +337 337 39 Европа,Украина,Черкасская обл. +3169 337 39 Европа,Украина,Черкасская обл.,Золотоноша +3016 337 39 Европа,Украина,Черкасская обл.,Канев +3333 337 39 Европа,Украина,Черкасская обл.,Полонное +718 337 39 Европа,Украина,Черкасская обл.,Умань +719 337 39 Европа,Украина,Черкасская обл.,Христиновка +720 337 39 Европа,Украина,Черкасская обл.,Черкассы +2545 337 39 Европа,Украина,Черкасская обл.,Другое +338 338 39 Европа,Украина,Черниговская обл. +721 338 39 Европа,Украина,Черниговская обл.,Нежин +722 338 39 Европа,Украина,Черниговская обл.,Прилуки +723 338 39 Европа,Украина,Черниговская обл.,Чернигов +2544 338 39 Европа,Украина,Черниговская обл.,Другое +339 339 39 Европа,Украина,Черновицкая обл. +724 339 39 Европа,Украина,Черновицкая обл.,Черновцы +2543 339 39 Европа,Украина,Черновицкая обл.,Другое +40 0 40 Европа,Австрия +602 602 40 Европа,Австрия,Бад Халл +604 604 40 Европа,Австрия,Брегенц +603 603 40 Европа,Австрия,Вена +608 608 40 Европа,Австрия,Грац +606 606 40 Европа,Австрия,Зальцбург +3099 3099 40 Европа,Австрия,Зель-ам-Зее +605 605 40 Европа,Австрия,Инсбрук +3174 3174 40 Европа,Австрия,Кирхберг +609 609 40 Европа,Австрия,Клагенфурт +607 607 40 Европа,Австрия,Линц +610 610 40 Европа,Австрия,Обдах +611 611 40 Европа,Австрия,Щтубайтал +2541 2541 40 Европа,Австрия,Другое +32 0 32 Европа,Албания +612 612 32 Европа,Албания,Тирана +2540 2540 32 Европа,Албания,Другое +33 0 33 Европа,Андорра +613 613 33 Европа,Андорра,Андорра-ла-Велья +2539 2539 33 Европа,Андорра,Другое +340 0 340 Европа,Белоруссия +341 341 340 Европа,Белоруссия,Минск +342 342 340 Европа,Белоруссия,Брестская обл. +725 342 340 Европа,Белоруссия,Брестская обл.,Барановичи +726 342 340 Европа,Белоруссия,Брестская обл.,Белоозерск +727 342 340 Европа,Белоруссия,Брестская обл.,Береза +728 342 340 Европа,Белоруссия,Брестская обл.,Брест +3172 342 340 Европа,Белоруссия,Брестская обл.,Дрогичин +729 342 340 Европа,Белоруссия,Брестская обл.,Кобрин +730 342 340 Европа,Белоруссия,Брестская обл.,Ляховичи +731 342 340 Европа,Белоруссия,Брестская обл.,Малорита +732 342 340 Европа,Белоруссия,Брестская обл.,Пинск +2538 342 340 Европа,Белоруссия,Брестская обл.,Другое +343 343 340 Европа,Белоруссия,Витебская обл. +733 343 340 Европа,Белоруссия,Витебская обл.,Браслав +735 343 340 Европа,Белоруссия,Витебская обл.,Витебск +734 343 340 Европа,Белоруссия,Витебская обл.,Новолукомоль +736 343 340 Европа,Белоруссия,Витебская обл.,Новополоцк +737 343 340 Европа,Белоруссия,Витебская обл.,Орша +738 343 340 Европа,Белоруссия,Витебская обл.,Толочин +2537 343 340 Европа,Белоруссия,Витебская обл.,Другое +344 344 340 Европа,Белоруссия,Гомельская обл. +739 344 340 Европа,Белоруссия,Гомельская обл.,Гомель +740 344 340 Европа,Белоруссия,Гомельская обл.,Жлобин +741 344 340 Европа,Белоруссия,Гомельская обл.,Мозырь +742 344 340 Европа,Белоруссия,Гомельская обл.,Речица +743 344 340 Европа,Белоруссия,Гомельская обл.,Рогачев +744 344 340 Европа,Белоруссия,Гомельская обл.,Светлогорск +2536 344 340 Европа,Белоруссия,Гомельская обл.,Другое +345 345 340 Европа,Белоруссия,Гродненская обл. +745 345 340 Европа,Белоруссия,Гродненская обл.,Волковыск +746 345 340 Европа,Белоруссия,Гродненская обл.,Гродно +747 345 340 Европа,Белоруссия,Гродненская обл.,Лида +3244 345 340 Европа,Белоруссия,Гродненская обл.,Слоним +748 345 340 Европа,Белоруссия,Гродненская обл.,Сморгонь +2535 345 340 Европа,Белоруссия,Гродненская обл.,Другое +346 346 340 Европа,Белоруссия,Минская обл. +3149 346 340 Европа,Белоруссия,Минская обл.,Березино +749 346 340 Европа,Белоруссия,Минская обл.,Борисов +750 346 340 Европа,Белоруссия,Минская обл.,Вилейка +751 346 340 Европа,Белоруссия,Минская обл.,Жодино +752 346 340 Европа,Белоруссия,Минская обл.,Марьина Горка +753 346 340 Европа,Белоруссия,Минская обл.,Молодечно +2896 346 340 Европа,Белоруссия,Минская обл.,Слуцк +754 346 340 Европа,Белоруссия,Минская обл.,Смолевичи +755 346 340 Европа,Белоруссия,Минская обл.,Солигорск +756 346 340 Европа,Белоруссия,Минская обл.,Червень +2534 346 340 Европа,Белоруссия,Минская обл.,Другое +347 347 340 Европа,Белоруссия,Могилевская обл. +757 347 340 Европа,Белоруссия,Могилевская обл.,Бобруйск +758 347 340 Европа,Белоруссия,Могилевская обл.,Могилев +759 347 340 Европа,Белоруссия,Могилевская обл.,Осиповичи +2533 347 340 Европа,Белоруссия,Могилевская обл.,Другое +38 0 38 Европа,Бельгия +760 760 38 Европа,Бельгия,Антверпен +767 767 38 Европа,Бельгия,Арлон +762 762 38 Европа,Бельгия,Брюгге +761 761 38 Европа,Бельгия,Брюссель +763 763 38 Европа,Бельгия,Гент +769 769 38 Европа,Бельгия,Лувен +765 765 38 Европа,Бельгия,Льеж +764 764 38 Европа,Бельгия,Монс +3117 3117 38 Европа,Бельгия,Мортсель +766 766 38 Европа,Бельгия,Намюр +768 768 38 Европа,Бельгия,Хасселт +2532 2532 38 Европа,Бельгия,Другое +41 0 41 Европа,Болгария +3098 3098 41 Европа,Болгария,Банско +792 792 41 Европа,Болгария,Благоевград +770 770 41 Европа,Болгария,Бургас +771 771 41 Европа,Болгария,Бяла +773 773 41 Европа,Болгария,Варна +776 776 41 Европа,Болгария,Велико-Тырново +788 788 41 Европа,Болгария,Видин +789 789 41 Европа,Болгария,Враца +796 796 41 Европа,Болгария,Габрово +777 777 41 Европа,Болгария,Димитровград +781 781 41 Европа,Болгария,Каварна +786 786 41 Европа,Болгария,Кырджали +791 791 41 Европа,Болгария,Кюстендил +793 793 41 Европа,Болгария,Лазарджик +795 795 41 Европа,Болгария,Ловеч +787 787 41 Европа,Болгария,Михайловград +790 790 41 Европа,Болгария,Перник +3133 3133 41 Европа,Болгария,Пирдоп +794 794 41 Европа,Болгария,Плевен +782 782 41 Европа,Болгария,Пловдив +780 780 41 Европа,Болгария,Разград +779 779 41 Европа,Болгария,Русе +774 774 41 Европа,Болгария,Силистра +784 784 41 Европа,Болгария,Сливен +772 772 41 Европа,Болгария,София +775 775 41 Европа,Болгария,Толбухин +3116 3116 41 Европа,Болгария,Тырново +785 785 41 Европа,Болгария,Хасково +778 778 41 Европа,Болгария,Шумен +783 783 41 Европа,Болгария,Ямбол +2531 2531 41 Европа,Болгария,Другое +42 0 42 Европа,Босния и Герцеговина +797 797 42 Европа,Босния и Герцеговина,Баня-Лука +799 799 42 Европа,Босния и Герцеговина,Зеница +798 798 42 Европа,Босния и Герцеговина,Сараево +800 800 42 Европа,Босния и Герцеговина,Тузла +2530 2530 42 Европа,Босния и Герцеговина,Другое +43 0 43 Европа,Ватикан +45 0 45 Европа,Великобритания +802 802 45 Европа,Великобритания,Абердин +3075 3075 45 Европа,Великобритания,Айслворт +801 801 45 Европа,Великобритания,Алнвик +804 804 45 Европа,Великобритания,Бидефорд +803 803 45 Европа,Великобритания,Бирмингем +805 805 45 Европа,Великобритания,Блоксвич +3168 3168 45 Европа,Великобритания,Бостон +806 806 45 Европа,Великобритания,Брайтон +807 807 45 Европа,Великобритания,Бредфорд +808 808 45 Европа,Великобритания,Бристоль +809 809 45 Европа,Великобритания,Вилленхолл +3131 3131 45 Европа,Великобритания,Воррингтон +810 810 45 Европа,Великобритания,Вудбридж +3342 3342 45 Европа,Великобритания,Гилфорд +811 811 45 Европа,Великобритания,Глазго +812 812 45 Европа,Великобритания,Дадли +813 813 45 Европа,Великобритания,Дарем +814 814 45 Европа,Великобритания,Дуглас +3089 3089 45 Европа,Великобритания,Кардиф +815 815 45 Европа,Великобритания,Кембридж +816 816 45 Европа,Великобритания,Кентербери +817 817 45 Европа,Великобритания,Ливерпуль +818 818 45 Европа,Великобритания,Лидс +819 819 45 Европа,Великобритания,Лондон +820 820 45 Европа,Великобритания,Манчестер +2976 2976 45 Европа,Великобритания,Митчем +2988 2988 45 Европа,Великобритания,Мэйденхед +821 821 45 Европа,Великобритания,Ноттингем +3088 3088 45 Европа,Великобритания,Ньюпорт +822 822 45 Европа,Великобритания,Оксфорд +823 823 45 Европа,Великобритания,Плимут +824 824 45 Европа,Великобритания,Портсмут +825 825 45 Европа,Великобритания,Престон +3343 3343 45 Европа,Великобритания,Райд +2867 2867 45 Европа,Великобритания,Ридинг +2986 2986 45 Европа,Великобритания,Сент-Албанс +826 826 45 Европа,Великобритания,Стаффорд +3063 3063 45 Европа,Великобритания,Стокпорт +827 827 45 Европа,Великобритания,Уэймут +3140 3140 45 Европа,Великобритания,Челтенхэм +828 828 45 Европа,Великобритания,Честер +829 829 45 Европа,Великобритания,Шеффилд +830 830 45 Европа,Великобритания,Эдинбург +2529 2529 45 Европа,Великобритания,Другое +44 0 44 Европа,Венгрия +831 831 44 Европа,Венгрия,Будапешт +832 832 44 Европа,Венгрия,Геделле +836 836 44 Европа,Венгрия,Дебрецен +835 835 44 Европа,Венгрия,Мишкольц +834 834 44 Европа,Венгрия,Сегед +833 833 44 Европа,Венгрия,Шиофок +2528 2528 44 Европа,Венгрия,Другое +46 0 46 Европа,Германия +3007 3007 46 Европа,Германия,Аахен +837 837 46 Европа,Германия,Аугсбург +838 838 46 Европа,Германия,Баден-Баден +3371 3371 46 Европа,Германия,Бамберг +839 839 46 Европа,Германия,Бергиш-Гладбах +840 840 46 Европа,Германия,Берлин +841 841 46 Европа,Германия,Билефельд +3163 3163 46 Европа,Германия,Бовенден +842 842 46 Европа,Германия,Бонн +843 843 46 Европа,Германия,Браденбург +3015 3015 46 Европа,Германия,Брауншвейг +844 844 46 Европа,Германия,Бремен +2921 2921 46 Европа,Германия,Варштайн +845 845 46 Европа,Германия,Веймар +846 846 46 Европа,Германия,Вупперталь +847 847 46 Европа,Германия,Гамбург +848 848 46 Европа,Германия,Ганновер +849 849 46 Европа,Германия,Гарделеген +3010 3010 46 Европа,Германия,Гейдельберг +850 850 46 Европа,Германия,Гота +851 851 46 Европа,Германия,Дармштадт +3072 3072 46 Европа,Германия,Дессау +852 852 46 Европа,Германия,Детмольд +853 853 46 Европа,Германия,Дортмунд +854 854 46 Европа,Германия,Дрезден +855 855 46 Европа,Германия,Дюссельдорф +3082 3082 46 Европа,Германия,Иффецхайм +3309 3309 46 Европа,Германия,Кассел +856 856 46 Европа,Германия,Кельн +857 857 46 Европа,Германия,Киль +3138 3138 46 Европа,Германия,Кобленц +858 858 46 Европа,Германия,Крефельд +859 859 46 Европа,Германия,Лейпциг +2872 2872 46 Европа,Германия,Лимбург +2965 2965 46 Европа,Германия,Линген +3135 3135 46 Европа,Германия,Любек +3156 3156 46 Европа,Германия,Мангейм +3192 3192 46 Европа,Германия,Меерсбург +860 860 46 Европа,Германия,Мюнстер +861 861 46 Европа,Германия,Мюнхен +2864 2864 46 Европа,Германия,Нойштадт +862 862 46 Европа,Германия,Нюрнберг +3009 3009 46 Европа,Германия,Оффенбург +2993 2993 46 Европа,Германия,Падерборн +863 863 46 Европа,Германия,Равенсбург +864 864 46 Европа,Германия,Регенсбург +865 865 46 Европа,Германия,Рейнен +866 866 46 Европа,Германия,Росток +3191 3191 46 Европа,Германия,Саарбрюкен +2974 2974 46 Европа,Германия,Санкт-Августин +3127 3127 46 Европа,Германия,Тюринген +867 867 46 Европа,Германия,Фрайберг +868 868 46 Европа,Германия,Фрайбург +869 869 46 Европа,Германия,Франкфурт-на-Майне +3373 3373 46 Европа,Германия,Хемнитц +3313 3313 46 Европа,Германия,Хильден +870 870 46 Европа,Германия,Штутгарт +3045 3045 46 Европа,Германия,Эрланген +2906 2906 46 Европа,Германия,Эшборн +2527 2527 46 Европа,Германия,Другое +3193 0 3193 Европа,Гернси (Брит.) +47 0 47 Европа,Гибралтар (Брит.) +48 0 48 Европа,Греция +871 871 48 Европа,Греция,Афины +873 873 48 Европа,Греция,Ираклион +3147 3147 48 Европа,Греция,Корфу +872 872 48 Европа,Греция,Салоники +3178 3178 48 Европа,Греция,Халкидики +2526 2526 48 Европа,Греция,Другое +49 0 49 Европа,Дания +3006 3006 49 Европа,Дания,Архус +874 874 49 Европа,Дания,Копенгаген +875 875 49 Европа,Дания,Оденсе +3285 3285 49 Европа,Дания,Ольборг +876 876 49 Европа,Дания,Сванеке +3126 3126 49 Европа,Дания,Скиве +2525 2525 49 Европа,Дания,Другое +3194 0 3194 Европа,Джерси (Брит.) +50 0 50 Европа,Ирландия +3377 3377 50 Европа,Ирландия,Виклоу +3067 3067 50 Европа,Ирландия,Голвей +877 877 50 Европа,Ирландия,Дублин +3065 3065 50 Европа,Ирландия,Килларней +3066 3066 50 Европа,Ирландия,Корк +878 878 50 Европа,Ирландия,Лимерик +3069 3069 50 Европа,Ирландия,Нейс +3068 3068 50 Европа,Ирландия,Типперэри +2524 2524 50 Европа,Ирландия,Другое +51 0 51 Европа,Исландия +879 879 51 Европа,Исландия,Рейкьявик +2523 2523 51 Европа,Исландия,Другое +34 0 34 Европа,Испания +880 880 34 Европа,Испания,Аликанте +3125 3125 34 Европа,Испания,Альмерия +881 881 34 Европа,Испания,Барселона +890 890 34 Европа,Испания,Бильбао +3076 3076 34 Европа,Испания,Бланес +882 882 34 Европа,Испания,Валенсия +3070 3070 34 Европа,Испания,Ибица +888 888 34 Европа,Испания,Кадис +886 886 34 Европа,Испания,Картахена +891 891 34 Европа,Испания,Ла-Корунья +3310 3310 34 Европа,Испания,Лорет де Мар +883 883 34 Европа,Испания,Мадрид +884 884 34 Европа,Испания,Малага +885 885 34 Европа,Испания,Марбелья +892 892 34 Европа,Испания,Овьедо +3179 3179 34 Европа,Испания,Пальма де Майорка +3177 3177 34 Европа,Испания,Сан-Агустин +3289 3289 34 Европа,Испания,Санта-Крус-де-Тенерифе +889 889 34 Европа,Испания,Сарагоса +887 887 34 Европа,Испания,Севилья +893 893 34 Европа,Испания,Хихон +2522 2522 34 Европа,Испания,Другое +52 0 52 Европа,Италия +3318 3318 52 Европа,Италия,Аоста +3278 3278 52 Европа,Италия,Беллариа +906 906 52 Европа,Италия,Болонья +894 894 52 Европа,Италия,Брешиа +895 895 52 Европа,Италия,Венеция +905 905 52 Европа,Италия,Верона +896 896 52 Европа,Италия,Генуя +897 897 52 Европа,Италия,Лекко +3369 3369 52 Европа,Италия,Ливорно +3327 3327 52 Европа,Италия,Марсала +898 898 52 Европа,Италия,Милан +899 899 52 Европа,Италия,Модена +907 907 52 Европа,Италия,Неаполь +908 908 52 Европа,Италия,Перуджа +900 900 52 Европа,Италия,Пиза +901 901 52 Европа,Италия,Рим +3368 3368 52 Европа,Италия,Сан-Ремо +3384 3384 52 Европа,Италия,Сиракуза +3252 3252 52 Европа,Италия,Терамо +902 902 52 Европа,Италия,Триест +903 903 52 Европа,Италия,Турин +3130 3130 52 Европа,Италия,Фано +904 904 52 Европа,Италия,Флоренция +2521 2521 52 Европа,Италия,Другое +53 0 53 Европа,Латвия +2939 2939 53 Европа,Латвия,Айзкраукле +3054 3054 53 Европа,Латвия,Валка +909 909 53 Европа,Латвия,Даугавпилс +2934 2934 53 Европа,Латвия,Екабпилс +913 913 53 Европа,Латвия,Елгава +2935 2935 53 Европа,Латвия,Кокнесе +912 912 53 Европа,Латвия,Лиепая +2905 2905 53 Европа,Латвия,Резекне +911 911 53 Европа,Латвия,Рига +2936 2936 53 Европа,Латвия,Саласпилс +2937 2937 53 Европа,Латвия,Смилтене +910 910 53 Европа,Латвия,Юрмала +2520 2520 53 Европа,Латвия,Другое +54 0 54 Европа,Литва +914 914 54 Европа,Литва,Вильнюс +915 915 54 Европа,Литва,Висагинас +916 916 54 Европа,Литва,Каунас +918 918 54 Европа,Литва,Клайпеда +919 919 54 Европа,Литва,Паланга +3173 3173 54 Европа,Литва,Пеневежис +917 917 54 Европа,Литва,Шауляй +2519 2519 54 Европа,Литва,Другое +55 0 55 Европа,Лихтенштейн +920 920 55 Европа,Лихтенштейн,Вадуц +2518 2518 55 Европа,Лихтенштейн,Другое +56 0 56 Европа,Люксембург +3376 3376 56 Европа,Люксембург,Бетцдорф +921 921 56 Европа,Люксембург,Люксембург +2517 2517 56 Европа,Люксембург,Другое +57 0 57 Европа,Македония +3142 3142 57 Европа,Македония,Битола +922 922 57 Европа,Македония,Скопье +2516 2516 57 Европа,Македония,Другое +58 0 58 Европа,Мальта +923 923 58 Европа,Мальта,Валлетта +3154 3154 58 Европа,Мальта,Мзида +924 924 58 Европа,Мальта,Слима +2515 2515 58 Европа,Мальта,Другое +59 0 59 Европа,Молдавия +925 925 59 Европа,Молдавия,Бельцы +926 926 59 Европа,Молдавия,Бендеры +3234 3234 59 Европа,Молдавия,Дубоссары +3275 3275 59 Европа,Молдавия,Кахул +927 927 59 Европа,Молдавия,Кишинев +3321 3321 59 Европа,Молдавия,Резина +928 928 59 Европа,Молдавия,Рыбница +929 929 59 Европа,Молдавия,Тирасполь +3281 3281 59 Европа,Молдавия,Чадыр-Лунга +2514 2514 59 Европа,Молдавия,Другое +36 0 36 Европа,Монако +930 930 36 Европа,Монако,Монте-Карло +2513 2513 36 Европа,Монако,Другое +60 0 60 Европа,Нидерланды +931 931 60 Европа,Нидерланды,Амстердам +933 933 60 Европа,Нидерланды,Бреда +932 932 60 Европа,Нидерланды,Гаага +934 934 60 Европа,Нидерланды,Гауда +935 935 60 Европа,Нидерланды,Делфт +2977 2977 60 Европа,Нидерланды,Донген +3030 3030 60 Европа,Нидерланды,Зволле +3091 3091 60 Европа,Нидерланды,Ниймеген +936 936 60 Европа,Нидерланды,Роттердам +937 937 60 Европа,Нидерланды,Утрехт +3044 3044 60 Европа,Нидерланды,Эйндховен +3380 3380 60 Европа,Нидерланды,Эншеде +2512 2512 60 Европа,Нидерланды,Другое +61 0 61 Европа,Норвегия +3190 3190 61 Европа,Норвегия,Кристиансанд +2857 2857 61 Европа,Норвегия,Лиллехаммер +938 938 61 Европа,Норвегия,Осло +3355 3355 61 Европа,Норвегия,Ставангер +939 939 61 Европа,Норвегия,Тронхейм +2511 2511 61 Европа,Норвегия,Другое +3195 0 3195 Европа,Остров Мэн (Брит.) +62 0 62 Европа,Польша +940 940 62 Европа,Польша,Белосток +941 941 62 Европа,Польша,Варшава +3164 3164 62 Европа,Польша,Вроцлав +942 942 62 Европа,Польша,Гданьск +943 943 62 Европа,Польша,Гливице +3237 3237 62 Европа,Польша,Закопане +3165 3165 62 Европа,Польша,Зелена Гура +944 944 62 Европа,Польша,Катовице +945 945 62 Европа,Польша,Краков +3008 3008 62 Европа,Польша,Лодзь +3150 3150 62 Европа,Польша,Ольштын +946 946 62 Европа,Польша,Познань +947 947 62 Европа,Польша,Радом +948 948 62 Европа,Польша,Сопот +2958 2958 62 Европа,Польша,Тыхы +2510 2510 62 Европа,Польша,Другое +35 0 35 Европа,Португалия +949 949 35 Европа,Португалия,Лиссабон +950 950 35 Европа,Португалия,Порто +2509 2509 35 Европа,Португалия,Другое +63 0 63 Европа,Румыния +952 952 63 Европа,Румыния,Брашов +951 951 63 Европа,Румыния,Бухарест +954 954 63 Европа,Румыния,Констанца +955 955 63 Европа,Румыния,Плоешти +953 953 63 Европа,Румыния,Яссы +2508 2508 63 Европа,Румыния,Другое +64 0 64 Европа,Сан-Марино +956 956 64 Европа,Сан-Марино,Сан-Марино +2507 2507 64 Европа,Сан-Марино,Другое +74 0 74 Европа,Сербия и Черногория +957 957 74 Европа,Сербия и Черногория,Белград +960 960 74 Европа,Сербия и Черногория,Ниш +958 958 74 Европа,Сербия и Черногория,Нови-Сад +959 959 74 Европа,Сербия и Черногория,Сараево +2506 2506 74 Европа,Сербия и Черногория,Другое +65 0 65 Европа,Словакия +961 961 65 Европа,Словакия,Братислава +962 962 65 Европа,Словакия,Кошице +3101 3101 65 Европа,Словакия,Липтов +963 963 65 Европа,Словакия,Попрад +964 964 65 Европа,Словакия,Прешов +965 965 65 Европа,Словакия,Ружемберок +966 966 65 Европа,Словакия,Тврдошин +2505 2505 65 Европа,Словакия,Другое +66 0 66 Европа,Словения +968 968 66 Европа,Словения,Копар +967 967 66 Европа,Словения,Любляна +969 969 66 Европа,Словения,Марибор +2504 2504 66 Европа,Словения,Другое +67 0 67 Европа,Фарерские о-ва (Дания) +970 970 67 Европа,Фарерские о-ва (Дания),Торсхавн +2503 2503 67 Европа,Фарерские о-ва (Дания),Другое +68 0 68 Европа,Финляндия +2888 2888 68 Европа,Финляндия,Вантаа +971 971 68 Европа,Финляндия,Васа +979 979 68 Европа,Финляндия,Котка +972 972 68 Европа,Финляндия,Коувола +980 980 68 Европа,Финляндия,Лахти +973 973 68 Европа,Финляндия,Оулу +3375 3375 68 Европа,Финляндия,Риихимяки +3159 3159 68 Европа,Финляндия,Руовеси +974 974 68 Европа,Финляндия,Тампере +975 975 68 Европа,Финляндия,Турку +976 976 68 Европа,Финляндия,Хельсинки +977 977 68 Европа,Финляндия,Эспо +978 978 68 Европа,Финляндия,Ювяскюля +2502 2502 68 Европа,Финляндия,Другое +37 0 37 Европа,Франция +996 996 37 Европа,Франция,Авиньон +983 983 37 Европа,Франция,Бержерак +997 997 37 Европа,Франция,Блуа +984 984 37 Европа,Франция,Бордо +998 998 37 Европа,Франция,Дижон +987 987 37 Европа,Франция,Канн +988 988 37 Европа,Франция,Кастр +993 993 37 Европа,Франция,Клермон-Ферран +3037 3037 37 Европа,Франция,Лилль +989 989 37 Европа,Франция,Лион +985 985 37 Европа,Франция,Марсель +991 991 37 Европа,Франция,Мец +3161 3161 37 Европа,Франция,Мобеж +990 990 37 Европа,Франция,Нанси +994 994 37 Европа,Франция,Нант +995 995 37 Европа,Франция,Ницца +999 999 37 Европа,Франция,Орлеан +981 981 37 Европа,Франция,Париж +3374 3374 37 Европа,Франция,Перпиньян +992 992 37 Европа,Франция,Руан +982 982 37 Европа,Франция,Страсбург +986 986 37 Европа,Франция,Тулуза +3314 3314 37 Европа,Франция,Шамбери +2501 2501 37 Европа,Франция,Другое +69 0 69 Европа,Хорватия +1003 1003 69 Европа,Хорватия,Дубровник +1000 1000 69 Европа,Хорватия,Загреб +1001 1001 69 Европа,Хорватия,Задар +1004 1004 69 Европа,Хорватия,Риека +1002 1002 69 Европа,Хорватия,Сплит +2500 2500 69 Европа,Хорватия,Другое +70 0 70 Европа,Чехия +1005 1005 70 Европа,Чехия,Брно +3291 3291 70 Европа,Чехия,Гавличкув-Брод +1007 1007 70 Европа,Чехия,Градец-Кралове +1008 1008 70 Европа,Чехия,Карлови-Вари +3019 3019 70 Европа,Чехия,Кладрубы +1010 1010 70 Европа,Чехия,Лоуни +1009 1009 70 Европа,Чехия,Острава +1015 1015 70 Европа,Чехия,Пльзень +3105 3105 70 Европа,Чехия,Правчицка Брана +1006 1006 70 Европа,Чехия,Прага +3246 3246 70 Европа,Чехия,Тачов +1011 1011 70 Европа,Чехия,Тршебич +1012 1012 70 Европа,Чехия,Усти-над-Лабем +1014 1014 70 Европа,Чехия,Ческе-Будеевице +1013 1013 70 Европа,Чехия,Яблонец-над-Нисоу +2499 2499 70 Европа,Чехия,Другое +71 0 71 Европа,Швейцария +1016 1016 71 Европа,Швейцария,Арау +1019 1019 71 Европа,Швейцария,Баден +1017 1017 71 Европа,Швейцария,Базель +1018 1018 71 Европа,Швейцария,Берн +1020 1020 71 Европа,Швейцария,Биль +1021 1021 71 Европа,Швейцария,Винтертур +1022 1022 71 Европа,Швейцария,Давос +3189 3189 71 Европа,Швейцария,Делемонт +1023 1023 71 Европа,Швейцария,Женева +1024 1024 71 Европа,Швейцария,Золотурн +1025 1025 71 Европа,Швейцария,Лозанна +1026 1026 71 Европа,Швейцария,Локарно +1027 1027 71 Европа,Швейцария,Лугано +1028 1028 71 Европа,Швейцария,Люцерн +1029 1029 71 Европа,Швейцария,Монтре +1030 1030 71 Европа,Швейцария,Цюрих +2498 2498 71 Европа,Швейцария,Другое +72 0 72 Европа,Швеция +2883 2883 72 Европа,Швеция,Арбога +1031 1031 72 Европа,Швеция,Гетеборг +1032 1032 72 Европа,Швеция,Кальмар +1037 1037 72 Европа,Швеция,Лахольм +1036 1036 72 Европа,Швеция,Лулео +1042 1042 72 Европа,Швеция,Лунд +1033 1033 72 Европа,Швеция,Мальме +1034 1034 72 Европа,Швеция,Стокгольм +1041 1041 72 Европа,Швеция,Умео +1039 1039 72 Европа,Швеция,Фалун +1043 1043 72 Европа,Швеция,Хельсинборг +1040 1040 72 Европа,Швеция,Хернесанд +1038 1038 72 Европа,Швеция,Эстерсунд +2497 2497 72 Европа,Швеция,Другое +3196 0 3196 Европа,Шпицберген (Норв.) +73 0 73 Европа,Эстония +3013 3013 73 Европа,Эстония,Валга +1044 1044 73 Европа,Эстония,Кейла +1045 1045 73 Европа,Эстония,Кохтла-Ярве +1046 1046 73 Европа,Эстония,Маарду +1047 1047 73 Европа,Эстония,Мыйзакюла +1048 1048 73 Европа,Эстония,Нарва +1049 1049 73 Европа,Эстония,Пярну +1050 1050 73 Европа,Эстония,Раквере +1051 1051 73 Европа,Эстония,Силламяэ +1052 1052 73 Европа,Эстония,Таллин +1053 1053 73 Европа,Эстония,Тарту +1054 1054 73 Европа,Эстония,Хаапсалу +2496 2496 73 Европа,Эстония,Другое diff --git a/MRA/Docs/region_m.txt b/MRA/Docs/region_m.txt new file mode 100644 index 0000000..4b199ea --- /dev/null +++ b/MRA/Docs/region_m.txt @@ -0,0 +1,3150 @@ +24 0 24 Россия +25 25 24 Россия,Москва +1734 25 24 Россия,Москва,г. Зеленоград +226 226 24 Россия,Санкт-Петербург +233 233 24 Россия,Саха (Якутия) +474 233 24 Россия,Саха (Якутия),Алдан +2809 233 24 Россия,Саха (Якутия),Верхоянск +2804 233 24 Россия,Саха (Якутия),Вилюйск +475 233 24 Россия,Саха (Якутия),Ленск +477 233 24 Россия,Саха (Якутия),Мирный +476 233 24 Россия,Саха (Якутия),Нерюнгри +2806 233 24 Россия,Саха (Якутия),Олекминск +3115 233 24 Россия,Саха (Якутия),Покровск +2808 233 24 Россия,Саха (Якутия),Среднеколымск +2807 233 24 Россия,Саха (Якутия),Томмот +2805 233 24 Россия,Саха (Якутия),Удачный +478 233 24 Россия,Саха (Якутия),Усть-Нера +479 233 24 Россия,Саха (Якутия),Якутск +2263 233 24 Россия,Саха (Якутия),Другое +232 232 24 Россия,Приморский край +2819 232 24 Россия,Приморский край,Арсеньев +464 232 24 Россия,Приморский край,Артем +465 232 24 Россия,Приморский край,Большой Камень +466 232 24 Россия,Приморский край,Владивосток +2817 232 24 Россия,Приморский край,Дальнегорск +2818 232 24 Россия,Приморский край,Дальнереченск +3359 232 24 Россия,Приморский край,Кавалерово +467 232 24 Россия,Приморский край,Камень-Рыболов +468 232 24 Россия,Приморский край,Лесозаводск +469 232 24 Россия,Приморский край,Лучегорск +470 232 24 Россия,Приморский край,Находка +471 232 24 Россия,Приморский край,Партизанск +472 232 24 Россия,Приморский край,Пластун +2816 232 24 Россия,Приморский край,Спасск-Дальний +473 232 24 Россия,Приморский край,Уссурийск +2258 232 24 Россия,Приморский край,Другое +235 235 24 Россия,Хабаровский край +487 235 24 Россия,Хабаровский край,Амурск +2821 235 24 Россия,Хабаровский край,Бикин +488 235 24 Россия,Хабаровский край,Ванино +2820 235 24 Россия,Хабаровский край,Вяземский +489 235 24 Россия,Хабаровский край,Комсомольск-на-Амуре +490 235 24 Россия,Хабаровский край,Николаевск-на-Амуре +491 235 24 Россия,Хабаровский край,Советская Гавань +3353 235 24 Россия,Хабаровский край,Солнечный +492 235 24 Россия,Хабаровский край,Хабаровск +2280 235 24 Россия,Хабаровский край,Другое +227 227 24 Россия,Амурская обл. +455 227 24 Россия,Амурская обл.,Белогорск +456 227 24 Россия,Амурская обл.,Благовещенск +2814 227 24 Россия,Амурская обл.,Завитинск +2813 227 24 Россия,Амурская обл.,Зея +2815 227 24 Россия,Амурская обл.,Райчихинск +2812 227 24 Россия,Амурская обл.,Свободный +2811 227 24 Россия,Амурская обл.,Сковородино +457 227 24 Россия,Амурская обл.,Тында +2217 227 24 Россия,Амурская обл.,Шимановск +2218 227 24 Россия,Амурская обл.,Другое +229 229 24 Россия,Камчатская обл. +460 229 24 Россия,Камчатская обл.,Елизово +2822 229 24 Россия,Камчатская обл.,Ключи +459 229 24 Россия,Камчатская обл.,Петропавловск-Камч. +2234 229 24 Россия,Камчатская обл.,Другое +231 231 24 Россия,Магаданская обл. +462 231 24 Россия,Магаданская обл.,Магадан +2823 231 24 Россия,Магаданская обл.,Сусуман +463 231 24 Россия,Магаданская обл.,Ягодное +2246 231 24 Россия,Магаданская обл.,Другое +234 234 24 Россия,Сахалинская обл. +480 234 24 Россия,Сахалинская обл.,Александровск-Сахалинский +2829 234 24 Россия,Сахалинская обл.,Анива +2833 234 24 Россия,Сахалинская обл.,Горнозаводск +2825 234 24 Россия,Сахалинская обл.,Долинск +481 234 24 Россия,Сахалинская обл.,Корсаков +482 234 24 Россия,Сахалинская обл.,Красногорск +2826 234 24 Россия,Сахалинская обл.,Курильск +2832 234 24 Россия,Сахалинская обл.,Лесогорск +2836 234 24 Россия,Сахалинская обл.,Макаров +2830 234 24 Россия,Сахалинская обл.,Невельск +483 234 24 Россия,Сахалинская обл.,Оха +2828 234 24 Россия,Сахалинская обл.,Поронайск +2824 234 24 Россия,Сахалинская обл.,Северо-Курильск +2827 234 24 Россия,Сахалинская обл.,Томари +2831 234 24 Россия,Сахалинская обл.,Углегорск +484 234 24 Россия,Сахалинская обл.,Холмск +2834 234 24 Россия,Сахалинская обл.,Чехов +2835 234 24 Россия,Сахалинская обл.,Шахтерск +485 234 24 Россия,Сахалинская обл.,Южно-Курильск +486 234 24 Россия,Сахалинская обл.,Южно-Сахалинск +2264 234 24 Россия,Сахалинская обл.,Другое +228 228 24 Россия,Еврейская АО +458 228 24 Россия,Еврейская АО,Биробиджан +2810 228 24 Россия,Еврейская АО,Облучье +2226 228 24 Россия,Еврейская АО,Другое +230 230 24 Россия,Корякский АО +461 230 24 Россия,Корякский АО,Полана +2239 230 24 Россия,Корякский АО,Другое +236 236 24 Россия,Чукотский АО +493 236 24 Россия,Чукотский АО,Анадырь +2287 236 24 Россия,Чукотский АО,Другое +237 237 24 Россия,Башкортостан +2850 237 24 Россия,Башкортостан,Агидель +2851 237 24 Россия,Башкортостан,Агидель +2657 237 24 Россия,Башкортостан,Баймак +2662 237 24 Россия,Башкортостан,Белебей +494 237 24 Россия,Башкортостан,Белорецк +2658 237 24 Россия,Башкортостан,Бирск +2660 237 24 Россия,Башкортостан,Благовещенск +2659 237 24 Россия,Башкортостан,Давлеканово +2663 237 24 Россия,Башкортостан,Дюртюли +495 237 24 Россия,Башкортостан,Ишимбай +496 237 24 Россия,Башкортостан,Кумертау +2655 237 24 Россия,Башкортостан,Мелеуз +497 237 24 Россия,Башкортостан,Нефтекамск +2654 237 24 Россия,Башкортостан,Октябрьский +499 237 24 Россия,Башкортостан,Салават +2656 237 24 Россия,Башкортостан,Сибай +498 237 24 Россия,Башкортостан,Стерлитамак +500 237 24 Россия,Башкортостан,Туймазы +2661 237 24 Россия,Башкортостан,Туймазы +501 237 24 Россия,Башкортостан,Уфа +502 237 24 Россия,Башкортостан,Учалы +2664 237 24 Россия,Башкортостан,Янаул +2220 237 24 Россия,Башкортостан,Другое +240 240 24 Россия,Марий-Эл +509 240 24 Россия,Марий-Эл,Волжск +510 240 24 Россия,Марий-Эл,Звенигово +511 240 24 Россия,Марий-Эл,Йошкар-Ола +512 240 24 Россия,Марий-Эл,Козьмодемьянск +2247 240 24 Россия,Марий-Эл,Другое +241 241 24 Россия,Мордовия +513 241 24 Россия,Мордовия,Зубова Поляна +2147 241 24 Россия,Мордовия,Инсар +2150 241 24 Россия,Мордовия,Ковылкино +2148 241 24 Россия,Мордовия,Краснослободск +2910 241 24 Россия,Мордовия,Лямбирь +515 241 24 Россия,Мордовия,Рузаевка +514 241 24 Россия,Мордовия,Саранск +2149 241 24 Россия,Мордовия,Темников +2923 241 24 Россия,Мордовия,Чамзинка +2248 241 24 Россия,Мордовия,Другое +248 248 24 Россия,Татарстан +2569 248 24 Россия,Татарстан,Агрыз +2575 248 24 Россия,Татарстан,Азнакаево +569 248 24 Россия,Татарстан,Альметьевск +570 248 24 Россия,Татарстан,Апастово +2571 248 24 Россия,Татарстан,Болгар +571 248 24 Россия,Татарстан,Бугульма +2570 248 24 Россия,Татарстан,Буинск +572 248 24 Россия,Татарстан,Джалиль +573 248 24 Россия,Татарстан,Елабуга +2576 248 24 Россия,Татарстан,Заинск +574 248 24 Россия,Татарстан,Зеленодольск +575 248 24 Россия,Татарстан,Казань +2577 248 24 Россия,Татарстан,Лениногорск +2572 248 24 Россия,Татарстан,Мамадыш +576 248 24 Россия,Татарстан,Менделеевск +2573 248 24 Россия,Татарстан,Мензелинск +577 248 24 Россия,Татарстан,Набережные Челны +578 248 24 Россия,Татарстан,Нижнекамск +579 248 24 Россия,Татарстан,Нурлат +2574 248 24 Россия,Татарстан,Тетюши +580 248 24 Россия,Татарстан,Чистополь +2271 248 24 Россия,Татарстан,Другое +249 249 24 Россия,Удмуртия +3311 249 24 Россия,Удмуртия,Вавож +581 249 24 Россия,Удмуртия,Воткинск +582 249 24 Россия,Удмуртия,Глазов +583 249 24 Россия,Удмуртия,Игра +584 249 24 Россия,Удмуртия,Ижевск +2665 249 24 Россия,Удмуртия,Камбарка +585 249 24 Россия,Удмуртия,Можга +586 249 24 Россия,Удмуртия,Сарапул +587 249 24 Россия,Удмуртия,Ува +2277 249 24 Россия,Удмуртия,Другое +251 251 24 Россия,Чувашия +2158 251 24 Россия,Чувашия,Алатырь +2156 251 24 Россия,Чувашия,Канаш +2151 251 24 Россия,Чувашия,Козловка +2152 251 24 Россия,Чувашия,Марьинский Посад +2155 251 24 Россия,Чувашия,Новочебоксарск +2153 251 24 Россия,Чувашия,Цивильск +592 251 24 Россия,Чувашия,Чебоксары +2157 251 24 Россия,Чувашия,Шумерля +2154 251 24 Россия,Чувашия,Ядрин +2286 251 24 Россия,Чувашия,Другое +238 238 24 Россия,Кировская обл. +2168 238 24 Россия,Кировская обл.,Белая Холуница +503 238 24 Россия,Кировская обл.,Вятские Поляны +2164 238 24 Россия,Кировская обл.,Зуевка +504 238 24 Россия,Кировская обл.,Киров +505 238 24 Россия,Кировская обл.,Кирово-Чепецк +2160 238 24 Россия,Кировская обл.,Кирс +506 238 24 Россия,Кировская обл.,Котельнич +2167 238 24 Россия,Кировская обл.,Луза +2159 238 24 Россия,Кировская обл.,Малмыж +2169 238 24 Россия,Кировская обл.,Мураши +2163 238 24 Россия,Кировская обл.,Нолинск +2170 238 24 Россия,Кировская обл.,Омутнинск +2166 238 24 Россия,Кировская обл.,Слободской +2165 238 24 Россия,Кировская обл.,Советск +2162 238 24 Россия,Кировская обл.,Сосновка +2171 238 24 Россия,Кировская обл.,Уржум +2161 238 24 Россия,Кировская обл.,Халтурин +507 238 24 Россия,Кировская обл.,Яранск +2237 238 24 Россия,Кировская обл.,Другое +242 242 24 Россия,Нижегородская обл. +516 242 24 Россия,Нижегородская обл.,Арзамас +517 242 24 Россия,Нижегородская обл.,Балахна +2139 242 24 Россия,Нижегородская обл.,Богородск +518 242 24 Россия,Нижегородская обл.,Бор +519 242 24 Россия,Нижегородская обл.,Вахтан +520 242 24 Россия,Нижегородская обл.,Ветлуга +2140 242 24 Россия,Нижегородская обл.,Володарск +2138 242 24 Россия,Нижегородская обл.,Ворсма +521 242 24 Россия,Нижегородская обл.,Выкса +2137 242 24 Россия,Нижегородская обл.,Горбатов +522 242 24 Россия,Нижегородская обл.,Городец +523 242 24 Россия,Нижегородская обл.,Дзержинск +524 242 24 Россия,Нижегородская обл.,Заволжье +2891 242 24 Россия,Нижегородская обл.,Ильиногорск +525 242 24 Россия,Нижегородская обл.,Кстово +2145 242 24 Россия,Нижегородская обл.,Кулебаки +2143 242 24 Россия,Нижегородская обл.,Лукоянов +2144 242 24 Россия,Нижегородская обл.,Лысково +2146 242 24 Россия,Нижегородская обл.,Навашино +526 242 24 Россия,Нижегородская обл.,Нижний Новгород +527 242 24 Россия,Нижегородская обл.,Павлово +2135 242 24 Россия,Нижегородская обл.,Первомайск +528 242 24 Россия,Нижегородская обл.,Саров +529 242 24 Россия,Нижегородская обл.,Семенов +530 242 24 Россия,Нижегородская обл.,Сергач +2141 242 24 Россия,Нижегородская обл.,Урень +2136 242 24 Россия,Нижегородская обл.,Чкаловск +2897 242 24 Россия,Нижегородская обл.,Шатки +2142 242 24 Россия,Нижегородская обл.,Шахунья +2251 242 24 Россия,Нижегородская обл.,Другое +243 243 24 Россия,Оренбургская обл. +2678 243 24 Россия,Оренбургская обл.,Абдулино +2673 243 24 Россия,Оренбургская обл.,Бугуруслан +531 243 24 Россия,Оренбургская обл.,Бузулук +532 243 24 Россия,Оренбургская обл.,Гай +2674 243 24 Россия,Оренбургская обл.,Кувандык +2675 243 24 Россия,Оренбургская обл.,Медногорск +533 243 24 Россия,Оренбургская обл.,Новотроицк +535 243 24 Россия,Оренбургская обл.,Оренбург +536 243 24 Россия,Оренбургская обл.,Орск +3360 243 24 Россия,Оренбургская обл.,Саракташ +2677 243 24 Россия,Оренбургская обл.,Соль-Илецк +2676 243 24 Россия,Оренбургская обл.,Сорочинск +537 243 24 Россия,Оренбургская обл.,Тоцкое +538 243 24 Россия,Оренбургская обл.,Ясный +2254 243 24 Россия,Оренбургская обл.,Другое +244 244 24 Россия,Пензенская обл. +539 244 24 Россия,Пензенская обл.,Беднодемьяновск +2597 244 24 Россия,Пензенская обл.,Белинский +2595 244 24 Россия,Пензенская обл.,Городище +2593 244 24 Россия,Пензенская обл.,Каменка +540 244 24 Россия,Пензенская обл.,Кузнецк +2598 244 24 Россия,Пензенская обл.,Нижний Ломов +2592 244 24 Россия,Пензенская обл.,Никольск +541 244 24 Россия,Пензенская обл.,Пенза +3304 244 24 Россия,Пензенская обл.,Русский Камешкир +2596 244 24 Россия,Пензенская обл.,Сердобск +2594 244 24 Россия,Пензенская обл.,Сурск +2256 244 24 Россия,Пензенская обл.,Другое +245 245 24 Россия,Пермская обл. +2690 245 24 Россия,Пермская обл.,Александровск +542 245 24 Россия,Пермская обл.,Березники +2679 245 24 Россия,Пермская обл.,Верещагино +2680 245 24 Россия,Пермская обл.,Горнозаводск +2687 245 24 Россия,Пермская обл.,Гремячинск +2686 245 24 Россия,Пермская обл.,Губаха +543 245 24 Россия,Пермская обл.,Добрянка +544 245 24 Россия,Пермская обл.,Кизел +2681 245 24 Россия,Пермская обл.,Красновишерск +545 245 24 Россия,Пермская обл.,Краснокамск +546 245 24 Россия,Пермская обл.,Кунгур +547 245 24 Россия,Пермская обл.,Лысьва +548 245 24 Россия,Пермская обл.,Нытва +2683 245 24 Россия,Пермская обл.,Оса +2684 245 24 Россия,Пермская обл.,Оханск +2682 245 24 Россия,Пермская обл.,Очер +549 245 24 Россия,Пермская обл.,Пермь +550 245 24 Россия,Пермская обл.,Соликамск +2685 245 24 Россия,Пермская обл.,Усолье +551 245 24 Россия,Пермская обл.,Чайковский +2689 245 24 Россия,Пермская обл.,Чердынь +2688 245 24 Россия,Пермская обл.,Чермоз +552 245 24 Россия,Пермская обл.,Чернушка +553 245 24 Россия,Пермская обл.,Чусовой +2257 245 24 Россия,Пермская обл.,Другое +246 246 24 Россия,Самарская обл. +554 246 24 Россия,Самарская обл.,Волжский +555 246 24 Россия,Самарская обл.,Жигулевск +2599 246 24 Россия,Самарская обл.,Кинель +3293 246 24 Россия,Самарская обл.,Красный Яр +2602 246 24 Россия,Самарская обл.,Нефтегорск +556 246 24 Россия,Самарская обл.,Новокуйбышевск +2600 246 24 Россия,Самарская обл.,Октябрьск +557 246 24 Россия,Самарская обл.,Отрадный +558 246 24 Россия,Самарская обл.,Похвистнево +559 246 24 Россия,Самарская обл.,Самара +560 246 24 Россия,Самарская обл.,Сызрань +561 246 24 Россия,Самарская обл.,Тольятти +2601 246 24 Россия,Самарская обл.,Чапаевск +562 246 24 Россия,Самарская обл.,Шигоны +2261 246 24 Россия,Самарская обл.,Другое +247 247 24 Россия,Саратовская обл. +2613 247 24 Россия,Саратовская обл.,Аркадак +2606 247 24 Россия,Саратовская обл.,Аткарск +563 247 24 Россия,Саратовская обл.,Балаково +564 247 24 Россия,Саратовская обл.,Балашов +565 247 24 Россия,Саратовская обл.,Вольск +2608 247 24 Россия,Саратовская обл.,Ершов +2607 247 24 Россия,Саратовская обл.,Калининск +2609 247 24 Россия,Саратовская обл.,Красноармейск +2610 247 24 Россия,Саратовская обл.,Красный Кут +2605 247 24 Россия,Саратовская обл.,Маркс +566 247 24 Россия,Саратовская обл.,Новоузенск +2603 247 24 Россия,Саратовская обл.,Петровск +2604 247 24 Россия,Саратовская обл.,Пугачев +2612 247 24 Россия,Саратовская обл.,Ртищево +567 247 24 Россия,Саратовская обл.,Саратов +2611 247 24 Россия,Саратовская обл.,Хвалынск +568 247 24 Россия,Саратовская обл.,Энгельс +3267 247 24 Россия,Саратовская обл.,Энгельс-12 +2262 247 24 Россия,Саратовская обл.,Другое +250 250 24 Россия,Ульяновская обл. +2614 250 24 Россия,Ульяновская обл.,Барыш +588 250 24 Россия,Ульяновская обл.,Димитровград +2615 250 24 Россия,Ульяновская обл.,Инза +589 250 24 Россия,Ульяновская обл.,Новоспасское +2616 250 24 Россия,Ульяновская обл.,Новоульяновск +590 250 24 Россия,Ульяновская обл.,Сенгилей +591 250 24 Россия,Ульяновская обл.,Ульяновск +2278 250 24 Россия,Ульяновская обл.,Другое +239 239 24 Россия,Коми-Пермяцкий АО +508 239 24 Россия,Коми-Пермяцкий АО,Кудымкар +2238 239 24 Россия,Коми-Пермяцкий АО,Другое +255 255 24 Россия,Карелия +1355 255 24 Россия,Карелия,Беломорск +1356 255 24 Россия,Карелия,Кемь +1357 255 24 Россия,Карелия,Кондопога +1358 255 24 Россия,Карелия,Костомукша +1359 255 24 Россия,Карелия,Коткозеро +1360 255 24 Россия,Карелия,Лахденпохья +1362 255 24 Россия,Карелия,Лоухи +1361 255 24 Россия,Карелия,Медвежьегорск +3286 255 24 Россия,Карелия,Муезерский +1937 255 24 Россия,Карелия,Олонец +1363 255 24 Россия,Карелия,Петрозаводск +1938 255 24 Россия,Карелия,Питкяранта +3287 255 24 Россия,Карелия,Пряжа +1936 255 24 Россия,Карелия,Пудож +1364 255 24 Россия,Карелия,Сегежа +1365 255 24 Россия,Карелия,Сортавала +1939 255 24 Россия,Карелия,Суоярви +2201 255 24 Россия,Карелия,Другое +256 256 24 Россия,Коми +1366 256 24 Россия,Коми,Воркута +1367 256 24 Россия,Коми,Вуктыл +2202 256 24 Россия,Коми,Емва +1368 256 24 Россия,Коми,Инта +1940 256 24 Россия,Коми,Микунь +1369 256 24 Россия,Коми,Печора +1941 256 24 Россия,Коми,Сосногорск +1370 256 24 Россия,Коми,Сыктывкар +1371 256 24 Россия,Коми,Усинск +1372 256 24 Россия,Коми,Ухта +2203 256 24 Россия,Коми,Другое +252 252 24 Россия,Архангельская обл. +593 252 24 Россия,Архангельская обл.,Архангельск +594 252 24 Россия,Архангельская обл.,Вельск +1945 252 24 Россия,Архангельская обл.,Каргополь +595 252 24 Россия,Архангельская обл.,Коряжма +596 252 24 Россия,Архангельская обл.,Котлас +1944 252 24 Россия,Архангельская обл.,Мезень +597 252 24 Россия,Архангельская обл.,Мирный +598 252 24 Россия,Архангельская обл.,Новодвинск +1946 252 24 Россия,Архангельская обл.,Няндома +599 252 24 Россия,Архангельская обл.,Онега +600 252 24 Россия,Архангельская обл.,Пинега +601 252 24 Россия,Архангельская обл.,Северодвинск +1942 252 24 Россия,Архангельская обл.,Сольвычегодск +3239 252 24 Россия,Архангельская обл.,Холмогоры +1943 252 24 Россия,Архангельская обл.,Шенкурск +2204 252 24 Россия,Архангельская обл.,Другое +253 253 24 Россия,Вологодская обл. +1950 253 24 Россия,Вологодская обл.,Бабаево +1949 253 24 Россия,Вологодская обл.,Белозерск +1338 253 24 Россия,Вологодская обл.,Великий Устюг +1339 253 24 Россия,Вологодская обл.,Вологда +1951 253 24 Россия,Вологодская обл.,Вытегра +1340 253 24 Россия,Вологодская обл.,Грязовец +1952 253 24 Россия,Вологодская обл.,Кадников +2871 253 24 Россия,Вологодская обл.,Кадуй +1341 253 24 Россия,Вологодская обл.,Кириллов +1955 253 24 Россия,Вологодская обл.,Красавино +1342 253 24 Россия,Вологодская обл.,Михайловка +1947 253 24 Россия,Вологодская обл.,Никольск +1343 253 24 Россия,Вологодская обл.,Сокол +1953 253 24 Россия,Вологодская обл.,Тотьма +1954 253 24 Россия,Вологодская обл.,Устюжна +1948 253 24 Россия,Вологодская обл.,Харовск +1344 253 24 Россия,Вологодская обл.,Череповец +2205 253 24 Россия,Вологодская обл.,Другое +254 254 24 Россия,Калининградская обл. +2838 254 24 Россия,Калининградская обл.,Багратионовск +1345 254 24 Россия,Калининградская обл.,Балтийск +2846 254 24 Россия,Калининградская обл.,Гвардейск +2843 254 24 Россия,Калининградская обл.,Гурьевск +1346 254 24 Россия,Калининградская обл.,Гусев +1347 254 24 Россия,Калининградская обл.,Зеленоградск +1348 254 24 Россия,Калининградская обл.,Калининград +2842 254 24 Россия,Калининградская обл.,Краснознаменск +2845 254 24 Россия,Калининградская обл.,Ладушкин +2848 254 24 Россия,Калининградская обл.,Мамоново +2837 254 24 Россия,Калининградская обл.,Неман +2844 254 24 Россия,Калининградская обл.,Нестеров +1349 254 24 Россия,Калининградская обл.,Озерск +2841 254 24 Россия,Калининградская обл.,Полесск +2839 254 24 Россия,Калининградская обл.,Правдинск +1350 254 24 Россия,Калининградская обл.,Приморск +1351 254 24 Россия,Калининградская обл.,Светлогорск +1352 254 24 Россия,Калининградская обл.,Светлый +2840 254 24 Россия,Калининградская обл.,Славск +1353 254 24 Россия,Калининградская обл.,Советск +1354 254 24 Россия,Калининградская обл.,Черняховск +2231 254 24 Россия,Калининградская обл.,Другое +257 257 24 Россия,Ленинградская обл. +1985 257 24 Россия,Ленинградская обл.,Бокситогорск +1374 257 24 Россия,Ленинградская обл.,Волхов +1373 257 24 Россия,Ленинградская обл.,Всеволожск +1375 257 24 Россия,Ленинградская обл.,Выборг +1995 257 24 Россия,Ленинградская обл.,Высоцк +1376 257 24 Россия,Ленинградская обл.,Гатчина +1378 257 24 Россия,Ленинградская обл.,Ивангород +1993 257 24 Россия,Ленинградская обл.,Каменногорск +1379 257 24 Россия,Ленинградская обл.,Кингисепп +1380 257 24 Россия,Ленинградская обл.,Кириши +1381 257 24 Россия,Ленинградская обл.,Кировск +1384 257 24 Россия,Ленинградская обл.,Кузьмоловский +1984 257 24 Россия,Ленинградская обл.,Лодейное Поле +1990 257 24 Россия,Ленинградская обл.,Луга +1994 257 24 Россия,Ленинградская обл.,Любань +1386 257 24 Россия,Ленинградская обл.,Никольское +1987 257 24 Россия,Ленинградская обл.,Новая Ладога +1996 257 24 Россия,Ленинградская обл.,Отрадное +1986 257 24 Россия,Ленинградская обл.,Пикалево +1983 257 24 Россия,Ленинградская обл.,Подпорожье +1992 257 24 Россия,Ленинградская обл.,Приморск +1988 257 24 Россия,Ленинградская обл.,Приозерск +3071 257 24 Россия,Ленинградская обл.,Пушкин +1989 257 24 Россия,Ленинградская обл.,Светогорск +1389 257 24 Россия,Ленинградская обл.,Сертолово +1991 257 24 Россия,Ленинградская обл.,Сланцы +1391 257 24 Россия,Ленинградская обл.,Сосновый Бор +1392 257 24 Россия,Ленинградская обл.,Тихвин +1393 257 24 Россия,Ленинградская обл.,Тосно +1394 257 24 Россия,Ленинградская обл.,Шлиссельбург +2207 257 24 Россия,Ленинградская обл.,Другое +258 258 24 Россия,Мурманская обл. +1395 258 24 Россия,Мурманская обл.,Апатиты +1959 258 24 Россия,Мурманская обл.,Заполярный +1396 258 24 Россия,Мурманская обл.,Зареченск +1397 258 24 Россия,Мурманская обл.,Кандалакша +1398 258 24 Россия,Мурманская обл.,Кировск +1399 258 24 Россия,Мурманская обл.,Ковдор +1958 258 24 Россия,Мурманская обл.,Кола +1400 258 24 Россия,Мурманская обл.,Мончегорск +1401 258 24 Россия,Мурманская обл.,Мурманск +1402 258 24 Россия,Мурманская обл.,Мурмаши +1403 258 24 Россия,Мурманская обл.,Оленегорск +1404 258 24 Россия,Мурманская обл.,Полярные Зори +1956 258 24 Россия,Мурманская обл.,Полярный +1957 258 24 Россия,Мурманская обл.,Североморск +3288 258 24 Россия,Мурманская обл.,Снежногорск +2206 258 24 Россия,Мурманская обл.,Другое +260 260 24 Россия,Новгородская обл. +1406 260 24 Россия,Новгородская обл.,Батецкий +2001 260 24 Россия,Новгородская обл.,Боровичи +2003 260 24 Россия,Новгородская обл.,Валдай +1407 260 24 Россия,Новгородская обл.,Великий Новгород +1408 260 24 Россия,Новгородская обл.,Крестцы +2002 260 24 Россия,Новгородская обл.,Малая Вишера +1409 260 24 Россия,Новгородская обл.,Окуловка +2000 260 24 Россия,Новгородская обл.,Пестово +1997 260 24 Россия,Новгородская обл.,Сольцы +1410 260 24 Россия,Новгородская обл.,Старая Русса +1998 260 24 Россия,Новгородская обл.,Холм +1999 260 24 Россия,Новгородская обл.,Чудово +2208 260 24 Россия,Новгородская обл.,Другое +261 261 24 Россия,Псковская обл. +1412 261 24 Россия,Псковская обл.,Великие Луки +2004 261 24 Россия,Псковская обл.,Гдов +2009 261 24 Россия,Псковская обл.,Дно +2005 261 24 Россия,Псковская обл.,Невель +1413 261 24 Россия,Псковская обл.,Новоржев +2006 261 24 Россия,Псковская обл.,Опочка +2008 261 24 Россия,Псковская обл.,Остров +1414 261 24 Россия,Псковская обл.,Печоры +1415 261 24 Россия,Псковская обл.,Порхов +1411 261 24 Россия,Псковская обл.,Псков +1416 261 24 Россия,Псковская обл.,Пустошка +2007 261 24 Россия,Псковская обл.,Пыталово +1417 261 24 Россия,Псковская обл.,Себеж +2209 261 24 Россия,Псковская обл.,Другое +259 259 24 Россия,Ненецкий АО +1405 259 24 Россия,Ненецкий АО,Нарьян-Мар +2250 259 24 Россия,Ненецкий АО,Другое +265 265 24 Россия,Бурятия +2764 265 24 Россия,Бурятия,Бабушкин +2760 265 24 Россия,Бурятия,Гусиноозерск +2762 265 24 Россия,Бурятия,Закаменск +2763 265 24 Россия,Бурятия,Кяхта +2761 265 24 Россия,Бурятия,Северобайкальск +1446 265 24 Россия,Бурятия,Улан-Удэ +2222 265 24 Россия,Бурятия,Другое +263 263 24 Россия,Республика Алтай +1439 263 24 Россия,Республика Алтай,Горно-Алтайск +2215 263 24 Россия,Республика Алтай,Другое +273 273 24 Россия,Тыва +2766 273 24 Россия,Тыва,Ак-Довурак +1494 273 24 Россия,Тыва,Кызыл +2768 273 24 Россия,Тыва,Новый Шагонар +2767 273 24 Россия,Тыва,Туран +2765 273 24 Россия,Тыва,Чадан +2275 273 24 Россия,Тыва,Другое +275 275 24 Россия,Хакасия +2769 275 24 Россия,Хакасия,Абаза +1496 275 24 Россия,Хакасия,Абакан +1497 275 24 Россия,Хакасия,Саяногорск +2770 275 24 Россия,Хакасия,Сорск +2771 275 24 Россия,Хакасия,Черногорск +2281 275 24 Россия,Хакасия,Другое +264 264 24 Россия,Алтайский край +1440 264 24 Россия,Алтайский край,Алейск +1441 264 24 Россия,Алтайский край,Барнаул +1442 264 24 Россия,Алтайский край,Белокуриха +1443 264 24 Россия,Алтайский край,Бийск +2728 264 24 Россия,Алтайский край,Горняк +2731 264 24 Россия,Алтайский край,Заринск +2729 264 24 Россия,Алтайский край,Змеиногорск +2732 264 24 Россия,Алтайский край,Камень-на-Оби +3292 264 24 Россия,Алтайский край,Кулунда +2730 264 24 Россия,Алтайский край,Новоалтайск +1444 264 24 Россия,Алтайский край,Рубцовск +1445 264 24 Россия,Алтайский край,Славгород +3231 264 24 Россия,Алтайский край,Яровое +2216 264 24 Россия,Алтайский край,Другое +268 268 24 Россия,Красноярский край +2781 268 24 Россия,Красноярский край,Артемовск +1469 268 24 Россия,Красноярский край,Ачинск +2784 268 24 Россия,Красноярский край,Боготол +2773 268 24 Россия,Красноярский край,Бородино +2774 268 24 Россия,Красноярский край,Дивногорск +3122 268 24 Россия,Красноярский край,Емельяновск +2772 268 24 Россия,Красноярский край,Енисейск +3294 268 24 Россия,Красноярский край,Железногорск +2777 268 24 Россия,Красноярский край,Заозерный +1470 268 24 Россия,Красноярский край,Игарка +2778 268 24 Россия,Красноярский край,Иланский +2782 268 24 Россия,Красноярский край,Канск +2783 268 24 Россия,Красноярский край,Кодинский +1471 268 24 Россия,Красноярский край,Красноярск +1472 268 24 Россия,Красноярский край,Лесосибирск +1473 268 24 Россия,Красноярский край,Минусинск +2775 268 24 Россия,Красноярский край,Назарово +2776 268 24 Россия,Красноярский край,Сосновоборск +2780 268 24 Россия,Красноярский край,Ужур +2779 268 24 Россия,Красноярский край,Уяр +2785 268 24 Россия,Красноярский край,Шарыпово +1474 268 24 Россия,Красноярский край,Шушенское +2242 268 24 Россия,Красноярский край,Другое +266 266 24 Россия,Иркутская обл. +2792 266 24 Россия,Иркутская обл.,Алзамай +1447 266 24 Россия,Иркутская обл.,Ангарск +1448 266 24 Россия,Иркутская обл.,Байкальск +2791 266 24 Россия,Иркутская обл.,Бирюсинск +1450 266 24 Россия,Иркутская обл.,Бодайбо +1451 266 24 Россия,Иркутская обл.,Братск +2793 266 24 Россия,Иркутская обл.,Вихоревка +2789 266 24 Россия,Иркутская обл.,Железногорск-Илимский +2786 266 24 Россия,Иркутская обл.,Зима +1452 266 24 Россия,Иркутская обл.,Иркутск +2794 266 24 Россия,Иркутская обл.,Киренск +2787 266 24 Россия,Иркутская обл.,Нижнеудинск +1449 266 24 Россия,Иркутская обл.,Саянск +2790 266 24 Россия,Иркутская обл.,Свирск +1453 266 24 Россия,Иркутская обл.,Слюдянка +2788 266 24 Россия,Иркутская обл.,Тайшет +1454 266 24 Россия,Иркутская обл.,Тулун +1455 266 24 Россия,Иркутская обл.,Усолье-Сибирское +2908 266 24 Россия,Иркутская обл.,Усольск +1456 266 24 Россия,Иркутская обл.,Усть-Илимск +1457 266 24 Россия,Иркутская обл.,Усть-Кут +1458 266 24 Россия,Иркутская обл.,Хужир +1459 266 24 Россия,Иркутская обл.,Черемхово +2795 266 24 Россия,Иркутская обл.,Шелехов +2229 266 24 Россия,Иркутская обл.,Другое +267 267 24 Россия,Кемеровская обл. +2737 267 24 Россия,Кемеровская обл.,Анжеро-Суджинск +2740 267 24 Россия,Кемеровская обл.,Белово +2746 267 24 Россия,Кемеровская обл.,Березовский +2739 267 24 Россия,Кемеровская обл.,Гурьевск +2742 267 24 Россия,Кемеровская обл.,Калтан +1460 267 24 Россия,Кемеровская обл.,Кемерово +1461 267 24 Россия,Кемеровская обл.,Киселевск +2738 267 24 Россия,Кемеровская обл.,Ленинск-Кузнецкий +2745 267 24 Россия,Кемеровская обл.,Мариинск +1462 267 24 Россия,Кемеровская обл.,Междуреченск +1463 267 24 Россия,Кемеровская обл.,Мыски +1464 267 24 Россия,Кемеровская обл.,Новокузнецк +2744 267 24 Россия,Кемеровская обл.,Осинники +3358 267 24 Россия,Кемеровская обл.,Полысаево +1465 267 24 Россия,Кемеровская обл.,Прокопьевск +1466 267 24 Россия,Кемеровская обл.,Салаир +2743 267 24 Россия,Кемеровская обл.,Тайга +2741 267 24 Россия,Кемеровская обл.,Таштагол +1467 267 24 Россия,Кемеровская обл.,Топки +1468 267 24 Россия,Кемеровская обл.,Юрга +2236 267 24 Россия,Кемеровская обл.,Другое +269 269 24 Россия,Новосибирская обл. +1475 269 24 Россия,Новосибирская обл.,Баган +1476 269 24 Россия,Новосибирская обл.,Барабинск +1477 269 24 Россия,Новосибирская обл.,Бердск +2750 269 24 Россия,Новосибирская обл.,Болотное +1478 269 24 Россия,Новосибирская обл.,Искитим +2752 269 24 Россия,Новосибирская обл.,Карасук +2751 269 24 Россия,Новосибирская обл.,Каргат +3107 269 24 Россия,Новосибирская обл.,Краснообск +2753 269 24 Россия,Новосибирская обл.,Куйбышев +2755 269 24 Россия,Новосибирская обл.,Купино +1479 269 24 Россия,Новосибирская обл.,Новосибирск +2759 269 24 Россия,Новосибирская обл.,Обь +2756 269 24 Россия,Новосибирская обл.,Татарск +2758 269 24 Россия,Новосибирская обл.,Тогучин +2757 269 24 Россия,Новосибирская обл.,Черепаново +2754 269 24 Россия,Новосибирская обл.,Чулым +2252 269 24 Россия,Новосибирская обл.,Другое +270 270 24 Россия,Омская обл. +2733 270 24 Россия,Омская обл.,Исилькуль +1480 270 24 Россия,Омская обл.,Калачинск +1481 270 24 Россия,Омская обл.,Марьяновка +2735 270 24 Россия,Омская обл.,Называевск +1482 270 24 Россия,Омская обл.,Омск +2734 270 24 Россия,Омская обл.,Тара +2736 270 24 Россия,Омская обл.,Тюкалинск +2253 270 24 Россия,Омская обл.,Другое +272 272 24 Россия,Томская обл. +1488 272 24 Россия,Томская обл.,Асино +1489 272 24 Россия,Томская обл.,Белый Яр +3295 272 24 Россия,Томская обл.,Каргасок +1491 272 24 Россия,Томская обл.,Колпашево +1492 272 24 Россия,Томская обл.,Северск +1493 272 24 Россия,Томская обл.,Стрежевой +1490 272 24 Россия,Томская обл.,Томск +2273 272 24 Россия,Томская обл.,Другое +276 276 24 Россия,Читинская обл. +2803 276 24 Россия,Читинская обл.,Балей +2799 276 24 Россия,Читинская обл.,Борзя +1499 276 24 Россия,Читинская обл.,Краснокаменск +2801 276 24 Россия,Читинская обл.,Могоча +2800 276 24 Россия,Читинская обл.,Нерчинск +2802 276 24 Россия,Читинская обл.,Петровск-Забайкальский +2798 276 24 Россия,Читинская обл.,Сретенск +2796 276 24 Россия,Читинская обл.,Хилок +1498 276 24 Россия,Читинская обл.,Чита +2797 276 24 Россия,Читинская обл.,Шилка +2285 276 24 Россия,Читинская обл.,Другое +262 262 24 Россия,Агинский Бурятский АО +1438 262 24 Россия,Агинский Бурятский АО,Агинское +2213 262 24 Россия,Агинский Бурятский АО,Другое +271 271 24 Россия,Таймырский АО +3233 271 24 Россия,Таймырский АО,Диксон +1485 271 24 Россия,Таймырский АО,Дудинка +1487 271 24 Россия,Таймырский АО,Кайеркан +1483 271 24 Россия,Таймырский АО,Норильск +1484 271 24 Россия,Таймырский АО,Талнах +1486 271 24 Россия,Таймырский АО,Хатанга +2269 271 24 Россия,Таймырский АО,Другое +274 274 24 Россия,Усть-Ордынский Бурятский АО +1495 274 24 Россия,Усть-Ордынский Бурятский АО,Усть-Ордынский +2279 274 24 Россия,Усть-Ордынский Бурятский АО,Другое +277 277 24 Россия,Эвенкийский АО +1500 277 24 Россия,Эвенкийский АО,Тура +2288 277 24 Россия,Эвенкийский АО,Другое +278 278 24 Россия,Курганская обл. +2668 278 24 Россия,Курганская обл.,Далматово +2667 278 24 Россия,Курганская обл.,Катайск +1524 278 24 Россия,Курганская обл.,Курган +2669 278 24 Россия,Курганская обл.,Куртамыш +2666 278 24 Россия,Курганская обл.,Макушино +2671 278 24 Россия,Курганская обл.,Петухово +1525 278 24 Россия,Курганская обл.,Шадринск +2670 278 24 Россия,Курганская обл.,Шумиха +2672 278 24 Россия,Курганская обл.,Щучье +2243 278 24 Россия,Курганская обл.,Другое +279 279 24 Россия,Свердловская обл. +1526 279 24 Россия,Свердловская обл.,Алапаевск +1527 279 24 Россия,Свердловская обл.,Арамиль +2691 279 24 Россия,Свердловская обл.,Артемовский +1528 279 24 Россия,Свердловская обл.,Асбест +2924 279 24 Россия,Свердловская обл.,Белоярский +2707 279 24 Россия,Свердловская обл.,Березовский +1529 279 24 Россия,Свердловская обл.,Богданович +2698 279 24 Россия,Свердловская обл.,Верхний Тагил +1530 279 24 Россия,Свердловская обл.,Верхняя Пышма +1531 279 24 Россия,Свердловская обл.,Верхняя Салда +1532 279 24 Россия,Свердловская обл.,Верхняя Синячиха +2696 279 24 Россия,Свердловская обл.,Верхняя Тура +2692 279 24 Россия,Свердловская обл.,Верхотурье +2706 279 24 Россия,Свердловская обл.,Волчанск +2709 279 24 Россия,Свердловская обл.,Дегтярск +1533 279 24 Россия,Свердловская обл.,Екатеринбург +1534 279 24 Россия,Свердловская обл.,Заречный +1535 279 24 Россия,Свердловская обл.,Ивдель +1536 279 24 Россия,Свердловская обл.,Ирбит +1537 279 24 Россия,Свердловская обл.,Каменск-Уральский +1538 279 24 Россия,Свердловская обл.,Камышлов +2708 279 24 Россия,Свердловская обл.,Карпинск +1539 279 24 Россия,Свердловская обл.,Качканар +2712 279 24 Россия,Свердловская обл.,Кировград +1540 279 24 Россия,Свердловская обл.,Краснотурьинск +2694 279 24 Россия,Свердловская обл.,Красноуральск +2693 279 24 Россия,Свердловская обл.,Красноуфимск +1541 279 24 Россия,Свердловская обл.,Кушва +2711 279 24 Россия,Свердловская обл.,Михайловск +2713 279 24 Россия,Свердловская обл.,Михайловск +1542 279 24 Россия,Свердловская обл.,Невьянск +2702 279 24 Россия,Свердловская обл.,Нижние Серги +1543 279 24 Россия,Свердловская обл.,Нижний Тагил +2695 279 24 Россия,Свердловская обл.,Нижняя Салда +2697 279 24 Россия,Свердловская обл.,Нижняя Тура +2699 279 24 Россия,Свердловская обл.,Новая Ляля +2909 279 24 Россия,Свердловская обл.,Новоуральск +1544 279 24 Россия,Свердловская обл.,Первоуральск +1545 279 24 Россия,Свердловская обл.,Полевской +1546 279 24 Россия,Свердловская обл.,Ревда +1547 279 24 Россия,Свердловская обл.,Реж +3296 279 24 Россия,Свердловская обл.,Рефтинский +2700 279 24 Россия,Свердловская обл.,Североуральск +1548 279 24 Россия,Свердловская обл.,Серов +2710 279 24 Россия,Свердловская обл.,Среднеуральск +2701 279 24 Россия,Свердловская обл.,Сухой Лог +2703 279 24 Россия,Свердловская обл.,Сысерть +1549 279 24 Россия,Свердловская обл.,Тавда +2704 279 24 Россия,Свердловская обл.,Талица +2705 279 24 Россия,Свердловская обл.,Туринск +2265 279 24 Россия,Свердловская обл.,Другое +280 280 24 Россия,Тюменская обл. +1550 280 24 Россия,Тюменская обл.,Заводоуковск +1551 280 24 Россия,Тюменская обл.,Ишим +3326 280 24 Россия,Тюменская обл.,Сургут +1552 280 24 Россия,Тюменская обл.,Тобольск +1553 280 24 Россия,Тюменская обл.,Тюмень +2748 280 24 Россия,Тюменская обл.,Ялуторовск +2276 280 24 Россия,Тюменская обл.,Другое +282 282 24 Россия,Челябинская обл. +1564 282 24 Россия,Челябинская обл.,Аша +2723 282 24 Россия,Челябинская обл.,Бакал +2724 282 24 Россия,Челябинская обл.,Верхнеуральск +2716 282 24 Россия,Челябинская обл.,Верхний Уфалей +3297 282 24 Россия,Челябинская обл.,Всеволожск +2725 282 24 Россия,Челябинская обл.,Еманжелинск +1565 282 24 Россия,Челябинская обл.,Златоуст +2722 282 24 Россия,Челябинская обл.,Карабаш +1566 282 24 Россия,Челябинская обл.,Карталы +2718 282 24 Россия,Челябинская обл.,Касли +2720 282 24 Россия,Челябинская обл.,Катав-Ивановск +1567 282 24 Россия,Челябинская обл.,Копейск +2721 282 24 Россия,Челябинская обл.,Коркино +2715 282 24 Россия,Челябинская обл.,Куса +1568 282 24 Россия,Челябинская обл.,Кыштым +1569 282 24 Россия,Челябинская обл.,Магнитогорск +1570 282 24 Россия,Челябинская обл.,Миасс +2726 282 24 Россия,Челябинская обл.,Миньяр +2717 282 24 Россия,Челябинская обл.,Нязепетровск +3100 282 24 Россия,Челябинская обл.,Озерск +1571 282 24 Россия,Челябинская обл.,Пласт +2719 282 24 Россия,Челябинская обл.,Сатка +2727 282 24 Россия,Челябинская обл.,Сим +1572 282 24 Россия,Челябинская обл.,Снежинск +3332 282 24 Россия,Челябинская обл.,Трехгорный +1573 282 24 Россия,Челябинская обл.,Троицк +1574 282 24 Россия,Челябинская обл.,Усть-Катав +1575 282 24 Россия,Челябинская обл.,Чебаркуль +1576 282 24 Россия,Челябинская обл.,Челябинск +1577 282 24 Россия,Челябинская обл.,Южноуральск +2714 282 24 Россия,Челябинская обл.,Юрюзань +2283 282 24 Россия,Челябинская обл.,Другое +281 281 24 Россия,Ханты-Мансийский АО - Югра +2749 281 24 Россия,Ханты-Мансийский АО - Югра,Белоярский +1554 281 24 Россия,Ханты-Мансийский АО - Югра,Игрим +1555 281 24 Россия,Ханты-Мансийский АО - Югра,Когалым +1556 281 24 Россия,Ханты-Мансийский АО - Югра,Лангепас +1561 281 24 Россия,Ханты-Мансийский АО - Югра,Мегион +1562 281 24 Россия,Ханты-Мансийский АО - Югра,Нефтеюганск +1559 281 24 Россия,Ханты-Мансийский АО - Югра,Нижневартовск +2852 281 24 Россия,Ханты-Мансийский АО - Югра,Нягань +2853 281 24 Россия,Ханты-Мансийский АО - Югра,Нягань +2854 281 24 Россия,Ханты-Мансийский АО - Югра,Пыть-Ях +1560 281 24 Россия,Ханты-Мансийский АО - Югра,Радужный +1563 281 24 Россия,Ханты-Мансийский АО - Югра,Советский +2747 281 24 Россия,Ханты-Мансийский АО - Югра,Сургут +1557 281 24 Россия,Ханты-Мансийский АО - Югра,Урай +1558 281 24 Россия,Ханты-Мансийский АО - Югра,Ханты-Мансийск +3344 281 24 Россия,Ханты-Мансийский АО - Югра,Югорск +2282 281 24 Россия,Ханты-Мансийский АО - Югра,Другое +283 283 24 Россия,Ямало-Ненецкий АО +3298 283 24 Россия,Ямало-Ненецкий АО,Губкинский +1578 283 24 Россия,Ямало-Ненецкий АО,Лабытнанги +2856 283 24 Россия,Ямало-Ненецкий АО,Муравленко +1579 283 24 Россия,Ямало-Ненецкий АО,Надым +1580 283 24 Россия,Ямало-Ненецкий АО,Новый Уренгой +1581 283 24 Россия,Ямало-Ненецкий АО,Ноябрьск +1582 283 24 Россия,Ямало-Ненецкий АО,Салехард +1583 283 24 Россия,Ямало-Ненецкий АО,Уренгой +2289 283 24 Россия,Ямало-Ненецкий АО,Другое +284 284 24 Россия,Белгородская обл. +1625 284 24 Россия,Белгородская обл.,Алексеевка +1626 284 24 Россия,Белгородская обл.,Белгород +2172 284 24 Россия,Белгородская обл.,Валуйки +2173 284 24 Россия,Белгородская обл.,Грайворон +1627 284 24 Россия,Белгородская обл.,Губкин +2174 284 24 Россия,Белгородская обл.,Короча +2175 284 24 Россия,Белгородская обл.,Новый Оскол +1628 284 24 Россия,Белгородская обл.,Старый Оскол +1629 284 24 Россия,Белгородская обл.,Шебекино +2221 284 24 Россия,Белгородская обл.,Другое +285 285 24 Россия,Брянская обл. +1630 285 24 Россия,Брянская обл.,Брянск +3283 285 24 Россия,Брянская обл.,Дебрянск +1631 285 24 Россия,Брянская обл.,Дятьково +2013 285 24 Россия,Брянская обл.,Жуковка +2015 285 24 Россия,Брянская обл.,Злынка +1632 285 24 Россия,Брянская обл.,Карачев +1633 285 24 Россия,Брянская обл.,Клинцы +1634 285 24 Россия,Брянская обл.,Мглин +2016 285 24 Россия,Брянская обл.,Новозыбков +2018 285 24 Россия,Брянская обл.,Почеп +2017 285 24 Россия,Брянская обл.,Севск +2020 285 24 Россия,Брянская обл.,Сельцо +2014 285 24 Россия,Брянская обл.,Стародуб +2010 285 24 Россия,Брянская обл.,Сураж +2012 285 24 Россия,Брянская обл.,Трубчевск +2011 285 24 Россия,Брянская обл.,Унеча +2019 285 24 Россия,Брянская обл.,Фокино +2210 285 24 Россия,Брянская обл.,Другое +286 286 24 Россия,Владимирская обл. +1635 286 24 Россия,Владимирская обл.,Александров +1636 286 24 Россия,Владимирская обл.,Владимир +2021 286 24 Россия,Владимирская обл.,Вязники +1637 286 24 Россия,Владимирская обл.,Головино +2022 286 24 Россия,Владимирская обл.,Гороховец +1638 286 24 Россия,Владимирская обл.,Гусь-Хрустальный +2023 286 24 Россия,Владимирская обл.,Камешково +2031 286 24 Россия,Владимирская обл.,Карабаново +2024 286 24 Россия,Владимирская обл.,Киржач +1639 286 24 Россия,Владимирская обл.,Ковров +1640 286 24 Россия,Владимирская обл.,Кольчугино +2026 286 24 Россия,Владимирская обл.,Костерево +3299 286 24 Россия,Владимирская обл.,Красная Горбатка +2033 286 24 Россия,Владимирская обл.,Лакинск +2025 286 24 Россия,Владимирская обл.,Меленки +1641 286 24 Россия,Владимирская обл.,Муром +1642 286 24 Россия,Владимирская обл.,Петушки +2027 286 24 Россия,Владимирская обл.,Покров +2211 286 24 Россия,Владимирская обл.,Радужный +2028 286 24 Россия,Владимирская обл.,Собинка +2032 286 24 Россия,Владимирская обл.,Струнино +2029 286 24 Россия,Владимирская обл.,Судогда +1643 286 24 Россия,Владимирская обл.,Суздаль +2030 286 24 Россия,Владимирская обл.,Юрьев-Польский +2212 286 24 Россия,Владимирская обл.,Другое +287 287 24 Россия,Воронежская обл. +1644 287 24 Россия,Воронежская обл.,Бобров +1645 287 24 Россия,Воронежская обл.,Богучар +1646 287 24 Россия,Воронежская обл.,Борисоглебск +1647 287 24 Россия,Воронежская обл.,Бутурлиновка +1648 287 24 Россия,Воронежская обл.,Воронеж +2178 287 24 Россия,Воронежская обл.,Калач +2176 287 24 Россия,Воронежская обл.,Лиски +1649 287 24 Россия,Воронежская обл.,Нововоронеж +2177 287 24 Россия,Воронежская обл.,Новохоперск +2180 287 24 Россия,Воронежская обл.,Острогожск +1650 287 24 Россия,Воронежская обл.,Павловск +2181 287 24 Россия,Воронежская обл.,Поворино +1651 287 24 Россия,Воронежская обл.,Россошь +2179 287 24 Россия,Воронежская обл.,Семилуки +2182 287 24 Россия,Воронежская обл.,Эртиль +2224 287 24 Россия,Воронежская обл.,Другое +288 288 24 Россия,Ивановская обл. +1652 288 24 Россия,Ивановская обл.,Вичуга +2036 288 24 Россия,Ивановская обл.,Гаврилов Посад +1657 288 24 Россия,Ивановская обл.,Заволжск +1653 288 24 Россия,Ивановская обл.,Иваново +1656 288 24 Россия,Ивановская обл.,Кинешма +2040 288 24 Россия,Ивановская обл.,Комсомольск +2037 288 24 Россия,Ивановская обл.,Кохма +2043 288 24 Россия,Ивановская обл.,Наволоки +3300 288 24 Россия,Ивановская обл.,Палех +2039 288 24 Россия,Ивановская обл.,Плес +2038 288 24 Россия,Ивановская обл.,Приволжск +2042 288 24 Россия,Ивановская обл.,Пучеж +2044 288 24 Россия,Ивановская обл.,Родники +1655 288 24 Россия,Ивановская обл.,Тейково +2034 288 24 Россия,Ивановская обл.,Фурманов +1654 288 24 Россия,Ивановская обл.,Шуя +2041 288 24 Россия,Ивановская обл.,Южа +2035 288 24 Россия,Ивановская обл.,Юрьевец +2227 288 24 Россия,Ивановская обл.,Другое +289 289 24 Россия,Калужская обл. +2050 289 24 Россия,Калужская обл.,Балабаново +2051 289 24 Россия,Калужская обл.,Боровск +3301 289 24 Россия,Калужская обл.,Воротынск +2052 289 24 Россия,Калужская обл.,Жиздра +1660 289 24 Россия,Калужская обл.,Жуковка +1658 289 24 Россия,Калужская обл.,Калуга +2046 289 24 Россия,Калужская обл.,Киров +1661 289 24 Россия,Калужская обл.,Козельск +2053 289 24 Россия,Калужская обл.,Кондрово +2049 289 24 Россия,Калужская обл.,Людиново +1659 289 24 Россия,Калужская обл.,Малоярославец +2054 289 24 Россия,Калужская обл.,Медынь +2055 289 24 Россия,Калужская обл.,Мещовск +2047 289 24 Россия,Калужская обл.,Мосальск +1662 289 24 Россия,Калужская обл.,Обнинск +2057 289 24 Россия,Калужская обл.,Сосенский +2056 289 24 Россия,Калужская обл.,Спас-Демянск +2045 289 24 Россия,Калужская обл.,Сухиничи +1663 289 24 Россия,Калужская обл.,Таруса +2131 289 24 Россия,Калужская обл.,Чекалин +2048 289 24 Россия,Калужская обл.,Юхнов +2233 289 24 Россия,Калужская обл.,Другое +290 290 24 Россия,Костромская обл. +1664 290 24 Россия,Костромская обл.,Буй +1665 290 24 Россия,Костромская обл.,Волгореченск +1666 290 24 Россия,Костромская обл.,Галич +2059 290 24 Россия,Костромская обл.,Кологрив +1667 290 24 Россия,Костромская обл.,Кострома +3302 290 24 Россия,Костромская обл.,Красное-на-Волге +1668 290 24 Россия,Костромская обл.,Макарьев +2060 290 24 Россия,Костромская обл.,Мантурово +1669 290 24 Россия,Костромская обл.,Нерехта +2061 290 24 Россия,Костромская обл.,Нея +2062 290 24 Россия,Костромская обл.,Солигалич +2058 290 24 Россия,Костромская обл.,Чухлома +1670 290 24 Россия,Костромская обл.,Шарья +2240 290 24 Россия,Костромская обл.,Другое +291 291 24 Россия,Курская обл. +1671 291 24 Россия,Курская обл.,Дмитриев-Льговский +1673 291 24 Россия,Курская обл.,Железногорск +3279 291 24 Россия,Курская обл.,Железногорск +1672 291 24 Россия,Курская обл.,Курск +2187 291 24 Россия,Курская обл.,Курчатов +2188 291 24 Россия,Курская обл.,Льгов +2184 291 24 Россия,Курская обл.,Обоянь +2185 291 24 Россия,Курская обл.,Рыльск +2183 291 24 Россия,Курская обл.,Суджа +2189 291 24 Россия,Курская обл.,Фатеж +2186 291 24 Россия,Курская обл.,Щигры +2244 291 24 Россия,Курская обл.,Другое +292 292 24 Россия,Липецкая обл. +2194 292 24 Россия,Липецкая обл.,Грязи +2193 292 24 Россия,Липецкая обл.,Данков +1674 292 24 Россия,Липецкая обл.,Елец +2190 292 24 Россия,Липецкая обл.,Задонск +2195 292 24 Россия,Липецкая обл.,Лебедянь +1675 292 24 Россия,Липецкая обл.,Липецк +2192 292 24 Россия,Липецкая обл.,Усмань +2191 292 24 Россия,Липецкая обл.,Чаплыгин +2245 292 24 Россия,Липецкая обл.,Другое +293 293 24 Россия,Московская обл. +1733 293 24 Россия,Московская обл.,Апрелевка +1732 293 24 Россия,Московская обл.,Балашиха +1731 293 24 Россия,Московская обл.,Бронницы +1730 293 24 Россия,Московская обл.,Верея +2063 293 24 Россия,Московская обл.,Видное +2064 293 24 Россия,Московская обл.,Волоколамск +1729 293 24 Россия,Московская обл.,Воскресенск +1728 293 24 Россия,Московская обл.,Высоковск +1727 293 24 Россия,Московская обл.,Голицыно +2065 293 24 Россия,Московская обл.,Дедовск +1726 293 24 Россия,Московская обл.,Дзержинский +1725 293 24 Россия,Московская обл.,Дмитров +1724 293 24 Россия,Московская обл.,Долгопрудный +1723 293 24 Россия,Московская обл.,Домодедово +2066 293 24 Россия,Московская обл.,Дрезна +1722 293 24 Россия,Московская обл.,Дубна +1721 293 24 Россия,Московская обл.,Егорьевск +1720 293 24 Россия,Московская обл.,Железнодорожный +1719 293 24 Россия,Московская обл.,Жуковский +2067 293 24 Россия,Московская обл.,Зарайск +1718 293 24 Россия,Московская обл.,Звенигород +1715 293 24 Россия,Московская обл.,Ивантеевка +1717 293 24 Россия,Московская обл.,Истра +2068 293 24 Россия,Московская обл.,Калининград +2069 293 24 Россия,Московская обл.,Кашира +1716 293 24 Россия,Московская обл.,Климовск +1714 293 24 Россия,Московская обл.,Клин +1713 293 24 Россия,Московская обл.,Коломна +1712 293 24 Россия,Московская обл.,Королев +1711 293 24 Россия,Московская обл.,Красноармейск +1710 293 24 Россия,Московская обл.,Красногорск +2070 293 24 Россия,Московская обл.,Краснозаводск +2071 293 24 Россия,Московская обл.,Куровское +1709 293 24 Россия,Московская обл.,Ликино-Дулево +1708 293 24 Россия,Московская обл.,Лобня +2072 293 24 Россия,Московская обл.,Лосино-Петровский +1707 293 24 Россия,Московская обл.,Луховицы +1706 293 24 Россия,Московская обл.,Лыткарино +1705 293 24 Россия,Московская обл.,Люберцы +1704 293 24 Россия,Московская обл.,Менделеево +1703 293 24 Россия,Московская обл.,Можайск +1702 293 24 Россия,Московская обл.,Мытищи +1701 293 24 Россия,Московская обл.,Наро-Фоминск +1700 293 24 Россия,Московская обл.,Ногинск +1698 293 24 Россия,Московская обл.,Одинцово +2073 293 24 Россия,Московская обл.,Ожерелье +2074 293 24 Россия,Московская обл.,Озеры +1699 293 24 Россия,Московская обл.,Орехово-Зуево +1697 293 24 Россия,Московская обл.,Павловский Посад +1696 293 24 Россия,Московская обл.,Подольск +1695 293 24 Россия,Московская обл.,Протвино +1694 293 24 Россия,Московская обл.,Пушкино +1693 293 24 Россия,Московская обл.,Пущино +1692 293 24 Россия,Московская обл.,Раменское +1691 293 24 Россия,Московская обл.,Реутов +1690 293 24 Россия,Московская обл.,Решетников +2075 293 24 Россия,Московская обл.,Рошаль +2076 293 24 Россия,Московская обл.,Руза +1689 293 24 Россия,Московская обл.,Сергиев Посад +1688 293 24 Россия,Московская обл.,Серпухов +1687 293 24 Россия,Московская обл.,Солнечногорск +1686 293 24 Россия,Московская обл.,Ступино +2077 293 24 Россия,Московская обл.,Сходня +2078 293 24 Россия,Московская обл.,Талдом +1685 293 24 Россия,Московская обл.,Троицк +1684 293 24 Россия,Московская обл.,Фрязино +1683 293 24 Россия,Московская обл.,Химки +1682 293 24 Россия,Московская обл.,Хотьково +1681 293 24 Россия,Московская обл.,Черноголовка +1680 293 24 Россия,Московская обл.,Чехов +1679 293 24 Россия,Московская обл.,Шатура +1678 293 24 Россия,Московская обл.,Щелково +2080 293 24 Россия,Московская обл.,Щербинка +1677 293 24 Россия,Московская обл.,Электрогорск +1676 293 24 Россия,Московская обл.,Электросталь +2079 293 24 Россия,Московская обл.,Электроугли +3031 293 24 Россия,Московская обл.,Юбилейный +2081 293 24 Россия,Московская обл.,Яхрома +2249 293 24 Россия,Московская обл.,Другое +294 294 24 Россия,Орловская обл. +2083 294 24 Россия,Орловская обл.,Болхов +2082 294 24 Россия,Орловская обл.,Дмитровск-Орловский +3160 294 24 Россия,Орловская обл.,Залегощь +1736 294 24 Россия,Орловская обл.,Ливны +2084 294 24 Россия,Орловская обл.,Малоархангельск +1737 294 24 Россия,Орловская обл.,Мценск +2085 294 24 Россия,Орловская обл.,Новосиль +1735 294 24 Россия,Орловская обл.,Орел +2255 294 24 Россия,Орловская обл.,Другое +295 295 24 Россия,Рязанская обл. +1740 295 24 Россия,Рязанская обл.,Гусь-Железный +1741 295 24 Россия,Рязанская обл.,Касимов +2086 295 24 Россия,Рязанская обл.,Кораблино +2087 295 24 Россия,Рязанская обл.,Михайлов +2089 295 24 Россия,Рязанская обл.,Новомичуринск +2091 295 24 Россия,Рязанская обл.,Рыбное +2093 295 24 Россия,Рязанская обл.,Ряжск +1738 295 24 Россия,Рязанская обл.,Рязань +3305 295 24 Россия,Рязанская обл.,Сапожок +1739 295 24 Россия,Рязанская обл.,Сасово +2090 295 24 Россия,Рязанская обл.,Скопин +2088 295 24 Россия,Рязанская обл.,Спас-Клепики +2092 295 24 Россия,Рязанская обл.,Спасск-Рязанский +2094 295 24 Россия,Рязанская обл.,Шацк +3320 295 24 Россия,Рязанская обл.,Шилово +2260 295 24 Россия,Рязанская обл.,Другое +296 296 24 Россия,Смоленская обл. +2095 296 24 Россия,Смоленская обл.,Велиж +1743 296 24 Россия,Смоленская обл.,Вязьма +1744 296 24 Россия,Смоленская обл.,Гагарин +2096 296 24 Россия,Смоленская обл.,Демидов +1745 296 24 Россия,Смоленская обл.,Десногорск +1746 296 24 Россия,Смоленская обл.,Дорогубуж +2097 296 24 Россия,Смоленская обл.,Духовщина +2098 296 24 Россия,Смоленская обл.,Ельня +2099 296 24 Россия,Смоленская обл.,Починок +2100 296 24 Россия,Смоленская обл.,Рославль +2101 296 24 Россия,Смоленская обл.,Рудня +1747 296 24 Россия,Смоленская обл.,Сафоново +1742 296 24 Россия,Смоленская обл.,Смоленск +2102 296 24 Россия,Смоленская обл.,Сычевка +1748 296 24 Россия,Смоленская обл.,Ярцево +2267 296 24 Россия,Смоленская обл.,Другое +297 297 24 Россия,Тамбовская обл. +2198 297 24 Россия,Тамбовская обл.,Жердевка +2199 297 24 Россия,Тамбовская обл.,Кирсанов +1752 297 24 Россия,Тамбовская обл.,Котовск +1751 297 24 Россия,Тамбовская обл.,Мичуринск +2196 297 24 Россия,Тамбовская обл.,Моршанск +1750 297 24 Россия,Тамбовская обл.,Рассказово +3271 297 24 Россия,Тамбовская обл.,Сатинка +1749 297 24 Россия,Тамбовская обл.,Тамбов +3272 297 24 Россия,Тамбовская обл.,Тулиновка +2197 297 24 Россия,Тамбовская обл.,Уварово +2270 297 24 Россия,Тамбовская обл.,Другое +298 298 24 Россия,Тверская обл. +2103 298 24 Россия,Тверская обл.,Андреаполь +2104 298 24 Россия,Тверская обл.,Бежецк +2105 298 24 Россия,Тверская обл.,Белый +2106 298 24 Россия,Тверская обл.,Бологое +2107 298 24 Россия,Тверская обл.,Весьегонск +1753 298 24 Россия,Тверская обл.,Вышний Волочек +2108 298 24 Россия,Тверская обл.,Западная Двина +2109 298 24 Россия,Тверская обл.,Зубцов +2110 298 24 Россия,Тверская обл.,Калязин +2111 298 24 Россия,Тверская обл.,Кашин +1758 298 24 Россия,Тверская обл.,Кимры +1756 298 24 Россия,Тверская обл.,Конаково +2112 298 24 Россия,Тверская обл.,Красный Холм +1759 298 24 Россия,Тверская обл.,Кувшиново +1760 298 24 Россия,Тверская обл.,Лихославль +1761 298 24 Россия,Тверская обл.,Нелидово +2113 298 24 Россия,Тверская обл.,Осташков +1757 298 24 Россия,Тверская обл.,Ржев +2114 298 24 Россия,Тверская обл.,Старица +1754 298 24 Россия,Тверская обл.,Тверь +2115 298 24 Россия,Тверская обл.,Торжок +2116 298 24 Россия,Тверская обл.,Торопец +1755 298 24 Россия,Тверская обл.,Удомля +2272 298 24 Россия,Тверская обл.,Другое +299 299 24 Россия,Тульская обл. +2127 299 24 Россия,Тульская обл.,Алексин +2126 299 24 Россия,Тульская обл.,Белев +2118 299 24 Россия,Тульская обл.,Богородицк +2122 299 24 Россия,Тульская обл.,Болохово +2129 299 24 Россия,Тульская обл.,Венев +1762 299 24 Россия,Тульская обл.,Донской +2128 299 24 Россия,Тульская обл.,Ефремов +3354 299 24 Россия,Тульская обл.,Заокский +2124 299 24 Россия,Тульская обл.,Киреевск +1763 299 24 Россия,Тульская обл.,Климовск +2123 299 24 Россия,Тульская обл.,Липки +1764 299 24 Россия,Тульская обл.,Новомосковск +2117 299 24 Россия,Тульская обл.,Плавск +2130 299 24 Россия,Тульская обл.,Северо-Задонск +2120 299 24 Россия,Тульская обл.,Советск +2119 299 24 Россия,Тульская обл.,Сокольники +2125 299 24 Россия,Тульская обл.,Суворов +1765 299 24 Россия,Тульская обл.,Тула +1766 299 24 Россия,Тульская обл.,Узловая +2121 299 24 Россия,Тульская обл.,Щекино +1767 299 24 Россия,Тульская обл.,Ясногорск +2274 299 24 Россия,Тульская обл.,Другое +300 300 24 Россия,Ярославская обл. +3053 300 24 Россия,Ярославская обл.,Большое Село +3268 300 24 Россия,Ярославская обл.,Брейтово +1773 300 24 Россия,Ярославская обл.,Гаврилов-Ям +2132 300 24 Россия,Ярославская обл.,Данилов +3269 300 24 Россия,Ярославская обл.,Красные Ткачи +2133 300 24 Россия,Ярославская обл.,Любим +3270 300 24 Россия,Ярославская обл.,Мокеевское +1774 300 24 Россия,Ярославская обл.,Мышкин +2994 300 24 Россия,Ярославская обл.,Некоуз +1775 300 24 Россия,Ярославская обл.,Переславль-Залесский +2134 300 24 Россия,Ярославская обл.,Пошехонье +1769 300 24 Россия,Ярославская обл.,Ростов +1771 300 24 Россия,Ярославская обл.,Рыбинск +1772 300 24 Россия,Ярославская обл.,Тутаев +1770 300 24 Россия,Ярославская обл.,Углич +1768 300 24 Россия,Ярославская обл.,Ярославль +2290 300 24 Россия,Ярославская обл.,Другое +301 301 24 Россия,Адыгея +2849 301 24 Россия,Адыгея,Адыгейск +1776 301 24 Россия,Адыгея,Майкоп +2214 301 24 Россия,Адыгея,Другое +304 304 24 Россия,Дагестан +2617 304 24 Россия,Дагестан,Буйнакск +1791 304 24 Россия,Дагестан,Гуниб +1788 304 24 Россия,Дагестан,Дербент +2619 304 24 Россия,Дагестан,Избербаш +1789 304 24 Россия,Дагестан,Каспийск +2618 304 24 Россия,Дагестан,Кизилюрт +1790 304 24 Россия,Дагестан,Кизляр +1792 304 24 Россия,Дагестан,Махачкала +2620 304 24 Россия,Дагестан,Хасавюрт +2225 304 24 Россия,Дагестан,Другое +305 305 24 Россия,Ингушетия +3052 305 24 Россия,Ингушетия,Магас +1787 305 24 Россия,Ингушетия,Назрань +2228 305 24 Россия,Ингушетия,Другое +306 306 24 Россия,Кабардино-Балкария +2621 306 24 Россия,Кабардино-Балкария,Баксан +1794 306 24 Россия,Кабардино-Балкария,Майский +1793 306 24 Россия,Кабардино-Балкария,Нальчик +2622 306 24 Россия,Кабардино-Балкария,Нарткала +1795 306 24 Россия,Кабардино-Балкария,Прохладный +2623 306 24 Россия,Кабардино-Балкария,Терек +2624 306 24 Россия,Кабардино-Балкария,Тырныауз +3274 306 24 Россия,Кабардино-Балкария,Чегем +2230 306 24 Россия,Кабардино-Балкария,Другое +307 307 24 Россия,Калмыкия +2567 307 24 Россия,Калмыкия,Городовиково +2568 307 24 Россия,Калмыкия,Лагань +3324 307 24 Россия,Калмыкия,Троицкое +1796 307 24 Россия,Калмыкия,Элиста +2232 307 24 Россия,Калмыкия,Другое +308 308 24 Россия,Карачаево-Черкессия +1799 308 24 Россия,Карачаево-Черкессия,Домбай +1798 308 24 Россия,Карачаево-Черкессия,Карачаевск +2626 308 24 Россия,Карачаево-Черкессия,Теберда +2625 308 24 Россия,Карачаево-Черкессия,Усть-Джегута +1797 308 24 Россия,Карачаево-Черкессия,Черкесск +2235 308 24 Россия,Карачаево-Черкессия,Другое +311 311 24 Россия,Северная Осетия - Алания +2630 311 24 Россия,Северная Осетия - Алания,Алагир +2631 311 24 Россия,Северная Осетия - Алания,Ардон +2628 311 24 Россия,Северная Осетия - Алания,Беслан +1839 311 24 Россия,Северная Осетия - Алания,Владикавказ +2629 311 24 Россия,Северная Осетия - Алания,Дигора +2627 311 24 Россия,Северная Осетия - Алания,Моздок +2266 311 24 Россия,Северная Осетия - Алания,Другое +313 313 24 Россия,Чечня +2632 313 24 Россия,Чечня,Аргун +1853 313 24 Россия,Чечня,Грозный +2633 313 24 Россия,Чечня,Гудермес +2284 313 24 Россия,Чечня,Другое +309 309 24 Россия,Краснодарский край +2636 309 24 Россия,Краснодарский край,Абинск +1800 309 24 Россия,Краснодарский край,Анапа +1801 309 24 Россия,Краснодарский край,Апшеронск +1802 309 24 Россия,Краснодарский край,Армавир +1803 309 24 Россия,Краснодарский край,Белореченск +1804 309 24 Россия,Краснодарский край,Геленджик +1805 309 24 Россия,Краснодарский край,Горячий Ключ +2637 309 24 Россия,Краснодарский край,Гулькевичи +1806 309 24 Россия,Краснодарский край,Динская +1807 309 24 Россия,Краснодарский край,Ейск +2638 309 24 Россия,Краснодарский край,Кореновск +1808 309 24 Россия,Краснодарский край,Краснодар +1809 309 24 Россия,Краснодарский край,Кропоткин +1810 309 24 Россия,Краснодарский край,Крымск +1811 309 24 Россия,Краснодарский край,Курганинск +3232 309 24 Россия,Краснодарский край,Лабинск +2639 309 24 Россия,Краснодарский край,Новокубанск +1812 309 24 Россия,Краснодарский край,Новороссийск +1813 309 24 Россия,Краснодарский край,Пластуновская +1814 309 24 Россия,Краснодарский край,Приморско-Ахтарск +3102 309 24 Россия,Краснодарский край,Северская +1815 309 24 Россия,Краснодарский край,Славянск-на-Кубани +1816 309 24 Россия,Краснодарский край,Сочи +3266 309 24 Россия,Краснодарский край,Староминская +3039 309 24 Россия,Краснодарский край,Тамань +1817 309 24 Россия,Краснодарский край,Темрюк +2635 309 24 Россия,Краснодарский край,Тимашевск +1818 309 24 Россия,Краснодарский край,Тихорецк +1819 309 24 Россия,Краснодарский край,Туапсе +1820 309 24 Россия,Краснодарский край,Усть-Лабинск +2634 309 24 Россия,Краснодарский край,Хадыженск +2241 309 24 Россия,Краснодарский край,Другое +312 312 24 Россия,Ставропольский край +1840 312 24 Россия,Ставропольский край,Александровское +2644 312 24 Россия,Ставропольский край,Благодарный +1841 312 24 Россия,Ставропольский край,Буденновск +1842 312 24 Россия,Ставропольский край,Георгиевск +1843 312 24 Россия,Ставропольский край,Ессентуки +1844 312 24 Россия,Ставропольский край,Железноводск +2647 312 24 Россия,Ставропольский край,Зеленокумск +2641 312 24 Россия,Ставропольский край,Изобильный +2642 312 24 Россия,Ставропольский край,Ипатово +1845 312 24 Россия,Ставропольский край,Кисловодск +1846 312 24 Россия,Ставропольский край,Кочубеевское +3367 312 24 Россия,Ставропольский край,Курсавка +3265 312 24 Россия,Ставропольский край,Левокумское +1847 312 24 Россия,Ставропольский край,Лермонтов +1848 312 24 Россия,Ставропольский край,Минеральные Воды +1849 312 24 Россия,Ставропольский край,Невинномысск +2645 312 24 Россия,Ставропольский край,Нефтекумск +2643 312 24 Россия,Ставропольский край,Новоалександровск +1850 312 24 Россия,Ставропольский край,Новопавловск +1851 312 24 Россия,Ставропольский край,Новоселицкое +1852 312 24 Россия,Ставропольский край,Пятигорск +2646 312 24 Россия,Ставропольский край,Светлоград +2640 312 24 Россия,Ставропольский край,Ставрополь +2268 312 24 Россия,Ставропольский край,Другое +302 302 24 Россия,Астраханская обл. +1777 302 24 Россия,Астраханская обл.,Астрахань +1778 302 24 Россия,Астраханская обл.,Ахтубинск +3383 302 24 Россия,Астраханская обл.,Знаменск +2578 302 24 Россия,Астраханская обл.,Камызяк +2579 302 24 Россия,Астраханская обл.,Нариманов +1786 302 24 Россия,Астраханская обл.,Харабали +2219 302 24 Россия,Астраханская обл.,Другое +303 303 24 Россия,Волгоградская обл. +1779 303 24 Россия,Волгоградская обл.,Волгоград +1780 303 24 Россия,Волгоградская обл.,Волжский +2584 303 24 Россия,Волгоградская обл.,Дубовка +1781 303 24 Россия,Волгоградская обл.,Жирновск +1782 303 24 Россия,Волгоградская обл.,Калач-на-Дону +1783 303 24 Россия,Волгоградская обл.,Камышин +2588 303 24 Россия,Волгоградская обл.,Котельниково +2591 303 24 Россия,Волгоградская обл.,Котово +2587 303 24 Россия,Волгоградская обл.,Краснослободск +2582 303 24 Россия,Волгоградская обл.,Ленинск +2590 303 24 Россия,Волгоградская обл.,Михайловка +1784 303 24 Россия,Волгоградская обл.,Николаевск +2581 303 24 Россия,Волгоградская обл.,Новоаннинский +2583 303 24 Россия,Волгоградская обл.,Палласовка +2580 303 24 Россия,Волгоградская обл.,Петров Вал +2589 303 24 Россия,Волгоградская обл.,Серафимович +2585 303 24 Россия,Волгоградская обл.,Суровикино +1785 303 24 Россия,Волгоградская обл.,Урюпинск +2586 303 24 Россия,Волгоградская обл.,Фролово +2223 303 24 Россия,Волгоградская обл.,Другое +310 310 24 Россия,Ростовская обл. +1821 310 24 Россия,Ростовская обл.,Азов +1822 310 24 Россия,Ростовская обл.,Аксай +1823 310 24 Россия,Ростовская обл.,Багаевская +1824 310 24 Россия,Ростовская обл.,Батайск +1825 310 24 Россия,Ростовская обл.,Белая Калитва +1826 310 24 Россия,Ростовская обл.,Волгодонск +1827 310 24 Россия,Ростовская обл.,Гуково +2651 310 24 Россия,Ростовская обл.,Донецк +1828 310 24 Россия,Ростовская обл.,Зерноград +3264 310 24 Россия,Ростовская обл.,Каменоломни +2652 310 24 Россия,Ростовская обл.,Каменск-Шахтинский +2649 310 24 Россия,Ростовская обл.,Константиновск +2648 310 24 Россия,Ростовская обл.,Красный Сулин +1829 310 24 Россия,Ростовская обл.,Миллерово +2653 310 24 Россия,Ростовская обл.,Морозовск +1830 310 24 Россия,Ростовская обл.,Новочеркасск +1831 310 24 Россия,Ростовская обл.,Новошахтинск +1832 310 24 Россия,Ростовская обл.,Пролетарск +1833 310 24 Россия,Ростовская обл.,Ростов-на-Дону +1834 310 24 Россия,Ростовская обл.,Сальск +1835 310 24 Россия,Ростовская обл.,Семикаракорск +1836 310 24 Россия,Ростовская обл.,Таганрог +1837 310 24 Россия,Ростовская обл.,Усть-Донецкий +3263 310 24 Россия,Ростовская обл.,Целина +2650 310 24 Россия,Ростовская обл.,Цимлянск +1838 310 24 Россия,Ростовская обл.,Шахты +2259 310 24 Россия,Ростовская обл.,Другое +81 0 81 Азербайджан +1055 1055 81 Азербайджан,Баку +1058 1058 81 Азербайджан,Гянджа +1056 1056 81 Азербайджан,Нахичевань +1057 1057 81 Азербайджан,Ханкенди +3153 3153 81 Азербайджан,Шеки +2291 2291 81 Азербайджан,Другое +82 0 82 Армения +2932 2932 82 Армения,Абовян +1060 1060 82 Армения,Аштарак +3084 3084 82 Армения,Ванадзор +3011 3011 82 Армения,Гюмри +3306 3306 82 Армения,Дилижан +1059 1059 82 Армения,Ереван +3145 3145 82 Армения,Ханкенди +2292 2292 82 Армения,Другое +97 0 97 Афганистан +1061 1061 97 Афганистан,Кабул +2293 2293 97 Афганистан,Другое +96 0 96 Бангладеш +1062 1062 96 Бангладеш,Дакка +2294 2294 96 Бангладеш,Другое +99 0 99 Бахрейн +1063 1063 99 Бахрейн,Манама +2295 2295 99 Бахрейн,Другое +100 0 100 Бруней-Даруссалам +1064 1064 100 Бруней-Даруссалам,Бандар-Сери-Бегаван +2296 2296 100 Бруней-Даруссалам,Другое +101 0 101 Бутан +1065 1065 101 Бутан,Тхимпху +2297 2297 101 Бутан,Другое +102 0 102 Вьетнам +1066 1066 102 Вьетнам,Ханой +2298 2298 102 Вьетнам,Другое +83 0 83 Грузия +1067 1067 83 Грузия,Батуми +3158 3158 83 Грузия,Боржоми +1068 1068 83 Грузия,Поти +3129 3129 83 Грузия,Рустави +1069 1069 83 Грузия,Сухуми +1070 1070 83 Грузия,Тбилиси +2299 2299 83 Грузия,Другое +86 0 86 Израиль +3345 3345 86 Израиль,Ариэль +1071 1071 86 Израиль,Афула +2992 2992 86 Израиль,Ашдод +3175 3175 86 Израиль,Ашкелон +3363 3363 86 Израиль,Бат-Ям +2884 2884 86 Израиль,Беер-Яков +3243 3243 86 Израиль,Бейт-Шемеш +1074 1074 86 Израиль,Беэр-Шева +3348 3348 86 Израиль,Герцелия +3241 3241 86 Израиль,Димона +1075 1075 86 Израиль,Иерусалим +3350 3350 86 Израиль,Йокнеам-Иллит +2982 2982 86 Израиль,Кармиэль +2971 2971 86 Израиль,Кфар-Саба +3136 3136 86 Израиль,Назарет +1080 1080 86 Израиль,Натания +3303 3303 86 Израиль,Офаким +3050 3050 86 Израиль,Раанана +3151 3151 86 Израиль,Рамат Ган +3141 3141 86 Израиль,Реховот +3012 3012 86 Израиль,Ришон ле Цион +1081 1081 86 Израиль,Тверия +1077 1077 86 Израиль,Тель-Авив +1079 1079 86 Израиль,Хадера +1078 1078 86 Израиль,Хайфа +1076 1076 86 Израиль,Хеврон +2929 2929 86 Израиль,Цфат +2928 2928 86 Израиль,Эйлат +2300 2300 86 Израиль,Другое +95 0 95 Индия +3315 3315 95 Индия,Бангалор +1082 1082 95 Индия,Дели +1083 1083 95 Индия,Джайпур +3144 3144 95 Индия,Калькутта +3025 3025 95 Индия,Мумбаи +3277 3277 95 Индия,Панаджи +1084 1084 95 Индия,Ченнаи +2301 2301 95 Индия,Другое +103 0 103 Индонезия +1085 1085 103 Индонезия,Джакарта +2302 2302 103 Индонезия,Другое +79 0 79 Иордания +1086 1086 79 Иордания,Амман +2303 2303 79 Иордания,Другое +85 0 85 Ирак +1087 1087 85 Ирак,Багдад +2304 2304 85 Ирак,Другое +87 0 87 Иран +1088 1088 87 Иран,Тегеран +2305 2305 87 Иран,Другое +104 0 104 Йемен +1089 1089 104 Йемен,Сана +2306 2306 104 Йемен,Другое +84 0 84 Казахстан +1090 1090 84 Казахстан,Актау +1091 1091 84 Казахстан,Актюбинск +1092 1092 84 Казахстан,Алма-Ата +3242 3242 84 Казахстан,Аршалы +1093 1093 84 Казахстан,Астана +1094 1094 84 Казахстан,Атырау (Гурьев) +1095 1095 84 Казахстан,Байконур +3245 3245 84 Казахстан,Балхаш +3083 3083 84 Казахстан,Жезказган +1096 1096 84 Казахстан,Капчагай +1097 1097 84 Казахстан,Караганда +1098 1098 84 Казахстан,Кокшетау +1099 1099 84 Казахстан,Кустанай +2868 2868 84 Казахстан,Лисаковск +1100 1100 84 Казахстан,Павлодар +1101 1101 84 Казахстан,Петропавловск (Сев.-Каз. обл.) +1102 1102 84 Казахстан,Рудный +1103 1103 84 Казахстан,Семипалатинск +1104 1104 84 Казахстан,Степногорск +3166 3166 84 Казахстан,Талгар +1105 1105 84 Казахстан,Талды-Курган +2927 2927 84 Казахстан,Тараз +1106 1106 84 Казахстан,Темиртау +1107 1107 84 Казахстан,Уральск +1108 1108 84 Казахстан,Усть-Каменогорск +1109 1109 84 Казахстан,Чимкент +1110 1110 84 Казахстан,Экибастуз +2307 2307 84 Казахстан,Другое +105 0 105 Камбоджа +1111 1111 105 Камбоджа,Пномпень +2308 2308 105 Камбоджа,Другое +106 0 106 Катар +1112 1112 106 Катар,Доха +2309 2309 106 Катар,Другое +107 0 107 Кипр +1113 1113 107 Кипр,Ларнака +1114 1114 107 Кипр,Лимассол +1115 1115 107 Кипр,Никосия +2954 2954 107 Кипр,Пафос +2310 2310 107 Кипр,Другое +92 0 92 Киргизия (Кыргызстан) +1116 1116 92 Киргизия (Кыргызстан),Бишкек +1117 1117 92 Киргизия (Кыргызстан),Джалал-Абад +3027 3027 92 Киргизия (Кыргызстан),Кара-Балта +1118 1118 92 Киргизия (Кыргызстан),Каракол +1119 1119 92 Киргизия (Кыргызстан),Ош +1120 1120 92 Киргизия (Кыргызстан),Талас +2933 2933 92 Киргизия (Кыргызстан),Хайдаркен +2311 2311 92 Киргизия (Кыргызстан),Другое +76 0 76 Китай +3214 3214 76 Китай,Аомынь (Макао) +1121 1121 76 Китай,Гонконг +2869 2869 76 Китай,Гуанчжоу +3262 3262 76 Китай,Далянь +1122 1122 76 Китай,Пекин +1123 1123 76 Китай,Харбин +1124 1124 76 Китай,Шанхай +3043 3043 76 Китай,Шеньян +2312 2312 76 Китай,Другое +3215 0 3215 Кокосовые острова (Австр.) +29 0 29 Корея (КНДР) +1125 1125 29 Корея (КНДР),Пхеньян +2313 2313 29 Корея (КНДР),Другое +108 0 108 Корея +1126 1126 108 Корея,Сеул +3240 3240 108 Корея,Тейджон +2314 2314 108 Корея,Другое +88 0 88 Кувейт +1127 1127 88 Кувейт,Эль-Кувейт +2315 2315 88 Кувейт,Другое +109 0 109 Лаос +1128 1128 109 Лаос,Вьентьян +2316 2316 109 Лаос,Другое +110 0 110 Ливан +1129 1129 110 Ливан,Бейрут +2317 2317 110 Ливан,Другое +111 0 111 Малайзия +1130 1130 111 Малайзия,Джохор-Бару +1131 1131 111 Малайзия,Куала-Лумпур +2318 2318 111 Малайзия,Другое +112 0 112 Мальдивы +1132 1132 112 Мальдивы,Мале +2319 2319 112 Мальдивы,Другое +113 0 113 Монголия +1133 1133 113 Монголия,Улан-Батор +1134 1134 113 Монголия,Эрдэнэт +2320 2320 113 Монголия,Другое +114 0 114 Мьянма +1135 1135 114 Мьянма,Янгон +2321 2321 114 Мьянма,Другое +115 0 115 Непал +1136 1136 115 Непал,Катманду +2322 2322 115 Непал,Другое +116 0 116 Объединенные Арабские Эмираты +1137 1137 116 Объединенные Арабские Эмираты,Абу-Даби +1138 1138 116 Объединенные Арабские Эмираты,Дубай +1139 1139 116 Объединенные Арабские Эмираты,Шарджа +2323 2323 116 Объединенные Арабские Эмираты,Другое +117 0 117 Оман +1140 1140 117 Оман,Маскат +2324 2324 117 Оман,Другое +3216 0 3216 Остров Рождества (Австр.) +122 0 122 Пакистан +1141 1141 122 Пакистан,Исламабад +2325 2325 122 Пакистан,Другое +89 0 89 Палестина +1072 1072 89 Палестина,Ашдод +1073 1073 89 Палестина,Ашкелон +1142 1142 89 Палестина,Газа +2326 2326 89 Палестина,Другое +94 0 94 Саудовская Аравия +3250 3250 94 Саудовская Аравия,Медина +1143 1143 94 Саудовская Аравия,Эр-Рияд +2327 2327 94 Саудовская Аравия,Другое +118 0 118 Сингапур +78 0 78 Сирия +1144 1144 78 Сирия,Дамаск +2328 2328 78 Сирия,Другое +91 0 91 Таджикистан +1145 1145 91 Таджикистан,Душанбе +3307 3307 91 Таджикистан,Кайраккум +3308 3308 91 Таджикистан,Худжанд +2329 2329 91 Таджикистан,Другое +119 0 119 Таиланд +1146 1146 119 Таиланд,Бангкок +1147 1147 119 Таиланд,Пхукет +2330 2330 119 Таиланд,Другое +120 0 120 Тайвань +1148 1148 120 Тайвань,Тайбэй +2331 2331 120 Тайвань,Другое +132 0 132 Тимор +1149 1149 132 Тимор,Дили +2332 2332 132 Тимор,Другое +90 0 90 Туркмения +1150 1150 90 Туркмения,Ашхабад +3079 3079 90 Туркмения,Безмеин +2333 2333 90 Туркмения,Другое +77 0 77 Турция +1152 1152 77 Турция,Анкара +1153 1153 77 Турция,Анталия +3080 3080 77 Турция,Бурса +1151 1151 77 Турция,Мармарис +1154 1154 77 Турция,Стамбул +1155 1155 77 Турция,Трабзон +2334 2334 77 Турция,Другое +93 0 93 Узбекистан +3362 3362 93 Узбекистан,Алмалык +3137 3137 93 Узбекистан,Андижан +3273 3273 93 Узбекистан,Асака +1156 1156 93 Узбекистан,Ахангаран +1157 1157 93 Узбекистан,Бухара +3167 3167 93 Узбекистан,Джизак +3347 3347 93 Узбекистан,Кунград +1158 1158 93 Узбекистан,Навои +1159 1159 93 Узбекистан,Наманган +1160 1160 93 Узбекистан,Самарканд +1161 1161 93 Узбекистан,Ташкент +1162 1162 93 Узбекистан,Ургенч +1163 1163 93 Узбекистан,Фергана +1164 1164 93 Узбекистан,Чирчик +2335 2335 93 Узбекистан,Другое +121 0 121 Филиппины +1165 1165 121 Филиппины,Манила +3319 3319 121 Филиппины,Себу +2336 2336 121 Филиппины,Другое +98 0 98 Шри Ланка +1166 1166 98 Шри Ланка,Коломбо +2337 2337 98 Шри Ланка,Другое +75 0 75 Япония +3176 3176 75 Япония,Исесаки +3339 3339 75 Япония,Корияма +1167 1167 75 Япония,Саппоро +1168 1168 75 Япония,Токио +2338 2338 75 Япония,Другое +123 0 123 Австралия +1914 1914 123 Австралия,Аделаида +2957 2957 123 Австралия,Блэк Рок +1915 1915 123 Австралия,Брисбен +3331 3331 123 Австралия,Горокан +1916 1916 123 Австралия,Канберра +3001 3001 123 Австралия,Лидкомб +1917 1917 123 Австралия,Мельбурн +3217 3217 123 Австралия,Норфолк +3064 3064 123 Австралия,Перт +3020 3020 123 Австралия,Санта Люсиа +1918 1918 123 Австралия,Сидней +3238 3238 123 Австралия,Энеабба +2339 2339 123 Австралия,Другое +454 0 454 Американское Самоа +1192 1192 454 Американское Самоа,Паго-Паго +2366 2366 454 Американское Самоа,Другое +124 0 124 Вануату +1919 1919 124 Вануату,Порт-Вила +2340 2340 124 Вануату,Другое +453 0 453 Гуам (США) +1193 1193 453 Гуам (США),Аганья +2368 2368 453 Гуам (США),Другое +126 0 126 Кирибати +1921 1921 126 Кирибати,Баирики +2342 2342 126 Кирибати,Другое +127 0 127 Маршалловы Острова +1922 1922 127 Маршалловы Острова,Маджуро +2343 2343 127 Маршалловы Острова,Другое +128 0 128 Микронезия (Федеративные Штаты Микронезии) +1923 1923 128 Микронезия (Федеративные Штаты Микронезии),Паликир +2344 2344 128 Микронезия (Федеративные Штаты Микронезии),Другое +129 0 129 Науру +1924 1924 129 Науру,Ярен +2345 2345 129 Науру,Другое +3220 0 3220 Ниуэ (Н.Зел.) +130 0 130 Новая Зеландия +1925 1925 130 Новая Зеландия,Веллингтон +1926 1926 130 Новая Зеландия,Гамильтон +1928 1928 130 Новая Зеландия,Данидин +1929 1929 130 Новая Зеландия,Крайстчерч +3235 3235 130 Новая Зеландия,Кромвель +1927 1927 130 Новая Зеландия,Окленд +3323 3323 130 Новая Зеландия,Тауранга +2346 2346 130 Новая Зеландия,Другое +3218 0 3218 Новая Каледония (Фр.) +3221 0 3221 Острова Кука (Н.Зел.) +3230 0 3230 Острова Херд и Макдональд (Австр.) +131 0 131 Палау +1930 1930 131 Палау,Корор +2347 2347 131 Палау,Другое +133 0 133 Папуа - Новая Гвинея +1931 1931 133 Папуа - Новая Гвинея,Порт-Морсби +2348 2348 133 Папуа - Новая Гвинея,Другое +3222 0 3222 Питкерн (Брит.) +125 0 125 Самоа +1920 1920 125 Самоа,Апиа +2341 2341 125 Самоа,Другое +3219 0 3219 Сев. Марианские острова (США) +134 0 134 Соломоновы Острова +1932 1932 134 Соломоновы Острова,Хониара +2349 2349 134 Соломоновы Острова,Другое +3223 0 3223 Токелау (Н.Зел.) +135 0 135 Тонга +1933 1933 135 Тонга,Нукуалофа +2350 2350 135 Тонга,Другое +136 0 136 Тувалу +1934 1934 136 Тувалу,Фунафути +2351 2351 136 Тувалу,Другое +3224 0 3224 Уоллис и Футуна острова (Фр.) +137 0 137 Фиджи +1935 1935 137 Фиджи,Сува +2352 2352 137 Фиджи,Другое +3226 0 3226 Французская Полинезия +3225 0 3225 Французские Южные территории +138 0 138 Канада +3055 3055 138 Канада,Барлингтон +3049 3049 138 Канада,Броссард +3330 3330 138 Канада,Бурнаби +1169 1169 138 Канада,Ванкувер +3106 3106 138 Канада,Ватерлоо +1170 1170 138 Канада,Виннипег +1171 1171 138 Канада,Галифакс +1172 1172 138 Канада,Гамильтон +3365 3365 138 Канада,Денвер +1173 1173 138 Канада,Калгари +3104 3104 138 Канада,Камлупс +3366 3366 138 Канада,Каннингтон +1174 1174 138 Канада,Квебек +2964 2964 138 Канада,Кингстон +3113 3113 138 Канада,Коквитлам +1175 1175 138 Канада,Монреаль +2920 2920 138 Канада,Ниагара-Фолс +2889 2889 138 Канада,Норд-Йорк +1176 1176 138 Канада,Оттава +2903 2903 138 Канада,Порт Алберни +1177 1177 138 Канада,Ричмонд +1178 1178 138 Канада,Тимминс +2946 2946 138 Канада,Торнхилл +1179 1179 138 Канада,Торонто +1180 1180 138 Канада,Эдмонтон +2353 2353 138 Канада,Другое +407 407 139 США,Вашингтон, столица +426 426 139 США,Айдахо +427 426 139 США,Айдахо,Бойсе +2354 426 139 США,Айдахо,Другое +378 378 139 США,Айова +3109 378 139 США,Айова,Айова Сити +379 378 139 США,Айова,Де-Мойн +2963 378 139 США,Айова,Декора +2355 378 139 США,Айова,Другое +412 412 139 США,Алабама +3236 412 139 США,Алабама,Бирмингем +413 412 139 США,Алабама,Монтгомери +1181 412 139 США,Алабама,Хантсвилл +2356 412 139 США,Алабама,Другое +446 446 139 США,Аляска +1182 446 139 США,Аляска,Анкоридж +447 446 139 США,Аляска,Джуно +1183 446 139 США,Аляска,Фэрбенкс +2357 446 139 США,Аляска,Другое +434 434 139 США,Аризона +2917 434 139 США,Аризона,Темпе +1184 434 139 США,Аризона,Тусон +435 434 139 США,Аризона,Финикс +3061 434 139 США,Аризона,Чандлер +2358 434 139 США,Аризона,Другое +416 416 139 США,Арканзас +417 416 139 США,Арканзас,Литл-Рок +2359 416 139 США,Арканзас,Другое +428 428 139 США,Вайоминг +3017 428 139 США,Вайоминг,Ларами +429 428 139 США,Вайоминг,Шайенн +2360 428 139 США,Вайоминг,Другое +440 440 139 США,Вашингтон +2956 440 139 США,Вашингтон,Беллевью +2967 440 139 США,Вашингтон,Бремертон +3385 440 139 США,Вашингтон,Ванкувер +2865 440 139 США,Вашингтон,Линден +441 440 139 США,Вашингтон,Олимпия +3352 440 139 США,Вашингтон,Порт Орчард +2876 440 139 США,Вашингтон,Редмонт +3003 440 139 США,Вашингтон,Рентон +1185 440 139 США,Вашингтон,Сиэтл +2983 440 139 США,Вашингтон,Снохомиш +1186 440 139 США,Вашингтон,Такома +3152 440 139 США,Вашингтон,Фрайди Харбор +2886 440 139 США,Вашингтон,Эверет +2361 440 139 США,Вашингтон,Другое +352 352 139 США,Вермонт +353 352 139 США,Вермонт,Монтпильер +2861 352 139 США,Вермонт,Норвич +2362 352 139 США,Вермонт,Другое +394 394 139 США,Виргиния +1188 394 139 США,Виргиния,Александрия +1187 394 139 США,Виргиния,Арлингтон +2969 394 139 США,Виргиния,Даллес +1189 394 139 США,Виргиния,Манассас +3114 394 139 США,Виргиния,Норфолк +2885 394 139 США,Виргиния,Ньюпорт-Ньюс +2979 394 139 США,Виргиния,Раунд Хил +3338 394 139 США,Виргиния,Рестон +395 394 139 США,Виргиния,Ричмонд +3005 394 139 США,Виргиния,Уоррентон +2991 394 139 США,Виргиния,Херндон +2996 394 139 США,Виргиния,Центрвиль +3097 394 139 США,Виргиния,Чантилли +2981 394 139 США,Виргиния,Шарлотесвиль +2363 394 139 США,Виргиния,Другое +374 374 139 США,Висконсин +2995 374 139 США,Висконсин,Грин-Бей +375 374 139 США,Висконсин,Мадисон +2365 374 139 США,Висконсин,Другое +448 448 139 США,Гавайи +449 448 139 США,Гавайи,Гонолулу +1191 448 139 США,Гавайи,Хило +2367 448 139 США,Гавайи,Другое +390 390 139 США,Делавер +3021 390 139 США,Делавер,Вильмингтон +391 390 139 США,Делавер,Довер +2973 390 139 США,Делавер,Льюис +2369 390 139 США,Делавер,Другое +402 402 139 США,Джорджия +403 402 139 США,Джорджия,Атланта +2370 402 139 США,Джорджия,Другое +396 396 139 США,Западная Виргиния +397 396 139 США,Западная Виргиния,Чарлстон +2371 396 139 США,Западная Виргиния,Другое +370 370 139 США,Иллинойс +2911 370 139 США,Иллинойс,Вестмонт +3074 370 139 США,Иллинойс,Гарвард +371 370 139 США,Иллинойс,Спрингфилд +2930 370 139 США,Иллинойс,Урбана +1194 370 139 США,Иллинойс,Чикаго +2372 370 139 США,Иллинойс,Другое +368 368 139 США,Индиана +369 368 139 США,Индиана,Индианаполис +1195 368 139 США,Индиана,Эвансвил +2373 368 139 США,Индиана,Другое +444 444 139 США,Калифорния +2959 444 139 США,Калифорния,Анахайм +2961 444 139 США,Калифорния,Аптос +2912 444 139 США,Калифорния,Артезия +2899 444 139 США,Калифорния,Беверли Хилз +1196 444 139 США,Калифорния,Беркли +3249 444 139 США,Калифорния,Бреа +3014 444 139 США,Калифорния,Брисбейн +3048 444 139 США,Калифорния,Венис +2901 444 139 США,Калифорния,Вест-Голливуд +2926 444 139 США,Калифорния,Вестлейк Вилладж +2922 444 139 США,Калифорния,Гардена +1203 444 139 США,Калифорния,Глендейл +2978 444 139 США,Калифорния,Денвиль +2990 444 139 США,Калифорния,Дублин +3077 444 139 США,Калифорния,Дэвис +2918 444 139 США,Калифорния,Ирвайн +2881 444 139 США,Калифорния,Карсон +3247 444 139 США,Калифорния,Кипресс +3092 444 139 США,Калифорния,Коста Меса +2948 444 139 США,Калифорния,Купертино +1197 444 139 США,Калифорния,Лонг-Бич +1198 444 139 США,Калифорния,Лос-Анджелес +3058 444 139 США,Калифорния,Лос-Гатос +3328 444 139 США,Калифорния,Марина-дель-Рей +2874 444 139 США,Калифорния,Маунтин-Вью +2998 444 139 США,Калифорния,Милпитас +3087 444 139 США,Калифорния,Монтерей +2947 444 139 США,Калифорния,Окленд +2900 444 139 США,Калифорния,Пало Альто +1199 444 139 США,Калифорния,Пасадена +3335 444 139 США,Калифорния,Редвуд +2966 444 139 США,Калифорния,Розамонд +445 444 139 США,Калифорния,Сакраменто +1200 444 139 США,Калифорния,Сан-Диего +3317 444 139 США,Калифорния,Сан-Мартин +1201 444 139 США,Калифорния,Сан-Франциско +1202 444 139 США,Калифорния,Сан-Хосе +2878 444 139 США,Калифорния,Саннивейл +2925 444 139 США,Калифорния,Санта-Барбара +2875 444 139 США,Калифорния,Санта-Клара +1204 444 139 США,Калифорния,Санта-Круз +2859 444 139 США,Калифорния,Санта-Моника +3157 444 139 США,Калифорния,Студио Сити +3146 444 139 США,Калифорния,Торранс +2970 444 139 США,Калифорния,Тысяча Дубов +2949 444 139 США,Калифорния,Универсал-Сити +3057 444 139 США,Калифорния,Форт Брэгг +3032 444 139 США,Калифорния,Фостер-Сити +3381 444 139 США,Калифорния,Фремонт +3028 444 139 США,Калифорния,Фуллертон +2858 444 139 США,Калифорния,Эмервиль +3040 444 139 США,Калифорния,Эскондидо +2374 444 139 США,Калифорния,Другое +388 388 139 США,Канзас +3041 388 139 США,Канзас,Лоуренс +389 388 139 США,Канзас,Топика +2375 388 139 США,Канзас,Другое +408 408 139 США,Кентукки +3004 408 139 США,Кентукки,Лексингтон +1205 408 139 США,Кентукки,Луисвилл +409 408 139 США,Кентукки,Франкфорт +2376 408 139 США,Кентукки,Другое +430 430 139 США,Колорадо +1206 430 139 США,Колорадо,Боулдер +3095 430 139 США,Колорадо,Грили +431 430 139 США,Колорадо,Денвер +1207 430 139 США,Колорадо,Колорадо-Спрингс +3046 430 139 США,Колорадо,Литлтон +2377 430 139 США,Колорадо,Другое +358 358 139 США,Коннектикут +2968 358 139 США,Коннектикут,Дариен +3018 358 139 США,Коннектикут,Денбери +2882 358 139 США,Коннектикут,Стэмфорд +359 358 139 США,Коннектикут,Хартфорд +3047 358 139 США,Коннектикут,Шелтон +2378 358 139 США,Коннектикут,Другое +418 418 139 США,Луизиана +419 418 139 США,Луизиана,Батон-Руж +1208 418 139 США,Луизиана,Новый Орлеан +2408 418 139 США,Луизиана,Другое +354 354 139 США,Массачусетс +2931 354 139 США,Массачусетс,Аттлеборо +3334 354 139 США,Массачусетс,Билерика +355 354 139 США,Массачусетс,Бостон +3059 354 139 США,Массачусетс,Вестгемптон +2919 354 139 США,Массачусетс,Вобурн +2902 354 139 США,Массачусетс,Дедхэм +1209 354 139 США,Массачусетс,Кеймбридж +3336 354 139 США,Массачусетс,Нидхем +2985 354 139 США,Массачусетс,Ньютонвиль +3022 354 139 США,Массачусетс,Уолтхэм +2407 354 139 США,Массачусетс,Другое +376 376 139 США,Миннесота +1210 376 139 США,Миннесота,Миннеаполис +2980 376 139 США,Миннесота,Плимут +377 376 139 США,Миннесота,Сент-Пол +3035 376 139 США,Миннесота,Эден Прейри +2406 376 139 США,Миннесота,Другое +414 414 139 США,Миссисипи +415 414 139 США,Миссисипи,Джэксон +2405 414 139 США,Миссисипи,Другое +380 380 139 США,Миссури +381 380 139 США,Миссури,Джефферсон-Сити +3062 380 139 США,Миссури,Канзас Сити +3038 380 139 США,Миссури,Ли Саммит +1211 380 139 США,Миссури,Сент-Луис +2895 380 139 США,Миссури,Эллисвил +2404 380 139 США,Миссури,Другое +372 372 139 США,Мичиган +3357 372 139 США,Мичиган,Вест Блюмфельд +1212 372 139 США,Мичиган,Гранд-Рапидс +1213 372 139 США,Мичиган,Детройт +3103 372 139 США,Мичиган,Каламазу +373 372 139 США,Мичиган,Лансинг +2987 372 139 США,Мичиган,Новай +2887 372 139 США,Мичиган,Сагино +2403 372 139 США,Мичиган,Другое +424 424 139 США,Монтана +1214 424 139 США,Монтана,Грейт-Фолс +425 424 139 США,Монтана,Хелина +2402 424 139 США,Монтана,Другое +348 348 139 США,Мэн +349 348 139 США,Мэн,Огаста +3000 348 139 США,Мэн,Ярмут +2401 348 139 США,Мэн,Другое +392 392 139 США,Мэриленд +393 392 139 США,Мэриленд,Аннаполис +1215 392 139 США,Мэриленд,Балтимор +3143 392 139 США,Мэриленд,Гринбелт +3337 392 139 США,Мэриленд,Колледж Парк +2904 392 139 США,Мэриленд,Маунт Эйри +3329 392 139 США,Мэриленд,Роквилль +2400 392 139 США,Мэриленд,Другое +386 386 139 США,Небраска +387 386 139 США,Небраска,Линкольн +1216 386 139 США,Небраска,Омаха +2399 386 139 США,Небраска,Другое +438 438 139 США,Невада +439 438 139 США,Невада,Карсон-Сити +1217 438 139 США,Невада,Лас-Вегас +2890 438 139 США,Невада,Рено +2398 438 139 США,Невада,Другое +362 362 139 США,Нью-Джерси +1219 362 139 США,Нью-Джерси,Атлантик-Сити +1218 362 139 США,Нью-Джерси,Ньюарк +3276 362 139 США,Нью-Джерси,Оклин +3073 362 139 США,Нью-Джерси,Принстон +2955 362 139 США,Нью-Джерси,Рузерфорд +3349 362 139 США,Нью-Джерси,Сомервиль +363 362 139 США,Нью-Джерси,Трентон +3078 362 139 США,Нью-Джерси,Хакеттстоун +3248 362 139 США,Нью-Джерси,Черри Хилл +2397 362 139 США,Нью-Джерси,Другое +360 360 139 США,Нью-Йорк +3134 360 139 США,Нью-Йорк,Баффало +3081 360 139 США,Нью-Йорк,Бингхэмптон +2997 360 139 США,Нью-Йорк,Бруклин +2999 360 139 США,Нью-Йорк,Варвик +3139 360 139 США,Нью-Йорк,Ирвингтон +3060 360 139 США,Нью-Йорк,Итака +1220 360 139 США,Нью-Йорк,Нью-Йорк +361 360 139 США,Нью-Йорк,Олбани +2914 360 139 США,Нью-Йорк,Погкипси +3056 360 139 США,Нью-Йорк,Саратога Спрингс +2396 360 139 США,Нью-Йорк,Другое +432 432 139 США,Нью-Мексико +1222 432 139 США,Нью-Мексико,Альбукерке +433 432 139 США,Нью-Мексико,Санта-Фе +2395 432 139 США,Нью-Мексико,Другое +350 350 139 США,Нью-Хэмпшир +2989 350 139 США,Нью-Хэмпшир,Амхерст +351 350 139 США,Нью-Хэмпшир,Конкорд +2950 350 139 США,Нью-Хэмпшир,Лондондерри +1221 350 139 США,Нью-Хэмпшир,Манчестер +3111 350 139 США,Нью-Хэмпшир,Рочестер +2898 350 139 США,Нью-Хэмпшир,Салем +2938 350 139 США,Нью-Хэмпшир,Хадсон +2394 350 139 США,Нью-Хэмпшир,Другое +366 366 139 США,Огайо +2953 366 139 США,Огайо,Варрен +3112 366 139 США,Огайо,Гроув Сити +1223 366 139 США,Огайо,Кливленд +367 366 139 США,Огайо,Колумбус +2951 366 139 США,Огайо,Лавленд +2862 366 139 США,Огайо,Оберлин +3034 366 139 США,Огайо,Рейнольдсбург +2860 366 139 США,Огайо,Цинциннати +2393 366 139 США,Огайо,Другое +420 420 139 США,Оклахома +421 420 139 США,Оклахома,Оклахома-Сити +1224 420 139 США,Оклахома,Талса +2392 420 139 США,Оклахома,Другое +442 442 139 США,Орегон +2877 442 139 США,Орегон,Кламат-Фолс +2945 442 139 США,Орегон,Коттедж-Гроув +1225 442 139 США,Орегон,Портленд +443 442 139 США,Орегон,Сейлем +1226 442 139 США,Орегон,Юджин +2391 442 139 США,Орегон,Другое +364 364 139 США,Пенсильвания +3316 364 139 США,Пенсильвания,Вифлием +3282 364 139 США,Пенсильвания,Колледжвиль +2972 364 139 США,Пенсильвания,Нью Фридом +1227 364 139 США,Пенсильвания,Питтсбург +2893 364 139 США,Пенсильвания,Рандор +3110 364 139 США,Пенсильвания,Слиппери Рок +1228 364 139 США,Пенсильвания,Филадельфия +365 364 139 США,Пенсильвания,Харрисберг +2390 364 139 США,Пенсильвания,Другое +450 450 139 США,Пуэрто-Рико +451 450 139 США,Пуэрто-Рико,Понсе +3093 450 139 США,Пуэрто-Рико,Сан-Хуан +2389 450 139 США,Пуэрто-Рико,Другое +356 356 139 США,Род-Айленд +357 356 139 США,Род-Айленд,Провиденс +2388 356 139 США,Род-Айленд,Другое +382 382 139 США,Северная Дакота +383 382 139 США,Северная Дакота,Бисмарк +2387 382 139 США,Северная Дакота,Другое +398 398 139 США,Северная Каролина +2960 398 139 США,Северная Каролина,Вильмингтон +2915 398 139 США,Северная Каролина,Дурхам +399 398 139 США,Северная Каролина,Роли +2386 398 139 США,Северная Каролина,Другое +410 410 139 США,Теннесси +2863 410 139 США,Теннесси,Мемфис +411 410 139 США,Теннесси,Нашвилл +1229 410 139 США,Теннесси,Ноксвилл +2385 410 139 США,Теннесси,Другое +422 422 139 США,Техас +3085 422 139 США,Техас,Бедфорд +2913 422 139 США,Техас,Брейди +1233 422 139 США,Техас,Даллас +2916 422 139 США,Техас,Ирвинг +3123 422 139 США,Техас,Кингсвилл +2873 422 139 США,Техас,Конрой +3096 422 139 США,Техас,Корпус Кристи +423 422 139 США,Техас,Остин +1232 422 139 США,Техас,Сан-Антонио +3023 422 139 США,Техас,Уайли +1231 422 139 США,Техас,Хьюстон +1230 422 139 США,Техас,Эль-Пасо +2384 422 139 США,Техас,Другое +406 406 139 США,Федеральный округ Колумбия +2383 406 139 США,Федеральный округ Колумбия,Другое +404 404 139 США,Флорида +2879 404 139 США,Флорида,Бока-Рейтон +2880 404 139 США,Флорида,Гейнсвил +3086 404 139 США,Флорида,Джексонвиль +3002 404 139 США,Флорида,Киссимми +3124 404 139 США,Флорида,Корал Гейблс +2894 404 139 США,Флорида,Корал-Спрингс +3290 404 139 США,Флорида,Лейк-Ворт +1234 404 139 США,Флорида,Майами +1236 404 139 США,Флорида,Орландо +3372 404 139 США,Флорида,Пинеллас Парк +2952 404 139 США,Флорида,Пунта-Горда +3340 404 139 США,Флорида,Сарасота +1235 404 139 США,Флорида,Сент-Питерсберг +405 404 139 США,Флорида,Таллахасси +2962 404 139 США,Флорида,Форт Лаудердейл +2382 404 139 США,Флорида,Другое +384 384 139 США,Южная Дакота +385 384 139 США,Южная Дакота,Пирр +2381 384 139 США,Южная Дакота,Другое +400 400 139 США,Южная Каролина +401 400 139 США,Южная Каролина,Колумбия +3090 400 139 США,Южная Каролина,Спартанбург +1237 400 139 США,Южная Каролина,Чарлстон +2380 400 139 США,Южная Каролина,Другое +436 436 139 США,Юта +3036 436 139 США,Юта,Кейсвилл +3024 436 139 США,Юта,Линдон +3108 436 139 США,Юта,Орем +2866 436 139 США,Юта,Сент-Джордж +437 436 139 США,Юта,Солт-Лейк-Сити +2379 436 139 США,Юта,Другое +3200 0 3200 Ангилья (Брит.) +140 0 140 Антигуа и Барбуда +1238 1238 140 Антигуа и Барбуда,Сент-Джонс +2442 2442 140 Антигуа и Барбуда,Другое +141 0 141 Аргентина +1239 1239 141 Аргентина,Буэнос-Айрес +2441 2441 141 Аргентина,Другое +3202 0 3202 Аруба (Нид.) +142 0 142 Багамы +1240 1240 142 Багамы,Нассау +2440 2440 142 Багамы,Другое +143 0 143 Барбадос +1241 1241 143 Барбадос,Бриджтаун +2439 2439 143 Барбадос,Другое +146 0 146 Белиз +1242 1242 146 Белиз,Бельмопан +2438 2438 146 Белиз,Другое +3203 0 3203 Бермуды (Брит.) +144 0 144 Боливия +1243 1243 144 Боливия,Ла-Пас +2437 2437 144 Боливия,Другое +145 0 145 Бразилия +1244 1244 145 Бразилия,Бразилиа +3094 3094 145 Бразилия,Пассо Фундо +1245 1245 145 Бразилия,Рио-де-Жанейро +1246 1246 145 Бразилия,Сан-Паулу +2436 2436 145 Бразилия,Другое +147 0 147 Венесуэла +1247 1247 147 Венесуэла,Каракас +2435 2435 147 Венесуэла,Другое +3204 0 3204 Виргинские острова (Брит.) +452 0 452 Виргинские острова (США) +1190 1190 452 Виргинские острова (США),Шарлотта-Амалия +2364 2364 452 Виргинские острова (США),Другое +149 0 149 Гаити +1248 1248 149 Гаити,Порт-о-Пренс +2434 2434 149 Гаити,Другое +148 0 148 Гайана +1249 1249 148 Гайана,Джоржтаун +2433 2433 148 Гайана,Другое +3205 0 3205 Гваделупа (Фр.) +173 0 173 Гватемала +1250 1250 173 Гватемала,Гватемала +2432 2432 173 Гватемала,Другое +150 0 150 Гондурас +1251 1251 150 Гондурас,Тегусигальпа +2431 2431 150 Гондурас,Другое +151 0 151 Гренада +1252 1252 151 Гренада,Сент-Джорджес +2430 2430 151 Гренада,Другое +152 0 152 Гренландия (Дат.) +1253 1253 152 Гренландия (Дат.),Уманак +2429 2429 152 Гренландия (Дат.),Другое +153 0 153 Доминика +1254 1254 153 Доминика,Розо +2428 2428 153 Доминика,Другое +154 0 154 Доминиканская Республика +1255 1255 154 Доминиканская Республика,Санто-Доминго +2427 2427 154 Доминиканская Республика,Другое +155 0 155 Колумбия +1256 1256 155 Колумбия,Богота +2426 2426 155 Колумбия,Другое +156 0 156 Коста-Рика +1257 1257 156 Коста-Рика,Сан-Хосе +2425 2425 156 Коста-Рика,Другое +157 0 157 Куба +1258 1258 157 Куба,Гавана +2424 2424 157 Куба,Другое +3208 0 3208 Мартиника (Фр.) +158 0 158 Мексика +1259 1259 158 Мексика,Акапулько +1260 1260 158 Мексика,Мехико +2423 2423 158 Мексика,Другое +3209 0 3209 Монтсеррат (Брит) +3201 0 3201 Нидерландские Антилы +159 0 159 Никарагуа +1261 1261 159 Никарагуа,Манагуа +2422 2422 159 Никарагуа,Другое +3207 0 3207 Остров Кайман (Брит.) +3211 0 3211 Острова Теркс и Кайкос (Брит.) +160 0 160 Панама +1262 1262 160 Панама,Панама +2421 2421 160 Панама,Другое +161 0 161 Парагвай +1263 1263 161 Парагвай,Асунсьон +2420 2420 161 Парагвай,Другое +162 0 162 Перу +1264 1264 162 Перу,Лима +2419 2419 162 Перу,Другое +163 0 163 Сальвадор +1265 1265 163 Сальвадор,Сан-Сальвадор +2418 2418 163 Сальвадор,Другое +164 0 164 Сент-Винсент и Гренадины +1266 1266 164 Сент-Винсент и Гренадины,Кингстаун +2417 2417 164 Сент-Винсент и Гренадины,Другое +165 0 165 Сент-Китс и Невис +1267 1267 165 Сент-Китс и Невис,Бастер +2416 2416 165 Сент-Китс и Невис,Другое +166 0 166 Сент-Люсия +1268 1268 166 Сент-Люсия,Кастри +2415 2415 166 Сент-Люсия,Другое +3210 0 3210 Сент-Пьер и Микелон (Фр.) +167 0 167 Суринам +1269 1269 167 Суринам,Парамарибо +2414 2414 167 Суринам,Другое +168 0 168 Тринидат и Тобаго +1270 1270 168 Тринидат и Тобаго,Порт-оф-Спейн +2413 2413 168 Тринидат и Тобаго,Другое +169 0 169 Уругвай +1271 1271 169 Уругвай,Монтевидео +2412 2412 169 Уругвай,Другое +3212 0 3212 Фолклендские острова (Брит.) +3206 0 3206 Французская Гвиана +170 0 170 Чили +1272 1272 170 Чили,Сантьяго +2411 2411 170 Чили,Другое +171 0 171 Эквадор +1273 1273 171 Эквадор,Гуаякиль +1274 1274 171 Эквадор,Кито +2410 2410 171 Эквадор,Другое +3213 0 3213 Юж. Джорджия и Юж. Сандвичевы о-ва (Брит.) +172 0 172 Ямайка +1275 1275 172 Ямайка,Кингстон +2409 2409 172 Ямайка,Другое +174 0 174 Алжир +1854 1854 174 Алжир,Алжир +2495 2495 174 Алжир,Другое +175 0 175 Ангола +1855 1855 175 Ангола,Луанда +2494 2494 175 Ангола,Другое +176 0 176 Бенин +1856 1856 176 Бенин,Котону +1857 1857 176 Бенин,Порто-Ново +2493 2493 176 Бенин,Другое +177 0 177 Ботсвана +1858 1858 177 Ботсвана,Габороне +2492 2492 177 Ботсвана,Другое +3228 0 3228 Британская территория в Индийском океане +178 0 178 Буркина-Фасо +1859 1859 178 Буркина-Фасо,Уагадугу +2491 2491 178 Буркина-Фасо,Другое +179 0 179 Бурунди +1860 1860 179 Бурунди,Бужумбуру +2490 2490 179 Бурунди,Другое +180 0 180 Габон +1861 1861 180 Габон,Либревиль +2489 2489 180 Габон,Другое +181 0 181 Гамбия +1862 1862 181 Гамбия,Банжул +2488 2488 181 Гамбия,Другое +182 0 182 Гана +1863 1863 182 Гана,Аккра +2487 2487 182 Гана,Другое +183 0 183 Гвинея +1864 1864 183 Гвинея,Конакри +2486 2486 183 Гвинея,Другое +184 0 184 Гвинея-Бисау +1865 1865 184 Гвинея-Бисау,Бисау +2485 2485 184 Гвинея-Бисау,Другое +185 0 185 Джибути +1866 1866 185 Джибути,Джибути +2484 2484 185 Джибути,Другое +186 0 186 Египет +3312 3312 186 Египет,Дахаб +1867 1867 186 Египет,Каир +1868 1868 186 Египет,Хургада +2483 2483 186 Египет,Другое +187 0 187 Замбия +1869 1869 187 Замбия,Лусака +2482 2482 187 Замбия,Другое +3198 0 3198 Зап. Сахара +23 0 23 Зимбабве +1870 1870 23 Зимбабве,Хараре +2481 2481 23 Зимбабве,Другое +188 0 188 Кабо-Верде +1871 1871 188 Кабо-Верде,Прая +2480 2480 188 Кабо-Верде,Другое +189 0 189 Камерун +1872 1872 189 Камерун,Яунде +2479 2479 189 Камерун,Другое +190 0 190 Кения +1873 1873 190 Кения,Найроби +2478 2478 190 Кения,Другое +191 0 191 Коморы +1874 1874 191 Коморы,Морони +2477 2477 191 Коморы,Другое +193 0 193 Конго (Заир) +1875 1875 193 Конго (Заир),Киншаса +2476 2476 193 Конго (Заир),Другое +192 0 192 Конго +1876 1876 192 Конго,Браззавиль +2475 2475 192 Конго,Другое +194 0 194 Кот-д`Ивуар +1877 1877 194 Кот-д`Ивуар,Ямусукро +2474 2474 194 Кот-д`Ивуар,Другое +195 0 195 Лесото +1878 1878 195 Лесото,Масеру +2473 2473 195 Лесото,Другое +196 0 196 Либерия +1879 1879 196 Либерия,Монровия +2472 2472 196 Либерия,Другое +197 0 197 Ливия +1880 1880 197 Ливия,Триполи +2471 2471 197 Ливия,Другое +198 0 198 Маврикий +1881 1881 198 Маврикий,Порт-Луи +2470 2470 198 Маврикий,Другое +199 0 199 Мавритания +1882 1882 199 Мавритания,Нуакшот +2469 2469 199 Мавритания,Другое +200 0 200 Мадагаскар +1883 1883 200 Мадагаскар,Антананариву +2468 2468 200 Мадагаскар,Другое +3229 0 3229 Майотт (Фр.) +201 0 201 Малави +1884 1884 201 Малави,Лилонгве +2467 2467 201 Малави,Другое +202 0 202 Мали +1885 1885 202 Мали,Бамако +2466 2466 202 Мали,Другое +203 0 203 Марокко +1886 1886 203 Марокко,Агадир +1887 1887 203 Марокко,Рабат +2465 2465 203 Марокко,Другое +204 0 204 Мозамбик +1888 1888 204 Мозамбик,Мапуту +2464 2464 204 Мозамбик,Другое +205 0 205 Намибия +1889 1889 205 Намибия,Виндхук +2463 2463 205 Намибия,Другое +206 0 206 Нигер +1890 1890 206 Нигер,Ниамей +2462 2462 206 Нигер,Другое +207 0 207 Нигерия +1891 1891 207 Нигерия,Абуджа +2461 2461 207 Нигерия,Другое +3227 0 3227 Остров Буве (Норв.) +3197 0 3197 Реюньон (Фр.) +208 0 208 Руанда +1892 1892 208 Руанда,Кигали +2460 2460 208 Руанда,Другое +209 0 209 Сан-Томе и Принсипи +1893 1893 209 Сан-Томе и Принсипи,Сан-Томе +2459 2459 209 Сан-Томе и Принсипи,Другое +210 0 210 Свазиленд +1894 1894 210 Свазиленд,Мбабане +2458 2458 210 Свазиленд,Другое +3199 0 3199 Святая Елена (Брит.) +211 0 211 Сейшелы +1895 1895 211 Сейшелы,Виктория +2457 2457 211 Сейшелы,Другое +212 0 212 Сенегал +1896 1896 212 Сенегал,Дакар +2456 2456 212 Сенегал,Другое +213 0 213 Сомали +1897 1897 213 Сомали,Могадишо +2455 2455 213 Сомали,Другое +214 0 214 Судан +1898 1898 214 Судан,Хартум +2454 2454 214 Судан,Другое +215 0 215 Сьерра-Леоне +1899 1899 215 Сьерра-Леоне,Фритаун +2453 2453 215 Сьерра-Леоне,Другое +216 0 216 Танзания +1900 1900 216 Танзания,Дар-эс-Салам +1901 1901 216 Танзания,Додома +2452 2452 216 Танзания,Другое +217 0 217 Того +1902 1902 217 Того,Ломе +2451 2451 217 Того,Другое +218 0 218 Тунис +1903 1903 218 Тунис,Тунис +2450 2450 218 Тунис,Другое +219 0 219 Уганда +1904 1904 219 Уганда,Кампала +2449 2449 219 Уганда,Другое +220 0 220 Центральноафриканская Республика +1905 1905 220 Центральноафриканская Республика,Банги +2448 2448 220 Центральноафриканская Республика,Другое +222 0 222 Чад +1906 1906 222 Чад,Нджамена +2447 2447 222 Чад,Другое +223 0 223 Экваториальная Гвинея +1907 1907 223 Экваториальная Гвинея,Малабо +2446 2446 223 Экваториальная Гвинея,Другое +221 0 221 Эритрея +1908 1908 221 Эритрея,Асмэра +2445 2445 221 Эритрея,Другое +224 0 224 Эфиопия +1909 1909 224 Эфиопия,Аддис-Абеба +2444 2444 224 Эфиопия,Другое +225 0 225 Южно-Африканская Республика (ЮАР) +1910 1910 225 Южно-Африканская Республика (ЮАР),Дурбан +1913 1913 225 Южно-Африканская Республика (ЮАР),Йоханнесбург +1912 1912 225 Южно-Африканская Республика (ЮАР),Кейптаун +3033 3033 225 Южно-Африканская Республика (ЮАР),Пайнтаун +1911 1911 225 Южно-Африканская Республика (ЮАР),Претория +2443 2443 225 Южно-Африканская Республика (ЮАР),Другое +39 0 39 Украина +314 314 39 Украина,Киев +315 315 39 Украина,Винницкая обл. +614 315 39 Украина,Винницкая обл.,Винница +615 315 39 Украина,Винницкая обл.,Хмельник +2566 315 39 Украина,Винницкая обл.,Другое +316 316 39 Украина,Волынская обл. +2940 316 39 Украина,Волынская обл.,Ковель +616 316 39 Украина,Волынская обл.,Луцк +2565 316 39 Украина,Волынская обл.,Другое +317 317 39 Украина,Днепропетровская обл. +617 317 39 Украина,Днепропетровская обл.,Днепродзержинск +618 317 39 Украина,Днепропетровская обл.,Днепропетровск +619 317 39 Украина,Днепропетровская обл.,Кривой Рог +620 317 39 Украина,Днепропетровская обл.,Никополь +621 317 39 Украина,Днепропетровская обл.,Новомосковск +622 317 39 Украина,Днепропетровская обл.,Орджоникидзе +623 317 39 Украина,Днепропетровская обл.,Павлоград +2564 317 39 Украина,Днепропетровская обл.,Другое +318 318 39 Украина,Донецкая обл. +624 318 39 Украина,Донецкая обл.,Артемовск +625 318 39 Украина,Донецкая обл.,Горловка +626 318 39 Украина,Донецкая обл.,Донецк +627 318 39 Украина,Донецкая обл.,Дружковка +628 318 39 Украина,Донецкая обл.,Енакиево +629 318 39 Украина,Донецкая обл.,Константиновка +630 318 39 Украина,Донецкая обл.,Краматорск +2944 318 39 Украина,Донецкая обл.,Красноармейск +631 318 39 Украина,Донецкая обл.,Макеевка +632 318 39 Украина,Донецкая обл.,Мариуполь +633 318 39 Украина,Донецкая обл.,Николаевка +634 318 39 Украина,Донецкая обл.,Славянск +635 318 39 Украина,Донецкая обл.,Харцызск +2563 318 39 Украина,Донецкая обл.,Другое +319 319 39 Украина,Житомирская обл. +636 319 39 Украина,Житомирская обл.,Бердичев +637 319 39 Украина,Житомирская обл.,Житомир +2942 319 39 Украина,Житомирская обл.,Коростень +638 319 39 Украина,Житомирская обл.,Коростышев +2907 319 39 Украина,Житомирская обл.,Малин +639 319 39 Украина,Житомирская обл.,Новоград-Волынский +2562 319 39 Украина,Житомирская обл.,Другое +320 320 39 Украина,Закарпатская обл. +640 320 39 Украина,Закарпатская обл.,Берегово +641 320 39 Украина,Закарпатская обл.,Воловец +3119 320 39 Украина,Закарпатская обл.,Мукачево +3162 320 39 Украина,Закарпатская обл.,Свалява +642 320 39 Украина,Закарпатская обл.,Ужгород +643 320 39 Украина,Закарпатская обл.,Хуст +2561 320 39 Украина,Закарпатская обл.,Другое +321 321 39 Украина,Запорожская обл. +644 321 39 Украина,Запорожская обл.,Бердянск +3128 321 39 Украина,Запорожская обл.,Гуляйполе +645 321 39 Украина,Запорожская обл.,Запорожье +646 321 39 Украина,Запорожская обл.,Мелитополь +3121 321 39 Украина,Запорожская обл.,Приморск +3378 321 39 Украина,Запорожская обл.,Энергодар +2560 321 39 Украина,Запорожская обл.,Другое +322 322 39 Украина,Ивано-Франковская обл. +3379 322 39 Украина,Ивано-Франковская обл.,Галич +647 322 39 Украина,Ивано-Франковская обл.,Ивано-Франковск +3170 322 39 Украина,Ивано-Франковская обл.,Яремче +2559 322 39 Украина,Ивано-Франковская обл.,Другое +323 323 39 Украина,Киевская обл. +648 323 39 Украина,Киевская обл.,Белая Церковь +649 323 39 Украина,Киевская обл.,Борисполь +651 323 39 Украина,Киевская обл.,Бровары +650 323 39 Украина,Киевская обл.,Васильков +652 323 39 Украина,Киевская обл.,Ирпень +3341 323 39 Украина,Киевская обл.,Переяслав-Хмельницкий +653 323 39 Украина,Киевская обл.,Славутич +654 323 39 Украина,Киевская обл.,Фастов +655 323 39 Украина,Киевская обл.,Чернобыль +2558 323 39 Украина,Киевская обл.,Другое +324 324 39 Украина,Кировоградская обл. +656 324 39 Украина,Кировоградская обл.,Александрия +657 324 39 Украина,Кировоградская обл.,Кировоград +658 324 39 Украина,Кировоградская обл.,Светловодск +2557 324 39 Украина,Кировоградская обл.,Другое +325 325 39 Украина,Крым +659 325 39 Украина,Крым,Алушта +2984 325 39 Украина,Крым,Армянск +3042 325 39 Украина,Крым,Балаклава +660 325 39 Украина,Крым,Бахчисарай +662 325 39 Украина,Крым,Гурзуф +3382 325 39 Украина,Крым,Джанкой +663 325 39 Украина,Крым,Евпатория +667 325 39 Украина,Крым,Керчь +666 325 39 Украина,Крым,Коктебель +668 325 39 Украина,Крым,Мысовое +669 325 39 Украина,Крым,Саки +665 325 39 Украина,Крым,Севастополь +661 325 39 Украина,Крым,Симферополь +3370 325 39 Украина,Крым,Старый Крым +670 325 39 Украина,Крым,Судак +664 325 39 Украина,Крым,Феодосия +3148 325 39 Украина,Крым,Черноморское +671 325 39 Украина,Крым,Ялта +2556 325 39 Украина,Крым,Другое +326 326 39 Украина,Луганская обл. +672 326 39 Украина,Луганская обл.,Алчевск +673 326 39 Украина,Луганская обл.,Антрацит +674 326 39 Украина,Луганская обл.,Лисичанск +675 326 39 Украина,Луганская обл.,Луганск +3364 326 39 Украина,Луганская обл.,Молодогвардейск +676 326 39 Украина,Луганская обл.,Петровское +677 326 39 Украина,Луганская обл.,Ровеньки +678 326 39 Украина,Луганская обл.,Рубежное +679 326 39 Украина,Луганская обл.,Северодонецк +680 326 39 Украина,Луганская обл.,Стаханов +2555 326 39 Украина,Луганская обл.,Другое +327 327 39 Украина,Львовская обл. +3284 327 39 Украина,Львовская обл.,Дрогобыч +681 327 39 Украина,Львовская обл.,Львов +682 327 39 Украина,Львовская обл.,Трускавец +2554 327 39 Украина,Львовская обл.,Другое +328 328 39 Украина,Николаевская обл. +3322 328 39 Украина,Николаевская обл.,Вознесенск +2870 328 39 Украина,Николаевская обл.,Жовтневое +683 328 39 Украина,Николаевская обл.,Николаев +3118 328 39 Украина,Николаевская обл.,Очаков +3325 328 39 Украина,Николаевская обл.,Южноукраинск +2553 328 39 Украина,Николаевская обл.,Другое +329 329 39 Украина,Одесская обл. +684 329 39 Украина,Одесская обл.,Белгород-Днестровский +685 329 39 Украина,Одесская обл.,Измаил +689 329 39 Украина,Одесская обл.,Ильичевск +686 329 39 Украина,Одесская обл.,Одесса +688 329 39 Украина,Одесская обл.,Рени +687 329 39 Украина,Одесская обл.,Слободка +2552 329 39 Украина,Одесская обл.,Другое +330 330 39 Украина,Полтавская обл. +690 330 39 Украина,Полтавская обл.,Гадяч +691 330 39 Украина,Полтавская обл.,Комсомольск +693 330 39 Украина,Полтавская обл.,Кременчуг +694 330 39 Украина,Полтавская обл.,Лубны +695 330 39 Украина,Полтавская обл.,Миргород +692 330 39 Украина,Полтавская обл.,Полтава +2551 330 39 Украина,Полтавская обл.,Другое +331 331 39 Украина,Ровенская обл. +696 331 39 Украина,Ровенская обл.,Здолбунов +697 331 39 Украина,Ровенская обл.,Ровно +3361 331 39 Украина,Ровенская обл.,Сарны +2550 331 39 Украина,Ровенская обл.,Другое +332 332 39 Украина,Сумская обл. +3356 332 39 Украина,Сумская обл.,Бурынь +698 332 39 Украина,Сумская обл.,Конотоп +700 332 39 Украина,Сумская обл.,Ромны +699 332 39 Украина,Сумская обл.,Сумы +701 332 39 Украина,Сумская обл.,Шостка +2549 332 39 Украина,Сумская обл.,Другое +333 333 39 Украина,Тернопольская обл. +702 333 39 Украина,Тернопольская обл.,Бережаны +3171 333 39 Украина,Тернопольская обл.,Борщев +703 333 39 Украина,Тернопольская обл.,Тернополь +704 333 39 Украина,Тернопольская обл.,Чортков +2548 333 39 Украина,Тернопольская обл.,Другое +334 334 39 Украина,Харьковская обл. +705 334 39 Украина,Харьковская обл.,Изюм +3346 334 39 Украина,Харьковская обл.,Купянск +3351 334 39 Украина,Харьковская обл.,Купянск +706 334 39 Украина,Харьковская обл.,Лозовая +708 334 39 Украина,Харьковская обл.,Мерефа +707 334 39 Украина,Харьковская обл.,Харьков +709 334 39 Украина,Харьковская обл.,Чугуев +2547 334 39 Украина,Харьковская обл.,Другое +335 335 39 Украина,Херсонская обл. +710 335 39 Украина,Херсонская обл.,Геническ +711 335 39 Украина,Херсонская обл.,Каховка +712 335 39 Украина,Херсонская обл.,Новая Каховка +3280 335 39 Украина,Херсонская обл.,Скадовск +713 335 39 Украина,Херсонская обл.,Херсон +2546 335 39 Украина,Херсонская обл.,Другое +336 336 39 Украина,Хмельницкая обл. +714 336 39 Украина,Хмельницкая обл.,Каменец-Подольский +715 336 39 Украина,Хмельницкая обл.,Красилов +2941 336 39 Украина,Хмельницкая обл.,Нетишин +716 336 39 Украина,Хмельницкая обл.,Полонное +3120 336 39 Украина,Хмельницкая обл.,Сатанов +2943 336 39 Украина,Хмельницкая обл.,Славута +717 336 39 Украина,Хмельницкая обл.,Хмельницкий +3155 336 39 Украина,Хмельницкая обл.,Чемировцы +2542 336 39 Украина,Хмельницкая обл.,Другое +337 337 39 Украина,Черкасская обл. +3169 337 39 Украина,Черкасская обл.,Золотоноша +3016 337 39 Украина,Черкасская обл.,Канев +3333 337 39 Украина,Черкасская обл.,Полонное +718 337 39 Украина,Черкасская обл.,Умань +719 337 39 Украина,Черкасская обл.,Христиновка +720 337 39 Украина,Черкасская обл.,Черкассы +2545 337 39 Украина,Черкасская обл.,Другое +338 338 39 Украина,Черниговская обл. +721 338 39 Украина,Черниговская обл.,Нежин +722 338 39 Украина,Черниговская обл.,Прилуки +723 338 39 Украина,Черниговская обл.,Чернигов +2544 338 39 Украина,Черниговская обл.,Другое +339 339 39 Украина,Черновицкая обл. +724 339 39 Украина,Черновицкая обл.,Черновцы +2543 339 39 Украина,Черновицкая обл.,Другое +40 0 40 Австрия +602 602 40 Австрия,Бад Халл +604 604 40 Австрия,Брегенц +603 603 40 Австрия,Вена +608 608 40 Австрия,Грац +606 606 40 Австрия,Зальцбург +3099 3099 40 Австрия,Зель-ам-Зее +605 605 40 Австрия,Инсбрук +3174 3174 40 Австрия,Кирхберг +609 609 40 Австрия,Клагенфурт +607 607 40 Австрия,Линц +610 610 40 Австрия,Обдах +611 611 40 Австрия,Щтубайтал +2541 2541 40 Австрия,Другое +32 0 32 Албания +612 612 32 Албания,Тирана +2540 2540 32 Албания,Другое +33 0 33 Андорра +613 613 33 Андорра,Андорра-ла-Велья +2539 2539 33 Андорра,Другое +340 0 340 Белоруссия +341 341 340 Белоруссия,Минск +342 342 340 Белоруссия,Брестская обл. +725 342 340 Белоруссия,Брестская обл.,Барановичи +726 342 340 Белоруссия,Брестская обл.,Белоозерск +727 342 340 Белоруссия,Брестская обл.,Береза +728 342 340 Белоруссия,Брестская обл.,Брест +3172 342 340 Белоруссия,Брестская обл.,Дрогичин +729 342 340 Белоруссия,Брестская обл.,Кобрин +730 342 340 Белоруссия,Брестская обл.,Ляховичи +731 342 340 Белоруссия,Брестская обл.,Малорита +732 342 340 Белоруссия,Брестская обл.,Пинск +2538 342 340 Белоруссия,Брестская обл.,Другое +343 343 340 Белоруссия,Витебская обл. +733 343 340 Белоруссия,Витебская обл.,Браслав +735 343 340 Белоруссия,Витебская обл.,Витебск +734 343 340 Белоруссия,Витебская обл.,Новолукомоль +736 343 340 Белоруссия,Витебская обл.,Новополоцк +737 343 340 Белоруссия,Витебская обл.,Орша +738 343 340 Белоруссия,Витебская обл.,Толочин +2537 343 340 Белоруссия,Витебская обл.,Другое +344 344 340 Белоруссия,Гомельская обл. +739 344 340 Белоруссия,Гомельская обл.,Гомель +740 344 340 Белоруссия,Гомельская обл.,Жлобин +741 344 340 Белоруссия,Гомельская обл.,Мозырь +742 344 340 Белоруссия,Гомельская обл.,Речица +743 344 340 Белоруссия,Гомельская обл.,Рогачев +744 344 340 Белоруссия,Гомельская обл.,Светлогорск +2536 344 340 Белоруссия,Гомельская обл.,Другое +345 345 340 Белоруссия,Гродненская обл. +745 345 340 Белоруссия,Гродненская обл.,Волковыск +746 345 340 Белоруссия,Гродненская обл.,Гродно +747 345 340 Белоруссия,Гродненская обл.,Лида +3244 345 340 Белоруссия,Гродненская обл.,Слоним +748 345 340 Белоруссия,Гродненская обл.,Сморгонь +2535 345 340 Белоруссия,Гродненская обл.,Другое +346 346 340 Белоруссия,Минская обл. +3149 346 340 Белоруссия,Минская обл.,Березино +749 346 340 Белоруссия,Минская обл.,Борисов +750 346 340 Белоруссия,Минская обл.,Вилейка +751 346 340 Белоруссия,Минская обл.,Жодино +752 346 340 Белоруссия,Минская обл.,Марьина Горка +753 346 340 Белоруссия,Минская обл.,Молодечно +2896 346 340 Белоруссия,Минская обл.,Слуцк +754 346 340 Белоруссия,Минская обл.,Смолевичи +755 346 340 Белоруссия,Минская обл.,Солигорск +756 346 340 Белоруссия,Минская обл.,Червень +2534 346 340 Белоруссия,Минская обл.,Другое +347 347 340 Белоруссия,Могилевская обл. +757 347 340 Белоруссия,Могилевская обл.,Бобруйск +758 347 340 Белоруссия,Могилевская обл.,Могилев +759 347 340 Белоруссия,Могилевская обл.,Осиповичи +2533 347 340 Белоруссия,Могилевская обл.,Другое +38 0 38 Бельгия +760 760 38 Бельгия,Антверпен +767 767 38 Бельгия,Арлон +762 762 38 Бельгия,Брюгге +761 761 38 Бельгия,Брюссель +763 763 38 Бельгия,Гент +769 769 38 Бельгия,Лувен +765 765 38 Бельгия,Льеж +764 764 38 Бельгия,Монс +3117 3117 38 Бельгия,Мортсель +766 766 38 Бельгия,Намюр +768 768 38 Бельгия,Хасселт +2532 2532 38 Бельгия,Другое +41 0 41 Болгария +3098 3098 41 Болгария,Банско +792 792 41 Болгария,Благоевград +770 770 41 Болгария,Бургас +771 771 41 Болгария,Бяла +773 773 41 Болгария,Варна +776 776 41 Болгария,Велико-Тырново +788 788 41 Болгария,Видин +789 789 41 Болгария,Враца +796 796 41 Болгария,Габрово +777 777 41 Болгария,Димитровград +781 781 41 Болгария,Каварна +786 786 41 Болгария,Кырджали +791 791 41 Болгария,Кюстендил +793 793 41 Болгария,Лазарджик +795 795 41 Болгария,Ловеч +787 787 41 Болгария,Михайловград +790 790 41 Болгария,Перник +3133 3133 41 Болгария,Пирдоп +794 794 41 Болгария,Плевен +782 782 41 Болгария,Пловдив +780 780 41 Болгария,Разград +779 779 41 Болгария,Русе +774 774 41 Болгария,Силистра +784 784 41 Болгария,Сливен +772 772 41 Болгария,София +775 775 41 Болгария,Толбухин +3116 3116 41 Болгария,Тырново +785 785 41 Болгария,Хасково +778 778 41 Болгария,Шумен +783 783 41 Болгария,Ямбол +2531 2531 41 Болгария,Другое +42 0 42 Босния и Герцеговина +797 797 42 Босния и Герцеговина,Баня-Лука +799 799 42 Босния и Герцеговина,Зеница +798 798 42 Босния и Герцеговина,Сараево +800 800 42 Босния и Герцеговина,Тузла +2530 2530 42 Босния и Герцеговина,Другое +43 0 43 Ватикан +45 0 45 Великобритания +802 802 45 Великобритания,Абердин +3075 3075 45 Великобритания,Айслворт +801 801 45 Великобритания,Алнвик +804 804 45 Великобритания,Бидефорд +803 803 45 Великобритания,Бирмингем +805 805 45 Великобритания,Блоксвич +3168 3168 45 Великобритания,Бостон +806 806 45 Великобритания,Брайтон +807 807 45 Великобритания,Бредфорд +808 808 45 Великобритания,Бристоль +809 809 45 Великобритания,Вилленхолл +3131 3131 45 Великобритания,Воррингтон +810 810 45 Великобритания,Вудбридж +3342 3342 45 Великобритания,Гилфорд +811 811 45 Великобритания,Глазго +812 812 45 Великобритания,Дадли +813 813 45 Великобритания,Дарем +814 814 45 Великобритания,Дуглас +3089 3089 45 Великобритания,Кардиф +815 815 45 Великобритания,Кембридж +816 816 45 Великобритания,Кентербери +817 817 45 Великобритания,Ливерпуль +818 818 45 Великобритания,Лидс +819 819 45 Великобритания,Лондон +820 820 45 Великобритания,Манчестер +2976 2976 45 Великобритания,Митчем +2988 2988 45 Великобритания,Мэйденхед +821 821 45 Великобритания,Ноттингем +3088 3088 45 Великобритания,Ньюпорт +822 822 45 Великобритания,Оксфорд +823 823 45 Великобритания,Плимут +824 824 45 Великобритания,Портсмут +825 825 45 Великобритания,Престон +3343 3343 45 Великобритания,Райд +2867 2867 45 Великобритания,Ридинг +2986 2986 45 Великобритания,Сент-Албанс +826 826 45 Великобритания,Стаффорд +3063 3063 45 Великобритания,Стокпорт +827 827 45 Великобритания,Уэймут +3140 3140 45 Великобритания,Челтенхэм +828 828 45 Великобритания,Честер +829 829 45 Великобритания,Шеффилд +830 830 45 Великобритания,Эдинбург +2529 2529 45 Великобритания,Другое +44 0 44 Венгрия +831 831 44 Венгрия,Будапешт +832 832 44 Венгрия,Геделле +836 836 44 Венгрия,Дебрецен +835 835 44 Венгрия,Мишкольц +834 834 44 Венгрия,Сегед +833 833 44 Венгрия,Шиофок +2528 2528 44 Венгрия,Другое +46 0 46 Германия +3007 3007 46 Германия,Аахен +837 837 46 Германия,Аугсбург +838 838 46 Германия,Баден-Баден +3371 3371 46 Германия,Бамберг +839 839 46 Германия,Бергиш-Гладбах +840 840 46 Германия,Берлин +841 841 46 Германия,Билефельд +3163 3163 46 Германия,Бовенден +842 842 46 Германия,Бонн +843 843 46 Германия,Браденбург +3015 3015 46 Германия,Брауншвейг +844 844 46 Германия,Бремен +2921 2921 46 Германия,Варштайн +845 845 46 Германия,Веймар +846 846 46 Германия,Вупперталь +847 847 46 Германия,Гамбург +848 848 46 Германия,Ганновер +849 849 46 Германия,Гарделеген +3010 3010 46 Германия,Гейдельберг +850 850 46 Германия,Гота +851 851 46 Германия,Дармштадт +3072 3072 46 Германия,Дессау +852 852 46 Германия,Детмольд +853 853 46 Германия,Дортмунд +854 854 46 Германия,Дрезден +855 855 46 Германия,Дюссельдорф +3082 3082 46 Германия,Иффецхайм +3309 3309 46 Германия,Кассел +856 856 46 Германия,Кельн +857 857 46 Германия,Киль +3138 3138 46 Германия,Кобленц +858 858 46 Германия,Крефельд +859 859 46 Германия,Лейпциг +2872 2872 46 Германия,Лимбург +2965 2965 46 Германия,Линген +3135 3135 46 Германия,Любек +3156 3156 46 Германия,Мангейм +3192 3192 46 Германия,Меерсбург +860 860 46 Германия,Мюнстер +861 861 46 Германия,Мюнхен +2864 2864 46 Германия,Нойштадт +862 862 46 Германия,Нюрнберг +3009 3009 46 Германия,Оффенбург +2993 2993 46 Германия,Падерборн +863 863 46 Германия,Равенсбург +864 864 46 Германия,Регенсбург +865 865 46 Германия,Рейнен +866 866 46 Германия,Росток +3191 3191 46 Германия,Саарбрюкен +2974 2974 46 Германия,Санкт-Августин +3127 3127 46 Германия,Тюринген +867 867 46 Германия,Фрайберг +868 868 46 Германия,Фрайбург +869 869 46 Германия,Франкфурт-на-Майне +3373 3373 46 Германия,Хемнитц +3313 3313 46 Германия,Хильден +870 870 46 Германия,Штутгарт +3045 3045 46 Германия,Эрланген +2906 2906 46 Германия,Эшборн +2527 2527 46 Германия,Другое +3193 0 3193 Гернси (Брит.) +47 0 47 Гибралтар (Брит.) +48 0 48 Греция +871 871 48 Греция,Афины +873 873 48 Греция,Ираклион +3147 3147 48 Греция,Корфу +872 872 48 Греция,Салоники +3178 3178 48 Греция,Халкидики +2526 2526 48 Греция,Другое +49 0 49 Дания +3006 3006 49 Дания,Архус +874 874 49 Дания,Копенгаген +875 875 49 Дания,Оденсе +3285 3285 49 Дания,Ольборг +876 876 49 Дания,Сванеке +3126 3126 49 Дания,Скиве +2525 2525 49 Дания,Другое +3194 0 3194 Джерси (Брит.) +50 0 50 Ирландия +3377 3377 50 Ирландия,Виклоу +3067 3067 50 Ирландия,Голвей +877 877 50 Ирландия,Дублин +3065 3065 50 Ирландия,Килларней +3066 3066 50 Ирландия,Корк +878 878 50 Ирландия,Лимерик +3069 3069 50 Ирландия,Нейс +3068 3068 50 Ирландия,Типперэри +2524 2524 50 Ирландия,Другое +51 0 51 Исландия +879 879 51 Исландия,Рейкьявик +2523 2523 51 Исландия,Другое +34 0 34 Испания +880 880 34 Испания,Аликанте +3125 3125 34 Испания,Альмерия +881 881 34 Испания,Барселона +890 890 34 Испания,Бильбао +3076 3076 34 Испания,Бланес +882 882 34 Испания,Валенсия +3070 3070 34 Испания,Ибица +888 888 34 Испания,Кадис +886 886 34 Испания,Картахена +891 891 34 Испания,Ла-Корунья +3310 3310 34 Испания,Лорет де Мар +883 883 34 Испания,Мадрид +884 884 34 Испания,Малага +885 885 34 Испания,Марбелья +892 892 34 Испания,Овьедо +3179 3179 34 Испания,Пальма де Майорка +3177 3177 34 Испания,Сан-Агустин +3289 3289 34 Испания,Санта-Крус-де-Тенерифе +889 889 34 Испания,Сарагоса +887 887 34 Испания,Севилья +893 893 34 Испания,Хихон +2522 2522 34 Испания,Другое +52 0 52 Италия +3318 3318 52 Италия,Аоста +3278 3278 52 Италия,Беллариа +906 906 52 Италия,Болонья +894 894 52 Италия,Брешиа +895 895 52 Италия,Венеция +905 905 52 Италия,Верона +896 896 52 Италия,Генуя +897 897 52 Италия,Лекко +3369 3369 52 Италия,Ливорно +3327 3327 52 Италия,Марсала +898 898 52 Италия,Милан +899 899 52 Италия,Модена +907 907 52 Италия,Неаполь +908 908 52 Италия,Перуджа +900 900 52 Италия,Пиза +901 901 52 Италия,Рим +3368 3368 52 Италия,Сан-Ремо +3384 3384 52 Италия,Сиракуза +3252 3252 52 Италия,Терамо +902 902 52 Италия,Триест +903 903 52 Италия,Турин +3130 3130 52 Италия,Фано +904 904 52 Италия,Флоренция +2521 2521 52 Италия,Другое +53 0 53 Латвия +2939 2939 53 Латвия,Айзкраукле +3054 3054 53 Латвия,Валка +909 909 53 Латвия,Даугавпилс +2934 2934 53 Латвия,Екабпилс +913 913 53 Латвия,Елгава +2935 2935 53 Латвия,Кокнесе +912 912 53 Латвия,Лиепая +2905 2905 53 Латвия,Резекне +911 911 53 Латвия,Рига +2936 2936 53 Латвия,Саласпилс +2937 2937 53 Латвия,Смилтене +910 910 53 Латвия,Юрмала +2520 2520 53 Латвия,Другое +54 0 54 Литва +914 914 54 Литва,Вильнюс +915 915 54 Литва,Висагинас +916 916 54 Литва,Каунас +918 918 54 Литва,Клайпеда +919 919 54 Литва,Паланга +3173 3173 54 Литва,Пеневежис +917 917 54 Литва,Шауляй +2519 2519 54 Литва,Другое +55 0 55 Лихтенштейн +920 920 55 Лихтенштейн,Вадуц +2518 2518 55 Лихтенштейн,Другое +56 0 56 Люксембург +3376 3376 56 Люксембург,Бетцдорф +921 921 56 Люксембург,Люксембург +2517 2517 56 Люксембург,Другое +57 0 57 Македония +3142 3142 57 Македония,Битола +922 922 57 Македония,Скопье +2516 2516 57 Македония,Другое +58 0 58 Мальта +923 923 58 Мальта,Валлетта +3154 3154 58 Мальта,Мзида +924 924 58 Мальта,Слима +2515 2515 58 Мальта,Другое +59 0 59 Молдавия +925 925 59 Молдавия,Бельцы +926 926 59 Молдавия,Бендеры +3234 3234 59 Молдавия,Дубоссары +3275 3275 59 Молдавия,Кахул +927 927 59 Молдавия,Кишинев +3321 3321 59 Молдавия,Резина +928 928 59 Молдавия,Рыбница +929 929 59 Молдавия,Тирасполь +3281 3281 59 Молдавия,Чадыр-Лунга +2514 2514 59 Молдавия,Другое +36 0 36 Монако +930 930 36 Монако,Монте-Карло +2513 2513 36 Монако,Другое +60 0 60 Нидерланды +931 931 60 Нидерланды,Амстердам +933 933 60 Нидерланды,Бреда +932 932 60 Нидерланды,Гаага +934 934 60 Нидерланды,Гауда +935 935 60 Нидерланды,Делфт +2977 2977 60 Нидерланды,Донген +3030 3030 60 Нидерланды,Зволле +3091 3091 60 Нидерланды,Ниймеген +936 936 60 Нидерланды,Роттердам +937 937 60 Нидерланды,Утрехт +3044 3044 60 Нидерланды,Эйндховен +3380 3380 60 Нидерланды,Эншеде +2512 2512 60 Нидерланды,Другое +61 0 61 Норвегия +3190 3190 61 Норвегия,Кристиансанд +2857 2857 61 Норвегия,Лиллехаммер +938 938 61 Норвегия,Осло +3355 3355 61 Норвегия,Ставангер +939 939 61 Норвегия,Тронхейм +2511 2511 61 Норвегия,Другое +3195 0 3195 Остров Мэн (Брит.) +62 0 62 Польша +940 940 62 Польша,Белосток +941 941 62 Польша,Варшава +3164 3164 62 Польша,Вроцлав +942 942 62 Польша,Гданьск +943 943 62 Польша,Гливице +3237 3237 62 Польша,Закопане +3165 3165 62 Польша,Зелена Гура +944 944 62 Польша,Катовице +945 945 62 Польша,Краков +3008 3008 62 Польша,Лодзь +3150 3150 62 Польша,Ольштын +946 946 62 Польша,Познань +947 947 62 Польша,Радом +948 948 62 Польша,Сопот +2958 2958 62 Польша,Тыхы +2510 2510 62 Польша,Другое +35 0 35 Португалия +949 949 35 Португалия,Лиссабон +950 950 35 Португалия,Порто +2509 2509 35 Португалия,Другое +63 0 63 Румыния +952 952 63 Румыния,Брашов +951 951 63 Румыния,Бухарест +954 954 63 Румыния,Констанца +955 955 63 Румыния,Плоешти +953 953 63 Румыния,Яссы +2508 2508 63 Румыния,Другое +64 0 64 Сан-Марино +956 956 64 Сан-Марино,Сан-Марино +2507 2507 64 Сан-Марино,Другое +74 0 74 Сербия и Черногория +957 957 74 Сербия и Черногория,Белград +960 960 74 Сербия и Черногория,Ниш +958 958 74 Сербия и Черногория,Нови-Сад +959 959 74 Сербия и Черногория,Сараево +2506 2506 74 Сербия и Черногория,Другое +65 0 65 Словакия +961 961 65 Словакия,Братислава +962 962 65 Словакия,Кошице +3101 3101 65 Словакия,Липтов +963 963 65 Словакия,Попрад +964 964 65 Словакия,Прешов +965 965 65 Словакия,Ружемберок +966 966 65 Словакия,Тврдошин +2505 2505 65 Словакия,Другое +66 0 66 Словения +968 968 66 Словения,Копар +967 967 66 Словения,Любляна +969 969 66 Словения,Марибор +2504 2504 66 Словения,Другое +67 0 67 Фарерские о-ва (Дания) +970 970 67 Фарерские о-ва (Дания),Торсхавн +2503 2503 67 Фарерские о-ва (Дания),Другое +68 0 68 Финляндия +2888 2888 68 Финляндия,Вантаа +971 971 68 Финляндия,Васа +979 979 68 Финляндия,Котка +972 972 68 Финляндия,Коувола +980 980 68 Финляндия,Лахти +973 973 68 Финляндия,Оулу +3375 3375 68 Финляндия,Риихимяки +3159 3159 68 Финляндия,Руовеси +974 974 68 Финляндия,Тампере +975 975 68 Финляндия,Турку +976 976 68 Финляндия,Хельсинки +977 977 68 Финляндия,Эспо +978 978 68 Финляндия,Ювяскюля +2502 2502 68 Финляндия,Другое +37 0 37 Франция +996 996 37 Франция,Авиньон +983 983 37 Франция,Бержерак +997 997 37 Франция,Блуа +984 984 37 Франция,Бордо +998 998 37 Франция,Дижон +987 987 37 Франция,Канн +988 988 37 Франция,Кастр +993 993 37 Франция,Клермон-Ферран +3037 3037 37 Франция,Лилль +989 989 37 Франция,Лион +985 985 37 Франция,Марсель +991 991 37 Франция,Мец +3161 3161 37 Франция,Мобеж +990 990 37 Франция,Нанси +994 994 37 Франция,Нант +995 995 37 Франция,Ницца +999 999 37 Франция,Орлеан +981 981 37 Франция,Париж +3374 3374 37 Франция,Перпиньян +992 992 37 Франция,Руан +982 982 37 Франция,Страсбург +986 986 37 Франция,Тулуза +3314 3314 37 Франция,Шамбери +2501 2501 37 Франция,Другое +69 0 69 Хорватия +1003 1003 69 Хорватия,Дубровник +1000 1000 69 Хорватия,Загреб +1001 1001 69 Хорватия,Задар +1004 1004 69 Хорватия,Риека +1002 1002 69 Хорватия,Сплит +2500 2500 69 Хорватия,Другое +70 0 70 Чехия +1005 1005 70 Чехия,Брно +3291 3291 70 Чехия,Гавличкув-Брод +1007 1007 70 Чехия,Градец-Кралове +1008 1008 70 Чехия,Карлови-Вари +3019 3019 70 Чехия,Кладрубы +1010 1010 70 Чехия,Лоуни +1009 1009 70 Чехия,Острава +1015 1015 70 Чехия,Пльзень +3105 3105 70 Чехия,Правчицка Брана +1006 1006 70 Чехия,Прага +3246 3246 70 Чехия,Тачов +1011 1011 70 Чехия,Тршебич +1012 1012 70 Чехия,Усти-над-Лабем +1014 1014 70 Чехия,Ческе-Будеевице +1013 1013 70 Чехия,Яблонец-над-Нисоу +2499 2499 70 Чехия,Другое +71 0 71 Швейцария +1016 1016 71 Швейцария,Арау +1019 1019 71 Швейцария,Баден +1017 1017 71 Швейцария,Базель +1018 1018 71 Швейцария,Берн +1020 1020 71 Швейцария,Биль +1021 1021 71 Швейцария,Винтертур +1022 1022 71 Швейцария,Давос +3189 3189 71 Швейцария,Делемонт +1023 1023 71 Швейцария,Женева +1024 1024 71 Швейцария,Золотурн +1025 1025 71 Швейцария,Лозанна +1026 1026 71 Швейцария,Локарно +1027 1027 71 Швейцария,Лугано +1028 1028 71 Швейцария,Люцерн +1029 1029 71 Швейцария,Монтре +1030 1030 71 Швейцария,Цюрих +2498 2498 71 Швейцария,Другое +72 0 72 Швеция +2883 2883 72 Швеция,Арбога +1031 1031 72 Швеция,Гетеборг +1032 1032 72 Швеция,Кальмар +1037 1037 72 Швеция,Лахольм +1036 1036 72 Швеция,Лулео +1042 1042 72 Швеция,Лунд +1033 1033 72 Швеция,Мальме +1034 1034 72 Швеция,Стокгольм +1041 1041 72 Швеция,Умео +1039 1039 72 Швеция,Фалун +1043 1043 72 Швеция,Хельсинборг +1040 1040 72 Швеция,Хернесанд +1038 1038 72 Швеция,Эстерсунд +2497 2497 72 Швеция,Другое +3196 0 3196 Шпицберген (Норв.) +73 0 73 Эстония +3013 3013 73 Эстония,Валга +1044 1044 73 Эстония,Кейла +1045 1045 73 Эстония,Кохтла-Ярве +1046 1046 73 Эстония,Маарду +1047 1047 73 Эстония,Мыйзакюла +1048 1048 73 Эстония,Нарва +1049 1049 73 Эстония,Пярну +1050 1050 73 Эстония,Раквере +1051 1051 73 Эстония,Силламяэ +1052 1052 73 Эстония,Таллин +1053 1053 73 Эстония,Тарту +1054 1054 73 Эстония,Хаапсалу +2496 2496 73 Эстония,Другое diff --git a/MRA/Icons/Alarm.ico b/MRA/Icons/Alarm.ico new file mode 100644 index 0000000..9da83ea Binary files /dev/null and b/MRA/Icons/Alarm.ico differ diff --git a/MRA/Icons/AuthGrant.ico b/MRA/Icons/AuthGrant.ico new file mode 100644 index 0000000..f24b71c Binary files /dev/null and b/MRA/Icons/AuthGrant.ico differ diff --git a/MRA/Icons/AuthReguest.ico b/MRA/Icons/AuthReguest.ico new file mode 100644 index 0000000..d7fb7db Binary files /dev/null and b/MRA/Icons/AuthReguest.ico differ diff --git a/MRA/Icons/Bagz.ico b/MRA/Icons/Bagz.ico new file mode 100644 index 0000000..87de879 Binary files /dev/null and b/MRA/Icons/Bagz.ico differ diff --git a/MRA/Icons/BlogStatus.ico b/MRA/Icons/BlogStatus.ico new file mode 100644 index 0000000..a5dcea4 Binary files /dev/null and b/MRA/Icons/BlogStatus.ico differ diff --git a/MRA/Icons/Blogs.ico b/MRA/Icons/Blogs.ico new file mode 100644 index 0000000..7de74d3 Binary files /dev/null and b/MRA/Icons/Blogs.ico differ diff --git a/MRA/Icons/Chat.ico b/MRA/Icons/Chat.ico new file mode 100644 index 0000000..5427f11 Binary files /dev/null and b/MRA/Icons/Chat.ico differ diff --git a/MRA/Icons/Info.ico b/MRA/Icons/Info.ico new file mode 100644 index 0000000..3cbe896 Binary files /dev/null and b/MRA/Icons/Info.ico differ diff --git a/MRA/Icons/Magent.ico b/MRA/Icons/Magent.ico new file mode 100644 index 0000000..468cbcd Binary files /dev/null and b/MRA/Icons/Magent.ico differ diff --git a/MRA/Icons/Mail.ico b/MRA/Icons/Mail.ico new file mode 100644 index 0000000..55007a8 Binary files /dev/null and b/MRA/Icons/Mail.ico differ diff --git a/MRA/Icons/MailNotify.ico b/MRA/Icons/MailNotify.ico new file mode 100644 index 0000000..a4520bc Binary files /dev/null and b/MRA/Icons/MailNotify.ico differ diff --git a/MRA/Icons/Phone.ico b/MRA/Icons/Phone.ico new file mode 100644 index 0000000..0716aed Binary files /dev/null and b/MRA/Icons/Phone.ico differ diff --git a/MRA/Icons/Photo.ico b/MRA/Icons/Photo.ico new file mode 100644 index 0000000..dab4e20 Binary files /dev/null and b/MRA/Icons/Photo.ico differ diff --git a/MRA/Icons/PostCards.ico b/MRA/Icons/PostCards.ico new file mode 100644 index 0000000..517653a Binary files /dev/null and b/MRA/Icons/PostCards.ico differ diff --git a/MRA/Icons/WebSearch.ico b/MRA/Icons/WebSearch.ico new file mode 100644 index 0000000..6ac68cd Binary files /dev/null and b/MRA/Icons/WebSearch.ico differ diff --git a/MRA/Icons/answers.ico b/MRA/Icons/answers.ico new file mode 100644 index 0000000..1b2bf77 Binary files /dev/null and b/MRA/Icons/answers.ico differ diff --git a/MRA/Icons/my world.ico b/MRA/Icons/my world.ico new file mode 100644 index 0000000..6e0a4a6 Binary files /dev/null and b/MRA/Icons/my world.ico differ diff --git a/MRA/Icons/video.ico b/MRA/Icons/video.ico new file mode 100644 index 0000000..9c075ab Binary files /dev/null and b/MRA/Icons/video.ico differ diff --git a/MRA/Mra.cpp b/MRA/Mra.cpp new file mode 100644 index 0000000..ef75675 --- /dev/null +++ b/MRA/Mra.cpp @@ -0,0 +1,912 @@ +#include "Mra.h" + + + + + + +#ifndef _WIN64 + +/*extern "C" __declspec(naked) void _chkstk() +{ + #define _PAGESIZE_ 4096 + + __asm + { + push ecx + + ; Calculate new TOS. + + lea ecx, [esp] + 8 - 4 ; TOS before entering function + size for ret value + sub ecx, eax ; new TOS + + ; Handle allocation size that results in wraparound. + ; Wraparound will result in StackOverflow exception. + + sbb eax, eax ; 0 if CF==0, ~0 if CF==1 + not eax ; ~0 if TOS did not wrapped around, 0 otherwise + and ecx, eax ; set to 0 if wraparound + + mov eax, esp ; current TOS + and eax, not ( _PAGESIZE_ - 1) ; Round down to current page boundary + + cs10: + cmp ecx, eax ; Is new TOS + jb short cs20 ; in probed page? + mov eax, ecx ; yes. + pop ecx + xchg esp, eax ; update esp + mov eax, dword ptr [eax] ; get return address + mov dword ptr [esp], eax ; and put it at new TOS + ret + + ; Find next lower page and probe + cs20: + sub eax, _PAGESIZE_ ; decrease by PAGESIZE + test dword ptr [eax],eax ; probe page. + jmp short cs10 + + } +}//*/ + + + + +/*extern "C" __declspec(naked) void __cdecl _chkstk() +{ + _asm { jz esp_okay }; + _asm { int 3 }; +esp_okay: + _asm { ret }; +} //*/ + + + + + + + /*//_alloca_probe_16 : 16 byte aligned alloca + extern "C" void _alloca_probe_16() + { + __asm + { + push ecx + lea ecx, [esp] + 8 ; TOS before entering this function + sub ecx, eax ; New TOS + and ecx, (16 - 1) ; Distance from 16 bit align (align down) + add eax, ecx ; Increase allocation size + sbb ecx, ecx ; ecx = 0xFFFFFFFF if size wrapped around + or eax, ecx ; cap allocation size on wraparound + pop ecx ; Restore ecx + jmp _chkstk + } + } + + //alloca_8: 8 byte aligned alloca + extern "C" void _alloca_probe_8() + { + __asm + { + push ecx + lea ecx, [esp] + 8 ; TOS before entering this function + sub ecx, eax ; New TOS + and ecx, (8 - 1) ; Distance from 8 bit align (align down) + add eax, ecx ; Increase allocation Size + sbb ecx, ecx ; ecx = 0xFFFFFFFF if size wrapped around + or eax, ecx ; cap allocation size on wraparound + pop ecx ; Restore ecx + jmp _chkstk + } + }//*/ + +/*extern "C" void __cdecl _chkstk() +{ + __asm + { + push ebp + sub eax, 4 + xchg [esp+4], ebp + sub esp, eax + xchg [esp], ebp + mov ebp, esp + add ebp, eax + mov ebp, [ebp] + } +}//*/ + + + +/*#define _PAGESIZE_ 1000h + +#if !defined (__MARM__) +extern "C" void __declspec(naked) _chkstk(void) +{ + _asm + { + push ecx + cmp eax,_PAGESIZE_ + lea ecx,[esp] + 8 + jb short lastpage + + probepages: + sub ecx,_PAGESIZE_ + sub eax,_PAGESIZE_ + + test dword ptr [ecx],eax + + cmp eax,_PAGESIZE_ + jae short probepages + + lastpage: + sub ecx,eax + mov eax,esp + + test dword ptr [ecx],eax + + mov esp,ecx + + mov ecx,dword ptr [eax] + mov eax,dword ptr [eax + 4] + + push eax + ret + } +} +#endif**/ + + + +/*// будем тока выделять место в стеке под переменные +extern "C" __declspec(naked) void _chkstk() +{ + __asm + { + // Enter: EAX = size + + xor ebx, ebx + xchg [esp], ebx // запоминаем адрес возврата + add esp, 4 // удаляем его + sub esp, eax // выделяем место + push ebx // кладем адрес возврата на место и возвращаемся + retn + } +}//*/ + + + +//extern "C" void __declspec(naked) __cdecl _chkesp() +/*extern "C" __declspec(naked) void __cdecl _chkstk() +{ +#ifndef _PAGESIZE_ + #define _PAGESIZE_ 1000h +#endif //_PAGESIZE_ + + __asm + { + push ecx // save ecx + cmp eax, _PAGESIZE_ // more than one page requested? + lea ecx, [esp] + 8 // compute new stack pointer in ecx + // correct for return address and + // saved ecx + jb short lastpage // no + + +probepages: + + sub ecx, _PAGESIZE_ // yes, move down a page + sub eax, _PAGESIZE_ // adjust request and... + + test dword ptr [ecx], eax // ...probe it + + cmp eax, _PAGESIZE_ // more than one page requested? + jae short probepages // no + + +lastpage: + + sub ecx, eax // move stack down by eax + mov eax, esp // save current tos and do a... + + test dword ptr [ecx], eax // ...probe in case a page was crossed + + mov esp, ecx // set the new stack pointer + + mov ecx, dword ptr [eax] // recover ecx + mov eax, dword ptr [eax + 4]// recover return address + + push eax // prepare return address + // ...probe in case a page was crossed + ret + } +}//*/ + + + + + + +extern "C" __declspec(naked) void __cdecl _chkstk() +{ + #define _PAGESIZE_ 4096 + + __asm + { + push ecx + + ; Calculate new TOS. + + lea ecx, [esp] + 8 - 4 ; TOS before entering function + size for ret value + sub ecx, eax ; new TOS + + ; Handle allocation size that results in wraparound. + ; Wraparound will result in StackOverflow exception. + + sbb eax, eax ; 0 if CF==0, ~0 if CF==1 + not eax ; ~0 if TOS did not wrapped around, 0 otherwise + and ecx, eax ; set to 0 if wraparound + + mov eax, esp ; current TOS + and eax, not ( _PAGESIZE_ - 1) ; Round down to current page boundary + + cs10: + cmp ecx, eax ; Is new TOS + jb short cs20 ; in probed page? + mov eax, ecx ; yes. + pop ecx + xchg esp, eax ; update esp + mov eax, dword ptr [eax] ; get return address + mov dword ptr [esp], eax ; and put it at new TOS + ret + + ; Find next lower page and probe + cs20: + sub eax, _PAGESIZE_ ; decrease by PAGESIZE + test dword ptr [eax],eax ; probe page. + jmp short cs10 + + } +}// + + +extern "C" void __declspec(naked) __cdecl _aulldiv() +{// http://tamiaode.3322.org/svn/ntldr/trunk/source/ntldr/ia32/x86stub.cpp + __asm + { + push ebx + push esi + + mov eax,[esp + 24] + or eax,eax + jnz short L1 + + mov ecx,[esp + 20] + mov eax,[esp + 16] + xor edx,edx + div ecx + mov ebx,eax + mov eax,[esp + 12] + div ecx + mov edx,ebx + jmp short L2 + + L1: + mov ecx,eax + mov ebx,[esp + 20] + mov edx,[esp + 14] + mov eax,[esp + 12] + + L3: + shr ecx,1 + rcr ebx,1 + shr edx,1 + rcr eax,1 + or ecx,ecx + jnz short L3 + div ebx + mov esi,eax + + mul dword ptr [esp + 24] + mov ecx,eax + mov eax,[esp + 20] + mul esi + add edx,ecx + jc short L4 + + cmp edx,[esp + 16] + ja short L4 + jb short L5 + cmp eax,[esp + 12] + jbe short L5 + L4: + dec esi + L5: + xor edx,edx + mov eax,esi + + L2: + + pop esi + pop ebx + + ret 16 + } +}// + +// +// LONG64 mul +// +extern "C" void __declspec(naked) __cdecl _allmul() +{ + __asm + { + mov eax,[esp + 4][4] + mov ecx,[esp + 12][4] + or ecx,eax + mov ecx,[esp + 12] + jnz short hard + + mov eax,[esp + 4] + mul ecx + ret 16 + +hard: + push ebx + mul ecx + mov ebx,eax + mov eax,[esp + 8] + mul dword ptr [esp + 16][4] + add ebx,eax + mov eax,[esp + 8] + mul ecx + add edx,ebx + pop ebx + + ret 16 + } +}//*/ + + +// +// 64bits shift left +// +extern "C" __declspec(naked) void __cdecl _allshl() +{ + __asm + { + cmp cl, 64 + jae short RETZERO + + cmp cl, 32 + jae short MORE32 + shld edx,eax,cl + shl eax,cl + ret + + MORE32: + mov edx,eax + xor eax,eax + and cl,31 + shl edx,cl + ret + + RETZERO: + xor eax,eax + xor edx,edx + ret + } +} +#endif + + + + +PLUGINLINK *pluginLink; +MM_INTERFACE mmi; +MRA_SETTINGS masMraSettings; + + + +PLUGININFOEX pluginInfoEx={ + sizeof(PLUGININFOEX), + PROTOCOL_DISPLAY_NAME_ORIGA, + PLUGIN_VERSION_DWORD, + "Provides support for Mail.ru agent Instant Messenger protocol.", + "Rozhuk Ivan", + "Rozhuk_I@mail.ru", + "© 2006-2011 Rozhuk Ivan", + "http://addons.miranda-im.org/details.php?action=viewfile&id=2544", + UNICODE_AWARE, //not transient + 0, //doesn't replace anything built-in + // {E7C48BAB-8ACE-4CB3-8446-D4B73481F497} + { 0xe7c48bab, 0x8ace, 0x4cb3, { 0x84, 0x46, 0xd4, 0xb7, 0x34, 0x81, 0xf4, 0x97 } } +}; + +static const MUUID interfaces[]={MIID_PROTOCOL,MIID_LAST}; + + +int OnModulesLoaded (WPARAM wParam,LPARAM lParam); +int OnPreShutdown (WPARAM wParam,LPARAM lParam); +void VersionConversions (); + + + + + + +BOOL WINAPI DllMain(HINSTANCE hInstance,DWORD dwReason,LPVOID Reserved) +{ + switch(dwReason){ + case DLL_PROCESS_ATTACH: + memset(&masMraSettings, 0, sizeof(masMraSettings)); + masMraSettings.hInstance=hInstance; + masMraSettings.hHeap=HeapCreate(0,0,0);//GetProcessHeap(); + masMraSettings.bLoggedIn=FALSE; + masMraSettings.dwStatusMode=ID_STATUS_OFFLINE; + masMraSettings.dwDesiredStatusMode=ID_STATUS_OFFLINE; + DisableThreadLibraryCalls((HMODULE)hInstance); + break; + case DLL_PROCESS_DETACH: + HeapDestroy(masMraSettings.hHeap); + masMraSettings.hHeap=NULL; + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + break; + } + + /*BYTE szBuff[1024]={0}; + LPSTR lpszString="\r\n\t GET \t \r\n \r\n \r\n http://mail.ru/ \tHTTP/1.1 \t "; + LPSTR lpszFindString="123456 "; + LPSTR lpszWhatFindString="123456"; + SIZE_T dwStringLen=lstrlenA(lpszString),dwBuffSize,dwBuffLen; + +//#define LWSHT "\r\n\t" +//#define LWSSP "\r\n " + + + //lpszString=(LPSTR)MemoryFind(0,lpszFindString,(lstrlenA(lpszFindString)),lpszWhatFindString,lstrlenA(lpszWhatFindString)); + //lpszString=(LPSTR)MemoryFindByte(0,lpszFindString,(lstrlenA(lpszFindString)-1),'6'); + + + //WSP2SP(lpszString,dwStringLen,(LPSTR)szBuff,&dwBuffSize); + //HT2SP(lpszString,dwStringLen,(LPSTR)szBuff,&dwBuffSize); + CleanUnneededSP(lpszString,dwStringLen,(LPSTR)szBuff,&dwBuffSize); + + dwBuffLen=lstrlenA((LPSTR)szBuff); + if (dwBuffSize!=dwBuffLen) DebugBreak(); + //*/ + + + /*LPCSTR lpszHeader,lpszHeaderLow,lpszValueName; + LPSTR lpszValueNameRet; + SIZE_T dwHeaderSize,dwValueNameSize,dwValueNameRetSize; + CHAR szHeader[4096]={0},szHeaderLow[4096]={0}; + + //lstrcpynA(szHeader,"Server: squid/3.1.0.15\r\nMime-Version: 1.0\r\nContent-Length: 0\r\nX-Cache: MISS from Firewall\r\nProxy-Connection: keep-alive",SIZEOF(szHeader)); + lstrcpynA(szHeader,"http/1.0 200 ok\r\nserver: apache-coyote/1.1\r\ndate: fri, 30 apr 2010 08:36:10 gmt\r\nlast-modified: wed, 28 apr 2010 03:22:49 gmt\r\ncache-control: max-age=360000\r\ncontent-type: \r\ncontent-length: 55946",SIZEOF(szHeader)); + lpszHeader=(LPCSTR)szHeader; + lpszHeaderLow=(LPCSTR)szHeaderLow; + dwHeaderSize=lstrlenA(lpszHeader); + + //lpszValueName="proxy-connection"; + //lpszValueName="content-length"; + lpszValueName="content-type"; + dwValueNameSize=lstrlenA(lpszValueName); + + + BuffToLowerCase(lpszHeaderLow,lpszHeader,dwHeaderSize); + + HeaderValueGet(lpszHeader,lpszHeaderLow,dwHeaderSize,lpszValueName,dwValueNameSize,&lpszValueNameRet,&dwValueNameRetSize); + //HeaderValueRemove(lpszHeader,lpszHeaderLow,dwHeaderSize,&dwBuffLen,lpszValueName,dwValueNameSize); + szHeader[dwBuffLen]=0; + szHeaderLow[dwBuffLen]=0;//*/ + + +return(TRUE); +} + + +extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) +{ + if (mirandaVersionSTATUS_TITLE_MAX) + { + DebugPrintCRLF(lpcszXStatusNameDef[i]); + } + if (lstrlenA(TranslateW(lpcszXStatusNameDef[i]))>STATUS_TITLE_MAX) + { + DebugPrintCRLF(TranslateW(lpcszXStatusNameDef[i])); + } + }*/ + + + + InitializeCriticalSectionAndSpinCount(&masMraSettings.csCriticalSectionSend,0); + MraSendQueueInitialize(0,&masMraSettings.hSendQueueHandle); + MraFilesQueueInitialize(0,&masMraSettings.hFilesQueueHandle); + MraMPopSessionQueueInitialize(&masMraSettings.hMPopSessionQueue); + + FifoMTInitialize(&masMraSettings.ffmtAPCQueue,0); + masMraSettings.hWaitEventThreadAPCHandle=CreateEvent(NULL,FALSE,FALSE,NULL); + InterlockedExchange((volatile LONG*)&masMraSettings.dwAPCThreadRunning,TRUE); + masMraSettings.hThreadAPC=(HANDLE)mir_forkthread((pThreadFunc)MraUserAPCThreadProc,NULL); + if (masMraSettings.hThreadAPC==NULL) + { + MraAPCQueueDestroy(&masMraSettings.ffmtAPCQueue); + CloseHandle(masMraSettings.hWaitEventThreadAPCHandle); + masMraSettings.hWaitEventThreadAPCHandle=NULL; + DuplicateHandle(GetCurrentProcess(),GetCurrentThread(),GetCurrentProcess(),&masMraSettings.hThreadAPC,THREAD_SET_CONTEXT,FALSE,0); + DebugPrintCRLFW(L"Fail on create event APC thread, using miranda main thread"); + MessageBoxW(NULL,L"Fail on create event APC thread, using miranda main thread",PROTOCOL_DISPLAY_NAMEW,(MB_OK|MB_ICONINFORMATION)); + }//*/ + + masMraSettings.hHookModulesLoaded=HookEvent(ME_SYSTEM_MODULESLOADED,OnModulesLoaded); + masMraSettings.hHookPreShutdown=HookEvent(ME_SYSTEM_PRESHUTDOWN,OnPreShutdown); + + LoadServices(); + + //pd.cbSize=sizeof(pd); + pd.cbSize=PROTOCOLDESCRIPTOR_V3_SIZE; + pd.szName=PROTOCOL_NAMEA; + pd.type=PROTOTYPE_PROTOCOL; + CallService(MS_PROTO_REGISTERMODULE,0,(LPARAM)&pd); + + DebugPrintCRLFW(L"Load - DONE"); +return(0); +} + + +extern "C" __declspec(dllexport) int Unload(void) +{ + UnloadServices(); + //if (hHookOnUserInfoInit) UnhookEvent(hHookOnUserInfoInit); + if (masMraSettings.hHookPreShutdown) {UnhookEvent(masMraSettings.hHookPreShutdown); masMraSettings.hHookPreShutdown=NULL;} + if (masMraSettings.hHookModulesLoaded) {UnhookEvent(masMraSettings.hHookModulesLoaded); masMraSettings.hHookModulesLoaded=NULL;} + + Netlib_CloseHandle(masMraSettings.hNetlibUser); + masMraSettings.hNetlibUser=NULL; + + MraMPopSessionQueueDestroy(masMraSettings.hMPopSessionQueue); + masMraSettings.hMPopSessionQueue=NULL; + + MraFilesQueueDestroy(masMraSettings.hFilesQueueHandle); + masMraSettings.hFilesQueueHandle=NULL; + + MraSendQueueDestroy(masMraSettings.hSendQueueHandle); + masMraSettings.hSendQueueHandle=NULL; + + DeleteCriticalSection(&masMraSettings.csCriticalSectionSend); + SecureZeroMemory(&masMraSettings.csCriticalSectionSend,sizeof(CRITICAL_SECTION)); + + if (masMraSettings.hDLLXStatusIcons) + { + FreeLibrary(masMraSettings.hDLLXStatusIcons); + masMraSettings.hDLLXStatusIcons=NULL; + } + + if (masMraSettings.hDLLZLib) + { + FreeLibrary(masMraSettings.hDLLZLib); + masMraSettings.hDLLZLib=NULL; + masMraSettings.lpfnCompress2=NULL; + masMraSettings.lpfnUncompress=NULL; + } + + SecureZeroMemory(pluginLink,sizeof(pluginLink)); + SecureZeroMemory(&mmi,sizeof(pluginLink)); + + DebugPrintCRLFW(L"Unload - DONE"); +return(0); +} + + +static int OnModulesLoaded(WPARAM wParam,LPARAM lParam) +{ + WCHAR szBuffer[MAX_PATH]; + NETLIBUSER nlu={0}; + + mir_sntprintf(szBuffer,SIZEOF(szBuffer),L"%s %s",PROTOCOL_NAMEW,TranslateW(L"plugin connections")); + nlu.cbSize=sizeof(nlu); + nlu.flags=(NUF_INCOMING|NUF_OUTGOING|NUF_HTTPCONNS|NUF_UNICODE); + nlu.szSettingsModule=PROTOCOL_NAMEA; + nlu.ptszDescriptiveName=szBuffer; + masMraSettings.hNetlibUser=(HANDLE)CallService(MS_NETLIB_REGISTERUSER,0,(LPARAM)&nlu); + +#ifdef _DEBUG + // всех в offline // тк unsaved values сохраняются их нужно инициализировать + for(HANDLE hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);hContact!=NULL;hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)) + {// функция сама проверяет принадлежность контакта к MRA + SetContactBasicInfoW(hContact,SCBIFSI_LOCK_CHANGES_EVENTS,(SCBIF_ID|SCBIF_GROUP_ID|SCBIF_SERVER_FLAG|SCBIF_STATUS),-1,-1,0,0,ID_STATUS_OFFLINE,NULL,0,NULL,0,NULL,0); + } +#else + // unsaved values + DB_Mra_CreateResidentSetting("Status");// NOTE: XStatus cannot be temporary + DB_Mra_CreateResidentSetting("LogonTS"); + DB_Mra_CreateResidentSetting("ContactID"); + DB_Mra_CreateResidentSetting("GroupID"); + DB_Mra_CreateResidentSetting("ContactFlags"); + DB_Mra_CreateResidentSetting("ContactSeverFlags"); + DB_Mra_CreateResidentSetting("HooksLocked"); + DB_Mra_CreateResidentSetting(DBSETTING_CAPABILITIES); + DB_Mra_CreateResidentSetting(DBSETTING_XSTATUSNAME); + DB_Mra_CreateResidentSetting(DBSETTING_XSTATUSMSG); + DB_Mra_CreateResidentSetting(DBSETTING_BLOGSTATUSTIME); + DB_Mra_CreateResidentSetting(DBSETTING_BLOGSTATUSID); + DB_Mra_CreateResidentSetting(DBSETTING_BLOGSTATUS); + DB_Mra_CreateResidentSetting(DBSETTING_BLOGSTATUSMUSIC); + + // всех в offline // тк unsaved values сохраняются их нужно инициализировать + for(HANDLE hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);hContact!=NULL;hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)) + {// функция сама проверяет принадлежность контакта к MRA + SetContactBasicInfoW(hContact,SCBIFSI_LOCK_CHANGES_EVENTS,(SCBIF_ID|SCBIF_GROUP_ID|SCBIF_SERVER_FLAG|SCBIF_STATUS),-1,-1,0,0,ID_STATUS_OFFLINE,NULL,0,NULL,0,NULL,0); + } +#endif + + MraAvatarsQueueInitialize(&masMraSettings.hAvatarsQueueHandle); + /*{ + HANDLE hContact; + for(hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);hContact!=NULL;hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)) + {// функция сама проверяет принадлежность контакта к MRA + if (IsContactMra(hContact)) break; + } + DB_Mra_DeleteValue(hContact,"AvatarLastCheckTime"); + MraAvatarsQueueGetAvatar(masMraSettings.hAvatarsQueueHandle,GAIF_FORCE,hContact,NULL,NULL,NULL); + }//*/ + + VersionConversions(); + + MraAntiSpamLoadBadWordsW(); + + LoadModules(); + + CallService(MS_UPDATE_REGISTERFL,(WPARAM)MRA_PLUGIN_UPDATER_ID,(LPARAM)&pluginInfoEx); + + + //hHookOnUserInfoInit=HookEvent(ME_USERINFO_INITIALISE,MsnOnDetailsInit); + + + /*//BYTE btRND[MAX_PATH]={0}; + char szPass[MAX_PATH]={0}; + //LPSTR lpszPass="1234567890"; + SIZE_T dwBuffLen; + + //dwBuffLen=lstrlenA(lpszPass); + //SetPassDB(lpszPass,dwBuffLen); + GetPassDB(szPass,sizeof(szPass),&dwBuffLen); + + MessageBoxA(NULL,szPass,"Password",(MB_OK)); + + //*/ + + + InterlockedExchange((volatile LONG*)&masMraSettings.dwGlobalPluginRunning,TRUE); + + //MraSetStatus(ID_STATUS_OFFLINE,0); + + DebugPrintCRLFW(L"OnModulesLoaded - DONE"); +return(0); +} + + +int OnPreShutdown(WPARAM wParam,LPARAM lParam) +{ + InterlockedExchange((volatile LONG*)&masMraSettings.dwGlobalPluginRunning,FALSE); + + MraSetStatus(ID_STATUS_OFFLINE,0); + + MraAvatarsQueueDestroy(masMraSettings.hAvatarsQueueHandle); + masMraSettings.hAvatarsQueueHandle=NULL; + + if (masMraSettings.hThreadWorker) + { + if (IsThreadAlive(masMraSettings.hThreadWorker)) WaitForSingleObjectEx(masMraSettings.hThreadWorker,(WAIT_FOR_THREAD_TIMEOUT*1000),FALSE); + masMraSettings.hThreadWorker=NULL; + } + + InterlockedExchange((volatile LONG*)&masMraSettings.dwAPCThreadRunning,FALSE); + if (masMraSettings.hWaitEventThreadAPCHandle) + if (IsThreadAlive(masMraSettings.hThreadAPC)) + { + SetEvent(masMraSettings.hWaitEventThreadAPCHandle); + }else{ + CloseHandle(masMraSettings.hWaitEventThreadAPCHandle); + //WaitForSingleObjectEx(masMraSettings.hThreadAPC,(WAIT_FOR_THREAD_TIMEOUT*1000),FALSE); // no wait - dead lock. + masMraSettings.hWaitEventThreadAPCHandle=NULL; + masMraSettings.hThreadAPC=NULL; + } + + UnloadModules(); + + MraAntiSpamFreeBadWords(); + + DebugPrintCRLFW(L"OnPreShutdown - DONE"); +return(0); +} + + + +void VersionConversions() +{ + /*switch(DB_Mra_GetDword(NULL,"LastPluginVersion",PLUGIN_MAKE_VERSION(0,0,0,0))){ + default: + case PLUGIN_MAKE_VERSION(1,14,0,0): + case PLUGIN_MAKE_VERSION(1,14,0,1): + case PLUGIN_MAKE_VERSION(1,14,0,2): + DB_Mra_DeleteValue(NULL,"MirVer"); + DB_Mra_DeleteValue(NULL,"MessagesCountSend"); + DB_Mra_DeleteValue(NULL,"MRAClient"); + DB_Mra_DeleteValue(NULL,"MRAClientVer"); + DB_Mra_DeleteValue(NULL,"MRAClientCapabilities"); + DB_Mra_DeleteValue(NULL,"Status"); + DB_Mra_DeleteValue(NULL,"ContactID"); + DB_Mra_DeleteValue(NULL,"GroupID"); + DB_Mra_DeleteValue(NULL,"ContactSeverFlags"); + DB_Mra_DeleteValue(NULL,"HooksLocked"); + for(HANDLE hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);hContact!=NULL;hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)) + { + DB_Mra_DeleteValue(hContact,"MessagesCountSend"); + DB_Mra_DeleteValue(hContact,"MRAClient"); + DB_Mra_DeleteValue(hContact,"MRAClientVer"); + DB_Mra_DeleteValue(hContact,"MRAClientCapabilities"); + DB_Mra_DeleteValue(hContact,"Status"); + DB_Mra_DeleteValue(hContact,"ContactID"); + DB_Mra_DeleteValue(hContact,"GroupID"); + DB_Mra_DeleteValue(hContact,"ContactSeverFlags"); + DB_Mra_DeleteValue(hContact,"HooksLocked"); + } + case PLUGIN_MAKE_VERSION(1,14,0,3): + case PLUGIN_MAKE_VERSION(1,14,0,4): + case PLUGIN_MAKE_VERSION(1,14,0,5): + case PLUGIN_MAKE_VERSION(1,14,0,6): + case PLUGIN_MAKE_VERSION(1,14,0,7): + //case PLUGIN_MAKE_VERSION(1,14,1,0): + DB_Mra_SetByte(NULL,DBSETTING_XSTATUSID,(BYTE)DB_Mra_GetDword(NULL,DBSETTING_XSTATUSID,MRA_MIR_XSTATUS_NONE)); + for(HANDLE hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);hContact!=NULL;hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)) + { + if (IsContactMra(hContact)) DB_Mra_SetByte(hContact,DBSETTING_XSTATUSID,(BYTE)DB_Mra_GetDword(hContact,DBSETTING_XSTATUSID,MRA_MIR_XSTATUS_NONE)); + } + case PLUGIN_MAKE_VERSION(1,16,0,2): + DB_Mra_DeleteValue(NULL,"CvtSmilesToTags"); + case PLUGIN_MAKE_VERSION(1,16,0,3): + for(HANDLE hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);hContact!=NULL;hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)) + { + if (IsContactMra(hContact)==FALSE) DB_Mra_DeleteValue(hContact,DBSETTING_XSTATUSID); + } + case PLUGIN_MAKE_VERSION(0,0,0,0):// no previos version + MraAntiSpamResetBadWordsList(); + case PLUGIN_VERSION_DWORD:// current version + break; + }*/ + + DB_Mra_SetDword(NULL,"LastPluginVersion",PLUGIN_VERSION_DWORD); + + + + {// pass conv + char szPass[MAX_PATH]; + SIZE_T dwPassSize; + + if(DB_Mra_GetStaticStringA(NULL,"Password",(LPSTR)szPass,SIZEOF(szPass),&dwPassSize)) + {//bit of a security hole here, since it's easy to extract a password from an edit box + CallService(MS_DB_CRYPT_DECODESTRING,(dwPassSize+1),(LPARAM)szPass); + + SetPassDB(szPass,dwPassSize); + + SecureZeroMemory(szPass,sizeof(szPass)); + DB_Mra_DeleteValue(NULL,"Password"); + } + } + +//*/ +} + + diff --git a/MRA/Mra.h b/MRA/Mra.h new file mode 100644 index 0000000..ec0fb4a --- /dev/null +++ b/MRA/Mra.h @@ -0,0 +1,431 @@ +#if !defined(AFX_MRA_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) +#define AFX_MRA_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define _CRT_SECURE_NO_WARNINGS + +#if defined( UNICODE ) && !defined( _UNICODE ) + #define _UNICODE +#endif + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#define WINVER 0x0502 +#define _WIN32_WINNT 0x0502 + +#define MIRANDA_VER 0x0900 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// miranda API +#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 +#include +#include +#include +#include +#include + +//sdk +#include +#include "zlib.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "resource.h" +#include ".\xstatus_MRA\resource.h" +#include "proto.h" +#include "MraSendQueue.h" +#include "MraFilesQueue.h" +#include "MraPopUp.h" +#include "MraAvatars.h" +#include "MraIcons.h" +#include "MraSelectEMail.h" +#include "MraAntiSpam.h" +#include "MraMPop.h" +#include "MraChat.h" + +typedef int (*PUNCOMPRESS)(unsigned char*,DWORD*,unsigned char*,DWORD); +typedef int (*PCOMPRESS2)(unsigned char*,DWORD*,unsigned char*,DWORD,int); + +// LPS +typedef struct +{ + SIZE_T dwSize; + + union { + LPSTR lpszData; + LPWSTR lpwszData; + }; +} MRA_LPS; + +// GUID +typedef struct +{ + DWORD id[4]; +} MRA_GUID; + +struct MRA_ADDR_LIST_ITEM +{ + DWORD dwPort; + DWORD dwAddr; +}; + +struct MRA_ADDR_LIST +{ + DWORD dwAddrCount; + MRA_ADDR_LIST_ITEM *pmaliAddress; +}; + +// структура содержащая информацию по построению меню или расширеных иконок +struct GUI_DISPLAY_ITEM +{ + LPSTR lpszName; // имя сервиса, оно же имя в иколибе + LPWSTR lpwszDescr; // текстовое описание отображаемое юзеру + LONG defIcon; // иконка из ресурсов + MIRANDASERVICE lpFunc; // функция вызываемая меню +}; + +// структура содержащая информацию о сервисах/функциях +struct SERVICE_ITEM +{ + LPSTR lpszName; // имя сервиса, оно же имя в иколибе + MIRANDASERVICE lpFunc; // функция вызываемая +}; + +#include "MraConstans.h" +#include "MraSendCommand.h" +#include "MraMRIMProxy.h" + + + +///////////////////////////////////////////////////////////////////////////////////////// +// plugin options + + +#define MAIN_MENU_ITEMS_COUNT 15 +#define CONTACT_MENU_ITEMS_COUNT 10 + +typedef struct +{ + HANDLE hHeap; + HINSTANCE hInstance; + HMODULE hDLLZLib; + HANDLE lpfnCompress2; + HANDLE lpfnUncompress; + HMODULE hDLLXStatusIcons; + char szModuleName[MAXMODULELABELLENGTH]; + WCHAR wszModuleName[MAXMODULELABELLENGTH]; + SIZE_T dwModuleNameLen; + char szDisplayModuleName[MAX_PATH]; + WCHAR wszDisplayModuleName[MAX_PATH]; + SIZE_T dwDisplayModuleNameLen; + + DWORD dwGlobalPluginRunning;// + BOOL bLoggedIn; + BOOL bChatExist; + DWORD dwStatusMode; + DWORD dwXStatusMode; + DWORD dwDesiredStatusMode; + + HWND hWndEMailPopupStatus; + DWORD dwEmailMessagesTotal; + DWORD dwEmailMessagesUnRead; + + BOOL bHideXStatusUI; + HANDLE hXStatusMenuItems[MRA_XSTATUS_COUNT+4]; + HANDLE hXStatusAdvancedStatusIcons[MRA_XSTATUS_COUNT+4]; + HANDLE hXStatusAdvancedStatusItems[MRA_XSTATUS_COUNT+4]; + HANDLE hExtraXstatusIcon; + + HANDLE hMainMenuIcons[MAIN_MENU_ITEMS_COUNT+4]; + HANDLE hMainMenuItems[MAIN_MENU_ITEMS_COUNT+4]; + + HANDLE hContactMenuIcons[CONTACT_MENU_ITEMS_COUNT+4]; + HANDLE hContactMenuItems[CONTACT_MENU_ITEMS_COUNT+4]; + + HANDLE hAdvancedStatusIcons[ADV_ICON_MAX+4]; + HANDLE hAdvancedStatusItems[ADV_ICON_MAX+4]; + HANDLE hExtraInfo; + + HANDLE hThreadAPC; // APC thread, for queue tasks + HANDLE hWaitEventThreadAPCHandle; + DWORD dwAPCThreadRunning; + FIFO_MT ffmtAPCQueue; + HANDLE hMPopSessionQueue; + HANDLE hSendQueueHandle; + HANDLE hFilesQueueHandle; + HANDLE hAvatarsQueueHandle; + + HANDLE hNetlibUser; + HANDLE hThreadWorker; + HANDLE hConnection; + DWORD dwThreadWorkerLastPingTime; + DWORD dwThreadWorkerRunning; + DWORD dwCMDNum; + CRITICAL_SECTION csCriticalSectionSend; + + HANDLE hHookModulesLoaded; + HANDLE hHookPreShutdown; + HANDLE hHookOptInitialize; + HANDLE hHookContactDeleted; + HANDLE hHookSettingChanged; + HANDLE hHookRebuildCMenu; + HANDLE hHookExtraIconsApply; + HANDLE hHookExtraIconsRebuild; + HANDLE hHookIconsChanged; + HANDLE heNudgeReceived; + HANDLE hHookRebuildStatusMenu; + HANDLE hWATrack; + + char szNewMailSound[MAX_PATH]; + + SIZE_T dwMirWorkDirPathLen; + WCHAR szMirWorkDirPath[MAX_FILEPATH]; +} MRA_SETTINGS; + + +///////////////////////////////////////////////////////////////////////////////////////// +// External variables +extern MRA_SETTINGS masMraSettings; + + +INT_PTR LoadServices (); +INT_PTR LoadModules (); +void UnloadModules (); +void UnloadServices (); +void InitExtraIcons (); +void SetExtraIcons (HANDLE hContact); +DWORD MraSetXStatusInternal (DWORD dwXStatus); +DWORD MraGetXStatusInternal (); + +int OptInit (WPARAM wParam,LPARAM lParam); + + +INT_PTR CALLBACK AdvancedSearchDlgProc(HWND hWndDlg,UINT message,WPARAM wParam,LPARAM lParam); +DWORD AdvancedSearchFromDlg(HWND hWndDlg); + + +DWORD MraRecvCommand_Message (DWORD dwTime,DWORD dwFlags,MRA_LPS *plpsFrom,MRA_LPS *plpsText,MRA_LPS *plpsRFTText,MRA_LPS *plpsMultiChatData); + + +DWORD MraGetSelfVersionString (LPSTR lpszSelfVersion,SIZE_T dwSelfVersionSize,SIZE_T *pdwSelfVersionSizeRet); + +DWORD MraAddrListGetFromBuff (LPSTR lpszAddreses,SIZE_T dwAddresesSize,MRA_ADDR_LIST *pmalAddrList); +DWORD MraAddrListGetToBuff (MRA_ADDR_LIST *pmalAddrList,LPSTR lpszBuff,SIZE_T dwBuffSize,SIZE_T *pdwBuffSizeRet); +void MraAddrListStoreToContact (HANDLE hContact,MRA_ADDR_LIST *pmalAddrList); +void MraAddrListFree (MRA_ADDR_LIST *pmalAddrList); + + + +#define GetContactNameA(Contact) (LPSTR)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,(WPARAM)Contact,0) +#define GetContactNameW(Contact) (LPWSTR)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,(WPARAM)Contact,GCDNF_UNICODE) + +#define GetStatusModeDescriptionA(Status) (LPSTR)CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION,(WPARAM)Status,0) +#define GetStatusModeDescriptionW(Status) (LPWSTR)CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION,(WPARAM)Status,GSMDF_UNICODE) + +#define DB_Mra_DeleteValue(Contact,valueName) DBDeleteContactSetting(Contact,PROTOCOL_NAMEA,valueName) + +#define DB_Mra_GetDword(Contact,valueName,parDefltValue) DBGetContactSettingDword(Contact,PROTOCOL_NAMEA,valueName,parDefltValue) +#define DB_Mra_SetDword(Contact,valueName,parValue) DBWriteContactSettingDword(Contact,PROTOCOL_NAMEA,valueName,parValue) + +#define DB_Mra_GetWord(Contact,valueName,parDefltValue) DBGetContactSettingWord(Contact,PROTOCOL_NAMEA,valueName,parDefltValue) +#define DB_Mra_SetWord(Contact,valueName,parValue) DBWriteContactSettingWord(Contact,PROTOCOL_NAMEA,valueName,parValue) + +#define DB_Mra_GetByte(Contact,valueName,parDefltValue) DBGetContactSettingByte(Contact,PROTOCOL_NAMEA,valueName,parDefltValue) +#define DB_Mra_SetByte(Contact,valueName,parValue) DBWriteContactSettingByte(Contact,PROTOCOL_NAMEA,valueName,parValue) + +void DB_Mra_CreateResidentSetting(LPSTR lpszValueName); + +BOOL DB_GetStaticStringA(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName,LPSTR lpszRetBuff,SIZE_T dwRetBuffSize,SIZE_T *pdwRetBuffSize); +BOOL DB_GetStaticStringW(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName,LPWSTR lpszRetBuff,SIZE_T dwRetBuffSize,SIZE_T *pdwRetBuffSize); +#define DB_Mra_GetStaticStringA(Contact,ValueName,Ret,RetBuffSize,pRetBuffSize) DB_GetStaticStringA(Contact,PROTOCOL_NAMEA,ValueName,Ret,RetBuffSize,pRetBuffSize) +#define DB_Mra_GetStaticStringW(Contact,ValueName,Ret,RetBuffSize,pRetBuffSize) DB_GetStaticStringW(Contact,PROTOCOL_NAMEA,ValueName,Ret,RetBuffSize,pRetBuffSize) + +BOOL DB_SetStringExA(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName,LPSTR lpszValue,SIZE_T dwValueSize); +BOOL DB_SetStringExW(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName,LPWSTR lpwszValue,SIZE_T dwValueSize); +#define DB_SetStringA(Contact,Module,valueName,parValue) DB_SetStringExA(Contact,Module,valueName,parValue,lstrlenA(parValue)) +#define DB_SetStringW(Contact,Module,valueName,parValue) DBWriteContactSettingWString(Contact,Module,valueName,parValue) +#define DB_SetLPSStringA(Contact,Module,valueName,parValue) if ((parValue)) DB_SetStringExA(Contact,Module,valueName,(parValue)->lpszData,(parValue)->dwSize) +#define DB_SetLPSStringW(Contact,Module,valueName,parValue) if ((parValue)) DB_SetStringExW(Contact,Module,valueName,(parValue)->lpwszData,((parValue)->dwSize/sizeof(WCHAR))) +#define DB_Mra_SetStringA(Contact,valueName,parValue) DB_SetStringExA(Contact,PROTOCOL_NAMEA,valueName,parValue,lstrlenA(parValue)) +#define DB_Mra_SetStringW(Contact,valueName,parValue) DBWriteContactSettingWString(Contact,PROTOCOL_NAMEA,valueName,parValue) +#define DB_Mra_SetLPSStringA(Contact,valueName,parValue) DB_SetLPSStringA(Contact,PROTOCOL_NAMEA,valueName,parValue) +#define DB_Mra_SetLPSStringW(Contact,valueName,parValue) DB_SetLPSStringW(Contact,PROTOCOL_NAMEA,valueName,parValue) +#define DB_Mra_SetStringExA(Contact,valueName,parValue,parValueSize) DB_SetStringExA(Contact,PROTOCOL_NAMEA,valueName,parValue,parValueSize) +#define DB_Mra_SetStringExW(Contact,valueName,parValue,parValueSize) DB_SetStringExW(Contact,PROTOCOL_NAMEA,valueName,parValue,parValueSize) + +int DB_WriteContactSettingBlob(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName,LPVOID lpValue,SIZE_T dwValueSize); +#define DB_Mra_WriteContactSettingBlob(hContact,lpszValueName,lpbValue,dwValueSize) DB_WriteContactSettingBlob(hContact,PROTOCOL_NAMEA,lpszValueName,lpbValue,dwValueSize) +BOOL DB_GetContactSettingBlob(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName,LPVOID lpRet,SIZE_T dwRetBuffSize,SIZE_T *pdwRetBuffSize); +#define DB_Mra_GetContactSettingBlob(hContact,lpszValueName,lpbRet,dwRetBuffSize,pdwRetBuffSize) DB_GetContactSettingBlob(hContact,PROTOCOL_NAMEA,lpszValueName,lpbRet,dwRetBuffSize,pdwRetBuffSize) + +#define MEMALLOC(Size) HeapAlloc(masMraSettings.hHeap,HEAP_ZERO_MEMORY,((Size)+sizeof(void*))) +#define MEMREALLOC(Mem,Size) HeapReAlloc(masMraSettings.hHeap,(HEAP_ZERO_MEMORY),(void*)(Mem),((Size)+sizeof(void*))) +#define MEMFREE(Mem) if ((Mem)) {HeapFree(masMraSettings.hHeap,0,(void*)(Mem));(Mem)=NULL;} + +#define SetBit(bytes,bitpos) bytes|=(1< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MRA/Mra.vcxproj b/MRA/Mra.vcxproj new file mode 100644 index 0000000..c53ad6f --- /dev/null +++ b/MRA/Mra.vcxproj @@ -0,0 +1,437 @@ +п»ї + + + + Debug Unicode + Win32 + + + Debug Unicode + x64 + + + Release Unicode + Win32 + + + Release Unicode + x64 + + + + {EE182018-5D3D-43F3-955F-7B5AB0BE2FCA} + Mra + Win32Proj + MRA + + + + DynamicLibrary + Unicode + false + + + DynamicLibrary + Unicode + + + DynamicLibrary + MultiByte + true + + + DynamicLibrary + MultiByte + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + ../../../Files/Debug/Plugins\ + $(SolutionDir)$(Configuration)/Obj/$(ProjectName)\ + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + false + true + ../../../Files/Release/Plugins\ + $(SolutionDir)$(Configuration)/Obj/$(ProjectName)\ + + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + false + + + + + + + + + + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;MRA_EXPORTS;%(PreprocessorDefinitions) + true + true + + + EnableFastChecks + MultiThreadedDebug + true + + + + + Level3 + EditAndContinue + ./sdk;../../include;../../ExternalAPI + + + Crypt32.lib;shlwapi.lib;Ws2_32.lib;mswsock.lib;%(AdditionalDependencies) + type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27X86%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies) + + + + + + + true + + + false + $(IntDir)$(TargetName).lib + MachineX86 + + + + + copy "C:\Documents and Settings\Rozhuk_IM\РњРѕРё документы\Programmer\VC\Mra\x64\Debug\Mra.dll" "C:\Documents and Settings\Rozhuk_IM\РњРѕРё документы\Programmer\VC\MirandaIM\x64\Plugins\Mra.dll" + + w;%(Outputs) + + + X64 + + + Disabled + WIN64;_DEBUG;_WINDOWS;_USRDLL;MRA_EXPORTS;%(PreprocessorDefinitions) + true + true + + + EnableFastChecks + MultiThreadedDebug + true + + + + + Level3 + ProgramDatabase + CompileAsCpp + + + shlwapi.lib;Ws2_32.lib;mswsock.lib;%(AdditionalDependencies) + $(OutDir)Mra.dll + %(AdditionalManifestDependencies) + false + msvcrtd.lib;%(IgnoreSpecificDefaultLibraries) + MRA.def + true + $(OutDir)Mra.pdb + Windows + false + false + false + false + false + false + true + $(OutDir)Mra.lib + MachineX64 + + + + + + + + + + + Full + OnlyExplicitInline + false + Size + true + false + WIN32;NDEBUG;_WINDOWS;_USRDLL;MRA_EXPORTS;%(PreprocessorDefinitions) + true + + + Default + MultiThreaded + false + true + + + Level3 + ProgramDatabase + ./sdk;../../include;../../ExternalAPI + + + + Crypt32.lib;shlwapi.lib;Ws2_32.lib;mswsock.lib;%(AdditionalDependencies) + type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27X86%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies) + + + + + + + + + true + true + Default + + + $(IntDir)$(TargetName).lib + MachineX86 + + + false + + + + + !releasex64.cmd + + w;%(Outputs) + + + X64 + + + MinSpace + OnlyExplicitInline + false + Size + true + false + WIN64;NDEBUG;_WINDOWS;_USRDLL;MRA_EXPORTS;%(PreprocessorDefinitions) + true + + + Default + MultiThreaded + false + false + + + Level3 + + + + + false + + + shlwapi.lib;Ws2_32.lib;mswsock.lib;runtmchk.lib;%(AdditionalDependencies) + $(OutDir)Mra.dll + %(AdditionalManifestDependencies) + true + %(IgnoreSpecificDefaultLibraries) + MRA.def + %(AddModuleNamesToAssembly) + %(AssemblyLinkResource) + false + true + $(OutDir)mra.map + Windows + true + true + + + + + true + true + true + false + true + $(OutDir)Mra.lib + MachineX64 + DefaultThreadingAttribute + Default + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MRA/Mra.vcxproj.filters b/MRA/Mra.vcxproj.filters new file mode 100644 index 0000000..55e8105 --- /dev/null +++ b/MRA/Mra.vcxproj.filters @@ -0,0 +1,400 @@ +п»ї + + + + {28f9c5b1-e22e-47c3-9588-4f293878aa27} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {fb50d277-d7b3-44a3-9330-fa8332ee1975} + h;hpp;hxx;hm;inl;inc + + + {725fa008-c36d-4165-8899-02f9387ed0f6} + + + {b86b234f-e9db-45b3-97ed-47c15ca4bb75} + + + {482639cd-fb25-4cfb-9e55-4a299271787c} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Miranda + + + Header Files\Functions + + + Header Files\Functions + + + Header Files\Functions + + + Header Files\Functions + + + Header Files\Functions + + + Header Files\Functions + + + Header Files\Functions + + + Header Files\Functions + + + Header Files\Functions + + + Header Files\Functions + + + Header Files\Functions + + + Header Files\Functions + + + Header Files\Functions + + + Header Files\Functions + + + Header Files\Functions + + + Header Files\Functions + + + + + Resource Files + + + \ No newline at end of file diff --git a/MRA/MraAdvancedSearch.cpp b/MRA/MraAdvancedSearch.cpp new file mode 100644 index 0000000..86ac513 --- /dev/null +++ b/MRA/MraAdvancedSearch.cpp @@ -0,0 +1,361 @@ +#include "Mra.h" +#include "proto.h" +#include "MraPlaces.h" + + + +struct FieldNames +{ + BYTE dwCode; + LPWSTR lpszText; +}; + + + +static const FieldNames GenderField[]= +{ + {1, L"Male"}, + {2, L"Female"}, + {-1, NULL} +}; + +static const FieldNames MonthField[]= +{ + {1, L"January"}, + {2, L"February"}, + {3, L"March"}, + {4, L"April"}, + {5, L"May"}, + {6, L"June"}, + {7, L"July"}, + {8, L"August"}, + {9, L"September"}, + {10, L"October"}, + {11, L"November"}, + {12, L"December"}, + {-1, NULL} +}; + +static const FieldNames ZodiakField[]= +{ + {1, L"Aries"}, + {2, L"Taurus"}, + {3, L"Gemini"}, + {4, L"Cancer"}, + {5, L"Leo"}, + {6, L"Virgo"}, + {7, L"Libra"}, + {8, L"Scorpio"}, + {9, L"Sagitarius"}, + {10, L"Capricorn"}, + {11, L"Aquarius"}, + {12, L"Pisces"}, + {-1, NULL} +}; + + + + + + +void ResetComboBox(HWND hWndCombo) +{ + DWORD dwItem; + + SendMessage(hWndCombo,CB_RESETCONTENT,0,0); + dwItem=SendMessage(hWndCombo,CB_ADDSTRING,0,(LPARAM)L""); + SendMessage(hWndCombo,CB_SETITEMDATA,dwItem,0); + SendMessage(hWndCombo,CB_SETCURSEL,dwItem,0); +} + + +void InitComboBox(HWND hWndCombo,FieldNames *lpNames) +{ + DWORD dwItem; + + ResetComboBox(hWndCombo); + + for (SIZE_T i=0;lpNames[i].lpszText;i++) + { + dwItem=SendMessage(hWndCombo,CB_ADDSTRING,0,(LPARAM)TranslateW(lpNames[i].lpszText)); + SendMessage(hWndCombo,CB_SETITEMDATA,dwItem,lpNames[i].dwCode); + } +} + + +void InitComboBoxNumders(HWND hWndCombo,DWORD dwStart,DWORD dwEnd) +{ + DWORD dwItem; + WCHAR szBuff[MAX_PATH]; + + ResetComboBox(hWndCombo); + + for (DWORD i=dwStart;i<=dwEnd;i++) + { + mir_sntprintf(szBuff,SIZEOF(szBuff),L"%lu",i); + dwItem=SendMessage(hWndCombo,CB_ADDSTRING,0,(LPARAM)szBuff); + SendMessage(hWndCombo,CB_SETITEMDATA,dwItem,i); + } +} + + +INT_PTR CALLBACK AdvancedSearchDlgProc(HWND hWndDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + switch(message){ + case WM_INITDIALOG: + { + HWND hWndCombo; + DWORD dwItem; + WCHAR wszBuff[MAX_PATH]; + SYSTEMTIME stTime; + GetLocalTime(&stTime); + + //InitComboBox(GetDlgItem(hWndDlg,IDC_EMAIL_DOMAIN),(FieldNames*)DomainField); + { + hWndCombo=GetDlgItem(hWndDlg,IDC_EMAIL_DOMAIN); + ResetComboBox(hWndCombo); + for (SIZE_T i=0;lpcszMailRuDomains[i];i++) + { + MultiByteToWideChar(MRA_CODE_PAGE,0,lpcszMailRuDomains[i],-1,wszBuff,SIZEOF(wszBuff)); + SendMessage(hWndCombo,CB_ADDSTRING,0,(LPARAM)wszBuff); + } + } + InitComboBox(GetDlgItem(hWndDlg,IDC_GENDER),(FieldNames*)GenderField); + InitComboBoxNumders(GetDlgItem(hWndDlg,IDC_AGERANGE_FROM),1,100); + InitComboBoxNumders(GetDlgItem(hWndDlg,IDC_AGERANGE_TO),1,100); + InitComboBoxNumders(GetDlgItem(hWndDlg,IDC_BIRTHDAY_DAY),1,31); + InitComboBox(GetDlgItem(hWndDlg,IDC_BIRTHDAY_MONTH),(FieldNames*)MonthField); + InitComboBoxNumders(GetDlgItem(hWndDlg,IDC_BIRTHDAY_YEAR),1900,(DWORD)stTime.wYear); + InitComboBox(GetDlgItem(hWndDlg,IDC_ZODIAK),(FieldNames*)ZodiakField); + + hWndCombo=GetDlgItem(hWndDlg,IDC_COUNTRY); + ResetComboBox(hWndCombo); + for(SIZE_T i=0;mrapPlaces[i].lpszData;i++) + { + if (mrapPlaces[i].dwCityID==0 && mrapPlaces[i].dwPlaceID==0) + { + dwItem=SendMessage(hWndCombo,CB_ADDSTRING,0,(LPARAM)mrapPlaces[i].lpszData); + SendMessage(hWndCombo,CB_SETITEMDATA,dwItem,mrapPlaces[i].dwCountryID); + } + } + + + ResetComboBox(GetDlgItem(hWndDlg,IDC_CITY)); + + if (DB_Mra_GetByte(NULL,"AdvancedSearchRemember",MRA_DEFAULT_SEARCH_REMEMBER)) + { + SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_GENDER,CB_SETCURSEL,DB_Mra_GetWord(NULL,"AdvancedSearchGender",0),0); + SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_AGERANGE_FROM,CB_SETCURSEL,DB_Mra_GetWord(NULL,"AdvancedSearchAgeFrom",0),0); + SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_AGERANGE_TO,CB_SETCURSEL,DB_Mra_GetWord(NULL,"AdvancedSearchAgeTo",0),0); + SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_BIRTHDAY_MONTH,CB_SETCURSEL,DB_Mra_GetWord(NULL,"AdvancedSearchBirthDayMonth",0),0); + SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_BIRTHDAY_DAY,CB_SETCURSEL,DB_Mra_GetWord(NULL,"AdvancedSearchBirthDayDay",0),0); + + SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_ZODIAK,CB_SETCURSEL,DB_Mra_GetWord(NULL,"AdvancedSearchZodiakID",0),0); + + + SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_COUNTRY,CB_SETCURSEL,DB_Mra_GetWord(NULL,"AdvancedSearchCountryID",0),0); + SendMessageW(hWndDlg,WM_COMMAND,(WPARAM)MAKELONG(IDC_COUNTRY,CBN_SELCHANGE),(LPARAM)GetDlgItem(hWndDlg,IDC_COUNTRY)); + + SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_STATE,CB_SETCURSEL,DB_Mra_GetWord(NULL,"AdvancedSearchStateID",0),0); + SendMessageW(hWndDlg,WM_COMMAND,(WPARAM)MAKELONG(IDC_STATE,CBN_SELCHANGE),(LPARAM)GetDlgItem(hWndDlg,IDC_STATE)); + + SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_CITY,CB_SETCURSEL,DB_Mra_GetWord(NULL,"AdvancedSearchCityID",0),0); + + + CHECK_DLG_BUTTON(hWndDlg,IDC_ONLINEONLY,DB_Mra_GetByte(NULL,"AdvancedSearchOnlineOnly",FALSE)); + CHECK_DLG_BUTTON(hWndDlg,IDC_CHK_REMEMBER,TRUE); + } + TranslateDialogDefault(hWndDlg); + } + return(TRUE); + case WM_DESTROY: + { + /*dwUserSize=GET_DLG_ITEM_TEXTA(hWndDlg,IDC_EMAIL_USER,szUser,SIZEOF(szUser)); + dwDomainSize=GET_DLG_ITEM_TEXTA(hWndDlg,IDC_EMAIL_DOMAIN,szDomain,SIZEOF(szDomain)); + + dwNickNameSize=GET_DLG_ITEM_TEXT(hWndDlg,IDC_NICK,wszNickName,SIZEOF(wszNickName)); + + dwFirstNameSize=GET_DLG_ITEM_TEXT(hWndDlg,IDC_FIRSTNAME,wszFirstName,SIZEOF(wszFirstName)); + + dwLastNameSize=GET_DLG_ITEM_TEXT(hWndDlg,IDC_LASTNAME,wszLastName,SIZEOF(wszLastName));*/ + + DB_Mra_SetWord(NULL,"AdvancedSearchGender",SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_GENDER,CB_GETCURSEL,0,0)); + DB_Mra_SetWord(NULL,"AdvancedSearchAgeFrom",SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_AGERANGE_FROM,CB_GETCURSEL,0,0)); + DB_Mra_SetWord(NULL,"AdvancedSearchAgeTo",SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_AGERANGE_TO,CB_GETCURSEL,0,0)); + DB_Mra_SetWord(NULL,"AdvancedSearchBirthDayMonth",SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_BIRTHDAY_MONTH,CB_GETCURSEL,0,0)); + DB_Mra_SetWord(NULL,"AdvancedSearchBirthDayDay",SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_BIRTHDAY_DAY,CB_GETCURSEL,0,0)); + + DB_Mra_SetWord(NULL,"AdvancedSearchZodiakID",SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_ZODIAK,CB_GETCURSEL,0,0)); + + DB_Mra_SetWord(NULL,"AdvancedSearchCityID",SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_CITY,CB_GETCURSEL,0,0)); + DB_Mra_SetWord(NULL,"AdvancedSearchStateID",SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_STATE,CB_GETCURSEL,0,0)); + DB_Mra_SetWord(NULL,"AdvancedSearchCountryID",SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_COUNTRY,CB_GETCURSEL,0,0)); + + DB_Mra_SetByte(NULL,"AdvancedSearchOnlineOnly",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_ONLINEONLY)); + DB_Mra_SetByte(NULL,"AdvancedSearchRemember",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_CHK_REMEMBER)); + } + break; + case WM_COMMAND: + switch(LOWORD(wParam)){ + case IDOK: + SendMessage(GetParent(hWndDlg),WM_COMMAND,MAKEWPARAM(IDOK,BN_CLICKED),(LPARAM)GetDlgItem(GetParent(hWndDlg),IDOK)); + break; + case IDC_AGERANGE_FROM: + case IDC_AGERANGE_TO: + if (HIWORD(wParam)==CBN_SELCHANGE) + { + if (LOWORD(wParam)==IDC_AGERANGE_FROM) + { + DWORD dwAgeFrom,dwAgeTo; + + dwAgeFrom=GET_CURRENT_COMBO_DATA(hWndDlg,IDC_AGERANGE_FROM); + dwAgeTo=GET_CURRENT_COMBO_DATA(hWndDlg,IDC_AGERANGE_TO); + if (dwAgeFrom==0) dwAgeFrom++; + InitComboBoxNumders(GetDlgItem(hWndDlg,IDC_AGERANGE_TO),dwAgeFrom,100); + SendMessage(GetDlgItem(hWndDlg,IDC_AGERANGE_TO),CB_SETCURSEL,((dwAgeTo-dwAgeFrom)+1),0); + } + SendMessage(GetDlgItem(hWndDlg,IDC_BIRTHDAY_YEAR),CB_SETCURSEL,0,0); + } + break; + case IDC_BIRTHDAY_DAY: + case IDC_BIRTHDAY_MONTH: + case IDC_BIRTHDAY_YEAR: + if (HIWORD(wParam)==CBN_SELCHANGE) + { + DWORD dwAge; + SYSTEMTIME stTime={0}; + + stTime.wYear=(WORD)GET_CURRENT_COMBO_DATA(hWndDlg,IDC_BIRTHDAY_YEAR); + stTime.wMonth=(WORD)GET_CURRENT_COMBO_DATA(hWndDlg,IDC_BIRTHDAY_MONTH); + stTime.wDay=(WORD)GET_CURRENT_COMBO_DATA(hWndDlg,IDC_BIRTHDAY_DAY); + + dwAge=GetYears(&stTime); + SendMessage(GetDlgItem(hWndDlg,IDC_AGERANGE_FROM),CB_SETCURSEL,dwAge,0); + SendMessage(GetDlgItem(hWndDlg,IDC_AGERANGE_TO),CB_SETCURSEL,dwAge,0); + SendMessage(GetDlgItem(hWndDlg,IDC_ZODIAK),CB_SETCURSEL,0,0); + } + break; + case IDC_ZODIAK: + if (HIWORD(wParam)==CBN_SELCHANGE) + { + SendMessage(GetDlgItem(hWndDlg,IDC_BIRTHDAY_DAY),CB_SETCURSEL,0,0); + SendMessage(GetDlgItem(hWndDlg,IDC_BIRTHDAY_MONTH),CB_SETCURSEL,0,0); + //SendMessage(GetDlgItem(hWndDlg,IDC_BIRTHDAY_YEAR),CB_SETCURSEL,0,0); + } + break; + case IDC_COUNTRY: + if (HIWORD(wParam)==CBN_SELCHANGE) + { + HWND hWndCombo; + DWORD dwItem,dwCountryID; + + dwCountryID=GET_CURRENT_COMBO_DATA(hWndDlg,IDC_COUNTRY); + hWndCombo=GetDlgItem(hWndDlg,IDC_STATE); + SendMessage(hWndCombo,CB_RESETCONTENT,0,0); + ResetComboBox(GetDlgItem(hWndDlg,IDC_CITY)); + dwItem=SendMessage(hWndCombo,CB_ADDSTRING,0,(LPARAM)L""); + SendMessage(hWndCombo,CB_SETITEMDATA,dwItem,0); + SendMessage(hWndCombo,CB_SETCURSEL,dwItem,0); + + for(SIZE_T i=0;mrapPlaces[i].lpszData;i++) + { + if (mrapPlaces[i].dwCountryID==dwCountryID && mrapPlaces[i].dwCityID && mrapPlaces[i].dwPlaceID==0) + { + dwItem=SendMessage(hWndCombo,CB_ADDSTRING,0,(LPARAM)mrapPlaces[i].lpszData); + SendMessage(hWndCombo,CB_SETITEMDATA,dwItem,mrapPlaces[i].dwCityID); + } + } + } + break; + case IDC_STATE: + if (HIWORD(wParam)==CBN_SELCHANGE) + { + HWND hWndCombo; + DWORD dwItem,dwCountryID,dwStateID; + + dwCountryID=GET_CURRENT_COMBO_DATA(hWndDlg,IDC_COUNTRY); + dwStateID=GET_CURRENT_COMBO_DATA(hWndDlg,IDC_STATE); + hWndCombo=GetDlgItem(hWndDlg,IDC_CITY); + SendMessage(hWndCombo,CB_RESETCONTENT,0,0); + dwItem=SendMessage(hWndCombo,CB_ADDSTRING,0,(LPARAM)L""); + SendMessage(hWndCombo,CB_SETITEMDATA,dwItem,0); + SendMessage(hWndCombo,CB_SETCURSEL,dwItem,0); + + for(SIZE_T i=0;mrapPlaces[i].lpszData;i++) + { + if (mrapPlaces[i].dwCountryID==dwCountryID && mrapPlaces[i].dwCityID==dwStateID && mrapPlaces[i].dwPlaceID) + { + dwItem=SendMessage(hWndCombo,CB_ADDSTRING,0,(LPARAM)mrapPlaces[i].lpszData); + SendMessage(hWndCombo,CB_SETITEMDATA,dwItem,mrapPlaces[i].dwPlaceID); + } + } + } + break; + default: + break; + } + break; + default: + break; + } +return(FALSE); +} + + +DWORD AdvancedSearchFromDlg(HWND hWndDlg) +{ + DWORD dwRequestFlags=0; + CHAR szUser[MAX_PATH],szDomain[MAX_PATH]; + WCHAR wszNickName[MAX_PATH],wszFirstName[MAX_PATH],wszLastName[MAX_PATH]; + SIZE_T dwUserSize,dwDomainSize,dwNickNameSize,dwFirstNameSize,dwLastNameSize; + DWORD dwSex,dwDate1,dwDate2,dwCityID,dwZodiak,dwBirthdayMonth,dwBirthdayDay,dwCountryID,dwOnline; + + + dwUserSize=GET_DLG_ITEM_TEXTA(hWndDlg,IDC_EMAIL_USER,szUser,SIZEOF(szUser)); + dwDomainSize=GET_DLG_ITEM_TEXTA(hWndDlg,IDC_EMAIL_DOMAIN,szDomain,SIZEOF(szDomain)); + if (dwUserSize && dwDomainSize) + { + SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_USER); + SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_DOMAIN); + } + + dwNickNameSize=GET_DLG_ITEM_TEXT(hWndDlg,IDC_NICK,wszNickName,SIZEOF(wszNickName)); + if (dwNickNameSize) SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_NICKNAME); + + dwFirstNameSize=GET_DLG_ITEM_TEXT(hWndDlg,IDC_FIRSTNAME,wszFirstName,SIZEOF(wszFirstName)); + if (dwFirstNameSize) SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_FIRSTNAME); + + dwLastNameSize=GET_DLG_ITEM_TEXT(hWndDlg,IDC_LASTNAME,wszLastName,SIZEOF(wszLastName)); + if (dwLastNameSize) SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_LASTNAME); + + dwSex=GET_CURRENT_COMBO_DATA(hWndDlg,IDC_GENDER); + if (dwSex) SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_SEX); + + dwDate1=GET_CURRENT_COMBO_DATA(hWndDlg,IDC_AGERANGE_FROM); + if (dwDate1) SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_DATE1); + + dwDate2=GET_CURRENT_COMBO_DATA(hWndDlg,IDC_AGERANGE_TO); + if (dwDate2) SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_DATE2); + + dwCityID=GET_CURRENT_COMBO_DATA(hWndDlg,IDC_CITY); + if (dwCityID==0) dwCityID=GET_CURRENT_COMBO_DATA(hWndDlg,IDC_STATE); + if (dwCityID) SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_CITY_ID); + + dwZodiak=GET_CURRENT_COMBO_DATA(hWndDlg,IDC_ZODIAK); + if (dwZodiak) SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_ZODIAC); + + dwBirthdayMonth=GET_CURRENT_COMBO_DATA(hWndDlg,IDC_BIRTHDAY_MONTH); + if (dwBirthdayMonth) SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_MONTH); + + dwBirthdayDay=GET_CURRENT_COMBO_DATA(hWndDlg,IDC_BIRTHDAY_DAY); + if (dwBirthdayMonth) SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_DAY); + + dwCountryID=GET_CURRENT_COMBO_DATA(hWndDlg,IDC_COUNTRY); + if (dwCountryID) SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_COUNTRY_ID); + + + dwOnline=IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_ONLINEONLY); + if (dwOnline) SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_ONLINE); + +return(MraSendCommand_WPRequestW(NULL,ACKTYPE_SEARCH,dwRequestFlags,szUser,dwUserSize,szDomain,dwDomainSize,wszNickName,dwNickNameSize,wszFirstName,dwFirstNameSize,wszLastName,dwLastNameSize,dwSex,dwDate1,dwDate2,dwCityID,dwZodiak,dwBirthdayMonth,dwBirthdayDay,dwCountryID,dwOnline)); +} \ No newline at end of file diff --git a/MRA/MraAntiSpam.cpp b/MRA/MraAntiSpam.cpp new file mode 100644 index 0000000..38607c2 --- /dev/null +++ b/MRA/MraAntiSpam.cpp @@ -0,0 +1,540 @@ +// started: 19.12.2006 + +#include "Mra.h" +#include "MraAntiSpam.h" +#include "MraRTFMsg.h" + + +typedef struct +{ + LPWSTR lpwszBadWord; + DWORD dwBadWordLen; +} MRA_ANTISPAM_BAD_WORD; + +static MRA_ANTISPAM_BAD_WORD *pmabwBadWords=NULL; +static SIZE_T dwBadWordsCount=0; + + + +#define MRA_ANTISPAM_PREALLOC_COUNT 256 +SIZE_T MraAntiSpamLoadBadWordsW() +{ + SIZE_T dwRet=0; + + char szSettingName[MAX_PATH]; + SIZE_T i=0,dwValueSize,dwAllocatedItemsCount=MRA_ANTISPAM_PREALLOC_COUNT; + DBVARIANT dbv={0}; + DBCONTACTGETSETTING sVal={0}; + + dbv.type=DBVT_WCHAR; + sVal.pValue=&dbv; + sVal.szModule=PROTOCOL_NAMEA; + sVal.szSetting=szSettingName; + + + if (pmabwBadWords || dwBadWordsCount) MraAntiSpamFreeBadWords(); + + pmabwBadWords=(MRA_ANTISPAM_BAD_WORD*)MEMALLOC((sizeof(MRA_ANTISPAM_BAD_WORD)*dwAllocatedItemsCount)); + + for(i=0;TRUE;i++) + { + mir_snprintf(szSettingName,SIZEOF(szSettingName),"AntiSpamBadWord %lu",i); + dbv.type=DBVT_WCHAR; + if (CallService(MS_DB_CONTACT_GETSETTING_STR,NULL,(LPARAM)&sVal)) + { + break; + }else{ + if (dwAllocatedItemsCount==i) + { + dwAllocatedItemsCount+=MRA_ANTISPAM_PREALLOC_COUNT; + pmabwBadWords=(MRA_ANTISPAM_BAD_WORD*)MEMREALLOC(pmabwBadWords,(sizeof(MRA_ANTISPAM_BAD_WORD)*dwAllocatedItemsCount)); + if (pmabwBadWords==NULL) break; + } + + dwValueSize=lstrlenW(dbv.pwszVal); + pmabwBadWords[i].lpwszBadWord=(LPWSTR)MEMALLOC((dwValueSize*sizeof(WCHAR))); + if (pmabwBadWords[i].lpwszBadWord) + {//BuffToLowerCase(szValue,dbv.pszVal,dwValueSize); + memmove(pmabwBadWords[i].lpwszBadWord,dbv.pwszVal,(dwValueSize*sizeof(WCHAR))); + CharLowerBuffW(pmabwBadWords[i].lpwszBadWord,dwValueSize); + pmabwBadWords[i].dwBadWordLen=dwValueSize; + } + DBFreeVariant(&dbv); + + if (pmabwBadWords[i].lpwszBadWord==NULL) break; + } + } + dwBadWordsCount=i; + +return(dwRet); +} + + +void MraAntiSpamFreeBadWords() +{ + SIZE_T i; + + for(i=0;icode){ + case PSN_APPLY: + { + char szSettingName[MAX_PATH]; + WCHAR szBadWord[MAX_PATH]; + SIZE_T i,dwCount; + + DBWriteContactSettingByte(NULL,PROTOCOL_NAMEA,"AntiSpamEnable",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_ENABLE)); + DBWriteContactSettingByte(NULL,PROTOCOL_NAMEA,"AntiSpamCheckTempContacts",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_CHK_TEMP_CONTACTS)); + DBWriteContactSettingByte(NULL,PROTOCOL_NAMEA,"AntiSpamDeteleSpamBotContacts",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_DELETE_SPAMBOT_CONTACT)); + DBWriteContactSettingByte(NULL,PROTOCOL_NAMEA,"AntiSpamCleanNonAlphaNumeric",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_CLN_NON_ALPHNUM)); + DB_Mra_SetDword(NULL,"AntiSpamMaxLangChanges",(DWORD)GetDlgItemInt(hWndDlg,IDC_MAX_LANG_CHANGES,NULL,FALSE)); + DBWriteContactSettingByte(NULL,PROTOCOL_NAMEA,"AntiSpamShowPopUp",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_SHOWPOPUP)); + DBWriteContactSettingByte(NULL,PROTOCOL_NAMEA,"AntiSpamWriteToSystemHistory",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_WRITETOSYSTEMHISTORY)); + DBWriteContactSettingByte(NULL,PROTOCOL_NAMEA,"AntiSpamSendSpamReportToSrv",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_SEND_SPAM_REPORT_TO_SERVER)); + + dwCount=SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_BAD_WORDS_LIST,LB_GETCOUNT,0,0); + for(i=0;i//?;:'\"\\][}{`-=~!@#$%^&*()_+№1234567890"; + + //lstrlenW(lpwszExceptedChars)=46 + for(i=0;i<46;i++) + { + if (lpwszExceptedChars[i]==wcTestChar) + { + bRet=TRUE; + break; + } + } +return(bRet); +} + + +SIZE_T MraAntiSpamCalcLangChanges(LPWSTR lpwszMessage,SIZE_T dwMessageSize) +{ + SIZE_T dwRet=0; + + if (lpwszMessage && dwMessageSize) + { + WCHAR wcPrevChar=0; + SIZE_T i; + + for(i=1;i 255) + { + dwRet++; + } + wcPrevChar=lpwszMessage[i]; + } + } + } +return(dwRet); +} + + +SIZE_T MraAntiSpamCleanNonAlphaNumeric(LPWSTR lpwszMessage,SIZE_T dwMessageSize) +{ + SIZE_T dwRet=0; + + if (lpwszMessage && dwMessageSize) + { + LPWSTR lpwszCurWritePos=lpwszMessage; + SIZE_T i; + + for(i=0;i(SIZEOF(wszBuff)-(dwDBMessageSize+sizeof(DWORD)))) dwMessageSize=(SIZEOF(wszBuff)-(dwDBMessageSize+sizeof(DWORD))); + memmove((wszBuff+dwDBMessageSize),lpwszMessage,(dwMessageSize*sizeof(WCHAR))); + dwDBMessageSize+=dwMessageSize; + (*((DWORD*)(wszBuff+dwDBMessageSize)))=0; + dwDBMessageSize+=sizeof(DWORD); + + if (bAntiSpamShowPopUp) MraPopupShowFromAgentW(MRA_POPUP_TYPE_INFORMATION,0,wszBuff); + + if (bAntiSpamWriteToSystemHistory) + { + CHAR szBuff[MRA_MAXLENOFMESSAGE*2]; + DBEVENTINFO dbei={0}; + + WideCharToMultiByte(CP_UTF8,0,wszBuff,dwDBMessageSize,szBuff,SIZEOF(szBuff),NULL,NULL); + + dbei.cbSize=sizeof(dbei); + dbei.szModule=PROTOCOL_NAMEA; + dbei.timestamp=_time32(NULL); + dbei.flags=(DBEF_READ|DBEF_UTF); + dbei.eventType=EVENTTYPE_MESSAGE; + dbei.cbBlob=(dwDBMessageSize*sizeof(WCHAR)); + dbei.pBlob=(PBYTE)szBuff; + + CallService(MS_DB_EVENT_ADD,0,(LPARAM)&dbei); + } + + if (hContact && bAntiSpamDeteleSpamBotContacts) + { + dwDBMessageSize=mir_sntprintf(wszBuff,SIZEOF(wszBuff),L"%s: %S",TranslateW(L"Spam bot contact deleted"),szEMail); + + if (bAntiSpamShowPopUp) MraPopupShowFromAgentW(MRA_POPUP_TYPE_INFORMATION,0,wszBuff); + + if (bAntiSpamWriteToSystemHistory) + { + CHAR szBuff[MRA_MAXLENOFMESSAGE*2]; + DBEVENTINFO dbei={0}; + + (*((DWORD*)(wszBuff+dwDBMessageSize)))=0; + dwDBMessageSize+=sizeof(DWORD); + + WideCharToMultiByte(CP_UTF8,0,wszBuff,dwDBMessageSize,szBuff,SIZEOF(szBuff),NULL,NULL); + + dbei.cbSize=sizeof(dbei); + dbei.szModule=PROTOCOL_NAMEA; + dbei.timestamp=_time32(NULL); + dbei.flags=(DBEF_READ|DBEF_UTF); + dbei.eventType=EVENTTYPE_MESSAGE; + dbei.cbBlob=(dwDBMessageSize*sizeof(WCHAR)); + dbei.pBlob=(PBYTE)szBuff; + + CallService(MS_DB_EVENT_ADD,0,(LPARAM)&dbei); + } + } + } + + if (hContact && bAntiSpamDeteleSpamBotContacts) CallService(MS_DB_CONTACT_DELETE,(WPARAM)hContact,0); + } + } +return(dwRet); +} diff --git a/MRA/MraAntiSpam.h b/MRA/MraAntiSpam.h new file mode 100644 index 0000000..697daf6 --- /dev/null +++ b/MRA/MraAntiSpam.h @@ -0,0 +1,24 @@ +#if !defined(AFX_MRA_ANTISPAM_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) +#define AFX_MRA_ANTISPAM_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + + +SIZE_T MraAntiSpamLoadBadWordsW(); +void MraAntiSpamFreeBadWords(); + +INT_PTR CALLBACK MraAntiSpamDlgProcOpts(HWND hWndDlg,UINT msg,WPARAM wParam,LPARAM lParam); + +void MraAntiSpamResetBadWordsList(); + +#define MESSAGE_NOT_SPAM 1 +#define MESSAGE_SPAM 2 +DWORD MraAntiSpamReceivedMessageW(LPSTR lpszEMail,SIZE_T dwEMailSize,DWORD dwMessageFlags,LPWSTR lpwszMessage,SIZE_T dwMessageSize); + + +#endif // !defined(AFX_MRA_ANTISPAM_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/MRA/MraAvatars.cpp b/MRA/MraAvatars.cpp new file mode 100644 index 0000000..96e498d --- /dev/null +++ b/MRA/MraAvatars.cpp @@ -0,0 +1,912 @@ +#include "Mra.h" +#include "MraAvatars.h" + + + + +#define PA_FORMAT_MAX 7 +const LPSTR lpcszExtensions[9]= +{ + ".dat",// PA_FORMAT_UNKNOWN + ".png",// PA_FORMAT_PNG + ".jpg",// PA_FORMAT_JPEG + ".ico",// PA_FORMAT_ICON + ".bmp",// PA_FORMAT_BMP + ".gif",// PA_FORMAT_GIF + ".swf",// PA_FORMAT_SWF + ".xml",// PA_FORMAT_XML + NULL +}; + + +const LPSTR lpcszContentType[9]= +{ + "", // PA_FORMAT_UNKNOWN + "image/png", // PA_FORMAT_PNG + "image/jpeg", // PA_FORMAT_JPEG + "image/icon", // PA_FORMAT_ICON + "image/x-xbitmap", // PA_FORMAT_BMP + "image/gif", // PA_FORMAT_GIF + "", // PA_FORMAT_SWF + "", // PA_FORMAT_XML + NULL +}; + + + +typedef struct +{ + FIFO_MT ffmtQueueToQuery; + BOOL bIsRunning; + HANDLE hNetlibUser; + HANDLE hThreadEvent; + DWORD dwThreadsCount; + HANDLE hThread[MAXIMUM_WAIT_OBJECTS]; + LONG lThreadsRunningCount; + HANDLE hAvatarsPath; +} MRA_AVATARS_QUEUE; + + +typedef struct +{ + // internal + FIFO_MT_ITEM ffmtiFifoItem; + // external + DWORD dwAvatarsQueueID; + DWORD dwFlags; + HANDLE hContact; +} MRA_AVATARS_QUEUE_ITEM; + + + +#define FILETIME_SECOND ((DWORDLONG)10000000) +#define FILETIME_MINUTE ((DWORDLONG)FILETIME_SECOND*60) + + +char szAvtSectName[MAX_PATH]; +#define MRA_AVT_SECT_NAME szAvtSectName + + + + + +//#define MEMALLOC(Size) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(Size+sizeof(SIZE_T))) +//#define MEMREALLOC(Mem,Size) HeapReAlloc(GetProcessHeap(),(HEAP_ZERO_MEMORY),(LPVOID)Mem,(Size+sizeof(SIZE_T))) +//#define MEMFREE(Mem) if (Mem) {HeapFree(GetProcessHeap(),0,(LPVOID)Mem);Mem=NULL;} + +#define NETLIB_CLOSEHANDLE(hConnection) {Netlib_CloseHandle(hConnection);hConnection=NULL;} + +void MraAvatarsQueueClear (HANDLE hAvatarsQueueHandle); +DWORD MraAvatarsQueueAdd (HANDLE hAvatarsQueueHandle,DWORD dwFlags,HANDLE hContact,DWORD *pdwAvatarsQueueID); +void MraAvatarsThreadProc (LPVOID lpParameter); +HANDLE MraAvatarsHttpConnect (HANDLE hNetlibUser,LPSTR lpszHost,DWORD dwPort); + + + +#define MAHTRO_AVT 0 +#define MAHTRO_AVTMRIM 1 +#define MAHTRO_AVTSMALL 2 +#define MAHTRO_AVTSMALLMRIM 3 +DWORD MraAvatarsHttpTransaction (HANDLE hConnection,DWORD dwRequestType,LPSTR lpszUser,LPSTR lpszDomain,LPSTR lpszHost,DWORD dwReqObj,BOOL bUseKeepAliveConn,DWORD *pdwResultCode,BOOL *pbKeepAlive,DWORD *pdwFormat,SIZE_T *pdwAvatarSize,INTERNET_TIME *pitLastModifiedTime); +BOOL MraAvatarsGetContactTime (HANDLE hContact,LPSTR lpszValueName,SYSTEMTIME *pstTime); +void MraAvatarsSetContactTime (HANDLE hContact,LPSTR lpszValueName,SYSTEMTIME *pstTime); +DWORD MraAvatarsGetFileFormat (LPSTR lpszPath,SIZE_T dwPathSize); + + + + + +DWORD MraAvatarsQueueInitialize(HANDLE *phAvatarsQueueHandle) +{ + DWORD dwRetErrorCode; + + mir_snprintf(szAvtSectName,SIZEOF(szAvtSectName),"%s Avatars",PROTOCOL_NAMEA); + + if (phAvatarsQueueHandle) + { + MRA_AVATARS_QUEUE *pmraaqAvatarsQueue; + + pmraaqAvatarsQueue=(MRA_AVATARS_QUEUE*)MEMALLOC(sizeof(MRA_AVATARS_QUEUE)); + if (pmraaqAvatarsQueue) + { + dwRetErrorCode=FifoMTInitialize(&pmraaqAvatarsQueue->ffmtQueueToQuery,0); + if (dwRetErrorCode==NO_ERROR) + { + CHAR szBuffer[MAX_PATH]; + NETLIBUSER nlu={0}; + + mir_snprintf(szBuffer,SIZEOF(szBuffer),"%s %s %s",PROTOCOL_NAMEA,Translate("Avatars"),Translate("plugin connections")); + nlu.cbSize=sizeof(nlu); + nlu.flags=(NUF_OUTGOING|NUF_HTTPCONNS); + nlu.szSettingsModule=MRA_AVT_SECT_NAME; + nlu.szDescriptiveName=szBuffer; + pmraaqAvatarsQueue->hNetlibUser=(HANDLE)CallService(MS_NETLIB_REGISTERUSER,0,(LPARAM)&nlu); + if (pmraaqAvatarsQueue->hNetlibUser) + { + LPSTR lpszPathToAvatarsCache; + + lpszPathToAvatarsCache=Utils_ReplaceVars("%miranda_avatarcache%"); + pmraaqAvatarsQueue->hAvatarsPath=FoldersRegisterCustomPath(MRA_AVT_SECT_NAME,"AvatarsPath",lpszPathToAvatarsCache); + mir_free(lpszPathToAvatarsCache); + + InterlockedExchange((volatile LONG*)&pmraaqAvatarsQueue->bIsRunning,TRUE); + pmraaqAvatarsQueue->hThreadEvent=CreateEvent(NULL,FALSE,FALSE,NULL); + + pmraaqAvatarsQueue->dwThreadsCount=DBGetContactSettingDword(NULL,MRA_AVT_SECT_NAME,"WorkThreadsCount",MRA_AVT_DEFAULT_WRK_THREAD_COUNTS); + if (pmraaqAvatarsQueue->dwThreadsCount==0) pmraaqAvatarsQueue->dwThreadsCount=1; + if (pmraaqAvatarsQueue->dwThreadsCount>MAXIMUM_WAIT_OBJECTS) pmraaqAvatarsQueue->dwThreadsCount=MAXIMUM_WAIT_OBJECTS; + for (DWORD i=0;idwThreadsCount;i++) + { + pmraaqAvatarsQueue->hThread[i]=(HANDLE)mir_forkthread((pThreadFunc)MraAvatarsThreadProc,pmraaqAvatarsQueue); + } + + (*phAvatarsQueueHandle)=(HANDLE)pmraaqAvatarsQueue; + } + } + }else{ + dwRetErrorCode=GetLastError(); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +void MraAvatarsQueueClear(HANDLE hAvatarsQueueHandle) +{ + if (hAvatarsQueueHandle) + { + MRA_AVATARS_QUEUE *pmraaqAvatarsQueue=(MRA_AVATARS_QUEUE*)hAvatarsQueueHandle; + MRA_AVATARS_QUEUE_ITEM *pmraaqiAvatarsQueueItem; + PROTO_AVATAR_INFORMATION pai={0}; + + pai.cbSize=sizeof(pai); + //pai.hContact=pmraaqiAvatarsQueueItem->hContact; + pai.format=PA_FORMAT_UNKNOWN; + //pai.filename[0]=0; + + while(FifoMTItemPop(&pmraaqAvatarsQueue->ffmtQueueToQuery,NULL,(LPVOID*)&pmraaqiAvatarsQueueItem)==NO_ERROR) + { + pai.hContact=pmraaqiAvatarsQueueItem->hContact; + ProtoBroadcastAck(PROTOCOL_NAMEA,pmraaqiAvatarsQueueItem->hContact,ACKTYPE_AVATAR,ACKRESULT_FAILED,(HANDLE)&pai,0); + MEMFREE(pmraaqiAvatarsQueueItem); + } + } +} + + +void MraAvatarsQueueDestroy(HANDLE hAvatarsQueueHandle) +{ + if (hAvatarsQueueHandle) + { + MRA_AVATARS_QUEUE *pmraaqAvatarsQueue=(MRA_AVATARS_QUEUE*)hAvatarsQueueHandle; + + InterlockedExchange((volatile LONG*)&pmraaqAvatarsQueue->bIsRunning,FALSE); + SetEvent(pmraaqAvatarsQueue->hThreadEvent); + + WaitForMultipleObjects(pmraaqAvatarsQueue->dwThreadsCount,(HANDLE*)&pmraaqAvatarsQueue->hThread[0],TRUE,(WAIT_FOR_THREAD_TIMEOUT*1000)); + + if (InterlockedExchangeAdd((volatile LONG*)&pmraaqAvatarsQueue->lThreadsRunningCount,0)) + {// Иногда они не завершаются, хотя уведомление говорит об обратном %) + while(InterlockedExchangeAdd((volatile LONG*)&pmraaqAvatarsQueue->lThreadsRunningCount,0)) + {// ждём пока точно все завершатся + SleepEx(100,TRUE); + } + } + + CloseHandle(pmraaqAvatarsQueue->hThreadEvent); + + MraAvatarsQueueClear(hAvatarsQueueHandle); + + FifoMTDestroy(&pmraaqAvatarsQueue->ffmtQueueToQuery); + Netlib_CloseHandle(pmraaqAvatarsQueue->hNetlibUser); + MEMFREE(pmraaqAvatarsQueue); + } +} + + +DWORD MraAvatarsQueueAdd(HANDLE hAvatarsQueueHandle,DWORD dwFlags,HANDLE hContact,DWORD *pdwAvatarsQueueID) +{ + DWORD dwRetErrorCode; + + if (hAvatarsQueueHandle) + { + MRA_AVATARS_QUEUE *pmraaqAvatarsQueue=(MRA_AVATARS_QUEUE*)hAvatarsQueueHandle; + MRA_AVATARS_QUEUE_ITEM *pmraaqiAvatarsQueueItem; + + pmraaqiAvatarsQueueItem=(MRA_AVATARS_QUEUE_ITEM*)MEMALLOC(sizeof(MRA_AVATARS_QUEUE_ITEM)); + if (pmraaqiAvatarsQueueItem) + { + //pmraaqiAvatarsQueueItem->ffmtiFifoItem; + pmraaqiAvatarsQueueItem->dwAvatarsQueueID=GetTickCount(); + pmraaqiAvatarsQueueItem->dwFlags=dwFlags; + pmraaqiAvatarsQueueItem->hContact=hContact; + + FifoMTItemPush(&pmraaqAvatarsQueue->ffmtQueueToQuery,&pmraaqiAvatarsQueueItem->ffmtiFifoItem,(LPVOID)pmraaqiAvatarsQueueItem); + if (pdwAvatarsQueueID) (*pdwAvatarsQueueID)=pmraaqiAvatarsQueueItem->dwAvatarsQueueID; + SetEvent(pmraaqAvatarsQueue->hThreadEvent); + + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Avatars: can't add request to queue, error",dwRetErrorCode); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +void MraAvatarsThreadProc(LPVOID lpParameter) +{ + MRA_AVATARS_QUEUE *pmraaqAvatarsQueue=(MRA_AVATARS_QUEUE*)lpParameter; + MRA_AVATARS_QUEUE_ITEM *pmraaqiAvatarsQueueItem; + + char szEMail[MAX_EMAIL_LEN],szFileName[MAX_FILEPATH],szServer[MAX_PATH]; + WCHAR szErrorText[2048]; + BOOL bContinue,bKeepAlive,bUseKeepAliveConn,bFailed,bDownloadNew,bDefaultAvt; + BYTE btBuff[BUFF_SIZE_RCV]; + DWORD dwResultCode,dwAvatarFormat,dwReceived,dwWritten,dwServerPort,dwErrorCode; + LPSTR lpszUser,lpszDomain; + SIZE_T dwEMailSize,dwAvatarSizeServer,dwFileNameSize; + FILETIME ftLastModifiedTimeServer,ftLastModifiedTimeLocal; + SYSTEMTIME stAvatarLastModifiedTimeLocal; + HANDLE hConnection=NULL,hFile; + NETLIBSELECT nls={0}; + INTERNET_TIME itAvatarLastModifiedTimeServer; + PROTO_AVATAR_INFORMATION pai; + + nls.cbSize=sizeof(nls); + pai.cbSize=sizeof(pai); + + InterlockedIncrement((volatile LONG*)&pmraaqAvatarsQueue->lThreadsRunningCount); + + while(InterlockedExchangeAdd((volatile LONG*)&pmraaqAvatarsQueue->bIsRunning,0)) + { + if (FifoMTItemPop(&pmraaqAvatarsQueue->ffmtQueueToQuery,NULL,(LPVOID*)&pmraaqiAvatarsQueueItem)==NO_ERROR) + { + bFailed=TRUE; + bDownloadNew=FALSE; + bDefaultAvt=FALSE; + + if (DB_GetStaticStringA(NULL,MRA_AVT_SECT_NAME,"Server",szServer,SIZEOF(szServer),NULL)==FALSE) memmove(szServer,MRA_AVT_DEFAULT_SERVER,sizeof(MRA_AVT_DEFAULT_SERVER)); + dwServerPort=DBGetContactSettingDword(NULL,MRA_AVT_SECT_NAME,"ServerPort",MRA_AVT_DEFAULT_SERVER_PORT); + bUseKeepAliveConn=DBGetContactSettingByte(NULL,MRA_AVT_SECT_NAME,"UseKeepAliveConn",MRA_AVT_DEFAULT_USE_KEEPALIVE_CONN); + + + if (DB_Mra_GetStaticStringA(pmraaqiAvatarsQueueItem->hContact,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + BuffToLowerCase(szEMail,szEMail,dwEMailSize); + if (lpszDomain=(LPSTR)MemoryFindByte(0,szEMail,dwEMailSize,'@')) + if (lpszUser=(LPSTR)MemoryFindByte((lpszDomain-szEMail),szEMail,dwEMailSize,'.')) + { + (*lpszUser)=0; + lpszUser=szEMail; + (*lpszDomain)=0; + lpszDomain++; + + + ProtoBroadcastAck(PROTOCOL_NAMEA,pmraaqiAvatarsQueueItem->hContact,ACKTYPE_AVATAR,ACKRESULT_CONNECTING,(HANDLE)pmraaqiAvatarsQueueItem->dwAvatarsQueueID,0); + if (hConnection==NULL) hConnection=MraAvatarsHttpConnect(pmraaqAvatarsQueue->hNetlibUser,szServer,dwServerPort); + if (hConnection) + { + ProtoBroadcastAck(PROTOCOL_NAMEA,pmraaqiAvatarsQueueItem->hContact,ACKTYPE_AVATAR,ACKRESULT_CONNECTED,(HANDLE)pmraaqiAvatarsQueueItem->dwAvatarsQueueID,0); + ProtoBroadcastAck(PROTOCOL_NAMEA,pmraaqiAvatarsQueueItem->hContact,ACKTYPE_AVATAR,ACKRESULT_SENTREQUEST,(HANDLE)pmraaqiAvatarsQueueItem->dwAvatarsQueueID,0); + if (MraAvatarsHttpTransaction(hConnection,REQUEST_HEAD,lpszUser,lpszDomain,szServer,MAHTRO_AVTMRIM,bUseKeepAliveConn,&dwResultCode,&bKeepAlive,&dwAvatarFormat,&dwAvatarSizeServer,&itAvatarLastModifiedTimeServer)==NO_ERROR) + { + switch(dwResultCode){ + case 200: + if (MraAvatarsGetContactTime(pmraaqiAvatarsQueueItem->hContact,"AvatarLastModifiedTime",&stAvatarLastModifiedTimeLocal)) + { + SystemTimeToFileTime(&itAvatarLastModifiedTimeServer.stTime,&ftLastModifiedTimeServer); + SystemTimeToFileTime(&stAvatarLastModifiedTimeLocal,&ftLastModifiedTimeLocal); + + if ((*((DWORDLONG*)&ftLastModifiedTimeServer))!=(*((DWORDLONG*)&ftLastModifiedTimeLocal))) + {// need check for update + bDownloadNew=TRUE; + //ProtoBroadcastAck(PROTOCOL_NAMEA,pmraaqiAvatarsQueueItem->hContact,ACKTYPE_AVATAR,ACKRESULT_STATUS,0,0); + }else{// avatar is valid + if (MraAvatarsGetFileName((HANDLE)pmraaqAvatarsQueue,pmraaqiAvatarsQueueItem->hContact,dwAvatarFormat,(LPSTR)szFileName,SIZEOF(szFileName),NULL)==NO_ERROR) + { + if(IsFileExistA(szFileName)) + { + bFailed=FALSE; + }else{ + bDownloadNew=TRUE; + } + } + } + }else{// need update + bDownloadNew=TRUE; + } + break; + case 404:// return def avatar + if (MraAvatarsGetFileName((HANDLE)pmraaqAvatarsQueue,NULL,PA_FORMAT_DEFAULT,(LPSTR)szFileName,SIZEOF(szFileName),&dwFileNameSize)==NO_ERROR) + { + if(IsFileExistA(szFileName)) + { + dwAvatarFormat=MraAvatarsGetFileFormat(szFileName,dwFileNameSize); + bFailed=FALSE; + }else{//loading default avatar + bDownloadNew=TRUE; + } + bDefaultAvt=TRUE; + } + break; + default: + mir_sntprintf(szErrorText,SIZEOF(szErrorText),TranslateW(L"Avatars: server return HTTP code: %lu"),dwResultCode); + ShowFormatedErrorMessage(szErrorText,NO_ERROR); + break; + } + } + if (bUseKeepAliveConn==FALSE || bKeepAlive==FALSE) NETLIB_CLOSEHANDLE(hConnection); + } + + + if (bDownloadNew) + { + if (hConnection==NULL) hConnection=MraAvatarsHttpConnect(pmraaqAvatarsQueue->hNetlibUser,szServer,dwServerPort); + if (hConnection) + { + ProtoBroadcastAck(PROTOCOL_NAMEA,pmraaqiAvatarsQueueItem->hContact,ACKTYPE_AVATAR,ACKRESULT_DATA,(HANDLE)pmraaqiAvatarsQueueItem->dwAvatarsQueueID,0); + if (MraAvatarsHttpTransaction(hConnection,REQUEST_GET,lpszUser,lpszDomain,szServer,MAHTRO_AVT,bUseKeepAliveConn,&dwResultCode,&bKeepAlive,&dwAvatarFormat,&dwAvatarSizeServer,&itAvatarLastModifiedTimeServer)==NO_ERROR && dwResultCode==200) + { + if (bDefaultAvt) dwAvatarFormat=PA_FORMAT_DEFAULT; + if (MraAvatarsGetFileName((HANDLE)pmraaqAvatarsQueue,pmraaqiAvatarsQueueItem->hContact,dwAvatarFormat,(LPSTR)szFileName,SIZEOF(szFileName),NULL)==NO_ERROR) + { + hFile=CreateFileA(szFileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); + if (hFile!=INVALID_HANDLE_VALUE) + { + dwWritten=0; + bContinue=TRUE; + nls.dwTimeout=(1000*DBGetContactSettingDword(NULL,MRA_AVT_SECT_NAME,"TimeOutReceive",MRA_AVT_DEFAULT_TIMEOUT_RECV)); + nls.hReadConns[0]=hConnection; + + while(bContinue) + { + switch(CallService(MS_NETLIB_SELECT,0,(LPARAM)&nls)){ + case SOCKET_ERROR: + case 0:// Time out + dwErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Avatars: error on receive file data",dwErrorCode); + bContinue=FALSE; + break; + case 1: + dwReceived=Netlib_Recv(hConnection,(LPSTR)&btBuff,SIZEOF(btBuff),0); + if (dwReceived==0 || dwReceived==SOCKET_ERROR) + { + dwErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Avatars: error on receive file data",dwErrorCode); + bContinue=FALSE; + }else{ + if (WriteFile(hFile,(LPVOID)&btBuff,dwReceived,&dwReceived,NULL)) + { + dwWritten+=dwReceived; + if (dwWritten>=dwAvatarSizeServer) bContinue=FALSE; + }else{ + dwErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Avatars: cant write file data, error",dwErrorCode); + bContinue=FALSE; + } + } + break; + } + + } + CloseHandle(hFile); + bFailed=FALSE; + }else{ + dwErrorCode=GetLastError(); + mir_sntprintf(szErrorText,SIZEOF(szErrorText),TranslateW(L"Avatars: cant open file %S, error"),szFileName); + ShowFormatedErrorMessage(szErrorText,dwErrorCode); + } + } + }else{ + DebugBreak(); + } + if (bUseKeepAliveConn==FALSE || bKeepAlive==FALSE) NETLIB_CLOSEHANDLE(hConnection); + } + } + } + } + + if (bFailed) + { + DeleteFileA(szFileName); + pai.hContact=pmraaqiAvatarsQueueItem->hContact; + pai.format=PA_FORMAT_UNKNOWN; + pai.filename[0]=0; + //MraAvatarsSetContactTime(pmraaqiAvatarsQueueItem->hContact,"AvatarLastModifiedTime",NULL); + // write owner avatar file name to DB + //if (pmraaqiAvatarsQueueItem->hContact==NULL) DB_Mra_DeleteValue(NULL,"AvatarFile"); + + ProtoBroadcastAck(PROTOCOL_NAMEA,pmraaqiAvatarsQueueItem->hContact,ACKTYPE_AVATAR,ACKRESULT_FAILED,(HANDLE)&pai,0); + }else{ + pai.hContact=pmraaqiAvatarsQueueItem->hContact; + pai.format=dwAvatarFormat; + if (DBGetContactSettingByte(NULL,MRA_AVT_SECT_NAME,"ReturnAbsolutePath",MRA_AVT_DEFAULT_RET_ABC_PATH)) + { + lstrcpynA(pai.filename,szFileName,SIZEOF(pai.filename)); + }else{ + CallService(MS_UTILS_PATHTORELATIVE,(WPARAM)szFileName,(LPARAM)pai.filename); + } + if (bDefaultAvt) dwAvatarFormat=PA_FORMAT_DEFAULT; + SetContactAvatarFormat(pmraaqiAvatarsQueueItem->hContact,dwAvatarFormat); + MraAvatarsSetContactTime(pmraaqiAvatarsQueueItem->hContact,"AvatarLastModifiedTime",&itAvatarLastModifiedTimeServer.stTime); + // write owner avatar file name to DB + if (pmraaqiAvatarsQueueItem->hContact==NULL) + {// proto avatar + //DB_Mra_SetStringA(NULL,"AvatarFile",pai.filename); + CallService(MS_AV_REPORTMYAVATARCHANGED,(WPARAM)PROTOCOL_NAMEA,0); + } + + ProtoBroadcastAck(PROTOCOL_NAMEA,pmraaqiAvatarsQueueItem->hContact,ACKTYPE_AVATAR,ACKRESULT_SUCCESS,(HANDLE)&pai,0); + } + MEMFREE(pmraaqiAvatarsQueueItem); + }else{// waiting until service stop or new task + NETLIB_CLOSEHANDLE(hConnection); + WaitForSingleObjectEx(pmraaqAvatarsQueue->hThreadEvent,MRA_AVT_DEFAULT_QE_CHK_INTERVAL,FALSE); + } + } + + InterlockedDecrement((volatile LONG*)&pmraaqAvatarsQueue->lThreadsRunningCount); +} + + +HANDLE MraAvatarsHttpConnect(HANDLE hNetlibUser,LPSTR lpszHost,DWORD dwPort) +{ + HANDLE hConnection; + DWORD dwConnectReTryCount,dwCurConnectReTryCount; + NETLIBOPENCONNECTION nloc={0}; + + dwConnectReTryCount=DBGetContactSettingDword(NULL,MRA_AVT_SECT_NAME,"ConnectReTryCount",MRA_AVT_DEFAULT_CONN_RETRY_COUNT); + + nloc.cbSize=sizeof(nloc); + nloc.flags=(NLOCF_HTTP|NLOCF_V2); + nloc.szHost=lpszHost; + if (IsHTTPSProxyUsed(hNetlibUser)) + {// через https прокси только 443 порт + nloc.wPort=MRA_SERVER_PORT_HTTPS; + }else{ + nloc.wPort=(WORD)dwPort; + } + nloc.timeout=DBGetContactSettingDword(NULL,MRA_AVT_SECT_NAME,"TimeOutConnect",MRA_AVT_DEFAULT_TIMEOUT_CONN); + if (nloc.timeoutMRA_TIMEOUT_CONN_МАХ) nloc.timeout=MRA_TIMEOUT_CONN_МАХ; + + + dwCurConnectReTryCount=dwConnectReTryCount; + do{ + hConnection=(HANDLE)CallService(MS_NETLIB_OPENCONNECTION,(WPARAM)hNetlibUser,(LPARAM)&nloc); + }while(--dwCurConnectReTryCount && hConnection==NULL); + + if (hConnection==NULL) + { + ShowFormatedErrorMessage(L"Avatars: can't connect to server, error",GetLastError()); + } +return(hConnection); +} + + +DWORD MraAvatarsHttpTransaction(HANDLE hConnection,DWORD dwRequestType,LPSTR lpszUser,LPSTR lpszDomain,LPSTR lpszHost,DWORD dwReqObj,BOOL bUseKeepAliveConn,DWORD *pdwResultCode,BOOL *pbKeepAlive,DWORD *pdwFormat,SIZE_T *pdwAvatarSize,INTERNET_TIME *pitLastModifiedTime) +{ + DWORD dwRetErrorCode; + + if (pdwResultCode) (*pdwResultCode)=0; + if (pbKeepAlive) (*pbKeepAlive)=FALSE; + if (pdwFormat) (*pdwFormat)=PA_FORMAT_UNKNOWN; + if (pdwAvatarSize) (*pdwAvatarSize)=0; + if (pitLastModifiedTime) memset(pitLastModifiedTime,0, sizeof(INTERNET_TIME)); + + if (hConnection) + { + char szBuff[4096],szSelfVersionString[MAX_PATH]; + DWORD dwSended,dwBuffSize; + LPSTR lpszReqObj; + NETLIBHTTPHEADER nlbhHeaders[8]={0}; + NETLIBHTTPREQUEST *pnlhr,nlhr={0}; + + switch(dwReqObj){ + case MAHTRO_AVT: lpszReqObj="_avatar"; break; + case MAHTRO_AVTMRIM: lpszReqObj="_mrimavatar"; break; + case MAHTRO_AVTSMALL: lpszReqObj="_avatarsmall"; break; + case MAHTRO_AVTSMALLMRIM: lpszReqObj="_mrimavatarsmall"; break; + default: lpszReqObj=""; break; + } + dwBuffSize=mir_snprintf(szBuff,SIZEOF(szBuff),"http://%s/%s/%s/%s",lpszHost,lpszDomain,lpszUser,lpszReqObj); + + MraGetSelfVersionString(szSelfVersionString,SIZEOF(szSelfVersionString),NULL); + + nlbhHeaders[0].szName="User-Agent"; nlbhHeaders[0].szValue=szSelfVersionString; + nlbhHeaders[1].szName="Accept-Encoding";nlbhHeaders[1].szValue="deflate"; + nlbhHeaders[2].szName="Pragma"; nlbhHeaders[2].szValue="no-cache"; + nlbhHeaders[3].szName="Connection"; nlbhHeaders[3].szValue=(bUseKeepAliveConn)? "keep-alive":"close"; + //nlbhHeaders[4].szName="If-Modified-Since";nlbhHeaders[4].szValue="Thu, 03 Aug 2006 19:54:33 GMT"; + + nlhr.cbSize=sizeof(nlhr); + nlhr.requestType=dwRequestType; + nlhr.flags=(NLHRF_GENERATEHOST|NLHRF_SMARTREMOVEHOST|NLHRF_SMARTAUTHHEADER); + nlhr.szUrl=szBuff; + nlhr.headers=(NETLIBHTTPHEADER*)&nlbhHeaders; + nlhr.headersCount=4; + //nlhr.pData=NULL; + //nlhr.dataLength=0; + //nlhr.resultCode=0; + //nlhr.szResultDescr=NULL; + //nlhr.nlc=NULL; + + dwSended=CallService(MS_NETLIB_SENDHTTPREQUEST,(WPARAM)hConnection,(LPARAM)&nlhr); + if (dwSended!=SOCKET_ERROR && dwSended) + { + pnlhr=(NETLIBHTTPREQUEST*)CallService(MS_NETLIB_RECVHTTPHEADERS,(WPARAM)hConnection,(LPARAM)0); + if (pnlhr) + { + for(SIZE_T i=0;i<(SIZE_T)pnlhr->headersCount;i++) + { + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,pnlhr->headers[i].szName,-1,"Connection",10)==CSTR_EQUAL) + { + if (pbKeepAlive) (*pbKeepAlive)=(CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,pnlhr->headers[i].szValue,-1,"keep-alive",10)==CSTR_EQUAL); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,pnlhr->headers[i].szName,-1,"Content-Type",12)==CSTR_EQUAL) + { + if (pdwFormat) + { + for (SIZE_T j=0;jheaders[i].szValue,-1,lpcszContentType[j],-1)==CSTR_EQUAL) + { + (*pdwFormat)=j; + break; + } + } + } + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,pnlhr->headers[i].szName,-1,"Content-Length",14)==CSTR_EQUAL) + { + if (pdwAvatarSize) (*pdwAvatarSize)=StrToUNum(pnlhr->headers[i].szValue,lstrlenA(pnlhr->headers[i].szValue)); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,pnlhr->headers[i].szName,-1,"Last-Modified",13)==CSTR_EQUAL) + { + if (pitLastModifiedTime) InternetTimeGetTime(pnlhr->headers[i].szValue,lstrlenA(pnlhr->headers[i].szValue),pitLastModifiedTime); + } + }// end for + + if (pdwResultCode) (*pdwResultCode)=pnlhr->resultCode; + CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,(WPARAM)0,(LPARAM)pnlhr); + dwRetErrorCode=NO_ERROR; + }else{// err on receive + dwRetErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Avatars: error on receive HTTP answer",dwRetErrorCode); + } + }else{// err on send http request + dwRetErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Avatars: error on send HTTP request",dwRetErrorCode); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } + +return(dwRetErrorCode); +} + + +BOOL MraAvatarsGetContactTime(HANDLE hContact,LPSTR lpszValueName,SYSTEMTIME *pstTime) +{ + BOOL bRet=FALSE; + + if (lpszValueName && pstTime) + { + char szBuff[MAX_PATH]; + SIZE_T dwBuffSize; + INTERNET_TIME itAvatarLastModifiedTimeLocal; + + if (DB_Mra_GetStaticStringA(hContact,lpszValueName,(LPSTR)szBuff,SIZEOF(szBuff),&dwBuffSize)) + if (InternetTimeGetTime(szBuff,dwBuffSize,&itAvatarLastModifiedTimeLocal)==NO_ERROR) + { + memmove(pstTime,&itAvatarLastModifiedTimeLocal.stTime,sizeof(SYSTEMTIME)); + bRet=TRUE; + } + } +return(bRet); +} + + +void MraAvatarsSetContactTime(HANDLE hContact,LPSTR lpszValueName,SYSTEMTIME *pstTime) +{ + if (lpszValueName) + { + char szBuff[MAX_PATH]; + SIZE_T dwBuffUsedSize; + INTERNET_TIME itTime; + + if (pstTime) + { + itTime.lTimeZone=0; + memmove(&itTime.stTime,pstTime,sizeof(SYSTEMTIME)); + }else{ + InternetTimeGetCurrentTime(&itTime); + } + + if (itTime.stTime.wYear) + { + InternetTimeGetString(&itTime,(LPSTR)szBuff,SIZEOF(szBuff),&dwBuffUsedSize); + DB_Mra_SetStringExA(hContact,lpszValueName,(LPSTR)szBuff,dwBuffUsedSize); + }else{ + DB_Mra_DeleteValue(hContact,lpszValueName); + } + } +} + + +DWORD MraAvatarsGetFileFormat(LPSTR lpszPath,SIZE_T dwPathSize) +{ + DWORD dwRet=-1,dwExt; + + BuffToLowerCase(&dwExt,(lpszPath+(dwPathSize-sizeof(DWORD))),sizeof(DWORD)); + for(DWORD i=0;ihAvatarsPath==NULL || FoldersGetCustomPath(pmraaqAvatarsQueue->hAvatarsPath,lpszCurPath,dwPathSize,"")) + {// default path + LPSTR lpszPathToAvatarsCache; + SIZE_T dwPathToAvatarsCacheSize; + + lpszPathToAvatarsCache=Utils_ReplaceVars("%miranda_avatarcache%"); + dwPathToAvatarsCacheSize=lstrlenA(lpszPathToAvatarsCache); + if (dwPathSize>(dwPathToAvatarsCacheSize+8)) + { + memmove(lpszCurPath,lpszPathToAvatarsCache,dwPathToAvatarsCacheSize); + dwPathSize-=(dwPathToAvatarsCacheSize+1); + lpszCurPath+=dwPathToAvatarsCacheSize; + (*((BYTE*)lpszCurPath++))='\\'; + (*((BYTE*)lpszCurPath))=0;// теперь точно строка закончится нулём + }else{ + dwPathSize=0; + if (pdwPathSizeRet) (*pdwPathSizeRet)=(dwPathToAvatarsCacheSize+MAX_PATH+32); + } + mir_free(lpszPathToAvatarsCache); + }else{ + dwEMailSize=lstrlenA(lpszCurPath); + dwPathSize-=dwEMailSize; + lpszCurPath+=dwEMailSize; + } + + if (dwPathSize) + {// some path in buff and free space for file name is avaible + CreateDirectoryA(lpszPath,NULL); + + if (dwFormat!=PA_FORMAT_DEFAULT) + { + if (DB_Mra_GetStaticStringA(hContact,"e-mail",lpszCurPath,(dwPathSize-5),&dwEMailSize)) + { + BuffToLowerCase(lpszCurPath,lpszCurPath,dwEMailSize); + lpszCurPath+=dwEMailSize; + (*((DWORD*)lpszCurPath))=(*((DWORD*)lpcszExtensions[dwFormat])); + lpszCurPath+=sizeof(DWORD); + (*((BYTE*)lpszCurPath))=0; + + if (pdwPathSizeRet) (*pdwPathSizeRet)=(lpszCurPath-lpszPath); + dwRetErrorCode=NO_ERROR; + } + }else{ + if (DB_GetStaticStringA(NULL,MRA_AVT_SECT_NAME,"DefaultAvatarFileName",lpszCurPath,(dwPathSize-5),&dwEMailSize)==FALSE) + { + memmove(lpszCurPath,MRA_AVT_DEFAULT_AVT_FILENAME,sizeof(MRA_AVT_DEFAULT_AVT_FILENAME)); + lpszCurPath+=(sizeof(MRA_AVT_DEFAULT_AVT_FILENAME)-1); + (*((BYTE*)lpszCurPath))=0; + + if (pdwPathSizeRet) (*pdwPathSizeRet)=(lpszCurPath-lpszPath); + dwRetErrorCode=NO_ERROR; + } + } + } + }else{//146119@chat.agent - conferences has no avatars + dwRetErrorCode=ERROR_NOT_SUPPORTED; + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + + +DWORD MraAvatarsQueueGetAvatar(HANDLE hAvatarsQueueHandle,DWORD dwFlags,HANDLE hContact,DWORD *pdwAvatarsQueueID,DWORD *pdwFormat,LPSTR lpszPath) +{ + DWORD dwRetCode=GAIR_NOAVATAR; + + if (hAvatarsQueueHandle) + if (DBGetContactSettingByte(NULL,MRA_AVT_SECT_NAME,"Enable",MRA_AVT_DEFAULT_ENABLE)) + if (IsContactChatAgent(hContact)==FALSE) + {// not @chat.agent conference + BOOL bQueueAdd=TRUE;// check for updates + MRA_AVATARS_QUEUE *pmraaqAvatarsQueue=(MRA_AVATARS_QUEUE*)hAvatarsQueueHandle; + SYSTEMTIME stAvatarLastCheckTime; + + if ((dwFlags&GAIF_FORCE)==0)// если флаг принудит. обновления, то даже не проверяем времени последнего обновления + if (MraAvatarsGetContactTime(hContact,"AvatarLastCheckTime",&stAvatarLastCheckTime)) + { + char szFileName[MAX_FILEPATH]; + SIZE_T dwPathSize; + FILETIME ftCurrentTime,ftExpireTime; + + GetSystemTimeAsFileTime(&ftCurrentTime); + SystemTimeToFileTime(&stAvatarLastCheckTime,&ftExpireTime); + (*((DWORDLONG*)&ftExpireTime))+=(FILETIME_MINUTE*(DWORDLONG)DBGetContactSettingDword(NULL,MRA_AVT_SECT_NAME,"CheckInterval",MRA_AVT_DEFAULT_CHK_INTERVAL)); + + if ((*((DWORDLONG*)&ftExpireTime))>(*((DWORDLONG*)&ftCurrentTime))) + if (MraAvatarsGetFileName(hAvatarsQueueHandle,hContact,GetContactAvatarFormat(hContact,PA_FORMAT_DEFAULT),(LPSTR)szFileName,SIZEOF(szFileName),&dwPathSize)==NO_ERROR) + if (IsFileExistA(szFileName)) + {// файл с аватаром существует и не устарел/не было комманды обновлять(просто запрос имени) + if (lpszPath) + if (DBGetContactSettingByte(NULL,MRA_AVT_SECT_NAME,"ReturnAbsolutePath",MRA_AVT_DEFAULT_RET_ABC_PATH)) + { + lstrcpynA(lpszPath,szFileName,MAX_PATH); + }else{ + CallService(MS_UTILS_PATHTORELATIVE,(WPARAM)szFileName,(LPARAM)lpszPath); + } + if (pdwFormat) (*pdwFormat)=GetContactAvatarFormat(hContact,PA_FORMAT_DEFAULT); + dwRetCode=GAIR_SUCCESS; + bQueueAdd=FALSE; + } + } + + if (bQueueAdd || (dwFlags&GAIF_FORCE)) + if (MraAvatarsQueueAdd(hAvatarsQueueHandle,dwFlags,hContact,pdwAvatarsQueueID)==NO_ERROR) + { + MraAvatarsSetContactTime(hContact,"AvatarLastCheckTime",NULL); + dwRetCode=GAIR_WAITFOR; + } + } +return(dwRetCode); +} + + +DWORD MraAvatarsQueueGetAvatarSimple(HANDLE hAvatarsQueueHandle,DWORD dwFlags,HANDLE hContact,DWORD dwSourceID) +{//***deb dwSourceID - for filtering cals from different places + DWORD dwRetCode=GAIR_NOAVATAR; + PROTO_AVATAR_INFORMATION pai={0}; + + pai.cbSize=sizeof(pai); + pai.hContact=hContact; + if ((dwRetCode=MraAvatarsQueueGetAvatar(hAvatarsQueueHandle,dwFlags,hContact,NULL,(DWORD*)&pai.format,pai.filename))==GAIR_SUCCESS) + { + // write owner avatar file name to DB + if (hContact==NULL) + { + //DB_Mra_SetStringA(NULL,"AvatarFile",pai.filename); + CallService(MS_AV_REPORTMYAVATARCHANGED,(WPARAM)PROTOCOL_NAMEA,0); + } + ProtoBroadcastAck(PROTOCOL_NAMEA,hContact,ACKTYPE_AVATAR,ACKRESULT_SUCCESS,(HANDLE)&pai,0); + } +return(dwRetCode); +} + + +WORD wMraAvatarsControlsList[]={ + IDC_SERVER, + IDC_SERVERPORT, + IDC_BUTTON_DEFAULT, + IDC_USE_KEEPALIVE_CONN, + IDC_UPD_CHECK_INTERVAL, + IDC_RETURN_ABC_PATH, + IDC_DELETE_AVT_ON_CONTACT_DELETE +}; + +INT_PTR CALLBACK MraAvatarsQueueDlgProcOpts(HWND hWndDlg,UINT msg,WPARAM wParam,LPARAM lParam) +{ + switch(msg){ + case WM_INITDIALOG: + { + WCHAR szServer[MAX_PATH]; + + TranslateDialogDefault(hWndDlg); + + CHECK_DLG_BUTTON(hWndDlg,IDC_ENABLE,DBGetContactSettingByte(NULL,MRA_AVT_SECT_NAME,"Enable",MRA_AVT_DEFAULT_ENABLE)); + + if (DB_GetStaticStringW(NULL,MRA_AVT_SECT_NAME,"Server",szServer,MAX_PATH,NULL)) + { + SET_DLG_ITEM_TEXT(hWndDlg,IDC_SERVER,szServer); + }else{ + SET_DLG_ITEM_TEXTA(hWndDlg,IDC_SERVER,MRA_AVT_DEFAULT_SERVER); + } + + SetDlgItemInt(hWndDlg,IDC_SERVERPORT,DBGetContactSettingDword(NULL,MRA_AVT_SECT_NAME,"ServerPort",MRA_AVT_DEFAULT_SERVER_PORT),FALSE); + CHECK_DLG_BUTTON(hWndDlg,IDC_USE_KEEPALIVE_CONN,DBGetContactSettingByte(NULL,MRA_AVT_SECT_NAME,"UseKeepAliveConn",MRA_AVT_DEFAULT_USE_KEEPALIVE_CONN)); + SetDlgItemInt(hWndDlg,IDC_UPD_CHECK_INTERVAL,DBGetContactSettingDword(NULL,MRA_AVT_SECT_NAME,"CheckInterval",MRA_AVT_DEFAULT_CHK_INTERVAL),FALSE); + CHECK_DLG_BUTTON(hWndDlg,IDC_RETURN_ABC_PATH,DBGetContactSettingByte(NULL,MRA_AVT_SECT_NAME,"ReturnAbsolutePath",MRA_AVT_DEFAULT_RET_ABC_PATH)); + CHECK_DLG_BUTTON(hWndDlg,IDC_DELETE_AVT_ON_CONTACT_DELETE,DBGetContactSettingByte(NULL,MRA_AVT_SECT_NAME,"DeleteAvtOnContactDelete",MRA_DELETE_AVT_ON_CONTACT_DELETE)); + + EnableControlsArray(hWndDlg,(WORD*)&wMraAvatarsControlsList,SIZEOF(wMraAvatarsControlsList),IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_ENABLE)); + } + return(TRUE); + case WM_COMMAND: + if (LOWORD(wParam)==IDC_ENABLE) + { + EnableControlsArray(hWndDlg,(WORD*)&wMraAvatarsControlsList,SIZEOF(wMraAvatarsControlsList),IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_ENABLE)); + } + + if (LOWORD(wParam)==IDC_BUTTON_DEFAULT) + { + SET_DLG_ITEM_TEXTA(hWndDlg,IDC_SERVER,MRA_AVT_DEFAULT_SERVER); + SetDlgItemInt(hWndDlg,IDC_SERVERPORT,MRA_AVT_DEFAULT_SERVER_PORT,FALSE); + } + + if ((LOWORD(wParam)==IDC_SERVER || LOWORD(wParam)==IDC_SERVERPORT || LOWORD(wParam)==IDC_UPD_CHECK_INTERVAL) && (HIWORD(wParam)!=EN_CHANGE || (HWND)lParam!=GetFocus()) ) return(FALSE); + SendMessage(GetParent(hWndDlg),PSM_CHANGED,0,0); + break; + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->code){ + case PSN_APPLY: + { + WCHAR szServer[MAX_PATH]; + + DBWriteContactSettingByte(NULL,MRA_AVT_SECT_NAME,"Enable",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_ENABLE)); + DBWriteContactSettingByte(NULL,MRA_AVT_SECT_NAME,"DeleteAvtOnContactDelete",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_DELETE_AVT_ON_CONTACT_DELETE)); + DBWriteContactSettingByte(NULL,MRA_AVT_SECT_NAME,"ReturnAbsolutePath",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_RETURN_ABC_PATH)); + DBWriteContactSettingDword(NULL,MRA_AVT_SECT_NAME,"CheckInterval",GetDlgItemInt(hWndDlg,IDC_UPD_CHECK_INTERVAL,NULL,FALSE)); + DBWriteContactSettingByte(NULL,MRA_AVT_SECT_NAME,"UseKeepAliveConn",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_USE_KEEPALIVE_CONN)); + DBWriteContactSettingDword(NULL,MRA_AVT_SECT_NAME,"ServerPort",GetDlgItemInt(hWndDlg,IDC_SERVERPORT,NULL,FALSE)); + GET_DLG_ITEM_TEXT(hWndDlg,IDC_SERVER,szServer,SIZEOF(szServer));DB_SetStringW(NULL,MRA_AVT_SECT_NAME,"Server",szServer); + } + return(TRUE); + } + break; + } +return(FALSE); +} + + +DWORD MraAvatarsDeleteContactAvatarFile(HANDLE hAvatarsQueueHandle,HANDLE hContact) +{ + DWORD dwRetErrorCode,dwAvatarFormat; + char szFileName[MAX_FILEPATH]; + + if (hAvatarsQueueHandle) + { + MRA_AVATARS_QUEUE *pmraaqAvatarsQueue=(MRA_AVATARS_QUEUE*)hAvatarsQueueHandle; + + dwAvatarFormat=GetContactAvatarFormat(hContact,PA_FORMAT_UNKNOWN); + if (DBGetContactSettingByte(NULL,MRA_AVT_SECT_NAME,"DeleteAvtOnContactDelete",MRA_DELETE_AVT_ON_CONTACT_DELETE) && dwAvatarFormat!=PA_FORMAT_DEFAULT) + { + if ((dwRetErrorCode=MraAvatarsGetFileName(hAvatarsQueueHandle,hContact,dwAvatarFormat,(LPSTR)szFileName,SIZEOF(szFileName),NULL))==NO_ERROR) + if (DeleteFileA(szFileName)) + { + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=GetLastError(); + } + }else{ + dwRetErrorCode=NO_ERROR; + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + diff --git a/MRA/MraAvatars.h b/MRA/MraAvatars.h new file mode 100644 index 0000000..b46b85f --- /dev/null +++ b/MRA/MraAvatars.h @@ -0,0 +1,35 @@ +#if !defined(AFX_MRA_AVATARS_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) +#define AFX_MRA_AVATARS_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + + + +DWORD MraAvatarsQueueInitialize (HANDLE *phAvatarsQueueHandle); +void MraAvatarsQueueDestroy (HANDLE hAvatarsQueueHandle); + + +#define PA_FORMAT_DEFAULT 255 // return file name of def avatar +#define GetContactAvatarFormat(hContact,dwDefaultFormat) DB_Mra_GetByte(hContact,"AvatarType",dwDefaultFormat) +#define SetContactAvatarFormat(hContact,dwFormat) DB_Mra_SetByte(hContact,"AvatarType",(BYTE)dwFormat) + +DWORD MraAvatarsGetFileName (HANDLE hAvatarsQueueHandle,HANDLE hContact,DWORD dwFormat,LPSTR lpszPath,SIZE_T dwPathSize,SIZE_T *pdwPathSizeRet); + +// mir flag: GAIF_FORCE +DWORD MraAvatarsQueueGetAvatar (HANDLE hAvatarsQueueHandle,DWORD dwFlags,HANDLE hContact,DWORD *pdwAvatarsQueueID,DWORD *pdwFormat,LPSTR lpszPath); +DWORD MraAvatarsQueueGetAvatarSimple (HANDLE hAvatarsQueueHandle,DWORD dwFlags,HANDLE hContact,DWORD dwSourceID); + + +INT_PTR CALLBACK MraAvatarsQueueDlgProcOpts (HWND hWndDlg,UINT msg,WPARAM wParam,LPARAM lParam); + +DWORD MraAvatarsDeleteContactAvatarFile (HANDLE hAvatarsQueueHandle,HANDLE hContact); + + + + +#endif // !defined(AFX_MRA_AVATARS_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/MRA/MraChat.cpp b/MRA/MraChat.cpp new file mode 100644 index 0000000..c0e0484 --- /dev/null +++ b/MRA/MraChat.cpp @@ -0,0 +1,389 @@ +#include "Mra.h" +#include "MraChat.h" +#include "proto.h" + + + +//static COLORREF crCols[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; +static LPWSTR lpwszStatuses[]={ L"Owners",L"Inviter",L"Visitors" }; +#define MRA_CHAT_STATUS_OWNER 0 +#define MRA_CHAT_STATUS_INVITER 1 +#define MRA_CHAT_STATUS_VISITOR 2 + + + + +int MraChatGcEventHook (WPARAM, LPARAM lParam); +void MraChatSendPrivateMessage (LPWSTR lpwszEMail); + + +void MraChatDllError() +{ + MessageBoxW(NULL,TranslateW(L"CHAT plugin is required for conferences. Install it before chatting"),PROTOCOL_DISPLAY_NAMEW,(MB_OK|MB_ICONWARNING)); +} + + + +BOOL MraChatRegister() +{ + BOOL bRet=FALSE; + + if (ServiceExists(MS_GC_REGISTER)) + { + GCREGISTER gcr={0}; + gcr.cbSize=sizeof(GCREGISTER); + gcr.dwFlags=GC_UNICODE; + gcr.iMaxText=MRA_MAXLENOFMESSAGE; + gcr.nColors=0; + //gcr.pColors=&crCols[0]; + gcr.pszModuleDispName=PROTOCOL_DISPLAY_NAMEA; + gcr.pszModule=PROTOCOL_NAMEA; + CallServiceSync(MS_GC_REGISTER,NULL,(LPARAM)&gcr); + + HookEvent(ME_GC_EVENT,&MraChatGcEventHook); + //HookEvent(ME_GC_BUILDMENU, &CJabberProto::JabberGcMenuHook ); + + bRet=TRUE; + }else{ + MraChatDllError(); + } +return(bRet); +} + + +INT_PTR MraChatSessionNew(HANDLE hContact) +{ + INT_PTR iRet=1; + + if (masMraSettings.bChatExist) + if (hContact) + { + GCSESSION gcw={0}; + WCHAR wszEMail[MAX_EMAIL_LEN]={0}; + + gcw.cbSize=sizeof(GCSESSION); + gcw.iType=GCW_CHATROOM; + gcw.pszModule=PROTOCOL_NAMEA; + gcw.ptszName=GetContactNameW(hContact); + gcw.ptszID=(LPWSTR)wszEMail; + gcw.ptszStatusbarText=L"status bar"; + gcw.dwFlags=GC_UNICODE; + gcw.dwItemData=(DWORD)hContact; + DB_Mra_GetStaticStringW(hContact,"e-mail",wszEMail,SIZEOF(wszEMail),NULL); + iRet=CallServiceSync(MS_GC_NEWSESSION,NULL,(LPARAM)&gcw); + + if (iRet==0) + { + CHAR szEMail[MAX_EMAIL_LEN]={0}; + SIZE_T dwEMailSize; + GCDEST gcd={0}; + GCEVENT gce={0}; + + gcd.pszModule=PROTOCOL_NAMEA; + gcd.ptszID=(LPWSTR)wszEMail; + gcd.iType=GC_EVENT_ADDGROUP; + + gce.cbSize=sizeof(GCEVENT); + gce.pDest=&gcd; + gce.dwFlags=GC_UNICODE; + for (SIZE_T i=0;ipDest->pszModule,-1,PROTOCOL_NAMEA,PROTOCOL_NAME_LEN)==CSTR_EQUAL) + { + switch(gch->pDest->iType){ + case GC_USER_MESSAGE: + if (gch->ptszText && lstrlen(gch->ptszText)) + { + BOOL bSlowSend; + CHAR szEMail[MAX_EMAIL_LEN]={0}; + DWORD dwFlags=0; + SIZE_T dwEMailSize,dwMessageSize; + INT_PTR iSendRet; + HANDLE hContact; + + //rtrim(gch->ptszText); + //TCHAR* buf = NEWTSTR_ALLOCA(gch->ptszText); + //UnEscapeChatTags( buf ); + + dwMessageSize=lstrlenW(gch->ptszText); + dwEMailSize=(WideCharToMultiByte(MRA_CODE_PAGE,0,gch->pDest->ptszID,-1,szEMail,SIZEOF(szEMail),NULL,NULL)-1); + hContact=MraHContactFromEmail(szEMail,dwEMailSize,FALSE,TRUE,NULL); + bSlowSend=DB_Mra_GetByte(NULL,"SlowSend",MRA_DEFAULT_SLOW_SEND); + + if (DB_Mra_GetByte(NULL,"RTFSendEnable",MRA_DEFAULT_RTF_SEND_ENABLE) && (MraContactCapabilitiesGet(hContact)&FEATURE_FLAG_RTF_MESSAGE)) + { + dwFlags|=MESSAGE_FLAG_RTF; + } + + iSendRet=MraSendCommand_MessageW(bSlowSend,hContact,ACKTYPE_MESSAGE,dwFlags,szEMail,dwEMailSize,gch->ptszText,dwMessageSize,NULL,0); + if (bSlowSend==FALSE) + { + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,hContact,ACKTYPE_MESSAGE,ACKRESULT_SUCCESS,(HANDLE)iSendRet,(LPARAM)NULL,0); + } + + MraChatSessionEventSendByHandle(hContact,GC_EVENT_MESSAGE,GCEF_ADDTOLOG,NULL,0,NULL,gch->ptszText,0,(DWORD)_time32(NULL)); + } + break; + case GC_USER_PRIVMESS: + MraChatSendPrivateMessage(gch->ptszUID); + break; + case GC_USER_LOGMENU: + //sttLogListHook( this, item, gch ); + break; + case GC_USER_NICKLISTMENU: + //sttNickListHook( this, item, gch ); + break; + case GC_USER_CHANMGR: + //int iqId = SerialNext(); + //IqAdd( iqId, IQ_PROC_NONE, &CJabberProto::OnIqResultGetMuc ); + //m_ThreadInfo->send( XmlNodeIq( _T("get"), iqId, item->jid ) << XQUERY( xmlnsOwner )); + break; + } + } + } +return(iRet); +} + + +void MraChatSendPrivateMessage(LPWSTR lpwszEMail) +{ + BOOL bAdded; + HANDLE hContact; + CHAR szEMail[MAX_EMAIL_LEN]={0}; + SIZE_T dwEMailSize; + + dwEMailSize=(WideCharToMultiByte(MRA_CODE_PAGE,0,lpwszEMail,-1,szEMail,SIZEOF(szEMail),NULL,NULL)-1); + hContact=MraHContactFromEmail(szEMail,dwEMailSize,TRUE,TRUE,&bAdded); + + if (bAdded) DBWriteContactSettingByte(hContact,"CList","Hidden",1); + CallService(MS_IGNORE_UNIGNORE,(WPARAM)hContact,IGNOREEVENT_ALL); + CallService(MS_MSG_SENDMESSAGE,(WPARAM)hContact,0); +} + + + + diff --git a/MRA/MraChat.h b/MRA/MraChat.h new file mode 100644 index 0000000..540ceec --- /dev/null +++ b/MRA/MraChat.h @@ -0,0 +1,30 @@ +#if !defined(AFX_MRA_CHAT_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) +#define AFX_MRA_CHAT_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + +void MraChatDllError (); +BOOL MraChatRegister (); +INT_PTR MraChatSessionNew (HANDLE hContactChatSession); +void MraChatSessionDestroy (HANDLE hContactChatSession); +INT_PTR MraChatSessionEventSendByHandle (HANDLE hContactChatSession,DWORD dwType,DWORD dwFlags,LPSTR lpszUID,SIZE_T dwUIDSize,LPWSTR lpwszStatus,LPWSTR lpwszMessage,DWORD_PTR dwItemData,DWORD dwTime); +INT_PTR MraChatSessionInvite (HANDLE hContactChatSession,LPSTR lpszEMailInMultiChat,SIZE_T dwEMailInMultiChatSize,DWORD dwTime); +INT_PTR MraChatSessionMembersAdd (HANDLE hContactChatSession,LPSTR lpszEMailInMultiChat,SIZE_T dwEMailInMultiChatSize,DWORD dwTime); +INT_PTR MraChatSessionJoinUser (HANDLE hContactChatSession,LPSTR lpszEMailInMultiChat,SIZE_T dwEMailInMultiChatSize,DWORD dwTime); +INT_PTR MraChatSessionLeftUser (HANDLE hContactChatSession,LPSTR lpszEMailInMultiChat,SIZE_T dwEMailInMultiChatSize,DWORD dwTime); +INT_PTR MraChatSessionSetIviter (HANDLE hContactChatSession,LPSTR lpszEMailInMultiChat,SIZE_T dwEMailInMultiChatSize); +INT_PTR MraChatSessionSetOwner (HANDLE hContactChatSession,LPSTR lpszEMailInMultiChat,SIZE_T dwEMailInMultiChatSize); +INT_PTR MraChatSessionMessageAdd (HANDLE hContactChatSession,LPSTR lpszEMailInMultiChat,SIZE_T dwEMailInMultiChatSize,LPWSTR lpwszMessage,SIZE_T dwMessageSize,DWORD dwTime); + + + + + + + +#endif // !defined(AFX_MRA_CHAT_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/MRA/MraConstans.h b/MRA/MraConstans.h new file mode 100644 index 0000000..330b8aa --- /dev/null +++ b/MRA/MraConstans.h @@ -0,0 +1,667 @@ +#if !defined(AFX_MRA_CONSTANS_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) +#define AFX_MRA_CONSTANS_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ + + +#include "proto.h" + + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + +#define MIN_MIR_VER_VERSION_DWORD PLUGIN_MAKE_VERSION(0,9,0,0) + + +#define PLUGIN_VERSION_DWORD PLUGIN_MAKE_VERSION(PROTO_VERSION_MAJOR,PROTO_VERSION_MINOR,0,1) +#define PROTOCOL_DISPLAY_NAME_ORIGA "Mail.ru Agent" + +#define MIRVER_UNKNOWN ("Mail.ru Agent unknown client") + + +#define PROTOCOL_NAMEA masMraSettings.szModuleName +#define PROTOCOL_NAMEW masMraSettings.wszModuleName +#define PROTOCOL_NAME_LEN masMraSettings.dwModuleNameLen +#define PROTOCOL_NAME_SIZE (PROTOCOL_NAME_LEN+1) +#define PROTOCOL_DISPLAY_NAMEA masMraSettings.szDisplayModuleName +#define PROTOCOL_DISPLAY_NAMEW masMraSettings.wszDisplayModuleName + + +#define MRA_PLUGIN_UPDATER_ID 2544 //появляется после первого выкладывания на сайт +#define MRA_SERVER_PORT_STANDART_NLB 2042 +#define MRA_SERVER_PORT_STANDART 2041 +#define MRA_SERVER_PORT_HTTPS 443 +static const LPSTR lpcszMailRuDomains[]= +{ + ("mail.ru"), + ("list.ru"), + ("bk.ru"), + ("inbox.ru"), + ("corp.mail.ru"), + NULL +}; +#define MAILRU_CHAT_CONF_DOMAIN "chat.agent" + + +#define MAX_EMAIL_LEN 1024 +#define MAX_FILEPATH 32768 //internal +#define BUFF_SIZE_RCV 65535 //internal +#define BUFF_SIZE_RCV_MIN_FREE 16384 //internal +#define BUFF_SIZE_BLOB 16384 //internal +#define BUFF_SIZE_URL 4096 //internal +#define NETLIB_SELECT_TIMEOUT 250 //internal // время ожидания событий на сокете +#define WAIT_FOR_THREAD_TIMEOUT 15 //internal // время ожидания завершения потока +#define THREAD_SLEEP_TIME 100 //internal +#define THREAD_MAX_PING_TIME 20 // sec, internal +#define THREAD_MAX_PING_FAIL_COUNT 3 // internal +#define SEND_QUEUE_TIMEOUT 600 //internal // время удаления недоставленных сообщений из очереди отправки +#define ALLOCATED_COUNT 32 //internal // колличество элементов +#define EMAILS_MIN_COUNT 16 //internal // колличество элементов обязательно проверяемых при извлечении email адреса из инфы юзера +#define PHONES_MIN_COUNT 4 //internal // колличество элементов обязательно проверяемых при извлечении email адреса из инфы юзера + + + +#define MRA_ALARM_MESSAGE L"Your contact wakes you" + +#define MRA_GOTO_INBOX "/GotoInbox" +#define MRA_GOTO_INBOX_STR L"Display &Inbox" +#define MRA_SHOW_INBOX_STATUS "/ShowInboxStatus" +#define MRA_SHOW_INBOX_STATUS_STR L"Display &Inbox status" +#define MRA_EDIT_PROFILE "/EditProfile" +#define MRA_EDIT_PROFILE_STR L"Edit &Profile" +#define MRA_MY_ALBUM "/MyAlbum" +#define MRA_MY_ALBUM_STR L"My Album" +#define MRA_MY_BLOG "/MyBlog" +#define MRA_MY_BLOG_STR L"My Blog" +#define MRA_MY_BLOGSTATUS "/MyBlogStatus" +#define MRA_MY_BLOGSTATUS_STR L"My Blog Status" +#define MRA_MY_VIDEO "/MyVideo" +#define MRA_MY_VIDEO_STR L"My Video" +#define MRA_MY_ANSWERS "/MyAnswers" +#define MRA_MY_ANSWERS_STR L"My Answers" +#define MRA_MY_WORLD "/MyWorld" +#define MRA_MY_WORLD_STR L"My World" +#define MRA_ZHUKI "/Zhuki" +#define MRA_ZHUKI_STR L"Zhuki" +#define MRA_CHAT "/Chat" +#define MRA_CHAT_STR L"Chat" +#define MRA_WEB_SEARCH "/WebSearch" +#define MRA_WEB_SEARCH_STR L"Web search" +#define MRA_UPD_ALL_USERS_INFO "/UpdateAllUsersInfo" +#define MRA_UPD_ALL_USERS_INFO_STR L"Update all users info" +#define MRA_CHK_UPDATES_USERS_AVATARS "/CheckUpdatesUsersAvatars" +#define MRA_CHK_UPDATES_USERS_AVATARS_STR L"Check updates users avatars" +#define MRA_REQ_AUTH_FOR_ALL "/ReqAuthForAll" +#define MRA_REQ_AUTH_FOR_ALL_STR L"Request authorization for all" + + +#define MRA_MPOP_AUTH_URL "http://swa.mail.ru/cgi-bin/auth?Login=%s&agent=%s&page=%s" + +#define MRA_WIN_INBOX_URL "http://win.mail.ru/cgi-bin/start" +#define MRA_PDA_INBOX_URL "http://pda.mail.ru/cgi-bin/start" +#define MRA_EDIT_PROFILE_URL "http://win.mail.ru/cgi-bin/userinfo?mra=1" +#define MRA_CHAT_URL "http://chat.mail.ru" +#define MRA_ZHUKI_URL "http://zhuki.mail.ru" +#define MRA_SEARCH_URL "http://go.mail.ru" + +// used spesialy! added: /domain/user +#define MRA_BLOGS_URL "http://blogs.mail.ru" +#define MRA_FOTO_URL "http://foto.mail.ru" +#define MRA_VIDEO_URL "http://video.mail.ru" +#define MRA_ANSWERS_URL "http://otvet.mail.ru" +#define MRA_WORLD_URL "http://my.mail.ru" + + +// without auth +#define MRA_REGISTER_URL "http://win.mail.ru/cgi-bin/signup" +#define MRA_FORGOT_PASSWORD_URL "http://win.mail.ru/cgi-bin/passremind" + + +// wParam=(WPARAM)hContact +#define MRA_REQ_AUTH "/ReqAuth" +#define MRA_REQ_AUTH_STR L"Request authorization" +#define MRA_GRANT_AUTH "/GrantAuth" +#define MRA_GRANT_AUTH_STR L"Grant authorization" +#define MRA_SEND_POSTCARD "/SendPostcard" +#define MRA_SEND_POSTCARD_STR L"&Send postcard" +#define MRA_VIEW_ALBUM "/ViewAlbum" +#define MRA_VIEW_ALBUM_STR L"&View Album" +#define MRA_READ_BLOG "/ReadBlog" +#define MRA_READ_BLOG_STR L"&Read Blog" +#define MRA_REPLY_BLOG_STATUS "/ReplyBlogStatus" +#define MRA_REPLY_BLOG_STATUS_STR L"Reply Blog Status" +#define MRA_VIEW_VIDEO "/ViewVideo" +#define MRA_VIEW_VIDEO_STR L"View Video" +#define MRA_ANSWERS "/Answers" +#define MRA_ANSWERS_STR L"Answers" +#define MRA_WORLD "/World" +#define MRA_WORLD_STR L"World" +#define MRA_SEND_NUDGE "/SendNudge" +#define MS_NUDGE "/Nudge" +#define MRA_SENDNUDGE_STR L"Send &Nudge" + + +#define ADV_ICON_DELETED 0 +#define ADV_ICON_DELETED_ID "ADV_ICON_DELETED" +#define ADV_ICON_DELETED_STR L"Mail box deleted" +#define ADV_ICON_NOT_ON_SERVER 1 +#define ADV_ICON_NOT_ON_SERVER_ID "ADV_ICON_NOT_ON_SERVER" +#define ADV_ICON_NOT_ON_SERVER_STR L"Contact not on server" +#define ADV_ICON_NOT_AUTHORIZED 2 +#define ADV_ICON_NOT_AUTHORIZED_ID "ADV_ICON_NOT_AUTHORIZED" +#define ADV_ICON_NOT_AUTHORIZED_STR L"Not authorized" +#define ADV_ICON_PHONE 3 +#define ADV_ICON_PHONE_ID "ADV_ICON_PHONE" +#define ADV_ICON_PHONE_STR L"Phone/SMS only contact" +#define ADV_ICON_BLOGSTATUS 4 +#define ADV_ICON_BLOGSTATUS_ID "ADV_ICON_BLOGSTATUS" +#define ADV_ICON_BLOGSTATUS_STR L"Blog status message" +#define ADV_ICON_MAX 5 + +static const GUI_DISPLAY_ITEM gdiExtraStatusIconsItems[] = +{ + { ADV_ICON_DELETED_ID, ADV_ICON_DELETED_STR, (INT_PTR)IDI_ERROR, NULL }, + { ADV_ICON_NOT_ON_SERVER_ID, ADV_ICON_NOT_ON_SERVER_STR, IDI_AUTHGRANT, NULL }, + { ADV_ICON_NOT_AUTHORIZED_ID, ADV_ICON_NOT_AUTHORIZED_STR, IDI_AUTHRUGUEST, NULL }, + { ADV_ICON_PHONE_ID, ADV_ICON_PHONE_STR, IDI_MRA_PHONE, NULL }, + { ADV_ICON_BLOGSTATUS_ID, ADV_ICON_BLOGSTATUS_STR, IDI_BLOGSTATUS, NULL }, +}; + + + + +#define MRA_SOUND_NEW_EMAIL "New E-mail available in Inbox" + + +#define MAILRU_SERVER_TIME_ZONE -180 //internal // +0300 +#define MAILRU_CONTACTISTYPING_TIMEOUT 10 //internal +#define MRA_DEFAULT_SERVER "mrim.mail.ru" +#define MRA_DEFAULT_SERVER_PORT MRA_SERVER_PORT_STANDART_NLB +#define MRA_MAX_MRIM_SERVER 46 +#define MRA_DEFAULT_TIMEOUT_CONN_MRIM 20 +#define MRA_DEFAULT_CONN_RETRY_COUNT_MRIM 2 +#define MRA_DEFAULT_TIMEOUT_CONN_NLB 20 +#define MRA_DEFAULT_CONN_RETRY_COUNT_NLB 3 +#define MRA_DEFAULT_TIMEOUT_RECV_NLB 20 +#define MRA_DEFAULT_CONN_RETRY_COUNT_FILES 2 +#define MRA_DEFAULT_CONN_RETRY_COUNT_MRIMPROXY 3 +#define MRA_TIMEOUT_DIRECT_CONN 30 //internal; время после которого клиент считает что к нему подключится не удалось +#define MRA_TIMEOUT_CONN_MIN 2 //internal; минимальное время ожидания пока устанавливается исходящее подключение +#define MRA_TIMEOUT_CONN_МАХ 16 //internal; максимальное время ожидания пока устанавливается исходящее подключение +#define MRA_MAXLENOFMESSAGE 32768 //internal +#define MRA_MAXCONTACTSPERPACKET 256 //internal +#define MRA_CODE_PAGE 1251 //internal +#define MRA_FEATURE_FLAGS (FEATURE_FLAG_BASE_SMILES|FEATURE_FLAG_ADVANCED_SMILES|FEATURE_FLAG_CONTACTS_EXCH|FEATURE_FLAG_WAKEUP|FEATURE_FLAG_MULTS|FEATURE_FLAG_FILE_TRANSFER|FEATURE_FLAG_GAMES) + + + +#define MRA_DEFAULT_POPUPS_ENABLED TRUE +#define MRA_DEFAULT_POPUPS_EVENT_FILTER -1 +#define MRA_DEFAULT_POPUP_TIMEOUT 8 +#define MRA_DEFAULT_POPUP_USE_WIN_COLORS TRUE +#define MRA_DEFAULT_POPUP_COLOR_BACK RGB(191,0,0) //Red +#define MRA_DEFAULT_POPUP_COLOR_TEXT RGB(255,245,225) //Yellow + + + +#define MRA_DEFAULT_NLB_FAIL_DIRECT_CONNECT FALSE // hidden option +#define MRA_DEFAULT_AUTO_ADD_CONTACTS_TO_SERVER TRUE +#define MRA_DEFAULT_AUTO_AUTH_REQ_ON_LOGON FALSE +#define MRA_DEFAULT_AUTO_AUTH_GRAND_IN_CLIST FALSE +#define MRA_DEFAULT_AUTO_AUTH_GRAND_NEW_USERS FALSE +#define MRA_DEFAULT_AUTO_AUTH_GRAND_NEW_USERS_DISABLE_SPAM_CHECK FALSE +#define MRA_DEFAULT_SLOW_SEND TRUE +#define MRA_DEFAULT_CVT_SMILES_TO_TAGS TRUE +#define MRA_DEFAULT_MIRVER_RAW FALSE // hidden option +#define MRA_DEFAULT_AUTH_MESSAGE L"Please authorize me" + +#define MRA_DEFAULT_RTF_RECEIVE_ENABLE FALSE +#define MRA_DEFAULT_RTF_SEND_ENABLE TRUE +#define MRA_DEFAULT_RTF_SEND_SMART TRUE +#define MRA_DEFAULT_RTF_BACKGROUND_COLOUR RGB(255,255,255) +#define MRA_DEFAULT_RTF_FONT_COLOUR RGB(255,0,0) +#define MRA_DEFAULT_RTF_FONT_SIZE 12 +#define MRA_DEFAULT_RTF_FONT_CHARSET RUSSIAN_CHARSET +#define MRA_DEFAULT_RTF_FONT_NAME L"Tahoma" + +#define MRA_DEFAULT_SEARCH_REMEMBER TRUE +#define MRA_DEFAULT_LAST_SEARCH_COUTRY 0 + + +#define MRA_DEFAULT_FILE_SEND_BLOCK_SIZE 8192 //hidden, размер блока при отправке файла + +#define MRA_DEFAULT_HIDE_MENU_ITEMS_FOR_NON_MRA FALSE + +#define MRA_DEFAULT_INC_NEW_MAIL_NOTIFY FALSE +#define MRA_DEFAULT_TRAYICON_NEW_MAIL_NOTIFY FALSE +#define MRA_DEFAULT_TRAYICON_NEW_MAIL_CLK_TO_INBOX FALSE + + + +#define MRA_ANTISPAM_DEFAULT_ENABLE TRUE +#define MRA_ANTISPAM_DEFAULT_CHK_TEMP_CONTACTS TRUE +#define MRA_ANTISPAM_DEFAULT_DELETE_SPAMBOT_CONTACT FALSE +#define MRA_ANTISPAM_DEFAULT_CLN_NON_ALPHNUM TRUE +#define MRA_ANTISPAM_DEFAULT_MAX_LNG_CHANGES 5 +#define MRA_ANTISPAM_DEFAULT_SHOWPOP TRUE +#define MRA_ANTISPAM_DEFAULT_WRITETOSYSTEMHISTORY TRUE +#define MRA_ANTISPAM_DEFAULT_SEND_SPAM_REPORT_TO_SERVER TRUE + + +#define MRA_AVT_DEFAULT_ENABLE TRUE +#define MRA_AVT_DEFAULT_WRK_THREAD_COUNTS 4 // hidden +#define MRA_AVT_DEFAULT_SERVER "obraz.foto.mail.ru" +#define MRA_AVT_DEFAULT_SERVER_PORT 80 +#define MRA_AVT_DEFAULT_TIMEOUT_CONN 10 +#define MRA_AVT_DEFAULT_CONN_RETRY_COUNT 3 +#define MRA_AVT_DEFAULT_TIMEOUT_RECV 30 +#define MRA_AVT_DEFAULT_USE_KEEPALIVE_CONN TRUE +#define MRA_AVT_DEFAULT_CHK_INTERVAL 60 +#define MRA_AVT_DEFAULT_AVT_FILENAME "_default.jpg" +#define MRA_AVT_DEFAULT_RET_ABC_PATH TRUE +#define MRA_DELETE_AVT_ON_CONTACT_DELETE TRUE +#define MRA_AVT_DEFAULT_QE_CHK_INTERVAL 1000 //internal + + +#define MRA_FILES_QUEUE_PROGRESS_INTERVAL 250 //internal +#define MRA_FILES_NULL_ADDRR "192.168.0.1:26666;" +#define MRA_DEF_FS_TIMEOUT_RECV 600 +#define MRA_DEF_FS_ENABLE_DIRECT_CONN TRUE +#define MRA_DEF_FS_NO_OUT_CONN_ON_RCV FALSE +#define MRA_DEF_FS_NO_OUT_CONN_ON_SEND FALSE +#define MRA_DEF_FS_IGNORY_ADDITIONAL_PORTS FALSE +#define MRA_DEF_FS_HIDE_MY_ADDRESSES FALSE +#define MRA_DEF_FS_ADD_EXTRA_ADDRESSES FALSE +#define MRA_DEF_FS_ENABLE_MRIM_PROXY_CONS TRUE + + + +#define PS_GETMYAVATAR "/GetMyAvatar" +//wParam=(char *)Buffer to file name +//lParam=(int)Buffer size +//return=0 for sucess + + + +#define ICQACKTYPE_SMS 1001 +#define ICQEVENTTYPE_SMS 2001 //database event type +#define MS_ICQ_SENDSMS "/SendSMS" + + +// Database setting names +#define DBSETTING_CAPABILITIES "caps" +#define DBSETTING_XSTATUSID "XStatusId" +#define DBSETTING_XSTATUSNAME "XStatusName" +#define DBSETTING_XSTATUSMSG "XStatusMsg" +#define DBSETTING_BLOGSTATUSTIME "BlogStatusTime" +#define DBSETTING_BLOGSTATUSID "BlogStatusID" +#define DBSETTING_BLOGSTATUS "BlogStatus" +#define DBSETTING_BLOGSTATUSMUSIC "ListeningTo" + +#define PS_ICQ_SETCUSTOMSTATUS "/SetXStatus" +#define PS_ICQ_SETCUSTOMSTATUSEX "/SetXStatusEx" +#define PS_ICQ_GETCUSTOMSTATUS "/GetXStatus" +#define PS_ICQ_GETCUSTOMSTATUSEX "/GetXStatusEx" +#define PS_ICQ_GETCUSTOMSTATUSICON "/GetXStatusIcon" + + +#define CSSF_MASK_STATUS 0x0001 // status member valid for set/get +#define CSSF_MASK_NAME 0x0002 // pszName member valid for set/get +#define CSSF_MASK_MESSAGE 0x0004 // pszMessage member valid for set/get +#define CSSF_DISABLE_UI 0x0040 // disable default custom status UI, wParam = bEnable +#define CSSF_DEFAULT_NAME 0x0080 // only with CSSF_MASK_NAME and get API to get default custom status name (wParam = status) +#define CSSF_STATUSES_COUNT 0x0100 // returns number of custom statuses in wParam, only get API +#define CSSF_STR_SIZES 0x0200 // returns sizes of custom status name & message (wParam & lParam members) in chars +#define CSSF_UNICODE 0x1000 // strings are in UCS-2 + + + +typedef struct { + int cbSize; // size of the structure + int flags; // combination of CSSF_* + int *status; // custom status id + union { + char *pszName; // buffer for custom status name + TCHAR *ptszName; + WCHAR *pwszName; + }; + union { + char *pszMessage; // buffer for custom status message + TCHAR *ptszMessage; + WCHAR *pwszMessage; + }; + WPARAM *wParam; // extra params, see flags + LPARAM *lParam; +} ICQ_CUSTOM_STATUS; + + + + + + + + + + + +INT_PTR MraGetCaps (WPARAM wParam,LPARAM lParam); +INT_PTR MraGetName (WPARAM wParam,LPARAM lParam); +INT_PTR MraLoadIcon (WPARAM wParam,LPARAM lParam); +INT_PTR MraSetStatus (WPARAM wParam,LPARAM lParam); +INT_PTR MraGetStatus (WPARAM wParam,LPARAM lParam); + +INT_PTR MraSetXStatus (WPARAM wParam,LPARAM lParam); +INT_PTR MraSetXStatusEx (WPARAM wParam,LPARAM lParam); +INT_PTR MraGetXStatus (WPARAM wParam,LPARAM lParam); +INT_PTR MraGetXStatusEx (WPARAM wParam,LPARAM lParam); +INT_PTR MraGetXStatusIcon (WPARAM wParam,LPARAM lParam); + +INT_PTR MraSetListeningTo (WPARAM wParam,LPARAM lParam); + +INT_PTR MraSetAwayMsgA (WPARAM wParam,LPARAM lParam); +INT_PTR MraSetAwayMsg (WPARAM wParam,LPARAM lParam); +INT_PTR MraGetAwayMsg (WPARAM wParam,LPARAM lParam); + +INT_PTR MraAuthAllow (WPARAM wParam,LPARAM lParam); +INT_PTR MraAuthDeny (WPARAM wParam,LPARAM lParam); +INT_PTR MraAddToList (WPARAM wParam,LPARAM lParam); +INT_PTR MraAddToListByEvent (WPARAM wParam,LPARAM lParam); + +INT_PTR MraRecvMessage (WPARAM wParam,LPARAM lParam); +INT_PTR MraRecvContacts (WPARAM wParam,LPARAM lParam); +INT_PTR MraRecvFile (WPARAM wParam,LPARAM lParam); +INT_PTR MraRecvAuth (WPARAM wParam,LPARAM lParam); + +INT_PTR MraSendAuthRequest (WPARAM wParam,LPARAM lParam); +INT_PTR MraSendMessage (WPARAM wParam,LPARAM lParam); +INT_PTR MraSendContacts (WPARAM wParam,LPARAM lParam); +INT_PTR MraSendUserIsTyping (WPARAM wParam,LPARAM lParam); +INT_PTR MraSendNudge (WPARAM wParam,LPARAM lParam); +INT_PTR MraSetApparentMode (WPARAM wParam,LPARAM lParam); +INT_PTR MraGetInfo (WPARAM wParam,LPARAM lParam); + +INT_PTR MraBasicSearch (WPARAM wParam,LPARAM lParam); +INT_PTR MraSearchByEmail (WPARAM wParam,LPARAM lParam); +INT_PTR MraSearchByName (WPARAM wParam,LPARAM lParam); +INT_PTR MraCreateAdvSearchUI (WPARAM wParam,LPARAM lParam); +INT_PTR MraSearchByAdvanced (WPARAM wParam,LPARAM lParam); + +INT_PTR MraGetAvatarCaps (WPARAM wParam,LPARAM lParam); +INT_PTR MraGetAvatarInfo (WPARAM wParam,LPARAM lParam); +INT_PTR MraGetMyAvatar (WPARAM wParam,LPARAM lParam); + +INT_PTR MraFileResume (WPARAM wParam,LPARAM lParam); +INT_PTR MraFileAllow (WPARAM wParam,LPARAM lParam); +INT_PTR MraFileDenyCancel (WPARAM wParam,LPARAM lParam); +INT_PTR MraFileSend (WPARAM wParam,LPARAM lParam); + + +INT_PTR MraSendSMS (WPARAM wParam,LPARAM lParam); + + +static const SERVICE_ITEM siPluginServices[] = +{ + { PS_GETCAPS, MraGetCaps }, + { PS_GETNAME, MraGetName }, + { PS_LOADICON, MraLoadIcon }, + { PS_SETSTATUS, MraSetStatus }, + { PS_GETSTATUS, MraGetStatus }, + + { PS_ICQ_SETCUSTOMSTATUS, MraSetXStatus }, + { PS_ICQ_SETCUSTOMSTATUSEX, MraSetXStatusEx }, + { PS_ICQ_GETCUSTOMSTATUS, MraGetXStatus }, + { PS_ICQ_GETCUSTOMSTATUSEX, MraGetXStatusEx }, + { PS_ICQ_GETCUSTOMSTATUSICON, MraGetXStatusIcon }, + + { PS_SET_LISTENINGTO, MraSetListeningTo }, + + { PS_SETAWAYMSG, MraSetAwayMsgA }, + { PS_SETAWAYMSGW, MraSetAwayMsg }, + { PSS_GETAWAYMSG, MraGetAwayMsg }, + + { PS_AUTHALLOW, MraAuthAllow }, + { PS_AUTHDENYW, MraAuthDeny }, + + { PS_ADDTOLIST, MraAddToList }, + { PS_ADDTOLISTBYEVENT, MraAddToListByEvent }, + + { PSR_MESSAGE, MraRecvMessage }, + { PSR_CONTACTS, MraRecvContacts }, + { PSR_FILE, MraRecvFile }, + { PSR_AUTH, MraRecvAuth }, + + { PSS_AUTHREQUESTW, MraSendAuthRequest }, + { PSS_MESSAGE, MraSendMessage }, + //{ PSS_MESSAGE"W", MraSendMessage }, + { PSS_CONTACTS, MraSendContacts }, + { PSS_USERISTYPING, MraSendUserIsTyping }, + { PSS_SETAPPARENTMODE, MraSetApparentMode }, + { PSS_GETINFO, MraGetInfo }, + + { PS_GETAVATARCAPS, MraGetAvatarCaps }, + { PS_GETAVATARINFO, MraGetAvatarInfo }, + { PS_GETMYAVATAR, MraGetMyAvatar }, + + { PS_BASICSEARCHW, MraBasicSearch }, + { PS_SEARCHBYEMAILW, MraSearchByEmail }, + { PS_SEARCHBYNAMEW, MraSearchByName }, + { PS_CREATEADVSEARCHUI, MraCreateAdvSearchUI }, + { PS_SEARCHBYADVANCED, MraSearchByAdvanced }, + + { PS_FILERESUMEW, MraFileResume }, + { PSS_FILEALLOWW, MraFileAllow }, + { PSS_FILEDENYW, MraFileDenyCancel }, + { PSS_FILECANCEL, MraFileDenyCancel }, + { PSS_FILEW, MraFileSend }, + + { MS_ICQ_SENDSMS, MraSendSMS }, + { MRA_SEND_NUDGE, MraSendNudge }, +}; + + + + +INT_PTR MraGotoInbox(WPARAM wParam,LPARAM lParam); +INT_PTR MraShowInboxStatus(WPARAM wParam,LPARAM lParam); +INT_PTR MraEditProfile(WPARAM wParam,LPARAM lParam); +INT_PTR MyAlbum(WPARAM wParam,LPARAM lParam); +INT_PTR MyBlog(WPARAM wParam,LPARAM lParam); +INT_PTR MyBlogStatus(WPARAM wParam,LPARAM lParam); +INT_PTR MyVideo(WPARAM wParam,LPARAM lParam); +INT_PTR MyAnswers(WPARAM wParam,LPARAM lParam); +INT_PTR MyWorld(WPARAM wParam,LPARAM lParam); +INT_PTR MraZhuki(WPARAM wParam,LPARAM lParam); +INT_PTR MraChat(WPARAM wParam,LPARAM lParam); +INT_PTR MraWebSearch(WPARAM wParam,LPARAM lParam); +INT_PTR MraUpdateAllUsersInfo(WPARAM wParam,LPARAM lParam); +INT_PTR MraCheckUpdatesUsersAvt(WPARAM wParam,LPARAM lParam); +INT_PTR MraRequestAuthForAll(WPARAM wParam,LPARAM lParam); + +static const GUI_DISPLAY_ITEM gdiMenuItems[] = +{ + { MRA_GOTO_INBOX, MRA_GOTO_INBOX_STR, IDI_INBOX, MraGotoInbox }, + { MRA_SHOW_INBOX_STATUS, MRA_SHOW_INBOX_STATUS_STR, IDI_MAIL_NOTIFY, MraShowInboxStatus }, + { MRA_EDIT_PROFILE, MRA_EDIT_PROFILE_STR, IDI_PROFILE, MraEditProfile }, + { MRA_MY_ALBUM, MRA_MY_ALBUM_STR, IDI_MRA_PHOTO, MyAlbum }, + { MRA_MY_BLOG, MRA_MY_BLOG_STR, IDI_MRA_BLOGS, MyBlog }, + { MRA_MY_BLOGSTATUS, MRA_MY_BLOGSTATUS_STR, IDI_BLOGSTATUS, MyBlogStatus }, + { MRA_MY_VIDEO, MRA_MY_VIDEO_STR, IDI_MRA_VIDEO, MyVideo }, + { MRA_MY_ANSWERS, MRA_MY_ANSWERS_STR, IDI_MRA_ANSWERS, MyAnswers }, + { MRA_MY_WORLD, MRA_MY_WORLD_STR, IDI_MRA_WORLD, MyWorld }, + { MRA_ZHUKI, MRA_ZHUKI_STR, IDI_MRA_ZHUKI, MraZhuki }, + { MRA_CHAT, MRA_CHAT_STR, IDI_MRA_CHAT, MraChat }, + { MRA_WEB_SEARCH, MRA_WEB_SEARCH_STR, IDI_MRA_WEB_SEARCH, MraWebSearch }, + { MRA_UPD_ALL_USERS_INFO, MRA_UPD_ALL_USERS_INFO_STR, IDI_PROFILE, MraUpdateAllUsersInfo }, + { MRA_CHK_UPDATES_USERS_AVATARS, MRA_CHK_UPDATES_USERS_AVATARS_STR, IDI_PROFILE, MraCheckUpdatesUsersAvt }, + { MRA_REQ_AUTH_FOR_ALL, MRA_REQ_AUTH_FOR_ALL_STR, IDI_AUTHRUGUEST, MraRequestAuthForAll } +}; + + + +INT_PTR MraRequestAuthorization(WPARAM wParam,LPARAM lParam); +INT_PTR MraGrantAuthorization(WPARAM wParam,LPARAM lParam); +INT_PTR MraSendPostcard(WPARAM wParam,LPARAM lParam); +INT_PTR MraViewAlbum(WPARAM wParam,LPARAM lParam); +INT_PTR MraReadBlog(WPARAM wParam,LPARAM lParam); +INT_PTR MraReplyBlogStatus(WPARAM wParam,LPARAM lParam); +INT_PTR MraViewVideo(WPARAM wParam,LPARAM lParam); +INT_PTR MraAnswers(WPARAM wParam,LPARAM lParam); +INT_PTR MraWorld(WPARAM wParam,LPARAM lParam); + +static const GUI_DISPLAY_ITEM gdiContactMenuItems[] = +{ + { MRA_REQ_AUTH, MRA_REQ_AUTH_STR, IDI_AUTHRUGUEST, MraRequestAuthorization }, + { MRA_GRANT_AUTH, MRA_GRANT_AUTH_STR, IDI_AUTHGRANT, MraGrantAuthorization }, + { MRA_SEND_POSTCARD, MRA_SEND_POSTCARD_STR, IDI_MRA_POSTCARD, MraSendPostcard }, + { MRA_VIEW_ALBUM, MRA_VIEW_ALBUM_STR, IDI_MRA_PHOTO, MraViewAlbum }, + { MRA_READ_BLOG, MRA_READ_BLOG_STR, IDI_MRA_BLOGS, MraReadBlog }, + { MRA_REPLY_BLOG_STATUS,MRA_REPLY_BLOG_STATUS_STR,IDI_BLOGSTATUS, MraReplyBlogStatus }, + { MRA_VIEW_VIDEO, MRA_VIEW_VIDEO_STR, IDI_MRA_VIDEO, MraViewVideo }, + { MRA_ANSWERS, MRA_ANSWERS_STR, IDI_MRA_ANSWERS, MraAnswers }, + { MRA_WORLD, MRA_WORLD_STR, IDI_MRA_WORLD, MraWorld }, + { MRA_SEND_NUDGE, MRA_SENDNUDGE_STR, IDI_MRA_ALARM, NULL } +}; + + + + + + + +static const LPSTR lpcszStatusUri[]= +{ + "",// offline // "status_0", + "STATUS_ONLINE",// "status_1", + "STATUS_AWAY", // "status_2", + "STATUS_INVISIBLE",// "status_3", + "status_dnd", + "status_chat", + "status_4", + "status_5", + "status_6", + "status_7", + "status_8", + "status_9", + "status_10", + "status_11", + "status_12", + "status_13", + "status_14", + "status_15", + "status_16", + "status_17", + "status_18", + "status_19", + "status_20", + "status_21", + "status_22", + "status_23", + "status_24", + //"status_25", // chat/dnd + "status_26", + "status_27", + "status_28", + "status_29", + "status_30", + //"status_31", // chat/dnd + "status_32", + "status_33", + "status_34", + "status_35", + "status_36", + "status_37", + "status_38", + "status_39", + "status_40", + "status_41", + "status_42", + "status_43", + "status_44", + "status_45", + "status_46", + "status_47", + "status_48", + "status_49", + "status_50", + "status_51", + "status_52", + "status_53", + "status_dating", + //"status_127",145,154 + NULL +}; + +static const LPWSTR lpcszXStatusNameDef[]= +{ + L"None", + L"Sick", + L"Home", + L"Eating", + L"Compass", + L"On WC", + L"Cooking", + L"Walking", + L"Alien", + L"Shrimp", + L"Got lost", + L"Crazy", + L"Duck", + L"Playing", + L"Smoking", + L"Office", + L"Meeting", + L"Beer", + L"Coffee", + L"Working", + L"Relaxing", + L"On the phone", + L"In institute", + L"At school", + L"Wrong number", + L"Laughing", + L"Malicious", + L"Imp", + L"Blind", + L"Disappointed", + L"Almost crying", + L"Fearful", + L"Angry", + L"Vampire", + L"Ass", + L"Love", + L"Sleeping", + L"Cool!", + L"Peace!", + L"Cock a snook", + L"Get out", + L"Death", + L"Rocket", + L"Devil-fish", + L"Heavy metal", + L"Things look bad", + L"Squirrel", + L"Star", + L"Music", + L"Dating", + NULL +}; + +#define MRA_XSTATUS_MENU "/menuXStatus" +#define MRA_XSTATUS_COUNT 50 +#define MRA_MIR_XSTATUS_NONE 0 +#define MRA_MIR_XSTATUS_UNKNOWN MRA_XSTATUS_COUNT + +#define MRA_XSTATUS_OFFLINE 0 +#define MRA_XSTATUS_ONLINE 1 +#define MRA_XSTATUS_AWAY 2 +#define MRA_XSTATUS_INVISIBLE 3 +#define MRA_XSTATUS_DND 4 +#define MRA_XSTATUS_CHAT 5 +#define MRA_XSTATUS_UNKNOWN 55 + +#define MRA_XSTATUS_INDEX_OFFSET 6 + + + +#endif // !defined(AFX_MRA_CONSTANS_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/MRA/MraFilesQueue.cpp b/MRA/MraFilesQueue.cpp new file mode 100644 index 0000000..3dd2055 --- /dev/null +++ b/MRA/MraFilesQueue.cpp @@ -0,0 +1,1443 @@ +#include "Mra.h" +#include "MraFilesQueue.h" +#include "proto.h" + + + + +#define MRA_FT_HELLO "MRA_FT_HELLO" +#define MRA_FT_GET_FILE "MRA_FT_GET_FILE" + + + +typedef struct +{ + LIST_MT lmtListMT; + DWORD dwSendTimeOutInterval; +} MRA_FILES_QUEUE; + + + +struct MRA_FILES_QUEUE_FILE +{ + LPWSTR lpwszName; + SIZE_T dwNameLen; + DWORDLONG dwSize; +}; + + + + +typedef struct +{ + // internal + LIST_MT_ITEM lmtListMTItem; + BOOL bIsWorking; + DWORD dwSendTime; + // external + DWORD dwIDRequest; + DWORD dwFlags; + HANDLE hContact; + DWORDLONG dwFilesCount; + DWORDLONG dwFilesTotalSize; + MRA_FILES_QUEUE_FILE *pmfqfFiles; + LPWSTR pwszFilesList; + LPWSTR pwszDescription; + MRA_ADDR_LIST malAddrList; + LPWSTR lpwszPath; + SIZE_T dwPathSize; + BOOL bSending; + HANDLE hConnection; + HANDLE hListen; + HANDLE hThread; + HANDLE hWaitHandle; + HANDLE hMraMrimProxyData; + +} MRA_FILES_QUEUE_ITEM; + + + +struct MRA_FILES_THREADPROC_PARAMS +{ + HANDLE hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; +}; + + + +//#define MEMALLOC(Size) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(Size+sizeof(SIZE_T))) +//#define MEMREALLOC(Mem,Size) HeapReAlloc(GetProcessHeap(),(HEAP_ZERO_MEMORY),(LPVOID)Mem,(Size+sizeof(SIZE_T))) +//#define MEMFREE(Mem) if (Mem) {HeapFree(GetProcessHeap(),0,(LPVOID)Mem);Mem=NULL;} + + +DWORD MraFilesQueueItemFindByID (HANDLE hFilesQueueHandle,DWORD dwIDRequest,MRA_FILES_QUEUE_ITEM **ppmrafqFilesQueueItem); +//DWORD MraFilesQueueItemFindByEMail (HANDLE hFilesQueueHandle,LPSTR lpszEMail,SIZE_T dwEMailSize,MRA_FILES_QUEUE_ITEM **ppmrafqFilesQueueItem); +void MraFilesQueueItemFree (MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem); +SIZE_T MraFilesQueueGetLocalAddressesList (LPSTR lpszBuff,SIZE_T dwBuffSize,DWORD dwPort); + +BOOL MraFilesQueueHandCheck (HANDLE hConnection,MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem); +void MraFilesQueueConnectionReceived (HANDLE hNewConnection,DWORD dwRemoteIP,void *pExtra); + +void MraFilesQueueRecvThreadProc (LPVOID lpParameter); +void MraFilesQueueSendThreadProc (LPVOID lpParameter); + + + +void MraFilesQueueDlgEnableDirectConsControls(HWND hWndDlg,BOOL bEnabled) +{ + WORD wMraFilesControlsList[]={ + IDC_FILE_SEND_NOOUTCONNECTIONONRECEIVE, + IDC_FILE_SEND_NOOUTCONNECTIONONSEND, + IDC_FILE_SEND_IGNORYADDITIONALPORTS, + IDC_FILE_SEND_HIDE_MY_ADDRESSES, + IDC_FILE_SEND_ADD_EXTRA_ADDRESS, + IDC_FILE_SEND_EXTRA_ADDRESS + }; + EnableControlsArray(hWndDlg,(WORD*)&wMraFilesControlsList,SIZEOF(wMraFilesControlsList),bEnabled); + EnableWindow(GetDlgItem(hWndDlg,IDC_FILE_SEND_EXTRA_ADDRESS),(bEnabled && IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_FILE_SEND_ADD_EXTRA_ADDRESS))); +} + +INT_PTR CALLBACK MraFilesQueueDlgProcOpts(HWND hWndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg){ + case WM_INITDIALOG: + { + WCHAR szBuff[MAX_PATH]; + + TranslateDialogDefault(hWndDlg); + + CHECK_DLG_BUTTON(hWndDlg,IDC_FILE_SEND_ENABLE_DIRECT_CONN,DB_Mra_GetByte(NULL,"FileSendEnableDirectConn",MRA_DEF_FS_ENABLE_DIRECT_CONN)); + CHECK_DLG_BUTTON(hWndDlg,IDC_FILE_SEND_NOOUTCONNECTIONONRECEIVE,DB_Mra_GetByte(NULL,"FileSendNoOutConnOnRcv",MRA_DEF_FS_NO_OUT_CONN_ON_RCV)); + CHECK_DLG_BUTTON(hWndDlg,IDC_FILE_SEND_NOOUTCONNECTIONONSEND,DB_Mra_GetByte(NULL,"FileSendNoOutConnOnSend",MRA_DEF_FS_NO_OUT_CONN_ON_SEND)); + CHECK_DLG_BUTTON(hWndDlg,IDC_FILE_SEND_IGNORYADDITIONALPORTS,DB_Mra_GetByte(NULL,"FileSendIgnoryAdditionalPorts",MRA_DEF_FS_IGNORY_ADDITIONAL_PORTS)); + CHECK_DLG_BUTTON(hWndDlg,IDC_FILE_SEND_HIDE_MY_ADDRESSES,DB_Mra_GetByte(NULL,"FileSendHideMyAddresses",MRA_DEF_FS_HIDE_MY_ADDRESSES)); + CHECK_DLG_BUTTON(hWndDlg,IDC_FILE_SEND_ADD_EXTRA_ADDRESS,DB_Mra_GetByte(NULL,"FileSendAddExtraAddresses",MRA_DEF_FS_ADD_EXTRA_ADDRESSES)); + if (DB_Mra_GetStaticStringW(NULL,"FileSendExtraAddresses",szBuff,SIZEOF(szBuff),NULL)) + { + SET_DLG_ITEM_TEXT(hWndDlg,IDC_FILE_SEND_EXTRA_ADDRESS,szBuff); + } + + CHECK_DLG_BUTTON(hWndDlg,IDC_FILE_SEND_ENABLE_MRIMPROXY_CONS,DB_Mra_GetByte(NULL,"FileSendEnableMRIMProxyCons",MRA_DEF_FS_ENABLE_MRIM_PROXY_CONS)); + + SetDlgItemInt(hWndDlg,IDC_FILE_SEND_BLOCK_SIZE,DB_Mra_GetDword(NULL,"FileSendBlockSize",MRA_DEFAULT_FILE_SEND_BLOCK_SIZE),FALSE); + + MraFilesQueueDlgEnableDirectConsControls(hWndDlg,IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_FILE_SEND_ENABLE_DIRECT_CONN)); + } + return(TRUE); + case WM_COMMAND: + if (LOWORD(wParam)==IDC_FILE_SEND_ENABLE_DIRECT_CONN) + { + MraFilesQueueDlgEnableDirectConsControls(hWndDlg,IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_FILE_SEND_ENABLE_DIRECT_CONN)); + } + + if (LOWORD(wParam)==IDC_FILE_SEND_ADD_EXTRA_ADDRESS) + { + EnableWindow(GetDlgItem(hWndDlg,IDC_FILE_SEND_EXTRA_ADDRESS),IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_FILE_SEND_ADD_EXTRA_ADDRESS)); + } + + if ((LOWORD(wParam)==IDC_FILE_SEND_EXTRA_ADDRESS || LOWORD(wParam)==IDC_FILE_SEND_BLOCK_SIZE) && (HIWORD(wParam)!=EN_CHANGE || (HWND)lParam!=GetFocus()) ) return(FALSE); + SendMessage(GetParent(hWndDlg),PSM_CHANGED,0,0); + break; + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->code){ + case PSN_APPLY: + { + WCHAR szBuff[MAX_PATH]; + + DB_Mra_SetByte(NULL,"FileSendEnableDirectConn",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_FILE_SEND_ENABLE_DIRECT_CONN)); + DB_Mra_SetByte(NULL,"FileSendNoOutConnOnRcv",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_FILE_SEND_NOOUTCONNECTIONONRECEIVE)); + DB_Mra_SetByte(NULL,"FileSendNoOutConnOnSend",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_FILE_SEND_NOOUTCONNECTIONONSEND)); + DB_Mra_SetByte(NULL,"FileSendIgnoryAdditionalPorts",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_FILE_SEND_IGNORYADDITIONALPORTS)); + DB_Mra_SetByte(NULL,"FileSendHideMyAddresses",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_FILE_SEND_HIDE_MY_ADDRESSES)); + DB_Mra_SetByte(NULL,"FileSendAddExtraAddresses",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_FILE_SEND_ADD_EXTRA_ADDRESS)); + GET_DLG_ITEM_TEXT(hWndDlg,IDC_FILE_SEND_EXTRA_ADDRESS,szBuff,SIZEOF(szBuff)); + DB_Mra_SetStringW(NULL,"FileSendExtraAddresses",szBuff); + DB_Mra_SetDword(NULL,"FileSendBlockSize",(DWORD)GetDlgItemInt(hWndDlg,IDC_FILE_SEND_BLOCK_SIZE,NULL,FALSE)); + DB_Mra_SetByte(NULL,"FileSendEnableMRIMProxyCons",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_FILE_SEND_ENABLE_MRIMPROXY_CONS)); + } + return(TRUE); + } + break; + } +return(FALSE); +} + + + +DWORD MraFilesQueueInitialize(DWORD dwSendTimeOutInterval,HANDLE *phFilesQueueHandle) +{ + DWORD dwRetErrorCode; + + if (phFilesQueueHandle) + { + MRA_FILES_QUEUE *pmrafqFilesQueue; + + pmrafqFilesQueue=(MRA_FILES_QUEUE*)MEMALLOC(sizeof(MRA_FILES_QUEUE)); + if (pmrafqFilesQueue) + { + dwRetErrorCode=ListMTInitialize(&pmrafqFilesQueue->lmtListMT,0); + if (dwRetErrorCode==NO_ERROR) + { + pmrafqFilesQueue->dwSendTimeOutInterval=dwSendTimeOutInterval; + (*phFilesQueueHandle)=(HANDLE)pmrafqFilesQueue; + }else{ + MEMFREE(pmrafqFilesQueue); + } + }else{ + dwRetErrorCode=GetLastError(); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +void MraFilesQueueDestroy(HANDLE hFilesQueueHandle) +{ + if (hFilesQueueHandle) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + while(ListMTItemGetFirst(&pmrafqFilesQueue->lmtListMT,NULL,(LPVOID*)&pmrafqFilesQueueItem)==NO_ERROR) + { + MraFilesQueueItemFree(pmrafqFilesQueueItem); + } + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + + ListMTDestroy(&pmrafqFilesQueue->lmtListMT); + MEMFREE(pmrafqFilesQueue); + } +} + + +DWORD MraFilesQueueItemFindByID(HANDLE hFilesQueueHandle,DWORD dwIDRequest,MRA_FILES_QUEUE_ITEM **ppmrafqFilesQueueItem) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + LIST_MT_ITERATOR lmtiIterator; + + dwRetErrorCode=ERROR_NOT_FOUND; + ListMTLock(&pmrafqFilesQueue->lmtListMT); + ListMTIteratorMoveFirst(&pmrafqFilesQueue->lmtListMT,&lmtiIterator); + do + {// цикл + if (ListMTIteratorGet(&lmtiIterator,NULL,(LPVOID*)&pmrafqFilesQueueItem)==NO_ERROR) + if (pmrafqFilesQueueItem->dwIDRequest==dwIDRequest) + { + if (ppmrafqFilesQueueItem) (*ppmrafqFilesQueueItem)=pmrafqFilesQueueItem; + dwRetErrorCode=NO_ERROR; + break; + } + }while(ListMTIteratorMoveNext(&lmtiIterator)); + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +HANDLE MraFilesQueueItemProxyByID(HANDLE hFilesQueueHandle,DWORD dwIDRequest) +{ + HANDLE hRet=NULL; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + + if (MraFilesQueueItemFindByID(hFilesQueueHandle,dwIDRequest,&pmrafqFilesQueueItem)==NO_ERROR) + { + hRet=pmrafqFilesQueueItem->hMraMrimProxyData; + } +return(hRet); +} + + +/*DWORD MraFilesQueueItemFindByEMail(HANDLE hFilesQueueHandle,LPSTR lpszEMail,SIZE_T dwEMailSize,MRA_FILES_QUEUE_ITEM **ppmrafqFilesQueueItem) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle) + { + CHAR szEMailLocal[MAX_EMAIL_LEN]; + SIZE_T dwEMailLocalSize; + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + LIST_MT_ITERATOR lmtiIterator; + + dwRetErrorCode=ERROR_NOT_FOUND; + ListMTLock(&pmrafqFilesQueue->lmtListMT); + ListMTIteratorMoveFirst(&pmrafqFilesQueue->lmtListMT,&lmtiIterator); + do + {// цикл + if (ListMTIteratorGet(&lmtiIterator,NULL,(LPVOID*)&pmrafqFilesQueueItem)==NO_ERROR) + if (DB_Mra_GetStaticStringA(pmrafqFilesQueueItem->hContact,"e-mail",szEMailLocal,SIZEOF(szEMailLocal),&dwEMailLocalSize)) + if (dwEMailSize==dwEMailLocalSize) + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpszEMail,dwEMailSize,szEMailLocal,dwEMailLocalSize)==CSTR_EQUAL) + { + if (ppmrafqFilesQueueItem) (*ppmrafqFilesQueueItem)=pmrafqFilesQueueItem; + dwRetErrorCode=NO_ERROR; + break; + } + }while(ListMTIteratorMoveNext(&lmtiIterator)); + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +}*/ + + +void MraFilesQueueItemFree(MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem) +{ + LIST_MT *plmtListMT=(LIST_MT*)pmrafqFilesQueueItem->lmtListMTItem.lpListMT; + + for(SIZE_T i=0;idwFilesCount;i++) + { + MEMFREE(pmrafqFilesQueueItem->pmfqfFiles[i].lpwszName); + } + MEMFREE(pmrafqFilesQueueItem->pmfqfFiles); + MEMFREE(pmrafqFilesQueueItem->pwszFilesList); + MEMFREE(pmrafqFilesQueueItem->pwszDescription); + MraAddrListFree(&pmrafqFilesQueueItem->malAddrList); + MraMrimProxyFree(pmrafqFilesQueueItem->hMraMrimProxyData); + MEMFREE(pmrafqFilesQueueItem->lpwszPath); + ListMTLock(plmtListMT); + ListMTItemDelete(plmtListMT,&pmrafqFilesQueueItem->lmtListMTItem); + ListMTUnLock(plmtListMT); + MEMFREE(pmrafqFilesQueueItem); +} + + + + + +SIZE_T MraFilesQueueGetLocalAddressesList(LPSTR lpszBuff,SIZE_T dwBuffSize,DWORD dwPort) +{ + CHAR szHostName[MAX_PATH]={0}; + LPSTR lpszCurPos=lpszBuff; + + if (DB_Mra_GetByte(NULL,"FileSendHideMyAddresses",MRA_DEF_FS_HIDE_MY_ADDRESSES)) + {// не выдаём врагу наш IP адрес!!! :) + if (DB_Mra_GetByte(NULL,"FileSendAddExtraAddresses",MRA_DEF_FS_ADD_EXTRA_ADDRESSES)==FALSE) + {// только если не добавляем адрес роутера + lpszCurPos+=mir_snprintf(lpszCurPos,(dwBuffSize-((SIZE_T)lpszCurPos-(SIZE_T)lpszBuff)),MRA_FILES_NULL_ADDRR); + } + }else{// создаём список наших IP адресов + BYTE btAddress[32]; + DWORD dwSelfExternalIP; + SIZE_T dwAdapter=0; + hostent *sh; + + dwSelfExternalIP=NTOHL(DB_Mra_GetDword(NULL,"IP",0)); + if (dwSelfExternalIP) + { + memmove(&btAddress,&dwSelfExternalIP,sizeof(DWORD)); + lpszCurPos+=mir_snprintf(lpszCurPos,(dwBuffSize-((SIZE_T)lpszCurPos-(SIZE_T)lpszBuff)),"%lu.%lu.%lu.%lu:%lu;",btAddress[0],btAddress[1],btAddress[2],btAddress[3],dwPort); + } + + if (gethostname(szHostName,SIZEOF(szHostName))==0) + if ((sh=gethostbyname((LPSTR)&szHostName))) + { + while(sh->h_addr_list[dwAdapter]) + { + lpszCurPos+=mir_snprintf(lpszCurPos,(dwBuffSize-((SIZE_T)lpszCurPos-(SIZE_T)lpszBuff)),"%s:%lu;",inet_ntoa(*((struct in_addr*)sh->h_addr_list[dwAdapter])),dwPort); + dwAdapter++; + } + } + } + + if (DB_Mra_GetByte(NULL,"FileSendAddExtraAddresses",MRA_DEF_FS_ADD_EXTRA_ADDRESSES))// добавляем произвольный адрес + if (DB_Mra_GetStaticStringA(NULL,"FileSendExtraAddresses",szHostName,SIZEOF(szHostName),NULL)) + { + lpszCurPos+=mir_snprintf(lpszCurPos,(dwBuffSize-((SIZE_T)lpszCurPos-(SIZE_T)lpszBuff)),"%s:%lu;",szHostName,dwPort); + } +return((lpszCurPos-lpszBuff)); +} + + + + +DWORD MraFilesQueueAddReceive(HANDLE hFilesQueueHandle,DWORD dwFlags,HANDLE hContact,DWORD dwIDRequest,LPWSTR lpwszFiles,SIZE_T dwFilesSize,LPSTR lpszAddreses,SIZE_T dwAddresesSize) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle && dwIDRequest) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + + pmrafqFilesQueueItem=(MRA_FILES_QUEUE_ITEM*)MEMALLOC(sizeof(MRA_FILES_QUEUE_ITEM)+sizeof(LPSTR)+64); + if (pmrafqFilesQueueItem) + { + WCHAR szBuff[MAX_PATH]; + LPWSTR lpwszCurrentItem,lpwszDelimiter,lpwszEndItem; + SIZE_T dwMemSize,dwAllocatedCount,dwFileNameTotalSize; + CCSDATA ccs; + PROTORECVFILET prf; + + //pmrafqFilesQueueItem->lmtListMTItem; + pmrafqFilesQueueItem->bIsWorking=TRUE; + pmrafqFilesQueueItem->dwSendTime=GetTickCount(); + pmrafqFilesQueueItem->dwIDRequest=dwIDRequest; + pmrafqFilesQueueItem->dwFlags=dwFlags; + pmrafqFilesQueueItem->hContact=hContact; + if (DB_Mra_GetByte(NULL,"FileSendEnableMRIMProxyCons",MRA_DEF_FS_ENABLE_MRIM_PROXY_CONS)) pmrafqFilesQueueItem->hMraMrimProxyData=MraMrimProxyCreate(); + + + dwFileNameTotalSize=0; + dwAllocatedCount=ALLOCATED_COUNT; + pmrafqFilesQueueItem->dwFilesCount=0; + pmrafqFilesQueueItem->dwFilesTotalSize=0; + pmrafqFilesQueueItem->pmfqfFiles=(MRA_FILES_QUEUE_FILE*)MEMALLOC((sizeof(MRA_FILES_QUEUE_FILE)*dwAllocatedCount)); + lpwszCurrentItem=lpwszFiles; + while(TRUE) + { + lpwszDelimiter=(LPWSTR)MemoryFind(((SIZE_T)lpwszCurrentItem-(SIZE_T)lpwszFiles),lpwszFiles,(dwFilesSize*sizeof(WCHAR)),";",2); + if (lpwszDelimiter) + { + lpwszEndItem=(LPWSTR)MemoryFind((((SIZE_T)lpwszDelimiter+2)-(SIZE_T)lpwszFiles),lpwszFiles,(dwFilesSize*sizeof(WCHAR)),";",2); + if (lpwszEndItem) + { + if (pmrafqFilesQueueItem->dwFilesCount==dwAllocatedCount) + { + dwAllocatedCount*=2; + pmrafqFilesQueueItem->pmfqfFiles=(MRA_FILES_QUEUE_FILE*)MEMREALLOC(pmrafqFilesQueueItem->pmfqfFiles,(sizeof(MRA_FILES_QUEUE_FILE)*dwAllocatedCount)); + } + + dwMemSize=((SIZE_T)lpwszDelimiter-(SIZE_T)lpwszCurrentItem); + pmrafqFilesQueueItem->pmfqfFiles[pmrafqFilesQueueItem->dwFilesCount].lpwszName=(LPWSTR)MEMALLOC(dwMemSize); + memmove(pmrafqFilesQueueItem->pmfqfFiles[pmrafqFilesQueueItem->dwFilesCount].lpwszName,lpwszCurrentItem,dwMemSize); + pmrafqFilesQueueItem->pmfqfFiles[pmrafqFilesQueueItem->dwFilesCount].dwSize=StrToUNum64((LPSTR)((SIZE_T)lpwszDelimiter+1),((SIZE_T)lpwszEndItem-((SIZE_T)lpwszDelimiter+1))); + pmrafqFilesQueueItem->dwFilesTotalSize+=pmrafqFilesQueueItem->pmfqfFiles[pmrafqFilesQueueItem->dwFilesCount].dwSize; + pmrafqFilesQueueItem->pmfqfFiles[pmrafqFilesQueueItem->dwFilesCount].dwNameLen=(dwMemSize/sizeof(WCHAR)); + dwFileNameTotalSize+=dwMemSize; + + pmrafqFilesQueueItem->dwFilesCount++; + lpwszCurrentItem=(lpwszEndItem+1); + }else{ + break; + } + }else{ + break; + } + } + pmrafqFilesQueueItem->pmfqfFiles=(MRA_FILES_QUEUE_FILE*)MEMREALLOC(pmrafqFilesQueueItem->pmfqfFiles,(sizeof(MRA_FILES_QUEUE_FILE)*(pmrafqFilesQueueItem->dwFilesCount+4))); + + dwMemSize=(((pmrafqFilesQueueItem->dwFilesCount+4)*64)+(dwFileNameTotalSize*sizeof(WCHAR))+(dwAddresesSize*sizeof(WCHAR))+128); + pmrafqFilesQueueItem->pwszFilesList=(LPWSTR)MEMALLOC(dwMemSize); + pmrafqFilesQueueItem->pwszDescription=(LPWSTR)MEMALLOC(dwMemSize); + + + lpwszDelimiter=pmrafqFilesQueueItem->pwszFilesList; + lpwszCurrentItem=pmrafqFilesQueueItem->pwszDescription; + StrFormatByteSizeW(pmrafqFilesQueueItem->dwFilesTotalSize,szBuff,SIZEOF(szBuff)); + lpwszCurrentItem+=mir_sntprintf(lpwszCurrentItem,((dwMemSize-((SIZE_T)lpwszCurrentItem-(SIZE_T)pmrafqFilesQueueItem->pwszDescription))/sizeof(WCHAR)),L"%I64u Files (%s)\r\n",pmrafqFilesQueueItem->dwFilesCount,szBuff); + + // description + filesnames + for(SIZE_T i=0;idwFilesCount;i++) + { + lpwszDelimiter+=mir_sntprintf(lpwszDelimiter,((dwMemSize-((SIZE_T)lpwszDelimiter-(SIZE_T)pmrafqFilesQueueItem->pwszFilesList))/sizeof(WCHAR)),L"%s; ",pmrafqFilesQueueItem->pmfqfFiles[i].lpwszName); + StrFormatByteSizeW(pmrafqFilesQueueItem->pmfqfFiles[i].dwSize,szBuff,SIZEOF(szBuff)); + lpwszCurrentItem+=mir_sntprintf(lpwszCurrentItem,((dwMemSize-((SIZE_T)lpwszCurrentItem-(SIZE_T)pmrafqFilesQueueItem->pwszDescription))/sizeof(WCHAR)),L"%s - %s\r\n",pmrafqFilesQueueItem->pmfqfFiles[i].lpwszName,szBuff); + } + + lpwszCurrentItem+=MultiByteToWideChar(MRA_CODE_PAGE,0,lpszAddreses,dwAddresesSize,lpwszCurrentItem,((dwMemSize-((SIZE_T)lpwszCurrentItem-(SIZE_T)pmrafqFilesQueueItem->pwszDescription))/sizeof(WCHAR))); + (*lpwszCurrentItem)=0; + //lpwszCurrentItem++; + + + MraAddrListGetFromBuff(lpszAddreses,dwAddresesSize,&pmrafqFilesQueueItem->malAddrList); + MraAddrListStoreToContact(pmrafqFilesQueueItem->hContact,&pmrafqFilesQueueItem->malAddrList); + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + ListMTItemAdd(&pmrafqFilesQueue->lmtListMT,&pmrafqFilesQueueItem->lmtListMTItem,pmrafqFilesQueueItem); + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + + + // Send chain event + + ccs.szProtoService=PSR_FILE; + ccs.hContact=hContact; + ccs.wParam=0; + ccs.lParam=(LPARAM)&prf; + prf.flags=PREF_UNICODE; + prf.timestamp=_time32(NULL); + prf.tszDescription=pmrafqFilesQueueItem->pwszDescription; + prf.fileCount=1;//pmrafqFilesQueueItem->dwFilesCount; + prf.ptszFiles=&pmrafqFilesQueueItem->pwszFilesList; + prf.lParam=dwIDRequest; + + CallService(MS_PROTO_CHAINRECV,0,(LPARAM)&ccs); + + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=GetLastError(); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + + +DWORD MraFilesQueueAddSend(HANDLE hFilesQueueHandle,DWORD dwFlags,HANDLE hContact,LPWSTR *plpwszFiles,SIZE_T dwFilesCount,DWORD *pdwIDRequest) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + + + pmrafqFilesQueueItem=(MRA_FILES_QUEUE_ITEM*)MEMALLOC(sizeof(MRA_FILES_QUEUE_ITEM)+sizeof(LPSTR)+64); + if (pmrafqFilesQueueItem) + { + SIZE_T i; + ULARGE_INTEGER uliFileSize; + WIN32_FILE_ATTRIBUTE_DATA wfad; + + //pmrafqFilesQueueItem->lmtListMTItem; + pmrafqFilesQueueItem->bIsWorking=TRUE; + pmrafqFilesQueueItem->dwSendTime=GetTickCount(); + pmrafqFilesQueueItem->dwIDRequest=InterlockedIncrement((LONG volatile*)&masMraSettings.dwCMDNum);// уникальный, рандомный идентификатор + pmrafqFilesQueueItem->dwFlags=dwFlags; + pmrafqFilesQueueItem->hContact=hContact; + if (DB_Mra_GetByte(NULL,"FileSendEnableMRIMProxyCons",MRA_DEF_FS_ENABLE_MRIM_PROXY_CONS)) pmrafqFilesQueueItem->hMraMrimProxyData=MraMrimProxyCreate(); + pmrafqFilesQueueItem->dwFilesCount=dwFilesCount; + pmrafqFilesQueueItem->pmfqfFiles=(MRA_FILES_QUEUE_FILE*)MEMALLOC((sizeof(MRA_FILES_QUEUE_FILE)*(pmrafqFilesQueueItem->dwFilesCount+1))); + pmrafqFilesQueueItem->dwFilesTotalSize=0; + + for(i=0;idwFilesCount;i++) + { + if (GetFileAttributesExW(plpwszFiles[i],GetFileExInfoStandard,&wfad)) + { + uliFileSize.LowPart=wfad.nFileSizeLow; + uliFileSize.HighPart=wfad.nFileSizeHigh; + pmrafqFilesQueueItem->pmfqfFiles[i].dwSize=uliFileSize.QuadPart; + pmrafqFilesQueueItem->dwFilesTotalSize+=uliFileSize.QuadPart; + }else{ + pmrafqFilesQueueItem->pmfqfFiles[i].dwSize=0; + } + pmrafqFilesQueueItem->pmfqfFiles[i].dwNameLen=lstrlenW(plpwszFiles[i]); + pmrafqFilesQueueItem->pmfqfFiles[i].lpwszName=(LPWSTR)MEMALLOC((pmrafqFilesQueueItem->pmfqfFiles[i].dwNameLen*sizeof(WCHAR))); + if (pmrafqFilesQueueItem->pmfqfFiles[i].lpwszName) + { + memmove(pmrafqFilesQueueItem->pmfqfFiles[i].lpwszName,plpwszFiles[i],(pmrafqFilesQueueItem->pmfqfFiles[i].dwNameLen*sizeof(WCHAR))); + } + } + //pmrafqFilesQueueItem->malAddrList.dwAddrCount=0; + //pmrafqFilesQueueItem->pmfqaAddreses=NULL; + pmrafqFilesQueueItem->bSending=TRUE; + if (pdwIDRequest) (*pdwIDRequest)=pmrafqFilesQueueItem->dwIDRequest; + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + ListMTItemAdd(&pmrafqFilesQueue->lmtListMT,&pmrafqFilesQueueItem->lmtListMTItem,pmrafqFilesQueueItem); + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + + { + MRA_FILES_THREADPROC_PARAMS *pmftpp=(MRA_FILES_THREADPROC_PARAMS*)MEMALLOC(sizeof(MRA_FILES_THREADPROC_PARAMS)); + pmftpp->hFilesQueueHandle=hFilesQueueHandle; + pmftpp->pmrafqFilesQueueItem=pmrafqFilesQueueItem; + + pmrafqFilesQueueItem->hThread=(HANDLE)mir_forkthread((pThreadFunc)MraFilesQueueSendThreadProc,pmftpp); + } + + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=GetLastError(); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + + +DWORD MraFilesQueueAccept(HANDLE hFilesQueueHandle,DWORD dwIDRequest,LPWSTR lpwszPath,SIZE_T dwPathSize) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle && lpwszPath && dwPathSize) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + if ((dwRetErrorCode=MraFilesQueueItemFindByID(hFilesQueueHandle,dwIDRequest,&pmrafqFilesQueueItem))==NO_ERROR) + { + MRA_FILES_THREADPROC_PARAMS *pmftpp=(MRA_FILES_THREADPROC_PARAMS*)MEMALLOC(sizeof(MRA_FILES_THREADPROC_PARAMS)); + pmrafqFilesQueueItem->lpwszPath=(LPWSTR)MEMALLOC((dwPathSize*sizeof(WCHAR))); + pmrafqFilesQueueItem->dwPathSize=dwPathSize; + memmove(pmrafqFilesQueueItem->lpwszPath,lpwszPath,(dwPathSize*sizeof(WCHAR))); + + if ( (*(WCHAR*)(pmrafqFilesQueueItem->lpwszPath+(pmrafqFilesQueueItem->dwPathSize-1)))!='\\') + {// add slash at the end if needed + (*(WCHAR*)(pmrafqFilesQueueItem->lpwszPath+pmrafqFilesQueueItem->dwPathSize))='\\'; + pmrafqFilesQueueItem->dwPathSize++; + (*(WCHAR*)(pmrafqFilesQueueItem->lpwszPath+pmrafqFilesQueueItem->dwPathSize))=0; + } + + pmftpp->hFilesQueueHandle=hFilesQueueHandle; + pmftpp->pmrafqFilesQueueItem=pmrafqFilesQueueItem; + + pmrafqFilesQueueItem->hThread=(HANDLE)mir_forkthread((pThreadFunc)MraFilesQueueRecvThreadProc,pmftpp); + } + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraFilesQueueCancel(HANDLE hFilesQueueHandle,DWORD dwIDRequest,BOOL bSendDecline) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + if ((dwRetErrorCode=MraFilesQueueItemFindByID(hFilesQueueHandle,dwIDRequest,&pmrafqFilesQueueItem))==NO_ERROR) + {//***deb closesocket, send message to thread + InterlockedExchange((volatile LONG*)&pmrafqFilesQueueItem->bIsWorking,FALSE); + + if (bSendDecline) + { + CHAR szEMail[MAX_EMAIL_LEN]; + SIZE_T dwEMailSize; + + if (DB_Mra_GetStaticStringA(pmrafqFilesQueueItem->hContact,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + MraSendCommand_FileTransferAck(FILE_TRANSFER_STATUS_DECLINE,szEMail,dwEMailSize,dwIDRequest,NULL,0); + } + } + + MraMrimProxyCloseConnection(pmrafqFilesQueueItem->hMraMrimProxyData); + + Netlib_CloseHandle(pmrafqFilesQueueItem->hListen); + pmrafqFilesQueueItem->hListen=NULL; + + Netlib_CloseHandle(pmrafqFilesQueueItem->hConnection); + pmrafqFilesQueueItem->hConnection=NULL; + + SetEvent(pmrafqFilesQueueItem->hWaitHandle); + + if (pmrafqFilesQueueItem->hThread==NULL) + { + MraFilesQueueItemFree(pmrafqFilesQueueItem); + } + } + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraFilesQueueStartMrimProxy(HANDLE hFilesQueueHandle,DWORD dwIDRequest) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle && DB_Mra_GetByte(NULL,"FileSendEnableMRIMProxyCons",MRA_DEF_FS_ENABLE_MRIM_PROXY_CONS)) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + if ((dwRetErrorCode=MraFilesQueueItemFindByID(hFilesQueueHandle,dwIDRequest,&pmrafqFilesQueueItem))==NO_ERROR) + {//***deb + if (pmrafqFilesQueueItem->bSending==FALSE) + {// receiving + SetEvent(pmrafqFilesQueueItem->hWaitHandle);// cancel wait incomming connection + }else{// sending + + } + } + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraFilesQueueFree(HANDLE hFilesQueueHandle,DWORD dwIDRequest) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + LIST_MT_ITERATOR lmtiIterator; + + dwRetErrorCode=ERROR_NOT_FOUND; + ListMTLock(&pmrafqFilesQueue->lmtListMT); + ListMTIteratorMoveFirst(&pmrafqFilesQueue->lmtListMT,&lmtiIterator); + do + {// цикл + if (ListMTIteratorGet(&lmtiIterator,NULL,(LPVOID*)&pmrafqFilesQueueItem)==NO_ERROR) + if (pmrafqFilesQueueItem->dwIDRequest==dwIDRequest) + { + MraFilesQueueItemFree(pmrafqFilesQueueItem); + dwRetErrorCode=NO_ERROR; + break; + } + }while(ListMTIteratorMoveNext(&lmtiIterator)); + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraFilesQueueSendMirror(HANDLE hFilesQueueHandle,DWORD dwIDRequest,LPSTR lpszAddreses,SIZE_T dwAddresesSize) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + if ((dwRetErrorCode=MraFilesQueueItemFindByID(hFilesQueueHandle,dwIDRequest,&pmrafqFilesQueueItem))==NO_ERROR) + {// + MraAddrListGetFromBuff(lpszAddreses,dwAddresesSize,&pmrafqFilesQueueItem->malAddrList); + MraAddrListStoreToContact(pmrafqFilesQueueItem->hContact,&pmrafqFilesQueueItem->malAddrList); + + pmrafqFilesQueueItem->hConnection=NULL; + SetEvent(pmrafqFilesQueueItem->hWaitHandle); + } + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + + +BOOL MraFilesQueueHandCheck(HANDLE hConnection,MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem) +{ + BOOL bRet=FALSE; + + if (hConnection && pmrafqFilesQueueItem) + { + CHAR szEMail[MAX_EMAIL_LEN]={0},szEMailMy[MAX_EMAIL_LEN]={0}; + BYTE btBuff[((MAX_EMAIL_LEN*2)+(sizeof(MRA_FT_HELLO)*2)+8)]={0}; + SIZE_T dwEMailSize,dwEMailMySize,dwBuffSize; + + DB_Mra_GetStaticStringA(NULL,"e-mail",szEMailMy,SIZEOF(szEMailMy),&dwEMailMySize);BuffToLowerCase(szEMailMy,szEMailMy,dwEMailMySize); + DB_Mra_GetStaticStringA(pmrafqFilesQueueItem->hContact,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize);BuffToLowerCase(szEMail,szEMail,dwEMailSize); + + if (pmrafqFilesQueueItem->bSending==FALSE) + {// receiving + dwBuffSize=(mir_snprintf((LPSTR)btBuff,SIZEOF(btBuff),"%s %s",MRA_FT_HELLO,szEMailMy)+1); + if (dwBuffSize==Netlib_Send(hConnection,(LPSTR)btBuff,dwBuffSize,0)) + {// my email sended + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_INITIALISING,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + dwBuffSize=Netlib_Recv(hConnection,(LPSTR)btBuff,sizeof(btBuff),0); + if ((dwEMailSize+sizeof(MRA_FT_HELLO)+1)==dwBuffSize) + {// email received + mir_snprintf(((LPSTR)btBuff+dwBuffSize),(SIZEOF(btBuff)-dwBuffSize),"%s %s",MRA_FT_HELLO,szEMail); + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,(LPSTR)btBuff,dwBuffSize,((LPSTR)btBuff+dwBuffSize),dwBuffSize)==CSTR_EQUAL) + {// email verifyed + bRet=TRUE; + } + } + } + }else{// sending + dwBuffSize=Netlib_Recv(hConnection,(LPSTR)btBuff,sizeof(btBuff),0); + if ((dwEMailSize+sizeof(MRA_FT_HELLO)+1)==dwBuffSize) + {// email received + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_INITIALISING,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + mir_snprintf(((LPSTR)btBuff+dwBuffSize),(SIZEOF(btBuff)-dwBuffSize),"%s %s",MRA_FT_HELLO,szEMail); + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,(LPSTR)btBuff,dwBuffSize,((LPSTR)btBuff+dwBuffSize),dwBuffSize)==CSTR_EQUAL) + {// email verifyed + dwBuffSize=(mir_snprintf((LPSTR)btBuff,SIZEOF(btBuff),"%s %s",MRA_FT_HELLO,szEMailMy)+1); + if (dwBuffSize==Netlib_Send(hConnection,(LPSTR)btBuff,dwBuffSize,0)) + {// my email sended + bRet=TRUE; + } + } + } + } + } +return(bRet); +} + + +HANDLE MraFilesQueueConnectOut(MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem) +{ + HANDLE hRet; + + if (pmrafqFilesQueueItem) + { + if (DB_Mra_GetByte(NULL,"FileSendEnableDirectConn",MRA_DEF_FS_ENABLE_DIRECT_CONN) && InterlockedExchangeAdd((volatile LONG*)&pmrafqFilesQueueItem->bIsWorking,0) && ((pmrafqFilesQueueItem->bSending==FALSE && DB_Mra_GetByte(NULL,"FileSendNoOutConnOnRcv",MRA_DEF_FS_NO_OUT_CONN_ON_RCV)==FALSE) || (pmrafqFilesQueueItem->bSending==TRUE && DB_Mra_GetByte(NULL,"FileSendNoOutConnOnSend",MRA_DEF_FS_NO_OUT_CONN_ON_SEND)==FALSE))) + { + BOOL bFiltering=FALSE,bIsHTTPSProxyUsed=IsHTTPSProxyUsed(masMraSettings.hNetlibUser); + DWORD dwLocalPort,dwConnectReTryCount,dwCurConnectReTryCount; + SIZE_T i,dwAddrCount; + NETLIBOPENCONNECTION nloc={0}; + + dwLocalPort=0; + + if (DB_Mra_GetByte(NULL,"FileSendIgnoryAdditionalPorts",MRA_DEF_FS_IGNORY_ADDITIONAL_PORTS) || bIsHTTPSProxyUsed) + {// фильтруем порты для одного IP, вместо 3 будем коннектится только к одному + if (bIsHTTPSProxyUsed) + {// через https прокси только 443 порт + dwLocalPort=MRA_SERVER_PORT_HTTPS; + }else{ + if ((dwLocalPort=DB_Mra_GetWord(NULL,"ServerPort",MRA_DEFAULT_SERVER_PORT))==MRA_SERVER_PORT_STANDART_NLB) dwLocalPort=MRA_SERVER_PORT_STANDART; + } + + dwAddrCount=0; + for(i=0;imalAddrList.dwAddrCount;i++) + { + if (dwLocalPort==pmrafqFilesQueueItem->malAddrList.pmaliAddress[i].dwPort) + { + bFiltering=TRUE; + dwAddrCount++; + } + } + } + if (bFiltering==FALSE) dwAddrCount=pmrafqFilesQueueItem->malAddrList.dwAddrCount; + + if (dwAddrCount) + { + pmrafqFilesQueueItem->hConnection=NULL; + dwConnectReTryCount=DB_Mra_GetDword(NULL,"ConnectReTryCountFileSend",MRA_DEFAULT_CONN_RETRY_COUNT_FILES); + nloc.cbSize=sizeof(nloc); + nloc.flags=NLOCF_V2; + nloc.timeout=DB_Mra_GetDword(NULL,"TimeOutConnectFileSend",((MRA_TIMEOUT_DIRECT_CONN-1)/(dwAddrCount*dwConnectReTryCount)));// -1 сек чтобы был запас + if (nloc.timeoutMRA_TIMEOUT_CONN_МАХ) nloc.timeout=MRA_TIMEOUT_CONN_МАХ; + + for(i=0;imalAddrList.dwAddrCount;i++) + {// Set up the sockaddr structure + if (dwLocalPort==pmrafqFilesQueueItem->malAddrList.pmaliAddress[i].dwPort || bFiltering==FALSE) + { + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_CONNECTING,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + + nloc.szHost=inet_ntoa((*((in_addr*)&pmrafqFilesQueueItem->malAddrList.pmaliAddress[i].dwAddr))); + nloc.wPort=(WORD)pmrafqFilesQueueItem->malAddrList.pmaliAddress[i].dwPort; + + dwCurConnectReTryCount=dwConnectReTryCount; + do{ + pmrafqFilesQueueItem->hConnection=(HANDLE)CallService(MS_NETLIB_OPENCONNECTION,(WPARAM)masMraSettings.hNetlibUser,(LPARAM)&nloc); + }while(--dwCurConnectReTryCount && pmrafqFilesQueueItem->hConnection==NULL); + + if (pmrafqFilesQueueItem->hConnection) + { + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_CONNECTED,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + if (MraFilesQueueHandCheck(pmrafqFilesQueueItem->hConnection,pmrafqFilesQueueItem)) + {// связь установленная с тем кем нужно + DB_Mra_SetDword(pmrafqFilesQueueItem->hContact,"OldIP",DB_Mra_GetDword(pmrafqFilesQueueItem->hContact,"IP",0)); + DB_Mra_SetDword(pmrafqFilesQueueItem->hContact,"IP",HTONL(pmrafqFilesQueueItem->malAddrList.pmaliAddress[i].dwAddr)); + break; + }else{// кажется не туда подключились :) + Netlib_CloseHandle(pmrafqFilesQueueItem->hConnection); + pmrafqFilesQueueItem->hConnection=NULL; + } + } + } + } + } + } + hRet=pmrafqFilesQueueItem->hConnection; + }else{ + hRet=NULL; + } +return(hRet); +} + + +LPWSTR GetFileNameFromFullPathW(LPWSTR lpwszFullPath,SIZE_T dwFullPathSize) +{ + LPWSTR lpwszFileName=lpwszFullPath,lpwszCurPos; + + lpwszCurPos=(lpwszFullPath+dwFullPathSize); + for(;lpwszCurPos>lpwszFullPath;lpwszCurPos--) + { + if ((*lpwszCurPos)=='\\') + { + lpwszFileName=(lpwszCurPos+1); + break; + } + } +return(lpwszFileName); +} + + + +HANDLE MraFilesQueueConnectIn(MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem) +{ + HANDLE hRet=NULL; + + if (pmrafqFilesQueueItem) + if (InterlockedExchangeAdd((volatile LONG*)&pmrafqFilesQueueItem->bIsWorking,0)) + { + CHAR szEMail[MAX_EMAIL_LEN]; + SIZE_T dwEMailSize; + + if (DB_Mra_GetStaticStringA(pmrafqFilesQueueItem->hContact,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + CHAR szAddrList[2048]={0}; + SIZE_T dwAddrListSize; + + if (DB_Mra_GetByte(NULL,"FileSendEnableDirectConn",MRA_DEF_FS_ENABLE_DIRECT_CONN)) + {// копируем адреса в соответствии с правилами и начинаем слушать порт + NETLIBBIND nlbBind={0}; + + nlbBind.cbSize=sizeof(nlbBind); + nlbBind.pfnNewConnectionV2=MraFilesQueueConnectionReceived; + nlbBind.wPort=0; + nlbBind.pExtra=(LPVOID)pmrafqFilesQueueItem; + + pmrafqFilesQueueItem->hListen=(HANDLE)CallService(MS_NETLIB_BINDPORT,(WPARAM)masMraSettings.hNetlibUser,(LPARAM)&nlbBind); + if (pmrafqFilesQueueItem->hListen) + { + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_LISTENING,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + dwAddrListSize=MraFilesQueueGetLocalAddressesList(szAddrList,sizeof(szAddrList),nlbBind.wPort); + }else{// не смогли слушать порт, хз почему. + ShowFormatedErrorMessage(L"Files exchange: cant create listen soscket, will try connect to remonte host. Error",GetLastError()); + + //dwAddrListSize=0; + memmove(szAddrList,MRA_FILES_NULL_ADDRR,sizeof(MRA_FILES_NULL_ADDRR)); + dwAddrListSize=(sizeof(MRA_FILES_NULL_ADDRR)-1); + } + }else{// подставляем ложный адрес, чтобы точно не подключились и не слушаем порт + memmove(szAddrList,MRA_FILES_NULL_ADDRR,sizeof(MRA_FILES_NULL_ADDRR)); + dwAddrListSize=(sizeof(MRA_FILES_NULL_ADDRR)-1); + } + + if (dwAddrListSize) + { + pmrafqFilesQueueItem->hWaitHandle=CreateEvent(NULL,TRUE,FALSE,NULL); + if (pmrafqFilesQueueItem->bSending==FALSE) + {// запрашиваем зеркальное соединение, тк сами подключится не смогли + MraSendCommand_FileTransferAck(FILE_TRANSFER_MIRROR,szEMail,dwEMailSize,pmrafqFilesQueueItem->dwIDRequest,(LPBYTE)szAddrList,dwAddrListSize); + }else{// здесь отправляем запрос на передачу(установление соединения) + // создаём текстовый список файлов для отправки другой стороне + LPWSTR lpwszFiles,lpwszCurPos; + SIZE_T dwFilesSize; + + dwFilesSize=((MAX_PATH*2)*pmrafqFilesQueueItem->dwFilesCount); + lpwszFiles=(LPWSTR)MEMALLOC((dwFilesSize*sizeof(WCHAR))); + if (lpwszFiles) + { + lpwszCurPos=lpwszFiles; + for(SIZE_T i=0;idwFilesCount;i++) + { + lpwszCurPos+=mir_sntprintf(lpwszCurPos,(dwFilesSize-((SIZE_T)lpwszCurPos-(SIZE_T)lpwszFiles)),L"%s;%I64u;",GetFileNameFromFullPathW(pmrafqFilesQueueItem->pmfqfFiles[i].lpwszName,pmrafqFilesQueueItem->pmfqfFiles[i].dwNameLen),pmrafqFilesQueueItem->pmfqfFiles[i].dwSize); + } + dwFilesSize=(lpwszCurPos-lpwszFiles);// size in WCHARs + + if (pmrafqFilesQueueItem->hMraMrimProxyData) + {// устанавливаем данные для майловской прокси, если она разрешена + LPSTR lpszFiles; + SIZE_T dwFilesSizeA; + + dwFilesSizeA=WideCharToMultiByte(MRA_CODE_PAGE,0,lpwszFiles,dwFilesSize,NULL,0,NULL,NULL); + lpszFiles=(LPSTR)MEMALLOC((dwFilesSizeA+MAX_PATH)); + if (lpszFiles) + { + dwFilesSizeA=WideCharToMultiByte(MRA_CODE_PAGE,0,lpwszFiles,dwFilesSize,lpszFiles,(dwFilesSizeA+MAX_PATH),NULL,NULL); + MraMrimProxySetData(pmrafqFilesQueueItem->hMraMrimProxyData,szEMail,dwEMailSize,pmrafqFilesQueueItem->dwIDRequest,MRIM_PROXY_TYPE_FILES,lpszFiles,dwFilesSizeA,NULL,0,NULL); + MEMFREE(lpszFiles); + } + //MraMrimProxySetData(pmrafqFilesQueueItem->hMraMrimProxyData,szEMail,dwEMailSize,pmrafqFilesQueueItem->dwIDRequest,MRIM_PROXY_TYPE_FILES,(LPSTR)lpwszFiles,dwFilesSize,NULL,0,NULL); + } + MraSendCommand_FileTransfer(szEMail,dwEMailSize,pmrafqFilesQueueItem->dwIDRequest,pmrafqFilesQueueItem->dwFilesTotalSize,lpwszFiles,dwFilesSize,szAddrList,dwAddrListSize); + + MEMFREE(lpwszFiles); + } + } + WaitForSingleObjectEx(pmrafqFilesQueueItem->hWaitHandle,INFINITE,FALSE); + CloseHandle(pmrafqFilesQueueItem->hWaitHandle); + pmrafqFilesQueueItem->hWaitHandle=NULL; + } + } + hRet=pmrafqFilesQueueItem->hConnection; + } +return(hRet); +} + +// This function is called from the Netlib when someone is connecting to +// one of our incomming DC ports +void MraFilesQueueConnectionReceived(HANDLE hNewConnection,DWORD dwRemoteIP,void *pExtra) +{ + if (pExtra) + { + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem=(MRA_FILES_QUEUE_ITEM*)pExtra; + + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_CONNECTED,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + if (MraFilesQueueHandCheck(hNewConnection,pmrafqFilesQueueItem)) + {// связь установленная с тем кем нужно + pmrafqFilesQueueItem->hConnection=hNewConnection; + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_CONNECTED,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + DB_Mra_SetDword(pmrafqFilesQueueItem->hContact,"OldIP",DB_Mra_GetDword(pmrafqFilesQueueItem->hContact,"IP",0)); + DB_Mra_SetDword(pmrafqFilesQueueItem->hContact,"IP",dwRemoteIP); + SetEvent(pmrafqFilesQueueItem->hWaitHandle); + }else{// кажется кто то не туда подключилися :) + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_LISTENING,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + Netlib_CloseHandle(hNewConnection); + } + }else{ + Netlib_CloseHandle(hNewConnection); + MraPopupShowFromAgentW(MRA_POPUP_TYPE_DEBUG,0,TranslateW(L"MraFilesQueueConnectionReceived: connection accepted, but pExtra=NULL, this is miranda bug.")); + DebugBreak(); + } +} + + + +void MraFilesQueueRecvThreadProc(LPVOID lpParameter) +{ + DWORD dwRetErrorCode=NO_ERROR; + + if (lpParameter) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)((MRA_FILES_THREADPROC_PARAMS*)lpParameter)->hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem=((MRA_FILES_THREADPROC_PARAMS*)lpParameter)->pmrafqFilesQueueItem; + + WCHAR wszFileName[MAX_FILEPATH]={0}; + WCHAR szErrorText[2048]; + BYTE btBuff[BUFF_SIZE_RCV]; + BOOL bContinue,bFailed,bOK,bConnected; + DWORD dwReceived,dwUpdateTimeNext,dwUpdateTimeCur; + HANDLE hFile; + SIZE_T i,dwBuffSizeUsed; + LARGE_INTEGER liFileSize; + NETLIBSELECT nls={0}; + PROTOFILETRANSFERSTATUS pfts={0}; + + MEMFREE(lpParameter); + + bFailed=TRUE; + bConnected=FALSE; + nls.cbSize=sizeof(nls); + pfts.cbSize=sizeof(pfts); + pfts.hContact=pmrafqFilesQueueItem->hContact; + pfts.flags=(PFTS_RECEIVING|PFTS_UNICODE);// pfts.sending=pmrafqFilesQueueItem->bSending; //true if sending, false if receiving + //pfts.files; + pfts.totalFiles=pmrafqFilesQueueItem->dwFilesCount; + //pfts.currentFileNumber=0; + pfts.totalBytes=pmrafqFilesQueueItem->dwFilesTotalSize; + //pfts.totalProgress=0; + pfts.wszWorkingDir=pmrafqFilesQueueItem->lpwszPath; + //pfts.currentFile; + //pfts.currentFileSize; + //pfts.currentFileProgress; + //pfts.currentFileTime; //as seconds since 1970 + + if (MraFilesQueueConnectOut(pmrafqFilesQueueItem)) + { + bConnected=TRUE; + }else{ + if (MraFilesQueueConnectIn(pmrafqFilesQueueItem)) + { + bConnected=TRUE; + }else{ + if (InterlockedExchangeAdd((volatile LONG*)&pmrafqFilesQueueItem->bIsWorking,0)) + { + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKRESULT_CONNECTPROXY,ACKRESULT_CONNECTED,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + if (MraMrimProxyConnect(pmrafqFilesQueueItem->hMraMrimProxyData,&pmrafqFilesQueueItem->hConnection)==NO_ERROR) + {// подключились к прокси, проверяем та ли сессия (ещё раз, на этот раз сами) + if (MraFilesQueueHandCheck(pmrafqFilesQueueItem->hConnection,pmrafqFilesQueueItem)) + {// связь установленная с тем кем нужно// pmrafqFilesQueueItem->bSending + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_CONNECTED,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + bConnected=TRUE; + } + } + } + } + } + + if (bConnected) + {// email verifyed + bFailed=FALSE; + for(i=0;idwFilesCount;i++) + {// receiving files + pfts.currentFileNumber=i; + pfts.wszCurrentFile=wszFileName; + pfts.currentFileSize=pmrafqFilesQueueItem->pmfqfFiles[i].dwSize; + pfts.currentFileProgress=0; + //pfts.currentFileTime; //as seconds since 1970 + + if ((pmrafqFilesQueueItem->dwPathSize+pmrafqFilesQueueItem->pmfqfFiles[i].dwNameLen)lpwszPath,(pmrafqFilesQueueItem->dwPathSize*sizeof(WCHAR))); + memmove((wszFileName+pmrafqFilesQueueItem->dwPathSize),pmrafqFilesQueueItem->pmfqfFiles[i].lpwszName,((pmrafqFilesQueueItem->pmfqfFiles[i].dwNameLen+1)*sizeof(WCHAR))); + wszFileName[pmrafqFilesQueueItem->dwPathSize+pmrafqFilesQueueItem->pmfqfFiles[i].dwNameLen]=0; + }else{ + dwRetErrorCode=ERROR_BAD_PATHNAME; + ShowFormatedErrorMessage(L"Receive files: error",dwRetErrorCode); + bFailed=TRUE; + break; + } + + //***deb add + //dwBuffSizeUsed=ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_FILERESUME,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,(LPARAM)&pfts); + + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_NEXTFILE,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + + //dwBuffSizeUsed=(mir_snprintf((LPSTR)btBuff,SIZEOF(btBuff),"%s %S",MRA_FT_GET_FILE,pmrafqFilesQueueItem->pmfqfFiles[i].lpwszName)+1); + memmove(btBuff,MRA_FT_GET_FILE,sizeof(MRA_FT_GET_FILE)); + btBuff[(sizeof(MRA_FT_GET_FILE)-1)]=' '; + dwBuffSizeUsed=sizeof(MRA_FT_GET_FILE)+WideCharToMultiByte(MRA_CODE_PAGE,0,pmrafqFilesQueueItem->pmfqfFiles[i].lpwszName,pmrafqFilesQueueItem->pmfqfFiles[i].dwNameLen,(LPSTR)(btBuff+sizeof(MRA_FT_GET_FILE)),(SIZEOF(btBuff)-sizeof(MRA_FT_GET_FILE)),NULL,NULL); + btBuff[dwBuffSizeUsed]=0; + dwBuffSizeUsed++; + + if (dwBuffSizeUsed==Netlib_Send(pmrafqFilesQueueItem->hConnection,(LPSTR)btBuff,dwBuffSizeUsed,0)) + {// file request sended + hFile=CreateFileW(wszFileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); + if (hFile!=INVALID_HANDLE_VALUE) + {// file opened/created, pre allocating disk space, for best perfomance + bOK=FALSE; + + liFileSize.QuadPart=(LONGLONG)pmrafqFilesQueueItem->pmfqfFiles[i].dwSize; + if (SetFilePointerEx(hFile,liFileSize,NULL,FILE_BEGIN)) + if (SetEndOfFile(hFile)) + { + liFileSize.QuadPart=0; + bOK=SetFilePointerEx(hFile,liFileSize,NULL,FILE_BEGIN); + } + + if (bOK) + {// disk space pre allocated + bOK=FALSE; + bContinue=TRUE; + dwUpdateTimeNext=GetTickCount(); + nls.dwTimeout=(1000*DB_Mra_GetDword(NULL,"TimeOutReceiveFileData",MRA_DEF_FS_TIMEOUT_RECV)); + nls.hReadConns[0]=pmrafqFilesQueueItem->hConnection; + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_DATA,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,(LPARAM)&pfts); + + while(bContinue) + { + switch(CallService(MS_NETLIB_SELECT,0,(LPARAM)&nls)){ + case SOCKET_ERROR: + case 0:// Time out + dwRetErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Receive files: error on receive file data",dwRetErrorCode); + bContinue=FALSE; + break; + case 1: + dwReceived=Netlib_Recv(pmrafqFilesQueueItem->hConnection,(LPSTR)&btBuff,SIZEOF(btBuff),0); + if (dwReceived==0 || dwReceived==SOCKET_ERROR) + { + dwRetErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Receive files: error on receive file data",dwRetErrorCode); + bContinue=FALSE; + }else{ + if (WriteFile(hFile,(LPVOID)&btBuff,dwReceived,&dwReceived,NULL)) + { + pfts.currentFileProgress+=dwReceived; + pfts.totalProgress+=dwReceived; + + // progress updates + dwUpdateTimeCur=GetTickCount(); + if (dwUpdateTimeNext<=dwUpdateTimeCur || pfts.currentFileProgress>=pmrafqFilesQueueItem->pmfqfFiles[i].dwSize) + {// we update it + dwUpdateTimeNext=dwUpdateTimeCur+MRA_FILES_QUEUE_PROGRESS_INTERVAL; + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_DATA,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,(LPARAM)&pfts); + + if (pfts.currentFileProgress>=pmrafqFilesQueueItem->pmfqfFiles[i].dwSize) + {// file received + bOK=TRUE; + bContinue=FALSE; + } + } + }else{// err on write file + dwRetErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Receive files: cant write file data, error",dwRetErrorCode); + bContinue=FALSE; + } + } + break; + } + }// end while + }else{// err allocating file disk space + dwRetErrorCode=GetLastError(); + mir_sntprintf(szErrorText,SIZEOF(szErrorText),TranslateW(L"Receive files: cant allocate disk space for file, size %lu bytes, error"),pmrafqFilesQueueItem->pmfqfFiles[i].dwSize); + ShowFormatedErrorMessage(szErrorText,dwRetErrorCode); + } + CloseHandle(hFile); + + if (bOK==FALSE) + {// file recv failed + DeleteFileW(wszFileName); + bFailed=TRUE; + break; + } + }else{// err on open file + dwRetErrorCode=GetLastError(); + mir_sntprintf(szErrorText,SIZEOF(szErrorText),TranslateW(L"Receive files: cant open file %s, error"),wszFileName); + ShowFormatedErrorMessage(szErrorText,dwRetErrorCode); + bFailed=TRUE; + break; + } + }else{// err on send request for file + dwRetErrorCode=GetLastError(); + mir_sntprintf(szErrorText,SIZEOF(szErrorText),TranslateW(L"Receive files: request for file %s not sended, error"),pmrafqFilesQueueItem->pmfqfFiles[i].lpwszName); + ShowFormatedErrorMessage(szErrorText,NO_ERROR); + bFailed=TRUE; + break; + } + }// end for + + Netlib_CloseHandle(pmrafqFilesQueueItem->hConnection); + pmrafqFilesQueueItem->hConnection=NULL; + } + + if (bFailed) + { + CHAR szEMail[MAX_EMAIL_LEN]; + SIZE_T dwEMailSize; + + if (DB_Mra_GetStaticStringA(pmrafqFilesQueueItem->hContact,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + MraSendCommand_FileTransferAck(FILE_TRANSFER_STATUS_ERROR,szEMail,dwEMailSize,pmrafqFilesQueueItem->dwIDRequest,NULL,0); + } + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_FAILED,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + }else{ + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_SUCCESS,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + } + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + MraFilesQueueItemFree(pmrafqFilesQueueItem); + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + } +} + + + +void MraFilesQueueSendThreadProc(LPVOID lpParameter) +{ + DWORD dwRetErrorCode=NO_ERROR; + + if (lpParameter) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)((MRA_FILES_THREADPROC_PARAMS*)lpParameter)->hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem=((MRA_FILES_THREADPROC_PARAMS*)lpParameter)->pmrafqFilesQueueItem; + + CHAR szFileName[MAX_FILEPATH]={0}; + WCHAR szErrorText[2048]; + BYTE btBuff[BUFF_SIZE_RCV]; + BOOL bFailed=TRUE,bOK,bConnected=FALSE; + DWORD dwReceived,dwSendBlockSize,dwUpdateTimeNext,dwUpdateTimeCur; + HANDLE hFile; + SIZE_T i,j,dwBuffSizeUsed=0; + LPWSTR lpwszFileName; + PROTOFILETRANSFERSTATUS pfts={0}; + + MEMFREE(lpParameter); + + pfts.cbSize=sizeof(pfts); + pfts.hContact=pmrafqFilesQueueItem->hContact; + pfts.flags=(PFTS_SENDING|PFTS_UNICODE);// pfts.sending=pmrafqFilesQueueItem->bSending; //true if sending, false if receiving + //pfts.files; + pfts.totalFiles=pmrafqFilesQueueItem->dwFilesCount; + //pfts.currentFileNumber=0; + pfts.totalBytes=pmrafqFilesQueueItem->dwFilesTotalSize; + //pfts.totalProgress=0; + pfts.wszWorkingDir=pmrafqFilesQueueItem->lpwszPath; + //pfts.currentFile; + //pfts.currentFileSize; + //pfts.currentFileProgress; + //pfts.currentFileTime; //as seconds since 1970 + + dwSendBlockSize=DB_Mra_GetDword(NULL,"FileSendBlockSize",MRA_DEFAULT_FILE_SEND_BLOCK_SIZE); + if (dwSendBlockSize>SIZEOF(btBuff)) dwSendBlockSize=SIZEOF(btBuff); + if (dwSendBlockSize<512) dwSendBlockSize=MRA_DEFAULT_FILE_SEND_BLOCK_SIZE; + + if (MraFilesQueueConnectIn(pmrafqFilesQueueItem)) + { + bConnected=TRUE; + }else{ + if (MraFilesQueueConnectOut(pmrafqFilesQueueItem)) + { + bConnected=TRUE; + }else{ + if (InterlockedExchangeAdd((volatile LONG*)&pmrafqFilesQueueItem->bIsWorking,0)) + { + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKRESULT_CONNECTPROXY,ACKRESULT_CONNECTED,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + if (MraMrimProxyConnect(pmrafqFilesQueueItem->hMraMrimProxyData,&pmrafqFilesQueueItem->hConnection)==NO_ERROR) + {// подключились к прокси, проверяем та ли сессия (ещё раз, на этот раз сами) + if (MraFilesQueueHandCheck(pmrafqFilesQueueItem->hConnection,pmrafqFilesQueueItem)) + {// связь установленная с тем кем нужно// pmrafqFilesQueueItem->bSending + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_CONNECTED,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + bConnected=TRUE; + } + } + } + } + } + + if (bConnected) + {// email verifyed + bFailed=FALSE; + for(i=0;idwFilesCount;i++) + {// sending files + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_NEXTFILE,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + + dwBuffSizeUsed=0; + while(TRUE) + { + dwReceived=Netlib_Recv(pmrafqFilesQueueItem->hConnection,((LPSTR)btBuff+dwBuffSizeUsed),(SIZEOF(btBuff)-dwBuffSizeUsed),0); + if (dwReceived==0 || dwReceived==SOCKET_ERROR) + {// err on receive file name to send + dwRetErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Send files: file send request not received, error",dwRetErrorCode); + bFailed=TRUE; + break; + }else{ + dwBuffSizeUsed+=dwReceived; + if (MemoryFindByte((dwBuffSizeUsed-dwReceived),btBuff,dwBuffSizeUsed,0)) break; + } + }// end while (file name passible received)*/ + + + if (bFailed==FALSE) + {// ...received + if (dwBuffSizeUsed>(sizeof(MRA_FT_GET_FILE)+1)) + {// file name received + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,(LPSTR)btBuff,(sizeof(MRA_FT_GET_FILE)-1),MRA_FT_GET_FILE,(sizeof(MRA_FT_GET_FILE)-1))==CSTR_EQUAL) + {// MRA_FT_GET_FILE verifyed + bFailed=TRUE; + for(j=0;jdwFilesCount;j++) + { + lpwszFileName=GetFileNameFromFullPathW(pmrafqFilesQueueItem->pmfqfFiles[j].lpwszName,pmrafqFilesQueueItem->pmfqfFiles[j].dwNameLen); + szFileName[WideCharToMultiByte(MRA_CODE_PAGE,0,lpwszFileName,(pmrafqFilesQueueItem->pmfqfFiles[j].dwNameLen-(lpwszFileName-pmrafqFilesQueueItem->pmfqfFiles[j].lpwszName)),szFileName,SIZEOF(szFileName),NULL,NULL)]=0; + + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,(((LPSTR)btBuff)+sizeof(MRA_FT_GET_FILE)),(dwBuffSizeUsed-(sizeof(MRA_FT_GET_FILE)+1)),szFileName,-1)==CSTR_EQUAL) + { + bFailed=FALSE; + break; + } + } + + if (bFailed==FALSE) + { + hFile=CreateFileW(pmrafqFilesQueueItem->pmfqfFiles[j].lpwszName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,(FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN),NULL); + if (hFile!=INVALID_HANDLE_VALUE) + { + bOK=FALSE; + dwUpdateTimeNext=GetTickCount(); + pfts.currentFileNumber=i; + pfts.wszCurrentFile=pmrafqFilesQueueItem->pmfqfFiles[j].lpwszName; + pfts.currentFileSize=pmrafqFilesQueueItem->pmfqfFiles[j].dwSize; + pfts.currentFileProgress=0; + //pfts.currentFileTime; //as seconds since 1970 + + WideCharToMultiByte(MRA_CODE_PAGE,0,pmrafqFilesQueueItem->pmfqfFiles[j].lpwszName,pmrafqFilesQueueItem->pmfqfFiles[j].dwNameLen,szFileName,SIZEOF(szFileName),NULL,NULL); + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_DATA,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,(LPARAM)&pfts); + + while(TRUE) + {// read and sending + if (ReadFile(hFile,btBuff,dwSendBlockSize,(DWORD*)&dwBuffSizeUsed,NULL)) + { + dwReceived=Netlib_Send(pmrafqFilesQueueItem->hConnection,(LPSTR)btBuff,dwBuffSizeUsed,0); + if (dwBuffSizeUsed==dwReceived) + { + pfts.currentFileProgress+=dwBuffSizeUsed; + pfts.totalProgress+=dwBuffSizeUsed; + + // progress updates + dwUpdateTimeCur=GetTickCount(); + if (dwUpdateTimeNext<=dwUpdateTimeCur || pfts.currentFileProgress>=pmrafqFilesQueueItem->pmfqfFiles[j].dwSize) + {// we update it + dwUpdateTimeNext=dwUpdateTimeCur+MRA_FILES_QUEUE_PROGRESS_INTERVAL; + + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_DATA,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,(LPARAM)&pfts); + + if (pfts.currentFileProgress>=pmrafqFilesQueueItem->pmfqfFiles[j].dwSize) + {// file received + bOK=TRUE; + break; + } + } + }else{// err on send file data + dwRetErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Send files: error on send file data",dwRetErrorCode); + break; + } + }else{// read failure + dwRetErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Send files: cant read file data, error",dwRetErrorCode); + break; + } + }// end while + CloseHandle(hFile); + + if (bOK==FALSE) + {// file recv failed + bFailed=TRUE; + break; + } + }else{// err on open file + dwRetErrorCode=GetLastError(); + + mir_sntprintf(szErrorText,SIZEOF(szErrorText),TranslateW(L"Send files: cant open file %s, error"),pmrafqFilesQueueItem->pmfqfFiles[j].lpwszName); + ShowFormatedErrorMessage(szErrorText,dwRetErrorCode); + bFailed=TRUE; + break; + } + }else{ + mir_sntprintf(szErrorText,SIZEOF(szErrorText),TranslateW(L"Send files: requested file: %S - not found in send files list."),(((LPSTR)btBuff)+sizeof(MRA_FT_GET_FILE))); + ShowFormatedErrorMessage(szErrorText,NO_ERROR); + bFailed=TRUE; + break; + } + }else{// err on receive, trash + ShowFormatedErrorMessage(L"Send files: bad file send request - invalid header",NO_ERROR); + bFailed=TRUE; + break; + } + }else{// bad file name or trash + ShowFormatedErrorMessage(L"Send files: bad file send request - to small packet",NO_ERROR); + bFailed=TRUE; + break; + } + }else{ + break; + } + }// end for + + Netlib_CloseHandle(pmrafqFilesQueueItem->hConnection); + pmrafqFilesQueueItem->hConnection=NULL; + } + + if (bFailed) + { + CHAR szEMail[MAX_EMAIL_LEN]; + SIZE_T dwEMailSize; + + if (DB_Mra_GetStaticStringA(pmrafqFilesQueueItem->hContact,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + MraSendCommand_FileTransferAck(FILE_TRANSFER_STATUS_ERROR,szEMail,dwEMailSize,pmrafqFilesQueueItem->dwIDRequest,NULL,0); + } + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_FAILED,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + }else{ + ProtoBroadcastAck(PROTOCOL_NAMEA,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_SUCCESS,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + } + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + MraFilesQueueItemFree(pmrafqFilesQueueItem); + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + } +} diff --git a/MRA/MraFilesQueue.h b/MRA/MraFilesQueue.h new file mode 100644 index 0000000..2b00405 --- /dev/null +++ b/MRA/MraFilesQueue.h @@ -0,0 +1,26 @@ +#if !defined(AFX_MRA_FILESQUEUE_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) +#define AFX_MRA_FILESQUEUE_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + +INT_PTR CALLBACK MraFilesQueueDlgProcOpts(HWND hWndDlg,UINT msg,WPARAM wParam,LPARAM lParam); +DWORD MraFilesQueueInitialize (DWORD dwFilesTimeOutInterval,HANDLE *phFilesQueueHandle); +void MraFilesQueueDestroy (HANDLE hFilesQueueHandle); + +HANDLE MraFilesQueueItemProxyByID (HANDLE hFilesQueueHandle,DWORD dwIDRequest); +DWORD MraFilesQueueAddReceive (HANDLE hFilesQueueHandle,DWORD dwFlags,HANDLE hContact,DWORD dwIDRequest,LPWSTR lpwszFiles,SIZE_T dwFilesSize,LPSTR lpszAddreses,SIZE_T dwAddresesSize); +DWORD MraFilesQueueAddSend (HANDLE hFilesQueueHandle,DWORD dwFlags,HANDLE hContact,LPWSTR *plpwszFiles,SIZE_T dwFilesCount,DWORD *pdwIDRequest); +DWORD MraFilesQueueAccept (HANDLE hFilesQueueHandle,DWORD dwIDRequest,LPWSTR lpwszPath,SIZE_T dwPathSize); +DWORD MraFilesQueueCancel (HANDLE hFilesQueueHandle,DWORD dwIDRequest,BOOL bSendDecline); +DWORD MraFilesQueueStartMrimProxy (HANDLE hFilesQueueHandle,DWORD dwIDRequest); +DWORD MraFilesQueueFree (HANDLE hFilesQueueHandle,DWORD dwCMDNum); +DWORD MraFilesQueueSendMirror (HANDLE hFilesQueueHandle,DWORD dwIDRequest,LPSTR lpszAddreses,SIZE_T dwAddresesSize); + + + + +#endif // !defined(AFX_MRA_FILESQUEUE_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/MRA/MraFilesQueue_mod.cpp b/MRA/MraFilesQueue_mod.cpp new file mode 100644 index 0000000..23488c9 --- /dev/null +++ b/MRA/MraFilesQueue_mod.cpp @@ -0,0 +1,1298 @@ +#include +#include +#include +#include +#include +#include +#include "MraFilesQueue.h" +#include "proto.h" +#include "Mra.h" + + + +#define MRA_FT_HELLO "MRA_FT_HELLO" +#define MRA_FT_GET_FILE "MRA_FT_GET_FILE" + + + +typedef struct +{ + LIST_MT lmtListMT; + DWORD dwSendTimeOutInterval; +} MRA_FILES_QUEUE; + + + +struct MRA_FILES_QUEUE_FILE +{ + LPSTR lpszName; + SIZE_T dwNameLen; + SIZE_T dwSize; +}; + +struct MRA_FILES_QUEUE_ADDR +{ + DWORD dwIP; + DWORD dwPort; +}; + + +typedef struct +{ + // internal + LIST_MT_ITEM lmtListMTItem; + DWORD dwSendTime; + // external + DWORD dwIDRequest; + DWORD dwFlags; + HANDLE hContact; + DWORD dwFilesCount; + DWORD dwFilesTotalSize; + DWORD dwAddrCount; + LPSTR lpszDescription; + SIZE_T dwDescriptionSize; + MRA_FILES_QUEUE_FILE *pmfqfFiles; + MRA_FILES_QUEUE_ADDR *pmfqaAddreses; + LPSTR lpszPath; + SIZE_T dwPathSize; + BOOL bSending; + HANDLE hConnection; + HANDLE hListen; + HANDLE hThread; + HANDLE hWaitHandle; + +} MRA_FILES_QUEUE_ITEM; + + + +struct MRA_FILES_THREADPROC_PARAMS +{ + HANDLE hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; +}; + + + +//#define MEMALLOC(Size) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(Size+sizeof(SIZE_T))) +//#define MEMREALLOC(Mem,Size) HeapReAlloc(GetProcessHeap(),(HEAP_ZERO_MEMORY),(LPVOID)Mem,(Size+sizeof(SIZE_T))) +//#define MEMFREE(Mem) if (Mem) {HeapFree(GetProcessHeap(),0,(LPVOID)Mem);Mem=NULL;} + + +DWORD MraFilesQueueItemFindByID (HANDLE hFilesQueueHandle,DWORD dwIDRequest,MRA_FILES_QUEUE_ITEM **ppmrafqFilesQueueItem); +DWORD MraFilesQueueItemFindByEMail (HANDLE hFilesQueueHandle,LPSTR lpszEMail,SIZE_T dwEMailSize,MRA_FILES_QUEUE_ITEM **ppmrafqFilesQueueItem); +void MraFilesQueueItemFree (MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem); +SIZE_T MraFilesQueueGetLocalAddressesList (LPSTR lpszBuff,SIZE_T dwBuffSize,DWORD dwPort); + +BOOL MraFilesQueueHandCheck (HANDLE hConnection,MRA_FILES_QUEUE_ITEM **ppmrafqFilesQueueItem); +void MraFilesQueueConnectionReceived (HANDLE hNewConnection,DWORD dwRemoteIP,void *pExtra); + +DWORD WINAPI MraFilesQueueRecvThreadProc (LPVOID lpParameter); +DWORD WINAPI MraFilesQueueSendThreadProc (LPVOID lpParameter); + + + +BOOL CALLBACK MraFilesQueueDlgProcOpts(HWND hWndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg){ + case WM_INITDIALOG: + { + DBVARIANT dbv; + TranslateDialogDefault(hWndDlg); + + CheckDlgButton(hWndDlg,IDC_FILE_SEND_HIDE_MY_NOOUTCONNECTIONONRECEIVE,DB_Mra_GetByte(NULL,"FileSendNoOutConnOnRcv",MRA_DEF_FS_NO_OUT_CONN_ON_RCV)); + CheckDlgButton(hWndDlg,IDC_FILE_SEND_HIDE_MY_NOOUTCONNECTIONONSEND,DB_Mra_GetByte(NULL,"FileSendNoOutConnOnSend",MRA_DEF_FS_NO_OUT_CONN_ON_SEND)); + CheckDlgButton(hWndDlg,IDC_FILE_SEND_IGNORYADDITIONALPORTS,DB_Mra_GetByte(NULL,"FileSendIgnoryAdditionalPorts",MRA_DEF_FS_IGNORY_ADDITIONAL_PORTS)); + CheckDlgButton(hWndDlg,IDC_FILE_SEND_HIDE_MY_ADDRESSES,DB_Mra_GetByte(NULL,"FileSendHideMyAddresses",MRA_DEF_FS_HIDE_MY_ADDRESSES)); + CheckDlgButton(hWndDlg,IDC_FILE_SEND_ADD_EXTRA_ADDRESS,DB_Mra_GetByte(NULL,"FileSendAddExtraAddresses",MRA_DEF_FS_ADD_EXTRA_ADDRESSES)); + if(!DBGetContactSetting(NULL,PROTOCOL_NAME,"FileSendExtraAddresses",&dbv)) { + //bit of a security hole here, since it's easy to extract a password from an edit box + SetDlgItemText(hWndDlg,IDC_FILE_SEND_EXTRA_ADDRESS,dbv.pszVal); + DBFreeVariant(&dbv); + } + EnableWindow(GetDlgItem(hWndDlg,IDC_FILE_SEND_EXTRA_ADDRESS),IsDlgButtonChecked(hWndDlg,IDC_FILE_SEND_ADD_EXTRA_ADDRESS)); + + SetDlgItemInt(hWndDlg,IDC_FILE_SEND_BLOCK_SIZE,DB_Mra_GetDword(NULL,"FileSendBlockSize",MRA_DEFAULT_FILE_SEND_BLOCK_SIZE),FALSE); + } + return(TRUE); + case WM_COMMAND: + if (LOWORD(wParam)==IDC_FILE_SEND_ADD_EXTRA_ADDRESS) + { + EnableWindow(GetDlgItem(hWndDlg,IDC_FILE_SEND_EXTRA_ADDRESS),IsDlgButtonChecked(hWndDlg,IDC_FILE_SEND_ADD_EXTRA_ADDRESS)); + } + + if ((LOWORD(wParam)==IDC_FILE_SEND_EXTRA_ADDRESS || LOWORD(wParam)==IDC_FILE_SEND_BLOCK_SIZE) && (HIWORD(wParam)!=EN_CHANGE || (HWND)lParam!=GetFocus()) ) return(0); + SendMessage(GetParent(hWndDlg),PSM_CHANGED,0,0); + break; + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->code){ + case PSN_APPLY: + { + char szBuff[MAX_PATH]; + + DB_Mra_SetByte(NULL,"FileSendNoOutConnOnRcv",IsDlgButtonChecked(hWndDlg,IDC_FILE_SEND_HIDE_MY_NOOUTCONNECTIONONRECEIVE)); + DB_Mra_SetByte(NULL,"FileSendNoOutConnOnSend",IsDlgButtonChecked(hWndDlg,IDC_FILE_SEND_HIDE_MY_NOOUTCONNECTIONONSEND)); + DB_Mra_SetByte(NULL,"FileSendIgnoryAdditionalPorts",IsDlgButtonChecked(hWndDlg,IDC_FILE_SEND_IGNORYADDITIONALPORTS)); + DB_Mra_SetByte(NULL,"FileSendHideMyAddresses",IsDlgButtonChecked(hWndDlg,IDC_FILE_SEND_HIDE_MY_ADDRESSES)); + DB_Mra_SetByte(NULL,"FileSendAddExtraAddresses",IsDlgButtonChecked(hWndDlg,IDC_FILE_SEND_ADD_EXTRA_ADDRESS)); + GetDlgItemText(hWndDlg,IDC_FILE_SEND_EXTRA_ADDRESS,szBuff,sizeof(szBuff)); + DBWriteContactSettingString(NULL,PROTOCOL_NAME,"FileSendExtraAddresses",szBuff); + DB_Mra_SetDword(NULL,"FileSendBlockSize",(DWORD)GetDlgItemInt(hWndDlg,IDC_FILE_SEND_BLOCK_SIZE,NULL,FALSE)); + } + return(TRUE); + } + break; + } +return(FALSE); +} + + + +DWORD MraFilesQueueInitialize(DWORD dwSendTimeOutInterval,HANDLE *phFilesQueueHandle) +{ + DWORD dwRetErrorCode; + + if (phFilesQueueHandle) + { + MRA_FILES_QUEUE *pmrafqFilesQueue; + + pmrafqFilesQueue=(MRA_FILES_QUEUE*)MEMALLOC(sizeof(MRA_FILES_QUEUE)); + if (pmrafqFilesQueue) + { + dwRetErrorCode=ListMTInitialize(&pmrafqFilesQueue->lmtListMT,0); + if (dwRetErrorCode==NO_ERROR) + { + pmrafqFilesQueue->dwSendTimeOutInterval=dwSendTimeOutInterval; + (*phFilesQueueHandle)=(HANDLE)pmrafqFilesQueue; + }else{ + MEMFREE(pmrafqFilesQueue); + } + }else{ + dwRetErrorCode=GetLastError(); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +void MraFilesQueueDestroy(HANDLE hFilesQueueHandle) +{ + if (hFilesQueueHandle) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + while(ListMTItemGetFirst(&pmrafqFilesQueue->lmtListMT,NULL,(LPVOID*)&pmrafqFilesQueueItem)==NO_ERROR) + { + ListMTItemDelete(&pmrafqFilesQueue->lmtListMT,&pmrafqFilesQueueItem->lmtListMTItem); + MraFilesQueueItemFree(pmrafqFilesQueueItem); + } + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + + ListMTDestroy(&pmrafqFilesQueue->lmtListMT); + MEMFREE(pmrafqFilesQueue); + } +} + + +DWORD MraFilesQueueItemFindByID(HANDLE hFilesQueueHandle,DWORD dwIDRequest,MRA_FILES_QUEUE_ITEM **ppmrafqFilesQueueItem) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + LIST_MT_ITERATOR lmtiIterator; + + dwRetErrorCode=ERROR_NOT_FOUND; + ListMTLock(&pmrafqFilesQueue->lmtListMT); + ListMTIteratorMoveFirst(&pmrafqFilesQueue->lmtListMT,&lmtiIterator); + do + {// цикл + if (ListMTIteratorGet(&lmtiIterator,NULL,(LPVOID*)&pmrafqFilesQueueItem)==NO_ERROR) + if (pmrafqFilesQueueItem->dwIDRequest==dwIDRequest) + { + if (ppmrafqFilesQueueItem) (*ppmrafqFilesQueueItem)=pmrafqFilesQueueItem; + dwRetErrorCode=NO_ERROR; + break; + } + }while(ListMTIteratorMoveNext(&lmtiIterator)); + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraFilesQueueItemFindByEMail(HANDLE hFilesQueueHandle,LPSTR lpszEMail,SIZE_T dwEMailSize,MRA_FILES_QUEUE_ITEM **ppmrafqFilesQueueItem) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle) + { + char szEMailLocal[MAX_EMAIL_LEN]; + SIZE_T dwEMailLocalSize; + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + LIST_MT_ITERATOR lmtiIterator; + + dwRetErrorCode=ERROR_NOT_FOUND; + ListMTLock(&pmrafqFilesQueue->lmtListMT); + ListMTIteratorMoveFirst(&pmrafqFilesQueue->lmtListMT,&lmtiIterator); + do + {// цикл + if (ListMTIteratorGet(&lmtiIterator,NULL,(LPVOID*)&pmrafqFilesQueueItem)==NO_ERROR) + if (DB_Mra_GetStaticString(pmrafqFilesQueueItem->hContact,"e-mail",szEMailLocal,sizeof(szEMailLocal),&dwEMailLocalSize)) + if (dwEMailSize==dwEMailLocalSize) + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpszEMail,dwEMailSize,szEMailLocal,dwEMailLocalSize)==CSTR_EQUAL) + { + if (ppmrafqFilesQueueItem) (*ppmrafqFilesQueueItem)=pmrafqFilesQueueItem; + dwRetErrorCode=NO_ERROR; + break; + } + }while(ListMTIteratorMoveNext(&lmtiIterator)); + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +void MraFilesQueueItemFree(MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem) +{ + + for(SIZE_T i=0;idwFilesCount;i++) + { + MEMFREE(pmrafqFilesQueueItem->pmfqfFiles[i].lpszName); + } + MEMFREE(pmrafqFilesQueueItem->pmfqfFiles); + MEMFREE(pmrafqFilesQueueItem->pmfqaAddreses); + MEMFREE(pmrafqFilesQueueItem->lpszPath); + //MEMFREE(pmrafqFilesQueueItem->lpszDescription); //placed after pmrafqFilesQueueItem + MEMFREE(pmrafqFilesQueueItem); +} + + + + + +SIZE_T MraFilesQueueGetLocalAddressesList(LPSTR lpszBuff,SIZE_T dwBuffSize,DWORD dwPort) +{ + char szHostName[MAX_PATH]={0}; + LPSTR lpszCurPos=lpszBuff; + SIZE_T dwAdapter=0; + hostent *sh; + + if (DB_Mra_GetByte(NULL,"FileSendHideMyAddresses",MRA_DEF_FS_HIDE_MY_ADDRESSES)) + {// не выдаём врагу наш IP адрес!!! :) + lpszCurPos+=mir_snprintf(lpszCurPos,(dwBuffSize-(lpszCurPos-lpszBuff)),"192.168.0.1:26775;"); + }else{// создаём список наших IP адресов + if (gethostname(szHostName,sizeof(szHostName))==0) + if ((sh=gethostbyname((LPSTR)&szHostName))) + { + while(sh->h_addr_list[dwAdapter]) + { + lpszCurPos+=mir_snprintf(lpszCurPos,(dwBuffSize-(lpszCurPos-lpszBuff)),"%s:%ld;",inet_ntoa(*((struct in_addr*)sh->h_addr_list[dwAdapter])),dwPort); + dwAdapter++; + } + } + } + + if (DB_Mra_GetByte(NULL,"FileSendAddExtraAddresses",MRA_DEF_FS_ADD_EXTRA_ADDRESSES))// добавляем произвольный адрес + if (DB_Mra_GetStaticString(NULL,"FileSendExtraAddresses",szHostName,sizeof(szHostName),NULL)) + { + lpszCurPos+=mir_snprintf(lpszCurPos,(dwBuffSize-(lpszCurPos-lpszBuff)),"%s:%ld;",szHostName,dwPort); + } +return((lpszCurPos-lpszBuff)); +} + + + + +DWORD MraFilesQueueAddReceive(HANDLE hFilesQueueHandle,DWORD dwFlags,HANDLE hContact,DWORD dwIDRequest,DWORD dwFilesTotalSize,LPSTR lpszFiles,SIZE_T dwFilesSize,LPSTR lpszDescription,SIZE_T dwDescriptionSize,LPSTR lpszAddreses,SIZE_T dwAddresesSize) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle && dwIDRequest) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + + if (!lpszDescription || dwDescriptionSize==0) + { + lpszDescription=Translate("No description given"); + dwDescriptionSize=lstrlenA(lpszDescription); + } + + pmrafqFilesQueueItem=(MRA_FILES_QUEUE_ITEM*)MEMALLOC(sizeof(MRA_FILES_QUEUE_ITEM)+sizeof(LPSTR)+dwDescriptionSize+64); + if (pmrafqFilesQueueItem) + { + char szBuff[MAX_PATH]; + LPSTR lpszCurrentItem,lpszDelimiter,lpszEndItem,lpszBlob; + SIZE_T dwMemSize,dwAllocatedCount; + CCSDATA ccs; + PROTORECVEVENT pre; + + //pmrafqFilesQueueItem->lmtListMTItem; + pmrafqFilesQueueItem->dwSendTime=GetTickCount(); + pmrafqFilesQueueItem->dwIDRequest=dwIDRequest; + pmrafqFilesQueueItem->dwFlags=dwFlags; + pmrafqFilesQueueItem->hContact=hContact; + pmrafqFilesQueueItem->lpszDescription=(LPSTR)(pmrafqFilesQueueItem+1); + pmrafqFilesQueueItem->dwDescriptionSize=dwDescriptionSize; + CopyMemory(pmrafqFilesQueueItem->lpszDescription,lpszDescription,dwDescriptionSize); + + + dwAllocatedCount=ALLOCATED_COUNT; + pmrafqFilesQueueItem->dwFilesCount=0; + pmrafqFilesQueueItem->dwFilesTotalSize=dwFilesTotalSize; + pmrafqFilesQueueItem->pmfqfFiles=(MRA_FILES_QUEUE_FILE*)MEMALLOC((sizeof(MRA_FILES_QUEUE_FILE)*dwAllocatedCount)); + lpszCurrentItem=lpszFiles; + while(TRUE) + { + lpszDelimiter=(LPSTR)MemoryFindByte((lpszCurrentItem-lpszFiles),lpszFiles,dwFilesSize,';'); + if (lpszDelimiter) + { + lpszEndItem=(LPSTR)MemoryFindByte(((lpszDelimiter+1)-lpszFiles),lpszFiles,dwFilesSize,';'); + if (lpszEndItem) + { + if (pmrafqFilesQueueItem->dwFilesCount==dwAllocatedCount) + { + dwAllocatedCount*=2; + pmrafqFilesQueueItem->pmfqfFiles=(MRA_FILES_QUEUE_FILE*)MEMREALLOC(pmrafqFilesQueueItem->pmfqfFiles,(sizeof(MRA_FILES_QUEUE_FILE)*dwAllocatedCount)); + } + + dwMemSize=(lpszDelimiter-lpszCurrentItem); + pmrafqFilesQueueItem->pmfqfFiles[pmrafqFilesQueueItem->dwFilesCount].lpszName=(LPSTR)MEMALLOC(dwMemSize); + CopyMemory(pmrafqFilesQueueItem->pmfqfFiles[pmrafqFilesQueueItem->dwFilesCount].lpszName,lpszCurrentItem,dwMemSize); + pmrafqFilesQueueItem->pmfqfFiles[pmrafqFilesQueueItem->dwFilesCount].dwNameLen=dwMemSize; + pmrafqFilesQueueItem->pmfqfFiles[pmrafqFilesQueueItem->dwFilesCount].dwSize=StrToUNum32((lpszDelimiter+1),(lpszEndItem-(lpszDelimiter+1))); + + pmrafqFilesQueueItem->dwFilesCount++; + lpszCurrentItem=(lpszEndItem+1); + }else{ + break; + } + }else{ + break; + } + } + pmrafqFilesQueueItem->pmfqfFiles=(MRA_FILES_QUEUE_FILE*)MEMREALLOC(pmrafqFilesQueueItem->pmfqfFiles,(sizeof(MRA_FILES_QUEUE_FILE)*pmrafqFilesQueueItem->dwFilesCount)); + + + dwAllocatedCount=ALLOCATED_COUNT; + pmrafqFilesQueueItem->dwAddrCount=0; + pmrafqFilesQueueItem->pmfqaAddreses=(MRA_FILES_QUEUE_ADDR*)MEMALLOC(sizeof(MRA_FILES_QUEUE_ADDR)*dwAllocatedCount); + lpszCurrentItem=lpszAddreses; + while(TRUE) + { + lpszEndItem=(LPSTR)MemoryFindByte((lpszCurrentItem-lpszAddreses),lpszAddreses,dwAddresesSize,';'); + if (lpszEndItem) + { + lpszDelimiter=(LPSTR)MemoryFindByte((lpszCurrentItem-lpszAddreses),lpszAddreses,dwAddresesSize,':'); + if (lpszDelimiter) + { + if (pmrafqFilesQueueItem->dwAddrCount==dwAllocatedCount) + { + dwAllocatedCount*=2; + pmrafqFilesQueueItem->pmfqaAddreses=(MRA_FILES_QUEUE_ADDR*)MEMREALLOC(pmrafqFilesQueueItem->pmfqaAddreses,(sizeof(MRA_FILES_QUEUE_ADDR)*dwAllocatedCount)); + } + + (*lpszDelimiter)=0; + pmrafqFilesQueueItem->pmfqaAddreses[pmrafqFilesQueueItem->dwAddrCount].dwIP=inet_addr(lpszCurrentItem); + pmrafqFilesQueueItem->pmfqaAddreses[pmrafqFilesQueueItem->dwAddrCount].dwPort=StrToUNum32((lpszDelimiter+1),(lpszEndItem-(lpszDelimiter+1))); + (*lpszDelimiter)=':'; + + switch(pmrafqFilesQueueItem->dwAddrCount){ + case 0: + DB_Mra_SetDword(pmrafqFilesQueueItem->hContact,"OldIP",DB_Mra_GetDword(pmrafqFilesQueueItem->hContact,"IP",0));DB_Mra_SetDword(pmrafqFilesQueueItem->hContact,"IP",htonl(pmrafqFilesQueueItem->pmfqaAddreses[pmrafqFilesQueueItem->dwAddrCount].dwIP)); + break; + case 1: + DB_Mra_SetDword(pmrafqFilesQueueItem->hContact,"OldRealIP",DB_Mra_GetDword(pmrafqFilesQueueItem->hContact,"RealIP",0));DB_Mra_SetDword(pmrafqFilesQueueItem->hContact,"RealIP",htonl(pmrafqFilesQueueItem->pmfqaAddreses[pmrafqFilesQueueItem->dwAddrCount].dwIP)); + break; + } + pmrafqFilesQueueItem->dwAddrCount++; + lpszCurrentItem=(lpszEndItem+1); + }else{ + break; + } + }else{ + break; + } + } + pmrafqFilesQueueItem->pmfqaAddreses=(MRA_FILES_QUEUE_ADDR*)MEMREALLOC(pmrafqFilesQueueItem->pmfqaAddreses,(sizeof(MRA_FILES_QUEUE_ADDR)*pmrafqFilesQueueItem->dwAddrCount)); + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + ListMTItemAdd(&pmrafqFilesQueue->lmtListMT,&pmrafqFilesQueueItem->lmtListMTItem,pmrafqFilesQueueItem); + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + + + // Send chain event + dwMemSize=(sizeof(DWORD)+dwDescriptionSize+dwAddresesSize+sizeof(SIZE_T)); + for(SIZE_T i=0;idwFilesCount;i++) + { + dwMemSize+=(pmrafqFilesQueueItem->pmfqfFiles[i].dwNameLen+64); + } + lpszBlob=(LPSTR)MEMALLOC(dwMemSize); + lpszCurrentItem=lpszBlob; + // user data + (*((DWORD*)lpszCurrentItem))=dwIDRequest;lpszCurrentItem+=sizeof(DWORD); + // file name + StrFormatByteSizeA(pmrafqFilesQueueItem->dwFilesTotalSize,szBuff,sizeof(szBuff)); + lpszCurrentItem+=(mir_snprintf(lpszCurrentItem,(dwMemSize-(lpszCurrentItem-lpszBlob)),"%ld Files (%s)",pmrafqFilesQueueItem->dwFilesCount,szBuff)+1); + // description + for(SIZE_T i=0;idwFilesCount;i++) + { + StrFormatByteSizeA(pmrafqFilesQueueItem->pmfqfFiles[i].dwSize,szBuff,sizeof(szBuff)); + lpszCurrentItem+=mir_snprintf(lpszCurrentItem,(dwMemSize-(lpszCurrentItem-lpszBlob)),"%s - %s\r\n",pmrafqFilesQueueItem->pmfqfFiles[i].lpszName,szBuff); + } + CopyMemory(lpszCurrentItem,lpszAddreses,dwAddresesSize);lpszCurrentItem+=dwAddresesSize; + lpszCurrentItem+=(mir_snprintf(lpszCurrentItem,(dwMemSize-(lpszCurrentItem-lpszBlob)),"\r\n%s",lpszDescription)+1); + + ccs.szProtoService=PSR_FILE; + ccs.hContact=hContact; + ccs.wParam=0; + ccs.lParam=(LPARAM)⪯ + pre.flags=0; + pre.timestamp=time(NULL); + pre.szMessage=lpszBlob; + pre.lParam=(lpszCurrentItem-lpszBlob); + + CallService(MS_PROTO_CHAINRECV,0,(LPARAM)&ccs); + MEMFREE(lpszBlob); + + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=GetLastError(); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + + +DWORD MraFilesQueueAddSend(HANDLE hFilesQueueHandle,DWORD dwFlags,HANDLE hContact,LPSTR *plpszFiles,LPSTR lpszDescription,SIZE_T dwDescriptionSize,DWORD *pdwIDRequest) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + + + pmrafqFilesQueueItem=(MRA_FILES_QUEUE_ITEM*)MEMALLOC(sizeof(MRA_FILES_QUEUE_ITEM)+sizeof(LPSTR)+dwDescriptionSize+64); + if (pmrafqFilesQueueItem) + { + SIZE_T i; + WIN32_FILE_ATTRIBUTE_DATA wfad; + + //pmrafqFilesQueueItem->lmtListMTItem; + pmrafqFilesQueueItem->dwSendTime=GetTickCount(); + pmrafqFilesQueueItem->dwIDRequest=InterlockedIncrement((LONG volatile*)&masMraSettings.dwCMDNum);// уникальный, рандомный идентификатор + pmrafqFilesQueueItem->dwFlags=dwFlags; + pmrafqFilesQueueItem->hContact=hContact; + pmrafqFilesQueueItem->lpszDescription=(LPSTR)(pmrafqFilesQueueItem+1); + pmrafqFilesQueueItem->dwDescriptionSize=dwDescriptionSize; + CopyMemory(pmrafqFilesQueueItem->lpszDescription,lpszDescription,dwDescriptionSize); + + + for(pmrafqFilesQueueItem->dwFilesCount=0;plpszFiles[pmrafqFilesQueueItem->dwFilesCount];pmrafqFilesQueueItem->dwFilesCount++); + pmrafqFilesQueueItem->pmfqfFiles=(MRA_FILES_QUEUE_FILE*)MEMALLOC((sizeof(MRA_FILES_QUEUE_FILE)*(pmrafqFilesQueueItem->dwFilesCount+1))); + pmrafqFilesQueueItem->dwFilesTotalSize=0; + + for(i=0;idwFilesCount;i++) + { + if (GetFileAttributesExA(plpszFiles[i],GetFileExInfoStandard,&wfad)) + { + pmrafqFilesQueueItem->pmfqfFiles[i].dwSize=wfad.nFileSizeLow; + pmrafqFilesQueueItem->dwFilesTotalSize+=wfad.nFileSizeLow; + }else{ + pmrafqFilesQueueItem->pmfqfFiles[i].dwSize=0; + } + pmrafqFilesQueueItem->pmfqfFiles[i].dwNameLen=lstrlenA(plpszFiles[i]); + pmrafqFilesQueueItem->pmfqfFiles[i].lpszName=(LPSTR)MEMALLOC(pmrafqFilesQueueItem->pmfqfFiles[i].dwNameLen); + CopyMemory(pmrafqFilesQueueItem->pmfqfFiles[i].lpszName,plpszFiles[i],pmrafqFilesQueueItem->pmfqfFiles[i].dwNameLen); + } + //pmrafqFilesQueueItem->dwAddrCount=0; + //pmrafqFilesQueueItem->pmfqaAddreses=NULL; + pmrafqFilesQueueItem->bSending=TRUE; + if (pdwIDRequest) (*pdwIDRequest)=pmrafqFilesQueueItem->dwIDRequest; + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + ListMTItemAdd(&pmrafqFilesQueue->lmtListMT,&pmrafqFilesQueueItem->lmtListMTItem,pmrafqFilesQueueItem); + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + + { + MRA_FILES_THREADPROC_PARAMS *pmftpp=(MRA_FILES_THREADPROC_PARAMS*)MEMALLOC(sizeof(MRA_FILES_THREADPROC_PARAMS)); + pmftpp->hFilesQueueHandle=hFilesQueueHandle; + pmftpp->pmrafqFilesQueueItem=pmrafqFilesQueueItem; + + pmrafqFilesQueueItem->hThread=CreateThread(0,0,MraFilesQueueSendThreadProc,pmftpp,0,NULL); + } + + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=GetLastError(); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + + +DWORD MraFilesQueueAccept(HANDLE hFilesQueueHandle,DWORD dwIDRequest,LPSTR lpszPath,SIZE_T dwPathSize) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + if ((dwRetErrorCode=MraFilesQueueItemFindByID(hFilesQueueHandle,dwIDRequest,&pmrafqFilesQueueItem))==NO_ERROR) + { + MRA_FILES_THREADPROC_PARAMS *pmftpp=(MRA_FILES_THREADPROC_PARAMS*)MEMALLOC(sizeof(MRA_FILES_THREADPROC_PARAMS)); + pmrafqFilesQueueItem->lpszPath=(LPSTR)MEMALLOC(dwPathSize); + pmrafqFilesQueueItem->dwPathSize=dwPathSize; + CopyMemory(pmrafqFilesQueueItem->lpszPath,lpszPath,dwPathSize); + + pmftpp->hFilesQueueHandle=hFilesQueueHandle; + pmftpp->pmrafqFilesQueueItem=pmrafqFilesQueueItem; + + pmrafqFilesQueueItem->hThread=CreateThread(0,0,MraFilesQueueRecvThreadProc,pmftpp,0,NULL); + } + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraFilesQueueDecline(HANDLE hFilesQueueHandle,DWORD dwIDRequest,LPSTR lpszDescription,SIZE_T dwDescriptionSize) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + if ((dwRetErrorCode=MraFilesQueueItemFindByID(hFilesQueueHandle,dwIDRequest,&pmrafqFilesQueueItem))==NO_ERROR) + { + char szEMail[MAX_EMAIL_LEN]; + SIZE_T dwEMailSize; + if (DB_Mra_GetStaticString(pmrafqFilesQueueItem->hContact,"e-mail",szEMail,sizeof(szEMail),&dwEMailSize)) + { + MraSendCommand_FileTransferAck(FILE_TRANSFER_STATUS_DECLINE,szEMail,dwEMailSize,dwIDRequest,lpszDescription,dwDescriptionSize); + } + ListMTItemDelete(&pmrafqFilesQueue->lmtListMT,&pmrafqFilesQueueItem->lmtListMTItem); + MraFilesQueueItemFree(pmrafqFilesQueueItem); + } + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraFilesQueueCancel(HANDLE hFilesQueueHandle,DWORD dwIDRequest,BOOL bSendDecline) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + if ((dwRetErrorCode=MraFilesQueueItemFindByID(hFilesQueueHandle,dwIDRequest,&pmrafqFilesQueueItem))==NO_ERROR) + {//***deb closesocket, send message to thread + if (bSendDecline) + { + char szEMail[MAX_EMAIL_LEN]; + SIZE_T dwEMailSize; + if (DB_Mra_GetStaticString(pmrafqFilesQueueItem->hContact,"e-mail",szEMail,sizeof(szEMail),&dwEMailSize)) + { + MraSendCommand_FileTransferAck(FILE_TRANSFER_STATUS_DECLINE,szEMail,dwEMailSize,dwIDRequest,NULL,0); + } + } + Netlib_CloseHandle(pmrafqFilesQueueItem->hConnection); + pmrafqFilesQueueItem->hConnection=NULL; + + Netlib_CloseHandle(pmrafqFilesQueueItem->hListen); + pmrafqFilesQueueItem->hListen=NULL; + + SetEvent(pmrafqFilesQueueItem->hWaitHandle); + + if (pmrafqFilesQueueItem->hThread==NULL) + { + ListMTItemDelete(&pmrafqFilesQueue->lmtListMT,&pmrafqFilesQueueItem->lmtListMTItem); + MraFilesQueueItemFree(pmrafqFilesQueueItem); + } + } + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraFilesQueueFree(HANDLE hFilesQueueHandle,DWORD dwIDRequest) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + LIST_MT_ITERATOR lmtiIterator; + + dwRetErrorCode=ERROR_NOT_FOUND; + ListMTLock(&pmrafqFilesQueue->lmtListMT); + ListMTIteratorMoveFirst(&pmrafqFilesQueue->lmtListMT,&lmtiIterator); + do + {// цикл + if (ListMTIteratorGet(&lmtiIterator,NULL,(LPVOID*)&pmrafqFilesQueueItem)==NO_ERROR) + if (pmrafqFilesQueueItem->dwIDRequest==dwIDRequest) + { + ListMTItemDelete(&pmrafqFilesQueue->lmtListMT,&pmrafqFilesQueueItem->lmtListMTItem); + MraFilesQueueItemFree(pmrafqFilesQueueItem); + dwRetErrorCode=NO_ERROR; + break; + } + }while(ListMTIteratorMoveNext(&lmtiIterator)); + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraFilesQueueSendMirror(HANDLE hFilesQueueHandle,DWORD dwIDRequest,LPSTR lpszAddreses,SIZE_T dwAddresesSize) +{ + DWORD dwRetErrorCode; + + if (hFilesQueueHandle) + { + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem; + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + if ((dwRetErrorCode=MraFilesQueueItemFindByID(hFilesQueueHandle,dwIDRequest,&pmrafqFilesQueueItem))==NO_ERROR) + {// + LPSTR lpszCurrentItem,lpszDelimiter,lpszEndItem; + SIZE_T dwAllocatedCount; + + dwAllocatedCount=ALLOCATED_COUNT; + pmrafqFilesQueueItem->dwAddrCount=0; + pmrafqFilesQueueItem->pmfqaAddreses=(MRA_FILES_QUEUE_ADDR*)MEMALLOC(sizeof(MRA_FILES_QUEUE_ADDR)*dwAllocatedCount); + lpszCurrentItem=lpszAddreses; + while(TRUE) + { + lpszEndItem=(LPSTR)MemoryFindByte((lpszCurrentItem-lpszAddreses),lpszAddreses,dwAddresesSize,';'); + if (lpszEndItem) + { + lpszDelimiter=(LPSTR)MemoryFindByte((lpszCurrentItem-lpszAddreses),lpszAddreses,dwAddresesSize,':'); + if (lpszDelimiter) + { + if (pmrafqFilesQueueItem->dwAddrCount==dwAllocatedCount) + { + dwAllocatedCount*=2; + pmrafqFilesQueueItem->pmfqaAddreses=(MRA_FILES_QUEUE_ADDR*)MEMREALLOC(pmrafqFilesQueueItem->pmfqaAddreses,(sizeof(MRA_FILES_QUEUE_ADDR)*dwAllocatedCount)); + } + + (*lpszDelimiter)=0; + pmrafqFilesQueueItem->pmfqaAddreses[pmrafqFilesQueueItem->dwAddrCount].dwIP=inet_addr(lpszCurrentItem); + pmrafqFilesQueueItem->pmfqaAddreses[pmrafqFilesQueueItem->dwAddrCount].dwPort=StrToUNum32((lpszDelimiter+1),(lpszEndItem-(lpszDelimiter+1))); + (*lpszDelimiter)=':'; + + switch(pmrafqFilesQueueItem->dwAddrCount){ + case 0: + DB_Mra_SetDword(pmrafqFilesQueueItem->hContact,"OldIP",DB_Mra_GetDword(pmrafqFilesQueueItem->hContact,"IP",0)); + DB_Mra_SetDword(pmrafqFilesQueueItem->hContact,"IP",htonl(pmrafqFilesQueueItem->pmfqaAddreses[pmrafqFilesQueueItem->dwAddrCount].dwIP)); + break; + case 1: + DB_Mra_SetDword(pmrafqFilesQueueItem->hContact,"OldRealIP",DB_Mra_GetDword(pmrafqFilesQueueItem->hContact,"RealIP",0)); + DB_Mra_SetDword(pmrafqFilesQueueItem->hContact,"RealIP",htonl(pmrafqFilesQueueItem->pmfqaAddreses[pmrafqFilesQueueItem->dwAddrCount].dwIP)); + break; + } + pmrafqFilesQueueItem->dwAddrCount++; + lpszCurrentItem=(lpszEndItem+1); + }else{ + break; + } + }else{ + break; + } + } + pmrafqFilesQueueItem->pmfqaAddreses=(MRA_FILES_QUEUE_ADDR*)MEMREALLOC(pmrafqFilesQueueItem->pmfqaAddreses,(sizeof(MRA_FILES_QUEUE_ADDR)*pmrafqFilesQueueItem->dwAddrCount)); + + pmrafqFilesQueueItem->hConnection=NULL; + SetEvent(pmrafqFilesQueueItem->hWaitHandle); + } + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + + +BOOL MraFilesQueueHandCheck(HANDLE hConnection,MRA_FILES_QUEUE_ITEM **ppmrafqFilesQueueItem) +{ + BOOL bRet=FALSE; + + if (hConnection) + { + char szEMail[MAX_EMAIL_LEN]={0},szEMailMy[MAX_EMAIL_LEN]={0}; + BYTE btBuff[((MAX_EMAIL_LEN*2)+(sizeof(MRA_FT_HELLO)*2)+8)]={0}; + SIZE_T dwEMailSize,dwEMailMySize,dwBuffSize; + + DB_Mra_GetStaticString(NULL,"e-mail",szEMailMy,sizeof(szEMailMy),&dwEMailMySize);BuffToLowerCase(szEMailMy,szEMailMy,dwEMailMySize); + + if (pmrafqFilesQueueItem->bSending==FALSE) + { + dwBuffSize=(mir_snprintf((LPSTR)btBuff,sizeof(btBuff),"%s %s",MRA_FT_HELLO,szEMailMy)+1); + if (dwBuffSize==Netlib_Send(hConnection,(LPSTR)btBuff,dwBuffSize,0)) + {// my email sended + //ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_INITIALISING,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + dwBuffSize=Netlib_Recv(hConnection,(LPSTR)btBuff,sizeof(btBuff),0); + if (ppmrafqFilesQueueItem && (*ppmrafqFilesQueueItem)) + {// have context, connecting or some times in receive + DB_Mra_GetStaticString((*ppmrafqFilesQueueItem)->hContact,"e-mail",szEMail,sizeof(szEMail),&dwEMailSize);BuffToLowerCase(szEMail,szEMail,dwEMailSize); + if ((dwEMailSize+sizeof(MRA_FT_HELLO)+1)==dwBuffSize) + {// email received + mir_snprintf(((LPSTR)btBuff+dwBuffSize),(sizeof(btBuff)-dwBuffSize),"%s %s",MRA_FT_HELLO,szEMail); + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,(LPSTR)btBuff,dwBuffSize,((LPSTR)btBuff+dwBuffSize),dwBuffSize)==CSTR_EQUAL) + {// email verifyed + bRet=TRUE; + } + } + }else{// some times on receive pExtra=NULL, and we looking for context + if (dwBuffSize!=SOCKET_ERROR && dwBuffSize>sizeof(MRA_FT_HELLO)) + {// readed + if (MraFilesQueueItemFindByEMail(HANDLE hFilesQueueHandle,((LPSTR)btBuff+sizeof(MRA_FT_HELLO)),(dwBuffSize-(sizeof(MRA_FT_HELLO)+1)),ppmrafqFilesQueueItem)==NO_ERROR) + {// email verifyed + bRet=TRUE; + } + } + } + } + }else{ + dwBuffSize=Netlib_Recv(hConnection,(LPSTR)btBuff,sizeof(btBuff),0); + if (ppmrafqFilesQueueItem && (*ppmrafqFilesQueueItem)) + {// have context, connecting or some times in receive + DB_Mra_GetStaticString((*ppmrafqFilesQueueItem)->hContact,"e-mail",szEMail,sizeof(szEMail),&dwEMailSize);BuffToLowerCase(szEMail,szEMail,dwEMailSize); + if ((dwEMailSize+sizeof(MRA_FT_HELLO)+1)==dwBuffSize) + {// email received + ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_INITIALISING,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + mir_snprintf(((LPSTR)btBuff+dwBuffSize),(sizeof(btBuff)-dwBuffSize),"%s %s",MRA_FT_HELLO,szEMail); + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,(LPSTR)btBuff,dwBuffSize,((LPSTR)btBuff+dwBuffSize),dwBuffSize)==CSTR_EQUAL) + {// email verifyed + dwBuffSize=(mir_snprintf((LPSTR)btBuff,sizeof(btBuff),"%s %s",MRA_FT_HELLO,szEMailMy)+1); + if (dwBuffSize==Netlib_Send(hConnection,(LPSTR)btBuff,dwBuffSize,0)) + {// my email sended + bRet=TRUE; + } + } + } + }else{// some times on receive pExtra=NULL, and we looking for context + if (dwBuffSize!=SOCKET_ERROR && dwBuffSize>sizeof(MRA_FT_HELLO)) + {// readed + if (MraFilesQueueItemFindByEMail(HANDLE hFilesQueueHandle,((LPSTR)btBuff+sizeof(MRA_FT_HELLO)),(dwBuffSize-(sizeof(MRA_FT_HELLO)+1)),ppmrafqFilesQueueItem)==NO_ERROR) + {// email verifyed + ProtoBroadcastAck(PROTOCOL_NAME,(*ppmrafqFilesQueueItem)->hContact,ACKTYPE_FILE,ACKRESULT_INITIALISING,(HANDLE)(*ppmrafqFilesQueueItem)->dwIDRequest,0); + dwBuffSize=(mir_snprintf((LPSTR)btBuff,sizeof(btBuff),"%s %s",MRA_FT_HELLO,szEMailMy)+1); + if (dwBuffSize==Netlib_Send(hConnection,(LPSTR)btBuff,dwBuffSize,0)) + {// my email sended + bRet=TRUE; + } + } + } + } + } + } +return(bRet); +} + + +HANDLE MraFilesQueueConnectOut(MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem) +{ + if ((pmrafqFilesQueueItem->bSending==FALSE && DB_Mra_GetByte(NULL,"FileSendNoOutConnOnRcv",MRA_DEF_FS_NO_OUT_CONN_ON_RCV)==FALSE) || (pmrafqFilesQueueItem->bSending==TRUE && DB_Mra_GetByte(NULL,"FileSendNoOutConnOnSend",MRA_DEF_FS_NO_OUT_CONN_ON_SEND)==FALSE)) + { + BOOL bFiltering=FALSE; + DWORD dwLocalPort=0; + SIZE_T i; + NETLIBOPENCONNECTION nloc={0}; + + nloc.cbSize=sizeof(nloc); + nloc.flags=NLOCF_V2; + if (DB_Mra_GetByte(NULL,"FileSendIgnoryAdditionalPorts",MRA_DEF_FS_IGNORY_ADDITIONAL_PORTS)) + {// фильтруем порты для одного IP, вместо 3 будем коннектится только к одному + switch(DB_Mra_GetWord(NULL,"ServerPort",MRA_DEFAULT_SERVER_PORT)){ + case MRA_SERVER_PORT_STANDART_NLB: + dwLocalPort=MRA_SERVER_PORT_STANDART; + break; + case MRA_SERVER_PORT_HTTPS: + dwLocalPort=MRA_SERVER_PORT_HTTPS; + break; + default: + dwLocalPort=DB_Mra_GetWord(NULL,"ServerPort",MRA_DEFAULT_SERVER_PORT); + break; + } + + for(i=0;idwAddrCount;i++) + {// Set up the sockaddr structure + if (dwLocalPort==pmrafqFilesQueueItem->pmfqaAddreses[i].dwPort) + { + bFiltering=TRUE; + break; + } + } + } + + for(i=0;idwAddrCount;i++) + {// Set up the sockaddr structure + if (dwLocalPort==pmrafqFilesQueueItem->pmfqaAddreses[i].dwPort || bFiltering==FALSE) + { + nloc.szHost=inet_ntoa((*((in_addr*)&pmrafqFilesQueueItem->pmfqaAddreses[i].dwIP))); + nloc.wPort=(WORD)pmrafqFilesQueueItem->pmfqaAddreses[i].dwPort; + + ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_CONNECTING,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + if ((pmrafqFilesQueueItem->hConnection=(HANDLE)CallService(MS_NETLIB_OPENCONNECTION,(WPARAM)masMraSettings.hNetlibUser,(LPARAM)&nloc))) + { + ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_CONNECTED,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + if (MraFilesQueueHandCheck(pmrafqFilesQueueItem->hConnection,&pmrafqFilesQueueItem)) + {// связь установленная с тем кем нужно + break; + }else{// кажется не туда подключились :) + ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_CONNECTING,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + Netlib_CloseHandle(pmrafqFilesQueueItem->hConnection); + pmrafqFilesQueueItem->hConnection=NULL; + } + } + } + } + } +return(pmrafqFilesQueueItem->hConnection); +} + + +HANDLE MraFilesQueueConnectIn(MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem) +{ + char szEMail[MAX_EMAIL_LEN],szAddrList[2048]={0}; + SIZE_T dwEMailSize,dwAddrListSize; + NETLIBBIND nlbBind={0}; + + nlbBind.cbSize=sizeof(nlbBind); + nlbBind.pfnNewConnectionV2=MraFilesQueueConnectionReceived; + nlbBind.wPort=0; + nlbBind.pExtra=(LPVOID)pmrafqFilesQueueItem; + + if (DB_Mra_GetStaticString(pmrafqFilesQueueItem->hContact,"e-mail",szEMail,sizeof(szEMail),&dwEMailSize)) + if ((pmrafqFilesQueueItem->hListen=(HANDLE)CallService(MS_NETLIB_BINDPORT,(WPARAM)masMraSettings.hNetlibUser,(LPARAM)&nlbBind))) + { + dwAddrListSize=MraFilesQueueGetLocalAddressesList(szAddrList,sizeof(szAddrList),nlbBind.wPort); + if (dwAddrListSize) + { + pmrafqFilesQueueItem->hWaitHandle=CreateEvent(NULL,TRUE,FALSE,NULL); + if (pmrafqFilesQueueItem->bSending==FALSE) + {// запрашиваем зеркальное соединение + MraSendCommand_FileTransferAck(FILE_TRANSFER_MIRROR,szEMail,dwEMailSize,pmrafqFilesQueueItem->dwIDRequest,szAddrList,dwAddrListSize); + }else{// здесь отправляем запрос на передачу(установление соединения) + LPSTR lpszFiles,lpszFileName,lpszCurPos; + SIZE_T i,dwFilesSize=((MAX_PATH*2)*pmrafqFilesQueueItem->dwFilesCount); + + lpszFiles=(LPSTR)MEMALLOC(dwFilesSize); + if (lpszFiles) + { + lpszCurPos=lpszFiles; + for(i=0;idwFilesCount;i++) + { + GetFullPathName(pmrafqFilesQueueItem->pmfqfFiles[i].lpszName,MAX_PATH,pmrafqFilesQueueItem->pmfqfFiles[i].lpszName,&lpszFileName); + lpszCurPos+=mir_snprintf(lpszCurPos,(dwFilesSize-(lpszCurPos-lpszFiles)),"%s;%ld;",lpszFileName,pmrafqFilesQueueItem->pmfqfFiles[i].dwSize); + } + MraSendCommand_FileTransfer(szEMail,dwEMailSize,pmrafqFilesQueueItem->dwIDRequest,pmrafqFilesQueueItem->dwFilesTotalSize,lpszFiles,(lpszCurPos-lpszFiles),pmrafqFilesQueueItem->lpszDescription,pmrafqFilesQueueItem->dwDescriptionSize,szAddrList,dwAddrListSize); + MEMFREE(lpszFiles); + } + } + + WaitForSingleObject(pmrafqFilesQueueItem->hWaitHandle,INFINITE); + CloseHandle(pmrafqFilesQueueItem->hWaitHandle); + pmrafqFilesQueueItem->hWaitHandle=NULL; + Netlib_CloseHandle(pmrafqFilesQueueItem->hListen); + pmrafqFilesQueueItem->hListen=NULL; + } + } +return(pmrafqFilesQueueItem->hConnection); +} + +// This function is called from the Netlib when someone is connecting to +// one of our incomming DC ports +void MraFilesQueueConnectionReceived(HANDLE hNewConnection,DWORD dwRemoteIP,void *pExtra) +{ + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem=(MRA_FILES_QUEUE_ITEM*)pExtra; + + if (MraFilesQueueHandCheck(hNewConnection,&pmrafqFilesQueueItem)) + {// связь установленная с тем кем нужно + pmrafqFilesQueueItem->hConnection=hNewConnection; + ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_CONNECTED,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + DB_Mra_SetDword(pmrafqFilesQueueItem->hContact,"OldIP",DB_Mra_GetDword(pmrafqFilesQueueItem->hContact,"IP",0)); + DB_Mra_SetDword(pmrafqFilesQueueItem->hContact,"IP",dwRemoteIP); + SetEvent(pmrafqFilesQueueItem->hWaitHandle); + }else{// кажется кто то не туда подключилися :) + if (pmrafqFilesQueueItem) ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_CONNECTING,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + Netlib_CloseHandle(hNewConnection); + } + + if (pExtra==NULL) + { + MraPopupShowFromAgent(MRA_POPUP_TYPE_DEBUG,0,"MraFilesQueueConnectionReceived: connection accepted, but pExtra=NULL, this is miranda bug."); + DebugBreak(); + } +} + + + +DWORD WINAPI MraFilesQueueRecvThreadProc(LPVOID lpParameter) +{ + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)((MRA_FILES_THREADPROC_PARAMS*)lpParameter)->hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem=((MRA_FILES_THREADPROC_PARAMS*)lpParameter)->pmrafqFilesQueueItem; + + char szFileName[MAX_FILEPATH]={0}; + BYTE btBuff[65536]; + BOOL bFailed=TRUE,bOK,bConnected=FALSE; + DWORD dwWritten,dwReceived,dwUpdateTimeNext,dwUpdateTimeCur; + HANDLE hFile; + SIZE_T i,dwBuffSize; + PROTOFILETRANSFERSTATUS pfts={0}; + + + MEMFREE(lpParameter); + pfts.cbSize=sizeof(pfts); + pfts.hContact=pmrafqFilesQueueItem->hContact; + pfts.sending=pmrafqFilesQueueItem->bSending; //true if sending, false if receiving + //pfts.files; + pfts.totalFiles=pmrafqFilesQueueItem->dwFilesCount; + pfts.currentFileNumber=0; + pfts.totalBytes=pmrafqFilesQueueItem->dwFilesTotalSize; + pfts.totalProgress=0; + pfts.workingDir=pmrafqFilesQueueItem->lpszPath; + //pfts.currentFile; + //pfts.currentFileSize; + //pfts.currentFileProgress; + //pfts.currentFileTime; //as seconds since 1970 + + + CallService(MS_SYSTEM_THREAD_PUSH,0,0); + //ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_CONNECTING,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + + if (MraFilesQueueConnectOut(pmrafqFilesQueueItem)) + { + bConnected=TRUE; + }else{ + if (MraFilesQueueConnectIn(pmrafqFilesQueueItem)) bConnected=TRUE; + } + + if (bConnected) + {// email verifyed + bFailed=FALSE; + for(i=0;idwFilesCount;i++) + {// receiving files + ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_NEXTFILE,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + dwBuffSize=(mir_snprintf((LPSTR)btBuff,sizeof(btBuff),"%s %s",MRA_FT_GET_FILE,pmrafqFilesQueueItem->pmfqfFiles[i].lpszName)+1); + if (dwBuffSize==Netlib_Send(pmrafqFilesQueueItem->hConnection,(LPSTR)btBuff,dwBuffSize,0)) + {// file request sended + mir_snprintf(szFileName,sizeof(szFileName),"%s%s",pmrafqFilesQueueItem->lpszPath,pmrafqFilesQueueItem->pmfqfFiles[i].lpszName); + hFile=CreateFile(szFileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); + if (hFile!=INVALID_HANDLE_VALUE) + { + bOK=FALSE; + dwWritten=0; + dwUpdateTimeNext=GetTickCount(); + pfts.currentFileNumber=i; + pfts.currentFile=pmrafqFilesQueueItem->pmfqfFiles[i].lpszName; + pfts.currentFileSize=pmrafqFilesQueueItem->pmfqfFiles[i].dwSize; + pfts.currentFileProgress=0; + //pfts.currentFileTime; //as seconds since 1970 + ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_DATA,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,(LPARAM)&pfts); + + // pre allocating disk space, best perfomance + SetFilePointer(hFile,pmrafqFilesQueueItem->pmfqfFiles[i].dwSize,NULL,FILE_BEGIN); + SetEndOfFile(hFile); + SetFilePointer(hFile,0,NULL,FILE_BEGIN); + + while(TRUE) + { + dwReceived=Netlib_Recv(pmrafqFilesQueueItem->hConnection,(LPSTR)&btBuff,sizeof(btBuff),0); + if (dwReceived==0 || dwReceived==SOCKET_ERROR) + { + dwWritten=0; + break; + }else{ + WriteFile(hFile,(LPVOID)&btBuff,dwReceived,&dwReceived,NULL); + dwWritten+=dwReceived; + pfts.totalProgress+=dwReceived; + if (dwWritten>=pmrafqFilesQueueItem->pmfqfFiles[i].dwSize) + { + dwUpdateTimeNext=GetTickCount();// force stat update + bOK=TRUE; + break; + } + + // progress updates + dwUpdateTimeCur=GetTickCount(); + if (dwUpdateTimeNext<=dwUpdateTimeCur) + {// we update it + dwUpdateTimeNext=dwUpdateTimeCur+MRA_FILES_QUEUE_PROGRESS_INTERVAL; + pfts.currentFileProgress=dwWritten; + ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_DATA,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,(LPARAM)&pfts); + } + } + }// end while + CloseHandle(hFile); + + if (bOK==FALSE) + {// file recv failed + DeleteFile(szFileName); + bFailed=TRUE; + break; + } + }else{// err on write file + bFailed=TRUE; + break; + } + }else{//err + break; + } + }// end for + + Netlib_CloseHandle(pmrafqFilesQueueItem->hConnection); + pmrafqFilesQueueItem->hConnection=NULL; + } + + if (bFailed) + { + char szEMail[MAX_EMAIL_LEN]; + SIZE_T dwEMailSize; + if (DB_Mra_GetStaticString(pmrafqFilesQueueItem->hContact,"e-mail",szEMail,sizeof(szEMail),&dwEMailSize)) + { + MraSendCommand_FileTransferAck(FILE_TRANSFER_STATUS_DECLINE,szEMail,dwEMailSize,pmrafqFilesQueueItem->dwIDRequest,NULL,0); + } + ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_FAILED,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + }else{ + ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_SUCCESS,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + } + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + ListMTItemDelete(&pmrafqFilesQueue->lmtListMT,&pmrafqFilesQueueItem->lmtListMTItem); + CloseHandle(pmrafqFilesQueueItem->hThread); + MraFilesQueueItemFree(pmrafqFilesQueueItem); + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + + CallService(MS_SYSTEM_THREAD_POP,0,0); + ExitThread(NO_ERROR); +return(0); +} + + + +DWORD WINAPI MraFilesQueueSendThreadProc(LPVOID lpParameter) +{ + MRA_FILES_QUEUE *pmrafqFilesQueue=(MRA_FILES_QUEUE*)((MRA_FILES_THREADPROC_PARAMS*)lpParameter)->hFilesQueueHandle; + MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem=((MRA_FILES_THREADPROC_PARAMS*)lpParameter)->pmrafqFilesQueueItem; + + BYTE btBuff[65536]; + BOOL bFailed=TRUE,bOK,bConnected=FALSE; + DWORD dwReceived,dwSended,dwSendBlockSize,dwUpdateTimeNext,dwUpdateTimeCur; + HANDLE hFile; + SIZE_T i,j,dwBuffSize=0; + LPSTR lpszFileName; + PROTOFILETRANSFERSTATUS pfts={0}; + + + MEMFREE(lpParameter); + pfts.cbSize=sizeof(pfts); + pfts.hContact=pmrafqFilesQueueItem->hContact; + pfts.sending=pmrafqFilesQueueItem->bSending; //true if sending, false if receiving + //pfts.files; + pfts.totalFiles=pmrafqFilesQueueItem->dwFilesCount; + pfts.currentFileNumber=0; + pfts.totalBytes=pmrafqFilesQueueItem->dwFilesTotalSize; + pfts.totalProgress=0; + pfts.workingDir=pmrafqFilesQueueItem->lpszPath; + //pfts.currentFile; + //pfts.currentFileSize; + //pfts.currentFileProgress; + //pfts.currentFileTime; //as seconds since 1970 + dwSendBlockSize=DB_Mra_GetDword(NULL,"FileSendBlockSize",MRA_DEFAULT_FILE_SEND_BLOCK_SIZE); + if (dwSendBlockSize>sizeof(btBuff)) dwSendBlockSize=sizeof(btBuff); + if (dwSendBlockSize<512) dwSendBlockSize=MRA_DEFAULT_FILE_SEND_BLOCK_SIZE; + + + CallService(MS_SYSTEM_THREAD_PUSH,0,0); + //ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_SENTREQUEST,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + + if (MraFilesQueueConnectIn(pmrafqFilesQueueItem)) + { + bConnected=TRUE; + }else{ + if (MraFilesQueueConnectOut(pmrafqFilesQueueItem)) bConnected=TRUE; + } + + if (bConnected) + {// email verifyed + bFailed=FALSE; + for(i=0;idwFilesCount;i++) + {// seiding files + ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_NEXTFILE,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + + dwBuffSize=0; + while(TRUE) + { + dwReceived=Netlib_Recv(pmrafqFilesQueueItem->hConnection,((LPSTR)btBuff+dwBuffSize),(sizeof(btBuff)-dwBuffSize),0); + if (dwReceived==0 || dwReceived==SOCKET_ERROR) + { + bFailed=TRUE; + break; + }else{ + dwBuffSize+=dwReceived; + if (MemoryFindByte((dwBuffSize-dwReceived),btBuff,dwBuffSize,0)) break; + } + }// end while (file name passible received)*/ + + if (bFailed==FALSE) + {// ...received + if (dwBuffSize>(sizeof(MRA_FT_GET_FILE)+1)) + {// file name received + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,(LPSTR)btBuff,(sizeof(MRA_FT_GET_FILE)-1),MRA_FT_GET_FILE,(sizeof(MRA_FT_GET_FILE)-1))==CSTR_EQUAL) + {// MRA_FT_GET_FILE verifyed + bFailed=TRUE; + for(j=0;jdwFilesCount;j++) + { + if (GetFullPathName(pmrafqFilesQueueItem->pmfqfFiles[j].lpszName,(pmrafqFilesQueueItem->pmfqfFiles[j].dwNameLen+1),pmrafqFilesQueueItem->pmfqfFiles[j].lpszName,&lpszFileName)) + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,(((LPSTR)btBuff)+sizeof(MRA_FT_GET_FILE)),(dwBuffSize-(sizeof(MRA_FT_GET_FILE)+1)),lpszFileName,-1)==CSTR_EQUAL) + { + bFailed=FALSE; + break; + } + } + + if (bFailed==FALSE) + { + hFile=CreateFile(pmrafqFilesQueueItem->pmfqfFiles[j].lpszName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,(FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN),NULL); + if (hFile!=INVALID_HANDLE_VALUE) + { + bOK=FALSE; + dwUpdateTimeNext=GetTickCount(); + pfts.currentFileNumber=i; + pfts.currentFile=pmrafqFilesQueueItem->pmfqfFiles[j].lpszName; + pfts.currentFileSize=pmrafqFilesQueueItem->pmfqfFiles[j].dwSize; + pfts.currentFileProgress=0; + //pfts.currentFileTime; //as seconds since 1970 + ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_DATA,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,(LPARAM)&pfts); + + while(TRUE) + {// read and sending + if (ReadFile(hFile,btBuff,dwSendBlockSize,&dwBuffSize,NULL)) + { + dwSended=Netlib_Send(pmrafqFilesQueueItem->hConnection,(LPSTR)btBuff,dwBuffSize,0); + if (dwSended==0 || dwSended==SOCKET_ERROR) + { + break; + }else{ + pfts.currentFileProgress+=dwSended; + pfts.totalProgress+=dwSended; + if (pfts.currentFileProgress>=pmrafqFilesQueueItem->pmfqfFiles[j].dwSize) + { + dwUpdateTimeNext=GetTickCount();// force stat update + bOK=TRUE; + break; + } + + // progress updates + dwUpdateTimeCur=GetTickCount(); + if (dwUpdateTimeNext<=dwUpdateTimeCur) + {// we update it + dwUpdateTimeNext=dwUpdateTimeCur+MRA_FILES_QUEUE_PROGRESS_INTERVAL; + //pfts.currentFileProgress=dwSended; + ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_DATA,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,(LPARAM)&pfts); + } + } + }else{// read failure + break; + } + }// end while + CloseHandle(hFile); + + if (bOK==FALSE) + {// file recv failed + bFailed=TRUE; + break; + } + ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_DATA,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,(LPARAM)&pfts); + }else{// err on read file + bFailed=TRUE; + break; + } + }else{ + break; + } + }else{// err on receive, trash + bFailed=TRUE; + break; + } + }else{// bad file name or trash + bFailed=TRUE; + break; + } + }else{// err on receive + bFailed=TRUE; + break; + } + }// end for + + Netlib_CloseHandle(pmrafqFilesQueueItem->hConnection); + pmrafqFilesQueueItem->hConnection=NULL; + } + + if (bFailed) + { + char szEMail[MAX_EMAIL_LEN]; + SIZE_T dwEMailSize; + if (DB_Mra_GetStaticString(pmrafqFilesQueueItem->hContact,"e-mail",szEMail,sizeof(szEMail),&dwEMailSize)) + { + MraSendCommand_FileTransferAck(FILE_TRANSFER_STATUS_DECLINE,szEMail,dwEMailSize,pmrafqFilesQueueItem->dwIDRequest,NULL,0); + } + ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_FAILED,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + }else{ + ProtoBroadcastAck(PROTOCOL_NAME,pmrafqFilesQueueItem->hContact,ACKTYPE_FILE,ACKRESULT_SUCCESS,(HANDLE)pmrafqFilesQueueItem->dwIDRequest,0); + } + + ListMTLock(&pmrafqFilesQueue->lmtListMT); + ListMTItemDelete(&pmrafqFilesQueue->lmtListMT,&pmrafqFilesQueueItem->lmtListMTItem); + CloseHandle(pmrafqFilesQueueItem->hThread); + MraFilesQueueItemFree(pmrafqFilesQueueItem); + ListMTUnLock(&pmrafqFilesQueue->lmtListMT); + + CallService(MS_SYSTEM_THREAD_POP,0,0); + ExitThread(NO_ERROR); +return(0); +} diff --git a/MRA/MraIcons.cpp b/MRA/MraIcons.cpp new file mode 100644 index 0000000..18b8f8c --- /dev/null +++ b/MRA/MraIcons.cpp @@ -0,0 +1,151 @@ +#include "Mra.h" +#include "MraIcons.h" + + + + +void AddIcoLibItems(LPWSTR lpwszRootSectionName,LPWSTR lpwszSubSectionName,const GUI_DISPLAY_ITEM *pgdiItems,SIZE_T dwCount,HANDLE *hResult) +{ + char szBuff[MAX_PATH]; + WCHAR wszSection[MAX_PATH],wszPath[MAX_FILEPATH]; + SKINICONDESC sid={0}; + + + sid.cbSize=SKINICONDESC_SIZE; + sid.pwszSection=wszSection; + sid.pwszDefaultFile=wszPath; + sid.cx=sid.cy=16; + sid.flags=SIDF_ALL_UNICODE; + + if (lpwszSubSectionName==NULL) lpwszSubSectionName=L""; + GetModuleFileName(masMraSettings.hInstance,wszPath,SIZEOF(wszPath)); + mir_sntprintf(wszSection,SIZEOF(wszSection),L"%s%s%s",lpwszRootSectionName,PROTOCOL_NAMEW,lpwszSubSectionName); + + for (SIZE_T i=0;i 1000 +#pragma once +#endif // _MSC_VER > 1000 + + +HICON IconLibGetIcon(HANDLE hIcon); +HICON IconLibGetIconEx(HANDLE hIcon,DWORD dwFlags); + +void IconsLoad(); +void IconsUnLoad(); + +void InitXStatusIcons(); +void DestroyXStatusIcons(); + + +#endif // !defined(AFX_MRA_ICONS_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) \ No newline at end of file diff --git a/MRA/MraMPop.cpp b/MRA/MraMPop.cpp new file mode 100644 index 0000000..ad51018 --- /dev/null +++ b/MRA/MraMPop.cpp @@ -0,0 +1,241 @@ +#include "Mra.h" +#include "MraMPop.h" + + + + +// MPOP_SESSION +typedef struct +{ + FIFO_MT ffmtQueueToQuery; + BOOL bKeyValid; + LPSTR lpszMPOPKey; + SIZE_T dwMPOPKeySize; +} MRA_MPOP_SESSION_QUEUE; + + +typedef struct +{ + FIFO_MT_ITEM ffmtiFifoItem; + LPSTR lpszUrl; + SIZE_T dwUrlSize; +} MRA_MPOP_SESSION_QUEUE_ITEM; + + + +void MraMPopSessionQueueClear (HANDLE hMPopSessionQueue); + + + + +DWORD MraMPopSessionQueueInitialize(HANDLE *phMPopSessionQueue) +{ + DWORD dwRetErrorCode; + + if (phMPopSessionQueue) + { + MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue; + + pmpsqMPopSessionQueue=(MRA_MPOP_SESSION_QUEUE*)MEMALLOC(sizeof(MRA_MPOP_SESSION_QUEUE)); + if (pmpsqMPopSessionQueue) + { + pmpsqMPopSessionQueue->bKeyValid=FALSE; + pmpsqMPopSessionQueue->lpszMPOPKey=NULL; + pmpsqMPopSessionQueue->dwMPOPKeySize=0; + FifoMTInitialize(&pmpsqMPopSessionQueue->ffmtQueueToQuery,0); + + (*phMPopSessionQueue)=(HANDLE)pmpsqMPopSessionQueue; + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=GetLastError(); + } + }else{ + dwRetErrorCode=ERROR_ALREADY_INITIALIZED; + } +return(dwRetErrorCode); +} + + +void MraMPopSessionQueueClear(HANDLE hMPopSessionQueue) +{ + if (hMPopSessionQueue) + { + MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue=(MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue; + MRA_MPOP_SESSION_QUEUE_ITEM *pmpsqi; + + pmpsqMPopSessionQueue->bKeyValid=FALSE; + MEMFREE(pmpsqMPopSessionQueue->lpszMPOPKey); + pmpsqMPopSessionQueue->dwMPOPKeySize=0; + while(FifoMTItemPop(&pmpsqMPopSessionQueue->ffmtQueueToQuery,NULL,(LPVOID*)&pmpsqi)==NO_ERROR) MEMFREE(pmpsqi); + } +} + + +void MraMPopSessionQueueFlush(HANDLE hMPopSessionQueue) +{ + if (hMPopSessionQueue) + { + MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue=(MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue; + + while(FifoMTGetCount(&pmpsqMPopSessionQueue->ffmtQueueToQuery)) + { + MraMPopSessionQueueSetNewMPopKey(hMPopSessionQueue,NULL,0); + MraMPopSessionQueueStart(hMPopSessionQueue); + } + } +} + + +void MraMPopSessionQueueDestroy(HANDLE hMPopSessionQueue) +{ + if (hMPopSessionQueue) + { + MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue=(MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue; + MraMPopSessionQueueClear(hMPopSessionQueue); + FifoMTDestroy(&pmpsqMPopSessionQueue->ffmtQueueToQuery); + MEMFREE(pmpsqMPopSessionQueue); + } +} + + +DWORD MraMPopSessionQueueAddUrl(HANDLE hMPopSessionQueue,LPSTR lpszUrl,SIZE_T dwUrlSize) +{ + DWORD dwRetErrorCode; + + if (hMPopSessionQueue && lpszUrl && dwUrlSize) + { + MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue=(MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue; + MRA_MPOP_SESSION_QUEUE_ITEM *pmpsqi=(MRA_MPOP_SESSION_QUEUE_ITEM*)MEMALLOC((sizeof(MRA_MPOP_SESSION_QUEUE_ITEM)+dwUrlSize+sizeof(SIZE_T))); + + if (pmpsqi) + { + pmpsqi->dwUrlSize=dwUrlSize; + pmpsqi->lpszUrl=(LPSTR)(pmpsqi+1); + memmove(pmpsqi->lpszUrl,lpszUrl,dwUrlSize); + FifoMTItemPush(&pmpsqMPopSessionQueue->ffmtQueueToQuery,&pmpsqi->ffmtiFifoItem,(LPVOID)pmpsqi); + if (pmpsqMPopSessionQueue->bKeyValid) + { + dwRetErrorCode=MraMPopSessionQueueStart(hMPopSessionQueue); + }else{ + if (masMraSettings.bLoggedIn) + { + MraSendCMD(MRIM_CS_GET_MPOP_SESSION,NULL,0); + }else{ + MraMPopSessionQueueFlush(hMPopSessionQueue); + } + dwRetErrorCode=NO_ERROR; + } + }else{ + dwRetErrorCode=GetLastError(); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraMPopSessionQueueAddUrlAndEMail(HANDLE hMPopSessionQueue,LPSTR lpszUrl,SIZE_T dwUrlSize,LPSTR lpszEMail,SIZE_T dwEMailSize) +{ + DWORD dwRetErrorCode; + + if (hMPopSessionQueue && lpszUrl && dwUrlSize && lpszEMail && dwEMailSize) + { + char szUrl[BUFF_SIZE_URL],szEMail[MAX_EMAIL_LEN]; + LPSTR lpszUser,lpszDomain; + + dwRetErrorCode=ERROR_INVALID_DATA; + BuffToLowerCase(szEMail,lpszEMail,dwEMailSize); + lpszDomain=(LPSTR)MemoryFindByte(0,szEMail,dwEMailSize,'@'); + if (lpszDomain) + if (lpszUser=(LPSTR)MemoryFindByte((lpszDomain-szEMail),szEMail,dwEMailSize,'.')) + { + (*lpszUser)=0; + lpszUser=szEMail; + (*lpszDomain)=0; + lpszDomain++; + + dwUrlSize=mir_snprintf(szUrl,SIZEOF(szUrl),"%s/%s/%s",lpszUrl,lpszDomain,lpszUser); + dwRetErrorCode=MraMPopSessionQueueAddUrl(hMPopSessionQueue,szUrl,dwUrlSize); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + +DWORD MraMPopSessionQueueStart(HANDLE hMPopSessionQueue) +{ + DWORD dwRetErrorCode; + + if (hMPopSessionQueue) + { + MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue=(MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue; + MRA_MPOP_SESSION_QUEUE_ITEM *pmpsqi; + + dwRetErrorCode=NO_ERROR; + if (pmpsqMPopSessionQueue->bKeyValid==TRUE) + if (FifoMTItemPop(&pmpsqMPopSessionQueue->ffmtQueueToQuery,NULL,(LPVOID*)&pmpsqi)==NO_ERROR) + { + char szUrl[BUFF_SIZE_URL],szEMail[MAX_EMAIL_LEN]; + SIZE_T dwUrlSize,dwEMailSize; + + if (DB_Mra_GetStaticStringA(NULL,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + pmpsqMPopSessionQueue->bKeyValid=FALSE; + BuffToLowerCase(szEMail,szEMail,dwEMailSize); + dwUrlSize=mir_snprintf(szUrl,SIZEOF(szUrl),MRA_MPOP_AUTH_URL,szEMail,pmpsqMPopSessionQueue->lpszMPOPKey,pmpsqi->lpszUrl); + + CallService(MS_UTILS_OPENURL,TRUE,(LPARAM)szUrl); + DebugPrint(L"Opening URL: ");DebugPrintCRLFA(szUrl); + //MraSendCMD(MRIM_CS_GET_MPOP_SESSION,NULL,0); + } + MEMFREE(pmpsqi); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraMPopSessionQueueSetNewMPopKey(HANDLE hMPopSessionQueue,LPSTR lpszKey,SIZE_T dwKeySize) +{ + DWORD dwRetErrorCode; + + if (hMPopSessionQueue) + { + MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue=(MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue; + + if (lpszKey==NULL) dwKeySize=0; + if (pmpsqMPopSessionQueue->dwMPOPKeySizelpszMPOPKey); + pmpsqMPopSessionQueue->lpszMPOPKey=(LPSTR)MEMALLOC(dwKeySize+sizeof(SIZE_T)); + } + + if (pmpsqMPopSessionQueue->lpszMPOPKey) + { + pmpsqMPopSessionQueue->bKeyValid=TRUE; + pmpsqMPopSessionQueue->dwMPOPKeySize=dwKeySize; + memmove(pmpsqMPopSessionQueue->lpszMPOPKey,lpszKey,dwKeySize); + (*(pmpsqMPopSessionQueue->lpszMPOPKey+dwKeySize))=0; + + DebugPrint(L"New MPOP session key: ");DebugPrintCRLFA(pmpsqMPopSessionQueue->lpszMPOPKey); + dwRetErrorCode=NO_ERROR; + }else{ + pmpsqMPopSessionQueue->bKeyValid=FALSE; + pmpsqMPopSessionQueue->lpszMPOPKey=NULL; + pmpsqMPopSessionQueue->dwMPOPKeySize=0; + dwRetErrorCode=GetLastError(); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + + + + diff --git a/MRA/MraMPop.h b/MRA/MraMPop.h new file mode 100644 index 0000000..8d04e06 --- /dev/null +++ b/MRA/MraMPop.h @@ -0,0 +1,26 @@ +#if !defined(AFX_MRA_MPOP_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) +#define AFX_MRA_MPOP_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + + +DWORD MraMPopSessionQueueInitialize (HANDLE *phMPopSessionQueue); +void MraMPopSessionQueueDestroy (HANDLE hMPopSessionQueue); +void MraMPopSessionQueueFlush (HANDLE hMPopSessionQueue); +DWORD MraMPopSessionQueueAddUrl (HANDLE hMPopSessionQueue,LPSTR lpszUrl,SIZE_T dwUrlSize); +DWORD MraMPopSessionQueueAddUrlAndEMail (HANDLE hMPopSessionQueue,LPSTR lpszUrl,SIZE_T dwUrlSize,LPSTR lpszEMail,SIZE_T dwEMailSize); +DWORD MraMPopSessionQueueStart (HANDLE hMPopSessionQueue); +DWORD MraMPopSessionQueueSetNewMPopKey (HANDLE hMPopSessionQueue,LPSTR lpszKey,SIZE_T dwKeySize); + + + + + + + +#endif // !defined(AFX_MRA_MPOP_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/MRA/MraMRIMProxy.cpp b/MRA/MraMRIMProxy.cpp new file mode 100644 index 0000000..296cd5f --- /dev/null +++ b/MRA/MraMRIMProxy.cpp @@ -0,0 +1,239 @@ +#include "Mra.h" +#include "MraMRIMProxy.h" +#include "proto.h" + + + +typedef struct +{ + LPSTR lpszEMail; // LPS to + SIZE_T dwEMailSize; + DWORD dwIDRequest; // DWORD id_request + DWORD dwDataType; // DWORD data_type + LPSTR lpszUserData; // LPS user_data + SIZE_T dwUserDataSize; + MRA_ADDR_LIST malAddrList; // LPS lps_ip_port + MRA_GUID mguidSessionID; // DWORD session_id[4] + HANDLE hConnection; + HANDLE hWaitHandle; // internal +} MRA_MRIMPROXY_DATA; + + + +HANDLE MraMrimProxyCreate() +{ + MRA_MRIMPROXY_DATA *pmmpd=(MRA_MRIMPROXY_DATA*)MEMALLOC(sizeof(MRA_MRIMPROXY_DATA)); +return((HANDLE)pmmpd); +} + + +DWORD MraMrimProxySetData(HANDLE hMraMrimProxyData,LPSTR lpszEMail,SIZE_T dwEMailSize,DWORD dwIDRequest,DWORD dwDataType,LPSTR lpszUserData,SIZE_T dwUserDataSize,LPSTR lpszAddreses,SIZE_T dwAddresesSize,MRA_GUID *pmguidSessionID) +{ + DWORD dwRetErrorCode; + + if (hMraMrimProxyData) + { + MRA_MRIMPROXY_DATA *pmmpd=(MRA_MRIMPROXY_DATA*)hMraMrimProxyData; + + if (lpszEMail && dwEMailSize) + { + MEMFREE(pmmpd->lpszEMail); + pmmpd->lpszEMail=(LPSTR)MEMALLOC(dwEMailSize); + memmove(pmmpd->lpszEMail,lpszEMail,dwEMailSize); + pmmpd->dwEMailSize=dwEMailSize; + } + if (dwIDRequest) pmmpd->dwIDRequest=dwIDRequest; + if (dwDataType) pmmpd->dwDataType=dwDataType; + if (lpszUserData) + { + MEMFREE(pmmpd->lpszUserData); + pmmpd->lpszUserData=(LPSTR)MEMALLOC(dwUserDataSize); + memmove(pmmpd->lpszUserData,lpszUserData,dwUserDataSize); + pmmpd->dwUserDataSize=dwUserDataSize; + } + if (lpszAddreses && dwAddresesSize) MraAddrListGetFromBuff(lpszAddreses,dwAddresesSize,&pmmpd->malAddrList); + if (pmguidSessionID) memmove(&pmmpd->mguidSessionID,pmguidSessionID,sizeof(MRA_GUID)); + + SetEvent(pmmpd->hWaitHandle); + + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + + +void MraMrimProxyFree(HANDLE hMraMrimProxyData) +{ + if (hMraMrimProxyData) + { + MRA_MRIMPROXY_DATA *pmmpd=(MRA_MRIMPROXY_DATA*)hMraMrimProxyData; + + CloseHandle(pmmpd->hWaitHandle); + Netlib_CloseHandle(pmmpd->hConnection); + MEMFREE(pmmpd->lpszEMail); + MEMFREE(pmmpd->lpszUserData); + MraAddrListFree(&pmmpd->malAddrList); + MEMFREE(hMraMrimProxyData); + } +} + + +void MraMrimProxyCloseConnection(HANDLE hMraMrimProxyData) +{ + if (hMraMrimProxyData) + { + MRA_MRIMPROXY_DATA *pmmpd=(MRA_MRIMPROXY_DATA*)hMraMrimProxyData; + + SetEvent(pmmpd->hWaitHandle); + Netlib_CloseHandle(pmmpd->hConnection); + } +} + + +DWORD MraMrimProxyConnect(HANDLE hMraMrimProxyData,HANDLE *phConnection) +{ + DWORD dwRetErrorCode; + + if (hMraMrimProxyData && phConnection) + { + BOOL bIsHTTPSProxyUsed,bContinue; + BYTE lpbBufferRcv[BUFF_SIZE_RCV_MIN_FREE]; + DWORD dwBytesReceived,dwConnectReTryCount,dwCurConnectReTryCount; + SIZE_T dwRcvBuffSize=BUFF_SIZE_RCV_MIN_FREE,dwRcvBuffSizeUsed; + NETLIBSELECT nls={0}; + MRA_MRIMPROXY_DATA *pmmpd=(MRA_MRIMPROXY_DATA*)hMraMrimProxyData; + NETLIBOPENCONNECTION nloc={0}; + + + if (pmmpd->malAddrList.dwAddrCount) + {// адреса есть, значит инициаторы не мы + MraAddrListGetToBuff(&pmmpd->malAddrList,(LPSTR)lpbBufferRcv,SIZEOF(lpbBufferRcv),&dwRcvBuffSizeUsed); + MraSendCommand_ProxyAck(PROXY_STATUS_OK,pmmpd->lpszEMail,pmmpd->dwEMailSize,pmmpd->dwIDRequest,pmmpd->dwDataType,pmmpd->lpszUserData,pmmpd->dwUserDataSize,(LPSTR)lpbBufferRcv,dwRcvBuffSizeUsed,pmmpd->mguidSessionID); + }else{// мы инициаторы + pmmpd->hWaitHandle=CreateEvent(NULL,TRUE,FALSE,NULL); + if (pmmpd->lpszEMail && pmmpd->dwEMailSize) + if (MraSendCommand_Proxy(pmmpd->lpszEMail,pmmpd->dwEMailSize,pmmpd->dwIDRequest,pmmpd->dwDataType,pmmpd->lpszUserData,pmmpd->dwUserDataSize,NULL,0,pmmpd->mguidSessionID)) + { + WaitForSingleObjectEx(pmmpd->hWaitHandle,INFINITE,FALSE); + } + CloseHandle(pmmpd->hWaitHandle); + pmmpd->hWaitHandle=NULL; + } + + dwRetErrorCode=ERROR_NO_NETWORK; + if (pmmpd->malAddrList.dwAddrCount) + { + pmmpd->hConnection=NULL; + bIsHTTPSProxyUsed=IsHTTPSProxyUsed(masMraSettings.hNetlibUser); + dwConnectReTryCount=DB_Mra_GetDword(NULL,"ConnectReTryCountMRIMProxy",MRA_DEFAULT_CONN_RETRY_COUNT_MRIMPROXY); + nloc.cbSize=sizeof(nloc); + nloc.flags=NLOCF_V2; + nloc.timeout=((MRA_TIMEOUT_DIRECT_CONN-1)/(pmmpd->malAddrList.dwAddrCount*dwConnectReTryCount));// -1 сек чтобы был запас + if (nloc.timeoutMRA_TIMEOUT_CONN_МАХ) nloc.timeout=MRA_TIMEOUT_CONN_МАХ; + + for(SIZE_T i=0;(imalAddrList.dwAddrCount && dwRetErrorCode!=NO_ERROR);i++) + {// Set up the sockaddr structure + if ((pmmpd->malAddrList.pmaliAddress[i].dwPort==MRA_SERVER_PORT_HTTPS && bIsHTTPSProxyUsed) || bIsHTTPSProxyUsed==FALSE) + {// через https прокси только 443 порт + if (pmmpd->dwDataType==MRIM_PROXY_TYPE_FILES) ProtoBroadcastAck(PROTOCOL_NAMEA,MraHContactFromEmail(pmmpd->lpszEMail,pmmpd->dwEMailSize,FALSE,TRUE,NULL),ACKTYPE_FILE,ACKRESULT_CONNECTING,(HANDLE)pmmpd->dwIDRequest,0); + + nloc.szHost=inet_ntoa((*((in_addr*)&pmmpd->malAddrList.pmaliAddress[i].dwAddr))); + nloc.wPort=(WORD)pmmpd->malAddrList.pmaliAddress[i].dwPort; + + dwCurConnectReTryCount=dwConnectReTryCount; + do{ + pmmpd->hConnection=(HANDLE)CallService(MS_NETLIB_OPENCONNECTION,(WPARAM)masMraSettings.hNetlibUser,(LPARAM)&nloc); + }while(--dwCurConnectReTryCount && pmmpd->hConnection==NULL); + + if (pmmpd->hConnection) + { + nls.cbSize=sizeof(nls); + nls.dwTimeout=(MRA_TIMEOUT_DIRECT_CONN*1000*2); + nls.hReadConns[0]=pmmpd->hConnection; + bContinue=TRUE; + dwRcvBuffSizeUsed=0; + + if (pmmpd->dwDataType==MRIM_PROXY_TYPE_FILES) ProtoBroadcastAck(PROTOCOL_NAMEA,MraHContactFromEmail(pmmpd->lpszEMail,pmmpd->dwEMailSize,FALSE,TRUE,NULL),ACKTYPE_FILE,ACKRESULT_CONNECTED,(HANDLE)pmmpd->dwIDRequest,0); + MraSendPacket(nls.hReadConns[0],0,MRIM_CS_PROXY_HELLO,&pmmpd->mguidSessionID,sizeof(MRA_GUID)); + + while(bContinue) + { + switch(CallService(MS_NETLIB_SELECT,0,(LPARAM)&nls)){ + case SOCKET_ERROR: + case 0:// Time out + dwRetErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Disconnected, socket error",dwRetErrorCode); + bContinue=FALSE; + break; + case 1: + if (dwRcvBuffSizeUsed==BUFF_SIZE_RCV_MIN_FREE) + {// bad packet + bContinue=FALSE; + DebugBreak(); + }else{ + dwBytesReceived=Netlib_Recv(nls.hReadConns[0],(LPSTR)(lpbBufferRcv+dwRcvBuffSizeUsed),(dwRcvBuffSize-dwRcvBuffSizeUsed),0); + if (dwBytesReceived && dwBytesReceived!=SOCKET_ERROR) + {// connected + dwRcvBuffSizeUsed+=dwBytesReceived; + if (dwRcvBuffSizeUsed>=sizeof(mrim_packet_header_t)) + {// packet header received + if (((mrim_packet_header_t*)lpbBufferRcv)->magic==CS_MAGIC) + {// packet OK + if ((dwRcvBuffSizeUsed-sizeof(mrim_packet_header_t))>=((mrim_packet_header_t*)lpbBufferRcv)->dlen) + {// full packet received, may be more than one + if (((mrim_packet_header_t*)lpbBufferRcv)->msg=MRIM_CS_PROXY_HELLO_ACK) + {// connect OK! + dwRetErrorCode=NO_ERROR; + }else{// bad/wrong + DebugBreak(); + } + bContinue=FALSE; + }else{// not all packet received, continue receiving + DebugPrintCRLF(L"Not all packet received, continue receiving"); + } + }else{// bad packet + DebugPrintCRLF(L"Bad packet"); + DebugBreak(); + bContinue=FALSE; + } + }else{// packet to small, continue receiving + DebugPrintCRLF(L"Packet to small, continue receiving"); + } + }else{// disconnected + dwRetErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Disconnected, socket read error",dwRetErrorCode); + bContinue=FALSE; + } + } + break; + }// end switch + }// end while + }else{// cant connect + dwRetErrorCode=GetLastError(); + } + }// filtered + }// end for + + + if (dwRetErrorCode!=NO_ERROR) + {// кажется не туда подключились :) + Netlib_CloseHandle(pmmpd->hConnection); + pmmpd->hConnection=NULL; + } + } + (*phConnection)=pmmpd->hConnection; + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + + + + + diff --git a/MRA/MraMRIMProxy.h b/MRA/MraMRIMProxy.h new file mode 100644 index 0000000..f0c2f70 --- /dev/null +++ b/MRA/MraMRIMProxy.h @@ -0,0 +1,21 @@ +#if !defined(AFX_MRA_MRIMPROXY_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) +#define AFX_MRA_MRIMPROXY_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + + + +HANDLE MraMrimProxyCreate (); +DWORD MraMrimProxySetData (HANDLE hMraMrimProxyData,LPSTR lpszEMail,SIZE_T dwEMailSize,DWORD dwIDRequest,DWORD dwDataType,LPSTR lpszUserData,SIZE_T dwUserDataSize,LPSTR lpszAddreses,SIZE_T dwAddresesSize,MRA_GUID *pmguidSessionID); +void MraMrimProxyFree (HANDLE hMraMrimProxyData); +void MraMrimProxyCloseConnection (HANDLE hMraMrimProxyData); +DWORD MraMrimProxyConnect (HANDLE hMraMrimProxyData,HANDLE *phConnection); + + + +#endif // !defined(AFX_MRA_MRIMPROXY_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/MRA/MraOfflineMsg.cpp b/MRA/MraOfflineMsg.cpp new file mode 100644 index 0000000..514e34a --- /dev/null +++ b/MRA/MraOfflineMsg.cpp @@ -0,0 +1,432 @@ +#include "Mra.h" +#include "MraOfflineMsg.h" +#include "MraConstans.h" + + +#define LF "\n" +#define LFLF "\n\n" +#define CRLF "\r\n" +#define CRLFCRLF "\r\n\r\n" + + +DWORD MraOfflineMessageGetMIMEHeadAndBody (LPSTR lpszMessage,SIZE_T dwMessageSize,LPSTR *plpszHeader,SIZE_T *pdwHeaderSize,LPSTR *plpszBody,SIZE_T *pdwBodySize); +DWORD MraOfflineMessageGetNextMIMEPart (LPSTR lpszBody,SIZE_T dwBodySize,LPSTR lpszBoundary,SIZE_T dwBoundarySize,LPSTR *plpszCurMIMEPos,LPSTR *plpszMIMEPart,SIZE_T *pdwMIMEPartSize); +DWORD MraOfflineMessageGetHeaderValue (LPSTR lpszHeader,LPSTR lpszHeaderLow,SIZE_T dwHeaderSize,LPSTR lpszValueName,SIZE_T dwValueNameSize,LPSTR *plpszValue,SIZE_T *pdwValueSize); +DWORD MraOfflineMessageGetHeaderValueLow (LPSTR lpszHeaderLow,SIZE_T dwHeaderSize,LPSTR lpszValueName,SIZE_T dwValueNameSize,LPSTR *plpszValue,SIZE_T *pdwValueSize); +DWORD MraOfflineMessageConvertTime (INTERNET_TIME *pitTime); + + + + +DWORD MraOfflineMessageGet(MRA_LPS *plpsMsg,DWORD *pdwTime,DWORD *pdwFlags,MRA_LPS *plpsEMail,MRA_LPS *plpsText,MRA_LPS *plpsRTFText,MRA_LPS *plpsMultiChatData,LPBYTE *plpbBuff) +{// Сообщение + DWORD dwRetErrorCode=ERROR_INVALID_HANDLE; + + + if (plpsMsg) + if (plpsMsg->lpszData && plpsMsg->dwSize) + { + LPSTR lpszHeader,lpszHeaderLow,lpszBody,lpszContentTypeLow,lpszTemp; + SIZE_T dwHeaderSize,dwBodySize,dwContentTypeSize,dwTempSize; + DWORD dwMultichatType; + + #ifdef _DEBUG + DebugPrintCRLFA(plpsMsg->lpszData); + #endif + + if (MraOfflineMessageGetMIMEHeadAndBody(plpsMsg->lpszData,plpsMsg->dwSize,&lpszHeader,&dwHeaderSize,&lpszBody,&dwBodySize)==NO_ERROR) + { + lpszHeaderLow=(LPSTR)MEMALLOC(dwHeaderSize); + if (lpszHeaderLow) BuffToLowerCase(lpszHeaderLow,lpszHeader,dwHeaderSize); + + if (pdwTime) + if (MraOfflineMessageGetHeaderValue(lpszHeader,lpszHeaderLow,dwHeaderSize,"date",4,&lpszTemp,&dwTempSize)==NO_ERROR) + { + INTERNET_TIME itTime; + InternetTimeGetTime(lpszTemp,dwTempSize,&itTime); + (*pdwTime)=MraOfflineMessageConvertTime(&itTime); + }else{ + (*pdwTime)=0; + } + + if (pdwFlags) + if (MraOfflineMessageGetHeaderValue(lpszHeader,lpszHeaderLow,dwHeaderSize,"x-mrim-flags",12,&lpszTemp,&dwTempSize)==NO_ERROR) + { + (*pdwFlags)=StrHexToUNum32(lpszTemp,dwTempSize); + }else{ + (*pdwFlags)=0; + } + + if (MraOfflineMessageGetHeaderValue(lpszHeader,lpszHeaderLow,dwHeaderSize,"x-mrim-multichat-type",21,&lpszTemp,&dwTempSize)==NO_ERROR) + { + dwMultichatType=StrHexToUNum32(lpszTemp,dwTempSize); + }else{ + dwMultichatType=0; + } + + + if (plpsEMail) + if (MraOfflineMessageGetHeaderValue(lpszHeader,lpszHeaderLow,dwHeaderSize,"from",4,&plpsEMail->lpszData,&plpsEMail->dwSize)!=NO_ERROR) + { + plpsEMail->lpszData=NULL; + plpsEMail->dwSize=0; + } + + + if (plpsText) + { + plpsText->lpszData=NULL; + plpsText->dwSize=0; + } + if (plpsRTFText) + { + plpsRTFText->lpszData=NULL; + plpsRTFText->dwSize=0; + } + if (plpsMultiChatData) + { + plpsMultiChatData->lpszData=NULL; + plpsMultiChatData->dwSize=0; + } + if (plpbBuff) (*plpbBuff)=NULL; + + if (plpsText || plpsRTFText) + if (MraOfflineMessageGetHeaderValueLow(lpszHeaderLow,dwHeaderSize,"content-type",12,&lpszContentTypeLow,&dwContentTypeSize)==NO_ERROR) + { + + if (MemoryFind(0,lpszContentTypeLow,dwContentTypeSize,"multipart/alternative",21)) + {// Content-Type: multipart/alternative; boundary=1217508709J3777283291217508709T31197726 + LPSTR lpszBoundary,lpszMIMEPart,lpszCurMIMEPos,lpszMIMEHeader,lpszMIMEHeaderLow,lpszMIMEBody,lpszMIMEContentType; + SIZE_T i,dwBoundarySize,dwMIMEPartSize,dwMIMEHeaderSize,dwMIMEBodySize,dwMIMEContentTypeSize; + + lpszBoundary=(LPSTR)MemoryFind(0,lpszContentTypeLow,dwContentTypeSize,"boundary=",9); + if (lpszBoundary) + { + dwBoundarySize=((dwContentTypeSize-(lpszBoundary-lpszContentTypeLow))-9); + lpszBoundary=(lpszHeader+((lpszBoundary+9)-lpszHeaderLow)); + + i=0; + lpszCurMIMEPos=lpszBody; + while(MraOfflineMessageGetNextMIMEPart(lpszBody,dwBodySize,lpszBoundary,dwBoundarySize,&lpszCurMIMEPos,&lpszMIMEPart,&dwMIMEPartSize)==NO_ERROR) + { + if (MraOfflineMessageGetMIMEHeadAndBody(lpszMIMEPart,dwMIMEPartSize,&lpszMIMEHeader,&dwMIMEHeaderSize,&lpszMIMEBody,&dwMIMEBodySize)==NO_ERROR) + { + lpszMIMEHeaderLow=(LPSTR)MEMALLOC(dwMIMEHeaderSize); + if (lpszMIMEHeaderLow) + { + BuffToLowerCase(lpszMIMEHeaderLow,lpszMIMEHeader,dwMIMEHeaderSize); + if (MraOfflineMessageGetHeaderValueLow(lpszMIMEHeaderLow,dwMIMEHeaderSize,"content-type",12,&lpszMIMEContentType,&dwMIMEContentTypeSize)==NO_ERROR) + { + if (MemoryFind(0,lpszMIMEContentType,dwMIMEContentTypeSize,"text/plain",10)) + {// this is simple text part: text/plain + if (plpsText) + { + if (MemoryFind(0,lpszMIMEContentType,dwMIMEContentTypeSize,"utf-16le",8)) + {// charset=UTF-16LE// предполагаем что оно в base64 + if (plpbBuff) + {// буффер для декодирования текста можно выделять + LPWSTR lpwszText; + SIZE_T dwTextSize; + + lpwszText=(LPWSTR)MEMALLOC(dwMIMEBodySize); + if (lpwszText) + { + BASE64DecodeFormated(lpszMIMEBody,dwMIMEBodySize,lpwszText,dwMIMEBodySize,&dwTextSize); + plpsText->lpwszData=lpwszText; + plpsText->dwSize=dwTextSize; + if (pdwFlags) + { + (*pdwFlags)|=MESSAGE_FLAG_v1p16; // set unocode flag if not exist + (*pdwFlags)&=~MESSAGE_FLAG_CP1251; // reset ansi flag if exist + } + (*plpbBuff)=(LPBYTE)lpwszText; + dwRetErrorCode=NO_ERROR; + } + } + }else + if (MemoryFind(0,lpszMIMEContentType,dwMIMEContentTypeSize,"cp-1251",7)) + {// charset=CP-1251 + plpsText->lpszData=lpszMIMEBody; + plpsText->dwSize=dwMIMEBodySize; + if (pdwFlags) + { + (*pdwFlags)&=~MESSAGE_FLAG_v1p16; // reset unocode flag if exist + (*pdwFlags)|=MESSAGE_FLAG_CP1251; // set ansi flag + } + dwRetErrorCode=NO_ERROR; + }else{ + DebugBreak(); + } + } + }else + if (MemoryFind(0,lpszMIMEContentType,dwMIMEContentTypeSize,"application/x-mrim-rtf",22)) + { + if (plpsRTFText) + { + plpsRTFText->lpszData=lpszMIMEBody; + plpsRTFText->dwSize=dwMIMEBodySize; + if (pdwFlags) (*pdwFlags)|=MESSAGE_FLAG_RTF; // set RTF flag if not exist + dwRetErrorCode=NO_ERROR; + } + }else + if (MemoryFind(0,lpszMIMEContentType,dwMIMEContentTypeSize,"application/x-mrim+xml",22)) + { + if (plpsMultiChatData) + { + plpsMultiChatData->lpszData=lpszMIMEBody; + plpsMultiChatData->dwSize=dwMIMEBodySize; + if (pdwFlags) (*pdwFlags)|=MESSAGE_FLAG_MULTICHAT; // set MESSAGE_FLAG_MULTICHAT flag if not exist + dwRetErrorCode=NO_ERROR; + } + }else{ + DebugBreak(); + } + } + MEMFREE(lpszMIMEHeaderLow); + } + } + i++; + } + + DebugBreakIf((i>3 || i==0)); + }else{// boundary not found + DebugBreak(); + } + }else + if (MemoryFind(0,lpszContentTypeLow,dwContentTypeSize,"text/plain",10)) + {// Content-Type: text/plain; charset=CP-1251 + if (MemoryFind(0,lpszContentTypeLow,dwContentTypeSize,"utf-16le",8)) + {// charset=UTF-16LE// предполагаем что оно в base64 + if (plpbBuff) + {// буффер для декодирования текста можно выделять + LPWSTR lpwszText; + SIZE_T dwTextSize; + + lpwszText=(LPWSTR)MEMALLOC(dwBodySize); + if (lpwszText) + { + BASE64DecodeFormated(lpszBody,dwBodySize,lpwszText,dwBodySize,&dwTextSize); + plpsText->lpwszData=lpwszText; + plpsText->dwSize=dwTextSize; + if (pdwFlags) + { + (*pdwFlags)|=MESSAGE_FLAG_v1p16; // set unocode flag if not exist + (*pdwFlags)&=~MESSAGE_FLAG_CP1251; // reset ansi flag if exist + } + (*plpbBuff)=(LPBYTE)lpwszText; + dwRetErrorCode=NO_ERROR; + } + } + }else + if (MemoryFind(0,lpszContentTypeLow,dwContentTypeSize,"cp-1251",7)) + {// charset=CP-1251 + plpsText->lpszData=lpszBody; + plpsText->dwSize=dwBodySize; + if (pdwFlags) + { + (*pdwFlags)&=~MESSAGE_FLAG_v1p16; // reset unocode flag if exist + (*pdwFlags)|=MESSAGE_FLAG_CP1251; // set ansi flag + } + dwRetErrorCode=NO_ERROR; + }else{ + DebugBreak(); + } + }else + if (MemoryFind(0,lpszContentTypeLow,dwContentTypeSize,"application/x-mrim-auth-req",27)) + {// Content-Type: application/x-mrim-auth-req + if (plpsText) + { + plpsText->lpszData=lpszBody; + plpsText->dwSize=dwBodySize; + } + dwRetErrorCode=NO_ERROR; + }else{ + DebugBreak(); + } + }else{ + DebugBreak(); + } + + MEMFREE(lpszHeaderLow); + } + } + +return(dwRetErrorCode); +} + + +DWORD MraOfflineMessageGetMIMEHeadAndBody(LPSTR lpszMessage,SIZE_T dwMessageSize,LPSTR *plpszHeader,SIZE_T *pdwHeaderSize,LPSTR *plpszBody,SIZE_T *pdwBodySize) +{ + DWORD dwRetErrorCode=ERROR_NOT_FOUND; + + if (lpszMessage && dwMessageSize) + { + LPSTR lpszBody; + SIZE_T dwBodySize; + + // затычка: майл не придерживается RFC и вместо CRLFCRLF ставит LFLF в MIME частях, иногда ставит + lpszBody=(LPSTR)MemoryFind(0,lpszMessage,dwMessageSize,CRLFCRLF,(sizeof(CRLFCRLF)-1)); + if (lpszBody) + { + lpszBody+=(sizeof(CRLFCRLF)-1); + }else{ + lpszBody=(LPSTR)MemoryFind(0,lpszMessage,dwMessageSize,LFLF,(sizeof(LFLF)-1)); + if (lpszBody) lpszBody+=(sizeof(LFLF)-1); + } + + if (lpszBody) + {// нашли начало контента миме части + dwBodySize=(dwMessageSize-(lpszBody-lpszMessage)); + + if (plpszHeader) (*plpszHeader)=lpszMessage; + if (pdwHeaderSize) (*pdwHeaderSize)=((lpszBody-(sizeof(LFLF)-1))-lpszMessage); + if (plpszBody) (*plpszBody)=lpszBody; + if (pdwBodySize) (*pdwBodySize)=dwBodySize; + + dwRetErrorCode=NO_ERROR; + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraOfflineMessageGetNextMIMEPart(LPSTR lpszBody,SIZE_T dwBodySize,LPSTR lpszBoundary,SIZE_T dwBoundarySize,LPSTR *plpszCurMIMEPos,LPSTR *plpszMIMEPart,SIZE_T *pdwMIMEPartSize) +{ + DWORD dwRetErrorCode=ERROR_NOT_FOUND; + + if (lpszBody && dwBodySize) + { + LPSTR lpszMIMEPart,lpszCurMIMEPos,lpszTemp; + SIZE_T dwMIMEPartSize; + + if (plpszCurMIMEPos) lpszCurMIMEPos=(*plpszCurMIMEPos); + lpszMIMEPart=(LPSTR)MemoryFind((lpszCurMIMEPos-lpszBody),lpszBody,dwBodySize,lpszBoundary,dwBoundarySize); + if (lpszMIMEPart) + {// первая миме часть + lpszMIMEPart+=dwBoundarySize; + + // затычка: майл не придерживается RFC и вместо CRLF ставит LF в MIME частях, иногда ставит + if ((*((WORD*)lpszMIMEPart))==(*((WORD*)CRLF))) + { + lpszMIMEPart+=(sizeof(CRLF)-1); + }else + if ((*((BYTE*)lpszMIMEPart))==(*((BYTE*)LF))) + { + lpszMIMEPart+=(sizeof(LF)-1); + }else + if ((*((WORD*)lpszMIMEPart))=='--') + { + lpszMIMEPart=NULL; + }else{ + DebugBreak(); + } + + if (lpszMIMEPart) + { + lpszTemp=(LPSTR)MemoryFind((lpszMIMEPart-lpszBody),lpszBody,dwBodySize,lpszBoundary,dwBoundarySize); + if (lpszTemp) + {// нашли конец миме части с текстом + dwMIMEPartSize=(lpszTemp-lpszMIMEPart);// 4=CRLF"--"Boundary / 3=LF"--"Boundary + // затычка: майл не придерживается RFC и вместо CRLF ставит LF в MIME частях, иногда ставит + if ((*((WORD*)(lpszTemp-4)))==(*((WORD*)CRLF))) + { + dwMIMEPartSize-=4; + }else + if ((*((BYTE*)(lpszTemp-3)))==(*((BYTE*)LF))) + { + dwMIMEPartSize-=3; + }else{ + DebugBreak(); + } + + if (plpszMIMEPart) (*plpszMIMEPart)=lpszMIMEPart; + if (pdwMIMEPartSize) (*pdwMIMEPartSize)=dwMIMEPartSize; + if (plpszCurMIMEPos) (*plpszCurMIMEPos)=lpszTemp; + dwRetErrorCode=NO_ERROR; + } + }else{ + dwRetErrorCode=ERROR_NO_MORE_ITEMS; + } + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraOfflineMessageGetHeaderValue(LPSTR lpszHeader,LPSTR lpszHeaderLow,SIZE_T dwHeaderSize,LPSTR lpszValueName,SIZE_T dwValueNameSize,LPSTR *plpszValue,SIZE_T *pdwValueSize) +{ + DWORD dwRetErrorCode=ERROR_NOT_FOUND; + LPSTR lpszValue,lpszValueEnd; + SIZE_T dwValueSize; + + lpszValue=(LPSTR)MemoryFind(0,lpszHeaderLow,dwHeaderSize,lpszValueName,dwValueNameSize); + if (lpszValue) + { + lpszValue+=dwValueNameSize; + lpszValueEnd=(LPSTR)MemoryFind((lpszValue-lpszHeaderLow),lpszHeaderLow,dwHeaderSize,CRLF,(sizeof(CRLF)-1)); + if (lpszValueEnd==NULL) lpszValueEnd=(LPSTR)MemoryFind((lpszValue-lpszHeaderLow),lpszHeaderLow,dwHeaderSize,LF,(sizeof(LF)-1)); + if (lpszValueEnd==NULL) lpszValueEnd=(LPSTR)(lpszHeaderLow+dwHeaderSize); + + lpszValue=(LPSTR)MemoryFind((lpszValue-lpszHeaderLow),lpszHeaderLow,(lpszValueEnd-lpszHeaderLow),":",1); + if (lpszValue) + { + lpszValue++; + dwValueSize=(lpszValueEnd-lpszValue); + SkeepSPWSP((lpszHeader+(lpszValue-lpszHeaderLow)),dwValueSize,plpszValue,pdwValueSize); + dwRetErrorCode=NO_ERROR; + } + } +return(dwRetErrorCode); +} + + +DWORD MraOfflineMessageGetHeaderValueLow(LPSTR lpszHeaderLow,SIZE_T dwHeaderSize,LPSTR lpszValueName,SIZE_T dwValueNameSize,LPSTR *plpszValue,SIZE_T *pdwValueSize) +{ + DWORD dwRetErrorCode=ERROR_NOT_FOUND; + LPSTR lpszValue,lpszValueEnd; + SIZE_T dwValueSize; + + lpszValue=(LPSTR)MemoryFind(0,lpszHeaderLow,dwHeaderSize,lpszValueName,dwValueNameSize); + if (lpszValue) + { + lpszValue+=dwValueNameSize; + lpszValueEnd=(LPSTR)MemoryFind((lpszValue-lpszHeaderLow),lpszHeaderLow,dwHeaderSize,CRLF,(sizeof(CRLF)-1)); + if (lpszValueEnd==NULL) lpszValueEnd=(LPSTR)MemoryFind((lpszValue-lpszHeaderLow),lpszHeaderLow,dwHeaderSize,LF,(sizeof(LF)-1)); + if (lpszValueEnd==NULL) lpszValueEnd=(LPSTR)(lpszHeaderLow+dwHeaderSize); + + lpszValue=(LPSTR)MemoryFind((lpszValue-lpszHeaderLow),lpszHeaderLow,(lpszValueEnd-lpszHeaderLow),":",1); + if (lpszValue) + { + lpszValue++; + dwValueSize=(lpszValueEnd-lpszValue); + SkeepSPWSP(lpszValue,dwValueSize,plpszValue,pdwValueSize); + dwRetErrorCode=NO_ERROR; + } + } +return(dwRetErrorCode); +} + + +DWORD MraOfflineMessageConvertTime(INTERNET_TIME *pitTime) +{ + SYSTEMTIME stTime,stUniversalTime; + TIME_ZONE_INFORMATION tziTimeZoneMailRu={0},tziTimeZoneLocal; + + GetTimeZoneInformation(&tziTimeZoneLocal); + if (GetTimeZoneInformation(&tziTimeZoneMailRu)==TIME_ZONE_ID_DAYLIGHT) tziTimeZoneMailRu.DaylightBias*=2; + tziTimeZoneMailRu.Bias=MAILRU_SERVER_TIME_ZONE; + + //TzSpecificLocalTimeToSystemTime(&tziTimeZoneMailRu,&pitTime->stTime,&stUniversalTime); + {// for win 2000 compatible + tziTimeZoneMailRu.Bias=-tziTimeZoneMailRu.Bias; + tziTimeZoneMailRu.DaylightBias=-tziTimeZoneMailRu.DaylightBias; + SystemTimeToTzSpecificLocalTime(&tziTimeZoneMailRu,&pitTime->stTime,&stUniversalTime); + }//*/ + SystemTimeToTzSpecificLocalTime(&tziTimeZoneLocal,&stUniversalTime,&stTime); + +return((DWORD)MakeTime32FromLocalSystemTime(&stTime)); +} diff --git a/MRA/MraOfflineMsg.h b/MRA/MraOfflineMsg.h new file mode 100644 index 0000000..657a1a0 --- /dev/null +++ b/MRA/MraOfflineMsg.h @@ -0,0 +1,19 @@ +#if !defined(AFX_MRA_OFFLINEMSG_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) +#define AFX_MRA_OFFLINEMSG_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + + + +DWORD MraOfflineMessageGet(MRA_LPS *plpsMsg,DWORD *pdwTime,DWORD *pdwFlags,MRA_LPS *plpsEMail,MRA_LPS *plpsText,MRA_LPS *plpsRTFText,MRA_LPS *plpsMultiChatData,LPBYTE *plpbBuff); + + + + + +#endif // !defined(AFX_MRA_OFFLINEMSG_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/MRA/MraPlaces.h b/MRA/MraPlaces.h new file mode 100644 index 0000000..255dd3a --- /dev/null +++ b/MRA/MraPlaces.h @@ -0,0 +1,5959 @@ +#if !defined(AFX_MRA_PLACES_H__INCLUDED_) +#define AFX_MRA_PLACES_H__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + +#define lpwszOther TEXT("Другое") +//static LPWSTR lpwszOther=TEXT("Другое"); + + +typedef struct +{ + WORD dwCountryID; + LPWSTR lpszData; +} MRA_COUNTRY; + + +typedef struct +{ + WORD dwCountryID; + WORD dwCityID; + LPWSTR lpszData; +} MRA_CITY; + + + + +typedef struct +{ + WORD dwCountryID; + WORD dwCityID; + WORD dwPlaceID; + LPWSTR lpszData; +} MRA_PLACE; + + +/* WCHAR szBuff[MAX_FILEPATH]; + + DebugPrintCRLFA("static const MRA_COUNTRY mracCountrys[]=\r\n{"); + for(SIZE_T i=0;mrapPlaces[i].lpszData;i++) + { + if (mrapPlaces[i].dwCityID==0 && mrapPlaces[i].dwPlaceID==0) + { + mir_sntprintf(szBuff,SIZEOF(szBuff),L" {%ld, TEXT(\"%s\")},",mrapPlaces[i].dwCountryID,mrapPlaces[i].lpszData); + DebugPrintCRLFW(szBuff); + } + } + DebugPrintCRLFA(" {0, NULL}\r\n};"); + + + DebugPrintCRLFA("static const MRA_CITY mracCitys[]=\r\n{"); + for(SIZE_T i=0;mrapPlaces[i].lpszData;i++) + { + if (mrapPlaces[i].dwCityID && mrapPlaces[i].dwPlaceID==0) + { + mir_sntprintf(szBuff,SIZEOF(szBuff),L" {%ld, %ld, TEXT(\"%s\")},",mrapPlaces[i].dwCountryID,mrapPlaces[i].dwCityID,mrapPlaces[i].lpszData); + DebugPrintCRLFW(szBuff); + } + } + DebugPrintCRLFA(" {0, NULL}\r\n};"); + + + +static const MRA_PLACE mrapPlaces[]= +{ + {24, 0, 0, TEXT("Россия")}, + {81, 0, 0, TEXT("Азербайджан")}, + {82, 0, 0, TEXT("Армения")}, + {97, 0, 0, TEXT("Афганистан")}, + {96, 0, 0, TEXT("Бангладеш")}, + {99, 0, 0, TEXT("Бахрейн")}, + {100, 0, 0, TEXT("Бруней-Даруссалам")}, + {101, 0, 0, TEXT("Бутан")}, + {102, 0, 0, TEXT("Вьетнам")}, + {83, 0, 0, TEXT("Грузия")}, + {86, 0, 0, TEXT("Израиль")}, + {95, 0, 0, TEXT("Индия")}, + {103, 0, 0, TEXT("Индонезия")}, + {79, 0, 0, TEXT("Иордания")}, + {85, 0, 0, TEXT("Ирак")}, + {87, 0, 0, TEXT("Иран")}, + {104, 0, 0, TEXT("Йемен")}, + {84, 0, 0, TEXT("Казахстан")}, + {105, 0, 0, TEXT("Камбоджа")}, + {106, 0, 0, TEXT("Катар")}, + {107, 0, 0, TEXT("Кипр")}, + {92, 0, 0, TEXT("Киргизия (Кыргызстан)")}, + {76, 0, 0, TEXT("Китай")}, + {3215, 0, 0, TEXT("Кокосовые острова (Австр.)")}, + {29, 0, 0, TEXT("Корея (КНДР)")}, + {108, 0, 0, TEXT("Корея")}, + {88, 0, 0, TEXT("Кувейт")}, + {109, 0, 0, TEXT("Лаос")}, + {110, 0, 0, TEXT("Ливан")}, + {111, 0, 0, TEXT("Малайзия")}, + {112, 0, 0, TEXT("Мальдивы")}, + {113, 0, 0, TEXT("Монголия")}, + {114, 0, 0, TEXT("Мьянма")}, + {115, 0, 0, TEXT("Непал")}, + {116, 0, 0, TEXT("Объединенные Арабские Эмираты")}, + {117, 0, 0, TEXT("Оман")}, + {3216, 0, 0, TEXT("Остров Рождества (Австр.)")}, + {122, 0, 0, TEXT("Пакистан")}, + {89, 0, 0, TEXT("Палестина")}, + {94, 0, 0, TEXT("Саудовская Аравия")}, + {118, 0, 0, TEXT("Сингапур")}, + {78, 0, 0, TEXT("Сирия")}, + {91, 0, 0, TEXT("Таджикистан")}, + {119, 0, 0, TEXT("Таиланд")}, + {120, 0, 0, TEXT("Тайвань")}, + {132, 0, 0, TEXT("Тимор")}, + {90, 0, 0, TEXT("Туркмения")}, + {77, 0, 0, TEXT("Турция")}, + {93, 0, 0, TEXT("Узбекистан")}, + {121, 0, 0, TEXT("Филиппины")}, + {98, 0, 0, TEXT("Шри Ланка")}, + {75, 0, 0, TEXT("Япония")}, + {123, 0, 0, TEXT("Австралия")}, + {454, 0, 0, TEXT("Американское Самоа")}, + {124, 0, 0, TEXT("Вануату")}, + {453, 0, 0, TEXT("Гуам (США)")}, + {126, 0, 0, TEXT("Кирибати")}, + {127, 0, 0, TEXT("Маршалловы Острова")}, + {128, 0, 0, TEXT("Микронезия (Федеративные Штаты Микронезии)")}, + {129, 0, 0, TEXT("Науру")}, + {3220, 0, 0, TEXT("Ниуэ (Н.Зел.)")}, + {130, 0, 0, TEXT("Новая Зеландия")}, + {3218, 0, 0, TEXT("Новая Каледония (Фр.)")}, + {3221, 0, 0, TEXT("Острова Кука (Н.Зел.)")}, + {3230, 0, 0, TEXT("Острова Херд и Макдональд (Австр.)")}, + {131, 0, 0, TEXT("Палау")}, + {133, 0, 0, TEXT("Папуа - Новая Гвинея")}, + {3222, 0, 0, TEXT("Питкерн (Брит.)")}, + {125, 0, 0, TEXT("Самоа")}, + {3219, 0, 0, TEXT("Сев. Марианские острова (США)")}, + {134, 0, 0, TEXT("Соломоновы Острова")}, + {3223, 0, 0, TEXT("Токелау (Н.Зел.)")}, + {135, 0, 0, TEXT("Тонга")}, + {136, 0, 0, TEXT("Тувалу")}, + {3224, 0, 0, TEXT("Уоллис и Футуна острова (Фр.)")}, + {137, 0, 0, TEXT("Фиджи")}, + {3226, 0, 0, TEXT("Французская Полинезия")}, + {3225, 0, 0, TEXT("Французские Южные территории")}, + {138, 0, 0, TEXT("Канада")}, + {139, 0, 0, TEXT("США")}, + {3200, 0, 0, TEXT("Ангилья (Брит.)")}, + {140, 0, 0, TEXT("Антигуа и Барбуда")}, + {141, 0, 0, TEXT("Аргентина")}, + {3202, 0, 0, TEXT("Аруба (Нид.)")}, + {142, 0, 0, TEXT("Багамы")}, + {143, 0, 0, TEXT("Барбадос")}, + {146, 0, 0, TEXT("Белиз")}, + {3203, 0, 0, TEXT("Бермуды (Брит.)")}, + {144, 0, 0, TEXT("Боливия")}, + {145, 0, 0, TEXT("Бразилия")}, + {147, 0, 0, TEXT("Венесуэла")}, + {3204, 0, 0, TEXT("Виргинские острова (Брит.)")}, + {452, 0, 0, TEXT("Виргинские острова (США)")}, + {149, 0, 0, TEXT("Гаити")}, + {148, 0, 0, TEXT("Гайана")}, + {3205, 0, 0, TEXT("Гваделупа (Фр.)")}, + {173, 0, 0, TEXT("Гватемала")}, + {150, 0, 0, TEXT("Гондурас")}, + {151, 0, 0, TEXT("Гренада")}, + {152, 0, 0, TEXT("Гренландия (Дат.)")}, + {153, 0, 0, TEXT("Доминика")}, + {154, 0, 0, TEXT("Доминиканская Республика")}, + {155, 0, 0, TEXT("Колумбия")}, + {156, 0, 0, TEXT("Коста-Рика")}, + {157, 0, 0, TEXT("Куба")}, + {3208, 0, 0, TEXT("Мартиника (Фр.)")}, + {158, 0, 0, TEXT("Мексика")}, + {3209, 0, 0, TEXT("Монтсеррат (Брит)")}, + {3201, 0, 0, TEXT("Нидерландские Антилы")}, + {159, 0, 0, TEXT("Никарагуа")}, + {3207, 0, 0, TEXT("Остров Кайман (Брит.)")}, + {3211, 0, 0, TEXT("Острова Теркс и Кайкос (Брит.)")}, + {160, 0, 0, TEXT("Панама")}, + {161, 0, 0, TEXT("Парагвай")}, + {162, 0, 0, TEXT("Перу")}, + {163, 0, 0, TEXT("Сальвадор")}, + {164, 0, 0, TEXT("Сент-Винсент и Гренадины")}, + {165, 0, 0, TEXT("Сент-Китс и Невис")}, + {166, 0, 0, TEXT("Сент-Люсия")}, + {3210, 0, 0, TEXT("Сент-Пьер и Микелон (Фр.)")}, + {167, 0, 0, TEXT("Суринам")}, + {168, 0, 0, TEXT("Тринидат и Тобаго")}, + {169, 0, 0, TEXT("Уругвай")}, + {3212, 0, 0, TEXT("Фолклендские острова (Брит.)")}, + {3206, 0, 0, TEXT("Французская Гвиана")}, + {170, 0, 0, TEXT("Чили")}, + {171, 0, 0, TEXT("Эквадор")}, + {3213, 0, 0, TEXT("Юж. Джорджия и Юж. Сандвичевы о-ва (Брит.)")}, + {172, 0, 0, TEXT("Ямайка")}, + {174, 0, 0, TEXT("Алжир")}, + {175, 0, 0, TEXT("Ангола")}, + {176, 0, 0, TEXT("Бенин")}, + {177, 0, 0, TEXT("Ботсвана")}, + {3228, 0, 0, TEXT("Британская территория в Индийском океане")}, + {178, 0, 0, TEXT("Буркина-Фасо")}, + {179, 0, 0, TEXT("Бурунди")}, + {180, 0, 0, TEXT("Габон")}, + {181, 0, 0, TEXT("Гамбия")}, + {182, 0, 0, TEXT("Гана")}, + {183, 0, 0, TEXT("Гвинея")}, + {184, 0, 0, TEXT("Гвинея-Бисау")}, + {185, 0, 0, TEXT("Джибути")}, + {186, 0, 0, TEXT("Египет")}, + {187, 0, 0, TEXT("Замбия")}, + {3198, 0, 0, TEXT("Зап. Сахара")}, + {23, 0, 0, TEXT("Зимбабве")}, + {188, 0, 0, TEXT("Кабо-Верде")}, + {189, 0, 0, TEXT("Камерун")}, + {190, 0, 0, TEXT("Кения")}, + {191, 0, 0, TEXT("Коморы")}, + {193, 0, 0, TEXT("Конго (Заир)")}, + {192, 0, 0, TEXT("Конго")}, + {194, 0, 0, TEXT("Кот-д`Ивуар")}, + {195, 0, 0, TEXT("Лесото")}, + {196, 0, 0, TEXT("Либерия")}, + {197, 0, 0, TEXT("Ливия")}, + {198, 0, 0, TEXT("Маврикий")}, + {199, 0, 0, TEXT("Мавритания")}, + {200, 0, 0, TEXT("Мадагаскар")}, + {3229, 0, 0, TEXT("Майотт (Фр.)")}, + {201, 0, 0, TEXT("Малави")}, + {202, 0, 0, TEXT("Мали")}, + {203, 0, 0, TEXT("Марокко")}, + {204, 0, 0, TEXT("Мозамбик")}, + {205, 0, 0, TEXT("Намибия")}, + {206, 0, 0, TEXT("Нигер")}, + {207, 0, 0, TEXT("Нигерия")}, + {3227, 0, 0, TEXT("Остров Буве (Норв.)")}, + {3197, 0, 0, TEXT("Реюньон (Фр.)")}, + {208, 0, 0, TEXT("Руанда")}, + {209, 0, 0, TEXT("Сан-Томе и Принсипи")}, + {210, 0, 0, TEXT("Свазиленд")}, + {3199, 0, 0, TEXT("Святая Елена (Брит.)")}, + {211, 0, 0, TEXT("Сейшелы")}, + {212, 0, 0, TEXT("Сенегал")}, + {213, 0, 0, TEXT("Сомали")}, + {214, 0, 0, TEXT("Судан")}, + {215, 0, 0, TEXT("Сьерра-Леоне")}, + {216, 0, 0, TEXT("Танзания")}, + {217, 0, 0, TEXT("Того")}, + {218, 0, 0, TEXT("Тунис")}, + {219, 0, 0, TEXT("Уганда")}, + {220, 0, 0, TEXT("Центральноафриканская Республика")}, + {222, 0, 0, TEXT("Чад")}, + {223, 0, 0, TEXT("Экваториальная Гвинея")}, + {221, 0, 0, TEXT("Эритрея")}, + {224, 0, 0, TEXT("Эфиопия")}, + {225, 0, 0, TEXT("Южно-Африканская Республика (ЮАР)")}, + {39, 0, 0, TEXT("Украина")}, + {40, 0, 0, TEXT("Австрия")}, + {32, 0, 0, TEXT("Албания")}, + {33, 0, 0, TEXT("Андорра")}, + {340, 0, 0, TEXT("Белоруссия")}, + {38, 0, 0, TEXT("Бельгия")}, + {41, 0, 0, TEXT("Болгария")}, + {42, 0, 0, TEXT("Босния и Герцеговина")}, + {43, 0, 0, TEXT("Ватикан")}, + {45, 0, 0, TEXT("Великобритания")}, + {44, 0, 0, TEXT("Венгрия")}, + {46, 0, 0, TEXT("Германия")}, + {3193, 0, 0, TEXT("Гернси (Брит.)")}, + {47, 0, 0, TEXT("Гибралтар (Брит.)")}, + {48, 0, 0, TEXT("Греция")}, + {49, 0, 0, TEXT("Дания")}, + {3194, 0, 0, TEXT("Джерси (Брит.)")}, + {50, 0, 0, TEXT("Ирландия")}, + {51, 0, 0, TEXT("Исландия")}, + {34, 0, 0, TEXT("Испания")}, + {52, 0, 0, TEXT("Италия")}, + {53, 0, 0, TEXT("Латвия")}, + {54, 0, 0, TEXT("Литва")}, + {55, 0, 0, TEXT("Лихтенштейн")}, + {56, 0, 0, TEXT("Люксембург")}, + {57, 0, 0, TEXT("Македония")}, + {58, 0, 0, TEXT("Мальта")}, + {59, 0, 0, TEXT("Молдавия")}, + {36, 0, 0, TEXT("Монако")}, + {60, 0, 0, TEXT("Нидерланды")}, + {61, 0, 0, TEXT("Норвегия")}, + {3195, 0, 0, TEXT("Остров Мэн (Брит.)")}, + {62, 0, 0, TEXT("Польша")}, + {35, 0, 0, TEXT("Португалия")}, + {63, 0, 0, TEXT("Румыния")}, + {64, 0, 0, TEXT("Сан-Марино")}, + {74, 0, 0, TEXT("Сербия и Черногория")}, + {65, 0, 0, TEXT("Словакия")}, + {66, 0, 0, TEXT("Словения")}, + {67, 0, 0, TEXT("Фарерские о-ва (Дания)")}, + {68, 0, 0, TEXT("Финляндия")}, + {37, 0, 0, TEXT("Франция")}, + {69, 0, 0, TEXT("Хорватия")}, + {70, 0, 0, TEXT("Чехия")}, + {71, 0, 0, TEXT("Швейцария")}, + {72, 0, 0, TEXT("Швеция")}, + {3196, 0, 0, TEXT("Шпицберген (Норв.)")}, + {73, 0, 0, TEXT("Эстония")}, + {24, 25, 0, TEXT("Москва")}, + {24, 226, 0, TEXT("Санкт-Петербург")}, + {24, 233, 0, TEXT("Саха (Якутия)")}, + {24, 232, 0, TEXT("Приморский край")}, + {24, 235, 0, TEXT("Хабаровский край")}, + {24, 227, 0, TEXT("Амурская обл.")}, + {24, 229, 0, TEXT("Камчатская обл.")}, + {24, 231, 0, TEXT("Магаданская обл.")}, + {24, 234, 0, TEXT("Сахалинская обл.")}, + {24, 228, 0, TEXT("Еврейская АО")}, + {24, 230, 0, TEXT("Корякский АО")}, + {24, 236, 0, TEXT("Чукотский АО")}, + {24, 237, 0, TEXT("Башкортостан")}, + {24, 240, 0, TEXT("Марий-Эл")}, + {24, 241, 0, TEXT("Мордовия")}, + {24, 248, 0, TEXT("Татарстан")}, + {24, 249, 0, TEXT("Удмуртия")}, + {24, 251, 0, TEXT("Чувашия")}, + {24, 238, 0, TEXT("Кировская обл.")}, + {24, 242, 0, TEXT("Нижегородская обл.")}, + {24, 243, 0, TEXT("Оренбургская обл.")}, + {24, 244, 0, TEXT("Пензенская обл.")}, + {24, 245, 0, TEXT("Пермская обл.")}, + {24, 246, 0, TEXT("Самарская обл.")}, + {24, 247, 0, TEXT("Саратовская обл.")}, + {24, 250, 0, TEXT("Ульяновская обл.")}, + {24, 239, 0, TEXT("Коми-Пермяцкий АО")}, + {24, 255, 0, TEXT("Карелия")}, + {24, 256, 0, TEXT("Коми")}, + {24, 252, 0, TEXT("Архангельская обл.")}, + {24, 253, 0, TEXT("Вологодская обл.")}, + {24, 254, 0, TEXT("Калининградская обл.")}, + {24, 257, 0, TEXT("Ленинградская обл.")}, + {24, 258, 0, TEXT("Мурманская обл.")}, + {24, 260, 0, TEXT("Новгородская обл.")}, + {24, 261, 0, TEXT("Псковская обл.")}, + {24, 259, 0, TEXT("Ненецкий АО")}, + {24, 265, 0, TEXT("Бурятия")}, + {24, 263, 0, TEXT("Республика Алтай")}, + {24, 273, 0, TEXT("Тыва")}, + {24, 275, 0, TEXT("Хакасия")}, + {24, 264, 0, TEXT("Алтайский край")}, + {24, 268, 0, TEXT("Красноярский край")}, + {24, 266, 0, TEXT("Иркутская обл.")}, + {24, 267, 0, TEXT("Кемеровская обл.")}, + {24, 269, 0, TEXT("Новосибирская обл.")}, + {24, 270, 0, TEXT("Омская обл.")}, + {24, 272, 0, TEXT("Томская обл.")}, + {24, 276, 0, TEXT("Читинская обл.")}, + {24, 262, 0, TEXT("Агинский Бурятский АО")}, + {24, 271, 0, TEXT("Таймырский АО")}, + {24, 274, 0, TEXT("Усть-Ордынский Бурятский АО")}, + {24, 277, 0, TEXT("Эвенкийский АО")}, + {24, 278, 0, TEXT("Курганская обл.")}, + {24, 279, 0, TEXT("Свердловская обл.")}, + {24, 280, 0, TEXT("Тюменская обл.")}, + {24, 282, 0, TEXT("Челябинская обл.")}, + {24, 281, 0, TEXT("Ханты-Мансийский АО - Югра")}, + {24, 283, 0, TEXT("Ямало-Ненецкий АО")}, + {24, 284, 0, TEXT("Белгородская обл.")}, + {24, 285, 0, TEXT("Брянская обл.")}, + {24, 286, 0, TEXT("Владимирская обл.")}, + {24, 287, 0, TEXT("Воронежская обл.")}, + {24, 288, 0, TEXT("Ивановская обл.")}, + {24, 289, 0, TEXT("Калужская обл.")}, + {24, 290, 0, TEXT("Костромская обл.")}, + {24, 291, 0, TEXT("Курская обл.")}, + {24, 292, 0, TEXT("Липецкая обл.")}, + {24, 293, 0, TEXT("Московская обл.")}, + {24, 294, 0, TEXT("Орловская обл.")}, + {24, 295, 0, TEXT("Рязанская обл.")}, + {24, 296, 0, TEXT("Смоленская обл.")}, + {24, 297, 0, TEXT("Тамбовская обл.")}, + {24, 298, 0, TEXT("Тверская обл.")}, + {24, 299, 0, TEXT("Тульская обл.")}, + {24, 300, 0, TEXT("Ярославская обл.")}, + {24, 301, 0, TEXT("Адыгея")}, + {24, 304, 0, TEXT("Дагестан")}, + {24, 305, 0, TEXT("Ингушетия")}, + {24, 306, 0, TEXT("Кабардино-Балкария")}, + {24, 307, 0, TEXT("Калмыкия")}, + {24, 308, 0, TEXT("Карачаево-Черкессия")}, + {24, 311, 0, TEXT("Северная Осетия - Алания")}, + {24, 313, 0, TEXT("Чечня")}, + {24, 309, 0, TEXT("Краснодарский край")}, + {24, 312, 0, TEXT("Ставропольский край")}, + {24, 302, 0, TEXT("Астраханская обл.")}, + {24, 303, 0, TEXT("Волгоградская обл.")}, + {24, 310, 0, TEXT("Ростовская обл.")}, + {81, 1055, 0, TEXT("Баку")}, + {81, 1058, 0, TEXT("Гянджа")}, + {81, 1056, 0, TEXT("Нахичевань")}, + {81, 1057, 0, TEXT("Ханкенди")}, + {81, 3153, 0, TEXT("Шеки")}, + {81, 2291, 0, lpwszOther}, + {82, 2932, 0, TEXT("Абовян")}, + {82, 1060, 0, TEXT("Аштарак")}, + {82, 3084, 0, TEXT("Ванадзор")}, + {82, 3011, 0, TEXT("Гюмри")}, + {82, 3306, 0, TEXT("Дилижан")}, + {82, 1059, 0, TEXT("Ереван")}, + {82, 3145, 0, TEXT("Ханкенди")}, + {82, 2292, 0, lpwszOther}, + {97, 1061, 0, TEXT("Кабул")}, + {97, 2293, 0, lpwszOther}, + {96, 1062, 0, TEXT("Дакка")}, + {96, 2294, 0, lpwszOther}, + {99, 1063, 0, TEXT("Манама")}, + {99, 2295, 0, lpwszOther}, + {100, 1064, 0, TEXT("Бандар-Сери-Бегаван")}, + {100, 2296, 0, lpwszOther}, + {101, 1065, 0, TEXT("Тхимпху")}, + {101, 2297, 0, lpwszOther}, + {102, 1066, 0, TEXT("Ханой")}, + {102, 2298, 0, lpwszOther}, + {83, 1067, 0, TEXT("Батуми")}, + {83, 3158, 0, TEXT("Боржоми")}, + {83, 1068, 0, TEXT("Поти")}, + {83, 3129, 0, TEXT("Рустави")}, + {83, 1069, 0, TEXT("Сухуми")}, + {83, 1070, 0, TEXT("Тбилиси")}, + {83, 2299, 0, lpwszOther}, + {86, 3345, 0, TEXT("Ариэль")}, + {86, 1071, 0, TEXT("Афула")}, + {86, 2992, 0, TEXT("Ашдод")}, + {86, 3175, 0, TEXT("Ашкелон")}, + {86, 3363, 0, TEXT("Бат-Ям")}, + {86, 2884, 0, TEXT("Беер-Яков")}, + {86, 3243, 0, TEXT("Бейт-Шемеш")}, + {86, 1074, 0, TEXT("Беэр-Шева")}, + {86, 3348, 0, TEXT("Герцелия")}, + {86, 3241, 0, TEXT("Димона")}, + {86, 1075, 0, TEXT("Иерусалим")}, + {86, 3350, 0, TEXT("Йокнеам-Иллит")}, + {86, 2982, 0, TEXT("Кармиэль")}, + {86, 2971, 0, TEXT("Кфар-Саба")}, + {86, 3136, 0, TEXT("Назарет")}, + {86, 1080, 0, TEXT("Натания")}, + {86, 3303, 0, TEXT("Офаким")}, + {86, 3050, 0, TEXT("Раанана")}, + {86, 3151, 0, TEXT("Рамат Ган")}, + {86, 3141, 0, TEXT("Реховот")}, + {86, 3012, 0, TEXT("Ришон ле Цион")}, + {86, 1081, 0, TEXT("Тверия")}, + {86, 1077, 0, TEXT("Тель-Авив")}, + {86, 1079, 0, TEXT("Хадера")}, + {86, 1078, 0, TEXT("Хайфа")}, + {86, 1076, 0, TEXT("Хеврон")}, + {86, 2929, 0, TEXT("Цфат")}, + {86, 2928, 0, TEXT("Эйлат")}, + {86, 2300, 0, lpwszOther}, + {95, 3315, 0, TEXT("Бангалор")}, + {95, 1082, 0, TEXT("Дели")}, + {95, 1083, 0, TEXT("Джайпур")}, + {95, 3144, 0, TEXT("Калькутта")}, + {95, 3025, 0, TEXT("Мумбаи")}, + {95, 3277, 0, TEXT("Панаджи")}, + {95, 1084, 0, TEXT("Ченнаи")}, + {95, 2301, 0, lpwszOther}, + {103, 1085, 0, TEXT("Джакарта")}, + {103, 2302, 0, lpwszOther}, + {79, 1086, 0, TEXT("Амман")}, + {79, 2303, 0, lpwszOther}, + {85, 1087, 0, TEXT("Багдад")}, + {85, 2304, 0, lpwszOther}, + {87, 1088, 0, TEXT("Тегеран")}, + {87, 2305, 0, lpwszOther}, + {104, 1089, 0, TEXT("Сана")}, + {104, 2306, 0, lpwszOther}, + {84, 1090, 0, TEXT("Актау")}, + {84, 1091, 0, TEXT("Актюбинск")}, + {84, 1092, 0, TEXT("Алма-Ата")}, + {84, 3242, 0, TEXT("Аршалы")}, + {84, 1093, 0, TEXT("Астана")}, + {84, 1094, 0, TEXT("Атырау (Гурьев)")}, + {84, 1095, 0, TEXT("Байконур")}, + {84, 3245, 0, TEXT("Балхаш")}, + {84, 3083, 0, TEXT("Жезказган")}, + {84, 1096, 0, TEXT("Капчагай")}, + {84, 1097, 0, TEXT("Караганда")}, + {84, 1098, 0, TEXT("Кокшетау")}, + {84, 1099, 0, TEXT("Кустанай")}, + {84, 2868, 0, TEXT("Лисаковск")}, + {84, 1100, 0, TEXT("Павлодар")}, + {84, 1101, 0, TEXT("Петропавловск (Сев.-Каз. обл.)")}, + {84, 1102, 0, TEXT("Рудный")}, + {84, 1103, 0, TEXT("Семипалатинск")}, + {84, 1104, 0, TEXT("Степногорск")}, + {84, 3166, 0, TEXT("Талгар")}, + {84, 1105, 0, TEXT("Талды-Курган")}, + {84, 2927, 0, TEXT("Тараз")}, + {84, 1106, 0, TEXT("Темиртау")}, + {84, 1107, 0, TEXT("Уральск")}, + {84, 1108, 0, TEXT("Усть-Каменогорск")}, + {84, 1109, 0, TEXT("Чимкент")}, + {84, 1110, 0, TEXT("Экибастуз")}, + {84, 2307, 0, lpwszOther}, + {105, 1111, 0, TEXT("Пномпень")}, + {105, 2308, 0, lpwszOther}, + {106, 1112, 0, TEXT("Доха")}, + {106, 2309, 0, lpwszOther}, + {107, 1113, 0, TEXT("Ларнака")}, + {107, 1114, 0, TEXT("Лимассол")}, + {107, 1115, 0, TEXT("Никосия")}, + {107, 2954, 0, TEXT("Пафос")}, + {107, 2310, 0, lpwszOther}, + {92, 1116, 0, TEXT("Бишкек")}, + {92, 1117, 0, TEXT("Джалал-Абад")}, + {92, 3027, 0, TEXT("Кара-Балта")}, + {92, 1118, 0, TEXT("Каракол")}, + {92, 1119, 0, TEXT("Ош")}, + {92, 1120, 0, TEXT("Талас")}, + {92, 2933, 0, TEXT("Хайдаркен")}, + {92, 2311, 0, lpwszOther}, + {76, 3214, 0, TEXT("Аомынь (Макао)")}, + {76, 1121, 0, TEXT("Гонконг")}, + {76, 2869, 0, TEXT("Гуанчжоу")}, + {76, 3262, 0, TEXT("Далянь")}, + {76, 1122, 0, TEXT("Пекин")}, + {76, 1123, 0, TEXT("Харбин")}, + {76, 1124, 0, TEXT("Шанхай")}, + {76, 3043, 0, TEXT("Шеньян")}, + {76, 2312, 0, lpwszOther}, + {29, 1125, 0, TEXT("Пхеньян")}, + {29, 2313, 0, lpwszOther}, + {108, 1126, 0, TEXT("Сеул")}, + {108, 3240, 0, TEXT("Тейджон")}, + {108, 2314, 0, lpwszOther}, + {88, 1127, 0, TEXT("Эль-Кувейт")}, + {88, 2315, 0, lpwszOther}, + {109, 1128, 0, TEXT("Вьентьян")}, + {109, 2316, 0, lpwszOther}, + {110, 1129, 0, TEXT("Бейрут")}, + {110, 2317, 0, lpwszOther}, + {111, 1130, 0, TEXT("Джохор-Бару")}, + {111, 1131, 0, TEXT("Куала-Лумпур")}, + {111, 2318, 0, lpwszOther}, + {112, 1132, 0, TEXT("Мале")}, + {112, 2319, 0, lpwszOther}, + {113, 1133, 0, TEXT("Улан-Батор")}, + {113, 1134, 0, TEXT("Эрдэнэт")}, + {113, 2320, 0, lpwszOther}, + {114, 1135, 0, TEXT("Янгон")}, + {114, 2321, 0, lpwszOther}, + {115, 1136, 0, TEXT("Катманду")}, + {115, 2322, 0, lpwszOther}, + {116, 1137, 0, TEXT("Абу-Даби")}, + {116, 1138, 0, TEXT("Дубай")}, + {116, 1139, 0, TEXT("Шарджа")}, + {116, 2323, 0, lpwszOther}, + {117, 1140, 0, TEXT("Маскат")}, + {117, 2324, 0, lpwszOther}, + {122, 1141, 0, TEXT("Исламабад")}, + {122, 2325, 0, lpwszOther}, + {89, 1072, 0, TEXT("Ашдод")}, + {89, 1073, 0, TEXT("Ашкелон")}, + {89, 1142, 0, TEXT("Газа")}, + {89, 2326, 0, lpwszOther}, + {94, 3250, 0, TEXT("Медина")}, + {94, 1143, 0, TEXT("Эр-Рияд")}, + {94, 2327, 0, lpwszOther}, + {78, 1144, 0, TEXT("Дамаск")}, + {78, 2328, 0, lpwszOther}, + {91, 1145, 0, TEXT("Душанбе")}, + {91, 3307, 0, TEXT("Кайраккум")}, + {91, 3308, 0, TEXT("Худжанд")}, + {91, 2329, 0, lpwszOther}, + {119, 1146, 0, TEXT("Бангкок")}, + {119, 1147, 0, TEXT("Пхукет")}, + {119, 2330, 0, lpwszOther}, + {120, 1148, 0, TEXT("Тайбэй")}, + {120, 2331, 0, lpwszOther}, + {132, 1149, 0, TEXT("Дили")}, + {132, 2332, 0, lpwszOther}, + {90, 1150, 0, TEXT("Ашхабад")}, + {90, 3079, 0, TEXT("Безмеин")}, + {90, 2333, 0, lpwszOther}, + {77, 1152, 0, TEXT("Анкара")}, + {77, 1153, 0, TEXT("Анталия")}, + {77, 3080, 0, TEXT("Бурса")}, + {77, 1151, 0, TEXT("Мармарис")}, + {77, 1154, 0, TEXT("Стамбул")}, + {77, 1155, 0, TEXT("Трабзон")}, + {77, 2334, 0, lpwszOther}, + {93, 3362, 0, TEXT("Алмалык")}, + {93, 3137, 0, TEXT("Андижан")}, + {93, 3273, 0, TEXT("Асака")}, + {93, 1156, 0, TEXT("Ахангаран")}, + {93, 1157, 0, TEXT("Бухара")}, + {93, 3167, 0, TEXT("Джизак")}, + {93, 3347, 0, TEXT("Кунград")}, + {93, 1158, 0, TEXT("Навои")}, + {93, 1159, 0, TEXT("Наманган")}, + {93, 1160, 0, TEXT("Самарканд")}, + {93, 1161, 0, TEXT("Ташкент")}, + {93, 1162, 0, TEXT("Ургенч")}, + {93, 1163, 0, TEXT("Фергана")}, + {93, 1164, 0, TEXT("Чирчик")}, + {93, 2335, 0, lpwszOther}, + {121, 1165, 0, TEXT("Манила")}, + {121, 3319, 0, TEXT("Себу")}, + {121, 2336, 0, lpwszOther}, + {98, 1166, 0, TEXT("Коломбо")}, + {98, 2337, 0, lpwszOther}, + {75, 3176, 0, TEXT("Исесаки")}, + {75, 3339, 0, TEXT("Корияма")}, + {75, 1167, 0, TEXT("Саппоро")}, + {75, 1168, 0, TEXT("Токио")}, + {75, 2338, 0, lpwszOther}, + {123, 1914, 0, TEXT("Аделаида")}, + {123, 2957, 0, TEXT("Блэк Рок")}, + {123, 1915, 0, TEXT("Брисбен")}, + {123, 3331, 0, TEXT("Горокан")}, + {123, 1916, 0, TEXT("Канберра")}, + {123, 3001, 0, TEXT("Лидкомб")}, + {123, 1917, 0, TEXT("Мельбурн")}, + {123, 3217, 0, TEXT("Норфолк")}, + {123, 3064, 0, TEXT("Перт")}, + {123, 3020, 0, TEXT("Санта Люсиа")}, + {123, 1918, 0, TEXT("Сидней")}, + {123, 3238, 0, TEXT("Энеабба")}, + {123, 2339, 0, lpwszOther}, + {454, 1192, 0, TEXT("Паго-Паго")}, + {454, 2366, 0, lpwszOther}, + {124, 1919, 0, TEXT("Порт-Вила")}, + {124, 2340, 0, lpwszOther}, + {453, 1193, 0, TEXT("Аганья")}, + {453, 2368, 0, lpwszOther}, + {126, 1921, 0, TEXT("Баирики")}, + {126, 2342, 0, lpwszOther}, + {127, 1922, 0, TEXT("Маджуро")}, + {127, 2343, 0, lpwszOther}, + {128, 1923, 0, TEXT("Паликир")}, + {128, 2344, 0, lpwszOther}, + {129, 1924, 0, TEXT("Ярен")}, + {129, 2345, 0, lpwszOther}, + {130, 1925, 0, TEXT("Веллингтон")}, + {130, 1926, 0, TEXT("Гамильтон")}, + {130, 1928, 0, TEXT("Данидин")}, + {130, 1929, 0, TEXT("Крайстчерч")}, + {130, 3235, 0, TEXT("Кромвель")}, + {130, 1927, 0, TEXT("Окленд")}, + {130, 3323, 0, TEXT("Тауранга")}, + {130, 2346, 0, lpwszOther}, + {131, 1930, 0, TEXT("Корор")}, + {131, 2347, 0, lpwszOther}, + {133, 1931, 0, TEXT("Порт-Морсби")}, + {133, 2348, 0, lpwszOther}, + {125, 1920, 0, TEXT("Апиа")}, + {125, 2341, 0, lpwszOther}, + {134, 1932, 0, TEXT("Хониара")}, + {134, 2349, 0, lpwszOther}, + {135, 1933, 0, TEXT("Нукуалофа")}, + {135, 2350, 0, lpwszOther}, + {136, 1934, 0, TEXT("Фунафути")}, + {136, 2351, 0, lpwszOther}, + {137, 1935, 0, TEXT("Сува")}, + {137, 2352, 0, lpwszOther}, + {138, 3055, 0, TEXT("Барлингтон")}, + {138, 3049, 0, TEXT("Броссард")}, + {138, 3330, 0, TEXT("Бурнаби")}, + {138, 1169, 0, TEXT("Ванкувер")}, + {138, 3106, 0, TEXT("Ватерлоо")}, + {138, 1170, 0, TEXT("Виннипег")}, + {138, 1171, 0, TEXT("Галифакс")}, + {138, 1172, 0, TEXT("Гамильтон")}, + {138, 3365, 0, TEXT("Денвер")}, + {138, 1173, 0, TEXT("Калгари")}, + {138, 3104, 0, TEXT("Камлупс")}, + {138, 3366, 0, TEXT("Каннингтон")}, + {138, 1174, 0, TEXT("Квебек")}, + {138, 2964, 0, TEXT("Кингстон")}, + {138, 3113, 0, TEXT("Коквитлам")}, + {138, 1175, 0, TEXT("Монреаль")}, + {138, 2920, 0, TEXT("Ниагара-Фолс")}, + {138, 2889, 0, TEXT("Норд-Йорк")}, + {138, 1176, 0, TEXT("Оттава")}, + {138, 2903, 0, TEXT("Порт Алберни")}, + {138, 1177, 0, TEXT("Ричмонд")}, + {138, 1178, 0, TEXT("Тимминс")}, + {138, 2946, 0, TEXT("Торнхилл")}, + {138, 1179, 0, TEXT("Торонто")}, + {138, 1180, 0, TEXT("Эдмонтон")}, + {138, 2353, 0, lpwszOther}, + {139, 407, 0, TEXT("Вашингтон")}, + {139, 426, 0, TEXT("Айдахо")}, + {139, 378, 0, TEXT("Айова")}, + {139, 412, 0, TEXT("Алабама")}, + {139, 446, 0, TEXT("Аляска")}, + {139, 434, 0, TEXT("Аризона")}, + {139, 416, 0, TEXT("Арканзас")}, + {139, 428, 0, TEXT("Вайоминг")}, + {139, 440, 0, TEXT("Вашингтон")}, + {139, 352, 0, TEXT("Вермонт")}, + {139, 394, 0, TEXT("Виргиния")}, + {139, 374, 0, TEXT("Висконсин")}, + {139, 448, 0, TEXT("Гавайи")}, + {139, 390, 0, TEXT("Делавер")}, + {139, 402, 0, TEXT("Джорджия")}, + {139, 396, 0, TEXT("Западная Виргиния")}, + {139, 370, 0, TEXT("Иллинойс")}, + {139, 368, 0, TEXT("Индиана")}, + {139, 444, 0, TEXT("Калифорния")}, + {139, 388, 0, TEXT("Канзас")}, + {139, 408, 0, TEXT("Кентукки")}, + {139, 430, 0, TEXT("Колорадо")}, + {139, 358, 0, TEXT("Коннектикут")}, + {139, 418, 0, TEXT("Луизиана")}, + {139, 354, 0, TEXT("Массачусетс")}, + {139, 376, 0, TEXT("Миннесота")}, + {139, 414, 0, TEXT("Миссисипи")}, + {139, 380, 0, TEXT("Миссури")}, + {139, 372, 0, TEXT("Мичиган")}, + {139, 424, 0, TEXT("Монтана")}, + {139, 348, 0, TEXT("Мэн")}, + {139, 392, 0, TEXT("Мэриленд")}, + {139, 386, 0, TEXT("Небраска")}, + {139, 438, 0, TEXT("Невада")}, + {139, 362, 0, TEXT("Нью-Джерси")}, + {139, 360, 0, TEXT("Нью-Йорк")}, + {139, 432, 0, TEXT("Нью-Мексико")}, + {139, 350, 0, TEXT("Нью-Хэмпшир")}, + {139, 366, 0, TEXT("Огайо")}, + {139, 420, 0, TEXT("Оклахома")}, + {139, 442, 0, TEXT("Орегон")}, + {139, 364, 0, TEXT("Пенсильвания")}, + {139, 450, 0, TEXT("Пуэрто-Рико")}, + {139, 356, 0, TEXT("Род-Айленд")}, + {139, 382, 0, TEXT("Северная Дакота")}, + {139, 398, 0, TEXT("Северная Каролина")}, + {139, 410, 0, TEXT("Теннесси")}, + {139, 422, 0, TEXT("Техас")}, + {139, 406, 0, TEXT("Федеральный округ Колумбия")}, + {139, 404, 0, TEXT("Флорида")}, + {139, 384, 0, TEXT("Южная Дакота")}, + {139, 400, 0, TEXT("Южная Каролина")}, + {139, 436, 0, TEXT("Юта")}, + {140, 1238, 0, TEXT("Сент-Джонс")}, + {140, 2442, 0, lpwszOther}, + {141, 1239, 0, TEXT("Буэнос-Айрес")}, + {141, 2441, 0, lpwszOther}, + {142, 1240, 0, TEXT("Нассау")}, + {142, 2440, 0, lpwszOther}, + {143, 1241, 0, TEXT("Бриджтаун")}, + {143, 2439, 0, lpwszOther}, + {146, 1242, 0, TEXT("Бельмопан")}, + {146, 2438, 0, lpwszOther}, + {144, 1243, 0, TEXT("Ла-Пас")}, + {144, 2437, 0, lpwszOther}, + {145, 1244, 0, TEXT("Бразилиа")}, + {145, 3094, 0, TEXT("Пассо Фундо")}, + {145, 1245, 0, TEXT("Рио-де-Жанейро")}, + {145, 1246, 0, TEXT("Сан-Паулу")}, + {145, 2436, 0, lpwszOther}, + {147, 1247, 0, TEXT("Каракас")}, + {147, 2435, 0, lpwszOther}, + {452, 1190, 0, TEXT("Шарлотта-Амалия")}, + {452, 2364, 0, lpwszOther}, + {149, 1248, 0, TEXT("Порт-о-Пренс")}, + {149, 2434, 0, lpwszOther}, + {148, 1249, 0, TEXT("Джоржтаун")}, + {148, 2433, 0, lpwszOther}, + {173, 1250, 0, TEXT("Гватемала")}, + {173, 2432, 0, lpwszOther}, + {150, 1251, 0, TEXT("Тегусигальпа")}, + {150, 2431, 0, lpwszOther}, + {151, 1252, 0, TEXT("Сент-Джорджес")}, + {151, 2430, 0, lpwszOther}, + {152, 1253, 0, TEXT("Уманак")}, + {152, 2429, 0, lpwszOther}, + {153, 1254, 0, TEXT("Розо")}, + {153, 2428, 0, lpwszOther}, + {154, 1255, 0, TEXT("Санто-Доминго")}, + {154, 2427, 0, lpwszOther}, + {155, 1256, 0, TEXT("Богота")}, + {155, 2426, 0, lpwszOther}, + {156, 1257, 0, TEXT("Сан-Хосе")}, + {156, 2425, 0, lpwszOther}, + {157, 1258, 0, TEXT("Гавана")}, + {157, 2424, 0, lpwszOther}, + {158, 1259, 0, TEXT("Акапулько")}, + {158, 1260, 0, TEXT("Мехико")}, + {158, 2423, 0, lpwszOther}, + {159, 1261, 0, TEXT("Манагуа")}, + {159, 2422, 0, lpwszOther}, + {160, 1262, 0, TEXT("Панама")}, + {160, 2421, 0, lpwszOther}, + {161, 1263, 0, TEXT("Асунсьон")}, + {161, 2420, 0, lpwszOther}, + {162, 1264, 0, TEXT("Лима")}, + {162, 2419, 0, lpwszOther}, + {163, 1265, 0, TEXT("Сан-Сальвадор")}, + {163, 2418, 0, lpwszOther}, + {164, 1266, 0, TEXT("Кингстаун")}, + {164, 2417, 0, lpwszOther}, + {165, 1267, 0, TEXT("Бастер")}, + {165, 2416, 0, lpwszOther}, + {166, 1268, 0, TEXT("Кастри")}, + {166, 2415, 0, lpwszOther}, + {167, 1269, 0, TEXT("Парамарибо")}, + {167, 2414, 0, lpwszOther}, + {168, 1270, 0, TEXT("Порт-оф-Спейн")}, + {168, 2413, 0, lpwszOther}, + {169, 1271, 0, TEXT("Монтевидео")}, + {169, 2412, 0, lpwszOther}, + {170, 1272, 0, TEXT("Сантьяго")}, + {170, 2411, 0, lpwszOther}, + {171, 1273, 0, TEXT("Гуаякиль")}, + {171, 1274, 0, TEXT("Кито")}, + {171, 2410, 0, lpwszOther}, + {172, 1275, 0, TEXT("Кингстон")}, + {172, 2409, 0, lpwszOther}, + {174, 1854, 0, TEXT("Алжир")}, + {174, 2495, 0, lpwszOther}, + {175, 1855, 0, TEXT("Луанда")}, + {175, 2494, 0, lpwszOther}, + {176, 1856, 0, TEXT("Котону")}, + {176, 1857, 0, TEXT("Порто-Ново")}, + {176, 2493, 0, lpwszOther}, + {177, 1858, 0, TEXT("Габороне")}, + {177, 2492, 0, lpwszOther}, + {178, 1859, 0, TEXT("Уагадугу")}, + {178, 2491, 0, lpwszOther}, + {179, 1860, 0, TEXT("Бужумбуру")}, + {179, 2490, 0, lpwszOther}, + {180, 1861, 0, TEXT("Либревиль")}, + {180, 2489, 0, lpwszOther}, + {181, 1862, 0, TEXT("Банжул")}, + {181, 2488, 0, lpwszOther}, + {182, 1863, 0, TEXT("Аккра")}, + {182, 2487, 0, lpwszOther}, + {183, 1864, 0, TEXT("Конакри")}, + {183, 2486, 0, lpwszOther}, + {184, 1865, 0, TEXT("Бисау")}, + {184, 2485, 0, lpwszOther}, + {185, 1866, 0, TEXT("Джибути")}, + {185, 2484, 0, lpwszOther}, + {186, 3312, 0, TEXT("Дахаб")}, + {186, 1867, 0, TEXT("Каир")}, + {186, 1868, 0, TEXT("Хургада")}, + {186, 2483, 0, lpwszOther}, + {187, 1869, 0, TEXT("Лусака")}, + {187, 2482, 0, lpwszOther}, + {23, 1870, 0, TEXT("Хараре")}, + {23, 2481, 0, lpwszOther}, + {188, 1871, 0, TEXT("Прая")}, + {188, 2480, 0, lpwszOther}, + {189, 1872, 0, TEXT("Яунде")}, + {189, 2479, 0, lpwszOther}, + {190, 1873, 0, TEXT("Найроби")}, + {190, 2478, 0, lpwszOther}, + {191, 1874, 0, TEXT("Морони")}, + {191, 2477, 0, lpwszOther}, + {193, 1875, 0, TEXT("Киншаса")}, + {193, 2476, 0, lpwszOther}, + {192, 1876, 0, TEXT("Браззавиль")}, + {192, 2475, 0, lpwszOther}, + {194, 1877, 0, TEXT("Ямусукро")}, + {194, 2474, 0, lpwszOther}, + {195, 1878, 0, TEXT("Масеру")}, + {195, 2473, 0, lpwszOther}, + {196, 1879, 0, TEXT("Монровия")}, + {196, 2472, 0, lpwszOther}, + {197, 1880, 0, TEXT("Триполи")}, + {197, 2471, 0, lpwszOther}, + {198, 1881, 0, TEXT("Порт-Луи")}, + {198, 2470, 0, lpwszOther}, + {199, 1882, 0, TEXT("Нуакшот")}, + {199, 2469, 0, lpwszOther}, + {200, 1883, 0, TEXT("Антананариву")}, + {200, 2468, 0, lpwszOther}, + {201, 1884, 0, TEXT("Лилонгве")}, + {201, 2467, 0, lpwszOther}, + {202, 1885, 0, TEXT("Бамако")}, + {202, 2466, 0, lpwszOther}, + {203, 1886, 0, TEXT("Агадир")}, + {203, 1887, 0, TEXT("Рабат")}, + {203, 2465, 0, lpwszOther}, + {204, 1888, 0, TEXT("Мапуту")}, + {204, 2464, 0, lpwszOther}, + {205, 1889, 0, TEXT("Виндхук")}, + {205, 2463, 0, lpwszOther}, + {206, 1890, 0, TEXT("Ниамей")}, + {206, 2462, 0, lpwszOther}, + {207, 1891, 0, TEXT("Абуджа")}, + {207, 2461, 0, lpwszOther}, + {208, 1892, 0, TEXT("Кигали")}, + {208, 2460, 0, lpwszOther}, + {209, 1893, 0, TEXT("Сан-Томе")}, + {209, 2459, 0, lpwszOther}, + {210, 1894, 0, TEXT("Мбабане")}, + {210, 2458, 0, lpwszOther}, + {211, 1895, 0, TEXT("Виктория")}, + {211, 2457, 0, lpwszOther}, + {212, 1896, 0, TEXT("Дакар")}, + {212, 2456, 0, lpwszOther}, + {213, 1897, 0, TEXT("Могадишо")}, + {213, 2455, 0, lpwszOther}, + {214, 1898, 0, TEXT("Хартум")}, + {214, 2454, 0, lpwszOther}, + {215, 1899, 0, TEXT("Фритаун")}, + {215, 2453, 0, lpwszOther}, + {216, 1900, 0, TEXT("Дар-эс-Салам")}, + {216, 1901, 0, TEXT("Додома")}, + {216, 2452, 0, lpwszOther}, + {217, 1902, 0, TEXT("Ломе")}, + {217, 2451, 0, lpwszOther}, + {218, 1903, 0, TEXT("Тунис")}, + {218, 2450, 0, lpwszOther}, + {219, 1904, 0, TEXT("Кампала")}, + {219, 2449, 0, lpwszOther}, + {220, 1905, 0, TEXT("Банги")}, + {220, 2448, 0, lpwszOther}, + {222, 1906, 0, TEXT("Нджамена")}, + {222, 2447, 0, lpwszOther}, + {223, 1907, 0, TEXT("Малабо")}, + {223, 2446, 0, lpwszOther}, + {221, 1908, 0, TEXT("Асмэра")}, + {221, 2445, 0, lpwszOther}, + {224, 1909, 0, TEXT("Аддис-Абеба")}, + {224, 2444, 0, lpwszOther}, + {225, 1910, 0, TEXT("Дурбан")}, + {225, 1913, 0, TEXT("Йоханнесбург")}, + {225, 1912, 0, TEXT("Кейптаун")}, + {225, 3033, 0, TEXT("Пайнтаун")}, + {225, 1911, 0, TEXT("Претория")}, + {225, 2443, 0, lpwszOther}, + {39, 314, 0, TEXT("Киев")}, + {39, 315, 0, TEXT("Винницкая обл.")}, + {39, 316, 0, TEXT("Волынская обл.")}, + {39, 317, 0, TEXT("Днепропетровская обл.")}, + {39, 318, 0, TEXT("Донецкая обл.")}, + {39, 319, 0, TEXT("Житомирская обл.")}, + {39, 320, 0, TEXT("Закарпатская обл.")}, + {39, 321, 0, TEXT("Запорожская обл.")}, + {39, 322, 0, TEXT("Ивано-Франковская обл.")}, + {39, 323, 0, TEXT("Киевская обл.")}, + {39, 324, 0, TEXT("Кировоградская обл.")}, + {39, 325, 0, TEXT("Крым")}, + {39, 326, 0, TEXT("Луганская обл.")}, + {39, 327, 0, TEXT("Львовская обл.")}, + {39, 328, 0, TEXT("Николаевская обл.")}, + {39, 329, 0, TEXT("Одесская обл.")}, + {39, 330, 0, TEXT("Полтавская обл.")}, + {39, 331, 0, TEXT("Ровенская обл.")}, + {39, 332, 0, TEXT("Сумская обл.")}, + {39, 333, 0, TEXT("Тернопольская обл.")}, + {39, 334, 0, TEXT("Харьковская обл.")}, + {39, 335, 0, TEXT("Херсонская обл.")}, + {39, 336, 0, TEXT("Хмельницкая обл.")}, + {39, 337, 0, TEXT("Черкасская обл.")}, + {39, 338, 0, TEXT("Черниговская обл.")}, + {39, 339, 0, TEXT("Черновицкая обл.")}, + {40, 602, 0, TEXT("Бад Халл")}, + {40, 604, 0, TEXT("Брегенц")}, + {40, 603, 0, TEXT("Вена")}, + {40, 608, 0, TEXT("Грац")}, + {40, 606, 0, TEXT("Зальцбург")}, + {40, 3099, 0, TEXT("Зель-ам-Зее")}, + {40, 605, 0, TEXT("Инсбрук")}, + {40, 3174, 0, TEXT("Кирхберг")}, + {40, 609, 0, TEXT("Клагенфурт")}, + {40, 607, 0, TEXT("Линц")}, + {40, 610, 0, TEXT("Обдах")}, + {40, 611, 0, TEXT("Щтубайтал")}, + {40, 2541, 0, lpwszOther}, + {32, 612, 0, TEXT("Тирана")}, + {32, 2540, 0, lpwszOther}, + {33, 613, 0, TEXT("Андорра-ла-Велья")}, + {33, 2539, 0, lpwszOther}, + {340, 341, 0, TEXT("Минск")}, + {340, 342, 0, TEXT("Брестская обл.")}, + {340, 343, 0, TEXT("Витебская обл.")}, + {340, 344, 0, TEXT("Гомельская обл.")}, + {340, 345, 0, TEXT("Гродненская обл.")}, + {340, 346, 0, TEXT("Минская обл.")}, + {340, 347, 0, TEXT("Могилевская обл.")}, + {38, 760, 0, TEXT("Антверпен")}, + {38, 767, 0, TEXT("Арлон")}, + {38, 762, 0, TEXT("Брюгге")}, + {38, 761, 0, TEXT("Брюссель")}, + {38, 763, 0, TEXT("Гент")}, + {38, 769, 0, TEXT("Лувен")}, + {38, 765, 0, TEXT("Льеж")}, + {38, 764, 0, TEXT("Монс")}, + {38, 3117, 0, TEXT("Мортсель")}, + {38, 766, 0, TEXT("Намюр")}, + {38, 768, 0, TEXT("Хасселт")}, + {38, 2532, 0, lpwszOther}, + {41, 3098, 0, TEXT("Банско")}, + {41, 792, 0, TEXT("Благоевград")}, + {41, 770, 0, TEXT("Бургас")}, + {41, 771, 0, TEXT("Бяла")}, + {41, 773, 0, TEXT("Варна")}, + {41, 776, 0, TEXT("Велико-Тырново")}, + {41, 788, 0, TEXT("Видин")}, + {41, 789, 0, TEXT("Враца")}, + {41, 796, 0, TEXT("Габрово")}, + {41, 777, 0, TEXT("Димитровград")}, + {41, 781, 0, TEXT("Каварна")}, + {41, 786, 0, TEXT("Кырджали")}, + {41, 791, 0, TEXT("Кюстендил")}, + {41, 793, 0, TEXT("Лазарджик")}, + {41, 795, 0, TEXT("Ловеч")}, + {41, 787, 0, TEXT("Михайловград")}, + {41, 790, 0, TEXT("Перник")}, + {41, 3133, 0, TEXT("Пирдоп")}, + {41, 794, 0, TEXT("Плевен")}, + {41, 782, 0, TEXT("Пловдив")}, + {41, 780, 0, TEXT("Разград")}, + {41, 779, 0, TEXT("Русе")}, + {41, 774, 0, TEXT("Силистра")}, + {41, 784, 0, TEXT("Сливен")}, + {41, 772, 0, TEXT("София")}, + {41, 775, 0, TEXT("Толбухин")}, + {41, 3116, 0, TEXT("Тырново")}, + {41, 785, 0, TEXT("Хасково")}, + {41, 778, 0, TEXT("Шумен")}, + {41, 783, 0, TEXT("Ямбол")}, + {41, 2531, 0, lpwszOther}, + {42, 797, 0, TEXT("Баня-Лука")}, + {42, 799, 0, TEXT("Зеница")}, + {42, 798, 0, TEXT("Сараево")}, + {42, 800, 0, TEXT("Тузла")}, + {42, 2530, 0, lpwszOther}, + {45, 802, 0, TEXT("Абердин")}, + {45, 3075, 0, TEXT("Айслворт")}, + {45, 801, 0, TEXT("Алнвик")}, + {45, 804, 0, TEXT("Бидефорд")}, + {45, 803, 0, TEXT("Бирмингем")}, + {45, 805, 0, TEXT("Блоксвич")}, + {45, 3168, 0, TEXT("Бостон")}, + {45, 806, 0, TEXT("Брайтон")}, + {45, 807, 0, TEXT("Бредфорд")}, + {45, 808, 0, TEXT("Бристоль")}, + {45, 809, 0, TEXT("Вилленхолл")}, + {45, 3131, 0, TEXT("Воррингтон")}, + {45, 810, 0, TEXT("Вудбридж")}, + {45, 3342, 0, TEXT("Гилфорд")}, + {45, 811, 0, TEXT("Глазго")}, + {45, 812, 0, TEXT("Дадли")}, + {45, 813, 0, TEXT("Дарем")}, + {45, 814, 0, TEXT("Дуглас")}, + {45, 3089, 0, TEXT("Кардиф")}, + {45, 815, 0, TEXT("Кембридж")}, + {45, 816, 0, TEXT("Кентербери")}, + {45, 817, 0, TEXT("Ливерпуль")}, + {45, 818, 0, TEXT("Лидс")}, + {45, 819, 0, TEXT("Лондон")}, + {45, 820, 0, TEXT("Манчестер")}, + {45, 2976, 0, TEXT("Митчем")}, + {45, 2988, 0, TEXT("Мэйденхед")}, + {45, 821, 0, TEXT("Ноттингем")}, + {45, 3088, 0, TEXT("Ньюпорт")}, + {45, 822, 0, TEXT("Оксфорд")}, + {45, 823, 0, TEXT("Плимут")}, + {45, 824, 0, TEXT("Портсмут")}, + {45, 825, 0, TEXT("Престон")}, + {45, 3343, 0, TEXT("Райд")}, + {45, 2867, 0, TEXT("Ридинг")}, + {45, 2986, 0, TEXT("Сент-Албанс")}, + {45, 826, 0, TEXT("Стаффорд")}, + {45, 3063, 0, TEXT("Стокпорт")}, + {45, 827, 0, TEXT("Уэймут")}, + {45, 3140, 0, TEXT("Челтенхэм")}, + {45, 828, 0, TEXT("Честер")}, + {45, 829, 0, TEXT("Шеффилд")}, + {45, 830, 0, TEXT("Эдинбург")}, + {45, 2529, 0, lpwszOther}, + {44, 831, 0, TEXT("Будапешт")}, + {44, 832, 0, TEXT("Геделле")}, + {44, 836, 0, TEXT("Дебрецен")}, + {44, 835, 0, TEXT("Мишкольц")}, + {44, 834, 0, TEXT("Сегед")}, + {44, 833, 0, TEXT("Шиофок")}, + {44, 2528, 0, lpwszOther}, + {46, 3007, 0, TEXT("Аахен")}, + {46, 837, 0, TEXT("Аугсбург")}, + {46, 838, 0, TEXT("Баден-Баден")}, + {46, 3371, 0, TEXT("Бамберг")}, + {46, 839, 0, TEXT("Бергиш-Гладбах")}, + {46, 840, 0, TEXT("Берлин")}, + {46, 841, 0, TEXT("Билефельд")}, + {46, 3163, 0, TEXT("Бовенден")}, + {46, 842, 0, TEXT("Бонн")}, + {46, 843, 0, TEXT("Браденбург")}, + {46, 3015, 0, TEXT("Брауншвейг")}, + {46, 844, 0, TEXT("Бремен")}, + {46, 2921, 0, TEXT("Варштайн")}, + {46, 845, 0, TEXT("Веймар")}, + {46, 846, 0, TEXT("Вупперталь")}, + {46, 847, 0, TEXT("Гамбург")}, + {46, 848, 0, TEXT("Ганновер")}, + {46, 849, 0, TEXT("Гарделеген")}, + {46, 3010, 0, TEXT("Гейдельберг")}, + {46, 850, 0, TEXT("Гота")}, + {46, 851, 0, TEXT("Дармштадт")}, + {46, 3072, 0, TEXT("Дессау")}, + {46, 852, 0, TEXT("Детмольд")}, + {46, 853, 0, TEXT("Дортмунд")}, + {46, 854, 0, TEXT("Дрезден")}, + {46, 855, 0, TEXT("Дюссельдорф")}, + {46, 3082, 0, TEXT("Иффецхайм")}, + {46, 3309, 0, TEXT("Кассел")}, + {46, 856, 0, TEXT("Кельн")}, + {46, 857, 0, TEXT("Киль")}, + {46, 3138, 0, TEXT("Кобленц")}, + {46, 858, 0, TEXT("Крефельд")}, + {46, 859, 0, TEXT("Лейпциг")}, + {46, 2872, 0, TEXT("Лимбург")}, + {46, 2965, 0, TEXT("Линген")}, + {46, 3135, 0, TEXT("Любек")}, + {46, 3156, 0, TEXT("Мангейм")}, + {46, 3192, 0, TEXT("Меерсбург")}, + {46, 860, 0, TEXT("Мюнстер")}, + {46, 861, 0, TEXT("Мюнхен")}, + {46, 2864, 0, TEXT("Нойштадт")}, + {46, 862, 0, TEXT("Нюрнберг")}, + {46, 3009, 0, TEXT("Оффенбург")}, + {46, 2993, 0, TEXT("Падерборн")}, + {46, 863, 0, TEXT("Равенсбург")}, + {46, 864, 0, TEXT("Регенсбург")}, + {46, 865, 0, TEXT("Рейнен")}, + {46, 866, 0, TEXT("Росток")}, + {46, 3191, 0, TEXT("Саарбрюкен")}, + {46, 2974, 0, TEXT("Санкт-Августин")}, + {46, 3127, 0, TEXT("Тюринген")}, + {46, 867, 0, TEXT("Фрайберг")}, + {46, 868, 0, TEXT("Фрайбург")}, + {46, 869, 0, TEXT("Франкфурт-на-Майне")}, + {46, 3373, 0, TEXT("Хемнитц")}, + {46, 3313, 0, TEXT("Хильден")}, + {46, 870, 0, TEXT("Штутгарт")}, + {46, 3045, 0, TEXT("Эрланген")}, + {46, 2906, 0, TEXT("Эшборн")}, + {46, 2527, 0, lpwszOther}, + {48, 871, 0, TEXT("Афины")}, + {48, 873, 0, TEXT("Ираклион")}, + {48, 3147, 0, TEXT("Корфу")}, + {48, 872, 0, TEXT("Салоники")}, + {48, 3178, 0, TEXT("Халкидики")}, + {48, 2526, 0, lpwszOther}, + {49, 3006, 0, TEXT("Архус")}, + {49, 874, 0, TEXT("Копенгаген")}, + {49, 875, 0, TEXT("Оденсе")}, + {49, 3285, 0, TEXT("Ольборг")}, + {49, 876, 0, TEXT("Сванеке")}, + {49, 3126, 0, TEXT("Скиве")}, + {49, 2525, 0, lpwszOther}, + {50, 3377, 0, TEXT("Виклоу")}, + {50, 3067, 0, TEXT("Голвей")}, + {50, 877, 0, TEXT("Дублин")}, + {50, 3065, 0, TEXT("Килларней")}, + {50, 3066, 0, TEXT("Корк")}, + {50, 878, 0, TEXT("Лимерик")}, + {50, 3069, 0, TEXT("Нейс")}, + {50, 3068, 0, TEXT("Типперэри")}, + {50, 2524, 0, lpwszOther}, + {51, 879, 0, TEXT("Рейкьявик")}, + {51, 2523, 0, lpwszOther}, + {34, 880, 0, TEXT("Аликанте")}, + {34, 3125, 0, TEXT("Альмерия")}, + {34, 881, 0, TEXT("Барселона")}, + {34, 890, 0, TEXT("Бильбао")}, + {34, 3076, 0, TEXT("Бланес")}, + {34, 882, 0, TEXT("Валенсия")}, + {34, 3070, 0, TEXT("Ибица")}, + {34, 888, 0, TEXT("Кадис")}, + {34, 886, 0, TEXT("Картахена")}, + {34, 891, 0, TEXT("Ла-Корунья")}, + {34, 3310, 0, TEXT("Лорет де Мар")}, + {34, 883, 0, TEXT("Мадрид")}, + {34, 884, 0, TEXT("Малага")}, + {34, 885, 0, TEXT("Марбелья")}, + {34, 892, 0, TEXT("Овьедо")}, + {34, 3179, 0, TEXT("Пальма де Майорка")}, + {34, 3177, 0, TEXT("Сан-Агустин")}, + {34, 3289, 0, TEXT("Санта-Крус-де-Тенерифе")}, + {34, 889, 0, TEXT("Сарагоса")}, + {34, 887, 0, TEXT("Севилья")}, + {34, 893, 0, TEXT("Хихон")}, + {34, 2522, 0, lpwszOther}, + {52, 3318, 0, TEXT("Аоста")}, + {52, 3278, 0, TEXT("Беллариа")}, + {52, 906, 0, TEXT("Болонья")}, + {52, 894, 0, TEXT("Брешиа")}, + {52, 895, 0, TEXT("Венеция")}, + {52, 905, 0, TEXT("Верона")}, + {52, 896, 0, TEXT("Генуя")}, + {52, 897, 0, TEXT("Лекко")}, + {52, 3369, 0, TEXT("Ливорно")}, + {52, 3327, 0, TEXT("Марсала")}, + {52, 898, 0, TEXT("Милан")}, + {52, 899, 0, TEXT("Модена")}, + {52, 907, 0, TEXT("Неаполь")}, + {52, 908, 0, TEXT("Перуджа")}, + {52, 900, 0, TEXT("Пиза")}, + {52, 901, 0, TEXT("Рим")}, + {52, 3368, 0, TEXT("Сан-Ремо")}, + {52, 3384, 0, TEXT("Сиракуза")}, + {52, 3252, 0, TEXT("Терамо")}, + {52, 902, 0, TEXT("Триест")}, + {52, 903, 0, TEXT("Турин")}, + {52, 3130, 0, TEXT("Фано")}, + {52, 904, 0, TEXT("Флоренция")}, + {52, 2521, 0, lpwszOther}, + {53, 2939, 0, TEXT("Айзкраукле")}, + {53, 3054, 0, TEXT("Валка")}, + {53, 909, 0, TEXT("Даугавпилс")}, + {53, 2934, 0, TEXT("Екабпилс")}, + {53, 913, 0, TEXT("Елгава")}, + {53, 2935, 0, TEXT("Кокнесе")}, + {53, 912, 0, TEXT("Лиепая")}, + {53, 2905, 0, TEXT("Резекне")}, + {53, 911, 0, TEXT("Рига")}, + {53, 2936, 0, TEXT("Саласпилс")}, + {53, 2937, 0, TEXT("Смилтене")}, + {53, 910, 0, TEXT("Юрмала")}, + {53, 2520, 0, lpwszOther}, + {54, 914, 0, TEXT("Вильнюс")}, + {54, 915, 0, TEXT("Висагинас")}, + {54, 916, 0, TEXT("Каунас")}, + {54, 918, 0, TEXT("Клайпеда")}, + {54, 919, 0, TEXT("Паланга")}, + {54, 3173, 0, TEXT("Пеневежис")}, + {54, 917, 0, TEXT("Шауляй")}, + {54, 2519, 0, lpwszOther}, + {55, 920, 0, TEXT("Вадуц")}, + {55, 2518, 0, lpwszOther}, + {56, 3376, 0, TEXT("Бетцдорф")}, + {56, 921, 0, TEXT("Люксембург")}, + {56, 2517, 0, lpwszOther}, + {57, 3142, 0, TEXT("Битола")}, + {57, 922, 0, TEXT("Скопье")}, + {57, 2516, 0, lpwszOther}, + {58, 923, 0, TEXT("Валлетта")}, + {58, 3154, 0, TEXT("Мзида")}, + {58, 924, 0, TEXT("Слима")}, + {58, 2515, 0, lpwszOther}, + {59, 925, 0, TEXT("Бельцы")}, + {59, 926, 0, TEXT("Бендеры")}, + {59, 3234, 0, TEXT("Дубоссары")}, + {59, 3275, 0, TEXT("Кахул")}, + {59, 927, 0, TEXT("Кишинев")}, + {59, 3321, 0, TEXT("Резина")}, + {59, 928, 0, TEXT("Рыбница")}, + {59, 929, 0, TEXT("Тирасполь")}, + {59, 3281, 0, TEXT("Чадыр-Лунга")}, + {59, 2514, 0, lpwszOther}, + {36, 930, 0, TEXT("Монте-Карло")}, + {36, 2513, 0, lpwszOther}, + {60, 931, 0, TEXT("Амстердам")}, + {60, 933, 0, TEXT("Бреда")}, + {60, 932, 0, TEXT("Гаага")}, + {60, 934, 0, TEXT("Гауда")}, + {60, 935, 0, TEXT("Делфт")}, + {60, 2977, 0, TEXT("Донген")}, + {60, 3030, 0, TEXT("Зволле")}, + {60, 3091, 0, TEXT("Ниймеген")}, + {60, 936, 0, TEXT("Роттердам")}, + {60, 937, 0, TEXT("Утрехт")}, + {60, 3044, 0, TEXT("Эйндховен")}, + {60, 3380, 0, TEXT("Эншеде")}, + {60, 2512, 0, lpwszOther}, + {61, 3190, 0, TEXT("Кристиансанд")}, + {61, 2857, 0, TEXT("Лиллехаммер")}, + {61, 938, 0, TEXT("Осло")}, + {61, 3355, 0, TEXT("Ставангер")}, + {61, 939, 0, TEXT("Тронхейм")}, + {61, 2511, 0, lpwszOther}, + {62, 940, 0, TEXT("Белосток")}, + {62, 941, 0, TEXT("Варшава")}, + {62, 3164, 0, TEXT("Вроцлав")}, + {62, 942, 0, TEXT("Гданьск")}, + {62, 943, 0, TEXT("Гливице")}, + {62, 3237, 0, TEXT("Закопане")}, + {62, 3165, 0, TEXT("Зелена Гура")}, + {62, 944, 0, TEXT("Катовице")}, + {62, 945, 0, TEXT("Краков")}, + {62, 3008, 0, TEXT("Лодзь")}, + {62, 3150, 0, TEXT("Ольштын")}, + {62, 946, 0, TEXT("Познань")}, + {62, 947, 0, TEXT("Радом")}, + {62, 948, 0, TEXT("Сопот")}, + {62, 2958, 0, TEXT("Тыхы")}, + {62, 2510, 0, lpwszOther}, + {35, 949, 0, TEXT("Лиссабон")}, + {35, 950, 0, TEXT("Порто")}, + {35, 2509, 0, lpwszOther}, + {63, 952, 0, TEXT("Брашов")}, + {63, 951, 0, TEXT("Бухарест")}, + {63, 954, 0, TEXT("Констанца")}, + {63, 955, 0, TEXT("Плоешти")}, + {63, 953, 0, TEXT("Яссы")}, + {63, 2508, 0, lpwszOther}, + {64, 956, 0, TEXT("Сан-Марино")}, + {64, 2507, 0, lpwszOther}, + {74, 957, 0, TEXT("Белград")}, + {74, 960, 0, TEXT("Ниш")}, + {74, 958, 0, TEXT("Нови-Сад")}, + {74, 959, 0, TEXT("Сараево")}, + {74, 2506, 0, lpwszOther}, + {65, 961, 0, TEXT("Братислава")}, + {65, 962, 0, TEXT("Кошице")}, + {65, 3101, 0, TEXT("Липтов")}, + {65, 963, 0, TEXT("Попрад")}, + {65, 964, 0, TEXT("Прешов")}, + {65, 965, 0, TEXT("Ружемберок")}, + {65, 966, 0, TEXT("Тврдошин")}, + {65, 2505, 0, lpwszOther}, + {66, 968, 0, TEXT("Копар")}, + {66, 967, 0, TEXT("Любляна")}, + {66, 969, 0, TEXT("Марибор")}, + {66, 2504, 0, lpwszOther}, + {67, 970, 0, TEXT("Торсхавн")}, + {67, 2503, 0, lpwszOther}, + {68, 2888, 0, TEXT("Вантаа")}, + {68, 971, 0, TEXT("Васа")}, + {68, 979, 0, TEXT("Котка")}, + {68, 972, 0, TEXT("Коувола")}, + {68, 980, 0, TEXT("Лахти")}, + {68, 973, 0, TEXT("Оулу")}, + {68, 3375, 0, TEXT("Риихимяки")}, + {68, 3159, 0, TEXT("Руовеси")}, + {68, 974, 0, TEXT("Тампере")}, + {68, 975, 0, TEXT("Турку")}, + {68, 976, 0, TEXT("Хельсинки")}, + {68, 977, 0, TEXT("Эспо")}, + {68, 978, 0, TEXT("Ювяскюля")}, + {68, 2502, 0, lpwszOther}, + {37, 996, 0, TEXT("Авиньон")}, + {37, 983, 0, TEXT("Бержерак")}, + {37, 997, 0, TEXT("Блуа")}, + {37, 984, 0, TEXT("Бордо")}, + {37, 998, 0, TEXT("Дижон")}, + {37, 987, 0, TEXT("Канн")}, + {37, 988, 0, TEXT("Кастр")}, + {37, 993, 0, TEXT("Клермон-Ферран")}, + {37, 3037, 0, TEXT("Лилль")}, + {37, 989, 0, TEXT("Лион")}, + {37, 985, 0, TEXT("Марсель")}, + {37, 991, 0, TEXT("Мец")}, + {37, 3161, 0, TEXT("Мобеж")}, + {37, 990, 0, TEXT("Нанси")}, + {37, 994, 0, TEXT("Нант")}, + {37, 995, 0, TEXT("Ницца")}, + {37, 999, 0, TEXT("Орлеан")}, + {37, 981, 0, TEXT("Париж")}, + {37, 3374, 0, TEXT("Перпиньян")}, + {37, 992, 0, TEXT("Руан")}, + {37, 982, 0, TEXT("Страсбург")}, + {37, 986, 0, TEXT("Тулуза")}, + {37, 3314, 0, TEXT("Шамбери")}, + {37, 2501, 0, lpwszOther}, + {69, 1003, 0, TEXT("Дубровник")}, + {69, 1000, 0, TEXT("Загреб")}, + {69, 1001, 0, TEXT("Задар")}, + {69, 1004, 0, TEXT("Риека")}, + {69, 1002, 0, TEXT("Сплит")}, + {69, 2500, 0, lpwszOther}, + {70, 1005, 0, TEXT("Брно")}, + {70, 3291, 0, TEXT("Гавличкув-Брод")}, + {70, 1007, 0, TEXT("Градец-Кралове")}, + {70, 1008, 0, TEXT("Карлови-Вари")}, + {70, 3019, 0, TEXT("Кладрубы")}, + {70, 1010, 0, TEXT("Лоуни")}, + {70, 1009, 0, TEXT("Острава")}, + {70, 1015, 0, TEXT("Пльзень")}, + {70, 3105, 0, TEXT("Правчицка Брана")}, + {70, 1006, 0, TEXT("Прага")}, + {70, 3246, 0, TEXT("Тачов")}, + {70, 1011, 0, TEXT("Тршебич")}, + {70, 1012, 0, TEXT("Усти-над-Лабем")}, + {70, 1014, 0, TEXT("Ческе-Будеевице")}, + {70, 1013, 0, TEXT("Яблонец-над-Нисоу")}, + {70, 2499, 0, lpwszOther}, + {71, 1016, 0, TEXT("Арау")}, + {71, 1019, 0, TEXT("Баден")}, + {71, 1017, 0, TEXT("Базель")}, + {71, 1018, 0, TEXT("Берн")}, + {71, 1020, 0, TEXT("Биль")}, + {71, 1021, 0, TEXT("Винтертур")}, + {71, 1022, 0, TEXT("Давос")}, + {71, 3189, 0, TEXT("Делемонт")}, + {71, 1023, 0, TEXT("Женева")}, + {71, 1024, 0, TEXT("Золотурн")}, + {71, 1025, 0, TEXT("Лозанна")}, + {71, 1026, 0, TEXT("Локарно")}, + {71, 1027, 0, TEXT("Лугано")}, + {71, 1028, 0, TEXT("Люцерн")}, + {71, 1029, 0, TEXT("Монтре")}, + {71, 1030, 0, TEXT("Цюрих")}, + {71, 2498, 0, lpwszOther}, + {72, 2883, 0, TEXT("Арбога")}, + {72, 1031, 0, TEXT("Гетеборг")}, + {72, 1032, 0, TEXT("Кальмар")}, + {72, 1037, 0, TEXT("Лахольм")}, + {72, 1036, 0, TEXT("Лулео")}, + {72, 1042, 0, TEXT("Лунд")}, + {72, 1033, 0, TEXT("Мальме")}, + {72, 1034, 0, TEXT("Стокгольм")}, + {72, 1041, 0, TEXT("Умео")}, + {72, 1039, 0, TEXT("Фалун")}, + {72, 1043, 0, TEXT("Хельсинборг")}, + {72, 1040, 0, TEXT("Хернесанд")}, + {72, 1038, 0, TEXT("Эстерсунд")}, + {72, 2497, 0, lpwszOther}, + {73, 3013, 0, TEXT("Валга")}, + {73, 1044, 0, TEXT("Кейла")}, + {73, 1045, 0, TEXT("Кохтла-Ярве")}, + {73, 1046, 0, TEXT("Маарду")}, + {73, 1047, 0, TEXT("Мыйзакюла")}, + {73, 1048, 0, TEXT("Нарва")}, + {73, 1049, 0, TEXT("Пярну")}, + {73, 1050, 0, TEXT("Раквере")}, + {73, 1051, 0, TEXT("Силламяэ")}, + {73, 1052, 0, TEXT("Таллин")}, + {73, 1053, 0, TEXT("Тарту")}, + {73, 1054, 0, TEXT("Хаапсалу")}, + {0, 0, 0, NULL} +};//*/ + +/* +static const MRA_COUNTRY mracCountrys[]= +{ + {24, TEXT("Россия")}, + {81, TEXT("Азербайджан")}, + {82, TEXT("Армения")}, + {97, TEXT("Афганистан")}, + {96, TEXT("Бангладеш")}, + {99, TEXT("Бахрейн")}, + {100, TEXT("Бруней-Даруссалам")}, + {101, TEXT("Бутан")}, + {102, TEXT("Вьетнам")}, + {83, TEXT("Грузия")}, + {86, TEXT("Израиль")}, + {95, TEXT("Индия")}, + {103, TEXT("Индонезия")}, + {79, TEXT("Иордания")}, + {85, TEXT("Ирак")}, + {87, TEXT("Иран")}, + {104, TEXT("Йемен")}, + {84, TEXT("Казахстан")}, + {105, TEXT("Камбоджа")}, + {106, TEXT("Катар")}, + {107, TEXT("Кипр")}, + {92, TEXT("Киргизия (Кыргызстан)")}, + {76, TEXT("Китай")}, + {3215, TEXT("Кокосовые острова (Австр.)")}, + {29, TEXT("Корея (КНДР)")}, + {108, TEXT("Корея")}, + {88, TEXT("Кувейт")}, + {109, TEXT("Лаос")}, + {110, TEXT("Ливан")}, + {111, TEXT("Малайзия")}, + {112, TEXT("Мальдивы")}, + {113, TEXT("Монголия")}, + {114, TEXT("Мьянма")}, + {115, TEXT("Непал")}, + {116, TEXT("Объединенные Арабские Эмираты")}, + {117, TEXT("Оман")}, + {3216, TEXT("Остров Рождества (Австр.)")}, + {122, TEXT("Пакистан")}, + {89, TEXT("Палестина")}, + {94, TEXT("Саудовская Аравия")}, + {118, TEXT("Сингапур")}, + {78, TEXT("Сирия")}, + {91, TEXT("Таджикистан")}, + {119, TEXT("Таиланд")}, + {120, TEXT("Тайвань")}, + {132, TEXT("Тимор")}, + {90, TEXT("Туркмения")}, + {77, TEXT("Турция")}, + {93, TEXT("Узбекистан")}, + {121, TEXT("Филиппины")}, + {98, TEXT("Шри Ланка")}, + {75, TEXT("Япония")}, + {123, TEXT("Австралия")}, + {454, TEXT("Американское Самоа")}, + {124, TEXT("Вануату")}, + {453, TEXT("Гуам (США)")}, + {126, TEXT("Кирибати")}, + {127, TEXT("Маршалловы Острова")}, + {128, TEXT("Микронезия (Федеративные Штаты Микронезии)")}, + {129, TEXT("Науру")}, + {3220, TEXT("Ниуэ (Н.Зел.)")}, + {130, TEXT("Новая Зеландия")}, + {3218, TEXT("Новая Каледония (Фр.)")}, + {3221, TEXT("Острова Кука (Н.Зел.)")}, + {3230, TEXT("Острова Херд и Макдональд (Австр.)")}, + {131, TEXT("Палау")}, + {133, TEXT("Папуа - Новая Гвинея")}, + {3222, TEXT("Питкерн (Брит.)")}, + {125, TEXT("Самоа")}, + {3219, TEXT("Сев. Марианские острова (США)")}, + {134, TEXT("Соломоновы Острова")}, + {3223, TEXT("Токелау (Н.Зел.)")}, + {135, TEXT("Тонга")}, + {136, TEXT("Тувалу")}, + {3224, TEXT("Уоллис и Футуна острова (Фр.)")}, + {137, TEXT("Фиджи")}, + {3226, TEXT("Французская Полинезия")}, + {3225, TEXT("Французские Южные территории")}, + {138, TEXT("Канада")}, + {139, TEXT("США")}, + {3200, TEXT("Ангилья (Брит.)")}, + {140, TEXT("Антигуа и Барбуда")}, + {141, TEXT("Аргентина")}, + {3202, TEXT("Аруба (Нид.)")}, + {142, TEXT("Багамы")}, + {143, TEXT("Барбадос")}, + {146, TEXT("Белиз")}, + {3203, TEXT("Бермуды (Брит.)")}, + {144, TEXT("Боливия")}, + {145, TEXT("Бразилия")}, + {147, TEXT("Венесуэла")}, + {3204, TEXT("Виргинские острова (Брит.)")}, + {452, TEXT("Виргинские острова (США)")}, + {149, TEXT("Гаити")}, + {148, TEXT("Гайана")}, + {3205, TEXT("Гваделупа (Фр.)")}, + {173, TEXT("Гватемала")}, + {150, TEXT("Гондурас")}, + {151, TEXT("Гренада")}, + {152, TEXT("Гренландия (Дат.)")}, + {153, TEXT("Доминика")}, + {154, TEXT("Доминиканская Республика")}, + {155, TEXT("Колумбия")}, + {156, TEXT("Коста-Рика")}, + {157, TEXT("Куба")}, + {3208, TEXT("Мартиника (Фр.)")}, + {158, TEXT("Мексика")}, + {3209, TEXT("Монтсеррат (Брит)")}, + {3201, TEXT("Нидерландские Антилы")}, + {159, TEXT("Никарагуа")}, + {3207, TEXT("Остров Кайман (Брит.)")}, + {3211, TEXT("Острова Теркс и Кайкос (Брит.)")}, + {160, TEXT("Панама")}, + {161, TEXT("Парагвай")}, + {162, TEXT("Перу")}, + {163, TEXT("Сальвадор")}, + {164, TEXT("Сент-Винсент и Гренадины")}, + {165, TEXT("Сент-Китс и Невис")}, + {166, TEXT("Сент-Люсия")}, + {3210, TEXT("Сент-Пьер и Микелон (Фр.)")}, + {167, TEXT("Суринам")}, + {168, TEXT("Тринидат и Тобаго")}, + {169, TEXT("Уругвай")}, + {3212, TEXT("Фолклендские острова (Брит.)")}, + {3206, TEXT("Французская Гвиана")}, + {170, TEXT("Чили")}, + {171, TEXT("Эквадор")}, + {3213, TEXT("Юж. Джорджия и Юж. Сандвичевы о-ва (Брит.)")}, + {172, TEXT("Ямайка")}, + {174, TEXT("Алжир")}, + {175, TEXT("Ангола")}, + {176, TEXT("Бенин")}, + {177, TEXT("Ботсвана")}, + {3228, TEXT("Британская территория в Индийском океане")}, + {178, TEXT("Буркина-Фасо")}, + {179, TEXT("Бурунди")}, + {180, TEXT("Габон")}, + {181, TEXT("Гамбия")}, + {182, TEXT("Гана")}, + {183, TEXT("Гвинея")}, + {184, TEXT("Гвинея-Бисау")}, + {185, TEXT("Джибути")}, + {186, TEXT("Египет")}, + {187, TEXT("Замбия")}, + {3198, TEXT("Зап. Сахара")}, + {23, TEXT("Зимбабве")}, + {188, TEXT("Кабо-Верде")}, + {189, TEXT("Камерун")}, + {190, TEXT("Кения")}, + {191, TEXT("Коморы")}, + {193, TEXT("Конго (Заир)")}, + {192, TEXT("Конго")}, + {194, TEXT("Кот-д`Ивуар")}, + {195, TEXT("Лесото")}, + {196, TEXT("Либерия")}, + {197, TEXT("Ливия")}, + {198, TEXT("Маврикий")}, + {199, TEXT("Мавритания")}, + {200, TEXT("Мадагаскар")}, + {3229, TEXT("Майотт (Фр.)")}, + {201, TEXT("Малави")}, + {202, TEXT("Мали")}, + {203, TEXT("Марокко")}, + {204, TEXT("Мозамбик")}, + {205, TEXT("Намибия")}, + {206, TEXT("Нигер")}, + {207, TEXT("Нигерия")}, + {3227, TEXT("Остров Буве (Норв.)")}, + {3197, TEXT("Реюньон (Фр.)")}, + {208, TEXT("Руанда")}, + {209, TEXT("Сан-Томе и Принсипи")}, + {210, TEXT("Свазиленд")}, + {3199, TEXT("Святая Елена (Брит.)")}, + {211, TEXT("Сейшелы")}, + {212, TEXT("Сенегал")}, + {213, TEXT("Сомали")}, + {214, TEXT("Судан")}, + {215, TEXT("Сьерра-Леоне")}, + {216, TEXT("Танзания")}, + {217, TEXT("Того")}, + {218, TEXT("Тунис")}, + {219, TEXT("Уганда")}, + {220, TEXT("Центральноафриканская Республика")}, + {222, TEXT("Чад")}, + {223, TEXT("Экваториальная Гвинея")}, + {221, TEXT("Эритрея")}, + {224, TEXT("Эфиопия")}, + {225, TEXT("Южно-Африканская Республика (ЮАР)")}, + {39, TEXT("Украина")}, + {40, TEXT("Австрия")}, + {32, TEXT("Албания")}, + {33, TEXT("Андорра")}, + {340, TEXT("Белоруссия")}, + {38, TEXT("Бельгия")}, + {41, TEXT("Болгария")}, + {42, TEXT("Босния и Герцеговина")}, + {43, TEXT("Ватикан")}, + {45, TEXT("Великобритания")}, + {44, TEXT("Венгрия")}, + {46, TEXT("Германия")}, + {3193, TEXT("Гернси (Брит.)")}, + {47, TEXT("Гибралтар (Брит.)")}, + {48, TEXT("Греция")}, + {49, TEXT("Дания")}, + {3194, TEXT("Джерси (Брит.)")}, + {50, TEXT("Ирландия")}, + {51, TEXT("Исландия")}, + {34, TEXT("Испания")}, + {52, TEXT("Италия")}, + {53, TEXT("Латвия")}, + {54, TEXT("Литва")}, + {55, TEXT("Лихтенштейн")}, + {56, TEXT("Люксембург")}, + {57, TEXT("Македония")}, + {58, TEXT("Мальта")}, + {59, TEXT("Молдавия")}, + {36, TEXT("Монако")}, + {60, TEXT("Нидерланды")}, + {61, TEXT("Норвегия")}, + {3195, TEXT("Остров Мэн (Брит.)")}, + {62, TEXT("Польша")}, + {35, TEXT("Португалия")}, + {63, TEXT("Румыния")}, + {64, TEXT("Сан-Марино")}, + {74, TEXT("Сербия и Черногория")}, + {65, TEXT("Словакия")}, + {66, TEXT("Словения")}, + {67, TEXT("Фарерские о-ва (Дания)")}, + {68, TEXT("Финляндия")}, + {37, TEXT("Франция")}, + {69, TEXT("Хорватия")}, + {70, TEXT("Чехия")}, + {71, TEXT("Швейцария")}, + {72, TEXT("Швеция")}, + {3196, TEXT("Шпицберген (Норв.)")}, + {73, TEXT("Эстония")}, + {0, NULL} +}; + + + +static const MRA_CITY mracCitys[]= +{ + {24, 25, TEXT("Москва")}, + {24, 226, TEXT("Санкт-Петербург")}, + {24, 233, TEXT("Саха (Якутия)")}, + {24, 232, TEXT("Приморский край")}, + {24, 235, TEXT("Хабаровский край")}, + {24, 227, TEXT("Амурская обл.")}, + {24, 229, TEXT("Камчатская обл.")}, + {24, 231, TEXT("Магаданская обл.")}, + {24, 234, TEXT("Сахалинская обл.")}, + {24, 228, TEXT("Еврейская АО")}, + {24, 230, TEXT("Корякский АО")}, + {24, 236, TEXT("Чукотский АО")}, + {24, 237, TEXT("Башкортостан")}, + {24, 240, TEXT("Марий-Эл")}, + {24, 241, TEXT("Мордовия")}, + {24, 248, TEXT("Татарстан")}, + {24, 249, TEXT("Удмуртия")}, + {24, 251, TEXT("Чувашия")}, + {24, 238, TEXT("Кировская обл.")}, + {24, 242, TEXT("Нижегородская обл.")}, + {24, 243, TEXT("Оренбургская обл.")}, + {24, 244, TEXT("Пензенская обл.")}, + {24, 245, TEXT("Пермская обл.")}, + {24, 246, TEXT("Самарская обл.")}, + {24, 247, TEXT("Саратовская обл.")}, + {24, 250, TEXT("Ульяновская обл.")}, + {24, 239, TEXT("Коми-Пермяцкий АО")}, + {24, 255, TEXT("Карелия")}, + {24, 256, TEXT("Коми")}, + {24, 252, TEXT("Архангельская обл.")}, + {24, 253, TEXT("Вологодская обл.")}, + {24, 254, TEXT("Калининградская обл.")}, + {24, 257, TEXT("Ленинградская обл.")}, + {24, 258, TEXT("Мурманская обл.")}, + {24, 260, TEXT("Новгородская обл.")}, + {24, 261, TEXT("Псковская обл.")}, + {24, 259, TEXT("Ненецкий АО")}, + {24, 265, TEXT("Бурятия")}, + {24, 263, TEXT("Республика Алтай")}, + {24, 273, TEXT("Тыва")}, + {24, 275, TEXT("Хакасия")}, + {24, 264, TEXT("Алтайский край")}, + {24, 268, TEXT("Красноярский край")}, + {24, 266, TEXT("Иркутская обл.")}, + {24, 267, TEXT("Кемеровская обл.")}, + {24, 269, TEXT("Новосибирская обл.")}, + {24, 270, TEXT("Омская обл.")}, + {24, 272, TEXT("Томская обл.")}, + {24, 276, TEXT("Читинская обл.")}, + {24, 262, TEXT("Агинский Бурятский АО")}, + {24, 271, TEXT("Таймырский АО")}, + {24, 274, TEXT("Усть-Ордынский Бурятский АО")}, + {24, 277, TEXT("Эвенкийский АО")}, + {24, 278, TEXT("Курганская обл.")}, + {24, 279, TEXT("Свердловская обл.")}, + {24, 280, TEXT("Тюменская обл.")}, + {24, 282, TEXT("Челябинская обл.")}, + {24, 281, TEXT("Ханты-Мансийский АО - Югра")}, + {24, 283, TEXT("Ямало-Ненецкий АО")}, + {24, 284, TEXT("Белгородская обл.")}, + {24, 285, TEXT("Брянская обл.")}, + {24, 286, TEXT("Владимирская обл.")}, + {24, 287, TEXT("Воронежская обл.")}, + {24, 288, TEXT("Ивановская обл.")}, + {24, 289, TEXT("Калужская обл.")}, + {24, 290, TEXT("Костромская обл.")}, + {24, 291, TEXT("Курская обл.")}, + {24, 292, TEXT("Липецкая обл.")}, + {24, 293, TEXT("Московская обл.")}, + {24, 294, TEXT("Орловская обл.")}, + {24, 295, TEXT("Рязанская обл.")}, + {24, 296, TEXT("Смоленская обл.")}, + {24, 297, TEXT("Тамбовская обл.")}, + {24, 298, TEXT("Тверская обл.")}, + {24, 299, TEXT("Тульская обл.")}, + {24, 300, TEXT("Ярославская обл.")}, + {24, 301, TEXT("Адыгея")}, + {24, 304, TEXT("Дагестан")}, + {24, 305, TEXT("Ингушетия")}, + {24, 306, TEXT("Кабардино-Балкария")}, + {24, 307, TEXT("Калмыкия")}, + {24, 308, TEXT("Карачаево-Черкессия")}, + {24, 311, TEXT("Северная Осетия - Алания")}, + {24, 313, TEXT("Чечня")}, + {24, 309, TEXT("Краснодарский край")}, + {24, 312, TEXT("Ставропольский край")}, + {24, 302, TEXT("Астраханская обл.")}, + {24, 303, TEXT("Волгоградская обл.")}, + {24, 310, TEXT("Ростовская обл.")}, + {81, 1055, TEXT("Баку")}, + {81, 1058, TEXT("Гянджа")}, + {81, 1056, TEXT("Нахичевань")}, + {81, 1057, TEXT("Ханкенди")}, + {81, 3153, TEXT("Шеки")}, + {81, 2291, lpwszOther}, + {82, 2932, TEXT("Абовян")}, + {82, 1060, TEXT("Аштарак")}, + {82, 3084, TEXT("Ванадзор")}, + {82, 3011, TEXT("Гюмри")}, + {82, 3306, TEXT("Дилижан")}, + {82, 1059, TEXT("Ереван")}, + {82, 3145, TEXT("Ханкенди")}, + {82, 2292, lpwszOther}, + {97, 1061, TEXT("Кабул")}, + {97, 2293, lpwszOther}, + {96, 1062, TEXT("Дакка")}, + {96, 2294, lpwszOther}, + {99, 1063, TEXT("Манама")}, + {99, 2295, lpwszOther}, + {100, 1064, TEXT("Бандар-Сери-Бегаван")}, + {100, 2296, lpwszOther}, + {101, 1065, TEXT("Тхимпху")}, + {101, 2297, lpwszOther}, + {102, 1066, TEXT("Ханой")}, + {102, 2298, lpwszOther}, + {83, 1067, TEXT("Батуми")}, + {83, 3158, TEXT("Боржоми")}, + {83, 1068, TEXT("Поти")}, + {83, 3129, TEXT("Рустави")}, + {83, 1069, TEXT("Сухуми")}, + {83, 1070, TEXT("Тбилиси")}, + {83, 2299, lpwszOther}, + {86, 3345, TEXT("Ариэль")}, + {86, 1071, TEXT("Афула")}, + {86, 2992, TEXT("Ашдод")}, + {86, 3175, TEXT("Ашкелон")}, + {86, 3363, TEXT("Бат-Ям")}, + {86, 2884, TEXT("Беер-Яков")}, + {86, 3243, TEXT("Бейт-Шемеш")}, + {86, 1074, TEXT("Беэр-Шева")}, + {86, 3348, TEXT("Герцелия")}, + {86, 3241, TEXT("Димона")}, + {86, 1075, TEXT("Иерусалим")}, + {86, 3350, TEXT("Йокнеам-Иллит")}, + {86, 2982, TEXT("Кармиэль")}, + {86, 2971, TEXT("Кфар-Саба")}, + {86, 3136, TEXT("Назарет")}, + {86, 1080, TEXT("Натания")}, + {86, 3303, TEXT("Офаким")}, + {86, 3050, TEXT("Раанана")}, + {86, 3151, TEXT("Рамат Ган")}, + {86, 3141, TEXT("Реховот")}, + {86, 3012, TEXT("Ришон ле Цион")}, + {86, 1081, TEXT("Тверия")}, + {86, 1077, TEXT("Тель-Авив")}, + {86, 1079, TEXT("Хадера")}, + {86, 1078, TEXT("Хайфа")}, + {86, 1076, TEXT("Хеврон")}, + {86, 2929, TEXT("Цфат")}, + {86, 2928, TEXT("Эйлат")}, + {86, 2300, lpwszOther}, + {95, 3315, TEXT("Бангалор")}, + {95, 1082, TEXT("Дели")}, + {95, 1083, TEXT("Джайпур")}, + {95, 3144, TEXT("Калькутта")}, + {95, 3025, TEXT("Мумбаи")}, + {95, 3277, TEXT("Панаджи")}, + {95, 1084, TEXT("Ченнаи")}, + {95, 2301, lpwszOther}, + {103, 1085, TEXT("Джакарта")}, + {103, 2302, lpwszOther}, + {79, 1086, TEXT("Амман")}, + {79, 2303, lpwszOther}, + {85, 1087, TEXT("Багдад")}, + {85, 2304, lpwszOther}, + {87, 1088, TEXT("Тегеран")}, + {87, 2305, lpwszOther}, + {104, 1089, TEXT("Сана")}, + {104, 2306, lpwszOther}, + {84, 1090, TEXT("Актау")}, + {84, 1091, TEXT("Актюбинск")}, + {84, 1092, TEXT("Алма-Ата")}, + {84, 3242, TEXT("Аршалы")}, + {84, 1093, TEXT("Астана")}, + {84, 1094, TEXT("Атырау (Гурьев)")}, + {84, 1095, TEXT("Байконур")}, + {84, 3245, TEXT("Балхаш")}, + {84, 3083, TEXT("Жезказган")}, + {84, 1096, TEXT("Капчагай")}, + {84, 1097, TEXT("Караганда")}, + {84, 1098, TEXT("Кокшетау")}, + {84, 1099, TEXT("Кустанай")}, + {84, 2868, TEXT("Лисаковск")}, + {84, 1100, TEXT("Павлодар")}, + {84, 1101, TEXT("Петропавловск (Сев.-Каз. обл.)")}, + {84, 1102, TEXT("Рудный")}, + {84, 1103, TEXT("Семипалатинск")}, + {84, 1104, TEXT("Степногорск")}, + {84, 3166, TEXT("Талгар")}, + {84, 1105, TEXT("Талды-Курган")}, + {84, 2927, TEXT("Тараз")}, + {84, 1106, TEXT("Темиртау")}, + {84, 1107, TEXT("Уральск")}, + {84, 1108, TEXT("Усть-Каменогорск")}, + {84, 1109, TEXT("Чимкент")}, + {84, 1110, TEXT("Экибастуз")}, + {84, 2307, lpwszOther}, + {105, 1111, TEXT("Пномпень")}, + {105, 2308, lpwszOther}, + {106, 1112, TEXT("Доха")}, + {106, 2309, lpwszOther}, + {107, 1113, TEXT("Ларнака")}, + {107, 1114, TEXT("Лимассол")}, + {107, 1115, TEXT("Никосия")}, + {107, 2954, TEXT("Пафос")}, + {107, 2310, lpwszOther}, + {92, 1116, TEXT("Бишкек")}, + {92, 1117, TEXT("Джалал-Абад")}, + {92, 3027, TEXT("Кара-Балта")}, + {92, 1118, TEXT("Каракол")}, + {92, 1119, TEXT("Ош")}, + {92, 1120, TEXT("Талас")}, + {92, 2933, TEXT("Хайдаркен")}, + {92, 2311, lpwszOther}, + {76, 3214, TEXT("Аомынь (Макао)")}, + {76, 1121, TEXT("Гонконг")}, + {76, 2869, TEXT("Гуанчжоу")}, + {76, 3262, TEXT("Далянь")}, + {76, 1122, TEXT("Пекин")}, + {76, 1123, TEXT("Харбин")}, + {76, 1124, TEXT("Шанхай")}, + {76, 3043, TEXT("Шеньян")}, + {76, 2312, lpwszOther}, + {29, 1125, TEXT("Пхеньян")}, + {29, 2313, lpwszOther}, + {108, 1126, TEXT("Сеул")}, + {108, 3240, TEXT("Тейджон")}, + {108, 2314, lpwszOther}, + {88, 1127, TEXT("Эль-Кувейт")}, + {88, 2315, lpwszOther}, + {109, 1128, TEXT("Вьентьян")}, + {109, 2316, lpwszOther}, + {110, 1129, TEXT("Бейрут")}, + {110, 2317, lpwszOther}, + {111, 1130, TEXT("Джохор-Бару")}, + {111, 1131, TEXT("Куала-Лумпур")}, + {111, 2318, lpwszOther}, + {112, 1132, TEXT("Мале")}, + {112, 2319, lpwszOther}, + {113, 1133, TEXT("Улан-Батор")}, + {113, 1134, TEXT("Эрдэнэт")}, + {113, 2320, lpwszOther}, + {114, 1135, TEXT("Янгон")}, + {114, 2321, lpwszOther}, + {115, 1136, TEXT("Катманду")}, + {115, 2322, lpwszOther}, + {116, 1137, TEXT("Абу-Даби")}, + {116, 1138, TEXT("Дубай")}, + {116, 1139, TEXT("Шарджа")}, + {116, 2323, lpwszOther}, + {117, 1140, TEXT("Маскат")}, + {117, 2324, lpwszOther}, + {122, 1141, TEXT("Исламабад")}, + {122, 2325, lpwszOther}, + {89, 1072, TEXT("Ашдод")}, + {89, 1073, TEXT("Ашкелон")}, + {89, 1142, TEXT("Газа")}, + {89, 2326, lpwszOther}, + {94, 3250, TEXT("Медина")}, + {94, 1143, TEXT("Эр-Рияд")}, + {94, 2327, lpwszOther}, + {78, 1144, TEXT("Дамаск")}, + {78, 2328, lpwszOther}, + {91, 1145, TEXT("Душанбе")}, + {91, 3307, TEXT("Кайраккум")}, + {91, 3308, TEXT("Худжанд")}, + {91, 2329, lpwszOther}, + {119, 1146, TEXT("Бангкок")}, + {119, 1147, TEXT("Пхукет")}, + {119, 2330, lpwszOther}, + {120, 1148, TEXT("Тайбэй")}, + {120, 2331, lpwszOther}, + {132, 1149, TEXT("Дили")}, + {132, 2332, lpwszOther}, + {90, 1150, TEXT("Ашхабад")}, + {90, 3079, TEXT("Безмеин")}, + {90, 2333, lpwszOther}, + {77, 1152, TEXT("Анкара")}, + {77, 1153, TEXT("Анталия")}, + {77, 3080, TEXT("Бурса")}, + {77, 1151, TEXT("Мармарис")}, + {77, 1154, TEXT("Стамбул")}, + {77, 1155, TEXT("Трабзон")}, + {77, 2334, lpwszOther}, + {93, 3362, TEXT("Алмалык")}, + {93, 3137, TEXT("Андижан")}, + {93, 3273, TEXT("Асака")}, + {93, 1156, TEXT("Ахангаран")}, + {93, 1157, TEXT("Бухара")}, + {93, 3167, TEXT("Джизак")}, + {93, 3347, TEXT("Кунград")}, + {93, 1158, TEXT("Навои")}, + {93, 1159, TEXT("Наманган")}, + {93, 1160, TEXT("Самарканд")}, + {93, 1161, TEXT("Ташкент")}, + {93, 1162, TEXT("Ургенч")}, + {93, 1163, TEXT("Фергана")}, + {93, 1164, TEXT("Чирчик")}, + {93, 2335, lpwszOther}, + {121, 1165, TEXT("Манила")}, + {121, 3319, TEXT("Себу")}, + {121, 2336, lpwszOther}, + {98, 1166, TEXT("Коломбо")}, + {98, 2337, lpwszOther}, + {75, 3176, TEXT("Исесаки")}, + {75, 3339, TEXT("Корияма")}, + {75, 1167, TEXT("Саппоро")}, + {75, 1168, TEXT("Токио")}, + {75, 2338, lpwszOther}, + {123, 1914, TEXT("Аделаида")}, + {123, 2957, TEXT("Блэк Рок")}, + {123, 1915, TEXT("Брисбен")}, + {123, 3331, TEXT("Горокан")}, + {123, 1916, TEXT("Канберра")}, + {123, 3001, TEXT("Лидкомб")}, + {123, 1917, TEXT("Мельбурн")}, + {123, 3217, TEXT("Норфолк")}, + {123, 3064, TEXT("Перт")}, + {123, 3020, TEXT("Санта Люсиа")}, + {123, 1918, TEXT("Сидней")}, + {123, 3238, TEXT("Энеабба")}, + {123, 2339, lpwszOther}, + {454, 1192, TEXT("Паго-Паго")}, + {454, 2366, lpwszOther}, + {124, 1919, TEXT("Порт-Вила")}, + {124, 2340, lpwszOther}, + {453, 1193, TEXT("Аганья")}, + {453, 2368, lpwszOther}, + {126, 1921, TEXT("Баирики")}, + {126, 2342, lpwszOther}, + {127, 1922, TEXT("Маджуро")}, + {127, 2343, lpwszOther}, + {128, 1923, TEXT("Паликир")}, + {128, 2344, lpwszOther}, + {129, 1924, TEXT("Ярен")}, + {129, 2345, lpwszOther}, + {130, 1925, TEXT("Веллингтон")}, + {130, 1926, TEXT("Гамильтон")}, + {130, 1928, TEXT("Данидин")}, + {130, 1929, TEXT("Крайстчерч")}, + {130, 3235, TEXT("Кромвель")}, + {130, 1927, TEXT("Окленд")}, + {130, 3323, TEXT("Тауранга")}, + {130, 2346, lpwszOther}, + {131, 1930, TEXT("Корор")}, + {131, 2347, lpwszOther}, + {133, 1931, TEXT("Порт-Морсби")}, + {133, 2348, lpwszOther}, + {125, 1920, TEXT("Апиа")}, + {125, 2341, lpwszOther}, + {134, 1932, TEXT("Хониара")}, + {134, 2349, lpwszOther}, + {135, 1933, TEXT("Нукуалофа")}, + {135, 2350, lpwszOther}, + {136, 1934, TEXT("Фунафути")}, + {136, 2351, lpwszOther}, + {137, 1935, TEXT("Сува")}, + {137, 2352, lpwszOther}, + {138, 3055, TEXT("Барлингтон")}, + {138, 3049, TEXT("Броссард")}, + {138, 3330, TEXT("Бурнаби")}, + {138, 1169, TEXT("Ванкувер")}, + {138, 3106, TEXT("Ватерлоо")}, + {138, 1170, TEXT("Виннипег")}, + {138, 1171, TEXT("Галифакс")}, + {138, 1172, TEXT("Гамильтон")}, + {138, 3365, TEXT("Денвер")}, + {138, 1173, TEXT("Калгари")}, + {138, 3104, TEXT("Камлупс")}, + {138, 3366, TEXT("Каннингтон")}, + {138, 1174, TEXT("Квебек")}, + {138, 2964, TEXT("Кингстон")}, + {138, 3113, TEXT("Коквитлам")}, + {138, 1175, TEXT("Монреаль")}, + {138, 2920, TEXT("Ниагара-Фолс")}, + {138, 2889, TEXT("Норд-Йорк")}, + {138, 1176, TEXT("Оттава")}, + {138, 2903, TEXT("Порт Алберни")}, + {138, 1177, TEXT("Ричмонд")}, + {138, 1178, TEXT("Тимминс")}, + {138, 2946, TEXT("Торнхилл")}, + {138, 1179, TEXT("Торонто")}, + {138, 1180, TEXT("Эдмонтон")}, + {138, 2353, lpwszOther}, + {139, 407, TEXT("Вашингтон")}, + {139, 426, TEXT("Айдахо")}, + {139, 378, TEXT("Айова")}, + {139, 412, TEXT("Алабама")}, + {139, 446, TEXT("Аляска")}, + {139, 434, TEXT("Аризона")}, + {139, 416, TEXT("Арканзас")}, + {139, 428, TEXT("Вайоминг")}, + {139, 440, TEXT("Вашингтон")}, + {139, 352, TEXT("Вермонт")}, + {139, 394, TEXT("Виргиния")}, + {139, 374, TEXT("Висконсин")}, + {139, 448, TEXT("Гавайи")}, + {139, 390, TEXT("Делавер")}, + {139, 402, TEXT("Джорджия")}, + {139, 396, TEXT("Западная Виргиния")}, + {139, 370, TEXT("Иллинойс")}, + {139, 368, TEXT("Индиана")}, + {139, 444, TEXT("Калифорния")}, + {139, 388, TEXT("Канзас")}, + {139, 408, TEXT("Кентукки")}, + {139, 430, TEXT("Колорадо")}, + {139, 358, TEXT("Коннектикут")}, + {139, 418, TEXT("Луизиана")}, + {139, 354, TEXT("Массачусетс")}, + {139, 376, TEXT("Миннесота")}, + {139, 414, TEXT("Миссисипи")}, + {139, 380, TEXT("Миссури")}, + {139, 372, TEXT("Мичиган")}, + {139, 424, TEXT("Монтана")}, + {139, 348, TEXT("Мэн")}, + {139, 392, TEXT("Мэриленд")}, + {139, 386, TEXT("Небраска")}, + {139, 438, TEXT("Невада")}, + {139, 362, TEXT("Нью-Джерси")}, + {139, 360, TEXT("Нью-Йорк")}, + {139, 432, TEXT("Нью-Мексико")}, + {139, 350, TEXT("Нью-Хэмпшир")}, + {139, 366, TEXT("Огайо")}, + {139, 420, TEXT("Оклахома")}, + {139, 442, TEXT("Орегон")}, + {139, 364, TEXT("Пенсильвания")}, + {139, 450, TEXT("Пуэрто-Рико")}, + {139, 356, TEXT("Род-Айленд")}, + {139, 382, TEXT("Северная Дакота")}, + {139, 398, TEXT("Северная Каролина")}, + {139, 410, TEXT("Теннесси")}, + {139, 422, TEXT("Техас")}, + {139, 406, TEXT("Федеральный округ Колумбия")}, + {139, 404, TEXT("Флорида")}, + {139, 384, TEXT("Южная Дакота")}, + {139, 400, TEXT("Южная Каролина")}, + {139, 436, TEXT("Юта")}, + {140, 1238, TEXT("Сент-Джонс")}, + {140, 2442, lpwszOther}, + {141, 1239, TEXT("Буэнос-Айрес")}, + {141, 2441, lpwszOther}, + {142, 1240, TEXT("Нассау")}, + {142, 2440, lpwszOther}, + {143, 1241, TEXT("Бриджтаун")}, + {143, 2439, lpwszOther}, + {146, 1242, TEXT("Бельмопан")}, + {146, 2438, lpwszOther}, + {144, 1243, TEXT("Ла-Пас")}, + {144, 2437, lpwszOther}, + {145, 1244, TEXT("Бразилиа")}, + {145, 3094, TEXT("Пассо Фундо")}, + {145, 1245, TEXT("Рио-де-Жанейро")}, + {145, 1246, TEXT("Сан-Паулу")}, + {145, 2436, lpwszOther}, + {147, 1247, TEXT("Каракас")}, + {147, 2435, lpwszOther}, + {452, 1190, TEXT("Шарлотта-Амалия")}, + {452, 2364, lpwszOther}, + {149, 1248, TEXT("Порт-о-Пренс")}, + {149, 2434, lpwszOther}, + {148, 1249, TEXT("Джоржтаун")}, + {148, 2433, lpwszOther}, + {173, 1250, TEXT("Гватемала")}, + {173, 2432, lpwszOther}, + {150, 1251, TEXT("Тегусигальпа")}, + {150, 2431, lpwszOther}, + {151, 1252, TEXT("Сент-Джорджес")}, + {151, 2430, lpwszOther}, + {152, 1253, TEXT("Уманак")}, + {152, 2429, lpwszOther}, + {153, 1254, TEXT("Розо")}, + {153, 2428, lpwszOther}, + {154, 1255, TEXT("Санто-Доминго")}, + {154, 2427, lpwszOther}, + {155, 1256, TEXT("Богота")}, + {155, 2426, lpwszOther}, + {156, 1257, TEXT("Сан-Хосе")}, + {156, 2425, lpwszOther}, + {157, 1258, TEXT("Гавана")}, + {157, 2424, lpwszOther}, + {158, 1259, TEXT("Акапулько")}, + {158, 1260, TEXT("Мехико")}, + {158, 2423, lpwszOther}, + {159, 1261, TEXT("Манагуа")}, + {159, 2422, lpwszOther}, + {160, 1262, TEXT("Панама")}, + {160, 2421, lpwszOther}, + {161, 1263, TEXT("Асунсьон")}, + {161, 2420, lpwszOther}, + {162, 1264, TEXT("Лима")}, + {162, 2419, lpwszOther}, + {163, 1265, TEXT("Сан-Сальвадор")}, + {163, 2418, lpwszOther}, + {164, 1266, TEXT("Кингстаун")}, + {164, 2417, lpwszOther}, + {165, 1267, TEXT("Бастер")}, + {165, 2416, lpwszOther}, + {166, 1268, TEXT("Кастри")}, + {166, 2415, lpwszOther}, + {167, 1269, TEXT("Парамарибо")}, + {167, 2414, lpwszOther}, + {168, 1270, TEXT("Порт-оф-Спейн")}, + {168, 2413, lpwszOther}, + {169, 1271, TEXT("Монтевидео")}, + {169, 2412, lpwszOther}, + {170, 1272, TEXT("Сантьяго")}, + {170, 2411, lpwszOther}, + {171, 1273, TEXT("Гуаякиль")}, + {171, 1274, TEXT("Кито")}, + {171, 2410, lpwszOther}, + {172, 1275, TEXT("Кингстон")}, + {172, 2409, lpwszOther}, + {174, 1854, TEXT("Алжир")}, + {174, 2495, lpwszOther}, + {175, 1855, TEXT("Луанда")}, + {175, 2494, lpwszOther}, + {176, 1856, TEXT("Котону")}, + {176, 1857, TEXT("Порто-Ново")}, + {176, 2493, lpwszOther}, + {177, 1858, TEXT("Габороне")}, + {177, 2492, lpwszOther}, + {178, 1859, TEXT("Уагадугу")}, + {178, 2491, lpwszOther}, + {179, 1860, TEXT("Бужумбуру")}, + {179, 2490, lpwszOther}, + {180, 1861, TEXT("Либревиль")}, + {180, 2489, lpwszOther}, + {181, 1862, TEXT("Банжул")}, + {181, 2488, lpwszOther}, + {182, 1863, TEXT("Аккра")}, + {182, 2487, lpwszOther}, + {183, 1864, TEXT("Конакри")}, + {183, 2486, lpwszOther}, + {184, 1865, TEXT("Бисау")}, + {184, 2485, lpwszOther}, + {185, 1866, TEXT("Джибути")}, + {185, 2484, lpwszOther}, + {186, 3312, TEXT("Дахаб")}, + {186, 1867, TEXT("Каир")}, + {186, 1868, TEXT("Хургада")}, + {186, 2483, lpwszOther}, + {187, 1869, TEXT("Лусака")}, + {187, 2482, lpwszOther}, + {23, 1870, TEXT("Хараре")}, + {23, 2481, lpwszOther}, + {188, 1871, TEXT("Прая")}, + {188, 2480, lpwszOther}, + {189, 1872, TEXT("Яунде")}, + {189, 2479, lpwszOther}, + {190, 1873, TEXT("Найроби")}, + {190, 2478, lpwszOther}, + {191, 1874, TEXT("Морони")}, + {191, 2477, lpwszOther}, + {193, 1875, TEXT("Киншаса")}, + {193, 2476, lpwszOther}, + {192, 1876, TEXT("Браззавиль")}, + {192, 2475, lpwszOther}, + {194, 1877, TEXT("Ямусукро")}, + {194, 2474, lpwszOther}, + {195, 1878, TEXT("Масеру")}, + {195, 2473, lpwszOther}, + {196, 1879, TEXT("Монровия")}, + {196, 2472, lpwszOther}, + {197, 1880, TEXT("Триполи")}, + {197, 2471, lpwszOther}, + {198, 1881, TEXT("Порт-Луи")}, + {198, 2470, lpwszOther}, + {199, 1882, TEXT("Нуакшот")}, + {199, 2469, lpwszOther}, + {200, 1883, TEXT("Антананариву")}, + {200, 2468, lpwszOther}, + {201, 1884, TEXT("Лилонгве")}, + {201, 2467, lpwszOther}, + {202, 1885, TEXT("Бамако")}, + {202, 2466, lpwszOther}, + {203, 1886, TEXT("Агадир")}, + {203, 1887, TEXT("Рабат")}, + {203, 2465, lpwszOther}, + {204, 1888, TEXT("Мапуту")}, + {204, 2464, lpwszOther}, + {205, 1889, TEXT("Виндхук")}, + {205, 2463, lpwszOther}, + {206, 1890, TEXT("Ниамей")}, + {206, 2462, lpwszOther}, + {207, 1891, TEXT("Абуджа")}, + {207, 2461, lpwszOther}, + {208, 1892, TEXT("Кигали")}, + {208, 2460, lpwszOther}, + {209, 1893, TEXT("Сан-Томе")}, + {209, 2459, lpwszOther}, + {210, 1894, TEXT("Мбабане")}, + {210, 2458, lpwszOther}, + {211, 1895, TEXT("Виктория")}, + {211, 2457, lpwszOther}, + {212, 1896, TEXT("Дакар")}, + {212, 2456, lpwszOther}, + {213, 1897, TEXT("Могадишо")}, + {213, 2455, lpwszOther}, + {214, 1898, TEXT("Хартум")}, + {214, 2454, lpwszOther}, + {215, 1899, TEXT("Фритаун")}, + {215, 2453, lpwszOther}, + {216, 1900, TEXT("Дар-эс-Салам")}, + {216, 1901, TEXT("Додома")}, + {216, 2452, lpwszOther}, + {217, 1902, TEXT("Ломе")}, + {217, 2451, lpwszOther}, + {218, 1903, TEXT("Тунис")}, + {218, 2450, lpwszOther}, + {219, 1904, TEXT("Кампала")}, + {219, 2449, lpwszOther}, + {220, 1905, TEXT("Банги")}, + {220, 2448, lpwszOther}, + {222, 1906, TEXT("Нджамена")}, + {222, 2447, lpwszOther}, + {223, 1907, TEXT("Малабо")}, + {223, 2446, lpwszOther}, + {221, 1908, TEXT("Асмэра")}, + {221, 2445, lpwszOther}, + {224, 1909, TEXT("Аддис-Абеба")}, + {224, 2444, lpwszOther}, + {225, 1910, TEXT("Дурбан")}, + {225, 1913, TEXT("Йоханнесбург")}, + {225, 1912, TEXT("Кейптаун")}, + {225, 3033, TEXT("Пайнтаун")}, + {225, 1911, TEXT("Претория")}, + {225, 2443, lpwszOther}, + {39, 314, TEXT("Киев")}, + {39, 315, TEXT("Винницкая обл.")}, + {39, 316, TEXT("Волынская обл.")}, + {39, 317, TEXT("Днепропетровская обл.")}, + {39, 318, TEXT("Донецкая обл.")}, + {39, 319, TEXT("Житомирская обл.")}, + {39, 320, TEXT("Закарпатская обл.")}, + {39, 321, TEXT("Запорожская обл.")}, + {39, 322, TEXT("Ивано-Франковская обл.")}, + {39, 323, TEXT("Киевская обл.")}, + {39, 324, TEXT("Кировоградская обл.")}, + {39, 325, TEXT("Крым")}, + {39, 326, TEXT("Луганская обл.")}, + {39, 327, TEXT("Львовская обл.")}, + {39, 328, TEXT("Николаевская обл.")}, + {39, 329, TEXT("Одесская обл.")}, + {39, 330, TEXT("Полтавская обл.")}, + {39, 331, TEXT("Ровенская обл.")}, + {39, 332, TEXT("Сумская обл.")}, + {39, 333, TEXT("Тернопольская обл.")}, + {39, 334, TEXT("Харьковская обл.")}, + {39, 335, TEXT("Херсонская обл.")}, + {39, 336, TEXT("Хмельницкая обл.")}, + {39, 337, TEXT("Черкасская обл.")}, + {39, 338, TEXT("Черниговская обл.")}, + {39, 339, TEXT("Черновицкая обл.")}, + {40, 602, TEXT("Бад Халл")}, + {40, 604, TEXT("Брегенц")}, + {40, 603, TEXT("Вена")}, + {40, 608, TEXT("Грац")}, + {40, 606, TEXT("Зальцбург")}, + {40, 3099, TEXT("Зель-ам-Зее")}, + {40, 605, TEXT("Инсбрук")}, + {40, 3174, TEXT("Кирхберг")}, + {40, 609, TEXT("Клагенфурт")}, + {40, 607, TEXT("Линц")}, + {40, 610, TEXT("Обдах")}, + {40, 611, TEXT("Щтубайтал")}, + {40, 2541, lpwszOther}, + {32, 612, TEXT("Тирана")}, + {32, 2540, lpwszOther}, + {33, 613, TEXT("Андорра-ла-Велья")}, + {33, 2539, lpwszOther}, + {340, 341, TEXT("Минск")}, + {340, 342, TEXT("Брестская обл.")}, + {340, 343, TEXT("Витебская обл.")}, + {340, 344, TEXT("Гомельская обл.")}, + {340, 345, TEXT("Гродненская обл.")}, + {340, 346, TEXT("Минская обл.")}, + {340, 347, TEXT("Могилевская обл.")}, + {38, 760, TEXT("Антверпен")}, + {38, 767, TEXT("Арлон")}, + {38, 762, TEXT("Брюгге")}, + {38, 761, TEXT("Брюссель")}, + {38, 763, TEXT("Гент")}, + {38, 769, TEXT("Лувен")}, + {38, 765, TEXT("Льеж")}, + {38, 764, TEXT("Монс")}, + {38, 3117, TEXT("Мортсель")}, + {38, 766, TEXT("Намюр")}, + {38, 768, TEXT("Хасселт")}, + {38, 2532, lpwszOther}, + {41, 3098, TEXT("Банско")}, + {41, 792, TEXT("Благоевград")}, + {41, 770, TEXT("Бургас")}, + {41, 771, TEXT("Бяла")}, + {41, 773, TEXT("Варна")}, + {41, 776, TEXT("Велико-Тырново")}, + {41, 788, TEXT("Видин")}, + {41, 789, TEXT("Враца")}, + {41, 796, TEXT("Габрово")}, + {41, 777, TEXT("Димитровград")}, + {41, 781, TEXT("Каварна")}, + {41, 786, TEXT("Кырджали")}, + {41, 791, TEXT("Кюстендил")}, + {41, 793, TEXT("Лазарджик")}, + {41, 795, TEXT("Ловеч")}, + {41, 787, TEXT("Михайловград")}, + {41, 790, TEXT("Перник")}, + {41, 3133, TEXT("Пирдоп")}, + {41, 794, TEXT("Плевен")}, + {41, 782, TEXT("Пловдив")}, + {41, 780, TEXT("Разград")}, + {41, 779, TEXT("Русе")}, + {41, 774, TEXT("Силистра")}, + {41, 784, TEXT("Сливен")}, + {41, 772, TEXT("София")}, + {41, 775, TEXT("Толбухин")}, + {41, 3116, TEXT("Тырново")}, + {41, 785, TEXT("Хасково")}, + {41, 778, TEXT("Шумен")}, + {41, 783, TEXT("Ямбол")}, + {41, 2531, lpwszOther}, + {42, 797, TEXT("Баня-Лука")}, + {42, 799, TEXT("Зеница")}, + {42, 798, TEXT("Сараево")}, + {42, 800, TEXT("Тузла")}, + {42, 2530, lpwszOther}, + {45, 802, TEXT("Абердин")}, + {45, 3075, TEXT("Айслворт")}, + {45, 801, TEXT("Алнвик")}, + {45, 804, TEXT("Бидефорд")}, + {45, 803, TEXT("Бирмингем")}, + {45, 805, TEXT("Блоксвич")}, + {45, 3168, TEXT("Бостон")}, + {45, 806, TEXT("Брайтон")}, + {45, 807, TEXT("Бредфорд")}, + {45, 808, TEXT("Бристоль")}, + {45, 809, TEXT("Вилленхолл")}, + {45, 3131, TEXT("Воррингтон")}, + {45, 810, TEXT("Вудбридж")}, + {45, 3342, TEXT("Гилфорд")}, + {45, 811, TEXT("Глазго")}, + {45, 812, TEXT("Дадли")}, + {45, 813, TEXT("Дарем")}, + {45, 814, TEXT("Дуглас")}, + {45, 3089, TEXT("Кардиф")}, + {45, 815, TEXT("Кембридж")}, + {45, 816, TEXT("Кентербери")}, + {45, 817, TEXT("Ливерпуль")}, + {45, 818, TEXT("Лидс")}, + {45, 819, TEXT("Лондон")}, + {45, 820, TEXT("Манчестер")}, + {45, 2976, TEXT("Митчем")}, + {45, 2988, TEXT("Мэйденхед")}, + {45, 821, TEXT("Ноттингем")}, + {45, 3088, TEXT("Ньюпорт")}, + {45, 822, TEXT("Оксфорд")}, + {45, 823, TEXT("Плимут")}, + {45, 824, TEXT("Портсмут")}, + {45, 825, TEXT("Престон")}, + {45, 3343, TEXT("Райд")}, + {45, 2867, TEXT("Ридинг")}, + {45, 2986, TEXT("Сент-Албанс")}, + {45, 826, TEXT("Стаффорд")}, + {45, 3063, TEXT("Стокпорт")}, + {45, 827, TEXT("Уэймут")}, + {45, 3140, TEXT("Челтенхэм")}, + {45, 828, TEXT("Честер")}, + {45, 829, TEXT("Шеффилд")}, + {45, 830, TEXT("Эдинбург")}, + {45, 2529, lpwszOther}, + {44, 831, TEXT("Будапешт")}, + {44, 832, TEXT("Геделле")}, + {44, 836, TEXT("Дебрецен")}, + {44, 835, TEXT("Мишкольц")}, + {44, 834, TEXT("Сегед")}, + {44, 833, TEXT("Шиофок")}, + {44, 2528, lpwszOther}, + {46, 3007, TEXT("Аахен")}, + {46, 837, TEXT("Аугсбург")}, + {46, 838, TEXT("Баден-Баден")}, + {46, 3371, TEXT("Бамберг")}, + {46, 839, TEXT("Бергиш-Гладбах")}, + {46, 840, TEXT("Берлин")}, + {46, 841, TEXT("Билефельд")}, + {46, 3163, TEXT("Бовенден")}, + {46, 842, TEXT("Бонн")}, + {46, 843, TEXT("Браденбург")}, + {46, 3015, TEXT("Брауншвейг")}, + {46, 844, TEXT("Бремен")}, + {46, 2921, TEXT("Варштайн")}, + {46, 845, TEXT("Веймар")}, + {46, 846, TEXT("Вупперталь")}, + {46, 847, TEXT("Гамбург")}, + {46, 848, TEXT("Ганновер")}, + {46, 849, TEXT("Гарделеген")}, + {46, 3010, TEXT("Гейдельберг")}, + {46, 850, TEXT("Гота")}, + {46, 851, TEXT("Дармштадт")}, + {46, 3072, TEXT("Дессау")}, + {46, 852, TEXT("Детмольд")}, + {46, 853, TEXT("Дортмунд")}, + {46, 854, TEXT("Дрезден")}, + {46, 855, TEXT("Дюссельдорф")}, + {46, 3082, TEXT("Иффецхайм")}, + {46, 3309, TEXT("Кассел")}, + {46, 856, TEXT("Кельн")}, + {46, 857, TEXT("Киль")}, + {46, 3138, TEXT("Кобленц")}, + {46, 858, TEXT("Крефельд")}, + {46, 859, TEXT("Лейпциг")}, + {46, 2872, TEXT("Лимбург")}, + {46, 2965, TEXT("Линген")}, + {46, 3135, TEXT("Любек")}, + {46, 3156, TEXT("Мангейм")}, + {46, 3192, TEXT("Меерсбург")}, + {46, 860, TEXT("Мюнстер")}, + {46, 861, TEXT("Мюнхен")}, + {46, 2864, TEXT("Нойштадт")}, + {46, 862, TEXT("Нюрнберг")}, + {46, 3009, TEXT("Оффенбург")}, + {46, 2993, TEXT("Падерборн")}, + {46, 863, TEXT("Равенсбург")}, + {46, 864, TEXT("Регенсбург")}, + {46, 865, TEXT("Рейнен")}, + {46, 866, TEXT("Росток")}, + {46, 3191, TEXT("Саарбрюкен")}, + {46, 2974, TEXT("Санкт-Августин")}, + {46, 3127, TEXT("Тюринген")}, + {46, 867, TEXT("Фрайберг")}, + {46, 868, TEXT("Фрайбург")}, + {46, 869, TEXT("Франкфурт-на-Майне")}, + {46, 3373, TEXT("Хемнитц")}, + {46, 3313, TEXT("Хильден")}, + {46, 870, TEXT("Штутгарт")}, + {46, 3045, TEXT("Эрланген")}, + {46, 2906, TEXT("Эшборн")}, + {46, 2527, lpwszOther}, + {48, 871, TEXT("Афины")}, + {48, 873, TEXT("Ираклион")}, + {48, 3147, TEXT("Корфу")}, + {48, 872, TEXT("Салоники")}, + {48, 3178, TEXT("Халкидики")}, + {48, 2526, lpwszOther}, + {49, 3006, TEXT("Архус")}, + {49, 874, TEXT("Копенгаген")}, + {49, 875, TEXT("Оденсе")}, + {49, 3285, TEXT("Ольборг")}, + {49, 876, TEXT("Сванеке")}, + {49, 3126, TEXT("Скиве")}, + {49, 2525, lpwszOther}, + {50, 3377, TEXT("Виклоу")}, + {50, 3067, TEXT("Голвей")}, + {50, 877, TEXT("Дублин")}, + {50, 3065, TEXT("Килларней")}, + {50, 3066, TEXT("Корк")}, + {50, 878, TEXT("Лимерик")}, + {50, 3069, TEXT("Нейс")}, + {50, 3068, TEXT("Типперэри")}, + {50, 2524, lpwszOther}, + {51, 879, TEXT("Рейкьявик")}, + {51, 2523, lpwszOther}, + {34, 880, TEXT("Аликанте")}, + {34, 3125, TEXT("Альмерия")}, + {34, 881, TEXT("Барселона")}, + {34, 890, TEXT("Бильбао")}, + {34, 3076, TEXT("Бланес")}, + {34, 882, TEXT("Валенсия")}, + {34, 3070, TEXT("Ибица")}, + {34, 888, TEXT("Кадис")}, + {34, 886, TEXT("Картахена")}, + {34, 891, TEXT("Ла-Корунья")}, + {34, 3310, TEXT("Лорет де Мар")}, + {34, 883, TEXT("Мадрид")}, + {34, 884, TEXT("Малага")}, + {34, 885, TEXT("Марбелья")}, + {34, 892, TEXT("Овьедо")}, + {34, 3179, TEXT("Пальма де Майорка")}, + {34, 3177, TEXT("Сан-Агустин")}, + {34, 3289, TEXT("Санта-Крус-де-Тенерифе")}, + {34, 889, TEXT("Сарагоса")}, + {34, 887, TEXT("Севилья")}, + {34, 893, TEXT("Хихон")}, + {34, 2522, lpwszOther}, + {52, 3318, TEXT("Аоста")}, + {52, 3278, TEXT("Беллариа")}, + {52, 906, TEXT("Болонья")}, + {52, 894, TEXT("Брешиа")}, + {52, 895, TEXT("Венеция")}, + {52, 905, TEXT("Верона")}, + {52, 896, TEXT("Генуя")}, + {52, 897, TEXT("Лекко")}, + {52, 3369, TEXT("Ливорно")}, + {52, 3327, TEXT("Марсала")}, + {52, 898, TEXT("Милан")}, + {52, 899, TEXT("Модена")}, + {52, 907, TEXT("Неаполь")}, + {52, 908, TEXT("Перуджа")}, + {52, 900, TEXT("Пиза")}, + {52, 901, TEXT("Рим")}, + {52, 3368, TEXT("Сан-Ремо")}, + {52, 3384, TEXT("Сиракуза")}, + {52, 3252, TEXT("Терамо")}, + {52, 902, TEXT("Триест")}, + {52, 903, TEXT("Турин")}, + {52, 3130, TEXT("Фано")}, + {52, 904, TEXT("Флоренция")}, + {52, 2521, lpwszOther}, + {53, 2939, TEXT("Айзкраукле")}, + {53, 3054, TEXT("Валка")}, + {53, 909, TEXT("Даугавпилс")}, + {53, 2934, TEXT("Екабпилс")}, + {53, 913, TEXT("Елгава")}, + {53, 2935, TEXT("Кокнесе")}, + {53, 912, TEXT("Лиепая")}, + {53, 2905, TEXT("Резекне")}, + {53, 911, TEXT("Рига")}, + {53, 2936, TEXT("Саласпилс")}, + {53, 2937, TEXT("Смилтене")}, + {53, 910, TEXT("Юрмала")}, + {53, 2520, lpwszOther}, + {54, 914, TEXT("Вильнюс")}, + {54, 915, TEXT("Висагинас")}, + {54, 916, TEXT("Каунас")}, + {54, 918, TEXT("Клайпеда")}, + {54, 919, TEXT("Паланга")}, + {54, 3173, TEXT("Пеневежис")}, + {54, 917, TEXT("Шауляй")}, + {54, 2519, lpwszOther}, + {55, 920, TEXT("Вадуц")}, + {55, 2518, lpwszOther}, + {56, 3376, TEXT("Бетцдорф")}, + {56, 921, TEXT("Люксембург")}, + {56, 2517, lpwszOther}, + {57, 3142, TEXT("Битола")}, + {57, 922, TEXT("Скопье")}, + {57, 2516, lpwszOther}, + {58, 923, TEXT("Валлетта")}, + {58, 3154, TEXT("Мзида")}, + {58, 924, TEXT("Слима")}, + {58, 2515, lpwszOther}, + {59, 925, TEXT("Бельцы")}, + {59, 926, TEXT("Бендеры")}, + {59, 3234, TEXT("Дубоссары")}, + {59, 3275, TEXT("Кахул")}, + {59, 927, TEXT("Кишинев")}, + {59, 3321, TEXT("Резина")}, + {59, 928, TEXT("Рыбница")}, + {59, 929, TEXT("Тирасполь")}, + {59, 3281, TEXT("Чадыр-Лунга")}, + {59, 2514, lpwszOther}, + {36, 930, TEXT("Монте-Карло")}, + {36, 2513, lpwszOther}, + {60, 931, TEXT("Амстердам")}, + {60, 933, TEXT("Бреда")}, + {60, 932, TEXT("Гаага")}, + {60, 934, TEXT("Гауда")}, + {60, 935, TEXT("Делфт")}, + {60, 2977, TEXT("Донген")}, + {60, 3030, TEXT("Зволле")}, + {60, 3091, TEXT("Ниймеген")}, + {60, 936, TEXT("Роттердам")}, + {60, 937, TEXT("Утрехт")}, + {60, 3044, TEXT("Эйндховен")}, + {60, 3380, TEXT("Эншеде")}, + {60, 2512, lpwszOther}, + {61, 3190, TEXT("Кристиансанд")}, + {61, 2857, TEXT("Лиллехаммер")}, + {61, 938, TEXT("Осло")}, + {61, 3355, TEXT("Ставангер")}, + {61, 939, TEXT("Тронхейм")}, + {61, 2511, lpwszOther}, + {62, 940, TEXT("Белосток")}, + {62, 941, TEXT("Варшава")}, + {62, 3164, TEXT("Вроцлав")}, + {62, 942, TEXT("Гданьск")}, + {62, 943, TEXT("Гливице")}, + {62, 3237, TEXT("Закопане")}, + {62, 3165, TEXT("Зелена Гура")}, + {62, 944, TEXT("Катовице")}, + {62, 945, TEXT("Краков")}, + {62, 3008, TEXT("Лодзь")}, + {62, 3150, TEXT("Ольштын")}, + {62, 946, TEXT("Познань")}, + {62, 947, TEXT("Радом")}, + {62, 948, TEXT("Сопот")}, + {62, 2958, TEXT("Тыхы")}, + {62, 2510, lpwszOther}, + {35, 949, TEXT("Лиссабон")}, + {35, 950, TEXT("Порто")}, + {35, 2509, lpwszOther}, + {63, 952, TEXT("Брашов")}, + {63, 951, TEXT("Бухарест")}, + {63, 954, TEXT("Констанца")}, + {63, 955, TEXT("Плоешти")}, + {63, 953, TEXT("Яссы")}, + {63, 2508, lpwszOther}, + {64, 956, TEXT("Сан-Марино")}, + {64, 2507, lpwszOther}, + {74, 957, TEXT("Белград")}, + {74, 960, TEXT("Ниш")}, + {74, 958, TEXT("Нови-Сад")}, + {74, 959, TEXT("Сараево")}, + {74, 2506, lpwszOther}, + {65, 961, TEXT("Братислава")}, + {65, 962, TEXT("Кошице")}, + {65, 3101, TEXT("Липтов")}, + {65, 963, TEXT("Попрад")}, + {65, 964, TEXT("Прешов")}, + {65, 965, TEXT("Ружемберок")}, + {65, 966, TEXT("Тврдошин")}, + {65, 2505, lpwszOther}, + {66, 968, TEXT("Копар")}, + {66, 967, TEXT("Любляна")}, + {66, 969, TEXT("Марибор")}, + {66, 2504, lpwszOther}, + {67, 970, TEXT("Торсхавн")}, + {67, 2503, lpwszOther}, + {68, 2888, TEXT("Вантаа")}, + {68, 971, TEXT("Васа")}, + {68, 979, TEXT("Котка")}, + {68, 972, TEXT("Коувола")}, + {68, 980, TEXT("Лахти")}, + {68, 973, TEXT("Оулу")}, + {68, 3375, TEXT("Риихимяки")}, + {68, 3159, TEXT("Руовеси")}, + {68, 974, TEXT("Тампере")}, + {68, 975, TEXT("Турку")}, + {68, 976, TEXT("Хельсинки")}, + {68, 977, TEXT("Эспо")}, + {68, 978, TEXT("Ювяскюля")}, + {68, 2502, lpwszOther}, + {37, 996, TEXT("Авиньон")}, + {37, 983, TEXT("Бержерак")}, + {37, 997, TEXT("Блуа")}, + {37, 984, TEXT("Бордо")}, + {37, 998, TEXT("Дижон")}, + {37, 987, TEXT("Канн")}, + {37, 988, TEXT("Кастр")}, + {37, 993, TEXT("Клермон-Ферран")}, + {37, 3037, TEXT("Лилль")}, + {37, 989, TEXT("Лион")}, + {37, 985, TEXT("Марсель")}, + {37, 991, TEXT("Мец")}, + {37, 3161, TEXT("Мобеж")}, + {37, 990, TEXT("Нанси")}, + {37, 994, TEXT("Нант")}, + {37, 995, TEXT("Ницца")}, + {37, 999, TEXT("Орлеан")}, + {37, 981, TEXT("Париж")}, + {37, 3374, TEXT("Перпиньян")}, + {37, 992, TEXT("Руан")}, + {37, 982, TEXT("Страсбург")}, + {37, 986, TEXT("Тулуза")}, + {37, 3314, TEXT("Шамбери")}, + {37, 2501, lpwszOther}, + {69, 1003, TEXT("Дубровник")}, + {69, 1000, TEXT("Загреб")}, + {69, 1001, TEXT("Задар")}, + {69, 1004, TEXT("Риека")}, + {69, 1002, TEXT("Сплит")}, + {69, 2500, lpwszOther}, + {70, 1005, TEXT("Брно")}, + {70, 3291, TEXT("Гавличкув-Брод")}, + {70, 1007, TEXT("Градец-Кралове")}, + {70, 1008, TEXT("Карлови-Вари")}, + {70, 3019, TEXT("Кладрубы")}, + {70, 1010, TEXT("Лоуни")}, + {70, 1009, TEXT("Острава")}, + {70, 1015, TEXT("Пльзень")}, + {70, 3105, TEXT("Правчицка Брана")}, + {70, 1006, TEXT("Прага")}, + {70, 3246, TEXT("Тачов")}, + {70, 1011, TEXT("Тршебич")}, + {70, 1012, TEXT("Усти-над-Лабем")}, + {70, 1014, TEXT("Ческе-Будеевице")}, + {70, 1013, TEXT("Яблонец-над-Нисоу")}, + {70, 2499, lpwszOther}, + {71, 1016, TEXT("Арау")}, + {71, 1019, TEXT("Баден")}, + {71, 1017, TEXT("Базель")}, + {71, 1018, TEXT("Берн")}, + {71, 1020, TEXT("Биль")}, + {71, 1021, TEXT("Винтертур")}, + {71, 1022, TEXT("Давос")}, + {71, 3189, TEXT("Делемонт")}, + {71, 1023, TEXT("Женева")}, + {71, 1024, TEXT("Золотурн")}, + {71, 1025, TEXT("Лозанна")}, + {71, 1026, TEXT("Локарно")}, + {71, 1027, TEXT("Лугано")}, + {71, 1028, TEXT("Люцерн")}, + {71, 1029, TEXT("Монтре")}, + {71, 1030, TEXT("Цюрих")}, + {71, 2498, lpwszOther}, + {72, 2883, TEXT("Арбога")}, + {72, 1031, TEXT("Гетеборг")}, + {72, 1032, TEXT("Кальмар")}, + {72, 1037, TEXT("Лахольм")}, + {72, 1036, TEXT("Лулео")}, + {72, 1042, TEXT("Лунд")}, + {72, 1033, TEXT("Мальме")}, + {72, 1034, TEXT("Стокгольм")}, + {72, 1041, TEXT("Умео")}, + {72, 1039, TEXT("Фалун")}, + {72, 1043, TEXT("Хельсинборг")}, + {72, 1040, TEXT("Хернесанд")}, + {72, 1038, TEXT("Эстерсунд")}, + {72, 2497, lpwszOther}, + {73, 3013, TEXT("Валга")}, + {73, 1044, TEXT("Кейла")}, + {73, 1045, TEXT("Кохтла-Ярве")}, + {73, 1046, TEXT("Маарду")}, + {73, 1047, TEXT("Мыйзакюла")}, + {73, 1048, TEXT("Нарва")}, + {73, 1049, TEXT("Пярну")}, + {73, 1050, TEXT("Раквере")}, + {73, 1051, TEXT("Силламяэ")}, + {73, 1052, TEXT("Таллин")}, + {73, 1053, TEXT("Тарту")}, + {73, 1054, TEXT("Хаапсалу")}, + {0, NULL} +};//*/ + + + + + + +static const MRA_PLACE mrapPlaces[]= +{ + {24, 0, 0, L"Россия"}, + {81, 0, 0, L"Азербайджан"}, + {82, 0, 0, L"Армения"}, + {97, 0, 0, L"Афганистан"}, + {96, 0, 0, L"Бангладеш"}, + {99, 0, 0, L"Бахрейн"}, + {100, 0, 0, L"Бруней-Даруссалам"}, + {101, 0, 0, L"Бутан"}, + {102, 0, 0, L"Вьетнам"}, + {83, 0, 0, L"Грузия"}, + {86, 0, 0, L"Израиль"}, + {95, 0, 0, L"Индия"}, + {103, 0, 0, L"Индонезия"}, + {79, 0, 0, L"Иордания"}, + {85, 0, 0, L"Ирак"}, + {87, 0, 0, L"Иран"}, + {104, 0, 0, L"Йемен"}, + {84, 0, 0, L"Казахстан"}, + {105, 0, 0, L"Камбоджа"}, + {106, 0, 0, L"Катар"}, + {107, 0, 0, L"Кипр"}, + {92, 0, 0, L"Киргизия (Кыргызстан)"}, + {76, 0, 0, L"Китай"}, + {3215, 0, 0, L"Кокосовые острова (Австр.)"}, + {29, 0, 0, L"Корея (КНДР)"}, + {108, 0, 0, L"Корея"}, + {88, 0, 0, L"Кувейт"}, + {109, 0, 0, L"Лаос"}, + {110, 0, 0, L"Ливан"}, + {111, 0, 0, L"Малайзия"}, + {112, 0, 0, L"Мальдивы"}, + {113, 0, 0, L"Монголия"}, + {114, 0, 0, L"Мьянма"}, + {115, 0, 0, L"Непал"}, + {116, 0, 0, L"Объединенные Арабские Эмираты"}, + {117, 0, 0, L"Оман"}, + {3216, 0, 0, L"Остров Рождества (Австр.)"}, + {122, 0, 0, L"Пакистан"}, + {89, 0, 0, L"Палестина"}, + {94, 0, 0, L"Саудовская Аравия"}, + {118, 0, 0, L"Сингапур"}, + {78, 0, 0, L"Сирия"}, + {91, 0, 0, L"Таджикистан"}, + {119, 0, 0, L"Таиланд"}, + {120, 0, 0, L"Тайвань"}, + {132, 0, 0, L"Тимор"}, + {90, 0, 0, L"Туркмения"}, + {77, 0, 0, L"Турция"}, + {93, 0, 0, L"Узбекистан"}, + {121, 0, 0, L"Филиппины"}, + {98, 0, 0, L"Шри Ланка"}, + {75, 0, 0, L"Япония"}, + {123, 0, 0, L"Австралия"}, + {454, 0, 0, L"Американское Самоа"}, + {124, 0, 0, L"Вануату"}, + {453, 0, 0, L"Гуам (США)"}, + {126, 0, 0, L"Кирибати"}, + {127, 0, 0, L"Маршалловы Острова"}, + {128, 0, 0, L"Микронезия (Федеративные Штаты Микронезии)"}, + {129, 0, 0, L"Науру"}, + {3220, 0, 0, L"Ниуэ (Н.Зел.)"}, + {130, 0, 0, L"Новая Зеландия"}, + {3218, 0, 0, L"Новая Каледония (Фр.)"}, + {3221, 0, 0, L"Острова Кука (Н.Зел.)"}, + {3230, 0, 0, L"Острова Херд и Макдональд (Австр.)"}, + {131, 0, 0, L"Палау"}, + {133, 0, 0, L"Папуа - Новая Гвинея"}, + {3222, 0, 0, L"Питкерн (Брит.)"}, + {125, 0, 0, L"Самоа"}, + {3219, 0, 0, L"Сев. Марианские острова (США)"}, + {134, 0, 0, L"Соломоновы Острова"}, + {3223, 0, 0, L"Токелау (Н.Зел.)"}, + {135, 0, 0, L"Тонга"}, + {136, 0, 0, L"Тувалу"}, + {3224, 0, 0, L"Уоллис и Футуна острова (Фр.)"}, + {137, 0, 0, L"Фиджи"}, + {3226, 0, 0, L"Французская Полинезия"}, + {3225, 0, 0, L"Французские Южные территории"}, + {138, 0, 0, L"Канада"}, + {139, 0, 0, L"США"}, + {3200, 0, 0, L"Ангилья (Брит.)"}, + {140, 0, 0, L"Антигуа и Барбуда"}, + {141, 0, 0, L"Аргентина"}, + {3202, 0, 0, L"Аруба (Нид.)"}, + {142, 0, 0, L"Багамы"}, + {143, 0, 0, L"Барбадос"}, + {146, 0, 0, L"Белиз"}, + {3203, 0, 0, L"Бермуды (Брит.)"}, + {144, 0, 0, L"Боливия"}, + {145, 0, 0, L"Бразилия"}, + {147, 0, 0, L"Венесуэла"}, + {3204, 0, 0, L"Виргинские острова (Брит.)"}, + {452, 0, 0, L"Виргинские острова (США)"}, + {149, 0, 0, L"Гаити"}, + {148, 0, 0, L"Гайана"}, + {3205, 0, 0, L"Гваделупа (Фр.)"}, + {173, 0, 0, L"Гватемала"}, + {150, 0, 0, L"Гондурас"}, + {151, 0, 0, L"Гренада"}, + {152, 0, 0, L"Гренландия (Дат.)"}, + {153, 0, 0, L"Доминика"}, + {154, 0, 0, L"Доминиканская Республика"}, + {155, 0, 0, L"Колумбия"}, + {156, 0, 0, L"Коста-Рика"}, + {157, 0, 0, L"Куба"}, + {3208, 0, 0, L"Мартиника (Фр.)"}, + {158, 0, 0, L"Мексика"}, + {3209, 0, 0, L"Монтсеррат (Брит)"}, + {3201, 0, 0, L"Нидерландские Антилы"}, + {159, 0, 0, L"Никарагуа"}, + {3207, 0, 0, L"Остров Кайман (Брит.)"}, + {3211, 0, 0, L"Острова Теркс и Кайкос (Брит.)"}, + {160, 0, 0, L"Панама"}, + {161, 0, 0, L"Парагвай"}, + {162, 0, 0, L"Перу"}, + {163, 0, 0, L"Сальвадор"}, + {164, 0, 0, L"Сент-Винсент и Гренадины"}, + {165, 0, 0, L"Сент-Китс и Невис"}, + {166, 0, 0, L"Сент-Люсия"}, + {3210, 0, 0, L"Сент-Пьер и Микелон (Фр.)"}, + {167, 0, 0, L"Суринам"}, + {168, 0, 0, L"Тринидат и Тобаго"}, + {169, 0, 0, L"Уругвай"}, + {3212, 0, 0, L"Фолклендские острова (Брит.)"}, + {3206, 0, 0, L"Французская Гвиана"}, + {170, 0, 0, L"Чили"}, + {171, 0, 0, L"Эквадор"}, + {3213, 0, 0, L"Юж. Джорджия и Юж. Сандвичевы о-ва (Брит.)"}, + {172, 0, 0, L"Ямайка"}, + {174, 0, 0, L"Алжир"}, + {175, 0, 0, L"Ангола"}, + {176, 0, 0, L"Бенин"}, + {177, 0, 0, L"Ботсвана"}, + {3228, 0, 0, L"Британская территория в Индийском океане"}, + {178, 0, 0, L"Буркина-Фасо"}, + {179, 0, 0, L"Бурунди"}, + {180, 0, 0, L"Габон"}, + {181, 0, 0, L"Гамбия"}, + {182, 0, 0, L"Гана"}, + {183, 0, 0, L"Гвинея"}, + {184, 0, 0, L"Гвинея-Бисау"}, + {185, 0, 0, L"Джибути"}, + {186, 0, 0, L"Египет"}, + {187, 0, 0, L"Замбия"}, + {3198, 0, 0, L"Зап. Сахара"}, + {23, 0, 0, L"Зимбабве"}, + {188, 0, 0, L"Кабо-Верде"}, + {189, 0, 0, L"Камерун"}, + {190, 0, 0, L"Кения"}, + {191, 0, 0, L"Коморы"}, + {193, 0, 0, L"Конго (Заир)"}, + {192, 0, 0, L"Конго"}, + {194, 0, 0, L"Кот-д`Ивуар"}, + {195, 0, 0, L"Лесото"}, + {196, 0, 0, L"Либерия"}, + {197, 0, 0, L"Ливия"}, + {198, 0, 0, L"Маврикий"}, + {199, 0, 0, L"Мавритания"}, + {200, 0, 0, L"Мадагаскар"}, + {3229, 0, 0, L"Майотт (Фр.)"}, + {201, 0, 0, L"Малави"}, + {202, 0, 0, L"Мали"}, + {203, 0, 0, L"Марокко"}, + {204, 0, 0, L"Мозамбик"}, + {205, 0, 0, L"Намибия"}, + {206, 0, 0, L"Нигер"}, + {207, 0, 0, L"Нигерия"}, + {3227, 0, 0, L"Остров Буве (Норв.)"}, + {3197, 0, 0, L"Реюньон (Фр.)"}, + {208, 0, 0, L"Руанда"}, + {209, 0, 0, L"Сан-Томе и Принсипи"}, + {210, 0, 0, L"Свазиленд"}, + {3199, 0, 0, L"Святая Елена (Брит.)"}, + {211, 0, 0, L"Сейшелы"}, + {212, 0, 0, L"Сенегал"}, + {213, 0, 0, L"Сомали"}, + {214, 0, 0, L"Судан"}, + {215, 0, 0, L"Сьерра-Леоне"}, + {216, 0, 0, L"Танзания"}, + {217, 0, 0, L"Того"}, + {218, 0, 0, L"Тунис"}, + {219, 0, 0, L"Уганда"}, + {220, 0, 0, L"Центральноафриканская Республика"}, + {222, 0, 0, L"Чад"}, + {223, 0, 0, L"Экваториальная Гвинея"}, + {221, 0, 0, L"Эритрея"}, + {224, 0, 0, L"Эфиопия"}, + {225, 0, 0, L"Южно-Африканская Республика (ЮАР)"}, + {39, 0, 0, L"Украина"}, + {40, 0, 0, L"Австрия"}, + {32, 0, 0, L"Албания"}, + {33, 0, 0, L"Андорра"}, + {340, 0, 0, L"Белоруссия"}, + {38, 0, 0, L"Бельгия"}, + {41, 0, 0, L"Болгария"}, + {42, 0, 0, L"Босния и Герцеговина"}, + {43, 0, 0, L"Ватикан"}, + {45, 0, 0, L"Великобритания"}, + {44, 0, 0, L"Венгрия"}, + {46, 0, 0, L"Германия"}, + {3193, 0, 0, L"Гернси (Брит.)"}, + {47, 0, 0, L"Гибралтар (Брит.)"}, + {48, 0, 0, L"Греция"}, + {49, 0, 0, L"Дания"}, + {3194, 0, 0, L"Джерси (Брит.)"}, + {50, 0, 0, L"Ирландия"}, + {51, 0, 0, L"Исландия"}, + {34, 0, 0, L"Испания"}, + {52, 0, 0, L"Италия"}, + {53, 0, 0, L"Латвия"}, + {54, 0, 0, L"Литва"}, + {55, 0, 0, L"Лихтенштейн"}, + {56, 0, 0, L"Люксембург"}, + {57, 0, 0, L"Македония"}, + {58, 0, 0, L"Мальта"}, + {59, 0, 0, L"Молдавия"}, + {36, 0, 0, L"Монако"}, + {60, 0, 0, L"Нидерланды"}, + {61, 0, 0, L"Норвегия"}, + {3195, 0, 0, L"Остров Мэн (Брит.)"}, + {62, 0, 0, L"Польша"}, + {35, 0, 0, L"Португалия"}, + {63, 0, 0, L"Румыния"}, + {64, 0, 0, L"Сан-Марино"}, + {74, 0, 0, L"Сербия и Черногория"}, + {65, 0, 0, L"Словакия"}, + {66, 0, 0, L"Словения"}, + {67, 0, 0, L"Фарерские о-ва (Дания)"}, + {68, 0, 0, L"Финляндия"}, + {37, 0, 0, L"Франция"}, + {69, 0, 0, L"Хорватия"}, + {70, 0, 0, L"Чехия"}, + {71, 0, 0, L"Швейцария"}, + {72, 0, 0, L"Швеция"}, + {3196, 0, 0, L"Шпицберген (Норв.)"}, + {73, 0, 0, L"Эстония"}, + {24, 25, 0, L"Москва"}, + {24, 226, 0, L"Санкт-Петербург"}, + {24, 233, 0, L"Саха (Якутия)"}, + {24, 232, 0, L"Приморский край"}, + {24, 235, 0, L"Хабаровский край"}, + {24, 227, 0, L"Амурская обл."}, + {24, 229, 0, L"Камчатская обл."}, + {24, 231, 0, L"Магаданская обл."}, + {24, 234, 0, L"Сахалинская обл."}, + {24, 228, 0, L"Еврейская АО"}, + {24, 230, 0, L"Корякский АО"}, + {24, 236, 0, L"Чукотский АО"}, + {24, 237, 0, L"Башкортостан"}, + {24, 240, 0, L"Марий-Эл"}, + {24, 241, 0, L"Мордовия"}, + {24, 248, 0, L"Татарстан"}, + {24, 249, 0, L"Удмуртия"}, + {24, 251, 0, L"Чувашия"}, + {24, 238, 0, L"Кировская обл."}, + {24, 242, 0, L"Нижегородская обл."}, + {24, 243, 0, L"Оренбургская обл."}, + {24, 244, 0, L"Пензенская обл."}, + {24, 245, 0, L"Пермская обл."}, + {24, 246, 0, L"Самарская обл."}, + {24, 247, 0, L"Саратовская обл."}, + {24, 250, 0, L"Ульяновская обл."}, + {24, 239, 0, L"Коми-Пермяцкий АО"}, + {24, 255, 0, L"Карелия"}, + {24, 256, 0, L"Коми"}, + {24, 252, 0, L"Архангельская обл."}, + {24, 253, 0, L"Вологодская обл."}, + {24, 254, 0, L"Калининградская обл."}, + {24, 257, 0, L"Ленинградская обл."}, + {24, 258, 0, L"Мурманская обл."}, + {24, 260, 0, L"Новгородская обл."}, + {24, 261, 0, L"Псковская обл."}, + {24, 259, 0, L"Ненецкий АО"}, + {24, 265, 0, L"Бурятия"}, + {24, 263, 0, L"Республика Алтай"}, + {24, 273, 0, L"Тыва"}, + {24, 275, 0, L"Хакасия"}, + {24, 264, 0, L"Алтайский край"}, + {24, 268, 0, L"Красноярский край"}, + {24, 266, 0, L"Иркутская обл."}, + {24, 267, 0, L"Кемеровская обл."}, + {24, 269, 0, L"Новосибирская обл."}, + {24, 270, 0, L"Омская обл."}, + {24, 272, 0, L"Томская обл."}, + {24, 276, 0, L"Читинская обл."}, + {24, 262, 0, L"Агинский Бурятский АО"}, + {24, 271, 0, L"Таймырский АО"}, + {24, 274, 0, L"Усть-Ордынский Бурятский АО"}, + {24, 277, 0, L"Эвенкийский АО"}, + {24, 278, 0, L"Курганская обл."}, + {24, 279, 0, L"Свердловская обл."}, + {24, 280, 0, L"Тюменская обл."}, + {24, 282, 0, L"Челябинская обл."}, + {24, 281, 0, L"Ханты-Мансийский АО - Югра"}, + {24, 283, 0, L"Ямало-Ненецкий АО"}, + {24, 284, 0, L"Белгородская обл."}, + {24, 285, 0, L"Брянская обл."}, + {24, 286, 0, L"Владимирская обл."}, + {24, 287, 0, L"Воронежская обл."}, + {24, 288, 0, L"Ивановская обл."}, + {24, 289, 0, L"Калужская обл."}, + {24, 290, 0, L"Костромская обл."}, + {24, 291, 0, L"Курская обл."}, + {24, 292, 0, L"Липецкая обл."}, + {24, 293, 0, L"Московская обл."}, + {24, 294, 0, L"Орловская обл."}, + {24, 295, 0, L"Рязанская обл."}, + {24, 296, 0, L"Смоленская обл."}, + {24, 297, 0, L"Тамбовская обл."}, + {24, 298, 0, L"Тверская обл."}, + {24, 299, 0, L"Тульская обл."}, + {24, 300, 0, L"Ярославская обл."}, + {24, 301, 0, L"Адыгея"}, + {24, 304, 0, L"Дагестан"}, + {24, 305, 0, L"Ингушетия"}, + {24, 306, 0, L"Кабардино-Балкария"}, + {24, 307, 0, L"Калмыкия"}, + {24, 308, 0, L"Карачаево-Черкессия"}, + {24, 311, 0, L"Северная Осетия - Алания"}, + {24, 313, 0, L"Чечня"}, + {24, 309, 0, L"Краснодарский край"}, + {24, 312, 0, L"Ставропольский край"}, + {24, 302, 0, L"Астраханская обл."}, + {24, 303, 0, L"Волгоградская обл."}, + {24, 310, 0, L"Ростовская обл."}, + {81, 1055, 0, L"Баку"}, + {81, 1058, 0, L"Гянджа"}, + {81, 1056, 0, L"Нахичевань"}, + {81, 1057, 0, L"Ханкенди"}, + {81, 3153, 0, L"Шеки"}, + {81, 2291, 0, L"Другое"}, + {82, 2932, 0, L"Абовян"}, + {82, 1060, 0, L"Аштарак"}, + {82, 3084, 0, L"Ванадзор"}, + {82, 3011, 0, L"Гюмри"}, + {82, 3306, 0, L"Дилижан"}, + {82, 1059, 0, L"Ереван"}, + {82, 3145, 0, L"Ханкенди"}, + {82, 2292, 0, L"Другое"}, + {97, 1061, 0, L"Кабул"}, + {97, 2293, 0, L"Другое"}, + {96, 1062, 0, L"Дакка"}, + {96, 2294, 0, L"Другое"}, + {99, 1063, 0, L"Манама"}, + {99, 2295, 0, L"Другое"}, + {100, 1064, 0, L"Бандар-Сери-Бегаван"}, + {100, 2296, 0, L"Другое"}, + {101, 1065, 0, L"Тхимпху"}, + {101, 2297, 0, L"Другое"}, + {102, 1066, 0, L"Ханой"}, + {102, 2298, 0, L"Другое"}, + {83, 1067, 0, L"Батуми"}, + {83, 3158, 0, L"Боржоми"}, + {83, 1068, 0, L"Поти"}, + {83, 3129, 0, L"Рустави"}, + {83, 1069, 0, L"Сухуми"}, + {83, 1070, 0, L"Тбилиси"}, + {83, 2299, 0, L"Другое"}, + {86, 3345, 0, L"Ариэль"}, + {86, 1071, 0, L"Афула"}, + {86, 2992, 0, L"Ашдод"}, + {86, 3175, 0, L"Ашкелон"}, + {86, 3363, 0, L"Бат-Ям"}, + {86, 2884, 0, L"Беер-Яков"}, + {86, 3243, 0, L"Бейт-Шемеш"}, + {86, 1074, 0, L"Беэр-Шева"}, + {86, 3348, 0, L"Герцелия"}, + {86, 3241, 0, L"Димона"}, + {86, 1075, 0, L"Иерусалим"}, + {86, 3350, 0, L"Йокнеам-Иллит"}, + {86, 2982, 0, L"Кармиэль"}, + {86, 2971, 0, L"Кфар-Саба"}, + {86, 3136, 0, L"Назарет"}, + {86, 1080, 0, L"Натания"}, + {86, 3303, 0, L"Офаким"}, + {86, 3050, 0, L"Раанана"}, + {86, 3151, 0, L"Рамат Ган"}, + {86, 3141, 0, L"Реховот"}, + {86, 3012, 0, L"Ришон ле Цион"}, + {86, 1081, 0, L"Тверия"}, + {86, 1077, 0, L"Тель-Авив"}, + {86, 1079, 0, L"Хадера"}, + {86, 1078, 0, L"Хайфа"}, + {86, 1076, 0, L"Хеврон"}, + {86, 2929, 0, L"Цфат"}, + {86, 2928, 0, L"Эйлат"}, + {86, 2300, 0, L"Другое"}, + {95, 3315, 0, L"Бангалор"}, + {95, 1082, 0, L"Дели"}, + {95, 1083, 0, L"Джайпур"}, + {95, 3144, 0, L"Калькутта"}, + {95, 3025, 0, L"Мумбаи"}, + {95, 3277, 0, L"Панаджи"}, + {95, 1084, 0, L"Ченнаи"}, + {95, 2301, 0, L"Другое"}, + {103, 1085, 0, L"Джакарта"}, + {103, 2302, 0, L"Другое"}, + {79, 1086, 0, L"Амман"}, + {79, 2303, 0, L"Другое"}, + {85, 1087, 0, L"Багдад"}, + {85, 2304, 0, L"Другое"}, + {87, 1088, 0, L"Тегеран"}, + {87, 2305, 0, L"Другое"}, + {104, 1089, 0, L"Сана"}, + {104, 2306, 0, L"Другое"}, + {84, 1090, 0, L"Актау"}, + {84, 1091, 0, L"Актюбинск"}, + {84, 1092, 0, L"Алма-Ата"}, + {84, 3242, 0, L"Аршалы"}, + {84, 1093, 0, L"Астана"}, + {84, 1094, 0, L"Атырау (Гурьев)"}, + {84, 1095, 0, L"Байконур"}, + {84, 3245, 0, L"Балхаш"}, + {84, 3083, 0, L"Жезказган"}, + {84, 1096, 0, L"Капчагай"}, + {84, 1097, 0, L"Караганда"}, + {84, 1098, 0, L"Кокшетау"}, + {84, 1099, 0, L"Кустанай"}, + {84, 2868, 0, L"Лисаковск"}, + {84, 1100, 0, L"Павлодар"}, + {84, 1101, 0, L"Петропавловск (Сев.-Каз. обл.)"}, + {84, 1102, 0, L"Рудный"}, + {84, 1103, 0, L"Семипалатинск"}, + {84, 1104, 0, L"Степногорск"}, + {84, 3166, 0, L"Талгар"}, + {84, 1105, 0, L"Талды-Курган"}, + {84, 2927, 0, L"Тараз"}, + {84, 1106, 0, L"Темиртау"}, + {84, 1107, 0, L"Уральск"}, + {84, 1108, 0, L"Усть-Каменогорск"}, + {84, 1109, 0, L"Чимкент"}, + {84, 1110, 0, L"Экибастуз"}, + {84, 2307, 0, L"Другое"}, + {105, 1111, 0, L"Пномпень"}, + {105, 2308, 0, L"Другое"}, + {106, 1112, 0, L"Доха"}, + {106, 2309, 0, L"Другое"}, + {107, 1113, 0, L"Ларнака"}, + {107, 1114, 0, L"Лимассол"}, + {107, 1115, 0, L"Никосия"}, + {107, 2954, 0, L"Пафос"}, + {107, 2310, 0, L"Другое"}, + {92, 1116, 0, L"Бишкек"}, + {92, 1117, 0, L"Джалал-Абад"}, + {92, 3027, 0, L"Кара-Балта"}, + {92, 1118, 0, L"Каракол"}, + {92, 1119, 0, L"Ош"}, + {92, 1120, 0, L"Талас"}, + {92, 2933, 0, L"Хайдаркен"}, + {92, 2311, 0, L"Другое"}, + {76, 3214, 0, L"Аомынь (Макао)"}, + {76, 1121, 0, L"Гонконг"}, + {76, 2869, 0, L"Гуанчжоу"}, + {76, 3262, 0, L"Далянь"}, + {76, 1122, 0, L"Пекин"}, + {76, 1123, 0, L"Харбин"}, + {76, 1124, 0, L"Шанхай"}, + {76, 3043, 0, L"Шеньян"}, + {76, 2312, 0, L"Другое"}, + {29, 1125, 0, L"Пхеньян"}, + {29, 2313, 0, L"Другое"}, + {108, 1126, 0, L"Сеул"}, + {108, 3240, 0, L"Тейджон"}, + {108, 2314, 0, L"Другое"}, + {88, 1127, 0, L"Эль-Кувейт"}, + {88, 2315, 0, L"Другое"}, + {109, 1128, 0, L"Вьентьян"}, + {109, 2316, 0, L"Другое"}, + {110, 1129, 0, L"Бейрут"}, + {110, 2317, 0, L"Другое"}, + {111, 1130, 0, L"Джохор-Бару"}, + {111, 1131, 0, L"Куала-Лумпур"}, + {111, 2318, 0, L"Другое"}, + {112, 1132, 0, L"Мале"}, + {112, 2319, 0, L"Другое"}, + {113, 1133, 0, L"Улан-Батор"}, + {113, 1134, 0, L"Эрдэнэт"}, + {113, 2320, 0, L"Другое"}, + {114, 1135, 0, L"Янгон"}, + {114, 2321, 0, L"Другое"}, + {115, 1136, 0, L"Катманду"}, + {115, 2322, 0, L"Другое"}, + {116, 1137, 0, L"Абу-Даби"}, + {116, 1138, 0, L"Дубай"}, + {116, 1139, 0, L"Шарджа"}, + {116, 2323, 0, L"Другое"}, + {117, 1140, 0, L"Маскат"}, + {117, 2324, 0, L"Другое"}, + {122, 1141, 0, L"Исламабад"}, + {122, 2325, 0, L"Другое"}, + {89, 1072, 0, L"Ашдод"}, + {89, 1073, 0, L"Ашкелон"}, + {89, 1142, 0, L"Газа"}, + {89, 2326, 0, L"Другое"}, + {94, 3250, 0, L"Медина"}, + {94, 1143, 0, L"Эр-Рияд"}, + {94, 2327, 0, L"Другое"}, + {78, 1144, 0, L"Дамаск"}, + {78, 2328, 0, L"Другое"}, + {91, 1145, 0, L"Душанбе"}, + {91, 3307, 0, L"Кайраккум"}, + {91, 3308, 0, L"Худжанд"}, + {91, 2329, 0, L"Другое"}, + {119, 1146, 0, L"Бангкок"}, + {119, 1147, 0, L"Пхукет"}, + {119, 2330, 0, L"Другое"}, + {120, 1148, 0, L"Тайбэй"}, + {120, 2331, 0, L"Другое"}, + {132, 1149, 0, L"Дили"}, + {132, 2332, 0, L"Другое"}, + {90, 1150, 0, L"Ашхабад"}, + {90, 3079, 0, L"Безмеин"}, + {90, 2333, 0, L"Другое"}, + {77, 1152, 0, L"Анкара"}, + {77, 1153, 0, L"Анталия"}, + {77, 3080, 0, L"Бурса"}, + {77, 1151, 0, L"Мармарис"}, + {77, 1154, 0, L"Стамбул"}, + {77, 1155, 0, L"Трабзон"}, + {77, 2334, 0, L"Другое"}, + {93, 3362, 0, L"Алмалык"}, + {93, 3137, 0, L"Андижан"}, + {93, 3273, 0, L"Асака"}, + {93, 1156, 0, L"Ахангаран"}, + {93, 1157, 0, L"Бухара"}, + {93, 3167, 0, L"Джизак"}, + {93, 3347, 0, L"Кунград"}, + {93, 1158, 0, L"Навои"}, + {93, 1159, 0, L"Наманган"}, + {93, 1160, 0, L"Самарканд"}, + {93, 1161, 0, L"Ташкент"}, + {93, 1162, 0, L"Ургенч"}, + {93, 1163, 0, L"Фергана"}, + {93, 1164, 0, L"Чирчик"}, + {93, 2335, 0, L"Другое"}, + {121, 1165, 0, L"Манила"}, + {121, 3319, 0, L"Себу"}, + {121, 2336, 0, L"Другое"}, + {98, 1166, 0, L"Коломбо"}, + {98, 2337, 0, L"Другое"}, + {75, 3176, 0, L"Исесаки"}, + {75, 3339, 0, L"Корияма"}, + {75, 1167, 0, L"Саппоро"}, + {75, 1168, 0, L"Токио"}, + {75, 2338, 0, L"Другое"}, + {123, 1914, 0, L"Аделаида"}, + {123, 2957, 0, L"Блэк Рок"}, + {123, 1915, 0, L"Брисбен"}, + {123, 3331, 0, L"Горокан"}, + {123, 1916, 0, L"Канберра"}, + {123, 3001, 0, L"Лидкомб"}, + {123, 1917, 0, L"Мельбурн"}, + {123, 3217, 0, L"Норфолк"}, + {123, 3064, 0, L"Перт"}, + {123, 3020, 0, L"Санта Люсиа"}, + {123, 1918, 0, L"Сидней"}, + {123, 3238, 0, L"Энеабба"}, + {123, 2339, 0, L"Другое"}, + {454, 1192, 0, L"Паго-Паго"}, + {454, 2366, 0, L"Другое"}, + {124, 1919, 0, L"Порт-Вила"}, + {124, 2340, 0, L"Другое"}, + {453, 1193, 0, L"Аганья"}, + {453, 2368, 0, L"Другое"}, + {126, 1921, 0, L"Баирики"}, + {126, 2342, 0, L"Другое"}, + {127, 1922, 0, L"Маджуро"}, + {127, 2343, 0, L"Другое"}, + {128, 1923, 0, L"Паликир"}, + {128, 2344, 0, L"Другое"}, + {129, 1924, 0, L"Ярен"}, + {129, 2345, 0, L"Другое"}, + {130, 1925, 0, L"Веллингтон"}, + {130, 1926, 0, L"Гамильтон"}, + {130, 1928, 0, L"Данидин"}, + {130, 1929, 0, L"Крайстчерч"}, + {130, 3235, 0, L"Кромвель"}, + {130, 1927, 0, L"Окленд"}, + {130, 3323, 0, L"Тауранга"}, + {130, 2346, 0, L"Другое"}, + {131, 1930, 0, L"Корор"}, + {131, 2347, 0, L"Другое"}, + {133, 1931, 0, L"Порт-Морсби"}, + {133, 2348, 0, L"Другое"}, + {125, 1920, 0, L"Апиа"}, + {125, 2341, 0, L"Другое"}, + {134, 1932, 0, L"Хониара"}, + {134, 2349, 0, L"Другое"}, + {135, 1933, 0, L"Нукуалофа"}, + {135, 2350, 0, L"Другое"}, + {136, 1934, 0, L"Фунафути"}, + {136, 2351, 0, L"Другое"}, + {137, 1935, 0, L"Сува"}, + {137, 2352, 0, L"Другое"}, + {138, 3055, 0, L"Барлингтон"}, + {138, 3049, 0, L"Броссард"}, + {138, 3330, 0, L"Бурнаби"}, + {138, 1169, 0, L"Ванкувер"}, + {138, 3106, 0, L"Ватерлоо"}, + {138, 1170, 0, L"Виннипег"}, + {138, 1171, 0, L"Галифакс"}, + {138, 1172, 0, L"Гамильтон"}, + {138, 3365, 0, L"Денвер"}, + {138, 1173, 0, L"Калгари"}, + {138, 3104, 0, L"Камлупс"}, + {138, 3366, 0, L"Каннингтон"}, + {138, 1174, 0, L"Квебек"}, + {138, 2964, 0, L"Кингстон"}, + {138, 3113, 0, L"Коквитлам"}, + {138, 1175, 0, L"Монреаль"}, + {138, 2920, 0, L"Ниагара-Фолс"}, + {138, 2889, 0, L"Норд-Йорк"}, + {138, 1176, 0, L"Оттава"}, + {138, 2903, 0, L"Порт Алберни"}, + {138, 1177, 0, L"Ричмонд"}, + {138, 1178, 0, L"Тимминс"}, + {138, 2946, 0, L"Торнхилл"}, + {138, 1179, 0, L"Торонто"}, + {138, 1180, 0, L"Эдмонтон"}, + {138, 2353, 0, L"Другое"}, + {139, 407, 0, L"Вашингтон"}, + {139, 426, 0, L"Айдахо"}, + {139, 378, 0, L"Айова"}, + {139, 412, 0, L"Алабама"}, + {139, 446, 0, L"Аляска"}, + {139, 434, 0, L"Аризона"}, + {139, 416, 0, L"Арканзас"}, + {139, 428, 0, L"Вайоминг"}, + {139, 440, 0, L"Вашингтон"}, + {139, 352, 0, L"Вермонт"}, + {139, 394, 0, L"Виргиния"}, + {139, 374, 0, L"Висконсин"}, + {139, 448, 0, L"Гавайи"}, + {139, 390, 0, L"Делавер"}, + {139, 402, 0, L"Джорджия"}, + {139, 396, 0, L"Западная Виргиния"}, + {139, 370, 0, L"Иллинойс"}, + {139, 368, 0, L"Индиана"}, + {139, 444, 0, L"Калифорния"}, + {139, 388, 0, L"Канзас"}, + {139, 408, 0, L"Кентукки"}, + {139, 430, 0, L"Колорадо"}, + {139, 358, 0, L"Коннектикут"}, + {139, 418, 0, L"Луизиана"}, + {139, 354, 0, L"Массачусетс"}, + {139, 376, 0, L"Миннесота"}, + {139, 414, 0, L"Миссисипи"}, + {139, 380, 0, L"Миссури"}, + {139, 372, 0, L"Мичиган"}, + {139, 424, 0, L"Монтана"}, + {139, 348, 0, L"Мэн"}, + {139, 392, 0, L"Мэриленд"}, + {139, 386, 0, L"Небраска"}, + {139, 438, 0, L"Невада"}, + {139, 362, 0, L"Нью-Джерси"}, + {139, 360, 0, L"Нью-Йорк"}, + {139, 432, 0, L"Нью-Мексико"}, + {139, 350, 0, L"Нью-Хэмпшир"}, + {139, 366, 0, L"Огайо"}, + {139, 420, 0, L"Оклахома"}, + {139, 442, 0, L"Орегон"}, + {139, 364, 0, L"Пенсильвания"}, + {139, 450, 0, L"Пуэрто-Рико"}, + {139, 356, 0, L"Род-Айленд"}, + {139, 382, 0, L"Северная Дакота"}, + {139, 398, 0, L"Северная Каролина"}, + {139, 410, 0, L"Теннесси"}, + {139, 422, 0, L"Техас"}, + {139, 406, 0, L"Федеральный округ Колумбия"}, + {139, 404, 0, L"Флорида"}, + {139, 384, 0, L"Южная Дакота"}, + {139, 400, 0, L"Южная Каролина"}, + {139, 436, 0, L"Юта"}, + {140, 1238, 0, L"Сент-Джонс"}, + {140, 2442, 0, L"Другое"}, + {141, 1239, 0, L"Буэнос-Айрес"}, + {141, 2441, 0, L"Другое"}, + {142, 1240, 0, L"Нассау"}, + {142, 2440, 0, L"Другое"}, + {143, 1241, 0, L"Бриджтаун"}, + {143, 2439, 0, L"Другое"}, + {146, 1242, 0, L"Бельмопан"}, + {146, 2438, 0, L"Другое"}, + {144, 1243, 0, L"Ла-Пас"}, + {144, 2437, 0, L"Другое"}, + {145, 1244, 0, L"Бразилиа"}, + {145, 3094, 0, L"Пассо Фундо"}, + {145, 1245, 0, L"Рио-де-Жанейро"}, + {145, 1246, 0, L"Сан-Паулу"}, + {145, 2436, 0, L"Другое"}, + {147, 1247, 0, L"Каракас"}, + {147, 2435, 0, L"Другое"}, + {452, 1190, 0, L"Шарлотта-Амалия"}, + {452, 2364, 0, L"Другое"}, + {149, 1248, 0, L"Порт-о-Пренс"}, + {149, 2434, 0, L"Другое"}, + {148, 1249, 0, L"Джоржтаун"}, + {148, 2433, 0, L"Другое"}, + {173, 1250, 0, L"Гватемала"}, + {173, 2432, 0, L"Другое"}, + {150, 1251, 0, L"Тегусигальпа"}, + {150, 2431, 0, L"Другое"}, + {151, 1252, 0, L"Сент-Джорджес"}, + {151, 2430, 0, L"Другое"}, + {152, 1253, 0, L"Уманак"}, + {152, 2429, 0, L"Другое"}, + {153, 1254, 0, L"Розо"}, + {153, 2428, 0, L"Другое"}, + {154, 1255, 0, L"Санто-Доминго"}, + {154, 2427, 0, L"Другое"}, + {155, 1256, 0, L"Богота"}, + {155, 2426, 0, L"Другое"}, + {156, 1257, 0, L"Сан-Хосе"}, + {156, 2425, 0, L"Другое"}, + {157, 1258, 0, L"Гавана"}, + {157, 2424, 0, L"Другое"}, + {158, 1259, 0, L"Акапулько"}, + {158, 1260, 0, L"Мехико"}, + {158, 2423, 0, L"Другое"}, + {159, 1261, 0, L"Манагуа"}, + {159, 2422, 0, L"Другое"}, + {160, 1262, 0, L"Панама"}, + {160, 2421, 0, L"Другое"}, + {161, 1263, 0, L"Асунсьон"}, + {161, 2420, 0, L"Другое"}, + {162, 1264, 0, L"Лима"}, + {162, 2419, 0, L"Другое"}, + {163, 1265, 0, L"Сан-Сальвадор"}, + {163, 2418, 0, L"Другое"}, + {164, 1266, 0, L"Кингстаун"}, + {164, 2417, 0, L"Другое"}, + {165, 1267, 0, L"Бастер"}, + {165, 2416, 0, L"Другое"}, + {166, 1268, 0, L"Кастри"}, + {166, 2415, 0, L"Другое"}, + {167, 1269, 0, L"Парамарибо"}, + {167, 2414, 0, L"Другое"}, + {168, 1270, 0, L"Порт-оф-Спейн"}, + {168, 2413, 0, L"Другое"}, + {169, 1271, 0, L"Монтевидео"}, + {169, 2412, 0, L"Другое"}, + {170, 1272, 0, L"Сантьяго"}, + {170, 2411, 0, L"Другое"}, + {171, 1273, 0, L"Гуаякиль"}, + {171, 1274, 0, L"Кито"}, + {171, 2410, 0, L"Другое"}, + {172, 1275, 0, L"Кингстон"}, + {172, 2409, 0, L"Другое"}, + {174, 1854, 0, L"Алжир"}, + {174, 2495, 0, L"Другое"}, + {175, 1855, 0, L"Луанда"}, + {175, 2494, 0, L"Другое"}, + {176, 1856, 0, L"Котону"}, + {176, 1857, 0, L"Порто-Ново"}, + {176, 2493, 0, L"Другое"}, + {177, 1858, 0, L"Габороне"}, + {177, 2492, 0, L"Другое"}, + {178, 1859, 0, L"Уагадугу"}, + {178, 2491, 0, L"Другое"}, + {179, 1860, 0, L"Бужумбуру"}, + {179, 2490, 0, L"Другое"}, + {180, 1861, 0, L"Либревиль"}, + {180, 2489, 0, L"Другое"}, + {181, 1862, 0, L"Банжул"}, + {181, 2488, 0, L"Другое"}, + {182, 1863, 0, L"Аккра"}, + {182, 2487, 0, L"Другое"}, + {183, 1864, 0, L"Конакри"}, + {183, 2486, 0, L"Другое"}, + {184, 1865, 0, L"Бисау"}, + {184, 2485, 0, L"Другое"}, + {185, 1866, 0, L"Джибути"}, + {185, 2484, 0, L"Другое"}, + {186, 3312, 0, L"Дахаб"}, + {186, 1867, 0, L"Каир"}, + {186, 1868, 0, L"Хургада"}, + {186, 2483, 0, L"Другое"}, + {187, 1869, 0, L"Лусака"}, + {187, 2482, 0, L"Другое"}, + {23, 1870, 0, L"Хараре"}, + {23, 2481, 0, L"Другое"}, + {188, 1871, 0, L"Прая"}, + {188, 2480, 0, L"Другое"}, + {189, 1872, 0, L"Яунде"}, + {189, 2479, 0, L"Другое"}, + {190, 1873, 0, L"Найроби"}, + {190, 2478, 0, L"Другое"}, + {191, 1874, 0, L"Морони"}, + {191, 2477, 0, L"Другое"}, + {193, 1875, 0, L"Киншаса"}, + {193, 2476, 0, L"Другое"}, + {192, 1876, 0, L"Браззавиль"}, + {192, 2475, 0, L"Другое"}, + {194, 1877, 0, L"Ямусукро"}, + {194, 2474, 0, L"Другое"}, + {195, 1878, 0, L"Масеру"}, + {195, 2473, 0, L"Другое"}, + {196, 1879, 0, L"Монровия"}, + {196, 2472, 0, L"Другое"}, + {197, 1880, 0, L"Триполи"}, + {197, 2471, 0, L"Другое"}, + {198, 1881, 0, L"Порт-Луи"}, + {198, 2470, 0, L"Другое"}, + {199, 1882, 0, L"Нуакшот"}, + {199, 2469, 0, L"Другое"}, + {200, 1883, 0, L"Антананариву"}, + {200, 2468, 0, L"Другое"}, + {201, 1884, 0, L"Лилонгве"}, + {201, 2467, 0, L"Другое"}, + {202, 1885, 0, L"Бамако"}, + {202, 2466, 0, L"Другое"}, + {203, 1886, 0, L"Агадир"}, + {203, 1887, 0, L"Рабат"}, + {203, 2465, 0, L"Другое"}, + {204, 1888, 0, L"Мапуту"}, + {204, 2464, 0, L"Другое"}, + {205, 1889, 0, L"Виндхук"}, + {205, 2463, 0, L"Другое"}, + {206, 1890, 0, L"Ниамей"}, + {206, 2462, 0, L"Другое"}, + {207, 1891, 0, L"Абуджа"}, + {207, 2461, 0, L"Другое"}, + {208, 1892, 0, L"Кигали"}, + {208, 2460, 0, L"Другое"}, + {209, 1893, 0, L"Сан-Томе"}, + {209, 2459, 0, L"Другое"}, + {210, 1894, 0, L"Мбабане"}, + {210, 2458, 0, L"Другое"}, + {211, 1895, 0, L"Виктория"}, + {211, 2457, 0, L"Другое"}, + {212, 1896, 0, L"Дакар"}, + {212, 2456, 0, L"Другое"}, + {213, 1897, 0, L"Могадишо"}, + {213, 2455, 0, L"Другое"}, + {214, 1898, 0, L"Хартум"}, + {214, 2454, 0, L"Другое"}, + {215, 1899, 0, L"Фритаун"}, + {215, 2453, 0, L"Другое"}, + {216, 1900, 0, L"Дар-эс-Салам"}, + {216, 1901, 0, L"Додома"}, + {216, 2452, 0, L"Другое"}, + {217, 1902, 0, L"Ломе"}, + {217, 2451, 0, L"Другое"}, + {218, 1903, 0, L"Тунис"}, + {218, 2450, 0, L"Другое"}, + {219, 1904, 0, L"Кампала"}, + {219, 2449, 0, L"Другое"}, + {220, 1905, 0, L"Банги"}, + {220, 2448, 0, L"Другое"}, + {222, 1906, 0, L"Нджамена"}, + {222, 2447, 0, L"Другое"}, + {223, 1907, 0, L"Малабо"}, + {223, 2446, 0, L"Другое"}, + {221, 1908, 0, L"Асмэра"}, + {221, 2445, 0, L"Другое"}, + {224, 1909, 0, L"Аддис-Абеба"}, + {224, 2444, 0, L"Другое"}, + {225, 1910, 0, L"Дурбан"}, + {225, 1913, 0, L"Йоханнесбург"}, + {225, 1912, 0, L"Кейптаун"}, + {225, 3033, 0, L"Пайнтаун"}, + {225, 1911, 0, L"Претория"}, + {225, 2443, 0, L"Другое"}, + {39, 314, 0, L"Киев"}, + {39, 315, 0, L"Винницкая обл."}, + {39, 316, 0, L"Волынская обл."}, + {39, 317, 0, L"Днепропетровская обл."}, + {39, 318, 0, L"Донецкая обл."}, + {39, 319, 0, L"Житомирская обл."}, + {39, 320, 0, L"Закарпатская обл."}, + {39, 321, 0, L"Запорожская обл."}, + {39, 322, 0, L"Ивано-Франковская обл."}, + {39, 323, 0, L"Киевская обл."}, + {39, 324, 0, L"Кировоградская обл."}, + {39, 325, 0, L"Крым"}, + {39, 326, 0, L"Луганская обл."}, + {39, 327, 0, L"Львовская обл."}, + {39, 328, 0, L"Николаевская обл."}, + {39, 329, 0, L"Одесская обл."}, + {39, 330, 0, L"Полтавская обл."}, + {39, 331, 0, L"Ровенская обл."}, + {39, 332, 0, L"Сумская обл."}, + {39, 333, 0, L"Тернопольская обл."}, + {39, 334, 0, L"Харьковская обл."}, + {39, 335, 0, L"Херсонская обл."}, + {39, 336, 0, L"Хмельницкая обл."}, + {39, 337, 0, L"Черкасская обл."}, + {39, 338, 0, L"Черниговская обл."}, + {39, 339, 0, L"Черновицкая обл."}, + {40, 602, 0, L"Бад Халл"}, + {40, 604, 0, L"Брегенц"}, + {40, 603, 0, L"Вена"}, + {40, 608, 0, L"Грац"}, + {40, 606, 0, L"Зальцбург"}, + {40, 3099, 0, L"Зель-ам-Зее"}, + {40, 605, 0, L"Инсбрук"}, + {40, 3174, 0, L"Кирхберг"}, + {40, 609, 0, L"Клагенфурт"}, + {40, 607, 0, L"Линц"}, + {40, 610, 0, L"Обдах"}, + {40, 611, 0, L"Щтубайтал"}, + {40, 2541, 0, L"Другое"}, + {32, 612, 0, L"Тирана"}, + {32, 2540, 0, L"Другое"}, + {33, 613, 0, L"Андорра-ла-Велья"}, + {33, 2539, 0, L"Другое"}, + {340, 341, 0, L"Минск"}, + {340, 342, 0, L"Брестская обл."}, + {340, 343, 0, L"Витебская обл."}, + {340, 344, 0, L"Гомельская обл."}, + {340, 345, 0, L"Гродненская обл."}, + {340, 346, 0, L"Минская обл."}, + {340, 347, 0, L"Могилевская обл."}, + {38, 760, 0, L"Антверпен"}, + {38, 767, 0, L"Арлон"}, + {38, 762, 0, L"Брюгге"}, + {38, 761, 0, L"Брюссель"}, + {38, 763, 0, L"Гент"}, + {38, 769, 0, L"Лувен"}, + {38, 765, 0, L"Льеж"}, + {38, 764, 0, L"Монс"}, + {38, 3117, 0, L"Мортсель"}, + {38, 766, 0, L"Намюр"}, + {38, 768, 0, L"Хасселт"}, + {38, 2532, 0, L"Другое"}, + {41, 3098, 0, L"Банско"}, + {41, 792, 0, L"Благоевград"}, + {41, 770, 0, L"Бургас"}, + {41, 771, 0, L"Бяла"}, + {41, 773, 0, L"Варна"}, + {41, 776, 0, L"Велико-Тырново"}, + {41, 788, 0, L"Видин"}, + {41, 789, 0, L"Враца"}, + {41, 796, 0, L"Габрово"}, + {41, 777, 0, L"Димитровград"}, + {41, 781, 0, L"Каварна"}, + {41, 786, 0, L"Кырджали"}, + {41, 791, 0, L"Кюстендил"}, + {41, 793, 0, L"Лазарджик"}, + {41, 795, 0, L"Ловеч"}, + {41, 787, 0, L"Михайловград"}, + {41, 790, 0, L"Перник"}, + {41, 3133, 0, L"Пирдоп"}, + {41, 794, 0, L"Плевен"}, + {41, 782, 0, L"Пловдив"}, + {41, 780, 0, L"Разград"}, + {41, 779, 0, L"Русе"}, + {41, 774, 0, L"Силистра"}, + {41, 784, 0, L"Сливен"}, + {41, 772, 0, L"София"}, + {41, 775, 0, L"Толбухин"}, + {41, 3116, 0, L"Тырново"}, + {41, 785, 0, L"Хасково"}, + {41, 778, 0, L"Шумен"}, + {41, 783, 0, L"Ямбол"}, + {41, 2531, 0, L"Другое"}, + {42, 797, 0, L"Баня-Лука"}, + {42, 799, 0, L"Зеница"}, + {42, 798, 0, L"Сараево"}, + {42, 800, 0, L"Тузла"}, + {42, 2530, 0, L"Другое"}, + {45, 802, 0, L"Абердин"}, + {45, 3075, 0, L"Айслворт"}, + {45, 801, 0, L"Алнвик"}, + {45, 804, 0, L"Бидефорд"}, + {45, 803, 0, L"Бирмингем"}, + {45, 805, 0, L"Блоксвич"}, + {45, 3168, 0, L"Бостон"}, + {45, 806, 0, L"Брайтон"}, + {45, 807, 0, L"Бредфорд"}, + {45, 808, 0, L"Бристоль"}, + {45, 809, 0, L"Вилленхолл"}, + {45, 3131, 0, L"Воррингтон"}, + {45, 810, 0, L"Вудбридж"}, + {45, 3342, 0, L"Гилфорд"}, + {45, 811, 0, L"Глазго"}, + {45, 812, 0, L"Дадли"}, + {45, 813, 0, L"Дарем"}, + {45, 814, 0, L"Дуглас"}, + {45, 3089, 0, L"Кардиф"}, + {45, 815, 0, L"Кембридж"}, + {45, 816, 0, L"Кентербери"}, + {45, 817, 0, L"Ливерпуль"}, + {45, 818, 0, L"Лидс"}, + {45, 819, 0, L"Лондон"}, + {45, 820, 0, L"Манчестер"}, + {45, 2976, 0, L"Митчем"}, + {45, 2988, 0, L"Мэйденхед"}, + {45, 821, 0, L"Ноттингем"}, + {45, 3088, 0, L"Ньюпорт"}, + {45, 822, 0, L"Оксфорд"}, + {45, 823, 0, L"Плимут"}, + {45, 824, 0, L"Портсмут"}, + {45, 825, 0, L"Престон"}, + {45, 3343, 0, L"Райд"}, + {45, 2867, 0, L"Ридинг"}, + {45, 2986, 0, L"Сент-Албанс"}, + {45, 826, 0, L"Стаффорд"}, + {45, 3063, 0, L"Стокпорт"}, + {45, 827, 0, L"Уэймут"}, + {45, 3140, 0, L"Челтенхэм"}, + {45, 828, 0, L"Честер"}, + {45, 829, 0, L"Шеффилд"}, + {45, 830, 0, L"Эдинбург"}, + {45, 2529, 0, L"Другое"}, + {44, 831, 0, L"Будапешт"}, + {44, 832, 0, L"Геделле"}, + {44, 836, 0, L"Дебрецен"}, + {44, 835, 0, L"Мишкольц"}, + {44, 834, 0, L"Сегед"}, + {44, 833, 0, L"Шиофок"}, + {44, 2528, 0, L"Другое"}, + {46, 3007, 0, L"Аахен"}, + {46, 837, 0, L"Аугсбург"}, + {46, 838, 0, L"Баден-Баден"}, + {46, 3371, 0, L"Бамберг"}, + {46, 839, 0, L"Бергиш-Гладбах"}, + {46, 840, 0, L"Берлин"}, + {46, 841, 0, L"Билефельд"}, + {46, 3163, 0, L"Бовенден"}, + {46, 842, 0, L"Бонн"}, + {46, 843, 0, L"Браденбург"}, + {46, 3015, 0, L"Брауншвейг"}, + {46, 844, 0, L"Бремен"}, + {46, 2921, 0, L"Варштайн"}, + {46, 845, 0, L"Веймар"}, + {46, 846, 0, L"Вупперталь"}, + {46, 847, 0, L"Гамбург"}, + {46, 848, 0, L"Ганновер"}, + {46, 849, 0, L"Гарделеген"}, + {46, 3010, 0, L"Гейдельберг"}, + {46, 850, 0, L"Гота"}, + {46, 851, 0, L"Дармштадт"}, + {46, 3072, 0, L"Дессау"}, + {46, 852, 0, L"Детмольд"}, + {46, 853, 0, L"Дортмунд"}, + {46, 854, 0, L"Дрезден"}, + {46, 855, 0, L"Дюссельдорф"}, + {46, 3082, 0, L"Иффецхайм"}, + {46, 3309, 0, L"Кассел"}, + {46, 856, 0, L"Кельн"}, + {46, 857, 0, L"Киль"}, + {46, 3138, 0, L"Кобленц"}, + {46, 858, 0, L"Крефельд"}, + {46, 859, 0, L"Лейпциг"}, + {46, 2872, 0, L"Лимбург"}, + {46, 2965, 0, L"Линген"}, + {46, 3135, 0, L"Любек"}, + {46, 3156, 0, L"Мангейм"}, + {46, 3192, 0, L"Меерсбург"}, + {46, 860, 0, L"Мюнстер"}, + {46, 861, 0, L"Мюнхен"}, + {46, 2864, 0, L"Нойштадт"}, + {46, 862, 0, L"Нюрнберг"}, + {46, 3009, 0, L"Оффенбург"}, + {46, 2993, 0, L"Падерборн"}, + {46, 863, 0, L"Равенсбург"}, + {46, 864, 0, L"Регенсбург"}, + {46, 865, 0, L"Рейнен"}, + {46, 866, 0, L"Росток"}, + {46, 3191, 0, L"Саарбрюкен"}, + {46, 2974, 0, L"Санкт-Августин"}, + {46, 3127, 0, L"Тюринген"}, + {46, 867, 0, L"Фрайберг"}, + {46, 868, 0, L"Фрайбург"}, + {46, 869, 0, L"Франкфурт-на-Майне"}, + {46, 3373, 0, L"Хемнитц"}, + {46, 3313, 0, L"Хильден"}, + {46, 870, 0, L"Штутгарт"}, + {46, 3045, 0, L"Эрланген"}, + {46, 2906, 0, L"Эшборн"}, + {46, 2527, 0, L"Другое"}, + {48, 871, 0, L"Афины"}, + {48, 873, 0, L"Ираклион"}, + {48, 3147, 0, L"Корфу"}, + {48, 872, 0, L"Салоники"}, + {48, 3178, 0, L"Халкидики"}, + {48, 2526, 0, L"Другое"}, + {49, 3006, 0, L"Архус"}, + {49, 874, 0, L"Копенгаген"}, + {49, 875, 0, L"Оденсе"}, + {49, 3285, 0, L"Ольборг"}, + {49, 876, 0, L"Сванеке"}, + {49, 3126, 0, L"Скиве"}, + {49, 2525, 0, L"Другое"}, + {50, 3377, 0, L"Виклоу"}, + {50, 3067, 0, L"Голвей"}, + {50, 877, 0, L"Дублин"}, + {50, 3065, 0, L"Килларней"}, + {50, 3066, 0, L"Корк"}, + {50, 878, 0, L"Лимерик"}, + {50, 3069, 0, L"Нейс"}, + {50, 3068, 0, L"Типперэри"}, + {50, 2524, 0, L"Другое"}, + {51, 879, 0, L"Рейкьявик"}, + {51, 2523, 0, L"Другое"}, + {34, 880, 0, L"Аликанте"}, + {34, 3125, 0, L"Альмерия"}, + {34, 881, 0, L"Барселона"}, + {34, 890, 0, L"Бильбао"}, + {34, 3076, 0, L"Бланес"}, + {34, 882, 0, L"Валенсия"}, + {34, 3070, 0, L"Ибица"}, + {34, 888, 0, L"Кадис"}, + {34, 886, 0, L"Картахена"}, + {34, 891, 0, L"Ла-Корунья"}, + {34, 3310, 0, L"Лорет де Мар"}, + {34, 883, 0, L"Мадрид"}, + {34, 884, 0, L"Малага"}, + {34, 885, 0, L"Марбелья"}, + {34, 892, 0, L"Овьедо"}, + {34, 3179, 0, L"Пальма де Майорка"}, + {34, 3177, 0, L"Сан-Агустин"}, + {34, 3289, 0, L"Санта-Крус-де-Тенерифе"}, + {34, 889, 0, L"Сарагоса"}, + {34, 887, 0, L"Севилья"}, + {34, 893, 0, L"Хихон"}, + {34, 2522, 0, L"Другое"}, + {52, 3318, 0, L"Аоста"}, + {52, 3278, 0, L"Беллариа"}, + {52, 906, 0, L"Болонья"}, + {52, 894, 0, L"Брешиа"}, + {52, 895, 0, L"Венеция"}, + {52, 905, 0, L"Верона"}, + {52, 896, 0, L"Генуя"}, + {52, 897, 0, L"Лекко"}, + {52, 3369, 0, L"Ливорно"}, + {52, 3327, 0, L"Марсала"}, + {52, 898, 0, L"Милан"}, + {52, 899, 0, L"Модена"}, + {52, 907, 0, L"Неаполь"}, + {52, 908, 0, L"Перуджа"}, + {52, 900, 0, L"Пиза"}, + {52, 901, 0, L"Рим"}, + {52, 3368, 0, L"Сан-Ремо"}, + {52, 3384, 0, L"Сиракуза"}, + {52, 3252, 0, L"Терамо"}, + {52, 902, 0, L"Триест"}, + {52, 903, 0, L"Турин"}, + {52, 3130, 0, L"Фано"}, + {52, 904, 0, L"Флоренция"}, + {52, 2521, 0, L"Другое"}, + {53, 2939, 0, L"Айзкраукле"}, + {53, 3054, 0, L"Валка"}, + {53, 909, 0, L"Даугавпилс"}, + {53, 2934, 0, L"Екабпилс"}, + {53, 913, 0, L"Елгава"}, + {53, 2935, 0, L"Кокнесе"}, + {53, 912, 0, L"Лиепая"}, + {53, 2905, 0, L"Резекне"}, + {53, 911, 0, L"Рига"}, + {53, 2936, 0, L"Саласпилс"}, + {53, 2937, 0, L"Смилтене"}, + {53, 910, 0, L"Юрмала"}, + {53, 2520, 0, L"Другое"}, + {54, 914, 0, L"Вильнюс"}, + {54, 915, 0, L"Висагинас"}, + {54, 916, 0, L"Каунас"}, + {54, 918, 0, L"Клайпеда"}, + {54, 919, 0, L"Паланга"}, + {54, 3173, 0, L"Пеневежис"}, + {54, 917, 0, L"Шауляй"}, + {54, 2519, 0, L"Другое"}, + {55, 920, 0, L"Вадуц"}, + {55, 2518, 0, L"Другое"}, + {56, 3376, 0, L"Бетцдорф"}, + {56, 921, 0, L"Люксембург"}, + {56, 2517, 0, L"Другое"}, + {57, 3142, 0, L"Битола"}, + {57, 922, 0, L"Скопье"}, + {57, 2516, 0, L"Другое"}, + {58, 923, 0, L"Валлетта"}, + {58, 3154, 0, L"Мзида"}, + {58, 924, 0, L"Слима"}, + {58, 2515, 0, L"Другое"}, + {59, 925, 0, L"Бельцы"}, + {59, 926, 0, L"Бендеры"}, + {59, 3234, 0, L"Дубоссары"}, + {59, 3275, 0, L"Кахул"}, + {59, 927, 0, L"Кишинев"}, + {59, 3321, 0, L"Резина"}, + {59, 928, 0, L"Рыбница"}, + {59, 929, 0, L"Тирасполь"}, + {59, 3281, 0, L"Чадыр-Лунга"}, + {59, 2514, 0, L"Другое"}, + {36, 930, 0, L"Монте-Карло"}, + {36, 2513, 0, L"Другое"}, + {60, 931, 0, L"Амстердам"}, + {60, 933, 0, L"Бреда"}, + {60, 932, 0, L"Гаага"}, + {60, 934, 0, L"Гауда"}, + {60, 935, 0, L"Делфт"}, + {60, 2977, 0, L"Донген"}, + {60, 3030, 0, L"Зволле"}, + {60, 3091, 0, L"Ниймеген"}, + {60, 936, 0, L"Роттердам"}, + {60, 937, 0, L"Утрехт"}, + {60, 3044, 0, L"Эйндховен"}, + {60, 3380, 0, L"Эншеде"}, + {60, 2512, 0, L"Другое"}, + {61, 3190, 0, L"Кристиансанд"}, + {61, 2857, 0, L"Лиллехаммер"}, + {61, 938, 0, L"Осло"}, + {61, 3355, 0, L"Ставангер"}, + {61, 939, 0, L"Тронхейм"}, + {61, 2511, 0, L"Другое"}, + {62, 940, 0, L"Белосток"}, + {62, 941, 0, L"Варшава"}, + {62, 3164, 0, L"Вроцлав"}, + {62, 942, 0, L"Гданьск"}, + {62, 943, 0, L"Гливице"}, + {62, 3237, 0, L"Закопане"}, + {62, 3165, 0, L"Зелена Гура"}, + {62, 944, 0, L"Катовице"}, + {62, 945, 0, L"Краков"}, + {62, 3008, 0, L"Лодзь"}, + {62, 3150, 0, L"Ольштын"}, + {62, 946, 0, L"Познань"}, + {62, 947, 0, L"Радом"}, + {62, 948, 0, L"Сопот"}, + {62, 2958, 0, L"Тыхы"}, + {62, 2510, 0, L"Другое"}, + {35, 949, 0, L"Лиссабон"}, + {35, 950, 0, L"Порто"}, + {35, 2509, 0, L"Другое"}, + {63, 952, 0, L"Брашов"}, + {63, 951, 0, L"Бухарест"}, + {63, 954, 0, L"Констанца"}, + {63, 955, 0, L"Плоешти"}, + {63, 953, 0, L"Яссы"}, + {63, 2508, 0, L"Другое"}, + {64, 956, 0, L"Сан-Марино"}, + {64, 2507, 0, L"Другое"}, + {74, 957, 0, L"Белград"}, + {74, 960, 0, L"Ниш"}, + {74, 958, 0, L"Нови-Сад"}, + {74, 959, 0, L"Сараево"}, + {74, 2506, 0, L"Другое"}, + {65, 961, 0, L"Братислава"}, + {65, 962, 0, L"Кошице"}, + {65, 3101, 0, L"Липтов"}, + {65, 963, 0, L"Попрад"}, + {65, 964, 0, L"Прешов"}, + {65, 965, 0, L"Ружемберок"}, + {65, 966, 0, L"Тврдошин"}, + {65, 2505, 0, L"Другое"}, + {66, 968, 0, L"Копар"}, + {66, 967, 0, L"Любляна"}, + {66, 969, 0, L"Марибор"}, + {66, 2504, 0, L"Другое"}, + {67, 970, 0, L"Торсхавн"}, + {67, 2503, 0, L"Другое"}, + {68, 2888, 0, L"Вантаа"}, + {68, 971, 0, L"Васа"}, + {68, 979, 0, L"Котка"}, + {68, 972, 0, L"Коувола"}, + {68, 980, 0, L"Лахти"}, + {68, 973, 0, L"Оулу"}, + {68, 3375, 0, L"Риихимяки"}, + {68, 3159, 0, L"Руовеси"}, + {68, 974, 0, L"Тампере"}, + {68, 975, 0, L"Турку"}, + {68, 976, 0, L"Хельсинки"}, + {68, 977, 0, L"Эспо"}, + {68, 978, 0, L"Ювяскюля"}, + {68, 2502, 0, L"Другое"}, + {37, 996, 0, L"Авиньон"}, + {37, 983, 0, L"Бержерак"}, + {37, 997, 0, L"Блуа"}, + {37, 984, 0, L"Бордо"}, + {37, 998, 0, L"Дижон"}, + {37, 987, 0, L"Канн"}, + {37, 988, 0, L"Кастр"}, + {37, 993, 0, L"Клермон-Ферран"}, + {37, 3037, 0, L"Лилль"}, + {37, 989, 0, L"Лион"}, + {37, 985, 0, L"Марсель"}, + {37, 991, 0, L"Мец"}, + {37, 3161, 0, L"Мобеж"}, + {37, 990, 0, L"Нанси"}, + {37, 994, 0, L"Нант"}, + {37, 995, 0, L"Ницца"}, + {37, 999, 0, L"Орлеан"}, + {37, 981, 0, L"Париж"}, + {37, 3374, 0, L"Перпиньян"}, + {37, 992, 0, L"Руан"}, + {37, 982, 0, L"Страсбург"}, + {37, 986, 0, L"Тулуза"}, + {37, 3314, 0, L"Шамбери"}, + {37, 2501, 0, L"Другое"}, + {69, 1003, 0, L"Дубровник"}, + {69, 1000, 0, L"Загреб"}, + {69, 1001, 0, L"Задар"}, + {69, 1004, 0, L"Риека"}, + {69, 1002, 0, L"Сплит"}, + {69, 2500, 0, L"Другое"}, + {70, 1005, 0, L"Брно"}, + {70, 3291, 0, L"Гавличкув-Брод"}, + {70, 1007, 0, L"Градец-Кралове"}, + {70, 1008, 0, L"Карлови-Вари"}, + {70, 3019, 0, L"Кладрубы"}, + {70, 1010, 0, L"Лоуни"}, + {70, 1009, 0, L"Острава"}, + {70, 1015, 0, L"Пльзень"}, + {70, 3105, 0, L"Правчицка Брана"}, + {70, 1006, 0, L"Прага"}, + {70, 3246, 0, L"Тачов"}, + {70, 1011, 0, L"Тршебич"}, + {70, 1012, 0, L"Усти-над-Лабем"}, + {70, 1014, 0, L"Ческе-Будеевице"}, + {70, 1013, 0, L"Яблонец-над-Нисоу"}, + {70, 2499, 0, L"Другое"}, + {71, 1016, 0, L"Арау"}, + {71, 1019, 0, L"Баден"}, + {71, 1017, 0, L"Базель"}, + {71, 1018, 0, L"Берн"}, + {71, 1020, 0, L"Биль"}, + {71, 1021, 0, L"Винтертур"}, + {71, 1022, 0, L"Давос"}, + {71, 3189, 0, L"Делемонт"}, + {71, 1023, 0, L"Женева"}, + {71, 1024, 0, L"Золотурн"}, + {71, 1025, 0, L"Лозанна"}, + {71, 1026, 0, L"Локарно"}, + {71, 1027, 0, L"Лугано"}, + {71, 1028, 0, L"Люцерн"}, + {71, 1029, 0, L"Монтре"}, + {71, 1030, 0, L"Цюрих"}, + {71, 2498, 0, L"Другое"}, + {72, 2883, 0, L"Арбога"}, + {72, 1031, 0, L"Гетеборг"}, + {72, 1032, 0, L"Кальмар"}, + {72, 1037, 0, L"Лахольм"}, + {72, 1036, 0, L"Лулео"}, + {72, 1042, 0, L"Лунд"}, + {72, 1033, 0, L"Мальме"}, + {72, 1034, 0, L"Стокгольм"}, + {72, 1041, 0, L"Умео"}, + {72, 1039, 0, L"Фалун"}, + {72, 1043, 0, L"Хельсинборг"}, + {72, 1040, 0, L"Хернесанд"}, + {72, 1038, 0, L"Эстерсунд"}, + {72, 2497, 0, L"Другое"}, + {73, 3013, 0, L"Валга"}, + {73, 1044, 0, L"Кейла"}, + {73, 1045, 0, L"Кохтла-Ярве"}, + {73, 1046, 0, L"Маарду"}, + {73, 1047, 0, L"Мыйзакюла"}, + {73, 1048, 0, L"Нарва"}, + {73, 1049, 0, L"Пярну"}, + {73, 1050, 0, L"Раквере"}, + {73, 1051, 0, L"Силламяэ"}, + {73, 1052, 0, L"Таллин"}, + {73, 1053, 0, L"Тарту"}, + {73, 1054, 0, L"Хаапсалу"}, + {24, 233, 474, L"Алдан"}, + {24, 233, 2809, L"Верхоянск"}, + {24, 233, 2804, L"Вилюйск"}, + {24, 233, 475, L"Ленск"}, + {24, 233, 477, L"Мирный"}, + {24, 233, 476, L"Нерюнгри"}, + {24, 233, 2806, L"Олекминск"}, + {24, 233, 3115, L"Покровск"}, + {24, 233, 2808, L"Среднеколымск"}, + {24, 233, 2807, L"Томмот"}, + {24, 233, 2805, L"Удачный"}, + {24, 233, 478, L"Усть-Нера"}, + {24, 233, 479, L"Якутск"}, + {24, 233, 2263, L"Другое"}, + {24, 232, 2819, L"Арсеньев"}, + {24, 232, 464, L"Артем"}, + {24, 232, 465, L"Большой Камень"}, + {24, 232, 466, L"Владивосток"}, + {24, 232, 2817, L"Дальнегорск"}, + {24, 232, 2818, L"Дальнереченск"}, + {24, 232, 3359, L"Кавалерово"}, + {24, 232, 467, L"Камень-Рыболов"}, + {24, 232, 468, L"Лесозаводск"}, + {24, 232, 469, L"Лучегорск"}, + {24, 232, 470, L"Находка"}, + {24, 232, 471, L"Партизанск"}, + {24, 232, 472, L"Пластун"}, + {24, 232, 2816, L"Спасск-Дальний"}, + {24, 232, 473, L"Уссурийск"}, + {24, 232, 2258, L"Другое"}, + {24, 235, 487, L"Амурск"}, + {24, 235, 2821, L"Бикин"}, + {24, 235, 488, L"Ванино"}, + {24, 235, 2820, L"Вяземский"}, + {24, 235, 489, L"Комсомольск-на-Амуре"}, + {24, 235, 490, L"Николаевск-на-Амуре"}, + {24, 235, 491, L"Советская Гавань"}, + {24, 235, 3353, L"Солнечный"}, + {24, 235, 492, L"Хабаровск"}, + {24, 235, 2280, L"Другое"}, + {24, 227, 455, L"Белогорск"}, + {24, 227, 456, L"Благовещенск"}, + {24, 227, 2814, L"Завитинск"}, + {24, 227, 2813, L"Зея"}, + {24, 227, 2815, L"Райчихинск"}, + {24, 227, 2812, L"Свободный"}, + {24, 227, 2811, L"Сковородино"}, + {24, 227, 457, L"Тында"}, + {24, 227, 2217, L"Шимановск"}, + {24, 227, 2218, L"Другое"}, + {24, 229, 460, L"Елизово"}, + {24, 229, 2822, L"Ключи"}, + {24, 229, 459, L"Петропавловск-Камч."}, + {24, 229, 2234, L"Другое"}, + {24, 231, 462, L"Магадан"}, + {24, 231, 2823, L"Сусуман"}, + {24, 231, 463, L"Ягодное"}, + {24, 231, 2246, L"Другое"}, + {24, 234, 480, L"Александровск-Сахалинский"}, + {24, 234, 2829, L"Анива"}, + {24, 234, 2833, L"Горнозаводск"}, + {24, 234, 2825, L"Долинск"}, + {24, 234, 481, L"Корсаков"}, + {24, 234, 482, L"Красногорск"}, + {24, 234, 2826, L"Курильск"}, + {24, 234, 2832, L"Лесогорск"}, + {24, 234, 2836, L"Макаров"}, + {24, 234, 2830, L"Невельск"}, + {24, 234, 483, L"Оха"}, + {24, 234, 2828, L"Поронайск"}, + {24, 234, 2824, L"Северо-Курильск"}, + {24, 234, 2827, L"Томари"}, + {24, 234, 2831, L"Углегорск"}, + {24, 234, 484, L"Холмск"}, + {24, 234, 2834, L"Чехов"}, + {24, 234, 2835, L"Шахтерск"}, + {24, 234, 485, L"Южно-Курильск"}, + {24, 234, 486, L"Южно-Сахалинск"}, + {24, 234, 2264, L"Другое"}, + {24, 228, 458, L"Биробиджан"}, + {24, 228, 2810, L"Облучье"}, + {24, 228, 2226, L"Другое"}, + {24, 230, 461, L"Полана"}, + {24, 230, 2239, L"Другое"}, + {24, 236, 493, L"Анадырь"}, + {24, 236, 2287, L"Другое"}, + {24, 237, 2850, L"Агидель"}, + {24, 237, 2851, L"Агидель"}, + {24, 237, 2657, L"Баймак"}, + {24, 237, 2662, L"Белебей"}, + {24, 237, 494, L"Белорецк"}, + {24, 237, 2658, L"Бирск"}, + {24, 237, 2660, L"Благовещенск"}, + {24, 237, 2659, L"Давлеканово"}, + {24, 237, 2663, L"Дюртюли"}, + {24, 237, 495, L"Ишимбай"}, + {24, 237, 496, L"Кумертау"}, + {24, 237, 2655, L"Мелеуз"}, + {24, 237, 497, L"Нефтекамск"}, + {24, 237, 2654, L"Октябрьский"}, + {24, 237, 499, L"Салават"}, + {24, 237, 2656, L"Сибай"}, + {24, 237, 498, L"Стерлитамак"}, + {24, 237, 500, L"Туймазы"}, + {24, 237, 2661, L"Туймазы"}, + {24, 237, 501, L"Уфа"}, + {24, 237, 502, L"Учалы"}, + {24, 237, 2664, L"Янаул"}, + {24, 237, 2220, L"Другое"}, + {24, 240, 509, L"Волжск"}, + {24, 240, 510, L"Звенигово"}, + {24, 240, 511, L"Йошкар-Ола"}, + {24, 240, 512, L"Козьмодемьянск"}, + {24, 240, 2247, L"Другое"}, + {24, 241, 513, L"Зубова Поляна"}, + {24, 241, 2147, L"Инсар"}, + {24, 241, 2150, L"Ковылкино"}, + {24, 241, 2148, L"Краснослободск"}, + {24, 241, 2910, L"Лямбирь"}, + {24, 241, 515, L"Рузаевка"}, + {24, 241, 514, L"Саранск"}, + {24, 241, 2149, L"Темников"}, + {24, 241, 2923, L"Чамзинка"}, + {24, 241, 2248, L"Другое"}, + {24, 248, 2569, L"Агрыз"}, + {24, 248, 2575, L"Азнакаево"}, + {24, 248, 569, L"Альметьевск"}, + {24, 248, 570, L"Апастово"}, + {24, 248, 2571, L"Болгар"}, + {24, 248, 571, L"Бугульма"}, + {24, 248, 2570, L"Буинск"}, + {24, 248, 572, L"Джалиль"}, + {24, 248, 573, L"Елабуга"}, + {24, 248, 2576, L"Заинск"}, + {24, 248, 574, L"Зеленодольск"}, + {24, 248, 575, L"Казань"}, + {24, 248, 2577, L"Лениногорск"}, + {24, 248, 2572, L"Мамадыш"}, + {24, 248, 576, L"Менделеевск"}, + {24, 248, 2573, L"Мензелинск"}, + {24, 248, 577, L"Набережные Челны"}, + {24, 248, 578, L"Нижнекамск"}, + {24, 248, 579, L"Нурлат"}, + {24, 248, 2574, L"Тетюши"}, + {24, 248, 580, L"Чистополь"}, + {24, 248, 2271, L"Другое"}, + {24, 249, 3311, L"Вавож"}, + {24, 249, 581, L"Воткинск"}, + {24, 249, 582, L"Глазов"}, + {24, 249, 583, L"Игра"}, + {24, 249, 584, L"Ижевск"}, + {24, 249, 2665, L"Камбарка"}, + {24, 249, 585, L"Можга"}, + {24, 249, 586, L"Сарапул"}, + {24, 249, 587, L"Ува"}, + {24, 249, 2277, L"Другое"}, + {24, 251, 2158, L"Алатырь"}, + {24, 251, 2156, L"Канаш"}, + {24, 251, 2151, L"Козловка"}, + {24, 251, 2152, L"Марьинский Посад"}, + {24, 251, 2155, L"Новочебоксарск"}, + {24, 251, 2153, L"Цивильск"}, + {24, 251, 592, L"Чебоксары"}, + {24, 251, 2157, L"Шумерля"}, + {24, 251, 2154, L"Ядрин"}, + {24, 251, 2286, L"Другое"}, + {24, 238, 2168, L"Белая Холуница"}, + {24, 238, 503, L"Вятские Поляны"}, + {24, 238, 2164, L"Зуевка"}, + {24, 238, 504, L"Киров"}, + {24, 238, 505, L"Кирово-Чепецк"}, + {24, 238, 2160, L"Кирс"}, + {24, 238, 506, L"Котельнич"}, + {24, 238, 2167, L"Луза"}, + {24, 238, 2159, L"Малмыж"}, + {24, 238, 2169, L"Мураши"}, + {24, 238, 2163, L"Нолинск"}, + {24, 238, 2170, L"Омутнинск"}, + {24, 238, 2166, L"Слободской"}, + {24, 238, 2165, L"Советск"}, + {24, 238, 2162, L"Сосновка"}, + {24, 238, 2171, L"Уржум"}, + {24, 238, 2161, L"Халтурин"}, + {24, 238, 507, L"Яранск"}, + {24, 238, 2237, L"Другое"}, + {24, 242, 516, L"Арзамас"}, + {24, 242, 517, L"Балахна"}, + {24, 242, 2139, L"Богородск"}, + {24, 242, 518, L"Бор"}, + {24, 242, 519, L"Вахтан"}, + {24, 242, 520, L"Ветлуга"}, + {24, 242, 2140, L"Володарск"}, + {24, 242, 2138, L"Ворсма"}, + {24, 242, 521, L"Выкса"}, + {24, 242, 2137, L"Горбатов"}, + {24, 242, 522, L"Городец"}, + {24, 242, 523, L"Дзержинск"}, + {24, 242, 524, L"Заволжье"}, + {24, 242, 2891, L"Ильиногорск"}, + {24, 242, 525, L"Кстово"}, + {24, 242, 2145, L"Кулебаки"}, + {24, 242, 2143, L"Лукоянов"}, + {24, 242, 2144, L"Лысково"}, + {24, 242, 2146, L"Навашино"}, + {24, 242, 526, L"Нижний Новгород"}, + {24, 242, 527, L"Павлово"}, + {24, 242, 2135, L"Первомайск"}, + {24, 242, 528, L"Саров"}, + {24, 242, 529, L"Семенов"}, + {24, 242, 530, L"Сергач"}, + {24, 242, 2141, L"Урень"}, + {24, 242, 2136, L"Чкаловск"}, + {24, 242, 2897, L"Шатки"}, + {24, 242, 2142, L"Шахунья"}, + {24, 242, 2251, L"Другое"}, + {24, 243, 2678, L"Абдулино"}, + {24, 243, 2673, L"Бугуруслан"}, + {24, 243, 531, L"Бузулук"}, + {24, 243, 532, L"Гай"}, + {24, 243, 2674, L"Кувандык"}, + {24, 243, 2675, L"Медногорск"}, + {24, 243, 533, L"Новотроицк"}, + {24, 243, 535, L"Оренбург"}, + {24, 243, 536, L"Орск"}, + {24, 243, 3360, L"Саракташ"}, + {24, 243, 2677, L"Соль-Илецк"}, + {24, 243, 2676, L"Сорочинск"}, + {24, 243, 537, L"Тоцкое"}, + {24, 243, 538, L"Ясный"}, + {24, 243, 2254, L"Другое"}, + {24, 244, 539, L"Беднодемьяновск"}, + {24, 244, 2597, L"Белинский"}, + {24, 244, 2595, L"Городище"}, + {24, 244, 2593, L"Каменка"}, + {24, 244, 540, L"Кузнецк"}, + {24, 244, 2598, L"Нижний Ломов"}, + {24, 244, 2592, L"Никольск"}, + {24, 244, 541, L"Пенза"}, + {24, 244, 3304, L"Русский Камешкир"}, + {24, 244, 2596, L"Сердобск"}, + {24, 244, 2594, L"Сурск"}, + {24, 244, 2256, L"Другое"}, + {24, 245, 2690, L"Александровск"}, + {24, 245, 542, L"Березники"}, + {24, 245, 2679, L"Верещагино"}, + {24, 245, 2680, L"Горнозаводск"}, + {24, 245, 2687, L"Гремячинск"}, + {24, 245, 2686, L"Губаха"}, + {24, 245, 543, L"Добрянка"}, + {24, 245, 544, L"Кизел"}, + {24, 245, 2681, L"Красновишерск"}, + {24, 245, 545, L"Краснокамск"}, + {24, 245, 546, L"Кунгур"}, + {24, 245, 547, L"Лысьва"}, + {24, 245, 548, L"Нытва"}, + {24, 245, 2683, L"Оса"}, + {24, 245, 2684, L"Оханск"}, + {24, 245, 2682, L"Очер"}, + {24, 245, 549, L"Пермь"}, + {24, 245, 550, L"Соликамск"}, + {24, 245, 2685, L"Усолье"}, + {24, 245, 551, L"Чайковский"}, + {24, 245, 2689, L"Чердынь"}, + {24, 245, 2688, L"Чермоз"}, + {24, 245, 552, L"Чернушка"}, + {24, 245, 553, L"Чусовой"}, + {24, 245, 2257, L"Другое"}, + {24, 246, 554, L"Волжский"}, + {24, 246, 555, L"Жигулевск"}, + {24, 246, 2599, L"Кинель"}, + {24, 246, 3293, L"Красный Яр"}, + {24, 246, 2602, L"Нефтегорск"}, + {24, 246, 556, L"Новокуйбышевск"}, + {24, 246, 2600, L"Октябрьск"}, + {24, 246, 557, L"Отрадный"}, + {24, 246, 558, L"Похвистнево"}, + {24, 246, 559, L"Самара"}, + {24, 246, 560, L"Сызрань"}, + {24, 246, 561, L"Тольятти"}, + {24, 246, 2601, L"Чапаевск"}, + {24, 246, 562, L"Шигоны"}, + {24, 246, 2261, L"Другое"}, + {24, 247, 2613, L"Аркадак"}, + {24, 247, 2606, L"Аткарск"}, + {24, 247, 563, L"Балаково"}, + {24, 247, 564, L"Балашов"}, + {24, 247, 565, L"Вольск"}, + {24, 247, 2608, L"Ершов"}, + {24, 247, 2607, L"Калининск"}, + {24, 247, 2609, L"Красноармейск"}, + {24, 247, 2610, L"Красный Кут"}, + {24, 247, 2605, L"Маркс"}, + {24, 247, 566, L"Новоузенск"}, + {24, 247, 2603, L"Петровск"}, + {24, 247, 2604, L"Пугачев"}, + {24, 247, 2612, L"Ртищево"}, + {24, 247, 567, L"Саратов"}, + {24, 247, 2611, L"Хвалынск"}, + {24, 247, 568, L"Энгельс"}, + {24, 247, 3267, L"Энгельс-12"}, + {24, 247, 2262, L"Другое"}, + {24, 250, 2614, L"Барыш"}, + {24, 250, 588, L"Димитровград"}, + {24, 250, 2615, L"Инза"}, + {24, 250, 589, L"Новоспасское"}, + {24, 250, 2616, L"Новоульяновск"}, + {24, 250, 590, L"Сенгилей"}, + {24, 250, 591, L"Ульяновск"}, + {24, 250, 2278, L"Другое"}, + {24, 239, 508, L"Кудымкар"}, + {24, 239, 2238, L"Другое"}, + {24, 255, 1355, L"Беломорск"}, + {24, 255, 1356, L"Кемь"}, + {24, 255, 1357, L"Кондопога"}, + {24, 255, 1358, L"Костомукша"}, + {24, 255, 1359, L"Коткозеро"}, + {24, 255, 1360, L"Лахденпохья"}, + {24, 255, 1362, L"Лоухи"}, + {24, 255, 1361, L"Медвежьегорск"}, + {24, 255, 3286, L"Муезерский"}, + {24, 255, 1937, L"Олонец"}, + {24, 255, 1363, L"Петрозаводск"}, + {24, 255, 1938, L"Питкяранта"}, + {24, 255, 3287, L"Пряжа"}, + {24, 255, 1936, L"Пудож"}, + {24, 255, 1364, L"Сегежа"}, + {24, 255, 1365, L"Сортавала"}, + {24, 255, 1939, L"Суоярви"}, + {24, 255, 2201, L"Другое"}, + {24, 256, 1366, L"Воркута"}, + {24, 256, 1367, L"Вуктыл"}, + {24, 256, 2202, L"Емва"}, + {24, 256, 1368, L"Инта"}, + {24, 256, 1940, L"Микунь"}, + {24, 256, 1369, L"Печора"}, + {24, 256, 1941, L"Сосногорск"}, + {24, 256, 1370, L"Сыктывкар"}, + {24, 256, 1371, L"Усинск"}, + {24, 256, 1372, L"Ухта"}, + {24, 256, 2203, L"Другое"}, + {24, 252, 593, L"Архангельск"}, + {24, 252, 594, L"Вельск"}, + {24, 252, 1945, L"Каргополь"}, + {24, 252, 595, L"Коряжма"}, + {24, 252, 596, L"Котлас"}, + {24, 252, 1944, L"Мезень"}, + {24, 252, 597, L"Мирный"}, + {24, 252, 598, L"Новодвинск"}, + {24, 252, 1946, L"Няндома"}, + {24, 252, 599, L"Онега"}, + {24, 252, 600, L"Пинега"}, + {24, 252, 601, L"Северодвинск"}, + {24, 252, 1942, L"Сольвычегодск"}, + {24, 252, 3239, L"Холмогоры"}, + {24, 252, 1943, L"Шенкурск"}, + {24, 252, 2204, L"Другое"}, + {24, 253, 1950, L"Бабаево"}, + {24, 253, 1949, L"Белозерск"}, + {24, 253, 1338, L"Великий Устюг"}, + {24, 253, 1339, L"Вологда"}, + {24, 253, 1951, L"Вытегра"}, + {24, 253, 1340, L"Грязовец"}, + {24, 253, 1952, L"Кадников"}, + {24, 253, 2871, L"Кадуй"}, + {24, 253, 1341, L"Кириллов"}, + {24, 253, 1955, L"Красавино"}, + {24, 253, 1342, L"Михайловка"}, + {24, 253, 1947, L"Никольск"}, + {24, 253, 1343, L"Сокол"}, + {24, 253, 1953, L"Тотьма"}, + {24, 253, 1954, L"Устюжна"}, + {24, 253, 1948, L"Харовск"}, + {24, 253, 1344, L"Череповец"}, + {24, 253, 2205, L"Другое"}, + {24, 254, 2838, L"Багратионовск"}, + {24, 254, 1345, L"Балтийск"}, + {24, 254, 2846, L"Гвардейск"}, + {24, 254, 2843, L"Гурьевск"}, + {24, 254, 1346, L"Гусев"}, + {24, 254, 1347, L"Зеленоградск"}, + {24, 254, 1348, L"Калининград"}, + {24, 254, 2842, L"Краснознаменск"}, + {24, 254, 2845, L"Ладушкин"}, + {24, 254, 2848, L"Мамоново"}, + {24, 254, 2837, L"Неман"}, + {24, 254, 2844, L"Нестеров"}, + {24, 254, 1349, L"Озерск"}, + {24, 254, 2841, L"Полесск"}, + {24, 254, 2839, L"Правдинск"}, + {24, 254, 1350, L"Приморск"}, + {24, 254, 1351, L"Светлогорск"}, + {24, 254, 1352, L"Светлый"}, + {24, 254, 2840, L"Славск"}, + {24, 254, 1353, L"Советск"}, + {24, 254, 1354, L"Черняховск"}, + {24, 254, 2231, L"Другое"}, + {24, 257, 1985, L"Бокситогорск"}, + {24, 257, 1374, L"Волхов"}, + {24, 257, 1373, L"Всеволожск"}, + {24, 257, 1375, L"Выборг"}, + {24, 257, 1995, L"Высоцк"}, + {24, 257, 1376, L"Гатчина"}, + {24, 257, 1378, L"Ивангород"}, + {24, 257, 1993, L"Каменногорск"}, + {24, 257, 1379, L"Кингисепп"}, + {24, 257, 1380, L"Кириши"}, + {24, 257, 1381, L"Кировск"}, + {24, 257, 1384, L"Кузьмоловский"}, + {24, 257, 1984, L"Лодейное Поле"}, + {24, 257, 1990, L"Луга"}, + {24, 257, 1994, L"Любань"}, + {24, 257, 1386, L"Никольское"}, + {24, 257, 1987, L"Новая Ладога"}, + {24, 257, 1996, L"Отрадное"}, + {24, 257, 1986, L"Пикалево"}, + {24, 257, 1983, L"Подпорожье"}, + {24, 257, 1992, L"Приморск"}, + {24, 257, 1988, L"Приозерск"}, + {24, 257, 3071, L"Пушкин"}, + {24, 257, 1989, L"Светогорск"}, + {24, 257, 1389, L"Сертолово"}, + {24, 257, 1991, L"Сланцы"}, + {24, 257, 1391, L"Сосновый Бор"}, + {24, 257, 1392, L"Тихвин"}, + {24, 257, 1393, L"Тосно"}, + {24, 257, 1394, L"Шлиссельбург"}, + {24, 257, 2207, L"Другое"}, + {24, 258, 1395, L"Апатиты"}, + {24, 258, 1959, L"Заполярный"}, + {24, 258, 1396, L"Зареченск"}, + {24, 258, 1397, L"Кандалакша"}, + {24, 258, 1398, L"Кировск"}, + {24, 258, 1399, L"Ковдор"}, + {24, 258, 1958, L"Кола"}, + {24, 258, 1400, L"Мончегорск"}, + {24, 258, 1401, L"Мурманск"}, + {24, 258, 1402, L"Мурмаши"}, + {24, 258, 1403, L"Оленегорск"}, + {24, 258, 1404, L"Полярные Зори"}, + {24, 258, 1956, L"Полярный"}, + {24, 258, 1957, L"Североморск"}, + {24, 258, 3288, L"Снежногорск"}, + {24, 258, 2206, L"Другое"}, + {24, 260, 1406, L"Батецкий"}, + {24, 260, 2001, L"Боровичи"}, + {24, 260, 2003, L"Валдай"}, + {24, 260, 1407, L"Великий Новгород"}, + {24, 260, 1408, L"Крестцы"}, + {24, 260, 2002, L"Малая Вишера"}, + {24, 260, 1409, L"Окуловка"}, + {24, 260, 2000, L"Пестово"}, + {24, 260, 1997, L"Сольцы"}, + {24, 260, 1410, L"Старая Русса"}, + {24, 260, 1998, L"Холм"}, + {24, 260, 1999, L"Чудово"}, + {24, 260, 2208, L"Другое"}, + {24, 261, 1412, L"Великие Луки"}, + {24, 261, 2004, L"Гдов"}, + {24, 261, 2009, L"Дно"}, + {24, 261, 2005, L"Невель"}, + {24, 261, 1413, L"Новоржев"}, + {24, 261, 2006, L"Опочка"}, + {24, 261, 2008, L"Остров"}, + {24, 261, 1414, L"Печоры"}, + {24, 261, 1415, L"Порхов"}, + {24, 261, 1411, L"Псков"}, + {24, 261, 1416, L"Пустошка"}, + {24, 261, 2007, L"Пыталово"}, + {24, 261, 1417, L"Себеж"}, + {24, 261, 2209, L"Другое"}, + {24, 259, 1405, L"Нарьян-Мар"}, + {24, 259, 2250, L"Другое"}, + {24, 265, 2764, L"Бабушкин"}, + {24, 265, 2760, L"Гусиноозерск"}, + {24, 265, 2762, L"Закаменск"}, + {24, 265, 2763, L"Кяхта"}, + {24, 265, 2761, L"Северобайкальск"}, + {24, 265, 1446, L"Улан-Удэ"}, + {24, 265, 2222, L"Другое"}, + {24, 263, 1439, L"Горно-Алтайск"}, + {24, 263, 2215, L"Другое"}, + {24, 273, 2766, L"Ак-Довурак"}, + {24, 273, 1494, L"Кызыл"}, + {24, 273, 2768, L"Новый Шагонар"}, + {24, 273, 2767, L"Туран"}, + {24, 273, 2765, L"Чадан"}, + {24, 273, 2275, L"Другое"}, + {24, 275, 2769, L"Абаза"}, + {24, 275, 1496, L"Абакан"}, + {24, 275, 1497, L"Саяногорск"}, + {24, 275, 2770, L"Сорск"}, + {24, 275, 2771, L"Черногорск"}, + {24, 275, 2281, L"Другое"}, + {24, 264, 1440, L"Алейск"}, + {24, 264, 1441, L"Барнаул"}, + {24, 264, 1442, L"Белокуриха"}, + {24, 264, 1443, L"Бийск"}, + {24, 264, 2728, L"Горняк"}, + {24, 264, 2731, L"Заринск"}, + {24, 264, 2729, L"Змеиногорск"}, + {24, 264, 2732, L"Камень-на-Оби"}, + {24, 264, 3292, L"Кулунда"}, + {24, 264, 2730, L"Новоалтайск"}, + {24, 264, 1444, L"Рубцовск"}, + {24, 264, 1445, L"Славгород"}, + {24, 264, 3231, L"Яровое"}, + {24, 264, 2216, L"Другое"}, + {24, 268, 2781, L"Артемовск"}, + {24, 268, 1469, L"Ачинск"}, + {24, 268, 2784, L"Боготол"}, + {24, 268, 2773, L"Бородино"}, + {24, 268, 2774, L"Дивногорск"}, + {24, 268, 3122, L"Емельяновск"}, + {24, 268, 2772, L"Енисейск"}, + {24, 268, 3294, L"Железногорск"}, + {24, 268, 2777, L"Заозерный"}, + {24, 268, 1470, L"Игарка"}, + {24, 268, 2778, L"Иланский"}, + {24, 268, 2782, L"Канск"}, + {24, 268, 2783, L"Кодинский"}, + {24, 268, 1471, L"Красноярск"}, + {24, 268, 1472, L"Лесосибирск"}, + {24, 268, 1473, L"Минусинск"}, + {24, 268, 2775, L"Назарово"}, + {24, 268, 2776, L"Сосновоборск"}, + {24, 268, 2780, L"Ужур"}, + {24, 268, 2779, L"Уяр"}, + {24, 268, 2785, L"Шарыпово"}, + {24, 268, 1474, L"Шушенское"}, + {24, 268, 2242, L"Другое"}, + {24, 266, 2792, L"Алзамай"}, + {24, 266, 1447, L"Ангарск"}, + {24, 266, 1448, L"Байкальск"}, + {24, 266, 2791, L"Бирюсинск"}, + {24, 266, 1450, L"Бодайбо"}, + {24, 266, 1451, L"Братск"}, + {24, 266, 2793, L"Вихоревка"}, + {24, 266, 2789, L"Железногорск-Илимский"}, + {24, 266, 2786, L"Зима"}, + {24, 266, 1452, L"Иркутск"}, + {24, 266, 2794, L"Киренск"}, + {24, 266, 2787, L"Нижнеудинск"}, + {24, 266, 1449, L"Саянск"}, + {24, 266, 2790, L"Свирск"}, + {24, 266, 1453, L"Слюдянка"}, + {24, 266, 2788, L"Тайшет"}, + {24, 266, 1454, L"Тулун"}, + {24, 266, 1455, L"Усолье-Сибирское"}, + {24, 266, 2908, L"Усольск"}, + {24, 266, 1456, L"Усть-Илимск"}, + {24, 266, 1457, L"Усть-Кут"}, + {24, 266, 1458, L"Хужир"}, + {24, 266, 1459, L"Черемхово"}, + {24, 266, 2795, L"Шелехов"}, + {24, 266, 2229, L"Другое"}, + {24, 267, 2737, L"Анжеро-Суджинск"}, + {24, 267, 2740, L"Белово"}, + {24, 267, 2746, L"Березовский"}, + {24, 267, 2739, L"Гурьевск"}, + {24, 267, 2742, L"Калтан"}, + {24, 267, 1460, L"Кемерово"}, + {24, 267, 1461, L"Киселевск"}, + {24, 267, 2738, L"Ленинск-Кузнецкий"}, + {24, 267, 2745, L"Мариинск"}, + {24, 267, 1462, L"Междуреченск"}, + {24, 267, 1463, L"Мыски"}, + {24, 267, 1464, L"Новокузнецк"}, + {24, 267, 2744, L"Осинники"}, + {24, 267, 3358, L"Полысаево"}, + {24, 267, 1465, L"Прокопьевск"}, + {24, 267, 1466, L"Салаир"}, + {24, 267, 2743, L"Тайга"}, + {24, 267, 2741, L"Таштагол"}, + {24, 267, 1467, L"Топки"}, + {24, 267, 1468, L"Юрга"}, + {24, 267, 2236, L"Другое"}, + {24, 269, 1475, L"Баган"}, + {24, 269, 1476, L"Барабинск"}, + {24, 269, 1477, L"Бердск"}, + {24, 269, 2750, L"Болотное"}, + {24, 269, 1478, L"Искитим"}, + {24, 269, 2752, L"Карасук"}, + {24, 269, 2751, L"Каргат"}, + {24, 269, 3107, L"Краснообск"}, + {24, 269, 2753, L"Куйбышев"}, + {24, 269, 2755, L"Купино"}, + {24, 269, 1479, L"Новосибирск"}, + {24, 269, 2759, L"Обь"}, + {24, 269, 2756, L"Татарск"}, + {24, 269, 2758, L"Тогучин"}, + {24, 269, 2757, L"Черепаново"}, + {24, 269, 2754, L"Чулым"}, + {24, 269, 2252, L"Другое"}, + {24, 270, 2733, L"Исилькуль"}, + {24, 270, 1480, L"Калачинск"}, + {24, 270, 1481, L"Марьяновка"}, + {24, 270, 2735, L"Называевск"}, + {24, 270, 1482, L"Омск"}, + {24, 270, 2734, L"Тара"}, + {24, 270, 2736, L"Тюкалинск"}, + {24, 270, 2253, L"Другое"}, + {24, 272, 1488, L"Асино"}, + {24, 272, 1489, L"Белый Яр"}, + {24, 272, 3295, L"Каргасок"}, + {24, 272, 1491, L"Колпашево"}, + {24, 272, 1492, L"Северск"}, + {24, 272, 1493, L"Стрежевой"}, + {24, 272, 1490, L"Томск"}, + {24, 272, 2273, L"Другое"}, + {24, 276, 2803, L"Балей"}, + {24, 276, 2799, L"Борзя"}, + {24, 276, 1499, L"Краснокаменск"}, + {24, 276, 2801, L"Могоча"}, + {24, 276, 2800, L"Нерчинск"}, + {24, 276, 2802, L"Петровск-Забайкальский"}, + {24, 276, 2798, L"Сретенск"}, + {24, 276, 2796, L"Хилок"}, + {24, 276, 1498, L"Чита"}, + {24, 276, 2797, L"Шилка"}, + {24, 276, 2285, L"Другое"}, + {24, 262, 1438, L"Агинское"}, + {24, 262, 2213, L"Другое"}, + {24, 271, 3233, L"Диксон"}, + {24, 271, 1485, L"Дудинка"}, + {24, 271, 1487, L"Кайеркан"}, + {24, 271, 1483, L"Норильск"}, + {24, 271, 1484, L"Талнах"}, + {24, 271, 1486, L"Хатанга"}, + {24, 271, 2269, L"Другое"}, + {24, 274, 1495, L"Усть-Ордынский"}, + {24, 274, 2279, L"Другое"}, + {24, 277, 1500, L"Тура"}, + {24, 277, 2288, L"Другое"}, + {24, 278, 2668, L"Далматово"}, + {24, 278, 2667, L"Катайск"}, + {24, 278, 1524, L"Курган"}, + {24, 278, 2669, L"Куртамыш"}, + {24, 278, 2666, L"Макушино"}, + {24, 278, 2671, L"Петухово"}, + {24, 278, 1525, L"Шадринск"}, + {24, 278, 2670, L"Шумиха"}, + {24, 278, 2672, L"Щучье"}, + {24, 278, 2243, L"Другое"}, + {24, 279, 1526, L"Алапаевск"}, + {24, 279, 1527, L"Арамиль"}, + {24, 279, 2691, L"Артемовский"}, + {24, 279, 1528, L"Асбест"}, + {24, 279, 2924, L"Белоярский"}, + {24, 279, 2707, L"Березовский"}, + {24, 279, 1529, L"Богданович"}, + {24, 279, 2698, L"Верхний Тагил"}, + {24, 279, 1530, L"Верхняя Пышма"}, + {24, 279, 1531, L"Верхняя Салда"}, + {24, 279, 1532, L"Верхняя Синячиха"}, + {24, 279, 2696, L"Верхняя Тура"}, + {24, 279, 2692, L"Верхотурье"}, + {24, 279, 2706, L"Волчанск"}, + {24, 279, 2709, L"Дегтярск"}, + {24, 279, 1533, L"Екатеринбург"}, + {24, 279, 1534, L"Заречный"}, + {24, 279, 1535, L"Ивдель"}, + {24, 279, 1536, L"Ирбит"}, + {24, 279, 1537, L"Каменск-Уральский"}, + {24, 279, 1538, L"Камышлов"}, + {24, 279, 2708, L"Карпинск"}, + {24, 279, 1539, L"Качканар"}, + {24, 279, 2712, L"Кировград"}, + {24, 279, 1540, L"Краснотурьинск"}, + {24, 279, 2694, L"Красноуральск"}, + {24, 279, 2693, L"Красноуфимск"}, + {24, 279, 1541, L"Кушва"}, + {24, 279, 2711, L"Михайловск"}, + {24, 279, 2713, L"Михайловск"}, + {24, 279, 1542, L"Невьянск"}, + {24, 279, 2702, L"Нижние Серги"}, + {24, 279, 1543, L"Нижний Тагил"}, + {24, 279, 2695, L"Нижняя Салда"}, + {24, 279, 2697, L"Нижняя Тура"}, + {24, 279, 2699, L"Новая Ляля"}, + {24, 279, 2909, L"Новоуральск"}, + {24, 279, 1544, L"Первоуральск"}, + {24, 279, 1545, L"Полевской"}, + {24, 279, 1546, L"Ревда"}, + {24, 279, 1547, L"Реж"}, + {24, 279, 3296, L"Рефтинский"}, + {24, 279, 2700, L"Североуральск"}, + {24, 279, 1548, L"Серов"}, + {24, 279, 2710, L"Среднеуральск"}, + {24, 279, 2701, L"Сухой Лог"}, + {24, 279, 2703, L"Сысерть"}, + {24, 279, 1549, L"Тавда"}, + {24, 279, 2704, L"Талица"}, + {24, 279, 2705, L"Туринск"}, + {24, 279, 2265, L"Другое"}, + {24, 280, 1550, L"Заводоуковск"}, + {24, 280, 1551, L"Ишим"}, + {24, 280, 3326, L"Сургут"}, + {24, 280, 1552, L"Тобольск"}, + {24, 280, 1553, L"Тюмень"}, + {24, 280, 2748, L"Ялуторовск"}, + {24, 280, 2276, L"Другое"}, + {24, 282, 1564, L"Аша"}, + {24, 282, 2723, L"Бакал"}, + {24, 282, 2724, L"Верхнеуральск"}, + {24, 282, 2716, L"Верхний Уфалей"}, + {24, 282, 3297, L"Всеволожск"}, + {24, 282, 2725, L"Еманжелинск"}, + {24, 282, 1565, L"Златоуст"}, + {24, 282, 2722, L"Карабаш"}, + {24, 282, 1566, L"Карталы"}, + {24, 282, 2718, L"Касли"}, + {24, 282, 2720, L"Катав-Ивановск"}, + {24, 282, 1567, L"Копейск"}, + {24, 282, 2721, L"Коркино"}, + {24, 282, 2715, L"Куса"}, + {24, 282, 1568, L"Кыштым"}, + {24, 282, 1569, L"Магнитогорск"}, + {24, 282, 1570, L"Миасс"}, + {24, 282, 2726, L"Миньяр"}, + {24, 282, 2717, L"Нязепетровск"}, + {24, 282, 3100, L"Озерск"}, + {24, 282, 1571, L"Пласт"}, + {24, 282, 2719, L"Сатка"}, + {24, 282, 2727, L"Сим"}, + {24, 282, 1572, L"Снежинск"}, + {24, 282, 3332, L"Трехгорный"}, + {24, 282, 1573, L"Троицк"}, + {24, 282, 1574, L"Усть-Катав"}, + {24, 282, 1575, L"Чебаркуль"}, + {24, 282, 1576, L"Челябинск"}, + {24, 282, 1577, L"Южноуральск"}, + {24, 282, 2714, L"Юрюзань"}, + {24, 282, 2283, L"Другое"}, + {24, 281, 2749, L"Белоярский"}, + {24, 281, 1554, L"Игрим"}, + {24, 281, 1555, L"Когалым"}, + {24, 281, 1556, L"Лангепас"}, + {24, 281, 1561, L"Мегион"}, + {24, 281, 1562, L"Нефтеюганск"}, + {24, 281, 1559, L"Нижневартовск"}, + {24, 281, 2852, L"Нягань"}, + {24, 281, 2853, L"Нягань"}, + {24, 281, 2854, L"Пыть-Ях"}, + {24, 281, 1560, L"Радужный"}, + {24, 281, 1563, L"Советский"}, + {24, 281, 2747, L"Сургут"}, + {24, 281, 1557, L"Урай"}, + {24, 281, 1558, L"Ханты-Мансийск"}, + {24, 281, 3344, L"Югорск"}, + {24, 281, 2282, L"Другое"}, + {24, 283, 3298, L"Губкинский"}, + {24, 283, 1578, L"Лабытнанги"}, + {24, 283, 2856, L"Муравленко"}, + {24, 283, 1579, L"Надым"}, + {24, 283, 1580, L"Новый Уренгой"}, + {24, 283, 1581, L"Ноябрьск"}, + {24, 283, 1582, L"Салехард"}, + {24, 283, 1583, L"Уренгой"}, + {24, 283, 2289, L"Другое"}, + {24, 284, 1625, L"Алексеевка"}, + {24, 284, 1626, L"Белгород"}, + {24, 284, 2172, L"Валуйки"}, + {24, 284, 2173, L"Грайворон"}, + {24, 284, 1627, L"Губкин"}, + {24, 284, 2174, L"Короча"}, + {24, 284, 2175, L"Новый Оскол"}, + {24, 284, 1628, L"Старый Оскол"}, + {24, 284, 1629, L"Шебекино"}, + {24, 284, 2221, L"Другое"}, + {24, 285, 1630, L"Брянск"}, + {24, 285, 3283, L"Дебрянск"}, + {24, 285, 1631, L"Дятьково"}, + {24, 285, 2013, L"Жуковка"}, + {24, 285, 2015, L"Злынка"}, + {24, 285, 1632, L"Карачев"}, + {24, 285, 1633, L"Клинцы"}, + {24, 285, 1634, L"Мглин"}, + {24, 285, 2016, L"Новозыбков"}, + {24, 285, 2018, L"Почеп"}, + {24, 285, 2017, L"Севск"}, + {24, 285, 2020, L"Сельцо"}, + {24, 285, 2014, L"Стародуб"}, + {24, 285, 2010, L"Сураж"}, + {24, 285, 2012, L"Трубчевск"}, + {24, 285, 2011, L"Унеча"}, + {24, 285, 2019, L"Фокино"}, + {24, 285, 2210, L"Другое"}, + {24, 286, 1635, L"Александров"}, + {24, 286, 1636, L"Владимир"}, + {24, 286, 2021, L"Вязники"}, + {24, 286, 1637, L"Головино"}, + {24, 286, 2022, L"Гороховец"}, + {24, 286, 1638, L"Гусь-Хрустальный"}, + {24, 286, 2023, L"Камешково"}, + {24, 286, 2031, L"Карабаново"}, + {24, 286, 2024, L"Киржач"}, + {24, 286, 1639, L"Ковров"}, + {24, 286, 1640, L"Кольчугино"}, + {24, 286, 2026, L"Костерево"}, + {24, 286, 3299, L"Красная Горбатка"}, + {24, 286, 2033, L"Лакинск"}, + {24, 286, 2025, L"Меленки"}, + {24, 286, 1641, L"Муром"}, + {24, 286, 1642, L"Петушки"}, + {24, 286, 2027, L"Покров"}, + {24, 286, 2211, L"Радужный"}, + {24, 286, 2028, L"Собинка"}, + {24, 286, 2032, L"Струнино"}, + {24, 286, 2029, L"Судогда"}, + {24, 286, 1643, L"Суздаль"}, + {24, 286, 2030, L"Юрьев-Польский"}, + {24, 286, 2212, L"Другое"}, + {24, 287, 1644, L"Бобров"}, + {24, 287, 1645, L"Богучар"}, + {24, 287, 1646, L"Борисоглебск"}, + {24, 287, 1647, L"Бутурлиновка"}, + {24, 287, 1648, L"Воронеж"}, + {24, 287, 2178, L"Калач"}, + {24, 287, 2176, L"Лиски"}, + {24, 287, 1649, L"Нововоронеж"}, + {24, 287, 2177, L"Новохоперск"}, + {24, 287, 2180, L"Острогожск"}, + {24, 287, 1650, L"Павловск"}, + {24, 287, 2181, L"Поворино"}, + {24, 287, 1651, L"Россошь"}, + {24, 287, 2179, L"Семилуки"}, + {24, 287, 2182, L"Эртиль"}, + {24, 287, 2224, L"Другое"}, + {24, 288, 1652, L"Вичуга"}, + {24, 288, 2036, L"Гаврилов Посад"}, + {24, 288, 1657, L"Заволжск"}, + {24, 288, 1653, L"Иваново"}, + {24, 288, 1656, L"Кинешма"}, + {24, 288, 2040, L"Комсомольск"}, + {24, 288, 2037, L"Кохма"}, + {24, 288, 2043, L"Наволоки"}, + {24, 288, 3300, L"Палех"}, + {24, 288, 2039, L"Плес"}, + {24, 288, 2038, L"Приволжск"}, + {24, 288, 2042, L"Пучеж"}, + {24, 288, 2044, L"Родники"}, + {24, 288, 1655, L"Тейково"}, + {24, 288, 2034, L"Фурманов"}, + {24, 288, 1654, L"Шуя"}, + {24, 288, 2041, L"Южа"}, + {24, 288, 2035, L"Юрьевец"}, + {24, 288, 2227, L"Другое"}, + {24, 289, 2050, L"Балабаново"}, + {24, 289, 2051, L"Боровск"}, + {24, 289, 3301, L"Воротынск"}, + {24, 289, 2052, L"Жиздра"}, + {24, 289, 1660, L"Жуковка"}, + {24, 289, 1658, L"Калуга"}, + {24, 289, 2046, L"Киров"}, + {24, 289, 1661, L"Козельск"}, + {24, 289, 2053, L"Кондрово"}, + {24, 289, 2049, L"Людиново"}, + {24, 289, 1659, L"Малоярославец"}, + {24, 289, 2054, L"Медынь"}, + {24, 289, 2055, L"Мещовск"}, + {24, 289, 2047, L"Мосальск"}, + {24, 289, 1662, L"Обнинск"}, + {24, 289, 2057, L"Сосенский"}, + {24, 289, 2056, L"Спас-Демянск"}, + {24, 289, 2045, L"Сухиничи"}, + {24, 289, 1663, L"Таруса"}, + {24, 289, 2131, L"Чекалин"}, + {24, 289, 2048, L"Юхнов"}, + {24, 289, 2233, L"Другое"}, + {24, 290, 1664, L"Буй"}, + {24, 290, 1665, L"Волгореченск"}, + {24, 290, 1666, L"Галич"}, + {24, 290, 2059, L"Кологрив"}, + {24, 290, 1667, L"Кострома"}, + {24, 290, 3302, L"Красное-на-Волге"}, + {24, 290, 1668, L"Макарьев"}, + {24, 290, 2060, L"Мантурово"}, + {24, 290, 1669, L"Нерехта"}, + {24, 290, 2061, L"Нея"}, + {24, 290, 2062, L"Солигалич"}, + {24, 290, 2058, L"Чухлома"}, + {24, 290, 1670, L"Шарья"}, + {24, 290, 2240, L"Другое"}, + {24, 291, 1671, L"Дмитриев-Льговский"}, + {24, 291, 1673, L"Железногорск"}, + {24, 291, 3279, L"Железногорск"}, + {24, 291, 1672, L"Курск"}, + {24, 291, 2187, L"Курчатов"}, + {24, 291, 2188, L"Льгов"}, + {24, 291, 2184, L"Обоянь"}, + {24, 291, 2185, L"Рыльск"}, + {24, 291, 2183, L"Суджа"}, + {24, 291, 2189, L"Фатеж"}, + {24, 291, 2186, L"Щигры"}, + {24, 291, 2244, L"Другое"}, + {24, 292, 2194, L"Грязи"}, + {24, 292, 2193, L"Данков"}, + {24, 292, 1674, L"Елец"}, + {24, 292, 2190, L"Задонск"}, + {24, 292, 2195, L"Лебедянь"}, + {24, 292, 1675, L"Липецк"}, + {24, 292, 2192, L"Усмань"}, + {24, 292, 2191, L"Чаплыгин"}, + {24, 292, 2245, L"Другое"}, + {24, 293, 1733, L"Апрелевка"}, + {24, 293, 1732, L"Балашиха"}, + {24, 293, 1731, L"Бронницы"}, + {24, 293, 1730, L"Верея"}, + {24, 293, 2063, L"Видное"}, + {24, 293, 2064, L"Волоколамск"}, + {24, 293, 1729, L"Воскресенск"}, + {24, 293, 1728, L"Высоковск"}, + {24, 293, 1727, L"Голицыно"}, + {24, 293, 2065, L"Дедовск"}, + {24, 293, 1726, L"Дзержинский"}, + {24, 293, 1725, L"Дмитров"}, + {24, 293, 1724, L"Долгопрудный"}, + {24, 293, 1723, L"Домодедово"}, + {24, 293, 2066, L"Дрезна"}, + {24, 293, 1722, L"Дубна"}, + {24, 293, 1721, L"Егорьевск"}, + {24, 293, 1720, L"Железнодорожный"}, + {24, 293, 1719, L"Жуковский"}, + {24, 293, 2067, L"Зарайск"}, + {24, 293, 1718, L"Звенигород"}, + {24, 293, 1715, L"Ивантеевка"}, + {24, 293, 1717, L"Истра"}, + {24, 293, 2068, L"Калининград"}, + {24, 293, 2069, L"Кашира"}, + {24, 293, 1716, L"Климовск"}, + {24, 293, 1714, L"Клин"}, + {24, 293, 1713, L"Коломна"}, + {24, 293, 1712, L"Королев"}, + {24, 293, 1711, L"Красноармейск"}, + {24, 293, 1710, L"Красногорск"}, + {24, 293, 2070, L"Краснозаводск"}, + {24, 293, 2071, L"Куровское"}, + {24, 293, 1709, L"Ликино-Дулево"}, + {24, 293, 1708, L"Лобня"}, + {24, 293, 2072, L"Лосино-Петровский"}, + {24, 293, 1707, L"Луховицы"}, + {24, 293, 1706, L"Лыткарино"}, + {24, 293, 1705, L"Люберцы"}, + {24, 293, 1704, L"Менделеево"}, + {24, 293, 1703, L"Можайск"}, + {24, 293, 1702, L"Мытищи"}, + {24, 293, 1701, L"Наро-Фоминск"}, + {24, 293, 1700, L"Ногинск"}, + {24, 293, 1698, L"Одинцово"}, + {24, 293, 2073, L"Ожерелье"}, + {24, 293, 2074, L"Озеры"}, + {24, 293, 1699, L"Орехово-Зуево"}, + {24, 293, 1697, L"Павловский Посад"}, + {24, 293, 1696, L"Подольск"}, + {24, 293, 1695, L"Протвино"}, + {24, 293, 1694, L"Пушкино"}, + {24, 293, 1693, L"Пущино"}, + {24, 293, 1692, L"Раменское"}, + {24, 293, 1691, L"Реутов"}, + {24, 293, 1690, L"Решетников"}, + {24, 293, 2075, L"Рошаль"}, + {24, 293, 2076, L"Руза"}, + {24, 293, 1689, L"Сергиев Посад"}, + {24, 293, 1688, L"Серпухов"}, + {24, 293, 1687, L"Солнечногорск"}, + {24, 293, 1686, L"Ступино"}, + {24, 293, 2077, L"Сходня"}, + {24, 293, 2078, L"Талдом"}, + {24, 293, 1685, L"Троицк"}, + {24, 293, 1684, L"Фрязино"}, + {24, 293, 1683, L"Химки"}, + {24, 293, 1682, L"Хотьково"}, + {24, 293, 1681, L"Черноголовка"}, + {24, 293, 1680, L"Чехов"}, + {24, 293, 1679, L"Шатура"}, + {24, 293, 1678, L"Щелково"}, + {24, 293, 2080, L"Щербинка"}, + {24, 293, 1677, L"Электрогорск"}, + {24, 293, 1676, L"Электросталь"}, + {24, 293, 2079, L"Электроугли"}, + {24, 293, 3031, L"Юбилейный"}, + {24, 293, 2081, L"Яхрома"}, + {24, 293, 2249, L"Другое"}, + {24, 294, 2083, L"Болхов"}, + {24, 294, 2082, L"Дмитровск-Орловский"}, + {24, 294, 3160, L"Залегощь"}, + {24, 294, 1736, L"Ливны"}, + {24, 294, 2084, L"Малоархангельск"}, + {24, 294, 1737, L"Мценск"}, + {24, 294, 2085, L"Новосиль"}, + {24, 294, 1735, L"Орел"}, + {24, 294, 2255, L"Другое"}, + {24, 295, 1740, L"Гусь-Железный"}, + {24, 295, 1741, L"Касимов"}, + {24, 295, 2086, L"Кораблино"}, + {24, 295, 2087, L"Михайлов"}, + {24, 295, 2089, L"Новомичуринск"}, + {24, 295, 2091, L"Рыбное"}, + {24, 295, 2093, L"Ряжск"}, + {24, 295, 1738, L"Рязань"}, + {24, 295, 3305, L"Сапожок"}, + {24, 295, 1739, L"Сасово"}, + {24, 295, 2090, L"Скопин"}, + {24, 295, 2088, L"Спас-Клепики"}, + {24, 295, 2092, L"Спасск-Рязанский"}, + {24, 295, 2094, L"Шацк"}, + {24, 295, 3320, L"Шилово"}, + {24, 295, 2260, L"Другое"}, + {24, 296, 2095, L"Велиж"}, + {24, 296, 1743, L"Вязьма"}, + {24, 296, 1744, L"Гагарин"}, + {24, 296, 2096, L"Демидов"}, + {24, 296, 1745, L"Десногорск"}, + {24, 296, 1746, L"Дорогубуж"}, + {24, 296, 2097, L"Духовщина"}, + {24, 296, 2098, L"Ельня"}, + {24, 296, 2099, L"Починок"}, + {24, 296, 2100, L"Рославль"}, + {24, 296, 2101, L"Рудня"}, + {24, 296, 1747, L"Сафоново"}, + {24, 296, 1742, L"Смоленск"}, + {24, 296, 2102, L"Сычевка"}, + {24, 296, 1748, L"Ярцево"}, + {24, 296, 2267, L"Другое"}, + {24, 297, 2198, L"Жердевка"}, + {24, 297, 2199, L"Кирсанов"}, + {24, 297, 1752, L"Котовск"}, + {24, 297, 1751, L"Мичуринск"}, + {24, 297, 2196, L"Моршанск"}, + {24, 297, 1750, L"Рассказово"}, + {24, 297, 3271, L"Сатинка"}, + {24, 297, 1749, L"Тамбов"}, + {24, 297, 3272, L"Тулиновка"}, + {24, 297, 2197, L"Уварово"}, + {24, 297, 2270, L"Другое"}, + {24, 298, 2103, L"Андреаполь"}, + {24, 298, 2104, L"Бежецк"}, + {24, 298, 2105, L"Белый"}, + {24, 298, 2106, L"Бологое"}, + {24, 298, 2107, L"Весьегонск"}, + {24, 298, 1753, L"Вышний Волочек"}, + {24, 298, 2108, L"Западная Двина"}, + {24, 298, 2109, L"Зубцов"}, + {24, 298, 2110, L"Калязин"}, + {24, 298, 2111, L"Кашин"}, + {24, 298, 1758, L"Кимры"}, + {24, 298, 1756, L"Конаково"}, + {24, 298, 2112, L"Красный Холм"}, + {24, 298, 1759, L"Кувшиново"}, + {24, 298, 1760, L"Лихославль"}, + {24, 298, 1761, L"Нелидово"}, + {24, 298, 2113, L"Осташков"}, + {24, 298, 1757, L"Ржев"}, + {24, 298, 2114, L"Старица"}, + {24, 298, 1754, L"Тверь"}, + {24, 298, 2115, L"Торжок"}, + {24, 298, 2116, L"Торопец"}, + {24, 298, 1755, L"Удомля"}, + {24, 298, 2272, L"Другое"}, + {24, 299, 2127, L"Алексин"}, + {24, 299, 2126, L"Белев"}, + {24, 299, 2118, L"Богородицк"}, + {24, 299, 2122, L"Болохово"}, + {24, 299, 2129, L"Венев"}, + {24, 299, 1762, L"Донской"}, + {24, 299, 2128, L"Ефремов"}, + {24, 299, 3354, L"Заокский"}, + {24, 299, 2124, L"Киреевск"}, + {24, 299, 1763, L"Климовск"}, + {24, 299, 2123, L"Липки"}, + {24, 299, 1764, L"Новомосковск"}, + {24, 299, 2117, L"Плавск"}, + {24, 299, 2130, L"Северо-Задонск"}, + {24, 299, 2120, L"Советск"}, + {24, 299, 2119, L"Сокольники"}, + {24, 299, 2125, L"Суворов"}, + {24, 299, 1765, L"Тула"}, + {24, 299, 1766, L"Узловая"}, + {24, 299, 2121, L"Щекино"}, + {24, 299, 1767, L"Ясногорск"}, + {24, 299, 2274, L"Другое"}, + {24, 300, 3053, L"Большое Село"}, + {24, 300, 3268, L"Брейтово"}, + {24, 300, 1773, L"Гаврилов-Ям"}, + {24, 300, 2132, L"Данилов"}, + {24, 300, 3269, L"Красные Ткачи"}, + {24, 300, 2133, L"Любим"}, + {24, 300, 3270, L"Мокеевское"}, + {24, 300, 1774, L"Мышкин"}, + {24, 300, 2994, L"Некоуз"}, + {24, 300, 1775, L"Переславль-Залесский"}, + {24, 300, 2134, L"Пошехонье"}, + {24, 300, 1769, L"Ростов"}, + {24, 300, 1771, L"Рыбинск"}, + {24, 300, 1772, L"Тутаев"}, + {24, 300, 1770, L"Углич"}, + {24, 300, 1768, L"Ярославль"}, + {24, 300, 2290, L"Другое"}, + {24, 301, 2849, L"Адыгейск"}, + {24, 301, 1776, L"Майкоп"}, + {24, 301, 2214, L"Другое"}, + {24, 304, 2617, L"Буйнакск"}, + {24, 304, 1791, L"Гуниб"}, + {24, 304, 1788, L"Дербент"}, + {24, 304, 2619, L"Избербаш"}, + {24, 304, 1789, L"Каспийск"}, + {24, 304, 2618, L"Кизилюрт"}, + {24, 304, 1790, L"Кизляр"}, + {24, 304, 1792, L"Махачкала"}, + {24, 304, 2620, L"Хасавюрт"}, + {24, 304, 2225, L"Другое"}, + {24, 305, 3052, L"Магас"}, + {24, 305, 1787, L"Назрань"}, + {24, 305, 2228, L"Другое"}, + {24, 306, 2621, L"Баксан"}, + {24, 306, 1794, L"Майский"}, + {24, 306, 1793, L"Нальчик"}, + {24, 306, 2622, L"Нарткала"}, + {24, 306, 1795, L"Прохладный"}, + {24, 306, 2623, L"Терек"}, + {24, 306, 2624, L"Тырныауз"}, + {24, 306, 3274, L"Чегем"}, + {24, 306, 2230, L"Другое"}, + {24, 307, 2567, L"Городовиково"}, + {24, 307, 2568, L"Лагань"}, + {24, 307, 3324, L"Троицкое"}, + {24, 307, 1796, L"Элиста"}, + {24, 307, 2232, L"Другое"}, + {24, 308, 1799, L"Домбай"}, + {24, 308, 1798, L"Карачаевск"}, + {24, 308, 2626, L"Теберда"}, + {24, 308, 2625, L"Усть-Джегута"}, + {24, 308, 1797, L"Черкесск"}, + {24, 308, 2235, L"Другое"}, + {24, 311, 2630, L"Алагир"}, + {24, 311, 2631, L"Ардон"}, + {24, 311, 2628, L"Беслан"}, + {24, 311, 1839, L"Владикавказ"}, + {24, 311, 2629, L"Дигора"}, + {24, 311, 2627, L"Моздок"}, + {24, 311, 2266, L"Другое"}, + {24, 313, 2632, L"Аргун"}, + {24, 313, 1853, L"Грозный"}, + {24, 313, 2633, L"Гудермес"}, + {24, 313, 2284, L"Другое"}, + {24, 309, 2636, L"Абинск"}, + {24, 309, 1800, L"Анапа"}, + {24, 309, 1801, L"Апшеронск"}, + {24, 309, 1802, L"Армавир"}, + {24, 309, 1803, L"Белореченск"}, + {24, 309, 1804, L"Геленджик"}, + {24, 309, 1805, L"Горячий Ключ"}, + {24, 309, 2637, L"Гулькевичи"}, + {24, 309, 1806, L"Динская"}, + {24, 309, 1807, L"Ейск"}, + {24, 309, 2638, L"Кореновск"}, + {24, 309, 1808, L"Краснодар"}, + {24, 309, 1809, L"Кропоткин"}, + {24, 309, 1810, L"Крымск"}, + {24, 309, 1811, L"Курганинск"}, + {24, 309, 3232, L"Лабинск"}, + {24, 309, 2639, L"Новокубанск"}, + {24, 309, 1812, L"Новороссийск"}, + {24, 309, 1813, L"Пластуновская"}, + {24, 309, 1814, L"Приморско-Ахтарск"}, + {24, 309, 3102, L"Северская"}, + {24, 309, 1815, L"Славянск-на-Кубани"}, + {24, 309, 1816, L"Сочи"}, + {24, 309, 3266, L"Староминская"}, + {24, 309, 3039, L"Тамань"}, + {24, 309, 1817, L"Темрюк"}, + {24, 309, 2635, L"Тимашевск"}, + {24, 309, 1818, L"Тихорецк"}, + {24, 309, 1819, L"Туапсе"}, + {24, 309, 1820, L"Усть-Лабинск"}, + {24, 309, 2634, L"Хадыженск"}, + {24, 309, 2241, L"Другое"}, + {24, 312, 1840, L"Александровское"}, + {24, 312, 2644, L"Благодарный"}, + {24, 312, 1841, L"Буденновск"}, + {24, 312, 1842, L"Георгиевск"}, + {24, 312, 1843, L"Ессентуки"}, + {24, 312, 1844, L"Железноводск"}, + {24, 312, 2647, L"Зеленокумск"}, + {24, 312, 2641, L"Изобильный"}, + {24, 312, 2642, L"Ипатово"}, + {24, 312, 1845, L"Кисловодск"}, + {24, 312, 1846, L"Кочубеевское"}, + {24, 312, 3367, L"Курсавка"}, + {24, 312, 3265, L"Левокумское"}, + {24, 312, 1847, L"Лермонтов"}, + {24, 312, 1848, L"Минеральные Воды"}, + {24, 312, 1849, L"Невинномысск"}, + {24, 312, 2645, L"Нефтекумск"}, + {24, 312, 2643, L"Новоалександровск"}, + {24, 312, 1850, L"Новопавловск"}, + {24, 312, 1851, L"Новоселицкое"}, + {24, 312, 1852, L"Пятигорск"}, + {24, 312, 2646, L"Светлоград"}, + {24, 312, 2640, L"Ставрополь"}, + {24, 312, 2268, L"Другое"}, + {24, 302, 1777, L"Астрахань"}, + {24, 302, 1778, L"Ахтубинск"}, + {24, 302, 3383, L"Знаменск"}, + {24, 302, 2578, L"Камызяк"}, + {24, 302, 2579, L"Нариманов"}, + {24, 302, 1786, L"Харабали"}, + {24, 302, 2219, L"Другое"}, + {24, 303, 1779, L"Волгоград"}, + {24, 303, 1780, L"Волжский"}, + {24, 303, 2584, L"Дубовка"}, + {24, 303, 1781, L"Жирновск"}, + {24, 303, 1782, L"Калач-на-Дону"}, + {24, 303, 1783, L"Камышин"}, + {24, 303, 2588, L"Котельниково"}, + {24, 303, 2591, L"Котово"}, + {24, 303, 2587, L"Краснослободск"}, + {24, 303, 2582, L"Ленинск"}, + {24, 303, 2590, L"Михайловка"}, + {24, 303, 1784, L"Николаевск"}, + {24, 303, 2581, L"Новоаннинский"}, + {24, 303, 2583, L"Палласовка"}, + {24, 303, 2580, L"Петров Вал"}, + {24, 303, 2589, L"Серафимович"}, + {24, 303, 2585, L"Суровикино"}, + {24, 303, 1785, L"Урюпинск"}, + {24, 303, 2586, L"Фролово"}, + {24, 303, 2223, L"Другое"}, + {24, 310, 1821, L"Азов"}, + {24, 310, 1822, L"Аксай"}, + {24, 310, 1823, L"Багаевская"}, + {24, 310, 1824, L"Батайск"}, + {24, 310, 1825, L"Белая Калитва"}, + {24, 310, 1826, L"Волгодонск"}, + {24, 310, 1827, L"Гуково"}, + {24, 310, 2651, L"Донецк"}, + {24, 310, 1828, L"Зерноград"}, + {24, 310, 3264, L"Каменоломни"}, + {24, 310, 2652, L"Каменск-Шахтинский"}, + {24, 310, 2649, L"Константиновск"}, + {24, 310, 2648, L"Красный Сулин"}, + {24, 310, 1829, L"Миллерово"}, + {24, 310, 2653, L"Морозовск"}, + {24, 310, 1830, L"Новочеркасск"}, + {24, 310, 1831, L"Новошахтинск"}, + {24, 310, 1832, L"Пролетарск"}, + {24, 310, 1833, L"Ростов-на-Дону"}, + {24, 310, 1834, L"Сальск"}, + {24, 310, 1835, L"Семикаракорск"}, + {24, 310, 1836, L"Таганрог"}, + {24, 310, 1837, L"Усть-Донецкий"}, + {24, 310, 3263, L"Целина"}, + {24, 310, 2650, L"Цимлянск"}, + {24, 310, 1838, L"Шахты"}, + {24, 310, 2259, L"Другое"}, + {139, 407, 407, L" столица"}, + {139, 426, 427, L"Бойсе"}, + {139, 426, 2354, L"Другое"}, + {139, 378, 3109, L"Айова Сити"}, + {139, 378, 379, L"Де-Мойн"}, + {139, 378, 2963, L"Декора"}, + {139, 378, 2355, L"Другое"}, + {139, 412, 3236, L"Бирмингем"}, + {139, 412, 413, L"Монтгомери"}, + {139, 412, 1181, L"Хантсвилл"}, + {139, 412, 2356, L"Другое"}, + {139, 446, 1182, L"Анкоридж"}, + {139, 446, 447, L"Джуно"}, + {139, 446, 1183, L"Фэрбенкс"}, + {139, 446, 2357, L"Другое"}, + {139, 434, 2917, L"Темпе"}, + {139, 434, 1184, L"Тусон"}, + {139, 434, 435, L"Финикс"}, + {139, 434, 3061, L"Чандлер"}, + {139, 434, 2358, L"Другое"}, + {139, 416, 417, L"Литл-Рок"}, + {139, 416, 2359, L"Другое"}, + {139, 428, 3017, L"Ларами"}, + {139, 428, 429, L"Шайенн"}, + {139, 428, 2360, L"Другое"}, + {139, 440, 2956, L"Беллевью"}, + {139, 440, 2967, L"Бремертон"}, + {139, 440, 3385, L"Ванкувер"}, + {139, 440, 2865, L"Линден"}, + {139, 440, 441, L"Олимпия"}, + {139, 440, 3352, L"Порт Орчард"}, + {139, 440, 2876, L"Редмонт"}, + {139, 440, 3003, L"Рентон"}, + {139, 440, 1185, L"Сиэтл"}, + {139, 440, 2983, L"Снохомиш"}, + {139, 440, 1186, L"Такома"}, + {139, 440, 3152, L"Фрайди Харбор"}, + {139, 440, 2886, L"Эверет"}, + {139, 440, 2361, L"Другое"}, + {139, 352, 353, L"Монтпильер"}, + {139, 352, 2861, L"Норвич"}, + {139, 352, 2362, L"Другое"}, + {139, 394, 1188, L"Александрия"}, + {139, 394, 1187, L"Арлингтон"}, + {139, 394, 2969, L"Даллес"}, + {139, 394, 1189, L"Манассас"}, + {139, 394, 3114, L"Норфолк"}, + {139, 394, 2885, L"Ньюпорт-Ньюс"}, + {139, 394, 2979, L"Раунд Хил"}, + {139, 394, 3338, L"Рестон"}, + {139, 394, 395, L"Ричмонд"}, + {139, 394, 3005, L"Уоррентон"}, + {139, 394, 2991, L"Херндон"}, + {139, 394, 2996, L"Центрвиль"}, + {139, 394, 3097, L"Чантилли"}, + {139, 394, 2981, L"Шарлотесвиль"}, + {139, 394, 2363, L"Другое"}, + {139, 374, 2995, L"Грин-Бей"}, + {139, 374, 375, L"Мадисон"}, + {139, 374, 2365, L"Другое"}, + {139, 448, 449, L"Гонолулу"}, + {139, 448, 1191, L"Хило"}, + {139, 448, 2367, L"Другое"}, + {139, 390, 3021, L"Вильмингтон"}, + {139, 390, 391, L"Довер"}, + {139, 390, 2973, L"Льюис"}, + {139, 390, 2369, L"Другое"}, + {139, 402, 403, L"Атланта"}, + {139, 402, 2370, L"Другое"}, + {139, 396, 397, L"Чарлстон"}, + {139, 396, 2371, L"Другое"}, + {139, 370, 2911, L"Вестмонт"}, + {139, 370, 3074, L"Гарвард"}, + {139, 370, 371, L"Спрингфилд"}, + {139, 370, 2930, L"Урбана"}, + {139, 370, 1194, L"Чикаго"}, + {139, 370, 2372, L"Другое"}, + {139, 368, 369, L"Индианаполис"}, + {139, 368, 1195, L"Эвансвил"}, + {139, 368, 2373, L"Другое"}, + {139, 444, 2959, L"Анахайм"}, + {139, 444, 2961, L"Аптос"}, + {139, 444, 2912, L"Артезия"}, + {139, 444, 2899, L"Беверли Хилз"}, + {139, 444, 1196, L"Беркли"}, + {139, 444, 3249, L"Бреа"}, + {139, 444, 3014, L"Брисбейн"}, + {139, 444, 3048, L"Венис"}, + {139, 444, 2901, L"Вест-Голливуд"}, + {139, 444, 2926, L"Вестлейк Вилладж"}, + {139, 444, 2922, L"Гардена"}, + {139, 444, 1203, L"Глендейл"}, + {139, 444, 2978, L"Денвиль"}, + {139, 444, 2990, L"Дублин"}, + {139, 444, 3077, L"Дэвис"}, + {139, 444, 2918, L"Ирвайн"}, + {139, 444, 2881, L"Карсон"}, + {139, 444, 3247, L"Кипресс"}, + {139, 444, 3092, L"Коста Меса"}, + {139, 444, 2948, L"Купертино"}, + {139, 444, 1197, L"Лонг-Бич"}, + {139, 444, 1198, L"Лос-Анджелес"}, + {139, 444, 3058, L"Лос-Гатос"}, + {139, 444, 3328, L"Марина-дель-Рей"}, + {139, 444, 2874, L"Маунтин-Вью"}, + {139, 444, 2998, L"Милпитас"}, + {139, 444, 3087, L"Монтерей"}, + {139, 444, 2947, L"Окленд"}, + {139, 444, 2900, L"Пало Альто"}, + {139, 444, 1199, L"Пасадена"}, + {139, 444, 3335, L"Редвуд"}, + {139, 444, 2966, L"Розамонд"}, + {139, 444, 445, L"Сакраменто"}, + {139, 444, 1200, L"Сан-Диего"}, + {139, 444, 3317, L"Сан-Мартин"}, + {139, 444, 1201, L"Сан-Франциско"}, + {139, 444, 1202, L"Сан-Хосе"}, + {139, 444, 2878, L"Саннивейл"}, + {139, 444, 2925, L"Санта-Барбара"}, + {139, 444, 2875, L"Санта-Клара"}, + {139, 444, 1204, L"Санта-Круз"}, + {139, 444, 2859, L"Санта-Моника"}, + {139, 444, 3157, L"Студио Сити"}, + {139, 444, 3146, L"Торранс"}, + {139, 444, 2970, L"Тысяча Дубов"}, + {139, 444, 2949, L"Универсал-Сити"}, + {139, 444, 3057, L"Форт Брэгг"}, + {139, 444, 3032, L"Фостер-Сити"}, + {139, 444, 3381, L"Фремонт"}, + {139, 444, 3028, L"Фуллертон"}, + {139, 444, 2858, L"Эмервиль"}, + {139, 444, 3040, L"Эскондидо"}, + {139, 444, 2374, L"Другое"}, + {139, 388, 3041, L"Лоуренс"}, + {139, 388, 389, L"Топика"}, + {139, 388, 2375, L"Другое"}, + {139, 408, 3004, L"Лексингтон"}, + {139, 408, 1205, L"Луисвилл"}, + {139, 408, 409, L"Франкфорт"}, + {139, 408, 2376, L"Другое"}, + {139, 430, 1206, L"Боулдер"}, + {139, 430, 3095, L"Грили"}, + {139, 430, 431, L"Денвер"}, + {139, 430, 1207, L"Колорадо-Спрингс"}, + {139, 430, 3046, L"Литлтон"}, + {139, 430, 2377, L"Другое"}, + {139, 358, 2968, L"Дариен"}, + {139, 358, 3018, L"Денбери"}, + {139, 358, 2882, L"Стэмфорд"}, + {139, 358, 359, L"Хартфорд"}, + {139, 358, 3047, L"Шелтон"}, + {139, 358, 2378, L"Другое"}, + {139, 418, 419, L"Батон-Руж"}, + {139, 418, 1208, L"Новый Орлеан"}, + {139, 418, 2408, L"Другое"}, + {139, 354, 2931, L"Аттлеборо"}, + {139, 354, 3334, L"Билерика"}, + {139, 354, 355, L"Бостон"}, + {139, 354, 3059, L"Вестгемптон"}, + {139, 354, 2919, L"Вобурн"}, + {139, 354, 2902, L"Дедхэм"}, + {139, 354, 1209, L"Кеймбридж"}, + {139, 354, 3336, L"Нидхем"}, + {139, 354, 2985, L"Ньютонвиль"}, + {139, 354, 3022, L"Уолтхэм"}, + {139, 354, 2407, L"Другое"}, + {139, 376, 1210, L"Миннеаполис"}, + {139, 376, 2980, L"Плимут"}, + {139, 376, 377, L"Сент-Пол"}, + {139, 376, 3035, L"Эден Прейри"}, + {139, 376, 2406, L"Другое"}, + {139, 414, 415, L"Джэксон"}, + {139, 414, 2405, L"Другое"}, + {139, 380, 381, L"Джефферсон-Сити"}, + {139, 380, 3062, L"Канзас Сити"}, + {139, 380, 3038, L"Ли Саммит"}, + {139, 380, 1211, L"Сент-Луис"}, + {139, 380, 2895, L"Эллисвил"}, + {139, 380, 2404, L"Другое"}, + {139, 372, 3357, L"Вест Блюмфельд"}, + {139, 372, 1212, L"Гранд-Рапидс"}, + {139, 372, 1213, L"Детройт"}, + {139, 372, 3103, L"Каламазу"}, + {139, 372, 373, L"Лансинг"}, + {139, 372, 2987, L"Новай"}, + {139, 372, 2887, L"Сагино"}, + {139, 372, 2403, L"Другое"}, + {139, 424, 1214, L"Грейт-Фолс"}, + {139, 424, 425, L"Хелина"}, + {139, 424, 2402, L"Другое"}, + {139, 348, 349, L"Огаста"}, + {139, 348, 3000, L"Ярмут"}, + {139, 348, 2401, L"Другое"}, + {139, 392, 393, L"Аннаполис"}, + {139, 392, 1215, L"Балтимор"}, + {139, 392, 3143, L"Гринбелт"}, + {139, 392, 3337, L"Колледж Парк"}, + {139, 392, 2904, L"Маунт Эйри"}, + {139, 392, 3329, L"Роквилль"}, + {139, 392, 2400, L"Другое"}, + {139, 386, 387, L"Линкольн"}, + {139, 386, 1216, L"Омаха"}, + {139, 386, 2399, L"Другое"}, + {139, 438, 439, L"Карсон-Сити"}, + {139, 438, 1217, L"Лас-Вегас"}, + {139, 438, 2890, L"Рено"}, + {139, 438, 2398, L"Другое"}, + {139, 362, 1219, L"Атлантик-Сити"}, + {139, 362, 1218, L"Ньюарк"}, + {139, 362, 3276, L"Оклин"}, + {139, 362, 3073, L"Принстон"}, + {139, 362, 2955, L"Рузерфорд"}, + {139, 362, 3349, L"Сомервиль"}, + {139, 362, 363, L"Трентон"}, + {139, 362, 3078, L"Хакеттстоун"}, + {139, 362, 3248, L"Черри Хилл"}, + {139, 362, 2397, L"Другое"}, + {139, 360, 3134, L"Баффало"}, + {139, 360, 3081, L"Бингхэмптон"}, + {139, 360, 2997, L"Бруклин"}, + {139, 360, 2999, L"Варвик"}, + {139, 360, 3139, L"Ирвингтон"}, + {139, 360, 3060, L"Итака"}, + {139, 360, 1220, L"Нью-Йорк"}, + {139, 360, 361, L"Олбани"}, + {139, 360, 2914, L"Погкипси"}, + {139, 360, 3056, L"Саратога Спрингс"}, + {139, 360, 2396, L"Другое"}, + {139, 432, 1222, L"Альбукерке"}, + {139, 432, 433, L"Санта-Фе"}, + {139, 432, 2395, L"Другое"}, + {139, 350, 2989, L"Амхерст"}, + {139, 350, 351, L"Конкорд"}, + {139, 350, 2950, L"Лондондерри"}, + {139, 350, 1221, L"Манчестер"}, + {139, 350, 3111, L"Рочестер"}, + {139, 350, 2898, L"Салем"}, + {139, 350, 2938, L"Хадсон"}, + {139, 350, 2394, L"Другое"}, + {139, 366, 2953, L"Варрен"}, + {139, 366, 3112, L"Гроув Сити"}, + {139, 366, 1223, L"Кливленд"}, + {139, 366, 367, L"Колумбус"}, + {139, 366, 2951, L"Лавленд"}, + {139, 366, 2862, L"Оберлин"}, + {139, 366, 3034, L"Рейнольдсбург"}, + {139, 366, 2860, L"Цинциннати"}, + {139, 366, 2393, L"Другое"}, + {139, 420, 421, L"Оклахома-Сити"}, + {139, 420, 1224, L"Талса"}, + {139, 420, 2392, L"Другое"}, + {139, 442, 2877, L"Кламат-Фолс"}, + {139, 442, 2945, L"Коттедж-Гроув"}, + {139, 442, 1225, L"Портленд"}, + {139, 442, 443, L"Сейлем"}, + {139, 442, 1226, L"Юджин"}, + {139, 442, 2391, L"Другое"}, + {139, 364, 3316, L"Вифлием"}, + {139, 364, 3282, L"Колледжвиль"}, + {139, 364, 2972, L"Нью Фридом"}, + {139, 364, 1227, L"Питтсбург"}, + {139, 364, 2893, L"Рандор"}, + {139, 364, 3110, L"Слиппери Рок"}, + {139, 364, 1228, L"Филадельфия"}, + {139, 364, 365, L"Харрисберг"}, + {139, 364, 2390, L"Другое"}, + {139, 450, 451, L"Понсе"}, + {139, 450, 3093, L"Сан-Хуан"}, + {139, 450, 2389, L"Другое"}, + {139, 356, 357, L"Провиденс"}, + {139, 356, 2388, L"Другое"}, + {139, 382, 383, L"Бисмарк"}, + {139, 382, 2387, L"Другое"}, + {139, 398, 2960, L"Вильмингтон"}, + {139, 398, 2915, L"Дурхам"}, + {139, 398, 399, L"Роли"}, + {139, 398, 2386, L"Другое"}, + {139, 410, 2863, L"Мемфис"}, + {139, 410, 411, L"Нашвилл"}, + {139, 410, 1229, L"Ноксвилл"}, + {139, 410, 2385, L"Другое"}, + {139, 422, 3085, L"Бедфорд"}, + {139, 422, 2913, L"Брейди"}, + {139, 422, 1233, L"Даллас"}, + {139, 422, 2916, L"Ирвинг"}, + {139, 422, 3123, L"Кингсвилл"}, + {139, 422, 2873, L"Конрой"}, + {139, 422, 3096, L"Корпус Кристи"}, + {139, 422, 423, L"Остин"}, + {139, 422, 1232, L"Сан-Антонио"}, + {139, 422, 3023, L"Уайли"}, + {139, 422, 1231, L"Хьюстон"}, + {139, 422, 1230, L"Эль-Пасо"}, + {139, 422, 2384, L"Другое"}, + {139, 406, 2383, L"Другое"}, + {139, 404, 2879, L"Бока-Рейтон"}, + {139, 404, 2880, L"Гейнсвил"}, + {139, 404, 3086, L"Джексонвиль"}, + {139, 404, 3002, L"Киссимми"}, + {139, 404, 3124, L"Корал Гейблс"}, + {139, 404, 2894, L"Корал-Спрингс"}, + {139, 404, 3290, L"Лейк-Ворт"}, + {139, 404, 1234, L"Майами"}, + {139, 404, 1236, L"Орландо"}, + {139, 404, 3372, L"Пинеллас Парк"}, + {139, 404, 2952, L"Пунта-Горда"}, + {139, 404, 3340, L"Сарасота"}, + {139, 404, 1235, L"Сент-Питерсберг"}, + {139, 404, 405, L"Таллахасси"}, + {139, 404, 2962, L"Форт Лаудердейл"}, + {139, 404, 2382, L"Другое"}, + {139, 384, 385, L"Пирр"}, + {139, 384, 2381, L"Другое"}, + {139, 400, 401, L"Колумбия"}, + {139, 400, 3090, L"Спартанбург"}, + {139, 400, 1237, L"Чарлстон"}, + {139, 400, 2380, L"Другое"}, + {139, 436, 3036, L"Кейсвилл"}, + {139, 436, 3024, L"Линдон"}, + {139, 436, 3108, L"Орем"}, + {139, 436, 2866, L"Сент-Джордж"}, + {139, 436, 437, L"Солт-Лейк-Сити"}, + {139, 436, 2379, L"Другое"}, + {39, 315, 614, L"Винница"}, + {39, 315, 615, L"Хмельник"}, + {39, 315, 2566, L"Другое"}, + {39, 316, 2940, L"Ковель"}, + {39, 316, 616, L"Луцк"}, + {39, 316, 2565, L"Другое"}, + {39, 317, 617, L"Днепродзержинск"}, + {39, 317, 618, L"Днепропетровск"}, + {39, 317, 619, L"Кривой Рог"}, + {39, 317, 620, L"Никополь"}, + {39, 317, 621, L"Новомосковск"}, + {39, 317, 622, L"Орджоникидзе"}, + {39, 317, 623, L"Павлоград"}, + {39, 317, 2564, L"Другое"}, + {39, 318, 624, L"Артемовск"}, + {39, 318, 625, L"Горловка"}, + {39, 318, 626, L"Донецк"}, + {39, 318, 627, L"Дружковка"}, + {39, 318, 628, L"Енакиево"}, + {39, 318, 629, L"Константиновка"}, + {39, 318, 630, L"Краматорск"}, + {39, 318, 2944, L"Красноармейск"}, + {39, 318, 631, L"Макеевка"}, + {39, 318, 632, L"Мариуполь"}, + {39, 318, 633, L"Николаевка"}, + {39, 318, 634, L"Славянск"}, + {39, 318, 635, L"Харцызск"}, + {39, 318, 2563, L"Другое"}, + {39, 319, 636, L"Бердичев"}, + {39, 319, 637, L"Житомир"}, + {39, 319, 2942, L"Коростень"}, + {39, 319, 638, L"Коростышев"}, + {39, 319, 2907, L"Малин"}, + {39, 319, 639, L"Новоград-Волынский"}, + {39, 319, 2562, L"Другое"}, + {39, 320, 640, L"Берегово"}, + {39, 320, 641, L"Воловец"}, + {39, 320, 3119, L"Мукачево"}, + {39, 320, 3162, L"Свалява"}, + {39, 320, 642, L"Ужгород"}, + {39, 320, 643, L"Хуст"}, + {39, 320, 2561, L"Другое"}, + {39, 321, 644, L"Бердянск"}, + {39, 321, 3128, L"Гуляйполе"}, + {39, 321, 645, L"Запорожье"}, + {39, 321, 646, L"Мелитополь"}, + {39, 321, 3121, L"Приморск"}, + {39, 321, 3378, L"Энергодар"}, + {39, 321, 2560, L"Другое"}, + {39, 322, 3379, L"Галич"}, + {39, 322, 647, L"Ивано-Франковск"}, + {39, 322, 3170, L"Яремче"}, + {39, 322, 2559, L"Другое"}, + {39, 323, 648, L"Белая Церковь"}, + {39, 323, 649, L"Борисполь"}, + {39, 323, 651, L"Бровары"}, + {39, 323, 650, L"Васильков"}, + {39, 323, 652, L"Ирпень"}, + {39, 323, 3341, L"Переяслав-Хмельницкий"}, + {39, 323, 653, L"Славутич"}, + {39, 323, 654, L"Фастов"}, + {39, 323, 655, L"Чернобыль"}, + {39, 323, 2558, L"Другое"}, + {39, 324, 656, L"Александрия"}, + {39, 324, 657, L"Кировоград"}, + {39, 324, 658, L"Светловодск"}, + {39, 324, 2557, L"Другое"}, + {39, 325, 659, L"Алушта"}, + {39, 325, 2984, L"Армянск"}, + {39, 325, 3042, L"Балаклава"}, + {39, 325, 660, L"Бахчисарай"}, + {39, 325, 662, L"Гурзуф"}, + {39, 325, 3382, L"Джанкой"}, + {39, 325, 663, L"Евпатория"}, + {39, 325, 667, L"Керчь"}, + {39, 325, 666, L"Коктебель"}, + {39, 325, 668, L"Мысовое"}, + {39, 325, 669, L"Саки"}, + {39, 325, 665, L"Севастополь"}, + {39, 325, 661, L"Симферополь"}, + {39, 325, 3370, L"Старый Крым"}, + {39, 325, 670, L"Судак"}, + {39, 325, 664, L"Феодосия"}, + {39, 325, 3148, L"Черноморское"}, + {39, 325, 671, L"Ялта"}, + {39, 325, 2556, L"Другое"}, + {39, 326, 672, L"Алчевск"}, + {39, 326, 673, L"Антрацит"}, + {39, 326, 674, L"Лисичанск"}, + {39, 326, 675, L"Луганск"}, + {39, 326, 3364, L"Молодогвардейск"}, + {39, 326, 676, L"Петровское"}, + {39, 326, 677, L"Ровеньки"}, + {39, 326, 678, L"Рубежное"}, + {39, 326, 679, L"Северодонецк"}, + {39, 326, 680, L"Стаханов"}, + {39, 326, 2555, L"Другое"}, + {39, 327, 3284, L"Дрогобыч"}, + {39, 327, 681, L"Львов"}, + {39, 327, 682, L"Трускавец"}, + {39, 327, 2554, L"Другое"}, + {39, 328, 3322, L"Вознесенск"}, + {39, 328, 2870, L"Жовтневое"}, + {39, 328, 683, L"Николаев"}, + {39, 328, 3118, L"Очаков"}, + {39, 328, 3325, L"Южноукраинск"}, + {39, 328, 2553, L"Другое"}, + {39, 329, 684, L"Белгород-Днестровский"}, + {39, 329, 685, L"Измаил"}, + {39, 329, 689, L"Ильичевск"}, + {39, 329, 686, L"Одесса"}, + {39, 329, 688, L"Рени"}, + {39, 329, 687, L"Слободка"}, + {39, 329, 2552, L"Другое"}, + {39, 330, 690, L"Гадяч"}, + {39, 330, 691, L"Комсомольск"}, + {39, 330, 693, L"Кременчуг"}, + {39, 330, 694, L"Лубны"}, + {39, 330, 695, L"Миргород"}, + {39, 330, 692, L"Полтава"}, + {39, 330, 2551, L"Другое"}, + {39, 331, 696, L"Здолбунов"}, + {39, 331, 697, L"Ровно"}, + {39, 331, 3361, L"Сарны"}, + {39, 331, 2550, L"Другое"}, + {39, 332, 3356, L"Бурынь"}, + {39, 332, 698, L"Конотоп"}, + {39, 332, 700, L"Ромны"}, + {39, 332, 699, L"Сумы"}, + {39, 332, 701, L"Шостка"}, + {39, 332, 2549, L"Другое"}, + {39, 333, 702, L"Бережаны"}, + {39, 333, 3171, L"Борщев"}, + {39, 333, 703, L"Тернополь"}, + {39, 333, 704, L"Чортков"}, + {39, 333, 2548, L"Другое"}, + {39, 334, 705, L"Изюм"}, + {39, 334, 3346, L"Купянск"}, + {39, 334, 3351, L"Купянск"}, + {39, 334, 706, L"Лозовая"}, + {39, 334, 708, L"Мерефа"}, + {39, 334, 707, L"Харьков"}, + {39, 334, 709, L"Чугуев"}, + {39, 334, 2547, L"Другое"}, + {39, 335, 710, L"Геническ"}, + {39, 335, 711, L"Каховка"}, + {39, 335, 712, L"Новая Каховка"}, + {39, 335, 3280, L"Скадовск"}, + {39, 335, 713, L"Херсон"}, + {39, 335, 2546, L"Другое"}, + {39, 336, 714, L"Каменец-Подольский"}, + {39, 336, 715, L"Красилов"}, + {39, 336, 2941, L"Нетишин"}, + {39, 336, 716, L"Полонное"}, + {39, 336, 3120, L"Сатанов"}, + {39, 336, 2943, L"Славута"}, + {39, 336, 717, L"Хмельницкий"}, + {39, 336, 3155, L"Чемировцы"}, + {39, 336, 2542, L"Другое"}, + {39, 337, 3169, L"Золотоноша"}, + {39, 337, 3016, L"Канев"}, + {39, 337, 3333, L"Полонное"}, + {39, 337, 718, L"Умань"}, + {39, 337, 719, L"Христиновка"}, + {39, 337, 720, L"Черкассы"}, + {39, 337, 2545, L"Другое"}, + {39, 338, 721, L"Нежин"}, + {39, 338, 722, L"Прилуки"}, + {39, 338, 723, L"Чернигов"}, + {39, 338, 2544, L"Другое"}, + {39, 339, 724, L"Черновцы"}, + {39, 339, 2543, L"Другое"}, + {340, 342, 725, L"Барановичи"}, + {340, 342, 726, L"Белоозерск"}, + {340, 342, 727, L"Береза"}, + {340, 342, 728, L"Брест"}, + {340, 342, 3172, L"Дрогичин"}, + {340, 342, 729, L"Кобрин"}, + {340, 342, 730, L"Ляховичи"}, + {340, 342, 731, L"Малорита"}, + {340, 342, 732, L"Пинск"}, + {340, 342, 2538, L"Другое"}, + {340, 343, 733, L"Браслав"}, + {340, 343, 735, L"Витебск"}, + {340, 343, 734, L"Новолукомоль"}, + {340, 343, 736, L"Новополоцк"}, + {340, 343, 737, L"Орша"}, + {340, 343, 738, L"Толочин"}, + {340, 343, 2537, L"Другое"}, + {340, 344, 739, L"Гомель"}, + {340, 344, 740, L"Жлобин"}, + {340, 344, 741, L"Мозырь"}, + {340, 344, 742, L"Речица"}, + {340, 344, 743, L"Рогачев"}, + {340, 344, 744, L"Светлогорск"}, + {340, 344, 2536, L"Другое"}, + {340, 345, 745, L"Волковыск"}, + {340, 345, 746, L"Гродно"}, + {340, 345, 747, L"Лида"}, + {340, 345, 3244, L"Слоним"}, + {340, 345, 748, L"Сморгонь"}, + {340, 345, 2535, L"Другое"}, + {340, 346, 3149, L"Березино"}, + {340, 346, 749, L"Борисов"}, + {340, 346, 750, L"Вилейка"}, + {340, 346, 751, L"Жодино"}, + {340, 346, 752, L"Марьина Горка"}, + {340, 346, 753, L"Молодечно"}, + {340, 346, 2896, L"Слуцк"}, + {340, 346, 754, L"Смолевичи"}, + {340, 346, 755, L"Солигорск"}, + {340, 346, 756, L"Червень"}, + {340, 346, 2534, L"Другое"}, + {340, 347, 757, L"Бобруйск"}, + {340, 347, 758, L"Могилев"}, + {340, 347, 759, L"Осиповичи"}, + {340, 347, 2533, L"Другое"}, + {0, 0, 0, NULL} +}; + + + + + +#endif // !defined(AFX_MRA_PLACES_H__INCLUDED_) \ No newline at end of file diff --git a/MRA/MraPopUp.cpp b/MRA/MraPopUp.cpp new file mode 100644 index 0000000..9a2fac8 --- /dev/null +++ b/MRA/MraPopUp.cpp @@ -0,0 +1,308 @@ +#include "Mra.h" +#include "MraPopUp.h" + + +INT_PTR CALLBACK MraPopupDlgProcOpts (HWND hWndDlg, UINT msg, WPARAM wParam, LPARAM lParam); +LRESULT CALLBACK MraPopupDlgProc (HWND hWndDlg, UINT msg, WPARAM wParam, LPARAM lParam); + + + +#define POPUPS_TYPES_COUNT 7 +static LPCWSTR lpcwszPopupsTypes[]= +{ + L"None", + L"Debug", + L"Information", + L"Question", + L"Warning", + L"Error", + L"NewMail", + NULL +}; + + + + +int MraPopupOptInit(WPARAM wParam,LPARAM lParam) +{ + if (ServiceExists(MS_POPUP_ADDPOPUP)) { + OPTIONSDIALOGPAGE odp = {0}; + + odp.cbSize = sizeof(odp); + odp.position = 100000000; + odp.hInstance = masMraSettings.hInstance; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_POPUPS); + odp.ptszTitle = PROTOCOL_NAMEW; + odp.ptszGroup = TranslateW(L"Popups"); + odp.groupPosition = 900000000; + odp.flags = (ODPF_BOLDGROUPS | ODPF_UNICODE); + odp.nIDBottomSimpleControl = IDC_GROUPMAIN; + odp.pfnDlgProc = MraPopupDlgProcOpts; + CallService(MS_OPT_ADDPAGE, wParam, (LPARAM)&odp); + } +return(0); +} + + +INT_PTR CALLBACK MraPopupDlgProcOpts(HWND hWndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg){ + case WM_INITDIALOG: + { + HWND hWndCombo = GetDlgItem(hWndDlg, IDC_COMBO_POPUP_TYPE); + DWORD dwItem; + + SendMessage(hWndCombo, CB_RESETCONTENT, 0, 0); + for (SIZE_T i = 0; i < POPUPS_TYPES_COUNT; i++) { + dwItem=SendMessage(hWndCombo, CB_ADDSTRING, 0, (LPARAM)TranslateW(lpcwszPopupsTypes[i])); + SendMessage(hWndCombo, CB_SETITEMDATA, dwItem, i); + } + SendMessage(hWndCombo, CB_SETCURSEL, 0, 0); + SendMessage(hWndDlg, WM_COMMAND, MAKELONG(IDC_COMBO_POPUP_TYPE, CBN_SELCHANGE), 0); + + TranslateDialogDefault(hWndDlg); + } + return(TRUE); + case WM_COMMAND: + switch(LOWORD(wParam)){ + case IDC_COMBO_POPUP_TYPE: + if (HIWORD(wParam) == CBN_SELCHANGE) { + BOOL bEnabled, bUseWinColors; + char szBuff[MAX_PATH]; + DWORD dwType = GET_CURRENT_COMBO_DATA(hWndDlg, IDC_COMBO_POPUP_TYPE); + + bEnabled = GetBit(DB_Mra_GetDword(NULL, "PopupsEventFilter", MRA_DEFAULT_POPUPS_EVENT_FILTER), dwType); + CHECK_DLG_BUTTON(hWndDlg, IDC_CHK_ENABLE, bEnabled); + + mir_snprintf(szBuff, SIZEOF(szBuff), "PopupType%SUseWinColors", lpcwszPopupsTypes[dwType]); + bUseWinColors = DB_Mra_GetByte(NULL, szBuff, MRA_DEFAULT_POPUP_USE_WIN_COLORS); + CHECK_DLG_BUTTON(hWndDlg, IDC_CHK_USE_WIN_COLORS, bUseWinColors); + EnableWindow(GetDlgItem(hWndDlg, IDC_CHK_USE_WIN_COLORS), bEnabled); + + mir_snprintf(szBuff, SIZEOF(szBuff), "PopupType%SColorBack", lpcwszPopupsTypes[dwType]); + SEND_DLG_ITEM_MESSAGE(hWndDlg, IDC_POPUP_BACKCOLOR, CPM_SETCOLOUR, 0, DB_Mra_GetDword(NULL, szBuff, MRA_DEFAULT_POPUP_COLOR_BACK)); + EnableWindow(GetDlgItem(hWndDlg, IDC_POPUP_BACKCOLOR),(bEnabled && bUseWinColors == FALSE)); + + mir_snprintf(szBuff, SIZEOF(szBuff), "PopupType%SColorText", lpcwszPopupsTypes[dwType]); + SEND_DLG_ITEM_MESSAGE(hWndDlg, IDC_POPUP_TEXTCOLOR, CPM_SETCOLOUR, 0, DB_Mra_GetDword(NULL, szBuff, MRA_DEFAULT_POPUP_COLOR_TEXT)); + EnableWindow(GetDlgItem(hWndDlg, IDC_POPUP_TEXTCOLOR), (bEnabled && bUseWinColors == FALSE)); + + mir_snprintf(szBuff, SIZEOF(szBuff), "PopupType%STimeout", lpcwszPopupsTypes[dwType]); + SetDlgItemInt(hWndDlg, IDC_POPUP_TIMEOUT, DB_Mra_GetDword(NULL, szBuff, MRA_DEFAULT_POPUP_TIMEOUT), FALSE); + EnableWindow(GetDlgItem(hWndDlg, IDC_POPUP_TIMEOUT), bEnabled); + } + break; + case IDC_PREVIEW: + { + for (SIZE_T i = 0; i < POPUPS_TYPES_COUNT; i++) { + MraPopupShowFromAgentW(i, 0, TranslateW(lpcwszPopupsTypes[i])); + } + } + break; + case IDC_CHK_ENABLE: + case IDC_CHK_USE_WIN_COLORS: + { + BOOL bEnabled, bUseWinColors; + + bEnabled = IS_DLG_BUTTON_CHECKED(hWndDlg, IDC_CHK_ENABLE); + bUseWinColors = IS_DLG_BUTTON_CHECKED(hWndDlg, IDC_CHK_USE_WIN_COLORS); + + EnableWindow(GetDlgItem(hWndDlg, IDC_CHK_USE_WIN_COLORS), bEnabled); + EnableWindow(GetDlgItem(hWndDlg, IDC_POPUP_BACKCOLOR), (bEnabled && bUseWinColors == FALSE)); + EnableWindow(GetDlgItem(hWndDlg, IDC_POPUP_TEXTCOLOR), (bEnabled && bUseWinColors == FALSE)); + EnableWindow(GetDlgItem(hWndDlg, IDC_POPUP_TIMEOUT), bEnabled); + } + default: + if ((LOWORD(wParam) == IDC_POPUP_TIMEOUT) && (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) ) + return(FALSE); + SendMessage(GetParent(hWndDlg), PSM_CHANGED, 0, 0); + } + break; + case WM_NOTIFY: + switch(((LPNMHDR)lParam)->code){ + case PSN_APPLY: + { + char szBuff[MAX_PATH]; + DWORD dwPopupsEventFilter, dwType = GET_CURRENT_COMBO_DATA(hWndDlg, IDC_COMBO_POPUP_TYPE); + + dwPopupsEventFilter = DB_Mra_GetDword(NULL, "PopupsEventFilter", MRA_DEFAULT_POPUPS_EVENT_FILTER); + if (IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_CHK_ENABLE)) { + dwPopupsEventFilter |= (1<PluginData) == MRA_POPUP_TYPE_EMAIL_STATUS && masMraSettings.hWndEMailPopupStatus) { + // 1: PUDeletePopUp(hWndDlg); + // 1: PUAddPopUpW((POPUPDATAW*)dwParam); + // 2: PUChangeW(masMraSettings.hWndEMailPopupStatus,(POPUPDATAW*)dwParam); //- crash :/ + PUChangeTextW(masMraSettings.hWndEMailPopupStatus,((POPUPDATAW*)dwParam)->lpwzText); + }else{ + PUAddPopUpW((POPUPDATAW*)dwParam); + } + + MEMFREE(dwParam); + +} + +///////////////////////////////////////////////////////////////////////////////////////// +// Popup plugin window proc +LRESULT CALLBACK MraPopupDlgProc(HWND hWndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg){ + case UM_INITPOPUP: + if ((SIZE_T)PUGetPluginData(hWndDlg) == MRA_POPUP_TYPE_EMAIL_STATUS) { + // update/load avatar + MraAvatarsQueueGetAvatarSimple(masMraSettings.hAvatarsQueueHandle, GAIF_FORCE, PUGetContact(hWndDlg), 0); + + // delete old email popup + if (masMraSettings.hWndEMailPopupStatus) + PUDeletePopUp(masMraSettings.hWndEMailPopupStatus); + + masMraSettings.hWndEMailPopupStatus = hWndDlg; + } + break; + case WM_COMMAND: + if (HIWORD(wParam) == STN_CLICKED) { //It was a click on the Popup. + if ((SIZE_T)PUGetPluginData(hWndDlg) == MRA_POPUP_TYPE_EMAIL_STATUS) + { + CallProtoService(PROTOCOL_NAMEA, MRA_GOTO_INBOX, 0, 0); + masMraSettings.hWndEMailPopupStatus = NULL; + } + } + PUDeletePopUp(hWndDlg); + break; + case WM_CONTEXTMENU: + if ((SIZE_T)PUGetPluginData(hWndDlg) == MRA_POPUP_TYPE_EMAIL_STATUS) + masMraSettings.hWndEMailPopupStatus = NULL; + PUDeletePopUp(hWndDlg); + break; + case UM_FREEPLUGINDATA: + if ((SIZE_T)PUGetPluginData(hWndDlg) == MRA_POPUP_TYPE_EMAIL_STATUS) + masMraSettings.hWndEMailPopupStatus = NULL; + break; + } +return(DefWindowProc(hWndDlg, msg, wParam, lParam)); +} + + +void MraPopupShowFromContactW(HANDLE hContact, DWORD dwType, DWORD dwFlags, LPWSTR lpszMessage) +{ + WCHAR szNick[MAX_EMAIL_LEN], szEMail[MAX_EMAIL_LEN], szTitle[MAX_CONTACTNAME]; + + DB_Mra_GetStaticStringW(hContact, "Nick", szNick, SIZEOF(szNick), NULL); + DB_Mra_GetStaticStringW(hContact, "e-mail", szEMail, SIZEOF(szEMail), NULL); + if (hContact) { + mir_sntprintf(szTitle, SIZEOF(szTitle), L"%s <%s>",szNick, szEMail); + }else{ + mir_sntprintf(szTitle, SIZEOF(szTitle), L"%s: %s <%s>", PROTOCOL_DISPLAY_NAMEW, szNick, szEMail); + } + MraPopupShowW(hContact, dwType, dwFlags, szTitle, lpszMessage); +} + + +void MraPopupShowW(HANDLE hContact, DWORD dwType, DWORD dwFlags, LPWSTR lpszTitle, LPWSTR lpszMessage) +{ + if (DB_Mra_GetByte(NULL,"PopupsEnabled", MRA_DEFAULT_POPUPS_ENABLED)) + if (GetBit(DB_Mra_GetDword(NULL,"PopupsEventFilter", MRA_DEFAULT_POPUPS_EVENT_FILTER), dwType)) + if (ServiceExists(MS_POPUP_ADDPOPUPW)) + { + BOOL bUseWinColors; + char szBuff[MAX_PATH]; + POPUPDATAW *ppd = (POPUPDATAW*)MEMALLOC(sizeof(POPUPDATAW)); + + //if (ServiceExists(MS_POPUP2_SHOW)==FALSE)// yapp used + if (dwType == MRA_POPUP_TYPE_EMAIL_STATUS && masMraSettings.hWndEMailPopupStatus) { + // delete old email popup + PUDeletePopUp(masMraSettings.hWndEMailPopupStatus); + masMraSettings.hWndEMailPopupStatus = NULL; + } + + // load icon + switch(dwType){ + case MRA_POPUP_TYPE_NONE:// proto icon + ppd->lchIcon = (HICON)LoadImage(masMraSettings.hInstance, MAKEINTRESOURCE(IDI_MRA), IMAGE_ICON, 0, 0, LR_SHARED); + break; + case MRA_POPUP_TYPE_DEBUG:// IDI_APPLICATION + ppd->lchIcon = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED); + break; + case MRA_POPUP_TYPE_INFORMATION:// IDI_INFORMATION + ppd->lchIcon = (HICON)LoadImage(NULL, IDI_INFORMATION, IMAGE_ICON, 0, 0, LR_SHARED); + break; + case MRA_POPUP_TYPE_QUESTION:// IDI_QUESTION + ppd->lchIcon = (HICON)LoadImage(NULL, IDI_QUESTION, IMAGE_ICON, 0, 0, LR_SHARED); + break; + case MRA_POPUP_TYPE_WARNING:// IDI_WARNING + ppd->lchIcon = (HICON)LoadImage(NULL, IDI_WARNING, IMAGE_ICON, 0, 0, LR_SHARED); + break; + case MRA_POPUP_TYPE_ERROR:// IDI_ERROR + ppd->lchIcon = (HICON)LoadImage(NULL, IDI_ERROR, IMAGE_ICON, 0, 0, LR_SHARED); + break; + case MRA_POPUP_TYPE_EMAIL_STATUS: + ppd->lchIcon = (HICON)LoadImage(masMraSettings.hInstance, MAKEINTRESOURCE(IDI_MAIL_NOTIFY), IMAGE_ICON, 0, 0, LR_SHARED); + break; + } + + ppd->lchContact = hContact; + if (lpszTitle) + lstrcpynW(ppd->lpwzContactName, lpszTitle, SIZEOF(ppd->lpwzContactName)); + if (lpszMessage) + lstrcpynW(ppd->lpwzText, lpszMessage, SIZEOF(ppd->lpwzText)); + ppd->PluginWindowProc = (WNDPROC)MraPopupDlgProc; + ppd->PluginData = (LPVOID)dwType; + + mir_snprintf(szBuff, SIZEOF(szBuff), "PopupType%SUseWinColors", lpcwszPopupsTypes[dwType]); + bUseWinColors = DB_Mra_GetByte(NULL, szBuff, MRA_DEFAULT_POPUP_USE_WIN_COLORS); + if (bUseWinColors) { + ppd->colorBack = GetSysColor(COLOR_BTNFACE); + ppd->colorText = GetSysColor(COLOR_WINDOWTEXT); + }else{ + mir_snprintf(szBuff, SIZEOF(szBuff), "PopupType%SColorBack", lpcwszPopupsTypes[dwType]); + ppd->colorBack = DB_Mra_GetDword(NULL, szBuff, MRA_DEFAULT_POPUP_COLOR_BACK); + + mir_snprintf(szBuff, SIZEOF(szBuff), "PopupType%SColorText", lpcwszPopupsTypes[dwType]); + ppd->colorText = DB_Mra_GetDword(NULL, szBuff, MRA_DEFAULT_POPUP_COLOR_TEXT); + } + + mir_snprintf(szBuff, SIZEOF(szBuff), "PopupType%STimeout", lpcwszPopupsTypes[dwType]); + ppd->iSeconds = DB_Mra_GetDword(NULL, szBuff, MRA_DEFAULT_POPUP_TIMEOUT); + + //if (MraAPCQueueAdd(MraPopupThreadMarandaCallback,&masMraSettings.ffmtAPCQueue,(ULONG_PTR)ppd)!=NO_ERROR) + {// sync call + MraPopupThreadMarandaCallback((ULONG_PTR)ppd); + } + }else{ + if (dwFlags & MRA_POPUP_ALLOW_MSGBOX) + MessageBox(NULL, lpszMessage, lpszTitle, MB_OK+(dwType == MRA_POPUP_TYPE_WARNING)?MB_ICONERROR:MB_ICONINFORMATION); + } +} + + + diff --git a/MRA/MraPopUp.h b/MRA/MraPopUp.h new file mode 100644 index 0000000..5b768cd --- /dev/null +++ b/MRA/MraPopUp.h @@ -0,0 +1,34 @@ +#if !defined(AFX_MRA_POPUP_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) +#define AFX_MRA_POPUP_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + +#define MRA_POPUP_ALLOW_MSGBOX 1 +#define MRA_POPUP_ALLOW_ENTER 2 + +#define MRA_POPUP_TYPE_NONE 0 // proto icon +#define MRA_POPUP_TYPE_DEBUG 1 // IDI_APPLICATION +#define MRA_POPUP_TYPE_INFORMATION 2 // IDI_INFORMATION +#define MRA_POPUP_TYPE_QUESTION 3 // IDI_QUESTION +#define MRA_POPUP_TYPE_WARNING 4 // IDI_WARNING +#define MRA_POPUP_TYPE_ERROR 5 // IDI_ERROR +#define MRA_POPUP_TYPE_EMAIL_STATUS 6 // + + +int MraPopupOptInit (WPARAM wParam,LPARAM lParam); + +void MraPopupShowFromContactW (HANDLE hContact,DWORD dwType,DWORD dwFlags,LPWSTR lpszMessage); +#define MraPopupShowFromAgentW(dwType,dwFlags,lpszMessage) MraPopupShowFromContactW(NULL,dwType,dwFlags,lpszMessage) + +void MraPopupShowW (HANDLE hContact,DWORD dwType,DWORD dwFlags,LPWSTR lpszTitle,LPWSTR lpszMessage); + + + + + +#endif // !defined(AFX_MRA_POPUP_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/MRA/MraRTFMsg.cpp b/MRA/MraRTFMsg.cpp new file mode 100644 index 0000000..e0c3a1d --- /dev/null +++ b/MRA/MraRTFMsg.cpp @@ -0,0 +1,341 @@ +#include "Mra.h" +#include "MraRTFMsg.h" + + + +#define COLORTABLE_COUNT 8 +#define RTF_COLORTBLCOLOURS "\\red255\\green0\\blue0;\\red0\\green255\\blue0;\\red0\\green0\\blue255;\\red255\\green0\\blue255;\\red255\\green255\\blue0;\\red0\\green255\\blue255;\\red0\\green0\\blue0;\\red255\\green255\\blue255;" +static const LPSTR lpszColours[COLORTABLE_COUNT]= +{ + "red", + "green", + "blue", + "magenta", + "yellow", + "cyan", + "black", + "white" +}; + + + +#define CRLF "\r\n" +#define PAR "\\par " + + +#define BB_COLOR_TAG "[color=" +#define SIMBOLS_COUNT 19 +static const LPSTR lpszSimbols[SIMBOLS_COUNT]= +{ + "\r\n", + "\\", + "{", + "}", + "[b]", + "[/b]", + "[u]", + "[/u]", + "[i]", + "[/i]", + "[/color]", + "[color=red]", + "[color=green]", + "[color=blue]", + "[color=magenta]", + "[color=yellow]", + "[color=cyan]", + "[color=black]", + "[color=white]", +}; + +static const SIZE_T dwcSimbolsCount[SIMBOLS_COUNT]= +{ + 2, + 1, + 1, + 1, + 3, + 4, + 3, + 4, + 3, + 4, + 8, + 11, + 13, + 12, + 15, + 14, + 12, + 13, + 13, +}; + +static const LPSTR lpszRTFTags[SIMBOLS_COUNT]= +{ + "\\par", + "\\\\", + "\\{", + "\\}", + "{\\b ", + "}", + "{\\ul ", + "}", + "{\\i ", + "}", + "}", + "{\\cf2 ", + "{\\cf3 ", + "{\\cf4 ", + "{\\cf5 ", + "{\\cf6 ", + "{\\cf7 ", + "{\\cf8 ", + "{\\cf9 ", +}; + +static const SIZE_T dwcRTFTagsCount[SIMBOLS_COUNT]= +{ + 4, + 2, + 2, + 2, + 4, + 1, + 5, + 1, + 4, + 1, + 1, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, +}; + + +DWORD MraTextToRTFData(LPSTR lpszMessage,SIZE_T dwMessageSize,LPSTR lpszMessageConverted,SIZE_T dwMessageConvertedBuffSize,SIZE_T *pdwMessageConvertedSize); + + +BOOL MraIsMessageFlashAnimation(LPWSTR lpwszMessage,SIZE_T dwMessageSize) +{ + BOOL bRet=FALSE; + LPWSTR lpwszFounded; + + dwMessageSize*=sizeof(WCHAR); + lpwszFounded=(LPWSTR)MemoryFind(0,lpwszMessage,dwMessageSize,L"id=flas",28); + if (lpwszFounded) + { + if (MemoryFind(((lpwszFounded-lpwszMessage)+32),lpwszMessage,dwMessageSize,L"'",18)) bRet=TRUE; + } +return(bRet); +} + + + +DWORD MraTextToRTFData(LPSTR lpszMessage,SIZE_T dwMessageSize,LPSTR lpszMessageConverted,SIZE_T dwMessageConvertedBuffSize,SIZE_T *pdwMessageConvertedSize) +{ + DWORD dwRetErrorCode=NO_ERROR; + + if (lpszMessage && dwMessageSize && lpszMessageConverted && dwMessageConvertedBuffSize) + { + BYTE tm,bCurByte; + LPSTR lpszMessageConvertedCur,lpszMessageConvertedMax; + SIZE_T i; + + lpszMessageConvertedCur=lpszMessageConverted; + lpszMessageConvertedMax=(lpszMessageConverted+dwMessageConvertedBuffSize); + for(i=0;(i3);i++) + { + //lpszMessageConvertedCur+=mir_snprintf(lpszMessageConvertedCur,8,"\\'%x",(*((BYTE*)lpszMessage+i))); + + (*((WORD*)lpszMessageConvertedCur))=(*((WORD*)"\\'")); + bCurByte=(*((BYTE*)lpszMessage+i)); + tm=(bCurByte>>4)&0xf; + lpszMessageConvertedCur[2]=(tm>9)? ('a'+tm-10):('0'+tm); + + tm=bCurByte&0xf; + lpszMessageConvertedCur[3]=(tm>9)? ('a'+tm-10):('0'+tm); + lpszMessageConvertedCur+=4; + (*((BYTE*)lpszMessageConvertedCur))=0; + } + if (pdwMessageConvertedSize) (*pdwMessageConvertedSize)=(lpszMessageConvertedCur-lpszMessageConverted); + }else{ + if (pdwMessageConvertedSize) (*pdwMessageConvertedSize)=0; + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraSybolsToRTFTags(DWORD dwFlags,LPSTR lpszMessage,SIZE_T dwMessageSize,LPSTR lpszMessageConverted,SIZE_T dwMessageConvertedBuffSize,SIZE_T *pdwMessageConvertedSize) +{ + DWORD dwRetErrorCode=NO_ERROR; + LPSTR lpszFounded[SIMBOLS_COUNT],lpszMessageConvertedCur,lpszMessageCur,lpszMessageCurPrev,lpszMessageConvertedMax; + SIZE_T i,dwFirstFoundedIndex=0,dwFoundedCount=0,dwMemPartToCopy; + +#ifdef _DEBUG //check table + for(i=0;i(lpszMessageConvertedCur+(dwMemPartToCopy+dwcRTFTagsCount[dwFirstFoundedIndex]))) + { + //memmove(lpszMessageConvertedCur,lpszMessageCurPrev,dwMemPartToCopy);lpszMessageConvertedCur+=dwMemPartToCopy; + MraTextToRTFData(lpszMessageCurPrev,dwMemPartToCopy,lpszMessageConvertedCur,(lpszMessageConvertedMax-lpszMessageConvertedCur),&i);lpszMessageConvertedCur+=i; + memmove(lpszMessageConvertedCur,lpszRTFTags[dwFirstFoundedIndex],dwcRTFTagsCount[dwFirstFoundedIndex]);lpszMessageConvertedCur+=dwcRTFTagsCount[dwFirstFoundedIndex]; + lpszMessageCurPrev=(lpszFounded[dwFirstFoundedIndex]+dwcSimbolsCount[dwFirstFoundedIndex]); + + for(i=0;i=(lpszMessageRTFCur+sizeof(PAR)+sizeof(CRLF)+2)) + { + memmove(lpszMessageRTFCur,PAR,sizeof(PAR));lpszMessageRTFCur+=(sizeof(PAR)-1); + memmove(lpszMessageRTFCur,CRLF,sizeof(CRLF));lpszMessageRTFCur+=(sizeof(CRLF)-1); + memmove(lpszMessageRTFCur,"}",2);lpszMessageRTFCur+=2; + if (pdwMessageRTFSize) (*pdwMessageRTFSize)=(lpszMessageRTFCur-lpszMessageRTF); + DebugPrintCRLFA(lpszMessageRTF); + dwRetErrorCode=NO_ERROR; + }else{ + if (pdwMessageRTFSize) (*pdwMessageRTFSize)=dwMessageRTFBuffSize+1024; + dwRetErrorCode=ERROR_BUFFER_OVERFLOW; + DebugBreak(); + } + } + MEMFREE(lpszMessage); + } + }else{ + if (pdwMessageRTFSize) (*pdwMessageRTFSize)=dwMessageSize; + dwRetErrorCode=ERROR_BUFFER_OVERFLOW; + DebugBreak(); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + + diff --git a/MRA/MraRTFMsg.h b/MRA/MraRTFMsg.h new file mode 100644 index 0000000..80d1989 --- /dev/null +++ b/MRA/MraRTFMsg.h @@ -0,0 +1,19 @@ +#if !defined(AFX_MRA_RTFMSG_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) +#define AFX_MRA_RTFMSG_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + + + +BOOL MraIsMessageFlashAnimation (LPWSTR lpwszMessage,SIZE_T dwMessageSize); +DWORD MraConvertToRTFW (LPWSTR lpwszMessage,SIZE_T dwMessageSize,LPSTR lpszMessageRTF,SIZE_T dwMessageRTFBuffSize,SIZE_T *pdwMessageRTFSize); + + + + +#endif // !defined(AFX_MRA_RTFMSG_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/MRA/MraSelectEMail.cpp b/MRA/MraSelectEMail.cpp new file mode 100644 index 0000000..ba9da3d --- /dev/null +++ b/MRA/MraSelectEMail.cpp @@ -0,0 +1,187 @@ +#include "Mra.h" +#include "MraSelectEMail.h" +#include "BuffToLowerCase.h" + + + +struct MraSelectEMailDlgData +{ + HANDLE hContact; + DWORD dwType; +}; + + + + +void AddContactEMailToListParam(HANDLE hContact,BOOL bMRAOnly,LPSTR lpszModule,LPSTR lpszValueName,HWND hWndList) +{ + CHAR szBuff[MAX_PATH],szEMail[MAX_EMAIL_LEN]; + WCHAR wszBuff[MAX_PATH]; + SIZE_T i,dwEMailSize; + + if(DB_GetStaticStringA(hContact,lpszModule,lpszValueName,szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + if (bMRAOnly==FALSE || IsEMailMR(szEMail,dwEMailSize)) + { + MultiByteToWideChar(MRA_CODE_PAGE,0,szEMail,(dwEMailSize+1),wszBuff,SIZEOF(wszBuff)); + if (SendMessage(hWndList,LB_FINDSTRING,-1,(LPARAM)wszBuff)==LB_ERR) SendMessage(hWndList,LB_ADDSTRING,0,(LPARAM)wszBuff); + } + } + + for (i=0;TRUE;i++) + { + mir_snprintf(szBuff,SIZEOF(szBuff),"%s%lu",lpszValueName,i); + if(DB_GetStaticStringA(hContact,lpszModule,szBuff,szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + if (bMRAOnly==FALSE || IsEMailMR(szEMail,dwEMailSize)) + { + MultiByteToWideChar(MRA_CODE_PAGE,0,szEMail,(dwEMailSize+1),wszBuff,SIZEOF(wszBuff)); + if (SendMessage(hWndList,LB_FINDSTRING,-1,(LPARAM)wszBuff)==LB_ERR) SendMessage(hWndList,LB_ADDSTRING,0,(LPARAM)wszBuff); + } + }else{ + if (i>EMAILS_MIN_COUNT) break; + } + } +} + + +INT_PTR CALLBACK MraSelectEMailDlgProc(HWND hWndDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + MraSelectEMailDlgData *pmrasemddDlgData=(MraSelectEMailDlgData*)GetWindowLongPtr(hWndDlg,GWLP_USERDATA); + + if (pmrasemddDlgData) + { + switch(message){ + case WM_CLOSE: + DestroyWindow(hWndDlg); + break; + case WM_DESTROY: + SetWindowLongPtr(hWndDlg,GWLP_USERDATA,(LONG_PTR)0); + MEMFREE(pmrasemddDlgData); + EndDialog(hWndDlg,NO_ERROR); + break; + case WM_COMMAND: + switch(LOWORD(wParam)){ + case IDC_LIST_EMAILS: + if (HIWORD(wParam)==LBN_DBLCLK) + { + //switch(pmrasemddDlgData->dwType){ + //case MRA_SELECT_EMAIL_TYPE_SEND_POSTCARD: + // break; + //case MRA_SELECT_EMAIL_TYPE_VIEW_ALBUM: + //case MRA_SELECT_EMAIL_TYPE_READ_BLOG: + SendMessage(hWndDlg,WM_COMMAND,MAKEWPARAM(IDOK,BN_CLICKED),(LPARAM)GetDlgItem(hWndDlg,IDOK)); + // break; + //} + } + break; + case IDOK: + { + CHAR szEMail[MAX_EMAIL_LEN]; + WCHAR wszBuff[MAX_PATH]; + SIZE_T dwEMailSize; + + dwEMailSize=SendMessage(GetDlgItem(hWndDlg,IDC_LIST_EMAILS),LB_GETTEXT,SendMessage(GetDlgItem(hWndDlg,IDC_LIST_EMAILS),LB_GETCURSEL,0,0),(LPARAM)wszBuff); + WideCharToMultiByte(MRA_CODE_PAGE,0,wszBuff,(dwEMailSize+1),szEMail,SIZEOF(szEMail),NULL,NULL); + BuffToLowerCase(szEMail,szEMail,dwEMailSize); + + switch(pmrasemddDlgData->dwType){ + case MRA_SELECT_EMAIL_TYPE_SEND_POSTCARD: + { + SIZE_T dwUrlSize; + CHAR szUrl[BUFF_SIZE_URL]; + dwUrlSize=mir_snprintf(szUrl,SIZEOF(szUrl),"http://cards.mail.ru/event.html?rcptname=%s&rcptemail=%s",GetContactNameA(pmrasemddDlgData->hContact),szEMail); + MraMPopSessionQueueAddUrl(masMraSettings.hMPopSessionQueue,szUrl,dwUrlSize); + } + break; + case MRA_SELECT_EMAIL_TYPE_VIEW_ALBUM: + MraMPopSessionQueueAddUrlAndEMail(masMraSettings.hMPopSessionQueue,MRA_FOTO_URL,sizeof(MRA_FOTO_URL),szEMail,dwEMailSize); + break; + case MRA_SELECT_EMAIL_TYPE_READ_BLOG: + MraMPopSessionQueueAddUrlAndEMail(masMraSettings.hMPopSessionQueue,MRA_BLOGS_URL,sizeof(MRA_BLOGS_URL),szEMail,dwEMailSize); + break; + case MRA_SELECT_EMAIL_TYPE_VIEW_VIDEO: + MraMPopSessionQueueAddUrlAndEMail(masMraSettings.hMPopSessionQueue,MRA_VIDEO_URL,sizeof(MRA_VIDEO_URL),szEMail,dwEMailSize); + break; + case MRA_SELECT_EMAIL_TYPE_ANSWERS: + MraMPopSessionQueueAddUrlAndEMail(masMraSettings.hMPopSessionQueue,MRA_ANSWERS_URL,sizeof(MRA_ANSWERS_URL),szEMail,dwEMailSize); + break; + case MRA_SELECT_EMAIL_TYPE_WORLD: + MraMPopSessionQueueAddUrlAndEMail(masMraSettings.hMPopSessionQueue,MRA_WORLD_URL,sizeof(MRA_WORLD_URL),szEMail,dwEMailSize); + break; + } + } + //break; + case IDCANCEL: + DestroyWindow(hWndDlg); + break; + default: + break; + } + break; + default: + break; + } + }else{ + pmrasemddDlgData=(MraSelectEMailDlgData*)lParam; + + if (message==WM_INITDIALOG) + { + HWND hWndList; + BOOL bMRAOnly; + LPSTR lpszProto; + + SetWindowLongPtr(hWndDlg,GWLP_USERDATA,(LONG_PTR)lParam); + hWndList=GetDlgItem(hWndDlg,IDC_LIST_EMAILS); + //SendMessage(hWndList,CB_RESETCONTENT,0,0); + + switch(pmrasemddDlgData->dwType){ + case MRA_SELECT_EMAIL_TYPE_SEND_POSTCARD: + // SetWindowLongPtr(hWndList,GWL_STYLE,(GetWindowLongPtr(hWndList,GWL_STYLE)|LBS_MULTIPLESEL)); + // SetWindowLongPtr(hWndList,GWL_STYLE,(GetWindowLongPtr(hWndList,GWL_STYLE)&~LBS_SORT)); + bMRAOnly=FALSE; + break; + case MRA_SELECT_EMAIL_TYPE_VIEW_ALBUM: + case MRA_SELECT_EMAIL_TYPE_READ_BLOG: + // SetWindowLongPtr(hWndList,GWL_STYLE,(LONG)(GetWindowLong(hWndList,GWL_STYLE)|LBS_NOSEL)); + bMRAOnly=TRUE; + break; + default: + bMRAOnly=FALSE; + break; + } + + if (pmrasemddDlgData->hContact) + { + lpszProto=(LPSTR)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)pmrasemddDlgData->hContact,0); + }else{ + lpszProto=PROTOCOL_NAMEA; + } + AddContactEMailToListParam(pmrasemddDlgData->hContact,bMRAOnly,lpszProto,"e-mail",hWndList); + AddContactEMailToListParam(pmrasemddDlgData->hContact,bMRAOnly,"UserInfo","e-mail",hWndList); + AddContactEMailToListParam(pmrasemddDlgData->hContact,bMRAOnly,"UserInfo","Mye-mail",hWndList); + AddContactEMailToListParam(pmrasemddDlgData->hContact,bMRAOnly,"UserInfo","Companye-mail",hWndList); + AddContactEMailToListParam(pmrasemddDlgData->hContact,bMRAOnly,"UserInfo","MyCompanye-mail",hWndList); + + TranslateDialogDefault(hWndDlg); + } + + //return(DefWindowProc(hWndDlg,message,wParam,lParam)); + } +return(FALSE); +} + + +DWORD MraSelectEMailDlgShow(HANDLE hContact,DWORD dwType) +{ + MraSelectEMailDlgData *pmrasemddDlgData; + + pmrasemddDlgData=(MraSelectEMailDlgData*)MEMALLOC(sizeof(MraSelectEMailDlgData)); + if (pmrasemddDlgData) + { + pmrasemddDlgData->hContact=hContact; + pmrasemddDlgData->dwType=dwType; + DialogBoxParam(masMraSettings.hInstance,MAKEINTRESOURCE(IDD_DIALOG_SELECT_EMAIL),NULL,MraSelectEMailDlgProc,(LPARAM)pmrasemddDlgData); + } +return(0); +} \ No newline at end of file diff --git a/MRA/MraSelectEMail.h b/MRA/MraSelectEMail.h new file mode 100644 index 0000000..d1ad657 --- /dev/null +++ b/MRA/MraSelectEMail.h @@ -0,0 +1,25 @@ +#if !defined(AFX_MRA_SELECT_EMAIL_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) +#define AFX_MRA_SELECT_EMAIL_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + +#define MRA_SELECT_EMAIL_TYPE_SEND_POSTCARD 1 +#define MRA_SELECT_EMAIL_TYPE_VIEW_ALBUM 2 +#define MRA_SELECT_EMAIL_TYPE_READ_BLOG 3 +#define MRA_SELECT_EMAIL_TYPE_VIEW_VIDEO 4 +#define MRA_SELECT_EMAIL_TYPE_ANSWERS 5 +#define MRA_SELECT_EMAIL_TYPE_WORLD 6 + + +DWORD MraSelectEMailDlgShow(HANDLE hContact,DWORD dwType); + + + + + +#endif // !defined(AFX_MRA_SELECT_EMAIL_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/MRA/MraSendCommand.cpp b/MRA/MraSendCommand.cpp new file mode 100644 index 0000000..f27ef57 --- /dev/null +++ b/MRA/MraSendCommand.cpp @@ -0,0 +1,878 @@ +#include "Mra.h" +#include "MraSendCommand.h" +#include "MraRTFMsg.h" +#include "proto.h" + + + + + +void SetUL (LPBYTE *plpBuff,DWORD dwData); +void SetUIDL (LPBYTE *plpBuff,DWORDLONG dwData); +void SetGUID (LPBYTE *plpBuff,MRA_GUID guidData); +void SetLPS (LPBYTE *plpBuff,LPSTR lpszData,DWORD dwSize); +void SetLPSW (LPBYTE *plpBuff,LPWSTR lpwszData,DWORD dwSize); +void SetLPSWtoA (LPBYTE *plpBuff,LPWSTR lpwszData,DWORD dwSize); +void SetLPSLowerCase (LPBYTE *plpBuff,LPSTR lpszData,DWORD dwSize); +void SetLPSLowerCaseW (LPBYTE *plpBuff,LPWSTR lpwszData,DWORD dwSize); + + + + + + +DWORD MraSendCommand_MessageW(BOOL bAddToQueue,HANDLE hContact,DWORD dwAckType,DWORD dwFlags,LPSTR lpszEMail,SIZE_T dwEMailSize,LPWSTR lpwszMessage,SIZE_T dwMessageSize,LPBYTE lpbMultiChatData,SIZE_T dwMultiChatDataSize) +{// Сообщение + DWORD dwRet=0; + LPBYTE lpbData,lpbDataCurrent; + LPSTR lpszMessageConverted=(LPSTR)lpwszMessage; + LPSTR lpszMessageRTF=NULL; + SIZE_T dwMessageConvertedSize=(dwMessageSize*sizeof(WCHAR)),dwMessageRTFSize=0; + + + if (MraIsMessageFlashAnimation(lpwszMessage,dwMessageSize)) dwFlags|=MESSAGE_FLAG_FLASH; + + if (dwFlags&MESSAGE_FLAG_AUTHORIZE) + {// pack auth message + LPBYTE lpbAuthMsgBuff; + SIZE_T dwMessageConvertedBuffSize=(((((dwMessageSize*sizeof(WCHAR))+1024)+2)/3)*4); + + lpszMessageConverted=(LPSTR)MEMALLOC(dwMessageConvertedBuffSize); + lpbAuthMsgBuff=(LPBYTE)MEMALLOC(((dwMessageSize*sizeof(WCHAR))+1024)); + if (lpszMessageConverted && lpbAuthMsgBuff) + { + lpbDataCurrent=lpbAuthMsgBuff; + SetUL(&lpbDataCurrent,2); + SetLPSW(&lpbDataCurrent,NULL,0);//***deb possible nick here + SetLPSW(&lpbDataCurrent,lpwszMessage,dwMessageSize); + + BASE64EncodeUnSafe(lpbAuthMsgBuff,(lpbDataCurrent-lpbAuthMsgBuff),lpszMessageConverted,dwMessageConvertedBuffSize,&dwMessageConvertedSize); + }else{ + MEMFREE(lpszMessageConverted); + lpszMessageConverted=(LPSTR)lpwszMessage; + } + MEMFREE(lpbAuthMsgBuff); + }else + if (dwFlags&MESSAGE_FLAG_FLASH) + {// особая упаковка для флеша + if (masMraSettings.lpfnCompress2)// only if func exist + { + SIZE_T dwRFTBuffSize=(((dwMessageSize*sizeof(WCHAR))*4)+8192),dwRTFDataSize; + LPBYTE lpbRTFData; + + dwFlags|=MESSAGE_FLAG_RTF; + lpszMessageRTF=(LPSTR)MEMALLOC(dwRFTBuffSize); + lpbRTFData=(LPBYTE)MEMALLOC(dwRFTBuffSize); + if (lpszMessageRTF && lpbRTFData) + { + DWORD dwBackColour; + + dwBackColour=DB_Mra_GetDword(NULL,"RTFBackgroundColour",MRA_DEFAULT_RTF_BACKGROUND_COLOUR); + lpbDataCurrent=(LPBYTE)lpszMessageRTF; + + WideCharToMultiByte(MRA_CODE_PAGE,0,lpwszMessage,dwMessageSize,(LPSTR)lpbRTFData,dwRFTBuffSize,NULL,NULL); + + SetUL(&lpbDataCurrent,4); + SetLPS(&lpbDataCurrent,(LPSTR)lpbRTFData,dwMessageSize);// сообщение что у собеседника плохая версия :) + SetLPS(&lpbDataCurrent,(LPSTR)&dwBackColour,sizeof(DWORD));// цвет фона + SetLPS(&lpbDataCurrent,(LPSTR)lpbRTFData,dwMessageSize);// сам мульт ANSI + SetLPSW(&lpbDataCurrent,lpwszMessage,dwMessageSize);// сам мульт UNICODE + + dwRTFDataSize=dwRFTBuffSize; + if ((PCOMPRESS2(masMraSettings.lpfnCompress2))(lpbRTFData,(DWORD*)&dwRTFDataSize,(LPBYTE)lpszMessageRTF,(lpbDataCurrent-(LPBYTE)lpszMessageRTF),Z_BEST_COMPRESSION)==Z_OK) + { + BASE64EncodeUnSafe(lpbRTFData,dwRTFDataSize,lpszMessageRTF,dwRFTBuffSize,&dwMessageRTFSize); + } + } + MEMFREE(lpbRTFData); + } + }else// standart message + if ((dwFlags&(MESSAGE_FLAG_CONTACT|MESSAGE_FLAG_NOTIFY|MESSAGE_FLAG_SMS))==0) + {// Only if message is simple text message or RTF or ALARM + if (dwFlags&MESSAGE_FLAG_RTF)// add RFT part + if (masMraSettings.lpfnCompress2)// only if func exist + {// обычный ртф + SIZE_T dwRFTBuffSize=(((dwMessageSize*sizeof(WCHAR))*16)+8192),dwRTFDataSize; + LPBYTE lpbRTFData; + + lpszMessageRTF=(LPSTR)MEMALLOC(dwRFTBuffSize); + lpbRTFData=(LPBYTE)MEMALLOC(dwRFTBuffSize); + if (lpszMessageRTF && lpbRTFData) + { + if (MraConvertToRTFW(lpwszMessage,dwMessageSize,(LPSTR)lpbRTFData,dwRFTBuffSize,&dwRTFDataSize)==NO_ERROR) + { + DWORD dwBackColour; + + dwBackColour=DB_Mra_GetDword(NULL,"RTFBackgroundColour",MRA_DEFAULT_RTF_BACKGROUND_COLOUR); + lpbDataCurrent=(LPBYTE)lpszMessageRTF; + + SetUL(&lpbDataCurrent,2); + SetLPS(&lpbDataCurrent,(LPSTR)lpbRTFData,dwRTFDataSize); + SetLPS(&lpbDataCurrent,(LPSTR)&dwBackColour,sizeof(DWORD)); + + dwRTFDataSize=dwRFTBuffSize; + if ((PCOMPRESS2(masMraSettings.lpfnCompress2))(lpbRTFData,(DWORD*)&dwRTFDataSize,(LPBYTE)lpszMessageRTF,(lpbDataCurrent-(LPBYTE)lpszMessageRTF),Z_BEST_COMPRESSION)==Z_OK) + { + BASE64EncodeUnSafe(lpbRTFData,dwRTFDataSize,lpszMessageRTF,dwRFTBuffSize,&dwMessageRTFSize); + } + } + } + MEMFREE(lpbRTFData); + } + }//*/ + if (lpszMessageRTF==NULL || dwMessageRTFSize==0) dwFlags&=~(MESSAGE_FLAG_RTF|MESSAGE_FLAG_FLASH); + if (lpbMultiChatData==NULL || dwMultiChatDataSize==0) dwFlags&=~MESSAGE_FLAG_MULTICHAT; + + lpbData=(LPBYTE)MEMALLOC((sizeof(DWORD)+dwEMailSize+dwMessageConvertedSize+dwMessageRTFSize+dwMultiChatDataSize+128)); + if (lpbData) + { + lpbDataCurrent=lpbData; + SetUL(&lpbDataCurrent,dwFlags); + SetLPSLowerCase(&lpbDataCurrent,lpszEMail,dwEMailSize); + SetLPS(&lpbDataCurrent,lpszMessageConverted,dwMessageConvertedSize); + SetLPS(&lpbDataCurrent,lpszMessageRTF,dwMessageRTFSize); + if (dwFlags&MESSAGE_FLAG_MULTICHAT) SetLPS(&lpbDataCurrent,(LPSTR)lpbMultiChatData,dwMultiChatDataSize); + + if (bAddToQueue) + { + dwRet=MraSendQueueCMD(masMraSettings.hSendQueueHandle,0,hContact,dwAckType,(LPBYTE)lpwszMessage,(dwMessageSize*sizeof(WCHAR)),MRIM_CS_MESSAGE,lpbData,(lpbDataCurrent-lpbData)); + }else{ + dwRet=MraSendCMD(MRIM_CS_MESSAGE,lpbData,(lpbDataCurrent-lpbData)); + } + MEMFREE(lpbData); + } + if (lpszMessageConverted!=(LPSTR)lpwszMessage) MEMFREE(lpszMessageConverted); + MEMFREE(lpszMessageRTF); + +return(dwRet); +} + + +DWORD MraSendCommand_MessageAskW(DWORD dwMsgID,DWORD dwFlags,LPSTR lpszEMail,SIZE_T dwEMailSize,LPWSTR lpwszMessage,SIZE_T dwMessageSize,LPSTR lpwszMessageRTF,SIZE_T dwMessageRTFSize) +{// Подтверждение получения сообщения + DWORD dwRet=0; + + if (lpszEMail && dwEMailSize>4 && lpwszMessage && dwMessageSize) + { + LPBYTE lpbData,lpbDataCurrent; + + lpbData=(LPBYTE)MEMALLOC((sizeof(DWORD)+sizeof(DWORD)+dwEMailSize+dwMessageSize+dwMessageRTFSize+32)); + if (lpbData) + { + lpbDataCurrent=lpbData; + SetUL(&lpbDataCurrent,dwMsgID);//UL msg_id + SetUL(&lpbDataCurrent,dwFlags);//UL flags + SetLPSLowerCase(&lpbDataCurrent,lpszEMail,dwEMailSize);// LPS from e-mail ANSI + SetLPS(&lpbDataCurrent,(LPSTR)lpwszMessage,dwMessageSize);// LPS message UNICODE + if (dwFlags&MESSAGE_FLAG_RTF) + SetLPS(&lpbDataCurrent,(LPSTR)lpwszMessageRTF,dwMessageRTFSize);// LPS //rtf-formatted message (>=1.1) - MESSAGE_FLAG_RTF + + dwRet=MraSendCMD(MRIM_CS_MESSAGE_ACK,lpbData,(lpbDataCurrent-lpbData)); + //dwRet=MraSendCMD(MRIM_CS_MESSAGE,lpbData,(lpbDataCurrent-lpbData)); + MEMFREE(lpbData); + } + }else{ + DebugBreak(); + } +return(dwRet); +} + + +DWORD MraSendCommand_MessageRecv(LPSTR lpszFrom,SIZE_T dwFromSize,DWORD dwMsgID) +{// Подтверждение получения сообщения + DWORD dwRet=0; + + if (lpszFrom && dwFromSize>4) + { + LPBYTE lpbData,lpbDataCurrent; + + lpbData=(LPBYTE)MEMALLOC((dwFromSize+sizeof(DWORD)+32)); + if (lpbData) + { + lpbDataCurrent=lpbData; + SetLPSLowerCase(&lpbDataCurrent,lpszFrom,dwFromSize); + SetUL(&lpbDataCurrent,dwMsgID); + + dwRet=MraSendCMD(MRIM_CS_MESSAGE_RECV,lpbData,(lpbDataCurrent-lpbData)); + MEMFREE(lpbData); + } + }else{ + DebugBreak(); + } +return(dwRet); +} + + +DWORD MraSendCommand_AddContactW(HANDLE hContact,DWORD dwContactFlag,DWORD dwGroupID,LPSTR lpszEMail,SIZE_T dwEMailSize,LPWSTR lpwszCustomName,SIZE_T dwCustomNameSize,LPSTR lpszPhones,SIZE_T dwPhonesSize,LPWSTR lpwszAuthMessage,SIZE_T dwAuthMessageSize,DWORD dwActions) +{// Добавление нового контакта + DWORD dwRet=0; + + if (lpszEMail && dwEMailSize>4) + { + LPBYTE lpbData,lpbDataCurrent; + + lpbData=(LPBYTE)MEMALLOC((sizeof(DWORD)+sizeof(DWORD)+dwEMailSize+(dwCustomNameSize*sizeof(WCHAR))+dwPhonesSize+(((((dwAuthMessageSize*sizeof(WCHAR))+1024)+2)/3)*4)+32)+sizeof(DWORD)); + if (lpbData) + { + dwContactFlag|=CONTACT_FLAG_UNICODE_NAME; + + lpbDataCurrent=lpbData; + SetUL(&lpbDataCurrent,dwContactFlag); + SetUL(&lpbDataCurrent,dwGroupID); + SetLPSLowerCase(&lpbDataCurrent,lpszEMail,dwEMailSize); + SetLPSW(&lpbDataCurrent,lpwszCustomName,dwCustomNameSize); + SetLPS(&lpbDataCurrent,lpszPhones,dwPhonesSize); + {// pack auth message + LPBYTE lpbAuthMsgBuff,lpbAuthMessageConverted,lpbAuthDataCurrent; + SIZE_T dwAuthMessageConvertedBuffSize=(((((dwAuthMessageSize*sizeof(WCHAR))+1024)+2)/3)*4),dwAuthMessageConvertedSize=0; + + lpbAuthMessageConverted=(LPBYTE)MEMALLOC(dwAuthMessageConvertedBuffSize); + lpbAuthMsgBuff=(LPBYTE)MEMALLOC(((dwAuthMessageSize*sizeof(WCHAR))+1024)); + if (lpbAuthMessageConverted && lpbAuthMsgBuff) + { + lpbAuthDataCurrent=lpbAuthMsgBuff; + SetUL(&lpbAuthDataCurrent,2); + SetLPSW(&lpbAuthDataCurrent,NULL,0);//***deb possible nick here + SetLPSW(&lpbAuthDataCurrent,lpwszAuthMessage,dwAuthMessageSize); + + BASE64EncodeUnSafe(lpbAuthMsgBuff,(lpbAuthDataCurrent-lpbAuthMsgBuff),lpbAuthMessageConverted,dwAuthMessageConvertedBuffSize,&dwAuthMessageConvertedSize); + } + SetLPS(&lpbDataCurrent,(LPSTR)lpbAuthMessageConverted,dwAuthMessageConvertedSize); + MEMFREE(lpbAuthMsgBuff); + MEMFREE(lpbAuthMessageConverted); + } + SetUL(&lpbDataCurrent,dwActions); + + dwRet=MraSendQueueCMD(masMraSettings.hSendQueueHandle,0,hContact,ACKTYPE_ADDED,NULL,0,MRIM_CS_ADD_CONTACT,lpbData,(lpbDataCurrent-lpbData)); + MEMFREE(lpbData); + } + }else{ + //DebugBreak(); + } +return(dwRet); +} + + +DWORD MraSendCommand_ModifyContactW(HANDLE hContact,DWORD dwID,DWORD dwContactFlag,DWORD dwGroupID,LPSTR lpszEMail,SIZE_T dwEMailSize,LPWSTR lpwszCustomName,SIZE_T dwCustomNameSize,LPSTR lpszPhones,SIZE_T dwPhonesSize) +{// Изменение контакта + DWORD dwRet=0; + + LPBYTE lpbData,lpbDataCurrent; + + if (dwID!=-1) + { + lpbData=(LPBYTE)MEMALLOC((sizeof(DWORD)+sizeof(DWORD)+sizeof(DWORD)+dwEMailSize+(dwCustomNameSize*sizeof(WCHAR))+dwPhonesSize+32)); + if (lpbData) + { + dwContactFlag|=CONTACT_FLAG_UNICODE_NAME; + + lpbDataCurrent=lpbData; + SetUL(&lpbDataCurrent,dwID); + SetUL(&lpbDataCurrent,dwContactFlag); + SetUL(&lpbDataCurrent,dwGroupID); + SetLPSLowerCase(&lpbDataCurrent,lpszEMail,dwEMailSize); + SetLPSW(&lpbDataCurrent,lpwszCustomName,dwCustomNameSize); + SetLPS(&lpbDataCurrent,lpszPhones,dwPhonesSize); + + dwRet=MraSendQueueCMD(masMraSettings.hSendQueueHandle,0,hContact,ACKTYPE_ADDED,NULL,0,MRIM_CS_MODIFY_CONTACT,lpbData,(lpbDataCurrent-lpbData)); + MEMFREE(lpbData); + } + }else{ + DebugBreak(); + } +return(dwRet); +} + + +DWORD MraSendCommand_OfflineMessageDel(DWORDLONG dwMsgUIDL) +{// Удаление сохраненного сообщения +return(MraSendCMD(MRIM_CS_DELETE_OFFLINE_MESSAGE,&dwMsgUIDL,sizeof(DWORDLONG))); +} + + +DWORD MraSendCommand_Authorize(LPSTR lpszEMail,SIZE_T dwEMailSize) +{// Авторизация пользователя на добавление в контакт-лист + DWORD dwRet=0; + + if (lpszEMail && dwEMailSize>4) + { + LPBYTE lpbData,lpbDataCurrent; + + lpbData=(LPBYTE)MEMALLOC((dwEMailSize+32)); + if (lpbData) + { + lpbDataCurrent=lpbData; + SetLPSLowerCase(&lpbDataCurrent,lpszEMail,dwEMailSize); + + dwRet=MraSendCMD(MRIM_CS_AUTHORIZE,lpbData,(lpbDataCurrent-lpbData)); + MEMFREE(lpbData); + } + }else{ + DebugBreak(); + } +return(dwRet); +} + + +DWORD MraSendCommand_ChangeStatusW(DWORD dwStatus,LPSTR lpszStatusUri,SIZE_T dwStatusUriSize,LPWSTR lpwszStatusTitle,SIZE_T dwStatusTitleSize,LPWSTR lpwszStatusDesc,SIZE_T dwStatusDescSize,DWORD dwFutureFlags) +{// Изменение статуса + DWORD dwRet=0; + LPBYTE lpbData,lpbDataCurrent; + + if (dwStatusUriSize>SPEC_STATUS_URI_MAX) dwStatusUriSize=SPEC_STATUS_URI_MAX; + if (dwStatusTitleSize>STATUS_TITLE_MAX) dwStatusTitleSize=STATUS_TITLE_MAX; + if (dwStatusDescSize>STATUS_DESC_MAX) dwStatusDescSize=STATUS_DESC_MAX; + + lpbData=(LPBYTE)MEMALLOC((sizeof(DWORD)+dwStatusUriSize+(dwStatusTitleSize*sizeof(WCHAR))+(dwStatusDescSize*sizeof(WCHAR))+sizeof(DWORD)+32)); + if (lpbData) + { + lpbDataCurrent=lpbData; + SetUL(&lpbDataCurrent,dwStatus); + SetLPS(&lpbDataCurrent,lpszStatusUri,dwStatusUriSize); + SetLPSW(&lpbDataCurrent,lpwszStatusTitle,dwStatusTitleSize); + SetLPSW(&lpbDataCurrent,lpwszStatusDesc,dwStatusDescSize); + SetUL(&lpbDataCurrent,dwFutureFlags); + + dwRet=MraSendCMD(MRIM_CS_CHANGE_STATUS,lpbData,(lpbDataCurrent-lpbData)); + MEMFREE(lpbData); + } +return(dwRet); +} + + +DWORD MraSendCommand_FileTransfer(LPSTR lpszEMail,SIZE_T dwEMailSize,DWORD dwIDRequest,DWORD dwFilesTotalSize,LPWSTR lpwszFiles,SIZE_T dwFilesSize,LPSTR lpszAddreses,SIZE_T dwAddresesSize) +{// Отправка файлов + DWORD dwRet=0; + + if (lpszEMail && dwEMailSize>4) + { + SIZE_T dwFilesSizeA; + LPBYTE lpbData,lpbDataCurrent; + + dwFilesSizeA=WideCharToMultiByte(MRA_CODE_PAGE,0,lpwszFiles,dwFilesSize,NULL,0,NULL,NULL); + lpbData=(LPBYTE)MEMALLOC((dwEMailSize+dwFilesSizeA+(dwFilesSize*sizeof(WCHAR))+dwAddresesSize+MAX_PATH)); + if (lpbData) + { + lpbDataCurrent=lpbData; + SetLPSLowerCase(&lpbDataCurrent,lpszEMail,dwEMailSize); + SetUL(&lpbDataCurrent,dwIDRequest); + SetUL(&lpbDataCurrent,dwFilesTotalSize); + SetUL(&lpbDataCurrent,(sizeof(DWORD)+dwFilesSizeA + sizeof(DWORD)+(sizeof(DWORD)+sizeof(DWORD)+(dwFilesSize*sizeof(WCHAR))) + sizeof(DWORD)+dwAddresesSize));//SetLPS(&lpbDataCurrent,(LPSTR)lpbDataEx,dwDataExSize); + { + SetLPSWtoA(&lpbDataCurrent,lpwszFiles,dwFilesSize); + SetUL(&lpbDataCurrent,(sizeof(DWORD)+sizeof(DWORD)+(dwFilesSize*sizeof(WCHAR))));//SetLPS(&lpbDataCurrent,lpbDescription,dwDescriptionSize); + { + SetUL(&lpbDataCurrent,1); + SetLPSW(&lpbDataCurrent,lpwszFiles,dwFilesSize); + } + SetLPS(&lpbDataCurrent,lpszAddreses,dwAddresesSize); + } + + dwRet=MraSendCMD(MRIM_CS_FILE_TRANSFER,lpbData,(lpbDataCurrent-lpbData)); + MEMFREE(lpbData); + } + }else{ + DebugBreak(); + } +return(dwRet); +} + + +DWORD MraSendCommand_FileTransferAck(DWORD dwStatus,LPSTR lpszEMail,SIZE_T dwEMailSize,DWORD dwIDRequest,LPBYTE lpbDescription,SIZE_T dwDescriptionSize) +{// Ответ на отправку файлов + DWORD dwRet=0; + + if (lpszEMail && dwEMailSize>4) + { + LPBYTE lpbData,lpbDataCurrent; + + lpbData=(LPBYTE)MEMALLOC((dwEMailSize+dwDescriptionSize+32)); + if (lpbData) + { + lpbDataCurrent=lpbData; + SetUL(&lpbDataCurrent,dwStatus); + SetLPSLowerCase(&lpbDataCurrent,lpszEMail,dwEMailSize); + SetUL(&lpbDataCurrent,dwIDRequest); + SetLPS(&lpbDataCurrent,(LPSTR)lpbDescription,dwDescriptionSize); + + dwRet=MraSendCMD(MRIM_CS_FILE_TRANSFER_ACK,lpbData,(lpbDataCurrent-lpbData)); + MEMFREE(lpbData); + } + }else{ + DebugBreak(); + } +return(dwRet); +} + + +/*DWORD MraSendCommand_WPRequestA(HANDLE hContact,DWORD dwAckType,DWORD dwRequestFlags,LPSTR lpszUser,SIZE_T dwUserSize,LPSTR lpszDomain,SIZE_T dwDomainSize,LPSTR lpszNickName,SIZE_T dwNickNameSize,LPSTR lpszFirstName,SIZE_T dwFirstNameSize,LPSTR lpszLastName,SIZE_T dwLastNameSize,DWORD dwSex,DWORD dwDate1,DWORD dwDate2,DWORD dwCityID,DWORD dwZodiak,DWORD dwBirthdayMonth,DWORD dwBirthdayDay,DWORD dwCountryID,DWORD dwOnline) +{// Поиск контакта + //WCHAR wszUser[MAX_PATH],wszDomain[MAX_PATH]; + WCHAR wszNickName[MAX_PATH],wszFirstName[MAX_PATH],wszLastName[MAX_PATH]; + + //if (lpszUser && dwUserSize) dwUserSize=MultiByteToWideChar(MRA_CODE_PAGE,0,lpszUser,dwUserSize,wszUser,SIZEOF(wszUser)); + //if (lpszDomain && dwDomainSize) dwDomainSize=MultiByteToWideChar(MRA_CODE_PAGE,0,lpszDomain,dwDomainSize,wszDomain,SIZEOF(wszDomain)); + if (lpszNickName && dwNickNameSize) dwNickNameSize=MultiByteToWideChar(MRA_CODE_PAGE,0,lpszNickName,dwNickNameSize,wszNickName,SIZEOF(wszNickName)); + if (lpszFirstName && dwFirstNameSize) dwFirstNameSize=MultiByteToWideChar(MRA_CODE_PAGE,0,lpszFirstName,dwFirstNameSize,wszFirstName,SIZEOF(wszFirstName)); + if (lpszLastName && dwLastNameSize) dwLastNameSize=MultiByteToWideChar(MRA_CODE_PAGE,0,lpszLastName,dwLastNameSize,wszLastName,SIZEOF(wszLastName)); + +return(MraSendCommand_WPRequestW(hContact,dwAckType,dwRequestFlags,lpszUser,dwUserSize,lpszDomain,dwDomainSize,wszNickName,dwNickNameSize,wszFirstName,dwFirstNameSize,wszLastName,dwLastNameSize,dwSex,dwDate1,dwDate2,dwCityID,dwZodiak,dwBirthdayMonth,dwBirthdayDay,dwCountryID,dwOnline)); +}//*/ + +DWORD MraSendCommand_WPRequestW(HANDLE hContact,DWORD dwAckType,DWORD dwRequestFlags,LPSTR lpszUser,SIZE_T dwUserSize,LPSTR lpszDomain,SIZE_T dwDomainSize,LPWSTR lpwszNickName,SIZE_T dwNickNameSize,LPWSTR lpwszFirstName,SIZE_T dwFirstNameSize,LPWSTR lpwszLastName,SIZE_T dwLastNameSize,DWORD dwSex,DWORD dwDate1,DWORD dwDate2,DWORD dwCityID,DWORD dwZodiak,DWORD dwBirthdayMonth,DWORD dwBirthdayDay,DWORD dwCountryID,DWORD dwOnline) +{// Поиск контакта + DWORD dwRet=0; + LPBYTE lpbData,lpbDataCurrent; + + lpbData=(LPBYTE)MEMALLOC(((dwUserSize+dwDomainSize+dwNickNameSize+dwFirstNameSize+dwLastNameSize)*sizeof(WCHAR))+4096); + if (lpbData) + { + CHAR szBuff[MAX_PATH]; + SIZE_T dwBuffSize; + + lpbDataCurrent=lpbData; + + if (GetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_USER)) {SetUL(&lpbDataCurrent,MRIM_CS_WP_REQUEST_PARAM_USER);SetLPSLowerCase(&lpbDataCurrent,lpszUser,dwUserSize);} + if (GetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_DOMAIN)) {SetUL(&lpbDataCurrent,MRIM_CS_WP_REQUEST_PARAM_DOMAIN);SetLPSLowerCase(&lpbDataCurrent,lpszDomain,dwDomainSize);} + if (GetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_NICKNAME)) {SetUL(&lpbDataCurrent,MRIM_CS_WP_REQUEST_PARAM_NICKNAME);SetLPSW(&lpbDataCurrent,lpwszNickName,dwNickNameSize);} + if (GetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_FIRSTNAME)) {SetUL(&lpbDataCurrent,MRIM_CS_WP_REQUEST_PARAM_FIRSTNAME);SetLPSW(&lpbDataCurrent,lpwszFirstName,dwFirstNameSize);} + if (GetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_LASTNAME)) {SetUL(&lpbDataCurrent,MRIM_CS_WP_REQUEST_PARAM_LASTNAME);SetLPSW(&lpbDataCurrent,lpwszLastName,dwLastNameSize);} + + if (GetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_SEX)) + { + dwBuffSize=mir_snprintf(szBuff,SIZEOF(szBuff),"%lu",dwSex); + SetUL(&lpbDataCurrent,MRIM_CS_WP_REQUEST_PARAM_SEX); + SetLPS(&lpbDataCurrent,szBuff,dwBuffSize); + } + + /*if (GetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY)) + { + dwBuffSize=mir_snprintf(szBuff,SIZEOF(szBuff),"%lu",dwSex); + SetUL(&lpbDataCurrent,MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY); + SetLPS(&lpbDataCurrent,szBuff,dwBuffSize); + }*/ + + if (GetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_DATE1)) + { + dwBuffSize=mir_snprintf(szBuff,SIZEOF(szBuff),"%lu",dwDate1); + SetUL(&lpbDataCurrent,MRIM_CS_WP_REQUEST_PARAM_DATE1); + SetLPS(&lpbDataCurrent,szBuff,dwBuffSize); + } + + if (GetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_DATE2)) + { + dwBuffSize=mir_snprintf(szBuff,SIZEOF(szBuff),"%lu",dwDate2); + SetUL(&lpbDataCurrent,MRIM_CS_WP_REQUEST_PARAM_DATE2); + SetLPS(&lpbDataCurrent,szBuff,dwBuffSize); + } + + if (GetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_CITY_ID)) + { + dwBuffSize=mir_snprintf(szBuff,SIZEOF(szBuff),"%lu",dwCityID); + SetUL(&lpbDataCurrent,MRIM_CS_WP_REQUEST_PARAM_CITY_ID); + SetLPS(&lpbDataCurrent,szBuff,dwBuffSize); + } + + if (GetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_ZODIAC)) + { + dwBuffSize=mir_snprintf(szBuff,SIZEOF(szBuff),"%lu",dwZodiak); + SetUL(&lpbDataCurrent,MRIM_CS_WP_REQUEST_PARAM_ZODIAC); + SetLPS(&lpbDataCurrent,szBuff,dwBuffSize); + } + + if (GetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_MONTH)) + { + dwBuffSize=mir_snprintf(szBuff,SIZEOF(szBuff),"%lu",dwBirthdayMonth); + SetUL(&lpbDataCurrent,MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_MONTH); + SetLPS(&lpbDataCurrent,szBuff,dwBuffSize); + } + + if (GetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_DAY)) + { + dwBuffSize=mir_snprintf(szBuff,SIZEOF(szBuff),"%lu",dwBirthdayDay); + SetUL(&lpbDataCurrent,MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_DAY); + SetLPS(&lpbDataCurrent,szBuff,dwBuffSize); + } + + if (GetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_COUNTRY_ID)) + { + dwBuffSize=mir_snprintf(szBuff,SIZEOF(szBuff),"%lu",dwCountryID); + SetUL(&lpbDataCurrent,MRIM_CS_WP_REQUEST_PARAM_COUNTRY_ID); + SetLPS(&lpbDataCurrent,szBuff,dwBuffSize); + } + + if (GetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_ONLINE)) + { + dwBuffSize=mir_snprintf(szBuff,SIZEOF(szBuff),"%lu",dwOnline); + SetUL(&lpbDataCurrent,MRIM_CS_WP_REQUEST_PARAM_ONLINE); + SetLPS(&lpbDataCurrent,szBuff,dwBuffSize); + } + + dwRet=MraSendQueueCMD(masMraSettings.hSendQueueHandle,0,hContact,dwAckType,NULL,0,MRIM_CS_WP_REQUEST,lpbData,(lpbDataCurrent-lpbData)); + MEMFREE(lpbData); + } +return(dwRet); +} + + +DWORD MraSendCommand_WPRequestByEMail(HANDLE hContact,DWORD dwAckType,LPSTR lpszEMail,SIZE_T dwEMailSize) +{// Поиск контакта по EMail + DWORD dwRet=0,dwRequestFlags=0; + + if (lpszEMail && dwEMailSize>4) + { + LPSTR lpszUser,lpszDomain; + SIZE_T dwUserSize,dwDomainSize; + + lpszDomain=(LPSTR)MemoryFindByte(0,lpszEMail,dwEMailSize,'@'); + if (lpszDomain) + { + lpszUser=lpszEMail; + dwUserSize=(lpszDomain-lpszEMail); + lpszDomain++; + dwDomainSize=(dwEMailSize-(dwUserSize+1)); + + SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_USER); + SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_DOMAIN); + + dwRet=MraSendCommand_WPRequestW(hContact,dwAckType,dwRequestFlags,lpszUser,dwUserSize,lpszDomain,dwDomainSize,NULL,0,NULL,0,NULL,0,0,0,0,0,0,0,0,0,0); + } + } +return(dwRet); +} + + +DWORD MraSendCommand_Game(LPSTR lpszEMail,SIZE_T dwEMailSize,DWORD dwGameSessionID,DWORD dwGameMsg,DWORD dwGameMsgID,LPSTR lpszData,SIZE_T dwDataSize) +{// Отправка файлов + DWORD dwRet=0; + + if (lpszEMail && dwEMailSize>4) + { + LPBYTE lpbData,lpbDataCurrent; + + lpbData=(LPBYTE)MEMALLOC((dwEMailSize+(sizeof(DWORD)*4)+dwDataSize+32)); + if (lpbData) + { + lpbDataCurrent=lpbData; + SetLPSLowerCase(&lpbDataCurrent,lpszEMail,dwEMailSize); + SetUL(&lpbDataCurrent,dwGameSessionID); + SetUL(&lpbDataCurrent,dwGameMsg); + SetUL(&lpbDataCurrent,dwGameMsgID); + SetUL(&lpbDataCurrent,_time32(NULL)); + SetLPS(&lpbDataCurrent,lpszData,dwDataSize); + + dwRet=MraSendCMD(MRIM_CS_GAME,lpbData,(lpbDataCurrent-lpbData)); + MEMFREE(lpbData); + } + }else{ + DebugBreak(); + } +return(dwRet); +} + + +DWORD MraSendCommand_Login2W(LPSTR lpszLogin,SIZE_T dwLoginSize,LPSTR lpszPassword,SIZE_T dwPasswordSize,DWORD dwStatus,LPSTR lpszStatusUri,SIZE_T dwStatusUriSize,LPWSTR lpwszStatusTitle,SIZE_T dwStatusTitleSize,LPWSTR lpwszStatusDesc,SIZE_T dwStatusDescSize,DWORD dwFutureFlags,LPSTR lpszUserAgentFormated,SIZE_T dwUserAgentFormatedSize,LPSTR lpszUserAgent,SIZE_T dwUserAgentSize) +{// Авторизация + DWORD dwRet=0; + LPBYTE lpbData,lpbDataCurrent; + + if (dwStatusUriSize>SPEC_STATUS_URI_MAX) dwStatusUriSize=SPEC_STATUS_URI_MAX; + if (dwStatusTitleSize>STATUS_TITLE_MAX) dwStatusTitleSize=STATUS_TITLE_MAX; + if (dwStatusDescSize>STATUS_DESC_MAX) dwStatusDescSize=STATUS_DESC_MAX; + if (dwUserAgentFormatedSize>USER_AGENT_MAX) dwUserAgentFormatedSize=USER_AGENT_MAX; + if (dwUserAgentSize>MAX_CLIENT_DESCRIPTION) dwUserAgentSize=MAX_CLIENT_DESCRIPTION; + + lpbData=(LPBYTE)MEMALLOC((dwLoginSize+dwPasswordSize+sizeof(DWORD)+dwStatusUriSize+(dwStatusTitleSize*sizeof(WCHAR))+(dwStatusDescSize*sizeof(WCHAR))+2+sizeof(DWORD)+(sizeof(DWORD)*2)+dwUserAgentFormatedSize+dwUserAgentSize+32)); + if (lpbData) + { + lpbDataCurrent=lpbData; + SetLPS(&lpbDataCurrent,lpszLogin,dwLoginSize); + SetLPS(&lpbDataCurrent,lpszPassword,dwPasswordSize); + SetUL(&lpbDataCurrent,dwStatus); + SetLPS(&lpbDataCurrent,lpszStatusUri,dwStatusUriSize); + SetLPSW(&lpbDataCurrent,lpwszStatusTitle,dwStatusTitleSize); + SetLPSW(&lpbDataCurrent,lpwszStatusDesc,dwStatusDescSize); + SetUL(&lpbDataCurrent,dwFutureFlags); + SetLPS(&lpbDataCurrent,lpszUserAgentFormated,dwUserAgentFormatedSize); + SetLPS(&lpbDataCurrent,"ru",2); + SetLPS(&lpbDataCurrent,NULL,0); + SetLPS(&lpbDataCurrent,NULL,0); + SetLPS(&lpbDataCurrent,lpszUserAgent,dwUserAgentSize);// LPS client description /max 256 + + dwRet=MraSendCMD(MRIM_CS_LOGIN2,lpbData,(lpbDataCurrent-lpbData)); + MEMFREE(lpbData); + } +return(dwRet); +} + + +DWORD MraSendCommand_SMSW(HANDLE hContact,LPSTR lpszPhone,SIZE_T dwPhoneSize,LPWSTR lpwszMessage,SIZE_T dwMessageSize) +{// Отправка SMS + DWORD dwRet=0; + LPBYTE lpbData,lpbDataCurrent,lpbDataQueue; + LPSTR lpszPhoneLocal; + + lpbData=(LPBYTE)MEMALLOC((dwPhoneSize+(dwMessageSize*sizeof(WCHAR))+32)); + lpbDataQueue=(LPBYTE)MEMALLOC((dwPhoneSize+(dwMessageSize*sizeof(WCHAR))+32)); + lpszPhoneLocal=(LPSTR)MEMALLOC((dwPhoneSize+32)); + if (lpbData && lpbDataQueue && lpszPhoneLocal) + { + lpszPhoneLocal[0]='+'; + dwPhoneSize=1+CopyNumber((lpszPhoneLocal+1),lpszPhone,dwPhoneSize); + + lpbDataCurrent=lpbData; + SetUL(&lpbDataCurrent,0); + SetLPS(&lpbDataCurrent,lpszPhoneLocal,dwPhoneSize); + SetLPSW(&lpbDataCurrent,lpwszMessage,dwMessageSize); + + (*(DWORD*)lpbDataQueue)=dwPhoneSize; + memmove((lpbDataQueue+sizeof(DWORD)),lpszPhoneLocal,(dwPhoneSize+1)); + memmove((lpbDataQueue+sizeof(DWORD)+dwPhoneSize+1),lpwszMessage,((dwMessageSize*sizeof(WCHAR))+1)); + + dwRet=MraSendQueueCMD(masMraSettings.hSendQueueHandle,0,hContact,ICQACKTYPE_SMS,lpbDataQueue,(dwPhoneSize+(dwMessageSize*sizeof(WCHAR))+sizeof(DWORD)+2),MRIM_CS_SMS,lpbData,(lpbDataCurrent-lpbData)); + MEMFREE(lpbData); + MEMFREE(lpszPhoneLocal); + }else{ + MEMFREE(lpbData); + MEMFREE(lpbDataQueue); + MEMFREE(lpszPhoneLocal); + } +return(dwRet); +} + + + +DWORD MraSendCommand_Proxy(LPSTR lpszEMail,SIZE_T dwEMailSize,DWORD dwIDRequest,DWORD dwDataType,LPSTR lpszData,SIZE_T dwDataSize,LPSTR lpszAddreses,SIZE_T dwAddresesSize,MRA_GUID mguidSessionID) +{// Соединение с прокси + DWORD dwRet=0; + + if (lpszEMail && dwEMailSize>4) + { + LPBYTE lpbData,lpbDataCurrent; + + lpbData=(LPBYTE)MEMALLOC((dwEMailSize+(sizeof(DWORD)*2)+dwDataSize+dwAddresesSize+sizeof(MRA_GUID)+32)); + if (lpbData) + { + lpbDataCurrent=lpbData; + SetLPSLowerCase(&lpbDataCurrent,lpszEMail,dwEMailSize); + SetUL(&lpbDataCurrent,dwIDRequest); + SetUL(&lpbDataCurrent,dwDataType); + SetLPS(&lpbDataCurrent,lpszData,dwDataSize); + SetLPS(&lpbDataCurrent,lpszAddreses,dwAddresesSize); + SetGUID(&lpbDataCurrent,mguidSessionID); + + dwRet=MraSendCMD(MRIM_CS_PROXY,lpbData,(lpbDataCurrent-lpbData)); + MEMFREE(lpbData); + } + }else{ + DebugBreak(); + } +return(dwRet); +} + + +DWORD MraSendCommand_ProxyAck(DWORD dwStatus,LPSTR lpszEMail,SIZE_T dwEMailSize,DWORD dwIDRequest,DWORD dwDataType,LPSTR lpszData,SIZE_T dwDataSize,LPSTR lpszAddreses,SIZE_T dwAddresesSize,MRA_GUID mguidSessionID) +{// Ответ на соединение с прокси + DWORD dwRet=0; + + if (lpszEMail && dwEMailSize>4) + { + LPBYTE lpbData,lpbDataCurrent; + + lpbData=(LPBYTE)MEMALLOC((dwEMailSize+(sizeof(DWORD)*3)+dwDataSize+dwAddresesSize+sizeof(MRA_GUID)+32)); + if (lpbData) + { + lpbDataCurrent=lpbData; + SetUL(&lpbDataCurrent,dwStatus); + SetLPSLowerCase(&lpbDataCurrent,lpszEMail,dwEMailSize); + SetUL(&lpbDataCurrent,dwIDRequest); + SetUL(&lpbDataCurrent,dwDataType); + SetLPS(&lpbDataCurrent,lpszData,dwDataSize); + SetLPS(&lpbDataCurrent,lpszAddreses,dwAddresesSize); + SetGUID(&lpbDataCurrent,mguidSessionID); + + dwRet=MraSendCMD(MRIM_CS_PROXY_ACK,lpbData,(lpbDataCurrent-lpbData)); + MEMFREE(lpbData); + } + }else{ + DebugBreak(); + } +return(dwRet); +} + + +DWORD MraSendCommand_ChangeUserBlogStatus(DWORD dwFlags,LPWSTR lpwszText,SIZE_T dwTextSize,DWORDLONG dwBlogStatusID) +{// Отправка сообщения в микроблог + DWORD dwRet=0; + LPBYTE lpbData,lpbDataCurrent; + + if (dwTextSize>MICBLOG_STATUS_MAX) dwTextSize=MICBLOG_STATUS_MAX; + + lpbData=(LPBYTE)MEMALLOC((sizeof(DWORD)+(dwTextSize*sizeof(WCHAR))+sizeof(DWORDLONG)+32)); + if (lpbData) + { + lpbDataCurrent=lpbData; + SetUL(&lpbDataCurrent,dwFlags); + SetLPSW(&lpbDataCurrent,lpwszText,dwTextSize); + SetUIDL(&lpbDataCurrent,dwBlogStatusID); + + dwRet=MraSendCMD(MRIM_CS_CHANGE_USER_BLOG_STATUS,lpbData,(lpbDataCurrent-lpbData)); + MEMFREE(lpbData); + } + +return(dwRet); +} + + +void SetUL(LPBYTE *plpBuff,DWORD dwData) +{ + (*(DWORD*)(*plpBuff))=dwData; + (*plpBuff)+=sizeof(DWORD); +} + + +void SetUIDL(LPBYTE *plpBuff,DWORDLONG dwData) +{ + (*(DWORDLONG*)(*plpBuff))=dwData; + (*plpBuff)+=sizeof(DWORDLONG); +} + + +void SetGUID(LPBYTE *plpBuff,MRA_GUID guidData) +{ + (*(MRA_GUID*)(*plpBuff))=guidData; + (*plpBuff)+=sizeof(MRA_GUID); +} + + +void SetLPS(LPBYTE *plpBuff,LPSTR lpszData,DWORD dwSize) +{ + (*(DWORD*)(*plpBuff))=dwSize; + (*plpBuff)+=sizeof(DWORD); + memmove((*plpBuff),lpszData,dwSize); + (*plpBuff)+=dwSize; +} + + +void SetLPSW(LPBYTE *plpBuff,LPWSTR lpwszData,DWORD dwSize) +{ + dwSize*=sizeof(WCHAR); + (*(DWORD*)(*plpBuff))=dwSize; + (*plpBuff)+=sizeof(DWORD); + memmove((*plpBuff),lpwszData,dwSize); + (*plpBuff)+=dwSize; +} + + +void SetLPSWtoA(LPBYTE *plpBuff,LPWSTR lpwszData,DWORD dwSize) +{ + dwSize=WideCharToMultiByte(MRA_CODE_PAGE,0,lpwszData,dwSize,(LPSTR)((*plpBuff)+sizeof(DWORD)),(dwSize*sizeof(WCHAR)),NULL,NULL); + (*(DWORD*)(*plpBuff))=dwSize; + (*plpBuff)+=(sizeof(DWORD)+dwSize); +} + + + +void SetLPSLowerCase(LPBYTE *plpBuff,LPSTR lpszData,DWORD dwSize) +{ + (*(DWORD*)(*plpBuff))=dwSize; + (*plpBuff)+=sizeof(DWORD); + BuffToLowerCase((*plpBuff),lpszData,dwSize); + (*plpBuff)+=dwSize; +} + + +void SetLPSLowerCaseW(LPBYTE *plpBuff,LPWSTR lpwszData,DWORD dwSize) +{ + dwSize*=sizeof(WCHAR); + (*(DWORD*)(*plpBuff))=dwSize; + (*plpBuff)+=sizeof(DWORD); + memmove((*plpBuff),lpwszData,dwSize); + CharLowerBuff((LPWSTR)(*plpBuff),(dwSize/sizeof(WCHAR))); + (*plpBuff)+=dwSize; +} + + +DWORD MraSendPacket(HANDLE hConnection,DWORD dwCMDNum,DWORD dwType,LPVOID lpData,SIZE_T dwDataSize) +{ + DWORD dwRet; + + LPBYTE lpbData; + mrim_packet_header_t *pmaHeader; + + lpbData=(LPBYTE)MEMALLOC((dwDataSize+sizeof(mrim_packet_header_t))); + if (lpbData) + { + pmaHeader=(mrim_packet_header_t*)lpbData; + pmaHeader->magic=CS_MAGIC; + pmaHeader->proto=PROTO_VERSION;// Версия протокола + pmaHeader->seq=dwCMDNum;// Sequence + pmaHeader->msg=dwType;// Тип пакета + pmaHeader->dlen=dwDataSize;// Длина данных + //bzero(&maHeader->reserved[0],24);// Зарезервировано + + memmove((lpbData+sizeof(mrim_packet_header_t)),lpData,dwDataSize); + dwRet=Netlib_Send(hConnection,(LPSTR)lpbData,(dwDataSize+sizeof(mrim_packet_header_t)),0); + + /*if (dwType==MRIM_CS_ADD_CONTACT) + { + { + char sztm[100]; + + SHA1GetStringDigestA((LPSTR)lpbData,(dwDataSize+sizeof(mrim_packet_header_t)),sztm); + OutputDebugStringA((sztm)); + OutputDebugStringA("\r\n"); + } + + { + DWORD dwTemp; + HANDLE hFile=CreateFileW(L"C:\\Documents and Settings\\rozhuk_im\\Рабочий стол\\AddContact.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); + + if (hFile!=INVALID_HANDLE_VALUE) + { + WriteFile(hFile,lpbData,(dwDataSize+sizeof(mrim_packet_header_t)),&dwTemp,NULL); + CloseHandle(hFile); + } + } + }//*/ + MEMFREE(lpbData); + } +return(dwRet); +} + + +DWORD MraSendCMD(DWORD dwType,LPVOID lpData,SIZE_T dwDataSize) +{ + DWORD dwRet; + + dwRet=InterlockedIncrement((LONG volatile*)&masMraSettings.dwCMDNum); + EnterCriticalSection(&masMraSettings.csCriticalSectionSend);// guarding winsock internal buffers + if (MraSendPacket(masMraSettings.hConnection,dwRet,dwType,lpData,dwDataSize)==0) + {// err on send + dwRet=0; + } + LeaveCriticalSection(&masMraSettings.csCriticalSectionSend); +return(dwRet); +} + + +DWORD MraSendQueueCMD(HANDLE hSendQueueHandle,DWORD dwFlags,HANDLE hContact,DWORD dwAckType,LPBYTE lpbDataQueue,SIZE_T dwDataQueueSize,DWORD dwType,LPVOID lpData,SIZE_T dwDataSize) +{ + DWORD dwRet; + + dwRet=InterlockedIncrement((LONG volatile*)&masMraSettings.dwCMDNum); + if (MraSendQueueAdd(hSendQueueHandle,dwRet,dwFlags,hContact,dwAckType,lpbDataQueue,dwDataQueueSize)==NO_ERROR) + { + EnterCriticalSection(&masMraSettings.csCriticalSectionSend);// guarding winsock internal buffers + if (MraSendPacket(masMraSettings.hConnection,dwRet,dwType,lpData,dwDataSize)==0) + { + MraSendQueueFree(hSendQueueHandle,dwRet); + dwRet=0; + } + LeaveCriticalSection(&masMraSettings.csCriticalSectionSend); + } +return(dwRet); +} + + + diff --git a/MRA/MraSendCommand.h b/MRA/MraSendCommand.h new file mode 100644 index 0000000..a32519b --- /dev/null +++ b/MRA/MraSendCommand.h @@ -0,0 +1,36 @@ +#if !defined(AFX_MRA_SENDCOMMAND_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) +#define AFX_MRA_SENDCOMMAND_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + +DWORD MraSendCommand_MessageW (BOOL bAddToQueue,HANDLE hContact,DWORD dwAckType,DWORD dwFlags,LPSTR lpszEMail,SIZE_T dwEMailSize,LPWSTR lpwszMessage,SIZE_T dwMessageSize,LPBYTE lpbMultiChatData,SIZE_T dwMultiChatDataSize); +DWORD MraSendCommand_MessageAskW (DWORD dwMsgID,DWORD dwFlags,LPSTR lpszEMail,SIZE_T dwEMailSize,LPWSTR lpwszMessage,SIZE_T dwMessageSize,LPSTR lpwszMessageRTF,SIZE_T dwMessageRTFSize); +DWORD MraSendCommand_MessageRecv (LPSTR lpszFrom,SIZE_T dwFromSize,DWORD dwMsgID); +DWORD MraSendCommand_AddContactW (HANDLE hContact,DWORD dwContactFlag,DWORD dwGroupID,LPSTR lpszEMail,SIZE_T dwEMailSize,LPWSTR lpwszCustomName,SIZE_T dwCustomNameSize,LPSTR lpszPhones,SIZE_T dwPhonesSize,LPWSTR lpwszAuthMessage,SIZE_T dwAuthMessageSize,DWORD dwActions); +DWORD MraSendCommand_ModifyContactW (HANDLE hContact,DWORD dwID,DWORD dwContactFlag,DWORD dwGroupID,LPSTR lpszEMail,SIZE_T dwEMailSize,LPWSTR lpwszCustomName,SIZE_T dwCustomNameSize,LPSTR lpszPhones,SIZE_T dwPhonesSize); +DWORD MraSendCommand_OfflineMessageDel(DWORDLONG dwMsgUIDL); +DWORD MraSendCommand_Authorize (LPSTR lpszEMail,SIZE_T dwEMailSize); +DWORD MraSendCommand_ChangeStatusW (DWORD dwStatus,LPSTR lpszStatusUri,SIZE_T dwStatusUriSize,LPWSTR lpwszStatusTitle,SIZE_T dwStatusTitleSize,LPWSTR lpwszStatusDesc,SIZE_T dwStatusDescSize,DWORD dwFutureFlags); +DWORD MraSendCommand_FileTransfer (LPSTR lpszEMail,SIZE_T dwEMailSize,DWORD dwIdRequest,DWORD dwFilesTotalSize,LPWSTR lpwszFiles,SIZE_T dwFilesSize,LPSTR lpszAddreses,SIZE_T dwAddresesSize); +DWORD MraSendCommand_FileTransferAck (DWORD dwStatus,LPSTR lpszEMail,SIZE_T dwEMailSize,DWORD dwIdRequest,LPBYTE lpbDescription,SIZE_T dwDescriptionSize); +DWORD MraSendCommand_WPRequestW (HANDLE hContact,DWORD dwAckType,DWORD dwRequestFlags,LPSTR lpszUser,SIZE_T dwUserSize,LPSTR lpszDomain,SIZE_T dwDomainSize,LPWSTR lpwszNickName,SIZE_T dwNickNameSize,LPWSTR lpwszFirstName,SIZE_T dwFirstNameSize,LPWSTR lpwszLastName,SIZE_T dwLastNameSize,DWORD dwSex,DWORD dwDate1,DWORD dwDate2,DWORD dwCityID,DWORD dwZodiak,DWORD dwBirthdayMonth,DWORD dwBirthdayDay,DWORD dwCountryID,DWORD dwOnline); +DWORD MraSendCommand_WPRequestA (HANDLE hContact,DWORD dwAckType,DWORD dwRequestFlags,LPSTR lpszUser,SIZE_T dwUserSize,LPSTR lpszDomain,SIZE_T dwDomainSize,LPSTR lpszNickName,SIZE_T dwNickNameSize,LPSTR lpszFirstName,SIZE_T dwFirstNameSize,LPSTR lpszLastName,SIZE_T dwLastNameSize,DWORD dwSex,DWORD dwDate1,DWORD dwDate2,DWORD dwCityID,DWORD dwZodiak,DWORD dwBirthdayMonth,DWORD dwBirthdayDay,DWORD dwCountryID,DWORD dwOnline); +DWORD MraSendCommand_WPRequestByEMail (HANDLE hContact,DWORD dwAckType,LPSTR lpszEMail,SIZE_T dwEMailSize); +DWORD MraSendCommand_Game (LPSTR lpszEMail,SIZE_T dwEMailSize,DWORD dwGameSessionID,DWORD dwGameMsg,DWORD dwGameMsgID,LPSTR lpszData,SIZE_T dwDataSize); +DWORD MraSendCommand_Login2W (LPSTR lpszLogin,SIZE_T dwLoginSize,LPSTR lpszPassword,SIZE_T dwPasswordSize,DWORD dwStatus,LPSTR lpszStatusUri,SIZE_T dwStatusUriSize,LPWSTR lpwszStatusTitle,SIZE_T dwStatusTitleSize,LPWSTR lpwszStatusDesc,SIZE_T dwStatusDescSize,DWORD dwFutureFlags,LPSTR lpszUserAgentFormated,SIZE_T dwUserAgentFormatedSize,LPSTR lpszUserAgent,SIZE_T dwUserAgentSize); +DWORD MraSendCommand_SMSW (HANDLE hContact,LPSTR lpszPhone,SIZE_T dwPhoneSize,LPWSTR lpwszMessage,SIZE_T dwMessageSize); +DWORD MraSendCommand_Proxy (LPSTR lpszEMail,SIZE_T dwEMailSize,DWORD dwIDRequest,DWORD dwDataType,LPSTR lpszData,SIZE_T dwDataSize,LPSTR lpszAddreses,SIZE_T dwAddresesSize,MRA_GUID mguidSessionID); +DWORD MraSendCommand_ProxyAck (DWORD dwStatus,LPSTR lpszEMail,SIZE_T dwEMailSize,DWORD dwIDRequest,DWORD dwDataType,LPSTR lpszData,SIZE_T dwDataSize,LPSTR lpszAddreses,SIZE_T dwAddresesSize,MRA_GUID mguidSessionID); +DWORD MraSendCommand_ChangeUserBlogStatus(DWORD dwFlags,LPWSTR lpwszText,SIZE_T dwTextSize,DWORDLONG dwBlogStatusID); + +DWORD MraSendPacket (HANDLE hConnection,DWORD dwCMDNum,DWORD dwType,LPVOID lpData,SIZE_T dwDataSize); +DWORD MraSendCMD (DWORD dwType,LPVOID lpData,SIZE_T dwDataSize); +DWORD MraSendQueueCMD (HANDLE hSendQueueHandle,DWORD dwFlags,HANDLE hContact,DWORD dwAckType,LPBYTE lpbDataQueue,SIZE_T dwDataQueueSize,DWORD dwType,LPVOID lpData,SIZE_T dwDataSize); + + + +#endif // !defined(AFX_MRA_SENDCOMMAND_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/MRA/MraSendQueue.cpp b/MRA/MraSendQueue.cpp new file mode 100644 index 0000000..de68943 --- /dev/null +++ b/MRA/MraSendQueue.cpp @@ -0,0 +1,225 @@ +#include "Mra.h" +#include "MraSendQueue.h" + + + + +typedef struct +{ + LIST_MT lmtListMT; + DWORD dwSendTimeOutInterval; +} MRA_SEND_QUEUE; + + +typedef struct +{ + // internal + LIST_MT_ITEM lmtListMTItem; + FILETIME ftSendTime; + // external + DWORD dwCMDNum; + DWORD dwFlags; + HANDLE hContact; + DWORD dwAckType; + LPBYTE lpbData; + SIZE_T dwDataSize; +} MRA_SEND_QUEUE_ITEM; + + + +#define FILETIME_SECOND ((DWORDLONG)10000000) + + + + +DWORD MraSendQueueInitialize(DWORD dwSendTimeOutInterval,HANDLE *phSendQueueHandle) +{ + DWORD dwRetErrorCode; + + if (phSendQueueHandle) + { + MRA_SEND_QUEUE *pmrasqSendQueue; + + pmrasqSendQueue=(MRA_SEND_QUEUE*)MEMALLOC(sizeof(MRA_SEND_QUEUE)); + if (pmrasqSendQueue) + { + dwRetErrorCode=ListMTInitialize(&pmrasqSendQueue->lmtListMT,0); + if (dwRetErrorCode==NO_ERROR) + { + pmrasqSendQueue->dwSendTimeOutInterval=dwSendTimeOutInterval; + (*phSendQueueHandle)=(HANDLE)pmrasqSendQueue; + } + }else{ + dwRetErrorCode=GetLastError(); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +void MraSendQueueDestroy(HANDLE hSendQueueHandle) +{ + if (hSendQueueHandle) + { + MRA_SEND_QUEUE *pmrasqSendQueue=(MRA_SEND_QUEUE*)hSendQueueHandle; + MRA_SEND_QUEUE_ITEM *pmrasqiSendQueueItem; + + ListMTLock(&pmrasqSendQueue->lmtListMT); + while(ListMTItemGetFirst(&pmrasqSendQueue->lmtListMT,NULL,(LPVOID*)&pmrasqiSendQueueItem)==NO_ERROR) + { + ListMTItemDelete(&pmrasqSendQueue->lmtListMT,&pmrasqiSendQueueItem->lmtListMTItem); + //MEMFREE(pmrasqiSendQueueItem->lpbData); + MEMFREE(pmrasqiSendQueueItem); + } + ListMTUnLock(&pmrasqSendQueue->lmtListMT); + + ListMTDestroy(&pmrasqSendQueue->lmtListMT); + MEMFREE(pmrasqSendQueue); + } +} + + +DWORD MraSendQueueAdd(HANDLE hSendQueueHandle,DWORD dwCMDNum,DWORD dwFlags,HANDLE hContact,DWORD dwAckType,LPBYTE lpbData,SIZE_T dwDataSize) +{ + DWORD dwRetErrorCode; + + if (hSendQueueHandle && dwCMDNum) + { + MRA_SEND_QUEUE *pmrasqSendQueue=(MRA_SEND_QUEUE*)hSendQueueHandle; + MRA_SEND_QUEUE_ITEM *pmrasqiSendQueueItem; + + pmrasqiSendQueueItem=(MRA_SEND_QUEUE_ITEM*)MEMALLOC(sizeof(MRA_SEND_QUEUE_ITEM)); + if (pmrasqiSendQueueItem) + { + //pmrasqiSendQueueItem->lmtListMTItem; + GetSystemTimeAsFileTime(&pmrasqiSendQueueItem->ftSendTime); + pmrasqiSendQueueItem->dwCMDNum=dwCMDNum; + pmrasqiSendQueueItem->dwFlags=dwFlags; + pmrasqiSendQueueItem->hContact=hContact; + pmrasqiSendQueueItem->dwAckType=dwAckType; + pmrasqiSendQueueItem->lpbData=lpbData; + pmrasqiSendQueueItem->dwDataSize=dwDataSize; + + ListMTLock(&pmrasqSendQueue->lmtListMT); + ListMTItemAdd(&pmrasqSendQueue->lmtListMT,&pmrasqiSendQueueItem->lmtListMTItem,pmrasqiSendQueueItem); + ListMTUnLock(&pmrasqSendQueue->lmtListMT); + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=GetLastError(); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraSendQueueFree(HANDLE hSendQueueHandle,DWORD dwCMDNum) +{ + DWORD dwRetErrorCode; + + if (hSendQueueHandle) + { + MRA_SEND_QUEUE *pmrasqSendQueue=(MRA_SEND_QUEUE*)hSendQueueHandle; + MRA_SEND_QUEUE_ITEM *pmrasqiSendQueueItem; + LIST_MT_ITERATOR lmtiIterator; + + dwRetErrorCode=ERROR_NOT_FOUND; + ListMTLock(&pmrasqSendQueue->lmtListMT); + ListMTIteratorMoveFirst(&pmrasqSendQueue->lmtListMT,&lmtiIterator); + do + {// цикл + if (ListMTIteratorGet(&lmtiIterator,NULL,(LPVOID*)&pmrasqiSendQueueItem)==NO_ERROR) + if (pmrasqiSendQueueItem->dwCMDNum==dwCMDNum) + { + ListMTItemDelete(&pmrasqSendQueue->lmtListMT,&pmrasqiSendQueueItem->lmtListMTItem); + //MEMFREE(pmrasqiSendQueueItem->lpbData); + MEMFREE(pmrasqiSendQueueItem); + dwRetErrorCode=NO_ERROR; + break; + } + }while(ListMTIteratorMoveNext(&lmtiIterator)); + ListMTUnLock(&pmrasqSendQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraSendQueueFind(HANDLE hSendQueueHandle,DWORD dwCMDNum,DWORD *pdwFlags,HANDLE *phContact,DWORD *pdwAckType,LPBYTE *plpbData,SIZE_T *pdwDataSize) +{ + DWORD dwRetErrorCode; + + if (hSendQueueHandle) + { + MRA_SEND_QUEUE *pmrasqSendQueue=(MRA_SEND_QUEUE*)hSendQueueHandle; + MRA_SEND_QUEUE_ITEM *pmrasqiSendQueueItem; + LIST_MT_ITERATOR lmtiIterator; + + dwRetErrorCode=ERROR_NOT_FOUND; + ListMTLock(&pmrasqSendQueue->lmtListMT); + ListMTIteratorMoveFirst(&pmrasqSendQueue->lmtListMT,&lmtiIterator); + do + {// цикл + if (ListMTIteratorGet(&lmtiIterator,NULL,(LPVOID*)&pmrasqiSendQueueItem)==NO_ERROR) + if (pmrasqiSendQueueItem->dwCMDNum==dwCMDNum) + { + if (pdwFlags) (*pdwFlags)=pmrasqiSendQueueItem->dwFlags; + if (phContact) (*phContact)=pmrasqiSendQueueItem->hContact; + if (pdwAckType) (*pdwAckType)=pmrasqiSendQueueItem->dwAckType; + if (plpbData) (*plpbData)=pmrasqiSendQueueItem->lpbData; + if (pdwDataSize) (*pdwDataSize)=pmrasqiSendQueueItem->dwDataSize; + dwRetErrorCode=NO_ERROR; + break; + } + }while(ListMTIteratorMoveNext(&lmtiIterator)); + ListMTUnLock(&pmrasqSendQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraSendQueueFindOlderThan(HANDLE hSendQueueHandle,DWORD dwTime,DWORD *pdwCMDNum,DWORD *pdwFlags,HANDLE *phContact,DWORD *pdwAckType,LPBYTE *plpbData,SIZE_T *pdwDataSize) +{ + DWORD dwRetErrorCode; + + if (hSendQueueHandle) + { + FILETIME ftExpireTime; + MRA_SEND_QUEUE *pmrasqSendQueue=(MRA_SEND_QUEUE*)hSendQueueHandle; + MRA_SEND_QUEUE_ITEM *pmrasqiSendQueueItem; + LIST_MT_ITERATOR lmtiIterator; + + GetSystemTimeAsFileTime(&ftExpireTime); + (*((DWORDLONG*)&ftExpireTime))-=((DWORDLONG)dwTime*FILETIME_SECOND); + dwRetErrorCode=ERROR_NOT_FOUND; + ListMTLock(&pmrasqSendQueue->lmtListMT); + ListMTIteratorMoveFirst(&pmrasqSendQueue->lmtListMT,&lmtiIterator); + do + {// цикл + if (ListMTIteratorGet(&lmtiIterator,NULL,(LPVOID*)&pmrasqiSendQueueItem)==NO_ERROR) + if ((*((DWORDLONG*)&ftExpireTime))>(*((DWORDLONG*)&pmrasqiSendQueueItem->ftSendTime))) + { + if (pdwCMDNum) (*pdwCMDNum)=pmrasqiSendQueueItem->dwCMDNum; + if (pdwFlags) (*pdwFlags)=pmrasqiSendQueueItem->dwFlags; + if (phContact) (*phContact)=pmrasqiSendQueueItem->hContact; + if (pdwAckType) (*pdwAckType)=pmrasqiSendQueueItem->dwAckType; + if (plpbData) (*plpbData)=pmrasqiSendQueueItem->lpbData; + if (pdwDataSize) (*pdwDataSize)=pmrasqiSendQueueItem->dwDataSize; + dwRetErrorCode=NO_ERROR; + break; + } + }while(ListMTIteratorMoveNext(&lmtiIterator)); + ListMTUnLock(&pmrasqSendQueue->lmtListMT); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + diff --git a/MRA/MraSendQueue.h b/MRA/MraSendQueue.h new file mode 100644 index 0000000..f137612 --- /dev/null +++ b/MRA/MraSendQueue.h @@ -0,0 +1,23 @@ +#if !defined(AFX_MRA_SENDQUEUE_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) +#define AFX_MRA_SENDQUEUE_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + +DWORD MraSendQueueInitialize(DWORD dwSendTimeOutInterval,HANDLE *phSendQueueHandle); +void MraSendQueueDestroy(HANDLE hSendQueueHandle); + +DWORD MraSendQueueAdd(HANDLE hSendQueueHandle,DWORD dwCMDNum,DWORD dwFlags,HANDLE hContact,DWORD dwAckType,LPBYTE lpbData,SIZE_T dwDataSize); +DWORD MraSendQueueFree(HANDLE hSendQueueHandle,DWORD dwCMDNum); + +DWORD MraSendQueueFind(HANDLE hSendQueueHandle,DWORD dwCMDNum,DWORD *pdwFlags,HANDLE *phContact,DWORD *pdwAckType,LPBYTE *plpbData,SIZE_T *pdwDataSize); +DWORD MraSendQueueFindOlderThan(HANDLE hSendQueueHandle,DWORD dwTime,DWORD *pdwCMDNum,DWORD *pdwFlags,HANDLE *phContact,DWORD *pdwAckType,LPBYTE *plpbData,SIZE_T *pdwDataSize); + + + + +#endif // !defined(AFX_MRA_SENDQUEUE_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/MRA/Mra_functions.cpp b/MRA/Mra_functions.cpp new file mode 100644 index 0000000..222dd85 --- /dev/null +++ b/MRA/Mra_functions.cpp @@ -0,0 +1,2417 @@ +#include "Mra.h" + + + +typedef struct SetXStatusData_s { + DWORD dwXStatus; + DWORD dwCountdown; + HICON hDlgIcon; +}SetXStatusData; + + +typedef struct +{ + HANDLE hContact; +}SetBlogStatusData; + + + + +#define RECURSION_DATA_STACK_ITEMS_MIN 128 +struct RECURSION_DATA_STACK_ITEM +{ + HANDLE hFind; + DWORD dwFileNameLen; + WIN32_FIND_DATA w32fdFindFileData; +}; + + +typedef struct _MRA_APC_QUEUE_ITEM +{ + FIFO_MT_ITEM ffmtItem; + PAPCFUNC pfnAPC; +}MRA_APC_QUEUE_ITEM; + + + + +void MraAPCQueueProcess (PFIFO_MT pffmtAPCQueue); +void CALLBACK ThreadMarandaCallbackAck (ULONG_PTR dwParam); +LRESULT CALLBACK MessageEditSubclassProc (HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); +INT_PTR CALLBACK SetXStatusDlgProc (HWND hWndDlg,UINT message,WPARAM wParam,LPARAM lParam); +INT_PTR CALLBACK SendReplyBlogStatusDlgProc (HWND hWndDlg,UINT message,WPARAM wParam,LPARAM lParam); + + + +DWORD MraGetSelfVersionString(LPSTR lpszSelfVersion,SIZE_T dwSelfVersionSize,SIZE_T *pdwSelfVersionSizeRet) +{ + DWORD dwRetErrorCode; + + if (lpszSelfVersion && dwSelfVersionSize) + { + DWORD dwMirVer=CallService(MS_SYSTEM_GETVERSION,0,0); + LPSTR lpszUnicode=(IsUnicodeEnv()? " Unicode":""), + lpszSecIM=(ServiceExists("SecureIM/IsContactSecured")? " + SecureIM":""); + SIZE_T dwSelfVersionSizeRet; + + dwSelfVersionSizeRet=mir_snprintf(lpszSelfVersion,dwSelfVersionSize,"Miranda IM %lu.%lu.%lu.%lu%s (MRA v%lu.%lu.%lu.%lu)%s, version: %lu.%lu",(((dwMirVer)>>24)&0xFF),(((dwMirVer)>>16)&0xFF),(((dwMirVer)>>8)&0xFF),((dwMirVer)&0xFF),lpszUnicode,(((PLUGIN_VERSION_DWORD)>>24)&0xFF),(((PLUGIN_VERSION_DWORD)>>16)&0xFF),(((PLUGIN_VERSION_DWORD)>>8)&0xFF),((PLUGIN_VERSION_DWORD)&0xFF),lpszSecIM,PROTO_MAJOR(PROTO_VERSION),PROTO_MINOR(PROTO_VERSION)); + + if (pdwSelfVersionSizeRet) (*pdwSelfVersionSizeRet)=dwSelfVersionSizeRet; + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + +DWORD GetParamValue(LPSTR lpszData,SIZE_T dwDataSize,LPSTR lpszParamName,SIZE_T dwParamNameSize,LPSTR lpszParamValue,SIZE_T dwParamValueSize,SIZE_T *pParamValueSizeRet) +{ + DWORD dwRetErrorCode; + + if (lpszData && dwDataSize && lpszParamName && dwParamNameSize && lpszParamValue && dwParamValueSize) + { + char szData[USER_AGENT_MAX+4096]; + LPSTR lpszParamDataStart,lpszParamDataEnd; + + dwRetErrorCode=ERROR_NOT_FOUND; + + dwDataSize=((dwDataSizedwAddrCount=0; + pmalAddrList->pmaliAddress=(MRA_ADDR_LIST_ITEM*)MEMALLOC(sizeof(MRA_ADDR_LIST_ITEM)*dwAllocatedCount); + lpszCurrentItem=lpszAddreses; + + while(TRUE) + { + lpszEndItem=(LPSTR)MemoryFindByte((lpszCurrentItem-lpszAddreses),lpszAddreses,dwAddresesSize,';'); + if (lpszEndItem==NULL) lpszEndItem=(lpszAddreses+dwAddresesSize); + if (lpszEndItem) + { + lpszDelimiter=(LPSTR)MemoryFindByte((lpszCurrentItem-lpszAddreses),lpszAddreses,dwAddresesSize,':'); + if (lpszDelimiter) + { + if (pmalAddrList->dwAddrCount==dwAllocatedCount) + { + dwAllocatedCount+=ALLOCATED_COUNT; + pmalAddrList->pmaliAddress=(MRA_ADDR_LIST_ITEM*)MEMREALLOC(pmalAddrList->pmaliAddress,(sizeof(MRA_ADDR_LIST_ITEM)*dwAllocatedCount)); + } + + (*lpszDelimiter)=0; + pmalAddrList->pmaliAddress[pmalAddrList->dwAddrCount].dwAddr=inet_addr(lpszCurrentItem); + pmalAddrList->pmaliAddress[pmalAddrList->dwAddrCount].dwPort=StrToUNum32((lpszDelimiter+1),(lpszEndItem-(lpszDelimiter+1))); + (*lpszDelimiter)=':'; + pmalAddrList->dwAddrCount++; + lpszCurrentItem=(lpszEndItem+1); + }else{ + break; + } + if (lpszEndItem==(lpszAddreses+dwAddresesSize)) break; + }else{ + break; + } + } + pmalAddrList->pmaliAddress=(MRA_ADDR_LIST_ITEM*)MEMREALLOC(pmalAddrList->pmaliAddress,(sizeof(MRA_ADDR_LIST_ITEM)*pmalAddrList->dwAddrCount)); + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MraAddrListGetToBuff(MRA_ADDR_LIST *pmalAddrList,LPSTR lpszBuff,SIZE_T dwBuffSize,SIZE_T *pdwBuffSizeRet) +{ + DWORD dwRetErrorCode; + + if (pmalAddrList && lpszBuff && dwBuffSize) + { + LPSTR lpszCurPos=lpszBuff; + + for (SIZE_T i=0;idwAddrCount;i++) + { + lpszCurPos+=mir_snprintf(lpszCurPos,(dwBuffSize-((SIZE_T)lpszCurPos-(SIZE_T)lpszBuff)),"%s:%lu;",inet_ntoa((*((in_addr*)&pmalAddrList->pmaliAddress[i].dwAddr))),pmalAddrList->pmaliAddress[i].dwPort); + } + + if (pdwBuffSizeRet) (*pdwBuffSizeRet)=(lpszCurPos-lpszBuff); + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +void MraAddrListStoreToContact(HANDLE hContact,MRA_ADDR_LIST *pmalAddrList) +{ + if (hContact && pmalAddrList) + if (pmalAddrList->dwAddrCount) + { + DB_Mra_SetDword(hContact,"OldIP",DB_Mra_GetDword(hContact,"IP",0)); + DB_Mra_SetDword(hContact,"IP",HTONL(pmalAddrList->pmaliAddress[0].dwAddr)); + if (pmalAddrList->dwAddrCount>1) + { + DB_Mra_SetDword(hContact,"OldRealIP",DB_Mra_GetDword(hContact,"RealIP",0)); + DB_Mra_SetDword(hContact,"RealIP",HTONL(pmalAddrList->pmaliAddress[1].dwAddr)); + } + } +} + + +void MraAddrListFree(MRA_ADDR_LIST *pmalAddrList) +{ + if (pmalAddrList) + { + MEMFREE(pmalAddrList->pmaliAddress); + pmalAddrList->dwAddrCount=0; + } +} + + + + +void DB_Mra_CreateResidentSetting(LPSTR lpszValueName) +{ + char szSetting[2*MAX_PATH]; + + mir_snprintf(szSetting,SIZEOF(szSetting),"%s/%s",PROTOCOL_NAMEA,lpszValueName); + CallService(MS_DB_SETSETTINGRESIDENT,TRUE,(WPARAM)szSetting); +} + +BOOL DB_GetStaticStringA(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName,LPSTR lpszRetBuff,SIZE_T dwRetBuffSize,SIZE_T *pdwRetBuffSize) +{// sizes in wchars + BOOL bRet=FALSE; + SIZE_T dwReadedStringLen,dwRetBuffSizeLocal; + DBVARIANT dbv={0}; + DBCONTACTGETSETTING sVal={0}; + + dbv.type=DBVT_WCHAR; + sVal.pValue=&dbv; + sVal.szModule=lpszModule; + sVal.szSetting=lpszValueName; + if (CallService(MS_DB_CONTACT_GETSETTING_STR,(WPARAM)hContact,(LPARAM)&sVal)==0) + { + dwReadedStringLen=lstrlenW(dbv.pwszVal); + if (lpszRetBuff && (dwRetBuffSize>dwReadedStringLen)) + { + dwRetBuffSizeLocal=WideCharToMultiByte(MRA_CODE_PAGE,0,dbv.pwszVal,dwReadedStringLen,lpszRetBuff,dwRetBuffSize,NULL,NULL); + (*((CHAR*)(lpszRetBuff+dwRetBuffSizeLocal)))=0; + bRet=TRUE; + }else{ + dwRetBuffSizeLocal=dwReadedStringLen; + if (lpszRetBuff && dwRetBuffSize>=sizeof(WORD)) (*((WORD*)lpszRetBuff))=0; + } + if (pdwRetBuffSize) (*pdwRetBuffSize)=dwRetBuffSizeLocal; + + DBFreeVariant(&dbv); + }else{ + if (lpszRetBuff && dwRetBuffSize>=sizeof(WORD)) (*((WORD*)lpszRetBuff))=0; + if (pdwRetBuffSize) (*pdwRetBuffSize)=0; + } +return(bRet); +} + + +BOOL DB_GetStaticStringW(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName,LPWSTR lpwszRetBuff,SIZE_T dwRetBuffSize,SIZE_T *pdwRetBuffSize) +{// sizes in wchars + BOOL bRet=FALSE; + SIZE_T dwReadedStringLen; + DBVARIANT dbv={0}; + DBCONTACTGETSETTING sVal={0}; + + dbv.type=DBVT_WCHAR; + sVal.pValue=&dbv; + sVal.szModule=lpszModule; + sVal.szSetting=lpszValueName; + if (CallService(MS_DB_CONTACT_GETSETTING_STR,(WPARAM)hContact,(LPARAM)&sVal)==0) + { + dwReadedStringLen=lstrlenW(dbv.pwszVal); + if (lpwszRetBuff && (dwRetBuffSize>dwReadedStringLen)) + { + memmove(lpwszRetBuff,dbv.pszVal,(dwReadedStringLen*sizeof(WCHAR)));//include null terminated + (*((WCHAR*)(lpwszRetBuff+dwReadedStringLen)))=0; + bRet=TRUE; + }else{ + if (lpwszRetBuff && dwRetBuffSize>=sizeof(WCHAR)) (*((WCHAR*)lpwszRetBuff))=0; + } + if (pdwRetBuffSize) (*pdwRetBuffSize)=dwReadedStringLen; + + DBFreeVariant(&dbv); + }else{ + if (lpwszRetBuff && dwRetBuffSize>=sizeof(WCHAR)) (*((WCHAR*)lpwszRetBuff))=0; + if (pdwRetBuffSize) (*pdwRetBuffSize)=0; + } +return(bRet); +} + + +BOOL DB_SetStringExA(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName,LPSTR lpszValue,SIZE_T dwValueSize) +{ + BOOL bRet=FALSE; + + if (lpszValue && dwValueSize) + { + LPWSTR lpwszValueLocal; + SIZE_T dwValueSizeLocal; + + dwValueSizeLocal=(dwValueSize+MAX_PATH); + lpwszValueLocal=(LPWSTR)MEMALLOC((dwValueSizeLocal*sizeof(WCHAR))); + + if (lpwszValueLocal) + { + DBCONTACTWRITESETTING cws={0}; + + cws.szModule=lpszModule; + cws.szSetting=lpszValueName; + cws.value.type=DBVT_WCHAR; + cws.value.pwszVal=(WCHAR*)lpwszValueLocal; + + dwValueSizeLocal=MultiByteToWideChar(MRA_CODE_PAGE,0,lpszValue,dwValueSize,lpwszValueLocal,dwValueSizeLocal); + lpwszValueLocal[dwValueSizeLocal]=0; + bRet=(CallService(MS_DB_CONTACT_WRITESETTING,(WPARAM)hContact,(LPARAM)&cws)==0); + + MEMFREE(lpwszValueLocal); + } + }else{ + bRet=TRUE; + DBDeleteContactSetting(hContact,lpszModule,lpszValueName); + } +return(bRet); +} + + +BOOL DB_SetStringExW(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName,LPWSTR lpwszValue,SIZE_T dwValueSize) +{ + BOOL bRet=FALSE; + + if (lpwszValue && dwValueSize) + { + LPWSTR lpwszValueLocal=(LPWSTR)MEMALLOC(((dwValueSize+MAX_PATH)*sizeof(WCHAR))); + + if (lpwszValueLocal) + { + DBCONTACTWRITESETTING cws={0}; + + cws.szModule=lpszModule; + cws.szSetting=lpszValueName; + cws.value.type=DBVT_WCHAR; + cws.value.pwszVal=(WCHAR*)lpwszValueLocal; + memmove(lpwszValueLocal,lpwszValue,(dwValueSize*sizeof(WCHAR))); + bRet=(CallService(MS_DB_CONTACT_WRITESETTING,(WPARAM)hContact,(LPARAM)&cws)==0); + + MEMFREE(lpwszValueLocal); + } + }else{ + bRet=TRUE; + DBDeleteContactSetting(hContact,lpszModule,lpszValueName); + } +return(bRet); +} + + +int DB_WriteContactSettingBlob(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName,LPVOID lpValue,SIZE_T dwValueSize) +{ + DBCONTACTWRITESETTING cws={0}; + + cws.szModule=lpszModule; + cws.szSetting=lpszValueName; + cws.value.type=DBVT_BLOB; + cws.value.pbVal=(LPBYTE)lpValue; + cws.value.cpbVal=(WORD)dwValueSize; +return(CallService(MS_DB_CONTACT_WRITESETTING,(WPARAM)hContact,(LPARAM)&cws)); +} + + +BOOL DB_GetContactSettingBlob(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName,LPVOID lpRet,SIZE_T dwRetBuffSize,SIZE_T *pdwRetBuffSize) +{ + BOOL bRet=FALSE; + DBVARIANT dbv; + DBCONTACTGETSETTING sVal={0}; + + sVal.pValue=&dbv; + sVal.szModule=lpszModule; + sVal.szSetting=lpszValueName; + if (CallService(MS_DB_CONTACT_GETSETTING,(WPARAM)hContact,(LPARAM)&sVal)==0) + { + if (dbv.type==DBVT_BLOB) + { + if (dwRetBuffSize>=dbv.cpbVal) + { + memmove(lpRet,dbv.pbVal,dbv.cpbVal); + bRet=TRUE; + } + if (pdwRetBuffSize) (*pdwRetBuffSize)=dbv.cpbVal; + } + DBFreeVariant(&dbv); + }else{ + if (pdwRetBuffSize) (*pdwRetBuffSize)=0; + bRet=FALSE; + } +return(bRet); +} + + +DWORD GetContactFlags(HANDLE hContact) +{ + DWORD dwRet=0; + + if (IsContactMra(hContact)) + { + CHAR szEMail[MAX_EMAIL_LEN]; + SIZE_T dwEMailSize; + + dwRet=DB_Mra_GetDword(hContact,"ContactFlags",0); + dwRet&=~(CONTACT_FLAG_REMOVED|CONTACT_FLAG_GROUP|CONTACT_FLAG_INVISIBLE|CONTACT_FLAG_VISIBLE|CONTACT_FLAG_IGNORE|CONTACT_FLAG_SHADOW|CONTACT_FLAG_MULTICHAT); + dwRet|=CONTACT_FLAG_UNICODE_NAME; + + if (DB_Mra_GetStaticStringA(hContact,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + if (IsEMailChatAgent(szEMail,dwEMailSize)) + { + dwRet|=CONTACT_FLAG_MULTICHAT; + } + } + + if (DBGetContactSettingByte(hContact,"CList","Hidden",0)) dwRet|=CONTACT_FLAG_SHADOW; + + switch(DB_Mra_GetWord(hContact,"ApparentMode",0)){ + case ID_STATUS_OFFLINE: + dwRet|=CONTACT_FLAG_INVISIBLE; + break; + case ID_STATUS_ONLINE: + dwRet|=CONTACT_FLAG_VISIBLE; + break; + } + + if (CallService(MS_IGNORE_ISIGNORED,(WPARAM)hContact,IGNOREEVENT_MESSAGE)) dwRet|=CONTACT_FLAG_IGNORE; + } +return(dwRet); +} + +DWORD SetContactFlags(HANDLE hContact,DWORD dwContactFlag) +{ + DWORD dwRetErrorCode=NO_ERROR; + + if (IsContactMra(hContact)) + { + DB_Mra_SetDword(hContact,"ContactFlags",dwContactFlag); + + if (dwContactFlag&CONTACT_FLAG_SHADOW) + { + DBWriteContactSettingByte(hContact,"CList","Hidden",1); + }else{ + DBDeleteContactSetting(hContact,"CList","Hidden"); + } + switch(dwContactFlag&(CONTACT_FLAG_INVISIBLE|CONTACT_FLAG_VISIBLE)){ + case CONTACT_FLAG_INVISIBLE: + DB_Mra_SetWord(hContact,"ApparentMode",ID_STATUS_OFFLINE); + break; + case CONTACT_FLAG_VISIBLE: + DB_Mra_SetWord(hContact,"ApparentMode",ID_STATUS_ONLINE); + break; + default: + DB_Mra_SetWord(hContact,"ApparentMode",0); + break; + } + + if (dwContactFlag&CONTACT_FLAG_IGNORE) + { + CallService(MS_IGNORE_IGNORE,(WPARAM)hContact,IGNOREEVENT_MESSAGE); + }else{ + CallService(MS_IGNORE_UNIGNORE,(WPARAM)hContact,IGNOREEVENT_MESSAGE); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD GetContactBasicInfoW(HANDLE hContact,DWORD *pdwID,DWORD *pdwGroupID,DWORD *pdwContactFlag,DWORD *pdwContactSeverFlags,DWORD *pdwStatus,LPSTR lpszEMail,SIZE_T dwEMailSize,SIZE_T *pdwEMailSize,LPWSTR lpwszNick,SIZE_T dwNickSize,SIZE_T *pdwNickSize,LPSTR lpszPhones,SIZE_T dwPhonesSize,SIZE_T *pdwPhonesSize) +{ + DWORD dwRetErrorCode=NO_ERROR; + + if (IsContactMra(hContact)) + { + if (pdwID) (*pdwID)=DB_Mra_GetDword(hContact,"ContactID",-1); + if (pdwGroupID) (*pdwGroupID)=DB_Mra_GetDword(hContact,"GroupID",-1); + if (pdwContactSeverFlags) (*pdwContactSeverFlags)=DB_Mra_GetDword(hContact,"ContactSeverFlags",0); + if (pdwStatus) (*pdwStatus)=MraGetContactStatus(hContact); + if (pdwContactFlag) (*pdwContactFlag)=GetContactFlags(hContact); + + if (lpszEMail && pdwEMailSize) DB_Mra_GetStaticStringA(hContact,"e-mail",lpszEMail,dwEMailSize,pdwEMailSize); + if (lpwszNick && pdwNickSize) + { + DB_GetStaticStringW(hContact,"CList","MyHandle",lpwszNick,dwNickSize,pdwNickSize); + //if ((*pdwNickSize)==0) DebugBreak(); + } + if (lpszPhones && pdwPhonesSize) + { + char szPhone[MAX_PATH],szValue[MAX_PATH]; + SIZE_T dwPhoneSize,dwCopyed=0; + + for(SIZE_T i=0;i<3;i++) + { + mir_snprintf(szValue,SIZEOF(szValue),"MyPhone%lu",i); + if (DB_GetStaticStringA(hContact,"UserInfo",szValue,szPhone,SIZEOF(szPhone),&dwPhoneSize)) + { + if (dwCopyed) (*((LPBYTE)(lpszPhones+dwCopyed++)))=','; + dwCopyed+=CopyNumber((lpszPhones+dwCopyed),szPhone,dwPhoneSize); + } + } + (*pdwPhonesSize)=dwCopyed; + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD SetContactBasicInfoW(HANDLE hContact,DWORD dwSetInfoFlags,DWORD dwFlags,DWORD dwID,DWORD dwGroupID,DWORD dwContactFlag,DWORD dwContactSeverFlags,DWORD dwStatus,LPSTR lpszEMail,SIZE_T dwEMailSize,LPWSTR lpwszNick,SIZE_T dwNickSize,LPSTR lpszPhones,SIZE_T dwPhonesSize) +{ + DWORD dwRetErrorCode=NO_ERROR; + + if (IsContactMra(hContact)) + { + // LOCK + if (dwSetInfoFlags&SCBIFSI_LOCK_CHANGES_EVENTS) DB_Mra_SetDword(hContact,"HooksLocked",TRUE); + + // поля которые нужны, и изменения которых не отслеживаются + if(dwFlags&SCBIF_ID) DB_Mra_SetDword(hContact,"ContactID",dwID); + + if(dwFlags&SCBIF_EMAIL) + { + if (lpszEMail && dwEMailSize) DB_Mra_SetStringExA(hContact,"e-mail",lpszEMail,dwEMailSize); + } + + // поля изменения которых отслеживаются + if(dwFlags&SCBIF_GROUP_ID) DB_Mra_SetDword(hContact,"GroupID",dwGroupID); + + if(dwFlags&SCBIF_NICK) + { + if((dwFlags&SCBIF_FLAG) && ((dwContactFlag&CONTACT_FLAG_UNICODE_NAME)==0)) + { + if (lpwszNick && dwNickSize) DB_SetStringExA(hContact,"CList","MyHandle",(LPSTR)lpwszNick,dwNickSize); + }else{ + if (lpwszNick && dwNickSize) DB_SetStringExW(hContact,"CList","MyHandle",lpwszNick,dwNickSize); + //if (dwNickSize==0) DebugBreak(); + } + } + + if(dwFlags&SCBIF_PHONES) + { + if (lpszPhones && dwPhonesSize) + { + char szPhone[MAX_PATH],szValue[MAX_PATH]; + LPSTR lpszCurPhone,lpszPhoneNext; + SIZE_T i,dwCurPhoneSize; + + i=0; + lpszCurPhone=lpszPhones; + lpszPhoneNext=lpszPhones; + while(lpszPhoneNext) + { + lpszPhoneNext=(LPSTR)MemoryFindByte((lpszCurPhone-lpszPhones),lpszPhones,dwPhonesSize,','); + if (lpszPhoneNext) + { + dwCurPhoneSize=(lpszPhoneNext-lpszCurPhone); + }else{ + dwCurPhoneSize=((lpszPhones+dwPhonesSize)-lpszCurPhone); + } + + szPhone[0]='+'; + memmove((szPhone+1),lpszCurPhone,min(dwCurPhoneSize,(SIZEOF(szPhone)-1))); + mir_snprintf(szValue,SIZEOF(szValue),"MyPhone%lu",i); + DB_SetStringExA(hContact,"UserInfo",szValue,szPhone,(1+dwCurPhoneSize)); + + i++; + lpszCurPhone=(lpszPhoneNext+1); + } + } + } + + if(dwFlags&SCBIF_FLAG) SetContactFlags(hContact,dwContactFlag); + + if(dwFlags&SCBIF_SERVER_FLAG) DB_Mra_SetDword(hContact,"ContactSeverFlags",dwContactSeverFlags); + + if(dwFlags&SCBIF_STATUS) MraSetContactStatus(hContact,dwStatus); + + SetExtraIcons(hContact); + // UNLOCK + if (dwSetInfoFlags&SCBIFSI_LOCK_CHANGES_EVENTS) DB_Mra_SetDword(hContact,"HooksLocked",FALSE); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + + +HANDLE MraHContactFromEmail(LPSTR lpszEMail,SIZE_T dwEMailSize,BOOL bAddIfNeeded,BOOL bTemporary,BOOL *pbAdded) +{ + HANDLE hContact=NULL; + + if (lpszEMail && dwEMailSize) + { + BOOL bFounded=FALSE; + CHAR szEMailLocal[MAX_EMAIL_LEN]; + SIZE_T dwEMailLocalSize; + + if (dwEMailSize==-1) dwEMailSize=lstrlenA(lpszEMail); + //check not already on list + for(hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);hContact!=NULL;hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)) + { + if (IsContactMra(hContact)) + if (DB_Mra_GetStaticStringA(hContact,"e-mail",szEMailLocal,SIZEOF(szEMailLocal),&dwEMailLocalSize)) + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,szEMailLocal,dwEMailLocalSize,lpszEMail,dwEMailSize)==CSTR_EQUAL) + { + if (bTemporary==FALSE) DBDeleteContactSetting(hContact,"CList","NotOnList"); + bFounded=TRUE; + break; + } + } + + if (bFounded==FALSE && bAddIfNeeded) + {//not already there: add + if (IsEMailChatAgent(lpszEMail,dwEMailSize)) + { + GCSESSION gcw={0}; + WCHAR wszEMail[MAX_EMAIL_LEN]={0}; + + gcw.cbSize=sizeof(GCSESSION); + gcw.iType=GCW_CHATROOM; + gcw.pszModule=PROTOCOL_NAMEA; + gcw.ptszName=wszEMail; + gcw.ptszID=(LPWSTR)wszEMail; + gcw.dwFlags=GC_UNICODE; + MultiByteToWideChar(MRA_CODE_PAGE,0,lpszEMail,dwEMailSize,wszEMail,SIZEOF(wszEMail)); + + if (CallServiceSync(MS_GC_NEWSESSION,NULL,(LPARAM)&gcw)==0) + { + BOOL bChatAdded=FALSE; + for(hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);hContact!=NULL;hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)) + { + if (IsContactMra(hContact)) + if (DB_Mra_GetStaticStringA(hContact,"ChatRoomID",szEMailLocal,SIZEOF(szEMailLocal),&dwEMailLocalSize)) + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,szEMailLocal,dwEMailLocalSize,lpszEMail,dwEMailSize)==CSTR_EQUAL) + { + bChatAdded=TRUE; + break; + } + } + if (bChatAdded==FALSE) hContact=NULL; + } + }else{ + hContact=(HANDLE)CallService(MS_DB_CONTACT_ADD,0,0); + CallService(MS_PROTO_ADDTOCONTACT,(WPARAM)hContact,(LPARAM)PROTOCOL_NAMEA); + } + + if (hContact) + { + if (IsEMailChatAgent(lpszEMail,dwEMailSize)) + { + SetContactBasicInfoW(hContact,SCBIFSI_LOCK_CHANGES_EVENTS,(SCBIF_ID|SCBIF_GROUP_ID|SCBIF_SERVER_FLAG|SCBIF_STATUS|SCBIF_EMAIL),-1,-1,0,CONTACT_INTFLAG_NOT_AUTHORIZED,ID_STATUS_ONLINE,lpszEMail,dwEMailSize,NULL,0,NULL,0); + }else{ + if (bTemporary) DBWriteContactSettingByte(hContact,"CList","NotOnList",1); + DB_Mra_SetStringExA(hContact,"MirVer",MIRVER_UNKNOWN,(sizeof(MIRVER_UNKNOWN)-1)); + SetContactBasicInfoW(hContact,SCBIFSI_LOCK_CHANGES_EVENTS,(SCBIF_ID|SCBIF_GROUP_ID|SCBIF_SERVER_FLAG|SCBIF_STATUS|SCBIF_EMAIL),-1,-1,0,CONTACT_INTFLAG_NOT_AUTHORIZED,ID_STATUS_OFFLINE,lpszEMail,dwEMailSize,NULL,0,NULL,0); + } + } + } + + if (pbAdded) (*pbAdded)=(bFounded==FALSE && bAddIfNeeded && hContact); + } +return(hContact); +} + + + +BOOL MraUpdateContactInfo(HANDLE hContact) +{ + BOOL bRet=FALSE; + + if (masMraSettings.bLoggedIn && hContact) + if (IsContactMra(hContact)) + { + CHAR szEMail[MAX_EMAIL_LEN]; + SIZE_T dwEMailSize; + + if (DB_Mra_GetStaticStringA(hContact,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + MraAvatarsQueueGetAvatarSimple(masMraSettings.hAvatarsQueueHandle,GAIF_FORCE,hContact,0); + + if (MraSendCommand_WPRequestByEMail(hContact,ACKTYPE_GETINFO,szEMail,dwEMailSize)) + { + bRet=TRUE; + } + } + } +return(bRet); +} + + + +DWORD MraContactCapabilitiesGet(HANDLE hContact) +{ +return(DB_Mra_GetDword(hContact,DBSETTING_CAPABILITIES,0)); +} + +void MraContactCapabilitiesSet(HANDLE hContact,DWORD dwFutureFlags) +{ + DB_Mra_SetDword(hContact,DBSETTING_CAPABILITIES,dwFutureFlags); +} + + +DWORD MraGetContactStatus(HANDLE hContact) +{ +return(DB_Mra_GetWord(hContact,"Status",ID_STATUS_OFFLINE)); +} + + +DWORD MraSetContactStatus(HANDLE hContact,DWORD dwNewStatus) +{ + DWORD dwOldStatus=MraGetContactStatus(hContact); + + if (dwNewStatus!=dwOldStatus) + { + BOOL bChatAgent; + + bChatAgent=IsContactChatAgent(hContact); + + if (dwNewStatus==ID_STATUS_OFFLINE) + { + if (hContact) + { + DB_Mra_SetByte(hContact,DBSETTING_XSTATUSID,MRA_MIR_XSTATUS_NONE); + DB_Mra_DeleteValue(hContact,DBSETTING_XSTATUSNAME); + DB_Mra_DeleteValue(hContact,DBSETTING_XSTATUSMSG); + DB_Mra_DeleteValue(hContact,DBSETTING_BLOGSTATUSTIME); + DB_Mra_DeleteValue(hContact,DBSETTING_BLOGSTATUSID); + DB_Mra_DeleteValue(hContact,DBSETTING_BLOGSTATUS); + DB_Mra_DeleteValue(hContact,DBSETTING_BLOGSTATUSMUSIC); + MraContactCapabilitiesSet(hContact,0); + if (bChatAgent) MraChatSessionDestroy(hContact); + } + DB_Mra_SetDword(hContact,"LogonTS",0); + DB_Mra_DeleteValue(hContact,"IP"); + DB_Mra_DeleteValue(hContact,"RealIP"); + }else{ + if (dwOldStatus==ID_STATUS_OFFLINE) + { + DWORD dwTime=(DWORD)_time32(NULL); + + DB_Mra_SetDword(hContact,"LogonTS",dwTime); + DB_Mra_SetDword(hContact,"OldLogonTS",dwTime); + + if (bChatAgent) MraChatSessionNew(hContact); + } + MraAvatarsQueueGetAvatarSimple(masMraSettings.hAvatarsQueueHandle,0,hContact,0); + } + + DB_Mra_SetWord(hContact,"Status",(WORD)dwNewStatus); + } +return(dwOldStatus); +} + + +void MraUpdateEmailStatus(LPSTR lpszFrom,SIZE_T dwFromSize,LPSTR lpszSubject,SIZE_T dwSubjectSize,DWORD dwDate,DWORD dwUIDL) +{ + BOOL bTrayIconNewMailNotify; + WCHAR szStatusText[MAX_SECONDLINE]; + + bTrayIconNewMailNotify=DB_Mra_GetByte(NULL,"TrayIconNewMailNotify",MRA_DEFAULT_TRAYICON_NEW_MAIL_NOTIFY); + + if (masMraSettings.dwEmailMessagesUnRead) + { + LPSTR lpszEMail; + SIZE_T dwEMailSize; + HANDLE hContact=NULL; + WCHAR szMailBoxStatus[MAX_SECONDLINE]; + + mir_sntprintf(szMailBoxStatus,SIZEOF(szMailBoxStatus),TranslateW(L"Unread mail is available: %lu/%lu messages"),masMraSettings.dwEmailMessagesUnRead,masMraSettings.dwEmailMessagesTotal); + + if ((lpszFrom && dwFromSize) || (lpszSubject && dwSubjectSize)) + { + WCHAR szFrom[MAX_PATH]={0},szSubject[MAX_PATH]={0}; + + if (GetEMailFromString(lpszFrom,dwFromSize,&lpszEMail,&dwEMailSize)) + { + hContact=MraHContactFromEmail(lpszEMail,dwEMailSize,FALSE,TRUE,NULL); + } + + dwFromSize=MultiByteToWideChar(MRA_CODE_PAGE,0,lpszFrom,dwFromSize,szFrom,SIZEOF(szFrom)); + szFrom[dwFromSize]=0; + + dwSubjectSize=MultiByteToWideChar(MRA_CODE_PAGE,0,lpszSubject,dwSubjectSize,szSubject,SIZEOF(szSubject)); + szSubject[dwSubjectSize]=0; + + mir_sntprintf(szStatusText,SIZEOF(szStatusText),TranslateW(L"From: %s\r\nSubject: %s\r\n%s"),szFrom,szSubject,szMailBoxStatus); + }else{ + lstrcpynW(szStatusText,szMailBoxStatus,SIZEOF(szStatusText)); + } + + if (bTrayIconNewMailNotify) + { + char szServiceFunction[MAX_PATH],*pszServiceFunctionName; + CLISTEVENT cle={0}; + + cle.cbSize=sizeof(cle); + //cle.hContact; + //cle.hDbEvent; + cle.lpszProtocol=PROTOCOL_NAMEA; + cle.hIcon=IconLibGetIcon(masMraSettings.hMainMenuIcons[0]); + cle.flags=(CLEF_UNICODE|CLEF_PROTOCOLGLOBAL); + cle.pszService=""; + cle.ptszTooltip=szStatusText; + + if (DB_Mra_GetByte(NULL,"TrayIconNewMailClkToInbox",MRA_DEFAULT_TRAYICON_NEW_MAIL_CLK_TO_INBOX)) + { + memmove(szServiceFunction,PROTOCOL_NAMEA,PROTOCOL_NAME_SIZE); + pszServiceFunctionName=(szServiceFunction+PROTOCOL_NAME_LEN); + memmove(pszServiceFunctionName,MRA_GOTO_INBOX,sizeof(MRA_GOTO_INBOX)); + cle.pszService=szServiceFunction; + } + CallService(MS_CLIST_ADDEVENT,0,(LPARAM)&cle); + } + + SkinPlaySound(masMraSettings.szNewMailSound); + if (hContact) + {// update user info + MraUpdateContactInfo(hContact); + MraPopupShowFromContactW(hContact,MRA_POPUP_TYPE_EMAIL_STATUS,(MRA_POPUP_ALLOW_ENTER),szStatusText); + }else{ + MraPopupShowFromAgentW(MRA_POPUP_TYPE_EMAIL_STATUS,(MRA_POPUP_ALLOW_ENTER),szStatusText); + } + }else{ + if (DB_Mra_GetByte(NULL,"IncrementalNewMailNotify",MRA_DEFAULT_INC_NEW_MAIL_NOTIFY)) + { + if (bTrayIconNewMailNotify) CallService(MS_CLIST_REMOVEEVENT,0,(LPARAM)PROTOCOL_NAMEA); + PUDeletePopUp(masMraSettings.hWndEMailPopupStatus); + masMraSettings.hWndEMailPopupStatus=NULL; + }else{ + mir_sntprintf(szStatusText,SIZEOF(szStatusText),TranslateW(L"No unread mail is available\r\nTotal messages: %lu"),masMraSettings.dwEmailMessagesTotal); + MraPopupShowFromAgentW(MRA_POPUP_TYPE_EMAIL_STATUS,(MRA_POPUP_ALLOW_ENTER),szStatusText); + } + } +} + + +BOOL IsUnicodeEnv() +{// Are we running under unicode Miranda core ? + BOOL bRet=FALSE; + char szBuff[64]={0}; + + if (CallService(MS_SYSTEM_GETVERSIONTEXT,SIZEOF(szBuff),(LPARAM)szBuff)==0) + { + BuffToLowerCase(szBuff,szBuff,SIZEOF(szBuff)); + bRet=(MemoryFind(0,szBuff,SIZEOF(szBuff),"unicode",7)!=NULL); + } +return(bRet); +} + + +BOOL IsHTTPSProxyUsed(HANDLE hNetlibUser) +{ + BOOL bRet=FALSE; + NETLIBUSERSETTINGS nlus={0}; + + nlus.cbSize=sizeof(nlus); + if (CallService(MS_NETLIB_GETUSERSETTINGS,(WPARAM)hNetlibUser,(LPARAM)&nlus)) + { + if (nlus.useProxy && nlus.proxyType==PROXYTYPE_HTTPS) bRet=TRUE; + } +return(bRet); +} + + +BOOL IsContactMra(HANDLE hContact) +{// определяет принадлежность контакта данной копии плагина +return(CallService(MS_PROTO_ISPROTOONCONTACT,(WPARAM)hContact,(LPARAM)PROTOCOL_NAMEA)); +} + + +BOOL IsContactMraProto(HANDLE hContact) +{// определяется является ли контакт контактом MRA протокола, не зависимо от того какому плагину он принадлежит + BOOL bRet=FALSE; + LPSTR lpszProto=(LPSTR)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0); + + if (lpszProto) + { + WCHAR szBuff[MAX_PATH]; + + if (DB_GetStaticStringW(hContact,lpszProto,"AvatarLastCheckTime",szBuff,SIZEOF(szBuff),NULL)) + if (DB_GetStaticStringW(hContact,lpszProto,"AvatarLastModifiedTime",szBuff,SIZEOF(szBuff),NULL)) + { + bRet=TRUE; + } + } +return(bRet); +} + + + +BOOL IsEMailMy(LPSTR lpszEMail,SIZE_T dwEMailSize) +{ + BOOL bRet=FALSE; + + if (lpszEMail) + { + CHAR szEMailMy[MAX_EMAIL_LEN]; + SIZE_T dwEMailMySize; + + if (DB_Mra_GetStaticStringA(NULL,"e-mail",szEMailMy,SIZEOF(szEMailMy),&dwEMailMySize)) + { + if (dwEMailSize==0) dwEMailSize=lstrlenA(lpszEMail); + + if (dwEMailMySize==dwEMailSize) + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpszEMail,dwEMailSize,szEMailMy,dwEMailMySize)==CSTR_EQUAL) + { + bRet=TRUE; + } + } + } +return(bRet); +} + + +BOOL IsEMailChatAgent(LPSTR lpszEMail,SIZE_T dwEMailSize) +{ + BOOL bRet=FALSE; + + if (lpszEMail) + { + if (dwEMailSize==0) dwEMailSize=lstrlenA(lpszEMail); + if ((sizeof(MAILRU_CHAT_CONF_DOMAIN)-1)'))) + { + if (plpszEMail) (*plpszEMail)=lpszEMailStart; + if (pdwEMailSize) (*pdwEMailSize)=(lpszEMailEnd-lpszEMailStart); + + bRet=TRUE; + } + } + } + + if (bRet==FALSE) + { + if (plpszEMail) (*plpszEMail)=NULL; + if (pdwEMailSize) (*pdwEMailSize)=0; + } + +return(bRet); +} + + +DWORD GetContactEMailCountParam(HANDLE hContact,BOOL bMRAOnly,LPSTR lpszModule,LPSTR lpszValueName) +{ + DWORD dwRet=0; + CHAR szBuff[MAX_PATH],szEMail[MAX_EMAIL_LEN]; + SIZE_T i,dwEMailSize; + + if(DB_GetStaticStringA(hContact,lpszModule,lpszValueName,szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + if (bMRAOnly==FALSE || IsEMailMR(szEMail,dwEMailSize)) dwRet++; + } + + for (i=0;TRUE;i++) + { + mir_snprintf(szBuff,SIZEOF(szBuff),"%s%lu",lpszValueName,i); + if(DB_GetStaticStringA(hContact,lpszModule,szBuff,szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + if (bMRAOnly==FALSE || IsEMailMR(szEMail,dwEMailSize)) dwRet++; + }else{ + if (i>EMAILS_MIN_COUNT) break; + } + } +return(dwRet); +} + + +DWORD GetContactEMailCount(HANDLE hContact,BOOL bMRAOnly) +{ + DWORD dwRet=0; + LPSTR lpszProto; + + if (hContact) + { + lpszProto=(LPSTR)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0); + }else{ + lpszProto=PROTOCOL_NAMEA; + } + dwRet+=GetContactEMailCountParam(hContact,bMRAOnly,lpszProto,"e-mail"); + dwRet+=GetContactEMailCountParam(hContact,bMRAOnly,"UserInfo","e-mail"); + dwRet+=GetContactEMailCountParam(hContact,bMRAOnly,"UserInfo","Mye-mail"); + dwRet+=GetContactEMailCountParam(hContact,bMRAOnly,"UserInfo","Companye-mail"); + dwRet+=GetContactEMailCountParam(hContact,bMRAOnly,"UserInfo","MyCompanye-mail"); + +return(dwRet); +} + + + +BOOL GetContactFirstEMailParam(HANDLE hContact,BOOL bMRAOnly,LPSTR lpszModule,LPSTR lpszValueName,LPSTR lpszRetBuff,SIZE_T dwRetBuffSize,SIZE_T *pdwRetBuffSize) +{ + BOOL bRet=FALSE; + CHAR szBuff[MAX_PATH],szEMail[MAX_EMAIL_LEN]; + SIZE_T i,dwEMailSize; + + if(DB_GetStaticStringA(hContact,lpszModule,lpszValueName,szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + if (bMRAOnly==FALSE || IsEMailMR(szEMail,dwEMailSize)) + { + lstrcpynA(lpszRetBuff,szEMail,dwRetBuffSize); + if (pdwRetBuffSize) (*pdwRetBuffSize)=dwEMailSize; + bRet=TRUE; + } + } + + for (i=0;bRet==FALSE;i++) + { + mir_snprintf(szBuff,SIZEOF(szBuff),"%s%lu",lpszValueName,i); + if(DB_GetStaticStringA(hContact,lpszModule,szBuff,szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + if (bMRAOnly==FALSE || IsEMailMR(szEMail,dwEMailSize)) + { + lstrcpynA(lpszRetBuff,szEMail,dwRetBuffSize); + if (pdwRetBuffSize) (*pdwRetBuffSize)=dwEMailSize; + bRet=TRUE; + break; + } + }else{ + if (i>EMAILS_MIN_COUNT) break; + } + } +return(bRet); +} + + +BOOL GetContactFirstEMail(HANDLE hContact,BOOL bMRAOnly,LPSTR lpszRetBuff,SIZE_T dwRetBuffSize,SIZE_T *pdwRetBuffSize) +{ + BOOL bRet=FALSE; + LPSTR lpszProto; + + if (hContact) + { + lpszProto=(LPSTR)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0); + }else{ + lpszProto=PROTOCOL_NAMEA; + } + bRet=GetContactFirstEMailParam(hContact,bMRAOnly,lpszProto,"e-mail",lpszRetBuff,dwRetBuffSize,pdwRetBuffSize); + if (bRet==FALSE) bRet=GetContactFirstEMailParam(hContact,bMRAOnly,"UserInfo","e-mail",lpszRetBuff,dwRetBuffSize,pdwRetBuffSize); + if (bRet==FALSE) bRet=GetContactFirstEMailParam(hContact,bMRAOnly,"UserInfo","Mye-mail",lpszRetBuff,dwRetBuffSize,pdwRetBuffSize); + if (bRet==FALSE) bRet=GetContactFirstEMailParam(hContact,bMRAOnly,"UserInfo","Companye-mail",lpszRetBuff,dwRetBuffSize,pdwRetBuffSize); + if (bRet==FALSE) bRet=GetContactFirstEMailParam(hContact,bMRAOnly,"UserInfo","MyCompanye-mail",lpszRetBuff,dwRetBuffSize,pdwRetBuffSize); + +return(bRet); +} + + +///////////////////////////////////////////////////////////////////////////////////////// +// +DWORD MraAPCQueueAdd(PAPCFUNC pfnAPC,PFIFO_MT pffmtAPCQueue,ULONG_PTR dwData) +{ + DWORD dwRetErrorCode; + + if (masMraSettings.hThreadAPC && pffmtAPCQueue && pfnAPC) + { + MRA_APC_QUEUE_ITEM *pqiApcQueueItem; + + pqiApcQueueItem=(MRA_APC_QUEUE_ITEM*)MEMALLOC(sizeof(MRA_APC_QUEUE_ITEM)); + if (pqiApcQueueItem) + { + pqiApcQueueItem->pfnAPC=pfnAPC; + FifoMTItemPush(pffmtAPCQueue,(PCFIFO_MT_ITEM)pqiApcQueueItem,(LPVOID)dwData); + SetEvent(masMraSettings.hWaitEventThreadAPCHandle); + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=GetLastError(); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +void MraAPCQueueProcess(PFIFO_MT pffmtAPCQueue) +{ + LPVOID lpData; + MRA_APC_QUEUE_ITEM *pqiApcQueueItem; + + while(FifoMTItemPop(pffmtAPCQueue,(PFIFO_MT_ITEM*)&pqiApcQueueItem,&lpData)==NO_ERROR) + { + SleepEx(10,FALSE); + pqiApcQueueItem->pfnAPC((ULONG_PTR)lpData); + MEMFREE(pqiApcQueueItem); + } +} + + +void MraAPCQueueDestroy(PFIFO_MT pffmtAPCQueue) +{ + if (masMraSettings.hThreadAPC) + { + LPVOID lpData; + PFIFO_MT_ITEM pffmtiFifoItem; + + FifoMTLock(pffmtAPCQueue); + + while(FifoMTItemPop(pffmtAPCQueue,&pffmtiFifoItem,&lpData)==NO_ERROR) + { + MEMFREE(lpData); + MEMFREE(pffmtiFifoItem); + } + + FifoMTUnLock(pffmtAPCQueue); + FifoMTDestroy(pffmtAPCQueue); + } +} + + +void ShowFormatedErrorMessage(LPWSTR lpwszErrText,DWORD dwErrorCode) +{ + WCHAR szErrorText[2048],szErrDescription[1024]; + SIZE_T dwErrDescriptionSize; + + if (dwErrorCode==NO_ERROR) + { + mir_sntprintf(szErrorText,SIZEOF(szErrorText),L"%s",TranslateW(lpwszErrText)); + }else{ + dwErrDescriptionSize=(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,dwErrorCode,0,szErrDescription,(SIZEOF(szErrDescription)-sizeof(WCHAR)),NULL)-2); + szErrDescription[dwErrDescriptionSize]=0; + mir_sntprintf(szErrorText,SIZEOF(szErrorText),L"%s %lu: %s",TranslateW(lpwszErrText),dwErrorCode,szErrDescription); + } + MraPopupShowFromAgentW(MRA_POPUP_TYPE_ERROR,0,szErrorText); +} + + +DWORD ProtoBroadcastAckAsynchEx(const char *szModule,HANDLE hContact,int type,int hResult,HANDLE hProcess,LPARAM lParam,SIZE_T dwLparamSize) +{ + DWORD dwRetErrorCode; + SIZE_T dwModuleSize; + ACKDATA *lpAck; + + dwModuleSize=lstrlenA(szModule); + if (dwLparamSize==-1) dwLparamSize=lstrlenA((LPSTR)lParam); + lpAck=(ACKDATA*)MEMALLOC((sizeof(ACKDATA)+dwModuleSize+dwLparamSize+sizeof(DWORD))); + if (lpAck) + { + lpAck->cbSize=sizeof(ACKDATA); + lpAck->szModule=(((char*)lpAck)+sizeof(ACKDATA)); + lpAck->hContact=hContact; + lpAck->type=type; + lpAck->result=hResult; + lpAck->hProcess=hProcess; + if (dwLparamSize) + { + lpAck->lParam=(LPARAM)(lpAck->szModule+dwModuleSize); + memmove((LPVOID)lpAck->lParam,(LPVOID)lParam,dwLparamSize); + }else{ + lpAck->lParam=lParam; + } + memmove((LPVOID)lpAck->szModule,(LPVOID)szModule,dwModuleSize); + + if ((dwRetErrorCode=MraAPCQueueAdd(ThreadMarandaCallbackAck,&masMraSettings.ffmtAPCQueue,(ULONG_PTR)lpAck))!=NO_ERROR) + { + CallService(MS_PROTO_BROADCASTACK,0,(LPARAM)lpAck); + MEMFREE(lpAck); + } + }else{ + dwRetErrorCode=GetLastError(); + } +return(dwRetErrorCode); +} + + +void CALLBACK ThreadMarandaCallbackAck(ULONG_PTR dwParam) +{ + if (dwParam) + { + CallService(MS_PROTO_BROADCASTACK,0,(LPARAM)dwParam); + MEMFREE(dwParam); + } +} + + +void MraUserAPCThreadProc(LPVOID lpParameter) +{ + DWORD dwWaitRetCode=WAIT_TIMEOUT,dwCurTickTime,dwNextCheckTime,dwLastPingTime,dwFailCounter; + + dwNextCheckTime=0; + dwFailCounter=0; + + while(InterlockedExchangeAdd((volatile LONG*)&masMraSettings.dwAPCThreadRunning,0)) + { + MraAPCQueueProcess(&masMraSettings.ffmtAPCQueue); + + if (masMraSettings.hThreadWorker) + if (IsThreadAlive(masMraSettings.hThreadWorker)) + {// check man thread last answer time + dwCurTickTime=GetTickCount(); + + if (dwCurTickTime>dwNextCheckTime) + { + dwLastPingTime=InterlockedExchangeAdd((volatile LONG*)&masMraSettings.dwThreadWorkerLastPingTime,0); + if ((dwCurTickTime>dwLastPingTime) && ((dwCurTickTime-dwLastPingTime)>(THREAD_MAX_PING_TIME*1000))) + {// ping failure, thread not answer + dwFailCounter++; + DebugPrintCRLFW(L"Watchdog: mra worker thread not answering"); + if (dwFailCounter>THREAD_MAX_PING_FAIL_COUNT) + { + DebugPrintCRLFW(L"Watchdog: TERMINATING mra worker thread"); + TerminateThread(masMraSettings.hThreadWorker,WAIT_TIMEOUT); + MraThreadClean(); + dwFailCounter=0; + } + }else{// ping ok, reset failures counter + dwFailCounter=0; + } + dwNextCheckTime=(dwCurTickTime+(THREAD_MAX_PING_TIME*1000)); + } + }else{// main thread is die, clean up + DebugPrintCRLFW(L"Watchdog: mra worker thread is down!!!!"); + MraThreadClean(); + } + dwWaitRetCode=WaitForSingleObjectEx(masMraSettings.hWaitEventThreadAPCHandle,THREAD_SLEEP_TIME,FALSE); + } + + if (masMraSettings.hWaitEventThreadAPCHandle) + { + CloseHandle(masMraSettings.hWaitEventThreadAPCHandle); + masMraSettings.hWaitEventThreadAPCHandle=NULL; + } + MraAPCQueueDestroy(&masMraSettings.ffmtAPCQueue); + masMraSettings.hThreadAPC=NULL; + InterlockedExchange((volatile LONG*)&masMraSettings.dwAPCThreadRunning,FALSE); + + DebugPrintCRLFW(L"Watchdog: APC thread ended, no watching."); +} + + + +DWORD CreateBlobFromContact(HANDLE hContact,LPWSTR lpwszRequestReason,SIZE_T dwRequestReasonSize,LPBYTE lpbBuff,SIZE_T dwBuffSize,SIZE_T *pdwBuffSizeRet) +{ + DWORD dwRetErrorCode; + SIZE_T dwBuffSizeRet=((sizeof(DWORD)*2)+dwRequestReasonSize+5),dwSize; + + if (dwBuffSize>=dwBuffSizeRet) + { + PBYTE pCurBlob=lpbBuff; + + (*(DWORD*)pCurBlob)=0;pCurBlob+=sizeof(DWORD); + (*(DWORD*)pCurBlob)=(DWORD)hContact;pCurBlob+=sizeof(DWORD); + + DB_Mra_GetStaticStringA(hContact,"Nick",(LPSTR)pCurBlob,(dwBuffSize-(pCurBlob-lpbBuff)),&dwSize); + (*(pCurBlob+dwSize))=0; + pCurBlob+=(dwSize+1); + + DB_Mra_GetStaticStringA(hContact,"FirstName",(LPSTR)pCurBlob,(dwBuffSize-(pCurBlob-lpbBuff)),&dwSize); + (*(pCurBlob+dwSize))=0; + pCurBlob+=(dwSize+1); + + DB_Mra_GetStaticStringA(hContact,"LastName",(LPSTR)pCurBlob,(dwBuffSize-(pCurBlob-lpbBuff)),&dwSize); + (*(pCurBlob+dwSize))=0; + pCurBlob+=(dwSize+1); + + DB_Mra_GetStaticStringA(hContact,"e-mail",(LPSTR)pCurBlob,(dwBuffSize-(pCurBlob-lpbBuff)),&dwSize); + (*(pCurBlob+dwSize))=0; + pCurBlob+=(dwSize+1); + + dwSize=WideCharToMultiByte(MRA_CODE_PAGE,0,lpwszRequestReason,dwRequestReasonSize,(LPSTR)pCurBlob,(dwBuffSize-(pCurBlob-lpbBuff)),NULL,NULL); + //memmove(pCurBlob,lpszRequestReason,dwRequestReasonSize); + (*(pCurBlob+dwSize))=0; + pCurBlob+=(dwSize+1); + + dwBuffSizeRet=(pCurBlob-lpbBuff); + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=ERROR_INSUFFICIENT_BUFFER; + } + + if (pdwBuffSizeRet) (*pdwBuffSizeRet)=dwBuffSizeRet; +return(dwRetErrorCode); +} + + + +void CListCreateMenu(LONG lPosition,LONG lPopupPosition,HANDLE hMainIcon,LPSTR pszContactOwner,LPSTR lpszCListMenuType,const GUI_DISPLAY_ITEM *pgdiItems,HANDLE *hIcoLibIcons,SIZE_T dwCount,HANDLE *hResult) +{ + if (pgdiItems && hIcoLibIcons && dwCount && hResult) + { + char szServiceFunction[MAX_PATH],*pszServiceFunctionName; + CLISTMENUITEM mi={0}; + + memmove(szServiceFunction,PROTOCOL_NAMEA,PROTOCOL_NAME_SIZE); + pszServiceFunctionName=szServiceFunction+PROTOCOL_NAME_LEN; + + mi.cbSize=sizeof(mi); + mi.popupPosition=lPopupPosition; + mi.ptszPopupName=PROTOCOL_DISPLAY_NAMEW; + mi.pszService=szServiceFunction; + mi.flags=(CMIF_UNICODE|CMIF_ICONFROMICOLIB); + + for (SIZE_T i=0;i='0' && btChar<='9') (*lpbOutBuff++)=btChar; + } + (*lpbOutBuff)=0; + +return((lpbOutBuff-(LPBYTE)lpcOutBuff)); +} + + +/* +BOOL IsPhone(LPSTR lpszString,SIZE_T dwStringSize) +{ + BOOL bRet; + + if (dwStringSize>1) + {// country code + BYTE btChar; + + bRet=TRUE; + for(SIZE_T i=0;i'9') + if (btChar!='+' && btChar!='S' && btChar!='M' && btChar!=' ' && btChar!='(' && btChar!=')') + { + bRet=FALSE; + break; + } + } + }else{ + bRet=FALSE; + } +return(bRet); +} + + +BOOL IsContactPhoneParam(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName,LPSTR lpszPhone,SIZE_T dwPhoneSize) +{ + BOOL bRet=FALSE; + char szBuff[MAX_PATH],szPhoneLocal[MAX_EMAIL_LEN]; + SIZE_T i,dwPhoneSizeLocal; + + if(DB_GetStaticStringA(hContact,lpszModule,lpszValueName,szPhoneLocal,SIZEOF(szPhoneLocal),&dwPhoneSizeLocal)) + if (IsPhone(szPhoneLocal,dwPhoneSizeLocal)) + { + dwPhoneSizeLocal=CopyNumber(szPhoneLocal,szPhoneLocal,dwPhoneSizeLocal); + if (MemoryCompare(szPhoneLocal,dwPhoneSizeLocal,lpszPhone,dwPhoneSize)==CMEM_EQUAL) + { + bRet=TRUE; + } + } + + for (i=0;bRet==FALSE;i++) + { + mir_snprintf(szBuff,SIZEOF(szBuff),"%s%lu",lpszValueName,i); + if(DB_GetStaticStringA(hContact,lpszModule,szBuff,szPhoneLocal,SIZEOF(szPhoneLocal),&dwPhoneSizeLocal)) + { + if (IsPhone(szPhoneLocal,dwPhoneSizeLocal)) + { + dwPhoneSizeLocal=CopyNumber(szPhoneLocal,szPhoneLocal,dwPhoneSizeLocal); + if (MemoryCompare(szPhoneLocal,dwPhoneSizeLocal,lpszPhone,dwPhoneSize)==CMEM_EQUAL) + { + bRet=TRUE; + break; + } + } + }else{ + if (i>PHONES_MIN_COUNT) break; + } + } +return(bRet); +} + + +BOOL IsContactPhone(HANDLE hContact,LPSTR lpszPhone,SIZE_T dwPhoneSize) +{ + BOOL bRet=FALSE; + char szPhoneLocal[MAX_EMAIL_LEN]; + LPSTR lpszProto; + SIZE_T dwPhoneSizeLocal; + + if (hContact) + { + lpszProto=(LPSTR)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0); + }else{ + lpszProto=PROTOCOL_NAMEA; + } + dwPhoneSizeLocal=CopyNumber(szPhoneLocal,lpszPhone,dwPhoneSize); + + if (bRet==FALSE) bRet=IsContactPhoneParam(hContact,lpszProto,"Phone",szPhoneLocal,dwPhoneSizeLocal); + if (bRet==FALSE) bRet=IsContactPhoneParam(hContact,lpszProto,"Cellular",szPhoneLocal,dwPhoneSizeLocal); + if (bRet==FALSE) bRet=IsContactPhoneParam(hContact,lpszProto,"Fax",szPhoneLocal,dwPhoneSizeLocal); + if (bRet==FALSE) bRet=IsContactPhoneParam(hContact,"UserInfo","MyPhone",szPhoneLocal,dwPhoneSizeLocal); + if (bRet==FALSE) bRet=IsContactPhoneParam(hContact,"UserInfo","Phone",szPhoneLocal,dwPhoneSizeLocal); + if (bRet==FALSE) bRet=IsContactPhoneParam(hContact,"UserInfo","Cellular",szPhoneLocal,dwPhoneSizeLocal); + if (bRet==FALSE) bRet=IsContactPhoneParam(hContact,"UserInfo","Fax",szPhoneLocal,dwPhoneSizeLocal); + +return(bRet); +} + + +HANDLE MraHContactFromPhone(LPSTR lpszPhone,SIZE_T dwPhoneSize,BOOL bAddIfNeeded,BOOL bTemporary,BOOL *pbAdded) +{ + HANDLE hContact=NULL; + + if (lpszPhone && dwPhoneSize) + { + BOOL bFounded=FALSE; + + //check not already on list + for(hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);hContact!=NULL;hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)) + { + if (IsContactPhone(hContact,lpszPhone,dwPhoneSize)) + { + if (bTemporary==FALSE) DBDeleteContactSetting(hContact,"CList","NotOnList"); + bFounded=TRUE; + break; + } + } + + if (bFounded==FALSE && bAddIfNeeded) + {//not already there: add + hContact=(HANDLE)CallService(MS_DB_CONTACT_ADD,0,0); + CallService(MS_PROTO_ADDTOCONTACT,(WPARAM)hContact,(LPARAM)PROTOCOL_NAMEA); + //SetContactBasicInfoW(hContact,SCBIFSI_LOCK_CHANGES_EVENTS,(SCBIF_ID|SCBIF_GROUP_ID|SCBIF_FLAG|SCBIF_SERVER_FLAG|SCBIF_STATUS|SCBIF_EMAIL|SCBIF_PHONES),-1,-1,0,CONTACT_INTFLAG_NOT_AUTHORIZED,ID_STATUS_OFFLINE,lpszEMail,dwEMailSize,NULL,0,lpszPhone,dwPhoneSize); + if (bTemporary) DBWriteContactSettingByte(hContact,"CList","NotOnList",1); + DB_Mra_SetStringExA(hContact,"MirVer",MIRVER_UNKNOWN,(sizeof(MIRVER_UNKNOWN)-1)); + MraSetContactStatus(hContact,ID_STATUS_OFFLINE); + } + + if (pbAdded) (*pbAdded)=(bFounded==FALSE && bAddIfNeeded && hContact); + } +return(hContact); +}*/ + +void EnableControlsArray(HWND hWndDlg,WORD *pwControlsList,SIZE_T dwControlsListCount,BOOL bEnabled) +{ + for(SIZE_T i=0;idwXStatus=lParam; + psxsData->hDlgIcon=IconLibGetIcon(masMraSettings.hXStatusAdvancedStatusIcons[psxsData->dwXStatus]); + psxsData->dwCountdown=5; + + hWndEdit=GetDlgItem(hWndDlg,IDC_XTITLE); + OldMessageEditProc=(WNDPROC)SetWindowLongPtr(hWndEdit,GWLP_WNDPROC,(LONG_PTR)MessageEditSubclassProc); + SetWindowLongPtr(hWndEdit,GWLP_USERDATA,(LONG_PTR)OldMessageEditProc); + + hWndEdit=GetDlgItem(hWndDlg,IDC_XMSG); + OldMessageEditProc=(WNDPROC)SetWindowLongPtr(hWndEdit,GWLP_WNDPROC,(LONG_PTR)MessageEditSubclassProc); + SetWindowLongPtr(hWndEdit,GWLP_USERDATA,(LONG_PTR)OldMessageEditProc); + + SetWindowLongPtr(hWndDlg,GWLP_USERDATA,(LONG_PTR)psxsData); + SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_XTITLE,EM_LIMITTEXT,STATUS_TITLE_MAX,0); + SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_XMSG,EM_LIMITTEXT,STATUS_DESC_MAX,0); + SendMessage(hWndDlg,WM_SETICON,ICON_BIG,(LPARAM)psxsData->hDlgIcon); + SendMessage(hWndDlg,WM_SETTEXT,0,(LPARAM)TranslateW(lpcszXStatusNameDef[psxsData->dwXStatus])); + + mir_snprintf(szValueName,SIZEOF(szValueName),"XStatus%ldName",psxsData->dwXStatus); + if (DB_Mra_GetStaticStringW(NULL,szValueName,szBuff,(STATUS_TITLE_MAX+1),NULL)) + {// custom xstatus name + SET_DLG_ITEM_TEXT(hWndDlg,IDC_XTITLE,szBuff); + }else{// default xstatus name + SET_DLG_ITEM_TEXT(hWndDlg,IDC_XTITLE,TranslateW(lpcszXStatusNameDef[psxsData->dwXStatus])); + } + + mir_snprintf(szValueName,SIZEOF(szValueName),"XStatus%ldMsg",psxsData->dwXStatus); + if (DB_Mra_GetStaticStringW(NULL,szValueName,szBuff,(STATUS_DESC_MAX+1),NULL)) + {// custom xstatus description + SET_DLG_ITEM_TEXT(hWndDlg,IDC_XMSG,szBuff); + }else{// default xstatus description + SET_DLG_ITEM_TEXT(hWndDlg,IDC_XMSG,L""); + } + + SendMessage(hWndDlg,WM_TIMER,0,0); + SetTimer(hWndDlg,1,1000,0); + iRet=TRUE; + } + break; + case WM_TIMER: + if(psxsData->dwCountdown!=-1) + { + WCHAR szBuff[MAX_PATH]; + mir_sntprintf(szBuff,SIZEOF(szBuff),L"%s %ld",TranslateW(L"Closing in"),psxsData->dwCountdown); + SET_DLG_ITEM_TEXT(hWndDlg,IDOK,szBuff); + psxsData->dwCountdown--; + break; + } + case WM_CLOSE: + DestroyWindow(hWndDlg); + break; + case WM_COMMAND: + switch(LOWORD(wParam)){ + case IDOK: + DestroyWindow(hWndDlg); + break; + case IDC_XTITLE: + case IDC_XMSG: + KillTimer(hWndDlg,1); + SET_DLG_ITEM_TEXTW(hWndDlg,IDOK,TranslateW(L"OK")); + break; + } + break; + case WM_DESTROY: + if (psxsData) + { // set our xStatus + char szValueName[MAX_PATH]; + HWND hWndEdit; + WCHAR szBuff[STATUS_TITLE_MAX+STATUS_DESC_MAX]; + SIZE_T dwBuffSize; + WNDPROC OldMessageEditProc; + CLISTMENUITEM mi={0}; + + SetWindowLongPtr(hWndDlg,GWLP_USERDATA,(LONG_PTR)0); + + hWndEdit=GetDlgItem(hWndDlg,IDC_XTITLE); + OldMessageEditProc=(WNDPROC)GetWindowLongPtr(hWndEdit,GWLP_USERDATA); + SetWindowLongPtr(hWndEdit,GWLP_WNDPROC,(LONG_PTR)OldMessageEditProc); + SetWindowLongPtr(hWndEdit,GWLP_USERDATA,(LONG_PTR)0); + + hWndEdit=GetDlgItem(hWndDlg,IDC_XMSG); + OldMessageEditProc=(WNDPROC)GetWindowLongPtr(hWndEdit,GWLP_USERDATA); + SetWindowLongPtr(hWndEdit,GWLP_WNDPROC,(LONG_PTR)OldMessageEditProc); + SetWindowLongPtr(hWndEdit,GWLP_USERDATA,(LONG_PTR)0); + + dwBuffSize=GET_DLG_ITEM_TEXT(hWndDlg,IDC_XMSG,szBuff,(STATUS_DESC_MAX+1)); + mir_snprintf(szValueName,SIZEOF(szValueName),"XStatus%ldMsg",psxsData->dwXStatus); + DB_Mra_SetStringExW(NULL,szValueName,szBuff,dwBuffSize); + DB_Mra_SetStringExW(NULL,DBSETTING_XSTATUSMSG,szBuff,dwBuffSize); + + dwBuffSize=GET_DLG_ITEM_TEXT(hWndDlg,IDC_XTITLE,szBuff,(STATUS_TITLE_MAX+1)); + if (dwBuffSize==0) + {// user delete all text + lstrcpynW(szBuff,TranslateW(lpcszXStatusNameDef[psxsData->dwXStatus]),(STATUS_TITLE_MAX+1)); + dwBuffSize=lstrlenW(szBuff); + } + mir_snprintf(szValueName,SIZEOF(szValueName),"XStatus%dName",psxsData->dwXStatus); + DB_Mra_SetStringExW(NULL,szValueName,szBuff,dwBuffSize); + DB_Mra_SetStringExW(NULL,DBSETTING_XSTATUSNAME,szBuff,dwBuffSize); + + mi.cbSize=sizeof(mi); + mi.flags=(CMIM_NAME|CMIF_UNICODE); + mi.ptszName=szBuff; + CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)masMraSettings.hXStatusMenuItems[psxsData->dwXStatus],(LPARAM)&mi); + + MraSetXStatusInternal(psxsData->dwXStatus); + + MEMFREE(psxsData); + } + EndDialog(hWndDlg,NO_ERROR); + break; + //default: + // bRet=DefWindowProc(hWndDlg,message,wParam,lParam); + // break; + } +return(iRet); +} + + +BOOL MraSendReplyBlogStatus(HANDLE hContact) +{ + BOOL bRet; + + bRet=(CreateDialogParam(masMraSettings.hInstance,MAKEINTRESOURCE(IDD_MINIBLOG),NULL,SendReplyBlogStatusDlgProc,(LPARAM)hContact)!=NULL); +return(bRet); +} + +INT_PTR CALLBACK SendReplyBlogStatusDlgProc(HWND hWndDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=FALSE; + SetBlogStatusData *psbsdData=(SetBlogStatusData*)GetWindowLongPtr(hWndDlg,GWLP_USERDATA); + + switch(message){ + case WM_INITDIALOG:// set our xStatus + TranslateDialogDefault(hWndDlg); + + psbsdData=(SetBlogStatusData*)MEMALLOC(sizeof(SetBlogStatusData)); + if (psbsdData) + { + HWND hWndEdit; + DWORD dwTime; + WCHAR szBuff[MICBLOG_STATUS_MAX]; + WNDPROC OldMessageEditProc; + SYSTEMTIME stBlogStatusTime={0}; + + psbsdData->hContact=(HANDLE)lParam; + //psbsdData->hDlgIcon=IconLibGetIcon(masMraSettings.hXStatusAdvancedStatusIcons[psxsData->dwXStatus]); + SetWindowLongPtr(hWndDlg,GWLP_USERDATA,(LONG_PTR)psbsdData); + + hWndEdit=GetDlgItem(hWndDlg,IDC_MSG_TO_SEND); + OldMessageEditProc=(WNDPROC)SetWindowLongPtr(hWndEdit,GWLP_WNDPROC,(LONG_PTR)MessageEditSubclassProc); + SetWindowLongPtr(hWndEdit,GWLP_USERDATA,(LONG_PTR)OldMessageEditProc); + SendMessage(hWndEdit,EM_LIMITTEXT,MICBLOG_STATUS_MAX,0); + + + SendMessage(hWndDlg,WM_SETICON,ICON_BIG,(LPARAM)IconLibGetIcon(masMraSettings.hMainMenuIcons[5])); + + if (DB_Mra_GetStaticStringW(psbsdData->hContact,DBSETTING_BLOGSTATUS,szBuff,SIZEOF(szBuff),NULL)) + {// blog status message + SET_DLG_ITEM_TEXT(hWndDlg,IDC_USER_BLOG_STATUS_MSG,szBuff); + } + + if (psbsdData->hContact) + {// reply to some user blog + mir_sntprintf(szBuff,SIZEOF(szBuff),TranslateW(L"Reply to %s blog status"),GetContactNameW(psbsdData->hContact)); + SendMessage(hWndDlg,WM_SETTEXT,0,(LPARAM)szBuff); + }else{ + SendMessage(hWndDlg,WM_SETTEXT,0,(LPARAM)TranslateW(L"Set my blog status")); + } + + dwTime=DB_Mra_GetDword(psbsdData->hContact,DBSETTING_BLOGSTATUSTIME,0); + if (dwTime && MakeLocalSystemTimeFromTime32(dwTime,&stBlogStatusTime)) + { + mir_sntprintf(szBuff,SIZEOF(szBuff),L"%s: %04ld.%02ld.%02ld %02ld:%02ld",TranslateW(L"Writed"),stBlogStatusTime.wYear,stBlogStatusTime.wMonth,stBlogStatusTime.wDay,stBlogStatusTime.wHour,stBlogStatusTime.wMinute); + }else{ + szBuff[0]=0; + } + SET_DLG_ITEM_TEXT(hWndDlg,IDC_STATIC_WRITED_TIME,szBuff); + + EnableWindow(GetDlgItem(hWndDlg,IDC_CHK_NOTIFY),(psbsdData->hContact==NULL)); + + iRet=TRUE; + } + break; + case WM_CLOSE: + DestroyWindow(hWndDlg); + break; + case WM_COMMAND: + switch(LOWORD(wParam)){ + case IDOK: + { + DWORD dwFlags; + WCHAR szBuff[MICBLOG_STATUS_MAX]; + SIZE_T dwBuffSize; + DWORDLONG dwBlogStatusID; + + dwBuffSize=GET_DLG_ITEM_TEXT(hWndDlg,IDC_MSG_TO_SEND,szBuff,SIZEOF(szBuff)); + if (psbsdData->hContact) + { + dwFlags=(MRIM_BLOG_STATUS_REPLY|MRIM_BLOG_STATUS_NOTIFY); + DB_Mra_GetContactSettingBlob(psbsdData->hContact,DBSETTING_BLOGSTATUSID,&dwBlogStatusID,sizeof(DWORDLONG),NULL); + }else{ + dwFlags=MRIM_BLOG_STATUS_UPDATE; + if (IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_CHK_NOTIFY)) dwFlags|=MRIM_BLOG_STATUS_NOTIFY; + dwBlogStatusID=0; + } + MraSendCommand_ChangeUserBlogStatus(dwFlags,szBuff,dwBuffSize,dwBlogStatusID); + } + case IDCANCEL: + DestroyWindow(hWndDlg); + break; + case IDC_MSG_TO_SEND: + if (HIWORD(wParam)==EN_CHANGE) + { + WCHAR wszBuff[MAX_PATH]; + SIZE_T dwMessageSize=GET_DLG_ITEM_TEXT_LENGTH(hWndDlg,IDC_MSG_TO_SEND); + + EnableWindow(GetDlgItem(hWndDlg,IDOK),dwMessageSize); + mir_sntprintf(wszBuff,SIZEOF(wszBuff),L"%d/%d",dwMessageSize,MICBLOG_STATUS_MAX); + SET_DLG_ITEM_TEXTW(hWndDlg,IDC_STATIC_CHARS_COUNTER,wszBuff); + } + break; + } + break; + case WM_DESTROY: + if (psbsdData) + { + HWND hWndEdit; + WNDPROC OldMessageEditProc; + + SetWindowLongPtr(hWndDlg,GWLP_USERDATA,(LONG_PTR)0); + + hWndEdit=GetDlgItem(hWndDlg,IDC_MSG_TO_SEND); + OldMessageEditProc=(WNDPROC)GetWindowLongPtr(hWndEdit,GWLP_USERDATA); + SetWindowLongPtr(hWndEdit,GWLP_WNDPROC,(LONG_PTR)OldMessageEditProc); + SetWindowLongPtr(hWndEdit,GWLP_USERDATA,(LONG_PTR)0); + + + MEMFREE(psbsdData); + } + EndDialog(hWndDlg,NO_ERROR); + break; + //default: + // bRet=DefWindowProc(hWndDlg,message,wParam,lParam); + // break; + } +return(iRet); +} + + +DWORD GetYears(CONST PSYSTEMTIME pcstSystemTime) +{ + DWORD dwRet=0; + + if (pcstSystemTime) + { + SYSTEMTIME stTime; + + GetLocalTime(&stTime); + dwRet=(stTime.wYear-pcstSystemTime->wYear); + if (stTime.wMonthwMonth) + {// день рожденья будет в след месяце + dwRet--; + }else{// др ещё будет в этом месяце или уже был... + if (stTime.wMonth==pcstSystemTime->wMonth) + {// др в этом месяце + if (stTime.wDaywDay) + {// ещё только будет, не сегодня + dwRet--; + }// др ещё будет сегодня или уже был... + } + } + } +return(dwRet); +} + + + +DWORD FindFile(LPWSTR lpszFolder,DWORD dwFolderLen,LPWSTR lpszFileName,DWORD dwFileNameLen,LPWSTR lpszRetFilePathName,DWORD dwRetFilePathLen,DWORD *pdwRetFilePathLen) +{ + DWORD dwRetErrorCode; + + if (lpszFolder && dwFolderLen && lpszFileName && dwFileNameLen) + { + WCHAR szPath[32768]; + DWORD dwPathLen,dwRecDeepAllocated,dwRecDeepCurPos,dwFilePathLen; + RECURSION_DATA_STACK_ITEM *prdsiItems; + + if (dwFolderLen==-1) dwFolderLen=lstrlenW(lpszFolder); + if (dwFileNameLen==-1) dwFileNameLen=lstrlenW(lpszFileName); + + dwRecDeepCurPos=0; + dwRecDeepAllocated=RECURSION_DATA_STACK_ITEMS_MIN; + prdsiItems=(RECURSION_DATA_STACK_ITEM*)MEMALLOC(dwRecDeepAllocated*sizeof(RECURSION_DATA_STACK_ITEM)); + if (prdsiItems) + { + dwPathLen=dwFolderLen; + memmove(szPath,lpszFolder,(dwPathLen*sizeof(WCHAR))); + if (szPath[(dwPathLen-1)]!='\\') + { + szPath[dwPathLen]='\\'; + dwPathLen++; + } + szPath[dwPathLen]=0; + lstrcatW(szPath,L"*.*"); + + prdsiItems[dwRecDeepCurPos].dwFileNameLen=0; + prdsiItems[dwRecDeepCurPos].hFind=FindFirstFileEx(szPath,FindExInfoStandard,&prdsiItems[dwRecDeepCurPos].w32fdFindFileData,FindExSearchNameMatch,NULL,0); + if (prdsiItems[dwRecDeepCurPos].hFind!=INVALID_HANDLE_VALUE) + { + dwRetErrorCode=ERROR_FILE_NOT_FOUND; + do + { + dwPathLen-=prdsiItems[dwRecDeepCurPos].dwFileNameLen; + + while(dwRetErrorCode==ERROR_FILE_NOT_FOUND && FindNextFile(prdsiItems[dwRecDeepCurPos].hFind,&prdsiItems[dwRecDeepCurPos].w32fdFindFileData)) + { + if (prdsiItems[dwRecDeepCurPos].w32fdFindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) + {// folder + if (CompareString(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,prdsiItems[dwRecDeepCurPos].w32fdFindFileData.cFileName,-1,L".",1)!=CSTR_EQUAL) + if (CompareString(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,prdsiItems[dwRecDeepCurPos].w32fdFindFileData.cFileName,-1,L"..",2)!=CSTR_EQUAL) + { + prdsiItems[dwRecDeepCurPos].dwFileNameLen=(lstrlenW(prdsiItems[dwRecDeepCurPos].w32fdFindFileData.cFileName)+1); + memmove((szPath+dwPathLen),prdsiItems[dwRecDeepCurPos].w32fdFindFileData.cFileName,(prdsiItems[dwRecDeepCurPos].dwFileNameLen*sizeof(WCHAR))); + lstrcatW(szPath,L"\\*.*"); + dwPathLen+=prdsiItems[dwRecDeepCurPos].dwFileNameLen; + + dwRecDeepCurPos++; + if (dwRecDeepCurPos==dwRecDeepAllocated) + {// need more space + dwRecDeepAllocated+=RECURSION_DATA_STACK_ITEMS_MIN; + prdsiItems=(RECURSION_DATA_STACK_ITEM*)MEMREALLOC(prdsiItems,dwRecDeepAllocated*sizeof(RECURSION_DATA_STACK_ITEM)); + if (prdsiItems==NULL) + { + dwRecDeepCurPos=0; + dwRetErrorCode=GetLastError(); + break; + } + } + prdsiItems[dwRecDeepCurPos].hFind=FindFirstFileEx(szPath,FindExInfoStandard,&prdsiItems[dwRecDeepCurPos].w32fdFindFileData,FindExSearchNameMatch,NULL,0); + } + }else{// file + if (CompareString(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,prdsiItems[dwRecDeepCurPos].w32fdFindFileData.cFileName,-1,lpszFileName,dwFileNameLen)==CSTR_EQUAL) + { + prdsiItems[dwRecDeepCurPos].dwFileNameLen=lstrlenW(prdsiItems[dwRecDeepCurPos].w32fdFindFileData.cFileName); + memmove((szPath+dwPathLen),prdsiItems[dwRecDeepCurPos].w32fdFindFileData.cFileName,((prdsiItems[dwRecDeepCurPos].dwFileNameLen+1)*sizeof(WCHAR))); + dwFilePathLen=(dwPathLen+prdsiItems[dwRecDeepCurPos].dwFileNameLen); + + if (pdwRetFilePathLen) (*pdwRetFilePathLen)=dwFilePathLen; + if (lpszRetFilePathName && dwRetFilePathLen) + { + dwFilePathLen=min(dwFilePathLen,dwRetFilePathLen); + memmove(lpszRetFilePathName,szPath,((dwFilePathLen+1)*sizeof(WCHAR))); + } + + dwRetErrorCode=NO_ERROR; + } + } + } + + if (prdsiItems) FindClose(prdsiItems[dwRecDeepCurPos].hFind); + dwRecDeepCurPos--; + }while(dwRecDeepCurPos!=-1); + } + MEMFREE(prdsiItems); + }else{ + dwRetErrorCode=GetLastError(); + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +DWORD MemFillRandom(LPVOID lpBuff,SIZE_T dwBuffSize) +{ + DWORD dwRetErrorCode; + + if (lpBuff && dwBuffSize) + { + HCRYPTPROV hCryptProv=NULL; + + if (CryptAcquireContext(&hCryptProv,NULL,MS_STRONG_PROV,PROV_RSA_FULL,0)==FALSE && GetLastError()==NTE_BAD_KEYSET) CryptAcquireContext(&hCryptProv,NULL,MS_STRONG_PROV,PROV_RSA_FULL,CRYPT_NEWKEYSET); + + if (hCryptProv) + { + if (CryptGenRandom(hCryptProv,dwBuffSize,(BYTE*)lpBuff)) + { + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=GetLastError(); + } + }else{ + dwRetErrorCode=GetLastError(); + } + + CryptReleaseContext(hCryptProv,0); + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + + + + +#define MRA_PASS_CRYPT_VER 2 + + + +#if MRA_PASS_CRYPT_VER==1 + +BOOL SetPassDB(LPSTR lpszBuff,SIZE_T dwBuffSize) +{ + BOOL bRet=FALSE; + BYTE btRandomData[256],btCryptedPass[256]={0},bthmacSHA1[SHA1HashSize]={0}; + char szEMail[MAX_EMAIL_LEN]={0}; + SIZE_T dwEMailSize; + + +#if /*defined (_DEBUG) ||*/ defined (REL_DEB) + + DB_Mra_SetStringExA(NULL,"Pass",lpszBuff,dwBuffSize); + bRet=TRUE; +#else + if (dwBuffSize<128) + if (DB_Mra_GetStaticStringA(NULL,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + MemFillRandom(btRandomData,sizeof(btRandomData)); + + SHA1GetDigest(lpszBuff,dwBuffSize,&btCryptedPass[1]); + + BASE64EncodeUnSafe(lpszBuff,dwBuffSize,&btCryptedPass[(1+SHA1HashSize)],(sizeof(btCryptedPass)-1),&dwBuffSize); + btCryptedPass[0]=(BYTE)dwBuffSize; + //memmove(&btCryptedPass[1],lpszBuff,dwBuffSize); + + hmac_sha1(btRandomData,sizeof(btRandomData),(BYTE*)szEMail,dwEMailSize,bthmacSHA1); + + RC4(btCryptedPass,sizeof(btCryptedPass),bthmacSHA1,SHA1HashSize); + RC4(btCryptedPass,sizeof(btCryptedPass),btRandomData,sizeof(btRandomData)); + CopyMemoryReverseDWORD(btCryptedPass,btCryptedPass,sizeof(btCryptedPass)); + RC4(btCryptedPass,sizeof(btCryptedPass),bthmacSHA1,SHA1HashSize); + + + DB_Mra_SetDword(NULL,"pCryptVer",MRA_PASS_CRYPT_VER); + DB_Mra_WriteContactSettingBlob(NULL,"pCryptData",btRandomData,sizeof(btRandomData)); + DB_Mra_WriteContactSettingBlob(NULL,"pCryptPass",btCryptedPass,sizeof(btCryptedPass)); + + bRet=TRUE; + } +#endif +return(bRet); +} +#endif + + +#if MRA_PASS_CRYPT_VER==2 +BOOL SetPassDB(LPSTR lpszBuff,SIZE_T dwBuffSize) +{ + BOOL bRet=FALSE; + BYTE btRandomData[256],btCryptedPass[256]={0},bthmacSHA1[SHA1HashSize]={0}; + char szEMail[MAX_EMAIL_LEN]={0}; + SIZE_T dwEMailSize; + + +#if /*defined (_DEBUG) ||*/ defined (REL_DEB) + + DB_Mra_SetStringExA(NULL,"Pass",lpszBuff,dwBuffSize); + bRet=TRUE; +#else + if (dwBuffSize<128) + if (DB_Mra_GetStaticStringA(NULL,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + MemFillRandom(btRandomData,sizeof(btRandomData)); + + SHA1GetDigest(lpszBuff,dwBuffSize,&btCryptedPass[1]); + + //BASE64EncodeUnSafe(lpszBuff,dwBuffSize,&btCryptedPass[(1+SHA1HashSize)],(sizeof(btCryptedPass)-1),&dwBuffSize); + memmove(&btCryptedPass[(1+SHA1HashSize)],lpszBuff,dwBuffSize); + btCryptedPass[0]=(BYTE)dwBuffSize; + //memmove(&btCryptedPass[1],lpszBuff,dwBuffSize); + + hmac_sha1(btRandomData,sizeof(btRandomData),(BYTE*)szEMail,dwEMailSize,bthmacSHA1); + + RC4(btCryptedPass,sizeof(btCryptedPass),bthmacSHA1,SHA1HashSize); + RC4(btCryptedPass,sizeof(btCryptedPass),btRandomData,sizeof(btRandomData)); + CopyMemoryReverseDWORD(btCryptedPass,btCryptedPass,sizeof(btCryptedPass)); + RC4(btCryptedPass,sizeof(btCryptedPass),bthmacSHA1,SHA1HashSize); + + + DB_Mra_SetDword(NULL,"pCryptVer",MRA_PASS_CRYPT_VER); + DB_Mra_WriteContactSettingBlob(NULL,"pCryptData",btRandomData,sizeof(btRandomData)); + DB_Mra_WriteContactSettingBlob(NULL,"pCryptPass",btCryptedPass,sizeof(btCryptedPass)); + + bRet=TRUE; + } +#endif +return(bRet); +} +#endif + + +BOOL GetPassDB_v1(LPSTR lpszBuff,SIZE_T dwBuffSize,SIZE_T *pdwBuffSize) +{ + BOOL bRet=FALSE; + BYTE btRandomData[256]={0},btCryptedPass[256]={0},bthmacSHA1[SHA1HashSize]={0}; + char szEMail[MAX_EMAIL_LEN]={0}; + SIZE_T dwRandomDataSize,dwCryptedPass,dwEMailSize,dwPassSize; + + + if (DB_Mra_GetDword(NULL,"pCryptVer",0)==1) + if (DB_Mra_GetContactSettingBlob(NULL,"pCryptData",btRandomData,sizeof(btRandomData),&dwRandomDataSize)) + if (dwRandomDataSize==sizeof(btRandomData)) + if (DB_Mra_GetContactSettingBlob(NULL,"pCryptPass",btCryptedPass,sizeof(btCryptedPass),&dwCryptedPass)) + if (dwCryptedPass==sizeof(btCryptedPass)) + if (DB_Mra_GetStaticStringA(NULL,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + hmac_sha1(btRandomData,sizeof(btRandomData),(BYTE*)szEMail,dwEMailSize,bthmacSHA1); + + RC4(btCryptedPass,sizeof(btCryptedPass),bthmacSHA1,SHA1HashSize); + CopyMemoryReverseDWORD(btCryptedPass,btCryptedPass,sizeof(btCryptedPass)); + RC4(btCryptedPass,sizeof(btCryptedPass),btRandomData,dwRandomDataSize); + RC4(btCryptedPass,sizeof(btCryptedPass),bthmacSHA1,SHA1HashSize); + + dwPassSize=(*btCryptedPass); + BASE64DecodeUnSafe(&btCryptedPass[(1+SHA1HashSize)],dwPassSize,&btCryptedPass[(1+SHA1HashSize)],(sizeof(btCryptedPass)-1),&dwPassSize); + SHA1GetDigest(&btCryptedPass[(1+SHA1HashSize)],dwPassSize,btRandomData); + if (MemoryCompare(&btCryptedPass[1],SHA1HashSize,btRandomData,SHA1HashSize)==CMEM_EQUAL) + if (dwBuffSize>=dwPassSize) + { + memmove(lpszBuff,&btCryptedPass[(1+SHA1HashSize)],dwPassSize); + (*(lpszBuff+dwPassSize))=0; + + if (pdwBuffSize) (*pdwBuffSize)=dwPassSize; + bRet=TRUE; + } + } + +return(bRet); +} + + +BOOL GetPassDB_v2(LPSTR lpszBuff,SIZE_T dwBuffSize,SIZE_T *pdwBuffSize) +{ + BOOL bRet=FALSE; + BYTE btRandomData[256]={0},btCryptedPass[256]={0},bthmacSHA1[SHA1HashSize]={0}; + char szEMail[MAX_EMAIL_LEN]={0}; + SIZE_T dwRandomDataSize,dwCryptedPass,dwEMailSize,dwPassSize; + + + if (DB_Mra_GetDword(NULL,"pCryptVer",0)==2) + if (DB_Mra_GetContactSettingBlob(NULL,"pCryptData",btRandomData,sizeof(btRandomData),&dwRandomDataSize)) + if (dwRandomDataSize==sizeof(btRandomData)) + if (DB_Mra_GetContactSettingBlob(NULL,"pCryptPass",btCryptedPass,sizeof(btCryptedPass),&dwCryptedPass)) + if (dwCryptedPass==sizeof(btCryptedPass)) + if (DB_Mra_GetStaticStringA(NULL,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + hmac_sha1(btRandomData,sizeof(btRandomData),(BYTE*)szEMail,dwEMailSize,bthmacSHA1); + + RC4(btCryptedPass,sizeof(btCryptedPass),bthmacSHA1,SHA1HashSize); + CopyMemoryReverseDWORD(btCryptedPass,btCryptedPass,sizeof(btCryptedPass)); + RC4(btCryptedPass,sizeof(btCryptedPass),btRandomData,dwRandomDataSize); + RC4(btCryptedPass,sizeof(btCryptedPass),bthmacSHA1,SHA1HashSize); + + dwPassSize=((*btCryptedPass)&0xff); + SHA1GetDigest(&btCryptedPass[(1+SHA1HashSize)],dwPassSize,btRandomData); + if (MemoryCompare(&btCryptedPass[1],SHA1HashSize,btRandomData,SHA1HashSize)==CMEM_EQUAL) + if (dwBuffSize>=dwPassSize) + { + memmove(lpszBuff,&btCryptedPass[(1+SHA1HashSize)],dwPassSize); + (*(lpszBuff+dwPassSize))=0; + + if (pdwBuffSize) (*pdwBuffSize)=dwPassSize; + bRet=TRUE; + } + } + +return(bRet); +} + + +BOOL GetPassDB(LPSTR lpszBuff,SIZE_T dwBuffSize,SIZE_T *pdwBuffSize) +{ + BOOL bRet=FALSE; + +#if /*defined (_DEBUG) ||*/ defined (REL_DEB) + DB_Mra_GetStaticStringA(NULL,"Pass",lpszBuff,dwBuffSize,pdwBuffSize); + bRet=TRUE; +#else + switch (DB_Mra_GetDword(NULL,"pCryptVer",0)) { + case 1: + bRet=GetPassDB_v1(lpszBuff,dwBuffSize,pdwBuffSize); + break; + case 2: + bRet=GetPassDB_v2(lpszBuff,dwBuffSize,pdwBuffSize); + break; + default: + bRet=FALSE; + break; + } +#endif + +return(bRet); +} + + + + +DWORD ReplaceInBuff(LPVOID lpInBuff,SIZE_T dwInBuffSize,SIZE_T dwReplaceItemsCount,LPVOID *plpInReplaceItems,SIZE_T *pdwInReplaceItemsCounts,LPVOID *plpOutReplaceItems,SIZE_T *pdwOutReplaceItemsCounts,LPVOID lpOutBuff,SIZE_T dwOutBuffSize,SIZE_T *pdwOutBuffSize) +{ + DWORD dwRetErrorCode=NO_ERROR; + LPBYTE *plpbtFounded; +#ifdef _DEBUG //check tables + for(SIZE_T i=0;i(lpbtOutBuffCur+(dwMemPartToCopy+pdwInReplaceItemsCounts[dwFirstFoundedIndex]))) + { + memmove(lpbtOutBuffCur,lpbtInBuffCurPrev,dwMemPartToCopy);lpbtOutBuffCur+=dwMemPartToCopy; + memmove(lpbtOutBuffCur,plpOutReplaceItems[dwFirstFoundedIndex],pdwOutReplaceItemsCounts[dwFirstFoundedIndex]);lpbtOutBuffCur+=pdwOutReplaceItemsCounts[dwFirstFoundedIndex]; + lpbtInBuffCurPrev=(plpbtFounded[dwFirstFoundedIndex]+pdwInReplaceItemsCounts[dwFirstFoundedIndex]); + + for(i=0;i")}; +static const SIZE_T dwXMLSymbolsCount[] ={sizeof(TCHAR), sizeof(TCHAR), sizeof(TCHAR), sizeof(TCHAR), sizeof(TCHAR)}; + +//Decode XML coded string. The function translate special xml code into standard characters. +DWORD DecodeXML(LPTSTR lptszMessage,SIZE_T dwMessageSize,LPTSTR lptszMessageConverted,SIZE_T dwMessageConvertedBuffSize,SIZE_T *pdwMessageConvertedSize) +{ + DWORD dwRet=ReplaceInBuff(lptszMessage,(dwMessageSize*sizeof(TCHAR)),SIZEOF(lpszXMLTags),(LPVOID*)lpszXMLTags,(SIZE_T*)dwXMLTagsCount,(LPVOID*)lpszXMLSymbols,(SIZE_T*)dwXMLSymbolsCount,lptszMessageConverted,(dwMessageConvertedBuffSize*sizeof(TCHAR)),pdwMessageConvertedSize); + + if (pdwMessageConvertedSize) (*pdwMessageConvertedSize)/=sizeof(TCHAR); +return(dwRet); +} + +//Encode XML coded string. The function translate special saved xml characters into special characters. +DWORD EncodeXML(LPTSTR lptszMessage,SIZE_T dwMessageSize,LPTSTR lptszMessageConverted,SIZE_T dwMessageConvertedBuffSize,SIZE_T *pdwMessageConvertedSize) +{ + DWORD dwRet=ReplaceInBuff(lptszMessage,(dwMessageSize*sizeof(TCHAR)),SIZEOF(lpszXMLTags),(LPVOID*)lpszXMLSymbols,(SIZE_T*)dwXMLSymbolsCount,(LPVOID*)lpszXMLTags,(SIZE_T*)dwXMLTagsCount,lptszMessageConverted,(dwMessageConvertedBuffSize*sizeof(TCHAR)),pdwMessageConvertedSize); + + if (pdwMessageConvertedSize) (*pdwMessageConvertedSize)/=sizeof(TCHAR); +return(dwRet); +} + diff --git a/MRA/Mra_options.cpp b/MRA/Mra_options.cpp new file mode 100644 index 0000000..b0f1484 --- /dev/null +++ b/MRA/Mra_options.cpp @@ -0,0 +1,239 @@ +#include "Mra.h" + + + +INT_PTR CALLBACK DlgProcOptsAccount (HWND hWndDlg, UINT msg, WPARAM wParam, LPARAM lParam); +INT_PTR CALLBACK DlgProcOptsConnections (HWND hWndDlg, UINT msg, WPARAM wParam, LPARAM lParam); + + + +int OptInit(WPARAM wParam,LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp={0}; + + odp.cbSize=sizeof(odp); + odp.hInstance=masMraSettings.hInstance; + odp.pszTitle=PROTOCOL_NAMEA; + odp.pszGroup="Network"; + odp.flags=ODPF_BOLDGROUPS; + + odp.pszTab="Account"; + odp.pszTemplate=MAKEINTRESOURCEA(IDD_OPT_ACCOUNT); + odp.pfnDlgProc=DlgProcOptsAccount; + CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp); + + odp.pszTab="Connections"; + odp.pszTemplate=MAKEINTRESOURCEA(IDD_OPT_CONNECTIONS); + odp.pfnDlgProc=DlgProcOptsConnections; + CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp); + + odp.pszTab="Anti spam"; + odp.pszTemplate=MAKEINTRESOURCEA(IDD_OPT_ANTISPAM); + odp.pfnDlgProc=MraAntiSpamDlgProcOpts; + CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp); + + odp.pszTab="Files"; + odp.pszTemplate=MAKEINTRESOURCEA(IDD_OPT_FILES); + odp.pfnDlgProc=MraFilesQueueDlgProcOpts; + CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp); + + odp.pszTab="Avatars"; + odp.pszTemplate=MAKEINTRESOURCEA(IDD_OPT_AVATRS); + odp.pfnDlgProc=MraAvatarsQueueDlgProcOpts; + CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp); + + MraPopupOptInit(wParam,lParam); +return(0); +} + + + +INT_PTR CALLBACK DlgProcOptsAccount(HWND hWndDlg,UINT msg,WPARAM wParam,LPARAM lParam) +{ + switch(msg){ + case WM_INITDIALOG: + { + WCHAR szBuff[MAX_PATH]; + //SIZE_T dwBuffSize; + + TranslateDialogDefault(hWndDlg); + + if (DB_Mra_GetStaticStringW(NULL,"e-mail",szBuff,SIZEOF(szBuff),NULL)) + { + SET_DLG_ITEM_TEXTW(hWndDlg,IDC_LOGIN,szBuff); + } + + SET_DLG_ITEM_TEXTW(hWndDlg,IDC_PASSWORD,(LPWSTR)L""); + //if (GetPassDB((LPSTR)szBuff,SIZEOF(szBuff),&dwBuffSize)) + //{//bit of a security hole here, since it's easy to extract a password from an edit box + // SET_DLG_ITEM_TEXTA(hWndDlg,IDC_PASSWORD,(LPSTR)szBuff); + // SecureZeroMemory(szBuff,sizeof(szBuff)); + //} + } + return(TRUE); + case WM_COMMAND: + switch (LOWORD(wParam)){ + case IDC_NEW_ACCOUNT_LINK: + CallService(MS_UTILS_OPENURL,TRUE,(LPARAM)MRA_REGISTER_URL); + return(TRUE); + case IDC_LOOKUPLINK: + CallService(MS_UTILS_OPENURL,TRUE,(LPARAM)MRA_FORGOT_PASSWORD_URL); + return(TRUE); + } + if ((LOWORD(wParam)==IDC_LOGIN || LOWORD(wParam)==IDC_PASSWORD) && (HIWORD(wParam)!=EN_CHANGE || (HWND)lParam!=GetFocus()) ) return 0; + SendMessage(GetParent(hWndDlg),PSM_CHANGED,0,0); + break; + case WM_NOTIFY: + switch(((LPNMHDR)lParam)->code){ + case PSN_APPLY: + { + WCHAR szBuff[MAX_EMAIL_LEN]; + + GET_DLG_ITEM_TEXT(hWndDlg,IDC_LOGIN,szBuff,SIZEOF(szBuff)); + DB_Mra_SetStringW(NULL,"e-mail",szBuff); + + if (GET_DLG_ITEM_TEXTA(hWndDlg,IDC_PASSWORD,(LPSTR)szBuff,SIZEOF(szBuff))) + { + SetPassDB((LPSTR)szBuff,lstrlenA((LPSTR)szBuff)); + SecureZeroMemory(szBuff,sizeof(szBuff)); + } + } + return(TRUE); + } + break; + } +return(FALSE); +} + + +INT_PTR CALLBACK DlgProcOptsConnections(HWND hWndDlg,UINT msg,WPARAM wParam,LPARAM lParam) +{ + switch(msg){ + case WM_INITDIALOG: + { + WCHAR szBuff[MAX_PATH]; + + TranslateDialogDefault(hWndDlg); + + if (DB_Mra_GetStaticStringW(NULL,"Server",szBuff,SIZEOF(szBuff),NULL)) + { + SET_DLG_ITEM_TEXT(hWndDlg,IDC_SERVER,szBuff); + }else{ + SET_DLG_ITEM_TEXTA(hWndDlg,IDC_SERVER,MRA_DEFAULT_SERVER); + } + SetDlgItemInt(hWndDlg,IDC_SERVERPORT,DB_Mra_GetWord(NULL,"ServerPort",MRA_DEFAULT_SERVER_PORT),FALSE); + // if set SSL proxy, setting will ignored + + //CHECK_DLG_BUTTON(hWndDlg, IDC_KEEPALIVE,DB_Mra_GetByte(NULL,"keepalive",0)); + CHECK_DLG_BUTTON(hWndDlg,IDC_AUTO_ADD_CONTACTS_TO_SERVER,DB_Mra_GetByte(NULL,"AutoAddContactsToServer",MRA_DEFAULT_AUTO_ADD_CONTACTS_TO_SERVER)); + CHECK_DLG_BUTTON(hWndDlg,IDC_AUTO_AUTH_REQ_ON_LOGON,DB_Mra_GetByte(NULL,"AutoAuthRequestOnLogon",MRA_DEFAULT_AUTO_AUTH_REQ_ON_LOGON)); + CHECK_DLG_BUTTON(hWndDlg,IDC_AUTO_AUTH_GRAND_IN_CLIST,DB_Mra_GetByte(NULL,"AutoAuthGrandUsersInCList",MRA_DEFAULT_AUTO_AUTH_GRAND_IN_CLIST)); + CHECK_DLG_BUTTON(hWndDlg,IDC_AUTO_AUTH_GRAND_NEW_USERS,DB_Mra_GetByte(NULL,"AutoAuthGrandNewUsers",MRA_DEFAULT_AUTO_AUTH_GRAND_NEW_USERS)); + CHECK_DLG_BUTTON(hWndDlg,IDC_AUTO_AUTH_GRAND_NEW_USERS_DISABLE_SPAM_CHECK,DB_Mra_GetByte(NULL,"AutoAuthGrandNewUsersDisableSPAMCheck",MRA_DEFAULT_AUTO_AUTH_GRAND_NEW_USERS_DISABLE_SPAM_CHECK)); + EnableWindow(GetDlgItem(hWndDlg,IDC_AUTO_AUTH_GRAND_NEW_USERS_DISABLE_SPAM_CHECK),IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_AUTO_AUTH_GRAND_NEW_USERS)); + + CHECK_DLG_BUTTON(hWndDlg,IDC_SLOWSEND,DB_Mra_GetByte(NULL,"SlowSend",MRA_DEFAULT_SLOW_SEND)); + CHECK_DLG_BUTTON(hWndDlg,IDC_INCREMENTAL_NEW_MAIL_NOTIFY,DB_Mra_GetByte(NULL,"IncrementalNewMailNotify",MRA_DEFAULT_INC_NEW_MAIL_NOTIFY)); + CHECK_DLG_BUTTON(hWndDlg,IDC_TRAYICON_NEW_MAIL_NOTIFY,DB_Mra_GetByte(NULL,"TrayIconNewMailNotify",MRA_DEFAULT_TRAYICON_NEW_MAIL_NOTIFY)); + CHECK_DLG_BUTTON(hWndDlg,IDC_TRAYICON_NEW_MAIL_NOTIFY_CLICK_TO_INBOX,DB_Mra_GetByte(NULL,"TrayIconNewMailClkToInbox",MRA_DEFAULT_TRAYICON_NEW_MAIL_CLK_TO_INBOX)); + EnableWindow(GetDlgItem(hWndDlg,IDC_TRAYICON_NEW_MAIL_NOTIFY_CLICK_TO_INBOX),DB_Mra_GetByte(NULL,"TrayIconNewMailNotify",MRA_DEFAULT_TRAYICON_NEW_MAIL_NOTIFY)); + + CHECK_DLG_BUTTON(hWndDlg,IDC_HIDE_MENU_ITEMS_FOR_NON_MRA,DB_Mra_GetByte(NULL,"HideMenuItemsForNonMRAContacts",MRA_DEFAULT_HIDE_MENU_ITEMS_FOR_NON_MRA)); + + CHECK_DLG_BUTTON(hWndDlg,IDC_RTF_RECEIVE_ENABLE,DB_Mra_GetByte(NULL,"RTFReceiveEnable",MRA_DEFAULT_RTF_RECEIVE_ENABLE)); + EnableWindow(GetDlgItem(hWndDlg,IDC_RTF_RECEIVE_ENABLE),(BOOL)(masMraSettings.lpfnUncompress!=NULL)); + + CHECK_DLG_BUTTON(hWndDlg,IDC_RTF_SEND_ENABLE,DB_Mra_GetByte(NULL,"RTFSendEnable",MRA_DEFAULT_RTF_SEND_ENABLE)); + EnableWindow(GetDlgItem(hWndDlg,IDC_RTF_SEND_ENABLE),(BOOL)(masMraSettings.lpfnCompress2!=NULL)); + EnableWindow(GetDlgItem(hWndDlg,IDC_RTF_SEND_SMART),(DB_Mra_GetByte(NULL,"RTFSendEnable",MRA_DEFAULT_RTF_SEND_ENABLE) && masMraSettings.lpfnCompress2)); + EnableWindow(GetDlgItem(hWndDlg,IDC_BUTTON_FONT),(DB_Mra_GetByte(NULL,"RTFSendEnable",MRA_DEFAULT_RTF_SEND_ENABLE) && masMraSettings.lpfnCompress2)); + EnableWindow(GetDlgItem(hWndDlg,IDC_RTF_BGCOLOUR),(DB_Mra_GetByte(NULL,"RTFSendEnable",MRA_DEFAULT_RTF_SEND_ENABLE) && masMraSettings.lpfnCompress2)); + SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_RTF_BGCOLOUR,CPM_SETCOLOUR,0,DB_Mra_GetDword(NULL,"RTFBackgroundColour",MRA_DEFAULT_RTF_BACKGROUND_COLOUR)); + } + return(TRUE); + case WM_COMMAND: + switch(LOWORD(wParam)){ + case IDC_BUTTON_DEFAULT: + SET_DLG_ITEM_TEXTA(hWndDlg,IDC_SERVER,MRA_DEFAULT_SERVER); + SetDlgItemInt(hWndDlg,IDC_SERVERPORT,MRA_DEFAULT_SERVER_PORT,FALSE); + break; + case IDC_AUTO_AUTH_GRAND_NEW_USERS: + EnableWindow(GetDlgItem(hWndDlg,IDC_AUTO_AUTH_GRAND_NEW_USERS_DISABLE_SPAM_CHECK),IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_AUTO_AUTH_GRAND_NEW_USERS)); + break; + case IDC_TRAYICON_NEW_MAIL_NOTIFY: + EnableWindow(GetDlgItem(hWndDlg,IDC_TRAYICON_NEW_MAIL_NOTIFY_CLICK_TO_INBOX),IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_TRAYICON_NEW_MAIL_NOTIFY)); + break; + case IDC_RTF_SEND_ENABLE: + EnableWindow(GetDlgItem(hWndDlg,IDC_RTF_SEND_SMART),IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_RTF_SEND_ENABLE)); + EnableWindow(GetDlgItem(hWndDlg,IDC_BUTTON_FONT),IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_RTF_SEND_ENABLE)); + EnableWindow(GetDlgItem(hWndDlg,IDC_RTF_BGCOLOUR),IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_RTF_SEND_ENABLE)); + break; + case IDC_BUTTON_FONT: + { + LOGFONT lf={0}; + CHOOSEFONT cf={0}; + + cf.lStructSize=sizeof(cf); + cf.lpLogFont=&lf; + cf.rgbColors=DB_Mra_GetDword(NULL,"RTFFontColour",MRA_DEFAULT_RTF_FONT_COLOUR); + cf.Flags=(CF_SCREENFONTS|CF_EFFECTS|CF_FORCEFONTEXIST|CF_INITTOLOGFONTSTRUCT); + if (DB_Mra_GetContactSettingBlob(NULL,"RTFFont",&lf,sizeof(LOGFONT),NULL)==FALSE) + { + HDC hDC=GetDC(NULL);// kegl + lf.lfCharSet=MRA_DEFAULT_RTF_FONT_CHARSET; + lf.lfHeight=-MulDiv(MRA_DEFAULT_RTF_FONT_SIZE,GetDeviceCaps(hDC,LOGPIXELSY),72); + lstrcpynW(lf.lfFaceName,MRA_DEFAULT_RTF_FONT_NAME,LF_FACESIZE); + ReleaseDC(NULL,hDC); + } + + if (ChooseFont(&cf)) + { + /*HDC hDC=GetDC(NULL); + DWORD dwFontSize; + dwFontSize=-MulDiv(lf.lfHeight,72,GetDeviceCaps(hDC,LOGPIXELSY)); + dwFontSize+=((dwFontSize+4)/8);//MulDiv(dwFontSize,GetDeviceCaps(hDC,PHYSICALWIDTH),72); + ReleaseDC(NULL,hDC);*/ + + DB_Mra_WriteContactSettingBlob(NULL,"RTFFont",&lf,sizeof(LOGFONT)); + DB_Mra_SetDword(NULL,"RTFFontColour",cf.rgbColors); + } + } + break; + } + + if ((LOWORD(wParam)==IDC_SERVER || LOWORD(wParam)==IDC_SERVERPORT) && (HIWORD(wParam)!=EN_CHANGE || (HWND)lParam!=GetFocus()) ) return(FALSE); + SendMessage(GetParent(hWndDlg),PSM_CHANGED,0,0); + break; + case WM_NOTIFY: + switch(((LPNMHDR)lParam)->code){ + case PSN_APPLY: + { + WCHAR szBuff[MAX_PATH]; + + GET_DLG_ITEM_TEXT(hWndDlg,IDC_SERVER,szBuff,SIZEOF(szBuff)); + DB_Mra_SetStringW(NULL,"Server",szBuff); + DB_Mra_SetWord(NULL,"ServerPort",(WORD)GetDlgItemInt(hWndDlg,IDC_SERVERPORT,NULL,FALSE)); + DB_Mra_SetByte(NULL,"AutoAddContactsToServer",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_AUTO_ADD_CONTACTS_TO_SERVER)); + DB_Mra_SetByte(NULL,"AutoAuthRequestOnLogon",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_AUTO_AUTH_REQ_ON_LOGON)); + DB_Mra_SetByte(NULL,"AutoAuthGrandUsersInCList",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_AUTO_AUTH_GRAND_IN_CLIST)); + DB_Mra_SetByte(NULL,"AutoAuthGrandNewUsers",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_AUTO_AUTH_GRAND_NEW_USERS)); + DB_Mra_SetByte(NULL,"AutoAuthGrandNewUsersDisableSPAMCheck",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_AUTO_AUTH_GRAND_NEW_USERS_DISABLE_SPAM_CHECK)); + + DB_Mra_SetByte(NULL,"SlowSend",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_SLOWSEND)); + DB_Mra_SetByte(NULL,"IncrementalNewMailNotify",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_INCREMENTAL_NEW_MAIL_NOTIFY)); + DB_Mra_SetByte(NULL,"TrayIconNewMailNotify",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_TRAYICON_NEW_MAIL_NOTIFY)); + DB_Mra_SetByte(NULL,"TrayIconNewMailClkToInbox",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_TRAYICON_NEW_MAIL_NOTIFY_CLICK_TO_INBOX)); + + DB_Mra_SetByte(NULL,"HideMenuItemsForNonMRAContacts",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_HIDE_MENU_ITEMS_FOR_NON_MRA)); + + DB_Mra_SetByte(NULL,"RTFReceiveEnable",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_RTF_RECEIVE_ENABLE)); + DB_Mra_SetByte(NULL,"RTFSendEnable",IS_DLG_BUTTON_CHECKED(hWndDlg,IDC_RTF_SEND_ENABLE)); + DBWriteContactSettingDword(NULL,PROTOCOL_NAMEA,"RTFBackgroundColour",SEND_DLG_ITEM_MESSAGE(hWndDlg,IDC_RTF_BGCOLOUR,CPM_GETCOLOUR,0,0)); + } + return(TRUE); + } + break; + } +return(FALSE); +} + diff --git a/MRA/Mra_proto.cpp b/MRA/Mra_proto.cpp new file mode 100644 index 0000000..197dec9 --- /dev/null +++ b/MRA/Mra_proto.cpp @@ -0,0 +1,2581 @@ +#include "Mra.h" +#include "MraOfflineMsg.h" +#include "MraRTFMsg.h" +#include "MraPlaces.h" + + + + + + +void MraThreadProc (LPVOID lpParameter); +DWORD MraGetNLBData (LPSTR lpszHost,SIZE_T dwHostBuffSize,WORD *pwPort); +DWORD MraNetworkDispather (); +DWORD MraCommandDispather (mrim_packet_header_t *pmaHeader,DWORD *pdwPingPeriod,DWORD *pdwNextPingSendTickTime,BOOL *pbContinue); + + + + +//DWORD GetMraStatusFromMiradaStatus (DWORD dwMirandaStatus,DWORD dwXStatusMir,DWORD *pdwXStatusMra); +//DWORD GetMiradaStatusFromMraStatus (DWORD dwMraStatus,DWORD dwXStatusMra,DWORD *pdwXStatusMir); +//DWORD GetMraXStatusIDFromMraUriStatus (LPSTR lpszStatusUri,SIZE_T dwStatusUriSize); + +DWORD GetUL (LPBYTE *plpData); +DWORDLONG GetUIDL (LPBYTE *plpData); +MRA_GUID GetGUID (LPBYTE *plpData); +DWORD GetLPS (LPBYTE lpbData,DWORD dwDataSize,LPBYTE *plpCurrentData,MRA_LPS *plpsString); + + + + + + +DWORD StartConnect() +{ + DWORD dwRetErrorCode=NO_ERROR; + + if (InterlockedExchangeAdd((volatile LONG*)&masMraSettings.dwGlobalPluginRunning,0)) + { + if (InterlockedCompareExchange((volatile LONG*)&masMraSettings.dwThreadWorkerRunning,TRUE,FALSE)==FALSE) + {// поток ещё/уже не работал, поставили статус что работает и запускаем + char szPass[MAX_PATH]; + SIZE_T dwEMailSize=0,dwPasswordSize=0; + + DB_Mra_GetStaticStringA(NULL,"e-mail",NULL,0,&dwEMailSize); + + if (dwEMailSize>5 && GetPassDB(szPass,sizeof(szPass),&dwPasswordSize)) + {// mir_forkthread + InterlockedExchange((volatile LONG*)&masMraSettings.dwThreadWorkerLastPingTime,GetTickCount()); + masMraSettings.hThreadWorker=mir_forkthread(MraThreadProc,NULL); + if (masMraSettings.hThreadWorker==NULL) + { + dwRetErrorCode=GetLastError(); + InterlockedExchange((volatile LONG*)&masMraSettings.dwThreadWorkerRunning,FALSE); + MraSetStatus(ID_STATUS_OFFLINE,0); + } + }else{ + MraThreadClean(); + if (!(dwEMailSize>5)) + { + MraPopupShowFromAgentW(MRA_POPUP_TYPE_WARNING,0,TranslateW(L"Please, setup e-mail in options")); + }else{ + MraPopupShowFromAgentW(MRA_POPUP_TYPE_WARNING,0,TranslateW(L"Please, setup password in options")); + } + } + SecureZeroMemory(szPass,sizeof(szPass)); + }else{ + DebugBreak(); + } + }else{ + dwRetErrorCode=ERROR_OPERATION_ABORTED; + //DebugBreak(); + } +return(dwRetErrorCode); +} + + +void MraThreadProc(LPVOID lpParameter) +{ + DWORD dwRetErrorCode=NO_ERROR; + + if (TRUE) + { + BOOL bConnected=FALSE; + char szHost[MAX_PATH]; + DWORD dwConnectReTryCount,dwCurConnectReTryCount; + NETLIBOPENCONNECTION nloc={0}; + + SleepEx(100,FALSE);// to prevent high CPU load by some status plugins like allwaysonline + + dwConnectReTryCount=DB_Mra_GetDword(NULL,"ConnectReTryCountMRIM",MRA_DEFAULT_CONN_RETRY_COUNT_MRIM); + + nloc.cbSize=sizeof(nloc); + nloc.flags=NLOCF_V2; + nloc.szHost=szHost; + nloc.timeout=DB_Mra_GetDword(NULL,"TimeOutConnectMRIM",MRA_DEFAULT_TIMEOUT_CONN_MRIM); + if (nloc.timeoutMRA_TIMEOUT_CONN_МАХ) nloc.timeout=MRA_TIMEOUT_CONN_МАХ; + + InterlockedExchange((volatile LONG*)&masMraSettings.dwThreadWorkerLastPingTime,GetTickCount()); + if (MraGetNLBData((LPSTR)nloc.szHost,MAX_PATH,&nloc.wPort)==NO_ERROR) + { + dwCurConnectReTryCount=dwConnectReTryCount; + do{ + InterlockedExchange((volatile LONG*)&masMraSettings.dwThreadWorkerLastPingTime,GetTickCount()); + masMraSettings.hConnection=(HANDLE)CallService(MS_NETLIB_OPENCONNECTION,(WPARAM)masMraSettings.hNetlibUser,(LPARAM)&nloc); + }while(--dwCurConnectReTryCount && masMraSettings.hConnection==NULL); + + if (masMraSettings.hConnection) + { + bConnected=TRUE; + } + } + + if (bConnected==FALSE) + if (DB_Mra_GetByte(NULL,"NLBFailDirectConnect",MRA_DEFAULT_NLB_FAIL_DIRECT_CONNECT)) + { + if (IsHTTPSProxyUsed(masMraSettings.hNetlibUser)) + {// через https прокси только 443 порт + nloc.wPort=MRA_SERVER_PORT_HTTPS; + }else{ + nloc.wPort=DB_Mra_GetWord(NULL,"ServerPort",MRA_DEFAULT_SERVER_PORT); + if (nloc.wPort==MRA_SERVER_PORT_STANDART_NLB) nloc.wPort=MRA_SERVER_PORT_STANDART; + } + + for(DWORD i=1;(iMRA_TIMEOUT_CONN_МАХ) nloc.timeout=MRA_TIMEOUT_CONN_МАХ; + + + dwCurConnectReTryCount=dwConnectReTryCount; + do{ + InterlockedExchange((volatile LONG*)&masMraSettings.dwThreadWorkerLastPingTime,GetTickCount()); + nls.hReadConns[0]=(HANDLE)CallService(MS_NETLIB_OPENCONNECTION,(WPARAM)masMraSettings.hNetlibUser,(LPARAM)&nloc); + }while(--dwCurConnectReTryCount && nls.hReadConns[0]==NULL); + + if (nls.hReadConns[0]) + { + nls.cbSize=sizeof(nls); + nls.dwTimeout=(1000*DB_Mra_GetDword(NULL,"TimeOutReceiveNLB",MRA_DEFAULT_TIMEOUT_RECV_NLB)); + InterlockedExchange((volatile LONG*)&masMraSettings.dwThreadWorkerLastPingTime,GetTickCount()); + + while(MraGetStatus(0,0)!=ID_STATUS_OFFLINE && bContinue) + { + switch(CallService(MS_NETLIB_SELECT,0,(LPARAM)&nls)){ + case SOCKET_ERROR: + case 0:// Time out + bContinue=FALSE; + break; + case 1: + dwBytesReceived=Netlib_Recv(nls.hReadConns[0],(LPSTR)(btBuff+dwRcvBuffSizeUsed),(SIZEOF(btBuff)-dwRcvBuffSizeUsed),0); + if (dwBytesReceived && dwBytesReceived!=SOCKET_ERROR) + { + dwRcvBuffSizeUsed+=dwBytesReceived; + }else{ + bContinue=FALSE; + } + break; + } + InterlockedExchange((volatile LONG*)&masMraSettings.dwThreadWorkerLastPingTime,GetTickCount()); + } + Netlib_CloseHandle(nls.hReadConns[0]); + + if (dwRcvBuffSizeUsed) + {// received, work with data + lpszPort=(LPSTR)MemoryFindByte(0,btBuff,dwRcvBuffSizeUsed,':'); + if (lpszPort) + { + (*lpszPort)=0; + lpszPort++; + + lstrcpynA(lpszHost,(LPSTR)btBuff,dwHostBuffSize); + if (pwPort) (*pwPort)=(WORD)StrToUNum32(lpszPort,(dwRcvBuffSizeUsed-(lpszPort-(LPSTR)btBuff))); + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=ERROR_INVALID_USER_BUFFER; + ShowFormatedErrorMessage(L"NLB data corrupted",NO_ERROR); + } + }else{ + dwRetErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Can't get data for NLB, error",dwRetErrorCode); + } + }else{ + dwRetErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Can't connect to NLB server, error",dwRetErrorCode); + } +return(dwRetErrorCode); +} + + +DWORD MraNetworkDispather() +{ + DWORD dwRetErrorCode=NO_ERROR; + + BOOL bContinue=TRUE; + DWORD dwSelectRet,dwBytesReceived,dwDataCurrentBuffSize,dwDataCurrentBuffSizeUsed,dwPingPeriod=MAXDWORD,dwNextPingSendTickTime=MAXDWORD; + SIZE_T dwRcvBuffSize=BUFF_SIZE_RCV,dwRcvBuffSizeUsed=0,dwDataCurrentBuffOffset=0; + LPBYTE lpbBufferRcv; + NETLIBSELECT nls={0}; + mrim_packet_header_t *pmaHeader; + + nls.cbSize=sizeof(nls); + nls.dwTimeout=NETLIB_SELECT_TIMEOUT; + nls.hReadConns[0]=masMraSettings.hConnection; + + lpbBufferRcv=(LPBYTE)MEMALLOC(dwRcvBuffSize); + + masMraSettings.dwCMDNum=0; + MraSendCMD(MRIM_CS_HELLO,NULL,0); + InterlockedExchange((volatile LONG*)&masMraSettings.dwThreadWorkerLastPingTime,GetTickCount()); + while(MraGetStatus(0,0)!=ID_STATUS_OFFLINE && bContinue) + { + dwSelectRet=CallService(MS_NETLIB_SELECT,0,(LPARAM)&nls); + switch(dwSelectRet){ + case SOCKET_ERROR: + if (MraGetStatus(0,0)!=ID_STATUS_OFFLINE) + { + dwRetErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Disconnected, socket error",dwRetErrorCode); + } + bContinue=FALSE; + break; + case 0:// Time out + case 1: + dwBytesReceived=GetTickCount(); + InterlockedExchange((volatile LONG*)&masMraSettings.dwThreadWorkerLastPingTime,dwBytesReceived); + if (dwNextPingSendTickTime<=dwBytesReceived) + {// server ping + dwNextPingSendTickTime=(dwBytesReceived+(dwPingPeriod*1000)); + MraSendCMD(MRIM_CS_PING,NULL,0); + } + { + DWORD dwCMDNum,dwFlags,dwAckType; + HANDLE hContact; + LPBYTE lpbData; + SIZE_T dwDataSize; + while (MraSendQueueFindOlderThan(masMraSettings.hSendQueueHandle,SEND_QUEUE_TIMEOUT,&dwCMDNum,&dwFlags,&hContact,&dwAckType,&lpbData,&dwDataSize)==NO_ERROR) + { + switch(dwAckType){ + case ACKTYPE_ADDED: + case ACKTYPE_AUTHREQ: + case ACKTYPE_CONTACTS: + //nothink to do + break; + case ACKTYPE_MESSAGE: + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,hContact,dwAckType,ACKRESULT_FAILED,(HANDLE)dwCMDNum,(LPARAM)"Undefined message deliver error, time out",-1); + break; + case ACKTYPE_GETINFO: + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,hContact,dwAckType,ACKRESULT_FAILED,(HANDLE)1,(LPARAM)NULL,0); + break; + case ACKTYPE_SEARCH: + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,hContact,dwAckType,ACKRESULT_SUCCESS,(HANDLE)dwCMDNum,(LPARAM)NULL,0); + break; + case ICQACKTYPE_SMS: + MEMFREE(lpbData); + break; + } + MraSendQueueFree(masMraSettings.hSendQueueHandle,dwCMDNum); + } + } + if (dwSelectRet==0) break;// Time out + + + if ((dwRcvBuffSize-dwRcvBuffSizeUsed)=sizeof(mrim_packet_header_t)) + {// packet header received + if (pmaHeader->magic==CS_MAGIC) + {// packet OK + if ((dwDataCurrentBuffSizeUsed-sizeof(mrim_packet_header_t))>=pmaHeader->dlen) + {// full packet received, may be more than one + + MraCommandDispather(pmaHeader,&dwPingPeriod,&dwNextPingSendTickTime,&bContinue); + + if ((dwDataCurrentBuffSizeUsed-sizeof(mrim_packet_header_t))>pmaHeader->dlen) + {// move pointer to next packet in buffer + dwDataCurrentBuffOffset+=(sizeof(mrim_packet_header_t)+pmaHeader->dlen); + }else{// move pointer to begin of buffer + if (dwRcvBuffSize>BUFF_SIZE_RCV) + {// динамическое уменьшение буффера приёма + dwRcvBuffSize=BUFF_SIZE_RCV; + lpbBufferRcv=(LPBYTE)MEMREALLOC(lpbBufferRcv,dwRcvBuffSize); + } + dwDataCurrentBuffOffset=0; + dwRcvBuffSizeUsed=0; + break; + } + }else{// not all packet received, continue receiving + if (dwDataCurrentBuffOffset) + { + memmove(lpbBufferRcv,(lpbBufferRcv+dwDataCurrentBuffOffset),dwDataCurrentBuffSizeUsed); + dwRcvBuffSizeUsed=dwDataCurrentBuffSizeUsed; + dwDataCurrentBuffOffset=0; + } + DebugPrintCRLFW(L"Not all packet received, continue receiving"); + break; + } + }else{// bad packet + DebugPrintCRLFW(L"Bad packet"); + dwDataCurrentBuffOffset=0; + dwRcvBuffSizeUsed=0; + break; + } + }else{// packet to small, continue receiving + DebugPrintCRLFW(L"Packet to small, continue receiving"); + memmove(lpbBufferRcv,(lpbBufferRcv+dwDataCurrentBuffOffset),dwDataCurrentBuffSizeUsed); + dwRcvBuffSizeUsed=dwDataCurrentBuffSizeUsed; + dwDataCurrentBuffOffset=0; + break; + } + } + }else{// disconnected + if (MraGetStatus(0,0)!=ID_STATUS_OFFLINE) + { + dwRetErrorCode=GetLastError(); + ShowFormatedErrorMessage(L"Disconnected, socket read error",dwRetErrorCode); + } + bContinue=FALSE; + } + break; + }// end switch + }// end while + MEMFREE(lpbBufferRcv); + +return(dwRetErrorCode); +} + + +DWORD MraCommandDispather(mrim_packet_header_t *pmaHeader,DWORD *pdwPingPeriod,DWORD *pdwNextPingSendTickTime,BOOL *pbContinue) +{ + WCHAR szBuff[4096]={0}; + DWORD dwDataSize,dwTemp,dwAckType; + SIZE_T dwStringSize; + MRA_LPS lpsString={0},lpsEMail={0}; + HANDLE hContact=NULL; + LPBYTE lpbData,lpbDataCurrent; + + lpbData=((((LPBYTE)pmaHeader))+sizeof(mrim_packet_header_t)); + lpbDataCurrent=lpbData; + dwDataSize=pmaHeader->dlen; + + + switch(pmaHeader->msg){ + case MRIM_CS_HELLO_ACK://Подтверждение установки соединения// UL ## ping_period ## Ожидаемая частота подтверждения соединения (в секундах) + //CredUIPromptForCredentials + //CYPTPROTECTMEMORY_BLOCK_SIZE=RTL_ENCRYPT_MEMORY_SIZE=8 + //CryptProtectMemory(szBuff,sizeof(szBuff),CRYPTPROTECTMEMORY_SAME_PROCESS); + if(GetPassDB((LPSTR)szBuff,SIZEOF(szBuff),&dwStringSize)) + {//bit of a security hole here, since it's easy to extract a password from an edit box + CHAR szEMail[MAX_EMAIL_LEN],szSelfVersionString[MAX_PATH],szUserAgentFormated[USER_AGENT_MAX+MAX_PATH],szValueName[MAX_PATH]; + WCHAR wszStatusTitle[STATUS_TITLE_MAX+4],wszStatusDesc[STATUS_DESC_MAX+4]; + DWORD dwStatus,dwXStatus,dwXStatusMir,dwFutureFlags; + LPWSTR lpwszStatusTitle,lpwszStatusDesc; + SIZE_T dwEMailSize,dwSelfVersionSize,dwStatusTitleSize,dwStatusDescSize,dwUserAgentFormatedSize; + + dwXStatusMir=MraGetXStatusInternal(); + dwStatus=GetMraStatusFromMiradaStatus(masMraSettings.dwDesiredStatusMode,dwXStatusMir,&dwXStatus); + if (IsXStatusValid(dwXStatusMir)) + {// xstatuses + mir_snprintf(szValueName,SIZEOF(szValueName),"XStatus%ldName",dwXStatusMir); + if (DB_Mra_GetStaticStringW(NULL,szValueName,wszStatusTitle,(STATUS_TITLE_MAX+1),&dwStatusTitleSize)) + {// custom xstatus name + lpwszStatusTitle=wszStatusTitle; + }else{// default xstatus name + lpwszStatusTitle=TranslateW(lpcszXStatusNameDef[dwXStatusMir]); + dwStatusTitleSize=lstrlenW(lpwszStatusTitle); + } + + mir_snprintf(szValueName,SIZEOF(szValueName),"XStatus%ldMsg",dwXStatusMir); + if (DB_Mra_GetStaticStringW(NULL,szValueName,wszStatusDesc,(STATUS_DESC_MAX+1),&dwStatusDescSize)) + {// custom xstatus description + lpwszStatusDesc=wszStatusDesc; + }else{// default xstatus description + lpwszStatusDesc=NULL; + dwStatusDescSize=0; + } + }else{// not xstatuses + lpwszStatusTitle=GetStatusModeDescriptionW(masMraSettings.dwDesiredStatusMode); + dwStatusTitleSize=lstrlenW(lpwszStatusTitle); + lpwszStatusDesc=NULL; + dwStatusDescSize=0; + } + + MraGetSelfVersionString(szSelfVersionString,SIZEOF(szSelfVersionString),&dwSelfVersionSize); + if (DB_Mra_GetStaticStringA(NULL,"MirVerCustom",szUserAgentFormated,SIZEOF(szUserAgentFormated),&dwUserAgentFormatedSize)==FALSE) + { + dwUserAgentFormatedSize=mir_snprintf(szUserAgentFormated,SIZEOF(szUserAgentFormated),"client=\"magent\" name=\"Miranda IM\" title=\"%s\" version=\"777.%lu.%lu.%lu\" build=\"%lu\" protocol=\"%lu.%lu\"",szSelfVersionString,(((PLUGIN_VERSION_DWORD)>>24)&0xFF),(((PLUGIN_VERSION_DWORD)>>16)&0xFF),(((PLUGIN_VERSION_DWORD)>>8)&0xFF),((PLUGIN_VERSION_DWORD)&0xFF),PROTO_MAJOR(PROTO_VERSION),PROTO_MINOR(PROTO_VERSION));// "client=\"magent\" version=\"9.3\" build=\"777\"" + } + + dwFutureFlags=((DB_Mra_GetByte(NULL,"RTFReceiveEnable",MRA_DEFAULT_RTF_RECEIVE_ENABLE)? FEATURE_FLAG_RTF_MESSAGE:0)|MRA_FEATURE_FLAGS); + + if (DB_Mra_GetStaticStringA(NULL,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + MraSendCommand_Login2W(szEMail,dwEMailSize,(LPSTR)szBuff,dwStringSize,dwStatus,lpcszStatusUri[dwXStatus],lstrlenA(lpcszStatusUri[dwXStatus]),lpwszStatusTitle,dwStatusTitleSize,lpwszStatusDesc,dwStatusDescSize,dwFutureFlags,szUserAgentFormated,dwUserAgentFormatedSize,szSelfVersionString,dwSelfVersionSize); + }else{// no login + (*pbContinue)=FALSE; + } + SecureZeroMemory(szBuff,sizeof(szBuff)); + }else{// no password + (*pbContinue)=FALSE; + } + (*pdwPingPeriod)=GetUL(&lpbDataCurrent); + break; + case MRIM_CS_LOGIN_ACK://Успешная авторизация + masMraSettings.bLoggedIn=TRUE; + (*pdwNextPingSendTickTime)=0;// force send ping + MraSendCMD(MRIM_CS_PING,NULL,0); + MraSetStatus(masMraSettings.dwDesiredStatusMode,masMraSettings.dwDesiredStatusMode); + //(*((LPBYTE)NULL))=1;// force exception + //while(TRUE) Sleep(1); // force infinite loop + MraAvatarsQueueGetAvatarSimple(masMraSettings.hAvatarsQueueHandle,GAIF_FORCE,NULL,0); + break; + case MRIM_CS_LOGIN_REJ://Неверная авторизация //LPS ## reason ## причина отказа + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,NULL,ACKTYPE_LOGIN,ACKRESULT_FAILED,NULL,LOGINERR_WRONGPASSWORD,0); + + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + dwStringSize=MultiByteToWideChar(MRA_CODE_PAGE,0,lpsString.lpszData,lpsString.dwSize,szBuff,SIZEOF(szBuff)); + szBuff[dwStringSize]=0; + MraPopupShowW(NULL,MRA_POPUP_TYPE_ERROR,0,TranslateW(L"Logon error: invalid login/password"),szBuff); + (*pbContinue)=FALSE; + break; + case MRIM_CS_MESSAGE_ACK:// Доставка сообщения + { + DWORD dwMsgID,dwFlags; + MRA_LPS lpsText,lpsRTFText,lpsMultiChatData; + + dwMsgID=GetUL(&lpbDataCurrent); + dwFlags=GetUL(&lpbDataCurrent); + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsEMail);//LPS ## from ## Адрес отправителя + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsText);//LPS ## message ## текстовая версия сообщения + //if (dwFlags&MESSAGE_FLAG_RTF) + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsRTFText);//LPS ## rtf-message ## форматированная версия сообщения + if (dwFlags&MESSAGE_FLAG_MULTICHAT) GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsMultiChatData); // LPS multichat_data + + if (MraRecvCommand_Message((DWORD)_time32(NULL),dwFlags,&lpsEMail,&lpsText,&lpsRTFText,&lpsMultiChatData)==NO_ERROR) + {// подтверждаем получение, только если удалось его обработать + if ((dwFlags&MESSAGE_FLAG_NORECV)==0) + {// need send delivery status + MraSendCommand_MessageRecv(lpsEMail.lpszData,lpsEMail.dwSize,dwMsgID); + } + } + } + break; + case MRIM_CS_MESSAGE_STATUS: + if (MraSendQueueFind(masMraSettings.hSendQueueHandle,pmaHeader->seq,NULL,&hContact,&dwAckType,(LPBYTE*)&lpsString.lpszData,&lpsString.dwSize)==NO_ERROR) + { + dwTemp=GetUL(&lpbDataCurrent); + switch(dwTemp){ + case MESSAGE_DELIVERED:// Message delivered directly to user + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,hContact,dwAckType,ACKRESULT_SUCCESS,(HANDLE)pmaHeader->seq,(LPARAM)NULL,0); + break;//***deb возможны сбои из-за асинхронности тк там передаётся указатель + case MESSAGE_REJECTED_NOUSER:// Message rejected - no such user + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,hContact,dwAckType,ACKRESULT_FAILED,(HANDLE)pmaHeader->seq,(LPARAM)"Message rejected - no such user",-1); + break; + case MESSAGE_REJECTED_INTERR:// Internal server error + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,hContact,dwAckType,ACKRESULT_FAILED,(HANDLE)pmaHeader->seq,(LPARAM)"Internal server error",-1); + break; + case MESSAGE_REJECTED_LIMIT_EXCEEDED:// Offline messages limit exceeded + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,hContact,dwAckType,ACKRESULT_FAILED,(HANDLE)pmaHeader->seq,(LPARAM)"Offline messages limit exceeded",-1); + break; + case MESSAGE_REJECTED_TOO_LARGE:// Message is too large + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,hContact,dwAckType,ACKRESULT_FAILED,(HANDLE)pmaHeader->seq,(LPARAM)"Message is too large",-1); + break; + case MESSAGE_REJECTED_DENY_OFFMSG:// User does not accept offline messages + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,hContact,dwAckType,ACKRESULT_FAILED,(HANDLE)pmaHeader->seq,(LPARAM)"User does not accept offline messages",-1); + break; + case MESSAGE_REJECTED_DENY_OFFFLSH:// User does not accept offline flash animation + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,hContact,dwAckType,ACKRESULT_FAILED,(HANDLE)pmaHeader->seq,(LPARAM)"User does not accept offline flash animation",-1); + break; + default: + dwTemp=mir_snprintf((LPSTR)szBuff,SIZEOF(szBuff),"Undefined message deliver error, code: %lu",dwTemp); + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,hContact,dwAckType,ACKRESULT_FAILED,(HANDLE)pmaHeader->seq,(LPARAM)szBuff,dwTemp); + break; + } + MraSendQueueFree(masMraSettings.hSendQueueHandle,pmaHeader->seq); + }else{// not found in queue + if (GetUL(&lpbDataCurrent)!=MESSAGE_DELIVERED) MraPopupShowFromAgentW(MRA_POPUP_TYPE_DEBUG,0,TranslateW(L"MRIM_CS_MESSAGE_STATUS: not found in queue")); + } + break; + case MRIM_CS_CONNECTION_PARAMS:// Изменение параметров соединения + (*pdwPingPeriod)=GetUL(&lpbDataCurrent); + (*pdwNextPingSendTickTime)=0;// force send ping + MraSendCMD(MRIM_CS_PING,NULL,0); + break; + case MRIM_CS_USER_INFO: + while (lpbDataCurrent<(lpbData+dwDataSize)) + { + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpsString.lpszData,lpsString.dwSize,"MESSAGES.TOTAL",14)==CSTR_EQUAL) + { + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + masMraSettings.dwEmailMessagesTotal=StrToUNum32(lpsString.lpszData,lpsString.dwSize); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpsString.lpszData,lpsString.dwSize,"MESSAGES.UNREAD",15)==CSTR_EQUAL) + { + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + masMraSettings.dwEmailMessagesUnRead=StrToUNum32(lpsString.lpszData,lpsString.dwSize); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpsString.lpszData,lpsString.dwSize,"MRIM.NICKNAME",13)==CSTR_EQUAL) + { + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + DB_Mra_SetLPSStringW(NULL,"Nick",&lpsString); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpsString.lpszData,lpsString.dwSize,"client.endpoint",15)==CSTR_EQUAL) + { + LPSTR lpszDelimiter; + + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + dwStringSize=WideCharToMultiByte(MRA_CODE_PAGE,0,lpsString.lpwszData,lpsString.dwSize,(LPSTR)szBuff,sizeof(szBuff),NULL,NULL); + lpszDelimiter=(LPSTR)MemoryFind(0,szBuff,dwStringSize,":",1); + if (lpszDelimiter) + { + (*lpszDelimiter)=0; + lpszDelimiter=(LPSTR)szBuff; + DB_Mra_SetDword(NULL,"IP",HTONL(inet_addr(lpszDelimiter))); + } + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpsString.lpszData,lpsString.dwSize,"connect.xml",11)==CSTR_EQUAL) + { + DebugPrintA(lpsString.lpszData); + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + DebugPrintCRLFW(lpsString.lpwszData); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpsString.lpszData,lpsString.dwSize,"micblog.show_title",18)==CSTR_EQUAL) + { + DebugPrintA(lpsString.lpszData); + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + DebugPrintCRLFW(lpsString.lpwszData); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpsString.lpszData,lpsString.dwSize,"micblog.status.id",17)==CSTR_EQUAL) + { + DWORDLONG dwBlogStatusID; + + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + dwBlogStatusID=StrToUNum64(lpsString.lpszData,lpsString.dwSize); + DB_Mra_WriteContactSettingBlob(NULL,DBSETTING_BLOGSTATUSID,&dwBlogStatusID,sizeof(DWORDLONG)); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpsString.lpszData,lpsString.dwSize,"micblog.status.time",19)==CSTR_EQUAL) + { + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + DB_Mra_SetDword(NULL,DBSETTING_BLOGSTATUSTIME,StrToUNum32(lpsString.lpszData,lpsString.dwSize)); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpsString.lpszData,lpsString.dwSize,"micblog.status.text",19)==CSTR_EQUAL) + { + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + DB_Mra_SetLPSStringW(NULL,DBSETTING_BLOGSTATUS,&lpsString); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpsString.lpszData,lpsString.dwSize,"HAS_MYMAIL",10)==CSTR_EQUAL) + {// ??? + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + //DB_Mra_SetDword(NULL,DBSETTING_BLOGSTATUSTIME,StrToUNum32(lpsString.lpszData,lpsString.dwSize)); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpsString.lpszData,lpsString.dwSize,"mrim.status.open_search",23)==CSTR_EQUAL) + {// ??? + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + //DB_Mra_SetDword(NULL,DBSETTING_BLOGSTATUSTIME,StrToUNum32(lpsString.lpszData,lpsString.dwSize)); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpsString.lpszData,lpsString.dwSize,"rb.target.cookie",16)==CSTR_EQUAL) + {// ??? + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + //DB_Mra_SetDword(NULL,DBSETTING_BLOGSTATUSTIME,StrToUNum32(lpsString.lpszData,lpsString.dwSize)); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpsString.lpszData,lpsString.dwSize,"show_web_history_link",21)==CSTR_EQUAL) + {// ??? + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + //DB_Mra_SetDword(NULL,DBSETTING_BLOGSTATUSTIME,StrToUNum32(lpsString.lpszData,lpsString.dwSize)); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpsString.lpszData,lpsString.dwSize,"friends_suggest",15)==CSTR_EQUAL) + {// ??? + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + //DB_Mra_SetDword(NULL,DBSETTING_BLOGSTATUSTIME,StrToUNum32(lpsString.lpszData,lpsString.dwSize)); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpsString.lpszData,lpsString.dwSize,"timestamp",9)==CSTR_EQUAL) + {// ??? + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + //DB_Mra_SetDword(NULL,DBSETTING_BLOGSTATUSTIME,StrToUNum32(lpsString.lpszData,lpsString.dwSize)); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpsString.lpszData,lpsString.dwSize,"trusted_update",14)==CSTR_EQUAL) + {// ??? + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + //DB_Mra_SetDword(NULL,DBSETTING_BLOGSTATUSTIME,StrToUNum32(lpsString.lpszData,lpsString.dwSize)); + }else{ + #ifdef _DEBUG + LPSTR lpszCurrentPos=(LPSTR)szBuff; + memmove(lpszCurrentPos,lpsString.lpszData,lpsString.dwSize); + lpszCurrentPos+=lpsString.dwSize; + (*((WORD*)lpszCurrentPos))=(*((WORD*)": ")); + lpszCurrentPos+=sizeof(WORD); + + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + memmove(lpszCurrentPos,lpsString.lpszData,lpsString.dwSize); + lpszCurrentPos+=lpsString.dwSize; + (*((WORD*)lpszCurrentPos))=(*((WORD*)szCRLF)); + lpszCurrentPos+=sizeof(WORD);(*((WORD*)lpszCurrentPos))=0; + + DebugPrintCRLFA((LPSTR)szBuff); + //MraPopupShowFromAgentW(MRA_POPUP_TYPE_DEBUG,0,szBuff); + DebugBreak(); + #endif + } + } + MraUpdateEmailStatus(NULL,0,NULL,0,0,0); + break; + case MRIM_CS_OFFLINE_MESSAGE_ACK://Сообщение доставленное, пока пользователь не был подключен к сети + { + DWORD dwTime,dwFlags; + MRA_LPS lpsText,lpsRTFText,lpsMultiChatData; + LPBYTE lpbBuff=NULL; + DWORDLONG dwMsgUIDL; + + dwMsgUIDL=GetUIDL(&lpbDataCurrent); + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + + if (MraOfflineMessageGet(&lpsString,&dwTime,&dwFlags,&lpsEMail,&lpsText,&lpsRTFText,&lpsMultiChatData,&lpbBuff)==NO_ERROR) + { + dwTemp=MraRecvCommand_Message(dwTime,dwFlags,&lpsEMail,&lpsText,&lpsRTFText,&lpsMultiChatData); + if (dwTemp==NO_ERROR || dwTemp==ERROR_ACCESS_DENIED) + {// подтверждаем получение, только если удалось его обработать + MraSendCommand_OfflineMessageDel(dwMsgUIDL); + }else{ + ShowFormatedErrorMessage(L"Offline message processing error, message will not deleted from server",NO_ERROR); + } + }else{ + ShowFormatedErrorMessage(L"Offline message processing error, message will not deleted from server",NO_ERROR); + } + MEMFREE(lpbBuff); + } + break; + case MRIM_CS_AUTHORIZE_ACK://Информация об авторизации + {// нас автоизовали, те разрешили нам получать уведомление об изменении статуса, значит юзер у нас в списке + BOOL bAdded; + BYTE btBuff[BUFF_SIZE_BLOB]; + DBEVENTINFO dbei={0}; + + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsEMail); + hContact=MraHContactFromEmail(lpsEMail.lpszData,lpsEMail.dwSize,TRUE,TRUE,&bAdded); + if (bAdded) MraUpdateContactInfo(hContact); + + if (IsEMailChatAgent(lpsEMail.lpszData,lpsEMail.dwSize)==FALSE) + { + dbei.cbSize=sizeof(dbei); + dbei.szModule=PROTOCOL_NAMEA; + dbei.timestamp=(DWORD)_time32(NULL); + dbei.flags=0; + dbei.eventType=EVENTTYPE_ADDED; + //dbei.cbBlob=0; + CreateBlobFromContact(hContact,NULL,0,(LPBYTE)&btBuff,SIZEOF(btBuff),&dwStringSize); + dbei.cbBlob=dwStringSize; + dbei.pBlob=btBuff; + + CallService(MS_DB_EVENT_ADD,(WPARAM)NULL,(LPARAM)&dbei); + } + + GetContactBasicInfoW(hContact,NULL,NULL,NULL,&dwTemp,NULL,NULL,0,NULL,NULL,0,NULL,NULL,0,NULL); + dwTemp&=~CONTACT_INTFLAG_NOT_AUTHORIZED; + SetContactBasicInfoW(hContact,SCBIFSI_LOCK_CHANGES_EVENTS,SCBIF_SERVER_FLAG,0,0,0,dwTemp,0,NULL,0,NULL,0,NULL,0); + DB_Mra_SetDword(hContact,"HooksLocked",TRUE); + DBDeleteContactSetting(hContact,"CList","NotOnList"); + DB_Mra_SetDword(hContact,"HooksLocked",FALSE); + } + break; + case MRIM_CS_MPOP_SESSION://Ключ для web-авторизации // + if (GetUL(&lpbDataCurrent)) + { + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString); + MraMPopSessionQueueSetNewMPopKey(masMraSettings.hMPopSessionQueue,lpsString.lpszData,lpsString.dwSize); + MraMPopSessionQueueStart(masMraSettings.hMPopSessionQueue); + }else{//error + MraPopupShowFromAgentW(MRA_POPUP_TYPE_WARNING,0,TranslateW(L"Server error: cant get MPOP key for web authorize")); + MraMPopSessionQueueFlush(masMraSettings.hMPopSessionQueue); + } + break; +///////////////////////////////////////////////////////////////////////////////////// + case MRIM_CS_FILE_TRANSFER: + { + BOOL bAdded; + DWORD dwIDRequest,dwFilesTotalSize; + MRA_LPS lpsFiles={0},lpsFilesW={0},lpsAddreses={0}; + + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsEMail);// LPS TO/FROM ANSI + dwIDRequest=GetUL(&lpbDataCurrent);// DWORD id_request + dwFilesTotalSize=GetUL(&lpbDataCurrent);// DWORD FILESIZE + if (GetUL(&lpbDataCurrent))//LPS: + { + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsFiles);// LPS Files (FileName;FileSize;FileName;FileSize;) ANSI + if (GetUL(&lpbDataCurrent))// LPS DESCRIPTION + { + dwTemp=GetUL(&lpbDataCurrent);// ??? + DebugBreakIf(dwTemp!=1); + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsFilesW);// LPS Files (FileName;FileSize;FileName;FileSize;) UNICODE + } + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsAddreses);// LPS Conn (IP:Port;IP:Port;) ANSI + } + + hContact=MraHContactFromEmail(lpsEMail.lpszData,lpsEMail.dwSize,TRUE,TRUE,&bAdded); + if (bAdded) MraUpdateContactInfo(hContact); + + bAdded=FALSE; + if (lpsFilesW.dwSize==0) + { + lpsFilesW.lpwszData=(LPWSTR)MEMALLOC((lpsFiles.dwSize+MAX_PATH)*sizeof(WCHAR)); + if (lpsFilesW.lpwszData) + { + lpsFilesW.dwSize=MultiByteToWideChar(MRA_CODE_PAGE,0,lpsFiles.lpszData,lpsFiles.dwSize,lpsFilesW.lpwszData,(lpsFiles.dwSize+MAX_PATH)); + bAdded=TRUE; + } + } + + if (lpsFilesW.dwSize) MraFilesQueueAddReceive(masMraSettings.hFilesQueueHandle,0,hContact,dwIDRequest,lpsFilesW.lpwszData,lpsFilesW.dwSize,lpsAddreses.lpszData,lpsAddreses.dwSize); + if (bAdded) MEMFREE(lpsFilesW.lpwszData); + } + break; + case MRIM_CS_FILE_TRANSFER_ACK: + dwAckType=GetUL(&lpbDataCurrent);// DWORD status + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsEMail);// LPS TO/FROM + dwTemp=GetUL(&lpbDataCurrent);// DWORD id_request + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString);// LPS DESCRIPTION + + switch(dwAckType){ + case FILE_TRANSFER_STATUS_OK:// игнорируем, мы и так уже слушаем порт(ждём), то что кто то согласился ничего не меняет + //hContact=MraHContactFromEmail(lpsEMail.lpszData,lpsEMail.dwSize,TRUE,TRUE,NULL); + break; + case FILE_TRANSFER_STATUS_DECLINE: + MraFilesQueueCancel(masMraSettings.hFilesQueueHandle,dwTemp,FALSE); + break; + case FILE_TRANSFER_STATUS_ERROR: + ShowFormatedErrorMessage(L"File transfer: error",NO_ERROR); + MraFilesQueueCancel(masMraSettings.hFilesQueueHandle,dwTemp,FALSE); + break; + case FILE_TRANSFER_STATUS_INCOMPATIBLE_VERS: + ShowFormatedErrorMessage(L"File transfer: incompatible versions",NO_ERROR); + MraFilesQueueCancel(masMraSettings.hFilesQueueHandle,dwTemp,FALSE); + break; + case FILE_TRANSFER_MIRROR: + MraFilesQueueSendMirror(masMraSettings.hFilesQueueHandle,dwTemp,lpsString.lpszData,lpsString.dwSize); + break; + default:// ## unknown error + mir_sntprintf(szBuff,SIZEOF(szBuff),TranslateW(L"MRIM_CS_FILE_TRANSFER_ACK: unknown error, code: %lu"),dwAckType); + ShowFormatedErrorMessage(szBuff,NO_ERROR); + break; + } + break; +///////////////////////////////////////////////////////////////////////////////////// + case MRIM_CS_USER_STATUS://Смена статуса другого пользователя + { + BOOL bAdded; + DWORD dwStatus,dwXStatus,dwFutureFlags; + MRA_LPS lpsSpecStatusUri,lpsStatusTitle,lpsStatusDesc,lpsUserAgentFormated; + + dwStatus=GetUL(&lpbDataCurrent); + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsSpecStatusUri); + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsStatusTitle); + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsStatusDesc); + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsEMail); + dwFutureFlags=GetUL(&lpbDataCurrent);// com_support (>=1.14) + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsUserAgentFormated); + + + if ((hContact=MraHContactFromEmail(lpsEMail.lpszData,lpsEMail.dwSize,TRUE,TRUE,&bAdded))) + { + if (bAdded) MraUpdateContactInfo(hContact); + + dwTemp=GetMiradaStatusFromMraStatus(dwStatus,GetMraXStatusIDFromMraUriStatus(lpsSpecStatusUri.lpszData,lpsSpecStatusUri.dwSize),&dwXStatus); + + MraContactCapabilitiesSet(hContact,dwFutureFlags); + DB_Mra_SetByte(hContact,DBSETTING_XSTATUSID,(BYTE)dwXStatus); + DB_Mra_SetLPSStringW(hContact,DBSETTING_XSTATUSNAME,&lpsStatusTitle); + DB_Mra_SetLPSStringW(hContact,DBSETTING_XSTATUSMSG,&lpsStatusDesc); + + if (dwTemp!=ID_STATUS_OFFLINE)// пишем клиента только если юзер не отключён, иначе не затираем старое + { + if (lpsUserAgentFormated.dwSize) + {// есть чё писать + if (DB_Mra_GetByte(NULL,"MirVerRaw",MRA_DEFAULT_MIRVER_RAW)==FALSE) + {// приводим к человеческому виду, если получится... + MraGetVersionStringFromFormated(lpsUserAgentFormated.lpszData,lpsUserAgentFormated.dwSize,(LPSTR)szBuff,SIZEOF(szBuff),&dwStringSize); + lpsUserAgentFormated.lpszData=(LPSTR)szBuff; + lpsUserAgentFormated.dwSize=dwStringSize; + } + }else{// хз чё за клиент + lpsUserAgentFormated.lpszData=MIRVER_UNKNOWN; + lpsUserAgentFormated.dwSize=(sizeof(MIRVER_UNKNOWN)-1); + } + DB_Mra_SetLPSStringA(hContact,"MirVer",&lpsUserAgentFormated); + } + + if (dwTemp==MraGetContactStatus(hContact)) + {// меняем шило на шило, подозрительно? ;) + if (dwTemp==ID_STATUS_OFFLINE) + {// was/now invisible + WCHAR szEMail[MAX_EMAIL_LEN]; + + DB_Mra_GetStaticStringW(hContact,"e-mail",szEMail,SIZEOF(szEMail),NULL); + mir_sntprintf(szBuff,SIZEOF(szBuff),L"%s <%s> - %s",GetContactNameW(hContact),szEMail,TranslateW(L"invisible status changed")); + MraPopupShowFromContactW(hContact,MRA_POPUP_TYPE_INFORMATION,0,szBuff); + + MraSetContactStatus(hContact,ID_STATUS_INVISIBLE); + }else{// server or miranda bug or status change + //DebugBreak(); + } + } + MraSetContactStatus(hContact,dwTemp); + SetExtraIcons(hContact); + } + } + break; + case MRIM_CS_LOGOUT:// Пользователь отключен из-за параллельного входа с его логином. + if (GetUL(&lpbDataCurrent)==LOGOUT_NO_RELOGIN_FLAG) ShowFormatedErrorMessage(L"Another user connected with your login",NO_ERROR); + (*pbContinue)=FALSE; + break; + case MRIM_CS_ADD_CONTACT_ACK: + case MRIM_CS_MODIFY_CONTACT_ACK: + if (MraSendQueueFind(masMraSettings.hSendQueueHandle,pmaHeader->seq,NULL,&hContact,&dwAckType,(LPBYTE*)&lpsString.lpszData,&lpsString.dwSize)==NO_ERROR) + { + dwTemp=GetUL(&lpbDataCurrent); + switch(dwTemp){ + case CONTACT_OPER_SUCCESS:// ## добавление произведено успешно + if (pmaHeader->msg==MRIM_CS_ADD_CONTACT_ACK) SetContactBasicInfoW(hContact,0,(SCBIF_ID|SCBIF_SERVER_FLAG),GetUL(&lpbDataCurrent),0,0,CONTACT_INTFLAG_NOT_AUTHORIZED,0,NULL,0,NULL,0,NULL,0); + break; + case CONTACT_OPER_ERROR:// ## переданные данные были некорректны + ShowFormatedErrorMessage(L"Sended data is invalid",NO_ERROR); + break; + case CONTACT_OPER_INTERR:// ## при обработке запроса произошла внутренняя ошибка + ShowFormatedErrorMessage(L"Internal server error",NO_ERROR); + break; + case CONTACT_OPER_NO_SUCH_USER:// ## добавляемого пользователя не существует в системе + SetContactBasicInfoW(hContact,0,SCBIF_SERVER_FLAG,0,0,0,-1,0,NULL,0,NULL,0,NULL,0); + ShowFormatedErrorMessage(L"User does not registred",NO_ERROR); + break; + case CONTACT_OPER_INVALID_INFO:// ## некорректное имя пользователя + ShowFormatedErrorMessage(L"Invalid user name",NO_ERROR); + break; + case CONTACT_OPER_USER_EXISTS:// ## пользователь уже есть в контакт-листе + ShowFormatedErrorMessage(L"User allready added",NO_ERROR); + break; + case CONTACT_OPER_GROUP_LIMIT:// ## превышено максимально допустимое количество групп (20) + ShowFormatedErrorMessage(L"Group limit is 20",NO_ERROR); + break; + default:// ## unknown error + mir_sntprintf(szBuff,SIZEOF(szBuff),TranslateW(L"MRIM_CS_*_CONTACT_ACK: unknown server error, code: %lu"),dwTemp); + MraPopupShowFromAgentW(MRA_POPUP_TYPE_DEBUG,0,szBuff); + break; + } + MraSendQueueFree(masMraSettings.hSendQueueHandle,pmaHeader->seq); + }else{// not found in queue + MraPopupShowFromAgentW(MRA_POPUP_TYPE_DEBUG,0,TranslateW(L"MRIM_CS_*_CONTACT_ACK: not found in queue")); + } + break; + case MRIM_CS_ANKETA_INFO: + if (MraSendQueueFind(masMraSettings.hSendQueueHandle,pmaHeader->seq,NULL,&hContact,&dwAckType,(LPBYTE*)&lpsString.lpszData,&lpsString.dwSize)==NO_ERROR) + { + switch(GetUL(&lpbDataCurrent)){ + case MRIM_ANKETA_INFO_STATUS_OK:// поиск успешно завершен + { + DWORD dwFeildsNum,dwMaxRows,dwServerTime,dwStatus; + SIZE_T i; + MRA_LPS *pmralpsFeilds,*pmralpsValues; + + dwFeildsNum=GetUL(&lpbDataCurrent); + dwMaxRows=GetUL(&lpbDataCurrent); + dwServerTime=GetUL(&lpbDataCurrent); + + pmralpsFeilds=(MRA_LPS*)MEMALLOC(((dwFeildsNum*2)+4)*sizeof(MRA_LPS)); + if (pmralpsFeilds) + { + pmralpsValues=(pmralpsFeilds+dwFeildsNum); + // read headers name + for (i=0;i9) + {// calc "Age" + SYSTEMTIME stTime={0}; + + stTime.wYear=(WORD)StrToUNum32(pmralpsValues[i].lpszData,4); + stTime.wMonth=(WORD)StrToUNum32((pmralpsValues[i].lpszData+5),2); + stTime.wDay=(WORD)StrToUNum32((pmralpsValues[i].lpszData+8),2); + DB_Mra_SetWord(hContact,"BirthYear",stTime.wYear); + DB_Mra_SetByte(hContact,"BirthMonth",(BYTE)stTime.wMonth); + DB_Mra_SetByte(hContact,"BirthDay",(BYTE)stTime.wDay); + + DB_Mra_SetWord(hContact,"Age",(WORD)GetYears(&stTime)); + }else{ + DB_Mra_DeleteValue(hContact,"BirthYear"); + DB_Mra_DeleteValue(hContact,"BirthMonth"); + DB_Mra_DeleteValue(hContact,"BirthDay"); + DB_Mra_DeleteValue(hContact,"Age"); + } + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,pmralpsFeilds[i].lpszData,pmralpsFeilds[i].dwSize,"City_id",7)==CSTR_EQUAL) + { + dwTemp=StrToUNum32(pmralpsValues[i].lpszData,pmralpsValues[i].dwSize); + if (dwTemp) + { + for(SIZE_T j=0;mrapPlaces[j].lpszData;j++) + { + if (mrapPlaces[j].dwCityID==dwTemp) + { + DB_Mra_SetStringW(hContact,"City",mrapPlaces[j].lpszData); + break; + } + } + }else{ + DB_Mra_DeleteValue(hContact,"City"); + } + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,pmralpsFeilds[i].lpszData,pmralpsFeilds[i].dwSize,"Location",8)==CSTR_EQUAL) + {//*** + DB_Mra_SetLPSStringW(hContact,"About",&pmralpsValues[i]); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,pmralpsFeilds[i].lpszData,pmralpsFeilds[i].dwSize,"Zodiac",6)==CSTR_EQUAL) + { + //*** + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,pmralpsFeilds[i].lpszData,pmralpsFeilds[i].dwSize,"BMonth",6)==CSTR_EQUAL) + {// used Birthday + //if (pmralpsValues[i].dwSize) DB_Mra_SetByte(hContact,"BirthMonth",(BYTE)StrToUNum32(pmralpsValues[i].lpszData,pmralpsValues[i].dwSize)); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,pmralpsFeilds[i].lpszData,pmralpsFeilds[i].dwSize,"BDay",4)==CSTR_EQUAL) + {// used Birthday + //if (pmralpsValues[i].dwSize) DB_Mra_SetByte(hContact,"BirthDay",(BYTE)StrToUNum32(pmralpsValues[i].lpszData,pmralpsValues[i].dwSize)); + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,pmralpsFeilds[i].lpszData,pmralpsFeilds[i].dwSize,"Country_id",10)==CSTR_EQUAL) + { + dwTemp=StrToUNum32(pmralpsValues[i].lpszData,pmralpsValues[i].dwSize); + if (dwTemp) + { + for(SIZE_T j=0;mrapPlaces[j].lpszData;j++) + { + if (mrapPlaces[j].dwCountryID==dwTemp) + { + DB_Mra_SetStringW(hContact,"Country",mrapPlaces[j].lpszData); + break; + } + } + }else{ + DB_Mra_DeleteValue(hContact,"Country"); + } + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,pmralpsFeilds[i].lpszData,pmralpsFeilds[i].dwSize,"Phone",5)==CSTR_EQUAL) + { + DB_Mra_DeleteValue(hContact,"Phone"); + DB_Mra_DeleteValue(hContact,"Cellular"); + DB_Mra_DeleteValue(hContact,"Fax"); + + if (pmralpsValues[i].dwSize) + { + LPSTR lpszCurPos; + + lpsString.lpszData=pmralpsValues[i].lpszData; + lpszCurPos=(LPSTR)MemoryFindByte(0,pmralpsValues[i].lpszData,pmralpsValues[i].dwSize,','); + if (lpszCurPos) + { + lpsString.dwSize=(lpszCurPos-lpsString.lpszData); + }else{ + lpsString.dwSize=((pmralpsValues[i].lpszData+pmralpsValues[i].dwSize)-lpsString.lpszData); + } + DB_Mra_SetLPSStringA(hContact,"Phone",&lpsString); + + if (lpszCurPos) + { + lpsString.lpszData=(++lpszCurPos); + lpszCurPos=(LPSTR)MemoryFindByte((lpszCurPos-pmralpsValues[i].lpszData),pmralpsValues[i].lpszData,pmralpsValues[i].dwSize,','); + if (lpszCurPos) + { + lpsString.dwSize=(lpszCurPos-lpsString.lpszData); + }else{ + lpsString.dwSize=((pmralpsValues[i].lpszData+pmralpsValues[i].dwSize)-lpsString.lpszData); + } + DB_Mra_SetLPSStringA(hContact,"Cellular",&lpsString); + } + + if (lpszCurPos) + { + lpsString.lpszData=(++lpszCurPos); + lpszCurPos=(LPSTR)MemoryFindByte((lpszCurPos-pmralpsValues[i].lpszData),pmralpsValues[i].lpszData,pmralpsValues[i].dwSize,','); + if (lpszCurPos) + { + lpsString.dwSize=(lpszCurPos-lpsString.lpszData); + }else{ + lpsString.dwSize=((pmralpsValues[i].lpszData+pmralpsValues[i].dwSize)-lpsString.lpszData); + } + DB_Mra_SetLPSStringA(hContact,"Fax",&lpsString); + } + } + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,pmralpsFeilds[i].lpszData,pmralpsFeilds[i].dwSize,"mrim_status",11)==CSTR_EQUAL) + { + if (pmralpsValues[i].dwSize) + { + DWORD dwID,dwContactSeverFlags; + + GetContactBasicInfoW(hContact,&dwID,NULL,NULL,&dwContactSeverFlags,NULL,NULL,0,NULL,NULL,0,NULL,NULL,0,NULL); + if (dwID==-1 || dwContactSeverFlags&CONTACT_INTFLAG_NOT_AUTHORIZED) + {// для авторизованного нам и так присылают правильный статус + dwStatus=StrHexToUNum32(pmralpsValues[i].lpszData,pmralpsValues[i].dwSize); + MraSetContactStatus(hContact,GetMiradaStatusFromMraStatus(dwStatus,MRA_MIR_XSTATUS_NONE,NULL)); + DB_Mra_SetByte(hContact,DBSETTING_XSTATUSID,(BYTE)MRA_MIR_XSTATUS_NONE); + } + } + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,pmralpsFeilds[i].lpszData,pmralpsFeilds[i].dwSize,"status_uri",10)==CSTR_EQUAL) + { + if (pmralpsValues[i].dwSize) + { + DWORD dwID,dwContactSeverFlags,dwXStatus; + + GetContactBasicInfoW(hContact,&dwID,NULL,NULL,&dwContactSeverFlags,NULL,NULL,0,NULL,NULL,0,NULL,NULL,0,NULL); + if (dwID==-1 || dwContactSeverFlags&CONTACT_INTFLAG_NOT_AUTHORIZED) + {// для авторизованного нам и так присылают правильный статус + MraSetContactStatus(hContact,GetMiradaStatusFromMraStatus(dwStatus,GetMraXStatusIDFromMraUriStatus(pmralpsValues[i].lpszData,pmralpsValues[i].dwSize),&dwXStatus)); + DB_Mra_SetByte(hContact,DBSETTING_XSTATUSID,(BYTE)dwXStatus); + } + } + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,pmralpsFeilds[i].lpszData,pmralpsFeilds[i].dwSize,"status_title",12)==CSTR_EQUAL) + { + if (pmralpsValues[i].dwSize) + { + DWORD dwID,dwContactSeverFlags; + + GetContactBasicInfoW(hContact,&dwID,NULL,NULL,&dwContactSeverFlags,NULL,NULL,0,NULL,NULL,0,NULL,NULL,0,NULL); + if (dwID==-1 || dwContactSeverFlags&CONTACT_INTFLAG_NOT_AUTHORIZED) + {// для авторизованного нам и так присылают правильный статус + DB_Mra_SetLPSStringW(hContact,DBSETTING_XSTATUSNAME,&pmralpsValues[i]); + } + } + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,pmralpsFeilds[i].lpszData,pmralpsFeilds[i].dwSize,"status_desc",11)==CSTR_EQUAL) + { + if (pmralpsValues[i].dwSize) + { + DWORD dwID,dwContactSeverFlags; + + GetContactBasicInfoW(hContact,&dwID,NULL,NULL,&dwContactSeverFlags,NULL,NULL,0,NULL,NULL,0,NULL,NULL,0,NULL); + if (dwID==-1 || dwContactSeverFlags&CONTACT_INTFLAG_NOT_AUTHORIZED) + {// для авторизованного нам и так присылают правильный статус + DB_Mra_SetLPSStringW(hContact,DBSETTING_XSTATUSMSG,&pmralpsValues[i]); + } + } + }else{// for DEBUG ONLY + #ifdef _DEBUG + DebugPrintCRLFA(pmralpsFeilds[i].lpszData); + DebugPrintCRLFA(pmralpsValues[i].lpszData); + //DebugBreak(); + #endif + } + } + }else + if (dwAckType==ACKTYPE_SEARCH) + { + WCHAR szNick[MAX_EMAIL_LEN]={0}, + szFirstName[MAX_EMAIL_LEN]={0}, + szLastName[MAX_EMAIL_LEN]={0}, + szEMail[MAX_EMAIL_LEN]={0}; + MRA_LPS mralpsUsernameValue={0}; + PROTOSEARCHRESULT psr={0}; + + psr.cbSize=sizeof(psr); + psr.flags=PSR_UNICODE; + psr.nick=szNick; + psr.firstName=szFirstName; + psr.lastName=szLastName; + psr.email=szEMail; + psr.id=szEMail; + + for (i=0;iseq,(LPARAM)&psr); + } + }// end while + + MEMFREE(pmralpsFeilds); + } + } + + switch(dwAckType){ + case ACKTYPE_GETINFO: + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,hContact,dwAckType,ACKRESULT_SUCCESS,(HANDLE)1,(LPARAM)NULL,0); + break; + case ACKTYPE_SEARCH: + default: + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,hContact,dwAckType,ACKRESULT_SUCCESS,(HANDLE)pmaHeader->seq,(LPARAM)NULL,0); + break; + } + break; + case MRIM_ANKETA_INFO_STATUS_NOUSER:// не найдено ни одной подходящей записи + SetContactBasicInfoW(hContact,0,SCBIF_SERVER_FLAG,0,0,0,-1,0,NULL,0,NULL,0,NULL,0); + case MRIM_ANKETA_INFO_STATUS_DBERR:// ошибка базы данных + case MRIM_ANKETA_INFO_STATUS_RATELIMERR:// слишком много запросов, поиск временно запрещен + switch(dwAckType){ + case ACKTYPE_GETINFO: + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,hContact,dwAckType,ACKRESULT_FAILED,(HANDLE)1,(LPARAM)NULL,0); + break; + case ACKTYPE_SEARCH: + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,hContact,dwAckType,ACKRESULT_SUCCESS,(HANDLE)pmaHeader->seq,(LPARAM)NULL,0); + break; + default: + DebugBreak(); + break; + } + break; + default:// unknown + DebugBreak(); + break; + } + MraSendQueueFree(masMraSettings.hSendQueueHandle,pmaHeader->seq); + }else{// not found in queue + MraPopupShowFromAgentW(MRA_POPUP_TYPE_DEBUG,0,TranslateW(L"MRIM_ANKETA_INFO: not found in queue")); + } + break; + case MRIM_CS_MAILBOX_STATUS: + dwTemp=GetUL(&lpbDataCurrent); + if (dwTemp > masMraSettings.dwEmailMessagesTotal) masMraSettings.dwEmailMessagesTotal+=(dwTemp-masMraSettings.dwEmailMessagesUnRead); + + dwAckType=masMraSettings.dwEmailMessagesUnRead;// save old value + masMraSettings.dwEmailMessagesUnRead=dwTemp;// store new value + if (DB_Mra_GetByte(NULL,"IncrementalNewMailNotify",MRA_DEFAULT_INC_NEW_MAIL_NOTIFY)==0 || dwAckType1)// все параметры правильно инициализированны! + //if (dwGroupFlags&CONTACT_FLAG_GROUP && (dwGroupFlags&CONTACT_FLAG_REMOVED)==0) + { + #ifdef _DEBUG + memmove(szBuff,mralpsGroupName.lpszData,mralpsGroupName.dwSize); + szBuff[(mralpsGroupName.dwSize/sizeof(WCHAR))]=0; + DebugPrintW(szBuff); + + mir_snprintf((LPSTR)szBuff,SIZEOF(szBuff),": flags: %lu (",dwGroupFlags); + DebugPrintA((LPSTR)szBuff); + if (dwGroupFlags&CONTACT_FLAG_REMOVED) DebugPrintA("CONTACT_FLAG_REMOVED, "); + if (dwGroupFlags&CONTACT_FLAG_GROUP) DebugPrintA("CONTACT_FLAG_GROUP, "); + if (dwGroupFlags&CONTACT_FLAG_INVISIBLE) DebugPrintA("CONTACT_FLAG_INVISIBLE, "); + if (dwGroupFlags&CONTACT_FLAG_VISIBLE) DebugPrintA("CONTACT_FLAG_VISIBLE, "); + if (dwGroupFlags&CONTACT_FLAG_IGNORE) DebugPrintA("CONTACT_FLAG_IGNORE, "); + if (dwGroupFlags&CONTACT_FLAG_SHADOW) DebugPrintA("CONTACT_FLAG_SHADOW, "); + if (dwGroupFlags&CONTACT_FLAG_AUTHORIZED) DebugPrintA("CONTACT_FLAG_AUTHORIZED, "); + if (dwGroupFlags&CONTACT_FLAG_MULTICHAT) DebugPrintA("CONTACT_FLAG_MULTICHAT, "); + if (dwGroupFlags&CONTACT_FLAG_UNICODE_NAME) DebugPrintA("CONTACT_FLAG_UNICODE_NAME, "); + if (dwGroupFlags&CONTACT_FLAG_PHONE) DebugPrintA("CONTACT_FLAG_PHONE, "); + DebugPrintCRLFA(")"); + #endif//*/ + } + dwID++; + }// end for (processing groups) + + + DebugPrintCRLFW(L"Contacts:"); + DebugPrintCRLFA(szContactMask); + dwID=20; + while (lpbDataCurrent<(lpbData+dwDataSize)) + { + dwControlParam=0; + for(j=0;j5)// все параметры правильно инициализированны! + if ((dwContactFlag&(CONTACT_FLAG_GROUP|CONTACT_FLAG_REMOVED))==0) + { + hContact=MraHContactFromEmail(lpsEMail.lpszData,lpsEMail.dwSize,TRUE,FALSE,&bAdded); + if (hContact) + { + if (GetContactBasicInfoW(hContact,&dwTemp,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,0,NULL,NULL,0,NULL)==NO_ERROR && dwTemp!=-1) + {//deb контакт уже в списке, нахуй дубликата!!!! + dwTemp=dwTemp; + //MraSendCommand_ModifyContactW(hContact,dwID,CONTACT_FLAG_REMOVED,dwGroupID,lpsEMail.lpszData,lpsEMail.dwSize,mralpsNick.lpszData,mralpsNick.dwSize,mralpsCustomPhones.lpszData,mralpsCustomPhones.dwSize); + DebugBreak(); + }else{ + dwTemp=GetMiradaStatusFromMraStatus(dwStatus,GetMraXStatusIDFromMraUriStatus(lpsSpecStatusUri.lpszData,lpsSpecStatusUri.dwSize),&dwXStatus); + if((dwContactFlag&CONTACT_FLAG_UNICODE_NAME)) mralpsNick.dwSize/=sizeof(WCHAR); + + if (bAdded) + {// update user info + SetContactBasicInfoW(hContact,SCBIFSI_LOCK_CHANGES_EVENTS,(SCBIF_ID|SCBIF_GROUP_ID|SCBIF_FLAG|SCBIF_SERVER_FLAG|SCBIF_STATUS|SCBIF_NICK|SCBIF_PHONES),dwID,dwGroupID,dwContactFlag,dwContactSeverFlags,dwTemp,NULL,0,mralpsNick.lpwszData,mralpsNick.dwSize,mralpsCustomPhones.lpszData,mralpsCustomPhones.dwSize); + + // request user info from server + MraUpdateContactInfo(hContact); + }else{//****deb - check group ID param + SetContactBasicInfoW(hContact,SCBIFSI_LOCK_CHANGES_EVENTS,(SCBIF_ID|SCBIF_GROUP_ID|SCBIF_SERVER_FLAG|SCBIF_STATUS),dwID,dwGroupID,dwContactFlag,dwContactSeverFlags,dwTemp,NULL,0,mralpsNick.lpwszData,mralpsNick.dwSize,mralpsCustomPhones.lpszData,mralpsCustomPhones.dwSize); + if (mralpsNick.dwSize==0) + {// прописываем ник в листе на сервере + lstrcpynW(szBuff,GetContactNameW(hContact),SIZEOF(szBuff)); + mralpsNick.lpwszData=szBuff; + mralpsNick.dwSize=lstrlenW(mralpsNick.lpwszData); + + MraSendCommand_ModifyContactW(hContact,dwID,dwContactFlag,dwGroupID,lpsEMail.lpszData,lpsEMail.dwSize,mralpsNick.lpwszData,mralpsNick.dwSize,mralpsCustomPhones.lpszData,mralpsCustomPhones.dwSize); + } + } + + MraContactCapabilitiesSet(hContact,dwFutureFlags); + DB_Mra_SetByte(hContact,DBSETTING_XSTATUSID,(BYTE)dwXStatus); + DB_Mra_SetLPSStringW(hContact,DBSETTING_XSTATUSNAME,&lpsStatusTitle); + DB_Mra_SetLPSStringW(hContact,DBSETTING_XSTATUSMSG,&lpsStatusDesc); + DB_Mra_SetDword(hContact,DBSETTING_BLOGSTATUSTIME,dwBlogStatusTime); + DB_Mra_WriteContactSettingBlob(hContact,DBSETTING_BLOGSTATUSID,&dwBlogStatusID.QuadPart,sizeof(DWORDLONG)); + DB_Mra_SetLPSStringW(hContact,DBSETTING_BLOGSTATUS,&lpsBlogStatus); + DB_Mra_SetLPSStringW(hContact,DBSETTING_BLOGSTATUSMUSIC,&lpsBlogStatusMusic); + if (IsXStatusValid(dwXStatus)) SetExtraIcons(hContact); + + if (dwTemp!=ID_STATUS_OFFLINE)// пишем клиента только если юзер не отключён, иначе не затираем старое + { + if (lpsUserAgentFormated.dwSize) + {// есть чё писать + if (DB_Mra_GetByte(NULL,"MirVerRaw",MRA_DEFAULT_MIRVER_RAW)==FALSE) + { + MraGetVersionStringFromFormated(lpsUserAgentFormated.lpszData,lpsUserAgentFormated.dwSize,(LPSTR)szBuff,SIZEOF(szBuff),&dwStringSize); + lpsUserAgentFormated.lpszData=(LPSTR)szBuff; + lpsUserAgentFormated.dwSize=dwStringSize; + } + }else{// хз чё за клиент + lpsUserAgentFormated.lpszData=MIRVER_UNKNOWN; + lpsUserAgentFormated.dwSize=(sizeof(MIRVER_UNKNOWN)-1); + } + DB_Mra_SetLPSStringA(hContact,"MirVer",&lpsUserAgentFormated); + } + + if (dwContactSeverFlags&CONTACT_INTFLAG_NOT_AUTHORIZED) + if (DB_Mra_GetByte(NULL,"AutoAuthRequestOnLogon",MRA_DEFAULT_AUTO_AUTH_REQ_ON_LOGON)) CallProtoService(PROTOCOL_NAMEA,MRA_REQ_AUTH,(WPARAM)hContact,0); + } + } + } + dwID++; + }// end while (processing contacts) + + // post processing contact list + { + CHAR szEMail[MAX_EMAIL_LEN],szPhones[MAX_EMAIL_LEN]; + WCHAR wszAuthMessage[MAX_PATH],wszNick[MAX_EMAIL_LEN]; + SIZE_T dwEMailSize,dwNickSize,dwPhonesSize,dwAuthMessageSize; + + if (DB_Mra_GetStaticStringW(NULL,"AuthMessage",wszAuthMessage,SIZEOF(wszAuthMessage),&dwAuthMessageSize)==FALSE) + {// def auth message + lstrcpynW(wszAuthMessage,TranslateW(MRA_DEFAULT_AUTH_MESSAGE),SIZEOF(wszAuthMessage)); + dwAuthMessageSize=lstrlenW(wszAuthMessage); + } + + for(hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);hContact!=NULL;hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)) + { + if (GetContactBasicInfoW(hContact,&dwID,NULL,NULL,NULL,NULL,szEMail,SIZEOF(szEMail),&dwEMailSize,NULL,0,NULL,NULL,0,NULL)==NO_ERROR) + if (dwID==-1) + { + if (IsEMailChatAgent(szEMail,dwEMailSize)) + {// чат: ещё раз запросим авторизацию, пометим как видимый в списке, постоянный + DBDeleteContactSetting(hContact,"CList","Hidden"); + DBDeleteContactSetting(hContact,"CList","NotOnList"); + SetExtraIcons(hContact); + MraSetContactStatus(hContact,ID_STATUS_ONLINE); + + lstrcpynW(szBuff,GetContactNameW(hContact),SIZEOF(szBuff)); + MraSendCommand_AddContactW(hContact,(CONTACT_FLAG_VISIBLE|CONTACT_FLAG_MULTICHAT|CONTACT_FLAG_UNICODE_NAME),-1,szEMail,dwEMailSize,szBuff,lstrlenW(szBuff),NULL,0,NULL,0,0); + }else{ + if (DBGetContactSettingByte(hContact,"CList","NotOnList",0)==0) + {// set extra icons and upload contact + SetExtraIcons(hContact); + if (DB_Mra_GetByte(NULL,"AutoAddContactsToServer",MRA_DEFAULT_AUTO_ADD_CONTACTS_TO_SERVER)) + {//add all contacts to server + GetContactBasicInfoW(hContact,NULL,&dwGroupID,NULL,NULL,NULL,NULL,0,NULL,wszNick,SIZEOF(wszNick),&dwNickSize,szPhones,SIZEOF(szPhones),&dwPhonesSize); + MraSendCommand_AddContactW(hContact,(CONTACT_FLAG_VISIBLE|CONTACT_FLAG_UNICODE_NAME),dwGroupID,szEMail,dwEMailSize,wszNick,dwNickSize,szPhones,dwPhonesSize,wszAuthMessage,dwAuthMessageSize,0); + } + } + } + MraUpdateContactInfo(hContact); + } + } + } + }else{// контакт лист почемуто не получили + // всех в offline и id в нестандарт + for(HANDLE hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);hContact!=NULL;hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)) + {// функция сама проверяет принадлежность контакта к MRA + SetContactBasicInfoW(hContact,SCBIFSI_LOCK_CHANGES_EVENTS,(SCBIF_ID|SCBIF_GROUP_ID|SCBIF_SERVER_FLAG|SCBIF_STATUS),-1,-2,0,0,ID_STATUS_OFFLINE,NULL,0,NULL,0,NULL,0); + // request user info from server + MraUpdateContactInfo(hContact); + } + + if (dwTemp==GET_CONTACTS_ERROR) + {// найденный контакт-лист некорректен + ShowFormatedErrorMessage(L"MRIM_CS_CONTACT_LIST2: bad contact list",NO_ERROR); + }else + if (dwTemp==GET_CONTACTS_INTERR) + {// произошла внутренняя ошибка + ShowFormatedErrorMessage(L"MRIM_CS_CONTACT_LIST2: internal server error",NO_ERROR); + }else{ + mir_sntprintf(szBuff,SIZEOF(szBuff),TranslateW(L"MRIM_CS_CONTACT_LIST2: unknown server error, code: %lu"),dwTemp); + MraPopupShowFromAgentW(MRA_POPUP_TYPE_DEBUG,0,szBuff); + } + } + break; + case MRIM_CS_SMS_ACK: + dwTemp=GetUL(&lpbDataCurrent); + if (MraSendQueueFind(masMraSettings.hSendQueueHandle,pmaHeader->seq,NULL,&hContact,&dwAckType,(LPBYTE*)&lpsString.lpszData,&lpsString.dwSize)==NO_ERROR) + { + char szEMail[MAX_EMAIL_LEN]; + LPSTR lpszPhone; + LPWSTR lpwszMessage; + SIZE_T dwEMailSize,dwPhoneSize,dwMessageSize; + + if (DB_Mra_GetStaticStringA(NULL,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + dwPhoneSize=(*(DWORD*)lpsString.lpszData); + dwMessageSize=lpsString.dwSize-(dwPhoneSize+sizeof(DWORD)+2); + lpszPhone=(lpsString.lpszData+sizeof(DWORD)); + lpwszMessage=(LPWSTR)(lpszPhone+dwPhoneSize+1); + + dwTemp=mir_snprintf((LPSTR)szBuff,SIZEOF(szBuff),"Mail.ruYesMail.ru, Russia%s-1-1955988055-%s%s0\r\n",szEMail,lpszPhone,lpszPhone); + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,NULL,dwAckType,ACKRESULT_SENTREQUEST,(HANDLE)pmaHeader->seq,(LPARAM)szBuff,dwTemp); + } + + MEMFREE(lpsString.lpszData); + MraSendQueueFree(masMraSettings.hSendQueueHandle,pmaHeader->seq); + }else{// not found in queue + MraPopupShowFromAgentW(MRA_POPUP_TYPE_DEBUG,0,TranslateW(L"MRIM_CS_SMS_ACK: not found in queue")); + } + break; + case MRIM_CS_PROXY: + { + DWORD dwIDRequest; + MRA_LPS lpsAddreses={0}; + MRA_GUID mguidSessionID; + + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsEMail);// LPS to + dwIDRequest=GetUL(&lpbDataCurrent);// DWORD id_request + dwAckType=GetUL(&lpbDataCurrent);// DWORD data_type + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString);// LPS user_data + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsAddreses);// LPS lps_ip_port + mguidSessionID=GetGUID(&lpbDataCurrent);// DWORD session_id[4] + + if (dwAckType==MRIM_PROXY_TYPE_FILES) + {// файлы, on file recv + if (MraMrimProxySetData(MraFilesQueueItemProxyByID(masMraSettings.hFilesQueueHandle,dwIDRequest),lpsEMail.lpszData,lpsEMail.dwSize,dwIDRequest,dwAckType,lpsString.lpszData,lpsString.dwSize,lpsAddreses.lpszData,lpsAddreses.dwSize,&mguidSessionID)==NO_ERROR) + {// сессия передачи ещё жива/proxy enabled// set proxy info to file transfer context + MraFilesQueueStartMrimProxy(masMraSettings.hFilesQueueHandle,dwIDRequest); + }else{// дохлая сессия/не существующая + MraSendCommand_ProxyAck(PROXY_STATUS_ERROR,lpsEMail.lpszData,lpsEMail.dwSize,dwIDRequest,dwAckType,lpsString.lpszData,lpsString.dwSize,lpsAddreses.lpszData,lpsAddreses.dwSize,mguidSessionID); + DebugBreak(); + } + } + //DebugBreak(); + } + break; + case MRIM_CS_PROXY_ACK: + { + DWORD dwIDRequest; + HANDLE hMraMrimProxyData; + MRA_LPS lpsAddreses={0}; + MRA_GUID mguidSessionID; + + dwTemp=GetUL(&lpbDataCurrent);// DWORD status + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsEMail);// LPS to + dwIDRequest=GetUL(&lpbDataCurrent);// DWORD id_request + dwAckType=GetUL(&lpbDataCurrent);// DWORD data_type + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString);// LPS user_data + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsAddreses);// LPS lps_ip_port + mguidSessionID=GetGUID(&lpbDataCurrent);// DWORD session_id[4] + + if (dwAckType==MRIM_PROXY_TYPE_FILES) + {// файлы, on file send + if ((hMraMrimProxyData=MraFilesQueueItemProxyByID(masMraSettings.hFilesQueueHandle,dwIDRequest))) + {// сессия передачи ещё жива/proxy enabled + switch(dwTemp){ + case PROXY_STATUS_DECLINE: + MraFilesQueueCancel(masMraSettings.hFilesQueueHandle,dwIDRequest,FALSE); + break; + case PROXY_STATUS_OK: + if (MraMrimProxySetData(hMraMrimProxyData,lpsEMail.lpszData,lpsEMail.dwSize,dwIDRequest,dwAckType,lpsString.lpszData,lpsString.dwSize,lpsAddreses.lpszData,lpsAddreses.dwSize,&mguidSessionID)==NO_ERROR) + {// set proxy info to file transfer context + MraFilesQueueStartMrimProxy(masMraSettings.hFilesQueueHandle,dwIDRequest); + } + break; + case PROXY_STATUS_ERROR: + ShowFormatedErrorMessage(L"Proxy File transfer: error",NO_ERROR); + MraFilesQueueCancel(masMraSettings.hFilesQueueHandle,dwIDRequest,FALSE); + break; + case PROXY_STATUS_INCOMPATIBLE_VERS: + ShowFormatedErrorMessage(L"Proxy File transfer: incompatible versions",NO_ERROR); + MraFilesQueueCancel(masMraSettings.hFilesQueueHandle,dwIDRequest,FALSE); + break; + case PROXY_STATUS_NOHARDWARE: + case PROXY_STATUS_MIRROR: + case PROXY_STATUS_CLOSED: + default: + DebugBreak(); + break; + } + }else{// дохлая сессия/не существующая + DebugBreak(); + } + } + + /*if (dwTemp!=2) + if ((hContact=MraHContactFromEmail(lpsEMail.lpszData,lpsEMail.dwSize,FALSE,TRUE,NULL))) + if (MraGetContactStatus(hContact)==ID_STATUS_OFFLINE) + { + MraSetContactStatus(hContact,ID_STATUS_INVISIBLE); + }*/ + + //DebugBreak(); + } + break; + case MRIM_CS_PROXY_HELLO: + // DWORD[4] Session_id + DebugBreak(); + break; + case MRIM_CS_PROXY_HELLO_ACK: + DebugBreak(); + break; + case MRIM_CS_NEW_MAIL: + { + DWORD dwDate,dwUIDL; + + dwTemp=GetUL(&lpbDataCurrent);// UL unread count + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsEMail);// LPS from + GetLPS(lpbData,dwDataSize,&lpbDataCurrent,&lpsString);// LPS subject + dwDate=GetUL(&lpbDataCurrent);// UL date + dwUIDL=GetUL(&lpbDataCurrent);// UL uidl + + if (dwTemp > masMraSettings.dwEmailMessagesTotal) masMraSettings.dwEmailMessagesTotal+=(dwTemp-masMraSettings.dwEmailMessagesUnRead); + + dwAckType=masMraSettings.dwEmailMessagesUnRead;// save old value + masMraSettings.dwEmailMessagesUnRead=dwTemp;// store new value + if (DB_Mra_GetByte(NULL,"IncrementalNewMailNotify",MRA_DEFAULT_INC_NEW_MAIL_NOTIFY)==0 || dwAckTypelpszData==NULL || plpsRFTText->dwSize==0) dwFlags&=~MESSAGE_FLAG_RTF; + }else{ + dwFlags&=~MESSAGE_FLAG_RTF; + } + } + + if (dwFlags&MESSAGE_FLAG_MULTICHAT) + { + if (plpsMultiChatData) + { + if (plpsMultiChatData->lpszData==NULL || plpsMultiChatData->dwSize==0) dwFlags&=~MESSAGE_FLAG_MULTICHAT; + }else{ + dwFlags&=~MESSAGE_FLAG_MULTICHAT; + } + } + + + // pre processing - extracting/decoding + if (dwFlags&MESSAGE_FLAG_AUTHORIZE) + {// extract auth message из обычного текста + SIZE_T dwAuthPartsCount,dwAuthBuffSize=(plpsText->dwSize+32),dwAuthDataSize; + LPBYTE lpbAuthData,lpbDataCurrent; + MRA_LPS lpsAuthFrom,lpsAuthMessage; + + lpbAuthData=(LPBYTE)MEMALLOC(dwAuthBuffSize); + if (lpbAuthData) + { + BASE64DecodeFormated(plpsText->lpszData,plpsText->dwSize,lpbAuthData,dwAuthBuffSize,&dwAuthDataSize); + + lpbDataCurrent=lpbAuthData; + dwAuthPartsCount=GetUL(&lpbDataCurrent); + if (GetLPS(lpbAuthData,dwAuthDataSize,&lpbDataCurrent,&lpsAuthFrom)==NO_ERROR) + if (GetLPS(lpbAuthData,dwAuthDataSize,&lpbDataCurrent,&lpsAuthMessage)==NO_ERROR) + { + if (dwFlags&MESSAGE_FLAG_v1p16 && (dwFlags&MESSAGE_FLAG_CP1251)==0) + {// unicode text + memmove(lpbAuthData,lpsAuthMessage.lpszData,lpsAuthMessage.dwSize); + lpwszMessage=(LPWSTR)lpbAuthData; + dwMessageSize=(lpsAuthMessage.dwSize/sizeof(WCHAR)); + }else{// преобразуем в юникод текст только если он в АНСИ и если это не Флэш мультик и будильник тоже не нуждается в этом + lpwszMessage=(LPWSTR)MEMALLOC(((lpsAuthMessage.dwSize+MAX_PATH)*sizeof(WCHAR))); + if (lpwszMessage) + { + dwMessageSize=MultiByteToWideChar(MRA_CODE_PAGE,0,lpsAuthMessage.lpszData,lpsAuthMessage.dwSize,lpwszMessage,(lpsAuthMessage.dwSize+MAX_PATH)); + (*(lpwszMessage+dwMessageSize))=0; + }else{// не удалось выделить память + dwRetErrorCode=GetLastError(); + } + } + } + if (lpwszMessage!=(LPWSTR)lpbAuthData) MEMFREE(lpbAuthData); + } + }else{ + /*// пупер затычка + if (dwFlags&MESSAGE_FLAG_v1p16 && dwFlags&MESSAGE_FLAG_CP1251) + {// и какая же кодировка у текста...мммм...бум гадать! + DebugPrintW(L"Unknown message encoding: "); + if (MemoryFindByte(0,plpsText->lpszData,(plpsText->dwSize-1),0)) + {//ооо похоже это юникод! + dwFlags&=~MESSAGE_FLAG_CP1251; + DebugPrintCRLFW(plpsText->lpwszData); + }else{// наверное анси + dwFlags&=~MESSAGE_FLAG_v1p16; + DebugPrintCRLFA(plpsText->lpszData); + } + }*/ + + if (dwFlags&(MESSAGE_FLAG_ALARM|MESSAGE_FLAG_FLASH|MESSAGE_FLAG_v1p16) && (dwFlags&MESSAGE_FLAG_CP1251)==0) + {// unicode text + lpwszMessage=plpsText->lpwszData; + dwMessageSize=(plpsText->dwSize/sizeof(WCHAR)); + }else{// преобразуем в юникод текст только если он в АНСИ и если это не Флэш мультик и будильник тоже не нуждается в этом + lpwszMessage=(LPWSTR)MEMALLOC(((plpsText->dwSize+MAX_PATH)*sizeof(WCHAR))); + if (lpwszMessage) + { + dwMessageSize=MultiByteToWideChar(MRA_CODE_PAGE,0,plpsText->lpszData,plpsText->dwSize,lpwszMessage,(plpsText->dwSize+MAX_PATH)); + (*(lpwszMessage+dwMessageSize))=0; + }else{// не удалось выделить память + dwRetErrorCode=GetLastError(); + } + } + + if (dwFlags&(MESSAGE_FLAG_CONTACT|MESSAGE_FLAG_NOTIFY|MESSAGE_FLAG_SMS|MESSAGE_SMS_DELIVERY_REPORT|MESSAGE_FLAG_ALARM)) + { + // ничего не делаем, сообщение не содержит расширенной части или её содержимое игнорируется + }else{ + if ((dwFlags&MESSAGE_FLAG_RTF) && plpsRFTText) //MESSAGE_FLAG_FLASH there + if (masMraSettings.lpfnUncompress)// only if uncompress function exist + if (plpsRFTText->lpszData && plpsRFTText->dwSize) + {// decode RTF + SIZE_T dwRTFPartsCount,dwCompressedSize,dwRFTBuffSize=((plpsRFTText->dwSize*16)+8192),dwRTFDataSize; + LPBYTE lpbRTFData,lpbCompressed,lpbDataCurrent; + MRA_LPS lpsRTFString,lpsBackColour,lpsString; + + lpbRTFData=(LPBYTE)MEMALLOC(dwRFTBuffSize); + lpbCompressed=(LPBYTE)MEMALLOC((plpsRFTText->dwSize+32)); + if (lpbRTFData && lpbCompressed) + { + BASE64DecodeFormated(plpsRFTText->lpszData,plpsRFTText->dwSize,lpbCompressed,(plpsRFTText->dwSize+32),&dwCompressedSize); + dwRTFDataSize=dwRFTBuffSize; + if ((PUNCOMPRESS(masMraSettings.lpfnUncompress))(lpbRTFData,(DWORD*)&dwRTFDataSize,lpbCompressed,dwCompressedSize)==Z_OK) + { + lpbDataCurrent=lpbRTFData; + dwRTFPartsCount=GetUL(&lpbDataCurrent);// колличество частей в некоторых случаях больше 2, тогда нужно игнорировать первый текст, тк там сообщения об ущербности + if (GetLPS(lpbRTFData,dwRTFDataSize,&lpbDataCurrent,&lpsRTFString)==NO_ERROR) + if (GetLPS(lpbRTFData,dwRTFDataSize,&lpbDataCurrent,&lpsBackColour)==NO_ERROR) + { + dwBackColour=(*(DWORD*)lpsBackColour.lpszData); + if (dwFlags&MESSAGE_FLAG_FLASH) + {// Флэш мультик в обычный текст// затирем lpwszMessage=plpsText->lpwszData, тк там затычка с текстом об ущербности + if (dwRTFPartsCount==3) + {// только анси текст с мультиком + DebugBreak();// наверное это уже не должно приходить, ну разве что от совсем старых клиентов, 2008 + GetLPS(lpbRTFData,dwRTFDataSize,&lpbDataCurrent,&lpsString); + lpwszMessage=(LPWSTR)MEMALLOC(((lpsString.dwSize+MAX_PATH)*sizeof(WCHAR))); + if (lpwszMessage) + { + memmove(lpwszMessage,lpsString.lpszData,lpsString.dwSize); + dwMessageSize=MultiByteToWideChar(MRA_CODE_PAGE,0,lpsString.lpszData,lpsString.dwSize,lpwszMessage,(lpsString.dwSize+MAX_PATH)); + (*(lpwszMessage+dwMessageSize))=0; + }else{// не удалось выделить память + dwRetErrorCode=GetLastError(); + } + }else + if (dwRTFPartsCount==4) + { + GetLPS(lpbRTFData,dwRTFDataSize,&lpbDataCurrent,&lpsString); + GetLPS(lpbRTFData,dwRTFDataSize,&lpbDataCurrent,&lpsString); + lpwszMessage=(LPWSTR)MEMALLOC(lpsString.dwSize); + if (lpwszMessage) + { + memmove(lpwszMessage,lpsString.lpszData,lpsString.dwSize); + dwMessageSize=lpsString.dwSize; + }else{// не удалось выделить память + dwRetErrorCode=GetLastError(); + } + }else{ + DebugBreak(); + } + }else{// РТФ текст + if (dwRTFPartsCount>2) + { + GetLPS(lpbRTFData,dwRTFDataSize,&lpbDataCurrent,&lpsString); + DebugBreak(); + } + + lpszMessageExt=(LPSTR)MEMALLOC(lpsRTFString.dwSize); + if (lpszMessageExt) + { + memmove(lpszMessageExt,lpsRTFString.lpszData,lpsRTFString.dwSize); + dwMessageExtSize=lpsRTFString.dwSize; + }else{// не удалось выделить память + //dwRetErrorCode=GetLastError(); // не смертельно! + DebugBreak(); + } + } + } + }else{ + MEMFREE(lpszMessageExt); + dwMessageExtSize=0; + DebugBreak(); + } + } + MEMFREE(lpbCompressed); + MEMFREE(lpbRTFData); + } + } + } + + + // processing + if (dwRetErrorCode==NO_ERROR) + if (MraAntiSpamReceivedMessageW(plpsFrom->lpszData,plpsFrom->dwSize,dwFlags,lpwszMessage,dwMessageSize)==MESSAGE_NOT_SPAM) + { + if (dwFlags&(MESSAGE_FLAG_SMS|MESSAGE_SMS_DELIVERY_REPORT)) + {// SMS //if (IsPhone(plpsFrom->lpszData,plpsFrom->dwSize)) + char szPhone[MAX_EMAIL_LEN],szEMail[MAX_EMAIL_LEN],szTime[MAX_PATH]; + LPSTR lpszMessageUTF,lpszBuff; + LPWSTR lpwszMessageXMLEncoded; + SIZE_T dwBuffLen,dwMessageXMLEncodedSize; + INTERNET_TIME itTime; + + dwBuffLen=((dwMessageSize+MAX_PATH)*6); + lpszMessageUTF=(LPSTR)MEMALLOC(dwBuffLen); + lpwszMessageXMLEncoded=(LPWSTR)MEMALLOC((dwBuffLen*sizeof(WCHAR))); + if (lpszMessageUTF && lpwszMessageXMLEncoded) + { + InternetTimeGetCurrentTime(&itTime); + InternetTimeGetString(&itTime,szTime,SIZEOF(szTime),NULL); + CopyNumber(szPhone,plpsFrom->lpszData,plpsFrom->dwSize); + DB_Mra_GetStaticStringA(NULL,"e-mail",szEMail,SIZEOF(szEMail),NULL); + + EncodeXML(lpwszMessage,dwMessageSize,lpwszMessageXMLEncoded,dwBuffLen,&dwMessageXMLEncodedSize); + WideCharToMultiByte(CP_UTF8,0,lpwszMessageXMLEncoded,dwMessageXMLEncodedSize,lpszMessageUTF,dwBuffLen,NULL,NULL); + lpszBuff=(LPSTR)lpwszMessageXMLEncoded; + + if (dwFlags&MESSAGE_SMS_DELIVERY_REPORT) + {// отчёт о неудаче доставки смс + dwBuffLen=mir_snprintf(lpszBuff,(dwBuffLen*sizeof(WCHAR)),"%s-1-1955988055-%s%sNo%s015%s",szEMail,szPhone,szPhone,szTime,lpszMessageUTF); + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,NULL,ICQACKTYPE_SMS,ACKRESULT_FAILED,(HANDLE)0,(LPARAM)lpszBuff,dwBuffLen); + }else{// новое смс!!! + dwBuffLen=mir_snprintf(lpszBuff,(dwBuffLen*sizeof(WCHAR)),"Mail.ru%s%sMail.ru%s",szEMail,szPhone,lpszMessageUTF,szTime); + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,NULL,ICQACKTYPE_SMS,ACKRESULT_SUCCESS,(HANDLE)0,(LPARAM)lpszBuff,dwBuffLen); + } + }else{// не удалось выделить память + dwRetErrorCode=GetLastError(); + } + MEMFREE(lpwszMessageXMLEncoded); + MEMFREE(lpszMessageUTF); + }else{ + ccs.hContact=MraHContactFromEmail(plpsFrom->lpszData,plpsFrom->dwSize,TRUE,TRUE,&bAdded); + if (bAdded) MraUpdateContactInfo(ccs.hContact); + + if (dwFlags&MESSAGE_FLAG_NOTIFY) + {// user typing + CallService(MS_PROTO_CONTACTISTYPING,(WPARAM)ccs.hContact,MAILRU_CONTACTISTYPING_TIMEOUT); + }else{// text/contact/auth // typing OFF + CallService(MS_PROTO_CONTACTISTYPING,(WPARAM)ccs.hContact,PROTOTYPE_CONTACTTYPING_OFF); + + if (dwFlags&MESSAGE_FLAG_MULTICHAT) + {// MULTICHAT + LPBYTE lpbMultiChatData,lpbDataCurrent; + SIZE_T dwMultiChatDataSize; + DWORD dwMultiChatEventType; + MRA_LPS lpsEMailInMultiChat,lpsString,lpsMultichatName; + + lpbMultiChatData=(LPBYTE)plpsMultiChatData->lpszData; + dwMultiChatDataSize=plpsMultiChatData->dwSize; + lpbDataCurrent=lpbMultiChatData; + + dwMultiChatEventType=GetUL(&lpbDataCurrent);// type + GetLPS(lpbMultiChatData,dwMultiChatDataSize,&lpbDataCurrent,&lpsMultichatName);// multichat_name + GetLPS(lpbMultiChatData,dwMultiChatDataSize,&lpbDataCurrent,&lpsEMailInMultiChat); + + switch(dwMultiChatEventType){ + case MULTICHAT_MESSAGE: + MraChatSessionMessageAdd(ccs.hContact,lpsEMailInMultiChat.lpszData,lpsEMailInMultiChat.dwSize,lpwszMessage,dwMessageSize,dwTime);// LPS sender + break; + case MULTICHAT_ADD_MEMBERS: + MraChatSessionMembersAdd(ccs.hContact,lpsEMailInMultiChat.lpszData,lpsEMailInMultiChat.dwSize,dwTime);// LPS sender + GetLPS(lpbMultiChatData,dwMultiChatDataSize,&lpbDataCurrent,&lpsString);// CLPS members + MraChatSessionSetIviter(ccs.hContact,lpsEMailInMultiChat.lpszData,lpsEMailInMultiChat.dwSize); + case MULTICHAT_MEMBERS: + { + LPBYTE lpbMultiChatDataLocal,lpbDataCurrentLocal; + SIZE_T i,dwMultiChatMembersCount,dwMultiChatDataLocalSize; + + if (dwMultiChatEventType==MULTICHAT_MEMBERS) lpsString=lpsEMailInMultiChat; + + lpbMultiChatDataLocal=(LPBYTE)lpsString.lpszData; + dwMultiChatDataLocalSize=lpsString.dwSize; + lpbDataCurrentLocal=lpbMultiChatDataLocal; + + dwMultiChatMembersCount=GetUL(&lpbDataCurrentLocal);// count + for (i=0;ilpszData,plpsFrom->dwSize,lpsMultichatName.lpwszData,(lpsMultichatName.dwSize/sizeof(WCHAR)),NULL,0,NULL,0,0); + break; + default: + DebugBreak(); + break; + } + }else + if (dwFlags&MESSAGE_FLAG_AUTHORIZE) + {// auth request + BYTE btBuff[BUFF_SIZE_BLOB]; + BOOL bAutoGrandAuth=FALSE; + + if (IsEMailChatAgent(plpsFrom->lpszData,plpsFrom->dwSize)) + { + bAutoGrandAuth=FALSE; + }else{ + if (DBGetContactSettingByte(ccs.hContact,"CList","NotOnList",0)) + {// временный контакт + if (DB_Mra_GetByte(NULL,"AutoAuthGrandNewUsers",MRA_DEFAULT_AUTO_AUTH_GRAND_NEW_USERS)) bAutoGrandAuth=TRUE; + }else{// постоянный контакт + if (DB_Mra_GetByte(NULL,"AutoAuthGrandUsersInCList",MRA_DEFAULT_AUTO_AUTH_GRAND_IN_CLIST)) bAutoGrandAuth=TRUE; + } + } + + if (bAdded) DBWriteContactSettingByte(ccs.hContact,"CList","Hidden",1); + if (bAutoGrandAuth) + {// auto grand auth + DBEVENTINFO dbei={0}; + + dbei.cbSize=sizeof(dbei); + dbei.szModule=PROTOCOL_NAMEA; + dbei.timestamp=_time32(NULL); + dbei.flags=DBEF_READ; + dbei.eventType=EVENTTYPE_AUTHREQUEST; + dbei.pBlob=(PBYTE)btBuff; + + CreateBlobFromContact(ccs.hContact,lpwszMessage,dwMessageSize,btBuff,SIZEOF(btBuff),(SIZE_T*)&dbei.cbBlob); + CallService(MS_DB_EVENT_ADD,(WPARAM)NULL,(LPARAM)&dbei); + MraSendCommand_Authorize(plpsFrom->lpszData,plpsFrom->dwSize); + }else{ + ccs.szProtoService=PSR_AUTH; + pre.szMessage=(LPSTR)btBuff; + CreateBlobFromContact(ccs.hContact,lpwszMessage,dwMessageSize,btBuff,SIZEOF(btBuff),(SIZE_T*)&pre.lParam); + CallService(MS_PROTO_CHAINRECV,0,(LPARAM)&ccs); + } + }else{ + DBDeleteContactSetting(ccs.hContact,"CList","Hidden"); + + if (dwFlags&MESSAGE_FLAG_CONTACT) + {// contacts received + LPBYTE lpbBuffer,lpbBufferCurPos; + + lpbBuffer=(LPBYTE)MEMALLOC((dwMessageSize+MAX_PATH)); + if (lpbBuffer) + { + ccs.szProtoService=PSR_CONTACTS; + pre.flags=0; + pre.szMessage=(LPSTR)lpbBuffer; + pre.lParam=WideCharToMultiByte(MRA_CODE_PAGE,0,lpwszMessage,dwMessageSize,(LPSTR)lpbBuffer,(dwMessageSize+MAX_PATH),NULL,NULL); + + lpbBufferCurPos=lpbBuffer; + while(TRUE) + {// цикл замены ; на 0 + lpbBufferCurPos=(LPBYTE)MemoryFindByte((lpbBufferCurPos-lpbBuffer),lpbBuffer,pre.lParam,';'); + if (lpbBufferCurPos) + {// founded + (*lpbBufferCurPos)=0; + lpbBufferCurPos++; + }else{ + break; + } + } + CallService(MS_PROTO_CHAINRECV,0,(LPARAM)&ccs); + MEMFREE(lpbBuffer); + }else{// не удалось выделить память + dwRetErrorCode=GetLastError(); + } + }else + if (dwFlags&MESSAGE_FLAG_ALARM) + {// alarm + if (masMraSettings.heNudgeReceived) + { + NotifyEventHooks(masMraSettings.heNudgeReceived,(WPARAM)ccs.hContact,NULL); + }else{ + pre.flags=0; + pre.szMessage=(LPSTR)Translate(MRA_ALARM_MESSAGE); + //pre.lParam=lstrlenA(pre.szMessage); + ccs.szProtoService=PSR_MESSAGE; + CallService(MS_PROTO_CHAINRECV,0,(LPARAM)&ccs); + } + }else{// standart message// flash animation + if ((dwFlags&MESSAGE_FLAG_RTF) && (dwFlags&MESSAGE_FLAG_FLASH)==0 && lpszMessageExt && dwMessageExtSize && DB_Mra_GetByte(NULL,"RTFReceiveEnable",MRA_DEFAULT_RTF_RECEIVE_ENABLE)) + {// пишем в ANSI, всё равно RTF + pre.flags=0; + pre.szMessage=lpszMessageExt; + //pre.lParam=dwMessageExtSize; + ccs.szProtoService=PSR_MESSAGE; + CallService(MS_PROTO_CHAINRECV,0,(LPARAM)&ccs); + }else{ + LPSTR lpszMessageUTF;// some plugins can change pre.szMessage pointer and we failed to free it + + lpszMessageUTF=(LPSTR)MEMALLOC(((dwMessageSize+MAX_PATH)*sizeof(WCHAR))); + if (lpszMessageUTF) + { + pre.szMessage=lpszMessageUTF; + pre.flags=PREF_UTF; + //pre.lParam= + WideCharToMultiByte(CP_UTF8,0,lpwszMessage,dwMessageSize,lpszMessageUTF,((dwMessageSize+MAX_PATH)*sizeof(WCHAR)),NULL,NULL); + ccs.szProtoService=PSR_MESSAGE; + CallService(MS_PROTO_CHAINRECV,0,(LPARAM)&ccs); + MEMFREE(lpszMessageUTF); + }else{// не удалось выделить память + dwRetErrorCode=GetLastError(); + } + } + if (dwFlags&MESSAGE_FLAG_SYSTEM) + { + MraPopupShowW(ccs.hContact,MRA_POPUP_TYPE_INFORMATION,0,TranslateW(L"Mail.ru System notify"),(LPWSTR)pre.szMessage); + } + } + } + } + } + }else{// spam blocked + if (DB_Mra_GetByte(NULL,"AntiSpamSendSpamReportToSrv",MRA_ANTISPAM_DEFAULT_SEND_SPAM_REPORT_TO_SERVER)) + {// рапортуем о спаме + //MraSendCommand_MessageAskW(1,(dwFlags|MESSAGE_FLAG_SPAMF_SPAM),plpsFrom->lpszData,plpsFrom->dwSize,plpsText->lpwszData,plpsText->dwSize,plpsRFTText->lpszData,plpsRFTText->dwSize); + } + dwRetErrorCode=ERROR_ACCESS_DENIED; + } + + if (lpwszMessage!=plpsText->lpwszData && lpwszMessage!=(LPWSTR)lpszMessageExt) MEMFREE(lpwszMessage); + MEMFREE(lpszMessageExt); + +return(dwRetErrorCode); +} + + + + + +DWORD GetMraXStatusIDFromMraUriStatus(LPSTR lpszStatusUri,SIZE_T dwStatusUriSize) +{ + DWORD dwRet=MRA_XSTATUS_UNKNOWN; + + if (lpszStatusUri) + { + for(SIZE_T i=0;lpcszStatusUri[i];i++) + { + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpcszStatusUri[i],-1,lpszStatusUri,dwStatusUriSize)==CSTR_EQUAL) + { + dwRet=i; + break; + } + } + } +return(dwRet); +} + + +DWORD GetMraStatusFromMiradaStatus(DWORD dwMirandaStatus,DWORD dwXStatusMir,DWORD *pdwXStatusMra) +{ + DWORD dwRet; + + if (IsXStatusValid(dwXStatusMir)) + { + if (pdwXStatusMra) (*pdwXStatusMra)=(dwXStatusMir+MRA_XSTATUS_INDEX_OFFSET-1); + dwRet=STATUS_USER_DEFINED; + }else{ + switch(dwMirandaStatus){ + case ID_STATUS_OFFLINE: + if (pdwXStatusMra) (*pdwXStatusMra)=MRA_XSTATUS_OFFLINE; + dwRet=STATUS_OFFLINE; + break; + case ID_STATUS_ONLINE: + if (pdwXStatusMra) (*pdwXStatusMra)=MRA_XSTATUS_ONLINE; + dwRet=STATUS_ONLINE; + break; + case ID_STATUS_AWAY: + case ID_STATUS_NA: + case ID_STATUS_ONTHEPHONE: + case ID_STATUS_OUTTOLUNCH: + if (pdwXStatusMra) (*pdwXStatusMra)=MRA_XSTATUS_AWAY; + dwRet=STATUS_AWAY; + break; + case ID_STATUS_DND: + case ID_STATUS_OCCUPIED: + if (pdwXStatusMra) (*pdwXStatusMra)=MRA_XSTATUS_DND; + dwRet=STATUS_USER_DEFINED; + break; + case ID_STATUS_FREECHAT: + if (pdwXStatusMra) (*pdwXStatusMra)=MRA_XSTATUS_CHAT; + dwRet=STATUS_USER_DEFINED; + break; + case ID_STATUS_INVISIBLE: + if (pdwXStatusMra) (*pdwXStatusMra)=MRA_XSTATUS_INVISIBLE; + dwRet=(STATUS_ONLINE|STATUS_FLAG_INVISIBLE); + break; + default: + if (pdwXStatusMra) (*pdwXStatusMra)=MRA_XSTATUS_OFFLINE; + dwRet=STATUS_OFFLINE; + break; + } + } +return(dwRet); +} + + +DWORD GetMiradaStatusFromMraStatus(DWORD dwMraStatus,DWORD dwXStatusMra,DWORD *pdwXStatusMir) +{ + DWORD dwRet; + + if (pdwXStatusMir) (*pdwXStatusMir)=0; + + switch(dwMraStatus){ + case STATUS_OFFLINE: + dwRet=ID_STATUS_OFFLINE; + break; + case STATUS_ONLINE: + dwRet=ID_STATUS_ONLINE; + break; + case STATUS_AWAY: + dwRet=ID_STATUS_AWAY; + break; + case STATUS_UNDETERMINATED: + dwRet=ID_STATUS_OFFLINE; + break; + case STATUS_USER_DEFINED: + switch(dwXStatusMra){ + //case MRA_XSTATUS_OFFLINE: dwRet=ID_STATUS_OFFLINE; break; + //case MRA_XSTATUS_ONLINE: dwRet=ID_STATUS_ONLINE; break; + //case MRA_XSTATUS_AWAY: dwRet=ID_STATUS_AWAY; break; + //case MRA_XSTATUS_INVISIBLE: dwRet=ID_STATUS_INVISIBLE; break; + case MRA_XSTATUS_DND: dwRet=ID_STATUS_DND; break; + case MRA_XSTATUS_CHAT: dwRet=ID_STATUS_FREECHAT; break; + case MRA_XSTATUS_UNKNOWN: + if (pdwXStatusMir) (*pdwXStatusMir)=MRA_MIR_XSTATUS_UNKNOWN; + dwRet=ID_STATUS_ONLINE; + break; + default: + if (pdwXStatusMir) (*pdwXStatusMir)=(dwXStatusMra-MRA_XSTATUS_INDEX_OFFSET+1); + dwRet=ID_STATUS_ONLINE; + break; + } + break; + default:// STATUS_FLAG_INVISIBLE + if (dwMraStatus&STATUS_FLAG_INVISIBLE) + { + dwRet=ID_STATUS_INVISIBLE; + }else{ + dwRet=ID_STATUS_OFFLINE; + DebugBreak(); + } + break; + } +return(dwRet); +} + + +DWORD GetUL(LPBYTE *plpData) +{ + DWORD dwRet=(*(DWORD*)(*plpData)); + (*plpData)+=sizeof(DWORD); +return(dwRet); +} + + +DWORDLONG GetUIDL(LPBYTE *plpData) +{ + DWORDLONG dwRet=(*(DWORDLONG*)(*plpData)); + (*plpData)+=sizeof(DWORDLONG); +return(dwRet); +} + + +MRA_GUID GetGUID(LPBYTE *plpData) +{ + MRA_GUID guidRet=(*(MRA_GUID*)(*plpData)); + (*plpData)+=sizeof(MRA_GUID); +return(guidRet); +} + + +DWORD GetLPS(LPBYTE lpbData,DWORD dwDataSize,LPBYTE *plpCurrentData,MRA_LPS *plpsString) +{ + DWORD dwRetErrorCode; + LPBYTE lpbDataEnd=(lpbData+dwDataSize); + + if (lpbDataEnd>=((*plpCurrentData)+sizeof(DWORD))) + {// хотябы длинна данных есть + if (lpbDataEnd>=((*plpCurrentData)+sizeof(DWORD)+(*(DWORD*)(*plpCurrentData)))) + {// все длинна данных в буфере равна или меньше размера буфера + plpsString->dwSize=(*(DWORD*)(*plpCurrentData)); + plpsString->lpszData=(LPSTR)((*plpCurrentData)+sizeof(DWORD)); + (*plpCurrentData)+=(sizeof(DWORD)+plpsString->dwSize); + dwRetErrorCode=NO_ERROR; + }else{ + plpsString->dwSize=0; + plpsString->lpszData=NULL; + dwRetErrorCode=ERROR_INVALID_USER_BUFFER; + } + }else{ + plpsString->dwSize=0; + plpsString->lpszData=NULL; + dwRetErrorCode=ERROR_INVALID_USER_BUFFER; + } +return(dwRetErrorCode); +} + + diff --git a/MRA/Mra_svcs.cpp b/MRA/Mra_svcs.cpp new file mode 100644 index 0000000..55621e4 --- /dev/null +++ b/MRA/Mra_svcs.cpp @@ -0,0 +1,2302 @@ +#include "Mra.h" +#include "proto.h" + + + + + +INT_PTR MraXStatusMenu (WPARAM wParam,LPARAM lParam,LPARAM param); + +int MraContactDeleted (WPARAM wParam,LPARAM lParam); +int MraDbSettingChanged (WPARAM wParam,LPARAM lParam); +int MraRebuildContactMenu (WPARAM wParam,LPARAM lParam); +int MraExtraIconsApply (WPARAM wParam,LPARAM lParam); +int MraExtraIconsRebuild (WPARAM wParam,LPARAM lParam); +int MraRebuildStatusMenu (WPARAM wParam,LPARAM lParam); +int MraMusicChanged (WPARAM wParam,LPARAM lParam); + +DWORD MraSendNewStatus (DWORD dwStatusMir,DWORD dwXStatusMir,LPWSTR lpwszStatusTitle,SIZE_T dwStatusTitleSize,LPWSTR lpwszStatusDesc,SIZE_T dwStatusDescSize); + + +HANDLE AddToListByEmail (MRA_LPS *plpsEMail,MRA_LPS *plpsNick,MRA_LPS *plpsFirstName,MRA_LPS *plpsLastName,DWORD dwFlags); + + + +INT_PTR LoadServices(void) +{ + CHAR szServiceFunction[MAX_PATH],*pszServiceFunctionName; + + memmove(szServiceFunction,PROTOCOL_NAMEA,PROTOCOL_NAME_SIZE); + pszServiceFunctionName=szServiceFunction+PROTOCOL_NAME_LEN; + + // Service creation + for (SIZE_T i=0;iszModule,-1,"CList",5)==CSTR_EQUAL) + {// CList section + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,cws->szSetting,-1,"MyHandle",8)==CSTR_EQUAL) + {// MyHandle setting + LPWSTR lpwszNewNick; + + if (cws->value.type==DBVT_DELETED) + {// allways store custom nick + lstrcpynW(wszNick,GetContactNameW(hContact),SIZEOF(wszNick)); + lpwszNewNick=wszNick; + dwNickSize=lstrlenW(lpwszNewNick); + DB_SetStringExW(hContact,"CList","MyHandle",lpwszNewNick,dwNickSize); + }else{ + if (cws->value.pszVal) + { + switch(cws->value.type){ + case DBVT_WCHAR: + lpwszNewNick=cws->value.pwszVal; + dwNickSize=lstrlenW(lpwszNewNick); + break; + case DBVT_UTF8: + lpwszNewNick=wszNick; + dwNickSize=MultiByteToWideChar(CP_UTF8,0,cws->value.pszVal,-1,wszNick,SIZEOF(wszNick)); + break; + case DBVT_ASCIIZ: + lpwszNewNick=wszNick; + dwNickSize=MultiByteToWideChar(MRA_CODE_PAGE,0,cws->value.pszVal,-1,wszNick,SIZEOF(wszNick)); + break; + default: + lpwszNewNick=NULL; + dwNickSize=0; + break; + } + if (lpwszNewNick) + if (GetContactBasicInfoW(hContact,&dwID,&dwGroupID,&dwContactFlag,NULL,NULL,szEMail,SIZEOF(szEMail),&dwEMailSize,NULL,0,NULL,szPhones,SIZEOF(szPhones),&dwPhonesSize)==NO_ERROR) + { + MraSendCommand_ModifyContactW(hContact,dwID,dwContactFlag,dwGroupID,szEMail,dwEMailSize,lpwszNewNick,dwNickSize,szPhones,dwPhonesSize); + } + } + } + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,cws->szSetting,-1,"Group",5)==CSTR_EQUAL) + {// Group setting //***deb + if (TRUE) + {// manage group on server + switch(cws->value.type){ + case DBVT_ASCIIZ: + + break; + case DBVT_DELETED: + + break; + } + } + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,cws->szSetting,-1,"NotOnList",9)==CSTR_EQUAL) + {// NotOnList setting // Has a temporary contact just been added permanently? + if (cws->value.type==DBVT_DELETED || (cws->value.type==DBVT_BYTE && cws->value.bVal==0)) + { + WCHAR wszAuthMessage[MAX_PATH]; + SIZE_T dwAuthMessageSize; + + if (DB_Mra_GetStaticStringW(NULL,"AuthMessage",wszAuthMessage,SIZEOF(wszAuthMessage),&dwAuthMessageSize)==FALSE) + {// def auth message + lstrcpynW(wszAuthMessage,TranslateW(MRA_DEFAULT_AUTH_MESSAGE),SIZEOF(wszAuthMessage)); + dwAuthMessageSize=lstrlenW(wszAuthMessage); + } + + DBDeleteContactSetting(hContact,"CList","Hidden"); + GetContactBasicInfoW(hContact,NULL,&dwGroupID,&dwContactFlag,NULL,NULL,szEMail,SIZEOF(szEMail),&dwEMailSize,wszNick,SIZEOF(wszNick),&dwNickSize,szPhones,SIZEOF(szPhones),&dwPhonesSize); + MraSendCommand_AddContactW(hContact,dwContactFlag,dwGroupID,szEMail,dwEMailSize,wszNick,dwNickSize,szPhones,dwPhonesSize,wszAuthMessage,dwAuthMessageSize,0); + } + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,cws->szSetting,-1,"Hidden",6)==CSTR_EQUAL) + {// Hidden setting + GetContactBasicInfoW(hContact,&dwID,&dwGroupID,&dwContactFlag,NULL,NULL,szEMail,SIZEOF(szEMail),&dwEMailSize,wszNick,SIZEOF(wszNick),&dwNickSize,szPhones,SIZEOF(szPhones),&dwPhonesSize); + if(cws->value.type==DBVT_DELETED || (cws->value.type==DBVT_BYTE && cws->value.bVal==0)) + { + dwContactFlag&=~CONTACT_FLAG_SHADOW; + }else{ + dwContactFlag|=CONTACT_FLAG_SHADOW; + } + MraSendCommand_ModifyContactW(hContact,dwID,dwContactFlag,dwGroupID,szEMail,dwEMailSize,wszNick,dwNickSize,szPhones,dwPhonesSize); + } + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,cws->szModule,-1,"Ignore",6)==CSTR_EQUAL) + {// Ignore section + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,cws->szSetting,-1,"Mask1",5)==CSTR_EQUAL) + { + GetContactBasicInfoW(hContact,&dwID,&dwGroupID,&dwContactFlag,NULL,NULL,szEMail,SIZEOF(szEMail),&dwEMailSize,wszNick,SIZEOF(wszNick),&dwNickSize,szPhones,SIZEOF(szPhones),&dwPhonesSize); + if(cws->value.type==DBVT_DELETED || (cws->value.type==DBVT_DWORD && cws->value.dVal&IGNOREEVENT_MESSAGE)==0) + { + dwContactFlag&=~CONTACT_FLAG_IGNORE; + }else{ + dwContactFlag|=CONTACT_FLAG_IGNORE; + } + MraSendCommand_ModifyContactW(hContact,dwID,dwContactFlag,dwGroupID,szEMail,dwEMailSize,wszNick,dwNickSize,szPhones,dwPhonesSize); + } + }else + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,cws->szModule,-1,"UserInfo",8)==CSTR_EQUAL) + {// User info section + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,cws->szSetting,-1,"MyPhone0",8)==CSTR_EQUAL + || CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,cws->szSetting,-1,"MyPhone1",8)==CSTR_EQUAL + || CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,cws->szSetting,-1,"MyPhone2",8)==CSTR_EQUAL) + { + //if(cws->value.type!=DBVT_DELETED) + { + GetContactBasicInfoW(hContact,&dwID,&dwGroupID,&dwContactFlag,NULL,NULL,szEMail,SIZEOF(szEMail),&dwEMailSize,wszNick,SIZEOF(wszNick),&dwNickSize,szPhones,SIZEOF(szPhones),&dwPhonesSize); + MraSendCommand_ModifyContactW(hContact,dwID,dwContactFlag,dwGroupID,szEMail,dwEMailSize,wszNick,dwNickSize,szPhones,dwPhonesSize); + } + } + } + } + }else{// not contact + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,cws->szModule,-1,"CListGroups",11)==CSTR_EQUAL) + {// CList section //***deb + if (TRUE) + {// manage group on server + switch(cws->value.type){ + case DBVT_ASCIIZ: + + break; + case DBVT_DELETED: + + break; + } + } + } + } + + + /*if ( hContact == NULL && MyOptions.ManageServer && !strcmp( cws->szModule, "CListGroups" )) { + int iNumber = atol( cws->szSetting ); + LPCSTR szId = MSN_GetGroupByNumber( iNumber ); + if ( szId != NULL ) { + if ( cws->value.type == DBVT_DELETED ) { + msnNsThread->sendPacket( "RMG", szId ); + } + else if ( cws->value.type == DBVT_ASCIIZ ) { + LPCSTR oldId = MSN_GetGroupByName( cws->value.pszVal+1 ); + if ( oldId == NULL ) { + CHAR* p = Utf8Encode( cws->value.pszVal+1 ), szNewName[ 200 ]; + UrlEncode( p, szNewName, sizeof szNewName ); + msnNsThread->sendPacket( "REG", "%s %s", szId, szNewName ); + free( p ); + } + else MSN_SetGroupNumber( oldId, iNumber ); + } } + else if ( cws->value.type == DBVT_ASCIIZ ) + MSN_AddServerGroup( cws->value.pszVal+1 ); + + return 0; + } + + if ( !strcmp( cws->szModule, "CList" ) && MyOptions.ManageServer ) { + CHAR* szProto = ( CHAR* )MSN_CallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM ) hContact, 0 ); + if ( szProto == NULL || strcmp( szProto, msnProtocolName )) + return 0; + + if ( !strcmp( cws->szSetting, "Group" )) { + if ( cws->value.type == DBVT_DELETED ) + MSN_MoveContactToGroup( hContact, NULL ); + else if ( cws->value.type == DBVT_ASCIIZ ) { + LPCSTR p = MSN_GetGroupByName( cws->value.pszVal ); + if ( p == NULL ) + MSN_AddServerGroup( cws->value.pszVal ); + + MSN_MoveContactToGroup( hContact, cws->value.pszVal ); + } + return 0; + } + + } }*/ + + } +return(0); +} + + +int MraRebuildContactMenu(WPARAM wParam,LPARAM lParam) +{ + BOOL bIsContactMRA,bHasEMail,bHasEMailMR,bChatAgent; + DWORD dwContactSeverFlags=0; + SIZE_T dwBlogStatusMsgSize=0; + HANDLE hContact=(HANDLE)wParam; + + bIsContactMRA=IsContactMra(hContact); + if (bIsContactMRA)//**deb телефонные контакты! + {// proto own contact + bHasEMail=TRUE; + bHasEMailMR=TRUE; + bChatAgent=IsContactChatAgent(hContact); + GetContactBasicInfoW(hContact,NULL,NULL,NULL,&dwContactSeverFlags,NULL,NULL,0,NULL,NULL,0,NULL,NULL,0,NULL); + DB_Mra_GetStaticStringW(hContact,DBSETTING_BLOGSTATUS,NULL,0,&dwBlogStatusMsgSize); + }else{// non proto contact + bHasEMail=FALSE; + bHasEMailMR=FALSE; + bChatAgent=FALSE; + if (DB_Mra_GetByte(NULL,"HideMenuItemsForNonMRAContacts",MRA_DEFAULT_HIDE_MENU_ITEMS_FOR_NON_MRA)==FALSE) + if (IsContactMraProto(hContact)==FALSE)// избегаем добавления менюшек в контакты других копий MRA + if (GetContactEMailCount(hContact,FALSE)) + { + bHasEMail=TRUE; + if (GetContactEMailCount(hContact,TRUE)) bHasEMailMR=TRUE; + } + } + + //"Request authorization" + CListShowMenuItem(masMraSettings.hContactMenuItems[0],(masMraSettings.bLoggedIn && bIsContactMRA));// && (dwContactSeverFlags&CONTACT_INTFLAG_NOT_AUTHORIZED) + + //"Grant authorization" + CListShowMenuItem(masMraSettings.hContactMenuItems[1],(masMraSettings.bLoggedIn && bIsContactMRA && bChatAgent==FALSE)); + + //"&Send postcard" + CListShowMenuItem(masMraSettings.hContactMenuItems[2],(masMraSettings.bLoggedIn && bHasEMail && bChatAgent==FALSE)); + + //"&View Album" + CListShowMenuItem(masMraSettings.hContactMenuItems[3],(masMraSettings.bLoggedIn && bHasEMailMR && bChatAgent==FALSE)); + + //"&Read Blog" + CListShowMenuItem(masMraSettings.hContactMenuItems[4],(masMraSettings.bLoggedIn && bHasEMailMR && bChatAgent==FALSE)); + + //"Reply Blog Status" + CListShowMenuItem(masMraSettings.hContactMenuItems[5],(masMraSettings.bLoggedIn && dwBlogStatusMsgSize && bChatAgent==FALSE)); + + //"View Video" + CListShowMenuItem(masMraSettings.hContactMenuItems[6],(masMraSettings.bLoggedIn && bHasEMailMR && bChatAgent==FALSE)); + + //"Answers" + CListShowMenuItem(masMraSettings.hContactMenuItems[7],(masMraSettings.bLoggedIn && bHasEMailMR && bChatAgent==FALSE)); + + //"World" + CListShowMenuItem(masMraSettings.hContactMenuItems[8],(masMraSettings.bLoggedIn && bHasEMailMR && bChatAgent==FALSE)); + + //"Send &Nudge" + if (masMraSettings.heNudgeReceived==NULL) + { + CListShowMenuItem(masMraSettings.hContactMenuItems[9],(masMraSettings.bLoggedIn && bIsContactMRA)); + } + +return(0); +} + + +int MraExtraIconsApply(WPARAM wParam,LPARAM lParam) +{ + SetExtraIcons((HANDLE)wParam); +return(0); +} + + +int MraExtraIconsRebuild(WPARAM wParam,LPARAM lParam) +{ + for(SIZE_T i=0;icbSize != sizeof(LISTENINGTOINFO) ) + { + MraSendCommand_ChangeUserBlogStatus(MRIM_BLOG_STATUS_MUSIC,NULL,0,0); + DB_Mra_DeleteValue(NULL,DBSETTING_BLOGSTATUSMUSIC); + }else + if (pliInfo->dwFlags & LTI_UNICODE) + { + LPWSTR pwszListeningTo; + WCHAR wszListeningTo[MICBLOG_STATUS_MAX+4]; + SIZE_T dwListeningToSize; + + if (ServiceExists(MS_LISTENINGTO_GETPARSEDTEXT)) + { + pwszListeningTo=(LPWSTR)CallService(MS_LISTENINGTO_GETPARSEDTEXT,(WPARAM)L"%track%. %title% - %artist% - %player%",(LPARAM)pliInfo); + dwListeningToSize=lstrlenW(pwszListeningTo); + }else{ + pwszListeningTo=wszListeningTo; + dwListeningToSize=mir_sntprintf(pwszListeningTo,SIZEOF(wszListeningTo),L"%s. %s - %s - %s", pliInfo->ptszTrack?pliInfo->ptszTrack:L"", pliInfo->ptszTitle?pliInfo->ptszTitle:L"", pliInfo->ptszArtist?pliInfo->ptszArtist:L"", pliInfo->ptszPlayer?pliInfo->ptszPlayer:L""); + } + + DB_Mra_SetStringExW(NULL,DBSETTING_BLOGSTATUSMUSIC,pwszListeningTo,dwListeningToSize); + MraSendCommand_ChangeUserBlogStatus(MRIM_BLOG_STATUS_MUSIC,pwszListeningTo,dwListeningToSize,0); + + if (pwszListeningTo!=wszListeningTo) mir_free(pwszListeningTo); + } + +return(0); +} + + +int MraMusicChanged(WPARAM wParam,LPARAM lParam) +{ + switch (wParam){ + case WAT_EVENT_PLAYERSTATUS: + if (1==lParam) + {// stopped + DB_Mra_DeleteValue(NULL,DBSETTING_BLOGSTATUSMUSIC); + MraSendCommand_ChangeUserBlogStatus(MRIM_BLOG_STATUS_MUSIC,NULL,0,0); + } + break; + case WAT_EVENT_NEWTRACK: + { + SONGINFO *psiSongInfo; + + if (WAT_RES_OK==CallService(MS_WAT_GETMUSICINFO,WAT_INF_UNICODE,(LPARAM)&psiSongInfo)) + { + WCHAR wszMusic[MICBLOG_STATUS_MAX+4]; + SIZE_T dwMusicSize; + + dwMusicSize=mir_sntprintf(wszMusic,SIZEOF(wszMusic),L"%ld. %s - %s - %s",psiSongInfo->track,psiSongInfo->artist,psiSongInfo->title,psiSongInfo->player); + DB_Mra_SetStringExW(NULL,DBSETTING_BLOGSTATUSMUSIC,wszMusic,dwMusicSize); + MraSendCommand_ChangeUserBlogStatus(MRIM_BLOG_STATUS_MUSIC,wszMusic,dwMusicSize,0); + } + } + break; + default: + break; + } + +return(0); +} + + +INT_PTR MraGetCaps(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet; + + switch(wParam){ + case PFLAGNUM_1: + iRet=PF1_IM|PF1_FILE|PF1_MODEMSG|PF1_SERVERCLIST|PF1_AUTHREQ|PF1_ADDED|PF1_VISLIST|PF1_INVISLIST|PF1_INDIVSTATUS|PF1_PEER2PEER|/*PF1_NEWUSER|*/PF1_CHAT|PF1_BASICSEARCH|PF1_EXTSEARCH|PF1_CANRENAMEFILE|PF1_FILERESUME|PF1_ADDSEARCHRES|PF1_CONTACT|PF1_SEARCHBYEMAIL|PF1_USERIDISEMAIL|PF1_SEARCHBYNAME|PF1_EXTSEARCHUI; + break; + case PFLAGNUM_2: + iRet=PF2_ONLINE|PF2_INVISIBLE|PF2_SHORTAWAY|PF2_HEAVYDND|PF2_FREECHAT; + break; + case PFLAGNUM_3: + iRet=PF2_ONLINE|PF2_INVISIBLE|PF2_SHORTAWAY|PF2_HEAVYDND|PF2_FREECHAT; + break; + case PFLAGNUM_4: + iRet=PF4_FORCEAUTH|PF4_FORCEADDED|/*PF4_NOCUSTOMAUTH|*/PF4_SUPPORTTYPING|PF4_AVATARS|PF4_IMSENDUTF; + break; + case PFLAG_UNIQUEIDTEXT: + iRet=(INT_PTR)Translate("E-mail address"); + break; + case PFLAG_MAXCONTACTSPERPACKET: + iRet=MRA_MAXCONTACTSPERPACKET; + break; + case PFLAG_UNIQUEIDSETTING: + iRet=(INT_PTR)"e-mail"; + break; + case PFLAG_MAXLENOFMESSAGE: + iRet=MRA_MAXLENOFMESSAGE; + break; + default: + iRet=0; + break; + } +return(iRet); +} + + +INT_PTR MraGetName(WPARAM wParam,LPARAM lParam) +{ + lstrcpynA((LPSTR)lParam,PROTOCOL_DISPLAY_NAMEA,wParam); +return(0); +} + + +INT_PTR MraLoadIcon(WPARAM wParam,LPARAM lParam) +{ + UINT id; + + switch(wParam&0xFFFF){ + case PLI_PROTOCOL:id=IDI_MRA;break;// IDI_TM is the main icon for the protocol + default:return(0); + } +return((INT_PTR)LoadImage(masMraSettings.hInstance,MAKEINTRESOURCE(id),IMAGE_ICON,GetSystemMetrics((wParam&PLIF_SMALL)?SM_CXSMICON:SM_CXICON),GetSystemMetrics((wParam&PLIF_SMALL)?SM_CYSMICON:SM_CYICON),0)); +} + + +INT_PTR MraSetStatus(WPARAM wParam,LPARAM lParam) +{ + // remap global statuses to local supported + switch(wParam){ + case ID_STATUS_OFFLINE: + wParam=ID_STATUS_OFFLINE; + break; + case ID_STATUS_ONLINE: + wParam=ID_STATUS_ONLINE; + break; + case ID_STATUS_AWAY: + wParam=ID_STATUS_AWAY; + break; + case ID_STATUS_DND: + case ID_STATUS_OCCUPIED: + wParam=ID_STATUS_DND; + break; + case ID_STATUS_FREECHAT: + wParam=ID_STATUS_FREECHAT; + break; + case ID_STATUS_INVISIBLE: + wParam=ID_STATUS_INVISIBLE; + break; + case ID_STATUS_NA: + case ID_STATUS_ONTHEPHONE: + case ID_STATUS_OUTTOLUNCH: + wParam=ID_STATUS_AWAY; + break; + default: + wParam=ID_STATUS_OFFLINE; + break; + } + + + if (InterlockedExchangeAdd((volatile LONG*)&masMraSettings.dwStatusMode,0)==wParam && wParam!=lParam) + {// nothink to change + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,NULL,ACKTYPE_STATUS,ACKRESULT_SUCCESS,(HANDLE)wParam,wParam,0); + }else{ + DWORD dwOldStatusMode; + + if ((masMraSettings.dwDesiredStatusMode=wParam)==ID_STATUS_OFFLINE) + {//set all contacts to offline + masMraSettings.bLoggedIn=FALSE; + dwOldStatusMode=InterlockedExchange((volatile LONG*)&masMraSettings.dwStatusMode,masMraSettings.dwDesiredStatusMode); + + if (dwOldStatusMode>ID_STATUS_OFFLINE) + {// всех в offline, только если мы бывали подключены + for(HANDLE hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);hContact!=NULL;hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)) + {// функция сама проверяет принадлежность контакта к MRA + SetContactBasicInfoW(hContact,SCBIFSI_LOCK_CHANGES_EVENTS,(SCBIF_ID|SCBIF_GROUP_ID|SCBIF_SERVER_FLAG|SCBIF_STATUS),-1,-1,0,0,ID_STATUS_OFFLINE,NULL,0,NULL,0,NULL,0); + } + } + Netlib_CloseHandle(masMraSettings.hConnection); + }else{ + // если offline то сразу ставим connecting, но обработка как offline + dwOldStatusMode=InterlockedCompareExchange((volatile LONG*)&masMraSettings.dwStatusMode,ID_STATUS_CONNECTING,ID_STATUS_OFFLINE); + + switch(dwOldStatusMode){ + case ID_STATUS_OFFLINE:// offline, connecting + if (StartConnect()!=NO_ERROR) + {//err + masMraSettings.bLoggedIn=FALSE; + masMraSettings.dwDesiredStatusMode=ID_STATUS_OFFLINE; + dwOldStatusMode=InterlockedExchange((volatile LONG*)&masMraSettings.dwStatusMode,masMraSettings.dwDesiredStatusMode); + } + break; + case ID_STATUS_ONLINE:// connected, change status + case ID_STATUS_AWAY: + case ID_STATUS_DND: + case ID_STATUS_FREECHAT: + case ID_STATUS_INVISIBLE: + MraSendNewStatus(masMraSettings.dwDesiredStatusMode,MraGetXStatusInternal(),NULL,0,NULL,0); + case ID_STATUS_CONNECTING: + if (dwOldStatusMode==ID_STATUS_CONNECTING && wParam!=lParam) + {// предотвращаем переход в любой статус (кроме offline) из статуса connecting, если он не вызван самим плагином + break; + } + default: + dwOldStatusMode=InterlockedExchange((volatile LONG*)&masMraSettings.dwStatusMode,masMraSettings.dwDesiredStatusMode); + //MraSendNewStatus(masMraSettings.dwDesiredStatusMode,MraGetXStatusInternal(),NULL,0,NULL,0); + break; + } + } + MraSetContactStatus(NULL,masMraSettings.dwStatusMode); + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,NULL,ACKTYPE_STATUS,ACKRESULT_SUCCESS,(HANDLE)dwOldStatusMode,masMraSettings.dwStatusMode,0); + } +return(0); +} + + +INT_PTR MraGetStatus(WPARAM wParam,LPARAM lParam) +{ +return(InterlockedExchangeAdd((volatile LONG*)&masMraSettings.dwStatusMode,0)); +} + + +DWORD MraSetXStatusInternal(DWORD dwXStatus) +{ + DWORD dwOldStatusMode; + + if (IsXStatusValid(dwXStatus)) + { + CHAR szValueName[MAX_PATH]; + WCHAR szBuff[4096]; + SIZE_T dwBuffSize; + + // obsolete (TODO: remove in next version) + mir_snprintf(szValueName,SIZEOF(szValueName),"XStatus%ldName",dwXStatus); + if (DB_Mra_GetStaticStringW(NULL,szValueName,szBuff,SIZEOF(szBuff),&dwBuffSize)==FALSE) + {// default xstatus name + lstrcpynW(szBuff,lpcszXStatusNameDef[dwXStatus],SIZEOF(szBuff)); + dwBuffSize=lstrlenW(szBuff); + } + if (dwBuffSize>STATUS_TITLE_MAX) dwBuffSize=STATUS_TITLE_MAX; + DB_Mra_SetStringExW(NULL,DBSETTING_XSTATUSNAME,szBuff,dwBuffSize); + + // obsolete (TODO: remove in next version) + mir_snprintf(szValueName,SIZEOF(szValueName),"XStatus%ldMsg",dwXStatus); + if (DB_Mra_GetStaticStringW(NULL,szValueName,szBuff,SIZEOF(szBuff),&dwBuffSize)) + {// custom xstatus description + if (dwBuffSize>STATUS_DESC_MAX) dwBuffSize=STATUS_DESC_MAX; + DB_Mra_SetStringExW(NULL,DBSETTING_XSTATUSMSG,szBuff,dwBuffSize); + }else{// default xstatus description + DB_Mra_DeleteValue(NULL,DBSETTING_XSTATUSMSG); + } + }else{ + DB_Mra_DeleteValue(NULL,DBSETTING_XSTATUSNAME); + DB_Mra_DeleteValue(NULL,DBSETTING_XSTATUSMSG); + dwXStatus=MRA_MIR_XSTATUS_NONE; + } + + dwOldStatusMode=InterlockedExchange((volatile LONG*)&masMraSettings.dwXStatusMode,dwXStatus); + DB_Mra_SetByte(NULL,DBSETTING_XSTATUSID,(BYTE)dwXStatus); + + MraSendNewStatus(MraGetStatus(0,0),dwXStatus,NULL,0,NULL,0); + +return(dwOldStatusMode); +} + +DWORD MraGetXStatusInternal() +{ +return(InterlockedExchangeAdd((volatile LONG*)&masMraSettings.dwXStatusMode,0)); +} + + + +INT_PTR MraSetXStatus(WPARAM wParam,LPARAM lParam) +{// obsolete (TODO: remove in next version) + INT_PTR iRet=0; + + if (IsXStatusValid(wParam) || wParam==MRA_MIR_XSTATUS_NONE) + { + MraSetXStatusInternal(wParam); + iRet=wParam; + } +return(iRet); +} + +INT_PTR MraSetXStatusEx(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=1; + DWORD dwXStatus; + ICQ_CUSTOM_STATUS *pData=(ICQ_CUSTOM_STATUS*)lParam; + + if (pData->cbSize>=sizeof(ICQ_CUSTOM_STATUS)) + { + iRet=0; + + if (pData->flags&CSSF_MASK_STATUS) + {// fill status member + dwXStatus=(*pData->status); + if (IsXStatusValid(dwXStatus)==FALSE && dwXStatus!=MRA_MIR_XSTATUS_NONE) iRet=1; + }else{ + dwXStatus=MraGetXStatusInternal(); + } + + if (pData->flags&(CSSF_MASK_NAME|CSSF_MASK_MESSAGE) && iRet==0) + {// + if (IsXStatusValid(dwXStatus) || dwXStatus==MRA_MIR_XSTATUS_NONE) + { + CHAR szValueName[MAX_PATH]; + SIZE_T dwBuffSize; + + if (pData->flags&CSSF_MASK_NAME) + {// set custom status name + mir_snprintf(szValueName,SIZEOF(szValueName),"XStatus%ldName",dwXStatus); + if (pData->flags&CSSF_UNICODE) + { + dwBuffSize=lstrlenW(pData->pwszName); + if (dwBuffSize>STATUS_TITLE_MAX) dwBuffSize=STATUS_TITLE_MAX; + + DB_Mra_SetStringExW(NULL,szValueName,pData->pwszName,dwBuffSize); + DB_Mra_SetStringExW(NULL,DBSETTING_XSTATUSNAME,pData->pwszName,dwBuffSize); + }else{ + dwBuffSize=lstrlenA(pData->pszName); + if (dwBuffSize>STATUS_TITLE_MAX) dwBuffSize=STATUS_TITLE_MAX; + + DB_Mra_SetStringExA(NULL,szValueName,pData->pszName,dwBuffSize); + DB_Mra_SetStringExA(NULL,DBSETTING_XSTATUSNAME,pData->pszName,dwBuffSize); + } + } + + if (pData->flags&CSSF_MASK_MESSAGE) + {// set custom status message + mir_snprintf(szValueName,SIZEOF(szValueName),"XStatus%ldMsg",dwXStatus); + if (pData->flags&CSSF_UNICODE) + { + dwBuffSize=lstrlenW(pData->pwszMessage); + if (dwBuffSize>STATUS_TITLE_MAX) dwBuffSize=STATUS_DESC_MAX; + + DB_Mra_SetStringExW(NULL,szValueName,pData->pwszMessage,dwBuffSize); + DB_Mra_SetStringExW(NULL,DBSETTING_XSTATUSMSG,pData->pwszMessage,dwBuffSize); + }else{ + dwBuffSize=lstrlenA(pData->pszMessage); + if (dwBuffSize>STATUS_TITLE_MAX) dwBuffSize=STATUS_DESC_MAX; + + DB_Mra_SetStringExA(NULL,szValueName,pData->pszMessage,dwBuffSize); + DB_Mra_SetStringExA(NULL,DBSETTING_XSTATUSMSG,pData->pszMessage,dwBuffSize); + } + } + }else{// неудача только если мы не ставили Хстатус и попытались записать сообщения для "нет" статуса + if ((pData->flags&CSSF_MASK_STATUS)==0) iRet=1; + } + } + + if (pData->flags&(CSSF_MASK_STATUS|CSSF_MASK_NAME|CSSF_MASK_MESSAGE) && iRet==0) + {// set/update xstatus code and/or message + MraSetXStatusInternal(dwXStatus); + } + + if (pData->flags&CSSF_DISABLE_UI) + {// hide menu items + masMraSettings.bHideXStatusUI=(*pData->wParam)? FALSE:TRUE; + for (DWORD i=0;icbSize>=sizeof(ICQ_CUSTOM_STATUS)) + { + DWORD dwXStatus; + + iRet=0; + + if (pData->flags&CSSF_MASK_STATUS) + {// fill status member + *pData->status=MraGetXStatusInternal(); + } + + if (pData->flags&CSSF_MASK_NAME) + {// fill status name member + if (pData->flags&CSSF_DEFAULT_NAME) + { + dwXStatus=(*pData->wParam); + if (IsXStatusValid(dwXStatus)) + { + if (pData->flags&CSSF_UNICODE) + { + lstrcpynW(pData->pwszName,lpcszXStatusNameDef[dwXStatus],(STATUS_TITLE_MAX+1)); + }else{ + SIZE_T dwStatusTitleSize; + + dwStatusTitleSize=lstrlenW(lpcszXStatusNameDef[dwXStatus]); + if (dwStatusTitleSize>STATUS_TITLE_MAX) dwStatusTitleSize=STATUS_TITLE_MAX; + + WideCharToMultiByte(MRA_CODE_PAGE,0,lpcszXStatusNameDef[dwXStatus],dwStatusTitleSize,pData->pszName,MAX_PATH,NULL,NULL ); + (*((CHAR*)(pData->pszName+dwStatusTitleSize)))=0; + } + }else{// failure + iRet=1; + } + }else{ + if (pData->flags&CSSF_UNICODE) + { + DB_Mra_GetStaticStringW(hContact,DBSETTING_XSTATUSNAME,pData->pwszName,(STATUS_TITLE_MAX+1),NULL); + }else{ + DB_Mra_GetStaticStringA(hContact,DBSETTING_XSTATUSNAME,pData->pszName,(STATUS_TITLE_MAX+1),NULL); + } + } + } + + if (pData->flags&CSSF_MASK_MESSAGE) + {// fill status message member + if (pData->flags&CSSF_UNICODE) + { + DB_Mra_GetStaticStringW(hContact,DBSETTING_XSTATUSMSG,pData->pwszMessage,(STATUS_DESC_MAX+1),NULL); + }else{ + DB_Mra_GetStaticStringA(hContact,DBSETTING_XSTATUSMSG,pData->pszMessage,(STATUS_DESC_MAX+1),NULL); + } + } + + if (pData->flags&CSSF_DISABLE_UI) + { + if (pData->wParam) (*pData->wParam)=masMraSettings.bHideXStatusUI; + } + + if (pData->flags&CSSF_STATUSES_COUNT) + { + if (pData->wParam) (*pData->wParam)=(MRA_XSTATUS_COUNT-1); + } + + if (pData->flags&CSSF_STR_SIZES) + {//**deb можно оптимизировать, данный параметр возможно уже был вычислен при получении самих текстов + if (pData->wParam) DB_Mra_GetStaticStringW(hContact,DBSETTING_XSTATUSNAME,NULL,0,(SIZE_T*)pData->wParam); + if (pData->lParam) DB_Mra_GetStaticStringW(hContact,DBSETTING_XSTATUSMSG,NULL,0,(SIZE_T*)pData->lParam); + } + } +return(iRet); +} + +INT_PTR MraGetXStatusIcon(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet; + + if (wParam==0) wParam=MraGetXStatusInternal(); + iRet=(INT_PTR)IconLibGetIconEx(masMraSettings.hXStatusAdvancedStatusIcons[wParam],lParam); + +return(iRet); +} + + +DWORD MraSendNewStatus(DWORD dwStatusMir,DWORD dwXStatusMir,LPWSTR lpwszStatusTitle,SIZE_T dwStatusTitleSize,LPWSTR lpwszStatusDesc,SIZE_T dwStatusDescSize) +{ + if (masMraSettings.bLoggedIn) + { + CHAR szValueName[MAX_PATH]; + WCHAR wszStatusTitle[STATUS_TITLE_MAX+4],wszStatusDesc[STATUS_DESC_MAX+4]; + DWORD dwStatus,dwXStatus; + + dwStatus=GetMraStatusFromMiradaStatus(dwStatusMir,dwXStatusMir,&dwXStatus); + if (IsXStatusValid(dwXStatusMir)) + {// xstatuses + if (lpwszStatusTitle==NULL || dwStatusTitleSize==0) + { + mir_snprintf(szValueName,SIZEOF(szValueName),"XStatus%ldName",dwXStatusMir); + if (DB_Mra_GetStaticStringW(NULL,szValueName,wszStatusTitle,(STATUS_TITLE_MAX+1),&dwStatusTitleSize)) + {// custom xstatus name + lpwszStatusTitle=wszStatusTitle; + }else{// default xstatus name + lpwszStatusTitle=TranslateW(lpcszXStatusNameDef[dwXStatusMir]); + dwStatusTitleSize=lstrlenW(lpwszStatusTitle); + } + } + + if (lpwszStatusDesc==NULL || dwStatusDescSize==0) + { + mir_snprintf(szValueName,SIZEOF(szValueName),"XStatus%ldMsg",dwXStatusMir); + if (DB_Mra_GetStaticStringW(NULL,szValueName,wszStatusDesc,(STATUS_DESC_MAX+1),&dwStatusDescSize)) + {// custom xstatus description + lpwszStatusDesc=wszStatusDesc; + }else{// default xstatus description + lpwszStatusDesc=NULL; + dwStatusDescSize=0; + } + } + }else{// not xstatuses + if (lpwszStatusTitle==NULL || dwStatusTitleSize==0) + { + lpwszStatusTitle=GetStatusModeDescriptionW(dwStatusMir); + dwStatusTitleSize=lstrlenW(lpwszStatusTitle); + } + } + + MraSendCommand_ChangeStatusW(dwStatus,lpcszStatusUri[dwXStatus],lstrlenA(lpcszStatusUri[dwXStatus]),lpwszStatusTitle,dwStatusTitleSize,lpwszStatusDesc,dwStatusDescSize,((DB_Mra_GetByte(NULL,"RTFReceiveEnable",MRA_DEFAULT_RTF_RECEIVE_ENABLE)? FEATURE_FLAG_RTF_MESSAGE:0)|MRA_FEATURE_FLAGS)); + } + +return(0); +} + + + +INT_PTR MraSetAwayMsgA(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=1; + + if (masMraSettings.bLoggedIn) + { + WCHAR wszStatusDesc[STATUS_DESC_MAX+1]; + SIZE_T dwStatusDescSize; + + if (lParam) + { + dwStatusDescSize=MultiByteToWideChar(MRA_CODE_PAGE,0,(LPSTR)lParam,-1,wszStatusDesc,(SIZEOF(wszStatusDesc)-1)); + }else{ + dwStatusDescSize=0; + } + wszStatusDesc[dwStatusDescSize]=0; + + iRet=MraSetAwayMsg(wParam,(LPARAM)wszStatusDesc); + } +return(iRet); +} + +INT_PTR MraSetAwayMsg(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=1; + + if (masMraSettings.bLoggedIn) + { + LPWSTR lpwszStatusDesc; + DWORD dwStatus,dwXStatus; + SIZE_T dwStatusDescSize; + + lpwszStatusDesc=(LPWSTR)lParam; + dwStatusDescSize=lstrlenW(lpwszStatusDesc); + dwStatus=MraGetStatus(0,0); + dwXStatus=MraGetXStatusInternal(); + + if (dwStatus!=ID_STATUS_ONLINE || IsXStatusValid(dwXStatus)==FALSE) + {// не отправляем новый статусный текст для хстатусов, для хстатусов только эвей сообщения + dwStatusDescSize=min(dwStatusDescSize,STATUS_DESC_MAX); + MraSendNewStatus(dwStatus,dwXStatus,NULL,0,lpwszStatusDesc,dwStatusDescSize); + } + iRet=0; + } +return(iRet); +} + + +INT_PTR MraGetAwayMsg(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=0; + + if (masMraSettings.bLoggedIn && lParam) + { + CHAR szStatusDesc[MICBLOG_STATUS_MAX+MICBLOG_STATUS_MAX+MAX_PATH],szBlogStatus[MICBLOG_STATUS_MAX+4],szTime[64]; + DWORD dwTime; + SIZE_T dwStatusDescSize; + CCSDATA* ccs=(CCSDATA*)lParam; + SYSTEMTIME stBlogStatusTime={0}; + + if (DB_Mra_GetStaticStringA(ccs->hContact,DBSETTING_BLOGSTATUS,szBlogStatus,SIZEOF(szBlogStatus),NULL)) + { + dwTime=DB_Mra_GetDword(ccs->hContact,DBSETTING_BLOGSTATUSTIME,0); + if (dwTime && MakeLocalSystemTimeFromTime32(dwTime,&stBlogStatusTime)) + { + mir_snprintf(szTime,SIZEOF(szTime),"%04ld.%02ld.%02ld %02ld:%02ld: ",stBlogStatusTime.wYear,stBlogStatusTime.wMonth,stBlogStatusTime.wDay,stBlogStatusTime.wHour,stBlogStatusTime.wMinute); + }else{ + szTime[0]=0; + } + + dwStatusDescSize=mir_snprintf(szStatusDesc,SIZEOF(szStatusDesc),"%s%s",szTime,szBlogStatus); + + iRet=GetTickCount(); + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,ccs->hContact,ACKTYPE_AWAYMSG,ACKRESULT_SUCCESS,(HANDLE)iRet,(LPARAM)szStatusDesc,dwStatusDescSize); + } + } +return(iRet); +} + + +INT_PTR MraAuthAllow(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=1; + + if (masMraSettings.bLoggedIn) + { + DBEVENTINFO dbei={0}; + + dbei.cbSize=sizeof(dbei); + if ((dbei.cbBlob=CallService(MS_DB_EVENT_GETBLOBSIZE,wParam,0))!=-1) + { + dbei.pBlob=(PBYTE)MEMALLOC(dbei.cbBlob); + if (dbei.pBlob) + { + if (CallService(MS_DB_EVENT_GET,wParam,(LPARAM)&dbei)==0) + if (dbei.eventType==EVENTTYPE_AUTHREQUEST) + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,dbei.szModule,-1,PROTOCOL_NAMEA,PROTOCOL_NAME_LEN)==CSTR_EQUAL) + { + LPSTR lpszNick,lpszFirstName,lpszLastName,lpszEMail,lpszRequestReason; + + lpszNick=(LPSTR)(dbei.pBlob+sizeof(DWORD)*2); + lpszFirstName=lpszNick+lstrlenA(lpszNick)+1; + lpszLastName=lpszFirstName+lstrlenA(lpszFirstName)+1; + lpszEMail=lpszLastName+lstrlenA(lpszLastName)+1; + lpszRequestReason=lpszEMail+lstrlenA(lpszEMail)+1; + + MraSendCommand_Authorize(lpszEMail,lstrlenA(lpszEMail)); + iRet=0; + } + MEMFREE(dbei.pBlob); + } + } + } +return(iRet); +} + + +INT_PTR MraAuthDeny(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=1; + + if (lParam && masMraSettings.bLoggedIn) + { + DBEVENTINFO dbei={0}; + + dbei.cbSize=sizeof(dbei); + if ((dbei.cbBlob=CallService(MS_DB_EVENT_GETBLOBSIZE,wParam,0))!=-1) + { + dbei.pBlob=(PBYTE)MEMALLOC(dbei.cbBlob); + if (dbei.pBlob) + { + if (CallService(MS_DB_EVENT_GET,wParam,(LPARAM)&dbei)==0) + if (dbei.eventType==EVENTTYPE_AUTHREQUEST) + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,dbei.szModule,-1,PROTOCOL_NAMEA,PROTOCOL_NAME_LEN)==CSTR_EQUAL) + { + LPSTR lpszNick,lpszFirstName,lpszLastName,lpszEMail,lpszRequestReason; + SIZE_T dwEMailSize,dwRequestReasonSize; + //HANDLE hContact; + + lpszNick=(LPSTR)(dbei.pBlob+sizeof(DWORD)*2); + lpszFirstName=lpszNick+lstrlenA(lpszNick)+1; + lpszLastName=lpszFirstName+lstrlenA(lpszFirstName)+1; + lpszEMail=lpszLastName+lstrlenA(lpszLastName)+1; + dwEMailSize=lstrlenA(lpszEMail); + lpszRequestReason=(LPSTR)lParam; + dwRequestReasonSize=lstrlenA(lpszRequestReason); + + if (dwRequestReasonSize) MraSendCommand_MessageW(FALSE,NULL,0,0,lpszEMail,dwEMailSize,(LPWSTR)lpszRequestReason,dwRequestReasonSize,NULL,0); + //hContact=MraHContactFromEmail(lpszEMail,dwEMailSize,FALSE,TRUE,NULL); + //if (DBGetContactSettingByte(hContact,"CList","NotOnList",0)) CallService(MS_DB_CONTACT_DELETE,(WPARAM)hContact,0); + + iRet=0; + } + MEMFREE(dbei.pBlob); + } + } + } +return(iRet); +} + + + +HANDLE AddToListByEmail(MRA_LPS *plpsEMail,MRA_LPS *plpsNick,MRA_LPS *plpsFirstName,MRA_LPS *plpsLastName,DWORD dwFlags) +{ + HANDLE hContact=NULL; + + if (plpsEMail) + if (plpsEMail->dwSize) + { + BOOL bAdded; + + hContact=MraHContactFromEmail(plpsEMail->lpszData,plpsEMail->dwSize,TRUE,TRUE,&bAdded); + if (hContact) + { + if (plpsNick) + if (plpsNick->dwSize) + { + DB_Mra_SetLPSStringA(hContact,"Nick",plpsNick); + if (bAdded) + {// впервые добавляется контакт в базу///***deb + //SetContactBasicInfoW(hContact,SCBIFSI_LOCK_CHANGES_EVENTS,SCBIF_NICK,0,0,0,0,0,NULL,0,plpsNick->lpszData,plpsNick->dwSize,NULL,0); + } + } + + if (plpsFirstName) + if (plpsFirstName->dwSize) DB_Mra_SetLPSStringA(hContact,"FirstName",plpsFirstName); + + if (plpsLastName) + if (plpsLastName->dwSize) DB_Mra_SetLPSStringA(hContact,"LastName",plpsLastName); + + if (dwFlags&PALF_TEMPORARY) + { + DBWriteContactSettingByte(hContact,"CList","Hidden",1); + }else{ + DBDeleteContactSetting(hContact,"CList","NotOnList"); + } + + if (bAdded) MraUpdateContactInfo(hContact); + } + } +return(hContact); +} + + +INT_PTR MraAddToList(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet; + PROTOSEARCHRESULT *psr=(PROTOSEARCHRESULT*)lParam; + + if (psr->cbSize==sizeof(PROTOSEARCHRESULT)) + { + MRA_LPS lpsEMail,lpsNick,lpsFirstName,lpsLastName; + + lpsEMail.dwSize=lstrlenA((LPSTR)psr->email); + lpsEMail.lpwszData=psr->email; + lpsNick.dwSize=lstrlenA((LPSTR)psr->nick); + lpsNick.lpwszData=psr->nick; + lpsFirstName.dwSize=lstrlenA((LPSTR)psr->firstName); + lpsFirstName.lpwszData=psr->firstName; + lpsLastName.dwSize=lstrlenA((LPSTR)psr->lastName); + lpsLastName.lpwszData=psr->lastName; + + iRet=(INT_PTR)AddToListByEmail(&lpsEMail,&lpsNick,&lpsFirstName,&lpsLastName,wParam); + }else{ + iRet=0; + } +return(iRet); +} + + +INT_PTR MraAddToListByEvent(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=0; + DBEVENTINFO dbei={0}; + + dbei.cbSize=sizeof(dbei); + if ((dbei.cbBlob=CallService(MS_DB_EVENT_GETBLOBSIZE,lParam,0))!=-1) + { + dbei.pBlob=(PBYTE)MEMALLOC(dbei.cbBlob); + if (dbei.pBlob) + { + if (CallService(MS_DB_EVENT_GET,lParam,(LPARAM)&dbei)==0) + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,dbei.szModule,-1,PROTOCOL_NAMEA,PROTOCOL_NAME_LEN)==CSTR_EQUAL) + if (dbei.eventType==EVENTTYPE_AUTHREQUEST || dbei.eventType==EVENTTYPE_CONTACTS) + { + LPSTR lpszRequestReason; + MRA_LPS lpsEMail,lpsNick,lpsFirstName,lpsLastName; + + lpsNick.lpszData=(LPSTR)(dbei.pBlob+ ((dbei.eventType==EVENTTYPE_AUTHREQUEST)?(sizeof(DWORD)*2):0) ); + lpsNick.dwSize=lstrlenA(lpsNick.lpszData); + lpsFirstName.lpszData=lpsNick.lpszData+lpsNick.dwSize+1; + lpsFirstName.dwSize=lstrlenA(lpsFirstName.lpszData); + lpsLastName.lpszData=lpsFirstName.lpszData+lpsFirstName.dwSize+1; + lpsLastName.dwSize=lstrlenA(lpsLastName.lpszData); + lpsEMail.lpszData=lpsLastName.lpszData+lpsLastName.dwSize+1; + lpsEMail.dwSize=lstrlenA(lpsEMail.lpszData); + lpszRequestReason=lpsEMail.lpszData+lpsEMail.dwSize+1; + + iRet=(INT_PTR)AddToListByEmail(&lpsEMail,&lpsNick,&lpsFirstName,&lpsLastName,0); + }else{ + dbei.eventType=dbei.eventType; + DebugBreak(); + } + MEMFREE(dbei.pBlob); + } + } +return(iRet); +} + + +/* + --------------------------------- + | Receiving | + --------------------------------- +*/ +INT_PTR MraRecvMessage(WPARAM wParam,LPARAM lParam) +{ + CallService(MS_PROTO_RECVMSG,0,(LPARAM)lParam); +return(0); +} + + +INT_PTR MraRecvContacts(WPARAM wParam,LPARAM lParam) +{ + CCSDATA* ccs=(CCSDATA*)lParam; + DBEVENTINFO dbei={0}; + PROTORECVEVENT* pre=(PROTORECVEVENT*)ccs->lParam; + + dbei.cbSize=sizeof(dbei); + dbei.szModule=PROTOCOL_NAMEA; + dbei.timestamp=pre->timestamp; + dbei.flags=(pre->flags&PREF_CREATEREAD)?DBEF_READ:0; + dbei.eventType=EVENTTYPE_CONTACTS; + dbei.cbBlob=pre->lParam; + dbei.pBlob=(PBYTE)pre->szMessage; + + CallService(MS_DB_EVENT_ADD,(WPARAM)ccs->hContact,(LPARAM)&dbei); +return(0); +} + + +INT_PTR MraRecvFile(WPARAM wParam,LPARAM lParam) +{ + CCSDATA* ccs=(CCSDATA*)lParam; + PROTORECVFILET* pre=(PROTORECVFILET*)ccs->lParam; + + CallService(MS_PROTO_RECVFILET,0,(LPARAM)lParam); +return(0); +} + + +INT_PTR MraRecvAuth(WPARAM wParam,LPARAM lParam) +{ + CCSDATA* ccs=(CCSDATA*)lParam; + DBEVENTINFO dbei={0}; + PROTORECVEVENT* pre=(PROTORECVEVENT*)ccs->lParam; + + dbei.cbSize=sizeof(dbei); + dbei.szModule=PROTOCOL_NAMEA; + dbei.timestamp=pre->timestamp; + dbei.flags=(pre->flags&PREF_CREATEREAD)?DBEF_READ:0; + dbei.eventType=EVENTTYPE_AUTHREQUEST; + dbei.cbBlob=pre->lParam; + dbei.pBlob=(PBYTE)pre->szMessage; + + CallService(MS_DB_EVENT_ADD,(WPARAM)NULL,(LPARAM)&dbei); +return(0); +} + + +/* + --------------------------------- + | Sending | + --------------------------------- +*/ +INT_PTR MraSendAuthRequest(WPARAM wParam,LPARAM lParam) +{// internal only + INT_PTR iRet=1; + + if (masMraSettings.bLoggedIn && lParam) + { + BOOL bSlowSend; + CHAR szEMail[MAX_EMAIL_LEN]; + LPWSTR lpwszMessage; + SIZE_T dwEMailSize,dwMessageSize; + CCSDATA* ccs=(CCSDATA*)lParam; + + if (ccs->wParam&PREF_UNICODE)//flags + { + lpwszMessage=(LPWSTR)ccs->lParam; + dwMessageSize=lstrlenW(lpwszMessage); + }else{ + dwEMailSize=lstrlenA((LPSTR)ccs->lParam); + lpwszMessage=(LPWSTR)MEMALLOC(((dwEMailSize+MAX_PATH)*sizeof(WCHAR))); + if (lpwszMessage) + { + dwMessageSize=MultiByteToWideChar(MRA_CODE_PAGE,0,(LPSTR)ccs->lParam,dwEMailSize,lpwszMessage,(dwEMailSize+MAX_PATH)); + } + } + + if (lpwszMessage) + { + if (DB_Mra_GetStaticStringA(ccs->hContact,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + bSlowSend=DB_Mra_GetByte(NULL,"SlowSend",MRA_DEFAULT_SLOW_SEND); + iRet=MraSendCommand_MessageW(bSlowSend,ccs->hContact,ACKTYPE_AUTHREQ,MESSAGE_FLAG_AUTHORIZE,szEMail,dwEMailSize,lpwszMessage,dwMessageSize,NULL,0); + if (bSlowSend==FALSE) + { + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,ccs->hContact,ACKTYPE_AUTHREQ,ACKRESULT_SUCCESS,(HANDLE)iRet,(LPARAM)NULL,0); + } + iRet=0; + } + + if (lpwszMessage!=(LPWSTR)ccs->lParam) MEMFREE(lpwszMessage); + } + } +return(iRet); +} + + +INT_PTR MraSendMessage(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=0; + CCSDATA* ccs=(CCSDATA*)lParam; + + if (masMraSettings.bLoggedIn) + { + BOOL bSlowSend,bMemAllocated=FALSE; + CHAR szEMail[MAX_EMAIL_LEN]; + DWORD dwFlags=0; + LPSTR lpszMessage; + LPWSTR lpwszMessage=NULL; + SIZE_T dwEMailSize,dwMessageSize=0; + + lpszMessage=(LPSTR)ccs->lParam; + dwMessageSize=lstrlenA(lpszMessage); + if (ccs->wParam&PREF_UNICODE)//flags + { + lpwszMessage=(LPWSTR)(lpszMessage+dwMessageSize+1); + }else + if (ccs->wParam&PREF_UTF){// convert to unicode from utf8 + lpwszMessage=(LPWSTR)MEMALLOC(((dwMessageSize+MAX_PATH)*sizeof(WCHAR))); + if (lpwszMessage) + { + dwMessageSize=MultiByteToWideChar(CP_UTF8,0,lpszMessage,dwMessageSize,lpwszMessage,(dwMessageSize+MAX_PATH)); + bMemAllocated=TRUE; + } + }else{// convert to unicode from ansi + MraPopupShowFromAgentW(MRA_POPUP_TYPE_DEBUG,0,TranslateW(L"Send ANSI")); + lpwszMessage=(LPWSTR)MEMALLOC(((dwMessageSize+MAX_PATH)*sizeof(WCHAR))); + if (lpwszMessage) + { + dwMessageSize=MultiByteToWideChar(MRA_CODE_PAGE,0,lpszMessage,dwMessageSize,lpwszMessage,(dwMessageSize+MAX_PATH)); + bMemAllocated=TRUE; + } + } + + if (lpwszMessage) + { + if (DB_Mra_GetStaticStringA(ccs->hContact,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + bSlowSend=DB_Mra_GetByte(NULL,"SlowSend",MRA_DEFAULT_SLOW_SEND); + + if (DB_Mra_GetByte(NULL,"RTFSendEnable",MRA_DEFAULT_RTF_SEND_ENABLE) && (MraContactCapabilitiesGet(ccs->hContact)&FEATURE_FLAG_RTF_MESSAGE)) + { + dwFlags|=MESSAGE_FLAG_RTF; + } + + iRet=MraSendCommand_MessageW(bSlowSend,ccs->hContact,ACKTYPE_MESSAGE,dwFlags,szEMail,dwEMailSize,lpwszMessage,dwMessageSize,NULL,0); + if (bSlowSend==FALSE) + { + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,ccs->hContact,ACKTYPE_MESSAGE,ACKRESULT_SUCCESS,(HANDLE)iRet,(LPARAM)NULL,0); + } + } + + if (bMemAllocated) MEMFREE(lpwszMessage); + }else{ + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,ccs->hContact,ACKTYPE_MESSAGE,ACKRESULT_FAILED,NULL,(LPARAM)"Cant allocate buffer for convert to unicode.",-1); + } + }else{ + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,ccs->hContact,ACKTYPE_MESSAGE,ACKRESULT_FAILED,NULL,(LPARAM)"You cannot send when you are offline.",-1); + } +return(iRet); +} + + +INT_PTR MraSendContacts(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=0; + CCSDATA* ccs=(CCSDATA*)lParam; + + if (masMraSettings.bLoggedIn && lParam) + { + BOOL bSlowSend; + CHAR szEMail[MAX_EMAIL_LEN]; + LPWSTR lpwszData,lpwszDataCurrent,lpwszNick; + SIZE_T i,dwContacts,dwDataBuffSize,dwEMailSize,dwStringSize,dwNickSize; + HANDLE *hContactsList=(HANDLE*)ccs->lParam; + + dwContacts=HIWORD(ccs->wParam); + dwDataBuffSize=(dwContacts*(MAX_EMAIL_LEN*2)); + lpwszData=(LPWSTR)MEMALLOC((dwDataBuffSize*sizeof(WCHAR))); + if (lpwszData) + { + lpwszDataCurrent=lpwszData; + if (DB_Mra_GetStaticStringA(ccs->hContact,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + for(i=0;ihContact,ACKTYPE_CONTACTS,MESSAGE_FLAG_CONTACT,szEMail,dwEMailSize,lpwszData,(lpwszDataCurrent-lpwszData),NULL,0); + if (bSlowSend==FALSE) + { + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,ccs->hContact,ACKTYPE_CONTACTS,ACKRESULT_SUCCESS,(HANDLE)iRet,(LPARAM)NULL,0); + } + } + MEMFREE(lpwszData); + } + }else{ + ProtoBroadcastAckAsynchEx(PROTOCOL_NAMEA,ccs->hContact,ACKTYPE_CONTACTS,ACKRESULT_FAILED,NULL,(LPARAM)"You cannot send when you are offline.",-1); + } +return(iRet); +} + + +INT_PTR MraSendUserIsTyping(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=1; + + if (masMraSettings.bLoggedIn && wParam && lParam!=PROTOTYPE_SELFTYPING_OFF) + { + CHAR szEMail[MAX_EMAIL_LEN]; + SIZE_T dwEMailSize; + HANDLE hContact=(HANDLE)wParam; + + if (MraGetContactStatus(hContact)!=ID_STATUS_OFFLINE && MraGetStatus(0,0)!=ID_STATUS_INVISIBLE) + if (DB_Mra_GetStaticStringA(hContact,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + if (MraSendCommand_MessageW(FALSE,hContact,0,MESSAGE_FLAG_NOTIFY,szEMail,dwEMailSize,L" ",1,NULL,0)) iRet=0; + } + } +return(iRet); +} + + +INT_PTR MraSendNudge(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=1; + + if (masMraSettings.bLoggedIn && wParam) + { + CHAR szEMail[MAX_EMAIL_LEN]; + LPWSTR lpwszAlarmMessage=TranslateW(MRA_ALARM_MESSAGE); + SIZE_T dwEMailSize; + HANDLE hContact=(HANDLE)wParam; + + if (DB_Mra_GetStaticStringA(hContact,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize)) + { + if (MraSendCommand_MessageW(FALSE,hContact,0,(MESSAGE_FLAG_RTF|MESSAGE_FLAG_ALARM),szEMail,dwEMailSize,lpwszAlarmMessage,lstrlenW(lpwszAlarmMessage),NULL,0)) iRet=0; + } + } +return(iRet); +} + + +INT_PTR MraSetApparentMode(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=1; + + if (masMraSettings.bLoggedIn && lParam) + { + CCSDATA *ccs=(CCSDATA*)lParam; + + if (ccs->hContact && ccs->wParam==0 || ccs->wParam==ID_STATUS_ONLINE || ccs->wParam==ID_STATUS_OFFLINE) + {// Only 3 modes are supported + DWORD dwOldMode=DB_Mra_GetWord(ccs->hContact,"ApparentMode",0); + + // Dont send redundant updates + if (ccs->wParam!=dwOldMode) + { + CHAR szEMail[MAX_EMAIL_LEN],szPhones[MAX_EMAIL_LEN]; + WCHAR wszNick[MAX_EMAIL_LEN]; + DWORD dwID,dwGroupID,dwContactFlag=0; + SIZE_T dwEMailSize,dwNickSize,dwPhonesSize; + + GetContactBasicInfoW(ccs->hContact,&dwID,&dwGroupID,&dwContactFlag,NULL,NULL,szEMail,SIZEOF(szEMail),&dwEMailSize,wszNick,SIZEOF(wszNick),&dwNickSize,szPhones,SIZEOF(szPhones),&dwPhonesSize); + + dwContactFlag&=~(CONTACT_FLAG_INVISIBLE|CONTACT_FLAG_VISIBLE); + switch(ccs->wParam){ + case ID_STATUS_OFFLINE: + dwContactFlag|=CONTACT_FLAG_INVISIBLE; + break; + case ID_STATUS_ONLINE: + dwContactFlag|=CONTACT_FLAG_VISIBLE; + break; + } + + if (MraSendCommand_ModifyContactW(ccs->hContact,dwID,dwContactFlag,dwGroupID,szEMail,dwEMailSize,wszNick,dwNickSize,szPhones,dwPhonesSize)) + { + SetContactBasicInfoW(ccs->hContact,0,SCBIF_FLAG,0,0,dwContactFlag,0,0,NULL,0,NULL,0,NULL,0); + iRet=0;// Success + } + } + } + } +return(iRet); +} + + +INT_PTR MraGetInfo(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=1; + + if (MraUpdateContactInfo(((CCSDATA*)lParam)->hContact)) + { + iRet=0; + } +return(iRet); +} + + +INT_PTR MraGetAvatarCaps(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=0; + + switch(wParam){ + case AF_MAXSIZE: + iRet=-1; + break; + case AF_PROPORTION: + iRet=PIP_NONE; + break; + case AF_FORMATSUPPORTED: + iRet=0;// no formats to set + break; + case AF_ENABLED: + iRet=1;// allways on + break; + case AF_DONTNEEDDELAYS: + iRet=0;// need delay + break; + case AF_MAXFILESIZE: + iRet=0;// + break; + case AF_DELAYAFTERFAIL: + iRet=5000; + break; + } + +return(iRet); +} + + +INT_PTR MraGetAvatarInfo(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=GAIR_NOAVATAR; + + if (lParam) + {//(DWORD)wParam&GAIF_FORCE + PROTO_AVATAR_INFORMATION *ppai=(PROTO_AVATAR_INFORMATION*)lParam; + iRet=(INT_PTR)MraAvatarsQueueGetAvatar(masMraSettings.hAvatarsQueueHandle,(DWORD)wParam,ppai->hContact,NULL,(DWORD*)&ppai->format,ppai->filename); + } +return(iRet); +} + + +INT_PTR MraGetMyAvatar(WPARAM wParam,LPARAM lParam) +{// need call MS_AV_REPORTMYAVATARCHANGED hook + INT_PTR iRet=1; + + if (MraAvatarsGetFileName(masMraSettings.hAvatarsQueueHandle,NULL,GetContactAvatarFormat(NULL,PA_FORMAT_DEFAULT),(LPSTR)wParam,(SIZE_T)lParam,NULL)==NO_ERROR) + { + LPSTR lpsz=(LPSTR)wParam; + iRet=0; + } +return(iRet); +} + + +INT_PTR MraBasicSearch(WPARAM wParam,LPARAM lParam) +{ +return(MraSearchByEmail(wParam,lParam)); +} + +INT_PTR MraSearchByEmail(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=0; + + if (masMraSettings.bLoggedIn && lParam) + { + CHAR szEMail[MAX_EMAIL_LEN]={0}; + SIZE_T dwEMailSize; + + dwEMailSize=(WideCharToMultiByte(MRA_CODE_PAGE,0,(LPWSTR)lParam,-1,szEMail,SIZEOF(szEMail),NULL,NULL)-1); + iRet=MraSendCommand_WPRequestByEMail(NULL,ACKTYPE_SEARCH,szEMail,dwEMailSize); + } +return(iRet); +} + +INT_PTR MraSearchByName(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=0; + + if (masMraSettings.bLoggedIn && lParam) + { + PROTOSEARCHBYNAME *psbn=(PROTOSEARCHBYNAME*)lParam; + + if (psbn->pszNick || psbn->pszFirstName || psbn->pszLastName) + { + DWORD dwRequestFlags=0; + SIZE_T dwNickSize=0,dwFirstNameSize=0,dwLastNameSize=0; + + if (psbn->pszNick) dwNickSize=lstrlenW(psbn->pszNick); + if (psbn->pszFirstName) dwFirstNameSize=lstrlenW(psbn->pszFirstName); + if (psbn->pszLastName) dwLastNameSize=lstrlenW(psbn->pszLastName); + + if (dwNickSize) SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_NICKNAME); + if (dwFirstNameSize) SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_FIRSTNAME); + if (dwLastNameSize) SetBit(dwRequestFlags,MRIM_CS_WP_REQUEST_PARAM_LASTNAME); + + iRet=MraSendCommand_WPRequestW(NULL,ACKTYPE_SEARCH,dwRequestFlags,NULL,0,NULL,0,psbn->pszNick,dwNickSize,psbn->pszFirstName,dwFirstNameSize,psbn->pszLastName,dwLastNameSize,0,0,0,0,0,0,0,0,0); + } + } +return(iRet); +} + +INT_PTR MraCreateAdvSearchUI(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=0; + + if (masMraSettings.hInstance && lParam) + { + iRet=(INT_PTR)CreateDialogParam(masMraSettings.hInstance,MAKEINTRESOURCE(IDD_MRAADVANCEDSEARCH),(HWND)lParam,AdvancedSearchDlgProc,0); + } +return(iRet); +} + +INT_PTR MraSearchByAdvanced(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=0; + + if (masMraSettings.bLoggedIn && lParam) + { + iRet=(INT_PTR)AdvancedSearchFromDlg((HWND)lParam); + } +return(iRet); +} + + + + + +INT_PTR MraFileResume(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=1; + + if (wParam && lParam) + { + PROTOFILERESUME *pfr=(PROTOFILERESUME*)lParam; + //icq_sendFileResume((filetransfer*)wParam,pfr->action,pfr->szFilename); + iRet=0;// Success + } +return(iRet); +} + +INT_PTR MraFileAllow(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=0; + + if (lParam) + if (((CCSDATA*)lParam)->wParam) + { + LPWSTR lpwszPath; + SIZE_T dwPathSize; + CCSDATA *pcds=(CCSDATA*)lParam; + PROTORECVEVENT *prce=(PROTORECVEVENT*)pcds->lParam; + PROTORECVFILET *prcf=(PROTORECVFILET*)pcds->lParam; + + lpwszPath=(LPWSTR)((CCSDATA*)lParam)->lParam; + dwPathSize=lstrlenW(lpwszPath); + + if (MraFilesQueueAccept(masMraSettings.hFilesQueueHandle,((CCSDATA*)lParam)->wParam,lpwszPath,dwPathSize)==NO_ERROR) + { + iRet=((CCSDATA*)lParam)->wParam; // Success + } + } +return(iRet); +} + +INT_PTR MraFileDenyCancel(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=1; + + if (lParam) + if (((CCSDATA*)lParam)->wParam) + {// description: (LPSTR)((CCSDATA*)lParam)->lParam + MraFilesQueueCancel(masMraSettings.hFilesQueueHandle,((CCSDATA*)lParam)->wParam,TRUE); + iRet=0; // Success + } +return(iRet); +} + + + +INT_PTR MraFileSend(WPARAM wParam,LPARAM lParam) +{ + INT_PTR iRet=0; + + if (masMraSettings.bLoggedIn && wParam && lParam) + if (((CCSDATA*)lParam)->hContact && ((CCSDATA*)lParam)->lParam) + {// (LPSTR)((CCSDATA*)lParam)->wParam,lstrlenA((LPSTR)((CCSDATA*)lParam)->wParam) - description + LPWSTR *plpwszFiles=(LPWSTR*)((CCSDATA*)lParam)->lParam; + SIZE_T dwFilesCount; + + for(dwFilesCount=0;plpwszFiles[dwFilesCount];dwFilesCount++); + + MraFilesQueueAddSend(masMraSettings.hFilesQueueHandle,0,((CCSDATA*)lParam)->hContact,plpwszFiles,dwFilesCount,(DWORD*)&iRet); + } +return(iRet); +} diff --git a/MRA/Readme_MRA.txt b/MRA/Readme_MRA.txt new file mode 100644 index 0000000..a090456 --- /dev/null +++ b/MRA/Readme_MRA.txt @@ -0,0 +1,502 @@ +Mail.ru Агент плагин для Miranda IM + +Copyright (C) 2006-2011 Рожук Иван + + + Плагин предназначен для общения по протоколу Mail.ru Агент. + + + ВНИМАНИЕ! + В плагине добавляющая синхронизация! + Если вы загрузили в свой профиль список а потом поменяли логин и пароль, то +к вам скачается список второго акаунта, а на сервер скачается список первого, и +авторизация будет автоматически запрошенна у всех, кого дабавили на сервер. + + Для корректной работы антиспама нужно заполнить список плохих слов. + + Полноценная поддержка групп на сервере будет позже. + Игры - не документировались, в случае документирования могу сделать только API для них. + (Желающие сделать плагины для игр - обращатся приватом) + + + +Плагины добавляющие функциональность +Здесь указаны только плагины, которые более полно раскрывают возможности протокола mail.ru Агент заложенные в плагин MRA + PopUp - через него показываются различные уведомления, в том числе ошибки, предупреждения и уведомления о новой почте. + mToolTip/Tipper - для показа дополнительно информации о контакте. См ниже шаблоны. + SMS (sms.dll) - для отправки СМС сообщений и отображения ответов. Ответы также можно посмотреть в history++ + Nudge (nudge.dll) - функция будильника. Без него не будет кнопочки в диалоге и окно не будет трястись когда собеседник вас встряхивает, однако останется пункт в меню контакта и будет записыватся текстовое сообщение о том что собеседник пытается вас разбудить. + WATrack (watrack.dll) - позволяет MRA оперативно обновлять на сайте то что играет у пользователя. Что бы смотреть что играет у собеседников этот плагин не нужен. + + + +Поддержка RTF (форматированного текста) + Для поддержки форматированного текста нужно: +- zlib.dll, без неё плагин не сможет распаковывать и запаковывать текст для передачи по сети, также нужна для флеш мультов (при приёме с ориг агента) +- tabsramm и history++ плагины, в настройках tabsramm указываем использовать history++ для отображения, +в настройках history++ включаем поддержку RTF + + +Теперь о приятном: + + Пользователи look-in плагина, и других работающих с информацией контакта, MRA плагин записывает информацию так же как и ICQ. + В настройках look-in плагина укажите использовать для MRA шаблон от ICQ. + + При передаче файлов можно указать описание к файлу, но пользователи агента его не увидят ;) + + Расширенный поиск позволяет искать не только по России, но и по другим странам, с возможностью выбора города/штата. + + Также желательно иметь Updater для своевременного автоматического обновления. + + Прокси настраивается в настройках сети (Network), раздельно: для обмена +сообщениями и для загрузки аватар. + + Основной список и списки видимости, невидимости и игнор работают. + Для того, чтобы добавить пользователя в игнор на сервере достаточно в настройках +миранды поставить игнор на его СООБЩЕНИЯ, если поставить игнор на другие события от +пользователя, то в игнор на сервере он не добавится и вы будете по прежнему получать +от него все другие типы сообщений, например запросы на авторизацию, контакты и пр. + При добавлении пользователя в игнор, он из списка не исчезнет, чтобы он исчез из списка нужно снять напротив него галочку в списке игнора. Агент от Mail.ru одновременно с игнорированием скрывает пользователя из основного списка. + + При запросе на авторизацию, если нажать на Deny, то пользователь автоматически не добавляется в игнор ни на сервере ни локально, но можно послать ему сообщение в появившемся окошке для ввода причины отказа. + + You were added - означает что вас авторизовали. + + Запрос на авторизацию посылается автоматически, при добавлении в список (так устроен протокол: комманда добавления в список на сервере автоматически генерирует запрос на авторизацию, если пользователя ещё не было в списке на сервере). + + + Скрытые опции: + "MRA" +"NLBFailDirectConnect"(byte)=0 +В случае сбоя NLB сервера попытатся подключится напрямую к серверам mrim1.mail.ru - mrim8.mail.ru +По умолчанию отключено. + +"UseDisplayModuleName"(byte)=1 +Использовать имя протокола в качестве отображаемоемого названия +Требуется перезапуск. +По умолчанию включено. + +"MirVerCustom"(str)=NULL +Передавать заданную пользователем строку идентификации программы (которая отображается у собеседника), примеры: +{client="magent" version="5.3" build="2544"} +{client="jagent" version="2.1.8"} +{client="QIP Infium" version="2.0" build="9024"} +{client="magent" name="Miranda IM" title="Miranda IM 0.8.0.27 Unicode (MRA v1.16.0.4), version: 1.16" version="777.1.16.0" build="4" protocol="1.16"} +(значение переменной писать в базу без {} в начале и конце строки) + +"MirVerRaw"(byte)=0 +Писать "MirVer" без форматирования, как выдаёт сервер, получается больше информации. +По умолчанию отключено. + +"ConnectReTryCountMRIM"(dword)=2 +Колличество попыток подключится к серверу сообщений + +"ConnectReTryCountNLB"(dword)=3 +Колличество попыток подключится к серверу балансировки нагрузки + +"ConnectReTryCountFileSend"(dword)=2 +Колличество попыток подключится к ссобеседнику + +"ConnectReTryCountMRIMProxy"(dword)=3 +Колличество попыток подключится к ссобеседнику + +"TimeOutConnectMRIM"(dword)=16 *прим 1 +Время в секундах, в течении которого миранда ждёт ответа на подключение от сервера собщений +2-16 секунд. + +"TimeOutConnectNLB"(dword)=16 *прим 1 +Время в секундах, в течении которого миранда ждёт ответа на подключение от сервера балансировки нагрузки +2-16 секунд. + +"TimeOutReceiveNLB"(dword)=20 *прим 1 +Время в секундах, в течении которого миранда ждёт данных от сервера балансировки нагрузки +По умолчанию 20 секунд. + +"TimeOutConnectFileSend"(dword)=auto *прим 1 +Время в секундах, в течении которого миранда ждёт ответа на подключение от собеседника +Агент ждёт что к нему подключатся в течении 30 секунд, большое значение ставить смысла нет. +Не забывайте, что у собеседника может быть медленное подключение. +2-16 секунд. +По умолчанию auto секунд (= 30/колличество адресов к которым подключатся). + +"TimeOutReceiveFileData"(dword)=600 *прим 1 +Время в секундах, в течении которого миранда ждёт содержимое файла от собеседника +Не забывайте, что у собеседника может быть медленное подключение. +По умолчанию 600 секунд. + +*прим 1: Для медленных/не устойчивых соединений (особенно GPRS) рекомендуется поставить на максимум. +На быстрых соединениях, где не теряются пакеты, можно уменьшить до 5 секунд и менее. +0 - ожидать не ограниченно долго в случае чтения или использовать системныые значения при подключении + +*прим 2: При передаче файлов общий таймаут на все соединения =30 секунд, если поставить колличество +попыток подключения большим, то таймауты на каждое соединения снизятся до минимально возможных 2 секунд. +Аналогично дела обстоят с MRIM прокси тайаутами. +Для подключений к серверам майла (MRIM, NLB, Avatars) заданный таймаут применяется целиком для каждой +попытки подключения. + + + + "MRA Avatars" +"DefaultAvatarFileName"(str)="_default.jpg" +Имя файла, используемое в качестве аватара по умолчанию. + +"WorkThreadsCount"(dword)=4 +Колличество потоков для загрузки аватров. +Определяет сколько одновременно аватаров может скачиватся с сервера: от 1 до 64. +По умолчанию 4. + +"ConnectReTryCount"(dword)=3 +Колличество попыток подключится к серверу аватаров + +"TimeOutConnect"(dword)=16 +Время в секундах, в течении которого миранда ждёт ответа на подключение от сервера аватаров +Не забывайте, что у вас может быть медленное подключение. +2-16 секунд. + +"TimeOutReceive"(dword)=30 +Время в секундах, в течении которого миранда ждёт ответа от собеседника сервера аватаров +По умолчанию 30 секунд. + + + +Шаблон для mToolTip: +%sicon%photo +%#%lsstatus|%%%%|, %lsday|%%%%|.%lsmonth|%%%%|.%lsyear|%%%%| @ %lshours|%%%%|:%lsminutes|%%%%|:%lsseconds|%%%%| +%#%lname|%%%%| (%first|%%%%| %last|%%%%|%gender|, %%%%|) +%#Online since:%tab%logondate|%%%%| @ %logontime|%%%%| (%logonsince|%%%%|) +%%Email:%tab%tab%mail|%%%%| +%%Phone:%tab%phone|%%%%| +%%Cellular:%tab%cell|%%%%| +%#Age:%tab%tab%age|%%%%| (%bday|%%%%|.%bmonth|%%%%|.%byear|%%%%|)%dtb|, to birthday: %%%%| +%%Location:%tab%user_About|%%%%| +%#Сlient:%tab%tab%mver|%%%%| +%#IP:%tab%tab%ip|%%%% |%realip|(%%%%)| +%#Last info time:%infodate|%%%%| @ %infotime|%%%%| +%%Avatar upd time: %user_MRAAvatarLastModifiedTime|%%%%| +%#%smsg||%user_XStatusName||%user_XStatusMsg||%line% +%%%user_XStatusName|| +%%X-Status: %user_XStatusName|%%%%| +%%X-status message: %user_XStatusMsg|%%%%| +%%Blog message: %smsg||%smsg|%%%%| +%%Listening: %user_ListeningTo|%%%%| +%%%notes||———————————————————————————————————— +%%Notes:%notes|| +%%%notes|%%%%| +%%Logging:%tab%ilog|%%%%| +%#%lastmsg||%lastmsgdate||%lastmsgtime||———————————————————————————————————— +%#Last message (%lastmsgdate|%%%%| @ %lastmsgtime|%%%%|):%lastmsg|| +%#%lastmsg|%%%%|%lastmsgdate||%lastmsgtime|| + +в файл mToolTip.ini добавить: +[MRAAvatarLastCheckTime] +DBSet=AvatarLastCheckTime +DBTrans=1 + +[MRAAvatarLastModifiedTime] +DBSet=AvatarLastModifiedTime +DBTrans=1 + +[MRABlogStatus] +DBSet=BlogStatus + +[ListeningTo] +DBSet=ListeningTo + +[XStatusName] +DBSet=XStatusName + +[XStatusMsg] +DBSet=XStatusMsg + +[About] +DBSet=About + + + +Шаблон для Tipper YM от Black Roland ( http://www.rozhuk.org.ru/forum/index.php?action=profile;u=142 ) +http://www.rozhuk.org.ru/forum/index.php?topic=3.msg840#msg840 + + + +Change Log: + +Version 1.20.0.1 // 2008.10 + - Портабельность в x64 + - Добавлена поддержка отображения записей микроблога (как mode message) + - Добавлена поддержка отправки записей в микроблог: свой через главное меню, ответ через контекстное меню контакта + - Добавлена поддержка чата (конференций) + - Добавлен поиск по городам, сохранение параметров поиска + - Добавлен статус: знакомлюсь + - Добавлена поддержка Extra Icons Service (extraicons.dll) плагина + - Добавлена поддержка WATrack (watrack.dll) плагина + - Добавлена поддержка ListeningTo протокола/расширения + - Добавлена поддержка обмена файлами более 4Гб + - Добавлена обработка анси флага в сообщениях + - Добавлена опция в фильтр спама для игнорирования всего, кроме букв и цифр при проверке сообщения + - Добавлена опция в фильтр спама, позволяющая задать максимальное колличество смен языков (для случаев когда заменяют русские буквы на сходные по отображению иностранные) + - Добавлен WatchDog: если основной поток завершится с ошибкой - плагин перейдёт в оффлайн, если основной поток не оветит в течении минуты то будет уничтожен и плагин перейдёт в оффлайн + - Увеличена скорость проверки сообщений антиспамом + - Добавлены скрытые опции на колличество попыток исходящего подключения + - Улучшена поддержка аватаров: изменён путь для кеша аватаров на %miranda_avatarcache%; проверки на обновление аватаров при каждой смене онлайн статуса, но не чаще, чем в настройках + - Улучшен алгоритм поиска вспомогательных библиотек (zlib.dll, xstatus_MRA.dll) + - Уменьшено колличество обращений к базе при неудачных попытках подключения + - Пароль можно только установить, не отображается даже количество символов в диалоге настройки учётной записи + - Во всех меню и IcoLib используется юникод + - Иконки в IcoLib рассортированны по секциям + - Иконки Х-статусов добавлены в IcoLib + - Иконки Х-статусов и доп инфы разнесены в разные слоты, чтобы не перекрывать друг друга + - "BlogStatusMusic" переименовано в "ListeningTo" + - Пароль в базе хранится в шифрованном виде, для предотвращения использования утилит вытаскивающих пароль с базы и хищения паролей вирусами + - Уменьшен размер за счёт удаление всего CRT кода и сишных библиотек, сжата географическая база расширенного поиска + - В диалоге поиска и инфе контакта корректно выставляется возраст + - QueueUserAPC больше не используется, попапы показываются из основного потока + - Исправлен недочёт с некорректными именами файлов при приёме + - Исправлен недочёт, когда в некоторых случаях плагин не мог переподключится до перезапуска миранды + - Исправлено: с некоторыми версиями ядра плагин не мог найти библиотеку иконок х-статусов + - Исправлено: не подставлялся адрес почты, в случаях когда у контакта несколько почтовых ящиков + - Исправлено: антиспам мог удалить контакта из списка, в случае когда при логоне не был получен список пользователей с сервера + - Исправлено: после обновления информации контакта, если его ящик удалён с сервера - появится соотвествующая иконка + - Исправлено: при отсутствии xstatus_MRA.dll отображались произвольные иконки (demon_lite) + - Исправлено: аватары автоматически не обновлялись + - Исправлено: при запуске некоторые плагины устанавливали время последнего изменения статуса на время запуска миранды + - Исправлено: не удавалось принять файл на 0.8.0.30 и более поздних версиях миранды + - Исправлено: работа с псевдонимом (ником) контакта, который хранится на сервере: в агенте могли отображатся каракули после переименования контакта в миранде + - Исправлено: при приёме/отправке SMS сообщений не производилось кодирование спец символов для XML + - Исправлено: скрытая опция MirVerCustom не срабатывала + - Исправлено: короткие пароли невозможно было сохранить + +Version 1.16.0.3 // 2008.09.16 + - Поддержка Unicode протоколом + - Поддержка Folders плагина + - Добавлена опция: Пожаловатся на спам + - Автоматически определяется собственный внешний IP адрес + - Автоматически запрашивается информация и загружается автар для новых контактов + - Оптимизация работы с иконками, спасибо Г. Хазан + - В уведомлении о новой почте отображается аватарка и доп элементы управления, если отправитель в списке + - В уведомлении об изменении невидимости отображается аватарка и доп элементы управления + - В уведомлении блокированном как спам сообщении можно прочитать само сообщение + - Исправлена критическая ошибка, которая могла происходить после обмена файлами или при завершении приложения + - Исправлен недочёт: когда происходила ошибка при передаче файла миранда не сообщала об ошибке и продолжала находится в состоянии установления подключения + - Оптимизирована обработка сообщений + - Полностью обновлён алгоритм получения оффлайновых сообщений + + +Version 1.14.0.6 // 2008.02 + - Поддержка Unicode плагином + +Version 1.14.0.5 // 2008.01.30 + - Совместимость в 0.8 ядром миранды + - Исправлено: затиралась версия клиента при отключении + - Исправлено: вместо "Чат" выставлялся статус "Не беспокоить" + - другие мелкие исправления и улучшения + +Version 1.14.0.3 // 2008.01.20 + - Добавлена поддержка расширеных статусов + - Добавлена поддержка текстовых статусных сообщений + - Добавлено определение версии клиента собеседника через сервер + - Добавлен пункт меню для видео + - Добавлен пункт меню для ответов + - Добавлен пункт меню для мира + - Доработана отправка мультов + - Доработана отправка будильника + - Изменён формат номера при отправке SMS сообщений + - Изменена строка идентификации клиента (User agent), для статистики на сервере + - Исправлена отправка открыток + +Version 1.13.29.1 // 2007.08.10 + - Добавлена поддержка передачи файлов через прокси сервер mail.ru + - Оповещение новой почты показывает раширенную информацию + - Изменена работа с авторизацией: добавлено сообщение запроса, сообщения оторажаются + - Добавлены опции для автоматической раздачи авторизации + - Добавлена опция Click to Inbox (Проверить почту щелчком) + - zlib: загружается динамически (убран из кода) + - zlib: используется самый высокий уровень сжатия (9, вместо 6) + - Изменена работа спам фильтра: фильтруется всё, кроме: системных сообщений, контактов, смс сообщений/отчётов о доставке, будильника и уведомлений о наборе текста + - Улучшена совместимость с clist_modern + - Изменена работа со списком на сервере: не обновляются данные контактов в профиле при каждом входе + - Дополнительные телефонные номера сохраняются с сервера в список, при добавлении контакта + - Увеличена скорость загрузки/обновления аватаров + - При использование HTTPS прокси, порт заменяется на 443 (те игнорируется настройка порта в плагине) + - Уменьшена нагрузка на основной поток миранды + - Пополнен спам фильтр + - Исправлена ошибка: иногда протокол повторно не переподключался до перезапуска миранды + + +Version 1.8.0.27 // 2007.02.24 + - Улучшена поддержка RTF на передачу + - Исправлено: падение при получении некоторых сообщений с включённым антиспамом + - Исправлено: отображение пунктов меню для контактов + +Version 1.8.0.25 // 2007.02.20 + - Ипользуются новые сервисы миранды (минимум 0.6.0.100 версия) + - Улучшена работа с сетью: добавлены таймауты операций + - Добавлена поддержка игр (собеседник получает отказ автоматически :) ) + - Добавлены уведомления, в том числе затрагивающие невидимость + - Добавлена опция: Smart RTF - Умная отправка (только если клиент понимает RTF) + - Добавлены коды и подробные описания ошибок + - Добавлены опции для антиспама + - Уведомление о доставке сообщений признаных спамом не отправляется + - Список антиспама по умолчанию дополнен + - Корректно записывается версия миранды, плагина собеседника и наличие Secure IM + - Исправлено падение при обмене файлами + - и другие добавления, изменения и исправления + +Version 1.8.0.23 + - Добавлен антиспам + - Добавлена поддержка RTF на приём, см http://community.livejournal.com/ru_mirandaim/494383.html + - Улучшен конвертер исходящих сообщений в RTF: поддержка BB кодов (спасибо MadBrozzeR) + - Добавлена поддержка приёма сообщений Будильника (для отправки нужен Nudge плагин) и флеш мультиков (нужен обновлёный набор смайлов) + - Добавлена поддержка плагина Nudge (для будильника) + - Добавлено определение версии клиента собеседника + - Добавлен скрытый параметр "UseDisplayModuleName" + - Изменён алгоритм приёма (актуально для очень медленных и не устойчивых подключений и при большом контакт листе - около 1000 контактов) + - Повторяющиеся контакты фильтруются (больше нет предупреждения из за службы поддержки) + - Изменён алгоритм подключения: плагин не подключается, если не введён логин и пароль + +Version 1.8.0.21 + - Отправка SMS и получение ответов (требуется SMS.dll 0.2.4.9 и старше, см форум) + - Табы в настройках, добавленны опции + - Настройки попапов + - Иконка в трее при получении новой почты + - Совместимость со StartupStatus + - Собственный аватар отображается сразу после загрузки + - Изменён алгоритм загрузки аватаров для экономии траффика + - Оптимизированы конвертеры текста + - Исправлено: индикатор при передаче/приёме файла мог не доходить до 100%, но файл передавался полностью + - Исправлено: подсчёт возраста в диалоге рассширенного поиска + - Исправлено: алгоритм подключения, в том числе немедленное отключение при налиции пустого MRA контакта + - Исправлено: временные контакты больше не добавляются в список на сервер + +Version 1.8.0.19 // 2006.07.19 + - Добавлена поддержка IcoLib + - Показывается собственный аватар (загружается при логоне) + - Появилась возможность загружать несколько копий плагина + - "View Alboom" переименовано в "View Album" + - Иконки заменены более качественными, спасибо Михаилу Юрьеву + - Добавлена расширенная иконка для "Телефонных" контактов + - Телефонные контакты временно отключены (не будут отображатся) + - Исправлен алгоритм подключения и работы со статусом + +Version 1.8.0.17 // 2006.07.14 + - Не правильно работал игнор, ПРОВЕРЬТЕ ВАШ ИГНОР ЛИСТ! + - В окошке выбора e-mail записи больше не дублируются + - Пункты меню не скрывались для контактов у которых нет e-mail + - Не работали меню для своего альбома и блога + - При добавлении контакта посылалось два запроса + - Закреплена 1251 станица для конвертирования из юникодов + +Version 1.8.0.15 + - Добавлен пункт меню, позволяющий обновить информацию у всех контактов MRA + - Добавлен пункт меню, позволяющий обновить образы (аватарки) у всех контактов MRA + - Добавленна поддержка юникодов для ников (исправленна проблема с переименованием контактов, тестировалось на clist_mw.dll, clist_modern.dll - возможны проблемы.) + - Убраны проблемы совместимости с плагинами, которые считают что плагин не в сети (NewStatusNotify и проч) + - Отправлять открытки теперь можно любому контакту у которого есть email + - Можно смотреть фотоальбом и читать блог любого контакта, у которого прописан email относящийся к mail.ru + - Мелкие изменения (перманентное добавление в список - контакты оказывались скрытыми) + - Номера записываются раздельно: Основной телефон=primary, Доп. телефон 1=сотовый, Доп. телефон 2=факс + +Version 1.8.0.13 // 2006.06.23 + - Устранена утечка ресурсов при обновлении аватарок + - Изменён алгоритм переименовая контактов на сервере - меньше проблем с юникодами + +Version 1.8.0.11 // 2006.06.16 + - Добавлен пункт меню для быстрого входа в чат + - Добавлена расширенная иконка для контактов чьи ящики удалены с сервера + - Уточнены сообщения выводимые при передаче/приёме файлов + +Version 1.8.0.9 // 2006.06.12 + - Экстра иконки контактов других плагинов теперь не затираются + - Изменен набор опций для передачи файлов + +Version 1.8.0.7 // 2006.05.28 + - Добавлены экстра иконки для тех кто не авторизовал и кого нет в списке на сервере + - Исправлена ошибка, возникавшая при передаче более, чем одного файла + - Улучшен алгоритм передачи файлов + - Добавлена опция позволяющая отключить автоматическое добавление контактов на сервер + - Добавлен пункт меню, позволяющий запросить автоматически авторизацию у всех, кто ещё не атворизовал + +Version 1.8.0.5 // 2006.05.26 + - Улучшен алгоритм подключения: в случае сбоя NLB сервера начинаются попытки подключения напрямую к серверам mrim1.mail.ru - mrim8.mail.ru + +Version 1.8.0.3 // 2006.04.03 + - Измён алгоритм расчёта времени оффлайновых сообщений + - Аватар по умолчанию больше не удаляется при удалении контактов + - Добавлена опция для отключения загрузки аватар из сети + - Добавлена опция позволяющая скрыть свой IP адрес при обмене файлами (отправляется 192.168.0.1:26775, возможно из за этого не удастся обменятся файлами) + - Добавлена опция позволяющая указать дополнительные адреса и порты (может пригодится тем кто за NAT и тп) + - Добавлена опция опция позволяющая задать порт для обмена файлами (в некоторых случаях нельзя будет принимать/передавать более, чем одному человеку одновременно) + +Version 1.8.0.1 // 2006.03.16 + - Полная поддержка передачи файлов + - Мелкие изменения + +Version 1.0.0.33 // 2006.03.11 + - Добавлена поддержка зеркальных соединений + - Добавлена запись в базу "MirVer", для лучшей совместимости с fingerprint + - Исправлена ошибка при отправке сообщений с включённым преобразованием смайликов + +Version 1.0.0.31 // 2006.03.05 + - Профиксена обработка анкетных данных + - "Undefined message deliver error" - больше не появляется + +Version 1.0.0.29 // 2006.02.17 + - Реализовано получение файлов + - Аватары заработали через прокси (спасибо Yuri Ermakov) + - Преобразование смаликов в теги для отправляемого текста можно отключить совсем + +Version 1.0.0.27 // 2006.01.27 + - Улучшена работа со списком на сервере + - Улучшен алгоритм поиска контактов + +Version 1.0.0.25 // 2006.01.17 + - Пустой аватар больше не скачивается, показывается: MRA\_default.jpg + - По умолчанию файл аватара удаляется при удалении контакта + - Убрана зависимость от msvcr70.dll + +Version 1.0.0.23 // 2006.01.16 + - Исправлено преобразование смайлов в теги. + +Version 1.0.0.21 // 2006.01.15 + - Добавлено прозрачное преобразование смайлов в теги и обратно, в тч для обычного текста + +Version 1.0.0.19 // 2006.01.15 + - Добавлена поддержка RTF сообщений на отправку, и смайлов отображаемых в агенте + - Добавлена настройка указывающая плагину возвращать полный путь к файлу аватара + - Добавлен пункт меню для быстрого доступа к собственному фотоальбому + - Улучшен алгоритм подключения (получение информации от NLB сервера) + - "Запрос на авторизацию" и уведомление "Вас добавили" записываются в системную историю + - Отправить открытку работало не для всех пользователей + +Version 1.0.0.17 // 2006.01.13 + - Улучшена работа на быстрых соединениях + +Version 1.0.0.15 // 2006.01.10 + - Исправленно: уведомление "вам пишут" воспринималось как сообщение (только в 1.0.0.11) + +Version 1.0.0.11 // 2006.01.10 + - Добавлен пункт меню для быстрого доступа к собственному блогу + - Добавлен пункт меню для Zhuki.mail.ru + - Более корректно вычисляется возраст + - Очистка очереди не отправленных/не доставленных сообщений + +Version 1.0.0.9 // 2006.01.07 + - TzSpecificLocalTimeToSystemTime больше не используется, для совместимости с Microsoft Windows 2000 + +Version 1.0.0.7 // 2006.01.06 + - Теперь статус ящика можно посмотреть через пунк в меню (количество не прочитанных/всего сообщений) + - Добавлен звук при приходе новой почты + - Можно быстро отправить поздравительную открытку, добавлен пункт меню + - Добавлен пункт меню для чтения блога пользователя + - Добавлен поиск в вебе от Mail.ru + - Улучшена обработка списка с сервера, при первом запуске: автоматичеки загружается информация и аватары + - Исправлено: в расширенном поиске требовалось задать город + +Version 1.0.0.5 // 2006.01.03 + - Убрано сообщение о неверных данных для временных контактов. + - Более корректно выставляется статус. + - Улучшен алгоритм подключения. + - "MRA_proto.dll" переименован в "proto_MRA.dll". + - Список стран сортируется по алфавиту. + +Version 1.0.0.3 // 2005.12.31 + - Первый публичный релиз \ No newline at end of file diff --git a/MRA/Sdk/Base64.h b/MRA/Sdk/Base64.h new file mode 100644 index 0000000..f371399 --- /dev/null +++ b/MRA/Sdk/Base64.h @@ -0,0 +1,380 @@ +/* + * Copyright (c) 2003 Rozhuk Ivan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + +#if !defined(AFX_BASE64__H__INCLUDED_) +#define AFX_BASE64__H__INCLUDED_ + + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + +//typedef unsigned char BYTE; +// +// BASE64 coding: +// 214 46 138 +// 11010100 00101110 10001010 +// ! ! ! +// ---------->>> convert 3 8bit to 4 6bit +// 110101 000010 111010 001010 +// 53 2 58 10 +// this numbers is offset in array coding below... +// + //01234567890123456789012345 +static BYTE *pbtCodingTableBASE64=(BYTE*)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; //52...63 +static BYTE btDeCodingTableBASE64[256]={64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,62,64,64,64,63,52,53,54,55,56,57,58,59,60,61,64,64,64,64,64,64,64,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,64,64,64,64,64,64,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64}; + + + + +__inline void BASE64CopyUnSafe(LPCVOID lpcSource,LPCVOID lpcDestination,SIZE_T dwSize,SIZE_T *pdwCopyedSize) +{// копируем только б64 символы + LPBYTE lpbSource,lpbDestination; + + lpbSource=(LPBYTE)lpcSource; + lpbDestination=(LPBYTE)lpcDestination; + while(dwSize--) + { + if ((*lpbSource)>32 && (*lpbSource)<128) (*lpbDestination++)=(*lpbSource); + lpbSource++; + } + if (pdwCopyedSize) (*pdwCopyedSize)=((SIZE_T)lpbDestination-(SIZE_T)lpcDestination); +} + + + +__inline DWORD BASE64EncodeUnSafe(LPCVOID lpcSource,SIZE_T dwSourceSize,LPCVOID lpcDestination,SIZE_T dwDestinationSize,SIZE_T *pdwEncodedSize) +{// BASE64 кодирование + DWORD dwRetErrorCode; + SIZE_T dwEncodedSize=((dwSourceSize*4+11)/12*4+1);//(((dwSourceSize+2)/3)*4); + + if ((dwDestinationSize>2]; // c1 + *(lpbtDestination++)=pbtCodingTableBASE64[(((*lpbtSource)<<4)&060) | ((lpbtSource[1]>>4)&017)]; // c2 + *(lpbtDestination++)=pbtCodingTableBASE64[((lpbtSource[1]<<2)&074) | ((lpbtSource[2]>>6)&03)]; // c3 + *(lpbtDestination++)=pbtCodingTableBASE64[lpbtSource[2] & 077]; // c4 + lpbtSource+=3; + } + + // If dwSourceSize was not a multiple of 3, then we have encoded too many characters. Adjust appropriately. + if(i==(dwSourceSize+1)) + {// There were only 2 bytes in that last group + lpbtDestination[-1]='='; + }else + if(i==(dwSourceSize+2)) + {// There was only 1 byte in that last group + lpbtDestination[-1]='='; + lpbtDestination[-2]='='; + } + + (*lpbtDestination)=0; + dwEncodedSize=(lpbtDestination-((LPBYTE)lpcDestination)); + +#else + __asm{ + push ebx // сохраняем регистр + push edi // сохраняем регистр + push esi // сохраняем регистр + + mov ebx,pbtCodingTableBASE64// ebx = адрес таблицы перекодировки + mov ecx,dwSourceSize // ecx = длинна входного буффера + mov edi,lpcDestination // edi = адрес выходного буффера + mov esi,lpcSource // esi = указатель на входной буффер + cld + jmp short read_loop_cmp + + //////////Code function/////////////////////////////////////////// + // функция кодировки + // eax - входящий буффер, используется только 3 байта //in buff, 3 byte used + // eax - выходящий буффер, используется 4 байта //out buff, 4 byte used + code_func: + // третья версия функции разложения, + // меняем местами два крайних байта + bswap eax + rol eax,6 + shl al,2 + ror eax,10 + shr ax,2 + shr al,2 + xlat + rol eax,8 + xlat + rol eax,8 + xlat + rol eax,8 + xlat + rol eax,8 + bswap eax// 188-235 + ret + ////////////////////////////////////////////////////////////////// + + /////////////Read & converting cycle////////////////////////////// + read_loop: + lodsd // читаем 4 байта + dec esi // используем только 3 + and eax,0x00FFFFFF + //==================================================== + // третья версия функции разложения, + // меняем местами два крайних байта + bswap eax + rol eax,6 + shl al,2 + ror eax,10 + shr ax,2 + shr al,2 + xlat + rol eax,8 + xlat + rol eax,8 + xlat + rol eax,8 + xlat + rol eax,8 + bswap eax + //==================================================== + stosd + sub ecx,3 + + read_loop_cmp: + cmp ecx,3 // проверяем, чтобы длинна была как минимум 4 байта + jg short read_loop // если длинна 3 и более байт, то продолжаем дальше + + ///////////////////////////////////////////////////////////////// + xor eax,eax // обнуляем регистр + cmp ecx,3 // сравниваем длинну с 3 + je short tree_byte_tail// если длинна 3 байта, то переходим к функции обрабатывающей остаток такой длинны + cmp ecx,2 // сравниваем длинну с 2 + je short two_byte_tail // если длинна 2 байта, то переходим к функции обрабатывающей остаток такой длинны + // иначе, длинна остатка равна 1 + //////////tail 1 byte//////////////////////////////////////////// + mov al,byte ptr [esi] // читаем 1 байт + call code_func // преобразуем + and eax,0x0000FFFF // обнуляем последние два байта + or eax,0x3D3D0000 // записываем в последние два байта 61("=") + jmp short end_tail_handler // + + //////////tail 2 byte//////////////////////////////////////////// + two_byte_tail: + mov ax,word ptr [esi] // читаем 2 байта + call code_func // преобразуем + and eax,0x00FFFFFF // обнуляем последний байт + or eax,0x3D000000 // записываем в последний байт 61("=") + jmp short end_tail_handler // + + //////////tail 3 byte//////////////////////////////////////////// + tree_byte_tail: + lodsw + ror eax,16 + mov al,byte ptr [esi] // читаем 1 байт + rol eax,16 + call code_func // преобразуем + + end_tail_handler: + stosd // записываем 4 байта, уже закодированных + + sub edi,lpcDestination // вычисляем колличество байт, записанных в выходной буффер + mov dwEncodedSize,edi // записываем колличество байт в возвращаемую переменную + pop esi // восстанавливаем содержимое регистра + pop edi // восстанавливаем содержимое регистра + pop ebx // восстанавливаем содержимое регистра + } +#endif + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } + } + if (pdwEncodedSize) (*pdwEncodedSize)=dwEncodedSize; + +return(dwRetErrorCode); +} + + +__inline DWORD BASE64Encode(LPCVOID lpcSource,SIZE_T dwSourceSize,LPCVOID lpcDestination,SIZE_T dwDestinationSize,SIZE_T *pdwEncodedSize) +{// BASE64 кодирование + DWORD dwRetErrorCode; + + __try + { + dwRetErrorCode=BASE64EncodeUnSafe(lpcSource,dwSourceSize,lpcDestination,dwDestinationSize,pdwEncodedSize); + }__except(EXCEPTION_EXECUTE_HANDLER){ + dwRetErrorCode=ERROR_INVALID_ADDRESS; + } +return(dwRetErrorCode); +} + + + +__inline DWORD BASE64DecodeUnSafe(LPCVOID lpcSource,SIZE_T dwSourceSize,LPCVOID lpcDestination,SIZE_T dwDestinationSize,SIZE_T *pdwDecodedSize) +{// BASE64 декодирование + DWORD dwRetErrorCode; + SIZE_T dwDecodedSize=((dwSourceSize>>2)*3);// ((dwSourceSize/4)*3); + + if ((dwDestinationSize3) + { +#ifdef _WIN64 + LPBYTE lpbtSource=(LPBYTE)lpcSource,lpbtDestination=(LPBYTE)lpcDestination; + + for(SIZE_T i=0;i> 4); + *(lpbtDestination++)=(unsigned char) (btDeCodingTableBASE64[lpbtSource[1]] << 4 | btDeCodingTableBASE64[lpbtSource[2]] >> 2); + *(lpbtDestination++)=(unsigned char) (btDeCodingTableBASE64[lpbtSource[2]] << 6 | btDeCodingTableBASE64[lpbtSource[3]]); + lpbtSource+=4; + } + + dwDecodedSize=(lpbtDestination-((LPBYTE)lpcDestination)); + if((*((BYTE*)lpcSource+(dwSourceSize-1)))=='=') dwDecodedSize--; + if((*((BYTE*)lpcSource+(dwSourceSize-2)))=='=') dwDecodedSize--; + + +#else + __asm{ + push ebx // сохраняем регистр + push edi // сохраняем регистр + push esi // сохраняем регистр + + mov ebx,offset btDeCodingTableBASE64// ebx = адрес таблицы перекодировки + mov ecx,dwSourceSize // ecx = длинна входного буффера + mov edi,lpcDestination // edi = адрес выходного буффера + mov esi,lpcSource // esi = указатель на входной буффер + cld + + read_loop: + lodsd // читаем 4 байта + //===============bit conversion==================================== + // eax - входящий буффер, используется только 4 байта //in buff, 4 byte used + // eax - выходящий буффер, используется только 3 байта //out buff, 3 byte used + // третья версия функции сложения бит + bswap eax + + ror eax,8 + xlat + + ror eax,8 + xlat + + ror eax,8 + xlat + + ror eax,8 + xlat + + shl al,2 + shl ax,2 + rol eax,10 + shr al,2 + ror eax,6 + bswap eax + mov edx,eax + //234-250 + //=============================================================== + stosd + dec edi + sub ecx,4 + cmp ecx,3 + jg short read_loop + + sub edi,lpcDestination // вычисляем колличество байт, записанных в выходной буффер + mov dwDecodedSize,edi // записываем колличество байт в возвращаемую переменную + pop esi // восстанавливаем содержимое регистра + pop edi // восстанавливаем содержимое регистра + pop ebx // восстанавливаем содержимое регистра + } + + if((*((BYTE*)lpcSource+(dwSourceSize-1)))=='=') dwDecodedSize--; + if((*((BYTE*)lpcSource+(dwSourceSize-2)))=='=') dwDecodedSize--; +#endif + dwRetErrorCode=NO_ERROR; + }else{// во входном буффере слишком мало данных + dwRetErrorCode=ERROR_INSUFFICIENT_BUFFER; + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } + } + + if (pdwDecodedSize) (*pdwDecodedSize)=dwDecodedSize; +return(dwRetErrorCode); +} + + +__inline DWORD BASE64Decode(LPCVOID lpcSource,SIZE_T dwSourceSize,LPCVOID lpcDestination,SIZE_T dwDestinationSize,SIZE_T *pdwDecodedSize) +{// BASE64 декодирование + DWORD dwRetErrorCode; + + __try + { + dwRetErrorCode=BASE64DecodeUnSafe(lpcSource,dwSourceSize,lpcDestination,dwDestinationSize,pdwDecodedSize); + }__except(EXCEPTION_EXECUTE_HANDLER){ + dwRetErrorCode=ERROR_INVALID_ADDRESS; + } +return(dwRetErrorCode); +} + + +__inline DWORD BASE64DecodeFormated(LPCVOID lpcSource,SIZE_T dwSourceSize,LPCVOID lpcDestination,SIZE_T dwDestinationSize,SIZE_T *pdwDecodedSize) +{// BASE64 декодирование и игнорирование форматирования + DWORD dwRetErrorCode; + + if (dwSourceSize<=dwDestinationSize) + { + BASE64CopyUnSafe(lpcSource,lpcDestination,dwSourceSize,&dwSourceSize); + dwRetErrorCode=BASE64DecodeUnSafe(lpcDestination,dwSourceSize,lpcDestination,dwDestinationSize,pdwDecodedSize); + }else{// во входном буффере слишком мало данных + dwRetErrorCode=ERROR_INSUFFICIENT_BUFFER; + } + +return(dwRetErrorCode); +} + + + +#endif // !defined(AFX_BASE64__H__INCLUDED_) diff --git a/MRA/Sdk/BuffToLowerCase.h b/MRA/Sdk/BuffToLowerCase.h new file mode 100644 index 0000000..0cb0eb3 --- /dev/null +++ b/MRA/Sdk/BuffToLowerCase.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2003 Rozhuk Ivan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + +#if !defined(AFX_BUFFTOLOWERCASE__H__INCLUDED_) +#define AFX_BUFFTOLOWERCASE__H__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + +__inline BOOL BuffToLowerCase(LPCVOID lpcOutBuff,LPCVOID lpcBuff,SIZE_T dwLen) +{ + BOOL bRet=TRUE; + +#if defined(_WIN64) || !defined(_WIN32) + if (lpcOutBuff && lpcBuff && dwLen) + { + BYTE bt; + LPBYTE lpbtIn=(LPBYTE)lpcBuff,lpbtOut=(LPBYTE)lpcOutBuff; + + for(SIZE_T i=dwLen;i;i--) + { + bt=(*(lpbtIn++)); + if (bt>='A' && bt<='Z') bt|=32; + (*(lpbtOut++))=bt; + } + } +#else + __asm + { + mov ecx,dwLen + test ecx,ecx + jz short end_func + + push ebx // сохраняем регистр + push edi // сохраняем регистр + push esi // сохраняем регистр + mov esi,lpcBuff + mov edi,lpcOutBuff + mov bl,'A' + mov bh,'Z' + mov ah,32 + cld + + lowcaseloop: + lodsb + cmp al,bl + jl short savebyte + cmp al,bh + jg short savebyte + or al,ah + + savebyte: + stosb + + dec ecx + jnz short lowcaseloop + + pop esi // восстанавливаем содержимое регистра + pop edi // восстанавливаем содержимое регистра + pop ebx // восстанавливаем содержимое регистра + end_func: + } +#endif +return(bRet); +} + + + + +#endif // !defined(AFX_BUFFTOLOWERCASE__H__INCLUDED_) \ No newline at end of file diff --git a/MRA/Sdk/DebugFunctions.h b/MRA/Sdk/DebugFunctions.h new file mode 100644 index 0000000..6bd9df5 --- /dev/null +++ b/MRA/Sdk/DebugFunctions.h @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2004 Rozhuk Ivan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + + +#if !defined(AFX_DEBUG_FUNCTIONS__H__INCLUDED_) +#define AFX_DEBUG_FUNCTIONS__H__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#ifndef szCRLF +#define szCRLF TEXT("\r\n") +#endif +////////////////////////////////////////////////////////////////////////// +////////////////////////////DebugPrint//////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +// DebugBuildPrint(Helo world); +// Отображение текста в Debug окне во время отладки +#ifdef _DEBUG + #define DebugPrintA(szText) OutputDebugStringA((szText)) + #define DebugPrintW(szText) OutputDebugStringW((szText)) + #define DebugPrintCRLFA(szText) OutputDebugStringA((szText));OutputDebugStringA("\r\n") + #define DebugPrintCRLFW(szText) OutputDebugStringW((szText));OutputDebugStringW(L"\r\n") +#else + #define DebugPrintA(szText) + #define DebugPrintW(szText) + #define DebugPrintCRLFA(szText) + #define DebugPrintCRLFW(szText) +#endif //_DEBUG + + +#ifdef UNICODE + #define DebugPrint DebugPrintW + #define DebugPrintCRLF DebugPrintCRLFW +#else + #define DebugPrint DebugPrintA + #define DebugPrintCRLF DebugPrintCRLFA +#endif +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + + + + +////////////////////////////////////////////////////////////////////////// +////////////////////////////DebugBuildPrint/////////////////////////////// +////////////////////////////////////////////////////////////////////////// +// #pragma DebugBuildPrint(Helo world); +// Отображение сообщений в Build окне во время компиляции +#ifdef _DEBUG + #pragma warning(disable:4081) + #define chSTR2(x) #x + #define chSTR(x) chSTR2(x) + #define DebugBuildPrint(szText) message(__FILE__ "(" chSTR(__LINE__) "): " #szText) + #pragma warning(default:4081) +#else + #define DebugBuildPrint(szText) +#endif //_DEBUG +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + + + + +////////////////////////////////////////////////////////////////////////// +////////////////////////////DebugBufferFill/////////////////////////////// +////////////////////////////////////////////////////////////////////////// +// DebugBufferFill(szString,sizeof(szString)); +// Полностью заполняет переданный буффер символом "A", применяется +// для выходного буффера на входе в функцию. +#ifdef _DEBUG + #define DebugBufferFill(lpBuffer,dwSize) memset(lpBuffer,'A',dwSize) +#else + #define DebugBufferFill(lpBuffer,dwSize) +#endif //_DEBUG +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + + + + +////////////////////////////////////////////////////////////////////////// +////////////////////////////DebugBreak//////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +// DebugBreak(); +// Точка останова, более удобная альтернатива API +#if defined(_DEBUG) + #if defined(_X86_) + #define DebugBreak() _asm{int 3} + #else + #include + #define DebugBreak() __debugbreak() + #endif +#else + #define DebugBreak() +#endif //_DEBUG +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////// +////////////////////////////DebugBreakIf////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +// DebugBreakIf(); +// Точка останова, более удобная альтернатива API, срабатывает при условии +#if defined(_DEBUG) + #define DebugBreakIf(a) if ((a)) DebugBreak(); +#else + #define DebugBreakIf(a) +#endif //_DEBUG +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + + + + +#endif // !defined(AFX_DEBUG_FUNCTIONS__H__INCLUDED_) diff --git a/MRA/Sdk/FIFOMT.h b/MRA/Sdk/FIFOMT.h new file mode 100644 index 0000000..f0776cb --- /dev/null +++ b/MRA/Sdk/FIFOMT.h @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2003 Rozhuk Ivan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + + +#if !defined(AFX_FIFO_MT__H__INCLUDED_) +#define AFX_FIFO_MT__H__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + +#include +#include + + + + + +typedef LIST_MT FIFO_MT, *PFIFO_MT, *LPFIFO_MT; +typedef PCLIST_MT PCFIFO_MT, LPCFIFO_MT; + +typedef LIST_MT_ITEM FIFO_MT_ITEM, *PFIFO_MT_ITEM, *LPFIFO_MT_ITEM; +typedef PCLIST_MT_ITEM PCFIFO_MT_ITEM, LPCFIFO_MT_ITEM; + +typedef LIST_MT_ITERATOR FIFO_MT_ITERATOR, *PFIFO_MT_ITERATOR, *LPFIFO_MT_ITERATOR; +typedef PCLIST_MT_ITERATOR PCFIFO_MT_ITERATOR, LPCFIFO_MT_ITERATOR; + + + + + + +#define FifoMTInitialize(pcpmtFifoMT,dwSpinCount) ListMTInitialize(pcpmtFifoMT,dwSpinCount) +#define FifoMTDestroy(pcpmtFifoMT) ListMTDestroy(pcpmtFifoMT) + + +__inline SIZE_T FifoMTItemPush(PCFIFO_MT pcpmtFifoMT,PCFIFO_MT_ITEM pcffmtiFifoItem,LPVOID lpData) +{ + SIZE_T dwRet; + + ListMTLock(pcpmtFifoMT); + dwRet=ListMTItemAdd(pcpmtFifoMT,pcffmtiFifoItem,lpData); + ListMTUnLock(pcpmtFifoMT); + +return(dwRet); +} + + +__inline DWORD FifoMTItemPop(PCFIFO_MT pcpmtFifoMT,PFIFO_MT_ITEM *ppffmtiFifoItem,LPVOID *plpData) +{ + DWORD dwRetErrorCode; + PLIST_MT_ITEM plmtiItem; + + ListMTLock(pcpmtFifoMT); + if ((dwRetErrorCode=ListMTItemGetFirst(pcpmtFifoMT,&plmtiItem,plpData))==NO_ERROR) + { + if (ppffmtiFifoItem) (*ppffmtiFifoItem)=plmtiItem; + dwRetErrorCode=ListMTItemDelete(pcpmtFifoMT,plmtiItem); + } + ListMTUnLock(pcpmtFifoMT); + +return(dwRetErrorCode); +} + + +__inline DWORD FifoMTItemGetFirst(PCFIFO_MT pcpmtFifoMT,PFIFO_MT_ITEM *ppffmtiFifoItem,LPVOID *plpData) +{ + DWORD dwRetErrorCode; + + ListMTLock(pcpmtFifoMT); + dwRetErrorCode=ListMTItemGetFirst(pcpmtFifoMT,ppffmtiFifoItem,plpData); + ListMTUnLock(pcpmtFifoMT); + +return(dwRetErrorCode); +} + + +__inline DWORD FifoMTItemGetLast(PCFIFO_MT pcpmtFifoMT,PFIFO_MT_ITEM *ppffmtiFifoItem,LPVOID *plpData) +{ + DWORD dwRetErrorCode; + + ListMTLock(pcpmtFifoMT); + dwRetErrorCode=ListMTItemGetLast(pcpmtFifoMT,ppffmtiFifoItem,plpData); + ListMTUnLock(pcpmtFifoMT); + +return(dwRetErrorCode); +} + + +#define FifoMTGetCount(pcpmtFifoMT) ListMTGetCount(pcpmtFifoMT) + +#define FifoMTTryLock(pcpmtFifoMT) ListMTTryLock(pcpmtFifoMT) +#define FifoMTLock(pcpmtFifoMT) ListMTLock(pcpmtFifoMT) +#define FifoMTUnLock(pcpmtFifoMT) ListMTUnLock(pcpmtFifoMT) + +#define FifoMTItemSwap(pcpmtFifoMT,pcffmtiFifoItem1,pcffmtiFifoItem2) ListMTItemSwap(pcpmtFifoMT,pcffmtiFifoItem1,pcffmtiFifoItem2) + +#define FifoMTIteratorMoveFirst(pcpmtFifoMT,pffmtiIterator) ListMTIteratorMoveFirst(pcpmtFifoMT,pffmtiIterator) +#define FifoMTIteratorMoveLast(pcpmtFifoMT,pffmtiIterator) ListMTIteratorMoveLast(pcpmtFifoMT,pffmtiIterator) +#define FifoMTIteratorMovePrev(pffmtiIterator) ListMTIteratorMovePrev(pffmtiIterator) +#define FifoMTIteratorMoveNext(pffmtiIterator) ListMTIteratorMoveNext(pffmtiIterator) +#define FifoMTIteratorGet(pffmtiIterator,ppffmtiFifoItem,plpData) ListMTIteratorGet(pffmtiIterator,ppffmtiFifoItem,plpData) + + + + +#endif // !defined(AFX_FIFO_MT__H__INCLUDED_) diff --git a/MRA/Sdk/InterlockedFunctions.h b/MRA/Sdk/InterlockedFunctions.h new file mode 100644 index 0000000..742f904 --- /dev/null +++ b/MRA/Sdk/InterlockedFunctions.h @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2003 Rozhuk Ivan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + + +#if !defined(AFX_INTERLOCKED_FUNCTIONS__H__INCLUDED_) +#define AFX_INTERLOCKED_FUNCTIONS__H__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + + + +#ifdef InterlockedCompareExchange +#ifndef InterlockedAnd +LONG FORCEINLINE InterlockedAnd(LONG volatile *Destination,LONG Value) +{ + LONG Old; + + do + { + Old=*Destination; + }while(InterlockedCompareExchange(Destination,(Old&Value),Old)!=Old); +return(Old); +} +#endif //InterlockedAnd + + +#ifndef InterlockedOr +LONG FORCEINLINE InterlockedOr(LONG volatile *Destination,LONG Value) +{ + LONG Old; + + do + { + Old=*Destination; + }while(InterlockedCompareExchange(Destination,(Old|Value),Old)!=Old); +return(Old); +} +#endif //InterlockedOr + + +#ifndef InterlockedXor +LONG FORCEINLINE InterlockedXor(LONG volatile *Destination,LONG Value) +{ + LONG Old; + + do + { + Old=*Destination; + }while(InterlockedCompareExchange(Destination,(Old^Value),Old)!=Old); +return(Old); +} +#endif //InterlockedXor +#endif //InterlockedCompareExchange + + + + + +#ifdef InterlockedCompareExchange64 +#ifndef InterlockedAnd64 +LONGLONG FORCEINLINE InterlockedAnd64(LONGLONG volatile *Destination,LONGLONG Value) +{ + LONGLONG Old; + + do + { + Old=*Destination; + }while(InterlockedCompareExchange64(Destination,(Old&Value),Old)!=Old); +return(Old); +} +#endif //InterlockedAnd64 + + +#ifndef InterlockedOr64 +LONGLONG FORCEINLINE InterlockedOr64(LONGLONG volatile *Destination,LONGLONG Value) +{ + LONGLONG Old; + + do + { + Old=*Destination; + }while(InterlockedCompareExchange64(Destination,(Old|Value),Old)!=Old); +return(Old); +} +#endif //InterlockedOr64 + + +#ifndef InterlockedXor64 +LONGLONG FORCEINLINE InterlockedXor64(LONGLONG volatile *Destination,LONGLONG Value) +{ + LONGLONG Old; + + do + { + Old=*Destination; + }while(InterlockedCompareExchange64(Destination,(Old^Value),Old)!=Old); +return(Old); +} +#endif //InterlockedXor64 +#endif //InterlockedCompareExchange64 + + + + + +#ifndef InterlockedIncrementPointer +#if defined(_WIN64) +#define InterlockedIncrementPointer(lpAddend) (LPVOID)InterlockedIncrement64((LONGLONG volatile*)lpAddend) +#else +#define InterlockedIncrementPointer(lpAddend) (LPVOID)InterlockedIncrement((LONG volatile*)lpAddend) +#endif +#endif //InterlockedIncrementPointer + + +#ifndef InterlockedDecrementPointer +#if defined(_WIN64) +#define InterlockedDecrementPointer(lpAddend) (LPVOID)InterlockedDecrement64((LONGLONG volatile*)lpAddend) +#else +#define InterlockedDecrementPointer(lpAddend) (LPVOID)InterlockedDecrement((LONG volatile*)lpAddend) +#endif +#endif //InterlockedDecrementPointer + + + + + +#endif // !defined(AFX_INTERLOCKED_FUNCTIONS__H__INCLUDED_) diff --git a/MRA/Sdk/InternetTime.h b/MRA/Sdk/InternetTime.h new file mode 100644 index 0000000..9999119 --- /dev/null +++ b/MRA/Sdk/InternetTime.h @@ -0,0 +1,473 @@ +/* + * Copyright (c) 2003 Rozhuk Ivan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + + +#if !defined(AFX_INTERNET_TIME_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) +#define AFX_INTERNET_TIME_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + +#include +#include +#include + + + +typedef struct +{ + LONG lTimeZone; + SYSTEMTIME stTime; +} INTERNET_TIME; + + +static LPCSTR lpcszenmMonthEnum[13]= {"---","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; +static LPCSTR lpcszenmDayOfWeakEnum[7]= {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; + +#define CRLF "\r\n" +#define LF "\n" +//WSP++ +#define LWSHT "\r\n\t" +#define LWSSP "\r\n " +//WSP-- + +//FWS++ +#define FWSHT LWSHT +#define FWSSP LWSSP +//FWS-- + +#define SEPARATOR "\r\n\r\n" + + +//DWORD InternetTimeGetTime (LPCSTR lpszTime,SIZE_T dwTimeSize,INTERNET_TIME *pitTime); +//BOOL SkeepSPWSP (LPCSTR lpszBuff,SIZE_T dwBuffSize,LPSTR *plpszRetBuff,SIZE_T *pdwRetBuffSize); +//BOOL WSP2SP (LPCSTR lpszBuff,SIZE_T dwBuffSize,LPSTR lpszRetBuff,SIZE_T *pdwRetBuffSize); + + + + + +__inline BOOL SkeepSPWSP(LPCSTR lpszBuff,SIZE_T dwBuffSize,LPSTR *plpszRetBuff,SIZE_T *pdwRetBuffSize) +{ + BOOL bRet=TRUE; + + if (lpszBuff && dwBuffSize && (plpszRetBuff || pdwRetBuffSize)) + { + while ((*lpszBuff)<33 && dwBuffSize) + { + dwBuffSize--; + lpszBuff++; + } + + if (plpszRetBuff) (*plpszRetBuff)=(LPSTR)lpszBuff; + if (pdwRetBuffSize) (*pdwRetBuffSize)=dwBuffSize; + }else{ + bRet=FALSE; + } +return(bRet); +} + + +__inline BOOL WSP2SP(LPCSTR lpszBuff,SIZE_T dwBuffSize,LPSTR lpszRetBuff,SIZE_T *pdwRetBuffSize) +{// WSP->SP + BOOL bRet=TRUE; + + if (lpszBuff && dwBuffSize && lpszRetBuff) + { + LPSTR lpszCurReadPos,pCRLF,lpszCurWritePos; + SIZE_T dwToCopy,dwRetBuffSize; + + pCRLF=(LPSTR)lpszBuff; + lpszCurReadPos=(LPSTR)lpszBuff; + lpszCurWritePos=lpszRetBuff; + dwRetBuffSize=0; + + while(pCRLF) + { + pCRLF=(LPSTR)MemoryFind((pCRLF-lpszBuff),lpszBuff,(dwBuffSize-1),CRLF,2); + if (pCRLF) + { + pCRLF+=2; + if ((*pCRLF)==9 || (*pCRLF)==32)// LWS: || + { + dwToCopy=((pCRLF-2)-lpszCurReadPos); + pCRLF++; + + memmove((LPVOID)lpszCurWritePos,(CONST VOID*)lpszCurReadPos,dwToCopy); + dwRetBuffSize+=(dwToCopy+1); + lpszCurWritePos+=dwToCopy; + lpszCurWritePos[0]=32; + lpszCurWritePos++; + lpszCurReadPos=pCRLF; + } + }else{ + dwToCopy=((lpszBuff+dwBuffSize)-lpszCurReadPos); + dwRetBuffSize+=dwToCopy; + memmove((LPVOID)lpszCurWritePos,(CONST VOID*)lpszCurReadPos,dwToCopy); + } + } + + if (pdwRetBuffSize) (*pdwRetBuffSize)=dwRetBuffSize; + }else{ + bRet=FALSE; + } +return(bRet); +} + + + +__inline BOOL HT2SP(LPCSTR lpszBuff,SIZE_T dwBuffSize,LPSTR lpszRetBuff,SIZE_T *pdwRetBuffSize) +{// HT->SP + BOOL bRet=TRUE; + + if (lpszBuff && dwBuffSize && lpszRetBuff) + { + LPSTR lpszCurReadPos,pHT,lpszCurWritePos; + SIZE_T dwToCopy,dwRetBuffSize; + + pHT=(LPSTR)lpszBuff; + lpszCurReadPos=(LPSTR)lpszBuff; + lpszCurWritePos=lpszRetBuff; + dwRetBuffSize=0; + + while(pHT) + { + pHT=(LPSTR)MemoryFind((pHT-lpszBuff),lpszBuff,dwBuffSize,"\t",1); + if (pHT) + { + dwToCopy=(pHT-lpszCurReadPos); + pHT++; + + dwRetBuffSize+=(dwToCopy+1); + memmove((LPVOID)lpszCurWritePos,(CONST VOID*)lpszCurReadPos,dwToCopy); + lpszCurWritePos+=dwToCopy; + lpszCurWritePos[0]=32; + lpszCurWritePos++; + lpszCurReadPos=pHT; + }else{ + dwToCopy=((lpszBuff+dwBuffSize)-lpszCurReadPos); + dwRetBuffSize+=dwToCopy; + memmove((LPVOID)lpszCurWritePos,(CONST VOID*)lpszCurReadPos,dwToCopy); + } + } + + if (pdwRetBuffSize) (*pdwRetBuffSize)=dwRetBuffSize; + }else{ + bRet=FALSE; + } +return(bRet); +} + + + + +__inline BOOL CleanUnneededSP(LPCSTR lpszBuff,SIZE_T dwBuffSize,LPSTR lpszRetBuff,SIZE_T *pdwRetBuffSize) +{// nSP->SP, SPCRLF->CRLF, CRLFSP->CRLF + BOOL bRet=TRUE; + + if (lpszBuff && dwBuffSize && lpszRetBuff) + { + LPSTR lpszCurReadPos,pSP,pSPStart,pSPEnd,lpszCurWritePos,pEnd; + SIZE_T dwToCopy,dwRetBuffSize; + + pSP=(LPSTR)lpszBuff; + lpszCurReadPos=(LPSTR)lpszBuff; + lpszCurWritePos=lpszRetBuff; + pEnd=((LPSTR)lpszBuff+dwBuffSize); + dwRetBuffSize=0; + + while(pSP) + { + pSP=(LPSTR)MemoryFind((pSP-lpszBuff),lpszBuff,dwBuffSize," ",1); + if (pSP) + { + dwToCopy=(pSP-lpszCurReadPos); + pSPStart=pSP; + pSPEnd=pSP; + while((*pSPEnd)==32 && pSPEndlpszBuff) + { + if ((*((WORD*)(pSPStart-2)))!=(*((WORD*)CRLF))) dwToCopy++; + }else{// buff start + if (pSPStart>lpszBuff) dwToCopy++; + } + + // check SP on line end + if ((pSPEnd+1)<=pEnd) + { + if ((*((WORD*)pSPEnd))!=(*((WORD*)CRLF))) dwToCopy++; + }else{// buff start + if (pSPEnd>lpszBuff) dwToCopy++; + } + + memmove((LPVOID)lpszCurWritePos,(CONST VOID*)lpszCurReadPos,dwToCopy); + lpszCurWritePos+=dwToCopy; + dwRetBuffSize+=dwToCopy; + lpszCurReadPos=pSPEnd; + pSP=pSPEnd; + }else{ + dwToCopy=((lpszBuff+dwBuffSize)-lpszCurReadPos); + dwRetBuffSize+=dwToCopy; + memmove((LPVOID)lpszCurWritePos,(CONST VOID*)lpszCurReadPos,dwToCopy); + } + } + + if (pdwRetBuffSize) (*pdwRetBuffSize)=dwRetBuffSize; + }else{ + bRet=FALSE; + } +return(bRet); +} + + + + +__inline SIZE_T CopyText(LPVOID lpOutBuff,LPCVOID lpcBuff,SIZE_T dwLen) +{ + SIZE_T dwRet=0; + + if (lpOutBuff && lpcBuff && dwLen) + { + BYTE bt; + LPBYTE lpbtIn=(LPBYTE)lpcBuff,lpbtOut=(LPBYTE)lpOutBuff; + + for(SIZE_T i=dwLen;i;i--) + { + bt=(*(lpbtIn++)); + if (bt<127 && (bt>31 || bt==9 || bt==10 || bt==13)) + { + (*(lpbtOut++))=bt; + dwRet++; + } + } + } +return(dwRet); +} + + +__inline void InternetTimeGetCurrentTime(INTERNET_TIME *pitTime) +{ + TIME_ZONE_INFORMATION tzi={0}; + GetTimeZoneInformation(&tzi); + pitTime->lTimeZone=tzi.Bias; + GetSystemTime(&pitTime->stTime); +} + + +__inline DWORD InternetTimeGetString(INTERNET_TIME *pitTime,LPSTR lpszBuff,SIZE_T dwBuffSize,SIZE_T *pdwBuffSizeRet) +{// Переводит время из MAILTIME в строковое + DWORD dwRet=NO_ERROR; + + if (dwBuffSize>31) + { + LPSTR lpszCurPos=lpszBuff; + SIZE_T dwTimeLen=0,dwtm; + + // day of weak// date of mounth// mounth name// year// hours // minutes// seconds + dwtm=wsprintfA(lpszCurPos,"%s, %02lu %s %04lu %02lu:%02lu:%02lu ",lpcszenmDayOfWeakEnum[pitTime->stTime.wDayOfWeek],pitTime->stTime.wDay,lpcszenmMonthEnum[pitTime->stTime.wMonth],pitTime->stTime.wYear,pitTime->stTime.wHour,pitTime->stTime.wMinute,pitTime->stTime.wSecond); + lpszCurPos+=dwtm; + dwTimeLen+=dwtm; + + // time zone + if (pitTime->lTimeZone) + { + if (pitTime->lTimeZone < 0) + {// нужно добавить плюсик, минус добавляется автоматом + (*((BYTE*)lpszCurPos))='+'; + lpszCurPos++; + dwTimeLen++; + } + + dwtm=wsprintfA(lpszCurPos,"%04ld",-(((pitTime->lTimeZone/60)*100)+pitTime->lTimeZone%60)); + lpszCurPos+=dwtm; + dwTimeLen+=dwtm; + }else{ + dwtm=wsprintfA(lpszCurPos,"GMT"); + lpszCurPos+=dwtm; + dwTimeLen+=dwtm; + } + + if (pdwBuffSizeRet) (*pdwBuffSizeRet)=dwTimeLen; + }else{// переданный буффер слишком мал + if (pdwBuffSizeRet) (*pdwBuffSizeRet)=32; + dwRet=ERROR_INSUFFICIENT_BUFFER; + } +return(dwRet); +} + + + +__inline DWORD InternetTimeGetTime(LPCSTR lpszTime,SIZE_T dwTimeSize,INTERNET_TIME *pitTime) +{// Переводит время из строкового в INTERNET_TIME + DWORD dwRet=NO_ERROR; + + if (lpszTime && dwTimeSize && dwTimeSize<4097 && pitTime) + {// = Thu, 21 May 1998 05:33:29 -0700 = + char sztmBuff[4096]; + LPSTR lpszCurPos=sztmBuff,lpszTemp; + SIZE_T i,dwCurSize=4096,dwTemp; + + memset(pitTime, 0, sizeof(INTERNET_TIME)); + WSP2SP((LPSTR)lpszTime,dwTimeSize,lpszCurPos,&dwCurSize); + + if (dwCurSize>3) + {// день недели + if (lpszCurPos[3]==',') + { + for (i=0;i<8;i++) + { + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpcszenmDayOfWeakEnum[i],3,lpszCurPos,3)==CSTR_EQUAL) + { + pitTime->stTime.wDayOfWeek=(unsigned short)i; + break; + } + } + + lpszCurPos+=4; + dwCurSize-=4; + } + + if (dwCurSize>2) + {// день месяца + SkeepSPWSP(lpszCurPos,dwCurSize,&lpszCurPos,&dwCurSize); + if ((lpszTemp=(LPSTR)MemoryFindByte(0,lpszCurPos,dwCurSize,' '))) + { + dwTemp=(lpszTemp-lpszCurPos); + pitTime->stTime.wDay=(unsigned short)StrToUNum32(lpszCurPos,dwTemp); + + lpszCurPos=(lpszTemp+1); + dwCurSize-=(dwTemp+1); + + if (dwCurSize>3) + {// месяц + SkeepSPWSP(lpszCurPos,dwCurSize,&lpszCurPos,&dwCurSize); + + for (i=1;i<14;i++) + { + if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpcszenmMonthEnum[i],3,lpszCurPos,3)==CSTR_EQUAL) + { + pitTime->stTime.wMonth=(unsigned short)i; + break; + } + } + + lpszCurPos+=3; + dwCurSize-=3; + + + if (dwCurSize>3) + {// год + SkeepSPWSP(lpszCurPos,dwCurSize,&lpszCurPos,&dwCurSize); + if ((lpszTemp=(LPSTR)MemoryFindByte(0,lpszCurPos,dwCurSize,' '))) + { + dwTemp=(lpszTemp-lpszCurPos); + pitTime->stTime.wYear=(unsigned short)StrToUNum32(lpszCurPos,dwTemp); + + lpszCurPos=(lpszTemp+1); + dwCurSize-=(dwTemp+1); + + if (dwCurSize>2) + { // часы + SkeepSPWSP(lpszCurPos,dwCurSize,&lpszCurPos,&dwCurSize); + if ((lpszTemp=(LPSTR)MemoryFindByte(0,lpszCurPos,dwCurSize,':'))) + { + dwTemp=(lpszTemp-lpszCurPos); + pitTime->stTime.wHour=(unsigned short)StrToUNum32(lpszCurPos,dwTemp); + + lpszCurPos=(lpszTemp+1); + dwCurSize-=(dwTemp+1); + + if (dwCurSize>2) + {// минуты + SkeepSPWSP(lpszCurPos,dwCurSize,&lpszCurPos,&dwCurSize); + if ((lpszTemp=(LPSTR)MemoryFindByte(0,lpszCurPos,dwCurSize,':'))) + { + dwTemp=(lpszTemp-lpszCurPos); + pitTime->stTime.wMinute=(unsigned short)StrToUNum32(lpszCurPos,dwTemp); + + lpszCurPos=(lpszTemp+1); + dwCurSize-=(dwTemp+1); + + if (dwCurSize>2) + {// секунды, они есть + if ((lpszTemp=(LPSTR)MemoryFindByte(0,lpszCurPos,dwCurSize,' '))) + { + dwTemp=(lpszTemp-lpszCurPos); + pitTime->stTime.wSecond=(unsigned short)StrToUNum32(lpszCurPos,dwTemp); + + lpszCurPos=(lpszTemp+1); + dwCurSize-=(dwTemp+1); + } + }else{// зоны нет + if (dwCurSize) + { + pitTime->stTime.wSecond=(unsigned short)StrToUNum32(lpszCurPos,dwCurSize); + lpszCurPos+=dwCurSize; + dwCurSize=0; + } + } + }else{ + if ((lpszTemp=(LPSTR)MemoryFindByte(0,lpszCurPos,dwCurSize,' '))) + { + dwTemp=(lpszTemp-lpszCurPos); + pitTime->stTime.wMinute=(unsigned short)StrToUNum32(lpszCurPos,dwTemp); + + lpszCurPos=(lpszTemp+1); + dwCurSize-=(dwTemp+1); + } + } + + if (dwCurSize) + {// часовой пояс + SkeepSPWSP(lpszCurPos,dwCurSize,&lpszCurPos,&dwCurSize); + pitTime->lTimeZone=(LONG)StrToNum(lpszCurPos,dwCurSize); + if (pitTime->lTimeZone>1300 || pitTime->lTimeZone<-1200) pitTime->lTimeZone=2400; + } + } + } + } + } + } + } + } + } + } + }else{ + dwRet=ERROR_INVALID_HANDLE; + } +return(dwRet); +} + + + +#endif // !defined(AFX_INTERNET_TIME_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/MRA/Sdk/ListMT.h b/MRA/Sdk/ListMT.h new file mode 100644 index 0000000..66e1188 --- /dev/null +++ b/MRA/Sdk/ListMT.h @@ -0,0 +1,358 @@ +/* + * Copyright (c) 2003 Rozhuk Ivan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + + +#if !defined(AFX_LIST_MT__H__INCLUDED_) +#define AFX_LIST_MT__H__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + +#include + +#if defined(_MSC_VER) +#if _MSC_VER >= 800 +#if _MSC_VER >= 1200 +#pragma warning(push) +#endif +#pragma warning(disable:4312) // warning C4312: 'type cast' : conversion from 'LONG' to 'PVOID' of greater size +#endif +#endif + + +// структура для работы со списком, элемент списка +typedef struct _LIST_MT_ITEM +{ +#ifdef __cplusplus + _LIST_MT_ITEM *plmtiPrev; // *предыдущий элемент в списке + _LIST_MT_ITEM *plmtiNext; // *следующий элемент в списке +#else + LPVOID *plmtiPrev; // *предыдущий элемент в списке + LPVOID *plmtiNext; // *следующий элемент в списке +#endif + LPVOID lpListMT; // указатель на заголовок списка, см структуру ниже + LPVOID lpData; // указатель на данные, связанные с элементом списка +}LIST_MT_ITEM, *PLIST_MT_ITEM, *LPLIST_MT_ITEM; +typedef CONST PLIST_MT_ITEM PCLIST_MT_ITEM, LPCLIST_MT_ITEM; + + +// структура для работы со списком, заголовок списка +typedef struct _LIST_MT +{ + SIZE_T nCount; // *колличество элементов в списке + PLIST_MT_ITEM plmtiFirst; // *указывает на первый элемент в списке + PLIST_MT_ITEM plmtiLast; // *указывает на последний элемент в списке + CRITICAL_SECTION cs; // *section for exclysive access to List +}LIST_MT, *PLIST_MT, *LPLIST_MT; +typedef CONST PLIST_MT PCLIST_MT, LPCLIST_MT; + + +// структура для работы с итератором +typedef struct _LIST_MT_ITERATOR +{ + PLIST_MT_ITEM plmtListMTItem; +}LIST_MT_ITERATOR, *PLIST_MT_ITERATOR, *LPLIST_MT_ITERATOR; +//typedef LIST_MT_ITEM LIST_MT_ITERATOR, *PLIST_MT_ITERATOR, *LPLIST_MT_ITERATOR; +typedef CONST PLIST_MT_ITERATOR PCLIST_MT_ITERATOR, LPCLIST_MT_ITERATOR; + + + + +__inline DWORD ListMTInitialize(PCLIST_MT pclmtListMT,DWORD dwSpinCount) +{ + DWORD dwRetErrorCode; + +#if (_WIN32_WINNT >= 0x0403) + if (InitializeCriticalSectionAndSpinCount(&pclmtListMT->cs,((dwSpinCount)? (dwSpinCount | 0x80000000):0L))) +#else + InitializeCriticalSection(&pclmtListMT->cs); + if (TRUE) +#endif + { + InterlockedExchangePointer((volatile PVOID*)&pclmtListMT->nCount,NULL); + pclmtListMT->plmtiFirst=NULL; + pclmtListMT->plmtiLast=NULL; + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=GetLastError(); + } +return(dwRetErrorCode); +} + + +__inline void ListMTDestroy(PCLIST_MT pclmtListMT) +{ + InterlockedExchangePointer((volatile PVOID*)&pclmtListMT->nCount,NULL); + pclmtListMT->plmtiFirst=NULL; + pclmtListMT->plmtiLast=NULL; + DeleteCriticalSection(&pclmtListMT->cs); + SecureZeroMemory(&pclmtListMT->cs,sizeof(CRITICAL_SECTION)); +} + + +__inline BOOL ListMTTryLock(PCLIST_MT pclmtListMT) +{ +#if (_WIN32_WINNT >= 0x0400) + return(TryEnterCriticalSection(&pclmtListMT->cs)); +#else + return(FALSE); +#endif +} + + +__inline void ListMTLock(PCLIST_MT pclmtListMT) +{ + EnterCriticalSection(&pclmtListMT->cs); +} + + +__inline void ListMTUnLock(PCLIST_MT pclmtListMT) +{ + LeaveCriticalSection(&pclmtListMT->cs); +} + + +__inline SIZE_T ListMTGetCount(PCLIST_MT pclmtListMT) +{ + return((SIZE_T)InterlockedCompareExchangePointer((LPVOID*)&pclmtListMT->nCount,NULL,NULL)); +} + + +__inline SIZE_T ListMTItemAdd(PCLIST_MT pclmtListMT,PCLIST_MT_ITEM pclmtListMTItem,LPVOID lpData) +{ + SIZE_T dwRet=(SIZE_T)InterlockedIncrementPointer(&pclmtListMT->nCount);//pclmtListMT->nCount++; + pclmtListMTItem->lpData=lpData; + pclmtListMTItem->lpListMT=pclmtListMT; + + if (pclmtListMT->plmtiLast) + {// add node to end of list + pclmtListMTItem->plmtiPrev=pclmtListMT->plmtiLast; + pclmtListMTItem->plmtiNext=NULL; + pclmtListMT->plmtiLast->plmtiNext=pclmtListMTItem; + pclmtListMT->plmtiLast=pclmtListMTItem; + }else{// add the first node to the linked list + pclmtListMTItem->plmtiPrev=NULL; + pclmtListMTItem->plmtiNext=NULL; + pclmtListMT->plmtiFirst=pclmtListMTItem; + pclmtListMT->plmtiLast=pclmtListMTItem; + } + +return(dwRet); +} + + +__inline DWORD ListMTItemDelete(PCLIST_MT pclmtListMT,PCLIST_MT_ITEM pclmtListMTItem) +{ + DWORD dwRetErrorCode; + + if (pclmtListMTItem->lpListMT==pclmtListMT && pclmtListMT) + {// Данный элемент принадлежит к этому списку, можно удалить. + PLIST_MT_ITEM plmtiPrevNode=pclmtListMTItem->plmtiPrev,plmtiNextNode=pclmtListMTItem->plmtiNext; + + if (plmtiPrevNode || plmtiNextNode) + { + if (plmtiPrevNode && plmtiNextNode==NULL) + {// This is the start node in the list to delete + // отключился последний подключившийся + plmtiPrevNode->plmtiNext=NULL; + pclmtListMT->plmtiLast=plmtiPrevNode; + }else{ + if (plmtiPrevNode==NULL && plmtiNextNode) + {// This is the end node in the list to delete + // отключился первый подключившийся + plmtiNextNode->plmtiPrev=NULL; + pclmtListMT->plmtiFirst=plmtiNextNode; + }else{// оключился клиент не первый и не последний + //if (plmtiPrev && plmtiNext) + {// Neither start node nor end node in the list + plmtiPrevNode->plmtiNext=plmtiNextNode; + plmtiNextNode->plmtiPrev=plmtiPrevNode; + } + } + } + }else{// This is the only node in the list to delete + pclmtListMT->plmtiFirst=NULL; + pclmtListMT->plmtiLast=NULL; + } + + pclmtListMTItem->lpListMT=NULL; + InterlockedDecrementPointer(&pclmtListMT->nCount);// pclmtListMT->nCount--; + dwRetErrorCode=NO_ERROR; + }else{// попытались удалить элемент не относящийся к данному списку + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +__inline LPVOID ListMTItemDataGet(PCLIST_MT_ITEM pclmtListMTItem) +{ + return(pclmtListMTItem->lpData); +} + + +__inline void ListMTItemDataSet(PCLIST_MT_ITEM pclmtListMTItem, LPVOID lpData) +{ + pclmtListMTItem->lpData=lpData; +} + + +__inline DWORD ListMTItemGetFirst(PCLIST_MT pclmtListMT,PLIST_MT_ITEM *pplmtListMTItem,LPVOID *plpData) +{// если нужно гарантировать эксклюзивный доступ, то есть ListMTLock и ListMTUnLock + DWORD dwRetErrorCode; + + if (pclmtListMT->plmtiFirst) + { + if (pplmtListMTItem) (*pplmtListMTItem)=pclmtListMT->plmtiFirst; + if (plpData) (*plpData)=pclmtListMT->plmtiFirst->lpData; + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=ERROR_NO_MORE_ITEMS; + } +return(dwRetErrorCode); +} + + +__inline DWORD ListMTItemGetLast(PCLIST_MT pclmtListMT,PLIST_MT_ITEM *pplmtListMTItem,LPVOID *plpData) +{// если нужно гарантировать эксклюзивный доступ, то есть ListMTLock и ListMTUnLock + DWORD dwRetErrorCode; + + if (pclmtListMT->plmtiLast) + { + if (pplmtListMTItem) (*pplmtListMTItem)=pclmtListMT->plmtiLast; + if (plpData) (*plpData)=pclmtListMT->plmtiLast->lpData; + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=ERROR_NO_MORE_ITEMS; + } +return(dwRetErrorCode); +} + + + +__inline void ListMTItemSwap(PCLIST_MT pclmtListMT,PCLIST_MT_ITEM pclmtListMTItem1,PCLIST_MT_ITEM pclmtListMTItem2) +{// поменять два элемента списка местами, даже если они из разных списков + + if (pclmtListMTItem1!=pclmtListMTItem2) + {// это разные элементы списка + PLIST_MT_ITEM lpTemp; + + lpTemp=pclmtListMTItem1->plmtiPrev; + if ((pclmtListMTItem1->plmtiPrev=pclmtListMTItem2->plmtiPrev)==NULL) + {// pclmtListMTItem2 был первым, обновляем заголвок листа, теперь первый pclmtListMTItem1 + pclmtListMT->plmtiFirst=pclmtListMTItem1; + } + + if ((pclmtListMTItem2->plmtiPrev=lpTemp)==NULL) + {// pclmtListMTItem1 был первым, обновляем заголвок листа, теперь первый pclmtListMTItem2 + pclmtListMT->plmtiFirst=pclmtListMTItem2; + } + + + lpTemp=pclmtListMTItem1->plmtiNext; + if ((pclmtListMTItem1->plmtiNext=pclmtListMTItem2->plmtiNext)==NULL) + {// pclmtListMTItem2 был последним, обновляем заголвок листа, теперь последний pclmtListMTItem1 + pclmtListMT->plmtiLast=pclmtListMTItem1; + } + + if ((pclmtListMTItem2->plmtiNext=lpTemp)==NULL) + {// pclmtListMTItem1 был последним, обновляем заголвок листа, теперь последний pclmtListMTItem2 + pclmtListMT->plmtiLast=pclmtListMTItem2; + } + } +} + + +__inline BOOL ListMTIteratorMoveFirst(PCLIST_MT pclmtListMT,PCLIST_MT_ITERATOR pclmtiIterator) +{// если нужно гарантировать эксклюзивный доступ, то есть ListMTLock и ListMTUnLock + return((pclmtiIterator->plmtListMTItem=pclmtListMT->plmtiFirst)? TRUE:FALSE); +} + + +__inline BOOL ListMTIteratorMoveLast(PCLIST_MT pclmtListMT,PCLIST_MT_ITERATOR pclmtiIterator) +{// если нужно гарантировать эксклюзивный доступ, то есть ListMTLock и ListMTUnLock + return((pclmtiIterator->plmtListMTItem=pclmtListMT->plmtiLast)? TRUE:FALSE); +} + + +__inline BOOL ListMTIteratorMovePrev(PCLIST_MT_ITERATOR pclmtiIterator) +{// если нужно гарантировать эксклюзивный доступ, то есть ListMTLock и ListMTUnLock + BOOL bRet=FALSE; + + if (pclmtiIterator->plmtListMTItem) + { + if (pclmtiIterator->plmtListMTItem=pclmtiIterator->plmtListMTItem->plmtiPrev) bRet=TRUE; + } +return(bRet); +} + + +__inline BOOL ListMTIteratorMoveNext(PCLIST_MT_ITERATOR pclmtiIterator) +{// если нужно гарантировать эксклюзивный доступ, то есть ListMTLock и ListMTUnLock + BOOL bRet=FALSE; + + if (pclmtiIterator->plmtListMTItem) + { + if (pclmtiIterator->plmtListMTItem=pclmtiIterator->plmtListMTItem->plmtiNext) bRet=TRUE; + } +return(bRet); +} + + +__inline DWORD ListMTIteratorGet(PCLIST_MT_ITERATOR pclmtiIterator,PLIST_MT_ITEM *pplmtListMTItem,LPVOID *plpData) +{// если нужно гарантировать эксклюзивный доступ, то есть ListMTLock и ListMTUnLock + DWORD dwRetErrorCode; + + if (pclmtiIterator->plmtListMTItem) + { + if (pplmtListMTItem) (*pplmtListMTItem)=pclmtiIterator->plmtListMTItem; + if (plpData) (*plpData)=pclmtiIterator->plmtListMTItem->lpData; + dwRetErrorCode=NO_ERROR; + }else{ + dwRetErrorCode=ERROR_NO_MORE_ITEMS; + } +return(dwRetErrorCode); +} + + + +#if defined(_MSC_VER) +#if _MSC_VER >= 800 +#if _MSC_VER >= 1200 +#pragma warning(pop) +#else +#pragma warning(default:4312) // warning C4312: 'type cast' : conversion from 'LONG' to 'PVOID' of greater size +#endif +#endif +#endif + + + +#endif // !defined(AFX_LIST_MT__H__INCLUDED_) diff --git a/MRA/Sdk/MemoryCompare.h b/MRA/Sdk/MemoryCompare.h new file mode 100644 index 0000000..17ef96f --- /dev/null +++ b/MRA/Sdk/MemoryCompare.h @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2003 Rozhuk Ivan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + + +#if !defined(AFX_MEMORYCOMPARE__H__INCLUDED_) +#define AFX_MEMORYCOMPARE__H__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + +// If the string pointed to by lpString1 is less than the string pointed +// to by lpString2, the return value is negative. +// If the string pointed to by lpString1 is greater than the string pointed +// to by lpString2, the return value is positive. +// If the strings are equal, the return value is zero. +// +// lpString1> ret=1=CSTR_LESS_THAN +// lpString1=lpString2 >> ret=2=CSTR_EQUAL +// lpString1>lpString2 >> ret=3=CSTR_GREATER_THAN + +#define CMEM_EQUAL 0 +#define CMEM_GREATER_THAN 1 +#define CMEM_LESS_THAN 2 + + +__inline unsigned int MemoryCompare(const void *pBuff1,size_t dwBuff1Size,const void *pBuff2,size_t dwBuff2Size) +{ + unsigned int uiRet; + + if (dwBuff1Size==dwBuff2Size) + { + if (pBuff1==pBuff2) + { + uiRet=CMEM_EQUAL; + }else{ + if (pBuff1 && pBuff2) + { + int iRet; + + iRet=memcmp(pBuff1,pBuff2,dwBuff1Size); + if (iRet==0) + { + uiRet=CMEM_EQUAL; + }else{ + if (iRet<0) + { + uiRet=CMEM_GREATER_THAN; + }else{ + uiRet=CMEM_LESS_THAN; + } + } + }else{ + if (pBuff1) + {//pBuff2==NULL + uiRet=CMEM_GREATER_THAN; + }else{//pBuff1==NULL + uiRet=CMEM_LESS_THAN; + } + } + } + }else{ + if (dwBuff1Size + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + +#if !defined(AFX_MEMORYFIND__H__INCLUDED_) +#define AFX_MEMORYFIND__H__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + +__inline void *MemoryFind(size_t dwFrom,const void *pBuff,size_t dwBuffSize,const void *pWhatFind,size_t dwWhatFindSize) +{ + void *pRet=NULL; + + if (pBuff && dwBuffSize && pWhatFind && dwWhatFindSize && (dwFrom+dwWhatFindSize)<=dwBuffSize) + { + if (dwWhatFindSize==1) + {// MemoryFindByte + pRet=(void*)memchr((const void*)(((size_t)pBuff)+dwFrom),(*((unsigned char*)pWhatFind)),(dwBuffSize-dwFrom)); + }else{ + void *pCurPos; + + pCurPos=(void*)(((size_t)pBuff)+dwFrom); + + if ((dwFrom+dwWhatFindSize)==dwBuffSize) + {// only MemoryCompare + if (memcmp(pCurPos,pWhatFind,dwWhatFindSize)==0) pRet=pCurPos; + }else{ + dwBuffSize-=(dwWhatFindSize-1); + + while(pCurPos) + { + pCurPos=memchr(pCurPos,(*((unsigned char*)pWhatFind)),(dwBuffSize-(((size_t)pCurPos)-((size_t)pBuff)))); + if (pCurPos) + { + if (memcmp(pCurPos,pWhatFind,dwWhatFindSize)==0) + { + pRet=pCurPos; + break; + }else{ + pCurPos=(void*)(((size_t)pCurPos)+1); + } + } + } + } + } + } +return(pRet); +} + + +#endif // !defined(AFX_MEMORYFIND__H__INCLUDED_) diff --git a/MRA/Sdk/MemoryFindByte.h b/MRA/Sdk/MemoryFindByte.h new file mode 100644 index 0000000..a18a721 --- /dev/null +++ b/MRA/Sdk/MemoryFindByte.h @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2003 Rozhuk Ivan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + + +#if !defined(AFX_MEMORYFINDBYTE__H__INCLUDED_) +#define AFX_MEMORYFINDBYTE__H__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + +__inline void *MemoryFindByte(size_t dwFrom,const void *pBuff,size_t dwBuffSize,unsigned char chWhatFind) +{ + void *pRet=NULL; + + if (pBuff && dwBuffSize && dwFromdwFrom + jae short end_func + + std //; count 'up' on string this time + sub ecx,eax //; уменьшаем длинну на dwFrom(нач смещен) + add edi,ecx //; сдвигаем начало на dwSourceSize(на конец) + mov al,chWhatFind //; al=search byte + repne scasb //; find that byte + inc edi //; di points to byte which stopped scan + cmp [edi],al //; see if we have a hit + jne short end_func //; yes, point to byte + mov pRet,edi //; ax=pointer to byte + end_func: + + cld + pop esi // восстанавливаем содержимое регистра + pop edi // восстанавливаем содержимое регистра + pop ebx // восстанавливаем содержимое регистра + } +return(pRet); +} +#endif + + +#endif // !defined(AFX_MEMORYFINDBYTE__H__INCLUDED_) diff --git a/MRA/Sdk/MemoryReplace.h b/MRA/Sdk/MemoryReplace.h new file mode 100644 index 0000000..c911ccf --- /dev/null +++ b/MRA/Sdk/MemoryReplace.h @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2010 Rozhuk Ivan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + +#if !defined(AFX_MEMORY_REPLACE__H__INCLUDED_) +#define AFX_MEMORY_REPLACE__H__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + +#ifndef DebugBreak +#define DebugBreak() +#endif + + +#ifdef MEMALLOC +#define MEMORY_REPLACE_MEMALLOC(Size) MEMALLOC(Size) +#define MEMORY_REPLACE_MEMFREE(Mem) MEMFREE(Mem) +#else +#define MEMORY_REPLACE_MEMALLOC(Size) malloc(((Size)+sizeof(void*))) +#define MEMORY_REPLACE_MEMFREE(Mem) if ((Mem)) {free((void*)(Mem));(Mem)=NULL;} +#endif + + +// 0 - all ok +// -1 - bad params +// -2 - small dst buff +// -3 - memory allocation failed + +__inline int MemoryReplaceEx(void *pSrcBuff,size_t dwSrcBuffSize,size_t dwReplaceItemsCount,void **ppInReplaceItems,size_t *pdwInReplaceItemsCounts,void **ppOutReplaceItems,size_t *pdwOutReplaceItemsCounts,void *pDstBuff,size_t dwDstBuffSize,size_t *pdwDstBuffSize,size_t *pdwReplacesCount) +{ + int iRet=-1; + + if (pSrcBuff && dwSrcBuffSize && (dwReplaceItemsCount==0 || (dwReplaceItemsCount && ppInReplaceItems && pdwInReplaceItemsCounts && ppOutReplaceItems && pdwOutReplaceItemsCounts)) && pDstBuff && dwDstBuffSize) + { + if (dwReplaceItemsCount==0) + {// no replace, copy mem + if (dwDstBuffSize>=dwSrcBuffSize) + { + memmove(pDstBuff,pSrcBuff,dwSrcBuffSize); + if (pdwDstBuffSize) (*pdwDstBuffSize)=dwSrcBuffSize; + if (pdwReplacesCount) (*pdwReplacesCount)=0; + iRet=0; + }else{// small dst buff + iRet=-2; + } + }else{ + unsigned char **ppFounded; + + ppFounded=(unsigned char**)MEMORY_REPLACE_MEMALLOC((sizeof(unsigned char*)*dwReplaceItemsCount)); + if (ppFounded) + { + unsigned char *pDstBuffCur,*pSrcBuffCur,*pSrcBuffCurPrev,*pDstBuffMax; + size_t i,dwFirstFoundedIndex,dwFoundedCount,dwMemPartToCopy,dwReplacesCount; + + pSrcBuffCurPrev=(unsigned char*)pSrcBuff; + pDstBuffCur=(unsigned char*)pDstBuff; + pDstBuffMax=(((unsigned char*)pDstBuff)+dwDstBuffSize); + dwFirstFoundedIndex=0; + dwFoundedCount=0; + dwReplacesCount=0; + + for(i=0;i(pDstBuffCur+(dwMemPartToCopy+pdwInReplaceItemsCounts[dwFirstFoundedIndex]))) + { + dwReplacesCount++; + memmove(pDstBuffCur,pSrcBuffCurPrev,dwMemPartToCopy);pDstBuffCur+=dwMemPartToCopy; + memmove(pDstBuffCur,ppOutReplaceItems[dwFirstFoundedIndex],pdwOutReplaceItemsCounts[dwFirstFoundedIndex]);pDstBuffCur+=pdwOutReplaceItemsCounts[dwFirstFoundedIndex]; + pSrcBuffCurPrev=(ppFounded[dwFirstFoundedIndex]+pdwInReplaceItemsCounts[dwFirstFoundedIndex]); + + for(i=0;i + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + + +#if !defined(AFX_RC4__H__INCLUDED_) +#define AFX_RC4__H__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + +__inline void RC4(LPBYTE lpBuff,SIZE_T dwBuffSize,LPBYTE lpKey,SIZE_T dwKeySize) +{// RC4 +// www.codeproject.com/cpp/crypt_routine.asp%3Fdf%3D100%26forumid%3D4418%26exp%3D0%26select%3D251879+RC4+c%2B%2B+source+DWORD&hl=ru&gl=ru&ct=clnk&cd=2 +// http://www.thecodeproject.com/cpp/crypt_routine.asp +// http://forum.ixbt.com/topic.cgi?id=40:3020 + + //we will consider size of sbox 256 bytes + //(extra byte are only to prevent any mishep just in case) + BYTE temp; + BYTE Sbox[260]={0},Sbox2[260]={0}; + SIZE_T i,j,t,x; + + i=j=t=x=0; + temp=0; + + //initialize sbox i + for(i=0;i<256;i++) Sbox[i]=(BYTE)i; + + j=0; + //whether user has sent any inpur lpKey + //initialize the sbox2 with user lpKey + for(i=0;i<256;i++) + { + if (j==dwKeySize) j=0; + Sbox2[i]=lpKey[j++]; + } + + j=0; //Initialize j + //scramble sbox1 with sbox2 + for(i=0;i<256;i++) + { + j=(j+(unsigned long)Sbox[i]+(unsigned long)Sbox2[i]) % 256U; + temp=Sbox[i]; + Sbox[i]=Sbox[j]; + Sbox[j]=temp; + } + + i=j=0; + for(x=0;x + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + +#if !defined(AFX__SHA1_H__INCLUDED_) +#define AFX__SHA1_H__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + +// see +// RFC 3174 - SHA1 +// RFC 2104 - HMAC +// RFC 2617 - CvtHex + + + +#define SHA1HashSize 20 +#define SHA1HashHexSize 40 + +/* This structure will hold context information for the SHA-1 hashing operation */ +typedef struct SHA1Context +{ + DWORD Intermediate_Hash[SHA1HashSize/4];/* Message Digest */ + ULARGE_INTEGER Length; /* Message length in bits */ + BYTE Message_Block[64]; /* 512-bit message blocks */ + BOOL Computed; /* Is the digest computed? */ +} SHA1Context; + + +#ifdef UNICODE + #define SHA1HMACGetString SHA1HMACGetStringW + #define SHA1GetStringDigest SHA1GetStringDigestW + #define SHA1CvtString SHA1CvtStringW +#else + #define SHA1HMACGetString SHA1HMACGetStringA + #define SHA1GetStringDigest SHA1GetStringDigestA + #define SHA1CvtString SHA1CvtStringA +#endif + + +#ifndef SHA1_MAX_SPEED + #ifdef SecureZeroMemory + #define SHA1SecureZeroMemory SecureZeroMemory + #else + #define SHA1SecureZeroMemory bzero + #endif +#else + #define SHA1SecureZeroMemory +#endif + + +/* + * Description: + * This file implements the Secure Hashing Algorithm 1 as + * defined in FIPS PUB 180-1 published April 17, 1995. + * + * The SHA-1, produces a 160-bit message digest for a given + * data stream. It should take about 2**n steps to find a + * message with the same digest as a given message and + * 2**(n/2) to find any two messages with the same digest, + * when n is the digest size in bits. Therefore, this + * algorithm can serve as a means of providing a + * "fingerprint" for a message. + * + * Portability Issues: + * SHA-1 is defined in terms of 32-bit "words". This code + * uses (included via "sha1.h" to define 32 and 8 + * bit unsigned integer types. If your C compiler does not + * support 32 bit unsigned integers, this code is not + * appropriate. + * + * Caveats: + * SHA-1 is designed to work with messages less than 2^64 bits + * long. Although SHA-1 allows a message digest to be generated + * for messages of any number of bits less than 2^64, this + * implementation only works with messages with a length that is + * a multiple of the size of an 8-bit character. + * + */ + + + +/* Define the SHA1 circular left shift macro */ +#define SHA1CircularShift(bits,word) (((word) << (bits)) | ((word) >> (32-(bits)))) + +/* Local Function Prototyptes */ +//void SHA1PadMessage(SHA1Context *); +//void SHA1ProcessMessageBlock(SHA1Context *); + + +__inline DWORD BSWAP(DWORD dwIn) +{ +return((((dwIn<<8) & 0x00ff0000) | (dwIn<<24) | ((dwIn>>8) & 0x0000ff00) | (dwIn>>24))); +} + +__inline void CopyMemoryReverseDWORD(LPCVOID lpcDestination,LPCVOID lpcSource,SIZE_T dwSize) +{ +#ifdef _WIN64 + BYTE *pDestination=(BYTE*)lpcDestination,*pSource=(BYTE*)lpcSource; + + //for(SIZE_T i=0;iIntermediate_Hash[0],/* Word buffers */ + B=context->Intermediate_Hash[1], + C=context->Intermediate_Hash[2], + D=context->Intermediate_Hash[3], + E=context->Intermediate_Hash[4]; + + /* Initialize the first 16 words in the array W */ + CopyMemoryReverseDWORD(W,Message_Block,64); + + for(t=16;t<80;t++) + { + W[t]=SHA1CircularShift(1,W[t-3]^W[t-8]^W[t-14]^W[t-16]); + } + + for(t=0;t<20;t++) + { + temp=SHA1CircularShift(5,A) + ((B&C) | ((~B)&D)) + E + W[t] + K[0]; + E=D; + D=C; + C=SHA1CircularShift(30,B); + B=A; + A=temp; + } + + for(t=20;t<40;t++) + { + temp=SHA1CircularShift(5,A) + (B^C^D) + E + W[t] + K[1]; + E=D; + D=C; + C=SHA1CircularShift(30,B); + B=A; + A=temp; + } + + for(t=40;t<60;t++) + { + temp=SHA1CircularShift(5,A) + ((B&C) | (B&D) | (C&D)) + E + W[t] + K[2]; + E=D; + D=C; + C=SHA1CircularShift(30,B); + B=A; + A=temp; + } + + for(t=60;t<80;t++) + { + temp=SHA1CircularShift(5,A) + (B^C^D) + E + W[t] + K[3]; + E=D; + D=C; + C=SHA1CircularShift(30,B); + B=A; + A=temp; + } + + context->Intermediate_Hash[0]+=A; + context->Intermediate_Hash[1]+=B; + context->Intermediate_Hash[2]+=C; + context->Intermediate_Hash[3]+=D; + context->Intermediate_Hash[4]+=E; + + /* Zeroize sensitive information.*/ + SHA1SecureZeroMemory(W,sizeof(W)); +} + + +/* +* SHA1PadMessage +* +* Description: +* According to the standard, the message must be padded to an even +* 512 bits. The first padding bit must be a '1'. The last 64 +* bits represent the length of the original message. All bits in +* between should be 0. This function will pad the message +* according to those rules by filling the Message_Block array +* accordingly. It will also call the ProcessMessageBlock function +* provided appropriately. When it returns, it can be assumed that +* the message digest has been computed. +* +* Parameters: +* context: [in/out] +* The context to pad +* ProcessMessageBlock: [in] +* The appropriate SHA*ProcessMessageBlock function +* Returns: +* Nothing. +* +*/ +__inline void SHA1PadMessage(SHA1Context *context) +{ + /* + * Check to see if the current message block is too small to hold + * the initial padding bits and length. If so, we will pad the + * block, process it, and then continue padding into a second + * block. + */ + SIZE_T Message_Block_Index=(SIZE_T)((context->Length.LowPart>>3) & 0x3F); + context->Message_Block[Message_Block_Index++]=0x80; + if (Message_Block_Index>56) + { + memset(&context->Message_Block[Message_Block_Index], 0, (64-Message_Block_Index)); + SHA1ProcessMessageBlock(context,context->Message_Block); + memset(&context->Message_Block, 0, 56); + }else{ + memset(&context->Message_Block[Message_Block_Index], 0, (56-Message_Block_Index)); + } + + /* Store the message length as the last 8 octets */ + context->Message_Block[56]=(BYTE)(context->Length.HighPart>>24); + context->Message_Block[57]=(BYTE)(context->Length.HighPart>>16); + context->Message_Block[58]=(BYTE)(context->Length.HighPart>>8); + context->Message_Block[59]=(BYTE)(context->Length.HighPart); + context->Message_Block[60]=(BYTE)(context->Length.LowPart>>24); + context->Message_Block[61]=(BYTE)(context->Length.LowPart>>16); + context->Message_Block[62]=(BYTE)(context->Length.LowPart>>8); + context->Message_Block[63]=(BYTE)(context->Length.LowPart); + + SHA1ProcessMessageBlock(context,context->Message_Block); +} + + + +/* +* SHA1Reset +* +* Description: +* This function will initialize the SHA1Context in preparation +* for computing a new SHA1 message digest. +* +* Parameters: +* context: [in/out] +* The context to reset. +* +* Returns: +* sha Error Code. +* +*/ +__inline DWORD SHA1Reset(SHA1Context *context) +{ + context->Intermediate_Hash[0]=0x67452301; + context->Intermediate_Hash[1]=0xEFCDAB89; + context->Intermediate_Hash[2]=0x98BADCFE; + context->Intermediate_Hash[3]=0x10325476; + context->Intermediate_Hash[4]=0xC3D2E1F0; + context->Length.QuadPart=0; + context->Computed=FALSE; + +return(NO_ERROR); +} + +/* +* SHA1Result +* +* Description: +* This function will return the 160-bit message digest into the +* Message_Digest array provided by the caller. +* NOTE: The first octet of hash is stored in the 0th element, +* the last octet of hash in the 19th element. +* +* Parameters: +* context: [in/out] +* The context to use to calculate the SHA-1 hash. +* Message_Digest: [out] +* Where the digest is returned. +* +* Returns: +* sha Error Code. +* +*/ +__inline DWORD SHA1Result(SHA1Context *context,BYTE *Message_Digest) +{ + if (context->Computed==FALSE) + { + SHA1PadMessage(context); + SHA1SecureZeroMemory(context->Message_Block,64);/* message may be sensitive, clear it out */ + context->Length.QuadPart=0; /* and clear length */ + context->Computed=TRUE; + } + + CopyMemoryReverseDWORD(Message_Digest,context->Intermediate_Hash,SHA1HashSize); + +return(NO_ERROR); +} + +/* +* SHA1Input +* +* Description: +* This function accepts an array of octets as the next portion +* of the message. +* +* Parameters: +* context: [in/out] +* The SHA context to update +* message_array: [in] +* An array of characters representing the next portion of +* the message. +* length: [in] +* The length of the message in message_array +* +* Returns: +* sha Error Code. +* +*/ +__inline DWORD SHA1Input(SHA1Context *context,const BYTE *message_array,SIZE_T length) +{ + if (context->Computed==TRUE) return(ERROR_INVALID_HANDLE_STATE); + + if ((context->Length.QuadPart+(length<<3))>=(length<<3)) + { + SIZE_T i,Message_Block_Index,partLen; + /* Compute number of bytes mod 64 */ + Message_Block_Index=(SIZE_T)((context->Length.LowPart>>3) & 0x3F); + /* Update number of bits */ + context->Length.QuadPart+=(((ULONGLONG)length)<<3); + partLen=(64-Message_Block_Index); + /* Transform as many times as possible.*/ + if (length>=partLen) + { + memmove(&context->Message_Block[Message_Block_Index],message_array,partLen); + SHA1ProcessMessageBlock(context,context->Message_Block); + for (i=partLen;(i+63)Message_Block[Message_Block_Index],&message_array[i],(length-i)); + }else{ + return(RPC_S_STRING_TOO_LONG);/* Message is too long */ + } +return(NO_ERROR); +} +//////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////// +//////////////////////////////RFC 2104////////////////////////////// +//////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////// +__inline void hmac_sha1(BYTE *text,SIZE_T text_len,BYTE *key,SIZE_T key_len,BYTE *digest) +{ +//BYTE* text; /* pointer to data stream */ +//int text_len; /* length of data stream */ +//BYTE* key; /* pointer to authentication key */ +//int key_len; /* length of authentication key */ +//HASH digest; /* caller digest to be filled in */ + SHA1Context context; + BYTE k_ipad[65]; /* inner padding - key XORd with ipad */ + BYTE k_opad[65]; /* outer padding - key XORd with opad */ + BYTE tk[SHA1HashSize]; + /* if key is longer than 64 bytes reset it to key=SHA1(key) */ + if (key_len>64) + { + SHA1Context tctx; + + SHA1Reset(&tctx); + SHA1Input(&tctx,key,key_len); + SHA1Result(&tctx,(BYTE*)&tk); + + key=tk; + key_len=SHA1HashSize; + } + + /* + * the HMAC_SHA1 transform looks like: + * + * SHA1(K XOR opad, SHA1(K XOR ipad, text)) + * + * where K is an n byte key + * ipad is the byte 0x36 repeated 64 times + * opad is the byte 0x5c repeated 64 times + * and text is the data being protected + */ + + /* start out by storing key in pads */ + memmove(&k_ipad,key,key_len); + memmove(&k_opad,key,key_len); + memset(&k_ipad[key_len], 0, (sizeof(k_ipad)-key_len)); + memset(&k_opad[key_len], 0 , (sizeof(k_opad)-key_len)); + + /* XOR key with ipad and opad values */ + for (SIZE_T i=0;i<(64/sizeof(ULONGLONG));i++) + { + ((ULONGLONG*)k_ipad)[i]^=0x3636363636363636; + ((ULONGLONG*)k_opad)[i]^=0x5C5C5C5C5C5C5C5C; + } + /* perform inner SHA1 */ + SHA1Reset(&context); /* init context for 1st pass */ + SHA1Input(&context,k_ipad,64); /* start with inner pad */ + SHA1Input(&context,text,text_len); /* then text of datagram */ + SHA1Result(&context,digest); /* finish up 1st pass */ + /* perform outer SHA1 */ + SHA1Reset(&context); /* init context for 2nd pass */ + SHA1Input(&context,k_opad,64); /* start with outer pad */ + SHA1Input(&context,(BYTE*)digest,SHA1HashSize); /* then results of 1st hash */ + SHA1Result(&context,digest); /* finish up 2nd pass */ + + SHA1SecureZeroMemory(k_ipad,sizeof(k_ipad)); + SHA1SecureZeroMemory(k_opad,sizeof(k_opad)); + SHA1SecureZeroMemory(tk,sizeof(tk)); +} +//////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////// +//////////////////////////////RFC 2617////////////////////////////// +//////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////// +__inline void SHA1CvtHex(BYTE *Bin,BYTE *Hex) +{ + BYTE j; + + for (SIZE_T i=0;i>4)&0xf; + if(j<=9) + { + Hex[(i*2)]=(j+'0'); + }else{ + Hex[(i*2)]=(j+'a'-10); + } + + j=Bin[i]&0xf; + if(j<=9) + { + Hex[(i*2+1)]=(j+'0'); + }else{ + Hex[(i*2+1)]=(j+'a'-10); + } + }; + Hex[SHA1HashHexSize]=0; +}; + +//////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////// +__inline void SHA1CvtStringA(BYTE *digest,LPSTR lpszDigest) +{ + SHA1CvtHex(digest,(BYTE*)lpszDigest); +}; + + +__inline void SHA1CvtStringW(BYTE *digest,LPWSTR lpszDigest) +{ + SIZE_T i,p=0; + for (i=0;i + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + + +#if !defined(AFX_SOCKET_FUNCTIONS__H__INCLUDED_) +#define AFX_SOCKET_FUNCTIONS__H__INCLUDED_ + +#if(_WIN32_WINNT >= 0x0501) +static LPFN_CONNECTEX ConnectEx=NULL; +static LPFN_DISCONNECTEX DisconnectEx=NULL; +static LPFN_TRANSMITPACKETS TransmitPackets=NULL; +#endif + + +#ifndef NTOHS + +__inline u_short USHORT_FLIP(u_short usIn) +{ +return(((usIn<<8) | (usIn>>8))); +} +#define NTOHS(in) USHORT_FLIP(in) +#define HTONS(in) USHORT_FLIP(in) + +#endif + + + +#ifndef NTOHL + +__inline u_long ULONG_FLIP(u_long ulIn) +{ +#if defined (_M_IA64) || defined (_M_AMD64) +return((((ulIn<<8) & 0x00ff0000) | (ulIn<<24) | ((ulIn>>8) & 0x0000ff00) | (ulIn>>24))); +#else + __asm + { + mov eax,ulIn + bswap eax + mov ulIn,eax + }; +return(ulIn); +#endif +} + +#define NTOHL(in) ULONG_FLIP(in) +#define HTONL(in) ULONG_FLIP(in) + +#endif + + + + + +#define CLOSE_SOCKET(skt) if (skt) {closesocket(skt);skt=INVALID_SOCKET;} + + + +__inline BOOL SocketGetACCEPTCONN(SOCKET skt) +{ + BOOL bRet; + int iSize=sizeof(BOOL); + if (getsockopt(skt,SOL_SOCKET,SO_ACCEPTCONN,(char*)&bRet,(int*)&iSize)!=NO_ERROR) bRet=FALSE; +return(bRet); +} + + +__inline BOOL SocketGetBROADCAST(SOCKET skt) +{ + BOOL bRet; + int iSize=sizeof(BOOL); + if (getsockopt(skt,SOL_SOCKET,SO_BROADCAST,(char*)&bRet,(int*)&iSize)!=NO_ERROR) bRet=FALSE; +return(bRet); +} + +__inline int SocketSetBROADCAST(SOCKET skt,BOOL bBroadcast) +{ +return(setsockopt(skt,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL))); +} + + + +__inline int SocketGetCONNECT_TIME(SOCKET skt) +{ + int iSeconds,iSize=sizeof(int); + if (getsockopt(skt,SOL_SOCKET,SO_CONNECT_TIME,(char*)&iSeconds,(int*)&iSize)!=NO_ERROR) iSeconds=-1; +return(iSeconds); +} + + +__inline BOOL SocketGetKEEPALIVE(SOCKET skt) +{ + BOOL bRet; + int iSize=sizeof(BOOL); + if (getsockopt(skt,SOL_SOCKET,SO_KEEPALIVE,(char*)&bRet,(int*)&iSize)!=NO_ERROR) bRet=FALSE; +return(bRet); +} + +__inline int SocketSetKEEPALIVE(SOCKET skt,BOOL bKeepAlive) +{ +return(setsockopt(skt,SOL_SOCKET,SO_KEEPALIVE,(const char*)&bKeepAlive,sizeof(BOOL))); +} + + + +__inline int SocketGetMAX_MSG_SIZE(SOCKET skt) +{ + int iMaxMsgSize,iSize=sizeof(int); + if (getsockopt(skt,SOL_SOCKET,SO_MAX_MSG_SIZE,(char*)&iMaxMsgSize,(int*)&iSize)!=NO_ERROR) iMaxMsgSize=-1; +return(iMaxMsgSize); +} + + +__inline int SocketSetEXCLUSIVEADDRUSE(SOCKET skt,BOOL bExclusiveAddrUse) +{ +return(setsockopt(skt,SOL_SOCKET,SO_EXCLUSIVEADDRUSE,(const char*)&bExclusiveAddrUse,sizeof(BOOL))); +} + + +__inline BOOL SocketGetREUSEADDR(SOCKET skt) +{ + BOOL bRet; + int iSize=sizeof(BOOL); + if (getsockopt(skt,SOL_SOCKET,SO_REUSEADDR,(char*)&bRet,(int*)&iSize)!=NO_ERROR) bRet=FALSE; +return(bRet); +} + +__inline int SocketSetREUSEADDR(SOCKET skt,BOOL bReuseAddr) +{ +return(setsockopt(skt,SOL_SOCKET,SO_REUSEADDR,(const char*)&bReuseAddr,sizeof(BOOL))); +} + + +__inline int SocketSetRCVBUF(SOCKET skt,unsigned int uiBuffSize) +{ +return(setsockopt(skt,SOL_SOCKET,SO_RCVBUF,(const char*)&uiBuffSize,sizeof(int))); +} + + +__inline int SocketSetSNDBUF(SOCKET skt,unsigned int uiBuffSize) +{ +return(setsockopt(skt,SOL_SOCKET,SO_SNDBUF,(const char*)&uiBuffSize,sizeof(int))); +} + + + +__inline int SocketSetUPDATE_ACCEPT_CONTEXT(SOCKET skt,SOCKET sktAccept) +{ +return(setsockopt(skt,SOL_SOCKET,SO_UPDATE_ACCEPT_CONTEXT,(char*)&sktAccept,sizeof(SOCKET))); +} + + +#if(_WIN32_WINNT >= 0x0501) +__inline int SocketSetUPDATE_CONNECT_CONTEXT(SOCKET skt) +{ +return(setsockopt(skt,SOL_SOCKET,SO_UPDATE_CONNECT_CONTEXT,NULL,0)); +} +#endif + + + + +__inline BOOL SocketGetHDRINCL(SOCKET skt) +{ + BOOL bRet; + int iSize=sizeof(BOOL); + if (getsockopt(skt,IPPROTO_IP,IP_HDRINCL,(char*)&bRet,(int*)&iSize)!=NO_ERROR) bRet=FALSE; +return(bRet); +} + +__inline int SocketSetHDRINCL(SOCKET skt,BOOL bProvideIPHdr) +{ +return(setsockopt(skt,IPPROTO_IP,IP_HDRINCL,(const char*)&bProvideIPHdr,sizeof(DWORD))); +} + + +#define TOS_DEFAULT 0 +#define TOS_MIN_MONETARY_COST 2 +#define TOS_MIN_RELIABILITY 4 +#define TOS_MAX_THROUGHPUT 8 +#define TOS_MIN_DELAY 16 +#define TOS_MAX_SECURITY 30 + +__inline int SocketSetTOS(SOCKET skt,DWORD dwTOS) +{ +return(setsockopt(skt,IPPROTO_IP,IP_TOS,(const char*)&dwTOS,sizeof(DWORD))); +} + + +__inline int SocketSetTTL(SOCKET skt,UINT iTTL) +{ +return(setsockopt(skt,IPPROTO_IP,IP_TTL,(const char*)&iTTL,sizeof(DWORD))); +} + + +__inline int SocketSetTCP_NODELAY(SOCKET skt,BOOL bTCPNoDelay) +{ +return(setsockopt(skt,IPPROTO_TCP,TCP_NODELAY,(const char*)&bTCPNoDelay,sizeof(DWORD))); +} + +/* +int // OUT: whatever setsockopt() returns +join_source_group(int sd, u_int32 grpaddr, + u_int32 srcaddr, u_int32 iaddr) +{ + struct ip_mreq_source imr; + + imr.imr_multiaddr.s_addr = grpaddr; + imr.imr_sourceaddr.s_addr = srcaddr; + imr.imr_interface.s_addr = iaddr; + return setsockopt(sd, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP, &imr, sizeof(imr)); +} + +int +leave_source_group(int sd, u_int32 grpaddr, + u_int32 srcaddr, u_int32 iaddr) +{ + struct ip_mreq_source imr; + + imr.imr_multiaddr.s_addr = grpaddr; + imr.imr_sourceaddr.s_addr = srcaddr; + imr.imr_interface.s_addr = iaddr; + return setsockopt(sd, IPPROTO_IP, IP_DROP_SOURCE_MEMBERSHIP, &imr, sizeof(imr)); +}*/ + + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +__inline BOOL WINAPI DisconnectExTF(SOCKET hSocket,LPOVERLAPPED lpOverlapped,DWORD dwFlags,DWORD reserved) +{ + reserved=0; + dwFlags&=TF_REUSE_SOCKET; + dwFlags|=TF_DISCONNECT; +return(TransmitFile(hSocket,NULL,0,0,lpOverlapped,NULL,dwFlags)); +} + + + +__inline DWORD SocketsInitialize() +{ + DWORD dwRetErrorCode; + WSADATA wsaData; + + if ((dwRetErrorCode=WSAStartup(MAKEWORD(1,1),&wsaData))==NO_ERROR) + {// version 1.1 OK + WSACleanup(); + + dwRetErrorCode=WSAStartup(wsaData.wHighVersion,&wsaData); + } +return(dwRetErrorCode); +} + + +#if(_WIN32_WINNT >= 0x0501) +__inline DWORD SocketsInitializeEx(DWORD dwFlags) +{ + DWORD dwRetErrorCode; + WSADATA wsaData; + + dwFlags=0; + if ((dwRetErrorCode=WSAStartup(MAKEWORD(1,1),&wsaData))==NO_ERROR) + {// version 1.1 OK + WSACleanup(); + if ((dwRetErrorCode=WSAStartup(wsaData.wHighVersion,&wsaData))==NO_ERROR) + {// max version initialized + SOCKET skt; + + if ((skt=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,0,0,WSA_FLAG_OVERLAPPED))!=INVALID_SOCKET) + { + DWORD dwSize; + GUID ExtensionGuidCONNECTEX=WSAID_CONNECTEX; + GUID ExtensionGuidDISCONNECTEX=WSAID_DISCONNECTEX; + GUID ExtensionGuidTRANSMITPACKETS=WSAID_TRANSMITPACKETS; + + dwRetErrorCode=NO_ERROR; + + if (WSAIoctl(skt,SIO_GET_EXTENSION_FUNCTION_POINTER,&ExtensionGuidCONNECTEX,sizeof(GUID),&ConnectEx,sizeof(FARPROC),&dwSize,NULL,NULL)==0) + { + if (ConnectEx==NULL) dwRetErrorCode=WSAGetLastError(); + }else{ + dwRetErrorCode=WSAGetLastError(); + } + + + if (WSAIoctl(skt,SIO_GET_EXTENSION_FUNCTION_POINTER,&ExtensionGuidDISCONNECTEX,sizeof(GUID),&DisconnectEx,sizeof(FARPROC),&dwSize,NULL,NULL)==0) + { + if (DisconnectEx==NULL) + { + DisconnectEx=DisconnectExTF; + //dwRetErrorCode=WSAGetLastError(); + } + }else{ + dwRetErrorCode=WSAGetLastError(); + } + + if (WSAIoctl(skt,SIO_GET_EXTENSION_FUNCTION_POINTER,&ExtensionGuidTRANSMITPACKETS,sizeof(GUID),&TransmitPackets,sizeof(FARPROC),&dwSize,NULL,NULL)==0) + { + if (TransmitPackets==NULL) dwRetErrorCode=WSAGetLastError(); + }else{ + dwRetErrorCode=WSAGetLastError(); + } + + closesocket(skt); + }else{ + dwRetErrorCode=WSAGetLastError(); + } + } + } +return(dwRetErrorCode); +} +#endif + + + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +///////////////////////////SOCKADDR_STORAGE///////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +#if(_WIN32_WINNT >= 0x0501) + +__inline DWORD SockAddrInDataSet(LPCVOID lpcsasSockAddrStorage,DWORD dwPort,LPCVOID lpcAddress,SIZE_T dwAddressSize) +{ + DWORD dwRetErrorCode=NO_ERROR; + + if (lpcsasSockAddrStorage && lpcAddress) + { + switch(dwAddressSize){ + case sizeof(in_addr): + ((sockaddr_in*)lpcsasSockAddrStorage)->sin_family=AF_INET; + ((sockaddr_in*)lpcsasSockAddrStorage)->sin_port=HTONS((WORD)dwPort); + (*((DWORD*)&(((sockaddr_in*)lpcsasSockAddrStorage)->sin_addr)))=(*((DWORD*)lpcAddress)); + break; + case sizeof(in6_addr): + ((sockaddr_in6*)lpcsasSockAddrStorage)->sin6_family=AF_INET6; + ((sockaddr_in6*)lpcsasSockAddrStorage)->sin6_port=HTONS((WORD)dwPort); + memmove(&(((sockaddr_in6*)lpcsasSockAddrStorage)->sin6_addr),lpcAddress,sizeof(in6_addr)); + break; + default: + dwRetErrorCode=ERROR_INVALID_PARAMETER; + break; + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +__inline DWORD SockAddrInPortSet(LPCVOID lpcsasSockAddrStorage,DWORD dwPort) +{ + DWORD dwRetErrorCode=NO_ERROR; + + if (lpcsasSockAddrStorage) + { + switch(((SOCKADDR_STORAGE*)lpcsasSockAddrStorage)->ss_family){ + case AF_INET: + ((sockaddr_in*)lpcsasSockAddrStorage)->sin_port=HTONS((WORD)dwPort); + break; + case AF_INET6: + ((sockaddr_in6*)lpcsasSockAddrStorage)->sin6_port=HTONS((WORD)dwPort); + break; + default: + dwRetErrorCode=ERROR_INVALID_PARAMETER; + break; + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +__inline DWORD SockAddrInAddressSet(LPCVOID lpcsasSockAddrStorage,LPCVOID lpcAddress,SIZE_T dwAddressSize) +{ + DWORD dwRetErrorCode=NO_ERROR; + + if (lpcsasSockAddrStorage && lpcAddress) + { + switch(dwAddressSize){ + case sizeof(in_addr): + ((sockaddr_in*)lpcsasSockAddrStorage)->sin_family=AF_INET; + (*((DWORD*)&(((sockaddr_in*)lpcsasSockAddrStorage)->sin_addr)))=(*((DWORD*)lpcAddress)); + break; + case sizeof(in6_addr): + ((sockaddr_in6*)lpcsasSockAddrStorage)->sin6_family=AF_INET6; + memmove(&(((sockaddr_in6*)lpcsasSockAddrStorage)->sin6_addr),lpcAddress,sizeof(in6_addr)); + break; + default: + dwRetErrorCode=ERROR_INVALID_PARAMETER; + break; + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +__inline DWORD SockAddrAddressSet(LPCVOID lpcsasSockAddrStorage,LPCVOID lpcAddress,SIZE_T dwAddressSize) +{ + DWORD dwRetErrorCode=NO_ERROR; + + if (lpcsasSockAddrStorage && lpcAddress) + { + switch(dwAddressSize){ + case sizeof(in_addr): + ((sockaddr*)lpcsasSockAddrStorage)->sa_family=AF_INET; + (*((DWORD*)&(((sockaddr*)lpcsasSockAddrStorage)->sa_data)))=(*((DWORD*)lpcAddress)); + break; + case sizeof(in6_addr): + ((sockaddr*)lpcsasSockAddrStorage)->sa_family=AF_INET6; + memmove(&(((sockaddr*)lpcsasSockAddrStorage)->sa_data),lpcAddress,sizeof(in6_addr)); + break; + default: + dwRetErrorCode=ERROR_INVALID_PARAMETER; + break; + } + }else{ + dwRetErrorCode=ERROR_INVALID_HANDLE; + } +return(dwRetErrorCode); +} + + +__inline SIZE_T SockAddrGetSize(LPCVOID lpcsasSockAddrStorage) +{ + SIZE_T dwRet; + + if (lpcsasSockAddrStorage) + { + switch(((SOCKADDR_STORAGE*)lpcsasSockAddrStorage)->ss_family){ + case AF_INET: + dwRet=sizeof(sockaddr_in); + break; + case AF_INET6: + dwRet=sizeof(sockaddr_in6); + break; + default: + dwRet=sizeof(SOCKADDR_STORAGE); + break; + } + }else{ + dwRet=0; + } +return(dwRet); +} + + +#endif +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + + +#endif //AFX_SOCKET_FUNCTIONS__H__INCLUDED_ \ No newline at end of file diff --git a/MRA/Sdk/StrHexToNum.h b/MRA/Sdk/StrHexToNum.h new file mode 100644 index 0000000..60b5801 --- /dev/null +++ b/MRA/Sdk/StrHexToNum.h @@ -0,0 +1,634 @@ +/* + * Copyright (c) 2005 Rozhuk Ivan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + + +#if !defined(AFX_STRHEXTONUM__H__INCLUDED_) +#define AFX_STRHEXTONUM__H__INCLUDED_ + + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + + +__inline SIZE_T StrHexToUNum(LPCSTR lpcszString,SIZE_T dwStringLen) +{ + SIZE_T dwNum=0; + BYTE bCurentFigure; + + while(dwStringLen) + { + bCurentFigure=(*lpcszString); + if ('0'<=bCurentFigure && bCurentFigure<='9') + { + bCurentFigure-='0'; + }else + if ('a'<=bCurentFigure && bCurentFigure<='f') + { + bCurentFigure-=('a'+10); + }else + if ('A'<=bCurentFigure && bCurentFigure<='F') + { + bCurentFigure-=('A'+10); + }else{ + bCurentFigure=255; + } + + if (bCurentFigure!=255) + { + dwNum*=16;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + dwNum+=bCurentFigure;// добавляем цифру в младший разряд + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + +return(dwNum); +} + +__inline DWORD StrHexToUNum32(LPCSTR lpcszString,SIZE_T dwStringLen) +{ + DWORD dwNum=0; + BYTE bCurentFigure; + + + while(dwStringLen) + { + bCurentFigure=(*lpcszString); + if ('0'<=bCurentFigure && bCurentFigure<='9') + { + bCurentFigure-='0'; + }else + if ('a'<=bCurentFigure && bCurentFigure<='f') + { + bCurentFigure-=('a'+10); + }else + if ('A'<=bCurentFigure && bCurentFigure<='F') + { + bCurentFigure-=('A'+10); + }else{ + bCurentFigure=255; + } + + if (bCurentFigure!=255) + { + dwNum*=16;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + dwNum+=bCurentFigure;// добавляем цифру в младший разряд + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + +return(dwNum); +} + +__inline DWORDLONG StrHexToUNum64(LPCSTR lpcszString,SIZE_T dwStringLen) +{ + DWORDLONG dwlNum=0; + BYTE bCurentFigure; + + + while(dwStringLen) + { + bCurentFigure=(*lpcszString); + if ('0'<=bCurentFigure && bCurentFigure<='9') + { + bCurentFigure-='0'; + }else + if ('a'<=bCurentFigure && bCurentFigure<='f') + { + bCurentFigure-=('a'+10); + }else + if ('A'<=bCurentFigure && bCurentFigure<='F') + { + bCurentFigure-=('A'+10); + }else{ + bCurentFigure=255; + } + + if (bCurentFigure!=255) + { + dwlNum*=16;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + dwlNum+=bCurentFigure;// добавляем цифру в младший разряд + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + +return(dwlNum); +} + + + +__inline DWORD StrHexToUNumEx(LPCSTR lpcszString,SIZE_T dwStringLen,SIZE_T *pdwNum) +{ + DWORD dwRetErrorCode; + SIZE_T dwNum=0,dwProcessed=0; + BYTE bCurentFigure; + + + while(dwStringLen) + { + bCurentFigure=(*lpcszString); + if ('0'<=bCurentFigure && bCurentFigure<='9') + { + bCurentFigure-='0'; + }else + if ('a'<=bCurentFigure && bCurentFigure<='f') + { + bCurentFigure-=('a'+10); + }else + if ('A'<=bCurentFigure && bCurentFigure<='F') + { + bCurentFigure-=('A'+10); + }else{ + bCurentFigure=255; + } + + if (bCurentFigure!=255) + { + dwNum*=16;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + dwNum+=bCurentFigure;// добавляем цифру в младший разряд + dwProcessed++;// увеличиваем счётчик обработанных цифр + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + if (dwProcessed) + {// как минимум одна цифра была обработана + if (pdwNum) (*pdwNum)=dwNum; + if (dwProcessed==dwStringLen) + {// в строке были только цифры, всё отработало как нужно //Операция успешно завершена. + dwRetErrorCode=NO_ERROR; + }else{// в строке были не только цифры //Имеются дополнительные данные. + dwRetErrorCode=ERROR_MORE_DATA; + } + }else{// строка вообще не содержала цифр //Недопустимые данные. + dwRetErrorCode=ERROR_INVALID_DATA; + } +return(dwRetErrorCode); +} + + +__inline DWORD StrHexToUNumEx32(LPCSTR lpcszString,SIZE_T dwStringLen,DWORD *pdwNum) +{ + DWORD dwRetErrorCode; + DWORD dwNum=0,dwProcessed=0; + BYTE bCurentFigure; + + + while(dwStringLen) + { + bCurentFigure=(*lpcszString); + if ('0'<=bCurentFigure && bCurentFigure<='9') + { + bCurentFigure-='0'; + }else + if ('a'<=bCurentFigure && bCurentFigure<='f') + { + bCurentFigure-=('a'+10); + }else + if ('A'<=bCurentFigure && bCurentFigure<='F') + { + bCurentFigure-=('A'+10); + }else{ + bCurentFigure=255; + } + + if (bCurentFigure!=255) + { + dwNum*=16;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + dwNum+=bCurentFigure;// добавляем цифру в младший разряд + dwProcessed++;// увеличиваем счётчик обработанных цифр + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + if (dwProcessed) + {// как минимум одна цифра была обработана + if (pdwNum) (*pdwNum)=dwNum; + if (dwProcessed==dwStringLen) + {// в строке были только цифры, всё отработало как нужно //Операция успешно завершена. + dwRetErrorCode=NO_ERROR; + }else{// в строке были не только цифры //Имеются дополнительные данные. + dwRetErrorCode=ERROR_MORE_DATA; + } + }else{// строка вообще не содержала цифр //Недопустимые данные. + dwRetErrorCode=ERROR_INVALID_DATA; + } +return(dwRetErrorCode); +} + + +__inline DWORD StrHexToUNumEx64(LPCSTR lpcszString,SIZE_T dwStringLen,DWORDLONG *pdwlNum) +{ + DWORD dwRetErrorCode; + DWORDLONG dwlNum=0; + SIZE_T dwProcessed=0; + BYTE bCurentFigure; + + + while(dwStringLen) + { + bCurentFigure=(*lpcszString); + if ('0'<=bCurentFigure && bCurentFigure<='9') + { + bCurentFigure-='0'; + }else + if ('a'<=bCurentFigure && bCurentFigure<='f') + { + bCurentFigure-=('a'+10); + }else + if ('A'<=bCurentFigure && bCurentFigure<='F') + { + bCurentFigure-=('A'+10); + }else{ + bCurentFigure=255; + } + + if (bCurentFigure!=255) + { + dwlNum*=16;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + dwlNum+=bCurentFigure;// добавляем цифру в младший разряд + dwProcessed++;// увеличиваем счётчик обработанных цифр + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + if (dwProcessed) + {// как минимум одна цифра была обработана + if (pdwlNum) (*pdwlNum)=dwlNum; + if (dwProcessed==dwStringLen) + {// в строке были только цифры, всё отработало как нужно //Операция успешно завершена. + dwRetErrorCode=NO_ERROR; + }else{// в строке были не только цифры //Имеются дополнительные данные. + dwRetErrorCode=ERROR_MORE_DATA; + } + }else{// строка вообще не содержала цифр //Недопустимые данные. + dwRetErrorCode=ERROR_INVALID_DATA; + } +return(dwRetErrorCode); +} + + + + +__inline SSIZE_T StrHexToNum(LPCSTR lpcszString,SIZE_T dwStringLen) +{ + SSIZE_T lNum=0,lSingn=1; + BYTE bCurentFigure; + + + while(dwStringLen && ((bCurentFigure=((*lpcszString)-48))>9)) + { + if (bCurentFigure=='-') lSingn=-1; + if (bCurentFigure=='+') lSingn=1; + + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + while(dwStringLen) + { + bCurentFigure=(*lpcszString); + if ('0'<=bCurentFigure && bCurentFigure<='9') + { + bCurentFigure-='0'; + }else + if ('a'<=bCurentFigure && bCurentFigure<='f') + { + bCurentFigure-=('a'+10); + }else + if ('A'<=bCurentFigure && bCurentFigure<='F') + { + bCurentFigure-=('A'+10); + }else{ + bCurentFigure=255; + } + + if (bCurentFigure!=255) + { + lNum*=16;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + lNum+=bCurentFigure;// добавляем цифру в младший разряд + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + lNum*=lSingn; + +return(lNum); +} + + +__inline LONG StrHexToNum32(LPCSTR lpcszString,SIZE_T dwStringLen) +{ + LONG lNum=0,lSingn=1; + BYTE bCurentFigure; + + + while(dwStringLen && ((bCurentFigure=((*lpcszString)-48))>9)) + { + if (bCurentFigure=='-') lSingn=-1; + if (bCurentFigure=='+') lSingn=1; + + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + while(dwStringLen) + { + bCurentFigure=(*lpcszString); + if ('0'<=bCurentFigure && bCurentFigure<='9') + { + bCurentFigure-='0'; + }else + if ('a'<=bCurentFigure && bCurentFigure<='f') + { + bCurentFigure-=('a'+10); + }else + if ('A'<=bCurentFigure && bCurentFigure<='F') + { + bCurentFigure-=('A'+10); + }else{ + bCurentFigure=255; + } + + if (bCurentFigure!=255) + { + lNum*=16;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + lNum+=bCurentFigure;// добавляем цифру в младший разряд + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + lNum*=lSingn; + +return(lNum); +} + + +__inline LONGLONG StrHexToNum64(LPCSTR lpcszString,SIZE_T dwStringLen) +{ + LONGLONG llNum=0,llSingn=1; + BYTE bCurentFigure; + + + while(dwStringLen && ((bCurentFigure=((*lpcszString)-48))>9)) + { + if (bCurentFigure=='-') llSingn=-1; + if (bCurentFigure=='+') llSingn=1; + + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + while(dwStringLen) + { + bCurentFigure=(*lpcszString); + if ('0'<=bCurentFigure && bCurentFigure<='9') + { + bCurentFigure-='0'; + }else + if ('a'<=bCurentFigure && bCurentFigure<='f') + { + bCurentFigure-=('a'+10); + }else + if ('A'<=bCurentFigure && bCurentFigure<='F') + { + bCurentFigure-=('A'+10); + }else{ + bCurentFigure=255; + } + + if (bCurentFigure!=255) + { + llNum*=16;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + llNum+=bCurentFigure;// добавляем цифру в младший разряд + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + llNum*=llSingn; + +return(llNum); +} + + + +__inline DWORD StrHexToNumEx(LPCSTR lpcszString,SIZE_T dwStringLen,SSIZE_T *plNum) +{ + DWORD dwRetErrorCode; + SIZE_T dwProcessed=0; + SSIZE_T lNum=0,lSingn=1; + BYTE bCurentFigure; + + + while(dwStringLen && ((bCurentFigure=((*lpcszString)-48))>9)) + { + if (bCurentFigure=='-') lSingn=-1; + if (bCurentFigure=='+') lSingn=1; + + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + while(dwStringLen) + { + bCurentFigure=(*lpcszString); + if ('0'<=bCurentFigure && bCurentFigure<='9') + { + bCurentFigure-='0'; + }else + if ('a'<=bCurentFigure && bCurentFigure<='f') + { + bCurentFigure-=('a'+10); + }else + if ('A'<=bCurentFigure && bCurentFigure<='F') + { + bCurentFigure-=('A'+10); + }else{ + bCurentFigure=255; + } + + if (bCurentFigure!=255) + { + lNum*=16;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + lNum+=bCurentFigure;// добавляем цифру в младший разряд + dwProcessed++;// увеличиваем счётчик обработанных цифр + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + if (dwProcessed) + {// как минимум одна цифра была обработана + if (plNum) (*plNum)=(lNum*lSingn); + if (dwProcessed==dwStringLen) + {// в строке были только цифры, всё отработало как нужно //Операция успешно завершена. + dwRetErrorCode=NO_ERROR; + }else{// в строке были не только цифры //Имеются дополнительные данные. + dwRetErrorCode=ERROR_MORE_DATA; + } + }else{// строка вообще не содержала цифр //Недопустимые данные. + dwRetErrorCode=ERROR_INVALID_DATA; + } +return(dwRetErrorCode); +} + + +__inline DWORD StrHexToNumEx32(LPCSTR lpcszString,SIZE_T dwStringLen,LONG *plNum) +{ + DWORD dwRetErrorCode; + SIZE_T dwProcessed=0; + LONG lNum=0,lSingn=1; + BYTE bCurentFigure; + + + while(dwStringLen && ((bCurentFigure=((*lpcszString)-48))>9)) + { + if (bCurentFigure=='-') lSingn=-1; + if (bCurentFigure=='+') lSingn=1; + + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + while(dwStringLen) + { + bCurentFigure=(*lpcszString); + if ('0'<=bCurentFigure && bCurentFigure<='9') + { + bCurentFigure-='0'; + }else + if ('a'<=bCurentFigure && bCurentFigure<='f') + { + bCurentFigure-=('a'+10); + }else + if ('A'<=bCurentFigure && bCurentFigure<='F') + { + bCurentFigure-=('A'+10); + }else{ + bCurentFigure=255; + } + + if (bCurentFigure!=255) + { + lNum*=16;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + lNum+=bCurentFigure;// добавляем цифру в младший разряд + dwProcessed++;// увеличиваем счётчик обработанных цифр + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + if (dwProcessed) + {// как минимум одна цифра была обработана + if (plNum) (*plNum)=(lNum*lSingn); + if (dwProcessed==dwStringLen) + {// в строке были только цифры, всё отработало как нужно //Операция успешно завершена. + dwRetErrorCode=NO_ERROR; + }else{// в строке были не только цифры //Имеются дополнительные данные. + dwRetErrorCode=ERROR_MORE_DATA; + } + }else{// строка вообще не содержала цифр //Недопустимые данные. + dwRetErrorCode=ERROR_INVALID_DATA; + } +return(dwRetErrorCode); +} + + +__inline DWORD StrHexToNumEx64(LPCSTR lpcszString,SIZE_T dwStringLen,LONGLONG *pllNum) +{ + DWORD dwRetErrorCode; + SIZE_T dwProcessed=0; + LONGLONG llNum=0,llSingn=1; + BYTE bCurentFigure; + + + while(dwStringLen && ((bCurentFigure=((*lpcszString)-48))>9)) + { + if (bCurentFigure=='-') llSingn=-1; + if (bCurentFigure=='+') llSingn=1; + + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + while(dwStringLen) + { + bCurentFigure=(*lpcszString); + if ('0'<=bCurentFigure && bCurentFigure<='9') + { + bCurentFigure-='0'; + }else + if ('a'<=bCurentFigure && bCurentFigure<='f') + { + bCurentFigure-=('a'+10); + }else + if ('A'<=bCurentFigure && bCurentFigure<='F') + { + bCurentFigure-=('A'+10); + }else{ + bCurentFigure=255; + } + + if (bCurentFigure!=255) + { + llNum*=16;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + llNum+=bCurentFigure;// добавляем цифру в младший разряд + dwProcessed++;// увеличиваем счётчик обработанных цифр + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + if (dwProcessed) + {// как минимум одна цифра была обработана + if (pllNum) (*pllNum)=(llNum*llSingn); + if (dwProcessed==dwStringLen) + {// в строке были только цифры, всё отработало как нужно //Операция успешно завершена. + dwRetErrorCode=NO_ERROR; + }else{// в строке были не только цифры //Имеются дополнительные данные. + dwRetErrorCode=ERROR_MORE_DATA; + } + }else{// строка вообще не содержала цифр //Недопустимые данные. + dwRetErrorCode=ERROR_INVALID_DATA; + } +return(dwRetErrorCode); +} + + + + +#endif // !defined(AFX_STRHEXTONUM__H__INCLUDED_) \ No newline at end of file diff --git a/MRA/Sdk/StrToNum.h b/MRA/Sdk/StrToNum.h new file mode 100644 index 0000000..888b940 --- /dev/null +++ b/MRA/Sdk/StrToNum.h @@ -0,0 +1,447 @@ +/* + * Copyright (c) 2005 Rozhuk Ivan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + + +#if !defined(AFX_STRTONUM__H__INCLUDED_) +#define AFX_STRTONUM__H__INCLUDED_ + + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + + + +__inline SIZE_T StrToUNum(LPCSTR lpcszString,SIZE_T dwStringLen) +{ + SIZE_T dwNum=0; + BYTE bCurentFigure; + + + while(dwStringLen) + { + if ((bCurentFigure=((*lpcszString)-48))<10) + { + dwNum*=10;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + dwNum+=bCurentFigure;// добавляем цифру в младший разряд + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + +return(dwNum); +} + + +__inline DWORD StrToUNum32(LPCSTR lpcszString,SIZE_T dwStringLen) +{ + DWORD dwNum=0; + BYTE bCurentFigure; + + + while(dwStringLen) + { + if ((bCurentFigure=((*lpcszString)-48))<10) + { + dwNum*=10;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + dwNum+=bCurentFigure;// добавляем цифру в младший разряд + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + +return(dwNum); +} + + +__inline DWORDLONG StrToUNum64(LPCSTR lpcszString,SIZE_T dwStringLen) +{ + DWORDLONG dwlNum=0; + BYTE bCurentFigure; + + + while(dwStringLen) + { + if ((bCurentFigure=((*lpcszString)-48))<10) + { + dwlNum*=10;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + dwlNum+=bCurentFigure;// добавляем цифру в младший разряд + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + +return(dwlNum); +} + + + + +__inline DWORD StrToUNumEx(LPCSTR lpcszString,SIZE_T dwStringLen,SIZE_T *pdwNum) +{ + DWORD dwRetErrorCode; + SIZE_T dwNum=0,dwProcessed=0; + BYTE bCurentFigure; + + + while(dwStringLen) + { + if ((bCurentFigure=((*lpcszString)-48))<10) + { + dwNum*=10;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + dwNum+=bCurentFigure;// добавляем цифру в младший разряд + dwProcessed++;// увеличиваем счётчик обработанных цифр + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + if (dwProcessed) + {// как минимум одна цифра была обработана + if (pdwNum) (*pdwNum)=dwNum; + if (dwProcessed==dwStringLen) + {// в строке были только цифры, всё отработало как нужно //Операция успешно завершена. + dwRetErrorCode=NO_ERROR; + }else{// в строке были не только цифры //Имеются дополнительные данные. + dwRetErrorCode=ERROR_MORE_DATA; + } + }else{// строка вообще не содержала цифр //Недопустимые данные. + dwRetErrorCode=ERROR_INVALID_DATA; + } +return(dwRetErrorCode); +} + + +__inline DWORD StrToUNumEx32(LPCSTR lpcszString,SIZE_T dwStringLen,DWORD *pdwNum) +{ + DWORD dwRetErrorCode; + DWORD dwNum=0,dwProcessed=0; + BYTE bCurentFigure; + + + while(dwStringLen) + { + if ((bCurentFigure=((*lpcszString)-48))<10) + { + dwNum*=10;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + dwNum+=bCurentFigure;// добавляем цифру в младший разряд + dwProcessed++;// увеличиваем счётчик обработанных цифр + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + if (dwProcessed) + {// как минимум одна цифра была обработана + if (pdwNum) (*pdwNum)=dwNum; + if (dwProcessed==dwStringLen) + {// в строке были только цифры, всё отработало как нужно //Операция успешно завершена. + dwRetErrorCode=NO_ERROR; + }else{// в строке были не только цифры //Имеются дополнительные данные. + dwRetErrorCode=ERROR_MORE_DATA; + } + }else{// строка вообще не содержала цифр //Недопустимые данные. + dwRetErrorCode=ERROR_INVALID_DATA; + } +return(dwRetErrorCode); +} + + +__inline DWORD StrToUNumEx64(LPCSTR lpcszString,SIZE_T dwStringLen,DWORDLONG *pdwlNum) +{ + DWORD dwRetErrorCode; + DWORDLONG dwlNum=0; + SIZE_T dwProcessed=0; + BYTE bCurentFigure; + + + while(dwStringLen) + { + if ((bCurentFigure=((*lpcszString)-48))<10) + { + dwlNum*=10;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + dwlNum+=bCurentFigure;// добавляем цифру в младший разряд + dwProcessed++;// увеличиваем счётчик обработанных цифр + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + if (dwProcessed) + {// как минимум одна цифра была обработана + if (pdwlNum) (*pdwlNum)=dwlNum; + if (dwProcessed==dwStringLen) + {// в строке были только цифры, всё отработало как нужно //Операция успешно завершена. + dwRetErrorCode=NO_ERROR; + }else{// в строке были не только цифры //Имеются дополнительные данные. + dwRetErrorCode=ERROR_MORE_DATA; + } + }else{// строка вообще не содержала цифр //Недопустимые данные. + dwRetErrorCode=ERROR_INVALID_DATA; + } +return(dwRetErrorCode); +} + + + + +__inline SSIZE_T StrToNum(LPCSTR lpcszString,SIZE_T dwStringLen) +{ + SSIZE_T lNum=0,lSingn=1; + BYTE bCurentFigure; + + + while(dwStringLen && ((bCurentFigure=((*lpcszString)-48))>9)) + { + if (bCurentFigure=='-') lSingn=-1; + if (bCurentFigure=='+') lSingn=1; + + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + while(dwStringLen) + { + if ((bCurentFigure=((*lpcszString)-48))<10) + { + lNum*=10;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + lNum+=bCurentFigure;// добавляем цифру в младший разряд + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + lNum*=lSingn; + +return(lNum); +} + + +__inline LONG StrToNum32(LPCSTR lpcszString,SIZE_T dwStringLen) +{ + LONG lNum=0,lSingn=1; + BYTE bCurentFigure; + + + while(dwStringLen && ((bCurentFigure=((*lpcszString)-48))>9)) + { + if (bCurentFigure=='-') lSingn=-1; + if (bCurentFigure=='+') lSingn=1; + + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + while(dwStringLen) + { + if ((bCurentFigure=((*lpcszString)-48))<10) + { + lNum*=10;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + lNum+=bCurentFigure;// добавляем цифру в младший разряд + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + lNum*=lSingn; + +return(lNum); +} + + +__inline LONGLONG StrToNum64(LPCSTR lpcszString,SIZE_T dwStringLen) +{ + LONGLONG llNum=0,llSingn=1; + BYTE bCurentFigure; + + + while(dwStringLen && ((bCurentFigure=((*lpcszString)-48))>9)) + { + if (bCurentFigure=='-') llSingn=-1; + if (bCurentFigure=='+') llSingn=1; + + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + while(dwStringLen) + { + if ((bCurentFigure=((*lpcszString)-48))<10) + { + llNum*=10;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + llNum+=bCurentFigure;// добавляем цифру в младший разряд + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + llNum*=llSingn; + +return(llNum); +} + + + +__inline DWORD StrToNumEx(LPCSTR lpcszString,SIZE_T dwStringLen,SSIZE_T *plNum) +{ + DWORD dwRetErrorCode; + SIZE_T dwProcessed=0; + SSIZE_T lNum=0,lSingn=1; + BYTE bCurentFigure; + + + while(dwStringLen && ((bCurentFigure=((*lpcszString)-48))>9)) + { + if (bCurentFigure=='-') lSingn=-1; + if (bCurentFigure=='+') lSingn=1; + + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + while(dwStringLen) + { + if ((bCurentFigure=((*lpcszString)-48))<10) + { + lNum*=10;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + lNum+=bCurentFigure;// добавляем цифру в младший разряд + dwProcessed++;// увеличиваем счётчик обработанных цифр + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + if (dwProcessed) + {// как минимум одна цифра была обработана + if (plNum) (*plNum)=(lNum*lSingn); + if (dwProcessed==dwStringLen) + {// в строке были только цифры, всё отработало как нужно //Операция успешно завершена. + dwRetErrorCode=NO_ERROR; + }else{// в строке были не только цифры //Имеются дополнительные данные. + dwRetErrorCode=ERROR_MORE_DATA; + } + }else{// строка вообще не содержала цифр //Недопустимые данные. + dwRetErrorCode=ERROR_INVALID_DATA; + } +return(dwRetErrorCode); +} + + +__inline DWORD StrToNumEx32(LPCSTR lpcszString,SIZE_T dwStringLen,LONG *plNum) +{ + DWORD dwRetErrorCode; + SIZE_T dwProcessed=0; + LONG lNum=0,lSingn=1; + BYTE bCurentFigure; + + + while(dwStringLen && ((bCurentFigure=((*lpcszString)-48))>9)) + { + if (bCurentFigure=='-') lSingn=-1; + if (bCurentFigure=='+') lSingn=1; + + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + while(dwStringLen) + { + if ((bCurentFigure=((*lpcszString)-48))<10) + { + lNum*=10;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + lNum+=bCurentFigure;// добавляем цифру в младший разряд + dwProcessed++;// увеличиваем счётчик обработанных цифр + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + if (dwProcessed) + {// как минимум одна цифра была обработана + if (plNum) (*plNum)=(lNum*lSingn); + if (dwProcessed==dwStringLen) + {// в строке были только цифры, всё отработало как нужно //Операция успешно завершена. + dwRetErrorCode=NO_ERROR; + }else{// в строке были не только цифры //Имеются дополнительные данные. + dwRetErrorCode=ERROR_MORE_DATA; + } + }else{// строка вообще не содержала цифр //Недопустимые данные. + dwRetErrorCode=ERROR_INVALID_DATA; + } +return(dwRetErrorCode); +} + + +__inline DWORD StrToNumEx64(LPCSTR lpcszString,SIZE_T dwStringLen,LONGLONG *pllNum) +{ + DWORD dwRetErrorCode; + SIZE_T dwProcessed=0; + LONGLONG llNum=0,llSingn=1; + BYTE bCurentFigure; + + + while(dwStringLen && ((bCurentFigure=((*lpcszString)-48))>9)) + { + if (bCurentFigure=='-') llSingn=-1; + if (bCurentFigure=='+') llSingn=1; + + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + while(dwStringLen) + { + if ((bCurentFigure=((*lpcszString)-48))<10) + { + llNum*=10;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру + llNum+=bCurentFigure;// добавляем цифру в младший разряд + dwProcessed++;// увеличиваем счётчик обработанных цифр + } + lpcszString++;// перемещаем указатель на следующую позицию + dwStringLen--;// уменьшаем длинну + } + + if (dwProcessed) + {// как минимум одна цифра была обработана + if (pllNum) (*pllNum)=(llNum*llSingn); + if (dwProcessed==dwStringLen) + {// в строке были только цифры, всё отработало как нужно //Операция успешно завершена. + dwRetErrorCode=NO_ERROR; + }else{// в строке были не только цифры //Имеются дополнительные данные. + dwRetErrorCode=ERROR_MORE_DATA; + } + }else{// строка вообще не содержала цифр //Недопустимые данные. + dwRetErrorCode=ERROR_INVALID_DATA; + } +return(dwRetErrorCode); +} + + + + +#endif // !defined(AFX_STRTONUM__H__INCLUDED_) \ No newline at end of file diff --git a/MRA/Sdk/m_music.h b/MRA/Sdk/m_music.h new file mode 100644 index 0000000..4a8ff15 --- /dev/null +++ b/MRA/Sdk/m_music.h @@ -0,0 +1,360 @@ +#ifndef M_MUSIC +#define M_MUSIC + +#define MIID_WATRACK {0xfc6c81f4, 0x837e, 0x4430, {0x96, 0x01, 0xa0, 0xaa, 0x43, 0x17, 0x7a, 0xe3}} + +typedef struct tSongInfoA { + CHAR *artist; + CHAR *title; + CHAR *album; + CHAR *genre; + CHAR *comment; + CHAR *year; + CHAR *mfile; // media file + int kbps; + int khz; + int channels; + int track; + int total; // music length + int time; // elapsed time + CHAR *wndtext; // window title + CHAR *player; // player name + int plyver; // player version + HANDLE icon; // player icon + int fsize; // media file size + int vbr; + int status; // player status: 0 - stopped; 1 - playing; 2 - paused + HWND plwnd; // player window + // video part + int codec; + int width; + int height; + int fps; + __int64 date; + CHAR *txtver; + CHAR *lyric; + CHAR *cover; + int volume; + CHAR *url; +} SONGINFOA, *LPSONGINFOA; + +typedef struct tSongInfo { + WCHAR *artist; + WCHAR *title; + WCHAR *album; + WCHAR *genre; + WCHAR *comment; + WCHAR *year; + WCHAR *mfile; // media file + int kbps; + int khz; + int channels; + int track; + int total; // music length + int time; // elapsed time + WCHAR *wndtext; // window title + WCHAR *player; // player name + int playver; // player version + HANDLE icon; // player icon + int fsize; // media file size + int vbr; + int status; // player status: 0 - stopped; 1 - playing; 2 - paused + HWND plwnd; // player window + // video part + int codec; + int width; + int height; + int fps; + __int64 date; + WCHAR txtver; + // not implemented yet + WCHAR *lyric; + WCHAR *cover; + int volume; + WCHAR *url; +} SONGINFO, *LPSONGINFO; + +#if defined(_UNICODE) + #define WAT_INF_TCHAR WAT_INF_UNICODE + #define SongInfoT tSongInfo +#else + #define WAT_INF_TCHAR WAT_INF_ANSI + #define SongInfoT tSongInfoA +#endif + + // result codes +#define WAT_RES_UNKNOWN -2 +#define WAT_RES_NOTFOUND -1 +#define WAT_RES_ERROR WAT_RES_NOTFOUND +#define WAT_RES_OK 0 +#define WAT_RES_ENABLED WAT_RES_OK +#define WAT_RES_DISABLED 1 + // internal +#define WAT_RES_NEWFILE 3 + +#define WAT_PLS_NORMAL WAT_RES_OK +#define WAT_PLS_NOMUSIC WAT_RES_DISABLED +#define WAT_PLS_NOTFOUND WAT_RES_NOTFOUND + +#define WAT_INF_UNICODE 0 +#define WAT_INF_ANSI 1 +#define WAT_INF_UTF8 2 +#define WAT_INF_CHANGES 0x100 + +/* + wParam : WAT_INF_* constant + lParam : pointer to LPSONGINGO (Unicode) or LPSONGINFOA (ANSI/UTF8) + Affects: Fill structure by currently played music info + returns: WAT_PLS_* constant + note: pointer will be point to global SONGINFO structure of plugin + warning: Non-Unicode data filled only by request + if lParam=0 only internal SongInfo structure will be filled + Example: + LPSONGINFO p; + PluginLink->CallService(MS_WAT_GETMUSICINFO,0,(DWORD)&p); +*/ + +#define MS_WAT_GETMUSICINFO "WATrack/GetMusicInfo" + +/* + wParam:0 + lParam : pointer to pSongInfo (Unicode) + Affects: Fill structure by info from file named in SongInfo.mfile + returns: 0, if success + note: fields, which values can't be obtained, leaves old values. + you must free given strings by miranda mmi.free +*/ +#define MS_WAT_GETFILEINFO "WATrack/GetFileInfo" + +/* + wParam: encoding (WAT_INF_* consts, 0 = WAT_INF_UNICODE) + lParam: codepage (0 = ANSI) + Returns Global unicode SongInfo pointer or tranlated to Ansi/UTF8 structure +*/ +#define MS_WAT_RETURNGLOBAL "WATrack/GetMainStructure" + +#define WAT_CTRL_PREV 1 +#define WAT_CTRL_PLAY 2 +#define WAT_CTRL_PAUSE 3 +#define WAT_CTRL_STOP 4 +#define WAT_CTRL_NEXT 5 +#define WAT_CTRL_VOLDN 6 +#define WAT_CTRL_VOLUP 7 +#define WAT_CTRL_SEEK 8 // lParam is new position (sec) +/* + wParam: button code (WAT_CTRL_* const) + lParam: 0, or value (see WAT_CTRL_* const comments) + Affects: emulate player button pressing + returns: 0 if unsuccesful +*/ +#define MS_WAT_PRESSBUTTON "WATrack/PressButton" + +/* + Get user's Music Info +*/ +#define MS_WAT_GETCONTACTINFO = "WATrack/GetContactInfo" + +// ------------ Plugin/player status ------------ + +/* + wParam: 1 - switch off plugin + 0 - switch on plugin + -1 - switch plugin status + 2 - get plugin version + other - get plugin status + lParam: 0 + Affects: Switch plugin status to enabled or disabled + returns: version, old plugin status, 0, if was enabled +*/ + +#define MS_WAT_PLUGINSTATUS "WATrack/PluginStatus" + +#define ME_WAT_MODULELOADED "WATrack/ModuleLoaded" + +#define WAT_EVENT_PLAYERSTATUS 1 // 0-normal; 1-no music (possibly stopped); 2-not found +#define WAT_EVENT_NEWTRACK 2 +#define WAT_EVENT_PLUGINSTATUS 3 // 0-enabled; 1-dis.temporary; 2-dis.permanent +#define WAT_EVENT_NEWPLAYER 4 // +#define WAT_EVENT_NEWTEMPLATE 5 // TM_* constant + +/* + Plugin or player status changed: + wParam: type of event (see above) + lParam: value +*/ +#define ME_WAT_NEWSTATUS "WATrack/NewStatus" + +// ---------- Popup module ------------ + +/* + wParam: not used + lParam: not used + Affects: Show popup or Info window with current music information + note: Only Info window will be showed if Popup plugin disabled +*/ + +#define MS_WAT_SHOWMUSICINFO "WATrack/ShowMusicInfo" + +// --------- Statistic (report) module ------------- + +/* + wParam: pointer to log file name or NULL + lParam: pointer to report file name or NULL + Affects: Create report from log and run it (if option is set) + returns: 0 if unsuccesful + note: if wParam or lParam is a NULL then file names from options are used +*/ +#define MS_WAT_MAKEREPORT "WATrack/MakeReport" + +/* + wParam, lParam - not used + Affects: pack statistic file +*/ +#define MS_WAT_PACKLOG = "WATrack/PackLog" + +/* + wParam: not used + lParam: pointer to SongInfo +*/ +#define MS_WAT_ADDTOLOG = "WATrack/AddToLog" + +// ----------- Formats and players ----------- + +// media file status + +#define WAT_MES_STOPPED 0 +#define WAT_MES_PLAYING 1 +#define WAT_MES_PAUSED 2 +#define WAT_MES_UNKNOWN -1 + +#define WAT_ACT_REGISTER 1 +#define WAT_ACT_UNREGISTER 2 +#define WAT_ACT_DISABLE 3 +#define WAT_ACT_ENABLE 4 +#define WAT_ACT_GETSTATUS 5 // not found/enabled/disabled +#define WAT_ACT_SETACTIVE 6 +#define WAT_ACT_REPLACE 0x10000 // can be combined with WAT_REGISTERFORMAT + + // flags +#define WAT_OPT_DISABLED 0x00000001 // format registered but disabled +#define WAT_OPT_ONLYONE 0x00000002 // format can't be overwriten +#define WAT_OPT_PLAYERINFO 0x00000004 // song info from player +#define WAT_OPT_WINAMPAPI 0x00000008 // Winamp API support +#define WAT_OPT_CHECKTIME 0x00000010 // check file time for changes +#define WAT_OPT_VIDEO 0x00000020 // only for format registering used +#define WAT_OPT_LAST 0x00000040 // (internal) +#define WAT_OPT_FIRST 0x00000080 // (internal) +#define WAT_OPT_TEMPLATE 0x00000100 // (internal) +#define WAT_OPT_IMPLANTANT 0x00000200 // use process implantation +#define WAT_OPT_HASURL 0x00000400 // (player registration) URL field present +#define WAT_OPT_CHANGES 0x00000800 // obtain only chaged values + // (volume, status, window text, elapsed time) +#define WAT_OPT_APPCOMMAND 0x00001000 // Special (multimedia) key support +#define WAT_OPT_CHECKALL 0x00002000 // Check all players +#define WAT_OPT_KEEPOLD 0x00004000 // Keep Old opened file +#define WAT_OPT_MULTITHREAD 0x00008000 // Use multithread scan +#define WAT_OPT_SINGLEINST 0x00010000 // Single player instance + + +typedef BOOL (__cdecl *LPREADFORMATPROC)(LPSONGINFO Info); + +typedef struct tMusicFormat { + LPREADFORMATPROC proc; + CHAR ext[8]; + int flags; +} MUSICFORMAT, *LPMUSICFORMAT; + +/* + wParam: action + lParam: pointer to MUSICFORMAT if wParam = WAT_ACT_REGISTER, + else - pointer to extension string (ANSI) + returns: see result codes +*/ + +#define MS_WAT_FORMAT "WATrack/Format" + +/* + wParam - pointer to SONGINFO structure (plwind field must be initialized) + lParam - flags +*/ + +#define MS_WAT_WINAMPINFO "WATrack/WinampInfo" + +/* + wParam: window + lParam: LoWord - command; HiWord - value +*/ + +#define MS_WAT_WINAMPCOMMAND "WATrack/WinampCommand" + +/* + tInitProc = function():integer;cdecl; + tDeInitProc = function():integer;cdecl; + tStatusProc = function(wnd:HWND):integer;cdecl; +*/ + +typedef int (__cdecl *LPINITPROC)(); +typedef int (__cdecl *LPDEINITPROC)(); +typedef int (__cdecl *LPGETSTATUSPROC)(HWND wnd); +typedef WCHAR (__cdecl *LPNAMEPROC)(HWND wnd, int flags); +typedef HWND (__cdecl *LPCHECKPROC)(HWND wnd, int flags); +typedef int (__cdecl *LPINFOPROC)(LPSONGINFO Info, int flags); +typedef int (__cdecl *LPCOMMANDPROC)(HWND wnd, int command, int value); + +typedef struct tPlayerCell { + CHAR *Desc; + int flags; + HICON Icon; // can be 0. for registration only + LPINITPROC Init; + LPDEINITPROC DeInit; + LPCHECKPROC Check; // check player + LPGETSTATUSPROC GetStatus; + LPNAMEPROC GetName; // can be NULL. get media filename + LPINFOPROC GetInfo; // can be NULL. get info from player + LPCOMMANDPROC Command; // can be NULL. send command to player + CHAR *URL; // only if WAT_OPT_HASURL flag present + WCHAR *Notes; +} PLAYERCELL, *LPPLAYERCELL; + +/* + wParam: action + lParam: pointer to PLAYERCELL if wParam = WAT_ACT_REGISTER, + else - pointer to player description string (ANSI) + returns: player window handle or value>0 if found + note: If you use GetName or GetInfo field, please, do not return empty + filename even when mediafile is remote! +*/ + +#define MS_WAT_PLAYER "WATrack/Player" + +// --------- Last FM --------- + +#define MS_WAT_LASTFM "WATrack/LastFM" + +// --------- Templates ---------- + +/* + wParam: not used + lParam: Unicode template + returns: New Unicode (replaced) string +*/ +#define MS_WAT_REPLACETEXT "WATrack/ReplaceText" + +/* + event types for History + Blob structure for EVENTTYPE_WAT_ANSWER: + Uniciode artist#0title#0album#0answer +*/ +#define EVENTTYPE_WAT_REQUEST 9601 +#define EVENTTYPE_WAT_ANSWER 9602 +#define EVENTTYPE_WAT_ERROR 9603 +#define EVENTTYPE_WAT_MESSAGE 9604 + +/* + wParam: 0 or parent window + lParam: 0 + note: Shows Macro help window with edit aliases ability +*/ +#define MS_WAT_MACROHELP "WATrack/MacroHelp" + +#endif diff --git a/MRA/Sdk/m_nudge.h b/MRA/Sdk/m_nudge.h new file mode 100644 index 0000000..dc0f367 --- /dev/null +++ b/MRA/Sdk/m_nudge.h @@ -0,0 +1,3 @@ +#define MS_SHAKE_CLIST "SHAKE/Service/ShakeClist" +#define MS_SHAKE_CHAT "SHAKE/Service/ShakeChat" +#define MS_NUDGE_SEND "NUDGE/Send" diff --git a/MRA/Sdk/m_proto_listeningto.h b/MRA/Sdk/m_proto_listeningto.h new file mode 100644 index 0000000..53e1184 --- /dev/null +++ b/MRA/Sdk/m_proto_listeningto.h @@ -0,0 +1,144 @@ +/* + +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2006 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +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. +*/ + +//this module was created in v0.6.0.0 + +#ifndef M_PROTO_LISTENINGTO_H__ +#define M_PROTO_LISTENINGTO_H__ 1 + + +// Protocol Services ///////////////////////////////////////////////////////////////// + +// This is the services a protocol have to support to support listening info + +typedef struct { + int cbSize; + + union { + char* pszType; // Media type: Music, Video, etc... + TCHAR* ptszType; + }; + union { + char* pszArtist; // Artist name + TCHAR* ptszArtist; + }; + union { + char* pszAlbum; // Algum name + TCHAR* ptszAlbum; + }; + union { + char* pszTitle; // Song name + TCHAR* ptszTitle; + }; + union { + char* pszTrack; // Track number + TCHAR* ptszTrack; + }; + union { + char* pszYear; // Song year + TCHAR* ptszYear; + }; + union { + char* pszGenre; // Song genre + TCHAR* ptszGenre; + }; + union { + char* pszLength; // Song length + TCHAR* ptszLength; + }; + union { + char* pszPlayer; // Player name + TCHAR* ptszPlayer; + }; + + DWORD dwFlags; + +} LISTENINGTOINFO; + +#define LTI_UNICODE 1 + +#ifdef UNICODE + #define LTI_TCHAR LTI_UNICODE +#else + #define LTI_TCHAR 0 +#endif + +// Set the listening info for the protocol. +// Pass NULL to remove it. +// wParam = NULL +// lParam = LISTENINGTOINFO * +#define PS_SET_LISTENINGTO "/SetListeningTo" + +// Get the listening info for the protocol +// wParam = NULL +// lParam = LISTENINGTOINFO * +// The strings inside the struct need to be free using miranda free. +#define PS_GET_LISTENINGTO "/GetListeningTo" + +// Also the protocol have to save a string with the text the other user is (probabily) +// seeing under the main db key: /ListeningTo + +// For a contact, the protocol should store the listening info as an string inside +// the contact db key: /ListeningTo + + +// ListeningTo configuration plugin ////////////////////////////////////////////////// + +// One plugin can be used to set some options relative to the listening to information. +// But protocols should not assume this plugin exists. If it does not exist, protocols +// have to decide what default to use. +// This plugin have to support the following services: + +// Get the text format the user wants him / his contacts to see. Some strings represents +// the text information: +// %artist%, %album%, %title%, %track%, %year%, %genre%, %length%, %player%, %type% +// This service is optional +// wParam = TCHAR* - default text for this protocol +// lParam = 0 +// Returns a TCHAR* containg the user setting. This need to be free using miranda free. +#define MS_LISTENINGTO_GETTEXTFORMAT "ListeningTo/GetTextFormat" + +// Get the text the user wants him / his contacts to see, parsed with the info sent to +// this service. Uses the same variables as the above service to the default text. +// wParam = TCHAR* - default text for this protocol +// lParam = LISTENINGTOINFO * +// Returns a TCHAR* containg the parsed text. This need to be free using miranda free. +#define MS_LISTENINGTO_GETPARSEDTEXT "ListeningTo/GetParsedText" + +// Get if the contact options about how to show the music info should be overriten or +// not. +// wParam = NULL +// lParam = hContact +// Returns a BOOL +#define MS_LISTENINGTO_OVERRIDECONTACTOPTION "ListeningTo/OverrideContactOption" + +// Get the text to show if some info of the contact is empty. +// wParam = NULL +// lParam = NULL +// Returns a TCHAR *. Don't free +#define MS_LISTENINGTO_GETUNKNOWNTEXT "ListeningTo/GetUnknownText" + + +#endif // M_PROTO_LISTENINGTO_H__ + + diff --git a/MRA/Sdk/timefuncs.h b/MRA/Sdk/timefuncs.h new file mode 100644 index 0000000..e170b0a --- /dev/null +++ b/MRA/Sdk/timefuncs.h @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2009 Rozhuk Ivan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + + +#if !defined(AFX_TIME_FUNCS__H__INCLUDED_) +#define AFX_TIME_FUNCS__H__INCLUDED_ + + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include +#include + + + +#define _MAX__TIME32_T 0x7fffd27f // number of seconds from + // 00:00:00, 01/01/1970 UTC to + // 23:59:59, 01/18/2038 UTC + +// Number of 100 nanosecond units from 1/1/1601 to 1/1/1970 +#define EPOCH_BIAS 116444736000000000i64 + +//nion to facilitate converting from FILETIME to unsigned __int64 +typedef union { + unsigned __int64 ft_scalar; + FILETIME ft_struct; + } FT; + + +static inline __time32_t __cdecl _time32(__time32_t *timeptr) +{ + __time64_t tim; + FT nt_time; + + GetSystemTimeAsFileTime(&(nt_time.ft_struct)); + tim=(__time64_t)((nt_time.ft_scalar-EPOCH_BIAS)/10000000i64); + if (tim > (__time64_t)(_MAX__TIME32_T)) tim=(__time64_t)(-1); + if (timeptr) *timeptr = (__time32_t)(tim);// store time if requested + +return(__time32_t)(tim); +} + + +inline __time32_t MakeTime32FromLocalSystemTime(CONST PSYSTEMTIME pcstSystemTime) +{ + __time64_t tim=0; + FT nt_time; + + if (SystemTimeToFileTime(pcstSystemTime,&(nt_time.ft_struct))) + { + if (LocalFileTimeToFileTime(&(nt_time.ft_struct),&(nt_time.ft_struct))) + { + tim=(__time64_t)((nt_time.ft_scalar-EPOCH_BIAS)/10000000i64); + if (tim > (__time64_t)(_MAX__TIME32_T)) tim=(__time64_t)(-1); + } + } +return(__time32_t)(tim); +} + + +inline BOOL MakeLocalSystemTimeFromTime32(__time32_t tim32,PSYSTEMTIME pstSystemTime) +{ + BOOL bRet=FALSE; + + if (pstSystemTime) + { + __time64_t tim=(__time64_t)tim32; + FT nt_time; + + //if (tim==(__time64_t)(-1)) tim=(__time64_t)(_MAX__TIME32_T); + nt_time.ft_scalar=(__time64_t)((tim*10000000i64)+EPOCH_BIAS); + if (FileTimeToLocalFileTime(&(nt_time.ft_struct),&(nt_time.ft_struct))) + { + bRet=FileTimeToSystemTime(&(nt_time.ft_struct),pstSystemTime); + } + } +return(bRet); +} + + + +static inline __time32_t __cdecl _mktime32(struct tm *ptmTime) +{ + SYSTEMTIME stTime; + + stTime.wMilliseconds=0; + stTime.wSecond=ptmTime->tm_sec; // seconds after the minute - [0,59] + stTime.wMinute=ptmTime->tm_min; // minutes after the hour - [0,59] + stTime.wHour=ptmTime->tm_hour; // hours since midnight - [0,23] + stTime.wDay=ptmTime->tm_mday; // day of the month - [1,31] + stTime.wMonth=(ptmTime->tm_mon+1); // months since January - [0,11] + stTime.wYear=(ptmTime->tm_year+1900); // years since 1900 + stTime.wDayOfWeek=0;//ptmTime->tm_wday; // days since Sunday - [0,6] + //ptmTime->tm_yday; // days since January 1 - [0,365] + //ptmTime->tm_isdst; // daylight savings time flag +return(MakeTime32FromLocalSystemTime(&stTime)); +} + + + + + +#endif // !defined(AFX_TIME_FUNCS__H__INCLUDED_) diff --git a/MRA/Sdk/zlib.h b/MRA/Sdk/zlib.h new file mode 100644 index 0000000..9ee4ea4 --- /dev/null +++ b/MRA/Sdk/zlib.h @@ -0,0 +1,1357 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.3, July 18th, 2005 + + Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "..\Plugins\Zlib\zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.3" +#define ZLIB_VERNUM 0x1230 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative + * values are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumualte before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + the value returned by deflateBound (see below). If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there + is no more input data or no more space in the output buffer (see below + about the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, + Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() stop + if and when it gets to the next deflate block boundary. When decoding the + zlib or gzip format, this will cause inflate() to return immediately after + the header and before the first block. When doing a raw inflate, inflate() + will go ahead and process the first block, and will return when it gets to + the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 + if inflate() is currently decoding the last block in the deflate stream, + plus 128 if inflate() returned immediately after decoding an end-of-block + code or decoding the complete header up to just before the first byte of the + deflate stream. The end-of-block will not be indicated until all of the + uncompressed data from that block has been written to strm->next_out. The + number of unused bits may in general be greater than seven, except when + bit 7 of data_type is set, in which case the number of unused bits will be + less than eight. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster approach + may be used for the single inflate() call. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() will decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically. Any information + contained in the gzip header is not retained, so applications that need that + information should instead use raw inflate, see inflateInit2() below, or + inflateBack() and perform their own processing of the gzip header and + trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may then + call inflateSync() to look for a good compression block if a partial recovery + of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), + no header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as + Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy + parameter only affects the compression ratio but not the correctness of the + compressed output even if it is not set appropriately. Z_FIXED prevents the + use of dynamic Huffman codes, allowing for a simpler decoder for special + applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front. In addition, the + current implementation of deflate will use at most the window size minus + 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() + or deflateInit2(). This would be used to allocate an output buffer + for deflation in a single pass, and so would be called before deflate(). +*/ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the + bits leftover from a previous deflate stream when appending to it. As such, + this function can only be used for raw deflate, and must be used before the + first deflate() call after a deflateInit2() or deflateReset(). bits must be + less than or equal to 16, and that many of the least significant bits of + value will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is + a crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg + is set to null if there is no error message. inflateInit2 does not perform + any decompression apart from reading the zlib header if present: this will + be done by inflate(). (So next_in and avail_in may be modified, but next_out + and avail_out are unchanged.) +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called + immediately after inflateInit2() or inflateReset() and before any call of + inflate() to set the dictionary. The application must insure that the + dictionary that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK can be used to + force inflate() to return immediately after header processing is complete + and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When + any of extra, name, or comment are not Z_NULL and the respective field is + not present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the paramaters are invalid, Z_MEM_ERROR if the internal state could not + be allocated, or Z_VERSION_ERROR if the version of the library does not + match the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free + the allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects + only the raw deflate stream to decompress. This is different from the + normal behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format + error in the deflate stream (in which case strm->msg is set to indicate the + nature of the error), or Z_STREAM_ERROR if the stream was not properly + initialized. In the case of Z_BUF_ERROR, an input or output error can be + distinguished using strm->next_in which will be Z_NULL only if in() returned + an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to + out() returning non-zero. (in() will always be called before out(), so + strm->next_in is assured to be defined if out() returns non-zero.) Note + that inflateBack() cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the + basic stream-oriented functions. To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least the value returned + by compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + This function can be used to compress a whole file at once if the + input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before + a compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +*/ + + +typedef voidp gzFile; + +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +/* + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h", or 'R' for run-length encoding + as in "wb1R". (See the description of deflateInit2 for more information + about the strategy parameter.) + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). */ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. + The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). + gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. + gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). */ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +*/ + +ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). The number of + uncompressed bytes written is limited to 4095. The caller should assure that + this limit is not exceeded. If it is exceeded, then gzprintf() will return + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. + gzgets returns buf, or Z_NULL in case of error. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read again later. + Only one character of push-back is allowed. gzungetc() returns the + character pushed, or -1 on failure. gzungetc() will fail if a + character has been pushed but not read yet, or if c is -1. The pushed + character will be discarded if the stream is repositioned with gzseek() + or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. + gzflush should be called only when strictly necessary because it can + degrade compression. +*/ + +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); +/* + Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +/* + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns 1 if file is being read directly without decompression, otherwise + zero. +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); +/* + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is NULL, this function returns the required initial + value for the for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + +/* + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + + +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; /* hack for buggy compilers */ +#endif + +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); +ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/MRA/TODO.txt b/MRA/TODO.txt new file mode 100644 index 0000000..6366e73 --- /dev/null +++ b/MRA/TODO.txt @@ -0,0 +1,28 @@ +настройки!!! + +Небольшой feature request: +Вот, реализованна система, что при получении нового письма в попапе пишется имя отправителя и тема письма. Так вот хотелось бы, чтобы ещё и майловский аватар вставлялся в попап, если отправляется письмо с майла =) +Если нет возможности ждать, пока подгрузится аватара из интернет, то можно хотя бы локальные аватары вставлять. +Ещё можно в поле From вставлять имя из контакт-листа. + + + +MRA_PDA_INBOX_URL + +телефонные контакты + +группы на сервере + +Запрос ящика/пароля при первом запуске (для удобства создания сборок) + +Возможность апдейтером скачивать и ставить беты + +при туплении нужно каждые 10 сек кидать новую нотификацию пока не придёт PROTOTYPE_SELFTYPING_OFF + +запуск программы при приходе новой почты + +Загрузка на сервер аватары и инфы юзера из настроек миранды + +? добавить контакт OWNER, с временными атрибутами + +? Посылать бессмертные уведомления о туплении, вести свой учёт таймаута в очереди и полать самому отключение по таймауту или по событию \ No newline at end of file diff --git a/MRA/langpack_MRA_russian.txt b/MRA/langpack_MRA_russian.txt new file mode 100644 index 0000000..52d6fb9 --- /dev/null +++ b/MRA/langpack_MRA_russian.txt @@ -0,0 +1,663 @@ +Miranda Language Pack Version 1 +Language: Russian (RU) +Locale: 0419 +Last-Modified-Using: Miranda IM 0.8 Unicode +Authors: Rozhuk Ivan +Author-email: Rozhuk_I@mail.ru +Plugins-included: mail.ru Agent +X-Version: 1.17.0.0 + + + +; Главное меню + +[Display &Inbox] +Открыть входящие + +[Display &Inbox status] +Показать состояние ящика + +[Send SMS] +Отправить SMS + +[Edit &Profile] +Редактировать анкету + +[My Album] +Мой альбом + +[My Blog] +Мой блог + +[My Blog Status] +Статус моего блога + +[My Video] +Моё видео + +[My Answers] +Мои ответы + +[My World] +Мой мир + +[Zhuki] +Жуки + +[Chat] +Чат + +[Web search] +Поиск в вебе + +[Update all users info] +Обновить информацию всех пользователей + +[Check updates users avatars] +Проверить обновления образов пользователей + +[Request authorization for all] +Запросить авторизацию у всех + + + +; меню контакта + +[Request authorization] +Запросить авторизацию + +[Grant authorization] +Авторизовать + +[&Send postcard] +Отправить открытку + +[&View Album] +Посмотреть альбом + +[&Read Blog] +Блог + +[View Video] +Посмотреть видео + +[Answers] +Ответы + +[World] +Мир + + +; иконки + +[Mail box deleted] +Почтовый ящик удалён + +[Contact not on server] +Контакт отсуствует на сервере + +[Not authorized] +Не авторизован + +[Phone/SMS only contact] +Телефонный/SMS контакт + + + +; внутренние строки +[plugin connections] +соединения плагина + +[Avatars] +Аватары + +[From: %s\r\nSubject: %s\r\n%s] +От: %s\r\nТема: %s\r\n%s + +[Unread mail is available: %lu/%lu messages] +Не прочитанная почта: %lu/%lu сообщений + +[No unread mail is available\r\nTotal messages: %lu] +Не прочитанной почты нет\r\nВсего сообщений: %lu + +[Server error: cant get MPOP key for web authorize] +Ошибка сервера: не возможно получить MPOP ключ для веб авторизации + +[Offline message processing error, message will not deleted from server] +Ошибка при обработке оффлайнового сообщения, оно не будет удалено с сервера + +[Undefined message deliver error, time out] +Неизвестная ошибка при доставке сообщения, время ожидания истекло + +[Please, setup e-mail in options] +Пожалуйста, введите e-mail в настройках + +[Please, setup password in options] +Пожалуйста, введите пароль в настройках + +[Can't connect to MRIM server, error] +Невозможно подключится к серверу сообщений, ошибка + +[NLB data corrupted] +Данные от сервера балансировки нагрузки повреждены + +[Can't get data for NLB, error] +Невозможно получить данные от сервера балансировки нагрузки, ошибка + +[Can't connect to NLB server, error] +Невозможно подключится к серверу балансировки нагрузки, ошибка + +[Disconnected, socket error] +Отключено, ошибка сокета + +[Disconnected, socket read error] +Отключено, ошибка сокета при получении данных + +[Logon error: invalid login/password] +Ошибка при проверки имени пользователя/пароля + +[Another user connected with your login] +Пользователь отключен из-за параллельного входа с его логином + +[Message rejected - no such user] +Сообщение не доставленно - пользователь не существует + +[Internal server error] +Внутренняя ошибка сервера + +[Offline messages limit exceeded] +Превышен предел хранимых сообщений + +[Message is too large] +Слишком большое сообщение + +[User does not accept offline messages] +Пользователь не может принимать сообщения когда его нет в сети + +[User does not accept offline flash animation] +Пользователь не может принимать мульты когда его нет в сети + +[Undefined message deliver error, code: %lu] +Сообщение не доставленно, неизвестная ошибка, код: %lu + +[MRIM_CS_MESSAGE_STATUS: not found in queue] +MRIM_CS_MESSAGE_STATUS: не найден в очереди + +[Sended data is invalid] +Переданные данные были некорректны + +[User does not registred] +Пользователь не зарегестрирован + +[Invalid user name] +Некорректное имя пользователя + +[User allready added] +Пользователь уже есть в контакт-листе + +[Group limit is 20] +Превышено максимально допустимое количество групп (20) + +[MRIM_CS_*_CONTACT_ACK: not found in queue] +MRIM_CS_*_CONTACT_ACK: не найден в очереди + +[MRIM_ANKETA_INFO: not found in queue] +MRIM_ANKETA_INFO: не найдено в очереди + +[MRIM_CS_SMS_ACK: not found in queue] +MRIM_CS_SMS_ACK: не найден в очереди + +[Proxy File transfer: error] +Прокси Передача файлов: ошибка + +[Proxy File transfer: incompatible versions] +Прокси Передача файлов: не совместимые версии + +[MRIM_CS_FILE_TRANSFER_ACK: unknown error, code: %lu] +MRIM_CS_FILE_TRANSFER_ACK: неизвестная ошибка, код: %lu + +[MRIM_CS_*_CONTACT_ACK: unknown server error, code: %lu] +MRIM_CS_*_CONTACT_ACK: неизвестная ошибка сервера, код: %lu + +[MRIM_CS_GAME: unknown internal game message code: %lu] +MRIM_CS_GAME: неизвестный внутренний код игрового сообщения: %lu + +[MRIM_CS_CONTACT_LIST2: unknown server error, code: %lu] +MRIM_CS_CONTACT_LIST2: неизвестная ошибка сервера, код: %lu + +[MRIM_CS_CONTACT_LIST2: bad contact list] +MRIM_CS_CONTACT_LIST2: найденный контакт-лист некорректен + +[MRIM_CS_CONTACT_LIST2: internal server error] +MRIM_CS_CONTACT_LIST2: внутренняя ошибка сервера + +[Mail.ru System notify] +Системное уведомление от администрации Mail.ru + +[Avatars: can't add request to queue, error] +Аватары: невозможно добавить запрос в очередь, ошибка + +[Avatars: can't connect to server, error] +Аватары: невозможно подключится к серверу, ошибка + +[Avatars: error on send HTTP request] +Аватары: ошибка при отправке HTTP запроса + +[Avatars: error on receive HTTP answer] +Аватары: ошибка при получении HTTP ответа + +[Avatars: cant open file %S, error %lu: %s] +Аватары: невозможно открыть файл %S, ошибка %lu: %s + +[Avatars: error on receive file data] +Аватары: ошибка при получении содержимого файла + +[Avatars: cant write file data, error] +Аватары: невозможно записать данные в файл, ошибка + +[Avatars: server return HTTP code: %lu] +Аватары: сервер вернул HTTP код: %lu + + +[Are you sure?] +Вы уверены? + +[E-mail address] +E-mail адрес + +[You cannot send when you are offline.] +Вы не можете отправлять сообщения пока не подключились. + +[Cant allocate buffer for convert to unicode.] +Не удалось выделить буффер для преобразования в юникод + +[Select e-mail] +Выбор электронной почты + +[Your contact wakes you] +Ваш собеседник будит вас + +[invisible status changed] +статус невидимости изменился + +[Files exchange: cant create listen soscket, will try connect to remonte host. Error] +Обмен файлами: не могу создать слушающий сокет, попробую подключится к удалённом компьютеру. Ошибка + +[MraFilesQueueConnectionReceived: connection accepted, but pExtra=NULL, this is miranda bug.] +MraFilesQueueConnectionReceived: входящее подключение принято, но pExtra=NULL, это ошибка миранды. + +[Receive files: error] +Получение файлов: ошибка + +[Receive files: error on receive file data] +Получение файлов: ошибка при получении содержимого файла + +[Receive files: cant write file data, error] +Получение файлов: невозможно записать данные в файл, ошибка + +[Receive files: cant allocate disk space for file, size %lu bytes, error %lu: %s] +Получение файлов: не удалось выделить место на диске для файла, размером %lu байт, ошибка %lu: %s + +[Receive files: cant open file %S, error %lu: %s] +Получение файлов: невозможно открыть файл %S, ошибка %lu: %s + +[Receive files: request for file %S not sended, error %lu: %s] +Получение файлов: запрос на получение файла %S не отправлен, ошибка %lu: %s + +[Send files: file send request not received, error] +Отправка файлов: запрос на отправку файла не получен, ошибка + +[Send files: error on send file data] +Отправка файлов: ошибка при отправке содержимого файла + +[Send files: cant read file data, error] +Отправка файлов: невозможно прочитать содержимое файла, ошибка + +[Send files: cant open file %S, error %lu: %s] +Отправка файлов: невозможно открыть файл %S, ошибка %lu: %s + +[Send files: requested file: %S - not found in send files list.] +Отправка файлов: запрошенный файл: %S - не найден среди файлов подготовленных к отправке + +[Send files: bad file send request - invalid header] +Отправка файлов: запрос на передачу файла - ошибочный заголовок + +[Send files: bad file send request - to small packet] +Отправка файлов: запрос на передачу файла - слишком маленький с запросом + + + +; аккаунт + +[Leave empty if you dont want change password] +Оставьте пустым если не хотите менять пароль + +[Create a new Mail.ru account using the Mail.ru website] +Зарегестрироваться в Mail.ru + +[Retrieve a lost password] +Забыли пароль? + +[Example: Petrov_Ivan@mail.ru] +Пример: Petrov_Ivan@mail.ru + +[Full e-mail:] +Полный e-mail: + + + +; аватары + +[Enable avatars support (loading)] +Включить поддержку образов (загружать) + +[Use keep-alive connections] +Использовать постоянные соединения (keep-alive) + +[Updates check interval, min] +Интервал проверки обновлений, минут + +[Return absolute path] +Возвращать абсолютный путь + +[Delete avatar file with contact] +Удалять файл образа вместе с контактом + + + +; подключения + +[Automatic request authorization on logon] +Автоматически запрашивать авторизацию при подключении + +[Automatic add contacts to server list on logon] +Автоматически добавлять контакты на сервер при подключении + +[Automatic grand authorization to users in contact list] +Автоматически авторизовывать пользователей из списка + +[Automatic grand authorization to new users] +Автоматически авторизовывать новых пользователей + +[Disable spam check] +Не проверять на спам + +[Hide menu items for non MRA contacts] +Скрывать опции меню для не MRA контактов + +[Notify about new mail if increment] +Уведомлять только о новой почте + +[Notify about new mail tray icon] +Показывать иконку в трее при приходе почты + +[Click to Inbox] +Проверить почту щелчком + +[Show received Formated text (RTF receive)] +Показывать принятый форматированный текст + +[Send Formated text (send RTF)] +Отправлять Форматированный текст + + +; антиспам + +[Anti spam] +Антиспам + +[Enable Anti Spam] +Включить антиспам + +[Check temp contacts] +Проверять временные контакты из списка + +[Delete spam bot contacts] +Удалять контакты спам ботов из списка + +[Ignory non AlphaNumeric characters] +Игнорировать символы не явлющиеся буквой/цифрой при проверке + +[Max. language changes in message (0 - disabled)] +Макс. колличество смены языков в сообщении (0 - выкл) + +[Show pop up] +Показывать всплывающие окна + +[Write to system history] +Записывать в системную историю + +[Send spam report to server] +Пожаловатся на спам + +[Bad words list] +Список плохих слов + +[Spam bot blocked] +Спам бот заблокирован + +[Spam bot contact deleted] +Контакт спам бота удалён из списка + + + +; файлы + +[Files exchange] +Обмен файлами + +[Enable direct connections] +Разрешить прямые подключения + +[No out connection on send] +Запретить исходящие подключения при отправке + +[No out connection on receive] +Запретить исходящие подключения при получении + +[Out connections: ignory additional ports (443, 2041)] +Исходящие подключения: игнорировать доп. порты (443, 2041) + +[Hide my IP addresses] +Скрывать мои IP адреса + +[Add extra address] +Добавить дополнительные адреса + +[Enable MRIM proxy connections] +Разрешить использование MRIM прокси + +[File send block size:] +Размер блока при отправке: + +[512 - 65536 bytes] +512 - 65536 байт + + +; попапы + +[PopUp type] +Тип попапа + +[Popup settings] +Настройки попапа + +[None] +Нет + +[Debug] +Отладка + +[Information] +Информация + +[Question] +Вопрос + +[Warning] +Предупреждение + +[Error] +Ошибка + +[NewMail] +Новая почта + + +; X Statuses +[Closing in] +Зароется через + +[Sick] +Болею + +[Home] +Дом + +[Eating] +Кушаю + +[Compass] +Компас + +[On WC] +В туалете + +[Cooking] +Готовлю еду + +[Walking] +Гуляю + +[Alien] +Пришелец + +[Shrimp] +Креветка + +[Got lost] +Заблудился + +[Crazy] +Сошел с ума + +[Duck] +Утка + +[Playing] +Играю + +[Smoking] +Курю + +[Office] +Офис + +[Meeting] +На встрече + +[Beer] +Пиво + +[Coffee] +Кофе + +[Working] +Работаю + +[Relaxing] +Отдыхаю + +[On the phone] +На телефоне + +[In institute] +В институте + +[At school] +В школе + +[Wrong number] +Ошиблись номером + +[Laughing] +Смеюсь + +[Malicious] +Ехидный + +[Imp] +Чертенок + +[Blind] +Слепой + +[Disappointed] +Расстроен + +[Almost crying] +Сдерживаю слезы + +[Fearful] +Испуган + +[Angry] +Злой + +[Vampire] +Вампир + +[Ass] +Задница + +[Love] +Любовь + +[Sleeping] +Сплю + +[Cool!] +Класс! + +[Peace!] +Миру-мир! + +[Cock a snook] +Фига + +[Get out] +Отвалите + +[Death] +Смерть + +[Rocket] +Ракета + +[Devil-fish] +Осьминожек + +[Heavy metal] +Металлист + +[Things look bad] +Отстой + +[Squirrel] +Белка + +[Star] +Звезда + +[Music] +Слушаю музыку + +[Dating] +Знакомлюсь + + + + + + + diff --git a/MRA/proto.h b/MRA/proto.h new file mode 100644 index 0000000..bd1664c --- /dev/null +++ b/MRA/proto.h @@ -0,0 +1,618 @@ +//*************************************************************************** +// $Id: proto.h,v 1.141 2005/10/24 15:32:33 shingrus Exp $ +//*************************************************************************** + +#ifndef MRIM_PROTO_H +#define MRIM_PROTO_H + +#include + +#define PROTO_VERSION_MAJOR 1 +#define PROTO_VERSION_MINOR 21 +#define PROTO_VERSION ((((u_long)(PROTO_VERSION_MAJOR))<<16)|(u_long)(PROTO_VERSION_MINOR)) + + +#define PROTO_MAJOR(p) (((p)&0xFFFF0000)>>16) +#define PROTO_MINOR(p) ((p)&0x0000FFFF) + + +typedef struct mrim_packet_header_t +{ + u_long magic; // Magic + u_long proto; // Версия протокола + u_long seq; // Sequence + u_long msg; // Тип пакета + u_long dlen; // Длина данных + u_char reserved[24]; // Зарезервировано +} +mrim_packet_header_t; + +#define CS_MAGIC 0xDEADBEEF // Клиентский Magic ( C <-> S ) + + +// UNICODE = (UTF-16LE) (>=1.17) + +/*************************************************************************** + + ПРОТОКОЛ СВЯЗИ КЛИЕНТ-СЕРВЕР + + ***************************************************************************/ + +#define MRIM_CS_HELLO 0x1001 // C -> S +// empty + +#define MRIM_CS_HELLO_ACK 0x1002 // S -> C +// mrim_connection_params_t + + +#define MRIM_CS_LOGIN_ACK 0x1004 // S -> C +// empty + +#define MRIM_CS_LOGIN_REJ 0x1005 // S -> C +// LPS reason ??? + +#define MRIM_CS_PING 0x1006 // C -> S +// empty + +#define MRIM_CS_MESSAGE 0x1008 // C -> S +// UL flags + #define MESSAGE_FLAG_OFFLINE 0x00000001 + #define MESSAGE_FLAG_NORECV 0x00000004 + #define MESSAGE_FLAG_AUTHORIZE 0x00000008 // X-MRIM-Flags: 00000008 + #define MESSAGE_FLAG_SYSTEM 0x00000040 + #define MESSAGE_FLAG_RTF 0x00000080 + #define MESSAGE_FLAG_CONTACT 0x00000200 + #define MESSAGE_FLAG_NOTIFY 0x00000400 + #define MESSAGE_FLAG_SMS 0x00000800 + #define MESSAGE_FLAG_MULTICAST 0x00001000 + #define MESSAGE_SMS_DELIVERY_REPORT 0x00002000 + #define MESSAGE_FLAG_ALARM 0x00004000 + #define MESSAGE_FLAG_FLASH 0x00008000 + #define MESSAGE_FLAG_SPAMF_SPAM 0x00020000 // чтобы пожаловатся на спам - вернуть назад с этим флагом ;клиенту игнорировать, ставится в момент обработки сообщения при передаче внутри кластера + #define MESSAGE_FLAG_MULTICHAT 0x00400000 // + #define MULTICHAT_MESSAGE 0 // received message (s->c) + #define MULTICHAT_GET_MEMBERS 1 // request members list from server (c->s) + #define MULTICHAT_MEMBERS 2 // members list from server (s->c) + #define MULTICHAT_ADD_MEMBERS 3 // + #define MULTICHAT_ATTACHED 4 // user joined to chat (s->c) + #define MULTICHAT_DETACHED 5 // user leave chat (s->c) + #define MULTICHAT_DESTROYED 6 // + #define MULTICHAT_INVITE 7 // + #define MESSAGE_FLAG_v1p16 0x00100000 // для перекодировки юникода + #define MESSAGE_FLAG_CP1251 0x00200000 +// LPS to e-mail ANSI +// LPS message ANSI/UNICODE (see flags) +// LPS rtf-formatted message (>=1.1) ??? +// LPS multichat_data (>=1.20) ??? + +#define MAX_MULTICAST_RECIPIENTS 50 + #define MESSAGE_USERFLAGS_MASK 0x000036A8 // Flags that user is allowed to set himself + + +#define MRIM_CS_MESSAGE_ACK 0x1009 // S -> C +// UL msg_id +// UL flags +// LPS from e-mail ANSI +// LPS message UNICODE +// LPS rtf-formatted message (>=1.1) - MESSAGE_FLAG_RTF +// //BASE64( - MESSAGE_FLAG_AUTHORIZE +// UL parts count = 2 +// LPS auth_sender_nick UNICODE +// LPS auth_request_text UNICODE +//[ LPS multichat_data ] (>= 1.20) - MESSAGE_FLAG_MULTICHAT +// UL type +// LPS multichat_name +// switch(type) { +// MULTICHAT_MESSAGE { +// LPS sender ANSI +// } +// MULTICHAT_MEMBERS { +// CLPS members +// [ LPS owner ] +// } +// MULTICHAT_ADD_MEMBERS { +// LPS sender ANSI +// CLPS members +// } +// MULTICHAT_ATTACHED { +// LPS member ANSI +// } +// MULTICHAT_DETACHED { +// LPS member ANSI +// } +// MULTICHAT_INVITE { +// LPS sender ANSI +// } +// } +// ) + + + + + +#define MRIM_CS_MESSAGE_RECV 0x1011 // C -> S +// LPS from e-mail ANSI +// UL msg_id + +#define MRIM_CS_MESSAGE_STATUS 0x1012 // S -> C +// UL status + #define MESSAGE_DELIVERED 0x0000 // Message delivered directly to user + #define MESSAGE_REJECTED_NOUSER 0x8001 // Message rejected - no such user + #define MESSAGE_REJECTED_INTERR 0x8003 // Internal server error + #define MESSAGE_REJECTED_LIMIT_EXCEEDED 0x8004 // Offline messages limit exceeded + #define MESSAGE_REJECTED_TOO_LARGE 0x8005 // Message is too large + #define MESSAGE_REJECTED_DENY_OFFMSG 0x8006 // User does not accept offline messages + #define MESSAGE_REJECTED_DENY_OFFFLSH 0x8007 // User does not accept offline flash animation + //#define MESSAGE_REJECTED_DENY_OFFFLSH 0x8008 // User does not accept offline flash animation + //#define MESSAGE_REJECTED_DENY_OFFFLSH 0x8009 // User does not accept offline flash animation + +#define MRIM_CS_USER_STATUS 0x100F // S -> C +// UL status + #define STATUS_OFFLINE 0x00000000 + #define STATUS_ONLINE 0x00000001 + #define STATUS_AWAY 0x00000002 + #define STATUS_UNDETERMINATED 0x00000003 + #define STATUS_USER_DEFINED 0x00000004 + #define STATUS_FLAG_INVISIBLE 0x80000000 +// LPS spec_status_uri ANSI (>=1.14) + #define SPEC_STATUS_URI_MAX 256 +// LPS status_title UNICODE (>=1.14) + #define STATUS_TITLE_MAX 16 +// LPS status_desc UNICODE (>=1.14) + #define STATUS_DESC_MAX 64 +// LPS user e-mail ANSI +// UL com_support (>=1.14) + #define FEATURE_FLAG_RTF_MESSAGE 0x00000001 + #define FEATURE_FLAG_BASE_SMILES 0x00000002 + #define FEATURE_FLAG_ADVANCED_SMILES 0x00000004 + #define FEATURE_FLAG_CONTACTS_EXCH 0x00000008 + #define FEATURE_FLAG_WAKEUP 0x00000010 + #define FEATURE_FLAG_MULTS 0x00000020 + #define FEATURE_FLAG_FILE_TRANSFER 0x00000040 + #define FEATURE_FLAG_VOICE 0x00000080 + #define FEATURE_FLAG_VIDEO 0x00000100 + #define FEATURE_FLAG_GAMES 0x00000200 + #define FEATURE_FLAG_LAST 0x00000200 + #define FEATURE_UA_FLAG_MASK ((FEATURE_FLAG_LAST << 1) - 1) +// LPS user_agent (>=1.14) ANSI + #define USER_AGENT_MAX 255 + // Format: + // user_agent = param *(param ) + // param = pname "=" pvalue + // pname = token + // pvalue = token / quoted-string + // + // Params: + // "client" - magent/jagent/??? + // "name" - sys-name. + // "title" - display-name. + // "version" - product internal numeration. Examples: "1.2", "1.3 pre". + // "build" - product internal numeration (may be positive number or time). + // "protocol" - MMP protocol number by format ".". + + +#define MRIM_CS_LOGOUT 0x1013 // S -> C +// UL reason + #define LOGOUT_NO_RELOGIN_FLAG 0x0010 // Logout due to double login + +#define MRIM_CS_CONNECTION_PARAMS 0x1014 // S -> C (>1.16 depricated ?) +// mrim_connection_params_t + +#define MRIM_CS_USER_INFO 0x1015 // S -> C +// (LPS key, LPS value)* X ??? +// MESSAGES.TOTAL - num UNICODE +// MESSAGES.UNREAD - num UNICODE +// MRIM.NICKNAME - nick UNICODE +// client.endpoint - ip:port UNICODE + + +#define MRIM_CS_ADD_CONTACT 0x1019 // C -> S +// UL flags (group(2) or usual(0) + #define CONTACT_FLAG_REMOVED 0x00000001 + #define CONTACT_FLAG_GROUP 0x00000002 + #define CONTACT_FLAG_INVISIBLE 0x00000004 + #define CONTACT_FLAG_VISIBLE 0x00000008 + #define CONTACT_FLAG_IGNORE 0x00000010 + #define CONTACT_FLAG_SHADOW 0x00000020 + #define CONTACT_FLAG_AUTHORIZED 0x00000040 // ( >= 1.15) + #define CONTACT_FLAG_MULTICHAT 0x00000080 // ( >= 1.20) =128 + #define CONTACT_FLAG_UNICODE_NAME 0x00000200 // =512 + #define CONTACT_FLAG_PHONE 0x00100000 + +// UL group id (unused if contact is group) +// LPS contact e-mail ANSI +// LPS name UNICODE +// LPS custom phones ANSI +// LPS BASE64( +// UL parts count = 2 +// LPS auth_sender_nick ??? +// LPS auth_request_text ??? +// ) +// UL actions ( >= 1.15) +// [LPS multichat_data] +// CLPS members (>= 1.20) +// [ LPS owner ] + #define ADD_CONTACT_FLAG_MYMAIL_INVITE 0x00000001 + #define ADD_CONTACT_FLAG_MULTICHAT_ATTACHE 0x00000002 + //used internal in win32 agent + #define CONTACT_AWAITING_AUTHORIZATION_USER 0x00000100 + #define CONTACT_FLAG_TEMPORARY 0x00010000 + + +#define MRIM_CS_ADD_CONTACT_ACK 0x101A // S -> C +// UL status + #define CONTACT_OPER_SUCCESS 0x0000 + #define CONTACT_OPER_ERROR 0x0001 + #define CONTACT_OPER_INTERR 0x0002 + #define CONTACT_OPER_NO_SUCH_USER 0x0003 + #define CONTACT_OPER_INVALID_INFO 0x0004 + #define CONTACT_OPER_USER_EXISTS 0x0005 + #define CONTACT_OPER_GROUP_LIMIT 0x6 +// UL contact_id or (u_long)-1 if status is not OK +// [LPS multichat_contact (>= 1.20)] + + +#define MRIM_CS_MODIFY_CONTACT 0x101B // C -> S +// UL id +// UL flags - same as for MRIM_CS_ADD_CONTACT +// UL group id (unused if contact is group) +// LPS contact e-mail ANSI +// LPS name UNICODE +// LPS custom phones ANSI + +#define MRIM_CS_MODIFY_CONTACT_ACK 0x101C // S -> C +// UL status, same as for MRIM_CS_ADD_CONTACT_ACK + +#define MRIM_CS_OFFLINE_MESSAGE_ACK 0x101D // S -> C +// UIDL +// LPS offline message ??? + +#define MRIM_CS_DELETE_OFFLINE_MESSAGE 0x101E // C -> S +// UIDL + + +#define MRIM_CS_AUTHORIZE 0x1020 // C -> S +// LPS user e-mail ANSI + +#define MRIM_CS_AUTHORIZE_ACK 0x1021 // S -> C +// LPS user e-mail ANSI + +#define MRIM_CS_CHANGE_STATUS 0x1022 // C -> S +// UL new status +// LPS spec_status_uri ANSI (>=1.14) +// LPS status_title UNICODE (>=1.14) +// LPS status_desc UNICODE (>=1.14) +// UL com_support (>=1.14) (see MRIM_CS_USER_STATUS) + + +#define MRIM_CS_GET_MPOP_SESSION 0x1024 // C -> S + + +#define MRIM_CS_MPOP_SESSION 0x1025 // S -> C +// UL status + #define MRIM_GET_SESSION_FAIL 0 + #define MRIM_GET_SESSION_SUCCESS 1 +// LPS mpop session ??? + + +#define MRIM_CS_FILE_TRANSFER 0x1026 // C->S +// LPS TO/FROM e-mail ANSI +// DWORD id_request - uniq per connect +// DWORD FILESIZE +// LPS: // LPS Files (FileName;FileSize;FileName;FileSize;) ANSI + // LPS DESCRIPTION: + // UL ? + // Files (FileName;FileSize;FileName;FileSize;) UNICODE + // LPS Conn (IP:Port;IP:Port;) ANSI + +#define MRIM_CS_FILE_TRANSFER_ACK 0x1027 // S->C +// DWORD status + #define FILE_TRANSFER_STATUS_OK 1 + #define FILE_TRANSFER_STATUS_DECLINE 0 + #define FILE_TRANSFER_STATUS_ERROR 2 + #define FILE_TRANSFER_STATUS_INCOMPATIBLE_VERS 3 + #define FILE_TRANSFER_MIRROR 4 +// LPS TO/FROM e-mail ANSI +// DWORD id_request +// LPS DESCRIPTION [Conn (IP:Port;IP:Port;) ANSI] + + + +//white pages! +#define MRIM_CS_WP_REQUEST 0x1029 //C->S +// DWORD field +// LPS value ??? +#define PARAMS_NUMBER_LIMIT 50 +#define PARAM_VALUE_LENGTH_LIMIT 64 + +//if last symbol in value eq '*' it will be replaced by LIKE '%' +// params define +// must be in consecutive order (0..N) to quick check in check_anketa_info_request + enum { + MRIM_CS_WP_REQUEST_PARAM_USER = 0,// ANSI + MRIM_CS_WP_REQUEST_PARAM_DOMAIN, // ANSI + MRIM_CS_WP_REQUEST_PARAM_NICKNAME, // UNICODE + MRIM_CS_WP_REQUEST_PARAM_FIRSTNAME, // UNICODE + MRIM_CS_WP_REQUEST_PARAM_LASTNAME, // UNICODE + MRIM_CS_WP_REQUEST_PARAM_SEX , // ANSI + MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY, // not used for search + MRIM_CS_WP_REQUEST_PARAM_DATE1 , // ANSI + MRIM_CS_WP_REQUEST_PARAM_DATE2 , // ANSI + //!!!!!!!!!!!!!!!!!!!online request param must be at end of request!!!!!!!!!!!!!!! + MRIM_CS_WP_REQUEST_PARAM_ONLINE , // ANSI + MRIM_CS_WP_REQUEST_PARAM_STATUS , // we do not used it, yet + MRIM_CS_WP_REQUEST_PARAM_CITY_ID, // ANSI + MRIM_CS_WP_REQUEST_PARAM_ZODIAC, // ANSI + MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_MONTH,// ANSI + MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_DAY, // ANSI + MRIM_CS_WP_REQUEST_PARAM_COUNTRY_ID, // ANSI + MRIM_CS_WP_REQUEST_PARAM_MAX + }; + +#define MRIM_CS_ANKETA_INFO 0x1028 //S->C +// DWORD status + #define MRIM_ANKETA_INFO_STATUS_OK 1 + #define MRIM_ANKETA_INFO_STATUS_NOUSER 0 + #define MRIM_ANKETA_INFO_STATUS_DBERR 2 + #define MRIM_ANKETA_INFO_STATUS_RATELIMERR 3 +// DWORD fields_num +// DWORD max_rows +// DWORD server_time sec since 1970 (unixtime) + // fields set //%fields_num == 0 + // values set //%fields_num == 0 +// LPS value (numbers too) ??? + + +#define MRIM_CS_MAILBOX_STATUS 0x1033 +// DWORD new messages in mailbox + + +#define MRIM_CS_GAME 0x1035 +// LPS to/from e-mail ANSI +// DWORD session unique per game +// DWORD msg internal game message + enum { + GAME_BASE, + GAME_CONNECTION_INVITE, + GAME_CONNECTION_ACCEPT, + GAME_DECLINE, + GAME_INC_VERSION, + GAME_NO_SUCH_GAME, + GAME_JOIN, + GAME_CLOSE, + GAME_SPEED, + GAME_SYNCHRONIZATION, + GAME_USER_NOT_FOUND, + GAME_ACCEPT_ACK, + GAME_PING, + GAME_RESULT, + GAME_MESSAGES_NUMBER + }; +// DWORD msg_id id for ack +// DWORD time_send time of client +// LPS data ??? + + + +#define MRIM_CS_CONTACT_LIST2 0x1037 //S->C +// UL status + #define GET_CONTACTS_OK 0x0000 + #define GET_CONTACTS_ERROR 0x0001 + #define GET_CONTACTS_INTERR 0x0002 +// DWORD status - if ...OK than this staff: +// DWORD groups number + // mask symbols table: + // 's' - lps + // 'u' - unsigned long + // 'z' - zero terminated string + // LPS groups fields mask ANSI + // LPS contacts fields mask ANSI + // group fields + // contacts fields + // groups mask 'us' == flags, name UNICODE + // contact mask 'uussuussssus' flags, group id, e-mail ANSI, nick UNICODE, server flags, status, custom phone numbers ANSI, spec_status_uri ANSI, status_title UNICODE, status_desc UNICODE, com_support (future flags), user_agent (formated string) ANSI, ul blog status id, ul blog status id, ul BlogStatusTime, blog status UNICODE, blog status music UNICODE, blog status sender, ????? + // uussuussssusuuusssss + #define CONTACT_INTFLAG_NOT_AUTHORIZED 0x0001 + + +//old packet cs_login with cs_statistic +#define MRIM_CS_LOGIN2 0x1038 // C -> S +// LPS login e-mail ANSI +// LPS password ANSI +// DWORD status +// LPS spec_status_uri ANSI (>=1.14) +// LPS status_title UNICODE (>=1.14) +// LPS status_desc UNICODE (>=1.14) +// UL com_support (>=1.14) (see MRIM_CS_USER_STATUS) +// LPS user_agent ANSI (>=1.14) (see MRIM_CS_USER_STATUS) + // + statistic packet data: +// LPS lang (>=1.16) +// LPS ua session (>=1.20) - шли пустой +// LPS replaced ua session (>=1.20) - шли пустой +// LPS client description ANSI + #define MAX_CLIENT_DESCRIPTION 256 +// unknown data +// LPS unknown id (len=32) +/* SetUL(&lpbDataCurrent,0);//00 00 00 00 + SetUL(&lpbDataCurrent,0);//02 BA 0A 00 + SetUL(&lpbDataCurrent,0);//00 00 00 03 + SetUL(&lpbDataCurrent,0);//00 00 00 02 + + SetUL(&lpbDataCurrent,0);//E2 FD 1E 22 + SetUL(&lpbDataCurrent,0);//04 00 00 00 + SetUL(&lpbDataCurrent,0);//02 FF FF FF + SetUL(&lpbDataCurrent,0);//FF 05 00 00 + + SetUL(&lpbDataCurrent,0);//00 02 FF FF + SetUL(&lpbDataCurrent,0);//FF FF 06 00 + SetUL(&lpbDataCurrent,0);//00 00 02 FF + SetUL(&lpbDataCurrent,0);//FF FF FF 07 + + SetUL(&lpbDataCurrent,0);//00 00 00 02 + SetUL(&lpbDataCurrent,0);//FF FF FF FF + SetUL(&lpbDataCurrent,0);//14 00 00 00 + SetUL(&lpbDataCurrent,0);//02 00 00 00 + + SetUL(&lpbDataCurrent,0);//00 16 00 00 + SetUL(&lpbDataCurrent,0);//00 02 00 00 + SetUL(&lpbDataCurrent,0);//00 00 17 00 + SetUL(&lpbDataCurrent,0);//00 00 02 00 + + SetUL(&lpbDataCurrent,0);//00 00 00 18 + SetUL(&lpbDataCurrent,0);//00 00 00 02 + SetUL(&lpbDataCurrent,0);//00 00 00 00 + SetUL(&lpbDataCurrent,0);//19 00 00 00 + + SetUL(&lpbDataCurrent,0);//02 00 00 00 + SetUL(&lpbDataCurrent,0);//00 1A 00 00 + SetUL(&lpbDataCurrent,0);//00 02 00 00 + SetUL(&lpbDataCurrent,0);//00 00 1C 00 + + SetUL(&lpbDataCurrent,0);//00 00 02 00 + SetUL(&lpbDataCurrent,0);//00 00 00 1D + SetUL(&lpbDataCurrent,0);//00 00 00 02 + SetUL(&lpbDataCurrent,0);//00 00 00 00 + + SetUL(&lpbDataCurrent,0);//23 00 00 00 + SetUL(&lpbDataCurrent,0);//02 01 00 00 + SetUL(&lpbDataCurrent,0);//00 24 00 00 + SetUL(&lpbDataCurrent,0);//00 02 01 00 + + SetUL(&lpbDataCurrent,0);//00 00 25 00 + SetUL(&lpbDataCurrent,0);//00 00 02 01 + SetUL(&lpbDataCurrent,0);//00 00 00 26 + SetUL(&lpbDataCurrent,0);//00 00 00 02 + + SetUL(&lpbDataCurrent,0);//00 00 00 00 + SetUL(&lpbDataCurrent,0);//27 00 00 00 + SetUL(&lpbDataCurrent,0);//02 00 00 00 + SetUL(&lpbDataCurrent,0);//00 28 00 00 + + SetUL(&lpbDataCurrent,0);//00 02 00 00 + SetUL(&lpbDataCurrent,0);//00 00 29 00 + SetUL(&lpbDataCurrent,0);//00 00 02 01 + SetUL(&lpbDataCurrent,0);//00 00 00 2A + + SetUL(&lpbDataCurrent,0);//00 00 00 02 + SetUL(&lpbDataCurrent,0);//00 00 00 00 + SetUL(&lpbDataCurrent,0);//2B 00 00 00 + SetUL(&lpbDataCurrent,0);//02 00 00 00 + + SetUL(&lpbDataCurrent,0);//00 2C 00 00 + SetUL(&lpbDataCurrent,0);//00 01 + + SetLPS(&lpbDataCurrent,"d3a4a3d0c95e5ba24f160a499ec8b4ea",32); +*/ + + +#define MRIM_CS_SMS 0x1039 // C -> S +// UL flags +// LPS to Phone ??? +// LPS message ??? + +#define MRIM_CS_SMS_ACK 0x1040 // S->C +// UL status + + + +#define MRIM_CS_PROXY 0x1044 +// LPS to e-mail ANSI +// DWORD id_request +// DWORD data_type + #define MRIM_PROXY_TYPE_VOICE 1 + #define MRIM_PROXY_TYPE_FILES 2 + #define MRIM_PROXY_TYPE_CALLOUT 3 +// LPS user_data ??? +// LPS lps_ip_port ??? +// DWORD session_id[4] + +#define MRIM_CS_PROXY_ACK 0x1045 +//DWORD status + #define PROXY_STATUS_OK 1 + #define PROXY_STATUS_DECLINE 0 + #define PROXY_STATUS_ERROR 2 + #define PROXY_STATUS_INCOMPATIBLE_VERS 3 + #define PROXY_STATUS_NOHARDWARE 4 + #define PROXY_STATUS_MIRROR 5 + #define PROXY_STATUS_CLOSED 6 +// LPS to e-mail ANSI +// DWORD id_request +// DWORD data_type +// LPS user_data ??? +// LPS: lps_ip_port ??? +// DWORD[4] Session_id + +#define MRIM_CS_PROXY_HELLO 0x1046 +// DWORD[4] Session_id + +#define MRIM_CS_PROXY_HELLO_ACK 0x1047 + + + +#define MRIM_CS_NEW_MAIL 0x1048 // S->C +// UL unread count +// LPS from e-mail ANSI +// LPS subject ??? +// UL date +// UL uidl + + + + +#define MRIM_CS_USER_BLOG_STATUS 0x1063 +// DWORD flags + #define MRIM_BLOG_STATUS_UPDATE 0x00000001 + #define MRIM_BLOG_STATUS_MUSIC 0x00000002 // add music to status + #define MRIM_BLOG_STATUS_REPLY 0x00000004 + #define MRIM_BLOG_STATUS_NOTIFY 0x00000010 // not set self status, alert only +// LPS user +// UINT64 id +// DWORD time +// LPS text (MRIM_BLOG_STATUS_MUSIC: track) +// LPS reply_user_nick + +#define MRIM_CS_CHANGE_USER_BLOG_STATUS 0x1064 +// DWORD flags +// LPS text (MRIM_BLOG_STATUS_MUSIC: track) + #define MICBLOG_STATUS_MAX 500 +// switch(flags) { +// MRIM_BLOG_STATUS_REPLY: +// UINT64 orig_id +// } + + +#define MRIM_CS_UNKNOWN 0x1073 +// DWORD ??? +// DWORD ??? + + +#define MRIM_CS_USER_GEO 0x1077 +// LPS user +// LPS: // DWORD flags? + // LPS: "geo-point": + // LPS dolgota + // LPS shirota + // LPS "MAPOBJECT" + // LPS some data? + // LPS/DWORD + // LPS/DWORD + // LPS some data? + // LPS some data? + + +#define MRIM_CS_SERVER_SETTINGS 0x1079 + + + + + +typedef struct mrim_connection_params_t +{ + unsigned long ping_period; +} +mrim_connection_params_t; + + + +#endif // MRIM_PROTO_H + diff --git a/MRA/resource.h b/MRA/resource.h new file mode 100644 index 0000000..aa5469d --- /dev/null +++ b/MRA/resource.h @@ -0,0 +1,142 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by resource.rc +// +#define IDI_MRA 101 +#define IDD_OPT 102 +#define IDD_OPT_CONNECTIONS 102 +#define IDI_INBOX 103 +#define IDD_DIALOG_SELECT_EMAIL 103 +#define IDI_PROFILE 104 +#define IDI_AUTHRUGUEST 106 +#define IDI_AUTHGRANT 107 +#define IDD_MRAADVANCEDSEARCH 108 +#define IDD_OPTAVATRS 109 +#define IDD_OPT_AVATRS 109 +#define IDI_MAIL_NOTIFY 111 +#define IDI_MRA_WEB_SEARCH 112 +#define IDI_MRA_BLOGS 113 +#define IDI_MRA_POSTCARD 114 +#define IDI_MRA_ZHUKI 115 +#define IDI_MRA_PHOTO 117 +#define IDI_MRA_CHAT 120 +#define IDI_MRA_PHONE 122 +#define IDD_OPT_FILES 126 +#define IDD_OPT_ACCOUNT 127 +#define IDD_OPT_POPUPS 128 +#define IDD_MRAACCOUNT 129 +#define IDI_ICON1 130 +#define IDI_MRA_ALARM 130 +#define IDD_OPT_ANTISPAM 131 +#define IDI_MRA_VIDEO 132 +#define IDI_MRA_ANSWERS 133 +#define IDI_MRA_WORLD 134 +#define IDD_MINIBLOG 135 +#define IDI_BLOGSTATUS 137 +#define IDD_SETXSTATUS 256 +#define IDC_GROUPCONFIG 1000 +#define IDC_GROUPCONFIG2 1001 +#define IDC_GROUPMAIN 1002 +#define IDC_REGISTER 1002 +#define IDC_SLOWSEND 1003 +#define IDC_RETURN_ABC_PATH 1004 +#define IDC_FILE_SEND_HIDE_MY_ADDRESSES 1004 +#define IDC_HIDE_MENU_ITEMS_FOR_NON_MRA 1004 +#define IDC_RTF_SEND_ENABLE 1005 +#define IDC_RTF_BGCOLOUR 1006 +#define IDC_CVT_SMILES_ON_SEND_TEXT 1007 +#define IDC_CVT_SMILES_TO_TAGS 1007 +#define IDC_DELETE_AVT_ON_CONTACT_DELETE 1008 +#define IDC_FILE_SEND_ADD_EXTRA_ADDRESS 1008 +#define IDC_INCREMENTAL_NEW_MAIL_NOTIFY 1008 +#define IDC_ENABLE 1009 +#define IDC_AUTO_ADD_CONTACTS_TO_SERVER 1009 +#define IDC_FILE_SEND_NOOUTCONNECTIONONSEND 1010 +#define IDC_AUTO_AUTH_REQ_ON_LOGON 1010 +#define IDC_SHOWPOPUP 1010 +#define IDC_KEEPALIVE 1011 +#define IDC_FILE_SEND_NOOUTCONNECTIONONRECEIVE 1011 +#define IDC_LIST_EMAILS 1011 +#define IDC_TRAYICON_NEW_MAIL_NOTIFY 1011 +#define IDC_WRITETOSYSTEMHISTORY 1011 +#define IDC_FILE_SEND_IGNORYADDITIONALPORTS 1012 +#define IDC_RTF_RECEIVE_ENABLE 1012 +#define IDC_CHK_TEMP_CONTACTS 1012 +#define IDC_DELETE_SPAMBOT_CONTACT 1013 +#define IDC_RTF_SEND_SMART 1013 +#define IDC_COMBO_PHONE 1014 +#define IDC_TRAYICON_NEW_MAIL_NOTIFY_CLICK_TO_INBOX 1014 +#define IDC_FILE_SEND_ENABLE_DIRECT_CONN 1014 +#define IDC_SEND_SPAM_REPORT_TO_SERVER 1014 +#define IDC_EDIT_TEXT 1015 +#define IDC_FILE_SEND_ENABLE_MRIMPROXY_CONS 1015 +#define IDC_AUTO_AUTH_GRAND_IN_CLIST 1015 +#define IDC_CLN_NON_ALPHNUM 1015 +#define IDC_AUTO_AUTH_GRAND_NEW_USERS 1016 +#define IDC_OPTIONSTAB 1017 +#define IDC_AUTO_AUTH_GRAND_NEW_USERS_DISABLE_SPAM_CHECK 1017 +#define IDC_NEW_ACCOUNT_LINK 1018 +#define IDC_LOOKUPLINK 1019 +#define IDC_PASSWORD 1020 +#define IDC_BUTTON_DEFAULT 1020 +#define IDC_LOGIN 1022 +#define IDC_FILE_SEND_BLOCK_SIZE 1022 +#define IDC_COMBO_POPUP_TYPE 1023 +#define IDC_CHK_ENABLE 1024 +#define IDC_CHK_USE_WIN_COLORS 1025 +#define IDC_POPUP_BACKCOLOR 1026 +#define IDC_POPUP_TEXTCOLOR 1027 +#define IDC_POPUP_TIMEOUT 1028 +#define IDC_PREVIEW 1029 +#define IDC_USE_KEEPALIVE_CONN 1030 +#define IDC_BUTTON_FONT 1031 +#define IDC_BAD_WORDS_LIST 1032 +#define IDC_EDIT_BAD_WORD 1033 +#define IDC_BUTTON_ADD 1034 +#define IDC_BUTTONREMOVE 1035 +#define IDC_EMAIL_USER 1048 +#define IDC_EMAIL_DOMAIN 1049 +#define IDC_NICK 1053 +#define IDC_GENDER 1060 +#define IDC_STATE 1061 +#define IDC_ZODIAK 1062 +#define IDC_COUNTRY 1063 +#define IDC_CITY2 1064 +#define IDC_CITY 1064 +#define IDC_XTITLE 1065 +#define IDC_XMSG 1066 +#define IDC_MAX_LANG_CHANGES 1071 +#define IDC_USER_BLOG_STATUS_MSG 1072 +#define IDC_MSG_TO_SEND 1073 +#define IDC_CHK_NOTIFY 1074 +#define IDC_STATIC_WRITED_TIME 1075 +#define IDC_STATIC_CHARS_COUNTER 1076 +#define IDC_CHECK1 1077 +#define IDC_CHK_REMEMBER 1077 +#define IDC_SERVER 1171 +#define IDC_SERVERPORT 1174 +#define IDC_UPD_CHECK_INTERVAL 1175 +#define IDC_FILE_SEND_EXTRA_ADDRESS 1175 +#define IDC_FIRSTNAME 1224 +#define IDC_LASTNAME 1225 +#define IDC_AGERANGE_FROM 1410 +#define IDC_AGERANGE_TO 1411 +#define IDC_BIRTHDAY_DAY 1412 +#define IDC_BIRTHDAY_MONTH 1413 +#define IDC_BIRTHDAY_YEAR 1414 +#define IDC_ONLINEONLY 1430 +#define IDC_SUMMARYGROUP 1434 +#define IDC_LOCATIONGROUP 1436 +#define IDC_STATIC -1 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NO_MFC 1 +#define _APS_NEXT_RESOURCE_VALUE 138 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1078 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/MRA/resource.rc b/MRA/resource.rc new file mode 100644 index 0000000..e00f5a1 --- /dev/null +++ b/MRA/resource.rc @@ -0,0 +1,485 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_MRA ICON "Icons\\Magent.ico" +IDI_INBOX ICON "Icons\\Mail.ico" +IDI_PROFILE ICON "Icons\\Info.ico" +IDI_AUTHRUGUEST ICON "Icons\\AuthReguest.ico" +IDI_AUTHGRANT ICON "Icons\\AuthGrant.ico" +IDI_MAIL_NOTIFY ICON "Icons\\MailNotify.ico" +IDI_MRA_WEB_SEARCH ICON "Icons\\WebSearch.ico" +IDI_MRA_BLOGS ICON "Icons\\Blogs.ico" +IDI_MRA_POSTCARD ICON "Icons\\PostCards.ico" +IDI_MRA_ZHUKI ICON "Icons\\Bagz.ico" +IDI_MRA_PHOTO ICON "Icons\\Photo.ico" +IDI_MRA_CHAT ICON "Icons\\Chat.ico" +IDI_MRA_PHONE ICON "Icons\\Phone.ico" +IDI_MRA_ALARM ICON "Icons\\Alarm.ico" +IDI_MRA_VIDEO ICON "Icons\\video.ico" +IDI_MRA_ANSWERS ICON "Icons\\answers.ico" +IDI_MRA_WORLD ICON "Icons\\my world.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_MRAACCOUNT DIALOGEX 0, 0, 200, 101 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Mail.ru Account Setup" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + EDITTEXT IDC_LOGIN,91,34,102,13,ES_AUTOHSCROLL | NOT WS_BORDER,WS_EX_STATICEDGE + EDITTEXT IDC_PASSWORD,91,54,102,13,ES_PASSWORD | ES_AUTOHSCROLL | NOT WS_BORDER,WS_EX_STATICEDGE + DEFPUSHBUTTON "OK",IDOK,87,80,50,14 + PUSHBUTTON "Cancel",IDCANCEL,143,80,50,14 + CONTROL "Create new account",IDC_REGISTER,"Hyperlink",WS_TABSTOP,7,82,74,10 + LTEXT "Please enter your Mail.ru account details to continue:",IDC_STATIC,7,9,186,20 + LTEXT "Mail.ru e-mail:",IDC_STATIC,9,37,77,8 + LTEXT "Password:",IDC_STATIC,9,57,77,8 +END + +IDD_OPT_CONNECTIONS DIALOGEX 0, 0, 295, 230 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Configuration",IDC_GROUPCONFIG,8,7,277,208 + RTEXT "Login Server:",IDC_STATIC,14,19,52,8 + EDITTEXT IDC_SERVER,72,17,140,12,ES_AUTOHSCROLL + RTEXT "Port:",IDC_STATIC,14,34,52,8 + EDITTEXT IDC_SERVERPORT,72,33,33,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "(2042, 443, 110, 25)",IDC_STATIC,110,35,167,10 + PUSHBUTTON "Default",IDC_BUTTON_DEFAULT,217,17,60,13 + CONTROL "Automatic request authorization on logon",IDC_AUTO_AUTH_REQ_ON_LOGON, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,50,263,8 + CONTROL "Automatic add contacts to server list on logon",IDC_AUTO_ADD_CONTACTS_TO_SERVER, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,61,263,8 + CONTROL "Notify me when a message delivery has failed",IDC_SLOWSEND, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,107,263,8 + CONTROL "Notify about new mail if increment",IDC_INCREMENTAL_NEW_MAIL_NOTIFY, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,263,8 + CONTROL "Notify about new mail tray icon",IDC_TRAYICON_NEW_MAIL_NOTIFY, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,129,263,8 + CONTROL "Hide menu items for non MRA contacts",IDC_HIDE_MENU_ITEMS_FOR_NON_MRA, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,151,263,8 + CONTROL "Show received Formated text (RTF receive)",IDC_RTF_RECEIVE_ENABLE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,162,263,8 + CONTROL "Send Formated text (send RTF)",IDC_RTF_SEND_ENABLE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,173,263,8 + PUSHBUTTON "Font",IDC_BUTTON_FONT,23,185,42,12 + CONTROL "",IDC_RTF_BGCOLOUR,"ColourPicker",WS_TABSTOP,70,186,38,11 + LTEXT "Background colour",IDC_STATIC,112,188,157,8 + CONTROL "Click to Inbox",IDC_TRAYICON_NEW_MAIL_NOTIFY_CLICK_TO_INBOX, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,140,253,8 + CONTROL "Automatic grand authorization to users in contact list",IDC_AUTO_AUTH_GRAND_IN_CLIST, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,72,263,8 + CONTROL "Automatic grand authorization to new users",IDC_AUTO_AUTH_GRAND_NEW_USERS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,83,263,8 + CONTROL "Disable spam check",IDC_AUTO_AUTH_GRAND_NEW_USERS_DISABLE_SPAM_CHECK, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,94,253,8 +END + +IDD_MRAADVANCEDSEARCH DIALOGEX 0, 0, 220, 235 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_BORDER +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Summary",IDC_SUMMARYGROUP,8,5,205,147 + LTEXT "Nickname:",IDC_STATIC,15,20,50,8 + EDITTEXT IDC_NICK,65,18,139,12,ES_AUTOHSCROLL + LTEXT "First name:",IDC_STATIC,15,35,50,8 + EDITTEXT IDC_FIRSTNAME,65,33,139,12,ES_AUTOHSCROLL + LTEXT "Last name:",IDC_STATIC,15,50,50,8 + EDITTEXT IDC_LASTNAME,65,48,139,12,ES_AUTOHSCROLL + LTEXT "E-mail:",IDC_STATIC,15,65,50,8 + EDITTEXT IDC_EMAIL_USER,65,63,69,12,ES_AUTOHSCROLL + CTEXT "@",IDC_STATIC,137,64,9,9 + COMBOBOX IDC_EMAIL_DOMAIN,147,63,57,71,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + LTEXT "Gender:",IDC_STATIC,15,87,50,8 + COMBOBOX IDC_GENDER,65,85,139,47,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Age:",IDC_STATIC,15,102,50,8 + RTEXT "from:",IDC_STATIC,65,102,26,9 + COMBOBOX IDC_AGERANGE_FROM,94,100,37,90,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "to:",IDC_STATIC,134,102,30,9 + COMBOBOX IDC_AGERANGE_TO,167,100,37,90,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Birthday:",IDC_STATIC,15,118,50,8 + COMBOBOX IDC_BIRTHDAY_DAY,65,117,29,204,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_BIRTHDAY_MONTH,102,117,59,90,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_BIRTHDAY_YEAR,167,117,37,188,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Zodiak:",IDC_STATIC,15,134,50,8 + COMBOBOX IDC_ZODIAK,65,133,139,47,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Location",IDC_LOCATIONGROUP,7,157,207,60 + LTEXT "Country:",IDC_STATIC,14,170,50,8 + COMBOBOX IDC_COUNTRY,64,167,143,172,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "State:",IDC_STATIC,14,184,50,8 + COMBOBOX IDC_STATE,64,183,143,172,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + CONTROL "Search online users only",IDC_ONLINEONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,222,143,8 + LTEXT "City:",IDC_STATIC,14,200,50,8 + COMBOBOX IDC_CITY,64,199,143,172,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + CONTROL "Remember",IDC_CHK_REMEMBER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,157,222,56,8 +END + +IDD_OPT_AVATRS DIALOGEX 0, 0, 295, 195 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Configuration",IDC_GROUPCONFIG,8,6,277,110 + CONTROL "Enable avatars support (loading)",IDC_ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,18,259,9 + RTEXT "Server:",IDC_STATIC,16,31,53,8 + EDITTEXT IDC_SERVER,72,29,140,12,ES_AUTOHSCROLL + RTEXT "Port:",IDC_STATIC,16,46,53,8 + EDITTEXT IDC_SERVERPORT,72,44,34,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "(80, 443, 2041)",IDC_STATIC,110,46,103,10 + PUSHBUTTON "Default",IDC_BUTTON_DEFAULT,216,29,60,13 + EDITTEXT IDC_UPD_CHECK_INTERVAL,14,71,34,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Updates check interval, min",IDC_STATIC,51,72,222,8 + CONTROL "Return absolute path",IDC_RETURN_ABC_PATH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,89,259,9 + CONTROL "Delete avatar file with contact",IDC_DELETE_AVT_ON_CONTACT_DELETE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,100,259,9 + CONTROL "Use keep-alive connections",IDC_USE_KEEPALIVE_CONN, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,72,59,201,9 +END + +IDD_OPT_FILES DIALOGEX 0, 0, 295, 160 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Files exchange",IDC_GROUPCONFIG2,8,7,277,143 + CONTROL "No out connection on send",IDC_FILE_SEND_NOOUTCONNECTIONONSEND, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,28,244,8 + CONTROL "No out connection on receive",IDC_FILE_SEND_NOOUTCONNECTIONONRECEIVE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,39,244,8 + CONTROL "Out connections: ignory additional ports (443, 2041)",IDC_FILE_SEND_IGNORYADDITIONALPORTS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,50,244,8 + CONTROL "Hide my IP addresses",IDC_FILE_SEND_HIDE_MY_ADDRESSES, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,61,244,8 + CONTROL "Add extra address",IDC_FILE_SEND_ADD_EXTRA_ADDRESS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,72,244,8 + RTEXT "Your host (or router):",IDC_STATIC,13,84,92,8 + EDITTEXT IDC_FILE_SEND_EXTRA_ADDRESS,108,83,170,12,ES_AUTOHSCROLL + LTEXT "File send block size:",IDC_STATIC,14,112,263,8 + EDITTEXT IDC_FILE_SEND_BLOCK_SIZE,26,123,52,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "512 - 65536 bytes",IDC_STATIC,82,125,97,10 + CONTROL "Enable direct connections",IDC_FILE_SEND_ENABLE_DIRECT_CONN, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,18,263,8 + CONTROL "Enable MRIM proxy connections",IDC_FILE_SEND_ENABLE_MRIMPROXY_CONS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,98,263,8 +END + +IDD_OPT_ACCOUNT DIALOGEX 0, 0, 295, 149 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Mail.ru Agent",IDC_GROUPMAIN,9,5,276,98,WS_GROUP + RTEXT "Full e-mail:",IDC_STATIC,14,22,52,8 + EDITTEXT IDC_LOGIN,72,18,100,12,ES_AUTOHSCROLL + LTEXT "Example: Petrov_Ivan@mail.ru",IDC_STATIC,175,19,104,10 + RTEXT "Password:",IDC_STATIC,14,37,52,8 + EDITTEXT IDC_PASSWORD,72,33,100,12,ES_PASSWORD | ES_AUTOHSCROLL + CONTROL "Create a new Mail.ru account using the Mail.ru website",IDC_NEW_ACCOUNT_LINK, + "Hyperlink",WS_TABSTOP,18,72,258,9 + CONTROL "Retrieve a lost password",IDC_LOOKUPLINK,"Hyperlink",WS_TABSTOP,18,85,258,9 + LTEXT "Leave empty if you dont want change password",IDC_STATIC,72,48,212,8 +END + +IDD_OPT_POPUPS DIALOGEX 0, 0, 295, 150 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + RTEXT "PopUp type",IDC_STATIC,9,11,52,8 + COMBOBOX IDC_COMBO_POPUP_TYPE,65,9,220,97,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Popup settings",IDC_GROUPMAIN,9,25,276,90,WS_GROUP + CONTROL "Enable",IDC_CHK_ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,38,260,10 + CONTROL "&Use Windows colors",IDC_CHK_USE_WIN_COLORS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,29,50,246,10 + RTEXT "Back Color",IDC_STATIC,29,65,57,8 + CONTROL "",IDC_POPUP_BACKCOLOR,"ColourPicker",WS_TABSTOP,92,65,38,10 + RTEXT "Text Color",IDC_STATIC,29,80,57,8 + CONTROL "",IDC_POPUP_TEXTCOLOR,"ColourPicker",WS_TABSTOP,92,80,38,10 + RTEXT "Timeout",IDC_STATIC,29,96,57,8 + EDITTEXT IDC_POPUP_TIMEOUT,92,94,38,12,ES_AUTOHSCROLL | ES_NUMBER + PUSHBUTTON "Previe&w",IDC_PREVIEW,237,119,46,12 +END + +IDD_SETXSTATUS DIALOGEX 0, 0, 189, 98 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Custom Status ""%s"" Details" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Closing in %d",IDOK,49,79,91,14 + LTEXT "Title:",IDC_STATIC,5,0,179,8 + EDITTEXT IDC_XTITLE,5,8,179,13 + LTEXT "Message:",IDC_STATIC,5,22,179,8 + EDITTEXT IDC_XMSG,5,31,179,43,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,20,0,1 + PRODUCTVERSION 1,20,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "About Miranda", "Miranda IM is a new generation IM client, extensible with numerous plugins. Get Miranda IM at http://www.miranda-im.org" + VALUE "Comments", "Rozhuk_I@mail.ru" + VALUE "FileDescription", "Miranda Mail.ru Agent protocol plugin" + VALUE "FileVersion", "1, 20, 0, 1" + VALUE "LegalCopyright", "Copyright © 2005-2009 Rozhuk Ivan" + VALUE "OriginalFilename", "Mra.dll" + VALUE "ProductName", "Plugin for Miranda IM" + VALUE "ProductVersion", "1, 20, 0, 1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_MRAADVANCEDSEARCH, DIALOG + BEGIN + BOTTOMMARGIN, 230 + END + + IDD_OPT_FILES, DIALOG + BEGIN + BOTTOMMARGIN, 150 + END +END +#endif // APSTUDIO_INVOKED + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Russian resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) +#ifdef _WIN32 +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +#pragma code_page(1251) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_BLOGSTATUS ICON "Icons\\BlogStatus.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_OPT_ANTISPAM DIALOGEX 0, 0, 295, 211 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Configuration",IDC_GROUPCONFIG,8,6,277,197 + CONTROL "Enable Anti Spam",IDC_ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,18,259,9 + CONTROL "Check temp contacts",IDC_CHK_TEMP_CONTACTS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,29,248,9 + CONTROL "Delete spam bot contacts",IDC_DELETE_SPAMBOT_CONTACT, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,40,238,9 + EDITTEXT IDC_MAX_LANG_CHANGES,23,67,33,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Max. language changes in message (0 - disabled)",IDC_STATIC,59,69,220,11 + CONTROL "Show pop up",IDC_SHOWPOPUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,82,248,9 + CONTROL "Write to system history",IDC_WRITETOSYSTEMHISTORY, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,92,248,9 + CONTROL "Send spam report to server",IDC_SEND_SPAM_REPORT_TO_SERVER, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,102,248,9 + LTEXT "Bad words list",IDC_STATIC,25,115,96,11 + LISTBOX IDC_BAD_WORDS_LIST,25,127,121,71,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_EDIT_BAD_WORD,152,171,129,12,ES_AUTOHSCROLL + PUSHBUTTON "Add",IDC_BUTTON_ADD,152,186,42,14 + PUSHBUTTON "Remove",IDC_BUTTONREMOVE,198,186,40,14,BS_CENTER + PUSHBUTTON "Default",IDC_BUTTON_DEFAULT,242,186,40,14,BS_CENTER + CONTROL "Ignory non AlphaNumeric characters",IDC_CLN_NON_ALPHNUM, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,56,248,9 +END + +IDD_MINIBLOG DIALOGEX 0, 0, 256, 134 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,76,113,50,14,WS_DISABLED + PUSHBUTTON "Cancel",IDCANCEL,130,113,50,14 + EDITTEXT IDC_USER_BLOG_STATUS_MSG,7,19,242,38,ES_MULTILINE | ES_READONLY + EDITTEXT IDC_MSG_TO_SEND,7,61,242,38,ES_MULTILINE + CONTROL "Notify",IDC_CHK_NOTIFY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,102,125,9 + LTEXT "Writed:",IDC_STATIC_WRITED_TIME,7,7,242,11 + LTEXT "0/500",IDC_STATIC_CHARS_COUNTER,211,103,38,11,0,WS_EX_RIGHT +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_MINIBLOG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 249 + TOPMARGIN, 7 + BOTTOMMARGIN, 127 + END +END +#endif // APSTUDIO_INVOKED + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // Russian resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// 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 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_DIALOG_SELECT_EMAIL DIALOGEX 0, 0, 177, 169 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "Select e-mail" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LISTBOX IDC_LIST_EMAILS,7,7,163,133,LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | NOT WS_BORDER | WS_VSCROLL | WS_TABSTOP,WS_EX_STATICEDGE + DEFPUSHBUTTON "OK",IDOK,39,147,51,15 + PUSHBUTTON "Cancel",IDCANCEL,93,147,51,15 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_DIALOG_SELECT_EMAIL, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 170 + TOPMARGIN, 7 + BOTTOMMARGIN, 162 + END +END +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/MRA/xstatus_MRA/XStatus_icons/10.ico b/MRA/xstatus_MRA/XStatus_icons/10.ico new file mode 100644 index 0000000..b13a898 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/10.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/11.ico b/MRA/xstatus_MRA/XStatus_icons/11.ico new file mode 100644 index 0000000..16d72d3 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/11.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/12.ico b/MRA/xstatus_MRA/XStatus_icons/12.ico new file mode 100644 index 0000000..9713275 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/12.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/13.ico b/MRA/xstatus_MRA/XStatus_icons/13.ico new file mode 100644 index 0000000..0d824ad Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/13.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/14.ico b/MRA/xstatus_MRA/XStatus_icons/14.ico new file mode 100644 index 0000000..a939be5 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/14.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/15.ico b/MRA/xstatus_MRA/XStatus_icons/15.ico new file mode 100644 index 0000000..d525499 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/15.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/16.ico b/MRA/xstatus_MRA/XStatus_icons/16.ico new file mode 100644 index 0000000..950b03f Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/16.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/17.ico b/MRA/xstatus_MRA/XStatus_icons/17.ico new file mode 100644 index 0000000..9f90a34 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/17.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/18.ico b/MRA/xstatus_MRA/XStatus_icons/18.ico new file mode 100644 index 0000000..a76170e Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/18.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/19.ico b/MRA/xstatus_MRA/XStatus_icons/19.ico new file mode 100644 index 0000000..ae53516 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/19.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/20.ico b/MRA/xstatus_MRA/XStatus_icons/20.ico new file mode 100644 index 0000000..ee2fe2c Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/20.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/21.ico b/MRA/xstatus_MRA/XStatus_icons/21.ico new file mode 100644 index 0000000..03a5d10 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/21.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/22.ico b/MRA/xstatus_MRA/XStatus_icons/22.ico new file mode 100644 index 0000000..ba29072 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/22.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/23.ico b/MRA/xstatus_MRA/XStatus_icons/23.ico new file mode 100644 index 0000000..a5a2237 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/23.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/24.ico b/MRA/xstatus_MRA/XStatus_icons/24.ico new file mode 100644 index 0000000..abf66b3 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/24.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/25.txt b/MRA/xstatus_MRA/XStatus_icons/25.txt new file mode 100644 index 0000000..ff981d2 --- /dev/null +++ b/MRA/xstatus_MRA/XStatus_icons/25.txt @@ -0,0 +1,2 @@ +no icon +possible chat/dnd icon here \ No newline at end of file diff --git a/MRA/xstatus_MRA/XStatus_icons/26.ico b/MRA/xstatus_MRA/XStatus_icons/26.ico new file mode 100644 index 0000000..fea4f77 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/26.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/27.ico b/MRA/xstatus_MRA/XStatus_icons/27.ico new file mode 100644 index 0000000..d5671d6 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/27.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/28.ico b/MRA/xstatus_MRA/XStatus_icons/28.ico new file mode 100644 index 0000000..cb4fc69 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/28.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/29.ico b/MRA/xstatus_MRA/XStatus_icons/29.ico new file mode 100644 index 0000000..caf1684 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/29.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/30.ico b/MRA/xstatus_MRA/XStatus_icons/30.ico new file mode 100644 index 0000000..329b07e Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/30.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/31.ico b/MRA/xstatus_MRA/XStatus_icons/31.ico new file mode 100644 index 0000000..5cb465e Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/31.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/32.txt b/MRA/xstatus_MRA/XStatus_icons/32.txt new file mode 100644 index 0000000..ff981d2 --- /dev/null +++ b/MRA/xstatus_MRA/XStatus_icons/32.txt @@ -0,0 +1,2 @@ +no icon +possible chat/dnd icon here \ No newline at end of file diff --git a/MRA/xstatus_MRA/XStatus_icons/33.ico b/MRA/xstatus_MRA/XStatus_icons/33.ico new file mode 100644 index 0000000..c16ab7b Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/33.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/34.ico b/MRA/xstatus_MRA/XStatus_icons/34.ico new file mode 100644 index 0000000..f73d8c5 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/34.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/35.ico b/MRA/xstatus_MRA/XStatus_icons/35.ico new file mode 100644 index 0000000..8594b05 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/35.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/36.ico b/MRA/xstatus_MRA/XStatus_icons/36.ico new file mode 100644 index 0000000..51fb924 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/36.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/37.ico b/MRA/xstatus_MRA/XStatus_icons/37.ico new file mode 100644 index 0000000..f431151 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/37.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/38.ico b/MRA/xstatus_MRA/XStatus_icons/38.ico new file mode 100644 index 0000000..9e9b866 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/38.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/39.ico b/MRA/xstatus_MRA/XStatus_icons/39.ico new file mode 100644 index 0000000..83623ab Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/39.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/4.ico b/MRA/xstatus_MRA/XStatus_icons/4.ico new file mode 100644 index 0000000..be30200 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/4.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/40.ico b/MRA/xstatus_MRA/XStatus_icons/40.ico new file mode 100644 index 0000000..cd47c4a Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/40.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/41.ico b/MRA/xstatus_MRA/XStatus_icons/41.ico new file mode 100644 index 0000000..c78cfcf Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/41.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/42.ico b/MRA/xstatus_MRA/XStatus_icons/42.ico new file mode 100644 index 0000000..eb10108 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/42.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/43.ico b/MRA/xstatus_MRA/XStatus_icons/43.ico new file mode 100644 index 0000000..db60b06 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/43.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/44.ico b/MRA/xstatus_MRA/XStatus_icons/44.ico new file mode 100644 index 0000000..dfcc569 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/44.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/45.ico b/MRA/xstatus_MRA/XStatus_icons/45.ico new file mode 100644 index 0000000..72edb15 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/45.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/46.ico b/MRA/xstatus_MRA/XStatus_icons/46.ico new file mode 100644 index 0000000..4dbd7ce Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/46.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/47.ico b/MRA/xstatus_MRA/XStatus_icons/47.ico new file mode 100644 index 0000000..2468c5e Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/47.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/48.ico b/MRA/xstatus_MRA/XStatus_icons/48.ico new file mode 100644 index 0000000..e8f4e4d Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/48.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/49.ico b/MRA/xstatus_MRA/XStatus_icons/49.ico new file mode 100644 index 0000000..368652a Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/49.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/5.ico b/MRA/xstatus_MRA/XStatus_icons/5.ico new file mode 100644 index 0000000..76cca4e Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/5.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/50.ico b/MRA/xstatus_MRA/XStatus_icons/50.ico new file mode 100644 index 0000000..ef41641 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/50.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/51.ico b/MRA/xstatus_MRA/XStatus_icons/51.ico new file mode 100644 index 0000000..a3ec794 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/51.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/52.ico b/MRA/xstatus_MRA/XStatus_icons/52.ico new file mode 100644 index 0000000..08edc62 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/52.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/53.ico b/MRA/xstatus_MRA/XStatus_icons/53.ico new file mode 100644 index 0000000..374b72f Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/53.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/54.ico b/MRA/xstatus_MRA/XStatus_icons/54.ico new file mode 100644 index 0000000..0223143 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/54.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/6.ico b/MRA/xstatus_MRA/XStatus_icons/6.ico new file mode 100644 index 0000000..9cfbd05 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/6.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/7.ico b/MRA/xstatus_MRA/XStatus_icons/7.ico new file mode 100644 index 0000000..63a7b8b Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/7.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/8.ico b/MRA/xstatus_MRA/XStatus_icons/8.ico new file mode 100644 index 0000000..dba6ee7 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/8.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/9.ico b/MRA/xstatus_MRA/XStatus_icons/9.ico new file mode 100644 index 0000000..5983953 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/9.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/icon1.ico b/MRA/xstatus_MRA/XStatus_icons/icon1.ico new file mode 100644 index 0000000..1fa1723 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/icon1.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons/unknown.ico b/MRA/xstatus_MRA/XStatus_icons/unknown.ico new file mode 100644 index 0000000..52f5847 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons/unknown.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/10.ico b/MRA/xstatus_MRA/XStatus_icons_original/10.ico new file mode 100644 index 0000000..8a6082b Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/10.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/11.ico b/MRA/xstatus_MRA/XStatus_icons_original/11.ico new file mode 100644 index 0000000..45fc19b Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/11.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/12.ico b/MRA/xstatus_MRA/XStatus_icons_original/12.ico new file mode 100644 index 0000000..22b5852 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/12.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/13.ico b/MRA/xstatus_MRA/XStatus_icons_original/13.ico new file mode 100644 index 0000000..99f9bcb Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/13.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/14.ico b/MRA/xstatus_MRA/XStatus_icons_original/14.ico new file mode 100644 index 0000000..51022c0 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/14.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/15.ico b/MRA/xstatus_MRA/XStatus_icons_original/15.ico new file mode 100644 index 0000000..7147906 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/15.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/16.ico b/MRA/xstatus_MRA/XStatus_icons_original/16.ico new file mode 100644 index 0000000..6d18f23 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/16.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/17.ico b/MRA/xstatus_MRA/XStatus_icons_original/17.ico new file mode 100644 index 0000000..79a6ce3 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/17.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/18.ico b/MRA/xstatus_MRA/XStatus_icons_original/18.ico new file mode 100644 index 0000000..9bcc8cc Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/18.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/19.ico b/MRA/xstatus_MRA/XStatus_icons_original/19.ico new file mode 100644 index 0000000..1cd2c5e Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/19.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/20.ico b/MRA/xstatus_MRA/XStatus_icons_original/20.ico new file mode 100644 index 0000000..f315d56 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/20.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/21.ico b/MRA/xstatus_MRA/XStatus_icons_original/21.ico new file mode 100644 index 0000000..c2a63ad Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/21.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/22.ico b/MRA/xstatus_MRA/XStatus_icons_original/22.ico new file mode 100644 index 0000000..b8db78d Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/22.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/23.ico b/MRA/xstatus_MRA/XStatus_icons_original/23.ico new file mode 100644 index 0000000..43737bc Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/23.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/24.ico b/MRA/xstatus_MRA/XStatus_icons_original/24.ico new file mode 100644 index 0000000..f2d6c05 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/24.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/25.txt b/MRA/xstatus_MRA/XStatus_icons_original/25.txt new file mode 100644 index 0000000..ff981d2 --- /dev/null +++ b/MRA/xstatus_MRA/XStatus_icons_original/25.txt @@ -0,0 +1,2 @@ +no icon +possible chat/dnd icon here \ No newline at end of file diff --git a/MRA/xstatus_MRA/XStatus_icons_original/26.ico b/MRA/xstatus_MRA/XStatus_icons_original/26.ico new file mode 100644 index 0000000..c225440 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/26.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/27.ico b/MRA/xstatus_MRA/XStatus_icons_original/27.ico new file mode 100644 index 0000000..1ee08b6 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/27.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/28.ico b/MRA/xstatus_MRA/XStatus_icons_original/28.ico new file mode 100644 index 0000000..8fb918b Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/28.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/29.ico b/MRA/xstatus_MRA/XStatus_icons_original/29.ico new file mode 100644 index 0000000..caf1684 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/29.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/30.ico b/MRA/xstatus_MRA/XStatus_icons_original/30.ico new file mode 100644 index 0000000..329b07e Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/30.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/31.ico b/MRA/xstatus_MRA/XStatus_icons_original/31.ico new file mode 100644 index 0000000..5cb465e Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/31.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/32.txt b/MRA/xstatus_MRA/XStatus_icons_original/32.txt new file mode 100644 index 0000000..ff981d2 --- /dev/null +++ b/MRA/xstatus_MRA/XStatus_icons_original/32.txt @@ -0,0 +1,2 @@ +no icon +possible chat/dnd icon here \ No newline at end of file diff --git a/MRA/xstatus_MRA/XStatus_icons_original/33.ico b/MRA/xstatus_MRA/XStatus_icons_original/33.ico new file mode 100644 index 0000000..c16ab7b Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/33.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/34.ico b/MRA/xstatus_MRA/XStatus_icons_original/34.ico new file mode 100644 index 0000000..f73d8c5 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/34.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/35.ico b/MRA/xstatus_MRA/XStatus_icons_original/35.ico new file mode 100644 index 0000000..8594b05 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/35.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/36.ico b/MRA/xstatus_MRA/XStatus_icons_original/36.ico new file mode 100644 index 0000000..51fb924 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/36.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/37.ico b/MRA/xstatus_MRA/XStatus_icons_original/37.ico new file mode 100644 index 0000000..f431151 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/37.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/38.ico b/MRA/xstatus_MRA/XStatus_icons_original/38.ico new file mode 100644 index 0000000..9e9b866 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/38.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/39.ico b/MRA/xstatus_MRA/XStatus_icons_original/39.ico new file mode 100644 index 0000000..83623ab Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/39.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/4.ico b/MRA/xstatus_MRA/XStatus_icons_original/4.ico new file mode 100644 index 0000000..2c15d84 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/4.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/40.ico b/MRA/xstatus_MRA/XStatus_icons_original/40.ico new file mode 100644 index 0000000..cd47c4a Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/40.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/41.ico b/MRA/xstatus_MRA/XStatus_icons_original/41.ico new file mode 100644 index 0000000..c78cfcf Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/41.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/42.ico b/MRA/xstatus_MRA/XStatus_icons_original/42.ico new file mode 100644 index 0000000..eb10108 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/42.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/43.ico b/MRA/xstatus_MRA/XStatus_icons_original/43.ico new file mode 100644 index 0000000..db60b06 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/43.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/44.ico b/MRA/xstatus_MRA/XStatus_icons_original/44.ico new file mode 100644 index 0000000..dfcc569 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/44.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/45.ico b/MRA/xstatus_MRA/XStatus_icons_original/45.ico new file mode 100644 index 0000000..72edb15 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/45.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/46.ico b/MRA/xstatus_MRA/XStatus_icons_original/46.ico new file mode 100644 index 0000000..3be634f Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/46.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/47.ico b/MRA/xstatus_MRA/XStatus_icons_original/47.ico new file mode 100644 index 0000000..0d9e7e0 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/47.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/48.ico b/MRA/xstatus_MRA/XStatus_icons_original/48.ico new file mode 100644 index 0000000..6905be1 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/48.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/49.ico b/MRA/xstatus_MRA/XStatus_icons_original/49.ico new file mode 100644 index 0000000..368652a Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/49.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/5.ico b/MRA/xstatus_MRA/XStatus_icons_original/5.ico new file mode 100644 index 0000000..73995f4 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/5.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/50.ico b/MRA/xstatus_MRA/XStatus_icons_original/50.ico new file mode 100644 index 0000000..ef41641 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/50.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/51.ico b/MRA/xstatus_MRA/XStatus_icons_original/51.ico new file mode 100644 index 0000000..b07c24e Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/51.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/52.ico b/MRA/xstatus_MRA/XStatus_icons_original/52.ico new file mode 100644 index 0000000..3e90a10 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/52.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/53.ico b/MRA/xstatus_MRA/XStatus_icons_original/53.ico new file mode 100644 index 0000000..56f8edc Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/53.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/6.ico b/MRA/xstatus_MRA/XStatus_icons_original/6.ico new file mode 100644 index 0000000..7381d1d Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/6.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/7.ico b/MRA/xstatus_MRA/XStatus_icons_original/7.ico new file mode 100644 index 0000000..8ed6d25 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/7.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/8.ico b/MRA/xstatus_MRA/XStatus_icons_original/8.ico new file mode 100644 index 0000000..b6adfa5 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/8.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/9.ico b/MRA/xstatus_MRA/XStatus_icons_original/9.ico new file mode 100644 index 0000000..066330a Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/9.ico differ diff --git a/MRA/xstatus_MRA/XStatus_icons_original/unknown.ico b/MRA/xstatus_MRA/XStatus_icons_original/unknown.ico new file mode 100644 index 0000000..5d506b9 Binary files /dev/null and b/MRA/xstatus_MRA/XStatus_icons_original/unknown.ico differ diff --git a/MRA/xstatus_MRA/resource.h b/MRA/xstatus_MRA/resource.h new file mode 100644 index 0000000..7a9bbeb --- /dev/null +++ b/MRA/xstatus_MRA/resource.h @@ -0,0 +1,67 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by xstatus_MRA.rc +// +#define IDS_IDENTIFY 102 +#define IDI_XSTATUS1 201 +#define IDI_XSTATUS2 202 +#define IDI_XSTATUS3 203 +#define IDI_XSTATUS4 204 +#define IDI_XSTATUS5 205 +#define IDI_XSTATUS6 206 +#define IDI_XSTATUS7 207 +#define IDI_XSTATUS8 208 +#define IDI_XSTATUS9 209 +#define IDI_XSTATUS10 210 +#define IDI_XSTATUS11 211 +#define IDI_XSTATUS12 212 +#define IDI_XSTATUS13 213 +#define IDI_XSTATUS14 214 +#define IDI_XSTATUS15 215 +#define IDI_XSTATUS16 216 +#define IDI_XSTATUS17 217 +#define IDI_XSTATUS18 218 +#define IDI_XSTATUS19 219 +#define IDI_XSTATUS20 220 +#define IDI_XSTATUS21 221 +#define IDI_XSTATUS22 222 +#define IDI_XSTATUS23 223 +#define IDI_XSTATUS24 224 +#define IDI_XSTATUS25 225 +#define IDI_XSTATUS26 226 +#define IDI_XSTATUS27 227 +#define IDI_XSTATUS28 228 +#define IDI_XSTATUS29 229 +#define IDI_XSTATUS30 230 +#define IDI_XSTATUS31 231 +#define IDI_XSTATUS32 232 +#define IDI_XSTATUS33 233 +#define IDI_XSTATUS34 234 +#define IDI_XSTATUS35 235 +#define IDI_XSTATUS36 236 +#define IDI_XSTATUS37 237 +#define IDI_XSTATUS38 238 +#define IDI_XSTATUS39 239 +#define IDI_XSTATUS40 240 +#define IDI_XSTATUS41 241 +#define IDI_XSTATUS42 242 +#define IDI_XSTATUS43 243 +#define IDI_XSTATUS44 244 +#define IDI_XSTATUS45 245 +#define IDI_XSTATUS46 246 +#define IDI_XSTATUS47 247 +#define IDI_XSTATUS48 248 +#define IDI_XSTATUS49 249 +#define IDI_XSTATUS_UNKNOWN 250 + + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 253 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/MRA/xstatus_MRA/xstatus_MRA.rc b/MRA/xstatus_MRA/xstatus_MRA.rc new file mode 100644 index 0000000..2d4dc48 --- /dev/null +++ b/MRA/xstatus_MRA/xstatus_MRA.rc @@ -0,0 +1,144 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_XSTATUS1 ICON "XStatus_icons\\4.ico" +IDI_XSTATUS2 ICON "XStatus_icons\\5.ico" +IDI_XSTATUS3 ICON "XStatus_icons\\6.ico" +IDI_XSTATUS4 ICON "XStatus_icons\\7.ico" +IDI_XSTATUS5 ICON "XStatus_icons\\8.ico" +IDI_XSTATUS6 ICON "XStatus_icons\\9.ico" +IDI_XSTATUS7 ICON "XStatus_icons\\10.ico" +IDI_XSTATUS8 ICON "XStatus_icons\\11.ico" +IDI_XSTATUS9 ICON "XStatus_icons\\12.ico" +IDI_XSTATUS10 ICON "XStatus_icons\\13.ico" +IDI_XSTATUS11 ICON "XStatus_icons\\14.ico" +IDI_XSTATUS12 ICON "XStatus_icons\\15.ico" +IDI_XSTATUS13 ICON "XStatus_icons\\16.ico" +IDI_XSTATUS14 ICON "XStatus_icons\\17.ico" +IDI_XSTATUS15 ICON "XStatus_icons\\18.ico" +IDI_XSTATUS16 ICON "XStatus_icons\\19.ico" +IDI_XSTATUS17 ICON "XStatus_icons\\20.ico" +IDI_XSTATUS18 ICON "XStatus_icons\\21.ico" +IDI_XSTATUS19 ICON "XStatus_icons\\22.ico" +IDI_XSTATUS20 ICON "XStatus_icons\\23.ico" +IDI_XSTATUS21 ICON "XStatus_icons\\24.ico" +IDI_XSTATUS22 ICON "XStatus_icons\\26.ico" +IDI_XSTATUS23 ICON "XStatus_icons\\27.ico" +IDI_XSTATUS24 ICON "XStatus_icons\\28.ico" +IDI_XSTATUS25 ICON "XStatus_icons\\29.ico" +IDI_XSTATUS26 ICON "XStatus_icons\\30.ico" +IDI_XSTATUS27 ICON "XStatus_icons\\31.ico" +IDI_XSTATUS28 ICON "XStatus_icons\\33.ico" +IDI_XSTATUS29 ICON "XStatus_icons\\34.ico" +IDI_XSTATUS30 ICON "XStatus_icons\\35.ico" +IDI_XSTATUS31 ICON "XStatus_icons\\36.ico" +IDI_XSTATUS32 ICON "XStatus_icons\\37.ico" +IDI_XSTATUS33 ICON "XStatus_icons\\38.ico" +IDI_XSTATUS34 ICON "XStatus_icons\\39.ico" +IDI_XSTATUS35 ICON "XStatus_icons\\40.ico" +IDI_XSTATUS36 ICON "XStatus_icons\\41.ico" +IDI_XSTATUS37 ICON "XStatus_icons\\42.ico" +IDI_XSTATUS38 ICON "XStatus_icons\\43.ico" +IDI_XSTATUS39 ICON "XStatus_icons\\44.ico" +IDI_XSTATUS40 ICON "XStatus_icons\\45.ico" +IDI_XSTATUS41 ICON "XStatus_icons\\46.ico" +IDI_XSTATUS42 ICON "XStatus_icons\\47.ico" +IDI_XSTATUS43 ICON "XStatus_icons\\48.ico" +IDI_XSTATUS44 ICON "XStatus_icons\\49.ico" +IDI_XSTATUS45 ICON "XStatus_icons\\50.ico" +IDI_XSTATUS46 ICON "XStatus_icons\\51.ico" +IDI_XSTATUS47 ICON "XStatus_icons\\52.ico" +IDI_XSTATUS48 ICON "XStatus_icons\\53.ico" +IDI_XSTATUS_UNKNOWN ICON "XStatus_icons\\unknown.ico" +IDI_XSTATUS49 ICON "XStatus_icons\\54.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_IDENTIFY "# Custom Status Icons #" +END + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// 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 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/MRA/xstatus_MRA/xstatus_MRA.vcproj b/MRA/xstatus_MRA/xstatus_MRA.vcproj new file mode 100644 index 0000000..09e0b70 --- /dev/null +++ b/MRA/xstatus_MRA/xstatus_MRA.vcproj @@ -0,0 +1,786 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3