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之间的关系?