source: trunk/src/Halite.cpp @ 604

Revision 604, 6.7 KB checked in by Eoin, 11 years ago (diff)

Supporting the new libtorrent interface to fast resume data. Not yet working!

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#include "stdAfx.hpp"
8
9#define HALITE_GUID L"HALITE-{E3A8BF7D-962F-476E-886B-FECEDD2F0FC7}"
10#define WMU_ARE_YOU_ME_STRING  L"WMU_ARE_YOU_ME_HALITE-{E3A8BF7D-962F-476E-886B-FECEDD2F0FC7}"
11#pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
12
13#include "Halite.hpp"
14
15#include <winstl/registry/registry.hpp>
16#include <winstl/registry/reg_key.hpp>
17#include <winstl/registry/reg_value.hpp>
18
19#include <boost/filesystem/convenience.hpp>
20
21#include "WinAPIMutex.hpp"
22
23#include "global/ini.hpp"
24#include "global/logger.hpp"
25#include "halConfig.hpp"
26
27#include "HaliteWindow.hpp"
28#include "SplashDialog.hpp"
29
30Halite& halite()
31{
32        static Halite h;
33        return h;
34}
35
36Halite::Halite() :
37                hal::IniBase<Halite>("globals/halite", "Halite"),
38                oneInst(false),
39#ifdef TORRENT_LOGGING
40                logDebug_(true),
41#else
42                logDebug_(false),
43#endif
44                showMessage_(true),
45                logToFile_(true),
46                logListLen_(128),
47                dll_(L"")
48{
49        hal::event_log.init();
50        load_from_ini();
51}
52
53namespace fs = boost::filesystem;
54using fs::ifstream;
55using fs::ofstream;
56       
57static class halite_log_file : public boost::signals::trackable
58{
59public: 
60        void operator()(shared_ptr<hal::EventDetail> event)
61        {
62                if (halite().logToFile())
63                {
64                        if (!wofs.is_open()) wofs.open(hal::app().get_working_directory()/L"HaliteLog.txt");
65                       
66                        wofs << (hal::wform(L"%1% %2%, %3%\r\n") 
67                                % event->timeStamp() % hal::event_logger::eventLevelToStr(event->level()) 
68                                % event->msg()).str();
69                       
70                        wofs.flush();
71                }
72        }
73       
74        void connect() 
75        { 
76                hal::event_log.init();
77                conn_ = hal::event_log.attach(bind(&halite_log_file::operator(), this, _1)); 
78                assert(conn_.connected());
79        }
80       
81        void disconnect() { conn_.disconnect(); }
82       
83private:
84        fs::wofstream wofs;
85        boost::signals::connection conn_;
86       
87} halite_log_file_;
88
89static const unsigned WMU_ARE_YOU_ME = ::RegisterWindowMessage(WMU_ARE_YOU_ME_STRING);
90
91static BOOL CALLBACK hwndSearcher(HWND hWnd, LPARAM lParam)
92{
93        ULONG_PTR result;
94        LRESULT ok = ::SendMessageTimeout(hWnd, WMU_ARE_YOU_ME,
95                0, 0, SMTO_BLOCK | SMTO_ABORTIFHUNG, 200, &result);
96       
97        if (ok == 0)
98                return false;
99       
100        if (result == WMU_ARE_YOU_ME)
101        {
102                HWND* target = (HWND*)lParam;
103                *target = hWnd;
104                return false;
105        }
106       
107        return true;
108}
109
110void num_active(int) {}
111
112int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
113{
114        win32_exception::install_handler();
115
116        int return_result = -1;
117
118        try 
119        {
120       
121        boost::filesystem::path::default_name_check(boost::filesystem::native);
122
123        try
124        {
125                winstl::reg_key_w reg_path(HKEY_CURRENT_USER, L"SOFTWARE\\Halite");
126                winstl::reg_value_w reg_path_value = reg_path.get_value(L"path");
127
128                if (hal::app().get_local_appdata())
129                        hal::app().working_directory = hal::app().get_local_appdata().get()/L"Halite";
130        }
131        catch(...)
132        {
133                hal::event_log.post(shared_ptr<hal::EventDetail>(
134                        new hal::EventMsg(L"No registry entry found, using portable mode", hal::event_logger::info)));         
135        }
136       
137        if (!boost::filesystem::is_directory(hal::app().working_directory))
138                boost::filesystem::create_directories(hal::app().working_directory);
139
140        WTL::AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES|ICC_LISTVIEW_CLASSES);   
141        HINSTANCE hInstRich = ::LoadLibrary(WTL::CRichEditCtrl::GetLibraryName());
142        ATLASSERT(hInstRich != NULL);
143   
144        HRESULT hRes = _Module.Init(NULL, hInstance);
145        assert (SUCCEEDED(hRes));       
146       
147        hal::ini().load_data();
148        halite_log_file_.connect();
149       
150        { WinAPIMutex oneInstance(HALITE_GUID);
151       
152        if (!oneInstance.owner() && halite().oneInst)
153        {
154                WinAPIMutexLock lock(oneInstance, 5000L);
155               
156                HWND hOther = NULL;
157                ::EnumWindows(static_cast<WNDENUMPROC>(hwndSearcher), (LPARAM)&hOther);
158               
159                if (hOther != NULL)
160                {
161                        ::SetForegroundWindow(hOther);
162                       
163                        if (::IsIconic(hOther))
164                                ::ShowWindow(hOther, SW_RESTORE);
165                       
166                        if (!hal::app().command_args().empty())
167                        {
168                                COPYDATASTRUCT cmdLine; 
169                                cmdLine.dwData = HALITE_SENDING_CMD; 
170                                cmdLine.cbData = 
171                                        hal::app().command_args().front().length()*sizeof(wchar_t); 
172                                cmdLine.lpData = const_cast<wchar_t*>(
173                                        hal::app().command_args().front().c_str());
174                               
175                                ::SendMessage(hOther, WM_COPYDATA, 0, (LPARAM)(LPVOID)&cmdLine);
176                        }
177                }                               
178        }
179        else
180        {
181                hal::event_log.post(shared_ptr<hal::EventDetail>(
182                        new hal::EventMsg(hal::wform(L"App Data Path: %1%.") % hal::app().local_appdata)));             
183
184                hal::event_log.post(shared_ptr<hal::EventDetail>(
185                        new hal::EventMsg(hal::wform(L"Exe Path: %1%.") % hal::app().exe_path())));             
186               
187                hal::event_log.post(shared_ptr<hal::EventDetail>(
188                        new hal::EventMsg(hal::wform(L"Initial Path: %1%.") % hal::app().initial_path())));             
189               
190                hal::event_log.post(shared_ptr<hal::EventDetail>(
191                        new hal::EventMsg((hal::wform(L"Working Directory: %1%.") % hal::app().working_directory), hal::event_logger::info)));         
192               
193                WTL::CMessageLoop theLoop;
194                _Module.AddMessageLoop(&theLoop);
195                       
196                        if (halite().dll() != L"") hal::app().res_set_dll(halite().dll());
197                       
198                        HaliteWindow wndMain(WMU_ARE_YOU_ME);
199                        if (wndMain.CreateEx() == NULL)
200                                return 1;
201                       
202                        oneInstance.release();
203                       
204                        if (!hal::app().command_args().empty())
205                                wndMain.ProcessFile(hal::app().command_args().front().c_str());
206                       
207                        wndMain.SetIcon(LoadIcon(hInstance, MAKEINTRESOURCE(HAL_APP_ICON)), false);     
208                        wndMain.ShowWindow(nCmdShow);
209                       
210                        return_result = theLoop.Run();                         
211               
212                _Module.RemoveMessageLoop();
213
214                halite().save_to_ini();
215                hal::ini().save_data();         
216        }
217        }
218
219        ::FreeLibrary(hInstRich);       
220        _Module.Term();
221       
222        }
223        catch (const access_violation& e)
224        {
225                wstring msg = (hal::wform(L"WinMain() access_violation (code %1$x) at %2$x. Bad address %3$x") 
226                        % e.code() % (unsigned)e.where() % (unsigned)e.badAddress()).str();
227
228                MessageBox(0, msg.c_str(), L"Exception Thrown!", 0);
229        } 
230        catch (const win32_exception& e)
231        {
232                wstring msg = (hal::wform(L"WinMain() win32_exception (code %1$x) at %2$x") 
233                        % e.code() % (unsigned)e.where()).str();
234
235                MessageBox(0, msg.c_str(), L"Exception Thrown!", 0);
236        }
237        catch (std::exception& e)
238        {
239                wstring msg = (hal::wform(L"WinMain() std::exception, %1%") % hal::from_utf8(e.what())).str();
240
241                MessageBox(0, msg.c_str(), L"Exception Thrown!", 0);
242        }
243        catch (...)
244        {
245                MessageBox(0, L"WinMain() catch all", L"Exception Thrown!", 0);
246        }
247       
248        return return_result;
249}
Note: See TracBrowser for help on using the repository browser.