static void notify_last_response(SalOp *op, SalOp *newcall){ belle_sip_client_transaction_t *tr=newcall->pending_client_trans; belle_sip_response_t *resp=NULL; if (tr){ resp=belle_sip_transaction_get_response((belle_sip_transaction_t*)tr); } if (resp==NULL){ send_notify_for_refer(op, 100, "Trying"); }else{ send_notify_for_refer(op, belle_sip_response_get_status_code(resp), belle_sip_response_get_reason_phrase(resp)); } }
int sal_call_notify_refer_state(SalOp *op, SalOp *newcall){ belle_sip_dialog_state_t state; if(belle_sip_dialog_get_state(op->dialog) == BELLE_SIP_DIALOG_TERMINATED){ return 0; } state = newcall->dialog?belle_sip_dialog_get_state(newcall->dialog):BELLE_SIP_DIALOG_NULL; switch(state) { case BELLE_SIP_DIALOG_EARLY: send_notify_for_refer(op, 100, "Trying"); break; case BELLE_SIP_DIALOG_CONFIRMED: send_notify_for_refer(op, 200, "Ok"); break; case BELLE_SIP_DIALOG_TERMINATED: case BELLE_SIP_DIALOG_NULL: notify_last_response(op,newcall); break; } return 0; }
int sal_call_notify_refer_state(SalOp *op, SalOp *newcall){ if(belle_sip_dialog_get_state(op->dialog) == BELLE_SIP_DIALOG_TERMINATED){ return 0; } belle_sip_dialog_state_t state=newcall->dialog?belle_sip_dialog_get_state(newcall->dialog):BELLE_SIP_DIALOG_NULL; switch(state) { case BELLE_SIP_DIALOG_NULL: case BELLE_SIP_DIALOG_EARLY: send_notify_for_refer(op,"SIP/2.0 100 Trying\r\n"); break; case BELLE_SIP_DIALOG_CONFIRMED: if(send_notify_for_refer(op,"SIP/2.0 200 Ok\r\n")) { /* we need previous notify transaction to complete, so buffer the request for later*/ /*op->sipfrag_pending="SIP/2.0 200 Ok\r\n";*/ ms_error("Cannot notify 200 ok frag to [%p] for new op [%p]",op,newcall); } break; default: break; } return 0; }