source: trunk/src/Halite.cpp @ 495

Revision 495, 4.9 KB checked in by Eoin, 11 years ago (diff)

Changes seem ok.

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