summaryrefslogtreecommitdiff
path: root/plugins/FingerprintNG/src/prepare.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/FingerprintNG/src/prepare.cpp')
-rw-r--r--plugins/FingerprintNG/src/prepare.cpp248
1 files changed, 248 insertions, 0 deletions
diff --git a/plugins/FingerprintNG/src/prepare.cpp b/plugins/FingerprintNG/src/prepare.cpp
new file mode 100644
index 0000000000..f2d21000cb
--- /dev/null
+++ b/plugins/FingerprintNG/src/prepare.cpp
@@ -0,0 +1,248 @@
+/*
+Copyright (C) 2012-23 Miranda NG team (https://miranda-ng.org)
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation version 2
+of the License.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "stdafx.h"
+
+extern wchar_t g_szSkinLib[MAX_PATH];
+
+/*
+* Prepare
+* prepares upperstring masks and registers them in IcoLib
+*/
+
+static wchar_t *getSectionName(int flag)
+{
+ switch (flag) {
+ case MIRANDA_CASE:
+ if (g_plugin.getByte("GroupMiranda", 1))
+ return LPGENW("Client icons") L"/" LPGENW("Miranda clients");
+ break;
+
+ case MIRANDA_VERSION_CASE:
+ if (g_plugin.getByte("GroupMirandaVersion", 1))
+ return LPGENW("Client icons") L"/" LPGENW("Miranda clients");
+ break;
+
+ case MIRANDA_PACKS_CASE:
+ if (g_plugin.getByte("GroupMirandaPacks", 1))
+ return LPGENW("Client icons") L"/" LPGENW("Miranda clients") L"/" LPGENW("Pack overlays");
+ break;
+
+ case MULTI_CASE:
+ if (g_plugin.getByte("GroupMulti", 1))
+ return LPGENW("Client icons") L"/" LPGENW("Multi-proto clients");
+ break;
+
+ case GG_CASE:
+ if (g_plugin.getByte("GroupGG", 1))
+ return LPGENW("Client icons") L"/" LPGENW("Gadu-Gadu clients");
+ break;
+
+ case ICQ_CASE:
+ if (g_plugin.getByte("GroupICQ", 1))
+ return LPGENW("Client icons") L"/" LPGENW("ICQ clients");
+ break;
+
+ case IRC_CASE:
+ if (g_plugin.getByte("GroupIRC", 1))
+ return LPGENW("Client icons") L"/" LPGENW("IRC clients");
+ break;
+
+ case JABBER_CASE:
+ if (g_plugin.getByte("GroupJabber", 1))
+ return LPGENW("Client icons") L"/" LPGENW("Jabber clients");
+ break;
+
+ case RSS_CASE:
+ if (g_plugin.getByte("GroupRSS", 1))
+ return LPGENW("Client icons") L"/" LPGENW("RSS clients");
+ break;
+
+ case WEATHER_CASE:
+ if (g_plugin.getByte("GroupWeather", 1))
+ return LPGENW("Client icons") L"/" LPGENW("Weather clients");
+ break;
+
+ case FACEBOOK_CASE:
+ if (g_plugin.getByte("GroupFacebook", 1))
+ return LPGENW("Client icons") L"/" LPGENW("Facebook clients");
+ break;
+
+ case VK_CASE:
+ if (g_plugin.getByte("GroupVK", 1))
+ return LPGENW("Client icons") L"/" LPGENW("VKontakte clients");
+ break;
+
+ case OTHER_PROTOS_CASE:
+ if (g_plugin.getByte("GroupOtherProtos", 1))
+ return LPGENW("Client icons") L"/" LPGENW("Other protocols");
+ break;
+
+ case OTHERS_CASE:
+ if (g_plugin.getByte("GroupOthers", 1))
+ return LPGENW("Client icons") L"/" LPGENW("Other icons");
+ break;
+
+ case OVERLAYS_RESOURCE_CASE:
+ if (g_plugin.getByte("GroupOverlaysResource", 1))
+ return LPGENW("Client icons") L"/" LPGENW("Overlays") L"/" LPGENW("Resource");
+ break;
+
+ case OVERLAYS_PLATFORM_CASE:
+ if (g_plugin.getByte("GroupOverlaysPlatform", 1))
+ return LPGENW("Client icons") L"/" LPGENW("Overlays") L"/" LPGENW("Platform");
+ break;
+
+ case OVERLAYS_UNICODE_CASE:
+ if (g_plugin.getByte("GroupOverlaysUnicode", 1))
+ return LPGENW("Client icons") L"/" LPGENW("Overlays") L"/" LPGENW("Platform");
+ break;
+
+ case OVERLAYS_SECURITY_CASE:
+ if (g_plugin.getByte("GroupOverlaysSecurity", 1))
+ return LPGENW("Client icons") L"/" LPGENW("Overlays") L"/" LPGENW("Security");
+ break;
+
+ case OVERLAYS_PROTO_CASE:
+ if (g_plugin.getByte("GroupOverlaysProtos", 1))
+ return LPGENW("Client icons") L"/" LPGENW("Overlays") L"/" LPGENW("Protocol");
+ break;
+
+ default:
+ return LPGENW("Client icons");
+ }
+ return nullptr;
+}
+
+void Prepare(KN_FP_MASK *mask, bool bEnable, LIST<KN_FP_MASK> &dest)
+{
+ mask->szMaskUpper = nullptr;
+
+ if (mask->hIcolibItem)
+ IcoLib_RemoveIconByHandle(mask->hIcolibItem);
+ mask->hIcolibItem = nullptr;
+
+ if (!mask->szMask || !bEnable)
+ return;
+
+ size_t iMaskLen = mir_wstrlen(mask->szMask) + 1;
+ LPTSTR pszNewMask = (LPTSTR)HeapAlloc(hHeap, HEAP_NO_SERIALIZE, iMaskLen * sizeof(wchar_t));
+ wcscpy_s(pszNewMask, iMaskLen, mask->szMask);
+ _wcsupr_s(pszNewMask, iMaskLen);
+ mask->szMaskUpper = pszNewMask;
+
+ wchar_t destfile[MAX_PATH];
+ if (mask->iIconIndex == IDI_NOTFOUND || mask->iIconIndex == IDI_UNKNOWN || mask->iIconIndex == IDI_UNDETECTED)
+ GetModuleFileName(g_plugin.getInst(), destfile, MAX_PATH);
+ else {
+ wcsncpy_s(destfile, g_szSkinLib, _TRUNCATE);
+ if (0 != _waccess(destfile, 0))
+ return;
+ }
+
+ LPTSTR SectName = getSectionName(mask->iSectionFlag);
+ if (SectName == nullptr)
+ return;
+
+ SKINICONDESC sid = {};
+ sid.flags = SIDF_ALL_UNICODE;
+ sid.section.w = SectName;
+ sid.pszName = mask->szIconName;
+ sid.description.w = mask->szClientDescription;
+ sid.defaultFile.w = destfile;
+ sid.iDefaultIndex = -mask->iIconIndex;
+ mask->hIcolibItem = g_plugin.addIcon(&sid);
+
+ mask->idx = dest.getCount();
+ dest.insert(mask);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+static LIST<KN_FP_MASK> arCustom(10);
+
+void UnregisterCustomIcons()
+{
+ for (auto &it : arCustom) {
+ if (it->hIcolibItem)
+ IcoLib_RemoveIconByHandle(it->hIcolibItem);
+
+ mir_free(it->szClientDescription);
+ mir_free(it->szIconName);
+ mir_free(it->szMask);
+ mir_free(it);
+ }
+}
+
+void RegisterCustomIcons()
+{
+ UnregisterCustomIcons();
+
+ FILE *in = _wfopen(VARSW(L"%miranda_userdata%\\fingerprint.json"), L"r");
+ if (in == nullptr)
+ return;
+
+ int cbSize = filelength(fileno(in));
+ ptrA szJson((char*)mir_alloc(cbSize+1));
+ fread(szJson, 1, cbSize, in);
+ fclose(in);
+
+ JSONNode root = JSONNode::parse(szJson);
+ if (!root)
+ return;
+
+ for (auto &it : root["masks"]) {
+ CMStringA szName = it["name"].as_mstring();
+ CMStringW wszMask = it["mask"].as_mstring();
+ CMStringW szDescription = it["descr"].as_mstring();
+ if (wszMask.IsEmpty() || szName.IsEmpty() || szDescription.IsEmpty())
+ continue;
+
+ wchar_t wszFullPath[MAX_PATH];
+ PathToAbsoluteW(it["iconFile"].as_mstring(), wszFullPath);
+ if (0 != _waccess(wszFullPath, 0))
+ continue;
+
+ LPTSTR SectName = getSectionName(it["group"].as_int());
+ if (SectName == nullptr)
+ continue;
+
+ auto *pMask = (KN_FP_MASK *)mir_calloc(sizeof(KN_FP_MASK));
+
+ int iMaskLen = wszMask.GetLength() + 1;
+ pMask->szMaskUpper = (LPTSTR)HeapAlloc(hHeap, HEAP_NO_SERIALIZE, iMaskLen * sizeof(wchar_t));
+ wcscpy_s(pMask->szMaskUpper, iMaskLen, wszMask);
+ _wcsupr_s(pMask->szMaskUpper, iMaskLen);
+ pMask->szMask = pMask->szMaskUpper;
+
+ pMask->iIconIndex = it["iconFile"].as_int();
+ pMask->szIconName = szName.Detach();
+ pMask->szClientDescription = szDescription.Detach();
+
+ SKINICONDESC sid = {};
+ sid.flags = SIDF_ALL_UNICODE;
+ sid.section.w = SectName;
+ sid.pszName = pMask->szIconName;
+ sid.description.w = pMask->szClientDescription;
+ sid.defaultFile.w = wszFullPath;
+ sid.iDefaultIndex = -pMask->iIconIndex;
+ pMask->hIcolibItem = g_plugin.addIcon(&sid);
+
+ pMask->idx = g_arCommon.getCount();
+ g_arCommon.insert(pMask);
+ }
+}