VOS_UINT32 MN_MSG_DecodeCbsDcs( VOS_UINT8 ucDcs, VOS_UINT8 *pucContent, VOS_UINT32 ulContentLength, MN_MSG_CBDCS_CODE_STRU *pstDcsInfo ) { VOS_UINT32 ulRet; VOS_UINT8 aucLang[TAF_MSG_CBA_LANG_LENGTH]; MN_MSG_ISO639_LANG_ENUM_U16 uslang; ulRet = MN_ERR_NO_ERROR; /* Deleted by f62575 for V9R1 STK升级, 2013-6-26, begin */ /* Deleted by f62575 for V9R1 STK升级, 2013-6-26, end */ pstDcsInfo->ucRawDcsData = ucDcs; pstDcsInfo->ucMsgCodingGroup = (ucDcs >> 4) & 0x0f ; pstDcsInfo->enMsgCoding = MN_MSG_MSG_CODING_7_BIT; pstDcsInfo->bCompressed = VOS_FALSE; pstDcsInfo->enMsgLang = MN_MSG_CBLANG_ENGLISH; pstDcsInfo->enMsgClass = MN_MSG_MSG_CLASS_MAX; pstDcsInfo->ucLangIndLen = 0; /* Deleted by f62575 for V9R1 STK升级, 2013-6-26, begin */ /* Deleted by f62575 for V9R1 STK升级, 2013-6-26, end */ PS_MEM_SET(aucLang, 0x00, sizeof(aucLang)); switch (pstDcsInfo->ucMsgCodingGroup) { /*判断高四位为0000,0011,0010*/ case 0x00: case 0x02: case 0x03: pstDcsInfo->enMsgLang = (ucDcs & 0x0f) ; break; case 0x01: /*判断高四位为0001*/ /* Added by f62575 for V9R1 STK升级, 2013-6-26, begin */ if (ulContentLength < TAF_MSG_CBA_LANG_LENGTH) { MN_WARN_LOG("MSG_CbDecodeDcs: Invalid ulContentLength."); return MN_ERR_CLASS_SMS_INVALID_MSG_LANG; } /* Added by f62575 for V9R1 STK升级, 2013-6-26, end */ ulRet = MN_MSG_DecodeDcsIf01(ucDcs,pstDcsInfo); if ( MN_ERR_NO_ERROR != ulRet ) { MN_WARN_LOG("MSG_CbDecodeDcs: Invalid Dcs Info."); } /*根据消息内容的前两个字符得到CBS语言编码LangCode*/ /* Modified by f62575 for V9R1 STK升级, 2013-6-26, begin */ ulRet = TAF_STD_UnPack7Bit(pucContent, pstDcsInfo->ucLangIndLen, 0, aucLang); if (VOS_OK != ulRet) { MN_WARN_LOG("MSG_CbDecodeDcs: TAF_STD_UnPack7Bit Err."); } /* Modified by f62575 for V9R1 STK升级, 2013-6-26, end */ uslang = *(MN_MSG_ISO639_LANG_ENUM_U16 *)aucLang; pstDcsInfo->enMsgLang = MN_MSG_Iso639LangToDef(uslang); break; /*判断高四位为01xx */ case 0x04: case 0x05: case 0x06: case 0x07: ulRet = MN_MSG_DecodeDcsIf07(ucDcs,pstDcsInfo); if ( MN_ERR_NO_ERROR != ulRet ) { MN_WARN_LOG("MSG_CbDecodeDcs: Invalid Dcs Info."); } break; case 0x09:/*Refer to 23038-610.doc*/ ulRet = MN_MSG_DecodeDcsIf09(ucDcs,pstDcsInfo); if ( MN_ERR_NO_ERROR != ulRet ) { MN_WARN_LOG("MSG_CbDecodeDcs: Invalid Dcs Info."); } break; case 0x0f: ulRet = MN_MSG_DecodeDcsIf0F(ucDcs,pstDcsInfo); if ( MN_ERR_NO_ERROR != ulRet ) { MN_WARN_LOG("MSG_CbDecodeDcs: Invalid Dcs Info."); } break; default: MN_WARN_LOG("MSG_CbDecodeDcs: Invalid coding group."); ulRet = MN_ERR_CLASS_SMS_INVALID_CODING_GRP; break; } if ( MN_MSG_CBLANG_MAX == pstDcsInfo->enMsgLang ) { pstDcsInfo->enMsgLang = MN_MSG_CBLANG_ENGLISH; } return ulRet; }
VOS_UINT32 MN_MSG_DecodeCbmPage( const MN_MSG_CBRAW_TS_DATA_STRU *pstCbRawInfo, MN_MSG_CBPAGE_STRU *pstCbmPageInfo ) { VOS_UINT32 ulRet; MN_MSG_CBGSMPAGE_STRU *pstGsmPage; VOS_UINT32 ulDataLen; /*判断输入参数的合法性*/ if ((VOS_NULL_PTR == pstCbRawInfo) || (VOS_NULL_PTR == pstCbmPageInfo)) { MN_ERR_LOG("MN_MSG_DecodeCbmPage: Parameter of the function is null."); return MN_ERR_NULLPTR; } pstGsmPage = (MN_MSG_CBGSMPAGE_STRU *)pstCbRawInfo->aucData; /* 解析DCS */ /* Modified by f62575 for V9R1 STK升级, 2013-6-26, begin */ ulRet = MN_MSG_DecodeCbsDcs(pstGsmPage->ucDCS, pstGsmPage->aucContent, TAF_CBA_MAX_CBDATA_LEN, &(pstCbmPageInfo->stDcs)); /* Modified by f62575 for V9R1 STK升级, 2013-6-26, end */ if (MN_ERR_NO_ERROR != ulRet) { MN_WARN_LOG1("MN_MSG_DecodeCbmPage:DCS Invalid:ulRet",(VOS_INT32)ulRet); } /* 解析SN */ ulRet = MSG_CbDecodeSn(pstGsmPage, &(pstCbmPageInfo->stSn)); if (MN_ERR_NO_ERROR != ulRet) { MN_WARN_LOG1("MN_MSG_DecodeCbmPage:SN Invalid:ulRet",(VOS_INT32)ulRet); } /* 解析MID */ pstCbmPageInfo->usMid = pstGsmPage->ucMIdHigh; pstCbmPageInfo->usMid = (VOS_UINT16)(pstCbmPageInfo->usMid << 8) | pstGsmPage->ucMIdLow; /* page info */ pstCbmPageInfo->ucPageIndex = pstGsmPage->Pagebit4; pstCbmPageInfo->ucPageNum = pstGsmPage->Pagesbit4; /* This parameter is coded as two 4-bit fields. The first field (bits 0-3) indicates the binary value of the total number of pages in the CBS message and the second field (bits 4-7) indicates binary the page number within that sequence. The coding starts at 0001, with 0000 reserved. If a mobile receives the code 0000 in either the first field or the second field then it shall treat the CBS message exactly the same as a CBS message with page parameter 0001 0001 (i.e. a single page message). */ if ( ( 0 == pstCbmPageInfo->ucPageIndex ) || ( 0 == pstCbmPageInfo->ucPageNum )) { pstCbmPageInfo->ucPageIndex = 1; pstCbmPageInfo->ucPageNum = 1; } ulDataLen = pstCbRawInfo->ulLen - MSG_CBPAGE_HEADER_LEN; /* 如果是 7bit编码需要将其转化为8bit */ if (MN_MSG_MSG_CODING_7_BIT == pstCbmPageInfo->stDcs.enMsgCoding ) { pstCbmPageInfo->stContent.ulLen = (ulDataLen * 8)/7; if ( pstCbmPageInfo->stContent.ulLen > TAF_CBA_MAX_RAW_CBDATA_LEN ) { pstCbmPageInfo->stContent.ulLen = TAF_CBA_MAX_RAW_CBDATA_LEN; } /* Modified by f62575 for V9R1 STK升级, 2013-6-26, begin */ ulRet = TAF_STD_UnPack7Bit(pstGsmPage->aucContent, pstCbmPageInfo->stContent.ulLen, 0, pstCbmPageInfo->stContent.aucContent); if (VOS_OK != ulRet) { MN_WARN_LOG("MN_MSG_DecodeCbmPage:TAF_STD_UnPack7Bit fail"); } /* Modified by f62575 for V9R1 STK升级, 2013-6-26, end */ } else { pstCbmPageInfo->stContent.ulLen = ulDataLen; PS_MEM_CPY(pstCbmPageInfo->stContent.aucContent, pstGsmPage->aucContent, pstCbmPageInfo->stContent.ulLen); } return MN_ERR_NO_ERROR; }
VOS_UINT32 TAF_SPM_TransUssdMsgToAsciiStr( TAF_SS_PROCESS_USS_REQ_STRU *pstUssdMsg, VOS_UINT8 *pucAsciiStr, VOS_UINT32 *pulAsciiStrLength ) { VOS_UINT8 *pucUssdStr = VOS_NULL_PTR; VOS_UINT8 *pucUssdTransTbl = VOS_NULL_PTR; VOS_UINT8 aucUnpackUssdStr[TAF_SS_MAX_USSDSTRING_LEN]; VOS_UINT32 ulUssdStrLength; VOS_UINT32 ulUnpackUssdStrLength; VOS_UINT32 i; VOS_UINT32 ulRet; MN_MSG_CBDCS_CODE_STRU stDcsInfo; PS_MEM_SET(&stDcsInfo, 0, sizeof(stDcsInfo)); ulRet = MN_MSG_DecodeCbsDcs(pstUssdMsg->DatacodingScheme, pstUssdMsg->UssdStr.aucUssdStr, pstUssdMsg->UssdStr.usCnt, &stDcsInfo); if (MN_ERR_NO_ERROR != ulRet) { TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_TransUssdMsgToAsciiStr:WARNING: Decode Failure"); return VOS_FALSE; } /* 非透传模式或非7BIT编码,TAF接收到的用户USSD字符串编码格式为ASCII码或UCS2码流, 不需要转换,直接拷贝到输出参数 */ if ((TAF_SDC_USSD_TRAN_MODE != TAF_SDC_GetUssdTransMode()) || (MN_MSG_MSG_CODING_7_BIT != stDcsInfo.enMsgCoding)) { if (pstUssdMsg->UssdStr.usCnt > TAF_SS_MAX_USSDSTRING_LEN) { TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_TransUssdMsgToAsciiStr: USSD length overflow in none transparent mode."); return VOS_FALSE; } *pulAsciiStrLength = pstUssdMsg->UssdStr.usCnt; PS_MEM_CPY(pucAsciiStr, pstUssdMsg->UssdStr.aucUssdStr, *pulAsciiStrLength); return VOS_TRUE; } /* 这段代码完成从7BIT压缩编码的数字字符串到ASCII码流的转换 透传模式并且DCS为7bit编码格式,用户输入每一个USSD数字,经过7Bit压缩后, 每个字节的高4bit和低4bit在此处是分别由一个Byte表示的 TAF接收到的用户USSD字符串就是2个字符表示一个数字,最大长度为320字符, USSD空口码流容量为160BYTE,160BYTE 传输7BIT编码的字符,可以传输182个字符, 示例: 用户输入*199#的情况,应用接收到ASCII码流2A 31 39 39 23,进行7BIT编码后为 aa 58 2e 37 02,转换为数字字符串为61 61 35 38 32 65 33 37 30 32,通过AT命令 AT+CUSD=1,"61613538326533373032",15 AT透传"61613538326533373032"到TAF,所以 本函数输入: 61 61 35 38 32 65 33 37 30 32 本函数输出: ASCII码流为2A 31 39 39 23,长度为5 实现步骤: 1) TAF_AsciiNum2HexStr: 61 61 35 38 32 65 33 37 30 32 => aa 58 2e 37 02 2) MN_UnPack7Bit: aa 58 2e 37 02 => 2A 31 39 39 23 因为此处的ASCII码属于标准ASCII码,所以USSD的字符转换表对输出字符串无影响 16进制表示的USSD码流字符串转换为16进制表示的USSD码流 举例说明: 16进制表示的7BIT字符表压缩编码的USSD码流字符串 0x61 0x61 0x35 0x38 0x32 0x65 0x33 0x37 0x30 0x32 转换成 16进制表示的7BIT字符表压缩编码的码流 0xaa 0x58 0x2e 0x37 0x02 其中,0x61表示ASCII码的a 0x65表示ASCII码的e */ if (pstUssdMsg->UssdStr.usCnt > TAF_SS_MAX_USSD_CHAR_HEX_FORMAT) { TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_TransUssdMsgToAsciiStr: USSD length overflow in transparent mode."); return VOS_FALSE; } pucUssdStr = (VOS_UINT8 *)PS_MEM_ALLOC(WUEPS_PID_TAF, TAF_SS_MAX_USSD_CHAR_HEX_FORMAT); if (VOS_NULL_PTR == pucUssdStr) { TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_TransUssdMsgToAsciiStr: Fail to alloc memory."); return VOS_FALSE; } PS_MEM_SET(pucUssdStr, 0, TAF_SS_MAX_USSD_CHAR_HEX_FORMAT); ulUssdStrLength = pstUssdMsg->UssdStr.usCnt; PS_MEM_CPY(pucUssdStr, pstUssdMsg->UssdStr.aucUssdStr, pstUssdMsg->UssdStr.usCnt); ulRet = TAF_STD_AsciiNum2HexString(pucUssdStr, (VOS_UINT16 *)&ulUssdStrLength); if (VOS_FALSE == ulRet) { TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_TransUssdMsgToAsciiStr: Fail to TAF_AsciiNum2HexString."); PS_MEM_FREE(WUEPS_PID_TAF, pucUssdStr); return VOS_FALSE; } /* 16进制表示的7BIT字符表压缩编码USSD码流转换成7BIT字符表非压缩编码USSD码流 举例说明: 16进制表示的7BIT字符表压缩编码USSD码流 0xaa 0x58 0x2e 0x37 0x02 转换成 7BIT字符表非压缩编码USSD码流 0x2A 0x31 0x39 0x39 0x23 */ ulUnpackUssdStrLength = TAF_SPM_GetUssdStringSeptetLength(ulUssdStrLength, *(pucUssdStr + ulUssdStrLength - 1)); PS_MEM_SET(aucUnpackUssdStr, 0, sizeof(aucUnpackUssdStr)); if (ulUssdStrLength > TAF_SS_MAX_USSDSTRING_LEN) { ulUssdStrLength = TAF_SS_MAX_USSDSTRING_LEN; } ulRet = TAF_STD_UnPack7Bit(pucUssdStr, ulUssdStrLength, 0, aucUnpackUssdStr); if (VOS_OK != ulRet) { TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_TransUssdMsgToAsciiStr:TAF_STD_UnPack7Bit Err."); } PS_MEM_FREE(WUEPS_PID_TAF, pucUssdStr); /* 7BIT字符表非压缩编码USSD码流转换成ASCII码字符表编码的码流 示例中不涉及7BIT字符表和ASCII码字符表存在差异的字符,所以无变化 */ pucUssdTransTbl = TAF_SDC_GetCurr7BitToAsciiTableAddr(); for (i = 0; i < ulUnpackUssdStrLength; i++) { pucAsciiStr[i] = pucUssdTransTbl[aucUnpackUssdStr[i]]; } return VOS_TRUE; }