source: trunk/src/Halite.cpp @ 557

Revision 557, 5.7 KB checked in by Eoin, 12 years ago (diff)

Adding check in registry for install directory.

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 "WinAPIMutex.hpp"
20
21#include "global/ini.hpp"
22#include "global/logger.hpp"
23#include "halConfig.hpp"
24
25#include "HaliteWindow.hpp"
26#include "SplashDialog.hpp"
27
28Halite& halite()
29{
30        static Halite h;
31        return h;
32}
33
34Halite::Halite() :
35                hal::IniBase<Halite>("globals/halite", "Halite"),
36                oneInst(false),
37#ifdef TORRENT_LOGGING
38                logDebug_(true),
39#else
40                logDebug_(false),
41#endif
42                showMessage_(true),
43                logToFile_(true),
44                logListLen_(128),
45                dll_(L"")
46{
47        hal::event_log.init();
48        load_from_ini();
49}
50
51namespace fs = boost::filesystem;
52using fs::ifstream;
53using fs::ofstream;
54       
55static class halite_log_file : public boost::signals::trackable
56{
57public: 
58        void operator()(shared_ptr<hal::EventDetail> event)
59        {
60                if (halite().logToFile())
61                {
62                        if (!wofs.is_open()) wofs.open(hal::app().working_directory()/L"HaliteLog.txt");
63                       
64                        wofs << (hal::wform(L"%1% %2%, %3%\r\n") 
65                                % event->timeStamp() % hal::event_logger::eventLevelToStr(event->level()) 
66                                % event->msg()).str();
67                       
68                        wofs.flush();
69                }
70        }
71       
72        void connect() 
73        { 
74                hal::event_log.init();
75                conn_ = hal::event_log.attach(bind(&halite_log_file::operator(), this, _1)); 
76                assert(conn_.connected());
77        }
78       
79        void disconnect() { conn_.disconnect(); }
80       
81private:
82        fs::wofstream wofs;
83        boost::signals::connection conn_;
84       
85} halite_log_file_;
86
87static const unsigned WMU_ARE_YOU_ME = ::RegisterWindowMessage(WMU_ARE_YOU_ME_STRING);
88
89static BOOL CALLBACK hwndSearcher(HWND hWnd, LPARAM lParam)
90{
91        ULONG_PTR result;
92        LRESULT ok = ::SendMessageTimeout(hWnd, WMU_ARE_YOU_ME,
93                0, 0, SMTO_BLOCK | SMTO_ABORTIFHUNG, 200, &result);
94       
95        if (ok == 0)
96                return false;
97       
98        if (result == WMU_ARE_YOU_ME)
99        {
100                HWND* target = (HWND*)lParam;
101                *target = hWnd;
102                return false;
103        }
104       
105        return true;
106}
107
108void num_active(int) {}
109
110int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
111{
112
113//      hal::event_log.post(shared_ptr<hal::EventDetail>(new hal::EventDebug(hal::event_logger::info, L"Hello")));
114
115//      ::SetProcessAffinityMask(::GetCurrentProcess(), (DWORD_PTR)0x1);
116
117        try 
118        {
119       
120        boost::filesystem::path::default_name_check(boost::filesystem::native);
121
122        winstl::reg_key_w reg_path(HKEY_CURRENT_USER, L"SOFTWARE\\Halite");
123        winstl::reg_value_w reg_path_value = reg_path.get_value(L"path");
124
125       
126                hal::event_log.post(shared_ptr<hal::EventDetail>(
127                        new hal::EventMsg(hal::wform(L"Exe Path: %1%.") % hal::app().exe_path())));             
128
129        WTL::AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES); 
130        HINSTANCE hInstRich = ::LoadLibrary(WTL::CRichEditCtrl::GetLibraryName());
131        ATLASSERT(hInstRich != NULL);
132   
133        int nRet = 0;   
134        HRESULT hRes = _Module.Init(NULL, hInstance);
135        assert (SUCCEEDED(hRes));       
136       
137        hal::ini().load_data();
138        halite_log_file_.connect();
139       
140        { WinAPIMutex oneInstance(HALITE_GUID);
141       
142        if (!oneInstance.owner() && halite().oneInst)
143        {
144                WinAPIMutexLock lock(oneInstance, 5000L);
145               
146                HWND hOther = NULL;
147                ::EnumWindows(static_cast<WNDENUMPROC>(hwndSearcher), (LPARAM)&hOther);
148               
149                if (hOther != NULL)
150                {
151                        ::SetForegroundWindow(hOther);
152                       
153                        if (::IsIconic(hOther))
154                                ::ShowWindow(hOther, SW_RESTORE);
155                       
156                        if (!hal::app().command_args().empty())
157                        {
158                                COPYDATASTRUCT cmdLine; 
159                                cmdLine.dwData = HALITE_SENDING_CMD; 
160                                cmdLine.cbData = 
161                                        hal::app().command_args().front().length()*sizeof(wchar_t); 
162                                cmdLine.lpData = const_cast<wchar_t*>(
163                                        hal::app().command_args().front().c_str());
164                               
165                                ::SendMessage(hOther, WM_COPYDATA, 0, (LPARAM)(LPVOID)&cmdLine);
166                        }
167                }                               
168        }
169        else
170        {
171                hal::event_log.post(shared_ptr<hal::EventDetail>(
172                        new hal::EventMsg(hal::wform(L"Exe Path: %1%.") % hal::app().exe_path())));             
173
174                HAL_DEV_MSG(L"Hello");
175               
176                hal::event_log.post(shared_ptr<hal::EventDetail>(
177                        new hal::EventMsg(hal::wform(L"Initial Path: %1%.") % hal::app().initial_path())));             
178
179                hal::event_log.post(shared_ptr<hal::EventDetail>(
180                        new hal::EventMsg(L"Hi again", hal::event_logger::dev)));               
181               
182                hal::event_log.post(shared_ptr<hal::EventDetail>(
183                        new hal::EventMsg((hal::wform(L"Working Directory: %1%.") % hal::app().working_directory()), hal::event_logger::info)));               
184               
185                WTL::CMessageLoop theLoop;
186                _Module.AddMessageLoop(&theLoop);
187                       
188                        if (halite().dll() != L"") hal::app().res_set_dll(halite().dll());
189                       
190                        HaliteWindow wndMain(WMU_ARE_YOU_ME);
191                        if (wndMain.CreateEx() == NULL)
192                                return 1;
193                       
194                        oneInstance.release();
195                       
196                        if (!hal::app().command_args().empty())
197                                wndMain.ProcessFile(hal::app().command_args().front().c_str());
198                       
199                        wndMain.SetIcon(LoadIcon(hInstance, MAKEINTRESOURCE(HAL_APP_ICON)), false);     
200                        wndMain.ShowWindow(nCmdShow);
201                       
202                        nRet = theLoop.Run();                           
203               
204                _Module.RemoveMessageLoop();
205
206                halite().save_to_ini();
207                hal::ini().save_data();         
208        }
209        }
210
211        ::FreeLibrary(hInstRich);       
212        _Module.Term();
213       
214        return nRet;
215       
216        }
217        catch (const std::exception& e)
218        {
219        MessageBoxA(0, e.what(), "Exception Thrown!", 0);
220       
221        return -1;
222        }       
223}
Note: See TracBrowser for help on using the repository browser.