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 }