📄 cmchan.c
字号:
}
}
else
/* check database for partner lcn. In case of first audio or video */
{ /* use partner sid */
if (channel->sessionId==1) { ctrlE->bFirstAudioOut=0; ctrlE->bFirstAudioIn=0;}
if (channel->sessionId==2) { ctrlE->bFirstVideoOut=0; ctrlE->bFirstVideoIn=0;}
if (channel->sessionId==3) { ctrlE->bFirstDataOut=0; ctrlE->bFirstDataIn=0;}
}
}
ctrlE->conflictChannels++;
if(startEstablishment((HAPP)app, hsChan) < 0)
{
channel->eState = ChannelStateReleased;
notifyChannelState(channel,cmChannelStateDisconnected,cmChannelStateModeDisconnectedLocal);
notifyChannelState(channel,cmChannelStateIdle, cmChannelStateModeOff);
emaUnlock((EMAElement)hsChan);
cmiAPIExit((HAPP)app, "cmChannelOpenDynamic: startEstablishment failed");
return RV_ERROR_UNKNOWN;
}
emaUnlock((EMAElement)hsChan);
}
if (app->mibEvent.h341AddNewLogicalChannel)
app->mibEvent.h341AddNewLogicalChannel(app->mibHandle, hsChan);
cmiAPIExit((HAPP)app, "cmChannelOpenDynamic: [1].");
return RV_TRUE;
}
/* NOTE: origin should be the origin of the MESSAGE - as the recerive and transmit address assosiation is
determined by the EP to send the message */
int cmcCallAddressCallbacks(
IN cmElem* app,
IN H245Channel* channel,
IN int h225ParamNodeId,
IN RvBool origin)
{
HAPP hApp=(HAPP)app;
int tmpNodeId;
HPVT hVal=app->hVal;
int nesting;
tmpNodeId=pvtGetChild(hVal,h225ParamNodeId,__h245(mediaControlChannel),NULL);
if (tmpNodeId>=0)
{ /* -- RTCP */
cmTransportAddress ta;
if (cmVtToTA_H245(hVal,tmpNodeId, &ta) <0)
{
RvLogWarning(&app->logERR, (&app->logERR,
"H245Channel:establishIndication:RTCP: no IP address."));
}
else
{
if(app->cmMyChannelEvent.cmEvChannelSetRTCPAddress)
{
cmiCBEnter(hApp, "cmEvChannelSetRTCPAddress: haChan=0x%p, hsChan=0x%p, ip=0x%x, port=%d.",
emaGetApplicationHandle((EMAElement)channel), channel, ta.ip, ta.port);
nesting = emaPrepareForCallback((EMAElement)channel);
app->cmMyChannelEvent.cmEvChannelSetRTCPAddress((HAPPCHAN)emaGetApplicationHandle((EMAElement)channel), (HCHAN)channel, ta.ip, ta.port);
emaReturnFromCallback((EMAElement)channel, nesting);
cmiCBExit(hApp, "cmEvChannelSetRTCPAddress.");
}
}
if (!emaWasDeleted((EMAElement)channel))
{
int* tmpNodeId1;
if (origin) tmpNodeId1 = &channel->pChannelParams.data.h225Params.recvRtcpAddressID;
else tmpNodeId1= &channel->pChannelParams.data.h225Params.sendRtcpAddressID;
if ((*tmpNodeId1) < 0) *tmpNodeId1 = pvtAddRoot(hVal,NULL,0,NULL);
pvtSetTree(hVal, *tmpNodeId1, hVal, tmpNodeId);
}
}
tmpNodeId=pvtGetChild(hVal,h225ParamNodeId,__h245(mediaChannel),NULL);
if (tmpNodeId>=0)
{ /* -- RTP */
cmTransportAddress ta;
if (cmVtToTA_H245(hVal,tmpNodeId, &ta) <0)
{
RvLogWarning(&app->logERR, (&app->logERR,
"H245Channel:establishIndication:RTP: no IP address."));
}
else
{
switch(ta.type)
{
case cmTransportTypeIP:
cmiCBEnter(hApp, "cmEvChannelSetAddress: haChan=0x%p, hsChan=0x%p, ip=0x%x, port=%d.",
emaGetApplicationHandle((EMAElement)channel), channel, ta.ip, ta.port);
nesting = emaPrepareForCallback((EMAElement)channel);
ifE (app->cmMyChannelEvent.cmEvChannelSetAddress)((HAPPCHAN)emaGetApplicationHandle((EMAElement)channel), (HCHAN)channel, ta.ip, ta.port);
emaReturnFromCallback((EMAElement)channel, nesting);
cmiCBExit(hApp, "cmEvChannelSetAddress.");
break;
#if (RV_H323_TRANSPORT_ADDRESS != RV_H323_TRANSPORT_ADDRESS_IPV4_ONLY)
case cmTransportTypeNSAP:
{
int iLength;
cmiCBEnter(hApp, "cmEvChannelSetNSAPAddress: haChan=0x%p, hsChan=0x%p, addressLength=%d.", emaGetApplicationHandle((EMAElement)channel), channel, ta.length);
nesting = emaPrepareForCallback((EMAElement)channel);
iLength = ta.length;
ifE (app->cmMyChannelEvent.cmEvChannelSetNSAPAddress)((HAPPCHAN)emaGetApplicationHandle((EMAElement)channel), (HCHAN)channel, (char *)ta.route,iLength,
(RvBool)(ta.distribution==cmDistributionMulticast));
emaReturnFromCallback((EMAElement)channel, nesting);
cmiCBExit(hApp, "cmEvChannelSetNSAPAddress.");
if (!emaWasDeleted((EMAElement)channel) && channel->remotePortNumber>=0)
{
cmiCBEnter(hApp, "cmEvChannelSetATMVC: haChan=0x%p, hsChan=0x%p, portNumber=%d.", emaGetApplicationHandle((EMAElement)channel), channel, channel->remotePortNumber);
nesting = emaPrepareForCallback((EMAElement)channel);
ifE (app->cmMyChannelEvent.cmEvChannelSetATMVC) ((HAPPCHAN)emaGetApplicationHandle((EMAElement)channel), (HCHAN)channel, channel->remotePortNumber);
emaReturnFromCallback((EMAElement)channel, nesting);
cmiCBExit(hApp , "cmEvChannelSetATMVC.");
}
}
break;
#endif /* (RV_H323_TRANSPORT_ADDRESS != RV_H323_TRANSPORT_ADDRESS_IPV4_ONLY) */
default:
break;
}
}
{
int* tmpNodeId1;
if (origin) tmpNodeId1 = &channel->pChannelParams.data.h225Params.recvRtpAddressID;
else tmpNodeId1= &channel->pChannelParams.data.h225Params.sendRtpAddressID;
if ((*tmpNodeId1) < 0) *tmpNodeId1 = pvtAddRoot(hVal,NULL,0,NULL);
pvtSetTree(hVal, *tmpNodeId1, hVal, tmpNodeId);
}
}
return RV_TRUE;
}
static
int rejectChannel(H245Channel* channel, int rejectReason, int rejectMode)
{
HCONTROL ctrl=channel->hCtrl;
cmElem* app=(cmElem*)emaGetInstance((EMAElement)cmiGetByControl(ctrl));
HPVT hVal=app->hVal;
int message=pvtAddRoot(hVal,app->synProtH245,0,NULL);
int nodeId=pvtAddBranch2(hVal,message, __h245(response),__h245(openLogicalChannelReject));
int res;
pvtAdd(hVal,nodeId,__h245(forwardLogicalChannelNumber),channel->myLogicalChannelNum,NULL,NULL);
pvtAddBranch2(hVal,nodeId,__h245(cause),rejectReason);
res = sendMessageH245(ctrl, message);
pvtDelete(hVal,message);
channel->eState = ChannelStateReleased;
notifyChannelState(channel,cmChannelStateDisconnected,(cmChannelStateMode_e)rejectMode);
notifyChannelState(channel,cmChannelStateIdle, cmChannelStateModeOff);
return res;
}
static
int openLogicalChannelEvent(IN cmElem* app, IN HPVT hVal, IN H245Channel* channel, IN int message)
{
/* This function assumes that the channel element is locked */
/*openLCNevent*/
H245Control* ctrl;
RvInt32 baseLCN,replaceLCN;
int forwardLCP_ID,reverseLCP_ID,h225ID;
int nesting;
if (app->mibEvent.h341AddNewLogicalChannel)
app->mibEvent.h341AddNewLogicalChannel(app->mibHandle, (HCHAN)channel);
ctrl = (H245Control*)channel->hCtrl;
forwardLCP_ID=pvtGetChild(hVal,message, __h245(forwardLogicalChannelParameters), NULL);
pvtGetChildValue(hVal,forwardLCP_ID,__h245(portNumber),(RvInt32 *)&channel->remotePortNumber,NULL);
if (pvtGetChildValue(hVal,forwardLCP_ID, __h245(forwardLogicalChannelDependency), &baseLCN, NULL)>=0)
{
channel->pBase=getInChanByLCN((HCONTROL)ctrl,baseLCN);
if (!channel->pBase)
return rejectChannel(channel,__h245(invalidDependentChannel),cmChannelStateModeDisconnectedLocal);
}
if (pvtGetChildValue(hVal,forwardLCP_ID, __h245(replacementFor), &replaceLCN, NULL)>=0)
{
channel->pReplacementCh=getInChanByLCN((HCONTROL)ctrl,replaceLCN);
if (!channel->pReplacementCh)
return rejectChannel(channel,__h245(replacementForRejected),cmChannelStateModeDisconnectedLocal);
}
reverseLCP_ID=pvtGetChild(hVal,message, __h245(reverseLogicalChannelParameters), NULL);
/* check for bi-directional channnel.*/
if (reverseLCP_ID>=0)
channel->bIsDuplex=RV_TRUE;
{
int tmpId;
tmpId=pvtGetChild(hVal,forwardLCP_ID,__h245(dataType),NULL);
if (tmpId>=0)
{
if (channel->dataTypeID<0)
channel->dataTypeID=pvtAddRoot(hVal,NULL,0,NULL);
pvtMoveTree(hVal,channel->dataTypeID,tmpId);
}
}
/* separateStack */
if (channel->bIsDuplex)
{
int seperateStackNode, tmpId;
if(pvtGetChild(hVal, message, __h245(separateStack), &seperateStackNode) >= 0)
{
__pvtGetNodeIdByFieldIds(tmpId, hVal, seperateStackNode, {_h245(networkAddress) _h245(localAreaAddress) LAST_TOKEN});
if (tmpId >= 0)
{
if (channel->pChannelParams.data.h225Params.separateStackID < 0)
channel->pChannelParams.data.h225Params.separateStackID = pvtAddRoot(hVal, NULL, 0, NULL);
pvtMoveTree(hVal, channel->pChannelParams.data.h225Params.separateStackID, tmpId);
}
if(pvtGetChild(hVal, seperateStackNode, __h245(associateConference), &tmpId) >= 0)
pvtGet(hVal, tmpId, NULL, NULL, (RvInt32*)&channel->pChannelParams.data.h225Params.isAssociated, NULL);
if(pvtGetChild(hVal, seperateStackNode, __h245(externalReference), &tmpId) >= 0)
channel->pChannelParams.data.h225Params.externalReferenceLength = pvtGetString(hVal, tmpId, 256, channel->pChannelParams.data.h225Params.externalReference);
}
}
/* H.225 section. */
h225ID=pvtGetChild2(hVal,forwardLCP_ID, __h245(multiplexParameters), __h245(h2250LogicalChannelParameters));
if (h225ID>=0)
{
/* handle session id.*/
pvtGetChildValue(hVal,h225ID,__h245(sessionID),&channel->sessionId,NULL);
if (channel->sessionId==0)
{
if (!channel->bIsDuplex)
{
if (ctrl->conflictChannels)
/* conflict */
return rejectChannel(channel,__h245(masterSlaveConflict),cmChannelStateModeDisconnectedMasterSlaveConflict);
}
/* new session */
if (ctrl->bIsMaster || channel->bIsDuplex)
{ /* master*/
RvPstFieldId fieldId;
int nodeId = pvtGet(hVal,pvtChild(hVal,channel->dataTypeID),&fieldId,NULL,NULL,NULL);
if (fieldId==__h245(h235Media))
pvtGet(hVal,pvtChild(hVal,pvtGetChild(hVal,nodeId,__h245(mediaType),NULL)),&fieldId,NULL,NULL,NULL);
if (ctrl->bFirstAudioIn && fieldId==__h245(audioData)) { ctrl->bFirstAudioIn=0; channel->sessionId=1;}
else if (ctrl->bFirstVideoIn && fieldId==__h245(videoData)){ ctrl->bFirstVideoIn=0; channel->sessionId=2;}
else if (ctrl->bFirstDataIn && fieldId==__h245(data)) { ctrl->bFirstDataIn=0; channel->sessionId=3;}
else
{
if ((channel->sessionId = getFreeSID((HCONTROL)ctrl))<0)
return rejectChannel(channel,__h245(invalidSessionID),cmChannelStateModeDisconnectedLocal);
}
}
else
/* slave */
return rejectChannel(channel,__h245(invalidSessionID),cmChannelStateModeDisconnectedLocal);
}
else
{ /* existing session association */
/* check db consistancy */
if (checkChanSIDConsistency((HCONTROL)ctrl,channel))
/* in chan exists */
return rejectChannel(channel,__h245(invalidSessionID),cmChannelStateModeDisconnectedLocal);
/* update db.first */
if (channel->sessionId==1) ctrl->bFirstAudioIn=0;
if (channel->sessionId==2) ctrl->bFirstVideoIn=0;
if (channel->sessionId==3) ctrl->bFirstDataIn=0;
/* link partner rtcp address */
channel->pPartner = getOutChanBySID((HCONTROL)ctrl, channel->sessionId);
}
/* link associated session */
{
RvInt32 sid;
if (pvtGetChildValue(hVal,h225ID,__h245(associatedSessionID),&sid,NULL)>=0)
channel->pAssociated = getInChanBySID((HCONTROL)ctrl, sid);
}
} /* handleSessionId() */
{
int tmpId;
tmpId=pvtGetChild(hVal,h225ID,__h245(transportCapability),NULL);
if (tmpId>=0)
{
if (channel->pChannelParams.data.h225Params.transCapID<0)
channel->pChannelParams.data.h225Params.transCapID=pvtAddRoot(hVal,NULL,0,NULL);
pvtMoveTree(hVal,channel->pChannelParams.data.h225Params.transCapID,tmpId);
}
tmpId=pvtGetChild(hVal,h225ID,__h245(redundancyEncoding),NULL);
if (tmpId>=0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -