📄 main.cxx
字号:
// Start the listener thread for incoming calls. H323ListenerTCP * listener; if (args.GetOptionString('i').IsEmpty()) listener = new H323ListenerTCP(*this); else { PIPSocket::Address interfaceAddress(args.GetOptionString('i')); listener = new H323ListenerTCP(*this, interfaceAddress); } if (!StartListener(listener)) { cerr << "Could not open H.323 listener port on " << listener->GetListenerPort() << endl; return FALSE; } // Establish link with gatekeeper if required. if (args.HasOption('g')) { PString gkName = args.GetOptionString('g'); H323TransportUDP * rasChannel; if (args.GetOptionString('i').IsEmpty()) rasChannel = new H323TransportUDP(*this); else { PIPSocket::Address interfaceAddress(args.GetOptionString('i')); rasChannel = new H323TransportUDP(*this, interfaceAddress); } if (SetGatekeeper(gkName, rasChannel)) cout << "Gatekeeper set: " << *gatekeeper << endl; else { cerr << "Error registering with gatekeeper at \"" << gkName << '"' << endl; return FALSE; } } else if (!args.HasOption('n') || args.HasOption('r')) { cout << "Searching for gatekeeper..." << flush; if (DiscoverGatekeeper(new H323TransportUDP(*this))) cout << "\nGatekeeper found: " << *gatekeeper << endl; else { cerr << "\nNo gatekeeper found." << endl; if (args.HasOption("require-gatekeeper")) return FALSE; } } return TRUE;}BOOL SimpleH323EndPoint::SetSoundDevice(PArgList & args, const char * optionName, PSoundChannel::Directions dir){ if (!args.HasOption(optionName)) return TRUE; PString dev = args.GetOptionString(optionName); if (dir == PSoundChannel::Player) { if (SetSoundChannelPlayDevice(dev)) return TRUE; } else { if (SetSoundChannelRecordDevice(dev)) return TRUE; } cerr << "Device for " << optionName << " (\"" << dev << "\") must be one of:\n"; PStringArray names = PSoundChannel::GetDeviceNames(dir); for (PINDEX i = 0; i < names.GetSize(); i++) cerr << " \"" << names[i] << "\"\n"; return FALSE;}H323Connection * SimpleH323EndPoint::CreateConnection(unsigned callReference){ return new SimpleH323Connection(*this, callReference, noFastStart, doH245Tunnelling);}BOOL SimpleH323EndPoint::OnIncomingCall(H323Connection & connection, const H323SignalPDU &, H323SignalPDU &){ if (currentCallToken.IsEmpty()) return TRUE; if (busyForwardParty.IsEmpty()) { cout << "Incoming call from \"" << connection.GetRemotePartyName() << "\" rejected, line busy!" << endl; return FALSE; } cout << "Forwarding call to \"" << busyForwardParty << "\"." << endl; return !connection.ForwardCall(busyForwardParty);}H323Connection::AnswerCallResponse SimpleH323EndPoint::OnAnswerCall(H323Connection & connection, const PString & caller, const H323SignalPDU &, H323SignalPDU &){ currentCallToken = connection.GetCallToken(); if (autoAnswer) { cout << "Automatically accepting call." << endl; return H323Connection::AnswerCallNow; } cout << "Incoming call from \"" << caller << "\", answer call (Y/n)? " << flush; return H323Connection::AnswerCallPending;}BOOL SimpleH323EndPoint::OnConnectionForwarded(H323Connection & /*connection*/, const PString & forwardParty, const H323SignalPDU & /*pdu*/){ if (MakeCall(forwardParty, currentCallToken)) { cout << "Call is being forwarded to host " << forwardParty << endl; return TRUE; } cout << "Error forwarding call to \"" << forwardParty << '"' << endl; return FALSE;}void SimpleH323EndPoint::OnConnectionEstablished(H323Connection & connection, const PString & token){ currentCallToken = token; cout << "In call with " << connection.GetRemotePartyName() << endl;}void SimpleH323EndPoint::OnConnectionCleared(H323Connection & connection, const PString & clearedCallToken){ if (currentCallToken == clearedCallToken) currentCallToken = PString(); PString remoteName = '"' + connection.GetRemotePartyName() + '"'; switch (connection.GetCallEndReason()) { case H323Connection::EndedByRemoteUser : cout << remoteName << " has cleared the call"; break; case H323Connection::EndedByCallerAbort : cout << remoteName << " has stopped calling"; break; case H323Connection::EndedByRefusal : cout << remoteName << " did not accept your call"; break; case H323Connection::EndedByNoAnswer : cout << remoteName << " did not answer your call"; break; case H323Connection::EndedByTransportFail : cout << "Call with " << remoteName << " ended abnormally"; break; case H323Connection::EndedByCapabilityExchange : cout << "Could not find common codec with " << remoteName; break; case H323Connection::EndedByNoAccept : cout << "Did not accept incoming call from " << remoteName; break; case H323Connection::EndedByAnswerDenied : cout << "Refused incoming call from " << remoteName; break; case H323Connection::EndedByNoUser : cout << "Gatekeeper could find user " << remoteName; break; case H323Connection::EndedByNoBandwidth : cout << "Call to " << remoteName << " aborted, insufficient bandwidth."; break; case H323Connection::EndedByConnectFail : switch (connection.GetSignallingChannel()->GetErrorNumber()) { case ENETUNREACH : cout << remoteName << " could not be reached."; break; case ETIMEDOUT : cout << remoteName << " is not online."; break; case ECONNREFUSED : cout << "No phone running for " << remoteName; break; default : cout << "Transport error calling " << remoteName; } break; default : cout << "Call with " << remoteName << " completed"; } cout << ", duration " << setprecision(0) << setw(5) << (PTime() - connection.GetConnectionStartTime()) << endl;}BOOL SimpleH323EndPoint::OpenAudioChannel(H323Connection & connection, BOOL isEncoding, unsigned bufferSize, H323AudioCodec & codec){ codec.SetSilenceDetectionMode(silenceOn ? H323AudioCodec::AdaptiveSilenceDetection : H323AudioCodec::NoSilenceDetection); if (H323EndPoint::OpenAudioChannel(connection, isEncoding, bufferSize, codec)) return TRUE; cerr << "Could not open sound device "; if (isEncoding) cerr << GetSoundChannelRecordDevice(); else cerr << GetSoundChannelPlayDevice(); cerr << " - Check permissions or full duplex capability." << endl; return FALSE;}///////////////////////////////////////////////////////////////SimpleH323Connection::SimpleH323Connection(SimpleH323EndPoint & ep, unsigned callReference, BOOL dontFastStart, BOOL doH245Tunnelling) : H323Connection(ep, callReference){ noFastStart = dontFastStart; h245Tunneling = doH245Tunnelling;}void SimpleH323Connection::SelectFastStartChannels(unsigned sessionID){ if (noFastStart) return; H323Connection::SelectFastStartChannels(sessionID);}BOOL SimpleH323Connection::OnStartLogicalChannel(H323Channel & channel){ if (!H323Connection::OnStartLogicalChannel(channel)) return FALSE; cout << "Started logical channel: "; switch (channel.GetDirection()) { case H323Channel::IsTransmitter : cout << "sending "; break; case H323Channel::IsReceiver : cout << "receiving "; break; default : break; } cout << channel.GetCapability() << endl; return TRUE;}void SimpleH323Connection::OnUserInputString(const PString & value){ cout << "User input received: \"" << value << '"' << endl;}// End of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -