/*
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