From 08753ff63a35e51af53f0ed86e447da9d11acf99 Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Tue, 8 Aug 2017 20:50:36 +0200 Subject: [PATCH] Add support for QByteArray --- bindings.json | 4 ++++ common-rust/src/testimplementation.rs | 9 ++++++++ common-rust/src/types.rs | 22 +++++++++++++++++++ .../rust_qt_binding_generator.cpp | 14 ++++++++---- 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/bindings.json b/bindings.json index 2f01322..a9316c6 100644 --- a/bindings.json +++ b/bindings.json @@ -22,6 +22,10 @@ "name": "misc", "type": "QVariant", "write": true + }, { + "name": "icon", + "type": "QByteArray", + "write": true }] }] } diff --git a/common-rust/src/testimplementation.rs b/common-rust/src/testimplementation.rs index 4f9400d..b1a0933 100644 --- a/common-rust/src/testimplementation.rs +++ b/common-rust/src/testimplementation.rs @@ -8,6 +8,7 @@ pub struct Test { age: c_int, active: bool, misc: Variant, + icon: Vec, } impl TestTrait for Test { @@ -18,6 +19,7 @@ impl TestTrait for Test { age: 0, active: true, misc: Variant::None, + icon: Vec::new(), } } fn emit(&self) -> &TestEmitter { @@ -47,4 +49,11 @@ impl TestTrait for Test { self.misc = value; self.emit.misc_changed(); } + fn get_icon(&self) -> Vec { + self.icon.clone() + } + fn set_icon(&mut self, value: Vec) { + self.icon = value; + self.emit.icon_changed(); + } } diff --git a/common-rust/src/types.rs b/common-rust/src/types.rs index 87d10a8..0017d86 100644 --- a/common-rust/src/types.rs +++ b/common-rust/src/types.rs @@ -31,6 +31,28 @@ impl<'a> From<&'a String> for QString { } } +#[repr(C)] +pub struct QByteArray { + data: *const uint8_t, + len: c_int, +} + +impl QByteArray { + pub fn convert(&self) -> Vec { + let data = unsafe { slice::from_raw_parts(self.data, self.len as usize) }; + Vec::from(data) + } +} + +impl<'a> From<&'a Vec> for QByteArray { + fn from(value: &'a Vec) -> QByteArray { + QByteArray { + len: value.len() as c_int, + data: value.as_ptr(), + } + } +} + pub enum Variant { None, Bool(bool), diff --git a/rust_qt_binding_generator/rust_qt_binding_generator.cpp b/rust_qt_binding_generator/rust_qt_binding_generator.cpp index ecc59db..bb1b5cb 100644 --- a/rust_qt_binding_generator/rust_qt_binding_generator.cpp +++ b/rust_qt_binding_generator/rust_qt_binding_generator.cpp @@ -250,6 +250,10 @@ namespace { const char* data; int len; public: + qbytearray_t(const QByteArray& v): + data(v.data()), + len(v.size()) { + } operator QByteArray() const { return QByteArray(data, len); } @@ -336,6 +340,10 @@ typedef void (*qstring_set)(QString*, qstring_t*); void set_qstring(QString* v, qstring_t* val) { *v = *val; } +typedef void (*qbytearray_set)(QByteArray*, qbytearray_t*); +void set_qbytearray(QByteArray* v, qbytearray_t* val) { + *v = *val; +} typedef void (*qvariant_set)(QVariant*, qvariant_t*); void set_qvariant(QVariant* v, qvariant_t* val) { *v = variant(*val); @@ -355,11 +363,9 @@ extern "C" { } QString rustType(const Property& p) { -/* - if (p.type == "QVariant") { - return "Variant"; + if (p.type == "QByteArray") { + return "Vec"; } -*/ if (p.type.startsWith("Q")) { return p.type.mid(1); }