source: trunk/src/SplashDialog.hpp @ 564

Revision 564, 4.6 KB checked in by Eoin, 12 years ago (diff)

Added win32_exception class.

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                catch (const access_violation& e) 
134                {
135                        hal::event_log.post(shared_ptr<hal::EventDetail>(
136                                new hal::EventGeneral(hal::event_logger::warning, hal::event_logger::unclassified, 
137                                (hal::wform(L"Alert handler access_violation (code %1$x) at %2$x. IsWrite %3%, badd address %4$x") % e.code() % (unsigned)e.where() % e.isWrite() % (unsigned)e.badAddress()).str())));
138                }
139                catch (const win32_exception& e) 
140                {
141                        hal::event_log.post(shared_ptr<hal::EventDetail>(
142                                new hal::EventGeneral(hal::event_logger::warning, hal::event_logger::unclassified, 
143                                (hal::wform(L"Alert handler win32_exception (code %1$x) at %2$x") % e.code() % (unsigned)e.where()).str())));
144                }
145                catch(std::exception& e)
146                {
147                        hal::event_log.post(shared_ptr<hal::EventDetail>(\
148                                new hal::EventStdException(hal::event_logger::debug, e, L"SplashThread()")));
149                }
150                catch(...)
151                {
152                        HAL_DEV_MSG(L"SplashThread() catch all");
153                }
154
155                EndDialog(0);
156        }
157       
158        BOOL PreTranslateMessage(MSG* pMsg)
159        {
160                return this->IsDialogMessage(pMsg);
161        }
162       
163private:
164        boost::scoped_ptr<thread> thread_ptr;
165
166        WTL::CRect rect_;
167};
168
169#endif // RC_INVOKED
Note: See TracBrowser for help on using the repository browser.