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; }
bool TOptions::FindSwitch(const UnicodeString & Switch) { UnicodeString Value; intptr_t ParamsStart; intptr_t ParamsCount; return FindSwitch(Switch, Value, ParamsStart, ParamsCount); }
UnicodeString TOptions::SwitchValue(const UnicodeString & Switch, const UnicodeString & Default) { UnicodeString Value; FindSwitch(Switch, Value); if (Value.IsEmpty()) { Value = Default; } return Value; }
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; }
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; } }
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; } }
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; } }
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; } }
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; } } }
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; } } // }