From db55f5b6eb4911fc1062917d7e95b6aaae165fdf Mon Sep 17 00:00:00 2001 From: George Hazan Date: Tue, 27 Nov 2018 21:10:30 +0300 Subject: fixes #1614 (MRA protocol deprecated due its death) --- protocols/MRA/src/Mra.cpp | 60 - protocols/MRA/src/MraAdvancedSearch.cpp | 313 -- protocols/MRA/src/MraAvatars.cpp | 636 --- protocols/MRA/src/MraAvatars.h | 14 - protocols/MRA/src/MraChat.cpp | 221 - protocols/MRA/src/MraConstans.h | 243 -- protocols/MRA/src/MraFilesQueue.cpp | 1146 ----- protocols/MRA/src/MraFilesQueue.h | 17 - protocols/MRA/src/MraIcons.cpp | 145 - protocols/MRA/src/MraIcons.h | 10 - protocols/MRA/src/MraMPop.cpp | 174 - protocols/MRA/src/MraMPop.h | 11 - protocols/MRA/src/MraMRIMProxy.cpp | 199 - protocols/MRA/src/MraMRIMProxy.h | 13 - protocols/MRA/src/MraOfflineMsg.cpp | 264 -- protocols/MRA/src/MraOfflineMsg.h | 8 - protocols/MRA/src/MraPlaces.h | 5956 -------------------------- protocols/MRA/src/MraPopUp.cpp | 284 -- protocols/MRA/src/MraPopUp.h | 15 - protocols/MRA/src/MraProto.cpp | 554 --- protocols/MRA/src/MraProto.h | 349 -- protocols/MRA/src/MraRTFMsg.cpp | 246 -- protocols/MRA/src/MraRTFMsg.h | 9 - protocols/MRA/src/MraSelectEMail.cpp | 152 - protocols/MRA/src/MraSelectEMail.h | 15 - protocols/MRA/src/MraSendCommand.cpp | 542 --- protocols/MRA/src/MraSendQueue.cpp | 161 - protocols/MRA/src/MraSendQueue.h | 16 - protocols/MRA/src/Mra_functions.cpp | 1439 ------- protocols/MRA/src/Mra_menus.cpp | 408 -- protocols/MRA/src/Mra_options.cpp | 244 -- protocols/MRA/src/Mra_proto.cpp | 1966 --------- protocols/MRA/src/Mra_svcs.cpp | 667 --- protocols/MRA/src/Sdk/BuffToLowerCase.h | 95 - protocols/MRA/src/Sdk/FIFOMT.h | 73 - protocols/MRA/src/Sdk/InterlockedFunctions.h | 53 - protocols/MRA/src/Sdk/InternetTime.h | 290 -- protocols/MRA/src/Sdk/ListMT.h | 200 - protocols/MRA/src/Sdk/MemoryFind.h | 76 - protocols/MRA/src/Sdk/MemoryFindByte.h | 47 - protocols/MRA/src/Sdk/RC4.h | 99 - protocols/MRA/src/Sdk/SHA1.h | 87 - protocols/MRA/src/Sdk/StrHexToNum.h | 72 - protocols/MRA/src/Sdk/StrToNum.h | 85 - protocols/MRA/src/Sdk/timefuncs.h | 105 - protocols/MRA/src/proto.h | 611 --- protocols/MRA/src/resource.h | 128 - protocols/MRA/src/stdafx.cxx | 18 - protocols/MRA/src/stdafx.h | 215 - protocols/MRA/src/version.h | 13 - 50 files changed, 18764 deletions(-) delete mode 100644 protocols/MRA/src/Mra.cpp delete mode 100644 protocols/MRA/src/MraAdvancedSearch.cpp delete mode 100644 protocols/MRA/src/MraAvatars.cpp delete mode 100644 protocols/MRA/src/MraAvatars.h delete mode 100644 protocols/MRA/src/MraChat.cpp delete mode 100644 protocols/MRA/src/MraConstans.h delete mode 100644 protocols/MRA/src/MraFilesQueue.cpp delete mode 100644 protocols/MRA/src/MraFilesQueue.h delete mode 100644 protocols/MRA/src/MraIcons.cpp delete mode 100644 protocols/MRA/src/MraIcons.h delete mode 100644 protocols/MRA/src/MraMPop.cpp delete mode 100644 protocols/MRA/src/MraMPop.h delete mode 100644 protocols/MRA/src/MraMRIMProxy.cpp delete mode 100644 protocols/MRA/src/MraMRIMProxy.h delete mode 100644 protocols/MRA/src/MraOfflineMsg.cpp delete mode 100644 protocols/MRA/src/MraOfflineMsg.h delete mode 100644 protocols/MRA/src/MraPlaces.h delete mode 100644 protocols/MRA/src/MraPopUp.cpp delete mode 100644 protocols/MRA/src/MraPopUp.h delete mode 100644 protocols/MRA/src/MraProto.cpp delete mode 100644 protocols/MRA/src/MraProto.h delete mode 100644 protocols/MRA/src/MraRTFMsg.cpp delete mode 100644 protocols/MRA/src/MraRTFMsg.h delete mode 100644 protocols/MRA/src/MraSelectEMail.cpp delete mode 100644 protocols/MRA/src/MraSelectEMail.h delete mode 100644 protocols/MRA/src/MraSendCommand.cpp delete mode 100644 protocols/MRA/src/MraSendQueue.cpp delete mode 100644 protocols/MRA/src/MraSendQueue.h delete mode 100644 protocols/MRA/src/Mra_functions.cpp delete mode 100644 protocols/MRA/src/Mra_menus.cpp delete mode 100644 protocols/MRA/src/Mra_options.cpp delete mode 100644 protocols/MRA/src/Mra_proto.cpp delete mode 100644 protocols/MRA/src/Mra_svcs.cpp delete mode 100644 protocols/MRA/src/Sdk/BuffToLowerCase.h delete mode 100644 protocols/MRA/src/Sdk/FIFOMT.h delete mode 100644 protocols/MRA/src/Sdk/InterlockedFunctions.h delete mode 100644 protocols/MRA/src/Sdk/InternetTime.h delete mode 100644 protocols/MRA/src/Sdk/ListMT.h delete mode 100644 protocols/MRA/src/Sdk/MemoryFind.h delete mode 100644 protocols/MRA/src/Sdk/MemoryFindByte.h delete mode 100644 protocols/MRA/src/Sdk/RC4.h delete mode 100644 protocols/MRA/src/Sdk/SHA1.h delete mode 100644 protocols/MRA/src/Sdk/StrHexToNum.h delete mode 100644 protocols/MRA/src/Sdk/StrToNum.h delete mode 100644 protocols/MRA/src/Sdk/timefuncs.h delete mode 100644 protocols/MRA/src/proto.h delete mode 100644 protocols/MRA/src/resource.h delete mode 100644 protocols/MRA/src/stdafx.cxx delete mode 100644 protocols/MRA/src/stdafx.h delete mode 100644 protocols/MRA/src/version.h (limited to 'protocols/MRA/src') diff --git a/protocols/MRA/src/Mra.cpp b/protocols/MRA/src/Mra.cpp deleted file mode 100644 index f2ab1ca447..0000000000 --- a/protocols/MRA/src/Mra.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include "stdafx.h" - -CMPlugin g_plugin; - -HMODULE g_hDLLXStatusIcons; -HICON g_hMainIcon; - -bool g_bChatExist; - -size_t g_dwMirWorkDirPathLen; -WCHAR g_szMirWorkDirPath[MAX_FILEPATH]; - -void IconsLoad(); - -///////////////////////////////////////////////////////////////////////////////////////// - -PLUGININFOEX pluginInfoEx = { - sizeof(PLUGININFOEX), - PROTOCOL_DISPLAY_NAME_ORIGA, - PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM), - __DESCRIPTION, - __AUTHOR, - __COPYRIGHT, - __AUTHORWEB, - UNICODE_AWARE, - // {E7C48BAB-8ACE-4CB3-8446-D4B73481F497} - { 0xe7c48bab, 0x8ace, 0x4cb3, { 0x84, 0x46, 0xd4, 0xb7, 0x34, 0x81, 0xf4, 0x97 } } -}; - -CMPlugin::CMPlugin() : - ACCPROTOPLUGIN("MRA", pluginInfoEx) -{ - SetUniqueId("e-mail"); -} - -///////////////////////////////////////////////////////////////////////////////////////// - -extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = { MIID_PROTOCOL, MIID_LAST }; - -/////////////////////////////////////////////////////////////////////////////// - -int CMPlugin::Load() -{ - IconsLoad(); - InitXStatusIcons(); - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -int CMPlugin::Unload() -{ - DestroyXStatusIcons(); - if (g_hDLLXStatusIcons) { - FreeLibrary(g_hDLLXStatusIcons); - g_hDLLXStatusIcons = nullptr; - } - - return 0; -} diff --git a/protocols/MRA/src/MraAdvancedSearch.cpp b/protocols/MRA/src/MraAdvancedSearch.cpp deleted file mode 100644 index 7377f97d1b..0000000000 --- a/protocols/MRA/src/MraAdvancedSearch.cpp +++ /dev/null @@ -1,313 +0,0 @@ -#include "stdafx.h" -#include "proto.h" -#include "MraPlaces.h" - - - -struct FieldNames -{ - BYTE dwCode; - LPWSTR lpszText; -}; - -static const FieldNames GenderField[] = -{ - { 1, LPGENW("Male") }, - { 2, LPGENW("Female") }, - { 0, nullptr } -}; - -static const FieldNames MonthField[] = -{ - { 1, LPGENW("January") }, - { 2, LPGENW("February") }, - { 3, LPGENW("March") }, - { 4, LPGENW("April") }, - { 5, LPGENW("May") }, - { 6, LPGENW("June") }, - { 7, LPGENW("July") }, - { 8, LPGENW("August") }, - { 9, LPGENW("September") }, - { 10, LPGENW("October") }, - { 11, LPGENW("November") }, - { 12, LPGENW("December") }, - { 0, nullptr } -}; - -static const FieldNames ZodiakField[] = -{ - { 1, LPGENW("Aries") }, - { 2, LPGENW("Taurus") }, - { 3, LPGENW("Gemini") }, - { 4, LPGENW("Cancer") }, - { 5, LPGENW("Leo") }, - { 6, LPGENW("Virgo") }, - { 7, LPGENW("Libra") }, - { 8, LPGENW("Scorpio") }, - { 9, LPGENW("Sagittarius") }, - { 10, LPGENW("Capricorn") }, - { 11, LPGENW("Aquarius") }, - { 12, LPGENW("Pisces") }, - { 0, nullptr } -}; - -void ResetComboBox(HWND hWndCombo) -{ - SendMessage(hWndCombo, CB_RESETCONTENT, 0, 0); - DWORD 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) -{ - ResetComboBox(hWndCombo); - - for (size_t i = 0; lpNames[i].lpszText; i++) { - DWORD 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) -{ - ResetComboBox(hWndCombo); - - for (DWORD i = dwStart; i <= dwEnd; i++) { - wchar_t szBuff[MAX_PATH]; - mir_snwprintf(szBuff, L"%lu", i); - DWORD 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) -{ - CMraProto *ppro = (CMraProto*)GetWindowLongPtr(hWndDlg, GWLP_USERDATA); - - switch (message) { - case WM_INITDIALOG: - SetWindowLongPtr(hWndDlg, GWLP_USERDATA, lParam); - { - DWORD dwItem; - WCHAR wszBuff[MAX_PATH]; - SYSTEMTIME stTime; - GetLocalTime(&stTime); - - ppro = (CMraProto*)lParam; - - HWND 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, _countof(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 (ppro->getByte("AdvancedSearchRemember", MRA_DEFAULT_SEARCH_REMEMBER)) { - SendDlgItemMessage(hWndDlg, IDC_GENDER, CB_SETCURSEL, ppro->getWord("AdvancedSearchGender", 0), 0); - SendDlgItemMessage(hWndDlg, IDC_AGERANGE_FROM, CB_SETCURSEL, ppro->getWord("AdvancedSearchAgeFrom", 0), 0); - SendDlgItemMessage(hWndDlg, IDC_AGERANGE_TO, CB_SETCURSEL, ppro->getWord("AdvancedSearchAgeTo", 0), 0); - SendDlgItemMessage(hWndDlg, IDC_BIRTHDAY_MONTH, CB_SETCURSEL, ppro->getWord("AdvancedSearchBirthDayMonth", 0), 0); - SendDlgItemMessage(hWndDlg, IDC_BIRTHDAY_DAY, CB_SETCURSEL, ppro->getWord("AdvancedSearchBirthDayDay", 0), 0); - - SendDlgItemMessage(hWndDlg, IDC_ZODIAK, CB_SETCURSEL, ppro->getWord("AdvancedSearchZodiakID", 0), 0); - - - SendDlgItemMessage(hWndDlg, IDC_COUNTRY, CB_SETCURSEL, ppro->getWord("AdvancedSearchCountryID", 0), 0); - SendMessageW(hWndDlg, WM_COMMAND, (WPARAM)MAKELONG(IDC_COUNTRY, CBN_SELCHANGE), (LPARAM)GetDlgItem(hWndDlg, IDC_COUNTRY)); - - SendDlgItemMessage(hWndDlg, IDC_STATE, CB_SETCURSEL, ppro->getWord("AdvancedSearchStateID", 0), 0); - SendMessage(hWndDlg, WM_COMMAND, (WPARAM)MAKELONG(IDC_STATE, CBN_SELCHANGE), (LPARAM)GetDlgItem(hWndDlg, IDC_STATE)); - - SendDlgItemMessage(hWndDlg, IDC_CITY, CB_SETCURSEL, ppro->getWord("AdvancedSearchCityID", 0), 0); - - - CheckDlgButton(hWndDlg, IDC_ONLINEONLY, ppro->getByte("AdvancedSearchOnlineOnly", FALSE) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hWndDlg, IDC_CHK_REMEMBER, BST_CHECKED); - } - TranslateDialogDefault(hWndDlg); - } - return TRUE; - - case WM_DESTROY: - ppro->setWord("AdvancedSearchGender", SendDlgItemMessage(hWndDlg, IDC_GENDER, CB_GETCURSEL, 0, 0)); - ppro->setWord("AdvancedSearchAgeFrom", SendDlgItemMessage(hWndDlg, IDC_AGERANGE_FROM, CB_GETCURSEL, 0, 0)); - ppro->setWord("AdvancedSearchAgeTo", SendDlgItemMessage(hWndDlg, IDC_AGERANGE_TO, CB_GETCURSEL, 0, 0)); - ppro->setWord("AdvancedSearchBirthDayMonth", SendDlgItemMessage(hWndDlg, IDC_BIRTHDAY_MONTH, CB_GETCURSEL, 0, 0)); - ppro->setWord("AdvancedSearchBirthDayDay", SendDlgItemMessage(hWndDlg, IDC_BIRTHDAY_DAY, CB_GETCURSEL, 0, 0)); - - ppro->setWord("AdvancedSearchZodiakID", SendDlgItemMessage(hWndDlg, IDC_ZODIAK, CB_GETCURSEL, 0, 0)); - - ppro->setWord("AdvancedSearchCityID", SendDlgItemMessage(hWndDlg, IDC_CITY, CB_GETCURSEL, 0, 0)); - ppro->setWord("AdvancedSearchStateID", SendDlgItemMessage(hWndDlg, IDC_STATE, CB_GETCURSEL, 0, 0)); - ppro->setWord("AdvancedSearchCountryID", SendDlgItemMessage(hWndDlg, IDC_COUNTRY, CB_GETCURSEL, 0, 0)); - - ppro->setByte("AdvancedSearchOnlineOnly", IsDlgButtonChecked(hWndDlg, IDC_ONLINEONLY)); - ppro->setByte("AdvancedSearchRemember", IsDlgButtonChecked(hWndDlg, IDC_CHK_REMEMBER)); - break; - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDC_AGERANGE_FROM: - case IDC_AGERANGE_TO: - if (HIWORD(wParam) == CBN_SELCHANGE) { - if (LOWORD(wParam) == IDC_AGERANGE_FROM) { - DWORD dwAgeFrom = GET_CURRENT_COMBO_DATA(hWndDlg, IDC_AGERANGE_FROM); - DWORD dwAgeTo = GET_CURRENT_COMBO_DATA(hWndDlg, IDC_AGERANGE_TO); - if (dwAgeFrom == 0) dwAgeFrom++; - InitComboBoxNumders(GetDlgItem(hWndDlg, IDC_AGERANGE_TO), dwAgeFrom, 100); - SendDlgItemMessage(hWndDlg, IDC_AGERANGE_TO, CB_SETCURSEL, ((dwAgeTo - dwAgeFrom) + 1), 0); - } - SendDlgItemMessage(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) { - 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); - - DWORD dwAge = GetYears(&stTime); - SendDlgItemMessage(hWndDlg, IDC_AGERANGE_FROM, CB_SETCURSEL, dwAge, 0); - SendDlgItemMessage(hWndDlg, IDC_AGERANGE_TO, CB_SETCURSEL, dwAge, 0); - SendDlgItemMessage(hWndDlg, IDC_ZODIAK, CB_SETCURSEL, 0, 0); - } - break; - - case IDC_ZODIAK: - if (HIWORD(wParam) == CBN_SELCHANGE) { - SendDlgItemMessage(hWndDlg, IDC_BIRTHDAY_DAY, CB_SETCURSEL, 0, 0); - SendDlgItemMessage(hWndDlg, IDC_BIRTHDAY_MONTH, CB_SETCURSEL, 0, 0); - //SendDlgItemMessage(hWndDlg, IDC_BIRTHDAY_YEAR, CB_SETCURSEL, 0, 0); - } - break; - - case IDC_COUNTRY: - if (HIWORD(wParam) == CBN_SELCHANGE) { - DWORD dwCountryID = GET_CURRENT_COMBO_DATA(hWndDlg, IDC_COUNTRY); - HWND hWndCombo = GetDlgItem(hWndDlg, IDC_STATE); - SendMessage(hWndCombo, CB_RESETCONTENT, 0, 0); - ResetComboBox(GetDlgItem(hWndDlg, IDC_CITY)); - DWORD 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) { - DWORD dwCountryID = GET_CURRENT_COMBO_DATA(hWndDlg, IDC_COUNTRY); - DWORD dwStateID = GET_CURRENT_COMBO_DATA(hWndDlg, IDC_STATE); - HWND hWndCombo = GetDlgItem(hWndDlg, IDC_CITY); - SendMessage(hWndCombo, CB_RESETCONTENT, 0, 0); - DWORD 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); - } - } - } - } - } - return FALSE; -} - -HWND CMraProto::SearchAdvanced(HWND hWndDlg) -{ - DWORD dwRequestFlags = 0; - char szUser[MAX_PATH], szDomain[MAX_PATH]; - wchar_t wszNickName[MAX_PATH], wszFirstName[MAX_PATH], wszLastName[MAX_PATH]; - - size_t dwUserSize = GetDlgItemTextA(hWndDlg, IDC_EMAIL_USER, szUser, _countof(szUser)); - size_t dwDomainSize = GetDlgItemTextA(hWndDlg, IDC_EMAIL_DOMAIN, szDomain, _countof(szDomain)); - if (dwUserSize && dwDomainSize) { - SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_USER); - SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_DOMAIN); - } - - size_t dwNickNameSize = GetDlgItemText(hWndDlg, IDC_NICK, wszNickName, _countof(wszNickName)); - if (dwNickNameSize) SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_NICKNAME); - - size_t dwFirstNameSize = GetDlgItemText(hWndDlg, IDC_FIRSTNAME, wszFirstName, _countof(wszFirstName)); - if (dwFirstNameSize) SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_FIRSTNAME); - - size_t dwLastNameSize = GetDlgItemText(hWndDlg, IDC_LASTNAME, wszLastName, _countof(wszLastName)); - if (dwLastNameSize) SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_LASTNAME); - - DWORD dwSex = GET_CURRENT_COMBO_DATA(hWndDlg, IDC_GENDER); - if (dwSex) SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_SEX); - - DWORD dwDate1 = GET_CURRENT_COMBO_DATA(hWndDlg, IDC_AGERANGE_FROM); - if (dwDate1) SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_DATE1); - - DWORD dwDate2 = GET_CURRENT_COMBO_DATA(hWndDlg, IDC_AGERANGE_TO); - if (dwDate2) SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_DATE2); - - DWORD 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); - - DWORD dwZodiak = GET_CURRENT_COMBO_DATA(hWndDlg, IDC_ZODIAK); - if (dwZodiak) SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_ZODIAC); - - DWORD dwBirthdayMonth = GET_CURRENT_COMBO_DATA(hWndDlg, IDC_BIRTHDAY_MONTH); - if (dwBirthdayMonth) SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_MONTH); - - DWORD dwBirthdayDay = GET_CURRENT_COMBO_DATA(hWndDlg, IDC_BIRTHDAY_DAY); - if (dwBirthdayMonth) SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_DAY); - - DWORD dwCountryID = GET_CURRENT_COMBO_DATA(hWndDlg, IDC_COUNTRY); - if (dwCountryID) SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_COUNTRY_ID); - - - DWORD dwOnline = IsDlgButtonChecked(hWndDlg, IDC_ONLINEONLY); - if (dwOnline) SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_ONLINE); - - return (HWND)MraWPRequestW(NULL, ACKTYPE_SEARCH, dwRequestFlags, szUser, szDomain, wszNickName, wszFirstName, wszLastName, dwSex, dwDate1, dwDate2, dwCityID, dwZodiak, dwBirthdayMonth, dwBirthdayDay, dwCountryID, dwOnline); -} - -HWND CMraProto::CreateExtendedSearchUI(HWND owner) -{ - if (g_plugin.getInst() && owner) - return CreateDialogParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_MRAADVANCEDSEARCH), owner, AdvancedSearchDlgProc, (LPARAM)this); - - return nullptr; -} diff --git a/protocols/MRA/src/MraAvatars.cpp b/protocols/MRA/src/MraAvatars.cpp deleted file mode 100644 index 76257b46e9..0000000000 --- a/protocols/MRA/src/MraAvatars.cpp +++ /dev/null @@ -1,636 +0,0 @@ -#include "stdafx.h" -#include "MraAvatars.h" - -#define PA_FORMAT_MAX 7 - -struct MRA_AVATARS_QUEUE : public FIFO_MT -{ - HNETLIBUSER hNetlibUser; - HANDLE hThreadEvents[64]; - int iThreadsCount, iThreadsRunning; -}; - -struct MRA_AVATARS_QUEUE_ITEM : public FIFO_MT_ITEM -{ - DWORD dwAvatarsQueueID; - DWORD dwFlags; - MCONTACT hContact; -}; - -#define FILETIME_SECOND ((DWORDLONG)10000000) -#define FILETIME_MINUTE ((DWORDLONG)FILETIME_SECOND * 60) - - -char szAvtSectName[MAX_PATH]; -#define MRA_AVT_SECT_NAME szAvtSectName - -HNETLIBCONN MraAvatarsHttpConnect(HNETLIBUSER hNetlibUser, LPCSTR lpszHost, DWORD dwPort); - -#define MAHTRO_AVT 0 -#define MAHTRO_AVTMRIM 1 -#define MAHTRO_AVTSMALL 2 -#define MAHTRO_AVTSMALLMRIM 3 - -DWORD MraAvatarsHttpTransaction(HNETLIBCONN hConnection, DWORD dwRequestType, LPCSTR lpszUser, LPCSTR lpszDomain, LPCSTR lpszHost, DWORD dwReqObj, BOOL bUseKeepAliveConn, DWORD *pdwResultCode, BOOL *pbKeepAlive, DWORD *pdwFormat, size_t *pdwAvatarSize, INTERNET_TIME *pitLastModifiedTime); - -DWORD CMraProto::MraAvatarsQueueInitialize(HANDLE *phAvatarsQueueHandle) -{ - mir_snprintf(szAvtSectName, "%s Avatars", m_szModuleName); - - if (phAvatarsQueueHandle == nullptr) - return ERROR_INVALID_HANDLE; - - MRA_AVATARS_QUEUE *pmraaqAvatarsQueue = new MRA_AVATARS_QUEUE(); - - wchar_t szBuffer[MAX_PATH]; - mir_snwprintf(szBuffer, L"%s %s", m_tszUserName, TranslateT("Avatars' plugin connections")); - - NETLIBUSER nlu = {}; - nlu.flags = NUF_OUTGOING | NUF_HTTPCONNS | NUF_UNICODE; - nlu.szSettingsModule = MRA_AVT_SECT_NAME; - nlu.szDescriptiveName.w = szBuffer; - pmraaqAvatarsQueue->hNetlibUser = Netlib_RegisterUser(&nlu); - if (pmraaqAvatarsQueue->hNetlibUser) { - pmraaqAvatarsQueue->iThreadsCount = db_get_dw(0, MRA_AVT_SECT_NAME, "WorkThreadsCount", MRA_AVT_DEFAULT_WRK_THREAD_COUNTS); - if (pmraaqAvatarsQueue->iThreadsCount == 0) - pmraaqAvatarsQueue->iThreadsCount = 1; - if (pmraaqAvatarsQueue->iThreadsCount > 64) - pmraaqAvatarsQueue->iThreadsCount = 64; - - pmraaqAvatarsQueue->iThreadsRunning = 0; - for (int i = 0; i < pmraaqAvatarsQueue->iThreadsCount; i++) - ForkThread(&CMraProto::MraAvatarsThreadProc, pmraaqAvatarsQueue); - - *phAvatarsQueueHandle = (HANDLE)pmraaqAvatarsQueue; - } - return NO_ERROR; -} - -void CMraProto::MraAvatarsQueueClear(HANDLE hQueue) -{ - if (!hQueue) - return; - - MRA_AVATARS_QUEUE *pmraaqAvatarsQueue = (MRA_AVATARS_QUEUE*)hQueue; - MRA_AVATARS_QUEUE_ITEM *pmraaqiAvatarsQueueItem; - - PROTO_AVATAR_INFORMATION ai = { 0 }; - ai.format = PA_FORMAT_UNKNOWN; - - while (FifoMTItemPop(pmraaqAvatarsQueue, nullptr, (LPVOID*)&pmraaqiAvatarsQueueItem) == NO_ERROR) { - ai.hContact = pmraaqiAvatarsQueueItem->hContact; - ProtoBroadcastAck(pmraaqiAvatarsQueueItem->hContact, ACKTYPE_AVATAR, ACKRESULT_FAILED, (HANDLE)&ai, 0); - mir_free(pmraaqiAvatarsQueueItem); - } -} - -void CMraProto::MraAvatarsQueueSuspend(HANDLE hQueue) -{ - MRA_AVATARS_QUEUE *pmraaqAvatarsQueue = (MRA_AVATARS_QUEUE*)hQueue; - MraAvatarsQueueClear(hQueue); - for (int i = 0; i < pmraaqAvatarsQueue->iThreadsCount; i++) - SetEvent(pmraaqAvatarsQueue->hThreadEvents[i]); -} - -void CMraProto::MraAvatarsQueueDestroy(HANDLE hQueue) -{ - if (!hQueue) - return; - - MRA_AVATARS_QUEUE *pmraaqAvatarsQueue = (MRA_AVATARS_QUEUE*)hQueue; - Netlib_CloseHandle(pmraaqAvatarsQueue->hNetlibUser); - delete pmraaqAvatarsQueue; -} - -DWORD CMraProto::MraAvatarsQueueAdd(HANDLE hQueue, DWORD dwFlags, MCONTACT hContact, DWORD *pdwAvatarsQueueID) -{ - MRA_AVATARS_QUEUE *pmraaqAvatarsQueue = (MRA_AVATARS_QUEUE*)hQueue; - if (pmraaqAvatarsQueue == nullptr || Miranda_IsTerminated()) - return ERROR_INVALID_HANDLE; - - MRA_AVATARS_QUEUE_ITEM *pmraaqiAvatarsQueueItem = (MRA_AVATARS_QUEUE_ITEM*)mir_calloc(sizeof(MRA_AVATARS_QUEUE_ITEM)); - if (!pmraaqiAvatarsQueueItem) - return GetLastError(); - - pmraaqiAvatarsQueueItem->dwAvatarsQueueID = GetTickCount(); - pmraaqiAvatarsQueueItem->dwFlags = dwFlags; - pmraaqiAvatarsQueueItem->hContact = hContact; - - FifoMTItemPush(pmraaqAvatarsQueue, pmraaqiAvatarsQueueItem, (LPVOID)pmraaqiAvatarsQueueItem); - if (pdwAvatarsQueueID) - *pdwAvatarsQueueID = pmraaqiAvatarsQueueItem->dwAvatarsQueueID; - - mir_cslock(pmraaqAvatarsQueue->cs); - int threadno = (pmraaqAvatarsQueue->iThreadsRunning + 1) % pmraaqAvatarsQueue->iThreadsCount; - SetEvent(pmraaqAvatarsQueue->hThreadEvents[threadno]); - return NO_ERROR; -} - -void CMraProto::MraAvatarsThreadProc(LPVOID lpParameter) -{ - MRA_AVATARS_QUEUE *pmraaqAvatarsQueue = (MRA_AVATARS_QUEUE*)lpParameter; - MRA_AVATARS_QUEUE_ITEM *pmraaqiAvatarsQueueItem; - - CMStringA szEmail, szServer; - CMStringW wszFileName; - BOOL bContinue, bKeepAlive, bUseKeepAliveConn, bFailed, bDownloadNew; - BYTE btBuff[BUFF_SIZE_RCV]; - DWORD dwResultCode, dwAvatarFormat = PA_FORMAT_DEFAULT, dwReceived, dwServerPort, dwErrorCode; - size_t dwAvatarSizeServer; - FILETIME ftLastModifiedTimeServer, ftLastModifiedTimeLocal; - SYSTEMTIME stAvatarLastModifiedTimeLocal; - HNETLIBCONN hConnection = nullptr; - NETLIBSELECT nls = { 0 }; - INTERNET_TIME itAvatarLastModifiedTimeServer; - WCHAR szErrorText[2048]; - - Thread_SetName("MRA: AvatarsThreadProc"); - - HANDLE hThreadEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); - { - mir_cslock lck(pmraaqAvatarsQueue->cs); - pmraaqAvatarsQueue->hThreadEvents[pmraaqAvatarsQueue->iThreadsRunning++] = hThreadEvent; - } - - while (!Miranda_IsTerminated()) { - if (FifoMTItemPop(pmraaqAvatarsQueue, nullptr, (LPVOID*)&pmraaqiAvatarsQueueItem) != NO_ERROR) { // waiting until service stop or new task - NETLIB_CLOSEHANDLE(hConnection); - WaitForSingleObjectEx(hThreadEvent, INFINITE, FALSE); - continue; - } - - // Try download. - bFailed = TRUE; - bDownloadNew = FALSE; - - if (!DB_GetStringA(NULL, MRA_AVT_SECT_NAME, "Server", szServer)) - szServer = MRA_AVT_DEFAULT_SERVER; - dwServerPort = db_get_dw(0, MRA_AVT_SECT_NAME, "ServerPort", MRA_AVT_DEFAULT_SERVER_PORT); - bUseKeepAliveConn = db_get_b(0, MRA_AVT_SECT_NAME, "UseKeepAliveConn", MRA_AVT_DEFAULT_USE_KEEPALIVE_CONN); - - if (mraGetStringA(pmraaqiAvatarsQueueItem->hContact, "e-mail", szEmail)) { - szEmail.MakeLower(); - - int iStart = 0; - CMStringA szUser = szEmail.Tokenize("@", iStart); - CMStringA szDomain = szEmail.Tokenize("@", iStart); - if (!szUser.IsEmpty() && !szDomain.IsEmpty()) { - ProtoBroadcastAck(pmraaqiAvatarsQueueItem->hContact, ACKTYPE_AVATAR, ACKRESULT_CONNECTING, nullptr, 0); - if (hConnection == nullptr) - hConnection = MraAvatarsHttpConnect(pmraaqAvatarsQueue->hNetlibUser, szServer, dwServerPort); - if (hConnection) { - ProtoBroadcastAck(pmraaqiAvatarsQueueItem->hContact, ACKTYPE_AVATAR, ACKRESULT_CONNECTED, nullptr, 0); - ProtoBroadcastAck(pmraaqiAvatarsQueueItem->hContact, ACKTYPE_AVATAR, ACKRESULT_SENTREQUEST, nullptr, 0); - if (!MraAvatarsHttpTransaction(hConnection, REQUEST_HEAD, szUser, szDomain, szServer, MAHTRO_AVTMRIM, bUseKeepAliveConn, &dwResultCode, &bKeepAlive, &dwAvatarFormat, &dwAvatarSizeServer, &itAvatarLastModifiedTimeServer)) { - 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(pmraaqiAvatarsQueueItem->hContact, ACKTYPE_AVATAR, ACKRESULT_STATUS, 0, 0); - } - else {// avatar is valid - if (MraAvatarsGetFileName(pmraaqAvatarsQueue, pmraaqiAvatarsQueueItem->hContact, dwAvatarFormat, wszFileName) == NO_ERROR) { - if (IsFileExist(wszFileName)) - bFailed = FALSE; - else - bDownloadNew = TRUE; - } - } - } - else // need update - bDownloadNew = TRUE; - - break; - case 404:// return def avatar - if (MraAvatarsGetFileName((HANDLE)pmraaqAvatarsQueue, NULL, PA_FORMAT_DEFAULT, wszFileName) == NO_ERROR) { - if (IsFileExist(wszFileName)) { - dwAvatarFormat = ProtoGetAvatarFormat(wszFileName); - bFailed = FALSE; - } - else//loading default avatar - bDownloadNew = TRUE; - } - break; - - default: - mir_snwprintf(szErrorText, TranslateT("Avatars: server return HTTP code: %lu"), dwResultCode); - ShowFormattedErrorMessage(szErrorText, NO_ERROR); - break; - } - } - if (bUseKeepAliveConn == FALSE || bKeepAlive == FALSE) NETLIB_CLOSEHANDLE(hConnection); - } - - if (bDownloadNew) { - if (hConnection == nullptr) - hConnection = MraAvatarsHttpConnect(pmraaqAvatarsQueue->hNetlibUser, szServer, dwServerPort); - - if (hConnection) { - ProtoBroadcastAck(pmraaqiAvatarsQueueItem->hContact, ACKTYPE_AVATAR, ACKRESULT_DATA, nullptr, 0); - if (MraAvatarsHttpTransaction(hConnection, REQUEST_GET, szUser, szDomain, szServer, MAHTRO_AVT, bUseKeepAliveConn, &dwResultCode, &bKeepAlive, &dwAvatarFormat, &dwAvatarSizeServer, &itAvatarLastModifiedTimeServer) == NO_ERROR && dwResultCode == 200) { - if (!MraAvatarsGetFileName(pmraaqAvatarsQueue, pmraaqiAvatarsQueueItem->hContact, dwAvatarFormat, wszFileName)) { - HANDLE hFile = CreateFile(wszFileName, GENERIC_WRITE, FILE_SHARE_READ, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); - if (hFile != INVALID_HANDLE_VALUE) { - DWORD dwWritten = 0; - bContinue = TRUE; - nls.dwTimeout = (1000 * db_get_dw(0, MRA_AVT_SECT_NAME, "TimeOutReceive", MRA_AVT_DEFAULT_TIMEOUT_RECV)); - nls.hReadConns[0] = hConnection; - - while (bContinue) { - switch (Netlib_Select(&nls)) { - case SOCKET_ERROR: - case 0:// Time out - dwErrorCode = GetLastError(); - ShowFormattedErrorMessage(L"Avatars: error on receive file data", dwErrorCode); - bContinue = FALSE; - break; - case 1: - dwReceived = Netlib_Recv(hConnection, (LPSTR)&btBuff, _countof(btBuff), 0); - if (dwReceived == 0 || dwReceived == SOCKET_ERROR) { - dwErrorCode = GetLastError(); - ShowFormattedErrorMessage(L"Avatars: error on receive file data", dwErrorCode); - bContinue = FALSE; - } - else { - if (WriteFile(hFile, (LPVOID)&btBuff, dwReceived, &dwReceived, nullptr)) { - dwWritten += dwReceived; - if (dwWritten >= dwAvatarSizeServer) - bContinue = FALSE; - } - else { - dwErrorCode = GetLastError(); - ShowFormattedErrorMessage(L"Avatars: cant write file data, error", dwErrorCode); - bContinue = FALSE; - } - } - break; - } - } - CloseHandle(hFile); - bFailed = FALSE; - } - else { - dwErrorCode = GetLastError(); - mir_snwprintf(szErrorText, TranslateT("Avatars: can't open file %s, error"), wszFileName.c_str()); - ShowFormattedErrorMessage(szErrorText, dwErrorCode); - } - } - } - else _CrtDbgBreak(); - - if (bUseKeepAliveConn == FALSE || bKeepAlive == FALSE) - NETLIB_CLOSEHANDLE(hConnection); - } - } - } - } - - PROTO_AVATAR_INFORMATION ai; - if (bFailed) { - DeleteFile(wszFileName); - ai.hContact = pmraaqiAvatarsQueueItem->hContact; - ai.format = PA_FORMAT_UNKNOWN; - ai.filename[0] = 0; - ProtoBroadcastAck(pmraaqiAvatarsQueueItem->hContact, ACKTYPE_AVATAR, ACKRESULT_FAILED, (HANDLE)&ai, 0); - } - else { - ai.hContact = pmraaqiAvatarsQueueItem->hContact; - ai.format = dwAvatarFormat; - if (db_get_b(0, MRA_AVT_SECT_NAME, "ReturnAbsolutePath", MRA_AVT_DEFAULT_RET_ABC_PATH)) - wcsncpy_s(ai.filename, wszFileName, _TRUNCATE); - else - PathToRelativeW(wszFileName, ai.filename); - - SetContactAvatarFormat(pmraaqiAvatarsQueueItem->hContact, dwAvatarFormat); - MraAvatarsSetContactTime(pmraaqiAvatarsQueueItem->hContact, "AvatarLastModifiedTime", &itAvatarLastModifiedTimeServer.stTime); - // write owner avatar file name to DB - if (pmraaqiAvatarsQueueItem->hContact == NULL) // proto avatar - CallService(MS_AV_REPORTMYAVATARCHANGED, (WPARAM)m_szModuleName, 0); - - ProtoBroadcastAck(pmraaqiAvatarsQueueItem->hContact, ACKTYPE_AVATAR, ACKRESULT_SUCCESS, (HANDLE)&ai, 0); - } - mir_free(pmraaqiAvatarsQueueItem); - } - CloseHandle(hThreadEvent); -} - -HNETLIBCONN MraAvatarsHttpConnect(HNETLIBUSER hNetlibUser, LPCSTR lpszHost, DWORD dwPort) -{ - NETLIBOPENCONNECTION nloc = { 0 }; - nloc.cbSize = sizeof(nloc); - nloc.flags = (NLOCF_HTTP | NLOCF_V2); - nloc.szHost = lpszHost; - nloc.wPort = (IsHTTPSProxyUsed(hNetlibUser)) ? MRA_SERVER_PORT_HTTPS : dwPort; - nloc.timeout = db_get_dw(0, MRA_AVT_SECT_NAME, "TimeOutConnect", MRA_AVT_DEFAULT_TIMEOUT_CONN); - if (nloc.timeout < MRA_TIMEOUT_CONN_MIN) nloc.timeout = MRA_TIMEOUT_CONN_MIN; - if (nloc.timeout > MRA_TIMEOUT_CONN_MAX) nloc.timeout = MRA_TIMEOUT_CONN_MAX; - - DWORD dwConnectReTryCount = db_get_dw(0, MRA_AVT_SECT_NAME, "ConnectReTryCount", MRA_AVT_DEFAULT_CONN_RETRY_COUNT); - DWORD dwCurConnectReTryCount = dwConnectReTryCount; - HNETLIBCONN hConnection; - do { - hConnection = Netlib_OpenConnection(hNetlibUser, &nloc); - } - while (--dwCurConnectReTryCount && hConnection == nullptr); - - return hConnection; -} - -DWORD MraAvatarsHttpTransaction(HNETLIBCONN hConnection, DWORD dwRequestType, LPCSTR lpszUser, LPCSTR lpszDomain, LPCSTR lpszHost, DWORD dwReqObj, BOOL bUseKeepAliveConn, DWORD *pdwResultCode, BOOL *pbKeepAlive, DWORD *pdwFormat, size_t *pdwAvatarSize, INTERNET_TIME *pitLastModifiedTime) -{ - 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) - return ERROR_INVALID_HANDLE; - - LPSTR lpszReqObj; - - 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; - } - - char szBuff[4096]; - mir_snprintf(szBuff, "http://%s/%s/%s/%s", lpszHost, lpszDomain, lpszUser, lpszReqObj); - CMStringA szSelfVersionString = MraGetSelfVersionString(); - - NETLIBHTTPHEADER nlbhHeaders[8] = {}; - nlbhHeaders[0].szName = "User-Agent"; nlbhHeaders[0].szValue = (LPSTR)szSelfVersionString.c_str(); - 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"; - - NETLIBHTTPREQUEST nlhr = { 0 }; - nlhr.cbSize = sizeof(nlhr); - nlhr.requestType = dwRequestType; - nlhr.szUrl = szBuff; - nlhr.headers = (NETLIBHTTPHEADER*)&nlbhHeaders; - nlhr.headersCount = 4; - - DWORD dwSent = Netlib_SendHttpRequest(hConnection, &nlhr); - if (dwSent == SOCKET_ERROR || !dwSent) - return GetLastError(); - - NETLIBHTTPREQUEST *pnlhr = Netlib_RecvHttpHeaders(hConnection); - if (!pnlhr) - return GetLastError(); - - for (int i = 0; i < pnlhr->headersCount; i++) { - if (!_strnicmp(pnlhr->headers[i].szName, "Connection", 10)) { - if (pbKeepAlive) - *pbKeepAlive = !_strnicmp(pnlhr->headers[i].szValue, "keep-alive", 10); - } - else if (!_strnicmp(pnlhr->headers[i].szName, "Content-Type", 12)) { - if (pdwFormat) - *pdwFormat = ProtoGetAvatarFormatByMimeType(_A2T(pnlhr->headers[i].szValue)); - } - else if (!_strnicmp(pnlhr->headers[i].szName, "Content-Length", 14)) { - if (pdwAvatarSize) - *pdwAvatarSize = atol(pnlhr->headers[i].szValue); - } - else if (!_strnicmp(pnlhr->headers[i].szName, "Last-Modified", 13)) { - if (pitLastModifiedTime) - InternetTimeGetTime(pnlhr->headers[i].szValue, *pitLastModifiedTime); - } - } - - if (pdwResultCode) - *pdwResultCode = pnlhr->resultCode; - Netlib_FreeHttpRequest(pnlhr); - return 0; -} - -bool CMraProto::MraAvatarsGetContactTime(MCONTACT hContact, LPSTR lpszValueName, SYSTEMTIME *pstTime) -{ - INTERNET_TIME itAvatarLastModifiedTimeLocal; - CMStringA szBuff; - - if (nullptr == lpszValueName || - nullptr == pstTime) - return false; - if (false == mraGetStringA(hContact, lpszValueName, szBuff)) - return false; - if (InternetTimeGetTime(szBuff, itAvatarLastModifiedTimeLocal) != NO_ERROR) - return false; - memcpy(pstTime, &itAvatarLastModifiedTimeLocal.stTime, sizeof(SYSTEMTIME)); - return true; -} - -void CMraProto::MraAvatarsSetContactTime(MCONTACT hContact, LPSTR lpszValueName, SYSTEMTIME *pstTime) -{ - if (!lpszValueName) - return; - - INTERNET_TIME itTime; - if (pstTime) { - itTime.lTimeZone = 0; - memcpy(&itTime.stTime, pstTime, sizeof(SYSTEMTIME)); - } - else InternetTimeGetCurrentTime(&itTime); - - if (itTime.stTime.wYear) - mraSetStringExA(hContact, lpszValueName, InternetTimeGetString(&itTime)); - else - delSetting(hContact, lpszValueName); -} - -DWORD CMraProto::MraAvatarsGetFileName(HANDLE hQueue, MCONTACT hContact, DWORD dwFormat, CMStringW &res) -{ - res.Empty(); - if (hQueue == nullptr) - return ERROR_INVALID_HANDLE; - - if (IsContactChatAgent(hContact)) - return ERROR_NOT_SUPPORTED; - - wchar_t tszBase[MAX_PATH]; - mir_snwprintf(tszBase, L"%s\\%s\\", VARSW(L"%miranda_avatarcache%"), m_tszUserName); - res = tszBase; - - // some path in buff and free space for file name is avaible - CreateDirectoryTreeW(res); - - if (dwFormat != PA_FORMAT_DEFAULT) { - CMStringW szEmail; - if (mraGetStringW(hContact, "e-mail", szEmail)) { - szEmail.MakeLower(); - res += szEmail + ProtoGetAvatarExtension(dwFormat); - return NO_ERROR; - } - } - else { - CMStringW szDefName; - if (!DB_GetStringW(NULL, MRA_AVT_SECT_NAME, "DefaultAvatarFileName", szDefName)) { - res += MRA_AVT_DEFAULT_AVT_FILENAME; - return NO_ERROR; - } - } - - return ERROR_INSUFFICIENT_BUFFER; -} - -DWORD CMraProto::MraAvatarsQueueGetAvatar(HANDLE hQueue, DWORD dwFlags, MCONTACT hContact, DWORD *pdwAvatarsQueueID, DWORD *pdwFormat, LPTSTR lpszPath) -{ - DWORD dwRetCode = GAIR_NOAVATAR; - - if ( !hQueue) - return GAIR_NOAVATAR; - if ( !db_get_b(0, MRA_AVT_SECT_NAME, "Enable", MRA_AVT_DEFAULT_ENABLE)) - return GAIR_NOAVATAR; - if (IsContactChatAgent(hContact)) // @chat.agent conference - return GAIR_NOAVATAR; - - BOOL bQueueAdd = TRUE;// check for updates - SYSTEMTIME stAvatarLastCheckTime; - - if ((dwFlags & GAIF_FORCE) == 0)// если флаг принудит. обновления, то даже не проверяем времени последнего обновления - if (MraAvatarsGetContactTime(hContact, "AvatarLastCheckTime", &stAvatarLastCheckTime)) { - CMStringW wszFileName; - FILETIME ftCurrentTime, ftExpireTime; - - GetSystemTimeAsFileTime(&ftCurrentTime); - SystemTimeToFileTime(&stAvatarLastCheckTime, &ftExpireTime); - (*((DWORDLONG*)&ftExpireTime)) += (FILETIME_MINUTE*(DWORDLONG)db_get_dw(0, MRA_AVT_SECT_NAME, "CheckInterval", MRA_AVT_DEFAULT_CHK_INTERVAL)); - - if ((*((DWORDLONG*)&ftExpireTime)) > (*((DWORDLONG*)&ftCurrentTime))) - if (MraAvatarsGetFileName(hQueue, hContact, GetContactAvatarFormat(hContact, PA_FORMAT_DEFAULT), wszFileName) == NO_ERROR) - if (IsFileExist(wszFileName)) { - // файл с аватаром существует и не устарел/не было комманды обновлять(просто запрос имени) - if (lpszPath) { - if (db_get_b(0, MRA_AVT_SECT_NAME, "ReturnAbsolutePath", MRA_AVT_DEFAULT_RET_ABC_PATH)) - mir_wstrncpy(lpszPath, wszFileName, MAX_PATH); - else - PathToRelativeW(wszFileName, lpszPath); - } - if (pdwFormat) - *pdwFormat = ProtoGetAvatarFormat(lpszPath); - dwRetCode = GAIR_SUCCESS; - bQueueAdd = FALSE; - } - } - - if (bQueueAdd || (dwFlags & GAIF_FORCE)) - if (!MraAvatarsQueueAdd(hQueue, dwFlags, hContact, pdwAvatarsQueueID)) { - MraAvatarsSetContactTime(hContact, "AvatarLastCheckTime", nullptr); - dwRetCode = GAIR_WAITFOR; - } - return dwRetCode; -} - -DWORD CMraProto::MraAvatarsQueueGetAvatarSimple(HANDLE hQueue, DWORD dwFlags, MCONTACT hContact) -{ - if ( !hQueue) - return GAIR_NOAVATAR; - - PROTO_AVATAR_INFORMATION ai = { 0 }; - ai.hContact = hContact; - DWORD dwRetCode = MraAvatarsQueueGetAvatar(hQueue, dwFlags, hContact, nullptr, (DWORD*)&ai.format, ai.filename); - if (dwRetCode != GAIR_SUCCESS) - return dwRetCode; - - // write owner avatar file name to DB - if (hContact == NULL) - CallService(MS_AV_REPORTMYAVATARCHANGED, (WPARAM)m_szModuleName, 0); - ProtoBroadcastAck(hContact, ACKTYPE_AVATAR, ACKRESULT_SUCCESS, (HANDLE)&ai, 0); - return GAIR_SUCCESS; -} - -///////////////////////////////////////////////////////////////////////////////////////// -// Avatars options - -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) -{ - CMraProto *ppro = (CMraProto*)GetWindowLongPtr(hWndDlg, GWLP_USERDATA); - - switch (msg) { - case WM_INITDIALOG: - TranslateDialogDefault(hWndDlg); - SetWindowLongPtr(hWndDlg, GWLP_USERDATA, lParam); - ppro = (CMraProto*)lParam; - { - CheckDlgButton(hWndDlg, IDC_ENABLE, db_get_b(0, MRA_AVT_SECT_NAME, "Enable", MRA_AVT_DEFAULT_ENABLE) ? BST_CHECKED : BST_UNCHECKED); - - CMStringW szServer; - if (DB_GetStringW(NULL, MRA_AVT_SECT_NAME, "Server", szServer)) - SetDlgItemText(hWndDlg, IDC_SERVER, szServer.c_str()); - else - SetDlgItemTextA(hWndDlg, IDC_SERVER, MRA_AVT_DEFAULT_SERVER); - - SetDlgItemInt(hWndDlg, IDC_SERVERPORT, db_get_dw(0, MRA_AVT_SECT_NAME, "ServerPort", MRA_AVT_DEFAULT_SERVER_PORT), FALSE); - CheckDlgButton(hWndDlg, IDC_USE_KEEPALIVE_CONN, db_get_b(0, MRA_AVT_SECT_NAME, "UseKeepAliveConn", MRA_AVT_DEFAULT_USE_KEEPALIVE_CONN) ? BST_CHECKED : BST_UNCHECKED); - SetDlgItemInt(hWndDlg, IDC_UPD_CHECK_INTERVAL, db_get_dw(0, MRA_AVT_SECT_NAME, "CheckInterval", MRA_AVT_DEFAULT_CHK_INTERVAL), FALSE); - CheckDlgButton(hWndDlg, IDC_RETURN_ABC_PATH, db_get_b(0, MRA_AVT_SECT_NAME, "ReturnAbsolutePath", MRA_AVT_DEFAULT_RET_ABC_PATH) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hWndDlg, IDC_DELETE_AVT_ON_CONTACT_DELETE, db_get_b(0, MRA_AVT_SECT_NAME, "DeleteAvtOnContactDelete", MRA_DELETE_AVT_ON_CONTACT_DELETE) ? BST_CHECKED : BST_UNCHECKED); - - EnableControlsArray(hWndDlg, (WORD*)&wMraAvatarsControlsList, _countof(wMraAvatarsControlsList), IsDlgButtonChecked(hWndDlg, IDC_ENABLE)); - } - return TRUE; - - case WM_COMMAND: - if (LOWORD(wParam) == IDC_ENABLE) - EnableControlsArray(hWndDlg, (WORD*)&wMraAvatarsControlsList, _countof(wMraAvatarsControlsList), IsDlgButtonChecked(hWndDlg, IDC_ENABLE)); - - if (LOWORD(wParam) == IDC_BUTTON_DEFAULT) { - SetDlgItemTextA(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: - db_set_b(0, MRA_AVT_SECT_NAME, "Enable", IsDlgButtonChecked(hWndDlg, IDC_ENABLE)); - db_set_b(0, MRA_AVT_SECT_NAME, "DeleteAvtOnContactDelete", IsDlgButtonChecked(hWndDlg, IDC_DELETE_AVT_ON_CONTACT_DELETE)); - db_set_b(0, MRA_AVT_SECT_NAME, "ReturnAbsolutePath", IsDlgButtonChecked(hWndDlg, IDC_RETURN_ABC_PATH)); - db_set_dw(0, MRA_AVT_SECT_NAME, "CheckInterval", GetDlgItemInt(hWndDlg, IDC_UPD_CHECK_INTERVAL, nullptr, FALSE)); - db_set_b(0, MRA_AVT_SECT_NAME, "UseKeepAliveConn", IsDlgButtonChecked(hWndDlg, IDC_USE_KEEPALIVE_CONN)); - db_set_dw(0, MRA_AVT_SECT_NAME, "ServerPort", GetDlgItemInt(hWndDlg, IDC_SERVERPORT, nullptr, FALSE)); - - wchar_t szServer[MAX_PATH]; - GetDlgItemText(hWndDlg, IDC_SERVER, szServer, _countof(szServer)); - db_set_ws(0, MRA_AVT_SECT_NAME, "Server", szServer); - return TRUE; - } - break; - } - return FALSE; -} - - -DWORD CMraProto::MraAvatarsDeleteContactAvatarFile(HANDLE hQueue, MCONTACT hContact) -{ - if (hQueue == nullptr) - return ERROR_INVALID_HANDLE; - - DWORD dwAvatarFormat = GetContactAvatarFormat(hContact, PA_FORMAT_UNKNOWN); - if (db_get_b(0, MRA_AVT_SECT_NAME, "DeleteAvtOnContactDelete", MRA_DELETE_AVT_ON_CONTACT_DELETE) && dwAvatarFormat != PA_FORMAT_DEFAULT) { - CMStringW szFileName; - if (!MraAvatarsGetFileName(hQueue, hContact, dwAvatarFormat, szFileName)) - return DeleteFile(szFileName); - } - return NO_ERROR; -} diff --git a/protocols/MRA/src/MraAvatars.h b/protocols/MRA/src/MraAvatars.h deleted file mode 100644 index 2e65e9a026..0000000000 --- a/protocols/MRA/src/MraAvatars.h +++ /dev/null @@ -1,14 +0,0 @@ -#if !defined(AFX_MRA_AVATARS_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) -#define AFX_MRA_AVATARS_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ - - -#pragma once - -#define PA_FORMAT_DEFAULT 255 // return file name of def avatar -#define GetContactAvatarFormat(hContact, dwDefaultFormat) getByte(hContact, "AvatarType", dwDefaultFormat) -#define SetContactAvatarFormat(hContact, dwFormat) setByte(hContact, "AvatarType", (BYTE)dwFormat) - -INT_PTR CALLBACK MraAvatarsQueueDlgProcOpts(HWND hWndDlg, UINT msg, WPARAM wParam, LPARAM lParam); - - -#endif // !defined(AFX_MRA_AVATARS_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/protocols/MRA/src/MraChat.cpp b/protocols/MRA/src/MraChat.cpp deleted file mode 100644 index 938441ee00..0000000000 --- a/protocols/MRA/src/MraChat.cpp +++ /dev/null @@ -1,221 +0,0 @@ -#include "stdafx.h" -#include "proto.h" - -static LPWSTR lpwszStatuses[] = { LPGENW("Owners"), LPGENW("Inviter"), LPGENW("Visitors") }; -#define MRA_CHAT_STATUS_OWNER 0 -#define MRA_CHAT_STATUS_INVITER 1 -#define MRA_CHAT_STATUS_VISITOR 2 - - -bool CMraProto::MraChatRegister() -{ - GCREGISTER gcr = {}; - gcr.iMaxText = MRA_MAXLENOFMESSAGE; - gcr.ptszDispName = m_tszUserName; - gcr.pszModule = m_szModuleName; - Chat_Register(&gcr); - - HookProtoEvent(ME_GC_EVENT, &CMraProto::MraChatGcEventHook); - return TRUE; -} - -INT_PTR CMraProto::MraChatSessionNew(MCONTACT hContact) -{ - if (bChatExists) - if (!hContact) - return 1; - - CMStringW wszEMail; - mraGetStringW(hContact, "e-mail", wszEMail); - - SESSION_INFO *si = Chat_NewSession(GCW_CHATROOM, m_szModuleName, wszEMail, Clist_GetContactDisplayName(hContact), (void*)hContact); - if (si == nullptr) - return 1; - - for (auto &it : lpwszStatuses) - Chat_AddGroup(si, TranslateW(it)); - - Chat_Control(m_szModuleName, wszEMail, SESSION_INITDONE); - Chat_Control(m_szModuleName, wszEMail, SESSION_ONLINE); - - DWORD opcode = MULTICHAT_GET_MEMBERS; - CMStringA szEmail; - if (mraGetStringA(hContact, "e-mail", szEmail)) - MraMessage(FALSE, NULL, 0, MESSAGE_FLAG_MULTICHAT, szEmail, L"", (LPBYTE)&opcode, sizeof(opcode)); - return 0; -} - -void CMraProto::MraChatSessionDestroy(MCONTACT hContact) -{ - if (!bChatExists || hContact == NULL) - return; - - CMStringW wszEMail; - mraGetStringW(hContact, "e-mail", wszEMail); - - Chat_Terminate(m_szModuleName, wszEMail); - Chat_Control(m_szModuleName, wszEMail, WINDOW_CLEARLOG); -} - -INT_PTR CMraProto::MraChatSessionEventSendByHandle(MCONTACT hContactChatSession, int iType, DWORD dwFlags, const CMStringA &lpszUID, LPCWSTR lpwszStatus, LPCWSTR lpwszMessage, DWORD_PTR dwItemData, DWORD dwTime) -{ - if (!bChatExists) - return 1; - - CMStringW wszID, wszUID, wszNick; - - GCEVENT gce = { m_szModuleName, nullptr, iType }; - if (hContactChatSession) { - mraGetStringW(hContactChatSession, "e-mail", wszID); - gce.ptszID = wszID.c_str(); - } - - gce.dwFlags = dwFlags; - gce.ptszUID = wszUID; - gce.ptszStatus = lpwszStatus; - gce.ptszText = lpwszMessage; - gce.dwItemData = dwItemData; - gce.time = dwTime; - - if (!lpszUID.IsEmpty()) - gce.bIsMe = IsEMailMy(lpszUID); - else - gce.bIsMe = TRUE; - - if (gce.bIsMe) { - mraGetStringW(NULL, "e-mail", wszUID); - mraGetStringW(NULL, "Nick", wszNick); - gce.ptszNick = wszNick; - } - else { - MCONTACT hContactSender = MraHContactFromEmail(lpszUID, FALSE, TRUE, nullptr); - wszUID = lpszUID; - if (hContactSender) - gce.ptszNick = Clist_GetContactDisplayName(hContactSender); - else - gce.ptszNick = wszUID; - } - - return Chat_Event(&gce); -} - -INT_PTR CMraProto::MraChatSessionInvite(MCONTACT hContactChatSession, const CMStringA &lpszEMailInMultiChat, DWORD dwTime) -{ - if (!hContactChatSession) - return 1; - - CMStringW wszBuff; - wszBuff.Format(L"[%s]: %s", _A2T(lpszEMailInMultiChat.c_str()), TranslateT("invite sender")); - return MraChatSessionEventSendByHandle(hContactChatSession, GC_EVENT_ACTION, GCEF_ADDTOLOG, lpszEMailInMultiChat, nullptr, wszBuff, 0, dwTime); -} - -INT_PTR CMraProto::MraChatSessionMembersAdd(MCONTACT hContactChatSession, const CMStringA &lpszEMailInMultiChat, DWORD dwTime) -{ - if (!hContactChatSession) - return 1; - - CMStringW wszBuff; - wszBuff.Format(L"[%s]: %s", _A2T(lpszEMailInMultiChat), TranslateT("invite new members")); - return MraChatSessionEventSendByHandle(hContactChatSession, GC_EVENT_ACTION, GCEF_ADDTOLOG, lpszEMailInMultiChat, nullptr, wszBuff, 0, dwTime); -} - -INT_PTR CMraProto::MraChatSessionJoinUser(MCONTACT hContactChatSession, const CMStringA &lpszEMailInMultiChat, DWORD dwTime) -{ - if (hContactChatSession) - return MraChatSessionEventSendByHandle(hContactChatSession, GC_EVENT_JOIN, GCEF_ADDTOLOG, lpszEMailInMultiChat, lpwszStatuses[MRA_CHAT_STATUS_VISITOR], L"", 0, dwTime); - - return 1; -} - -INT_PTR CMraProto::MraChatSessionLeftUser(MCONTACT hContactChatSession, const CMStringA &lpszEMailInMultiChat, DWORD dwTime) -{ - if (hContactChatSession) - return MraChatSessionEventSendByHandle(hContactChatSession, GC_EVENT_PART, GCEF_ADDTOLOG, lpszEMailInMultiChat, nullptr, nullptr, 0, dwTime); - - return 1; -} - -INT_PTR CMraProto::MraChatSessionSetIviter(MCONTACT hContactChatSession, const CMStringA &lpszEMailInMultiChat) -{ - if (hContactChatSession && !lpszEMailInMultiChat.IsEmpty()) - return MraChatSessionEventSendByHandle(hContactChatSession, GC_EVENT_ADDSTATUS, 0, lpszEMailInMultiChat, lpwszStatuses[MRA_CHAT_STATUS_INVITER], nullptr, 0, 0); - - return 1; -} - -INT_PTR CMraProto::MraChatSessionSetOwner(MCONTACT hContactChatSession, const CMStringA &lpszEMailInMultiChat) -{ - if (hContactChatSession && !lpszEMailInMultiChat.IsEmpty()) - return MraChatSessionEventSendByHandle(hContactChatSession, GC_EVENT_ADDSTATUS, 0, lpszEMailInMultiChat, lpwszStatuses[MRA_CHAT_STATUS_OWNER], nullptr, 0, 0); - - return 1; -} - - -INT_PTR CMraProto::MraChatSessionMessageAdd(MCONTACT hContactChatSession, const CMStringA &lpszEMailInMultiChat, const CMStringW &lpwszMessage, DWORD dwTime) -{ - if (hContactChatSession) - return MraChatSessionEventSendByHandle(hContactChatSession, GC_EVENT_MESSAGE, GCEF_ADDTOLOG, lpszEMailInMultiChat, nullptr, lpwszMessage, 0, dwTime); - - return 1; -} - -int CMraProto::MraChatGcEventHook(WPARAM, LPARAM lParam) -{ - if (lParam) - if (bChatExists) { - GCHOOK* gch = (GCHOOK*)lParam; - - if (!_stricmp(gch->pszModule, m_szModuleName)) { - switch (gch->iType) { - case GC_USER_MESSAGE: - if (gch->ptszText && mir_wstrlen(gch->ptszText)) { - CMStringA szEmail = gch->ptszID; - MCONTACT hContact = MraHContactFromEmail(szEmail, FALSE, TRUE, nullptr); - BOOL bSlowSend = getByte("SlowSend", MRA_DEFAULT_SLOW_SEND); - - DWORD dwFlags = 0; - if (getByte("RTFSendEnable", MRA_DEFAULT_RTF_SEND_ENABLE) && (MraContactCapabilitiesGet(hContact)&FEATURE_FLAG_RTF_MESSAGE)) - dwFlags |= MESSAGE_FLAG_RTF; - - INT_PTR iSendRet = MraMessage(bSlowSend, hContact, ACKTYPE_MESSAGE, dwFlags, szEmail, gch->ptszText, nullptr, 0); - if (bSlowSend == FALSE) - ProtoBroadcastAck(hContact, ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, (HANDLE)iSendRet, 0); - - MraChatSessionEventSendByHandle(hContact, GC_EVENT_MESSAGE, GCEF_ADDTOLOG, "", nullptr, gch->ptszText, 0, (DWORD)_time32(nullptr)); - } - break; - - case GC_USER_PRIVMESS: - MraChatSendPrivateMessage(_T2A(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( L"get", iqId, item->jid ) << XQUERY( xmlnsOwner )); - break; - } - } - } - return 0; -} - -void CMraProto::MraChatSendPrivateMessage(LPSTR lpszEMail) -{ - BOOL bAdded; - MCONTACT hContact = MraHContactFromEmail(lpszEMail, TRUE, TRUE, &bAdded); - if (bAdded) - db_set_b(hContact, "CList", "Hidden", 1); - - CallService(MS_IGNORE_UNIGNORE, hContact, IGNOREEVENT_ALL); - CallService(MS_MSG_SENDMESSAGE, hContact, 0); -} diff --git a/protocols/MRA/src/MraConstans.h b/protocols/MRA/src/MraConstans.h deleted file mode 100644 index f46f67fe0d..0000000000 --- a/protocols/MRA/src/MraConstans.h +++ /dev/null @@ -1,243 +0,0 @@ -#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" - -#pragma once - -#define PROTOCOL_DISPLAY_NAME_ORIGA "Mail.ru Agent" - -#define MIRVER_UNKNOWN ("Mail.ru Agent unknown client") - -#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 (64 * 1024) //internal -#define BUFF_SIZE_RCV_MIN_FREE (16 * 1024) //internal -#define BUFF_SIZE_BLOB 16384 //internal -#define BUFF_SIZE_URL 4096 //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 LPGENW("Your contact wakes you") - -#define MRA_GOTO_INBOX "/GotoInbox" -#define MRA_GOTO_INBOX_STR LPGEN("Display &Inbox") -#define MRA_SHOW_INBOX_STATUS "/ShowInboxStatus" -#define MRA_SHOW_INBOX_STATUS_STR LPGEN("Display &Inbox status") -#define MRA_EDIT_PROFILE "/EditProfile" -#define MRA_EDIT_PROFILE_STR LPGEN("Edit &Profile") -#define MRA_MY_ALBUM_STR LPGEN("My Album") -#define MRA_MY_BLOGSTATUS_STR LPGEN("My Blog Status") -#define MRA_MY_VIDEO_STR LPGEN("My Video") -#define MRA_MY_ANSWERS_STR LPGEN("My Answers") -#define MRA_MY_WORLD_STR LPGEN("My World") -#define MRA_WEB_SEARCH "/WebSearch" -#define MRA_WEB_SEARCH_STR LPGEN("Web search") -#define MRA_UPD_ALL_USERS_INFO "/UpdateAllUsersInfo" -#define MRA_UPD_ALL_USERS_INFO_STR LPGEN("Update all users info") -#define MRA_CHK_USERS_AVATARS "/CheckUpdatesUsersAvatars" -#define MRA_CHK_USERS_AVATARS_STR LPGEN("Check users avatars updates") -#define MRA_REQ_AUTH_FOR_ALL "/ReqAuthForAll" -#define MRA_REQ_AUTH_FOR_ALL_STR LPGEN("Request authorization for all") - -//#define MRA_MPOP_AUTH_URL "http://swa.mail.ru/cgi-bin/auth?Login=%s&agent=%s&page=%s" -#define MRA_MPOP_AUTH_URL "https://auth.mail.ru/cgi-bin/auth?Login=%s&agent=%s&noredirecttologin=1&page=%s" - -#define MRA_WIN_INBOX_URL "https://win.mail.ru/cgi-bin/start" -#define MRA_PDA_INBOX_URL "http://pda.mail.ru/cgi-bin/start" -#define MRA_EDIT_PROFILE_URL "https://win.mail.ru/cgi-bin/userinfo?mra=1" -#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 "https://win.mail.ru/cgi-bin/signup" -#define MRA_FORGOT_PASSWORD_URL "https://win.mail.ru/cgi-bin/passremind" - - -// wParam = hContact -#define MRA_REQ_AUTH "/ReqAuth" -#define MRA_REQ_AUTH_STR LPGEN("Request authorization") -#define MRA_GRANT_AUTH "/GrantAuth" -#define MRA_GRANT_AUTH_STR LPGEN("Grant authorization") -#define MRA_SEND_EMAIL "/SendEMail" -#define MRA_SEND_EMAIL_STR LPGEN("&Send E-Mail") -#define MRA_SEND_POSTCARD "/SendPostcard" -#define MRA_SEND_POSTCARD_STR LPGEN("&Send postcard") -#define MRA_VIEW_ALBUM "/ViewAlbum" -#define MRA_VIEW_ALBUM_STR LPGEN("&View Album") -#define MRA_REPLY_BLOG_STATUS "/ReplyBlogStatus" -#define MRA_REPLY_BLOG_STATUS_STR LPGEN("Reply Blog Status") -#define MRA_VIEW_VIDEO "/ViewVideo" -#define MRA_VIEW_VIDEO_STR LPGEN("View Video") -#define MRA_ANSWERS "/Answers" -#define MRA_ANSWERS_STR LPGEN("Answers") -#define MRA_WORLD "/World" -#define MRA_WORLD_STR LPGEN("World") -#define MRA_SENDNUDGE_STR LPGEN("Send &Nudge") - -#define ADV_ICON_DELETED 0 -#define ADV_ICON_DELETED_ID "ADV_ICON_DELETED" -#define ADV_ICON_DELETED_STR LPGEN("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 LPGEN("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 LPGEN("Not authorized") -#define ADV_ICON_PHONE 3 -#define ADV_ICON_PHONE_ID "ADV_ICON_PHONE" -#define ADV_ICON_PHONE_STR LPGEN("Phone/SMS only contact") -#define ADV_ICON_BLOGSTATUS 4 -#define ADV_ICON_BLOGSTATUS_ID "ADV_ICON_BLOGSTATUS" -#define ADV_ICON_BLOGSTATUS_STR LPGEN("Blog status message") - -#define MRA_SOUND_NEW_EMAIL LPGENW("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_MAX 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_ON_WEB_SVCS TRUE -#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 LPGENW("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_DEFAULT_SHOW_ALL_XSTATUSES FALSE /* Do not display some x statuses (like dating) in menu. */ - -#define MRA_AVT_DEFAULT_ENABLE TRUE -#define MRA_AVT_DEFAULT_WRK_THREAD_COUNTS 1 // 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 L"_default.jpg" -#define MRA_AVT_DEFAULT_RET_ABC_PATH TRUE -#define MRA_DELETE_AVT_ON_CONTACT_DELETE TRUE - -#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 ICQACKTYPE_SMS 1001 -#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" - -extern LPCSTR lpcszStatusUri[]; -extern LPCWSTR lpcszXStatusNameDef[]; - -#define MRA_XSTATUS_COUNT 50 /* index = 0 - virtual status "none" */ -#define MRA_XSTATUS_OFF_CLI_COUNT 49 /* MRA_XSTATUS_COUNT - dating */ -#define MRA_MIR_XSTATUS_NONE 0 -#define MRA_MIR_XSTATUS_UNKNOWN MRA_XSTATUS_COUNT - -/* Indexes in lpcszStatusUrip[]. */ -#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_MOBILE 6 -#define MRA_XSTATUS_UNKNOWN 255 -#define MRA_XSTATUS_UNKNOWN_STR "mra_xstatus50" // For icon name, keep sync with MRA_XSTATUS_COUNT - -#define MRA_XSTATUS_INDEX_OFFSET 7 - -#endif // !defined(AFX_MRA_CONSTANS_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/protocols/MRA/src/MraFilesQueue.cpp b/protocols/MRA/src/MraFilesQueue.cpp deleted file mode 100644 index dee5082350..0000000000 --- a/protocols/MRA/src/MraFilesQueue.cpp +++ /dev/null @@ -1,1146 +0,0 @@ -#include "stdafx.h" -#include "MraFilesQueue.h" -#include "proto.h" - -#define MRA_FT_HELLO "MRA_FT_HELLO" -#define MRA_FT_GET_FILE "MRA_FT_GET_FILE" - -struct MRA_FILES_QUEUE : public LIST_MT -{ - DWORD dwSendTimeOutInterval; -}; - -struct MRA_FILES_QUEUE_FILE -{ - LPWSTR lpwszName; - size_t dwNameLen; - DWORDLONG dwSize; -}; - -struct MRA_FILES_QUEUE_ITEM : public LIST_MT_ITEM -{ - // internal - bool bIsWorking; - DWORD dwSendTime; - - // external - CMraProto *ppro; - DWORD dwIDRequest; - DWORD dwFlags; - MCONTACT 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; - HNETLIBCONN hConnection; - HANDLE hListen; - HANDLE hThread; - HANDLE hWaitHandle; - HANDLE hMraMrimProxyData; -}; - -struct MRA_FILES_THREADPROC_PARAMS -{ - HANDLE hFilesQueueHandle; - MRA_FILES_QUEUE_ITEM *dat; -}; - -DWORD MraFilesQueueItemFindByID(HANDLE hQueue, DWORD dwIDRequest, MRA_FILES_QUEUE_ITEM **ppmrafqFilesQueueItem); -void MraFilesQueueItemFree(MRA_FILES_QUEUE_ITEM *dat); - -///////////////////////////////////////////////////////////////////////////////////////// -// File transfer options - -static 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 -}; - -void MraFilesQueueDlgEnableDirectConsControls(HWND hWndDlg, BOOL bEnabled) -{ - EnableControlsArray(hWndDlg, (WORD*)&wMraFilesControlsList, _countof(wMraFilesControlsList), bEnabled); - EnableWindow(GetDlgItem(hWndDlg, IDC_FILE_SEND_EXTRA_ADDRESS), (bEnabled && IsDlgButtonChecked(hWndDlg, IDC_FILE_SEND_ADD_EXTRA_ADDRESS))); -} - -INT_PTR CALLBACK MraFilesQueueDlgProcOpts(HWND hWndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - CMraProto *ppro = (CMraProto*)GetWindowLongPtr(hWndDlg, GWLP_USERDATA); - - switch (msg) { - case WM_INITDIALOG: - TranslateDialogDefault(hWndDlg); - SetWindowLongPtr(hWndDlg, GWLP_USERDATA, lParam); - ppro = (CMraProto*)lParam; - { - CheckDlgButton(hWndDlg, IDC_FILE_SEND_ENABLE_DIRECT_CONN, ppro->getByte("FileSendEnableDirectConn", MRA_DEF_FS_ENABLE_DIRECT_CONN) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hWndDlg, IDC_FILE_SEND_NOOUTCONNECTIONONRECEIVE, ppro->getByte("FileSendNoOutConnOnRcv", MRA_DEF_FS_NO_OUT_CONN_ON_RCV) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hWndDlg, IDC_FILE_SEND_NOOUTCONNECTIONONSEND, ppro->getByte("FileSendNoOutConnOnSend", MRA_DEF_FS_NO_OUT_CONN_ON_SEND) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hWndDlg, IDC_FILE_SEND_IGNORYADDITIONALPORTS, ppro->getByte("FileSendIgnoryAdditionalPorts", MRA_DEF_FS_IGNORY_ADDITIONAL_PORTS) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hWndDlg, IDC_FILE_SEND_HIDE_MY_ADDRESSES, ppro->getByte("FileSendHideMyAddresses", MRA_DEF_FS_HIDE_MY_ADDRESSES) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hWndDlg, IDC_FILE_SEND_ADD_EXTRA_ADDRESS, ppro->getByte("FileSendAddExtraAddresses", MRA_DEF_FS_ADD_EXTRA_ADDRESSES) ? BST_CHECKED : BST_UNCHECKED); - - CMStringW szBuff; - if (ppro->mraGetStringW(NULL, "FileSendExtraAddresses", szBuff)) - SetDlgItemText(hWndDlg, IDC_FILE_SEND_EXTRA_ADDRESS, szBuff.c_str()); - - CheckDlgButton(hWndDlg, IDC_FILE_SEND_ENABLE_MRIMPROXY_CONS, ppro->getByte("FileSendEnableMRIMProxyCons", MRA_DEF_FS_ENABLE_MRIM_PROXY_CONS) ? BST_CHECKED : BST_UNCHECKED); - - SetDlgItemInt(hWndDlg, IDC_FILE_SEND_BLOCK_SIZE, ppro->getDword("FileSendBlockSize", MRA_DEFAULT_FILE_SEND_BLOCK_SIZE), FALSE); - - MraFilesQueueDlgEnableDirectConsControls(hWndDlg, IsDlgButtonChecked(hWndDlg, IDC_FILE_SEND_ENABLE_DIRECT_CONN)); - } - return TRUE; - - case WM_COMMAND: - if (LOWORD(wParam) == IDC_FILE_SEND_ENABLE_DIRECT_CONN) - MraFilesQueueDlgEnableDirectConsControls(hWndDlg, IsDlgButtonChecked(hWndDlg, IDC_FILE_SEND_ENABLE_DIRECT_CONN)); - - 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 FALSE; - SendMessage(GetParent(hWndDlg), PSM_CHANGED, 0, 0); - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lParam)->code) { - case PSN_APPLY: - ppro->setByte("FileSendEnableDirectConn", IsDlgButtonChecked(hWndDlg, IDC_FILE_SEND_ENABLE_DIRECT_CONN)); - ppro->setByte("FileSendNoOutConnOnRcv", IsDlgButtonChecked(hWndDlg, IDC_FILE_SEND_NOOUTCONNECTIONONRECEIVE)); - ppro->setByte("FileSendNoOutConnOnSend", IsDlgButtonChecked(hWndDlg, IDC_FILE_SEND_NOOUTCONNECTIONONSEND)); - ppro->setByte("FileSendIgnoryAdditionalPorts", IsDlgButtonChecked(hWndDlg, IDC_FILE_SEND_IGNORYADDITIONALPORTS)); - ppro->setByte("FileSendHideMyAddresses", IsDlgButtonChecked(hWndDlg, IDC_FILE_SEND_HIDE_MY_ADDRESSES)); - ppro->setByte("FileSendAddExtraAddresses", IsDlgButtonChecked(hWndDlg, IDC_FILE_SEND_ADD_EXTRA_ADDRESS)); - - WCHAR szBuff[MAX_PATH]; - GetDlgItemText(hWndDlg, IDC_FILE_SEND_EXTRA_ADDRESS, szBuff, _countof(szBuff)); - ppro->mraSetStringW(NULL, "FileSendExtraAddresses", szBuff); - ppro->setDword("FileSendBlockSize", (DWORD)GetDlgItemInt(hWndDlg, IDC_FILE_SEND_BLOCK_SIZE, nullptr, FALSE)); - ppro->setByte("FileSendEnableMRIMProxyCons", IsDlgButtonChecked(hWndDlg, IDC_FILE_SEND_ENABLE_MRIMPROXY_CONS)); - return TRUE; - } - break; - } - return FALSE; -} - -///////////////////////////////////////////////////////////////////////////////////////// -// MRA files' queue - -DWORD MraFilesQueueInitialize(DWORD dwSendTimeOutInterval, HANDLE *phFilesQueueHandle) -{ - if (!phFilesQueueHandle) - return ERROR_INVALID_HANDLE; - - MRA_FILES_QUEUE *pmrafqFilesQueue = new MRA_FILES_QUEUE(); - if (!pmrafqFilesQueue) - return GetLastError(); - - pmrafqFilesQueue->dwSendTimeOutInterval = dwSendTimeOutInterval; - *phFilesQueueHandle = (HANDLE)pmrafqFilesQueue; - return NO_ERROR; -} - -void MraFilesQueueDestroy(HANDLE hQueue) -{ - if (!hQueue) - return; - - MRA_FILES_QUEUE *pmrafqFilesQueue = (MRA_FILES_QUEUE*)hQueue; - MRA_FILES_QUEUE_ITEM *dat; - { - mir_cslock l(pmrafqFilesQueue->cs); - while (ListMTItemGetFirst(pmrafqFilesQueue, nullptr, (LPVOID*)&dat) == NO_ERROR) - MraFilesQueueItemFree(dat); - } - delete pmrafqFilesQueue; -} - -DWORD MraFilesQueueItemFindByID(HANDLE hQueue, DWORD dwIDRequest, MRA_FILES_QUEUE_ITEM **ppmrafqFilesQueueItem) -{ - if (!hQueue) - return ERROR_INVALID_HANDLE; - - MRA_FILES_QUEUE *pmrafqFilesQueue = (MRA_FILES_QUEUE*)hQueue; - MRA_FILES_QUEUE_ITEM *dat; - LIST_MT_ITERATOR lmtiIterator; - - mir_cslock l(pmrafqFilesQueue->cs); - ListMTIteratorMoveFirst(pmrafqFilesQueue, &lmtiIterator); - do { - if (ListMTIteratorGet(&lmtiIterator, nullptr, (LPVOID*)&dat) == NO_ERROR) - if (dat->dwIDRequest == dwIDRequest) { - if (ppmrafqFilesQueueItem) - *ppmrafqFilesQueueItem = dat; - return 0; - } - } - while (ListMTIteratorMoveNext(&lmtiIterator)); - - return ERROR_NOT_FOUND; -} - -HANDLE MraFilesQueueItemProxyByID(HANDLE hQueue, DWORD dwIDRequest) -{ - MRA_FILES_QUEUE_ITEM *dat; - if (!MraFilesQueueItemFindByID(hQueue, dwIDRequest, &dat)) - return dat->hMraMrimProxyData; - - return nullptr; -} - -void MraFilesQueueItemFree(MRA_FILES_QUEUE_ITEM *dat) -{ - LIST_MT *plmtListMT = (LIST_MT*)dat->lpListMT; - - for (size_t i = 0; i < dat->dwFilesCount; i++) - mir_free(dat->pmfqfFiles[i].lpwszName); - - mir_free(dat->pmfqfFiles); - mir_free(dat->pwszFilesList); - mir_free(dat->pwszDescription); - MraAddrListFree(&dat->malAddrList); - MraMrimProxyFree(dat->hMraMrimProxyData); - mir_free(dat->lpwszPath); - { - mir_cslock l(plmtListMT->cs); - ListMTItemDelete(plmtListMT, dat); - } - mir_free(dat); -} - -size_t CMraProto::MraFilesQueueGetLocalAddressesList(LPSTR lpszBuff, size_t dwBuffSize, DWORD dwPort) -{ - LPSTR lpszCurPos = lpszBuff; - - if (getByte("FileSendHideMyAddresses", MRA_DEF_FS_HIDE_MY_ADDRESSES)) {// не выдаём врагу наш IP адрес!!! :) - if (getByte("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(getDword("IP", 0)); - if (dwSelfExternalIP) { - memcpy(&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); - } - - CHAR szHostName[MAX_PATH] = { 0 }; - if (gethostname(szHostName, _countof(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++; - } - } - } - - CMStringA szHostName; - if (getByte("FileSendAddExtraAddresses", MRA_DEF_FS_ADD_EXTRA_ADDRESSES))// добавляем произвольный адрес - if (mraGetStringA(NULL, "FileSendExtraAddresses", szHostName)) - lpszCurPos += mir_snprintf(lpszCurPos, (dwBuffSize - ((size_t)lpszCurPos - (size_t)lpszBuff)), "%s:%lu;", szHostName.c_str(), dwPort); - - return lpszCurPos - lpszBuff; -} - -DWORD CMraProto::MraFilesQueueAccept(HANDLE hQueue, DWORD dwIDRequest, LPCWSTR lpwszPath, size_t dwPathSize) -{ - if (!hQueue || !lpwszPath || !dwPathSize) - return ERROR_INVALID_HANDLE; - - MRA_FILES_QUEUE *pmrafqFilesQueue = (MRA_FILES_QUEUE*)hQueue; - MRA_FILES_QUEUE_ITEM *dat; - - mir_cslock l(pmrafqFilesQueue->cs); - DWORD dwRetErrorCode = MraFilesQueueItemFindByID(hQueue, dwIDRequest, &dat); - if (dwRetErrorCode == NO_ERROR) { - MRA_FILES_THREADPROC_PARAMS *pmftpp = (MRA_FILES_THREADPROC_PARAMS*)mir_calloc(sizeof(MRA_FILES_THREADPROC_PARAMS)); - dat->lpwszPath = (LPWSTR)mir_calloc(((dwPathSize+2)*sizeof(WCHAR))); - dat->dwPathSize = dwPathSize; - memcpy(dat->lpwszPath, lpwszPath, (dwPathSize*sizeof(WCHAR))); - - if ((*(WCHAR*)(dat->lpwszPath + (dat->dwPathSize - 1))) != '\\') {// add slash at the end if needed - (*(WCHAR*)(dat->lpwszPath + dat->dwPathSize)) = '\\'; - dat->dwPathSize++; - (*(WCHAR*)(dat->lpwszPath + dat->dwPathSize)) = 0; - } - - pmftpp->hFilesQueueHandle = hFilesQueueHandle; - pmftpp->dat = dat; - - dat->hThread = ForkThreadEx(&CMraProto::MraFilesQueueRecvThreadProc, pmftpp, nullptr); - } - return dwRetErrorCode; -} - -DWORD CMraProto::MraFilesQueueCancel(HANDLE hQueue, DWORD dwIDRequest, BOOL bSendDecline) -{ - if (!hQueue) - return ERROR_INVALID_HANDLE; - - MRA_FILES_QUEUE *pmrafqFilesQueue = (MRA_FILES_QUEUE*)hQueue; - MRA_FILES_QUEUE_ITEM *dat; - - mir_cslock l(pmrafqFilesQueue->cs); - DWORD dwRetErrorCode = MraFilesQueueItemFindByID(hQueue, dwIDRequest, &dat); - if (dwRetErrorCode == NO_ERROR) { //***deb closesocket, send message to thread - InterlockedExchange((volatile LONG*)&dat->bIsWorking, FALSE); - - if (bSendDecline) { - CMStringA szEmail; - if (mraGetStringA(dat->hContact, "e-mail", szEmail)) - MraFileTransferAck(FILE_TRANSFER_STATUS_DECLINE, szEmail, dwIDRequest, CMStringA()); - } - - MraMrimProxyCloseConnection(dat->hMraMrimProxyData); - - NETLIB_CLOSEHANDLE(dat->hListen); - NETLIB_CLOSEHANDLE(dat->hConnection); - - SetEvent(dat->hWaitHandle); - - if (dat->hThread == nullptr) - MraFilesQueueItemFree(dat); - } - return dwRetErrorCode; -} - -DWORD CMraProto::MraFilesQueueStartMrimProxy(HANDLE hQueue, DWORD dwIDRequest) -{ - if (!hQueue || !getByte("FileSendEnableMRIMProxyCons", MRA_DEF_FS_ENABLE_MRIM_PROXY_CONS)) - return ERROR_INVALID_HANDLE; - - MRA_FILES_QUEUE *pmrafqFilesQueue = (MRA_FILES_QUEUE*)hQueue; - MRA_FILES_QUEUE_ITEM *dat; - - mir_cslock l(pmrafqFilesQueue->cs); - if (!MraFilesQueueItemFindByID(hQueue, dwIDRequest, &dat)) - if (dat->bSending == FALSE) - SetEvent(dat->hWaitHandle);// cancel wait incomming connection - - return 0; -} - -DWORD MraFilesQueueFree(HANDLE hQueue, DWORD dwIDRequest) -{ - if (!hQueue) - return ERROR_INVALID_HANDLE; - - MRA_FILES_QUEUE *pmrafqFilesQueue = (MRA_FILES_QUEUE*)hQueue; - MRA_FILES_QUEUE_ITEM *dat; - LIST_MT_ITERATOR lmtiIterator; - - mir_cslock l(pmrafqFilesQueue->cs); - ListMTIteratorMoveFirst(pmrafqFilesQueue, &lmtiIterator); - do { - if (ListMTIteratorGet(&lmtiIterator, nullptr, (LPVOID*)&dat) == NO_ERROR) - if (dat->dwIDRequest == dwIDRequest) { - MraFilesQueueItemFree(dat); - return 0; - } - } - while (ListMTIteratorMoveNext(&lmtiIterator)); - - return ERROR_NOT_FOUND; -} - -DWORD CMraProto::MraFilesQueueSendMirror(HANDLE hQueue, DWORD dwIDRequest, const CMStringA &szAddresses) -{ - if (!hQueue) - return ERROR_INVALID_HANDLE; - - MRA_FILES_QUEUE *pmrafqFilesQueue = (MRA_FILES_QUEUE*)hQueue; - MRA_FILES_QUEUE_ITEM *dat; - - mir_cslock l(pmrafqFilesQueue->cs); - DWORD dwRetErrorCode = MraFilesQueueItemFindByID(hQueue, dwIDRequest, &dat); - if (dwRetErrorCode == NO_ERROR) { - MraAddrListGetFromBuff(szAddresses, &dat->malAddrList); - MraAddrListStoreToContact(dat->hContact, &dat->malAddrList); - - dat->hConnection = nullptr; - SetEvent(dat->hWaitHandle); - } - return dwRetErrorCode; -} - -bool CMraProto::MraFilesQueueHandCheck(HNETLIBCONN hConnection, MRA_FILES_QUEUE_ITEM *dat) -{ - if (hConnection && dat) { - BYTE btBuff[((MAX_EMAIL_LEN * 2) + (sizeof(MRA_FT_HELLO)* 2) + 8)] = { 0 }; - size_t dwBuffSize; - - CMStringA szEmail, szEmailMy; - if (!mraGetStringA(NULL, "e-mail", szEmailMy) || !mraGetStringA(dat->hContact, "e-mail", szEmail)) - return false; - - szEmailMy.MakeLower(); - szEmail.MakeLower(); - - if (dat->bSending == FALSE) { - // receiving - dwBuffSize = mir_snprintf((LPSTR)btBuff, _countof(btBuff), "%s %s", MRA_FT_HELLO, szEmailMy.c_str()) + 1; - if (dwBuffSize == (size_t)Netlib_Send(hConnection, (LPSTR)btBuff, (int)dwBuffSize, 0)) { - // my email sended - ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_INITIALISING, (HANDLE)dat->dwIDRequest, 0); - dwBuffSize = Netlib_Recv(hConnection, (LPSTR)btBuff, sizeof(btBuff), 0); - if ((szEmail.GetLength() + sizeof(MRA_FT_HELLO)+1) == dwBuffSize) { - // email received - mir_snprintf(((LPSTR)btBuff + dwBuffSize), (_countof(btBuff) - dwBuffSize), "%s %s", MRA_FT_HELLO, szEmail.c_str()); - if (!_memicmp(btBuff, btBuff + dwBuffSize, dwBuffSize)) - return true; - } - } - } - else {// sending - dwBuffSize = Netlib_Recv(hConnection, (LPSTR)btBuff, sizeof(btBuff), 0); - if ((szEmail.GetLength() + sizeof(MRA_FT_HELLO)+1) == dwBuffSize) { - // email received - ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_INITIALISING, (HANDLE)dat->dwIDRequest, 0); - mir_snprintf(((LPSTR)btBuff + dwBuffSize), (_countof(btBuff) - dwBuffSize), "%s %s", MRA_FT_HELLO, szEmail.c_str()); - if (!_memicmp(btBuff, btBuff + dwBuffSize, dwBuffSize)) { - // email verified - dwBuffSize = (mir_snprintf((LPSTR)btBuff, _countof(btBuff), "%s %s", MRA_FT_HELLO, szEmailMy.c_str()) + 1); - if (dwBuffSize == (size_t)Netlib_Send(hConnection, (LPSTR)btBuff, (int)dwBuffSize, 0)) - return true; - } - } - } - } - return false; -} - -HANDLE CMraProto::MraFilesQueueConnectOut(MRA_FILES_QUEUE_ITEM *dat) -{ - if (!dat) - return nullptr; - - if (getByte("FileSendEnableDirectConn", MRA_DEF_FS_ENABLE_DIRECT_CONN) && InterlockedExchangeAdd((volatile LONG*)&dat->bIsWorking, 0) && ((dat->bSending == FALSE && getByte("FileSendNoOutConnOnRcv", MRA_DEF_FS_NO_OUT_CONN_ON_RCV) == FALSE) || (dat->bSending == TRUE && getByte("FileSendNoOutConnOnSend", MRA_DEF_FS_NO_OUT_CONN_ON_SEND) == FALSE))) { - BOOL bFiltering = FALSE, bIsHTTPSProxyUsed = IsHTTPSProxyUsed(m_hNetlibUser); - DWORD dwLocalPort = 0, dwConnectReTryCount, dwCurConnectReTryCount; - size_t dwAddrCount = 0; - NETLIBOPENCONNECTION nloc = { 0 }; - - if (getByte("FileSendIgnoryAdditionalPorts", MRA_DEF_FS_IGNORY_ADDITIONAL_PORTS) || bIsHTTPSProxyUsed) {// фильтруем порты для одного IP, вместо 3 будем коннектится только к одному - if (bIsHTTPSProxyUsed) - dwLocalPort = MRA_SERVER_PORT_HTTPS; - else if ((dwLocalPort = getWord("ServerPort", MRA_DEFAULT_SERVER_PORT)) == MRA_SERVER_PORT_STANDART_NLB) - dwLocalPort = MRA_SERVER_PORT_STANDART; - - for (size_t i = 0; i < dat->malAddrList.dwAddrCount; i++) { - if (dwLocalPort == dat->malAddrList.pMailAddress[i].dwPort) { - bFiltering = TRUE; - dwAddrCount++; - } - } - } - - if (bFiltering == FALSE) - dwAddrCount = dat->malAddrList.dwAddrCount; - - if (dwAddrCount) { - dat->hConnection = nullptr; - dwConnectReTryCount = getDword("ConnectReTryCountFileSend", MRA_DEFAULT_CONN_RETRY_COUNT_FILES); - nloc.cbSize = sizeof(nloc); - nloc.flags = NLOCF_V2; - nloc.timeout = getDword("TimeOutConnectFileSend", (int)((MRA_TIMEOUT_DIRECT_CONN - 1) / (dwAddrCount*dwConnectReTryCount)));// -1 сек чтобы был запас - if (nloc.timeout < MRA_TIMEOUT_CONN_MIN) nloc.timeout = MRA_TIMEOUT_CONN_MIN; - if (nloc.timeout > MRA_TIMEOUT_CONN_MAX) nloc.timeout = MRA_TIMEOUT_CONN_MAX; - - // Set up the sockaddr structure - for (size_t i = 0; i < dat->malAddrList.dwAddrCount; i++) { - if (dwLocalPort == dat->malAddrList.pMailAddress[i].dwPort || bFiltering == FALSE) { - ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTING, (HANDLE)dat->dwIDRequest, 0); - - nloc.szHost = inet_ntoa((*((in_addr*)&dat->malAddrList.pMailAddress[i].dwAddr))); - nloc.wPort = (WORD)dat->malAddrList.pMailAddress[i].dwPort; - - dwCurConnectReTryCount = dwConnectReTryCount; - do { - dat->hConnection = Netlib_OpenConnection(m_hNetlibUser, &nloc); - } - while (--dwCurConnectReTryCount && dat->hConnection == nullptr); - - if (dat->hConnection) { - ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, (HANDLE)dat->dwIDRequest, 0); - if (MraFilesQueueHandCheck(dat->hConnection, dat)) { - // связь установленная с тем кем нужно - setDword(dat->hContact, "OldIP", getDword(dat->hContact, "IP", 0)); - setDword(dat->hContact, "IP", ntohl(dat->malAddrList.pMailAddress[i].dwAddr)); - break; - } - else // кажется не туда подключились :) - NETLIB_CLOSEHANDLE(dat->hConnection); - } - } - } - } - } - return dat->hConnection; -} - -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 CMraProto::MraFilesQueueConnectIn(MRA_FILES_QUEUE_ITEM *dat) -{ - if (!dat) - return nullptr; - if (!InterlockedExchangeAdd((volatile LONG*)&dat->bIsWorking, 0)) - return nullptr; - - CMStringA szEmail; - if (mraGetStringA(dat->hContact, "e-mail", szEmail)) { - CHAR szAddrList[2048] = { 0 }; - size_t dwAddrListSize; - - // копируем адреса в соответствии с правилами и начинаем слушать порт - if (getByte("FileSendEnableDirectConn", MRA_DEF_FS_ENABLE_DIRECT_CONN)) { - NETLIBBIND nlbBind = {}; - nlbBind.pfnNewConnectionV2 = MraFilesQueueConnectionReceived; - nlbBind.wPort = 0; - nlbBind.pExtra = (LPVOID)dat; - - dat->hListen = Netlib_BindPort(m_hNetlibUser, &nlbBind); - if (dat->hListen) { - ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_LISTENING, (HANDLE)dat->dwIDRequest, 0); - dwAddrListSize = MraFilesQueueGetLocalAddressesList(szAddrList, sizeof(szAddrList), nlbBind.wPort); - } - // не смогли слушать порт, хз почему. - else { - ShowFormattedErrorMessage(L"Files exchange: cant create listen soscket, will try connect to remonte host. Error", GetLastError()); - - //dwAddrListSize = 0; - memcpy(szAddrList, MRA_FILES_NULL_ADDRR, sizeof(MRA_FILES_NULL_ADDRR)); - dwAddrListSize = (sizeof(MRA_FILES_NULL_ADDRR)-1); - } - } - // подставляем ложный адрес, чтобы точно не подключились и не слушаем порт - else { - memcpy(szAddrList, MRA_FILES_NULL_ADDRR, sizeof(MRA_FILES_NULL_ADDRR)); - dwAddrListSize = (sizeof(MRA_FILES_NULL_ADDRR)-1); - } - - if (dwAddrListSize) { - dat->hWaitHandle = CreateEvent(nullptr, TRUE, FALSE, nullptr); - if (dat->bSending == FALSE) // запрашиваем зеркальное соединение, тк сами подключится не смогли - MraFileTransferAck(FILE_TRANSFER_MIRROR, szEmail, dat->dwIDRequest, szAddrList); - else { // здесь отправляем запрос на передачу(установление соединения) - // создаём текстовый список файлов для отправки другой стороне - LPWSTR lpwszFiles, lpwszCurPos; - size_t dwFilesSize; - - dwFilesSize = ((MAX_PATH * 2)*dat->dwFilesCount); - lpwszFiles = (LPWSTR)mir_calloc((dwFilesSize*sizeof(WCHAR))); - if (lpwszFiles) { - lpwszCurPos = lpwszFiles; - for (size_t i = 0; i < dat->dwFilesCount; i++) { - MRA_FILES_QUEUE_FILE &p = dat->pmfqfFiles[i]; - lpwszCurPos += mir_snwprintf(lpwszCurPos, (dwFilesSize - ((size_t)lpwszCurPos - (size_t)lpwszFiles)), L"%s;%I64u;", - GetFileNameFromFullPathW(p.lpwszName, p.dwNameLen), p.dwSize); - } - dwFilesSize = (lpwszCurPos - lpwszFiles);// size in WCHARs - - if (dat->hMraMrimProxyData) { - // устанавливаем данные для майловской прокси, если она разрешена - CMStringA lpszFiles = lpwszFiles; - MraMrimProxySetData(dat->hMraMrimProxyData, szEmail, dat->dwIDRequest, MRIM_PROXY_TYPE_FILES, lpszFiles, "", nullptr); - } - MraFileTransfer(szEmail, dat->dwIDRequest, dat->dwFilesTotalSize, lpwszFiles, szAddrList); - - mir_free(lpwszFiles); - } - } - WaitForSingleObjectEx(dat->hWaitHandle, INFINITE, FALSE); - CloseHandle(dat->hWaitHandle); - dat->hWaitHandle = nullptr; - } - } - return dat->hConnection; -} - -// This function is called from the Netlib when someone is connecting to -// one of our incomming DC ports -void MraFilesQueueConnectionReceived(HNETLIBCONN hNewConnection, DWORD dwRemoteIP, void *pExtra) -{ - if (pExtra) { - MRA_FILES_QUEUE_ITEM *dat = (MRA_FILES_QUEUE_ITEM*)pExtra; - - ProtoBroadcastAck(dat->ppro->m_szModuleName, dat->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, (HANDLE)dat->dwIDRequest, 0); - if (dat->ppro->MraFilesQueueHandCheck(hNewConnection, dat)) { // связь установленная с тем кем нужно - dat->hConnection = hNewConnection; - ProtoBroadcastAck(dat->ppro->m_szModuleName, dat->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, (HANDLE)dat->dwIDRequest, 0); - dat->ppro->setDword(dat->hContact, "OldIP", dat->ppro->getDword(dat->hContact, "IP", 0)); - dat->ppro->setDword(dat->hContact, "IP", dwRemoteIP); - SetEvent(dat->hWaitHandle); - } - else {// кажется кто то не туда подключилися :) - ProtoBroadcastAck(dat->ppro->m_szModuleName, dat->hContact, ACKTYPE_FILE, ACKRESULT_LISTENING, (HANDLE)dat->dwIDRequest, 0); - Netlib_CloseHandle(hNewConnection); - } - } - else Netlib_CloseHandle(hNewConnection); -} - -///////////////////////////////////////////////////////////////////////////////////////// -// Receive files - -DWORD CMraProto::MraFilesQueueAddReceive(HANDLE hQueue, DWORD dwFlags, MCONTACT hContact, DWORD dwIDRequest, const CMStringW &lpwszFiles, const CMStringA &szAddresses) -{ - if (!hQueue || !dwIDRequest) - return ERROR_INVALID_HANDLE; - - MRA_FILES_QUEUE *pmrafqFilesQueue = (MRA_FILES_QUEUE*)hQueue; - MRA_FILES_QUEUE_ITEM *dat = (MRA_FILES_QUEUE_ITEM*)mir_calloc(sizeof(MRA_FILES_QUEUE_ITEM)+sizeof(LPSTR)+64); - if (!dat) - return GetLastError(); - - WCHAR szBuff[MAX_PATH]; - size_t dwMemSize, dwAllocatedCount, dwFileNameTotalSize; - - //dat->lmtListMTItem; - dat->ppro = this; - dat->bIsWorking = TRUE; - dat->dwSendTime = GetTickCount(); - dat->dwIDRequest = dwIDRequest; - dat->dwFlags = dwFlags; - dat->hContact = hContact; - if (getByte("FileSendEnableMRIMProxyCons", MRA_DEF_FS_ENABLE_MRIM_PROXY_CONS)) - dat->hMraMrimProxyData = MraMrimProxyCreate(); - - dwFileNameTotalSize = 0; - dwAllocatedCount = ALLOCATED_COUNT; - dat->dwFilesCount = 0; - dat->dwFilesTotalSize = 0; - dat->pmfqfFiles = (MRA_FILES_QUEUE_FILE*)mir_calloc((sizeof(MRA_FILES_QUEUE_FILE)*dwAllocatedCount)); - - int iStart = 0; - while (TRUE) { - CMStringW wszCurrFile = lpwszFiles.Tokenize(L";", iStart); - if (iStart == -1) - break; - - CMStringW wszCurrSize = lpwszFiles.Tokenize(L";", iStart); - if (iStart == -1) - break; - - if (dat->dwFilesCount == dwAllocatedCount) { - dwAllocatedCount *= 2; - dat->pmfqfFiles = (MRA_FILES_QUEUE_FILE*)mir_realloc(dat->pmfqfFiles, (sizeof(MRA_FILES_QUEUE_FILE)*dwAllocatedCount)); - } - - MRA_FILES_QUEUE_FILE &p = dat->pmfqfFiles[dat->dwFilesCount]; - p.lpwszName = mir_wstrdup(wszCurrFile); - p.dwNameLen = mir_wstrlen(p.lpwszName); - p.dwSize = _wtoi(wszCurrSize); - dat->dwFilesTotalSize += p.dwSize; - dwFileNameTotalSize += p.dwNameLen * sizeof(wchar_t); - - dat->dwFilesCount++; - } - dat->pmfqfFiles = (MRA_FILES_QUEUE_FILE*)mir_realloc(dat->pmfqfFiles, (sizeof(MRA_FILES_QUEUE_FILE)*(dat->dwFilesCount + 4))); - - dwMemSize = (((dat->dwFilesCount + 4) * 64) + (dwFileNameTotalSize*sizeof(WCHAR)) + (szAddresses.GetLength()*sizeof(WCHAR)) + 128); - dat->pwszFilesList = (LPWSTR)mir_calloc(dwMemSize); - dat->pwszDescription = (LPWSTR)mir_calloc(dwMemSize); - - LPWSTR lpwszDelimiter = dat->pwszFilesList; - LPWSTR lpwszCurrentItem = dat->pwszDescription; - StrFormatByteSizeW(dat->dwFilesTotalSize, szBuff, _countof(szBuff)); - lpwszCurrentItem += mir_snwprintf(lpwszCurrentItem, ((dwMemSize - ((size_t)lpwszCurrentItem - (size_t)dat->pwszDescription)) / sizeof(WCHAR)), L"%I64u Files (%s)\r\n", dat->dwFilesCount, szBuff); - - // description + filesnames - for (size_t i = 0; i < dat->dwFilesCount; i++) { - lpwszDelimiter += mir_snwprintf(lpwszDelimiter, ((dwMemSize - ((size_t)lpwszDelimiter - (size_t)dat->pwszFilesList)) / sizeof(WCHAR)), L"%s", dat->pmfqfFiles[i].lpwszName); - StrFormatByteSizeW(dat->pmfqfFiles[i].dwSize, szBuff, _countof(szBuff)); - lpwszCurrentItem += mir_snwprintf(lpwszCurrentItem, ((dwMemSize - ((size_t)lpwszCurrentItem - (size_t)dat->pwszDescription)) / sizeof(WCHAR)), L"%s - %s\r\n", dat->pmfqfFiles[i].lpwszName, szBuff); - } - - lpwszCurrentItem += MultiByteToWideChar(MRA_CODE_PAGE, 0, szAddresses, (int)szAddresses.GetLength(), lpwszCurrentItem, (int)((dwMemSize - ((size_t)lpwszCurrentItem - (size_t)dat->pwszDescription)) / sizeof(WCHAR))); - *lpwszCurrentItem = 0; - - MraAddrListGetFromBuff(szAddresses, &dat->malAddrList); - MraAddrListStoreToContact(dat->hContact, &dat->malAddrList); - { - mir_cslock l(pmrafqFilesQueue->cs); - ListMTItemAdd(pmrafqFilesQueue, dat, dat); - } - - // Send chain event - PROTORECVFILE prf; - prf.dwFlags = PRFF_UNICODE; - prf.timestamp = _time32(nullptr); - prf.descr.w = dat->pwszDescription; - prf.fileCount = 1; - prf.files.w = &dat->pwszFilesList; - prf.lParam = dwIDRequest; - ProtoChainRecvFile(hContact, &prf); - return NO_ERROR; -} - -void CMraProto::MraFilesQueueRecvThreadProc(LPVOID lpParameter) -{ - DWORD dwRetErrorCode = NO_ERROR; - - Thread_SetName("MRA: FilesQueueRecv"); - - if (lpParameter) { - MRA_FILES_QUEUE *pmrafqFilesQueue = (MRA_FILES_QUEUE*)((MRA_FILES_THREADPROC_PARAMS*)lpParameter)->hFilesQueueHandle; - MRA_FILES_QUEUE_ITEM *dat = ((MRA_FILES_THREADPROC_PARAMS*)lpParameter)->dat; - - 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 = {}; - - mir_free(lpParameter); - - bFailed = TRUE; - bConnected = FALSE; - pfts.hContact = dat->hContact; - pfts.flags = (PFTS_RECEIVING | PFTS_UNICODE);// pfts.sending = dat->bSending; //true if sending, false if receiving - //pfts.files; - pfts.totalFiles = dat->dwFilesCount; - //pfts.currentFileNumber = 0; - pfts.totalBytes = dat->dwFilesTotalSize; - //pfts.totalProgress = 0; - pfts.szWorkingDir.w = dat->lpwszPath; - //pfts.currentFile; - //pfts.currentFileSize; - //pfts.currentFileProgress; - //pfts.currentFileTime; //as seconds since 1970 - - if (MraFilesQueueConnectOut(dat)) { - bConnected = TRUE; - } - else { - if (MraFilesQueueConnectIn(dat)) { - bConnected = TRUE; - } - else { - if (InterlockedExchangeAdd((volatile LONG*)&dat->bIsWorking, 0)) { - ProtoBroadcastAck(dat->hContact, ACKRESULT_CONNECTPROXY, ACKRESULT_CONNECTED, (HANDLE)dat->dwIDRequest, 0); - if (MraMrimProxyConnect(dat->hMraMrimProxyData, &dat->hConnection) == NO_ERROR) {// подключились к прокси, проверяем та ли сессия (ещё раз, на этот раз сами) - if (MraFilesQueueHandCheck(dat->hConnection, dat)) {// связь установленная с тем кем нужно// dat->bSending - ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, (HANDLE)dat->dwIDRequest, 0); - bConnected = TRUE; - } - } - } - } - } - - if (bConnected) {// email verified - bFailed = FALSE; - for (i = 0; i < dat->dwFilesCount; i++) {// receiving files - pfts.currentFileNumber = (int)i; - pfts.szCurrentFile.w = wszFileName; - pfts.currentFileSize = dat->pmfqfFiles[i].dwSize; - pfts.currentFileProgress = 0; - //pfts.currentFileTime; //as seconds since 1970 - - if ((dat->dwPathSize + dat->pmfqfFiles[i].dwNameLen) < _countof(wszFileName)) { - memcpy(wszFileName, dat->lpwszPath, (dat->dwPathSize*sizeof(WCHAR))); - memcpy((wszFileName + dat->dwPathSize), dat->pmfqfFiles[i].lpwszName, ((dat->pmfqfFiles[i].dwNameLen + 1)*sizeof(WCHAR))); - wszFileName[dat->dwPathSize + dat->pmfqfFiles[i].dwNameLen] = 0; - } - else { - dwRetErrorCode = ERROR_BAD_PATHNAME; - ShowFormattedErrorMessage(L"Receive files: error", dwRetErrorCode); - bFailed = TRUE; - break; - } - - //***deb add - //dwBuffSizeUsed = ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_FILERESUME, (HANDLE)dat->dwIDRequest, (LPARAM)&pfts); - - ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, (HANDLE)dat->dwIDRequest, 0); - - //dwBuffSizeUsed = (mir_snprintf((LPSTR)btBuff, _countof(btBuff), "%s %S", MRA_FT_GET_FILE, dat->pmfqfFiles[i].lpwszName)+1); - memcpy(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, dat->pmfqfFiles[i].lpwszName, (int)dat->pmfqfFiles[i].dwNameLen, (LPSTR)(btBuff + sizeof(MRA_FT_GET_FILE)), (int)(_countof(btBuff) - sizeof(MRA_FT_GET_FILE)), nullptr, nullptr); - btBuff[dwBuffSizeUsed] = 0; - dwBuffSizeUsed++; - - if (dwBuffSizeUsed == (size_t)Netlib_Send(dat->hConnection, (LPSTR)btBuff, (int)dwBuffSizeUsed, 0)) {// file request sended - hFile = CreateFileW(wszFileName, GENERIC_WRITE, FILE_SHARE_READ, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); - if (hFile != INVALID_HANDLE_VALUE) {// file opened/created, pre allocating disk space, for best perfomance - bOK = FALSE; - - liFileSize.QuadPart = (LONGLONG)dat->pmfqfFiles[i].dwSize; - if (SetFilePointerEx(hFile, liFileSize, nullptr, FILE_BEGIN)) - if (SetEndOfFile(hFile)) { - liFileSize.QuadPart = 0; - bOK = SetFilePointerEx(hFile, liFileSize, nullptr, FILE_BEGIN); - } - - if (bOK) {// disk space pre allocated - bOK = FALSE; - bContinue = TRUE; - dwUpdateTimeNext = GetTickCount(); - nls.dwTimeout = (1000 * getDword("TimeOutReceiveFileData", MRA_DEF_FS_TIMEOUT_RECV)); - nls.hReadConns[0] = dat->hConnection; - ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_DATA, (HANDLE)dat->dwIDRequest, (LPARAM)&pfts); - - while (bContinue) { - switch (Netlib_Select(&nls)) { - case SOCKET_ERROR: - case 0:// Time out - dwRetErrorCode = GetLastError(); - ShowFormattedErrorMessage(L"Receive files: error on receive file data", dwRetErrorCode); - bContinue = FALSE; - break; - case 1: - dwReceived = Netlib_Recv(dat->hConnection, (LPSTR)&btBuff, _countof(btBuff), 0); - if (dwReceived == 0 || dwReceived == SOCKET_ERROR) { - dwRetErrorCode = GetLastError(); - ShowFormattedErrorMessage(L"Receive files: error on receive file data", dwRetErrorCode); - bContinue = FALSE; - } - else { - if (WriteFile(hFile, (LPVOID)&btBuff, dwReceived, &dwReceived, nullptr)) { - pfts.currentFileProgress += dwReceived; - pfts.totalProgress += dwReceived; - - // progress updates - dwUpdateTimeCur = GetTickCount(); - if (dwUpdateTimeNext <= dwUpdateTimeCur || pfts.currentFileProgress >= dat->pmfqfFiles[i].dwSize) {// we update it - dwUpdateTimeNext = dwUpdateTimeCur + MRA_FILES_QUEUE_PROGRESS_INTERVAL; - ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_DATA, (HANDLE)dat->dwIDRequest, (LPARAM)&pfts); - - if (pfts.currentFileProgress >= dat->pmfqfFiles[i].dwSize) {// file received - bOK = TRUE; - bContinue = FALSE; - } - } - } - else {// err on write file - dwRetErrorCode = GetLastError(); - ShowFormattedErrorMessage(L"Receive files: cant write file data, error", dwRetErrorCode); - bContinue = FALSE; - } - } - break; - } - }// end while - } - else {// err allocating file disk space - dwRetErrorCode = GetLastError(); - mir_snwprintf(szErrorText, TranslateT("Receive files: can't allocate disk space for file, size %lu bytes, error"), dat->pmfqfFiles[i].dwSize); - ShowFormattedErrorMessage(szErrorText, dwRetErrorCode); - } - CloseHandle(hFile); - - if (bOK == FALSE) {// file recv failed - DeleteFileW(wszFileName); - bFailed = TRUE; - break; - } - } - else {// err on open file - dwRetErrorCode = GetLastError(); - mir_snwprintf(szErrorText, TranslateT("Receive files: can't open file %s, error"), wszFileName); - ShowFormattedErrorMessage(szErrorText, dwRetErrorCode); - bFailed = TRUE; - break; - } - } - else {// err on send request for file - dwRetErrorCode = GetLastError(); - mir_snwprintf(szErrorText, TranslateT("Receive files: request for file %s not sent, error"), dat->pmfqfFiles[i].lpwszName); - ShowFormattedErrorMessage(szErrorText, NO_ERROR); - bFailed = TRUE; - break; - } - }// end for - - NETLIB_CLOSEHANDLE(dat->hConnection); - } - - if (bFailed) { - CMStringA szEmail; - if (mraGetStringA(dat->hContact, "e-mail", szEmail)) - MraFileTransferAck(FILE_TRANSFER_STATUS_ERROR, szEmail, dat->dwIDRequest, CMStringA()); - - ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, (HANDLE)dat->dwIDRequest, 0); - } - else ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, (HANDLE)dat->dwIDRequest, 0); - - mir_cslock l(pmrafqFilesQueue->cs); - MraFilesQueueItemFree(dat); - } -} - -///////////////////////////////////////////////////////////////////////////////////////// -// Send files - -DWORD CMraProto::MraFilesQueueAddSend(HANDLE hQueue, DWORD dwFlags, MCONTACT hContact, LPWSTR *plpwszFiles, size_t dwFilesCount, DWORD *pdwIDRequest) -{ - if (!hQueue) - return ERROR_INVALID_HANDLE; - - MRA_FILES_QUEUE *pmrafqFilesQueue = (MRA_FILES_QUEUE*)hQueue; - MRA_FILES_QUEUE_ITEM *dat = (MRA_FILES_QUEUE_ITEM*)mir_calloc(sizeof(MRA_FILES_QUEUE_ITEM)+sizeof(LPSTR)+64); - if (!dat) - return GetLastError(); - - ULARGE_INTEGER uliFileSize; - WIN32_FILE_ATTRIBUTE_DATA wfad; - - dat->ppro = this; - dat->bIsWorking = TRUE; - dat->dwSendTime = GetTickCount(); - dat->dwIDRequest = InterlockedIncrement((LONG volatile*)&dwCMDNum);// уникальный, рандомный идентификатор - dat->dwFlags = dwFlags; - dat->hContact = hContact; - if (getByte("FileSendEnableMRIMProxyCons", MRA_DEF_FS_ENABLE_MRIM_PROXY_CONS)) dat->hMraMrimProxyData = MraMrimProxyCreate(); - dat->dwFilesCount = dwFilesCount; - dat->pmfqfFiles = (MRA_FILES_QUEUE_FILE*)mir_calloc((sizeof(MRA_FILES_QUEUE_FILE)*(dat->dwFilesCount + 1))); - dat->dwFilesTotalSize = 0; - - for (size_t i = 0; i < dat->dwFilesCount; i++) { - MRA_FILES_QUEUE_FILE &p = dat->pmfqfFiles[i]; - if (GetFileAttributesExW(plpwszFiles[i], GetFileExInfoStandard, &wfad)) { - uliFileSize.LowPart = wfad.nFileSizeLow; - uliFileSize.HighPart = wfad.nFileSizeHigh; - p.dwSize = uliFileSize.QuadPart; - dat->dwFilesTotalSize += uliFileSize.QuadPart; - } - else p.dwSize = 0; - - p.dwNameLen = mir_wstrlen(plpwszFiles[i]); - p.lpwszName = mir_wstrdup(plpwszFiles[i]); - } - - dat->bSending = TRUE; - if (pdwIDRequest) *pdwIDRequest = dat->dwIDRequest; - - { - mir_cslock l(pmrafqFilesQueue->cs); - ListMTItemAdd(pmrafqFilesQueue, dat, dat); - } - MRA_FILES_THREADPROC_PARAMS *pmftpp = (MRA_FILES_THREADPROC_PARAMS*)mir_calloc(sizeof(MRA_FILES_THREADPROC_PARAMS)); - pmftpp->hFilesQueueHandle = hQueue; - pmftpp->dat = dat; - dat->hThread = ForkThreadEx(&CMraProto::MraFilesQueueSendThreadProc, pmftpp, nullptr); - - return NO_ERROR; -} - -void CMraProto::MraFilesQueueSendThreadProc(LPVOID lpParameter) -{ - DWORD dwRetErrorCode = NO_ERROR; - - Thread_SetName("MRA: FilesQueueSend"); - - if (!lpParameter) - return; - - MRA_FILES_QUEUE *pmrafqFilesQueue = (MRA_FILES_QUEUE*)((MRA_FILES_THREADPROC_PARAMS*)lpParameter)->hFilesQueueHandle; - MRA_FILES_QUEUE_ITEM *dat = ((MRA_FILES_THREADPROC_PARAMS*)lpParameter)->dat; - mir_free(lpParameter); - - CHAR szFileName[MAX_FILEPATH] = { 0 }; - WCHAR szErrorText[2048]; - BYTE btBuff[BUFF_SIZE_RCV]; - BOOL bFailed = TRUE, bOK, bConnected = FALSE; - DWORD dwReceived, dwSendBlockSize, dwUpdateTimeNext, dwUpdateTimeCur; - size_t i, j, dwBuffSizeUsed = 0; - LPWSTR lpwszFileName; - - PROTOFILETRANSFERSTATUS pfts = {}; - pfts.hContact = dat->hContact; - pfts.flags = (PFTS_SENDING | PFTS_UNICODE);// pfts.sending = dat->bSending; //true if sending, false if receiving - pfts.totalFiles = dat->dwFilesCount; - pfts.totalBytes = dat->dwFilesTotalSize; - pfts.szWorkingDir.w = dat->lpwszPath; - - dwSendBlockSize = getDword("FileSendBlockSize", MRA_DEFAULT_FILE_SEND_BLOCK_SIZE); - if (dwSendBlockSize > _countof(btBuff)) dwSendBlockSize = _countof(btBuff); - if (dwSendBlockSize < 512) dwSendBlockSize = MRA_DEFAULT_FILE_SEND_BLOCK_SIZE; - - if (MraFilesQueueConnectIn(dat)) - bConnected = TRUE; - else if (MraFilesQueueConnectOut(dat)) - bConnected = TRUE; - else { - if (InterlockedExchangeAdd((volatile LONG*)&dat->bIsWorking, 0)) { - ProtoBroadcastAck(dat->hContact, ACKRESULT_CONNECTPROXY, ACKRESULT_CONNECTED, (HANDLE)dat->dwIDRequest, 0); - if (MraMrimProxyConnect(dat->hMraMrimProxyData, &dat->hConnection) == NO_ERROR) { - // подключились к прокси, проверяем та ли сессия (ещё раз, на этот раз сами) - if (MraFilesQueueHandCheck(dat->hConnection, dat)) { - // связь установленная с тем кем нужно// dat->bSending - ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, (HANDLE)dat->dwIDRequest, 0); - bConnected = TRUE; - } - } - } - } - - if (bConnected) { // email verified - bFailed = FALSE; - for (i = 0; i < dat->dwFilesCount; i++) { // sending files - ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, (HANDLE)dat->dwIDRequest, 0); - - dwBuffSizeUsed = 0; - while (TRUE) { - dwReceived = Netlib_Recv(dat->hConnection, ((LPSTR)btBuff + dwBuffSizeUsed), (int)(_countof(btBuff) - dwBuffSizeUsed), 0); - if (dwReceived == 0 || dwReceived == SOCKET_ERROR) { // err on receive file name to send - dwRetErrorCode = GetLastError(); - ShowFormattedErrorMessage(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) - break; - - // ...received - if (dwBuffSizeUsed > (sizeof(MRA_FT_GET_FILE)+1)) {// file name received - if (!_memicmp(btBuff, MRA_FT_GET_FILE, sizeof(MRA_FT_GET_FILE)-1)) { - // MRA_FT_GET_FILE verified - bFailed = TRUE; - for (j = 0; j < dat->dwFilesCount; j++) { - lpwszFileName = GetFileNameFromFullPathW(dat->pmfqfFiles[j].lpwszName, dat->pmfqfFiles[j].dwNameLen); - szFileName[WideCharToMultiByte(MRA_CODE_PAGE, 0, lpwszFileName, (int)(dat->pmfqfFiles[j].dwNameLen - (lpwszFileName - dat->pmfqfFiles[j].lpwszName)), szFileName, _countof(szFileName), nullptr, nullptr)] = 0; - - if (!_memicmp(btBuff + sizeof(MRA_FT_GET_FILE), szFileName, dwBuffSizeUsed - (sizeof(MRA_FT_GET_FILE)+1))) { - bFailed = FALSE; - break; - } - } - - if (bFailed == FALSE) { - HANDLE hFile = CreateFileW(dat->pmfqfFiles[j].lpwszName, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN), nullptr); - if (hFile != INVALID_HANDLE_VALUE) { - bOK = FALSE; - dwUpdateTimeNext = GetTickCount(); - pfts.currentFileNumber = (int)i; - pfts.szCurrentFile.w = dat->pmfqfFiles[j].lpwszName; - pfts.currentFileSize = dat->pmfqfFiles[j].dwSize; - pfts.currentFileProgress = 0; - //pfts.currentFileTime; //as seconds since 1970 - - WideCharToMultiByte(MRA_CODE_PAGE, 0, dat->pmfqfFiles[j].lpwszName, (int)dat->pmfqfFiles[j].dwNameLen, szFileName, _countof(szFileName), nullptr, nullptr); - ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_DATA, (HANDLE)dat->dwIDRequest, (LPARAM)&pfts); - - while (TRUE) { // read and sending - if (ReadFile(hFile, btBuff, dwSendBlockSize, (DWORD*)&dwBuffSizeUsed, nullptr)) { - dwReceived = Netlib_Send(dat->hConnection, (LPSTR)btBuff, (int)dwBuffSizeUsed, 0); - if (dwBuffSizeUsed == dwReceived) { - pfts.currentFileProgress += dwBuffSizeUsed; - pfts.totalProgress += dwBuffSizeUsed; - - // progress updates - dwUpdateTimeCur = GetTickCount(); - if (dwUpdateTimeNext <= dwUpdateTimeCur || pfts.currentFileProgress >= dat->pmfqfFiles[j].dwSize) { // we update it - dwUpdateTimeNext = dwUpdateTimeCur + MRA_FILES_QUEUE_PROGRESS_INTERVAL; - - ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_DATA, (HANDLE)dat->dwIDRequest, (LPARAM)&pfts); - - if (pfts.currentFileProgress >= dat->pmfqfFiles[j].dwSize) { // file received - bOK = TRUE; - break; - } - } - } - else { // err on send file data - dwRetErrorCode = GetLastError(); - ShowFormattedErrorMessage(L"Send files: error on send file data", dwRetErrorCode); - break; - } - } - else {// read failure - dwRetErrorCode = GetLastError(); - ShowFormattedErrorMessage(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_snwprintf(szErrorText, TranslateT("Send files: can't open file %s, error"), dat->pmfqfFiles[j].lpwszName); - ShowFormattedErrorMessage(szErrorText, dwRetErrorCode); - bFailed = TRUE; - break; - } - } - else { - mir_snwprintf(szErrorText, TranslateT("Send files: requested file: %S - not found in send files list."), (((LPSTR)btBuff) + sizeof(MRA_FT_GET_FILE))); - ShowFormattedErrorMessage(szErrorText, NO_ERROR); - bFailed = TRUE; - break; - } - } - else { // err on receive, trash - ShowFormattedErrorMessage(L"Send files: bad file send request - invalid header", NO_ERROR); - bFailed = TRUE; - break; - } - } - else { // bad file name or trash - ShowFormattedErrorMessage(L"Send files: bad file send request - to small packet", NO_ERROR); - bFailed = TRUE; - break; - } - }// end for - - NETLIB_CLOSEHANDLE(dat->hConnection); - } - - if (bFailed) { - CMStringA szEmail; - if (mraGetStringA(dat->hContact, "e-mail", szEmail)) - MraFileTransferAck(FILE_TRANSFER_STATUS_ERROR, szEmail, dat->dwIDRequest, CMStringA()); - - ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, (HANDLE)dat->dwIDRequest, 0); - } - else ProtoBroadcastAck(dat->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, (HANDLE)dat->dwIDRequest, 0); - - mir_cslock l(pmrafqFilesQueue->cs); - MraFilesQueueItemFree(dat); -} diff --git a/protocols/MRA/src/MraFilesQueue.h b/protocols/MRA/src/MraFilesQueue.h deleted file mode 100644 index c833c02fa5..0000000000 --- a/protocols/MRA/src/MraFilesQueue.h +++ /dev/null @@ -1,17 +0,0 @@ -#if !defined(AFX_MRA_FILESQUEUE_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) -#define AFX_MRA_FILESQUEUE_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ - -#pragma once - -INT_PTR CALLBACK MraFilesQueueDlgProcOpts(HWND hWndDlg, UINT msg, WPARAM wParam, LPARAM lParam); - -DWORD MraFilesQueueInitialize(DWORD dwFilesTimeOutInterval, HANDLE *phFilesQueueHandle); -void MraFilesQueueDestroy(HANDLE hFilesQueueHandle); - -void MraFilesQueueConnectionReceived(HNETLIBCONN hNewConnection, DWORD dwRemoteIP, void *pExtra); - -HANDLE MraFilesQueueItemProxyByID(HANDLE hFilesQueueHandle, DWORD dwIDRequest); -DWORD MraFilesQueueStartMrimProxy(HANDLE hFilesQueueHandle, DWORD dwIDRequest); -DWORD MraFilesQueueFree(HANDLE hFilesQueueHandle, DWORD dwCMDNum); - -#endif // !defined(AFX_MRA_FILESQUEUE_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/protocols/MRA/src/MraIcons.cpp b/protocols/MRA/src/MraIcons.cpp deleted file mode 100644 index 7569b3fe53..0000000000 --- a/protocols/MRA/src/MraIcons.cpp +++ /dev/null @@ -1,145 +0,0 @@ -#include "stdafx.h" -#include "MraIcons.h" - -HANDLE hXStatusAdvancedStatusIcons[MRA_XSTATUS_COUNT+4]; - -IconItem gdiMainIcon[1] = -{ - { LPGEN("Main icon"), "main", IDI_MRA } -}; - -IconItem gdiMenuItems[MAIN_MENU_ITEMS_COUNT] = -{ - { MRA_GOTO_INBOX_STR, MRA_GOTO_INBOX, IDI_INBOX }, - { MRA_SHOW_INBOX_STATUS_STR, MRA_SHOW_INBOX_STATUS, IDI_MAIL_NOTIFY }, - { MRA_EDIT_PROFILE_STR, MRA_EDIT_PROFILE, IDI_PROFILE }, - { MRA_MY_ALBUM_STR, MRA_VIEW_ALBUM, IDI_MRA_PHOTO }, - { MRA_MY_BLOGSTATUS_STR, MRA_REPLY_BLOG_STATUS, IDI_BLOGSTATUS }, - { MRA_MY_VIDEO_STR, MRA_VIEW_VIDEO, IDI_MRA_VIDEO }, - { MRA_MY_ANSWERS_STR, MRA_ANSWERS, IDI_MRA_ANSWERS }, - { MRA_MY_WORLD_STR, MRA_WORLD, IDI_MRA_WORLD }, - { MRA_WEB_SEARCH_STR, MRA_WEB_SEARCH, IDI_MRA_WEB_SEARCH }, - { MRA_UPD_ALL_USERS_INFO_STR, MRA_UPD_ALL_USERS_INFO, IDI_PROFILE }, - { MRA_CHK_USERS_AVATARS_STR, MRA_CHK_USERS_AVATARS, IDI_PROFILE }, - { MRA_REQ_AUTH_FOR_ALL_STR, MRA_REQ_AUTH_FOR_ALL, IDI_AUTHRUGUEST } -}; - -IconItem gdiContactMenuItems[CONTACT_MENU_ITEMS_COUNT] = -{ - { MRA_REQ_AUTH_STR, MRA_REQ_AUTH, IDI_AUTHRUGUEST }, - { MRA_GRANT_AUTH_STR, MRA_GRANT_AUTH, IDI_AUTHGRANT }, - { MRA_SEND_EMAIL_STR, MRA_SEND_EMAIL, IDI_INBOX }, - { MRA_SEND_POSTCARD_STR, MRA_SEND_POSTCARD, IDI_MRA_POSTCARD }, - { MRA_VIEW_ALBUM_STR, MRA_VIEW_ALBUM, IDI_MRA_PHOTO }, - { MRA_REPLY_BLOG_STATUS_STR, MRA_REPLY_BLOG_STATUS, IDI_BLOGSTATUS }, - { MRA_VIEW_VIDEO_STR, MRA_VIEW_VIDEO, IDI_MRA_VIDEO }, - { MRA_ANSWERS_STR, MRA_ANSWERS, IDI_MRA_ANSWERS }, - { MRA_WORLD_STR, MRA_WORLD, IDI_MRA_WORLD }, - { MRA_SENDNUDGE_STR, PS_SEND_NUDGE, IDI_MRA_ALARM } -}; - -IconItem gdiExtraStatusIconsItems[ADV_ICON_MAX] = -{ - { ADV_ICON_DELETED_STR, ADV_ICON_DELETED_ID, IDI_DELETED }, - { ADV_ICON_NOT_ON_SERVER_STR, ADV_ICON_NOT_ON_SERVER_ID, IDI_AUTHGRANT }, - { ADV_ICON_NOT_AUTHORIZED_STR, ADV_ICON_NOT_AUTHORIZED_ID, IDI_AUTHRUGUEST }, - { ADV_ICON_PHONE_STR, ADV_ICON_PHONE_ID, IDI_MRA_PHONE }, - { ADV_ICON_BLOGSTATUS_STR, ADV_ICON_BLOGSTATUS_ID, IDI_BLOGSTATUS } -}; - -////////////////////////////////////////////////////////////////////////////////////// - -void CMraProto::OnBuildProtoMenu() -{ - CListCreateMenu(2000060000, 500085000, TRUE, gdiMenuItems, MAIN_MENU_ITEMS_COUNT, hMainMenuItems); -} - -////////////////////////////////////////////////////////////////////////////////////// - -HICON IconLibGetIcon(HANDLE hIcon) -{ - return IconLibGetIconEx(hIcon, LR_SHARED); -} - -HICON IconLibGetIconEx(HANDLE hIcon, DWORD dwFlags) -{ - HICON hiIcon = nullptr; - if (hIcon) { - hiIcon = IcoLib_GetIconByHandle(hIcon); - if ((dwFlags & LR_SHARED) == 0) - hiIcon = CopyIcon(hiIcon); - } - return hiIcon; -} - -////////////////////////////////////////////////////////////////////////////////////// - -void IconsLoad() -{ - g_plugin.registerIcon(LPGEN("Protocols") "/" LPGEN("MRA"), gdiMainIcon, "MRA_"); - g_plugin.registerIcon(LPGEN("Protocols") "/" LPGEN("MRA") "/" LPGEN("Main Menu"), gdiMenuItems, "MRA_"); - g_plugin.registerIcon(LPGEN("Protocols") "/" LPGEN("MRA") "/" LPGEN("Contact Menu"), gdiContactMenuItems, "MRA_"); - g_plugin.registerIcon(LPGEN("Protocols") "/" LPGEN("MRA") "/" LPGEN("Extra status"), gdiExtraStatusIconsItems, "MRA_"); - - g_hMainIcon = IconLibGetIcon(gdiMainIcon[0].hIcolib); -} - -void InitXStatusIcons() -{ - // load libs - wchar_t szBuff[MAX_FILEPATH]; - if (GetModuleFileName(nullptr, szBuff, _countof(szBuff))) { - LPWSTR lpwszFileName; - g_dwMirWorkDirPathLen = GetFullPathName(szBuff, MAX_FILEPATH, g_szMirWorkDirPath, &lpwszFileName); - if (g_dwMirWorkDirPathLen) { - g_dwMirWorkDirPathLen -= mir_wstrlen(lpwszFileName); - g_szMirWorkDirPath[g_dwMirWorkDirPathLen] = 0; - - // load xstatus icons lib - DWORD dwBuffLen; - DWORD dwErrorCode = FindFile(g_szMirWorkDirPath, (DWORD)g_dwMirWorkDirPathLen, L"xstatus_MRA.dll", -1, szBuff, _countof(szBuff), &dwBuffLen); - if (dwErrorCode == NO_ERROR) { - g_hDLLXStatusIcons = LoadLibraryEx(szBuff, nullptr, 0); - if (g_hDLLXStatusIcons) { - dwBuffLen = LoadString(g_hDLLXStatusIcons, IDS_IDENTIFY, szBuff, MAX_FILEPATH); - if (dwBuffLen == 0 || wcsnicmp(L"# Custom Status Icons #", szBuff, 23)) { - FreeLibrary(g_hDLLXStatusIcons); - g_hDLLXStatusIcons = nullptr; - } - } - } - } - } - - GetModuleFileName((g_hDLLXStatusIcons != nullptr) ? g_hDLLXStatusIcons : g_plugin.getInst(), szBuff, _countof(szBuff)); - - SKINICONDESC sid = {}; - sid.section.w = LPGENW("Protocols")L"/" LPGENW("MRA") L"/" LPGENW("Custom Status"); - sid.defaultFile.w = szBuff; - sid.flags = SIDF_ALL_UNICODE; - - hXStatusAdvancedStatusIcons[0] = nullptr; - for (DWORD i = 1; i < MRA_XSTATUS_COUNT+1; i++) { - char szIconName[MAX_PATH]; - mir_snprintf(szIconName, "mra_xstatus%ld", i); - sid.pszName = szIconName; - - int iCurIndex = i+IDI_XSTATUS1-1; - sid.description.w = (wchar_t*)lpcszXStatusNameDef[i]; - sid.iDefaultIndex = -iCurIndex; - - hXStatusAdvancedStatusIcons[i] = g_plugin.addIcon(&sid); - } -} - -void DestroyXStatusIcons() -{ - char szBuff[MAX_PATH]; - - for (DWORD i = 1; i < MRA_XSTATUS_COUNT+1; i++) { - mir_snprintf(szBuff, "mra_xstatus%ld", i); - IcoLib_RemoveIcon(szBuff); - } - - memset(hXStatusAdvancedStatusIcons, 0, sizeof(hXStatusAdvancedStatusIcons)); -} diff --git a/protocols/MRA/src/MraIcons.h b/protocols/MRA/src/MraIcons.h deleted file mode 100644 index 527f3d403f..0000000000 --- a/protocols/MRA/src/MraIcons.h +++ /dev/null @@ -1,10 +0,0 @@ -#if !defined(AFX_MRA_ICONS_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) -#define AFX_MRA_ICONS_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ - - -#pragma once - -HICON IconLibGetIcon(HANDLE hIcon); -HICON IconLibGetIconEx(HANDLE hIcon, DWORD dwFlags); - -#endif // !defined(AFX_MRA_ICONS_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) \ No newline at end of file diff --git a/protocols/MRA/src/MraMPop.cpp b/protocols/MRA/src/MraMPop.cpp deleted file mode 100644 index 397cb0a51b..0000000000 --- a/protocols/MRA/src/MraMPop.cpp +++ /dev/null @@ -1,174 +0,0 @@ -#include "stdafx.h" -#include "MraMPop.h" - -// MPOP_SESSION -struct MRA_MPOP_SESSION_QUEUE : public FIFO_MT -{ - bool bKeyValid; /* lpszMPOPKey contain valid key. */ - LPSTR lpszMPOPKey; /* Key for web auth on mail.ru services. */ - size_t dwMPOPKeySize; /* Key size. */ -}; - -struct MRA_MPOP_SESSION_QUEUE_ITEM : public FIFO_MT_ITEM -{ - LPSTR lpszUrl; /* Url to open. */ - size_t dwUrlSize; -}; - -DWORD MraMPopSessionQueueInitialize(HANDLE *phMPopSessionQueue) -{ - if (!phMPopSessionQueue) - return ERROR_INVALID_HANDLE; - if ((*phMPopSessionQueue)) - return ERROR_ALREADY_INITIALIZED; - - MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue = new MRA_MPOP_SESSION_QUEUE(); - if (!pmpsqMPopSessionQueue) - return GetLastError(); - - *phMPopSessionQueue = (HANDLE)pmpsqMPopSessionQueue; - return NO_ERROR; -} - -void MraMPopSessionQueueClear(HANDLE hQueue) -{ - if (!hQueue) - return; - - MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue = (MRA_MPOP_SESSION_QUEUE*)hQueue; - pmpsqMPopSessionQueue->bKeyValid = false; - mir_free(pmpsqMPopSessionQueue->lpszMPOPKey); - pmpsqMPopSessionQueue->lpszMPOPKey = nullptr; - pmpsqMPopSessionQueue->dwMPOPKeySize = 0; - - MRA_MPOP_SESSION_QUEUE_ITEM *pmpsqi; - while ( !FifoMTItemPop(pmpsqMPopSessionQueue, nullptr, (LPVOID*)&pmpsqi)) - mir_free(pmpsqi); -} - -void MraMPopSessionQueueDestroy(HANDLE hQueue) -{ - if (!hQueue) - return; - - MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue = (MRA_MPOP_SESSION_QUEUE*)hQueue; - MraMPopSessionQueueClear(hQueue); - delete pmpsqMPopSessionQueue; -} - -DWORD CMraProto::MraMPopSessionQueueAddUrl(HANDLE hQueue, const CMStringA &lpszUrl) -{ - if (!hQueue) - return ERROR_INVALID_HANDLE; - if (lpszUrl.IsEmpty()) - return ERROR_INVALID_DATA; - MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue = (MRA_MPOP_SESSION_QUEUE*)hQueue; - MRA_MPOP_SESSION_QUEUE_ITEM *pmpsqi; - - if (!getByte("AutoAuthOnWebServices", MRA_DEFAULT_AUTO_AUTH_ON_WEB_SVCS) || !m_bLoggedIn) { /* Open without web auth. / Not loggedIn. */ - Utils_OpenUrl(lpszUrl); - return NO_ERROR; - } - /* Add to queue. */ - pmpsqi = (MRA_MPOP_SESSION_QUEUE_ITEM*)mir_calloc((sizeof(MRA_MPOP_SESSION_QUEUE_ITEM) + lpszUrl.GetLength() + sizeof(size_t))); - if (!pmpsqi) - return GetLastError(); - - pmpsqi->dwUrlSize = lpszUrl.GetLength(); - pmpsqi->lpszUrl = (LPSTR)(pmpsqi + 1); - memcpy(pmpsqi->lpszUrl, lpszUrl, lpszUrl.GetLength()); - FifoMTItemPush(pmpsqMPopSessionQueue, pmpsqi, (LPVOID)pmpsqi); - MraMPopSessionQueueStart(hQueue); - return NO_ERROR; -} - -DWORD CMraProto::MraMPopSessionQueueAddUrlAndEMail(HANDLE hQueue, const CMStringA &lpszUrl, CMStringA &szEmail) -{ - if (!hQueue) - return ERROR_INVALID_HANDLE; - if (lpszUrl.IsEmpty() || szEmail.IsEmpty()) - return ERROR_INVALID_DATA; - - szEmail.MakeLower(); - - int iStart = 0; - CMStringA szUser = szEmail.Tokenize("@", iStart); - CMStringA szDomain = szEmail.Tokenize("@", iStart); - - CMStringA szUrl; - szUrl.Format("%s/%s/%s", lpszUrl.c_str(), szDomain.c_str(), szUser.c_str()); - return MraMPopSessionQueueAddUrl(hQueue, szUrl); -} - -void CMraProto::MraMPopSessionQueueStart(HANDLE hQueue) -{ - if (!hQueue) - return; - - MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue = (MRA_MPOP_SESSION_QUEUE*)hQueue; - MRA_MPOP_SESSION_QUEUE_ITEM *pmpsqi; - - if (!getByte("AutoAuthOnWebServices", MRA_DEFAULT_AUTO_AUTH_ON_WEB_SVCS) || !m_bLoggedIn) { /* Open without web auth. / Not loggedIn. */ - MraMPopSessionQueueFlush(hQueue); - return; - } - - while ( FifoMTGetCount(pmpsqMPopSessionQueue)) { - if (!pmpsqMPopSessionQueue->bKeyValid) { /* We have no key, try to get one. */ - if (0 == MraSendCMD(MRIM_CS_GET_MPOP_SESSION, nullptr, 0)) /* Fail to send. */ - MraMPopSessionQueueFlush(hQueue); - return; - } - - if ( FifoMTItemPop(pmpsqMPopSessionQueue, nullptr, (LPVOID*)&pmpsqi) == NO_ERROR) { - CMStringA szUrl, szEmail; - if (mraGetStringA(NULL, "e-mail", szEmail)) { - pmpsqMPopSessionQueue->bKeyValid = false; - szEmail.MakeLower(); - szUrl.Format(MRA_MPOP_AUTH_URL, szEmail.c_str(), pmpsqMPopSessionQueue->lpszMPOPKey, pmpsqi->lpszUrl); - Utils_OpenUrl(szUrl); - debugLogA("Opening URL: %s\n", szUrl.c_str()); - } - mir_free(pmpsqi); - } - } -} - -void CMraProto::MraMPopSessionQueueFlush(HANDLE hQueue) -{ - if (!hQueue) - return; - - MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue = (MRA_MPOP_SESSION_QUEUE*)hQueue; - MRA_MPOP_SESSION_QUEUE_ITEM *pmpsqi; - - while (FifoMTItemPop(pmpsqMPopSessionQueue, nullptr, (LPVOID*)&pmpsqi) == NO_ERROR) { - Utils_OpenUrl(pmpsqi->lpszUrl); - mir_free(pmpsqi); - } -} - -DWORD MraMPopSessionQueueSetNewMPopKey(HANDLE hQueue, const CMStringA &szKey) -{ - if (!hQueue) - return ERROR_INVALID_HANDLE; - - MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue = (MRA_MPOP_SESSION_QUEUE*)hQueue; - if (pmpsqMPopSessionQueue->dwMPOPKeySize < (size_t)szKey.GetLength() || szKey.IsEmpty()) { - mir_free(pmpsqMPopSessionQueue->lpszMPOPKey); - pmpsqMPopSessionQueue->lpszMPOPKey = (LPSTR)mir_calloc(szKey.GetLength() + sizeof(size_t)); - } - - if (pmpsqMPopSessionQueue->lpszMPOPKey) { - pmpsqMPopSessionQueue->bKeyValid = true; - pmpsqMPopSessionQueue->dwMPOPKeySize = szKey.GetLength(); - memcpy(pmpsqMPopSessionQueue->lpszMPOPKey, szKey, szKey.GetLength()); - *(pmpsqMPopSessionQueue->lpszMPOPKey + szKey.GetLength()) = 0; - return NO_ERROR; - } - - pmpsqMPopSessionQueue->bKeyValid = false; - pmpsqMPopSessionQueue->lpszMPOPKey = nullptr; - pmpsqMPopSessionQueue->dwMPOPKeySize = 0; - return GetLastError(); -} diff --git a/protocols/MRA/src/MraMPop.h b/protocols/MRA/src/MraMPop.h deleted file mode 100644 index a0a1ee348e..0000000000 --- a/protocols/MRA/src/MraMPop.h +++ /dev/null @@ -1,11 +0,0 @@ -#if !defined(AFX_MRA_MPOP_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) -#define AFX_MRA_MPOP_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ - - -#pragma once - -DWORD MraMPopSessionQueueInitialize (HANDLE *phMPopSessionQueue); -void MraMPopSessionQueueDestroy (HANDLE hMPopSessionQueue); -DWORD MraMPopSessionQueueSetNewMPopKey (HANDLE hMPopSessionQueue, const CMStringA &szKey); - -#endif // !defined(AFX_MRA_MPOP_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/protocols/MRA/src/MraMRIMProxy.cpp b/protocols/MRA/src/MraMRIMProxy.cpp deleted file mode 100644 index c8811720d0..0000000000 --- a/protocols/MRA/src/MraMRIMProxy.cpp +++ /dev/null @@ -1,199 +0,0 @@ -#include "stdafx.h" -#include "MraMRIMProxy.h" -#include "proto.h" - -struct MRA_MRIMPROXY_DATA -{ - LPSTR szEmail; // LPS to - 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] - HNETLIBCONN hConnection; - HANDLE hWaitHandle; // internal -}; - -HANDLE MraMrimProxyCreate() -{ - MRA_MRIMPROXY_DATA *pmmpd = (MRA_MRIMPROXY_DATA*)mir_calloc(sizeof(MRA_MRIMPROXY_DATA)); - return (HANDLE)pmmpd; -} - -DWORD MraMrimProxySetData(HANDLE hMraMrimProxyData, const CMStringA &szEmail, DWORD dwIDRequest, DWORD dwDataType, const CMStringA &lpszUserData, const CMStringA &szAddresses, MRA_GUID *pmguidSessionID) -{ - if (!hMraMrimProxyData) - return ERROR_INVALID_HANDLE; - - MRA_MRIMPROXY_DATA *pmmpd = (MRA_MRIMPROXY_DATA*)hMraMrimProxyData; - - if (!szEmail.IsEmpty()) - replaceStr(pmmpd->szEmail, szEmail); - - if (dwIDRequest) pmmpd->dwIDRequest = dwIDRequest; - if (dwDataType) pmmpd->dwDataType = dwDataType; - - if (!lpszUserData.IsEmpty()) - replaceStr(pmmpd->lpszUserData, lpszUserData); - - if (!szAddresses.IsEmpty()) - MraAddrListGetFromBuff(szAddresses, &pmmpd->malAddrList); - if (pmguidSessionID) - memcpy(&pmmpd->mguidSessionID, pmguidSessionID, sizeof(MRA_GUID)); - - SetEvent(pmmpd->hWaitHandle); - return 0; -} - -void MraMrimProxyFree(HANDLE hMraMrimProxyData) -{ - if (hMraMrimProxyData) { - MRA_MRIMPROXY_DATA *pmmpd = (MRA_MRIMPROXY_DATA*)hMraMrimProxyData; - - CloseHandle(pmmpd->hWaitHandle); - Netlib_CloseHandle(pmmpd->hConnection); - mir_free(pmmpd->szEmail); - mir_free(pmmpd->lpszUserData); - MraAddrListFree(&pmmpd->malAddrList); - mir_free(hMraMrimProxyData); - } -} - -void MraMrimProxyCloseConnection(HANDLE hMraMrimProxyData) -{ - if (hMraMrimProxyData) { - MRA_MRIMPROXY_DATA *pmmpd = (MRA_MRIMPROXY_DATA*)hMraMrimProxyData; - SetEvent(pmmpd->hWaitHandle); - NETLIB_CLOSEHANDLE(pmmpd->hConnection); - } -} - -DWORD CMraProto::MraMrimProxyConnect(HANDLE hMraMrimProxyData, HNETLIBCONN *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) { - CMStringA szAddresses = MraAddrListGetToBuff(&pmmpd->malAddrList); - MraProxyAck(PROXY_STATUS_OK, pmmpd->szEmail, pmmpd->dwIDRequest, pmmpd->dwDataType, pmmpd->lpszUserData, szAddresses, pmmpd->mguidSessionID); - } - // мы инициаторы - else { - pmmpd->hWaitHandle = CreateEvent(nullptr, TRUE, FALSE, nullptr); - if (pmmpd->szEmail) - if (MraProxy(pmmpd->szEmail, pmmpd->dwIDRequest, pmmpd->dwDataType, pmmpd->lpszUserData, "", pmmpd->mguidSessionID)) - WaitForSingleObjectEx(pmmpd->hWaitHandle, INFINITE, FALSE); - - CloseHandle(pmmpd->hWaitHandle); - pmmpd->hWaitHandle = nullptr; - } - - dwRetErrorCode = ERROR_NO_NETWORK; - if (pmmpd->malAddrList.dwAddrCount) { - pmmpd->hConnection = nullptr; - bIsHTTPSProxyUsed = IsHTTPSProxyUsed(m_hNetlibUser); - dwConnectReTryCount = getDword("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.timeout < MRA_TIMEOUT_CONN_MIN) nloc.timeout = MRA_TIMEOUT_CONN_MIN; - if (nloc.timeout > MRA_TIMEOUT_CONN_MAX) nloc.timeout = MRA_TIMEOUT_CONN_MAX; - - // Set up the sockaddr structure - for (size_t i = 0; i < pmmpd->malAddrList.dwAddrCount && dwRetErrorCode != NO_ERROR; i++) { - // через https прокси только 443 порт - if ((pmmpd->malAddrList.pMailAddress[i].dwPort == MRA_SERVER_PORT_HTTPS && bIsHTTPSProxyUsed) || bIsHTTPSProxyUsed == FALSE) { - if (pmmpd->dwDataType == MRIM_PROXY_TYPE_FILES) - ProtoBroadcastAck(MraHContactFromEmail(pmmpd->szEmail, FALSE, TRUE, nullptr), ACKTYPE_FILE, ACKRESULT_CONNECTING, (HANDLE)pmmpd->dwIDRequest, 0); - - nloc.szHost = inet_ntoa((*((in_addr*)&pmmpd->malAddrList.pMailAddress[i].dwAddr))); - nloc.wPort = (WORD)pmmpd->malAddrList.pMailAddress[i].dwPort; - - dwCurConnectReTryCount = dwConnectReTryCount; - do { - pmmpd->hConnection = Netlib_OpenConnection(m_hNetlibUser, &nloc); - } - while (--dwCurConnectReTryCount && pmmpd->hConnection == nullptr); - - if (pmmpd->hConnection) { - 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(MraHContactFromEmail(pmmpd->szEmail, FALSE, TRUE, nullptr), 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 (Netlib_Select(&nls)) { - case SOCKET_ERROR: - case 0:// Time out - dwRetErrorCode = GetLastError(); - ShowFormattedErrorMessage(L"Disconnected, socket error", dwRetErrorCode); - bContinue = FALSE; - break; - - case 1: - if (dwRcvBuffSizeUsed == BUFF_SIZE_RCV_MIN_FREE) { // bad packet - bContinue = FALSE; - _CrtDbgBreak(); - } - else { - dwBytesReceived = Netlib_Recv(nls.hReadConns[0], (LPSTR)(lpbBufferRcv + dwRcvBuffSizeUsed), (int)(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 - _CrtDbgBreak(); - - bContinue = FALSE; - } - else // not all packet received, continue receiving - debugLogA("Not all packet received, continue receiving\n"); - } - else { // bad packet - debugLogA("Bad packet\n"); - _ASSERT(false); - bContinue = FALSE; - } - } - else // packet too small, continue receiving - debugLogA("Packet to small, continue receiving\n"); - } - else { // disconnected - dwRetErrorCode = GetLastError(); - debugLogA("Disconnected, socket read error %d", dwRetErrorCode); - bContinue = FALSE; - } - } - break; - }// end switch - }// end while - } - else dwRetErrorCode = GetLastError(); - }// filtered - }// end for - - if (dwRetErrorCode != NO_ERROR) // кажется не туда подключились :) - NETLIB_CLOSEHANDLE(pmmpd->hConnection); - } - *phConnection = pmmpd->hConnection; - } - else dwRetErrorCode = ERROR_INVALID_HANDLE; - return dwRetErrorCode; -} diff --git a/protocols/MRA/src/MraMRIMProxy.h b/protocols/MRA/src/MraMRIMProxy.h deleted file mode 100644 index 5b8b2ad75a..0000000000 --- a/protocols/MRA/src/MraMRIMProxy.h +++ /dev/null @@ -1,13 +0,0 @@ -#if !defined(AFX_MRA_MRIMPROXY_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) -#define AFX_MRA_MRIMPROXY_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ - - -#pragma once - -DWORD MraMrimProxySetData(HANDLE hMraMrimProxyData, const CMStringA &szEmail, DWORD dwIDRequest, DWORD dwDataType, const CMStringA &lpszUserData, const CMStringA &szAddresses, MRA_GUID *pmguidSessionID); - -HANDLE MraMrimProxyCreate(); -void MraMrimProxyFree(HANDLE hMraMrimProxyData); -void MraMrimProxyCloseConnection(HANDLE hMraMrimProxyData); - -#endif // !defined(AFX_MRA_MRIMPROXY_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/protocols/MRA/src/MraOfflineMsg.cpp b/protocols/MRA/src/MraOfflineMsg.cpp deleted file mode 100644 index 4c2b621c92..0000000000 --- a/protocols/MRA/src/MraOfflineMsg.cpp +++ /dev/null @@ -1,264 +0,0 @@ -#include "stdafx.h" -#include "MraOfflineMsg.h" -#include "MraConstans.h" - -#define LF "\n" -#define LFLF "\n\n" -#define CRLF "\r\n" -#define CRLFCRLF "\r\n\r\n" - -static DWORD MraOfflineMessageConvertTime(INTERNET_TIME *pitTime) -{ - SYSTEMTIME stTime, stUniversalTime; - TIME_ZONE_INFORMATION tziTimeZoneMailRu = {0}; - tziTimeZoneMailRu.Bias = pitTime->lTimeZone/100*60; - tziTimeZoneMailRu.DaylightBias = pitTime->lTimeZone%100; - SystemTimeToTzSpecificLocalTime(&tziTimeZoneMailRu, &pitTime->stTime, &stUniversalTime); - SystemTimeToTzSpecificLocalTime(nullptr, &stUniversalTime, &stTime); - - return (DWORD)MakeTime32FromLocalSystemTime(&stTime); -} - -static DWORD MraOfflineMessageGetHeaderValueLow(LPSTR lpszHeaderLow, size_t dwHeaderSize, LPSTR lpszValueName, size_t dwValueNameSize, LPSTR *plpszValue, size_t *pdwValueSize) -{ - LPSTR lpszValue = (LPSTR)MemoryFind(0, lpszHeaderLow, dwHeaderSize, lpszValueName, dwValueNameSize); - if (lpszValue) { - lpszValue += dwValueNameSize; - LPSTR lpszValueEnd = (LPSTR)MemoryFind((lpszValue-lpszHeaderLow), lpszHeaderLow, dwHeaderSize, CRLF, (sizeof(CRLF)-1)); - if (lpszValueEnd == nullptr) lpszValueEnd = (LPSTR)MemoryFind((lpszValue-lpszHeaderLow), lpszHeaderLow, dwHeaderSize, LF, (sizeof(LF)-1)); - if (lpszValueEnd == nullptr) lpszValueEnd = (LPSTR)(lpszHeaderLow+dwHeaderSize); - - lpszValue = (LPSTR)MemoryFind((lpszValue-lpszHeaderLow), lpszHeaderLow, (lpszValueEnd-lpszHeaderLow), ":", 1); - if (lpszValue) { - lpszValue++; - SkeepSPWSP(lpszValue, lpszValueEnd - lpszValue, plpszValue, pdwValueSize); - return NO_ERROR; - } - } - return ERROR_NOT_FOUND; -} - -static DWORD MraOfflineMessageGetMIMEHeadAndBody(LPCSTR lpszMessage, size_t dwMessageSize, LPSTR *plpszHeader, size_t *pdwHeaderSize, LPSTR *plpszBody, size_t *pdwBodySize) -{ - if (!lpszMessage || !dwMessageSize) - return ERROR_NOT_FOUND; - - // затычка: майл не придерживается RFC и вместо CRLFCRLF ставит LFLF в MIME частях, иногда ставит - LPSTR 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) - return ERROR_NOT_FOUND; - - // нашли начало контента миме части - size_t dwBodySize = (dwMessageSize-(lpszBody-lpszMessage)); - if (plpszHeader) (*plpszHeader) = (LPSTR)lpszMessage; - if (pdwHeaderSize) (*pdwHeaderSize) = ((lpszBody-(sizeof(LFLF)-1))-lpszMessage); - if (plpszBody) (*plpszBody) = lpszBody; - if (pdwBodySize) (*pdwBodySize) = dwBodySize; - return NO_ERROR; -} - -static DWORD MraOfflineMessageGetHeaderValue(LPSTR lpszHeader, LPSTR lpszHeaderLow, size_t dwHeaderSize, LPSTR lpszValueName, size_t dwValueNameSize, CMStringA &plpszValue) -{ - LPSTR lpszValue = (LPSTR)MemoryFind(0, lpszHeaderLow, dwHeaderSize, lpszValueName, dwValueNameSize); - if (lpszValue) { - lpszValue += dwValueNameSize; - LPSTR lpszValueEnd = (LPSTR)MemoryFind((lpszValue-lpszHeaderLow), lpszHeaderLow, dwHeaderSize, CRLF, (sizeof(CRLF)-1)); - if (lpszValueEnd == nullptr) - lpszValueEnd = (LPSTR)MemoryFind((lpszValue-lpszHeaderLow), lpszHeaderLow, dwHeaderSize, LF, (sizeof(LF)-1)); - if (lpszValueEnd == nullptr) - lpszValueEnd = (LPSTR)(lpszHeaderLow+dwHeaderSize); - - lpszValue = (LPSTR)MemoryFind((lpszValue-lpszHeaderLow), lpszHeaderLow, (lpszValueEnd-lpszHeaderLow), ":", 1); - if (lpszValue) { - lpszValue++; - size_t dwValueSize = lpszValueEnd - lpszValue; - lpszValue = lpszHeader + (lpszValue-lpszHeaderLow); - SkeepSPWSP(lpszValue, dwValueSize, &lpszValue, &dwValueSize); - plpszValue = CMStringA(lpszValue, (int)dwValueSize); - return NO_ERROR; - } - } - return ERROR_NOT_FOUND; -} - -static DWORD MraOfflineMessageGetNextMIMEPart(LPSTR lpszBody, size_t dwBodySize, LPSTR lpszBoundary, size_t dwBoundarySize, LPSTR &plpszCurMIMEPos, LPSTR *plpszMIMEPart, size_t *pdwMIMEPartSize) -{ - if (!lpszBody || !dwBodySize) - return ERROR_INVALID_HANDLE; - - LPSTR lpszCurMIMEPos = plpszCurMIMEPos; - - LPSTR 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 = nullptr; - else - _CrtDbgBreak(); - - if (lpszMIMEPart == nullptr) - return ERROR_NO_MORE_ITEMS; - LPSTR lpszTemp = (LPSTR)MemoryFind((lpszMIMEPart-lpszBody), lpszBody, dwBodySize, lpszBoundary, dwBoundarySize); - if (lpszTemp) {// нашли конец миме части с текстом - size_t 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 - _CrtDbgBreak(); - - if (plpszMIMEPart) (*plpszMIMEPart) = lpszMIMEPart; - if (pdwMIMEPartSize) (*pdwMIMEPartSize) = dwMIMEPartSize; - plpszCurMIMEPos = lpszTemp; - return NO_ERROR; - } - } - - return ERROR_NOT_FOUND; -} - -// Сообщение -static DWORD PlainText2message(const CMStringA &szContentType, const CMStringA &szBody, CMStringA &plpsText, DWORD *pdwFlags) -{ - // Content-Type: text/plain; charset = CP-1251 - if ( strstr(szContentType, "utf-16le")) { - // charset = UTF-16LE// предполагаем что оно в base64 - size_t dwTextSize; - ptrA lpszText((LPSTR)mir_base64_decode(szBody, &dwTextSize)); - if (lpszText) { - plpsText = CMStringA(lpszText, (int)dwTextSize); - if (pdwFlags) { - (*pdwFlags) |= MESSAGE_FLAG_v1p16; // set unicode flag if not exist - (*pdwFlags) &= ~MESSAGE_FLAG_CP1251; // reset ansi flag if exist - } - return NO_ERROR; - } - } - else if ( strstr(szContentType, "cp-1251")) { // charset = CP-1251 - plpsText = szBody; - if (pdwFlags) { - (*pdwFlags) &= ~MESSAGE_FLAG_v1p16; // reset unicode flag if exist - (*pdwFlags) |= MESSAGE_FLAG_CP1251; // set ansi flag - } - return NO_ERROR; - } - else _CrtDbgBreak(); - - return ERROR_INVALID_HANDLE; -} - -DWORD MraOfflineMessageGet(const CMStringA &plpsMsg, DWORD &pdwTime, DWORD &pdwFlags, CMStringA &plpsEMail, CMStringA &plpsText, CMStringA &plpsRTFText, CMStringA &plpsMultiChatData) -{ - if (plpsMsg.IsEmpty()) - return ERROR_INVALID_HANDLE; - - LPSTR lpszHeader, lpszBody, lpszContentTypeLow; - size_t dwHeaderSize, dwBodySize, dwContentTypeSize; - CMStringA szTemp; - - if (MraOfflineMessageGetMIMEHeadAndBody(plpsMsg.GetString(), plpsMsg.GetLength(), &lpszHeader, &dwHeaderSize, &lpszBody, &dwBodySize) != NO_ERROR) - return ERROR_INVALID_HANDLE; - - ptrA lpszHeaderLow((LPSTR)mir_calloc(dwHeaderSize)); - if (lpszHeaderLow == NULL) - return ERROR_OUTOFMEMORY; - BuffToLowerCase(lpszHeaderLow, lpszHeader, dwHeaderSize); - - if (MraOfflineMessageGetHeaderValue(lpszHeader, lpszHeaderLow, dwHeaderSize, "date", 4, szTemp) == NO_ERROR) { - INTERNET_TIME itTime; - InternetTimeGetTime(szTemp, itTime); - pdwTime = MraOfflineMessageConvertTime(&itTime); - } - else pdwTime = 0; - - if (MraOfflineMessageGetHeaderValue(lpszHeader, lpszHeaderLow, dwHeaderSize, "x-mrim-flags", 12, szTemp) == NO_ERROR) - pdwFlags = StrHexToUNum32(szTemp, szTemp.GetLength()); - else - pdwFlags = 0; - - DWORD dwMultichatType; - if (MraOfflineMessageGetHeaderValue(lpszHeader, lpszHeaderLow, dwHeaderSize, "x-mrim-multichat-type", 21, szTemp) == NO_ERROR) - dwMultichatType = StrHexToUNum32(szTemp, szTemp.GetLength()); - else - dwMultichatType = 0; - - if (MraOfflineMessageGetHeaderValue(lpszHeader, lpszHeaderLow, dwHeaderSize, "from", 4, plpsEMail) != NO_ERROR) - plpsEMail.Empty(); - - plpsText.Empty(); - plpsRTFText.Empty(); - plpsMultiChatData.Empty(); - - if (MraOfflineMessageGetHeaderValueLow(lpszHeaderLow, dwHeaderSize, "content-type", 12, &lpszContentTypeLow, &dwContentTypeSize) != NO_ERROR) - return ERROR_NOT_FOUND; - - if (MemoryFind(0, lpszContentTypeLow, dwContentTypeSize, "multipart/alternative", 21)) { - // Content-Type: multipart/alternative; boundary = 1217508709J3777283291217508709T31197726 - LPSTR lpszBoundary = (LPSTR)MemoryFind(0, lpszContentTypeLow, dwContentTypeSize, "boundary=", 9); - if (lpszBoundary) { - size_t dwBoundarySize = ((dwContentTypeSize - (lpszBoundary - lpszContentTypeLow)) - 9); - lpszBoundary = lpszHeader + (lpszBoundary + 9 - (LPSTR)lpszHeaderLow); - - int i = 0; - size_t dwMIMEPartSize, dwMIMEHeaderSize, dwMIMEBodySize, dwMIMEContentTypeSize; - LPSTR lpszCurMIMEPos = lpszBody, lpszMIMEPart, lpszMIMEHeader, lpszMIMEBody; - while (MraOfflineMessageGetNextMIMEPart(lpszBody, dwBodySize, lpszBoundary, dwBoundarySize, lpszCurMIMEPos, &lpszMIMEPart, &dwMIMEPartSize) == NO_ERROR) { - if (MraOfflineMessageGetMIMEHeadAndBody(lpszMIMEPart, dwMIMEPartSize, &lpszMIMEHeader, &dwMIMEHeaderSize, &lpszMIMEBody, &dwMIMEBodySize) == NO_ERROR) { - ptrA lpszMIMEHeaderLow((LPSTR)mir_calloc(dwMIMEHeaderSize)); - if (lpszMIMEHeaderLow == NULL) - return ERROR_OUTOFMEMORY; - - BuffToLowerCase(lpszMIMEHeaderLow, lpszMIMEHeader, dwMIMEHeaderSize); - - LPSTR lpszMIMEContentType; - 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 - return PlainText2message(CMStringA(lpszMIMEContentType, (int)dwMIMEContentTypeSize), CMStringA(lpszMIMEBody, (int)dwMIMEBodySize), plpsText, &pdwFlags); - } - if (MemoryFind(0, lpszMIMEContentType, dwMIMEContentTypeSize, "application/x-mrim-rtf", 22)) { - plpsRTFText = CMStringA(lpszMIMEBody, (int)dwMIMEBodySize); - pdwFlags |= MESSAGE_FLAG_RTF; // set RTF flag if not exist - return NO_ERROR; - } - if (MemoryFind(0, lpszMIMEContentType, dwMIMEContentTypeSize, "application/x-mrim+xml", 22)) { - plpsMultiChatData = CMStringA(lpszMIMEBody, (int)dwMIMEBodySize); - pdwFlags |= MESSAGE_FLAG_MULTICHAT; // set MESSAGE_FLAG_MULTICHAT flag if not exist - return NO_ERROR; - } - _CrtDbgBreak(); - } - } - i++; - } - - _ASSERTE((i > 3 || i == 0)); - } - return ERROR_NOT_FOUND; - } - - if (MemoryFind(0, lpszContentTypeLow, dwContentTypeSize, "text/plain", 10)) - return PlainText2message(CMStringA(lpszContentTypeLow, (int)dwContentTypeSize), CMStringA(lpszBody, (int)dwBodySize), plpsText, &pdwFlags); - - if (MemoryFind(0, lpszContentTypeLow, dwContentTypeSize, "application/x-mrim-auth-req", 27)) { // Content-Type: application/x-mrim-auth-req - plpsText = CMStringA(lpszBody, (int)dwBodySize); - return NO_ERROR; - } - - return ERROR_INVALID_HANDLE; -} diff --git a/protocols/MRA/src/MraOfflineMsg.h b/protocols/MRA/src/MraOfflineMsg.h deleted file mode 100644 index 5abb292ec3..0000000000 --- a/protocols/MRA/src/MraOfflineMsg.h +++ /dev/null @@ -1,8 +0,0 @@ -#if !defined(AFX_MRA_OFFLINEMSG_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) -#define AFX_MRA_OFFLINEMSG_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ - -#pragma once - -DWORD MraOfflineMessageGet(const CMStringA &plpsMsg, DWORD &pdwTime, DWORD &pdwFlags, CMStringA &plpsEMail, CMStringA &plpsText, CMStringA &plpsRTFText, CMStringA &plpsMultiChatData); - -#endif // !defined(AFX_MRA_OFFLINEMSG_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/protocols/MRA/src/MraPlaces.h b/protocols/MRA/src/MraPlaces.h deleted file mode 100644 index 98a5e535b2..0000000000 --- a/protocols/MRA/src/MraPlaces.h +++ /dev/null @@ -1,5956 +0,0 @@ -#if !defined(AFX_MRA_PLACES_H__INCLUDED_) -#define AFX_MRA_PLACES_H__INCLUDED_ - - -#pragma once - -#define lpwszOther L"Другое" -//static LPWSTR lpwszOther = L"Другое"; - - -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_snwprintf(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_snwprintf(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, 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, lpwszOther}, - {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, lpwszOther}, - {97, 1061, 0, L"Кабул"}, - {97, 2293, 0, lpwszOther}, - {96, 1062, 0, L"Дакка"}, - {96, 2294, 0, lpwszOther}, - {99, 1063, 0, L"Манама"}, - {99, 2295, 0, lpwszOther}, - {100, 1064, 0, L"Бандар-Сери-Бегаван"}, - {100, 2296, 0, lpwszOther}, - {101, 1065, 0, L"Тхимпху"}, - {101, 2297, 0, lpwszOther}, - {102, 1066, 0, L"Ханой"}, - {102, 2298, 0, lpwszOther}, - {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, lpwszOther}, - {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, lpwszOther}, - {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, lpwszOther}, - {103, 1085, 0, L"Джакарта"}, - {103, 2302, 0, lpwszOther}, - {79, 1086, 0, L"Амман"}, - {79, 2303, 0, lpwszOther}, - {85, 1087, 0, L"Багдад"}, - {85, 2304, 0, lpwszOther}, - {87, 1088, 0, L"Тегеран"}, - {87, 2305, 0, lpwszOther}, - {104, 1089, 0, L"Сана"}, - {104, 2306, 0, lpwszOther}, - {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, lpwszOther}, - {105, 1111, 0, L"Пномпень"}, - {105, 2308, 0, lpwszOther}, - {106, 1112, 0, L"Доха"}, - {106, 2309, 0, lpwszOther}, - {107, 1113, 0, L"Ларнака"}, - {107, 1114, 0, L"Лимассол"}, - {107, 1115, 0, L"Никосия"}, - {107, 2954, 0, L"Пафос"}, - {107, 2310, 0, lpwszOther}, - {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, lpwszOther}, - {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, lpwszOther}, - {29, 1125, 0, L"Пхеньян"}, - {29, 2313, 0, lpwszOther}, - {108, 1126, 0, L"Сеул"}, - {108, 3240, 0, L"Тейджон"}, - {108, 2314, 0, lpwszOther}, - {88, 1127, 0, L"Эль-Кувейт"}, - {88, 2315, 0, lpwszOther}, - {109, 1128, 0, L"Вьентьян"}, - {109, 2316, 0, lpwszOther}, - {110, 1129, 0, L"Бейрут"}, - {110, 2317, 0, lpwszOther}, - {111, 1130, 0, L"Джохор-Бару"}, - {111, 1131, 0, L"Куала-Лумпур"}, - {111, 2318, 0, lpwszOther}, - {112, 1132, 0, L"Мале"}, - {112, 2319, 0, lpwszOther}, - {113, 1133, 0, L"Улан-Батор"}, - {113, 1134, 0, L"Эрдэнэт"}, - {113, 2320, 0, lpwszOther}, - {114, 1135, 0, L"Янгон"}, - {114, 2321, 0, lpwszOther}, - {115, 1136, 0, L"Катманду"}, - {115, 2322, 0, lpwszOther}, - {116, 1137, 0, L"Абу-Даби"}, - {116, 1138, 0, L"Дубай"}, - {116, 1139, 0, L"Шарджа"}, - {116, 2323, 0, lpwszOther}, - {117, 1140, 0, L"Маскат"}, - {117, 2324, 0, lpwszOther}, - {122, 1141, 0, L"Исламабад"}, - {122, 2325, 0, lpwszOther}, - {89, 1072, 0, L"Ашдод"}, - {89, 1073, 0, L"Ашкелон"}, - {89, 1142, 0, L"Газа"}, - {89, 2326, 0, lpwszOther}, - {94, 3250, 0, L"Медина"}, - {94, 1143, 0, L"Эр-Рияд"}, - {94, 2327, 0, lpwszOther}, - {78, 1144, 0, L"Дамаск"}, - {78, 2328, 0, lpwszOther}, - {91, 1145, 0, L"Душанбе"}, - {91, 3307, 0, L"Кайраккум"}, - {91, 3308, 0, L"Худжанд"}, - {91, 2329, 0, lpwszOther}, - {119, 1146, 0, L"Бангкок"}, - {119, 1147, 0, L"Пхукет"}, - {119, 2330, 0, lpwszOther}, - {120, 1148, 0, L"Тайбэй"}, - {120, 2331, 0, lpwszOther}, - {132, 1149, 0, L"Дили"}, - {132, 2332, 0, lpwszOther}, - {90, 1150, 0, L"Ашхабад"}, - {90, 3079, 0, L"Безмеин"}, - {90, 2333, 0, lpwszOther}, - {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, lpwszOther}, - {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, lpwszOther}, - {121, 1165, 0, L"Манила"}, - {121, 3319, 0, L"Себу"}, - {121, 2336, 0, lpwszOther}, - {98, 1166, 0, L"Коломбо"}, - {98, 2337, 0, lpwszOther}, - {75, 3176, 0, L"Исесаки"}, - {75, 3339, 0, L"Корияма"}, - {75, 1167, 0, L"Саппоро"}, - {75, 1168, 0, L"Токио"}, - {75, 2338, 0, lpwszOther}, - {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, lpwszOther}, - {454, 1192, 0, L"Паго-Паго"}, - {454, 2366, 0, lpwszOther}, - {124, 1919, 0, L"Порт-Вила"}, - {124, 2340, 0, lpwszOther}, - {453, 1193, 0, L"Аганья"}, - {453, 2368, 0, lpwszOther}, - {126, 1921, 0, L"Баирики"}, - {126, 2342, 0, lpwszOther}, - {127, 1922, 0, L"Маджуро"}, - {127, 2343, 0, lpwszOther}, - {128, 1923, 0, L"Паликир"}, - {128, 2344, 0, lpwszOther}, - {129, 1924, 0, L"Ярен"}, - {129, 2345, 0, lpwszOther}, - {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, lpwszOther}, - {131, 1930, 0, L"Корор"}, - {131, 2347, 0, lpwszOther}, - {133, 1931, 0, L"Порт-Морсби"}, - {133, 2348, 0, lpwszOther}, - {125, 1920, 0, L"Апиа"}, - {125, 2341, 0, lpwszOther}, - {134, 1932, 0, L"Хониара"}, - {134, 2349, 0, lpwszOther}, - {135, 1933, 0, L"Нукуалофа"}, - {135, 2350, 0, lpwszOther}, - {136, 1934, 0, L"Фунафути"}, - {136, 2351, 0, lpwszOther}, - {137, 1935, 0, L"Сува"}, - {137, 2352, 0, lpwszOther}, - {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, lpwszOther}, - {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, lpwszOther}, - {141, 1239, 0, L"Буэнос-Айрес"}, - {141, 2441, 0, lpwszOther}, - {142, 1240, 0, L"Нассау"}, - {142, 2440, 0, lpwszOther}, - {143, 1241, 0, L"Бриджтаун"}, - {143, 2439, 0, lpwszOther}, - {146, 1242, 0, L"Бельмопан"}, - {146, 2438, 0, lpwszOther}, - {144, 1243, 0, L"Ла-Пас"}, - {144, 2437, 0, lpwszOther}, - {145, 1244, 0, L"Бразилиа"}, - {145, 3094, 0, L"Пассо Фундо"}, - {145, 1245, 0, L"Рио-де-Жанейро"}, - {145, 1246, 0, L"Сан-Паулу"}, - {145, 2436, 0, lpwszOther}, - {147, 1247, 0, L"Каракас"}, - {147, 2435, 0, lpwszOther}, - {452, 1190, 0, L"Шарлотта-Амалия"}, - {452, 2364, 0, lpwszOther}, - {149, 1248, 0, L"Порт-о-Пренс"}, - {149, 2434, 0, lpwszOther}, - {148, 1249, 0, L"Джоржтаун"}, - {148, 2433, 0, lpwszOther}, - {173, 1250, 0, L"Гватемала"}, - {173, 2432, 0, lpwszOther}, - {150, 1251, 0, L"Тегусигальпа"}, - {150, 2431, 0, lpwszOther}, - {151, 1252, 0, L"Сент-Джорджес"}, - {151, 2430, 0, lpwszOther}, - {152, 1253, 0, L"Уманак"}, - {152, 2429, 0, lpwszOther}, - {153, 1254, 0, L"Розо"}, - {153, 2428, 0, lpwszOther}, - {154, 1255, 0, L"Санто-Доминго"}, - {154, 2427, 0, lpwszOther}, - {155, 1256, 0, L"Богота"}, - {155, 2426, 0, lpwszOther}, - {156, 1257, 0, L"Сан-Хосе"}, - {156, 2425, 0, lpwszOther}, - {157, 1258, 0, L"Гавана"}, - {157, 2424, 0, lpwszOther}, - {158, 1259, 0, L"Акапулько"}, - {158, 1260, 0, L"Мехико"}, - {158, 2423, 0, lpwszOther}, - {159, 1261, 0, L"Манагуа"}, - {159, 2422, 0, lpwszOther}, - {160, 1262, 0, L"Панама"}, - {160, 2421, 0, lpwszOther}, - {161, 1263, 0, L"Асунсьон"}, - {161, 2420, 0, lpwszOther}, - {162, 1264, 0, L"Лима"}, - {162, 2419, 0, lpwszOther}, - {163, 1265, 0, L"Сан-Сальвадор"}, - {163, 2418, 0, lpwszOther}, - {164, 1266, 0, L"Кингстаун"}, - {164, 2417, 0, lpwszOther}, - {165, 1267, 0, L"Бастер"}, - {165, 2416, 0, lpwszOther}, - {166, 1268, 0, L"Кастри"}, - {166, 2415, 0, lpwszOther}, - {167, 1269, 0, L"Парамарибо"}, - {167, 2414, 0, lpwszOther}, - {168, 1270, 0, L"Порт-оф-Спейн"}, - {168, 2413, 0, lpwszOther}, - {169, 1271, 0, L"Монтевидео"}, - {169, 2412, 0, lpwszOther}, - {170, 1272, 0, L"Сантьяго"}, - {170, 2411, 0, lpwszOther}, - {171, 1273, 0, L"Гуаякиль"}, - {171, 1274, 0, L"Кито"}, - {171, 2410, 0, lpwszOther}, - {172, 1275, 0, L"Кингстон"}, - {172, 2409, 0, lpwszOther}, - {174, 1854, 0, L"Алжир"}, - {174, 2495, 0, lpwszOther}, - {175, 1855, 0, L"Луанда"}, - {175, 2494, 0, lpwszOther}, - {176, 1856, 0, L"Котону"}, - {176, 1857, 0, L"Порто-Ново"}, - {176, 2493, 0, lpwszOther}, - {177, 1858, 0, L"Габороне"}, - {177, 2492, 0, lpwszOther}, - {178, 1859, 0, L"Уагадугу"}, - {178, 2491, 0, lpwszOther}, - {179, 1860, 0, L"Бужумбуру"}, - {179, 2490, 0, lpwszOther}, - {180, 1861, 0, L"Либревиль"}, - {180, 2489, 0, lpwszOther}, - {181, 1862, 0, L"Банжул"}, - {181, 2488, 0, lpwszOther}, - {182, 1863, 0, L"Аккра"}, - {182, 2487, 0, lpwszOther}, - {183, 1864, 0, L"Конакри"}, - {183, 2486, 0, lpwszOther}, - {184, 1865, 0, L"Бисау"}, - {184, 2485, 0, lpwszOther}, - {185, 1866, 0, L"Джибути"}, - {185, 2484, 0, lpwszOther}, - {186, 3312, 0, L"Дахаб"}, - {186, 1867, 0, L"Каир"}, - {186, 1868, 0, L"Хургада"}, - {186, 2483, 0, lpwszOther}, - {187, 1869, 0, L"Лусака"}, - {187, 2482, 0, lpwszOther}, - {23, 1870, 0, L"Хараре"}, - {23, 2481, 0, lpwszOther}, - {188, 1871, 0, L"Прая"}, - {188, 2480, 0, lpwszOther}, - {189, 1872, 0, L"Яунде"}, - {189, 2479, 0, lpwszOther}, - {190, 1873, 0, L"Найроби"}, - {190, 2478, 0, lpwszOther}, - {191, 1874, 0, L"Морони"}, - {191, 2477, 0, lpwszOther}, - {193, 1875, 0, L"Киншаса"}, - {193, 2476, 0, lpwszOther}, - {192, 1876, 0, L"Браззавиль"}, - {192, 2475, 0, lpwszOther}, - {194, 1877, 0, L"Ямусукро"}, - {194, 2474, 0, lpwszOther}, - {195, 1878, 0, L"Масеру"}, - {195, 2473, 0, lpwszOther}, - {196, 1879, 0, L"Монровия"}, - {196, 2472, 0, lpwszOther}, - {197, 1880, 0, L"Триполи"}, - {197, 2471, 0, lpwszOther}, - {198, 1881, 0, L"Порт-Луи"}, - {198, 2470, 0, lpwszOther}, - {199, 1882, 0, L"Нуакшот"}, - {199, 2469, 0, lpwszOther}, - {200, 1883, 0, L"Антананариву"}, - {200, 2468, 0, lpwszOther}, - {201, 1884, 0, L"Лилонгве"}, - {201, 2467, 0, lpwszOther}, - {202, 1885, 0, L"Бамако"}, - {202, 2466, 0, lpwszOther}, - {203, 1886, 0, L"Агадир"}, - {203, 1887, 0, L"Рабат"}, - {203, 2465, 0, lpwszOther}, - {204, 1888, 0, L"Мапуту"}, - {204, 2464, 0, lpwszOther}, - {205, 1889, 0, L"Виндхук"}, - {205, 2463, 0, lpwszOther}, - {206, 1890, 0, L"Ниамей"}, - {206, 2462, 0, lpwszOther}, - {207, 1891, 0, L"Абуджа"}, - {207, 2461, 0, lpwszOther}, - {208, 1892, 0, L"Кигали"}, - {208, 2460, 0, lpwszOther}, - {209, 1893, 0, L"Сан-Томе"}, - {209, 2459, 0, lpwszOther}, - {210, 1894, 0, L"Мбабане"}, - {210, 2458, 0, lpwszOther}, - {211, 1895, 0, L"Виктория"}, - {211, 2457, 0, lpwszOther}, - {212, 1896, 0, L"Дакар"}, - {212, 2456, 0, lpwszOther}, - {213, 1897, 0, L"Могадишо"}, - {213, 2455, 0, lpwszOther}, - {214, 1898, 0, L"Хартум"}, - {214, 2454, 0, lpwszOther}, - {215, 1899, 0, L"Фритаун"}, - {215, 2453, 0, lpwszOther}, - {216, 1900, 0, L"Дар-эс-Салам"}, - {216, 1901, 0, L"Додома"}, - {216, 2452, 0, lpwszOther}, - {217, 1902, 0, L"Ломе"}, - {217, 2451, 0, lpwszOther}, - {218, 1903, 0, L"Тунис"}, - {218, 2450, 0, lpwszOther}, - {219, 1904, 0, L"Кампала"}, - {219, 2449, 0, lpwszOther}, - {220, 1905, 0, L"Банги"}, - {220, 2448, 0, lpwszOther}, - {222, 1906, 0, L"Нджамена"}, - {222, 2447, 0, lpwszOther}, - {223, 1907, 0, L"Малабо"}, - {223, 2446, 0, lpwszOther}, - {221, 1908, 0, L"Асмэра"}, - {221, 2445, 0, lpwszOther}, - {224, 1909, 0, L"Аддис-Абеба"}, - {224, 2444, 0, lpwszOther}, - {225, 1910, 0, L"Дурбан"}, - {225, 1913, 0, L"Йоханнесбург"}, - {225, 1912, 0, L"Кейптаун"}, - {225, 3033, 0, L"Пайнтаун"}, - {225, 1911, 0, L"Претория"}, - {225, 2443, 0, lpwszOther}, - {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, lpwszOther}, - {32, 612, 0, L"Тирана"}, - {32, 2540, 0, lpwszOther}, - {33, 613, 0, L"Андорра-ла-Велья"}, - {33, 2539, 0, lpwszOther}, - {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, lpwszOther}, - {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, lpwszOther}, - {42, 797, 0, L"Баня-Лука"}, - {42, 799, 0, L"Зеница"}, - {42, 798, 0, L"Сараево"}, - {42, 800, 0, L"Тузла"}, - {42, 2530, 0, lpwszOther}, - {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, lpwszOther}, - {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, lpwszOther}, - {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, lpwszOther}, - {48, 871, 0, L"Афины"}, - {48, 873, 0, L"Ираклион"}, - {48, 3147, 0, L"Корфу"}, - {48, 872, 0, L"Салоники"}, - {48, 3178, 0, L"Халкидики"}, - {48, 2526, 0, lpwszOther}, - {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, lpwszOther}, - {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, lpwszOther}, - {51, 879, 0, L"Рейкьявик"}, - {51, 2523, 0, lpwszOther}, - {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, lpwszOther}, - {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, lpwszOther}, - {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, lpwszOther}, - {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, lpwszOther}, - {55, 920, 0, L"Вадуц"}, - {55, 2518, 0, lpwszOther}, - {56, 3376, 0, L"Бетцдорф"}, - {56, 921, 0, L"Люксембург"}, - {56, 2517, 0, lpwszOther}, - {57, 3142, 0, L"Битола"}, - {57, 922, 0, L"Скопье"}, - {57, 2516, 0, lpwszOther}, - {58, 923, 0, L"Валлетта"}, - {58, 3154, 0, L"Мзида"}, - {58, 924, 0, L"Слима"}, - {58, 2515, 0, lpwszOther}, - {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, lpwszOther}, - {36, 930, 0, L"Монте-Карло"}, - {36, 2513, 0, lpwszOther}, - {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, lpwszOther}, - {61, 3190, 0, L"Кристиансанд"}, - {61, 2857, 0, L"Лиллехаммер"}, - {61, 938, 0, L"Осло"}, - {61, 3355, 0, L"Ставангер"}, - {61, 939, 0, L"Тронхейм"}, - {61, 2511, 0, lpwszOther}, - {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, lpwszOther}, - {35, 949, 0, L"Лиссабон"}, - {35, 950, 0, L"Порто"}, - {35, 2509, 0, lpwszOther}, - {63, 952, 0, L"Брашов"}, - {63, 951, 0, L"Бухарест"}, - {63, 954, 0, L"Констанца"}, - {63, 955, 0, L"Плоешти"}, - {63, 953, 0, L"Яссы"}, - {63, 2508, 0, lpwszOther}, - {64, 956, 0, L"Сан-Марино"}, - {64, 2507, 0, lpwszOther}, - {74, 957, 0, L"Белград"}, - {74, 960, 0, L"Ниш"}, - {74, 958, 0, L"Нови-Сад"}, - {74, 959, 0, L"Сараево"}, - {74, 2506, 0, lpwszOther}, - {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, lpwszOther}, - {66, 968, 0, L"Копар"}, - {66, 967, 0, L"Любляна"}, - {66, 969, 0, L"Марибор"}, - {66, 2504, 0, lpwszOther}, - {67, 970, 0, L"Торсхавн"}, - {67, 2503, 0, lpwszOther}, - {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, lpwszOther}, - {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, lpwszOther}, - {69, 1003, 0, L"Дубровник"}, - {69, 1000, 0, L"Загреб"}, - {69, 1001, 0, L"Задар"}, - {69, 1004, 0, L"Риека"}, - {69, 1002, 0, L"Сплит"}, - {69, 2500, 0, lpwszOther}, - {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, lpwszOther}, - {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, lpwszOther}, - {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, lpwszOther}, - {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"Хаапсалу"}, - {0, 0, 0, NULL} -};//*/ - -/* -static const MRA_COUNTRY mracCountrys[] = -{ - {24, L"Россия"}, - {81, L"Азербайджан"}, - {82, L"Армения"}, - {97, L"Афганистан"}, - {96, L"Бангладеш"}, - {99, L"Бахрейн"}, - {100, L"Бруней-Даруссалам"}, - {101, L"Бутан"}, - {102, L"Вьетнам"}, - {83, L"Грузия"}, - {86, L"Израиль"}, - {95, L"Индия"}, - {103, L"Индонезия"}, - {79, L"Иордания"}, - {85, L"Ирак"}, - {87, L"Иран"}, - {104, L"Йемен"}, - {84, L"Казахстан"}, - {105, L"Камбоджа"}, - {106, L"Катар"}, - {107, L"Кипр"}, - {92, L"Киргизия (Кыргызстан)"}, - {76, L"Китай"}, - {3215, L"Кокосовые острова (Австр.)"}, - {29, L"Корея (КНДР)"}, - {108, L"Корея"}, - {88, L"Кувейт"}, - {109, L"Лаос"}, - {110, L"Ливан"}, - {111, L"Малайзия"}, - {112, L"Мальдивы"}, - {113, L"Монголия"}, - {114, L"Мьянма"}, - {115, L"Непал"}, - {116, L"Объединенные Арабские Эмираты"}, - {117, L"Оман"}, - {3216, L"Остров Рождества (Австр.)"}, - {122, L"Пакистан"}, - {89, L"Палестина"}, - {94, L"Саудовская Аравия"}, - {118, L"Сингапур"}, - {78, L"Сирия"}, - {91, L"Таджикистан"}, - {119, L"Таиланд"}, - {120, L"Тайвань"}, - {132, L"Тимор"}, - {90, L"Туркмения"}, - {77, L"Турция"}, - {93, L"Узбекистан"}, - {121, L"Филиппины"}, - {98, L"Шри Ланка"}, - {75, L"Япония"}, - {123, L"Австралия"}, - {454, L"Американское Самоа"}, - {124, L"Вануату"}, - {453, L"Гуам (США)"}, - {126, L"Кирибати"}, - {127, L"Маршалловы Острова"}, - {128, L"Микронезия (Федеративные Штаты Микронезии)"}, - {129, L"Науру"}, - {3220, L"Ниуэ (Н.Зел.)"}, - {130, L"Новая Зеландия"}, - {3218, L"Новая Каледония (Фр.)"}, - {3221, L"Острова Кука (Н.Зел.)"}, - {3230, L"Острова Херд и Макдональд (Австр.)"}, - {131, L"Палау"}, - {133, L"Папуа - Новая Гвинея"}, - {3222, L"Питкерн (Брит.)"}, - {125, L"Самоа"}, - {3219, L"Сев. Марианские острова (США)"}, - {134, L"Соломоновы Острова"}, - {3223, L"Токелау (Н.Зел.)"}, - {135, L"Тонга"}, - {136, L"Тувалу"}, - {3224, L"Уоллис и Футуна острова (Фр.)"}, - {137, L"Фиджи"}, - {3226, L"Французская Полинезия"}, - {3225, L"Французские Южные территории"}, - {138, L"Канада"}, - {139, L"США"}, - {3200, L"Ангилья (Брит.)"}, - {140, L"Антигуа и Барбуда"}, - {141, L"Аргентина"}, - {3202, L"Аруба (Нид.)"}, - {142, L"Багамы"}, - {143, L"Барбадос"}, - {146, L"Белиз"}, - {3203, L"Бермуды (Брит.)"}, - {144, L"Боливия"}, - {145, L"Бразилия"}, - {147, L"Венесуэла"}, - {3204, L"Виргинские острова (Брит.)"}, - {452, L"Виргинские острова (США)"}, - {149, L"Гаити"}, - {148, L"Гайана"}, - {3205, L"Гваделупа (Фр.)"}, - {173, L"Гватемала"}, - {150, L"Гондурас"}, - {151, L"Гренада"}, - {152, L"Гренландия (Дат.)"}, - {153, L"Доминика"}, - {154, L"Доминиканская Республика"}, - {155, L"Колумбия"}, - {156, L"Коста-Рика"}, - {157, L"Куба"}, - {3208, L"Мартиника (Фр.)"}, - {158, L"Мексика"}, - {3209, L"Монтсеррат (Брит)"}, - {3201, L"Нидерландские Антилы"}, - {159, L"Никарагуа"}, - {3207, L"Остров Кайман (Брит.)"}, - {3211, L"Острова Теркс и Кайкос (Брит.)"}, - {160, L"Панама"}, - {161, L"Парагвай"}, - {162, L"Перу"}, - {163, L"Сальвадор"}, - {164, L"Сент-Винсент и Гренадины"}, - {165, L"Сент-Китс и Невис"}, - {166, L"Сент-Люсия"}, - {3210, L"Сент-Пьер и Микелон (Фр.)"}, - {167, L"Суринам"}, - {168, L"Тринидат и Тобаго"}, - {169, L"Уругвай"}, - {3212, L"Фолклендские острова (Брит.)"}, - {3206, L"Французская Гвиана"}, - {170, L"Чили"}, - {171, L"Эквадор"}, - {3213, L"Юж. Джорджия и Юж. Сандвичевы о-ва (Брит.)"}, - {172, L"Ямайка"}, - {174, L"Алжир"}, - {175, L"Ангола"}, - {176, L"Бенин"}, - {177, L"Ботсвана"}, - {3228, L"Британская территория в Индийском океане"}, - {178, L"Буркина-Фасо"}, - {179, L"Бурунди"}, - {180, L"Габон"}, - {181, L"Гамбия"}, - {182, L"Гана"}, - {183, L"Гвинея"}, - {184, L"Гвинея-Бисау"}, - {185, L"Джибути"}, - {186, L"Египет"}, - {187, L"Замбия"}, - {3198, L"Зап. Сахара"}, - {23, L"Зимбабве"}, - {188, L"Кабо-Верде"}, - {189, L"Камерун"}, - {190, L"Кения"}, - {191, L"Коморы"}, - {193, L"Конго (Заир)"}, - {192, L"Конго"}, - {194, L"Кот-д`Ивуар"}, - {195, L"Лесото"}, - {196, L"Либерия"}, - {197, L"Ливия"}, - {198, L"Маврикий"}, - {199, L"Мавритания"}, - {200, L"Мадагаскар"}, - {3229, L"Майотт (Фр.)"}, - {201, L"Малави"}, - {202, L"Мали"}, - {203, L"Марокко"}, - {204, L"Мозамбик"}, - {205, L"Намибия"}, - {206, L"Нигер"}, - {207, L"Нигерия"}, - {3227, L"Остров Буве (Норв.)"}, - {3197, L"Реюньон (Фр.)"}, - {208, L"Руанда"}, - {209, L"Сан-Томе и Принсипи"}, - {210, L"Свазиленд"}, - {3199, L"Святая Елена (Брит.)"}, - {211, L"Сейшелы"}, - {212, L"Сенегал"}, - {213, L"Сомали"}, - {214, L"Судан"}, - {215, L"Сьерра-Леоне"}, - {216, L"Танзания"}, - {217, L"Того"}, - {218, L"Тунис"}, - {219, L"Уганда"}, - {220, L"Центральноафриканская Республика"}, - {222, L"Чад"}, - {223, L"Экваториальная Гвинея"}, - {221, L"Эритрея"}, - {224, L"Эфиопия"}, - {225, L"Южно-Африканская Республика (ЮАР)"}, - {39, L"Украина"}, - {40, L"Австрия"}, - {32, L"Албания"}, - {33, L"Андорра"}, - {340, L"Белоруссия"}, - {38, L"Бельгия"}, - {41, L"Болгария"}, - {42, L"Босния и Герцеговина"}, - {43, L"Ватикан"}, - {45, L"Великобритания"}, - {44, L"Венгрия"}, - {46, L"Германия"}, - {3193, L"Гернси (Брит.)"}, - {47, L"Гибралтар (Брит.)"}, - {48, L"Греция"}, - {49, L"Дания"}, - {3194, L"Джерси (Брит.)"}, - {50, L"Ирландия"}, - {51, L"Исландия"}, - {34, L"Испания"}, - {52, L"Италия"}, - {53, L"Латвия"}, - {54, L"Литва"}, - {55, L"Лихтенштейн"}, - {56, L"Люксембург"}, - {57, L"Македония"}, - {58, L"Мальта"}, - {59, L"Молдавия"}, - {36, L"Монако"}, - {60, L"Нидерланды"}, - {61, L"Норвегия"}, - {3195, L"Остров Мэн (Брит.)"}, - {62, L"Польша"}, - {35, L"Португалия"}, - {63, L"Румыния"}, - {64, L"Сан-Марино"}, - {74, L"Сербия и Черногория"}, - {65, L"Словакия"}, - {66, L"Словения"}, - {67, L"Фарерские о-ва (Дания)"}, - {68, L"Финляндия"}, - {37, L"Франция"}, - {69, L"Хорватия"}, - {70, L"Чехия"}, - {71, L"Швейцария"}, - {72, L"Швеция"}, - {3196, L"Шпицберген (Норв.)"}, - {73, L"Эстония"}, - {0, NULL} -}; - - - -static const MRA_CITY mracCitys[] = -{ - {24, 25, L"Москва"}, - {24, 226, L"Санкт-Петербург"}, - {24, 233, L"Саха (Якутия)"}, - {24, 232, L"Приморский край"}, - {24, 235, L"Хабаровский край"}, - {24, 227, L"Амурская обл."}, - {24, 229, L"Камчатская обл."}, - {24, 231, L"Магаданская обл."}, - {24, 234, L"Сахалинская обл."}, - {24, 228, L"Еврейская АО"}, - {24, 230, L"Корякский АО"}, - {24, 236, L"Чукотский АО"}, - {24, 237, L"Башкортостан"}, - {24, 240, L"Марий-Эл"}, - {24, 241, L"Мордовия"}, - {24, 248, L"Татарстан"}, - {24, 249, L"Удмуртия"}, - {24, 251, L"Чувашия"}, - {24, 238, L"Кировская обл."}, - {24, 242, L"Нижегородская обл."}, - {24, 243, L"Оренбургская обл."}, - {24, 244, L"Пензенская обл."}, - {24, 245, L"Пермская обл."}, - {24, 246, L"Самарская обл."}, - {24, 247, L"Саратовская обл."}, - {24, 250, L"Ульяновская обл."}, - {24, 239, L"Коми-Пермяцкий АО"}, - {24, 255, L"Карелия"}, - {24, 256, L"Коми"}, - {24, 252, L"Архангельская обл."}, - {24, 253, L"Вологодская обл."}, - {24, 254, L"Калининградская обл."}, - {24, 257, L"Ленинградская обл."}, - {24, 258, L"Мурманская обл."}, - {24, 260, L"Новгородская обл."}, - {24, 261, L"Псковская обл."}, - {24, 259, L"Ненецкий АО"}, - {24, 265, L"Бурятия"}, - {24, 263, L"Республика Алтай"}, - {24, 273, L"Тыва"}, - {24, 275, L"Хакасия"}, - {24, 264, L"Алтайский край"}, - {24, 268, L"Красноярский край"}, - {24, 266, L"Иркутская обл."}, - {24, 267, L"Кемеровская обл."}, - {24, 269, L"Новосибирская обл."}, - {24, 270, L"Омская обл."}, - {24, 272, L"Томская обл."}, - {24, 276, L"Читинская обл."}, - {24, 262, L"Агинский Бурятский АО"}, - {24, 271, L"Таймырский АО"}, - {24, 274, L"Усть-Ордынский Бурятский АО"}, - {24, 277, L"Эвенкийский АО"}, - {24, 278, L"Курганская обл."}, - {24, 279, L"Свердловская обл."}, - {24, 280, L"Тюменская обл."}, - {24, 282, L"Челябинская обл."}, - {24, 281, L"Ханты-Мансийский АО - Югра"}, - {24, 283, L"Ямало-Ненецкий АО"}, - {24, 284, L"Белгородская обл."}, - {24, 285, L"Брянская обл."}, - {24, 286, L"Владимирская обл."}, - {24, 287, L"Воронежская обл."}, - {24, 288, L"Ивановская обл."}, - {24, 289, L"Калужская обл."}, - {24, 290, L"Костромская обл."}, - {24, 291, L"Курская обл."}, - {24, 292, L"Липецкая обл."}, - {24, 293, L"Московская обл."}, - {24, 294, L"Орловская обл."}, - {24, 295, L"Рязанская обл."}, - {24, 296, L"Смоленская обл."}, - {24, 297, L"Тамбовская обл."}, - {24, 298, L"Тверская обл."}, - {24, 299, L"Тульская обл."}, - {24, 300, L"Ярославская обл."}, - {24, 301, L"Адыгея"}, - {24, 304, L"Дагестан"}, - {24, 305, L"Ингушетия"}, - {24, 306, L"Кабардино-Балкария"}, - {24, 307, L"Калмыкия"}, - {24, 308, L"Карачаево-Черкессия"}, - {24, 311, L"Северная Осетия - Алания"}, - {24, 313, L"Чечня"}, - {24, 309, L"Краснодарский край"}, - {24, 312, L"Ставропольский край"}, - {24, 302, L"Астраханская обл."}, - {24, 303, L"Волгоградская обл."}, - {24, 310, L"Ростовская обл."}, - {81, 1055, L"Баку"}, - {81, 1058, L"Гянджа"}, - {81, 1056, L"Нахичевань"}, - {81, 1057, L"Ханкенди"}, - {81, 3153, L"Шеки"}, - {81, 2291, lpwszOther}, - {82, 2932, L"Абовян"}, - {82, 1060, L"Аштарак"}, - {82, 3084, L"Ванадзор"}, - {82, 3011, L"Гюмри"}, - {82, 3306, L"Дилижан"}, - {82, 1059, L"Ереван"}, - {82, 3145, L"Ханкенди"}, - {82, 2292, lpwszOther}, - {97, 1061, L"Кабул"}, - {97, 2293, lpwszOther}, - {96, 1062, L"Дакка"}, - {96, 2294, lpwszOther}, - {99, 1063, L"Манама"}, - {99, 2295, lpwszOther}, - {100, 1064, L"Бандар-Сери-Бегаван"}, - {100, 2296, lpwszOther}, - {101, 1065, L"Тхимпху"}, - {101, 2297, lpwszOther}, - {102, 1066, L"Ханой"}, - {102, 2298, lpwszOther}, - {83, 1067, L"Батуми"}, - {83, 3158, L"Боржоми"}, - {83, 1068, L"Поти"}, - {83, 3129, L"Рустави"}, - {83, 1069, L"Сухуми"}, - {83, 1070, L"Тбилиси"}, - {83, 2299, lpwszOther}, - {86, 3345, L"Ариэль"}, - {86, 1071, L"Афула"}, - {86, 2992, L"Ашдод"}, - {86, 3175, L"Ашкелон"}, - {86, 3363, L"Бат-Ям"}, - {86, 2884, L"Беер-Яков"}, - {86, 3243, L"Бейт-Шемеш"}, - {86, 1074, L"Беэр-Шева"}, - {86, 3348, L"Герцелия"}, - {86, 3241, L"Димона"}, - {86, 1075, L"Иерусалим"}, - {86, 3350, L"Йокнеам-Иллит"}, - {86, 2982, L"Кармиэль"}, - {86, 2971, L"Кфар-Саба"}, - {86, 3136, L"Назарет"}, - {86, 1080, L"Натания"}, - {86, 3303, L"Офаким"}, - {86, 3050, L"Раанана"}, - {86, 3151, L"Рамат Ган"}, - {86, 3141, L"Реховот"}, - {86, 3012, L"Ришон ле Цион"}, - {86, 1081, L"Тверия"}, - {86, 1077, L"Тель-Авив"}, - {86, 1079, L"Хадера"}, - {86, 1078, L"Хайфа"}, - {86, 1076, L"Хеврон"}, - {86, 2929, L"Цфат"}, - {86, 2928, L"Эйлат"}, - {86, 2300, lpwszOther}, - {95, 3315, L"Бангалор"}, - {95, 1082, L"Дели"}, - {95, 1083, L"Джайпур"}, - {95, 3144, L"Калькутта"}, - {95, 3025, L"Мумбаи"}, - {95, 3277, L"Панаджи"}, - {95, 1084, L"Ченнаи"}, - {95, 2301, lpwszOther}, - {103, 1085, L"Джакарта"}, - {103, 2302, lpwszOther}, - {79, 1086, L"Амман"}, - {79, 2303, lpwszOther}, - {85, 1087, L"Багдад"}, - {85, 2304, lpwszOther}, - {87, 1088, L"Тегеран"}, - {87, 2305, lpwszOther}, - {104, 1089, L"Сана"}, - {104, 2306, lpwszOther}, - {84, 1090, L"Актау"}, - {84, 1091, L"Актюбинск"}, - {84, 1092, L"Алма-Ата"}, - {84, 3242, L"Аршалы"}, - {84, 1093, L"Астана"}, - {84, 1094, L"Атырау (Гурьев)"}, - {84, 1095, L"Байконур"}, - {84, 3245, L"Балхаш"}, - {84, 3083, L"Жезказган"}, - {84, 1096, L"Капчагай"}, - {84, 1097, L"Караганда"}, - {84, 1098, L"Кокшетау"}, - {84, 1099, L"Кустанай"}, - {84, 2868, L"Лисаковск"}, - {84, 1100, L"Павлодар"}, - {84, 1101, L"Петропавловск (Сев.-Каз. обл.)"}, - {84, 1102, L"Рудный"}, - {84, 1103, L"Семипалатинск"}, - {84, 1104, L"Степногорск"}, - {84, 3166, L"Талгар"}, - {84, 1105, L"Талды-Курган"}, - {84, 2927, L"Тараз"}, - {84, 1106, L"Темиртау"}, - {84, 1107, L"Уральск"}, - {84, 1108, L"Усть-Каменогорск"}, - {84, 1109, L"Чимкент"}, - {84, 1110, L"Экибастуз"}, - {84, 2307, lpwszOther}, - {105, 1111, L"Пномпень"}, - {105, 2308, lpwszOther}, - {106, 1112, L"Доха"}, - {106, 2309, lpwszOther}, - {107, 1113, L"Ларнака"}, - {107, 1114, L"Лимассол"}, - {107, 1115, L"Никосия"}, - {107, 2954, L"Пафос"}, - {107, 2310, lpwszOther}, - {92, 1116, L"Бишкек"}, - {92, 1117, L"Джалал-Абад"}, - {92, 3027, L"Кара-Балта"}, - {92, 1118, L"Каракол"}, - {92, 1119, L"Ош"}, - {92, 1120, L"Талас"}, - {92, 2933, L"Хайдаркен"}, - {92, 2311, lpwszOther}, - {76, 3214, L"Аомынь (Макао)"}, - {76, 1121, L"Гонконг"}, - {76, 2869, L"Гуанчжоу"}, - {76, 3262, L"Далянь"}, - {76, 1122, L"Пекин"}, - {76, 1123, L"Харбин"}, - {76, 1124, L"Шанхай"}, - {76, 3043, L"Шеньян"}, - {76, 2312, lpwszOther}, - {29, 1125, L"Пхеньян"}, - {29, 2313, lpwszOther}, - {108, 1126, L"Сеул"}, - {108, 3240, L"Тейджон"}, - {108, 2314, lpwszOther}, - {88, 1127, L"Эль-Кувейт"}, - {88, 2315, lpwszOther}, - {109, 1128, L"Вьентьян"}, - {109, 2316, lpwszOther}, - {110, 1129, L"Бейрут"}, - {110, 2317, lpwszOther}, - {111, 1130, L"Джохор-Бару"}, - {111, 1131, L"Куала-Лумпур"}, - {111, 2318, lpwszOther}, - {112, 1132, L"Мале"}, - {112, 2319, lpwszOther}, - {113, 1133, L"Улан-Батор"}, - {113, 1134, L"Эрдэнэт"}, - {113, 2320, lpwszOther}, - {114, 1135, L"Янгон"}, - {114, 2321, lpwszOther}, - {115, 1136, L"Катманду"}, - {115, 2322, lpwszOther}, - {116, 1137, L"Абу-Даби"}, - {116, 1138, L"Дубай"}, - {116, 1139, L"Шарджа"}, - {116, 2323, lpwszOther}, - {117, 1140, L"Маскат"}, - {117, 2324, lpwszOther}, - {122, 1141, L"Исламабад"}, - {122, 2325, lpwszOther}, - {89, 1072, L"Ашдод"}, - {89, 1073, L"Ашкелон"}, - {89, 1142, L"Газа"}, - {89, 2326, lpwszOther}, - {94, 3250, L"Медина"}, - {94, 1143, L"Эр-Рияд"}, - {94, 2327, lpwszOther}, - {78, 1144, L"Дамаск"}, - {78, 2328, lpwszOther}, - {91, 1145, L"Душанбе"}, - {91, 3307, L"Кайраккум"}, - {91, 3308, L"Худжанд"}, - {91, 2329, lpwszOther}, - {119, 1146, L"Бангкок"}, - {119, 1147, L"Пхукет"}, - {119, 2330, lpwszOther}, - {120, 1148, L"Тайбэй"}, - {120, 2331, lpwszOther}, - {132, 1149, L"Дили"}, - {132, 2332, lpwszOther}, - {90, 1150, L"Ашхабад"}, - {90, 3079, L"Безмеин"}, - {90, 2333, lpwszOther}, - {77, 1152, L"Анкара"}, - {77, 1153, L"Анталия"}, - {77, 3080, L"Бурса"}, - {77, 1151, L"Мармарис"}, - {77, 1154, L"Стамбул"}, - {77, 1155, L"Трабзон"}, - {77, 2334, lpwszOther}, - {93, 3362, L"Алмалык"}, - {93, 3137, L"Андижан"}, - {93, 3273, L"Асака"}, - {93, 1156, L"Ахангаран"}, - {93, 1157, L"Бухара"}, - {93, 3167, L"Джизак"}, - {93, 3347, L"Кунград"}, - {93, 1158, L"Навои"}, - {93, 1159, L"Наманган"}, - {93, 1160, L"Самарканд"}, - {93, 1161, L"Ташкент"}, - {93, 1162, L"Ургенч"}, - {93, 1163, L"Фергана"}, - {93, 1164, L"Чирчик"}, - {93, 2335, lpwszOther}, - {121, 1165, L"Манила"}, - {121, 3319, L"Себу"}, - {121, 2336, lpwszOther}, - {98, 1166, L"Коломбо"}, - {98, 2337, lpwszOther}, - {75, 3176, L"Исесаки"}, - {75, 3339, L"Корияма"}, - {75, 1167, L"Саппоро"}, - {75, 1168, L"Токио"}, - {75, 2338, lpwszOther}, - {123, 1914, L"Аделаида"}, - {123, 2957, L"Блэк Рок"}, - {123, 1915, L"Брисбен"}, - {123, 3331, L"Горокан"}, - {123, 1916, L"Канберра"}, - {123, 3001, L"Лидкомб"}, - {123, 1917, L"Мельбурн"}, - {123, 3217, L"Норфолк"}, - {123, 3064, L"Перт"}, - {123, 3020, L"Санта Люсиа"}, - {123, 1918, L"Сидней"}, - {123, 3238, L"Энеабба"}, - {123, 2339, lpwszOther}, - {454, 1192, L"Паго-Паго"}, - {454, 2366, lpwszOther}, - {124, 1919, L"Порт-Вила"}, - {124, 2340, lpwszOther}, - {453, 1193, L"Аганья"}, - {453, 2368, lpwszOther}, - {126, 1921, L"Баирики"}, - {126, 2342, lpwszOther}, - {127, 1922, L"Маджуро"}, - {127, 2343, lpwszOther}, - {128, 1923, L"Паликир"}, - {128, 2344, lpwszOther}, - {129, 1924, L"Ярен"}, - {129, 2345, lpwszOther}, - {130, 1925, L"Веллингтон"}, - {130, 1926, L"Гамильтон"}, - {130, 1928, L"Данидин"}, - {130, 1929, L"Крайстчерч"}, - {130, 3235, L"Кромвель"}, - {130, 1927, L"Окленд"}, - {130, 3323, L"Тауранга"}, - {130, 2346, lpwszOther}, - {131, 1930, L"Корор"}, - {131, 2347, lpwszOther}, - {133, 1931, L"Порт-Морсби"}, - {133, 2348, lpwszOther}, - {125, 1920, L"Апиа"}, - {125, 2341, lpwszOther}, - {134, 1932, L"Хониара"}, - {134, 2349, lpwszOther}, - {135, 1933, L"Нукуалофа"}, - {135, 2350, lpwszOther}, - {136, 1934, L"Фунафути"}, - {136, 2351, lpwszOther}, - {137, 1935, L"Сува"}, - {137, 2352, lpwszOther}, - {138, 3055, L"Барлингтон"}, - {138, 3049, L"Броссард"}, - {138, 3330, L"Бурнаби"}, - {138, 1169, L"Ванкувер"}, - {138, 3106, L"Ватерлоо"}, - {138, 1170, L"Виннипег"}, - {138, 1171, L"Галифакс"}, - {138, 1172, L"Гамильтон"}, - {138, 3365, L"Денвер"}, - {138, 1173, L"Калгари"}, - {138, 3104, L"Камлупс"}, - {138, 3366, L"Каннингтон"}, - {138, 1174, L"Квебек"}, - {138, 2964, L"Кингстон"}, - {138, 3113, L"Коквитлам"}, - {138, 1175, L"Монреаль"}, - {138, 2920, L"Ниагара-Фолс"}, - {138, 2889, L"Норд-Йорк"}, - {138, 1176, L"Оттава"}, - {138, 2903, L"Порт Алберни"}, - {138, 1177, L"Ричмонд"}, - {138, 1178, L"Тимминс"}, - {138, 2946, L"Торнхилл"}, - {138, 1179, L"Торонто"}, - {138, 1180, L"Эдмонтон"}, - {138, 2353, lpwszOther}, - {139, 407, L"Вашингтон"}, - {139, 426, L"Айдахо"}, - {139, 378, L"Айова"}, - {139, 412, L"Алабама"}, - {139, 446, L"Аляска"}, - {139, 434, L"Аризона"}, - {139, 416, L"Арканзас"}, - {139, 428, L"Вайоминг"}, - {139, 440, L"Вашингтон"}, - {139, 352, L"Вермонт"}, - {139, 394, L"Виргиния"}, - {139, 374, L"Висконсин"}, - {139, 448, L"Гавайи"}, - {139, 390, L"Делавер"}, - {139, 402, L"Джорджия"}, - {139, 396, L"Западная Виргиния"}, - {139, 370, L"Иллинойс"}, - {139, 368, L"Индиана"}, - {139, 444, L"Калифорния"}, - {139, 388, L"Канзас"}, - {139, 408, L"Кентукки"}, - {139, 430, L"Колорадо"}, - {139, 358, L"Коннектикут"}, - {139, 418, L"Луизиана"}, - {139, 354, L"Массачусетс"}, - {139, 376, L"Миннесота"}, - {139, 414, L"Миссисипи"}, - {139, 380, L"Миссури"}, - {139, 372, L"Мичиган"}, - {139, 424, L"Монтана"}, - {139, 348, L"Мэн"}, - {139, 392, L"Мэриленд"}, - {139, 386, L"Небраска"}, - {139, 438, L"Невада"}, - {139, 362, L"Нью-Джерси"}, - {139, 360, L"Нью-Йорк"}, - {139, 432, L"Нью-Мексико"}, - {139, 350, L"Нью-Хэмпшир"}, - {139, 366, L"Огайо"}, - {139, 420, L"Оклахома"}, - {139, 442, L"Орегон"}, - {139, 364, L"Пенсильвания"}, - {139, 450, L"Пуэрто-Рико"}, - {139, 356, L"Род-Айленд"}, - {139, 382, L"Северная Дакота"}, - {139, 398, L"Северная Каролина"}, - {139, 410, L"Теннесси"}, - {139, 422, L"Техас"}, - {139, 406, L"Федеральный округ Колумбия"}, - {139, 404, L"Флорида"}, - {139, 384, L"Южная Дакота"}, - {139, 400, L"Южная Каролина"}, - {139, 436, L"Юта"}, - {140, 1238, L"Сент-Джонс"}, - {140, 2442, lpwszOther}, - {141, 1239, L"Буэнос-Айрес"}, - {141, 2441, lpwszOther}, - {142, 1240, L"Нассау"}, - {142, 2440, lpwszOther}, - {143, 1241, L"Бриджтаун"}, - {143, 2439, lpwszOther}, - {146, 1242, L"Бельмопан"}, - {146, 2438, lpwszOther}, - {144, 1243, L"Ла-Пас"}, - {144, 2437, lpwszOther}, - {145, 1244, L"Бразилиа"}, - {145, 3094, L"Пассо Фундо"}, - {145, 1245, L"Рио-де-Жанейро"}, - {145, 1246, L"Сан-Паулу"}, - {145, 2436, lpwszOther}, - {147, 1247, L"Каракас"}, - {147, 2435, lpwszOther}, - {452, 1190, L"Шарлотта-Амалия"}, - {452, 2364, lpwszOther}, - {149, 1248, L"Порт-о-Пренс"}, - {149, 2434, lpwszOther}, - {148, 1249, L"Джоржтаун"}, - {148, 2433, lpwszOther}, - {173, 1250, L"Гватемала"}, - {173, 2432, lpwszOther}, - {150, 1251, L"Тегусигальпа"}, - {150, 2431, lpwszOther}, - {151, 1252, L"Сент-Джорджес"}, - {151, 2430, lpwszOther}, - {152, 1253, L"Уманак"}, - {152, 2429, lpwszOther}, - {153, 1254, L"Розо"}, - {153, 2428, lpwszOther}, - {154, 1255, L"Санто-Доминго"}, - {154, 2427, lpwszOther}, - {155, 1256, L"Богота"}, - {155, 2426, lpwszOther}, - {156, 1257, L"Сан-Хосе"}, - {156, 2425, lpwszOther}, - {157, 1258, L"Гавана"}, - {157, 2424, lpwszOther}, - {158, 1259, L"Акапулько"}, - {158, 1260, L"Мехико"}, - {158, 2423, lpwszOther}, - {159, 1261, L"Манагуа"}, - {159, 2422, lpwszOther}, - {160, 1262, L"Панама"}, - {160, 2421, lpwszOther}, - {161, 1263, L"Асунсьон"}, - {161, 2420, lpwszOther}, - {162, 1264, L"Лима"}, - {162, 2419, lpwszOther}, - {163, 1265, L"Сан-Сальвадор"}, - {163, 2418, lpwszOther}, - {164, 1266, L"Кингстаун"}, - {164, 2417, lpwszOther}, - {165, 1267, L"Бастер"}, - {165, 2416, lpwszOther}, - {166, 1268, L"Кастри"}, - {166, 2415, lpwszOther}, - {167, 1269, L"Парамарибо"}, - {167, 2414, lpwszOther}, - {168, 1270, L"Порт-оф-Спейн"}, - {168, 2413, lpwszOther}, - {169, 1271, L"Монтевидео"}, - {169, 2412, lpwszOther}, - {170, 1272, L"Сантьяго"}, - {170, 2411, lpwszOther}, - {171, 1273, L"Гуаякиль"}, - {171, 1274, L"Кито"}, - {171, 2410, lpwszOther}, - {172, 1275, L"Кингстон"}, - {172, 2409, lpwszOther}, - {174, 1854, L"Алжир"}, - {174, 2495, lpwszOther}, - {175, 1855, L"Луанда"}, - {175, 2494, lpwszOther}, - {176, 1856, L"Котону"}, - {176, 1857, L"Порто-Ново"}, - {176, 2493, lpwszOther}, - {177, 1858, L"Габороне"}, - {177, 2492, lpwszOther}, - {178, 1859, L"Уагадугу"}, - {178, 2491, lpwszOther}, - {179, 1860, L"Бужумбуру"}, - {179, 2490, lpwszOther}, - {180, 1861, L"Либревиль"}, - {180, 2489, lpwszOther}, - {181, 1862, L"Банжул"}, - {181, 2488, lpwszOther}, - {182, 1863, L"Аккра"}, - {182, 2487, lpwszOther}, - {183, 1864, L"Конакри"}, - {183, 2486, lpwszOther}, - {184, 1865, L"Бисау"}, - {184, 2485, lpwszOther}, - {185, 1866, L"Джибути"}, - {185, 2484, lpwszOther}, - {186, 3312, L"Дахаб"}, - {186, 1867, L"Каир"}, - {186, 1868, L"Хургада"}, - {186, 2483, lpwszOther}, - {187, 1869, L"Лусака"}, - {187, 2482, lpwszOther}, - {23, 1870, L"Хараре"}, - {23, 2481, lpwszOther}, - {188, 1871, L"Прая"}, - {188, 2480, lpwszOther}, - {189, 1872, L"Яунде"}, - {189, 2479, lpwszOther}, - {190, 1873, L"Найроби"}, - {190, 2478, lpwszOther}, - {191, 1874, L"Морони"}, - {191, 2477, lpwszOther}, - {193, 1875, L"Киншаса"}, - {193, 2476, lpwszOther}, - {192, 1876, L"Браззавиль"}, - {192, 2475, lpwszOther}, - {194, 1877, L"Ямусукро"}, - {194, 2474, lpwszOther}, - {195, 1878, L"Масеру"}, - {195, 2473, lpwszOther}, - {196, 1879, L"Монровия"}, - {196, 2472, lpwszOther}, - {197, 1880, L"Триполи"}, - {197, 2471, lpwszOther}, - {198, 1881, L"Порт-Луи"}, - {198, 2470, lpwszOther}, - {199, 1882, L"Нуакшот"}, - {199, 2469, lpwszOther}, - {200, 1883, L"Антананариву"}, - {200, 2468, lpwszOther}, - {201, 1884, L"Лилонгве"}, - {201, 2467, lpwszOther}, - {202, 1885, L"Бамако"}, - {202, 2466, lpwszOther}, - {203, 1886, L"Агадир"}, - {203, 1887, L"Рабат"}, - {203, 2465, lpwszOther}, - {204, 1888, L"Мапуту"}, - {204, 2464, lpwszOther}, - {205, 1889, L"Виндхук"}, - {205, 2463, lpwszOther}, - {206, 1890, L"Ниамей"}, - {206, 2462, lpwszOther}, - {207, 1891, L"Абуджа"}, - {207, 2461, lpwszOther}, - {208, 1892, L"Кигали"}, - {208, 2460, lpwszOther}, - {209, 1893, L"Сан-Томе"}, - {209, 2459, lpwszOther}, - {210, 1894, L"Мбабане"}, - {210, 2458, lpwszOther}, - {211, 1895, L"Виктория"}, - {211, 2457, lpwszOther}, - {212, 1896, L"Дакар"}, - {212, 2456, lpwszOther}, - {213, 1897, L"Могадишо"}, - {213, 2455, lpwszOther}, - {214, 1898, L"Хартум"}, - {214, 2454, lpwszOther}, - {215, 1899, L"Фритаун"}, - {215, 2453, lpwszOther}, - {216, 1900, L"Дар-эс-Салам"}, - {216, 1901, L"Додома"}, - {216, 2452, lpwszOther}, - {217, 1902, L"Ломе"}, - {217, 2451, lpwszOther}, - {218, 1903, L"Тунис"}, - {218, 2450, lpwszOther}, - {219, 1904, L"Кампала"}, - {219, 2449, lpwszOther}, - {220, 1905, L"Банги"}, - {220, 2448, lpwszOther}, - {222, 1906, L"Нджамена"}, - {222, 2447, lpwszOther}, - {223, 1907, L"Малабо"}, - {223, 2446, lpwszOther}, - {221, 1908, L"Асмэра"}, - {221, 2445, lpwszOther}, - {224, 1909, L"Аддис-Абеба"}, - {224, 2444, lpwszOther}, - {225, 1910, L"Дурбан"}, - {225, 1913, L"Йоханнесбург"}, - {225, 1912, L"Кейптаун"}, - {225, 3033, L"Пайнтаун"}, - {225, 1911, L"Претория"}, - {225, 2443, lpwszOther}, - {39, 314, L"Киев"}, - {39, 315, L"Винницкая обл."}, - {39, 316, L"Волынская обл."}, - {39, 317, L"Днепропетровская обл."}, - {39, 318, L"Донецкая обл."}, - {39, 319, L"Житомирская обл."}, - {39, 320, L"Закарпатская обл."}, - {39, 321, L"Запорожская обл."}, - {39, 322, L"Ивано-Франковская обл."}, - {39, 323, L"Киевская обл."}, - {39, 324, L"Кировоградская обл."}, - {39, 325, L"Крым"}, - {39, 326, L"Луганская обл."}, - {39, 327, L"Львовская обл."}, - {39, 328, L"Николаевская обл."}, - {39, 329, L"Одесская обл."}, - {39, 330, L"Полтавская обл."}, - {39, 331, L"Ровенская обл."}, - {39, 332, L"Сумская обл."}, - {39, 333, L"Тернопольская обл."}, - {39, 334, L"Харьковская обл."}, - {39, 335, L"Херсонская обл."}, - {39, 336, L"Хмельницкая обл."}, - {39, 337, L"Черкасская обл."}, - {39, 338, L"Черниговская обл."}, - {39, 339, L"Черновицкая обл."}, - {40, 602, L"Бад Халл"}, - {40, 604, L"Брегенц"}, - {40, 603, L"Вена"}, - {40, 608, L"Грац"}, - {40, 606, L"Зальцбург"}, - {40, 3099, L"Зель-ам-Зее"}, - {40, 605, L"Инсбрук"}, - {40, 3174, L"Кирхберг"}, - {40, 609, L"Клагенфурт"}, - {40, 607, L"Линц"}, - {40, 610, L"Обдах"}, - {40, 611, L"Щтубайтал"}, - {40, 2541, lpwszOther}, - {32, 612, L"Тирана"}, - {32, 2540, lpwszOther}, - {33, 613, L"Андорра-ла-Велья"}, - {33, 2539, lpwszOther}, - {340, 341, L"Минск"}, - {340, 342, L"Брестская обл."}, - {340, 343, L"Витебская обл."}, - {340, 344, L"Гомельская обл."}, - {340, 345, L"Гродненская обл."}, - {340, 346, L"Минская обл."}, - {340, 347, L"Могилевская обл."}, - {38, 760, L"Антверпен"}, - {38, 767, L"Арлон"}, - {38, 762, L"Брюгге"}, - {38, 761, L"Брюссель"}, - {38, 763, L"Гент"}, - {38, 769, L"Лувен"}, - {38, 765, L"Льеж"}, - {38, 764, L"Монс"}, - {38, 3117, L"Мортсель"}, - {38, 766, L"Намюр"}, - {38, 768, L"Хасселт"}, - {38, 2532, lpwszOther}, - {41, 3098, L"Банско"}, - {41, 792, L"Благоевград"}, - {41, 770, L"Бургас"}, - {41, 771, L"Бяла"}, - {41, 773, L"Варна"}, - {41, 776, L"Велико-Тырново"}, - {41, 788, L"Видин"}, - {41, 789, L"Враца"}, - {41, 796, L"Габрово"}, - {41, 777, L"Димитровград"}, - {41, 781, L"Каварна"}, - {41, 786, L"Кырджали"}, - {41, 791, L"Кюстендил"}, - {41, 793, L"Лазарджик"}, - {41, 795, L"Ловеч"}, - {41, 787, L"Михайловград"}, - {41, 790, L"Перник"}, - {41, 3133, L"Пирдоп"}, - {41, 794, L"Плевен"}, - {41, 782, L"Пловдив"}, - {41, 780, L"Разград"}, - {41, 779, L"Русе"}, - {41, 774, L"Силистра"}, - {41, 784, L"Сливен"}, - {41, 772, L"София"}, - {41, 775, L"Толбухин"}, - {41, 3116, L"Тырново"}, - {41, 785, L"Хасково"}, - {41, 778, L"Шумен"}, - {41, 783, L"Ямбол"}, - {41, 2531, lpwszOther}, - {42, 797, L"Баня-Лука"}, - {42, 799, L"Зеница"}, - {42, 798, L"Сараево"}, - {42, 800, L"Тузла"}, - {42, 2530, lpwszOther}, - {45, 802, L"Абердин"}, - {45, 3075, L"Айслворт"}, - {45, 801, L"Алнвик"}, - {45, 804, L"Бидефорд"}, - {45, 803, L"Бирмингем"}, - {45, 805, L"Блоксвич"}, - {45, 3168, L"Бостон"}, - {45, 806, L"Брайтон"}, - {45, 807, L"Бредфорд"}, - {45, 808, L"Бристоль"}, - {45, 809, L"Вилленхолл"}, - {45, 3131, L"Воррингтон"}, - {45, 810, L"Вудбридж"}, - {45, 3342, L"Гилфорд"}, - {45, 811, L"Глазго"}, - {45, 812, L"Дадли"}, - {45, 813, L"Дарем"}, - {45, 814, L"Дуглас"}, - {45, 3089, L"Кардиф"}, - {45, 815, L"Кембридж"}, - {45, 816, L"Кентербери"}, - {45, 817, L"Ливерпуль"}, - {45, 818, L"Лидс"}, - {45, 819, L"Лондон"}, - {45, 820, L"Манчестер"}, - {45, 2976, L"Митчем"}, - {45, 2988, L"Мэйденхед"}, - {45, 821, L"Ноттингем"}, - {45, 3088, L"Ньюпорт"}, - {45, 822, L"Оксфорд"}, - {45, 823, L"Плимут"}, - {45, 824, L"Портсмут"}, - {45, 825, L"Престон"}, - {45, 3343, L"Райд"}, - {45, 2867, L"Ридинг"}, - {45, 2986, L"Сент-Албанс"}, - {45, 826, L"Стаффорд"}, - {45, 3063, L"Стокпорт"}, - {45, 827, L"Уэймут"}, - {45, 3140, L"Челтенхэм"}, - {45, 828, L"Честер"}, - {45, 829, L"Шеффилд"}, - {45, 830, L"Эдинбург"}, - {45, 2529, lpwszOther}, - {44, 831, L"Будапешт"}, - {44, 832, L"Геделле"}, - {44, 836, L"Дебрецен"}, - {44, 835, L"Мишкольц"}, - {44, 834, L"Сегед"}, - {44, 833, L"Шиофок"}, - {44, 2528, lpwszOther}, - {46, 3007, L"Аахен"}, - {46, 837, L"Аугсбург"}, - {46, 838, L"Баден-Баден"}, - {46, 3371, L"Бамберг"}, - {46, 839, L"Бергиш-Гладбах"}, - {46, 840, L"Берлин"}, - {46, 841, L"Билефельд"}, - {46, 3163, L"Бовенден"}, - {46, 842, L"Бонн"}, - {46, 843, L"Браденбург"}, - {46, 3015, L"Брауншвейг"}, - {46, 844, L"Бремен"}, - {46, 2921, L"Варштайн"}, - {46, 845, L"Веймар"}, - {46, 846, L"Вупперталь"}, - {46, 847, L"Гамбург"}, - {46, 848, L"Ганновер"}, - {46, 849, L"Гарделеген"}, - {46, 3010, L"Гейдельберг"}, - {46, 850, L"Гота"}, - {46, 851, L"Дармштадт"}, - {46, 3072, L"Дессау"}, - {46, 852, L"Детмольд"}, - {46, 853, L"Дортмунд"}, - {46, 854, L"Дрезден"}, - {46, 855, L"Дюссельдорф"}, - {46, 3082, L"Иффецхайм"}, - {46, 3309, L"Кассел"}, - {46, 856, L"Кельн"}, - {46, 857, L"Киль"}, - {46, 3138, L"Кобленц"}, - {46, 858, L"Крефельд"}, - {46, 859, L"Лейпциг"}, - {46, 2872, L"Лимбург"}, - {46, 2965, L"Линген"}, - {46, 3135, L"Любек"}, - {46, 3156, L"Мангейм"}, - {46, 3192, L"Меерсбург"}, - {46, 860, L"Мюнстер"}, - {46, 861, L"Мюнхен"}, - {46, 2864, L"Нойштадт"}, - {46, 862, L"Нюрнберг"}, - {46, 3009, L"Оффенбург"}, - {46, 2993, L"Падерборн"}, - {46, 863, L"Равенсбург"}, - {46, 864, L"Регенсбург"}, - {46, 865, L"Рейнен"}, - {46, 866, L"Росток"}, - {46, 3191, L"Саарбрюкен"}, - {46, 2974, L"Санкт-Августин"}, - {46, 3127, L"Тюринген"}, - {46, 867, L"Фрайберг"}, - {46, 868, L"Фрайбург"}, - {46, 869, L"Франкфурт-на-Майне"}, - {46, 3373, L"Хемнитц"}, - {46, 3313, L"Хильден"}, - {46, 870, L"Штутгарт"}, - {46, 3045, L"Эрланген"}, - {46, 2906, L"Эшборн"}, - {46, 2527, lpwszOther}, - {48, 871, L"Афины"}, - {48, 873, L"Ираклион"}, - {48, 3147, L"Корфу"}, - {48, 872, L"Салоники"}, - {48, 3178, L"Халкидики"}, - {48, 2526, lpwszOther}, - {49, 3006, L"Архус"}, - {49, 874, L"Копенгаген"}, - {49, 875, L"Оденсе"}, - {49, 3285, L"Ольборг"}, - {49, 876, L"Сванеке"}, - {49, 3126, L"Скиве"}, - {49, 2525, lpwszOther}, - {50, 3377, L"Виклоу"}, - {50, 3067, L"Голвей"}, - {50, 877, L"Дублин"}, - {50, 3065, L"Килларней"}, - {50, 3066, L"Корк"}, - {50, 878, L"Лимерик"}, - {50, 3069, L"Нейс"}, - {50, 3068, L"Типперэри"}, - {50, 2524, lpwszOther}, - {51, 879, L"Рейкьявик"}, - {51, 2523, lpwszOther}, - {34, 880, L"Аликанте"}, - {34, 3125, L"Альмерия"}, - {34, 881, L"Барселона"}, - {34, 890, L"Бильбао"}, - {34, 3076, L"Бланес"}, - {34, 882, L"Валенсия"}, - {34, 3070, L"Ибица"}, - {34, 888, L"Кадис"}, - {34, 886, L"Картахена"}, - {34, 891, L"Ла-Корунья"}, - {34, 3310, L"Лорет де Мар"}, - {34, 883, L"Мадрид"}, - {34, 884, L"Малага"}, - {34, 885, L"Марбелья"}, - {34, 892, L"Овьедо"}, - {34, 3179, L"Пальма де Майорка"}, - {34, 3177, L"Сан-Агустин"}, - {34, 3289, L"Санта-Крус-де-Тенерифе"}, - {34, 889, L"Сарагоса"}, - {34, 887, L"Севилья"}, - {34, 893, L"Хихон"}, - {34, 2522, lpwszOther}, - {52, 3318, L"Аоста"}, - {52, 3278, L"Беллариа"}, - {52, 906, L"Болонья"}, - {52, 894, L"Брешиа"}, - {52, 895, L"Венеция"}, - {52, 905, L"Верона"}, - {52, 896, L"Генуя"}, - {52, 897, L"Лекко"}, - {52, 3369, L"Ливорно"}, - {52, 3327, L"Марсала"}, - {52, 898, L"Милан"}, - {52, 899, L"Модена"}, - {52, 907, L"Неаполь"}, - {52, 908, L"Перуджа"}, - {52, 900, L"Пиза"}, - {52, 901, L"Рим"}, - {52, 3368, L"Сан-Ремо"}, - {52, 3384, L"Сиракуза"}, - {52, 3252, L"Терамо"}, - {52, 902, L"Триест"}, - {52, 903, L"Турин"}, - {52, 3130, L"Фано"}, - {52, 904, L"Флоренция"}, - {52, 2521, lpwszOther}, - {53, 2939, L"Айзкраукле"}, - {53, 3054, L"Валка"}, - {53, 909, L"Даугавпилс"}, - {53, 2934, L"Екабпилс"}, - {53, 913, L"Елгава"}, - {53, 2935, L"Кокнесе"}, - {53, 912, L"Лиепая"}, - {53, 2905, L"Резекне"}, - {53, 911, L"Рига"}, - {53, 2936, L"Саласпилс"}, - {53, 2937, L"Смилтене"}, - {53, 910, L"Юрмала"}, - {53, 2520, lpwszOther}, - {54, 914, L"Вильнюс"}, - {54, 915, L"Висагинас"}, - {54, 916, L"Каунас"}, - {54, 918, L"Клайпеда"}, - {54, 919, L"Паланга"}, - {54, 3173, L"Пеневежис"}, - {54, 917, L"Шауляй"}, - {54, 2519, lpwszOther}, - {55, 920, L"Вадуц"}, - {55, 2518, lpwszOther}, - {56, 3376, L"Бетцдорф"}, - {56, 921, L"Люксембург"}, - {56, 2517, lpwszOther}, - {57, 3142, L"Битола"}, - {57, 922, L"Скопье"}, - {57, 2516, lpwszOther}, - {58, 923, L"Валлетта"}, - {58, 3154, L"Мзида"}, - {58, 924, L"Слима"}, - {58, 2515, lpwszOther}, - {59, 925, L"Бельцы"}, - {59, 926, L"Бендеры"}, - {59, 3234, L"Дубоссары"}, - {59, 3275, L"Кахул"}, - {59, 927, L"Кишинев"}, - {59, 3321, L"Резина"}, - {59, 928, L"Рыбница"}, - {59, 929, L"Тирасполь"}, - {59, 3281, L"Чадыр-Лунга"}, - {59, 2514, lpwszOther}, - {36, 930, L"Монте-Карло"}, - {36, 2513, lpwszOther}, - {60, 931, L"Амстердам"}, - {60, 933, L"Бреда"}, - {60, 932, L"Гаага"}, - {60, 934, L"Гауда"}, - {60, 935, L"Делфт"}, - {60, 2977, L"Донген"}, - {60, 3030, L"Зволле"}, - {60, 3091, L"Ниймеген"}, - {60, 936, L"Роттердам"}, - {60, 937, L"Утрехт"}, - {60, 3044, L"Эйндховен"}, - {60, 3380, L"Эншеде"}, - {60, 2512, lpwszOther}, - {61, 3190, L"Кристиансанд"}, - {61, 2857, L"Лиллехаммер"}, - {61, 938, L"Осло"}, - {61, 3355, L"Ставангер"}, - {61, 939, L"Тронхейм"}, - {61, 2511, lpwszOther}, - {62, 940, L"Белосток"}, - {62, 941, L"Варшава"}, - {62, 3164, L"Вроцлав"}, - {62, 942, L"Гданьск"}, - {62, 943, L"Гливице"}, - {62, 3237, L"Закопане"}, - {62, 3165, L"Зелена Гура"}, - {62, 944, L"Катовице"}, - {62, 945, L"Краков"}, - {62, 3008, L"Лодзь"}, - {62, 3150, L"Ольштын"}, - {62, 946, L"Познань"}, - {62, 947, L"Радом"}, - {62, 948, L"Сопот"}, - {62, 2958, L"Тыхы"}, - {62, 2510, lpwszOther}, - {35, 949, L"Лиссабон"}, - {35, 950, L"Порто"}, - {35, 2509, lpwszOther}, - {63, 952, L"Брашов"}, - {63, 951, L"Бухарест"}, - {63, 954, L"Констанца"}, - {63, 955, L"Плоешти"}, - {63, 953, L"Яссы"}, - {63, 2508, lpwszOther}, - {64, 956, L"Сан-Марино"}, - {64, 2507, lpwszOther}, - {74, 957, L"Белград"}, - {74, 960, L"Ниш"}, - {74, 958, L"Нови-Сад"}, - {74, 959, L"Сараево"}, - {74, 2506, lpwszOther}, - {65, 961, L"Братислава"}, - {65, 962, L"Кошице"}, - {65, 3101, L"Липтов"}, - {65, 963, L"Попрад"}, - {65, 964, L"Прешов"}, - {65, 965, L"Ружемберок"}, - {65, 966, L"Тврдошин"}, - {65, 2505, lpwszOther}, - {66, 968, L"Копар"}, - {66, 967, L"Любляна"}, - {66, 969, L"Марибор"}, - {66, 2504, lpwszOther}, - {67, 970, L"Торсхавн"}, - {67, 2503, lpwszOther}, - {68, 2888, L"Вантаа"}, - {68, 971, L"Васа"}, - {68, 979, L"Котка"}, - {68, 972, L"Коувола"}, - {68, 980, L"Лахти"}, - {68, 973, L"Оулу"}, - {68, 3375, L"Риихимяки"}, - {68, 3159, L"Руовеси"}, - {68, 974, L"Тампере"}, - {68, 975, L"Турку"}, - {68, 976, L"Хельсинки"}, - {68, 977, L"Эспо"}, - {68, 978, L"Ювяскюля"}, - {68, 2502, lpwszOther}, - {37, 996, L"Авиньон"}, - {37, 983, L"Бержерак"}, - {37, 997, L"Блуа"}, - {37, 984, L"Бордо"}, - {37, 998, L"Дижон"}, - {37, 987, L"Канн"}, - {37, 988, L"Кастр"}, - {37, 993, L"Клермон-Ферран"}, - {37, 3037, L"Лилль"}, - {37, 989, L"Лион"}, - {37, 985, L"Марсель"}, - {37, 991, L"Мец"}, - {37, 3161, L"Мобеж"}, - {37, 990, L"Нанси"}, - {37, 994, L"Нант"}, - {37, 995, L"Ницца"}, - {37, 999, L"Орлеан"}, - {37, 981, L"Париж"}, - {37, 3374, L"Перпиньян"}, - {37, 992, L"Руан"}, - {37, 982, L"Страсбург"}, - {37, 986, L"Тулуза"}, - {37, 3314, L"Шамбери"}, - {37, 2501, lpwszOther}, - {69, 1003, L"Дубровник"}, - {69, 1000, L"Загреб"}, - {69, 1001, L"Задар"}, - {69, 1004, L"Риека"}, - {69, 1002, L"Сплит"}, - {69, 2500, lpwszOther}, - {70, 1005, L"Брно"}, - {70, 3291, L"Гавличкув-Брод"}, - {70, 1007, L"Градец-Кралове"}, - {70, 1008, L"Карлови-Вари"}, - {70, 3019, L"Кладрубы"}, - {70, 1010, L"Лоуни"}, - {70, 1009, L"Острава"}, - {70, 1015, L"Пльзень"}, - {70, 3105, L"Правчицка Брана"}, - {70, 1006, L"Прага"}, - {70, 3246, L"Тачов"}, - {70, 1011, L"Тршебич"}, - {70, 1012, L"Усти-над-Лабем"}, - {70, 1014, L"Ческе-Будеевице"}, - {70, 1013, L"Яблонец-над-Нисоу"}, - {70, 2499, lpwszOther}, - {71, 1016, L"Арау"}, - {71, 1019, L"Баден"}, - {71, 1017, L"Базель"}, - {71, 1018, L"Берн"}, - {71, 1020, L"Биль"}, - {71, 1021, L"Винтертур"}, - {71, 1022, L"Давос"}, - {71, 3189, L"Делемонт"}, - {71, 1023, L"Женева"}, - {71, 1024, L"Золотурн"}, - {71, 1025, L"Лозанна"}, - {71, 1026, L"Локарно"}, - {71, 1027, L"Лугано"}, - {71, 1028, L"Люцерн"}, - {71, 1029, L"Монтре"}, - {71, 1030, L"Цюрих"}, - {71, 2498, lpwszOther}, - {72, 2883, L"Арбога"}, - {72, 1031, L"Гетеборг"}, - {72, 1032, L"Кальмар"}, - {72, 1037, L"Лахольм"}, - {72, 1036, L"Лулео"}, - {72, 1042, L"Лунд"}, - {72, 1033, L"Мальме"}, - {72, 1034, L"Стокгольм"}, - {72, 1041, L"Умео"}, - {72, 1039, L"Фалун"}, - {72, 1043, L"Хельсинборг"}, - {72, 1040, L"Хернесанд"}, - {72, 1038, L"Эстерсунд"}, - {72, 2497, lpwszOther}, - {73, 3013, L"Валга"}, - {73, 1044, L"Кейла"}, - {73, 1045, L"Кохтла-Ярве"}, - {73, 1046, L"Маарду"}, - {73, 1047, L"Мыйзакюла"}, - {73, 1048, L"Нарва"}, - {73, 1049, L"Пярну"}, - {73, 1050, L"Раквере"}, - {73, 1051, L"Силламяэ"}, - {73, 1052, L"Таллин"}, - {73, 1053, L"Тарту"}, - {73, 1054, L"Хаапсалу"}, - {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/protocols/MRA/src/MraPopUp.cpp b/protocols/MRA/src/MraPopUp.cpp deleted file mode 100644 index e6d20a55a0..0000000000 --- a/protocols/MRA/src/MraPopUp.cpp +++ /dev/null @@ -1,284 +0,0 @@ -#include "stdafx.h" -#include "MraPopup.h" - -#define POPUPS_TYPES_COUNT 7 -static LPCWSTR lpcwszPopupsTypes[] = -{ - LPGENW("None"), - LPGENW("Debug"), - LPGENW("Information"), - LPGENW("Question"), - LPGENW("Warning"), - LPGENW("Error"), - LPGENW("NewMail"), - nullptr -}; - -INT_PTR CALLBACK MraPopupDlgProcOpts(HWND hWndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - CMraProto *ppro = (CMraProto*)GetWindowLongPtr(hWndDlg, GWLP_USERDATA); - - switch (msg) { - case WM_INITDIALOG: - TranslateDialogDefault(hWndDlg); - SetWindowLongPtr(hWndDlg, GWLP_USERDATA, lParam); - ppro = (CMraProto*)lParam; - { - HWND hWndCombo = GetDlgItem(hWndDlg, IDC_COMBO_POPUP_TYPE); - SendMessage(hWndCombo, CB_RESETCONTENT, 0, 0); - - for (size_t i = 0; i < POPUPS_TYPES_COUNT; i++) { - DWORD 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); - } - 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(ppro->getDword("PopupsEventFilter", MRA_DEFAULT_POPUPS_EVENT_FILTER), dwType); - CheckDlgButton(hWndDlg, IDC_CHK_ENABLE, bEnabled ? BST_CHECKED : BST_UNCHECKED); - - mir_snprintf(szBuff, "PopupType%SUseWinColors", lpcwszPopupsTypes[dwType]); - bUseWinColors = ppro->getByte(szBuff, MRA_DEFAULT_POPUP_USE_WIN_COLORS); - CheckDlgButton(hWndDlg, IDC_CHK_USE_WIN_COLORS, bUseWinColors ? BST_CHECKED : BST_UNCHECKED); - EnableWindow(GetDlgItem(hWndDlg, IDC_CHK_USE_WIN_COLORS), bEnabled); - - mir_snprintf(szBuff, "PopupType%SColorBack", lpcwszPopupsTypes[dwType]); - SendDlgItemMessage(hWndDlg, IDC_POPUP_BACKCOLOR, CPM_SETCOLOUR, 0, ppro->getDword(szBuff, MRA_DEFAULT_POPUP_COLOR_BACK)); - EnableWindow(GetDlgItem(hWndDlg, IDC_POPUP_BACKCOLOR), (bEnabled && bUseWinColors == FALSE)); - - mir_snprintf(szBuff, "PopupType%SColorText", lpcwszPopupsTypes[dwType]); - SendDlgItemMessage(hWndDlg, IDC_POPUP_TEXTCOLOR, CPM_SETCOLOUR, 0, ppro->getDword(szBuff, MRA_DEFAULT_POPUP_COLOR_TEXT)); - EnableWindow(GetDlgItem(hWndDlg, IDC_POPUP_TEXTCOLOR), (bEnabled && bUseWinColors == FALSE)); - - mir_snprintf(szBuff, "PopupType%STimeout", lpcwszPopupsTypes[dwType]); - SetDlgItemInt(hWndDlg, IDC_POPUP_TIMEOUT, ppro->getDword(szBuff, MRA_DEFAULT_POPUP_TIMEOUT), FALSE); - EnableWindow(GetDlgItem(hWndDlg, IDC_POPUP_TIMEOUT), bEnabled); - } - break; - - case IDC_PREVIEW: - for (int i = 0; i < POPUPS_TYPES_COUNT; i++) - ppro->MraPopupShowFromAgentW(i, TranslateW(lpcwszPopupsTypes[i])); - break; - - case IDC_CHK_ENABLE: - case IDC_CHK_USE_WIN_COLORS: - { - BOOL bEnabled = IsDlgButtonChecked(hWndDlg, IDC_CHK_ENABLE); - BOOL bUseWinColors = IsDlgButtonChecked(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); - } - __fallthrough; - - 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 dwType = GET_CURRENT_COMBO_DATA(hWndDlg, IDC_COMBO_POPUP_TYPE); - DWORD dwPopupsEventFilter = ppro->getDword("PopupsEventFilter", MRA_DEFAULT_POPUPS_EVENT_FILTER); - if (IsDlgButtonChecked(hWndDlg, IDC_CHK_ENABLE)) - dwPopupsEventFilter |= (1 << dwType); - else - dwPopupsEventFilter &= ~(1 << dwType); - - ppro->setDword("PopupsEventFilter", dwPopupsEventFilter); - - mir_snprintf(szBuff, "PopupType%SUseWinColors", lpcwszPopupsTypes[dwType]); - ppro->setByte(szBuff, IsDlgButtonChecked(hWndDlg, IDC_CHK_USE_WIN_COLORS)); - - mir_snprintf(szBuff, "PopupType%SColorBack", lpcwszPopupsTypes[dwType]); - ppro->setDword(szBuff, SendDlgItemMessage(hWndDlg, IDC_POPUP_BACKCOLOR, CPM_GETCOLOUR, 0, 0)); - - mir_snprintf(szBuff, "PopupType%SColorText", lpcwszPopupsTypes[dwType]); - ppro->setDword(szBuff, SendDlgItemMessage(hWndDlg, IDC_POPUP_TEXTCOLOR, CPM_GETCOLOUR, 0, 0)); - - mir_snprintf(szBuff, "PopupType%STimeout", lpcwszPopupsTypes[dwType]); - ppro->setDword(szBuff, GetDlgItemInt(hWndDlg, IDC_POPUP_TIMEOUT, nullptr, FALSE)); - } - return TRUE; - } - break; - } - return FALSE; -} - -int CMraProto::OnPopupOptInit(WPARAM wParam, LPARAM) -{ - if (ServiceExists(MS_POPUP_ADDPOPUPT)) { - OPTIONSDIALOGPAGE odp = {}; - odp.dwInitParam = (LPARAM)this; - odp.position = 100000000; - odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_POPUPS); - odp.szTitle.w = m_tszUserName; - odp.szGroup.w = LPGENW("Popups"); - odp.flags = ODPF_BOLDGROUPS | ODPF_UNICODE; - odp.pfnDlgProc = MraPopupDlgProcOpts; - g_plugin.addOptions(wParam, &odp); - } - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// -// ShowPopup - popup plugin support - -struct MraPopupData -{ - CMraProto *ppro; - int iPopupType; -}; - -///////////////////////////////////////////////////////////////////////////////////////// -// Popup plugin window proc - -LRESULT CALLBACK MraPopupDlgProc(HWND hWndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - MraPopupData* dat = (MraPopupData*)PUGetPluginData(hWndDlg); - - switch (msg) { - case UM_INITPOPUP: - if (dat->iPopupType == MRA_POPUP_TYPE_EMAIL_STATUS) { - // update/load avatar - dat->ppro->MraAvatarsQueueGetAvatarSimple(dat->ppro->hAvatarsQueueHandle, GAIF_FORCE, PUGetContact(hWndDlg)); - - // delete old email popup - if (dat->ppro->hWndEMailPopupStatus) - PUDeletePopup(dat->ppro->hWndEMailPopupStatus); - - dat->ppro->hWndEMailPopupStatus = hWndDlg; - } - break; - - case WM_COMMAND: - if (HIWORD(wParam) == STN_CLICKED) { //It was a click on the Popup. - if (dat->iPopupType == MRA_POPUP_TYPE_EMAIL_STATUS) { - CallProtoService(dat->ppro->m_szModuleName, MRA_GOTO_INBOX, 0, 0); - dat->ppro->hWndEMailPopupStatus = nullptr; - } - } - PUDeletePopup(hWndDlg); - break; - - case WM_CONTEXTMENU: - if (dat->iPopupType == MRA_POPUP_TYPE_EMAIL_STATUS) - dat->ppro->hWndEMailPopupStatus = nullptr; - PUDeletePopup(hWndDlg); - break; - - case UM_FREEPLUGINDATA: - if (dat->iPopupType == MRA_POPUP_TYPE_EMAIL_STATUS) - dat->ppro->hWndEMailPopupStatus = nullptr; - mir_free(dat); - break; - } - return DefWindowProc(hWndDlg, msg, wParam, lParam); -} - -void CMraProto::MraPopupShowFromContactW(MCONTACT hContact, DWORD dwType, LPCWSTR lpszMessage) -{ - WCHAR szTitle[MAX_CONTACTNAME]; - CMStringW szNick, szEmail; - mraGetStringW(hContact, "Nick", szNick); - mraGetStringW(hContact, "e-mail", szEmail); - if (hContact) - mir_snwprintf(szTitle, L"%s <%s>", szNick.c_str(), szEmail.c_str()); - else - mir_snwprintf(szTitle, L"%s: %s <%s>", m_tszUserName, szNick.c_str(), szEmail.c_str()); - - MraPopupShowW(hContact, dwType, szTitle, lpszMessage); -} - -void CMraProto::MraPopupShowW(MCONTACT hContact, DWORD dwType, LPWSTR lpszTitle, LPCWSTR lpszMessage) -{ - if (getByte("PopupsEnabled", MRA_DEFAULT_POPUPS_ENABLED)) - if (GetBit(getDword("PopupsEventFilter", MRA_DEFAULT_POPUPS_EVENT_FILTER), dwType)) - if (ServiceExists(MS_POPUP_ADDPOPUPW)) { - // delete old email popup - if (dwType == MRA_POPUP_TYPE_EMAIL_STATUS && hWndEMailPopupStatus) { - PUDeletePopup(hWndEMailPopupStatus); - hWndEMailPopupStatus = nullptr; - } - - POPUPDATAT ppd = { 0 }; - // load icon - switch (dwType) { - case MRA_POPUP_TYPE_NONE:// proto icon - ppd.lchIcon = g_hMainIcon; - break; - case MRA_POPUP_TYPE_DEBUG:// IDI_APPLICATION - ppd.lchIcon = (HICON)LoadImage(nullptr, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED); - break; - case MRA_POPUP_TYPE_INFORMATION:// IDI_INFORMATION - ppd.lchIcon = (HICON)LoadImage(nullptr, IDI_INFORMATION, IMAGE_ICON, 0, 0, LR_SHARED); - break; - case MRA_POPUP_TYPE_QUESTION:// IDI_QUESTION - ppd.lchIcon = (HICON)LoadImage(nullptr, IDI_QUESTION, IMAGE_ICON, 0, 0, LR_SHARED); - break; - case MRA_POPUP_TYPE_WARNING:// IDI_WARNING - ppd.lchIcon = (HICON)LoadImage(nullptr, IDI_WARNING, IMAGE_ICON, 0, 0, LR_SHARED); - break; - case MRA_POPUP_TYPE_ERROR:// IDI_ERROR - ppd.lchIcon = (HICON)LoadImage(nullptr, IDI_ERROR, IMAGE_ICON, 0, 0, LR_SHARED); - break; - case MRA_POPUP_TYPE_EMAIL_STATUS: - ppd.lchIcon = (HICON)LoadImage(g_plugin.getInst(), MAKEINTRESOURCE(IDI_MAIL_NOTIFY), IMAGE_ICON, 0, 0, LR_SHARED); - break; - } - - MraPopupData *dat = (MraPopupData*)mir_calloc(sizeof(MraPopupData)); - dat->iPopupType = dwType; - dat->ppro = this; - - ppd.lchContact = hContact; - if (lpszTitle) - mir_wstrncpy(ppd.lptzContactName, lpszTitle, MAX_CONTACTNAME); - if (lpszMessage) - mir_wstrncpy(ppd.lptzText, lpszMessage, MAX_SECONDLINE); - ppd.PluginWindowProc = MraPopupDlgProc; - ppd.PluginData = dat; - - char szBuff[MAX_PATH]; - mir_snprintf(szBuff, "PopupType%SUseWinColors", lpcwszPopupsTypes[dwType]); - BOOL bUseWinColors = getByte(szBuff, MRA_DEFAULT_POPUP_USE_WIN_COLORS); - if (bUseWinColors) { - ppd.colorBack = GetSysColor(COLOR_BTNFACE); - ppd.colorText = GetSysColor(COLOR_WINDOWTEXT); - } - else { - mir_snprintf(szBuff, "PopupType%SColorBack", lpcwszPopupsTypes[dwType]); - ppd.colorBack = getDword(szBuff, MRA_DEFAULT_POPUP_COLOR_BACK); - - mir_snprintf(szBuff, "PopupType%SColorText", lpcwszPopupsTypes[dwType]); - ppd.colorText = getDword(szBuff, MRA_DEFAULT_POPUP_COLOR_TEXT); - } - - mir_snprintf(szBuff, "PopupType%STimeout", lpcwszPopupsTypes[dwType]); - ppd.iSeconds = getDword(szBuff, MRA_DEFAULT_POPUP_TIMEOUT); - - if (dat->iPopupType == MRA_POPUP_TYPE_EMAIL_STATUS && dat->ppro->hWndEMailPopupStatus) - PUChangeTextW(dat->ppro->hWndEMailPopupStatus, ppd.lpwzText); - else - PUAddPopupW(&ppd); - } -} diff --git a/protocols/MRA/src/MraPopUp.h b/protocols/MRA/src/MraPopUp.h deleted file mode 100644 index 893aac7546..0000000000 --- a/protocols/MRA/src/MraPopUp.h +++ /dev/null @@ -1,15 +0,0 @@ -#if !defined(AFX_MRA_POPUP_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) -#define AFX_MRA_POPUP_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ - - -#pragma once - -#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 // - -#endif // !defined(AFX_MRA_POPUP_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/protocols/MRA/src/MraProto.cpp b/protocols/MRA/src/MraProto.cpp deleted file mode 100644 index 5cc4d7de2d..0000000000 --- a/protocols/MRA/src/MraProto.cpp +++ /dev/null @@ -1,554 +0,0 @@ -#include "stdafx.h" - -static int MraExtraIconsApplyAll(WPARAM, LPARAM) -{ - for (auto &it : CMPlugin::g_arInstances) - it->MraExtraIconsApply(0, 0); - return 0; -} - -CMraProto::CMraProto(const char* _module, const wchar_t* _displayName) : - PROTO(_module, _displayName), - m_bLoggedIn(false), - m_groups(5, NumericKeySortT) -{ - MraSendQueueInitialize(0, &hSendQueueHandle); - MraFilesQueueInitialize(0, &hFilesQueueHandle); - MraMPopSessionQueueInitialize(&hMPopSessionQueue);//getByte("AutoAuthOnWebServices", MRA_DEFAULT_AUTO_AUTH_ON_WEB_SVCS) - MraAvatarsQueueInitialize(&hAvatarsQueueHandle); - - CreateProtoService(PS_SETCUSTOMSTATUSEX, &CMraProto::MraSetXStatusEx); - CreateProtoService(PS_GETCUSTOMSTATUSEX, &CMraProto::MraGetXStatusEx); - CreateProtoService(PS_GETCUSTOMSTATUSICON, &CMraProto::MraGetXStatusIcon); - - CreateProtoService(PS_SET_LISTENINGTO, &CMraProto::MraSetListeningTo); - - CreateProtoService(PS_CREATEACCMGRUI, &CMraProto::MraCreateAccMgrUI); - CreateProtoService(PS_GETAVATARCAPS, &CMraProto::MraGetAvatarCaps); - CreateProtoService(PS_GETAVATARINFO, &CMraProto::MraGetAvatarInfo); - CreateProtoService(PS_GETMYAVATAR, &CMraProto::MraGetMyAvatar); - - CreateProtoService(MS_ICQ_SENDSMS, &CMraProto::MraSendSMS); - CreateProtoService(PS_SEND_NUDGE, &CMraProto::MraSendNudge); - CreateProtoService(PS_GETUNREADEMAILCOUNT, &CMraProto::GetUnreadEmailCount); - - HookProtoEvent(ME_OPT_INITIALISE, &CMraProto::OnOptionsInit); - HookProtoEvent(ME_DB_CONTACT_DELETED, &CMraProto::MraContactDeleted); - HookProtoEvent(ME_DB_CONTACT_SETTINGCHANGED, &CMraProto::MraDbSettingChanged); - - m_heNudgeReceived = CreateProtoEvent(PE_NUDGE); - - wchar_t name[MAX_PATH]; - mir_snwprintf(name, TranslateT("%s connection"), m_tszUserName); - - NETLIBUSER nlu = {}; - nlu.flags = NUF_INCOMING | NUF_OUTGOING | NUF_HTTPCONNS | NUF_UNICODE; - nlu.szSettingsModule = m_szModuleName; - nlu.szDescriptiveName.w = name; - m_hNetlibUser = Netlib_RegisterUser(&nlu); - - InitMenus(); - - mir_snprintf(szNewMailSound, "%s_new_email", m_szModuleName); - g_plugin.addSound(szNewMailSound, m_tszUserName, MRA_SOUND_NEW_EMAIL); - - HookProtoEvent(ME_CLIST_PREBUILDSTATUSMENU, &CMraProto::MraRebuildStatusMenu); - - hExtraXstatusIcon = ExtraIcon_RegisterIcolib("MRAXstatus", LPGEN("Mail.ru xStatus"), "mra_xstatus25"); - hExtraInfo = ExtraIcon_RegisterIcolib("MRAStatus", LPGEN("Mail.ru extra info"), MRA_XSTATUS_UNKNOWN_STR); - - m_bHideXStatusUI = false; - m_iXStatus = getByte(DBSETTING_XSTATUSID, MRA_MIR_XSTATUS_NONE); - if (!IsXStatusValid(m_iXStatus)) - m_iXStatus = MRA_MIR_XSTATUS_NONE; -} - -CMraProto::~CMraProto() -{ - Netlib_CloseHandle(m_hNetlibUser); - - DestroyHookableEvent(m_heNudgeReceived); - - MraAvatarsQueueDestroy(hAvatarsQueueHandle); - MraMPopSessionQueueDestroy(hMPopSessionQueue); - MraFilesQueueDestroy(hFilesQueueHandle); - MraSendQueueDestroy(hSendQueueHandle); -} - -INT_PTR CMraProto::MraCreateAccMgrUI(WPARAM, LPARAM lParam) -{ - return (INT_PTR)CreateDialogParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_MRAACCOUNT), - (HWND)lParam, DlgProcAccount, LPARAM(this)); -} - -void CMraProto::OnModulesLoaded() -{ - HookProtoEvent(ME_CLIST_EXTRA_IMAGE_APPLY, &CMraProto::MraExtraIconsApply); - HookProtoEvent(ME_CLIST_PREBUILDCONTACTMENU, &CMraProto::MraRebuildContactMenu); - HookProtoEvent(ME_WAT_NEWSTATUS, &CMraProto::MraMusicChanged); - HookProtoEvent(ME_CLIST_GROUPCHANGE, &CMraProto::OnGroupChanged); - - // всех в offline // тк unsaved values сохран¤ютс¤ их нужно инициализировать - for (auto &hContact : AccContacts()) - SetContactBasicInfoW(hContact, SCBIFSI_LOCK_CHANGES_EVENTS, (SCBIF_ID | SCBIF_GROUP_ID | SCBIF_SERVER_FLAG | SCBIF_STATUS), -1, -1, 0, 0, ID_STATUS_OFFLINE, nullptr, nullptr, nullptr); - - // unsaved values - db_set_resident(m_szModuleName, "LogonTS"); - db_set_resident(m_szModuleName, "ContactID"); - db_set_resident(m_szModuleName, "GroupID"); - db_set_resident(m_szModuleName, "ContactFlags"); - db_set_resident(m_szModuleName, "ContactServerFlags"); - db_set_resident(m_szModuleName, "HooksLocked"); - db_set_resident(m_szModuleName, DBSETTING_CAPABILITIES); - db_set_resident(m_szModuleName, DBSETTING_XSTATUSNAME); - db_set_resident(m_szModuleName, DBSETTING_XSTATUSMSG); - db_set_resident(m_szModuleName, DBSETTING_BLOGSTATUSTIME); - db_set_resident(m_szModuleName, DBSETTING_BLOGSTATUSID); - db_set_resident(m_szModuleName, DBSETTING_BLOGSTATUS); - db_set_resident(m_szModuleName, DBSETTING_BLOGSTATUSMUSIC); - - // destroy all chat sessions - bChatExists = MraChatRegister(); -} - -void CMraProto::OnShutdown() -{ - m_bShutdown = true; - SetStatus(ID_STATUS_OFFLINE); - - if (hAvatarsQueueHandle != nullptr) - MraAvatarsQueueSuspend(hAvatarsQueueHandle); -} - -///////////////////////////////////////////////////////////////////////////////////////// - -MCONTACT CMraProto::AddToListByEmail(LPCTSTR plpsEMail, LPCTSTR plpsNick, LPCTSTR plpsFirstName, LPCTSTR plpsLastName, DWORD dwFlags) -{ - if (!plpsEMail) - return NULL; - - BOOL bAdded; - MCONTACT hContact = MraHContactFromEmail(plpsEMail, TRUE, TRUE, &bAdded); - if (hContact == NULL) - return NULL; - - if (plpsNick) - mraSetStringW(hContact, "Nick", plpsNick); - if (plpsFirstName) - mraSetStringW(hContact, "FirstName", plpsFirstName); - if (plpsLastName) - mraSetStringW(hContact, "LastName", plpsLastName); - - if (dwFlags & PALF_TEMPORARY) - db_set_b(hContact, "CList", "Hidden", 1); - else - db_unset(hContact, "CList", "NotOnList"); - - if (bAdded) - MraUpdateContactInfo(hContact); - return hContact; -} - -MCONTACT CMraProto::AddToList(int flags, PROTOSEARCHRESULT *psr) -{ - if (psr->cbSize != sizeof(PROTOSEARCHRESULT)) - return 0; - - return AddToListByEmail(psr->email.w, psr->nick.w, psr->firstName.w, psr->lastName.w, flags); -} - -MCONTACT CMraProto::AddToListByEvent(int, int, MEVENT hDbEvent) -{ - DBEVENTINFO dbei = {}; - if ((dbei.cbBlob = db_event_getBlobSize(hDbEvent)) != -1) { - dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); - if (db_event_get(hDbEvent, &dbei) == 0 && - !mir_strcmp(dbei.szModule, m_szModuleName) && - (dbei.eventType == EVENTTYPE_AUTHREQUEST || dbei.eventType == EVENTTYPE_CONTACTS)) - { - DB_AUTH_BLOB blob(dbei.pBlob); - return AddToListByEmail(dbei.getString(blob.get_email()), dbei.getString(blob.get_nick()), dbei.getString(blob.get_firstName()), dbei.getString(blob.get_lastName()), 0); - } - } - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -int CMraProto::Authorize(MEVENT hDBEvent) -{ - if (!m_bLoggedIn) return 1; - - DBEVENTINFO dbei = {}; - if ((dbei.cbBlob = db_event_getBlobSize(hDBEvent)) == -1) - return 1; - - dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); - if (db_event_get(hDBEvent, &dbei)) return 1; - if (dbei.eventType != EVENTTYPE_AUTHREQUEST) return 1; - if (mir_strcmp(dbei.szModule, m_szModuleName)) return 1; - - DB_AUTH_BLOB blob(dbei.pBlob); - MraAuthorize(blob.get_email()); - return 0; -} - -int CMraProto::AuthDeny(MEVENT hDBEvent, const wchar_t* szReason) -{ - if (!m_bLoggedIn) return 1; - - DBEVENTINFO dbei = {}; - if ((dbei.cbBlob = db_event_getBlobSize(hDBEvent)) == -1) - return 1; - - dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); - if (db_event_get(hDBEvent, &dbei)) return 1; - if (dbei.eventType != EVENTTYPE_AUTHREQUEST) return 1; - if (mir_strcmp(dbei.szModule, m_szModuleName)) return 1; - - DB_AUTH_BLOB blob(dbei.pBlob); - MraMessage(FALSE, NULL, 0, 0, blob.get_email(), szReason, nullptr, 0); - return 0; -} - -int CMraProto::AuthRecv(MCONTACT, PROTORECVEVENT* pre) -{ - return Proto_AuthRecv(m_szModuleName, pre); -} - -///////////////////////////////////////////////////////////////////////////////////////// - -HANDLE CMraProto::FileAllow(MCONTACT, HANDLE hTransfer, const wchar_t *szPath) -{ - if (szPath != nullptr) - if (MraFilesQueueAccept(hFilesQueueHandle, (DWORD_PTR)hTransfer, szPath, mir_wstrlen(szPath)) == NO_ERROR) - return hTransfer; // Success - - return nullptr; -} - -int CMraProto::FileCancel(MCONTACT hContact, HANDLE hTransfer) -{ - if (hContact && hTransfer) { - MraFilesQueueCancel(hFilesQueueHandle, (DWORD_PTR)hTransfer, TRUE); - return 0; // Success - } - - return 1; -} - -int CMraProto::FileDeny(MCONTACT hContact, HANDLE hTransfer, const wchar_t*) -{ - return FileCancel(hContact, hTransfer); -} - -///////////////////////////////////////////////////////////////////////////////////////// - -INT_PTR CMraProto::GetCaps(int type, MCONTACT) -{ - switch (type) { - case PFLAGNUM_1: - return PF1_IM | PF1_FILE | PF1_MODEMSG | PF1_SERVERCLIST | PF1_AUTHREQ | PF1_ADDED | PF1_VISLIST | PF1_INVISLIST | - PF1_INDIVSTATUS | PF1_PEER2PEER | PF1_CHAT | PF1_BASICSEARCH | PF1_EXTSEARCH | PF1_CANRENAMEFILE | PF1_FILERESUME | - PF1_ADDSEARCHRES | PF1_CONTACT | PF1_SEARCHBYEMAIL | PF1_USERIDISEMAIL | PF1_SEARCHBYNAME | PF1_EXTSEARCHUI; - - case PFLAGNUM_2: - return PF2_ONLINE | PF2_INVISIBLE | PF2_SHORTAWAY | PF2_HEAVYDND | PF2_FREECHAT | PF2_ONTHEPHONE; - - case PFLAGNUM_3: - return PF2_ONLINE | PF2_INVISIBLE | PF2_SHORTAWAY | PF2_HEAVYDND | PF2_FREECHAT | PF2_ONTHEPHONE; - - case PFLAGNUM_4: - return PF4_FORCEAUTH | PF4_FORCEADDED | PF4_SUPPORTTYPING | PF4_AVATARS; - - case PFLAGNUM_5: - return PF2_ONTHEPHONE; - - case PFLAG_UNIQUEIDTEXT: - return (INT_PTR)Translate("E-mail address"); - - case PFLAG_MAXCONTACTSPERPACKET: - return MRA_MAXCONTACTSPERPACKET; - - case PFLAG_MAXLENOFMESSAGE: - return MRA_MAXLENOFMESSAGE; - - default: - return 0; - } -} - -int CMraProto::GetInfo(MCONTACT hContact, int) -{ - return MraUpdateContactInfo(hContact) != 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -HANDLE CMraProto::SearchBasic(const wchar_t *id) -{ - return SearchByEmail(id); -} - -HANDLE CMraProto::SearchByEmail(const wchar_t *email) -{ - if (m_bLoggedIn && email) { - CMStringA szEmail(email); - return MraWPRequestByEMail(NULL, ACKTYPE_SEARCH, szEmail); - } - - return nullptr; -} - -HANDLE CMraProto::SearchByName(const wchar_t *pszNick, const wchar_t *pszFirstName, const wchar_t *pszLastName) -{ - if (m_bLoggedIn && (*pszNick || *pszFirstName || *pszLastName)) { - DWORD dwRequestFlags = 0; - if (*pszNick) SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_NICKNAME); - if (*pszFirstName) SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_FIRSTNAME); - if (*pszLastName) SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_LASTNAME); - return MraWPRequestW(NULL, ACKTYPE_SEARCH, dwRequestFlags, "", "", pszNick, pszFirstName, pszLastName, 0, 0, 0, 0, 0, 0, 0, 0, 0); - } - - return nullptr; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -int CMraProto::RecvContacts(MCONTACT hContact, PROTORECVEVENT* pre) -{ - DBEVENTINFO dbei = {}; - dbei.szModule = m_szModuleName; - 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; - db_event_add(hContact, &dbei); - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -int CMraProto::SendContacts(MCONTACT hContact, int, int nContacts, MCONTACT *hContactsList) -{ - INT_PTR iRet = 0; - - if (m_bLoggedIn && hContact) { - BOOL bSlowSend; - CMStringW wszData, wszEmail; - CMStringA szEmail; - if (mraGetStringA(hContact, "e-mail", szEmail)) { - for (int i = 0; i < nContacts; i++) { - if (IsContactMra(hContactsList[i])) - if (mraGetStringW(hContactsList[i], "e-mail", wszEmail)) - wszData += wszEmail + ';' + Clist_GetContactDisplayName(hContactsList[i]) + ';'; - } - - bSlowSend = getByte("SlowSend", MRA_DEFAULT_SLOW_SEND); - iRet = MraMessage(bSlowSend, hContact, ACKTYPE_CONTACTS, MESSAGE_FLAG_CONTACT, szEmail, wszData, nullptr, 0); - if (bSlowSend == FALSE) - ProtoBroadcastAck(hContact, ACKTYPE_CONTACTS, ACKRESULT_SUCCESS, (HANDLE)iRet, 0); - } - } - else ProtoBroadcastAck(hContact, ACKTYPE_CONTACTS, ACKRESULT_FAILED, nullptr, (LPARAM)"You cannot send when you are offline."); - - return iRet; -} - -HANDLE CMraProto::SendFile(MCONTACT hContact, const wchar_t*, wchar_t **ppszFiles) -{ - if (!m_bLoggedIn || !hContact || !ppszFiles) - return nullptr; - - size_t dwFilesCount; - for (dwFilesCount = 0; ppszFiles[dwFilesCount]; dwFilesCount++); - - DWORD iRet = 0; - MraFilesQueueAddSend(hFilesQueueHandle, 0, hContact, ppszFiles, dwFilesCount, &iRet); - return (HANDLE)iRet; -} - -int CMraProto::SendMsg(MCONTACT hContact, int, const char *lpszMessage) -{ - if (!m_bLoggedIn) { - ProtoBroadcastAck(hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED, nullptr, (LPARAM)TranslateT("You cannot send when you are offline.")); - return 0; - } - - DWORD dwFlags = 0; - CMStringW wszMessage(ptrW(mir_utf8decodeW(lpszMessage))); - if (wszMessage.IsEmpty()) { - ProtoBroadcastAck(hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED, nullptr, (LPARAM)TranslateT("Can't allocate buffer for convert to Unicode.")); - return 0; - } - - CMStringA szEmail; - if (!mraGetStringA(hContact, "e-mail", szEmail)) - return 0; - - BOOL bSlowSend = getByte("SlowSend", MRA_DEFAULT_SLOW_SEND); - if (getByte("RTFSendEnable", MRA_DEFAULT_RTF_SEND_ENABLE) && (MraContactCapabilitiesGet(hContact) & FEATURE_FLAG_RTF_MESSAGE)) - dwFlags |= MESSAGE_FLAG_RTF; - - int iRet = MraMessage(bSlowSend, hContact, ACKTYPE_MESSAGE, dwFlags, szEmail, wszMessage, NULL, 0); - if (bSlowSend == FALSE) - ProtoBroadcastAckAsync(hContact, ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, (HANDLE)iRet, 0); - return iRet; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -int CMraProto::SetApparentMode(MCONTACT hContact, int mode) -{ - if (!m_bLoggedIn || !hContact) - return 1; - - // Only 3 modes are supported - if (hContact && (mode == 0 || mode == ID_STATUS_ONLINE || mode == ID_STATUS_OFFLINE)) { - int dwOldMode = (int)getDword(hContact, "ApparentMode", 0); - - // Dont send redundant updates - if (mode != dwOldMode) { - DWORD dwContactFlag = 0; - - switch (mode) { - case ID_STATUS_OFFLINE: - dwContactFlag |= CONTACT_FLAG_INVISIBLE; - break; - case ID_STATUS_ONLINE: - dwContactFlag |= CONTACT_FLAG_VISIBLE; - break; - } - - if (MraModifyContact(hContact, nullptr, &dwContactFlag)) { - SetContactBasicInfoW(hContact, 0, SCBIF_FLAG, 0, 0, dwContactFlag, 0, 0, nullptr, nullptr, nullptr); - return 0; // Success - } - } - } - - return 1; -} - -int CMraProto::SetStatus(int iNewStatus) -{ - // remap global statuses to local supported - switch (iNewStatus) { - case ID_STATUS_OCCUPIED: - iNewStatus = ID_STATUS_DND; - break; - case ID_STATUS_NA: - case ID_STATUS_ONTHEPHONE: - case ID_STATUS_OUTTOLUNCH: - iNewStatus = ID_STATUS_AWAY; - break; - } - - // nothing to change - if (m_iStatus == iNewStatus) - return 0; - - DWORD dwOldStatusMode; - - //set all contacts to offline - if ((m_iDesiredStatus = iNewStatus) == ID_STATUS_OFFLINE) { - m_bLoggedIn = FALSE; - dwOldStatusMode = InterlockedExchange((volatile LONG*)&m_iStatus, m_iDesiredStatus); - - // всех в offline, только если мы бывали подключены - if (dwOldStatusMode > ID_STATUS_OFFLINE) - for (auto &hContact : AccContacts()) - SetContactBasicInfoW(hContact, SCBIFSI_LOCK_CHANGES_EVENTS, (SCBIF_ID | SCBIF_GROUP_ID | SCBIF_SERVER_FLAG | SCBIF_STATUS), -1, -1, 0, 0, ID_STATUS_OFFLINE, nullptr, nullptr, nullptr); - - if (m_hConnection != nullptr) - Netlib_Shutdown(m_hConnection); - } - else { - // если offline то сразу ставим connecting, но обработка как offline - dwOldStatusMode = InterlockedCompareExchange((volatile LONG*)&m_iStatus, ID_STATUS_CONNECTING, ID_STATUS_OFFLINE); - - switch (dwOldStatusMode) { - case ID_STATUS_OFFLINE: // offline, connecting - if (StartConnect() != NO_ERROR) { - m_bLoggedIn = FALSE; - m_iDesiredStatus = ID_STATUS_OFFLINE; - dwOldStatusMode = InterlockedExchange((volatile LONG*)&m_iStatus, m_iDesiredStatus); - } - 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(m_iDesiredStatus, m_iXStatus, L"", L""); - case ID_STATUS_CONNECTING: - // предотвращаем переход в любой статус (кроме offline) из статуса connecting, если он не вызван самим плагином - if (dwOldStatusMode == ID_STATUS_CONNECTING && iNewStatus != m_iDesiredStatus) - break; - - default: - dwOldStatusMode = InterlockedExchange((volatile LONG*)&m_iStatus, m_iDesiredStatus); - break; - } - } - MraSetContactStatus(NULL, m_iStatus); - ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)dwOldStatusMode, m_iStatus); - return 0; -} - -HANDLE CMraProto::GetAwayMsg(MCONTACT hContact) -{ - if (!m_bLoggedIn || !hContact) - return nullptr; - - wchar_t szStatusDesc[MICBLOG_STATUS_MAX + MICBLOG_STATUS_MAX + MAX_PATH], szTime[64]; - DWORD dwTime; - int iRet = 0; - - CMStringW szBlogStatus; - if (mraGetStringW(hContact, DBSETTING_BLOGSTATUS, szBlogStatus)) { - SYSTEMTIME tt = { 0 }; - dwTime = getDword(hContact, DBSETTING_BLOGSTATUSTIME, 0); - if (dwTime && MakeLocalSystemTimeFromTime32(dwTime, &tt)) - mir_snwprintf(szTime, L"%04ld.%02ld.%02ld %02ld:%02ld: ", tt.wYear, tt.wMonth, tt.wDay, tt.wHour, tt.wMinute); - else - szTime[0] = 0; - - mir_snwprintf(szStatusDesc, L"%s%s", szTime, szBlogStatus.c_str()); - iRet = GetTickCount(); - ProtoBroadcastAck(hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE)iRet, (LPARAM)szStatusDesc); - } - return (HANDLE)iRet; -} - -int CMraProto::SetAwayMsg(int iStatus, const wchar_t *msg) -{ - if (!m_bLoggedIn) - return 1; - - size_t dwStatusDescSize = mir_wstrlen(msg); - DWORD dwStatus = iStatus; - DWORD dwXStatus = m_iXStatus; - - // не отправл¤ем новый статусный текст дл¤ хстатусов, дл¤ хстатусов только эвей сообщени¤ - if (dwStatus != ID_STATUS_ONLINE || IsXStatusValid(dwXStatus) == FALSE) { - dwStatusDescSize = min(dwStatusDescSize, STATUS_DESC_MAX); - MraSendNewStatus(dwStatus, dwXStatus, L"", msg); - } - return 0; -} - -int CMraProto::UserIsTyping(MCONTACT hContact, int type) -{ - if (!m_bLoggedIn || m_iStatus == ID_STATUS_INVISIBLE || !hContact || type == PROTOTYPE_SELFTYPING_OFF) - return 1; - - CMStringA szEmail; - if (MraGetContactStatus(hContact) != ID_STATUS_OFFLINE) - if (mraGetStringA(hContact, "e-mail", szEmail)) - if (MraMessage(FALSE, hContact, 0, MESSAGE_FLAG_NOTIFY, szEmail, L" ", nullptr, 0)) - return 0; - - return 1; -} diff --git a/protocols/MRA/src/MraProto.h b/protocols/MRA/src/MraProto.h deleted file mode 100644 index ac8e327669..0000000000 --- a/protocols/MRA/src/MraProto.h +++ /dev/null @@ -1,349 +0,0 @@ -#pragma once - -#define SCBIFSI_LOCK_CHANGES_EVENTS 1 -#define SCBIF_ID 1 -#define SCBIF_GROUP_ID 2 -#define SCBIF_FLAG 4 -#define SCBIF_SERVER_FLAG 8 -#define SCBIF_STATUS 16 -#define SCBIF_EMAIL 32 -#define SCBIF_NICK 64 -#define SCBIF_PHONES 128 - -#define MAIN_MENU_ITEMS_COUNT 12 -#define CONTACT_MENU_ITEMS_COUNT 10 -#define ADV_ICON_MAX 5 - -struct MRA_FILES_QUEUE_ITEM; - -struct MraGroupItem -{ - MraGroupItem(DWORD id, DWORD flags, const CMStringW &name) : - m_id(id), m_flags(flags), m_name(name) - {} - - ~MraGroupItem() - {} - - DWORD m_id, m_flags; - CMStringW m_name; -}; - -struct CMraProto : public PROTO -{ - CMraProto(const char*, const wchar_t*); - ~CMraProto(); - - //==================================================================================== - // PROTO_INTERFACE - - MCONTACT AddToList(int flags, PROTOSEARCHRESULT* psr) override; - MCONTACT AddToListByEvent(int flags, int iContact, MEVENT hDbEvent) override; - - int Authorize(MEVENT hDBEvent) override; - int AuthDeny(MEVENT hDBEvent, const wchar_t* szReason) override; - int AuthRecv(MCONTACT hContact, PROTORECVEVENT*) override; - - HANDLE FileAllow(MCONTACT hContact, HANDLE hTransfer, const wchar_t* szPath) override; - int FileCancel(MCONTACT hContact, HANDLE hTransfer) override; - int FileDeny(MCONTACT hContact, HANDLE hTransfer, const wchar_t* szReason) override; - - INT_PTR GetCaps(int type, MCONTACT hContact) override; - int GetInfo(MCONTACT hContact, int infoType) override; - - HANDLE SearchBasic(const wchar_t* id) override; - HANDLE SearchByEmail(const wchar_t* email) override; - HANDLE SearchByName(const wchar_t* nick, const wchar_t* firstName, const wchar_t* lastName) override; - HWND SearchAdvanced(HWND owner) override; - HWND CreateExtendedSearchUI(HWND owner) override; - - int RecvContacts(MCONTACT hContact, PROTORECVEVENT*) override; - - int SendContacts(MCONTACT hContact, int flags, int nContacts, MCONTACT *hContactsList) override; - HANDLE SendFile(MCONTACT hContact, const wchar_t *szDescription, wchar_t **ppszFiles) override; - int SendMsg(MCONTACT hContact, int flags, const char* msg) override; - - int SetApparentMode(MCONTACT hContact, int mode) override; - int SetStatus(int iNewStatus) override; - - HANDLE GetAwayMsg(MCONTACT hContact) override; - int SetAwayMsg(int m_iStatus, const wchar_t* msg) override; - - int UserIsTyping(MCONTACT hContact, int type) override; - - void OnBuildProtoMenu(void) override; - void OnModulesLoaded() override; - void OnShutdown() override; - - //==================================================================================== - void ShowFormattedErrorMessage(LPWSTR lpwszErrText, DWORD dwErrorCode); - void MraPopupShowW(MCONTACT hContact, DWORD dwType, LPWSTR lpszTitle, LPCWSTR lpszMessage); - void MraPopupShowFromContactW(MCONTACT hContact, DWORD dwType, LPCWSTR lpszMessage); - __forceinline void MraPopupShowFromAgentW(DWORD dwType, LPCWSTR lpszMessage) { - MraPopupShowFromContactW(NULL, dwType, lpszMessage); } - - __forceinline bool mraGetStaticStringA(MCONTACT Contact, const char *ValueName, char *Ret, size_t RetBuffSize, size_t *pRetBuffSize) { - return DB_GetStaticStringA(Contact, m_szModuleName, ValueName, Ret, RetBuffSize, pRetBuffSize); } - __forceinline bool mraGetStaticStringW(MCONTACT Contact, const char *ValueName, WCHAR *Ret, size_t RetBuffSize, size_t *pRetBuffSize) { - return DB_GetStaticStringW(Contact, m_szModuleName, ValueName, Ret, RetBuffSize, pRetBuffSize); } - - __forceinline bool mraGetStringA(MCONTACT Contact, const char *ValueName, CMStringA &Ret) { - return DB_GetStringA(Contact, m_szModuleName, ValueName, Ret); } - __forceinline bool mraGetStringW(MCONTACT Contact, const char *ValueName, CMStringW &Ret) { - return DB_GetStringW(Contact, m_szModuleName, ValueName, Ret); } - - __forceinline bool mraSetStringA(MCONTACT Contact, const char *valueName, const CMStringA &parValue) { - return DB_SetStringExA(Contact, m_szModuleName, valueName, parValue); } - __forceinline bool mraSetStringW(MCONTACT Contact, const char *valueName, const CMStringW &parValue) { - return DB_SetStringExW(Contact, m_szModuleName, valueName, parValue); } - - __forceinline bool mraSetStringExA(MCONTACT Contact, const char *valueName, const CMStringA &parValue) { - return DB_SetStringExA(Contact, m_szModuleName, valueName, parValue); } - __forceinline bool mraSetStringExW(MCONTACT Contact, const char *valueName, const CMStringW &parValue) { - return DB_SetStringExW(Contact, m_szModuleName, valueName, parValue); } - - __forceinline bool mraWriteContactSettingBlob(MCONTACT hContact, const char *lpszValueName, LPVOID lpbValue, size_t dwValueSize) { - return db_set_blob(hContact, m_szModuleName, lpszValueName, lpbValue, (unsigned int)dwValueSize) != 0; - } - __forceinline bool mraGetContactSettingBlob(MCONTACT hContact, const char *lpszValueName, LPVOID lpbRet, size_t dwRetBuffSize, size_t *pdwRetBuffSize) { - return DB_GetContactSettingBlob(hContact, m_szModuleName, lpszValueName, lpbRet, dwRetBuffSize, pdwRetBuffSize); } - - // ====| Services |==================================================================== - INT_PTR __cdecl MraSetXStatusEx(WPARAM, LPARAM); - INT_PTR __cdecl MraGetXStatusEx(WPARAM, LPARAM); - INT_PTR __cdecl MraGetXStatusIcon(WPARAM, LPARAM); - INT_PTR __cdecl MraXStatusMenu(WPARAM, LPARAM, LPARAM param); - - INT_PTR __cdecl MraSetListeningTo(WPARAM, LPARAM); - - INT_PTR __cdecl MraSendSMS(WPARAM, LPARAM); - - INT_PTR __cdecl MraSendNudge(WPARAM, LPARAM); - - INT_PTR __cdecl GetUnreadEmailCount(WPARAM, LPARAM); - - INT_PTR __cdecl MraGetAvatarCaps(WPARAM, LPARAM); - INT_PTR __cdecl MraGetAvatarInfo(WPARAM, LPARAM); - INT_PTR __cdecl MraGetMyAvatar(WPARAM, LPARAM); - - INT_PTR __cdecl MraGotoInbox(WPARAM, LPARAM); - INT_PTR __cdecl MraShowInboxStatus(WPARAM, LPARAM); - INT_PTR __cdecl MraEditProfile(WPARAM, LPARAM); - INT_PTR __cdecl MraWebSearch(WPARAM, LPARAM); - INT_PTR __cdecl MraUpdateAllUsersInfo(WPARAM, LPARAM); - INT_PTR __cdecl MraCheckUpdatesUsersAvt(WPARAM, LPARAM); - INT_PTR __cdecl MraRequestAuthForAll(WPARAM, LPARAM); - - INT_PTR __cdecl MraRequestAuthorization(WPARAM, LPARAM); - INT_PTR __cdecl MraGrantAuthorization(WPARAM, LPARAM); - INT_PTR __cdecl MraSendEmail(WPARAM, LPARAM); - INT_PTR __cdecl MraSendPostcard(WPARAM, LPARAM); - INT_PTR __cdecl MraViewAlbum(WPARAM, LPARAM); - INT_PTR __cdecl MraReplyBlogStatus(WPARAM, LPARAM); - INT_PTR __cdecl MraViewVideo(WPARAM, LPARAM); - INT_PTR __cdecl MraAnswers(WPARAM, LPARAM); - INT_PTR __cdecl MraWorld(WPARAM, LPARAM); - INT_PTR __cdecl MraCreateAccMgrUI(WPARAM, LPARAM); - - // ====| Events |====================================================================== - int __cdecl OnOptionsInit(WPARAM, LPARAM); - int __cdecl OnPopupOptInit(WPARAM, LPARAM); - int __cdecl OnGroupChanged(WPARAM, LPARAM); - - int __cdecl MraChatGcEventHook(WPARAM, LPARAM); - - int __cdecl MraExtraIconsApply(WPARAM, LPARAM); - - int __cdecl MraContactDeleted(WPARAM, LPARAM); - int __cdecl MraDbSettingChanged(WPARAM, LPARAM); - int __cdecl MraRebuildContactMenu(WPARAM, LPARAM); - int __cdecl MraRebuildStatusMenu(WPARAM, LPARAM); - int __cdecl MraMusicChanged(WPARAM, LPARAM); - - // ====| Data |======================================================================== - bool m_bLoggedIn; - - HANDLE hSendQueueHandle, hFilesQueueHandle, hMPopSessionQueue; - - HANDLE m_heNudgeReceived; - HNETLIBCONN m_hConnection; - DWORD m_dwNextPingSendTickTime; - DWORD m_dwPingPeriod; - volatile DWORD m_dwThreadWorkerLastPingTime; - volatile DWORD m_dwThreadWorkerRunning; - volatile DWORD dwCMDNum; - - OBJLIST m_groups; - - HANDLE hAvatarsQueueHandle; - - HGENMENU hMainMenuItems[MAIN_MENU_ITEMS_COUNT]; - HGENMENU hContactMenuItems[CONTACT_MENU_ITEMS_COUNT]; - - HWND hWndEMailPopupStatus; - DWORD dwEmailMessagesTotal, m_dwEmailMessagesUnread; - - bool m_bShutdown; - bool m_bHideXStatusUI; - HGENMENU hXStatusMenuItems[MRA_XSTATUS_COUNT+4], hContactMenuRoot; - HANDLE hExtraXstatusIcon; - HANDLE hExtraInfo; - - char szNewMailSound[MAX_PATH]; - - mir_cs csCriticalSectionSend; - - MCONTACT AddToListByEmail(LPCTSTR plpsEMail, LPCTSTR plpsNick, LPCTSTR plpsFirstName, LPCTSTR plpsLastName, DWORD dwFlags); - - DWORD MraMessage(BOOL bAddToQueue, MCONTACT hContact, DWORD dwAckType, DWORD dwFlags, const CMStringA &szEmail, const CMStringW &wszMessage, LPBYTE lpbMultiChatData, size_t dwMultiChatDataSize); - DWORD MraMessageAsk(DWORD dwMsgID, DWORD dwFlags, const CMStringA &szEmail, const CMStringW &wszMessage, const CMStringW &wszMessageRTF); - DWORD MraMessageRecv(const CMStringA &szFrom, DWORD dwMsgID); - DWORD MraAddContact(MCONTACT hContact, DWORD dwContactFlag, DWORD dwGroupID, const CMStringA &szEmail, const CMStringW &wszCustomName, const CMStringA *szPhones = nullptr, const CMStringW *wszAuthMessage = nullptr); - DWORD MraModifyContact(MCONTACT hContact, DWORD *pdwID = nullptr, DWORD *pdwContactFlag = nullptr, DWORD *pdwGroupID = nullptr, const CMStringA *pszEmail = nullptr, const CMStringW *pwszCustomName = nullptr, const CMStringA *pszPhones = nullptr); - DWORD MraOfflineMessageDel(DWORDLONG dwMsgUIDL); - DWORD MraMoveContactToGroup(MCONTACT hContact, DWORD dwGroupID, LPCTSTR ptszGroup); - DWORD MraAuthorize(const CMStringA &szEmail); - DWORD MraChangeStatus(DWORD dwStatus, const CMStringA &szStatusUri, const CMStringW &wszStatusTitle, const CMStringW &wszStatusDesc, DWORD dwFutureFlags); - DWORD MraFileTransfer(const CMStringA &szEmail, DWORD dwIdRequest, DWORD dwFilesTotalSize, const CMStringW &lpwszFiles, const CMStringA &szAddresses); - DWORD MraFileTransferAck(DWORD dwStatus, const CMStringA &szEmail, DWORD dwIdRequest, const CMStringA &szDescription); - HANDLE MraWPRequestW(MCONTACT hContact, DWORD dwAckType, DWORD dwRequestFlags, const CMStringA &szUser, const CMStringA &szDomain, const CMStringW &wszNickName, const CMStringW &wszFirstName, const CMStringW &wszLastName, DWORD dwSex, DWORD dwDate1, DWORD dwDate2, DWORD dwCityID, DWORD dwZodiak, DWORD dwBirthdayMonth, DWORD dwBirthdayDay, DWORD dwCountryID, DWORD dwOnline); - HANDLE MraWPRequestByEMail(MCONTACT hContact, DWORD dwAckType, CMStringA &szEmail); - DWORD MraGame(const CMStringA &szEmail, DWORD dwGameSessionID, DWORD dwGameMsg, DWORD dwGameMsgID, const CMStringA &lpszData); - DWORD MraLogin2W(const CMStringA &szLogin, const CMStringA &szPassword, DWORD dwStatus, const CMStringA &szStatusUri, CMStringW &wszStatusTitle, CMStringW &wszStatusDesc, DWORD dwFutureFlags, CMStringA &szUserAgentFormatted, CMStringA &szUserAgent); - DWORD MraSMSW(MCONTACT hContact, const CMStringA &lpszPhone, const CMStringW &lpwszMessage); - DWORD MraProxy(const CMStringA &szEmail, DWORD dwIDRequest, DWORD dwDataType, const CMStringA &lpszData, const CMStringA &szAddresses, MRA_GUID mguidSessionID); - DWORD MraProxyAck(DWORD dwStatus, const CMStringA &szEmail, DWORD dwIDRequest, DWORD dwDataType, const CMStringA &lpszData, const CMStringA &szAddresses, MRA_GUID mguidSessionID); - DWORD MraChangeUserBlogStatus(DWORD dwFlags, const CMStringW &wszText, DWORDLONG dwBlogStatusID); - - DWORD MraSendPacket(HNETLIBCONN 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, MCONTACT hContact, DWORD dwAckType, LPBYTE lpbDataQueue, size_t dwDataQueueSize, DWORD dwType, LPVOID lpData, size_t dwDataSize); - - DWORD MraSendNewStatus(DWORD dwStatusMir, DWORD dwXStatusMir, const CMStringW &wszStatusTitle, const CMStringW &wszStatusDesc); - - void MraAddrListStoreToContact(MCONTACT hContact, MRA_ADDR_LIST *pmalAddrList); - - DWORD GetContactFlags(MCONTACT hContact); - DWORD SetContactFlags(MCONTACT hContact, DWORD dwContactFlag); - DWORD GetContactBasicInfoW(MCONTACT hContact, DWORD *pdwID, DWORD *pdwGroupID, DWORD *pdwContactFlag, DWORD *pdwContactSeverFlags, DWORD *pdwStatus, CMStringA *szEmail, CMStringW *wszNick, CMStringA *szPhones); - DWORD SetContactBasicInfoW(MCONTACT hContact, DWORD dwSetInfoFlags, DWORD dwFlags, DWORD dwID, DWORD dwGroupID, DWORD dwContactFlag, DWORD dwContactSeverFlags, DWORD dwStatus, const CMStringA *szEmail, const CMStringW *wszNick, const CMStringA *szPhones); - - DWORD GetContactEMailCount(MCONTACT hContact, BOOL bMRAOnly); - bool GetContactFirstEMail(MCONTACT hContact, BOOL bMRAOnly, CMStringA &szRetBuff); - - bool IsContactMra(MCONTACT hContact); - bool IsEMailMy(const CMStringA &szEmail); - bool IsEMailChatAgent(const CMStringA &szEmail); - bool IsContactChatAgent(MCONTACT hContact); - - MCONTACT MraHContactFromEmail(const CMStringA &szEmail, BOOL bAddIfNeeded, BOOL bTemporary, BOOL *pbAdded); - bool MraUpdateContactInfo(MCONTACT hContact); - DWORD MraSetXStatusInternal(DWORD dwXStatus); - DWORD MraGetContactStatus(MCONTACT hContact); - DWORD MraSetContactStatus(MCONTACT hContact, DWORD dwNewStatus); - DWORD MraContactCapabilitiesGet(MCONTACT hContact); - void MraContactCapabilitiesSet(MCONTACT hContact, DWORD dwFutureFlags); - void MraUpdateEmailStatus(const CMStringA &szFrom, const CMStringA &szSubject, bool force_display); - DWORD MraConvertToRTFW(const CMStringW &wszMessage, CMStringA &szMessageRTF); - - DWORD StartConnect(); - void __cdecl MraThreadProc(LPVOID lpParameter); - DWORD MraGetNLBData(CMStringA &szHost, WORD *pwPort); - DWORD MraNetworkDispatcher(); - - bool MraCommandDispatcher(struct mrim_packet_header_t *pmaHeader); - bool CmdHelloAck(BinBuffer &buf); - bool CmdLoginAck(); - bool CmdLoginRejected(BinBuffer &buf); - bool CmdMessageAck(BinBuffer &buf); - bool CmdMessageStatus(ULONG seq, BinBuffer &buf); - bool CmdOfflineMessageAck(BinBuffer &buf); - bool CmdAuthAck(BinBuffer &buf); - bool CmdPopSession(BinBuffer &buf); - bool CmdFileTransfer(BinBuffer &buf); - bool CmdFileTransferAck(BinBuffer &buf); - bool CmdUserInfo(BinBuffer &buf); - bool CmdUserStatus(BinBuffer &buf); - bool CmdContactAck(int cmd, int seq, BinBuffer &buf); - bool CmdAnketaInfo(int seq, BinBuffer &buf); - bool CmdGame(BinBuffer &buf); - bool CmdClist2(BinBuffer &buf); - bool CmdProxy(BinBuffer &buf); - bool CmdProxyAck(BinBuffer &buf); - bool CmdNewMail(BinBuffer &buf); - bool CmdBlogStatus(BinBuffer &buf); - - DWORD MraRecvCommand_Message(DWORD dwTime, DWORD dwFlags, CMStringA &plpsFrom, CMStringA &plpsText, CMStringA &plpsRFTText, CMStringA &plpsMultiChatData); - - void SetExtraIcons(MCONTACT hContact); - - void InitMenus(void); - HGENMENU CListCreateMenu(LONG lPosition, LONG lPopupPosition, BOOL bIsStatus, const IconItem *pgdiItems, size_t dwCount, HGENMENU *hResult); - - DWORD ProtoBroadcastAckAsync(MCONTACT hContact, int type, int hResult, HANDLE hProcess, LPARAM lParam); - CMStringA CreateBlobFromContact(MCONTACT hContact, const CMStringW &wszRequestReason); - - bool GetPassDB(CMStringA& pass); - - bool MraRequestXStatusDetails(DWORD dwXStatus); - bool MraSendReplyBlogStatus(MCONTACT hContact); - DWORD MraSelectEMailDlgShow(MCONTACT hContact, DWORD dwType); - - DWORD MraMrimProxyConnect(HANDLE hMraMrimProxyData, HNETLIBCONN *phConnection); - - DWORD MraMPopSessionQueueAddUrl(HANDLE hMPopSessionQueue, const CMStringA &szUrl); - DWORD MraMPopSessionQueueAddUrlAndEMail(HANDLE hMPopSessionQueue, const CMStringA &, CMStringA &szEmail); - void MraMPopSessionQueueStart(HANDLE hMPopSessionQueue); - void MraMPopSessionQueueFlush(HANDLE hMPopSessionQueue); - - size_t MraFilesQueueGetLocalAddressesList(LPSTR lpszBuff, size_t dwBuffSize, DWORD dwPort); - DWORD MraFilesQueueAddReceive(HANDLE hFilesQueueHandle, DWORD dwFlags, MCONTACT hContact, DWORD dwIDRequest, const CMStringW &wszFiles, const CMStringA &szAddresses); - DWORD MraFilesQueueAddSend(HANDLE hFilesQueueHandle, DWORD dwFlags, MCONTACT hContact, LPWSTR *plpwszFiles, size_t dwFilesCount, DWORD *pdwIDRequest); - DWORD MraFilesQueueCancel(HANDLE hFilesQueueHandle, DWORD dwIDRequest, BOOL bSendDecline); - DWORD MraFilesQueueStartMrimProxy(HANDLE hFilesQueueHandle, DWORD dwIDRequest); - DWORD MraFilesQueueSendMirror(HANDLE hFilesQueueHandle, DWORD dwIDRequest, const CMStringA &szAddresses); - bool MraFilesQueueHandCheck(HNETLIBCONN hConnection, MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem); - HANDLE MraFilesQueueConnectOut(MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem); - HANDLE MraFilesQueueConnectIn(MRA_FILES_QUEUE_ITEM *pmrafqFilesQueueItem); - DWORD MraFilesQueueAccept(HANDLE hFilesQueueHandle, DWORD dwIDRequest, LPCWSTR lpwszPath, size_t dwPathSize); - - void __cdecl MraFilesQueueRecvThreadProc(LPVOID lpParameter); - void __cdecl MraFilesQueueSendThreadProc(LPVOID lpParameter); - - bool bChatExists; - bool MraChatRegister(); - INT_PTR MraChatSessionNew(MCONTACT hContactChatSession); - void MraChatSessionDestroy(MCONTACT hContactChatSession); - void MraChatSendPrivateMessage(LPSTR lpwszEMail); - - INT_PTR MraChatSessionEventSendByHandle(MCONTACT hContactChatSession, int iType, DWORD dwFlags, const CMStringA &szUID, LPCWSTR lpwszStatus, LPCWSTR lpwszMessage, DWORD_PTR dwItemData, DWORD dwTime); - INT_PTR MraChatSessionInvite(MCONTACT hContactChatSession, const CMStringA &lpszEMailInMultiChat, DWORD dwTime); - INT_PTR MraChatSessionMembersAdd(MCONTACT hContactChatSession, const CMStringA &lpszEMailInMultiChat, DWORD dwTime); - INT_PTR MraChatSessionJoinUser(MCONTACT hContactChatSession, const CMStringA &lpszEMailInMultiChat, DWORD dwTime); - INT_PTR MraChatSessionLeftUser(MCONTACT hContactChatSession, const CMStringA &lpszEMailInMultiChat, DWORD dwTime); - INT_PTR MraChatSessionSetIviter(MCONTACT hContactChatSession, const CMStringA &lpszEMailInMultiChat); - INT_PTR MraChatSessionSetOwner(MCONTACT hContactChatSession, const CMStringA &lpszEMailInMultiChat); - INT_PTR MraChatSessionMessageAdd(MCONTACT hContactChatSession, const CMStringA &lpszEMailInMultiChat, const CMStringW &wszMessage, DWORD dwTime); - - DWORD MraAvatarsQueueInitialize(HANDLE *phAvatarsQueueHandle); - void MraAvatarsQueueClear(HANDLE hAvatarsQueueHandle); - void MraAvatarsQueueSuspend(HANDLE hAvatarsQueueHandle); - void MraAvatarsQueueDestroy(HANDLE hAvatarsQueueHandle); - DWORD MraAvatarsQueueAdd(HANDLE hAvatarsQueueHandle, DWORD dwFlags, MCONTACT hContact, DWORD *pdwAvatarsQueueID); - bool MraAvatarsGetContactTime (MCONTACT hContact, LPSTR lpszValueName, SYSTEMTIME *pstTime); - void MraAvatarsSetContactTime (MCONTACT hContact, LPSTR lpszValueName, SYSTEMTIME *pstTime); - DWORD MraAvatarsGetFileName(HANDLE hAvatarsQueueHandle, MCONTACT hContact, DWORD dwFormat, CMStringW &res); - DWORD MraAvatarsQueueGetAvatar(HANDLE hAvatarsQueueHandle, DWORD dwFlags, MCONTACT hContact, DWORD *pdwAvatarsQueueID, DWORD *pdwFormat, LPTSTR lpszPath); - DWORD MraAvatarsQueueGetAvatarSimple(HANDLE hAvatarsQueueHandle, DWORD dwFlags, MCONTACT hContact); - DWORD MraAvatarsDeleteContactAvatarFile(HANDLE hAvatarsQueueHandle, MCONTACT hContact); - - void __cdecl MraAvatarsThreadProc(LPVOID lpParameter); -}; - -struct CMPlugin : public ACCPROTOPLUGIN -{ - CMPlugin(); - - int Load() override; - int Unload() override; -}; diff --git a/protocols/MRA/src/MraRTFMsg.cpp b/protocols/MRA/src/MraRTFMsg.cpp deleted file mode 100644 index 5cec2d80a6..0000000000 --- a/protocols/MRA/src/MraRTFMsg.cpp +++ /dev/null @@ -1,246 +0,0 @@ -#include "stdafx.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 SYMBOLS_COUNT 19 -static const LPSTR lpszSimbols[SYMBOLS_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[SYMBOLS_COUNT] = -{ - 2, - 1, - 1, - 1, - 3, - 4, - 3, - 4, - 3, - 4, - 8, - 11, - 13, - 12, - 15, - 14, - 12, - 13, - 13, -}; - -static const LPSTR lpszRTFTags[SYMBOLS_COUNT] = -{ - "\\par", - "\\\\", - "\\{", - "\\}", - "{\\b ", - "}", - "{\\ul ", - "}", - "{\\i ", - "}", - "}", - "{\\cf2 ", - "{\\cf3 ", - "{\\cf4 ", - "{\\cf5 ", - "{\\cf6 ", - "{\\cf7 ", - "{\\cf8 ", - "{\\cf9 ", -}; - -static const size_t dwcRTFTagsCount[SYMBOLS_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(const CMStringW &lpwszMessage) -{ - int iStart = lpwszMessage.Find(L"id=flas"); - if (iStart != -1) - if (lpwszMessage.Find(L"'", iStart) != -1) - return true; - - return false; -} - -DWORD MraTextToRTFData(LPSTR lpszMessage, size_t dwMessageSize, LPSTR lpszMessageConverted, size_t dwMessageConvertedBuffSize, size_t *pdwMessageConvertedSize) -{ - if (lpszMessage && dwMessageSize && lpszMessageConverted && dwMessageConvertedBuffSize) { - BYTE tm, bCurByte; - LPSTR lpszMessageConvertedCur, lpszMessageConvertedMax; - size_t i; - - lpszMessageConvertedCur = lpszMessageConverted; - lpszMessageConvertedMax = (lpszMessageConverted+dwMessageConvertedBuffSize); - for (i = 0; i < dwMessageSize && lpszMessageConvertedMax-lpszMessageConvertedCur > 3; 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; - return NO_ERROR; - } - - if (pdwMessageConvertedSize) - *pdwMessageConvertedSize = 0; - return ERROR_INVALID_HANDLE; -} - -DWORD MraSymbolsToRTFTags(LPSTR lpszMessage, size_t dwMessageSize, LPSTR lpszMessageConverted, size_t dwMessageConvertedBuffSize, size_t *pdwMessageConvertedSize) -{ - DWORD dwRetErrorCode = NO_ERROR; - LPSTR lpszFounded[SYMBOLS_COUNT], lpszMessageConvertedCur, lpszMessageCur, lpszMessageCurPrev, lpszMessageConvertedMax; - size_t i, dwFirstFoundIndex = 0, dwFoundCount = 0, dwMemPartToCopy; - - lpszMessageCurPrev = lpszMessage; - lpszMessageConvertedCur = lpszMessageConverted; - lpszMessageConvertedMax = (lpszMessageConverted+dwMessageConvertedBuffSize); - for (i = 0; i < SYMBOLS_COUNT; i++) { // loking for first time - lpszFounded[i] = (LPSTR)MemoryFind((lpszMessageCurPrev-lpszMessage), lpszMessage, dwMessageSize, lpszSimbols[i], dwcSimbolsCount[i]); - if (lpszFounded[i]) dwFoundCount++; - } - - while (dwFoundCount) { - for (i = 0;i (lpszMessageConvertedCur+(dwMemPartToCopy+dwcRTFTagsCount[dwFirstFoundIndex]))) { - MraTextToRTFData(lpszMessageCurPrev, dwMemPartToCopy, lpszMessageConvertedCur, (lpszMessageConvertedMax-lpszMessageConvertedCur), &i);lpszMessageConvertedCur += i; - memcpy(lpszMessageConvertedCur, lpszRTFTags[dwFirstFoundIndex], dwcRTFTagsCount[dwFirstFoundIndex]);lpszMessageConvertedCur += dwcRTFTagsCount[dwFirstFoundIndex]; - lpszMessageCurPrev = (lpszFounded[dwFirstFoundIndex]+dwcSimbolsCount[dwFirstFoundIndex]); - - for (i = 0;i= (lpszMessageRTFCur + sizeof(PAR) + sizeof(CRLF) + 2)) { - memcpy(lpszMessageRTFCur, PAR, sizeof(PAR)); lpszMessageRTFCur += (sizeof(PAR) - 1); - memcpy(lpszMessageRTFCur, CRLF, sizeof(CRLF)); lpszMessageRTFCur += (sizeof(CRLF) - 1); - memcpy(lpszMessageRTFCur, "}", 2); lpszMessageRTFCur += 2; - debugLogA("%s\n", szMessageRTF.c_str()); - return NO_ERROR; - } - - return ERROR_BUFFER_OVERFLOW; - } - - return 0; -} diff --git a/protocols/MRA/src/MraRTFMsg.h b/protocols/MRA/src/MraRTFMsg.h deleted file mode 100644 index b0abacf5e5..0000000000 --- a/protocols/MRA/src/MraRTFMsg.h +++ /dev/null @@ -1,9 +0,0 @@ -#if !defined(AFX_MRA_RTFMSG_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) -#define AFX_MRA_RTFMSG_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ - - -#pragma once - -bool MraIsMessageFlashAnimation(const CMStringW &lpwszMessage); - -#endif // !defined(AFX_MRA_RTFMSG_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/protocols/MRA/src/MraSelectEMail.cpp b/protocols/MRA/src/MraSelectEMail.cpp deleted file mode 100644 index 19dac7a061..0000000000 --- a/protocols/MRA/src/MraSelectEMail.cpp +++ /dev/null @@ -1,152 +0,0 @@ -#include "stdafx.h" -#include "MraSelectEMail.h" - -struct MraSelectEMailDlgData -{ - CMraProto *ppro; - MCONTACT hContact; - DWORD dwType; -}; - -void AddContactEMailToListParam(MCONTACT hContact, BOOL bMRAOnly, LPSTR lpszModule, LPSTR lpszValueName, HWND hWndList) -{ - CMStringA szEmail; - if (DB_GetStringA(hContact, lpszModule, lpszValueName, szEmail)) { - if (bMRAOnly == FALSE || IsEMailMR(szEmail)) { - WCHAR wszBuff[MAX_EMAIL_LEN]; - MultiByteToWideChar(MRA_CODE_PAGE, 0, szEmail, -1, wszBuff, _countof(wszBuff)); - if (SendMessage(hWndList, LB_FINDSTRING, -1, (LPARAM)wszBuff) == LB_ERR) - SendMessage(hWndList, LB_ADDSTRING, 0, (LPARAM)wszBuff); - } - } - - for (int i = 0; true; i++) { - char szBuff[MAX_PATH]; - mir_snprintf(szBuff, "%s%lu", lpszValueName, i); - if (DB_GetStringA(hContact, lpszModule, szBuff, szEmail)) { - if (bMRAOnly == FALSE || IsEMailMR(szEmail)) { - WCHAR wszBuff[MAX_EMAIL_LEN]; - MultiByteToWideChar(MRA_CODE_PAGE, 0, szEmail, -1, wszBuff, _countof(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 *dat = (MraSelectEMailDlgData*)GetWindowLongPtr(hWndDlg, GWLP_USERDATA); - - switch (message) { - case WM_INITDIALOG: - TranslateDialogDefault(hWndDlg); - dat = (MraSelectEMailDlgData*)lParam; - { - BOOL bMRAOnly; - - SetWindowLongPtr(hWndDlg, GWLP_USERDATA, (LONG_PTR)lParam); - HWND hWndList = GetDlgItem(hWndDlg, IDC_LIST_EMAILS); - - switch (dat->dwType) { - case MRA_SELECT_EMAIL_TYPE_SEND_POSTCARD: - bMRAOnly = FALSE; - break; - case MRA_SELECT_EMAIL_TYPE_VIEW_ALBUM: - case MRA_SELECT_EMAIL_TYPE_READ_BLOG: - bMRAOnly = TRUE; - break; - default: - bMRAOnly = FALSE; - break; - } - - LPSTR lpszProto = dat->hContact ? GetContactProto(dat->hContact) : dat->ppro->m_szModuleName; - - AddContactEMailToListParam(dat->hContact, bMRAOnly, lpszProto, "e-mail", hWndList); - AddContactEMailToListParam(dat->hContact, bMRAOnly, "UserInfo", "e-mail", hWndList); - AddContactEMailToListParam(dat->hContact, bMRAOnly, "UserInfo", "Mye-mail", hWndList); - AddContactEMailToListParam(dat->hContact, bMRAOnly, "UserInfo", "Companye-mail", hWndList); - AddContactEMailToListParam(dat->hContact, bMRAOnly, "UserInfo", "MyCompanye-mail", hWndList); - } - return TRUE; - - case WM_CLOSE: - DestroyWindow(hWndDlg); - break; - - case WM_DESTROY: - SetWindowLongPtr(hWndDlg, GWLP_USERDATA, 0); - mir_free(dat); - EndDialog(hWndDlg, NO_ERROR); - break; - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDC_LIST_EMAILS: - if (HIWORD(wParam) == LBN_DBLCLK) - SendMessage(hWndDlg, WM_COMMAND, MAKEWPARAM(IDOK, BN_CLICKED), (LPARAM)GetDlgItem(hWndDlg, IDOK)); - break; - - case IDOK: - { - CMStringA szEmail; - WCHAR wszBuff[MAX_PATH]; - - SendDlgItemMessage(hWndDlg, IDC_LIST_EMAILS, LB_GETTEXT, SendDlgItemMessage(hWndDlg, IDC_LIST_EMAILS, LB_GETCURSEL, 0, 0), (LPARAM)wszBuff); - szEmail = wszBuff; - szEmail.MakeLower(); - - switch (dat->dwType) { - case MRA_SELECT_EMAIL_TYPE_SEND_POSTCARD: - { - CMStringA szUrl; - szUrl.Format("http://cards.mail.ru/event.html?rcptname=%s&rcptemail=%s", _T2A(Clist_GetContactDisplayName(dat->hContact)), szEmail.c_str()); - dat->ppro->MraMPopSessionQueueAddUrl(dat->ppro->hMPopSessionQueue, szUrl); - } - break; - case MRA_SELECT_EMAIL_TYPE_VIEW_ALBUM: - dat->ppro->MraMPopSessionQueueAddUrlAndEMail(dat->ppro->hMPopSessionQueue, MRA_FOTO_URL, szEmail); - break; - case MRA_SELECT_EMAIL_TYPE_READ_BLOG: - dat->ppro->MraMPopSessionQueueAddUrlAndEMail(dat->ppro->hMPopSessionQueue, MRA_BLOGS_URL, szEmail); - break; - case MRA_SELECT_EMAIL_TYPE_VIEW_VIDEO: - dat->ppro->MraMPopSessionQueueAddUrlAndEMail(dat->ppro->hMPopSessionQueue, MRA_VIDEO_URL, szEmail); - break; - case MRA_SELECT_EMAIL_TYPE_ANSWERS: - dat->ppro->MraMPopSessionQueueAddUrlAndEMail(dat->ppro->hMPopSessionQueue, MRA_ANSWERS_URL, szEmail); - break; - case MRA_SELECT_EMAIL_TYPE_WORLD: - dat->ppro->MraMPopSessionQueueAddUrlAndEMail(dat->ppro->hMPopSessionQueue, MRA_WORLD_URL, szEmail); - break; - } - } - //break; - case IDCANCEL: - DestroyWindow(hWndDlg); - break; - default: - break; - } - break; - default: - break; - } - - return FALSE; -} - -DWORD CMraProto::MraSelectEMailDlgShow(MCONTACT hContact, DWORD dwType) -{ - MraSelectEMailDlgData *dat = (MraSelectEMailDlgData*)mir_calloc(sizeof(MraSelectEMailDlgData)); - if (dat) { - dat->ppro = this; - dat->hContact = hContact; - dat->dwType = dwType; - DialogBoxParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_DIALOG_SELECT_EMAIL), nullptr, MraSelectEMailDlgProc, (LPARAM)dat); - } - return 0; -} diff --git a/protocols/MRA/src/MraSelectEMail.h b/protocols/MRA/src/MraSelectEMail.h deleted file mode 100644 index e0ba9e078c..0000000000 --- a/protocols/MRA/src/MraSelectEMail.h +++ /dev/null @@ -1,15 +0,0 @@ -#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_ - - -#pragma once - -#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 - - -#endif // !defined(AFX_MRA_SELECT_EMAIL_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/protocols/MRA/src/MraSendCommand.cpp b/protocols/MRA/src/MraSendCommand.cpp deleted file mode 100644 index 15764f7c08..0000000000 --- a/protocols/MRA/src/MraSendCommand.cpp +++ /dev/null @@ -1,542 +0,0 @@ -#include "stdafx.h" -#include "MraRTFMsg.h" -#include "proto.h" - -class OutBuffer -{ - PBYTE m_buf; - size_t m_max, m_actual; - -public: - OutBuffer() : m_buf(nullptr), m_max(0), m_actual(0) {} - ~OutBuffer() { if (m_buf) free(m_buf); } - - void* Allocate(size_t len) - { - if (m_actual + len >= m_max) { - size_t increment = (len > 4096) ? len + 4096 : 4096; - m_buf = (PBYTE)realloc(m_buf, m_max += increment); - } - - void *res = m_buf + m_actual; m_actual += len; - return res; - } - - PBYTE Data() const { return m_buf; } - size_t Len() const { return m_actual; } - - void SetUL(DWORD dwData) - { - *(DWORD*)Allocate(sizeof(DWORD)) = dwData; - } - - void SetUIDL(DWORDLONG dwData) - { - *(DWORDLONG*)Allocate(sizeof(dwData)) = dwData; - } - - void SetGUID(MRA_GUID guidData) - { - *(MRA_GUID*)Allocate(sizeof(guidData)) = guidData; - } - - void SetLPS(const CMStringA &str) - { - SetUL(str.GetLength()); - memcpy(Allocate(str.GetLength()), str, str.GetLength()); - } - - void SetLPSW(const CMStringW &str) - { - DWORD dwBytes = str.GetLength() * sizeof(WCHAR); - SetUL(dwBytes); - memcpy(Allocate(dwBytes), str, dwBytes); - } - - void SetLPSLowerCase(const CMStringA &str) - { - SetUL(str.GetLength()); - BuffToLowerCase((LPSTR)Allocate(str.GetLength()), str, str.GetLength()); - } - - void SetLPSLowerCaseW(const CMStringW &str) - { - DWORD dwSize = str.GetLength() * sizeof(WCHAR); - SetUL(dwSize); - WCHAR *buf = (WCHAR*)Allocate(dwSize); - memcpy(buf, str, dwSize); - CharLowerBuff(buf, str.GetLength()); - } -}; - -///////////////////////////////////////////////////////////////////////////////////////// - -DWORD CMraProto::MraMessage(BOOL bAddToQueue, MCONTACT hContact, DWORD dwAckType, DWORD dwFlags, const CMStringA &szEmail, const CMStringW &lpwszMessage, LPBYTE lpbMultiChatData, size_t dwMultiChatDataSize) -{ - debugLogA("Sending message: flags %08x, to '%s', message '%S'\n", dwFlags, szEmail.c_str(), lpwszMessage.c_str()); - - DWORD dwRet = 0; - LPSTR lpszMessageConverted = (LPSTR)lpwszMessage.GetString(); - LPSTR lpszMessageRTF = nullptr; - size_t dwMessageConvertedSize = lpwszMessage.GetLength()*sizeof(WCHAR), dwMessageRTFSize = 0; - - if (MraIsMessageFlashAnimation(lpwszMessage)) - dwFlags |= MESSAGE_FLAG_FLASH; - - // pack auth message - if (dwFlags & MESSAGE_FLAG_AUTHORIZE) { - OutBuffer buf; - buf.SetUL(2); - buf.SetLPSW(L"");//***deb possible nick here - buf.SetLPSW(lpwszMessage); - lpszMessageConverted = mir_base64_encode(buf.Data(), buf.Len()); - dwMessageConvertedSize = mir_strlen(lpszMessageConverted); - } - // messages with Flash - else if (dwFlags & MESSAGE_FLAG_FLASH) { - dwFlags |= MESSAGE_FLAG_RTF; - - CMStringA lpszBuf(mir_u2a(lpwszMessage)); - - OutBuffer buf; - buf.SetUL(4); - buf.SetLPS(lpszBuf);// сообщение что у собеседника плохая версия :) - buf.SetUL(4); - buf.SetUL(getDword("RTFBackgroundColour", MRA_DEFAULT_RTF_BACKGROUND_COLOUR)); - buf.SetLPS(lpszBuf);// сам мульт ANSI - buf.SetLPSW(lpwszMessage);// сам мульт UNICODE - - DWORD dwBufSize = DWORD(buf.Len() + 128); - lpszBuf.Truncate(dwBufSize); - if (compress2((LPBYTE)(LPCSTR)lpszBuf, &dwBufSize, buf.Data(), (int)buf.Len(), Z_BEST_COMPRESSION) == Z_OK) { - lpszMessageRTF = mir_base64_encode(lpszBuf, dwBufSize); - dwMessageRTFSize = mir_strlen(lpszMessageRTF); - } - } - // standart message - else 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 - CMStringA lpbRTFData; lpbRTFData.Truncate(lpwszMessage.GetLength() * 16 + 4096); - if (!MraConvertToRTFW(lpwszMessage, lpbRTFData)) { - DWORD dwBackColour = getDword("RTFBackgroundColour", MRA_DEFAULT_RTF_BACKGROUND_COLOUR); - - OutBuffer buf; - buf.SetUL(2); - buf.SetLPS(lpbRTFData); - buf.SetUL(4); - buf.SetUL(dwBackColour); - - DWORD dwRTFDataSize = lpbRTFData.GetLength(); - if (compress2((LPBYTE)(LPCSTR)lpbRTFData, &dwRTFDataSize, buf.Data(), (int)buf.Len(), Z_BEST_COMPRESSION) == Z_OK) { - lpszMessageRTF = mir_base64_encode(lpbRTFData, dwRTFDataSize); - dwMessageRTFSize = mir_strlen(lpszMessageRTF); - } - } - } - } - - if (lpszMessageRTF == nullptr || dwMessageRTFSize == 0) dwFlags &= ~(MESSAGE_FLAG_RTF | MESSAGE_FLAG_FLASH); - if (lpbMultiChatData == nullptr || dwMultiChatDataSize == 0) dwFlags &= ~MESSAGE_FLAG_MULTICHAT; - - OutBuffer buf; - buf.SetUL(dwFlags); - buf.SetLPSLowerCase(szEmail); - buf.SetLPS(CMStringA(lpszMessageConverted, (int)dwMessageConvertedSize)); - buf.SetLPS(lpszMessageRTF); - if (dwFlags & MESSAGE_FLAG_MULTICHAT) - buf.SetLPS(CMStringA((LPSTR)lpbMultiChatData, (int)dwMultiChatDataSize)); - - if (bAddToQueue) - dwRet = MraSendQueueCMD(hSendQueueHandle, 0, hContact, dwAckType, nullptr, 0, MRIM_CS_MESSAGE, buf.Data(), buf.Len()); - else - dwRet = MraSendCMD(MRIM_CS_MESSAGE, buf.Data(), buf.Len()); - - return dwRet; -} - -// Send confirmation -DWORD CMraProto::MraMessageAsk(DWORD dwMsgID, DWORD dwFlags, const CMStringA &szEmail, const CMStringW &lpwszMessage, const CMStringW &lpwszMessageRTF) -{ - if (szEmail.GetLength() <= 4 || lpwszMessage.IsEmpty()) - return 0; - - OutBuffer buf; - buf.SetUL(dwMsgID);//UL msg_id - buf.SetUL(dwFlags);//UL flags - buf.SetLPSLowerCase(szEmail);// LPS from e-mail ANSI - buf.SetLPSW(lpwszMessage);// LPS message UNICODE - if (dwFlags & MESSAGE_FLAG_RTF) - buf.SetLPSW(lpwszMessageRTF);// LPS //rtf-formatted message ( >= 1.1) - MESSAGE_FLAG_RTF - - return MraSendCMD(MRIM_CS_MESSAGE_ACK, buf.Data(), buf.Len()); -} - -DWORD CMraProto::MraMessageRecv(const CMStringA &szFrom, DWORD dwMsgID) -{ - if (szFrom.GetLength() <= 4) - return 0; - - OutBuffer buf; - buf.SetLPSLowerCase(szFrom); - buf.SetUL(dwMsgID); - return MraSendCMD(MRIM_CS_MESSAGE_RECV, buf.Data(), buf.Len()); -} - -// Adds new contact -DWORD CMraProto::MraAddContact(MCONTACT hContact, DWORD dwContactFlag, DWORD dwGroupID, const CMStringA &szEmail, const CMStringW &wszCustomName, const CMStringA *szPhones, const CMStringW* wszAuthMessage) -{ - if (szEmail.GetLength() <= 4 && !(dwContactFlag & CONTACT_FLAG_GROUP)) - return 0; - - dwContactFlag |= CONTACT_FLAG_UNICODE_NAME; - if (dwGroupID == -1) - dwGroupID = 0; - - OutBuffer buf; - buf.SetUL(dwContactFlag); - buf.SetUL(dwGroupID); - buf.SetLPSLowerCase(szEmail); - buf.SetLPSW(wszCustomName); - buf.SetLPS((szPhones == nullptr) ? "" : *szPhones); - - // pack auth message - OutBuffer buf2; - buf2.SetUL(2); - buf2.SetLPSW(L"");//***deb possible nick here - buf2.SetLPSW((wszAuthMessage == nullptr) ? L"" : *wszAuthMessage); - buf.SetLPS(CMStringA(ptrA(mir_base64_encode(buf2.Data(), buf2.Len())))); - - buf.SetUL(0); - - return MraSendQueueCMD(hSendQueueHandle, 0, hContact, ACKTYPE_ADDED, nullptr, 0, MRIM_CS_ADD_CONTACT, buf.Data(), buf.Len()); -} - -// change contact -DWORD CMraProto::MraModifyContact(MCONTACT hContact, DWORD *pdwID, DWORD *pdwContactFlag, DWORD *pdwGroupID, const CMStringA *pszEmail, const CMStringW *pwszCustomName, const CMStringA *pszPhones) -{ - CMStringA szEmail, szPhones; - CMStringW wszNick, wszCustomName; - DWORD dwID, dwGroupID, dwContactFlag; - if (hContact) - GetContactBasicInfoW(hContact, &dwID, &dwGroupID, &dwContactFlag, nullptr, nullptr, &szEmail, &wszNick, &szPhones); - else - dwID = dwGroupID = dwContactFlag = 0; - - if (pdwID) dwID = *pdwID; - if (dwID == -1) - return 0; - - if (pszEmail) szEmail = *pszEmail; - if (pszPhones) szPhones = *pszPhones; - if (pdwGroupID) dwGroupID = *pdwGroupID; - if (pdwContactFlag) dwContactFlag = *pdwContactFlag; - if (pwszCustomName) wszCustomName = *pwszCustomName; - - OutBuffer buf; - buf.SetUL(dwID); - buf.SetUL(dwContactFlag | CONTACT_FLAG_UNICODE_NAME); - buf.SetUL(dwGroupID); - if (hContact) - buf.SetLPSLowerCase(szEmail); - else - buf.SetLPSW(wszCustomName); - buf.SetLPSW(wszCustomName); - buf.SetLPS(szPhones); - - return MraSendQueueCMD(hSendQueueHandle, 0, hContact, ACKTYPE_ADDED, nullptr, 0, MRIM_CS_MODIFY_CONTACT, buf.Data(), buf.Len()); -} - -// remove stored message -DWORD CMraProto::MraOfflineMessageDel(DWORDLONG dwMsgUIDL) -{ - return MraSendCMD(MRIM_CS_DELETE_OFFLINE_MESSAGE, &dwMsgUIDL, sizeof(DWORDLONG)); -} - -// autorize a user & add him to a roster -DWORD CMraProto::MraAuthorize(const CMStringA& szEmail) -{ - if (szEmail.GetLength() <= 4) - return 0; - - OutBuffer buf; - buf.SetLPSLowerCase(szEmail); - return MraSendCMD(MRIM_CS_AUTHORIZE, buf.Data(), buf.Len()); -} - -// change status -DWORD CMraProto::MraChangeStatus(DWORD dwStatus, const CMStringA &szStatusUri, const CMStringW &wszStatusTitle, const CMStringW &wszStatusDesc, DWORD dwFutureFlags) -{ - OutBuffer buf; - buf.SetUL(dwStatus); - buf.SetLPS(szStatusUri); - buf.SetLPSW(wszStatusTitle); - buf.SetLPSW(wszStatusDesc); - buf.SetUL(dwFutureFlags); - return MraSendCMD(MRIM_CS_CHANGE_STATUS, buf.Data(), buf.Len()); -} - -// Отправка файлов -DWORD CMraProto::MraFileTransfer(const CMStringA &szEmail, DWORD dwIDRequest, DWORD dwFilesTotalSize, const CMStringW &wszFiles, const CMStringA &szAddresses) -{ - if (szEmail.GetLength() <= 4) - return 0; - - CMStringA szFiles = wszFiles; - - OutBuffer buf; - buf.SetLPSLowerCase(szEmail); - buf.SetUL(dwIDRequest); - buf.SetUL(dwFilesTotalSize); - buf.SetUL(sizeof(DWORD) * 5 + szFiles.GetLength() + wszFiles.GetLength()*sizeof(WCHAR) + szAddresses.GetLength()); - - buf.SetLPS(szFiles); - buf.SetUL(sizeof(DWORD) * 2 + wszFiles.GetLength()*sizeof(WCHAR)); - - buf.SetUL(1); - buf.SetLPSW(wszFiles); - - buf.SetLPS(szAddresses); - return MraSendCMD(MRIM_CS_FILE_TRANSFER, buf.Data(), buf.Len()); -} - -// Ответ на отправку файлов -DWORD CMraProto::MraFileTransferAck(DWORD dwStatus, const CMStringA &szEmail, DWORD dwIDRequest, const CMStringA &szDescription) -{ - if (szEmail.GetLength() <= 4) - return 0; - - OutBuffer buf; - buf.SetUL(dwStatus); - buf.SetLPSLowerCase(szEmail); - buf.SetUL(dwIDRequest); - buf.SetLPS(szDescription); - return MraSendCMD(MRIM_CS_FILE_TRANSFER_ACK, buf.Data(), buf.Len()); -} - -// Поиск контакта -HANDLE CMraProto::MraWPRequestW(MCONTACT hContact, DWORD dwAckType, DWORD dwRequestFlags, const CMStringA &szUser, const CMStringA &szDomain, const CMStringW &wszNickName, const CMStringW &wszFirstName, const CMStringW &wszLastName, DWORD dwSex, DWORD dwDate1, DWORD dwDate2, DWORD dwCityID, DWORD dwZodiak, DWORD dwBirthdayMonth, DWORD dwBirthdayDay, DWORD dwCountryID, DWORD dwOnline) -{ - OutBuffer buf; - CMStringA tmp; - - if (GetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_USER)) { buf.SetUL(MRIM_CS_WP_REQUEST_PARAM_USER); buf.SetLPSLowerCase(szUser); } - if (GetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_DOMAIN)) { buf.SetUL(MRIM_CS_WP_REQUEST_PARAM_DOMAIN); buf.SetLPSLowerCase(szDomain); } - if (GetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_NICKNAME)) { buf.SetUL(MRIM_CS_WP_REQUEST_PARAM_NICKNAME); buf.SetLPSW(wszNickName); } - if (GetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_FIRSTNAME)) { buf.SetUL(MRIM_CS_WP_REQUEST_PARAM_FIRSTNAME); buf.SetLPSW(wszFirstName); } - if (GetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_LASTNAME)) { buf.SetUL(MRIM_CS_WP_REQUEST_PARAM_LASTNAME); buf.SetLPSW(wszLastName); } - - if (GetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_SEX)) { - tmp.Format("%lu", dwSex); - buf.SetUL(MRIM_CS_WP_REQUEST_PARAM_SEX); - buf.SetLPS(tmp); - } - - if (GetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_DATE1)) { - tmp.Format("%lu", dwDate1); - buf.SetUL(MRIM_CS_WP_REQUEST_PARAM_DATE1); - buf.SetLPS(tmp); - } - - if (GetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_DATE2)) { - tmp.Format("%lu", dwDate2); - buf.SetUL(MRIM_CS_WP_REQUEST_PARAM_DATE2); - buf.SetLPS(tmp); - } - - if (GetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_CITY_ID)) { - tmp.Format("%lu", dwCityID); - buf.SetUL(MRIM_CS_WP_REQUEST_PARAM_CITY_ID); - buf.SetLPS(tmp); - } - - if (GetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_ZODIAC)) { - tmp.Format("%lu", dwZodiak); - buf.SetUL(MRIM_CS_WP_REQUEST_PARAM_ZODIAC); - buf.SetLPS(tmp); - } - - if (GetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_MONTH)) { - tmp.Format("%lu", dwBirthdayMonth); - buf.SetUL(MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_MONTH); - buf.SetLPS(tmp); - } - - if (GetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_DAY)) { - tmp.Format("%lu", dwBirthdayDay); - buf.SetUL(MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_DAY); - buf.SetLPS(tmp); - } - - if (GetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_COUNTRY_ID)) { - tmp.Format("%lu", dwCountryID); - buf.SetUL(MRIM_CS_WP_REQUEST_PARAM_COUNTRY_ID); - buf.SetLPS(tmp); - } - - if (GetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_ONLINE)) { - tmp.Format("%lu", dwOnline); - buf.SetUL(MRIM_CS_WP_REQUEST_PARAM_ONLINE); - buf.SetLPS(tmp); - } - - return (HANDLE)MraSendQueueCMD(hSendQueueHandle, dwRequestFlags, hContact, dwAckType, nullptr, 0, MRIM_CS_WP_REQUEST, buf.Data(), buf.Len()); -} - -// Поиск контакта по EMail -HANDLE CMraProto::MraWPRequestByEMail(MCONTACT hContact, DWORD dwAckType, CMStringA &szEmail) -{ - if (szEmail.GetLength() <= 4) - return 0; - - int iStart = 0; - CMStringA szUser = szEmail.Tokenize("@", iStart); - CMStringA szDomain = szEmail.Tokenize("@", iStart); - - DWORD dwRequestFlags = 0; - SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_USER); - SetBit(dwRequestFlags, MRIM_CS_WP_REQUEST_PARAM_DOMAIN); - return MraWPRequestW(hContact, dwAckType, dwRequestFlags, szUser, szDomain, L"", L"", L"", 0, 0, 0, 0, 0, 0, 0, 0, 0); -} - -// Отправка файлов -DWORD CMraProto::MraGame(const CMStringA &szEmail, DWORD dwGameSessionID, DWORD dwGameMsg, DWORD dwGameMsgID, const CMStringA &szData) -{ - if (szEmail.GetLength() <= 4) - return 0; - - OutBuffer buf; - buf.SetLPSLowerCase(szEmail); - buf.SetUL(dwGameSessionID); - buf.SetUL(dwGameMsg); - buf.SetUL(dwGameMsgID); - buf.SetUL(_time32(nullptr)); - buf.SetLPS(szData); - return MraSendCMD(MRIM_CS_GAME, buf.Data(), buf.Len()); -} - -// Авторизация -DWORD CMraProto::MraLogin2W(const CMStringA &szLogin, const CMStringA &szPassword, DWORD dwStatus, const CMStringA &szStatusUri, CMStringW &wszStatusTitle, CMStringW &wszStatusDesc, DWORD dwFutureFlags, CMStringA &szUserAgentFormatted, CMStringA &szUserAgent) -{ - if (wszStatusTitle.GetLength() > STATUS_TITLE_MAX) wszStatusTitle.Truncate(STATUS_TITLE_MAX); - if (wszStatusDesc.GetLength() > STATUS_DESC_MAX) wszStatusDesc.Truncate(STATUS_DESC_MAX); - if (szUserAgentFormatted.GetLength() > USER_AGENT_MAX) szUserAgentFormatted.Truncate(USER_AGENT_MAX); - if (szUserAgent.GetLength() > MAX_CLIENT_DESCRIPTION) szUserAgent.Truncate(MAX_CLIENT_DESCRIPTION); - - OutBuffer buf; - buf.SetLPS(szLogin); - buf.SetLPS(szPassword); - buf.SetUL(dwStatus); - buf.SetLPS(szStatusUri); - buf.SetLPSW(wszStatusTitle); - buf.SetLPSW(wszStatusDesc); - buf.SetUL(dwFutureFlags); - buf.SetLPS(szUserAgentFormatted); - buf.SetLPS("ru"); - buf.SetLPS(""); - buf.SetLPS(""); - buf.SetLPS(szUserAgent);// LPS client description /max 256 - - return MraSendCMD(MRIM_CS_LOGIN2, buf.Data(), buf.Len()); -} - -// Отправка SMS -DWORD CMraProto::MraSMSW(MCONTACT hContact, const CMStringA &lpszPhone, const CMStringW &lpwszMessage) -{ - CMStringA szPhoneLocal = "+" + CopyNumber(lpszPhone); - - OutBuffer buf; - buf.SetUL(0); - buf.SetLPS(szPhoneLocal); - buf.SetLPSW(lpwszMessage); - - /* Save phone number for ack notify after send. */ - LPBYTE lpbData = (LPBYTE)mir_calloc(lpszPhone.GetLength() + sizeof(size_t)); - if (nullptr == lpbData) - return (0); - memcpy(lpbData, lpszPhone, lpszPhone.GetLength()); - return MraSendQueueCMD(hSendQueueHandle, 0, hContact, ICQACKTYPE_SMS, lpbData, lpszPhone.GetLength(), MRIM_CS_SMS, buf.Data(), buf.Len()); -} - -// Соединение с прокси -DWORD CMraProto::MraProxy(const CMStringA &szEmail, DWORD dwIDRequest, DWORD dwDataType, const CMStringA &lpszData, const CMStringA &szAddresses, MRA_GUID mguidSessionID) -{ - if (szEmail.GetLength() <= 4) - return 0; - - OutBuffer buf; - buf.SetLPSLowerCase(szEmail); - buf.SetUL(dwIDRequest); - buf.SetUL(dwDataType); - buf.SetLPS(lpszData); - buf.SetLPS(szAddresses); - buf.SetGUID(mguidSessionID); - return MraSendCMD(MRIM_CS_PROXY, buf.Data(), buf.Len()); -} - -// Ответ на соединение с прокси -DWORD CMraProto::MraProxyAck(DWORD dwStatus, const CMStringA &szEmail, DWORD dwIDRequest, DWORD dwDataType, const CMStringA &lpszData, const CMStringA &szAddresses, MRA_GUID mguidSessionID) -{ - if (szEmail.GetLength() <= 4) - return 0; - - OutBuffer buf; - buf.SetUL(dwStatus); - buf.SetLPSLowerCase(szEmail); - buf.SetUL(dwIDRequest); - buf.SetUL(dwDataType); - buf.SetLPS(lpszData); - buf.SetLPS(szAddresses); - buf.SetGUID(mguidSessionID); - return MraSendCMD(MRIM_CS_PROXY_ACK, buf.Data(), buf.Len()); -} - -// Отправка сообщения в микроблог -DWORD CMraProto::MraChangeUserBlogStatus(DWORD dwFlags, const CMStringW &wszText, DWORDLONG dwBlogStatusID) -{ - OutBuffer buf; - buf.SetUL(dwFlags); - buf.SetLPSW(wszText); - buf.SetUIDL(dwBlogStatusID); - return MraSendCMD(MRIM_CS_CHANGE_USER_BLOG_STATUS, buf.Data(), buf.Len()); -} - -DWORD CMraProto::MraSendPacket(HNETLIBCONN hConnection, DWORD dwCmdNum, DWORD dwType, LPVOID lpData, size_t dwDataSize) -{ - LPBYTE lpbData = (LPBYTE)_alloca(dwDataSize + sizeof(mrim_packet_header_t)); - - mrim_packet_header_t *pmaHeader = (mrim_packet_header_t*)lpbData; - memset(pmaHeader, 0, sizeof(mrim_packet_header_t)); - pmaHeader->magic = CS_MAGIC; - pmaHeader->proto = (PROTO_VERSION_MAJOR << 16) + PROTO_VERSION_MINOR; // Версия протокола - pmaHeader->seq = dwCmdNum;// Sequence - pmaHeader->msg = dwType;// Тип пакета - pmaHeader->dlen = (unsigned)dwDataSize;// Длина данных - - debugLogA("Sending packet %08x\n", dwType); - - memcpy((lpbData + sizeof(mrim_packet_header_t)), lpData, dwDataSize); - return Netlib_Send(hConnection, (LPSTR)lpbData, (int)(dwDataSize + sizeof(mrim_packet_header_t)), 0); -} - -DWORD CMraProto::MraSendCMD(DWORD dwType, LPVOID lpData, size_t dwDataSize) -{ - DWORD dwRet = InterlockedIncrement((LONG volatile*)&dwCMDNum); - - mir_cslock l(csCriticalSectionSend); // guarding winsock internal buffers - return !MraSendPacket(m_hConnection, dwRet, dwType, lpData, dwDataSize) ? 0 : dwRet; -} - - -DWORD CMraProto::MraSendQueueCMD(HANDLE hQueue, DWORD dwFlags, MCONTACT hContact, DWORD dwAckType, LPBYTE lpbDataQueue, size_t dwDataQueueSize, DWORD dwType, LPVOID lpData, size_t dwDataSize) -{ - DWORD dwRet = InterlockedIncrement((LONG volatile*)&dwCMDNum); - if (!MraSendQueueAdd(hQueue, dwRet, dwFlags, hContact, dwAckType, lpbDataQueue, dwDataQueueSize)) { - mir_cslock l(csCriticalSectionSend); // guarding winsock internal buffers - if (!MraSendPacket(m_hConnection, dwRet, dwType, lpData, dwDataSize)) { - MraSendQueueFree(hQueue, dwRet); - dwRet = 0; - } - } - return dwRet; -} diff --git a/protocols/MRA/src/MraSendQueue.cpp b/protocols/MRA/src/MraSendQueue.cpp deleted file mode 100644 index 52661d4fb1..0000000000 --- a/protocols/MRA/src/MraSendQueue.cpp +++ /dev/null @@ -1,161 +0,0 @@ -#include "stdafx.h" -#include "MraSendQueue.h" - -struct MRA_SEND_QUEUE : public LIST_MT -{ - DWORD dwSendTimeOutInterval; -}; - -struct MRA_SEND_QUEUE_ITEM : public LIST_MT_ITEM -{ - // internal - FILETIME ftSendTime; - - // external - DWORD dwCMDNum; - DWORD dwFlags; - MCONTACT hContact; - DWORD dwAckType; - LPBYTE lpbData; - size_t dwDataSize; -}; - -#define FILETIME_SECOND ((DWORDLONG)10000000) - -DWORD MraSendQueueInitialize(DWORD dwSendTimeOutInterval, HANDLE *phSendQueueHandle) -{ - if (!phSendQueueHandle) - return ERROR_INVALID_HANDLE; - - MRA_SEND_QUEUE *pmrasqSendQueue = new MRA_SEND_QUEUE(); - pmrasqSendQueue->dwSendTimeOutInterval = dwSendTimeOutInterval; - *phSendQueueHandle = (HANDLE)pmrasqSendQueue; - return NO_ERROR; -} - -void MraSendQueueDestroy(HANDLE hSendQueueHandle) -{ - if (!hSendQueueHandle) - return; - - MRA_SEND_QUEUE *pmrasqSendQueue = (MRA_SEND_QUEUE*)hSendQueueHandle; - MRA_SEND_QUEUE_ITEM *pmrasqiSendQueueItem; - { - mir_cslock l(pmrasqSendQueue->cs); - while ( !ListMTItemGetFirst(pmrasqSendQueue, nullptr, (LPVOID*)&pmrasqiSendQueueItem)) { - ListMTItemDelete(pmrasqSendQueue, pmrasqiSendQueueItem); - mir_free(pmrasqiSendQueueItem); - } - } - - delete pmrasqSendQueue; -} - - -DWORD MraSendQueueAdd(HANDLE hSendQueueHandle, DWORD dwCMDNum, DWORD dwFlags, MCONTACT hContact, DWORD dwAckType, LPBYTE lpbData, size_t dwDataSize) -{ - if (!hSendQueueHandle || !dwCMDNum) - return ERROR_INVALID_HANDLE; - - MRA_SEND_QUEUE *pmrasqSendQueue = (MRA_SEND_QUEUE*)hSendQueueHandle; - MRA_SEND_QUEUE_ITEM *pmrasqiSendQueueItem; - - pmrasqiSendQueueItem = (MRA_SEND_QUEUE_ITEM*)mir_calloc(sizeof(MRA_SEND_QUEUE_ITEM)); - if (!pmrasqiSendQueueItem) - return GetLastError(); - - GetSystemTimeAsFileTime(&pmrasqiSendQueueItem->ftSendTime); - pmrasqiSendQueueItem->dwCMDNum = dwCMDNum; - pmrasqiSendQueueItem->dwFlags = dwFlags; - pmrasqiSendQueueItem->hContact = hContact; - pmrasqiSendQueueItem->dwAckType = dwAckType; - pmrasqiSendQueueItem->lpbData = lpbData; - pmrasqiSendQueueItem->dwDataSize = dwDataSize; - - mir_cslock l(pmrasqSendQueue->cs); - ListMTItemAdd(pmrasqSendQueue, pmrasqiSendQueueItem, pmrasqiSendQueueItem); - return 0; -} - -DWORD MraSendQueueFree(HANDLE hSendQueueHandle, DWORD dwCMDNum) -{ - if (!hSendQueueHandle) - return ERROR_INVALID_HANDLE; - - MRA_SEND_QUEUE *pmrasqSendQueue = (MRA_SEND_QUEUE*)hSendQueueHandle; - MRA_SEND_QUEUE_ITEM *pmrasqiSendQueueItem; - LIST_MT_ITERATOR lmtiIterator; - - mir_cslock l(pmrasqSendQueue->cs); - ListMTIteratorMoveFirst(pmrasqSendQueue, &lmtiIterator); - do { - if ( !ListMTIteratorGet(&lmtiIterator, nullptr, (LPVOID*)&pmrasqiSendQueueItem)) - if (pmrasqiSendQueueItem->dwCMDNum == dwCMDNum) { - ListMTItemDelete(pmrasqSendQueue, pmrasqiSendQueueItem); - mir_free(pmrasqiSendQueueItem); - return 0; - } - } - while (ListMTIteratorMoveNext(&lmtiIterator)); - - return ERROR_NOT_FOUND; -} - -DWORD MraSendQueueFind(HANDLE hSendQueueHandle, DWORD dwCMDNum, DWORD *pdwFlags, MCONTACT *phContact, DWORD *pdwAckType, LPBYTE *plpbData, size_t *pdwDataSize) -{ - if (!hSendQueueHandle) - return ERROR_INVALID_HANDLE; - - MRA_SEND_QUEUE *pmrasqSendQueue = (MRA_SEND_QUEUE*)hSendQueueHandle; - MRA_SEND_QUEUE_ITEM *pmrasqiSendQueueItem; - LIST_MT_ITERATOR lmtiIterator; - - mir_cslock l(pmrasqSendQueue->cs); - ListMTIteratorMoveFirst(pmrasqSendQueue, &lmtiIterator); - do { - if ( !ListMTIteratorGet(&lmtiIterator, nullptr, (LPVOID*)&pmrasqiSendQueueItem)) - 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; - return 0; - } - } - while (ListMTIteratorMoveNext(&lmtiIterator)); - - return ERROR_NOT_FOUND; -} - -DWORD MraSendQueueFindOlderThan(HANDLE hSendQueueHandle, DWORD dwTime, DWORD *pdwCMDNum, DWORD *pdwFlags, MCONTACT *phContact, DWORD *pdwAckType, LPBYTE *plpbData, size_t *pdwDataSize) -{ - if (!hSendQueueHandle) - return ERROR_INVALID_HANDLE; - - FILETIME ftExpireTime; - GetSystemTimeAsFileTime(&ftExpireTime); - (*((DWORDLONG*)&ftExpireTime))-=((DWORDLONG)dwTime*FILETIME_SECOND); - - MRA_SEND_QUEUE *pmrasqSendQueue = (MRA_SEND_QUEUE*)hSendQueueHandle; - mir_cslock l(pmrasqSendQueue->cs); - - LIST_MT_ITERATOR lmtiIterator; - ListMTIteratorMoveFirst(pmrasqSendQueue, &lmtiIterator); - do { - MRA_SEND_QUEUE_ITEM *pmrasqiSendQueueItem; - if ( !ListMTIteratorGet(&lmtiIterator, nullptr, (LPVOID*)&pmrasqiSendQueueItem)) - 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; - return 0; - } - } - while (ListMTIteratorMoveNext(&lmtiIterator)); - - return ERROR_NOT_FOUND; -} diff --git a/protocols/MRA/src/MraSendQueue.h b/protocols/MRA/src/MraSendQueue.h deleted file mode 100644 index cb3a62b4e3..0000000000 --- a/protocols/MRA/src/MraSendQueue.h +++ /dev/null @@ -1,16 +0,0 @@ -#if !defined(AFX_MRA_SENDQUEUE_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) -#define AFX_MRA_SENDQUEUE_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ - - -#pragma once - -DWORD MraSendQueueInitialize(DWORD dwSendTimeOutInterval, HANDLE *phSendQueueHandle); -void MraSendQueueDestroy(HANDLE hSendQueueHandle); - -DWORD MraSendQueueAdd(HANDLE hSendQueueHandle, DWORD dwCMDNum, DWORD dwFlags, MCONTACT hContact, DWORD dwAckType, LPBYTE lpbData, size_t dwDataSize); -DWORD MraSendQueueFree(HANDLE hSendQueueHandle, DWORD dwCMDNum); - -DWORD MraSendQueueFind(HANDLE hSendQueueHandle, DWORD dwCMDNum, DWORD *pdwFlags, MCONTACT *phContact, DWORD *pdwAckType, LPBYTE *plpbData, size_t *pdwDataSize); -DWORD MraSendQueueFindOlderThan(HANDLE hSendQueueHandle, DWORD dwTime, DWORD *pdwCMDNum, DWORD *pdwFlags, MCONTACT *phContact, DWORD *pdwAckType, LPBYTE *plpbData, size_t *pdwDataSize); - -#endif // !defined(AFX_MRA_SENDQUEUE_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/protocols/MRA/src/Mra_functions.cpp b/protocols/MRA/src/Mra_functions.cpp deleted file mode 100644 index 39c95922d4..0000000000 --- a/protocols/MRA/src/Mra_functions.cpp +++ /dev/null @@ -1,1439 +0,0 @@ -#include "stdafx.h" - -#define MRA_PASS_CRYPT_VER 2 - -struct SetXStatusData -{ - CMraProto *ppro; - DWORD dwXStatus; - DWORD dwCountdown; - HICON hDlgIcon; -}; - -struct SetBlogStatusData -{ - CMraProto *ppro; - MCONTACT hContact; -}; - -#define RECURSION_DATA_STACK_ITEMS_MIN 128 -struct RECURSION_DATA_STACK_ITEM -{ - HANDLE hFind; - DWORD dwFileNameLen; - WIN32_FIND_DATA w32fdFindFileData; -}; - -CMStringA MraGetSelfVersionString() -{ - LPSTR lpszSecIM = ServiceExists("SecureIM/IsContactSecured") ? " + SecureIM" : ""; - - MFileVersion v; - Miranda_GetFileVersion(&v); - - CMStringA szSelfVersion; - szSelfVersion.Format("Miranda NG %lu.%lu.%lu.%lu Unicode (MRA v%lu.%lu.%lu.%lu)%s, version: %lu.%lu", - v[0], v[1], v[2], v[3], __FILEVERSION_STRING, lpszSecIM, PROTO_VERSION_MAJOR, PROTO_VERSION_MINOR); - return szSelfVersion; -} - -static DWORD GetParamValue(const CMStringA &szData, LPCSTR szParamName, DWORD dwParamNameSize, CMStringA &szParamValue) -{ - if (szData.IsEmpty()) - return ERROR_INVALID_HANDLE; - - char *tmp = NEWSTR_ALLOCA(szData.c_str()); - _strlwr(tmp); - - LPSTR lpszParamDataStart = strstr(tmp, szParamName); - if (lpszParamDataStart) - if ((*((WORD*)(lpszParamDataStart + dwParamNameSize))) == (*((WORD*)"=\""))) { - lpszParamDataStart += dwParamNameSize + 2; - LPSTR lpszParamDataEnd = strchr(lpszParamDataStart, '"'); - if (lpszParamDataEnd) { - szParamValue = CMStringA(szData.c_str() + (lpszParamDataStart - tmp), lpszParamDataEnd - lpszParamDataStart); - return NO_ERROR; - } - } - return ERROR_NOT_FOUND; -} - -CMStringA MraGetVersionStringFromFormatted(const CMStringA &szUserAgentFormatted) -{ - if (szUserAgentFormatted.IsEmpty()) - return ""; - - CMStringA res, tmp; - - if (!GetParamValue(szUserAgentFormatted, "name", 4, tmp)) - if (tmp == "Miranda IM" || tmp == "Miranda NG") { - GetParamValue(szUserAgentFormatted, "title", 5, res); - return res; - } - - if (!GetParamValue(szUserAgentFormatted, "client", 6, tmp)) { - if (tmp == "wmagent") - tmp = "MobileAgent for WM"; - else if (tmp == "jagent") - tmp = "MobileAgent for Java"; - else if (tmp == "android") - tmp = "MobileAgent for Android"; - else if (tmp == "iphoneagent") - tmp = "MobileAgent for Iphone"; - else if (tmp == "sagent") - tmp = "MobileAgent for Symbian"; - res += tmp + " "; - } - - if (!GetParamValue(szUserAgentFormatted, "name", 4, tmp)) - res += tmp + " "; - - if (!GetParamValue(szUserAgentFormatted, "title", 5, tmp)) - res += tmp + " "; - - if (!GetParamValue(szUserAgentFormatted, "version", 7, tmp)) { - res += tmp + " "; - if (!GetParamValue(szUserAgentFormatted, "build", 5, tmp)) - res += tmp; - } - - // no data extracted, copy raw - return (res.IsEmpty()) ? szUserAgentFormatted : res; -} - -DWORD MraAddrListGetFromBuff(const CMStringA &szAddresses, MRA_ADDR_LIST *pmalAddrList) -{ - if (szAddresses.IsEmpty() || !pmalAddrList) - return ERROR_INVALID_HANDLE; - - DWORD dwAllocatedCount = ALLOCATED_COUNT; - pmalAddrList->dwAddrCount = 0; - pmalAddrList->pMailAddress = (MRA_ADDR_LIST_ITEM*)mir_calloc(sizeof(MRA_ADDR_LIST_ITEM)*dwAllocatedCount); - - LPSTR buf = NEWSTR_ALLOCA(szAddresses.c_str()), lpszCurrentItem = buf; - - while (TRUE) { - LPSTR lpszEndItem = strchr(lpszCurrentItem, ';'); - if (lpszEndItem == nullptr) - lpszEndItem = buf + szAddresses.GetLength(); - if (!lpszEndItem) - break; - - LPSTR lpszDelimiter = strchr(lpszCurrentItem, ':'); - if (!lpszDelimiter) - break; - - if (pmalAddrList->dwAddrCount == dwAllocatedCount) { - dwAllocatedCount += ALLOCATED_COUNT; - pmalAddrList->pMailAddress = (MRA_ADDR_LIST_ITEM*)mir_realloc(pmalAddrList->pMailAddress, (sizeof(MRA_ADDR_LIST_ITEM)*dwAllocatedCount)); - } - - *lpszDelimiter = 0; - pmalAddrList->pMailAddress[pmalAddrList->dwAddrCount].dwAddr = inet_addr(lpszCurrentItem); - pmalAddrList->pMailAddress[pmalAddrList->dwAddrCount].dwPort = StrToUNum32((lpszDelimiter + 1), (lpszEndItem - (lpszDelimiter + 1))); - *lpszDelimiter = ':'; - pmalAddrList->dwAddrCount++; - lpszCurrentItem = lpszEndItem + 1; - - if (lpszEndItem == buf + szAddresses.GetLength()) - break; - } - pmalAddrList->pMailAddress = (MRA_ADDR_LIST_ITEM*)mir_realloc(pmalAddrList->pMailAddress, (sizeof(MRA_ADDR_LIST_ITEM)*pmalAddrList->dwAddrCount)); - return NO_ERROR; -} - -CMStringA MraAddrListGetToBuff(MRA_ADDR_LIST *pmalAddrList) -{ - if (!pmalAddrList) - return ""; - - CMStringA res; - for (size_t i = 0; i < pmalAddrList->dwAddrCount; i++) { - char buf[100]; - mir_snprintf(buf, "%s:%lu;", inet_ntoa((*((in_addr*)&pmalAddrList->pMailAddress[i].dwAddr))), pmalAddrList->pMailAddress[i].dwPort); - res += buf; - } - - return res; -} - -void CMraProto::MraAddrListStoreToContact(MCONTACT hContact, MRA_ADDR_LIST *pmalAddrList) -{ - if (!hContact || !pmalAddrList) - return; - - if (!pmalAddrList->dwAddrCount) - return; - - setDword(hContact, "OldIP", getDword(hContact, "IP", 0)); - setDword(hContact, "IP", ntohl(pmalAddrList->pMailAddress[0].dwAddr)); - if (pmalAddrList->dwAddrCount > 1) { - setDword(hContact, "OldRealIP", getDword(hContact, "RealIP", 0)); - setDword(hContact, "RealIP", ntohl(pmalAddrList->pMailAddress[1].dwAddr)); - } -} - -void MraAddrListFree(MRA_ADDR_LIST *pmalAddrList) -{ - if (pmalAddrList) { - mir_free(pmalAddrList->pMailAddress); - pmalAddrList->dwAddrCount = 0; - } -} - -bool DB_GetStaticStringA(MCONTACT hContact, LPCSTR lpszModule, LPCSTR lpszValueName, LPSTR lpszRetBuff, size_t dwRetBuffSize, size_t *pdwRetBuffSize) -{ - bool bRet = false; - - DBVARIANT dbv = { 0 }; - if (db_get_ws(hContact, lpszModule, lpszValueName, &dbv) == 0) { - size_t dwRetBuffSizeLocal, dwReadedStringLen = mir_wstrlen(dbv.pwszVal); - if (lpszRetBuff && (dwRetBuffSize > dwReadedStringLen)) { - dwRetBuffSizeLocal = WideCharToMultiByte(MRA_CODE_PAGE, 0, dbv.pwszVal, (int)dwReadedStringLen, lpszRetBuff, (int)dwRetBuffSize, nullptr, nullptr); - (*((CHAR*)(lpszRetBuff + dwRetBuffSizeLocal))) = 0; - bRet = true; - } - else { - dwRetBuffSizeLocal = dwReadedStringLen; - if (lpszRetBuff && dwRetBuffSize >= sizeof(WORD)) (*((WORD*)lpszRetBuff)) = 0; - } - if (pdwRetBuffSize) (*pdwRetBuffSize) = dwRetBuffSizeLocal; - - db_free(&dbv); - } - else { - if (lpszRetBuff && dwRetBuffSize >= sizeof(WORD)) (*((WORD*)lpszRetBuff)) = 0; - if (pdwRetBuffSize) (*pdwRetBuffSize) = 0; - } - return bRet; -} - -// sizes in wchars -bool DB_GetStaticStringW(MCONTACT hContact, LPCSTR lpszModule, LPCSTR lpszValueName, LPWSTR lpwszRetBuff, size_t dwRetBuffSize, size_t *pdwRetBuffSize) -{ - bool bRet = false; - size_t dwReadedStringLen; - DBVARIANT dbv = { 0 }; - if (db_get_ws(hContact, lpszModule, lpszValueName, &dbv) == 0) { - dwReadedStringLen = mir_wstrlen(dbv.pwszVal); - if (lpwszRetBuff && (dwRetBuffSize > dwReadedStringLen)) { - memcpy(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; - - db_free(&dbv); - } - else { - if (lpwszRetBuff && dwRetBuffSize >= sizeof(WCHAR)) (*((WCHAR*)lpwszRetBuff)) = 0; - if (pdwRetBuffSize) (*pdwRetBuffSize) = 0; - } - return bRet; -} - -bool DB_GetStringA(MCONTACT hContact, LPCSTR lpszModule, LPCSTR lpszValueName, CMStringA& res) -{ - char *szRes = db_get_sa(hContact, lpszModule, lpszValueName); - if (szRes) { - res = szRes; - mir_free(szRes); - return true; - } - - res.Empty(); - return false; -} - - -bool DB_GetStringW(MCONTACT hContact, LPCSTR lpszModule, LPCSTR lpszValueName, CMStringW& res) -{ - WCHAR *szRes = db_get_wsa(hContact, lpszModule, lpszValueName); - if (szRes) { - res = szRes; - mir_free(szRes); - return true; - } - - res.Empty(); - return false; -} - -bool DB_SetStringExA(MCONTACT hContact, LPCSTR lpszModule, LPCSTR lpszValueName, const CMStringA &szValue) -{ - if (szValue.IsEmpty()) { - db_unset(hContact, lpszModule, lpszValueName); - return true; - } - - return db_set_s(hContact, lpszModule, lpszValueName, szValue) != 0; -} - -bool DB_SetStringExW(MCONTACT hContact, LPCSTR lpszModule, LPCSTR lpszValueName, const CMStringW &szValue) -{ - if (szValue.IsEmpty()) { - db_unset(hContact, lpszModule, lpszValueName); - return true; - } - - return db_set_ws(hContact, lpszModule, lpszValueName, szValue) != 0; -} - -bool DB_GetContactSettingBlob(MCONTACT hContact, LPCSTR lpszModule, LPCSTR lpszValueName, LPVOID lpRet, size_t dwRetBuffSize, size_t *pdwRetBuffSize) -{ - bool bRet = false; - DBVARIANT dbv; - if (db_get(hContact, lpszModule, lpszValueName, &dbv) == 0) { - if (dbv.type == DBVT_BLOB) { - if (dwRetBuffSize >= dbv.cpbVal) { - memcpy(lpRet, dbv.pbVal, dbv.cpbVal); - bRet = true; - } - if (pdwRetBuffSize) (*pdwRetBuffSize) = dbv.cpbVal; - } - db_free(&dbv); - } - else { - if (pdwRetBuffSize) (*pdwRetBuffSize) = 0; - bRet = false; - } - return bRet; -} - -DWORD CMraProto::MraMoveContactToGroup(MCONTACT hContact, DWORD dwGroupID, LPCTSTR ptszName) -{ - MraGroupItem *p = nullptr; - - for (auto &it : m_groups) - if (it->m_name == ptszName) { - p = it; - break; - } - - if (p == nullptr) { - if (m_groups.getCount() == 20) - return 0; - - DWORD id; - for (id = 0; id < 20; id++) - if (m_groups.find((MraGroupItem*)&id) == nullptr) - break; - - DWORD dwContactFlags = CONTACT_FLAG_UNICODE_NAME | CONTACT_FLAG_GROUP | (id << 24); - p = new MraGroupItem(id, dwContactFlags, ptszName); - m_groups.insert(p); - MraAddContact(NULL, dwContactFlags, 0, ptszName, p->m_name); - } - - if (dwGroupID != p->m_id) { - setDword(hContact, "GroupID", p->m_id); - MraModifyContact(hContact, 0, 0, &p->m_id); - } - return p->m_id; -} - -DWORD CMraProto::GetContactFlags(MCONTACT hContact) -{ - DWORD dwRet = 0; - - if (IsContactMra(hContact)) { - dwRet = 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; - - CMStringA szEmail; - if (mraGetStringA(hContact, "e-mail", szEmail)) - if (IsEMailChatAgent(szEmail)) - dwRet |= CONTACT_FLAG_MULTICHAT; - - if (db_get_b(hContact, "CList", "Hidden", 0)) - dwRet |= CONTACT_FLAG_SHADOW; - - switch (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, hContact, IGNOREEVENT_MESSAGE)) dwRet |= CONTACT_FLAG_IGNORE; - } - return(dwRet); -} - -DWORD CMraProto::SetContactFlags(MCONTACT hContact, DWORD dwContactFlag) -{ - if (!IsContactMra(hContact)) - return ERROR_INVALID_HANDLE; - - setDword(hContact, "ContactFlags", dwContactFlag); - - if (dwContactFlag & CONTACT_FLAG_SHADOW) - db_set_b(hContact, "CList", "Hidden", 1); - else - db_unset(hContact, "CList", "Hidden"); - - switch (dwContactFlag & (CONTACT_FLAG_INVISIBLE | CONTACT_FLAG_VISIBLE)) { - case CONTACT_FLAG_INVISIBLE: - setWord(hContact, "ApparentMode", ID_STATUS_OFFLINE); - break; - case CONTACT_FLAG_VISIBLE: - setWord(hContact, "ApparentMode", ID_STATUS_ONLINE); - break; - default: - setWord(hContact, "ApparentMode", 0); - break; - } - - if (dwContactFlag & CONTACT_FLAG_IGNORE) - CallService(MS_IGNORE_IGNORE, hContact, IGNOREEVENT_MESSAGE); - else - CallService(MS_IGNORE_UNIGNORE, hContact, IGNOREEVENT_MESSAGE); - - return 0; -} - -DWORD CMraProto::GetContactBasicInfoW(MCONTACT hContact, DWORD *pdwID, DWORD *pdwGroupID, DWORD *pdwContactFlag, DWORD *pdwContactSeverFlags, DWORD *pdwStatus, CMStringA *szEmail, CMStringW *wszNick, CMStringA *szPhones) -{ - if (!IsContactMra(hContact)) - return ERROR_INVALID_HANDLE; - - if (pdwID) - *pdwID = getDword(hContact, "ContactID", -1); - if (pdwGroupID) - *pdwGroupID = getDword(hContact, "GroupID", -1); - if (pdwContactSeverFlags) - *pdwContactSeverFlags = getDword(hContact, "ContactServerFlags", 0); - if (pdwStatus) - *pdwStatus = MraGetContactStatus(hContact); - if (pdwContactFlag) - *pdwContactFlag = GetContactFlags(hContact); - if (szEmail) - if (!mraGetStringA(hContact, "e-mail", *szEmail)) - return 0; - if (wszNick) - DB_GetStringW(hContact, "CList", "MyHandle", *wszNick); - - if (szPhones) { - CMStringA szPhone; - - for (int i = 0; i < 3; i++) { - char szValue[50]; - mir_snprintf(szValue, "MyPhone%d", i); - if (DB_GetStringA(hContact, "UserInfo", szValue, szPhone)) { - if (szPhones->GetLength()) - szPhones->AppendChar(','); - szPhones->Append(szPhone); - } - } - } - return 0; -} - -DWORD CMraProto::SetContactBasicInfoW(MCONTACT hContact, DWORD dwSetInfoFlags, DWORD dwFlags, DWORD dwID, DWORD dwGroupID, DWORD dwContactFlag, DWORD dwContactSeverFlags, DWORD dwStatus, const CMStringA *szEmail, const CMStringW *wszNick, const CMStringA *szPhones) -{ - if (!IsContactMra(hContact)) - return ERROR_INVALID_HANDLE; - - // LOCK - if (dwSetInfoFlags & SCBIFSI_LOCK_CHANGES_EVENTS) - setDword(hContact, "HooksLocked", TRUE); - - // поля которые нужны, и изменения которых не отслеживаются - if (dwFlags & SCBIF_ID) - setDword(hContact, "ContactID", dwID); - - if ((dwFlags & SCBIF_EMAIL) && szEmail != nullptr && !szEmail->IsEmpty()) - mraSetStringExA(hContact, "e-mail", *szEmail); - - // поля изменения которых отслеживаются - if (dwFlags & SCBIF_GROUP_ID) { - setDword(hContact, "GroupID", dwGroupID); - - MraGroupItem *grp = m_groups.find((MraGroupItem*)&dwGroupID); - if (grp) { - ptrW tszGroup(db_get_wsa(hContact, "CList", "Group")); - if (mir_wstrcmp(tszGroup, grp->m_name)) - db_set_ws(hContact, "CList", "Group", grp->m_name); - } - } - - if ((dwFlags & SCBIF_NICK) && wszNick != nullptr && !wszNick->IsEmpty()) { - if ((dwFlags & SCBIF_FLAG) && ((dwContactFlag & CONTACT_FLAG_UNICODE_NAME) == 0)) - DB_SetStringExA(hContact, "CList", "MyHandle", CMStringA(*wszNick)); - else - DB_SetStringExW(hContact, "CList", "MyHandle", *wszNick); - } - - if ((dwFlags & SCBIF_PHONES) && szPhones != nullptr && !szPhones->IsEmpty()) { - int iStart = 0, i = 0; - while (true) { - CMStringA szPhone = szPhones->Tokenize(",", iStart); - if (iStart == -1) - break; - - char szValue[MAX_PATH]; - mir_snprintf(szValue, "MyPhone%d", i++); - DB_SetStringExA(hContact, "UserInfo", szValue, "+" + szPhone); - } - } - - if (dwFlags & SCBIF_FLAG) - SetContactFlags(hContact, dwContactFlag); - - if (dwFlags & SCBIF_SERVER_FLAG) - setDword(hContact, "ContactServerFlags", dwContactSeverFlags); - - if (dwFlags & SCBIF_STATUS) - MraSetContactStatus(hContact, dwStatus); - - SetExtraIcons(hContact); - // UNLOCK - if (dwSetInfoFlags & SCBIFSI_LOCK_CHANGES_EVENTS) - setDword(hContact, "HooksLocked", FALSE); - - return 0; -} - -MCONTACT CMraProto::MraHContactFromEmail(const CMStringA &szEmail, BOOL bAddIfNeeded, BOOL bTemporary, BOOL *pbAdded) -{ - if (szEmail.IsEmpty()) - return NULL; - - MCONTACT hContact = NULL; - bool bFound = false; - - // check not already on list - CMStringA szEMailLocal; - for (auto &cc : AccContacts()) { - if (mraGetStringA(cc, "e-mail", szEMailLocal)) { - if (szEMailLocal == szEmail) { - if (bTemporary == FALSE) - db_unset(cc, "CList", "NotOnList"); - hContact = cc; - bFound = true; - break; - } - } - } - - if (!bFound && bAddIfNeeded) { - //not already there: add - if (IsEMailChatAgent(szEmail)) { - CMStringW wszEMail = szEmail; - SESSION_INFO *si = Chat_NewSession(GCW_CHATROOM, m_szModuleName, wszEMail, wszEMail); - if (si != nullptr) { - bool bChatAdded = (si->hContact != NULL); - if (bChatAdded == FALSE) - hContact = NULL; - } - } - else { - hContact = db_add_contact(); - Proto_AddToContact(hContact, m_szModuleName); - } - - if (hContact) { - if (IsEMailChatAgent(szEmail)) - 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, &szEmail, nullptr, nullptr); - else { - if (bTemporary) - db_set_b(hContact, "CList", "NotOnList", 1); - mraSetStringExA(hContact, "MirVer", MIRVER_UNKNOWN); - 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, &szEmail, nullptr, nullptr); - } - } - } - - if (pbAdded) - *pbAdded = (bFound == false && bAddIfNeeded && hContact); - - return hContact; -} - -bool CMraProto::MraUpdateContactInfo(MCONTACT hContact) -{ - if (m_bLoggedIn && hContact) - if (IsContactMra(hContact)) { - CMStringA szEmail; - if (mraGetStringA(hContact, "e-mail", szEmail)) { - MraAvatarsQueueGetAvatarSimple(hAvatarsQueueHandle, GAIF_FORCE, hContact); - if (MraWPRequestByEMail(hContact, ACKTYPE_GETINFO, szEmail)) - return true; - } - } - return false; -} - -DWORD CMraProto::MraContactCapabilitiesGet(MCONTACT hContact) -{ - return getDword(hContact, DBSETTING_CAPABILITIES, 0); -} - -void CMraProto::MraContactCapabilitiesSet(MCONTACT hContact, DWORD dwFutureFlags) -{ - setDword(hContact, DBSETTING_CAPABILITIES, dwFutureFlags); -} - -DWORD CMraProto::MraGetContactStatus(MCONTACT hContact) -{ - return getWord(hContact, "Status", ID_STATUS_OFFLINE); -} - -DWORD CMraProto::MraSetContactStatus(MCONTACT hContact, DWORD dwNewStatus) -{ - DWORD dwOldStatus = MraGetContactStatus(hContact); - - if (dwNewStatus != dwOldStatus) { - bool bChatAgent = IsContactChatAgent(hContact); - if (dwNewStatus == ID_STATUS_OFFLINE) { - if (hContact) { - setByte(hContact, DBSETTING_XSTATUSID, MRA_MIR_XSTATUS_NONE); - delSetting(hContact, DBSETTING_XSTATUSNAME); - delSetting(hContact, DBSETTING_XSTATUSMSG); - delSetting(hContact, DBSETTING_BLOGSTATUSTIME); - delSetting(hContact, DBSETTING_BLOGSTATUSID); - delSetting(hContact, DBSETTING_BLOGSTATUS); - delSetting(hContact, DBSETTING_BLOGSTATUSMUSIC); - MraContactCapabilitiesSet(hContact, 0); - if (bChatAgent) - MraChatSessionDestroy(hContact); - } - setDword(hContact, "LogonTS", 0); - delSetting(hContact, "IP"); - delSetting(hContact, "RealIP"); - } - else { - if (dwOldStatus == ID_STATUS_OFFLINE) { - DWORD dwTime = (DWORD)_time32(nullptr); - setDword(hContact, "LogonTS", dwTime); - - if (bChatAgent) - MraChatSessionNew(hContact); - } - MraAvatarsQueueGetAvatarSimple(hAvatarsQueueHandle, 0, hContact); - } - - setWord(hContact, "Status", (WORD)dwNewStatus); - } - return dwOldStatus; -} - -void CMraProto::MraUpdateEmailStatus(const CMStringA &pszFrom, const CMStringA &pszSubject, bool force_display) -{ - BOOL bTrayIconNewMailNotify; - WCHAR szStatusText[MAX_SECONDLINE]; - - bTrayIconNewMailNotify = getByte("TrayIconNewMailNotify", MRA_DEFAULT_TRAYICON_NEW_MAIL_NOTIFY); - - if (m_dwEmailMessagesUnread) { - CMStringA szEmail; - MCONTACT hContact = NULL; - - wchar_t szMailBoxStatus[MAX_SECONDLINE]; - mir_snwprintf(szMailBoxStatus, TranslateT("Unread mail is available: %lu/%lu messages"), m_dwEmailMessagesUnread, dwEmailMessagesTotal); - - if (!pszFrom.IsEmpty() || !pszSubject.IsEmpty()) { - CMStringA szFrom, szSubject; - if (GetEMailFromString(szFrom, szEmail)) - hContact = MraHContactFromEmail(szEmail, FALSE, TRUE, nullptr); - - mir_snwprintf(szStatusText, TranslateT("From: %S\r\nSubject: %S\r\n%s"), pszFrom.c_str(), szSubject.c_str(), szMailBoxStatus); - } - else wcsncpy_s(szStatusText, szMailBoxStatus, _TRUNCATE); - - if (bTrayIconNewMailNotify) { - char szServiceFunction[MAX_PATH] = { 0 }, *pszServiceFunctionName; - CLISTEVENT cle = {}; - cle.lpszProtocol = m_szModuleName; - cle.hIcon = IconLibGetIcon(gdiMenuItems[0].hIcolib); - cle.flags = (CLEF_UNICODE | CLEF_PROTOCOLGLOBAL); - cle.pszService = ""; - cle.szTooltip.w = szStatusText; - - if (getByte("TrayIconNewMailClkToInbox", MRA_DEFAULT_TRAYICON_NEW_MAIL_CLK_TO_INBOX)) { - strncpy(szServiceFunction, m_szModuleName, MAX_PATH - 1); - pszServiceFunctionName = szServiceFunction + mir_strlen(m_szModuleName); - memcpy(pszServiceFunctionName, MRA_GOTO_INBOX, sizeof(MRA_GOTO_INBOX)); - cle.pszService = szServiceFunction; - } - g_clistApi.pfnAddEvent(&cle); - } - - Skin_PlaySound(szNewMailSound); - if (hContact) {// update user info - MraUpdateContactInfo(hContact); - MraPopupShowFromContactW(hContact, MRA_POPUP_TYPE_EMAIL_STATUS, szStatusText); - } - else MraPopupShowFromAgentW(MRA_POPUP_TYPE_EMAIL_STATUS, szStatusText); - } - else { - if (!force_display && getByte("IncrementalNewMailNotify", MRA_DEFAULT_INC_NEW_MAIL_NOTIFY)) { - if (bTrayIconNewMailNotify) - g_clistApi.pfnRemoveEvent(0, (LPARAM)m_szModuleName); - PUDeletePopup(hWndEMailPopupStatus); - hWndEMailPopupStatus = nullptr; - } - else { - mir_snwprintf(szStatusText, TranslateT("No unread mail is available\r\nTotal messages: %lu"), dwEmailMessagesTotal); - MraPopupShowFromAgentW(MRA_POPUP_TYPE_EMAIL_STATUS, szStatusText); - } - } -} - -bool IsHTTPSProxyUsed(HNETLIBUSER hNetlibUser) -{ - NETLIBUSERSETTINGS nlus = { sizeof(nlus) }; - Netlib_GetUserSettings(hNetlibUser, &nlus); - if (nlus.useProxy && nlus.proxyType == PROXYTYPE_HTTPS) - return true; - - return false; -} - -// определяет принадлежность контакта данной копии плагина -bool CMraProto::IsContactMra(MCONTACT hContact) -{ - return Proto_IsProtoOnContact(hContact, m_szModuleName) != 0; -} - -// определяется является ли контакт контактом MRA протокола, не зависимо от того какому плагину он принадлежит -bool IsContactMraProto(MCONTACT hContact) -{ - LPSTR lpszProto = GetContactProto(hContact); - if (lpszProto) { - CMStringW szBuff; - if (DB_GetStringW(hContact, lpszProto, "AvatarLastCheckTime", szBuff)) - if (DB_GetStringW(hContact, lpszProto, "AvatarLastModifiedTime", szBuff)) - return true; - } - return false; -} - -bool CMraProto::IsEMailMy(const CMStringA &szEmail) -{ - if (!szEmail.IsEmpty()) { - CMStringA szEmailMy; - if (mraGetStringA(NULL, "e-mail", szEmailMy)) { - if (szEmail.GetLength() == szEmailMy.GetLength()) - if (!_stricmp(szEmail, szEmailMy)) - return true; - } - } - return false; -} - - -bool CMraProto::IsEMailChatAgent(const CMStringA &szEmail) -{ - if (!szEmail.IsEmpty()) { - CMStringA domain = szEmail.Right(sizeof(MAILRU_CHAT_CONF_DOMAIN)); - if (domain[0] == '@' && _stricmp(domain.c_str() + 1, MAILRU_CHAT_CONF_DOMAIN)) - return true; - } - return false; -} - -bool CMraProto::IsContactChatAgent(MCONTACT hContact) -{ - if (hContact == NULL) - return false; - - CMStringA szEmail; - return mraGetStringA(hContact, "e-mail", szEmail) ? IsEMailChatAgent(szEmail) : false; -} - -bool IsEMailMR(const CMStringA &szEmail) -{ - if (szEmail) { - for (int i = 0; lpcszMailRuDomains[i]; i++) { - size_t dwDomainLen = mir_strlen(lpcszMailRuDomains[i]); - if (dwDomainLen < szEmail.GetLength()) - if (!_stricmp(lpcszMailRuDomains[i], szEmail.c_str() + szEmail.GetLength() - dwDomainLen)) - if (szEmail[szEmail.GetLength() - (int)dwDomainLen - 1] == '@') - return true; - } - } - return false; -} - -bool GetEMailFromString(const CMStringA& szBuff, CMStringA& szEmail) -{ - if (!szBuff.IsEmpty()) { - int Start, End; - if ((Start = szBuff.Find('<')) != -1) { - Start++; - if ((End = szBuff.Find('>', Start)) != -1) { - szEmail = szBuff.Mid(Start, End - Start - 1); - return true; - } - } - } - - szEmail.Empty(); - return false; -} - -DWORD GetContactEMailCountParam(MCONTACT hContact, BOOL bMRAOnly, LPSTR lpszModule, LPSTR lpszValueName) -{ - DWORD dwRet = 0; - CMStringA szEmail; - - if (DB_GetStringA(hContact, lpszModule, lpszValueName, szEmail)) - if (bMRAOnly == FALSE || IsEMailMR(szEmail)) - dwRet++; - - for (int i = 0; TRUE; i++) { - char szBuff[100]; - mir_snprintf(szBuff, "%s%lu", lpszValueName, i); - if (DB_GetStringA(hContact, lpszModule, szBuff, szEmail)) { - if (bMRAOnly == FALSE || IsEMailMR(szEmail)) - dwRet++; - } - else { - if (i > EMAILS_MIN_COUNT) - break; - } - } - return dwRet; -} - -DWORD CMraProto::GetContactEMailCount(MCONTACT hContact, BOOL bMRAOnly) -{ - LPSTR lpszProto = (hContact) ? GetContactProto(hContact) : m_szModuleName; - - DWORD dwRet = 0; - 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(MCONTACT hContact, BOOL bMRAOnly, LPSTR lpszModule, LPSTR lpszValueName, CMStringA &res) -{ - CMStringA szEmail; - - if (DB_GetStringA(hContact, lpszModule, lpszValueName, szEmail)) - if (bMRAOnly == FALSE || IsEMailMR(szEmail)) { - res = szEmail; - return true; - } - - for (int i = 0; true; i++) { - char szBuff[100]; - mir_snprintf(szBuff, "%s%lu", lpszValueName, i); - if (DB_GetStringA(hContact, lpszModule, szBuff, szEmail)) { - if (bMRAOnly == FALSE || IsEMailMR(szEmail)) { - res = szEmail; - return true; - } - } - else if (i > EMAILS_MIN_COUNT) - break; - } - return false; -} - -bool CMraProto::GetContactFirstEMail(MCONTACT hContact, BOOL bMRAOnly, CMStringA &res) -{ - LPSTR lpszProto = (hContact) ? GetContactProto(hContact) : m_szModuleName; - - bool bRet = GetContactFirstEMailParam(hContact, bMRAOnly, lpszProto, "e-mail", res); - if (!bRet) bRet = GetContactFirstEMailParam(hContact, bMRAOnly, "UserInfo", "e-mail", res); - if (!bRet) bRet = GetContactFirstEMailParam(hContact, bMRAOnly, "UserInfo", "Mye-mail", res); - if (!bRet) bRet = GetContactFirstEMailParam(hContact, bMRAOnly, "UserInfo", "Companye-mail", res); - if (!bRet) bRet = GetContactFirstEMailParam(hContact, bMRAOnly, "UserInfo", "MyCompanye-mail", res); - return bRet; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -void CMraProto::ShowFormattedErrorMessage(LPWSTR lpwszErrText, DWORD dwErrorCode) -{ - wchar_t szErrorText[2048], szErrDescription[1024]; - size_t dwErrDescriptionSize; - - if (dwErrorCode == NO_ERROR) - wcsncpy_s(szErrorText, TranslateW(lpwszErrText), _TRUNCATE); - else { - dwErrDescriptionSize = (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, dwErrorCode, 0, szErrDescription, (_countof(szErrDescription) - sizeof(WCHAR)), nullptr) - 2); - szErrDescription[dwErrDescriptionSize] = 0; - mir_snwprintf(szErrorText, L"%s %lu: %s", TranslateW(lpwszErrText), dwErrorCode, szErrDescription); - } - debugLogA("Error happened: %S", szErrorText); - MraPopupShowFromAgentW(MRA_POPUP_TYPE_ERROR, szErrorText); -} - -///////////////////////////////////////////////////////////////////////////////////////// - -static void __cdecl FakeThread(ACKDATA *ack) -{ - Thread_SetName("MRA: ProtoBroadcastAckAsync"); - Sleep(100); - - ProtoBroadcastAck(ack->szModule, ack->hContact, ack->type, ack->result, ack->hProcess, ack->lParam); - mir_free(ack); -} - -DWORD CMraProto::ProtoBroadcastAckAsync(MCONTACT hContact, int type, int hResult, HANDLE hProcess, LPARAM lParam) -{ - ACKDATA *ack = (ACKDATA*)::mir_calloc(sizeof(ACKDATA)); - ack->szModule = m_szModuleName; - ack->hContact = hContact; - ack->type = type; - ack->result = hResult; - ack->hProcess = hProcess; - ack->lParam = lParam; - mir_forkThread(FakeThread, ack); - return 0; -} - -CMStringA CMraProto::CreateBlobFromContact(MCONTACT hContact, const CMStringW &wszRequestReason) -{ - CMStringA res('\0', 8); - CMStringW tmp; - DWORD *p = (DWORD*)res.c_str(); - p[0] = 0; p[1] = (DWORD)hContact; - - mraGetStringW(hContact, "Nick", tmp); - res.Append(ptrA(mir_utf8encodeW(tmp))); res.AppendChar(0); - - mraGetStringW(hContact, "FirstName", tmp); - res.Append(ptrA(mir_utf8encodeW(tmp))); res.AppendChar(0); - - mraGetStringW(hContact, "LastName", tmp); - res.Append(ptrA(mir_utf8encodeW(tmp))); res.AppendChar(0); - - mraGetStringW(hContact, "e-mail", tmp); - res.Append(ptrA(mir_utf8encodeW(tmp))); res.AppendChar(0); - - res.Append(ptrA(mir_utf8encodeW(wszRequestReason))); res.AppendChar(0); - return res; -} - -CMStringA CopyNumber(const CMStringA &str) -{ - CMStringA res; - - for (LPCSTR p = str; *p; p++) - if (*p >= '0' && *p <= '9') - res.AppendChar(*p); - - return res; -} - -void EnableControlsArray(HWND hWndDlg, WORD *pwControlsList, size_t dwControlsListCount, BOOL bEnabled) -{ - for (size_t i = 0; i < dwControlsListCount; i++) - EnableWindow(GetDlgItem(hWndDlg, pwControlsList[i]), bEnabled); -} - -static LRESULT CALLBACK MessageEditSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - if (msg == WM_CHAR) - if (GetKeyState(VK_CONTROL) & 0x8000) { - if (wParam == '\n') { - PostMessage(GetParent(hwnd), WM_COMMAND, IDOK, 0); - return 0; - } - if (wParam == 1) { // ctrl-a - SendMessage(hwnd, EM_SETSEL, 0, -1); - return 0; - } - if (wParam == 23) { // ctrl-w - SendMessage(GetParent(hwnd), WM_CLOSE, 0, 0); - return 0; - } - } - - return mir_callNextSubclass(hwnd, MessageEditSubclassProc, msg, wParam, lParam); -} - -///////////////////////////////////////////////////////////////////////////////////////// - -INT_PTR CALLBACK SetXStatusDlgProc(HWND hWndDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - INT_PTR iRet = FALSE; - SetXStatusData *dat = (SetXStatusData*)GetWindowLongPtr(hWndDlg, GWLP_USERDATA); - - switch (message) { - case WM_INITDIALOG:// set our xStatus - TranslateDialogDefault(hWndDlg); - - dat = (SetXStatusData*)lParam; - if (dat) { - char szValueName[MAX_PATH]; - CMStringW szBuff; - - dat->hDlgIcon = IconLibGetIcon(hXStatusAdvancedStatusIcons[dat->dwXStatus]); - dat->dwCountdown = 5; - - mir_subclassWindow(GetDlgItem(hWndDlg, IDC_XTITLE), MessageEditSubclassProc); - mir_subclassWindow(GetDlgItem(hWndDlg, IDC_XMSG), MessageEditSubclassProc); - - SetWindowLongPtr(hWndDlg, GWLP_USERDATA, (LONG_PTR)dat); - SendDlgItemMessage(hWndDlg, IDC_XTITLE, EM_LIMITTEXT, STATUS_TITLE_MAX, 0); - SendDlgItemMessage(hWndDlg, IDC_XMSG, EM_LIMITTEXT, STATUS_DESC_MAX, 0); - SendMessage(hWndDlg, WM_SETICON, ICON_BIG, (LPARAM)dat->hDlgIcon); - SetWindowText(hWndDlg, TranslateW(lpcszXStatusNameDef[dat->dwXStatus])); - - mir_snprintf(szValueName, "XStatus%ldName", dat->dwXStatus); - if (dat->ppro->mraGetStringW(NULL, szValueName, szBuff)) - SetDlgItemText(hWndDlg, IDC_XTITLE, szBuff.c_str()); // custom xstatus name - else // default xstatus name - SetDlgItemText(hWndDlg, IDC_XTITLE, TranslateW(lpcszXStatusNameDef[dat->dwXStatus])); - - mir_snprintf(szValueName, "XStatus%ldMsg", dat->dwXStatus); - if (dat->ppro->mraGetStringW(NULL, szValueName, szBuff)) - SetDlgItemText(hWndDlg, IDC_XMSG, szBuff.c_str()); // custom xstatus description - else // default xstatus description - SetDlgItemText(hWndDlg, IDC_XMSG, L""); - - SendMessage(hWndDlg, WM_TIMER, 0, 0); - SetTimer(hWndDlg, 1, 1000, nullptr); - iRet = TRUE; - } - break; - - case WM_TIMER: - if (dat->dwCountdown != -1) { - wchar_t szBuff[MAX_PATH]; - mir_snwprintf(szBuff, TranslateT("Closing in %ld"), dat->dwCountdown--); - SetDlgItemText(hWndDlg, IDOK, szBuff); - 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); - SetDlgItemText(hWndDlg, IDOK, TranslateT("OK")); - break; - } - break; - - case WM_DESTROY: - SetWindowLongPtr(hWndDlg, GWLP_USERDATA, 0); - if (dat) { // set our xStatus - - wchar_t szBuff[STATUS_TITLE_MAX + STATUS_DESC_MAX]; - DWORD dwBuffSize = GetDlgItemText(hWndDlg, IDC_XMSG, szBuff, (STATUS_DESC_MAX + 1)); - - char szValueName[MAX_PATH]; - mir_snprintf(szValueName, "XStatus%ldMsg", dat->dwXStatus); - dat->ppro->mraSetStringExW(NULL, szValueName, szBuff); - dat->ppro->mraSetStringExW(NULL, DBSETTING_XSTATUSMSG, szBuff); - - dwBuffSize = GetDlgItemText(hWndDlg, IDC_XTITLE, szBuff, (STATUS_TITLE_MAX + 1)); - if (dwBuffSize == 0) { // user delete all text - mir_wstrncpy(szBuff, TranslateW(lpcszXStatusNameDef[dat->dwXStatus]), STATUS_TITLE_MAX + 1); - dwBuffSize = (DWORD)mir_wstrlen(szBuff); - } - mir_snprintf(szValueName, "XStatus%dName", dat->dwXStatus); - dat->ppro->mraSetStringExW(NULL, szValueName, szBuff); - dat->ppro->mraSetStringExW(NULL, DBSETTING_XSTATUSNAME, szBuff); - - Menu_ModifyItem(dat->ppro->hXStatusMenuItems[dat->dwXStatus], szBuff); - - dat->ppro->MraSetXStatusInternal(dat->dwXStatus); - - mir_free(dat); - } - EndDialog(hWndDlg, NO_ERROR); - break; - } - return iRet; -} - -bool CMraProto::MraRequestXStatusDetails(DWORD dwXStatus) -{ - if (IsXStatusValid(dwXStatus)) { - SetXStatusData *dat = (SetXStatusData*)mir_calloc(sizeof(SetXStatusData)); - dat->dwXStatus = dwXStatus; - dat->ppro = this; - return DialogBoxParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_SETXSTATUS), nullptr, SetXStatusDlgProc, (LPARAM)dat) != -1; - } - - return false; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -INT_PTR CALLBACK SendReplyBlogStatusDlgProc(HWND hWndDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - INT_PTR iRet = FALSE; - SetBlogStatusData *dat = (SetBlogStatusData*)GetWindowLongPtr(hWndDlg, GWLP_USERDATA); - - switch (message) { - case WM_INITDIALOG:// set our xStatus - TranslateDialogDefault(hWndDlg); - - dat = (SetBlogStatusData*)lParam; - if (dat) { - SYSTEMTIME stBlogStatusTime = { 0 }; - - SetWindowLongPtr(hWndDlg, GWLP_USERDATA, (LONG_PTR)dat); - - HWND hWndEdit = GetDlgItem(hWndDlg, IDC_MSG_TO_SEND); - mir_subclassWindow(GetDlgItem(hWndDlg, IDC_MSG_TO_SEND), MessageEditSubclassProc); - SendMessage(hWndEdit, EM_LIMITTEXT, MICBLOG_STATUS_MAX, 0); - - Window_SetIcon_IcoLib(hWndDlg, gdiMenuItems[4].hIcolib); - - // blog status message - CMStringW szBuff; - if (dat->ppro->mraGetStringW(dat->hContact, DBSETTING_BLOGSTATUS, szBuff)) - SetDlgItemText(hWndDlg, IDC_USER_BLOG_STATUS_MSG, szBuff.c_str()); - - // reply to some user blog - if (dat->hContact) { - szBuff.Format(TranslateT("Reply to %s blog status"), Clist_GetContactDisplayName(dat->hContact)); - SetWindowText(hWndDlg, szBuff.c_str()); - } - else SetWindowText(hWndDlg, TranslateT("Set my blog status")); - - DWORD dwTime = dat->ppro->getDword(dat->hContact, DBSETTING_BLOGSTATUSTIME, 0); - if (dwTime && MakeLocalSystemTimeFromTime32(dwTime, &stBlogStatusTime)) - szBuff.Format(L"%s: %04ld.%02ld.%02ld %02ld:%02ld", TranslateT("Written"), - stBlogStatusTime.wYear, stBlogStatusTime.wMonth, stBlogStatusTime.wDay, stBlogStatusTime.wHour, stBlogStatusTime.wMinute); - else - szBuff.Empty(); - - SetDlgItemText(hWndDlg, IDC_STATIC_WRITED_TIME, szBuff.c_str()); - EnableWindow(GetDlgItem(hWndDlg, IDC_CHK_NOTIFY), (dat->hContact == NULL)); - iRet = TRUE; - } - break; - - case WM_CLOSE: - DestroyWindow(hWndDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDOK: - { - DWORD dwFlags; - DWORDLONG dwBlogStatusID; - wchar_t szBuff[MICBLOG_STATUS_MAX]; - - GetDlgItemText(hWndDlg, IDC_MSG_TO_SEND, szBuff, _countof(szBuff)); - - if (dat->hContact) { - dwFlags = (MRIM_BLOG_STATUS_REPLY | MRIM_BLOG_STATUS_NOTIFY); - - DBVARIANT dbv; - dbv.type = DBVT_BLOB; - dbv.pbVal = (PBYTE)&dwBlogStatusID; - dbv.cpbVal = sizeof(DWORDLONG); - db_set(dat->hContact, dat->ppro->m_szModuleName, DBSETTING_BLOGSTATUSID, &dbv); - } - else { - dwFlags = MRIM_BLOG_STATUS_UPDATE; - if (IsDlgButtonChecked(hWndDlg, IDC_CHK_NOTIFY)) - dwFlags |= MRIM_BLOG_STATUS_NOTIFY; - dwBlogStatusID = 0; - } - dat->ppro->MraChangeUserBlogStatus(dwFlags, szBuff, dwBlogStatusID); - } // fallthrough - case IDCANCEL: - DestroyWindow(hWndDlg); - break; - - case IDC_MSG_TO_SEND: - if (HIWORD(wParam) == EN_CHANGE) { - wchar_t tszBuff[MAX_PATH]; - size_t dwMessageSize = GetWindowTextLength(GetDlgItem(hWndDlg, IDC_MSG_TO_SEND)); - - EnableWindow(GetDlgItem(hWndDlg, IDOK), (int)dwMessageSize); - mir_snwprintf(tszBuff, L"%d/%d", dwMessageSize, MICBLOG_STATUS_MAX); - SetDlgItemText(hWndDlg, IDC_STATIC_CHARS_COUNTER, tszBuff); - } - break; - } - break; - - case WM_DESTROY: - SetWindowLongPtr(hWndDlg, GWLP_USERDATA, 0); - mir_free(dat); - EndDialog(hWndDlg, NO_ERROR); - break; - } - return iRet; -} - -bool CMraProto::MraSendReplyBlogStatus(MCONTACT hContact) -{ - SetBlogStatusData* dat = (SetBlogStatusData*)mir_calloc(sizeof(SetBlogStatusData)); - dat->ppro = this; - dat->hContact = hContact; - return CreateDialogParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_MINIBLOG), nullptr, SendReplyBlogStatusDlgProc, (LPARAM)dat) != nullptr; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -DWORD GetYears(CONST PSYSTEMTIME pcstSystemTime) -{ - DWORD dwRet = 0; - - if (pcstSystemTime) { - SYSTEMTIME stTime; - GetLocalTime(&stTime); - dwRet = stTime.wYear - pcstSystemTime->wYear; - // день рожденья будет в след месяце - if (stTime.wMonth < pcstSystemTime->wMonth) - dwRet--; - // др ещё будет в этом месяце или уже был... - else { - // др в этом месяце - if (stTime.wMonth == pcstSystemTime->wMonth) - // ещё только будет, не сегодня - if (stTime.wDay < pcstSystemTime->wDay) - 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_t szPath[32768]; - DWORD dwPathLen, dwRecDeepAllocated, dwRecDeepCurPos, dwFilePathLen; - RECURSION_DATA_STACK_ITEM *prdsiItems; - - if (dwFolderLen == -1) dwFolderLen = (int)mir_wstrlen(lpszFolder); - if (dwFileNameLen == -1) dwFileNameLen = (int)mir_wstrlen(lpszFileName); - - dwRecDeepCurPos = 0; - dwRecDeepAllocated = RECURSION_DATA_STACK_ITEMS_MIN; - prdsiItems = (RECURSION_DATA_STACK_ITEM*)mir_calloc(dwRecDeepAllocated * sizeof(RECURSION_DATA_STACK_ITEM)); - if (prdsiItems) { - dwPathLen = dwFolderLen; - memcpy(szPath, lpszFolder, (dwPathLen * sizeof(WCHAR))); - if (szPath[(dwPathLen - 1)] != '\\') { - szPath[dwPathLen] = '\\'; - dwPathLen++; - } - szPath[dwPathLen] = 0; - mir_wstrcat(szPath, L"*.*"); - - dwRetErrorCode = ERROR_FILE_NOT_FOUND; - prdsiItems[dwRecDeepCurPos].dwFileNameLen = 0; - prdsiItems[dwRecDeepCurPos].hFind = FindFirstFileEx(szPath, FindExInfoStandard, &prdsiItems[dwRecDeepCurPos].w32fdFindFileData, FindExSearchNameMatch, nullptr, 0); - if (prdsiItems[dwRecDeepCurPos].hFind != INVALID_HANDLE_VALUE) { - 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 = (int)mir_wstrlen(prdsiItems[dwRecDeepCurPos].w32fdFindFileData.cFileName) + 1; - memcpy((szPath + dwPathLen), prdsiItems[dwRecDeepCurPos].w32fdFindFileData.cFileName, (prdsiItems[dwRecDeepCurPos].dwFileNameLen * sizeof(WCHAR))); - mir_wstrcat(szPath, L"\\*.*"); - dwPathLen += prdsiItems[dwRecDeepCurPos].dwFileNameLen; - - dwRecDeepCurPos++; - if (dwRecDeepCurPos == dwRecDeepAllocated) { // need more space - dwRecDeepAllocated += RECURSION_DATA_STACK_ITEMS_MIN; - prdsiItems = (RECURSION_DATA_STACK_ITEM*)mir_realloc(prdsiItems, dwRecDeepAllocated * sizeof(RECURSION_DATA_STACK_ITEM)); - if (prdsiItems == nullptr) { - dwRecDeepCurPos = 0; - dwRetErrorCode = GetLastError(); - break; - } - } - prdsiItems[dwRecDeepCurPos].hFind = FindFirstFileEx(szPath, FindExInfoStandard, &prdsiItems[dwRecDeepCurPos].w32fdFindFileData, FindExSearchNameMatch, nullptr, 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 = (int)mir_wstrlen(prdsiItems[dwRecDeepCurPos].w32fdFindFileData.cFileName); - memcpy((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); - memcpy(lpszRetFilePathName, szPath, ((dwFilePathLen + 1) * sizeof(WCHAR))); - } - - dwRetErrorCode = NO_ERROR; - } - } - } - - if (prdsiItems) FindClose(prdsiItems[dwRecDeepCurPos].hFind); - dwRecDeepCurPos--; - } while (dwRecDeepCurPos != -1); - } - mir_free(prdsiItems); - } - else dwRetErrorCode = GetLastError(); - } - else dwRetErrorCode = ERROR_INVALID_HANDLE; - - return dwRetErrorCode; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -bool CMraProto::GetPassDB(CMStringA &res) -{ - int storageType = getDword("pCryptVer", 0); - if (storageType == 0) - return mraGetStringA(NULL, "Password", res) != 0; - - BYTE btRandomData[256] = { 0 }, btCryptedPass[256] = { 0 }, bthmacSHA1[MIR_SHA1_HASH_SIZE] = { 0 }; - size_t dwRandomDataSize, dwCryptedPass, dwPassSize; - CMStringA szEmail; - - if (mraGetContactSettingBlob(NULL, "pCryptData", btRandomData, sizeof(btRandomData), &dwRandomDataSize)) - if (dwRandomDataSize == sizeof(btRandomData)) - if (mraGetContactSettingBlob(NULL, "pCryptPass", btCryptedPass, sizeof(btCryptedPass), &dwCryptedPass)) - if (dwCryptedPass == sizeof(btCryptedPass)) - if (mraGetStringA(NULL, "e-mail", szEmail)) { - mir_hmac_sha1(bthmacSHA1, (BYTE*)szEmail.c_str(), szEmail.GetLength(), btRandomData, sizeof(btRandomData)); - - if (storageType == 2) { - RC4(btCryptedPass, sizeof(btCryptedPass), bthmacSHA1, MIR_SHA1_HASH_SIZE); - CopyMemoryReverseDWORD(btCryptedPass, btCryptedPass, sizeof(btCryptedPass)); - RC4(btCryptedPass, sizeof(btCryptedPass), btRandomData, dwRandomDataSize); - RC4(btCryptedPass, sizeof(btCryptedPass), bthmacSHA1, MIR_SHA1_HASH_SIZE); - - dwPassSize = btCryptedPass[0]; - SHA1GetDigest(&btCryptedPass[(1 + MIR_SHA1_HASH_SIZE)], dwPassSize, btRandomData); - if (0 != memcmp(&btCryptedPass[1], btRandomData, MIR_SHA1_HASH_SIZE)) - return false; - - res = CMStringA((char*)&btCryptedPass[(1 + MIR_SHA1_HASH_SIZE)], (int)dwPassSize); - } - else if (storageType == 1) { - RC4(btCryptedPass, sizeof(btCryptedPass), bthmacSHA1, MIR_SHA1_HASH_SIZE); - CopyMemoryReverseDWORD(btCryptedPass, btCryptedPass, sizeof(btCryptedPass)); - RC4(btCryptedPass, sizeof(btCryptedPass), btRandomData, dwRandomDataSize); - RC4(btCryptedPass, sizeof(btCryptedPass), bthmacSHA1, MIR_SHA1_HASH_SIZE); - - dwPassSize = (*btCryptedPass); - btCryptedPass[dwPassSize + 1 + MIR_SHA1_HASH_SIZE] = 0; - - size_t dwDecodedSize; - mir_ptr pDecoded((PBYTE)mir_base64_decode((LPCSTR)&btCryptedPass[1 + MIR_SHA1_HASH_SIZE], &dwDecodedSize)); - SHA1GetDigest(pDecoded, dwDecodedSize, btRandomData); - if (0 != memcmp(&btCryptedPass[1], btRandomData, MIR_SHA1_HASH_SIZE)) - return false; - res = CMStringA((LPSTR)(PBYTE)pDecoded, (int)dwDecodedSize); - } - else return false; - } - - delSetting("pCryptData"); - delSetting("pCryptPass"); - delSetting("pCryptVer"); - setString("Password", res); - return true; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -static DWORD ReplaceInBuff(LPVOID lpInBuff, size_t dwInBuffSize, size_t dwReplaceItemsCount, LPVOID *plpInReplaceItems, size_t *pdwInReplaceItemsCounts, LPVOID *plpOutReplaceItems, size_t *pdwOutReplaceItemsCounts, CMStringW &ret) -{ - DWORD dwRetErrorCode = NO_ERROR; - - LPBYTE *plpbtFounded = (LPBYTE*)mir_calloc((sizeof(LPBYTE)*dwReplaceItemsCount)); - if (plpbtFounded) { - LPBYTE lpbtOutBuffCur, lpbtInBuffCur, lpbtInBuffCurPrev, lpbtOutBuffMax; - size_t i, dwFirstFoundIndex = 0, dwFoundCount = 0, dwMemPartToCopy; - - lpbtInBuffCurPrev = (LPBYTE)lpInBuff; - lpbtOutBuffCur = (LPBYTE)ret.GetString(); - lpbtOutBuffMax = LPBYTE(lpbtOutBuffCur) + ret.GetLength(); - for (i = 0; i < dwReplaceItemsCount; i++) {// looking for the first time - plpbtFounded[i] = (LPBYTE)MemoryFind((lpbtInBuffCurPrev - (LPBYTE)lpInBuff), lpInBuff, dwInBuffSize, plpInReplaceItems[i], pdwInReplaceItemsCounts[i]); - if (plpbtFounded[i]) - dwFoundCount++; - } - - while (dwFoundCount) { - for (i = 0; i < dwReplaceItemsCount; i++) - if (plpbtFounded[i] && (plpbtFounded[i] < plpbtFounded[dwFirstFoundIndex] || plpbtFounded[dwFirstFoundIndex] == nullptr)) - dwFirstFoundIndex = i; - - if (plpbtFounded[dwFirstFoundIndex]) {// in found - dwMemPartToCopy = (plpbtFounded[dwFirstFoundIndex] - lpbtInBuffCurPrev); - if (lpbtOutBuffMax > (lpbtOutBuffCur + (dwMemPartToCopy + pdwInReplaceItemsCounts[dwFirstFoundIndex]))) { - memmove(lpbtOutBuffCur, lpbtInBuffCurPrev, dwMemPartToCopy); lpbtOutBuffCur += dwMemPartToCopy; - memmove(lpbtOutBuffCur, plpOutReplaceItems[dwFirstFoundIndex], pdwOutReplaceItemsCounts[dwFirstFoundIndex]); lpbtOutBuffCur += pdwOutReplaceItemsCounts[dwFirstFoundIndex]; - lpbtInBuffCurPrev = (plpbtFounded[dwFirstFoundIndex] + pdwInReplaceItemsCounts[dwFirstFoundIndex]); - - for (i = 0; i < dwReplaceItemsCount; i++) {// looking for in next time - if (plpbtFounded[i] && plpbtFounded[i] < lpbtInBuffCurPrev) { - plpbtFounded[i] = (LPBYTE)MemoryFind((lpbtInBuffCurPrev - (LPBYTE)lpInBuff), lpInBuff, dwInBuffSize, plpInReplaceItems[i], pdwInReplaceItemsCounts[i]); - if (plpbtFounded[i] == nullptr) dwFoundCount--; - } - } - } - else { - dwRetErrorCode = ERROR_BUFFER_OVERFLOW; - _CrtDbgBreak(); - break; - } - } - else {// сюда по идее никогда не попадём, на всякий случай. - _CrtDbgBreak(); - break; - } - } - lpbtInBuffCur = (((LPBYTE)lpInBuff) + dwInBuffSize); - memmove(lpbtOutBuffCur, lpbtInBuffCurPrev, (lpbtInBuffCur - lpbtInBuffCurPrev)); lpbtOutBuffCur += (lpbtInBuffCur - lpbtInBuffCurPrev); - (*((WORD*)lpbtOutBuffCur)) = 0; - - mir_free(plpbtFounded); - - ret.Truncate(lpbtOutBuffCur - ((LPBYTE)ret.GetString())); - } - else dwRetErrorCode = GetLastError(); - - return dwRetErrorCode; -} - -static const LPTSTR lpszXMLTags[] = { L"'", L""", L"&", L"<", L">" }; -static const size_t dwXMLTagsCount[] = { (6 * sizeof(wchar_t)), (6 * sizeof(wchar_t)), (5 * sizeof(wchar_t)), (4 * sizeof(wchar_t)), (4 * sizeof(wchar_t)) }; -static const LPTSTR lpszXMLSymbols[] = { L"\'", L"\"", L"&", L"<", L">" }; -static const size_t dwXMLSymbolsCount[] = { sizeof(wchar_t), sizeof(wchar_t), sizeof(wchar_t), sizeof(wchar_t), sizeof(wchar_t) }; - -//Decode XML coded string. The function translate special xml code into standard characters. -CMStringW DecodeXML(const CMStringW &lptszMessage) -{ - CMStringW ret('\0', (lptszMessage.GetLength() * 4)); - ReplaceInBuff((void*)lptszMessage.GetString(), lptszMessage.GetLength() * sizeof(wchar_t), _countof(lpszXMLTags), (LPVOID*)lpszXMLTags, (size_t*)dwXMLTagsCount, (LPVOID*)lpszXMLSymbols, (size_t*)dwXMLSymbolsCount, ret); - return ret; -} - -//Encode XML coded string. The function translate special saved xml characters into special characters. -CMStringW EncodeXML(const CMStringW &lptszMessage) -{ - CMStringW ret('\0', (lptszMessage.GetLength() * 4)); - ReplaceInBuff((void*)lptszMessage.GetString(), lptszMessage.GetLength() * sizeof(wchar_t), _countof(lpszXMLTags), (LPVOID*)lpszXMLSymbols, (size_t*)dwXMLSymbolsCount, (LPVOID*)lpszXMLTags, (size_t*)dwXMLTagsCount, ret); - return ret; -} diff --git a/protocols/MRA/src/Mra_menus.cpp b/protocols/MRA/src/Mra_menus.cpp deleted file mode 100644 index 4b72f0f850..0000000000 --- a/protocols/MRA/src/Mra_menus.cpp +++ /dev/null @@ -1,408 +0,0 @@ -#include "stdafx.h" -#include "proto.h" - -INT_PTR CMraProto::MraGotoInbox(WPARAM, LPARAM) -{ - MraMPopSessionQueueAddUrl(hMPopSessionQueue, MRA_WIN_INBOX_URL); - return 0; -} - -INT_PTR CMraProto::MraShowInboxStatus(WPARAM, LPARAM) -{ - MraUpdateEmailStatus("", "", true); - return 0; -} - -INT_PTR CMraProto::MraEditProfile(WPARAM, LPARAM) -{ - MraMPopSessionQueueAddUrl(hMPopSessionQueue, MRA_EDIT_PROFILE_URL); - return 0; -} - -INT_PTR CMraProto::MraWebSearch(WPARAM, LPARAM) -{ - Utils_OpenUrl(MRA_SEARCH_URL); - return 0; -} - -INT_PTR CMraProto::MraUpdateAllUsersInfo(WPARAM, LPARAM) -{ - if (!m_bLoggedIn) - return 0; - - if (MessageBox(nullptr, TranslateT("Are you sure?"), TranslateT(MRA_UPD_ALL_USERS_INFO_STR), MB_YESNO | MB_ICONQUESTION) == IDYES) { - for (auto &hContact : AccContacts()) { - CMStringA szEmail; - if (mraGetStringA(hContact, "e-mail", szEmail)) - MraWPRequestByEMail(hContact, ACKTYPE_GETINFO, szEmail); - } - } - return 0; -} - -INT_PTR CMraProto::MraCheckUpdatesUsersAvt(WPARAM, LPARAM) -{ - if (MessageBox(nullptr, TranslateT("Are you sure?"), TranslateT(MRA_CHK_USERS_AVATARS_STR), MB_YESNO | MB_ICONQUESTION) == IDYES) { - for (auto &hContact : AccContacts()) { - CMStringA szEmail; - if (mraGetStringA(hContact, "e-mail", szEmail)) - if (!IsEMailChatAgent(szEmail)) - MraAvatarsQueueGetAvatarSimple(hAvatarsQueueHandle, 0, hContact); - } - } - return 0; -} - -INT_PTR CMraProto::MraRequestAuthForAll(WPARAM, LPARAM) -{ - if (!m_bLoggedIn) - return 0; - - if (MessageBox(nullptr, TranslateT("Are you sure?"), TranslateT(MRA_REQ_AUTH_FOR_ALL_STR), MB_YESNO | MB_ICONQUESTION) == IDYES) { - for (auto &hContact : AccContacts()) { - DWORD dwContactSeverFlags; - if (GetContactBasicInfoW(hContact, nullptr, nullptr, nullptr, &dwContactSeverFlags, nullptr, nullptr, nullptr, nullptr) == NO_ERROR) - if (dwContactSeverFlags & CONTACT_INTFLAG_NOT_AUTHORIZED && dwContactSeverFlags != -1) - MraRequestAuthorization(hContact, 0); - } - } - return 0; -} - -INT_PTR CMraProto::MraRequestAuthorization(WPARAM hContact, LPARAM) -{ - if (!hContact || !m_bLoggedIn) - return 0; - - CMStringW wszAuthMessage; - if (!mraGetStringW(NULL, "AuthMessage", wszAuthMessage)) - wszAuthMessage = TranslateW(MRA_DEFAULT_AUTH_MESSAGE); - - if (wszAuthMessage.IsEmpty()) - return 1; - - CMStringA szEmail; - if (mraGetStringA(hContact, "e-mail", szEmail)) { - BOOL bSlowSend = getByte("SlowSend", MRA_DEFAULT_SLOW_SEND); - int iRet = MraMessage(bSlowSend, hContact, ACKTYPE_AUTHREQ, MESSAGE_FLAG_AUTHORIZE, szEmail, wszAuthMessage, nullptr, 0); - if (bSlowSend == FALSE) - ProtoBroadcastAck(hContact, ACKTYPE_AUTHREQ, ACKRESULT_SUCCESS, (HANDLE)iRet, 0); - - return 0; - } - return 1; -} - -INT_PTR CMraProto::MraGrantAuthorization(WPARAM wParam, LPARAM) -{ - if (!m_bLoggedIn || !wParam) - return 0; - - // send without reason, do we need any ? - CMStringA szEmail; - if (mraGetStringA(wParam, "e-mail", szEmail)) - MraAuthorize(szEmail); - - return 0; -} - -INT_PTR CMraProto::MraSendEmail(WPARAM wParam, LPARAM) -{ - DWORD dwContactEMailCount = GetContactEMailCount(wParam, FALSE); - if (dwContactEMailCount) { - if (dwContactEMailCount == 1) { - CMStringA szEmail; - if (GetContactFirstEMail(wParam, FALSE, szEmail)) { - szEmail.MakeLower(); - MraMPopSessionQueueAddUrl(hMPopSessionQueue, "https://e.mail.ru/cgi-bin/sentmsg?To=" + szEmail); - } - } - else MraSelectEMailDlgShow(wParam, MRA_SELECT_EMAIL_TYPE_SEND_POSTCARD); - } - return 0; -} - -INT_PTR CMraProto::MraSendPostcard(WPARAM wParam, LPARAM) -{ - DWORD dwContactEMailCount = GetContactEMailCount(wParam, FALSE); - if (dwContactEMailCount) { - if (dwContactEMailCount == 1) { - CMStringA szUrl, szEmail; - if (GetContactFirstEMail(wParam, FALSE, szEmail)) { - szEmail.MakeLower(); - szUrl.Format("http://cards.mail.ru/event.html?rcptname=%S&rcptemail=%s", _T2A(Clist_GetContactDisplayName(wParam)), szEmail.c_str()); - MraMPopSessionQueueAddUrl(hMPopSessionQueue, szUrl); - } - } - else MraSelectEMailDlgShow(wParam, MRA_SELECT_EMAIL_TYPE_SEND_POSTCARD); - } - return 0; -} - -INT_PTR CMraProto::MraViewAlbum(WPARAM wParam, LPARAM) -{ - DWORD dwContactEMailMRCount = GetContactEMailCount(wParam, TRUE); - if (dwContactEMailMRCount) { - if (dwContactEMailMRCount == 1) { - CMStringA szEmail; - if (GetContactFirstEMail(wParam, TRUE, szEmail)) - MraMPopSessionQueueAddUrlAndEMail(hMPopSessionQueue, MRA_FOTO_URL, szEmail); - } - else MraSelectEMailDlgShow(wParam, MRA_SELECT_EMAIL_TYPE_VIEW_ALBUM); - } - return 0; -} - -INT_PTR CMraProto::MraReplyBlogStatus(WPARAM wParam, LPARAM) -{ - if (!m_bLoggedIn) - return 0; - - CMStringW blogStatusMsg; - mraGetStringW(wParam, DBSETTING_BLOGSTATUS, blogStatusMsg); - if (!blogStatusMsg.IsEmpty() || wParam == 0) - MraSendReplyBlogStatus(wParam); - - return 0; -} - -INT_PTR CMraProto::MraViewVideo(WPARAM wParam, LPARAM) -{ - DWORD dwContactEMailMRCount = GetContactEMailCount(wParam, TRUE); - if (dwContactEMailMRCount) { - if (dwContactEMailMRCount == 1) { - CMStringA szEmail; - if (GetContactFirstEMail(wParam, TRUE, szEmail)) - MraMPopSessionQueueAddUrlAndEMail(hMPopSessionQueue, MRA_VIDEO_URL, szEmail); - } - else MraSelectEMailDlgShow(wParam, MRA_SELECT_EMAIL_TYPE_VIEW_VIDEO); - } - return 0; -} - -INT_PTR CMraProto::MraAnswers(WPARAM wParam, LPARAM) -{ - DWORD dwContactEMailMRCount = GetContactEMailCount(wParam, TRUE); - if (dwContactEMailMRCount) { - if (dwContactEMailMRCount == 1) { - CMStringA szEmail; - if (GetContactFirstEMail(wParam, TRUE, szEmail)) - MraMPopSessionQueueAddUrlAndEMail(hMPopSessionQueue, MRA_ANSWERS_URL, szEmail); - } - else MraSelectEMailDlgShow(wParam, MRA_SELECT_EMAIL_TYPE_ANSWERS); - } - return 0; -} - -INT_PTR CMraProto::MraWorld(WPARAM wParam, LPARAM) -{ - DWORD dwContactEMailMRCount = GetContactEMailCount(wParam, TRUE); - if (dwContactEMailMRCount) { - if (dwContactEMailMRCount == 1) { - CMStringA szEmail; - if (GetContactFirstEMail(wParam, TRUE, szEmail)) - MraMPopSessionQueueAddUrlAndEMail(hMPopSessionQueue, MRA_WORLD_URL, szEmail); - } - else MraSelectEMailDlgShow(wParam, MRA_SELECT_EMAIL_TYPE_WORLD); - } - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -int CMraProto::MraRebuildContactMenu(WPARAM hContact, LPARAM) -{ - bool bIsContactMRA, bHasEMail, bHasEMailMR, bChatAgent; - DWORD dwContactSeverFlags = 0; - CMStringW blogStatusMsgSize; - - // proto own contact - bIsContactMRA = IsContactMra(hContact); - if (bIsContactMRA) { - bHasEMail = true; - bHasEMailMR = true; - bChatAgent = IsContactChatAgent(hContact); - GetContactBasicInfoW(hContact, nullptr, nullptr, nullptr, &dwContactSeverFlags, nullptr, nullptr, nullptr, nullptr); - mraGetStringW(hContact, DBSETTING_BLOGSTATUS, blogStatusMsgSize); - } - // non proto contact - else { - bHasEMail = false; - bHasEMailMR = false; - bChatAgent = false; - if (!getByte(NULL, "HideMenuItemsForNonMRAContacts", MRA_DEFAULT_HIDE_MENU_ITEMS_FOR_NON_MRA)) - if (!IsContactMraProto(hContact))// избегаем добавления менюшек в контакты других копий MRA - if (GetContactEMailCount(hContact, FALSE)) { - bHasEMail = true; - if (GetContactEMailCount(hContact, TRUE)) bHasEMailMR = true; - } - } - // menu root; - Menu_ShowItem(hContactMenuRoot, bHasEMail); - - //"Request authorization" - Menu_ShowItem(hContactMenuItems[0], (m_bLoggedIn && bIsContactMRA));// && (dwContactSeverFlags&CONTACT_INTFLAG_NOT_AUTHORIZED) - - //"Grant authorization" - Menu_ShowItem(hContactMenuItems[1], (m_bLoggedIn && bIsContactMRA && !bChatAgent)); - - //"&Send E-Mail" - Menu_ShowItem(hContactMenuItems[2], (bHasEMail && !bChatAgent)); - - //"&Send postcard" - Menu_ShowItem(hContactMenuItems[3], (bHasEMail && !bChatAgent)); - - //"&View Album" - Menu_ShowItem(hContactMenuItems[4], (bHasEMailMR && !bChatAgent)); - - //"Reply Blog Status" - Menu_ShowItem(hContactMenuItems[5], (m_bLoggedIn && blogStatusMsgSize.GetLength() && !bChatAgent)); - - //"View Video" - Menu_ShowItem(hContactMenuItems[6], (bHasEMailMR && !bChatAgent)); - - //"Answers" - Menu_ShowItem(hContactMenuItems[7], (bHasEMailMR && !bChatAgent)); - - //"World" - Menu_ShowItem(hContactMenuItems[8], (bHasEMailMR && !bChatAgent)); - - //"Send &Nudge" - Menu_ShowItem(hContactMenuItems[9], (!m_heNudgeReceived) ? (m_bLoggedIn && bIsContactMRA) : 0); - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -int CMraProto::MraRebuildStatusMenu(WPARAM, LPARAM) -{ - CHAR szServiceFunction[MAX_PATH], szValueName[MAX_PATH]; - - HGENMENU hRoot; - { - wchar_t szItem[MAX_PATH + 64]; - mir_snwprintf(szItem, L"%s Custom Status", m_tszUserName); - - CMenuItem mi(&g_plugin); - mi.root = Menu_GetProtocolMenu(m_szModuleName); - mi.name.w = szItem; - mi.position = 10001; - hRoot = Menu_AddStatusMenuItem(&mi, m_szModuleName); - } - - CMenuItem mi(&g_plugin); - mi.position = 2000060000; - mi.root = hRoot; - mi.flags = CMIF_UNICODE; - mi.pszService = szServiceFunction; - - CMStringW szStatusTitle; - - DWORD dwCount = MRA_XSTATUS_OFF_CLI_COUNT; - if (getByte(NULL, "xStatusShowAll", MRA_DEFAULT_SHOW_ALL_XSTATUSES)) - dwCount = MRA_XSTATUS_COUNT; - for (DWORD i = 0; i < dwCount; i ++) { - mir_snprintf(szServiceFunction, "/menuXStatus%ld", i); - mi.position ++; - if (i) { - mir_snprintf(szValueName, "XStatus%ldName", i); - if (mraGetStringW(NULL, szValueName, szStatusTitle)) - mi.name.w = (wchar_t*)szStatusTitle.c_str(); - else - mi.name.w = (wchar_t*)lpcszXStatusNameDef[i]; - - mi.hIcolibItem = hXStatusAdvancedStatusIcons[i]; - } - else { - mi.name.w = (wchar_t*)lpcszXStatusNameDef[i]; - mi.hIcolibItem = nullptr; - } - hXStatusMenuItems[i] = Menu_AddStatusMenuItem(&mi, m_szModuleName); - } - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -HGENMENU CMraProto::CListCreateMenu(LONG lPosition, LONG lPopupPosition, BOOL bIsMain, const IconItem *pgdiItems, size_t dwCount, HGENMENU *hResult) -{ - if (!pgdiItems || !dwCount || !hResult) - return nullptr; - - char szServiceFunction[MAX_PATH]; - - CMenuItem mi(&g_plugin); - - HGENMENU hRootMenu, (__stdcall *fnAddFunc)(TMO_MenuItem*, const char*); - if (bIsMain) { - fnAddFunc = Menu_AddProtoMenuItem; - - hRootMenu = Menu_GetProtocolRoot(this); - if (hRootMenu == nullptr) { - mi.name.w = m_tszUserName; - mi.flags = CMIF_UNICODE | CMIF_KEEPUNTRANSLATED; - mi.hIcolibItem = g_hMainIcon; - hRootMenu = Menu_AddProtoMenuItem(&mi); - } - - mi.position = 20003; - mi.root = hRootMenu; - } - else { - fnAddFunc = Menu_AddContactMenuItem; - mi.position = lPosition; - } - - SET_UID(mi, 0x83C8B6A7, 0xEC0D, 0x41D6, 0x8A, 0x0E, 0xAC, 0x90, 0x8C, 0xEE, 0xAF, 0xFE); - mi.flags = 0; - mi.name.a = LPGEN("Services..."); - mi.hIcolibItem = g_hMainIcon; - hRootMenu = fnAddFunc(&mi, m_szModuleName); - UNSET_UID(mi); - - mi.flags = CMIF_SYSTEM; - mi.root = hRootMenu; - mi.pszService = szServiceFunction; - - for (size_t i = 0; i < dwCount; i++) { - mi.pszService = pgdiItems[i].szName; - mi.position = int(lPosition + i); - mi.hIcolibItem = pgdiItems[i].hIcolib; - mi.name.a = pgdiItems[i].szDescr; - hResult[i] = fnAddFunc(&mi, m_szModuleName); - Menu_ConfigureItem(hResult[i], MCI_OPT_EXECPARAM, lPopupPosition); - } - - return hRootMenu; -} - -void CMraProto::InitMenus() -{ - /* Main menu and contacts services. */ - CreateProtoService(MRA_GOTO_INBOX, &CMraProto::MraGotoInbox); - CreateProtoService(MRA_SHOW_INBOX_STATUS, &CMraProto::MraShowInboxStatus); - CreateProtoService(MRA_EDIT_PROFILE, &CMraProto::MraEditProfile); - CreateProtoService(MRA_VIEW_ALBUM, &CMraProto::MraViewAlbum); - CreateProtoService(MRA_REPLY_BLOG_STATUS, &CMraProto::MraReplyBlogStatus); - CreateProtoService(MRA_VIEW_VIDEO, &CMraProto::MraViewVideo); - CreateProtoService(MRA_ANSWERS, &CMraProto::MraAnswers); - CreateProtoService(MRA_WORLD, &CMraProto::MraWorld); - CreateProtoService(MRA_WEB_SEARCH, &CMraProto::MraWebSearch); - CreateProtoService(MRA_UPD_ALL_USERS_INFO, &CMraProto::MraUpdateAllUsersInfo); - CreateProtoService(MRA_CHK_USERS_AVATARS, &CMraProto::MraCheckUpdatesUsersAvt); - CreateProtoService(MRA_REQ_AUTH_FOR_ALL, &CMraProto::MraRequestAuthForAll); - /* Contacts only services. */ - CreateProtoService(MRA_REQ_AUTH, &CMraProto::MraRequestAuthorization); - CreateProtoService(MRA_GRANT_AUTH, &CMraProto::MraGrantAuthorization); - CreateProtoService(MRA_SEND_EMAIL, &CMraProto::MraSendEmail); - CreateProtoService(MRA_SEND_POSTCARD, &CMraProto::MraSendPostcard); - - hContactMenuRoot = CListCreateMenu(-2000001001, -500050000, FALSE, gdiContactMenuItems, CONTACT_MENU_ITEMS_COUNT, hContactMenuItems); - - // xstatus menu - for (DWORD i = 0; i < MRA_XSTATUS_COUNT; i++) { - char szServiceName[100]; - mir_snprintf(szServiceName, "/menuXStatus%d", i); - CreateProtoServiceParam(szServiceName, &CMraProto::MraXStatusMenu, i); - } -} diff --git a/protocols/MRA/src/Mra_options.cpp b/protocols/MRA/src/Mra_options.cpp deleted file mode 100644 index d1d36a3fef..0000000000 --- a/protocols/MRA/src/Mra_options.cpp +++ /dev/null @@ -1,244 +0,0 @@ -#include "stdafx.h" - -INT_PTR CALLBACK DlgProcOptsAccount(HWND hWndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - CMraProto *ppro = (CMraProto*)GetWindowLongPtr(hWndDlg, GWLP_USERDATA); - - switch (msg) { - case WM_INITDIALOG: - TranslateDialogDefault(hWndDlg); - SetWindowLongPtr(hWndDlg, GWLP_USERDATA, lParam); - ppro = (CMraProto*)lParam; - { - CMStringW szBuff; - if (ppro->mraGetStringW(NULL, "e-mail", szBuff)) - SetDlgItemText(hWndDlg, IDC_LOGIN, szBuff.c_str()); - } - SetDlgItemText(hWndDlg, IDC_PASSWORD, L""); - return TRUE; - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDC_NEW_ACCOUNT_LINK: - Utils_OpenUrl(MRA_REGISTER_URL); - return TRUE; - - case IDC_LOOKUPLINK: - Utils_OpenUrl(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_t szBuff[MAX_EMAIL_LEN]; - GetDlgItemText(hWndDlg, IDC_LOGIN, szBuff, _countof(szBuff)); - ppro->setWString(NULL, "e-mail", szBuff); - - if (GetDlgItemText(hWndDlg, IDC_PASSWORD, szBuff, _countof(szBuff))) { - ppro->setWString("Password", szBuff); - SecureZeroMemory(szBuff, sizeof(szBuff)); - } - return TRUE; - } - break; - } - return FALSE; -} - -INT_PTR CALLBACK DlgProcAccount(HWND hWndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - CMraProto *ppro = (CMraProto*)GetWindowLongPtr(hWndDlg, GWLP_USERDATA); - - switch (msg) { - case WM_INITDIALOG: - TranslateDialogDefault(hWndDlg); - SetWindowLongPtr(hWndDlg, GWLP_USERDATA, lParam); - ppro = (CMraProto*)lParam; - { - CMStringW szBuff; - if (ppro->mraGetStringW(NULL, "e-mail", szBuff)) - SetDlgItemText(hWndDlg, IDC_LOGIN, szBuff.c_str()); - } - SetDlgItemText(hWndDlg, IDC_PASSWORD, L""); - return TRUE; - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDC_NEW_ACCOUNT_LINK: - Utils_OpenUrl(MRA_REGISTER_URL); - return TRUE; - } - if (HIWORD(wParam) == EN_CHANGE && (HWND)lParam == GetFocus()) { - switch (LOWORD(wParam)) { - case IDC_LOGIN: - case IDC_PASSWORD: - SendMessage(GetParent(hWndDlg), PSM_CHANGED, 0, 0); - } - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lParam)->code) { - case PSN_APPLY: - wchar_t szBuff[MAX_EMAIL_LEN]; - GetDlgItemText(hWndDlg, IDC_LOGIN, szBuff, _countof(szBuff)); - ppro->mraSetStringW(NULL, "e-mail", szBuff); - - if (GetDlgItemText(hWndDlg, IDC_PASSWORD, szBuff, _countof(szBuff))) { - ppro->setWString("Password", szBuff); - SecureZeroMemory(szBuff, sizeof(szBuff)); - } - return TRUE; - } - break; - } - return FALSE; -} - -INT_PTR CALLBACK DlgProcOptsConnections(HWND hWndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - CMraProto *ppro = (CMraProto*)GetWindowLongPtr(hWndDlg, GWLP_USERDATA); - - switch (msg) { - case WM_INITDIALOG: - TranslateDialogDefault(hWndDlg); - SetWindowLongPtr(hWndDlg, GWLP_USERDATA, lParam); - ppro = (CMraProto*)lParam; - { - CMStringW szBuff; - if (ppro->mraGetStringW(NULL, "Server", szBuff)) - SetDlgItemText(hWndDlg, IDC_SERVER, szBuff.c_str()); - else - SetDlgItemTextA(hWndDlg, IDC_SERVER, MRA_DEFAULT_SERVER); - } - - SetDlgItemInt(hWndDlg, IDC_SERVERPORT, ppro->getWord("ServerPort", MRA_DEFAULT_SERVER_PORT), FALSE); - // if set SSL proxy, setting will ignored - - //CheckDlgButton(hWndDlg, IDC_KEEPALIVE, getByte("keepalive", 0) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hWndDlg, IDC_AUTO_ADD_CONTACTS_TO_SERVER, ppro->getByte("AutoAddContactsToServer", MRA_DEFAULT_AUTO_ADD_CONTACTS_TO_SERVER)) ? BST_CHECKED : BST_UNCHECKED; - CheckDlgButton(hWndDlg, IDC_AUTO_AUTH_REQ_ON_LOGON, ppro->getByte("AutoAuthRequestOnLogon", MRA_DEFAULT_AUTO_AUTH_REQ_ON_LOGON) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hWndDlg, IDC_AUTO_AUTH_GRAND_IN_CLIST, ppro->getByte("AutoAuthGrandUsersInCList", MRA_DEFAULT_AUTO_AUTH_GRAND_IN_CLIST) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hWndDlg, IDC_AUTO_AUTH_GRAND_NEW_USERS, ppro->getByte("AutoAuthGrandNewUsers", MRA_DEFAULT_AUTO_AUTH_GRAND_NEW_USERS) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hWndDlg, IDC_AUTO_AUTH_ON_WEB_SVCS, ppro->getByte("AutoAuthOnWebServices", MRA_DEFAULT_AUTO_AUTH_ON_WEB_SVCS) ? BST_CHECKED : BST_UNCHECKED); - - CheckDlgButton(hWndDlg, IDC_SLOWSEND, ppro->getByte("SlowSend", MRA_DEFAULT_SLOW_SEND) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hWndDlg, IDC_INCREMENTAL_NEW_MAIL_NOTIFY, ppro->getByte("IncrementalNewMailNotify", MRA_DEFAULT_INC_NEW_MAIL_NOTIFY) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hWndDlg, IDC_TRAYICON_NEW_MAIL_NOTIFY, ppro->getByte("TrayIconNewMailNotify", MRA_DEFAULT_TRAYICON_NEW_MAIL_NOTIFY) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hWndDlg, IDC_TRAYICON_NEW_MAIL_NOTIFY_CLICK_TO_INBOX, ppro->getByte("TrayIconNewMailClkToInbox", MRA_DEFAULT_TRAYICON_NEW_MAIL_CLK_TO_INBOX) ? BST_CHECKED : BST_UNCHECKED); - EnableWindow(GetDlgItem(hWndDlg, IDC_TRAYICON_NEW_MAIL_NOTIFY_CLICK_TO_INBOX), ppro->getByte("TrayIconNewMailNotify", MRA_DEFAULT_TRAYICON_NEW_MAIL_NOTIFY)); - - CheckDlgButton(hWndDlg, IDC_RTF_RECEIVE_ENABLE, ppro->getByte("RTFReceiveEnable", MRA_DEFAULT_RTF_RECEIVE_ENABLE) ? BST_CHECKED : BST_UNCHECKED); - - CheckDlgButton(hWndDlg, IDC_RTF_SEND_ENABLE, ppro->getByte("RTFSendEnable", MRA_DEFAULT_RTF_SEND_ENABLE) ? BST_CHECKED : BST_UNCHECKED); - EnableWindow(GetDlgItem(hWndDlg, IDC_RTF_SEND_SMART), ppro->getByte("RTFSendEnable", MRA_DEFAULT_RTF_SEND_ENABLE)); - EnableWindow(GetDlgItem(hWndDlg, IDC_BUTTON_FONT), ppro->getByte("RTFSendEnable", MRA_DEFAULT_RTF_SEND_ENABLE)); - EnableWindow(GetDlgItem(hWndDlg, IDC_RTF_BGCOLOUR), ppro->getByte("RTFSendEnable", MRA_DEFAULT_RTF_SEND_ENABLE)); - SendDlgItemMessage(hWndDlg, IDC_RTF_BGCOLOUR, CPM_SETCOLOUR, 0, ppro->getDword("RTFBackgroundColour", MRA_DEFAULT_RTF_BACKGROUND_COLOUR)); - return TRUE; - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDC_BUTTON_DEFAULT: - SetDlgItemTextA(hWndDlg, IDC_SERVER, MRA_DEFAULT_SERVER); - SetDlgItemInt(hWndDlg, IDC_SERVERPORT, MRA_DEFAULT_SERVER_PORT, FALSE); - break; - case IDC_TRAYICON_NEW_MAIL_NOTIFY: - EnableWindow(GetDlgItem(hWndDlg, IDC_TRAYICON_NEW_MAIL_NOTIFY_CLICK_TO_INBOX), IsDlgButtonChecked(hWndDlg, IDC_TRAYICON_NEW_MAIL_NOTIFY)); - break; - case IDC_RTF_SEND_ENABLE: - EnableWindow(GetDlgItem(hWndDlg, IDC_RTF_SEND_SMART), IsDlgButtonChecked(hWndDlg, IDC_RTF_SEND_ENABLE)); - EnableWindow(GetDlgItem(hWndDlg, IDC_BUTTON_FONT), IsDlgButtonChecked(hWndDlg, IDC_RTF_SEND_ENABLE)); - EnableWindow(GetDlgItem(hWndDlg, IDC_RTF_BGCOLOUR), IsDlgButtonChecked(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 = ppro->getDword("RTFFontColour", MRA_DEFAULT_RTF_FONT_COLOUR); - cf.Flags = (CF_SCREENFONTS | CF_EFFECTS | CF_FORCEFONTEXIST | CF_INITTOLOGFONTSTRUCT); - if (ppro->mraGetContactSettingBlob(NULL, "RTFFont", &lf, sizeof(LOGFONT), nullptr) == FALSE) { - HDC hDC = GetDC(nullptr);// kegl - lf.lfCharSet = MRA_DEFAULT_RTF_FONT_CHARSET; - lf.lfHeight = -MulDiv(MRA_DEFAULT_RTF_FONT_SIZE, GetDeviceCaps(hDC, LOGPIXELSY), 72); - mir_wstrncpy(lf.lfFaceName, MRA_DEFAULT_RTF_FONT_NAME, LF_FACESIZE); - ReleaseDC(nullptr, hDC); - } - - if (ChooseFont(&cf)) { - ppro->mraWriteContactSettingBlob(NULL, "RTFFont", &lf, sizeof(LOGFONT)); - ppro->setDword("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_t szBuff[MAX_PATH]; - GetDlgItemText(hWndDlg, IDC_SERVER, szBuff, _countof(szBuff)); - ppro->mraSetStringW(NULL, "Server", szBuff); - ppro->setWord("ServerPort", (WORD)GetDlgItemInt(hWndDlg, IDC_SERVERPORT, nullptr, FALSE)); - ppro->setByte("AutoAddContactsToServer", IsDlgButtonChecked(hWndDlg, IDC_AUTO_ADD_CONTACTS_TO_SERVER)); - ppro->setByte("AutoAuthRequestOnLogon", IsDlgButtonChecked(hWndDlg, IDC_AUTO_AUTH_REQ_ON_LOGON)); - ppro->setByte("AutoAuthGrandUsersInCList", IsDlgButtonChecked(hWndDlg, IDC_AUTO_AUTH_GRAND_IN_CLIST)); - ppro->setByte("AutoAuthGrandNewUsers", IsDlgButtonChecked(hWndDlg, IDC_AUTO_AUTH_GRAND_NEW_USERS)); - ppro->setByte("AutoAuthOnWebServices", IsDlgButtonChecked(hWndDlg, IDC_AUTO_AUTH_ON_WEB_SVCS)); - - ppro->setByte("SlowSend", IsDlgButtonChecked(hWndDlg, IDC_SLOWSEND)); - ppro->setByte("IncrementalNewMailNotify", IsDlgButtonChecked(hWndDlg, IDC_INCREMENTAL_NEW_MAIL_NOTIFY)); - ppro->setByte("TrayIconNewMailNotify", IsDlgButtonChecked(hWndDlg, IDC_TRAYICON_NEW_MAIL_NOTIFY)); - ppro->setByte("TrayIconNewMailClkToInbox", IsDlgButtonChecked(hWndDlg, IDC_TRAYICON_NEW_MAIL_NOTIFY_CLICK_TO_INBOX)); - - ppro->setByte("RTFReceiveEnable", IsDlgButtonChecked(hWndDlg, IDC_RTF_RECEIVE_ENABLE)); - ppro->setByte("RTFSendEnable", IsDlgButtonChecked(hWndDlg, IDC_RTF_SEND_ENABLE)); - ppro->setDword("RTFBackgroundColour", SendDlgItemMessage(hWndDlg, IDC_RTF_BGCOLOUR, CPM_GETCOLOUR, 0, 0)); - return TRUE; - } - break; - } - return FALSE; -} - -int CMraProto::OnOptionsInit(WPARAM wParam, LPARAM lParam) -{ - OPTIONSDIALOGPAGE odp = {}; - odp.dwInitParam = (LPARAM)this; - odp.szTitle.w = m_tszUserName; - odp.szGroup.w = LPGENW("Network"); - odp.flags = ODPF_BOLDGROUPS | ODPF_UNICODE; - - odp.szTab.w = LPGENW("Account"); - odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_ACCOUNT); - odp.pfnDlgProc = DlgProcOptsAccount; - g_plugin.addOptions(wParam, &odp); - - odp.szTab.w = LPGENW("Connections"); - odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_CONNECTIONS); - odp.pfnDlgProc = DlgProcOptsConnections; - g_plugin.addOptions(wParam, &odp); - - odp.szTab.w = LPGENW("Files"); - odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_FILES); - odp.pfnDlgProc = MraFilesQueueDlgProcOpts; - g_plugin.addOptions(wParam, &odp); - - odp.szTab.w = LPGENW("Avatars"); - odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_AVATRS); - odp.pfnDlgProc = MraAvatarsQueueDlgProcOpts; - g_plugin.addOptions(wParam, &odp); - - OnPopupOptInit(wParam, lParam); - return 0; -} diff --git a/protocols/MRA/src/Mra_proto.cpp b/protocols/MRA/src/Mra_proto.cpp deleted file mode 100644 index 39999c7557..0000000000 --- a/protocols/MRA/src/Mra_proto.cpp +++ /dev/null @@ -1,1966 +0,0 @@ -#include "stdafx.h" -#include "MraOfflineMsg.h" -#include "MraRTFMsg.h" -#include "MraPlaces.h" - -DWORD CMraProto::StartConnect() -{ - if (m_bShutdown) - return ERROR_OPERATION_ABORTED; - - // поток ещё/уже не работал, поставили статус что работает и запускаем - if (InterlockedCompareExchange((volatile LONG*)&m_dwThreadWorkerRunning, TRUE, FALSE)) - return 0; - - CMStringA szEmail; - if (!mraGetStringA(NULL, "e-mail", szEmail)) - return 0; - - CMStringA szPass; - if (szEmail.GetLength() <= 5) - MraPopupShowFromAgentW(MRA_POPUP_TYPE_WARNING, TranslateT("Please, setup e-mail in options")); - else if (!GetPassDB(szPass)) - MraPopupShowFromAgentW(MRA_POPUP_TYPE_WARNING, TranslateT("Please, setup password in options")); - else { - InterlockedExchange((volatile LONG*)&m_dwThreadWorkerLastPingTime, GetTickCount()); - if (INVALID_HANDLE_VALUE != ForkThreadEx(&CMraProto::MraThreadProc, nullptr, nullptr)) - return 0; /* OK. */ - MraPopupShowFromAgentW(MRA_POPUP_TYPE_ERROR, TranslateT("Thread creation failure")); - } - InterlockedExchange((volatile LONG*)&m_dwThreadWorkerRunning, FALSE); - return ERROR_OPERATION_ABORTED; -} - -void CMraProto::MraThreadProc(LPVOID) -{ - BOOL bConnected = FALSE; - CMStringA szHost; - DWORD dwConnectReTryCount, dwCurConnectReTryCount; - - Thread_SetName("MRA: ProtoThreadProc"); - - SleepEx(100, FALSE);// to prevent high CPU load by some status plugins like allwaysonline - - dwConnectReTryCount = getDword("ConnectReTryCountMRIM", MRA_DEFAULT_CONN_RETRY_COUNT_MRIM); - - NETLIBOPENCONNECTION nloc = { 0 }; - nloc.cbSize = sizeof(nloc); - nloc.flags = NLOCF_V2; - nloc.timeout = getDword("TimeOutConnectMRIM", MRA_DEFAULT_TIMEOUT_CONN_MRIM); - if (nloc.timeout < MRA_TIMEOUT_CONN_MIN) nloc.timeout = MRA_TIMEOUT_CONN_MIN; - if (nloc.timeout > MRA_TIMEOUT_CONN_MAX) nloc.timeout = MRA_TIMEOUT_CONN_MAX; - - InterlockedExchange((volatile LONG*)&m_dwThreadWorkerLastPingTime, GetTickCount()); - if (MraGetNLBData(szHost, &nloc.wPort) == NO_ERROR) { - nloc.szHost = szHost; - //nloc.szHost = "217.69.141.245"; - //nloc.wPort = 443; - //nloc.flags |= NLOCF_SSL; - dwCurConnectReTryCount = dwConnectReTryCount; - do { - InterlockedExchange((volatile LONG*)&m_dwThreadWorkerLastPingTime, GetTickCount()); - m_hConnection = Netlib_OpenConnection(m_hNetlibUser, &nloc); - } - while (--dwCurConnectReTryCount && m_hConnection == nullptr); - - if (m_hConnection) - bConnected = TRUE; - } - - if (bConnected == FALSE) - if (getByte("NLBFailDirectConnect", MRA_DEFAULT_NLB_FAIL_DIRECT_CONNECT)) { - if (IsHTTPSProxyUsed(m_hNetlibUser)) - nloc.wPort = MRA_SERVER_PORT_HTTPS; - else { - nloc.wPort = getWord("ServerPort", MRA_DEFAULT_SERVER_PORT); - if (nloc.wPort == MRA_SERVER_PORT_STANDART_NLB) nloc.wPort = MRA_SERVER_PORT_STANDART; - } - - for (DWORD i = 1; (i < MRA_MAX_MRIM_SERVER && m_iStatus != ID_STATUS_OFFLINE); i++) { - szHost.Format("mrim%lu.mail.ru", i); - - dwCurConnectReTryCount = dwConnectReTryCount; - do { - InterlockedExchange((volatile LONG*)&m_dwThreadWorkerLastPingTime, GetTickCount()); - m_hConnection = Netlib_OpenConnection(m_hNetlibUser, &nloc); - } - while (--dwCurConnectReTryCount && m_hConnection == nullptr); - - if (m_hConnection) { - bConnected = TRUE; - break; - } - } - } - - if (bConnected && m_iStatus != ID_STATUS_OFFLINE) - MraNetworkDispatcher(); - else { - if (bConnected == FALSE) { - ShowFormattedErrorMessage(L"Can't connect to MRIM server, error", GetLastError()); - ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, nullptr, LOGINERR_NONETWORK); - } - } - - MraMPopSessionQueueFlush(hMPopSessionQueue); - NETLIB_CLOSEHANDLE(m_hConnection); - dwCMDNum = 0; - - InterlockedExchange((volatile LONG*)&m_dwThreadWorkerRunning, FALSE); - SetStatus(ID_STATUS_OFFLINE); -} - -DWORD CMraProto::MraGetNLBData(CMStringA &szHost, WORD *pwPort) -{ - DWORD dwRetErrorCode; - - BOOL bContinue = TRUE; - BYTE btBuff[MAX_PATH]; - DWORD dwConnectReTryCount, dwCurConnectReTryCount; - LPSTR lpszPort; - size_t dwBytesReceived, dwRcvBuffSizeUsed = 0; - NETLIBSELECT nls = { 0 }; - NETLIBOPENCONNECTION nloc = { 0 }; - - dwConnectReTryCount = getDword("ConnectReTryCountNLB", MRA_DEFAULT_CONN_RETRY_COUNT_NLB); - - nloc.cbSize = sizeof(nloc); - nloc.flags = NLOCF_V2; - if (mraGetStringA(NULL, "Server", szHost)) - nloc.szHost = szHost; - else - nloc.szHost = MRA_DEFAULT_SERVER; - - if (IsHTTPSProxyUsed(m_hNetlibUser)) - nloc.wPort = MRA_SERVER_PORT_HTTPS; - else - nloc.wPort = getWord("ServerPort", MRA_DEFAULT_SERVER_PORT); - - nloc.timeout = getDword("TimeOutConnectNLB", MRA_DEFAULT_TIMEOUT_CONN_NLB); - if (nloc.timeout < MRA_TIMEOUT_CONN_MIN) nloc.timeout = MRA_TIMEOUT_CONN_MIN; - if (nloc.timeout > MRA_TIMEOUT_CONN_MAX) nloc.timeout = MRA_TIMEOUT_CONN_MAX; - - dwCurConnectReTryCount = dwConnectReTryCount; - do { - InterlockedExchange((volatile LONG*)&m_dwThreadWorkerLastPingTime, GetTickCount()); - nls.hReadConns[0] = Netlib_OpenConnection(m_hNetlibUser, &nloc); - } - while (--dwCurConnectReTryCount && nls.hReadConns[0] == nullptr); - - if (nls.hReadConns[0]) { - nls.dwTimeout = 1000 * getDword("TimeOutReceiveNLB", MRA_DEFAULT_TIMEOUT_RECV_NLB); - InterlockedExchange((volatile LONG*)&m_dwThreadWorkerLastPingTime, GetTickCount()); - - while (m_iStatus != ID_STATUS_OFFLINE && bContinue) { - switch (Netlib_Select(&nls)) { - case SOCKET_ERROR: - case 0:// Time out - bContinue = FALSE; - break; - case 1: - dwBytesReceived = Netlib_Recv(nls.hReadConns[0], (LPSTR)(btBuff + dwRcvBuffSizeUsed), (int)(_countof(btBuff) - dwRcvBuffSizeUsed), 0); - if (dwBytesReceived && dwBytesReceived != SOCKET_ERROR) - dwRcvBuffSizeUsed += dwBytesReceived; - else - bContinue = FALSE; - break; - } - InterlockedExchange((volatile LONG*)&m_dwThreadWorkerLastPingTime, GetTickCount()); - } - Netlib_CloseHandle(nls.hReadConns[0]); - - if (dwRcvBuffSizeUsed) { - lpszPort = (LPSTR)MemoryFindByte(0, btBuff, dwRcvBuffSizeUsed, ':'); - if (lpszPort) { - (*lpszPort) = 0; - lpszPort++; - - szHost = (LPSTR)btBuff; - if (pwPort) (*pwPort) = (WORD)StrToUNum32(lpszPort, (dwRcvBuffSizeUsed - (lpszPort - (LPSTR)btBuff))); - dwRetErrorCode = NO_ERROR; - } - else { - dwRetErrorCode = ERROR_INVALID_USER_BUFFER; - ShowFormattedErrorMessage(L"NLB data corrupted", NO_ERROR); - } - } - else { - dwRetErrorCode = GetLastError(); - ShowFormattedErrorMessage(L"Can't get data for NLB, error", dwRetErrorCode); - } - } - else { - dwRetErrorCode = GetLastError(); - ShowFormattedErrorMessage(L"Can't connect to NLB server, error", dwRetErrorCode); - } - - return dwRetErrorCode; -} - -DWORD CMraProto::MraNetworkDispatcher() -{ - DWORD dwRetErrorCode = NO_ERROR; - - bool bContinue = true; - DWORD dwDataCurrentBuffSize, dwDataCurrentBuffSizeUsed; - size_t dwRcvBuffSize = BUFF_SIZE_RCV, dwRcvBuffSizeUsed = 0, dwDataCurrentBuffOffset = 0; - LPBYTE lpbBufferRcv; - mrim_packet_header_t *pmaHeader; - - NETLIBSELECT nls = { sizeof(nls) }; - nls.dwTimeout = 30000; - nls.hReadConns[0] = m_hConnection; - - lpbBufferRcv = (LPBYTE)mir_calloc(dwRcvBuffSize); - - m_dwNextPingSendTickTime = m_dwPingPeriod = MAXDWORD; - dwCMDNum = 0; - MraSendCMD(MRIM_CS_HELLO, nullptr, 0); - while (m_iStatus != ID_STATUS_OFFLINE && bContinue) { - int iSelectRet = Netlib_Select(&nls); - if (SOCKET_ERROR == iSelectRet) { - if (m_iStatus != ID_STATUS_OFFLINE) { - dwRetErrorCode = GetLastError(); - ShowFormattedErrorMessage(L"Disconnected, socket error", dwRetErrorCode); - } - break; - } - // Time out or normal - m_dwThreadWorkerLastPingTime = GetTickCount(); - /* Server ping. */ - if (m_dwNextPingSendTickTime <= m_dwThreadWorkerLastPingTime) { - nls.dwTimeout = (m_dwPingPeriod * 1000); - m_dwNextPingSendTickTime = (m_dwThreadWorkerLastPingTime + nls.dwTimeout); - MraSendCMD(MRIM_CS_PING, nullptr, 0); - } else { - if (MAXDWORD != m_dwNextPingSendTickTime) - nls.dwTimeout = (m_dwNextPingSendTickTime - m_dwThreadWorkerLastPingTime); - } - { /* Remove old items from send queue. */ - DWORD dwCmdNum, dwFlags, dwAckType; - MCONTACT hContact; - LPBYTE lpbData; - size_t dwDataSize; - while (!MraSendQueueFindOlderThan(hSendQueueHandle, SEND_QUEUE_TIMEOUT, &dwCmdNum, &dwFlags, &hContact, &dwAckType, &lpbData, &dwDataSize)) { - switch (dwAckType) { - case ACKTYPE_ADDED: - case ACKTYPE_AUTHREQ: - case ACKTYPE_CONTACTS: - //nothing to do - break; - case ACKTYPE_MESSAGE: - ProtoBroadcastAck(hContact, dwAckType, ACKRESULT_FAILED, (HANDLE)dwCmdNum, (LPARAM)"Undefined message deliver error, time out"); - break; - case ACKTYPE_GETINFO: - ProtoBroadcastAck(hContact, dwAckType, ACKRESULT_FAILED, (HANDLE)1, 0); - break; - case ACKTYPE_SEARCH: - ProtoBroadcastAck(hContact, dwAckType, ACKRESULT_SUCCESS, (HANDLE)dwCmdNum, 0); - break; - case ICQACKTYPE_SMS: - ProtoBroadcastAck(NULL, dwAckType, ACKRESULT_FAILED, (HANDLE)dwCmdNum, 0); - mir_free(lpbData); - break; - } - MraSendQueueFree(hSendQueueHandle, dwCmdNum); - } - } - - if (iSelectRet == 0) // Time out - continue; - - // expand receive buffer dynamically - if ((dwRcvBuffSize - dwRcvBuffSizeUsed) < BUFF_SIZE_RCV_MIN_FREE) { - dwRcvBuffSize += BUFF_SIZE_RCV; - lpbBufferRcv = (LPBYTE)mir_realloc(lpbBufferRcv, dwRcvBuffSize); - } - - DWORD dwBytesReceived = Netlib_Recv(nls.hReadConns[0], (LPSTR)(lpbBufferRcv + dwRcvBuffSizeUsed), (int)(dwRcvBuffSize - dwRcvBuffSizeUsed), 0); - if ( !dwBytesReceived || dwBytesReceived == SOCKET_ERROR) { // disconnected - if (m_iStatus != ID_STATUS_OFFLINE) { - dwRetErrorCode = GetLastError(); - debugLogA("Disconnected, socket read error %d", dwRetErrorCode); - } - break; - } - - dwRcvBuffSizeUsed += dwBytesReceived; - while (TRUE) { - dwDataCurrentBuffSize = (int)(dwRcvBuffSize - dwDataCurrentBuffOffset); - dwDataCurrentBuffSizeUsed = (int)(dwRcvBuffSizeUsed - dwDataCurrentBuffOffset); - pmaHeader = (mrim_packet_header_t*)(lpbBufferRcv + dwDataCurrentBuffOffset); - - // packet header received - if (dwDataCurrentBuffSizeUsed < sizeof(mrim_packet_header_t)) { // packet to small, continue receiving - debugLogW(L"Packet to small, continue receiving\n"); - memmove(lpbBufferRcv, (lpbBufferRcv + dwDataCurrentBuffOffset), dwDataCurrentBuffSizeUsed); - dwRcvBuffSizeUsed = dwDataCurrentBuffSizeUsed; - dwDataCurrentBuffOffset = 0; - break; - } - if (pmaHeader->magic != CS_MAGIC) { // bad packet - debugLogW(L"Bad packet\n"); - dwDataCurrentBuffOffset = 0; - dwRcvBuffSizeUsed = 0; - break; - } - // packet OK - if ((dwDataCurrentBuffSizeUsed - sizeof(mrim_packet_header_t)) < pmaHeader->dlen) { // not all packet received, continue receiving - if (dwDataCurrentBuffOffset) { - memmove(lpbBufferRcv, (lpbBufferRcv + dwDataCurrentBuffOffset), dwDataCurrentBuffSizeUsed); - dwRcvBuffSizeUsed = dwDataCurrentBuffSizeUsed; - dwDataCurrentBuffOffset = 0; - } - debugLogW(L"Not all packet received, continue receiving\n"); - break; - } - // full packet received, may be more than one - bContinue = MraCommandDispatcher(pmaHeader); - - // move pointer to next packet in buffer - if (dwDataCurrentBuffSizeUsed - sizeof(mrim_packet_header_t) > pmaHeader->dlen) - dwDataCurrentBuffOffset += sizeof(mrim_packet_header_t)+pmaHeader->dlen; - // move pointer to begin of buffer - else { - // динамическое уменьшение буффера приёма - if (dwRcvBuffSize > BUFF_SIZE_RCV) { - dwRcvBuffSize = BUFF_SIZE_RCV; - lpbBufferRcv = (LPBYTE)mir_realloc(lpbBufferRcv, dwRcvBuffSize); - } - dwDataCurrentBuffOffset = 0; - dwRcvBuffSizeUsed = 0; - break; - } - } - } - mir_free(lpbBufferRcv); - - return dwRetErrorCode; -} - -//Подтверждение установки соединения// UL ## ping_period ## Ожидаемая частота подтверждения соединения (в секундах) -bool CMraProto::CmdHelloAck(BinBuffer &buf) -{ - buf >> m_dwPingPeriod; - - CMStringA szPass; - if (!GetPassDB(szPass)) - return false; - - char szValueName[MAX_PATH]; - CMStringA szUserAgentFormatted, szEmail; - CMStringW wszStatusTitle, wszStatusDesc; - - DWORD dwXStatusMir = m_iXStatus, dwXStatus; - DWORD dwStatus = GetMraStatusFromMiradaStatus(m_iDesiredStatus, dwXStatusMir, &dwXStatus); - if (IsXStatusValid(dwXStatusMir)) {// xstatuses - mir_snprintf(szValueName, "XStatus%ldName", dwXStatusMir); - if (!mraGetStringW(NULL, szValueName, wszStatusTitle)) - wszStatusTitle = TranslateW(lpcszXStatusNameDef[dwXStatusMir]); - - mir_snprintf(szValueName, "XStatus%ldMsg", dwXStatusMir); - mraGetStringW(NULL, szValueName, wszStatusDesc); - } - else wszStatusTitle = Clist_GetStatusModeDescription(m_iDesiredStatus, 0); - - CMStringA szSelfVersionString = MraGetSelfVersionString(); - if (!mraGetStringA(NULL, "MirVerCustom", szUserAgentFormatted)) - szUserAgentFormatted.Format( - "client=\"magent\" name=\"Miranda NG\" title=\"%s\" version=\"777.%lu.%lu.%lu\" build=\"%lu\" protocol=\"%lu.%lu\"", - szSelfVersionString.c_str(), __FILEVERSION_STRING, PROTO_VERSION_MAJOR, PROTO_VERSION_MINOR); - - DWORD dwFutureFlags = (getByte("RTFReceiveEnable", MRA_DEFAULT_RTF_RECEIVE_ENABLE) ? FEATURE_FLAG_RTF_MESSAGE : 0) | MRA_FEATURE_FLAGS; - - if (!mraGetStringA(NULL, "e-mail", szEmail)) - return false; - - MraLogin2W(szEmail, szPass, dwStatus, lpcszStatusUri[dwXStatus], wszStatusTitle, wszStatusDesc, dwFutureFlags, szUserAgentFormatted, szSelfVersionString); - return true; -} - -// Successful authorization -bool CMraProto::CmdLoginAck() -{ - m_bLoggedIn = TRUE; - m_dwNextPingSendTickTime = 0; // force send ping - MraSendCMD(MRIM_CS_PING, nullptr, 0); - SetStatus(m_iDesiredStatus); - MraAvatarsQueueGetAvatarSimple(hAvatarsQueueHandle, GAIF_FORCE, NULL); - return true; -} - -// Unsuccessful authorization //LPS ## reason ## причина отказа -bool CMraProto::CmdLoginRejected(BinBuffer &buf) -{ - ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, nullptr, LOGINERR_WRONGPASSWORD); - - CMStringA reason; buf >> reason; - MraPopupShowW(NULL, MRA_POPUP_TYPE_ERROR, TranslateT("Logon error: invalid login/password"), _A2T(reason.c_str())); - return false; -} - -// Message delivery -//LPS ## from ## Адрес отправителя -//LPS ## message ## текстовая версия сообщения -//LPS ## rtf-message ## форматированная версия сообщения -bool CMraProto::CmdMessageAck(BinBuffer &buf) -{ - DWORD dwMsgID, dwFlags; - CMStringA szEmail, szText, szRTFText, szMultiChatData; - buf >> dwMsgID >> dwFlags >> szEmail >> szText >> szRTFText; - if (dwFlags & MESSAGE_FLAG_MULTICHAT) - buf >> szMultiChatData; // LPS multichat_data - - // подтверждаем получение, только если удалось его обработать - if (MraRecvCommand_Message((DWORD)_time32(nullptr), dwFlags, szEmail, szText, szRTFText, szMultiChatData) == NO_ERROR) - if ((dwFlags & MESSAGE_FLAG_NORECV) == 0) - MraMessageRecv(szEmail, dwMsgID); - return true; -} - -bool CMraProto::CmdMessageStatus(ULONG seq, BinBuffer &buf) -{ - DWORD dwAckType, dwTemp = buf.getDword(); - MCONTACT hContact; - if (!MraSendQueueFind(hSendQueueHandle, seq, nullptr, &hContact, &dwAckType, nullptr, nullptr)) { - switch (dwTemp) { - case MESSAGE_DELIVERED:// Message delivered directly to user - ProtoBroadcastAckAsync(hContact, dwAckType, ACKRESULT_SUCCESS, (HANDLE)seq, 0); - break;//***deb возможны сбои из-за асинхронности тк там передаётся указатель - case MESSAGE_REJECTED_NOUSER:// Message rejected - no such user - ProtoBroadcastAck(hContact, dwAckType, ACKRESULT_FAILED, (HANDLE)seq, (LPARAM)"Message rejected - no such user"); - break; - case MESSAGE_REJECTED_INTERR:// Internal server error - ProtoBroadcastAck(hContact, dwAckType, ACKRESULT_FAILED, (HANDLE)seq, (LPARAM)"Internal server error"); - break; - case MESSAGE_REJECTED_LIMIT_EXCEEDED:// Offline messages limit exceeded - ProtoBroadcastAck(hContact, dwAckType, ACKRESULT_FAILED, (HANDLE)seq, (LPARAM)"Offline messages limit exceeded"); - break; - case MESSAGE_REJECTED_TOO_LARGE:// Message is too large - ProtoBroadcastAck(hContact, dwAckType, ACKRESULT_FAILED, (HANDLE)seq, (LPARAM)"Message is too large"); - break; - case MESSAGE_REJECTED_DENY_OFFMSG:// User does not accept offline messages - ProtoBroadcastAck(hContact, dwAckType, ACKRESULT_FAILED, (HANDLE)seq, (LPARAM)"User does not accept offline messages"); - break; - case MESSAGE_REJECTED_DENY_OFFFLSH:// User does not accept offline flash animation - ProtoBroadcastAck(hContact, dwAckType, ACKRESULT_FAILED, (HANDLE)seq, (LPARAM)"User does not accept offline flash animation"); - break; - default: - ProtoBroadcastAck(hContact, dwAckType, ACKRESULT_FAILED, (HANDLE)seq, (LPARAM)CMStringA().Format("Undefined message delivery error, code: %lu", dwTemp)); - break; - } - MraSendQueueFree(hSendQueueHandle, seq); - } - // not found in queue - else if (dwTemp != MESSAGE_DELIVERED) - MraPopupShowFromAgentW(MRA_POPUP_TYPE_DEBUG, TranslateT("MRIM_CS_MESSAGE_STATUS: not found in queue")); - return true; -} - -bool CMraProto::CmdUserInfo(BinBuffer &buf) -{ - CMStringA szString; - CMStringW szStringW; - while (!buf.eof()) { - buf >> szString; - if (szString == "MESSAGES.TOTAL") { - buf >> szString; - dwEmailMessagesTotal = atoi(szString); - } - else if (szString == "MESSAGES.UNREAD") { - buf >> szString; - m_dwEmailMessagesUnread = atoi(szString); - } - else if (szString == "MRIM.NICKNAME") { - buf >> szStringW; - mraSetStringW(NULL, "Nick", szStringW); - } - else if (szString == "client.endpoint") { - buf >> szStringW; - szString = szStringW; - int lpszDelimiter = szString.Find(':'); - if (lpszDelimiter != -1) { - CMStringA szAddr(szString, lpszDelimiter); - setDword("IP", ntohl(inet_addr(szAddr.c_str()))); - } - } - else if (szString == "connect.xml") { - debugLogA(szString); - buf >> szStringW; - debugLogW(szStringW); - } - else if (szString == "micblog.show_title") { - debugLogA(szString); - buf >> szString; - debugLogW(szStringW); - } - else if (szString == "micblog.status.xml") { - debugLogA(szString); - buf >> szString; - debugLogA(szString); - } - else if (szString == "micblog.status.id") { - buf >> szStringW; - DWORDLONG dwBlogStatusID = _wtoi64(szStringW); - mraWriteContactSettingBlob(NULL, DBSETTING_BLOGSTATUSID, &dwBlogStatusID, sizeof(DWORDLONG)); - } - else if (szString == "micblog.status.time") { - buf >> szStringW; - setDword(DBSETTING_BLOGSTATUSTIME, _wtoi(szStringW)); - } - else if (szString == "micblog.status.text") { - buf >> szStringW; - mraSetStringW(NULL, DBSETTING_BLOGSTATUS, szStringW); - } - else if (szString == "HAS_MYMAIL" || szString == "mrim.status.open_search" || szString == "rb.target.cookie" || - szString == "show_web_history_link" || szString == "friends_suggest" || szString == "timestamp" || - szString == "trusted_update" || szString == "mrim.wp.dating") { - debugLogA(szString); - buf >> szStringW; - debugLogW(szStringW); - } - else _CrtDbgBreak(); - } - MraUpdateEmailStatus("", "", false); - return true; -} - -//Сообщение доставленное, пока пользователь не был подключен к сети -bool CMraProto::CmdOfflineMessageAck(BinBuffer &buf) -{ - CMStringA szEmail, szText, lpsRTFText, lpsMultiChatData, szString; - DWORDLONG dwMsgUIDL; - buf >> dwMsgUIDL >> szString; - - DWORD dwTime, dwFlags; - if (MraOfflineMessageGet(szString, dwTime, dwFlags, szEmail, szText, lpsRTFText, lpsMultiChatData) == NO_ERROR) { - DWORD dwTemp = MraRecvCommand_Message(dwTime, dwFlags, szEmail, szText, lpsRTFText, lpsMultiChatData); - if (dwTemp == NO_ERROR || dwTemp == ERROR_ACCESS_DENIED) - MraOfflineMessageDel(dwMsgUIDL); - else - ShowFormattedErrorMessage(L"Offline message processing error, message will not deleted from server", NO_ERROR); - } - else ShowFormattedErrorMessage(L"Offline message processing error, message will not deleted from server", NO_ERROR); - - return true; -} - -// Auth confirmation -bool CMraProto::CmdAuthAck(BinBuffer &buf) -{ - CMStringA szEmail; - buf >> szEmail; - - BOOL bAdded; - MCONTACT hContact = MraHContactFromEmail(szEmail, TRUE, TRUE, &bAdded); - if (bAdded) - MraUpdateContactInfo(hContact); - - if (IsEMailChatAgent(szEmail) == FALSE) { - CMStringA szBuff = CreateBlobFromContact(hContact, L""); - - DBEVENTINFO dbei = {}; - dbei.flags = DBEF_UTF; - dbei.szModule = m_szModuleName; - dbei.timestamp = (DWORD)_time32(nullptr); - dbei.eventType = EVENTTYPE_ADDED; - dbei.cbBlob = szBuff.GetLength(); - dbei.pBlob = (PBYTE)szBuff.GetString(); - db_event_add(0, &dbei); - } - - DWORD dwTemp; - GetContactBasicInfoW(hContact, nullptr, nullptr, nullptr, &dwTemp, nullptr, nullptr, nullptr, nullptr); - dwTemp &= ~CONTACT_INTFLAG_NOT_AUTHORIZED; - SetContactBasicInfoW(hContact, SCBIFSI_LOCK_CHANGES_EVENTS, SCBIF_SERVER_FLAG, 0, 0, 0, dwTemp, 0, nullptr, nullptr, nullptr); - setDword(hContact, "HooksLocked", TRUE); - db_unset(hContact, "CList", "NotOnList"); - setDword(hContact, "HooksLocked", FALSE); - return true; -} - -// Web auth key -bool CMraProto::CmdPopSession(BinBuffer &buf) -{ - DWORD dwTemp = buf.getDword(); - if (dwTemp) { - CMStringA szString; buf >> szString; - if (NO_ERROR == MraMPopSessionQueueSetNewMPopKey(hMPopSessionQueue, szString)) { - MraMPopSessionQueueStart(hMPopSessionQueue); - return true; - } - } - //error - MraPopupShowFromAgentW(MRA_POPUP_TYPE_WARNING, TranslateT("Server error: can't get MPOP key for web authorize")); - MraMPopSessionQueueFlush(hMPopSessionQueue); - - return true; -} - -bool CMraProto::CmdFileTransfer(BinBuffer &buf) -{ - DWORD dwIDRequest, dwFilesTotalSize, dwTemp; - CMStringA szFiles, szEmail, szAddresses; - CMStringW wszFilesW; - - buf >> szEmail >> dwIDRequest >> dwFilesTotalSize >> dwTemp; - if (dwTemp) { - buf >> szFiles >> dwTemp; - if (dwTemp) { // LPS DESCRIPTION - buf >> dwTemp >> wszFilesW; - _ASSERTE(dwTemp != 1); - } - buf >> szAddresses; - } - - BOOL bAdded = FALSE; - MCONTACT hContact = MraHContactFromEmail(szEmail, TRUE, TRUE, &bAdded); - if (bAdded) - MraUpdateContactInfo(hContact); - - if (wszFilesW.IsEmpty()) - wszFilesW = szFiles; - - if (!wszFilesW.IsEmpty()) - MraFilesQueueAddReceive(hFilesQueueHandle, 0, hContact, dwIDRequest, wszFilesW, szAddresses); - return true; -} - -bool CMraProto::CmdFileTransferAck(BinBuffer &buf) -{ - CMStringA szEmail, szString; - DWORD dwAckType, dwTemp; - buf >> dwAckType >> szEmail >> dwTemp >> szString; - - switch (dwAckType) { - case FILE_TRANSFER_STATUS_OK:// игнорируем, мы и так уже слушаем порт(ждём), то что кто то согласился ничего не меняет - //hContact = MraHContactFromEmail(szEmail.lpszData, szEmail.dwSize, TRUE, TRUE, NULL); - break; - case FILE_TRANSFER_STATUS_DECLINE: - MraFilesQueueCancel(hFilesQueueHandle, dwTemp, FALSE); - break; - case FILE_TRANSFER_STATUS_ERROR: - ShowFormattedErrorMessage(L"File transfer: error", NO_ERROR); - MraFilesQueueCancel(hFilesQueueHandle, dwTemp, FALSE); - break; - case FILE_TRANSFER_STATUS_INCOMPATIBLE_VERS: - ShowFormattedErrorMessage(L"File transfer: incompatible versions", NO_ERROR); - MraFilesQueueCancel(hFilesQueueHandle, dwTemp, FALSE); - break; - case FILE_TRANSFER_MIRROR: - MraFilesQueueSendMirror(hFilesQueueHandle, dwTemp, szString); - break; - default:// ## unknown error - wchar_t szBuff[1024]; - mir_snwprintf(szBuff, TranslateT("MRIM_CS_FILE_TRANSFER_ACK: unknown error, code: %lu"), dwAckType); - ShowFormattedErrorMessage(szBuff, NO_ERROR); - break; - } - return true; -} - -// Смена статуса другого пользователя -bool CMraProto::CmdUserStatus(BinBuffer &buf) -{ - DWORD dwStatus, dwXStatus, dwFutureFlags; - CMStringA szSpecStatusUri, szUserAgentFormatted, szEmail; - CMStringW szStatusTitle, szStatusDesc; - buf >> dwStatus >> szSpecStatusUri >> szStatusTitle >> szStatusDesc >> szEmail >> dwFutureFlags >> szUserAgentFormatted; - - BOOL bAdded; - if (MCONTACT hContact = MraHContactFromEmail(szEmail, TRUE, TRUE, &bAdded)) { - if (bAdded) - MraUpdateContactInfo(hContact); - - DWORD dwTemp = GetMirandaStatusFromMraStatus(dwStatus, GetMraXStatusIDFromMraUriStatus(szSpecStatusUri), &dwXStatus); - - MraContactCapabilitiesSet(hContact, dwFutureFlags); - setByte(hContact, DBSETTING_XSTATUSID, (BYTE)dwXStatus); - if (dwXStatus) { - mraSetStringW(hContact, DBSETTING_XSTATUSNAME, szStatusTitle); - mraSetStringW(hContact, DBSETTING_XSTATUSMSG, szStatusDesc); - } - else { - delSetting(hContact, DBSETTING_XSTATUSNAME); - delSetting(hContact, DBSETTING_XSTATUSMSG); - } - - if (dwTemp != ID_STATUS_OFFLINE) { // пишем клиента только если юзер не отключён, иначе не затираем старое - if (!szUserAgentFormatted.IsEmpty()) { - if (getByte("MirVerRaw", MRA_DEFAULT_MIRVER_RAW) == FALSE) - szUserAgentFormatted = MraGetVersionStringFromFormatted(szUserAgentFormatted); - } - else szUserAgentFormatted = (szEmail.Find("@uin.icq") == -1) ? MIRVER_UNKNOWN : "ICQ client"; - - mraSetStringA(hContact, "MirVer", szUserAgentFormatted); - } - - if (dwTemp == MraGetContactStatus(hContact)) {// меняем шило на шило, подозрительно? ;) - if (dwTemp == ID_STATUS_OFFLINE) { // was/now invisible - CMStringW wszEmail, wszBuff; - mraGetStringW(hContact, "e-mail", wszEmail); - wszBuff.Format(L"%s <%s> - %s", Clist_GetContactDisplayName(hContact), wszEmail.c_str(), TranslateT("invisible status changed")); - MraPopupShowFromContactW(hContact, MRA_POPUP_TYPE_INFORMATION, wszBuff); - - MraSetContactStatus(hContact, ID_STATUS_INVISIBLE); - } - } - MraSetContactStatus(hContact, dwTemp); - SetExtraIcons(hContact); - } - return true; -} - -bool CMraProto::CmdContactAck(int cmd, int seq, BinBuffer &buf) -{ - DWORD dwAckType; MCONTACT hContact; - if (!MraSendQueueFind(hSendQueueHandle, seq, nullptr, &hContact, &dwAckType, nullptr, nullptr)) { - DWORD dwTemp = buf.getDword(); - switch (dwTemp) { - case CONTACT_OPER_SUCCESS:// ## добавление произведено успешно - if (cmd == MRIM_CS_ADD_CONTACT_ACK) { - DWORD dwFlags = SCBIF_ID | SCBIF_SERVER_FLAG, dwGroupID = 0; - ptrW grpName(db_get_wsa(hContact, "CList", "Group")); - if (grpName) { - dwFlags |= SCBIF_GROUP_ID; - dwGroupID = MraMoveContactToGroup(hContact, -1, grpName); - } - SetContactBasicInfoW(hContact, 0, dwFlags, buf.getDword(), dwGroupID, 0, CONTACT_INTFLAG_NOT_AUTHORIZED, 0, nullptr, nullptr, nullptr); - } - break; - case CONTACT_OPER_ERROR:// ## переданные данные были некорректны - ShowFormattedErrorMessage(L"Data been sent are invalid", NO_ERROR); - break; - case CONTACT_OPER_INTERR:// ## при обработке запроса произошла внутренняя ошибка - ShowFormattedErrorMessage(L"Internal server error", NO_ERROR); - break; - case CONTACT_OPER_NO_SUCH_USER:// ## добавляемого пользователя не существует в системе - SetContactBasicInfoW(hContact, 0, SCBIF_SERVER_FLAG, 0, 0, 0, -1, 0, nullptr, nullptr, nullptr); - ShowFormattedErrorMessage(L"No such user to add", NO_ERROR); - break; - case CONTACT_OPER_INVALID_INFO:// ## некорректное имя пользователя - ShowFormattedErrorMessage(L"Invalid user name", NO_ERROR); - break; - case CONTACT_OPER_USER_EXISTS:// ## пользователь уже есть в контакт-листе - ShowFormattedErrorMessage(L"User already added", NO_ERROR); - break; - case CONTACT_OPER_GROUP_LIMIT:// ## превышено максимально допустимое количество групп (20) - ShowFormattedErrorMessage(L"Group limit is 20", NO_ERROR); - break; - default:// ## unknown error - wchar_t szBuff[1024]; - mir_snwprintf(szBuff, TranslateT("MRIM_CS_*_CONTACT_ACK: unknown server error, code: %lu"), dwTemp); - MraPopupShowFromAgentW(MRA_POPUP_TYPE_DEBUG, szBuff); - break; - } - MraSendQueueFree(hSendQueueHandle, seq); - } - else MraPopupShowFromAgentW(MRA_POPUP_TYPE_DEBUG, TranslateT("MRIM_CS_*_CONTACT_ACK: not found in queue")); - return true; -} - -bool CMraProto::CmdAnketaInfo(int seq, BinBuffer &buf) -{ - DWORD dwAckType, dwFlags; MCONTACT hContact; - if (MraSendQueueFind(hSendQueueHandle, seq, &dwFlags, &hContact, &dwAckType, nullptr, nullptr)) { - MraPopupShowFromAgentW(MRA_POPUP_TYPE_DEBUG, TranslateT("MRIM_ANKETA_INFO: not found in queue")); - return true; - } - - switch (buf.getDword()) { - case MRIM_ANKETA_INFO_STATUS_NOUSER:// не найдено ни одной подходящей записи - SetContactBasicInfoW(hContact, 0, SCBIF_SERVER_FLAG, 0, 0, 0, -1, 0, nullptr, nullptr, nullptr); - case MRIM_ANKETA_INFO_STATUS_DBERR:// ошибка базы данных - case MRIM_ANKETA_INFO_STATUS_RATELIMERR:// слишком много запросов, поиск временно запрещен - switch (dwAckType) { - case ACKTYPE_GETINFO: - ProtoBroadcastAck(hContact, dwAckType, ACKRESULT_FAILED, (HANDLE)1, 0); - break; - case ACKTYPE_SEARCH: - ProtoBroadcastAck(hContact, dwAckType, ACKRESULT_SUCCESS, (HANDLE)seq, 0); - break; - } - break; - - case MRIM_ANKETA_INFO_STATUS_OK: - // поиск успешно завершен - DWORD dwFieldsNum, dwMaxRows, dwServerTime; - DWORD dwID, dwContactSeverFlags, dwStatus, dwXStatus; - buf >> dwFieldsNum >> dwMaxRows >> dwServerTime; - - CMStringA *pmralpsFields = new CMStringA[dwFieldsNum]; - CMStringA val; - CMStringW valW, StatusNameW, StatusMsgW; - - /* Default contact statuses in mail.ru format. */ - dwStatus = STATUS_OFFLINE; - dwXStatus = MRA_XSTATUS_OFFLINE; - - // read headers name - for (DWORD i = 0; i < dwFieldsNum; i++) { - buf >> pmralpsFields[i]; - debugLogA(pmralpsFields[i] + " "); - } - - while (!buf.eof()) { - // write to DB and exit loop - if (dwAckType == ACKTYPE_GETINFO && hContact) { - setDword(hContact, "InfoTS", (DWORD)_time32(nullptr)); - //MRA_LPS mralpsUsernameValue; - for (DWORD i = 0; i < dwFieldsNum; i++) { - CMStringA &fld = pmralpsFields[i]; - if (fld == "Nickname") { - buf >> valW; - mraSetStringW(hContact, "Nick", valW); - } - else if (fld == "FirstName") { - buf >> valW; - mraSetStringW(hContact, "FirstName", valW); - } - else if (fld == "LastName") { - buf >> valW; - mraSetStringW(hContact, "LastName", valW); - } - else if (fld == "Sex") { - buf >> val; - switch (atoi(val)) { - case 1:// мужской - setByte(hContact, "Gender", 'M'); - break; - case 2:// женский - setByte(hContact, "Gender", 'F'); - break; - default:// а фиг его знает - delSetting(hContact, "Gender"); - break; - } - } - else if (fld == "Birthday") { - buf >> val; - if (val.GetLength() > 9) {// calc "Age" - SYSTEMTIME stTime = { 0 }; - stTime.wYear = (WORD)StrToUNum32(val.c_str(), 4); - stTime.wMonth = (WORD)StrToUNum32(val.c_str() + 5, 2); - stTime.wDay = (WORD)StrToUNum32(val.c_str() + 8, 2); - setWord(hContact, "BirthYear", stTime.wYear); - setByte(hContact, "BirthMonth", (BYTE)stTime.wMonth); - setByte(hContact, "BirthDay", (BYTE)stTime.wDay); - setWord(hContact, "Age", (WORD)GetYears(&stTime)); - } - else { - delSetting(hContact, "BirthYear"); - delSetting(hContact, "BirthMonth"); - delSetting(hContact, "BirthDay"); - delSetting(hContact, "Age"); - } - } - else if (fld == "City_id") { - buf >> val; - DWORD dwTemp = atoi(val); - if (dwTemp) { - for (size_t j = 0; mrapPlaces[j].lpszData; j++) { - if (mrapPlaces[j].dwCityID == dwTemp) { - mraSetStringW(hContact, "City", mrapPlaces[j].lpszData); - break; - } - } - } - else delSetting(hContact, "City"); - } - else if (fld == "Location") { - buf >> valW; - mraSetStringW(hContact, "About", valW); - } - else if (fld == "Country_id") { - buf >> val; - DWORD dwTemp = atoi(val); - if (dwTemp) { - for (size_t j = 0; mrapPlaces[j].lpszData; j++) { - if (mrapPlaces[j].dwCountryID == dwTemp) { - mraSetStringW(hContact, "Country", mrapPlaces[j].lpszData); - break; - } - } - } - else delSetting(hContact, "Country"); - } - else if (fld == "Phone") { - delSetting(hContact, "Phone"); - delSetting(hContact, "Cellular"); - delSetting(hContact, "Fax"); - - buf >> val; - if (val.GetLength()) { - int iStart = 0; - CMStringA szPhone = val.Tokenize(",", iStart); - if (iStart != -1) { - mraSetStringA(hContact, "Phone", szPhone); - szPhone = val.Tokenize(",", iStart); - } - if (iStart != -1) { - mraSetStringA(hContact, "Cellular", szPhone); - szPhone = val.Tokenize(",", iStart); - } - if (iStart != -1) - mraSetStringA(hContact, "Fax", szPhone); - } - } - else if (fld == "mrim_status") { - buf >> val; - if (val.GetLength()) - dwStatus = atoi(val); - } - else if (fld == "status_uri") { - buf >> val; - if (val.GetLength()) - dwXStatus = GetMraXStatusIDFromMraUriStatus(val); - } - else if (fld == "status_title") { - buf >> StatusNameW; - } - else if (fld == "status_desc") { - buf >> StatusMsgW; - } - else {// for DEBUG ONLY - buf >> val; - debugLogA("%s = %s\n", fld.c_str(), val.c_str()); - } - } /* for */ - // для авторизованного нам и так присылают правильный статус - GetContactBasicInfoW(hContact, &dwID, nullptr, nullptr, &dwContactSeverFlags, nullptr, nullptr, nullptr, nullptr); - if (dwID == -1 || (dwContactSeverFlags & CONTACT_INTFLAG_NOT_AUTHORIZED)) { - /* Convert mail.ru statuses to miranda. */ - dwStatus = GetMirandaStatusFromMraStatus(dwStatus, dwXStatus, &dwXStatus); - MraSetContactStatus(hContact, dwStatus); - setByte(hContact, DBSETTING_XSTATUSID, (BYTE)dwXStatus); - if (StatusNameW.GetLength()) - mraSetStringW(hContact, DBSETTING_XSTATUSNAME, StatusNameW); - if (StatusMsgW.GetLength()) - mraSetStringW(hContact, DBSETTING_XSTATUSMSG, StatusMsgW); - } - } - else if (dwAckType == ACKTYPE_SEARCH) { - wchar_t szNick[MAX_EMAIL_LEN] = { 0 }, - szFirstName[MAX_EMAIL_LEN] = { 0 }, - szLastName[MAX_EMAIL_LEN] = { 0 }, - szEmail[MAX_EMAIL_LEN] = { 0 }; - CMStringA mralpsUsernameValue; - PROTOSEARCHRESULT psr = { 0 }; - - psr.cbSize = sizeof(psr); - psr.flags = PSR_UNICODE; - psr.nick.w = szNick; - psr.firstName.w = szFirstName; - psr.lastName.w = szLastName; - psr.email.w = szEmail; - psr.id.w = szEmail; - - for (DWORD i = 0; i < dwFieldsNum; i++) { - CMStringA &fld = pmralpsFields[i]; - if (fld == "Username") { - buf >> val; - mralpsUsernameValue = val; - } - else if (fld == "Domain") { // имя было уже задано ранее - buf >> val; - wcsncpy_s(szEmail, _A2T(mralpsUsernameValue + "@" + val), _TRUNCATE); - } - else if (fld == "Nickname") { - buf >> valW; - wcsncpy_s(szNick, valW, _TRUNCATE); - } - else if (fld == "FirstName") { - buf >> valW; - wcsncpy_s(szFirstName, valW, _TRUNCATE); - } - else if (fld == "LastName") { - buf >> valW; - wcsncpy_s(szLastName, valW, _TRUNCATE); - } - else buf >> val; - } - ProtoBroadcastAck(hContact, dwAckType, ACKRESULT_DATA, (HANDLE)seq, (LPARAM)&psr); - } - } - - delete[] pmralpsFields; - - switch (dwAckType) { - case ACKTYPE_GETINFO: - ProtoBroadcastAck(hContact, dwAckType, ACKRESULT_SUCCESS, (HANDLE)1, 0); - break; - case ACKTYPE_SEARCH: - default: - ProtoBroadcastAck(hContact, dwAckType, ACKRESULT_SUCCESS, (HANDLE)seq, 0); - break; - } - break; - } - MraSendQueueFree(hSendQueueHandle, seq); - return true; -} - -bool CMraProto::CmdGame(BinBuffer &buf) -{ - MCONTACT hContact; - CMStringA szEmail, szData; - DWORD dwGameSessionID, dwGameMsg, dwGameMsgID, dwTemp; - buf >> szEmail >> dwGameSessionID >> dwGameMsg >> dwGameMsgID >> dwTemp >> szData; - - switch (dwGameMsg) { - case GAME_CONNECTION_INVITE: - if (m_iStatus != ID_STATUS_INVISIBLE) - MraGame(szEmail, dwGameSessionID, GAME_DECLINE, dwGameMsgID, szData); - break; - case GAME_CONNECTION_ACCEPT: - break; - case GAME_DECLINE: - break; - case GAME_INC_VERSION: - break; - case GAME_NO_SUCH_GAME:// user invisible - if ((hContact = MraHContactFromEmail(szEmail, FALSE, TRUE, nullptr))) - if (MraGetContactStatus(hContact) == ID_STATUS_OFFLINE) - MraSetContactStatus(hContact, ID_STATUS_INVISIBLE); - break; - case GAME_JOIN: - break; - case GAME_CLOSE: - break; - case GAME_SPEED: - break; - case GAME_SYNCHRONIZATION: - break; - case GAME_USER_NOT_FOUND: - break; - case GAME_ACCEPT_ACK: - break; - case GAME_PING: - break; - case GAME_RESULT: - break; - case GAME_MESSAGES_NUMBER: - break; - default: - wchar_t szBuff[1024]; - mir_snwprintf(szBuff, TranslateT("MRIM_CS_GAME: unknown internal game message code: %lu"), dwGameMsg); - MraPopupShowFromAgentW(MRA_POPUP_TYPE_DEBUG, szBuff); - break; - } - return true; -} - -bool CMraProto::CmdClist2(BinBuffer &buf) -{ - DWORD dwTemp = buf.getDword(); - if (dwTemp == GET_CONTACTS_OK) { // received contact list - m_groups.destroy(); - - DWORD dwGroupsCount, dwContactFlag = 0, dwGroupID = 0, dwContactSeverFlags = 0, dwStatus = 0, dwXStatus, dwFutureFlags = 0, dwBlogStatusTime = 0; - ULARGE_INTEGER dwBlogStatusID; - CMStringA szGroupMask, szContactMask, szEmail, szString; - CMStringA szCustomPhones, szSpecStatusUri, szUserAgentFormatted; - CMStringW wszNick, wszString, wszGroupName, wszStatusTitle, wszStatusDesc, wszBlogStatus, wszBlogStatusMusic; - buf >> dwGroupsCount >> szGroupMask >> szContactMask; - - int iGroupMode = getByte("GroupMode", 100); - - debugLogA("Groups: %s\n", szGroupMask.c_str()); - DWORD dwID = 0; - for (DWORD i = 0; i < dwGroupsCount; i++) { //groups handle - DWORD dwControlParam = 0, dwGroupFlags = 0; - for (int j = 0; j < szGroupMask.GetLength(); j++) { //enumerating parameters - switch (szGroupMask[j]) { - case 's'://LPS - buf >> wszString; - break; - case 'u'://UL - buf >> dwTemp; - break; - } - - if (j == 0 && szGroupMask[j] == 'u') { // GroupFlags - dwGroupFlags = dwTemp; - dwControlParam++; - } - else if (j == 1 && szGroupMask[j] == 's') { // GroupName - wszGroupName = wszString; - dwControlParam++; - } - } - - // add/modify group - if (dwControlParam > 1) { // все параметры правильно инициализированны! - if (!(dwGroupFlags & CONTACT_FLAG_REMOVED)) { - m_groups.insert(new MraGroupItem(dwID, dwGroupFlags, wszGroupName)); - Clist_GroupCreate(0, wszGroupName); - } - - debugLogW(L"'%s', flags: %lu (", wszGroupName.c_str(), dwGroupFlags); - if (dwGroupFlags & CONTACT_FLAG_REMOVED) debugLogA("CONTACT_FLAG_REMOVED, "); - if (dwGroupFlags & CONTACT_FLAG_GROUP) debugLogA("CONTACT_FLAG_GROUP, "); - if (dwGroupFlags & CONTACT_FLAG_INVISIBLE) debugLogA("CONTACT_FLAG_INVISIBLE, "); - if (dwGroupFlags & CONTACT_FLAG_VISIBLE) debugLogA("CONTACT_FLAG_VISIBLE, "); - if (dwGroupFlags & CONTACT_FLAG_IGNORE) debugLogA("CONTACT_FLAG_IGNORE, "); - if (dwGroupFlags & CONTACT_FLAG_SHADOW) debugLogA("CONTACT_FLAG_SHADOW, "); - if (dwGroupFlags & CONTACT_FLAG_AUTHORIZED) debugLogA("CONTACT_FLAG_AUTHORIZED, "); - if (dwGroupFlags & CONTACT_FLAG_MULTICHAT) debugLogA("CONTACT_FLAG_MULTICHAT, "); - if (dwGroupFlags & CONTACT_FLAG_UNICODE_NAME) debugLogA("CONTACT_FLAG_UNICODE_NAME, "); - if (dwGroupFlags & CONTACT_FLAG_PHONE) debugLogA("CONTACT_FLAG_PHONE, "); - debugLogA(")"); - } - dwID++; - } - - debugLogA("Contacts: %s\n", szContactMask.c_str()); - dwID = 20; - while (!buf.eof()) { - DWORD dwControlParam = 0; - for (int j = 0; j < szContactMask.GetLength(); j++) { //enumerating parameters - BYTE fieldType = szContactMask[j]; - if (fieldType == 'u') - buf >> dwTemp; - - if (j == 0 && fieldType == 'u') { // Flags - dwContactFlag = dwTemp; - dwControlParam++; - } - else if (j == 1 && fieldType == 'u') { // Group id - dwGroupID = dwTemp; - dwControlParam++; - } - else if (j == 2 && fieldType == 's') { // Email - buf >> szEmail; - dwControlParam++; - } - else if (j == 3 && fieldType == 's') { // Nick - buf >> wszNick; - dwControlParam++; - } - else if (j == 4 && fieldType == 'u') { // Server flags - dwContactSeverFlags = dwTemp; - dwControlParam++; - } - else if (j == 5 && fieldType == 'u') { // Status - dwStatus = dwTemp; - dwControlParam++; - } - else if (j == 6 && fieldType == 's') { // Custom Phone number, - buf >> szCustomPhones; - dwControlParam++; - } - else if (j == 7 && fieldType == 's') { // spec_status_uri - buf >> szSpecStatusUri; - dwControlParam++; - } - else if (j == 8 && fieldType == 's') { // status_title - buf >> wszStatusTitle; - dwControlParam++; - } - else if (j == 9 && fieldType == 's') { // status_desc - buf >> wszStatusDesc; - dwControlParam++; - } - else if (j == 10 && fieldType == 'u') { // com_support (future flags) - dwFutureFlags = dwTemp; - dwControlParam++; - } - else if (j == 11 && fieldType == 's') { // user_agent (formated string) - buf >> szUserAgentFormatted; - dwControlParam++; - } - else if (j == 12 && fieldType == 'u') { // BlogStatusID - dwBlogStatusID.LowPart = dwTemp; - dwControlParam++; - } - else if (j == 13 && fieldType == 'u') { // BlogStatusID - dwBlogStatusID.HighPart = dwTemp; - dwControlParam++; - } - else if (j == 14 && fieldType == 'u') { // BlogStatusTime - dwBlogStatusTime = dwTemp; - dwControlParam++; - } - else if (j == 15 && fieldType == 's') { // BlogStatus - buf >> wszBlogStatus; - dwControlParam++; - } - else if (j == 16 && fieldType == 's') { // BlogStatusMusic - buf >> wszBlogStatusMusic; - dwControlParam++; - } - else if (j == 17 && fieldType == 's') { // BlogStatusSender // ignory - buf >> szString; - dwControlParam++; - } - else if (j == 18 && fieldType == 's') { // geo data ? - buf >> szString; - dwControlParam++; - } - else if (j == 19 && fieldType == 's') { // ?????? ? - buf >> szString; - dwControlParam++; - _ASSERTE(szString.GetLength()); - } - else { - if (fieldType == 's') { - buf >> szString; - if (szString.GetLength()) { - debugLogA(szString + " "); - } - } - else if (fieldType == 'u') { - char szBuff[50]; - mir_snprintf(szBuff, "%lu, ", dwTemp);//; - debugLogA("%s ", szBuff); - } - else _CrtDbgBreak(); - } - } - - debugLogA("ID: %lu, Group id: %lu, %s: flags: %lu (", dwID, dwGroupID, szEmail.c_str(), dwContactFlag); - if (dwContactFlag & CONTACT_FLAG_REMOVED) debugLogA("CONTACT_FLAG_REMOVED, "); - if (dwContactFlag & CONTACT_FLAG_GROUP) debugLogA("CONTACT_FLAG_GROUP, "); - if (dwContactFlag & CONTACT_FLAG_INVISIBLE) debugLogA("CONTACT_FLAG_INVISIBLE, "); - if (dwContactFlag & CONTACT_FLAG_VISIBLE) debugLogA("CONTACT_FLAG_VISIBLE, "); - if (dwContactFlag & CONTACT_FLAG_IGNORE) debugLogA("CONTACT_FLAG_IGNORE, "); - if (dwContactFlag & CONTACT_FLAG_SHADOW) debugLogA("CONTACT_FLAG_SHADOW, "); - if (dwContactFlag & CONTACT_FLAG_AUTHORIZED) debugLogA("CONTACT_FLAG_AUTHORIZED, "); - if (dwContactFlag & CONTACT_FLAG_MULTICHAT) debugLogA("CONTACT_FLAG_MULTICHAT, "); - if (dwContactFlag & CONTACT_FLAG_UNICODE_NAME) debugLogA("CONTACT_FLAG_UNICODE_NAME, "); - if (dwContactFlag & CONTACT_FLAG_PHONE) debugLogA("CONTACT_FLAG_PHONE, "); - debugLogA(")"); - - debugLogA(": server flags: %lu (", dwContactSeverFlags); - if (dwContactSeverFlags & CONTACT_INTFLAG_NOT_AUTHORIZED) debugLogA("CONTACT_INTFLAG_NOT_AUTHORIZED, "); - debugLogA(")"); - - // add/modify contact - if (dwGroupID != 103)//***deb filtering phone/sms contats - if (_strnicmp(szEmail, "phone", 5)) - if (dwControlParam > 5)// все параметры правильно инициализированны! - if ((dwContactFlag & (CONTACT_FLAG_GROUP | CONTACT_FLAG_REMOVED)) == 0) { - BOOL bAdded; - MCONTACT hContact = MraHContactFromEmail(szEmail, TRUE, FALSE, &bAdded); - if (hContact) { - // already in list, remove the duplicate - if (GetContactBasicInfoW(hContact, &dwTemp, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr) == NO_ERROR && dwTemp != -1) { - _CrtDbgBreak(); - } - else { - dwTemp = GetMirandaStatusFromMraStatus(dwStatus, GetMraXStatusIDFromMraUriStatus(szSpecStatusUri), &dwXStatus); - - 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, nullptr, &wszNick, &szCustomPhones); - // request user info from server - MraUpdateContactInfo(hContact); - } - else { - if (iGroupMode == 100) { // first start - ptrW tszGroup(db_get_wsa(hContact, "CList", "Group")); - if (tszGroup) - dwGroupID = MraMoveContactToGroup(hContact, dwGroupID, tszGroup); - } - - SetContactBasicInfoW(hContact, SCBIFSI_LOCK_CHANGES_EVENTS, (SCBIF_ID | SCBIF_GROUP_ID | SCBIF_SERVER_FLAG | SCBIF_STATUS), - dwID, dwGroupID, dwContactFlag, dwContactSeverFlags, dwTemp, nullptr, &wszNick, &szCustomPhones); - if (wszNick.IsEmpty()) { // set the server-side nick - wszNick = Clist_GetContactDisplayName(hContact); - MraModifyContact(hContact, &dwID, &dwContactFlag, &dwGroupID, &szEmail, &wszNick, &szCustomPhones); - } - } - - MraContactCapabilitiesSet(hContact, dwFutureFlags); - setByte(hContact, DBSETTING_XSTATUSID, (BYTE)dwXStatus); - mraSetStringW(hContact, DBSETTING_XSTATUSNAME, wszStatusTitle); - mraSetStringW(hContact, DBSETTING_XSTATUSMSG, wszStatusDesc); - setDword(hContact, DBSETTING_BLOGSTATUSTIME, dwBlogStatusTime); - mraWriteContactSettingBlob(hContact, DBSETTING_BLOGSTATUSID, &dwBlogStatusID.QuadPart, sizeof(DWORDLONG)); - mraSetStringW(hContact, DBSETTING_BLOGSTATUS, wszBlogStatus); - mraSetStringW(hContact, DBSETTING_BLOGSTATUSMUSIC, wszBlogStatusMusic); - if (IsXStatusValid(dwXStatus) || wszBlogStatus.GetLength()) - SetExtraIcons(hContact); - - if (dwTemp != ID_STATUS_OFFLINE) { // пишем клиента только если юзер не отключён, иначе не затираем старое - if (!szUserAgentFormatted.IsEmpty()) { - if (getByte("MirVerRaw", MRA_DEFAULT_MIRVER_RAW) == FALSE) - szUserAgentFormatted = MraGetVersionStringFromFormatted(szUserAgentFormatted); - } - else szUserAgentFormatted = MIRVER_UNKNOWN; - mraSetStringA(hContact, "MirVer", szUserAgentFormatted); - } - - if (dwContactSeverFlags & CONTACT_INTFLAG_NOT_AUTHORIZED) - if (getByte("AutoAuthRequestOnLogon", MRA_DEFAULT_AUTO_AUTH_REQ_ON_LOGON)) - CallProtoService(m_szModuleName, MRA_REQ_AUTH, hContact, 0); - } - } - } - dwID++; - }// end while (processing contacts) - - // post processing contact list - { - CMStringA email, phones; - CMStringW wszAuthMessage, nick; - - if (mraGetStringW(NULL, "AuthMessage", wszAuthMessage) == FALSE) // def auth message - wszAuthMessage = TranslateW(MRA_DEFAULT_AUTH_MESSAGE); - - for (auto &hContact : AccContacts()) { - if (GetContactBasicInfoW(hContact, &dwID, nullptr, nullptr, nullptr, nullptr, &email, nullptr, nullptr) == NO_ERROR) - if (dwID == -1) { - if (IsEMailChatAgent(email)) {// чат: ещё раз запросим авторизацию, пометим как видимый в списке, постоянный - db_unset(hContact, "CList", "Hidden"); - db_unset(hContact, "CList", "NotOnList"); - SetExtraIcons(hContact); - MraSetContactStatus(hContact, ID_STATUS_ONLINE); - - CMStringW wszCustomName = Clist_GetContactDisplayName(hContact); - MraAddContact(hContact, (CONTACT_FLAG_VISIBLE | CONTACT_FLAG_MULTICHAT), -1, email, wszCustomName); - } - else { - if (db_get_b(hContact, "CList", "NotOnList", 0) == 0) { // set extra icons and upload contact - SetExtraIcons(hContact); - if (getByte("AutoAddContactsToServer", MRA_DEFAULT_AUTO_ADD_CONTACTS_TO_SERVER)) { //add all contacts to server - GetContactBasicInfoW(hContact, nullptr, &dwGroupID, nullptr, nullptr, nullptr, nullptr, &nick, &phones); - MraAddContact(hContact, (CONTACT_FLAG_VISIBLE | CONTACT_FLAG_UNICODE_NAME), dwGroupID, email, nick, &phones, &wszAuthMessage); - } - } - } - MraUpdateContactInfo(hContact); - } - } - } - setByte("GroupMode", 1); - } - else { // контакт лист почемуто не получили - // всех в offline и id в нестандарт - for (auto &hContact : AccContacts()) { - SetContactBasicInfoW(hContact, SCBIFSI_LOCK_CHANGES_EVENTS, (SCBIF_ID | SCBIF_GROUP_ID | SCBIF_SERVER_FLAG | SCBIF_STATUS), - -1, -2, 0, 0, ID_STATUS_OFFLINE, nullptr, nullptr, nullptr); - // request user info from server - MraUpdateContactInfo(hContact); - } - - if (dwTemp == GET_CONTACTS_ERROR) // найденный контакт-лист некорректен - ShowFormattedErrorMessage(L"MRIM_CS_CONTACT_LIST2: bad contact list", NO_ERROR); - else if (dwTemp == GET_CONTACTS_INTERR) // произошла внутренняя ошибка - ShowFormattedErrorMessage(L"MRIM_CS_CONTACT_LIST2: internal server error", NO_ERROR); - else { - wchar_t szBuff[1024]; - mir_snwprintf(szBuff, TranslateT("MRIM_CS_CONTACT_LIST2: unknown server error, code: %lu"), dwTemp); - MraPopupShowFromAgentW(MRA_POPUP_TYPE_DEBUG, szBuff); - } - } - return true; -} - -bool CMraProto::CmdProxy(BinBuffer &buf) -{ - DWORD dwIDRequest, dwAckType; - CMStringA szAddresses, szEmail, szString; - MRA_GUID mguidSessionID; - - buf >> szEmail >> dwIDRequest >> dwAckType >> szString >> szAddresses >> mguidSessionID; - if (dwAckType == MRIM_PROXY_TYPE_FILES) { // файлы, on file recv - // set proxy info to file transfer context - if (!MraMrimProxySetData(MraFilesQueueItemProxyByID(hFilesQueueHandle, dwIDRequest), szEmail, dwIDRequest, dwAckType, szString, szAddresses, &mguidSessionID)) - MraFilesQueueStartMrimProxy(hFilesQueueHandle, dwIDRequest); - else { // empty/invalid session - MraProxyAck(PROXY_STATUS_ERROR, szEmail, dwIDRequest, dwAckType, szString, szAddresses, mguidSessionID); - _CrtDbgBreak(); - } - } - return true; -} - -bool CMraProto::CmdProxyAck(BinBuffer &buf) -{ - DWORD dwIDRequest, dwTemp, dwAckType; - HANDLE hMraMrimProxyData; - CMStringA szAddresses, szEmail, szString; - MRA_GUID mguidSessionID; - buf >> dwTemp >> szEmail >> dwIDRequest >> dwAckType >> szString >> szAddresses >> mguidSessionID; - - if (dwAckType == MRIM_PROXY_TYPE_FILES) { // on file send - if ((hMraMrimProxyData = MraFilesQueueItemProxyByID(hFilesQueueHandle, dwIDRequest))) { - switch (dwTemp) { - case PROXY_STATUS_DECLINE: - MraFilesQueueCancel(hFilesQueueHandle, dwIDRequest, FALSE); - break; - case PROXY_STATUS_OK: - // set proxy info to file transfer context - if (!MraMrimProxySetData(hMraMrimProxyData, szEmail, dwIDRequest, dwAckType, szString, szAddresses, &mguidSessionID)) - MraFilesQueueStartMrimProxy(hFilesQueueHandle, dwIDRequest); - break; - case PROXY_STATUS_ERROR: - ShowFormattedErrorMessage(L"Proxy File transfer: error", NO_ERROR); - MraFilesQueueCancel(hFilesQueueHandle, dwIDRequest, FALSE); - break; - case PROXY_STATUS_INCOMPATIBLE_VERS: - ShowFormattedErrorMessage(L"Proxy File transfer: incompatible versions", NO_ERROR); - MraFilesQueueCancel(hFilesQueueHandle, dwIDRequest, FALSE); - break; - case PROXY_STATUS_NOHARDWARE: - case PROXY_STATUS_MIRROR: - case PROXY_STATUS_CLOSED: - default: - _CrtDbgBreak(); - break; - } - } - else _CrtDbgBreak(); - } - return true; -} - -bool CMraProto::CmdNewMail(BinBuffer &buf) -{ - DWORD dwDate, dwUIDL, dwUnreadCount; - CMStringA szEmail, szString; - buf >> dwUnreadCount >> szEmail >> szString >> dwDate >> dwUIDL; - - if (dwUnreadCount > dwEmailMessagesTotal) - dwEmailMessagesTotal += (dwUnreadCount - m_dwEmailMessagesUnread); - - DWORD dwSave = m_dwEmailMessagesUnread; - m_dwEmailMessagesUnread = dwUnreadCount;// store new value - if (getByte("IncrementalNewMailNotify", MRA_DEFAULT_INC_NEW_MAIL_NOTIFY) == 0 || dwSave < dwUnreadCount || dwUnreadCount == 0) - MraUpdateEmailStatus(szEmail, szString, false); - return true; -} - -bool CMraProto::CmdBlogStatus(BinBuffer &buf) -{ - DWORD dwTime, dwFlags; - CMStringA szEmail, szString; - CMStringW wszText; - DWORDLONG dwBlogStatusID; - - buf >> dwFlags >> szEmail >> dwBlogStatusID >> dwTime >> wszText >> szString; - - if (MCONTACT hContact = MraHContactFromEmail(szEmail, FALSE, TRUE, nullptr)) { - if (dwFlags & MRIM_BLOG_STATUS_MUSIC) - mraSetStringW(hContact, DBSETTING_BLOGSTATUSMUSIC, wszText); - else { - setDword(hContact, DBSETTING_BLOGSTATUSTIME, dwTime); - mraWriteContactSettingBlob(hContact, DBSETTING_BLOGSTATUSID, &dwBlogStatusID, sizeof(DWORDLONG)); - mraSetStringW(hContact, DBSETTING_BLOGSTATUS, wszText); - } - SetExtraIcons(hContact); - } - return true; -} - -bool CMraProto::MraCommandDispatcher(mrim_packet_header_t *pmaHeader) -{ - WCHAR szBuff[4096] = { 0 }; - DWORD dwTemp, dwAckType; - size_t dwSize; - MCONTACT hContact = NULL; - LPBYTE pByte; - - debugLogA("Received packet %x\n", pmaHeader->msg); - - BinBuffer buf((LPBYTE)pmaHeader + sizeof(mrim_packet_header_t), pmaHeader->dlen); - - switch (pmaHeader->msg) { - case MRIM_CS_HELLO_ACK: return CmdHelloAck(buf); - case MRIM_CS_LOGIN_ACK: return CmdLoginAck(); - case MRIM_CS_LOGIN_REJ: return CmdLoginRejected(buf); - case MRIM_CS_MESSAGE_ACK: return CmdMessageAck(buf); - case MRIM_CS_MESSAGE_STATUS: return CmdMessageStatus(pmaHeader->seq, buf); - case MRIM_CS_USER_INFO: return CmdUserInfo(buf); - case MRIM_CS_OFFLINE_MESSAGE_ACK: return CmdOfflineMessageAck(buf); - case MRIM_CS_AUTHORIZE_ACK: return CmdAuthAck(buf); - case MRIM_CS_MPOP_SESSION: return CmdPopSession(buf); - case MRIM_CS_FILE_TRANSFER: return CmdFileTransfer(buf); - case MRIM_CS_FILE_TRANSFER_ACK: return CmdFileTransferAck(buf); - case MRIM_CS_USER_STATUS: return CmdUserStatus(buf); - case MRIM_CS_ADD_CONTACT_ACK: - case MRIM_CS_MODIFY_CONTACT_ACK: return CmdContactAck(pmaHeader->msg, pmaHeader->seq, buf); - case MRIM_CS_ANKETA_INFO: return CmdAnketaInfo(pmaHeader->seq, buf); - case MRIM_CS_GAME: return CmdGame(buf); - case MRIM_CS_CONTACT_LIST2: return CmdClist2(buf); - case MRIM_CS_PROXY: return CmdProxy(buf); - case MRIM_CS_PROXY_ACK: return CmdProxyAck(buf); - case MRIM_CS_NEW_MAIL: return CmdNewMail(buf); - case MRIM_CS_USER_BLOG_STATUS: return CmdBlogStatus(buf); - - case MRIM_CS_CONNECTION_PARAMS:// Изменение параметров соединения - buf >> m_dwPingPeriod; - m_dwNextPingSendTickTime = 0; // force send ping - MraSendCMD(MRIM_CS_PING, nullptr, 0); - break; - - case MRIM_CS_LOGOUT:// Пользователь отключен из-за параллельного входа с его логином. - buf >> dwTemp; - if (dwTemp == LOGOUT_NO_RELOGIN_FLAG) - ShowFormattedErrorMessage(L"Another user connected with your login", NO_ERROR); - return false; - - case MRIM_CS_MAILBOX_STATUS: - buf >> dwTemp; - if (dwTemp > dwEmailMessagesTotal) - dwEmailMessagesTotal += (dwTemp - m_dwEmailMessagesUnread); - - dwAckType = m_dwEmailMessagesUnread;// save old value - m_dwEmailMessagesUnread = dwTemp;// store new value - if (getByte("IncrementalNewMailNotify", MRA_DEFAULT_INC_NEW_MAIL_NOTIFY) == 0 || dwAckType < dwTemp || dwTemp == 0) - MraUpdateEmailStatus("", "", false); - break; - - case MRIM_CS_SMS_ACK: - buf >> dwTemp; - if (MraSendQueueFind(hSendQueueHandle, pmaHeader->seq, nullptr, &hContact, &dwAckType, &pByte, &dwSize) == NO_ERROR) { - /* pByte point to phone number ansi string. */ - /* dwAckType = ICQACKTYPE_SMS */ - CMStringA szEmail; - if (mraGetStringA(NULL, "e-mail", szEmail)) { - mir_snprintf((LPSTR)szBuff, sizeof(szBuff), - "Mail.ruYesMail.ru, Russia%s-1-1955988055-%s%s0\r\n", - szEmail.c_str(), (LPSTR)pByte, (LPSTR)pByte); - ProtoBroadcastAck(NULL, ICQACKTYPE_SMS, ACKRESULT_SENTREQUEST, (HANDLE)pmaHeader->seq, (LPARAM)szBuff); - } - mir_free(pByte); - MraSendQueueFree(hSendQueueHandle, pmaHeader->seq); - } - else MraPopupShowFromAgentW(MRA_POPUP_TYPE_DEBUG, TranslateT("MRIM_CS_SMS_ACK: not found in queue")); - break; - - case MRIM_CS_PROXY_HELLO: - _CrtDbgBreak(); - break; - - case MRIM_CS_PROXY_HELLO_ACK: - _CrtDbgBreak(); - break; - - case MRIM_CS_UNKNOWN: - case MRIM_CS_UNKNOWN2: - case MRIM_CS_USER_GEO: - case MRIM_CS_SERVER_SETTINGS: - break; - - default: - debugLogA("Uknown packet type: %d", pmaHeader->msg); - break; - } - return true; -} - -// Сообщение -DWORD CMraProto::MraRecvCommand_Message(DWORD dwTime, DWORD dwFlags, CMStringA &plpsFrom, CMStringA &plpsText, CMStringA &plpsRFTText, CMStringA &plpsMultiChatData) -{ - DWORD dwBackColour; - CMStringA lpszMessageExt; - CMStringW wszMessage; - - PROTORECVEVENT pre = { 0 }; - pre.timestamp = dwTime; - - // check flags and datas - if ((dwFlags & MESSAGE_FLAG_RTF) && plpsRFTText.IsEmpty()) - dwFlags &= ~MESSAGE_FLAG_RTF; - - if ((dwFlags & MESSAGE_FLAG_MULTICHAT) && plpsMultiChatData.IsEmpty()) - dwFlags &= ~MESSAGE_FLAG_MULTICHAT; - - // pre processing - extracting/decoding - if (dwFlags & MESSAGE_FLAG_AUTHORIZE) { // extract auth message из обычного текста - size_t dwAuthDataSize; - LPBYTE lpbAuthData = (LPBYTE)mir_base64_decode(plpsText, &dwAuthDataSize); - if (lpbAuthData) { - BinBuffer buf(lpbAuthData, dwAuthDataSize); - - DWORD dwAuthPartsCount; - CMStringA lpsAuthFrom; - buf >> dwAuthPartsCount >> lpsAuthFrom; - if (dwFlags & MESSAGE_FLAG_v1p16 && (dwFlags & MESSAGE_FLAG_CP1251) == 0) { // unicode text - CMStringW lpsAuthMessageW; - buf >> lpsAuthMessageW; - wszMessage = lpsAuthMessageW; - } - else { // преобразуем в юникод текст только если он в АНСИ и если это не Флэш мультик и будильник тоже не нуждается в этом - CMStringA lpsAuthMessage; - buf >> lpsAuthMessage; - wszMessage = ptrW(mir_a2u_cp(lpsAuthMessage, MRA_CODE_PAGE)); - } - mir_free(lpbAuthData); - } - } - else { - // unicode text - if ((dwFlags & (MESSAGE_FLAG_ALARM | MESSAGE_FLAG_FLASH | MESSAGE_FLAG_v1p16)) && (dwFlags & MESSAGE_FLAG_CP1251) == 0) { - plpsText.AppendChar(0); // compensate difference between ASCIIZ & WCHARZ - wszMessage = (WCHAR*)plpsText.GetString(); - } - else wszMessage = plpsText; - - if (dwFlags & (MESSAGE_FLAG_CONTACT | MESSAGE_FLAG_NOTIFY | MESSAGE_FLAG_SMS | MESSAGE_SMS_DELIVERY_REPORT | MESSAGE_FLAG_ALARM)) - ; // do nothing; there's no extra part in a message - else { - if ((dwFlags & MESSAGE_FLAG_RTF) && !plpsRFTText.IsEmpty()) { //MESSAGE_FLAG_FLASH there - size_t dwRFTBuffSize = ((plpsRFTText.GetLength() * 16) + 8192); - - mir_ptr lpbRTFData((LPBYTE)mir_calloc(dwRFTBuffSize)); - if (lpbRTFData) { - size_t dwCompressedSize; - mir_ptr lpbCompressed((LPBYTE)mir_base64_decode(plpsRFTText, &dwCompressedSize)); - DWORD dwRTFDataSize = (DWORD)dwRFTBuffSize; - if (uncompress(lpbRTFData, &dwRTFDataSize, lpbCompressed, (uLong)dwCompressedSize) == Z_OK) { - BinBuffer buf(lpbRTFData, dwRTFDataSize); - - CMStringA lpsRTFString, lpsBackColour, szString; - DWORD dwRTFPartsCount; - - // количество частей в некоторых случаях больше 2, тогда нужно игнорировать первый текст, тк там сообщения об ущербности - buf >> dwRTFPartsCount >> lpsRTFString >> dwBackColour; - if (dwFlags & MESSAGE_FLAG_FLASH) { - if (dwRTFPartsCount == 4) { - buf >> szString; - dwRTFPartsCount--; - } - if (dwRTFPartsCount == 3) { // ansi text only - buf >> szString; - wszMessage = ptrW(mir_a2u_cp(szString, MRA_CODE_PAGE)); - } - else _CrtDbgBreak(); - } - else { // RTF text - if (dwRTFPartsCount > 2) { - buf >> szString; - _CrtDbgBreak(); - } - - lpszMessageExt = lpsRTFString; - } - } - else _CrtDbgBreak(); - } - } - } - } - - debugLogA("Processing message: %08X, from '%s', text '%S'\n", dwFlags, plpsFrom.c_str(), wszMessage.c_str()); - - // processing - if (dwFlags & (MESSAGE_FLAG_SMS | MESSAGE_SMS_DELIVERY_REPORT)) { // SMS - INTERNET_TIME itTime; - InternetTimeGetCurrentTime(&itTime); - CMStringA szTime = InternetTimeGetString(&itTime); - CMStringA szPhone = CopyNumber(plpsFrom), szEmail; - if (!mraGetStringA(NULL, "e-mail", szEmail)) - return 0; - - CMStringW wszMessageXMLEncoded = EncodeXML(wszMessage); - ptrA lpszMessageUTF(mir_utf8encodeW(wszMessageXMLEncoded)); - - CMStringA szText; - if (dwFlags & MESSAGE_SMS_DELIVERY_REPORT) { - szText.Format("%s-1-1955988055-%s%sNo%s015%s", - szEmail.c_str(), szPhone.c_str(), szPhone.c_str(), szTime.c_str(), lpszMessageUTF); - ProtoBroadcastAck(NULL, ICQACKTYPE_SMS, ACKRESULT_FAILED, nullptr, (LPARAM)szText.GetString()); - } - else { // new sms - szText.Format("Mail.ru%s%sMail.ru%s", - szEmail.c_str(), szPhone.c_str(), lpszMessageUTF, szTime.c_str()); - ProtoBroadcastAck(NULL, ICQACKTYPE_SMS, ACKRESULT_SUCCESS, nullptr, (LPARAM)szText.GetString()); - } - } - else { - BOOL bAdded; - MCONTACT hContact = MraHContactFromEmail(plpsFrom, TRUE, TRUE, &bAdded); - if (bAdded) - MraUpdateContactInfo(hContact); - - // user typing - if (dwFlags & MESSAGE_FLAG_NOTIFY) - CallService(MS_PROTO_CONTACTISTYPING, hContact, MAILRU_CONTACTISTYPING_TIMEOUT); - else { // text/contact/auth // typing OFF - CallService(MS_PROTO_CONTACTISTYPING, hContact, PROTOTYPE_CONTACTTYPING_OFF); - - if (dwFlags & MESSAGE_FLAG_MULTICHAT) { - DWORD dwMultiChatEventType; - CMStringA lpsEMailInMultiChat, szString; - CMStringW lpsMultichatName; - - BinBuffer buf((PBYTE)plpsMultiChatData.GetString(), plpsMultiChatData.GetLength()); - buf >> dwMultiChatEventType >> lpsMultichatName >> lpsEMailInMultiChat; - - switch (dwMultiChatEventType) { - case MULTICHAT_MESSAGE: - MraChatSessionMessageAdd(hContact, lpsEMailInMultiChat, wszMessage, dwTime);// LPS sender - break; - case MULTICHAT_ADD_MEMBERS: - MraChatSessionMembersAdd(hContact, lpsEMailInMultiChat, dwTime);// LPS sender - buf >> szString;// CLPS members - MraChatSessionSetIviter(hContact, lpsEMailInMultiChat); - case MULTICHAT_MEMBERS: - { - DWORD dwMultiChatMembersCount; - BinBuffer binBuf((PBYTE)lpsEMailInMultiChat.GetString(), lpsEMailInMultiChat.GetLength()); - binBuf >> dwMultiChatMembersCount;// count - for (unsigned i = 0; i < dwMultiChatMembersCount && !binBuf.eof(); i++) { - binBuf >> szString; - MraChatSessionJoinUser(hContact, szString, ((dwMultiChatEventType == MULTICHAT_MEMBERS) ? 0 : dwTime)); - } - - if (dwMultiChatEventType == MULTICHAT_MEMBERS) { - binBuf >> szString; // [ LPS owner ] - MraChatSessionSetOwner(hContact, szString); - } - } - break; - case MULTICHAT_ATTACHED: - MraChatSessionJoinUser(hContact, lpsEMailInMultiChat, dwTime);// LPS member - break; - case MULTICHAT_DETACHED: - MraChatSessionLeftUser(hContact, lpsEMailInMultiChat, dwTime);// LPS member - break; - case MULTICHAT_INVITE: - MraChatSessionInvite(hContact, lpsEMailInMultiChat, dwTime);// LPS sender - MraAddContact(hContact, (CONTACT_FLAG_VISIBLE | CONTACT_FLAG_MULTICHAT | CONTACT_FLAG_UNICODE_NAME), -1, plpsFrom, lpsMultichatName); - break; - default: - _CrtDbgBreak(); - break; - } - } - else if (dwFlags & MESSAGE_FLAG_AUTHORIZE) { // auth request - BOOL bAutoGrantAuth = FALSE; - - if (IsEMailChatAgent(plpsFrom)) - bAutoGrantAuth = FALSE; - else { - // temporary contact - if (db_get_b(hContact, "CList", "NotOnList", 0)) { - if (getByte("AutoAuthGrandNewUsers", MRA_DEFAULT_AUTO_AUTH_GRAND_NEW_USERS)) - bAutoGrantAuth = TRUE; - } - else if (getByte("AutoAuthGrandUsersInCList", MRA_DEFAULT_AUTO_AUTH_GRAND_IN_CLIST)) - bAutoGrantAuth = TRUE; - } - - CMStringA szBlob = CreateBlobFromContact(hContact, wszMessage); - if (bAutoGrantAuth) { // auto grant auth - DBEVENTINFO dbei = {}; - dbei.szModule = m_szModuleName; - dbei.timestamp = _time32(nullptr); - dbei.flags = DBEF_READ | DBEF_UTF; - dbei.eventType = EVENTTYPE_AUTHREQUEST; - dbei.pBlob = (PBYTE)szBlob.c_str(); - dbei.cbBlob = szBlob.GetLength(); - db_event_add(0, &dbei); - MraAuthorize(plpsFrom); - } - else { - pre.szMessage = (LPSTR)szBlob.GetString(); - pre.lParam = szBlob.GetLength(); - ProtoChainRecv(hContact, PSR_AUTH, 0, (LPARAM)&pre); - } - } - else { - db_unset(hContact, "CList", "Hidden"); - - if (dwFlags & MESSAGE_FLAG_CONTACT) { // contacts received - ptrA lpbBuffer(mir_u2a_cp(wszMessage, MRA_CODE_PAGE)); - pre.flags = 0; - pre.szMessage = (LPSTR)lpbBuffer; - pre.lParam = mir_strlen(lpbBuffer); - - LPSTR lpbBufferCurPos = lpbBuffer; - while (TRUE) { // цикл замены ; на 0 - lpbBufferCurPos = (LPSTR)MemoryFindByte((lpbBufferCurPos - (LPSTR)lpbBuffer), lpbBuffer, pre.lParam, ';'); - if (!lpbBufferCurPos) - break; - - // found - (*lpbBufferCurPos) = 0; - lpbBufferCurPos ++; - } - ProtoChainRecv(hContact, PSR_CONTACTS, 0, (LPARAM)&pre); - } - else if (dwFlags & MESSAGE_FLAG_ALARM) { // alarm - if (m_heNudgeReceived) - NotifyEventHooks(m_heNudgeReceived, hContact, NULL); - else { - T2Utf szMsg(TranslateW(MRA_ALARM_MESSAGE)); - pre.szMessage = szMsg; - ProtoChainRecvMsg(hContact, &pre); - } - } - else { // standart message// flash animation - // пишем в ANSI, всё равно RTF - if ((dwFlags & MESSAGE_FLAG_RTF) && (dwFlags & MESSAGE_FLAG_FLASH) == 0 && !lpszMessageExt.IsEmpty() && getByte("RTFReceiveEnable", MRA_DEFAULT_RTF_RECEIVE_ENABLE)) { - pre.flags = 0; - pre.szMessage = (LPSTR)lpszMessageExt.GetString(); - ProtoChainRecvMsg(hContact, &pre); - } - else { - // some plugins can change pre.szMessage pointer and we failed to free it - ptrA lpszMessageUTF(mir_utf8encodeW(wszMessage)); - pre.szMessage = lpszMessageUTF; - ProtoChainRecvMsg(hContact, &pre); - } - - if (dwFlags & MESSAGE_FLAG_SYSTEM) - MraPopupShowW(hContact, MRA_POPUP_TYPE_INFORMATION, TranslateT("Mail.ru System notify"), (LPWSTR)pre.szMessage); - } - } - } - } - - return NO_ERROR; -} - -DWORD GetMraXStatusIDFromMraUriStatus(const char *szStatusUri) -{ - if (szStatusUri) - for (DWORD i = 0; lpcszStatusUri[i]; i++) - if (!_stricmp(lpcszStatusUri[i], szStatusUri)) - return i; - - return MRA_XSTATUS_UNKNOWN; -} - -DWORD GetMraStatusFromMiradaStatus(DWORD dwMirandaStatus, DWORD dwXStatusMir, DWORD *pdwXStatusMra) -{ - if (IsXStatusValid(dwXStatusMir)) { - if (pdwXStatusMra) - *pdwXStatusMra = (dwXStatusMir + MRA_XSTATUS_INDEX_OFFSET - 1); - return STATUS_USER_DEFINED; - } - - switch (dwMirandaStatus) { - case ID_STATUS_OFFLINE: - if (pdwXStatusMra) *pdwXStatusMra = MRA_XSTATUS_OFFLINE; - return STATUS_OFFLINE; - - case ID_STATUS_ONLINE: - if (pdwXStatusMra) *pdwXStatusMra = MRA_XSTATUS_ONLINE; - return STATUS_ONLINE; - - case ID_STATUS_AWAY: - case ID_STATUS_NA: - case ID_STATUS_ONTHEPHONE: - case ID_STATUS_OUTTOLUNCH: - if (pdwXStatusMra) *pdwXStatusMra = MRA_XSTATUS_AWAY; - return STATUS_AWAY; - - case ID_STATUS_DND: - case ID_STATUS_OCCUPIED: - if (pdwXStatusMra) *pdwXStatusMra = MRA_XSTATUS_DND; - return STATUS_USER_DEFINED; - - case ID_STATUS_FREECHAT: - if (pdwXStatusMra) *pdwXStatusMra = MRA_XSTATUS_CHAT; - return STATUS_USER_DEFINED; - - case ID_STATUS_INVISIBLE: - if (pdwXStatusMra) *pdwXStatusMra = MRA_XSTATUS_INVISIBLE; - return (STATUS_ONLINE | STATUS_FLAG_INVISIBLE); - } - - if (pdwXStatusMra) *pdwXStatusMra = MRA_XSTATUS_OFFLINE; - return STATUS_OFFLINE; -} - -DWORD GetMirandaStatusFromMraStatus(DWORD dwMraStatus, DWORD dwXStatusMra, DWORD *pdwXStatusMir) -{ - if (pdwXStatusMir) *pdwXStatusMir = 0; - - switch (dwMraStatus) { - case STATUS_OFFLINE: return ID_STATUS_OFFLINE; - case STATUS_ONLINE: return ID_STATUS_ONLINE; - case STATUS_AWAY: return ID_STATUS_AWAY; - case STATUS_UNDETERMINATED: return ID_STATUS_OFFLINE; - case STATUS_USER_DEFINED: - switch (dwXStatusMra) { - case MRA_XSTATUS_DND: return ID_STATUS_DND; - case MRA_XSTATUS_CHAT: return ID_STATUS_FREECHAT; - case MRA_XSTATUS_MOBILE: return ID_STATUS_ONTHEPHONE; - case MRA_XSTATUS_UNKNOWN: - if (pdwXStatusMir) *pdwXStatusMir = MRA_MIR_XSTATUS_UNKNOWN; - return ID_STATUS_ONLINE; - } - if (pdwXStatusMir) *pdwXStatusMir = dwXStatusMra - MRA_XSTATUS_INDEX_OFFSET + 1; - return ID_STATUS_ONLINE; - default: - if (dwMraStatus & STATUS_FLAG_INVISIBLE) - return ID_STATUS_INVISIBLE; - } - - return ID_STATUS_OFFLINE; -} - -///////////////////////////////////////////////////////////////////////////////////////////////// - -DWORD BinBuffer::getDword() -{ - if (m_len >= sizeof(DWORD)) { - DWORD ret = *(DWORD*)m_data; - m_data += sizeof(DWORD); - m_len -= sizeof(DWORD); - return ret; - } - return 0; -} - -DWORDLONG BinBuffer::getInt64() -{ - if (m_len >= sizeof(DWORDLONG)) { - DWORDLONG ret = *(DWORDLONG*)m_data; - m_data += sizeof(DWORDLONG); - m_len -= sizeof(DWORDLONG); - return ret; - } - return 0; -} - -MRA_GUID BinBuffer::getGuid() -{ - MRA_GUID ret; - if (m_len >= sizeof(MRA_GUID)) { - ret = *(MRA_GUID*)m_data; - m_data += sizeof(MRA_GUID); - m_len -= sizeof(MRA_GUID); - return ret; - } - else memset(&ret, 0, sizeof(ret)); - return ret; -} - -void BinBuffer::getStringA(CMStringA& ret) -{ - if (m_len >= sizeof(DWORD)) { - DWORD dwLen = *(DWORD*)m_data; - m_data += sizeof(DWORD); - m_len -= sizeof(DWORD); - if (m_len >= dwLen) { - ret = CMStringA((LPSTR)m_data, dwLen); - m_data += dwLen; - m_len -= dwLen; - return; - } - } - ret.Empty(); -} - -void BinBuffer::getStringW(CMStringW& ret) -{ - if (m_len >= sizeof(DWORD)) { - DWORD dwLen = *(DWORD*)m_data; - m_data += sizeof(DWORD); - m_len -= sizeof(DWORD); - if (m_len >= dwLen) { - ret = CMStringW((LPWSTR)m_data, dwLen / 2); - m_data += dwLen; - m_len -= dwLen; - return; - } - } - ret.Empty(); -} diff --git a/protocols/MRA/src/Mra_svcs.cpp b/protocols/MRA/src/Mra_svcs.cpp deleted file mode 100644 index dc40f9f915..0000000000 --- a/protocols/MRA/src/Mra_svcs.cpp +++ /dev/null @@ -1,667 +0,0 @@ -#include "stdafx.h" -#include "proto.h" - -LPCSTR lpcszStatusUri[] = -{ - "", // offline // "status_0", - "STATUS_ONLINE", // "status_1", - "STATUS_AWAY", // "status_2", - "STATUS_INVISIBLE", // "status_3", - "status_dnd", - "status_chat", - "status_mobile", - "status_4", // first xstatus - "status_5", - "status_6", - "status_7", // 10 - "status_8", - "status_9", - "status_10", - "status_11", - "status_12", - "status_13", - "status_14", - "status_15", - "status_16", - "status_17", // 20 - "status_18", - "status_19", - "status_20", - "status_21", - "status_22", - "status_23", - "status_24", - //"status_25", // chat/dnd - "status_26", - "status_27", - "status_28", // 30 - "status_29", - "status_30", - //"status_31", // chat/dnd - "status_32", - "status_33", - "status_34", - "status_35", - "status_36", - "status_37", - "status_38", - "status_39", // 40 - "status_40", - "status_41", - "status_42", - "status_43", - "status_44", - "status_45", - "status_46", - "status_47", - "status_48", - "status_49", // 50 - "status_50", - "status_51", - "status_52", - "status_53", - "status_dating", - nullptr -}; - -LPCWSTR lpcszXStatusNameDef[] = -{ - LPGENW("None"), - LPGENW("Sick"), - LPGENW("Home"), - LPGENW("Eating"), - LPGENW("Compass"), - LPGENW("On WC"), - LPGENW("Cooking"), - LPGENW("Walking"), - LPGENW("Alien"), - LPGENW("Shrimp"), - LPGENW("Got lost"), - LPGENW("Crazy"), - LPGENW("Duck"), - LPGENW("Playing"), - LPGENW("Smoking"), - LPGENW("Office"), - LPGENW("Meeting"), - LPGENW("Beer"), - LPGENW("Coffee"), - LPGENW("Working"), - LPGENW("Relaxing"), - LPGENW("On the phone"), - LPGENW("In institute"), - LPGENW("At school"), - LPGENW("Wrong number"), - LPGENW("Laughing"), - LPGENW("Malicious"), - LPGENW("Imp"), - LPGENW("Blind"), - LPGENW("Disappointed"), - LPGENW("Almost crying"), - LPGENW("Fearful"), - LPGENW("Angry"), - LPGENW("Vampire"), - LPGENW("Ass"), - LPGENW("Love"), - LPGENW("Sleeping"), - LPGENW("Cool!"), - LPGENW("Peace!"), - LPGENW("Cock a snook"), - LPGENW("Get out"), - LPGENW("Death"), - LPGENW("Rocket"), - LPGENW("Devil-fish"), - LPGENW("Heavy metal"), - LPGENW("Things look bad"), - LPGENW("Squirrel"), - LPGENW("Star"), - LPGENW("Music"), - LPGENW("Dating"), - nullptr -}; - -////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void CMraProto::SetExtraIcons(MCONTACT hContact) -{ - DWORD dwID, dwGroupID, dwContactSeverFlags; - if (GetContactBasicInfoW(hContact, &dwID, &dwGroupID, nullptr, &dwContactSeverFlags, nullptr, nullptr, nullptr, nullptr)) - return; - - DWORD dwIconID = -1; - DWORD dwXStatus = MRA_MIR_XSTATUS_NONE; - - if (m_bLoggedIn) { - dwXStatus = getByte(hContact, DBSETTING_XSTATUSID, MRA_MIR_XSTATUS_NONE); - if (dwID == -1) - dwIconID = (dwContactSeverFlags == -1) ? ADV_ICON_DELETED : ADV_ICON_NOT_ON_SERVER; - else { - if (dwGroupID == 103) - dwIconID = ADV_ICON_PHONE; - else { - if (dwContactSeverFlags) - if (dwContactSeverFlags == -1) - dwIconID = ADV_ICON_DELETED; - else - dwIconID = ADV_ICON_NOT_AUTHORIZED; - } - } - } - - if (dwIconID == -1) { - CMStringW statusMsg; - mraGetStringW(hContact, DBSETTING_BLOGSTATUS, statusMsg); - if (statusMsg.GetLength()) - dwIconID = ADV_ICON_BLOGSTATUS; - } - - ExtraIcon_SetIcon(hExtraXstatusIcon, hContact, - (IsXStatusValid(dwXStatus) || dwXStatus == MRA_MIR_XSTATUS_UNKNOWN) ? hXStatusAdvancedStatusIcons[dwXStatus] : nullptr); - ExtraIcon_SetIcon(hExtraInfo, hContact, (dwIconID != -1) ? gdiExtraStatusIconsItems[dwIconID].hIcolib : nullptr); -} - -INT_PTR CMraProto::MraXStatusMenu(WPARAM, LPARAM, LPARAM param) -{ - if (MraRequestXStatusDetails(param) == FALSE) - MraSetXStatusInternal(param); - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -int CMraProto::MraContactDeleted(WPARAM hContact, LPARAM) -{ - if (!m_bLoggedIn || !hContact) - return 0; - - if (IsContactMra(hContact)) { - DWORD dwID, dwGroupID; - GetContactBasicInfoW(hContact, &dwID, &dwGroupID, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr); - - MraSetContactStatus(hContact, ID_STATUS_OFFLINE); - if (!db_get_b(hContact, "CList", "NotOnList", 0) || dwID != -1) { - DWORD dwFlags = CONTACT_FLAG_REMOVED; - MraModifyContact(hContact, &dwID, &dwFlags); - } - MraAvatarsDeleteContactAvatarFile(hAvatarsQueueHandle, hContact); - } - return 0; -} - -int CMraProto::MraDbSettingChanged(WPARAM hContact, LPARAM lParam) -{ - if (!m_bLoggedIn || !lParam || !hContact) - return 0; - - DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING*)lParam; - - // это наш контакт, он не временный (есть в списке на сервере) и его обновление разрешено - if (IsContactMra(hContact) && !db_get_b(hContact, "CList", "NotOnList", 0) && getDword(hContact, "HooksLocked", FALSE) == FALSE) { - if (!strcmp(cws->szModule, "CList")) { - // MyHandle setting - if (!strcmp(cws->szSetting, "MyHandle")) { - // always store custom nick - CMStringW wszNick; - if (cws->value.type == DBVT_DELETED) { - wszNick = Clist_GetContactDisplayName(hContact); - db_set_ws(hContact, "CList", "MyHandle", wszNick); - } - else if (cws->value.pszVal) { - switch (cws->value.type) { - case DBVT_WCHAR: - wszNick = cws->value.pwszVal; - break; - case DBVT_UTF8: - wszNick = ptrW(mir_utf8decodeW(cws->value.pszVal)); - break; - case DBVT_ASCIIZ: - wszNick = ptrW(mir_a2u_cp(cws->value.pszVal, MRA_CODE_PAGE)); - break; - } - if (wszNick.GetLength()) - MraModifyContact(hContact, nullptr, nullptr, nullptr, nullptr, &wszNick); - } - } - // Group setting - else if (!strcmp(cws->szSetting, "Group")) { - CMStringW wszGroup; - // manage group on server - switch (cws->value.type) { - case DBVT_WCHAR: - wszGroup = cws->value.pwszVal; - break; - case DBVT_UTF8: - wszGroup = ptrW(mir_utf8decodeW(cws->value.pszVal)); - break; - case DBVT_ASCIIZ: - wszGroup = ptrW(mir_a2u_cp(cws->value.pszVal, MRA_CODE_PAGE)); - break; - } - if (wszGroup.GetLength()) { - DWORD dwGroupID = getDword(hContact, "GroupID", -1); - if (dwGroupID != -1) - MraMoveContactToGroup(hContact, dwGroupID, wszGroup); - } - } - // NotOnList setting. Has a temporary contact just been added permanently? - else if (!strcmp(cws->szSetting, "NotOnList")) { - if (cws->value.type == DBVT_DELETED || (cws->value.type == DBVT_BYTE && cws->value.bVal == 0)) { - CMStringW wszAuthMessage; - if (!mraGetStringW(NULL, "AuthMessage", wszAuthMessage)) - wszAuthMessage = TranslateW(MRA_DEFAULT_AUTH_MESSAGE); - - db_unset(hContact, "CList", "Hidden"); - - CMStringA szEmail, szPhones; - CMStringW wszNick; - DWORD dwGroupID, dwContactFlag; - GetContactBasicInfoW(hContact, nullptr, &dwGroupID, &dwContactFlag, nullptr, nullptr, &szEmail, &wszNick, &szPhones); - MraAddContact(hContact, dwContactFlag, dwGroupID, szEmail, wszNick, &szPhones, &wszAuthMessage); - } - } - // Hidden setting - else if (!strcmp(cws->szSetting, "Hidden")) { - DWORD dwContactFlag = GetContactFlags(hContact); - if (cws->value.type == DBVT_DELETED || (cws->value.type == DBVT_BYTE && cws->value.bVal == 0)) - dwContactFlag &= ~CONTACT_FLAG_SHADOW; - else - dwContactFlag |= CONTACT_FLAG_SHADOW; - - MraModifyContact(hContact, nullptr, &dwContactFlag); - } - } - // Ignore section - else if (!strcmp(cws->szModule, "Ignore")) { - if (!strcmp(cws->szSetting, "Mask1")) { - DWORD dwContactFlag = GetContactFlags(hContact); - 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; - - MraModifyContact(hContact, nullptr, &dwContactFlag); - } - } - // User info section - else if (!strcmp(cws->szModule, "UserInfo")) { - if (!strcmp(cws->szSetting, "MyPhone0") || !strcmp(cws->szSetting, "MyPhone1") || !strcmp(cws->szSetting, "MyPhone2")) - MraModifyContact(hContact); - } - } - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// -// Extra icons - -int CMraProto::MraExtraIconsApply(WPARAM wParam, LPARAM) -{ - SetExtraIcons(wParam); - return 0; -} - -INT_PTR CMraProto::MraSetListeningTo(WPARAM, LPARAM lParam) -{ - LISTENINGTOINFO *pliInfo = (LISTENINGTOINFO*)lParam; - - if (pliInfo == nullptr || pliInfo->cbSize != sizeof(LISTENINGTOINFO)) { - MraChangeUserBlogStatus(MRIM_BLOG_STATUS_MUSIC, L"", 0); - delSetting(DBSETTING_BLOGSTATUSMUSIC); - } - else if (pliInfo->dwFlags & LTI_UNICODE) { - CMStringW wszListeningTo; - if (ServiceExists(MS_LISTENINGTO_GETPARSEDTEXT)) - wszListeningTo = ptrW((LPWSTR)CallService(MS_LISTENINGTO_GETPARSEDTEXT, (WPARAM)L"%track%. %title% - %artist% - %player%", (LPARAM)pliInfo)); - else - wszListeningTo.Format(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""); - - mraSetStringExW(NULL, DBSETTING_BLOGSTATUSMUSIC, wszListeningTo); - MraChangeUserBlogStatus(MRIM_BLOG_STATUS_MUSIC, wszListeningTo, 0); - } - - return 0; -} - -int CMraProto::MraMusicChanged(WPARAM wParam, LPARAM lParam) -{ - switch (wParam) { - case WAT_EVENT_PLAYERSTATUS: - // stopped - if (1 == lParam) { - delSetting(DBSETTING_BLOGSTATUSMUSIC); - MraChangeUserBlogStatus(MRIM_BLOG_STATUS_MUSIC, L"", 0); - } - break; - - case WAT_EVENT_NEWTRACK: - SONGINFO *psiSongInfo; - if (WAT_RES_OK == CallService(MS_WAT_GETMUSICINFO, WAT_INF_UNICODE, (LPARAM)&psiSongInfo)) { - CMStringW wszMusic; - wszMusic.Format(L"%ld. %s - %s - %s", psiSongInfo->track, psiSongInfo->artist, psiSongInfo->title, psiSongInfo->player); - mraSetStringExW(NULL, DBSETTING_BLOGSTATUSMUSIC, wszMusic); - MraChangeUserBlogStatus(MRIM_BLOG_STATUS_MUSIC, wszMusic, 0); - } - break; - } - - return 0; -} - -DWORD CMraProto::MraSetXStatusInternal(DWORD dwXStatus) -{ - if (IsXStatusValid(dwXStatus)) { - CMStringW szBuff; - - // obsolete (TODO: remove in next version) - char szValueName[MAX_PATH]; - mir_snprintf(szValueName, "XStatus%ldName", dwXStatus); - if (!mraGetStringW(NULL, szValueName, szBuff)) - szBuff = lpcszXStatusNameDef[dwXStatus]; - mraSetStringExW(NULL, DBSETTING_XSTATUSNAME, szBuff); - - // obsolete (TODO: remove in next version) - mir_snprintf(szValueName, "XStatus%ldMsg", dwXStatus); - if (mraGetStringW(NULL, szValueName, szBuff)) - mraSetStringExW(NULL, DBSETTING_XSTATUSMSG, szBuff); - else - delSetting(DBSETTING_XSTATUSMSG); - } - else { - delSetting(DBSETTING_XSTATUSNAME); - delSetting(DBSETTING_XSTATUSMSG); - dwXStatus = MRA_MIR_XSTATUS_NONE; - } - - DWORD dwOldStatusMode = InterlockedExchange((volatile LONG*)&m_iXStatus, dwXStatus); - setByte(DBSETTING_XSTATUSID, (BYTE)dwXStatus); - - MraSendNewStatus(m_iStatus, dwXStatus, L"", L""); - - return dwOldStatusMode; -} - -INT_PTR CMraProto::MraSetXStatusEx(WPARAM, LPARAM lParam) -{ - INT_PTR iRet = 1; - DWORD dwXStatus; - CUSTOM_STATUS *pData = (CUSTOM_STATUS*)lParam; - - if (pData->cbSize >= sizeof(CUSTOM_STATUS)) { - iRet = 0; - - if (pData->flags & CSSF_MASK_STATUS) { - dwXStatus = *pData->status; - if (IsXStatusValid(dwXStatus) == FALSE && dwXStatus != MRA_MIR_XSTATUS_NONE) - iRet = 1; - } - else dwXStatus = m_iXStatus; - - if (pData->flags & (CSSF_MASK_NAME | CSSF_MASK_MESSAGE) && iRet == 0) { - if (IsXStatusValid(dwXStatus) || dwXStatus == MRA_MIR_XSTATUS_NONE) { - CHAR szValueName[MAX_PATH]; - - // set custom status name - if (pData->flags & CSSF_MASK_NAME) { - mir_snprintf(szValueName, "XStatus%ldName", dwXStatus); - if (pData->flags & CSSF_UNICODE) { - mraSetStringExW(NULL, szValueName, pData->pwszName); - mraSetStringExW(NULL, DBSETTING_XSTATUSNAME, pData->pwszName); - } - else { - mraSetStringExA(NULL, szValueName, pData->pszName); - mraSetStringExA(NULL, DBSETTING_XSTATUSNAME, pData->pszName); - } - } - - // set custom status message - if (pData->flags & CSSF_MASK_MESSAGE) { - mir_snprintf(szValueName, "XStatus%ldMsg", dwXStatus); - if (pData->flags & CSSF_UNICODE) { - mraSetStringExW(NULL, szValueName, pData->pwszMessage); - mraSetStringExW(NULL, DBSETTING_XSTATUSMSG, pData->pwszMessage); - } - else { - mraSetStringExA(NULL, szValueName, pData->pszMessage); - mraSetStringExA(NULL, DBSETTING_XSTATUSMSG, pData->pszMessage); - } - } - } - // неудача только если мы не ставили Хстатус и попытались записать сообщения для "нет" статуса - else if (!(pData->flags & CSSF_MASK_STATUS)) - iRet = 1; - } - - // set/update xstatus code and/or message - if (pData->flags & (CSSF_MASK_STATUS | CSSF_MASK_NAME | CSSF_MASK_MESSAGE) && iRet == 0) - MraSetXStatusInternal(dwXStatus); - - // hide menu items - if (pData->flags & CSSF_DISABLE_UI) { - m_bHideXStatusUI = (*pData->wParam) ? false : true; - DWORD dwCount = MRA_XSTATUS_OFF_CLI_COUNT; - if (getByte(NULL, "xStatusShowAll", MRA_DEFAULT_SHOW_ALL_XSTATUSES)) - dwCount = MRA_XSTATUS_COUNT; - for (DWORD i = 0; i < dwCount; i++) - Menu_ShowItem(hXStatusMenuItems[i], !m_bHideXStatusUI); - } - } - return iRet; -} - -INT_PTR CMraProto::MraGetXStatusEx(WPARAM hContact, LPARAM lParam) -{ - CUSTOM_STATUS *pData = (CUSTOM_STATUS*)lParam; - - if (pData->cbSize < sizeof(CUSTOM_STATUS)) - return 1; - - // fill status member - if (pData->flags & CSSF_MASK_STATUS) - *pData->status = m_iXStatus; - - // fill status name member - if (pData->flags & CSSF_MASK_NAME) { - if (pData->flags & CSSF_DEFAULT_NAME) { - DWORD dwXStatus = (pData->wParam == nullptr) ? m_iXStatus : *pData->wParam; - if (!IsXStatusValid(dwXStatus)) - return 1; - - if (pData->flags & CSSF_UNICODE) - mir_wstrncpy(pData->ptszName, lpcszXStatusNameDef[dwXStatus], (STATUS_TITLE_MAX + 1)); - else { - size_t dwStatusTitleSize = mir_wstrlen(lpcszXStatusNameDef[dwXStatus]); - if (dwStatusTitleSize > STATUS_TITLE_MAX) - dwStatusTitleSize = STATUS_TITLE_MAX; - - WideCharToMultiByte(MRA_CODE_PAGE, 0, lpcszXStatusNameDef[dwXStatus], (DWORD)dwStatusTitleSize, pData->pszName, MAX_PATH, nullptr, nullptr); - (*((CHAR*)(pData->pszName + dwStatusTitleSize))) = 0; - } - } - else { - if (pData->flags & CSSF_UNICODE) - mraGetStaticStringW(hContact, DBSETTING_XSTATUSNAME, pData->pwszName, (STATUS_TITLE_MAX + 1), nullptr); - else - mraGetStaticStringA(hContact, DBSETTING_XSTATUSNAME, pData->pszName, (STATUS_TITLE_MAX + 1), nullptr); - } - } - - // fill status message member - if (pData->flags & CSSF_MASK_MESSAGE) { - char szSetting[100]; - mir_snprintf(szSetting, "XStatus%dMsg", m_iXStatus); - if (pData->flags & CSSF_UNICODE) - mraGetStaticStringW(hContact, szSetting, pData->pwszMessage, (STATUS_DESC_MAX + 1), nullptr); - else - mraGetStaticStringA(hContact, szSetting, pData->pszMessage, (STATUS_DESC_MAX + 1), nullptr); - } - - if ((pData->flags & CSSF_DISABLE_UI) && pData->wParam) - *pData->wParam = m_bHideXStatusUI; - - if ((pData->flags & CSSF_STATUSES_COUNT) && pData->wParam) - *pData->wParam = MRA_XSTATUS_COUNT - 1; - - //**deb можно оптимизировать, данный параметр возможно уже был вычислен при получении самих текстов - if (pData->flags & CSSF_STR_SIZES) { - if (pData->wParam) mraGetStaticStringW(hContact, DBSETTING_XSTATUSNAME, nullptr, 0, (size_t*)pData->wParam); - if (pData->lParam) mraGetStaticStringW(hContact, DBSETTING_XSTATUSMSG, nullptr, 0, (size_t*)pData->lParam); - } - return 0; -} - -INT_PTR CMraProto::MraGetXStatusIcon(WPARAM wParam, LPARAM lParam) -{ - if (wParam == 0) - wParam = m_iXStatus; - if ( !IsXStatusValid(wParam)) - return 0; - - return (INT_PTR)IconLibGetIconEx(hXStatusAdvancedStatusIcons[wParam], lParam); -} - -DWORD CMraProto::MraSendNewStatus(DWORD dwStatusMir, DWORD dwXStatusMir, const CMStringW &pwszStatusTitle, const CMStringW &pwszStatusDesc) -{ - if (!m_bLoggedIn) - return 0; - - CMStringW wszStatusTitle, wszStatusDesc; - DWORD dwXStatus, dwStatus = GetMraStatusFromMiradaStatus(dwStatusMir, dwXStatusMir, &dwXStatus); - if (IsXStatusValid(dwXStatusMir)) { - char szValueName[MAX_PATH]; - if (pwszStatusTitle.IsEmpty()) { - mir_snprintf(szValueName, "XStatus%ldName", dwXStatusMir); - // custom xstatus name - if (!mraGetStringW(NULL, szValueName, wszStatusTitle)) - wszStatusTitle = TranslateW(lpcszXStatusNameDef[dwXStatusMir]); - } - else wszStatusTitle = pwszStatusTitle; - - if (pwszStatusDesc.IsEmpty()) { - mir_snprintf(szValueName, "XStatus%ldMsg", dwXStatusMir); - // custom xstatus description - mraGetStringW(NULL, szValueName, wszStatusDesc); - } - else wszStatusDesc = pwszStatusDesc; - } - else if (pwszStatusTitle.IsEmpty()) - wszStatusTitle = Clist_GetStatusModeDescription(dwStatusMir, 0); - - MraChangeStatus(dwStatus, lpcszStatusUri[dwXStatus], wszStatusTitle, wszStatusDesc, ((getByte("RTFReceiveEnable", MRA_DEFAULT_RTF_RECEIVE_ENABLE) ? FEATURE_FLAG_RTF_MESSAGE : 0) | MRA_FEATURE_FLAGS)); - return 0; -} - -INT_PTR CMraProto::MraSendSMS(WPARAM wParam, LPARAM lParam) -{ - if (!m_bLoggedIn || !wParam || !lParam) - return 0; - - ptrW lpwszMessageXMLEncoded(mir_utf8decodeW((LPSTR)lParam)); - if (lpwszMessageXMLEncoded) { - CMStringW decoded = DecodeXML(CMStringW(lpwszMessageXMLEncoded)); - if (decoded.GetLength()) - return (MraSMSW(NULL, CMStringA((LPSTR)wParam), decoded)); - } - - return 0; -} - -INT_PTR CMraProto::MraSendNudge(WPARAM hContact, LPARAM) -{ - if (m_bLoggedIn && hContact) { - LPWSTR lpwszAlarmMessage = TranslateW(MRA_ALARM_MESSAGE); - - CMStringA szEmail; - if (mraGetStringA(hContact, "e-mail", szEmail)) - if (MraMessage(FALSE, hContact, 0, (MESSAGE_FLAG_RTF | MESSAGE_FLAG_ALARM), szEmail, lpwszAlarmMessage, nullptr, 0)) - return 0; - } - return 1; -} - -INT_PTR CMraProto::GetUnreadEmailCount(WPARAM, LPARAM) -{ - if (!m_bLoggedIn) - return 0; - return m_dwEmailMessagesUnread; -} - -///////////////////////////////////////////////////////////////////////////////////////// -// Avatars - -INT_PTR CMraProto::MraGetAvatarCaps(WPARAM wParam, LPARAM) -{ - - switch (wParam) { - case AF_MAXSIZE: - return -1; - case AF_PROPORTION: - return PIP_NONE; - case AF_FORMATSUPPORTED: - return 0; // no formats to set - case AF_ENABLED: - return 1; // always on - case AF_DONTNEEDDELAYS: - return 0; // need delay - case AF_MAXFILESIZE: - return 0; - case AF_DELAYAFTERFAIL: - return 5000; - } - - return 0; -} - - -INT_PTR CMraProto::MraGetAvatarInfo(WPARAM wParam, LPARAM lParam) -{ - if (lParam) { - PROTO_AVATAR_INFORMATION *pai = (PROTO_AVATAR_INFORMATION*)lParam; - return (INT_PTR)MraAvatarsQueueGetAvatar(hAvatarsQueueHandle, (DWORD)wParam, pai->hContact, nullptr, (DWORD*)&pai->format, pai->filename); - } - return GAIR_NOAVATAR; -} - - -INT_PTR CMraProto::MraGetMyAvatar(WPARAM wParam, LPARAM lParam) -{ - CMStringW wszFileName; - if (MraAvatarsGetFileName(hAvatarsQueueHandle, NULL, GetContactAvatarFormat(NULL, PA_FORMAT_DEFAULT), wszFileName) == NO_ERROR) { - mir_wstrncpy((LPTSTR)wParam, wszFileName, (size_t)lParam); - return 0; - } - return 1; -} - -//////////////////////////////////////////////////////////////////////////////////////////////// -// processes clist group removal - -int CMraProto::OnGroupChanged(WPARAM hContact, LPARAM lParam) -{ - if (hContact == NULL) { - CLISTGROUPCHANGE *cgc = (CLISTGROUPCHANGE*)lParam; - if (cgc->pszOldName == nullptr) - return 0; - - debugLogA("removing group %S", cgc->pszOldName); - MraGroupItem *pGrp = nullptr; - for (auto &it : m_groups) { - if (!mir_wstrcmp(it->m_name, cgc->pszOldName)) { - pGrp = it; - debugLogA("found a group at the server, idx = %d", it->m_id); - break; - } - } - if (pGrp == nullptr) // no MRA contacts in it - return 0; - - DWORD dwFlags = CONTACT_FLAG_GROUP; - CMStringW wszGroup; - if (cgc->pszNewName != nullptr) // renaming group - wszGroup = cgc->pszNewName; - else { // removing group - dwFlags |= CONTACT_FLAG_REMOVED; - wszGroup = cgc->pszOldName; - } - MraModifyContact(NULL, &pGrp->m_id, &dwFlags, nullptr, nullptr, &wszGroup); - } - return 0; -} diff --git a/protocols/MRA/src/Sdk/BuffToLowerCase.h b/protocols/MRA/src/Sdk/BuffToLowerCase.h deleted file mode 100644 index 5c1c231222..0000000000 --- a/protocols/MRA/src/Sdk/BuffToLowerCase.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * 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_ - -#pragma once - - -__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/protocols/MRA/src/Sdk/FIFOMT.h b/protocols/MRA/src/Sdk/FIFOMT.h deleted file mode 100644 index 0cff1914d5..0000000000 --- a/protocols/MRA/src/Sdk/FIFOMT.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * 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_ - -#pragma once - -#include "Sdk/ListMT.h" -#include "Sdk/InterlockedFunctions.h" - -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; - - -__inline size_t FifoMTItemPush(PCFIFO_MT pcpmtFifoMT,PCFIFO_MT_ITEM pcffmtiFifoItem,LPVOID lpData) -{ - mir_cslock l(pcpmtFifoMT->cs); - return ListMTItemAdd(pcpmtFifoMT,pcffmtiFifoItem,lpData); -} - - -__inline DWORD FifoMTItemPop(PCFIFO_MT pcpmtFifoMT,PFIFO_MT_ITEM *ppffmtiFifoItem,LPVOID *plpData) -{ - DWORD dwRetErrorCode; - PLIST_MT_ITEM plmtiItem; - - mir_cslock l(pcpmtFifoMT->cs); - if ((dwRetErrorCode=ListMTItemGetFirst(pcpmtFifoMT,&plmtiItem,plpData))==NO_ERROR) - { - if (ppffmtiFifoItem) (*ppffmtiFifoItem)=plmtiItem; - return ListMTItemDelete(pcpmtFifoMT,plmtiItem); - } - - return dwRetErrorCode; -} - -#define FifoMTGetCount(pcpmtFifoMT) ListMTGetCount(pcpmtFifoMT) - - -#endif // !defined(AFX_FIFO_MT__H__INCLUDED_) diff --git a/protocols/MRA/src/Sdk/InterlockedFunctions.h b/protocols/MRA/src/Sdk/InterlockedFunctions.h deleted file mode 100644 index 49b7332fd8..0000000000 --- a/protocols/MRA/src/Sdk/InterlockedFunctions.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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_ - -#pragma once - -#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/protocols/MRA/src/Sdk/InternetTime.h b/protocols/MRA/src/Sdk/InternetTime.h deleted file mode 100644 index 865d02a3e5..0000000000 --- a/protocols/MRA/src/Sdk/InternetTime.h +++ /dev/null @@ -1,290 +0,0 @@ -/* - * 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_ - - -#pragma once - -#include "Sdk/StrToNum.h" -#include "Sdk/MemoryFind.h" -#include "Sdk/MemoryFindByte.h" - -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" - -__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 void InternetTimeGetCurrentTime(INTERNET_TIME *pitTime) -{ - TIME_ZONE_INFORMATION tzi={0}; - GetTimeZoneInformation(&tzi); - pitTime->lTimeZone=tzi.Bias; - GetSystemTime(&pitTime->stTime); -} - -// Переводит время из MAILTIME в строковое -__inline CMStringA InternetTimeGetString(INTERNET_TIME *pitTime) -{ - char lpszBuff[100]; - 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; - } - - return lpszBuff; -} - -// Переводит время из строкового в INTERNET_TIME -__inline DWORD InternetTimeGetTime(const CMStringA &lpszTime, INTERNET_TIME &pitTime) -{ - if (lpszTime.IsEmpty()) - return ERROR_INVALID_HANDLE; - - // = Thu, 21 May 1998 05:33:29 -0700 = - char sztmBuff[4096]; - LPSTR lpszCurPos=sztmBuff,lpszTemp; - size_t dwCurSize=4096,dwTemp; - - memset(&pitTime, 0, sizeof(INTERNET_TIME)); - WSP2SP(lpszTime, lpszTime.GetLength(), lpszCurPos, &dwCurSize); - - if (dwCurSize > 3) { // день недели - if (lpszCurPos[3] == ',') { - for (unsigned short i=0; i < 7; i++) { - if ( !_memicmp(lpcszenmDayOfWeakEnum[i], lpszCurPos, 3)) { - pitTime.stTime.wDayOfWeek = 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 (unsigned short i=1; i < 13; i++) - if ( !_memicmp(lpcszenmMonthEnum[i], lpszCurPos, 3)) { - pitTime.stTime.wMonth = 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; - } - } - } - } - } - } - } - } - } - } - - return NO_ERROR; -} - - - -#endif // !defined(AFX_INTERNET_TIME_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) diff --git a/protocols/MRA/src/Sdk/ListMT.h b/protocols/MRA/src/Sdk/ListMT.h deleted file mode 100644 index ed9b8cfec9..0000000000 --- a/protocols/MRA/src/Sdk/ListMT.h +++ /dev/null @@ -1,200 +0,0 @@ -/* - * 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_ - -#pragma once - -#include "Sdk/InterlockedFunctions.h" - -#pragma warning(push) -#pragma warning(disable:4312) // warning C4312: 'type cast' : conversion from 'LONG' to 'PVOID' of greater size - - -// структура для работы со списком, элемент списка -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 : public MZeroedObject -{ - size_t nCount; // *количество элементов в списке - PLIST_MT_ITEM plmtiFirst; // *указывает на первый элемент в списке - PLIST_MT_ITEM plmtiLast; // *указывает на последний элемент в списке - mir_cs 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 size_t ListMTGetCount(PCLIST_MT pclmtListMT) -{ - return((size_t)InterlockedCompareExchangePointer((LPVOID*)&pclmtListMT->nCount, nullptr, nullptr)); -} - - -__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= nullptr; - pclmtListMT->plmtiLast->plmtiNext=pclmtListMTItem; - pclmtListMT->plmtiLast=pclmtListMTItem; - }else{// add the first node to the linked list - pclmtListMTItem->plmtiPrev= nullptr; - pclmtListMTItem->plmtiNext= nullptr; - 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 == nullptr) - {// This is the start node in the list to delete - // отключился последний подключившийся - plmtiPrevNode->plmtiNext = nullptr; - pclmtListMT->plmtiLast=plmtiPrevNode; - }else{ - if (plmtiPrevNode == nullptr && plmtiNextNode) - {// This is the end node in the list to delete - // отключился первый подключившийся - plmtiNextNode->plmtiPrev = nullptr; - 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 = nullptr; - pclmtListMT->plmtiLast = nullptr; - } - - pclmtListMTItem->lpListMT = nullptr; - InterlockedDecrementPointer(&pclmtListMT->nCount);// pclmtListMT->nCount--; - dwRetErrorCode=NO_ERROR; - }else{// попытались удалить элемент не относящийся к данному списку - dwRetErrorCode=ERROR_INVALID_HANDLE; - } -return(dwRetErrorCode); -} - -__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 BOOL ListMTIteratorMoveFirst(PCLIST_MT pclmtListMT,PCLIST_MT_ITERATOR pclmtiIterator) -{// если нужно гарантировать эксклюзивный доступ, то есть ListMTLock и ListMTUnLock - return((pclmtiIterator->plmtListMTItem=pclmtListMT->plmtiFirst)? TRUE:FALSE); -} - - -__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); -} - -#pragma warning(pop) -#pragma warning(default:4312) // warning C4312: 'type cast' : conversion from 'LONG' to 'PVOID' of greater size - -#endif // !defined(AFX_LIST_MT__H__INCLUDED_) diff --git a/protocols/MRA/src/Sdk/MemoryFind.h b/protocols/MRA/src/Sdk/MemoryFind.h deleted file mode 100644 index f41ea64b6d..0000000000 --- a/protocols/MRA/src/Sdk/MemoryFind.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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_MEMORYFIND__H__INCLUDED_) -#define AFX_MEMORYFIND__H__INCLUDED_ - - -#pragma once - -__inline void *MemoryFind(size_t dwFrom,const void *pBuff,size_t dwBuffSize,const void *pWhatFind,size_t dwWhatFindSize) -{ - void *pRet = nullptr; - - 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) - { - 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/protocols/MRA/src/Sdk/MemoryFindByte.h b/protocols/MRA/src/Sdk/MemoryFindByte.h deleted file mode 100644 index 146fd74b30..0000000000 --- a/protocols/MRA/src/Sdk/MemoryFindByte.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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_ - -#pragma once - -__inline void *MemoryFindByte(size_t dwFrom,const void *pBuff,size_t dwBuffSize,unsigned char chWhatFind) -{ - void *pRet = nullptr; - - if (pBuff && dwBuffSize && dwFrom - * 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_ - -#pragma once - -__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_ - -#pragma once - -//////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////// -//////////////////////////////RFC 2104////////////////////////////// -//////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////// - -__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;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_STRHEXTONUM__H__INCLUDED_) -#define AFX_STRHEXTONUM__H__INCLUDED_ - -#pragma once - -__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); -} - - -#endif // !defined(AFX_STRHEXTONUM__H__INCLUDED_) \ No newline at end of file diff --git a/protocols/MRA/src/Sdk/StrToNum.h b/protocols/MRA/src/Sdk/StrToNum.h deleted file mode 100644 index ef3a95050e..0000000000 --- a/protocols/MRA/src/Sdk/StrToNum.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * 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_ - -#pragma once - -__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 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); -} - - -#endif // !defined(AFX_STRTONUM__H__INCLUDED_) \ No newline at end of file diff --git a/protocols/MRA/src/Sdk/timefuncs.h b/protocols/MRA/src/Sdk/timefuncs.h deleted file mode 100644 index 0bff545803..0000000000 --- a/protocols/MRA/src/Sdk/timefuncs.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * 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_ - -#pragma once - -#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; - - -inline __time32_t _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); -} - - -#endif // !defined(AFX_TIME_FUNCS__H__INCLUDED_) diff --git a/protocols/MRA/src/proto.h b/protocols/MRA/src/proto.h deleted file mode 100644 index b46d21a47f..0000000000 --- a/protocols/MRA/src/proto.h +++ /dev/null @@ -1,611 +0,0 @@ -//*************************************************************************** -// $Id: proto.h, v 1.141 2005/10/24 15:32:33 shingrus Exp $ -//*************************************************************************** - -#ifndef MRIM_PROTO_H -#define MRIM_PROTO_H - -#include - -#include "version.h" - -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 // report spam back to the server - #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 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 0x0006 -// 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_UNKNOWN2 0x1074 /* possible mail notification */ - - - -#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/protocols/MRA/src/resource.h b/protocols/MRA/src/resource.h deleted file mode 100644 index b557ba8e37..0000000000 --- a/protocols/MRA/src/resource.h +++ /dev/null @@ -1,128 +0,0 @@ -//{{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_POSTCARD 114 -#define IDI_MRA_PHOTO 117 -#define IDI_DELETED 118 -#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 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_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_KEEPALIVE 1011 -#define IDC_FILE_SEND_NOOUTCONNECTIONONRECEIVE 1011 -#define IDC_LIST_EMAILS 1011 -#define IDC_TRAYICON_NEW_MAIL_NOTIFY 1011 -#define IDC_FILE_SEND_IGNORYADDITIONALPORTS 1012 -#define IDC_RTF_RECEIVE_ENABLE 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_EDIT_TEXT 1015 -#define IDC_FILE_SEND_ENABLE_MRIMPROXY_CONS 1015 -#define IDC_AUTO_AUTH_GRAND_IN_CLIST 1015 -#define IDC_AUTO_AUTH_GRAND_NEW_USERS 1016 -#define IDC_AUTO_AUTH_ON_WEB_SVCS 1017 -#define IDC_OPTIONSTAB 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_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_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/protocols/MRA/src/stdafx.cxx b/protocols/MRA/src/stdafx.cxx deleted file mode 100644 index e579779bcc..0000000000 --- a/protocols/MRA/src/stdafx.cxx +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright (C) 2012-18 Miranda NG team (https://miranda-ng.org) - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation version 2 -of the License. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "stdafx.h" \ No newline at end of file diff --git a/protocols/MRA/src/stdafx.h b/protocols/MRA/src/stdafx.h deleted file mode 100644 index 54860e5227..0000000000 --- a/protocols/MRA/src/stdafx.h +++ /dev/null @@ -1,215 +0,0 @@ -#if !defined(AFX_MRA_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_) -#define AFX_MRA_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_ - -#pragma once - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers - -#include -#include -#include -#include - -#pragma comment(lib,"shlwapi.lib") - -#include -#include -#include -#include -#include - -#include "../../libs/zlib/src/zlib.h" - -#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 - -#define PROTO_VERSION_MAJOR 1 -#define PROTO_VERSION_MINOR 21 - -#include "resource.h" -#include "../xstatus_MRA/src/resource.h" - -#include "Sdk/MemoryFind.h" -#include "Sdk/MemoryFindByte.h" -#include "Sdk/BuffToLowerCase.h" -#include "Sdk/StrHexToNum.h" -#include "Sdk/timefuncs.h" -#include "Sdk/InternetTime.h" -#include "Sdk/ListMT.h" -#include "Sdk/FIFOMT.h" -#include "Sdk/RC4.h" -#include "Sdk/SHA1.h" - -// LPS -struct MRA_LPS -{ - size_t dwSize; - - union { - LPSTR lpszData; - LPWSTR lpwszData; - }; -}; - - -// GUID -struct MRA_GUID -{ - DWORD id[4]; -}; - -struct MRA_ADDR_LIST_ITEM -{ - DWORD dwPort; - DWORD dwAddr; -}; - -struct MRA_ADDR_LIST -{ - DWORD dwAddrCount; - MRA_ADDR_LIST_ITEM *pMailAddress; -}; - -///////////////////////////////////////////////////////////////////////////// - -class BinBuffer -{ - LPBYTE m_data; - size_t m_len; - -public: - BinBuffer(LPBYTE data, size_t len) : m_data(data), m_len(len) {} - - DWORD getDword(); - DWORDLONG getInt64(); - MRA_GUID getGuid(); - void getStringA(CMStringA&); - void getStringW(CMStringW&); - - __forceinline bool eof() const { return m_len == 0; } -}; - -__forceinline BinBuffer& operator >>(BinBuffer& buf, DWORD &dwVar) { dwVar = buf.getDword(); return buf; } -__forceinline BinBuffer& operator >>(BinBuffer& buf, DWORDLONG &llVar) { llVar = buf.getInt64(); return buf; } -__forceinline BinBuffer& operator >>(BinBuffer& buf, MRA_GUID &guid) { guid = buf.getGuid(); return buf; } -__forceinline BinBuffer& operator >>(BinBuffer& buf, CMStringA &sVar) { buf.getStringA(sVar); return buf; } -__forceinline BinBuffer& operator >>(BinBuffer& buf, CMStringW &sVar) { buf.getStringW(sVar); return buf; } - -///////////////////////////////////////////////////////////////////////////// - -bool DB_GetStaticStringA(MCONTACT hContact, LPCSTR lpszModule, LPCSTR lpszValueName, LPSTR lpszRetBuff, size_t dwRetBuffSize, size_t *pdwRetBuffSize); -bool DB_GetStaticStringW(MCONTACT hContact, LPCSTR lpszModule, LPCSTR lpszValueName, LPWSTR lpszRetBuff, size_t dwRetBuffSize, size_t *pdwRetBuffSize); - -bool DB_GetStringA(MCONTACT hContact, LPCSTR lpszModule, LPCSTR lpszValueName, CMStringA &Ret); -bool DB_GetStringW(MCONTACT hContact, LPCSTR lpszModule, LPCSTR lpszValueName, CMStringW &Ret); - -bool DB_SetStringExA(MCONTACT hContact, LPCSTR lpszModule, LPCSTR lpszValueName, const CMStringA &value); -bool DB_SetStringExW(MCONTACT hContact, LPCSTR lpszModule, LPCSTR lpszValueName, const CMStringW &value); - -bool DB_GetContactSettingBlob(MCONTACT hContact, LPCSTR lpszModule, LPCSTR lpszValueName, LPVOID lpRet, size_t dwRetBuffSize, size_t *pdwRetBuffSize); - -#include "MraConstans.h" -#include "MraProto.h" - -extern IconItem gdiMenuItems[]; -extern IconItem gdiContactMenuItems[]; -extern IconItem gdiExtraStatusIconsItems[]; - -#include "proto.h" -#include "MraMRIMProxy.h" -#include "MraSendQueue.h" -#include "MraFilesQueue.h" -#include "MraPopup.h" -#include "MraAvatars.h" -#include "MraIcons.h" -#include "MraSelectEMail.h" -#include "MraMPop.h" - -///////////////////////////////////////////////////////////////////////////////////////// -// plugin options - -extern HMODULE g_hDLLXStatusIcons; -extern HICON g_hMainIcon; - -extern bool g_bChatExist; - -extern size_t g_dwMirWorkDirPathLen; -extern WCHAR g_szMirWorkDirPath[MAX_FILEPATH]; - -///////////////////////////////////////////////////////////////////////////////////////// -// External variables - -extern HANDLE hXStatusAdvancedStatusIcons[]; - -CMStringA MraGetSelfVersionString(); - -#define SetBit(bytes, bitpos) bytes |= (1< - -#define __PLUGIN_NAME "MRA protocol" -#define __FILENAME "MRA.dll" -#define __DESCRIPTION "Miranda Mail.ru Agent protocol plugin." -#define __AUTHOR "Rozhuk Ivan" -#define __AUTHORWEB "https://miranda-ng.org/p/MRA/" -#define __COPYRIGHT "© 2005-18 Rozhuk Ivan" -- cgit v1.2.3