source: trunk/src/halConfig.cpp @ 771

Revision 771, 5.9 KB checked in by Eoin, 10 years ago (diff)

Released the snapshot 0.3.1.8

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_(true),
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(false, false);
76       
77        try
78        {
79        if (enable_ip_filter_)
80        {
81                ProgressDialog progDlg(L"Loading IP filters...", bind(
82                        &bit::ensure_ip_filter_on, &bittorrent::Instance(), _1));
83                progDlg.DoModal();
84        }
85        else
86                bittorrent::Instance().ensure_ip_filter_off();
87        }
88        catch(const std::exception& e)
89        {
90                event_log().post(boost::shared_ptr<hal::EventDetail>(
91                        new hal::EventStdException(event_logger::critical, e, L"settingsThread, Load IP Filter"))); 
92        }       
93
94        try
95        {
96        if (enable_pe_)
97        {
98                bittorrent::Instance().ensure_pe_on(pe_settings_);
99        }
100        else
101                bittorrent::Instance().ensure_pe_off();
102        }
103        catch(const std::exception& e)
104        {
105                hal::event_log().post(boost::shared_ptr<hal::EventDetail>(
106                        new hal::EventStdException(event_logger::critical, e, L"settingsThread, Protocol Encryption"))); 
107        }
108       
109        bittorrent::Instance().set_session_half_open_limit(half_connections_limit_);   
110       
111        bittorrent::Instance().set_session_limits(globals_.total, globals_.uploads);
112        bittorrent::Instance().set_session_speed(globals_.download_rate, globals_.upload_rate);
113               
114        bittorrent::Instance().set_torrent_defaults(torrent_defaults_);
115
116        bittorrent::Instance().set_timeouts(timeouts_); 
117        bittorrent::Instance().set_queue_settings(queue_settings_);
118        bittorrent::Instance().set_resolve_countries(resolve_countries_);
119
120        if (metadata_plugin_)
121                bittorrent::Instance().start_metadata_plugin();
122        if (ut_metadata_plugin_)
123                bittorrent::Instance().start_ut_metadata_plugin();
124        if (ut_pex_plugin_)
125                bittorrent::Instance().start_ut_pex_plugin();
126        if (smart_ban_plugin_)
127                bittorrent::Instance().start_smart_ban_plugin();
128
129        try
130        {               
131
132        if (randomize_port_ && (current_port < port_range_.first || current_port > port_range_.second))
133        {
134                for (int i=0, e=10; i!=e; ++i)
135                {
136                        unsigned range = port_range_.second - port_range_.first;
137                        listen_port = port_range_.first + (range * std::rand())/RAND_MAX;
138
139                        event_log().post(shared_ptr<EventDetail>(new EventMsg(
140                                        hal::wform(L"Attempting port %1%.") % listen_port)));
141
142                        bool success = bittorrent::Instance().listen_on(std::make_pair(listen_port, listen_port));
143                        if (success) break;
144                }
145        }
146        else
147        {
148                event_log().post(shared_ptr<EventDetail>(new EventMsg(
149                                hal::wform(L"Trying port in range %1% - %2%.") % port_range_.first % port_range_.second)));
150
151                bool success = bittorrent::Instance().listen_on(port_range_);
152                if (!success)
153                {
154                        hal::event_log().post(boost::shared_ptr<hal::EventDetail>(
155                                new hal::EventDebug(event_logger::critical, L"settingsThread, Listen")));
156                       
157                        return false;
158                }
159        }
160
161        }
162        catch(const std::exception& e)
163        {
164                hal::event_log().post(boost::shared_ptr<hal::EventDetail>(
165                        new hal::EventStdException(event_logger::critical, e, L"settingsThread, Listen"))); 
166               
167                return false;
168        }
169
170
171        event_log().post(shared_ptr<EventDetail>(
172                new EventMsg(hal::wform(L"Opened listen port; %1%.") % bittorrent::Instance().is_listening_on())));
173
174
175       
176        if (enable_dht_)
177        {
178                unsigned old_port = dht_settings_.service_port;
179
180                if (dht_random_port_)
181                {
182                        unsigned range = dht_upper_port_ - dht_settings_.service_port;
183                        dht_settings_.service_port = dht_settings_.service_port + (range * std::rand())/RAND_MAX;
184                }
185                else if (dht_radio_ == 1)
186                {
187                        dht_settings_.service_port = bittorrent::Instance().is_listening_on();
188                }
189
190                if (!bittorrent::Instance().ensure_dht_on(dht_settings_))
191                {
192                        bittorrent::Instance().ensure_dht_off();
193                       
194                        hal::event_log().post(boost::shared_ptr<hal::EventDetail>(
195                                new hal::EventDebug(event_logger::critical, L"settingsThread, DHT Error"))); 
196                }
197               
198                dht_settings_.service_port = old_port;
199        }
200        else
201                bittorrent::Instance().ensure_dht_off();
202
203       
204        bittorrent::Instance().set_mapping(mapping_upnp_, mapping_nat_pmp_);
205
206               
207        // Settings seem to have applied ok!
208       
209        save_to_ini(); 
210        return true;
211
212        } HAL_GENERIC_FN_EXCEPTION_CATCH(L"Config::settingsThread()")
213
214        return false;
215}
216
217Config& config()
218{
219        static Config c;
220        return c;
221}
222
223} // namespace hal
Note: See TracBrowser for help on using the repository browser.