@@ -3,10 +3,15 @@ use str0m::{change::SdpOffer, Candidate, Rtc};
33use systemstat:: { Platform , System } ;
44
55pub struct MswebrtcImpl {
6+ host : String ,
67 pc : Rtc ,
78 sockets : Vec < UdpSocket > ,
89}
910
11+ struct Info {
12+ builddate : String ,
13+ }
14+
1015#[ allow( dead_code) ]
1116#[ derive( Debug ) ]
1217pub struct MswebrtcError {
@@ -15,14 +20,14 @@ pub struct MswebrtcError {
1520}
1621
1722impl MswebrtcImpl {
18- fn connect_internal ( & mut self , host : String ) -> Result < ( ) , MswebrtcError > {
23+ fn connect ( & mut self ) -> Result < ( ) , MswebrtcError > {
1924 let client = reqwest:: blocking:: Client :: builder ( )
2025 . danger_accept_invalid_certs ( true )
2126 . build ( )
2227 . unwrap ( ) ;
2328 let offer = SdpOffer :: from_sdp_string (
2429 client
25- . get ( host. clone ( ) + "/offer" )
30+ . get ( self . host . clone ( ) + "/offer" )
2631 . send ( )
2732 . map_err ( |e| MswebrtcError {
2833 what : "Failed to request offer" . to_owned ( ) ,
@@ -98,7 +103,7 @@ impl MswebrtcImpl {
98103 err : Some ( Box :: new ( e) ) ,
99104 } ) ?;
100105 client
101- . post ( host + "/answer" )
106+ . post ( self . host . clone ( ) + "/answer" )
102107 . header ( "content-type" , "application/json" )
103108 . body ( answer)
104109 . send ( )
@@ -108,45 +113,85 @@ impl MswebrtcImpl {
108113 err : Some ( Box :: new ( e) ) ,
109114 } ) ?
110115 }
111- fn connect ( & mut self , host : String ) -> bool {
112- match self . connect_internal ( host) {
113- Ok ( _) => true ,
114- Err ( e) => {
115- println ! ( "ERROR CONNECTING: {:?}" , e) ;
116- false
117- }
118- }
119- }
120116 fn disconnect ( & self ) {
121117 println ! ( "DISCONNECT" ) ;
122118 }
119+
120+ fn get_info ( & self ) -> Result < Info , MswebrtcError > {
121+ let client = reqwest:: blocking:: Client :: builder ( )
122+ . danger_accept_invalid_certs ( true )
123+ . build ( )
124+ . unwrap ( ) ;
125+ let j = client
126+ . get ( self . host . clone ( ) + "/info.json" )
127+ . send ( )
128+ . map_err ( |e| MswebrtcError {
129+ what : "Failed to request offer" . to_owned ( ) ,
130+ err : Some ( Box :: new ( e) ) ,
131+ } ) ?;
132+ let j = j. text ( ) . map_err ( |e| MswebrtcError {
133+ what : "Failed to extract offer from HTTP response" . to_owned ( ) ,
134+ err : Some ( Box :: new ( e) ) ,
135+ } ) ?;
136+ let j: serde_json:: Value = serde_json:: from_str ( j. as_str ( ) ) . map_err ( |e| MswebrtcError {
137+ what : "Failed to parse info.json" . to_owned ( ) ,
138+ err : Some ( Box :: new ( e) ) ,
139+ } ) ?;
140+ Ok ( Info {
141+ builddate : j[ "build-time" ] . to_string ( ) ,
142+ } )
143+ }
123144}
124145
125146#[ no_mangle]
126- pub extern "C" fn create_mswebrtc_impl ( ) -> * mut MswebrtcImpl {
147+ pub extern "C" fn create_mswebrtc_impl ( host : * const std :: ffi :: c_char ) -> * mut MswebrtcImpl {
127148 let pc = Rtc :: new ( ) ;
128149 let out = Box :: new ( MswebrtcImpl {
150+ host : unsafe { std:: ffi:: CStr :: from_ptr ( host) }
151+ . to_str ( )
152+ . unwrap ( )
153+ . to_string ( ) ,
129154 pc : pc,
130155 sockets : Vec :: new ( ) ,
131156 } ) ;
132157 Box :: into_raw ( out)
133158}
134159
135160#[ no_mangle]
136- pub extern "C" fn connect_mswebrtc_impl (
161+ pub extern "C" fn connect_mswebrtc_impl ( obj : * mut MswebrtcImpl ) -> bool {
162+ let r = unsafe { & mut * obj } ;
163+ match r. connect ( ) {
164+ Ok ( _) => true ,
165+ Err ( e) => {
166+ println ! ( "ERROR CONNECTING: {:?}" , e) ;
167+ false
168+ }
169+ }
170+ }
171+
172+ #[ no_mangle]
173+ pub extern "C" fn get_info_mswebrtc_impl (
137174 obj : * mut MswebrtcImpl ,
138- addr : * const std:: ffi:: c_char ,
175+ mut buildtime : * mut std:: ffi:: c_char ,
139176) -> bool {
140- let ( r, addr) = unsafe {
141- (
142- & mut * obj,
143- std:: ffi:: CStr :: from_ptr ( addr as * const i8 )
144- . to_str ( )
145- . unwrap ( )
146- . to_string ( ) ,
147- )
148- } ;
149- r. connect ( addr)
177+ let r = unsafe { & * obj } ;
178+ let i = r. get_info ( ) ;
179+ match i {
180+ Ok ( i) => {
181+ for ( i, c) in i. builddate . chars ( ) . enumerate ( ) {
182+ unsafe { * buildtime = c as std:: ffi:: c_char } ;
183+ buildtime = buildtime. wrapping_add ( 1 ) ;
184+ if i >= 31 {
185+ break ;
186+ }
187+ }
188+ true
189+ }
190+ Err ( e) => {
191+ println ! ( "ERROR Getting Info: {:?}" , e) ;
192+ false
193+ }
194+ }
150195}
151196
152197#[ no_mangle]
0 commit comments