ptterminalconnection.cpp
来自「基于sipfoundy 公司开发的sipx协议API」· C++ 代码 · 共 1,027 行 · 第 1/3 页
CPP
1,027 行
//// Copyright (C) 2004, 2005 Pingtel Corp.// //// $$//////////////////////////////////////////////////////////////////////////////// SYSTEM INCLUDES#include <assert.h>#ifdef __pingtel_on_posix__#include <stdlib.h>#endif// APPLICATION INCLUDES#include "ptapi/PtTerminalConnection.h"#include "ptapi/PtTerminal.h"#include "ptapi/PtConnection.h"#include "ptapi/PtTerminal.h"#include "cp/CpGatewayManager.h"#include "cp/Connection.h"#include "tao/TaoClientTask.h"#include "tao/TaoServerTask.h"#include "tao/TaoEvent.h"#include "tao/TaoString.h"//#define EVENT_TRACE(x) osPrintf(x)// EXTERNAL FUNCTIONS// EXTERNAL VARIABLES// CONSTANTS// STATIC VARIABLE INITIALIZATIONSOsBSem PtTerminalConnection::semInit(OsBSem::Q_PRIORITY, OsBSem::FULL) ;TaoReference *PtTerminalConnection::mpTransactionCnt = 0;int PtTerminalConnection::mRef = 0;/* //////////////////////////// PUBLIC //////////////////////////////////// *//* ============================ CREATORS ================================== */// ConstructorPtTerminalConnection::PtTerminalConnection() : mIsLocal(-1), mpClient(NULL){ initialize();}// Copy constructorPtTerminalConnection::PtTerminalConnection(const PtTerminalConnection& rPtTerminalConnection){ mAddress = rPtTerminalConnection.mAddress; mTerminalName = rPtTerminalConnection.mTerminalName; mCallId = rPtTerminalConnection.mCallId; mpClient = rPtTerminalConnection.mpClient; if (mpClient && !(mpClient->isStarted())) { mpClient->start(); } mIsLocal = rPtTerminalConnection.mIsLocal; initialize();}PtTerminalConnection::PtTerminalConnection(TaoClientTask *pClient, const char* address, const char* termName, const char* callId, int nIsLocal){ mpClient = pClient; mIsLocal = nIsLocal; if (address) mAddress = address; if (termName) mTerminalName = termName; if (callId) mCallId = callId; initialize(); if (mpClient && !(mpClient->isStarted())) { mpClient->start(); } UtlBoolean local; if ((mIsLocal == (-1)) && (PT_SUCCESS == isLocal(local))) mIsLocal = local;}void PtTerminalConnection::initialize(){ mpEventMgr = OsProtectEventMgr::getEventMgr(); mTimeOut = OsTime(PT_CONST_EVENT_WAIT_TIMEOUT, 0); semInit.acquire() ; mRef++; if (!mpTransactionCnt) mpTransactionCnt = new TaoReference(); semInit.release() ;}// DestructorPtTerminalConnection::~PtTerminalConnection(){ semInit.acquire() ; mRef--; if (mRef < 1) { if (mpTransactionCnt) { delete mpTransactionCnt; mpTransactionCnt = 0; } } semInit.release() ;}/* ============================ MANIPULATORS ============================== */// Assignment operatorPtTerminalConnection&PtTerminalConnection::operator=(const PtTerminalConnection& rhs){ if (this == &rhs) // handle the assignment to self case return *this; mAddress = rhs.mAddress; mTerminalName = rhs.mTerminalName; mCallId = rhs.mCallId; mpClient = rhs.mpClient; if (mpClient && !(mpClient->isStarted())) { mpClient->start(); } mTimeOut = rhs.mTimeOut; mIsLocal = rhs.mIsLocal; return *this;}// Answer an incoming telephone call on this PtTerminalConnectionPtStatus PtTerminalConnection::answer(){ EVENT_TRACE("Entering PtTerminalConnection::answer\n") ; mpTransactionCnt->add(); unsigned int transactionId = mpTransactionCnt->add(); UtlString arg = mTerminalName + TAOMESSAGE_DELIMITER + mCallId; OsProtectedEvent *pe = mpEventMgr->alloc(); TaoMessage msg(TaoMessage::REQUEST_TERMCONNECTION, TaoMessage::ANSWER, transactionId, 0, (TaoObjHandle)pe, 2, arg); mpClient->sendRequest(msg); int rc; UtlString callId; if (OS_SUCCESS != pe->wait(msg.getCmd(), mTimeOut)) { mpClient->resetConnectionSocket(msg.getMsgID()); // If the event has already been signalled, clean up if(OS_ALREADY_SIGNALED == pe->signal(0)) { mpEventMgr->release(pe); } return PT_BUSY; } pe->getEventData((int &)rc); pe->getStringData(callId);#ifdef PTAPI_TEST int cmd; pe->getIntData2(cmd); assert(cmd == TaoMessage::ANSWER);#endif mpEventMgr->release(pe); EVENT_TRACE("Exiting PtTerminalConnection::answer\n") ; return PT_SUCCESS;}PtStatus PtTerminalConnection::getConnection(PtConnection& rConnection){ EVENT_TRACE("Entering PtTerminalConnection::getConnection\n") ; UtlString arg = mCallId + TAOMESSAGE_DELIMITER + mAddress; mpTransactionCnt->add(); unsigned int transactionId = mpTransactionCnt->getRef(); OsProtectedEvent *pe = mpEventMgr->alloc(); TaoMessage msg(TaoMessage::REQUEST_TERMCONNECTION, TaoMessage::GET_CONNECTION, transactionId, 0, (TaoObjHandle)pe, 2, arg); mpClient->sendRequest(msg); arg.remove(0); if (OS_SUCCESS != pe->wait(msg.getCmd(), mTimeOut)) { mpClient->resetConnectionSocket(msg.getMsgID()); // If the event has already been signalled, clean up if(OS_ALREADY_SIGNALED == pe->signal(0)) { mpEventMgr->release(pe); } return PT_BUSY; } pe->getStringData((UtlString &)arg);#ifdef PTAPI_TEST int cmd; pe->getIntData2(cmd); assert(cmd == TaoMessage::GET_CONNECTION);#endif mpEventMgr->release(pe); PtStatus rc = PT_SUCCESS; if (!arg.isNull()) { rConnection = PtConnection(mpClient, mAddress, mCallId); } else { rc = PT_NO_MORE_DATA; } EVENT_TRACE("Exiting PtTerminalConnection::getConnection\n") ; return rc;}PtStatus PtTerminalConnection::hold(){ EVENT_TRACE("Entering PtTerminalConnection::hold\n") ; mpTransactionCnt->add(); unsigned int transactionId = mpTransactionCnt->getRef(); UtlString arg = mTerminalName; arg += TAOMESSAGE_DELIMITER + mAddress + TAOMESSAGE_DELIMITER + mCallId; osPrintf("\nPtTerminalConnection::hold %s %s %s\n", mAddress.data(), mCallId.data(), mTerminalName.data()); OsProtectedEvent *pe = mpEventMgr->alloc(); TaoMessage msg(TaoMessage::REQUEST_TERMCONNECTION, TaoMessage::HOLD, transactionId, 0, (TaoObjHandle)pe, 3, arg); mpClient->sendRequest(msg); int rc; if (OS_SUCCESS != pe->wait(msg.getCmd(), mTimeOut)) { mpClient->resetConnectionSocket(msg.getMsgID()); // If the event has already been signalled, clean up if(OS_ALREADY_SIGNALED == pe->signal(0)) { mpEventMgr->release(pe); } return PT_BUSY; } pe->getEventData((int &)rc);#ifdef PTAPI_TEST int cmd; pe->getIntData2(cmd); assert(cmd == TaoMessage::HOLD);#endif mpEventMgr->release(pe); EVENT_TRACE("Exiting PtTerminalConnection::hold\n") ; return PT_SUCCESS;}PtStatus PtTerminalConnection::unhold(){ EVENT_TRACE("Entering PtTerminalConnection::unhold\n") ; mpTransactionCnt->add(); unsigned int transactionId = mpTransactionCnt->getRef(); UtlString arg = mTerminalName; arg += TAOMESSAGE_DELIMITER + mAddress + TAOMESSAGE_DELIMITER + mCallId; OsProtectedEvent *pe = mpEventMgr->alloc(); TaoMessage msg(TaoMessage::REQUEST_TERMCONNECTION, TaoMessage::UNHOLD, transactionId, 0, (TaoObjHandle)pe, 3, arg); mpClient->sendRequest(msg); int rc; if (OS_SUCCESS != pe->wait(msg.getCmd(), mTimeOut)) { mpClient->resetConnectionSocket(msg.getMsgID()); // If the event has already been signalled, clean up if(OS_ALREADY_SIGNALED == pe->signal(0)) { mpEventMgr->release(pe); } return PT_BUSY; } pe->getEventData((int &)rc);#ifdef PTAPI_TEST int cmd; pe->getIntData2(cmd); assert(cmd == TaoMessage::UNHOLD);#endif mpEventMgr->release(pe); EVENT_TRACE("Exiting PtTerminalConnection::unhold\n") ; return PT_SUCCESS;}PtStatus PtTerminalConnection::getState(int& rState)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?