source: trunk/src/ConfigOptions.hpp @ 628

Revision 628, 79.6 KB checked in by Eoin, 12 years ago (diff)

Caches figures displayed correctly.

Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2008.
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#define ID_CONFIG_BEGIN                         12000
10#define HAL_SECURITY_IPF_GB             ID_CONFIG_BEGIN + 1
11#define HAL_SECURITY_PE_GB                      ID_CONFIG_BEGIN + 2
12#define HAL_SECURITY_CP_GB                      ID_CONFIG_BEGIN + 3
13#define HAL_SECURITY_EL_GB                      ID_CONFIG_BEGIN + 4
14#define HAL_SECURITY_OUTGOING           ID_CONFIG_BEGIN + 5
15#define HAL_SECURITY_INCOMING           ID_CONFIG_BEGIN + 6
16#define HAL_SECURITY_ENABLED            ID_CONFIG_BEGIN + 7
17#define HAL_SECURITY_FORCED                     ID_CONFIG_BEGIN + 8
18#define HAL_SECURITY_DISABLED           ID_CONFIG_BEGIN + 9
19#define HAL_BITT_OPENPORT                       ID_CONFIG_BEGIN + 10
20#define HAL_BITT_GDHT                           ID_CONFIG_BEGIN + 11
21#define HAL_BITT_DHT_NOTE                       ID_CONFIG_BEGIN + 12
22#define HAL_BITT_GSETTINGS                      ID_CONFIG_BEGIN + 13
23#define HAL_BITT_SELECT_TEXT            ID_CONFIG_BEGIN + 14
24#define HAL_CONFIGT_TOTALMAX            ID_CONFIG_BEGIN + 15
25#define HAL_CONFIGT_TOTALUP                     ID_CONFIG_BEGIN + 16
26#define HAL_CONFIGT_DOWNRATE            ID_CONFIG_BEGIN + 17
27#define HAL_CONFIGT_UPRATE                      ID_CONFIG_BEGIN + 18
28#define HAL_CONFIGT_TORMAX                      ID_CONFIG_BEGIN + 19
29#define HAL_CONFIGT_TORUP                       ID_CONFIG_BEGIN + 20
30#define HAL_CONFIGT_TORDOWNRATE         ID_CONFIG_BEGIN + 21
31#define HAL_CONFIGT_TORUPRATE           ID_CONFIG_BEGIN + 22
32#define HAL_CONFIGT_GLOBAL_TEXT         ID_CONFIG_BEGIN + 23
33#define HAL_CONFIGT_TOR_TEXT            ID_CONFIG_BEGIN + 24
34#define HAL_CONFIGT_DEF_FOLDER          ID_CONFIG_BEGIN + 25
35#define HAL_CONFIGT_GLOBALG             ID_CONFIG_BEGIN + 26
36#define HAL_CONFIGT_TORRENTG            ID_CONFIG_BEGIN + 27
37#define HAL_CONFIGT_TDOWNRATE           ID_CONFIG_BEGIN + 28
38#define HAL_GENERAL_GROUP                       ID_CONFIG_BEGIN + 29
39#define HAL_GENERAL_LANG                        ID_CONFIG_BEGIN + 30
40#define HAL_GENERAL_CLOSETRAY           ID_CONFIG_BEGIN + 31
41#define HAL_GENERAL_CONFIRMCLOSE        ID_CONFIG_BEGIN + 32
42#define HAL_ABOUT_GROUP                 ID_CONFIG_BEGIN + 33
43#define HAL_ABOUT_VERSION               ID_CONFIG_BEGIN + 34
44#define HAL_BITT_GPORTFORWARDING        ID_CONFIG_BEGIN + 35
45#define HAL_BITT_GPORTFORWARD_NONE      ID_CONFIG_BEGIN + 36
46#define HAL_BITT_GPORTFORWARD_UPNG      ID_CONFIG_BEGIN + 37
47#define HAL_BIT_GPORTFORWARD_NATPMP     ID_CONFIG_BEGIN + 38
48#define HAL_BITT_GPORTFORWARD_TEST      ID_CONFIG_BEGIN + 39
49#define HAL_BITT_GPORTFORWARD_LIST      ID_CONFIG_BEGIN + 40
50#define HAL_BC_MOVETO_FOLDER            ID_CONFIG_BEGIN + 41
51#define HAL_BC_MOVETO_BROWSE            ID_CONFIG_BEGIN + 42
52#define HAL_BC_MOVETO_TEXT                      ID_CONFIG_BEGIN + 43
53#define HAL_BC_MOVETO_CHECK                     ID_CONFIG_BEGIN + 44
54#define HAL_BC_DHT_EXT                          ID_CONFIG_BEGIN + 45
55#define HAL_BC_METADATADHT_EXT          ID_CONFIG_BEGIN + 46
56#define HAL_BC_uT_METADATA_EXT          ID_CONFIG_BEGIN + 47
57#define HAL_BC_uT_PEEER_EX_EXT          ID_CONFIG_BEGIN + 48
58#define HAL_BC_SMART_BAN_PLUGIN_EXT     ID_CONFIG_BEGIN + 49
59#define HAL_BC_EXT_GROUP                        ID_CONFIG_BEGIN + 50
60
61#define HAL_CGLOBAL_QUEUEG                      ID_CONFIG_BEGIN + 51
62#define HAL_CGLOBAL_ACTDOWNT            ID_CONFIG_BEGIN + 52
63#define HAL_CGLOBAL_ACTDOWN                     ID_CONFIG_BEGIN + 53
64#define HAL_CGLOBAL_ACTSEEDT            ID_CONFIG_BEGIN + 54
65#define HAL_CGLOBAL_ACTSEED                     ID_CONFIG_BEGIN + 55
66#define HAL_CGLOBAL_DISCOUNTSLOW        ID_CONFIG_BEGIN + 56
67#define HAL_CGLOBAL_ACTSEEDHARDT        ID_CONFIG_BEGIN + 57
68#define HAL_CGLOBAL_ACTSEEDHARD         ID_CONFIG_BEGIN + 58
69#define HAL_CGLOBAL_SEEDINGG            ID_CONFIG_BEGIN + 59
70#define HAL_CGLOBAL_SHARERATIOT         ID_CONFIG_BEGIN + 60
71#define HAL_CGLOBAL_SHARERATIO          ID_CONFIG_BEGIN + 61
72#define HAL_CGLOBAL_SHARERATIOTIMET     ID_CONFIG_BEGIN + 62
73#define HAL_CGLOBAL_SHARERATIOTIME      ID_CONFIG_BEGIN + 63
74#define HAL_CGLOBAL_SHARETIMET          ID_CONFIG_BEGIN + 64
75#define HAL_CGLOBAL_SHARETIME           ID_CONFIG_BEGIN + 65
76#define HAL_BITT_RANDOMIZE_PORT         ID_CONFIG_BEGIN + 66
77#define HAL_BIT_GPORTFORWARD_MODELTEXT          ID_CONFIG_BEGIN + 67
78#define HAL_BIT_GPORTFORWARD_MODEL      ID_CONFIG_BEGIN + 68
79#define HAL_BC_CACHE_GROUP                      ID_CONFIG_BEGIN + 69
80#define HAL_BC_CACHE_RS_L                       ID_CONFIG_BEGIN + 70
81#define HAL_BC_CACHE_RS_T                       ID_CONFIG_BEGIN + 71
82#define HAL_BC_CACHE_WS_L                       ID_CONFIG_BEGIN + 72
83#define HAL_BC_CACHE_WS_T                       ID_CONFIG_BEGIN + 73
84#define HAL_BC_CACHE_TOTAL_L            ID_CONFIG_BEGIN + 74
85#define HAL_BC_CACHE_TOTAL_T            ID_CONFIG_BEGIN + 75
86#define HAL_BC_CACHE_MS_L                       ID_CONFIG_BEGIN + 76
87#define HAL_BC_CACHE_MS_E                       ID_CONFIG_BEGIN + 77
88#define HAL_BC_CACHE_PE_L                       ID_CONFIG_BEGIN + 78
89#define HAL_BC_CACHE_PE_E                       ID_CONFIG_BEGIN + 79
90#define HAL_BC_CACHE_WR_L                       ID_CONFIG_BEGIN + 80
91#define HAL_BC_CACHE_WR_T                       ID_CONFIG_BEGIN + 81
92#define HAL_BC_CACHE_RR_L                       ID_CONFIG_BEGIN + 82
93#define HAL_BC_CACHE_RR_T                       ID_CONFIG_BEGIN + 83
94#define HAL_BC_CACHE_TIMER                      ID_CONFIG_BEGIN + 84
95#define HAL_BC_CACHE_GROUP_TEXT         ID_CONFIG_BEGIN + 85
96
97#ifndef RC_INVOKED
98
99#include "stdAfx.hpp"
100
101#include "Halite.hpp"
102#include "halConfig.hpp"
103#include "HaliteWindow.hpp"
104#include "HaliteEditCtrl.hpp"
105
106#include "DdxEx.hpp"
107#include "CSSFileDialog.hpp"
108#include "AtlAutosizeDlg.h"
109
110class GeneralOptions :
111    public WTL::CPropertyPageImpl<GeneralOptions>,
112        public ATL::CAutoSizeWindow<GeneralOptions, false>,
113    public WTL::CWinDataExchange<GeneralOptions>
114{
115        typedef GeneralOptions thisClass;
116        typedef WTL::CPropertyPageImpl<thisClass> propPageClass;
117        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
118       
119public:
120    enum { IDD = HAL_CONFIGGENERAL };
121
122        GeneralOptions(HaliteWindow* haliteWindow) :
123                haliteWindow_(haliteWindow)
124        {}
125
126        ~GeneralOptions()
127        {}
128
129    BEGIN_MSG_MAP_EX(GeneralOptions)
130                MSG_WM_INITDIALOG(OnInitDialog)
131        CHAIN_MSG_MAP(CPropertyPageImpl<GeneralOptions>)
132        CHAIN_MSG_MAP(autosizeClass)
133    END_MSG_MAP()
134
135    BEGIN_DDX_MAP(GeneralOptions)
136        DDX_CHECK(HAL_GENERAL_ONEINST, halite().oneInst)
137        DDX_CHECK(HAL_GENERAL_TRAY, haliteWindow_->use_tray)
138        DDX_CHECK(HAL_GENERAL_ADVGUI, haliteWindow_->advancedUI)
139        DDX_CHECK(HAL_GENERAL_CLOSETRAY, haliteWindow_->closeToTray)
140        DDX_CHECK(HAL_GENERAL_CONFIRMCLOSE, haliteWindow_->confirmClose)
141    END_DDX_MAP()
142
143#define GENERAL_CONFIG_LAYOUT \
144        WMB_HEAD(WMB_COLNOMAX(_exp)), \
145                WMB_ROW(_gap,   _d), \
146                WMB_ROW(_auto,  HAL_GENERAL_ONEINST), \
147                WMB_ROW(_auto,  HAL_GENERAL_ADVGUI), \
148                WMB_ROW(_auto,  HAL_GENERAL_TRAY), \
149                WMB_ROW(_auto,  HAL_GENERAL_CLOSETRAY), \
150                WMB_ROW(_auto,  HAL_GENERAL_CONFIRMCLOSE), \
151        WMB_END()
152
153#define GENERAL_LANGUAGE_LAYOUT \
154        WMB_HEAD(WMB_COLNOMAX(_exp)), \
155                WMB_ROW(_auto,  HAL_GENERAL_LANG), \
156                WMB_ROW(_auto,  HAL_LANGLIST), \
157        WMB_END()
158
159        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
160                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COL(_gap)),
161                        WMB_ROW(_gap|3, HAL_GENERAL_GROUP, _r, _r, _r), 
162                        WMB_ROW(_auto,  _d, GENERAL_CONFIG_LAYOUT, GENERAL_LANGUAGE_LAYOUT), 
163                        WMB_ROW(_gap,   _d),
164                WMB_END()
165        END_WINDOW_MAP()       
166
167    BOOL OnInitDialog(HWND hwndFocus, LPARAM lParam);
168
169    int OnApply()
170        {       
171                hal::event_log.post(shared_ptr<hal::EventDetail>(
172                        new hal::EventMsg(L"Applying general options.", hal::event_logger::info)));
173
174                size_t length = lang_list_.GetTextLen(lang_list_.GetCurSel());
175                boost::scoped_array<wchar_t> buffer(new wchar_t[length+1]);
176               
177                lang_list_.GetText(lang_list_.GetCurSel(), buffer.get());
178                std::wstring language(buffer.get(), length);
179
180                if (language == L"English")
181                {
182                        halite().dll_ = L"";
183                        hal::app().res_revert();
184                }
185                else
186                {
187                        halite().dll_ = lang_map_[language].external_file_string();
188                        hal::app().res_set_dll(lang_map_[language].external_file_string());
189                }
190               
191                return DoDataExchange(true);
192        }
193
194private:
195        WTL::CListBox lang_list_;
196        std::map<wstring, wpath> lang_map_;
197        HaliteWindow* haliteWindow_;
198};
199
200class BitTorrentOptions :
201    public WTL::CPropertyPageImpl<BitTorrentOptions>,
202        public ATL::CAutoSizeWindow<BitTorrentOptions, false>,
203    public CWinDataExchangeEx<BitTorrentOptions>
204{
205        typedef BitTorrentOptions thisClass;
206        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
207       
208public:
209    enum { IDD = HAL_CONFIGBIT };
210
211        BitTorrentOptions()
212        {}
213
214    BEGIN_MSG_MAP_EX(thisClass)
215        MSG_WM_INITDIALOG(OnInitDialog)
216                MSG_WM_TIMER(OnTimer)
217               
218        CHAIN_MSG_MAP(CPropertyPageImpl<thisClass>)
219        CHAIN_MSG_MAP(autosizeClass)
220    END_MSG_MAP()
221
222    BEGIN_DDX_MAP(thisClass)
223        DDX_FLOAT(HAL_BC_CACHE_MS_E, cache_size_)
224        DDX_INT(HAL_BC_CACHE_PE_E, hal::config().cache_settings_.cache_expiry)         
225    END_DDX_MAP()
226
227#define BITT_EXT_LAYOUT \
228        WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)), \
229                WMB_ROW(_gap|3, HAL_BC_EXT_GROUP, _r, _r), \
230                WMB_ROW(_auto,  _d, HAL_BC_METADATADHT_EXT), \
231                WMB_ROW(_auto,  _d, HAL_BC_uT_METADATA_EXT), \
232                WMB_ROW(_auto,  _d, HAL_BC_uT_PEEER_EX_EXT), \
233                WMB_ROW(_auto,  _d, HAL_BC_SMART_BAN_PLUGIN_EXT), \
234                WMB_ROW(_gap,   _d), \
235        WMB_END()
236
237#define BITT_CACHE_UPPER_LAYOUT \
238        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp|80), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp|80), WMB_COL(_gap)), \
239                WMB_ROW(_auto,  HAL_BC_CACHE_MS_L, HAL_BC_CACHE_MS_E, HAL_BC_CACHE_PE_L, HAL_BC_CACHE_PE_E), \
240                WMB_ROW(_auto,  HAL_BC_CACHE_WR_L, HAL_BC_CACHE_WR_T, HAL_BC_CACHE_RR_L, HAL_BC_CACHE_RR_T), \
241                WMB_ROW(_auto,  HAL_BC_CACHE_WS_L, HAL_BC_CACHE_WS_T, HAL_BC_CACHE_RS_L, HAL_BC_CACHE_RS_T), \
242        WMB_END()
243
244#define BITT_CACHE_LAYOUT \
245        WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp|80), WMB_COLNOMAX(_exp|60), WMB_COLNOMAX(_exp|80), WMB_COLNOMAX(_exp|60), WMB_COLNOMAX(_exp|80), WMB_COL(_gap)), \
246                WMB_ROW(_gap|6, HAL_BC_CACHE_GROUP, _r, _r, _r, _r, _r, _r, _r), \
247                WMB_ROW(_auto,  _d, BITT_CACHE_UPPER_LAYOUT, _r, _r, _r, _r, _r, _r), \
248                WMB_ROW(_gap,   _d), \
249        WMB_END()
250
251        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
252                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)),
253                        WMB_ROW(_auto,  BITT_EXT_LAYOUT, _r, _r), 
254                        WMB_ROW(_auto,  BITT_CACHE_LAYOUT, _r, _r), 
255                        WMB_ROW(_gap,   _d),
256                WMB_END()
257        END_WINDOW_MAP()
258
259    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
260        {       
261                cache_ =  hal::bittorrent().get_cache_details();
262                cache_size_ = static_cast<double>(hal::config().cache_settings_.cache_size) / 1024 * 16;
263
264                BOOL retval = DoDataExchange(false);
265               
266                SetTimer(HAL_BC_CACHE_TIMER, 1000);
267                OnTimer(HAL_BC_CACHE_TIMER);
268
269                autosizeClass::CtrlsArrange();
270                return retval;
271        }
272
273    int OnApply()
274        {
275                hal::event_log.post(shared_ptr<hal::EventDetail>(
276                        new hal::EventMsg(L"Applying bittorrent options.", hal::event_logger::info)));
277
278                DoDataExchange(true);
279                hal::config().cache_settings_.cache_size = static_cast<int>(cache_size_ * 1024 / 16);
280
281                return 1;
282        }
283
284        void OnTimer(UINT uTimerID)
285        {               
286                if (uTimerID == HAL_BC_CACHE_TIMER) 
287                {       
288                        cache_ =  hal::bittorrent().get_cache_details();               
289                        SetDlgItemText(HAL_BC_CACHE_GROUP, (hal::wform(hal::app().res_wstr(HAL_BC_CACHE_GROUP_TEXT))
290                                % (static_cast<double>(cache_.cache_size) / 1024 * 16)).str().c_str());
291
292                        SetDlgItemText(HAL_BC_CACHE_WR_T, (hal::wform(L"%1.2f") 
293                                % cache_.write_ratio).str().c_str());
294                        SetDlgItemText(HAL_BC_CACHE_RR_T, (hal::wform(L"%1.2f") 
295                                % cache_.read_ratio).str().c_str());
296
297                        SetDlgItemText(HAL_BC_CACHE_WS_T, (hal::wform(L"%1.2f MiB") 
298                                % (static_cast<double>(cache_.write_cache_size) / 1024 * 16)).str().c_str());
299                        SetDlgItemText(HAL_BC_CACHE_RS_T, (hal::wform(L"%1.2f MiB") 
300                                % (static_cast<double>(cache_.read_cache_size) / 1024 * 16)).str().c_str());
301                }
302        }
303
304private:
305        wstring cache_title_;
306        double cache_size_;
307        hal::cache_details cache_;
308};
309
310class PortOptions :
311    public WTL::CPropertyPageImpl<PortOptions>,
312        public ATL::CAutoSizeWindow<PortOptions, false>,
313    public CWinDataExchangeEx<PortOptions>
314{
315        typedef PortOptions thisClass;
316        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
317       
318public:
319    enum { IDD = HAL_CONFIGPORTS };
320
321        PortOptions()
322        {}
323
324    BEGIN_MSG_MAP_EX(thisClass)
325        MSG_WM_INITDIALOG(OnInitDialog)
326                COMMAND_ID_HANDLER_EX(HAL_BC_PORTCHECK, onPortCheck)
327                COMMAND_ID_HANDLER_EX(HAL_BC_HALFCONN_CHECK, onHalfCheck)
328                COMMAND_ID_HANDLER_EX(HAL_BC_DHT, onDHTCheck)
329               
330        CHAIN_MSG_MAP(CPropertyPageImpl<thisClass>)
331        CHAIN_MSG_MAP(autosizeClass)
332    END_MSG_MAP()
333
334    BEGIN_DDX_MAP(thisClass)
335        DDX_CHECK(HAL_BC_PORTCHECK, hal::config().use_port_range_)
336        DDX_CHECK(HAL_BITT_RANDOMIZE_PORT, hal::config().randomize_port_)
337        DDX_INT(HAL_BC_PORTFROM, hal::config().port_range_.first)
338        DDX_INT(HAL_BC_PORTTO, hal::config().port_range_.second)               
339        DDX_CHECK(HAL_BC_HALFCONN_CHECK, hal::config().half_connections_)
340        DDX_EX_INT_POSITIVE(HAL_BC_HALFCONN_NUM, hal::config().half_connections_limit_)
341        DDX_CHECK(HAL_BC_DHT, hal::config().enable_dht_)
342        DDX_INT(HAL_BC_DHTPORT, hal::config().dht_settings_.service_port)
343        DDX_CHECK(HAL_BITT_GPORTFORWARD_UPNG, hal::config().mapping_upnp_)
344        DDX_CHECK(HAL_BIT_GPORTFORWARD_NATPMP, hal::config().mapping_nat_pmp_)
345    END_DDX_MAP()
346       
347#define BITT_GS_LAYOUT \
348        WMB_HEAD(WMB_COLNOMAX(_exp|250), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp)), \
349                WMB_ROW(_auto,  HAL_BITT_SELECT_TEXT, _r, _r, _r), \
350                WMB_ROW(_auto,  HAL_BITT_OPENPORT, HAL_BC_PORTFROM, HAL_BC_PORTCHECK, HAL_BC_PORTTO), \
351                WMB_ROW(_auto,  0, HAL_BITT_RANDOMIZE_PORT, _r, _r), \
352                WMB_ROW(_auto,  HAL_BC_HALFCONN_CHECK, _r, HAL_BC_HALFCONN_NUM), \
353        WMB_END()
354
355#define BITT_DHT_LAYOUT \
356        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp)), \
357                WMB_ROW(_auto,  HAL_BC_DHT, HAL_BITT_DHT_NOTE, _r), \
358                WMB_ROW(_auto,  HAL_BC_DHT_EXT, HAL_BC_DHTPORT_S, HAL_BC_DHTPORT), \
359        WMB_END()
360
361#define BITT_FOR_LAYOUT \
362        WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp|50), WMB_COLNOMAX(_exp), WMB_COL(_gap)), \
363                WMB_ROW(_gap|3, HAL_BITT_GPORTFORWARDING, _r, _r, _r),\
364                WMB_ROW(_auto,  _d, HAL_BITT_GPORTFORWARD_UPNG, HAL_BIT_GPORTFORWARD_MODEL), \
365                WMB_ROW(_auto,  _d, HAL_BIT_GPORTFORWARD_NATPMP, HAL_BIT_GPORTFORWARD_MODELTEXT), \
366                WMB_ROW(_gap,   _d), \
367        WMB_END()
368
369        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
370                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)),
371                        WMB_ROW(_gap|3, HAL_BITT_GSETTINGS, _r, _r), 
372                        WMB_ROW(_auto,  _d, BITT_GS_LAYOUT),
373                        WMB_ROW(_gap,   _d),
374                        WMB_ROW(_gap|3, HAL_BITT_GDHT, _r, _r,  HAL_BITT_GDHT, _r, _r),
375                        WMB_ROW(_auto,  _d, BITT_DHT_LAYOUT), 
376                        WMB_ROW(_gap,   _d),
377                        WMB_ROW(_auto,  BITT_FOR_LAYOUT, _r, _r), 
378                        WMB_ROW(_gap,   _d),
379                WMB_END()
380        END_WINDOW_MAP()
381
382    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
383        {       
384//              helpLink.SubclassWindow(GetDlgItem(HAL_BC_EXT_GROUP));
385//              helpLink.SetHyperLink(L"http://www.binarynotions.com/");
386               
387//              whyHalfConn.SubclassWindow(GetDlgItem(HAL_BC_CON_WHY));
388//              whyHalfConn.SetHyperLink(L"http://www.binarynotions.com/");
389               
390                BOOL retval = DoDataExchange(false);
391
392                onHalfCheck(0, 0, GetDlgItem(HAL_BC_HALFCONN_CHECK));
393                onPortCheck(0, 0, GetDlgItem(HAL_BC_PORTCHECK));
394                onDHTCheck(0, 0, GetDlgItem(HAL_BC_DHT));
395
396                SetDlgItemText(HAL_BIT_GPORTFORWARD_MODELTEXT, hal::bittorrent().upnp_router_model().c_str());
397
398                autosizeClass::CtrlsArrange();
399                return retval;
400        }
401
402    int OnApply()
403        {
404                hal::event_log.post(shared_ptr<hal::EventDetail>(
405                        new hal::EventMsg(L"Applying bittorrent options.", hal::event_logger::info)));
406
407                onPortCheck(0, 0, GetDlgItem(HAL_BC_PORTCHECK));
408
409                return DoDataExchange(true);
410        }
411
412        void onDHTCheck(UINT, int, HWND hWnd)
413        {
414                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
415
416                if (result == BST_CHECKED)
417                {
418                        ::EnableWindow(GetDlgItem(HAL_BC_DHTPORT), true);
419                        ::EnableWindow(GetDlgItem(HAL_BC_DHTPORT_S), true);
420                }
421                else
422                {
423                        ::EnableWindow(GetDlgItem(HAL_BC_DHTPORT), false);
424                        ::EnableWindow(GetDlgItem(HAL_BC_DHTPORT_S), false);
425                }
426        }
427
428        void onPortCheck(UINT, int, HWND hWnd)
429        {
430                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
431
432                if (result == BST_CHECKED)
433                {
434                        ::EnableWindow(GetDlgItem(HAL_BC_PORTTO), true);
435                        ::EnableWindow(GetDlgItem(HAL_BITT_RANDOMIZE_PORT), true);
436                }
437                else
438                {
439                        ::EnableWindow(GetDlgItem(HAL_BC_PORTTO), false);
440                        ::EnableWindow(GetDlgItem(HAL_BITT_RANDOMIZE_PORT), false);
441
442                        hal::win_c_str<std::wstring> str(MAX_PATH);
443                        GetDlgItemText(HAL_BC_PORTFROM, str, str.size());
444                        SetDlgItemText(HAL_BC_PORTTO, str);
445                }
446        }
447
448        void onHalfCheck(UINT, int, HWND hWnd)
449        {
450                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
451
452                if (result == BST_CHECKED)
453                {
454                        ::EnableWindow(GetDlgItem(HAL_BC_HALFCONN_NUM), true);
455                }
456                else
457                {
458                        ::EnableWindow(GetDlgItem(HAL_BC_HALFCONN_NUM), false);
459                        SetDlgItemText(HAL_BC_HALFCONN_NUM, L"");
460                }
461        }
462
463private:
464//      WTL::CHyperLink helpLink;
465//      WTL::CHyperLink whyHalfConn;
466};
467
468class ProxyOptions :
469    public WTL::CPropertyPageImpl<ProxyOptions>,
470    public CWinDataExchangeEx<ProxyOptions>
471{
472public:
473    enum { IDD = HAL_CONFIGPROXY };
474
475        ProxyOptions()
476        {}
477
478        ~ProxyOptions()
479        {}
480
481    BEGIN_MSG_MAP_EX(ProxyOptions)
482        MSG_WM_INITDIALOG(OnInitDialog)
483                COMMAND_ID_HANDLER_EX(HAL_BC_PROXYCHECK, onProxyCheck)
484        CHAIN_MSG_MAP(CPropertyPageImpl<ProxyOptions>)
485    END_MSG_MAP()
486
487    BEGIN_DDX_MAP(ProxyOptions)
488       
489    END_DDX_MAP()
490
491    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
492        {
493                BOOL retval =  DoDataExchange(false);
494
495                onProxyCheck(0, 0, GetDlgItem(HAL_BC_PROXYCHECK));
496
497                return retval;
498        }
499
500    int OnApply()
501        {
502                hal::event_log.post(shared_ptr<hal::EventDetail>(
503                        new hal::EventMsg(L"Applying proxy options.", hal::event_logger::info)));
504
505                return DoDataExchange(true);
506        }
507
508        void onPortCheck(UINT, int, HWND hWnd)
509        {
510                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
511
512                if (result == BST_CHECKED)
513                {
514                        ::EnableWindow(GetDlgItem(HAL_BC_PORTTO), true);
515                }
516                else
517                {
518                        ::EnableWindow(GetDlgItem(HAL_BC_PORTTO), false);
519                        boost::array<wchar_t, MAX_PATH> buffer;
520                        GetDlgItemText(HAL_BC_PORTFROM, buffer.elems, MAX_PATH);
521                        SetDlgItemText(HAL_BC_PORTTO, buffer.elems);
522                }
523        }
524
525        void onProxyCheck(UINT, int, HWND hWnd)
526        {
527                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
528
529                if (result == BST_CHECKED)
530                {
531                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYIP), true);
532                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPORT), true);
533                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYUSER), true);
534                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPASS), true);
535                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYIP_S), true);
536                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPORT_S), true);
537                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYUSER_S), true);
538                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPASS_S), true);
539                }
540                else
541                {
542                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYIP), false);
543                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPORT), false);
544                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYUSER), false);
545                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPASS), false);
546                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYIP_S), false);
547                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPORT_S), false);
548                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYUSER_S), false);
549                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPASS_S), false);
550                }
551        }
552};
553
554class SecurityOptions :
555    public WTL::CPropertyPageImpl<SecurityOptions>,
556        public ATL::CAutoSizeWindow<SecurityOptions, false>,
557    public CWinDataExchangeEx<SecurityOptions>
558{
559        typedef SecurityOptions thisClass;
560        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
561       
562public:
563    enum { IDD = HAL_CONFIGSECURITY };
564
565    BEGIN_MSG_MAP_EX(thisClass)
566        MSG_WM_INITDIALOG(OnInitDialog)
567               
568                COMMAND_ID_HANDLER_EX(HAL_BC_FILTERLOAD, onFilterImport)
569                COMMAND_ID_HANDLER_EX(HAL_BC_FILTERCLEAR, onFilterClear)
570                COMMAND_ID_HANDLER_EX(HAL_BC_FILTERCHECK, onFilterCheck)
571               
572                COMMAND_ID_HANDLER_EX(HAL_SC_ENABLE_PE, onPeCheck)
573               
574        CHAIN_MSG_MAP(autosizeClass)
575        CHAIN_MSG_MAP(CPropertyPageImpl<thisClass>)
576//              MSG_WM_SIZE(OnSize)
577    END_MSG_MAP()
578
579    BEGIN_DDX_MAP(thisClass)
580        DDX_CHECK(HAL_BC_FILTERCHECK, hal::config().enableIPFilter)
581        DDX_CHECK(HAL_SC_ENABLE_PE, hal::config().enable_pe_)
582        DDX_RADIO(HAL_SC_PE_ENC_PLAIN, hal::config().pe_settings_.encrypt_level)
583        DDX_CHECK(HAL_SC_PE_ENC_RC4_PERFER, hal::config().pe_settings_.prefer_rc4)
584        DDX_RADIO(HAL_SC_PE_CP_IN_FORCED, hal::config().pe_settings_.conn_in_policy)
585        DDX_RADIO(HAL_SC_PE_CP_OUT_FORCED, hal::config().pe_settings_.conn_out_policy)
586    END_DDX_MAP()
587       
588/*      void OnSize(UINT type, CSize)
589        {
590               
591                SetMsgHandled(false);
592        }
593*/
594#define SECURITY_IPF_LAYOUT \
595        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp)), \
596                WMB_ROW(_auto,  HAL_BC_FILTERCHECK,     HAL_BC_FILTERCLEAR, HAL_BC_FILTERLOAD), \
597        WMB_END()
598
599#define SECURITY_ENCODING_LAYOUT \
600        WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COL(_gap)), \
601                WMB_ROW(_auto,  HAL_SC_ENABLE_PE,       _r,_r,_r), \
602                WMB_ROW(_gap|3, HAL_SECURITY_EL_GB,     _r,_r,_r), \
603                WMB_ROW(_auto,  _d,     HAL_SC_PE_ENC_PLAIN, _r), \
604                WMB_ROW(_auto,  _d,     HAL_SC_PE_ENC_RC4, _r), \
605                WMB_ROW(_auto,  _d,     HAL_SC_PE_ENC_BOTH, HAL_SC_PE_ENC_RC4_PERFER), \
606                WMB_ROW(_gap,   _d), \
607        WMB_END()
608
609#define SECURITY_CONNECTION_LAYOUT \
610        WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COL(_gap)), \
611                WMB_ROW(_gap|4, HAL_SECURITY_CP_GB,     _r, _r, _r, _r, _r), \
612                WMB_ROW(_auto,  _d,     HAL_SECURITY_INCOMING, _r, HAL_SECURITY_OUTGOING, _r), \
613                WMB_ROW(_auto,  _d,     HAL_SC_PE_CP_IN_FORCED, HAL_SECURITY_FORCED, _r, HAL_SC_PE_CP_OUT_FORCED), \
614                WMB_ROW(_auto,  _d,     HAL_SC_PE_CP_IN_ENABLED, HAL_SECURITY_ENABLED, _r, HAL_SC_PE_CP_OUT_ENABLED), \
615                WMB_ROW(_auto,  _d,     HAL_SC_PE_CP_IN_DISABLED, HAL_SECURITY_DISABLED, _r, HAL_SC_PE_CP_OUT_DISABLED), \
616                WMB_ROW(_gap,   _d), \
617        WMB_END()
618       
619#define SECURITY_PE_LAYOUT \
620        WMB_HEAD(WMB_COLNOMAX(_exp|150), WMB_COLNOMAX(_exp)), \
621                WMB_ROW(_auto,  SECURITY_ENCODING_LAYOUT, SECURITY_CONNECTION_LAYOUT), \
622        WMB_END()
623
624        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
625                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)), 
626                        WMB_ROW(_gap|3, HAL_SECURITY_IPF_GB, _r, _r), 
627                        WMB_ROW(_auto,  _d, SECURITY_IPF_LAYOUT), 
628                        WMB_ROW(_gap,   _d), 
629                        WMB_ROW(_gap|3, HAL_SECURITY_PE_GB, _r, _r), 
630                        WMB_ROW(_auto,  _d, SECURITY_PE_LAYOUT),
631                        WMB_ROW(_gap,   _d),
632                WMB_END()
633        END_WINDOW_MAP()       
634
635    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
636        {
637        //      helpLink.SubclassWindow(GetDlgItem(HAL_SC_HELP_LINK));
638        //      helpLink.SetHyperLink(L"http://www.binarynotions.com/");
639
640                BOOL retval =  DoDataExchange(false);
641
642                onFilterCheck(0, 0, GetDlgItem(HAL_BC_FILTERCHECK));
643                onPeCheck(0, 0, GetDlgItem(HAL_SC_ENABLE_PE));
644
645                autosizeClass::CtrlsArrange();
646                return retval;
647        }
648
649    int OnApply()
650        {
651                hal::event_log.post(shared_ptr<hal::EventDetail>(
652                        new hal::EventMsg(L"Applying security options.", hal::event_logger::info)));
653
654                return DoDataExchange(true);
655        }
656
657        void onFilterCheck(UINT, int, HWND hWnd)
658        {
659                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
660
661                if (result == BST_CHECKED)
662                {
663                        ::EnableWindow(GetDlgItem(HAL_BC_FILTERCLEAR), true);
664                        ::EnableWindow(GetDlgItem(HAL_BC_FILTERLOAD), true);
665                }
666                else
667                {
668                        ::EnableWindow(GetDlgItem(HAL_BC_FILTERCLEAR), false);
669                        ::EnableWindow(GetDlgItem(HAL_BC_FILTERLOAD), false);
670                }
671        }
672
673        void onPeCheck(UINT, int, HWND hWnd)
674        {
675                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
676
677                if (result == BST_CHECKED)
678                {
679                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_BOTH), true);
680                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_RC4), true);
681                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_PLAIN), true);
682                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_RC4_PERFER), true);
683                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_FORCED), true);
684                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_DISABLED), true);
685                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_ENABLED), true);
686                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_DISABLED), true);
687                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_ENABLED), true);
688                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_FORCED), true);
689                }
690                else
691                {
692                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_BOTH), false);
693                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_RC4), false);
694                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_PLAIN), false);
695                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_RC4_PERFER), false);
696                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_FORCED), false);
697                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_DISABLED), false);
698                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_ENABLED), false);
699                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_DISABLED), false);
700                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_ENABLED), false);
701                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_FORCED), false);
702                }
703        }
704
705        void onFilterClear(UINT, int, HWND hWnd)
706        {
707                hal::bittorrent().clear_ip_filter();
708        }
709
710        void onFilterImport(UINT, int, HWND hWnd);
711
712private:
713        WTL::CHyperLink helpLink;
714};
715
716class GlobalOptions :
717    public WTL::CPropertyPageImpl<GlobalOptions>,
718        public ATL::CAutoSizeWindow<GlobalOptions, false>,
719    public CWinDataExchangeEx<GlobalOptions>
720{
721        typedef GlobalOptions thisClass;
722        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
723public:
724    enum { IDD = HAL_CONFIGGLOBAL };
725       
726        GlobalOptions() :
727                total_connections_(0, false, false),
728                upload_connections_(0, false, false),
729                download_rate_(0, false, false),
730                upload_rate_(0, false, false)
731        {}
732
733    BEGIN_MSG_MAP_EX(thisClass)
734        MSG_WM_INITDIALOG(OnInitDialog)
735
736        CHAIN_MSG_MAP(CPropertyPageImpl<thisClass>)
737        CHAIN_MSG_MAP(autosizeClass)
738           REFLECT_NOTIFICATIONS()
739    END_MSG_MAP()
740       
741#define CONFIGT_GLOBAL_LAYOUT \
742        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp|30), WMB_COLNOMAX(_eq|0), WMB_COLNOMAX(_eq|1)), \
743                WMB_ROW(_auto,  HAL_CONFIGT_GLOBAL_TEXT, _r, _r, _r), \
744                WMB_ROW(_auto,  HAL_CONFIGT_TOTALMAX, HAL_BC_MAXCONN, HAL_CONFIGT_DOWNRATE, HAL_BC_DOWNRATE), \
745                WMB_ROW(_auto,  HAL_CONFIGT_TOTALUP, HAL_BC_MAXUP, HAL_CONFIGT_UPRATE, HAL_BC_UPRATE), \
746        WMB_END()
747
748#define CONFIGT_ACTIVE_LAYOUT \
749        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp|70)), \
750                WMB_ROW(_gap|3), \
751                WMB_ROW(_auto, HAL_CGLOBAL_ACTDOWNT, HAL_CGLOBAL_ACTDOWN), \
752                WMB_ROW(_auto, HAL_CGLOBAL_ACTSEEDT, HAL_CGLOBAL_ACTSEED), \
753                WMB_ROW(_auto, HAL_CGLOBAL_ACTSEEDHARDT, HAL_CGLOBAL_ACTSEEDHARD), \
754        WMB_END()
755
756#define CONFIGT_SEEDING_LAYOUT \
757        WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp|70), WMB_COL(_gap)), \
758                WMB_ROW(_gap|3, HAL_CGLOBAL_SEEDINGG, _r, _r, _r), \
759                WMB_ROW(_auto,  _d, HAL_CGLOBAL_SHARERATIOT, HAL_CGLOBAL_SHARERATIO), \
760                WMB_ROW(_auto,  _d, HAL_CGLOBAL_SHARERATIOTIMET, HAL_CGLOBAL_SHARERATIOTIME), \
761                WMB_ROW(_auto,  _d, HAL_CGLOBAL_SHARETIMET, HAL_CGLOBAL_SHARETIME), \
762                WMB_ROW(_gap,   _d), \
763        WMB_END()
764
765#define CONFIGT_QUEUE_LAYOUT \
766        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COL(_gap), WMB_COLNOMAX(_exp)), \
767                WMB_ROW(_auto, CONFIGT_ACTIVE_LAYOUT, 0,  CONFIGT_SEEDING_LAYOUT), \
768                WMB_ROW(_auto, HAL_CGLOBAL_DISCOUNTSLOW, _r, _r), \
769        WMB_END()
770
771        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
772                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)), 
773                        WMB_ROW(_gap|3, HAL_CONFIGT_GLOBALG, _r, _r), 
774                        WMB_ROW(_auto,  _d, CONFIGT_GLOBAL_LAYOUT), 
775                        WMB_ROW(_gap,   _d),
776                        WMB_ROW(_gap|3, HAL_CGLOBAL_QUEUEG, _r, _r), 
777                        WMB_ROW(_auto,  _d, CONFIGT_QUEUE_LAYOUT), 
778                        WMB_ROW(_gap,   _d),
779                WMB_END()
780        END_WINDOW_MAP()
781
782    BEGIN_DDX_MAP(thisClass)
783        DDX_CHECK(HAL_CGLOBAL_DISCOUNTSLOW, hal::config().queue_settings_.dont_count_slow_torrents);
784    END_DDX_MAP()       
785
786    BOOL OnInitDialog(HWND hwndFocus, LPARAM lParam)
787        {
788                total_connections_.Attach(GetDlgItem(HAL_BC_MAXCONN));
789                upload_connections_.Attach(GetDlgItem(HAL_BC_MAXUP));
790                download_rate_.Attach(GetDlgItem(HAL_BC_DOWNRATE));
791                upload_rate_.Attach(GetDlgItem(HAL_BC_UPRATE));
792
793                total_connections_ = hal::config().globals_.total;
794                upload_connections_ = hal::config().globals_.uploads;
795                download_rate_ = hal::config().globals_.download_rate;
796                upload_rate_ = hal::config().globals_.upload_rate;
797
798                active_downloads_.Attach(GetDlgItem(HAL_CGLOBAL_ACTDOWN));
799                active_seeds_.Attach(GetDlgItem(HAL_CGLOBAL_ACTSEED));
800                seeds_hard_limit_.Attach(GetDlgItem(HAL_CGLOBAL_ACTSEEDHARD));
801
802                seed_ratio_limit_.Attach(GetDlgItem(HAL_CGLOBAL_SHARERATIO));
803                seed_ratio_time_limit_.Attach(GetDlgItem(HAL_CGLOBAL_SHARERATIOTIME));
804                seed_time_limit_.Attach(GetDlgItem(HAL_CGLOBAL_SHARETIME));             
805       
806                active_downloads_ = hal::config().queue_settings_.active_downloads;
807                active_seeds_ = hal::config().queue_settings_.active_seeds;
808                seeds_hard_limit_ = hal::config().queue_settings_.seeds_hard_limit;
809                seed_ratio_limit_ = hal::config().queue_settings_.seed_ratio_limit;
810                seed_ratio_time_limit_ = hal::config().queue_settings_.seed_ratio_time_limit;
811                seed_time_limit_ = hal::config().queue_settings_.seed_time_limit;
812
813                BOOL retval =  DoDataExchange(false);
814
815                autosizeClass::CtrlsArrange();
816                return retval;
817        }
818
819    int OnApply()
820        {
821                hal::event_log.post(shared_ptr<hal::EventDetail>(
822                        new hal::EventMsg(L"Applying torrent options.", hal::event_logger::info)));
823
824                hal::config().globals_.total = total_connections_;
825                hal::config().globals_.uploads = upload_connections_;
826                hal::config().globals_.download_rate = download_rate_;
827                hal::config().globals_.upload_rate = upload_rate_;
828       
829                hal::config().queue_settings_.active_downloads = active_downloads_;
830                hal::config().queue_settings_.active_seeds = active_seeds_;
831                hal::config().queue_settings_.seeds_hard_limit = seeds_hard_limit_;
832                hal::config().queue_settings_.seed_ratio_limit = seed_ratio_limit_;
833                hal::config().queue_settings_.seed_ratio_time_limit = seed_ratio_time_limit_;
834                hal::config().queue_settings_.seed_time_limit = seed_time_limit_;
835               
836                return DoDataExchange(true);
837        }
838       
839private:
840        CHaliteEditCtrl<int> total_connections_;
841        CHaliteEditCtrl<int> upload_connections_;
842        CHaliteEditCtrl<float> download_rate_;
843        CHaliteEditCtrl<float> upload_rate_;
844
845        CHaliteEditCtrl<int> active_downloads_;
846        CHaliteEditCtrl<int> active_seeds_;
847        CHaliteEditCtrl<int> seeds_hard_limit_;
848        CHaliteEditCtrl<float> seed_ratio_limit_;
849        CHaliteEditCtrl<float> seed_ratio_time_limit_;
850        CHaliteEditCtrl<int> seed_time_limit_;
851};
852
853class TorrentsOptions :
854    public WTL::CPropertyPageImpl<TorrentsOptions>,
855        public ATL::CAutoSizeWindow<TorrentsOptions, false>,
856    public CWinDataExchangeEx<TorrentsOptions>
857{
858        typedef TorrentsOptions thisClass;
859        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
860public:
861    enum { IDD = HAL_CONFIGTORRENT };
862       
863        TorrentsOptions() :
864                tTotalConnections_(0, false, false),
865                tUploadConnections_(0, false, false),
866                tDownloadRate_(0, false, false),
867                tUploadRate_(0, false, false)
868        {}
869
870    BEGIN_MSG_MAP_EX(TorrentsOptions)
871        MSG_WM_INITDIALOG(OnInitDialog)
872
873                COMMAND_ID_HANDLER_EX(HAL_BC_SAVEBROWSE, onFolderBrowse)
874                COMMAND_ID_HANDLER_EX(HAL_BC_MOVETO_BROWSE, onMoveToFolderBrowse)
875                COMMAND_ID_HANDLER_EX(HAL_BC_MOVETO_CHECK, onMoveToCheck)
876
877        CHAIN_MSG_MAP(CPropertyPageImpl<TorrentsOptions>)
878        CHAIN_MSG_MAP(autosizeClass)
879           REFLECT_NOTIFICATIONS()
880    END_MSG_MAP()
881
882#define CONFIGT_TORRENT_LAYOUT \
883        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp|30), WMB_COLNOMAX(_eq|0), WMB_COLNOMAX(_eq|1)), \
884                WMB_ROW(_auto,  HAL_CONFIGT_TOR_TEXT, _r, _r, _r), \
885                WMB_ROW(_auto,  HAL_CONFIGT_TORMAX, HAL_BC_TMAXCONN, HAL_CONFIGT_TDOWNRATE, HAL_BC_TDOWNRATE), \
886                WMB_ROW(_auto,  HAL_CONFIGT_TORUP, HAL_BC_TMAXUP, HAL_CONFIGT_TORUPRATE, HAL_BC_TUPRATE), \
887        WMB_END()
888
889#define CONFIGT_TORRENT_FOLDER_MOVETO_LAYOUT \
890        WMB_HEAD(WMB_COL(_auto), WMB_COLNOMAX(_exp|50)), \
891                WMB_ROW(_auto,  HAL_BC_MOVETO_CHECK, HAL_BC_MOVETO_TEXT), \
892        WMB_END()
893
894#define CONFIGT_TORRENT_FOLDER_LAYOUT \
895        WMB_HEAD( WMB_COLNOMAX(_exp|50), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_auto)), \
896                WMB_ROW(_auto,  HAL_CONFIGT_DEF_FOLDER, HAL_BC_SAVEFOLDER, HAL_BC_SAVEBROWSE), \
897                WMB_ROW(_auto,  CONFIGT_TORRENT_FOLDER_MOVETO_LAYOUT, HAL_BC_MOVETO_FOLDER, HAL_BC_MOVETO_BROWSE), \
898                WMB_ROW(_auto, 0, HAL_BC_PROMPTSAVE, _r), \
899        WMB_END()
900
901        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
902                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)), 
903                        WMB_ROW(_gap|3, HAL_CONFIGT_TORRENTG, _r, _r),
904                        WMB_ROW(_auto,  _d, CONFIGT_TORRENT_LAYOUT),
905                        WMB_ROW(_gap,   _d),
906                        WMB_ROW(_auto,  CONFIGT_TORRENT_FOLDER_LAYOUT, _r, _r), 
907                WMB_END()
908        END_WINDOW_MAP()
909
910    BEGIN_DDX_MAP(TorrentsOptions)
911/*      DDX_EX_INT_POSITIVE_LIMIT(HAL_BC_MAXCONN, hal::config().maxConnections, 2, true)
912        DDX_EX_INT_POSITIVE_LIMIT(HAL_BC_MAXUP, hal::config().maxUploads, 2, true)
913        DDX_EX_FLOAT_POSITIVE(HAL_BC_DOWNRATE, hal::config().downRate)
914        DDX_EX_FLOAT_POSITIVE(HAL_BC_UPRATE, hal::config().upRate)
915
916        DDX_EX_INT_POSITIVE_LIMIT(HAL_BC_TMAXCONN, hal::config().torrentMaxConnections, 2, true)
917        DDX_EX_INT_POSITIVE_LIMIT(HAL_BC_TMAXUP, hal::config().torrentMaxUploads, 2, true)
918        DDX_EX_FLOAT_POSITIVE(HAL_BC_TDOWNRATE, hal::config().torrentDownRate)
919        DDX_EX_FLOAT_POSITIVE(HAL_BC_TUPRATE, hal::config().torrentUpRate)
920*/
921                DDX_EX_STDWSTRING(HAL_BC_SAVEFOLDER, hal::config().default_save_folder_);
922                DDX_EX_STDWSTRING(HAL_BC_MOVETO_FOLDER, hal::config().default_move_folder_);
923        DDX_CHECK(HAL_BC_MOVETO_CHECK, hal::config().use_move_to_);
924        DDX_CHECK(HAL_BC_PROMPTSAVE, hal::config().save_prompt_);
925    END_DDX_MAP()       
926
927    BOOL OnInitDialog(HWND hwndFocus, LPARAM lParam)
928        {
929                tTotalConnections_.Attach(GetDlgItem(HAL_BC_TMAXCONN));
930                tUploadConnections_.Attach(GetDlgItem(HAL_BC_TMAXUP));
931                tDownloadRate_.Attach(GetDlgItem(HAL_BC_TDOWNRATE));
932                tUploadRate_.Attach(GetDlgItem(HAL_BC_TUPRATE));
933       
934                tTotalConnections_ = hal::config().torrent_defaults_.total;
935                tUploadConnections_ = hal::config().torrent_defaults_.uploads;
936                tDownloadRate_ = hal::config().torrent_defaults_.download_rate;
937                tUploadRate_ = hal::config().torrent_defaults_.upload_rate;
938       
939                BOOL retval =  DoDataExchange(false);
940                onMoveToCheck(0, 0, GetDlgItem(HAL_BC_MOVETO_CHECK));
941
942                autosizeClass::CtrlsArrange();
943                return retval;
944        }
945
946        void onFolderBrowse(UINT, int, HWND hWnd)
947        {               
948                wstring folderSelect = hal::app().res_wstr(HAL_FOLDER_SELECT);
949
950                WTL::CFolderDialog fldDlg (NULL, folderSelect.c_str(),
951                        BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE);
952
953                if (IDOK == fldDlg.DoModal())
954                        SetDlgItemText(HAL_BC_SAVEFOLDER, fldDlg.m_szFolderPath);
955        }
956
957        void onMoveToFolderBrowse(UINT, int, HWND hWnd)
958        {               
959                wstring folderSelect = hal::app().res_wstr(HAL_FOLDER_SELECT);
960
961                WTL::CFolderDialog fldDlg (NULL, folderSelect.c_str(),
962                        BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE);
963
964                if (IDOK == fldDlg.DoModal())
965                        SetDlgItemText(HAL_BC_MOVETO_FOLDER, fldDlg.m_szFolderPath);
966        }
967
968        void onMoveToCheck(UINT, int, HWND hWnd)
969        {
970                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
971
972                if (result == BST_CHECKED)
973                {
974                        ::EnableWindow(GetDlgItem(HAL_BC_MOVETO_FOLDER), true);
975                        ::EnableWindow(GetDlgItem(HAL_BC_MOVETO_BROWSE), true);
976                }
977                else
978                {
979                        ::EnableWindow(GetDlgItem(HAL_BC_MOVETO_FOLDER), false);
980                        ::EnableWindow(GetDlgItem(HAL_BC_MOVETO_BROWSE), false);
981                }               
982        }
983
984    int OnApply()
985        {
986                hal::event_log.post(shared_ptr<hal::EventDetail>(
987                        new hal::EventMsg(L"Applying torrent options.", hal::event_logger::info)));
988
989                hal::config().torrent_defaults_.total = tTotalConnections_;
990                hal::config().torrent_defaults_.uploads = tUploadConnections_;
991                hal::config().torrent_defaults_.download_rate = tDownloadRate_;
992                hal::config().torrent_defaults_.upload_rate = tUploadRate_;
993               
994                return DoDataExchange(true);
995        }
996       
997private:       
998        CHaliteEditCtrl<int> tTotalConnections_;
999        CHaliteEditCtrl<int> tUploadConnections_;
1000        CHaliteEditCtrl<float> tDownloadRate_;
1001        CHaliteEditCtrl<float> tUploadRate_;
1002};
1003
1004class RemoteOptions :
1005    public WTL::CPropertyPageImpl<RemoteOptions>,
1006    public WTL::CWinDataExchange<RemoteOptions>
1007{
1008public:
1009    enum { IDD = HAL_CONFIGREMOTE };
1010
1011        RemoteOptions()
1012        {}
1013
1014        ~RemoteOptions()
1015        {}
1016
1017    BEGIN_MSG_MAP_EX(RemoteOptions)
1018                MSG_WM_INITDIALOG(OnInitDialog)
1019        CHAIN_MSG_MAP(CPropertyPageImpl<RemoteOptions>)
1020    END_MSG_MAP()
1021
1022    BEGIN_DDX_MAP(RemoteOptions)
1023//      DDX_CHECK(HAL_REMOTECTRL, INI().remoteConfig().isEnabled)
1024//      DDX_INT(HAL_REMOTEPORT, INI().remoteConfig().port)
1025    END_DDX_MAP()
1026
1027    BOOL OnInitDialog ( HWND hwndFocus, LPARAM lParam )
1028        {
1029                return DoDataExchange(false);
1030        }
1031
1032    int OnApply()
1033        {
1034                hal::event_log.post(shared_ptr<hal::EventDetail>(
1035                        new hal::EventMsg(L"Applying remote options.", hal::event_logger::info)));
1036
1037                return DoDataExchange(true);
1038        }
1039};
1040
1041class AboutOptions :
1042    public WTL::CPropertyPageImpl<AboutOptions>,
1043        public WTL::CDialogResize<AboutOptions>
1044{
1045        typedef AboutOptions thisClass;
1046        typedef WTL::CDialogResize<thisClass> resizeClass;
1047
1048public:
1049    enum { IDD = HAL_ABOUT };
1050
1051    BEGIN_MSG_MAP_EX(thisClass)
1052                MSG_WM_INITDIALOG(OnInitDialog)
1053                CHAIN_MSG_MAP(resizeClass)
1054        CHAIN_MSG_MAP(CPropertyPageImpl<thisClass>)
1055    END_MSG_MAP()
1056
1057    BEGIN_DLGRESIZE_MAP(thisClass)
1058                DLGRESIZE_CONTROL(HAL_RICHEDITABOUT, DLSZ_SIZE_X|DLSZ_SIZE_Y)
1059                DLGRESIZE_CONTROL(HAL_ABOUT_VERSION, DLSZ_MOVE_X|DLSZ_MOVE_Y)
1060        END_DLGRESIZE_MAP()
1061
1062    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
1063        {
1064                richEdit_.Attach(GetDlgItem(HAL_RICHEDITABOUT));
1065
1066                std::pair<void*, size_t> res = hal::app().res_find_lock(HAL_ABOUT_TEXT, HALITE_RTF_RES_TYPE);
1067
1068                string rtf(static_cast<char*>(res.first), res.second);
1069                wstring wrtf = hal::from_utf8_safe(rtf);
1070
1071                richEdit_.SendMessage(WM_SETTEXT, 0, (LPARAM)wrtf.c_str());
1072                richEdit_.SetSelNone();
1073//              richEdit_.SetEventMask(ENM_REQUESTRESIZE);
1074
1075        resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);
1076
1077                return true;
1078        }
1079
1080private:
1081
1082        WTL::CRichEditCtrl richEdit_;
1083        RECT richRect_;
1084};
1085
1086class ConfigOptionsProp :
1087        public WTL::CPropertySheet,
1088        public WTL::CDialogResize<ConfigOptionsProp>
1089{
1090        typedef ConfigOptionsProp thisClass;
1091        typedef WTL::CDialogResize<thisClass> resizeClass;
1092
1093public:
1094    ConfigOptionsProp(HaliteWindow* haliteWindow, LPCTSTR title = (LPCTSTR)NULL,
1095                UINT uStartPage = 0, HWND hWndParent = NULL) :
1096        CPropertySheet(title, uStartPage, hWndParent),
1097                m_bCentered(false),
1098                generalOptions(haliteWindow)
1099    {
1100                AddPage(generalOptions);
1101                AddPage(bitTorrentOptions);
1102                AddPage(portOptions);
1103                AddPage(globalOptions);
1104                AddPage(securityOptions);
1105                AddPage(torrentsOptions);
1106        //      AddPage(remoteControlOptions);
1107                AddPage(aboutOptions);
1108    }
1109
1110    BEGIN_MSG_MAP_EX(ConfigOptionsProp)
1111        MESSAGE_HANDLER(WM_SHOWWINDOW, OnShowWindow)
1112                MSG_WM_SIZE(OnSize)
1113                CHAIN_MSG_MAP(resizeClass)
1114        CHAIN_MSG_MAP(CPropertySheet)
1115    END_MSG_MAP()
1116
1117    BEGIN_DLGRESIZE_MAP(thisClass)
1118                DLGRESIZE_CONTROL(0x3020, DLSZ_SIZE_X|DLSZ_SIZE_Y)
1119
1120                DLGRESIZE_CONTROL(0x1, DLSZ_MOVE_X|DLSZ_MOVE_Y)
1121                DLGRESIZE_CONTROL(0x2, DLSZ_MOVE_X|DLSZ_MOVE_Y)
1122                DLGRESIZE_CONTROL(0x3021, DLSZ_MOVE_X|DLSZ_MOVE_Y)
1123        END_DLGRESIZE_MAP()
1124
1125        void OnSize(UINT, WTL::CSize)
1126        {
1127        SetMsgHandled(false);
1128
1129        HWND propTabs = GetDlgItem(0x3020);
1130
1131                RECT rect;
1132                ::GetWindowRect(propTabs, &rect);
1133
1134                ::MapWindowPoints(NULL, m_hWnd, (LPPOINT)&rect, 2);
1135                ::SendMessage(propTabs, TCM_ADJUSTRECT, false, (LPARAM)&rect);
1136
1137                ::MoveWindow(GetActivePage(), rect.left, rect.top,
1138            rect.right-rect.left, rect.bottom-rect.top, true);
1139        }
1140
1141    LRESULT OnShowWindow(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
1142    {
1143        if (wParam == TRUE)
1144        {
1145            WTL::CMenuHandle pSysMenu = GetSystemMenu(FALSE);
1146
1147                if (pSysMenu != NULL)
1148                pSysMenu.InsertMenu(-1, MF_BYPOSITION|MF_STRING, SC_SIZE, L"&Size");
1149
1150            ModifyStyle(0, WS_THICKFRAME, 0);
1151            Center();
1152
1153            resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);
1154        }
1155               
1156                bHandled = FALSE;
1157               
1158        return 0;
1159    }
1160
1161    void Center(void)
1162    {
1163        if (!m_bCentered)
1164        {
1165            CenterWindow();
1166            m_bCentered = true;
1167        }
1168    }
1169
1170private:
1171    bool m_bCentered;
1172
1173        GeneralOptions generalOptions;
1174        BitTorrentOptions bitTorrentOptions;
1175        PortOptions portOptions;
1176        GlobalOptions globalOptions;
1177        SecurityOptions securityOptions;
1178        TorrentsOptions torrentsOptions;
1179        RemoteOptions remoteControlOptions;
1180        AboutOptions aboutOptions;
1181};
1182
1183#endif // RC_INVOKED
Note: See TracBrowser for help on using the repository browser.