cnapstag.cpp
来自「液晶电视完整代码可实现人机界面」· C++ 代码 · 共 779 行 · 第 1/2 页
CPP
779 行
filelog(CIS_INTER_MB, "Error:mmlInfo not mml service head " "finsh: flag in file=[%s] at line=[%d]\n", __FILE__, __LINE__); return FALSE; } } //分析出报文体 if((sFindStr = strstr(mmlInfo, MML_CONTENT)) != NULL) { filelog(CIS_INTER_MB, "Parser message content\n"); //PrintFormat(PROMPT, "mmlInfo=[%d][%s]\n", strlen(mmlInfo), mmlInfo); if((sFinsh = strstr(mmlInfo, FLAG_FINSH)) != NULL) { //去掉报文类别标识及结束标志 sFindStr += MAX_LEN_FLAG_MSG; sFinsh -= 1; iContentLen = sFinsh - sFindStr; if(iContentLen <= 0 || iContentLen > MAX_LEN_MML_CONT) { filelog(CIS_INTER_MB, "Error:mmlContentLen=[%d] invalid in file" "=[%s] at line=[%d]\n", iContentLen, __FILE__, __LINE__); } mmlContentLen = iContentLen; mmlContent = new char[mmlContentLen+2]; if(NULL == mmlContent) { filelog(CIS_INTER_MB, "Error:allocate memory fail in file=[%s]" "at line=[%d]\n", __FILE__, __LINE__); return FALSE; } memset(mmlContent, 0, mmlContentLen+2); memcpy(mmlContent, sFindStr, mmlContentLen); strcat(mmlContent, FLAG_COLON); iContentLen = 0; sFindStr = NULL; mmlInfo = sFinsh+2; sFinsh = NULL; bRet = parserContent(mmlContent, mmlContentParaList, &mmlContentParaNum); if(FALSE == bRet) { return bRet; } } else { filelog(CIS_INTER_MB, "Error:mmlInfo not mml content finsh flag " "in file=[%s] at line=[%d]\n", __FILE__, __LINE__); return FALSE; } } else { filelog(CIS_INTER_MB, "Error:mmlInfo not mml content in file=[%s] " "at line=[%d]\n", __FILE__, __LINE__); return FALSE; } //分析出报尾 if((sFindStr = strstr(mmlInfo, MML_TAIL)) != NULL) { filelog(CIS_INTER_MB, "Parser message tail\n"); //PrintFormat(PROMPT, "mmlInfo=[%d][%s]\n", strlen(mmlInfo), mmlInfo); if((sFinsh = strstr(mmlInfo, FLAG_FINSH)) != NULL) { //去掉报文类别标识及结束标志 sFindStr += MAX_LEN_FLAG_MSG; sFinsh -= 1; iContentLen = sFinsh - sFindStr; if(iContentLen <=0 || iContentLen > MAX_LEN_MML_TAIL) { filelog(CIS_INTER_MB, "Error:mmlTailLen=[%d] invalid in file=" "[%s] at line=[%d]\n", iContentLen, __FILE__, __LINE__); return FALSE; } mmlTailLen = iContentLen; mmlTail = new char[mmlTailLen+2]; if(NULL == mmlTail) { filelog(CIS_INTER_MB, "Error:allocate memory fail in file=[%s]" "at line=[%d]\n", __FILE__, __LINE__); return FALSE; } memset(mmlTail, 0, mmlTailLen+2); memcpy(mmlTail, sFindStr, mmlTailLen); strcat(mmlTail, FLAG_COLON); //bRet = parserContent(mmlTail, mmlTailParaList, &mmlTailParaNum); //if(FALSE == bRet) //{ // return bRet; //} } else { filelog(CIS_INTER_MB, "Error:mmlInfo not mml tail finsh flag " "in file=[%s] at line=[%d]\n", __FILE__, __LINE__); return FALSE; } } mmlInfo = mmlInfoHead; filelog(CIS_INTER_MB, "Exit TCnapsTagMML::parserMmlcmd"); return TRUE;}/****************************************************************************函数说明:MML的内容分析函数,根据其人机接口信息分析出报文头,报文业务头*报文体,报文尾的具体内容,分析到参数中*输入参数:无* *输出参数:无* * *返回值 :TBool* TRUE 处理成功* FALSE 处理失败*作 者:zhanglongping *日 期: 2006-10-15****************************************************************************/BOOL TCnapsTagMML::parserContent(char * paraContent, TParameter *paraList, int *paraNum){ filelog(CIS_INTER_MB, "Enter TCnapsTagMML::parserContent\n"); if(NULL == paraContent || strlen(paraContent) <= 0 || strlen(paraContent) >MAX_LEN_MML_INFO) { filelog(CIS_INTER_MB, "Error:paraConten invalid and len=[%d] in file=" "[%s] at line=[%d]\n", strlen(paraContent), __FILE__, __LINE__); return FALSE; } int iParaContentLen = strlen(paraContent); int i = 0; char *sValue = paraContent; while(sValue != NULL) { char *sParaName = NULL; sParaName = new char[MAX_LEN_PARA_NAME+1]; if(NULL == sParaName) { filelog(CIS_INTER_MB, "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_INTER_MB, "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_INTER_MB, "paraList[%d].paraName=[%s]\n", i, paraList[i].paraName); filelog(CIS_INTER_MB, "paraList[%d].paraValue=[%d][%s]\n", i, paraList[i].paraValueLen, paraList[i].paraValue); i++; sValue = sFind; paraContent = sValue; continue; } char *sParaValue = new char[len+1]; if(NULL == sParaValue) { filelog(CIS_INTER_MB, "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; //报文内容往移动,截除已分析的参数值的内容 sValue = sFind; } else { filelog(CIS_INTER_MB,"Error:the parameter not value\n"); } //报文内容往移动,截除已分析的内容 paraContent = sValue; //打印分析出来的参数信息 filelog(CIS_INTER_MB, "paraList[%d].paraName=[%s]\n", i, paraList[i].paraName); filelog(CIS_INTER_MB, "paraList[%d].paraValue=[%d][%s]\n", i, paraList[i].paraValueLen, paraList[i].paraValue); i++; } else { filelog(CIS_INTER_MB, "Not found or parser complete\n"); break; } } *paraNum = i; filelog(CIS_INTER_MB, "Parser number=[%d] parameter\n", i); filelog(CIS_INTER_MB, "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){ if(NULL == sStr || NULL == sInTag || NULL == sOutTag) { filelog(CIS_INTER_MB, "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_INTER_MB, "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_INTER_MB, "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_INTER_MB, "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_INTER_MB, "Error:invalid mmlContType=[%d] in file=[%s] " "at line=[%d]\n", mmlContType, __FILE__, __LINE__); break; } for(int i=0; i<paraNum; i++) { if(0 == memcmp(paraList->paraName, sInTag, strlen(sInTag))) { filelog(CIS_INTER_MB, "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++; } return bFound;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?