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

📄 caputils.c

📁 基于h323协议的软phone
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
***********************************************************************************

NOTICE:
This document contains information that is proprietary to RADVISION LTD..
No part of this publication may be reproduced in any form whatsoever without
written prior approval by RADVISION LTD..

RADVISION LTD. reserves the right to revise this publication and make changes
without obligation to notify any person of such revisions or changes.

***********************************************************************************
*/

#include "rvinternal.h"
#include "pvaltree.h"
#include "psyntreeStackApi.h"
#include "caputils.h"
#include "cmConf.h"
#include "h245.h"

#ifdef __cplusplus
extern "C" {
#endif


/*
static char *capDirectionA[] = {
  (char*)"", (char*)"Receive", (char*)"Transmit", (char*)"Receive and Transmit"
};

static char *capDataTypeA[] = {
  (char*)"Empty", (char*)"Audio", (char*)"Video", (char*)"Data", (char*)"Non standard",(char*)"User Input",
  (char*)"Conference",(char*)"H235 Security Capability",(char*)"Max Pending Replacement For",(char*)"Generic"};
*/


typedef enum {
  capabilityNonStandard=1,
  capabilityReceiveVideoCapability,
  capabilityTransmitVideoCapability,
  capabilityReceiveAndTransmitVideoCapability,
  capabilityReceiveAudioCapability,
  capabilityTransmitAudioCapability,
  capabilityReceiveAndTransmitAudioCapability,
  capabilityReceiveDataApplicationCapability,
  capabilityTransmitDataApplicationCapability,
  capabilityReceiveAndTransmitDataApplicationCapability,
  capabilityH233EncryptionTransmitCapability,
  capabilityH233EncryptionReceiveCapability,
  capabilityConferenceCapability,
  capabilityH235SecurityCapability,
  capabilityMaxPendingReplacementFor,
  capabilityReceiveUserInputCapability,
  capabilityTransmitUserInputCapability,
  capabilityReceiveAndTransmitUserInputCapability,
  capabilityGenericControlCapability,
  capabilityReceiveMultiplexedStreamCapability,
  capabilityTransmitMultiplexedStreamCapability,
  capabilityReceiveAndTransmitMultiplexedStreamCapability,
  capabilityReceiveRTPAudioTelephonyEventCapability,
  capabilityReceiveRTPAudioToneCapability
} capabilityType;



/*_________________________________________________________________________________*/
int
capStructBuild(
           IN  HPVT hVal,
           IN  int capEntryId, /* the entry Id of the requested capability  */
           cmCapStruct *capability
           )
{
  HPST synCap = pvtGetSynTree(hVal, capEntryId);
  int capEntryNumberId, capId, capItemId;
  int choice;
  RvPstFieldId fieldId;

  capEntryNumberId = pvtGetByIndex(hVal, capEntryId, 1, NULL); /* entry number of the requested CapabilityTableEntry */
  pvtGet(hVal, capEntryNumberId, NULL, NULL, &(capability->capabilityId), NULL); /* get requested CapabilityTableEntry from capabilityTable */
  capId = pvtGetByIndex(hVal, capEntryId, 2, NULL); /* get capability from CapabilityTableEntry*/

  capability->direction = cmCapReceiveAndTransmit; /* set default */

  if (capId<0)
  {
    /* no capability entry - return an empty struct */
    capability->name = (char*)"empty";
    capability->type = cmCapEmpty;
    capability->capabilityHandle = RV_ERROR_UNKNOWN;
    return RV_TRUE;
  }

  capability->name = (char*)"Error"; /* set default in case we didn't implement a case */
  capability->type = cmCapNonStandard; /* set default */

  capItemId = pvtChild(hVal, capId); /* get the capability CHOICE */
  capability->capabilityHandle = pvtChild(hVal, capItemId); /* get the capability itself */
  choice = pvtGetSyntaxIndex(hVal, capItemId); /* get the index of the CHICE for the switch */

  switch(choice) {
  case capabilityNonStandard:
    pvtGet(hVal, capItemId, &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId); /* set name */
    capability->direction = cmCapReceiveAndTransmit; /* set direction */
    capability->type = cmCapNonStandard; /* set type */
    capability->capabilityHandle = capItemId; /* go one up - why? */
    break;

  case capabilityReceiveVideoCapability:
    pvtGet(hVal, pvtChild(hVal, capItemId), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapReceive;
    capability->type = cmCapVideo;
    break;
  case capabilityTransmitVideoCapability:
    pvtGet(hVal, pvtChild(hVal, capItemId), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapTransmit;
    capability->type = cmCapVideo;
    break;
  case capabilityReceiveAndTransmitVideoCapability:
    pvtGet(hVal, pvtChild(hVal, capItemId), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapReceiveAndTransmit;
    capability->type = cmCapVideo;
    break;

  case capabilityReceiveAudioCapability:
    pvtGet(hVal, pvtChild(hVal, capItemId), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapReceive;
    capability->type = cmCapAudio;
    break;
  case capabilityTransmitAudioCapability:
    pvtGet(hVal, pvtChild(hVal, capItemId), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapTransmit;
    capability->type = cmCapAudio;
    break;
  case capabilityReceiveAndTransmitAudioCapability:
    pvtGet(hVal, pvtChild(hVal, capItemId), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapReceiveAndTransmit;
    capability->type = cmCapAudio;
    break;

  case capabilityReceiveDataApplicationCapability:
    pvtGet(hVal, pvtChild(hVal, pvtChild(hVal, capItemId)), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapReceive;
    capability->type = cmCapData;
    capability->capabilityHandle = pvtChild(hVal, capability->capabilityHandle); /* get the application CHOICE */
    break;
  case capabilityTransmitDataApplicationCapability:
    pvtGet(hVal, pvtChild(hVal, pvtChild(hVal, capItemId)), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapTransmit;
    capability->type = cmCapData;
    capability->capabilityHandle = pvtChild(hVal, capability->capabilityHandle); /* get the application CHOICE */
    break;
  case capabilityReceiveAndTransmitDataApplicationCapability:
    pvtGet(hVal, pvtChild(hVal, pvtChild(hVal, capItemId)), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapReceiveAndTransmit;
    capability->type = cmCapData;
    capability->capabilityHandle = pvtChild(hVal, capability->capabilityHandle); /* get the application CHOICE */
    break;
  case capabilityH233EncryptionTransmitCapability:
    break;
  case capabilityH233EncryptionReceiveCapability:
    break;
  case capabilityConferenceCapability:
    capability->name = (char*)"Conference";
    capability->type = cmCapConference;
    capability->capabilityHandle=capId; /* output the whole capability - why? */
    break;
  case capabilityH235SecurityCapability:
    capability->name = (char*)"H235";
    capability->type = cmCapH235;
    capability->capabilityHandle=capId; /* output the whole capability - why? */
    break;
  case capabilityMaxPendingReplacementFor:
    capability->name = (char*)"MaxPendingReplacementFor";
    capability->type = cmCapMaxPendingReplacementFor;
    capability->capabilityHandle=capId; /* output the whole capability - why? */
    break;
  case capabilityReceiveUserInputCapability:
    pvtGet(hVal, pvtChild(hVal, capItemId), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapReceive;
    capability->type = cmCapUserInput;
    break;
  case capabilityTransmitUserInputCapability:
    pvtGet(hVal, pvtChild(hVal, capItemId), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapTransmit;
    capability->type = cmCapUserInput;
    break;
  case capabilityReceiveAndTransmitUserInputCapability:
    pvtGet(hVal, pvtChild(hVal, capItemId), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapReceiveAndTransmit;
    capability->type = cmCapUserInput;
    break;
  case capabilityGenericControlCapability:
    pvtGet(hVal, pvtChild(hVal, capItemId), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapReceiveAndTransmit;
    capability->type = cmCapGeneric;
    break;

  case capabilityReceiveMultiplexedStreamCapability:
    pvtGet(hVal, pvtChild(hVal, capItemId), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapReceive;
    capability->type = cmCapMultiplexedStream;
    break;
  case capabilityTransmitMultiplexedStreamCapability:
    pvtGet(hVal, pvtChild(hVal, capItemId), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapTransmit;
    capability->type = cmCapMultiplexedStream;
    break;
  case capabilityReceiveAndTransmitMultiplexedStreamCapability:
    pvtGet(hVal, pvtChild(hVal, capItemId), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapReceiveAndTransmit;
    capability->type = cmCapMultiplexedStream;
    break;
  case capabilityReceiveRTPAudioTelephonyEventCapability:
    pvtGet(hVal, pvtChild(hVal, capItemId), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapReceive;
    capability->type = cmCapAudioTelephonyEvent;
    break;
  case capabilityReceiveRTPAudioToneCapability:
    pvtGet(hVal, pvtChild(hVal, capItemId), &fieldId, NULL, NULL, NULL);
    capability->name = pstGetFieldNamePtr(synCap, fieldId);
    capability->direction = cmCapReceive;
    capability->type = cmCapAudioTone;
    break;

  default:
    break;
  }

  return RV_TRUE;
}


int
capSetBuild(
        /* build array of capability set */
        IN  HPVT hVal,
        IN  int termCapSetId, /* terminalCapabilitySet node id */
        IN  int capabilitiesSize, /* number of elements in capabilities array */
        OUT cmCapStruct** capabilities /* cap names array */
        )
{
  int capTableId, capEntryId;
  int i;

  capTableId = pvtGetChild(hVal, termCapSetId, __h245(capabilityTable),NULL);

  if (capTableId <0)
  {
        capabilities[0]=NULL;
        return RV_ERROR_UNKNOWN;
  }
  for (i=1; i<=RvMin(capabilitiesSize+1, pvtNumChilds(hVal, capTableId)); i++) { /* loop all caps */
    capEntryId = pvtGetByIndex(hVal, capTableId, i, NULL); /* entry */
    capStructBuild(hVal, capEntryId, capabilities[i-1]);
  }
  capabilities[i-1]=NULL;

  return RV_TRUE;
}



cmCapStruct *

⌨️ 快捷键说明

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