@@ -29,18 +29,28 @@ pub struct RegistrationScope {
29
29
30
30
impl RegistrationScope {
31
31
// FIXME: Generalize SingleHandlerListener::get_listener into a trait
32
- pub fn register < ' scope , ' handler : ' scope , H : Handler > ( & ' scope mut self , handler : & ' handler mut SingleHandlerListener < ' handler , H > ) {
32
+ pub fn register < ' scope , ' handler , P > ( & ' scope mut self , handler : & ' handler mut P ) where
33
+ ' handler : ' scope ,
34
+ P : ' handler + ListenerProvider
35
+ {
33
36
// Unsafe: Moving in a pointer to an internal structure to which we were given an exclusive
34
37
// reference that outlives self -- and whoever can create a Self guarantees that
35
38
// deregister_all() will be called before the end of this self's lifetime.
36
- unsafe { gcoap_register_listener ( handler. get_listener ( ) ) } ;
39
+ unsafe { gcoap_register_listener ( handler. get_listener ( ) as * mut _ ) } ;
37
40
}
38
41
39
42
fn deregister_all ( & mut self ) {
40
43
panic ! ( "Registration callback returned, but Gcoap does not allow deregistration." ) ;
41
44
}
42
45
}
43
46
47
+ pub trait ListenerProvider {
48
+ /// Provide an exclusive reference to the underlying gcoap listener. The function is marked
49
+ /// unsafe as the returned value contains raw pointers that will later be dereferenced, and
50
+ /// returning arbitrary pointers would make RegistratinScope::register() pass bad data on to C.
51
+ unsafe fn get_listener < ' a > ( & ' a mut self ) -> & ' a mut gcoap_listener_t ;
52
+ }
53
+
44
54
pub struct SingleHandlerListener < ' a , H > {
45
55
_phantom : PhantomData < & ' a H > ,
46
56
resource : coap_resource_t ,
75
85
}
76
86
}
77
87
78
- pub fn get_listener ( & mut self ) -> * mut gcoap_listener_t {
79
- self . listener . resources = & self . resource ;
80
- self . listener . resources_len = 1 ;
81
- self . listener . next = 0 as * mut _ ;
82
-
83
- & mut self . listener as * mut _
84
- }
85
-
86
-
87
88
unsafe extern "C" fn call_handler (
88
89
pkt : * mut coap_pkt_t ,
89
90
buf : * mut u8 ,
97
98
}
98
99
}
99
100
101
+ impl < ' a , H > ListenerProvider for SingleHandlerListener < ' a , H >
102
+ where
103
+ H : ' a + Handler
104
+ {
105
+ unsafe fn get_listener ( & mut self ) -> & mut gcoap_listener_t {
106
+ self . listener . resources = & self . resource ;
107
+ self . listener . resources_len = 1 ;
108
+ self . listener . next = 0 as * mut _ ;
109
+
110
+ & mut self . listener
111
+ }
112
+
113
+ }
114
+
100
115
pub trait Handler {
101
116
fn handle ( & mut self , pkt : & mut PacketBuffer ) -> isize ;
102
117
}
0 commit comments