diff --git a/Cargo.lock b/Cargo.lock index 16e4037..3f036b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1527,7 +1527,9 @@ dependencies = [ name = "fsv" version = "0.1.0" dependencies = [ + "anyhow", "fsv-sys", + "num_enum", "thiserror", "utils", ] diff --git a/crates/fsv/Cargo.toml b/crates/fsv/Cargo.toml index 385ee27..32f6d54 100644 --- a/crates/fsv/Cargo.toml +++ b/crates/fsv/Cargo.toml @@ -4,7 +4,9 @@ version = "0.1.0" edition = "2021" [dependencies] +anyhow = "1.0.89" +num_enum = "0.7.3" thiserror = "1.0.64" fsv-sys = { path = "../fsv-sys" } -utils = { path = "../utils" } \ No newline at end of file +utils = { path = "../utils" } diff --git a/crates/fsv/src/ssv/errors_ssv.rs b/crates/fsv/src/ssv/errors_ssv.rs new file mode 100644 index 0000000..0acf486 --- /dev/null +++ b/crates/fsv/src/ssv/errors_ssv.rs @@ -0,0 +1,82 @@ +use num_enum::FromPrimitive; +use thiserror::Error; + +#[derive(Error, Debug, Eq, PartialEq, FromPrimitive)] +#[repr(u16)] +pub enum SSVErrorCodes { + #[error("Le fichier `tablebin.smc` est inaccessible en lecture (inexistant ou pas de droits d'accès).")] + FileMissingTablebinMsc = 0xF610, // tablebin.smc + #[error("Le fichier `scripts.sms` est inaccessible en lecture (inexistant ou pas de droits d'accès).")] + FileMissingScriptsSms = 0xF611, // scripts.sms + #[error("Le fichier `tablebin.ssv` est inaccessible en lecture (inexistant ou pas de droits d'accès).")] + FileMissingTablebinSsv = 0xF612, // tablebin.ssv + #[error("Le fichier `script.ssv` est inaccessible en lecture (inexistant ou pas de droits d'accès).")] + FileMissingScriptSsv = 0xF613, // script.ssv + #[error("La version du fichier `tablebin.smc` est incompatible avec la bibliothèque des SSV.")] + FileVersionIncompatibleTablebinMsc = 0xF620, // tablebin.smc + #[error("La version du fichier `scripts.sms` est incompatible avec la bibliothèque des SSV.")] + FileVersionIncompatibleScriptsSms = 0xF621, // scripts.sms + #[error("La version du fichier `tablebin.ssv` est incompatible avec la bibliothèque des SSV.")] + FileVersionIncompatibleTablebinSsv = 0xF622, // tablebin.ssv + #[error("La version du fichier `script.ssv` est incompatible avec la bibliothèque des SSV.")] + FileVersionIncompatibleScriptSsv = 0xF623, // script.ssv + #[error("L'intégrité du fichier `tablebin.smc` est incorrecte.")] + FileIntegrityIncorrectTablebinMsc = 0xF630, // tablebin.smc + #[error("L'intégrité du fichier `scripts.sms` est incorrecte.")] + FileIntegrityIncorrectScriptsSms = 0xF631, // scripts.sms + #[error("L'intégrité du fichier `tablebin.ssv` est incorrecte.")] + FileIntegrityIncorrectTablebinSsv = 0xF632, // tablebin.ssv + #[error("L'intégrité du fichier `script.ssv` est incorrecte.")] + FileIntegrityIncorrectScriptSsv = 0xF633, // script.ssv + #[error("La structure interne du fichier `tablebin.smc` est invalide.")] + FileStructureInvalidTablebinMsc = 0xF640, // tablebin.smc + #[error("La structure interne du fichier `scripts.sms` est invalide.")] + FileStructureInvalidScriptsSms = 0xF641, // scripts.sms + #[error("La structure interne du fichier `tablebin.ssv` est invalide.")] + FileStructureInvalidTablebinSsv = 0xF642, // tablebin.ssv + #[error("La structure interne du fichier `script.ssv` est invalide.")] + FileStructureInvalidScriptSsv = 0xF643, // script.ssv + #[error("Le fichier `tablebin.smc` n'a pas pu être chargé en mémoire. Essayez de libérer de la mémoire.")] + FileLoadFailedTablebinMsc = 0xF650, // tablebin.smc + #[error("Le fichier `scripts.sms` n'a pas pu être chargé en mémoire. Essayez de libérer de la mémoire.")] + FileLoadFailedScriptsSms = 0xF651, // scripts.sms + #[error("Le fichier `tablebin.ssv` n'a pas pu être chargé en mémoire. Essayez de libérer de la mémoire.")] + FileLoadFailedTablebinSsv = 0xF652, // tablebin.ssv + #[error("Le fichier `script.ssv` n'a pas pu être chargé en mémoire. Essayez de libérer de la mémoire.")] + FileLoadFailedScriptSsv = 0xF653, // script.ssv + #[error("Le nom du fichier `tablebin.smc` est invalide.")] + FileNameInvalidTablebinMsc = 0xF660, // tablebin.smc + #[error("Le nom du fichier `scripts.sms` est invalide.")] + FileNameInvalidScriptsSms = 0xF661, // scripts.sms + #[error("Le nom du fichier `tablebin.ssv` est invalide.")] + FileNameInvalidTablebinSsv = 0xF662, // tablebin.ssv + #[error("Le nom du fichier `script.ssv` est invalide.")] + FileNameInvalidScriptSsv = 0xF663, // script.ssv + #[error("La fonction Initialiser Librairie est déjà appelée.")] + FunctionInitLib2AlreadyCalled = 0xF670, // Warning + #[error("Le fichier SESAM.INI est inaccessible en lecture (fichier ou droit d’accès manquant) ou ne contient pas le chemin des tables binaires des SSV.")] + SesamIniMissingFileOrTablebinPath = 0xF680, + #[error("Le chemin du répertoire de travail est absent du fichier SESAM.INI.")] + SesamIniMissingWorkDir = 0xF6F1, + #[error("Les fichiers d’extension adm ne sont pas accessibles en écriture.")] + AdmFilesNotWritable = 0xF6F2, // Warning + #[error("Aucune version de FSV du socle technique trouvé. Vérifier que la version du fichier script.sms est bonne.")] + NoFsvVersionFound = 0xF6F4, + #[error("Librairie SGD absente ou incomplète.")] + LibraryMissingOrIncompleteSGD = 0xF6F5, + #[error("Librairie SMC absente ou incomplète.")] + LibraryMissingOrIncompleteSMC = 0xF6F6, + #[error("Librairie SJS absente ou incomplète.")] + LibraryMissingOrIncompleteSJS = 0xF6F7, + #[error("Librairie SMS absente ou incomplète.")] + LibraryMissingOrIncompleteSMS = 0xF6F8, + #[error("Section MGC absente / clé RepertoireConfigTrace absente / fichier log4crc.xml non trouvé à l’emplacement indiqué par la clé RepertoireConfigTrace du fichier SESAM.INI.")] + SesamIniTracingConfigMissing = 0xFF22, // Warning + #[error("Interface Full PC/SC : problème de chargement de la librairie cryptographique ou erreur retournée par la librairie cryptographique.")] + PCSCInterfaceCryptoLibraryError = 0xFF25, + #[error("Valorisation incorrecte des paramètres de gestion de l'accès aux ressources dans le SESAM.INI. Vérifier les valeurs des clés tempoexclusivite, repetitionexclusivite, tempoexclusivitePCSC, repetitionexclusivitePCSC")] + SesamIniResourceAccessParamsIncorrect = 0xFF2A, + #[num_enum(catch_all)] + #[error("Erreur inattendue de la librairie SSV (code d'erreur: {0}).")] + Unexpected(u16), +} diff --git a/crates/fsv/src/ssv.rs b/crates/fsv/src/ssv/mod.rs similarity index 61% rename from crates/fsv/src/ssv.rs rename to crates/fsv/src/ssv/mod.rs index 89cd354..0cd773a 100644 --- a/crates/fsv/src/ssv.rs +++ b/crates/fsv/src/ssv/mod.rs @@ -1,11 +1,24 @@ use thiserror::Error; -use fsv_sys::{get_library_path, Error as FsvError, SSVLibrary, SSVLibrary_Common, SUPPORTED_FSV_VERSIONS, V1_40_13, V1_40_14}; +use fsv_sys::{ + get_library_path, + Error as FsvError, + SSVLibrary, + SSVLibraryCommon, + SupportedFsvVersion, + V1_40_13, + V1_40_14 +}; + +mod errors_ssv; +use errors_ssv::SSVErrorCodes; #[derive(Error, Debug)] pub enum Error { #[error(transparent)] - SysLibrary(#[from] FsvError) + FSVSysLibrary(#[from] FsvError), + #[error(transparent)] + SSVError(#[from] SSVErrorCodes), } /// Enum to hold the different versions of the SSV library @@ -20,14 +33,14 @@ pub struct SSV { } impl SSV { - fn new(version: SUPPORTED_FSV_VERSIONS) -> Result { + fn new(version: SupportedFsvVersion) -> Result { let library = match version { - SUPPORTED_FSV_VERSIONS::V1_40_13 => { + SupportedFsvVersion::V1_40_13 => { let lib_path = get_library_path(&version); let library = SSVLibrary::::new(&lib_path)?; SsvLibraryVersion::V1_40_13(library) }, - SUPPORTED_FSV_VERSIONS::V1_40_14 => { + SupportedFsvVersion::V1_40_14 => { let lib_path = get_library_path(&version); let library = SSVLibrary::::new(&lib_path)?; SsvLibraryVersion::V1_40_14(library) @@ -42,15 +55,17 @@ impl SSV { /// Implement: SSV_InitLIB2 pub fn init_library(&self, sesam_ini_path: &str) -> Result<(), Error> { let sesam_ini_path = std::ffi::CString::new(sesam_ini_path).expect("CString::new failed"); - match &self.library { + let result = match &self.library { SsvLibraryVersion::V1_40_13(library) => { - let result = unsafe { library.ssv_init_lib2(sesam_ini_path.as_ptr()) }?; - println!("SSV_InitLIB2 result: {}", result); + unsafe { library.ssv_init_lib2(sesam_ini_path.as_ptr()) }? }, SsvLibraryVersion::V1_40_14(library) => { - let result = unsafe { library.ssv_init_lib2(sesam_ini_path.as_ptr()) }?; - println!("SSV_InitLIB2 result: {}", result); + unsafe { library.ssv_init_lib2(sesam_ini_path.as_ptr()) }? }, + }; + if result != 0 { + let error = SSVErrorCodes::from(result); + return Err(Error::SSVError(error)); } Ok(()) } @@ -61,19 +76,21 @@ mod tests { use std::env; use utils::config::load_config; + use anyhow::Result; use super::*; - fn init() -> SSV { + fn init() -> Result { load_config().unwrap(); - SSV::new(SUPPORTED_FSV_VERSIONS::V1_40_13).expect("SSV::new failed") + Ok(SSV::new(SupportedFsvVersion::V1_40_13)?) } #[test] - fn test_init_library() { - let lib = init(); + fn test_init_library() -> Result<()> { + let lib = init()?; let sesam_ini_path = env::var("SESAM_INI_PATH").expect("SESAM_INI_PATH must be set"); - lib.init_library(&sesam_ini_path).expect("init_library failed"); + lib.init_library(&sesam_ini_path)?; + Ok(()) } #[test]