ptcall.cpp
来自「基于sipfoundy 公司开发的sipx协议API」· C++ 代码 · 共 1,686 行 · 第 1/4 页
CPP
1,686 行
//// Copyright (C) 2004, 2005 Pingtel Corp.// //// $$//////////////////////////////////////////////////////////////////////////////// SYSTEM INCLUDES#include <assert.h>#ifdef __pingtel_on_posix__#include <stdlib.h>#endif// APPLICATION INCLUDES#include "cp/CpGatewayManager.h"#include "ptapi/PtTerminalConnection.h"#include "ptapi/PtAddress.h"#include "ptapi/PtCall.h"#include "ptapi/PtTerminal.h"#include "ptapi/PtProvider.h"#include "ptapi/PtCallListener.h"#include "ptapi/PtConnection.h"#include "tao/TaoClientTask.h"#include "tao/TaoServerTask.h"#include "tao/TaoEvent.h"#include "tao/TaoString.h"#include "tao/TaoReference.h"// EXTERNAL FUNCTIONS// EXTERNAL VARIABLES// CONSTANTS//#define EVENT_TRACE(x) osPrintf(x)// STATIC VARIABLE INITIALIZATIONSOsBSem PtCall::semInit(OsBSem::Q_PRIORITY, OsBSem::FULL) ;TaoReference *PtCall::mpTransactionCnt = 0;int PtCall::mRef = 0;/* //////////////////////////// PUBLIC //////////////////////////////////// *//* ============================ CREATORS ================================== */// ConstructorPtCall::PtCall(){ mpClient = 0 ; mState = IDLE; mpConfController = 0; initialize() ;}// Copy constructorPtCall::PtCall(const PtCall& rPtCall){ mCallId = rPtCall.mCallId; mpClient = rPtCall.mpClient; mState = rPtCall.mState; mpConfController = rPtCall.mpConfController; initialize();}PtCall::PtCall(TaoClientTask *pClient, const char* callId){ mpClient = pClient; mCallId.remove(0); if (callId) mCallId = callId; initialize(); if (mpClient && !(mpClient->isStarted())) { mpClient->start(); } mState = ACTIVE; mpConfController = 0;}PtCall::~PtCall(){ semInit.acquire() ; mRef--; if (mRef < 1) { if(mpTransactionCnt) { delete mpTransactionCnt; mpTransactionCnt = 0; } } semInit.release() ;}void PtCall::initialize(){ mpEventMgr = OsProtectEventMgr::getEventMgr(); mTimeOut = OsTime(PT_CONST_EVENT_WAIT_TIMEOUT, 0); semInit.acquire() ; mRef++; if (!mpTransactionCnt) mpTransactionCnt = new TaoReference(); semInit.release() ;}/* ============================ MANIPULATORS ============================== */// Assignment operatorPtCall&PtCall::operator=(const PtCall& rhs){ if (this == &rhs) // handle the assignment to self case return *this; mCallId.remove(0); mCallId = rhs.mCallId; mpClient = rhs.mpClient; mState = rhs.mState; mpConfController = rhs.mpConfController; mTimeOut = rhs.mTimeOut; return *this;}PtStatus PtCall::addCallListener(PtCallListener& rCallListener){ EVENT_TRACE("Entering PtCall::addCallListener:\n") ; if (!mpClient) { return PT_NOT_FOUND; } TaoObjHandle handle = (TaoObjHandle) &rCallListener; UtlString name; UtlString arg; if (PT_SUCCESS == rCallListener.getLocation(&name)) // must have the terminal name { arg = name.data() + TAOMESSAGE_DELIMITER + mCallId; } else return PT_INVALID_ARGUMENT; mpTransactionCnt->add(); unsigned int transactionId = mpTransactionCnt->getRef(); OsProtectedEvent *pe = mpEventMgr->alloc(); if (pe == 0) return PT_RESOURCE_UNAVAILABLE; TaoMessage msg(TaoMessage::REQUEST_CALL, TaoMessage::ADD_CALL_LISTENER, transactionId, (TaoObjHandle)handle, (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::ADD_CALL_LISTENER);#endif mpEventMgr->release(pe); mpClient->addEventListener(&rCallListener, mCallId.data()); EVENT_TRACE("Exiting PtCall::addCallListener:\n") ; return PT_SUCCESS;}PtStatus PtCall::addParty(const char* newPartyURL, PtSessionDesc* pSessionDesc, PtConnection& rConnection){ EVENT_TRACE("Entering PtCall::addParty:\n") ; if (!newPartyURL) return PT_INVALID_ARGUMENT; char buff[MAXIMUM_INTEGER_STRING_LENGTH]; sprintf(buff, "%d", (int)pSessionDesc); UtlString arg; arg = newPartyURL + TAOMESSAGE_DELIMITER + buff + TAOMESSAGE_DELIMITER + mCallId; unsigned int transactionId = mpTransactionCnt->add(); OsProtectedEvent *pe = mpEventMgr->alloc(); TaoMessage msg(TaoMessage::REQUEST_CALL, TaoMessage::ADD_PARTY, 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; } UtlString retCode; pe->getEventData((int &)rc); pe->getStringData(retCode);#ifdef PTAPI_TEST int cmd; pe->getIntData2(cmd); assert(cmd == TaoMessage::ADD_PARTY);#endif mpEventMgr->release(pe); rConnection = PtConnection(mpClient, newPartyURL, mCallId.data()); EVENT_TRACE("Exiting PtCall::addParty:\n") ; return (PtStatus) atoi(retCode);}PtStatus PtCall::conference(PtCall& rOtherCall){ EVENT_TRACE("Entering PtCall::conference:\n") ; char buff[128]; rOtherCall.getCallId(buff, 127); UtlString arg(buff); // not the same call if (arg.isNull() || arg != mCallId) return PT_INVALID_PARTY; arg += TAOMESSAGE_DELIMITER + mCallId; unsigned int transactionId = mpTransactionCnt->add(); OsProtectedEvent *pe = mpEventMgr->alloc(); TaoMessage msg(TaoMessage::REQUEST_CALL, TaoMessage::CONFERENCE, 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::CONFERENCE);#endif mpEventMgr->release(pe); EVENT_TRACE("Exiting PtCall::conference:\n") ; return PT_SUCCESS;}PtStatus PtCall::connect(PtTerminal& rTerminal, PtAddress& rAddress, const char* destinationURL, PtSessionDesc* pSessionDesc){ EVENT_TRACE("Entering PtCall::connect:\n") ; char buff[MAXIMUM_INTEGER_STRING_LENGTH]; sprintf(buff, "%d", (int)&rTerminal); UtlString arg(buff); sprintf(buff, "%d", (int)&rAddress); arg += TAOMESSAGE_DELIMITER + buff; arg += TAOMESSAGE_DELIMITER + destinationURL; sprintf(buff, "%d", (int)pSessionDesc); arg += TAOMESSAGE_DELIMITER + buff; arg += TAOMESSAGE_DELIMITER + mCallId; unsigned int transactionId = mpTransactionCnt->add(); OsProtectedEvent *pe = mpEventMgr->alloc(); TaoMessage msg(TaoMessage::REQUEST_CALL, TaoMessage::CONNECT, transactionId, 0, (TaoObjHandle)pe, 5, arg); mpClient->sendRequest(msg); int rc; UtlString retCode; 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(retCode);#ifdef PTAPI_TEST int cmd; pe->getIntData2(cmd); assert(cmd == TaoMessage::CONNECT);#endif mpEventMgr->release(pe); mState = ACTIVE; EVENT_TRACE("Exiting PtCall::connect:\n") ; return (PtStatus) atoi(retCode);}PtStatus PtCall::consult(PtTerminalConnection& rTerminalConnection, const char* destinationURL, PtSessionDesc* pSessionDesc, PtConnection& rSrcConnection, PtConnection& rDstConnection){ EVENT_TRACE("Entering PtCall::consult:\n") ; UtlString arg; UtlString str; rTerminalConnection.getTerminalName(str); arg.append(str); rTerminalConnection.getAddressName(str); arg += TAOMESSAGE_DELIMITER + str; rTerminalConnection.getCallId(str); arg += TAOMESSAGE_DELIMITER + str; arg += TAOMESSAGE_DELIMITER + mCallId; arg += TAOMESSAGE_DELIMITER + destinationURL; unsigned int transactionId = mpTransactionCnt->add(); OsProtectedEvent *pe = mpEventMgr->alloc(); TaoMessage msg(TaoMessage::REQUEST_CALL, TaoMessage::CONSULT, transactionId, 0, (TaoObjHandle)pe, 5, arg); mpClient->sendRequest(msg); PtStatus 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); pe->getStringData((UtlString &)arg);#ifdef PTAPI_TEST int cmd; pe->getIntData2(cmd); assert(cmd == TaoMessage::CONSULT);#endif mpEventMgr->release(pe);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?