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

📄 h323caps.cxx

📁 mgcp协议源代码。支持多种编码:g711
💻 CXX
📖 第 1 页 / 共 3 页
字号:
  return TRUE;}H323Capabilities::H323Capabilities(){}H323Capabilities::H323Capabilities(const H323Connection & connection,                                   const H245_TerminalCapabilitySet & pdu){  // Decode out of the PDU, the list of known codecs.  if (pdu.HasOptionalField(H245_TerminalCapabilitySet::e_capabilityTable)) {    for (PINDEX i = 0; i < pdu.m_capabilityTable.GetSize(); i++) {      if (pdu.m_capabilityTable[i].HasOptionalField(H245_CapabilityTableEntry::e_capability)) {        H323Capability * capability = connection.GetLocalCapabilities().FindCapability(pdu.m_capabilityTable[i].m_capability);        if (capability != NULL) {          H323Capability * copy = (H323Capability *)capability->Clone();          copy->SetCapabilityNumber(pdu.m_capabilityTable[i].m_capabilityTableEntryNumber);          if (copy->OnReceivedPDU(pdu.m_capabilityTable[i].m_capability))            table.Append(copy);          else            delete copy;        }      }    }  }  PINDEX outerSize = pdu.m_capabilityDescriptors.GetSize();  set.SetSize(outerSize);  for (PINDEX outer = 0; outer < outerSize; outer++) {    H245_CapabilityDescriptor & desc = pdu.m_capabilityDescriptors[outer];    if (desc.HasOptionalField(H245_CapabilityDescriptor::e_simultaneousCapabilities)) {      PINDEX middleSize = desc.m_simultaneousCapabilities.GetSize();      set[outer].SetSize(middleSize);      for (PINDEX middle = 0; middle < middleSize; middle++) {        H245_AlternativeCapabilitySet & alt = desc.m_simultaneousCapabilities[middle];        for (PINDEX inner = 0; inner < alt.GetSize(); inner++) {          for (PINDEX cap = 0; cap < table.GetSize(); cap++) {            if (table[cap].GetCapabilityNumber() == alt[inner]) {              set[outer][middle].Append(&table[cap]);              break;            }          }        }      }    }  }}H323Capabilities::H323Capabilities(const H323Capabilities & original){  operator=(original);}H323Capabilities & H323Capabilities::operator=(const H323Capabilities & original){  RemoveAll();  for (PINDEX i = 0; i < original.GetSize(); i++)    Copy(original[i]);  set.SetSize(original.set.GetSize());  for (PINDEX outer = 0; outer < original.set.GetSize(); outer++) {    set[outer].SetSize(original.set[outer].GetSize());    for (PINDEX middle = 0; middle < original.set[outer].GetSize(); middle++) {      for (PINDEX inner = 0; inner < original.set[outer][middle].GetSize(); inner++)        set[outer][middle].Append(FindCapability(original.set[outer][middle][inner].GetCapabilityNumber()));    }  }  return *this;}void H323Capabilities::PrintOn(ostream & strm) const{  int indent = strm.precision()-1;  for (PINDEX i = 0; i < table.GetSize(); i++)    strm << setw(indent) << " " << table[i] << '\n';}PINDEX H323Capabilities::SetCapability(PINDEX descriptorNum,                                       PINDEX simultaneousNum,                                       H323Capability * capability){  // Make sure capability has been added to table.  Add(capability);  BOOL newDescriptor = descriptorNum == P_MAX_INDEX;  if (newDescriptor)    descriptorNum = set.GetSize();  // Make sure the outer array is big enough  set.SetMinSize(descriptorNum+1);  if (simultaneousNum == P_MAX_INDEX)    simultaneousNum = set[descriptorNum].GetSize();  // Make sure the middle array is big enough  set[descriptorNum].SetMinSize(simultaneousNum+1);  // Now we can put the new entry in.  set[descriptorNum][simultaneousNum].Append(capability);  return newDescriptor ? descriptorNum : simultaneousNum;}static unsigned MergeCapabilityNumber(const H323CapabilitiesList & table,                                      unsigned newCapabilityNumber){  // Assign a unique number to the codec, check if the user wants a specific  // value and start with that.  if (newCapabilityNumber == 0)    newCapabilityNumber = 1;  PINDEX i = 0;  while (i < table.GetSize()) {    if (table[i].GetCapabilityNumber() != newCapabilityNumber)      i++;    else {      // If it already in use, increment it      newCapabilityNumber++;      i = 0;    }  }  return newCapabilityNumber;}void H323Capabilities::Add(H323Capability * capability){  // See if already added, confuses things if you add the same instance twice  if (table.GetObjectsIndex(capability) != P_MAX_INDEX)    return;  capability->SetCapabilityNumber(MergeCapabilityNumber(table, 1));  table.Append(capability);  PTRACE(2, "H323\tAdded capability: " << *capability);}H323Capability * H323Capabilities::Copy(const H323Capability & capability){  H323Capability * newCapability = (H323Capability *)capability.Clone();  newCapability->SetCapabilityNumber(MergeCapabilityNumber(table, capability.GetCapabilityNumber()));  table.Append(newCapability);  PTRACE(2, "H323\tAdded capability: " << *newCapability);  return newCapability;}void H323Capabilities::Remove(H323Capability * capability){  if (capability == NULL)    return;  unsigned capabilityNumber = capability->GetCapabilityNumber();  for (PINDEX outer = 0; outer < set.GetSize(); outer++) {    for (PINDEX middle = 0; middle < set[outer].GetSize(); middle++) {      for (PINDEX inner = 0; inner < set[outer][middle].GetSize(); inner++) {        if (set[outer][middle][inner].GetCapabilityNumber() == capabilityNumber) {          set[outer][middle].RemoveAt(inner);          break;        }      }      if (set[outer][middle].GetSize() == 0)        set[outer].RemoveAt(middle);    }    if (set[outer].GetSize() == 0)      set.RemoveAt(outer);  }  table.Remove(capability);}void H323Capabilities::Remove(const PString & codecName){  H323Capability * cap = FindCapability(codecName);  while (cap != NULL) {    Remove(cap);    cap = FindCapability(codecName);  }}void H323Capabilities::Remove(const PStringArray & codecNames){  for (PINDEX i = 0; i < codecNames.GetSize(); i++)    Remove(codecNames[i]);}void H323Capabilities::RemoveAll(){  table.RemoveAll();  set.RemoveAll();}H323Capability * H323Capabilities::FindCapability(unsigned capabilityNumber) const{  PTRACE(3, "H323\tFindCapability: " << capabilityNumber);  for (PINDEX i = 0; i < table.GetSize(); i++) {    if (table[i].GetCapabilityNumber() == capabilityNumber) {      PTRACE(2, "H323\tFound capability: " << table[i]);      return &table[i];    }  }  return NULL;}H323Capability * H323Capabilities::FindCapability(const PString & formatName) const{  PTRACE(3, "H323\tFindCapability: \"" << formatName << '"');  for (PINDEX i = 0; i < table.GetSize(); i++) {    PCaselessString str = table[i].GetFormatName();    if (str.Find(formatName) != P_MAX_INDEX) {      PTRACE(2, "H323\tFound capability: " << table[i]);      return &table[i];    }  }  return NULL;}H323Capability * H323Capabilities::FindCapability(const H323Capability & capability) const{  PTRACE(3, "H323\tFindCapability: " << capability);  for (PINDEX i = 0; i < table.GetSize(); i++) {    if (table[i] == capability) {      PTRACE(2, "H323\tFound capability: " << table[i]);      return &table[i];    }  }  return NULL;}H323Capability * H323Capabilities::FindCapability(const H245_Capability & cap) const{  PTRACE(4, "H323\tFindCapability: " << cap.GetTagName());  switch (cap.GetTag()) {    case H245_Capability::e_receiveAudioCapability :    case H245_Capability::e_transmitAudioCapability :    case H245_Capability::e_receiveAndTransmitAudioCapability :    {      const H245_AudioCapability & audio = cap;      return FindCapability(H323Capability::e_Audio, audio.GetTag());    }    case H245_Capability::e_receiveVideoCapability :    case H245_Capability::e_transmitVideoCapability :    case H245_Capability::e_receiveAndTransmitVideoCapability :    {      const H245_VideoCapability & video = cap;      return FindCapability(H323Capability::e_Video, video.GetTag());    }    case H245_Capability::e_receiveDataApplicationCapability :    case H245_Capability::e_transmitDataApplicationCapability :    case H245_Capability::e_receiveAndTransmitDataApplicationCapability :    {      const H245_DataApplicationCapability & data = cap;      return FindCapability(H323Capability::e_Data, data.m_application.GetTag());    }    case H245_Capability::e_receiveUserInputCapability :    case H245_Capability::e_transmitUserInputCapability :    case H245_Capability::e_receiveAndTransmitUserInputCapability :    {      const H245_UserInputCapability & ui = cap;      return FindCapability(H323Capability::e_UserInput, ui.GetTag());    }    default :      break;  }  return NULL;}H323Capability * H323Capabilities::FindCapability(const H245_DataType & dataType) const{  PTRACE(4, "H323\tFindCapability: " << dataType.GetTagName());  switch (dataType.GetTag()) {    case H245_DataType::e_audioData :      {        const H245_AudioCapability & audio = dataType;        return FindCapability(H323Capability::e_Audio, audio.GetTag());      }    case H245_DataType::e_videoData :      {        const H245_VideoCapability & video = dataType;        return FindCapability(H323Capability::e_Video, video.GetTag());      }    case H245_DataType::e_data :      {        const H245_DataApplicationCapability & data = dataType;        return FindCapability(H323Capability::e_Data, data.GetTag());      }    default :      break;  }  return NULL;}H323Capability * H323Capabilities::FindCapability(H323Capability::MainTypes mainType,                                                  unsigned subType) const{  PTRACE(3, "H323\tFindCapability: " << mainType << " subtype=" << subType);  for (PINDEX i = 0; i < table.GetSize(); i++) {    if (table[i].GetMainType() == mainType &&                        (subType == UINT_MAX || table[i].GetSubType() == subType)) {      PTRACE(2, "H323\tFound capability: " << table[i]);      return &table[i];    }  }  return NULL;}void H323Capabilities::BuildPDU(H245_TerminalCapabilitySet & pdu) const{  pdu.IncludeOptionalField(H245_TerminalCapabilitySet::e_capabilityTable);  PINDEX tableSize = table.GetSize();  pdu.m_capabilityTable.SetSize(tableSize);  for (PINDEX i = 0; i < tableSize; i++) {    pdu.m_capabilityTable[i].m_capabilityTableEntryNumber = table[i].GetCapabilityNumber();    pdu.m_capabilityTable[i].IncludeOptionalField(H245_CapabilityTableEntry::e_capability);    table[i].OnSendingPDU(pdu.m_capabilityTable[i].m_capability);  }  // Set the sets of compatible capabilities  pdu.IncludeOptionalField(H245_TerminalCapabilitySet::e_capabilityDescriptors);  PINDEX outerSize = set.GetSize();  pdu.m_capabilityDescriptors.SetSize(outerSize);  for (PINDEX outer = 0; outer < outerSize; outer++) {    H245_CapabilityDescriptor & desc = pdu.m_capabilityDescriptors[outer];    desc.m_capabilityDescriptorNumber = (unsigned)(outer + 1);    desc.IncludeOptionalField(H245_CapabilityDescriptor::e_simultaneousCapabilities);    PINDEX middleSize = set[outer].GetSize();    desc.m_simultaneousCapabilities.SetSize(middleSize);    for (PINDEX middle = 0; middle < middleSize; middle++) {      H245_AlternativeCapabilitySet & alt = desc.m_simultaneousCapabilities[middle];      PINDEX innerSize = set[outer][middle].GetSize();      alt.SetSize(innerSize);      for (PINDEX inner = 0; inner < innerSize; inner++)        alt[inner] = set[outer][middle][inner].GetCapabilityNumber();    }  }  PAssert((tableSize > 0) == (outerSize > 0), PLogicError);}BOOL H323Capabilities::Merge(const H323Capabilities & newCaps){  // Add any new capabilities not already in set.  PINDEX i;  for (i = 0; i < newCaps.GetSize(); i++) {    if (!FindCapability(newCaps[i]))      Copy(newCaps[i]);  }  // This should merge instead of just replacing the set.  set = newCaps.set;  PTRACE(3, "H245\tReceived capability set, is "                 << (table.IsEmpty() ? "rejected" : "accepted"));  return !table.IsEmpty();}void H323Capabilities::Reorder(const PStringArray & preferenceOrder){  if (preferenceOrder.IsEmpty())    return;  table.DisallowDeleteObjects();  PINDEX preference = 0;  for (PINDEX base = 0; base < table.GetSize(); base++) {    PString codecName = preferenceOrder[preference];    for (PINDEX idx = base; idx < table.GetSize(); idx++) {      PCaselessString str = table[idx].GetFormatName();      if (str.Find(codecName) != P_MAX_INDEX) {        if (base != idx) // Move capability to the current position list.          table.InsertAt(base, table.RemoveAt(idx));        preference++;        break;      }    }    if (preference >= preferenceOrder.GetSize())      break;  }  table.AllowDeleteObjects();}BOOL H323Capabilities::IsAllowed(const H323Capability & capability1,                                 const H323Capability & capability2){  // This needs more work, at present only sees if capability1 is in set at all.  PINDEX outerSize = set.GetSize();  for (PINDEX outer = 0; outer < outerSize; outer++) {    PINDEX middleSize = set[outer].GetSize();    for (PINDEX middle = 0; middle < middleSize; middle++) {      PINDEX innerSize = set[outer][middle].GetSize();      for (PINDEX inner = 0; inner < innerSize; inner++)        if (capability1.GetCapabilityNumber() == set[outer][middle][inner].GetCapabilityNumber())          return TRUE;    }  }  return FALSE;}/////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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