1 #include <QtGlobal>
2 #include <QDir>
3 #include "programpaths.h"
4 
5 
6 #define MAP_DIR          "maps"
7 #define POI_DIR          "POI"
8 #define CSV_DIR          "csv"
9 #define DEM_DIR          "DEM"
10 #define TILES_DIR        "tiles"
11 #define TRANSLATIONS_DIR "translations"
12 #define STYLE_DIR        "style"
13 #define ELLIPSOID_FILE   "ellipsoids.csv"
14 #define GCS_FILE         "gcs.csv"
15 #define PCS_FILE         "pcs.csv"
16 #define TYP_FILE         "style.typ"
17 
18 
19 #if QT_VERSION < QT_VERSION_CHECK(5, 4, 0)
20 
21 #include <QApplication>
22 
23 #if defined(Q_OS_WIN32)
24 #define USER_DIR        QDir::homePath() + QString("/AppData/Roaming/") \
25 						  + qApp->applicationName()
26 #define GLOBAL_DIR      QApplication::applicationDirPath()
27 #elif defined(Q_OS_MAC)
28 #define USER_DIR        QDir::homePath() \
29 						  + QString("/Library/Application Support/") \
30 						  + qApp->applicationName()
31 #define GLOBAL_DIR      QApplication::applicationDirPath() \
32 						  + QString("/../Resources")
33 #else
34 #define USER_DIR        QDir::homePath() + QString("/.local/share/") \
35 						  + qApp->applicationName()
36 #define GLOBAL_DIR      QString(PREFIX "/share/") + qApp->applicationName()
37 #endif
38 
dir(const QString & dirName,bool writable=false)39 static QString dir(const QString &dirName, bool writable = false)
40 {
41 	QDir userDir(QDir(USER_DIR).filePath(dirName));
42 
43 	if (writable || userDir.exists())
44 		return userDir.absolutePath();
45 	else {
46 		QDir globalDir(QDir(GLOBAL_DIR).filePath(dirName));
47 
48 		if (globalDir.exists())
49 			return globalDir.absolutePath();
50 		else
51 			return QString();
52 	}
53 }
54 
file(const QString & path,const QString & fileName)55 static QString file(const QString &path, const QString &fileName)
56 {
57 	if (path.isNull())
58 		return QString();
59 
60 	QFileInfo fi(QDir(path).filePath(fileName));
61 	return fi.exists() ? fi.absoluteFilePath() : QString();
62 }
63 
mapDir(bool writable)64 QString ProgramPaths::mapDir(bool writable)
65 {
66 	return dir(MAP_DIR, writable);
67 }
68 
poiDir(bool writable)69 QString ProgramPaths::poiDir(bool writable)
70 {
71 	return dir(POI_DIR, writable);
72 }
73 
csvDir(bool writable)74 QString ProgramPaths::csvDir(bool writable)
75 {
76 	return dir(CSV_DIR, writable);
77 }
78 
demDir(bool writable)79 QString ProgramPaths::demDir(bool writable)
80 {
81 	return dir(DEM_DIR, writable);
82 }
83 
styleDir(bool writable)84 QString ProgramPaths::styleDir(bool writable)
85 {
86 	return dir(STYLE_DIR, writable);
87 }
88 
tilesDir()89 QString ProgramPaths::tilesDir()
90 {
91 #if defined(Q_OS_WIN32)
92 	return QDir::homePath() + QString("/AppData/Local/")
93 	  + qApp->applicationName() + QString("/cache/") + QString(TILES_DIR);
94 #elif defined(Q_OS_MAC)
95 	return QDir::homePath() + QString("/Library/Caches/")
96 	  + qApp->applicationName() + QString("/" TILES_DIR);
97 #else
98 	return QDir::homePath() + QString("/.cache/") + qApp->applicationName()
99 	  + QString("/" TILES_DIR);
100 #endif
101 }
102 
translationsDir()103 QString ProgramPaths::translationsDir()
104 {
105 	return dir(TRANSLATIONS_DIR);
106 }
107 
ellipsoidsFile()108 QString ProgramPaths::ellipsoidsFile()
109 {
110 	return file(dir(CSV_DIR),  ELLIPSOID_FILE);
111 }
112 
gcsFile()113 QString ProgramPaths::gcsFile()
114 {
115 	return file(dir(CSV_DIR), GCS_FILE);
116 }
117 
pcsFile()118 QString ProgramPaths::pcsFile()
119 {
120 	return file(dir(CSV_DIR), PCS_FILE);
121 }
122 
typFile()123 QString ProgramPaths::typFile()
124 {
125 	return file(dir(STYLE_DIR), TYP_FILE);
126 }
127 
128 #else // QT_VERSION < 5
129 
130 #include <QStandardPaths>
131 
mapDir(bool writable)132 QString ProgramPaths::mapDir(bool writable)
133 {
134 	if (writable)
135 		return QDir(QStandardPaths::writableLocation(
136 		  QStandardPaths::AppDataLocation)).filePath(MAP_DIR);
137 	else
138 		return QStandardPaths::locate(QStandardPaths::AppDataLocation,
139 		  MAP_DIR, QStandardPaths::LocateDirectory);
140 }
141 
poiDir(bool writable)142 QString ProgramPaths::poiDir(bool writable)
143 {
144 	if (writable)
145 		return QDir(QStandardPaths::writableLocation(
146 		  QStandardPaths::AppDataLocation)).filePath(POI_DIR);
147 	else
148 		return QStandardPaths::locate(QStandardPaths::AppDataLocation,
149 		  POI_DIR, QStandardPaths::LocateDirectory);
150 }
151 
csvDir(bool writable)152 QString ProgramPaths::csvDir(bool writable)
153 {
154 	if (writable)
155 		return QDir(QStandardPaths::writableLocation(
156 		  QStandardPaths::AppDataLocation)).filePath(CSV_DIR);
157 	else
158 		return QStandardPaths::locate(QStandardPaths::AppDataLocation,
159 		  CSV_DIR, QStandardPaths::LocateDirectory);
160 }
161 
demDir(bool writable)162 QString ProgramPaths::demDir(bool writable)
163 {
164 	if (writable)
165 		return QDir(QStandardPaths::writableLocation(
166 		  QStandardPaths::AppDataLocation)).filePath(DEM_DIR);
167 	else
168 		return QStandardPaths::locate(QStandardPaths::AppDataLocation,
169 		  DEM_DIR, QStandardPaths::LocateDirectory);
170 }
171 
styleDir(bool writable)172 QString ProgramPaths::styleDir(bool writable)
173 {
174 	if (writable)
175 		return QDir(QStandardPaths::writableLocation(
176 		  QStandardPaths::AppDataLocation)).filePath(STYLE_DIR);
177 	else
178 		return QStandardPaths::locate(QStandardPaths::AppDataLocation,
179 		  STYLE_DIR, QStandardPaths::LocateDirectory);
180 }
181 
tilesDir()182 QString ProgramPaths::tilesDir()
183 {
184 	return QDir(QStandardPaths::writableLocation(
185 	  QStandardPaths::CacheLocation)).filePath(TILES_DIR);
186 }
187 
translationsDir()188 QString ProgramPaths::translationsDir()
189 {
190 	return QStandardPaths::locate(QStandardPaths::AppDataLocation,
191 	  TRANSLATIONS_DIR, QStandardPaths::LocateDirectory);
192 }
193 
ellipsoidsFile()194 QString ProgramPaths::ellipsoidsFile()
195 {
196 	return QStandardPaths::locate(QStandardPaths::AppDataLocation,
197 	  CSV_DIR "/" ELLIPSOID_FILE, QStandardPaths::LocateFile);
198 }
199 
gcsFile()200 QString ProgramPaths::gcsFile()
201 {
202 	return QStandardPaths::locate(QStandardPaths::AppDataLocation,
203 	  CSV_DIR "/" GCS_FILE, QStandardPaths::LocateFile);
204 }
205 
pcsFile()206 QString ProgramPaths::pcsFile()
207 {
208 	return QStandardPaths::locate(QStandardPaths::AppDataLocation,
209 	  CSV_DIR "/" PCS_FILE, QStandardPaths::LocateFile);
210 }
211 
typFile()212 QString ProgramPaths::typFile()
213 {
214 	return QStandardPaths::locate(QStandardPaths::AppDataLocation,
215 	  STYLE_DIR "/" TYP_FILE, QStandardPaths::LocateFile);
216 }
217 
218 #endif // QT_VERSION < 5
219