QuteCom手记:Phapi/exosip事件①拨号INVITE
@1、电话状态变化和电话事件传递
先看一下phapi的电话状态变化图,该图在phapi-old.h中可以找到
/**
* @defgroup phAPI Phone API
* @{
* 格式错误无法正常显示,见PHAPI-OLD.H*/
状态名字都很简单,不在赘述。在PHAPI中,当状态发生变化时都会触发对应的事件。
事件由owplFireCallEvent一系列系列函数发布,函数的声明在qutecom\wifo\phapi\phevents.h中定义。
事件的起源可能是从UI传递的命令,也可能是osip协议栈接收到的标识电话状态改变的数据包。用简单的流程图表示如下:
UI<==>owphone<==>SipWrapper(PhapiWrapper)<==>phapi<==>exosip<==>osip2
@2、拨打电话(makeCall)触发的事件链
按下界面下方拨号按钮拨打电话
$1、从UI传递消息给底层SIP协议栈的过程
QtCallBar::callButtonClickedSlot()//线程上下文在QCoreApplication::instance()中。
==>QtQuteCom::callButtonClicked()
==>CUserProfile::makeCall()
==>UserProfile::makeCall()//在QuteCom::getInstance()实例的上下文中执行
==>PhoneLine-::makeCall()
==>PhoneCall::setState(EnumPhoneCallState::PhoneCallStateDialing)
==>PhApiWrapper::makeCall()
==>owplCallConnect()// phapi
==>phLinePlaceCall_withCa()
| ==>eXosip_build_initial_invite()//exosip
| ==>eXosip_initiate_call()
|==> owplFireCallEvent(CALLSTATE_REMOTE_OFFERING);
owplFireCallEvent将一个CALLSTATE_REMOTE_OFFERING(通话邀请已经发出)的事件通过phapi发给一系列的callBack函数(对象)。
再看CALLSTATE_REMOTE_OFFERING如何传到UI上表示。
owplFireCallEvent(CALLSTATE_REMOTE_OFFERING)//phapi
==>owplFireEvent(EVENT_CATEGORY_CALLSTATE);
==>OWPL_EVENT_CALLBACK_PROC::cbFunc ()//回调函数,见①
==>phApiEventsHandler()//PhapiCallback.cpp
==>PhApiCallbacks::callProgress() //处理电话事件的回调,见②
==>PhApiWrapper::phoneCallStateChangedEvent()
==>PhApiWrapper::phoneCallStateChangedEventHandler()
|==>PhApiWrapper::phoneCallStateChangedEventHandler()//不做任何事,见③
| ==>SipCallbacks::phoneCallStateChangedEventHandler()
==>PhoneLine::setPhoneCallState()
==>PhoneCall::stateChangedEvent()
==>CPhoneCall::stateChangedEventHandler()//注意线程上下文切换至QCoreApplication(界面线程)④
==>QtPhoneCall::stateChangedEvent()//调整界面,显示正在拨号。
①通过PhApiCallbacks::startListeningPhApiEvents()为回调函数队列gEventSubscriber添加消息处理回调,phapi接收到事件后将逐个调用回调函数。因此如果需要监控所有的sip事件而不想修改原有的代码时,可以自己写一个函数xxxxxxxxEventHandler,然后用PhApiCallbacks::startListeningPhApiEvents()把自己写的回调挂上去。
②phApiEventsHandler()函数处理所有的sip事件,除了电话事件外还可以处理注册事件、message事件、notify事件、子状态sub state事件和错误error事件.
③这里PhApiWrapper接收事件,却又不处理,让我感到很疑惑。总之是在SipCallbacks的对象中处理事件。
④CPhoneCall::stateChangedEventHandler()使用PFactory::postEvent(event);,PFactory实际指向QtFactory(在使用GTK UI时指向GTKFactory)。见qutecom\qutecom\src\presentation\main.cpp line 262处。PFactory::postEvent(event)调用QtFactory::postEventImpl(event),最后调用QCoreApplication::postEvent().注意之前的代码执行都是在QuteCom::getInstance()的线程中执行。
但是注意不是所有的上下文切换都在QuteCom::getInstance()和QCoreApplication::getInstance()之间发生,如当收到sip消息时exosip2通信线程将传递事件给QCoreApplication::getInstance()线程处理。
QuteCom手记:Phapi/exosip事件①拨号INVITE相关推荐
- QuteCom手记:Phapi/exosip事件②INVITE的响应
对于拨号INVITE的响应,常用有以下几种 1.OK(RINGING). 2.用户忙. 3.用户不存在. exosip获取sip事件的函数: qutecom-2-2-ad315899a4d2\wifo ...
- QuteCom手记:exosip初始化和构建INVITE请求
@1.exosip初始化 qutecom/wifo/phapi/phapi.c fun:owplInit() Line:291 eXosip_set_user_agent(ua);设置SIP包头域Us ...
- QuteCom手记:phapi的声音驱动
time: 2010-12-14 9:43:18 <-------主题:三个声音驱动-------> /wifo/phapi/phmedia-portaudio.c -- ph_pa_dr ...
- QuteCom手记:phapi发送和接收音频数据的流程(ortp portaudio)
phapi发送和接收音频数据的流程简介. 通过ortp库(完整的源代码在ortp工程中)实现. oRTP协议将在另外一篇中介绍,这里只要知道它是用来发送和接收媒体流(音频和视频)的协议. 本篇只记录使 ...
- Linphone分析
一linphone 架构及组成模块 2 二linphone 系统框图 3 三linphone 中各个模块说明 3 四linphone 中数据结构说明 7 五linphone 的初始化过程 7 六lin ...
- 如何接入IPC的GB28181平台
通常工业级的IPC一般支持onvif,GB28181以及各厂家私有协议.上篇文章我们讲解如何通过onvif协议对接IPC,本文接下来介绍如何接入通过国内最主流的GB28181协议对接IPC.对于GB2 ...
- datagrid资料+ by iCeSnaker - Program rhapsody
datagrid资料+ by iCeSnaker - Program rhapsody 关于datagrid的打印 http://www.chinaaspx.com/article/csharp/29 ...
- 【转贴CSDN】关于DataGrid的精华
[转贴CSDN]关于DataGrid的精华 1.DataGrid动态模板列更新数据并且分页的例子 http://www.cnblogs.com/lovecherry/archive/2005/03/2 ...
- 来自CSDN的精华网址
来自CSDN的精华网址,包括:WebForm中DataGrid及其它程序员收藏的精华 自认为以下文章比较经典,希望对初学者有用^_^ 1.DataGrid动态模板列更新数据并且分页的例子 http:/ ...
最新文章
- 小米数据管理与应用实践
- 享乐不尽 聚 VR一体机艳冠群雄
- 为什么ConcurrentHashMap是弱一致的
- 012 动态调试smali代码
- vi/vim使用教程
- mysql视图表怎么设置约束_MySQL一一sql的视图、索引、约束
- (C/C++) Link List - C++ 版本
- c# selenium chrome 文件下载_使用selenium从网站下载文件
- [android 游戏源码]-体育游戏-疯狂足球源码
- 雾霾的结构化责任主体
- ADODB.Recordset 错误 '800a0e7d' 的解决方法
- Java实现带发音的简易电子词典
- Gazebo踩坑(一)[Err] [REST.cc:205] Error in REST request
- c++编程求解二元二次方程组_c++:求解二元二次方程组(解析解)
- 时空序列预测模型之PredRNN(用ST-LSTM的预测学习循环神经网络)
- nvivo三天写论文!可视化操作实战
- Http超文本传输协议的特点
- 中国法定节假日天数以及世界各国放假天数
- C++/OpenCV实现图像目标识别与分类
- 智慧城市建设快速发展 难题颇多亟待解决
热门文章
- Python面向对象的编程
- Java 实现文章汉字关键词(违禁词)识别1.0
- 单片机我们都了解,但是单片机应用系统的开发流程你们知道吗
- android 华为荣耀v8不能上传视频,华为 荣耀V8 开启USB调试模式
- 2015春计算机应用技术基础,《计算机应用技术基础》.doc
- [转帖]什么是“可转换可赎回优先股”?小米集团实例详解
- 直流转压芯片及其电路——科创、竞赛项目、这一篇就够了
- Aspose.Words for .NET使用表格教程之应用格式(3)——使用表格样式
- 捷联惯导系统学习2.5(等效旋转矢量微分方程的泰勒级数解)
- keepalive的原理