1 /***************************************************************************
2 *                                                                         *
3 *   This program is free software; you can redistribute it and/or modify  *
4 *   it under the terms of the GNU General Public License as published by  *
5 *   the Free Software Foundation; either version 3 of the License, or     *
6 *   (at your option) any later version.                                   *
7 *                                                                         *
8 ***************************************************************************/
9 
10 #pragma once
11 
12 #include <QWidget>
13 #include <QEvent>
14 #include <QKeyEvent>
15 #include <QShowEvent>
16 #include <QHideEvent>
17 #include <QMap>
18 #include <QMenu>
19 #include <QAction>
20 #include <QHash>
21 #include <QSortFilterProxyModel>
22 #include <QCompleter>
23 #include <QMetaType>
24 #include <QTextBlockUserData>
25 
26 #include "ui_HubFrame.h"
27 
28 #include "dcpp/stdinc.h"
29 #include "dcpp/FastAlloc.h"
30 #include "dcpp/ClientListener.h"
31 #include "dcpp/ClientManager.h"
32 #include "dcpp/ClientManagerListener.h"
33 #include "dcpp/TaskQueue.h"
34 #include "dcpp/User.h"
35 #include "dcpp/Client.h"
36 #include "dcpp/FavoriteManagerListener.h"
37 
38 #include "ArenaWidget.h"
39 #include "WulforUtil.h"
40 
41 class ShellCommandRunner;
42 class PMWindow;
43 class HubFramePrivate;
44 
45 using namespace dcpp;
46 
47 class UserListUserData : public QTextBlockUserData
48 {
49 public:
UserListUserData(const QString & nick)50     UserListUserData(const QString& nick) : data(nick) { }
51     QString data;
52 };
53 
54 class HubFrame :
55         public  QWidget,
56         private Ui::UIHubFrame,
57         private dcpp::ClientListener,
58         private FavoriteManagerListener,
59         public  ArenaWidget
60 {
61     Q_OBJECT
Q_INTERFACES(ArenaWidget)62     Q_INTERFACES(ArenaWidget)
63 
64     class Menu{
65 
66     public:
67 
68         enum Action{
69             /** Actions for userlist */
70             CopyText=0,
71             SearchText,
72             CopyNick,
73             FindInList,
74             BrowseFilelist,
75             MatchQueue,
76             PrivateMessage,
77             FavoriteAdd,
78             FavoriteRem,
79             GrantSlot,
80             RemoveQueue,
81             UserCommands,
82 
83             /** Additional actions for chat */
84             ClearChat,
85             FindInChat,
86             DisableChat,
87             SelectAllChat,
88             ZoomInChat,
89             ZoomOutChat,
90 
91             None,
92 
93             /** Additional actions for userlist */
94             CopyIP,
95             CopyShare,
96             CopyTag,
97 
98             /** Additional actions for AntiSpam */
99             AntiSpamWhite,
100             AntiSpamBlack
101         };
102 
103         Menu();
104         virtual ~Menu();
105 
106         static void newInstance();
107         static void deleteInstance();
108         static Menu *getInstance();
109 
110         Action execUserMenu(Client*, const QString&);
111         Action execChatMenu(Client*, const QString&, bool pmw);
112 
113         QString getLastUserCmd() const;
114 
115     private:
116         QMenu *menu;
117         QList<QAction*> actions;           // actions list for menu
118         QList<QAction*> pm_actions;        // actions list for menu in PMWindow
119         QList<QAction*> ul_actions;        // actions list for menu in user list
120         QList<QAction*> chat_actions;      // chat actions list for menu
121         QList<QAction*> pm_chat_actions;   // chat actions list for menu in PMWindow
122         QMap<QAction*, Action> chat_actions_map; //chat menu has separators and because of it all actions are mapped
123         QString last_user_cmd;
124         static Menu *instance;
125         static unsigned counter;
126     };
127 
128 public:
129     class LinkParser{
130     public:
131        static QString parseForLinks(QString, bool);
132        static void parseForMagnetAlias(QString &output);//find and replace <magnet ...></magnet> sections
133     };
134 
135     typedef QMap<QString, PMWindow*> PMMap;
136     typedef QMap<QString, QVariant> VarMap;
137     typedef QList<ShellCommandRunner*> ShellList;
138 
139     HubFrame(QWidget *parent, QString, QString);
140     ~HubFrame();
141 
142     bool parseForCmd(QString, QWidget *);
143 
144     void createPMWindow(const QString&);
145     void createPMWindow(const dcpp::CID&);
146 
147     bool hasCID(const dcpp::CID &, const QString &);
148 
reconnect()149     inline void reconnect() { slotReconnect(); }
150 
151     // PM functions
152     void addPM(QString, QString, bool keepfocus = true);
153 
154     // Arena Widget interface
155     QWidget *getWidget();
156     QString getArenaTitle();
157     QString getArenaShortTitle();
158     QMenu *getMenu();
159     const QPixmap &getPixmap();
requestFilter()160     void requestFilter() { slotHideFindFrame(); }
requestFocus()161     void requestFocus() { plainTextEdit_INPUT->setFocus(); }
role()162     ArenaWidget::Role role() const { return ArenaWidget::Hub; }
163 
164     QString getCIDforNick(QString nick);
165 
166 Q_SIGNALS:
167     void coreConnecting(QString);
168     void coreConnected(QString);
169     void coreUserUpdated(const dcpp::UserPtr &user, const dcpp::Identity &id);
170     void coreUserRemoved(const dcpp::UserPtr &user, const dcpp::Identity &id);
171     void coreStatusMsg(QString);
172     void coreFollow(QString);
173     void coreFailed();
174     void corePassword();
175     void coreMessage(const VarMap&);
176     void corePrivateMsg(const VarMap&);
177     void coreHubUpdated();
178     void coreFavoriteUserAdded(QString);
179     void coreFavoriteUserRemoved(QString);
180     void closeRequest();
181     void highlighted(const VarMap&);
182     void new_msg(const VarMap&);
183 
184 public Q_SLOTS:
185     void disableChat();
186     void clearChat();
187     void addStatus(QString);
188     QString getHubUrl();
189     QString getHubName();
190     QString getMyNick();
191     void sendMsg(const QString&);
192     void disablePrivateMessages(bool disable);//disconnect corePrivateMsg from this
193 
194     void reloadSomeSettings();
195     void slotHideFindFrame();
196     void slotActivate();
197     void nextMsg();
198     void prevMsg();
199 
200     void getStatistic(quint64 &users, quint64 &share) const;
201     bool isConnected() const;
202     bool isOP(const QString &nick);
203 
204     void browseUserFiles(const QString&, bool=false);
205 
206 protected:
207     virtual bool eventFilter(QObject *, QEvent *);
208     virtual void closeEvent(QCloseEvent*);
209     virtual void showEvent(QShowEvent *);
210     virtual void hideEvent(QHideEvent *);
211 
212     virtual void sendChat(QString, bool, bool);
213     virtual void save();
214     virtual void load();
215 
216 private Q_SLOTS:
217     void slotUsersUpdated();
218     void slotReconnect();
219     void slotMapOnArena();
220     void slotClose();
221     void slotPMClosed(QString);
222     void slotUserListMenu(const QPoint&);
223     void slotChatMenu(const QPoint&);
224     void slotHeaderMenu(const QPoint&);
225     void slotShowWnd();
226     void slotShellFinished(bool, QString);
227     void slotFilterTextChanged();
slotFindForward()228     void slotFindForward() { findText(0); }
slotFindBackward()229     void slotFindBackward(){ findText(QTextDocument::FindBackward); }
230     void slotFindTextEdited(const QString & text);
231     void slotInputTextChanged();
232     void slotInputContextMenu();
233     void slotFindAll();
234     void slotStatusLinkOpen(const QString &url);
235     void slotHubMenu(QAction*);
236     void slotSmile();
237     void slotSmileClicked();
238     void slotSmileContextMenu();
239     void slotSettingsChanged(const QString &, const QString &);
240     void slotBoolSettingsChanged(const QString&, int);
241     void slotCopyHubURL();
242     void slotCopyHubTitle();
243     void slotCopyHubIP();
244 
245     void grantSlot(const QString&);
246     void addUserToFav(const QString&);
247     void delUserFromFav(const QString&);
248     void changeFavStatus(const QString&);
249     void delUserFromQueue(const QString&);
250     void addAsFavorite();
251 
252     void userUpdated(const dcpp::UserPtr&, const dcpp::Identity&);
253     void userRemoved(const dcpp::UserPtr&, const dcpp::Identity&);
254     void follow(QString);
255     void clearUsers();
256     void getPassword();
257     void newMsg(const VarMap&);
258     void newPm(const VarMap&);
259 
260 private:
261     // Chat functions
262     void addOutput(QString);
263 
264     // GUI setup functions
265     void init();
266     void initMenu();
267 
268     QString getUserInfo(UserListItem *item);
269 
270     void pmUserOffline(QString);
271     void pmUserEvent(QString, QString);
272 
273     void findText(QTextDocument::FindFlags );
274 
275     void updateStyles();
276 
277     /** Extracts data from user identity */
278     void getParams(VarMap &, const Identity &);
279 
280     // FavoriteManagerListener
281     virtual void on(FavoriteManagerListener::UserAdded, const FavoriteUser& /*aUser*/) noexcept;
282     virtual void on(FavoriteManagerListener::UserRemoved, const FavoriteUser& /*aUser*/) noexcept;
283 
284     // ClientListener interface
285     virtual void on(ClientListener::Connecting, Client*) noexcept;
286     virtual void on(ClientListener::Connected, Client*) noexcept;
287     virtual void on(ClientListener::UserUpdated, Client*, const OnlineUser&) noexcept;
288     virtual void on(ClientListener::UsersUpdated, Client*, const OnlineUserList&) noexcept;
289     virtual void on(ClientListener::UserRemoved, Client*, const OnlineUser&) noexcept;
290     virtual void on(ClientListener::Redirect, Client*, const string&) noexcept;
291     virtual void on(ClientListener::Failed, Client*, const string&) noexcept;
292     virtual void on(ClientListener::GetPassword, Client*) noexcept;
293     virtual void on(ClientListener::HubUpdated, Client*) noexcept;
294     virtual void on(ClientListener::Message, Client*, const ChatMessage&) noexcept;
295     virtual void on(ClientListener::StatusMessage, Client*, const string&, int = ClientListener::FLAG_NORMAL) noexcept;
296     virtual void on(ClientListener::NickTaken, Client*) noexcept;
297     virtual void on(ClientListener::SearchFlood, Client*, const string&) noexcept;
298 
299     Q_DECLARE_PRIVATE(HubFrame);
300 
301     HubFramePrivate *d_ptr;
302 };
303 
304 Q_DECLARE_METATYPE(HubFrame*)
305