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

📄 h323neg.cxx

📁 mgcp协议源代码。支持多种编码:g711
💻 CXX
📖 第 1 页 / 共 3 页
字号:
  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 + -