source: trunk/src/Halite.cpp @ 374

Revision 374, 5.0 KB checked in by Eoin, 12 years ago (diff)
RevLine 
[268]1
[370]2//         Copyright Eóin O'Callaghan 2006 - 2008.
[268]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)
[285]6
[319]7#define HALITE_GUID L"HALITE-{E3A8BF7D-962F-476E-886B-FECEDD2F0FC7}"
8#define WMU_ARE_YOU_ME_STRING  L"WMU_ARE_YOU_ME_HALITE-{E3A8BF7D-962F-476E-886B-FECEDD2F0FC7}"
[285]9#pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
10
[70]11#include "stdAfx.hpp"
[312]12
[107]13#include "WinAPIMutex.hpp"
[97]14
[128]15#include "global/ini.hpp"
[145]16#include "global/logger.hpp"
[132]17#include "halConfig.hpp"
18
[59]19#include "HaliteWindow.hpp"
[87]20#include "SplashDialog.hpp"
[59]21
[126]22#include "Halite.hpp"
23
[132]24Halite& halite()
25{
26        static Halite h;
27        return h;
28}
29
[296]30namespace fs = boost::filesystem;
31using fs::ifstream;
32using fs::ofstream;
33       
[127]34static class halite_log_file : public boost::signals::trackable
[125]35{
[255]36public: 
[128]37        void operator()(shared_ptr<hal::EventDetail> event)
[125]38        {
[141]39                if (halite().logToFile())
40                {
[296]41                        if (!wofs.is_open()) wofs.open(hal::app().working_directory()/L"HaliteLog.txt");
[141]42                       
43                        wofs << (wformat(L"%1% %2%, %3%\r\n") 
44                                % event->timeStamp() % hal::Event::eventLevelToStr(event->level()) 
[296]45                                % event->msg()).str();
[152]46                       
47                        wofs.flush();
[141]48                }
[125]49        }
50       
[255]51        void connect() 
52        { 
53                conn_ = hal::event().attach(bind(&halite_log_file::operator(), this, _1)); 
54                assert(conn_.connected());
55        }
56       
[127]57        void disconnect() { conn_.disconnect(); }
58       
[125]59private:
[296]60        fs::wofstream wofs;
[255]61        boost::signals::connection conn_;
[125]62       
63} halite_log_file_;
64
[107]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
[59]86int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
87{
[142]88
[374]89        HAL_DEV_MSG(L"Hello")
90
[142]91//      hal::event().post(shared_ptr<hal::EventDetail>(new hal::EventDebug(hal::Event::info, L"Hello")));
92       
93        try 
94        {
95       
[119]96        boost::filesystem::path::default_name_check(boost::filesystem::native);
[107]97
[260]98        AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES);     
99        HINSTANCE hInstRich = ::LoadLibrary(CRichEditCtrl::GetLibraryName());
100        ATLASSERT(hInstRich != NULL);
[107]101   
102        int nRet;       
103        HRESULT hRes = _Module.Init(NULL, hInstance);
104        assert (SUCCEEDED(hRes));       
[84]105       
[132]106        hal::ini().load_data();
[294]107        halite_log_file_.connect();
[132]108       
[108]109        { WinAPIMutex oneInstance(HALITE_GUID);
110       
[132]111        if (!oneInstance.owner() && halite().oneInst)
[59]112        {
[107]113                WinAPIMutexLock lock(oneInstance, 5000L);
[87]114               
[107]115                HWND hOther = NULL;
116                ::EnumWindows(static_cast<WNDENUMPROC>(hwndSearcher), (LPARAM)&hOther);
117               
118                if (hOther != NULL)
119                {
120                        ::SetForegroundWindow(hOther);
121                       
122                        if (::IsIconic(hOther))
123                                ::ShowWindow(hOther, SW_RESTORE);
124                       
[127]125                        if (!hal::app().command_args().empty())
[107]126                        {
127                                COPYDATASTRUCT cmdLine; 
128                                cmdLine.dwData = HALITE_SENDING_CMD; 
129                                cmdLine.cbData = 
[127]130                                        hal::app().command_args().front().length()*sizeof(wchar_t); 
[107]131                                cmdLine.lpData = const_cast<wchar_t*>(
[127]132                                        hal::app().command_args().front().c_str());
[59]133                               
[107]134                                ::SendMessage(hOther, WM_COPYDATA, 0, (LPARAM)(LPVOID)&cmdLine);
135                        }
136                }                               
137        }
138        else
139        {
[301]140//              INI().LoadData();       
141                hal::event().post(shared_ptr<hal::EventDetail>(
142                        new hal::EventMsg(wformat(L"Exe Path: %1%.") % hal::app().exe_path())));               
[113]143               
[301]144                hal::event().post(shared_ptr<hal::EventDetail>(
145                        new hal::EventMsg(wformat(L"Initial Path: %1%.") % hal::app().initial_path())));               
146               
147                hal::event().post(shared_ptr<hal::EventDetail>(
148                        new hal::EventMsg((wformat(L"Working Directory: %1%.") % hal::app().working_directory()), hal::Event::info)));         
149               
[107]150                CMessageLoop theLoop;
151                _Module.AddMessageLoop(&theLoop);
[324]152                       
[348]153                        if (halite().dll() != L"") hal::app().res_set_dll(halite().dll());
[296]154                       
[107]155                        HaliteWindow wndMain(WMU_ARE_YOU_ME);
156                        if (wndMain.CreateEx() == NULL)
157                                return 1;
158                       
159                        oneInstance.release();
160                       
[127]161                        if (!hal::app().command_args().empty())
162                                wndMain.ProcessFile(hal::app().command_args().front().c_str());
[107]163                       
[133]164                        wndMain.SetIcon(LoadIcon(hInstance, MAKEINTRESOURCE(IDR_APP_ICON)), false);     
[107]165                        wndMain.ShowWindow(nCmdShow);
166                       
167                        nRet = theLoop.Run();                           
[324]168               
[107]169                _Module.RemoveMessageLoop();
[87]170               
[128]171                hal::bittorrent().stopEventReceiver();
[127]172               
[132]173                if (halite().showMessage)
[87]174                {
175                        SplashDialog splDlg;
176                        splDlg.DoModal();
177                }
178                else
179                {
[128]180                        hal::bittorrent().closeAll();
181                        hal::bittorrent().shutDownSession();           
[127]182                }
[132]183               
[133]184//              INI().SaveData();
[132]185               
186                halite().save();
[128]187                hal::ini().save_data();
[107]188        }
189        }
[260]190
191        ::FreeLibrary(hInstRich);       
[107]192        _Module.Term();
193       
[59]194        return nRet;
[142]195       
196        }
197        catch (const std::exception& e)
198        {
199        MessageBoxA(0, e.what(), "Exception Thrown!", 0);
200       
201        return -1;
202        }
203       
[97]204}
Note: See TracBrowser for help on using the repository browser.