Add support for QByteArray

master
Jos van den Oever 2017-08-08 20:50:36 +02:00
parent 81b9aa29e5
commit 08753ff63a
4 changed files with 45 additions and 4 deletions

View File

@ -22,6 +22,10 @@
"name": "misc", "name": "misc",
"type": "QVariant", "type": "QVariant",
"write": true "write": true
}, {
"name": "icon",
"type": "QByteArray",
"write": true
}] }]
}] }]
} }

View File

@ -8,6 +8,7 @@ pub struct Test {
age: c_int, age: c_int,
active: bool, active: bool,
misc: Variant, misc: Variant,
icon: Vec<u8>,
} }
impl TestTrait for Test { impl TestTrait for Test {
@ -18,6 +19,7 @@ impl TestTrait for Test {
age: 0, age: 0,
active: true, active: true,
misc: Variant::None, misc: Variant::None,
icon: Vec::new(),
} }
} }
fn emit(&self) -> &TestEmitter { fn emit(&self) -> &TestEmitter {
@ -47,4 +49,11 @@ impl TestTrait for Test {
self.misc = value; self.misc = value;
self.emit.misc_changed(); self.emit.misc_changed();
} }
fn get_icon(&self) -> Vec<u8> {
self.icon.clone()
}
fn set_icon(&mut self, value: Vec<u8>) {
self.icon = value;
self.emit.icon_changed();
}
} }

View File

@ -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<u8> {
let data = unsafe { slice::from_raw_parts(self.data, self.len as usize) };
Vec::from(data)
}
}
impl<'a> From<&'a Vec<u8>> for QByteArray {
fn from(value: &'a Vec<u8>) -> QByteArray {
QByteArray {
len: value.len() as c_int,
data: value.as_ptr(),
}
}
}
pub enum Variant { pub enum Variant {
None, None,
Bool(bool), Bool(bool),

View File

@ -250,6 +250,10 @@ namespace {
const char* data; const char* data;
int len; int len;
public: public:
qbytearray_t(const QByteArray& v):
data(v.data()),
len(v.size()) {
}
operator QByteArray() const { operator QByteArray() const {
return QByteArray(data, len); return QByteArray(data, len);
} }
@ -336,6 +340,10 @@ typedef void (*qstring_set)(QString*, qstring_t*);
void set_qstring(QString* v, qstring_t* val) { void set_qstring(QString* v, qstring_t* val) {
*v = *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*); typedef void (*qvariant_set)(QVariant*, qvariant_t*);
void set_qvariant(QVariant* v, qvariant_t* val) { void set_qvariant(QVariant* v, qvariant_t* val) {
*v = variant(*val); *v = variant(*val);
@ -355,11 +363,9 @@ extern "C" {
} }
QString rustType(const Property& p) { QString rustType(const Property& p) {
/* if (p.type == "QByteArray") {
if (p.type == "QVariant") { return "Vec<u8>";
return "Variant";
} }
*/
if (p.type.startsWith("Q")) { if (p.type.startsWith("Q")) {
return p.type.mid(1); return p.type.mid(1);
} }