source: src/halTorrent.hpp @ 236

Revision 236, 7.8 KB checked in by Eoin, 13 years ago (diff)

Another but minor change to UI updating.

Line 
1
2#pragma once
3
4#include <string>
5#include <vector>
6#include <set>
7
8#include <boost/signal.hpp>
9#include <boost/optional.hpp>
10#include <boost/function.hpp>
11#include <boost/date_time/posix_time/posix_time.hpp>
12#include <boost/smart_ptr.hpp>
13#include <boost/algorithm/string.hpp>
14#include <boost/filesystem/path.hpp>
15#include <boost/filesystem/operations.hpp>
16#include <boost/filesystem/fstream.hpp>
17
18#include <asio/ip/tcp.hpp>
19#include <asio/ip/udp.hpp>
20
21using boost::filesystem::path;
22using boost::posix_time::time_duration;
23
24namespace libtorrent { struct peer_info; }
25
26namespace hal
27{
28
29struct torrentBriefDetail
30{
31        std::wstring filename;
32        std::wstring status;
33        std::pair<float,float> speed;
34        float completion;
35        int peers;
36        int seeds;
37};
38
39struct PeerDetail
40{
41        PeerDetail(const std::wstring& ip_address) :
42                ipAddress(ip_address)
43        {}
44        PeerDetail(libtorrent::peer_info& peerInfo);
45       
46        bool operator==(const PeerDetail& peer) const
47        {
48                return (ipAddress == peer.ipAddress);
49        }
50       
51        bool operator<(const PeerDetail& peer) const
52        {
53                return (ipAddress < peer.ipAddress);
54        }
55       
56        wstring ipAddress;
57        std::pair<float,float> speed;
58        bool seed;
59        std::wstring client;
60        std::wstring status;
61};
62
63typedef shared_ptr<PeerDetail> PeerDetail_ptr;
64typedef std::vector<PeerDetail> PeerDetails;
65
66class TorrentDetail 
67{
68public:
69        TorrentDetail(std::wstring f, std::wstring s, std::wstring cT, std::pair<float,float> sp=std::pair<float,float>(0,0),
70                        float c=0, float d=0, boost::int64_t tWD=0, boost::int64_t tW=0, boost::int64_t tU=0, int p=0, int sd=0, float r=0, 
71                        time_duration eta=boost::posix_time::seconds(0), time_duration uIn=boost::posix_time::seconds(0)) :
72                filename_(f),
73                state_(s),
74                currentTracker_(cT),
75                speed_(sp),
76                completion_(c),
77                distributed_copies_(d),
78                totalWantedDone_(tWD),
79                totalWanted_(tW),
80                totalUploaded_(tU),
81                peers_(p),
82                seeds_(sd),
83                ratio_(r),
84                estimatedTimeLeft_(eta),
85                updateTrackerIn_(uIn),
86                peerDetailsFilled_(false)
87        {}             
88
89        TorrentDetail() :       
90                peerDetailsFilled_(false)
91        {};     
92       
93        enum state
94        {
95                torrent_active = 0,
96                torrent_paused,
97                torrent_stopped
98        };
99       
100        const std::wstring& filename() const { return filename_; }
101        const std::wstring& state() const { return state_; }
102        const std::wstring& currentTracker() { return currentTracker_; }
103       
104        std::pair<float,float> speed() const { return speed_; }
105        const float& completion() const { return completion_; }
106        const float& distributedCopies() const { return distributed_copies_; }
107       
108        const boost::int64_t& totalUploaded() const { return totalUploaded_; }
109        const boost::int64_t& totalWantedDone() const { return totalWantedDone_; }
110        const boost::int64_t& totalWanted() const { return totalWanted_; }
111       
112        const int& peers() const { return peers_; }
113        const int& seeds() const { return seeds_; }
114       
115        float ratio() { return ratio_; }
116       
117        const time_duration& estimatedTimeLeft() { return estimatedTimeLeft_; }
118        const time_duration& updateTrackerIn() { return updateTrackerIn_; }
119       
120        const PeerDetails& peerDetails() const;
121       
122public:
123        std::wstring filename_;
124        std::wstring state_;
125        std::wstring currentTracker_;
126
127        std::pair<float,float> speed_;         
128        float completion_;     
129        float distributed_copies_;
130       
131        boost::int64_t totalWantedDone_;
132        boost::int64_t totalWanted_;
133        boost::int64_t totalUploaded_;
134       
135        int peers_;
136        int seeds_;
137       
138        float ratio_;
139       
140        time_duration estimatedTimeLeft_;
141        time_duration updateTrackerIn_;
142       
143private:
144        mutable bool peerDetailsFilled_;
145        mutable PeerDetails peerDetails_;
146};
147
148typedef shared_ptr<TorrentDetail> TorrentDetail_ptr;
149typedef std::vector<TorrentDetail_ptr> TorrentDetail_vec;
150
151class TorrentDetails
152{
153public: 
154        enum sortIndex
155        {
156                sortName = 0,
157                sortStatus,
158                sortCompleted,
159                sortDownload,
160                sortUpload,
161                sortPeers,
162                sortSeeds,
163                sortETA,
164                sortCopies
165        };
166       
167        const TorrentDetail_vec torrents() { return torrents_; }
168        const TorrentDetail_vec selectedTorrents() { return selectedTorrents_; }
169        const TorrentDetail_ptr selectedTorrent() { return selectedTorrent_; }
170       
171        friend class BitTorrent;
172
173private:
174        TorrentDetail_vec torrents_;
175        TorrentDetail_vec selectedTorrents_;
176        TorrentDetail_ptr selectedTorrent_;
177};
178
179struct TrackerDetail
180{
181        TrackerDetail() {}
182        TrackerDetail(std::wstring u, int t) : url(u), tier(t) {}
183       
184        std::wstring url;
185        int tier;
186};
187
188class EventDetail;
189
190struct SessionDetail
191{
192        int port;
193       
194        std::pair<double, double> speed;
195       
196        bool dht_on;
197        size_t dht_nodes;
198        size_t dht_torrents;
199       
200        bool ip_filter_on;
201        size_t ip_ranges_filtered;
202};
203
204typedef boost::function<bool (size_t, size_t, size_t)> filterCallback;
205typedef boost::function<bool (size_t)> progressCallback;
206
207class BitTorrent_impl;
208
209class BitTorrent
210{
211public: 
212        void shutDownSession();
213        void saveTorrentData();
214       
215        bool listenOn(std::pair<int, int> const& portRange);
216        int isListeningOn();
217        void stopListening();
218       
219        bool ensure_dht_on();
220        void ensure_dht_off();
221       
222        void ensure_ip_filter_on(progressCallback fn);
223        void ensure_ip_filter_off();
224        void ip_v4_filter_block(asio::ip::address_v4 first, asio::ip::address_v4 last);
225        void ip_v6_filter_block(asio::ip::address_v6 first, asio::ip::address_v6 last);
226        void ip_filter_import_dat(boost::filesystem::path file, progressCallback fn, bool octalFix);
227        size_t ip_filter_size();
228        void clearIpFilter();
229       
230        void ensure_pe_on(int enc_level, int in_enc_policy, int out_enc_policy, bool prefer_rc4);
231        void ensure_pe_off();
232       
233        void setSessionHalfOpenLimit(int halfConn);
234        void setSessionLimits(int maxConn, int maxUpload);
235        void setSessionSpeed(float download, float upload);
236        void setDhtSettings(int max_peers_reply, int search_branching, 
237                int service_port, int max_fail_count);
238       
239        const SessionDetail getSessionDetails();
240
241        void setTorrentDefaults(int maxConn, int maxUpload, float download, float upload);     
242        void newTorrent(boost::filesystem::wpath filename, boost::filesystem::wpath files);
243        void addTorrent(boost::filesystem::wpath file, wpath saveDirectory);
244        void getAllTorrentDetail_vec(TorrentDetail_vec& torrentsContainer);
245        TorrentDetail_ptr getTorrentDetail_vec(std::string filename);   
246        TorrentDetails getTorrentDetails(std::string selected, std::set<std::string> allSelected);
247       
248        void setTorrentRatio(std::string, float ratio);
249        float getTorrentRatio(std::string);
250       
251        void getAllPeerDetails(std::string filename, PeerDetails& peerContainer);
252       
253        void resumeAll();
254        void closeAll();
255       
256        bool isTorrent(std::string filename);
257       
258        void pauseTorrent(std::string filename);
259        void resumeTorrent(std::string filename);
260        void stopTorrent(std::string filename);
261        bool isTorrentActive(std::string filename);
262       
263        void pauseAllTorrents();
264        void unpauseAllTorrents();
265       
266        void removeTorrent(std::string filename);
267        void removeTorrentWipeFiles(std::string filename);
268        void reannounceTorrent(std::string filename);
269       
270        void setTorrentLogin(std::string filename, std::wstring username, std::wstring password);
271        std::pair<std::wstring, std::wstring> getTorrentLogin(std::string filename);
272       
273        void setTorrentLimit(std::string filename, int maxConn, int maxUpload);
274        void setTorrentSpeed(std::string filename, float download, float upload);
275        pair<int, int> getTorrentLimit(std::string filename);
276        pair<float, float> getTorrentSpeed(std::string filename);
277       
278        void setTorrentTrackers(std::string filename, const std::vector<TrackerDetail>& trackers);
279        void resetTorrentTrackers(std::string filename);
280        std::vector<TrackerDetail> getTorrentTrackers(std::string filename);
281
282        void startEventReceiver();
283        void stopEventReceiver();
284       
285        friend BitTorrent& bittorrent();
286       
287        int defTorrentMaxConn();
288        int defTorrentMaxUpload();
289        float defTorrentDownload();
290        float defTorrentUpload();
291       
292private:
293        BitTorrent();
294        boost::scoped_ptr<BitTorrent_impl> pimpl;
295};
296
297BitTorrent& bittorrent();
298
299};
Note: See TracBrowser for help on using the repository browser.