Modularizando o src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

Revision:
78:1353744f01e1
Parent:
77:e8c0253b57bc
Child:
81:3656f00ab3db
--- a/call_manager.cpp	Tue Nov 25 18:43:01 2014 +0000
+++ b/call_manager.cpp	Tue Dec 16 12:13:01 2014 +0000
@@ -1,5 +1,7 @@
 #include "call_manager.h"
 
+// manage ts 
+
 VZ_call * __find_Call__( Vector * v_call, int ext ){
     VZ_call * call = NULL;
     for( register int i = 0; i < v_call->size(); i++ ){
@@ -21,7 +23,7 @@
                 ts->return_timeslice( cb->get_timeslice() );
                 cb->set_timeslice( 0x00 );
                 data[ __TIMESLICE_PLACE__ ] = 0x00;
-                cb->set_msg_id( ( ( cb->get_msg_id() ) + 1 ) & ( BIT7 ^ 0xff ) );
+                cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
                 send2callboxes( __build_cb_package__( cb->get_ext(), cb->get_port(), __CB_BYE__, 
                     ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
                 cb->send_bye();
@@ -31,4 +33,136 @@
             delete( call );    
         }
     }    
+}
+
+void invite_handler( Vector * v_call, Vector * v_cb, Timeslice * ts, Call_Box * inviting_cb ){
+    uint8_t data[ __CB_BUFFER_SIZE__ ];
+    uint8_t write_buffer[ __CB_BUFFER_SIZE__ ];
+    
+    if( inviting_cb != NULL ){
+        if( inviting_cb->status != cb_on_call ){
+            inviting_cb->cb_set_status( cb_trying );
+            if( debug_invite ) debug_msg("Request invite cbx status :: cb_trying" );
+        }
+    }
+    
+    for( register uint8_t i = 0; i < v_cb->size(); i++ ){
+        Call_Box * cb = ( Call_Box * )v_cb->get_element( i );
+        if( cb->get_status() == cb_idle || cb->get_status() == cb_on_call ) continue;
+        
+        int ext = cb->get_ext();
+        int port = cb->get_port();
+        
+        VZ_call * call = NULL;
+
+        switch( cb->status ){            
+            case cb_trying : {
+                uint8_t temp = cb->get_msg_id();
+                cb->set_msg_id( temp |= BIT7 );
+                cb->set_timeslice( ts->get_timeslice() );
+                if( cb->get_timeslice() == 0x00 ){
+                    
+                    cb->cb_set_status( cb_idle );
+                    
+                    data[ __TIMESLICE_PLACE__ ] = 0x00;
+      
+                    send2callboxes( __build_cb_package__( ext, port, __INVITE__, 
+                        ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+      
+                    set_status( cb->sip->status, sip_idle );
+                    
+                    cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
+                     
+                    if( debug_invite ) debug_msg( "-- Trying -- without TS --");
+                    
+                    return;
+                }else{
+                    data[ __TIMESLICE_PLACE__ ] = cb->get_timeslice();
+                    
+                    cb->cb_set_status( cb_ringing );
+                    
+                    send2callboxes( __build_cb_package__( ext, port, __INVITE__, 
+                        ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+                    
+                    if( debug_invite ) debug_msg(" -- %d on TS::%d -- ", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] );
+                }
+            }break;
+            case cb_ringing : {
+                call = cb->invite();
+            
+                if( call != NULL ){
+                    if( __find_Call__( v_call, call->get_cb_ext() ) == NULL ) v_call -> add( call );
+                    
+                    if( cb->get_sip_status() == sip_on_call ){
+                        
+                        set_status( cb->status, cb_on_call );
+                    
+                        data[ __TIMESLICE_PLACE__ ] = cb->get_timeslice();
+                        
+                        if( debug_invite ) debug_msg("ts::%d", cb->get_timeslice() );
+                        
+                        cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
+                            
+                        send2callboxes( __build_cb_package__( ext, port, __INVITE__, ( char * )data, 
+                            cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+                        
+                        if( debug_invite ) debug_msg( "-- ringing -- accepting call request --" );
+                    }
+                }else{
+                    if( cb->get_sip_status() == sip_denied ) cb->cb_set_status( cb_denied );
+                }
+            }break;
+            case cb_busy : {
+                set_status( cb->status, cb_idle );
+                ts->return_timeslice( cb->get_timeslice() );
+                cb->set_timeslice( 0x00 );
+                data[ __TIMESLICE_PLACE__ ] = 0x00;
+                if( debug_invite ) debug_msg(" -- %d on %d -- ", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] );
+                
+                cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
+                
+                send2callboxes( __build_cb_package__( ext, port, __CB_BYE__, 
+                    ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+                
+                if( debug_invite ) debug_msg( "-- Trying -- denying call request << Busy Here >> --" );
+                
+                for( register uint8_t i = 0; i < v_call->size(); i++ ){
+                    VZ_call * call = ( VZ_call * )v_call->get_element( i );
+                    if( call->get_cb_ext() == cb->get_ext() ){ 
+                        v_call->remove_element( i );
+                        delete( call );
+                        break;
+                    }
+                }
+        
+                cb->send_bye();
+                set_status( cb->sip->status, sip_idle );
+                cb->re_start_timer();
+            }break;
+            case cb_denied : {
+                ts->return_timeslice( cb->get_timeslice() );
+                cb->set_timeslice( 0x00 );
+                data[ __TIMESLICE_PLACE__ ] = 0x00;
+                if( debug_invite ) debug_msg(" -- %d on %d -- ", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] );
+                
+                cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
+                
+                send2callboxes( __build_cb_package__( ext, port, __CB_BYE__, 
+                    ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+                    
+                for( register uint8_t i = 0; i < v_call->size(); i++ ){
+                    VZ_call * call = ( VZ_call * )v_call->get_element( i );
+                    if( call->get_cb_ext() == cb->get_ext() ){ 
+                        v_call->remove_element( i );
+                        delete( call );
+                        break;
+                    }
+                }
+                
+                if( debug_invite ) debug_msg( "-- Trying -- denying call request --" );
+                set_status( cb->status, cb_idle );
+                set_status( cb->sip->status, sip_idle );
+            }break;
+        }
+    }
 }
\ No newline at end of file