使用openh323开发(3)

2019-01-18 22:26

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))


使用openh323开发(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:(2018年秋)人教版小学六年级语文上册第一单元1.山中访友 教案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: