source: trunk/src/ConfigOptions.hpp @ 495

Revision 495, 58.8 KB checked in by Eoin, 12 years ago (diff)

Changes seem ok.

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
55#ifndef RC_INVOKED
56
57#include "stdAfx.hpp"
58
59#include "Halite.hpp"
60#include "halConfig.hpp"
61#include "HaliteWindow.hpp"
62#include "HaliteEditCtrl.hpp"
63
64#include "DdxEx.hpp"
65#include "CSSFileDialog.hpp"
66#include "AtlAutosizeDlg.h"
67
68class GeneralOptions :
69    public WTL::CPropertyPageImpl<GeneralOptions>,
70        public ATL::CAutoSizeWindow<GeneralOptions, false>,
71    public WTL::CWinDataExchange<GeneralOptions>
72{
73        typedef GeneralOptions thisClass;
74        typedef WTL::CPropertyPageImpl<thisClass> propPageClass;
75        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
76       
77public:
78    enum { IDD = HAL_CONFIGGENERAL };
79
80        GeneralOptions(HaliteWindow* haliteWindow) :
81                haliteWindow_(haliteWindow)
82        {}
83
84        ~GeneralOptions()
85        {}
86
87    BEGIN_MSG_MAP_EX(GeneralOptions)
88                MSG_WM_INITDIALOG(OnInitDialog)
89        CHAIN_MSG_MAP(CPropertyPageImpl<GeneralOptions>)
90        CHAIN_MSG_MAP(autosizeClass)
91    END_MSG_MAP()
92
93    BEGIN_DDX_MAP(GeneralOptions)
94        DDX_CHECK(HAL_GENERAL_ONEINST, halite().oneInst)
95        DDX_CHECK(HAL_GENERAL_TRAY, haliteWindow_->use_tray)
96        DDX_CHECK(HAL_GENERAL_ADVGUI, haliteWindow_->advancedUI)
97        DDX_CHECK(HAL_GENERAL_CLOSETRAY, haliteWindow_->closeToTray)
98        DDX_CHECK(HAL_GENERAL_CONFIRMCLOSE, haliteWindow_->confirmClose)
99    END_DDX_MAP()
100
101#define GENERAL_CONFIG_LAYOUT \
102        WMB_HEAD(WMB_COLNOMAX(_exp)), \
103                WMB_ROW(_gap,   _d), \
104                WMB_ROW(_auto,  HAL_GENERAL_ONEINST), \
105                WMB_ROW(_auto,  HAL_GENERAL_ADVGUI), \
106                WMB_ROW(_auto,  HAL_GENERAL_TRAY), \
107                WMB_ROW(_auto,  HAL_GENERAL_CLOSETRAY), \
108                WMB_ROW(_auto,  HAL_GENERAL_CONFIRMCLOSE), \
109        WMB_END()
110
111#define GENERAL_LANGUAGE_LAYOUT \
112        WMB_HEAD(WMB_COLNOMAX(_exp)), \
113                WMB_ROW(_auto,  HAL_GENERAL_LANG), \
114                WMB_ROW(_auto,  HAL_LANGLIST), \
115        WMB_END()
116
117        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
118                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COL(_gap)),
119                        WMB_ROW(_gap|3, HAL_GENERAL_GROUP, _r, _r, _r), 
120                        WMB_ROW(_auto,  _d, GENERAL_CONFIG_LAYOUT, GENERAL_LANGUAGE_LAYOUT), 
121                        WMB_ROW(_gap,   _d),
122                WMB_END()
123        END_WINDOW_MAP()       
124
125    BOOL OnInitDialog(HWND hwndFocus, LPARAM lParam);
126
127    int OnApply()
128        {       
129                hal::event_log.post(shared_ptr<hal::EventDetail>(
130                        new hal::EventMsg(L"Applying general options.", hal::event_logger::info)));
131
132                size_t length = lang_list_.GetTextLen(lang_list_.GetCurSel());
133                boost::scoped_array<wchar_t> buffer(new wchar_t[length+1]);
134               
135                lang_list_.GetText(lang_list_.GetCurSel(), buffer.get());
136                std::wstring language(buffer.get(), length);
137
138                if (language == L"English")
139                {
140                        halite().dll_ = L"";
141                        hal::app().res_revert();
142                }
143                else
144                {
145                        halite().dll_ = lang_map_[language].external_file_string();
146                        hal::app().res_set_dll(lang_map_[language].external_file_string());
147                }
148               
149                return DoDataExchange(true);
150        }
151
152private:
153        WTL::CListBox lang_list_;
154        std::map<wstring, wpath> lang_map_;
155        HaliteWindow* haliteWindow_;
156};
157
158class BitTorrentOptions :
159    public WTL::CPropertyPageImpl<BitTorrentOptions>,
160        public ATL::CAutoSizeWindow<BitTorrentOptions, false>,
161    public CWinDataExchangeEx<BitTorrentOptions>
162{
163        typedef BitTorrentOptions thisClass;
164        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
165       
166public:
167    enum { IDD = HAL_CONFIGBIT };
168
169        BitTorrentOptions()
170        {}
171
172        ~BitTorrentOptions()
173        {}
174
175    BEGIN_MSG_MAP_EX(BitTorrentOptions)
176        MSG_WM_INITDIALOG(OnInitDialog)
177                COMMAND_ID_HANDLER_EX(HAL_BC_PORTCHECK, onPortCheck)
178                COMMAND_ID_HANDLER_EX(HAL_BC_HALFCONN_CHECK, onHalfCheck)
179                COMMAND_ID_HANDLER_EX(HAL_BC_DHT, onDHTCheck)
180               
181        CHAIN_MSG_MAP(CPropertyPageImpl<BitTorrentOptions>)
182        CHAIN_MSG_MAP(autosizeClass)
183    END_MSG_MAP()
184
185    BEGIN_DDX_MAP(BitTorrentOptions)
186        DDX_CHECK(HAL_BC_PORTCHECK, hal::config().portRange)
187        DDX_INT(HAL_BC_PORTFROM, hal::config().portFrom)
188        DDX_INT(HAL_BC_PORTTO, hal::config().portTo)           
189        DDX_CHECK(HAL_BC_HALFCONN_CHECK, hal::config().halfConn)
190        DDX_EX_INT_POSITIVE(HAL_BC_HALFCONN_NUM, hal::config().halfConnLimit)
191        DDX_CHECK(HAL_BC_DHT, hal::config().enableDHT)
192        DDX_INT(HAL_BC_DHTPORT, hal::config().dhtServicePort)
193        DDX_RADIO(HAL_BITT_GPORTFORWARD_NONE, hal::config().mappingType)
194    END_DDX_MAP()
195       
196#define BITT_GS_LAYOUT \
197        WMB_HEAD(WMB_COLNOMAX(_exp|250), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp)), \
198                WMB_ROW(_auto,  HAL_BITT_SELECT_TEXT, _r, _r, _r), \
199                WMB_ROW(_auto,  HAL_BITT_OPENPORT, HAL_BC_PORTFROM, HAL_BC_PORTCHECK, HAL_BC_PORTTO), \
200                WMB_ROW(_auto,  HAL_BC_HALFCONN_CHECK, _r, HAL_BC_HALFCONN_NUM), \
201        WMB_END()
202
203#define BITT_DHT_LAYOUT \
204        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp)), \
205                WMB_ROW(_auto,  HAL_BC_DHT, HAL_BC_DHTPORT_S, HAL_BC_DHTPORT), \
206                WMB_ROW(_auto,  HAL_BITT_DHT_NOTE, _r, _r), \
207        WMB_END()
208
209#define BITT_FOR_LAYOUT \
210        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp|50)), \
211                WMB_ROW(_auto,  HAL_BITT_GPORTFORWARD_NONE, _r, HAL_BITT_GPORTFORWARD_TEST), \
212                WMB_ROW(_auto,  HAL_BITT_GPORTFORWARD_UPNG, HAL_BITT_GPORTFORWARD_LIST, _r), \
213                WMB_ROW(_auto,  HAL_BIT_GPORTFORWARD_NATPMP, _d), \
214        WMB_END()
215
216        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
217                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)),
218                        WMB_ROW(_gap|3, HAL_BITT_GSETTINGS, _r, _r), 
219                        WMB_ROW(_auto,  _d, BITT_GS_LAYOUT),
220                        WMB_ROW(_gap,   _d),
221                        WMB_ROW(_gap|3, HAL_BITT_GDHT, _r, _r),
222                        WMB_ROW(_auto,  _d, BITT_DHT_LAYOUT), 
223                        WMB_ROW(_gap,   _d),
224                        WMB_ROW(_gap|3, HAL_BITT_GPORTFORWARDING, _r, _r),
225                        WMB_ROW(_auto,  _d, BITT_FOR_LAYOUT), 
226                        WMB_ROW(_gap,   _d),
227                WMB_END()
228        END_WINDOW_MAP()
229
230    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
231        {       
232        //      helpLink.SubclassWindow(GetDlgItem(HAL_BC_HELP_LINK));
233        //      helpLink.SetHyperLink(L"http://www.binarynotions.com/");
234               
235        //      whyHalfConn.SubclassWindow(GetDlgItem(HAL_BC_CON_WHY));
236        //      whyHalfConn.SetHyperLink(L"http://www.binarynotions.com/");
237               
238                BOOL retval = DoDataExchange(false);
239
240                onHalfCheck(0, 0, GetDlgItem(HAL_BC_HALFCONN_CHECK));
241                onPortCheck(0, 0, GetDlgItem(HAL_BC_PORTCHECK));
242                onDHTCheck(0, 0, GetDlgItem(HAL_BC_DHT));
243
244                autosizeClass::CtrlsArrange();
245                return retval;
246        }
247
248    int OnApply()
249        {
250                hal::event_log.post(shared_ptr<hal::EventDetail>(
251                        new hal::EventMsg(L"Applying bittorrent options.", hal::event_logger::info)));
252
253                onPortCheck(0, 0, GetDlgItem(HAL_BC_PORTCHECK));
254
255                return DoDataExchange(true);
256        }
257
258        void onDHTCheck(UINT, int, HWND hWnd)
259        {
260                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
261
262                if (result == BST_CHECKED)
263                {
264                        ::EnableWindow(GetDlgItem(HAL_BC_DHTPORT), true);
265                        ::EnableWindow(GetDlgItem(HAL_BC_DHTPORT_S), true);
266                }
267                else
268                {
269                        ::EnableWindow(GetDlgItem(HAL_BC_DHTPORT), false);
270                        ::EnableWindow(GetDlgItem(HAL_BC_DHTPORT_S), false);
271                }
272        }
273
274        void onPortCheck(UINT, int, HWND hWnd)
275        {
276                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
277
278                if (result == BST_CHECKED)
279                {
280                        ::EnableWindow(GetDlgItem(HAL_BC_PORTTO), true);
281                }
282                else
283                {
284                        ::EnableWindow(GetDlgItem(HAL_BC_PORTTO), false);
285                        boost::array<wchar_t, MAX_PATH> buffer;
286                        GetDlgItemText(HAL_BC_PORTFROM, buffer.elems, MAX_PATH);
287                        SetDlgItemText(HAL_BC_PORTTO, buffer.elems);
288                }
289        }
290
291        void onHalfCheck(UINT, int, HWND hWnd)
292        {
293                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
294
295                if (result == BST_CHECKED)
296                {
297                        ::EnableWindow(GetDlgItem(HAL_BC_HALFCONN_NUM), true);
298                }
299                else
300                {
301                        ::EnableWindow(GetDlgItem(HAL_BC_HALFCONN_NUM), false);
302                        SetDlgItemText(HAL_BC_HALFCONN_NUM, L"");
303                }
304        }
305private:
306        WTL::CHyperLink helpLink;
307        WTL::CHyperLink whyHalfConn;
308};
309
310class ProxyOptions :
311    public WTL::CPropertyPageImpl<ProxyOptions>,
312    public CWinDataExchangeEx<ProxyOptions>
313{
314public:
315    enum { IDD = HAL_CONFIGPROXY };
316
317        ProxyOptions()
318        {}
319
320        ~ProxyOptions()
321        {}
322
323    BEGIN_MSG_MAP_EX(ProxyOptions)
324        MSG_WM_INITDIALOG(OnInitDialog)
325                COMMAND_ID_HANDLER_EX(HAL_BC_PROXYCHECK, onProxyCheck)
326        CHAIN_MSG_MAP(CPropertyPageImpl<ProxyOptions>)
327    END_MSG_MAP()
328
329    BEGIN_DDX_MAP(ProxyOptions)
330       
331    END_DDX_MAP()
332
333    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
334        {
335                BOOL retval =  DoDataExchange(false);
336
337                onProxyCheck(0, 0, GetDlgItem(HAL_BC_PROXYCHECK));
338
339                return retval;
340        }
341
342    int OnApply()
343        {
344                hal::event_log.post(shared_ptr<hal::EventDetail>(
345                        new hal::EventMsg(L"Applying proxy options.", hal::event_logger::info)));
346
347                return DoDataExchange(true);
348        }
349
350        void onPortCheck(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_PORTTO), true);
357                }
358                else
359                {
360                        ::EnableWindow(GetDlgItem(HAL_BC_PORTTO), false);
361                        boost::array<wchar_t, MAX_PATH> buffer;
362                        GetDlgItemText(HAL_BC_PORTFROM, buffer.elems, MAX_PATH);
363                        SetDlgItemText(HAL_BC_PORTTO, buffer.elems);
364                }
365        }
366
367        void onProxyCheck(UINT, int, HWND hWnd)
368        {
369                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
370
371                if (result == BST_CHECKED)
372                {
373                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYIP), true);
374                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPORT), true);
375                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYUSER), true);
376                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPASS), true);
377                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYIP_S), true);
378                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPORT_S), true);
379                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYUSER_S), true);
380                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPASS_S), true);
381                }
382                else
383                {
384                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYIP), false);
385                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPORT), false);
386                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYUSER), false);
387                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPASS), false);
388                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYIP_S), false);
389                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPORT_S), false);
390                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYUSER_S), false);
391                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPASS_S), false);
392                }
393        }
394};
395
396class SecurityOptions :
397    public WTL::CPropertyPageImpl<SecurityOptions>,
398        public ATL::CAutoSizeWindow<SecurityOptions, false>,
399    public CWinDataExchangeEx<SecurityOptions>
400{
401        typedef SecurityOptions thisClass;
402        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
403       
404public:
405    enum { IDD = HAL_CONFIGSECURITY };
406
407    BEGIN_MSG_MAP_EX(thisClass)
408        MSG_WM_INITDIALOG(OnInitDialog)
409               
410                COMMAND_ID_HANDLER_EX(HAL_BC_FILTERLOAD, onFilterImport)
411                COMMAND_ID_HANDLER_EX(HAL_BC_FILTERCLEAR, onFilterClear)
412                COMMAND_ID_HANDLER_EX(HAL_BC_FILTERCHECK, onFilterCheck)
413               
414                COMMAND_ID_HANDLER_EX(HAL_SC_ENABLE_PE, onPeCheck)
415               
416        CHAIN_MSG_MAP(autosizeClass)
417        CHAIN_MSG_MAP(CPropertyPageImpl<thisClass>)
418//              MSG_WM_SIZE(OnSize)
419    END_MSG_MAP()
420
421    BEGIN_DDX_MAP(thisClass)
422        DDX_CHECK(HAL_BC_FILTERCHECK, hal::config().enableIPFilter)
423        DDX_CHECK(HAL_SC_ENABLE_PE, hal::config().enablePe)
424        DDX_RADIO(HAL_SC_PE_ENC_PLAIN, hal::config().peEncLevel)
425        DDX_CHECK(HAL_SC_PE_ENC_RC4_PERFER, hal::config().pePerferRc4)
426        DDX_RADIO(HAL_SC_PE_CP_IN_FORCED, hal::config().peConInPolicy)
427        DDX_RADIO(HAL_SC_PE_CP_OUT_FORCED, hal::config().peConOutPolicy)
428    END_DDX_MAP()
429       
430/*      void OnSize(UINT type, CSize)
431        {
432               
433                SetMsgHandled(false);
434        }
435*/
436#define SECURITY_IPF_LAYOUT \
437        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp)), \
438                WMB_ROW(_auto,  HAL_BC_FILTERCHECK,     HAL_BC_FILTERCLEAR, HAL_BC_FILTERLOAD), \
439        WMB_END()
440
441#define SECURITY_ENCODING_LAYOUT \
442        WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COL(_gap)), \
443                WMB_ROW(_auto,  HAL_SC_ENABLE_PE,       _r,_r,_r), \
444                WMB_ROW(_gap|3, HAL_SECURITY_EL_GB,     _r,_r,_r), \
445                WMB_ROW(_auto,  _d,     HAL_SC_PE_ENC_PLAIN, _r), \
446                WMB_ROW(_auto,  _d,     HAL_SC_PE_ENC_RC4, _r), \
447                WMB_ROW(_auto,  _d,     HAL_SC_PE_ENC_BOTH, HAL_SC_PE_ENC_RC4_PERFER), \
448                WMB_ROW(_gap,   _d), \
449        WMB_END()
450
451#define SECURITY_CONNECTION_LAYOUT \
452        WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COL(_gap)), \
453                WMB_ROW(_gap|4, HAL_SECURITY_CP_GB,     _r, _r, _r, _r, _r), \
454                WMB_ROW(_auto,  _d,     HAL_SECURITY_INCOMING, _r, HAL_SECURITY_OUTGOING, _r), \
455                WMB_ROW(_auto,  _d,     HAL_SC_PE_CP_IN_FORCED, HAL_SECURITY_FORCED, _r, HAL_SC_PE_CP_OUT_FORCED), \
456                WMB_ROW(_auto,  _d,     HAL_SC_PE_CP_IN_ENABLED, HAL_SECURITY_ENABLED, _r, HAL_SC_PE_CP_OUT_ENABLED), \
457                WMB_ROW(_auto,  _d,     HAL_SC_PE_CP_IN_DISABLED, HAL_SECURITY_DISABLED, _r, HAL_SC_PE_CP_OUT_DISABLED), \
458                WMB_ROW(_gap,   _d), \
459        WMB_END()
460       
461#define SECURITY_PE_LAYOUT \
462        WMB_HEAD(WMB_COLNOMAX(_exp|150), WMB_COLNOMAX(_exp)), \
463                WMB_ROW(_auto,  SECURITY_ENCODING_LAYOUT, SECURITY_CONNECTION_LAYOUT), \
464        WMB_END()
465
466        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
467                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)), 
468                        WMB_ROW(_gap|3, HAL_SECURITY_IPF_GB, _r, _r), 
469                        WMB_ROW(_auto,  _d, SECURITY_IPF_LAYOUT), 
470                        WMB_ROW(_gap,   _d), 
471                        WMB_ROW(_gap|3, HAL_SECURITY_PE_GB, _r, _r), 
472                        WMB_ROW(_auto,  _d, SECURITY_PE_LAYOUT),
473                        WMB_ROW(_gap,   _d),
474                WMB_END()
475        END_WINDOW_MAP()       
476
477    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
478        {
479        //      helpLink.SubclassWindow(GetDlgItem(HAL_SC_HELP_LINK));
480        //      helpLink.SetHyperLink(L"http://www.binarynotions.com/");
481
482                BOOL retval =  DoDataExchange(false);
483
484                onFilterCheck(0, 0, GetDlgItem(HAL_BC_FILTERCHECK));
485                onPeCheck(0, 0, GetDlgItem(HAL_SC_ENABLE_PE));
486
487                autosizeClass::CtrlsArrange();
488                return retval;
489        }
490
491    int OnApply()
492        {
493                hal::event_log.post(shared_ptr<hal::EventDetail>(
494                        new hal::EventMsg(L"Applying security options.", hal::event_logger::info)));
495
496                return DoDataExchange(true);
497        }
498
499        void onFilterCheck(UINT, int, HWND hWnd)
500        {
501                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
502
503                if (result == BST_CHECKED)
504                {
505                        ::EnableWindow(GetDlgItem(HAL_BC_FILTERCLEAR), true);
506                        ::EnableWindow(GetDlgItem(HAL_BC_FILTERLOAD), true);
507                }
508                else
509                {
510                        ::EnableWindow(GetDlgItem(HAL_BC_FILTERCLEAR), false);
511                        ::EnableWindow(GetDlgItem(HAL_BC_FILTERLOAD), false);
512                }
513        }
514
515        void onPeCheck(UINT, int, HWND hWnd)
516        {
517                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
518
519                if (result == BST_CHECKED)
520                {
521                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_BOTH), true);
522                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_RC4), true);
523                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_PLAIN), true);
524                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_RC4_PERFER), true);
525                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_FORCED), true);
526                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_DISABLED), true);
527                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_ENABLED), true);
528                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_DISABLED), true);
529                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_ENABLED), true);
530                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_FORCED), true);
531                }
532                else
533                {
534                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_BOTH), false);
535                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_RC4), false);
536                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_PLAIN), false);
537                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_RC4_PERFER), false);
538                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_FORCED), false);
539                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_DISABLED), false);
540                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_ENABLED), false);
541                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_DISABLED), false);
542                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_ENABLED), false);
543                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_FORCED), false);
544                }
545        }
546
547        void onFilterClear(UINT, int, HWND hWnd)
548        {
549                hal::bittorrent().clear_ip_filter();
550        }
551
552        void onFilterImport(UINT, int, HWND hWnd);
553
554private:
555        WTL::CHyperLink helpLink;
556};
557
558class TorrentsOptions :
559    public WTL::CPropertyPageImpl<TorrentsOptions>,
560        public ATL::CAutoSizeWindow<TorrentsOptions, false>,
561    public CWinDataExchangeEx<TorrentsOptions>
562{
563        typedef TorrentsOptions thisClass;
564        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
565public:
566    enum { IDD = HAL_CONFIGTORRENT };
567       
568        TorrentsOptions() :
569                gTotalConnections_(0, false, false),
570                gUploadConnections_(0, false, false),
571                gDownloadRate_(0, false, false),
572                gUploadRate_(0, false, false),
573                tTotalConnections_(0, false, false),
574                tUploadConnections_(0, false, false),
575                tDownloadRate_(0, false, false),
576                tUploadRate_(0, false, false)
577        {}
578
579    BEGIN_MSG_MAP_EX(TorrentsOptions)
580        MSG_WM_INITDIALOG(OnInitDialog)
581
582                COMMAND_ID_HANDLER_EX(HAL_BC_SAVEBROWSE, onFolderBrowse)
583                COMMAND_ID_HANDLER_EX(HAL_BC_MOVETO_BROWSE, onMoveToFolderBrowse)
584                COMMAND_ID_HANDLER_EX(HAL_BC_MOVETO_CHECK, onMoveToCheck)
585
586        CHAIN_MSG_MAP(CPropertyPageImpl<TorrentsOptions>)
587        CHAIN_MSG_MAP(autosizeClass)
588           REFLECT_NOTIFICATIONS()
589    END_MSG_MAP()
590       
591#define CONFIGT_GLOBAL_LAYOUT \
592        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp|30), WMB_COLNOMAX(_eq|0), WMB_COLNOMAX(_eq|1)), \
593                WMB_ROW(_auto,  HAL_CONFIGT_GLOBAL_TEXT, _r, _r, _r), \
594                WMB_ROW(_auto,  HAL_CONFIGT_TOTALMAX, HAL_BC_MAXCONN, HAL_CONFIGT_DOWNRATE, HAL_BC_DOWNRATE), \
595                WMB_ROW(_auto,  HAL_CONFIGT_TOTALUP, HAL_BC_MAXUP, HAL_CONFIGT_UPRATE, HAL_BC_UPRATE), \
596        WMB_END()
597
598#define CONFIGT_TORRENT_LAYOUT \
599        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp|30), WMB_COLNOMAX(_eq|0), WMB_COLNOMAX(_eq|1)), \
600                WMB_ROW(_auto,  HAL_CONFIGT_TOR_TEXT, _r, _r, _r), \
601                WMB_ROW(_auto,  HAL_CONFIGT_TORMAX, HAL_BC_TMAXCONN, HAL_CONFIGT_TDOWNRATE, HAL_BC_TDOWNRATE), \
602                WMB_ROW(_auto,  HAL_CONFIGT_TORUP, HAL_BC_TMAXUP, HAL_CONFIGT_TORUPRATE, HAL_BC_TUPRATE), \
603        WMB_END()
604
605#define CONFIGT_TORRENT_FOLDER_MOVETO_LAYOUT \
606        WMB_HEAD(WMB_COL(_auto), WMB_COLNOMAX(_exp|50)), \
607                WMB_ROW(_auto,  HAL_BC_MOVETO_CHECK, HAL_BC_MOVETO_TEXT), \
608        WMB_END()
609
610#define CONFIGT_TORRENT_FOLDER_LAYOUT \
611        WMB_HEAD( WMB_COLNOMAX(_exp|50), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_auto)), \
612                WMB_ROW(_auto,  HAL_CONFIGT_DEF_FOLDER, HAL_BC_SAVEFOLDER, HAL_BC_SAVEBROWSE), \
613                WMB_ROW(_auto,  CONFIGT_TORRENT_FOLDER_MOVETO_LAYOUT, HAL_BC_MOVETO_FOLDER, HAL_BC_MOVETO_BROWSE), \
614                WMB_ROW(_auto, 0, HAL_BC_PROMPTSAVE, _r), \
615        WMB_END()
616
617        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
618                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)), 
619                        WMB_ROW(_gap|3, HAL_CONFIGT_GLOBALG, _r, _r), 
620                        WMB_ROW(_auto,  _d, CONFIGT_GLOBAL_LAYOUT), 
621                        WMB_ROW(_gap,   _d), 
622                        WMB_ROW(_gap|3, HAL_CONFIGT_TORRENTG, _r, _r),
623                        WMB_ROW(_auto,  _d, CONFIGT_TORRENT_LAYOUT),
624                        WMB_ROW(_auto,  _d, CONFIGT_TORRENT_FOLDER_LAYOUT), 
625                        WMB_ROW(_gap,   _d),
626                WMB_END()
627        END_WINDOW_MAP()
628
629    BEGIN_DDX_MAP(TorrentsOptions)
630/*      DDX_EX_INT_POSITIVE_LIMIT(HAL_BC_MAXCONN, hal::config().maxConnections, 2, true)
631        DDX_EX_INT_POSITIVE_LIMIT(HAL_BC_MAXUP, hal::config().maxUploads, 2, true)
632        DDX_EX_FLOAT_POSITIVE(HAL_BC_DOWNRATE, hal::config().downRate)
633        DDX_EX_FLOAT_POSITIVE(HAL_BC_UPRATE, hal::config().upRate)
634
635        DDX_EX_INT_POSITIVE_LIMIT(HAL_BC_TMAXCONN, hal::config().torrentMaxConnections, 2, true)
636        DDX_EX_INT_POSITIVE_LIMIT(HAL_BC_TMAXUP, hal::config().torrentMaxUploads, 2, true)
637        DDX_EX_FLOAT_POSITIVE(HAL_BC_TDOWNRATE, hal::config().torrentDownRate)
638        DDX_EX_FLOAT_POSITIVE(HAL_BC_TUPRATE, hal::config().torrentUpRate)
639*/
640                DDX_EX_STDWSTRING(HAL_BC_SAVEFOLDER, hal::config().defaultSaveFolder);
641                DDX_EX_STDWSTRING(HAL_BC_MOVETO_FOLDER, hal::config().defaultMoveToFolder);
642        DDX_CHECK(HAL_BC_MOVETO_CHECK, hal::config().useMoveTo);
643        DDX_CHECK(HAL_BC_PROMPTSAVE, hal::config().savePrompt);
644    END_DDX_MAP()       
645
646    BOOL OnInitDialog(HWND hwndFocus, LPARAM lParam)
647        {
648                gTotalConnections_.Attach(GetDlgItem(HAL_BC_MAXCONN));
649                gUploadConnections_.Attach(GetDlgItem(HAL_BC_MAXUP));
650                gDownloadRate_.Attach(GetDlgItem(HAL_BC_DOWNRATE));
651                gUploadRate_.Attach(GetDlgItem(HAL_BC_UPRATE));
652       
653                tTotalConnections_.Attach(GetDlgItem(HAL_BC_TMAXCONN));
654                tUploadConnections_.Attach(GetDlgItem(HAL_BC_TMAXUP));
655                tDownloadRate_.Attach(GetDlgItem(HAL_BC_TDOWNRATE));
656                tUploadRate_.Attach(GetDlgItem(HAL_BC_TUPRATE));
657
658                gTotalConnections_ = hal::config().maxConnections;
659                gUploadConnections_ = hal::config().maxUploads;
660                gDownloadRate_ = hal::config().downRate;
661                gUploadRate_ = hal::config().upRate;
662       
663                tTotalConnections_ = hal::config().torrentMaxConnections;
664                tUploadConnections_ = hal::config().torrentMaxUploads;
665                tDownloadRate_ = hal::config().torrentDownRate;
666                tUploadRate_ = hal::config().torrentUpRate;
667       
668                BOOL retval =  DoDataExchange(false);
669                onMoveToCheck(0, 0, GetDlgItem(HAL_BC_MOVETO_CHECK));
670
671                autosizeClass::CtrlsArrange();
672                return retval;
673        }
674
675        void onFolderBrowse(UINT, int, HWND hWnd)
676        {               
677                wstring folderSelect = hal::app().res_wstr(HAL_FOLDER_SELECT);
678
679                WTL::CFolderDialog fldDlg (NULL, folderSelect.c_str(),
680                        BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE);
681
682                if (IDOK == fldDlg.DoModal())
683                        SetDlgItemText(HAL_BC_SAVEFOLDER, fldDlg.m_szFolderPath);
684        }
685
686        void onMoveToFolderBrowse(UINT, int, HWND hWnd)
687        {               
688                wstring folderSelect = hal::app().res_wstr(HAL_FOLDER_SELECT);
689
690                WTL::CFolderDialog fldDlg (NULL, folderSelect.c_str(),
691                        BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE);
692
693                if (IDOK == fldDlg.DoModal())
694                        SetDlgItemText(HAL_BC_MOVETO_FOLDER, fldDlg.m_szFolderPath);
695        }
696
697        void onMoveToCheck(UINT, int, HWND hWnd)
698        {
699                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
700
701                if (result == BST_CHECKED)
702                {
703                        ::EnableWindow(GetDlgItem(HAL_BC_MOVETO_FOLDER), true);
704                        ::EnableWindow(GetDlgItem(HAL_BC_MOVETO_BROWSE), true);
705                }
706                else
707                {
708                        ::EnableWindow(GetDlgItem(HAL_BC_MOVETO_FOLDER), false);
709                        ::EnableWindow(GetDlgItem(HAL_BC_MOVETO_BROWSE), false);
710                }               
711        }
712
713    int OnApply()
714        {
715                hal::event_log.post(shared_ptr<hal::EventDetail>(
716                        new hal::EventMsg(L"Applying torrent options.", hal::event_logger::info)));
717
718                hal::config().maxConnections = gTotalConnections_;
719                hal::config().maxUploads = gUploadConnections_;
720                hal::config().downRate = gDownloadRate_;
721                hal::config().upRate = gUploadRate_;
722
723                hal::config().torrentMaxConnections = tTotalConnections_;
724                hal::config().torrentMaxUploads = tUploadConnections_;
725                hal::config().torrentDownRate = tDownloadRate_;
726                hal::config().torrentUpRate = tUploadRate_;
727               
728                return DoDataExchange(true);
729        }
730       
731private:
732        CHaliteEditCtrl<int> gTotalConnections_;
733        CHaliteEditCtrl<int> gUploadConnections_;
734        CHaliteEditCtrl<float> gDownloadRate_;
735        CHaliteEditCtrl<float> gUploadRate_;
736       
737        CHaliteEditCtrl<int> tTotalConnections_;
738        CHaliteEditCtrl<int> tUploadConnections_;
739        CHaliteEditCtrl<float> tDownloadRate_;
740        CHaliteEditCtrl<float> tUploadRate_;
741};
742
743class RemoteOptions :
744    public WTL::CPropertyPageImpl<RemoteOptions>,
745    public WTL::CWinDataExchange<RemoteOptions>
746{
747public:
748    enum { IDD = HAL_CONFIGREMOTE };
749
750        RemoteOptions()
751        {}
752
753        ~RemoteOptions()
754        {}
755
756    BEGIN_MSG_MAP_EX(RemoteOptions)
757                MSG_WM_INITDIALOG(OnInitDialog)
758        CHAIN_MSG_MAP(CPropertyPageImpl<RemoteOptions>)
759    END_MSG_MAP()
760
761    BEGIN_DDX_MAP(RemoteOptions)
762//      DDX_CHECK(HAL_REMOTECTRL, INI().remoteConfig().isEnabled)
763//      DDX_INT(HAL_REMOTEPORT, INI().remoteConfig().port)
764    END_DDX_MAP()
765
766    BOOL OnInitDialog ( HWND hwndFocus, LPARAM lParam )
767        {
768                return DoDataExchange(false);
769        }
770
771    int OnApply()
772        {
773                hal::event_log.post(shared_ptr<hal::EventDetail>(
774                        new hal::EventMsg(L"Applying remote options.", hal::event_logger::info)));
775
776                return DoDataExchange(true);
777        }
778};
779
780class AboutOptions :
781    public WTL::CPropertyPageImpl<AboutOptions>,
782        public WTL::CDialogResize<AboutOptions>
783{
784        typedef AboutOptions thisClass;
785        typedef WTL::CDialogResize<thisClass> resizeClass;
786
787public:
788    enum { IDD = HAL_ABOUT };
789
790    BEGIN_MSG_MAP_EX(thisClass)
791                MSG_WM_INITDIALOG(OnInitDialog)
792                CHAIN_MSG_MAP(resizeClass)
793        CHAIN_MSG_MAP(CPropertyPageImpl<thisClass>)
794    END_MSG_MAP()
795
796    BEGIN_DLGRESIZE_MAP(thisClass)
797                DLGRESIZE_CONTROL(HAL_RICHEDITABOUT, DLSZ_SIZE_X|DLSZ_SIZE_Y)
798                DLGRESIZE_CONTROL(HAL_ABOUT_VERSION, DLSZ_MOVE_X|DLSZ_MOVE_Y)
799        END_DLGRESIZE_MAP()
800
801    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
802        {
803                richEdit_.Attach(GetDlgItem(HAL_RICHEDITABOUT));
804
805                std::pair<void*, size_t> res = hal::app().res_find_lock(HAL_ABOUT_TEXT, HALITE_RTF_RES_TYPE);
806
807                string rtf(static_cast<char*>(res.first), res.second);
808                wstring wrtf = hal::from_utf8_safe(rtf);
809
810                richEdit_.SendMessage(WM_SETTEXT, 0, (LPARAM)wrtf.c_str());
811                richEdit_.SetSelNone();
812//              richEdit_.SetEventMask(ENM_REQUESTRESIZE);
813
814        resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);
815
816                return true;
817        }
818
819private:
820
821        WTL::CRichEditCtrl richEdit_;
822        RECT richRect_;
823};
824
825class ConfigOptionsProp :
826        public WTL::CPropertySheet,
827        public WTL::CDialogResize<ConfigOptionsProp>
828{
829        typedef ConfigOptionsProp thisClass;
830        typedef WTL::CDialogResize<thisClass> resizeClass;
831
832public:
833    ConfigOptionsProp(HaliteWindow* haliteWindow, LPCTSTR title = (LPCTSTR)NULL,
834                UINT uStartPage = 0, HWND hWndParent = NULL) :
835        CPropertySheet(title, uStartPage, hWndParent),
836                m_bCentered(false),
837                generalOptions(haliteWindow)
838    {
839                AddPage(generalOptions);
840                AddPage(bitTorrentOptions);
841                AddPage(securityOptions);
842                AddPage(torrentsOptions);
843        //      AddPage(remoteControlOptions);
844                AddPage(aboutOptions);
845    }
846
847    BEGIN_MSG_MAP_EX(ConfigOptionsProp)
848        MESSAGE_HANDLER(WM_SHOWWINDOW, OnShowWindow)
849                MSG_WM_SIZE(OnSize)
850                CHAIN_MSG_MAP(resizeClass)
851        CHAIN_MSG_MAP(CPropertySheet)
852    END_MSG_MAP()
853
854    BEGIN_DLGRESIZE_MAP(thisClass)
855                DLGRESIZE_CONTROL(0x3020, DLSZ_SIZE_X|DLSZ_SIZE_Y)
856
857                DLGRESIZE_CONTROL(0x1, DLSZ_MOVE_X|DLSZ_MOVE_Y)
858                DLGRESIZE_CONTROL(0x2, DLSZ_MOVE_X|DLSZ_MOVE_Y)
859                DLGRESIZE_CONTROL(0x3021, DLSZ_MOVE_X|DLSZ_MOVE_Y)
860        END_DLGRESIZE_MAP()
861
862        void OnSize(UINT, WTL::CSize)
863        {
864        SetMsgHandled(false);
865
866        HWND propTabs = GetDlgItem(0x3020);
867
868                RECT rect;
869                ::GetWindowRect(propTabs, &rect);
870
871                ::MapWindowPoints(NULL, m_hWnd, (LPPOINT)&rect, 2);
872                ::SendMessage(propTabs, TCM_ADJUSTRECT, false, (LPARAM)&rect);
873
874                ::MoveWindow(GetActivePage(), rect.left, rect.top,
875            rect.right-rect.left, rect.bottom-rect.top, true);
876        }
877
878    LRESULT OnShowWindow(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
879    {
880        if (wParam == TRUE)
881        {
882            WTL::CMenuHandle pSysMenu = GetSystemMenu(FALSE);
883
884                if (pSysMenu != NULL)
885                pSysMenu.InsertMenu(-1, MF_BYPOSITION|MF_STRING, SC_SIZE, L"&Size");
886
887            ModifyStyle(0, WS_THICKFRAME, 0);
888            Center();
889
890            resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);
891        }
892               
893                bHandled = FALSE;
894               
895        return 0;
896    }
897
898    void Center(void)
899    {
900        if (!m_bCentered)
901        {
902            CenterWindow();
903            m_bCentered = true;
904        }
905    }
906
907private:
908    bool m_bCentered;
909
910        GeneralOptions generalOptions;
911        BitTorrentOptions bitTorrentOptions;
912        SecurityOptions securityOptions;
913        TorrentsOptions torrentsOptions;
914        RemoteOptions remoteControlOptions;
915        AboutOptions aboutOptions;
916};
917
918#endif // RC_INVOKED
Note: See TracBrowser for help on using the repository browser.