📄 wae_cmmn.c
字号:
/*
* Copyright (C) Ericsson Mobile Communications AB, 2000.
* Licensed to AU-System AB.
* All rights reserved.
*
* This software is covered by the license agreement between
* the end user and AU-System AB, and may be used and copied
* only in accordance with the terms of the said agreement.
*
* Neither Ericsson Mobile Communications AB nor AU-System AB
* assumes any responsibility or liability for any errors or inaccuracies in
* this software, or any consequential, incidental or indirect damage arising
* out of the use of the Generic WAP Client software.
*/
#ifndef WAE_CMMN_C
#define WAE_CMMN_C
#include "waedef.h"
#include "wae_cmmn.h"
#include "wmldef.h"
#include "aapiclnt.h"
#include "aapimmi.h"
#include "url.h"
/* ----------------------------------------------
* LISTHANDLING STRUCTS
* ----------------------------------------------
*/
/* Each element in the list: */
typedef struct tLISTELEMENT
{
int iIdentifier; /* Arbitrary identifier - optional */
int iPrio; /* Priority info */
void* pTheElement; /* Generic data */
struct tLISTELEMENT *pNext; /* Doubly linked, more efficient. */
struct tLISTELEMENT *pPrev;
} LISTELEMENT, *pLISTELEMENT;
/* The list header */
typedef struct
{
int iMax; /* 0 = no upper limit */
int iTotal; /* Number of elements currently in list */
LISTELEMENT head; /* A list element used as header node. */
} LISTHEADER, *pLISTHEADER;
typedef struct
{
UINT8 iViewID;
BOOL iActive;
} UAREQSTATUS,*pUAREQSTATUS;
/* ---------------------------------------------------------------------------------------------------------
PID mgmt
-------------------------------------------------------------------------------------------------------- */
/*
* Convert a SDL PId to an integer.
*/
UINT32
PId2Int (SDL_PId pid)
{
#ifdef XSCT_CMICRO
return (UINT32)pid;
#else
return (UINT32)(pid.LocalPId);
#endif
}
/*
* Convert an integer to a SDL PId.
*/
SDL_PId
Int2PId (UINT32 n)
{
#ifdef XSCT_CMICRO
return (SDL_PId)n;
#else
SDL_PId pid;
pid.LocalPId = (xLocalPIdNode)n;
pid.GlobalNodeNr = xGlobalNodeNumber ();
return pid;
#endif
}
/* add a new pid to a list , NOTE: the pid must be converted first */
int UAAddNewPid( void* pList, int iId, unsigned long int uiPid , void* pTheUA)
{
UAPIDSTRUCT* pPidStruct = NULL;
if( pList != NULL ){
pPidStruct = NEWSTRUCT(UAPIDSTRUCT);
if( pPidStruct != NULL ){
pPidStruct->uiPid = uiPid;
pPidStruct->pData = pTheUA;
return SDL_AddListElement( pList, iId, 0, (void*)pPidStruct );
}
}
return 0;
} /* end of pidList_AddPid */
void* GetUAInList( void* pList, unsigned long int uiPid)
{
void* pvListElement = NULL;
void* pvElementContent = NULL;
UAPIDSTRUCT* pPidStruct = NULL;
if( pList == NULL )
return NULL;
pvListElement = SDL_GetNextListElement( pList, NULL );
while( pvListElement != NULL ){
pvElementContent = SDL_GetListElementContent( pvListElement );
if( pvElementContent != NULL ){
pPidStruct = (UAPIDSTRUCT*)pvElementContent;
if( pPidStruct && pPidStruct->uiPid == uiPid )
{
return pPidStruct->pData;
}
}
pvListElement = SDL_GetNextListElement( pList, pvListElement );
}
return NULL;
} /* */
unsigned long int UAGetPid( void* pList, int iId, int iRemove )
{
void* pvListElement = NULL;
void* pvElementContent = NULL;
unsigned long int uiPID = 0;
UAPIDSTRUCT* pPidStruct = NULL;
if( pList != NULL ){
pvListElement = SDL_SearchListElement( pList, iId, NULL );
if( pvListElement != NULL ){
pvElementContent = SDL_GetListElementContent( pvListElement );
if( pvElementContent != NULL ){
pPidStruct = (UAPIDSTRUCT*)pvElementContent;
if( pPidStruct != NULL ){
if( iRemove ){
uiPID = pPidStruct->uiPid;
DEALLOC( &pPidStruct );
SDL_DeleteListElement( pList, pvListElement );
return uiPID;
}
else
return pPidStruct->uiPid;
}
}
}
}
return 0;
} /* end of pidList_GetPid */
int UARemovePid( void* pList, unsigned long int uiPid )
{
void* pvListElement = NULL;
void* pvElementContent = NULL;
UAPIDSTRUCT* pPidStruct = NULL;
if( pList != NULL ){
pvListElement = SDL_GetNextListElement( pList, NULL );
while( pvListElement != NULL ){
pvElementContent = SDL_GetListElementContent( pvListElement );
if( pvElementContent != NULL ){
pPidStruct = (UAPIDSTRUCT*)pvElementContent;
if( pPidStruct != NULL && pPidStruct->uiPid == uiPid ){
DEALLOC( &pPidStruct );
SDL_DeleteListElement( pList, pvListElement );
return 1;
}
}
pvListElement = SDL_GetNextListElement( pList, pvListElement );
}
}
return 0;
} /* end of pidList_RemovePid */
/*--------------------------------------------------------------------------------------------------------
Variable handling (setting etc)
--------------------------------------------------------------------------------------------------------*/
void SDL_DeleteParameters(void** pppInParameters)
{
variableType** ppTempParameters;
ppTempParameters = (variableType**)*pppInParameters;
if (ppTempParameters)
{
while (*ppTempParameters)
{
DEALLOC(& (*ppTempParameters)->value );
DEALLOC(& (*ppTempParameters)->name );
DEALLOC( ppTempParameters );
ppTempParameters++;
}
DEALLOC(pppInParameters);
}
}
void SDL_StoreParameters(void* pUser, void** pppInParameters)
{
variableType** ppTempParameters;
BOOL fWTA = FALSE;
if ( ((UA*)pUser)->iUserAgentMode == WTA_USER_AGENT)
fWTA = TRUE;
ppTempParameters = (variableType**)*pppInParameters;
if (ppTempParameters)
{
while (*ppTempParameters)
{
WML_SetVariable ((UA*)pUser, (*ppTempParameters)->name, (*ppTempParameters)->value, fWTA );
DEALLOC(& (*ppTempParameters)->value );
DEALLOC(& (*ppTempParameters)->name );
DEALLOC( ppTempParameters );
ppTempParameters++;
}
DEALLOC(pppInParameters);
}
}
void SDL_CallFunction( int iTID, void** pRequestStruct )
{
URLREQSTRUCT* pUrlReq = NULL;
BYTE* pbQuery = NULL;
BYTE* pbHost = NULL;
BYTE* pbPath = NULL;
if( *pRequestStruct != NULL )
{
pUrlReq = (URLREQSTRUCT*)(*pRequestStruct);
if( pUrlReq != NULL && pUrlReq->pbURL != NULL )
{
if (pUrlReq->pbURL && b_GetQuery(pUrlReq->pbURL, & pbQuery) && b_GetPath(pUrlReq->pbURL, & pbPath) && b_GetHost(pUrlReq->pbURL, & pbHost) )
CLNTa_callFunction( (UINT8)iTID, (CHAR*)pbHost, (CHAR*)pbPath+1, (CHAR*)pbQuery );
else
SDL_OutputError(NULL, ERR_WAE_UA_URL_INVALID, ERRTYPE_INFORMATION );
DEALLOC(&pbPath);
DEALLOC(&pbQuery);
DEALLOC(&pbHost);
}
Delete_URLREQSTRUCT( &pUrlReq );
}
}
/*---------------------------------------------------------------------------------
When using proxy/server authenication - copy username and password into one
string ("XXX\0XXX\0")
------------------------------------------------------------------------------------*/
int CopyCredentialParameters (void* pUserName, void* pPassWord, void** ppCredentials)
{
int iLength = 0;
int iNameLength = 0;
int iPassLength = 0;
BYTE *p;
DEALLOC (ppCredentials);
if (pUserName==NULL && pPassWord==NULL)
return 0;
iNameLength = pUserName ? B_STRINGLENGTH (pUserName) : 0;
iPassLength = pPassWord ? B_STRINGLENGTH (pPassWord) : 0;
iLength = iNameLength + iPassLength + 2;
*ppCredentials = NEWARRAY (BYTE, iLength);
if (*ppCredentials == NULL) {
return 0;
}
p = (BYTE*) *ppCredentials;
if (pUserName != NULL) {
B_COPYSTRING ( (CHAR*)p, pUserName );
#ifdef WAE_DEBUG
PrintChar ("Username:");
PrintChar (p);
#endif
p += iNameLength;
}
*p++ = '\0'; /*if username is null */
if (pPassWord != NULL) {
B_COPYSTRING ( (CHAR*)p, pPassWord );
#ifdef WAE_DEBUG
PrintChar ("Password:");
PrintChar (p);
#endif
p += iPassLength;
}
*p = '\0'; /*if password is null */
return iLength;
}
/*--------------------------------------------------------------------------------------------------------------------------------
TID MANAGEMENT
--------------------------------------------------------------------------------------------------------------------------------*/
#define EMPTY 0x0
#define INACTIVE 0x1
#define ACTIVE 0x2
#define MAX_TID 250
/* ---------------------------------------------
* Returns a new TID from the TID pool. Return
* value 0 indicates an error and is NOT a valid TID.
* ----------------------------------------------*/
int SDL_CreateNewGlobalTID(void* pWAEInObj, int iViewID)
{
int i;
BYTE *tbl;
WAEMAINOBJECT *pObj = (WAEMAINOBJECT *)pWAEInObj;
iViewID = iViewID; /* To get rid of a warning. */
if (pObj == NULL)
return 0;
tbl = pObj->pTID_Table;
if (tbl == NULL)
return 0;
/* To maximize the time between recycling a TID, we start searching
* for an empty slot at the point where we left off last time. */
for (i = (pObj->lastTID == MAX_TID) ? 1 : pObj->lastTID + 1;
i != pObj->lastTID; (i == MAX_TID) ? i = 1 : i++) {
int idx = (i >> 2);
int n = (i & 0x3) << 1;
if (((tbl[idx] >> n) & 0x3) == EMPTY) {
tbl[idx] |= (ACTIVE << n);
pObj->lastTID = (UINT8)i;
return i;
}
}
return 0;
}
/* ---------------------------------------------
* Return the next active TID strictly larger
* than iPrevTID. If iPrevTID is 0, the smallest
* active TID is returned.
* If there is no active TID larger than iPrevTID,
* this routine returns 0.
* ----------------------------------------------*/
int SDL_GetNextActiveTID (void* pWAEInObj, int iPrevTID)
{
int i;
BYTE *tbl;
if (pWAEInObj == NULL)
return 0;
tbl = ((WAEMAINOBJECT*)pWAEInObj)->pTID_Table;
if (tbl == NULL)
return 0;
for (i = (iPrevTID == 0 ? 1 : iPrevTID + 1); i <= MAX_TID; i++) {
int idx = (i >> 2);
int n = (i & 0x3) << 1;
if (((tbl[idx] >> n) & 0x3) == ACTIVE) {
return i;
}
}
return 0;
}
/* ---------------------------------------------
* Deactivate a TID in the TID pool - i.e., the
* corresponding request is no longer active.
* If the TID is not currently active, this is a no-op.
* ----------------------------------------------*/
void SDL_DeactivateGlobalTID(void* pWAEInObj, int iTID)
{
int idx = (iTID >> 2);
int n = (iTID & 0x3) << 1;
BYTE *tbl;
if (pWAEInObj == NULL)
return;
tbl = ((WAEMAINOBJECT*)pWAEInObj)->pTID_Table;
if (tbl == NULL)
return;
if (((tbl[idx] >> n) & 0x3) != ACTIVE) {
return;
}
tbl[idx] &= ~(0x3 << n);
tbl[idx] |= (INACTIVE << n);
}
/* ---------------------------------------------
* Check a TID in the TID pool - is the
* corresponding request active. Returns 0 (FALSE) if not active.
* ----------------------------------------------*/
int SDL_CheckGlobalTIDStatus(void* pWAEInObj, int iTID)
{
int idx = (iTID >> 2);
int n = (iTID & 0x3) << 1;
BYTE *tbl;
if (pWAEInObj == NULL)
return 0;
tbl = ((WAEMAINOBJECT*)pWAEInObj)->pTID_Table;
if (tbl == NULL)
return 0;
return ((tbl[idx] >> n) & 0x3) == ACTIVE;
}
/* ---------------------------------------------
* Releases a TID from the TID pool.
* ----------------------------------------------*/
void SDL_ReleaseGlobalTID(void* pWAEInObj, int iTID)
{
int idx = (iTID >> 2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -