From f117a5141791cccca74bd1c242d44fb5f1ee96f3 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 30 Apr 2023 20:20:36 +0300 Subject: fixes #966 (Adding a New Client Type to FingerPrint) --- plugins/FingerprintNG/fingerprint_ng.vcxproj | 2 +- .../FingerprintNG/fingerprint_ng.vcxproj.filters | 6 +- plugins/FingerprintNG/src/finger_groups.h | 97 -------- plugins/FingerprintNG/src/fingerprint.cpp | 269 ++++++--------------- plugins/FingerprintNG/src/main.cpp | 1 + plugins/FingerprintNG/src/masks.cpp | 192 ++++++++------- plugins/FingerprintNG/src/prepare.cpp | 248 +++++++++++++++++++ plugins/FingerprintNG/src/stdafx.h | 45 ++-- plugins/FingerprintNG/src/version.h | 2 +- 9 files changed, 458 insertions(+), 404 deletions(-) delete mode 100644 plugins/FingerprintNG/src/finger_groups.h create mode 100644 plugins/FingerprintNG/src/prepare.cpp (limited to 'plugins/FingerprintNG') diff --git a/plugins/FingerprintNG/fingerprint_ng.vcxproj b/plugins/FingerprintNG/fingerprint_ng.vcxproj index c18ec1ea81..7b57ebe71c 100644 --- a/plugins/FingerprintNG/fingerprint_ng.vcxproj +++ b/plugins/FingerprintNG/fingerprint_ng.vcxproj @@ -30,10 +30,10 @@ + Create - diff --git a/plugins/FingerprintNG/fingerprint_ng.vcxproj.filters b/plugins/FingerprintNG/fingerprint_ng.vcxproj.filters index 7fc98caebc..3a0f1fa094 100644 --- a/plugins/FingerprintNG/fingerprint_ng.vcxproj.filters +++ b/plugins/FingerprintNG/fingerprint_ng.vcxproj.filters @@ -17,11 +17,11 @@ Source Files + + Source Files + - - Header Files - Header Files diff --git a/plugins/FingerprintNG/src/finger_groups.h b/plugins/FingerprintNG/src/finger_groups.h deleted file mode 100644 index 19dbcf4fc9..0000000000 --- a/plugins/FingerprintNG/src/finger_groups.h +++ /dev/null @@ -1,97 +0,0 @@ -case MIRANDA_CASE: - if (g_plugin.getByte("GroupMiranda", 1)) - return LPGENW("Client icons") L"/" LPGENW("Miranda clients"); - break; - -case MIRANDA_VERSION_CASE: - if (g_plugin.getByte("GroupMirandaVersion", 1)) - return LPGENW("Client icons") L"/" LPGENW("Miranda clients"); - break; - -case MIRANDA_PACKS_CASE: - if (g_plugin.getByte("GroupMirandaPacks", 1)) - return LPGENW("Client icons") L"/" LPGENW("Miranda clients") L"/" LPGENW("Pack overlays"); - break; - -case MULTI_CASE: - if (g_plugin.getByte("GroupMulti", 1)) - return LPGENW("Client icons") L"/" LPGENW("Multi-proto clients"); - break; - -case GG_CASE: - if (g_plugin.getByte("GroupGG", 1)) - return LPGENW("Client icons") L"/" LPGENW("Gadu-Gadu clients"); - break; - -case ICQ_CASE: - if (g_plugin.getByte("GroupICQ", 1)) - return LPGENW("Client icons") L"/" LPGENW("ICQ clients"); - break; - -case IRC_CASE: - if (g_plugin.getByte("GroupIRC", 1)) - return LPGENW("Client icons") L"/" LPGENW("IRC clients"); - break; - -case JABBER_CASE: - if (g_plugin.getByte("GroupJabber", 1)) - return LPGENW("Client icons") L"/" LPGENW("Jabber clients"); - break; - -case RSS_CASE: - if (g_plugin.getByte("GroupRSS", 1)) - return LPGENW("Client icons") L"/" LPGENW("RSS clients"); - break; - -case WEATHER_CASE: - if (g_plugin.getByte("GroupWeather", 1)) - return LPGENW("Client icons") L"/" LPGENW("Weather clients"); - break; - -case FACEBOOK_CASE: - if (g_plugin.getByte("GroupFacebook", 1)) - return LPGENW("Client icons") L"/" LPGENW("Facebook clients"); - break; - -case VK_CASE: - if (g_plugin.getByte("GroupVK", 1)) - return LPGENW("Client icons") L"/" LPGENW("VKontakte clients"); - break; - -case OTHER_PROTOS_CASE: - if (g_plugin.getByte("GroupOtherProtos", 1)) - return LPGENW("Client icons") L"/" LPGENW("Other protocols"); - break; - -case OTHERS_CASE: - if (g_plugin.getByte("GroupOthers", 1)) - return LPGENW("Client icons") L"/" LPGENW("Other icons"); - break; - -case OVERLAYS_RESOURCE_CASE: - if (g_plugin.getByte("GroupOverlaysResource", 1)) - return LPGENW("Client icons") L"/" LPGENW("Overlays") L"/" LPGENW("Resource"); - break; - -case OVERLAYS_PLATFORM_CASE: - if (g_plugin.getByte("GroupOverlaysPlatform", 1)) - return LPGENW("Client icons") L"/" LPGENW("Overlays") L"/" LPGENW("Platform"); - break; - -case OVERLAYS_UNICODE_CASE: - if (g_plugin.getByte("GroupOverlaysUnicode", 1)) - return LPGENW("Client icons") L"/" LPGENW("Overlays") L"/" LPGENW("Platform"); - break; - -case OVERLAYS_SECURITY_CASE: - if (g_plugin.getByte("GroupOverlaysSecurity", 1)) - return LPGENW("Client icons") L"/" LPGENW("Overlays") L"/" LPGENW("Security"); - break; - -case OVERLAYS_PROTO_CASE: - if (g_plugin.getByte("GroupOverlaysProtos", 1)) - return LPGENW("Client icons") L"/" LPGENW("Overlays") L"/" LPGENW("Protocol"); - break; - -default: - return LPGENW("Client icons"); diff --git a/plugins/FingerprintNG/src/fingerprint.cpp b/plugins/FingerprintNG/src/fingerprint.cpp index e15f77536d..72dbc5a7ca 100644 --- a/plugins/FingerprintNG/src/fingerprint.cpp +++ b/plugins/FingerprintNG/src/fingerprint.cpp @@ -20,8 +20,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. //Start of header #include "stdafx.h" +KN_FP_MASK *g_pNotFound, *g_pUnknown; +LIST g_arCommon(10), g_overlay1(10), g_overlay2(10), g_overlay3(10), g_overlay4(10); +wchar_t g_szSkinLib[MAX_PATH]; + static UINT g_LPCodePage; -static wchar_t g_szSkinLib[MAX_PATH]; static HANDLE hExtraIcon = nullptr; static HANDLE hFolderChanged = nullptr, hIconFolder = nullptr; @@ -38,107 +41,6 @@ static LIST arMonitoredWindows(3, PtrKeySortT); static INT_PTR ServiceGetClientIconW(WPARAM wParam, LPARAM lParam); -/* -* Prepare -* prepares upperstring masks and registers them in IcoLib -*/ - -static wchar_t* getSectionName(int flag) -{ - switch (flag) - { -#include "finger_groups.h" - } - return nullptr; -} - -void __fastcall Prepare(KN_FP_MASK* mask, bool bEnable) -{ - mask->szMaskUpper = nullptr; - - if (mask->hIcolibItem) - IcoLib_RemoveIcon(mask->szIconName); - mask->hIcolibItem = nullptr; - - if (!mask->szMask || !bEnable) - return; - - size_t iMaskLen = mir_wstrlen(mask->szMask) + 1; - LPTSTR pszNewMask = (LPTSTR)HeapAlloc(hHeap, HEAP_NO_SERIALIZE, iMaskLen * sizeof(wchar_t)); - wcscpy_s(pszNewMask, iMaskLen, mask->szMask); - _wcsupr_s(pszNewMask, iMaskLen); - mask->szMaskUpper = pszNewMask; - - wchar_t destfile[MAX_PATH]; - if (mask->iIconIndex == IDI_NOTFOUND || mask->iIconIndex == IDI_UNKNOWN || mask->iIconIndex == IDI_UNDETECTED) - GetModuleFileName(g_plugin.getInst(), destfile, MAX_PATH); - else { - wcsncpy_s(destfile, g_szSkinLib, _TRUNCATE); - - struct _stat64i32 stFileInfo; - if (_wstat(destfile, &stFileInfo) == -1) - return; - } - - LPTSTR SectName = getSectionName(mask->iSectionFlag); - if (SectName == nullptr) - return; - - SKINICONDESC sid = {}; - sid.flags = SIDF_ALL_UNICODE; - sid.section.w = SectName; - sid.pszName = mask->szIconName; - sid.description.w = mask->szClientDescription; - sid.defaultFile.w = destfile; - sid.iDefaultIndex = -mask->iIconIndex; - mask->hIcolibItem = g_plugin.addIcon(&sid); -} - -/* -* Register icons -*/ - -void RegisterIcons() -{ - // prepare masks - int i; - - if (hHeap) - HeapDestroy(hHeap); - hHeap = HeapCreate(HEAP_NO_SERIALIZE, 0, 0); - - for (i = 0; i < DEFAULT_KN_FP_MASK_COUNT; i++) - Prepare(&def_kn_fp_mask[i], true); - - for (i = 0; i < DEFAULT_KN_FP_OVERLAYS_COUNT; i++) - Prepare(&def_kn_fp_overlays_mask[i], true); - - if (g_plugin.getByte("GroupMirandaVersion", 0)) { - for (i = 0; i < DEFAULT_KN_FP_OVERLAYS2_COUNT; i++) - Prepare(&def_kn_fp_overlays2_mask[i], true); - } - else { - for (i = 0; i < DEFAULT_KN_FP_OVERLAYS2_NO_VER_COUNT; i++) - Prepare(&def_kn_fp_overlays2_mask[i], true); - for (; i < DEFAULT_KN_FP_OVERLAYS2_COUNT; i++) - Prepare(&def_kn_fp_overlays2_mask[i], false); - } - - if (g_plugin.getByte("GroupOverlaysUnicode", 1)) { - for (i = 0; i < DEFAULT_KN_FP_OVERLAYS3_COUNT; i++) - Prepare(&def_kn_fp_overlays3_mask[i], true); - } - else { - for (i = 0; i < DEFAULT_KN_FP_OVERLAYS3_NO_UNICODE_COUNT; i++) - Prepare(&def_kn_fp_overlays3_mask[i], true); - for (; i < DEFAULT_KN_FP_OVERLAYS3_COUNT; i++) - Prepare(&def_kn_fp_overlays3_mask[i], false); - } - - for (i = 0; i < DEFAULT_KN_FP_OVERLAYS4_COUNT; i++) - Prepare(&def_kn_fp_overlays4_mask[i], true); -} - /* ApplyFingerprintImage * 1)Try to find appropriate mask * 2)Register icon in extraimage list if not yet registered (EMPTY_EXTRA_ICON) @@ -176,7 +78,6 @@ int OnExtraIconClick(WPARAM wParam, LPARAM, LPARAM) return 0; } - /* * WildCompare * Compare 'name' string with 'mask' strings. @@ -235,98 +136,80 @@ BOOL __fastcall WildCompare(LPWSTR wszName, LPWSTR wszMask) return FALSE; } -static void MatchMasks(wchar_t* szMirVer, int *base, int *overlay, int *overlay2, int *overlay3, int *overlay4) +/* GetIconsIndexes +* Retrieves Icons indexes by Mirver +*/ + +void __fastcall GetIconsIndexes(LPWSTR wszMirVer, KN_FP_MASK *&base, KN_FP_MASK *&overlay1, KN_FP_MASK *&overlay2, KN_FP_MASK *&overlay3, KN_FP_MASK *&overlay4) { - int i = 0, j = -1, k = -1, n = -1, m = -1; + base = overlay1 = overlay2 = overlay3 = overlay4 = nullptr; - for (i = 0; i < DEFAULT_KN_FP_MASK_COUNT; i++) { - KN_FP_MASK& p = def_kn_fp_mask[i]; - if (p.hIcolibItem == nullptr) + if (mir_wstrcmp(wszMirVer, L"?") == 0) { + base = g_pUnknown; + return; + } + + LPWSTR wszMirVerUp = NEWWSTR_ALLOCA(wszMirVer); + _wcsupr(wszMirVerUp); + + for (auto &it : g_arCommon) { + if (it->hIcolibItem == nullptr) continue; - if (!WildCompare(szMirVer, p.szMaskUpper)) + if (!WildCompare(wszMirVerUp, it->szMaskUpper)) continue; - if (p.iIconIndex != IDI_NOTFOUND && p.iIconIndex != IDI_UNKNOWN && p.iIconIndex != IDI_UNDETECTED) { + base = it; + if (it->iIconIndex != IDI_NOTFOUND && it->iIconIndex != IDI_UNKNOWN && it->iIconIndex != IDI_UNDETECTED) { wchar_t destfile[MAX_PATH]; wcsncpy_s(destfile, g_szSkinLib, _TRUNCATE); struct _stat64i32 stFileInfo; if (_wstat(destfile, &stFileInfo) == -1) - i = NOTFOUND_MASK_NUMBER; + base = g_pNotFound; } break; } - if (i == DEFAULT_KN_FP_MASK_COUNT - 1) - i = -1; - else if (!def_kn_fp_mask[i].fNotUseOverlay && i < DEFAULT_KN_FP_MASK_COUNT) { - for (j = 0; j < DEFAULT_KN_FP_OVERLAYS_COUNT; j++) { - KN_FP_MASK& p = def_kn_fp_overlays_mask[j]; - if (p.hIcolibItem == nullptr) - continue; + if (base == nullptr) + base = g_pUnknown; - if (!WildCompare(szMirVer, p.szMaskUpper)) + else if (!base->fNotUseOverlay) { + for (auto &it : g_overlay1) { + if (!WildCompare(wszMirVerUp, it->szMaskUpper)) continue; struct _stat64i32 stFileInfo; - if (_wstat(g_szSkinLib, &stFileInfo) != -1) + if (_wstat(g_szSkinLib, &stFileInfo) != -1) { + overlay1 = it; break; + } } - for (k = 0; k < DEFAULT_KN_FP_OVERLAYS2_COUNT; k++) { - KN_FP_MASK& p = def_kn_fp_overlays2_mask[k]; - if (p.hIcolibItem == nullptr) - continue; - - if (WildCompare(szMirVer, p.szMaskUpper)) + for (auto &it : g_overlay2) { + if (WildCompare(wszMirVerUp, it->szMaskUpper)) { + overlay2 = it; break; + } } - for (n = 0; n < DEFAULT_KN_FP_OVERLAYS3_COUNT; n++) { - KN_FP_MASK& p = def_kn_fp_overlays3_mask[n]; - if (p.hIcolibItem == nullptr) - continue; - - if (WildCompare(szMirVer, p.szMaskUpper)) + for (auto &it : g_overlay3) { + if (WildCompare(wszMirVerUp, it->szMaskUpper)) { + overlay3 = it; break; + } } - for (m = 0; m < DEFAULT_KN_FP_OVERLAYS4_COUNT; m++) { - KN_FP_MASK& p = def_kn_fp_overlays4_mask[m]; - if (p.hIcolibItem == nullptr) + for (auto &it : g_overlay4) { + if (it->hIcolibItem == nullptr) continue; - if (WildCompare(szMirVer, p.szMaskUpper)) + if (WildCompare(wszMirVerUp, it->szMaskUpper)) { + overlay4 = it; break; + } } } - - *base = (i < DEFAULT_KN_FP_MASK_COUNT) ? i : -1; - *overlay = (j < DEFAULT_KN_FP_OVERLAYS_COUNT) ? j : -1; - *overlay2 = (k < DEFAULT_KN_FP_OVERLAYS2_COUNT) ? k : -1; - *overlay3 = (n < DEFAULT_KN_FP_OVERLAYS3_COUNT) ? n : -1; - *overlay4 = (m < DEFAULT_KN_FP_OVERLAYS4_COUNT) ? m : -1; -} - -/* GetIconsIndexes -* Retrieves Icons indexes by Mirver -*/ - -void __fastcall GetIconsIndexes(LPWSTR wszMirVer, int *base, int *overlay, int *overlay2, int *overlay3, int *overlay4) -{ - if (mir_wstrcmp(wszMirVer, L"?") == 0) { - *base = UNKNOWN_MASK_NUMBER; - *overlay = -1; - *overlay2 = -1; - *overlay3 = -1; - *overlay4 = -1; - return; - } - - LPWSTR wszMirVerUp = NEWWSTR_ALLOCA(wszMirVer); - _wcsupr(wszMirVerUp); - MatchMasks(wszMirVerUp, base, overlay, overlay2, overlay3, overlay4); } /* @@ -334,47 +217,40 @@ void __fastcall GetIconsIndexes(LPWSTR wszMirVer, int *base, int *overlay, int * * returns hIcon of joined icon by given indexes */ -HICON __fastcall CreateIconFromIndexes(int base, int overlay, int overlay2, int overlay3, int overlay4) +HICON __fastcall CreateIconFromIndexes(KN_FP_MASK *base, KN_FP_MASK *overlay1, KN_FP_MASK *overlay2, KN_FP_MASK *overlay3, KN_FP_MASK *overlay4) { HICON hIcon = nullptr; // returned HICON HICON hTmp = nullptr; - HICON icMain = nullptr; HICON icOverlay = nullptr; HICON icOverlay2 = nullptr; HICON icOverlay3 = nullptr; HICON icOverlay4 = nullptr; - KN_FP_MASK* mainMask = &(def_kn_fp_mask[base]); - icMain = IcoLib_GetIconByHandle(mainMask->hIcolibItem); - + HICON icMain = IcoLib_GetIconByHandle(base->hIcolibItem); if (icMain) { - KN_FP_MASK* overlayMask = (overlay != -1) ? &(def_kn_fp_overlays_mask[overlay]) : nullptr; - KN_FP_MASK* overlay2Mask = (overlay2 != -1) ? &(def_kn_fp_overlays2_mask[overlay2]) : nullptr; - KN_FP_MASK* overlay3Mask = (overlay3 != -1) ? &(def_kn_fp_overlays3_mask[overlay3]) : nullptr; - KN_FP_MASK* overlay4Mask = (overlay4 != -1) ? &(def_kn_fp_overlays4_mask[overlay4]) : nullptr; - icOverlay = (overlayMask == nullptr) ? nullptr : IcoLib_GetIconByHandle(overlayMask->hIcolibItem); - icOverlay2 = (overlay2Mask == nullptr) ? nullptr : IcoLib_GetIconByHandle(overlay2Mask->hIcolibItem); - icOverlay3 = (overlay3Mask == nullptr) ? nullptr : IcoLib_GetIconByHandle(overlay3Mask->hIcolibItem); - icOverlay4 = (overlay4Mask == nullptr) ? nullptr : IcoLib_GetIconByHandle(overlay4Mask->hIcolibItem); + icOverlay = (overlay1 == nullptr) ? nullptr : IcoLib_GetIconByHandle(overlay1->hIcolibItem); + icOverlay2 = (overlay2 == nullptr) ? nullptr : IcoLib_GetIconByHandle(overlay2->hIcolibItem); + icOverlay3 = (overlay3 == nullptr) ? nullptr : IcoLib_GetIconByHandle(overlay3->hIcolibItem); + icOverlay4 = (overlay4 == nullptr) ? nullptr : IcoLib_GetIconByHandle(overlay4->hIcolibItem); hIcon = icMain; - if (overlayMask) + if (overlay1) hTmp = hIcon = CreateJoinedIcon(hIcon, icOverlay); - if (overlay2Mask) { + if (overlay2) { hIcon = CreateJoinedIcon(hIcon, icOverlay2); if (hTmp) DestroyIcon(hTmp); hTmp = hIcon; } - if (overlay3Mask) { + if (overlay3) { hIcon = CreateJoinedIcon(hIcon, icOverlay3); if (hTmp) DestroyIcon(hTmp); hTmp = hIcon; } - if (overlay4Mask) { + if (overlay4) { hIcon = CreateJoinedIcon(hIcon, icOverlay4); if (hTmp) DestroyIcon(hTmp); } @@ -414,7 +290,7 @@ HBITMAP __fastcall CreateBitmap32Point(int cx, int cy, LPVOID* bits) if (cx < 0 || cy < 0) return nullptr; - BITMAPINFO bmpi = { 0 }; + BITMAPINFO bmpi = {}; bmpi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmpi.bmiHeader.biWidth = cx; bmpi.bmiHeader.biHeight = cy; @@ -674,20 +550,25 @@ HICON __fastcall CreateJoinedIcon(HICON hBottom, HICON hTop) HANDLE __fastcall GetIconIndexFromFI(LPTSTR szMirVer) { - int base, overlay, overlay2, overlay3, overlay4; - GetIconsIndexes(szMirVer, &base, &overlay, &overlay2, &overlay3, &overlay4); - if (base == -1) + KN_FP_MASK *base, *overlay1, *overlay2, *overlay3, *overlay4; + GetIconsIndexes(szMirVer, base, overlay1, overlay2, overlay3, overlay4); + if (base == nullptr) return INVALID_HANDLE_VALUE; // MAX: 256 + 64 + 64 + 64 + 64 - FOUNDINFO tmp = { base, ((overlay & 0xFF) << 18) | ((overlay2 & 0x3F) << 12) | ((overlay3 & 0x3F) << 6) | (overlay4 & 0x3F) }; + FOUNDINFO tmp = { base->idx, 0 }; + if (overlay1) tmp.iOverlay += ((overlay1->idx & 0xFF) << 18); + if (overlay2) tmp.iOverlay += ((overlay2->idx & 0x3F) << 12); + if (overlay3) tmp.iOverlay += ((overlay3->idx & 0x3F) << 6); + if (overlay4) tmp.iOverlay += (overlay4->idx & 0x3F); + auto *F = arFI.find(&tmp); if (F != nullptr) return F->hRegisteredImage; // not found - then add F = new FOUNDINFO(tmp); - HICON hIcon = CreateIconFromIndexes(base, overlay, overlay2, overlay3, overlay4); + HICON hIcon = CreateIconFromIndexes(base, overlay1, overlay2, overlay3, overlay4); if (hIcon != nullptr) { F->hRegisteredImage = ExtraIcon_AddIcon(hIcon); DestroyIcon(hIcon); @@ -718,12 +599,12 @@ static INT_PTR ServiceGetClientIconW(WPARAM wParam, LPARAM) if (wszMirVer == nullptr) return 0; - int base, overlay, overlay2, overlay3, overlay4; - GetIconsIndexes(wszMirVer, &base, &overlay, &overlay2, &overlay3, &overlay4); + KN_FP_MASK *base, *overlay1, *overlay2, *overlay3, *overlay4; + GetIconsIndexes(wszMirVer, base, overlay1, overlay2, overlay3, overlay4); HICON hIcon = nullptr; // returned HICON - if (base != -1) - hIcon = CreateIconFromIndexes(base, overlay, overlay2, overlay3, overlay4); + if (base != nullptr) + hIcon = CreateIconFromIndexes(base, overlay1, overlay2, overlay3, overlay4); return (INT_PTR)hIcon; } @@ -744,11 +625,11 @@ static INT_PTR ServiceGetClientDescrW(WPARAM wParam, LPARAM) LPWSTR wszMirVerUp = NEWWSTR_ALLOCA(wszMirVer); _wcsupr(wszMirVerUp); if (mir_wstrcmp(wszMirVerUp, L"?") == 0) - return (INT_PTR)def_kn_fp_mask[UNKNOWN_MASK_NUMBER].szClientDescription; + return (INT_PTR)g_pUnknown->szClientDescription; - for (int index = 0; index < DEFAULT_KN_FP_MASK_COUNT; index++) - if (WildCompare(wszMirVerUp, def_kn_fp_mask[index].szMaskUpper)) - return (INT_PTR)def_kn_fp_mask[index].szClientDescription; + for (auto &it : g_arCommon) + if (WildCompare(wszMirVerUp, it->szMaskUpper)) + return (INT_PTR)it->szClientDescription; return NULL; } @@ -877,7 +758,7 @@ int OnModulesLoaded(WPARAM, LPARAM) { g_LPCodePage = Langpack_GetDefaultCodePage(); - //Hook necessary events + // Hook necessary events HookEvent(ME_SKIN_ICONSCHANGED, OnIconsChanged); HookEvent(ME_MSG_WINDOWEVENT, OnSrmmWindowEvent); diff --git a/plugins/FingerprintNG/src/main.cpp b/plugins/FingerprintNG/src/main.cpp index aaabd2d796..02597e41cf 100644 --- a/plugins/FingerprintNG/src/main.cpp +++ b/plugins/FingerprintNG/src/main.cpp @@ -60,6 +60,7 @@ int CMPlugin::Load(void) int CMPlugin::Unload() { HeapDestroy(hHeap); + UnregisterCustomIcons(); ClearFI(); return 0; } diff --git a/plugins/FingerprintNG/src/masks.cpp b/plugins/FingerprintNG/src/masks.cpp index c87335b7c1..16793628f6 100644 --- a/plugins/FingerprintNG/src/masks.cpp +++ b/plugins/FingerprintNG/src/masks.cpp @@ -46,11 +46,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * In order to get "Unknown" client, last mask should be "?*". */ -KN_FP_MASK def_kn_fp_mask[] = -{// {"Client_IconName", L"|^*Mask*|*names*", L"Icon caption", IDI_RESOURCE_ID, CLIENT_CASE, OVERLAY? }, - //######################################################################################################################################################################### - //################################# MIRANDA ########################################################################################################################### - //######################################################################################################################################################################### +static KN_FP_MASK def_kn_fp_mask[] = +{ + ///////////////////////////////////////////////////////////////////////////////////////// + // MIRANDA { "client_Miranda_NG", L"|*nightly.miranda.im*" L"|*Miranda*NG*" _A2W(MIRANDA_VERSION_CORE_STRING) L"*", L"Miranda NG", IDI_MIRANDA_NG, MIRANDA_CASE }, @@ -72,9 +71,9 @@ KN_FP_MASK def_kn_fp_mask[] = { "client_Miranda_unknown", L"*Miranda*", LPGENW("Miranda (unknown)"), IDI_MIRANDA_UNKNOWN, MIRANDA_CASE }, - //######################################################################################################################################################################### - //################################# MULTI-PROTOCOL #################################################################################################################### - //######################################################################################################################################################################### + ///////////////////////////////////////////////////////////////////////////////////////// + // MULTI-PROTOCOL + { "client_1&1", L"|*Pocket*Web*|*1&1*|*1*?nd*1", L"1&1", IDI_1UND1, MULTI_CASE, TRUE }, { "client_Asia", L"*Asia*", L"Asia", IDI_ASIA, MULTI_CASE, TRUE }, { "client_Adium", L"|*Adium*" @@ -189,17 +188,17 @@ KN_FP_MASK def_kn_fp_mask[] = { "client_Yeigo", L"*Yeigo*", L"Yeigo", IDI_YEIGO, MULTI_CASE, TRUE }, { "client_Yoono", L"*Yoono*", L"Yoono", IDI_YOONO, MULTI_CASE, TRUE }, - //######################################################################################################################################################################### - //################################# ICQ ############################################################################################################################### - //######################################################################################################################################################################### + ///////////////////////////////////////////////////////////////////////////////////////// + // ICQ + { "client_Mandarin_IM", L"Mandarin IM*", L"Mandarin IM", IDI_MANDARIN_IM, ICQ_CASE, TRUE }, { "client_R&Q", L"|R&Q*|&RQ*", L"R&Q", IDI_RANDQ, ICQ_CASE, TRUE }, { "client_ICQ_all", L"|ICQ?|ICQ?.?|ICQ *|ICQ2*|ICQ", L"ICQ client", IDI_ICQ, ICQ_CASE }, - //######################################################################################################################################################################### - //################################# JABBER ############################################################################################################################ - //######################################################################################################################################################################### + ///////////////////////////////////////////////////////////////////////////////////////// + // JABBER + { "client_Akeni", L"*Akeni*", L"Akeni", IDI_AKENI, JABBER_CASE, TRUE }, { "client_Ambrosia", L"*Ambrosia*", L"Ambrosia XMPP Server", IDI_AMBROSIA, JABBER_CASE, TRUE }, { "client_AnothRSSBot", L"|*Anothrbot*|*Anothr Rss Bot*", L"Anothr Rss Bot", IDI_ANOTHRSSBOT, JABBER_CASE, TRUE }, @@ -396,7 +395,6 @@ KN_FP_MASK def_kn_fp_mask[] = { "client_schuelervz", L"*schuelervz*", L"SchulerVZ", IDI_SCHULERVZ, JABBER_CASE, TRUE }, { "client_studivz", L"*studivz*", L"StudiVZ", IDI_STUDIVZ, JABBER_CASE, TRUE }, { "client_tkchat", L"*tkchat*", L"tkchat", IDI_TKCHAT, JABBER_CASE, TRUE }, - // {"client_uJabber", L"*uJabber*", L"uJabber", IDI_UJABBER, JABBER_CASE, TRUE }, { "client_uKeeper", L"*uKeeper*", L"uKeeper", IDI_UKEEPER, JABBER_CASE, TRUE }, { "client_whoisbot", L"whoisbot", L"Swissjabber Whois Bot", IDI_WHOISBOT, JABBER_CASE, TRUE }, { "client_xeus2", L"*xeus 2*", L"xeus 2", IDI_XEUS2, JABBER_CASE, TRUE }, @@ -405,9 +403,9 @@ KN_FP_MASK def_kn_fp_mask[] = L"|*Я.Онлайн*|*Яндекс*", L"Ya.Online", IDI_YAONLINE, JABBER_CASE, TRUE }, { "client_yaxim", L"*yaxim*", L"yaxim", IDI_YAXIM, JABBER_CASE, TRUE }, - //######################################################################################################################################################################### - //################################# IRC ############################################################################################################################### - //######################################################################################################################################################################### + ///////////////////////////////////////////////////////////////////////////////////////// + // IRC + { "client_AmIRC", L"*AmIRC*", L"AmIRC", IDI_AMIRC, IRC_CASE, TRUE }, { "client_Babbel", L"*Babbel*", L"Babbel", IDI_BABBEL, IRC_CASE, TRUE }, { "client_BersIRC", L"*BersIRC*", L"BersIRC", IDI_BERSIRC, IRC_CASE, TRUE }, @@ -474,9 +472,9 @@ KN_FP_MASK def_kn_fp_mask[] = { "client_IRCUnknown", L"*IRC*", L"Unknown IRC client", IDI_IRC, IRC_CASE, TRUE }, - //######################################################################################################################################################################### - //################################# WEATHER ########################################################################################################################### - //######################################################################################################################################################################### + ///////////////////////////////////////////////////////////////////////////////////////// + // WEATHER + { "client_accu", L"*accuweather*", L"AccuWeather", IDI_ACCU, WEATHER_CASE, TRUE }, { "client_gismeteo", L"*gismeteo*", L"GisMeteo", IDI_GISMETEO, WEATHER_CASE, TRUE }, { "client_intelli", L"*intellicast*", L"Intellicast", IDI_INTELLI, WEATHER_CASE, TRUE }, @@ -491,40 +489,40 @@ KN_FP_MASK def_kn_fp_mask[] = { "client_weather_cn", L"*weather.com.cn*", L"Weather CN", IDI_WEATHER_CN, WEATHER_CASE, TRUE }, { "client_weather", L"*weather*", L"Weather", IDI_WEATHER, WEATHER_CASE, TRUE }, - //######################################################################################################################################################################### - //################################# RSS ############################################################################################################################### - //######################################################################################################################################################################### + ///////////////////////////////////////////////////////////////////////////////////////// + // RSS + { "client_rss09x", L"*RSS*0.9*", L"RSS 0.9x", IDI_RSS09, RSS_CASE, TRUE }, { "client_rss2", L"*RSS*2.*", L"RSS 2", IDI_RSS2, RSS_CASE, TRUE }, { "client_rss1", L"*RSS*1.*", L"RSS 1", IDI_RSS1, RSS_CASE, TRUE }, { "client_atom3", L"*Atom*3*", L"Atom 3", IDI_ATOM3, RSS_CASE, TRUE }, { "client_atom1", L"*Atom*1*", L"Atom 1", IDI_ATOM1, RSS_CASE, TRUE }, - //######################################################################################################################################################################### - //################################# GADU-GADU ######################################################################################################################### - //######################################################################################################################################################################### + ///////////////////////////////////////////////////////////////////////////////////////// + // GADU-GADU + { "client_GG", L"|Gadu-Gadu*|GG*", LPGENW("Gadu-Gadu client"), IDI_GG, GG_CASE }, - //######################################################################################################################################################################### - //################################# Facebook ########################################################################################################################## - //######################################################################################################################################################################### + ///////////////////////////////////////////////////////////////////////////////////////// + // Facebook + { "client_Facebook_other", L"*Facebook*other*", L"Facebook (other)", IDI_FACEBOOK_OTHER, FACEBOOK_CASE }, { "client_Facebook_app", L"*Facebook*App*", L"Facebook App", IDI_FACEBOOK_APP, FACEBOOK_CASE }, { "client_Facebook_mess", L"*Facebook*Messenger*", L"Facebook Messenger", IDI_FACEBOOK_MESSENGER, FACEBOOK_CASE }, { "client_Facebook", L"*Facebook*", L"Facebook", IDI_FACEBOOK, FACEBOOK_CASE }, - //######################################################################################################################################################################### - //################################# VKontakte ######################################################################################################################### - //######################################################################################################################################################################### + ///////////////////////////////////////////////////////////////////////////////////////// + // VKontakte + { "client_VK", L"|*VKontakte*|*vk.com*", L"VKontakte", IDI_VK, VK_CASE }, { "client_VK_Kate", L"*Kate*Mobile*", L"Kate Mobile", IDI_VK_KATE, VK_CASE }, { "client_VK_Messenger", L"VK Messenger*", L"VK Messenger", IDI_VK_MESSENGER, VK_CASE }, { "client_VK_Phoenix_Full", L"Phoenix*Full*", L"Phoenix Full", IDI_VK_PHOENIX_FULL, VK_CASE }, { "client_VK_Phoenix_Lite", L"Phoenix*Lite*", L"Phoenix Lite", IDI_VK_PHOENIX_LITE, VK_CASE }, - //######################################################################################################################################################################### - //################################# OTHER CLIENTS ##################################################################################################################### - //######################################################################################################################################################################### + ///////////////////////////////////////////////////////////////////////////////////////// + // OTHER CLIENTS + { "client_Android", L"Android*", L"Android", IDI_ANDROID, MULTI_CASE, TRUE }, { "client_Pidgin", L"|*Pidgin*|*libpurple*|Purple*", L"Pidgin (libpurple)", IDI_PIDGIN, MULTI_CASE }, @@ -543,27 +541,22 @@ KN_FP_MASK def_kn_fp_mask[] = { "client_Steam", L"*Steam*", L"Steam", IDI_STEAM, OTHER_PROTOS_CASE }, - //######################################################################################################################################################################### - //################################# UNDEFINED CLIENTS ################################################################################################################# - //######################################################################################################################################################################### + ///////////////////////////////////////////////////////////////////////////////////////// + // UNDEFINED CLIENTS { "client_Notfound", L"Notfound", LPGENW("Client not found"), IDI_NOTFOUND, OTHERS_CASE, TRUE }, { "client_Unknown", L"|*Unknown*|...", LPGENW("Unknown client"), IDI_UNKNOWN, OTHERS_CASE, TRUE }, { "client_Undetected", L"?*", LPGENW("Undetected client"), IDI_UNDETECTED, OTHERS_CASE, TRUE }, - }; -int DEFAULT_KN_FP_MASK_COUNT = _countof(def_kn_fp_mask); +///////////////////////////////////////////////////////////////////////////////////////// +// OVERLAYS LAYER #1 -//######################################################################################################################################################################### -//################################# OVERLAYS LAYER #1 ################################################################################################################# -//######################################################################################################################################################################### +static KN_FP_MASK def_kn_fp_overlays_mask[] = +{ + ///////////////////////////////////////////////////////////////////////////////////////// + // MIRANDA PACKS OVERLAYS -KN_FP_MASK def_kn_fp_overlays_mask[] = -{// {"Client_IconName", L"|^*Mask*|*names*", L"Icon caption", IDI_RESOURCE_ID, CLIENT_CASE, OVERLAY? }, - //######################################################################################################################################################################### - //################################# MIRANDA PACKS OVERLAYS ############################################################################################################ - //######################################################################################################################################################################### { "client_AF_pack", L"*AF*Pack*", L"AF", IDI_MIRANDA_AF, MIRANDA_PACKS_CASE }, { "client_AlfaMaR_pack", L"*AlfaMaR*", L"AlfaMaR", IDI_MIRANDA_ALFAMAR, MIRANDA_PACKS_CASE }, { "client_Amatory_pack", L"*Amatory*", L"Amatory", IDI_MIRANDA_AMATORY, MIRANDA_PACKS_CASE }, @@ -605,9 +598,9 @@ KN_FP_MASK def_kn_fp_overlays_mask[] = { "client_dmikos_pack", L"*dmikos*", L"Dmikos", IDI_MIRANDA_DMIKOS, MIRANDA_PACKS_CASE }, { "client_zeleboba_pack", L"*zeleboba*", L"zeleboba's", IDI_MIRANDA_ZELEBOBA, MIRANDA_PACKS_CASE }, - //######################################################################################################################################################################### - //################################# PROTO OVERLAYS #################################################################################################################### - //######################################################################################################################################################################### + ///////////////////////////////////////////////////////////////////////////////////////// + // PROTO OVERLAYS + { "client_ICQ_overlay", L"|^ICQ|^ICQ*|*ICQ*", LPGENW("ICQ overlay"), IDI_ICQ_OVERLAY, OVERLAYS_PROTO_CASE }, { "client_IRC_overlay", L"|^IRC*|Miranda*IRC*", LPGENW("IRC overlay"), IDI_IRC_OVERLAY, OVERLAYS_PROTO_CASE }, { "client_JGmail_overlay", L"*JGmail*", LPGENW("JGmail overlay"), IDI_GMAIL_OVERLAY, OVERLAYS_PROTO_CASE }, @@ -616,9 +609,9 @@ KN_FP_MASK def_kn_fp_overlays_mask[] = { "client_VK_overlay", L"|Miranda*VKontakte*", LPGENW("VK overlay"), IDI_VK_OVERLAY, OVERLAYS_PROTO_CASE }, { "client_Skype_overlay", L"|Miranda*Skype*", LPGENW("Skype overlay"), IDI_SKYPE_OVERLAY, OVERLAYS_PROTO_CASE }, - //######################################################################################################################################################################### - //################################# CLIENT VERSION OVERLAYS ########################################################################################################### - //######################################################################################################################################################################### + ///////////////////////////////////////////////////////////////////////////////////////// + // CLIENT VERSION OVERLAYS + { "client_ICQ8_over", L"ICQ*8*", LPGENW("ICQ v8.x overlay"), IDI_ICQ8_OVERLAY, ICQ_CASE }, { "client_GG_11", L"|Gadu-Gadu*11*|GG*11*", LPGENW("Gadu-Gadu v11 client"), IDI_GG11_OVERLAY, GG_CASE }, @@ -626,9 +619,9 @@ KN_FP_MASK def_kn_fp_overlays_mask[] = { "client_GG_9", L"|Gadu-Gadu*9*|GG*9*", LPGENW("Gadu-Gadu v9 client"), IDI_GG9_OVERLAY, GG_CASE }, { "client_GG_8", L"|Gadu-Gadu*8*|GG*8*", LPGENW("Gadu-Gadu v8 client"), IDI_GG8_OVERLAY, GG_CASE }, - //######################################################################################################################################################################### - //################################# PLATFORM OVERLAYS ################################################################################################################# - //######################################################################################################################################################################### + ///////////////////////////////////////////////////////////////////////////////////////// + // PLATFORM OVERLAYS + { "client_on_Win32", L"|*Win*|* WM *|wmagent*|*Vista*", LPGENW("Windows overlay"), IDI_PLATFORM_WIN, OVERLAYS_PLATFORM_CASE }, { "client_on_iOS", L"|*ipad*|*iphone*|*iOS*", LPGENW("iOS overlay (iPhone/iPad)"), IDI_PLATFORM_IOS, OVERLAYS_PLATFORM_CASE }, { "client_on_Mac", L"|^*smack*|* Mac *|*mac*|*OSX*", LPGENW("MacOS overlay"), IDI_PLATFORM_MAC, OVERLAYS_PLATFORM_CASE }, @@ -645,14 +638,11 @@ KN_FP_MASK def_kn_fp_overlays_mask[] = int DEFAULT_KN_FP_OVERLAYS_COUNT = _countof(def_kn_fp_overlays_mask); -//######################################################################################################################################################################### -//######################################################################################################################################################################### -//################################# OVERLAYS LAYER #2 ################################################################################################################# -//######################################################################################################################################################################### -//######################################################################################################################################################################### +///////////////////////////////////////////////////////////////////////////////////////// +// OVERLAYS LAYER #2 -KN_FP_MASK def_kn_fp_overlays2_mask[] = -{// {"Client_IconName", L"|^*Mask*|*names*", L"Icon caption", IDI_RESOURCE_ID, CLIENT_CASE, OVERLAY? }, +static KN_FP_MASK def_kn_fp_overlays2_mask1[] = +{ { "client_debug_overlay", L"|*[*debug*]*|*test*|*тест*", LPGENW("debug overlay"), IDI_DEBUG_OVERLAY, OVERLAYS_RESOURCE_CASE }, { "client_office_overlay", L"|*[*office*]*|*[*офис*]*", LPGENW("office overlay"), IDI_OFFICE_OVERLAY, OVERLAYS_RESOURCE_CASE }, { "client_mobile_overlay", L"|*[*mobile*]*|*[*pda*]*", LPGENW("mobile overlay"), IDI_MOBILE_OVERLAY, OVERLAYS_RESOURCE_CASE }, @@ -664,12 +654,11 @@ KN_FP_MASK def_kn_fp_overlays2_mask[] = { "client_note_overlay", L"|*[*note*]*|*[*laptop*]*" L"|*[*нетбу*]*|*[*ноут*]*|*[*ноте*]*" L"|*[*кирпич*]*|*[*portable*]*" - L"|*[*flash*]*|*[*usb*]*", LPGENW("notebook overlay"), IDI_NOTEBOOK_OVERLAY, OVERLAYS_RESOURCE_CASE }, - - // {"client_MirNG_09_over", L"*Miranda*NG*\?.\?\?.9.*", L"Miranda NG v0.9 #2 overlay", IDI_MIRANDA_NG_V9, MIRANDA_VERSION_CASE }, - // {"client_MirNG_08_over", L"*Miranda*NG*\?.\?\?.8.*", L"Miranda NG v0.8 #2 overlay", IDI_MIRANDA_NG_V8, MIRANDA_VERSION_CASE }, - // {"client_MirNG_07_over", L"*Miranda*NG*\?.\?\?.7.*", L"Miranda NG v0.7 #2 overlay", IDI_MIRANDA_NG_V7, MIRANDA_VERSION_CASE }, + L"|*[*flash*]*|*[*usb*]*", LPGENW("notebook overlay"), IDI_NOTEBOOK_OVERLAY, OVERLAYS_RESOURCE_CASE } +}; +static KN_FP_MASK def_kn_fp_overlays2_mask0[] = +{ { "client_MirNG_06_over", L"*Miranda*NG*\?.\?\?.6.*", LPGENW("Miranda NG v0.6 #2 overlay"), IDI_MIRANDA_NG_V6, MIRANDA_VERSION_CASE }, { "client_MirNG_05_over", L"*Miranda*NG*\?.\?\?.5.*", LPGENW("Miranda NG v0.5 #2 overlay"), IDI_MIRANDA_NG_V5, MIRANDA_VERSION_CASE }, { "client_MirNG_04_over", L"*Miranda*NG*\?.\?\?.4.*", LPGENW("Miranda NG v0.4 #2 overlay"), IDI_MIRANDA_NG_V4, MIRANDA_VERSION_CASE }, @@ -686,31 +675,66 @@ KN_FP_MASK def_kn_fp_overlays2_mask[] = { "client_MirIM_04_over", L"*Miranda*0.4.*", LPGENW("Miranda IM v0.4 #2 overlay"), IDI_MIRANDA_IM_V4, MIRANDA_VERSION_CASE }, }; -int DEFAULT_KN_FP_OVERLAYS2_COUNT = _countof(def_kn_fp_overlays2_mask); +///////////////////////////////////////////////////////////////////////////////////////// +// OVERLAYS LAYER #3 -//######################################################################################################################################################################### -//######################################################################################################################################################################### -//############################## OVERLAYS LAYER #3 #################################################################################################################### -//######################################################################################################################################################################### -KN_FP_MASK def_kn_fp_overlays3_mask[] = -{// {"Client_IconName", L"|^*Mask*|*names*", L"Icon caption", IDI_RESOURCE_ID, CLIENT_CASE, OVERLAY? }, +static KN_FP_MASK def_kn_fp_overlays3_mask1[] = +{ { "client_platform_x64", L"|*x64*|*64*bit*", LPGENW("x64 overlay"), IDI_PLATFORM_X64, OVERLAYS_PLATFORM_CASE }, { "client_platform_x32", L"|*x32*|*32*bit*|*x86*", LPGENW("x32 overlay"), IDI_PLATFORM_X32, OVERLAYS_PLATFORM_CASE }, +}; +static KN_FP_MASK def_kn_fp_overlays3_mask0[] = +{ { "client_Unicode", L"*unicode*", LPGENW("Unicode overlay"), IDI_UNICODE_CLIENT, OVERLAYS_UNICODE_CASE }, }; -int DEFAULT_KN_FP_OVERLAYS3_COUNT = _countof(def_kn_fp_overlays3_mask); +///////////////////////////////////////////////////////////////////////////////////////// +// OVERLAYS LAYER #4 -//######################################################################################################################################################################### -//######################################################################################################################################################################### -//############################## OVERLAYS LAYER #4 #################################################################################################################### -//######################################################################################################################################################################### -KN_FP_MASK def_kn_fp_overlays4_mask[] = -{// {"Client_IconName", L"|^*Mask*|*names*", L"Icon caption", IDI_RESOURCE_ID, CLIENT_CASE, OVERLAY? }, +static KN_FP_MASK def_kn_fp_overlays4_mask[] = +{ { "client_NewGPG_over", L"*New*GPG*", LPGENW("NewGPG overlay"), IDI_NEWGPG_OVERLAY, OVERLAYS_SECURITY_CASE }, { "client_MirOTR_over", L"*Mir*OTR*", LPGENW("MirOTR overlay"), IDI_MIROTR_OVERLAY, OVERLAYS_SECURITY_CASE }, { "client_SecureIM_over", L"*Secure*IM*", LPGENW("SecureIM overlay"), IDI_SECUREIM_OVERLAY, OVERLAYS_SECURITY_CASE }, }; int DEFAULT_KN_FP_OVERLAYS4_COUNT = _countof(def_kn_fp_overlays4_mask); + +/* +* Register icons +*/ + +void RegisterIcons() +{ + if (hHeap) + HeapDestroy(hHeap); + hHeap = HeapCreate(HEAP_NO_SERIALIZE, 0, 0); + + for (auto &it : def_kn_fp_mask) + Prepare(&it, true, g_arCommon); + + for (auto &it : def_kn_fp_overlays_mask) + Prepare(&it, true, g_overlay1); + + bool bEnabled = g_plugin.getByte("GroupMirandaVersion") != 0; + for (auto &it : def_kn_fp_overlays2_mask1) + Prepare(&it, true, g_overlay2); + for (auto &it : def_kn_fp_overlays2_mask0) + Prepare(&it, bEnabled, g_overlay2); + + bEnabled = g_plugin.getByte("GroupOverlaysUnicode", 1); + for (auto &it : def_kn_fp_overlays3_mask1) + Prepare(&it, true, g_overlay3); + for (auto &it : def_kn_fp_overlays3_mask0) + Prepare(&it, bEnabled, g_overlay3); + + for (auto &it : def_kn_fp_overlays4_mask) + Prepare(&it, true, g_overlay4); + + int iCount = g_arCommon.getCount(); + g_pUnknown = g_arCommon[iCount - 2]; + g_pNotFound = g_arCommon[iCount - 3]; + + RegisterCustomIcons(); +} diff --git a/plugins/FingerprintNG/src/prepare.cpp b/plugins/FingerprintNG/src/prepare.cpp new file mode 100644 index 0000000000..f2d21000cb --- /dev/null +++ b/plugins/FingerprintNG/src/prepare.cpp @@ -0,0 +1,248 @@ +/* +Copyright (C) 2012-23 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" + +extern wchar_t g_szSkinLib[MAX_PATH]; + +/* +* Prepare +* prepares upperstring masks and registers them in IcoLib +*/ + +static wchar_t *getSectionName(int flag) +{ + switch (flag) { + case MIRANDA_CASE: + if (g_plugin.getByte("GroupMiranda", 1)) + return LPGENW("Client icons") L"/" LPGENW("Miranda clients"); + break; + + case MIRANDA_VERSION_CASE: + if (g_plugin.getByte("GroupMirandaVersion", 1)) + return LPGENW("Client icons") L"/" LPGENW("Miranda clients"); + break; + + case MIRANDA_PACKS_CASE: + if (g_plugin.getByte("GroupMirandaPacks", 1)) + return LPGENW("Client icons") L"/" LPGENW("Miranda clients") L"/" LPGENW("Pack overlays"); + break; + + case MULTI_CASE: + if (g_plugin.getByte("GroupMulti", 1)) + return LPGENW("Client icons") L"/" LPGENW("Multi-proto clients"); + break; + + case GG_CASE: + if (g_plugin.getByte("GroupGG", 1)) + return LPGENW("Client icons") L"/" LPGENW("Gadu-Gadu clients"); + break; + + case ICQ_CASE: + if (g_plugin.getByte("GroupICQ", 1)) + return LPGENW("Client icons") L"/" LPGENW("ICQ clients"); + break; + + case IRC_CASE: + if (g_plugin.getByte("GroupIRC", 1)) + return LPGENW("Client icons") L"/" LPGENW("IRC clients"); + break; + + case JABBER_CASE: + if (g_plugin.getByte("GroupJabber", 1)) + return LPGENW("Client icons") L"/" LPGENW("Jabber clients"); + break; + + case RSS_CASE: + if (g_plugin.getByte("GroupRSS", 1)) + return LPGENW("Client icons") L"/" LPGENW("RSS clients"); + break; + + case WEATHER_CASE: + if (g_plugin.getByte("GroupWeather", 1)) + return LPGENW("Client icons") L"/" LPGENW("Weather clients"); + break; + + case FACEBOOK_CASE: + if (g_plugin.getByte("GroupFacebook", 1)) + return LPGENW("Client icons") L"/" LPGENW("Facebook clients"); + break; + + case VK_CASE: + if (g_plugin.getByte("GroupVK", 1)) + return LPGENW("Client icons") L"/" LPGENW("VKontakte clients"); + break; + + case OTHER_PROTOS_CASE: + if (g_plugin.getByte("GroupOtherProtos", 1)) + return LPGENW("Client icons") L"/" LPGENW("Other protocols"); + break; + + case OTHERS_CASE: + if (g_plugin.getByte("GroupOthers", 1)) + return LPGENW("Client icons") L"/" LPGENW("Other icons"); + break; + + case OVERLAYS_RESOURCE_CASE: + if (g_plugin.getByte("GroupOverlaysResource", 1)) + return LPGENW("Client icons") L"/" LPGENW("Overlays") L"/" LPGENW("Resource"); + break; + + case OVERLAYS_PLATFORM_CASE: + if (g_plugin.getByte("GroupOverlaysPlatform", 1)) + return LPGENW("Client icons") L"/" LPGENW("Overlays") L"/" LPGENW("Platform"); + break; + + case OVERLAYS_UNICODE_CASE: + if (g_plugin.getByte("GroupOverlaysUnicode", 1)) + return LPGENW("Client icons") L"/" LPGENW("Overlays") L"/" LPGENW("Platform"); + break; + + case OVERLAYS_SECURITY_CASE: + if (g_plugin.getByte("GroupOverlaysSecurity", 1)) + return LPGENW("Client icons") L"/" LPGENW("Overlays") L"/" LPGENW("Security"); + break; + + case OVERLAYS_PROTO_CASE: + if (g_plugin.getByte("GroupOverlaysProtos", 1)) + return LPGENW("Client icons") L"/" LPGENW("Overlays") L"/" LPGENW("Protocol"); + break; + + default: + return LPGENW("Client icons"); + } + return nullptr; +} + +void Prepare(KN_FP_MASK *mask, bool bEnable, LIST &dest) +{ + mask->szMaskUpper = nullptr; + + if (mask->hIcolibItem) + IcoLib_RemoveIconByHandle(mask->hIcolibItem); + mask->hIcolibItem = nullptr; + + if (!mask->szMask || !bEnable) + return; + + size_t iMaskLen = mir_wstrlen(mask->szMask) + 1; + LPTSTR pszNewMask = (LPTSTR)HeapAlloc(hHeap, HEAP_NO_SERIALIZE, iMaskLen * sizeof(wchar_t)); + wcscpy_s(pszNewMask, iMaskLen, mask->szMask); + _wcsupr_s(pszNewMask, iMaskLen); + mask->szMaskUpper = pszNewMask; + + wchar_t destfile[MAX_PATH]; + if (mask->iIconIndex == IDI_NOTFOUND || mask->iIconIndex == IDI_UNKNOWN || mask->iIconIndex == IDI_UNDETECTED) + GetModuleFileName(g_plugin.getInst(), destfile, MAX_PATH); + else { + wcsncpy_s(destfile, g_szSkinLib, _TRUNCATE); + if (0 != _waccess(destfile, 0)) + return; + } + + LPTSTR SectName = getSectionName(mask->iSectionFlag); + if (SectName == nullptr) + return; + + SKINICONDESC sid = {}; + sid.flags = SIDF_ALL_UNICODE; + sid.section.w = SectName; + sid.pszName = mask->szIconName; + sid.description.w = mask->szClientDescription; + sid.defaultFile.w = destfile; + sid.iDefaultIndex = -mask->iIconIndex; + mask->hIcolibItem = g_plugin.addIcon(&sid); + + mask->idx = dest.getCount(); + dest.insert(mask); +} + +///////////////////////////////////////////////////////////////////////////////////////// + +static LIST arCustom(10); + +void UnregisterCustomIcons() +{ + for (auto &it : arCustom) { + if (it->hIcolibItem) + IcoLib_RemoveIconByHandle(it->hIcolibItem); + + mir_free(it->szClientDescription); + mir_free(it->szIconName); + mir_free(it->szMask); + mir_free(it); + } +} + +void RegisterCustomIcons() +{ + UnregisterCustomIcons(); + + FILE *in = _wfopen(VARSW(L"%miranda_userdata%\\fingerprint.json"), L"r"); + if (in == nullptr) + return; + + int cbSize = filelength(fileno(in)); + ptrA szJson((char*)mir_alloc(cbSize+1)); + fread(szJson, 1, cbSize, in); + fclose(in); + + JSONNode root = JSONNode::parse(szJson); + if (!root) + return; + + for (auto &it : root["masks"]) { + CMStringA szName = it["name"].as_mstring(); + CMStringW wszMask = it["mask"].as_mstring(); + CMStringW szDescription = it["descr"].as_mstring(); + if (wszMask.IsEmpty() || szName.IsEmpty() || szDescription.IsEmpty()) + continue; + + wchar_t wszFullPath[MAX_PATH]; + PathToAbsoluteW(it["iconFile"].as_mstring(), wszFullPath); + if (0 != _waccess(wszFullPath, 0)) + continue; + + LPTSTR SectName = getSectionName(it["group"].as_int()); + if (SectName == nullptr) + continue; + + auto *pMask = (KN_FP_MASK *)mir_calloc(sizeof(KN_FP_MASK)); + + int iMaskLen = wszMask.GetLength() + 1; + pMask->szMaskUpper = (LPTSTR)HeapAlloc(hHeap, HEAP_NO_SERIALIZE, iMaskLen * sizeof(wchar_t)); + wcscpy_s(pMask->szMaskUpper, iMaskLen, wszMask); + _wcsupr_s(pMask->szMaskUpper, iMaskLen); + pMask->szMask = pMask->szMaskUpper; + + pMask->iIconIndex = it["iconFile"].as_int(); + pMask->szIconName = szName.Detach(); + pMask->szClientDescription = szDescription.Detach(); + + SKINICONDESC sid = {}; + sid.flags = SIDF_ALL_UNICODE; + sid.section.w = SectName; + sid.pszName = pMask->szIconName; + sid.description.w = pMask->szClientDescription; + sid.defaultFile.w = wszFullPath; + sid.iDefaultIndex = -pMask->iIconIndex; + pMask->hIcolibItem = g_plugin.addIcon(&sid); + + pMask->idx = g_arCommon.getCount(); + g_arCommon.insert(pMask); + } +} diff --git a/plugins/FingerprintNG/src/stdafx.h b/plugins/FingerprintNG/src/stdafx.h index 091716993f..19a4607bb0 100644 --- a/plugins/FingerprintNG/src/stdafx.h +++ b/plugins/FingerprintNG/src/stdafx.h @@ -25,6 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. //Start of header // Native include #include +#include #include // Miranda IM SDK includes @@ -32,6 +33,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include +#include #include #include #include @@ -56,15 +58,16 @@ struct RGBA struct KN_FP_MASK { - LPSTR szIconName; - LPTSTR szMask; - LPTSTR szClientDescription; - int iIconIndex; - int iSectionFlag; - BOOL fNotUseOverlay; - - HANDLE hIcolibItem; - LPTSTR szMaskUpper; + LPSTR szIconName; + LPTSTR szMask; + LPTSTR szClientDescription; + int iIconIndex; + int iSectionFlag; + BOOL fNotUseOverlay; + + int idx; + HANDLE hIcolibItem; + LPTSTR szMaskUpper; }; struct FOUNDINFO @@ -118,6 +121,12 @@ void ClearFI(); void InitFingerModule(void); +void Prepare(KN_FP_MASK *mask, bool bEnable, LIST &dest); + +void RegisterIcons(); +void RegisterCustomIcons(); +void UnregisterCustomIcons(); + int OnOptInitialise(WPARAM wParam, LPARAM lParam); int OnExtraImageApply(WPARAM wParam, LPARAM lParam); @@ -132,18 +141,6 @@ void RegisterIcons(); extern HANDLE hHeap; -extern KN_FP_MASK -def_kn_fp_mask[], -def_kn_fp_overlays_mask[], -def_kn_fp_overlays1_mask[], -def_kn_fp_overlays2_mask[], -def_kn_fp_overlays3_mask[], -def_kn_fp_overlays4_mask[]; - -extern int DEFAULT_KN_FP_MASK_COUNT, DEFAULT_KN_FP_OVERLAYS_COUNT, DEFAULT_KN_FP_OVERLAYS2_COUNT, DEFAULT_KN_FP_OVERLAYS3_COUNT, DEFAULT_KN_FP_OVERLAYS4_COUNT; - -#define UNKNOWN_MASK_NUMBER (DEFAULT_KN_FP_MASK_COUNT - 2) // second from end -#define NOTFOUND_MASK_NUMBER (DEFAULT_KN_FP_MASK_COUNT - 3) // third from end -// the last count is how many masks from 2nd layer is used as Miranda version overlays (counting from the end) -#define DEFAULT_KN_FP_OVERLAYS2_NO_VER_COUNT (DEFAULT_KN_FP_OVERLAYS2_COUNT - 13) -#define DEFAULT_KN_FP_OVERLAYS3_NO_UNICODE_COUNT (DEFAULT_KN_FP_OVERLAYS3_COUNT - 1) +extern LIST g_arCommon, g_overlay1, g_overlay2, g_overlay3, g_overlay4; + +extern KN_FP_MASK *g_pNotFound, *g_pUnknown; diff --git a/plugins/FingerprintNG/src/version.h b/plugins/FingerprintNG/src/version.h index 311340c4b9..5c5567d7a2 100644 --- a/plugins/FingerprintNG/src/version.h +++ b/plugins/FingerprintNG/src/version.h @@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define __MAJOR_VERSION 0 #define __MINOR_VERSION 2 -#define __RELEASE_NUM 0 +#define __RELEASE_NUM 1 #define __BUILD_NUM 1 #include -- cgit v1.2.3