sharing/
paths.rs

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// use winapi::um::winnt::{KEY_READ, KEY_WRITE};
9#[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")]
89// pub fn add_to_system_path(path_to_add: &str) -> Result<(), Box<dyn std::error::Error>> {
90//
91//     let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
92//     let environment = hklm.open_subkey_with_flags("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment", KEY_READ | KEY_WRITE)?;
93//
94//     // Leer el valor actual de PYTHON_PATH
95//     let current_python_path: Option<String> = environment.get_value("PYTHONPATH").ok();
96//
97//     // Comprobar si el PYTHON_PATH actual es igual al valor que queremos establecer
98//     if let Some(existing_path) = current_python_path {
99//         if existing_path == path_to_add {
100//             println!("The value is already set in the PYTHONPATH.");
101//             return Ok(());
102//         }
103//     }
104//
105//     // Establecer el nuevo valor de PYTHON_PATH en el registro
106//     environment.set_value("PYTHONPATH", &path_to_add)?;
107//
108//     Ok(())
109// }
110#[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            //best match
195            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
217// Files
218
219
220pub 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