⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testregistrar.cpp

📁 基于sipfoundy 公司开发的sipx协议API
💻 CPP
字号:
//// Copyright (C) 2004, 2005 Pingtel Corp.// //// $$//////////////////////////////////////////////////////////////////////////////// SYSTEM INCLUDES// APPLICATION INCLUDES#include "TestRegistrar.h"#include "net/HttpMessage.h"// EXTERNAL FUNCTIONS// EXTERNAL VARIABLES// CONSTANTSconst int NUM_USERS = 4;// STATIC VARIABLE INITIALIZATIONSTestRegistrarUsers gUsers[] = {    {"mike", "1234"},    {"andy", "3456"},    {"bob",  "5678"},    {"anon", ""}};/* //////////////////////////// PUBLIC //////////////////////////////////// *//* ============================ CREATORS ================================== */// ConstructorTestRegistrar::TestRegistrar()     : OsServerTask("TestRegistrarServer", NULL, 2000)   {    mpUserAgent = new  SipUserAgent(                5070,                    // sipTcpPort                5070,                    // sipUdpPort                5071,                    // sipTlsPort                NULL,                       // publicAddress                NULL,                       // defaultUser                "127.0.0.1",                       // defaultSipAddress                NULL,                       // sipProxyServers                NULL,                       // sipDirectoryServers                NULL,                       // sipRegistryServers                NULL,                       // authenticationScheme                NULL,                       // authenicateRealm                NULL,                       // authenticateDb                NULL,                       // authorizeUserIds                NULL,                       // authorizePasswords                NULL,                       // natPingUrl                0,                          // natPingFrequency                "PING",                     // natPingMethod                NULL,                       // lineMgr                SIP_DEFAULT_RTT,            // sipFirstResendTimeout                TRUE,                       // defaultToUaTransactions                -1,                         // readBufferSize                OsServerTask::DEF_MAX_MSGS, // queueSize                false) ;                    // bUseNextAvailablePort}// Copy constructorTestRegistrar::TestRegistrar(const TestRegistrar& rTestRegistrar){}// DestructorTestRegistrar::~TestRegistrar(){        mpUserAgent->removeMessageObserver(*this->getMessageQueue()) ;    mpUserAgent->shutdown() ;    delete mpUserAgent ;    waitUntilShutDown();}void TestRegistrar::init(){    mpUserAgent->addMessageObserver(*this->getMessageQueue(), SIP_REGISTER_METHOD, 1, 0, 1, 0);    mpUserAgent->addMessageObserver(*this->getMessageQueue(), SIP_SUBSCRIBE_METHOD, 1, 0, 1, 0);    mpUserAgent->start();    while(!mpUserAgent->waitUntilReady())    {        OsTask::delay(100);    }        this->start();}UtlBoolean TestRegistrar::handleMessage(OsMsg& rMsg){    int msgType = rMsg.getMsgType();    int msgSubType = rMsg.getMsgSubType();    UtlBoolean messageProcessed = FALSE;    switch(msgType)    {        case OsMsg::PHONE_APP:        {            const SipMessage& message = *((SipMessageEvent&)rMsg).getMessage();            UtlString method;                        if (!message.isResponse())            {                message.getRequestMethod(&method);                                if (SIP_REGISTER_METHOD == method)                {                    messageProcessed = handleRegisterRequest(message);                }            }            break;        }            }        return messageProcessed;}/* ============================ MANIPULATORS ============================== */// Assignment operatorTestRegistrar&TestRegistrar::operator=(const TestRegistrar& rhs){    return *this;}/* ============================ ACCESSORS ================================= *//* ============================ INQUIRY =================================== *//* //////////////////////////// PROTECTED ///////////////////////////////// */UtlBoolean TestRegistrar::handleRegisterRequest(SipMessage message){    UtlBoolean messageProcessed = false;    SipMessage finalResponse;    UtlString responseToAddress;    UtlString protocol;    int responseToPort;    int seqNum;    UtlString method;    UtlString contactField;    int expires;    static int retrySeqNum = 0;    UtlString callId;        message.getCallIdField(&callId);        message.getContactField(0, contactField);    message.getExpiresField(&expires);        message.getCSeqField(&seqNum, &method);    message.getFromAddress(&responseToAddress, &responseToPort, &protocol);        finalResponse.setContactField(contactField);    finalResponse.setExpiresField(expires);    finalResponse.setFromField("sip:127.0.0.1:5070", 5070);    finalResponse.setSendAddress(contactField, responseToPort);    finalResponse.setToField(contactField, responseToPort, protocol);    finalResponse.setUserAgentField("TestRegistrar");//    finalResponse.setRegisterData(responseToAddress, contactField, "127.0.0.1", contactField, callId, seqNum);        if (contactField.contains("anon"))      // anonymous user doesnt need authentication, just say ok    {        finalResponse.setResponseData(&message, 200, "OK");    }    else if (contactField.contains("mike"))  // mike requires registration, say 401    {        UtlString realm;        UtlString requestUser;        UtlString requestRealm;        UtlString requestNonce;        UtlString authUser;        UtlString uriParam;                        message.getAuthorizationUser(&authUser);        message.getDigestAuthorizationData(                   &requestUser, &requestRealm, &requestNonce,                   NULL, NULL, &uriParam,                   HttpMessage::SERVER, 0);                if (seqNum == retrySeqNum) // if this is a retry response        {            // if they've sent any auth field, just accept it.            // TODO:  figure out if a username and password has been encrypted and sent.            finalResponse.setCSeqField(++seqNum, SIP_REGISTER_METHOD);            finalResponse.setResponseData(&message, 200, "OK");        }        else        {            message.getCSeqField(&seqNum, &method);            finalResponse.setCSeqField(++seqNum, method);            retrySeqNum = seqNum;#ifdef _WIN32            finalResponse.setAuthenticationData("md5", "TestRegistrar", NULL, NULL, NULL, HttpMessage::HttpEndpointEnum::SERVER );#else            finalResponse.setAuthenticationData("md5", "TestRegistrar", NULL, NULL, NULL, HttpMessage::SERVER );#endif            finalResponse.setResponseData(&message, 401, "Not authorized");        }            }    else if (contactField.contains("xyzzy"))    {        // this is our special username that will cause a response        // to be echoed back with the 3 digit value after xyzzy.        // for instance, the contact xyzzy401 will cause a 401 response        int pos = contactField.first("xyzzy");        char szCode[4];        szCode[0] = contactField[pos + 5];        szCode[1] = contactField[pos + 6];        szCode[2] = contactField[pos + 7];        szCode[3] = '\0';                finalResponse.setResponseData(&message, atoi(szCode), "OK");    }            mpUserAgent->send(finalResponse);        return messageProcessed;}/* //////////////////////////// PRIVATE /////////////////////////////////// *//* ============================ FUNCTIONS ================================= */

⌨️ 快捷键说明

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