summaryrefslogtreecommitdiff
path: root/crates/flasher-qt/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/flasher-qt/src/main.rs')
-rw-r--r--crates/flasher-qt/src/main.rs59
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())