diff options
author | George Hazan <ghazan@miranda.im> | 2018-03-28 16:34:30 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2018-03-28 16:34:30 +0300 |
commit | 81ce57622c3166830b23eae534dacc6b008c659d (patch) | |
tree | 6d6ac74667f733a20b94fa27cc01c2f45688c533 | |
parent | c2bb7727483b9b5620e8cc0ce6adae35ee78d0a4 (diff) |
common protocol instance management code went into template
58 files changed, 278 insertions, 790 deletions
diff --git a/include/m_plugin.h b/include/m_plugin.h index b54d64aea3..233e03a432 100644 --- a/include/m_plugin.h +++ b/include/m_plugin.h @@ -189,3 +189,53 @@ protected: CreateServiceFunctionObjParam(str, (MIRANDASERVICEOBJPARAM)*(void**)&pFunc, this, param); } }; + +///////////////////////////////////////////////////////////////////////////////////////// +// Basic class for protocols with accounts + +struct CMPlugin; + +template<class P> class ACCPROTOPLUGIN : public PLUGIN<CMPlugin> +{ + typedef PLUGIN<CMPlugin> CSuper; + +protected: + ACCPROTOPLUGIN(const char *moduleName) : + CSuper(moduleName) + { + CMPluginBase::RegisterProtocol(PROTOTYPE_PROTOCOL, &fnInit, &fnUninit); + } + + static PROTO_INTERFACE* fnInit(const char *szModuleName, const wchar_t *wszAccountName) + { + P *ppro = new P(szModuleName, wszAccountName); + g_arInstances.insert(ppro); + return ppro; + } + + static int fnUninit(PROTO_INTERFACE *ppro) + { + g_arInstances.remove((P*)ppro); + return 0; + } + +public: + static OBJLIST<P> g_arInstances; + + static P* getInstance(const char *szProto) + { + for (auto &it : g_arInstances) + if (mir_strcmp(szProto, it->m_szModuleName) == 0) + return it; + + return nullptr; + } + + static P* getInstance(MCONTACT hContact) + { + return getInstance(::GetContactProto(hContact)); + } +}; + +template<class P> +OBJLIST<P> ACCPROTOPLUGIN<P>::g_arInstances(1, PtrKeySortT); diff --git a/protocols/Discord/src/main.cpp b/protocols/Discord/src/main.cpp index 2bed58e39a..9a1c6aa7dd 100644 --- a/protocols/Discord/src/main.cpp +++ b/protocols/Discord/src/main.cpp @@ -82,24 +82,11 @@ extern "C" int __declspec(dllexport) Unload(void) ///////////////////////////////////////////////////////////////////////////////////////// -static PROTO_INTERFACE* protoInit(const char *proto_name, const wchar_t *username) -{ - return new CDiscordProto(proto_name, username); -} - -static int protoUninit(PROTO_INTERFACE *proto) -{ - delete (CDiscordProto*)proto; - return 0; -} - -struct CMPlugin : public CMPluginBase +struct CMPlugin : public ACCPROTOPLUGIN<CDiscordProto> { CMPlugin() : - CMPluginBase("Discord") - { - RegisterProtocol(PROTOTYPE_PROTOCOL, protoInit, protoUninit); - } + ACCPROTOPLUGIN<CDiscordProto>("Discord") + {} } g_plugin; diff --git a/protocols/Dummy/src/main.cpp b/protocols/Dummy/src/main.cpp index da1fccd10a..906ee1182a 100644 --- a/protocols/Dummy/src/main.cpp +++ b/protocols/Dummy/src/main.cpp @@ -81,24 +81,10 @@ extern "C" int __declspec(dllexport) Unload(void) /////////////////////////////////////////////////////////////////////////////////////////
-static PROTO_INTERFACE* dummyProtoInit(const char* pszProtoName, const wchar_t *tszUserName)
-{
- CDummyProto *ppro = new CDummyProto(pszProtoName, tszUserName);
- return ppro;
-}
-
-static int dummyProtoUninit(PROTO_INTERFACE *ppro)
-{
- delete (CDummyProto*)ppro;
- return 0;
-}
-
-struct CMPlugin : public CMPluginBase
+struct CMPlugin : public ACCPROTOPLUGIN<CDummyProto>
{
CMPlugin() :
- CMPluginBase("Dummy")
- {
- RegisterProtocol(PROTOTYPE_PROTOCOL, dummyProtoInit, dummyProtoUninit);
- }
+ ACCPROTOPLUGIN<CDummyProto>("Dummy")
+ {}
}
g_plugin;
diff --git a/protocols/FacebookRM/src/main.cpp b/protocols/FacebookRM/src/main.cpp index 28bc66d172..2e7f7849dd 100644 --- a/protocols/FacebookRM/src/main.cpp +++ b/protocols/FacebookRM/src/main.cpp @@ -24,6 +24,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. // TODO: Make following as "globals" structure?
+CMPlugin g_plugin;
CLIST_INTERFACE *pcli;
int hLangpack;
@@ -44,15 +45,6 @@ PLUGININFOEX pluginInfo = { { 0x8432b009, 0xff32, 0x4727, { 0xaa, 0xe6, 0xa9, 0x3, 0x50, 0x38, 0xfd, 0x58 } }
};
-/////////////////////////////////////////////////////////////////////////////
-// Protocol instances
-static int compare_protos(const FacebookProto *p1, const FacebookProto *p2)
-{
- return mir_wstrcmp(p1->m_tszUserName, p2->m_tszUserName);
-}
-
-OBJLIST<FacebookProto> g_Instances(1, compare_protos);
-
DWORD WINAPI DllMain(HINSTANCE hInstance, DWORD, LPVOID)
{
g_hInstance = hInstance;
@@ -73,19 +65,6 @@ extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = { MIID_PROTOC /////////////////////////////////////////////////////////////////////////////////////////
// Load
-static PROTO_INTERFACE* protoInit(const char *proto_name, const wchar_t *username)
-{
- FacebookProto *proto = new FacebookProto(proto_name, username);
- g_Instances.insert(proto);
- return proto;
-}
-
-static int protoUninit(PROTO_INTERFACE* proto)
-{
- g_Instances.remove((FacebookProto*)proto);
- return EXIT_SUCCESS;
-}
-
extern "C" int __declspec(dllexport) Load(void)
{
mir_getLP(&pluginInfo);
@@ -120,15 +99,3 @@ extern "C" int __declspec(dllexport) Unload(void) {
return 0;
}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-struct CMPlugin : public CMPluginBase
-{
- CMPlugin() :
- CMPluginBase(FACEBOOK_NAME)
- {
- RegisterProtocol(PROTOTYPE_PROTOCOL, protoInit, protoUninit);
- }
-}
- g_plugin;
diff --git a/protocols/FacebookRM/src/proto.h b/protocols/FacebookRM/src/proto.h index 98262699ff..8f4b547e61 100644 --- a/protocols/FacebookRM/src/proto.h +++ b/protocols/FacebookRM/src/proto.h @@ -286,3 +286,10 @@ public: HWND NotifyEvent(wchar_t* title, wchar_t* text, MCONTACT contact, EventType type, std::string *url = nullptr, std::string *notification_id = nullptr, const char *icon = nullptr); void ShowNotifications(); }; + +struct CMPlugin : public ACCPROTOPLUGIN<FacebookProto> +{ + CMPlugin() : + ACCPROTOPLUGIN<FacebookProto>(FACEBOOK_NAME) + {} +}; diff --git a/protocols/FacebookRM/src/theme.cpp b/protocols/FacebookRM/src/theme.cpp index 91d7931076..ce5fb25df3 100644 --- a/protocols/FacebookRM/src/theme.cpp +++ b/protocols/FacebookRM/src/theme.cpp @@ -22,8 +22,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "stdafx.h"
-extern OBJLIST<FacebookProto> g_Instances;
-
// Contact menu items
HGENMENU g_hContactMenuVisitProfile;
HGENMENU g_hContactMenuVisitFriendship;
@@ -69,23 +67,10 @@ HANDLE GetIconHandle(const char* name) }
// Helper functions
-static FacebookProto * GetInstanceByHContact(MCONTACT hContact)
-{
- char *proto = GetContactProto(hContact);
- if (!proto)
- return nullptr;
-
- for (auto &it : g_Instances)
- if (!mir_strcmp(proto, it->m_szModuleName))
- return it;
-
- return nullptr;
-}
-
template<INT_PTR(__cdecl FacebookProto::*Fcn)(WPARAM, LPARAM)>
INT_PTR GlobalService(WPARAM wParam, LPARAM lParam)
{
- FacebookProto *proto = GetInstanceByHContact(MCONTACT(wParam));
+ FacebookProto *proto = CMPlugin::getInstance(MCONTACT(wParam));
return proto ? (proto->*Fcn)(wParam, lParam) : 0;
}
@@ -102,7 +87,7 @@ static int PrebuildContactMenu(WPARAM wParam, LPARAM lParam) Menu_ShowItem(g_hContactMenuLoadHistory, false);
// Process them in correct account
- FacebookProto *proto = GetInstanceByHContact(MCONTACT(wParam));
+ FacebookProto *proto = CMPlugin::getInstance(MCONTACT(wParam));
return proto ? proto->OnPrebuildContactMenu(wParam, lParam) : 0;
}
diff --git a/protocols/Gadu-Gadu/src/gg.cpp b/protocols/Gadu-Gadu/src/gg.cpp index 31ba420df2..8aeffc1391 100644 --- a/protocols/Gadu-Gadu/src/gg.cpp +++ b/protocols/Gadu-Gadu/src/gg.cpp @@ -38,12 +38,12 @@ PLUGININFOEX pluginInfo = { };
// Other variables
+CMPlugin g_plugin;
HINSTANCE hInstance;
SSL_API sslApi;
CLIST_INTERFACE *pcli;
int hLangpack;
-LIST<GaduProto> g_Instances(1, PtrKeySortT);
static unsigned long crc_table[256];
@@ -214,27 +214,11 @@ static int gg_modulesloaded(WPARAM, LPARAM) }
//////////////////////////////////////////////////////////
-// Gets protocol instance associated with a contact
-//
-static GaduProto* gg_getprotoinstance(MCONTACT hContact)
-{
- char* szProto = GetContactProto(hContact);
- if (szProto == nullptr)
- return nullptr;
-
- for (auto &it : g_Instances)
- if (mir_strcmp(szProto, it->m_szModuleName) == 0)
- return it;
-
- return nullptr;
-}
-
-//////////////////////////////////////////////////////////
// Handles PrebuildContactMenu event
//
static int gg_prebuildcontactmenu(WPARAM hContact, LPARAM)
{
- GaduProto* gg = gg_getprotoinstance(hContact);
+ GaduProto* gg = CMPlugin::getInstance(hContact);
if (gg == nullptr)
return 0;
@@ -437,30 +421,3 @@ BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD, LPVOID) #endif
return TRUE;
}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static PROTO_INTERFACE* gg_proto_init(const char *pszProtoName, const wchar_t *tszUserName)
-{
- GaduProto *gg = new GaduProto(pszProtoName, tszUserName);
- g_Instances.insert(gg);
- return gg;
-}
-
-static int gg_proto_uninit(PROTO_INTERFACE *proto)
-{
- GaduProto *gg = (GaduProto*)proto;
- g_Instances.remove(gg);
- delete gg;
- return 0;
-}
-
-struct CMPlugin : public CMPluginBase
-{
- CMPlugin() :
- CMPluginBase(GGDEF_PROTO)
- {
- RegisterProtocol(PROTOTYPE_PROTOCOL, gg_proto_init, gg_proto_uninit);
- }
-}
- g_plugin;
diff --git a/protocols/Gadu-Gadu/src/gg.h b/protocols/Gadu-Gadu/src/gg.h index 558c3227d3..2e74058d02 100644 --- a/protocols/Gadu-Gadu/src/gg.h +++ b/protocols/Gadu-Gadu/src/gg.h @@ -260,7 +260,6 @@ struct GaduProto; extern HINSTANCE hInstance;
extern CLIST_INTERFACE *pcli;
-extern LIST<GaduProto> g_Instances;
extern PLUGININFOEX pluginInfo;
extern IconItem iconList[];
extern SSL_API sslApi;
diff --git a/protocols/Gadu-Gadu/src/gg_proto.h b/protocols/Gadu-Gadu/src/gg_proto.h index 543c936ea4..ff973f010d 100644 --- a/protocols/Gadu-Gadu/src/gg_proto.h +++ b/protocols/Gadu-Gadu/src/gg_proto.h @@ -309,5 +309,11 @@ inline void GaduProto::gg_sleep(DWORD miliseconds, BOOL alterable, char* calling #endif
}
+struct CMPlugin : public ACCPROTOPLUGIN<GaduProto>
+{
+ CMPlugin() :
+ ACCPROTOPLUGIN<GaduProto>(GGDEF_PROTO)
+ {}
+};
#endif
diff --git a/protocols/Gadu-Gadu/src/libgadu/libgadu.cpp b/protocols/Gadu-Gadu/src/libgadu/libgadu.cpp index edfc7fd034..931d55810d 100644 --- a/protocols/Gadu-Gadu/src/libgadu/libgadu.cpp +++ b/protocols/Gadu-Gadu/src/libgadu/libgadu.cpp @@ -565,8 +565,8 @@ void *gg_recv_packet(struct gg_session *sess) h.type = gg_fix32(h.type);
h.length = gg_fix32(h.length);
- } else
- memcpy(&h, sess->recv_buf, sizeof(h));
+ }
+ else memcpy(&h, sess->recv_buf, sizeof(h));
/* jakieÅ› sensowne limity na rozmiar pakietu */
if (h.length > 65535) {
diff --git a/protocols/Gadu-Gadu/src/links.cpp b/protocols/Gadu-Gadu/src/links.cpp index 295e9dbcf2..4d95b0fc01 100644 --- a/protocols/Gadu-Gadu/src/links.cpp +++ b/protocols/Gadu-Gadu/src/links.cpp @@ -41,7 +41,7 @@ static INT_PTR gg_parselink(WPARAM, LPARAM lParam) {
char *arg = (char*)lParam;
- if (g_Instances.getCount() == 0)
+ if (CMPlugin::g_arInstances.getCount() == 0)
return 0;
if (arg == nullptr)
@@ -60,7 +60,7 @@ static INT_PTR gg_parselink(WPARAM, LPARAM lParam) GaduProto *gg = nullptr;
int items = 0;
- for (auto &it : g_Instances) {
+ for (auto &it : CMPlugin::g_arInstances) {
gg = it;
if (it->m_iStatus > ID_STATUS_OFFLINE) {
++items;
@@ -117,7 +117,7 @@ void GaduProto::links_instance_init() if (ServiceExists(MS_ASSOCMGR_ADDNEWURLTYPE)) {
CMenuItem mi;
mi.flags = CMIF_UNICODE;
- mi.position = g_Instances.getCount();
+ mi.position = CMPlugin::g_arInstances.getCount();
mi.name.w = m_tszUserName;
hInstanceMenuItem = Menu_AddItem(hInstanceMenu, &mi, this);
}
diff --git a/protocols/IRCG/src/irclib.cpp b/protocols/IRCG/src/irclib.cpp index 28db677271..1dea025bbe 100644 --- a/protocols/IRCG/src/irclib.cpp +++ b/protocols/IRCG/src/irclib.cpp @@ -1412,7 +1412,7 @@ LBL_Parse: if (iParamCnt != 2) cbLen = mir_snprintf(buf, "%s : ERROR : UNKNOWN-ERROR\r\n", szBuf); else { - for (auto &it : g_Instances) + for (auto &it : CMPlugin::g_arInstances) if (PeerPortNrRcvd == it->m_info.iPort && LocalPortNrRcvd == it->m_myLocalPort) { cbLen = mir_snprintf(buf, "%s : USERID : %S : %S\r\n", szBuf, it->m_info.sIdentServerType.c_str(), it->m_info.sUserID.c_str()); diff --git a/protocols/IRCG/src/main.cpp b/protocols/IRCG/src/main.cpp index 81ff6f6581..1dd78c6e77 100644 --- a/protocols/IRCG/src/main.cpp +++ b/protocols/IRCG/src/main.cpp @@ -22,6 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "stdafx.h"
#include "version.h"
+CMPlugin g_plugin;
CHAT_MANAGER *pci;
CLIST_INTERFACE *pcli;
HINSTANCE hInst = nullptr;
@@ -35,13 +36,6 @@ static int CompareServers( const SERVER_INFO* p1, const SERVER_INFO* p2 ) OBJLIST<SERVER_INFO> g_servers( 20, CompareServers );
-static int sttCompareProtocols(const CIrcProto *p1, const CIrcProto *p2)
-{
- return mir_strcmp(p1->m_szModuleName, p2->m_szModuleName);
-}
-
-LIST<CIrcProto> g_Instances(1, sttCompareProtocols);
-
void UninitTimers( void );
// Information about the plugin
@@ -93,29 +87,3 @@ extern "C" int __declspec(dllexport) Unload(void) UninitTimers();
return 0;
}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static PROTO_INTERFACE* ircProtoInit(const char* pszProtoName, const wchar_t* tszUserName)
-{
- CIrcProto *ppro = new CIrcProto(pszProtoName, tszUserName);
- g_Instances.insert(ppro);
- return ppro;
-}
-
-static int ircProtoUninit(PROTO_INTERFACE *ppro)
-{
- g_Instances.remove((CIrcProto*)ppro);
- delete (CIrcProto*)ppro;
- return 0;
-}
-
-struct CMPlugin : public CMPluginBase
-{
- CMPlugin() :
- CMPluginBase("IRC")
- {
- RegisterProtocol(PROTOTYPE_PROTOCOL, ircProtoInit, ircProtoUninit);
- }
-}
- g_plugin;
diff --git a/protocols/IRCG/src/services.cpp b/protocols/IRCG/src/services.cpp index 1bb2274f9c..b6775b8b05 100644 --- a/protocols/IRCG/src/services.cpp +++ b/protocols/IRCG/src/services.cpp @@ -64,52 +64,39 @@ void CIrcProto::InitMainMenus(void) static HGENMENU hUMenuChanSettings, hUMenuWhois, hUMenuDisconnect, hUMenuIgnore;
-static CIrcProto* IrcGetInstanceByHContact(MCONTACT hContact)
+static INT_PTR IrcMenuChanSettings(WPARAM hContact, LPARAM lParam)
{
- char* szProto = GetContactProto(hContact);
- if (szProto == nullptr)
- return nullptr;
-
- for (auto &it : g_Instances)
- if (!mir_strcmp(szProto, it->m_szModuleName))
- return it;
-
- return nullptr;
-}
-
-static INT_PTR IrcMenuChanSettings(WPARAM wParam, LPARAM lParam)
-{
- CIrcProto *ppro = IrcGetInstanceByHContact(wParam);
- return (ppro) ? ppro->OnMenuChanSettings(wParam, lParam) : 0;
+ CIrcProto *ppro = CMPlugin::getInstance(hContact);
+ return (ppro) ? ppro->OnMenuChanSettings(hContact, lParam) : 0;
}
-static INT_PTR IrcMenuWhois(WPARAM wParam, LPARAM lParam)
+static INT_PTR IrcMenuWhois(WPARAM hContact, LPARAM lParam)
{
- CIrcProto *ppro = IrcGetInstanceByHContact(wParam);
- return (ppro) ? ppro->OnMenuWhois(wParam, lParam) : 0;
+ CIrcProto *ppro = CMPlugin::getInstance(hContact);
+ return (ppro) ? ppro->OnMenuWhois(hContact, lParam) : 0;
}
-static INT_PTR IrcMenuDisconnect(WPARAM wParam, LPARAM lParam)
+static INT_PTR IrcMenuDisconnect(WPARAM hContact, LPARAM lParam)
{
- CIrcProto *ppro = IrcGetInstanceByHContact(wParam);
- return (ppro) ? ppro->OnMenuDisconnect(wParam, lParam) : 0;
+ CIrcProto *ppro = CMPlugin::getInstance(hContact);
+ return (ppro) ? ppro->OnMenuDisconnect(hContact, lParam) : 0;
}
-static INT_PTR IrcMenuIgnore(WPARAM wParam, LPARAM lParam)
+static INT_PTR IrcMenuIgnore(WPARAM hContact, LPARAM lParam)
{
- CIrcProto *ppro = IrcGetInstanceByHContact(wParam);
- return (ppro) ? ppro->OnMenuIgnore(wParam, lParam) : 0;
+ CIrcProto *ppro = CMPlugin::getInstance(hContact);
+ return (ppro) ? ppro->OnMenuIgnore(hContact, lParam) : 0;
}
-int IrcPrebuildContactMenu(WPARAM wParam, LPARAM lParam)
+int IrcPrebuildContactMenu(WPARAM hContact, LPARAM lParam)
{
Menu_ShowItem(hUMenuChanSettings, false);
Menu_ShowItem(hUMenuWhois, false);
Menu_ShowItem(hUMenuDisconnect, false);
Menu_ShowItem(hUMenuIgnore, false);
- CIrcProto *ppro = IrcGetInstanceByHContact(wParam);
- return (ppro) ? ppro->OnMenuPreBuild(wParam, lParam) : 0;
+ CIrcProto *ppro = CMPlugin::getInstance(hContact);
+ return (ppro) ? ppro->OnMenuPreBuild(hContact, lParam) : 0;
}
void InitContactMenus(void)
diff --git a/protocols/IRCG/src/stdafx.h b/protocols/IRCG/src/stdafx.h index eef1cb6a10..6b0f5e659e 100644 --- a/protocols/IRCG/src/stdafx.h +++ b/protocols/IRCG/src/stdafx.h @@ -587,6 +587,13 @@ private: CMStringW sNick4Perform;
};
+struct CMPlugin : public ACCPROTOPLUGIN<CIrcProto>
+{
+ CMPlugin() :
+ ACCPROTOPLUGIN<CIrcProto>("IRC")
+ {}
+};
+
// map actual member functions to their associated IRC command.
// put any number of this macro in the class's constructor.
#define IRC_MAP_ENTRY(name, member) \
@@ -598,8 +605,6 @@ private: //main.cpp
extern HINSTANCE hInst;
-extern LIST<CIrcProto> g_Instances;
-
extern OBJLIST<SERVER_INFO> g_servers;
CIrcProto* GetTimerOwner(UINT_PTR eventId);
diff --git a/protocols/IcqOscarJ/src/icq_menu.cpp b/protocols/IcqOscarJ/src/icq_menu.cpp index 97fa93ab52..827f3e9c09 100644 --- a/protocols/IcqOscarJ/src/icq_menu.cpp +++ b/protocols/IcqOscarJ/src/icq_menu.cpp @@ -30,41 +30,21 @@ HGENMENU g_hContactMenuItems[3];
HANDLE g_hContactMenuSvc[3];
-static int sttCompareProtocols(const CIcqProto *p1, const CIcqProto *p2)
-{
- return mir_strcmp(p1->m_szModuleName, p2->m_szModuleName);
-}
-
-LIST<CIcqProto> g_Instances(1, sttCompareProtocols);
-
-static CIcqProto* IcqGetInstanceByHContact(MCONTACT hContact)
-{
- char* szProto = GetContactProto(hContact);
- if (szProto == nullptr)
- return nullptr;
-
- for (auto &it : g_Instances)
- if (!mir_strcmp(szProto, it->m_szModuleName))
- return it;
-
- return nullptr;
-}
-
static INT_PTR IcqMenuHandleAddServContact(WPARAM wParam, LPARAM lParam)
{
- CIcqProto* ppro = IcqGetInstanceByHContact(wParam);
+ CIcqProto* ppro = CMPlugin::getInstance(wParam);
return (ppro) ? ppro->AddServerContact(wParam, lParam) : 0;
}
static INT_PTR IcqMenuHandleXStatusDetails(WPARAM wParam, LPARAM lParam)
{
- CIcqProto* ppro = IcqGetInstanceByHContact(wParam);
+ CIcqProto* ppro = CMPlugin::getInstance(wParam);
return (ppro) ? ppro->ShowXStatusDetails(wParam, lParam) : 0;
}
static INT_PTR IcqMenuHandleOpenProfile(WPARAM wParam, LPARAM lParam)
{
- CIcqProto* ppro = IcqGetInstanceByHContact(wParam);
+ CIcqProto* ppro = CMPlugin::getInstance(wParam);
return (ppro) ? ppro->OpenWebProfile(wParam, lParam) : 0;
}
@@ -74,7 +54,7 @@ static int IcqPrebuildContactMenu( WPARAM wParam, LPARAM lParam ) Menu_ShowItem(g_hContactMenuItems[ICMI_XSTATUS_DETAILS], FALSE);
Menu_ShowItem(g_hContactMenuItems[ICMI_OPEN_PROFILE], FALSE);
- CIcqProto* ppro = IcqGetInstanceByHContact(wParam);
+ CIcqProto* ppro = CMPlugin::getInstance(wParam);
return (ppro) ? ppro->OnPreBuildContactMenu(wParam, lParam) : 0;
}
diff --git a/protocols/IcqOscarJ/src/icq_proto.h b/protocols/IcqOscarJ/src/icq_proto.h index 004a7148ed..08fff03c9e 100644 --- a/protocols/IcqOscarJ/src/icq_proto.h +++ b/protocols/IcqOscarJ/src/icq_proto.h @@ -895,4 +895,11 @@ struct CIcqProto : public PROTO<CIcqProto> bool validateStatusMessageRequest(MCONTACT hContact, WORD byMessageType);
};
+struct CMPlugin : public ACCPROTOPLUGIN<CIcqProto>
+{
+ CMPlugin() :
+ ACCPROTOPLUGIN<CIcqProto>(ICQ_PROTOCOL_NAME)
+ {}
+};
+
#endif
diff --git a/protocols/IcqOscarJ/src/init.cpp b/protocols/IcqOscarJ/src/init.cpp index fb53d2312e..46e5b68c17 100644 --- a/protocols/IcqOscarJ/src/init.cpp +++ b/protocols/IcqOscarJ/src/init.cpp @@ -28,6 +28,7 @@ #include "m_extraicons.h"
#include "m_icolib.h"
+CMPlugin g_plugin;
HINSTANCE hInst;
int hLangpack;
CLIST_INTERFACE *pcli;
@@ -161,28 +162,3 @@ void CIcqProto::UpdateGlobalSettings() m_bMoodsEnabled = getByte("MoodsEnabled", DEFAULT_MOODS_ENABLED);
}
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static PROTO_INTERFACE* icqProtoInit(const char* pszProtoName, const wchar_t* tszUserName)
-{
- CIcqProto *ppro = new CIcqProto(pszProtoName, tszUserName);
- g_Instances.insert(ppro);
- return ppro;
-}
-
-static int icqProtoUninit(PROTO_INTERFACE* ppro)
-{
- g_Instances.remove((CIcqProto*)ppro);
- delete (CIcqProto*)ppro;
- return 0;
-}
-
-struct CMPlugin : public CMPluginBase
-{
- CMPlugin() :
- CMPluginBase(ICQ_PROTOCOL_NAME)
- {
- RegisterProtocol(PROTOTYPE_PROTOCOL, icqProtoInit, icqProtoUninit);
- }
-}
- g_plugin;
diff --git a/protocols/IcqOscarJ/src/stdafx.h b/protocols/IcqOscarJ/src/stdafx.h index 61877a2a58..303c6f363e 100644 --- a/protocols/IcqOscarJ/src/stdafx.h +++ b/protocols/IcqOscarJ/src/stdafx.h @@ -118,6 +118,5 @@ #include "icq_popups.h"
#include "icq_proto.h"
-extern LIST<CIcqProto> g_Instances;
extern bool g_bTerminated;
extern IconItem iconList[];
\ No newline at end of file diff --git a/protocols/JabberG/src/jabber.cpp b/protocols/JabberG/src/jabber.cpp index 06523ae7eb..b5860eb292 100755 --- a/protocols/JabberG/src/jabber.cpp +++ b/protocols/JabberG/src/jabber.cpp @@ -38,6 +38,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. HINSTANCE hInst;
HMODULE hMsftedit;
+CMPlugin g_plugin;
int hLangpack;
unsigned int g_nTempFileId;
CHAT_MANAGER *pci;
@@ -71,14 +72,6 @@ void JabberUserInfoUninit(void); bool bSecureIM, bMirOTR, bNewGPG, bPlatform;
/////////////////////////////////////////////////////////////////////////////
-// Protocol instances
-static int sttCompareProtocols(const CJabberProto *p1, const CJabberProto *p2)
-{
- return mir_wstrcmp(p1->m_tszUserName, p2->m_tszUserName);
-}
-
-LIST<CJabberProto> g_Instances(1, sttCompareProtocols);
-/////////////////////////////////////////////////////////////////////////////
BOOL WINAPI DllMain(HINSTANCE hModule, DWORD, LPVOID)
{
@@ -227,29 +220,3 @@ extern "C" int __declspec(dllexport) Unload(void) g_MenuUninit();
return 0;
}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static PROTO_INTERFACE* jabberProtoInit(const char* pszProtoName, const wchar_t *tszUserName)
-{
- CJabberProto *ppro = new CJabberProto(pszProtoName, tszUserName);
- g_Instances.insert(ppro);
- return ppro;
-}
-
-static int jabberProtoUninit(PROTO_INTERFACE *ppro)
-{
- g_Instances.remove((CJabberProto*)ppro);
- delete (CJabberProto*)ppro;
- return 0;
-}
-
-struct CMPlugin : public CMPluginBase
-{
- CMPlugin() :
- CMPluginBase(GLOBAL_SETTING_MODULE)
- {
- RegisterProtocol(PROTOTYPE_PROTOCOL, jabberProtoInit, jabberProtoUninit);
- }
-}
- g_plugin;
diff --git a/protocols/JabberG/src/jabber_menu.cpp b/protocols/JabberG/src/jabber_menu.cpp index 63f4cd2899..585f7c2b58 100644 --- a/protocols/JabberG/src/jabber_menu.cpp +++ b/protocols/JabberG/src/jabber_menu.cpp @@ -72,74 +72,61 @@ static INT_PTR JabberMenuChooseService(WPARAM wParam, LPARAM lParam) return 0;
}
-static CJabberProto* JabberGetInstanceByHContact(MCONTACT hContact)
+static INT_PTR JabberMenuConvertChatContact(WPARAM hContact, LPARAM lParam)
{
- char *szProto = GetContactProto(hContact);
- if (szProto == nullptr)
- return nullptr;
-
- for (auto &it : g_Instances)
- if (!mir_strcmp(szProto, it->m_szModuleName))
- return it;
-
- return nullptr;
-}
-
-static INT_PTR JabberMenuConvertChatContact(WPARAM wParam, LPARAM lParam)
-{
- CJabberProto *ppro = JabberGetInstanceByHContact(wParam);
- return(ppro) ? ppro->OnMenuConvertChatContact(wParam, lParam) : 0;
+ CJabberProto *ppro = CMPlugin::getInstance(hContact);
+ return(ppro) ? ppro->OnMenuConvertChatContact(hContact, lParam) : 0;
}
-static INT_PTR JabberMenuRosterAdd(WPARAM wParam, LPARAM lParam)
+static INT_PTR JabberMenuRosterAdd(WPARAM hContact, LPARAM lParam)
{
- CJabberProto *ppro = JabberGetInstanceByHContact(wParam);
- return(ppro) ? ppro->OnMenuRosterAdd(wParam, lParam) : 0;
+ CJabberProto *ppro = CMPlugin::getInstance(hContact);
+ return(ppro) ? ppro->OnMenuRosterAdd(hContact, lParam) : 0;
}
-static INT_PTR JabberMenuBookmarkAdd(WPARAM wParam, LPARAM lParam)
+static INT_PTR JabberMenuBookmarkAdd(WPARAM hContact, LPARAM lParam)
{
- CJabberProto *ppro = JabberGetInstanceByHContact(wParam);
- return(ppro) ? ppro->OnMenuBookmarkAdd(wParam, lParam) : 0;
+ CJabberProto *ppro = CMPlugin::getInstance(hContact);
+ return(ppro) ? ppro->OnMenuBookmarkAdd(hContact, lParam) : 0;
}
-static INT_PTR JabberMenuTransportLogin(WPARAM wParam, LPARAM lParam)
+static INT_PTR JabberMenuTransportLogin(WPARAM hContact, LPARAM lParam)
{
- CJabberProto *ppro = JabberGetInstanceByHContact(wParam);
- return(ppro) ? ppro->OnMenuTransportLogin(wParam, lParam) : 0;
+ CJabberProto *ppro = CMPlugin::getInstance(hContact);
+ return(ppro) ? ppro->OnMenuTransportLogin(hContact, lParam) : 0;
}
-static INT_PTR JabberMenuTransportResolve(WPARAM wParam, LPARAM lParam)
+static INT_PTR JabberMenuTransportResolve(WPARAM hContact, LPARAM lParam)
{
- CJabberProto *ppro = JabberGetInstanceByHContact(wParam);
- return(ppro) ? ppro->OnMenuTransportResolve(wParam, lParam) : 0;
+ CJabberProto *ppro = CMPlugin::getInstance(hContact);
+ return(ppro) ? ppro->OnMenuTransportResolve(hContact, lParam) : 0;
}
-static INT_PTR JabberContactMenuRunCommands(WPARAM wParam, LPARAM lParam)
+static INT_PTR JabberContactMenuRunCommands(WPARAM hContact, LPARAM lParam)
{
- CJabberProto *ppro = JabberGetInstanceByHContact(wParam);
- return(ppro) ? ppro->ContactMenuRunCommands(wParam, lParam) : 0;
+ CJabberProto *ppro = CMPlugin::getInstance(hContact);
+ return(ppro) ? ppro->ContactMenuRunCommands(hContact, lParam) : 0;
}
-static INT_PTR JabberMenuSendNote(WPARAM wParam, LPARAM lParam)
+static INT_PTR JabberMenuSendNote(WPARAM hContact, LPARAM lParam)
{
- CJabberProto *ppro = JabberGetInstanceByHContact(wParam);
- return(ppro) ? ppro->OnMenuSendNote(wParam, lParam) : 0;
+ CJabberProto *ppro = CMPlugin::getInstance(hContact);
+ return(ppro) ? ppro->OnMenuSendNote(hContact, lParam) : 0;
}
-static INT_PTR JabberMenuHandleResource(WPARAM wParam, LPARAM lParam, LPARAM lRes)
+static INT_PTR JabberMenuHandleResource(WPARAM hContact, LPARAM lParam, LPARAM lRes)
{
- CJabberProto *ppro = JabberGetInstanceByHContact(wParam);
- return(ppro) ? ppro->OnMenuHandleResource(wParam, lParam, lRes) : 0;
+ CJabberProto *ppro = CMPlugin::getInstance(hContact);
+ return(ppro) ? ppro->OnMenuHandleResource(hContact, lParam, lRes) : 0;
}
-static INT_PTR JabberMenuHandleDirectPresence(WPARAM wParam, LPARAM lParam, LPARAM lRes)
+static INT_PTR JabberMenuHandleDirectPresence(WPARAM hContact, LPARAM lParam, LPARAM lRes)
{
- CJabberProto *ppro = JabberGetInstanceByHContact(wParam);
- return(ppro) ? ppro->OnMenuHandleDirectPresence(wParam, lParam, lRes) : 0;
+ CJabberProto *ppro = CMPlugin::getInstance(hContact);
+ return(ppro) ? ppro->OnMenuHandleDirectPresence(hContact, lParam, lRes) : 0;
}
-static int JabberPrebuildContactMenu(WPARAM wParam, LPARAM lParam)
+static int JabberPrebuildContactMenu(WPARAM hContact, LPARAM lParam)
{
Menu_ShowItem(g_hMenuCommands, FALSE);
Menu_ShowItem(g_hMenuSendNote, FALSE);
@@ -151,8 +138,8 @@ static int JabberPrebuildContactMenu(WPARAM wParam, LPARAM lParam) Menu_ShowItem(g_hMenuResourcesRoot, FALSE);
Menu_ShowItem(g_hMenuDirectPresence[0], FALSE);
- CJabberProto *ppro = JabberGetInstanceByHContact(wParam);
- return(ppro) ? ppro->OnPrebuildContactMenu(wParam, lParam) : 0;
+ CJabberProto *ppro = CMPlugin::getInstance(hContact);
+ return(ppro) ? ppro->OnPrebuildContactMenu(hContact, lParam) : 0;
}
void g_MenuInit(void)
@@ -790,7 +777,7 @@ static INT_PTR g_ToolbarHandleServiceDiscovery(WPARAM w, LPARAM l) int g_OnToolbarInit(WPARAM, LPARAM)
{
- if (g_Instances.getCount() == 0)
+ if (CMPlugin::g_arInstances.getCount() == 0)
return 0;
TTBButton ttb = {};
@@ -1043,25 +1030,26 @@ INT_PTR __cdecl CJabberProto::OnMenuHandleDirectPresence(WPARAM hContact, LPARAM CJabberProto* JabberChooseInstance(bool bIsLink)
{
- if (g_Instances.getCount() == 0)
+ if (CMPlugin::g_arInstances.getCount() == 0)
return nullptr;
- if (g_Instances.getCount() == 1) {
- if (g_Instances[0]->m_iStatus != ID_STATUS_OFFLINE && g_Instances[0]->m_iStatus != ID_STATUS_CONNECTING)
- return g_Instances[0];
+ if (CMPlugin::g_arInstances.getCount() == 1) {
+ if (CMPlugin::g_arInstances[0].m_iStatus != ID_STATUS_OFFLINE && CMPlugin::g_arInstances[0].m_iStatus != ID_STATUS_CONNECTING)
+ return &CMPlugin::g_arInstances[0];
+
return nullptr;
}
if (bIsLink)
- for (auto &it : g_Instances)
+ for (auto &it : CMPlugin::g_arInstances)
if (it->m_bProcessXMPPLinks)
return it;
int nItems = 0, lastItemId = 0;
- for (auto &ppro : g_Instances) {
+ for (auto &ppro : CMPlugin::g_arInstances) {
if (ppro->m_iStatus != ID_STATUS_OFFLINE && ppro->m_iStatus != ID_STATUS_CONNECTING) {
++nItems;
- lastItemId = g_Instances.indexOf(&ppro) + 1;
+ lastItemId = CMPlugin::g_arInstances.indexOf(&ppro) + 1;
Menu_ModifyItem(ppro->m_hChooseMenuItem, nullptr, Skin_LoadProtoIcon(ppro->m_szModuleName, ppro->m_iStatus));
}
else Menu_ShowItem(ppro->m_hChooseMenuItem, false);
@@ -1085,5 +1073,5 @@ CJabberProto* JabberChooseInstance(bool bIsLink) return nullptr;
}
- return lastItemId ? g_Instances[lastItemId - 1] : nullptr;
+ return lastItemId ? &CMPlugin::g_arInstances[lastItemId - 1] : nullptr;
}
diff --git a/protocols/JabberG/src/jabber_proto.h b/protocols/JabberG/src/jabber_proto.h index 729ca52efe..15ce0aeb26 100755 --- a/protocols/JabberG/src/jabber_proto.h +++ b/protocols/JabberG/src/jabber_proto.h @@ -933,6 +933,11 @@ private: JabberFeatCapPairDynamic *FindFeature(const wchar_t *szFeature);
};
-extern LIST<CJabberProto> g_Instances;
+struct CMPlugin : public ACCPROTOPLUGIN<CJabberProto>
+{
+ CMPlugin() :
+ ACCPROTOPLUGIN<CJabberProto>("JABBER")
+ {}
+};
#endif
diff --git a/protocols/MRA/src/Mra.cpp b/protocols/MRA/src/Mra.cpp index 49eded7d0a..79dfebf977 100644 --- a/protocols/MRA/src/Mra.cpp +++ b/protocols/MRA/src/Mra.cpp @@ -1,9 +1,9 @@ #include "stdafx.h"
-LIST<CMraProto> g_Instances(1, PtrKeySortT);
+CMPlugin g_plugin;
-CLIST_INTERFACE *pcli;
int hLangpack;
+CLIST_INTERFACE *pcli;
PLUGININFOEX pluginInfoEx = {
sizeof(PLUGININFOEX),
@@ -78,29 +78,3 @@ extern "C" __declspec(dllexport) int Unload(void) return 0;
}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static PROTO_INTERFACE* mraProtoInit(const char* pszProtoName, const wchar_t* tszUserName)
-{
- CMraProto *ppro = new CMraProto(pszProtoName, tszUserName);
- g_Instances.insert(ppro);
- return ppro;
-}
-
-static int mraProtoUninit(PROTO_INTERFACE *ppro)
-{
- g_Instances.remove((CMraProto*)ppro);
- delete (CMraProto*)ppro;
- return 0;
-}
-
-struct CMPlugin : public CMPluginBase
-{
- CMPlugin() :
- CMPluginBase("MRA")
- {
- RegisterProtocol(PROTOTYPE_PROTOCOL, mraProtoInit, mraProtoUninit);
- }
-}
- g_plugin;
diff --git a/protocols/MRA/src/MraProto.cpp b/protocols/MRA/src/MraProto.cpp index 5fd2a0f03f..89f2046dae 100644 --- a/protocols/MRA/src/MraProto.cpp +++ b/protocols/MRA/src/MraProto.cpp @@ -2,7 +2,7 @@ static int MraExtraIconsApplyAll(WPARAM, LPARAM)
{
- for (auto &it : g_Instances)
+ for (auto &it : CMPlugin::g_arInstances)
it->MraExtraIconsApply(0, 0);
return 0;
}
diff --git a/protocols/MRA/src/MraProto.h b/protocols/MRA/src/MraProto.h index a9a95fbc07..b6f2bede82 100644 --- a/protocols/MRA/src/MraProto.h +++ b/protocols/MRA/src/MraProto.h @@ -339,3 +339,10 @@ struct CMraProto : public PROTO<CMraProto> void __cdecl MraAvatarsThreadProc(LPVOID lpParameter);
};
+
+struct CMPlugin : public ACCPROTOPLUGIN<CMraProto>
+{
+ CMPlugin() :
+ ACCPROTOPLUGIN<CMraProto>("MRA")
+ {}
+};
diff --git a/protocols/MRA/src/Mra_proto.cpp b/protocols/MRA/src/Mra_proto.cpp index 35faa0405c..bad5ab3340 100644 --- a/protocols/MRA/src/Mra_proto.cpp +++ b/protocols/MRA/src/Mra_proto.cpp @@ -1647,7 +1647,7 @@ DWORD CMraProto::MraRecvCommand_Message(DWORD dwTime, DWORD dwFlags, CMStringA & debugLogA("Processing message: %08X, from '%s', text '%S'\n", dwFlags, plpsFrom.c_str(), wszMessage.c_str());
// processing
- if (dwFlags & (MESSAGE_FLAG_SMS | MESSAGE_SMS_DELIVERY_REPORT)) {// SMS //if (IsPhone(plpsFrom->lpszData, plpsFrom->dwSize))
+ if (dwFlags & (MESSAGE_FLAG_SMS | MESSAGE_SMS_DELIVERY_REPORT)) { // SMS
INTERNET_TIME itTime;
InternetTimeGetCurrentTime(&itTime);
CMStringA szTime = InternetTimeGetString(&itTime);
diff --git a/protocols/MRA/src/stdafx.h b/protocols/MRA/src/stdafx.h index dd94bdfbb9..df92980ad9 100644 --- a/protocols/MRA/src/stdafx.h +++ b/protocols/MRA/src/stdafx.h @@ -169,12 +169,8 @@ extern WCHAR g_szMirWorkDirPath[MAX_FILEPATH]; /////////////////////////////////////////////////////////////////////////////////////////
// External variables
-extern LIST<CMraProto> g_Instances;
-
extern HANDLE hXStatusAdvancedStatusIcons[];
-void InitExtraIcons();
-
CMStringA MraGetSelfVersionString();
#define SetBit(bytes, bitpos) bytes |= (1<<bitpos)
@@ -204,12 +200,7 @@ bool IsContactMraProto(MCONTACT hContact); bool IsEMailMR(const CMStringA& szEmail);
bool GetEMailFromString(const CMStringA& szBuff, CMStringA& szEmail);
-bool IsPhone(LPSTR lpszString, size_t dwStringSize);
-bool IsContactPhone(MCONTACT hContact, LPSTR lpszPhone, size_t dwPhoneSize);
-HANDLE MraHContactFromPhone(LPSTR lpszPhone, size_t dwPhoneSize, BOOL bAddIfNeeded, BOOL bTemporary, BOOL *pbAdded);
void EnableControlsArray(HWND hWndDlg, WORD *pwControlsList, size_t dwControlsListCount, BOOL bEnabled);
-bool MraRequestXStatusDetails(DWORD dwXStatus);
-bool MraSendReplyBlogStatus(MCONTACT hContact);
DWORD GetYears(CONST PSYSTEMTIME pcstSystemTime);
DWORD FindFile(LPWSTR lpszFolder, DWORD dwFolderLen, LPWSTR lpszFileName, DWORD dwFileNameLen, LPWSTR lpszRetFilePathName, DWORD dwRetFilePathLen, DWORD *pdwRetFilePathLen);
diff --git a/protocols/MSN/src/msn.cpp b/protocols/MSN/src/msn.cpp index 71dc64eb4f..bc2d78b797 100644 --- a/protocols/MSN/src/msn.cpp +++ b/protocols/MSN/src/msn.cpp @@ -24,6 +24,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "msn_proto.h"
#include "version.h"
+CMPlugin g_plugin;
CLIST_INTERFACE *pcli;
HINSTANCE g_hInst, g_hOpenssl = nullptr;
int hLangpack;
@@ -60,8 +61,6 @@ static int sttCompareProtocols(const CMsnProto *p1, const CMsnProto *p2) return mir_wstrcmp(p1->m_tszUserName, p2->m_tszUserName);
}
-OBJLIST<CMsnProto> g_Instances(1, sttCompareProtocols);
-
// Main DLL function
extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID)
{
@@ -114,28 +113,3 @@ extern "C" __declspec(dllexport) const PLUGININFOEX* MirandaPluginInfoEx(DWORD) // MirandaInterfaces - returns the protocol interface to the core
extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = { MIID_PROTOCOL, MIID_LAST };
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static PROTO_INTERFACE* msnProtoInit(const char *pszProtoName, const wchar_t *tszUserName)
-{
- CMsnProto *ppro = new CMsnProto(pszProtoName, tszUserName);
- g_Instances.insert(ppro);
- return ppro;
-}
-
-static int msnProtoUninit(PROTO_INTERFACE *ppro)
-{
- g_Instances.remove((CMsnProto*)ppro);
- return 0;
-}
-
-struct CMPlugin : public CMPluginBase
-{
- CMPlugin() :
- CMPluginBase("MSN")
- {
- RegisterProtocol(PROTOTYPE_PROTOCOL, msnProtoInit, msnProtoUninit);
- }
-}
- g_plugin;
diff --git a/protocols/MSN/src/msn_http.cpp b/protocols/MSN/src/msn_http.cpp index 6acf97a6d4..5c7fb3079d 100644 --- a/protocols/MSN/src/msn_http.cpp +++ b/protocols/MSN/src/msn_http.cpp @@ -25,11 +25,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. static ThreadData* FindThreadConn(HNETLIBCONN hConn)
{
- ThreadData *res = nullptr;
- for (int i = 0; i < g_Instances.getCount() && res == nullptr; ++i)
- res = g_Instances[i].MSN_GetThreadByConnection(hConn);
+ for (auto &it : CMPlugin::g_arInstances) {
+ ThreadData *res = it->MSN_GetThreadByConnection(hConn);
+ if (res != nullptr)
+ return res;
+ }
- return res;
+ return nullptr;
}
//=======================================================================================
diff --git a/protocols/MSN/src/msn_links.cpp b/protocols/MSN/src/msn_links.cpp index efbc79408b..dbfe54c4dc 100644 --- a/protocols/MSN/src/msn_links.cpp +++ b/protocols/MSN/src/msn_links.cpp @@ -68,10 +68,10 @@ static INT_PTR ServiceParseMsnimLink(WPARAM, LPARAM lParam) arg = NEWWSTR_ALLOCA(arg);
- if (g_Instances.getCount() == 0) return 0;
+ if (CMPlugin::g_arInstances.getCount() == 0) return 0;
- CMsnProto *proto = &g_Instances[0];
- for (auto &it : g_Instances)
+ CMsnProto *proto = &CMPlugin::g_arInstances[0];
+ for (auto &it : CMPlugin::g_arInstances)
if (it->m_iStatus > ID_STATUS_OFFLINE) {
proto = it;
break;
diff --git a/protocols/MSN/src/msn_menu.cpp b/protocols/MSN/src/msn_menu.cpp index 65807adcc6..397fabc8ec 100644 --- a/protocols/MSN/src/msn_menu.cpp +++ b/protocols/MSN/src/msn_menu.cpp @@ -186,42 +186,29 @@ void CMsnProto::MSN_EnableMenuItems(bool bEnable) //////////////////////////////////////////////////////////////////////////////////////
-static CMsnProto* GetProtoInstanceByHContact(MCONTACT hContact)
+static INT_PTR MsnMenuBlockCommand(WPARAM hContact, LPARAM lParam)
{
- char* szProto = GetContactProto(hContact);
- if (szProto == nullptr)
- return nullptr;
-
- for (auto &it : g_Instances)
- if (!mir_strcmp(szProto, it->m_szModuleName))
- return it;
-
- return nullptr;
-}
-
-static INT_PTR MsnMenuBlockCommand(WPARAM wParam, LPARAM lParam)
-{
- CMsnProto* ppro = GetProtoInstanceByHContact(wParam);
- return (ppro) ? ppro->MsnBlockCommand(wParam, lParam) : 0;
+ CMsnProto* ppro = CMPlugin::getInstance(hContact);
+ return (ppro) ? ppro->MsnBlockCommand(hContact, lParam) : 0;
}
-static INT_PTR MsnMenuViewProfile(WPARAM wParam, LPARAM lParam)
+static INT_PTR MsnMenuViewProfile(WPARAM hContact, LPARAM lParam)
{
- CMsnProto* ppro = GetProtoInstanceByHContact(wParam);
- return (ppro) ? ppro->MsnViewProfile(wParam, lParam) : 0;
+ CMsnProto* ppro = CMPlugin::getInstance(hContact);
+ return (ppro) ? ppro->MsnViewProfile(hContact, lParam) : 0;
}
-static INT_PTR MsnMenuSendHotmail(WPARAM wParam, LPARAM lParam)
+static INT_PTR MsnMenuSendHotmail(WPARAM hContact, LPARAM lParam)
{
- CMsnProto* ppro = GetProtoInstanceByHContact(wParam);
- return (ppro) ? ppro->MsnSendHotmail(wParam, lParam) : 0;
+ CMsnProto* ppro = CMPlugin::getInstance(hContact);
+ return (ppro) ? ppro->MsnSendHotmail(hContact, lParam) : 0;
}
-static int MSN_OnPrebuildContactMenu(WPARAM wParam, LPARAM lParam)
+static int MSN_OnPrebuildContactMenu(WPARAM hContact, LPARAM lParam)
{
- CMsnProto* ppro = GetProtoInstanceByHContact(wParam);
+ CMsnProto* ppro = CMPlugin::getInstance(hContact);
if (ppro)
- ppro->OnPrebuildContactMenu(wParam, lParam);
+ ppro->OnPrebuildContactMenu(hContact, lParam);
else {
Menu_ShowItem(hBlockMenuItem, false);
Menu_ShowItem(hLiveSpaceMenuItem, false);
diff --git a/protocols/MSN/src/msn_proto.h b/protocols/MSN/src/msn_proto.h index 511c311b0f..ece0e0d6a2 100644 --- a/protocols/MSN/src/msn_proto.h +++ b/protocols/MSN/src/msn_proto.h @@ -492,6 +492,11 @@ struct CMsnProto : public PROTO<CMsnProto> void setStringUtf(MCONTACT hContact, const char* name, const char* value);
};
-extern OBJLIST<CMsnProto> g_Instances;
+struct CMPlugin : public ACCPROTOPLUGIN<CMsnProto>
+{
+ CMPlugin() :
+ ACCPROTOPLUGIN<CMsnProto>("MSN")
+ {}
+};
#endif
diff --git a/protocols/MinecraftDynmap/src/main.cpp b/protocols/MinecraftDynmap/src/main.cpp index 525a037711..3c39f05077 100644 --- a/protocols/MinecraftDynmap/src/main.cpp +++ b/protocols/MinecraftDynmap/src/main.cpp @@ -22,6 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "stdafx.h" +CMPlugin g_plugin; CLIST_INTERFACE* pcli; int hLangpack; @@ -44,12 +45,6 @@ PLUGININFOEX pluginInfo = { ///////////////////////////////////////////////////////////////////////////// // Protocol instances -static int compare_protos(const MinecraftDynmapProto *p1, const MinecraftDynmapProto *p2) -{ - return wcscmp(p1->m_tszUserName, p2->m_tszUserName); -} - -OBJLIST<MinecraftDynmapProto> g_Instances(1, compare_protos); DWORD WINAPI DllMain(HINSTANCE hInstance,DWORD,LPVOID) { @@ -114,27 +109,3 @@ extern "C" int __declspec(dllexport) Unload(void) return 0; } -///////////////////////////////////////////////////////////////////////////////////////// - -static PROTO_INTERFACE* protoInit(const char *proto_name, const wchar_t *username) -{ - MinecraftDynmapProto *proto = new MinecraftDynmapProto(proto_name, username); - g_Instances.insert(proto); - return proto; -} - -static int protoUninit(PROTO_INTERFACE* proto) -{ - g_Instances.remove((MinecraftDynmapProto*)proto); - return EXIT_SUCCESS; -} - -struct CMPlugin : public CMPluginBase -{ - CMPlugin() : - CMPluginBase("MinecraftDynmap") - { - RegisterProtocol(PROTOTYPE_PROTOCOL, protoInit, protoUninit); - } -} - g_plugin; diff --git a/protocols/MinecraftDynmap/src/proto.h b/protocols/MinecraftDynmap/src/proto.h index 15327988f5..15be7bac17 100644 --- a/protocols/MinecraftDynmap/src/proto.h +++ b/protocols/MinecraftDynmap/src/proto.h @@ -129,5 +129,11 @@ public: std::string m_timestamp; int m_interval; int m_updateRate; +}; +struct CMPlugin : public ACCPROTOPLUGIN<MinecraftDynmapProto> +{ + CMPlugin() : + ACCPROTOPLUGIN<MinecraftDynmapProto>("MinecraftDynmap") + {} }; diff --git a/protocols/Omegle/src/main.cpp b/protocols/Omegle/src/main.cpp index 4d5cc3be73..d1226e7f6e 100644 --- a/protocols/Omegle/src/main.cpp +++ b/protocols/Omegle/src/main.cpp @@ -24,6 +24,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. // TODO: Make following as "globals" structure?
+CMPlugin g_plugin;
CLIST_INTERFACE* pcli;
int hLangpack;
@@ -44,15 +45,6 @@ PLUGININFOEX pluginInfo = { { 0x9e1d9244, 0x606c, 0x4ef4, { 0x99, 0xa0, 0x1d, 0x7d, 0x23, 0xcb, 0x76, 0x1 } }
};
-/////////////////////////////////////////////////////////////////////////////
-// Protocol instances
-static int compare_protos(const OmegleProto *p1, const OmegleProto *p2)
-{
- return mir_wstrcmp(p1->m_tszUserName, p2->m_tszUserName);
-}
-
-OBJLIST<OmegleProto> g_Instances(1, compare_protos);
-
DWORD WINAPI DllMain(HINSTANCE hInstance, DWORD, LPVOID)
{
g_hInstance = hInstance;
@@ -117,28 +109,3 @@ extern "C" int __declspec(dllexport) Unload(void) return 0;
}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static PROTO_INTERFACE* protoInit(const char *proto_name, const wchar_t *username)
-{
- OmegleProto *proto = new OmegleProto(proto_name, username);
- g_Instances.insert(proto);
- return proto;
-}
-
-static int protoUninit(PROTO_INTERFACE* proto)
-{
- g_Instances.remove((OmegleProto*)proto);
- return EXIT_SUCCESS;
-}
-
-struct CMPlugin : public CMPluginBase
-{
- CMPlugin() :
- CMPluginBase("Omegle")
- {
- RegisterProtocol(PROTOTYPE_PROTOCOL, protoInit, protoUninit);
- }
-}
- g_plugin;
diff --git a/protocols/Omegle/src/proto.h b/protocols/Omegle/src/proto.h index 4eac66f67e..332746c792 100644 --- a/protocols/Omegle/src/proto.h +++ b/protocols/Omegle/src/proto.h @@ -84,11 +84,7 @@ public: void StopChat(bool disconnect = true);
void NewChat();
- // Contacts handling
- //bool IsMyContact(HANDLE, bool include_chat = false);
-
// Chat handling
- void AddChat(const wchar_t *id, const wchar_t *name);
void UpdateChat(const wchar_t *name, const wchar_t *message, bool addtochat = true);
void SendChatMessage(std::string message);
void AddChatContact(const wchar_t *nick);
@@ -107,3 +103,10 @@ public: static void CALLBACK APC_callback(ULONG_PTR p);
};
+
+struct CMPlugin : public ACCPROTOPLUGIN<OmegleProto>
+{
+ CMPlugin() :
+ ACCPROTOPLUGIN<OmegleProto>("Omegle")
+ {}
+};
diff --git a/protocols/Omegle/src/theme.cpp b/protocols/Omegle/src/theme.cpp index 0dd1f6d27f..fa89da9717 100644 --- a/protocols/Omegle/src/theme.cpp +++ b/protocols/Omegle/src/theme.cpp @@ -22,8 +22,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "stdafx.h"
-extern OBJLIST<OmegleProto> g_Instances;
-
static IconItem icons[] =
{
{ LPGEN("Omegle Icon"), "omegle", IDI_OMEGLE },
diff --git a/protocols/Sametime/src/sametime.cpp b/protocols/Sametime/src/sametime.cpp index faebb0d6c3..f66a1fdddc 100644 --- a/protocols/Sametime/src/sametime.cpp +++ b/protocols/Sametime/src/sametime.cpp @@ -16,6 +16,7 @@ PLUGININFOEX pluginInfo = { 0xf1b0ba1b, 0xc91, 0x4313, { 0x85, 0xeb, 0x22, 0x50, 0x69, 0xd4, 0x4d, 0x1 } } // {F1B0BA1B-0C91-4313-85EB-225069D44D01}
};
+CMPlugin g_plugin;
CLIST_INTERFACE *pcli;
HINSTANCE hInst;
LIST<CSametimeProto> g_Instances(1, PtrKeySortT);
@@ -255,33 +256,5 @@ extern "C" int __declspec(dllexport) Load(void) extern "C" int __declspec(dllexport) Unload()
{
- g_Instances.destroy();
return 0;
}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static PROTO_INTERFACE* sametime_proto_init(const char* pszProtoName, const wchar_t* tszUserName)
-{
- CSametimeProto* proto = new CSametimeProto(pszProtoName, tszUserName);
- g_Instances.insert(proto);
- return proto;
-}
-
-static int sametime_proto_uninit(PROTO_INTERFACE* ppro)
-{
- CSametimeProto* proto = (CSametimeProto*)ppro;
- g_Instances.remove(proto);
- delete proto;
- return 0;
-}
-
-struct CMPlugin : public CMPluginBase
-{
- CMPlugin() :
- CMPluginBase("Sametime")
- {
- RegisterProtocol(PROTOTYPE_PROTOCOL, sametime_proto_init, sametime_proto_uninit);
- }
-}
- g_plugin;
diff --git a/protocols/Sametime/src/sametime.h b/protocols/Sametime/src/sametime.h index 2458028af0..f5da14c480 100644 --- a/protocols/Sametime/src/sametime.h +++ b/protocols/Sametime/src/sametime.h @@ -107,8 +107,6 @@ struct CSametimeProto; extern HINSTANCE hInst;
extern PLUGININFOEX pluginInfo;
-extern LIST<CSametimeProto> g_Instances;
-
#include "sametime_proto.h"
diff --git a/protocols/Sametime/src/sametime_proto.h b/protocols/Sametime/src/sametime_proto.h index 92170d575e..0742839875 100644 --- a/protocols/Sametime/src/sametime_proto.h +++ b/protocols/Sametime/src/sametime_proto.h @@ -143,9 +143,6 @@ struct CSametimeProto : public PROTO<CSametimeProto> void InitPlaces(mwSession* session);
void DeinitPlaces(mwSession* session);
-
-
-
/* properties */
char szProtoGroups[128];
@@ -196,7 +193,12 @@ struct CSametimeProto : public PROTO<CSametimeProto> };
-
+struct CMPlugin : public ACCPROTOPLUGIN<CSametimeProto>
+{
+ CMPlugin() :
+ ACCPROTOPLUGIN<CSametimeProto>("Sametime")
+ {}
+};
typedef struct tag_TFakeAckParams {
CSametimeProto* proto;
@@ -226,6 +228,4 @@ struct PopupData { CSametimeProto* proto;
};
-
#endif //#ifndef _SAMETIME_PROTO_H
-
diff --git a/protocols/SkypeWeb/src/main.cpp b/protocols/SkypeWeb/src/main.cpp index 678d2003a1..b7d5c38b26 100644 --- a/protocols/SkypeWeb/src/main.cpp +++ b/protocols/SkypeWeb/src/main.cpp @@ -17,6 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "stdafx.h"
+CMPlugin g_plugin;
int hLangpack;
HINSTANCE g_hInstance;
CLIST_INTERFACE *pcli;
@@ -91,15 +92,3 @@ int CSkypeProto::OnModulesLoaded(WPARAM, LPARAM) }
return 0;
}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-struct CMPlugin : public CMPluginBase
-{
- CMPlugin() :
- CMPluginBase("SKYPE")
- {
- RegisterProtocol(PROTOTYPE_PROTOCOL, (pfnInitProto)CSkypeProto::InitAccount, (pfnUninitProto)CSkypeProto::UninitAccount);
- }
-}
- g_plugin;
diff --git a/protocols/SkypeWeb/src/skype_accounts.cpp b/protocols/SkypeWeb/src/skype_accounts.cpp index 2016fac51c..9ab67acff8 100644 --- a/protocols/SkypeWeb/src/skype_accounts.cpp +++ b/protocols/SkypeWeb/src/skype_accounts.cpp @@ -17,38 +17,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "stdafx.h"
-LIST<CSkypeProto> CSkypeProto::Accounts(1, CSkypeProto::CompareAccounts);
-
-int CSkypeProto::CompareAccounts(const CSkypeProto *p1, const CSkypeProto *p2)
-{
- return mir_wstrcmp(p1->m_tszUserName, p2->m_tszUserName);
-}
-
-CSkypeProto* CSkypeProto::InitAccount(const char *protoName, const wchar_t *userName)
-{
- mir_cslock lck(accountsLock);
- CSkypeProto *proto = new CSkypeProto(protoName, userName);
- Accounts.insert(proto);
- return proto;
-}
-
-int CSkypeProto::UninitAccount(CSkypeProto *proto)
-{
- mir_cslock lck(accountsLock);
- Accounts.remove(proto);
- delete proto;
- return 0;
-}
-
-CSkypeProto* CSkypeProto::GetContactAccount(MCONTACT hContact)
-{
- mir_cslock lck(accountsLock);
- for (auto &it : Accounts)
- if (mir_strcmpi(GetContactProto(hContact), it->m_szModuleName) == 0)
- return it;
- return nullptr;
-}
-
int CSkypeProto::OnAccountLoaded(WPARAM, LPARAM)
{
setAllContactStatuses(ID_STATUS_OFFLINE, true);
diff --git a/protocols/SkypeWeb/src/skype_menus.cpp b/protocols/SkypeWeb/src/skype_menus.cpp index 55c4a4288f..5811ab33da 100644 --- a/protocols/SkypeWeb/src/skype_menus.cpp +++ b/protocols/SkypeWeb/src/skype_menus.cpp @@ -48,7 +48,7 @@ int CSkypeProto::PrebuildContactMenu(WPARAM hContact, LPARAM lParam) {
for (auto &it : ContactMenuItems)
Menu_ShowItem(it, false);
- CSkypeProto *proto = CSkypeProto::GetContactAccount(hContact);
+ CSkypeProto *proto = CMPlugin::getInstance(hContact);
return proto ? proto->OnPrebuildContactMenu(hContact, lParam) : 0;
}
diff --git a/protocols/SkypeWeb/src/skype_proto.h b/protocols/SkypeWeb/src/skype_proto.h index 5bdd124995..3584fde7c4 100644 --- a/protocols/SkypeWeb/src/skype_proto.h +++ b/protocols/SkypeWeb/src/skype_proto.h @@ -55,10 +55,6 @@ public: virtual HANDLE __cdecl GetAwayMsg(MCONTACT hContact);
virtual int __cdecl SetAwayMsg(int m_iStatus, const wchar_t *msg);
- // accounts
- static CSkypeProto* InitAccount(const char *protoName, const wchar_t *userName);
- static int UninitAccount(CSkypeProto *proto);
-
// icons
static void InitIcons();
@@ -123,11 +119,6 @@ private: static UINT_PTR m_timer;
- //---Accounts
- static LIST<CSkypeProto> CSkypeProto::Accounts;
- static int CompareAccounts(const CSkypeProto *p1, const CSkypeProto *p2);
- //---/
-
RequestQueue *requestQueue;
bool m_bHistorySynced;
@@ -165,7 +156,6 @@ private: EventHandle m_hTrouterHealthEvent;
- static CSkypeProto* GetContactAccount(MCONTACT hContact);
int __cdecl OnAccountLoaded(WPARAM, LPARAM);
INT_PTR __cdecl OnAccountManagerInit(WPARAM, LPARAM);
@@ -427,9 +417,16 @@ private: template<INT_PTR(__cdecl CSkypeProto::*Service)(WPARAM, LPARAM)>
static INT_PTR __cdecl GlobalService(WPARAM wParam, LPARAM lParam)
{
- CSkypeProto *proto = GetContactAccount((MCONTACT)wParam);
+ CSkypeProto *proto = CMPlugin::getInstance((MCONTACT)wParam);
return proto ? (proto->*Service)(wParam, lParam) : 0;
}
};
+struct CMPlugin : public ACCPROTOPLUGIN<CSkypeProto>
+{
+ CMPlugin() :
+ ACCPROTOPLUGIN<CSkypeProto>("SKYPE")
+ {}
+};
+
#endif //_SKYPE_PROTO_H_
\ No newline at end of file diff --git a/protocols/SkypeWeb/src/skype_timers.cpp b/protocols/SkypeWeb/src/skype_timers.cpp index 7004188d76..3e5a5e8446 100644 --- a/protocols/SkypeWeb/src/skype_timers.cpp +++ b/protocols/SkypeWeb/src/skype_timers.cpp @@ -31,7 +31,7 @@ void CSkypeProto::ProcessTimer() void CALLBACK CSkypeProto::TimerProc(HWND, UINT, UINT_PTR, DWORD)
{
mir_cslock lck(accountsLock);
- for (auto &it : Accounts)
+ for (auto &it : CMPlugin::g_arInstances)
it->ProcessTimer();
}
@@ -45,7 +45,7 @@ void CSkypeProto::SkypeSetTimer() void CSkypeProto::SkypeUnsetTimer()
{
mir_cslock lck(timerLock);
- if (m_timer && Accounts.getCount() == 0)
+ if (m_timer && CMPlugin::g_arInstances.getCount() == 0)
KillTimer(nullptr, m_timer);
m_timer = 0;
}
diff --git a/protocols/SkypeWeb/src/skype_utils.cpp b/protocols/SkypeWeb/src/skype_utils.cpp index 6350b40c8c..ffed1601de 100644 --- a/protocols/SkypeWeb/src/skype_utils.cpp +++ b/protocols/SkypeWeb/src/skype_utils.cpp @@ -593,7 +593,7 @@ INT_PTR CSkypeProto::ParseSkypeUriService(WPARAM, LPARAM lParam) INT_PTR CSkypeProto::GlobalParseSkypeUriService(WPARAM wParam, LPARAM lParam) { mir_cslock lck(accountsLock); - for (auto &it : Accounts) + for (auto &it : CMPlugin::g_arInstances) if (it->IsOnline()) return it->ParseSkypeUriService(wParam, lParam); diff --git a/protocols/Steam/src/main.cpp b/protocols/Steam/src/main.cpp index 57632115d9..7464db16e2 100644 --- a/protocols/Steam/src/main.cpp +++ b/protocols/Steam/src/main.cpp @@ -2,6 +2,7 @@ int hLangpack;
HINSTANCE g_hInstance;
+CMPlugin g_plugin;
HANDLE hExtraXStatus;
@@ -52,15 +53,3 @@ extern "C" int __declspec(dllexport) Unload(void) {
return 0;
}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-struct CMPlugin : public CMPluginBase
-{
- CMPlugin() :
- CMPluginBase("STEAM")
- {
- RegisterProtocol(PROTOTYPE_PROTOCOL, (pfnInitProto)CSteamProto::InitAccount, (pfnUninitProto)CSteamProto::UninitAccount);
- }
-}
- g_plugin;
diff --git a/protocols/Steam/src/steam_accounts.cpp b/protocols/Steam/src/steam_accounts.cpp deleted file mode 100644 index 8fedcc6181..0000000000 --- a/protocols/Steam/src/steam_accounts.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "stdafx.h" - -LIST<CSteamProto> CSteamProto::Accounts(1, CSteamProto::CompareProtos); - -int CSteamProto::CompareProtos(const CSteamProto *p1, const CSteamProto *p2) -{ - return mir_wstrcmp(p1->m_tszUserName, p2->m_tszUserName); -} - -CSteamProto* CSteamProto::InitAccount(const char* protoName, const wchar_t* userName) -{ - CSteamProto *ppro = new CSteamProto(protoName, userName); - Accounts.insert(ppro); - return ppro; -} - -int CSteamProto::UninitAccount(CSteamProto* ppro) -{ - Accounts.remove(ppro); - delete ppro; - return 0; -} - -CSteamProto* CSteamProto::GetContactAccount(MCONTACT hContact) -{ - char *proto = GetContactProto(hContact); - if (proto == nullptr) - return nullptr; - - for (auto &it : Accounts) - if (!mir_strcmp(proto, it->m_szModuleName)) - return it; - - return nullptr; -}
\ No newline at end of file diff --git a/protocols/Steam/src/steam_menus.cpp b/protocols/Steam/src/steam_menus.cpp index 30b6550293..40f84551d1 100644 --- a/protocols/Steam/src/steam_menus.cpp +++ b/protocols/Steam/src/steam_menus.cpp @@ -4,10 +4,10 @@ int CSteamProto::hChooserMenu; HGENMENU CSteamProto::contactMenuItems[CMI_MAX];
template<int(__cdecl CSteamProto::*Service)(WPARAM, LPARAM)>
-INT_PTR GlobalService(WPARAM wParam, LPARAM lParam)
+INT_PTR GlobalService(WPARAM hContact, LPARAM lParam)
{
- CSteamProto *ppro = CSteamProto::GetContactAccount((MCONTACT)wParam);
- return ppro ? (ppro->*Service)(wParam, lParam) : 0;
+ CSteamProto *ppro = CMPlugin::getInstance((MCONTACT)hContact);
+ return ppro ? (ppro->*Service)(hContact, lParam) : 0;
}
INT_PTR CSteamProto::AuthRequestCommand(WPARAM hContact, LPARAM)
@@ -81,9 +81,8 @@ INT_PTR CSteamProto::OpenBlockListCommand(WPARAM, LPARAM) return 0;
}
-int CSteamProto::OnPrebuildContactMenu(WPARAM wParam, LPARAM)
+int CSteamProto::OnPrebuildContactMenu(WPARAM hContact, LPARAM)
{
- MCONTACT hContact = (MCONTACT)wParam;
if (!hContact)
return 0;
@@ -106,13 +105,13 @@ int CSteamProto::OnPrebuildContactMenu(WPARAM wParam, LPARAM) return 0;
}
-int CSteamProto::PrebuildContactMenu(WPARAM wParam, LPARAM lParam)
+int CSteamProto::PrebuildContactMenu(WPARAM hContact, LPARAM lParam)
{
for (int i = 0; i < CMI_MAX; i++)
Menu_ShowItem(CSteamProto::contactMenuItems[i], false);
- CSteamProto* ppro = CSteamProto::GetContactAccount((MCONTACT)wParam);
- return (ppro) ? ppro->OnPrebuildContactMenu(wParam, lParam) : 0;
+ CSteamProto* ppro = CMPlugin::getInstance((MCONTACT)hContact);
+ return (ppro) ? ppro->OnPrebuildContactMenu(hContact, lParam) : 0;
}
void CSteamProto::OnInitStatusMenu()
diff --git a/protocols/Steam/src/steam_proto.h b/protocols/Steam/src/steam_proto.h index 1f41dfec84..93e8aca4be 100644 --- a/protocols/Steam/src/steam_proto.h +++ b/protocols/Steam/src/steam_proto.h @@ -75,12 +75,6 @@ public: virtual int __cdecl OnEvent(PROTOEVENTTYPE eventType, WPARAM wParam, LPARAM lParam);
- // instances
- static CSteamProto* InitAccount(const char* protoName, const wchar_t *userName);
- static int UninitAccount(CSteamProto* ppro);
-
- static CSteamProto* GetContactAccount(MCONTACT hContact);
-
// menus
static void InitMenus();
@@ -110,10 +104,6 @@ protected: */
time_t m_lastMessageTS;
- // instances
- static LIST<CSteamProto> Accounts;
- static int CompareProtos(const CSteamProto *p1, const CSteamProto *p2);
-
// requests
void SendRequest(HttpRequest *request);
void SendRequest(HttpRequest *request, HttpCallback callback, void *param = nullptr);
@@ -284,6 +274,13 @@ protected: }
};
+struct CMPlugin : public ACCPROTOPLUGIN<CSteamProto>
+{
+ CMPlugin() :
+ ACCPROTOPLUGIN<CSteamProto>("STEAM")
+ {}
+};
+
int OnReloadIcons(WPARAM wParam, LPARAM lParam);
void SetContactExtraIcon(MCONTACT hContact, int status);
diff --git a/protocols/Tox/src/main.cpp b/protocols/Tox/src/main.cpp index 8cf2c4b80d..9022f56569 100644 --- a/protocols/Tox/src/main.cpp +++ b/protocols/Tox/src/main.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" int hLangpack; +CMPlugin g_plugin; CHAT_MANAGER *pci; CLIST_INTERFACE *pcli; HINSTANCE g_hInstance; @@ -63,15 +64,3 @@ extern "C" int __declspec(dllexport) Unload(void) { return 0; } - -///////////////////////////////////////////////////////////////////////////////////////// - -struct CMPlugin : public CMPluginBase -{ - CMPlugin() : - CMPluginBase("TOX") - { - RegisterProtocol(PROTOTYPE_PROTOCOL, (pfnInitProto)CToxProto::InitAccount, (pfnUninitProto)CToxProto::UninitAccount); - } -} - g_plugin; diff --git a/protocols/Tox/src/tox_accounts.cpp b/protocols/Tox/src/tox_accounts.cpp index d70d6bad54..c9cb35c921 100644 --- a/protocols/Tox/src/tox_accounts.cpp +++ b/protocols/Tox/src/tox_accounts.cpp @@ -1,35 +1,5 @@ #include "stdafx.h"
-LIST<CToxProto> CToxProto::Accounts(1, CToxProto::CompareAccounts);
-
-int CToxProto::CompareAccounts(const CToxProto *p1, const CToxProto *p2)
-{
- return mir_wstrcmp(p1->m_tszUserName, p2->m_tszUserName);
-}
-
-CToxProto* CToxProto::InitAccount(const char *protoName, const wchar_t *userName)
-{
- CToxProto *proto = new CToxProto(protoName, userName);
- Accounts.insert(proto);
- return proto;
-}
-
-int CToxProto::UninitAccount(CToxProto *proto)
-{
- Accounts.remove(proto);
- delete proto;
- return 0;
-}
-
-CToxProto* CToxProto::GetContactAccount(MCONTACT hContact)
-{
- for (auto &it : Accounts)
- if (mir_strcmpi(GetContactProto(hContact), it->m_szModuleName) == 0)
- return it;
-
- return nullptr;
-}
-
int CToxProto::OnAccountLoaded(WPARAM, LPARAM)
{
Clist_GroupCreate(0, m_defaultGroup);
diff --git a/protocols/Tox/src/tox_proto.h b/protocols/Tox/src/tox_proto.h index 8a4fd782cd..ac71b30686 100644 --- a/protocols/Tox/src/tox_proto.h +++ b/protocols/Tox/src/tox_proto.h @@ -48,10 +48,6 @@ public: virtual int __cdecl OnEvent(PROTOEVENTTYPE iEventType, WPARAM wParam, LPARAM lParam);
- // accounts
- static CToxProto* InitAccount(const char *protoName, const wchar_t *userName);
- static int UninitAccount(CToxProto *proto);
-
// icons
static void InitIcons();
@@ -116,11 +112,6 @@ private: void __cdecl PollingThread(void*);
// accounts
- static LIST<CToxProto> Accounts;
- static int CompareAccounts(const CToxProto *p1, const CToxProto *p2);
-
- static CToxProto* GetContactAccount(MCONTACT hContact);
-
int __cdecl OnAccountLoaded(WPARAM, LPARAM);
int __cdecl OnAccountRenamed(WPARAM, LPARAM);
@@ -256,4 +247,11 @@ private: MEVENT AddEventToDb(MCONTACT hContact, WORD type, DWORD timestamp, DWORD flags, PBYTE pBlob, size_t cbBlob);
};
+struct CMPlugin : public ACCPROTOPLUGIN<CToxProto>
+{
+ CMPlugin() :
+ ACCPROTOPLUGIN<CToxProto>("TOX")
+ {}
+};
+
#endif //_TOX_PROTO_H_
\ No newline at end of file diff --git a/protocols/Tox/src/tox_utils.cpp b/protocols/Tox/src/tox_utils.cpp index d7c2d1408b..231a2b2106 100644 --- a/protocols/Tox/src/tox_utils.cpp +++ b/protocols/Tox/src/tox_utils.cpp @@ -146,11 +146,11 @@ INT_PTR CToxProto::ParseToxUri(WPARAM, LPARAM lParam) if (mir_wstrlen(uri) <= 4)
return 1;
- if (Accounts.getCount() == 0)
+ if (CMPlugin::g_arInstances.getCount() == 0)
return 1;
CToxProto *proto = nullptr;
- for (auto &it : Accounts) {
+ for (auto &it : CMPlugin::g_arInstances) {
if (it->IsOnline()) {
proto = it;
break;
diff --git a/protocols/Twitter/src/main.cpp b/protocols/Twitter/src/main.cpp index a4e714ba7e..14e91dc39e 100644 --- a/protocols/Twitter/src/main.cpp +++ b/protocols/Twitter/src/main.cpp @@ -22,6 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "proto.h"
#include "theme.h"
+CMPlugin g_plugin;
CLIST_INTERFACE* pcli;
HINSTANCE g_hInstance;
@@ -40,16 +41,6 @@ PLUGININFOEX pluginInfo = { { 0xbc09a71b, 0xb86e, 0x4d33, { 0xb1, 0x8d, 0x82, 0xd3, 0x4, 0x51, 0xdd, 0x3c } }
};
-/////////////////////////////////////////////////////////////////////////////
-// Protocol instances
-
-static int compare_protos(const TwitterProto *p1, const TwitterProto *p2)
-{
- return mir_wstrcmp(p1->m_tszUserName, p2->m_tszUserName);
-}
-
-OBJLIST<TwitterProto> g_Instances(1, compare_protos);
-
DWORD WINAPI DllMain(HINSTANCE hInstance, DWORD, LPVOID)
{
g_hInstance = hInstance;
@@ -87,28 +78,3 @@ extern "C" int __declspec(dllexport) Unload(void) {
return 0;
}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static PROTO_INTERFACE* protoInit(const char *proto_name, const wchar_t *username)
-{
- TwitterProto *proto = new TwitterProto(proto_name, username);
- g_Instances.insert(proto);
- return proto;
-}
-
-static int protoUninit(PROTO_INTERFACE *proto)
-{
- g_Instances.remove(static_cast<TwitterProto*>(proto));
- return 0;
-}
-
-struct CMPlugin : public CMPluginBase
-{
- CMPlugin() :
- CMPluginBase("Twitter")
- {
- RegisterProtocol(PROTOTYPE_PROTOCOL, protoInit, protoUninit);
- }
-}
- g_plugin;
diff --git a/protocols/Twitter/src/proto.h b/protocols/Twitter/src/proto.h index 46facedcc2..a73b5caacc 100644 --- a/protocols/Twitter/src/proto.h +++ b/protocols/Twitter/src/proto.h @@ -129,6 +129,13 @@ private: wstring AuthorizeUrl;
};
+struct CMPlugin : public ACCPROTOPLUGIN<TwitterProto>
+{
+ CMPlugin() :
+ ACCPROTOPLUGIN<TwitterProto>("Twitter")
+ {}
+};
+
// TODO: remove this
inline std::string profile_base_url(const std::string &url)
{
diff --git a/protocols/Twitter/src/theme.cpp b/protocols/Twitter/src/theme.cpp index ca6338edc7..75c5252f34 100644 --- a/protocols/Twitter/src/theme.cpp +++ b/protocols/Twitter/src/theme.cpp @@ -20,8 +20,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "theme.h"
#include "proto.h"
-extern OBJLIST<TwitterProto> g_Instances;
-
static IconItem icons[] =
{
{ LPGEN("Twitter Icon"), "twitter", IDI_TWITTER },
@@ -57,32 +55,20 @@ HANDLE GetIconHandle(const char *name) static HGENMENU g_hMenuItems[2];
// Helper functions
-static TwitterProto* GetInstanceByHContact(MCONTACT hContact)
-{
- char *proto = GetContactProto(hContact);
- if (!proto)
- return nullptr;
-
- for (auto &it : g_Instances)
- if (!mir_strcmp(proto, it->m_szModuleName))
- return it;
-
- return nullptr;
-}
template<INT_PTR(__cdecl TwitterProto::*Fcn)(WPARAM, LPARAM)>
-INT_PTR GlobalService(WPARAM wParam, LPARAM lParam)
+INT_PTR GlobalService(WPARAM hContact, LPARAM lParam)
{
- TwitterProto *proto = GetInstanceByHContact(MCONTACT(wParam));
- return proto ? (proto->*Fcn)(wParam, lParam) : 0;
+ TwitterProto *proto = CMPlugin::getInstance(MCONTACT(hContact));
+ return proto ? (proto->*Fcn)(hContact, lParam) : 0;
}
-static int PrebuildContactMenu(WPARAM wParam, LPARAM lParam)
+static int PrebuildContactMenu(WPARAM hContact, LPARAM lParam)
{
ShowContactMenus(false);
- TwitterProto *proto = GetInstanceByHContact(MCONTACT(wParam));
- return proto ? proto->OnPrebuildContactMenu(wParam, lParam) : 0;
+ TwitterProto *proto = CMPlugin::getInstance(MCONTACT(hContact));
+ return proto ? proto->OnPrebuildContactMenu(hContact, lParam) : 0;
}
void InitContactMenus()
diff --git a/protocols/VKontakte/src/main.cpp b/protocols/VKontakte/src/main.cpp index 1db46892eb..8516360ba0 100644 --- a/protocols/VKontakte/src/main.cpp +++ b/protocols/VKontakte/src/main.cpp @@ -73,24 +73,10 @@ extern "C" int __declspec(dllexport) Unload(void) /////////////////////////////////////////////////////////////////////////////////////////
-static PROTO_INTERFACE* protoInit(const char *pszProtoName, const wchar_t *wszUserName)
-{
- CVkProto *ppro = new CVkProto(pszProtoName, wszUserName);
- return ppro;
-}
-
-static int protoUninit(PROTO_INTERFACE *ppro)
-{
- delete (CVkProto*)ppro;
- return 0;
-}
-
-struct CMPlugin : public CMPluginBase
+struct CMPlugin : public ACCPROTOPLUGIN<CVkProto>
{
CMPlugin() :
- CMPluginBase("VKontakte")
- {
- RegisterProtocol(PROTOTYPE_PROTOCOL, protoInit, protoUninit);
- }
+ ACCPROTOPLUGIN<CVkProto>("VKontakte")
+ {}
}
g_plugin;
|