summaryrefslogtreecommitdiff
path: root/plugins/FingerprintNG/src/fingerprint.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/FingerprintNG/src/fingerprint.cpp')
-rw-r--r--plugins/FingerprintNG/src/fingerprint.cpp110
1 files changed, 40 insertions, 70 deletions
diff --git a/plugins/FingerprintNG/src/fingerprint.cpp b/plugins/FingerprintNG/src/fingerprint.cpp
index 073f43db31..6180334715 100644
--- a/plugins/FingerprintNG/src/fingerprint.cpp
+++ b/plugins/FingerprintNG/src/fingerprint.cpp
@@ -25,8 +25,14 @@ static wchar_t g_szSkinLib[MAX_PATH];
static HANDLE hExtraIcon = nullptr;
static HANDLE hFolderChanged = nullptr, hIconFolder = nullptr;
-static FOUNDINFO* fiList = nullptr;
-static int nFICount = 0;
+static int CompareFI(const FOUNDINFO *p1, const FOUNDINFO *p2)
+{
+ if (p1->iBase != p2->iBase)
+ return p1->iBase - p2->iBase;
+ return p1->iOverlay - p2->iOverlay;
+}
+
+static OBJLIST<FOUNDINFO> arFI(50, NumericKeySortT);
static LIST<void> arMonitoredWindows(3, PtrKeySortT);
@@ -180,7 +186,7 @@ int OnExtraIconClick(WPARAM wParam, LPARAM, LPARAM)
/*
-* WildCompareW
+* WildCompare
* Compare 'name' string with 'mask' strings.
* Masks can contain '*' or '?' wild symbols
* Asterics '*' symbol covers 'empty' symbol too e.g WildCompare("Tst","T*st*"), returns TRUE
@@ -202,7 +208,7 @@ int OnExtraIconClick(WPARAM wParam, LPARAM, LPARAM)
* IF Mask match - comparing stops as TRUE
* IF Mask does not not match comparing continue
*/
-BOOL __fastcall WildCompareW(LPWSTR wszName, LPWSTR wszMask)
+BOOL __fastcall WildCompare(LPWSTR wszName, LPWSTR wszMask)
{
if (wszMask == nullptr)
return NULL;
@@ -237,7 +243,7 @@ BOOL __fastcall WildCompareW(LPWSTR wszName, LPWSTR wszMask)
return FALSE;
}
-static void MatchMasks(wchar_t* szMirVer, short *base, short *overlay, short *overlay2, short *overlay3, short *overlay4)
+static void MatchMasks(wchar_t* szMirVer, int *base, int *overlay, int *overlay2, int *overlay3, int *overlay4)
{
int i = 0, j = -1, k = -1, n = -1, m = -1;
@@ -246,7 +252,7 @@ static void MatchMasks(wchar_t* szMirVer, short *base, short *overlay, short *ov
if (p.hIcolibItem == nullptr)
continue;
- if (!WildCompareW(szMirVer, p.szMaskUpper))
+ if (!WildCompare(szMirVer, p.szMaskUpper))
continue;
if (p.iIconIndex != IDI_NOTFOUND && p.iIconIndex != IDI_UNKNOWN && p.iIconIndex != IDI_UNDETECTED) {
@@ -281,7 +287,7 @@ static void MatchMasks(wchar_t* szMirVer, short *base, short *overlay, short *ov
if (p.hIcolibItem == nullptr)
continue;
- if (WildCompareW(szMirVer, p.szMaskUpper))
+ if (WildCompare(szMirVer, p.szMaskUpper))
break;
}
@@ -290,7 +296,7 @@ static void MatchMasks(wchar_t* szMirVer, short *base, short *overlay, short *ov
if (p.hIcolibItem == nullptr)
continue;
- if (WildCompareW(szMirVer, p.szMaskUpper))
+ if (WildCompare(szMirVer, p.szMaskUpper))
break;
}
@@ -299,7 +305,7 @@ static void MatchMasks(wchar_t* szMirVer, short *base, short *overlay, short *ov
if (p.hIcolibItem == nullptr)
continue;
- if (WildCompareW(szMirVer, p.szMaskUpper))
+ if (WildCompare(szMirVer, p.szMaskUpper))
break;
}
}
@@ -311,35 +317,13 @@ static void MatchMasks(wchar_t* szMirVer, short *base, short *overlay, short *ov
*overlay4 = (m < DEFAULT_KN_FP_OVERLAYS4_COUNT) ? m : -1;
}
-/* GetIconsIndexesA
-* Retrieves Icons indexes by Mirver
-*/
-
-void __fastcall GetIconsIndexesA(LPSTR szMirVer, short *base, short *overlay, short *overlay2, short *overlay3, short *overlay4)
-{
- if (mir_strcmp(szMirVer, "?") == 0) {
- *base = UNKNOWN_MASK_NUMBER;
- *overlay = -1;
- *overlay2 = -1;
- *overlay3 = -1;
- *overlay4 = -1;
- return;
- }
-
- LPTSTR tszMirVerUp = mir_a2u(szMirVer);
- wcsupr(tszMirVerUp);
- MatchMasks(tszMirVerUp, base, overlay, overlay2, overlay3, overlay4);
- mir_free(tszMirVerUp);
-}
-
-/* GetIconsIndexesW
+/* GetIconsIndexes
* Retrieves Icons indexes by Mirver
*/
-void __fastcall GetIconsIndexesW(LPWSTR wszMirVer, short *base, short *overlay, short *overlay2, short *overlay3, short *overlay4)
+void __fastcall GetIconsIndexes(LPWSTR wszMirVer, int *base, int *overlay, int *overlay2, int *overlay3, int *overlay4)
{
- if (mir_wstrcmp(wszMirVer, L"?") == 0)
- {
+ if (mir_wstrcmp(wszMirVer, L"?") == 0) {
*base = UNKNOWN_MASK_NUMBER;
*overlay = -1;
*overlay2 = -1;
@@ -358,7 +342,7 @@ void __fastcall GetIconsIndexesW(LPWSTR wszMirVer, short *base, short *overlay,
* returns hIcon of joined icon by given indexes
*/
-HICON __fastcall CreateIconFromIndexes(short base, short overlay, short overlay2, short overlay3, short overlay4)
+HICON __fastcall CreateIconFromIndexes(int base, int overlay, int overlay2, int overlay3, int overlay4)
{
HICON hIcon = nullptr; // returned HICON
HICON hTmp = nullptr;
@@ -698,48 +682,34 @@ HICON __fastcall CreateJoinedIcon(HICON hBottom, HICON hTop)
HANDLE __fastcall GetIconIndexFromFI(LPTSTR szMirVer)
{
- short base, overlay, overlay2, overlay3, overlay4;
+ int base, overlay, overlay2, overlay3, overlay4;
GetIconsIndexes(szMirVer, &base, &overlay, &overlay2, &overlay3, &overlay4);
- if (base == -1 || nFICount == 0xFFFF)
+ if (base == -1)
return INVALID_HANDLE_VALUE;
// MAX: 256 + 64 + 64 + 64 + 64
- DWORD val = (base << 24) | ((overlay & 0x3F) << 18) | ((overlay2 & 0x3F) << 12) | ((overlay3 & 0x3F) << 6) | (overlay4 & 0x3F);
-
- int i;
- HANDLE hFoundImage = INVALID_HANDLE_VALUE;
- for (i = 0; i < nFICount; i++) {
- if (fiList[i].dwArray == val) {
- hFoundImage = fiList[i].hRegisteredImage;
- break;
- }
- }
-
- if (hFoundImage == INVALID_HANDLE_VALUE && i == nFICount) { //not found - then add
- HICON hIcon = CreateIconFromIndexes(base, overlay, overlay2, overlay3, overlay4);
-
- fiList = (FOUNDINFO*)mir_realloc(fiList, sizeof(FOUNDINFO) * (nFICount + 1));
- fiList[nFICount].dwArray = val;
-
- if (hIcon != nullptr) {
- hFoundImage = ExtraIcon_AddIcon(hIcon);
- fiList[nFICount].hRegisteredImage = hFoundImage;
- DestroyIcon(hIcon);
- }
- else fiList[nFICount].hRegisteredImage = INVALID_HANDLE_VALUE;
-
- nFICount++;
+ FOUNDINFO tmp = { base, ((overlay & 0x3F) << 18) | ((overlay2 & 0x3F) << 12) | ((overlay3 & 0x3F) << 6) | (overlay4 & 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);
+ if (hIcon != nullptr) {
+ F->hRegisteredImage = ExtraIcon_AddIcon(hIcon);
+ DestroyIcon(hIcon);
}
+ else F->hRegisteredImage = INVALID_HANDLE_VALUE;
+
+ arFI.insert(F);
- return hFoundImage;
+ return F->hRegisteredImage;
}
VOID ClearFI()
{
- if (fiList != nullptr)
- mir_free(fiList);
- fiList = nullptr;
- nFICount = 0;
+ arFI.destroy();
}
/****************************************************************************************
@@ -756,8 +726,8 @@ static INT_PTR ServiceGetClientIconW(WPARAM wParam, LPARAM)
if (wszMirVer == nullptr)
return 0;
- short base, overlay, overlay2, overlay3, overlay4;
- GetIconsIndexesW(wszMirVer, &base, &overlay, &overlay2, &overlay3, &overlay4);
+ int base, overlay, overlay2, overlay3, overlay4;
+ GetIconsIndexes(wszMirVer, &base, &overlay, &overlay2, &overlay3, &overlay4);
HICON hIcon = nullptr; // returned HICON
if (base != -1)
@@ -785,7 +755,7 @@ static INT_PTR ServiceGetClientDescrW(WPARAM wParam, LPARAM)
return (INT_PTR)def_kn_fp_mask[UNKNOWN_MASK_NUMBER].szClientDescription;
for (int index = 0; index < DEFAULT_KN_FP_MASK_COUNT; index++)
- if (WildCompareW(wszMirVerUp, def_kn_fp_mask[index].szMaskUpper))
+ if (WildCompare(wszMirVerUp, def_kn_fp_mask[index].szMaskUpper))
return (INT_PTR)def_kn_fp_mask[index].szClientDescription;
return NULL;