📄 h323neg.cxx
字号:
if (pdu.HasOptionalField(H245_TerminalCapabilitySet::e_multiplexCapability)) muxCap = &pdu.m_multiplexCapability; H323ControlPDU reject; if (connection.OnReceivedCapabilitySet(remoteCapabilities, muxCap, reject.BuildTerminalCapabilitySetReject(inSequenceNumber, H245_TerminalCapabilitySetReject_cause::e_unspecified))) { H323ControlPDU ack; ack.BuildTerminalCapabilitySetAck(inSequenceNumber); return connection.WriteControlPDU(ack); } connection.WriteControlPDU(reject); connection.ClearCall(H323Connection::EndedByCapabilityExchange); return TRUE;}BOOL H245NegTerminalCapabilitySet::HandleAck(const H245_TerminalCapabilitySetAck & pdu){ PWaitAndSignal wait(mutex); PTRACE(3, "H245\tReceived TerminalCapabilitySetAck:" " state=" << state << " pduSeq=" << pdu.m_sequenceNumber << " outSeq=" << (unsigned)outSequenceNumber); if (state != e_InProgress) return TRUE; if (pdu.m_sequenceNumber != outSequenceNumber) return TRUE; replyTimer.Stop(); state = e_Sent; PTRACE(2, "H245\tTerminalCapabilitySet Sent."); return TRUE;}BOOL H245NegTerminalCapabilitySet::HandleReject(const H245_TerminalCapabilitySetReject & pdu){ PWaitAndSignal wait(mutex); PTRACE(3, "H245\tReceived TerminalCapabilitySetReject:" " state=" << state << " pduSeq=" << pdu.m_sequenceNumber << " outSeq=" << (unsigned)outSequenceNumber); if (state != e_InProgress) return TRUE; if (pdu.m_sequenceNumber != outSequenceNumber) return TRUE; state = e_Idle; replyTimer.Stop(); return connection.OnControlProtocolError(H323Connection::e_CapabilityExchange, "Rejected");}BOOL H245NegTerminalCapabilitySet::HandleRelease(const H245_TerminalCapabilitySetRelease & /*pdu*/){ PWaitAndSignal wait(mutex); PTRACE(3, "H245\tReceived TerminalCapabilityRelease: state=" << state); receivedCapabilites = FALSE; return connection.OnControlProtocolError(H323Connection::e_CapabilityExchange, "Aborted");}void H245NegTerminalCapabilitySet::HandleTimeout(PTimer &, INT){ PWaitAndSignal wait(mutex); PTRACE(3, "H245\tTimeout on TerminalCapabilitySet: state=" << state); H323ControlPDU reply; reply.Build(H245_IndicationMessage::e_terminalCapabilitySetRelease); connection.WriteControlPDU(reply); connection.OnControlProtocolError(H323Connection::e_CapabilityExchange, "Timeout");}#if PTRACINGconst char * const H245NegTerminalCapabilitySet::StateNames[] = { "Idle", "InProgress", "Sent"};#endif/////////////////////////////////////////////////////////////////////////////H245NegLogicalChannel::H245NegLogicalChannel(H323EndPoint & end, H323Connection & conn, const H323ChannelNumber & chanNum) : H245Negotiator(end, conn), channelNumber(chanNum){ channel = NULL; state = e_Released;}H245NegLogicalChannel::H245NegLogicalChannel(H323EndPoint & end, H323Connection & conn, H323Channel & chan) : H245Negotiator(end, conn), channelNumber(chan.GetNumber()){ channel = &chan; state = e_Established;}H245NegLogicalChannel::~H245NegLogicalChannel(){ replyTimer.Stop(); PThread::Yield(); // Do this to avoid possible race condition with timer mutex.Wait(); delete channel; mutex.Signal();}BOOL H245NegLogicalChannel::Open(const H323Capability & capability, unsigned sessionID){ PWaitAndSignal wait(mutex); if (state != e_Released && state != e_AwaitingRelease) { PTRACE(3, "H245\tOpen of channel currently in negotiations: " << channelNumber); return FALSE; } PTRACE(3, "H245\tOpening channel: " << channelNumber); if (channel != NULL) { channel->CleanUpOnTermination(); delete channel; channel = NULL; } state = e_AwaitingEstablishment; H323ControlPDU pdu; H245_OpenLogicalChannel & open = pdu.BuildOpenLogicalChannel(channelNumber); if (!capability.OnSendingPDU(open.m_forwardLogicalChannelParameters.m_dataType)) { PTRACE(3, "H245\tOpening channel: " << channelNumber << ", capability.OnSendingPDU() failed"); return FALSE; } channel = capability.CreateChannel(connection, H323Channel::IsTransmitter, sessionID, NULL); if (channel == NULL) { PTRACE(3, "H245\tOpening channel: " << channelNumber << ", capability.CreateChannel() failed"); return FALSE; } if (!channel->SetInitialBandwidth()) { PTRACE(3, "H245\tOpening channel: " << channelNumber << ", Insufficient bandwidth"); return FALSE; } channel->SetNumber(channelNumber); if (!channel->OnSendingPDU(open)) { PTRACE(3, "H245\tOpening channel: " << channelNumber << ", channel->OnSendingPDU() failed"); return FALSE; } replyTimer = endpoint.GetLogicalChannelTimeout(); return connection.WriteControlPDU(pdu);}BOOL H245NegLogicalChannel::Close(){ PWaitAndSignal wait(mutex); PTRACE(3, "H245\tClosing channel: " << channelNumber << ", state=" << state); if (state != e_AwaitingEstablishment && state != e_Established) return TRUE; replyTimer = endpoint.GetLogicalChannelTimeout(); H323ControlPDU reply; if (channelNumber.IsFromRemote()) { reply.BuildRequestChannelClose(channelNumber, H245_RequestChannelClose_reason::e_normal); state = e_AwaitingResponse; } else { reply.BuildCloseLogicalChannel(channelNumber); state = e_AwaitingRelease; } return connection.WriteControlPDU(reply);}BOOL H245NegLogicalChannel::HandleOpen(const H245_OpenLogicalChannel & pdu){ PWaitAndSignal wait(mutex); PTRACE(3, "H245\tReceived open channel: " << channelNumber << ", state=" << state); if (channel != NULL) { channel->CleanUpOnTermination(); delete channel; channel = NULL; } state = e_AwaitingEstablishment; H323ControlPDU reply; H245_OpenLogicalChannelAck & ack = reply.BuildOpenLogicalChannelAck(channelNumber); unsigned cause; if (connection.OnOpenLogicalChannel(pdu, ack, cause)) channel = connection.CreateLogicalChannel(pdu, FALSE, cause); if (channel != NULL) { if (channel->GetDirection() == H323Channel::IsBidirectional) { state = e_AwaitingConfirmation; replyTimer = endpoint.GetLogicalChannelTimeout(); // T103 } else { state = e_Established; channel->Start(); } channel->SetNumber(channelNumber); channel->OnSendOpenAck(pdu, ack); } else { reply.BuildOpenLogicalChannelReject(channelNumber, cause); Release(); } return connection.WriteControlPDU(reply);}BOOL H245NegLogicalChannel::HandleOpenAck(const H245_OpenLogicalChannelAck & pdu){ PWaitAndSignal wait(mutex); PTRACE(3, "H245\tReceived open channel ack: " << channelNumber << ", state=" << state); switch (state) { case e_Released : return connection.OnControlProtocolError(H323Connection::e_LogicalChannel, "Ack unknown channel"); case e_AwaitingEstablishment : state = e_Established; replyTimer.Stop(); if (!channel->OnReceivedAckPDU(pdu)) return Close(); if (channel->GetDirection() == H323Channel::IsBidirectional) { H323ControlPDU reply; reply.BuildOpenLogicalChannelConfirm(channelNumber); if (!connection.WriteControlPDU(reply)) return FALSE; } channel->Start(); default : break; } return TRUE;}BOOL H245NegLogicalChannel::HandleOpenConfirm(const H245_OpenLogicalChannelConfirm & /*pdu*/){ PWaitAndSignal wait(mutex); PTRACE(3, "H245\tReceived open channel confirm: " << channelNumber << ", state=" << state); switch (state) { case e_Released : return connection.OnControlProtocolError(H323Connection::e_LogicalChannel, "Confirm unknown channel"); case e_AwaitingEstablishment : return connection.OnControlProtocolError(H323Connection::e_LogicalChannel, "Confirm established channel"); case e_AwaitingConfirmation : replyTimer.Stop(); state = e_Established; channel->Start(); default : break; } return TRUE;}BOOL H245NegLogicalChannel::HandleReject(const H245_OpenLogicalChannelReject & /*pdu*/){ PWaitAndSignal wait(mutex); PTRACE(3, "H245\tReceived open channel reject: " << channelNumber << ", state=" << state); switch (state) { case e_Released : return connection.OnControlProtocolError(H323Connection::e_LogicalChannel, "Reject unknown channel"); case e_Established : Release(); return connection.OnControlProtocolError(H323Connection::e_LogicalChannel, "Reject established channel"); case e_AwaitingEstablishment : case e_AwaitingRelease : Release(); default : break; } return TRUE;}BOOL H245NegLogicalChannel::HandleClose(const H245_CloseLogicalChannel & /*pdu*/){ PWaitAndSignal wait(mutex); PTRACE(3, "H245\tReceived close channel: " << channelNumber << ", state=" << state); //if (pdu.m_source.GetTag() == H245_CloseLogicalChannel_source::e_user) H323ControlPDU reply; reply.BuildCloseLogicalChannelAck(channelNumber); if (!connection.WriteControlPDU(reply)) return FALSE; Release(); return TRUE;}BOOL H245NegLogicalChannel::HandleCloseAck(const H245_CloseLogicalChannelAck & /*pdu*/){ PWaitAndSignal wait(mutex); PTRACE(3, "H245\tReceived close channel ack: " << channelNumber << ", state=" << state); switch (state) { case e_Established : Release(); return connection.OnControlProtocolError(H323Connection::e_LogicalChannel, "Close ack open channel"); case e_AwaitingRelease : Release(); default : break; } return TRUE;}BOOL H245NegLogicalChannel::HandleRequestClose(const H245_RequestChannelClose & /*pdu*/){ PWaitAndSignal wait(mutex); PTRACE(3, "H245\tReceived request close channel: " << channelNumber << ", state=" << state); if (state != e_Established) return TRUE; // Already closed H323ControlPDU reply; if (connection.OnClosingLogicalChannel(*channel)) { reply.BuildRequestChannelCloseAck(channelNumber); Release(); } else reply.BuildRequestChannelCloseReject(channelNumber); return connection.WriteControlPDU(reply);}BOOL H245NegLogicalChannel::HandleRequestCloseAck(const H245_RequestChannelCloseAck & /*pdu*/){ PWaitAndSignal wait(mutex); PTRACE(3, "H245\tReceived request close ack channel: " << channelNumber << ", state=" << state); if (state == e_AwaitingResponse) Release(); // Other end says close OK, so do so. return TRUE;}BOOL H245NegLogicalChannel::HandleRequestCloseReject(const H245_RequestChannelCloseReject & /*pdu*/){ PWaitAndSignal wait(mutex); PTRACE(3, "H245\tReceived request close reject channel: " << channelNumber << ", state=" << state); // Other end refused close, so go back to still having channel open if (state == e_AwaitingResponse) state = e_Established; return TRUE;}BOOL H245NegLogicalChannel::HandleRequestCloseRelease(const H245_RequestChannelCloseRelease & /*pdu*/){ PWaitAndSignal wait(mutex); PTRACE(3, "H245\tReceived request close release channel: " << channelNumber << ", state=" << state); // Other end refused close, so go back to still having channel open state = e_Established; return TRUE;}void H245NegLogicalChannel::HandleTimeout(PTimer &, INT){ PWaitAndSignal wait(mutex); PTRACE(3, "H245\tTimeout on open channel: " << channelNumber << ", state=" << state); if (state == e_AwaitingEstablishment) { H323ControlPDU reply; reply.BuildCloseLogicalChannel(channelNumber); connection.WriteControlPDU(reply); } else if (state == e_AwaitingResponse) { H323ControlPDU reply; reply.BuildRequestChannelCloseRelease(channelNumber); connection.WriteControlPDU(reply); } Release(); connection.OnControlProtocolError(H323Connection::e_LogicalChannel, "Timeout");}void H245NegLogicalChannel::Release()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -