📄 presencedialinserver.cpp
字号:
// // // Copyright (C) 2005 SIPfoundry Inc.// Licensed by SIPfoundry under the LGPL license.// // Copyright (C) 2005 Pingtel Corp.// Licensed to SIPfoundry under a Contributor Agreement.// // $$////////////////////////////////////////////////////////////////////////////// SYSTEM INCLUDES// APPLICATION INCLUDES#include <cp/PresenceDialInServer.h>#include <utl/UtlHashMapIterator.h>#include <utl/UtlVoidPtr.h>#include <tao/TaoMessage.h>#include <tao/TaoString.h>#include <cp/CallManager.h>#include <net/SipDialog.h>#include <os/OsFS.h>#include <xmlparser/tinyxml.h>#include <os/OsDateTime.h>#include <os/OsTimer.h>#include <os/OsEventMsg.h>#include "ConfirmationTone.h"#include "DialTone.h"#include "BusyTone.h"// EXTERNAL FUNCTIONS// EXTERNAL VARIABLES// CONSTANTS#define TAO_OFFER_PARAM_CALLID 0#define TAO_OFFER_PARAM_ADDRESS 2#define TAO_OFFER_PARAM_LOCAL_CONNECTION 6#define SECONDS_DELAY 1#define CONFIG_SETTING_SIGN_IN_CODE "SIP_PRESENCE_SIGN_IN_CODE"#define CONFIG_SETTING_SIGN_OUT_CODE "SIP_PRESENCE_SIGN_OUT_CODE"#define CONFIG_SETTING_SIGN_IN_AUDIO "SIP_PRESENCE_SIGN_IN_CONFIRMATION_AUDIO"#define CONFIG_SETTING_SIGN_OUT_AUDIO "SIP_PRESENCE_SIGN_OUT_CONFIRMATION_AUDIO"#define CONFIG_SETTING_ERROR_AUDIO "SIP_PRESENCE_ERROR_AUDIO"//#define DEBUGGING 1// STATIC VARIABLE INITIALIZATIONS// Private class to contain an incoming call for given callIdclass CallContainer : public UtlString{public: CallContainer(UtlString& callId, UtlString& address, OsMsgQ* incomingQ); virtual ~CallContainer(); // parent UtlString contains the resourceId and eventTypeKey UtlString mCallId; UtlString mAddress; OsQueuedEvent* mQueuedEvent; OsTimer* mTimer;private: //! DISALLOWED accendental copying CallContainer(const CallContainer& rCallContainer); CallContainer& operator=(const CallContainer& rhs);};CallContainer::CallContainer(UtlString& callId, UtlString& address, OsMsgQ* incomingQ){ mCallId = callId; mAddress = address; mQueuedEvent = new OsQueuedEvent(*incomingQ, (int)this); mTimer = new OsTimer(*mQueuedEvent);}CallContainer::~CallContainer(){ if (mQueuedEvent) { delete mQueuedEvent; } if (mTimer) { delete mTimer; }}/* //////////////////////////// PUBLIC //////////////////////////////////// *//* ============================ CREATORS ================================== */// ConstructorPresenceDialInServer::PresenceDialInServer(CallManager* callManager, OsConfigDb* configFile) : mLock(OsBSem::Q_PRIORITY, OsBSem::FULL){ mpCallManager = callManager; if (configFile->get(CONFIG_SETTING_SIGN_IN_CODE, mSignInFC) != OS_SUCCESS) { mSignInFC = DEFAULT_SIGNIN_FEATURE_CODE; } if (configFile->get(CONFIG_SETTING_SIGN_OUT_CODE, mSignOutFC) != OS_SUCCESS) { mSignOutFC = DEFAULT_SIGNOUT_FEATURE_CODE; } if (configFile->get(CONFIG_SETTING_SIGN_IN_AUDIO, mSignInConfirmationAudio) != OS_SUCCESS) { mSignInConfirmationAudio = NULL; } if (configFile->get(CONFIG_SETTING_SIGN_OUT_AUDIO, mSignOutConfirmationAudio) != OS_SUCCESS) { mSignOutConfirmationAudio = NULL; } if (configFile->get(CONFIG_SETTING_ERROR_AUDIO, mErrorAudio) != OS_SUCCESS) { mErrorAudio = NULL; } OsSysLog::add(FAC_SIP, PRI_DEBUG, "PresenceDialInServer:: configuration for PresenceDialIn:"); OsSysLog::add(FAC_SIP, PRI_DEBUG, "PresenceDialInServer:: signInFeatureCode = %s", mSignInFC.data()); OsSysLog::add(FAC_SIP, PRI_DEBUG, "PresenceDialInServer:: signOutFeatureCode = %s", mSignOutFC.data()); OsSysLog::add(FAC_SIP, PRI_DEBUG, "PresenceDialInServer:: signInConfirmationAudio = %s", (mSignInConfirmationAudio == NULL ? "confirmation tone" : mSignInConfirmationAudio.data())); OsSysLog::add(FAC_SIP, PRI_DEBUG, "PresenceDialInServer:: signOutConfirmationAudio = %s", (mSignOutConfirmationAudio == NULL ? "dial tone" : mSignOutConfirmationAudio.data())); OsSysLog::add(FAC_SIP, PRI_DEBUG, "PresenceDialInServer:: errorAudio = %s", (mErrorAudio == NULL ? "busy tone" : mErrorAudio.data())); mpIncomingQ = getMessageQueue(); }//DestructorPresenceDialInServer::~PresenceDialInServer(){ if (!mStateChangeNotifiers.isEmpty()) { mStateChangeNotifiers.destroyAll(); } }/* ============================ MANIPULATORS ============================== */UtlBoolean PresenceDialInServer::handleMessage(OsMsg& rMsg){ SipDialog sipDialog; UtlString sipDialogContent; Url requestUrl; UtlString entity; UtlString featureCode; Url contactUrl; UtlString contact; int msgType = rMsg.getMsgType(); int msgSubType = rMsg.getMsgSubType(); // React to telephony events if(msgSubType == TaoMessage::EVENT) { TaoMessage* taoMessage = dynamic_cast <TaoMessage*> (&rMsg); int taoEventId = taoMessage->getTaoObjHandle(); UtlString argList(taoMessage->getArgList()); TaoString arg(argList, TAOMESSAGE_DELIMITER);#ifdef DEBUGGING dumpTaoMessageArgs(taoEventId, arg) ;#endif UtlBoolean localConnection = atoi(arg[TAO_OFFER_PARAM_LOCAL_CONNECTION]); UtlString callId = arg[TAO_OFFER_PARAM_CALLID] ; UtlString address = arg[TAO_OFFER_PARAM_ADDRESS] ; switch (taoEventId) { case PtEvent::CONNECTION_OFFERED: mpCallManager->acceptConnection(callId, address); mpCallManager->answerTerminalConnection(callId, address, "*"); mpCallManager->getSipDialog(callId, address, sipDialog);#ifdef DEBUGGING sipDialog.toString(sipDialogContent); OsSysLog::add(FAC_SIP, PRI_DEBUG, "PresenceDialInServer:: sipDialog = %s", sipDialogContent.data());#endif sipDialog.getRemoteRequestUri(entity); OsSysLog::add(FAC_SIP, PRI_DEBUG, "PresenceDialInServer:: Call arrived: callId %s address %s requestUrl %s", callId.data(), address.data(), entity.data()); if (entity.isNull()) { OsSysLog::add(FAC_SIP, PRI_WARNING, "PresenceDialInServer:: Call arrived: callId %s address %s without requestUrl", callId.data(), address.data()); } break; case PtEvent::CONNECTION_ESTABLISHED: if (localConnection) { mpCallManager->getSipDialog(callId, address, sipDialog);#ifdef DEBUGGING sipDialog.toString(sipDialogContent); OsSysLog::add(FAC_SIP, PRI_DEBUG, "PresenceDialInServer:: sipDialog = %s", sipDialogContent.data());#endif sipDialog.getRemoteRequestUri(entity); OsSysLog::add(FAC_SIP, PRI_DEBUG, "Call connected: callId %s address %s with request %s", callId.data(), address.data(), entity.data()); if (entity.isNull()) { OsSysLog::add(FAC_SIP, PRI_WARNING, "PresenceDialInServer:: Call connected: callId %s address %s without requestUrl",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -