#include "StdAfx.h" #include "CallStringMaker.h" #include "Config.h" CCallStringMaker::CCallStringMaker(void) { } CCallStringMaker::~CCallStringMaker(void) { } /***************************************************************** **【函数名称】 __match **【函数功能】 匹配呼叫字冠 **【参数】 **【返回值】 ****************************************************************/ bool CCallStringMaker::__match( const CString& CalleeNum, TRUNK_MATCH* pTrunkMatch ) { if(lstrcmp(pTrunkMatch->Prefix, CalleeNum.Left(lstrlen(pTrunkMatch->Prefix))) == 0) return true; else return false; } /***************************************************************** **【函数名称】 __make **【函数功能】 为中继呼叫生成字符串 **【参数】 **【返回值】 ****************************************************************/ bool CCallStringMaker::__make( CString& CallerNum, CString& CalleeNum, CString& CallString, TRUNK_MATCH* pTrunkMatch ) { SIP_ACCOUNT* pAccount = CConfig::sipAccount().getAccount(pTrunkMatch->TrunkItemId); //ASSERT(pAccount != NULL); if(pAccount == NULL) { LOGGER(LOG_LEVEL_WARNING, _T("{CallStringMaker}: 生成呼叫字符串时获取网关账户信息失败, AccountId = %d"), pTrunkMatch->TrunkItemId); return false; } if(CallerNum.GetLength() == 0) // 若主叫号码为空,则用缺省主叫号码 CallerNum = pTrunkMatch->Caller; CalleeNum = CalleeNum.Mid(lstrlen(pTrunkMatch->Prefix)); // 修正被叫号码(删除出局字冠) CallString.Format(_T("sofia/gateway/%s/%s"), pAccount->Account, CalleeNum); return true; } /***************************************************************** **【函数名称】 __make **【函数功能】 为分机呼叫生成字符串 **【参数】 **【返回值】 ****************************************************************/ bool CCallStringMaker::__make( CString& CalleeNum, CString& CallString ) { CallString.Format(_T("user/%s"), CalleeNum); return true; } /***************************************************************** **【函数名称】 makeCallString **【函数功能】 生成呼叫字符串 **【参数】 **【返回值】 ****************************************************************/ bool CCallStringMaker::makeCallString( CString& CallerNum, CString& CalleeNum, CString& CallString ) { CCfgTrunkMatch& Match = CConfig::trunkMatch(); POSITION Pos = Match.GetHeadPosition(); while(Pos != NULL) { TRUNK_MATCH* pMatch = Match.GetNext(Pos); ASSERT(pMatch != NULL); if(__match(CalleeNum, pMatch)) return __make(CallerNum, CalleeNum, CallString, pMatch); } return __make(CalleeNum, CallString); } /***************************************************************** **【函数名称】 makeCallStringWithDefault **【函数功能】 生成呼叫字符串若失败则用缺省网关账户 **【参数】 **【返回值】 ****************************************************************/ bool CCallStringMaker::makeCallStringWithDefault( CString& CallerNum, CString& CalleeNum, CString& CallString ) { CCfgTrunkMatch& Match = CConfig::trunkMatch(); TRUNK_MATCH* pMatchDefault = Match.GetHead(); POSITION Pos = Match.GetHeadPosition(); while(Pos != NULL) { TRUNK_MATCH* pMatch = Match.GetNext(Pos); ASSERT(pMatch != NULL); if(pMatch->Priority > pMatchDefault->Priority) pMatchDefault = pMatch; if(__match(CalleeNum, pMatch)) return __make(CallerNum, CalleeNum, CallString, pMatch); } return __make(CallerNum, CalleeNum, CallString, pMatchDefault); }