⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wbxmldec.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
		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 + -