/* 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 "customsmiley.h" SmileyPackCListType g_SmileyPackCStore; bool SmileyPackCListType::AddSmileyPack(HANDLE hContact, TCHAR* dir) { bool res = true; if (GetSmileyPack(hContact) == NULL) { SmileyPackCType *smileyPack = new SmileyPackCType; res = smileyPack->LoadSmileyDir(dir); if (res) { smileyPack->SetId(hContact); m_SmileyPacks.insert(smileyPack); } else delete smileyPack; } return res; } bool SmileyPackCListType::AddSmiley(HANDLE hContact, TCHAR* path) { SmileyPackCType* smpack = GetSmileyPack(hContact); if (smpack == NULL) { smpack = new SmileyPackCType; smpack->SetId(hContact); m_SmileyPacks.insert(smpack); } return smpack->LoadSmiley(path); } SmileyPackCType* SmileyPackCListType::GetSmileyPack(HANDLE id) { for (int i = 0; i < m_SmileyPacks.getCount(); i++) { if (m_SmileyPacks[i].GetId() == id) return &m_SmileyPacks[i]; } return NULL; } SmileyCType::SmileyCType(const bkstring& fullpath, const TCHAR* filepath) { LoadFromResource(fullpath, 0); CreateTriggerText(T2A_SM(filepath)); } bool SmileyCType::CreateTriggerText(char* text) { UrlDecode(text); int len = (int)strlen(text); if (len == 0) return false; int reslen = Netlib_GetBase64DecodedBufferSize(len)+1; char* res = (char*)alloca(reslen); NETLIBBASE64 nlb = { text, len, ( PBYTE )res, reslen }; if (!CallService(MS_NETLIB_BASE64DECODE, 0, LPARAM( &nlb ))) return false; res[nlb.cbDecoded] = 0; TCHAR *txt = mir_utf8decodeT(res); if (txt == NULL) return false; m_TriggerText = txt; mir_free(txt); return true; } // // SmileyPackCType // bool SmileyPackCType::LoadSmileyDir(TCHAR* dir) { bkstring dirs = dir; dirs += _T("\\*.*"); _tfinddata_t c_file; INT_PTR hFile = _tfindfirst((TCHAR*)dirs.c_str(), &c_file); if (hFile > -1L) { do { if (c_file.name[0] != '.') { bkstring fullpath = dir; fullpath = fullpath + _T("\\") + c_file.name; TCHAR* div = _tcsrchr(c_file.name, '.'); if (div) { *div = 0; SmileyCType *smlc = new SmileyCType(fullpath, c_file.name); if (smlc->GetTriggerText().empty()) delete smlc; else m_SmileyList.insert(smlc); } } } while( _tfindnext( hFile, &c_file ) == 0 ); _findclose( hFile ); AddTriggersToSmileyLookup(); return true; } return false; } bool SmileyPackCType::LoadSmiley(TCHAR* path) { bkstring dirs = path; bkstring::size_type slash = dirs.find_last_of('\\'); bkstring::size_type dot = dirs.find_last_of('.'); bkstring name = dirs.substr(slash+1, dot - slash - 1); for (int i=0; i < m_SmileyList.getCount(); i++) { if (m_SmileyList[i].GetTriggerText() == name) { m_SmileyList[i].LoadFromResource(dirs, 0); return true; } } m_SmileyList.insert(new SmileyCType(dirs, (TCHAR*)name.c_str())); bkstring 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) { bkstring empty; for (int dist=0; dist