1
1
use std:: ffi:: c_void;
2
2
use std:: ptr:: NonNull ;
3
3
use widestring:: U16CStr ;
4
- use crate :: memory_manager ;
4
+ use crate :: memory :: IMemoryManager ;
5
5
use crate :: types:: Variant ;
6
6
7
+ #[ repr( u8 ) ]
8
+ enum Interface {
9
+ IMsgBox = 0 ,
10
+ IPlatformInfo = 1 ,
11
+ }
12
+
13
+ #[ repr( C ) ]
14
+ struct IMessageBoxVTable {
15
+ confirm : unsafe extern "C" fn ( & IMessageBox , * const u16 , * mut Variant ) -> bool ,
16
+ alert : unsafe extern "C" fn ( & IMessageBox , * const u16 ) -> bool ,
17
+ }
18
+
19
+ #[ repr( C ) ]
20
+ struct IMessageBox {
21
+ vtable : NonNull < IMessageBoxVTable >
22
+ }
23
+
7
24
#[ repr( C ) ]
8
25
struct IConnectorVTable {
9
26
_drop : unsafe extern "C" fn ( & mut IConnector ) ,
@@ -17,41 +34,42 @@ struct IConnectorVTable {
17
34
clean_event_buffer : unsafe extern "C" fn ( & mut IConnector ) ,
18
35
set_status_line : unsafe extern "C" fn ( & mut IConnector , * const u16 ) -> bool ,
19
36
reset_status_line : unsafe extern "C" fn ( & mut IConnector ) ,
37
+ get_interface : unsafe extern "C" fn ( & IConnector , Interface ) -> * const c_void ,
20
38
}
21
39
22
40
#[ repr( C ) ]
23
41
pub struct IConnector {
24
- vtable : NonNull < IConnectorVTable >
42
+ vtable : NonNull < IConnectorVTable > ,
25
43
}
26
44
27
45
impl IConnector {
28
- pub fn add_error ( & mut self , code : u16 , source : & str , descr : & str , scode : i64 ) -> bool {
29
- let source = memory_manager ( ) . copy_utf16_str ( source) ;
30
- let descr = memory_manager ( ) . copy_utf16_str ( descr) ;
46
+ pub fn add_error ( & mut self , code : u16 , source : & str , descr : & str , scode : i64 , manager : & mut IMemoryManager ) -> bool {
47
+ let source = manager . copy_utf16_str ( source) ;
48
+ let descr = manager . copy_utf16_str ( descr) ;
31
49
unsafe { ( self . vtable . as_mut ( ) . add_error ) ( self , code, source, descr, scode) }
32
50
}
33
51
34
- pub fn read ( & mut self , prop_name : & str , value : & mut Variant , error : & mut u64 , error_description : & mut String ) -> bool {
35
- let prop_name = memory_manager ( ) . copy_utf16_str ( prop_name) ;
52
+ pub fn read ( & mut self , prop_name : & str , value : & mut Variant , error : & mut u64 , error_description : & mut String , manager : & mut IMemoryManager ) -> bool {
53
+ let prop_name = manager . copy_utf16_str ( prop_name) ;
36
54
let value = value as * mut Variant ;
37
55
let error = error as * mut u64 ;
38
56
let mut error_description_ptr = std:: ptr:: null ( ) ;
39
57
40
58
let result = unsafe { ( self . vtable . as_mut ( ) . read ) ( self , prop_name, value, error, & error_description_ptr) } ;
41
59
if !error_description_ptr. is_null ( ) {
42
60
* error_description = unsafe { U16CStr :: from_ptr_str ( error_description_ptr) . to_string ( ) . unwrap ( ) } ;
43
- memory_manager ( ) . free_memory ( ( & mut error_description_ptr as * mut * const u16 ) as * mut * const c_void ) ;
61
+ manager . free_memory ( ( & mut error_description_ptr as * mut * const u16 ) as * mut * const c_void ) ;
44
62
}
45
63
result
46
64
}
47
65
48
- pub fn write ( & mut self , prop_name : & str , value : & Variant ) -> bool {
49
- let prop_name = memory_manager ( ) . copy_utf16_str ( prop_name) ;
66
+ pub fn write ( & mut self , prop_name : & str , value : & Variant , manager : & mut IMemoryManager ) -> bool {
67
+ let prop_name = manager . copy_utf16_str ( prop_name) ;
50
68
unsafe { ( self . vtable . as_mut ( ) . write ) ( self , prop_name, value as * const Variant ) }
51
69
}
52
70
53
- pub fn register_profile_as ( & mut self , profile_name : & str ) -> bool {
54
- let profile_name = memory_manager ( ) . copy_utf16_str ( profile_name) ;
71
+ pub fn register_profile_as ( & mut self , profile_name : & str , manager : & mut IMemoryManager ) -> bool {
72
+ let profile_name = manager . copy_utf16_str ( profile_name) ;
55
73
unsafe { ( self . vtable . as_mut ( ) . register_profile_as ) ( self , profile_name) }
56
74
}
57
75
@@ -63,25 +81,62 @@ impl IConnector {
63
81
unsafe { ( self . vtable . as_mut ( ) . get_event_buffer_depths ) ( self ) }
64
82
}
65
83
66
- pub fn external_event ( & mut self , source : & str , message : & str , data : & str ) -> bool {
67
- let source = memory_manager ( ) . copy_utf16_str ( source) ;
68
- let message = memory_manager ( ) . copy_utf16_str ( message) ;
69
- let data = memory_manager ( ) . copy_utf16_str ( data) ;
84
+ pub fn external_event ( & mut self , source : & str , message : & str , data : & str , manager : & mut IMemoryManager ) -> bool {
85
+ let source = manager . copy_utf16_str ( source) ;
86
+ let message = manager . copy_utf16_str ( message) ;
87
+ let data = manager . copy_utf16_str ( data) ;
70
88
unsafe { ( self . vtable . as_mut ( ) . external_event ) ( self , source, message, data) }
71
89
}
72
90
73
91
pub fn clear_event_buffer ( & mut self ) {
74
92
unsafe { ( self . vtable . as_mut ( ) . clean_event_buffer ) ( self ) }
75
93
}
76
94
77
- pub fn set_status_line ( & mut self , message : & str ) -> bool {
78
- let message = memory_manager ( ) . copy_utf16_str ( message) ;
95
+ pub fn set_status_line ( & mut self , message : & str , manager : & mut IMemoryManager ) -> bool {
96
+ let message = manager . copy_utf16_str ( message) ;
79
97
unsafe { ( self . vtable . as_mut ( ) . set_status_line ) ( self , message) }
80
98
}
81
99
82
100
pub fn reset_status_line ( & mut self ) {
83
101
unsafe { ( self . vtable . as_mut ( ) . reset_status_line ) ( self ) }
84
102
}
85
103
104
+ fn get_interface ( & mut self , interface : Interface ) -> * const c_void {
105
+ unsafe { ( self . vtable . as_mut ( ) . get_interface ) ( self , interface) }
106
+ }
107
+
108
+ pub fn message_box_confirm ( & mut self , text : & str , manager : & mut IMemoryManager ) -> Result < Variant , ( ) > {
109
+ let interface = self . get_interface ( Interface :: IMsgBox ) ;
110
+ if interface. is_null ( ) {
111
+ return Err ( ( ) )
112
+ }
113
+
114
+ let mut ret= Variant :: empty ( ) ;
115
+ let text = manager. copy_utf16_str ( text) ;
116
+ let interface = unsafe { & mut * ( interface as * mut IMessageBox ) } ;
117
+ let result = unsafe { ( interface. vtable . as_mut ( ) . confirm ) ( interface, text, & mut ret as * mut Variant ) } ;
118
+ if result {
119
+ Ok ( ret)
120
+ }
121
+ else {
122
+ Err ( ( ) )
123
+ }
124
+ }
86
125
126
+ pub fn message_box_alert ( & mut self , text : & str , manager : & mut IMemoryManager ) -> Result < ( ) , ( ) > {
127
+ let interface = self . get_interface ( Interface :: IMsgBox ) ;
128
+ if interface. is_null ( ) {
129
+ return Err ( ( ) )
130
+ }
131
+
132
+ let text = manager. copy_utf16_str ( text) ;
133
+ let interface = unsafe { & mut * ( interface as * mut IMessageBox ) } ;
134
+ let result = unsafe { ( interface. vtable . as_mut ( ) . alert ) ( interface, text) } ;
135
+ if result {
136
+ Ok ( ( ) )
137
+ }
138
+ else {
139
+ Err ( ( ) )
140
+ }
141
+ }
87
142
}
0 commit comments