source: trunk/src/global/wtl_app.cpp @ 558

Revision 558, 4.8 KB checked in by Eoin, 12 years ago (diff)

Settings stored in Application Folder if reg entry present.

Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2007.
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#include <boost/array.hpp>
10#include <boost/optional.hpp>
11
12#define WINVER 0x0500
13#define _WIN32_WINNT 0x0500
14#define _WIN32_IE 0x0500
15#define _RICHEDIT_VER 0x0200
16#define VC_EXTRALEAN
17
18#ifdef WIN32_LEAN_AND_MEAN
19#undef WIN32_LEAN_AND_MEAN
20#endif
21
22#include <atlbase.h>
23#include <atlapp.h>
24
25extern WTL::CAppModule _Module;
26
27#include "wtl_app.hpp"
28#include "string_conv.hpp"
29
30#include <boost/filesystem/operations.hpp>
31#include <boost/filesystem/fstream.hpp>
32
33#define BOOST_UTF8_BEGIN_NAMESPACE \
34    namespace boost { namespace filesystem { namespace detail {
35
36#define BOOST_UTF8_END_NAMESPACE }}}
37#define BOOST_UTF8_DECL BOOST_FILESYSTEM_DECL
38
39#include <boost/detail/utf8_codecvt_facet.hpp>
40
41#include <winstl/error/error_desc.hpp>
42#include <winstl/filesystem/current_directory.hpp>
43#include <winstl/shell/browse_for_folder.hpp>
44#include <winstl/shell/file_operations.hpp>
45#include <stlsoft/smartptr/scoped_handle.hpp>
46#include <winstl/shell/memory/functions.h>
47
48namespace hal
49{
50
51class app_impl
52{
53public:
54        app_impl() :
55                hmod_(NULL),
56                instance_(_Module.GetModuleInstance()),
57                initial_path_(boost::filesystem::initial_path<boost::filesystem::wpath>())
58        {
59                LPWSTR *szArglist; int nArgs;           
60                szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
61               
62                std::locale global_loc = std::locale();
63                std::locale loc(global_loc, new boost::filesystem::detail::utf8_codecvt_facet);
64                boost::filesystem::wpath_traits::imbue(loc);
65               
66                if (NULL == szArglist)
67                {
68                }
69                else
70                {
71                        exe_string_  = szArglist[0];
72                        exe_path_ = boost::filesystem::wpath(exe_string_);
73                       
74                        for (int i=1; i<nArgs; ++i) 
75                                command_args_.push_back(szArglist[i]);
76                               
77                        working_directory_ = exe_path_.parent_path();
78                }               
79                LocalFree(szArglist);   
80
81        }
82
83        friend class app_module;
84
85private:
86        HMODULE hmod_;
87        HINSTANCE instance_;
88        std::wstring exe_string_;
89        std::wstring res_dll_;
90       
91        boost::filesystem::wpath exe_path_;
92        boost::filesystem::wpath initial_path_;
93        boost::filesystem::wpath working_directory_;
94        boost::optional<boost::filesystem::wpath> local_appdata_;
95       
96        std::vector<std::wstring> command_args_;       
97};
98
99app_module::app_module() :
100        pimpl(new app_impl())
101{}
102
103const std::wstring& app_module::exe_string() const 
104{ 
105        return pimpl->exe_string_; 
106}
107
108const boost::filesystem::wpath& app_module::exe_path() const 
109{ 
110        return pimpl->exe_path_; 
111}
112
113const boost::filesystem::wpath& app_module::initial_path() const 
114{ 
115        return pimpl->initial_path_; 
116}
117
118const boost::filesystem::wpath& app_module::get_working_directory() const 
119{ 
120        return pimpl->working_directory_; 
121}
122
123void app_module::set_working_directory(const boost::filesystem::wpath& p) 
124{ 
125        pimpl->working_directory_ = p; 
126}
127
128const boost::optional<boost::filesystem::wpath>& app_module::get_local_appdata() const 
129{ 
130        if (!pimpl->local_appdata_)
131        {
132                wchar_t displayName[_MAX_PATH + 1];
133                LPITEMIDLIST iil;
134                HRESULT hr = ::SHGetSpecialFolderLocation(NULL, CSIDL_LOCAL_APPDATA, &iil);
135         
136                if(FAILED(hr))
137                {
138                }
139                else
140                {
141                        stlsoft::scoped_handle<void*> iil_(iil, winstl::SHMemFree);
142
143                        ::SHGetPathFromIDList(iil, displayName);
144                        pimpl->local_appdata_ = std::wstring(displayName);
145                }
146        }
147
148        return pimpl->local_appdata_; 
149}
150       
151const std::vector<std::wstring>& app_module::command_args() const 
152{ 
153        return pimpl->command_args_; 
154}
155       
156void app_module::res_revert()
157{
158        if (pimpl->hmod_) FreeLibrary(pimpl->hmod_);
159        _Module.SetResourceInstance(pimpl->instance_);
160}
161
162void app_module::res_set_dll(std::wstring dll)
163{
164        if (pimpl->hmod_) FreeLibrary(pimpl->hmod_);
165        pimpl->res_dll_ = dll;
166       
167        HMODULE hmod_ = ::LoadLibraryEx(dll.c_str(), 0, LOAD_LIBRARY_AS_DATAFILE);
168        _Module.SetResourceInstance(reinterpret_cast<HINSTANCE>(hmod_));
169}
170
171std::wstring app_module::res_wstr(unsigned uID)
172{
173        // The upper size limit ain't nice, but at least it's safe from buffer overflow
174        win_c_str<std::wstring> str(2048);
175       
176        int size = ::LoadString(_Module.GetResourceInstance(), uID, str, str.size());
177        assert(size != 0);
178       
179        return str;
180}
181
182std::pair<void*,size_t> app_module::res_find_lock(unsigned name, unsigned type)
183{
184        HRSRC rsrc = FindResource(_Module.GetResourceInstance(), (LPCTSTR)name, (LPCTSTR)type);
185        assert(rsrc);
186       
187        HGLOBAL global = LoadResource(_Module.GetResourceInstance(), rsrc);
188        assert(global);
189       
190        void* ptr = LockResource(global);
191        assert(ptr);
192       
193        return std::pair<void*,size_t>(ptr, SizeofResource(_Module.GetResourceInstance(), rsrc));
194}
195
196app_module& app()
197{
198        static app_module app;
199        return app;
200}
201
202} // namespace hal
Note: See TracBrowser for help on using the repository browser.