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

📄 wae_cmmn.c

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