Skip to content

Commit 3ebee2e

Browse files
author
NICK
committed
Fix memory manager
1 parent 0ae83b7 commit 3ebee2e

File tree

5 files changed

+144
-158
lines changed

5 files changed

+144
-158
lines changed

macros/src/lib.rs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ pub fn native_object(_args: TokenStream, input: TokenStream) -> TokenStream {
9696
unsafe extern "C" fn get_prop_name<T: IComponentBase + IComponentInit>(_0: &T, num: i64, alias: i64) -> *const u16 {
9797
let _0 = &*((((_0 as *const T) as *const u8) as usize - 8) as *const T);
9898
let prop_name = _0.get_prop_name(num, alias);
99-
memory_manager().copy_utf16_str(prop_name)
99+
_0.mem_manager().copy_utf16_str(prop_name)
100100
}
101101
get_prop_name::<#ident>
102102
},
@@ -149,7 +149,7 @@ pub fn native_object(_args: TokenStream, input: TokenStream) -> TokenStream {
149149
unsafe extern "C" fn get_method_name<T: IComponentBase + IComponentInit>(_0: &T, num: i64, alias: i64) -> *const u16 {
150150
let _0 = &*((((_0 as *const T) as *const u8) as usize - 8) as *const T);
151151
let method_name = _0.get_method_name(num, alias);
152-
memory_manager().copy_utf16_str(method_name)
152+
_0.mem_manager().copy_utf16_str(method_name)
153153
}
154154
get_method_name::<#ident>
155155
},
@@ -222,6 +222,8 @@ pub fn native_object(_args: TokenStream, input: TokenStream) -> TokenStream {
222222
#[repr(C)]
223223
struct Inner {
224224
vtable: IComponentBaseVTable<#ident>,
225+
memory_manager: RefCell<*mut IMemoryManager>,
226+
connector1c: RefCell<*mut IConnector>,
225227
}
226228

227229
impl #ident {
@@ -232,7 +234,25 @@ pub fn native_object(_args: TokenStream, input: TokenStream) -> TokenStream {
232234

233235
impl IComponentInit for #ident {
234236
fn register_extension_as(&mut self, name: *mut *const u16) -> bool {
235-
unsafe { *name = memory_manager().copy_utf16_str(#ident_str); }
237+
unsafe { *name = self.mem_manager().copy_utf16_str(#ident_str); }
238+
true
239+
}
240+
241+
fn set_mem_manager(&mut self, mem: *mut c_void) -> bool {
242+
self.inner.memory_manager = RefCell::new(mem as *mut IMemoryManager);
243+
true
244+
}
245+
246+
fn mem_manager(&self) -> &mut IMemoryManager {
247+
unsafe { self.inner.memory_manager.borrow_mut().as_mut().unwrap() }
248+
}
249+
250+
fn connector(&self) -> &mut IConnector {
251+
unsafe { self.inner.connector1c.borrow_mut().as_mut().unwrap() }
252+
}
253+
254+
fn set_connector(&mut self, connector: *mut c_void) -> bool {
255+
self.inner.connector1c = RefCell::new(connector as *mut IConnector);
236256
true
237257
}
238258
}
@@ -245,6 +265,8 @@ pub fn native_object(_args: TokenStream, input: TokenStream) -> TokenStream {
245265
language_extension_vtable: NonNull::from(&#language_ext_vtable_name),
246266
locale_base_vtable: NonNull::from(&#locale_vtable_name),
247267
},
268+
memory_manager: RefCell::new(std::ptr::null_mut()),
269+
connector1c: RefCell::new(std::ptr::null_mut()),
248270
}
249271
}
250272
}
@@ -259,10 +281,11 @@ pub fn native_object(_args: TokenStream, input: TokenStream) -> TokenStream {
259281

260282
use std::ptr::NonNull;
261283
use std::ffi::c_void;
284+
use std::cell::RefCell;
262285
use ::native_1c::component::*;
263286
use ::native_1c::memory::*;
287+
use ::native_1c::connector::*;
264288
use ::native_1c::types::*;
265-
use ::native_1c::memory_manager;
266289
use ::native_1c::Derivative;
267290
use ::native_1c::widestring;
268291

src/component.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use std::ffi::c_void;
22
use std::ptr::NonNull;
3-
use crate::IConnector;
43
use crate::memory::IMemoryManager;
54
use crate::types::Variant;
5+
use crate::connector::IConnector;
66

77
#[repr(C)]
88
pub struct IInitDoneBaseVTable<T> {
@@ -48,12 +48,16 @@ pub struct IComponentBaseVTable<T> {
4848
}
4949

5050
pub trait IComponentInit where Self: IComponentBase {
51-
fn set_mem_manager(&mut self, mem: *mut c_void) -> bool {
52-
crate::set_memory_manager(mem as *mut IMemoryManager)
53-
}
51+
fn set_mem_manager(&mut self, mem: *mut c_void) -> bool;
52+
53+
fn mem_manager(&self) -> &mut IMemoryManager;
54+
55+
fn connector(&self) -> &mut IConnector;
56+
57+
fn set_connector(&mut self, connector: *mut c_void) -> bool;
5458

5559
fn _init(&mut self, connector: *mut c_void) -> bool {
56-
if crate::set_connector(connector as *mut IConnector) {
60+
if self.set_connector(connector) {
5761
return IComponentBase::init(self)
5862
}
5963
return false

src/connector.rs

Lines changed: 73 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,26 @@
11
use std::ffi::c_void;
22
use std::ptr::NonNull;
33
use widestring::U16CStr;
4-
use crate::memory_manager;
4+
use crate::memory::IMemoryManager;
55
use crate::types::Variant;
66

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+
724
#[repr(C)]
825
struct IConnectorVTable {
926
_drop: unsafe extern "C" fn(&mut IConnector),
@@ -17,41 +34,42 @@ struct IConnectorVTable {
1734
clean_event_buffer: unsafe extern "C" fn(&mut IConnector),
1835
set_status_line: unsafe extern "C" fn(&mut IConnector, *const u16) -> bool,
1936
reset_status_line: unsafe extern "C" fn(&mut IConnector),
37+
get_interface: unsafe extern "C" fn(&IConnector, Interface) -> *const c_void,
2038
}
2139

2240
#[repr(C)]
2341
pub struct IConnector {
24-
vtable: NonNull<IConnectorVTable>
42+
vtable: NonNull<IConnectorVTable>,
2543
}
2644

2745
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);
3149
unsafe { (self.vtable.as_mut().add_error)(self, code, source, descr, scode) }
3250
}
3351

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);
3654
let value = value as *mut Variant;
3755
let error = error as *mut u64;
3856
let mut error_description_ptr = std::ptr::null();
3957

4058
let result = unsafe { (self.vtable.as_mut().read)(self, prop_name, value, error, &error_description_ptr) };
4159
if !error_description_ptr.is_null() {
4260
*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);
4462
}
4563
result
4664
}
4765

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);
5068
unsafe { (self.vtable.as_mut().write)(self, prop_name, value as *const Variant) }
5169
}
5270

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);
5573
unsafe { (self.vtable.as_mut().register_profile_as)(self, profile_name) }
5674
}
5775

@@ -63,25 +81,62 @@ impl IConnector {
6381
unsafe { (self.vtable.as_mut().get_event_buffer_depths)(self) }
6482
}
6583

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);
7088
unsafe { (self.vtable.as_mut().external_event)(self, source, message, data) }
7189
}
7290

7391
pub fn clear_event_buffer(&mut self) {
7492
unsafe { (self.vtable.as_mut().clean_event_buffer)(self) }
7593
}
7694

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);
7997
unsafe { (self.vtable.as_mut().set_status_line)(self, message) }
8098
}
8199

82100
pub fn reset_status_line(&mut self) {
83101
unsafe { (self.vtable.as_mut().reset_status_line)(self) }
84102
}
85103

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+
}
86125

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+
}
87142
}

src/lib.rs

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,3 @@ pub mod types;
1111
pub mod memory;
1212
pub mod connector;
1313

14-
use memory::IMemoryManager;
15-
use connector::IConnector;
16-
17-
pub(crate) struct SafePointer<T>(*mut T);
18-
unsafe impl<T> Sync for SafePointer<T> {}
19-
unsafe impl<T> Send for SafePointer<T> {}
20-
21-
static MEMORY_MANAGER: OnceCell<SafePointer<IMemoryManager>> = OnceCell::new();
22-
static CONNECTOR: OnceCell<SafePointer<IConnector>> = OnceCell::new();
23-
24-
pub fn memory_manager() -> &'static mut IMemoryManager {
25-
unsafe { MEMORY_MANAGER.get().unwrap().0.as_mut().unwrap() }
26-
}
27-
28-
pub(crate) fn set_memory_manager(manager: *mut IMemoryManager) -> bool {
29-
MEMORY_MANAGER.get_or_init(|| SafePointer(manager));
30-
true
31-
}
32-
33-
pub fn connector() -> &'static mut IConnector {
34-
unsafe { CONNECTOR.get().unwrap().0.as_mut().unwrap() }
35-
}
36-
37-
pub(crate) fn set_connector(connector: *mut IConnector) -> bool {
38-
CONNECTOR.get_or_init(|| SafePointer(connector));
39-
true
40-
}
41-

0 commit comments

Comments
 (0)