source: branch_0_3_1/src/SplashDialog.hpp @ 477

Revision 477, 3.4 KB checked in by Eoin, 12 years ago (diff)

May have cracked the shutdown crash... what's the fingers-crossed smilie?

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 IDC_NEWTORRENT_CREATOR_TEXT           HAL_SPLASHDIALOG_BEGIN+3
17//#define IDC_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 "halTorrent.hpp"
28
29class SplashDialog :
30        public CDialogImpl<SplashDialog>,
31        public hal::IniBase<SplashDialog>,
32        public CWinDataExchange<SplashDialog>,
33        public CDialogResize<SplashDialog>
34{
35protected:
36        typedef SplashDialog thisClass;
37        typedef CDialogImpl<thisClass> baseClass;
38        typedef hal::IniBase<thisClass> iniClass;
39        typedef CDialogResize<thisClass> resizeClass;
40
41public:
42        enum { IDD = IDD_CLOSESPLASH };
43
44        SplashDialog() :       
45                iniClass("SplashDialog", "dialog"),     
46                rect_(0,0,0,0)
47        {
48                Load();
49        }
50
51    BEGIN_MSG_MAP_EX(CMainDlg)
52        MSG_WM_INITDIALOG(onInitDialog)
53                COMMAND_ID_HANDLER_EX(HAL_SPLASH_FORCE_CLOSE, OnForceClose)
54
55                CHAIN_MSG_MAP(resizeClass)
56    END_MSG_MAP()
57       
58        BEGIN_DDX_MAP(CMainDlg)
59        DDX_CHECK(IDC_SPLASH_MSG, halite().showMessage_)
60    END_DDX_MAP()
61
62    BEGIN_DLGRESIZE_MAP(thisClass)
63                DLGRESIZE_CONTROL(HAL_CSPLASH_MSG, DLSZ_SIZE_X|DLSZ_SIZE_Y)
64                DLGRESIZE_CONTROL(HAL_CSPLASH_NUM_ACT, DLSZ_MOVE_Y|DLSZ_SIZE_X)
65                DLGRESIZE_CONTROL(IDC_SPLASH_MSG, DLSZ_MOVE_Y|DLSZ_SIZE_X)
66                DLGRESIZE_CONTROL(HAL_SPLASH_FORCE_CLOSE, DLSZ_MOVE_Y|DLSZ_MOVE_X)
67        END_DLGRESIZE_MAP()
68
69        friend class boost::serialization::access;
70    template<class Archive>
71    void serialize(Archive& ar, const unsigned int version)
72        {
73                ar & BOOST_SERIALIZATION_NVP(rect_);
74        }
75       
76        LRESULT onInitDialog(HWND, LPARAM)
77        {
78                resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);
79
80                if (rect_.left != rect_.right)
81                        MoveWindow(rect_.left, rect_.top, 
82                                rect_.right-rect_.left, rect_.bottom-rect_.top, true); 
83
84                CenterWindow();
85
86                DoDataExchange(false);
87               
88                thread_ptr.reset(new thread(bind(&SplashDialog::SplashThread, this)));
89               
90                return 0;
91        }
92
93        void OnForceClose(UINT, int, HWND hWnd)
94        {
95                thread_ptr.reset();
96                Sleep(200);
97
98                GetWindowRect(rect_);
99                Save();
100                EndDialog(0);
101        }
102
103        void ReportNumActive(int num)
104        {
105                SetDlgItemText(HAL_CSPLASH_NUM_ACT, (wformat(hal::app().res_wstr(HAL_CSPLASH_ACT_MSG)) % num).str().c_str());
106        }
107
108        void SplashThread()
109        {
110                hal::bittorrent().closeAll(boost::optional<boost::function<void (int)> >(bind(&SplashDialog::ReportNumActive, this, _1)));
111               
112                SetDlgItemText(HAL_CSPLASH_NUM_ACT, hal::app().res_wstr(HAL_CSPLASH_SHUTDOWN_MSG).c_str());
113
114                hal::bittorrent().stopEventReceiver();
115                Sleep(3000);
116
117                hal::bittorrent().shutDownSession();
118               
119                DoDataExchange(true);
120
121                GetWindowRect(rect_);
122                Save();
123                EndDialog(0);
124        }
125       
126        BOOL PreTranslateMessage(MSG* pMsg)
127        {
128                return this->IsDialogMessage(pMsg);
129        }
130       
131private:
132        boost::scoped_ptr<thread> thread_ptr;
133
134        CRect rect_;
135};
136
137#endif // RC_INVOKED
Note: See TracBrowser for help on using the repository browser.