📄 ua_appprobe.cpp
字号:
content.expires.delta_seconds == 0) {
VB_unsubscribe = 1;
}
} else {
VP_expires_header = NULL;
if (G_trace >= 1) {
fprintf(stderr, "== No Expires header.\n",
VP_expires_header -> structured_header ->
content.expires.delta_seconds);
}
}
// Send a 200 OK response
VP_Message_rsp = sip_msg_new_response(200,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL);
// Expires header is mandatory for a reply to a
// subscription
if(!VP_expires_header) {
// if(!VB_unsubscribe) {
VP_expires_header = sip_msg_new_expires_header(10, NULL, NULL);
// }
sip_msg_insert_header(VP_Message_rsp -> headers,
VP_expires_header,
-1);
sip_msg_free_header(VP_expires_header);
if (G_trace >= 1) {
fprintf(stderr, "== Adding Expires: 10 to 200 OK reponse\n");
}
} else {
sip_msg_insert_header(VP_Message_rsp -> headers,
VP_expires_header,
-1);
}
if (G_trace >= 1) {
fprintf(stderr, "== Sending 200 OK for SUBSCRIBE\n");
}
L_response = buildRsp(VP_RecvEvent,VP_Message_rsp);
if((status = getProbe().send(P_service,
P_session,
*L_response)) != SIP_SUCCESS) {
fprintf(stderr,
"== Error %d returned by getProbe().send\n", status);
}
// Send a notify
if((!G_snn_option) || (VB_unsubscribe))
{
sip_msg_message_t * VP_msg_notify;
char value[20];
sleep(1);
if(!VB_unsubscribe) {
if (G_trace >= 1) {
fprintf(stderr, "== Sending NOTIFY\n");
}
sprintf(value, "status_%d");
} else {
if (G_trace >= 1) {
fprintf(stderr, "== Sending NOTIFY terminated\n");
}
if(G_destroy_on_unsubscribe) {
if (G_trace >= 1) {
fprintf(stderr,
"== Destroying Session (-std option enabled)\n");
}
getProbe().destroySession(P_session,SIP_CAUSE_NORMAL);
return 1;
}
if(G_Buggy_terminated) {
sprintf(value, "state_not_terminated");
} else {
sprintf(value, "terminated");
}
}
VP_msg_notify = sip_msg_new_request
(SIP_MSG_NOTIFY,
sip_msg_new_empty_uri(),
NULL, NULL, NULL, NULL, NULL, NULL);
if(!VP_msg_notify) {
fprintf(stderr, "== Error creating new NOTIFY message\n");
}
VP_subscription_state = sip_msg_new_subscription_state_header
(value, NULL, -1, -1, NULL, NULL);
sip_msg_insert_header(VP_msg_notify -> headers,
VP_subscription_state,
-1);
sip_msg_free_header(VP_subscription_state);
L_response = buildReqInDialog(VP_RecvEvent,VP_msg_notify);
getProbe().send(P_service,
P_session,
*L_response);
}
} break;
case SIP_MSG_NOTIFY: {
if (G_trace >= 1) {
std::cerr << "== Received a NOTIFY Request"<<std::endl;
}
VB_message_processed = 1;
// Send a 200 OK response
VP_Message_rsp = sip_msg_new_response(200,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL);
if (G_trace >= 1) {
fprintf(stderr, "== Sending 200 OK for NOTIFY\n");
}
L_response = buildRsp(VP_RecvEvent,VP_Message_rsp);
if((status = getProbe().send(P_service,
P_session,
*L_response)) != SIP_SUCCESS) {
fprintf(stderr,
"== Error %d returned by getProbe().send\n", status);
}
} break;
} // switch
} else {
// This is a reply
sip_msg_header_t * cseq_header = VP_Message_recv -> headers ->
vector[sip_msg_find_and_parse_header
(VP_Message_recv -> headers,
SIP_MSG_HDR_CSEQ,
0, NULL)];
if(cseq_header -> structured_header -> content.cseq.method
== SIP_MSG_SUBSCRIBE) {
VB_message_processed = 1;
if (G_trace >= 1) {
fprintf(stderr, "== %d %s for SUBSCRIBE transaction received\n",
VP_Message_recv -> start_line.response.status_code,
VP_Message_recv -> start_line.response.reason_phrase);
}
if (G_subscribe && G_new_call)
{
UA_Session& L_session
= dynamic_cast <UA_Session&> (P_session);
FF_SipMessageContainer& L_RecvEvent =
dynamic_cast <FF_SipMessageContainer&>(P_message);
L_session.setState(UA_Session::CALL_CONFIRMED);
L_session.storeProviderId(L_RecvEvent);
L_session.setService(P_service);
callQueue.push_back(&L_session);
}
}
if(cseq_header -> structured_header -> content.cseq.method
== SIP_MSG_NOTIFY) {
VB_message_processed = 1;
if (G_trace >= 1) {
fprintf(stderr, "== %d %s for NOTIFY transaction received\n",
VP_Message_recv -> start_line.response.status_code,
VP_Message_recv -> start_line.response.reason_phrase);
}
}
}
}
catch (std::exception& e)
{
std::cerr << "== UASAppProbe::ProcessSubscriptionMessage, exception ["
<<e.what()<<"]"<<std::endl;
return -1;
}
return VB_message_processed;
}
SIP_Status UA_AppProbe::receive (SIP_Service& P_service,
SIP_Session& P_session,
SIP_Event& P_message) throw ()
{
// Declarations
// ------------
SIP_Event* L_response = 0;
sip_msg_message_t* L_Message_recv = 0;
sip_msg_message_t* L_Message_rsp = 0;
sip_msg_error_t L_error;
bool L_isStatelessMessage = false;
// will be automatically cleaned at the end of the method
std::auto_ptr<SIP_Event> L_message (&P_message);
try
{
FF_SipMessageContainer& L_RecvEvent =
dynamic_cast <FF_SipMessageContainer&>(P_message);
if(L_RecvEvent.getCallId().getProviderIdentifier()
== SIP_SRVC_NO_CALL) {
L_isStatelessMessage = true;
}
if (G_trace >= 1) {
fprintf(stderr,
"== ----------------------------------\n"
"== %s%s received for session 0x%p:\n"
"== Type = %d,\n"
"== Probe Name = %s,\n"
"== Probe copy Name = %s,\n"
"== Service name = %s,\n"
"== Call-ID = %d,\n"
"== Dialog-ID = %d,\n"
"== Trans-ID = %d,\n"
"== Sub-ID = %d,\n"
"== LP-ID = %d.\n",
(L_isStatelessMessage) ? "Call-stateless " : "",
(L_RecvEvent.getType() == 1) ? "SIP message" : "Control-event",
(void *)&P_session,
L_RecvEvent.getType(),
getName().c_str(),
getCopyName().c_str(),
P_service.getName().c_str(),
L_RecvEvent.getCallId().getProviderIdentifier(),
L_RecvEvent.getDialogId().getProviderIdentifier(),
L_RecvEvent.getTransactionId().
getProviderIdentifier(),
L_RecvEvent.getSubscriptionId().
getProviderIdentifier(),
L_RecvEvent.getLPId());
}
if (L_RecvEvent.getType() == 2)
{
if (!G_silent) {
printf("Control event received : %s.\n",
VP_control_event_to_string(L_RecvEvent.getEvent()));
}
if (G_trace >= 1)
fprintf(stderr,
"== UA_AppProbe::receive ctrl message [%s] received\n",
VP_control_event_to_string(L_RecvEvent.getEvent()));
if( (L_RecvEvent.getEvent()==FF_SESS_MUST_BE_DELETED)
|| (L_RecvEvent.getEvent()==FF_SESS_MUST_BE_DELETED_ON_ERR)){
if (G_trace >= 1) {
fprintf(stderr,
"== %s => calling getProbe().destroySession...\n",
VP_control_event_to_string(L_RecvEvent.getEvent()));
}
getProbe().destroySession(P_session,SIP_CAUSE_NORMAL);
}
return SIP_SUCCESS;
}
L_Message_recv = L_RecvEvent.getPayload();
if (L_RecvEvent.getPayload() == 0)
{
if (G_trace >= 1)
std::cerr <<"== UA_AppProbe::receive there is no SIP PDU !!"
<< std::endl;
return SIP_INTERNAL_FAILURE;
}
print_message_info(L_Message_recv, "Receiving");
if(ProcessSubscriptionMessage(P_service,
P_session,
P_message) >= 0) {
return SIP_SUCCESS;
}
UA_Session& L_session = dynamic_cast <UA_Session&> (P_session);
// Message analysis
// ----------------
switch (L_session.getState())
{
case UA_Session::CALL_INITIAL:
{
printf("in UA_Session::CALL_INITIAL!!\n");
if (L_Message_recv->kind!=SIP_MSG_REQUEST)
{
throw std::runtime_error
("UA_AppProbe::receive unexpected response");
}
switch(L_Message_recv->start_line.request.method)
{
case SIP_MSG_INVITE:
{
printf("in receive SIP_MSG_INVITE!!\n");
sip_msg_body_t * L_body = sip_msg_new_body_copy
(L_Message_recv->body,
SIP_MSG_PHYSICAL_COPY,
0);
if (G_trace >= 1)
std::cerr << "== Received a INVITE Request"<<std::endl;
switch (G_reply)
{
case 0:
case 1:
if (!L_isStatelessMessage) {
// Send a RINGING response
L_Message_rsp = sip_msg_new_response(180,
NULL,
NULL,
NULL,
NULL,
NULL,
&L_error);
L_response = buildRsp(L_RecvEvent,L_Message_rsp);
getProbe().send(P_service,P_session,*L_response);
}
case 2:
{
// Send a 200 OK response
L_Message_rsp = sip_msg_new_response(200,
NULL,
NULL,
NULL,
L_body,
NULL,
&L_error);
sip_msg_free_body(L_body);
// If the application (or its backup for lazy High-Availability
// purpose) plans to receive stateless messages, we need to
// specify the username in the contact header of the first 200 OK
// response.
//
// This username will be used in the backup application to find
// the LP when a stateless message will arrive.
if(G_stateless_messages) {
if(sip_msg_insert_header
(L_Message_rsp -> headers,
sip_msg_new_contact_header
(sip_msg_new_sip_url(G_service_username,
(char *)""))) != SIP_NORMAL){
std::cerr << "== Unable to insert the contact header"<<std::endl;
break ;
}
}
L_response = buildRsp(L_RecvEvent,L_Message_rsp);
getProbe().send(P_service,P_session,*L_response);
L_session.setState(UA_Session::CALL_SUCCESS);
}
break;
case 3:
{
// Send a 302 OK response
L_Message_rsp = sip_msg_new_response
(302,
L_Message_recv->start_line.request.version,
NULL,
NULL,
L_body,
NULL,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -