/* Copyright (C) 2013 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 . */ struct CVkProto; typedef void (CVkProto::*VK_REQUEST_HANDLER)(NETLIBHTTPREQUEST*, void*); struct CVkProto : public PROTO { CVkProto(const char*, const TCHAR*); ~CVkProto(); //==================================================================================== // PROTO_INTERFACE //==================================================================================== virtual HANDLE __cdecl AddToList(int flags, PROTOSEARCHRESULT* psr); virtual HANDLE __cdecl AddToListByEvent(int flags, int iContact, HANDLE hDbEvent); virtual int __cdecl Authorize(HANDLE hDbEvent); virtual int __cdecl AuthDeny(HANDLE hDbEvent, const TCHAR *szReason); virtual int __cdecl AuthRecv(HANDLE hContact, PROTORECVEVENT*); virtual int __cdecl AuthRequest(HANDLE hContact, const TCHAR *szMessage); virtual HANDLE __cdecl ChangeInfo(int iInfoType, void* pInfoData); virtual HANDLE __cdecl FileAllow(HANDLE hContact, HANDLE hTransfer, const TCHAR *szPath); virtual int __cdecl FileCancel(HANDLE hContact, HANDLE hTransfer); virtual int __cdecl FileDeny(HANDLE hContact, HANDLE hTransfer, const TCHAR *szReason); virtual int __cdecl FileResume(HANDLE hTransfer, int* action, const TCHAR** szFilename); virtual DWORD_PTR __cdecl GetCaps(int type, HANDLE hContact = NULL); virtual int __cdecl GetInfo(HANDLE hContact, int infoType); virtual HANDLE __cdecl SearchBasic(const TCHAR *id); virtual HANDLE __cdecl SearchByEmail(const TCHAR *email); virtual HANDLE __cdecl SearchByName(const TCHAR *nick, const TCHAR *firstName, const TCHAR *lastName); virtual HWND __cdecl SearchAdvanced(HWND owner); virtual HWND __cdecl CreateExtendedSearchUI(HWND owner); virtual int __cdecl RecvContacts(HANDLE hContact, PROTORECVEVENT*); virtual int __cdecl RecvFile(HANDLE hContact, PROTORECVFILET*); virtual int __cdecl RecvMsg(HANDLE hContact, PROTORECVEVENT*); virtual int __cdecl RecvUrl(HANDLE hContact, PROTORECVEVENT*); virtual int __cdecl SendContacts(HANDLE hContact, int flags, int nContacts, HANDLE* hContactsList); virtual HANDLE __cdecl SendFile(HANDLE hContact, const TCHAR *szDescription, TCHAR** ppszFiles); virtual int __cdecl SendMsg(HANDLE hContact, int flags, const char* msg); virtual int __cdecl SendUrl(HANDLE hContact, int flags, const char* url); virtual int __cdecl SetApparentMode(HANDLE hContact, int mode); virtual int __cdecl SetStatus(int iNewStatus); virtual HANDLE __cdecl GetAwayMsg(HANDLE hContact); virtual int __cdecl RecvAwayMsg(HANDLE hContact, int mode, PROTORECVEVENT* evt); virtual int __cdecl SetAwayMsg(int m_iStatus, const TCHAR *msg); virtual int __cdecl UserIsTyping(HANDLE hContact, int type); virtual int __cdecl OnEvent(PROTOEVENTTYPE eventType, WPARAM wParam, LPARAM lParam); //==== Events ======================================================================== int __cdecl OnModulesLoaded(WPARAM, LPARAM); int __cdecl OnOptionsInit(WPARAM, LPARAM); int __cdecl OnPreShutdown(WPARAM, LPARAM); void OnOAuthAuthorize(NETLIBHTTPREQUEST*, void*); void OnReceiveMyInfo(NETLIBHTTPREQUEST*, void*); void OnReceiveAvatar(NETLIBHTTPREQUEST*, void*); //==== Services ====================================================================== INT_PTR __cdecl SvcCreateAccMgrUI(WPARAM, LPARAM); INT_PTR __cdecl SvcGetAvatarInfo(WPARAM, LPARAM); INT_PTR __cdecl SvcGetAvatarCaps(WPARAM, LPARAM); //==== Misc ========================================================================== TCHAR* GetUserStoredPassword(void); void RetrieveUserInfo(LONG userId); void OnReceiveUserInfo(NETLIBHTTPREQUEST*, void*); void RetrieveFriends(); void OnReceiveFriends(NETLIBHTTPREQUEST*, void*); void RetrieveUnreadMessages(); void OnReceiveMessages(NETLIBHTTPREQUEST*, void*); void OnSendMessage(NETLIBHTTPREQUEST*, void*); void RetrievePollingInfo(); void OnReceivePollingInfo(NETLIBHTTPREQUEST*, void*); void __cdecl PollingThread(void*); int PollServer(); void PollUpdates(JSONNODE*); void OnReceivePolling(NETLIBHTTPREQUEST*, void*); int SetServerStatus(int); __forceinline bool IsOnline() const { return m_bOnline; } private: struct AsyncHttpRequest : public NETLIBHTTPREQUEST, public MZeroedObject { AsyncHttpRequest(); ~AsyncHttpRequest(); void AddHeader(LPCSTR, LPCSTR); void Redirect(NETLIBHTTPREQUEST*); VK_REQUEST_HANDLER m_pFunc; void *pUserInfo; }; LIST m_arRequestsQueue; CRITICAL_SECTION m_csRequestsQueue; CMStringA m_prevUrl; HANDLE m_evRequestsQueue; HANDLE m_hWorkerThread; bool m_bTerminated; struct Cookie { Cookie(const CMStringA& name, const CMStringA& value, const CMStringA& domain) : m_name(name), m_value(value), m_domain(domain) {} CMStringA m_name, m_value, m_domain; }; OBJLIST m_cookies; void GrabCookies(NETLIBHTTPREQUEST *nhr); void ApplyCookies(AsyncHttpRequest*); void InitQueue(); void UninitQueue(); void ExecuteRequest(AsyncHttpRequest*); bool PushAsyncHttpRequest(int iRequestType, LPCSTR szUrl, bool bSecure, VK_REQUEST_HANDLER pFunc, int nParams = 0, HttpParam *pParams = 0, int iTimeout = 10000); bool PushAsyncHttpRequest(AsyncHttpRequest*, int iTimeout = 10000); void __cdecl WorkerThread(void*); CMStringA RunCaptchaForm(LPCSTR szUrl); CMStringA AutoFillForm(char*, CMStringA&); void ConnectionFailed(int iReason); bool CheckJsonResult(JSONNODE*); void OnLoggedIn(); void OnLoggedOut(); void ShutdownSession(); void GetAvatarFileName(HANDLE hContact, TCHAR* pszDest, size_t cbLen); HANDLE FindUser(LONG userid, bool bCreate = false); void SetAllContactStatuses(int status); void __cdecl SendMsgAck(void *param); bool m_bOnline; LONG m_myUserId; ptrA m_szAccessToken; ptrT m_defaultGroup; UINT_PTR m_timer; ptrA m_pollingServer, m_pollingKey, m_pollingTs; HANDLE m_pollingConn, m_hPollingThread; ULONG m_msgId; bool m_prevError; LIST m_sendIds; bool CheckMid(int msgid); };