📄 wbxmldec.c
字号:
return;
}
/* Default charset is UTF-8 */
pDecStr->iCharset=IANA_CHARSET_UTF8;
}
BOOL WBXML_DecodeProlog (pWBXMLDECODESTR pDecStr)
{
UINT32 iPublicIDRef=0;
UINT8 iPublicID=0;
UINT32 iIndex=0;
UINT32 iStrTabLen=0;
BOOL fPublicIDisString=FALSE;
pSTRINGTABSTR pStrTemp=NULL;
pSTRINGTABSTR pStrPrev=NULL;
BYTE *pbStrTabEnd=NULL;
BYTE *pbStrTabStart=NULL;
WCHAR *pchPublicID=NULL;
/* Version number */
if ( pDecStr->pbCurByte < pDecStr->pbEnd )
{
/* Check version number */
if (! ((*pDecStr->pbCurByte==WBXML_VERSION_NUMBER_1_1) ||
(*pDecStr->pbCurByte==WBXML_VERSION_NUMBER_1_2) ||
(*pDecStr->pbCurByte==WBXML_VERSION_NUMBER_1_3)))
{
/* Wrong WBXML version number. Set warning. */
pDecStr->iDecodeResult|=WBXML_Warning_Version;
}
pDecStr->pbCurByte++;
}
/* Parse public ID */
if ( pDecStr->pbCurByte < pDecStr->pbEnd )
{
if (*pDecStr->pbCurByte==0)
{
pDecStr->pbCurByte++;
/* Encoded as string. Get location. Get the
string later, when the string table is parsed. */
iPublicIDRef=WBXML_GetMBUINT32 (pDecStr);
fPublicIDisString=TRUE;
}
else
{
/* Get PublicID as integer. */
iPublicID=(UINT8)WBXML_GetMBUINT32 (pDecStr);
}
}
/* Charset */
if ( pDecStr->pbCurByte < pDecStr->pbEnd )
{
UINT32 iMBUINT=0;
INT16 iCharset=IANA_CHARSET_INVALID;
/* Get Charset. */
iMBUINT=WBXML_GetMBUINT32 (pDecStr);
/* Charset value of 0 inplies IANA_CHARSET_INVALID */
if (iMBUINT!=0)
{
iCharset=(INT16)(iMBUINT);
}
/* Set charset */
WBXML_SetDecodeCharset (pDecStr, iCharset);
}
/* String Table */
if ( pDecStr->pbCurByte < pDecStr->pbEnd )
{
/* Get string table length. */
iStrTabLen=WBXML_GetMBUINT32 (pDecStr);
/* Set min (pDecStr->pbEnd,pDecStr->pbCurByte+iStrTabLen) */
pbStrTabEnd=pDecStr->pbCurByte+iStrTabLen;
pbStrTabStart=pDecStr->pbCurByte;
if ( pbStrTabEnd > pDecStr->pbEnd )
{
/* String table longer than instream */
pDecStr->iDecodeResult|=WBXML_Error_DataStream;
return FALSE;
}
}
while ( pDecStr->pbCurByte < pbStrTabEnd )
{
/* Parse the instream and copy the string
table into the memory. */
/* Create new String table element */
pStrTemp=NEWSTRUCT(STRINGTABSTR);
if (pStrTemp!=NULL)
{
pStrTemp->pwchString=WBXML_GetSTR_I (pDecStr);
pStrTemp->iOffset=iIndex;
if (pStrTemp->pwchString==NULL)
{
/* Quit */
pDecStr->pbCurByte=pbStrTabEnd;
}
/* Add to the end of the list. */
pStrTemp->pNext=NULL;
if (pDecStr->pStrTab==NULL)
{
pDecStr->pStrTab=pStrTemp;
}
else
{
pStrPrev->pNext=pStrTemp;
}
pStrPrev=pStrTemp;
}
else
{
/* Could not create element. Fatal error. */
pDecStr->iDecodeResult|=WBXML_Error_OutOfMemory;
/* Delete string table */
WBXML_DelStrTab (pDecStr);
return FALSE;
}
/* Update index */
iIndex=pDecStr->pbCurByte-pbStrTabStart;
}
/* Check public ID */
if (fPublicIDisString)
{
/* Get publicID as string */
pchPublicID=WBXML_GetStrTabVal(pDecStr,iPublicIDRef);
if (pDecStr->DTD_CheckPublicID (pDecStr,pchPublicID,&iPublicID))
{
/* Store iPublicID in DTD */
pDecStr->iVersion=iPublicID;
}
else
{
pDecStr->iDecodeResult|=WBXML_Error_PublicID;
/* Delete string table */
WBXML_DelStrTab (pDecStr);
return FALSE;
}
}
else
{
if (pDecStr->DTD_CheckPublicID (pDecStr,NULL,&iPublicID))
{
/* Store iPublicID in DTD */
pDecStr->iVersion=iPublicID;
}
else
{
/* Not OK */
pDecStr->iDecodeResult|=WBXML_Error_PublicID;
/* Delete string table */
WBXML_DelStrTab (pDecStr);
return FALSE;
}
}
/* OK! */
return TRUE;
}
/*========================================================================
WBXML_CheckPublicID
==========================================================================
Examines the PublicID and returns the corresponding WSP-content type.
Input: pWBXMLDECODESTR (not NULL), WCHAR*, and UINT8
Output: TRUE if valid ID, FALSE otherwise.
==========================================================================*/
BOOL WBXML_CheckPublicID (pDECSTR pDecStr, WCHAR* pwchPId, UINT8* piPId)
{
/* ASSERT: pDecStr!=NULL
*/
pDecStr=pDecStr;
/* Use string */
if (pwchPId!=NULL)
{
UINT32 iLength=0;
const WCHAR pwchPublic_ID_base[]={'-','/','/','W','A','P','F','O','R','U','M', '/','/','D','T','D',' ',0};
const WCHAR pwchPublic_ID_wml10[]={'W','M','L',' ','1','.','0','/','/','E','N',0};
const WCHAR pwchPublic_ID_wta10[]={'W','T','A',' ','1','.','0','/','/','E','N',0};
const WCHAR pwchPublic_ID_wml11[]={'W','M','L',' ','1','.','1','/','/','E','N',0};
const WCHAR pwchPublic_ID_si10[]={'S','I',' ','1','.','0','/','/','E','N',0};
const WCHAR pwchPublic_ID_sl10[]={'S','L',' ','1','.','0','/','/','E','N',0};
const WCHAR pwchPublic_ID_co10[]={'C','O',' ','1','.','0','/','/','E','N',0};
const WCHAR pwchPublic_ID_ch11[]={'C','H','A','N','N','E','L',' ','1','.','1','/','/','E','N',0};
const WCHAR pwchPublic_ID_wml12[]={'W','M','L',' ','1','.','2','/','/','E','N',0};
const WCHAR pwchPublic_ID_wml13[]={'W','M','L',' ','1','.','3','/','/','E','N',0};
const WCHAR pwchPublic_ID_prov10[]={'P','R','O','V',' ','1','.','0','/','/','E','N',0};
const WCHAR pwchPublic_ID_wtawml12[]={'W','T','A','-','W','M','L',' ','1','.','2','/','/','E','N',0};
const WCHAR pwchPublic_ID_ch12[]={'C','H','A','N','N','E','L',' ','1','.','2','/','/','E','N',0};
WCHAR* pwchTemp=NULL;
/* Get length of pwchPId string */
iLength=(UINT32) (w_strlen(pwchPId));
/* Length must be greater than 18 */
if ( iLength > 18 )
{
/* Check base */
if (CompareWideStringNoCase (pwchPId,(WCHAR*)pwchPublic_ID_base,17))
{
pwchTemp=pwchPId+17;
/* Base OK - check other part */
if (CompareWideStringNoCase (pwchTemp,(WCHAR*)pwchPublic_ID_wml10,iLength-17))
{
/* wml 1.0 --> unknown (not supported) */
*piPId=0;
return FALSE;
}
else if (CompareWideStringNoCase (pwchTemp,(WCHAR*)pwchPublic_ID_wta10,iLength-17))
{
/* wta event --> unknown (not supported) */
*piPId=0;
return FALSE;
}
else if (CompareWideStringNoCase (pwchTemp,(WCHAR*)pwchPublic_ID_wml11,iLength-17))
{
/* wml 1.1 */
*piPId=0x14;
return TRUE;
}
else if (CompareWideStringNoCase (pwchTemp,(WCHAR*)pwchPublic_ID_si10,iLength-17))
{
/* si 1.0 */
*piPId=0x2E;
return TRUE;
}
else if (CompareWideStringNoCase (pwchTemp,(WCHAR*)pwchPublic_ID_sl10,iLength-17))
{
/* sl 1.0 */
*piPId=0x30;
return TRUE;
}
else if (CompareWideStringNoCase (pwchTemp,(WCHAR*)pwchPublic_ID_co10,iLength-17))
{
/* co 1.0 */
*piPId=0x32;
return TRUE;
}
else if (CompareWideStringNoCase (pwchTemp,(WCHAR*)pwchPublic_ID_ch11,iLength-17))
{
#ifdef CONFIG_WTA
/* channel 1.1 */
*piPId=0x16;
return TRUE;
#else
/* channel 1.1 --> not supported */
*piPId=0x0;
return FALSE;
#endif
}
else if (CompareWideStringNoCase (pwchTemp,(WCHAR*)pwchPublic_ID_wml12,iLength-17))
{
/* wml 1.2 */
*piPId=0x14;
return TRUE;
}
else if (CompareWideStringNoCase (pwchTemp,(WCHAR*)pwchPublic_ID_wml13,iLength-17))
{
/* wml 1.3 */
*piPId=0x14;
return TRUE;
}
else if (CompareWideStringNoCase (pwchTemp,(WCHAR*)pwchPublic_ID_prov10,iLength-17))
{
/* provisioning --> not supported */
*piPId=0;
return FALSE;
}
else if (CompareWideStringNoCase (pwchTemp,(WCHAR*)pwchPublic_ID_wtawml12,iLength-17))
{
#ifdef CONFIG_WTA
/* wta-wml 1.2 */
*piPId=APPLICATION_X_WAP_WTA_WMLC;
return TRUE;
#else
/* wta-wml 1.2 --> not supported */
*piPId=0x0;
return FALSE;
#endif
}
else if (CompareWideStringNoCase (pwchTemp,(WCHAR*)pwchPublic_ID_ch12,iLength-17))
{
#ifdef CONFIG_WTA
/* channel 1.2 */
*piPId=0x16;
return TRUE;
#else
/* channel 1.2 --> not supported */
*piPId=0x0;
return FALSE;
#endif
}
}
}
}
/* Use integer */
else
{
switch (*piPId)
{
/* unknown --> use wml 1.2 */
/* case 0x01:
Unknown
*piPId=0;
return TRUE;
*/
case 0x02:
/* wml 1.0 --> unknown (not supported) */
*piPId=0x0;
return FALSE;
case 0x03:
/* wta event --> unknown (not supported) */
*piPId=0;
return FALSE;
case 0x04:
/* wml 1.1 */
*piPId=0x14;
return TRUE;
case 0x05:
/* si 1.0 */
*piPId=0x2E;
return TRUE;
case 0x06:
/* sl 1.0 */
*piPId=0x30;
return TRUE;
case 0x07:
/* co 1.0 */
*piPId=0x32;
return TRUE;
case 0x08:
/* channel 1.1 */
*piPId=0x16;
return TRUE;
case 0x09:
/* wml 1.2 */
*piPId=0x14;
return TRUE;
case 0x0A:
/* wml 1.3 */
*piPId=0x14;
return TRUE;
case 0x0B:
/* provisioning */
*piPId=0x36;
return TRUE;
case 0x0C:
#ifdef CONFIG_WTA
/* wta-wml 1.2 */
*piPId=APPLICATION_X_WAP_WTA_WMLC;
return TRUE;
#else
/* wta-wml 1.2 --> not supported */
*piPId=0x0;
return FALSE;
#endif
case 0x0D:
#ifdef CONFIG_WTA
/* channel 1.2 */
*piPId=0x16;
return TRUE;
#else
/* channel 1.2 --> not supported */
*piPId=0x0;
return FALSE;
#endif
}
}
/* Other --> assume wml */
*piPId=0x14;
return FALSE;
}
BOOL WBXML_GetContentType (BYTE* pbData, BYTE* pbEnd, BYTE* pbContentType)
{
pWBXMLDECODESTR pDecStr=NULL;
BOOL fResult=FALSE;
if (pbData<pbEnd)
{
/* Create tWBXMLDECODESTR and init the attributes */
pDecStr=WBXML_CreateWBXMLDecStr();
if (pDecStr!=NULL)
{
/* Set the function pointers */
pDecStr->DTD_CreateElement=NULL;
pDecStr->DTD_DeleteElement=NULL;
pDecStr->DTD_ValidContent=NULL;
pDecStr->DTD_GetContent=NULL;
pDecStr->DTD_AppSpecParseMod=NULL;
pDecStr->DTD_StoreAttributeValue=NULL;
pDecStr->DTD_GetAttributeValue=NULL;
pDecStr->DTD_LiteralAttributeToToken=NULL;
pDecStr->DTD_LiteralTagToToken=NULL;
pDecStr->DTD_CheckPublicID=WBXML_CheckPublicID;
/* Store data in the decode struct */
pDecStr->bContentType=0; /* Unknown */
pDecStr->iCharset=0;
pDecStr->iContentLevel=0;
pDecStr->pbCurByte=pbData;
pDecStr->pbEnd=pbEnd;
pDecStr->iDecodeResult=0;
pDecStr->pAppSpec=NULL;
/* Parse prolog */
fResult = WBXML_DecodeProlog(pDecStr);
*pbContentType=(BYTE)pDecStr->iVersion;
/* Delete decode struct */
WBXML_DeleteWBXMLDecStr(&pDecStr);
}
}
return fResult;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -