⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmchan.c

📁 基于h323协议的软phone
💻 C
📖 第 1 页 / 共 5 页
字号:
                }
            }
            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 + -