diff options
author | George Hazan <ghazan@miranda.im> | 2023-04-30 20:20:36 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2023-04-30 20:20:36 +0300 |
commit | f117a5141791cccca74bd1c242d44fb5f1ee96f3 (patch) | |
tree | 8c8b9be0c15bc07eeb3c1f1f0aad5a3e57d82780 /plugins/FingerprintNG | |
parent | 12121efe8dc8ebc416680d16707861b0d6e4fde3 (diff) |
fixes #966 (Adding a New Client Type to FingerPrint)
Diffstat (limited to 'plugins/FingerprintNG')
-rw-r--r-- | plugins/FingerprintNG/fingerprint_ng.vcxproj | 2 | ||||
-rw-r--r-- | plugins/FingerprintNG/fingerprint_ng.vcxproj.filters | 6 | ||||
-rw-r--r-- | plugins/FingerprintNG/src/finger_groups.h | 97 | ||||
-rw-r--r-- | plugins/FingerprintNG/src/fingerprint.cpp | 269 | ||||
-rw-r--r-- | plugins/FingerprintNG/src/main.cpp | 1 | ||||
-rw-r--r-- | plugins/FingerprintNG/src/masks.cpp | 192 | ||||
-rw-r--r-- | plugins/FingerprintNG/src/prepare.cpp | 248 | ||||
-rw-r--r-- | plugins/FingerprintNG/src/stdafx.h | 45 | ||||
-rw-r--r-- | plugins/FingerprintNG/src/version.h | 2 |
9 files changed, 458 insertions, 404 deletions
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 @@ <ClCompile Include="src\main.cpp" />
<ClCompile Include="src\masks.cpp" />
<ClCompile Include="src\options.cpp" />
+ <ClCompile Include="src\prepare.cpp" />
<ClCompile Include="src\stdafx.cxx">
<PrecompiledHeader>Create</PrecompiledHeader>
</ClCompile>
- <ClInclude Include="src\finger_groups.h" />
<ClInclude Include="src\resource.h" />
<ClInclude Include="src\stdafx.h" />
<ClInclude Include="src\version.h" />
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 @@ <ClCompile Include="src\stdafx.cxx">
<Filter>Source Files</Filter>
</ClCompile>
+ <ClCompile Include="src\prepare.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
- <ClInclude Include="src\finger_groups.h">
- <Filter>Header Files</Filter>
- </ClInclude>
<ClInclude Include="src\resource.h">
<Filter>Header Files</Filter>
</ClInclude>
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<KN_FP_MASK> 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<void> 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 <http://www.gnu.org/licenses/>. +*/ + +#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<KN_FP_MASK> &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<KN_FP_MASK> 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 <windows.h>
+#include <io.h>
#include <malloc.h>
// Miranda IM SDK includes
@@ -32,6 +33,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include <m_database.h>
#include <m_langpack.h>
#include <m_icolib.h>
+#include <m_json.h>
#include <m_options.h>
#include <m_protocols.h>
#include <m_userinfo.h>
@@ -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<KN_FP_MASK> &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<KN_FP_MASK> 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 <stdver.h>
|