📄 push.c
字号:
}
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 + -