From afa6a68cca2865a4d974143dc1a289e4f83a5e1c Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 16 Aug 2020 14:54:26 +0300 Subject: SmileyAdd: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - major update for custom smileys APIs (cause we have no MSN, there's no need to save MCONTACT for custom smileys); - added path type = 2 to download whole folder for custom smileys; - fixes #2524 (ICQ: стикеры должны приходить как custom smileys, а не как передачи файлов); - fixes #2533 (SmileyAdd не всегда распознаёт стикеры); - fixes #2532 (Полученные стикеры пропадают при переоткрытии окна); - version bump --- plugins/ExternalAPI/m_smileyadd.h | 8 +-- plugins/IEView/src/TextToken.cpp | 2 +- plugins/SmileyAdd/src/customsmiley.cpp | 29 ++++---- plugins/SmileyAdd/src/customsmiley.h | 21 +++--- plugins/SmileyAdd/src/dlgboxsubclass.cpp | 4 +- plugins/SmileyAdd/src/options.cpp | 2 - plugins/SmileyAdd/src/richcall.cpp | 2 +- plugins/SmileyAdd/src/services.cpp | 100 ++++++++++---------------- plugins/SmileyAdd/src/services.h | 2 +- plugins/SmileyAdd/src/smileys.cpp | 35 ---------- plugins/SmileyAdd/src/smileys.h | 2 - plugins/SmileyAdd/src/smltool.cpp | 35 ++-------- plugins/SmileyAdd/src/smltool.h | 1 - plugins/SmileyAdd/src/version.h | 4 +- plugins/TabSRMM/src/msgdlgutils.cpp | 2 +- plugins/TabSRMM/src/utils.cpp | 2 +- protocols/Facebook/src/proto.cpp | 18 +---- protocols/Facebook/src/server.cpp | 8 +-- protocols/ICQ-WIM/src/proto.cpp | 5 ++ protocols/ICQ-WIM/src/proto.h | 15 ++++ protocols/ICQ-WIM/src/server.cpp | 116 ++++++++++++++++++++++++------- protocols/ICQ-WIM/src/stdafx.h | 1 + protocols/VKontakte/src/misc.cpp | 16 ++--- protocols/VKontakte/src/vk_proto.cpp | 18 +---- 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 . 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(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 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"") 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(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 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(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 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 #include #include +#include #include #include #include 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 -- cgit v1.2.3