/* Copyright (c) 2015 Miranda NG project (http://miranda-ng.org) 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 version 2 of the License. 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, see . */ #ifndef _SKYPE_PROTO_H_ #define _SKYPE_PROTO_H_ typedef void(CSkypeProto::*SkypeResponseCallback)(const NETLIBHTTPREQUEST *response); typedef void(CSkypeProto::*SkypeResponseWithArgCallback)(const NETLIBHTTPREQUEST *response, void *arg); typedef HRESULT(MarkupCallback)(IHTMLDocument3 *pHtmlDoc, BSTR &message); struct CSkypeProto : public PROTO < CSkypeProto > { friend CSkypePasswordEditor; public: ////////////////////////////////////////////////////////////////////////////////////// //Ctors CSkypeProto(const char *protoName, const wchar_t *userName); ~CSkypeProto(); ////////////////////////////////////////////////////////////////////////////////////// // Virtual functions virtual MCONTACT __cdecl AddToList(int flags, PROTOSEARCHRESULT* psr); virtual MCONTACT __cdecl AddToListByEvent(int flags, int iContact, MEVENT hDbEvent); virtual int __cdecl AuthRequest(MCONTACT hContact, const PROTOCHAR* szMessage); virtual int __cdecl Authorize(MEVENT hDbEvent); virtual int __cdecl AuthDeny(MEVENT hDbEvent, const PROTOCHAR* szReason); virtual int __cdecl AuthRecv(MCONTACT hContact, PROTORECVEVENT*); virtual DWORD_PTR __cdecl GetCaps(int type, MCONTACT hContact = NULL); virtual int __cdecl GetInfo(MCONTACT hContact, int infoType); virtual HANDLE __cdecl SearchBasic(const PROTOCHAR* id); virtual int __cdecl RecvMsg(MCONTACT hContact, PROTORECVEVENT *pre); virtual int __cdecl SendMsg(MCONTACT hContact, int flags, const char* msg); virtual int __cdecl SetStatus(int iNewStatus); virtual int __cdecl UserIsTyping(MCONTACT hContact, int type); virtual int __cdecl OnEvent(PROTOEVENTTYPE iEventType, WPARAM wParam, LPARAM lParam); // accounts static CSkypeProto* InitAccount(const char *protoName, const TCHAR *userName); static int UninitAccount(CSkypeProto *proto); // icons static void InitIcons(); static void UninitIcons(); // menus static void InitMenus(); static void UninitMenus(); //popups void InitPopups(); // languages static void InitLanguages(); // events static int OnModulesLoaded (WPARAM, LPARAM); int __cdecl OnDbEventRead (WPARAM, LPARAM); int __cdecl OnPreShutdown (WPARAM, LPARAM); //search void __cdecl SearchBasicThread(void* id); //////////////////////////////////////////// UINT_PTR m_timer; static int CompareAccounts(const CSkypeProto *p1, const CSkypeProto *p2); void CSkypeProto::ProcessTimer(); static INT_PTR EventGetIcon (WPARAM wParam, LPARAM lParam); static INT_PTR GetCallEventText(WPARAM, LPARAM lParam); private: char *password; RequestQueue *requestQueue; bool isTerminated; std::map cookies; HANDLE m_pollingConnection, m_hPollingThread, m_hTrouterThread, m_TrouterConnection, m_hCallHook; static std::map languages; static INT_PTR CALLBACK PasswordEditorProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); HANDLE m_hPopupClassCall, m_hPopupClassNotify; // accounts char *Server, *RegToken, *TokenSecret, *EndpointId, *SelfSkypeName; static CSkypeProto* GetContactAccount(MCONTACT hContact); int __cdecl OnAccountLoaded(WPARAM, LPARAM); INT_PTR __cdecl OnAccountManagerInit(WPARAM, LPARAM); std::tstring m_tszAvatarFolder; INT_PTR __cdecl SvcGetAvatarInfo(WPARAM, LPARAM); INT_PTR __cdecl SvcGetAvatarCaps(WPARAM, LPARAM); INT_PTR __cdecl SvcGetMyAvatar (WPARAM, LPARAM); INT_PTR __cdecl SvcSetMyAvatar (WPARAM, LPARAM); int InternalSetAvatar(MCONTACT hContact, const char *szJid, const TCHAR *ptszFileName); // requests void PushRequest(HttpRequest *request); void PushRequest(HttpRequest *request, SkypeResponseCallback response); void PushRequest(HttpRequest *request, SkypeResponseWithArgCallback response, void *arg); void SendRequest(HttpRequest *request); void SendRequest(HttpRequest *request, SkypeResponseCallback response); void SendRequest(HttpRequest *request, SkypeResponseWithArgCallback response, void *arg); // icons static IconInfo Icons[]; static HANDLE GetIconHandle(const char *name); static HANDLE GetSkinIconHandle(const char *name); // menus static HGENMENU ContactMenuItems[CMI_MAX]; int OnPrebuildContactMenu(WPARAM hContact, LPARAM); static int PrebuildContactMenu(WPARAM hContact, LPARAM lParam); int OnInitStatusMenu(); // options int __cdecl OnOptionsInit(WPARAM wParam, LPARAM lParam); // login void OnLoginFirst (const NETLIBHTTPREQUEST *response); void OnLoginSecond (const NETLIBHTTPREQUEST *response); void OnLoginSuccess (); void OnEndpointCreated (const NETLIBHTTPREQUEST *response); void OnSubscriptionsCreated (const NETLIBHTTPREQUEST *response); void OnCapabilitiesSended (const NETLIBHTTPREQUEST *response); void OnStatusChanged (const NETLIBHTTPREQUEST *response); //TRouter void OnCreateTrouter(const NETLIBHTTPREQUEST *response); void OnTrouterPoliciesCreated(const NETLIBHTTPREQUEST *response); void OnGetTrouter(const NETLIBHTTPREQUEST *response, void *p); void OnHealth(const NETLIBHTTPREQUEST *response); void OnTrouterEvent(JSONNODE *body, JSONNODE *headers); void __cdecl CSkypeProto::TRouterThread(void*); // profile void UpdateProfileFirstName (JSONNODE *root, MCONTACT hContact = NULL); void UpdateProfileLastName (JSONNODE *root, MCONTACT hContact = NULL); void UpdateProfileDisplayName (JSONNODE *root, MCONTACT hContact = NULL); void UpdateProfileGender (JSONNODE *root, MCONTACT hContact = NULL); void UpdateProfileBirthday (JSONNODE *root, MCONTACT hContact = NULL); void UpdateProfileCountry (JSONNODE *node, MCONTACT hContact = NULL); void UpdateProfileState (JSONNODE *node, MCONTACT hContact = NULL); void UpdateProfileCity (JSONNODE *node, MCONTACT hContact = NULL); void UpdateProfileLanguage (JSONNODE *root, MCONTACT hContact = NULL); void UpdateProfileHomepage (JSONNODE *root, MCONTACT hContact = NULL); void UpdateProfileAbout (JSONNODE *node, MCONTACT hContact = NULL); void UpdateProfileEmails (JSONNODE *root, MCONTACT hContact = NULL); void UpdateProfilePhoneMobile (JSONNODE *root, MCONTACT hContact = NULL); void UpdateProfilePhoneHome (JSONNODE *root, MCONTACT hContact = NULL); void UpdateProfilePhoneOffice (JSONNODE *root, MCONTACT hContact = NULL); void UpdateProfileStatusMessage (JSONNODE *root, MCONTACT hContact = NULL); void UpdateProfileXStatusMessage(JSONNODE *root, MCONTACT hContact = NULL); void UpdateProfileAvatar (JSONNODE *root, MCONTACT hContact = NULL); void LoadProfile (const NETLIBHTTPREQUEST *response); // contacts WORD GetContactStatus (MCONTACT hContact); void SetContactStatus (MCONTACT hContact, WORD status); void SetAllContactsStatus (WORD status); void SetAvatarUrl (MCONTACT hContact, CMString &tszUrl); void ReloadAvatarInfo (MCONTACT hContact); void GetAvatarFileName (MCONTACT hContact, TCHAR* pszDest, size_t cbLen); void OnReceiveAvatar (const NETLIBHTTPREQUEST *response, void *arg); void OnSentAvatar (const NETLIBHTTPREQUEST *response); void OnSearch (const NETLIBHTTPREQUEST *response); MCONTACT FindContact (const char *skypename); MCONTACT AddContact (const char *skypename, bool isTemporary = false); MCONTACT GetContactFromAuthEvent(MEVENT hEvent); void LoadContactsAuth(const NETLIBHTTPREQUEST *response); void LoadContactsInfo(const NETLIBHTTPREQUEST *response); void LoadContactList (const NETLIBHTTPREQUEST *response); int __cdecl OnContactDeleted(MCONTACT, LPARAM); void OnBlockContact (const NETLIBHTTPREQUEST *response, void *p); void OnUnblockContact (const NETLIBHTTPREQUEST *response, void *p); // messages mir_cs messageSyncLock; MEVENT GetMessageFromDb(MCONTACT hContact, const char *messageId, LONGLONG timestamp = 0); MEVENT AddMessageToDb(MCONTACT hContact, DWORD timestamp, DWORD flags, const char *messageId, char *content, int emoteOffset = 0); MEVENT AddCallToDb(MCONTACT hContact, DWORD timestamp, DWORD flags, const char *callId, const char *gp); MEVENT AddCallInfoToDb(MCONTACT hContact, DWORD timestamp, DWORD flags, const char *messageId, char *content); int OnReceiveMessage(const char *messageId, const char *url, time_t timestamp, char *content, int emoteOffset = 0, bool isRead = false); int SaveMessageToDb(MCONTACT hContact, PROTORECVEVENT *pre); int OnSendMessage(MCONTACT hContact, int flags, const char *message); void OnMessageSent(const NETLIBHTTPREQUEST *response, void *arg); int __cdecl OnPreCreateMessage(WPARAM, LPARAM lParam); void MarkMessagesRead(MCONTACT hContact, MEVENT hDbEvent); void OnPrivateMessageEvent(JSONNODE *node); // sync void OnGetServerHistory (const NETLIBHTTPREQUEST *response); void OnSyncHistory (const NETLIBHTTPREQUEST *response); void SyncHistory(); //chats void InitGroupChatModule(); void CloseAllChatChatSessions(); MCONTACT FindChatRoom (const char *chatname); MCONTACT AddChatRoom (const char *chatname); int __cdecl OnGroupChatEventHook(WPARAM, LPARAM lParam); int __cdecl OnGroupChatMenuHook (WPARAM, LPARAM lParam); void StartChatRoom(const TCHAR *tid, const TCHAR *tname); void OnGetChatInfo(const NETLIBHTTPREQUEST *response, void *p); INT_PTR __cdecl OnJoinChatRoom (WPARAM hContact, LPARAM); INT_PTR __cdecl OnLeaveChatRoom (WPARAM hContact, LPARAM); void OnChatEvent(JSONNODE *node); void OnSendChatMessage(const TCHAR *chat_id, const TCHAR * tszMessage); char *GetChatUsers(const TCHAR *chat_id); bool IsChatContact(const TCHAR *chat_id, const char *id); void AddMessageToChat(const TCHAR *chat_id, const TCHAR *from, const char *content, bool isAction, int emoteOffset, time_t timestamp, bool isLoading = false); void AddChatContact(const TCHAR *tchat_id, const char *id, const char *name, const TCHAR *role, bool isChange = false); void RemoveChatContact(const TCHAR *tchat_id, const char *id, const char *name, bool isKick = false, const char *initiator = ""); void RenameChat(const char *chat_id, const char *name); void ChangeChatTopic(const char * chat_id, const char *topic, const char *initiator); static INT_PTR CALLBACK InviteDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); static INT_PTR CALLBACK GcCreateDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); static void ResetOptions(HWND hwndDlg); static void FilterContacts(HWND hwndDlg, CSkypeProto *ppro); void SetChatStatus(MCONTACT hContact, int iStatus); //polling void __cdecl PollingThread (void*); void ParsePollData (JSONNODE *data); void ProcessEndpointPresenceRes (JSONNODE *node); void ProcessUserPresenceRes (JSONNODE *node); void ProcessNewMessageRes (JSONNODE *node); void ProcessConversationUpdateRes (JSONNODE *node); void ProcessThreadUpdateRes (JSONNODE *node); // utils bool IsOnline(); bool IsMe(const char *skypeName); MEVENT AddEventToDb(MCONTACT hContact, WORD type, DWORD timestamp, DWORD flags, DWORD cbBlob, PBYTE pBlob); time_t IsoToUnixTime(const TCHAR *stamp); char *RemoveHtml(const char *text); char *GetStringChunk(const char *haystack, size_t len, const char *start, const char *end); int SkypeToMirandaStatus(const char *status); char *MirandaToSkypeStatus(int status); void ShowNotification(const TCHAR *message, int flags = 0, MCONTACT hContact = NULL); void ShowNotification(const TCHAR *caption, const TCHAR *message, int flags = 0, MCONTACT hContact = NULL, int type = 0); static bool IsFileExists(std::tstring path); static LRESULT CALLBACK PopupDlgProcCall(HWND hPopup, UINT uMsg, WPARAM wParam, LPARAM lParam); char *ParseUrl(const char *url, const char *token); char *ChatUrlToName (const char *url); char *ContactUrlToName (const char *url); char *SelfUrlToName (const char *url); char *GetServerFromUrl (const char *url); LPCTSTR ClearText(CMString &value, const TCHAR *message); void CALLBACK SkypeUnsetTimer(void*); void CALLBACK SkypeSetTimer(void*); //events void CSkypeProto::InitDBEvents(); //services INT_PTR __cdecl OnIncomingCallCLE (WPARAM wParam, LPARAM lParam); INT_PTR __cdecl OnIncomingCallPP (WPARAM wParam, LPARAM lParam); INT_PTR __cdecl BlockContact (WPARAM hContact, LPARAM); INT_PTR __cdecl UnblockContact (WPARAM hContact, LPARAM); INT_PTR __cdecl OnRequestAuth (WPARAM hContact, LPARAM lParam); INT_PTR __cdecl OnGrantAuth (WPARAM hContact, LPARAM); INT_PTR __cdecl GetContactHistory (WPARAM hContact, LPARAM lParam); INT_PTR __cdecl SvcCreateChat (WPARAM, LPARAM); INT_PTR __cdecl ParseSkypeUriService (WPARAM, LPARAM lParam); static INT_PTR __cdecl GlobalParseSkypeUriService (WPARAM, LPARAM lParam); template static INT_PTR __cdecl GlobalService(WPARAM wParam, LPARAM lParam) { CSkypeProto *proto = CSkypeProto::GetContactAccount((MCONTACT)wParam); return proto ? (proto->*Service)(wParam, lParam) : 0; } }; HRESULT TestDocumentText(IHTMLDocument3 *pHtmlDoc, BSTR &message); HRESULT TestMarkupServices(BSTR bstrHtml, MarkupCallback *pCallback, BSTR &message); #endif //_SKYPE_PROTO_H_