/* Miranda SmileyAdd Plugin Copyright (C) 2008 - 2011 Boris Krasnovskiy All Rights Reserved This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "stdafx.h" SmileyPackCListType g_SmileyPackCStore; bool SmileyPackCListType::AddSmileyPack(const char *pszModule, const wchar_t *dir) { bool res = true; if (GetSmileyPack(pszModule) == nullptr) { SmileyPackCType *smileyPack = new SmileyPackCType(pszModule); res = smileyPack->LoadSmileyDir(dir); if (res) m_SmileyPacks.insert(smileyPack); else delete smileyPack; } return res; } bool SmileyPackCListType::AddSmiley(const char *pszModule, const wchar_t *path) { SmileyPackCType *smpack = GetSmileyPack(pszModule); if (smpack == nullptr) { smpack = new SmileyPackCType(pszModule); m_SmileyPacks.insert(smpack); } return smpack->LoadSmiley(path); } SmileyPackCType* SmileyPackCListType::GetSmileyPack(const char *pszModule) { for (auto &it : m_SmileyPacks) if (!mir_strcmp(it->GetId(), pszModule)) return it; return nullptr; } SmileyCType::SmileyCType(const CMStringW &fullpath, const wchar_t *filepath) { LoadFromResource(fullpath, 0); CreateTriggerText(_T2A(filepath)); } bool SmileyCType::CreateTriggerText(char *text) { if (mir_strlen(text) == 0) return false; wchar_t *txt = mir_utf8decodeW(text); if (txt == nullptr) return false; m_TriggerText = txt; mir_free(txt); return true; } // // SmileyPackCType // bool SmileyPackCType::LoadSmileyDir(const wchar_t *dir) { CMStringW dirs = dir; dirs += L"\\*.*"; _wfinddata_t c_file; INT_PTR hFile = _wfindfirst((wchar_t*)dirs.c_str(), &c_file); if (hFile > -1L) { do { if (c_file.name[0] != '.') { CMStringW fullpath = dir; fullpath = fullpath + L"\\" + c_file.name; wchar_t *div = wcsrchr(c_file.name, '.'); if (div) { *div = 0; SmileyCType *smlc = new SmileyCType(fullpath, c_file.name); if (smlc->GetTriggerText().IsEmpty()) delete smlc; else m_SmileyList.insert(smlc); } } } while (_wfindnext(hFile, &c_file) == 0); _findclose(hFile); AddTriggersToSmileyLookup(); return true; } return false; } bool SmileyPackCType::LoadSmiley(const wchar_t *path) { CMStringW dirs = path; int slash = dirs.ReverseFind('\\'); int dot = dirs.ReverseFind('.'); CMStringW name = dirs.Mid(slash + 1, dot - slash - 1); for (auto &it : m_SmileyList) if (it->GetTriggerText() == name) { it->LoadFromResource(dirs, 0); return false; } m_SmileyList.insert(new SmileyCType(dirs, (wchar_t*)name.c_str())); CMStringW empty; m_SmileyLookup.insert(new SmileyLookup( m_SmileyList[m_SmileyList.getCount() - 1].GetTriggerText(), false, m_SmileyList.getCount() - 1, empty)); return true; } void SmileyPackCType::AddTriggersToSmileyLookup(void) { CMStringW empty; for (int dist = 0; dist < m_SmileyList.getCount(); dist++) { SmileyLookup *dats = new SmileyLookup(m_SmileyList[dist].GetTriggerText(), false, dist, empty); m_SmileyLookup.insert(dats); } }