23 Commits

Author SHA1 Message Date
648a7848fd feature: improve README.md 2024-07-24 22:35:39 +02:00
f6a1af5d1e fix: add org. to tauri identifier 2024-07-24 22:35:39 +02:00
a19b6dcd0d fix: Typo in index.html 2024-07-24 22:35:39 +02:00
9447ad7faf fix: wrong lib name 2024-07-24 22:35:14 +02:00
5eebd5d1cb fix: rename sesam-vitale and fix readme 2024-07-24 22:15:53 +02:00
7d41fbb519 fix: change project naming, create dummy sesame-vitale project 2024-07-24 21:59:24 +02:00
ff2c84fb33 fix: base assets path on the manifest dir when running the webserver manually 2024-07-24 20:36:16 +02:00
b807e78ac3 remove unecessary features 2024-07-24 15:17:47 +02:00
d8f3c276c0 feat: remove reference to clego inside tauri app 2024-07-24 15:00:14 +02:00
c2b4264f32 extract protocol logic to external function 2024-07-24 14:21:37 +02:00
0e8514d906 fix: bump dependency for clego 2024-07-24 14:08:58 +02:00
86a6d2b9d3 fix: revert back to crates dir layout 2024-07-24 11:58:03 +02:00
18758ff2fe fix: remove useless gitignore files 2024-07-24 11:23:41 +02:00
1f57b70cef feat: move packages to root and remove unused dependencies 2024-07-24 11:15:14 +02:00
83cee11e65 feat: restructure project, implement askama templating 2024-07-23 20:08:45 +02:00
b1cafda669 Merge pull request 'Feature: setup de Tauri v2 avec le routing fait par Axum' (#20) from feature-setup-tauri-v2-with-axum into main
Reviewed-on: P4Pillon/Krys4lide#20
2024-07-22 13:25:31 +02:00
d370a9b85d chore: Remove commented out code for GET method in build_axum_request 2024-07-22 13:24:11 +02:00
83b2f7358d chore: Implement clego:// protocol handler using axum router 2024-07-17 12:28:24 +02:00
8ef713ccf2 chore: setup tauri v2 2024-07-17 12:17:18 +02:00
4162e55b83 Merge pull request 'Setup initial project structure' (#1) from feature-setup-initial-project-structure into main
Reviewed-on: P4Pillon/Krys4lide#1
2024-07-07 14:19:45 +02:00
d9cedca335 fixup! chore: Setup clego sub project 2024-07-06 20:04:56 +02:00
820d76d0f5 chore: Setup clego sub project 2024-07-05 16:15:49 +02:00
6409e3eedf chore: Initialize cargo workspace members 2024-07-04 12:12:12 +02:00
59 changed files with 4839 additions and 433 deletions

View File

@ -1,3 +0,0 @@
SESAM_FSV_VERSION=1.40.13
SESAM_FSV_LIB_PATH=/opt/santesocial/fsv/${SESAM_FSV_VERSION}/lib
SESAM_FSV_SSVLIB=ssvlux64

View File

@ -1,3 +0,0 @@
SESAM_FSV_VERSION=1.40.13
SESAM_FSV_LIB_PATH="C:/Program Files/santesocial/fsv/${SESAM_FSV_VERSION}/lib"
SESAM_FSV_SSVLIB=ssvw64

View File

@ -1,2 +0,0 @@
SESAM_FSV_VERSION=1.40.13
SESAM_INI_PATH=/etc/opt/santesocial/fsv/${SESAM_FSV_VERSION}/conf/sesam.ini

View File

@ -1,2 +0,0 @@
SESAM_FSV_VERSION=1.40.13
SESAM_INI_PATH=${ALLUSERSPROFILE}\\santesocial\\fsv\\${SESAM_FSV_VERSION}\\conf\\sesam.ini

27
.gitignore vendored
View File

@ -1,6 +1,23 @@
# Ignore Rust target directory # ---> Rust
/target # Generated by Cargo
# will have compiled files and executables
debug/
target/
# These are backup files generated by rustfmt
**/*.rs.bk
# MSVC Windows builds of rustc generate these, which store debugging information
*.pdb
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# Ignore .env files
.env
.env.build

4509
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,7 @@
[package] [workspace]
name = "utils-debug-c-lib" resolver = "2"
version = "0.1.0" members = [
edition = "2021" "crates/app",
build = "build.rs" "crates/sesam-vitale",
"crates/desktop"
[dependencies] ]
dotenv = "0.15"
libc = "0.2"
[build-dependencies]
dotenv = "0.15"

View File

@ -1,46 +1,39 @@
## Requirements # Krys4lide
- Installer le [package FSV](https://industriels.sesam-vitale.fr/group/fournitures-sesam-vitale) Logiciel de Pharmacie libre et open-source.
- Les librairies dynamiques (.lib, .dll, ...) fournies ne sont pas installés dans les emplacements standard du système, il faudra donc configurer leur chemin d'installation dans le fichier de configuration `.env.build` (voir ci-dessous)
- Le détail des chemins d'installation est donné dans la documentation du package FSV `fsv-mi-004_pack-FSV1.40.14_V2.3.pdf`
- Linux - par défaut : `/opt/santesocial/fsv/1.40.13/lib`
- Windows - par défaut : `C:\Program Files\santesocial\santesocial\fsv\1.40.14\lib` (ou dans Program Files (x86) si c'est le package 32bits qui a été installé)
- Installer la [CryptolibCPS](https://industriels.sesam-vitale.fr/group/galss-cryptolib-cps) ## Crates
- Ce package fourni également l'utilitaire "CPS Gestion" pour obtenir des informations sur le lecteur de carte, etc.
- Linux : `cpgeslux`
- Windows : `...`
## Setup - `app`: Interface du logiciel, servie par un serveur web propulsé par Axum. Utilisable en mode endpoint ou encapsulé dans le client `desktop`
- `desktop`: Client desktop propulsé par Tauri, encapsulant le serveur web `app`
- `sesam-vitale`: Bibliothèque de gestion des services SESAM-Vitale (Lecture des cartes CPS et Vitale, téléservices ...)
- Créer et éditer le fichier de configuration de build `.env.build` en s'inspirant d'un des fichiers d'exemple (`.env.build.linux.example`, `.env.build.win.example`...) ## Development
- Ce fichier est nécessaire pour le build du package Rust
- Créer et éditer le fichier de configuration de l'exécution `.env` en s'inspirant d'un des fichiers d'exemple (`.env.linux.example`, `.env.win.example`...) ### Pré-requis
- Ce fichier est nécessaire pour l'exécution du package Rust compilé, et doit donc être présent aux côtés de l'exécutable généré, le cas échéant
La CLI Tauri est nécessaire au lancement du client `desktop`. Elle peut être installée via Cargo :
```bash
cargo install tauri-cli
```
### Exécution de l'application cliente desktop
```bash
cargo tauri dev
```
### Exécution du serveur web `app` en mode endpoint
```bash
cargo run --bin app
```
## Build ## Build
### Compilation C Packager le client desktop
Ce package s'appuie sur deux librairies : ```bash
- Une librairie statique, compilée à partir des sources (`*.c`, `*.h`) fournies dans le dossier `./src` cargo tauri build
- Une librairie dynamique, fournie par le package FSV ```
- Windows : on fournit les headers, non présents dans la `.dll` en compilant les fichiers `src/*.def` en leur version binaire `lib/*.lib`
Pour compiler les fichiers de librairie :
- Windows : `.\make.bat`
- Linux : `make`
Pour nettoyer le dossier `./lib` :
- Windows : `.\make.bat /clean`
- Linux : `make clean`
### Compilation Rust
`cargo build`
## Run
`cargo run`

View File

@ -1,26 +0,0 @@
extern crate dotenv;
use std::env;
use std::path::PathBuf;
fn main() {
dotenv::from_filename(".env.build").ok();
println!("cargo::rerun-if-changed=.env.build");
let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
let static_lib_path = PathBuf::from(manifest_dir).join("lib");
println!("cargo::rustc-link-search=native={}", static_lib_path.display());
println!("cargo::rustc-link-lib=static=p4pillondebuglib");
let fsv_lib_path = PathBuf::from(env::var("SESAM_FSV_LIB_PATH").unwrap());
println!("cargo::rustc-link-search=native={}", fsv_lib_path.display());
println!("cargo::rustc-link-lib=dylib={}", env::var("SESAM_FSV_SSVLIB").unwrap());
if cfg!(target_os = "windows") {
let path = env::var("PATH").unwrap_or(String::new());
println!("cargo:rustc-env=PATH={};{}", fsv_lib_path.display(), path);
} else if cfg!(target_os = "linux") {
println!("cargo:rustc-env=LD_LIBRARY_PATH={}", fsv_lib_path.display());
}
}

1
crates/app/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/target

12
crates/app/Cargo.toml Normal file
View File

@ -0,0 +1,12 @@
[package]
name = "app"
version = "0.1.0"
edition = "2021"
[dependencies]
askama = "0.12.1"
askama_axum = "0.4.0"
axum = "0.7.5"
tokio = { version = "1.39.1", features = ["macros", "rt-multi-thread"] }
tower-http = { version = "0.5.2", features = ["fs"] }

File diff suppressed because one or more lines are too long

27
crates/app/src/lib.rs Normal file
View File

@ -0,0 +1,27 @@
mod templates;
use std::path::Path;
use askama_axum::IntoResponse;
use templates::{hello::HelloResponse, index::GetIndexResponse};
use tower_http::services::ServeDir;
async fn root() -> impl IntoResponse {
return GetIndexResponse {}.into_response();
}
async fn hello() -> impl IntoResponse {
return HelloResponse {
name: "Theo".to_string(),
}
.into_response();
}
pub fn get_router(assets_path: &Path) -> axum::Router {
let router = axum::Router::new()
.nest_service("/assets", ServeDir::new(assets_path))
.route("/", axum::routing::get(root))
.route("/hello", axum::routing::get(hello));
router
}

14
crates/app/src/main.rs Normal file
View File

@ -0,0 +1,14 @@
use ::app::get_router;
use std::path::Path;
use std::env;
#[tokio::main]
async fn main() {
let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
let assets_path = Path::new(&manifest_dir).join("assets");
let router = get_router(assets_path.as_path());
// TODO: select port based on available port (or ask in CLI)
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, router).await.unwrap();
}

View File

@ -0,0 +1,7 @@
use askama::Template;
#[derive(Template)]
#[template(path = "hello.html")]
pub struct HelloResponse {
pub name: String,
}

View File

@ -0,0 +1,5 @@
use askama::Template;
#[derive(Template)]
#[template(path = "index.html")]
pub struct GetIndexResponse;

View File

@ -0,0 +1,2 @@
pub mod index;
pub mod hello;

View File

@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<title>{% block title %}{{ title }}{% endblock %}</title>
<script src="/assets/js/htmx.min.js.js"></script>
{% block head %}{% endblock %}
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>

View File

@ -0,0 +1 @@
<div>Hello {{name}}!</div>

View File

@ -0,0 +1,23 @@
{% extends "base.html" %}
{% block title %}Pharma Libre{% endblock %}
{% block body %}
<div>
<header>
<h1>Pharma Libre</h1>
</header>
<main>
<div
id="hello"
hx-get="/hello"
hx-target="this"
hx-trigger="load"
hx-swap="outerHTML"
>
Loading...
</div>
</main>
</div>
{% endblock %}

7
crates/desktop/.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
# Generated by Cargo
# will have compiled files and executables
/target/
# Generated by Tauri
# will have schema files for capabilities auto-completion
/gen/schemas

22
crates/desktop/Cargo.toml Normal file
View File

@ -0,0 +1,22 @@
[package]
name = "desktop"
version = "0.1.0"
description = "Un logiciel de pharmacie libre et open-source."
authors = ["p4pillon"]
edition = "2021"
[lib]
name = "desktop_lib"
crate-type = ["lib", "cdylib", "staticlib"]
[build-dependencies]
tauri-build = { version = "2.0.0-beta", features = [] }
[dependencies]
axum = "0.7.5"
tauri = { version = "2.0.0-beta", features = [] }
tower = "0.4.13"
tokio = "1.39.1"
app = { path = "../app" }

3
crates/desktop/build.rs Normal file
View File

@ -0,0 +1,3 @@
fn main() {
tauri_build::build()
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 974 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 903 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

70
crates/desktop/src/lib.rs Normal file
View File

@ -0,0 +1,70 @@
use core::panic;
use std::sync::Arc;
use tauri::{path::BaseDirectory, Manager};
use tokio::sync::{Mutex, MutexGuard};
use tower::{Service, ServiceExt};
async fn process_tauri_request(
request: tauri::http::Request<Vec<u8>>,
mut router: MutexGuard<'_, axum::Router>,
) -> tauri::http::Response<Vec<u8>> {
let (parts, body) = request.into_parts();
let body = axum::body::Body::from(body);
let request = axum::extract::Request::from_parts(parts, body);
let response = match router.as_service().ready().await {
Ok(ready_service) => ready_service.call(request).await,
Err(_error) => panic!("Failed to get ready service"),
};
let response = match response {
Ok(response) => response,
Err(_error) => panic!("Problem getting response from request."),
};
let (parts, body) = response.into_parts();
let body = match axum::body::to_bytes(body, usize::MAX).await {
Ok(bytes) => bytes.to_vec(),
Err(_error) => panic!("Problem converting response body to bytes."),
};
let response = tauri::http::Response::from_parts(parts, body);
response
}
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
.setup(|app| {
let resource_path_buf = app
.path()
.resolve("assets", BaseDirectory::Resource)
.expect("Path should be resolvable");
let router = Arc::new(Mutex::new(
app::get_router(resource_path_buf.as_path()).clone(),
));
// Adds the router to the application state
// This makes it so we can retrieve it from any app instance (see bellow)
app.manage(router);
Ok(())
})
.register_asynchronous_uri_scheme_protocol("axum", move |app, request, responder| {
let router = Arc::clone(&app.state::<Arc<Mutex<axum::Router>>>());
tauri::async_runtime::spawn(async move {
let router = router.lock().await;
let response = process_tauri_request(request, router).await;
responder.respond(response);
});
})
.run(tauri::generate_context!())
.expect("error while running tauri application");
}

View File

@ -0,0 +1,6 @@
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
fn main() {
desktop_lib::run()
}

View File

@ -0,0 +1,41 @@
{
"productName": "Logiciel Pharma",
"version": "0.0.1",
"identifier": "org.p4pillon.pharma.desktop",
"build": {
"beforeDevCommand": {
"script": "cargo run",
"cwd": "../clego"
},
"devUrl": "http://localhost:3000",
"frontendDist": "axum://place.holder/"
},
"app": {
"withGlobalTauri": true,
"windows": [
{
"title": "Logiciel Pharma",
"width": 800,
"height": 600
}
],
"security": {
"csp": null
}
},
"bundle": {
"active": true,
"resources": {
"../app/assets/": "./assets/"
},
"targets": "all",
"icon": [
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.icns",
"icons/icon.ico"
]
}
}

View File

@ -0,0 +1,6 @@
[package]
name = "sesam-vitale"
version = "0.1.0"
edition = "2021"
[dependencies]

View File

@ -0,0 +1,14 @@
pub fn add(left: usize, right: usize) -> usize {
left + right
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,36 +0,0 @@
@echo off
rem Set variables
set SRC_DIR=src
set LIB_DIR=lib
rem Create the %LIB_DIR% directory if it does not exist
if not exist %LIB_DIR% mkdir %LIB_DIR%
if "%1"=="/clean" (
goto clean
)
rem Configure the environment for Visual Studio
call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
rem Build %SRC_DIR%\*.c files
cl /c /Fd:%LIB_DIR%\ /Fo:%LIB_DIR%\ /Iinclude\ /I%SRC_DIR%\ %SRC_DIR%\*.c
rem Link the object files into a static library
lib %LIB_DIR%\*.obj
rem Create a ssvw64.lib file from a ssvw64.def file
lib /def:%SRC_DIR%\ssvw64.def /out:%LIB_DIR%\ssvw64.lib /machine:x64
rem Build complete
pause
exit /b 0
:clean
del %LIB_DIR%\*.obj
del %LIB_DIR%\*.lib
del %LIB_DIR%\*.exp
rem Clean complete
pause
exit /b 0

View File

@ -1,32 +0,0 @@
# Detect the operating system
ifeq ($(OS),Windows_NT)
MKDIR = if not exist $(LIB_DIR) mkdir $(LIB_DIR)
RM = del
else
MKDIR = mkdir -p $(LIB_DIR)
RM = rm -f
endif
CC = gcc
AR = ar
CFLAGS = -Wall -fPIC
SRC_DIR = src
LIB_DIR = lib
SRC_FILES = $(wildcard $(SRC_DIR)/*.c)
OBJ_FILES = $(SRC_FILES:$(SRC_DIR)/%.c=$(LIB_DIR)/%.o)
STATIC_LIB = $(LIB_DIR)/libp4pillondebuglib.a
all: $(STATIC_LIB)
$(STATIC_LIB): $(OBJ_FILES)
$(MKDIR)
$(AR) rcs $@ $^
$(LIB_DIR)/%.o: $(SRC_DIR)/%.c
$(MKDIR)
$(CC) $(CFLAGS) -c $< -o $@
clean:
$(RM) $(OBJ_FILES) $(STATIC_LIB)
.PHONY: all clean

0
scripts/.gitkeep Normal file
View File

View File

@ -1,7 +0,0 @@
mod p4pillondebuglib_demo;
mod ssvlib_demo;
fn main() {
p4pillondebuglib_demo::demo();
ssvlib_demo::demo();
}

View File

@ -1,57 +0,0 @@
// mylib.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* hello() {
return "Hello, World!";
}
char* helloName(const char *name) {
char *result = (char *)malloc(strlen(name) + 9);
if (result) {
sprintf(result, "Hello, %s!", name);
}
return result;
}
void helloPtr(char *result) {
sprintf(result, "Hello, World!");
}
void helloPtrPtr(char **result, size_t *size) {
const char *message = "Hello, World!";
*size = strlen(message) + 1; // +1 for null terminator
*result = (char *)malloc(*size);
if (*result) {
strcpy(*result, message);
}
}
void helloVoidPtrPtr(void **result, size_t *size) {
const char *message = "Hello, World!";
*size = strlen(message) + 1; // +1 for null terminator
*result = malloc(*size);
if (*result != NULL) {
strcpy((char *)*result, message);
}
}
int add(int a, int b) {
return a + b;
}
// Add function returning result in a pointer
void addPtr(int a, int b, int *result) {
*result = a + b;
}
void fillHexValues(void **result, size_t *size) {
unsigned char values[5] = {0x05, 0xE7, 0x02, 0x00, 0x00};
*size = sizeof(values);
*result = malloc(*size);
if (*result != NULL) {
memcpy(*result, values, *size);
}
}

View File

@ -1,15 +0,0 @@
#ifndef P4PILLONDEBUGLIB_H
#define P4PILLONDEBUGLIB_H
#include <stddef.h>
char* hello();
char* helloName(const char *name);
void helloPtr(char *result);
void helloPtrPtr(char **result, size_t *size);
void helloVoidPtrPtr(void **result, size_t *size);
int add(int a, int b);
void addPtr(int a, int b, int *result);
void fillHexValues(void **result, size_t *size);
#endif // P4PILLONDEBUGLIB_H

View File

@ -1,101 +0,0 @@
extern crate libc;
use libc::{ c_char, c_int, c_void, size_t };
use std::ffi::{ CStr, CString };
use std::ptr;
#[link(name = "p4pillondebuglib")]
extern "C" {
fn hello() -> *const c_char;
fn helloName(name: *const c_char) -> *const c_char;
fn helloPtr(result: *mut c_char);
fn helloPtrPtr(result: *mut *mut c_char, size: *mut size_t);
fn helloVoidPtrPtr(result: *mut *mut c_void, size: *mut size_t);
fn add(a: c_int, b: c_int) -> c_int;
fn addPtr(a: c_int, b: c_int, result: *mut c_int);
fn fillHexValues(result: *mut *mut c_void, size: *mut size_t);
}
pub fn demo() {
println!("------- Demo for the P4PillonDebugLib ---");
unsafe {
let c_str = hello();
let r_str: &str = CStr::from_ptr(c_str).to_str().unwrap();
println!("{} from C", r_str);
}
let name = CString::new("John").expect("CString::new failed");
unsafe {
let c_str = helloName(name.as_ptr());
let r_str = CStr::from_ptr(c_str).to_str().expect("Conversion failed");
println!("{} from C with name", r_str);
libc::free(c_str as *mut c_void);
}
let mut buffer: [c_char; 50] = [0; 50];
unsafe {
helloPtr(buffer.as_mut_ptr());
let c_str = CStr::from_ptr(buffer.as_ptr());
let r_str = c_str.to_str().unwrap();
println!("{} from C Ptr", r_str);
}
let mut buffer: *mut c_char = ptr::null_mut();
let mut size: size_t = 0;
unsafe {
helloPtrPtr(&mut buffer, &mut size);
if !buffer.is_null() {
let c_str = CStr::from_ptr(buffer);
let r_str = c_str.to_str().unwrap();
println!("{} from C Ptr Ptr (size: {})", r_str, size);
libc::free(buffer as *mut c_void);
}
}
let mut buffer: *mut c_void = ptr::null_mut();
let mut size: size_t = 0;
unsafe {
helloVoidPtrPtr(&mut buffer, &mut size);
if !buffer.is_null() {
let c_str = CStr::from_ptr(buffer as *const c_char);
let r_str = c_str.to_str().unwrap();
println!("{} from C Void Ptr Ptr (size: {})", r_str, size);
libc::free(buffer);
}
}
unsafe {
let result = add(1, 2);
println!("Result of 1 + 2 = {}", result);
}
unsafe {
let mut result = 0;
addPtr(1, 2, &mut result);
println!("Result Ptr of 1 + 2 = {}", result);
}
let mut buffer: *mut c_void = ptr::null_mut();
let mut size: size_t = 0;
unsafe {
fillHexValues(&mut buffer, &mut size);
if !buffer.is_null() {
let hex_values = std::slice::from_raw_parts(buffer as *const u8, size);
for &byte in hex_values {
print!("{:02X} ", byte);
}
println!();
libc::free(buffer);
}
}
println!("-----------------------------------------");
}

View File

@ -1,84 +0,0 @@
extern crate libc;
extern crate dotenv;
use libc::{ c_char, c_void, c_ushort, size_t };
use std::ffi::CString;
use std::ptr;
use dotenv::dotenv;
use std::env;
extern "C" {
fn SSV_InitLIB2(pcRepSesamIni: *const c_char) -> c_ushort;
fn SSV_LireCartePS(NomRessourcePS: *const c_char, NomRessourceLecteur: *const c_char, CodePorteurPS: *const c_char, ZDonneesSortie: *mut *mut c_void, TTailleDonneesSortie: *mut size_t) -> c_ushort;
fn SSV_LireConfig(ZDonneesSortie: *mut *mut c_void, TTailleDonneesSortie: *mut size_t) -> c_ushort;
}
fn ssv_init_lib_2() {
let ini_str = env::var("SESAM_INI_PATH").expect("SESAM_INI_PATH must be set");
let ini = CString::new(ini_str).expect("CString::new failed");
unsafe {
let result = SSV_InitLIB2(ini.as_ptr());
println!("SSV_InitLIB2 result: {}", result);
}
}
fn ssv_lire_carte_ps() {
let resource_ps = CString::new("PS").expect("CString::new failed");
let resource_reader = CString::new("TRANSPA1").expect("CString::new failed");
let card_number = CString::new("1234567890").expect("CString::new failed");
let mut buffer: *mut c_void = ptr::null_mut();
let mut size: size_t = 0;
unsafe {
let result = SSV_LireCartePS(
resource_ps.as_ptr(),
resource_reader.as_ptr(),
card_number.as_ptr(),
&mut buffer,
&mut size
);
println!("SSV_LireCartePS result: {}", result);
if !buffer.is_null() {
let hex_values = std::slice::from_raw_parts(buffer as *const u8, size);
for &byte in hex_values {
print!("{:02X} ", byte);
}
println!();
libc::free(buffer);
}
}
}
fn ssv_lire_config() {
let mut buffer: *mut c_void = ptr::null_mut();
let mut size: size_t = 0;
unsafe {
let result = SSV_LireConfig(&mut buffer, &mut size);
println!("SSV_LireConfig result: {}", result);
if !buffer.is_null() {
let hex_values = std::slice::from_raw_parts(buffer as *const u8, size);
for &byte in hex_values {
print!("{:02X} ", byte);
}
println!();
libc::free(buffer);
}
}
}
pub fn demo() {
dotenv().ok();
println!("------- Demo for the SSV library --------");
ssv_init_lib_2();
ssv_lire_carte_ps();
ssv_lire_config();
println!("-----------------------------------------");
}

View File

@ -1,5 +0,0 @@
LIBRARY "ssvw64"
EXPORTS
SSV_InitLIB2
SSV_LireCartePS
SSV_LireConfig