Modularizando o src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

call_manager.cpp

Committer:
klauss
Date:
2015-04-23
Revision:
117:e9facba9db27
Parent:
116:39a41ebb675c
Child:
119:ee6a53069455

File content as of revision 117:e9facba9db27:

#include "call_manager.h"

Timer invite_pkg_retry_timer;
Timer bye_pkg_retry_timer;

void init_invite_pgk_retry_manager( void ){
    invite_pkg_retry_timer.start();
}

void init_bye_pgk_retry_manager( void ){
    bye_pkg_retry_timer.start();
}

void invite_pgk_retry_manager( Vector * v_cb, uint8_t * data, uint8_t * write_buffer ){
    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_on_call ){
            if( cb->get_invite_response() == false ){
                invite_pkg_retry_timer.reset();
                
                //cb->set_msg_id( cb->get_msg_id() & ~BIT7 );
                cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
                
                send2callboxes( __build_cb_package__( cb->get_ext(), cb->get_port(), __INVITE__, ( char * )data, 
                    cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
                    
                return;
            }
        }
    }
}

void bye_pgk_retry_manager( Vector * v_cb, uint8_t * data, uint8_t * write_buffer ){
    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 ){
            if( cb->get_bye_response() == false ){
                bye_pkg_retry_timer.reset();
                
                //cb->set_msg_id( cb->get_msg_id() & ~BIT7 );
                cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
                
                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 ) );
                    
                return;
            }
        }
    }
}

VZ_call * __find_Call__( Vector * v_call, int ext ){
    VZ_call * call = NULL;
    for( register int i = 0; i < v_call->size(); i++ ){
        call = ( VZ_call * )v_call->get_element( i );
        if( call->get_cb_ext() == ext ) return( call );
    }
    return( NULL );
}

/* remove calls por timeout */
void call_manager( Vector * v_call, Vector * v_cb, uint8_t * data, uint8_t * write_buffer, Timeslice * ts ){
    for( register uint8_t i = 0; i < v_call->size(); i++ ){
        VZ_call * call = ( VZ_call * )v_call->get_element( i );
        if( call->is_timetofinish() || call->cbx_pkg_is_idle() ){
            
            if( debug_invite ){
                if( call->cbx_pkg_is_idle() ){ 
                    if( debug_invite ) debug_msg("Call timeout: no pkg");
                } else { 
                    if( debug_invite ) debug_msg("Call timeout"); 
                }
            }
            v_call->remove_element( i );
            Call_Box * cb = __find_CB__( v_cb, call->get_cb_ext() );
            if( cb != NULL ){ 
                cb->status = cb_idle;
                ts->return_timeslice( cb->get_timeslice() );
                cb->set_timeslice( 0x00 );
                data[ __TIMESLICE_PLACE__ ] = 0x00;
//                cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
                cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
                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();
                set_status( cb->sip->status, sip_idle );
                //cb->re_start_timer();
                cb -> reset_cb_status();
                //cb -> set_rtp_port ( 0 );
                //cb -> reset_rtp_timer ();
            }
            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 ){
            
        //}
        if( inviting_cb->status == cb_idle ){            
            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 );
                    cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
                     
                    if( debug_invite ) debug_msg( "-- Trying -- without TS --");
                    
                    return;
                }else{
                    data[ __TIMESLICE_PLACE__ ] = cb->get_timeslice();
                    
                    cb->cb_set_status( cb_ringing );
                    
                    cb->set_invite_response_pending();                    
                    
                    //cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ( ~BIT7 ) );
                    cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
                        
                    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( cb->get_sip_status() == sip_busy ){
                    cb->cb_set_status( cb_busy );
                }else if( call != NULL ){
                    if( __find_Call__( v_call, call->get_cb_ext() ) == NULL ) v_call -> add( call );
                    
                    call->init_cbx_pkg_idle_timer();
                    
                    if( cb->get_sip_status() == sip_on_call ){
                        
                        set_status( cb->status, cb_on_call );
                    
                        data[ __TIMESLICE_PLACE__ ] = cb->get_timeslice();  
                        
                        //cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
                        cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
                        
                        send2callboxes( __build_cb_package__( ext, port, __INVITE__, ( char * )data, 
                            cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
                        //debug_msg("send ok liga o mic");                        
                            
                        cb->set_invite_response_pending();
                        
                        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 );
                cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
                
                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 );
                        if( call != NULL ) 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 );
                cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
                
                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 );
                        if( call != NULL ) delete( call );
                        break;
                    }
                }
                //cb->re_start_timer();
                if( debug_invite ) debug_msg( "-- Trying -- denying call request --" );
                set_status( cb->status, cb_idle );
                set_status( cb->sip->status, sip_idle );
            }break;
        }
    }
}