source: trunk/src/SplashDialog.hpp @ 565

Revision 565, 3.8 KB checked in by Eoin, 12 years ago (diff)

Win32 exception catchers backported to branch.

Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2007.
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 HAL_SPLASHDIALOG_BEGIN                  20200
10#define HAL_CSPLASH_MSG                                 HAL_SPLASHDIALOG_BEGIN+1
11#define HAL_CSPLASH_NUM_ACT                             HAL_SPLASHDIALOG_BEGIN+2
12#define HAL_CSPLASH_ACT_MSG                             HAL_SPLASHDIALOG_BEGIN+3
13#define HAL_CSPLASH_SHUTDOWN_MSG                HAL_SPLASHDIALOG_BEGIN+4
14#define HAL_SPLASH_FORCE_CLOSE                  HAL_SPLASHDIALOG_BEGIN+5
15
16//#define HAL_NEWTORRENT_CREATOR_TEXT           HAL_SPLASHDIALOG_BEGIN+3
17//#define HAL_NEWTORRENT_CREATOR                        HAL_SPLASHDIALOG_BEGIN+4
18
19#ifndef RC_INVOKED
20
21#ifndef HALITE_MINI
22#       include "Halite.hpp"
23#else
24#       include "Halite.hpp"
25#endif
26
27#include "win32_exception.hpp"
28#include "halTorrent.hpp"
29
30class SplashDialog :
31        public ATL::CDialogImpl<SplashDialog>,
32        public hal::IniBase<SplashDialog>,
33        public WTL::CWinDataExchange<SplashDialog>,
34        public WTL::CDialogResize<SplashDialog>
35{
36protected:
37        typedef SplashDialog thisClass;
38        typedef ATL::CDialogImpl<thisClass> baseClass;
39        typedef hal::IniBase<thisClass> iniClass;
40        typedef WTL::CDialogResize<thisClass> resizeClass;
41
42public:
43        enum { IDD = HAL_CLOSESPLASH };
44
45        SplashDialog() :       
46                iniClass("SplashDialog", "dialog"),     
47                rect_(0,0,0,0)
48        {
49                load_from_ini();
50        }
51
52    BEGIN_MSG_MAP_EX(CMainDlg)
53        MSG_WM_INITDIALOG(onInitDialog)
54                COMMAND_ID_HANDLER_EX(HAL_SPLASH_FORCE_CLOSE, OnForceClose)
55
56                CHAIN_MSG_MAP(resizeClass)
57    END_MSG_MAP()
58       
59        BEGIN_DDX_MAP(CMainDlg)
60        DDX_CHECK(HAL_SPLASH_MSG, halite().showMessage_)
61    END_DDX_MAP()
62
63    BEGIN_DLGRESIZE_MAP(thisClass)
64                DLGRESIZE_CONTROL(HAL_CSPLASH_MSG, DLSZ_SIZE_X|DLSZ_SIZE_Y)
65                DLGRESIZE_CONTROL(HAL_CSPLASH_NUM_ACT, DLSZ_MOVE_Y|DLSZ_SIZE_X)
66                DLGRESIZE_CONTROL(HAL_SPLASH_MSG, DLSZ_MOVE_Y|DLSZ_SIZE_X)
67                DLGRESIZE_CONTROL(HAL_SPLASH_FORCE_CLOSE, DLSZ_MOVE_Y|DLSZ_MOVE_X)
68        END_DLGRESIZE_MAP()
69
70        friend class boost::serialization::access;
71    template<class Archive>
72    void serialize(Archive& ar, const unsigned int version)
73        {
74                ar & BOOST_SERIALIZATION_NVP(rect_);
75        }
76       
77        LRESULT onInitDialog(HWND, LPARAM)
78        {
79                resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);
80
81                if (rect_.left != rect_.right)
82                        MoveWindow(rect_.left, rect_.top, 
83                                rect_.right-rect_.left, rect_.bottom-rect_.top, true); 
84
85                CenterWindow();
86
87                DoDataExchange(false);
88               
89                thread_ptr.reset(new thread(bind(&SplashDialog::SplashThread, this)));
90               
91                return 0;
92        }
93
94        void OnForceClose(UINT, int, HWND hWnd)
95        {
96                thread_ptr.reset();
97                Sleep(200);
98
99                GetWindowRect(rect_);
100                save_to_ini();
101                EndDialog(0);
102        }
103
104        void ReportNumActive(int num)
105        {
106                SetDlgItemText(HAL_CSPLASH_NUM_ACT, (hal::wform(hal::app().res_wstr(HAL_CSPLASH_ACT_MSG)) % num).str().c_str());
107        }
108
109        void SplashThread()
110        {
111                win32_exception::install_handler();
112
113                try
114                {
115
116                HAL_DEV_MSG(L"SplashThread() calling hal::bittorrent().close_all()");
117
118                hal::bittorrent().close_all(boost::optional<boost::function<void (int)> >(bind(&SplashDialog::ReportNumActive, this, _1)));
119               
120                SetDlgItemText(HAL_CSPLASH_NUM_ACT, hal::app().res_wstr(HAL_CSPLASH_SHUTDOWN_MSG).c_str());
121
122                HAL_DEV_MSG(L"SplashThread() calling hal::bittorrent().stopEventReceiver()");
123                hal::bittorrent().stopEventReceiver();
124                HAL_DEV_MSG(L"SplashThread() calling hal::bittorrent().shutDownSession()");
125                hal::bittorrent().shutDownSession();
126               
127                DoDataExchange(true);
128
129                GetWindowRect(rect_);
130                save_to_ini();
131
132                }
133                HAL_GENERIC_FN_EXCEPTION_CATCH(L"SplashThread()")
134
135                EndDialog(0);
136        }
137       
138        BOOL PreTranslateMessage(MSG* pMsg)
139        {
140                return this->IsDialogMessage(pMsg);
141        }
142       
143private:
144        boost::scoped_ptr<thread> thread_ptr;
145
146        WTL::CRect rect_;
147};
148
149#endif // RC_INVOKED
Note: See TracBrowser for help on using the repository browser.