diff --git a/demo/rust/src/interface.rs b/demo/rust/src/interface.rs index 1cea817..538557c 100644 --- a/demo/rust/src/interface.rs +++ b/demo/rust/src/interface.rs @@ -1,8 +1,9 @@ /* generated by rust_qt_binding_generator */ #![allow(unknown_lints)] #![allow(mutex_atomic, needless_pass_by_value)] -use libc::{c_int, c_void, uint8_t, uint16_t}; +use libc::{c_char, c_ushort, c_int, c_void, uint8_t, uint16_t}; use std::slice; +use std::char::decode_utf16; use std::sync::{Arc, Mutex}; use std::ptr::null; @@ -36,65 +37,20 @@ where } -#[repr(C)] -pub struct QString { - data: *const uint8_t, - len: c_int, -} +pub enum QString {} -#[repr(C)] -pub struct QStringIn { - data: *const uint16_t, - len: c_int, -} - -impl QStringIn { - fn convert(&self) -> String { - let data = unsafe { slice::from_raw_parts(self.data, self.len as usize) }; - String::from_utf16_lossy(data) - } -} - -impl<'a> From<&'a str> for QString { - fn from(string: &'a str) -> QString { - QString { - len: string.len() as c_int, - data: string.as_ptr(), - } - } -} - -impl<'a> From<&'a String> for QString { - fn from(string: &'a String) -> QString { - QString { - len: string.len() as c_int, - data: string.as_ptr(), - } - } +fn set_string_from_utf16(s: &mut String, str: *const c_ushort, len: c_int) { + let utf16 = unsafe { slice::from_raw_parts(str, len as usize) }; + let characters = decode_utf16(utf16.iter().cloned()) + .into_iter() + .map(|r| r.unwrap()); + s.clear(); + s.extend(characters); } -#[repr(C)] -pub struct QByteArray { - data: *const uint8_t, - len: c_int, -} -impl QByteArray { - fn convert(&self) -> Vec { - let data = unsafe { slice::from_raw_parts(self.data, self.len as usize) }; - Vec::from(data) - } -} - -impl<'a> From<&'a [u8]> for QByteArray { - fn from(value: &'a [u8]) -> QByteArray { - QByteArray { - len: value.len() as c_int, - data: value.as_ptr(), - } - } -} +pub enum QByteArray {} #[repr(C)] @@ -508,13 +464,15 @@ pub unsafe extern "C" fn fibonacci_list_sort( } #[no_mangle] -pub unsafe extern "C" fn fibonacci_list_data_fibonacci_number(ptr: *const FibonacciList, row: c_int) -> u64 { - (&*ptr).fibonacci_number(row as usize).into() +pub extern "C" fn fibonacci_list_data_fibonacci_number(ptr: *const FibonacciList, row: c_int) -> u64 { + let o = unsafe { &*ptr }; + o.fibonacci_number(row as usize).into() } #[no_mangle] -pub unsafe extern "C" fn fibonacci_list_data_row(ptr: *const FibonacciList, row: c_int) -> u64 { - (&*ptr).row(row as usize).into() +pub extern "C" fn fibonacci_list_data_row(ptr: *const FibonacciList, row: c_int) -> u64 { + let o = unsafe { &*ptr }; + o.row(row as usize).into() } pub struct FileSystemTreeQObject {} @@ -641,24 +599,30 @@ pub unsafe extern "C" fn file_system_tree_free(ptr: *mut FileSystemTree) { } #[no_mangle] -pub unsafe extern "C" fn file_system_tree_path_get( +pub extern "C" fn file_system_tree_path_get( ptr: *const FileSystemTree, p: *mut c_void, - set: fn(*mut c_void, QString), + set: fn(*mut c_void, *const c_char, c_int), ) { - let data = (&*ptr).path(); - if let Some(data) = data { - set(p, data.into()); + let o = unsafe { &*ptr }; + let v = o.path(); + if let Some(v) = v { + let s: *const c_char = v.as_ptr() as (*const c_char); + set(p, s, v.len() as c_int); } } #[no_mangle] -pub unsafe extern "C" fn file_system_tree_path_set(ptr: *mut FileSystemTree, v: QStringIn) { - (&mut *ptr).set_path(Some(v.convert())); +pub extern "C" fn file_system_tree_path_set(ptr: *mut FileSystemTree, v: *const c_ushort, len: c_int) { + let o = unsafe { &mut *ptr }; + let mut s = String::new(); + set_string_from_utf16(&mut s, v, len); + o.set_path(Some(s)); } #[no_mangle] -pub unsafe extern "C" fn file_system_tree_path_set_none(ptr: *mut FileSystemTree) { - (&mut *ptr).set_path(None); +pub extern "C" fn file_system_tree_path_set_none(ptr: *mut FileSystemTree) { + let o = unsafe { &mut *ptr }; + o.set_path(None); } #[no_mangle] @@ -734,50 +698,59 @@ pub unsafe extern "C" fn file_system_tree_row(ptr: *const FileSystemTree, item: } #[no_mangle] -pub unsafe extern "C" fn file_system_tree_data_file_icon( +pub extern "C" fn file_system_tree_data_file_icon( ptr: *const FileSystemTree, item: usize, - d: *mut c_void, - set: fn(*mut c_void, QByteArray), + d: *mut QString, + set: fn(*mut QString, *const c_char, len: c_int), ) { - let data = (&*ptr).file_icon(item); - set(d, (data).into()); + let o = unsafe { &*ptr }; + let data = o.file_icon(item); + let s: *const c_char = data.as_ptr() as (*const c_char); + set(d, s, data.len() as c_int); } #[no_mangle] -pub unsafe extern "C" fn file_system_tree_data_file_name( +pub extern "C" fn file_system_tree_data_file_name( ptr: *const FileSystemTree, item: usize, - d: *mut c_void, - set: fn(*mut c_void, QString), + d: *mut QString, + set: fn(*mut QString, *const c_char, len: c_int), ) { - let data = (&*ptr).file_name(item); - set(d, (&data).into()); + let o = unsafe { &*ptr }; + let data = o.file_name(item); + let s: *const c_char = data.as_ptr() as (*const c_char); + set(d, s, data.len() as c_int); } #[no_mangle] -pub unsafe extern "C" fn file_system_tree_data_file_path( +pub extern "C" fn file_system_tree_data_file_path( ptr: *const FileSystemTree, item: usize, - d: *mut c_void, - set: fn(*mut c_void, QString), + d: *mut QString, + set: fn(*mut QString, *const c_char, len: c_int), ) { - let data = (&*ptr).file_path(item); + let o = unsafe { &*ptr }; + let data = o.file_path(item); if let Some(data) = data { - set(d, QString::from(&data)); + let s: *const c_char = data.as_ptr() as (*const c_char); + set(d, s, data.len() as c_int); } } #[no_mangle] -pub unsafe extern "C" fn file_system_tree_data_file_permissions(ptr: *const FileSystemTree, item: usize) -> i32 { - (&*ptr).file_permissions(item).into() +pub extern "C" fn file_system_tree_data_file_permissions(ptr: *const FileSystemTree, item: usize) -> i32 { + let o = unsafe { &*ptr }; + o.file_permissions(item).into() } #[no_mangle] -pub unsafe extern "C" fn file_system_tree_data_file_size(ptr: *const FileSystemTree, item: usize) -> COption { - (&*ptr).file_size(item).into() +pub extern "C" fn file_system_tree_data_file_size(ptr: *const FileSystemTree, item: usize) -> COption { + let o = unsafe { &*ptr }; + o.file_size(item).into() } #[no_mangle] -pub unsafe extern "C" fn file_system_tree_data_file_type(ptr: *const FileSystemTree, item: usize) -> i32 { - (&*ptr).file_type(item).into() +pub extern "C" fn file_system_tree_data_file_type(ptr: *const FileSystemTree, item: usize) -> i32 { + let o = unsafe { &*ptr }; + o.file_type(item).into() } pub struct ProcessesQObject {} @@ -987,48 +960,57 @@ pub unsafe extern "C" fn processes_row(ptr: *const Processes, item: usize) -> c_ } #[no_mangle] -pub unsafe extern "C" fn processes_data_cmd( +pub extern "C" fn processes_data_cmd( ptr: *const Processes, item: usize, - d: *mut c_void, - set: fn(*mut c_void, QString), + d: *mut QString, + set: fn(*mut QString, *const c_char, len: c_int), ) { - let data = (&*ptr).cmd(item); - set(d, (&data).into()); + let o = unsafe { &*ptr }; + let data = o.cmd(item); + let s: *const c_char = data.as_ptr() as (*const c_char); + set(d, s, data.len() as c_int); } #[no_mangle] -pub unsafe extern "C" fn processes_data_cpu_percentage(ptr: *const Processes, item: usize) -> u8 { - (&*ptr).cpu_percentage(item).into() +pub extern "C" fn processes_data_cpu_percentage(ptr: *const Processes, item: usize) -> u8 { + let o = unsafe { &*ptr }; + o.cpu_percentage(item).into() } #[no_mangle] -pub unsafe extern "C" fn processes_data_cpu_usage(ptr: *const Processes, item: usize) -> f32 { - (&*ptr).cpu_usage(item).into() +pub extern "C" fn processes_data_cpu_usage(ptr: *const Processes, item: usize) -> f32 { + let o = unsafe { &*ptr }; + o.cpu_usage(item).into() } #[no_mangle] -pub unsafe extern "C" fn processes_data_memory(ptr: *const Processes, item: usize) -> u64 { - (&*ptr).memory(item).into() +pub extern "C" fn processes_data_memory(ptr: *const Processes, item: usize) -> u64 { + let o = unsafe { &*ptr }; + o.memory(item).into() } #[no_mangle] -pub unsafe extern "C" fn processes_data_name( +pub extern "C" fn processes_data_name( ptr: *const Processes, item: usize, - d: *mut c_void, - set: fn(*mut c_void, QString), + d: *mut QString, + set: fn(*mut QString, *const c_char, len: c_int), ) { - let data = (&*ptr).name(item); - set(d, (data).into()); + let o = unsafe { &*ptr }; + let data = o.name(item); + let s: *const c_char = data.as_ptr() as (*const c_char); + set(d, s, data.len() as c_int); } #[no_mangle] -pub unsafe extern "C" fn processes_data_pid(ptr: *const Processes, item: usize) -> u32 { - (&*ptr).pid(item).into() +pub extern "C" fn processes_data_pid(ptr: *const Processes, item: usize) -> u32 { + let o = unsafe { &*ptr }; + o.pid(item).into() } #[no_mangle] -pub unsafe extern "C" fn processes_data_uid(ptr: *const Processes, item: usize) -> u32 { - (&*ptr).uid(item).into() +pub extern "C" fn processes_data_uid(ptr: *const Processes, item: usize) -> u32 { + let o = unsafe { &*ptr }; + o.uid(item).into() } pub struct TimeSeriesQObject {} @@ -1172,8 +1154,9 @@ pub unsafe extern "C" fn time_series_sort( } #[no_mangle] -pub unsafe extern "C" fn time_series_data_cos(ptr: *const TimeSeries, row: c_int) -> f32 { - (&*ptr).cos(row as usize).into() +pub extern "C" fn time_series_data_cos(ptr: *const TimeSeries, row: c_int) -> f32 { + let o = unsafe { &*ptr }; + o.cos(row as usize).into() } #[no_mangle] @@ -1185,8 +1168,9 @@ pub unsafe extern "C" fn time_series_set_data_cos( } #[no_mangle] -pub unsafe extern "C" fn time_series_data_sin(ptr: *const TimeSeries, row: c_int) -> f32 { - (&*ptr).sin(row as usize).into() +pub extern "C" fn time_series_data_sin(ptr: *const TimeSeries, row: c_int) -> f32 { + let o = unsafe { &*ptr }; + o.sin(row as usize).into() } #[no_mangle] @@ -1198,8 +1182,9 @@ pub unsafe extern "C" fn time_series_set_data_sin( } #[no_mangle] -pub unsafe extern "C" fn time_series_data_time(ptr: *const TimeSeries, row: c_int) -> f32 { - (&*ptr).time(row as usize).into() +pub extern "C" fn time_series_data_time(ptr: *const TimeSeries, row: c_int) -> f32 { + let o = unsafe { &*ptr }; + o.time(row as usize).into() } #[no_mangle] diff --git a/demo/src/Bindings.cpp b/demo/src/Bindings.cpp index b7e76dc..47aa898 100644 --- a/demo/src/Bindings.cpp +++ b/demo/src/Bindings.cpp @@ -39,40 +39,15 @@ namespace { } }; - struct qstring_t { - private: - const void* data; - int len; - public: - qstring_t(const QString& v): - data(static_cast(v.utf16())), - len(v.size()) { - } - operator QString() const { - return QString::fromUtf8(static_cast(data), len); - } - }; - typedef void (*qstring_set)(QString*, qstring_t*); - void set_qstring(QString* v, qstring_t* val) { - *v = *val; + typedef void (*qstring_set)(QString* val, const char* utf8, int nbytes); + void set_qstring(QString* val, const char* utf8, int nbytes) { + *val = QString::fromUtf8(utf8, nbytes); } - struct qbytearray_t { - private: - const char* data; - int len; - public: - qbytearray_t(const QByteArray& v): - data(v.data()), - len(v.size()) { - } - operator QByteArray() const { - return QByteArray(data, len); - } - }; - typedef void (*qbytearray_set)(QByteArray*, qbytearray_t*); - void set_qbytearray(QByteArray* v, qbytearray_t* val) { - *v = *val; + typedef void (*qbytearray_set)(QByteArray* val, const char* bytes, int nbytes); + void set_qbytearray(QByteArray* v, const char* bytes, int nbytes) { + v->truncate(0); + v->append(bytes, nbytes); } struct qmodelindex_t { @@ -516,7 +491,7 @@ extern "C" { void (*)(FileSystemTree*)); void file_system_tree_free(FileSystemTree::Private*); void file_system_tree_path_get(const FileSystemTree::Private*, QString*, qstring_set); - void file_system_tree_path_set(FileSystemTree::Private*, qstring_t); + void file_system_tree_path_set(FileSystemTree::Private*, const ushort *str, int len); void file_system_tree_path_set_none(FileSystemTree::Private*); }; @@ -1380,7 +1355,7 @@ void FileSystemTree::setPath(const QString& v) { if (v.isNull()) { file_system_tree_path_set_none(m_d); } else { - file_system_tree_path_set(m_d, v); + file_system_tree_path_set(m_d, reinterpret_cast(v.data()), v.size()); } } Processes::Processes(bool /*owned*/, QObject *parent): diff --git a/src/rust.cpp b/src/rust.cpp index 41448d9..61ed2c5 100644 --- a/src/rust.cpp +++ b/src/rust.cpp @@ -607,33 +607,33 @@ pub extern "C" fn %2_data_%3( d: *mut QString, set: fn(*mut QString, *const c_char, len: c_int), ) { - let o = unsafe { & *ptr }; + let o = unsafe { &*ptr }; let data = o.%3(%6); let s: *const c_char = data.as_ptr() as (*const c_char); - set(d, s, data.len() as i32); + set(d, s, data.len() as c_int); } )").arg(o.name, lcname, snakeCase(ip.name), indexDecl, index); } else if (ip.type.name == "QString") { r << QString(R"( #[no_mangle] pub extern "C" fn %2_data_%3( - ptr: *const %1%5, + ptr: *const %1%4, d: *mut QString, set: fn(*mut QString, *const c_char, len: c_int), ) { - let o = unsafe { &mut *ptr }; - let data = o.%3(%6); + let o = unsafe { &*ptr }; + let data = o.%3(%5); if let Some(data) = data { let s: *const c_char = data.as_ptr() as (*const c_char); - set(d, s, data.len()); + set(d, s, data.len() as c_int); } } -)").arg(o.name, lcname, snakeCase(ip.name), ip.type.name, indexDecl, index); +)").arg(o.name, lcname, snakeCase(ip.name), indexDecl, index); } else { r << QString(R"( #[no_mangle] pub extern "C" fn %2_data_%3(ptr: *const %1%5) -> %4 { - let o = unsafe { &mut *ptr }; + let o = unsafe { &*ptr }; o.%3(%6).into() } )").arg(o.name, lcname, snakeCase(ip.name), rustCType(ip), indexDecl, index); diff --git a/tests/rust_list/src/interface.rs b/tests/rust_list/src/interface.rs index af00e77..0cb3d18 100644 --- a/tests/rust_list/src/interface.rs +++ b/tests/rust_list/src/interface.rs @@ -204,10 +204,10 @@ pub extern "C" fn persons_data_user_name( d: *mut QString, set: fn(*mut QString, *const c_char, len: c_int), ) { - let o = unsafe { & *ptr }; + let o = unsafe { &*ptr }; let data = o.user_name(row as usize); let s: *const c_char = data.as_ptr() as (*const c_char); - set(d, s, data.len() as i32); + set(d, s, data.len() as c_int); } #[no_mangle] diff --git a/tests/rust_objects/src/interface.rs b/tests/rust_objects/src/interface.rs index d500499..f0d4552 100644 --- a/tests/rust_objects/src/interface.rs +++ b/tests/rust_objects/src/interface.rs @@ -1,8 +1,9 @@ /* generated by rust_qt_binding_generator */ #![allow(unknown_lints)] #![allow(mutex_atomic, needless_pass_by_value)] -use libc::{c_int, c_void, uint8_t, uint16_t}; +use libc::{c_char, c_ushort, c_int, c_void, uint8_t, uint16_t}; use std::slice; +use std::char::decode_utf16; use std::sync::{Arc, Mutex}; use std::ptr::null; @@ -10,42 +11,17 @@ use std::ptr::null; use implementation::*; -#[repr(C)] -pub struct QString { - data: *const uint8_t, - len: c_int, +pub enum QString {} + +fn set_string_from_utf16(s: &mut String, str: *const c_ushort, len: c_int) { + let utf16 = unsafe { slice::from_raw_parts(str, len as usize) }; + let characters = decode_utf16(utf16.iter().cloned()) + .into_iter() + .map(|r| r.unwrap()); + s.clear(); + s.extend(characters); } -#[repr(C)] -pub struct QStringIn { - data: *const uint16_t, - len: c_int, -} - -impl QStringIn { - fn convert(&self) -> String { - let data = unsafe { slice::from_raw_parts(self.data, self.len as usize) }; - String::from_utf16_lossy(data) - } -} - -impl<'a> From<&'a str> for QString { - fn from(string: &'a str) -> QString { - QString { - len: string.len() as c_int, - data: string.as_ptr(), - } - } -} - -impl<'a> From<&'a String> for QString { - fn from(string: &'a String) -> QString { - QString { - len: string.len() as c_int, - data: string.as_ptr(), - } - } -} pub struct GroupQObject {} @@ -153,18 +129,23 @@ pub unsafe extern "C" fn inner_object_free(ptr: *mut InnerObject) { } #[no_mangle] -pub unsafe extern "C" fn inner_object_description_get( +pub extern "C" fn inner_object_description_get( ptr: *const InnerObject, p: *mut c_void, - set: fn(*mut c_void, QString), + set: fn(*mut c_void, *const c_char, c_int), ) { - let data = (&*ptr).description(); - set(p, data.into()); + let o = unsafe { &*ptr }; + let v = o.description(); + let s: *const c_char = v.as_ptr() as (*const c_char); + set(p, s, v.len() as c_int); } #[no_mangle] -pub unsafe extern "C" fn inner_object_description_set(ptr: *mut InnerObject, v: QStringIn) { - (&mut *ptr).set_description(v.convert()); +pub extern "C" fn inner_object_description_set(ptr: *mut InnerObject, v: *const c_ushort, len: c_int) { + let o = unsafe { &mut *ptr }; + let mut s = String::new(); + set_string_from_utf16(&mut s, v, len); + o.set_description(s); } pub struct PersonQObject {} diff --git a/tests/rust_tree/src/interface.rs b/tests/rust_tree/src/interface.rs index ae0dbf2..9ca9c83 100644 --- a/tests/rust_tree/src/interface.rs +++ b/tests/rust_tree/src/interface.rs @@ -1,8 +1,9 @@ /* generated by rust_qt_binding_generator */ #![allow(unknown_lints)] #![allow(mutex_atomic, needless_pass_by_value)] -use libc::{c_int, c_void, uint8_t, uint16_t}; +use libc::{c_char, c_ushort, c_int, c_void, uint8_t, uint16_t}; use std::slice; +use std::char::decode_utf16; use std::sync::{Arc, Mutex}; use std::ptr::null; @@ -36,42 +37,17 @@ where } -#[repr(C)] -pub struct QString { - data: *const uint8_t, - len: c_int, +pub enum QString {} + +fn set_string_from_utf16(s: &mut String, str: *const c_ushort, len: c_int) { + let utf16 = unsafe { slice::from_raw_parts(str, len as usize) }; + let characters = decode_utf16(utf16.iter().cloned()) + .into_iter() + .map(|r| r.unwrap()); + s.clear(); + s.extend(characters); } -#[repr(C)] -pub struct QStringIn { - data: *const uint16_t, - len: c_int, -} - -impl QStringIn { - fn convert(&self) -> String { - let data = unsafe { slice::from_raw_parts(self.data, self.len as usize) }; - String::from_utf16_lossy(data) - } -} - -impl<'a> From<&'a str> for QString { - fn from(string: &'a str) -> QString { - QString { - len: string.len() as c_int, - data: string.as_ptr(), - } - } -} - -impl<'a> From<&'a String> for QString { - fn from(string: &'a String) -> QString { - QString { - len: string.len() as c_int, - data: string.as_ptr(), - } - } -} #[repr(C)] @@ -267,19 +243,24 @@ pub unsafe extern "C" fn persons_row(ptr: *const Persons, item: usize) -> c_int } #[no_mangle] -pub unsafe extern "C" fn persons_data_user_name( +pub extern "C" fn persons_data_user_name( ptr: *const Persons, item: usize, - d: *mut c_void, - set: fn(*mut c_void, QString), + d: *mut QString, + set: fn(*mut QString, *const c_char, len: c_int), ) { - let data = (&*ptr).user_name(item); - set(d, (data).into()); + let o = unsafe { &*ptr }; + let data = o.user_name(item); + let s: *const c_char = data.as_ptr() as (*const c_char); + set(d, s, data.len() as c_int); } #[no_mangle] -pub unsafe extern "C" fn persons_set_data_user_name( +pub extern "C" fn persons_set_data_user_name( ptr: *mut Persons, item: usize, - v: QStringIn, + s: *const c_ushort, len: c_int, ) -> bool { - (&mut *ptr).set_user_name(item, v.convert()) + let o = unsafe { &mut *ptr }; + let mut v = String::new(); + set_string_from_utf16(&mut v, s, len); + o.set_user_name(item, v) } diff --git a/tests/test_objects_rust.cpp b/tests/test_objects_rust.cpp index 92db53e..cde6b6a 100644 --- a/tests/test_objects_rust.cpp +++ b/tests/test_objects_rust.cpp @@ -3,22 +3,9 @@ namespace { - struct qstring_t { - private: - const void* data; - int len; - public: - qstring_t(const QString& v): - data(static_cast(v.utf16())), - len(v.size()) { - } - operator QString() const { - return QString::fromUtf8(static_cast(data), len); - } - }; - typedef void (*qstring_set)(QString*, qstring_t*); - void set_qstring(QString* v, qstring_t* val) { - *v = *val; + typedef void (*qstring_set)(QString* val, const char* utf8, int nbytes); + void set_qstring(QString* val, const char* utf8, int nbytes) { + *val = QString::fromUtf8(utf8, nbytes); } inline void innerObjectDescriptionChanged(InnerObject* o) { @@ -35,7 +22,7 @@ extern "C" { InnerObject::Private* inner_object_new(InnerObject*, void (*)(InnerObject*)); void inner_object_free(InnerObject::Private*); void inner_object_description_get(const InnerObject::Private*, QString*, qstring_set); - void inner_object_description_set(InnerObject::Private*, qstring_t); + void inner_object_description_set(InnerObject::Private*, const ushort *str, int len); }; extern "C" { @@ -103,7 +90,7 @@ QString InnerObject::description() const return v; } void InnerObject::setDescription(const QString& v) { - inner_object_description_set(m_d, v); + inner_object_description_set(m_d, reinterpret_cast(v.data()), v.size()); } Person::Person(bool /*owned*/, QObject *parent): QObject(parent), diff --git a/tests/test_tree_rust.cpp b/tests/test_tree_rust.cpp index b1aaddf..f56c57c 100644 --- a/tests/test_tree_rust.cpp +++ b/tests/test_tree_rust.cpp @@ -15,22 +15,9 @@ namespace { } }; - struct qstring_t { - private: - const void* data; - int len; - public: - qstring_t(const QString& v): - data(static_cast(v.utf16())), - len(v.size()) { - } - operator QString() const { - return QString::fromUtf8(static_cast(data), len); - } - }; - typedef void (*qstring_set)(QString*, qstring_t*); - void set_qstring(QString* v, qstring_t* val) { - *v = *val; + typedef void (*qstring_set)(QString* val, const char* utf8, int nbytes); + void set_qstring(QString* val, const char* utf8, int nbytes) { + *val = QString::fromUtf8(utf8, nbytes); } struct qmodelindex_t { @@ -40,7 +27,7 @@ namespace { } extern "C" { void persons_data_user_name(const Persons::Private*, quintptr, QString*, qstring_set); - bool persons_set_data_user_name(Persons::Private*, quintptr, qstring_t); + bool persons_set_data_user_name(Persons::Private*, quintptr, const ushort* s, int len); void persons_sort(Persons::Private*, unsigned char column, Qt::SortOrder order = Qt::AscendingOrder); int persons_row_count(const Persons::Private*, quintptr, bool); @@ -140,7 +127,7 @@ QVariant Persons::userName(const QModelIndex& index) const bool Persons::setUserName(const QModelIndex& index, const QVariant& value) { bool set = false; - set = persons_set_data_user_name(m_d, index.internalId(), value.value()); + const QString s = value.value(); set = persons_set_data_user_name(m_d, index.internalId(), s.utf16(), s.length()); if (set) { emit dataChanged(index, index); }