UC故事2011/11/22

1. Session模块研究

* CUpdateType

typedef enum
{
 UPDATE_TYPE_ADD,
 UPDATE_TYPE_REMOVE,
 UPDATE_TYPE_MODIFY,
 UPDATE_TYPE_SUB,
 UPDATE_TYPE_UNSUB,
 UPDATE_TYPE_UNKNOW = 100
}CUpdateType;

 

* CConference::UpdateSessionChannel:完成什么功能了???

RtResult CConference::UpdateSessionChannel(CConfSession* session,
             DWORD numberChannel,
             const CUpdateChannel* sessChannels,
             BOOL onlycommand,
             BOOL isActive)

 

* CConference::UpdateResource() 

RtResult CConference::UpdateResource(
  DWORD numberResource,
  const CUpdateResource* confResources)
{
 RT_INFO_TRACE_THIS("CConference::UpdateResource, m_conf_status="<<m_conf_status
  <<": numberResource="<<numberResource);
 RT_ASSERTE_RETURN(CONF_STATUS_ENROLL_SUCCESS == m_conf_status, RT_ERROR_WRONG_STATUS);
 RT_ASSERTE(CRtThreadManager::IsEqualCurrentThread(m_selfThreadID));
 
 CInfoSvrUpdateConfResourcePdu pdu(
  GetNodeID(), m_top_serverID, numberResource, confResources);
 return SendData(&pdu);
}

 

* CConference::SendData

RtResult CConference::SendData(
       CRtMessageBlock& dat,
       DATA_Priority priority,
       DATAFLAG   dataFlag)
{
 RT_ASSERTE_RETURN(m_conn.Get(), RT_ERROR_WRONG_STATUS);
 return m_conf_status > CONF_STATUS_CONNECTING ?
  m_conn->SendData(dat, priority, dataFlag) : RT_ERROR_WRONG_STATUS;
}

 

* data priority & data flag


typedef enum
{
 DATA_PRIORITY_URGENT =0,
 DATA_PRIORITY_HIGH = 1,
 DATA_PRIORITY_MIDDLE =2,
 DATA_PRIORITY_LOW =3
}DATA_Priority;

typedef DWORD DATAFLAG;
enum{
//  Server 上需要处理的DataFlag类型
 DATA_FLAG_COMMAND  = 1,
 DATA_FLAG_DATA   = 2,

 DATA_FLAG_VOIP   = 3,
 DATA_FLAG_VOIP_COMBIN = 4,

 //share data
 DATA_FLAG_SHARED  = 5,

 //video
 DATA_FLAG_LP_VIDEO  = 6, // PRIORITY = 1 for h264
 DATA_FLAG_LI_VIDEO  = 7, // PRIORITY = 3 for h264
 DATA_FLAG_SI_VIDEO  = 8, //  for h263
 DATA_FLAG_SP_VIDEO  = 9, // PRIORITY = 0 for h264
 DATA_FALG_SLB_VIDEO  = 10, // PRIORITY = 2 for h264

 //media play
 DATA_FLAG_G_I_MP  = 11,
 DATA_FLAG_G_P_MP  = 12,

 //app share
 DATA_FLAG_G_I_AS  = 13,
 DATA_FLAG_G_P_AS  = 14,
 DATA_FLAG_P_AS   = 15,
 DATA_FLAG_I_AS   = 16,

};

 

* rtconfsess.dll的load

在load rtconfclient.dll的时候,load了

Loaded symbols for 'D:\study\uc-study-workspace\box-infoserver-trunk-20111116\bin\dlls\Debug\rtconfclient.dll'
Loaded 'C:\WINDOWS\system32\comdlg32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\winmm.dll', no matching symbolic information found.
Loaded symbols for 'D:\study\uc-study-workspace\box-infoserver-trunk-20111116\bin\dlls\Debug\rtconfsess.dll'
Loaded symbols for 'D:\study\uc-study-workspace\box-infoserver-trunk-20111116\bin\dlls\Debug\sdclient.dll'

......

 

Note:上述信息出现在DLLMain()之前

 if (ul_reason_for_call == DLL_PROCESS_ATTACH)
 {
  RT_INFO_TRACE("rtConfClient.dll Enter, Version: 4.2.0.0 Box");
//   _Module.Init(NULL, hInstance);
 }

 

Q: IConference::SetUserStatus与ISessionClient::SetUserStatus的关系是什么?

Q:自动load的机制是什么?

 

2. Client核心类图及关于XXXSink的理解

* XXXSink

如果某类是一种XXXSink,意味着该类实例通常会注入到XXXClass的一个实例,并且,XXXClass的实例会回调XXXSink中的某个OnYYY方法,以通知某件和XXX有关的YYY事件发生。。

比如,CConfMange是一种IConferenceSink,故在CConference::HandleSessionCreateIndicate()会调用CConfManage::OnSessionCreaetConfirm以通知Sesion已经Create。

如以下STACK TRACE所示:

CConfManage::OnSessionCreateConfirm(int 0, const CSessionKey & {...}, const CRtString & {0x0205ac41 ""}, ISessionClient * 0x02066f40) line 874 + 30 bytes
CConference::HandleSessionCreateIndicate(CInfoSvrSessionCreateIndicatePdu * 0x0205fc90) line 1800 + 54 bytes
CConference::OnReceiveData(CRtMessageBlock & {...}) line 1404


* 核心类

CMainFrame

IConferenceSink

CConfManage

IConference

CConference

ISessionClient

ISessionClientSink

CConferenceSession

 

* CConference

CConference是中心,拥有以下能力:

   # 有CConfManage instance( as IConferenceSink),可通过CConfManage对CMainFrame的行为进行修改

   # 有一个CConfSession列表,故能进行Session相关的操作

   # 有Connection的实例,故能通过网络做一些事?

           从接收信息角度看,是底层类(如XXXConnection调用Conference::OnReceiveData,然后调用XXXSession::OnReceiveData()?)

 

OnReceiveData():此为核心方法,将根据PDU的类型,做不同的业务处理。处理的过程中会通知CConfManage实例。

 

* CConfSession

Q:CConfSession没有网络能力,故所有与网络有关的事需要通过CConference instance?

     A:Yes. see the following code:


RtResult CConfSession::UpdateResource(        
        DWORD numberResource,
        CUpdateResource* sessResource)
{
    RT_INFO_TRACE_THIS("CConfSession::UpdateResource, sess type="<<m_sessKey.nSessionType<<",status="<<m_status
        <<": numberResource="<<numberResource);
    RT_ASSERTE_RETURN(m_status == SESSION_STATUS_ENROLLED, RT_ERROR_WRONG_STATUS);
    RT_ASSERTE_RETURN(numberResource && sessResource, RT_ERROR_INVALID_ARG);
    RT_ASSERTE(CRtThreadManager::IsEqualCurrentThread(m_conference.GetThreadID()));

    CInfoSvrUpdateSessResourcePdu pdu(
        GetUserID(), m_top_serverID, numberResource, sessResource);
    return m_conference.SendData(&pdu);
}


Q: IConnection, IConnProvider, IConnProviderSink之间的关系?

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值