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

📄 h225calltable.c

📁 基于h323协议的软phone
💻 C
字号:

#include "rvinternal.h"
#include "cm.h"
#include "mib.h"
#include "cmmib.h"


#ifdef __cplusplus
extern "C" {
#endif



typedef struct
{
    RvUint8 key[CONNECTION_KEY_SIZE];/*23];*/
    HCALL hsCall;
}connectionElT;


void int2index(int entry,RvUint8 * key)
{
    int temp;
    temp = entry & 0xff;
    key[3] = (RvUint8)temp;

    entry = entry>>8;
    temp = entry & 0xff;
    key[2] = (RvUint8)temp;

    entry = entry>>8;
    temp = entry & 0xff;
    key[1] = (RvUint8)temp;

    entry = entry>>8;
    key[0] = (RvUint8)entry;

}

void    transportAddress2String(cmTransportAddress *tr,RvUint8 * key)
{
    RvUint16 temp;
    memcpy(&key[0],&(tr->ip),4);
    temp = (RvUint16)(tr->port & 0xff);
    key[4] = (RvUint8)temp;
    key[5] =(RvUint8)(tr->port>>8);

}

void transportAddress2Index(cmTransportAddress *tr,RvUint8 * key)
{
    RvUint16 temp;
	int  *TAddressTag=(int *)key;

	*TAddressTag = IPV4;
	

	/* TAddress must be in network byte order */
    memcpy(&key[4],&(tr->ip),4);
    temp = (RvUint16)(tr->port & 0xff);
    key[9] = (RvUint8)temp;
    key[8] =(RvUint8)(tr->port>>8);

}

/* 
   tableGet
   purpose: get MIB data
   input  : data - element about which the data is requested
            name - actually is a number which represents requested parameter
            mibdata - storage for requested parfameter
   output : 0 on success
            checkNext - for parameter that does not contain a data
            notImplemened - for parameter not implemented yet
			noSuchField   - for error request

 */
int tableGet(RAElement 	data,h341ParameterName name,mibDataT *mibdata)
{
    int  res,length,temp;
    cmTransportAddress tr;
    cmAlias alias;

    HCALL hsCall;
    connectionElT *el = (connectionElT *)data;
    hsCall=el->hsCall;
    mibdata->type=asnError;
    switch(name)
    {

/*
    case connectionsSrcTransporTAddressTag:

        mibdata->valueSize=ipv4;
        mibdata->type=asnInt;
        return 0;

    case      connectionsSrcTransporTAddress:
        length = sizeof(tr);

        res =cmCallGetParam(hsCall,cmParamSrcCallSignalAddress,0,&length,(char *)&tr );
        if (res<0)
            return invalidData;
        memcpy(mibdata->value,(RvUint8 *)&tr.ip,4);
        temp = tr.port & 0xff;
        mibdata->value[4] = (RvUint8)temp;
        mibdata->value[5] =(RvUint8)tr.port>>8;
        mibdata->valueSize=6;
        mibdata->type=asnOctetString;
        return 0;

    case               connectionsCallIdentifier:
        mibdata->valueSize=16;
        res =cmCallGetParam(hsCall,cmParamCallID,0,&mibdata->valueSize,(char *)mibdata->value );
        if (res<0)
            return invalidData;

        mibdata->type=asnOctetString;
        return 0;
*/
    case connectionsSrcTransporTAddressTag:
    case      connectionsSrcTransporTAddress:
    case               connectionsCallIdentifier:
        return checkNext;

    case     connectionsRole :
        res = cmCallGetOrigin(hsCall,&temp);
        if(temp)
            mibdata->valueSize=1;
        else
            mibdata->valueSize=2;
        mibdata->type=asnInt;
        return 0;

    case connectionsDestTransporTAddressTag:
        mibdata->valueSize=IPV4;
        mibdata->type=asnInt;
        return 0;
    case connectionsDestTransporTAddress:
        length = sizeof(tr);
        mibdata->type=asnAddressString;
        mibdata->value[0] = 0;
        mibdata->valueSize=0;
        res =cmCallGetParam(hsCall,cmParamDestCallSignalAddress,0,&length,(char *)&tr );
        if (res>=0)
        {
            transportAddress2String(&tr,mibdata->value);
            mibdata->valueSize=6;
        }

        return 0;


    case connectionsConfId:

        mibdata->type=asnMibOctetString;
        mibdata->valueSize=0;
        mibdata->value[0] = 0;
        res =cmCallGetParam(hsCall,cmParamCID,0,&mibdata->valueSize,(char *)mibdata->value );
        if (res>=0)
            mibdata->valueSize=16;
        return 0;
    case connectionsCalledPartyNumber:
        mibdata->type=asnMibOctetString;

        alias.length=(RvUint16)mibdata->valueSize;
        alias.string=(char *)mibdata->value;
        alias.string[0]=0;
        res =cmCallGetParam(hsCall,cmParamCalledPartyNumber,0,&length,(char *)&alias );
        if (res>=0)
            mibdata->valueSize = alias.length;
        else
            mibdata->valueSize = 0;
        return 0;
    case connectionsDestXtraCallingNumber1:
        temp=1;
    case connectionsDestXtraCallingNumber2:
        temp=2;
    case connectionsDestXtraCallingNumber3:
        temp=3;
    case connectionsDestXtraCallingNumber4:
        temp=4;
    case connectionsDestXtraCallingNumber5:
        temp=5;

        {
        int ii=0,jj=1;
        mibdata->type=asnMibOctetString;

        alias.length=(RvUint16)mibdata->valueSize;
        alias.string=(char*)mibdata->value;
        alias.string[0]=0;

            while(cmCallGetParam(hsCall,cmParamDestinationAddress,ii++,0,(char *)&alias)>=0)
            {
                if (alias.type==cmAliasTypeE164)
                {
                    if (jj==temp)
                    {
                        mibdata->valueSize = alias.length;
                        return 0;
                    }
                    jj++;
                }
            }
            mibdata->valueSize=0;

        }
        return 0;
    case connectionsCanOverlapSend:

        if ( cmCallGetParam(hsCall,cmParamSetupCanOverlapSending,0,&temp,NULL) >=0)
        {
            mibdata->type=asnInt;
            if(temp)
                mibdata->valueSize=temp;
            else
                mibdata->valueSize=2;

        }
        return 0;
    case connectionsCRV:
        mibdata->type=asnInt;
        if (cmCallGetParam(hsCall,cmParamCRV,0,(RvInt32*)&mibdata->valueSize,NULL)<0)
            mibdata->valueSize=0;
        return 0;
    case connectionsCallType:
        mibdata->type=asnInt;
        if (cmCallGetParam(hsCall,cmParamCallType,0,(RvInt32*)&mibdata->valueSize,NULL)>=0)
            mibdata->valueSize++;
        else
            mibdata->valueSize=0;;
        return 0;

    case connectionsSrcH245SigTransporTAddress:
        {
            cmTransportAddress trSrc,trDest;
            if (cmCallGetH245Address(hsCall,&trSrc,&trDest,&temp)>=0)
            {

                transportAddress2String(&trSrc,mibdata->value);
                mibdata->valueSize=6;
            }
            else
                mibdata->valueSize=0;
            mibdata->type=asnAddressString;

        }
        return 0;
    case connectionsDestH245SigTransporTAddressTag:
    case connectionsSrcH245SigTransporTAddressTag:
        mibdata->type=asnInt;
        mibdata->valueSize=IPV4;
        return 0;

    case connectionsDestH245SigTransporTAddress:
        {
            cmTransportAddress trSrc,trDest;
            if (cmCallGetH245Address(hsCall,&trSrc,&trDest,&temp)>=0)
            {
                transportAddress2String(&trDest,mibdata->value);
                mibdata->valueSize=6;
            }
            else
                mibdata->valueSize=0;
            mibdata->type=asnAddressString;

        }
        return 0;
    case connectionsState:
        mibdata->type=asnInt;
        if (mibGetCallParameters(hsCall,enumconnectionsState,&mibdata->valueSize,mibdata->value))
            mibdata->valueSize = 0  ;
        return 0;
    case connectionsFastCall:

    case connectionsH245Tunneling:

    case connectionsDestAliasTag:
    case connectionsDestAlias:
    case connectionsRemoteExtensionAddress:
    case connectionsExtraCRV1:
    case connectionsExtraCRV2:
    case connectionsSecurity:
    case connectionsConnectionStartTime:
    case connectionsEndpointType:
    case connectionsReleaseCompleteReason:
        return notImplemented;
    default :
              return noSuchField;
    }
}

RvUint8 * tableGetIndex(RAElement   data)
{
    return ((connectionElT *)data)->key;
}




tableT *  h225tableConstruct(int nElements)
{
    return tableConstruct(nElements,CONNECTION_KEY_SIZE,sizeof(connectionElT),tableGet,NULL,tableGetIndex);

}

h341ErrorT h341InstAddNewCall(h341InstanceHandle hSnmp,HCALL hsCall)
{
    int length ,res,entry;
    cmTransportAddress tr;

    connectionElT el;

    length = sizeof(tr);
    res =cmCallGetParam(hsCall,cmParamSrcCallSignalAddress,0,&length,(char *)&tr );
    if (res<0)
        return (h341ErrorT)invalidCall;
    length =16;
    res =cmCallGetParam(hsCall,cmParamCallID,0,&length,(char *)&el.key[10] );
    if (res<0)
        return (h341ErrorT)invalidCall;
    el.hsCall=hsCall;

    transportAddress2Index(&tr, el.key);

    res = tableAdd( ((h341InstanceHandleT *)hSnmp)->H225ConnectionsTable,(RAElement)&el,&entry);
    if (!res)
    {
        if (((h341InstanceHandleT *)hSnmp)->h341ChangeGlobals!=NULL)
            ((h341InstanceHandleT *)hSnmp)->h341ChangeGlobals(((h341InstanceHandleT *)hSnmp)->agentComHandle,
                    connectionsActiveConnections,1);

    }
    return (h341ErrorT)res;

}


h341ErrorT h341InstDeleteCall(h341InstanceHandle hSnmp, HCALL hsCall)
{
    int length ,res;
    RvUint16 temp;
    cmTransportAddress tr;

    connectionElT el;

    length = sizeof(tr);
    res =cmCallGetParam(hsCall,cmParamSrcCallSignalAddress,0,&length,(char *)&tr );
    if (res<0)
        return (h341ErrorT)invalidCall;
    length =16;
    res =cmCallGetParam(hsCall,cmParamCallID,0,&length,(char *)&el.key[10] );
    if (res<0)
        return (h341ErrorT)invalidCall;
    el.hsCall=hsCall;
    transportAddress2Index(&tr, el.key);

    memcpy(&el.key[4],&(tr.ip),4);
    temp = (RvUint16)(tr.port & 0xff);
    el.key[9] = (RvUint8)temp;
    el.key[8] =(RvUint8)(tr.port>>8);
    res = tableDelete(((h341InstanceHandleT *)hSnmp)->H225ConnectionsTable,el.key,CONNECTION_KEY_SIZE);
    if (!res)
    {
        if (((h341InstanceHandleT *)hSnmp)->h341ChangeGlobals!=NULL)
            ((h341InstanceHandleT *)hSnmp)->h341ChangeGlobals(((h341InstanceHandleT *)hSnmp)->agentComHandle,
                    connectionsActiveConnections,-1);
    }
    return (h341ErrorT)0;
}

#ifdef __cplusplus
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -