diff options
Diffstat (limited to 'crates/flasher-qt/src/main.rs')
| -rw-r--r-- | crates/flasher-qt/src/main.rs | 59 |
1 files changed, 22 insertions, 37 deletions
diff --git a/crates/flasher-qt/src/main.rs b/crates/flasher-qt/src/main.rs index e304418..243406b 100644 --- a/crates/flasher-qt/src/main.rs +++ b/crates/flasher-qt/src/main.rs @@ -1,43 +1,30 @@ -use std::{ - env, - ffi::CString, - fs, - os::raw::{c_char, c_int}, -}; +use cxx_qt_lib::{QByteArray, QGuiApplication, QQmlApplicationEngine, QString, QUrl}; +use std::fs; const BOARDS: &str = include_str!("../../../alt-rootfs-installer/SUPPORTED-BOARDS"); - -unsafe extern "C" { - fn run_qt_app( - argc: c_int, - argv: *mut *mut c_char, - boards: *const c_char, - drives: *const c_char, - ) -> c_int; -} +const QML: &str = include_str!("../qml/Main.qml"); fn main() { - let arguments: Vec<CString> = env::args() - .map(|arg| CString::new(arg).expect("application argument contains a NUL byte")) - .collect(); - let mut argument_pointers: Vec<*mut c_char> = arguments - .iter() - .map(|arg| arg.as_ptr().cast_mut()) - .collect(); - let boards = CString::new(BOARDS).expect("board list contains a NUL byte"); - let drives = CString::new(available_drives().join("\n")) - .expect("drive description contains a NUL byte"); + let mut app = QGuiApplication::new(); + app.pin_mut() + .set_application_name(&QString::from("ALT Image Writer")); + app.pin_mut() + .set_organization_name(&QString::from("ALT Linux")); + app.pin_mut() + .set_application_version(&QString::from(env!("CARGO_PKG_VERSION"))); - // QApplication only borrows argv and the two strings for the duration of - // this call; all backing CStrings remain alive until the event loop exits. - unsafe { - run_qt_app( - argument_pointers.len() as c_int, - argument_pointers.as_mut_ptr(), - boards.as_ptr(), - drives.as_ptr(), - ); - } + let boards = serde_json::to_string(BOARDS).expect("serialize supported boards"); + let drives = serde_json::to_string(&available_drives().join("\n")) + .expect("serialize available drives"); + let qml = QML + .replace("@SUPPORTED_BOARDS@", &boards) + .replace("@AVAILABLE_DRIVES@", &drives); + + let mut engine = QQmlApplicationEngine::new(); + engine + .pin_mut() + .load_data(&QByteArray::from(qml.as_str()), &QUrl::default()); + app.pin_mut().exec(); } fn available_drives() -> Vec<String> { @@ -45,7 +32,6 @@ fn available_drives() -> Vec<String> { let Ok(entries) = fs::read_dir("/sys/block") else { return drives; }; - for entry in entries.flatten() { let name = entry.file_name().to_string_lossy().into_owned(); if name.starts_with("loop") || name.starts_with("ram") || name.starts_with("zram") { @@ -57,7 +43,6 @@ fn available_drives() -> Vec<String> { if !removable && !name.starts_with("mmcblk") { continue; } - let sectors = fs::read_to_string(entry.path().join("size")) .ok() .and_then(|value| value.trim().parse::<u64>().ok()) |