source: trunk/src/ConfigOptions.hpp @ 641

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