ptprovider.cpp

来自「基于sipfoundy 公司开发的sipx协议API」· C++ 代码 · 共 1,068 行 · 第 1/3 页

CPP
1,068
字号
//// Copyright (C) 2004, 2005 Pingtel Corp.// //// $$//////////////////////////////////////////////////////////////////////////////// SYSTEM INCLUDES#include <assert.h>#include <string.h>#ifdef __pingtel_on_posix__#include <stdlib.h>#endif// APPLICATION INCLUDES#include "ptapi/PtProvider.h"#include "ptapi/PtProvider.h"#include "ptapi/PtTerminal.h"#include "ptapi/PtAddress.h"#include "ptapi/PtCall.h"#include "tao/TaoClientTask.h"#include "tao/TaoServerTask.h"#include "tao/TaoEvent.h"#include "ptapi/PtProviderListener.h"#include "tao/TaoString.h"#include <cp/CpGatewayManager.h>// EXTERNAL FUNCTIONS// EXTERNAL FUNCTIONS// EXTERNAL VARIABLES// CONSTANTS#define USE_MESSAGE_QUEUE 1// STATIC VARIABLE INITIALIZATIONSOsBSem               PtProvider::semInit(OsBSem::Q_PRIORITY, OsBSem::FULL) ;PtProvider                      *PtProvider::spInstance = 0L;       // pointer to the single instance ofOsBSem                          PtProvider::sLock(OsBSem::Q_PRIORITY, OsBSem::FULL);TaoClientTask           *PtProvider::mpClient = 0;TaoReference            *PtProvider::mpTransactionCnt = 0;TaoObjectMap            *PtProvider::mpCalls   = 0;TaoReference            *PtProvider::mpCallCnt = 0;TaoObjectMap            *PtProvider::mpAddresses  = 0;TaoReference            *PtProvider::mpAddressCnt = 0;UtlBoolean                       PtProvider::mbInvalidIP = FALSE;unsigned int            PtProvider::mRef = 0;int FORCE_REFERENCE_PtProvider = 0 ;/* //////////////////////////// PUBLIC //////////////////////////////////// *//* ============================ CREATORS ================================== */// Obtaining access to a Provider (Pingtel Server)PtStatus PtProvider::getProvider(const char* login, const char* password,                        const char* server, const char* options,                        CpCallManager* pCallMgr,                        PtProvider*& rpProvider){        // If the task object already exists, and the corresponding low-level task        // has been started, then use it        if (spInstance != NULL)        {                rpProvider = spInstance;                return PT_SUCCESS;        }        // If the task does not yet exist or hasn't been started, then acquire        // the lock to ensure that only one instance of the task is started        sLock.acquire();        if (spInstance == NULL)       spInstance = new PtProvider(login, password, server, options, pCallMgr);        sLock.release();        rpProvider = spInstance;        return PT_SUCCESS;}PtProvider::PtProvider(const char* login, const char* password,                        const char* server, const char* options, CpCallManager* pCallMgr){        mpEventMgr = OsProtectEventMgr::getEventMgr();        if (PT_SUCCESS == createProvider(login, password, server,  options, pCallMgr))                mState = IN_SERVICE;        else                mState = OUT_OF_SERVICE;}PtStatus PtProvider::createProvider(const char* login, const char* password,                        const char* server, const char* options,         CpCallManager* pCallMgr){        size_t   pos;        UtlString svr = server;        UtlString host;        int port;        pos = svr.index(":", (size_t)0);        if (pos != UTL_NOT_FOUND)        {                host = svr(0, pos);                port = atoi(svr((pos + 1), (svr.length() - pos - 1)).data());                if (host.isNull() || 0 == host.compareTo("0.0.0.0"))                {                        host = "127.0.0.1";                        mbInvalidIP = TRUE;                        osPrintf("WARNING - PtProvider::createProvider: using invalid host, replaced with %s\n", host.data());                }                if (!portIsValid(port))                        port = DEF_TAO_LISTEN_PORT;        }        else        {                return PT_INVALID_ARGUMENT;        }        if (!mpClient)        {                TaoServerTask *pTaoServerTask = NULL;                if (USE_MESSAGE_QUEUE && isLocal(host))                {            // Part of decoupling Call Manager from Phone library            // is to make this argument required            assert(pCallMgr != NULL);                        pTaoServerTask = TaoServerTask::getTaoServerTask(pCallMgr);                        mpClient = new TaoClientTask(port, host, pTaoServerTask);                        if (mpClient && pTaoServerTask)                        {                                pTaoServerTask->setClientHandle((TaoObjHandle) mpClient);                                TaoObjHandle eventServer = mpClient->getEventServer();                                pTaoServerTask->setEventClient((TaoObjHandle) eventServer);                        }                }                else                {                        osPrintf("Ptprovider::createProvider: NOT a local host %s\n", host.data());                        mpClient = new TaoClientTask(port, host, 0);                }        }        if (mpClient && !(mpClient->isStarted()))        {                mpClient->start();        }        initialize();        // formulate the message to be sent to the server        UtlString       argList = login + TAOMESSAGE_DELIMITER + password;        OsProtectedEvent *pe = mpEventMgr->alloc();        TaoMessage      msg(TaoMessage::REQUEST_PROVIDER,                                                                        TaoMessage::GET_PROVIDER,                                                                        0,                                                                        0, //NULL                                                                        (TaoObjHandle)pe,                                                                        2,                                                                        argList);        mpClient->sendRequest(msg);        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;        }        int rc;        pe->getEventData((int &)rc);#ifdef PTAPI_TEST        int cmd;        pe->getIntData2(cmd);        assert(cmd == TaoMessage::GET_PROVIDER);#endif        mpEventMgr->release(pe);#ifdef _VXWORKS        if (mbInvalidIP)        {        char *title = "Error" ;                char *text = "The network settings of this xpressa are incorrect or there is no connection to your network. Please check the network connection and xpressa preferences." ;        // Call processing is now decoupled from Pinger library        // this will have to be removed, but for now this is        // only an issue for the hardphone        JXAPI_MessageBox(MBT_ERROR, title, text, 0) ;                //int delay = 30 * sysClkRateGet();                //taskDelay(delay);                //JNI_ClearStatus();        }#endif        return PT_SUCCESS;}void PtProvider::initialize(){        mTimeOut = OsTime(PT_CONST_EVENT_WAIT_TIMEOUT, 0);    semInit.acquire() ;        mRef++;        if (!mpTransactionCnt)                mpTransactionCnt    = new TaoReference();        if (!mpCalls)                mpCalls   = new TaoObjectMap();        if (!mpCallCnt)                mpCallCnt = new TaoReference();        if (!mpAddresses)                mpAddresses  = new TaoObjectMap();        if (!mpAddressCnt)                mpAddressCnt = new TaoReference();   semInit.release() ;}// Default ConstructorPtProvider::PtProvider(){   initialize();}// Copy constructorPtProvider::PtProvider(const PtProvider& rPtProvider){        spInstance = rPtProvider.spInstance;      // pointer to the single instance of        mpClient = rPtProvider.mpClient;        if (mpClient && !(mpClient->isStarted()))        {                mpClient->start();        }        mLogin = rPtProvider.mLogin;        mPass = rPtProvider.mPass;        mState = rPtProvider.mState;        initialize();        mpEventMgr = OsProtectEventMgr::getEventMgr();}PtProvider::PtProvider(UtlString& rLogin, UtlString& rPass){        mLogin = rLogin;        mPass = rPass;        mpClient = 0;        mState = IN_SERVICE;        mpEventMgr = OsProtectEventMgr::getEventMgr();        initialize();}// DestructorPtProvider::~PtProvider(){    semInit.acquire() ;        if (--mRef < 1)        {                if (mpClient)                {                        mpClient->requestShutdown();                        delete mpClient;                        mpClient = NULL;                }                if (mpTransactionCnt)                {                        delete mpTransactionCnt;                        mpTransactionCnt = 0;                }                if (mpCalls)                {                        delete mpCalls;                        mpCalls = 0;                }                if (mpCallCnt)                {                        delete mpCallCnt;                        mpCallCnt = 0;                }                if (mpAddresses)                {                        delete mpAddresses;                        mpAddresses = 0;                }                if (mpAddressCnt)                {                        delete mpAddressCnt;                        mpAddressCnt = 0;                }                if (spInstance)                {                        spInstance = 0;                }        }    semInit.release() ;}UtlBoolean PtProvider::isLocal(const char * host){        UtlString strServer;        OsSocket::getHostIp(&strServer);//      osPrintf("%s isLocal %s?\n", host, strServer.data());        if (strServer.length() == 0 || 0 == strServer.compareTo("0.0.0.0"))        {                mbInvalidIP = TRUE;                return TRUE;        }        if (strServer.compareTo(host, UtlString::ignoreCase) == 0)                return TRUE;        OsSocket::getHostName(&strServer);        if (strServer.compareTo(host, UtlString::ignoreCase) == 0)                return TRUE;        return FALSE;}/* ============================ MANIPULATORS ============================== */PtStatus PtProvider::addProviderListener(PtProviderListener& rListener){        if (!mpClient)        {                return PT_NOT_FOUND;        }    char buff[MAXIMUM_INTEGER_STRING_LENGTH];

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?