1use std::path::{PathBuf};
2#[cfg(target_os = "windows")]
3use std::path::{Path};
4use std::string::ToString;
5use once_cell::sync::Lazy;
6
7use lazy_static::lazy_static;
8#[cfg(target_os = "windows")]
10use winreg::RegKey;
11#[cfg(target_os = "windows")]
12use winreg::enums::HKEY_LOCAL_MACHINE;
13#[cfg(target_os = "windows")]
14use crate::{
15 NAME_SHORTCUT_DESKTOP, proc,
16 PROGRAM_FILES_ENV_VAR, PROGRAM_FILES_KEY, PROGRAM_FILES_SUBKEY,
17};
18
19use crate::{BASE_FOLDER, BEEPER_PDF_FILE, CONFIG_FILE_NAME, ICON_PISPAS, LOGS_PATH, OLD_SERVICE_PYTHON_NAME, POS_DRIVER_FILE, PRINTER_TEST_FILE, PRINTSVC_PYTHON_NAME, ROOT_FOLDER, WKHTMLTOPDF_FILE, PYTHON_FOLDER, PRINT_SERVICE, SERVICE_PYTHON_NAME, ORDER_KITCHEN, PISPAS_CONFIGURATOR, TRAY_ICON_NAME, PISPAS_ELEVATOR};
20
21lazy_static! {
22 pub static ref HOME_DIR: PathBuf = {
23 user_profile_dir()
24 };
25
26}
27
28#[cfg(target_os = "windows")]
29lazy_static! {
30 pub static ref PROGRAM_HOME_DIR: PathBuf = {
31 if let Some(program_files_dir) = get_program_files_dir() {
32 tracing::info!("Folder Program Files: {:?}", program_files_dir);
33 program_files_dir.join(BASE_FOLDER)
34 } else {
35 panic!("Don't find Program Files folder")
36 }
37
38 };
39}
40
41#[cfg(target_os = "windows")]
42lazy_static! {
43 pub static ref PROGRAM_DATA_DIR: PathBuf = {
44 if let Some(program_files_dir) = get_program_data_dir() {
45 tracing::info!("Folder Program Files: {:?}", program_files_dir);
46 program_files_dir.join(BASE_FOLDER)
47 } else {
48 panic!("Don't find Program Files folder")
49 }
50
51 };
52}
53
54#[cfg(not(target_os = "windows"))]
55lazy_static! {
56 pub static ref PROGRAM_HOME_DIR: PathBuf = HOME_DIR.clone();
57 pub static ref PROGRAM_DATA_DIR: PathBuf = HOME_DIR.clone();
58}
59
60#[cfg(target_os = "windows")]
61pub fn get_elevator_path(working_dir: &PathBuf) -> PathBuf {
62 working_dir.join(crate::PISPAS_ELEVATOR)
63}
64#[cfg(not(target_os = "windows"))]
65pub fn get_elevator_path(working_dir: &PathBuf) -> PathBuf {
66 working_dir.join(crate::PISPAS_ELEVATOR)
67}
68
69
70
71pub fn get_install_dir() -> PathBuf {
72 PROGRAM_HOME_DIR.clone()
73}
74
75#[cfg(target_os = "windows")]
76fn get_program_files_dir() -> Option<PathBuf> {
77 let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
78 let subkey = hklm.open_subkey(PROGRAM_FILES_KEY).ok()?;
79
80 if let Ok(program_files_dir) = subkey.get_value::<String, _>(PROGRAM_FILES_SUBKEY) {
81 tracing::info!("Program Files: {:?}", program_files_dir);
82 Some(PathBuf::from(program_files_dir))
83 } else {
84 tracing::info!("Program Files: {:?}", std::env::var(PROGRAM_FILES_ENV_VAR).ok().map(PathBuf::from));
85 std::env::var(PROGRAM_FILES_ENV_VAR).ok().map(PathBuf::from)
86 }
87}
88#[cfg(target_os = "windows")]
111fn get_program_data_dir() -> Option<PathBuf> {
112 std::env::var("ProgramData").ok().map(PathBuf::from)
113}
114
115
116pub fn user_home() -> PathBuf {
117 dirs::home_dir()
118 .unwrap_or_default()
119}
120
121
122pub fn log_dir() -> PathBuf {
123 PROGRAM_DATA_DIR.join(LOGS_PATH)
124}
125
126pub fn log_bin_dir() -> PathBuf {
127 PROGRAM_HOME_DIR.join(LOGS_PATH)
128}
129pub fn user_log_dir() -> PathBuf {
130 HOME_DIR.join(LOGS_PATH)
131}
132pub fn service_log_dir() -> PathBuf {
133 HOME_DIR.join(LOGS_PATH)
134}
135
136pub fn backup_dir() -> PathBuf {
137 HOME_DIR.join("backup")
138}
139
140pub fn lib_dir() -> PathBuf {
141 PROGRAM_HOME_DIR.clone()
142}
143
144pub fn bin_dir() -> PathBuf {
145 PROGRAM_HOME_DIR.clone()
146}
147
148pub fn jobs_dir() -> PathBuf {
149 PROGRAM_HOME_DIR.join("jobs")
150}
151
152pub fn env_file_path() -> PathBuf {
153 if cfg!(target_os = "windows") {
154 HOME_DIR.join(crate::ENV_FILE_NAME)
155 } else {
156 bin_dir().join(".env")
157 }
158
159
160}
161
162#[cfg(target_os = "windows")]
163pub fn icon_desktop() -> PathBuf {
164 match proc::get_gran_father_info() {
165 Ok(user_info) => {
166 let path_icon = Path::new(&user_info.desktop).join(NAME_SHORTCUT_DESKTOP);
167 tracing::info!("Path icon desktop: {:?}", path_icon);
168 path_icon
169 }
170 Err(err) => {
171 tracing::error!("Error getting user info: {:?}", err);
172 let desktop_path = dirs::desktop_dir().expect("Can't get desktop path");
173 desktop_path.join(NAME_SHORTCUT_DESKTOP)
174 }
175 }
176}
177
178#[cfg(target_os = "windows")]
179pub fn user_profile_dir() -> PathBuf {
180 match proc::get_gran_father_info() {
181 Ok(user_info) => {
182 let user_profile = Path::new(&user_info.userprofile);
183 tracing::info!("User profile path: {:?}", user_profile);
184 if user_profile.to_str().is_none() {
185 tracing::warn!("User profile path is not valid, using default path");
186 return PathBuf::from(ROOT_FOLDER).join(BASE_FOLDER);
187 }
188 user_profile.to_path_buf()
189 .join(ROOT_FOLDER)
190 .join(BASE_FOLDER)
191 }
192 Err(err) => {
193 tracing::error!("Error getting user info: {:?}", err);
194 match dirs::home_dir() {
196 Some(home) => {
197 tracing::info!("Using home directory: {:?}", home);
198 home.join(ROOT_FOLDER).join(BASE_FOLDER)
199 },
200 None => {
201 tracing::warn!("Can't get home directory, using default path");
202 PathBuf::from(ROOT_FOLDER).join(BASE_FOLDER)
203 },
204 }
205 }
206 }
207}
208
209#[cfg(not(target_os = "windows"))]
210pub fn user_profile_dir() -> PathBuf {
211 dirs::home_dir()
212 .unwrap_or_default()
213 .join(ROOT_FOLDER)
214 .join(BASE_FOLDER)
215}
216
217pub fn config_file_path() -> PathBuf {
221 bin_dir().join(CONFIG_FILE_NAME)
222}
223
224
225pub fn get_persistance_path() -> PathBuf {
226 let filename = format!("{}-data.bin", whoami::realname());
227 HOME_DIR.join(filename)
228}
229
230
231pub fn tray_icon_path() -> PathBuf { bin_dir().join(TRAY_ICON_NAME) }
232
233
234
235
236pub fn elevator_path() -> PathBuf { bin_dir().join(PISPAS_ELEVATOR) }
237
238
239pub const WINDOWS_SYSTEM32: &str = "C:\\Windows\\System32";
240pub const PREFIX_PISPAS: &str = "pispas-";
241pub const WIN_BINARIES_PATH: &str = "win";
242pub fn win_dir() -> PathBuf {
243 bin_dir().join(WIN_BINARIES_PATH)
244}
245
246pub static SUMATRA_PATH: Lazy<String> = Lazy::new(|| {
247 win_dir().join(crate::SUMATRA_FILE).display().to_string()
248});
249
250pub static WKHTMLTOPDF_PATH: Lazy<String> = Lazy::new(|| {
251 win_dir().join(WKHTMLTOPDF_FILE).display().to_string()
252});
253
254pub const MODULES_FOLDER: &str = "modules";
255pub fn modules_dir() -> PathBuf {
256 PROGRAM_HOME_DIR.join(MODULES_FOLDER)
257}
258
259pub fn configurator_path() -> PathBuf { bin_dir().join(PISPAS_CONFIGURATOR) }
260pub fn get_python_service() -> PathBuf{ bin_dir().join(SERVICE_PYTHON_NAME) }
261pub fn get_python_service_old() -> PathBuf{ bin_dir().join(OLD_SERVICE_PYTHON_NAME) }
262pub fn get_printsvc_service() -> PathBuf{ bin_dir().join(PRINTSVC_PYTHON_NAME) }
263pub fn get_printsvc_service_new() -> PathBuf{ bin_dir().join(PRINTSVC_PYTHON_NAME) }
264
265pub fn pdf_info_file_path() -> PathBuf {
266 bin_dir().join(WIN_BINARIES_PATH).join(crate::PDF_INFO_FILE)
267}
268pub fn pos_driver_file_path() -> PathBuf {
269 bin_dir().join(WIN_BINARIES_PATH).join(POS_DRIVER_FILE)
270}
271pub fn printer_test_file_path() -> PathBuf {
272 bin_dir().join(WIN_BINARIES_PATH).join(PRINTER_TEST_FILE)
273}
274pub fn beep_pdf_file_path() -> PathBuf {
275 bin_dir().join(WIN_BINARIES_PATH).join(BEEPER_PDF_FILE)
276}
277
278pub fn icon_pispas() -> PathBuf {
279 bin_dir().join(ICON_PISPAS)
280}
281pub fn get_python_folder() -> PathBuf {
282 bin_dir().join(PYTHON_FOLDER)
283}
284pub fn print_service_path() -> PathBuf {
285 bin_dir().join(PRINT_SERVICE)
286}
287pub fn order_kitchen_path() -> PathBuf {
288 bin_dir().join(ORDER_KITCHEN)
289}
290