summaryrefslogtreecommitdiff
path: root/protocols/Skype/skypesvc.c
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Skype/skypesvc.c')
-rw-r--r--protocols/Skype/skypesvc.c188
1 files changed, 188 insertions, 0 deletions
diff --git a/protocols/Skype/skypesvc.c b/protocols/Skype/skypesvc.c
new file mode 100644
index 0000000000..c6d02e6d3a
--- /dev/null
+++ b/protocols/Skype/skypesvc.c
@@ -0,0 +1,188 @@
+#define __SKYPESVC_C__
+#include "skype.h"
+#include "skypesvc.h"
+#include "skypeapi.h"
+#include "skypeopt.h"
+#include "contacts.h"
+#include "m_toptoolbar.h"
+
+// Exports
+SKYPE_SVCNAMES g_svcNames;
+
+//From skype.c
+extern char protocol, g_szProtoName[];
+extern HINSTANCE hInst;
+extern DWORD mirandaVersion;
+static HANDLE m_hPrebuildCMenu=NULL, m_hStatusHookContact=NULL, m_hContactDeleted=NULL,
+ m_hHookModulesLoaded=NULL, m_hHookOkToExit=NULL, m_hOptHook=NULL, m_hHookMirandaExit=NULL,
+ m_hTTBModuleLoadedHook = NULL, m_hHookOnUserInfoInit = NULL;
+
+void CreateProtoService(const char* szService, MIRANDASERVICE svc)
+{
+ char str[MAXMODULELABELLENGTH];
+ _snprintf(str, sizeof(str), "%s%s", SKYPE_PROTONAME, szService);
+ CreateServiceFunction(str, svc);
+}
+
+#define CreateServiceName(srvce) _snprintf (g_svcNames.##srvce, sizeof(g_svcNames.##srvce), "%s/"#srvce, SKYPE_PROTONAME);
+
+void CreateServices(void)
+{
+ CreateServiceName(ChatNew);
+ CreateServiceName(SetAvatar);
+ CreateServiceName(SendFile);
+ CreateServiceName(HoldCall);
+ CreateServiceName(AnswerCall);
+ CreateServiceName(ImportHistory);
+ CreateServiceName(AddUser);
+ CreateServiceName(SkypeOutCallUser);
+ CreateServiceName(CallHangupUser);
+ CreateServiceName(CallUser);
+
+ CreateServiceFunction(SKYPE_CALL, SkypeCall);
+ CreateServiceFunction(SKYPE_CALLHANGUP, SkypeCallHangup);
+ CreateServiceFunction(SKYPEOUT_CALL, SkypeOutCall);
+ CreateServiceFunction(SKYPE_HOLDCALL, SkypeHoldCall);
+ CreateServiceFunction(SKYPE_ADDUSER, SkypeAdduserDlg);
+ CreateServiceFunction(SKYPE_IMPORTHISTORY, ImportHistory);
+ CreateServiceFunction(SKYPE_ANSWERCALL, SkypeAnswerCall);
+ CreateServiceFunction(SKYPE_SENDFILE, SkypeSendFile);
+ CreateServiceFunction(SKYPE_SETAVATAR, SkypeSetAvatar);
+
+ CreateProtoService(PS_GETCAPS, SkypeGetCaps);
+ CreateProtoService(PS_GETNAME, SkypeGetName);
+ CreateProtoService(PS_LOADICON, SkypeLoadIcon);
+ CreateProtoService(PS_SETSTATUS, SkypeSetStatus);
+ CreateProtoService(PS_GETSTATUS, SkypeGetStatus);
+ CreateProtoService(PS_ADDTOLIST, SkypeAddToList);
+ CreateProtoService(PS_ADDTOLISTBYEVENT, SkypeAddToListByEvent);
+ CreateProtoService(PS_BASICSEARCH, SkypeBasicSearch);
+
+ CreateProtoService(PSS_GETINFO, SkypeGetInfo);
+ CreateProtoService(PSS_MESSAGE, SkypeSendMessage);
+ CreateProtoService(PSR_MESSAGE, SkypeRecvMessage);
+ CreateProtoService(PSS_USERISTYPING, SkypeUserIsTyping);
+ CreateProtoService(PSS_AUTHREQUEST, SkypeSendAuthRequest);
+ CreateProtoService(PSR_AUTH, SkypeRecvAuth);
+ CreateProtoService(PS_AUTHALLOW, SkypeAuthAllow);
+ CreateProtoService(PS_AUTHDENY, SkypeAuthDeny);
+
+ CreateProtoService(PS_GETAVATARINFO, SkypeGetAvatarInfo);
+ CreateProtoService(PS_GETAVATARCAPS, SkypeGetAvatarCaps);
+ CreateProtoService(PS_GETMYAVATAR, SkypeGetAvatar);
+ CreateProtoService(PS_SETMYAVATAR, SkypeSetAvatar);
+
+ CreateProtoService(PS_SETAWAYMSG, SkypeSetAwayMessage);
+ CreateProtoService(PS_SETAWAYMSGW, SkypeSetAwayMessageW);
+ CreateProtoService(PSS_GETAWAYMSG, SkypeGetAwayMessage);
+ CreateProtoService(PS_SETMYNICKNAME, SkypeSetNick);
+
+ CreateProtoService(PSS_SKYPEAPIMSG, SkypeReceivedAPIMessage);
+ CreateProtoService(SKYPE_REGPROXY, SkypeRegisterProxy);
+}
+
+void HookEvents(void)
+{
+ m_hPrebuildCMenu = HookEvent(ME_CLIST_PREBUILDCONTACTMENU, PrebuildContactMenu);
+
+ //HookEvent(ME_CLIST_DOUBLECLICKED, ClistDblClick);
+ m_hOptHook = HookEvent(ME_OPT_INITIALISE, RegisterOptions);
+ m_hStatusHookContact = HookEvent(ME_DB_CONTACT_ADDED,HookContactAdded);
+ m_hContactDeleted = HookEvent( ME_DB_CONTACT_DELETED, HookContactDeleted );
+ m_hHookModulesLoaded = HookEvent( ME_SYSTEM_MODULESLOADED, OnModulesLoaded);
+ m_hHookMirandaExit = HookEvent(ME_SYSTEM_OKTOEXIT, MirandaExit);
+ m_hHookOkToExit = HookEvent(ME_SYSTEM_PRESHUTDOWN, OkToExit);
+}
+
+void HookEventsLoaded(void)
+{
+ // We cannot check for the TTB-service before this event gets fired... :-/
+ m_hTTBModuleLoadedHook = HookEvent(ME_TTB_MODULELOADED, CreateTopToolbarButton);
+ m_hHookOnUserInfoInit = HookEvent( ME_USERINFO_INITIALISE, OnDetailsInit );
+}
+
+void UnhookEvents(void)
+{
+ UnhookEvent(m_hOptHook);
+ UnhookEvent(m_hTTBModuleLoadedHook);
+ UnhookEvent(m_hHookOnUserInfoInit);
+ UnhookEvent(m_hStatusHookContact);
+ UnhookEvent(m_hContactDeleted);
+ UnhookEvent(m_hHookModulesLoaded);
+ UnhookEvent(m_hPrebuildCMenu);
+ UnhookEvent(m_hHookOkToExit);
+ UnhookEvent(m_hHookMirandaExit);
+ //UnhookEvent(ClistDblClick);
+}
+
+INT_PTR SkypeGetCaps(WPARAM wParam, LPARAM lParam) {
+ int ret = 0;
+
+ UNREFERENCED_PARAMETER(lParam);
+
+ switch (wParam) {
+ case PFLAGNUM_1:
+ ret = PF1_BASICSEARCH | PF1_IM | PF1_MODEMSG; // | PF1_AUTHREQ;
+ if (protocol>=5) ret |= PF1_ADDSEARCHRES;
+ break;
+
+ case PFLAGNUM_2:
+ ret = PF2_ONLINE | PF2_SHORTAWAY | PF2_INVISIBLE | PF2_HEAVYDND;
+#ifdef MAPDND
+ ret |= PF2_LIGHTDND | PF2_HEAVYDND;
+#endif
+ if (!DBGetContactSettingByte(NULL, SKYPE_PROTONAME, "NoSkype3Stats", 0))
+ ret |= PF2_LONGAWAY | PF2_FREECHAT;
+ break;
+
+ case PFLAGNUM_3:
+ ret = PF2_ONLINE | PF2_INVISIBLE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_LIGHTDND | PF2_HEAVYDND | PF2_FREECHAT | PF2_OUTTOLUNCH | PF2_ONTHEPHONE | PF2_IDLE;
+ break;
+
+ case PFLAGNUM_4:
+ ret = PF4_FORCEAUTH | PF4_FORCEADDED | PF4_AVATARS | PF4_SUPPORTTYPING /* Not really, but libgaim compat. */;
+ if (mirandaVersion >= 0x070000) ret |= PF4_IMSENDUTF;
+ break;
+ case PFLAG_UNIQUEIDTEXT:
+ ret = (INT_PTR) "NAME";
+ break;
+ case PFLAG_UNIQUEIDSETTING:
+ ret = (INT_PTR) SKYPE_NAME;
+ break;
+ }
+ return ret;
+
+}
+
+INT_PTR SkypeGetName(WPARAM wParam, LPARAM lParam)
+{
+ if (lParam)
+ {
+ strncpy((char *)lParam, SKYPE_PROTONAME, wParam);
+ return 0; // Success
+ }
+ return 1; // Failure
+}
+
+
+INT_PTR SkypeLoadIcon(WPARAM wParam,LPARAM lParam)
+{
+ UINT id;
+
+ UNREFERENCED_PARAMETER(lParam);
+
+ switch(wParam&0xFFFF) {
+ case PLI_PROTOCOL: id=IDI_SKYPE; break; // IDI_MAIN is the main icon for the protocol
+ default: return (int)(HICON)NULL;
+ }
+ return (int)LoadImage(hInst,MAKEINTRESOURCE(id),IMAGE_ICON,GetSystemMetrics(wParam&PLIF_SMALL?SM_CXSMICON:SM_CXICON),GetSystemMetrics(wParam&PLIF_SMALL?SM_CYSMICON:SM_CYICON),0);
+}
+
+INT_PTR SkypeGetAvatar(WPARAM wParam,LPARAM lParam)
+{ DBVARIANT dbv;
+ if (!DBGetContactSettingString(NULL,SKYPE_PROTONAME, "AvatarFile", &dbv)){
+ lstrcpynA((char*)wParam, dbv.pszVal, (int)lParam);
+ DBFreeVariant(&dbv);
+ }
+ return 0;
+}