use libc;
use std::mem::forget;
use std::slice::from_raw_parts_mut;
use qvariant::*;
use types::*;
use qmeta::*;
#[doc(hidden)]
#[derive(Debug)]
pub struct QObject {
ptr: DosQObject,
qmeta: DosQMetaObject,
binded_ptr: *mut libc::c_void,
}
extern "C" {
fn dos_qobject_create(dObjectPointer: *mut libc::c_void,
metaObject: DosQMetaObject,
dObjectCallback: DObjectCallback)
-> DosQObject;
fn dos_qobject_signal_connect(senderVPtr: DosQObject,
signal: *const libc::c_char,
receiverVPtr: DosQObject,
method: *const libc::c_char,
qtype: i32)
-> bool;
fn dos_qobject_delete(deleted: DosQObject);
fn dos_qmetaobject_delete(vptr: DosQMetaObject);
}
impl Drop for QObject {
fn drop(&mut self) {
unsafe {
dos_qobject_delete(self.ptr);
dos_qmetaobject_delete(self.qmeta);
}
}
}
macro_rules! QT_connect {
($sender:ident, $signal:ident, $receiver:ident, $method:tt) => {{
unimplemented!()
}}
}
pub enum QtConnectionType {
Auto = 0,
Direct = 1,
Queued = 2,
BlockingQueued = 3,
Unique = 0x80,
}
type DObjectCallback = extern "C" fn(*mut libc::c_void, DosQVariant, i32, *mut DosQVariant);
impl QObject {
pub fn new(obj: &mut QObjectMacro) -> QObject {
unsafe {
let qmeta = QMetaDefinition::new(obj.qmeta());
let meta = QMeta::new_for_qobject(qmeta);
let obj = Box::new(obj);
let binded_ptr = Box::into_raw(obj) as *mut libc::c_void;
QObject {
ptr: dos_qobject_create(binded_ptr, get_dos_qmeta(&meta), callback),
qmeta: get_dos_qmeta(&meta),
binded_ptr: binded_ptr,
}
}
}
}
pub fn get_qobj_ptr(o: &QObject) -> DosQObject {
o.ptr
}
pub fn get_binded_ptr(o: &QObject) -> *mut libc::c_void {
o.binded_ptr
}
pub fn set_qobj_ptr(o: &mut QObject, ptr: DosQObject) {
o.ptr = ptr;
}
extern "C" fn callback(obj: *mut libc::c_void,
slotName: DosQVariant,
argc: i32,
argv: *mut DosQVariant) {
unsafe {
let mut obj: Box<&mut QObjectMacro> = Box::from_raw(obj as *mut &mut QObjectMacro);
let slice = from_raw_parts_mut(argv, argc as usize);
let vec: Vec<QVariant> = slice.iter().skip(1).map(|&dq| dq.into()).collect();
let slotName: String = new_qvariant(slotName).into();
if let Some(qvar) = obj.qslot_call(&slotName, vec) {
let mut qv: QVariant = slice[0].into();
qv.set(qvar);
}
forget(obj);
}
}