⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ua_appprobe.cpp

📁 改进后的SIP SERVICE API
💻 CPP
📖 第 1 页 / 共 5 页
字号:
             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 + -