/* Facebook plugin for Miranda Instant Messenger _____________________________________________ Copyright © 2009-11 Michal Zelinka, 2011-12 Robert Pösel 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, either version 2 of the License, or (at your option) any later version. 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 . */ #pragma once class FacebookProto : public PROTO_INTERFACE, public MZeroedObject { public: FacebookProto( const char *proto_name, const TCHAR *username ); ~FacebookProto( ); inline const char* ModuleName( ) const { return m_szModuleName; } inline bool isOnline( ) { return ( m_iStatus != ID_STATUS_OFFLINE && m_iStatus != ID_STATUS_CONNECTING ); } inline bool isOffline( ) { return ( m_iStatus == ID_STATUS_OFFLINE ); } inline bool isInvisible( ) { return ( m_iStatus == ID_STATUS_INVISIBLE ); } //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 PROTOCHAR* szReason ); virtual int __cdecl AuthRecv( HANDLE hContact, PROTORECVEVENT* ); virtual int __cdecl AuthRequest( HANDLE hContact, const PROTOCHAR* szMessage ); virtual HANDLE __cdecl ChangeInfo( int iInfoType, void* pInfoData ); virtual HANDLE __cdecl FileAllow( HANDLE hContact, HANDLE hTransfer, const PROTOCHAR* szPath ); virtual int __cdecl FileCancel( HANDLE hContact, HANDLE hTransfer ); virtual int __cdecl FileDeny( HANDLE hContact, HANDLE hTransfer, const PROTOCHAR* szReason ); virtual int __cdecl FileResume( HANDLE hTransfer, int* action, const PROTOCHAR** szFilename ); virtual DWORD_PTR __cdecl GetCaps( int type, HANDLE hContact = NULL ); virtual HICON __cdecl GetIcon( int iconIndex ); virtual int __cdecl GetInfo( HANDLE hContact, int infoType ); virtual HANDLE __cdecl SearchBasic( const PROTOCHAR* id ); virtual HANDLE __cdecl SearchByEmail( const PROTOCHAR* email ); virtual HANDLE __cdecl SearchByName( const PROTOCHAR* nick, const PROTOCHAR* firstName, const PROTOCHAR* 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, PROTOFILEEVENT* ); 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 PROTOCHAR* szDescription, PROTOCHAR** 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 SendAwayMsg( HANDLE hContact, HANDLE hProcess, const char* msg ); virtual int __cdecl SetAwayMsg( int iStatus, const PROTOCHAR* msg ); virtual int __cdecl UserIsTyping( HANDLE hContact, int type ); virtual int __cdecl OnEvent( PROTOEVENTTYPE iEventType, WPARAM wParam, LPARAM lParam ); //////////////////////// // Services int __cdecl GetMyAwayMsg( WPARAM, LPARAM ); int __cdecl SetMyAwayMsg( WPARAM, LPARAM ); int __cdecl SvcCreateAccMgrUI( WPARAM, LPARAM ); int __cdecl GetMyAvatar(WPARAM, LPARAM ); int __cdecl GetAvatarInfo(WPARAM, LPARAM ); int __cdecl GetAvatarCaps(WPARAM, LPARAM ); int __cdecl VisitProfile(WPARAM, LPARAM ); int __cdecl CancelFriendship(WPARAM, LPARAM ); int __cdecl RequestFriendship(WPARAM, LPARAM ); int __cdecl ApproveFriendship(WPARAM, LPARAM ); int __cdecl OnCancelFriendshipRequest(WPARAM, LPARAM ); int __cdecl CheckNewsfeeds(WPARAM, LPARAM ); int __cdecl CheckFriendRequests(WPARAM, LPARAM ); int __cdecl RefreshBuddyList(WPARAM, LPARAM ); // Events int __cdecl OnModulesLoaded(WPARAM, LPARAM); int __cdecl OnOptionsInit(WPARAM, LPARAM); int __cdecl OnBuildStatusMenu(WPARAM,LPARAM); int __cdecl OnContactDeleted(WPARAM,LPARAM); int __cdecl OnMind(WPARAM,LPARAM); int __cdecl OnPreShutdown(WPARAM,LPARAM); int __cdecl OnPrebuildContactMenu(WPARAM,LPARAM); int __cdecl OnIdleChanged(WPARAM,LPARAM); int __cdecl OnChatOutgoing(WPARAM,LPARAM); int __cdecl OnJoinChat(WPARAM,LPARAM); int __cdecl OnLeaveChat(WPARAM,LPARAM); // Loops bool NegotiateConnection(); BYTE GetPollRate(); void __cdecl MessageLoop(void*); void __cdecl UpdateLoop(void*); // Processing threads void __cdecl ProcessBuddyList(void*); void __cdecl ProcessFriendList(void*); void __cdecl ProcessMessages(void*); void __cdecl ProcessUnreadMessages(void*); void __cdecl ProcessFeeds(void*); void __cdecl ProcessNotifications(void*); void __cdecl ProcessFriendRequests(void*); void __cdecl SearchAckThread(void*); // Worker threads void __cdecl SignOn(void*); void __cdecl ChangeStatus(void*); void __cdecl SignOff(void*); void __cdecl SetAwayMsgWorker(void*); void __cdecl UpdateAvatarWorker(void*); void __cdecl SendMsgWorker(void*); void __cdecl SendChatMsgWorker(void*); void __cdecl SendTypingWorker(void*); void __cdecl MessagingWorker(void*); void __cdecl DeleteContactFromServer(void*); void __cdecl AddContactToServer(void*); void __cdecl ApproveContactToServer(void*); void __cdecl CancelFriendsRequest(void*); // Contacts handling bool IsMyContact(HANDLE, bool include_chat = false); HANDLE ContactIDToHContact(std::string); HANDLE ChatIDToHContact(std::string); HANDLE AddToContactList(facebook_user*, BYTE type, bool dont_check = false, const char *new_name = ""); void SetAllContactStatuses(int status, bool reset_client = false); HANDLE HContactFromAuthEvent(HANDLE hEvent); // Chats handling void AddChat(const char *id, const char *name); void UpdateChat(const char *chat_id, const char *id, const char *name, const char *message, DWORD timestamp = 0); bool IsChatContact(const char *chat_id, const char *id); void AddChatContact(const char *chat_id, const char *id, const char *name); void RemoveChatContact(const char *chat_id, const char *id); void SetChatStatus(const char *chat_id, int status); char *GetChatUsers(const char *chat_id); // Connection client facebook_client facy; // TODO: Refactor to "client" and make dynamic // Helpers std::tstring GetAvatarFolder(); bool GetDbAvatarInfo(PROTO_AVATAR_INFORMATIONT &ai, std::string *url); void CheckAvatarChange(HANDLE hContact, std::string image_url); void ToggleStatusMenuItems( BOOL bEnable ); void parseSmileys(std::string message, HANDLE hContact); // Handles, Locks HGENMENU m_hMenuRoot; HGENMENU m_hMenuServicesRoot; HANDLE m_hStatusMind; HANDLE signon_lock_; HANDLE avatar_lock_; HANDLE log_lock_; HANDLE update_loop_lock_; HANDLE m_hNetlibUser; std::string last_status_msg_; std::tstring def_avatar_folder_; HANDLE hAvatarFolder_; HANDLE hSmileysFolder_; std::vector avatar_queue; static void CALLBACK APC_callback(ULONG_PTR p); // Information providing int Log(const char *fmt,...); void NotifyEvent(TCHAR* title, TCHAR* info, HANDLE contact, DWORD flags, TCHAR* url=NULL); };