当前位置: 首页 > 工具软件 > QuteCom > 使用案例 >

QuteCom手记:Phapi/exosip事件②INVITE的响应

关项明
2023-12-01
对于拨号INVITE的响应,常用有以下几种

1、OK(RINGING).

2、用户忙。

3、用户不存在。

 

exosip获取sip事件的函数:

qutecom-2-2-ad315899a4d2\wifo\eXosip\src\eXosip2.h

eXosip_event_t *eXosip_event_wait(int tv_s, int tv_ms);

 所有的事件都在这里接收。

 

phapi中调用eXosip_event_wait获取和处理sip事件:

qutecom-2-2-ad315899a4d2\wifo\phapi\phapi-old.c

  

static int ph_event_get(){
	
	//...
	
	for (;;) {  
		//在void *ph_api_thread(void *arg)线程中循环获取sip事件,并向上传递。
		  
  		je = eXosip_event_wait(0,phWaitTimeout);//获取事件,保存到je
  		
		if(je==NULL) {
			break;
		}
		
		counter++;

		if(phDebugLevel > 0) {
			ph_printf("\n<- %s (%i %i) [%i %s] %s requri=%s\n",
				evtnames[je->type], je->cid, je->did,
				je->status_code,
				je->reason_phrase,
				je->remote_uri,
				je->req_uri);
		}

		// get the plugin corresponding to that content-type
		
		if(isCallEvent(je)) {
			//SIP电话事件
			
			if((ca = ph_locate_call(je, je->type == EXOSIP_CALL_NEW ? 1 : 0)) == NULL) {
				return -1;
			}

			//...
			if(ca->owplPlugin == NULL) {
				ph_process_call_event_default(je);
				//向上传递sip事件
				
			} else {
				owplFireExosipCallEvent(je);
				//使用sip插件的情况。
				
			}

			ph_update_callstate_by_event(je);
            
            
		}else{
			switch(je->type){
				//SIP注册事件、消息事件、选项事件等除了电话事件的其他事件。
				
				case EXOSIP_REGISTRATION_SUCCESS:
					ph_reg_progress(je);
					break;
                                     //......

                                     //case .......

			         case EXOSIP_ENGINE_STOPPED:
					return -2;

				default:
					if(phDebugLevel > 0) {
						ph_printf("event(%i %i %i %i) text=%s\n", je->cid, je->sid, je->nid, je->did, je->textinfo);
					}
					break;
			}
		}

		eXosip_event_free(je);
	}

	ph_refresh_vlines();
	ph_scan_calls();

	if (counter>0) {
		return 0;
	}
	return -1;
}


 

 $1、完整流程以回复OK为例

ph_process_call_event_default( )//EXOSIP_CALL_RINGING

    ==>ph_call_ringing(je);

        ==>ph_call_retrieve_payloads   //启动本方的媒体流,仅回复OK时。

        ==>ph_call_media_start

              ==>ph_msession_start

                     ==>ph_msession_audio_start

        ==>owplFireCallEvent  (CALLSTATE_REMOTE_ALERTING,CALLSTATE_REMOTE_ALERTING_NORMAL,)  //以回复OK为例          

再透过SipCallbacks将事件传递给owphone模块.

    SipCallbacks::phoneCallStateChangedEventHandler

          ==>PhoneLine::setPhoneCallState

                ==>PhoneCall::setState

                       ==>CPhoneCall::stateChangedEventHandlerThreadSafe

                              ==>QtPhoneCall::stateChangedEvent

                                    ==>QtPhoneCall::updateStatusLabel//显示状态(正在拨号、用户找不到或者用户忙)



 

 

 类似资料: