From 205b13d4bca365dca8874cb8a05a15f6d7870e3b Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Sun, 18 Nov 2012 18:15:18 +0000 Subject: new generation of fingerprint plugin git-svn-id: http://svn.miranda-ng.org/main/trunk@2360 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/FingerprintNG/src/finger_groups.h | 127 ++++ plugins/FingerprintNG/src/fingerprint.cpp | 1102 +++++++++++++++++++++++++++++ plugins/FingerprintNG/src/global.h | 190 +++++ plugins/FingerprintNG/src/main.cpp | 111 +++ plugins/FingerprintNG/src/masks.cpp | 812 +++++++++++++++++++++ plugins/FingerprintNG/src/options.cpp | 163 +++++ plugins/FingerprintNG/src/resource.h | 727 +++++++++++++++++++ plugins/FingerprintNG/src/utilities.cpp | 320 +++++++++ plugins/FingerprintNG/src/utilities.h | 32 + plugins/FingerprintNG/src/version.h | 45 ++ 10 files changed, 3629 insertions(+) create mode 100644 plugins/FingerprintNG/src/finger_groups.h create mode 100644 plugins/FingerprintNG/src/fingerprint.cpp create mode 100644 plugins/FingerprintNG/src/global.h create mode 100644 plugins/FingerprintNG/src/main.cpp create mode 100644 plugins/FingerprintNG/src/masks.cpp create mode 100644 plugins/FingerprintNG/src/options.cpp create mode 100644 plugins/FingerprintNG/src/resource.h create mode 100644 plugins/FingerprintNG/src/utilities.cpp create mode 100644 plugins/FingerprintNG/src/utilities.h create mode 100644 plugins/FingerprintNG/src/version.h (limited to 'plugins/FingerprintNG/src') diff --git a/plugins/FingerprintNG/src/finger_groups.h b/plugins/FingerprintNG/src/finger_groups.h new file mode 100644 index 0000000000..8fb4332fe4 --- /dev/null +++ b/plugins/FingerprintNG/src/finger_groups.h @@ -0,0 +1,127 @@ +case MIRANDA_CASE: + if ( db_get_b(NULL, "Finger", "GroupMiranda", 1)) + return _T("Client Icons/Miranda clients"); + break; +case MIRANDA_VERSION_CASE: + if ( db_get_b(NULL, "Finger", "GroupMirandaVersion", 1)) + return _T("Client Icons/Miranda clients"); + break; +case MIRANDA_PACKS_CASE: + if ( db_get_b(NULL, "Finger", "GroupMirandaPacks", 1)) + return _T("Client Icons/Miranda clients/pack overlays"); + break; + + +case MULTI_CASE: + if ( db_get_b(NULL, "Finger", "GroupMulti", 1)) + return _T("Client Icons/multi-proto clients"); + break; + + +case AIM_CASE: + if ( db_get_b(NULL, "Finger", "GroupAIM", 1)) + return _T("Client Icons/AIM clients"); + break; + +case GG_CASE: + if ( db_get_b(NULL, "Finger", "GroupGG", 1)) + return _T("Client Icons/Gadu-Gadu clients"); + break; + + +case ICQ_OFFICIAL_CASE: + if ( db_get_b(NULL, "Finger", "GroupICQ", 1)) + return _T("Client Icons/ICQ official clients"); + break; +case ICQ_CASE: + if ( db_get_b(NULL, "Finger", "GroupICQ", 1)) + return _T("Client Icons/ICQ clients"); + break; + + +case IRC_CASE: + if ( db_get_b(NULL, "Finger", "GroupIRC", 1)) + return _T("Client Icons/IRC clients"); + break; + +case JABBER_CASE: + if ( db_get_b(NULL, "Finger", "GroupJabber", 1)) + return _T("Client Icons/Jabber clients"); + break; + +case MRA_CASE: + if ( db_get_b(NULL, "Finger", "GroupMRA", 1)) + return _T("Client Icons/MRA clients"); + break; + +case MSN_CASE: + if ( db_get_b(NULL, "Finger", "GroupMSN", 1)) + return _T("Client Icons/MSN clients"); + break; + +case QQ_CASE: + if ( db_get_b(NULL, "Finger", "GroupQQ", 1)) + return _T("Client Icons/QQ clients"); + break; + +case RSS_CASE: + if ( db_get_b(NULL, "Finger", "GroupRSS", 1)) + return _T("Client Icons/RSS clients"); + break; + +case TLEN_CASE: + if ( db_get_b(NULL, "Finger", "GroupTlen", 1)) + return _T("Client Icons/Tlen clients"); + break; + +case WEATHER_CASE: + if ( db_get_b(NULL, "Finger", "GroupWeather", 1)) + return _T("Client Icons/Weather clients"); + break; + +case YAHOO_CASE: + if ( db_get_b(NULL, "Finger", "GroupYahoo", 1)) + return _T("Client Icons/Yahoo clients"); + break; + + +case OTHER_PROTOS_CASE: + if ( db_get_b(NULL, "Finger", "GroupOtherProtos", 1)) + return _T("Client Icons/other protocols"); + break; + +case OTHERS_CASE: + if ( db_get_b(NULL, "Finger", "GroupOthers", 1)) + return _T("Client Icons/other icons"); + break; + + +case OVERLAYS_RESOURCE_CASE: + if ( db_get_b(NULL, "Finger", "GroupOverlaysResource", 1)) + return _T("Client Icons/overlays/resource"); + break; + +case OVERLAYS_PLATFORM_CASE: + if ( db_get_b(NULL, "Finger", "GroupOverlaysPlatform", 1)) + return _T("Client Icons/overlays/platform"); + break; + +case OVERLAYS_PROTO_CASE: + if ( db_get_b(NULL, "Finger", "GroupOverlaysProtos", 1)) + return _T("Client Icons/overlays/protocol"); + break; + +case OVERLAYS_SECURITY_CASE: + if ( db_get_b(NULL, "Finger", "GroupOtherProtos", 1)) + return _T("Client Icons/overlays/security"); + break; + +/* +case OVERLAYS_RESOURCE_ALT_CASE: + if ( db_get_b(NULL, "Finger", "GroupOverlays", 1)) + return _T("Client Icons/overlays"); + break; +*/ + +default: + return _T("Client Icons"); diff --git a/plugins/FingerprintNG/src/fingerprint.cpp b/plugins/FingerprintNG/src/fingerprint.cpp new file mode 100644 index 0000000000..c191152f60 --- /dev/null +++ b/plugins/FingerprintNG/src/fingerprint.cpp @@ -0,0 +1,1102 @@ +/* +Fingerprint NG (client version) icons module for Miranda NG +Copyright © 2006-12 ghazan, mataes, HierOS, FYR, Bio, nullbie, faith_healer and all respective contributors. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +//Start of header +#include "global.h" + +static UINT g_LPCodePage; +static TCHAR g_szSkinLib[MAX_PATH]; +static HANDLE hExtraIcon = NULL; +static HANDLE hFolderChanged = NULL, hIconFolder = NULL; + +static FOUNDINFO* fiList = NULL; +static int nFICount = 0; + +/* +* Prepare +* prepares upperstring masks and registers them in IcoLib +*/ + +static TCHAR* getSectionName(int flag) +{ + switch(flag) + { + #include "finger_groups.h" + } + return NULL; +} + +void FASTCALL Prepare(KN_FP_MASK* mask, bool bEnable) +{ + mask->szMaskUpper = NULL; + + if (mask->hIcolibItem) + Skin_RemoveIcon(mask->szIconName); + mask->hIcolibItem = NULL; + + if (!mask->szMask || !mask->szIconFileName || !bEnable) + return; + + size_t iMaskLen = _tcslen(mask->szMask) + 1; + LPTSTR pszNewMask = (LPTSTR)HeapAlloc(hHeap, HEAP_NO_SERIALIZE, iMaskLen * sizeof(TCHAR)); + _tcscpy_s(pszNewMask, iMaskLen, mask->szMask); + _tcsupr_s(pszNewMask, iMaskLen); + mask->szMaskUpper = pszNewMask; + + TCHAR destfile[MAX_PATH]; + if (*mask->szIconFileName == 0) + GetModuleFileName(g_hInst, destfile, MAX_PATH); + else { + mir_sntprintf(destfile, SIZEOF(destfile), _T("%s\\%s.dll"), g_szSkinLib, mask->szIconFileName); + + struct _stat64i32 stFileInfo; + if ( _tstat(destfile, &stFileInfo) == -1) + return; + } + + LPTSTR SectName = getSectionName(mask->iSectionFlag); + if (SectName == NULL) + return; + + SKINICONDESC sid = { 0 }; + sid.cbSize = sizeof(sid); + sid.flags = SIDF_ALL_TCHAR; + sid.ptszSection = SectName; + sid.pszName = mask->szIconName; + sid.ptszDescription = mask->szClientDescription; + sid.ptszDefaultFile = destfile; + sid.iDefaultIndex = -mask->iIconIndex; + sid.cx = sid.cy = 16; + mask->hIcolibItem = Skin_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); + + bool bEnable = db_get_b(NULL, "Finger", "Overlay1", 1) != 0; + for (i=0; i < DEFAULT_KN_FP_OVERLAYS_COUNT; i++) + Prepare(&def_kn_fp_overlays_mask[i], bEnable); + + bEnable = db_get_b(NULL, "Finger", "Overlay2", 1) != 0; + if ( db_get_b(NULL, "Finger", "ShowVersion", 0)) { + for (i = 0; i < DEFAULT_KN_FP_OVERLAYS2_COUNT; i++) + Prepare(&def_kn_fp_overlays2_mask[i], bEnable); + } + else { + for (i=0; i < DEFAULT_KN_FP_OVERLAYS2_NO_VER_COUNT; i++) + Prepare(&def_kn_fp_overlays2_mask[i], bEnable); + for (; i < DEFAULT_KN_FP_OVERLAYS2_COUNT; i++) + Prepare(&def_kn_fp_overlays2_mask[i], false); + } + + bEnable = db_get_b(NULL, "Finger", "Overlay3", 1) != 0; + for (i=0; i < DEFAULT_KN_FP_OVERLAYS3_COUNT; i++) + Prepare(&def_kn_fp_overlays3_mask[i], bEnable); +} + +/* +* OnModulesLoaded +* Hook necessary events here +*/ +int OnModulesLoaded(WPARAM wParam, LPARAM lParam) +{ + g_LPCodePage = CallService(MS_LANGPACK_GETCODEPAGE, 0, 0); + + //Hook necessary events + HookEvent(ME_SKIN2_ICONSCHANGED, OnIconsChanged); + HookEvent(ME_DB_CONTACT_SETTINGCHANGED, OnContactSettingChanged); + HookEvent(ME_OPT_INITIALISE, OnOptInitialise); + + hExtraIcon = ExtraIcon_Register("Client","Fingerprint","client_Miranda_Unknown", + OnExtraIconListRebuild,OnExtraImageApply,OnExtraIconClick); + + if (ServiceExists(MS_FOLDERS_REGISTER_PATH)) { + hIconFolder = FoldersRegisterCustomPathT("Fingerprint", "Icons", _T(MIRANDA_PATH) _T("\\") DEFAULT_SKIN_FOLDER); + FoldersGetCustomPathT(hIconFolder, g_szSkinLib, SIZEOF(g_szSkinLib), _T("")); + } + else CallService(MS_UTILS_PATHTOABSOLUTET, (WPARAM)DEFAULT_SKIN_FOLDER, (LPARAM)g_szSkinLib); + + RegisterIcons(); + return 0; +} + +/* ApplyFingerprintImage +* 1)Try to find appropriate mask +* 2)Register icon in extraimage list if not yet registered (EMPTY_EXTRA_ICON) +* 3)Set ExtraImage for contact +*/ + +int FASTCALL ApplyFingerprintImage(HANDLE hContact, LPTSTR szMirVer) +{ + if (hContact == NULL) + return 0; + + HANDLE hImage = INVALID_HANDLE_VALUE; + if (szMirVer) + hImage = GetIconIndexFromFI(szMirVer); + + ExtraIcon_SetIcon(hExtraIcon,hContact,hImage); + return 0; +} + +int OnExtraIconClick(WPARAM wParam, LPARAM lParam, LPARAM) +{ + CallService(MS_USERINFO_SHOWDIALOG, wParam, NULL); + return 0; +} + +/* +* OnExtraIconListRebuild +* Set all registered indexes in array to EMPTY_EXTRA_ICON (unregistered icon) +*/ +int OnExtraIconListRebuild(WPARAM wParam, LPARAM lParam) +{ + ClearFI(); + return 0; +} + +/* +* OnIconsChanged +*/ +int OnIconsChanged(WPARAM wParam, LPARAM lParam) +{ + ClearFI(); + return 0; +} + +/* +* OnExtraImageApply +* Try to get MirVer value from db for contact and if success calls ApplyFingerprintImage +*/ + +int OnExtraImageApply(WPARAM wParam, LPARAM lParam) +{ + HANDLE hContact = (HANDLE)wParam; + if (hContact == NULL) + return 0; + + char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,wParam,0); + if (szProto != NULL) { + DBVARIANT dbvMirVer = { 0 }; + + if (!DBGetContactSettingTString(hContact, szProto, "MirVer", &dbvMirVer)) { + ApplyFingerprintImage(hContact, dbvMirVer.ptszVal); + DBFreeVariant(&dbvMirVer); + } + else ApplyFingerprintImage(hContact, NULL); + } + else ApplyFingerprintImage(hContact, NULL); + return 0; +} + +/* +* OnContactSettingChanged +* if contact settings changed apply new image or remove it +*/ +int OnContactSettingChanged(WPARAM wParam, LPARAM lParam) +{ + if ((HANDLE)wParam == NULL) + return 0; + + DBCONTACTWRITESETTING* cws = (DBCONTACTWRITESETTING*)lParam; + if (cws && cws->szSetting && !strcmp(cws->szSetting, "MirVer")) { + if (cws->value.type == DBVT_UTF8) { + LPWSTR wszVal = NULL; + int iValLen = MultiByteToWideChar(CP_UTF8, 0, cws->value.pszVal, -1, NULL, 0); + if (iValLen > 0) { + wszVal = (LPWSTR)mir_alloc(iValLen * sizeof(WCHAR)); + MultiByteToWideChar(CP_UTF8, 0, cws->value.pszVal, -1, wszVal, iValLen); + } + ApplyFingerprintImage((HANDLE)wParam, wszVal); + mir_free(wszVal); + } + else if (cws->value.type == DBVT_ASCIIZ) { + LPWSTR wszVal = NULL; + int iValLen = MultiByteToWideChar(g_LPCodePage, 0, cws->value.pszVal, -1, NULL, 0); + if (iValLen > 0) { + wszVal = (LPWSTR)mir_alloc(iValLen * sizeof(WCHAR)); + MultiByteToWideChar(g_LPCodePage, 0, cws->value.pszVal, -1, wszVal, iValLen); + } + ApplyFingerprintImage((HANDLE)wParam, wszVal); + mir_free(wszVal); + } + else if (cws->value.type == DBVT_WCHAR) { + ApplyFingerprintImage((HANDLE)wParam, cws->value.pwszVal); + } + else ApplyFingerprintImage((HANDLE)wParam, NULL); + } + return 0; +} + +/* +* WildCompareA +* 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 +* In order to handle situation 'at least one any sybol' use "?*" combination: +* e.g WildCompare("Tst","T?*st*"), returns FALSE, but both WildCompare("Test","T?*st*") and +* WildCompare("Teeest","T?*st*") return TRUE. +* +* Function is case sensitive! so convert input or modify func to use _qtoupper() +* +* Mask can contain several submasks. In this case each submask (including first) +* should start from '|' e.g: "|first*submask|second*mask". +* +* Dec 25, 2006 by FYR: +* Added Exception to masks: the mask "|^mask3|mask2|mask1" means: +* if NOT according to mask 3 AND (mask1 OR mask2) +* EXCEPTION should be BEFORE main mask: +* IF Exception match - the comparing stops as FALSE +* IF Exception does not match - comparing continue +* IF Mask match - comparing stops as TRUE +* IF Mask does not not match comparing continue +*/ +BOOL FASTCALL WildCompareA(LPSTR szName, LPSTR szMask) +{ + if (*szMask != '|') + return WildCompareProcA(szName, szMask); + + size_t s = 1, e = 1; + LPSTR szTemp = (LPSTR)_alloca(strlen(szMask) * sizeof(CHAR) + sizeof(CHAR)); + BOOL bExcept; + + while(szMask[e] != '\0') { + s = e; + while(szMask[e] != '\0' && szMask[e] != '|') e++; + + // exception mask + bExcept = (*(szMask + s) == '^'); + if (bExcept) s++; + + memcpy(szTemp, szMask + s, (e - s) * sizeof(CHAR)); + szTemp[e - s] = '\0'; + + if (WildCompareProcA(szName, szTemp)) + return !bExcept; + + if (szMask[e] != '\0') + e++; + else + return FALSE; + } + return FALSE; +} + +/* +* WildCompareW +* 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 +* In order to handle situation 'at least one any sybol' use "?*" combination: +* e.g WildCompare("Tst","T?*st*"), returns FALSE, but both WildCompare("Test","T?*st*") and +* WildCompare("Teeest","T?*st*") return TRUE. +* +* Function is case sensitive! so convert input or modify func to use _qtoupper() +* +* Mask can contain several submasks. In this case each submask (including first) +* should start from '|' e.g: "|first*submask|second*mask". +* +* Dec 25, 2006 by FYR: +* Added Exception to masks: the mask "|^mask3|mask2|mask1" means: +* if NOT according to mask 3 AND (mask1 OR mask2) +* EXCEPTION should be BEFORE main mask: +* IF Exception match - the comparing stops as FALSE +* IF Exception does not match - comparing continue +* IF Mask match - comparing stops as TRUE +* IF Mask does not not match comparing continue +*/ +BOOL FASTCALL WildCompareW(LPWSTR wszName, LPWSTR wszMask) +{ + if (wszMask == NULL) + return NULL; + + if (*wszMask != L'|') + return WildCompareProcW(wszName, wszMask); + + size_t s = 1, e = 1; + LPWSTR wszTemp = (LPWSTR)_alloca(wcslen(wszMask) * sizeof(WCHAR) + sizeof(WCHAR)); + BOOL bExcept; + + while(wszMask[e] != L'\0') + { + s = e; + while(wszMask[e] != L'\0' && wszMask[e] != L'|') e++; + + // exception mask + bExcept = (*(wszMask + s) == L'^'); + if (bExcept) s++; + + memcpy(wszTemp, wszMask + s, (e - s) * sizeof(WCHAR)); + wszTemp[e - s] = L'\0'; + + if (WildCompareProcW(wszName, wszTemp)) + return !bExcept; + + if (wszMask[e] != L'\0') + e++; + else + return FALSE; + } + return FALSE; +} + +BOOL __inline WildCompareProcA(LPSTR szName, LPSTR szMask) +{ + LPSTR szLast = NULL; + for (;; szMask++, szName++) + { + if (*szMask != '?' && *szMask != *szName) break; + if (*szName == '\0') return ((BOOL)!*szMask); + } + if (*szMask != '*') return FALSE; + for (;; szMask++, szName++) + { + while(*szMask == '*') + { + szLast = szMask++; + if (*szMask == '\0') return ((BOOL)!*szMask); /* true */ + } + if (*szName == '\0') return ((BOOL)!*szMask); /* *mask == EOS */ + if (*szMask != '?' && *szMask != *szName && szLast != NULL) + { + szName -= (size_t)(szMask - szLast) - 1; + szMask = szLast; + } + } +} + +BOOL __inline WildCompareProcW(LPWSTR wszName, LPWSTR wszMask) +{ + LPWSTR wszLast = NULL; + for (;; wszMask++, wszName++) + { + if (*wszMask != L'?' && *wszMask != *wszName) break; + if (*wszName == L'\0') return ((BOOL)!*wszMask); + } + if (*wszMask != L'*') return FALSE; + for (;; wszMask++, wszName++) + { + while(*wszMask == L'*') + { + wszLast = wszMask++; + if (*wszMask == L'\0') return ((BOOL)!*wszMask); /* true */ + } + if (*wszName == L'\0') return ((BOOL)!*wszMask); /* *mask == EOS */ + if (*wszMask != L'?' && *wszMask != *wszName && wszLast != NULL) + { + wszName -= (size_t)(wszMask - wszLast) - 1; + wszMask = wszLast; + } + } +} + +static void MatchMasks(TCHAR* szMirVer, short *base, short *overlay,short *overlay2,short *overlay3) +{ + short i = 0, j = -1, k = -1, n = -1; + + for (i=0; i < DEFAULT_KN_FP_MASK_COUNT; i++) { + KN_FP_MASK& p = def_kn_fp_mask[i]; + if (p.hIcolibItem == NULL) + continue; + + if ( !WildCompareW(szMirVer, p.szMaskUpper)) + continue; + + if (p.szIconFileName != _T("")) { + TCHAR destfile[MAX_PATH]; + mir_sntprintf(destfile, SIZEOF(destfile), _T("%s\\%s.dll"), g_szSkinLib, p.szIconFileName); + struct _stat64i32 stFileInfo; + + if (_tstat(destfile, &stFileInfo) == -1) + i = NOTFOUND_MASK_NUMBER; + } + break; + } + + 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 == NULL) + continue; + + if ( !WildCompare(szMirVer, p.szMaskUpper)) + continue; + + if (p.szIconFileName != _T("ClientIcons_packs")) + break; + + TCHAR destfile[MAX_PATH]; + mir_sntprintf(destfile, SIZEOF(destfile), _T("%s\\%s.dll"), g_szSkinLib, p.szIconFileName); + + struct _stat64i32 stFileInfo; + if ( _tstat(destfile, &stFileInfo) != -1) + break; + } + + for (k = 0; k < DEFAULT_KN_FP_OVERLAYS2_COUNT; k++) { + KN_FP_MASK& p = def_kn_fp_overlays2_mask[k]; + if (p.hIcolibItem == NULL) + continue; + + if ( WildCompareW(szMirVer, p.szMaskUpper)) + break; + } + + for (n = 0; n < DEFAULT_KN_FP_OVERLAYS3_COUNT; n++) { + KN_FP_MASK& p = def_kn_fp_overlays3_mask[n]; + if (p.hIcolibItem == NULL) + continue; + + if ( WildCompareW(szMirVer, p.szMaskUpper)) + 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; +} + +/* GetIconsIndexesA +* Retrieves Icons indexes by Mirver +*/ + +void FASTCALL GetIconsIndexesA(LPSTR szMirVer, short *base, short *overlay,short *overlay2,short *overlay3) +{ + if (strcmp(szMirVer, "?") == 0) { + *base = UNKNOWN_MASK_NUMBER; + *overlay = -1; + *overlay2 = -1; + *overlay3 = -1; + return; + } + + LPTSTR tszMirVerUp = mir_a2t(szMirVer); + _tcsupr(tszMirVerUp); + MatchMasks(tszMirVerUp, base, overlay, overlay2, overlay3); + mir_free(tszMirVerUp); +} + +/* GetIconsIndexesW +* Retrieves Icons indexes by Mirver +*/ + +void FASTCALL GetIconsIndexesW(LPWSTR wszMirVer, short *base, short *overlay,short *overlay2,short *overlay3) +{ + if (wcscmp(wszMirVer, L"?") == 0) + { + *base = UNKNOWN_MASK_NUMBER; + *overlay = -1; + *overlay2 = -1; + *overlay3 = -1; + return; + } + + LPWSTR wszMirVerUp = NEWWSTR_ALLOCA(wszMirVer); + _wcsupr(wszMirVerUp); + MatchMasks(wszMirVerUp, base, overlay, overlay2, overlay3); +} + +/* +* CreateIconFromIndexes +* returns hIcon of joined icon by given indexes +*/ + +HICON FASTCALL CreateIconFromIndexes(short base, short overlay, short overlay2, short overlay3) +{ + HICON hIcon = NULL; // returned HICON + HICON hTmp = NULL; + HICON icMain = NULL; + HICON icOverlay = NULL; + HICON icOverlay2 = NULL; + HICON icOverlay3 = NULL; + + KN_FP_MASK* mainMask = &(def_kn_fp_mask[base]); + icMain = Skin_GetIconByHandle(mainMask->hIcolibItem); + + if (icMain) { + KN_FP_MASK* overlayMask = (overlay != -1) ? &(def_kn_fp_overlays_mask[overlay]) : NULL; + KN_FP_MASK* overlay2Mask = (overlay2 != -1) ? &(def_kn_fp_overlays2_mask[overlay2]) : NULL; + KN_FP_MASK* overlay3Mask = (overlay3 != -1) ? &(def_kn_fp_overlays3_mask[overlay3]) : NULL; + icOverlay = (overlayMask == NULL) ? NULL : Skin_GetIconByHandle(overlayMask->hIcolibItem); + icOverlay2 = (overlay2Mask == NULL) ? NULL : Skin_GetIconByHandle(overlay2Mask->hIcolibItem); + icOverlay3 = (overlay3Mask == NULL) ? NULL : Skin_GetIconByHandle(overlay3Mask->hIcolibItem); + + hIcon = icMain; + + if (overlayMask) { + hIcon = CreateJoinedIcon(hIcon, icOverlay); + hTmp = hIcon; + } + + if (overlay2Mask) { + hIcon = CreateJoinedIcon(hIcon, icOverlay2); + if (hTmp) DestroyIcon(hTmp); + hTmp = hIcon; + } + + if (overlay3Mask) { + hIcon = CreateJoinedIcon(hIcon, icOverlay3); + if (hTmp) DestroyIcon(hTmp); + } + } + + if (hIcon == icMain) + hIcon = CopyIcon(icMain); + + Skin_ReleaseIcon(icMain); + Skin_ReleaseIcon(icOverlay); + Skin_ReleaseIcon(icOverlay2); + Skin_ReleaseIcon(icOverlay3); + return hIcon; +} + +/* +* ServiceGetClientIconA +* MS_FP_GETCLIENTICON service implementation. +* wParam - char * MirVer value to get client for. +* lParam - int noCopy - if wParam is equal to "1" will return icon handler without copiing icon. +* ICON IS ALWAYS COPIED!!! +*/ + +INT_PTR ServiceGetClientIconA(WPARAM wParam, LPARAM lParam) +{ + LPSTR szMirVer = (LPSTR)wParam; // MirVer value to get client for. + if (szMirVer == NULL) + return 0; + + HICON hIcon = NULL; // returned HICON + int NoCopy = (int)lParam; // noCopy + short base, overlay, overlay2, overlay3; + + GetIconsIndexesA(szMirVer, &base, &overlay, &overlay2, &overlay3); + if (base != -1) + hIcon = CreateIconFromIndexes(base, overlay, overlay2, overlay3); + return (INT_PTR)hIcon; +} + +/* + * ServiceSameClientA + * MS_FP_SAMECLIENTS service implementation. + * wParam - char * first MirVer value + * lParam - char * second MirVer value + * return pointer to char string - client desription (do not destroy) if clients are same + */ + +INT_PTR ServiceSameClientsA(WPARAM wParam, LPARAM lParam) +{ + LPSTR szMirVerFirst = (LPSTR)wParam; // MirVer value to get client for. + LPSTR szMirVerSecond = (LPSTR)lParam; // MirVer value to get client for. + int firstIndex, secondIndex; + BOOL Result = FALSE; + + firstIndex = secondIndex = 0; + if (!szMirVerFirst || !szMirVerSecond) + return (INT_PTR)NULL; //one of its is not null + + { + LPTSTR tszMirVerFirstUp, tszMirVerSecondUp; + int iMirVerFirstUpLen, iMirVerSecondUpLen; + + iMirVerFirstUpLen = MultiByteToWideChar(g_LPCodePage, 0, szMirVerFirst, -1, NULL, 0); + iMirVerSecondUpLen = MultiByteToWideChar(g_LPCodePage, 0, szMirVerSecond, -1, NULL, 0); + + tszMirVerFirstUp = (LPTSTR)mir_alloc(iMirVerFirstUpLen * sizeof(TCHAR)); + tszMirVerSecondUp = (LPTSTR)mir_alloc(iMirVerSecondUpLen * sizeof(TCHAR)); + + MultiByteToWideChar(g_LPCodePage, 0, szMirVerFirst, -1, tszMirVerFirstUp, iMirVerFirstUpLen); + MultiByteToWideChar(g_LPCodePage, 0, szMirVerSecond, -1, tszMirVerSecondUp, iMirVerSecondUpLen); + + _tcsupr_s(tszMirVerFirstUp, iMirVerFirstUpLen); + _tcsupr_s(tszMirVerSecondUp, iMirVerSecondUpLen); + + if (_tcscmp(tszMirVerFirstUp, _T("?")) == 0) + firstIndex = UNKNOWN_MASK_NUMBER; + else + while(firstIndex < DEFAULT_KN_FP_MASK_COUNT) { + if (WildCompare(tszMirVerFirstUp, def_kn_fp_mask[firstIndex].szMaskUpper)) + break; + firstIndex++; + } + + if (_tcscmp(tszMirVerSecondUp, _T("?")) == 0) + secondIndex = UNKNOWN_MASK_NUMBER; + else + while(secondIndex < DEFAULT_KN_FP_MASK_COUNT) { + if (WildCompare(tszMirVerSecondUp, def_kn_fp_mask[secondIndex].szMaskUpper)) + break; + secondIndex++; + } + + mir_free(tszMirVerFirstUp); + mir_free(tszMirVerSecondUp); + + if (firstIndex == secondIndex && firstIndex < DEFAULT_KN_FP_MASK_COUNT) + { + int iClientDescriptionLen = WideCharToMultiByte(g_LPCodePage, 0, def_kn_fp_mask[firstIndex].szClientDescription, -1, NULL, 0, NULL, NULL); + if (iClientDescriptionLen > 0) + g_szClientDescription = (LPSTR)mir_realloc(g_szClientDescription, iClientDescriptionLen * sizeof(CHAR)); + else + return (INT_PTR)NULL; + + WideCharToMultiByte(g_LPCodePage, 0, def_kn_fp_mask[firstIndex].szClientDescription, -1, g_szClientDescription, iClientDescriptionLen, NULL, NULL); + return (INT_PTR)g_szClientDescription; + + } + } + return (INT_PTR)NULL; +} + +/* +* ServiceGetClientIconW +* MS_FP_GETCLIENTICONW service implementation. +* wParam - LPWSTR MirVer value to get client for. +* lParam - int noCopy - if wParam is equal to "1" will return icon handler without copiing icon. +* ICON IS ALWAYS COPIED!!! +*/ + +INT_PTR ServiceGetClientIconW(WPARAM wParam, LPARAM lParam) +{ + LPWSTR wszMirVer = (LPWSTR)wParam; // MirVer value to get client for. + if (wszMirVer == NULL) + return 0; + + short base, overlay, overlay2, overlay3; + GetIconsIndexesW(wszMirVer, &base, &overlay, &overlay2, &overlay3); + + HICON hIcon = NULL; // returned HICON + if (base != -1) + hIcon = CreateIconFromIndexes(base, overlay, overlay2, overlay3); + + return (INT_PTR)hIcon; +} + +/* + * ServiceSameClientW + * MS_FP_SAMECLIENTSW service implementation. + * wParam - LPWSTR first MirVer value + * lParam - LPWSTR second MirVer value + * return pointer to char string - client desription (do not destroy) if clients are same + */ +INT_PTR ServiceSameClientsW(WPARAM wParam, LPARAM lParam) +{ + LPWSTR wszMirVerFirst = (LPWSTR)wParam; // MirVer value to get client for. + LPWSTR wszMirVerSecond = (LPWSTR)lParam; // MirVer value to get client for. + int firstIndex, secondIndex; + BOOL Result = FALSE; + + firstIndex = secondIndex = 0; + if (!wszMirVerFirst || !wszMirVerSecond) return (INT_PTR)NULL; //one of its is not null + + { + LPWSTR wszMirVerFirstUp, wszMirVerSecondUp; + size_t iMirVerFirstUpLen, iMirVerSecondUpLen; + + iMirVerFirstUpLen = wcslen(wszMirVerFirst) + 1; + iMirVerSecondUpLen = wcslen(wszMirVerSecond) + 1; + + wszMirVerFirstUp = (LPWSTR)mir_alloc(iMirVerFirstUpLen * sizeof(WCHAR)); + wszMirVerSecondUp = (LPWSTR)mir_alloc(iMirVerSecondUpLen * sizeof(WCHAR)); + + wcscpy_s(wszMirVerFirstUp, iMirVerFirstUpLen, wszMirVerFirst); + wcscpy_s(wszMirVerSecondUp, iMirVerSecondUpLen, wszMirVerSecond); + + _wcsupr_s(wszMirVerFirstUp, iMirVerFirstUpLen); + _wcsupr_s(wszMirVerSecondUp, iMirVerSecondUpLen); + + if (wcscmp(wszMirVerFirstUp, L"?") == 0) + firstIndex = UNKNOWN_MASK_NUMBER; + else + while(firstIndex < DEFAULT_KN_FP_MASK_COUNT) { + if (WildCompareW(wszMirVerFirstUp, def_kn_fp_mask[firstIndex].szMaskUpper)) + break; + firstIndex++; + } + + if (wcscmp(wszMirVerSecondUp, L"?") == 0) + secondIndex = UNKNOWN_MASK_NUMBER; + else + while(secondIndex < DEFAULT_KN_FP_MASK_COUNT) { + if (WildCompareW(wszMirVerSecondUp, def_kn_fp_mask[secondIndex].szMaskUpper)) + break; + secondIndex++; + } + + mir_free(wszMirVerFirstUp); + mir_free(wszMirVerSecondUp); + + if (firstIndex == secondIndex && firstIndex < DEFAULT_KN_FP_MASK_COUNT) + { + return (INT_PTR)def_kn_fp_mask[firstIndex].szClientDescription; + } + } + return (INT_PTR)NULL; +} + +/****************************************************************************** + * Futher routines is for creating joined 'overlay' icons. + ******************************************************************************/ + + /* + * CreateBitmap32 - Create DIB 32 bitmap with sizes cx*cy + */ + +HBITMAP __inline CreateBitmap32(int cx, int cy) +{ + return CreateBitmap32Point(cx, cy, NULL); +} + + /* + * CreateBitmap32 - Create DIB 32 bitmap with sizes cx*cy and put reference + * to new bitmap pixel image memory area to void ** bits + */ +HBITMAP FASTCALL CreateBitmap32Point(int cx, int cy, LPVOID* bits) +{ + BITMAPINFO bmpi = { 0 }; + LPVOID ptPixels = NULL; + HBITMAP DirectBitmap; + + if (cx < 0 || cy < 0) return NULL; + + bmpi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmpi.bmiHeader.biWidth = cx; + bmpi.bmiHeader.biHeight = cy; + bmpi.bmiHeader.biPlanes = 1; +// bmpi.bmiHeader.biCompression = BI_RGB; + bmpi.bmiHeader.biBitCount = 32; + + DirectBitmap = CreateDIBSection(NULL, + &bmpi, + DIB_RGB_COLORS, + &ptPixels, + NULL, 0); + GdiFlush(); + if (ptPixels) memset(ptPixels, 0, cx * cy * 4); + if (bits != NULL) *bits = ptPixels; + + return DirectBitmap; +} + +/* +* checkHasAlfa - checks if image has at least one BYTE in alpha channel +* that is not a 0. (is image real 32 bit or just 24 bit) +*/ +BOOL FASTCALL checkHasAlfa(LPBYTE from, int width, int height) +{ + LPDWORD pt = (LPDWORD)from; + LPDWORD lim = pt + width * height; + while(pt < lim) + { + if (*pt & 0xFF000000) + return TRUE; + pt++; + } + + return FALSE; +} + +/* +* checkMaskUsed - checks if mask image has at least one that is not a 0. +* Not sure is it required or not +*/ +BOOL FASTCALL checkMaskUsed(LPBYTE from) +{ + int i; + for (i=0; i < 16 * 16 / 8; i++) + { + if (from[i] != 0) return TRUE; + } + return FALSE; +} + +/* +* GetMaskBit - return value of apropriate mask bit in line at x position +*/ +BOOL __inline GetMaskBit(LPBYTE line, int x) +{ + return ((*(line + (x >> 3))) & (0x01 << (7 - (x & 0x07)))) != 0; +} + +/* +* blend - alpha blend ARGB values of 2 pixels. X1 - underlaying, +* X2 - overlaying points. +*/ +DWORD FASTCALL blend(DWORD X1,DWORD X2) +{ + RGBA* q1 = (RGBA*)&X1; + RGBA* q2 = (RGBA*)&X2; + BYTE a_1 = ~q1->a; + BYTE a_2 = ~q2->a; + WORD am = q1->a * a_2; + + WORD ar = q1->a + ((a_1 * q2->a) / 255); + // if a2 more than 0 than result should be more + // or equal (if a1==0) to a2, else in combination + // with mask we can get here black points + + ar = (q2->a > ar) ? q2->a : ar; + + if (ar == 0) return 0; + + { + WORD arm = ar * 255; + WORD rr = ((q1->r * am + q2->r * q2->a * 255)) / arm; + WORD gr = ((q1->g * am + q2->g * q2->a * 255)) / arm; + WORD br = ((q1->b * am + q2->b * q2->a * 255)) / arm; + return (ar << 24) | (rr << 16) | (gr << 8) | br; + } +} + +/* +* CreateJoinedIcon - creates new icon by drawing hTop over hBottom. +*/ +HICON FASTCALL CreateJoinedIcon(HICON hBottom, HICON hTop) +{ + BOOL drawn = FALSE; + HDC tempDC, tempDC2, tempDC3; + HICON res = NULL; + HBITMAP oImage,nImage; + HBITMAP nMask, hbm, obmp, obmp2; + LPBYTE ptPixels = NULL; + ICONINFO iNew = { 0 }; + BYTE p[32] = { 0 }; + + tempDC = CreateCompatibleDC(NULL); + nImage = CreateBitmap32Point(16, 16, (LPVOID*)&ptPixels); + oImage = (HBITMAP)SelectObject(tempDC, nImage); + +// if (ptPixels) memset(ptPixels, 0, 16 * 16 * 4); + + if (IsWinVerXPPlus()) + { + ICONINFO iciBottom = { 0 }; + ICONINFO iciTop = { 0 }; + + BITMAP bmp_top = { 0 }; + BITMAP bmp_top_mask = { 0 }; + + BITMAP bmp_bottom = { 0 }; + BITMAP bmp_bottom_mask = { 0 }; + + GetIconInfo(hBottom, &iciBottom); + GetObject(iciBottom.hbmColor, sizeof(BITMAP), &bmp_bottom); + GetObject(iciBottom.hbmMask, sizeof(BITMAP), &bmp_bottom_mask); + + GetIconInfo(hTop, &iciTop); + GetObject(iciTop.hbmColor, sizeof(BITMAP), &bmp_top); + GetObject(iciTop.hbmMask, sizeof(BITMAP), &bmp_top_mask); + + if (bmp_bottom.bmBitsPixel == 32 && bmp_top.bmBitsPixel == 32) + { + LPBYTE BottomBuffer, TopBuffer, BottomMaskBuffer, TopMaskBuffer; + LPBYTE bb, tb, bmb, tmb; + LPBYTE db = ptPixels; + int vstep_d = 16 * 4; + int vstep_b = bmp_bottom.bmWidthBytes; + int vstep_t = bmp_top.bmWidthBytes; + int vstep_bm = bmp_bottom_mask.bmWidthBytes; + int vstep_tm = bmp_top_mask.bmWidthBytes; + + if (bmp_bottom.bmBits) + bb = BottomBuffer = (LPBYTE)bmp_bottom.bmBits; + else + { + BottomBuffer = (LPBYTE)_alloca(bmp_bottom.bmHeight * bmp_bottom.bmWidthBytes); + GetBitmapBits(iciBottom.hbmColor, bmp_bottom.bmHeight * bmp_bottom.bmWidthBytes, BottomBuffer); + bb = BottomBuffer + vstep_b * (bmp_bottom.bmHeight - 1); + vstep_b = -vstep_b; + } + if (bmp_top.bmBits) + tb = TopBuffer = (LPBYTE)bmp_top.bmBits; + else + { + TopBuffer = (LPBYTE)_alloca(bmp_top.bmHeight * bmp_top.bmWidthBytes); + GetBitmapBits(iciTop.hbmColor, bmp_top.bmHeight * bmp_top.bmWidthBytes, TopBuffer); + tb = TopBuffer + vstep_t * (bmp_top.bmHeight - 1); + vstep_t = -vstep_t; + } + if (bmp_bottom_mask.bmBits) + bmb = BottomMaskBuffer = (LPBYTE)bmp_bottom_mask.bmBits; + else + { + BottomMaskBuffer = (LPBYTE)_alloca(bmp_bottom_mask.bmHeight * bmp_bottom_mask.bmWidthBytes); + GetBitmapBits(iciBottom.hbmMask, bmp_bottom_mask.bmHeight * bmp_bottom_mask.bmWidthBytes, BottomMaskBuffer); + bmb = BottomMaskBuffer + vstep_bm * (bmp_bottom_mask.bmHeight - 1); + vstep_bm = -vstep_bm; + } + if (bmp_top_mask.bmBits) + tmb = TopMaskBuffer = (LPBYTE)bmp_top_mask.bmBits; + else + { + TopMaskBuffer = (LPBYTE)_alloca(bmp_top_mask.bmHeight * bmp_top_mask.bmWidthBytes); + GetBitmapBits(iciTop.hbmMask, bmp_top_mask.bmHeight * bmp_top_mask.bmWidthBytes, TopMaskBuffer); + tmb = TopMaskBuffer + vstep_tm * (bmp_top_mask.bmHeight - 1); + vstep_tm = -vstep_tm; + } + { + int x; int y; + BOOL topHasAlpha = checkHasAlfa(TopBuffer, bmp_top.bmWidth, bmp_top.bmHeight); + BOOL bottomHasAlpha = checkHasAlfa(BottomBuffer, bmp_bottom.bmWidth, bmp_bottom.bmHeight); + BOOL topMaskUsed = !topHasAlpha && checkMaskUsed(TopMaskBuffer); + BOOL bottomMaskUsed = !bottomHasAlpha && checkMaskUsed(BottomMaskBuffer); + + for(y = 0; y < 16; y++) + { + for(x = 0; x < 16; x++) + { + DWORD bottom_d = ((LPDWORD)bb)[x]; + DWORD top_d = ((LPDWORD)tb)[x]; + + if (topMaskUsed) + { + if (GetMaskBit(tmb, x)) + top_d &= 0x00FFFFFF; + else + top_d |= 0xFF000000; + } + else if (!topHasAlpha) + top_d |= 0xFF000000; + + if (bottomMaskUsed) + { + if (GetMaskBit(bmb, x)) + bottom_d &= 0x00FFFFFF; + else + bottom_d |= 0xFF000000; + } + else if (!bottomHasAlpha) + bottom_d |= 0xFF000000; + + ((LPDWORD)db)[x] = blend(bottom_d, top_d); + } + bb += vstep_b; + tb += vstep_t; + bmb += vstep_bm; + tmb += vstep_tm; + db += vstep_d; + } + } + + drawn = TRUE; + } + + DeleteObject(iciBottom.hbmColor); + DeleteObject(iciTop.hbmColor); + DeleteObject(iciBottom.hbmMask); + DeleteObject(iciTop.hbmMask); + } + + if (!drawn) { + DrawIconEx(tempDC, 0, 0, hBottom, 16, 16, 0, NULL, DI_NORMAL); + DrawIconEx(tempDC, 0, 0, hTop, 16, 16, 0, NULL, DI_NORMAL); + } + + nMask = CreateBitmap(16, 16, 1, 1, p); + tempDC2 = CreateCompatibleDC(NULL); + tempDC3 = CreateCompatibleDC(NULL); + hbm = CreateCompatibleBitmap(tempDC3, 16, 16); + obmp = (HBITMAP)SelectObject(tempDC2, nMask); + obmp2 = (HBITMAP)SelectObject(tempDC3, hbm); + DrawIconEx(tempDC2, 0, 0, hBottom, 16, 16, 0, NULL, DI_MASK); + DrawIconEx(tempDC3, 0, 0, hTop, 16, 16, 0, NULL, DI_MASK); + BitBlt(tempDC2, 0, 0, 16, 16, tempDC3, 0, 0, SRCAND); + + GdiFlush(); + + SelectObject(tempDC2, obmp); + DeleteDC(tempDC2); + + SelectObject(tempDC3, obmp2); + DeleteDC(tempDC3); + + SelectObject(tempDC, oImage); + DeleteDC(tempDC); + + DeleteObject(hbm); + + iNew.fIcon = TRUE; + iNew.hbmColor = nImage; + iNew.hbmMask = nMask; + res = CreateIconIndirect(&iNew); + + DeleteObject(nImage); + DeleteObject(nMask); + + return res; +} + +HANDLE FASTCALL GetIconIndexFromFI(LPTSTR szMirVer) +{ + short base, overlay, overlay2, overlay3; + GetIconsIndexes(szMirVer, &base, &overlay, &overlay2, &overlay3); + if (base == -1 || nFICount == 0xFFFF) + return INVALID_HANDLE_VALUE; + + // MAX: 1024 + 256 + 128 + 128 + DWORD val = (base << 22) | ((overlay & 0xFF) << 14) | ((overlay2 & 0x7F) << 7) | (overlay3 & 0x7F); + + 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); + + fiList = (FOUNDINFO*)mir_realloc(fiList, sizeof(FOUNDINFO) * (nFICount + 1)); + fiList[nFICount].dwArray = val; + + if (hIcon != NULL) { + hFoundImage = (HANDLE)CallService(MS_CLIST_EXTRA_ADD_ICON, (WPARAM)hIcon, 0); + fiList[nFICount].hRegisteredImage = hFoundImage; + DestroyIcon(hIcon); + } + else fiList[nFICount].hRegisteredImage = INVALID_HANDLE_VALUE; + + nFICount++; + } + + return hFoundImage; +} + +VOID ClearFI() +{ + if (fiList != NULL) + mir_free(fiList); + fiList = NULL; + nFICount = 0; +} diff --git a/plugins/FingerprintNG/src/global.h b/plugins/FingerprintNG/src/global.h new file mode 100644 index 0000000000..91f1a035e4 --- /dev/null +++ b/plugins/FingerprintNG/src/global.h @@ -0,0 +1,190 @@ +/* +Fingerprint NG (client version) icons module for Miranda NG + +Copyright © 2006-12 ghazan, mataes, HierOS, FYR, Bio, nullbie, faith_healer and all respective contributors. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +// Modify the following defines if you have to target a platform prior to the ones specified below. +// Refer to MSDN for the latest info on corresponding values for different platforms. +#ifndef WINVER // Allow use of features specific to Windows XP or later. +#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows. +#endif + +#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. +#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows. +#endif + +#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later. +#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later. +#endif + +#ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later. +#define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE. +#endif + +#define _CRT_SECURE_NO_DEPRECATE + +//Start of header +// Native include +#include +#include +#include + +// Miranda IM SDK includes +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// plugins SDK +#include +#include + +//plugins header +#include "version.h" +#include "m_fingerprint.h" +#include "resource.h" +#include "utilities.h" + +#if defined(__GNUC__) +#define _alloca alloca +//#define FASTCALL +#else +#define FASTCALL __fastcall +#endif + +typedef struct { + BYTE b; + BYTE g; + BYTE r; + BYTE a; +} RGBA; + +struct KN_FP_MASK +{ + LPSTR szIconName; + LPTSTR szMask; + LPTSTR szClientDescription; + LPTSTR szIconFileName; + int iIconIndex; + int iSectionFlag; + BOOL fNotUseOverlay; + + HANDLE hIcolibItem; + LPTSTR szMaskUpper; +}; + +typedef struct _foundInfo +{ + DWORD dwArray; + HANDLE hRegisteredImage; +} FOUNDINFO; + +#define MIRANDA_CASE 1 // Miranda clients +#define MIRANDA_VERSION_CASE 2 // Miranda version overlays +#define MIRANDA_PACKS_CASE 3 // Miranda packs overlays + +#define MULTI_CASE 4 // multi-protocol clients +#define AIM_CASE 5 // AIM clients +#define GG_CASE 6 // Gadu-Gadu clients + +#define ICQ_OFFICIAL_CASE 7 // ICQ official clients (+ versions) +#define ICQ_CASE 8 // ICQ clients + +#define IRC_CASE 9 // IRC clients +#define JABBER_CASE 10 // Jabber clients +#define MRA_CASE 11 // Mail.Ru Agent clients +#define MSN_CASE 12 // MSN clients +#define QQ_CASE 13 // QQ clients (+ versions) +#define RSS_CASE 14 // RSS clients +#define TLEN_CASE 15 // Tlen clients (+ versions) +#define WEATHER_CASE 16 // Weather clients +#define YAHOO_CASE 17 // Yahoo clients (+ versions) + +#define OTHER_PROTOS_CASE 18 // other protocols +#define OTHERS_CASE 19 // other icons + +#define OVERLAYS_RESOURCE_CASE 20 // resource overlays +#define OVERLAYS_PLATFORM_CASE 21 // platforms overlays +#define OVERLAYS_PROTO_CASE 22 // protocols overlays +#define OVERLAYS_SECURITY_CASE 23 // security overlays + +/* +#define OVERLAYS_RESOURCE_ALT_CASE 24 // alternative (old style) overlays +*/ + +#define PtrIsValid(p) (((p)!=0)&&(((HANDLE)(p))!=INVALID_HANDLE_VALUE)) +#define SAFE_FREE(p) {if (PtrIsValid(p)){free((VOID*)p);(p)=NULL;}} + +#define LIB_REG 2 +#define LIB_USE 3 + +#define DEFAULT_SKIN_FOLDER _T("Icons\\fp_ClientIcons") + +void ClearFI(); + +int OnIconsChanged(WPARAM wParam, LPARAM lParam); +int OnExtraIconClick(WPARAM wParam, LPARAM lParam,LPARAM); +int OnExtraIconListRebuild(WPARAM wParam, LPARAM lParam); +int OnExtraImageApply(WPARAM wParam, LPARAM lParam); +int OnContactSettingChanged(WPARAM wParam, LPARAM lParam); +int OnOptInitialise(WPARAM wParam, LPARAM lParam); +int OnModulesLoaded(WPARAM wParam, LPARAM lParam); +int OnPreShutdown(WPARAM wParam, LPARAM lParam); + +INT_PTR ServiceSameClientsA(WPARAM wParam, LPARAM lParam); +INT_PTR ServiceGetClientIconA(WPARAM wParam, LPARAM lParam); +INT_PTR ServiceSameClientsW(WPARAM wParam, LPARAM lParam); +INT_PTR ServiceGetClientIconW(WPARAM wParam, LPARAM lParam); + +HICON FASTCALL CreateJoinedIcon(HICON hBottom, HICON hTop); +HBITMAP __inline CreateBitmap32(int cx, int cy); +HBITMAP FASTCALL CreateBitmap32Point(int cx, int cy, LPVOID* bits); +HANDLE FASTCALL GetIconIndexFromFI(LPTSTR szMirVer); + +BOOL FASTCALL WildCompareA(LPSTR name, LPSTR mask); +BOOL FASTCALL WildCompareW(LPWSTR name, LPWSTR mask); +BOOL __inline WildCompareProcA(LPSTR name, LPSTR mask); +BOOL __inline WildCompareProcW(LPWSTR name, LPWSTR mask); + +void FASTCALL Prepare(KN_FP_MASK* mask); +void RegisterIcons(); + +#define WildCompare WildCompareW +#define GetIconsIndexes GetIconsIndexesW + +extern HINSTANCE g_hInst; +extern HANDLE hHeap; +extern LPSTR g_szClientDescription; + +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[]; + +extern int DEFAULT_KN_FP_MASK_COUNT, DEFAULT_KN_FP_OVERLAYS_COUNT, DEFAULT_KN_FP_OVERLAYS2_COUNT, DEFAULT_KN_FP_OVERLAYS3_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 +#define DEFAULT_KN_FP_OVERLAYS2_NO_VER_COUNT (DEFAULT_KN_FP_OVERLAYS2_COUNT - 7) diff --git a/plugins/FingerprintNG/src/main.cpp b/plugins/FingerprintNG/src/main.cpp new file mode 100644 index 0000000000..5834cac369 --- /dev/null +++ b/plugins/FingerprintNG/src/main.cpp @@ -0,0 +1,111 @@ +/* +Fingerprint NG (client version) icons module for Miranda NG +Copyright © 2006-12 FYR, Bio, nullbie, ghazan, mataes, HierOS, faith_healer and all respective contributors. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +//Start of header +#include "global.h" + +#define LIB_REG 2 +#define LIB_USE 3 + +HINSTANCE g_hInst; +int hLangpack; + +HANDLE hHeap = NULL; + +HANDLE compClientServA = NULL; +HANDLE getClientIconA = NULL; + +HANDLE compClientServW = NULL; +HANDLE getClientIconW = NULL; +LPSTR g_szClientDescription = NULL; + +HANDLE hStaticHooks[1] = { NULL }; + +//End of header + +// PluginInfo & PluginInfoEx +PLUGININFOEX pluginInfoEx = { + sizeof(PLUGININFOEX), + __INTERNAL_NAME_STRING, + __VERSION_DWORD, + "Fingerprint NG (client version) icons module for Miranda NG", + "Copyright © 2006-12 ghazan, mataes, HierOS, FYR, Bio, nullbie, faith_healer and all respective contributors.", + "faith_healer@miranda.im", + __LEGAL_COPYRIGHT_STRING, + "http://miranda-ng.org/", + UNICODE_AWARE, + MIID_THIS_PLUGIN +}; + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + g_hInst = hinstDLL; + return TRUE; +} + +extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) +{ + return &pluginInfoEx; +} + +extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = {MIID_FINGERPRINT, MIID_LAST }; + +/////////////////////////////////////////////////////////////////////////////// + +static int OnPreShutdown(WPARAM wParam, LPARAM lParam) +{ + DestroyServiceFunction(compClientServA); + DestroyServiceFunction(getClientIconA); + DestroyServiceFunction(compClientServW); + DestroyServiceFunction(getClientIconW); + + return 0; +} + +extern "C" int __declspec(dllexport) Load(void) +{ + mir_getLP(&pluginInfoEx); + + hStaticHooks[0] = HookEvent(ME_SYSTEM_MODULESLOADED, OnModulesLoaded); + HookEvent(ME_SYSTEM_PRESHUTDOWN, OnPreShutdown); + compClientServA = CreateServiceFunction(MS_FP_SAMECLIENTS, ServiceSameClientsA); + getClientIconA = CreateServiceFunction(MS_FP_GETCLIENTICON, ServiceGetClientIconA); + + compClientServW = CreateServiceFunction(MS_FP_SAMECLIENTSW, ServiceSameClientsW); + getClientIconW = CreateServiceFunction(MS_FP_GETCLIENTICONW, ServiceGetClientIconW); + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// + +extern "C" int __declspec(dllexport) Unload() +{ + if (g_szClientDescription != NULL) + mir_free(g_szClientDescription); + + HeapDestroy(hHeap); + ClearFI(); + + for (size_t i = 0; i < SIZEOF(hStaticHooks); i++) + { + UnhookEvent(hStaticHooks[i]); + hStaticHooks[i] = NULL; + } + return 0; +} diff --git a/plugins/FingerprintNG/src/masks.cpp b/plugins/FingerprintNG/src/masks.cpp new file mode 100644 index 0000000000..91c0663236 --- /dev/null +++ b/plugins/FingerprintNG/src/masks.cpp @@ -0,0 +1,812 @@ +/* +Fingerprint NG (client version) icons module for Miranda NG +Copyright © 2006-12 ghazan, mataes, HierOS, FYR, Bio, nullbie, faith_healer and all respective contributors. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "global.h" + +/************************************************************************/ +/* This file contains data about appropriate MirVer values */ +/************************************************************************/ + +/* +* NOTE: Masks can contain '*' or '?' wild symbols +* Asterics '*' symbol covers 'empty' symbol too e.g WildCompare("Tst","T*st*"), returns TRUE +* In order to handle situation 'at least one any sybol' use '?*' combination: +* e.g WildCompare("Tst","T?*st*"), returns FALSE, but both WildCompare("Test","T?*st*") and +* WildCompare("Teeest","T?*st*") return TRUE. +* +* Function is 'dirt' case insensitive (it is ignore 5th bit (0x20) so it is no difference +* beetween some symbols. But it is faster than valid converting to uppercase. +* +* Mask can contain several submasks. In this case each submask (including first) +* should start from '|' e.g: "|first*submask|second*mask". +* +* ORDER OF RECORDS IS IMPORTANT: system search first suitable mask and returns it. +* e.g. if MirVer is "Miranda IM" and first mask is "*im*" and second is "Miranda *" the +* result will be client associated with first mask, not second! +* So in order to avoid such situation, place most generalised masks to latest place. +* +* In order to get "Unknown" client, last mask should be "?*". +*/ + +KN_FP_MASK def_kn_fp_mask[] = +{// {"Client_IconName", _T("|^*Mask*|*names*"), _T("Icon caption"), _T("iconpack name"), IDI_RESOURCE_ID, CLIENT_CASE, OVERLAY? }, +//########################################################################################################################################################################################################### +//################################# MIRANDA ######################################################################################################################################################### +//########################################################################################################################################################################################################### + {"client_Miranda_NG", _T("|*miranda-ng.org*") + _T("|*nightly.miranda.im*") + _T("|*Miranda*NG*"), _T("MirandaNG"), _T("ClientIcons_Miranda"), IDI_MIRANDA_NG, MIRANDA_CASE }, + + {"client_Miranda_010xx", _T("Miranda*IM*0.10.*"), _T("MirandaIM v0.10.x.x"), _T("ClientIcons_Miranda"), IDI_MIRANDA_010X, MIRANDA_CASE }, + {"client_Miranda_09XX", _T("|*Miranda*IM*0.9*") + _T("|*miranda-im.org/caps#*0.9*"), _T("MirandaIM v0.9.x.x"), _T("ClientIcons_Miranda"), IDI_MIRANDA_09XX, MIRANDA_CASE }, + {"client_Miranda_08XX", _T("|^Mira*0.7*Jabb*") + _T("|*Mira*0.8*") + _T("|*miranda-im.org/caps#*0.8*"), _T("MirandaIM v0.8.x.x"), _T("ClientIcons_Miranda"), IDI_MIRANDA_08XX, MIRANDA_CASE }, + {"client_Miranda_07XX", _T("|*Miranda*0.7*") + _T("|*miranda-im.org/caps#*0.7*"), _T("MirandaIM v0.7.x.x"), _T("ClientIcons_Miranda"), IDI_MIRANDA_07XX, MIRANDA_CASE }, + {"client_Miranda_06XX", _T("*Miranda*0.6*"), _T("MirandaIM v0.6.x.x"), _T("ClientIcons_Miranda"), IDI_MIRANDA_06XX, MIRANDA_CASE }, + {"client_Miranda_05XX", _T("*Miranda*0.5*"), _T("MirandaIM v0.5.x.x"), _T("ClientIcons_Miranda"), IDI_MIRANDA_05XX, MIRANDA_CASE }, + {"client_Miranda_04XX", _T("*Miranda*0.4*"), _T("MirandaIM v0.4.x.x"), _T("ClientIcons_Miranda"), IDI_MIRANDA_04XX, MIRANDA_CASE }, + + {"client_Miranda_old", _T("*Miranda*0.?*"), _T("MirandaIM (old versions)"), _T("ClientIcons_Miranda"), IDI_MIRANDA_OLD, MIRANDA_CASE }, + + {"client_Miranda_Unknown", _T("*Miranda*"), _T("Miranda (unknown/tweaked)"), _T("ClientIcons_Miranda"), IDI_MIRANDA_UNKNOWN, MIRANDA_CASE }, + +//########################################################################################################################################################################################################### +//################################# MULTI-PROTOCOL ##################################################################################################################################################### +//########################################################################################################################################################################################################### + {"client_Adium", _T("|*Adium*") + _T("|*VUFD6HcFmUT2NxJkBGCiKlZnS3M=*") // Gabble client? + _T("|*DdnydQG7RGhP9E3k9Sf+b+bF0zo=*"), _T("Adium"), _T("ClientIcons_multiproto"), IDI_ADIUM, MULTI_CASE }, + {"client_AgileMessenger", _T("*Agile Messenger*"), _T("Agile Messenger"), _T("ClientIcons_multiproto"), IDI_AGILE, MULTI_CASE }, + + {"client_Appolo", _T("*Appolo*"), _T("Appolo IM"), _T("ClientIcons_multiproto"), IDI_APPOLO, MULTI_CASE }, + {"client_Ayttm", _T("*Ayttm*"), _T("Ayttm"), _T("ClientIcons_multiproto"), IDI_AYTTM, MULTI_CASE }, + {"client_BayanICQ", _T("|*Bayan*ICQ*|*barobin*"), _T("BayanICQ"), _T("ClientIcons_multiproto"), IDI_BAYANICQ, MULTI_CASE }, + {"client_Beejive", _T("*Beejive*"), _T("BeejiveIM"), _T("ClientIcons_multiproto"), IDI_BEEJIVE, MULTI_CASE }, + {"client_Bimoid", _T("*Bimoid*"), _T("Bimoid"), _T("ClientIcons_multiproto"), IDI_BIMOID, MULTI_CASE }, + {"client_BitlBee", _T("*BitlBee*"), _T("BitlBee"), _T("ClientIcons_multiproto"), IDI_BITLBEE, MULTI_CASE }, + {"client_BlackBerry", _T("|*Berry*|*ICS?\?\?\?\?\?\?\?"), _T("BlackBerry"), _T("ClientIcons_multiproto"), IDI_BLACKBERRY, MULTI_CASE }, + {"client_Buddycloud", _T("*Buddycloud*"), _T("Buddycloud"), _T("ClientIcons_multiproto"), IDI_BUDDYCLOUD, MULTI_CASE }, + {"client_Carrier", _T("*Carrier*"), _T("Carrier client"), _T("ClientIcons_multiproto"), IDI_CARRIER, MULTI_CASE }, + {"client_Causerie", _T("*Causerie*"), _T("Causerie"), _T("ClientIcons_multiproto"), IDI_CAUSERIE, MULTI_CASE }, + {"client_CenterIM", _T("*CenterIM*"), _T("CenterIM"), _T("ClientIcons_multiproto"), IDI_CENTERIM, MULTI_CASE }, + {"client_ChatSecure", _T("*ChatSecure*"), _T("ChatSecure"), _T("ClientIcons_multiproto"), IDI_CHATSECURE, MULTI_CASE }, + {"client_Citron", _T("*Citron*"), _T("Citron"), _T("ClientIcons_multiproto"), IDI_CITRON, MULTI_CASE }, + {"client_climm", _T("*climm*"), _T("climm"), _T("ClientIcons_multiproto"), IDI_CLIMM, MULTI_CASE }, + {"client_Digsby", _T("*Digsby*"), _T("Digsby"), _T("ClientIcons_multiproto"), IDI_DIGSBY, MULTI_CASE }, + {"client_EKG2", _T("*EKG*2*"), _T("EKG2"), _T("ClientIcons_multiproto"), IDI_EKG2, MULTI_CASE }, + {"client_EasyMessage", _T("Easy*Message*"), _T("Easy Message"), _T("ClientIcons_multiproto"), IDI_EASYMESSAGE, MULTI_CASE }, + {"client_Empathy", _T("*Empathy*"), _T("Empathy"), _T("ClientIcons_multiproto"), IDI_EMPATHY, MULTI_CASE }, + {"client_Eyeball", _T("*Eyeball*"), _T("Eyeball Chat"), _T("ClientIcons_multiproto"), IDI_EYEBALL_CHAT, MULTI_CASE }, + {"client_eBuddy", _T("|*eBuddy*|*eMessenger*"), _T("eBuddy Messenger"), _T("ClientIcons_multiproto"), IDI_EBUDDY, MULTI_CASE }, + {"client_eM_Client", _T("*eM*Client*"), _T("eM Client"), _T("ClientIcons_multiproto"), IDI_EM_CLIENT, MULTI_CASE }, + {"client_eQo", _T("*eQo*"), _T("eQo"), _T("ClientIcons_multiproto"), IDI_EQO, MULTI_CASE }, + {"client_emesene", _T("*emesene*"), _T("emesene"), _T("ClientIcons_multiproto"), IDI_EMESENE, MULTI_CASE }, + {"client_FamaIM", _T("*Fama*"), _T("FamaIM"), _T("ClientIcons_multiproto"), IDI_FAMAIM, MULTI_CASE }, + {"client_Fring", _T("*fring*"), _T("Fring"), _T("ClientIcons_multiproto"), IDI_FRING, MULTI_CASE }, + {"client_GMX", _T("*GMX*"), _T("GMX MultiMessenger"), _T("ClientIcons_multiproto"), IDI_GMX, MULTI_CASE }, + {"client_Gaim", _T("*gaim*"), _T("Gaim (libgaim)"), _T("ClientIcons_multiproto"), IDI_GAIM, MULTI_CASE }, + {"client_Galaxium", _T("*Galaxium*"), _T("Galaxium"), _T("ClientIcons_multiproto"), IDI_GALAXIUM, MULTI_CASE }, + {"client_GnuGadu", _T("Gnu Gadu*"), _T("GNU Gadu"), _T("ClientIcons_multiproto"), IDI_GNUGADU, MULTI_CASE }, + {"client_IM2", _T("*IM2*"), _T("IM2"), _T("ClientIcons_multiproto"), IDI_IM2, MULTI_CASE }, + {"client_IMPlus", _T("|IM+*|IMPLUS*|*IM plus*") + _T("|*+umBU9yx9Cu+R8jvPWIZ3vWD59M=*"), _T("IM+"), _T("ClientIcons_multiproto"), IDI_IMPLUS, MULTI_CASE }, + {"client_IMVU", _T("*IMVU*"), _T("IMVU"), _T("ClientIcons_multiproto"), IDI_IMVU, MULTI_CASE }, + {"client_IMadering", _T("*IMadering*"), _T("IMadering"), _T("ClientIcons_multiproto"), IDI_IMADERING, MULTI_CASE }, + {"client_ImoIm", _T("*imo.im*"), _T("Imo.im"), _T("ClientIcons_multiproto"), IDI_IMOIM, MULTI_CASE }, + {"client_Inlux", _T("*Inlux*"), _T("Inlux Messenger"), _T("ClientIcons_multiproto"), IDI_INLUX, MULTI_CASE }, + {"client_Instantbird", _T("*Instantbird*"), _T("Instantbird"), _T("ClientIcons_multiproto"), IDI_INSTANTBIRD, MULTI_CASE }, + {"client_iCall", _T("*iCall*"), _T("iCall"), _T("ClientIcons_multiproto"), IDI_ICALL, MULTI_CASE }, + {"client_iChat", _T("|*iChat*|**imagent*|*iMessages*|"), _T("iChat"), _T("ClientIcons_multiproto"), IDI_ICHAT, MULTI_CASE }, + {"client_irssi", _T("*irssi*"), _T("irssi"), _T("ClientIcons_multiproto"), IDI_IRSSI, MULTI_CASE }, + {"client_JBother", _T("*JBother*"), _T("JBother"), _T("ClientIcons_multiproto"), IDI_JBOTHER, MULTI_CASE }, + {"client_JBuddy", _T("*JBuddy*"), _T("JBuddy Messenger"), _T("ClientIcons_multiproto"), IDI_JBUDDY, MULTI_CASE }, + {"client_Jabbear", _T("*Jabbear*"), _T("Jabbear"), _T("ClientIcons_multiproto"), IDI_JABBEAR, MULTI_CASE }, + {"client_Jabbin", _T("*Jabbin*"), _T("Jabbin"), _T("ClientIcons_multiproto"), IDI_JABBIN, MULTI_CASE }, + {"client_Jasmine_IM", _T("|Jasmine IM*|*jasmineicq.ru/caps*"), _T("Jasmine IM"), _T("ClientIcons_multiproto"), IDI_JASMINEIM, MULTI_CASE }, + {"client_Jimm", _T("|*Jimm*|mobicq*"), _T("Jimm"), _T("ClientIcons_multiproto"), IDI_JIMM, MULTI_CASE }, + {"client_Jimm_Aspro", _T("*Jimm*Aspro*"), _T("Jimm Aspro"), _T("ClientIcons_multiproto"), IDI_JIMM_ASPRO, MULTI_CASE }, + {"client_Jimmy", _T("*Jimmy*"), _T("JimmyIM"), _T("ClientIcons_multiproto"), IDI_JIMMY, MULTI_CASE }, + {"client_KMess", _T("*KMess*"), _T("KMess"), _T("ClientIcons_multiproto"), IDI_KMESS, MULTI_CASE }, + {"client_KoolIM", _T("*Kool*"), _T("KoolIM"), _T("ClientIcons_multiproto"), IDI_KOOLIM, MULTI_CASE }, + {"client_Kopete", _T("*Kopete*"), _T("Kopete"), _T("ClientIcons_multiproto"), IDI_KOPETE, MULTI_CASE }, + {"client_LeechCraft", _T("|*LeechCraft*") + _T("|*aNjQWbtza2QtXemMfBS2bwNOtcQ=*"), _T("LeechCraft"), _T("ClientIcons_multiproto"), IDI_LEECHCRAFT, MULTI_CASE }, + {"client_MDC", _T("*MDC*"), _T("MDC"), _T("ClientIcons_multiproto"), IDI_MDC, MULTI_CASE }, + {"client_Meebo", _T("Meebo*"), _T("Meebo"), _T("ClientIcons_multiproto"), IDI_MEEBO, MULTI_CASE }, + {"client_Meetro", _T("Meetro*"), _T("Meetro"), _T("ClientIcons_multiproto"), IDI_MEETRO, MULTI_CASE }, + {"client_mChat", _T("|mChat*|gsICQ*|*mchat.mgslab.com*"), _T("mChat"), _T("ClientIcons_multiproto"), IDI_MCHAT, MULTI_CASE }, + {"client_Nimbuzz", _T("*Nimbuzz*"), _T("Nimbuzz"), _T("ClientIcons_multiproto"), IDI_NIMBUZZ, MULTI_CASE }, + {"client_Palringo", _T("*Palringo*"), _T("Palringo"), _T("ClientIcons_multiproto"), IDI_PALRINGO, MULTI_CASE }, + + {"client_Pigeon", _T("*PIGEON*"), _T("PIGEON!"), _T("ClientIcons_multiproto"), IDI_PIGEON, MULTI_CASE }, + {"client_PlayXpert", _T("*PlayXpert*"), _T("PlayXpert"), _T("ClientIcons_multiproto"), IDI_PLAYXPERT, MULTI_CASE }, + {"client_Prelude", _T("*Prelude*"), _T("Prelude"), _T("ClientIcons_multiproto"), IDI_PRELUDE, MULTI_CASE }, + {"client_Proteus", _T("*Proteus*"), _T("Proteus"), _T("ClientIcons_multiproto"), IDI_PROTEUS, MULTI_CASE }, + {"client_Python", _T("|Py*t|*Python*"), _T("Python transport clients"), _T("ClientIcons_multiproto"), IDI_PYTHON, MULTI_CASE }, + + {"client_QIP_Android", _T("QIP *Android*"), _T("QIP Mobile Android"), _T("ClientIcons_multiproto"), IDI_QIP_ANDROID, MULTI_CASE, TRUE }, + {"client_QIP_iOS", _T("|QIP*iOS*|QIP*iphone*|QIP*apple*"), _T("QIP Mobile iOS"), _T("ClientIcons_multiproto"), IDI_QIP_IOS, MULTI_CASE, TRUE }, + {"client_QIP_Symbian", _T("*QIP*Symbian*"), _T("QIP Mobile Symbian"), _T("ClientIcons_multiproto"), IDI_QIP_SYMBIAN, MULTI_CASE, TRUE }, + {"client_QIP_Java", _T("*QIP*Java*"), _T("QIP Mobile Java"), _T("ClientIcons_multiproto"), IDI_QIP_JAVA, MULTI_CASE, TRUE }, + {"client_QIP_PDA", _T("|QIP *PDA*|*pda.qip.ru*|*QIP Mobile*"), _T("QIP Mobile"), _T("ClientIcons_multiproto"), IDI_QIP_PDA, MULTI_CASE, TRUE }, + {"client_QIP_2012", _T("|QIP 2012*|http://qip.ru/caps*"), _T("QIP 2012"), _T("ClientIcons_multiproto"), IDI_QIP_2012, MULTI_CASE, TRUE }, + {"client_QIP_2010", _T("|QIP 2010*|http://2010.qip.ru*"), _T("QIP 2010"), _T("ClientIcons_multiproto"), IDI_QIP_2010, MULTI_CASE, TRUE }, + {"client_QIP_Infium", _T("|QIP Infium*|http://*qip*"), _T("QIP Infium"), _T("ClientIcons_multiproto"), IDI_QIP_INFIUM, MULTI_CASE, TRUE }, + + {"client_Qnext", _T("QNext*"), _T("Qnext"), _T("ClientIcons_multiproto"), IDI_QNEXT, MULTI_CASE }, + {"client_qutIM", _T("*qutIM*"), _T("qutIM"), _T("ClientIcons_multiproto"), IDI_QUTIM, MULTI_CASE }, + {"client_mqutIM", _T("*mqutIM*"), _T("mqutIM"), _T("ClientIcons_multiproto"), IDI_MQUTIM, MULTI_CASE }, + {"client_SAPO", _T("*SAPO*"), _T("SAPO Messenger"), _T("ClientIcons_multiproto"), IDI_SAPO, MULTI_CASE }, + {"client_SIM", _T("|^*Simp*|*SIM*"), _T("SIM"), _T("ClientIcons_multiproto"), IDI_SIM, MULTI_CASE }, + {"client_Salut_a_Toi", _T("*Salut*Toi*"), _T("Salut a Toi"), _T("ClientIcons_multiproto"), IDI_SALUT_A_TOI, MULTI_CASE }, + {"client_Shaim", _T("*Shaim*"), _T("Shaim"), _T("ClientIcons_multiproto"), IDI_SHAIM, MULTI_CASE }, + {"client_SieJC", _T("|SieJC*|NatICQ*|Siemens*Client*"), _T("Siemens ICQ / Jabber client"), _T("ClientIcons_multiproto"), IDI_SIEJC, MULTI_CASE }, + {"client_Slick", _T("Slick*"), _T("Slick"), _T("ClientIcons_multiproto"), IDI_SLICK, MULTI_CASE }, + {"client_SrevIM", _T("*Srev*IM*"), _T("SrevIM"), _T("ClientIcons_multiproto"), IDI_SREVIM, MULTI_CASE }, + + {"client_Tril_Android", _T("*Trillian*Android*"), _T("Trillian Android"), _T("ClientIcons_multiproto"), IDI_TRILLIAN_ANDROID, MULTI_CASE }, + {"client_Tril_Astra", _T("Trillian*Astra*"), _T("Trillian Astra"), _T("ClientIcons_multiproto"), IDI_TRILLIAN_ASTRA, MULTI_CASE }, + {"client_Trillian_Pro", _T("Trillian*Pro*"), _T("Trillian Pro"), _T("ClientIcons_multiproto"), IDI_TRILLIAN_PRO, MULTI_CASE }, + {"client_Trillian", _T("*Trillian**"), _T("Trillian"), _T("ClientIcons_multiproto"), IDI_TRILLIAN, MULTI_CASE, TRUE }, + + {"client_Tuukle_Chat", _T("*Tuukle*Chat*|*IM*Gate*"), _T("Tuukle Chat"), _T("ClientIcons_multiproto"), IDI_TUUKLE_CHAT, MULTI_CASE }, + {"client_vBuzzer", _T("*vBuzzer*"), _T("vBuzzer"), _T("ClientIcons_multiproto"), IDI_VBUZZER, MULTI_CASE }, + {"client_Virtus", _T("*Virtus*"), _T("Virtus"), _T("ClientIcons_multiproto"), IDI_VIRTUS, MULTI_CASE }, + {"client_uIM", _T("*uIM*"), _T("uIM"), _T("ClientIcons_multiproto"), IDI_UIM, MULTI_CASE }, + {"client_uTalk", _T("*uTalk*"), _T("uTalk"), _T("ClientIcons_multiproto"), IDI_UTALK, MULTI_CASE }, + {"client_WeeChat", _T("*WeeChat*"), _T("WeeChat"), _T("ClientIcons_multiproto"), IDI_WEECHAT, MULTI_CASE }, + {"client_Wippien", _T("*Wippien*"), _T("Wippien"), _T("ClientIcons_multiproto"), IDI_WIPPIEN, MULTI_CASE }, + {"client_YamiGo", _T("YamiGo*"), _T("YamiGo"), _T("ClientIcons_multiproto"), IDI_YAMIGO, MULTI_CASE }, + {"client_Yeigo", _T("*Yeigo*"), _T("Yeigo"), _T("ClientIcons_multiproto"), IDI_YEIGO, MULTI_CASE }, + {"client_Yoono", _T("*Yoono*"), _T("Yoono"), _T("ClientIcons_multiproto"), IDI_YOONO, MULTI_CASE }, + +//########################################################################################################################################################################################################### +//################################# ICQ ############################################################################################################################################################# +//########################################################################################################################################################################################################### + {"client_&RQ", _T("&RQ*"), _T("&RQ"), _T("ClientIcons_ICQ"), IDI_ANDRQ, ICQ_CASE }, + {"client_R&Q", _T("R&Q*"), _T("R&Q"), _T("ClientIcons_ICQ"), IDI_RANDQ_NEW, ICQ_CASE }, + + {"client_1und1", _T("|*Pocket*Web*|*1&1*|*1*?nd*1"), _T("1&1"), _T("ClientIcons_ICQ"), IDI_1UND1, ICQ_CASE }, + {"client_Anastasia", _T("Anastasia*"), _T("Anastasia"), _T("ClientIcons_ICQ"), IDI_ANASTASIA, ICQ_CASE }, + {"client_Asia", _T("*Asia*"), _T("Asia"), _T("ClientIcons_ICQ"), IDI_ASIA, ICQ_CASE }, + {"client_CenterICQ", _T("*Centericq*"), _T("CenterICQ"), _T("ClientIcons_ICQ"), IDI_CENTERICQ, ICQ_CASE }, + {"client_Corepager", _T("Core*Pager*"), _T("Core Pager"), _T("ClientIcons_ICQ"), IDI_COREPAGER, ICQ_CASE }, + {"client_D[i]Chat", _T("D[i]Chat*"), _T("D[i]Chat"), _T("ClientIcons_ICQ"), IDI_DICHAT, ICQ_CASE }, + {"client_GlICQ", _T("GlICQ*"), _T("GlICQ"), _T("ClientIcons_ICQ"), IDI_GLICQ, ICQ_CASE }, + {"client_GnomeICU", _T("GnomeICU*"), _T("GnomeICU"), _T("ClientIcons_ICQ"), IDI_GNOMEICU, ICQ_CASE }, + {"client_ICQ_2X", _T("ICQ*2.x*"), _T("ICQ 2.x"), _T("ClientIcons_ICQ"), IDI_ICQ2X, ICQ_CASE }, + {"client_Icy_Juice", _T("*Icy*Juice*"), _T("Icy Juice"), _T("ClientIcons_ICQ"), IDI_ICY_JUICE, ICQ_CASE }, + {"client_JICQ", _T("*JICQ*"), _T("JICQ"), _T("ClientIcons_ICQ"), IDI_JICQ, ICQ_CASE }, + {"client_Licq", _T("Licq*"), _T("Licq"), _T("ClientIcons_ICQ"), IDI_LICQ, ICQ_CASE }, + {"client_LocID", _T("LocID*"), _T("LocID"), _T("ClientIcons_ICQ"), IDI_LOCID, ICQ_CASE }, + {"client_MIP", _T("*MIP*"), _T("MIP"), _T("ClientIcons_ICQ"), IDI_MIP, ICQ_CASE }, + {"client_NanoICQ", _T("*Nano*ICQ*"), _T("NanoICQ"), _T("ClientIcons_ICQ"), IDI_NANOICQ, ICQ_CASE }, + {"client_ICAT", _T("IC@*"), _T("IC@"), _T("ClientIcons_ICQ"), IDI_ICAT, ICQ_CASE }, + {"client_QIP", _T("QIP*"), _T("QIP"), _T("ClientIcons_ICQ"), IDI_QIP, ICQ_CASE, TRUE }, + {"client_Smaper", _T("*SmapeR*"), _T("SmapeR"), _T("ClientIcons_ICQ"), IDI_SMAPER, ICQ_CASE }, + {"client_SmartICQ", _T("SmartICQ*"), _T("SmartICQ (via mIRC)"), _T("ClientIcons_ICQ"), IDI_SMARTICQ, ICQ_CASE }, + {"client_SpamBot", _T("*Spam*Bot*"), _T("Spam Bot"), _T("ClientIcons_ICQ"), IDI_SPAMBOT, ICQ_CASE }, + {"client_Sticq", _T("stICQ*"), _T("stICQ"), _T("ClientIcons_ICQ"), IDI_STICQ, ICQ_CASE }, + {"client_StrICQ", _T("StrICQ*"), _T("StrICQ"), _T("ClientIcons_ICQ"), IDI_STRICQ, ICQ_CASE }, + {"client_TICQ", _T("*TICQ*Client*"), _T("TICQ (Delphi lib)"), _T("ClientIcons_ICQ"), IDI_TICQ, ICQ_CASE }, + {"client_Virus", _T("*Virus*"), _T("Virus (Stration worm)"), _T("ClientIcons_ICQ"), IDI_VIRUS, ICQ_CASE }, + {"client_VmICQ", _T("VmICQ*"), _T("VmICQ"), _T("ClientIcons_ICQ"), IDI_VMICQ, ICQ_CASE }, + {"client_WebICQ", _T("WebICQ*"), _T("WebICQ"), _T("ClientIcons_ICQ"), IDI_WEBICQ, ICQ_CASE }, + {"client_YSM", _T("YSM*"), _T("YSM"), _T("ClientIcons_ICQ"), IDI_YSM, ICQ_CASE }, + {"client_Yeemp", _T("Yeemp*"), _T("Yeemp"), _T("ClientIcons_ICQ"), IDI_YEEMP, ICQ_CASE }, + {"client_alicq", _T("alicq*"), _T("Alicq"), _T("ClientIcons_ICQ"), IDI_ALICQ, ICQ_CASE }, + {"client_kxICQ", _T("kxICQ*"), _T("KxICQ2"), _T("ClientIcons_ICQ"), IDI_KXICQ, ICQ_CASE }, + {"client_libicq2k", _T("libicq2*"), _T("LibICQ/JIT"), _T("ClientIcons_ICQ"), IDI_LIBICQ2000, ICQ_CASE }, + {"client_mICQ", _T("mICQ*"), _T("mICQ"), _T("ClientIcons_ICQ"), IDI_MICQ, ICQ_CASE }, + {"client_vICQ", _T("vICQ*"), _T("vICQ"), _T("ClientIcons_ICQ"), IDI_VICQ, ICQ_CASE }, + {"client_SpamBot", _T("*Spam*Bot*"), _T("Spam Bot"), _T("ClientIcons_ICQ"), IDI_SPAMBOT, ICQ_CASE }, + {"client_Virus", _T("*Virus*"), _T("Virus (Stration worm"), _T("ClientIcons_ICQ"), IDI_VIRUS, ICQ_CASE }, + +//########################################################################################################################################################################################################### +//################################# OFFICIAL ICQ ##################################################################################################################################################### +//########################################################################################################################################################################################################### + {"client_ICQ_all", _T("|ICQ *|ICQ2*"), _T("ICQ official"), _T("ClientIcons_ICQ"), IDI_ICQ, ICQ_OFFICIAL_CASE }, + +// AIM detection in ICQ protocol clutch, actually are mobile clients + {"client_AIM", _T("AIM"), _T("AIM-based client"), _T("ClientIcons_ICQ"), IDI_AIM, ICQ_OFFICIAL_CASE, TRUE }, + +//########################################################################################################################################################################################################### +//################################# JABBER ######################################################################################################################################################### +//########################################################################################################################################################################################################### + {"client_Akeni", _T("*Akeni*"), _T("Akeni"), _T("ClientIcons_Jabber"), IDI_AKENI, JABBER_CASE }, + {"client_Ambrosia", _T("*Ambrosia*"), _T("Ambrosia XMPP Server"), _T("ClientIcons_Jabber"), IDI_AMBROSIA, JABBER_CASE }, + {"client_AnothRSSBot", _T("|*Anothrbot*|*Anothr Rss Bot*"), _T("Anothr Rss Bot"), _T("ClientIcons_Jabber"), IDI_ANOTHRSSBOT, JABBER_CASE }, + {"client_Aqq", _T("|http://aqq.eu*|aqq*"), _T("Aqq"), _T("ClientIcons_Jabber"), IDI_AQQ, JABBER_CASE }, + {"client_BarnOwl", _T("*Barn*Owl*"), _T("BarnOwl"), _T("ClientIcons_Jabber"), IDI_BARNOWL, JABBER_CASE }, + {"client_Beem", _T("*Beem*"), _T("Beem"), _T("ClientIcons_Jabber"), IDI_BEEM, JABBER_CASE }, + {"client_BellSouth", _T("*BellSouth*"), _T("BellSouth"), _T("ClientIcons_Jabber"), IDI_BELLSOUTH, JABBER_CASE }, + {"client_BitWise", _T("*BitWise*"), _T("BitWise"), _T("ClientIcons_Jabber"), IDI_BITWISE, JABBER_CASE }, + {"client_Bombus", _T("*Bombus*"), _T("Bombus"), _T("ClientIcons_Jabber"), IDI_BOMBUS, JABBER_CASE }, + {"client_BombusMod", _T("|*Bombus*mod*|*bombusmod*"), _T("BombusMod"), _T("ClientIcons_Jabber"), IDI_BOMBUS_MOD, JABBER_CASE }, + {"client_BombusNG", _T("*Bombus*NG*"), _T("Bombus NG"), _T("ClientIcons_Jabber"), IDI_BOMBUS_NG, JABBER_CASE }, + {"client_BombusQD", _T("|*Bombusmod-qd*|*bombus*qd*"), _T("BombusQD"), _T("ClientIcons_Jabber"), IDI_BOMBUS_QD, JABBER_CASE }, + {"client_Bowline", _T("*Bow*line*"), _T("Bowline"), _T("ClientIcons_Jabber"), IDI_BOWLINE, JABBER_CASE }, + {"client_BuddySpace", _T("Buddy*Space*"), _T("BuddySpace"), _T("ClientIcons_Jabber"), IDI_BUDDYSPACE, JABBER_CASE }, + {"client_CJC", _T("*CJC*"), _T("CJC"), _T("ClientIcons_Jabber"), IDI_CJC, JABBER_CASE }, + {"client_CRoom", _T("*CRoom*"), _T("CRoom"), _T("ClientIcons_Jabber"), IDI_CROOM, JABBER_CASE }, + {"client_Candy", _T("*Candy*"), _T("Candy"), _T("ClientIcons_Jabber"), IDI_CANDY, JABBER_CASE }, + {"client_Chatopus", _T("*Chatopus*"), _T("Chatopus"), _T("ClientIcons_Jabber"), IDI_CHATOPUS, JABBER_CASE }, + {"client_Chikka", _T("*Chikka*"), _T("Chikka"), _T("ClientIcons_Jabber"), IDI_CHIKKA, JABBER_CASE }, + {"client_ChitChat", _T("*Chit*Chat*"), _T("ChitChat"), _T("ClientIcons_Jabber"), IDI_CHITCHAT, JABBER_CASE }, + {"client_Claros_Chat", _T("*Claros*"), _T("Claros Chat"), _T("ClientIcons_Jabber"), IDI_CLAROS_CHAT, JABBER_CASE }, + {"client_Coccinella", _T("*Coccinella*"), _T("Coccinella"), _T("ClientIcons_Jabber"), IDI_COCCINELLA, JABBER_CASE }, + {"client_Colibry", _T("Colibry*"), _T("Colibry"), _T("ClientIcons_Jabber"), IDI_COLIBRY, JABBER_CASE }, + {"client_Colloquy", _T("Colloquy*"), _T("Colloquy"), _T("ClientIcons_Jabber"), IDI_COLLOQUY, JABBER_CASE }, + {"client_CommuniGate", _T("*CommuniGate*"), _T("CommuniGate Pro"), _T("ClientIcons_Jabber"), IDI_COMMUNIGATE, JABBER_CASE }, + {"client_Conference", _T("Conference*"), _T("Conference Bot (GMail)"), _T("ClientIcons_Jabber"), IDI_CONFERENCE, JABBER_CASE, TRUE }, + {"client_Crosstalk", _T("*Cross*talk*"), _T("Crosstalk"), _T("ClientIcons_Jabber"), IDI_CROSSTALK, JABBER_CASE }, + {"client_Cudumar", _T("*Cudumar*"), _T("Cudumar"), _T("ClientIcons_Jabber"), IDI_CUDUMAR, JABBER_CASE }, + {"client_CyclopsChat", _T("*Cyclops*"), _T("Cyclops Chat"), _T("ClientIcons_Jabber"), IDI_CYCLOPS_CHAT, JABBER_CASE }, + {"client_Desyr", _T("*Desyr*"), _T("Desyr Messenger"), _T("ClientIcons_Jabber"), IDI_DESYR, JABBER_CASE }, + {"client_EMess", _T("*EMess*"), _T("EMess"), _T("ClientIcons_Jabber"), IDI_EMESS, JABBER_CASE }, + {"client_Elmer_Bot", _T("*Elmer*"), _T("Elmer Bot"), _T("ClientIcons_Jabber"), IDI_ELMER, JABBER_CASE }, + {"client_Emacs", _T("|*Jabber.el*|*Emacs*"), _T("Emacs (Jabber.el)"), _T("ClientIcons_Jabber"), IDI_EMACS, JABBER_CASE }, + {"client_Exodus", _T("*Exodus*"), _T("Exodus"), _T("ClientIcons_Jabber"), IDI_EXODUS, JABBER_CASE }, + {"client_Facebook", _T("*Facebook*"), _T("Facebook"), _T("ClientIcons_Jabber"), IDI_FACEBOOK, JABBER_CASE }, + {"client_Fire", _T("*Fire*"), _T("Fire"), _T("ClientIcons_Jabber"), IDI_FIRE, JABBER_CASE }, + {"client_GCN", _T("*GCN*"), _T("GCN"), _T("ClientIcons_Jabber"), IDI_GCN, JABBER_CASE }, + {"client_GMail", _T("|*gmail.*|GMail*"), _T("GMail"), _T("ClientIcons_Jabber"), IDI_GMAIL, JABBER_CASE }, + {"client_GOIM", _T("*GOIM*"), _T("GOIM"), _T("ClientIcons_Jabber"), IDI_GOIM, JABBER_CASE }, + {"client_GTalk", _T("|*Talk.v*|*Google*Talk*") + _T("|*Gtalk*|*-iPhon*"), _T("GoogleTalk aka GTalk"), _T("ClientIcons_Jabber"), IDI_GTALK, JABBER_CASE }, + {"client_GTalk_Gadget", _T("*Talk*Gadget*"), _T("GTalk Gadget"), _T("ClientIcons_Jabber"), IDI_GTALK_GADGET, JABBER_CASE }, + {"client_Gabber", _T("*Gabber*"), _T("Gabber"), _T("ClientIcons_Jabber"), IDI_GABBER, JABBER_CASE }, + {"client_Gajim", _T("*Gajim*"), _T("Gajim"), _T("ClientIcons_Jabber"), IDI_GAJIM, JABBER_CASE }, + {"client_Gibberbot", _T("*Gibber*"), _T("Gibberbot"), _T("ClientIcons_Jabber"), IDI_GIBBERBOT, JABBER_CASE }, + {"client_Glu", _T("|*glu*|http://glu.net/*"), _T("Glu"), _T("ClientIcons_Jabber"), IDI_GLU, JABBER_CASE }, + {"client_Gnome", _T("*Gnome*"), _T("Gnome"), _T("ClientIcons_Jabber"), IDI_GNOME, JABBER_CASE }, + {"client_GnuGadu", _T("Gnu Gadu*"), _T("GNU Gadu"), _T("ClientIcons_Jabber"), IDI_GNUGADU, JABBER_CASE }, + {"client_GoTalkMobile", _T("*Go*Talk*Mobile*"), _T("GoTalkMobile"), _T("ClientIcons_Jabber"), IDI_GOTALKMOBILE, JABBER_CASE }, + {"client_Gossip", _T("*Gossip*"), _T("Gossip"), _T("ClientIcons_Jabber"), IDI_GOSSIP, JABBER_CASE }, + {"client_GreenThumb", _T("gReeNtHumB*"), _T("GreenThumb"), _T("ClientIcons_Jabber"), IDI_GREENTHUMB, JABBER_CASE }, + {"client_Gush", _T("*Gush*"), _T("Gush"), _T("ClientIcons_Jabber"), IDI_GUSH, JABBER_CASE }, + {"client_IMCom", _T("*IMCom*"), _T("IMCom"), _T("ClientIcons_Jabber"), IDI_IMCOM, JABBER_CASE }, + {"client_IM_Friendly", _T("*IM*Friendly*"), _T("IM Friendly!"), _T("ClientIcons_Jabber"), IDI_IM_FRIENDLY, JABBER_CASE }, + {"client_Imified", _T("*someresource*"), _T("Imified"), _T("ClientIcons_Jabber"), IDI_IMIFIED, JABBER_CASE }, + {"client_Importal", _T("*Importal*"), _T("Importal"), _T("ClientIcons_Jabber"), IDI_IMPORTAL, JABBER_CASE }, + {"client_InstanT", _T("*Instan-t*"), _T("Instan-t"), _T("ClientIcons_Jabber"), IDI_INSTANT, JABBER_CASE }, + {"client_Interaction", _T("*Interaction*"), _T("Interaction"), _T("ClientIcons_Jabber"), IDI_INTERACTION, JABBER_CASE }, + {"client_Iruka", _T("*Iruka*"), _T("Iruka"), _T("ClientIcons_Jabber"), IDI_IRUKA, JABBER_CASE }, + {"client_J2J_Transport", _T("*J2J*Transport*"), _T("J2J Transport"), _T("ClientIcons_Jabber"), IDI_J2J_TRANSPORT, JABBER_CASE }, + {"client_Jamm", _T("*Jamm*"), _T("Jamm"), _T("ClientIcons_Jabber"), IDI_JAMM, JABBER_CASE }, + {"client_JClaim", _T("*JClaim*"), _T("JClaim"), _T("ClientIcons_Jabber"), IDI_JCLAIM, JABBER_CASE }, + {"client_JMC", _T("JMC*"), _T("JMC (Jabber Mix Client)"), _T("ClientIcons_Jabber"), IDI_JMC, JABBER_CASE }, + {"client_JWChat", _T("*JWChat*"), _T("JWChat"), _T("ClientIcons_Jabber"), IDI_JWCHAT, JABBER_CASE }, + {"client_JWGC", _T("|*JWGC*|Jabber *Gram*"), _T("JWGC (Jabber WindowGram Client)"), _T("ClientIcons_Jabber"), IDI_JWGC, JABBER_CASE }, + {"client_Jabba", _T("*Jabba*"), _T("Jabba"), _T("ClientIcons_Jabber"), IDI_JABBA, JABBER_CASE }, + {"client_Jabber", _T("*Jabber*client*"), _T("Jabber client"), _T("ClientIcons_Jabber"), IDI_JABBER, JABBER_CASE }, + {"client_JabberApplet", _T("Jabber*Applet*"), _T("JabberApplet"), _T("ClientIcons_Jabber"), IDI_JABBER_APPLET, JABBER_CASE }, + {"client_JabberBeOS", _T("Jabber*BeOS*"), _T("Jabber (BeOS)"), _T("ClientIcons_Jabber"), IDI_JABBER_BEOS, JABBER_CASE }, + {"client_JabberFoX", _T("*fox*"), _T("JabberFoX"), _T("ClientIcons_Jabber"), IDI_JABBERFOX, JABBER_CASE }, + {"client_JabberMSNGR", _T("Jabber Messenger*"), _T("Jabber Messenger"), _T("ClientIcons_Jabber"), IDI_JABBER_MESSENGER, JABBER_CASE }, + {"client_JabberNaut", _T("*Jabber*Naut*"), _T("JabberNaut"), _T("ClientIcons_Jabber"), IDI_JABBERNAUT, JABBER_CASE }, + {"client_JabberZilla", _T("*Zilla*"), _T("JabberZilla"), _T("ClientIcons_Jabber"), IDI_JABBERZILLA, JABBER_CASE }, + {"client_Jabber_Net", _T("|*Jabber*Net*|*cursive.net*|*csharp*"), _T("Jabber-Net"), _T("ClientIcons_Jabber"), IDI_JABBER_NET, JABBER_CASE }, + {"client_Jabberwocky", _T("Jabberwocky*"), _T("Jabberwocky (Amiga)"), _T("ClientIcons_Jabber"), IDI_JABBERWOCKY, JABBER_CASE }, + {"client_Jabbroid", _T("*Jabbroid*"), _T("Jabbroid"), _T("ClientIcons_Jabber"), IDI_JABBROID, JABBER_CASE }, + {"client_Jajc", _T("|*Jajc*|Just Another Jabber Client"), _T("JAJC"), _T("ClientIcons_Jabber"), IDI_JAJC, JABBER_CASE }, + {"client_Jeti", _T("*Jeti*"), _T("Jeti"), _T("ClientIcons_Jabber"), IDI_JETI, JABBER_CASE }, + {"client_Jitsi", _T("*Jitsi*"), _T("Jitsi"), _T("ClientIcons_Jabber"), IDI_JITSI, JABBER_CASE }, + {"client_Joost", _T("*Joost*"), _T("Joost"), _T("ClientIcons_Jabber"), IDI_JOOST, JABBER_CASE }, + {"client_Kadu", _T("*Kadu*"), _T("Kadu"), _T("ClientIcons_Jabber"), IDI_KADU, JABBER_CASE }, + {"client_Konnekt", _T("Konnekt*"), _T("Konnekt"), _T("ClientIcons_Jabber"), IDI_KONNEKT, JABBER_CASE }, + {"client_LLuna", _T("LLuna*"), _T("LLuna"), _T("ClientIcons_Jabber"), IDI_LLUNA, JABBER_CASE }, + {"client_Lamp", _T("*Lamp*IM*"), _T("Lamp IM"), _T("ClientIcons_Jabber"), IDI_LAMP_IM, JABBER_CASE }, + {"client_Lampiro", _T("*Lampiro*"), _T("Lampiro"), _T("ClientIcons_Jabber"), IDI_LAMPIRO, JABBER_CASE }, + {"client_Landell", _T("*Landell*"), _T("Landell"), _T("ClientIcons_Jabber"), IDI_LANDELL, JABBER_CASE }, + {"client_Leaf", _T("*Leaf*"), _T("Leaf Messenger"), _T("ClientIcons_Jabber"), IDI_LEAF, JABBER_CASE }, + {"client_LinQ", _T("*LinQ*"), _T("LinQ"), _T("ClientIcons_Jabber"), IDI_LINQ, JABBER_CASE }, + {"client_M8Jabber", _T("*M8Jabber*"), _T("M8Jabber"), _T("ClientIcons_Jabber"), IDI_M8JABBER, JABBER_CASE }, + {"client_MCabber", _T("*mcabber*"), _T("MCabber"), _T("ClientIcons_Jabber"), IDI_MCABBER, JABBER_CASE }, + {"client_MGTalk", _T("|*MGTalk*|*Mobile?\?\?\?\?\?\?\?"), _T("MGTalk"), _T("ClientIcons_Jabber"), IDI_MGTALK, JABBER_CASE }, + {"client_MUCkl", _T("*MUCkl*"), _T("MUCkl"), _T("ClientIcons_Jabber"), IDI_MUCKL, JABBER_CASE }, + {"client_Mango", _T("*Mango*"), _T("Mango"), _T("ClientIcons_Jabber"), IDI_MANGO, JABBER_CASE }, + {"client_Mercury", _T("*Mercury*"), _T("Mercury Messenger"), _T("ClientIcons_Jabber"), IDI_MERCURY_MESSENGER, JABBER_CASE }, + {"client_Monal", _T("*Monal*"), _T("Monal"), _T("ClientIcons_Jabber"), IDI_MONAL, JABBER_CASE }, + {"client_MozillaChat", _T("*Mozilla*Chat*"), _T("MozillaChat"), _T("ClientIcons_Jabber"), IDI_MOZILLACHAT, JABBER_CASE }, + {"client_Neos", _T("Neos*"), _T("Neos"), _T("ClientIcons_Jabber"), IDI_NEOS, JABBER_CASE }, + {"client_Nitro", _T("Nitro*"), _T("Nitro"), _T("ClientIcons_Jabber"), IDI_NITRO, JABBER_CASE }, + {"client_Nostromo", _T("*USCSS*Nostromo*"), _T("USCSS Nostromo"), _T("ClientIcons_Jabber"), IDI_NOSTROMO, JABBER_CASE }, + {"client_OM", _T("OM*"), _T("OM aka Online Messenger"), _T("ClientIcons_Jabber"), IDI_OM, JABBER_CASE }, + {"client_OctroTalk", _T("*Octro*"), _T("OctroTalk"), _T("ClientIcons_Jabber"), IDI_OCTROTALK, JABBER_CASE }, + {"client_OneTeam", _T("*OneTeam*"), _T("OneTeam"), _T("ClientIcons_Jabber"), IDI_ONETEAM, JABBER_CASE }, + {"client_Paltalk", _T("*Paltalk*"), _T("Paltalk"), _T("ClientIcons_Jabber"), IDI_PALTALK, JABBER_CASE }, + {"client_Pandion", _T("|*Pandion*|*Ïàíäèîí*"), _T("Pandion"), _T("ClientIcons_Jabber"), IDI_PANDION, JABBER_CASE }, + {"client_Papla", _T("*Papla*"), _T("Papla"), _T("ClientIcons_Jabber"), IDI_PAPLA, JABBER_CASE }, + {"client_Poezio", _T("*Poezio*"), _T("Poezio"), _T("ClientIcons_Jabber"), IDI_POEZIO, JABBER_CASE }, + {"client_Prosody", _T("*Prosody*"), _T("Prosody"), _T("ClientIcons_Jabber"), IDI_PROSODY, JABBER_CASE }, + + {"client_Psi_plus", _T("|*PSI+*|*psi-dev.googlecode*"), _T("PSI+"), _T("ClientIcons_Jabber"), IDI_PSIPLUS, JABBER_CASE }, + {"client_Psi", _T("*Psi*"), _T("PSI"), _T("ClientIcons_Jabber"), IDI_PSI, JABBER_CASE }, + + {"client_Psto", _T("*Psto*"), _T("Psto.net"), _T("ClientIcons_Jabber"), IDI_PSTO, JABBER_CASE }, + {"client_Psyc", _T("*Psyc*"), _T("Psyc"), _T("ClientIcons_Jabber"), IDI_PSYC, JABBER_CASE }, + {"client_PyAIM-t", _T("|*pyAIM*"), _T("PyAIM-t Jabber Transport"), _T("ClientIcons_Jabber"), IDI_PYAIMT, JABBER_CASE }, + {"client_PyICQ-t", _T("|*pyICQ*|ICQ*Transport*"), _T("PyICQ-t Jabber Transport"), _T("ClientIcons_Jabber"), IDI_PYICQT, JABBER_CASE }, + {"client_PyIRC-t", _T("|*pyIRC*"), _T("PyIRC-t Jabber Transport"), _T("ClientIcons_Jabber"), IDI_PYIRCT, JABBER_CASE }, + {"client_PyMRA-t", _T("|*pyMRA*|*svn.xmpp.ru/*/mrim*|Mrim*"), _T("PyMRA-t Jabber Transport"), _T("ClientIcons_Jabber"), IDI_PYMRAT, JABBER_CASE }, + {"client_PyMSN-t", _T("|*pyMSN*"), _T("PyMSN-t Jabber Transport"), _T("ClientIcons_Jabber"), IDI_PYMSNT, JABBER_CASE }, + {"client_PyYIM-t", _T("|*pyYIM*"), _T("PyYahoo-t Jabber Transport"), _T("ClientIcons_Jabber"), IDI_PYYAHOOT, JABBER_CASE }, + {"client_Pygeon", _T("*Pygeon*"), _T("Pygeon"), _T("ClientIcons_Jabber"), IDI_PYGEON, JABBER_CASE }, + + {"client_QTJim", _T("*QTJim*"), _T("QTJim"), _T("ClientIcons_Jabber"), IDI_QTJIM, JABBER_CASE }, + {"client_QuteCom", _T("*Qute*Com*"), _T("QuteCom"), _T("ClientIcons_Jabber"), IDI_QUTECOM, JABBER_CASE }, + {"client_RenRen", _T("|*WTalkProxy0_0*|*talk.xiaonei.com*"), _T("RenRen"), _T("ClientIcons_Jabber"), IDI_RENREN, JABBER_CASE }, + {"client_SBot", _T("*SBot*"), _T("SBot"), _T("ClientIcons_Jabber"), IDI_SBOT, JABBER_CASE }, + {"client_SMTP_Transport", _T("*smtp*transport*"), _T("SMTP Transport"), _T("ClientIcons_Jabber"), IDI_SMTP_TRANSPORT, JABBER_CASE }, + {"client_SamePlace", _T("*SamePlace*"), _T("SamePlace"), _T("ClientIcons_Jabber"), IDI_SAMEPLACE, JABBER_CASE }, + {"client_Sky_Messager", _T("Sky*Mess*"), _T("Sky Messager"), _T("ClientIcons_Jabber"), IDI_SKYMESSAGER, JABBER_CASE }, + {"client_Sky_Messager", _T("*Sky*Messager*"), _T("Sky Messager"), _T("ClientIcons_Jabber"), IDI_SKYMESSAGER, JABBER_CASE }, + + {"client_xabber", _T("|*xabber*") + _T("|*bWG06mEjKFM5ygtd84Ov95P8VH0=*"), _T("xabber"), _T("ClientIcons_Jabber"), IDI_XABBER, JABBER_CASE }, + + {"client_Gabble", _T("|*Gabble*"), _T("Gabble"), _T("ClientIcons_Jabber"), IDI_GABBLE, JABBER_CASE }, + + {"client_Smack", _T("|*igniterealtime.org/*smack*|*smack*"), _T("Smack"), _T("ClientIcons_Jabber"), IDI_SMACK, JABBER_CASE }, + + {"client_SoapBox", _T("*SoapBox*"), _T("SoapBox"), _T("ClientIcons_Jabber"), IDI_SOAPBOX, JABBER_CASE }, + {"client_Spark", _T("*Spark*"), _T("Spark"), _T("ClientIcons_Jabber"), IDI_SPARK, JABBER_CASE }, + {"client_Speakall", _T("*Speak*all*"), _T("Speakall"), _T("ClientIcons_Jabber"), IDI_SPEAKALL, JABBER_CASE }, + {"client_Speeqe", _T("*Speeqe*"), _T("Speeqe"), _T("ClientIcons_Jabber"), IDI_SPEEQE, JABBER_CASE }, + {"client_Spik", _T("*Spik*"), _T("Spik"), _T("ClientIcons_Jabber"), IDI_SPIK, JABBER_CASE }, + {"client_Swift", _T("*Swift*"), _T("Swift"), _T("ClientIcons_Jabber"), IDI_SWIFT, JABBER_CASE }, + {"client_SworIM", _T("*Swor*IM*"), _T("SworIM"), _T("ClientIcons_Jabber"), IDI_SWORIM, JABBER_CASE }, + {"client_Synapse", _T("*Synapse*"), _T("Synapse"), _T("ClientIcons_Jabber"), IDI_SYNAPSE, JABBER_CASE }, + {"client_Talkdroid", _T("*Talkdroid*"), _T("Talkdroid"), _T("ClientIcons_Jabber"), IDI_TALKDROID, JABBER_CASE }, + {"client_Talkonaut", _T("*Talkonaut*"), _T("Talkonaut"), _T("ClientIcons_Jabber"), IDI_TALKONAUT, JABBER_CASE }, + {"client_Tapioca", _T("*Tapioca*"), _T("Tapioca"), _T("ClientIcons_Jabber"), IDI_TAPIOCA, JABBER_CASE }, + {"client_Teabot", _T("|*teabot*|*teabot.org/bot*|bot"), _T("Teabot"), _T("ClientIcons_Jabber"), IDI_TEABOT, JABBER_CASE }, + {"client_Telepathy", _T("*Telepathy*"), _T("Telepathy"), _T("ClientIcons_Jabber"), IDI_TELEPATHY, JABBER_CASE }, + {"client_The_Bee", _T("*The*Bee*"), _T("The Bee"), _T("ClientIcons_Jabber"), IDI_THEBEE, JABBER_CASE }, + {"client_Thunderbird", _T("*Thunderbi*"), _T("Thunderbird"), _T("ClientIcons_Jabber"), IDI_THUNDERBIRD, JABBER_CASE }, + {"client_Tigase", _T("*Tigase*"), _T("Tigase"), _T("ClientIcons_Jabber"), IDI_TIGASE, JABBER_CASE }, + {"client_TipicIM", _T("Tipic*"), _T("TipicIM"), _T("ClientIcons_Jabber"), IDI_TIPICIM, JABBER_CASE }, + {"client_Tkabber", _T("|*Tkabber*"), _T("Tkabber"), _T("ClientIcons_Jabber"), IDI_TKABBER, JABBER_CASE }, + {"client_TransactIM", _T("*Transact*"), _T("TransactIM"), _T("ClientIcons_Jabber"), IDI_TRANSACTIM, JABBER_CASE }, + {"client_Translate", _T("*Translate*"), _T("Translate component"), _T("ClientIcons_Jabber"), IDI_TRANSLATE, JABBER_CASE }, + {"client_Triple", _T("Triple*"), _T("TripleSoftwareIM (TSIM)"), _T("ClientIcons_Jabber"), IDI_TRIPLE_SOFTWARE, JABBER_CASE }, + {"client_Twitter", _T("*Twitter*"), _T("Twitter"), _T("ClientIcons_Jabber"), IDI_TWITTER, JABBER_CASE }, + {"client_VK", _T("|*VKontakte*|*vk.com*"), _T("VKontakte"), _T("ClientIcons_Jabber"), IDI_VK, JABBER_CASE }, + {"client_Vacuum", _T("*Vacuum*"), _T("Vacuum IM"), _T("ClientIcons_Jabber"), IDI_VACUUM, JABBER_CASE }, + {"client_V&V", _T("*V&V*"), _T("V&V Messenger"), _T("ClientIcons_Jabber"), IDI_VANDV, JABBER_CASE }, + {"client_Vayusphere", _T("*Vayusphere*"), _T("Vayusphere"), _T("ClientIcons_Jabber"), IDI_VAYUSPHERE, JABBER_CASE }, + {"client_Vysper", _T("*Vysper*"), _T("Vysper"), _T("ClientIcons_Jabber"), IDI_VYSPER, JABBER_CASE }, + {"client_WTW", _T("**WTW**|*wtw.k2t.eu*"), _T("WTW"), _T("ClientIcons_Jabber"), IDI_WTW, JABBER_CASE }, + {"client_WannaChat", _T("Wanna*Chat*"), _T("WannaChat"), _T("ClientIcons_Jabber"), IDI_WANNACHAT, JABBER_CASE }, + {"client_WebEx", _T("*webex.com*"), _T("Cisco WebEx Connect"), _T("ClientIcons_Jabber"), IDI_WEBEX, JABBER_CASE }, + {"client_WhisperIM", _T("*Whisper*"), _T("WhisperIM"), _T("ClientIcons_Jabber"), IDI_WHISPERIM, JABBER_CASE }, + {"client_Wija", _T("*wija*"), _T("Wija"), _T("ClientIcons_Jabber"), IDI_WIJA, JABBER_CASE }, + {"client_Wildfire", _T("Wildfire*"), _T("Wildfire"), _T("ClientIcons_Jabber"), IDI_WILDFIRE, JABBER_CASE }, + {"client_WinJab", _T("*WinJab*"), _T("WinJab"), _T("ClientIcons_Jabber"), IDI_WINJAB, JABBER_CASE }, + {"client_XMPP", _T("*XMPP*"), _T("XMPP"), _T("ClientIcons_Jabber"), IDI_XMPP, JABBER_CASE }, + {"client_Xiffian", _T("*Xiffian*"), _T("Xiffian"), _T("ClientIcons_Jabber"), IDI_XIFFIAN, JABBER_CASE }, + {"client_Yambi", _T("*Yambi*"), _T("Yambi"), _T("ClientIcons_Jabber"), IDI_YAMBI, JABBER_CASE }, + {"client_chat_bots", _T("*chat*bot*"), _T("chat bot"), _T("ClientIcons_Jabber"), IDI_CHAT_BOT, JABBER_CASE }, + {"client_dziObber", _T("*dzi?bber*"), _T("dziObber"), _T("ClientIcons_Jabber"), IDI_DZIOBBER, JABBER_CASE }, + {"client_ejabberd", _T("*ejabberd*"), _T("ejabberd"), _T("ClientIcons_Jabber"), IDI_EJABBERD, JABBER_CASE }, + {"client_emite", _T("*emite*"), _T("emite"), _T("ClientIcons_Jabber"), IDI_EMITE, JABBER_CASE }, + {"client_gYaber", _T("gYaber*"), _T("gYaber"), _T("ClientIcons_Jabber"), IDI_GYABER, JABBER_CASE }, + {"client_glu", _T("*glu*"), _T("glu"), _T("ClientIcons_Jabber"), IDI_GLU, JABBER_CASE }, + {"client_iGoogle", _T("iGoogle*"), _T("iGoogle"), _T("ClientIcons_Jabber"), IDI_IGOOGLE, JABBER_CASE }, + {"client_iJab", _T("*iJab*"), _T("iJab"), _T("ClientIcons_Jabber"), IDI_IJAB, JABBER_CASE }, + {"client_iMeem", _T("iMeem*"), _T("iMeem"), _T("ClientIcons_Jabber"), IDI_IMEEM, JABBER_CASE }, + {"client_iMov", _T("*imov*"), _T("iMov"), _T("ClientIcons_Jabber"), IDI_IMOV, JABBER_CASE }, + {"client_jTalk", _T("*jTalk*"), _T("jTalk"), _T("ClientIcons_Jabber"), IDI_JTALK, JABBER_CASE }, + {"client_jabberDisk", _T("|*jdisk*|*jabberDisk*"), _T("jabberDisk"), _T("ClientIcons_Jabber"), IDI_JABBER_DISK, JABBER_CASE }, + {"client_jabbim", _T("*jabbim*"), _T("Jabbim"), _T("ClientIcons_Jabber"), IDI_JABBIM, JABBER_CASE }, + {"client_jabiru", _T("*jabiru*"), _T("Jabiru"), _T("ClientIcons_Jabber"), IDI_JABIRU, JABBER_CASE }, + {"client_jappix", _T("*jappix*"), _T("jappix"), _T("ClientIcons_Jabber"), IDI_JAPPIX, JABBER_CASE }, + {"client_jrudevels", _T("*jrudevels*"), _T("Jrudevels"), _T("ClientIcons_Jabber"), IDI_JRUDEVELS, JABBER_CASE }, + {"client_juick", _T("*juick*"), _T("Juick"), _T("ClientIcons_Jabber"), IDI_JUICK, JABBER_CASE }, + {"client_kf", _T("|^*smack*|*kf*"), _T("kf jabber"), _T("ClientIcons_Jabber"), IDI_KF, JABBER_CASE }, + {"client_laffer", _T("*laffer*"), _T("Laffer"), _T("ClientIcons_Jabber"), IDI_LAFFER, JABBER_CASE }, + {"client_mJabber", _T("*mJabber*"), _T("mJabber"), _T("ClientIcons_Jabber"), IDI_MJABBER, JABBER_CASE }, + {"client_meinvz", _T("*meinvz*"), _T("MeinVZ"), _T("ClientIcons_Jabber"), IDI_MEINVZ, JABBER_CASE }, + {"client_moJab", _T("*moJab*"), _T("moJab"), _T("ClientIcons_Jabber"), IDI_MOJAB, JABBER_CASE }, + {"client_mobber", _T("*mobber*"), _T("mobber"), _T("ClientIcons_Jabber"), IDI_MOBBER, JABBER_CASE }, + {"client_myJabber", _T("*myJabber*"), _T("myJabber"), _T("ClientIcons_Jabber"), IDI_MYJABBER, JABBER_CASE }, + {"client_orkut", _T("*orkut*"), _T("orkut"), _T("ClientIcons_Jabber"), IDI_ORKUT, JABBER_CASE }, + {"client_pjc", _T("|*PJC*|http://pjc.googlecode.com/*"), _T("PHP Jabber Client"), _T("ClientIcons_Jabber"), IDI_PJC, JABBER_CASE }, + {"client_saje", _T("*saje*"), _T("saje"), _T("ClientIcons_Jabber"), IDI_SAJE, JABBER_CASE }, + {"client_schuelervz", _T("*schuelervz*"), _T("SchulerVZ"), _T("ClientIcons_Jabber"), IDI_SCHULERVZ, JABBER_CASE }, + {"client_studivz", _T("*studivz*"), _T("StudiVZ"), _T("ClientIcons_Jabber"), IDI_STUDIVZ, JABBER_CASE }, + {"client_tkchat", _T("*tkchat*"), _T("tkchat"), _T("ClientIcons_Jabber"), IDI_TKCHAT, JABBER_CASE }, +// {"client_uJabber", _T("*uJabber*"), _T("uJabber"), _T("ClientIcons_Jabber"), IDI_UJABBER, JABBER_CASE }, + {"client_whoisbot", _T("whoisbot"), _T("Swissjabber Whois Bot"), _T("ClientIcons_Jabber"), IDI_WHOISBOT, JABBER_CASE }, + {"client_xeus2", _T("*xeus 2*"), _T("xeus 2"), _T("ClientIcons_Jabber"), IDI_XEUS2, JABBER_CASE }, + {"client_xeus", _T("*xeus*"), _T("xeus"), _T("ClientIcons_Jabber"), IDI_XEUS, JABBER_CASE }, + {"client_yaonline", _T("|*yandex*|*yaonline*") + _T("|*ß.Îíëàéí*|*ßíäåêñ*"), _T("Ya.Online"), _T("ClientIcons_Jabber"), IDI_YAONLINE, JABBER_CASE }, + {"client_yaxim", _T("*yaxim*"), _T("yaxim"), _T("ClientIcons_Jabber"), IDI_YAXIM, JABBER_CASE }, + +//########################################################################################################################################################################################################### +//################################# TLEN ############################################################################################################################################################# +//########################################################################################################################################################################################################### + {"client_Tlen", _T("*Tlen*"), _T("Tlen.pl"), _T("ClientIcons_Tlen"), IDI_TLEN, TLEN_CASE }, + +//########################################################################################################################################################################################################### +//################################# IRC ############################################################################################################################################################# +//########################################################################################################################################################################################################### + {"client_AmIRC", _T("*AmIRC*"), _T("AmIRC"), _T("ClientIcons_IRC"), IDI_AMIRC, IRC_CASE }, + {"client_Babbel", _T("*Babbel*"), _T("Babbel"), _T("ClientIcons_IRC"), IDI_BABBEL, IRC_CASE }, + {"client_BersIRC", _T("*BersIRC*"), _T("BersIRC"), _T("ClientIcons_IRC"), IDI_BERSIRC, IRC_CASE }, + {"client_ChatZilla", _T("*ChatZilla*"), _T("ChatZilla"), _T("ClientIcons_IRC"), IDI_CHATZILLA, IRC_CASE }, + {"client_Conversation", _T("*Conversation*"), _T("Conversation"), _T("ClientIcons_IRC"), IDI_CONVERSATION, IRC_CASE }, + {"client_Eggdrop", _T("*Eggdrop*"), _T("Eggdrop"), _T("ClientIcons_IRC"), IDI_EGGDROP, IRC_CASE }, + {"client_EggdropRacBot", _T("*Eggdrop*RacBot*"), _T("Eggdrop RacBot"), _T("ClientIcons_IRC"), IDI_EGGDROP_RACBOT, IRC_CASE }, + {"client_FChat", _T("*FChat*"), _T("FChat"), _T("ClientIcons_IRC"), IDI_FCHAT, IRC_CASE }, + {"client_GDPChat", _T("*GDPChat*"), _T("GDP Web Chat"), _T("ClientIcons_IRC"), IDI_GDPCHAT, IRC_CASE }, + {"client_GoPowerTools", _T("*Go*PowerTools*"), _T("GoPowerTools"), _T("ClientIcons_IRC"), IDI_GOPOWERTOOLS, IRC_CASE }, + {"client_HydraIRC", _T("*Hydra*IRC*"), _T("HydraIRC"), _T("ClientIcons_IRC"), IDI_HYDRA_IRC, IRC_CASE }, + {"client_IRCXpro", _T("*IRCXpro*"), _T("IRCXpro"), _T("ClientIcons_IRC"), IDI_IRCXPRO, IRC_CASE }, + {"client_IceChat", _T("*Ice*Chat*"), _T("IceChat"), _T("ClientIcons_IRC"), IDI_ICECHAT, IRC_CASE }, + {"client_KSirc", _T("*ksirk*"), _T("KSirc"), _T("ClientIcons_IRC"), IDI_KSIRC, IRC_CASE }, + {"client_KVIrc", _T("*KVIrc*"), _T("KVIrc"), _T("ClientIcons_IRC"), IDI_KVIRC, IRC_CASE }, + {"client_Klient", _T("*Klient*"), _T("Klient"), _T("ClientIcons_IRC"), IDI_KLIENT, IRC_CASE }, + {"client_Konversation", _T("*Konversation*"), _T("Konversation"), _T("ClientIcons_IRC"), IDI_KONVERSATION, IRC_CASE }, + {"client_MP3Script", _T("*MP3*Script*"), _T("MP3 Script for mIRC"), _T("ClientIcons_IRC"), IDI_MP3_SCRIPT, IRC_CASE }, + {"client_NeoRaTrion", _T("*NeoRa*Trion*"), _T("NeoRa Trion"), _T("ClientIcons_IRC"), IDI_NEORATRION, IRC_CASE }, + {"client_Nettalk", _T("*Nettalk*"), _T("Nettalk"), _T("ClientIcons_IRC"), IDI_NETTALK, IRC_CASE }, + {"client_NoNameScript", _T("*NoName*Script*"), _T("NoNameScript"), _T("ClientIcons_IRC"), IDI_NONAME_SCRIPT, IRC_CASE }, + {"client_Opera", _T("*Opera*"), _T("Opera"), _T("ClientIcons_IRC"), IDI_OPERA, IRC_CASE }, + {"client_PJIRC", _T("*PJIRC*"), _T("PJIRC"), _T("ClientIcons_IRC"), IDI_PJIRC, IRC_CASE }, + {"client_Pirch", _T("*Pirch*"), _T("Pirch"), _T("ClientIcons_IRC"), IDI_PIRCH, IRC_CASE }, + {"client_PocketIRC", _T("*Pocket*IRC*"), _T("Pocket IRC"), _T("ClientIcons_IRC"), IDI_POCKET_IRC, IRC_CASE }, + {"client_ProChat", _T("*Pro*Chat*"), _T("ProChat"), _T("ClientIcons_IRC"), IDI_PROCHAT, IRC_CASE }, + {"client_SmartIRC", _T("*Smart*IRC*"), _T("SmartIRC"), _T("ClientIcons_IRC"), IDI_SMART_IRC, IRC_CASE }, + {"client_Snak", _T("*Snak*"), _T("Snak"), _T("ClientIcons_IRC"), IDI_SNAK, IRC_CASE }, + {"client_SysReset", _T("*Sys*Reset*"), _T("SysReset"), _T("ClientIcons_IRC"), IDI_SYSRESET, IRC_CASE }, + {"client_VircaIRC", _T("*VircaIRC*"), _T("VircaIRC"), _T("ClientIcons_IRC"), IDI_VIRCAIRC, IRC_CASE }, + {"client_VisionIRC", _T("*VisionIRC*"), _T("VisionIRC"), _T("ClientIcons_IRC"), IDI_VISIONIRC, IRC_CASE }, + {"client_VisualIRC", _T("*VisualIRC*"), _T("VisualIRC"), _T("ClientIcons_IRC"), IDI_VISUALIRC, IRC_CASE }, + {"client_VortecIRC", _T("*VortecIRC*"), _T("VortecIRC"), _T("ClientIcons_IRC"), IDI_VORTECIRC, IRC_CASE }, + {"client_WLIrc", _T("*WLIrc*"), _T("WLIrc"), _T("ClientIcons_IRC"), IDI_WLIRC, IRC_CASE }, + {"client_XChatAqua", _T("*X*Chat*Aqua*"), _T("X-Chat Aqua"), _T("ClientIcons_IRC"), IDI_XCHATAQUA, IRC_CASE }, + {"client_XiRCON", _T("*XiRCON*"), _T("XiRCON"), _T("ClientIcons_IRC"), IDI_XIRCON, IRC_CASE }, + {"client_Xirc", _T("*Xirc*"), _T("Xirc"), _T("ClientIcons_IRC"), IDI_XIRC, IRC_CASE }, + {"client_ZipTorrent", _T("*ZipTorrent*"), _T("ZipTorrent"), _T("ClientIcons_IRC"), IDI_ZIPTORRENT, IRC_CASE }, + {"client_aMule", _T("*aMule*"), _T("aMule"), _T("ClientIcons_IRC"), IDI_AMULE, IRC_CASE }, + {"client_cbirc", _T("*cbirc*"), _T("cbirc"), _T("ClientIcons_IRC"), IDI_CBIRC, IRC_CASE }, + {"client_dIRC", _T("*dIRC*"), _T("dIRC"), _T("ClientIcons_IRC"), IDI_DIRC, IRC_CASE }, + + {"client_ircle", _T("*ircle*"), _T("ircle"), _T("ClientIcons_IRC"), IDI_IRCLE, IRC_CASE }, + {"client_jircii", _T("*jircii*"), _T("jircii"), _T("ClientIcons_IRC"), IDI_JIRCII, IRC_CASE }, + {"client_jmIrc", _T("*jmIrc*"), _T("jmIrc"), _T("ClientIcons_IRC"), IDI_JMIRC, IRC_CASE }, + {"client_mIRC", _T("*mIRC*"), _T("mIRC"), _T("ClientIcons_IRC"), IDI_MIRC, IRC_CASE }, + {"client_pIRC", _T("*pIRC*"), _T("pIRC"), _T("ClientIcons_IRC"), IDI_PIRC, IRC_CASE }, + {"client_piorun", _T("*piorun*"), _T("Piorun"), _T("ClientIcons_IRC"), IDI_PIORUN, IRC_CASE }, + {"client_psyBNC", _T("*psyBNC*"), _T("psyBNC"), _T("ClientIcons_IRC"), IDI_PSYBNC, IRC_CASE }, + {"client_savIRC", _T("*savIRC*"), _T("savIRC"), _T("ClientIcons_IRC"), IDI_SAVIRC, IRC_CASE }, + {"client_wmIRC", _T("*wmIRC*"), _T("wmIRC"), _T("ClientIcons_IRC"), IDI_WMIRC, IRC_CASE }, + {"client_xBitch", _T("*xBitch*"), _T("xBitch"), _T("ClientIcons_IRC"), IDI_XBITCH, IRC_CASE }, + {"client_xChat", _T("*xChat*"), _T("xChat"), _T("ClientIcons_IRC"), IDI_XCHAT, IRC_CASE }, + {"client_zsIRC", _T("*zsIRC*"), _T("zsIRC"), _T("ClientIcons_IRC"), IDI_ZSIRC, IRC_CASE }, + + {"client_eMuleMorphXT", _T("eMule*MorphXT*"), _T("eMule MorphXT"), _T("ClientIcons_IRC"), IDI_EMULE_MORPHXT, IRC_CASE }, + {"client_eMuleNeo", _T("eMule*Neo*"), _T("eMule Neo"), _T("ClientIcons_IRC"), IDI_EMULE_NEO, IRC_CASE }, + {"client_eMulePlus", _T("|eMule*plus*|eMule*+*"), _T("eMule+"), _T("ClientIcons_IRC"), IDI_EMULE_PLUS, IRC_CASE }, + {"client_eMuleXtreme", _T("eMule*Xtreme*"), _T("eMule Xtreme"), _T("ClientIcons_IRC"), IDI_EMULE_XTREME, IRC_CASE }, + {"client_eMule", _T("*eMule*"), _T("eMule"), _T("ClientIcons_IRC"), IDI_EMULE, IRC_CASE }, + + {"client_IRCUnknown", _T("*IRC*"), _T("Unknown IRC client"), _T("ClientIcons_IRC"), IDI_IRC_UNKNOWN, IRC_CASE }, + +//########################################################################################################################################################################################################### +//################################# MSN ############################################################################################################################################################# +//########################################################################################################################################################################################################### + {"client_WLM11", _T("WLM*2011*"), _T("Windows Live 11"), _T("ClientIcons_MSN"), IDI_WLM_10, MSN_CASE }, + {"client_WLM10", _T("WLM*2010*"), _T("Windows Live 10"), _T("ClientIcons_MSN"), IDI_WLM_10, MSN_CASE }, + {"client_WLM9", _T("WLM*9*"), _T("Windows Live v9.x"), _T("ClientIcons_MSN"), IDI_WLM_9, MSN_CASE }, + {"client_MSN8", _T("|WLM*8.*|MSN*8.*"), _T("Windows Live v8.x"), _T("ClientIcons_MSN"), IDI_MSN_8, MSN_CASE }, + {"client_MSN7x", _T("MSN*7.*"), _T("MSN Messenger v7.x"), _T("ClientIcons_MSN"), IDI_MSN_7, MSN_CASE }, + {"client_MSN6x", _T("MSN*6.*"), _T("MSN Messenger v6.x"), _T("ClientIcons_MSN"), IDI_MSN_6, MSN_CASE }, + {"client_MSN45", _T("MSN*4.x-5.x"), _T("MSN Messenger v4.x-5.x"), _T("ClientIcons_MSN"), IDI_MSN_45, MSN_CASE }, + {"client_MSN4Mac", _T("MSN*Mac*"), _T("MSN for Mac"), _T("ClientIcons_MSN"), IDI_MSN_MAC, MSN_CASE }, + {"client_aMSN", _T("*aMSN*"), _T("aMSN"), _T("ClientIcons_MSN"), IDI_AMSN, MSN_CASE }, + {"client_MSN_Web", _T("WebMessenger*"), _T("WebMessenger"), _T("ClientIcons_MSN"), IDI_WEBMESSENGER, MSN_CASE }, + {"client_MSN", _T("|WLM*|MSN*|Windows Live*"), _T("MSN"), _T("ClientIcons_MSN"), IDI_MSN, MSN_CASE, TRUE }, + +//########################################################################################################################################################################################################### +//################################# AIM ############################################################################################################################################################# +//########################################################################################################################################################################################################### + {"client_Aim7", _T("AIM*7.*"), _T("AIM v7.x"), _T("ClientIcons_AIM"), IDI_AIM_7, AIM_CASE }, + {"client_Aim6", _T("AIM*6.*"), _T("AIM v6.x"), _T("ClientIcons_AIM"), IDI_AIM_6, AIM_CASE }, + {"client_Aim5", _T("AIM*5.*"), _T("AIM v5.x"), _T("ClientIcons_AIM"), IDI_AIM_5, AIM_CASE }, + {"client_Aim4", _T("AIM*4.*"), _T("AIM v4.x"), _T("ClientIcons_AIM"), IDI_AIM_4, AIM_CASE }, + + {"client_AIM_Triton", _T("*AIM*Triton*"), _T("AIM Triton"), _T("ClientIcons_AIM"), IDI_AIM_TRITON, AIM_CASE }, + {"client_AimMac", _T("AIM*Mac*"), _T("AIM for MacOS"), _T("ClientIcons_AIM"), IDI_AIM_MAC, AIM_CASE }, + {"client_AimMobile", _T("|AIM*Mobile*|AIM*gprs*|Aim*sms*"), _T("AIM Mobile"), _T("ClientIcons_AIM"), IDI_AIM_MOBILE, AIM_CASE }, + {"client_Naim", _T("*naim*"), _T("Naim"), _T("ClientIcons_AIM"), IDI_NAIM, AIM_CASE }, + {"client_miniaim", _T("*miniaim*"), _T("miniaim"), _T("ClientIcons_AIM"), IDI_MINIAIM, AIM_CASE }, + {"client_TerraIM", _T("*Terra*"), _T("TerraIM"), _T("ClientIcons_AIM"), IDI_TERRAIM, AIM_CASE }, + {"client_AIM", _T("AIM*"), _T("AIM"), _T("ClientIcons_AIM"), IDI_AIM, AIM_CASE }, + +//########################################################################################################################################################################################################### +//################################# YAHOO ############################################################################################################################################################# +//########################################################################################################################################################################################################### + {"client_Yahoo10", _T("*Yahoo*10*"), _T("Yahoo v10.x"), _T("ClientIcons_Yahoo"), IDI_YAHOO10, YAHOO_CASE }, + {"client_Yahoo9", _T("*Yahoo*9*"), _T("Yahoo v9.x"), _T("ClientIcons_Yahoo"), IDI_YAHOO8, YAHOO_CASE }, + {"client_Yahoo8", _T("*Yahoo*8*"), _T("Yahoo v8.x"), _T("ClientIcons_Yahoo"), IDI_YAHOO8, YAHOO_CASE }, + {"client_Yahoo7", _T("*Yahoo*7*"), _T("Yahoo v7.x"), _T("ClientIcons_Yahoo"), IDI_YAHOO7, YAHOO_CASE }, + {"client_Yahoo6", _T("*Yahoo*6*"), _T("Yahoo v6.x"), _T("ClientIcons_Yahoo"), IDI_YAHOO6, YAHOO_CASE }, + {"client_Yahoo5", _T("*Yahoo*5*"), _T("Yahoo v5.x"), _T("ClientIcons_Yahoo"), IDI_YAHOO5, YAHOO_CASE }, + {"client_YahGoMobile", _T("|Yahoo*Go*|Yahoo*Mobile*"), _T("Yahoo! Go Mobile"), _T("ClientIcons_Yahoo"), IDI_YAHOO_GO_MOBILE, YAHOO_CASE }, + {"client_PingBox", _T("*Yahoo*PingBox*"), _T("Yahoo PingBox"), _T("ClientIcons_Yahoo"), IDI_PINGBOX, YAHOO_CASE }, + {"client_YahooWeb", _T("*Yahoo*Web*Messenger"), _T("Yahoo Web Messenger"), _T("ClientIcons_Yahoo"), IDI_YAHOO10, YAHOO_CASE }, + {"client_libyahoo2", _T("*libyahoo*"), _T("libyahoo2"), _T("ClientIcons_Yahoo"), IDI_LIBYAHOO2, YAHOO_CASE }, + {"client_Yahoo", _T("*Yahoo*"), _T("Yahoo"), _T("ClientIcons_Yahoo"), IDI_YAHOO, YAHOO_CASE }, + +//########################################################################################################################################################################################################### +//################################# GADU-GADU ######################################################################################################################################################### +//########################################################################################################################################################################################################### + {"client_Gadu_Gadu_7", _T("Gadu-Gadu*7*"), _T("Gadu-Gadu v7.x"), _T("ClientIcons_Gadu"), IDI_GADU_GADU_7, GG_CASE }, + {"client_Gadu_Gadu_6", _T("Gadu-Gadu*6*"), _T("Gadu-Gadu v6.x"), _T("ClientIcons_Gadu"), IDI_GADU_GADU_6, GG_CASE }, + +//########################################################################################################################################################################################################### +//################################# MAIL.RU ######################################################################################################################################################### +//########################################################################################################################################################################################################### + {"client_MRA_official", _T("|magent*|Mail.ru Agent*official*") + _T("|Mail.ru Agent*PC*") + _T("|http://agent.mail.ru*"), _T("Mail.Ru Agent (official)"), _T("ClientIcons_MRA"), IDI_MAIL_RU_OFFICIAL, MRA_CASE }, + {"client_MRA_Mobile", _T("|wmagent*|MobileAgent*") + _T("|sagent*|Mail.ru Agent*Symbian*") + _T("|jagent*"), _T("Mail.Ru Mobile Agent"), _T("ClientIcons_MRA"), IDI_MAIL_RU_MOBILE, MRA_CASE }, + {"client_MRA_web", _T("Web Agent*"), _T("Mail.Ru Web Agent"), _T("ClientIcons_MRA"), IDI_MAIL_RU_WEBAGENT, MRA_CASE }, + {"client_MRA_unknown", _T("Mail.ru Agent*"), _T("Mail.Ru (unknown client)"), _T("ClientIcons_MRA"), IDI_MAIL_RU_UNKNOWN, MRA_CASE }, + +//########################################################################################################################################################################################################### +//################################# OTHER CLIENTS ##################################################################################################################################################### +//########################################################################################################################################################################################################### + {"client_Android", _T("*Android*"), _T("Android"), _T("ClientIcons_multiproto"), IDI_ANDROID, MULTI_CASE, TRUE }, + {"client_Pidgin", _T("|*Pidgin*|*libpurple*|Purple*"), _T("Pidgin (libpurple)"), _T("ClientIcons_multiproto"), IDI_PIDGIN, MULTI_CASE }, + + {"client_Skype", _T("*Skype**"), _T("Skype client"), _T("ClientIcons_Others"), IDI_SKYPE, OTHER_PROTOS_CASE }, + +//########################################################################################################################################################################################################### +//################################# WEATHER ######################################################################################################################################################### +//########################################################################################################################################################################################################### + {"client_accu", _T("*accuweather*"), _T("AccuWeather"), _T("ClientIcons_Weather"), IDI_ACCU, WEATHER_CASE, TRUE }, + {"client_gismeteo", _T("*gismeteo*"), _T("GisMeteo"), _T("ClientIcons_Weather"), IDI_GISMETEO, WEATHER_CASE, TRUE }, + {"client_intelli", _T("*intellicast*"), _T("Intellicast"), _T("ClientIcons_Weather"), IDI_INTELLI, WEATHER_CASE, TRUE }, + {"client_meteogid", _T("|*meteo-gid*|*meteogid*"), _T("Meteo-Gid"), _T("ClientIcons_Weather"), IDI_METEOGID, WEATHER_CASE, TRUE }, + {"client_meteonovosti", _T("*meteonovosti*"), _T("Meteonovosti"), _T("ClientIcons_Weather"), IDI_METEONOVOSTI, WEATHER_CASE, TRUE }, + {"client_noaa", _T("*noaa*"), _T("NOAA Weather"), _T("ClientIcons_Weather"), IDI_NOAA, WEATHER_CASE, TRUE }, + {"client_real", _T("*realmeteo*"), _T("RealMeteo"), _T("ClientIcons_Weather"), IDI_REALMETEO, WEATHER_CASE, TRUE }, + {"client_under", _T("Weather Underground*"), _T("Weather Underground"), _T("ClientIcons_Weather"), IDI_UNDERGROUND, WEATHER_CASE, TRUE }, + {"client_weatherxml", _T("*WeatherXML*"), _T("WeatherXML"), _T("ClientIcons_Weather"), IDI_WEATHERXML, WEATHER_CASE, TRUE }, + {"client_wetter", _T("*wetter*"), _T("Wetter"), _T("ClientIcons_Weather"), IDI_WETTER, WEATHER_CASE, TRUE }, + {"client_yweather", _T("*Yahoo Weather*"), _T("Yahoo Weather"), _T("ClientIcons_Weather"), IDI_YWEATHER, WEATHER_CASE, TRUE }, + {"client_weather_cn", _T("*weather.com.cn*"), _T("Weather CN"), _T("ClientIcons_Weather"), IDI_WEATHER_CN, WEATHER_CASE, TRUE }, + {"client_weather", _T("*weather*"), _T("Weather"), _T("ClientIcons_Weather"), IDI_WEATHER, WEATHER_CASE, TRUE }, + +//########################################################################################################################################################################################################### +//################################# RSS ############################################################################################################################################################# +//########################################################################################################################################################################################################### + {"client_rss09x", _T("*RSS*0.9*"), _T("RSS 0.9x"), _T("ClientIcons_RSS"), IDI_RSS09, RSS_CASE }, + {"client_rss2", _T("*RSS*2.*"), _T("RSS 2"), _T("ClientIcons_RSS"), IDI_RSS2, RSS_CASE }, + {"client_rss1", _T("*RSS*1.*"), _T("RSS 1"), _T("ClientIcons_RSS"), IDI_RSS1, RSS_CASE }, + {"client_atom3", _T("*Atom*3.*"), _T("Atom 3"), _T("ClientIcons_RSS"), IDI_ATOM3, RSS_CASE }, + {"client_atom1", _T("*Atom*1.*"), _T("Atom 1"), _T("ClientIcons_RSS"), IDI_ATOM1, RSS_CASE }, + +//########################################################################################################################################################################################################### +//################################# QQ ############################################################################################################################################################# +//########################################################################################################################################################################################################### + {"client_MobileQQ", _T("|Mobile*QQ*|iPhone*QQ*|QQ WAP*"), _T("Mobile QQ"), _T("ClientIcons_QQ"), IDI_MOBILEQQ, QQ_CASE }, + {"client_QQConcept", _T("QQ*Concept*"), _T("QQ Concept"), _T("ClientIcons_QQ"), IDI_QQCONCEPT, QQ_CASE }, + {"client_QQCRM", _T("QQ*CRM*"), _T("QQ CRM"), _T("ClientIcons_QQ"), IDI_QQCRM, QQ_CASE }, + {"client_QQSilver", _T("QQ*Silverlight*"), _T("QQ Silverlight"), _T("ClientIcons_QQ"), IDI_QQSILVER, QQ_CASE }, + {"client_TM2008", _T("|TM2008*|TM2009*|TM2010*"), _T("TM 2008 and >"), _T("ClientIcons_QQ"), IDI_TM2008, QQ_CASE }, + {"client_TM", _T("TM*"), _T("TM"), _T("ClientIcons_QQ"), IDI_TM, QQ_CASE }, + {"client_QQInt", _T("QQ*International*"), _T("QQ International"), _T("ClientIcons_QQ"), IDI_QQINT, QQ_CASE }, + {"client_YamQQ", _T("YamQQ*"), _T("Yam QQ"), _T("ClientIcons_QQ"), IDI_YAMQQ, QQ_CASE }, + {"client_WebQQ", _T("WebQQ*"), _T("WebQQ"), _T("ClientIcons_QQ"), IDI_WEBQQ, QQ_CASE }, + {"client_QQ", _T("QQ*"), _T("QQ"), _T("ClientIcons_QQ"), IDI_QQ, QQ_CASE }, + +//########################################################################################################################################################################################################### +//################################# UNDEFINED CLIENTS ################################################################################################################################################# +//########################################################################################################################################################################################################### + {"client_Notfound", _T("Notfound"), _T("client not found"), _T(""), IDI_NOTFOUND, OTHERS_CASE, TRUE }, + {"client_Unknown", _T("|*Unknown*|..."), _T("unknown client"), _T(""), IDI_UNKNOWN, OTHERS_CASE, TRUE }, + {"client_Undetected", _T("?*"), _T("undetected client"), _T(""), IDI_UNDETECTED, OTHERS_CASE, TRUE }, + +}; + +int DEFAULT_KN_FP_MASK_COUNT = SIZEOF(def_kn_fp_mask); + +//########################################################################################################################################################################################################### +//################################# OVERLAYS LAYER #1 ################################################################################################################################################# +//########################################################################################################################################################################################################### + + +KN_FP_MASK def_kn_fp_overlays_mask[] = +{// {"Client_IconName", _T("|^*Mask*|*names*"), _T("Icon caption"), _T("iconpack name"), IDI_RESOURCE_ID, CLIENT_CASE, OVERLAY? }, +//########################################################################################################################################################################################################### +//################################# MIRANDA PACKS OVERLAYS ######################################################################################################################################### +//########################################################################################################################################################################################################### + {"client_AF_pack", _T("*AF*Pack*"), _T("AF"), _T("ClientIcons_packs"), IDI_MIRANDA_AF, MIRANDA_PACKS_CASE }, + {"client_AlfaMaR_pack", _T("*AlfaMaR*"), _T("AlfaMaR"), _T("ClientIcons_packs"), IDI_MIRANDA_ALFAMAR, MIRANDA_PACKS_CASE }, + {"client_Amatory_pack", _T("*Amatory*"), _T("Amatory"), _T("ClientIcons_packs"), IDI_MIRANDA_AMATORY, MIRANDA_PACKS_CASE }, + {"client_BRI_pack", _T("*bri*edition*"), _T("Bri edition"), _T("ClientIcons_packs"), IDI_MIRANDA_BRI, MIRANDA_PACKS_CASE }, + {"client_Devil_pack", _T("*6.6.6*"), _T("Devil Suite"), _T("ClientIcons_packs"), IDI_MIRANDA_DEVIL, MIRANDA_PACKS_CASE }, + {"client_E33_pack", _T("*[E33]*"), _T("E33"), _T("ClientIcons_packs"), IDI_MIRANDA_E33, MIRANDA_PACKS_CASE }, + {"client_FR_pack", _T("*FR*Pack*"), _T("Miranda FR"), _T("ClientIcons_packs"), IDI_MIRANDA_FR, MIRANDA_PACKS_CASE }, + {"client_Faith_pack", _T("*Faith*Pack*"), _T("Faith"), _T("ClientIcons_packs"), IDI_MIRANDA_FAITH, MIRANDA_PACKS_CASE }, + {"client_Final_pack", _T("*[Final*Pack]*"), _T("Final Pack"), _T("ClientIcons_packs"), IDI_MIRANDA_FINAL, MIRANDA_PACKS_CASE }, + {"client_Freize_pack", _T("*Freize*"), _T("Freize"), _T("ClientIcons_packs"), IDI_MIRANDA_FREIZE, MIRANDA_PACKS_CASE }, + {"client_Ghost_pack", _T("*Ghost's*"), _T("Ghost's Pack"), _T("ClientIcons_packs"), IDI_MIRANDA_GHOST, MIRANDA_PACKS_CASE }, + {"client_HCoffee_pack", _T("*[HotCoffee]*"), _T("HotCoffee"), _T("ClientIcons_packs"), IDI_MIRANDA_CAPPUCCINO, MIRANDA_PACKS_CASE }, + {"client_HierOS_pack", _T("*HierOS*"), _T("HierOS"), _T("ClientIcons_packs"), IDI_MIRANDA_HIEROS, MIRANDA_PACKS_CASE }, + {"client_ICE_pack", _T("|*miranda*[ice*]|*induction*"), _T("iCE / Induction"), _T("ClientIcons_packs"), IDI_MIRANDA_INDUCTION, MIRANDA_PACKS_CASE }, + {"client_KDL_pack", _T("|*KDL*|*ÊÄË*"), _T("KDL"), _T("ClientIcons_packs"), IDI_MIRANDA_KDL, MIRANDA_PACKS_CASE }, + {"client_Kolich_pack", _T("*Kolich*"), _T("Kolich"), _T("ClientIcons_packs"), IDI_MIRANDA_KOLICH, MIRANDA_PACKS_CASE }, + {"client_Kuzzman_pack", _T("*kuzzman*"), _T("Kuzzman"), _T("ClientIcons_packs"), IDI_MIRANDA_KUZZMAN, MIRANDA_PACKS_CASE }, + {"client_Lenin_pack", _T("*[Lenin*]*"), _T("Lenin Pack"), _T("ClientIcons_packs"), IDI_MIRANDA_LENINPACK, MIRANDA_PACKS_CASE }, + {"client_Lestat_pack", _T("*[Lpack]*"), _T("Lestat Pack"), _T("ClientIcons_packs"), IDI_MIRANDA_LESTAT, MIRANDA_PACKS_CASE }, + {"client_LexSys_pack", _T("|*MirandaLS*|*LexSys*"), _T("LexSys"), _T("ClientIcons_packs"), IDI_MIRANDA_LEXSYS, MIRANDA_PACKS_CASE }, + {"client_MD_pack", _T("*MDpack*"), _T("MDpack"), _T("ClientIcons_packs"), IDI_MIRANDA_MD, MIRANDA_PACKS_CASE }, + {"client_Mataes_pack", _T("*Mataes*"), _T("Mataes Pack"), _T("ClientIcons_packs"), IDI_MIRANDA_MATAES, MIRANDA_PACKS_CASE }, + {"client_Mir_ME_pack", _T("*[Miranda ME]*"), _T("Miranda ME"), _T("ClientIcons_packs"), IDI_MIRANDA_ME, MIRANDA_PACKS_CASE }, + {"client_Native_pack", _T("*Native*"), _T("Native"), _T("ClientIcons_packs"), IDI_MIRANDA_NATIVE, MIRANDA_PACKS_CASE }, + {"client_New_Style_pack", _T("*New Style*"), _T("New Style"), _T("ClientIcons_packs"), IDI_MIRANDA_NEW_STYLE, MIRANDA_PACKS_CASE }, + {"client_Pilot_pack", _T("*Pilot*"), _T("Pilot"), _T("ClientIcons_packs"), IDI_MIRANDA_PILOT, MIRANDA_PACKS_CASE }, + {"client_Razunter_pack", _T("*Razunter's*"), _T("Razunter's Pk"), _T("ClientIcons_packs"), IDI_MIRANDA_RAZUNTER, MIRANDA_PACKS_CASE }, + {"client_Robyer_pack", _T("*RobyerPack*"), _T("Robyer Pack"), _T("ClientIcons_packs"), IDI_MIRANDA_ROBYER, MIRANDA_PACKS_CASE }, + {"client_SSS_pack", _T("*sss*pack*"), _T("SSS build"), _T("ClientIcons_packs"), IDI_MIRANDA_SSS_MOD, MIRANDA_PACKS_CASE }, + {"client_Se7ven_pack", _T("|^*sss*|*[S7*pack]*|*[S7]*"), _T("Se7ven"), _T("ClientIcons_packs"), IDI_MIRANDA_SE7VEN, MIRANDA_PACKS_CASE }, + {"client_SpellhowleR_pack", _T("*Spellhowler*"), _T("xSpellhowleRx Pack"), _T("ClientIcons_packs"), IDI_MIRANDA_SPELLHOWLER,MIRANDA_PACKS_CASE }, + {"client_Stalker_pack", _T("*Stalker*"), _T("Stalker"), _T("ClientIcons_packs"), IDI_MIRANDA_STALKER, MIRANDA_PACKS_CASE }, + {"client_Tweety_pack", _T("*tweety*"), _T("Tweety"), _T("ClientIcons_packs"), IDI_MIRANDA_TWEETY, MIRANDA_PACKS_CASE }, + {"client_Umedon_pack", _T("*Miranda*Umedon*"), _T("Umedon"), _T("ClientIcons_packs"), IDI_MIRANDA_UMEDON, MIRANDA_PACKS_CASE }, + {"client_ValeraVi_pack", _T("*Valera*Vi*"), _T("ValeraVi"), _T("ClientIcons_packs"), IDI_MIRANDA_VALERAVI, MIRANDA_PACKS_CASE }, + {"client_Watcher_pack", _T("*[Watcher*]*"), _T("Watcher Pack"), _T("ClientIcons_packs"), IDI_MIRANDA_WATCHER, MIRANDA_PACKS_CASE }, + {"client_YAOL_pack", _T("*yaol*"), _T("YAOL"), _T("ClientIcons_packs"), IDI_MIRANDA_YAOL, MIRANDA_PACKS_CASE }, + {"client_dar_veter_pack", _T("*Dar_veter*"), _T("Dar_veter Pack"), _T("ClientIcons_packs"), IDI_MIRANDA_DAR, MIRANDA_PACKS_CASE }, + {"client_dmikos_pack", _T("*dmikos*"), _T("Dmikos"), _T("ClientIcons_packs"), IDI_MIRANDA_DMIKOS, MIRANDA_PACKS_CASE }, + {"client_zeleboba_pack", _T("*zeleboba*"), _T("zeleboba's"), _T("ClientIcons_packs"), IDI_MIRANDA_ZELEBOBA, MIRANDA_PACKS_CASE }, + +//########################################################################################################################################################################################################### +//################################# PROTO OVERLAYS ################################################################################################################################################# +//########################################################################################################################################################################################################### + {"client_AIM_over", _T("*AIM*"), _T("AIM overlay"), _T("ClientIcons_overlays"), IDI_AIMOSCAR_OVERLAY, OVERLAYS_PROTO_CASE }, //FIX + {"client_ICQJ_Plus_over", _T("*ICQ*Plus*"), _T("ICQJ Plus Mod overlay"), _T("ClientIcons_overlays"), IDI_ICQJ_PLUS_OVERLAY, OVERLAYS_PROTO_CASE }, + {"client_ICQJ_over", _T("|^ICQ*|*ICQ*"), _T("ICQJ overlay"), _T("ClientIcons_overlays"), IDI_ICQJ_OVERLAY, OVERLAYS_PROTO_CASE }, + {"client_IRC_over", _T("Miranda*IRC*"), _T("IRC overlay"), _T("ClientIcons_overlays"), IDI_IRC_OVERLAY, OVERLAYS_PROTO_CASE }, + {"client_JGmail_over", _T("*JGmail*"), _T("JGmail overlay"), _T("ClientIcons_overlays"), IDI_GMAIL_OVERLAY, OVERLAYS_PROTO_CASE }, + {"client_JGTalk_over", _T("*JGTalk*"), _T("JGTalk overlay"), _T("ClientIcons_overlays"), IDI_JGTALK_OVERLAY, OVERLAYS_PROTO_CASE }, + {"client_Jabber_over", _T("|Miranda*Jabber*|*t Jabber*"), _T("Jabber overlay"), _T("ClientIcons_overlays"), IDI_JABBER_OVERLAY, OVERLAYS_PROTO_CASE }, + {"client_MailRu_over", _T("|*Mail.ru*IM*|*MRA*"), _T("Mail.Ru Agent overlay"), _T("ClientIcons_overlays"), IDI_MAILRU_OVERLAY, OVERLAYS_PROTO_CASE }, + {"client_MSN_over", _T("Miranda*MSN*"), _T("MSN overlay"), _T("ClientIcons_overlays"), IDI_MSN_OVERLAY, OVERLAYS_PROTO_CASE }, + {"client_QQ_over", _T("|Miranda*QQ*|MIMQQ*"), _T("QQ overlay"), _T("ClientIcons_overlays"), IDI_QQ_OVERLAY, OVERLAYS_PROTO_CASE }, + {"client_Tlen_over", _T("*tlen.pl"), _T("Tlen.pl overlay"), _T("ClientIcons_overlays"), IDI_TLEN_OVERLAY, OVERLAYS_PROTO_CASE }, + {"client_Yahoo_over", _T("*yahoo*"), _T("Yahoo overlay"), _T("ClientIcons_overlays"), IDI_YAHOO_OVERLAY, OVERLAYS_PROTO_CASE }, + +//########################################################################################################################################################################################################### +//################################# CLIENT VERSION OVERLAYS ######################################################################################################################################### +//########################################################################################################################################################################################################### + {"client_Mir_010_over", _T("*Miranda*0.10.*"), _T("Miranda v0.10 overlay"), _T("ClientIcons_Miranda"), IDI_MIRANDA_10, MIRANDA_VERSION_CASE }, + {"client_Mir_09_over", _T("*Miranda*0.9.*"), _T("Miranda v0.9 overlay"), _T("ClientIcons_Miranda"), IDI_MIRANDA_9, MIRANDA_VERSION_CASE }, + {"client_Mir_08_over", _T("*Miranda*0.8.*"), _T("Miranda v0.8 overlay"), _T("ClientIcons_Miranda"), IDI_MIRANDA_8, MIRANDA_VERSION_CASE }, + {"client_Mir_07_over", _T("*Miranda*0.7.*"), _T("Miranda v0.7 overlay"), _T("ClientIcons_Miranda"), IDI_MIRANDA_7, MIRANDA_VERSION_CASE }, + {"client_Mir_06_over", _T("*Miranda*0.6.*"), _T("Miranda v0.6 overlay"), _T("ClientIcons_Miranda"), IDI_MIRANDA_6, MIRANDA_VERSION_CASE }, + {"client_Mir_05_over", _T("*Miranda*0.5.*"), _T("Miranda v0.5 overlay"), _T("ClientIcons_Miranda"), IDI_MIRANDA_5, MIRANDA_VERSION_CASE }, + {"client_Mir_04_over", _T("*Miranda*0.4.*"), _T("Miranda v0.4 overlay"), _T("ClientIcons_Miranda"), IDI_MIRANDA_4, MIRANDA_VERSION_CASE }, + + {"client_ICQ6_over", _T("ICQ*6*"), _T("ICQ v6.x overlay"), _T("ClientIcons_ICQ"), IDI_ICQ6_OVERLAY, ICQ_OFFICIAL_CASE }, + {"client_ICQ7_over", _T("ICQ*7*"), _T("ICQ v7.x overlay"), _T("ClientIcons_ICQ"), IDI_ICQ7_OVERLAY, ICQ_OFFICIAL_CASE }, + {"client_ICQ8_over", _T("ICQ*8*"), _T("ICQ v8.x overlay"), _T("ClientIcons_ICQ"), IDI_ICQ8_OVERLAY, ICQ_OFFICIAL_CASE }, + + {"client_Yahoo10", _T("*Yahoo 10*"), _T("Yahoo v10.x overlay"), _T("ClientIcons_Yahoo"), IDI_CLIENT_YAHOO10, YAHOO_CASE }, + {"client_Yahoo9", _T("*Yahoo 9*"), _T("Yahoo v9.x overlay"), _T("ClientIcons_Yahoo"), IDI_CLIENT_YAHOO9, YAHOO_CASE }, + {"client_Yahoo8", _T("*Yahoo 8*"), _T("Yahoo v8.x overlay"), _T("ClientIcons_Yahoo"), IDI_CLIENT_YAHOO8, YAHOO_CASE }, + {"client_Yahoo7", _T("*Yahoo 7*"), _T("Yahoo v7.x overlay"), _T("ClientIcons_Yahoo"), IDI_CLIENT_YAHOO7, YAHOO_CASE }, + {"client_Yahoo6", _T("*Yahoo 6*"), _T("Yahoo v6.x overlay"), _T("ClientIcons_Yahoo"), IDI_CLIENT_YAHOO6, YAHOO_CASE }, + {"client_Yahoo5", _T("*Yahoo 5*"), _T("Yahoo v5.x overlay"), _T("ClientIcons_Yahoo"), IDI_CLIENT_YAHOO5, YAHOO_CASE }, + + {"client_QQ_2011", _T("|QQ2011*|TM2011*"), _T("TM/QQ 2011 overlay"), _T("ClientIcons_QQ"), IDI_CLIENT_TM_QQ2011, QQ_CASE }, + {"client_QQ_2010", _T("|QQ2010*|TM2010*"), _T("TM/QQ 2010 overlay"), _T("ClientIcons_QQ"), IDI_CLIENT_TM_QQ2010, QQ_CASE }, + {"client_QQ_2009", _T("|QQ2009*|TM2009*"), _T("TM/QQ 2009 overlay"), _T("ClientIcons_QQ"), IDI_CLIENT_TM_QQ2009, QQ_CASE }, + {"client_QQ_2008", _T("|QQ2008*|TM2008*"), _T("TM/QQ 2008 overlay"), _T("ClientIcons_QQ"), IDI_CLIENT_TM_QQ2008, QQ_CASE }, + {"client_QQ_2007", _T("|QQ2007*|TM2007*"), _T("TM/QQ 2007 overlay"), _T("ClientIcons_QQ"), IDI_CLIENT_TM_QQ2007, QQ_CASE }, + {"client_QQ_2006", _T("|QQ2006*|TM2006*"), _T("TM/QQ 2006 overlay"), _T("ClientIcons_QQ"), IDI_CLIENT_TM_QQ2006, QQ_CASE }, + {"client_QQ_2005", _T("|QQ2005*|TM2005*"), _T("TM/QQ 2005 overlay"), _T("ClientIcons_QQ"), IDI_CLIENT_TM_QQ2005, QQ_CASE }, + {"client_QQ_2004", _T("QQ2004*"), _T("QQ 2004 overlay"), _T("ClientIcons_QQ"), IDI_CLIENT_QQ2004, QQ_CASE }, + {"client_QQ_2003", _T("|QQ2003*|TM 3.*"), _T("TM 3.x / QQ 2003 overlay"), _T("ClientIcons_QQ"), IDI_CLIENT_TM_QQ2003, QQ_CASE }, + {"client_TM_2002", _T("TM 2.*"), _T("TM 2.x overlay"), _T("ClientIcons_QQ"), IDI_CLIENT_TM2, QQ_CASE }, + {"client_TM_2001", _T("TM 1.*"), _T("TM 1.x overlay"), _T("ClientIcons_QQ"), IDI_CLIENT_TM1, QQ_CASE }, + {"client_QQ_2000", _T("QQ2000*"), _T("QQ 2000 overlay"), _T("ClientIcons_QQ"), IDI_CLIENT_QQ2000, QQ_CASE }, + + + {"client_Tlen_7", _T("Tlen Protocol 16"), _T("Tlen 7.x overlay"), _T("ClientIcons_Tlen"), IDI_CLIENT_TLEN7, TLEN_CASE }, + {"client_Tlen_6", _T("Tlen Protocol 10"), _T("Tlen 6.x overlay"), _T("ClientIcons_Tlen"), IDI_CLIENT_TLEN6, TLEN_CASE }, + {"client_Tlen_5", _T("Tlen Protocol 7"), _T("Tlen 5.x overlay"), _T("ClientIcons_Tlen"), IDI_CLIENT_TLEN5, TLEN_CASE }, + + {"client_weather_over", _T("*Weather*"), _T("Weather"), _T("ClientIcons_Weather"), IDI_CLIENT_WEATHER, WEATHER_CASE }, + +//########################################################################################################################################################################################################### +//################################# PLATFORM OVERLAYS ################################################################################################################################################# +//########################################################################################################################################################################################################### + {"client_on_Win32", _T("|*Win32*|*windows*") + _T("|* WM *|wmagent*|*Vista*"), _T("Windows overlay"), _T("ClientIcons_overlays"), IDI_PLATFORM_WIN, OVERLAYS_PLATFORM_CASE }, + {"client_on_iOS", _T("|*ipad*|*iphone*"), _T("iOS overlay (iPhone/iPad)"), _T("ClientIcons_overlays"), IDI_PLATFORM_IOS, OVERLAYS_PLATFORM_CASE }, + {"client_on_Mac", _T("|^*smack*|* Mac *|*mac*"), _T("MacOS overlay"), _T("ClientIcons_overlays"), IDI_PLATFORM_MAC, OVERLAYS_PLATFORM_CASE }, + {"client_on_Linux", _T("*Linux*"), _T("Linux overlay"), _T("ClientIcons_overlays"), IDI_PLATFORM_LINUX, OVERLAYS_PLATFORM_CASE }, + {"client_on_Flash", _T("*Flash*"), _T("Flash overlay"), _T("ClientIcons_overlays"), IDI_PLATFORM_FLASH, OVERLAYS_PLATFORM_CASE }, + {"client_on_Java", _T("|*Java*|jagent*|ICQ2Go!*"), _T("Java overlay"), _T("ClientIcons_overlays"), IDI_PLATFORM_JAVA, OVERLAYS_PLATFORM_CASE }, + {"client_on_Symbian", _T("|*Symbian*|sagent*"), _T("Symbian overlay"), _T("ClientIcons_overlays"), IDI_PLATFORM_SYMBIAN, OVERLAYS_PLATFORM_CASE }, + {"client_on_Android", _T("|*Android*|"), _T("Android overlay"), _T("ClientIcons_overlays"), IDI_PLATFORM_ANDROID, OVERLAYS_PLATFORM_CASE }, + +}; + +int DEFAULT_KN_FP_OVERLAYS_COUNT = SIZEOF(def_kn_fp_overlays_mask); + +//########################################################################################################################################################################################################### +//########################################################################################################################################################################################################### +//################################# OVERLAYS LAYER #2 ############################################################################################################################################# +//########################################################################################################################################################################################################### +//########################################################################################################################################################################################################### + +KN_FP_MASK def_kn_fp_overlays2_mask[] = +{// IconName Mask Icon caption NULL ICON_RESOURCE_ID + {"client_debug_overlay", _T("|*[*debug*]*|*test*|*òåñò*"), _T("debug overlay"), _T("ClientIcons_overlays"), IDI_DEBUG_OVERLAY, OVERLAYS_RESOURCE_CASE }, + {"client_home_overlay", _T("|*[*home*]*|*[*äîì*]*|*[*õîìå*]*"), _T("home overlay"), _T("ClientIcons_overlays"), IDI_HOME_OVERLAY, OVERLAYS_RESOURCE_CASE }, + {"client_work_overlay", _T("|*[*work*]*|*[*ðàáîòà*]*|*wkr*"), _T("[Work]"), _T("ClientIcons_overlays"), IDI_WORK_OVERLAY, OVERLAYS_RESOURCE_CASE }, + {"client_office_overlay", _T("|*[*office*]*|*[*îôèñ*]*"), _T("[Office]"), _T("ClientIcons_overlays"), IDI_OFFICE_OVERLAY, OVERLAYS_RESOURCE_CASE }, + {"client_mobile_overlay", _T("|*[*mobile*]*|*[*pda*]*"), _T("mobile overlay"), _T("ClientIcons_overlays"), IDI_MOBILE_OVERLAY, OVERLAYS_RESOURCE_CASE }, + {"client_note_overlay", _T("|*[*note*]*|*[*laptop*]*|*[*usb*]*") + _T("|*[*êèðïè÷*]*|*[*portable*]*|"), _T("notebook overlay"), _T("ClientIcons_overlays"), IDI_NOTEBOOK_OVERLAY, OVERLAYS_RESOURCE_CASE }, + + {"client_Mir_010_over", _T("*Miranda*0.10.*"), _T("Miranda v0.10 #2 overlay"), _T("ClientIcons_Miranda"), IDI_MIRANDA_10s, MIRANDA_VERSION_CASE }, + {"client_Mir_09_over", _T("*Miranda*0.9.*"), _T("Miranda v0.9 #2 overlay"), _T("ClientIcons_Miranda"), IDI_MIRANDA_9s, MIRANDA_VERSION_CASE }, + {"client_Mir_08_over", _T("*Miranda*0.8.*"), _T("Miranda v0.8 #2 overlay"), _T("ClientIcons_Miranda"), IDI_MIRANDA_8s, MIRANDA_VERSION_CASE }, + {"client_Mir_07_over", _T("*Miranda*0.7.*"), _T("Miranda v0.7 #2 overlay"), _T("ClientIcons_Miranda"), IDI_MIRANDA_7s, MIRANDA_VERSION_CASE }, + {"client_Mir_06_over", _T("*Miranda*0.6.*"), _T("Miranda v0.6 #2 overlay"), _T("ClientIcons_Miranda"), IDI_MIRANDA_6s, MIRANDA_VERSION_CASE }, + {"client_Mir_05_over", _T("*Miranda*0.5.*"), _T("Miranda v0.5 #2 overlay"), _T("ClientIcons_Miranda"), IDI_MIRANDA_5s, MIRANDA_VERSION_CASE }, + {"client_Mir_04_over", _T("*Miranda*0.4.*"), _T("Miranda v0.4 #2 overlay"), _T("ClientIcons_Miranda"), IDI_MIRANDA_4s, MIRANDA_VERSION_CASE }, + +}; + +int DEFAULT_KN_FP_OVERLAYS2_COUNT = SIZEOF(def_kn_fp_overlays2_mask); + +//########################################################################################################################################################################################################### +//########################################################################################################################################################################################################### +//############################## OVERLAYS LAYER #3 ################################################################################################################################################# +//########################################################################################################################################################################################################### +KN_FP_MASK def_kn_fp_overlays3_mask[] = +{// {"Client_IconName", _T("|^*Mask*|*names*"), _T("Icon caption"), _T("iconpack name"), IDI_RESOURCE_ID, CLIENT_CASE, OVERLAY? }, + {"client_SecureIM_over", _T("*Secure*IM*"), _T("SecureIM overlay"), _T("ClientIcons_overlays"), IDI_SECUREIM_OVERLAY, OVERLAYS_SECURITY_CASE }, + {"client_SimpPro_over", _T("*SimpPro*"), _T("SimpPro overlay"), _T("ClientIcons_overlays"), IDI_SIMPPRO_OVERLAY, OVERLAYS_SECURITY_CASE }, + {"client_SimpLite_over", _T("*SimpLite*"), _T("SimpLite overlay"), _T("ClientIcons_overlays"), IDI_SIMPLITE_OVERLAY, OVERLAYS_SECURITY_CASE }, + {"client_IMSecure_over", _T("*IMSecure*"), _T("IMSecure overlay"), _T("ClientIcons_overlays"), IDI_IMSECURE_OVERLAY, OVERLAYS_SECURITY_CASE }, + + {"client_platform_x64", _T("|*x64*|*64*bit*"), _T("x64 overlay"), _T("ClientIcons_overlays"), IDI_PLATFORM_X64, OVERLAYS_PLATFORM_CASE }, + {"client_platform_x32", _T("|*x32*|*32*bit*|*x86*"), _T("x32 overlay"), _T("ClientIcons_overlays"), IDI_PLATFORM_X32, OVERLAYS_PLATFORM_CASE }, + + {"client_Unicode", _T("*unicode*"), _T("Unicode overlay"), _T("ClientIcons_overlays"), IDI_CLIENT_UNICODE, OVERLAYS_RESOURCE_CASE }, +}; + +int DEFAULT_KN_FP_OVERLAYS3_COUNT = SIZEOF(def_kn_fp_overlays3_mask); diff --git a/plugins/FingerprintNG/src/options.cpp b/plugins/FingerprintNG/src/options.cpp new file mode 100644 index 0000000000..76dff9ebea --- /dev/null +++ b/plugins/FingerprintNG/src/options.cpp @@ -0,0 +1,163 @@ +/* +Fingerprint NG (client version) icons module for Miranda NG + +Copyright © 2006-12 ghazan, mataes, HierOS, FYR, Bio, nullbie, faith_healer and all respective contributors. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +//Start of header +#include "global.h" + +struct _settingsInfo +{ + int idCtrl; + LPCSTR szSetName; +} +static settings [] = +{ + {IDC_GROUP_MIRANDA, "GroupMiranda"}, + {IDC_GROUP_MIRANDA_VERSION, "GroupMirandaVersion"}, + {IDC_GROUP_MIRANDA_PACKS, "GroupMirandaPacks"}, + + {IDC_GROUP_MULTI, "GroupMulti"}, + {IDC_GROUP_AIM, "GroupAIM"}, + {IDC_GROUP_GG, "GroupGG"}, + {IDC_GROUP_ICQ, "GroupICQ"}, + {IDC_GROUP_IRC, "GroupIRC"}, + {IDC_GROUP_JABBER, "GroupJabber"}, + {IDC_GROUP_MRA, "GroupMRA"}, + {IDC_GROUP_MSN, "GroupMSN"}, + {IDC_GROUP_QQ, "GroupQQ"}, + {IDC_GROUP_RSS, "GroupRSS"}, + {IDC_GROUP_TLEN, "GroupTlen"}, + {IDC_GROUP_WEATHER, "GroupWeather"}, + {IDC_GROUP_YAHOO, "GroupYahoo"}, + + {IDC_GROUP_OTHER_PROTOS, "GroupOtherProtos"}, + {IDC_GROUP_OTHERS, "GroupOthers"}, + + {IDC_GROUP_OVERLAYS_RESOURCE, "GroupOverlaysResource"}, + {IDC_GROUP_OVERLAYS_PLATFORM, "GroupOverlaysPlatform"}, + {IDC_GROUP_OVERLAYS_PROTO, "GroupOverlaysProtos"}, + {IDC_GROUP_OVERLAYS_SECURITY, "GroupOtherProtos"}, +// {IDC_GROUP_OVERLAYS_RESOURCE_ALT, "GroupOverlays"}, + +}; + +static void OptDlgChanged(HWND hwndDlg, BOOL show) +{ + if (show) + ShowWindow(GetDlgItem(hwndDlg, IDC_OPTCHANGENOTE), SW_SHOW); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); +} + +static void LoadDBCheckState(HWND hwndDlg, int idCtrl, LPCSTR szSetting, BYTE bDef) +{ + CheckDlgButton(hwndDlg, idCtrl, db_get_b(NULL, "Finger", szSetting, bDef)); +} + +static void StoreDBCheckState(HWND hwndDlg, int idCtrl, LPCSTR szSetting) +{ + db_set_b(NULL, "Finger", szSetting, (BYTE)IsDlgButtonChecked(hwndDlg, idCtrl)); +} + +static INT_PTR CALLBACK DlgProcOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) { + case WM_INITDIALOG: + { + TranslateDialogDefault(hwndDlg); + for (int i = 0; i < SIZEOF(settings); i++) { + if (lstrcmpA(settings[i].szSetName, "ShowVersion") == 0) + LoadDBCheckState(hwndDlg, settings[i].idCtrl, settings[i].szSetName, 0); + else + LoadDBCheckState(hwndDlg, settings[i].idCtrl, settings[i].szSetName, 1); + } + + ShowWindow(GetDlgItem(hwndDlg, IDC_OPTCHANGENOTE), SW_HIDE); + } + break; + + case WM_COMMAND: + switch(LOWORD(wParam)) { + + case IDC_GROUP_MIRANDA: + case IDC_GROUP_MIRANDA_VERSION: + case IDC_GROUP_MIRANDA_PACKS: +// case IDC_GROUP_OVERLAYS_RESOURCE_ALT: + + OptDlgChanged(hwndDlg, true); + break; + + case IDC_GROUP_MULTI: + case IDC_GROUP_AIM: + case IDC_GROUP_GG: + case IDC_GROUP_ICQ: + case IDC_GROUP_IRC: + case IDC_GROUP_JABBER: + case IDC_GROUP_MRA: + case IDC_GROUP_MSN: + case IDC_GROUP_QQ: + case IDC_GROUP_RSS: + case IDC_GROUP_TLEN: + case IDC_GROUP_WEATHER: + case IDC_GROUP_YAHOO: + + case IDC_GROUP_OTHER_PROTOS: + case IDC_GROUP_OTHERS: + + case IDC_GROUP_OVERLAYS_RESOURCE: + case IDC_GROUP_OVERLAYS_PLATFORM: + case IDC_GROUP_OVERLAYS_PROTO: + case IDC_GROUP_OVERLAYS_SECURITY: + + OptDlgChanged(hwndDlg, false); + break; + + default: + return 0; + } + break; + + case WM_NOTIFY: + { + NMHDR *hdr = (NMHDR *)lParam; + if (hdr && hdr->code == PSN_APPLY) { + for (int i = 0; i < SIZEOF(settings); i++) + StoreDBCheckState(hwndDlg, settings[i].idCtrl, settings[i].szSetName); + + ClearFI(); + RegisterIcons(); + } + } + break; + } + return FALSE; +} + +int OnOptInitialise(WPARAM wParam, LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp = { 0 }; + odp.cbSize = sizeof(odp); + odp.hInstance = g_hInst; + odp.ptszGroup = LPGENT("Customize"); + odp.pszTemplate = MAKEINTRESOURCEA(IDD_DIALOG); + odp.ptszTitle = LPGENT("Fingerprint"); + odp.pfnDlgProc = DlgProcOptions; + odp.flags = ODPF_BOLDGROUPS|ODPF_TCHAR;; + Options_AddPage(wParam, &odp); + return 0; +} diff --git a/plugins/FingerprintNG/src/resource.h b/plugins/FingerprintNG/src/resource.h new file mode 100644 index 0000000000..364f3dbcf6 --- /dev/null +++ b/plugins/FingerprintNG/src/resource.h @@ -0,0 +1,727 @@ +#include "version.h" + +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by resource.rc +//############################################################################################################## +//Other +#define IDI_BLANK 1 +#define IDI_NOTFOUND 2 +#define IDI_UNDETECTED 3 +#define IDI_UNKNOWN 4 + +//############################################################################################################## +//Skype clients +#define IDI_SKYPE 9 + +//############################################################################################################## +//MirandaIM clients +#define IDI_MIRANDA_NG 11 +#define IDI_MIRANDA_OLD 12 +#define IDI_MIRANDA_UNKNOWN 13 + +#define IDI_MIRANDA_04XX 21 +#define IDI_MIRANDA_05XX 22 +#define IDI_MIRANDA_06XX 23 +#define IDI_MIRANDA_07XX 24 +#define IDI_MIRANDA_08XX 25 +#define IDI_MIRANDA_09XX 26 +#define IDI_MIRANDA_010X 27 + +#define IDI_MIRANDA_4 31 +#define IDI_MIRANDA_5 32 +#define IDI_MIRANDA_6 33 +#define IDI_MIRANDA_7 34 +#define IDI_MIRANDA_8 35 +#define IDI_MIRANDA_9 36 +#define IDI_MIRANDA_10 37 + +#define IDI_MIRANDA_4s 41 +#define IDI_MIRANDA_5s 42 +#define IDI_MIRANDA_6s 43 +#define IDI_MIRANDA_7s 44 +#define IDI_MIRANDA_8s 45 +#define IDI_MIRANDA_9s 46 +#define IDI_MIRANDA_10s 47 + +//############################################################################################################## +//Jabber resource overlays +#define IDI_DEBUG_OVERLAY 51 +#define IDI_HOME_OVERLAY 52 +#define IDI_MOBILE_OVERLAY 53 +#define IDI_NOTEBOOK_OVERLAY 54 +#define IDI_OFFICE_OVERLAY 55 +#define IDI_WORK_OVERLAY 56 + +//############################################################################################################## +//Platform +#define IDI_PLATFORM_ANDROID 61 +#define IDI_PLATFORM_FLASH 62 +#define IDI_PLATFORM_IOS 63 +#define IDI_PLATFORM_JAVA 64 +#define IDI_PLATFORM_LINUX 65 +#define IDI_PLATFORM_MAC 66 +#define IDI_PLATFORM_SYMBIAN 67 +#define IDI_PLATFORM_WIN 68 + +#define IDI_CLIENT_UNICODE 71 +#define IDI_PLATFORM_X32 72 +#define IDI_PLATFORM_X64 73 + +//############################################################################################################## +//Clients overlays +#define IDI_AIMOSCAR_OVERLAY 75 +#define IDI_GMAIL_OVERLAY 76 +#define IDI_ICQJ_OVERLAY 77 +#define IDI_ICQJ_PLUS_OVERLAY 78 +#define IDI_IRC_OVERLAY 79 +#define IDI_JABBER_OVERLAY 80 +#define IDI_JGTALK_OVERLAY 81 +#define IDI_MAILRU_OVERLAY 82 +#define IDI_MSN_OVERLAY 83 +#define IDI_QQ_OVERLAY 84 +#define IDI_TLEN_OVERLAY 85 +#define IDI_YAHOO_OVERLAY 86 + +//############################################################################################################## +//Secure overlays +#define IDI_IMSECURE_OVERLAY 91 +#define IDI_SECUREIM_OVERLAY 92 +#define IDI_SIMPLITE_OVERLAY 93 +#define IDI_SIMPPRO_OVERLAY 94 + +//############################################################################################################## +//MirandaIM Packs +#define IDI_MIRANDA_A0X 101 +#define IDI_MIRANDA_AF 102 +#define IDI_MIRANDA_ALFAMAR 103 +#define IDI_MIRANDA_AMATORY 104 +#define IDI_MIRANDA_BRI 105 +#define IDI_MIRANDA_CAPPUCCINO 106 +#define IDI_MIRANDA_DAR 107 +#define IDI_MIRANDA_DEVIL 108 +#define IDI_MIRANDA_DMIKOS 109 +#define IDI_MIRANDA_E33 110 +#define IDI_MIRANDA_FAITH 111 +#define IDI_MIRANDA_FINAL 112 +#define IDI_MIRANDA_FR 113 +#define IDI_MIRANDA_FREIZE 114 +#define IDI_MIRANDA_GHOST 115 +#define IDI_MIRANDA_HIEROS 116 +#define IDI_MIRANDA_INDUCTION 117 +#define IDI_MIRANDA_KDL 118 +#define IDI_MIRANDA_KOLICH 119 +#define IDI_MIRANDA_KUZZMAN 120 +#define IDI_MIRANDA_LENINPACK 121 +#define IDI_MIRANDA_LESTAT 122 +#define IDI_MIRANDA_LEXSYS 123 +#define IDI_MIRANDA_MATAES 124 +#define IDI_MIRANDA_MD 125 +#define IDI_MIRANDA_ME 126 +#define IDI_MIRANDA_NATIVE 127 +#define IDI_MIRANDA_NEW_STYLE 128 +#define IDI_MIRANDA_PILOT 129 +#define IDI_MIRANDA_RAZUNTER 130 +#define IDI_MIRANDA_ROBYER 131 +#define IDI_MIRANDA_SE7VEN 132 +#define IDI_MIRANDA_SPELLHOWLER 133 +#define IDI_MIRANDA_SSS_MOD 134 +#define IDI_MIRANDA_STALKER 135 +#define IDI_MIRANDA_TWEETY 136 +#define IDI_MIRANDA_UMEDON 137 +#define IDI_MIRANDA_VALERAVI 138 +#define IDI_MIRANDA_WATCHER 139 +#define IDI_MIRANDA_YAOL 140 +#define IDI_MIRANDA_ZELEBOBA 141 + +//############################################################################################################## +//Official ICQ clients +#define IDI_ICQ 190 + +//############################################################################################################## +//Official ICQ overlays +#define IDI_ICQ6_OVERLAY 196 +#define IDI_ICQ7_OVERLAY 197 +#define IDI_ICQ8_OVERLAY 198 + +//############################################################################################################## +//Unofficial ICQ clients +#define IDI_1UND1 201 +#define IDI_ALICQ 202 +#define IDI_ANASTASIA 203 +#define IDI_ANDRQ 204 +#define IDI_ASIA 205 +#define IDI_COREPAGER 206 +#define IDI_DELPHI 207 +#define IDI_DICHAT 208 +#define IDI_GLICQ 209 +#define IDI_GNOMEICU 210 +#define IDI_ICAT 211 +#define IDI_ICQ2X 212 +#define IDI_ICY_JUICE 213 +#define IDI_JICQ 214 +#define IDI_KXICQ 215 +#define IDI_LIBICQ2000 216 +#define IDI_LICQ 217 +#define IDI_LOCID 218 +#define IDI_MICQ 219 +#define IDI_MIP 220 +#define IDI_NANOICQ 221 +#define IDI_NICQ 222 +#define IDI_QIP 223 +#define IDI_RANDQ_NEW 224 +#define IDI_SMAPER 225 +#define IDI_SMARTICQ 226 +#define IDI_SPAMBOT 227 +#define IDI_STICQ 228 +#define IDI_STRICQ 229 +#define IDI_TICQ 230 +#define IDI_VICQ 231 +#define IDI_VIRUS 232 +#define IDI_VMICQ 233 +#define IDI_WEBICQ 234 +#define IDI_YEEMP 235 +#define IDI_YSM 236 + +//############################################################################################################## +//IRC +#define IDI_AMIRC 301 +#define IDI_AMULE 302 +#define IDI_BABBEL 303 +#define IDI_BERSIRC 304 +#define IDI_CBIRC 305 +#define IDI_CHATZILLA 306 +#define IDI_CONVERSATION 307 +#define IDI_DIRC 308 +#define IDI_EGGDROP 309 +#define IDI_EGGDROP_RACBOT 310 +#define IDI_EMULE 311 +#define IDI_EMULE_MORPHXT 312 +#define IDI_EMULE_NEO 313 +#define IDI_EMULE_PLUS 314 +#define IDI_EMULE_XTREME 315 +#define IDI_FCHAT 316 +#define IDI_GDPCHAT 317 +#define IDI_GOPOWERTOOLS 318 +#define IDI_HYDRA_IRC 319 +#define IDI_ICECHAT 320 +#define IDI_IRC_UNKNOWN 321 +#define IDI_IRCLE 322 +#define IDI_IRCXPRO 323 +#define IDI_JIRCII 324 +#define IDI_JMIRC 325 +#define IDI_KLIENT 326 +#define IDI_KONVERSATION 327 +#define IDI_KSIRC 328 +#define IDI_KVIRC 329 +#define IDI_MIRC 330 +#define IDI_MP3_SCRIPT 331 +#define IDI_NEORATRION 332 +#define IDI_NETTALK 333 +#define IDI_NONAME_SCRIPT 334 +#define IDI_OPERA 335 +#define IDI_PIORUN 336 +#define IDI_PIRC 337 +#define IDI_PIRCH 338 +#define IDI_PJIRC 339 +#define IDI_PROCHAT 340 +#define IDI_PSYBNC 341 +#define IDI_SAVIRC 342 +#define IDI_SMART_IRC 343 +#define IDI_SNAK 344 +#define IDI_SYSRESET 345 +#define IDI_VIRCAIRC 346 +#define IDI_VISIONIRC 347 +#define IDI_VISUALIRC 348 +#define IDI_VORTECIRC 349 +#define IDI_WEECHAT 350 +#define IDI_WLIRC 351 +#define IDI_WMIRC 352 +#define IDI_XCHATAQUA 353 +#define IDI_XBITCH 354 +#define IDI_XCHAT 355 +#define IDI_XIRC 356 +#define IDI_XIRCON 357 +#define IDI_ZIPTORRENT 358 +#define IDI_ZSIRC 359 +#define IDI_POCKET_IRC 360 + +//############################################################################################################## +//Jabber clients +#define IDI_AKENI 400 +#define IDI_AMBROSIA 401 +#define IDI_ANDROID 402 +#define IDI_ANOTHRSSBOT 403 +#define IDI_AQQ 404 +#define IDI_BARNOWL 405 +#define IDI_BEEJIVE 406 +#define IDI_BEEM 407 +#define IDI_BELLSOUTH 408 +#define IDI_BITWISE 409 +#define IDI_BOMBUS 410 +#define IDI_BOMBUS_MOD 411 +#define IDI_BOMBUS_NG 412 +#define IDI_BOMBUS_QD 413 +#define IDI_BOWLINE 414 +#define IDI_BUDDYSPACE 415 +#define IDI_CANDY 416 +#define IDI_CARRIER 417 +#define IDI_CHATOPUS 418 +#define IDI_CHAT_BOT 419 +#define IDI_CHIKKA 420 +#define IDI_CHITCHAT 421 +#define IDI_CJC 422 +#define IDI_CLAROS_CHAT 423 +#define IDI_COCCINELLA 424 +#define IDI_COLIBRY 425 +#define IDI_COLLOQUY 426 +#define IDI_COMMUNIGATE 427 +#define IDI_CONFERENCE 428 +#define IDI_CROOM 429 +#define IDI_CROSSTALK 430 +#define IDI_CUDUMAR 431 +#define IDI_CYCLOPS_CHAT 432 +#define IDI_DESYR 433 +#define IDI_DZIOBBER 434 +#define IDI_EJABBERD 435 +#define IDI_ELMER 436 +#define IDI_EMACS 437 +#define IDI_EMESS 438 +#define IDI_EMITE 439 +#define IDI_EMPATHY 440 +#define IDI_EXODUS 441 +#define IDI_FACEBOOK 442 +#define IDI_FIRE 443 +#define IDI_GABBER 444 +#define IDI_GAJIM 445 +#define IDI_GCN 446 +#define IDI_GIBBERBOT 447 +#define IDI_GLU 448 +#define IDI_GMAIL 449 +#define IDI_GNOME 450 +#define IDI_GNUGADU 451 +#define IDI_GOIM 452 +#define IDI_GOSSIP 453 +#define IDI_GOTALKMOBILE 454 +#define IDI_GREENTHUMB 455 +#define IDI_GTALK 456 +#define IDI_GTALK_GADGET 457 +#define IDI_GUSH 458 +#define IDI_GYABER 459 +#define IDI_IGOOGLE 460 +#define IDI_IJAB 461 +#define IDI_IMCOM 462 +#define IDI_IMEEM 463 +#define IDI_IMIFIED 464 +#define IDI_IMOV 465 +#define IDI_IMPORTAL 466 +#define IDI_IM_FRIENDLY 467 +#define IDI_INSTANT 468 +#define IDI_INTERACTION 469 +#define IDI_IRUKA 470 +#define IDI_J2J_TRANSPORT 471 +#define IDI_JABBA 472 +#define IDI_JABBER 473 +#define IDI_JABBER_DISK 474 +#define IDI_JABBERFOX 475 +#define IDI_JABBERNAUT 476 +#define IDI_JABBERWOCKY 477 +#define IDI_JABBERZILLA 478 +#define IDI_JABBER_APPLET 479 +#define IDI_JABBER_BEOS 480 +#define IDI_JABBER_MESSENGER 481 +#define IDI_JABBER_NET 482 +#define IDI_JABBIM 483 +#define IDI_JABBROID 484 +#define IDI_JABIRU 485 +#define IDI_JAJC 486 +#define IDI_JAMM 487 +#define IDI_JAPPIX 488 +#define IDI_JCLAIM 489 +#define IDI_JETI 490 +#define IDI_JITSI 491 +#define IDI_JMC 492 +#define IDI_JOOST 493 +#define IDI_JRUDEVELS 494 +#define IDI_JTALK 495 +#define IDI_JUICK 496 +#define IDI_JWCHAT 497 +#define IDI_JWGC 499 +#define IDI_KADU 500 +#define IDI_KF 501 +#define IDI_KONNEKT 502 +#define IDI_LAFFER 503 +#define IDI_LAMPIRO 504 +#define IDI_LAMP_IM 505 +#define IDI_LANDELL 506 +#define IDI_LEAF 507 +#define IDI_LINQ 508 +#define IDI_LLUNA 509 +#define IDI_M8JABBER 510 +#define IDI_MANGO 511 +#define IDI_MCABBER 512 +#define IDI_MEINVZ 513 +#define IDI_MERCURY_MESSENGER 514 +#define IDI_MGTALK 515 +#define IDI_MJABBER 516 +#define IDI_MOBBER 517 +#define IDI_MOJAB 518 +#define IDI_MOZILLACHAT 519 +#define IDI_MUCKL 520 +#define IDI_MYJABBER 521 +#define IDI_NEOS 522 +#define IDI_NITRO 523 +#define IDI_NOSTROMO 524 +#define IDI_OCTROTALK 525 +#define IDI_OM 526 +#define IDI_ONETEAM 527 +#define IDI_ORKUT 528 +#define IDI_PALTALK 529 +#define IDI_PANDION 530 +#define IDI_PAPLA 531 +#define IDI_PJC 532 +#define IDI_POEZIO 533 +#define IDI_PROSODY 534 +#define IDI_PSI 535 +#define IDI_PSIPLUS 536 +#define IDI_PSTO 537 +#define IDI_PSYC 538 +#define IDI_PYAIMT 539 +#define IDI_PYGEON 540 +#define IDI_PYICQT 541 +#define IDI_PYIRCT 542 +#define IDI_PYMRAT 543 +#define IDI_PYMSNT 544 +#define IDI_PYYAHOOT 545 +#define IDI_QTJIM 546 +#define IDI_QUTECOM 547 +#define IDI_RENREN 548 +#define IDI_SAJE 549 +#define IDI_SAMEPLACE 550 +#define IDI_SAPO 551 +#define IDI_SBOT 552 +#define IDI_SCHULERVZ 553 +#define IDI_SIEJC 554 +#define IDI_SIP_COMM 555 +#define IDI_SKYMESSAGER 556 +#define IDI_SLICK 557 +#define IDI_SMACK 558 +#define IDI_SMTP_TRANSPORT 559 +#define IDI_SOAPBOX 560 +#define IDI_SPARK 561 +#define IDI_SPEAKALL 562 +#define IDI_SPEEQE 563 +#define IDI_SPIK 564 +#define IDI_STUDIVZ 565 +#define IDI_SWIFT 566 +#define IDI_SWORIM 567 +#define IDI_SYNAPSE 568 +#define IDI_TALKDROID 569 +#define IDI_TALKONAUT 570 +#define IDI_TAPIOCA 571 +#define IDI_TEABOT 572 +#define IDI_TELEPATHY 573 +#define IDI_THEBEE 574 +#define IDI_THUNDERBIRD 575 +#define IDI_TIGASE 576 +#define IDI_TIPICIM 577 +#define IDI_TKABBER 578 +#define IDI_TKCHAT 579 +#define IDI_TRANSACTIM 580 +#define IDI_TRANSLATE 581 +#define IDI_TRIPLE_SOFTWARE 582 +#define IDI_TWITTER 583 +//#define IDI_UJABBER 584 +#define IDI_VACUUM 585 +#define IDI_VANDV 586 +#define IDI_VAYUSPHERE 587 +#define IDI_VBUZZER 588 +#define IDI_VIRTUS 589 +#define IDI_VK 590 +#define IDI_VYSPER 591 +#define IDI_WANNACHAT 592 +#define IDI_WEBEX 593 +#define IDI_WHISPERIM 594 +#define IDI_WHOISBOT 595 +#define IDI_WIJA 596 +#define IDI_WILDFIRE 597 +#define IDI_WINJAB 598 +#define IDI_WTW 599 +#define IDI_XABBER 601 +#define IDI_GABBLE 602 +#define IDI_XEUS 603 +#define IDI_XEUS2 604 +#define IDI_XIFFIAN 605 +#define IDI_XMPP 606 +#define IDI_YAMBI 607 +#define IDI_YAONLINE 608 +#define IDI_YAXIM 609 + +//############################################################################################################## +//Mail.Ru Agent clients +#define IDI_MAIL_RU_MOBILE 701 +#define IDI_MAIL_RU_OFFICIAL 702 +#define IDI_MAIL_RU_UNKNOWN 703 +#define IDI_MAIL_RU_WEBAGENT 704 + +//############################################################################################################## +//AIM +#define IDI_AIM 711 +#define IDI_AIM_4 712 +#define IDI_AIM_5 713 +#define IDI_AIM_6 714 +#define IDI_AIM_7 715 +#define IDI_AIM_MAC 716 +#define IDI_AIM_MOBILE 717 +#define IDI_AIM_TRITON 718 +#define IDI_MINIAIM 719 +#define IDI_NAIM 720 +#define IDI_TERRAIM 721 + +//############################################################################################################## +//Gadu-Gadu clients +#define IDI_GADU_GADU_6 731 +#define IDI_GADU_GADU_7 732 + +//############################################################################################################## +//Tlen clients +#define IDI_TLEN 734 + +//############################################################################################################## +//Tlen clients overlays +#define IDI_CLIENT_TLEN5 735 +#define IDI_CLIENT_TLEN6 736 +#define IDI_CLIENT_TLEN7 737 + +//############################################################################################################## +//MSN +#define IDI_AMSN 741 +#define IDI_MSN_MAC 742 +#define IDI_MSN_45 743 +#define IDI_MSN_6 744 +#define IDI_MSN_7 745 +#define IDI_MSN_8 746 +#define IDI_MSN 747 +#define IDI_WEBMESSENGER 748 +#define IDI_WLM_9 749 +#define IDI_WLM_10 750 + +//############################################################################################################## +//RSS +#define IDI_ATOM1 761 +#define IDI_ATOM3 762 +#define IDI_RSS09 763 +#define IDI_RSS1 764 +#define IDI_RSS2 765 + +//############################################################################################################## +//QQ clients +#define IDI_MOBILEQQ 771 +#define IDI_QQ 772 +#define IDI_QQCONCEPT 773 +#define IDI_QQCRM 774 +#define IDI_QQINT 775 +#define IDI_QQSILVER 776 +#define IDI_TM 777 +#define IDI_TM2008 778 +#define IDI_WEBQQ 779 +#define IDI_YAMQQ 780 + +//############################################################################################################## +//QQ clients overlays +#define IDI_CLIENT_QQ2000 781 +#define IDI_CLIENT_QQ2004 782 +#define IDI_CLIENT_TM1 783 +#define IDI_CLIENT_TM2 784 +#define IDI_CLIENT_TM_QQ2003 785 +#define IDI_CLIENT_TM_QQ2005 786 +#define IDI_CLIENT_TM_QQ2006 787 +#define IDI_CLIENT_TM_QQ2007 788 +#define IDI_CLIENT_TM_QQ2008 789 +#define IDI_CLIENT_TM_QQ2009 790 +#define IDI_CLIENT_TM_QQ2010 791 +#define IDI_CLIENT_TM_QQ2011 792 + +//############################################################################################################## +//Weather clients +#define IDI_ACCU 801 +#define IDI_GISMETEO 802 +#define IDI_INTELLI 803 +#define IDI_REALMETEO 804 +#define IDI_WETTER 805 +#define IDI_UNDERGROUND 806 +#define IDI_WEATHER 807 +#define IDI_WEATHER_CN 808 +#define IDI_WEATHERXML 809 +#define IDI_METEOGID 810 +#define IDI_YWEATHER 811 +#define IDI_METEONOVOSTI 812 +#define IDI_NOAA 813 + +//############################################################################################################## +//Weather overlay +#define IDI_CLIENT_WEATHER 817 + +//############################################################################################################## +//Yahoo +#define IDI_LIBYAHOO2 821 +#define IDI_PINGBOX 822 +#define IDI_YAHOO 823 +#define IDI_YAHOO5 824 +#define IDI_YAHOO6 825 +#define IDI_YAHOO7 826 +#define IDI_YAHOO8 827 +#define IDI_YAHOO10 828 +#define IDI_YAHOO_GO_MOBILE 829 + +//############################################################################################################## +//Yahoo overlays +#define IDI_CLIENT_YAHOO5 831 +#define IDI_CLIENT_YAHOO6 832 +#define IDI_CLIENT_YAHOO7 833 +#define IDI_CLIENT_YAHOO8 834 +#define IDI_CLIENT_YAHOO9 835 +#define IDI_CLIENT_YAHOO10 836 + +//############################################################################################################## +//Multi-protocols clients +#define IDI_ADIUM 1000 +#define IDI_AGILE 1001 +#define IDI_APPOLO 1002 +#define IDI_AYTTM 1003 +#define IDI_BAYANICQ 1004 +#define IDI_BIMOID 1005 +#define IDI_BITLBEE 1006 +#define IDI_BLACKBERRY 1007 +#define IDI_BUDDYCLOUD 1008 +#define IDI_CAUSERIE 1009 +#define IDI_CENTERICQ 1010 +#define IDI_CENTERIM 1011 +#define IDI_CHATSECURE 1012 +#define IDI_CITRON 1013 +#define IDI_CLIMM 1014 +#define IDI_DIGSBY 1015 +#define IDI_EASYMESSAGE 1016 +#define IDI_EBUDDY 1017 +#define IDI_EKG2 1018 +#define IDI_EMESENE 1019 +#define IDI_EM_CLIENT 1020 +#define IDI_EQO 1021 +#define IDI_EYEBALL_CHAT 1022 +#define IDI_FAMAIM 1023 +#define IDI_FRING 1024 +#define IDI_GAIM 1025 +#define IDI_GALAXIUM 1026 +#define IDI_GMX 1027 +#define IDI_ICALL 1028 +#define IDI_ICHAT 1029 +#define IDI_IM2 1030 +#define IDI_IMADERING 1031 +#define IDI_IMOIM 1032 +#define IDI_IMPLUS 1033 +#define IDI_IMVU 1034 +#define IDI_INLUX 1035 +#define IDI_INSTANTBIRD 1036 +#define IDI_IRSSI 1037 +#define IDI_JABBEAR 1038 +#define IDI_JABBIN 1039 +#define IDI_JASMINEIM 1040 +#define IDI_JBOTHER 1041 +#define IDI_JBUDDY 1042 +#define IDI_JIMM 1043 +#define IDI_JIMMY 1044 +#define IDI_JIMM_ASPRO 1045 +#define IDI_KMESS 1046 +#define IDI_KOOLIM 1047 +#define IDI_KOPETE 1048 +#define IDI_LEECHCRAFT 1049 +#define IDI_MCHAT 1050 +#define IDI_MDC 1051 +#define IDI_MEEBO 1052 +#define IDI_MEETRO 1053 +#define IDI_MONAL 1054 +#define IDI_NIMBUZZ 1055 +#define IDI_PALRINGO 1056 +#define IDI_PIDGIN 1057 +#define IDI_PIGEON 1058 +#define IDI_PLAYXPERT 1059 +#define IDI_PRELUDE 1060 +#define IDI_PROTEUS 1061 +#define IDI_PYTHON 1062 +#define IDI_QIP_2010 1063 +#define IDI_QIP_2012 1064 +#define IDI_QIP_ANDROID 1065 +#define IDI_QIP_INFIUM 1066 +#define IDI_QIP_JAVA 1067 +#define IDI_QIP_PDA 1068 +#define IDI_QIP_SYMBIAN 1069 +#define IDI_QIP_IOS 1070 +#define IDI_QNEXT 1071 +#define IDI_QUTIM 1072 +#define IDI_MQUTIM 1073 +#define IDI_SALUT_A_TOI 1074 +#define IDI_SHAIM 1075 +#define IDI_SIM 1076 +#define IDI_SIM_OLD 1077 +#define IDI_SREVIM 1078 +#define IDI_TRILLIAN 1079 +#define IDI_TRILLIAN_ANDROID 1080 +#define IDI_TRILLIAN_ASTRA 1081 +#define IDI_TRILLIAN_PRO 1082 +#define IDI_TUUKLE_CHAT 1083 +#define IDI_UIM 1084 +#define IDI_UTALK 1085 +#define IDI_WIPPIEN 1086 +#define IDI_YAMIGO 1087 +#define IDI_YEIGO 1088 +#define IDI_YOONO 1089 + +//############################################################################################################## +//resources +#define IDD_DIALOG 10000 + +#define IDC_GROUP_MIRANDA 10025 +#define IDC_GROUP_MIRANDA_VERSION 10026 +#define IDC_GROUP_MIRANDA_PACKS 10027 + +#define IDC_GROUP_MULTI 10028 +#define IDC_GROUP_AIM 10029 +#define IDC_GROUP_GG 10030 +#define IDC_GROUP_ICQ 10032 +#define IDC_GROUP_IRC 10033 +#define IDC_GROUP_JABBER 10034 +#define IDC_GROUP_MSN 10035 +#define IDC_GROUP_MRA 10036 +#define IDC_GROUP_QQ 10037 +#define IDC_GROUP_RSS 10038 +#define IDC_GROUP_TLEN 10039 +#define IDC_GROUP_WEATHER 10040 +#define IDC_GROUP_YAHOO 10041 + +#define IDC_GROUP_OTHER_PROTOS 10042 +#define IDC_GROUP_OTHERS 10043 + +#define IDC_GROUP_OVERLAYS_RESOURCE 10044 +#define IDC_GROUP_OVERLAYS_PLATFORM 10045 +#define IDC_GROUP_OVERLAYS_PROTO 10046 +#define IDC_GROUP_OVERLAYS_SECURITY 10047 + +/* +#define IDC_GROUP_OVERLAYS_RESOURCE_ALT 10048 +*/ + +#define IDS_IDENTIFY 11001 +#define IDC_OPTCHANGENOTE 11002 + +//############################################################################################################## + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 2000 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 7001 +#define _APS_NEXT_SYMED_VALUE 7000 +#endif +#endif diff --git a/plugins/FingerprintNG/src/utilities.cpp b/plugins/FingerprintNG/src/utilities.cpp new file mode 100644 index 0000000000..4b904c1b4d --- /dev/null +++ b/plugins/FingerprintNG/src/utilities.cpp @@ -0,0 +1,320 @@ +/* +Fingerprint NG (client version) icons module for Miranda NG +Copyright © 2006-12 ghazan, mataes, HierOS, FYR, Bio, nullbie, faith_healer and all respective contributors. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +//Start of header +#include "global.h" + +LPWSTR make_unicode_string(LPCSTR utf8); +LPWSTR make_unicode_string_static(LPCSTR utf8, LPWSTR unicode, size_t unicode_len); +LPSTR make_utf8_string(LPCWSTR unicode); +LPSTR make_utf8_string_static(LPCWSTR unicode, LPSTR utf8, size_t utf_size); + +LPVOID __fastcall SAFE_MALLOC(size_t size) +{ + LPVOID p = NULL; + + if (size) + { + p = malloc(size); + + if (p) + ZeroMemory(p, size); + } + return p; +} + +size_t __fastcall strlennull(LPCSTR string) +{ + if (string) + return strlen(string); + + return 0; +} + +int null_snprintf(LPSTR buffer, size_t count, LPCSTR fmt, ...) +{ + va_list va; + int len; + + ZeroMemory(buffer, count); + va_start(va, fmt); + len = _vsnprintf(buffer, count-1, fmt, va); + va_end(va); + return len; +} + +LPSTR __fastcall TranslateUtfStatic(LPCSTR src, LPSTR buf, size_t bufsize) +{ // this takes UTF-8 strings only!!! + if (strlennull(src)) + { // we can use unicode translate (0.5+) + LPWSTR usrc = make_unicode_string(src); + + make_utf8_string_static(TranslateW(usrc), buf, bufsize); + + SAFE_FREE(usrc); + } + else + buf[0] = '\0'; + + return buf; +} + +//unsigned char *make_utf8_string_static(LPCWSTR unicode, unsigned char *utf8, size_t utf_size) +LPSTR make_utf8_string_static(LPCWSTR unicode, LPSTR utf8, size_t utf_size) +{ + size_t index = 0; + size_t out_index = 0; + WORD c; + + c = (WORD)unicode[index++]; + while(c) + { + if (c < 0x080) + { + if (out_index + 1 >= utf_size) break; + utf8[out_index++] = (CHAR)c; + } + else if (c < 0x800) + { + if (out_index + 2 >= utf_size) break; + utf8[out_index++] = 0xc0 | (c >> 6); + utf8[out_index++] = 0x80 | (c & 0x3f); + } + else + { + if (out_index + 3 >= utf_size) break; + utf8[out_index++] = 0xe0 | (c >> 12); + utf8[out_index++] = 0x80 | ((c >> 6) & 0x3f); + utf8[out_index++] = 0x80 | (c & 0x3f); + } + c = (WORD)unicode[index++]; + } + utf8[out_index] = 0x00; + + return utf8; +} + +LPSTR make_utf8_string(LPCWSTR unicode) +{ + size_t size = 0; + size_t index = 0; + LPSTR out; + WORD c; + + if (!unicode) return NULL; + + /* first calculate the size of the target string */ + c = (WORD)unicode[index++]; + while(c) + { + if (c < 0x0080) + size++; + else if (c < 0x0800) + size += 2; + else + size += 3; + c = (WORD)unicode[index++]; + } + + //out = (unsigned char*)SAFE_MALLOC(size + 1); + out = (LPSTR)SAFE_MALLOC(size + 1); + if (out == NULL) + return NULL; + else + return make_utf8_string_static(unicode, out, size + 1); +} + +LPWSTR make_unicode_string_static(LPCSTR utf8, LPWSTR unicode, size_t unicode_len) +{ + size_t index = 0; + size_t out_index = 0; + BYTE c; + + c = (BYTE)utf8[index++]; + while(c) + { + if (out_index + 1 >= unicode_len) break; + if ((c & 0x80) == 0) + { + unicode[out_index++] = c; + } + else if ((c & 0xe0) == 0xe0) + { + unicode[out_index] = (c & 0x1F) << 12; + c = (BYTE)utf8[index++]; + unicode[out_index] |= (c & 0x3F) << 6; + c = (BYTE)utf8[index++]; + unicode[out_index++] |= (c & 0x3F); + } + else + { + unicode[out_index] = (c & 0x3F) << 6; + c = (BYTE)utf8[index++]; + unicode[out_index++] |= (c & 0x3F); + } + c = (BYTE)utf8[index++]; + } + unicode[out_index] = 0; + + return unicode; +} + +LPWSTR make_unicode_string(LPCSTR utf8) +{ + size_t size = 0, index = 0; + LPWSTR out; + BYTE c; + + if (!utf8) return NULL; + + /* first calculate the size of the target string */ + c = (BYTE)utf8[index++]; + while(c) + { + if ((c & 0x80) == 0) + { + index += 0; + } + else if ((c & 0xe0) == 0xe0) + { + index += 2; + } + else + { + index++; + } + size++; + c = (BYTE)utf8[index++]; + } + + out = (LPWSTR)SAFE_MALLOC((size + 1) * sizeof(WCHAR)); + if (out == NULL) + return NULL; + else + return make_unicode_string_static(utf8, out, size + 1); +} + +int UTF8_IsValid(LPCSTR pszInput) +{ + int nb, i; + LPCSTR c = pszInput; + + if (!pszInput) return 0; + + for(c = pszInput; *c; c += (nb + 1)) + { + if (!(*c & 0x80)) nb = 0; + else if ((*c & 0xc0) == 0x80) return 0; + else if ((*c & 0xe0) == 0xc0) nb = 1; + else if ((*c & 0xf0) == 0xe0) nb = 2; + else if ((*c & 0xf8) == 0xf0) nb = 3; + else if ((*c & 0xfc) == 0xf8) nb = 4; + else if ((*c & 0xfe) == 0xfc) nb = 5; + + for(i = 1; i <= nb; i++) // we this forward, do not cross end of string + if ((*(c + i) & 0xc0) != 0x80) + return 0; + } + + return 1; +} + +static BOOL bHasCP_UTF8 = FALSE; +int utf8_decode_static(LPCSTR from, LPSTR to, int to_size) +{ + int nResult = 0; + // Validate the string + if (!UTF8_IsValid(from)) + return 0; + + // Use the native conversion routines when available + if (bHasCP_UTF8) + { + LPWSTR wszTemp = NULL; + size_t inlen = strlennull(from); + + wszTemp = (LPWSTR)_alloca((inlen + 1) * sizeof(WCHAR)); + + // Convert the UTF-8 string to UCS + if (MultiByteToWideChar(CP_UTF8, 0, from, -1, wszTemp, (int)inlen + 1)) + { + // Convert the UCS string to local ANSI codepage + if (WideCharToMultiByte(CP_ACP, 0, wszTemp, -1, to, to_size, NULL, NULL)) + { + nResult = 1; + } + } + } + else + { + size_t chars = strlennull(from) + 1; + LPWSTR unicode = (LPWSTR)_alloca(chars * sizeof(WCHAR)); + + make_unicode_string_static(from, unicode, chars); + + WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, unicode, -1, to, to_size, NULL, NULL); + + nResult = 1; + } + + return nResult; +} + +static LRESULT ControlAddStringUtf(HWND ctrl, DWORD msg, LPCSTR szString) +{ + char str[MAX_PATH]; + LPSTR szItem = TranslateUtfStatic(szString, str, MAX_PATH); + LRESULT item = -1; + + LPWSTR wItem = make_unicode_string(szItem); + item = SendMessageW(ctrl, msg, 0, (LPARAM)wItem); + SAFE_FREE(wItem); + return item; +} + +static LRESULT ControlAddStringW(HWND ctrl, DWORD msg, LPCWSTR wszString) +{ + return SendMessageW(ctrl, msg, 0, (LPARAM)TranslateW(wszString)); +} + +LRESULT ComboBoxAddStringUtf(HWND hCombo, LPCSTR szString, DWORD data) +{ + LRESULT item = ControlAddStringUtf(hCombo, CB_ADDSTRING, szString); + SendMessage(hCombo, CB_SETITEMDATA, item, data); + + return item; +} + +LRESULT ComboBoxAddStringW(HWND hCombo, LPCWSTR wszString, DWORD data) +{ + LRESULT item = ControlAddStringW(hCombo, CB_ADDSTRING, wszString); + SendMessageW(hCombo, CB_SETITEMDATA, item, data); + + return item; +} + +LRESULT ListBoxAddStringUtf(HWND hList, LPCSTR szString) +{ + return ControlAddStringUtf(hList, LB_ADDSTRING, szString); +} + +LRESULT ListBoxAddStringW(HWND hList, LPCWSTR wszString) +{ + return ControlAddStringW(hList, LB_ADDSTRING, wszString); +} diff --git a/plugins/FingerprintNG/src/utilities.h b/plugins/FingerprintNG/src/utilities.h new file mode 100644 index 0000000000..21904ae85b --- /dev/null +++ b/plugins/FingerprintNG/src/utilities.h @@ -0,0 +1,32 @@ +/* +Fingerprint NG (client version) icons module for Miranda NG +Copyright © 2006-12 ghazan, mataes, HierOS, FYR, Bio, nullbie, faith_healer and all respective contributors. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +static LRESULT ControlAddStringUtf(HWND ctrl, DWORD msg, const char* szString); +static LRESULT ControlAddStringW(HWND ctrl, DWORD msg, LPCWSTR szString); + +LRESULT ComboBoxAddStringUtf(HWND hCombo, const char* szString, DWORD data); +LRESULT ComboBoxAddStringW(HWND hCombo, LPCWSTR szString, DWORD data); + +LRESULT ListBoxAddStringUtf(HWND hList, const char* szString); +LRESULT ListBoxAddStringW(HWND hList, LPCWSTR szString); + +#define ControlAddString ControlAddStringW +#define ComboBoxAddString ComboBoxAddStringW +#define ListBoxAddString ListBoxAddStringW + diff --git a/plugins/FingerprintNG/src/version.h b/plugins/FingerprintNG/src/version.h new file mode 100644 index 0000000000..b353195c3e --- /dev/null +++ b/plugins/FingerprintNG/src/version.h @@ -0,0 +1,45 @@ +/* +Fingerprint NG (client version) icons module for Miranda NG +Copyright © 2006-12 ghazan, mataes, HierOS, FYR, Bio, nullbie, faith_healer and all respective contributors. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#define __MAJOR_VERSION 0 +#define __MINOR_VERSION 1 +#define __RELEASE_NUM 0 +#define __BUILD_NUM 0 + +#define __FILEVERSION_STRING __MAJOR_VERSION,__MINOR_VERSION,__RELEASE_NUM,__BUILD_NUM +#define __FILEVERSION_DOTS __MAJOR_VERSION.__MINOR_VERSION.__RELEASE_NUM.__BUILD_NUM + +#define __STRINGIFY_IMPL(x) #x +#define __STRINGIFY(x) __STRINGIFY_IMPL(x) +#define __VERSION_STRING __STRINGIFY(__FILEVERSION_DOTS) +#define __VERSION_DWORD PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM) + + +#define __INTERNAL_NAME_STRING "Fingerprint NG" +#define __PLUGIN_ID 4300 +#define __PLUGIN_ID_STR "4300" +#define __BETA_FILE_TITLE "fingerprint" + + +#define __LEGAL_COPYRIGHT_STRING "© 2006-12 ghazan, mataes, HierOS, FYR, Bio, nullbie, faith_healer and all respective contributors." + +// Fingerprint interface ID. Should be the same for ALL fingerprint plugins. +// {FFF4B77A-CE40-11DB-A5CD-06A755D89593} +#define MIID_FINGERPRINT {0xFFF4B77A, 0xCE40, 0x11DB, { 0xA5, 0xCD, 0x06, 0xA7, 0x55, 0xD8, 0x95, 0x93}} +#define MIID_THIS_PLUGIN {0x687364af, 0x58b0, 0x4af2, { 0xa4, 0xee, 0x20, 0xf4, 0xa, 0x8d, 0x9a, 0xfb}} -- cgit v1.2.3