/* Copyright © 2009 Jim Porter 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 #include "utility.h" #include class TwitterProto : public PROTO_INTERFACE { public: TwitterProto(const char *, const TCHAR *); ~TwitterProto(); __inline void* operator new(size_t size) { return calloc(1, size); } __inline void operator delete(void *p) { free(p); } inline const char * ModuleName() const { return m_szModuleName; } //PROTO_INTERFACE virtual HANDLE __cdecl AddToList(int, PROTOSEARCHRESULT *); virtual HANDLE __cdecl AddToListByEvent(int, int, HANDLE); virtual int __cdecl Authorize(HANDLE); virtual int __cdecl AuthDeny(HANDLE, const TCHAR *); virtual int __cdecl AuthRecv(HANDLE, PROTORECVEVENT *); virtual int __cdecl AuthRequest(HANDLE, const TCHAR *); virtual HANDLE __cdecl ChangeInfo(int, void *); virtual HANDLE __cdecl FileAllow(HANDLE, HANDLE, const TCHAR *); virtual int __cdecl FileCancel(HANDLE, HANDLE); virtual int __cdecl FileDeny(HANDLE, HANDLE, const TCHAR *); virtual int __cdecl FileResume(HANDLE, int *, const TCHAR **); virtual DWORD __cdecl GetCaps(int, HANDLE = 0); virtual HICON __cdecl GetIcon(int); virtual int __cdecl GetInfo(HANDLE, int); virtual HANDLE __cdecl SearchBasic(const TCHAR *); virtual HANDLE __cdecl SearchByEmail(const TCHAR *); virtual HANDLE __cdecl SearchByName(const TCHAR *, const TCHAR *, const TCHAR *); virtual HWND __cdecl SearchAdvanced(HWND); virtual HWND __cdecl CreateExtendedSearchUI(HWND); virtual int __cdecl RecvContacts(HANDLE, PROTORECVEVENT *); virtual int __cdecl RecvFile(HANDLE, PROTORECVFILET *); virtual int __cdecl RecvMsg(HANDLE, PROTORECVEVENT *); virtual int __cdecl RecvUrl(HANDLE, PROTORECVEVENT *); virtual int __cdecl SendContacts(HANDLE, int, int, HANDLE *); virtual HANDLE __cdecl SendFile(HANDLE, const TCHAR *, TCHAR **); virtual int __cdecl SendMsg(HANDLE, int, const char *); virtual int __cdecl SendUrl(HANDLE, int, const char *); virtual int __cdecl SetApparentMode(HANDLE, int); virtual int __cdecl SetStatus(int); virtual HANDLE __cdecl GetAwayMsg(HANDLE); virtual int __cdecl RecvAwayMsg(HANDLE, int, PROTORECVEVENT *); virtual int __cdecl SendAwayMsg(HANDLE, HANDLE, const char *); virtual int __cdecl SetAwayMsg(int, const TCHAR *); virtual int __cdecl UserIsTyping(HANDLE, int); virtual int __cdecl OnEvent(PROTOEVENTTYPE, WPARAM, LPARAM); void UpdateSettings(); // Services int __cdecl SvcCreateAccMgrUI(WPARAM, LPARAM); int __cdecl GetName(WPARAM, LPARAM); int __cdecl GetStatus(WPARAM, LPARAM); int __cdecl ReplyToTweet(WPARAM, LPARAM); int __cdecl VisitHomepage(WPARAM, LPARAM); int __cdecl GetAvatar(WPARAM, LPARAM); int __cdecl SetAvatar(WPARAM, LPARAM); // Events int __cdecl OnContactDeleted(WPARAM, LPARAM); int __cdecl OnBuildStatusMenu(WPARAM, LPARAM); int __cdecl OnOptionsInit(WPARAM, LPARAM); int __cdecl OnTweet(WPARAM, LPARAM); int __cdecl OnModulesLoaded(WPARAM, LPARAM); int __cdecl OnPreShutdown(WPARAM, LPARAM); int __cdecl OnPrebuildContactMenu(WPARAM, LPARAM); int __cdecl OnChatOutgoing(WPARAM, LPARAM); int __cdecl OnJoinChat(WPARAM, LPARAM); int __cdecl OnLeaveChat(WPARAM, LPARAM); void __cdecl SendTweetWorker(void *); private: // Worker threads void __cdecl AddToListWorker(void *p); void __cdecl SendSuccess(void *); void __cdecl DoSearch(void *); void __cdecl SignOn(void *); void __cdecl MessageLoop(void *); void __cdecl GetAwayMsgWorker(void *); void __cdecl UpdateAvatarWorker(void *); void __cdecl UpdateInfoWorker(void *); bool NegotiateConnection(); void UpdateStatuses(bool pre_read, bool popups); void UpdateMessages(bool pre_read); void UpdateFriends(); void UpdateAvatar(HANDLE, const std::string &, bool force=false); void ShowPopup(const wchar_t *); void ShowPopup(const char *); void ShowContactPopup(HANDLE, const std::tstring &); bool IsMyContact(HANDLE, bool include_chat = false); HANDLE UsernameToHContact(const TCHAR *); HANDLE AddToClientList(const TCHAR *, const TCHAR *); void SetAllContactStatuses(int); int LOG(const char *fmt, ...); static void CALLBACK APC_callback(ULONG_PTR p); void UpdateChat(const twitter_user &update); void AddChatContact(const TCHAR *name, const TCHAR *nick=0); void DeleteChatContact(const TCHAR *name); void SetChatStatus(int); std::string GetAvatarFolder(); HANDLE signon_lock_; HANDLE avatar_lock_; HANDLE twitter_lock_; HANDLE hNetlib_; HANDLE hAvatarNetlib_; HANDLE hMsgLoop_; mir_twitter twit_; twitter_id since_id_; twitter_id dm_since_id_; std::string def_avatar_folder_; HANDLE hAvatarFolder_; bool in_chat_; }; // TODO: remove this inline std::string profile_base_url(const std::string &url) { size_t x = url.find("://"); if (x == std::string::npos) return url.substr(0, url.find('/')+1); else return url.substr(0, url.find('/', x+3)+1); }