Mercurial > code
annotate C++/modules/Xdg/Xdg.cpp @ 334:0b576ee64d45
* Create brand new hierarchy
* Rename DynLib to Dynlib
* Remove some warnings
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 08 Mar 2015 14:26:33 +0100 |
parents | C++/Xdg.cpp@f6d9fdb5eeeb |
children | d5ec1174b707 |
rev | line source |
---|---|
239
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * Xdg.cpp -- XDG directory specifications |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2013, 2014 David Demelier <markand@malikania.fr> |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <cstdlib> |
240
f6d9fdb5eeeb
Xdg: don't use bad directories, add tests
David Demelier <markand@malikania.fr>
parents:
239
diff
changeset
|
20 #include <stdexcept> |
239
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include <sstream> |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 |
240
f6d9fdb5eeeb
Xdg: don't use bad directories, add tests
David Demelier <markand@malikania.fr>
parents:
239
diff
changeset
|
23 #include "Xdg.h" |
239
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 namespace { |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 |
240
f6d9fdb5eeeb
Xdg: don't use bad directories, add tests
David Demelier <markand@malikania.fr>
parents:
239
diff
changeset
|
27 bool isabsolute(const std::string &path) |
f6d9fdb5eeeb
Xdg: don't use bad directories, add tests
David Demelier <markand@malikania.fr>
parents:
239
diff
changeset
|
28 { |
f6d9fdb5eeeb
Xdg: don't use bad directories, add tests
David Demelier <markand@malikania.fr>
parents:
239
diff
changeset
|
29 return path.length() > 0 && path[0] == '/'; |
f6d9fdb5eeeb
Xdg: don't use bad directories, add tests
David Demelier <markand@malikania.fr>
parents:
239
diff
changeset
|
30 } |
f6d9fdb5eeeb
Xdg: don't use bad directories, add tests
David Demelier <markand@malikania.fr>
parents:
239
diff
changeset
|
31 |
239
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 std::vector<std::string> split(const std::string &arg) |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 { |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 std::stringstream iss(arg); |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 std::string item; |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 std::vector<std::string> elems; |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 while (std::getline(iss, item, ':')) |
240
f6d9fdb5eeeb
Xdg: don't use bad directories, add tests
David Demelier <markand@malikania.fr>
parents:
239
diff
changeset
|
39 if (isabsolute(item)) |
f6d9fdb5eeeb
Xdg: don't use bad directories, add tests
David Demelier <markand@malikania.fr>
parents:
239
diff
changeset
|
40 elems.push_back(item); |
239
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 return elems; |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 } |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 std::string envOrHome(const std::string &var, const std::string &repl) |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 { |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 auto value = getenv(var.c_str()); |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 |
240
f6d9fdb5eeeb
Xdg: don't use bad directories, add tests
David Demelier <markand@malikania.fr>
parents:
239
diff
changeset
|
49 if (value == nullptr || !isabsolute(value)) { |
239
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 auto home = getenv("HOME"); |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 if (home == nullptr) |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 throw std::runtime_error("could not get home directory"); |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 return std::string(home) + "/" + repl; |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 } |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 return value; |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 } |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 std::vector<std::string> listOrDefaults(const std::string &var, const std::vector<std::string> &list) |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 { |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 auto value = getenv(var.c_str()); |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 if (!value) |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 return list; |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 |
240
f6d9fdb5eeeb
Xdg: don't use bad directories, add tests
David Demelier <markand@malikania.fr>
parents:
239
diff
changeset
|
68 // No valid item at all? Use defaults |
f6d9fdb5eeeb
Xdg: don't use bad directories, add tests
David Demelier <markand@malikania.fr>
parents:
239
diff
changeset
|
69 auto result = split(value); |
f6d9fdb5eeeb
Xdg: don't use bad directories, add tests
David Demelier <markand@malikania.fr>
parents:
239
diff
changeset
|
70 |
f6d9fdb5eeeb
Xdg: don't use bad directories, add tests
David Demelier <markand@malikania.fr>
parents:
239
diff
changeset
|
71 return (result.size() == 0) ? list : result; |
239
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 } |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 } // !namespace |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 Xdg::Xdg() |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 { |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 m_configHome = envOrHome("XDG_CONFIG_HOME", ".config"); |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 m_dataHome = envOrHome("XDG_DATA_HOME", ".local/share"); |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 m_cacheHome = envOrHome("XDG_CACHE_HOME", ".cache"); |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 m_configDirs = listOrDefaults("XDG_CONFIG_DIRS", { "/etc/xdg" }); |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 m_dataDirs = listOrDefaults("XDG_DATA_DIRS", { "/usr/local/share", "/usr/share" }); |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 /* |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 * Runtime directory is a special case and does not have a replacement, the |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 * application should manage this by itself. |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 */ |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 auto runtime = getenv("XDG_RUNTIME_DIR"); |
240
f6d9fdb5eeeb
Xdg: don't use bad directories, add tests
David Demelier <markand@malikania.fr>
parents:
239
diff
changeset
|
90 if (runtime && isabsolute(runtime)) |
239
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 m_runtimeDir = runtime; |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 } |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 const std::string &Xdg::configHome() const noexcept |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 { |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 return m_configHome; |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 } |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 const std::string &Xdg::dataHome() const noexcept |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 { |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 return m_dataHome; |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 } |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 const std::string &Xdg::cacheHome() const noexcept |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 { |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 return m_cacheHome; |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 } |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 const std::string &Xdg::runtimeDir() const |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 { |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 if (m_runtimeDir.size() == 0) |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 throw std::runtime_error("XDG_RUNTIME_DIR is not set"); |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
113 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 return m_runtimeDir; |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 } |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 const Xdg::List &Xdg::configDirs() const noexcept |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 { |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 return m_configDirs; |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 } |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 const Xdg::List &Xdg::dataDirs() const noexcept |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 { |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 return m_dataDirs; |
9b69f810d3b9
Add Xdg, a replacement for XDG standard directories
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 } |