?? ptconnection.cpp
字號:
//// Copyright (C) 2004, 2005 Pingtel Corp.// //// $$//////////////////////////////////////////////////////////////////////////////// SYSTEM INCLUDES#include <assert.h>#ifdef __pingtel_on_posix__#include <stdlib.h>#endif// APPLICATION INCLUDES#include "ptapi/PtConnection.h"#include "ptapi/PtAddress.h"#include "ptapi/PtCall.h"#include "ptapi/PtTerminal.h"#include "ptapi/PtAddress.h"#include "ptapi/PtTerminalConnection.h"#include "cp/Connection.h"#include "cp/CpGatewayManager.h"#include "os/OsStatus.h"#include "tao/TaoClientTask.h"#include "tao/TaoServerTask.h"#include "tao/TaoEvent.h"#include "tao/TaoString.h"#include "net/SipMessage.h"// EXTERNAL FUNCTIONS// EXTERNAL VARIABLES// CONSTANTS// STATIC VARIABLE INITIALIZATIONSOsBSem PtConnection::semInit(OsBSem::Q_PRIORITY, OsBSem::FULL) ;TaoReference *PtConnection::mpTransactionCnt = 0;unsigned int PtConnection::mRef = 0;/* //////////////////////////// PUBLIC //////////////////////////////////// *//* ============================ CREATORS ================================== */// ConstructorPtConnection::PtConnection(){ initialize(); mpClient = 0; mState = IDLE;}PtConnection::PtConnection(TaoClientTask *pClient, const char* address, const char* callId){ mpClient = pClient; if (address) mAddress = address; if (callId) mCallId = callId; mState = ESTABLISHED; initialize(); if (mpClient && !(mpClient->isStarted())) { mpClient->start(); }}// Copy constructorPtConnection::PtConnection(const PtConnection& rPtConnection){ mAddress = rPtConnection.mAddress; mCallId = rPtConnection.mCallId; mState = rPtConnection.mState; mpClient = rPtConnection.mpClient; initialize();}// DestructorPtConnection::~PtConnection(){ semInit.acquire() ; mRef--; if (mRef < 1) { if(mpTransactionCnt) { delete mpTransactionCnt; mpTransactionCnt = 0; } } semInit.release() ;}void PtConnection::initialize(){ mpEventMgr = OsProtectEventMgr::getEventMgr(); mTimeOut = OsTime(PT_CONST_EVENT_WAIT_TIMEOUT, 0); semInit.acquire() ; mRef++; if (!mpTransactionCnt) mpTransactionCnt = new TaoReference(); semInit.release() ;}/* ============================ MANIPULATORS ============================== */// Assignment operatorPtConnection&PtConnection::operator=(const PtConnection& rhs){ if (this == &rhs) // handle the assignment to self case return *this; mAddress.remove(0); mCallId.remove(0); if (!rhs.mAddress.isNull()) mAddress = rhs.mAddress; if (!rhs.mCallId.isNull()) mCallId = rhs.mCallId; mState = rhs.mState; mpClient = rhs.mpClient; mTimeOut = rhs.mTimeOut; return *this;}PtStatus PtConnection::accept(){ EVENT_TRACE("Entering PtConnection::accept\n") ; UtlString arg = mCallId + TAOMESSAGE_DELIMITER + mAddress; mpTransactionCnt->add(); unsigned int transactionId = mpTransactionCnt->getRef(); OsProtectedEvent *pe = mpEventMgr->alloc(); TaoMessage msg(TaoMessage::REQUEST_CONNECTION, TaoMessage::ACCEPT, transactionId, 0, (TaoObjHandle)pe, 2, 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::ACCEPT);#endif mpEventMgr->release(pe); EVENT_TRACE("Exiting PtConnection::accept\n") ; return PT_SUCCESS;}PtStatus PtConnection::disconnect(){ EVENT_TRACE("Entering PtConnection::disconnect\n") ; mpTransactionCnt->add(); unsigned int transactionId = mpTransactionCnt->getRef(); UtlString arg(mCallId); arg += TAOMESSAGE_DELIMITER + mAddress; OsProtectedEvent *pe = mpEventMgr->alloc(); TaoMessage msg(TaoMessage::REQUEST_CONNECTION, TaoMessage::DISCONNECT, transactionId, 0, (TaoObjHandle)pe, 2, 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::DISCONNECT);#endif mpEventMgr->release(pe); mState = DISCONNECTED; EVENT_TRACE("Exiting PtConnection::disconnect\n") ; return PT_SUCCESS;}PtStatus PtConnection::getTerminalConnections(PtTerminalConnection termConnections[], int size, int& nItems){ EVENT_TRACE("Entering PtConnection::getTerminalConnections\n") ; PtStatus statusRC = PT_NO_MORE_DATA ; UtlString arg = mCallId + TAOMESSAGE_DELIMITER + mAddress; mpTransactionCnt->add(); unsigned int transactionId = mpTransactionCnt->getRef(); OsProtectedEvent *pe = mpEventMgr->alloc(); TaoMessage msg(TaoMessage::REQUEST_CONNECTION, TaoMessage::GET_TERM_CONNECTIONS, transactionId, 0, (TaoObjHandle)pe, 2, arg); mpClient->sendRequest(msg); arg.remove(0); if (OS_SUCCESS != pe->wait(msg.getCmd(), mTimeOut)) { mpClient->resetConnectionSocket(msg.getMsgID()); EVENT_TRACE("Exiting PtConnection::getTerminalConnections: TIME OUT!!\n") ; // 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_TERM_CONNECTIONS);#endif mpEventMgr->release(pe); TaoString argList(arg, TAOMESSAGE_DELIMITER); nItems = (argList.getCnt() - 2) / 2 ; int cnt = (nItems > size) ? size : nItems ; nItems = 0; for (int i = 0; i < cnt; i++) { int j = 2 * i; int isLocal = atoi(argList[j + 3]); PtTerminalConnection tc = PtTerminalConnection(mpClient, mAddress.data(), argList[i+2], mCallId.data(), isLocal);#ifdef TEST osPrintf("~~~ PtConnection::getTerminalConnections connection %s terminal %s is local: %d ~~~\n", mAddress.data(), argList[j+2].data(), isLocal);#endif termConnections[nItems++] = tc; statusRC = PT_SUCCESS ; }#ifdef TEST osPrintf("~~~ number of tc %d ~~~\n", nItems);#endif EVENT_TRACE("Exiting PtConnection::getTerminalConnections\n") ; return statusRC ;}PtStatus PtConnection::getAddress(PtAddress& rAddress){ EVENT_TRACE("Entering PtConnection::getAddress\n") ; PtStatus rc = PT_SUCCESS; if (mpClient && !mAddress.isNull()) { rAddress = PtAddress(mpClient, mAddress.data()); } else { rc = PT_NO_MORE_DATA; } EVENT_TRACE("Exiting PtConnection::getAddress\n") ; return rc;}PtStatus PtConnection::getCall(PtCall& rCall){ EVENT_TRACE("Entering PtConnection::getCall\n") ; PtStatus rc = PT_SUCCESS; if (mpClient && !mCallId.isNull()) { rCall = PtCall(mpClient, mCallId.data()); } else { rc = PT_NO_MORE_DATA; } EVENT_TRACE("Exiting PtConnection::getCall\n"); return rc;}PtStatus PtConnection::getSessionInfo(PtSessionDesc& rSession){ EVENT_TRACE("Entering PtCall::getSessionInfo:\n") ; PtStatus ret = PT_FAILED; UtlString arg = mCallId + TAOMESSAGE_DELIMITER + mAddress; mpTransactionCnt->add(); unsigned int transactionId = mpTransactionCnt->getRef(); OsProtectedEvent *pe = mpEventMgr->alloc(); TaoMessage msg(TaoMessage::REQUEST_CONNECTION, TaoMessage::GET_SESSION_INFO, 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_FROM_FIELD);#endif mpEventMgr->release(pe); TaoString argList(arg, TAOMESSAGE_DELIMITER); if (argList.getCnt() == 7) { rSession = PtSessionDesc(mCallId, argList[0], //toUrl argList[1], //fromUrl argList[2], // localContact atoi(argList[3]), // next CSeq atoi(argList[4]), // lastFromCseq atoi(argList[5]), // lastToCseq atoi(argList[6])); // sessionState ret = PT_SUCCESS; } EVENT_TRACE("Exiting PtCall::getSessionInfo\n") ; return ret;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -