📄 cnapstag.cpp
字号:
memcpy(mmlTail, sFindStr, mmlTailLen); strcat(mmlTail, FLAG_COLON); //printf("mmlTail:%s\n", mmlTail); //bRet = parserContent(mmlTail, mmlTailParaList, &mmlTailParaNum); //if(FALSE == bRet) //{ // return bRet; //} } else { filelog(CIS_SRV_LOG, "Error:mmlInfo not mml tail finsh flag " "in file=[%s] at line=[%d]\n", __FILE__, __LINE__); return FALSE; } } mmlInfo = mmlInfoHead; filelog(CIS_SRV_LOG, "Exit TCnapsTagMML::parserMmlcmd"); return TRUE;}/****************************************************************************函数说明:MML的内容分析函数,根据其人机接口信息分析出报文头,报文业务头*报文体,报文尾的具体内容,分析到参数中*输入参数:无* *输出参数:无* * *返回值 :TBool* TRUE 处理成功* FALSE 处理失败*作 者:zhanglongping *日 期: 2006-10-15****************************************************************************/BOOL TCnapsTagMML::parserContent(char * paraContent, TParameter *paraList, int *paraNum){ filelog(CIS_SRV_LOG, "Enter TCnapsTagMML::parserContent\n"); if(NULL == paraContent || strlen(paraContent) <= 0 || strlen(paraContent) >MAX_LEN_MML_INFO) { filelog(CIS_SRV_LOG, "Error:paraConten invalid and len=[%d] in file=" "[%s] at line=[%d]\n", strlen(paraContent), __FILE__, __LINE__); return FALSE; } long i = 0; /////////////////////////////////////////////////////add by lics const char *p1 = paraContent+1; const char *p2 = p1; int isName = 1; char name[64]; while(*p2 != '}' && *p2 != 0){ p2 ++; if(*p2 == ':'){ // if(isName){ memset(name, 0, sizeof(name)); if(p2 - p1 >= 63) return FALSE; //tagName too long strncpy(name, p1, p2-p1); p1 = p2+1; isName = 0; }else{ isName = 1; if(!strcmp(name, "")){ return FALSE; //包错误 } //this->addTag(name, p1, p2-p1); char *pn = new char[strlen(name) + 3]; char *pv = new char[p2 - p1 + 1]; memset(pn, 0, strlen(name) + 3); memset(pv, 0, p2-p1+1); strcpy(pn,":"); memcpy(pn+1, name, strlen(name)); strcat(pn, ":"); memcpy(pv, p1, p2-p1); paraList[i].paraName = pn; paraList[i].paraValueLen = p2-p1; paraList[i].paraValue = pv; filelog(CIS_SRV_LOG, "ParaInfo=[%s][%d][%s]\n", paraList[i].paraName, paraList[i].paraValueLen, paraList[i].paraValue); i++; p1 = p2+1; } } } if(isName == 0 && strcmp(name, "")!=0){ //this->addTag(name, p1, p2-p1); char *pn = new char[strlen(name) + 3]; char *pv = new char[p2 - p1 + 1]; memset(pn, 0, strlen(name) + 3); memset(pv, 0, p2-p1+1); strcpy(pn,":"); memcpy(pn+1, name, strlen(name)); strcat(pn, ":"); memcpy(pv, p1, p2-p1); paraList[i].paraName = pn; paraList[i].paraValueLen = p2-p1; paraList[i].paraValue = pv; i++; p1 = p2+1; } //////////////////////////////////////////////////////////////// /*int iParaContentLen = strlen(paraContent); //delete by lics char *sValue = paraContent; while(sValue != NULL && strlen(sValue)>=2) { char *sParaName = NULL; sParaName = new char[MAX_LEN_PARA_NAME+1]; if(NULL == sParaName) { filelog(CIS_SRV_LOG, "Error:allocate memory fail in file=[%s]" "at line=[%d]\n", __FILE__, __LINE__); return FALSE; } memset(sParaName, 0, MAX_LEN_PARA_NAME+1); //从报文开始处得到报文内容中的TAG值并自截报文的TAG内容 if(NULL != (sValue=findTag(paraContent, FLAG_TAG, sParaName))) { char *sFind = NULL; //得到其TAG对应的值保存到paraList列表中 if((sFind=strstr(sValue, FLAG_COLON)) !=NULL) { int len = sFind - sValue; //验证值的长度,对于大于两K的参数值跳过不分析 if(len <= 0 || len > MAX_LEN_PARA_VALUE) { //PrintFormat(PROMPT, "Parameter len=[%d] invalid too long " // "and skip the parameter\n"); paraList[i].paraName = sParaName; paraList[i].paraValueLen = len; char *strParaValue = new char[11]; if(NULL == strParaValue) { filelog(CIS_SRV_LOG, "Error:allocate memory fail in " "file=[%s] at line=[%d]\n", __FILE__, __LINE__); delete [] sParaName; } memset(strParaValue, 0, 11); if(len <=0) { strcpy(strParaValue, "not value"); } if(len > MAX_LEN_PARA_VALUE) { strcpy(strParaValue, "too long"); } paraList[i].paraValue = strParaValue; //打印分析出来的参数信息 filelog(CIS_SRV_LOG, "paraList[%d].paraName=[%s]\n", i, paraList[i].paraName); filelog(CIS_SRV_LOG, "paraList[%d].paraValue=[%d][%s]\n", i, paraList[i].paraValueLen, paraList[i].paraValue); i++; sValue = sFind; paraContent = sValue; printf("**************"); continue; //printf("**************"); } char *sParaValue = new char[len+1]; if(NULL == sParaValue) { filelog(CIS_SRV_LOG, "Error:allocate memory fail in " "file=[%s] at line=[%d]\n", __FILE__, __LINE__); delete [] sParaName; return FALSE; } memset(sParaValue, 0, len+1); memcpy(sParaValue, sValue, len); //保存参数名信息 paraList[i].paraName = sParaName; //保存参数值信息 paraList[i].paraValueLen = len; paraList[i].paraValue = sParaValue; printf("tagName:%s---value:%s\n",sParaName, sParaValue); //报文内容往移动,截除已分析的参数值的内容 sValue = sFind; } else { filelog(CIS_SRV_LOG,"Error:the parameter not value\n"); } //报文内容往移动,截除已分析的内容 paraContent = sValue; //打印分析出来的参数信息 filelog(CIS_SRV_LOG, "paraList[%d].paraName=[%s]\n", i, paraList[i].paraName); filelog(CIS_SRV_LOG, "paraList[%d].paraValue=[%d][%s]\n", i, paraList[i].paraValueLen, paraList[i].paraValue); i++; } else { filelog(CIS_SRV_LOG, "Not found or parser complete\n"); break; } }//end while */ *paraNum = i; filelog(CIS_SRV_LOG, "Parser number=[%d] parameter\n", i); filelog(CIS_SRV_LOG, "Exit TCnapsTagMML::parserContent\n"); return TRUE;}/****************************************************************************函数说明:定长通配查找报文中的TAG的函数*输入参数:char *sStr :源报文内容* char *sInTag :定长的TAG通配符*输出参数:char *sOutTag:得到真正的TAG值* * *返回值 :char * :找到TAG后VALUE的首地址* * *作 者:zhanglongping *日 期: 2006-10-15****************************************************************************/char* TCnapsTagMML::findTag(char * sStr, char * sInTag, char *sOutTag){ static char *sRet = NULL; char *p = sStr; //char *q = sStr; if(*p != ':' || *p == 0){ return NULL; } p++; while(*p != ':' && *p != 0){ p ++; } strncpy(sOutTag, sStr, p-sStr+1); //printf("sOutTag:%s sStr:%s--%d\n", sOutTag, sStr, p-sStr+1); sRet = p +1 ; if(*p == 0 || *sRet == 0) return NULL; return sRet; /* if(NULL == sStr || NULL == sInTag || NULL == sOutTag) { filelog(CIS_SRV_LOG, "Error:invalid input or output parameter in file=" "[%s] at line=[%d]", __FILE__, __LINE__); return NULL; } char *sStart = NULL; char *sEnd = NULL; //char *sRet = NULL; sStart = sStr; sEnd = sInTag; int iInTagLen = strlen(sInTag)-1; if(strlen(sStart) <= (int)iInTagLen) { filelog(CIS_SRV_LOG, "Already parser message end\n"); return sRet; } if(*sStart == *sEnd) { sStart += iInTagLen; sEnd += iInTagLen; if(*sStart == *sEnd) { sRet = sStart+1; memcpy(sOutTag, sStart-iInTagLen, iInTagLen+1); } else { filelog(CIS_SRV_LOG, "Not found sInTag=[%s]\n", sInTag); } } return sRet;*/}/****************************************************************************函数说明:MML的内容分析函数,根据其人机接口信息分析出报文头,报文业务头*报文体,报文尾的具体内容,分析到参数中*输入参数:TMMLContType mmlContType:查找报文内容的类型* char *sInTag :要查找值的TAG*输出参数:char *sOutValue:得到对应TAG的值* * *返回值 :TBool* TRUE 处理成功* FALSE 处理失败*作 者:zhanglongping *日 期: 2006-10-15****************************************************************************/BOOL TCnapsTagMML::getParaValue(TMMLContType mmlContType, char * sInTag, char * sOutValue){ if(INVALID_MMLCONTTYPE >= mmlContType || INVALID_MMLCONTTYPE_END <= mmlContType) { filelog(CIS_SRV_LOG, "Error invalid mmlContType in file=[%s] at line=" "[%d]\n", __FILE__, __LINE__); return FALSE; } TParameter *paraList = NULL; int paraNum = 0; BOOL bFound = FALSE; switch (mmlContType) { case MML_CONTTYPE_HEAD: { paraList = mmlHeadParaList; paraNum = mmlHeadParaNum; break; } case MML_CONTTYPE_SERVICE_HEAD: { paraList = mmlServiceHeadParaList; paraNum = mmlServiceHeadParaNum; break; } case MML_CONTTYPE_CONT: { paraList = mmlContentParaList; paraNum = mmlContentParaNum; break; } case MML_CONTTYPE_TAIL: { paraList = mmlTailParaList; paraNum = mmlTailParaNum; break; } default: filelog(CIS_SRV_LOG, "Error:invalid mmlContType=[%d] in file=[%s] " "at line=[%d]\n", mmlContType, __FILE__, __LINE__); break; } if(paraList == NULL) return FALSE; //printf("\nparaNum:%d\n", paraNum); for(int i=0; i<paraNum; i++) { //printf("paraName:%d---%s\n", i, paraList->paraName); if(strlen(sInTag) == strlen(paraList->paraName)){ int j = 0; for(; j<strlen(sInTag); j++){ if(toupper(sInTag[j]) != toupper(paraList->paraName[j])) break; } if(j >= strlen(sInTag) && paraList->paraValueLen > 0){ memcpy(sOutValue, paraList->paraValue, paraList->paraValueLen); filelog(CIS_SRV_LOG, "Success:found paraName=[%s][%d][%s]\n", paraList->paraName, paraList->paraValueLen, paraList->paraValue); return TRUE; } } /*if(0 == stricmp(paraList->paraName, sInTag)) { filelog(CIS_SRV_LOG, "Success:found paraName=[%s] and paraValue=" "[%d][%s]\n", paraList->paraName,paraList->paraValueLen, paraList->paraValue); memcpy(sOutValue, paraList->paraValue, paraList->paraValueLen); bFound = TRUE; break; }*/ paraList++; } //printf("\n%s not found\n", sInTag); return bFound;}const char* TCnapsTagMML::getParaValue(TMMLContType mmlContType, char * sInTag){ if(INVALID_MMLCONTTYPE >= mmlContType || INVALID_MMLCONTTYPE_END <= mmlContType) { filelog(CIS_SRV_LOG, "Error invalid mmlContType in file=[%s] at line=" "[%d]\n", __FILE__, __LINE__); return FALSE; } TParameter *paraList = NULL; int paraNum = 0; //BOOL bFound = FALSE; switch (mmlContType) { case MML_CONTTYPE_HEAD: { paraList = mmlHeadParaList; paraNum = mmlHeadParaNum; break; } case MML_CONTTYPE_SERVICE_HEAD: { paraList = mmlServiceHeadParaList; paraNum = mmlServiceHeadParaNum; break; } case MML_CONTTYPE_CONT: { paraList = mmlContentParaList; paraNum = mmlContentParaNum; break; } case MML_CONTTYPE_TAIL: { paraList = mmlTailParaList; paraNum = mmlTailParaNum; break; } default: filelog(CIS_SRV_LOG, "Error:invalid mmlContType=[%d] in file=[%s] " "at line=[%d]\n", mmlContType, __FILE__, __LINE__); break; } if(paraList == NULL) return FALSE; for(int i=0; i<paraNum; i++) { if(strlen(sInTag) == strlen(paraList->paraName)){ int j = 0; for(j=0; j<strlen(sInTag); j++){ if(toupper(sInTag[j]) != toupper(paraList->paraName[j])) break; } if(j >= strlen(sInTag)){ if(paraList->paraValueLen <= 0 || paraList->paraValueLen>= MAX_LEN_PARA_VALUE) return NULL; filelog(CIS_SRV_LOG, "Success:found paraName=[%s][%d][%s]\n", paraList->paraName, paraList->paraValueLen, paraList->paraValue); return paraList->paraValue; } } paraList++; } return NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -