source: trunk/src/halTorrentManager.hpp @ 741

Revision 741, 5.5 KB checked in by Eoin, 11 years ago (diff)

Torrent manager given it's own header with cleanup refactoring.

Line 
1
2//         Copyright Eóin O'Callaghan 2009 - 2009.
3// Distributed under the Boost Software License, Version 1.0.
4//    (See accompanying file LICENSE_1_0.txt or copy at
5//          http://www.boost.org/LICENSE_1_0.txt)
6
7#pragma once
8
9#ifndef HAL_TORRENT_STATE_LOGGING
10#       define TORRENT_STATE_LOG(s)
11#else
12#       include "../halEvent.hpp"
13#       define TORRENT_STATE_LOG(msg) \
14        hal::event_log.post(boost::shared_ptr<hal::EventDetail>( \
15                        new hal::EventMsg(msg, hal::event_logger::torrent_dev)))
16#endif
17
18#pragma warning (push, 1)
19#       include <libtorrent/file.hpp>
20#       include <libtorrent/hasher.hpp>
21#       include <libtorrent/storage.hpp>
22#       include <libtorrent/file_pool.hpp>
23#       include <libtorrent/alert_types.hpp>
24#       include <libtorrent/entry.hpp>
25#       include <libtorrent/bencode.hpp>
26#       include <libtorrent/session.hpp>
27#       include <libtorrent/ip_filter.hpp>
28#       include <libtorrent/torrent_handle.hpp>
29#       include <libtorrent/peer_connection.hpp>
30#       include <libtorrent/extensions/metadata_transfer.hpp>
31#       include <libtorrent/extensions/ut_pex.hpp>
32#pragma warning (pop)
33
34#include <boost/tuple/tuple.hpp>
35#include <boost/enable_shared_from_this.hpp>
36#include <boost/multi_index_container.hpp>
37#include <boost/multi_index/ordered_index.hpp>
38#include <boost/multi_index/indexed_by.hpp>
39#include <boost/multi_index/identity.hpp>
40#include <boost/multi_index/member.hpp>
41#include <boost/multi_index/tag.hpp>
42
43#include <boost/mpl/list.hpp>
44
45#include "halIni.hpp"
46#include "halTorrentInternal.hpp"
47
48
49namespace hal
50{
51
52
53class torrent_manager : 
54        public hal::IniBase<torrent_manager>
55{
56        typedef torrent_manager thisClass;
57        typedef hal::IniBase<thisClass> iniClass;
58
59        struct torrent_holder
60        {
61                mutable torrent_internal_ptr torrent;
62               
63                wstring filename;
64                wstring name;           
65               
66                torrent_holder()
67                {}
68               
69                explicit torrent_holder(torrent_internal_ptr t) :
70                        torrent(t), filename(torrent->filename()), name(torrent->name())
71                {}                             
72
73                friend class boost::serialization::access;
74                template<class Archive>
75                void load(Archive& ar, const unsigned int version)
76                {
77                        using boost::serialization::make_nvp;
78
79                        ar & make_nvp("torrent", torrent);
80                        ar & make_nvp("filename", filename);
81                        ar & make_nvp("name", name);
82
83                        torrent->initialize_state_machine(torrent);
84                }
85
86                template<class Archive>
87                void save(Archive& ar, const unsigned int version) const
88                {
89                        using boost::serialization::make_nvp;
90
91                        ar & make_nvp("torrent", torrent);
92                        ar & make_nvp("filename", filename);
93                        ar & make_nvp("name", name);
94                }
95
96                BOOST_SERIALIZATION_SPLIT_MEMBER()
97        };
98       
99        struct by_filename{};
100        struct by_name{};
101       
102        typedef boost::multi_index_container<
103                torrent_holder,
104                boost::multi_index::indexed_by<
105                        boost::multi_index::ordered_unique<
106                                boost::multi_index::tag<by_filename>,
107                                boost::multi_index::member<
108                                        torrent_holder, wstring, &torrent_holder::filename> 
109                                >,
110                        boost::multi_index::ordered_unique<
111                                boost::multi_index::tag<by_name>,
112                                boost::multi_index::member<
113                                        torrent_holder, wstring, &torrent_holder::name> 
114                                >
115                >
116        > torrent_multi_index;
117       
118public:
119        typedef torrent_multi_index::index<by_filename>::type torrent_by_filename;
120        typedef torrent_multi_index::index<by_name>::type torrent_by_name;
121       
122        torrent_manager(ini_file& ini) :
123                iniClass("bittorrent", "torrent_manager", ini)
124        {}
125
126        ~torrent_manager()
127        {
128                for (torrent_by_name::iterator i= torrents_.get<by_name>().begin(), 
129                        e = torrents_.get<by_name>().end(); i!=e; ++i)
130                {
131                        (*i).torrent->stop();
132                }
133        }
134
135        torrent_internal_ptr create_torrent(wpath filename, wpath saveDirectory, bit::allocations alloc, wpath move_to_directory=L"")
136        {
137                torrent_internal_ptr t = torrent_internal_ptr(new torrent_internal(filename, saveDirectory, alloc, move_to_directory));
138
139                std::pair<torrent_by_name::iterator, bool> p = torrents_.get<by_name>().insert(torrent_holder(t));
140
141                if (!p.second) 
142                        t.reset();
143                else
144                        t->initialize_state_machine(t);
145
146                return t;                       
147        }
148       
149        size_t remove_torrent(const wstring& name)
150        {               
151                TORRENT_STATE_LOG(L"Torrent manager erasing");
152
153                return torrents_.get<by_name>().erase(name);
154        }
155
156        torrent_internal_ptr get_by_file(const wstring& filename)
157        {
158                torrent_by_filename::iterator it = torrents_.get<by_filename>().find(filename);
159               
160                if (it != torrents_.get<by_filename>().end() && (*it).torrent)
161                {
162                        return (*it).torrent;
163                }
164               
165                throw invalid_torrent(filename);
166        }
167       
168        torrent_internal_ptr get(const wstring& name)
169        {
170                torrent_by_name::iterator it = torrents_.get<by_name>().find(name);
171               
172                if (it != torrents_.get<by_name>().end() && (*it).torrent)
173                {
174                        return (*it).torrent;
175                }
176               
177                throw invalid_torrent(name);
178        }
179       
180        torrent_by_name::iterator erase(torrent_by_name::iterator where)
181        {
182                return torrents_.get<by_name>().erase(where);
183        }
184       
185        size_t size()
186        {
187                return torrents_.size();
188        }
189       
190        bool exists(const wstring& name)
191        {
192                torrent_by_name::iterator it = torrents_.get<by_name>().find(name);
193               
194                if (it != torrents_.get<by_name>().end())
195                        return true;
196                else
197                        return false;
198        }
199       
200        torrent_by_name::iterator begin() { return torrents_.get<by_name>().begin(); }
201        torrent_by_name::iterator end() { return torrents_.get<by_name>().end(); }
202       
203        friend class boost::serialization::access;
204        template<class Archive>
205        void serialize(Archive& ar, const unsigned int version)
206        {
207                ar & boost::serialization::make_nvp("torrents", torrents_);
208        }       
209       
210private:
211        torrent_multi_index torrents_;
212};
213
214};
215
216BOOST_CLASS_VERSION(hal::torrent_manager::torrent_holder, 1)
Note: See TracBrowser for help on using the repository browser.