summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/ExternalAPI/m_smileyadd.h8
-rw-r--r--plugins/IEView/src/TextToken.cpp2
-rw-r--r--plugins/SmileyAdd/src/customsmiley.cpp29
-rw-r--r--plugins/SmileyAdd/src/customsmiley.h21
-rw-r--r--plugins/SmileyAdd/src/dlgboxsubclass.cpp4
-rw-r--r--plugins/SmileyAdd/src/options.cpp2
-rw-r--r--plugins/SmileyAdd/src/richcall.cpp2
-rw-r--r--plugins/SmileyAdd/src/services.cpp100
-rw-r--r--plugins/SmileyAdd/src/services.h2
-rw-r--r--plugins/SmileyAdd/src/smileys.cpp35
-rw-r--r--plugins/SmileyAdd/src/smileys.h2
-rw-r--r--plugins/SmileyAdd/src/smltool.cpp35
-rw-r--r--plugins/SmileyAdd/src/smltool.h1
-rw-r--r--plugins/SmileyAdd/src/version.h4
-rw-r--r--plugins/TabSRMM/src/msgdlgutils.cpp2
-rw-r--r--plugins/TabSRMM/src/utils.cpp2
-rw-r--r--protocols/Facebook/src/proto.cpp18
-rw-r--r--protocols/Facebook/src/server.cpp8
-rw-r--r--protocols/ICQ-WIM/src/proto.cpp5
-rw-r--r--protocols/ICQ-WIM/src/proto.h15
-rw-r--r--protocols/ICQ-WIM/src/server.cpp116
-rw-r--r--protocols/ICQ-WIM/src/stdafx.h1
-rw-r--r--protocols/VKontakte/src/misc.cpp16
-rw-r--r--protocols/VKontakte/src/vk_proto.cpp18
24 files changed, 199 insertions, 249 deletions
diff --git a/plugins/ExternalAPI/m_smileyadd.h b/plugins/ExternalAPI/m_smileyadd.h
index 667ac2fea3..80381a96e3 100644
--- a/plugins/ExternalAPI/m_smileyadd.h
+++ b/plugins/ExternalAPI/m_smileyadd.h
@@ -68,7 +68,6 @@ typedef struct
LPARAM targetWParam; //Target WParam to be sent (LParam will be char* to select smiley)
//see the example file.
HWND hwndParent; //Parent window for smiley dialog
- MCONTACT hContact; //Contact handle
} SMADD_SHOWSEL3;
//Show smiley selection window
@@ -88,7 +87,6 @@ typedef struct
//NULL if the buttonicon is not defined...
int NumberOfVisibleSmileys; //Number of visible smileys defined.
int NumberOfSmileys; //Number of total smileys defined
- MCONTACT hContact; //Contact handle
} SMADD_INFO2;
//get button smiley icon
@@ -134,7 +132,6 @@ typedef struct
unsigned numSmileys; //Number of Smileys found, this parameter filled by SmileyAdd
unsigned oflag; //One of the SAFL_ flags specifies content of the parse results
//this parameter filled by SmileyAdd
- MCONTACT hContact; //Contact handle
} SMADD_BATCHPARSE2;
typedef struct
@@ -239,10 +236,9 @@ typedef struct
typedef struct
{
- unsigned cbSize; // size of the structure
- MCONTACT hContact;
int type; // 0 - directory, 1 - file;
- TCHAR* path; // smiley category name for reference
+ const char *pszModule; // module name
+ const wchar_t *path; // smiley category name for reference
} SMADD_CONT;
//Loads all smileys for the contact
diff --git a/plugins/IEView/src/TextToken.cpp b/plugins/IEView/src/TextToken.cpp
index f5956261e9..73a38878cf 100644
--- a/plugins/IEView/src/TextToken.cpp
+++ b/plugins/IEView/src/TextToken.cpp
@@ -294,7 +294,7 @@ TextToken* TextToken::tokenizeSmileys(MCONTACT hContact, const wchar_t *text, bo
sp.Protocolname = Proto_GetBaseAccountName(hContact);
sp.flag = SAFL_PATH | SAFL_UNICODE | (isSent ? SAFL_OUTGOING : 0);
sp.wstr = (wchar_t *)text;
- sp.hContact = hContact;
+
SMADD_BATCHPARSERES *spRes = (SMADD_BATCHPARSERES *)CallService(MS_SMILEYADD_BATCHPARSE, 0, (LPARAM)&sp);
int last_pos = 0;
if (spRes != nullptr) {
diff --git a/plugins/SmileyAdd/src/customsmiley.cpp b/plugins/SmileyAdd/src/customsmiley.cpp
index b6e502e1f4..e3958760e5 100644
--- a/plugins/SmileyAdd/src/customsmiley.cpp
+++ b/plugins/SmileyAdd/src/customsmiley.cpp
@@ -20,39 +20,36 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
SmileyPackCListType g_SmileyPackCStore;
-bool SmileyPackCListType::AddSmileyPack(MCONTACT hContact, wchar_t *dir)
+bool SmileyPackCListType::AddSmileyPack(const char *pszModule, const wchar_t *dir)
{
bool res = true;
- if (GetSmileyPack(hContact) == nullptr) {
- SmileyPackCType *smileyPack = new SmileyPackCType;
+ if (GetSmileyPack(pszModule) == nullptr) {
+ SmileyPackCType *smileyPack = new SmileyPackCType(pszModule);
res = smileyPack->LoadSmileyDir(dir);
- if (res) {
- smileyPack->SetId(hContact);
+ if (res)
m_SmileyPacks.insert(smileyPack);
- }
- else delete smileyPack;
+ else
+ delete smileyPack;
}
return res;
}
-bool SmileyPackCListType::AddSmiley(MCONTACT hContact, wchar_t *path)
+bool SmileyPackCListType::AddSmiley(const char *pszModule, const wchar_t *path)
{
- SmileyPackCType *smpack = GetSmileyPack(hContact);
+ SmileyPackCType *smpack = GetSmileyPack(pszModule);
if (smpack == nullptr) {
- smpack = new SmileyPackCType;
-
- smpack->SetId(hContact);
+ smpack = new SmileyPackCType(pszModule);
m_SmileyPacks.insert(smpack);
}
return smpack->LoadSmiley(path);
}
-SmileyPackCType* SmileyPackCListType::GetSmileyPack(MCONTACT id)
+SmileyPackCType* SmileyPackCListType::GetSmileyPack(const char *pszModule)
{
for (auto &it : m_SmileyPacks)
- if (it->GetId() == id)
+ if (!mir_strcmp(it->GetId(), pszModule))
return it;
return nullptr;
@@ -83,7 +80,7 @@ bool SmileyCType::CreateTriggerText(char *text)
// SmileyPackCType
//
-bool SmileyPackCType::LoadSmileyDir(wchar_t *dir)
+bool SmileyPackCType::LoadSmileyDir(const wchar_t *dir)
{
CMStringW dirs = dir;
dirs += L"\\*.*";
@@ -113,7 +110,7 @@ bool SmileyPackCType::LoadSmileyDir(wchar_t *dir)
return false;
}
-bool SmileyPackCType::LoadSmiley(wchar_t *path)
+bool SmileyPackCType::LoadSmiley(const wchar_t *path)
{
CMStringW dirs = path;
int slash = dirs.ReverseFind('\\');
diff --git a/plugins/SmileyAdd/src/customsmiley.h b/plugins/SmileyAdd/src/customsmiley.h
index bd76875796..2deb75102c 100644
--- a/plugins/SmileyAdd/src/customsmiley.h
+++ b/plugins/SmileyAdd/src/customsmiley.h
@@ -37,11 +37,15 @@ private:
SmileyVectorType m_SmileyList;
SmileyLookupType m_SmileyLookup;
- MCONTACT m_id;
+ ptrA m_szModule;
void AddTriggersToSmileyLookup(void);
public:
+ SmileyPackCType(const char *pszModule) :
+ m_szModule(mir_strdup(pszModule))
+ {}
+
SmileyVectorType& GetSmileyList(void) { return m_SmileyList; }
SmileyLookupType& GetSmileyLookup(void) { return m_SmileyLookup; }
@@ -49,11 +53,10 @@ public:
SmileyCType* GetSmiley(unsigned index) { return &m_SmileyList[index]; }
- MCONTACT GetId(void) { return m_id; }
- void SetId(MCONTACT id) { m_id = id; }
+ const char* GetId(void) { return m_szModule; }
- bool LoadSmiley(wchar_t *path);
- bool LoadSmileyDir(wchar_t *dir);
+ bool LoadSmiley(const wchar_t *path);
+ bool LoadSmileyDir(const wchar_t *dir);
};
@@ -68,12 +71,12 @@ private:
public:
int NumberOfSmileyPacks(void) { return m_SmileyPacks.getCount(); }
- bool AddSmiley(MCONTACT hContact, wchar_t *path);
- bool AddSmileyPack(MCONTACT hContact, wchar_t *dir);
+ bool AddSmiley(const char *pszModule, const wchar_t *path);
+ bool AddSmileyPack(const char *pszModule, const wchar_t *dir);
- void ClearAndFreeAll(void) { m_SmileyPacks.destroy(); }
+ void ClearAndFreeAll(void) { m_SmileyPacks.destroy(); }
- SmileyPackCType* GetSmileyPack(MCONTACT id);
+ SmileyPackCType* GetSmileyPack(const char *pszModule);
};
extern SmileyPackCListType g_SmileyPackCStore;
diff --git a/plugins/SmileyAdd/src/dlgboxsubclass.cpp b/plugins/SmileyAdd/src/dlgboxsubclass.cpp
index 078d6e46be..1f11c44b48 100644
--- a/plugins/SmileyAdd/src/dlgboxsubclass.cpp
+++ b/plugins/SmileyAdd/src/dlgboxsubclass.cpp
@@ -33,7 +33,7 @@ struct MsgWndData : public MZeroedObject
void CreateSmileyButton(void)
{
- SmileyPackType *SmileyPack = GetSmileyPack(ProtocolName, hContact);
+ SmileyPackType *SmileyPack = GetSmileyPack(ProtocolName);
bool doSmileyButton = SmileyPack != nullptr && SmileyPack->VisibleSmileyCount() != 0;
doSmileyReplace = true;
@@ -135,7 +135,7 @@ int SmileyButtonPressed(WPARAM, LPARAM lParam)
return 0;
SmileyToolWindowParam *stwp = new SmileyToolWindowParam;
- stwp->pSmileyPack = GetSmileyPack(dat->ProtocolName, dat->hContact);
+ stwp->pSmileyPack = GetSmileyPack(dat->ProtocolName);
stwp->hWndParent = pcbc->hwndFrom;
stwp->hWndTarget = dat->hwndInput;
stwp->targetMessage = EM_REPLACESEL;
diff --git a/plugins/SmileyAdd/src/options.cpp b/plugins/SmileyAdd/src/options.cpp
index 20ec3f99be..9e592bc72c 100644
--- a/plugins/SmileyAdd/src/options.cpp
+++ b/plugins/SmileyAdd/src/options.cpp
@@ -455,8 +455,6 @@ public:
stwp->xPosition = rect.left;
stwp->yPosition = rect.bottom + 4;
stwp->direction = 1;
- stwp->hContact = 0;
-
mir_forkThread<SmileyToolWindowParam>(SmileyToolThread, stwp);
}
diff --git a/plugins/SmileyAdd/src/richcall.cpp b/plugins/SmileyAdd/src/richcall.cpp
index 3a7f0ae58a..1d9fc73d2f 100644
--- a/plugins/SmileyAdd/src/richcall.cpp
+++ b/plugins/SmileyAdd/src/richcall.cpp
@@ -132,7 +132,7 @@ static void ReplaceContactSmileys(RichEditData *rdt, const CHARRANGE &sel, bool
{
if ((rdt->inputarea && !opt.InputSmileys) || rdt->dontReplace) return;
SmileyPackCType *smcp = nullptr;
- SmileyPackType *SmileyPack = GetSmileyPack(nullptr, rdt->hContact, rdt->inputarea ? nullptr : &smcp);
+ SmileyPackType *SmileyPack = GetSmileyPack(Proto_GetBaseAccountName(rdt->hContact), rdt->inputarea ? nullptr : &smcp);
ReplaceSmileys(rdt->hwnd, SmileyPack, smcp, sel, false, ignoreLast, unFreeze);
}
diff --git a/plugins/SmileyAdd/src/services.cpp b/plugins/SmileyAdd/src/services.cpp
index bf3cbf472a..4dbfc85775 100644
--- a/plugins/SmileyAdd/src/services.cpp
+++ b/plugins/SmileyAdd/src/services.cpp
@@ -24,56 +24,23 @@ LIST<void> menuHandleArray(5);
//implementation of service functions
-SmileyPackType* GetSmileyPack(const char *proto, MCONTACT hContact, SmileyPackCType **smlc)
+SmileyPackType* GetSmileyPack(const char *proto, SmileyPackCType **smlc)
{
- hContact = DecodeMetaContact(hContact);
if (smlc)
- *smlc = g_SmileyPackCStore.GetSmileyPack(hContact);
+ *smlc = g_SmileyPackCStore.GetSmileyPack(proto);
if (proto != nullptr && IsBadStringPtrA(proto, 10))
return nullptr;
CMStringW categoryName;
- if (hContact != 0) {
- opt.ReadContactCategory(hContact, categoryName);
- if (categoryName == L"<None>") return nullptr;
- if (!categoryName.IsEmpty() && g_SmileyCategories.GetSmileyCategory(categoryName) == nullptr) {
- categoryName.Empty();
- opt.WriteContactCategory(hContact, categoryName);
- }
-
- if (categoryName.IsEmpty() && !opt.UseOneForAll) {
- char *protonam = Proto_GetBaseAccountName(hContact);
- if (protonam != nullptr) {
- DBVARIANT dbv;
- if (db_get_ws(hContact, protonam, "Transport", &dbv) == 0) {
- categoryName = dbv.pwszVal;
- db_free(&dbv);
- }
- else if (opt.UsePhysProto && db_get_ws(0, protonam, "AM_BaseProto", &dbv) == 0) {
- categoryName = L"AllProto";
- categoryName += dbv.pwszVal;
- db_free(&dbv);
- CMStringW categoryFileName = g_SmileyCategories.GetSmileyCategory(categoryName) ? g_SmileyCategories.GetSmileyCategory(categoryName)->GetFilename() : L"";
- if (categoryFileName.IsEmpty())
- categoryName = _A2T(protonam);
- }
- else
- categoryName = _A2T(protonam);
- }
- }
- }
-
- if (categoryName.IsEmpty()) {
- if (proto == nullptr || proto[0] == 0)
- categoryName = L"Standard";
- else {
- categoryName = _A2T(proto);
- if (opt.UseOneForAll) {
- SmileyCategoryType *smc = g_SmileyCategories.GetSmileyCategory(categoryName);
- if (smc == nullptr || smc->IsProto())
- categoryName = L"Standard";
- }
+ if (proto == nullptr || proto[0] == 0)
+ categoryName = L"Standard";
+ else {
+ categoryName = _A2T(proto);
+ if (opt.UseOneForAll) {
+ SmileyCategoryType *smc = g_SmileyCategories.GetSmileyCategory(categoryName);
+ if (smc == nullptr || smc->IsProto())
+ categoryName = L"Standard";
}
}
@@ -95,8 +62,7 @@ INT_PTR ReplaceSmileysCommand(WPARAM, LPARAM lParam)
else if (smrec.rangeToReplace->cpMax < 0) smrec.rangeToReplace->cpMax = LONG_MAX;
SmileyPackCType *smcp = nullptr;
- SmileyPackType *SmileyPack = GetSmileyPack(smrec.Protocolname, smrec.hContact,
- (smrec.flags & (SAFLRE_OUTGOING | SAFLRE_NOCUSTOM)) ? nullptr : &smcp);
+ SmileyPackType *SmileyPack = GetSmileyPack(smrec.Protocolname, (smrec.flags & SAFLRE_NOCUSTOM) ? nullptr : &smcp);
ReplaceSmileys(smre->hwndRichEditControl, SmileyPack, smcp, *smrec.rangeToReplace,
smrec.hContact == 0, false, false, (smre->flags & SAFLRE_FIREVIEW) ? true : false);
@@ -111,12 +77,9 @@ INT_PTR ShowSmileySelectionCommand(WPARAM, LPARAM lParam)
if (smaddInfo == nullptr) return FALSE;
HWND parent = smaddInfo->hwndParent;
- MCONTACT hContact = smaddInfo->hContact;
SmileyToolWindowParam *stwp = new SmileyToolWindowParam;
- stwp->pSmileyPack = GetSmileyPack(smaddInfo->Protocolname, hContact);
- stwp->hContact = hContact;
-
+ stwp->pSmileyPack = GetSmileyPack(smaddInfo->Protocolname);
stwp->hWndParent = parent;
stwp->hWndTarget = smaddInfo->hwndTarget;
stwp->targetMessage = smaddInfo->targetMessage;
@@ -124,7 +87,6 @@ INT_PTR ShowSmileySelectionCommand(WPARAM, LPARAM lParam)
stwp->xPosition = smaddInfo->xPosition;
stwp->yPosition = smaddInfo->yPosition;
stwp->direction = smaddInfo->Direction;
-
mir_forkThread<SmileyToolWindowParam>(SmileyToolThread, stwp);
return TRUE;
@@ -134,10 +96,8 @@ INT_PTR ShowSmileySelectionCommand(WPARAM, LPARAM lParam)
static int GetInfoCommandE(SMADD_INFO2 *smre, bool retDup)
{
if (smre == nullptr) return FALSE;
- MCONTACT hContact = smre->hContact;
-
- SmileyPackType *SmileyPack = GetSmileyPack(smre->Protocolname, hContact);
+ SmileyPackType *SmileyPack = GetSmileyPack(smre->Protocolname);
if (SmileyPack == nullptr || SmileyPack->SmileyCount() == 0) {
smre->ButtonIcon = nullptr;
smre->NumberOfSmileys = 0;
@@ -158,13 +118,11 @@ static int GetInfoCommandE(SMADD_INFO2 *smre, bool retDup)
return TRUE;
}
-
INT_PTR GetInfoCommand(WPARAM, LPARAM lParam)
{
return GetInfoCommandE((SMADD_INFO2*)lParam, false);
}
-
INT_PTR GetInfoCommand2(WPARAM, LPARAM lParam)
{
return GetInfoCommandE((SMADD_INFO2*)lParam, true);
@@ -175,15 +133,12 @@ INT_PTR GetInfoCommand2(WPARAM, LPARAM lParam)
INT_PTR ParseTextBatch(WPARAM, LPARAM lParam)
{
SMADD_BATCHPARSE2 *smre = (SMADD_BATCHPARSE2*)lParam;
-
- if (smre == nullptr) return FALSE;
- MCONTACT hContact = smre->hContact;
+ if (smre == nullptr)
+ return FALSE;
SmileyPackCType *smcp = nullptr;
- SmileyPackType *SmileyPack = GetSmileyPack(smre->Protocolname, hContact,
- (smre->flag & (SAFL_OUTGOING | SAFL_NOCUSTOM)) ? nullptr : &smcp);
-
SmileysQueueType smllist;
+ SmileyPackType *SmileyPack = GetSmileyPack(smre->Protocolname, (smre->flag & (SAFL_OUTGOING | SAFL_NOCUSTOM)) ? nullptr : &smcp);
if (smre->flag & SAFL_UNICODE)
LookupAllSmileys(SmileyPack, smcp, smre->wstr, smllist, false);
@@ -361,14 +316,29 @@ INT_PTR LoadContactSmileys(WPARAM, LPARAM lParam)
switch (cont->type) {
case 0:
- g_SmileyPackCStore.AddSmileyPack(cont->hContact, cont->path);
- NotifyEventHooks(hEvent1, (WPARAM)cont->hContact, 0);
+ g_SmileyPackCStore.AddSmileyPack(cont->pszModule, cont->path);
+ NotifyEventHooks(hEvent1, (WPARAM)cont->pszModule, 0);
break;
case 1:
- g_SmileyPackCStore.AddSmiley(cont->hContact, cont->path);
- NotifyEventHooks(hEvent1, (WPARAM)cont->hContact, 0);
+ g_SmileyPackCStore.AddSmiley(cont->pszModule, cont->path);
+ NotifyEventHooks(hEvent1, (WPARAM)cont->pszModule, 0);
break;
+
+ case 2:
+ WIN32_FIND_DATAW findData;
+ CMStringW wszPath(cont->path);
+ HANDLE hFind = FindFirstFileW(wszPath, &findData);
+ if (hFind != INVALID_HANDLE_VALUE) {
+ int idx = wszPath.ReverseFind('\\');
+ if (idx != -1)
+ wszPath.Truncate(idx+1);
+
+ do {
+ CMStringW wszFileName = wszPath + findData.cFileName;
+ g_SmileyPackCStore.AddSmiley(cont->pszModule, wszFileName);
+ } while (FindNextFileW(hFind, &findData));
+ }
}
return 0;
}
diff --git a/plugins/SmileyAdd/src/services.h b/plugins/SmileyAdd/src/services.h
index eb88fdc5a7..70cad9b45f 100644
--- a/plugins/SmileyAdd/src/services.h
+++ b/plugins/SmileyAdd/src/services.h
@@ -39,7 +39,7 @@ int AccountListChanged(WPARAM wParam, LPARAM lParam);
int DbSettingChanged(WPARAM wParam, LPARAM lParam);
int ReloadColour(WPARAM, LPARAM);
-SmileyPackType* GetSmileyPack(const char* proto, MCONTACT hContact = 0, SmileyPackCType** smlc = nullptr);
+SmileyPackType* GetSmileyPack(const char* proto, SmileyPackCType** smlc = nullptr);
#endif // SMILEYADD_SERVICES_H_
diff --git a/plugins/SmileyAdd/src/smileys.cpp b/plugins/SmileyAdd/src/smileys.cpp
index d23e77b2e5..702b6e72a6 100644
--- a/plugins/SmileyAdd/src/smileys.cpp
+++ b/plugins/SmileyAdd/src/smileys.cpp
@@ -208,41 +208,6 @@ SmileyType* SmileyPackType::GetSmiley(unsigned index)
return (index < (unsigned)m_SmileyList.getCount()) ? &m_SmileyList[index] : nullptr;
}
-static DWORD_PTR ConvertServiceParam(MCONTACT hContact, const wchar_t *param)
-{
- if (param == nullptr)
- return 0;
- if (mir_wstrcmpi(L"hContact", param) == 0)
- return hContact;
- if (iswdigit(*param))
- return _wtoi(param);
-
- return (DWORD_PTR)param;
-}
-
-void SmileyType::CallSmileyService(MCONTACT hContact)
-{
- MRegexp16 srvsplit(L"(.*)\\|(.*)\\|(.*)");
- srvsplit.match(m_TriggerText);
-
- CMStringW name = srvsplit.getGroup(1);
- CMStringW par1 = srvsplit.getGroup(2);
- CMStringW par2 = srvsplit.getGroup(3);
-
- const char *proto = "";
- if (name[0] == '/') {
- proto = (const char*)Proto_GetBaseAccountName(hContact);
- if (proto == nullptr)
- return;
- }
-
- char str[MAXMODULELABELLENGTH];
- mir_snprintf(str, "%s%S", proto, name.c_str());
- CallService(str,
- ConvertServiceParam(hContact, par1.c_str()),
- ConvertServiceParam(hContact, par2.c_str()));
-}
-
SmileyPackType::~SmileyPackType()
{
if (m_hSmList != nullptr) ImageList_Destroy(m_hSmList);
diff --git a/plugins/SmileyAdd/src/smileys.h b/plugins/SmileyAdd/src/smileys.h
index 890e0538a6..bf7accdc8c 100644
--- a/plugins/SmileyAdd/src/smileys.h
+++ b/plugins/SmileyAdd/src/smileys.h
@@ -86,8 +86,6 @@ public:
void AddObject(ISmileyBase *pObject);
void RemoveObject(ISmileyBase *pObject);
- void CallSmileyService(MCONTACT hContact);
-
void SetHidden(bool hid) { SetFlagsBit(HiddenSmiley, hid); }
void SetRegEx(bool regex) { SetFlagsBit(RegExSmiley, regex); }
void SetService(bool service) { SetFlagsBit(ServiceSmiley, service); }
diff --git a/plugins/SmileyAdd/src/smltool.cpp b/plugins/SmileyAdd/src/smltool.cpp
index 1c50b5dc5b..648fa473f6 100644
--- a/plugins/SmileyAdd/src/smltool.cpp
+++ b/plugins/SmileyAdd/src/smltool.cpp
@@ -46,7 +46,6 @@ private:
int m_Direction;
UINT m_TargetMessage;
WPARAM m_TargetWParam;
- MCONTACT m_hContact;
int rowSel;
bool m_Choosing;
@@ -175,41 +174,18 @@ LRESULT SmileyToolWindowType::DialogProcedure(UINT msg, WPARAM wParam, LPARAM lP
return Result;
}
-struct smlsrvstruct
-{
- smlsrvstruct(SmileyType *tsml, MCONTACT thContact)
- : sml(tsml), hContact(thContact)
- {
- }
- SmileyType *sml;
- MCONTACT hContact;
-};
-
-void CALLBACK smileyServiceCallback(void *arg)
-{
- smlsrvstruct *p = (smlsrvstruct*)arg;
- p->sml->CallSmileyService(p->hContact);
- delete p;
-}
-
void SmileyToolWindowType::InsertSmiley(void)
{
if (m_CurrentHotTrack >= 0 && m_hWndTarget != nullptr) {
SmileyType *sml = m_pSmileyPack->GetSmiley(m_CurrentHotTrack);
- if (sml->IsService()) {
- smlsrvstruct *p = new smlsrvstruct(sml, m_hContact);
- CallFunctionAsync(smileyServiceCallback, p);
- }
- else {
- CMStringW insertText;
+ CMStringW insertText;
+ if (opt.SurroundSmileyWithSpaces) insertText = ' ';
+ insertText += sml->GetInsertText();
+ if (opt.SurroundSmileyWithSpaces) insertText += ' ';
- if (opt.SurroundSmileyWithSpaces) insertText = ' ';
- insertText += sml->GetInsertText();
- if (opt.SurroundSmileyWithSpaces) insertText += ' ';
+ SendMessage(m_hWndTarget, m_TargetMessage, m_TargetWParam, (LPARAM)insertText.c_str());
- SendMessage(m_hWndTarget, m_TargetMessage, m_TargetWParam, (LPARAM)insertText.c_str());
- }
m_Choosing = true;
DestroyWindow(m_hwndDialog);
}
@@ -469,7 +445,6 @@ void SmileyToolWindowType::InitDialog(LPARAM lParam)
m_TargetMessage = stwp->targetMessage;
m_TargetWParam = stwp->targetWParam;
m_Direction = stwp->direction;
- m_hContact = stwp->hContact;
m_CurrentHotTrack = -2;
m_CurrMouseTrack = -1;
diff --git a/plugins/SmileyAdd/src/smltool.h b/plugins/SmileyAdd/src/smltool.h
index 26221543dd..a2cdd74508 100644
--- a/plugins/SmileyAdd/src/smltool.h
+++ b/plugins/SmileyAdd/src/smltool.h
@@ -32,7 +32,6 @@ struct SmileyToolWindowParam
HWND hWndParent;
UINT targetMessage;
WPARAM targetWParam;
- MCONTACT hContact;
};
void __cdecl SmileyToolThread(SmileyToolWindowParam *stwp);
diff --git a/plugins/SmileyAdd/src/version.h b/plugins/SmileyAdd/src/version.h
index 1e0cc4ad64..fd79d40249 100644
--- a/plugins/SmileyAdd/src/version.h
+++ b/plugins/SmileyAdd/src/version.h
@@ -1,7 +1,7 @@
#define __MAJOR_VERSION 0
#define __MINOR_VERSION 3
-#define __RELEASE_NUM 1
-#define __BUILD_NUM 2
+#define __RELEASE_NUM 2
+#define __BUILD_NUM 0
#include <stdver.h>
diff --git a/plugins/TabSRMM/src/msgdlgutils.cpp b/plugins/TabSRMM/src/msgdlgutils.cpp
index 8edb9aa78c..5b8cc97467 100644
--- a/plugins/TabSRMM/src/msgdlgutils.cpp
+++ b/plugins/TabSRMM/src/msgdlgutils.cpp
@@ -267,7 +267,7 @@ int TSAPI CheckValidSmileyPack(const char *szProto, MCONTACT hContact)
SMADD_INFO2 smainfo = { 0 };
smainfo.cbSize = sizeof(smainfo);
smainfo.Protocolname = const_cast<char *>(szProto);
- smainfo.hContact = hContact;
+
CallService(MS_SMILEYADD_GETINFO2, 0, (LPARAM)&smainfo);
if (smainfo.ButtonIcon)
DestroyIcon(smainfo.ButtonIcon);
diff --git a/plugins/TabSRMM/src/utils.cpp b/plugins/TabSRMM/src/utils.cpp
index f5e97fd276..10e8087c25 100644
--- a/plugins/TabSRMM/src/utils.cpp
+++ b/plugins/TabSRMM/src/utils.cpp
@@ -191,7 +191,7 @@ ok:
smbp.Protocolname = m_cache->getActiveProto();
smbp.flag = SAFL_TCHAR | SAFL_PATH | (isSent ? SAFL_OUTGOING : 0);
smbp.str = (wchar_t*)smcode.c_str();
- smbp.hContact = m_hContact;
+
SMADD_BATCHPARSERES *smbpr = (SMADD_BATCHPARSERES *)CallService(MS_SMILEYADD_BATCHPARSE, 0, (LPARAM)&smbp);
if (smbpr) {
CallService(MS_SMILEYADD_BATCHFREE, 0, (LPARAM)smbpr);
diff --git a/protocols/Facebook/src/proto.cpp b/protocols/Facebook/src/proto.cpp
index 87ca21d84b..d2011579de 100644
--- a/protocols/Facebook/src/proto.cpp
+++ b/protocols/Facebook/src/proto.cpp
@@ -134,23 +134,9 @@ FacebookProto::~FacebookProto()
void FacebookProto::OnModulesLoaded()
{
CMStringW wszPath(FORMAT, L"%s\\%S\\Stickers\\*.png", VARSW(L"%miranda_avatarcache%").get(), m_szModuleName);
+ SMADD_CONT cont = { 2, m_szModuleName, wszPath };
+ CallService(MS_SMILEYADD_LOADCONTACTSMILEYS, 0, LPARAM(&cont));
- WIN32_FIND_DATAW findData;
- HANDLE hFind = FindFirstFileW(wszPath, &findData);
- if (hFind != INVALID_HANDLE_VALUE) {
- wszPath.Truncate(wszPath.GetLength() - 5);
- do {
- CMStringW wszFileName = wszPath + findData.cFileName;
-
- SMADD_CONT cont;
- cont.cbSize = sizeof(SMADD_CONT);
- cont.hContact = 0;
- cont.type = 1;
- cont.path = wszFileName.GetBuffer();
- CallService(MS_SMILEYADD_LOADCONTACTSMILEYS, 0, (LPARAM)&cont);
- }
- while (FindNextFileW(hFind, &findData));
- }
}
void FacebookProto::OnShutdown()
diff --git a/protocols/Facebook/src/server.cpp b/protocols/Facebook/src/server.cpp
index d8fb1e2a1b..67e0ba323e 100644
--- a/protocols/Facebook/src/server.cpp
+++ b/protocols/Facebook/src/server.cpp
@@ -745,12 +745,8 @@ void FacebookProto::OnPublishPrivateMessage(const JSONNode &root)
szBody += "\r\n";
szBody += "STK{" + stickerId + "}";
- SMADD_CONT cont;
- cont.cbSize = sizeof(SMADD_CONT);
- cont.hContact = pUser->hContact;
- cont.type = 1;
- cont.path = wszFileName.GetBuffer();
- CallService(MS_SMILEYADD_LOADCONTACTSMILEYS, 0, (LPARAM)&cont);
+ SMADD_CONT cont = { 1, m_szModuleName, wszFileName };
+ CallService(MS_SMILEYADD_LOADCONTACTSMILEYS, 0, LPARAM(&cont));
}
else szBody += TranslateU("Sticker received");
}
diff --git a/protocols/ICQ-WIM/src/proto.cpp b/protocols/ICQ-WIM/src/proto.cpp
index 77258fa674..30e98e9008 100644
--- a/protocols/ICQ-WIM/src/proto.cpp
+++ b/protocols/ICQ-WIM/src/proto.cpp
@@ -130,6 +130,11 @@ CIcqProto::~CIcqProto()
void CIcqProto::OnModulesLoaded()
{
HookProtoEvent(ME_USERINFO_INITIALISE, &CIcqProto::OnUserInfoInit);
+
+ // load custom smilies
+ CMStringW wszPath(FORMAT, L"%s\\%S\\Stickers\\*.png", VARSW(L"%miranda_avatarcache%").get(), m_szModuleName);
+ SMADD_CONT cont = { 2, m_szModuleName, wszPath };
+ CallService(MS_SMILEYADD_LOADCONTACTSMILEYS, 0, LPARAM(&cont));
}
void CIcqProto::OnShutdown()
diff --git a/protocols/ICQ-WIM/src/proto.h b/protocols/ICQ-WIM/src/proto.h
index 81b8c82789..9bfb80c4a5 100644
--- a/protocols/ICQ-WIM/src/proto.h
+++ b/protocols/ICQ-WIM/src/proto.h
@@ -69,6 +69,20 @@ enum ChatMenuItems
IDM_INVITE = 10, IDM_LEAVE
};
+struct IcqFileInfo
+{
+ IcqFileInfo(const std::string &pszUrl, const CMStringW &pwszDescr, DWORD dwSize) :
+ szUrl(pszUrl.c_str()),
+ wszDescr(pwszDescr),
+ dwFileSize(dwSize)
+ {}
+
+ CMStringA szUrl;
+ CMStringW wszDescr;
+ DWORD dwFileSize;
+ bool bIsSticker = false;
+};
+
struct IcqGroup
{
IcqGroup(int _p1, const CMStringW &_p2) :
@@ -282,6 +296,7 @@ class CIcqProto : public PROTO<CIcqProto>
void OnGenToken(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq);
void OnGetChatInfo(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq);
void OnGetPermitDeny(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq);
+ void OnGetSticker(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq);
void OnGetUserHistory(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq);
void OnGetUserInfo(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq);
void OnLoginViaPhone(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq);
diff --git a/protocols/ICQ-WIM/src/server.cpp b/protocols/ICQ-WIM/src/server.cpp
index 14e7164477..3c27025714 100644
--- a/protocols/ICQ-WIM/src/server.cpp
+++ b/protocols/ICQ-WIM/src/server.cpp
@@ -441,15 +441,55 @@ void CIcqProto::ParseMessage(MCONTACT hContact, __int64 &lastMsgId, const JSONNo
if (idx != -1)
wszUrl.Truncate(idx);
- CMStringA szUrl(FORMAT, ICQ_FILE_SERVER "/info/%S/", wszUrl.c_str());
- auto *pReq = new AsyncHttpRequest(CONN_MAIN, REQUEST_GET, szUrl, &CIcqProto::OnFileInfo);
- pReq->hContact = hContact;
- pReq->pUserInfo = (void*)iMsgTime;
- pReq << CHAR_PARAM("aimsid", m_aimsid) << CHAR_PARAM("previews", "600");
- Push(pReq);
-
- MarkAsRead(hContact);
- return;
+ // is it already downloaded sticker?
+ CMStringW wszLoadedPath(FORMAT, L"%s\\%S\\Stickers\\STK{%s}.png", VARSW(L"%miranda_avatarcache%").get(), m_szModuleName, wszUrl.c_str());
+ if (!_waccess(wszLoadedPath, 0))
+ wszText.Format(L"STK{%s}", wszUrl.c_str());
+ else {
+ // download file info
+ IcqFileInfo *pFileInfo = nullptr;
+
+ CMStringA szUrl(FORMAT, ICQ_FILE_SERVER "/info/%S/", wszUrl.c_str());
+ auto *pReq = new AsyncHttpRequest(CONN_MAIN, REQUEST_GET, szUrl, &CIcqProto::OnFileInfo);
+ pReq->hContact = hContact;
+ pReq->pUserInfo = &pFileInfo;
+ pReq << CHAR_PARAM("aimsid", m_aimsid) << CHAR_PARAM("previews", "192,600,xlarge");
+ if (!ExecuteRequest(pReq))
+ return;
+
+ // is it a sticker?
+ if (pFileInfo->bIsSticker) {
+ auto *pNew = new AsyncHttpRequest(CONN_NONE, REQUEST_GET, pFileInfo->szUrl, &CIcqProto::OnGetSticker);
+ pNew->flags |= NLHRF_NODUMP | NLHRF_SSL | NLHRF_HTTP11 | NLHRF_REDIRECT;
+ pNew->pUserInfo = wszUrl.GetBuffer();
+ pNew->AddHeader("Sec-Fetch-User", "?1");
+ pNew->AddHeader("Sec-Fetch-Site", "cross-site");
+ pNew->AddHeader("Sec-Fetch-Mode", "navigate");
+ if (!ExecuteRequest(pNew))
+ return;
+
+ wszText.Format(L"STK{%s}", wszUrl.c_str());
+ delete pFileInfo;
+ }
+ else {
+ // detach a file transfer
+ auto *ft = new IcqFileTransfer(hContact, pFileInfo->szUrl);
+ ft->pfts.totalBytes = ft->pfts.currentFileSize = pFileInfo->dwFileSize;
+ ft->pfts.szCurrentFile.w = ft->m_wszFileName.GetBuffer();
+
+ PROTORECVFILE pre = {};
+ pre.dwFlags = PRFF_UNICODE;
+ pre.fileCount = 1;
+ pre.timestamp = iMsgTime;
+ pre.files.w = &ft->m_wszShortName;
+ pre.descr.w = pFileInfo->wszDescr;
+ pre.lParam = (LPARAM)ft;
+ ProtoChainRecvFile(hContact, &pre);
+
+ delete pFileInfo;
+ return;
+ }
+ }
}
// suppress notifications for already loaded/processed messages
@@ -844,34 +884,62 @@ void CIcqProto::OnFileInit(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pOld)
}
/////////////////////////////////////////////////////////////////////////////////////////
+// Support for stickers
+
+void CIcqProto::OnGetSticker(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq)
+{
+ if (pReply->resultCode != 200) {
+ debugLogA("Error getting sticker: %d", pReply->resultCode);
+ return;
+ }
+
+ CMStringW wszPath(FORMAT, L"%s\\%S\\Stickers", VARSW(L"%miranda_avatarcache%").get(), m_szModuleName);
+ CreateDirectoryTreeW(wszPath);
+
+ CMStringW wszFileName(FORMAT, L"%s\\STK{%s}.png", wszPath.c_str(), pReq->pUserInfo);
+ FILE *out = _wfopen(wszFileName, L"wb");
+ fwrite(pReply->pData, 1, pReply->dataLength, out);
+ fclose(out);
+
+ SMADD_CONT cont = { 1, m_szModuleName, wszFileName };
+ CallService(MS_SMILEYADD_LOADCONTACTSMILEYS, 0, LPARAM(&cont));
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// File info request
void CIcqProto::OnFileInfo(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq)
{
+ IcqFileInfo **res = (IcqFileInfo **)pReq->pUserInfo;
+ *res = nullptr;
+
RobustReply root(pReply);
if (root.error() != 200)
return;
- auto &data = root.result()["info"];
- std::string szUrl(data["dlink"].as_string());
+ auto &pData = root.result();
+ auto &pInfo = pData["info"] ;
+ std::string szUrl(pInfo["dlink"].as_string());
if (szUrl.empty())
return;
- mir_urlDecode(&*szUrl.begin());
+ MarkAsRead(pReq->hContact);
- CMStringW wszDescr(data["file_name"].as_mstring());
+ bool bIsSticker;
+ CMStringW wszDescr(pInfo["file_name"].as_mstring());
+ if (!mir_wstrncmp(wszDescr, L"dnld", 4)) {
+ bIsSticker = true;
- auto *ft = new IcqFileTransfer(pReq->hContact, szUrl.c_str());
- ft->pfts.totalBytes = ft->pfts.currentFileSize = data["file_size"].as_int();
- ft->pfts.szCurrentFile.w = ft->m_wszFileName.GetBuffer();
+ std::string szPreview = pData["previews"]["192"].as_string();
+ if (!szPreview.empty())
+ szUrl = szPreview;
+ }
+ else bIsSticker = false;
+
+ mir_urlDecode(&*szUrl.begin());
- PROTORECVFILE pre = { 0 };
- pre.dwFlags = PRFF_UNICODE;
- pre.fileCount = 1;
- pre.timestamp = DWORD_PTR(pReq->pUserInfo);
- pre.files.w = &ft->m_wszShortName;
- pre.descr.w = wszDescr;
- pre.lParam = (LPARAM)ft;
- ProtoChainRecvFile(pReq->hContact, &pre);
+ *res = new IcqFileInfo(szUrl, wszDescr, pInfo["file_size"].as_int());
+ res[0]->bIsSticker = bIsSticker;
}
void CIcqProto::OnFileRecv(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq)
diff --git a/protocols/ICQ-WIM/src/stdafx.h b/protocols/ICQ-WIM/src/stdafx.h
index 6fba501966..56b81b0dae 100644
--- a/protocols/ICQ-WIM/src/stdafx.h
+++ b/protocols/ICQ-WIM/src/stdafx.h
@@ -62,6 +62,7 @@
#include <m_options.h>
#include <m_popup.h>
#include <m_skin.h>
+#include <m_smileyadd.h>
#include <m_system.h>
#include <m_timezones.h>
#include <m_userinfo.h>
diff --git a/protocols/VKontakte/src/misc.cpp b/protocols/VKontakte/src/misc.cpp
index c657d8ecd6..963916354c 100644
--- a/protocols/VKontakte/src/misc.cpp
+++ b/protocols/VKontakte/src/misc.cpp
@@ -1318,25 +1318,17 @@ CMStringW CVkProto::GetAttachmentDescr(const JSONNode &jnAttachments, BBCSupport
fclose(out);
}
}
- else
- bSuccess = true;
-
+ else bSuccess = true;
if (bSuccess) {
res.AppendFormat(L"[sticker-%d]", iStickerId);
- SMADD_CONT cont;
- cont.cbSize = sizeof(SMADD_CONT);
- cont.hContact = 0;
- cont.type = 1;
- cont.path = wszFileName.GetBuffer();
- CallService(MS_SMILEYADD_LOADCONTACTSMILEYS, 0, (LPARAM)&cont);
+ SMADD_CONT cont = { 1, m_szModuleName, wszFileName };
+ CallService(MS_SMILEYADD_LOADCONTACTSMILEYS, 0, LPARAM(&cont));
}
- else
- res += SetBBCString(TranslateT("Sticker"), iBBC, vkbbcUrl, wszUrl);
+ else res += SetBBCString(TranslateT("Sticker"), iBBC, vkbbcUrl, wszUrl);
}
}
-
}
else if (wszType == L"link") {
const JSONNode& jnLink = jnAttach["link"];
diff --git a/protocols/VKontakte/src/vk_proto.cpp b/protocols/VKontakte/src/vk_proto.cpp
index adced3d770..fb42fad083 100644
--- a/protocols/VKontakte/src/vk_proto.cpp
+++ b/protocols/VKontakte/src/vk_proto.cpp
@@ -126,22 +126,8 @@ void CVkProto::InitSmileys()
return;
CMStringW wszPath(FORMAT, L"%s\\%S\\Stickers\\*.png", VARSW(L"%miranda_avatarcache%").get(), m_szModuleName);
-
- WIN32_FIND_DATAW findData;
- HANDLE hFind = FindFirstFileW(wszPath, &findData);
- if (hFind != INVALID_HANDLE_VALUE) {
- wszPath.Truncate(wszPath.GetLength() - 5);
- do {
- CMStringW wszFileName = wszPath + findData.cFileName;
-
- SMADD_CONT cont;
- cont.cbSize = sizeof(SMADD_CONT);
- cont.hContact = 0;
- cont.type = 1;
- cont.path = wszFileName.GetBuffer();
- CallService(MS_SMILEYADD_LOADCONTACTSMILEYS, 0, (LPARAM)&cont);
- } while (FindNextFileW(hFind, &findData));
- }
+ SMADD_CONT cont = { 2, m_szModuleName, wszPath };
+ CallService(MS_SMILEYADD_LOADCONTACTSMILEYS, 0, LPARAM(&cont));
}
// Menu support