@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相关推荐

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

    对于拨号INVITE的响应,常用有以下几种 1.OK(RINGING). 2.用户忙. 3.用户不存在. exosip获取sip事件的函数: qutecom-2-2-ad315899a4d2\wifo ...

  2. QuteCom手记:exosip初始化和构建INVITE请求

    @1.exosip初始化 qutecom/wifo/phapi/phapi.c fun:owplInit() Line:291 eXosip_set_user_agent(ua);设置SIP包头域Us ...

  3. QuteCom手记:phapi的声音驱动

    time: 2010-12-14 9:43:18 <-------主题:三个声音驱动-------> /wifo/phapi/phmedia-portaudio.c -- ph_pa_dr ...

  4. QuteCom手记:phapi发送和接收音频数据的流程(ortp portaudio)

    phapi发送和接收音频数据的流程简介. 通过ortp库(完整的源代码在ortp工程中)实现. oRTP协议将在另外一篇中介绍,这里只要知道它是用来发送和接收媒体流(音频和视频)的协议. 本篇只记录使 ...

  5. Linphone分析

    一linphone 架构及组成模块 2 二linphone 系统框图 3 三linphone 中各个模块说明 3 四linphone 中数据结构说明 7 五linphone 的初始化过程 7 六lin ...

  6. 如何接入IPC的GB28181平台

    通常工业级的IPC一般支持onvif,GB28181以及各厂家私有协议.上篇文章我们讲解如何通过onvif协议对接IPC,本文接下来介绍如何接入通过国内最主流的GB28181协议对接IPC.对于GB2 ...

  7. datagrid资料+ by iCeSnaker - Program rhapsody

    datagrid资料+ by iCeSnaker - Program rhapsody 关于datagrid的打印 http://www.chinaaspx.com/article/csharp/29 ...

  8. 【转贴CSDN】关于DataGrid的精华

    [转贴CSDN]关于DataGrid的精华 1.DataGrid动态模板列更新数据并且分页的例子 http://www.cnblogs.com/lovecherry/archive/2005/03/2 ...

  9. 来自CSDN的精华网址

    来自CSDN的精华网址,包括:WebForm中DataGrid及其它程序员收藏的精华 自认为以下文章比较经典,希望对初学者有用^_^ 1.DataGrid动态模板列更新数据并且分页的例子 http:/ ...

最新文章

  1. 小米数据管理与应用实践
  2. 享乐不尽 聚 VR一体机艳冠群雄
  3. 为什么ConcurrentHashMap是弱一致的
  4. 012 动态调试smali代码
  5. vi/vim使用教程
  6. mysql视图表怎么设置约束_MySQL一一sql的视图、索引、约束
  7. (C/C++) Link List - C++ 版本
  8. c# selenium chrome 文件下载_使用selenium从网站下载文件
  9. [android 游戏源码]-体育游戏-疯狂足球源码
  10. 雾霾的结构化责任主体
  11. ADODB.Recordset 错误 '800a0e7d' 的解决方法
  12. Java实现带发音的简易电子词典
  13. Gazebo踩坑(一)[Err] [REST.cc:205] Error in REST request
  14. c++编程求解二元二次方程组_c++:求解二元二次方程组(解析解)
  15. 时空序列预测模型之PredRNN(用ST-LSTM的预测学习循环神经网络)
  16. nvivo三天写论文!可视化操作实战
  17. Http超文本传输协议的特点
  18. 中国法定节假日天数以及世界各国放假天数
  19. C++/OpenCV实现图像目标识别与分类
  20. 智慧城市建设快速发展 难题颇多亟待解决

热门文章

  1. Python面向对象的编程
  2. Java 实现文章汉字关键词(违禁词)识别1.0
  3. 单片机我们都了解,但是单片机应用系统的开发流程你们知道吗
  4. android 华为荣耀v8不能上传视频,华为 荣耀V8 开启USB调试模式
  5. 2015春计算机应用技术基础,《计算机应用技术基础》.doc
  6. [转帖]什么是“可转换可赎回优先股”?小米集团实例详解
  7. 直流转压芯片及其电路——科创、竞赛项目、这一篇就够了
  8. Aspose.Words for .NET使用表格教程之应用格式(3)——使用表格样式
  9. 捷联惯导系统学习2.5(等效旋转矢量微分方程的泰勒级数解)
  10. keepalive的原理