📄 h323caps.cxx
字号:
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 + -