Warning, /sdk/rust-qt-binding-generator/demo/rust/src/interface.rs is written in an unsupported language. File is not indexed.
0001 /* generated by rust_qt_binding_generator */
0002 use libc::{c_char, c_ushort, c_int};
0003 use std::slice;
0004 use std::char::decode_utf16;
0005
0006 use std::sync::Arc;
0007 use std::sync::atomic::{AtomicPtr, Ordering};
0008 use std::ptr::null;
0009
0010 use implementation::*;
0011
0012
0013 #[repr(C)]
0014 pub struct COption<T> {
0015 data: T,
0016 some: bool,
0017 }
0018
0019 impl<T> COption<T> {
0020 #![allow(dead_code)]
0021 fn into(self) -> Option<T> {
0022 if self.some {
0023 Some(self.data)
0024 } else {
0025 None
0026 }
0027 }
0028 }
0029
0030 impl<T> From<Option<T>> for COption<T>
0031 where
0032 T: Default,
0033 {
0034 fn from(t: Option<T>) -> COption<T> {
0035 if let Some(v) = t {
0036 COption {
0037 data: v,
0038 some: true,
0039 }
0040 } else {
0041 COption {
0042 data: T::default(),
0043 some: false,
0044 }
0045 }
0046 }
0047 }
0048
0049
0050 pub enum QString {}
0051
0052 fn set_string_from_utf16(s: &mut String, str: *const c_ushort, len: c_int) {
0053 let utf16 = unsafe { slice::from_raw_parts(str, to_usize(len)) };
0054 let characters = decode_utf16(utf16.iter().cloned())
0055 .map(|r| r.unwrap());
0056 s.clear();
0057 s.extend(characters);
0058 }
0059
0060
0061
0062 pub enum QByteArray {}
0063
0064
0065 #[repr(C)]
0066 #[derive(PartialEq, Eq, Debug)]
0067 pub enum SortOrder {
0068 Ascending = 0,
0069 Descending = 1,
0070 }
0071
0072 #[repr(C)]
0073 pub struct QModelIndex {
0074 row: c_int,
0075 internal_id: usize,
0076 }
0077
0078
0079 fn to_usize(n: c_int) -> usize {
0080 if n < 0 {
0081 panic!("Cannot cast {} to usize", n);
0082 }
0083 n as usize
0084 }
0085
0086
0087 fn to_c_int(n: usize) -> c_int {
0088 if n > c_int::max_value() as usize {
0089 panic!("Cannot cast {} to c_int", n);
0090 }
0091 n as c_int
0092 }
0093
0094
0095 pub struct DemoQObject {}
0096
0097 pub struct DemoEmitter {
0098 qobject: Arc<AtomicPtr<DemoQObject>>,
0099 }
0100
0101 unsafe impl Send for DemoEmitter {}
0102
0103 impl DemoEmitter {
0104 /// Clone the emitter
0105 ///
0106 /// The emitter can only be cloned when it is mutable. The emitter calls
0107 /// into C++ code which may call into Rust again. If emmitting is possible
0108 /// from immutable structures, that might lead to access to a mutable
0109 /// reference. That is undefined behaviour and forbidden.
0110 pub fn clone(&mut self) -> DemoEmitter {
0111 DemoEmitter {
0112 qobject: self.qobject.clone(),
0113 }
0114 }
0115 fn clear(&self) {
0116 let n: *const DemoQObject = null();
0117 self.qobject.store(n as *mut DemoQObject, Ordering::SeqCst);
0118 }
0119 }
0120
0121 pub trait DemoTrait {
0122 fn new(emit: DemoEmitter,
0123 fibonacci: Fibonacci,
0124 fibonacci_list: FibonacciList,
0125 file_system_tree: FileSystemTree,
0126 processes: Processes,
0127 time_series: TimeSeries) -> Self;
0128 fn emit(&mut self) -> &mut DemoEmitter;
0129 fn fibonacci(&self) -> &Fibonacci;
0130 fn fibonacci_mut(&mut self) -> &mut Fibonacci;
0131 fn fibonacci_list(&self) -> &FibonacciList;
0132 fn fibonacci_list_mut(&mut self) -> &mut FibonacciList;
0133 fn file_system_tree(&self) -> &FileSystemTree;
0134 fn file_system_tree_mut(&mut self) -> &mut FileSystemTree;
0135 fn processes(&self) -> &Processes;
0136 fn processes_mut(&mut self) -> &mut Processes;
0137 fn time_series(&self) -> &TimeSeries;
0138 fn time_series_mut(&mut self) -> &mut TimeSeries;
0139 }
0140
0141 #[no_mangle]
0142 pub extern "C" fn demo_new(
0143 demo: *mut DemoQObject,
0144 fibonacci: *mut FibonacciQObject,
0145 fibonacci_input_changed: extern fn(*mut FibonacciQObject),
0146 fibonacci_result_changed: extern fn(*mut FibonacciQObject),
0147 fibonacci_list: *mut FibonacciListQObject,
0148 fibonacci_list_new_data_ready: extern fn(*mut FibonacciListQObject),
0149 fibonacci_list_layout_about_to_be_changed: extern fn(*mut FibonacciListQObject),
0150 fibonacci_list_layout_changed: extern fn(*mut FibonacciListQObject),
0151 fibonacci_list_data_changed: extern fn(*mut FibonacciListQObject, usize, usize),
0152 fibonacci_list_begin_reset_model: extern fn(*mut FibonacciListQObject),
0153 fibonacci_list_end_reset_model: extern fn(*mut FibonacciListQObject),
0154 fibonacci_list_begin_insert_rows: extern fn(*mut FibonacciListQObject, usize, usize),
0155 fibonacci_list_end_insert_rows: extern fn(*mut FibonacciListQObject),
0156 fibonacci_list_begin_move_rows: extern fn(*mut FibonacciListQObject, usize, usize, usize),
0157 fibonacci_list_end_move_rows: extern fn(*mut FibonacciListQObject),
0158 fibonacci_list_begin_remove_rows: extern fn(*mut FibonacciListQObject, usize, usize),
0159 fibonacci_list_end_remove_rows: extern fn(*mut FibonacciListQObject),
0160 file_system_tree: *mut FileSystemTreeQObject,
0161 file_system_tree_path_changed: extern fn(*mut FileSystemTreeQObject),
0162 file_system_tree_new_data_ready: extern fn(*mut FileSystemTreeQObject, index: COption<usize>),
0163 file_system_tree_layout_about_to_be_changed: extern fn(*mut FileSystemTreeQObject),
0164 file_system_tree_layout_changed: extern fn(*mut FileSystemTreeQObject),
0165 file_system_tree_data_changed: extern fn(*mut FileSystemTreeQObject, usize, usize),
0166 file_system_tree_begin_reset_model: extern fn(*mut FileSystemTreeQObject),
0167 file_system_tree_end_reset_model: extern fn(*mut FileSystemTreeQObject),
0168 file_system_tree_begin_insert_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize),
0169 file_system_tree_end_insert_rows: extern fn(*mut FileSystemTreeQObject),
0170 file_system_tree_begin_move_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize, index: COption<usize>, usize),
0171 file_system_tree_end_move_rows: extern fn(*mut FileSystemTreeQObject),
0172 file_system_tree_begin_remove_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize),
0173 file_system_tree_end_remove_rows: extern fn(*mut FileSystemTreeQObject),
0174 processes: *mut ProcessesQObject,
0175 processes_active_changed: extern fn(*mut ProcessesQObject),
0176 processes_new_data_ready: extern fn(*mut ProcessesQObject, index: COption<usize>),
0177 processes_layout_about_to_be_changed: extern fn(*mut ProcessesQObject),
0178 processes_layout_changed: extern fn(*mut ProcessesQObject),
0179 processes_data_changed: extern fn(*mut ProcessesQObject, usize, usize),
0180 processes_begin_reset_model: extern fn(*mut ProcessesQObject),
0181 processes_end_reset_model: extern fn(*mut ProcessesQObject),
0182 processes_begin_insert_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize),
0183 processes_end_insert_rows: extern fn(*mut ProcessesQObject),
0184 processes_begin_move_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize, index: COption<usize>, usize),
0185 processes_end_move_rows: extern fn(*mut ProcessesQObject),
0186 processes_begin_remove_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize),
0187 processes_end_remove_rows: extern fn(*mut ProcessesQObject),
0188 time_series: *mut TimeSeriesQObject,
0189 time_series_new_data_ready: extern fn(*mut TimeSeriesQObject),
0190 time_series_layout_about_to_be_changed: extern fn(*mut TimeSeriesQObject),
0191 time_series_layout_changed: extern fn(*mut TimeSeriesQObject),
0192 time_series_data_changed: extern fn(*mut TimeSeriesQObject, usize, usize),
0193 time_series_begin_reset_model: extern fn(*mut TimeSeriesQObject),
0194 time_series_end_reset_model: extern fn(*mut TimeSeriesQObject),
0195 time_series_begin_insert_rows: extern fn(*mut TimeSeriesQObject, usize, usize),
0196 time_series_end_insert_rows: extern fn(*mut TimeSeriesQObject),
0197 time_series_begin_move_rows: extern fn(*mut TimeSeriesQObject, usize, usize, usize),
0198 time_series_end_move_rows: extern fn(*mut TimeSeriesQObject),
0199 time_series_begin_remove_rows: extern fn(*mut TimeSeriesQObject, usize, usize),
0200 time_series_end_remove_rows: extern fn(*mut TimeSeriesQObject),
0201 ) -> *mut Demo {
0202 let fibonacci_emit = FibonacciEmitter {
0203 qobject: Arc::new(AtomicPtr::new(fibonacci)),
0204 input_changed: fibonacci_input_changed,
0205 result_changed: fibonacci_result_changed,
0206 };
0207 let d_fibonacci = Fibonacci::new(fibonacci_emit);
0208 let fibonacci_list_emit = FibonacciListEmitter {
0209 qobject: Arc::new(AtomicPtr::new(fibonacci_list)),
0210 new_data_ready: fibonacci_list_new_data_ready,
0211 };
0212 let model = FibonacciListList {
0213 qobject: fibonacci_list,
0214 layout_about_to_be_changed: fibonacci_list_layout_about_to_be_changed,
0215 layout_changed: fibonacci_list_layout_changed,
0216 data_changed: fibonacci_list_data_changed,
0217 begin_reset_model: fibonacci_list_begin_reset_model,
0218 end_reset_model: fibonacci_list_end_reset_model,
0219 begin_insert_rows: fibonacci_list_begin_insert_rows,
0220 end_insert_rows: fibonacci_list_end_insert_rows,
0221 begin_move_rows: fibonacci_list_begin_move_rows,
0222 end_move_rows: fibonacci_list_end_move_rows,
0223 begin_remove_rows: fibonacci_list_begin_remove_rows,
0224 end_remove_rows: fibonacci_list_end_remove_rows,
0225 };
0226 let d_fibonacci_list = FibonacciList::new(fibonacci_list_emit, model);
0227 let file_system_tree_emit = FileSystemTreeEmitter {
0228 qobject: Arc::new(AtomicPtr::new(file_system_tree)),
0229 path_changed: file_system_tree_path_changed,
0230 new_data_ready: file_system_tree_new_data_ready,
0231 };
0232 let model = FileSystemTreeTree {
0233 qobject: file_system_tree,
0234 layout_about_to_be_changed: file_system_tree_layout_about_to_be_changed,
0235 layout_changed: file_system_tree_layout_changed,
0236 data_changed: file_system_tree_data_changed,
0237 begin_reset_model: file_system_tree_begin_reset_model,
0238 end_reset_model: file_system_tree_end_reset_model,
0239 begin_insert_rows: file_system_tree_begin_insert_rows,
0240 end_insert_rows: file_system_tree_end_insert_rows,
0241 begin_move_rows: file_system_tree_begin_move_rows,
0242 end_move_rows: file_system_tree_end_move_rows,
0243 begin_remove_rows: file_system_tree_begin_remove_rows,
0244 end_remove_rows: file_system_tree_end_remove_rows,
0245 };
0246 let d_file_system_tree = FileSystemTree::new(file_system_tree_emit, model);
0247 let processes_emit = ProcessesEmitter {
0248 qobject: Arc::new(AtomicPtr::new(processes)),
0249 active_changed: processes_active_changed,
0250 new_data_ready: processes_new_data_ready,
0251 };
0252 let model = ProcessesTree {
0253 qobject: processes,
0254 layout_about_to_be_changed: processes_layout_about_to_be_changed,
0255 layout_changed: processes_layout_changed,
0256 data_changed: processes_data_changed,
0257 begin_reset_model: processes_begin_reset_model,
0258 end_reset_model: processes_end_reset_model,
0259 begin_insert_rows: processes_begin_insert_rows,
0260 end_insert_rows: processes_end_insert_rows,
0261 begin_move_rows: processes_begin_move_rows,
0262 end_move_rows: processes_end_move_rows,
0263 begin_remove_rows: processes_begin_remove_rows,
0264 end_remove_rows: processes_end_remove_rows,
0265 };
0266 let d_processes = Processes::new(processes_emit, model);
0267 let time_series_emit = TimeSeriesEmitter {
0268 qobject: Arc::new(AtomicPtr::new(time_series)),
0269 new_data_ready: time_series_new_data_ready,
0270 };
0271 let model = TimeSeriesList {
0272 qobject: time_series,
0273 layout_about_to_be_changed: time_series_layout_about_to_be_changed,
0274 layout_changed: time_series_layout_changed,
0275 data_changed: time_series_data_changed,
0276 begin_reset_model: time_series_begin_reset_model,
0277 end_reset_model: time_series_end_reset_model,
0278 begin_insert_rows: time_series_begin_insert_rows,
0279 end_insert_rows: time_series_end_insert_rows,
0280 begin_move_rows: time_series_begin_move_rows,
0281 end_move_rows: time_series_end_move_rows,
0282 begin_remove_rows: time_series_begin_remove_rows,
0283 end_remove_rows: time_series_end_remove_rows,
0284 };
0285 let d_time_series = TimeSeries::new(time_series_emit, model);
0286 let demo_emit = DemoEmitter {
0287 qobject: Arc::new(AtomicPtr::new(demo)),
0288 };
0289 let d_demo = Demo::new(demo_emit,
0290 d_fibonacci,
0291 d_fibonacci_list,
0292 d_file_system_tree,
0293 d_processes,
0294 d_time_series);
0295 Box::into_raw(Box::new(d_demo))
0296 }
0297
0298 #[no_mangle]
0299 pub unsafe extern "C" fn demo_free(ptr: *mut Demo) {
0300 Box::from_raw(ptr).emit().clear();
0301 }
0302
0303 #[no_mangle]
0304 pub unsafe extern "C" fn demo_fibonacci_get(ptr: *mut Demo) -> *mut Fibonacci {
0305 (&mut *ptr).fibonacci_mut()
0306 }
0307
0308 #[no_mangle]
0309 pub unsafe extern "C" fn demo_fibonacci_list_get(ptr: *mut Demo) -> *mut FibonacciList {
0310 (&mut *ptr).fibonacci_list_mut()
0311 }
0312
0313 #[no_mangle]
0314 pub unsafe extern "C" fn demo_file_system_tree_get(ptr: *mut Demo) -> *mut FileSystemTree {
0315 (&mut *ptr).file_system_tree_mut()
0316 }
0317
0318 #[no_mangle]
0319 pub unsafe extern "C" fn demo_processes_get(ptr: *mut Demo) -> *mut Processes {
0320 (&mut *ptr).processes_mut()
0321 }
0322
0323 #[no_mangle]
0324 pub unsafe extern "C" fn demo_time_series_get(ptr: *mut Demo) -> *mut TimeSeries {
0325 (&mut *ptr).time_series_mut()
0326 }
0327
0328 pub struct FibonacciQObject {}
0329
0330 pub struct FibonacciEmitter {
0331 qobject: Arc<AtomicPtr<FibonacciQObject>>,
0332 input_changed: extern fn(*mut FibonacciQObject),
0333 result_changed: extern fn(*mut FibonacciQObject),
0334 }
0335
0336 unsafe impl Send for FibonacciEmitter {}
0337
0338 impl FibonacciEmitter {
0339 /// Clone the emitter
0340 ///
0341 /// The emitter can only be cloned when it is mutable. The emitter calls
0342 /// into C++ code which may call into Rust again. If emmitting is possible
0343 /// from immutable structures, that might lead to access to a mutable
0344 /// reference. That is undefined behaviour and forbidden.
0345 pub fn clone(&mut self) -> FibonacciEmitter {
0346 FibonacciEmitter {
0347 qobject: self.qobject.clone(),
0348 input_changed: self.input_changed,
0349 result_changed: self.result_changed,
0350 }
0351 }
0352 fn clear(&self) {
0353 let n: *const FibonacciQObject = null();
0354 self.qobject.store(n as *mut FibonacciQObject, Ordering::SeqCst);
0355 }
0356 pub fn input_changed(&mut self) {
0357 let ptr = self.qobject.load(Ordering::SeqCst);
0358 if !ptr.is_null() {
0359 (self.input_changed)(ptr);
0360 }
0361 }
0362 pub fn result_changed(&mut self) {
0363 let ptr = self.qobject.load(Ordering::SeqCst);
0364 if !ptr.is_null() {
0365 (self.result_changed)(ptr);
0366 }
0367 }
0368 }
0369
0370 pub trait FibonacciTrait {
0371 fn new(emit: FibonacciEmitter) -> Self;
0372 fn emit(&mut self) -> &mut FibonacciEmitter;
0373 fn input(&self) -> u32;
0374 fn set_input(&mut self, value: u32);
0375 fn result(&self) -> u64;
0376 }
0377
0378 #[no_mangle]
0379 pub extern "C" fn fibonacci_new(
0380 fibonacci: *mut FibonacciQObject,
0381 fibonacci_input_changed: extern fn(*mut FibonacciQObject),
0382 fibonacci_result_changed: extern fn(*mut FibonacciQObject),
0383 ) -> *mut Fibonacci {
0384 let fibonacci_emit = FibonacciEmitter {
0385 qobject: Arc::new(AtomicPtr::new(fibonacci)),
0386 input_changed: fibonacci_input_changed,
0387 result_changed: fibonacci_result_changed,
0388 };
0389 let d_fibonacci = Fibonacci::new(fibonacci_emit);
0390 Box::into_raw(Box::new(d_fibonacci))
0391 }
0392
0393 #[no_mangle]
0394 pub unsafe extern "C" fn fibonacci_free(ptr: *mut Fibonacci) {
0395 Box::from_raw(ptr).emit().clear();
0396 }
0397
0398 #[no_mangle]
0399 pub unsafe extern "C" fn fibonacci_input_get(ptr: *const Fibonacci) -> u32 {
0400 (&*ptr).input()
0401 }
0402
0403 #[no_mangle]
0404 pub unsafe extern "C" fn fibonacci_input_set(ptr: *mut Fibonacci, v: u32) {
0405 (&mut *ptr).set_input(v);
0406 }
0407
0408 #[no_mangle]
0409 pub unsafe extern "C" fn fibonacci_result_get(ptr: *const Fibonacci) -> u64 {
0410 (&*ptr).result()
0411 }
0412
0413 pub struct FibonacciListQObject {}
0414
0415 pub struct FibonacciListEmitter {
0416 qobject: Arc<AtomicPtr<FibonacciListQObject>>,
0417 new_data_ready: extern fn(*mut FibonacciListQObject),
0418 }
0419
0420 unsafe impl Send for FibonacciListEmitter {}
0421
0422 impl FibonacciListEmitter {
0423 /// Clone the emitter
0424 ///
0425 /// The emitter can only be cloned when it is mutable. The emitter calls
0426 /// into C++ code which may call into Rust again. If emmitting is possible
0427 /// from immutable structures, that might lead to access to a mutable
0428 /// reference. That is undefined behaviour and forbidden.
0429 pub fn clone(&mut self) -> FibonacciListEmitter {
0430 FibonacciListEmitter {
0431 qobject: self.qobject.clone(),
0432 new_data_ready: self.new_data_ready,
0433 }
0434 }
0435 fn clear(&self) {
0436 let n: *const FibonacciListQObject = null();
0437 self.qobject.store(n as *mut FibonacciListQObject, Ordering::SeqCst);
0438 }
0439 pub fn new_data_ready(&mut self) {
0440 let ptr = self.qobject.load(Ordering::SeqCst);
0441 if !ptr.is_null() {
0442 (self.new_data_ready)(ptr);
0443 }
0444 }
0445 }
0446
0447 #[derive(Clone)]
0448 pub struct FibonacciListList {
0449 qobject: *mut FibonacciListQObject,
0450 layout_about_to_be_changed: extern fn(*mut FibonacciListQObject),
0451 layout_changed: extern fn(*mut FibonacciListQObject),
0452 data_changed: extern fn(*mut FibonacciListQObject, usize, usize),
0453 begin_reset_model: extern fn(*mut FibonacciListQObject),
0454 end_reset_model: extern fn(*mut FibonacciListQObject),
0455 begin_insert_rows: extern fn(*mut FibonacciListQObject, usize, usize),
0456 end_insert_rows: extern fn(*mut FibonacciListQObject),
0457 begin_move_rows: extern fn(*mut FibonacciListQObject, usize, usize, usize),
0458 end_move_rows: extern fn(*mut FibonacciListQObject),
0459 begin_remove_rows: extern fn(*mut FibonacciListQObject, usize, usize),
0460 end_remove_rows: extern fn(*mut FibonacciListQObject),
0461 }
0462
0463 impl FibonacciListList {
0464 pub fn layout_about_to_be_changed(&mut self) {
0465 (self.layout_about_to_be_changed)(self.qobject);
0466 }
0467 pub fn layout_changed(&mut self) {
0468 (self.layout_changed)(self.qobject);
0469 }
0470 pub fn data_changed(&mut self, first: usize, last: usize) {
0471 (self.data_changed)(self.qobject, first, last);
0472 }
0473 pub fn begin_reset_model(&mut self) {
0474 (self.begin_reset_model)(self.qobject);
0475 }
0476 pub fn end_reset_model(&mut self) {
0477 (self.end_reset_model)(self.qobject);
0478 }
0479 pub fn begin_insert_rows(&mut self, first: usize, last: usize) {
0480 (self.begin_insert_rows)(self.qobject, first, last);
0481 }
0482 pub fn end_insert_rows(&mut self) {
0483 (self.end_insert_rows)(self.qobject);
0484 }
0485 pub fn begin_move_rows(&mut self, first: usize, last: usize, destination: usize) {
0486 (self.begin_move_rows)(self.qobject, first, last, destination);
0487 }
0488 pub fn end_move_rows(&mut self) {
0489 (self.end_move_rows)(self.qobject);
0490 }
0491 pub fn begin_remove_rows(&mut self, first: usize, last: usize) {
0492 (self.begin_remove_rows)(self.qobject, first, last);
0493 }
0494 pub fn end_remove_rows(&mut self) {
0495 (self.end_remove_rows)(self.qobject);
0496 }
0497 }
0498
0499 pub trait FibonacciListTrait {
0500 fn new(emit: FibonacciListEmitter, model: FibonacciListList) -> Self;
0501 fn emit(&mut self) -> &mut FibonacciListEmitter;
0502 fn row_count(&self) -> usize;
0503 fn insert_rows(&mut self, _row: usize, _count: usize) -> bool { false }
0504 fn remove_rows(&mut self, _row: usize, _count: usize) -> bool { false }
0505 fn can_fetch_more(&self) -> bool {
0506 false
0507 }
0508 fn fetch_more(&mut self) {}
0509 fn sort(&mut self, _: u8, _: SortOrder) {}
0510 fn fibonacci_number(&self, index: usize) -> u64;
0511 fn row(&self, index: usize) -> u64;
0512 }
0513
0514 #[no_mangle]
0515 pub extern "C" fn fibonacci_list_new(
0516 fibonacci_list: *mut FibonacciListQObject,
0517 fibonacci_list_new_data_ready: extern fn(*mut FibonacciListQObject),
0518 fibonacci_list_layout_about_to_be_changed: extern fn(*mut FibonacciListQObject),
0519 fibonacci_list_layout_changed: extern fn(*mut FibonacciListQObject),
0520 fibonacci_list_data_changed: extern fn(*mut FibonacciListQObject, usize, usize),
0521 fibonacci_list_begin_reset_model: extern fn(*mut FibonacciListQObject),
0522 fibonacci_list_end_reset_model: extern fn(*mut FibonacciListQObject),
0523 fibonacci_list_begin_insert_rows: extern fn(*mut FibonacciListQObject, usize, usize),
0524 fibonacci_list_end_insert_rows: extern fn(*mut FibonacciListQObject),
0525 fibonacci_list_begin_move_rows: extern fn(*mut FibonacciListQObject, usize, usize, usize),
0526 fibonacci_list_end_move_rows: extern fn(*mut FibonacciListQObject),
0527 fibonacci_list_begin_remove_rows: extern fn(*mut FibonacciListQObject, usize, usize),
0528 fibonacci_list_end_remove_rows: extern fn(*mut FibonacciListQObject),
0529 ) -> *mut FibonacciList {
0530 let fibonacci_list_emit = FibonacciListEmitter {
0531 qobject: Arc::new(AtomicPtr::new(fibonacci_list)),
0532 new_data_ready: fibonacci_list_new_data_ready,
0533 };
0534 let model = FibonacciListList {
0535 qobject: fibonacci_list,
0536 layout_about_to_be_changed: fibonacci_list_layout_about_to_be_changed,
0537 layout_changed: fibonacci_list_layout_changed,
0538 data_changed: fibonacci_list_data_changed,
0539 begin_reset_model: fibonacci_list_begin_reset_model,
0540 end_reset_model: fibonacci_list_end_reset_model,
0541 begin_insert_rows: fibonacci_list_begin_insert_rows,
0542 end_insert_rows: fibonacci_list_end_insert_rows,
0543 begin_move_rows: fibonacci_list_begin_move_rows,
0544 end_move_rows: fibonacci_list_end_move_rows,
0545 begin_remove_rows: fibonacci_list_begin_remove_rows,
0546 end_remove_rows: fibonacci_list_end_remove_rows,
0547 };
0548 let d_fibonacci_list = FibonacciList::new(fibonacci_list_emit, model);
0549 Box::into_raw(Box::new(d_fibonacci_list))
0550 }
0551
0552 #[no_mangle]
0553 pub unsafe extern "C" fn fibonacci_list_free(ptr: *mut FibonacciList) {
0554 Box::from_raw(ptr).emit().clear();
0555 }
0556
0557 #[no_mangle]
0558 pub unsafe extern "C" fn fibonacci_list_row_count(ptr: *const FibonacciList) -> c_int {
0559 to_c_int((&*ptr).row_count())
0560 }
0561 #[no_mangle]
0562 pub unsafe extern "C" fn fibonacci_list_insert_rows(ptr: *mut FibonacciList, row: c_int, count: c_int) -> bool {
0563 (&mut *ptr).insert_rows(to_usize(row), to_usize(count))
0564 }
0565 #[no_mangle]
0566 pub unsafe extern "C" fn fibonacci_list_remove_rows(ptr: *mut FibonacciList, row: c_int, count: c_int) -> bool {
0567 (&mut *ptr).remove_rows(to_usize(row), to_usize(count))
0568 }
0569 #[no_mangle]
0570 pub unsafe extern "C" fn fibonacci_list_can_fetch_more(ptr: *const FibonacciList) -> bool {
0571 (&*ptr).can_fetch_more()
0572 }
0573 #[no_mangle]
0574 pub unsafe extern "C" fn fibonacci_list_fetch_more(ptr: *mut FibonacciList) {
0575 (&mut *ptr).fetch_more()
0576 }
0577 #[no_mangle]
0578 pub unsafe extern "C" fn fibonacci_list_sort(
0579 ptr: *mut FibonacciList,
0580 column: u8,
0581 order: SortOrder,
0582 ) {
0583 (&mut *ptr).sort(column, order)
0584 }
0585
0586 #[no_mangle]
0587 pub unsafe extern "C" fn fibonacci_list_data_fibonacci_number(ptr: *const FibonacciList, row: c_int) -> u64 {
0588 let o = &*ptr;
0589 o.fibonacci_number(to_usize(row))
0590 }
0591
0592 #[no_mangle]
0593 pub unsafe extern "C" fn fibonacci_list_data_row(ptr: *const FibonacciList, row: c_int) -> u64 {
0594 let o = &*ptr;
0595 o.row(to_usize(row))
0596 }
0597
0598 pub struct FileSystemTreeQObject {}
0599
0600 pub struct FileSystemTreeEmitter {
0601 qobject: Arc<AtomicPtr<FileSystemTreeQObject>>,
0602 path_changed: extern fn(*mut FileSystemTreeQObject),
0603 new_data_ready: extern fn(*mut FileSystemTreeQObject, index: COption<usize>),
0604 }
0605
0606 unsafe impl Send for FileSystemTreeEmitter {}
0607
0608 impl FileSystemTreeEmitter {
0609 /// Clone the emitter
0610 ///
0611 /// The emitter can only be cloned when it is mutable. The emitter calls
0612 /// into C++ code which may call into Rust again. If emmitting is possible
0613 /// from immutable structures, that might lead to access to a mutable
0614 /// reference. That is undefined behaviour and forbidden.
0615 pub fn clone(&mut self) -> FileSystemTreeEmitter {
0616 FileSystemTreeEmitter {
0617 qobject: self.qobject.clone(),
0618 path_changed: self.path_changed,
0619 new_data_ready: self.new_data_ready,
0620 }
0621 }
0622 fn clear(&self) {
0623 let n: *const FileSystemTreeQObject = null();
0624 self.qobject.store(n as *mut FileSystemTreeQObject, Ordering::SeqCst);
0625 }
0626 pub fn path_changed(&mut self) {
0627 let ptr = self.qobject.load(Ordering::SeqCst);
0628 if !ptr.is_null() {
0629 (self.path_changed)(ptr);
0630 }
0631 }
0632 pub fn new_data_ready(&mut self, item: Option<usize>) {
0633 let ptr = self.qobject.load(Ordering::SeqCst);
0634 if !ptr.is_null() {
0635 (self.new_data_ready)(ptr, item.into());
0636 }
0637 }
0638 }
0639
0640 #[derive(Clone)]
0641 pub struct FileSystemTreeTree {
0642 qobject: *mut FileSystemTreeQObject,
0643 layout_about_to_be_changed: extern fn(*mut FileSystemTreeQObject),
0644 layout_changed: extern fn(*mut FileSystemTreeQObject),
0645 data_changed: extern fn(*mut FileSystemTreeQObject, usize, usize),
0646 begin_reset_model: extern fn(*mut FileSystemTreeQObject),
0647 end_reset_model: extern fn(*mut FileSystemTreeQObject),
0648 begin_insert_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize),
0649 end_insert_rows: extern fn(*mut FileSystemTreeQObject),
0650 begin_move_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize, dest: COption<usize>, usize),
0651 end_move_rows: extern fn(*mut FileSystemTreeQObject),
0652 begin_remove_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize),
0653 end_remove_rows: extern fn(*mut FileSystemTreeQObject),
0654 }
0655
0656 impl FileSystemTreeTree {
0657 pub fn layout_about_to_be_changed(&mut self) {
0658 (self.layout_about_to_be_changed)(self.qobject);
0659 }
0660 pub fn layout_changed(&mut self) {
0661 (self.layout_changed)(self.qobject);
0662 }
0663 pub fn data_changed(&mut self, first: usize, last: usize) {
0664 (self.data_changed)(self.qobject, first, last);
0665 }
0666 pub fn begin_reset_model(&mut self) {
0667 (self.begin_reset_model)(self.qobject);
0668 }
0669 pub fn end_reset_model(&mut self) {
0670 (self.end_reset_model)(self.qobject);
0671 }
0672 pub fn begin_insert_rows(&mut self, index: Option<usize>, first: usize, last: usize) {
0673 (self.begin_insert_rows)(self.qobject, index.into(), first, last);
0674 }
0675 pub fn end_insert_rows(&mut self) {
0676 (self.end_insert_rows)(self.qobject);
0677 }
0678 pub fn begin_move_rows(&mut self, index: Option<usize>, first: usize, last: usize, dest: Option<usize>, destination: usize) {
0679 (self.begin_move_rows)(self.qobject, index.into(), first, last, dest.into(), destination);
0680 }
0681 pub fn end_move_rows(&mut self) {
0682 (self.end_move_rows)(self.qobject);
0683 }
0684 pub fn begin_remove_rows(&mut self, index: Option<usize>, first: usize, last: usize) {
0685 (self.begin_remove_rows)(self.qobject, index.into(), first, last);
0686 }
0687 pub fn end_remove_rows(&mut self) {
0688 (self.end_remove_rows)(self.qobject);
0689 }
0690 }
0691
0692 pub trait FileSystemTreeTrait {
0693 fn new(emit: FileSystemTreeEmitter, model: FileSystemTreeTree) -> Self;
0694 fn emit(&mut self) -> &mut FileSystemTreeEmitter;
0695 fn path(&self) -> Option<&str>;
0696 fn set_path(&mut self, value: Option<String>);
0697 fn row_count(&self, _: Option<usize>) -> usize;
0698 fn can_fetch_more(&self, _: Option<usize>) -> bool {
0699 false
0700 }
0701 fn fetch_more(&mut self, _: Option<usize>) {}
0702 fn sort(&mut self, _: u8, _: SortOrder) {}
0703 fn check_row(&self, index: usize, row: usize) -> Option<usize>;
0704 fn index(&self, item: Option<usize>, row: usize) -> usize;
0705 fn parent(&self, index: usize) -> Option<usize>;
0706 fn row(&self, index: usize) -> usize;
0707 fn file_icon(&self, index: usize) -> &[u8];
0708 fn file_name(&self, index: usize) -> String;
0709 fn file_path(&self, index: usize) -> Option<String>;
0710 fn file_permissions(&self, index: usize) -> i32;
0711 fn file_size(&self, index: usize) -> Option<u64>;
0712 fn file_type(&self, index: usize) -> i32;
0713 }
0714
0715 #[no_mangle]
0716 pub extern "C" fn file_system_tree_new(
0717 file_system_tree: *mut FileSystemTreeQObject,
0718 file_system_tree_path_changed: extern fn(*mut FileSystemTreeQObject),
0719 file_system_tree_new_data_ready: extern fn(*mut FileSystemTreeQObject, index: COption<usize>),
0720 file_system_tree_layout_about_to_be_changed: extern fn(*mut FileSystemTreeQObject),
0721 file_system_tree_layout_changed: extern fn(*mut FileSystemTreeQObject),
0722 file_system_tree_data_changed: extern fn(*mut FileSystemTreeQObject, usize, usize),
0723 file_system_tree_begin_reset_model: extern fn(*mut FileSystemTreeQObject),
0724 file_system_tree_end_reset_model: extern fn(*mut FileSystemTreeQObject),
0725 file_system_tree_begin_insert_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize),
0726 file_system_tree_end_insert_rows: extern fn(*mut FileSystemTreeQObject),
0727 file_system_tree_begin_move_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize, index: COption<usize>, usize),
0728 file_system_tree_end_move_rows: extern fn(*mut FileSystemTreeQObject),
0729 file_system_tree_begin_remove_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize),
0730 file_system_tree_end_remove_rows: extern fn(*mut FileSystemTreeQObject),
0731 ) -> *mut FileSystemTree {
0732 let file_system_tree_emit = FileSystemTreeEmitter {
0733 qobject: Arc::new(AtomicPtr::new(file_system_tree)),
0734 path_changed: file_system_tree_path_changed,
0735 new_data_ready: file_system_tree_new_data_ready,
0736 };
0737 let model = FileSystemTreeTree {
0738 qobject: file_system_tree,
0739 layout_about_to_be_changed: file_system_tree_layout_about_to_be_changed,
0740 layout_changed: file_system_tree_layout_changed,
0741 data_changed: file_system_tree_data_changed,
0742 begin_reset_model: file_system_tree_begin_reset_model,
0743 end_reset_model: file_system_tree_end_reset_model,
0744 begin_insert_rows: file_system_tree_begin_insert_rows,
0745 end_insert_rows: file_system_tree_end_insert_rows,
0746 begin_move_rows: file_system_tree_begin_move_rows,
0747 end_move_rows: file_system_tree_end_move_rows,
0748 begin_remove_rows: file_system_tree_begin_remove_rows,
0749 end_remove_rows: file_system_tree_end_remove_rows,
0750 };
0751 let d_file_system_tree = FileSystemTree::new(file_system_tree_emit, model);
0752 Box::into_raw(Box::new(d_file_system_tree))
0753 }
0754
0755 #[no_mangle]
0756 pub unsafe extern "C" fn file_system_tree_free(ptr: *mut FileSystemTree) {
0757 Box::from_raw(ptr).emit().clear();
0758 }
0759
0760 #[no_mangle]
0761 pub unsafe extern "C" fn file_system_tree_path_get(
0762 ptr: *const FileSystemTree,
0763 p: *mut QString,
0764 set: extern fn(*mut QString, *const c_char, c_int),
0765 ) {
0766 let o = &*ptr;
0767 let v = o.path();
0768 if let Some(v) = v {
0769 let s: *const c_char = v.as_ptr() as *const c_char;
0770 set(p, s, to_c_int(v.len()));
0771 }
0772 }
0773
0774 #[no_mangle]
0775 pub unsafe extern "C" fn file_system_tree_path_set(ptr: *mut FileSystemTree, v: *const c_ushort, len: c_int) {
0776 let o = &mut *ptr;
0777 let mut s = String::new();
0778 set_string_from_utf16(&mut s, v, len);
0779 o.set_path(Some(s));
0780 }
0781
0782 #[no_mangle]
0783 pub unsafe extern "C" fn file_system_tree_path_set_none(ptr: *mut FileSystemTree) {
0784 let o = &mut *ptr;
0785 o.set_path(None);
0786 }
0787
0788 #[no_mangle]
0789 pub unsafe extern "C" fn file_system_tree_row_count(
0790 ptr: *const FileSystemTree,
0791 index: COption<usize>,
0792 ) -> c_int {
0793 to_c_int((&*ptr).row_count(index.into()))
0794 }
0795 #[no_mangle]
0796 pub unsafe extern "C" fn file_system_tree_can_fetch_more(
0797 ptr: *const FileSystemTree,
0798 index: COption<usize>,
0799 ) -> bool {
0800 (&*ptr).can_fetch_more(index.into())
0801 }
0802 #[no_mangle]
0803 pub unsafe extern "C" fn file_system_tree_fetch_more(ptr: *mut FileSystemTree, index: COption<usize>) {
0804 (&mut *ptr).fetch_more(index.into())
0805 }
0806 #[no_mangle]
0807 pub unsafe extern "C" fn file_system_tree_sort(
0808 ptr: *mut FileSystemTree,
0809 column: u8,
0810 order: SortOrder
0811 ) {
0812 (&mut *ptr).sort(column, order)
0813 }
0814 #[no_mangle]
0815 pub unsafe extern "C" fn file_system_tree_check_row(
0816 ptr: *const FileSystemTree,
0817 index: usize,
0818 row: c_int,
0819 ) -> COption<usize> {
0820 (&*ptr).check_row(index, to_usize(row)).into()
0821 }
0822 #[no_mangle]
0823 pub unsafe extern "C" fn file_system_tree_index(
0824 ptr: *const FileSystemTree,
0825 index: COption<usize>,
0826 row: c_int,
0827 ) -> usize {
0828 (&*ptr).index(index.into(), to_usize(row))
0829 }
0830 #[no_mangle]
0831 pub unsafe extern "C" fn file_system_tree_parent(ptr: *const FileSystemTree, index: usize) -> QModelIndex {
0832 if let Some(parent) = (&*ptr).parent(index) {
0833 QModelIndex {
0834 row: to_c_int((&*ptr).row(parent)),
0835 internal_id: parent,
0836 }
0837 } else {
0838 QModelIndex {
0839 row: -1,
0840 internal_id: 0,
0841 }
0842 }
0843 }
0844 #[no_mangle]
0845 pub unsafe extern "C" fn file_system_tree_row(ptr: *const FileSystemTree, index: usize) -> c_int {
0846 to_c_int((&*ptr).row(index))
0847 }
0848
0849 #[no_mangle]
0850 pub unsafe extern "C" fn file_system_tree_data_file_icon(
0851 ptr: *const FileSystemTree, index: usize,
0852 d: *mut QByteArray,
0853 set: extern fn(*mut QByteArray, *const c_char, len: c_int),
0854 ) {
0855 let o = &*ptr;
0856 let data = o.file_icon(index);
0857 let s: *const c_char = data.as_ptr() as *const c_char;
0858 set(d, s, to_c_int(data.len()));
0859 }
0860
0861 #[no_mangle]
0862 pub unsafe extern "C" fn file_system_tree_data_file_name(
0863 ptr: *const FileSystemTree, index: usize,
0864 d: *mut QString,
0865 set: extern fn(*mut QString, *const c_char, len: c_int),
0866 ) {
0867 let o = &*ptr;
0868 let data = o.file_name(index);
0869 let s: *const c_char = data.as_ptr() as *const c_char;
0870 set(d, s, to_c_int(data.len()));
0871 }
0872
0873 #[no_mangle]
0874 pub unsafe extern "C" fn file_system_tree_data_file_path(
0875 ptr: *const FileSystemTree, index: usize,
0876 d: *mut QString,
0877 set: extern fn(*mut QString, *const c_char, len: c_int),
0878 ) {
0879 let o = &*ptr;
0880 let data = o.file_path(index);
0881 if let Some(data) = data {
0882 let s: *const c_char = data.as_ptr() as *const c_char;
0883 set(d, s, to_c_int(data.len()));
0884 }
0885 }
0886
0887 #[no_mangle]
0888 pub unsafe extern "C" fn file_system_tree_data_file_permissions(ptr: *const FileSystemTree, index: usize) -> i32 {
0889 let o = &*ptr;
0890 o.file_permissions(index)
0891 }
0892
0893 #[no_mangle]
0894 pub unsafe extern "C" fn file_system_tree_data_file_size(ptr: *const FileSystemTree, index: usize) -> COption<u64> {
0895 let o = &*ptr;
0896 o.file_size(index).into()
0897 }
0898
0899 #[no_mangle]
0900 pub unsafe extern "C" fn file_system_tree_data_file_type(ptr: *const FileSystemTree, index: usize) -> i32 {
0901 let o = &*ptr;
0902 o.file_type(index)
0903 }
0904
0905 pub struct ProcessesQObject {}
0906
0907 pub struct ProcessesEmitter {
0908 qobject: Arc<AtomicPtr<ProcessesQObject>>,
0909 active_changed: extern fn(*mut ProcessesQObject),
0910 new_data_ready: extern fn(*mut ProcessesQObject, index: COption<usize>),
0911 }
0912
0913 unsafe impl Send for ProcessesEmitter {}
0914
0915 impl ProcessesEmitter {
0916 /// Clone the emitter
0917 ///
0918 /// The emitter can only be cloned when it is mutable. The emitter calls
0919 /// into C++ code which may call into Rust again. If emmitting is possible
0920 /// from immutable structures, that might lead to access to a mutable
0921 /// reference. That is undefined behaviour and forbidden.
0922 pub fn clone(&mut self) -> ProcessesEmitter {
0923 ProcessesEmitter {
0924 qobject: self.qobject.clone(),
0925 active_changed: self.active_changed,
0926 new_data_ready: self.new_data_ready,
0927 }
0928 }
0929 fn clear(&self) {
0930 let n: *const ProcessesQObject = null();
0931 self.qobject.store(n as *mut ProcessesQObject, Ordering::SeqCst);
0932 }
0933 pub fn active_changed(&mut self) {
0934 let ptr = self.qobject.load(Ordering::SeqCst);
0935 if !ptr.is_null() {
0936 (self.active_changed)(ptr);
0937 }
0938 }
0939 pub fn new_data_ready(&mut self, item: Option<usize>) {
0940 let ptr = self.qobject.load(Ordering::SeqCst);
0941 if !ptr.is_null() {
0942 (self.new_data_ready)(ptr, item.into());
0943 }
0944 }
0945 }
0946
0947 #[derive(Clone)]
0948 pub struct ProcessesTree {
0949 qobject: *mut ProcessesQObject,
0950 layout_about_to_be_changed: extern fn(*mut ProcessesQObject),
0951 layout_changed: extern fn(*mut ProcessesQObject),
0952 data_changed: extern fn(*mut ProcessesQObject, usize, usize),
0953 begin_reset_model: extern fn(*mut ProcessesQObject),
0954 end_reset_model: extern fn(*mut ProcessesQObject),
0955 begin_insert_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize),
0956 end_insert_rows: extern fn(*mut ProcessesQObject),
0957 begin_move_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize, dest: COption<usize>, usize),
0958 end_move_rows: extern fn(*mut ProcessesQObject),
0959 begin_remove_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize),
0960 end_remove_rows: extern fn(*mut ProcessesQObject),
0961 }
0962
0963 impl ProcessesTree {
0964 pub fn layout_about_to_be_changed(&mut self) {
0965 (self.layout_about_to_be_changed)(self.qobject);
0966 }
0967 pub fn layout_changed(&mut self) {
0968 (self.layout_changed)(self.qobject);
0969 }
0970 pub fn data_changed(&mut self, first: usize, last: usize) {
0971 (self.data_changed)(self.qobject, first, last);
0972 }
0973 pub fn begin_reset_model(&mut self) {
0974 (self.begin_reset_model)(self.qobject);
0975 }
0976 pub fn end_reset_model(&mut self) {
0977 (self.end_reset_model)(self.qobject);
0978 }
0979 pub fn begin_insert_rows(&mut self, index: Option<usize>, first: usize, last: usize) {
0980 (self.begin_insert_rows)(self.qobject, index.into(), first, last);
0981 }
0982 pub fn end_insert_rows(&mut self) {
0983 (self.end_insert_rows)(self.qobject);
0984 }
0985 pub fn begin_move_rows(&mut self, index: Option<usize>, first: usize, last: usize, dest: Option<usize>, destination: usize) {
0986 (self.begin_move_rows)(self.qobject, index.into(), first, last, dest.into(), destination);
0987 }
0988 pub fn end_move_rows(&mut self) {
0989 (self.end_move_rows)(self.qobject);
0990 }
0991 pub fn begin_remove_rows(&mut self, index: Option<usize>, first: usize, last: usize) {
0992 (self.begin_remove_rows)(self.qobject, index.into(), first, last);
0993 }
0994 pub fn end_remove_rows(&mut self) {
0995 (self.end_remove_rows)(self.qobject);
0996 }
0997 }
0998
0999 pub trait ProcessesTrait {
1000 fn new(emit: ProcessesEmitter, model: ProcessesTree) -> Self;
1001 fn emit(&mut self) -> &mut ProcessesEmitter;
1002 fn active(&self) -> bool;
1003 fn set_active(&mut self, value: bool);
1004 fn row_count(&self, _: Option<usize>) -> usize;
1005 fn can_fetch_more(&self, _: Option<usize>) -> bool {
1006 false
1007 }
1008 fn fetch_more(&mut self, _: Option<usize>) {}
1009 fn sort(&mut self, _: u8, _: SortOrder) {}
1010 fn check_row(&self, index: usize, row: usize) -> Option<usize>;
1011 fn index(&self, item: Option<usize>, row: usize) -> usize;
1012 fn parent(&self, index: usize) -> Option<usize>;
1013 fn row(&self, index: usize) -> usize;
1014 fn cmd(&self, index: usize) -> String;
1015 fn cpu_percentage(&self, index: usize) -> u8;
1016 fn cpu_usage(&self, index: usize) -> f32;
1017 fn memory(&self, index: usize) -> u64;
1018 fn name(&self, index: usize) -> &str;
1019 fn pid(&self, index: usize) -> u32;
1020 fn uid(&self, index: usize) -> u32;
1021 }
1022
1023 #[no_mangle]
1024 pub extern "C" fn processes_new(
1025 processes: *mut ProcessesQObject,
1026 processes_active_changed: extern fn(*mut ProcessesQObject),
1027 processes_new_data_ready: extern fn(*mut ProcessesQObject, index: COption<usize>),
1028 processes_layout_about_to_be_changed: extern fn(*mut ProcessesQObject),
1029 processes_layout_changed: extern fn(*mut ProcessesQObject),
1030 processes_data_changed: extern fn(*mut ProcessesQObject, usize, usize),
1031 processes_begin_reset_model: extern fn(*mut ProcessesQObject),
1032 processes_end_reset_model: extern fn(*mut ProcessesQObject),
1033 processes_begin_insert_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize),
1034 processes_end_insert_rows: extern fn(*mut ProcessesQObject),
1035 processes_begin_move_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize, index: COption<usize>, usize),
1036 processes_end_move_rows: extern fn(*mut ProcessesQObject),
1037 processes_begin_remove_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize),
1038 processes_end_remove_rows: extern fn(*mut ProcessesQObject),
1039 ) -> *mut Processes {
1040 let processes_emit = ProcessesEmitter {
1041 qobject: Arc::new(AtomicPtr::new(processes)),
1042 active_changed: processes_active_changed,
1043 new_data_ready: processes_new_data_ready,
1044 };
1045 let model = ProcessesTree {
1046 qobject: processes,
1047 layout_about_to_be_changed: processes_layout_about_to_be_changed,
1048 layout_changed: processes_layout_changed,
1049 data_changed: processes_data_changed,
1050 begin_reset_model: processes_begin_reset_model,
1051 end_reset_model: processes_end_reset_model,
1052 begin_insert_rows: processes_begin_insert_rows,
1053 end_insert_rows: processes_end_insert_rows,
1054 begin_move_rows: processes_begin_move_rows,
1055 end_move_rows: processes_end_move_rows,
1056 begin_remove_rows: processes_begin_remove_rows,
1057 end_remove_rows: processes_end_remove_rows,
1058 };
1059 let d_processes = Processes::new(processes_emit, model);
1060 Box::into_raw(Box::new(d_processes))
1061 }
1062
1063 #[no_mangle]
1064 pub unsafe extern "C" fn processes_free(ptr: *mut Processes) {
1065 Box::from_raw(ptr).emit().clear();
1066 }
1067
1068 #[no_mangle]
1069 pub unsafe extern "C" fn processes_active_get(ptr: *const Processes) -> bool {
1070 (&*ptr).active()
1071 }
1072
1073 #[no_mangle]
1074 pub unsafe extern "C" fn processes_active_set(ptr: *mut Processes, v: bool) {
1075 (&mut *ptr).set_active(v);
1076 }
1077
1078 #[no_mangle]
1079 pub unsafe extern "C" fn processes_row_count(
1080 ptr: *const Processes,
1081 index: COption<usize>,
1082 ) -> c_int {
1083 to_c_int((&*ptr).row_count(index.into()))
1084 }
1085 #[no_mangle]
1086 pub unsafe extern "C" fn processes_can_fetch_more(
1087 ptr: *const Processes,
1088 index: COption<usize>,
1089 ) -> bool {
1090 (&*ptr).can_fetch_more(index.into())
1091 }
1092 #[no_mangle]
1093 pub unsafe extern "C" fn processes_fetch_more(ptr: *mut Processes, index: COption<usize>) {
1094 (&mut *ptr).fetch_more(index.into())
1095 }
1096 #[no_mangle]
1097 pub unsafe extern "C" fn processes_sort(
1098 ptr: *mut Processes,
1099 column: u8,
1100 order: SortOrder
1101 ) {
1102 (&mut *ptr).sort(column, order)
1103 }
1104 #[no_mangle]
1105 pub unsafe extern "C" fn processes_check_row(
1106 ptr: *const Processes,
1107 index: usize,
1108 row: c_int,
1109 ) -> COption<usize> {
1110 (&*ptr).check_row(index, to_usize(row)).into()
1111 }
1112 #[no_mangle]
1113 pub unsafe extern "C" fn processes_index(
1114 ptr: *const Processes,
1115 index: COption<usize>,
1116 row: c_int,
1117 ) -> usize {
1118 (&*ptr).index(index.into(), to_usize(row))
1119 }
1120 #[no_mangle]
1121 pub unsafe extern "C" fn processes_parent(ptr: *const Processes, index: usize) -> QModelIndex {
1122 if let Some(parent) = (&*ptr).parent(index) {
1123 QModelIndex {
1124 row: to_c_int((&*ptr).row(parent)),
1125 internal_id: parent,
1126 }
1127 } else {
1128 QModelIndex {
1129 row: -1,
1130 internal_id: 0,
1131 }
1132 }
1133 }
1134 #[no_mangle]
1135 pub unsafe extern "C" fn processes_row(ptr: *const Processes, index: usize) -> c_int {
1136 to_c_int((&*ptr).row(index))
1137 }
1138
1139 #[no_mangle]
1140 pub unsafe extern "C" fn processes_data_cmd(
1141 ptr: *const Processes, index: usize,
1142 d: *mut QString,
1143 set: extern fn(*mut QString, *const c_char, len: c_int),
1144 ) {
1145 let o = &*ptr;
1146 let data = o.cmd(index);
1147 let s: *const c_char = data.as_ptr() as *const c_char;
1148 set(d, s, to_c_int(data.len()));
1149 }
1150
1151 #[no_mangle]
1152 pub unsafe extern "C" fn processes_data_cpu_percentage(ptr: *const Processes, index: usize) -> u8 {
1153 let o = &*ptr;
1154 o.cpu_percentage(index)
1155 }
1156
1157 #[no_mangle]
1158 pub unsafe extern "C" fn processes_data_cpu_usage(ptr: *const Processes, index: usize) -> f32 {
1159 let o = &*ptr;
1160 o.cpu_usage(index)
1161 }
1162
1163 #[no_mangle]
1164 pub unsafe extern "C" fn processes_data_memory(ptr: *const Processes, index: usize) -> u64 {
1165 let o = &*ptr;
1166 o.memory(index)
1167 }
1168
1169 #[no_mangle]
1170 pub unsafe extern "C" fn processes_data_name(
1171 ptr: *const Processes, index: usize,
1172 d: *mut QString,
1173 set: extern fn(*mut QString, *const c_char, len: c_int),
1174 ) {
1175 let o = &*ptr;
1176 let data = o.name(index);
1177 let s: *const c_char = data.as_ptr() as *const c_char;
1178 set(d, s, to_c_int(data.len()));
1179 }
1180
1181 #[no_mangle]
1182 pub unsafe extern "C" fn processes_data_pid(ptr: *const Processes, index: usize) -> u32 {
1183 let o = &*ptr;
1184 o.pid(index)
1185 }
1186
1187 #[no_mangle]
1188 pub unsafe extern "C" fn processes_data_uid(ptr: *const Processes, index: usize) -> u32 {
1189 let o = &*ptr;
1190 o.uid(index)
1191 }
1192
1193 pub struct TimeSeriesQObject {}
1194
1195 pub struct TimeSeriesEmitter {
1196 qobject: Arc<AtomicPtr<TimeSeriesQObject>>,
1197 new_data_ready: extern fn(*mut TimeSeriesQObject),
1198 }
1199
1200 unsafe impl Send for TimeSeriesEmitter {}
1201
1202 impl TimeSeriesEmitter {
1203 /// Clone the emitter
1204 ///
1205 /// The emitter can only be cloned when it is mutable. The emitter calls
1206 /// into C++ code which may call into Rust again. If emmitting is possible
1207 /// from immutable structures, that might lead to access to a mutable
1208 /// reference. That is undefined behaviour and forbidden.
1209 pub fn clone(&mut self) -> TimeSeriesEmitter {
1210 TimeSeriesEmitter {
1211 qobject: self.qobject.clone(),
1212 new_data_ready: self.new_data_ready,
1213 }
1214 }
1215 fn clear(&self) {
1216 let n: *const TimeSeriesQObject = null();
1217 self.qobject.store(n as *mut TimeSeriesQObject, Ordering::SeqCst);
1218 }
1219 pub fn new_data_ready(&mut self) {
1220 let ptr = self.qobject.load(Ordering::SeqCst);
1221 if !ptr.is_null() {
1222 (self.new_data_ready)(ptr);
1223 }
1224 }
1225 }
1226
1227 #[derive(Clone)]
1228 pub struct TimeSeriesList {
1229 qobject: *mut TimeSeriesQObject,
1230 layout_about_to_be_changed: extern fn(*mut TimeSeriesQObject),
1231 layout_changed: extern fn(*mut TimeSeriesQObject),
1232 data_changed: extern fn(*mut TimeSeriesQObject, usize, usize),
1233 begin_reset_model: extern fn(*mut TimeSeriesQObject),
1234 end_reset_model: extern fn(*mut TimeSeriesQObject),
1235 begin_insert_rows: extern fn(*mut TimeSeriesQObject, usize, usize),
1236 end_insert_rows: extern fn(*mut TimeSeriesQObject),
1237 begin_move_rows: extern fn(*mut TimeSeriesQObject, usize, usize, usize),
1238 end_move_rows: extern fn(*mut TimeSeriesQObject),
1239 begin_remove_rows: extern fn(*mut TimeSeriesQObject, usize, usize),
1240 end_remove_rows: extern fn(*mut TimeSeriesQObject),
1241 }
1242
1243 impl TimeSeriesList {
1244 pub fn layout_about_to_be_changed(&mut self) {
1245 (self.layout_about_to_be_changed)(self.qobject);
1246 }
1247 pub fn layout_changed(&mut self) {
1248 (self.layout_changed)(self.qobject);
1249 }
1250 pub fn data_changed(&mut self, first: usize, last: usize) {
1251 (self.data_changed)(self.qobject, first, last);
1252 }
1253 pub fn begin_reset_model(&mut self) {
1254 (self.begin_reset_model)(self.qobject);
1255 }
1256 pub fn end_reset_model(&mut self) {
1257 (self.end_reset_model)(self.qobject);
1258 }
1259 pub fn begin_insert_rows(&mut self, first: usize, last: usize) {
1260 (self.begin_insert_rows)(self.qobject, first, last);
1261 }
1262 pub fn end_insert_rows(&mut self) {
1263 (self.end_insert_rows)(self.qobject);
1264 }
1265 pub fn begin_move_rows(&mut self, first: usize, last: usize, destination: usize) {
1266 (self.begin_move_rows)(self.qobject, first, last, destination);
1267 }
1268 pub fn end_move_rows(&mut self) {
1269 (self.end_move_rows)(self.qobject);
1270 }
1271 pub fn begin_remove_rows(&mut self, first: usize, last: usize) {
1272 (self.begin_remove_rows)(self.qobject, first, last);
1273 }
1274 pub fn end_remove_rows(&mut self) {
1275 (self.end_remove_rows)(self.qobject);
1276 }
1277 }
1278
1279 pub trait TimeSeriesTrait {
1280 fn new(emit: TimeSeriesEmitter, model: TimeSeriesList) -> Self;
1281 fn emit(&mut self) -> &mut TimeSeriesEmitter;
1282 fn row_count(&self) -> usize;
1283 fn insert_rows(&mut self, _row: usize, _count: usize) -> bool { false }
1284 fn remove_rows(&mut self, _row: usize, _count: usize) -> bool { false }
1285 fn can_fetch_more(&self) -> bool {
1286 false
1287 }
1288 fn fetch_more(&mut self) {}
1289 fn sort(&mut self, _: u8, _: SortOrder) {}
1290 fn cos(&self, index: usize) -> f32;
1291 fn set_cos(&mut self, index: usize, _: f32) -> bool;
1292 fn sin(&self, index: usize) -> f32;
1293 fn set_sin(&mut self, index: usize, _: f32) -> bool;
1294 fn time(&self, index: usize) -> f32;
1295 fn set_time(&mut self, index: usize, _: f32) -> bool;
1296 }
1297
1298 #[no_mangle]
1299 pub extern "C" fn time_series_new(
1300 time_series: *mut TimeSeriesQObject,
1301 time_series_new_data_ready: extern fn(*mut TimeSeriesQObject),
1302 time_series_layout_about_to_be_changed: extern fn(*mut TimeSeriesQObject),
1303 time_series_layout_changed: extern fn(*mut TimeSeriesQObject),
1304 time_series_data_changed: extern fn(*mut TimeSeriesQObject, usize, usize),
1305 time_series_begin_reset_model: extern fn(*mut TimeSeriesQObject),
1306 time_series_end_reset_model: extern fn(*mut TimeSeriesQObject),
1307 time_series_begin_insert_rows: extern fn(*mut TimeSeriesQObject, usize, usize),
1308 time_series_end_insert_rows: extern fn(*mut TimeSeriesQObject),
1309 time_series_begin_move_rows: extern fn(*mut TimeSeriesQObject, usize, usize, usize),
1310 time_series_end_move_rows: extern fn(*mut TimeSeriesQObject),
1311 time_series_begin_remove_rows: extern fn(*mut TimeSeriesQObject, usize, usize),
1312 time_series_end_remove_rows: extern fn(*mut TimeSeriesQObject),
1313 ) -> *mut TimeSeries {
1314 let time_series_emit = TimeSeriesEmitter {
1315 qobject: Arc::new(AtomicPtr::new(time_series)),
1316 new_data_ready: time_series_new_data_ready,
1317 };
1318 let model = TimeSeriesList {
1319 qobject: time_series,
1320 layout_about_to_be_changed: time_series_layout_about_to_be_changed,
1321 layout_changed: time_series_layout_changed,
1322 data_changed: time_series_data_changed,
1323 begin_reset_model: time_series_begin_reset_model,
1324 end_reset_model: time_series_end_reset_model,
1325 begin_insert_rows: time_series_begin_insert_rows,
1326 end_insert_rows: time_series_end_insert_rows,
1327 begin_move_rows: time_series_begin_move_rows,
1328 end_move_rows: time_series_end_move_rows,
1329 begin_remove_rows: time_series_begin_remove_rows,
1330 end_remove_rows: time_series_end_remove_rows,
1331 };
1332 let d_time_series = TimeSeries::new(time_series_emit, model);
1333 Box::into_raw(Box::new(d_time_series))
1334 }
1335
1336 #[no_mangle]
1337 pub unsafe extern "C" fn time_series_free(ptr: *mut TimeSeries) {
1338 Box::from_raw(ptr).emit().clear();
1339 }
1340
1341 #[no_mangle]
1342 pub unsafe extern "C" fn time_series_row_count(ptr: *const TimeSeries) -> c_int {
1343 to_c_int((&*ptr).row_count())
1344 }
1345 #[no_mangle]
1346 pub unsafe extern "C" fn time_series_insert_rows(ptr: *mut TimeSeries, row: c_int, count: c_int) -> bool {
1347 (&mut *ptr).insert_rows(to_usize(row), to_usize(count))
1348 }
1349 #[no_mangle]
1350 pub unsafe extern "C" fn time_series_remove_rows(ptr: *mut TimeSeries, row: c_int, count: c_int) -> bool {
1351 (&mut *ptr).remove_rows(to_usize(row), to_usize(count))
1352 }
1353 #[no_mangle]
1354 pub unsafe extern "C" fn time_series_can_fetch_more(ptr: *const TimeSeries) -> bool {
1355 (&*ptr).can_fetch_more()
1356 }
1357 #[no_mangle]
1358 pub unsafe extern "C" fn time_series_fetch_more(ptr: *mut TimeSeries) {
1359 (&mut *ptr).fetch_more()
1360 }
1361 #[no_mangle]
1362 pub unsafe extern "C" fn time_series_sort(
1363 ptr: *mut TimeSeries,
1364 column: u8,
1365 order: SortOrder,
1366 ) {
1367 (&mut *ptr).sort(column, order)
1368 }
1369
1370 #[no_mangle]
1371 pub unsafe extern "C" fn time_series_data_cos(ptr: *const TimeSeries, row: c_int) -> f32 {
1372 let o = &*ptr;
1373 o.cos(to_usize(row))
1374 }
1375
1376 #[no_mangle]
1377 pub unsafe extern "C" fn time_series_set_data_cos(
1378 ptr: *mut TimeSeries, row: c_int,
1379 v: f32,
1380 ) -> bool {
1381 (&mut *ptr).set_cos(to_usize(row), v)
1382 }
1383
1384 #[no_mangle]
1385 pub unsafe extern "C" fn time_series_data_sin(ptr: *const TimeSeries, row: c_int) -> f32 {
1386 let o = &*ptr;
1387 o.sin(to_usize(row))
1388 }
1389
1390 #[no_mangle]
1391 pub unsafe extern "C" fn time_series_set_data_sin(
1392 ptr: *mut TimeSeries, row: c_int,
1393 v: f32,
1394 ) -> bool {
1395 (&mut *ptr).set_sin(to_usize(row), v)
1396 }
1397
1398 #[no_mangle]
1399 pub unsafe extern "C" fn time_series_data_time(ptr: *const TimeSeries, row: c_int) -> f32 {
1400 let o = &*ptr;
1401 o.time(to_usize(row))
1402 }
1403
1404 #[no_mangle]
1405 pub unsafe extern "C" fn time_series_set_data_time(
1406 ptr: *mut TimeSeries, row: c_int,
1407 v: f32,
1408 ) -> bool {
1409 (&mut *ptr).set_time(to_usize(row), v)
1410 }