source: trunk/src/halConfig.cpp @ 749

Revision 749, 5.8 KB checked in by Eoin, 10 years ago (diff)

Added override for torrent paused state in resume data file.

Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 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#include "stdAfx.hpp"
10#include "Halite.hpp"
11
12#include "global/string_conv.hpp"
13#include "global/wtl_app.hpp"
14
15#include "halIni.hpp"
16#include "halConfig.hpp"
17#include "ProgressDialog.hpp"
18
19namespace hal
20{
21
22Config::Config() :
23        hal::IniBase<Config>("globals/bittorrent", "Config"),
24        globals_(),
25        torrent_defaults_(),
26        port_range_(6881,6881),
27        use_port_range_(false),
28        randomize_port_(false),
29        enable_dht_(true),
30        dht_settings_(),
31        dht_random_port_(0),
32        dht_upper_port_(0),
33        dht_radio_(1),
34        enable_ip_filter_(false),
35        enableProxy(false),
36        proxyPort(0),
37        default_save_folder_((hal::app().exe_path().parent_path()/L"incoming").string()),
38        default_move_folder_((hal::app().exe_path().parent_path()/L"completed").string()),
39        use_move_to_(false),
40        save_prompt_(true),
41        enable_pe_(false),
42        pe_settings_(),
43        half_connections_(true),
44        half_connections_limit_(10),
45        mapping_upnp_(false),
46        mapping_nat_pmp_(false),
47        resolve_countries_(false),
48        metadata_plugin_(false),
49        ut_metadata_plugin_(false),
50        ut_pex_plugin_(false),
51        smart_ban_plugin_(false)
52{
53        queue_settings_ = hal::bittorrent::Instance().get_queue_settings();
54        timeouts_ = hal::bittorrent::Instance().get_timeouts();
55}
56
57bool Config::settingsChanged()
58{
59//      thread settings(bind(&BitTConfig::settingsThread, this));
60        return settingsThread();
61}
62
63bool Config::settingsThread()
64{       
65        win32_exception::install_handler();
66        std::srand(GetTickCount());
67
68        try
69        {
70
71        event_log().post(shared_ptr<EventDetail>(new EventMsg(L"Applying BitTorrent session settings.")));     
72        unsigned listen_port = port_range_.first;
73        int current_port = bittorrent::Instance().is_listening_on();
74
75        bittorrent::Instance().set_mapping(mapping_upnp_, mapping_nat_pmp_);
76
77        try
78        {               
79
80        if (randomize_port_ && (current_port < port_range_.first || current_port > port_range_.second))
81        {
82                for (int i=0, e=10; i!=e; ++i)
83                {
84                        unsigned range = port_range_.second - port_range_.first;
85                        listen_port = port_range_.first + (range * std::rand())/RAND_MAX;
86
87                        event_log().post(shared_ptr<EventDetail>(new EventMsg(
88                                        hal::wform(L"Attempting port %1%.") % listen_port)));
89
90                        bool success = bittorrent::Instance().listen_on(std::make_pair(listen_port, listen_port));
91                        if (success) break;
92                }
93        }
94        else
95        {
96                event_log().post(shared_ptr<EventDetail>(new EventMsg(
97                                hal::wform(L"Trying port in range %1% - %2%.") % port_range_.first % port_range_.second)));
98
99                bool success = bittorrent::Instance().listen_on(port_range_);
100                if (!success)
101                {
102                        hal::event_log().post(boost::shared_ptr<hal::EventDetail>(
103                                new hal::EventDebug(event_logger::critical, L"settingsThread, Listen")));
104                       
105                        return false;
106                }
107        }
108
109        }
110        catch(const std::exception& e)
111        {
112                hal::event_log().post(boost::shared_ptr<hal::EventDetail>(
113                        new hal::EventStdException(event_logger::critical, e, L"settingsThread, Listen"))); 
114               
115                return false;
116        }
117
118
119        event_log().post(shared_ptr<EventDetail>(
120                new EventMsg(hal::wform(L"Opened listen port; %1%.") % bittorrent::Instance().is_listening_on())));
121       
122        try
123        {
124        if (enable_ip_filter_)
125        {
126                ProgressDialog progDlg(L"Loading IP filters...", bind(
127                        &bit::ensure_ip_filter_on, &bittorrent::Instance(), _1));
128                progDlg.DoModal();
129        }
130        else
131                bittorrent::Instance().ensure_ip_filter_off();
132        }
133        catch(const std::exception& e)
134        {
135                event_log().post(boost::shared_ptr<hal::EventDetail>(
136                        new hal::EventStdException(event_logger::critical, e, L"settingsThread, Load IP Filter"))); 
137        }       
138
139        try
140        {
141        if (enable_pe_)
142        {
143                bittorrent::Instance().ensure_pe_on(pe_settings_);
144        }
145        else
146                bittorrent::Instance().ensure_pe_off();
147        }
148        catch(const std::exception& e)
149        {
150                hal::event_log().post(boost::shared_ptr<hal::EventDetail>(
151                        new hal::EventStdException(event_logger::critical, e, L"settingsThread, Protocol Encryption"))); 
152        }
153       
154        bittorrent::Instance().set_session_half_open_limit(half_connections_limit_);   
155       
156        bittorrent::Instance().set_session_limits(globals_.total, globals_.uploads);
157        bittorrent::Instance().set_session_speed(globals_.download_rate, globals_.upload_rate);
158               
159        bittorrent::Instance().set_torrent_defaults(torrent_defaults_);
160
161        bittorrent::Instance().set_timeouts(timeouts_); 
162        bittorrent::Instance().set_queue_settings(queue_settings_);
163        bittorrent::Instance().set_resolve_countries(resolve_countries_);
164
165        if (metadata_plugin_)
166                bittorrent::Instance().start_metadata_plugin();
167        if (ut_metadata_plugin_)
168                bittorrent::Instance().start_ut_metadata_plugin();
169        if (ut_pex_plugin_)
170                bittorrent::Instance().start_ut_pex_plugin();
171        if (smart_ban_plugin_)
172                bittorrent::Instance().start_smart_ban_plugin();
173       
174        if (enable_dht_)
175        {
176                unsigned old_port = dht_settings_.service_port;
177
178                if (dht_random_port_)
179                {
180                        unsigned range = dht_upper_port_ - dht_settings_.service_port;
181                        dht_settings_.service_port = dht_settings_.service_port + (range * std::rand())/RAND_MAX;
182                }
183                else if (dht_radio_ == 1)
184                {
185                        dht_settings_.service_port = bittorrent::Instance().is_listening_on();
186                }
187
188                if (!bittorrent::Instance().ensure_dht_on(dht_settings_))
189                {
190                        bittorrent::Instance().ensure_dht_off();
191                       
192                        hal::event_log().post(boost::shared_ptr<hal::EventDetail>(
193                                new hal::EventDebug(event_logger::critical, L"settingsThread, DHT Error"))); 
194                }
195               
196                dht_settings_.service_port = old_port;
197        }
198        else
199                bittorrent::Instance().ensure_dht_off();
200               
201        // Settings seem to have applied ok!
202       
203        save_to_ini(); 
204        return true;
205
206        } HAL_GENERIC_FN_EXCEPTION_CATCH(L"Config::settingsThread()")
207
208        return false;
209}
210
211Config& config()
212{
213        static Config c;
214        return c;
215}
216
217} // namespace hal
Note: See TracBrowser for help on using the repository browser.