source: src/Halite.cpp @ 260

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