source: trunk/src/ConfigOptions.hpp @ 618

Revision 618, 73.6 KB checked in by Eoin, 12 years ago (diff)

Port randomization and router model reporting added.

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