1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
#include "platform.hpp"
#include "../base/logging.hpp"
#include "../coding/file_writer.hpp"
#include "../std/windows.hpp"
#include <shlobj.h>
static bool GetUserWritableDir(string & outDir)
{
char pathBuf[MAX_PATH] = {0};
if (SUCCEEDED(::SHGetFolderPathA(NULL, CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, pathBuf)))
{
outDir = pathBuf;
::CreateDirectoryA(outDir.c_str(), NULL);
outDir += "\\MapsWithMe\\";
::CreateDirectoryA(outDir.c_str(), NULL);
return true;
}
return false;
}
/// @return Full path to the executable file
static bool GetPathToBinary(string & outPath)
{
// get path to executable
char pathBuf[MAX_PATH] = {0};
if (0 < ::GetModuleFileNameA(NULL, pathBuf, MAX_PATH))
{
outPath = pathBuf;
return true;
}
return false;
}
Platform::Platform()
{
string path;
CHECK(GetPathToBinary(path), ("Can't get path to binary"));
// resources path:
// 1. try to use data folder in the same path as executable
// 2. if not found, try to use ..\..\..\data (for development only)
path.erase(path.find_last_of('\\'));
if (IsFileExistsByFullPath(path + "\\data\\"))
m_resourcesDir = path + "\\data\\";
else
{
#ifndef OMIM_PRODUCTION
path.erase(path.find_last_of('\\'));
path.erase(path.find_last_of('\\'));
if (IsFileExistsByFullPath(path + "\\data\\"))
m_resourcesDir = path + "\\data\\";
#else
CHECK(false, ("Can't find resources directory"));
#endif
}
// writable path:
// 1. the same as resources if we have write access to this folder
// 2. otherwise, use system-specific folder
try
{
FileWriter tmpfile(m_resourcesDir + "mapswithmetmptestfile");
tmpfile.Write("Hi from Alex!", 13);
m_writableDir = m_resourcesDir;
}
catch (RootException const &)
{
CHECK(GetUserWritableDir(m_writableDir), ("Can't get writable directory"));
}
FileWriter::DeleteFileX(m_resourcesDir + "mapswithmetmptestfile");
m_settingsDir = m_writableDir;
char pathBuf[MAX_PATH] = {0};
GetTempPathA(MAX_PATH, pathBuf);
m_tmpDir = pathBuf;
LOG(LDEBUG, ("Resources Directory:", m_resourcesDir));
LOG(LDEBUG, ("Writable Directory:", m_writableDir));
LOG(LDEBUG, ("Tmp Directory:", m_tmpDir));
LOG(LDEBUG, ("Settings Directory:", m_settingsDir));
}
Platform::~Platform()
{
}
bool Platform::IsFileExistsByFullPath(string const & filePath)
{
return ::GetFileAttributesA(filePath.c_str()) != INVALID_FILE_ATTRIBUTES;
}
int Platform::CpuCores() const
{
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
DWORD numCPU = sysinfo.dwNumberOfProcessors;
if (numCPU >= 1)
return static_cast<int>(numCPU);
return 1;
}
string Platform::UniqueClientId() const
{
return "@TODO";
}
void Platform::RunOnGuiThread(TFunctor const & fn)
{
// @TODO
fn();
}
void Platform::RunAsync(TFunctor const & fn, Priority p)
{
// @TODO
fn();
}
|