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

📄 push.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 4 页
字号:
	}
	return 0;

} /* end ME_Push_GetPushFlag */

/*========================================================================
	ME_Push_GetXInitiatorURI
==========================================================================
Purpose: Retrieves the X-Initiator-URI from the Push Header.
Params:  vsHeaderDef
Return:  Url (BYTE*)
=========================================================================*/
void* ME_Push_GetXInitiatorURI( void* vsHeaderDef )
{
	pHEADERDEF pHeaderDef = NULL;
	pHEADERELEMENT pElement = NULL;
	BYTE* pbUrl = NULL;

	if (vsHeaderDef!=NULL)
	{
		pHeaderDef = (pHEADERDEF)vsHeaderDef;
		pElement = WSP_GetHeaderWK(1,Field_X_Wap_Initiator_URI,pHeaderDef->pHeadList);
		pbUrl = WSP_GetXInitiatorURI(pElement);
		return (void*)pbUrl;
	}
	return NULL;

} /* end ME_Push_GetXInitiatorURI */

/*========================================================================
	ME_Push_GetXContentURI
==========================================================================
Purpose: Retrieves the X-Content-URI from the Push Header.
Params:  vsHeaderDef
Return:  Url (BYTE*)
=========================================================================*/
void* ME_Push_GetXContentURI( void* vsHeaderDef )
{
	pHEADERDEF pHeaderDef = NULL;
	pHEADERELEMENT pElement = NULL;
	BYTE* pbUrl = NULL;

	if (vsHeaderDef!=NULL)
	{
		pHeaderDef = (pHEADERDEF)vsHeaderDef;
		pElement = WSP_GetHeaderWK(1,Field_X_Wap_Content_URI,pHeaderDef->pHeadList);
		pbUrl = WSP_GetXContentURI(pElement);
		return (void*)pbUrl;
	}
	return NULL;

} /* end ME_Push_GetXContentURI */


/*========================================================================
	ME_Push_GetXAppId
==========================================================================
Purpose: Retrieves the X-Application-Id from the Push Header.
Params:  vsHeaderDef
Return:  TRUE if X-WAP-Applicatin-Id was provided in the header , FALSE otherwise
=========================================================================*/
BOOL ME_Push_GetXAppId( void* vsHeaderDef, long int* iPortType)
{
/*
	urn:x-wap-application:*         0x00       ;any app
    urn:x-wap-application:push.sia  0x01       ;WAP Push SIA
    urn:x-wap-application:wml.ua    0x02       ;WML User Agent
	urn:x-wap-application:wta.ua    0x03       ;WTA User Agent
    */

	pHEADERDEF pHeaderDef = NULL;
	pHEADERELEMENT pElement = NULL;
	int iAppId;
	BYTE* pbAppId = NULL;

	pHeaderDef = (pHEADERDEF)vsHeaderDef;
	pElement = WSP_GetHeaderWK(1,Field_X_Wap_Application_Id,pHeaderDef->pHeadList);
	/* Check if X-WAP-Application-Id is provided in the message*/
	if (pElement != NULL)     
	{
		/* WSP_GetPushHeaderAppId was succesfull*/
		if (WSP_GetPushHeaderAppId (pElement, &pbAppId, &iAppId))
		{
			/* Don't support if X-WAP-Application-Id is set to an AbsolutUri, discard Push message*/
			if (pbAppId != NULL)
				return FALSE;
			else
			{
				/* check if it is a valid id */
				if (iAppId<4)
				{
					if (iAppId == 2)
						*iPortType = 1;
					else if (iAppId == 3)
						*iPortType = 2;
					else if (iAppId == 1)
						*iPortType = 1;      /*PortType does not matter since it will never be used when application push.sia*/
					else
						*iPortType = 0;		
					return TRUE;
				}
				else
				{
					*iPortType = 1;
					return TRUE; /* If an App Id that we don't support use WML UA */
				}
			}
			}
		/* WSP_GetPushHeaderAppId was not succesfull, discard Push message  */
			else
				return FALSE;
		}
	/* If X-WAP-Application-Id was not provided, set iPortType to WML UA according to the spec*/
	else
	{
		*iPortType = 1;
		return TRUE;
	}
}

/*========================================================================
	ME_Push_GetContentType
==========================================================================
Purpose: Retrieves the content type from the Push Header.
Params:  vsHeaderDef
Return:  UINT8 (1=SI, 2=SL, 3=CO, 4=SIA)
=========================================================================*/
UINT8 ME_Push_GetContentType( void* vsHeaderDef )
{
	pHEADERDEF pHeaderDef = NULL;
	UINT8 iType;
	BOOL fError = FALSE;
	pHEADERELEMENT pElement = NULL;
	WSPPARAMETERS* pParameters = NULL;

	if (vsHeaderDef!=NULL)
	{
		pHeaderDef=(pHEADERDEF)vsHeaderDef;

		pElement=WSP_GetHeaderWK(1,Field_Content_Type,pHeaderDef->pHeadList);
		iType=(UINT8)WSP_GetContentTypeByte(pElement,&fError,&pParameters);
		if (fError)
		{
			return 0;
		}
		switch(iType)
		{
		case 46:
			return SI;
		case 48:
			return SL;
		case 50:
			return CO;
		case 52:
			return SIA;
		}
		return 0;
	}
	if (pParameters!=NULL)
	{
		WSP_DeleteParameters(&pParameters);
	}
	return 0;

} /* end ME_Push_GetContentType */

/*========================================================================
	ME_Push_SecurityOk
==========================================================================
Purpose: Check if security levels match.
Params:  Push Flag, Seurity Level
Return:  TRUE if Ok, FALSE otherwise
=========================================================================*/
BOOL ME_Push_SecurityOk(UINT8 iPushFlag)
{
	UINT8   uiErrorCode = 0;
	UINT8   iSecLevel = 0;
	DB_ref  myDB_Root;

	  myDB_Root = getRef(DB_root, "globl", &uiErrorCode);
	  if( uiErrorCode == DB_err_success ){
		iSecLevel = (UINT8)getInt( myDB_Root, PUSH_SECURITY_LEVEL, FALSE, &uiErrorCode );
		if( uiErrorCode == DB_err_success ){
			if (iSecLevel == 0)
				return TRUE;
			if (iSecLevel == 1)
			{
				if (3 & iPushFlag)
					return TRUE;
			}
			if (iSecLevel == 2)
				return FALSE;
		}
	  }
	return TRUE;

} /* end ME_Push_SecurityOk */


/*========================================================================
	ME_Push_BuildCO
==========================================================================
Purpose: Call parsing functions and build content for an CO.
Params:  void* pPushBody, UINT32 iBodyDataLen, iType
Return:  pELEMENTTYPE (CO parser structure type)
=========================================================================*/
void* ME_Push_BuildCO(void* pBodyData, UINT32 iBodyDataLen, void* vsHeaderDef,
					  UINT8 iViewID)
{
	BYTE* pbBody = NULL;
	BYTE* pbEnd = NULL;
	pHEADERDEF pHeaderDef = NULL;
	UINT8 iType;
	BOOL fError = FALSE;
	pHEADERELEMENT pElement = NULL;
	WSPPARAMETERS* pParameters = NULL;
	pDECSTR pStruct = NULL;
	INT16 iCharset = 0;
	UINT8 iLevel = 0;

#ifdef WAE_DEBUG
	URL_DEBUG_PRINT("ME_Push_BuildCO");
#endif

	pHeaderDef=(pHEADERDEF)vsHeaderDef;

	pElement=WSP_GetHeaderWK(1,Field_Content_Type,pHeaderDef->pHeadList);
	iType=(UINT8)WSP_GetContentTypeByte(pElement,&fError,&pParameters);
	if (fError)
	{
		return NULL;
	}
	if (pParameters != NULL)
	{
		iCharset = pParameters->iCharset;
		iLevel = pParameters->iLevel;
		WSP_DeleteParameters(&pParameters);
	}

	pbBody=(BYTE*)pBodyData;
	pbEnd=pbBody+iBodyDataLen;

	/* Parse the CO */
	pStruct = Co_BuildStructure(pbBody,pbEnd,iCharset,iLevel,iViewID);
	return (void*)pStruct;
} /* end of ME_Push_BuildCO */

/*========================================================================
	ME_Push_GetAddress
==========================================================================
Purpose: Get addresslist from SIA content
Params:  void*
Return:  UINT8, 1=ok, 0=not ok
=========================================================================*/
void* ME_Push_GetAddress( void* pBodyHandle, UINT32 iBodyLen
						 /*void* pvAddressList*/  )
{
	BYTE* pbTemp = (BYTE*)pBodyHandle;
	BYTE* pbEnd = NULL;
	UINT8 iAppIdListLen=0;
	UINT8 iContactListLen=0;
	UINT32 uiPort = 0;
	UINT8 iAddressLength=0;
	ADDRESS* pAddressList = NULL;

	pbEnd = pbTemp + iBodyLen;
	iAppIdListLen = (UINT8)pbTemp[1];
	iContactListLen = (UINT8)pbTemp[2+iAppIdListLen];
	if (iContactListLen>0)
	{
		pbTemp = pbTemp+3+iAppIdListLen; 
		if (pbTemp < pbEnd)
		{
			/*pAddressList = (ADDRESS*)pvAddressList;*/
			iAddressLength=iContactListLen; 
			if (ParseRedirectAddress( (void*)pbTemp,iAddressLength,
				(void*)&pAddressList ))  
				if( pAddressList != NULL ){
					return (void*)pAddressList;
				}
		}
	}
	 
	return NULL; /* failure */
} /* end of ME_Push_GetAddress */

/*========================================================================
	ME_Push_GetAppId
==========================================================================
Purpose: Get App Id from SIA content
Params:  void*
Return:  UINT8
=========================================================================*/
UINT8 ME_Push_GetAppId( void* pBodyHandle, UINT32 iBodyLen )
{
	/*
	urn:x-wap-application:*         0x00       ;any app
    urn:x-wap-application:push.sia  0x01       ;WAP Push SIA
    urn:x-wap-application:wml.ua    0x02       ;WML User Agent
	urn:x-wap-application:wta.ua    0x03       ;WTA User Agent
    */
	
	BYTE* pbTemp = (BYTE*)pBodyHandle;
	UINT8 iAppIdListLen=0;
	UINT8 iAppId;

    iBodyLen = iBodyLen;
	iAppIdListLen = (UINT8)pbTemp[1];
	if (iAppIdListLen>0)
	{
		iAppId = (UINT8)pbTemp[2];
		/* check if it is a valid id */
        if (iAppId<4)
		{
			return iAppId;
		}
		else
		{
			return 2; /* default - WML App */
		}
	}
	else
	{
		return 2; /* default - WML App */
	}
} /* end of ME_Push_GetAppId */

/*========================================================================
	ME_Push_COCompareAuth
==========================================================================
Purpose: Compare Authority parts of two urls.
Params:  vsUrl1, vsUrl2
Return:  TRUE if equal, FALSE if not
=========================================================================*/
BOOL ME_Push_COCompareAuth( void* vsUrl1, void* vsUrl2 )
{
	BYTE* pbUrl1 = NULL;
	BYTE* pbUrl2 = NULL;
	
	pbUrl1=(BYTE*)vsUrl1;
	pbUrl2=(BYTE*)vsUrl2;

	return b_EqualURL(pbUrl1,pbUrl2,AUTHORITY_COMP);
}

/*========================================================================
	ME_Push_Remove_SignalList
==========================================================================
Purpose: Removes the entire Signal List and deallocates struct data
Params:  pvPushList
Return:  -
=========================================================================*/
void ME_Push_Remove_SignalList( void* pvSignalList )
{

SIGNALSTRUCT*		pSignalStruct = NULL;
void*				pvListElement = NULL;
void*				pvElementContent = NULL;

#ifdef WAE_DEBUG
	URL_DEBUG_PRINT("Start Push_Remove_SignalList");
#endif
	
	if( pvSignalList != NULL )
	{
		pvListElement = SDL_GetNextListElement( pvSignalList, NULL );
		while ( pvListElement != NULL )
		{
			pvElementContent = SDL_GetListElementContent( pvListElement );
			if( pvElementContent != NULL )
			{
				pSignalStruct = (SIGNALSTRUCT*)pvElementContent;
				SDL_DeleteListElement (pvSignalList, pvListElement); 
				DEALLOC (&(pSignalStruct->pPushBody)); 
				DEALLOC (&(pSignalStruct->pPushHeader)); 
				DEALLOC (&pSignalStruct);  
			}
			pvListElement = SDL_GetNextListElement(pvSignalList,NULL );
		}
		SDL_DeleteList(&pvSignalList); 
	}

} /* end of ME_Push_Remove_SignalList */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -