sh改写后的simplecall 运行的流程,非原版

1 : 在main 函数中 , 新建一个

pSimpleCall = tbnew CSimpleCall(CmdLineArgs);

接着再调用 Result = pSimpleCall->Init();

然后再 Result = pSimpleCall->Run();

2 : pSimpleCall->Run();  实际就是调用  CTBCMCLib::GetInstance()->Run(&mfQuit);

3:因为 CsimpleCall 的 定义是

class CSimpleCall
    : public CTBCMCLibUser
    , public ITBCAFServiceAlmMgmtClient            /* ALM (application launch management) client (being launched, shutdown, monitored by Toolpack OAM application) */
    , public ITBCAFServiceCmMgmtClient                /* CM (Configuration management) client (being notified when Toolpack configuration is reloaded) */
    , public ITBCMCFreeListener<CTBCMCLeg>            /* CTBCMCLeg free listener (we are responsible to free memory for terminated call legs) */
    , public ITBCMCFreeListener<ITBCAFCallFlow>    /* CTBCMCLeg free listener (we are responsible to free memory for terminated call flows) */

所以它能 接收到 calllegpresent 消息

四 :  在 Oncalllegpresent 事件里  , 判断NAP ,并根据NAP决定采用哪个 callplow

        else if (strNAP == "SIP1")
        {
            strCallFlow            = "TestCallee";
            strServiceTemplate    = "TestCallee";
        }

然后再根据  strServiceTemplate决定 new 一个什么样的callflow

        else if(strServiceTemplate == "TestCallee")
        {
            /*int rate[10] = {10, 30, 60, 120, 240, 480, 600, 1200, 2400, 3600};*/
            //int duration = rand() % rate[rand() % 10] + 3;
            int duration = rand() % 600 + 3;
            pCall = tbnew CVHTestCallee(duration, "prompt://DestNum", ConfigParams.mTextCDRFolder, this, this);
        }

最后调用此 pcall的 AddIncoming 和 InitCall 方法

Result = pCall->AddIncoming( in_LegId, ptrIncomingLegAttribute, ptrIncomingLegProtocolAttributes, ptrAcceptCallProtAttribute );
Result = pCall->InitCall(&pCall);

五 : 因为pcall是继承自 CVHCallFlow 的子类,  在 CVHCallFlow 中 , override 了 OnInitIncomingCallLeg 事件 , 调用

ProcessEvents(in_pCallLeg, Event_OnInitCallLeg, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

此处要重点说明: 不仅是 OnInitIncomingCallLeg 事件,实际上 , OnInitOutgoingCallLeg,OnInitCallLeg 等所有继承自CTBCAFCallFlow的事件都是类似这样的代码 :

TBX_RESULT CVHCallFlow::OnInitOutgoingCallLeg(PCTBCAFCallLeg in_pCallLeg, PCTBCMC_PROTOCOL_ATTRIBUTE io_pCreateCallProtocolAttribute)
{
TBCAF_MUTEX_GET_SCOPE_BEGIN(&mMutex)
    CAFCODE(CVHCallFlow::OnInitCallLeg)
    {
        ProcessEvents(in_pCallLeg, Event_OnInitCallLeg, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
        TBX_EXIT_SUCCESS(TBX_RESULT_OK);
    }
    CAFCODE_DEFAULT_HANDLE{}
    RETURN;
TBCAF_MUTEX_GET_SCOPE_END(&mMutex)
}

也就是说 , 处理过程全部转到了 ProcessEvents

六 : 然后在 CVHCallFlow的 ProcessEvents事件里 , 有这样的代码

                switch(mState)
                {
                case STATE_IncomingLeg:
                    result = StateIncomingLeg(in_pCallLeg, in_vhEvent, io_ppThis, in_ProtocolAttribute, in_Reason, in_pEvent, in_pError, in_pMediaProfile, in_pIVR_Reason, in_pMedia_Reason, in_CollectedDigitAttribute);
                    TBCAF_EXIT_ON_ERROR(result, "StateIncomingLeg failed");
                    break;

这里的 STATE_IncomingLeg 是 CVHCallFlow 子类构造函数的参数

所有继承自 CVHCallFlow 的子类 , 只需设置好自己的所有可能的state ,  并编写相应的 StateIncomingLeg(针对STATE_IncomingLeg 状态 ) ,以及其他 StateXXX 即可 。

并在何时的state里 , 真正把2个callLeg连接起来 。

时间: 2024-10-24 23:49:29

sh改写后的simplecall 运行的流程,非原版的相关文章

Openwrt启动后的脚本运行

Openwrt系统启动后,首先运行/etc/preinit脚本 以newifi y1s为例,刷入Pandorabox固件 #!/bin/sh # Copyright (C) 2006 OpenWrt.org # Copyright (C) 2010 Vertical Communications [ -z "$PREINIT" ] && exec /sbin/init export PATH=/bin:/sbin:/usr/bin:/usr/sbin pi_ifname

iphone按home键后,正在运行的程序是否退出了呢?

是否一直有个疑问,当iphone手机正在运行一个APP,如果按Home键后,那么原来正在运行的程序还在运行吗?如果开发过ios程序,可能不是问题,如果没有开发过的,可能会疑惑了,我就简单的说一下.以几个问题的形式来说明,以正在运行QQ为例. 1.为什么按home键后,长时间不操作,再启动qq的话,会重新运行qq(没有回到原来的状态)? 答:iphone实际上是伪后台,按home键后,程序就退出了.所以我们iphone中使用的程序一般都没有退出键. 试想一下,如果程序有退出键的话,那么当程序无响应

Servlet简介与Servlet和HttpServlet运行的流程

1.Servlet [1] Servlet简介 > Server + let > 意为:运行在服务器端的小程序. > Servlet实际上就是一个接口. - 狭义上的Servlet,指的就是Servlet接口 - 广义上的我们认为凡是实现Servlet接口的类,我们都称他是一个Servlet ***** > Servlet的作用: 1.接收用户发送的请求 2.调用其他的java程序来处理请求 3.根据处理结果,返回给用户一个页面 > Servlet的HelloWorld 1.

android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序

android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序 在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity, 结果总是存在好几个同样的activity,就算要返回的activity正在前台,点击消息后也会重新打开一个一样的activity,返回好几次才能退出, 而不能像qq之类的点击通知栏消息回到之前存在的activity,如果存在就不再新建一个activity 说的有点绕,如果是遇到此类问题的肯定能懂,没遇到

删除mac 自带的python2.7后,XCODE运行失败,如下图,重装python2.7后解决,以后不敢乱动了。

删除mac 自带的python2.7后,XCODE运行失败,如下图,重装python2.7后解决,以后不敢乱动了.

一个计时器, 点击按钮 让他 停一会, 5s后继续自动运行

<div id="time" style="border:solid 1px #ddd; display:inline-block; width:50px; height:30px; vertical-align:middle"></div><input type="button" id="btn" value="停止"> <script type="te

[Sencha ExtJS] 关于build production后,浏览器运行报错&#39;Uncaught TypeError: c is not a function&#39;

原文:http://blog.csdn.net/lovelyelfpop/article/details/51328783 估计很多人用 ExtJS6 + Sencha Cmd 6 的时候,遇到过一种情况:开发的时候明明正常的,build之后运行就报了下面的错误 Uncaught TypeError: c is not a function 心里一万个草泥马奔腾:What the hell is this?(这TM什么JB玩意?) 其实根本原因是你忘记了requires某个类导致的. 比如你这样

android studio从1.5更新到2.0后terminal无法运行gradle命令,提示无法找到gradle命令

android studio从1.5更新到2.0后terminal无法运行gradle命令,提示无法找到gradle命令. 'gradle' 不是内部或外部命令,也不是可运行的程序 或批处理文件. 设置由于升级后android studio后gradle版本发生了变化,而系统环境变量未做相应的更新导致. 修改系统环境变量:Path,将D:\Android\Android Studio\gradle\gradle-2.8\bin;改为D:\Android\Android Studio\gradle

升级最新JRE后JavaFX Applet运行异常RuntimeException: Internal graphics not initialized yet

背景介绍-升级JRE后Applet无法运行 这两天Oracle发布了JDK的最新版本 JFK_1.8_60.我们有个客户第一时间更新了最新的版本,这导致了他无法运行我们的Applet(Swing+JavaFX2)产品. 每次遇到因为升级JRE而引起的环境问题,心中都要默默骂Oracle 100遍.以前出现过升级JRE后要加强jar的安全设置问题,而且到现在有一些JRE版本启动Applet时会弹出警告,需要用户选择允许还是禁止.Applet绝对是一门过时的技术,可我还是要维护它. 问题分析和解决