From 89c5b2369413025e1fe7dfe5c5d0bf3bedd8558d Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Mon, 23 Jul 2012 13:52:57 +0000 Subject: git-svn-id: http://svn.miranda-ng.org/main/trunk@1123 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- .../src/imo2skype/miranda/skypepluginlink.c | 233 +++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 !NotAdopted/IMO2sProxy/src/imo2skype/miranda/skypepluginlink.c (limited to '!NotAdopted/IMO2sProxy/src/imo2skype/miranda/skypepluginlink.c') diff --git a/!NotAdopted/IMO2sProxy/src/imo2skype/miranda/skypepluginlink.c b/!NotAdopted/IMO2sProxy/src/imo2skype/miranda/skypepluginlink.c new file mode 100644 index 0000000000..0109bd6ede --- /dev/null +++ b/!NotAdopted/IMO2sProxy/src/imo2skype/miranda/skypepluginlink.c @@ -0,0 +1,233 @@ +#include "imo2sproxy.h" +#define WIN32_LEAN_AND_MEAN +#include +#include +#include "skypepluginlink.h" +#include "include/newpluginapi.h" +#include "include/m_system.h" + +#define LockMutex(x) EnterCriticalSection (&x) +#define UnlockMutex(x) LeaveCriticalSection(&x) +#define InitMutex(x) InitializeCriticalSection(&x) +#define ExitMutex(x) DeleteCriticalSection(&x) +#define mutex_t CRITICAL_SECTION + + +// ----------------------------------------------------------------------------- + +struct tag_proxyInst; +typedef struct tag_proxyInst IMO2SPROXY_INST; + +typedef struct +{ + IMOSAPI *hInst; + IMO2SPROXY_INST *hProxy; + mutex_t sendmutex; + mutex_t rcvmutex; + int iConnectionStat; +} CONNINST; + +struct tag_proxyInst +{ + IMO2SPROXY vtbl; // Must be first! + IMO2SPROXY_CFG *pCfg; + SKYPEPLUGINLINK_CFG *pMyCfg; + HANDLE hService; + CONNINST stClient; // Currently only 1 connection +}; + + +static CONNINST *m_pConn = NULL; + +// ----------------------------------------------------------------------------- + +static void EventHandler(char *pszMsg, void *pUser); +static int InitProxy(IMO2SPROXY_INST *hProxy); + +static int Imo2sproxy_Open(IMO2SPROXY *hInst); +static void Imo2sproxy_Loop(IMO2SPROXY *hInst); +static void Imo2sproxy_Exit(IMO2SPROXY *hInst); + +// ----------------------------------------------------------------------------- +static void EventHandler(char *pszMsg, void *pUser) +{ + CONNINST *pInst = (CONNINST*)pUser; + COPYDATASTRUCT cds; + DWORD dwRes = 0; + + //LockMutex (pInst->sendmutex); + if (pInst->hProxy->pCfg->bVerbose && pInst->hProxy->pCfg->fpLog) + { + fprintf (pInst->hProxy->pCfg->fpLog, "> %s\n", pszMsg); + fflush (pInst->hProxy->pCfg->fpLog); + } + cds.dwData = 0; + cds.cbData = strlen(pszMsg)+1; + cds.lpData = pszMsg; + CallService (SKYPE_PROTONAME PSS_SKYPEAPIMSG, 0, (LPARAM)&cds); + //UnlockMutex (pInst->sendmutex); +} + +// ----------------------------------------------------------------------------- + +INT_PTR CallIn(WPARAM wParam,LPARAM lParam) +{ + CONNINST *pInst = (CONNINST*)m_pConn; + PCOPYDATASTRUCT pCopyData = (PCOPYDATASTRUCT)lParam; + + if (!pInst) return -1; + + if (pInst->hProxy->pMyCfg->bDelayLogin && pInst->iConnectionStat < 1) + { + LockMutex (pInst->rcvmutex); + if (InitProxy(pInst->hProxy)<0) + { + UnlockMutex(pInst->rcvmutex); + return -1; + } + UnlockMutex(pInst->rcvmutex); + } + + if (pInst->hProxy->pCfg->bVerbose && pInst->hProxy->pCfg->fpLog) + { + fprintf (pInst->hProxy->pCfg->fpLog, "< [%s]\n", pCopyData->lpData); + fflush (pInst->hProxy->pCfg->fpLog); + } + Imo2S_Send (pInst->hInst, pCopyData->lpData); + return 0; +} + +// ----------------------------------------------------------------------------- + +static void FreeConnection (CONNINST *pInst) +{ + if (!pInst || !pInst->hProxy) return; + if (pInst->hProxy->pCfg->bVerbose && pInst->hProxy->pCfg->fpLog) + { + fprintf (pInst->hProxy->pCfg->fpLog, "SkypePluginLink: Closed connection\n"); + fflush (pInst->hProxy->pCfg->fpLog); + } + + if (pInst->hProxy->hService) + { + DestroyServiceFunction(pInst->hProxy->hService); + pInst->hProxy->hService = NULL; + CallService (SKYPE_PROTONAME SKYPE_REGPROXY, 0, 0); + } + ExitMutex(pInst->sendmutex); + ExitMutex(pInst->rcvmutex); + if (pInst->hInst) + { + IMOSAPI *hInst = pInst->hInst; + pInst->hInst = NULL; + Imo2S_Exit(hInst); + } +} + +// ----------------------------------------------------------------------------- + +static int InitProxy(IMO2SPROXY_INST *hProxy) +{ + char *pszError; + + if (!hProxy->stClient.hInst) + { + if (!(hProxy->stClient.hInst = Imo2S_Init(EventHandler, &hProxy->stClient, hProxy->pCfg->iFlags))) + { + hProxy->pCfg->logerror (stderr, "SkypePluginLink: Cannot start Imo2Skype instance.\n"); + return -1; + } + } + + // FIXME: We should enable logging dependent on a loglevel rather than just enabling it + Imo2S_SetLog (hProxy->stClient.hInst, hProxy->pCfg->fpLog); + + if (hProxy->stClient.iConnectionStat == 0 || + (hProxy->stClient.iConnectionStat = Imo2S_Login (hProxy->stClient.hInst, + hProxy->pCfg->pszUser, hProxy->pCfg->pszPass, &pszError)) != 1) + { + hProxy->pCfg->logerror (stderr, "SkypePluginLink: Cannot login with (%s/****): %s\n", + hProxy->pCfg->pszUser, pszError); + return -1; + } + return 0; +} + +// ----------------------------------------------------------------------------- +// PUBLIC +// ----------------------------------------------------------------------------- + +void SkypePluginLink_Defaults (SKYPEPLUGINLINK_CFG *pMyCfg) +{ + memset (pMyCfg, 0, sizeof(SKYPEPLUGINLINK_CFG)); + pMyCfg->bDelayLogin = TRUE; +} + +// ----------------------------------------------------------------------------- + +IMO2SPROXY *SkypePluginLink_Init (IMO2SPROXY_CFG *pCfg, SKYPEPLUGINLINK_CFG *pMyCfg) +{ + IMO2SPROXY_INST *pstInst = calloc(sizeof(IMO2SPROXY_INST), 1); + + pstInst->vtbl.Open = Imo2sproxy_Open; + pstInst->vtbl.Loop = Imo2sproxy_Loop; + pstInst->vtbl.Exit = Imo2sproxy_Exit; + pstInst->pCfg = pCfg; + pstInst->pMyCfg = pMyCfg; + return (IMO2SPROXY*)pstInst; +} + +// ----------------------------------------------------------------------------- +// IMPLEMENTATION +// ----------------------------------------------------------------------------- +static int Imo2sproxy_Open(IMO2SPROXY *hInst) +{ + IMO2SPROXY_INST *hProxy = (IMO2SPROXY_INST*)hInst; + WNDCLASS WndClass ={0}; + + if (hProxy->pCfg->bVerbose && hProxy->pCfg->fpLog) + fprintf (hProxy->pCfg->fpLog, "SkypePluginLink:Open(Start)\n"); + + // Only 1 connection instance, so we can init it right here + InitMutex(hProxy->stClient.sendmutex); + InitMutex(hProxy->stClient.rcvmutex); + hProxy->stClient.hProxy = hProxy; + m_pConn = &hProxy->stClient; + + // Register with Skype Plugin + hProxy->hService = CreateServiceFunction("IMO2SPROXY" PSS_SKYPEAPIMSG, CallIn); + CallService (SKYPE_PROTONAME SKYPE_REGPROXY, 0, (LPARAM)"IMO2SPROXY" PSS_SKYPEAPIMSG); + hProxy->stClient.iConnectionStat = -1; + + if (!hProxy->pMyCfg->bDelayLogin) + { + if (InitProxy(hProxy)<0) + { + FreeConnection(&hProxy->stClient); + return -1; + } + } + return 0; +} + +// ----------------------------------------------------------------------------- + +static void Imo2sproxy_Loop(IMO2SPROXY *hInst) +{ + // No loop needed for call-in +} + + +// ----------------------------------------------------------------------------- + +static void Imo2sproxy_Exit(IMO2SPROXY *hInst) +{ + IMO2SPROXY_INST *hProxy = (IMO2SPROXY_INST*)hInst; + + if (hProxy->pCfg->bVerbose && hProxy->pCfg->fpLog) + fprintf (hProxy->pCfg->fpLog, "SkypePluginLink:Exit()\n"); + + FreeConnection (&hProxy->stClient); + free (hProxy); +} + -- cgit v1.2.3