diff options
author | George Hazan <george.hazan@gmail.com> | 2015-06-13 16:55:17 +0000 |
---|---|---|
committer | George Hazan <george.hazan@gmail.com> | 2015-06-13 16:55:17 +0000 |
commit | cbe3cb21f5bca61a03bbd4ae811ee906e09b3f4f (patch) | |
tree | 4854fb66f4d59940efa3c1590237915851074dbf /src/modules/protocols | |
parent | 351bcbec48ed77af5f8efcc4d5198707922c5d86 (diff) |
- miranda32.exe now does nothing bug extends PATH to %miranda_root%\libs and loads mir_app.dll;
- everything that was in miranda32.exe (including resources) moved to mir_app.dll;
- exports from mir_app.dll now available for using directly, without perversions;
- src/stdplug.h deleted;
git-svn-id: http://svn.miranda-ng.org/main/trunk@14143 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'src/modules/protocols')
-rw-r--r-- | src/modules/protocols/protoaccs.cpp | 453 | ||||
-rw-r--r-- | src/modules/protocols/protochains.cpp | 253 | ||||
-rw-r--r-- | src/modules/protocols/protocols.cpp | 511 | ||||
-rw-r--r-- | src/modules/protocols/protodir.cpp | 243 | ||||
-rw-r--r-- | src/modules/protocols/protoint.cpp | 304 | ||||
-rw-r--r-- | src/modules/protocols/protoopts.cpp | 1062 |
6 files changed, 0 insertions, 2826 deletions
diff --git a/src/modules/protocols/protoaccs.cpp b/src/modules/protocols/protoaccs.cpp deleted file mode 100644 index 1e92cb637c..0000000000 --- a/src/modules/protocols/protoaccs.cpp +++ /dev/null @@ -1,453 +0,0 @@ -/*
-
-Miranda NG: the free IM client for Microsoft* Windows*
-
-Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org),
-Copyright (c) 2000-12 Miranda IM project,
-all portions of this codebase are copyrighted to the people
-listed in contributors.txt.
-
-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; either version 2
-of the License, or (at your option) any later version.
-
-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, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include "..\..\core\commonheaders.h"
-
-#include "../clist/clc.h"
-
-bool CheckProtocolOrder(void);
-void BuildProtoMenus();
-
-HICON Proto_GetIcon(PROTO_INTERFACE *ppro, int iconIndex);
-
-static BOOL bModuleInitialized = FALSE;
-static HANDLE hHooks[4];
-
-static int CompareAccounts(const PROTOACCOUNT* p1, const PROTOACCOUNT* p2)
-{
- return mir_strcmp(p1->szModuleName, p2->szModuleName);
-}
-
-LIST<PROTOACCOUNT> accounts(10, CompareAccounts);
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static int EnumDbModules(const char *szModuleName, DWORD ofsModuleName, LPARAM lParam)
-{
- DBVARIANT dbv;
- if (!db_get_s(NULL, szModuleName, "AM_BaseProto", &dbv)) {
- if (!Proto_GetAccount(szModuleName)) {
- PROTOACCOUNT *pa = (PROTOACCOUNT*)mir_calloc(sizeof(PROTOACCOUNT));
- pa->cbSize = sizeof(*pa);
- pa->szModuleName = mir_strdup(szModuleName);
- pa->szProtoName = mir_strdup(dbv.pszVal);
- pa->tszAccountName = mir_a2t(szModuleName);
- pa->bIsVisible = TRUE;
- pa->bIsEnabled = FALSE;
- pa->iOrder = accounts.getCount();
- accounts.insert(pa);
- }
- db_free(&dbv);
- }
- return 0;
-}
-
-void LoadDbAccounts(void)
-{
- DBVARIANT dbv;
- int ver = db_get_dw(NULL, "Protocols", "PrVer", -1);
- int count = db_get_dw(NULL, "Protocols", "ProtoCount", 0);
-
- for (int i = 0; i < count; i++) {
- char buf[10];
- _itoa(i, buf, 10);
- if (db_get_s(NULL, "Protocols", buf, &dbv))
- continue;
-
- PROTOACCOUNT *pa = (PROTOACCOUNT*)mir_calloc(sizeof(PROTOACCOUNT));
- if (pa == NULL) {
- db_free(&dbv);
- continue;
- }
- pa->cbSize = sizeof(*pa);
- pa->szModuleName = mir_strdup(dbv.pszVal);
- db_free(&dbv);
-
- _itoa(OFFSET_VISIBLE + i, buf, 10);
- pa->bIsVisible = db_get_dw(NULL, "Protocols", buf, 1) != 0;
-
- _itoa(OFFSET_PROTOPOS + i, buf, 10);
- pa->iOrder = db_get_dw(NULL, "Protocols", buf, 1);
-
- if (ver >= 4) {
- db_free(&dbv);
- _itoa(OFFSET_NAME + i, buf, 10);
- if (!db_get_ts(NULL, "Protocols", buf, &dbv)) {
- pa->tszAccountName = mir_tstrdup(dbv.ptszVal);
- db_free(&dbv);
- }
-
- _itoa(OFFSET_ENABLED + i, buf, 10);
- pa->bIsEnabled = db_get_dw(NULL, "Protocols", buf, 1) != 0;
-
- if (!db_get_s(NULL, pa->szModuleName, "AM_BaseProto", &dbv)) {
- pa->szProtoName = mir_strdup(dbv.pszVal);
- db_free(&dbv);
- }
- }
- else pa->bIsEnabled = true;
-
- if (!pa->szProtoName) {
- pa->szProtoName = mir_strdup(pa->szModuleName);
- db_set_s(NULL, pa->szModuleName, "AM_BaseProto", pa->szProtoName);
- }
-
- if (!pa->tszAccountName)
- pa->tszAccountName = mir_a2t(pa->szModuleName);
-
- accounts.insert(pa);
- }
-
- if (CheckProtocolOrder())
- WriteDbAccounts();
-
- int anum = accounts.getCount();
- CallService(MS_DB_MODULES_ENUM, 0, (LPARAM)EnumDbModules);
- if (anum != accounts.getCount())
- WriteDbAccounts();
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-typedef struct
-{
- int arrlen;
- char **pszSettingName;
-}
-enumDB_ProtoProcParam;
-
-static int enumDB_ProtoProc(const char* szSetting, LPARAM lParam)
-{
- if (szSetting) {
- enumDB_ProtoProcParam* p = (enumDB_ProtoProcParam*)lParam;
-
- p->arrlen++;
- p->pszSettingName = (char**)mir_realloc(p->pszSettingName, p->arrlen*sizeof(char*));
- p->pszSettingName[p->arrlen - 1] = mir_strdup(szSetting);
- }
- return 0;
-}
-
-void WriteDbAccounts()
-{
- // enum all old settings to delete
- enumDB_ProtoProcParam param = { 0, NULL };
-
- DBCONTACTENUMSETTINGS dbces;
- dbces.pfnEnumProc = enumDB_ProtoProc;
- dbces.szModule = "Protocols";
- dbces.ofsSettings = 0;
- dbces.lParam = (LPARAM)¶m;
- CallService(MS_DB_CONTACT_ENUMSETTINGS, 0, (LPARAM)&dbces);
-
- // delete all settings
- if (param.arrlen) {
- for (int i = 0; i < param.arrlen; i++) {
- db_unset(0, "Protocols", param.pszSettingName[i]);
- mir_free(param.pszSettingName[i]);
- }
- mir_free(param.pszSettingName);
- }
-
- // write new data
- for (int i = 0; i < accounts.getCount(); i++) {
- PROTOACCOUNT *pa = accounts[i];
-
- char buf[20];
- _itoa(i, buf, 10);
- db_set_s(NULL, "Protocols", buf, pa->szModuleName);
-
- _itoa(OFFSET_PROTOPOS + i, buf, 10);
- db_set_dw(NULL, "Protocols", buf, pa->iOrder);
-
- _itoa(OFFSET_VISIBLE + i, buf, 10);
- db_set_dw(NULL, "Protocols", buf, pa->bIsVisible);
-
- _itoa(OFFSET_ENABLED + i, buf, 10);
- db_set_dw(NULL, "Protocols", buf, pa->bIsEnabled);
-
- _itoa(OFFSET_NAME + i, buf, 10);
- db_set_ts(NULL, "Protocols", buf, pa->tszAccountName);
- }
-
- db_unset(0, "Protocols", "ProtoCount");
- db_set_dw(0, "Protocols", "ProtoCount", accounts.getCount());
- db_set_dw(0, "Protocols", "PrVer", 4);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static int OnContactDeleted(WPARAM hContact, LPARAM lParam)
-{
- if (hContact) {
- PROTOACCOUNT *pa = Proto_GetAccount(hContact);
- if (Proto_IsAccountEnabled(pa) && pa->ppro)
- pa->ppro->OnEvent(EV_PROTO_ONCONTACTDELETED, hContact, lParam);
- }
- return 0;
-}
-
-static int OnDbSettingsChanged(WPARAM hContact, LPARAM lParam)
-{
- if (hContact) {
- PROTOACCOUNT *pa = Proto_GetAccount(hContact);
- if (Proto_IsAccountEnabled(pa) && pa->ppro)
- pa->ppro->OnEvent(EV_PROTO_DBSETTINGSCHANGED, hContact, lParam);
- }
- return 0;
-}
-
-static int InitializeStaticAccounts(WPARAM, LPARAM)
-{
- int count = 0;
-
- for (int i = 0; i < accounts.getCount(); i++) {
- PROTOACCOUNT *pa = accounts[i];
- if (!pa->ppro || !Proto_IsAccountEnabled(pa))
- continue;
-
- pa->ppro->OnEvent(EV_PROTO_ONLOAD, 0, 0);
-
- if (!pa->bOldProto)
- count++;
- }
-
- BuildProtoMenus();
-
- if (count == 0 && !db_get_b(NULL, "FirstRun", "AccManager", 0)) {
- db_set_b(NULL, "FirstRun", "AccManager", 1);
- CallService(MS_PROTO_SHOWACCMGR, 0, 0);
- }
- // This is for pack creators with a profile with predefined accounts
- else if (db_get_b(NULL, "FirstRun", "ForceShowAccManager", 0)) {
- CallService(MS_PROTO_SHOWACCMGR, 0, 0);
- db_unset(NULL, "FirstRun", "ForceShowAccManager");
- }
- return 0;
-}
-
-static int UninitializeStaticAccounts(WPARAM, LPARAM)
-{
- for (int i = 0; i < accounts.getCount(); i++) {
- PROTOACCOUNT *pa = accounts[i];
- if (pa->ppro && Proto_IsAccountEnabled(pa))
- if (pa->ppro->OnEvent(EV_PROTO_ONREADYTOEXIT, 0, 0) != TRUE)
- return 1;
- }
-
- for (int i = 0; i < accounts.getCount(); i++) {
- PROTOACCOUNT *pa = accounts[i];
- if (pa->ppro && Proto_IsAccountEnabled(pa))
- pa->ppro->OnEvent(EV_PROTO_ONEXIT, 0, 0);
- }
-
- return 0;
-}
-
-int LoadAccountsModule(void)
-{
- bModuleInitialized = TRUE;
-
- for (int i = 0; i < accounts.getCount(); i++) {
- PROTOACCOUNT *pa = accounts[i];
- pa->bDynDisabled = !Proto_IsProtocolLoaded(pa->szProtoName);
- if (pa->ppro)
- continue;
-
- if (!Proto_IsAccountEnabled(pa))
- continue;
-
- if (!ActivateAccount(pa))
- pa->bDynDisabled = TRUE;
- }
-
- hHooks[0] = HookEvent(ME_SYSTEM_MODULESLOADED, InitializeStaticAccounts);
- hHooks[1] = HookEvent(ME_SYSTEM_PRESHUTDOWN, UninitializeStaticAccounts);
- hHooks[2] = HookEvent(ME_DB_CONTACT_DELETED, OnContactDeleted);
- hHooks[3] = HookEvent(ME_DB_CONTACT_SETTINGCHANGED, OnDbSettingsChanged);
- return 0;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static HANDLE CreateProtoServiceEx(const char* szModule, const char* szService, MIRANDASERVICEOBJ pFunc, void* param)
-{
- char tmp[100];
- mir_snprintf(tmp, "%s%s", szModule, szService);
- return CreateServiceFunctionObj(tmp, pFunc, param);
-}
-
-BOOL ActivateAccount(PROTOACCOUNT *pa)
-{
- PROTOCOLDESCRIPTOR* ppd = Proto_IsProtocolLoaded(pa->szProtoName);
- if (ppd == NULL)
- return FALSE;
-
- if (ppd->fnInit == NULL)
- return FALSE;
-
- PROTO_INTERFACE *ppi = ppd->fnInit(pa->szModuleName, pa->tszAccountName);
- if (ppi == NULL)
- return FALSE;
-
- pa->ppro = ppi;
- ppi->m_iDesiredStatus = ppi->m_iStatus = ID_STATUS_OFFLINE;
- return TRUE;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-struct DeactivationThreadParam
-{
- PROTO_INTERFACE *ppro;
- pfnUninitProto fnUninit;
- bool bIsDynamic, bErase;
-};
-
-pfnUninitProto GetProtocolDestructor(char *szProto);
-
-static int DeactivationThread(DeactivationThreadParam* param)
-{
- PROTO_INTERFACE *p = (PROTO_INTERFACE*)param->ppro;
- p->SetStatus(ID_STATUS_OFFLINE);
-
- char *szModuleName = NEWSTR_ALLOCA(p->m_szModuleName);
-
- if (param->bIsDynamic) {
- while (p->OnEvent(EV_PROTO_ONREADYTOEXIT, 0, 0) != TRUE)
- SleepEx(100, TRUE);
-
- p->OnEvent(EV_PROTO_ONEXIT, 0, 0);
- }
-
- KillObjectThreads(p); // waits for them before terminating
- KillObjectEventHooks(p); // untie an object from the outside world
-
- if (param->bErase)
- p->OnEvent(EV_PROTO_ONERASE, 0, 0);
-
- if (param->fnUninit)
- param->fnUninit(p);
-
- KillObjectServices(p);
-
- if (param->bErase)
- EraseAccount(szModuleName);
-
- delete param;
- return 0;
-}
-
-void DeactivateAccount(PROTOACCOUNT *pa, bool bIsDynamic, bool bErase)
-{
- if (pa->ppro == NULL) {
- if (bErase)
- EraseAccount(pa->szModuleName);
- return;
- }
-
- if (pa->hwndAccMgrUI) {
- DestroyWindow(pa->hwndAccMgrUI);
- pa->hwndAccMgrUI = NULL;
- pa->bAccMgrUIChanged = FALSE;
- }
-
- DeactivationThreadParam *param = new DeactivationThreadParam;
- param->ppro = pa->ppro;
- param->fnUninit = GetProtocolDestructor(pa->szProtoName);
- param->bIsDynamic = bIsDynamic;
- param->bErase = bErase;
- pa->ppro = NULL;
- if (bIsDynamic)
- mir_forkthread((pThreadFunc)DeactivationThread, param);
- else
- DeactivationThread(param);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-void EraseAccount(const char* pszModuleName)
-{
- // remove protocol contacts first
- for (MCONTACT hContact = db_find_first(pszModuleName); hContact != NULL;) {
- MCONTACT hNext = db_find_next(hContact, pszModuleName);
- CallService(MS_DB_CONTACT_DELETE, hContact, 0);
- hContact = hNext;
- }
-
- // remove all protocol settings
- CallService(MS_DB_MODULE_DELETE, 0, (LPARAM)pszModuleName);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-void UnloadAccount(PROTOACCOUNT *pa, bool bIsDynamic, bool bErase)
-{
- DeactivateAccount(pa, bIsDynamic, bErase);
-
- mir_free(pa->tszAccountName);
- mir_free(pa->szProtoName);
- // szModuleName should be freed only on a program's exit.
- // otherwise many plugins dependand on static protocol names will crash!
- // do NOT fix this 'leak', please
- if (!bIsDynamic) {
- mir_free(pa->szModuleName);
- mir_free(pa);
- }
-}
-
-void UnloadAccountsModule()
-{
- if (!bModuleInitialized) return;
-
- for (int i = accounts.getCount() - 1; i >= 0; i--) {
- PROTOACCOUNT *pa = accounts[i];
- UnloadAccount(pa, false, false);
- accounts.remove(i);
- }
- accounts.destroy();
-
- for (int i = 0; i < SIZEOF(hHooks); i++)
- UnhookEvent(hHooks[i]);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-void BuildProtoMenus()
-{
- for (int i = 0; i < accounts.getCount(); i++) {
- PROTOACCOUNT *pa = accounts[i];
- if (cli.pfnGetProtocolVisibility(pa->szModuleName) == 0)
- continue;
-
- if (pa->ppro)
- pa->ppro->OnEvent(EV_PROTO_ONMENU, 0, 0);
- }
-}
-
-void RebuildProtoMenus(int iNewValue)
-{
- RebuildMenuOrder();
- BuildProtoMenus();
-}
diff --git a/src/modules/protocols/protochains.cpp b/src/modules/protocols/protochains.cpp deleted file mode 100644 index be760d9877..0000000000 --- a/src/modules/protocols/protochains.cpp +++ /dev/null @@ -1,253 +0,0 @@ -/*
-
-Miranda NG: the free IM client for Microsoft* Windows*
-
-Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org),
-Copyright (c) 2000-12 Miranda IM project,
-all portions of this codebase are copyrighted to the people
-listed in contributors.txt.
-
-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; either version 2
-of the License, or (at your option) any later version.
-
-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, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include "..\..\core\commonheaders.h"
-#include <m_protomod.h>
-
-extern LIST<PROTOCOLDESCRIPTOR> filters;
-
-static int GetProtocolP(MCONTACT hContact, char *szBuf, int cbLen)
-{
- if (currDb == NULL)
- return 1;
-
- DBCachedContact *cc = currDb->m_cache->GetCachedContact(hContact);
- if (cc && cc->szProto != NULL) {
- strncpy(szBuf, cc->szProto, cbLen);
- szBuf[cbLen - 1] = 0;
- return 0;
- }
-
- DBVARIANT dbv;
- dbv.type = DBVT_ASCIIZ;
- dbv.pszVal = szBuf;
- dbv.cchVal = cbLen;
-
- int res = currDb->GetContactSettingStatic(hContact, "Protocol", "p", &dbv);
- if (res == 0) {
- if (cc == NULL)
- cc = currDb->m_cache->AddContactToCache(hContact);
-
- cc->szProto = currDb->m_cache->GetCachedSetting(NULL, szBuf, 0, (int)mir_strlen(szBuf));
- }
- return res;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-INT_PTR CallContactService(MCONTACT hContact, const char *szProtoService, WPARAM wParam, LPARAM lParam)
-{
- INT_PTR ret;
- CCSDATA ccs = { hContact, szProtoService, wParam, lParam };
-
- for (int i = 0; i < filters.getCount(); i++) {
- if ((ret = CallProtoServiceInt(hContact, filters[i]->szName, szProtoService, i + 1, (LPARAM)&ccs)) != CALLSERVICE_NOTFOUND) {
- //chain was started, exit
- return ret;
- }
- }
-
- char szProto[40];
- if (GetProtocolP((MCONTACT)hContact, szProto, sizeof(szProto)))
- return 1;
-
- PROTOACCOUNT *pa = Proto_GetAccount(szProto);
- if (pa == NULL || pa->ppro == NULL)
- return 1;
-
- if (pa->bOldProto)
- ret = CallProtoServiceInt(hContact, szProto, szProtoService, (WPARAM)(-1), (LPARAM)&ccs);
- else
- ret = CallProtoServiceInt(hContact, szProto, szProtoService, wParam, lParam);
- if (ret == CALLSERVICE_NOTFOUND)
- ret = 1;
-
- return ret;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-INT_PTR Proto_CallContactService(WPARAM wParam, LPARAM lParam)
-{
- CCSDATA *ccs = (CCSDATA*)lParam;
- INT_PTR ret;
-
- if (wParam == (WPARAM)(-1))
- return 1;
-
- for (int i = wParam; i < filters.getCount(); i++) {
- if ((ret = CallProtoServiceInt(NULL, filters[i]->szName, ccs->szProtoService, i + 1, lParam)) != CALLSERVICE_NOTFOUND) {
- //chain was started, exit
- return ret;
- }
- }
-
- char szProto[40];
- if (GetProtocolP((MCONTACT)ccs->hContact, szProto, sizeof(szProto)))
- return 1;
-
- PROTOACCOUNT *pa = Proto_GetAccount(szProto);
- if (pa == NULL || pa->ppro == NULL)
- return 1;
-
- if (pa->bOldProto)
- ret = CallProtoServiceInt(ccs->hContact, szProto, ccs->szProtoService, (WPARAM)(-1), (LPARAM)ccs);
- else
- ret = CallProtoServiceInt(ccs->hContact, szProto, ccs->szProtoService, ccs->wParam, ccs->lParam);
- if (ret == CALLSERVICE_NOTFOUND)
- ret = 1;
-
- return ret;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static INT_PTR Proto_RecvChain(WPARAM wParam, LPARAM lParam)
-{
- CCSDATA *ccs = (CCSDATA*)lParam;
- INT_PTR ret;
-
- if (wParam == (WPARAM)(-1)) return 1; //shouldn't happen - sanity check
- if (wParam == 0) { //begin processing by finding end of chain
- if (GetCurrentThreadId() != hMainThreadId) // restart this function in the main thread
- return CallServiceSync(MS_PROTO_CHAINRECV, wParam, lParam);
-
- wParam = filters.getCount();
- }
- else wParam--;
-
- for (int i = wParam - 1; i >= 0; i--)
- if ((ret = CallProtoServiceInt(NULL, filters[i]->szName, ccs->szProtoService, i + 1, lParam)) != CALLSERVICE_NOTFOUND)
- //chain was started, exit
- return ret;
-
- //end of chain, call network protocol again
- char szProto[40];
- if (GetProtocolP((MCONTACT)ccs->hContact, szProto, sizeof(szProto)))
- return 1;
-
- PROTOACCOUNT *pa = Proto_GetAccount(szProto);
- if (pa == NULL || pa->ppro == NULL)
- return 1;
-
- if (pa->bOldProto)
- ret = CallProtoServiceInt(ccs->hContact, szProto, ccs->szProtoService, (WPARAM)(-1), (LPARAM)ccs);
- else
- ret = CallProtoServiceInt(ccs->hContact, szProto, ccs->szProtoService, ccs->wParam, ccs->lParam);
- if (ret == CALLSERVICE_NOTFOUND)
- ret = 1;
-
- return ret;
-}
-
-PROTOACCOUNT* __fastcall Proto_GetAccount(MCONTACT hContact)
-{
- if (hContact == NULL)
- return NULL;
-
- char szProto[40];
- if (GetProtocolP((MCONTACT)hContact, szProto, sizeof(szProto)))
- return NULL;
-
- return Proto_GetAccount(szProto);
-}
-
-static INT_PTR Proto_GetContactBaseProto(WPARAM wParam, LPARAM)
-{
- PROTOACCOUNT *pa = Proto_GetAccount(wParam);
- return (INT_PTR)(Proto_IsAccountEnabled(pa) ? pa->szModuleName : NULL);
-}
-
-static INT_PTR Proto_GetContactBaseAccount(WPARAM wParam, LPARAM)
-{
- PROTOACCOUNT *pa = Proto_GetAccount(wParam);
- return (INT_PTR)(pa ? pa->szModuleName : NULL);
-}
-
-static INT_PTR Proto_IsProtoOnContact(WPARAM wParam, LPARAM lParam)
-{
- char *szProto = (char*)lParam;
- if (szProto == NULL)
- return 0;
-
- char szContactProto[40];
- if (!GetProtocolP(wParam, szContactProto, sizeof(szContactProto)))
- if (!_stricmp(szProto, szContactProto))
- return -1;
-
- for (int i = 0; i < filters.getCount(); i++)
- if (!mir_strcmp(szProto, filters[i]->szName))
- return i + 1;
-
- return 0;
-}
-
-static INT_PTR Proto_AddToContact(WPARAM wParam, LPARAM lParam)
-{
- char *szProto = (char*)lParam;
- PROTOCOLDESCRIPTOR *pd = Proto_IsProtocolLoaded(szProto);
- if (pd == NULL) {
- PROTOACCOUNT *pa = Proto_GetAccount(szProto);
- if (pa) {
- db_set_s(wParam, "Protocol", "p", szProto);
- return 0;
- }
- return 1;
- }
-
- if (pd->type == PROTOTYPE_PROTOCOL || pd->type == PROTOTYPE_VIRTUAL)
- db_set_s(wParam, "Protocol", "p", szProto);
-
- return 0;
-}
-
-static INT_PTR Proto_RemoveFromContact(WPARAM wParam, LPARAM lParam)
-{
- switch (Proto_IsProtoOnContact(wParam, lParam)) {
- case 0:
- return 1;
- case -1:
- db_unset(wParam, "Protocol", "p");
- }
-
- return 0;
-}
-
-int LoadProtoChains(void)
-{
- if (!db_get_b(NULL, "Compatibility", "Filters", 0)) {
- CallService(MS_DB_MODULE_DELETE, 0, (LPARAM)"_Filters");
- db_set_b(NULL, "Compatibility", "Filters", 1);
- }
-
- CreateServiceFunction(MS_PROTO_CALLCONTACTSERVICE, Proto_CallContactService);
- CreateServiceFunction(MS_PROTO_CHAINSEND, Proto_CallContactService);
- CreateServiceFunction(MS_PROTO_CHAINRECV, Proto_RecvChain);
- CreateServiceFunction(MS_PROTO_GETCONTACTBASEPROTO, Proto_GetContactBaseProto);
- CreateServiceFunction(MS_PROTO_GETCONTACTBASEACCOUNT, Proto_GetContactBaseAccount);
- CreateServiceFunction(MS_PROTO_ISPROTOONCONTACT, Proto_IsProtoOnContact);
- CreateServiceFunction(MS_PROTO_ADDTOCONTACT, Proto_AddToContact);
- CreateServiceFunction(MS_PROTO_REMOVEFROMCONTACT, Proto_RemoveFromContact);
- return 0;
-}
diff --git a/src/modules/protocols/protocols.cpp b/src/modules/protocols/protocols.cpp deleted file mode 100644 index 273fb85dd9..0000000000 --- a/src/modules/protocols/protocols.cpp +++ /dev/null @@ -1,511 +0,0 @@ -/*
-
-Miranda NG: the free IM client for Microsoft* Windows*
-
-Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org),
-Copyright (c) 2000-12 Miranda IM project,
-all portions of this codebase are copyrighted to the people
-listed in contributors.txt.
-
-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; either version 2
-of the License, or (at your option) any later version.
-
-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, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include "..\..\core\commonheaders.h"
-
-int LoadProtoChains(void);
-int LoadProtoOptions(void);
-
-HANDLE hAccListChanged;
-static HANDLE hTypeEvent;
-static BOOL bModuleInitialized = FALSE;
-
-struct TServiceListItem
-{
- const char *name;
- int id;
-};
-
-static int __cdecl CompareServiceItems(const void *p1, const void *p2)
-{ return strcmp(((TServiceListItem*)p1)->name, ((TServiceListItem*)p2)->name);
-}
-
-static TServiceListItem serviceItems[] =
-{
- { PS_ADDTOLIST, 1 },
- { PS_ADDTOLISTBYEVENT, 2 },
- { PS_AUTHALLOW, 3 },
- { PS_AUTHDENY, 4 },
- { PSR_AUTH, 5 },
- { PSS_AUTHREQUEST, 6 },
- { PSS_FILEALLOW, 8 },
- { PSS_FILECANCEL, 9 },
- { PSS_FILEDENY, 10 },
- { PS_FILERESUME, 11 },
- { PS_GETCAPS, 12 },
- { PS_LOADICON, 13 },
- { PSS_GETINFO, 14 },
- { PS_BASICSEARCH, 15 },
- { PS_SEARCHBYEMAIL, 16 },
- { PS_SEARCHBYNAME, 17 },
- { PS_SEARCHBYADVANCED, 18 },
- { PS_CREATEADVSEARCHUI, 19 },
- { PSR_CONTACTS, 20 },
- { PSR_FILE, 21 },
- { PSR_MESSAGE, 22 },
- { PSR_URL, 23 },
- { PSS_CONTACTS, 24 },
- { PSS_FILE, 25 },
- { PSS_MESSAGE, 26 },
- { PSS_URL, 27 },
- { PSS_SETAPPARENTMODE, 28 },
- { PS_SETSTATUS, 29 },
- { PSS_GETAWAYMSG, 30 },
- { PSR_AWAYMSG, 31 },
- { PS_SETAWAYMSG, 33 },
- { PSS_USERISTYPING, 34 },
- { PS_GETNAME, 35 },
- { PS_GETSTATUS, 36 }
-};
-
-//------------------------------------------------------------------------------------
-
-static int CompareProtos(const PROTOCOLDESCRIPTOR *p1, const PROTOCOLDESCRIPTOR *p2)
-{
- if (p1->type != p2->type)
- return p1->type - p2->type;
-
- return mir_strcmp(p1->szName, p2->szName);
-}
-
-LIST<PROTOCOLDESCRIPTOR> filters(10, CompareProtos);
-
-//------------------------------------------------------------------------------------
-
-void FreeFilesMatrix(TCHAR ***files);
-
-INT_PTR srvProto_IsLoaded(WPARAM, LPARAM lParam)
-{
- return (INT_PTR)Proto_IsProtocolLoaded((char*)lParam);
-}
-
-static PROTO_INTERFACE* defInitProto(const char* szModule, const TCHAR*)
-{
- return AddDefaultAccount(szModule);
-}
-
-static INT_PTR srvProto_RegisterModule(WPARAM, LPARAM lParam)
-{
- PROTOCOLDESCRIPTOR *pd = (PROTOCOLDESCRIPTOR*)lParam;
- if (pd->cbSize != sizeof(PROTOCOLDESCRIPTOR) && pd->cbSize != PROTOCOLDESCRIPTOR_V3_SIZE)
- return 1;
-
- PROTOCOLDESCRIPTOR *p = Proto_RegisterModule(pd);
- if (p == NULL)
- return 2;
-
- if (p->fnInit == NULL && (p->type == PROTOTYPE_PROTOCOL || p->type == PROTOTYPE_VIRTUAL)) {
- // let's create a new container
- PROTO_INTERFACE* ppi = AddDefaultAccount(pd->szName);
- if (ppi) {
- ppi->m_iVersion = (pd->cbSize == PROTOCOLDESCRIPTOR_V3_SIZE) ? 1 : 2;
- PROTOACCOUNT *pa = Proto_GetAccount(pd->szName);
- if (pa == NULL) {
- pa = (PROTOACCOUNT*)mir_calloc(sizeof(PROTOACCOUNT));
- pa->cbSize = sizeof(PROTOACCOUNT);
- pa->szModuleName = mir_strdup(pd->szName);
- pa->szProtoName = mir_strdup(pd->szName);
- pa->tszAccountName = mir_a2t(pd->szName);
- pa->bIsVisible = pa->bIsEnabled = true;
- pa->iOrder = accounts.getCount();
- accounts.insert(pa);
- }
- pa->bOldProto = true;
- pa->bIsVirtual = (p->type == PROTOTYPE_VIRTUAL);
- pa->ppro = ppi;
- p->fnInit = defInitProto;
- p->fnUninit = FreeDefaultAccount;
- }
- }
-
- if (p->type != PROTOTYPE_PROTOCOL && p->type != PROTOTYPE_VIRTUAL)
- filters.insert(p);
- return 0;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// Basic core services
-
-static INT_PTR Proto_RecvMessage(WPARAM, LPARAM lParam)
-{
- CCSDATA *ccs = (CCSDATA*)lParam;
- PROTORECVEVENT *pre = (PROTORECVEVENT*)ccs->lParam;
- if (pre->szMessage == NULL)
- return NULL;
-
- ptrA pszTemp;
- mir_ptr<BYTE> pszBlob;
-
- DBEVENTINFO dbei = { 0 };
- dbei.cbSize = sizeof(dbei);
- dbei.flags = DBEF_UTF;
- dbei.szModule = GetContactProto(ccs->hContact);
- dbei.timestamp = pre->timestamp;
- dbei.eventType = EVENTTYPE_MESSAGE;
- dbei.cbBlob = (DWORD)mir_strlen(pre->szMessage) + 1;
- dbei.pBlob = (PBYTE)pre->szMessage;
-
- if (pre->cbCustomDataSize != 0) {
- pszBlob = (PBYTE)mir_alloc(dbei.cbBlob + pre->cbCustomDataSize);
- memcpy(pszBlob, dbei.pBlob, dbei.cbBlob);
- memcpy((PBYTE)pszBlob + dbei.cbBlob, pre->pCustomData, pre->cbCustomDataSize);
- dbei.pBlob = pszBlob;
- dbei.cbBlob += pre->cbCustomDataSize;
- }
-
- if (pre->flags & PREF_CREATEREAD)
- dbei.flags |= DBEF_READ;
- if (pre->flags & PREF_SENT)
- dbei.flags |= DBEF_SENT;
-
- return (INT_PTR)db_event_add(ccs->hContact, &dbei);
-}
-
-static INT_PTR Proto_AuthRecv(WPARAM wParam, LPARAM lParam)
-{
- PROTORECVEVENT* pre = (PROTORECVEVENT*)lParam;
-
- DBEVENTINFO dbei = { sizeof(dbei) };
- dbei.szModule = (char*)wParam;
- dbei.timestamp = pre->timestamp;
- dbei.flags = DBEF_UTF | pre->flags & (PREF_CREATEREAD ? DBEF_READ : 0);
- dbei.eventType = EVENTTYPE_AUTHREQUEST;
- dbei.cbBlob = pre->lParam;
- dbei.pBlob = (PBYTE)pre->szMessage;
- return (INT_PTR)db_event_add(NULL, &dbei);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// User Typing Notification services
-
-static int Proto_ValidTypingContact(MCONTACT hContact, char *szProto)
-{
- if (!hContact || !szProto)
- return 0;
-
- return (CallProtoServiceInt(NULL, szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_SUPPORTTYPING) ? 1 : 0;
-}
-
-static INT_PTR Proto_SelfIsTyping(WPARAM wParam, LPARAM lParam)
-{
- if (lParam == PROTOTYPE_SELFTYPING_OFF || lParam == PROTOTYPE_SELFTYPING_ON) {
- char *szProto = GetContactProto(wParam);
- if (!szProto)
- return 0;
-
- if (Proto_ValidTypingContact(wParam, szProto))
- CallProtoServiceInt(NULL, szProto, PSS_USERISTYPING, wParam, lParam);
- }
-
- return 0;
-}
-
-static INT_PTR Proto_ContactIsTyping(WPARAM wParam, LPARAM lParam)
-{
- int type = (int)lParam;
- char *szProto = GetContactProto(wParam);
- if (!szProto)
- return 0;
-
- if (CallService(MS_IGNORE_ISIGNORED, wParam, IGNOREEVENT_TYPINGNOTIFY))
- return 0;
-
- if (type < PROTOTYPE_CONTACTTYPING_OFF)
- return 0;
-
- if (Proto_ValidTypingContact(wParam, szProto))
- NotifyEventHooks(hTypeEvent, wParam, lParam);
-
- return 0;
-}
-
-void Proto_SetStatus(const char *szProto, unsigned status)
-{
- if (CallProtoServiceInt(NULL, szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND) {
- ptrT tszAwayMsg((TCHAR*)CallService(MS_AWAYMSG_GETSTATUSMSGT, status, (LPARAM)szProto));
- CallProtoServiceInt(NULL, szProto, PS_SETAWAYMSG, status, tszAwayMsg);
- }
- CallProtoServiceInt(NULL, szProto, PS_SETSTATUS, status, 0);
-}
-
-char** __fastcall Proto_FilesMatrixA(wchar_t **files)
-{
- if (files == NULL) return NULL;
-
- int count = 0;
- while (files[count++]);
-
- char** filesA = (char**)mir_alloc(count * sizeof(char*));
- for (int i = 0; i < count; i++)
- filesA[i] = mir_u2a(files[i]);
-
- return filesA;
-}
-
-static wchar_t** __fastcall Proto_FilesMatrixU(char **files)
-{
- if (files == NULL) return NULL;
-
- int count = 0;
- while (files[count++]);
-
- wchar_t** filesU = (wchar_t**)mir_alloc(count * sizeof(wchar_t*));
- for (int i = 0; i < count; i++)
- filesU[i] = mir_a2u(files[i]);
-
- return filesU;
-}
-
-HICON Proto_GetIcon(PROTO_INTERFACE *ppro, int iconIndex)
-{
- if (LOWORD(iconIndex) != PLI_PROTOCOL)
- return NULL;
-
- if (iconIndex & PLIF_ICOLIBHANDLE)
- return (HICON)ppro->m_hProtoIcon;
-
- bool big = (iconIndex & PLIF_SMALL) == 0;
- HICON hIcon = Skin_GetIconByHandle(ppro->m_hProtoIcon, big);
- if (iconIndex & PLIF_ICOLIB)
- return hIcon;
-
- HICON hIcon2 = CopyIcon(hIcon);
- Skin_ReleaseIcon(hIcon);
- return hIcon2;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// 0.8.0+ - accounts
-
-PROTOACCOUNT* __fastcall Proto_GetAccount(const char* accName)
-{
- if (accName == NULL)
- return NULL;
-
- int idx;
- PROTOACCOUNT temp;
- temp.szModuleName = (char*)accName;
- if ((idx = accounts.getIndex(&temp)) == -1)
- return NULL;
-
- return accounts[idx];
-}
-
-static INT_PTR srvProto_CreateAccount(WPARAM, LPARAM lParam)
-{
- ACC_CREATE *p = (ACC_CREATE*)lParam;
- if (p == NULL)
- return NULL;
-
- PROTOACCOUNT *pa = Proto_CreateAccount(p->pszInternal, p->pszBaseProto, p->ptszAccountName);
- if (pa) {
- WriteDbAccounts();
- NotifyEventHooks(hAccListChanged, PRAC_ADDED, (LPARAM)pa);
- }
- return (INT_PTR)pa;
-}
-
-static INT_PTR srvProto_GetAccount(WPARAM, LPARAM lParam)
-{
- return (INT_PTR)Proto_GetAccount((char*)lParam);
-}
-
-static INT_PTR Proto_EnumAccounts(WPARAM wParam, LPARAM lParam)
-{
- *(int*)wParam = accounts.getCount();
- *(PROTOACCOUNT***)lParam = accounts.getArray();
- return 0;
-}
-
-bool __fastcall Proto_IsAccountEnabled(PROTOACCOUNT *pa)
-{
- return pa && ((pa->bIsEnabled && !pa->bDynDisabled) || pa->bOldProto);
-}
-
-static INT_PTR srvProto_IsAccountEnabled(WPARAM, LPARAM lParam)
-{
- return (INT_PTR)Proto_IsAccountEnabled((PROTOACCOUNT*)lParam);
-}
-
-bool __fastcall Proto_IsAccountLocked(PROTOACCOUNT *pa)
-{
- return pa && db_get_b(NULL, pa->szModuleName, "LockMainStatus", 0) != 0;
-}
-
-static INT_PTR srvProto_IsAccountLocked(WPARAM, LPARAM lParam)
-{
- return (INT_PTR)Proto_IsAccountLocked(Proto_GetAccount((char*)lParam));
-}
-
-static INT_PTR Proto_BroadcastAck(WPARAM, LPARAM lParam)
-{
- ACKDATA *ack = (ACKDATA*)lParam;
- return ProtoBroadcastAck(ack->szModule, ack->hContact, ack->type, ack->result, ack->hProcess, ack->lParam);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-int ProtoServiceExists(const char *szModule, const char *szService)
-{
- if (szModule == NULL || szService == NULL)
- return false;
-
- TServiceListItem *item = (TServiceListItem*)bsearch(&szService, serviceItems, _countof(serviceItems), sizeof(serviceItems[0]), CompareServiceItems);
- if (item != NULL)
- return true;
-
- char str[MAXMODULELABELLENGTH * 2];
- strncpy_s(str, szModule, _TRUNCATE);
- strncat_s(str, szService, _TRUNCATE);
- return ServiceExists(str);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-INT_PTR CallProtoService(const char* szModule, const char* szService, WPARAM wParam, LPARAM lParam)
-{
- return CallProtoServiceInt(NULL, szModule, szService, wParam, lParam);
-}
-
-INT_PTR CallProtoServiceInt(MCONTACT hContact, const char *szModule, const char *szService, WPARAM wParam, LPARAM lParam)
-{
- PROTOACCOUNT *pa = Proto_GetAccount(szModule);
- if (pa && !pa->bOldProto) {
- PROTO_INTERFACE *ppi = pa->ppro;
- if (ppi != NULL && ppi->m_iVersion > 1) {
- TServiceListItem *item = (TServiceListItem*)bsearch(&szService, serviceItems, _countof(serviceItems), sizeof(serviceItems[0]), CompareServiceItems);
- if (item) {
- switch (item->id) {
- case 1: return (INT_PTR)ppi->AddToList(wParam, (PROTOSEARCHRESULT*)lParam);
- case 2: return (INT_PTR)ppi->AddToListByEvent(LOWORD(wParam), HIWORD(wParam), (MEVENT)lParam);
- case 3: return (INT_PTR)ppi->Authorize((MEVENT)wParam);
- case 4: return (INT_PTR)ppi->AuthDeny((MEVENT)wParam, (TCHAR*)lParam);
- case 5: return (INT_PTR)ppi->AuthRecv(hContact, (PROTORECVEVENT*)lParam);
- case 6: return (INT_PTR)ppi->AuthRequest(hContact, (TCHAR*)lParam);
- case 8: return (INT_PTR)ppi->FileAllow(hContact, (HANDLE)wParam, (TCHAR*)lParam);
- case 9: return (INT_PTR)ppi->FileCancel(hContact, (HANDLE)wParam);
- case 10: return (INT_PTR)ppi->FileDeny(hContact, (HANDLE)wParam, (TCHAR*)lParam);
- case 11: {
- PROTOFILERESUME *pfr = (PROTOFILERESUME*)lParam;
- return (INT_PTR)ppi->FileResume((HANDLE)wParam, &pfr->action, (const TCHAR**)&pfr->szFilename);
- }
-
- case 12: return (INT_PTR)ppi->GetCaps(wParam, lParam);
- case 13: return (INT_PTR)Proto_GetIcon(ppi, wParam);
- case 14: return (INT_PTR)ppi->GetInfo(hContact, wParam);
- case 15: return (INT_PTR)ppi->SearchBasic((TCHAR*)lParam);
- case 16: return (INT_PTR)ppi->SearchByEmail((TCHAR*)lParam);
- case 17: {
- PROTOSEARCHBYNAME* psbn = (PROTOSEARCHBYNAME*)lParam;
- return (INT_PTR)ppi->SearchByName(psbn->pszNick, psbn->pszFirstName, psbn->pszLastName);
- }
- case 18: return (INT_PTR)ppi->SearchAdvanced((HWND)lParam);
- case 19: return (INT_PTR)ppi->CreateExtendedSearchUI((HWND)lParam);
- case 20: return (INT_PTR)ppi->RecvContacts(hContact, (PROTORECVEVENT*)lParam);
- case 21: return (INT_PTR)ppi->RecvFile(hContact, (PROTORECVFILET*)lParam);
- case 22: return (INT_PTR)ppi->RecvMsg(hContact, (PROTORECVEVENT*)lParam);
- case 23: return (INT_PTR)ppi->RecvUrl(hContact, (PROTORECVEVENT*)lParam);
- case 24: return (INT_PTR)ppi->SendContacts(hContact, LOWORD(wParam), HIWORD(wParam), (MCONTACT*)lParam);
- case 25: return (INT_PTR)ppi->SendFile(hContact, (TCHAR*)wParam, (TCHAR**)lParam);
- case 26: return (INT_PTR)ppi->SendMsg(hContact, wParam, (const char*)lParam);
- case 27: return (INT_PTR)ppi->SendUrl(hContact, wParam, (const char*)lParam);
- case 28: return (INT_PTR)ppi->SetApparentMode(hContact, wParam);
- case 29: return (INT_PTR)ppi->SetStatus(wParam);
- case 30: return (INT_PTR)ppi->GetAwayMsg(hContact);
- case 31: return (INT_PTR)ppi->RecvAwayMsg(hContact, wParam, (PROTORECVEVENT*)lParam);
- case 33: return (INT_PTR)ppi->SetAwayMsg(wParam, (TCHAR*)lParam);
- case 34: return (INT_PTR)ppi->UserIsTyping(wParam, lParam);
- case 35: mir_strncpy((char*)lParam, ppi->m_szModuleName, wParam); return 0;
- case 36:
- return ppi->m_iStatus;
- }
- }
- }
- }
-
- return ProtoCallService(szModule, szService, wParam, lParam);
-}
-
-INT_PTR ProtoCallService(const char *szModule, const char *szService, WPARAM wParam, LPARAM lParam)
-{
- if (szModule == NULL || szService == NULL)
- return false;
-
- char str[MAXMODULELABELLENGTH * 2];
- strncpy_s(str, szModule, _TRUNCATE);
- strncat_s(str, szService, _TRUNCATE);
- return CallService(str, wParam, lParam);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-int LoadProtocolsModule(void)
-{
- bModuleInitialized = TRUE;
-
- if (LoadProtoChains())
- return 1;
-
- qsort(serviceItems, _countof(serviceItems), sizeof(serviceItems[0]), CompareServiceItems);
-
- hTypeEvent = CreateHookableEvent(ME_PROTO_CONTACTISTYPING);
- hAccListChanged = CreateHookableEvent(ME_PROTO_ACCLISTCHANGED);
-
- CreateServiceFunction(MS_PROTO_BROADCASTACK, Proto_BroadcastAck);
- CreateServiceFunction(MS_PROTO_ISPROTOCOLLOADED, srvProto_IsLoaded);
- CreateServiceFunction(MS_PROTO_REGISTERMODULE, srvProto_RegisterModule);
- CreateServiceFunction(MS_PROTO_SELFISTYPING, Proto_SelfIsTyping);
- CreateServiceFunction(MS_PROTO_CONTACTISTYPING, Proto_ContactIsTyping);
-
- CreateServiceFunction(MS_PROTO_RECVMSG, Proto_RecvMessage);
- CreateServiceFunction(MS_PROTO_AUTHRECV, Proto_AuthRecv);
-
- CreateServiceFunction("Proto/EnumProtocols", Proto_EnumAccounts);
- CreateServiceFunction(MS_PROTO_ENUMACCOUNTS, Proto_EnumAccounts);
- CreateServiceFunction(MS_PROTO_CREATEACCOUNT, srvProto_CreateAccount);
- CreateServiceFunction(MS_PROTO_GETACCOUNT, srvProto_GetAccount);
-
- CreateServiceFunction(MS_PROTO_ISACCOUNTENABLED, srvProto_IsAccountEnabled);
- CreateServiceFunction(MS_PROTO_ISACCOUNTLOCKED, srvProto_IsAccountLocked);
-
- return LoadProtoOptions();
-}
-
-void UnloadProtocolsModule()
-{
- if (!bModuleInitialized) return;
-
- if (hAccListChanged) {
- DestroyHookableEvent(hAccListChanged);
- hAccListChanged = NULL;
- }
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-pfnUninitProto GetProtocolDestructor(char *szProto)
-{
- PROTOCOLDESCRIPTOR *p = Proto_IsProtocolLoaded(szProto);
- return (p == NULL) ? NULL : p->fnUninit;
-}
diff --git a/src/modules/protocols/protodir.cpp b/src/modules/protocols/protodir.cpp deleted file mode 100644 index 672fb7f007..0000000000 --- a/src/modules/protocols/protodir.cpp +++ /dev/null @@ -1,243 +0,0 @@ -/*
-
-Miranda NG: the free IM client for Microsoft* Windows*
-
-Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org),
-Copyright (c) 2000-12 Miranda IM project,
-all portions of this codebase are copyrighted to the people
-listed in contributors.txt.
-
-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; either version 2
-of the License, or (at your option) any later version.
-
-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, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include "..\..\core\commonheaders.h"
-
-#if 0
-
-extern HANDLE hCacheHeap;
-
-/*
-
- the id cache has id/proto against hContact to lookup ID's fast to resolve to hContact,
- the protoBaseCache has hContact's sorted, so can lookup hContact->proto fast, these two caches
- share the same data, they're indexes, each entry might not have an "id" set.
-
- There is a small cache which maintains a protocol list
-
-*/
-
-/*
-
- The information we need to cache is not readily available, data has to be gathered at startup
- when a new contact is created/deleted, when a new proto registers and so on.
-
- The information we get at startup includes walking the contact chain and reading Protocol/p which
- will give us the protocol the contact is on, all this info is stored in contactEntry's within
- protoCache ONLY - contactCache is EMPTY at this point.
-
- We can not fetch the id of the contact because this information is only in SOME protocol plugins,
- this is a problem but we'll hook all proto registrations and ask each proto if it supports the
- returning this ID name, if not - it won't even use our id <-> contact look so no biggie!
-
-*/
-
-typedef struct {
- char * proto; // within proto cache
- char * id; // optional
- HANDLE hContact;
-} contactEntry;
-
-typedef struct {
- mir_cs csLock;
- SortedList contactCache; // index for id/proto -> hContact
- SortedList protoCache; // index for hContact -> proto/id
- SortedList protoNameCache; // index of protocol names
-} contactDir;
-
-static contactDir condir;
-
-// compare's id/proto and return's hContact's
-int contactCacheCompare(void * a, void * b)
-{
- contactEntry * x = (contactEntry *) a;
- contactEntry * y = (contactEntry *) b;
- int rc=0;
- // same protocol?
- rc = mir_strcmp(x->proto, y->proto);
- if ( rc == 0 ) {
- // same id? id's might be missing
- if ( x->id && y->id ) rc = mir_strcmp(x->id, y->id);
- }
- return rc;
-}
-
-// compares hContact's and returns associated data
-int protoCacheCompare(void * a, void * b)
-{
- contactEntry * x = (contactEntry *) a;
- contactEntry * y = (contactEntry *) b;
- if ( x->hContact < y->hContact ) return -1;
- if ( x->hContact > y->hContact ) return 1;
- return 0;
-}
-
-// keeps a list of protocol names
-int protoNameCacheCompare(void * a, void * b)
-{
- return mir_strcmp( (char *)a, (char*)b );
-}
-
-// cache the protocol string so that its not allocated per contact but shared
-char * contactDir_Proto_Add(contactDir * cd, char * proto)
-{
- int index = 0 ;
- char * szCache = 0;
- mir_cslock lck(cd->csLock);
- if ( List_GetIndex(&cd->protoNameCache, proto, &index) ) szCache = cd->protoNameCache.items[index];
- else {
- szCache = HeapAlloc(hCacheHeap, HEAP_NO_SERIALIZE, mir_strlen(proto)+1);
- mir_strcpy(szCache, proto);
- List_Insert(&cd->protoNameCache, szCache, index);
- }
- return szCache;
-}
-
-// thread safe
-char * contactDir_Proto_Get(contactDir * cd, HANDLE hContact)
-{
- char * szCache = 0;
- int index = 0;
- contactEntry e;
- e.hContact=hContact;
- e.proto="";
- e.id="";
- mir_cslock lck(cd->csLock);
- if ( List_GetIndex(&cd->protoCache, &e, &index) ) {
- contactEntry * p = cd->protoCache.items[index];
- szCache = p->proto;
- }
- return szCache;
-}
-
-// thread tolerant, if updating id dont pass proto, if updating proto dont pass id
-void contactDir_Contact_Add(contactDir * cd, HANDLE hContact, char * proto, char * id)
-{
- // if a contact is gonna exist anywhere it's going to be in the ->protoCache which has a key of hContact
- // if id is not null then the contact should be indexed via the ->contactCache instead
- if ( id == NULL ) {
- int index = 0;
- contactEntry e;
- e.hContact=hContact;
- e.proto = proto;
- e.id = "";
- mir_cslock lck(cd->csLock);
- if ( List_GetIndex(&cd->protoCache, &e, &index) ) {
- contactEntry * p = cd->protoCache.items[index];
- // this hContact is in the cache, protcol changing?
- p->proto = contactDir_Proto_Add(cd, proto); // just replace the old pointer
- } else {
- contactEntry * p = 0;
- // this hContact isn't in the cache, add it
- p = HeapAlloc(hCacheHeap, HEAP_NO_SERIALIZE, sizeof(contactEntry));
- p->proto = contactDir_Proto_Add(cd, proto);
- p->id = 0;
- p->hContact = hContact;
- // add it
- List_Insert(&cd->protoCache, p, index);
- }
- } else {
- // this contact HAS to be in ->protoCache since it was added during startup
- // need to find the contactEntry* that should already exist for it
- } //if
-}
-
-// only expected to be called at startup.
-void contactDir_Proto_Walk(contactDir * cd)
-{
- HANDLE hContact;
- char buf[128];
- DBCONTACTGETSETTING gsProto;
- DBVARIANT dbvProto;
- // setup the read structure
- gsProto.szModule="Protocol";
- gsProto.szSetting="p";
- gsProto.pValue = &dbvProto;
- // this might not work
- hContact = (HANDLE) CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
- while ( hContact ) {
- // and how we'll get the reset
- dbvProto.type=DBVT_ASCIIZ;
- dbvProto.pszVal = (char *) &buf;
- dbvProto.cchVal = SIZEOF(buf);
- // figure out what hContact/Protocol/p is
- if ( CallService(MS_DB_CONTACT_GETSETTINGSTATIC,(WPARAM)hContact, (LPARAM)&gsProto) == 0 ) {
- contactDir_Contact_Add(cd, hContact, buf, NULL);
- }
- // find next
- hContact = (HANDLE) CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0);
- }
-}
-
-// ctor/dtor
-
-void contactDir_Init(contactDir * cd)
-{
- cd->contactCache.increment=50;
- cd->contactCache.sortFunc=contactCacheCompare;
- cd->protoCache.increment=50;
- cd->protoCache.sortFunc=protoCacheCompare;
- cd->protoNameCache.increment=5;
- cd->protoNameCache.sortFunc=protoNameCacheCompare;
- // build a list of all hContact's and what proto's they are on
- contactDir_Proto_Walk(cd);
-}
-
-void contactDir_Deinit(contactDir * cd)
-{
- List_Destroy(&cd->contactCache);
- List_Destroy(&cd->protoCache);
- List_Destroy(&cd->protoNameCache);
-}
-
-static int contactDirGetProto(WPARAM wParam, LPARAM lParam)
-{
- return (int) contactDir_Proto_Get(&condir,(HANDLE)wParam);
-}
-
-#endif
-
-void InitContactDir(void)
-{
- return;
- //contactDir_Init(&condir);
- //CreateServiceFunction(MS_PROTODIR_PROTOFROMCONTACT, contactDirGetProto);
-}
-
-void UninitContactDir(void)
-{
- return;
-#if 0
- {
- int j;
- for ( j = 0; j< condir.protoCache.realCount; j++) {
- char buf[128];
- contactEntry * p = condir.protoCache.items[j];
- mir_snprintf(buf,SIZEOF(buf)," [%s] %s @ %x \n", p->proto, p->id ? p->id : "", p->hContact);
- OutputDebugString(buf);
- }
- }
- contactDir_Deinit(&condir);
-#endif
-}
diff --git a/src/modules/protocols/protoint.cpp b/src/modules/protocols/protoint.cpp deleted file mode 100644 index 2fadfa4e89..0000000000 --- a/src/modules/protocols/protoint.cpp +++ /dev/null @@ -1,304 +0,0 @@ -/*
-
-Miranda NG: the free IM client for Microsoft* Windows*
-
-Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org),
-Copyright (c) 2000-12 Miranda IM project,
-all portions of this codebase are copyrighted to the people
-listed in contributors.txt.
-
-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; either version 2
-of the License, or (at your option) any later version.
-
-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, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include "..\..\core\commonheaders.h"
-
-char** __fastcall Proto_FilesMatrixA(TCHAR **files);
-
-void FreeFilesMatrix(TCHAR ***files)
-{
- if (*files == NULL)
- return;
-
- // Free each filename in the pointer array
- TCHAR **pFile = *files;
- while (*pFile != NULL) {
- mir_free(*pFile);
- *pFile = NULL;
- pFile++;
- }
-
- // Free the array itself
- mir_free(*files);
- *files = NULL;
-}
-
-struct DEFAULT_PROTO_INTERFACE : public PROTO_INTERFACE
-{
- MCONTACT __cdecl AddToList(int flags, PROTOSEARCHRESULT *psr)
- {
- return (MCONTACT)ProtoCallService(m_szModuleName, PS_ADDTOLIST, flags, (LPARAM)psr);
- }
-
- MCONTACT __cdecl AddToListByEvent(int flags, int iContact, MEVENT hDbEvent)
- {
- return (MCONTACT)ProtoCallService(m_szModuleName, PS_ADDTOLISTBYEVENT, MAKELONG(flags, iContact), hDbEvent);
- }
-
- int __cdecl Authorize(MEVENT hDbEvent)
- {
- return (int)ProtoCallService(m_szModuleName, PS_AUTHALLOW, (WPARAM)hDbEvent, 0);
- }
-
- int __cdecl AuthDeny(MEVENT hDbEvent, const TCHAR *szReason)
- {
- if (m_iVersion > 1)
- return (int)ProtoCallService(m_szModuleName, PS_AUTHDENY, hDbEvent, (LPARAM)szReason);
-
- return (int)ProtoCallService(m_szModuleName, PS_AUTHDENY, hDbEvent, _T2A(szReason));
- }
-
- int __cdecl AuthRecv(MCONTACT hContact, PROTORECVEVENT *evt)
- {
- CCSDATA ccs = { hContact, PSR_AUTH, 0, (LPARAM)evt };
- return (int)ProtoCallService(m_szModuleName, PSR_AUTH, 0, (LPARAM)&ccs);
- }
-
- int __cdecl AuthRequest(MCONTACT hContact, const TCHAR *szMessage)
- {
- CCSDATA ccs = { hContact, PSS_AUTHREQUEST, 0, (LPARAM)szMessage };
- if (m_iVersion > 1)
- return (int)ProtoCallService(m_szModuleName, PSS_AUTHREQUEST, 0, (LPARAM)&ccs);
-
- ccs.lParam = (LPARAM)mir_t2a(szMessage);
- int res = (int)ProtoCallService(m_szModuleName, PSS_AUTHREQUEST, 0, (LPARAM)&ccs);
- mir_free((char*)ccs.lParam);
- return res;
- }
-
- HANDLE __cdecl FileAllow(MCONTACT hContact, HANDLE hTransfer, const TCHAR* szPath)
- {
- CCSDATA ccs = { hContact, PSS_FILEALLOW, (WPARAM)hTransfer, (LPARAM)szPath };
- if (m_iVersion > 1)
- return (HANDLE)ProtoCallService(m_szModuleName, PSS_FILEALLOW, 0, (LPARAM)&ccs);
-
- ccs.lParam = (LPARAM)mir_t2a(szPath);
- HANDLE res = (HANDLE)ProtoCallService(m_szModuleName, PSS_FILEALLOW, 0, (LPARAM)&ccs);
- mir_free((char*)ccs.lParam);
- return res;
- }
-
- int __cdecl FileCancel(MCONTACT hContact, HANDLE hTransfer)
- {
- CCSDATA ccs = { hContact, PSS_FILECANCEL, (WPARAM)hTransfer, 0 };
- return (int)ProtoCallService(m_szModuleName, PSS_FILECANCEL, 0, (LPARAM)&ccs);
- }
-
- int __cdecl FileDeny(MCONTACT hContact, HANDLE hTransfer, const TCHAR* szReason)
- {
- CCSDATA ccs = { hContact, PSS_FILEDENY, (WPARAM)hTransfer, (LPARAM)szReason };
- if (m_iVersion > 1)
- return (int)ProtoCallService(m_szModuleName, PSS_FILEDENY, 0, (LPARAM)&ccs);
-
- ccs.lParam = (LPARAM)mir_t2a(szReason);
- int res = (int)ProtoCallService(m_szModuleName, PSS_FILEDENY, 0, (LPARAM)&ccs);
- mir_free((char*)ccs.lParam);
- return res;
- }
-
- int __cdecl FileResume(HANDLE hTransfer, int* action, const TCHAR** szFilename)
- {
- PROTOFILERESUME pfr = { *action, *szFilename };
- if (m_iVersion > 1)
- return (int)ProtoCallService(m_szModuleName, PS_FILERESUME, (WPARAM)hTransfer, (LPARAM)&pfr);
-
- pfr.szFilename = (TCHAR*)mir_t2a(pfr.szFilename);
- int res = (int)ProtoCallService(m_szModuleName, PS_FILERESUME, (WPARAM)hTransfer, (LPARAM)&pfr);
- mir_free((TCHAR*)*szFilename);
- *action = pfr.action; *szFilename = (TCHAR*)pfr.szFilename;
-
- return res;
- }
-
- DWORD_PTR __cdecl GetCaps(int type, MCONTACT hContact)
- {
- return (DWORD_PTR)ProtoCallService(m_szModuleName, PS_GETCAPS, type, hContact);
- }
-
- HICON __cdecl GetIcon(int iconIndex)
- {
- return (HICON)ProtoCallService(m_szModuleName, PS_LOADICON, iconIndex, 0);
- }
-
- int __cdecl GetInfo(MCONTACT hContact, int flags)
- {
- CCSDATA ccs = { hContact, PSS_GETINFO, flags, 0 };
- return ProtoCallService(m_szModuleName, PSS_GETINFO, 0, (LPARAM)&ccs);
- }
-
- HANDLE __cdecl SearchBasic(const TCHAR* id)
- {
- if (m_iVersion > 1)
- return (HANDLE)ProtoCallService(m_szModuleName, PS_BASICSEARCH, 0, (LPARAM)id);
-
- return (HANDLE)ProtoCallService(m_szModuleName, PS_BASICSEARCH, 0, _T2A(id));
- }
-
- HANDLE __cdecl SearchByEmail(const TCHAR* email)
- {
- if (m_iVersion > 1)
- return (HANDLE)ProtoCallService(m_szModuleName, PS_SEARCHBYEMAIL, 0, (LPARAM)email);
- return (HANDLE)ProtoCallService(m_szModuleName, PS_SEARCHBYEMAIL, 0, _T2A(email));
- }
-
- HANDLE __cdecl SearchByName(const TCHAR* nick, const TCHAR* firstName, const TCHAR* lastName)
- {
- PROTOSEARCHBYNAME psn;
- psn.pszNick = (TCHAR*)mir_t2a(nick);
- psn.pszFirstName = (TCHAR*)mir_t2a(firstName);
- psn.pszLastName = (TCHAR*)mir_t2a(lastName);
- HANDLE res = (HANDLE)ProtoCallService(m_szModuleName, PS_SEARCHBYNAME, 0, (LPARAM)&psn);
- mir_free(psn.pszNick);
- mir_free(psn.pszFirstName);
- mir_free(psn.pszLastName);
- return res;
-
- }
-
- HWND __cdecl SearchAdvanced(HWND owner)
- {
- return (HWND)ProtoCallService(m_szModuleName, PS_SEARCHBYADVANCED, 0, (LPARAM)owner);
- }
-
- HWND __cdecl CreateExtendedSearchUI(HWND owner)
- {
- return (HWND)ProtoCallService(m_szModuleName, PS_CREATEADVSEARCHUI, 0, (LPARAM)owner);
- }
-
- int __cdecl RecvContacts(MCONTACT hContact, PROTORECVEVENT* evt)
- {
- CCSDATA ccs = { hContact, PSR_CONTACTS, 0, (LPARAM)evt };
- return (int)ProtoCallService(m_szModuleName, PSR_CONTACTS, 0, (LPARAM)&ccs);
- }
-
- int __cdecl RecvFile(MCONTACT hContact, PROTORECVFILET* evt)
- {
- CCSDATA ccs = { hContact, PSR_FILE, 0, (LPARAM)evt };
- return ProtoCallService(m_szModuleName, PSR_FILE, 0, (LPARAM)&ccs);
- }
-
- int __cdecl RecvMsg(MCONTACT hContact, PROTORECVEVENT* evt)
- {
- CCSDATA ccs = { hContact, PSR_MESSAGE, 0, (LPARAM)evt };
- return (int)ProtoCallService(m_szModuleName, PSR_MESSAGE, 0, (LPARAM)&ccs);
- }
-
- int __cdecl RecvUrl(MCONTACT hContact, PROTORECVEVENT* evt)
- {
- CCSDATA ccs = { hContact, PSR_URL, 0, (LPARAM)evt };
- return (int)ProtoCallService(m_szModuleName, PSR_URL, 0, (LPARAM)&ccs);
- }
-
- int __cdecl SendContacts(MCONTACT hContact, int flags, int nContacts, MCONTACT *hContactsList)
- {
- CCSDATA ccs = { hContact, PSS_CONTACTS, MAKEWPARAM(flags, nContacts), (LPARAM)hContactsList };
- return (int)ProtoCallService(m_szModuleName, PSS_CONTACTS, 0, (LPARAM)&ccs);
- }
-
- HANDLE __cdecl SendFile(MCONTACT hContact, const TCHAR* szDescription, TCHAR** ppszFiles)
- {
- CCSDATA ccs = { hContact, PSS_FILE, (WPARAM)szDescription, (LPARAM)ppszFiles };
-
- if (m_iVersion > 1)
- return (HANDLE)ProtoCallService(m_szModuleName, PSS_FILE, 0, (LPARAM)&ccs);
-
- ccs.wParam = (WPARAM)mir_t2a(szDescription);
- ccs.lParam = (LPARAM)Proto_FilesMatrixA(ppszFiles);
- HANDLE res = (HANDLE)ProtoCallService(m_szModuleName, PSS_FILE, 0, (LPARAM)&ccs);
- if (res == 0) FreeFilesMatrix((TCHAR***)&ccs.lParam);
- mir_free((char*)ccs.wParam);
- return res;
- }
-
- int __cdecl SendMsg(MCONTACT hContact, const char* msg)
- {
- CCSDATA ccs = { hContact, PSS_MESSAGE, 0, (LPARAM)msg };
- return (int)ProtoCallService(m_szModuleName, PSS_MESSAGE, 0, (LPARAM)&ccs);
- }
-
- int __cdecl SendUrl(MCONTACT hContact, int flags, const char* url)
- {
- CCSDATA ccs = { hContact, PSS_URL, flags, (LPARAM)url };
- return (int)ProtoCallService(m_szModuleName, PSS_URL, 0, (LPARAM)&ccs);
- }
-
- int __cdecl SetApparentMode(MCONTACT hContact, int mode)
- {
- CCSDATA ccs = { hContact, PSS_SETAPPARENTMODE, mode, 0 };
- return (int)ProtoCallService(m_szModuleName, PSS_SETAPPARENTMODE, 0, (LPARAM)&ccs);
- }
-
- int __cdecl SetStatus(int iNewStatus)
- {
- return (int)ProtoCallService(m_szModuleName, PS_SETSTATUS, iNewStatus, 0);
- }
-
- HANDLE __cdecl GetAwayMsg(MCONTACT hContact)
- {
- CCSDATA ccs = { hContact, PSS_GETAWAYMSG, 0, 0 };
- return (HANDLE)ProtoCallService(m_szModuleName, PSS_GETAWAYMSG, 0, (LPARAM)&ccs);
- }
-
- int __cdecl RecvAwayMsg(MCONTACT hContact, int statusMode, PROTORECVEVENT* evt)
- {
- CCSDATA ccs = { hContact, PSR_AWAYMSG, statusMode, (LPARAM)evt };
- return (int)ProtoCallService(m_szModuleName, PSR_AWAYMSG, 0, (LPARAM)&ccs);
- }
-
- int __cdecl SetAwayMsg(int iStatus, const TCHAR *msg)
- {
- if (m_iVersion > 1)
- return (int)ProtoCallService(m_szModuleName, PS_SETAWAYMSG, iStatus, (LPARAM)msg);
- return (int)ProtoCallService(m_szModuleName, PS_SETAWAYMSG, iStatus, _T2A(msg));
- }
-
- int __cdecl UserIsTyping(MCONTACT hContact, int type)
- {
- CCSDATA ccs = { hContact, PSS_USERISTYPING, hContact, type };
- return ProtoCallService(m_szModuleName, PSS_USERISTYPING, 0, (LPARAM)&ccs);
- }
-
- int __cdecl OnEvent(PROTOEVENTTYPE, WPARAM, LPARAM)
- {
- return 1;
- }
-};
-
-// creates the default protocol container for compatibility with the old plugins
-
-PROTO_INTERFACE* AddDefaultAccount(const char *szProtoName)
-{
- PROTO_INTERFACE* ppi = new DEFAULT_PROTO_INTERFACE;
- ppi->m_szModuleName = mir_strdup(szProtoName);
- ppi->m_tszUserName = mir_a2t(szProtoName);
- return ppi;
-}
-
-int FreeDefaultAccount(PROTO_INTERFACE* ppi)
-{
- mir_free(ppi->m_szModuleName);
- mir_free(ppi->m_tszUserName);
- delete ppi;
- return 0;
-}
diff --git a/src/modules/protocols/protoopts.cpp b/src/modules/protocols/protoopts.cpp deleted file mode 100644 index 35b59d11bb..0000000000 --- a/src/modules/protocols/protoopts.cpp +++ /dev/null @@ -1,1062 +0,0 @@ -/*
-
-Miranda NG: the free IM client for Microsoft* Windows*
-
-Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org),
-Copyright (c) 2000-12 Miranda IM project,
-all portions of this codebase are copyrighted to the people
-listed in contributors.txt.
-
-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; either version 2
-of the License, or (at your option) any later version.
-
-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, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include "..\..\core\commonheaders.h"
-
-#define LBN_MY_CHECK 0x1000
-#define LBN_MY_RENAME 0x1001
-
-#define WM_MY_REFRESH (WM_USER+0x1000)
-#define WM_MY_RENAME (WM_USER+0x1001)
-
-bool CheckProtocolOrder(void);
-
-#define errMsg \
-TranslateT("WARNING! The account is going to be deleted. It means that all its \
-settings, contacts and histories will be also erased.\n\n\
-Are you absolutely sure?")
-
-#define upgradeMsg \
-TranslateT("Your account was successfully upgraded. \
-To activate it, restart of Miranda is needed.\n\n\
-If you want to restart Miranda now, press Yes, if you want to upgrade another account, press No")
-// is upgradeMsg in use in any place?
-#define legacyMsg \
-TranslateT("This account uses legacy protocol plugin. \
-Use Miranda NG options dialogs to change its preferences.")
-
-#define welcomeMsg \
-TranslateT("Welcome to Miranda NG's account manager!\n\
-Here you can set up your IM accounts.\n\n\
-Select an account from the list on the left to see the available options. \
-Alternatively, just click on the Plus sign underneath the list to set up a new IM account.")
-
-static HWND hAccMgr = NULL;
-
-extern HANDLE hAccListChanged;
-
-int UnloadPlugin(TCHAR* buf, int bufLen);
-
-PROTOACCOUNT* Proto_CreateAccount(const char *szModuleName, const char *szBaseProto, const TCHAR *tszAccountName)
-{
- PROTOACCOUNT *pa = (PROTOACCOUNT*)mir_calloc(sizeof(PROTOACCOUNT));
- if (pa == NULL)
- return NULL;
-
- pa->cbSize = sizeof(PROTOACCOUNT);
- pa->bIsEnabled = pa->bIsVisible = true;
- pa->iOrder = accounts.getCount();
- pa->szProtoName = mir_strdup(szBaseProto);
-
- // if the internal name is empty, generate new one
- if (mir_strlen(szModuleName) == 0) {
- char buf[100];
- int count = 1;
- while (true) {
- mir_snprintf(buf, "%s_%d", szBaseProto, count++);
- if (ptrA(db_get_sa(NULL, buf, "AM_BaseProto")) == NULL)
- break;
- }
- pa->szModuleName = mir_strdup(buf);
- }
- else pa->szModuleName = mir_strdup(szModuleName);
-
- pa->tszAccountName = mir_tstrdup(tszAccountName);
-
- db_set_s(NULL, pa->szModuleName, "AM_BaseProto", szBaseProto);
- accounts.insert(pa);
-
- if (ActivateAccount(pa)) {
- pa->ppro->OnEvent(EV_PROTO_ONLOAD, 0, 0);
- if (!db_get_b(NULL, "CList", "MoveProtoMenus", true))
- pa->ppro->OnEvent(EV_PROTO_ONMENU, 0, 0);
- }
-
- return pa;
-}
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Account edit form
-// Gets PROTOACCOUNT* as a parameter, or NULL to edit a new one
-
-struct AccFormDlgParam
-{
- int action;
- PROTOACCOUNT *pa;
-};
-
-static bool FindAccountByName(const char *szModuleName)
-{
- if (!mir_strlen(szModuleName))
- return false;
-
- for (int i = 0; i < accounts.getCount(); i++)
- if (_stricmp(szModuleName, accounts[i]->szModuleName) == 0)
- return true;
-
- return false;
-}
-
-static bool OnCreateAccount(HWND hwndDlg)
-{
- AccFormDlgParam* param = (AccFormDlgParam*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
- PROTOACCOUNT *pa = param->pa;
-
- TCHAR tszAccName[256];
- GetDlgItemText(hwndDlg, IDC_ACCNAME, tszAccName, SIZEOF(tszAccName));
- rtrimt(tszAccName);
- if (tszAccName[0] == 0) {
- MessageBox(hwndDlg, TranslateT("Account name must be filled."), TranslateT("Account error"), MB_ICONERROR | MB_OK);
- return false;
- }
-
- if (param->action == PRAC_ADDED) {
- char buf[200];
- GetDlgItemTextA(hwndDlg, IDC_ACCINTERNALNAME, buf, SIZEOF(buf));
- if (FindAccountByName(rtrim(buf))) {
- MessageBox(hwndDlg, TranslateT("Account name has to be unique. Please enter unique name."), TranslateT("Account error"), MB_ICONERROR | MB_OK);
- return false;
- }
- }
-
- if (param->action == PRAC_UPGRADED) {
- BOOL oldProto = pa->bOldProto;
- TCHAR szPlugin[MAX_PATH];
- mir_sntprintf(szPlugin, SIZEOF(szPlugin), _T("%s.dll"), _A2T(pa->szProtoName));
- int idx = accounts.getIndex(pa);
- UnloadAccount(pa, false, false);
- accounts.remove(idx);
- if (oldProto && UnloadPlugin(szPlugin, SIZEOF(szPlugin))) {
- TCHAR szNewName[MAX_PATH];
- mir_sntprintf(szNewName, SIZEOF(szNewName), _T("%s~"), szPlugin);
- MoveFile(szPlugin, szNewName);
- }
- param->action = PRAC_ADDED;
- }
-
- if (param->action == PRAC_ADDED) {
- char buf[200];
- GetDlgItemTextA(hwndDlg, IDC_PROTOTYPECOMBO, buf, SIZEOF(buf));
- char *szBaseProto = NEWSTR_ALLOCA(buf);
-
- GetDlgItemTextA(hwndDlg, IDC_ACCINTERNALNAME, buf, SIZEOF(buf));
- rtrim(buf);
-
- pa = Proto_CreateAccount(buf, szBaseProto, tszAccName);
- }
- else replaceStrT(pa->tszAccountName, tszAccName);
-
- WriteDbAccounts();
- NotifyEventHooks(hAccListChanged, param->action, (LPARAM)pa);
-
- SendMessage(GetParent(hwndDlg), WM_MY_REFRESH, 0, 0);
- return true;
-}
-
-static INT_PTR CALLBACK AccFormDlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
-{
- switch (message) {
- case WM_INITDIALOG:
- TranslateDialogDefault(hwndDlg);
- {
- PROTOCOLDESCRIPTOR **proto;
- int protoCount, i, cnt = 0;
- CallService(MS_PROTO_ENUMPROTOS, (WPARAM)&protoCount, (LPARAM)&proto);
- for (i = 0; i < protoCount; i++) {
- PROTOCOLDESCRIPTOR* pd = proto[i];
- if (pd->type == PROTOTYPE_PROTOCOL && pd->cbSize == sizeof(*pd)) {
- SendDlgItemMessageA(hwndDlg, IDC_PROTOTYPECOMBO, CB_ADDSTRING, 0, (LPARAM)proto[i]->szName);
- ++cnt;
- }
- }
- SendDlgItemMessage(hwndDlg, IDC_PROTOTYPECOMBO, CB_SETCURSEL, 0, 0);
- EnableWindow(GetDlgItem(hwndDlg, IDOK), cnt != 0);
-
- SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
- AccFormDlgParam* param = (AccFormDlgParam*)lParam;
-
- if (param->action == PRAC_ADDED) // new account
- SetWindowText(hwndDlg, TranslateT("Create new account"));
- else {
- TCHAR str[200];
- if (param->action == PRAC_CHANGED) { // update
- EnableWindow(GetDlgItem(hwndDlg, IDC_PROTOTYPECOMBO), FALSE);
- mir_sntprintf(str, SIZEOF(str), _T("%s: %s"), TranslateT("Editing account"), param->pa->tszAccountName);
- }
- else mir_sntprintf(str, SIZEOF(str), _T("%s: %s"), TranslateT("Upgrading account"), param->pa->tszAccountName);
-
- SetWindowText(hwndDlg, str);
- SetDlgItemText(hwndDlg, IDC_ACCNAME, param->pa->tszAccountName);
- SetDlgItemTextA(hwndDlg, IDC_ACCINTERNALNAME, param->pa->szModuleName);
- SendDlgItemMessageA(hwndDlg, IDC_PROTOTYPECOMBO, CB_SELECTSTRING, -1, (LPARAM)param->pa->szProtoName);
-
- EnableWindow(GetDlgItem(hwndDlg, IDC_ACCINTERNALNAME), FALSE);
- }
- SendDlgItemMessage(hwndDlg, IDC_ACCINTERNALNAME, EM_LIMITTEXT, 40, 0);
- }
- return TRUE;
-
- case WM_COMMAND:
- switch (LOWORD(wParam)) {
- case IDOK:
- if (OnCreateAccount(hwndDlg))
- EndDialog(hwndDlg, TRUE);
- break;
-
- case IDCANCEL:
- EndDialog(hwndDlg, FALSE);
- break;
- }
- }
-
- return FALSE;
-}
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Accounts manager
-
-struct TAccMgrData
-{
- HFONT hfntTitle, hfntText;
- int titleHeight, textHeight;
- int selectedHeight, normalHeight;
- int iSelected;
-};
-
-struct TAccListData
-{
- int iItem;
- RECT rcCheck;
- HWND hwndEdit;
-};
-
-static void sttClickButton(HWND hwndDlg, int idcButton)
-{
- if (IsWindowEnabled(GetDlgItem(hwndDlg, idcButton)))
- PostMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(idcButton, BN_CLICKED), (LPARAM)GetDlgItem(hwndDlg, idcButton));
-}
-
-static LRESULT CALLBACK sttEditSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- switch (msg) {
- case WM_KEYDOWN:
- switch (wParam) {
- case VK_RETURN:
- DestroyWindow(hwnd);
- return 0;
-
- case VK_ESCAPE:
- SetWindowLongPtr(hwnd, GWLP_WNDPROC, GetWindowLongPtr(hwnd, GWLP_USERDATA));
- DestroyWindow(hwnd);
- return 0;
- }
- break;
-
- case WM_GETDLGCODE:
- if (wParam == VK_RETURN || wParam == VK_ESCAPE)
- return DLGC_WANTMESSAGE;
- break;
-
- case WM_KILLFOCUS:
- int length = GetWindowTextLength(hwnd) + 1;
- TCHAR *str = (TCHAR*)mir_alloc(sizeof(TCHAR) * length);
- GetWindowText(hwnd, str, length);
- SendMessage(GetParent(GetParent(hwnd)), WM_COMMAND, MAKEWPARAM(GetWindowLongPtr(GetParent(hwnd), GWL_ID), LBN_MY_RENAME), (LPARAM)str);
- DestroyWindow(hwnd);
- return 0;
- }
- return mir_callNextSubclass(hwnd, sttEditSubclassProc, msg, wParam, lParam);
-}
-
-static LRESULT CALLBACK AccListWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- struct TAccListData *dat = (struct TAccListData *)GetWindowLongPtr(hwnd, GWLP_USERDATA);
- if (!dat)
- return DefWindowProc(hwnd, msg, wParam, lParam);
-
- switch (msg) {
- case WM_LBUTTONDOWN:
- {
- POINT pt = { LOWORD(lParam), HIWORD(lParam) };
- int iItem = LOWORD(SendMessage(hwnd, LB_ITEMFROMPOINT, 0, lParam));
- ListBox_GetItemRect(hwnd, iItem, &dat->rcCheck);
-
- dat->rcCheck.right = dat->rcCheck.left + GetSystemMetrics(SM_CXSMICON) + 4;
- dat->rcCheck.bottom = dat->rcCheck.top + GetSystemMetrics(SM_CYSMICON) + 4;
- if (PtInRect(&dat->rcCheck, pt))
- dat->iItem = iItem;
- else
- dat->iItem = -1;
- }
- break;
-
- case WM_LBUTTONUP:
- {
- POINT pt = { LOWORD(lParam), HIWORD(lParam) };
- if ((dat->iItem >= 0) && PtInRect(&dat->rcCheck, pt))
- PostMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(GetWindowLongPtr(hwnd, GWL_ID), LBN_MY_CHECK), (LPARAM)dat->iItem);
- dat->iItem = -1;
- }
- break;
-
- case WM_CHAR:
- if (wParam == ' ') {
- int iItem = ListBox_GetCurSel(hwnd);
- if (iItem >= 0)
- PostMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(GetWindowLongPtr(hwnd, GWL_ID), LBN_MY_CHECK), (LPARAM)iItem);
- return 0;
- }
-
- if (wParam == 10 /* enter */)
- return 0;
-
- break;
-
- case WM_GETDLGCODE:
- if (wParam == VK_RETURN)
- return DLGC_WANTMESSAGE;
- break;
-
- case WM_MY_RENAME:
- RECT rc;
- {
- struct TAccMgrData *parentDat = (struct TAccMgrData *)GetWindowLongPtr(GetParent(hwnd), GWLP_USERDATA);
- PROTOACCOUNT *pa = (PROTOACCOUNT *)ListBox_GetItemData(hwnd, ListBox_GetCurSel(hwnd));
- if (!pa || pa->bOldProto || pa->bDynDisabled)
- return 0;
-
- ListBox_GetItemRect(hwnd, ListBox_GetCurSel(hwnd), &rc);
- rc.left += 2 * GetSystemMetrics(SM_CXSMICON) + 4;
- rc.bottom = rc.top + max(GetSystemMetrics(SM_CXSMICON), parentDat->titleHeight) + 4 - 1;
- ++rc.top; --rc.right;
-
- dat->hwndEdit = CreateWindow(_T("EDIT"), pa->tszAccountName, WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, hwnd, NULL, hInst, NULL);
- mir_subclassWindow(dat->hwndEdit, sttEditSubclassProc);
- SendMessage(dat->hwndEdit, WM_SETFONT, (WPARAM)parentDat->hfntTitle, 0);
- SendMessage(dat->hwndEdit, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN | EC_USEFONTINFO, 0);
- SendMessage(dat->hwndEdit, EM_SETSEL, 0, -1);
- ShowWindow(dat->hwndEdit, SW_SHOW);
- }
- SetFocus(dat->hwndEdit);
- break;
-
- case WM_KEYDOWN:
- switch (wParam) {
- case VK_F2:
- PostMessage(hwnd, WM_MY_RENAME, 0, 0);
- return 0;
-
- case VK_INSERT:
- sttClickButton(GetParent(hwnd), IDC_ADD);
- return 0;
-
- case VK_DELETE:
- sttClickButton(GetParent(hwnd), IDC_REMOVE);
- return 0;
-
- case VK_RETURN:
- if (GetAsyncKeyState(VK_CONTROL))
- sttClickButton(GetParent(hwnd), IDC_EDIT);
- else
- sttClickButton(GetParent(hwnd), IDOK);
- return 0;
- }
- break;
- }
-
- return mir_callNextSubclass(hwnd, AccListWndProc, msg, wParam, lParam);
-}
-
-static void sttSubclassAccList(HWND hwnd, BOOL subclass)
-{
- if (subclass) {
- struct TAccListData *dat = (struct TAccListData *)mir_alloc(sizeof(struct TAccListData));
- dat->iItem = -1;
- SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)dat);
- mir_subclassWindow(hwnd, AccListWndProc);
- }
- else {
- struct TAccListData *dat = (struct TAccListData *)GetWindowLongPtr(hwnd, GWLP_USERDATA);
- SetWindowLongPtr(hwnd, GWLP_USERDATA, 0);
- mir_free(dat);
- }
-}
-
-static void sttSelectItem(struct TAccMgrData *dat, HWND hwndList, int iItem)
-{
- if ((dat->iSelected != iItem) && (dat->iSelected >= 0))
- ListBox_SetItemHeight(hwndList, dat->iSelected, dat->normalHeight);
-
- dat->iSelected = iItem;
- ListBox_SetItemHeight(hwndList, dat->iSelected, dat->selectedHeight);
- RedrawWindow(hwndList, NULL, NULL, RDW_INVALIDATE);
-}
-
-static void sttUpdateAccountInfo(HWND hwndDlg, struct TAccMgrData *dat)
-{
- HWND hwndList = GetDlgItem(hwndDlg, IDC_ACCLIST);
- int curSel = ListBox_GetCurSel(hwndList);
- if (curSel != LB_ERR) {
- PROTOACCOUNT *pa = (PROTOACCOUNT *)ListBox_GetItemData(hwndList, curSel);
- if (pa) {
- EnableWindow(GetDlgItem(hwndDlg, IDC_UPGRADE), pa->bOldProto || pa->bDynDisabled);
- EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT), !pa->bOldProto && !pa->bDynDisabled);
- EnableWindow(GetDlgItem(hwndDlg, IDC_REMOVE), TRUE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_OPTIONS), pa->ppro != 0);
-
- if (dat->iSelected >= 0) {
- PROTOACCOUNT *pa_old = (PROTOACCOUNT *)ListBox_GetItemData(hwndList, dat->iSelected);
- if (pa_old && pa_old != pa && pa_old->hwndAccMgrUI)
- ShowWindow(pa_old->hwndAccMgrUI, SW_HIDE);
- }
-
- if (pa->hwndAccMgrUI) {
- ShowWindow(GetDlgItem(hwndDlg, IDC_TXT_INFO), SW_HIDE);
- ShowWindow(pa->hwndAccMgrUI, SW_SHOW);
- }
- else if (!pa->ppro) {
- ShowWindow(GetDlgItem(hwndDlg, IDC_TXT_INFO), SW_SHOW);
- SetDlgItemText(hwndDlg, IDC_TXT_INFO, TranslateT("Account is disabled. Please activate it to access options."));
- }
- else {
- HWND hwnd = (HWND)CallProtoService(pa->szModuleName, PS_CREATEACCMGRUI, 0, (LPARAM)hwndDlg);
- if (hwnd && (hwnd != (HWND)CALLSERVICE_NOTFOUND)) {
- RECT rc;
-
- ShowWindow(GetDlgItem(hwndDlg, IDC_TXT_INFO), SW_HIDE);
-
- GetWindowRect(GetDlgItem(hwndDlg, IDC_TXT_INFO), &rc);
- MapWindowPoints(NULL, hwndDlg, (LPPOINT)&rc, 2);
- SetWindowPos(hwnd, hwndList, rc.left, rc.top, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);
-
- pa->hwndAccMgrUI = hwnd;
- }
- else {
- ShowWindow(GetDlgItem(hwndDlg, IDC_TXT_INFO), SW_SHOW);
- SetDlgItemText(hwndDlg, IDC_TXT_INFO, legacyMsg);
- }
- }
- return;
- }
- }
-
- EnableWindow(GetDlgItem(hwndDlg, IDC_UPGRADE), FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT), FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_REMOVE), FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_OPTIONS), FALSE);
-
- ShowWindow(GetDlgItem(hwndDlg, IDC_TXT_INFO), SW_SHOW);
- SetDlgItemText(hwndDlg, IDC_TXT_INFO, welcomeMsg);
-}
-
-INT_PTR CALLBACK AccMgrDlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
-{
- struct TAccMgrData *dat = (struct TAccMgrData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
- HWND hwndList = GetDlgItem(hwndDlg, IDC_ACCLIST);
- PROTOACCOUNT *pa;
- int idx;
- PSHNOTIFY pshn;
-
- switch (message) {
- case WM_INITDIALOG:
- TranslateDialogDefault(hwndDlg);
- Window_SetIcon_IcoLib(hwndDlg, SKINICON_OTHER_ACCMGR);
-
- dat = (TAccMgrData *)mir_alloc(sizeof(TAccMgrData));
- SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat);
-
- Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("New account"));
- Button_SetIcon_IcoLib(hwndDlg, IDC_EDIT, SKINICON_OTHER_RENAME, LPGEN("Edit"));
- Button_SetIcon_IcoLib(hwndDlg, IDC_REMOVE, SKINICON_OTHER_DELETE, LPGEN("Remove account"));
- Button_SetIcon_IcoLib(hwndDlg, IDC_OPTIONS, SKINICON_OTHER_OPTIONS, LPGEN("Configure..."));
- Button_SetIcon_IcoLib(hwndDlg, IDC_UPGRADE, SKINICON_OTHER_ACCMGR, LPGEN("Upgrade account"));
-
- EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT), FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_REMOVE), FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_OPTIONS), FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_UPGRADE), FALSE);
- {
- LOGFONT lf;
- GetObject((HFONT)SendMessage(hwndDlg, WM_GETFONT, 0, 0), sizeof(lf), &lf);
- dat->hfntText = CreateFontIndirect(&lf);
-
- GetObject((HFONT)SendMessage(hwndDlg, WM_GETFONT, 0, 0), sizeof(lf), &lf);
- lf.lfWeight = FW_BOLD;
- dat->hfntTitle = CreateFontIndirect(&lf);
-
- HDC hdc = GetDC(hwndDlg);
- HFONT hfnt = (HFONT)SelectObject(hdc, dat->hfntTitle);
-
- TEXTMETRIC tm;
- GetTextMetrics(hdc, &tm);
- dat->titleHeight = tm.tmHeight;
- SelectObject(hdc, dat->hfntText);
-
- GetTextMetrics(hdc, &tm);
- dat->textHeight = tm.tmHeight;
- SelectObject(hdc, hfnt);
- ReleaseDC(hwndDlg, hdc);
-
- dat->normalHeight = 4 + max(dat->titleHeight, GetSystemMetrics(SM_CYSMICON));
- dat->selectedHeight = dat->normalHeight + 4 + 2 * dat->textHeight;
- }
-
- SendDlgItemMessage(hwndDlg, IDC_NAME, WM_SETFONT, (WPARAM)dat->hfntTitle, 0);
- SendDlgItemMessage(hwndDlg, IDC_TXT_ACCOUNT, WM_SETFONT, (WPARAM)dat->hfntTitle, 0);
- SendDlgItemMessage(hwndDlg, IDC_TXT_ADDITIONAL, WM_SETFONT, (WPARAM)dat->hfntTitle, 0);
-
- dat->iSelected = -1;
- sttSubclassAccList(GetDlgItem(hwndDlg, IDC_ACCLIST), TRUE);
- SendMessage(hwndDlg, WM_MY_REFRESH, 0, 0);
-
- Utils_RestoreWindowPositionNoSize(hwndDlg, NULL, "AccMgr", "");
- return TRUE;
-
- case WM_CTLCOLORSTATIC:
- switch (GetDlgCtrlID((HWND)lParam)) {
- case IDC_WHITERECT:
- case IDC_NAME:
- SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW));
- return (INT_PTR)GetSysColorBrush(COLOR_WINDOW);
- }
- break;
-
- case WM_MEASUREITEM:
- {
- LPMEASUREITEMSTRUCT lps = (LPMEASUREITEMSTRUCT)lParam;
- PROTOACCOUNT *acc = (PROTOACCOUNT *)lps->itemData;
-
- if ((lps->CtlID != IDC_ACCLIST) || !acc)
- break;
-
- lps->itemWidth = 10;
- lps->itemHeight = dat->normalHeight;
- }
- return TRUE;
-
- case WM_DRAWITEM:
- HBRUSH hbrBack;
- SIZE sz;
- {
- int cxIcon = GetSystemMetrics(SM_CXSMICON);
- int cyIcon = GetSystemMetrics(SM_CYSMICON);
-
- LPDRAWITEMSTRUCT lps = (LPDRAWITEMSTRUCT)lParam;
- PROTOACCOUNT *acc = (PROTOACCOUNT *)lps->itemData;
- if ((lps->CtlID != IDC_ACCLIST) || (lps->itemID == -1) || !acc)
- break;
-
- SetBkMode(lps->hDC, TRANSPARENT);
- if (lps->itemState & ODS_SELECTED) {
- hbrBack = GetSysColorBrush(COLOR_HIGHLIGHT);
- SetTextColor(lps->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
- }
- else {
- hbrBack = GetSysColorBrush(COLOR_WINDOW);
- SetTextColor(lps->hDC, GetSysColor(COLOR_WINDOWTEXT));
- }
- FillRect(lps->hDC, &lps->rcItem, hbrBack);
-
- lps->rcItem.left += 2;
- lps->rcItem.top += 2;
- lps->rcItem.bottom -= 2;
-
- int tmp;
- if (acc->bOldProto)
- tmp = SKINICON_OTHER_ON;
- else if (acc->bDynDisabled)
- tmp = SKINICON_OTHER_OFF;
- else
- tmp = acc->bIsEnabled ? SKINICON_OTHER_TICK : SKINICON_OTHER_NOTICK;
-
- HICON hIcon = LoadSkinnedIcon(tmp);
- DrawIconEx(lps->hDC, lps->rcItem.left, lps->rcItem.top, hIcon, cxIcon, cyIcon, 0, hbrBack, DI_NORMAL);
- IcoLib_ReleaseIcon(hIcon, 0);
-
- lps->rcItem.left += cxIcon + 2;
-
- if (acc->ppro) {
- hIcon = Skin_GetIconByHandle(acc->ppro->m_hProtoIcon);
- DrawIconEx(lps->hDC, lps->rcItem.left, lps->rcItem.top, hIcon, cxIcon, cyIcon, 0, hbrBack, DI_NORMAL);
- Skin_ReleaseIcon(hIcon);
- }
- lps->rcItem.left += cxIcon + 2;
-
- int length = SendDlgItemMessage(hwndDlg, IDC_ACCLIST, LB_GETTEXTLEN, lps->itemID, 0);
- int size = max(length + 1, 256);
- TCHAR *text = (TCHAR *)_alloca(sizeof(TCHAR) * size);
- SendDlgItemMessage(hwndDlg, IDC_ACCLIST, LB_GETTEXT, lps->itemID, (LPARAM)text);
-
- SelectObject(lps->hDC, dat->hfntTitle);
- tmp = lps->rcItem.bottom;
- lps->rcItem.bottom = lps->rcItem.top + max(cyIcon, dat->titleHeight);
- DrawText(lps->hDC, text, -1, &lps->rcItem, DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS | DT_VCENTER);
- lps->rcItem.bottom = tmp;
- GetTextExtentPoint32(lps->hDC, text, length, &sz);
- lps->rcItem.top += max(cxIcon, sz.cy) + 2;
-
- if (lps->itemID == (unsigned)dat->iSelected) {
- SelectObject(lps->hDC, dat->hfntText);
- mir_sntprintf(text, size, _T("%s: %S"), TranslateT("Protocol"), acc->szProtoName);
- length = (int)mir_tstrlen(text);
- DrawText(lps->hDC, text, -1, &lps->rcItem, DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
- GetTextExtentPoint32(lps->hDC, text, length, &sz);
- lps->rcItem.top += sz.cy + 2;
-
- if (acc->ppro && Proto_IsProtocolLoaded(acc->szProtoName)) {
- char *szIdName = (char *)acc->ppro->GetCaps(PFLAG_UNIQUEIDTEXT, 0);
- TCHAR *tszIdName = szIdName ? mir_a2t(szIdName) : mir_tstrdup(TranslateT("Account ID"));
-
- CONTACTINFO ci = { 0 };
- ci.cbSize = sizeof(ci);
- ci.hContact = NULL;
- ci.szProto = acc->szModuleName;
- ci.dwFlag = CNF_UNIQUEID | CNF_TCHAR;
- if (!CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM)& ci)) {
- switch (ci.type) {
- case CNFT_ASCIIZ:
- mir_sntprintf(text, size, _T("%s: %s"), tszIdName, ci.pszVal);
- mir_free(ci.pszVal);
- break;
- case CNFT_DWORD:
- mir_sntprintf(text, size, _T("%s: %d"), tszIdName, ci.dVal);
- break;
- }
- }
- else mir_sntprintf(text, size, _T("%s: %s"), tszIdName, TranslateT("<unknown>"));
- mir_free(tszIdName);
- }
- else mir_sntprintf(text, size, TranslateT("Protocol is not loaded."));
-
- length = (int)mir_tstrlen(text);
- DrawText(lps->hDC, text, -1, &lps->rcItem, DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
- GetTextExtentPoint32(lps->hDC, text, length, &sz);
- lps->rcItem.top += sz.cy + 2;
- }
- }
- return TRUE;
-
- case WM_MY_REFRESH:
- dat->iSelected = -1;
- {
- int i = ListBox_GetCurSel(hwndList);
- PROTOACCOUNT *acc = (i == LB_ERR) ? NULL : (PROTOACCOUNT *)ListBox_GetItemData(hwndList, i);
-
- SendMessage(hwndList, LB_RESETCONTENT, 0, 0);
- for (i = 0; i < accounts.getCount(); i++) {
- PROTOACCOUNT *p = accounts[i];
- PROTOCOLDESCRIPTOR *pd = Proto_IsProtocolLoaded(p->szProtoName);
- if (pd != NULL && pd->type != PROTOTYPE_PROTOCOL)
- continue;
-
- int iItem = SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)p->tszAccountName);
- SendMessage(hwndList, LB_SETITEMDATA, iItem, (LPARAM)p);
-
- if (p == acc)
- ListBox_SetCurSel(hwndList, iItem);
- }
-
- dat->iSelected = ListBox_GetCurSel(hwndList); // -1 if error = > nothing selected in our case
- if (dat->iSelected >= 0)
- sttSelectItem(dat, hwndList, dat->iSelected);
- else if (acc && acc->hwndAccMgrUI)
- ShowWindow(acc->hwndAccMgrUI, SW_HIDE);
- }
- sttUpdateAccountInfo(hwndDlg, dat);
- break;
-
- case WM_CONTEXTMENU:
- if (GetWindowLongPtr((HWND)wParam, GWL_ID) == IDC_ACCLIST) {
- POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
- int iItem = ListBox_GetCurSel(hwndList);
-
- if (pt.x == -1 && pt.y == -1) {
- if (iItem != LB_ERR) {
- RECT rc;
- ListBox_GetItemRect(hwndList, iItem, &rc);
- pt.x = rc.left + GetSystemMetrics(SM_CXSMICON) + 4;
- pt.y = rc.top + 4 + max(GetSystemMetrics(SM_CXSMICON), dat->titleHeight);
- ClientToScreen(hwndList, &pt);
- }
- }
- else {
- // menu was activated with mouse = > find item under cursor & set focus to our control.
- POINT ptItem = pt;
- ScreenToClient(hwndList, &ptItem);
- iItem = (short)LOWORD(SendMessage(hwndList, LB_ITEMFROMPOINT, 0, MAKELPARAM(ptItem.x, ptItem.y)));
- if (iItem != LB_ERR) {
- ListBox_SetCurSel(hwndList, iItem);
- sttUpdateAccountInfo(hwndDlg, dat);
- sttSelectItem(dat, hwndList, iItem);
- SetFocus(hwndList);
- }
- }
-
- if (iItem != LB_ERR) {
- pa = (PROTOACCOUNT*)ListBox_GetItemData(hwndList, iItem);
- HMENU hMenu = CreatePopupMenu();
- if (!pa->bOldProto && !pa->bDynDisabled)
- AppendMenu(hMenu, MF_STRING, 1, TranslateT("Rename"));
-
- AppendMenu(hMenu, MF_STRING, 3, TranslateT("Delete"));
-
- if (Proto_IsAccountEnabled(pa))
- AppendMenu(hMenu, MF_STRING, 4, TranslateT("Configure"));
-
- if (pa->bOldProto || pa->bDynDisabled)
- AppendMenu(hMenu, MF_STRING, 5, TranslateT("Upgrade"));
-
- switch (TrackPopupMenu(hMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwndDlg, NULL)) {
- case 1:
- PostMessage(hwndList, WM_MY_RENAME, 0, 0);
- break;
-
- case 2:
- sttClickButton(hwndDlg, IDC_EDIT);
- break;
-
- case 3:
- sttClickButton(hwndDlg, IDC_REMOVE);
- break;
-
- case 4:
- sttClickButton(hwndDlg, IDC_OPTIONS);
- break;
-
- case 5:
- sttClickButton(hwndDlg, IDC_UPGRADE);
- break;
- }
- DestroyMenu(hMenu);
- }
- }
- break;
-
- case WM_COMMAND:
- switch (LOWORD(wParam)) {
- case IDC_ACCLIST:
- switch (HIWORD(wParam)) {
- case LBN_SELCHANGE:
- sttUpdateAccountInfo(hwndDlg, dat);
- sttSelectItem(dat, hwndList, ListBox_GetCurSel(hwndList));
- SetFocus(hwndList);
- break;
-
- case LBN_DBLCLK:
- PostMessage(hwndList, WM_MY_RENAME, 0, 0);
- break;
-
- case LBN_MY_CHECK:
- pa = (PROTOACCOUNT *)ListBox_GetItemData(hwndList, lParam);
- if (pa) {
- if (pa->bOldProto || pa->bDynDisabled)
- break;
-
- pa->bIsEnabled = !pa->bIsEnabled;
- if (pa->bIsEnabled) {
- if (ActivateAccount(pa)) {
- pa->ppro->OnEvent(EV_PROTO_ONLOAD, 0, 0);
- if (!db_get_b(NULL, "CList", "MoveProtoMenus", TRUE))
- pa->ppro->OnEvent(EV_PROTO_ONMENU, 0, 0);
- }
- }
- else {
- DWORD dwStatus = CallProtoServiceInt(NULL, pa->szModuleName, PS_GETSTATUS, 0, 0);
- if (dwStatus >= ID_STATUS_ONLINE) {
- TCHAR buf[200];
- mir_sntprintf(buf, TranslateT("Account %s is being disabled"), pa->tszAccountName);
- if (IDNO == ::MessageBox(hwndDlg,
- TranslateT("Account is online. Disable account?"),
- buf, MB_ICONWARNING | MB_DEFBUTTON2 | MB_YESNO)) {
- pa->bIsEnabled = 1; //stay enabled
- }
- }
-
- if (!pa->bIsEnabled)
- DeactivateAccount(pa, true, false);
- }
-
- WriteDbAccounts();
- NotifyEventHooks(hAccListChanged, PRAC_CHECKED, (LPARAM)pa);
- sttUpdateAccountInfo(hwndDlg, dat);
- RedrawWindow(hwndList, NULL, NULL, RDW_INVALIDATE);
- }
- break;
-
- case LBN_MY_RENAME:
- int iItem = ListBox_GetCurSel(hwndList);
- pa = (PROTOACCOUNT *)ListBox_GetItemData(hwndList, iItem);
- if (pa) {
- mir_free(pa->tszAccountName);
- pa->tszAccountName = (TCHAR*)lParam;
- WriteDbAccounts();
- NotifyEventHooks(hAccListChanged, PRAC_CHANGED, (LPARAM)pa);
-
- ListBox_DeleteString(hwndList, iItem);
- iItem = ListBox_AddString(hwndList, pa->tszAccountName);
- ListBox_SetItemData(hwndList, iItem, (LPARAM)pa);
- ListBox_SetCurSel(hwndList, iItem);
-
- sttSelectItem(dat, hwndList, iItem);
-
- RedrawWindow(hwndList, NULL, NULL, RDW_INVALIDATE);
- }
- else mir_free((TCHAR*)lParam);
- }
- break;
-
- case IDC_ADD:
- {
- AccFormDlgParam param = { PRAC_ADDED, NULL };
- if (IDOK == DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_ACCFORM), hwndDlg, AccFormDlgProc, (LPARAM)¶m))
- SendMessage(hwndDlg, WM_MY_REFRESH, 0, 0);
- }
- break;
-
- case IDC_EDIT:
- idx = ListBox_GetCurSel(hwndList);
- if (idx != -1)
- PostMessage(hwndList, WM_MY_RENAME, 0, 0);
- break;
-
- case IDC_REMOVE:
- idx = ListBox_GetCurSel(hwndList);
- if (idx != -1) {
- pa = (PROTOACCOUNT*)ListBox_GetItemData(hwndList, idx);
- TCHAR buf[200];
- mir_sntprintf(buf, TranslateT("Account %s is being deleted"), pa->tszAccountName);
- if (pa->bOldProto) {
- MessageBox(hwndDlg, TranslateT("You need to disable plugin to delete this account"), buf, MB_ICONERROR | MB_OK);
- break;
- }
- if (IDYES == MessageBox(hwndDlg, errMsg, buf, MB_ICONWARNING | MB_DEFBUTTON2 | MB_YESNO)) {
- // lock controls to avoid changes during remove process
- ListBox_SetCurSel(hwndList, -1);
- sttUpdateAccountInfo(hwndDlg, dat);
- EnableWindow(hwndList, FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE);
-
- ListBox_SetItemData(hwndList, idx, 0);
-
- accounts.remove(pa);
-
- CheckProtocolOrder();
-
- WriteDbAccounts();
- NotifyEventHooks(hAccListChanged, PRAC_REMOVED, (LPARAM)pa);
-
- UnloadAccount(pa, true, true);
- SendMessage(hwndDlg, WM_MY_REFRESH, 0, 0);
-
- EnableWindow(hwndList, TRUE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_ADD), TRUE);
- }
- }
- break;
-
- case IDC_OPTIONS:
- idx = ListBox_GetCurSel(hwndList);
- if (idx != -1) {
- pa = (PROTOACCOUNT*)ListBox_GetItemData(hwndList, idx);
- if (pa->bOldProto) {
- OPENOPTIONSDIALOG ood;
- ood.cbSize = sizeof(ood);
- ood.pszGroup = "Network";
- ood.pszPage = pa->szModuleName;
- ood.pszTab = NULL;
- Options_Open(&ood);
- }
- else OpenAccountOptions(pa);
- }
- break;
-
- case IDC_UPGRADE:
- idx = ListBox_GetCurSel(hwndList);
- if (idx != -1) {
- AccFormDlgParam param = { PRAC_UPGRADED, (PROTOACCOUNT*)ListBox_GetItemData(hwndList, idx) };
- DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_ACCFORM), hwndDlg, AccFormDlgProc, (LPARAM)¶m);
- }
- break;
-
- case IDC_LNK_NETWORK:
- pshn.hdr.idFrom = 0;
- pshn.hdr.code = PSN_APPLY;
- pshn.hdr.hwndFrom = hwndDlg;
- SendMessage(hwndDlg, WM_NOTIFY, 0, (LPARAM)&pshn);
- {
- OPENOPTIONSDIALOG ood = { 0 };
- ood.cbSize = sizeof(ood);
- ood.pszPage = "Network";
- Options_Open(&ood);
- }
- break;
-
- case IDC_LNK_ADDONS:
- CallService(MS_UTILS_OPENURL, OUF_NEWWINDOW, (LPARAM)"http://miranda-ng.org/");
- break;
-
- case IDOK:
- pshn.hdr.idFrom = 0;
- pshn.hdr.code = PSN_APPLY;
- pshn.hdr.hwndFrom = hwndDlg;
- SendMessage(hwndDlg, WM_NOTIFY, 0, (LPARAM)&pshn);
- DestroyWindow(hwndDlg);
- break;
-
- case IDCANCEL:
- pshn.hdr.idFrom = 0;
- pshn.hdr.code = PSN_RESET;
- pshn.hdr.hwndFrom = hwndDlg;
- SendMessage(hwndDlg, WM_NOTIFY, 0, (LPARAM)&pshn);
- DestroyWindow(hwndDlg);
- break;
- }
- break;
-
- case PSM_CHANGED:
- idx = ListBox_GetCurSel(hwndList);
- if (idx != -1) {
- pa = (PROTOACCOUNT *)ListBox_GetItemData(hwndList, idx);
- if (pa) {
- pa->bAccMgrUIChanged = TRUE;
- SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
- }
- }
- break;
-
- case WM_NOTIFY:
- if (((LPNMHDR)lParam)->idFrom == 0) {
- switch (((LPNMHDR)lParam)->code) {
- case PSN_APPLY:
- pshn.hdr.idFrom = 0;
- pshn.hdr.code = PSN_APPLY;
- for (int i = 0; i < accounts.getCount(); i++) {
- pa = accounts[i];
- if (pa->hwndAccMgrUI && pa->bAccMgrUIChanged) {
- pshn.hdr.hwndFrom = pa->hwndAccMgrUI;
- SendMessage(pa->hwndAccMgrUI, WM_NOTIFY, 0, (LPARAM)&pshn);
- pa->bAccMgrUIChanged = FALSE;
- }
- }
- return TRUE;
-
- case PSN_RESET:
- pshn.hdr.idFrom = 0;
- pshn.hdr.code = PSN_RESET;
- for (int i = 0; i < accounts.getCount(); i++) {
- pa = accounts[i];
- if (pa->hwndAccMgrUI && pa->bAccMgrUIChanged) {
- pshn.hdr.hwndFrom = pa->hwndAccMgrUI;
- SendMessage(pa->hwndAccMgrUI, WM_NOTIFY, 0, (LPARAM)&pshn);
- pa->bAccMgrUIChanged = FALSE;
- }
- }
- return TRUE;
- }
- }
- break;
-
- case WM_DESTROY:
- for (int i = 0; i < accounts.getCount(); i++) {
- pa = accounts[i];
- pa->bAccMgrUIChanged = FALSE;
- if (pa->hwndAccMgrUI) {
- DestroyWindow(pa->hwndAccMgrUI);
- pa->hwndAccMgrUI = NULL;
- }
- }
-
- Window_FreeIcon_IcoLib(hwndDlg);
- Button_FreeIcon_IcoLib(hwndDlg, IDC_ADD);
- Button_FreeIcon_IcoLib(hwndDlg, IDC_EDIT);
- Button_FreeIcon_IcoLib(hwndDlg, IDC_REMOVE);
- Button_FreeIcon_IcoLib(hwndDlg, IDC_OPTIONS);
- Button_FreeIcon_IcoLib(hwndDlg, IDC_UPGRADE);
- Utils_SaveWindowPosition(hwndDlg, NULL, "AccMgr", "");
- sttSubclassAccList(GetDlgItem(hwndDlg, IDC_ACCLIST), FALSE);
- DeleteObject(dat->hfntTitle);
- DeleteObject(dat->hfntText);
- mir_free(dat);
- hAccMgr = NULL;
- break;
- }
-
- return FALSE;
-}
-
-static INT_PTR OptProtosShow(WPARAM, LPARAM)
-{
- if (!hAccMgr)
- hAccMgr = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_ACCMGR), NULL, AccMgrDlgProc, 0);
-
- ShowWindow(hAccMgr, SW_RESTORE);
- SetForegroundWindow(hAccMgr);
- SetActiveWindow(hAccMgr);
- return 0;
-}
-
-int OptProtosLoaded(WPARAM, LPARAM)
-{
- CLISTMENUITEM mi = { sizeof(mi) };
- mi.icolibItem = GetSkinIconHandle(SKINICON_OTHER_ACCMGR);
- mi.position = 1900000000;
- mi.pszName = LPGEN("&Accounts...");
- mi.pszService = MS_PROTO_SHOWACCMGR;
- Menu_AddMainMenuItem(&mi);
- return 0;
-}
-
-static int OnAccListChanged(WPARAM eventCode, LPARAM lParam)
-{
- PROTOACCOUNT *pa = (PROTOACCOUNT*)lParam;
-
- switch (eventCode) {
- case PRAC_CHANGED:
- if (pa->ppro) {
- mir_free(pa->ppro->m_tszUserName);
- pa->ppro->m_tszUserName = mir_tstrdup(pa->tszAccountName);
- pa->ppro->OnEvent(EV_PROTO_ONRENAME, 0, lParam);
- }
- }
-
- return 0;
-}
-
-static int ShutdownAccMgr(WPARAM, LPARAM)
-{
- if (IsWindow(hAccMgr))
- DestroyWindow(hAccMgr);
- hAccMgr = NULL;
- return 0;
-}
-
-int LoadProtoOptions(void)
-{
- CreateServiceFunction(MS_PROTO_SHOWACCMGR, OptProtosShow);
-
- HookEvent(ME_SYSTEM_MODULESLOADED, OptProtosLoaded);
- HookEvent(ME_PROTO_ACCLISTCHANGED, OnAccListChanged);
- HookEvent(ME_SYSTEM_PRESHUTDOWN, ShutdownAccMgr);
- return 0;
-}
|