Пример #1
0
bool TOptions::SwitchValue(const UnicodeString & Switch, bool Default, bool DefaultOnNonExistence)
{
  bool Result = false;
  int64_t IntValue = 0;
  UnicodeString Value;
  if (!FindSwitch(Switch, Value))
  {
    Result = DefaultOnNonExistence;
  }
  else if (Value.IsEmpty())
  {
    Result = Default;
  }
  else if (::SameText(Value, L"on"))
  {
    Result = true;
  }
  else if (::SameText(Value, L"off"))
  {
    Result = false;
  }
  else if (::TryStrToInt(Value, IntValue))
  {
    Result = (IntValue != 0);
  }
  else
  {
    throw Exception(FMTLOAD(URL_OPTION_BOOL_VALUE_ERROR, Value.c_str()));
  }
  return Result;
}
Пример #2
0
bool TOptions::FindSwitch(const UnicodeString & Switch)
{
  UnicodeString Value;
  intptr_t ParamsStart;
  intptr_t ParamsCount;
  return FindSwitch(Switch, Value, ParamsStart, ParamsCount);
}
Пример #3
0
UnicodeString TOptions::SwitchValue(const UnicodeString & Switch,
  const UnicodeString & Default)
{
  UnicodeString Value;
  FindSwitch(Switch, Value);
  if (Value.IsEmpty())
  {
    Value = Default;
  }
  return Value;
}
Пример #4
0
bool TOptions::FindSwitch(const UnicodeString & Switch,
  TStrings * Params, intptr_t ParamsMax)
{
  UnicodeString Value;
  intptr_t ParamsStart;
  intptr_t ParamsCount;
  bool Result = FindSwitch(Switch, Value, ParamsStart, ParamsCount);
  if (Result)
  {
    if ((ParamsMax >= 0) && (ParamsCount > ParamsMax))
    {
      ParamsCount = ParamsMax;
    }

    intptr_t Index = 0;
    while (Index < ParamsCount)
    {
      Params->Add(GetParam(ParamsStart + Index));
      ++Index;
    }
    ParamsProcessed(ParamsStart, ParamsCount);
  }
  return Result;
}
Пример #5
0
void SYSTEM::HandleISUP(WEvent& evt)
{
    WORD wMsgType;
    wMsgType = *((WORD *)(evt.msgPtr));

    switch(wMsgType)
    {
    case ISUP_ACM: // Backward call indicator and optional parameter.//地址全
    case ISUP_CON: // 连接
    case ISUP_ANM: // Only optional parameters.//应答
    case ISUP_RLC: // 释放完成
    case ISUP_REL: // 释放
    case ISUP_CPG: // Event information and optional parameters. //呼叫进展
    case ISUP_INF: // 信息
    case ISUP_IAM: // 初始地址
    case ISUP_SAM: // 后续地址
    {
        CProtocolTree* pISUPMsg = new CProtocolTree(MOD_ISUP, wMsgType);

        unsigned char * pIePtr;
        unsigned short cIeLen;
        BYTE bNumOfIEs;
        BYTE bIeType;

        bNumOfIEs = evt.msgPtr[2];
        pIePtr = (unsigned char *)(&(evt.msgPtr[3]));

        while(bNumOfIEs)
        {
            bIeType = *pIePtr;
            cIeLen = *(pIePtr+1);
            //
            if(pISUPMsg->PutIE(bIeType, (char*)(pIePtr+2), cIeLen) < 0)
            {
                break;
            }
            //
            pIePtr += cIeLen + 2* sizeof(char);
            bNumOfIEs--;
        }
        //
        uint iOPC = 0;
        uint iDPC = 0;
        CProtocalIE* pIE = pISUPMsg->GetIE(PSG_IE_OPC);
        if(pIE) iOPC = *((uint*)(pISUPMsg->GetIEData(pIE)));
        else {
            LOG4CXX_WARN(rootlog, "!!!ISUP message["<<pISUPMsg->MsgId()<<"] with no OPC");
            return;
        }
        pIE = pISUPMsg->GetIE(PSG_IE_DPC);
        if(pIE) iDPC = *((uint*)(pISUPMsg->GetIEData(pIE)));
        else {
            LOG4CXX_WARN(rootlog, "!!!ISUP message["<<pISUPMsg->MsgId()<<"] with no DPC");
            return;
        }
        //
        CSwitch* pOSwitch = FindSwitch(iOPC);
        CSwitch* pDSwitch = FindSwitch(iDPC);
        if(pDSwitch)
        {
            if(pOSwitch)
            {
                //TODO:此时要将消息复制一份  -> 性能问题
                CProtocolTree* pDump = new CProtocolTree(*pISUPMsg);
                pOSwitch->handlePDU(pDump);
            }
            pDSwitch->handlePDU(pISUPMsg);
        }
        else if(pOSwitch)
        {
            pOSwitch->handlePDU(pISUPMsg);
        }
        else
        {
            delete pISUPMsg;
        }
    }
    break;
    //
    case ISUP_INR: // 信息请求
    case ISUP_USR: // 用户-用户信息
    case ISUP_SUS: // 暂停
    case ISUP_RES: // 恢复
    case ISUP_BLO: // Not any parameters.//闭塞
    case ISUP_BLA: // 闭塞证实
    case ISUP_CCR: // 导通检验请求
    case ISUP_LPA: // 环回证实
    case ISUP_OLM: // 过负荷
    case ISUP_RSC: // 电路复原
    case ISUP_UBL: // 解除闭塞
    case ISUP_UBA: // 解除闭塞证实
    case ISUP_UCIC:// 为分配的CIC
    case ISUP_CGB: // 电路群闭塞
    case ISUP_CGBA:// 电路全闭塞证实
    case ISUP_CGU: // 电路群解除闭塞
    case ISUP_CGUA:// 电路群解除闭塞证实
    case ISUP_GRS: // 电路群复原
    case ISUP_CQM: // 电路群询问
    case ISUP_FAA: // 性能接受
    case ISUP_FAR: // 性能请求
    case ISUP_PAM: // 传递
    case ISUP_MPM: // 计次脉冲
    case ISUP_FOT: // 前向转移
    case ISUP_UPT: // 用户部分测试
    case ISUP_UPA: // 用户部分可用
    case ISUP_FAC: // 性能
    case ISUP_NRM: // 网络资源管理
    case ISUP_IDR: // 识别请求
    case ISUP_IRS: // 识别响应
    case ISUP_SGM: // 分段
    case ISUP_OPR: // 话务员消息
    case ISUP_CCL: // 主叫用户挂机
    case ISUP_CQR: // Only variable. //电路群询问响应
    case ISUP_GRA: // 电路群复原证实
    case ISUP_CFN: // 混乱
    case ISUP_COT: // 导通
    case ISUP_FRJ: // Facility indicator and V & O. //性能拒绝
        break;
    default:
        // Unrecognize message type.
        break;

    }

}
Пример #6
0
void SYSTEM::HandleBICC(WEvent& evt)
{

    WORD wMsgType;
    wMsgType = *((WORD *)(evt.msgPtr));

    switch(wMsgType)
    {
    case BICC_Address_complete: 	// Backward call indicator and optional parameter.//地址全
    case BICC_Connect: 				// 连接
    case BICC_Answer: 				// Only optional parameters.//应答
    case BICC_Release_complete: 	// 释放完成
    case BICC_Release: 				// 释放
    case BICC_Call_progress: 		// Event information and optional parameters. //呼叫进展
    case BICC_Information: 			// 信息
    case BICC_Initial_address: 		// 初始地址
    case BICC_Subsequent_address: 	// 后续地址
    {
        CProtocolTree* pBICCMsg = new CProtocolTree(MOD_BICC, wMsgType);

        unsigned char * pIePtr;
        unsigned short cIeLen;
        BYTE bNumOfIEs;
        BYTE bIeType;

        bNumOfIEs = evt.msgPtr[2];
        pIePtr = (unsigned char *)(&(evt.msgPtr[3]));

        while(bNumOfIEs)
        {
            bIeType = *pIePtr;
            cIeLen = *(pIePtr+1);
            //
            if(pBICCMsg->PutIE(bIeType, (char*)(pIePtr+2), cIeLen) < 0)
            {
                break;
            }
            //
            pIePtr += cIeLen + 2* sizeof(char);
            bNumOfIEs--;
        }
        //
        uint iOPC = 0;
        uint iDPC = 0;
        CProtocalIE* pIE = pBICCMsg->GetIE(PSG_IE_OPC);
        if(pIE) iOPC = *((uint*)(pBICCMsg->GetIEData(pIE)));
        else {
            LOG4CXX_WARN(rootlog, "!!!BICC message["<<pBICCMsg->MsgId()<<"] with no OPC");
            return;
        }
        pIE = pBICCMsg->GetIE(PSG_IE_DPC);
        if(pIE) iDPC = *((uint*)(pBICCMsg->GetIEData(pIE)));
        else {
            LOG4CXX_WARN(rootlog, "!!!BICC message["<<pBICCMsg->MsgId()<<"] with no DPC");
            return;
        }
        //
        CSwitch* pOSwitch = FindSwitch(iOPC);
        CSwitch* pDSwitch = FindSwitch(iDPC);
        if(pDSwitch)
        {
            if(pOSwitch)
            {
                //TODO:此时要将消息复制一份  -> 性能问题
                CProtocolTree* pDump = new CProtocolTree(*pBICCMsg);
                pOSwitch->handlePDU(pDump);
            }
            pDSwitch->handlePDU(pBICCMsg);
        }
        else if(pOSwitch)
        {
            pOSwitch->handlePDU(pBICCMsg);
        }
        else
        {
            delete pBICCMsg;
        }
    }
    break;
    //

    default:
        break;
    }
}
Пример #7
0
void SYSTEM::HandleTUP(WEvent& evt)
{
    WORD wMsgType;
    wMsgType = *((WORD *)(evt.msgPtr));

    switch(wMsgType)
    {
    case TUP_IAM://		0x11
    case TUP_IAI://		0x21
    case TUP_SAM://		0x31
    case TUP_SAO://		0x41
    case TUP_GSM://		0x12 //一般前向建立消息
    case TUP_ACM://		0x14
    case TUP_SEC://		0x15 //交换设备拥塞
    case TUP_CGC://		0x25 //电路群拥塞
    case TUP_NNC://		0x35 //国内网拥塞
    case TUP_ADI://		0x45 //地址不全
    case TUP_CFL://		0x55 //呼叫故障
    case TUP_SSB://		0x65 //用户忙
    case TUP_UNN://		0x75 //空号
    case TUP_LOS://		0x85 //线路不工作
    case TUP_SST://		0x95 //发送专用信息音
    case TUP_ACB://		0xA5 //接入拒绝
    case TUP_DPN://		0xB5 //不提供数字通路
    case TUP_EUM://		0xF5
    case TUP_SLB://     0x1E //用户市忙
    case TUP_STB://     0x2E //用户长忙
    case TUP_ANC://     0x16 //计费
    case TUP_ANN://     0x26 //免费
    case TUP_CBK://     0x36 //后向拆线
    case TUP_CLF://     0x46 //前向拆线
    case TUP_RLG://     0x17 //释放监护
    {
        CProtocolTree* pTUPMsg = new CProtocolTree(MOD_TUP, wMsgType);
        unsigned char * pIePtr;
        unsigned short cIeLen;
        BYTE bNumOfIEs;
        BYTE bIeType;


        bNumOfIEs = evt.msgPtr[2];
        pIePtr = (unsigned char *)(&(evt.msgPtr[3]));

        while(bNumOfIEs)
        {
            bIeType = *pIePtr;
            cIeLen = *(pIePtr+1);
            //
            if(pTUPMsg->PutIE(bIeType, (char*)(pIePtr+2), cIeLen) < 0)
            {
                break;
            }
            //
            pIePtr += cIeLen + 2* sizeof(char);
            bNumOfIEs--;
        }
        //
        uint iOPC = 0;
        uint iDPC = 0;
        CProtocalIE* pIE = pTUPMsg->GetIE(PSG_IE_OPC);
        if(pIE) iOPC = *((uint*)(pTUPMsg->GetIEData(pIE)));
        else {
            LOG4CXX_WARN(rootlog, "!!!TUP message["<<pTUPMsg->MsgId()<<"] with no OPC");
            return;
        }
        pIE = pTUPMsg->GetIE(PSG_IE_DPC);
        if(pIE) iDPC = *((uint*)(pTUPMsg->GetIEData(pIE)));
        else {
            LOG4CXX_WARN(rootlog, "!!!TUP message["<<pTUPMsg->MsgId()<<"] with no DPC");
            return;
        }
        //只有与其他运营商对接的关口局间使用TUP信令
        CSwitch* pDSwitch = FindSwitch(iDPC);
        CSwitch* pOSwitch = FindSwitch(iOPC);
        if(pDSwitch)
        {
            if(pOSwitch)
            {
                CProtocolTree* pDump = new CProtocolTree(*pTUPMsg);
                pOSwitch->handlePDU(pDump);
            }
            pDSwitch->handlePDU(pTUPMsg);
        }
        else if(pOSwitch)
        {
            pOSwitch->handlePDU(pTUPMsg);
        }
        else
        {
            delete pTUPMsg;
        }
    }
    break;
    //
    case TUP_ANU://		0x06
    case TUP_RAN://     0x56
    case TUP_FOT://     0x66
    case TUP_CCL://     0x76 //主叫挂机
    case TUP_CHG://     0x24
    case TUP_COT://     0x32
    case TUP_CCF://     0x42
    case TUP_GRQ://     0x13
    case TUP_BLO://		0x27
    case TUP_BLA://		0x37
    case TUP_UBL://		0x47
    case TUP_UBA://		0x57
    case TUP_CCR://		0x67
    case TUP_RSC://		0x77
    case TUP_MGB://		0x18
    case TUP_MBA://		0x28
    case TUP_MGU://		0x38
    case TUP_MUA://		0x48
    case TUP_HGB://		0x58
    case TUP_HBA://		0x68
    case TUP_HGU://		0x78
    case TUP_HUA://		0x88
    case TUP_GRS://		0x98
    case TUP_GRA://		0xA8
    case TUP_SGB://		0xB8
    case TUP_SBA://		0xC8
    case TUP_SGU://		0xD8
    case TUP_SUA://		0xE8
    case TUP_ACC://		0x1A
    case TUP_MPM://		0x2C
    case TUP_OPR://		0x1D
    case TUP_MAL://	    0x1F
        break;
    default:
        break;
    }

}
Пример #8
0
void SYSTEM::HandleSGsAP(WEvent& evt)
{
    WORD wMsgType;
    wMsgType = *((WORD *)(evt.msgPtr));
    //
    switch(wMsgType)
    {
    case SGsAP_PAGING_REQUEST:
    case SGsAP_PAGING_REJECT:
    case SGsAP_LOCATION_UPDATE_REQUEST:
    case SGsAP_LOCATION_UPDATE_ACCEPT:
    case SGsAP_LOCATION_UPDATE_REJECT:
    {
        CProtocolTree* pSGsAPMsg = new CProtocolTree(MOD_SGSAP, wMsgType);

        unsigned char * pIePtr;
        unsigned short cIeLen;
        BYTE bNumOfIEs;
        BYTE bIeType;

        bNumOfIEs = evt.msgPtr[2];
        pIePtr = (unsigned char *)(&(evt.msgPtr[3]));

        while(bNumOfIEs)
        {
            bIeType = *pIePtr;
            cIeLen = *(pIePtr+1);
            //
            if(pSGsAPMsg->PutIE(bIeType, (char*)(pIePtr+2), cIeLen) < 0)
            {
                break;
            }
            //
            pIePtr += cIeLen + 2* sizeof(char);
            bNumOfIEs--;
        }
        //
        uint iOIP = 0;
        uint iDIP = 0;
        CProtocalIE* pIE = pSGsAPMsg->GetIE(SGsAP_IE_IP_OIP);
        if(pIE) iOIP = *((uint*)(pSGsAPMsg->GetIEData(pIE)));
        else {
            LOG4CXX_WARN(rootlog, "!!!SGSAP message["<<pSGsAPMsg->MsgId()<<"] with no OIP");
            return;
        }
        pIE = pSGsAPMsg->GetIE(SGsAP_IE_IP_DIP);
        if(pIE) iDIP = *((uint*)(pSGsAPMsg->GetIEData(pIE)));
        else {
            LOG4CXX_WARN(rootlog, "!!!SGSAP message["<<pSGsAPMsg->MsgId()<<"] with no DIP");
            return;
        }
        //TODO
        CSwitch* pOSwitch = FindSwitch(iOIP);
        CSwitch* pDSwitch = FindSwitch(iDIP);
        if(pDSwitch)
        {
            pDSwitch->handlePDU(pSGsAPMsg);
        }
        else if(pOSwitch)
        {
            pOSwitch->handlePDU(pSGsAPMsg);
        }
        else
        {
            delete pSGsAPMsg;
        }
    }
    break;
    //

    default:
        break;
    }
}
Пример #9
0
void SYSTEM::HandleGSMA(WEvent& event)
{
    unsigned short cIeLen;
    unsigned char  bNumOfIEs;
    unsigned char  bIeType;


    bNumOfIEs = event.msgPtr[2];
    unsigned char *pIePtr = (unsigned char *)(&(event.msgPtr[3]));

    WORD wMsgType;
    wMsgType = *((WORD *)(event.msgPtr));


    if(event.PtlId == MOD_GSMA_BSSMAP ||
            event.PtlId == MOD_GSMA_DTAP ||
            event.PtlId == MOD_RANAP ||
            event.PtlId == SV_CHINA_SCCP)
    {
        CProtocolTree* pGSMAMsg = new CProtocolTree(event.PtlId, wMsgType);
        pGSMAMsg->m_Reserved.charRev = event.Reserved;
        //
        while(bNumOfIEs)
        {
            bIeType = *pIePtr;
            cIeLen = *(pIePtr+1);
            //
            if(pGSMAMsg->PutIE(bIeType, (char*)(pIePtr+2), cIeLen) < 0)
            {
                break;
            }
            //
            pIePtr += cIeLen + 2* sizeof(char);
            bNumOfIEs--;
        }
        //
        uint iOPC = 0;
        uint iDPC = 0;
        char* pIE = pGSMAMsg->GetIEData(SCCP_IE_OPC);
        if(pIE) iOPC = *((uint*)(pIE));
        else {
            LOG4CXX_WARN(rootlog, "!!!GSMA message["<<pGSMAMsg->MsgId()<<"] with no OPC");
            return;
        }
        pIE = pGSMAMsg->GetIEData(SCCP_IE_DPC);
        if(pIE) iDPC = *((uint*)(pIE));
        else {
            LOG4CXX_WARN(rootlog, "!!!GSMA message["<<pGSMAMsg->MsgId()<<"] with no DPC");
            return;
        }
        //
        CSwitch* pSwitch = FindSwitch(iOPC);
        if(pSwitch == 0) pSwitch = FindSwitch(iDPC);
        if(pSwitch) pSwitch->handlePDU(pGSMAMsg);
        else
        {
            //just for test
            LOG4CXX_WARN(rootlog, "This SCCP message[OPC:"<<iOPC<<" DPC:"<<iDPC<<"] not in any sp element!");
            delete pGSMAMsg;
        }
    }
}
Пример #10
0
void SYSTEM::HandleTCAP(WEvent& event)
{
    unsigned short cIeLen;
    unsigned char  bNumOfIEs;
    unsigned char  bIeType;


    bNumOfIEs = event.msgPtr[2];
    unsigned char *pIePtr = (unsigned char *)(&(event.msgPtr[3]));

    WORD wMsgType;
    wMsgType = *((WORD *)(event.msgPtr));

    //
    if(wMsgType == TCAP_MSG_BEGIN || wMsgType == TCAP_MSG_CONTINUE ||
            wMsgType == TCAP_MSG_END || wMsgType == TCAP_MSG_ABORT)
    {

        CProtocolTree* pTCAPMsg = new CProtocolTree(MOD_TCAP, wMsgType);
        //
        while(bNumOfIEs)
        {
            bIeType = *pIePtr;
            cIeLen = *(pIePtr+1);
            //
            if(pTCAPMsg->PutIE(bIeType, (char*)(pIePtr+2), cIeLen) < 0)
            {
                break;
            }
            //
            pIePtr += cIeLen + 2* sizeof(char);
            bNumOfIEs--;
        }
        //
        uint iOPC = 0;
        uint iDPC = 0;
        char* pIE = pTCAPMsg->GetIEData(SCCP_IE_OPC);
        if(pIE) iOPC = *((uint*)(pIE));
        else {
            LOG4CXX_WARN(rootlog, "!!!TCAP message["<<pTCAPMsg->MsgId()<<"] with no OPC");
            return;
        }
        pIE = pTCAPMsg->GetIEData(SCCP_IE_DPC);
        if(pIE) iDPC = *((uint*)(pIE));
        else {
            LOG4CXX_WARN(rootlog, "!!!TCAP message["<<pTCAPMsg->MsgId()<<"] with no DPC");
            return;
        }
        //
        CSwitch* pSwitch_o = FindSwitch(iOPC);
        CSwitch* pSwitch_d = FindSwitch(iDPC);
        if(pSwitch_d)
        {
            if(pSwitch_o)
            {
                CProtocolTree* pDump = new CProtocolTree(*pTCAPMsg);
                pSwitch_o->handlePDU(pDump);
            }
            pSwitch_d->handlePDU(pTCAPMsg); // 跨交换机时,两个交换机都处理
        }
        else if(pSwitch_o)
        {
            pSwitch_o->handlePDU(pTCAPMsg);
        }
        else
        {
            delete pTCAPMsg;
        }
    }
    //
}