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 <QAction>
14 #include <QMenu>
15 #include <QCloseEvent>
16 #include <QResizeEvent>
17 #include <QHideEvent>
18 #include <QHeaderView>
19 
20 #include "ui_UITransferView.h"
21 #include "TransferViewModel.h"
22 
23 #include "dcpp/stdinc.h"
24 #include "dcpp/Singleton.h"
25 #include "dcpp/ConnectionManager.h"
26 #include "dcpp/DownloadManager.h"
27 #include "dcpp/LogManager.h"
28 #include "dcpp/QueueManager.h"
29 #include "dcpp/UploadManager.h"
30 
31 
32 class TransferViewModel;
33 
34 class TransferView : public QWidget,
35                      private Ui::UITransferView,
36                      public dcpp::Singleton<TransferView>,
37                      public dcpp::ConnectionManagerListener,
38                      public dcpp::DownloadManagerListener,
39                      public dcpp::QueueManagerListener,
40                      public dcpp::UploadManagerListener
41 {
42     Q_OBJECT
43 
44 friend class dcpp::Singleton<TransferView>;
45 
46 typedef QMap<QString, QVariant> VarMap;
47 
48 class Menu{
49 
50 public:
51     enum Action {
52         Browse=0,
53         SearchAlternates,
54         MatchQueue,
55         SendPM,
56         AddToFav,
57         GrantExtraSlot,
58         Copy,
59         RemoveFromQueue,
60         Force,
61         Close,
62         None
63     };
64 
65     Menu();
66     virtual ~Menu();
67 
68     Action exec();
copyColumn()69     int copyColumn() const {return selectedColumn; }
70 
71 private:
72     QMenu *menu;
73     QMenu *copy_column;
74     QMap <QAction*, Action> actions;
75     int selectedColumn;
76 };
77 
78 public:
79     QSize sizeHint() const;
80 
81 Q_SIGNALS:
82     /** DownloadManger signals */
83     void coreDMRequesting(VarMap);
84     void coreDMStarting(VarMap);
85     void coreDMTick(VarMap);
86     void coreDMComplete(VarMap);
87     void coreDMFailed(VarMap);
88 
89     /** ConnectionManager  signals */
90     void coreCMAdded(VarMap);
91     void coreCMConnected(VarMap);
92     void coreCMRemoved(VarMap);
93     void coreCMFailed(VarMap);
94     void coreCMStatusChanged(VarMap);
95 
96     /** QueueManager signals */
97     void coreQMFinished(VarMap);
98     void coreQMRemoved(VarMap);
99 
100     /** UploadManager signals */
101     void coreUMStarting(VarMap);
102     void coreUMTick(VarMap);
103     void coreUMComplete(VarMap);
104     void coreUMFailed(VarMap);
105 
106     void coreUpdateParents();
107     void coreUpdateTransferPosition(VarMap, qint64);
108 
109     void coreDownloadComplete(QString);
110 
111 protected:
112     virtual void resizeEvent(QResizeEvent *);
113     virtual void closeEvent(QCloseEvent *);
114     virtual void hideEvent(QHideEvent *);
115 
116     void getFileList(const QString &, const QString &);
117     void matchQueue(const QString &, const QString &);
118     void addFavorite(const QString&);
119     void grantSlot(const QString&, const QString&);
120     void removeFromQueue(const QString&);
121     void forceAttempt(const QString&);
122     void closeConection(const QString &, bool);
123     void searchAlternates(const QString &tth);
124     void onFailed(dcpp::Download* dl, const std::string& reason);
125     // DownloadManager
126     virtual void on(dcpp::DownloadManagerListener::Requesting, dcpp::Download* dl) noexcept;
127     virtual void on(dcpp::DownloadManagerListener::Starting, dcpp::Download* dl) noexcept;
128     virtual void on(dcpp::DownloadManagerListener::Tick, const dcpp::DownloadList& dls) noexcept;
129     virtual void on(dcpp::DownloadManagerListener::Complete, dcpp::Download* dl) noexcept;
130     virtual void on(dcpp::DownloadManagerListener::Failed, dcpp::Download* dl, const std::string& reason) noexcept;
131     // ConnectionManager
132     virtual void on(dcpp::ConnectionManagerListener::Added, dcpp::ConnectionQueueItem* cqi) noexcept;
133     virtual void on(dcpp::ConnectionManagerListener::Connected, dcpp::ConnectionQueueItem* cqi) noexcept;
134     virtual void on(dcpp::ConnectionManagerListener::Removed, dcpp::ConnectionQueueItem* cqi) noexcept;
135     virtual void on(dcpp::ConnectionManagerListener::Failed, dcpp::ConnectionQueueItem* cqi, const std::string&) noexcept;
136     virtual void on(dcpp::ConnectionManagerListener::StatusChanged, dcpp::ConnectionQueueItem* cqi) noexcept;
137     // QueueManager
138     virtual void on(dcpp::QueueManagerListener::Finished, dcpp::QueueItem*, const std::string&, int64_t size) noexcept;
139     virtual void on(dcpp::QueueManagerListener::Removed, dcpp::QueueItem*) noexcept;
140     virtual void on(dcpp::QueueManagerListener::CRCFailed, dcpp::Download* aDownload, const std::string& reason) noexcept;
141     // UploadManager
142     virtual void on(dcpp::UploadManagerListener::Starting, dcpp::Upload* ul) noexcept;
143     virtual void on(dcpp::UploadManagerListener::Tick, const dcpp::UploadList& uls) noexcept;
144     virtual void on(dcpp::UploadManagerListener::Complete, dcpp::Upload* ul) noexcept;
145     virtual void on(dcpp::UploadManagerListener::Failed, dcpp::Upload* ul, const std::string& reason) noexcept;
146 
147 private Q_SLOTS:
148     void slotContextMenu(const QPoint&);
149     void slotHeaderMenu(const QPoint&);
150     void downloadComplete(QString);
151     \
152 private:
153     TransferView(QWidget* = NULL);
154     virtual ~TransferView();
155 
156     void load();
157     void save();
158 
vstr(const QVariant & var)159     inline QString      vstr(const QVariant &var) { return var.toString(); }
vint(const QVariant & var)160     inline int          vint(const QVariant &var) { return var.toInt(); }
vdbl(const QVariant & var)161     inline double       vdbl(const QVariant &var) { return var.toDouble(); }
vlng(const QVariant & var)162     inline qlonglong    vlng(const QVariant &var) { return var.toLongLong(); }
163 
164     QString getTTHFromItem(const TransferViewItem *);
165 
166     void getParams(VarMap&, const dcpp::ConnectionQueueItem*);
167     void getParams(VarMap&, const dcpp::Transfer*);
168 
169     void init();
170 
171     TransferViewModel *model;
172 };
173