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 + -
显示快捷键?