if (args.HasOption(p)) {
SetGatekeeperPassword(args.GetOptionString(p));
cout << \}
// Establish link with gatekeeper if required. if (args.HasOption(g) || !args.HasOption( )) { H323TransportUDP * rasChannel;
if (args.GetOptionString(i).IsEmpty()) rasChannel = new H323TransportUDP(*this); else {
PIPSocket::Address interfaceAddress(args.GetOptionString(i)); rasChannel = new H323TransportUDP(*this, interfaceAddress); }
if (args.HasOption(g)) {
PString gkName = args.GetOptionString(g); if (SetGatekeeper(gkName, rasChannel))
cout << \else {
cerr << \registering with gatekeeper at \\\<< gkName << \\\<< endl; return FALSE; } }
else {
cout << \if (DiscoverGatekeeper(rasChannel))
cout << \else {
cerr << \if (args.HasOption( )) 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 << \of:\\n \
PStringArray names = PSoundChannel::GetDeviceNames(dir); for (PINDEX i = 0; i < names.GetSize(); i++) cerr << \return FALSE; }
//这个函数很简单但是非常关键, 是从EndPoint中重载过来的. //本来是return new H323Connection()的, 现在改成Simplexxx //自己实现的一个Connection, 这样当Endpoint里面调用 //Connection的一些东西的时候, 实际上运行的是Simplexxx
//的实现, 看到C++的好处了吧, C里用函数指针也可以实现, 没有 //C++这么native.
H323Connection * SimpleH323EndPoint::CreateConnection(unsigned callReference)
{
return new SimpleH323Connection(*this, callReference); }
//没什么东西, 关键是看看这个东西的调用的时机
BOOL SimpleH323EndPoint::OnIncomingCall(H323Connection & connection, const H323SignalPDU &, H323SignalPDU &) {
if (currentCallToken.IsEmpty()) return TRUE;
if (busyForwardParty.IsEmpty()) { cout << \call from \\\<< connection.GetRemotePartyName() << \reje
cted, line busy!\return FALSE; }
cout << \return !connection.ForwardCall(busyForwardParty); }
//这个东西, 很有用, H323Connection的类里也有这个虚函数 //返回的值决定告诉远程的连接者是否接收这份连接请求 H323Connection::AnswerCallResponse
SimpleH323EndPoint::OnAnswerCall(H323Connection & connection, const PString & caller, const H323SignalPDU &, H323SignalPDU &) {
currentCallToken = connection.GetCallToken(); if (autoAnswer) {
cout << \return H323Connection::AnswerCallNow; }
cout << \<< caller
<< \<< flush;
return H323Connection::AnswerCallPending; }
BOOL SimpleH323EndPoint::OnConnectionForwarded(H323Connection & /*connection*/ ,
const PString & forwardParty, const H323SignalPDU & /*pdu*/) {
if (MakeCall(forwardParty, currentCallToken)) {
cout << \return TRUE; }
cout << \return FALSE; }
//连接建立时候
void SimpleH323EndPoint::OnConnectionEstablished(H323Connection & connection,
const PString & token) {
currentCallToken = token;
cout << \}
//连接断开时候
void SimpleH323EndPoint::OnConnectionCleared(H323Connection & connection,
const PString & clearedCallToken) {
if (currentCallToken == clearedCallToken) currentCallToken = PString();
PString remoteName = \\\switch (connection.GetCallEndReason()) { case H323Connection::EndedByRemoteUser :
cout << remoteName << \break;
case H323Connection::EndedByCallerAbort : cout << remoteName << \break;
case H323Connection::EndedByRefusal :
cout << remoteName << \break;
case H323Connection::EndedByNoAnswer :
cout << remoteName << \break;
case H323Connection::EndedByTransportFail :
cout << \break;
case H323Connection::EndedByCapabilityExchange :
cout << \break;
case H323Connection::EndedByNoAccept :
cout << \
break;
case H323Connection::EndedByAnswerDenied :
cout << \break;
case H323Connection::EndedByNoUser :
cout << \break;
case H323Connection::EndedByNoBandwidth :
cout << \to \<< remoteName << \aborted, insufficient bandwidth.\break;
case H323Connection::EndedByUnreachable :
cout << remoteName << \break;
case H323Connection::EndedByHostOffline : cout << remoteName << \break;
case H323Connection::EndedByNoEndPoint :
cout << \break;
case H323Connection::EndedByConnectFail :
cout << \break; default :
cout << \}
cout << \
<< setprecision(0) << setw(5)
<< (PTime() - connection.GetConnectionStartTime()) << endl; }
//打开声音设备时候
//isEncoding 表示编码吗
//编码表示向外发送数据, 从声音设备读 //解码表示从网络读出数据, 写到声音设备上
//不同的方向的codec是不同的, 所以在这里有好多文章可以做 //可以给codec attach上不同的channel根据isEncoding的值
BOOL SimpleH323EndPoint::OpenAudioChannel(H323Connection & connection, BOOL isEncoding, unsigned bufferSize, H323AudioCodec & codec) {
if (H323EndPoint::OpenAudioChannel(connection, isEncoding, bufferSize, codec))