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

📄 wmlif.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	WML_UpdateSelect
==========================================================================*/

/* 	Updates the variables in a specified SELECT. */
BOOL WML_UpdateSelect (pELEMENTTYPE pSelect, pUA pUser)
{
	pELEMENTTYPE pContent=NULL;
	pNUMBERSTRUCT pSelected=NULL;
	pNUMBERSTRUCT pTemp=NULL;
	BOOL fError=FALSE;
	UINT16 iIndex=0;

	if (pUser!=NULL) 
	{
		if (pSelect!=NULL) 
		{
			if (pSelect->iType==Type_SELECT) 
			{
				pContent=WML_GetContent(pSelect);

				if (pContent!=NULL)
				{
					if ((pContent->iType==Type_OPTGROUP)||
							(pContent->iType==Type_OPTION))
					{
						pSelected=WML_GetSelectedOptions (pContent,&pTemp,&fError,&iIndex);
						
						if (!fError)
						{
							/* Set variables */
							WML_SetSelectVariables(pUser, pSelect, pSelected);

							WML_DeleteNUMBERSTRUCTList(pSelected);

							return TRUE;
						}
						else
						{
							WML_DeleteNUMBERSTRUCTList(pSelected);
						}
					}
				}
			}
		}
	}
	return FALSE;
}

/* Help function for WML_UpdateAllSelect */
BOOL WML_UpdateOneLevelSelect (pELEMENTTYPE pContent, pUA pUser)
{
	BOOL fResult=TRUE;

	/* Find all select elements */
	while ((pContent!=NULL)&&(fResult))
	{
		if (pContent->iType==Type_SELECT)
		{
			/* Update select */
			if (!WML_UpdateSelect(pContent,pUser))
			{
				/* Error */
				return FALSE;
			}
		}

		/* Go down one level */
		else if ((pContent->iType==Type_FIELDSET)||(pContent->iType==Type_P))
		{
			fResult=WML_UpdateOneLevelSelect (WML_GetContent(pContent), pUser);
		}

		/* Get next element on level */
		pContent=pContent->pNextElement;
	}

	return fResult;
}

/*========================================================================
	WML_UpdateAllSelect
==========================================================================*/
BOOL WML_UpdateAllSelect (pELEMENTTYPE pCard, pUA pUser)
{
	BOOL fResult=FALSE;
	pELEMENTTYPE pContent=NULL;

	if (pCard!=NULL)
	{
		/* Check if card */
		if (pCard->iType==Type_CARD)
		{
			/* Get Card level content */
			pContent=WML_GetContent(pCard);

			/* Update all select on card level and below */
			fResult=WML_UpdateOneLevelSelect (pContent, pUser);
		}
	}

	return fResult;
}

/*========================================================================
	WML_PreSelectOptions
==========================================================================*/
/* Sets the 'SELECTED'-field in all the option elements
   indicated in the NUMBERSTRUCT to TRUE, all other to
   FALSE. */   
void WML_PreSelectOptions(pELEMENTTYPE pElement, pNUMBERSTRUCT *ppDefaultOption,
					  UINT16 *piFindNbr, UINT16 *piThisNbr)
{
	pOPTIONELEMENT pOption=NULL;
	pELEMENTTYPE pContent=NULL;

	if (*piThisNbr==0)
	{
		if (ppDefaultOption!=NULL)
		{
			/* Only if first time */
			if (*ppDefaultOption!=NULL)
			{
				*piFindNbr=(*ppDefaultOption)->iIndex;
				*ppDefaultOption=(*ppDefaultOption)->pNext;
				(*piThisNbr)++;
			}
		}
	}

	while (pElement!=NULL)
	{
		if (pElement->iType==Type_OPTION)
		{
			pOption=(OPTIONELEMENT*)(pElement);
			if ((*piFindNbr==*piThisNbr)&&(*piFindNbr!=0))
			{
				/* Select this option */
				pOption->fSelected=TRUE;

				if (ppDefaultOption!=NULL)
				{
					if (*ppDefaultOption!=NULL)
					{
						*piFindNbr=(*ppDefaultOption)->iIndex;
						*ppDefaultOption=(*ppDefaultOption)->pNext;
					}
				}
			}
			else
			{
				/* De-select this option */
				pOption->fSelected=FALSE;
			}
			(*piThisNbr)++;
		}
		else if (pElement->iType==Type_OPTGROUP)
		{
			pContent=WML_GetContent(pElement);
			WML_PreSelectOptions(pContent,ppDefaultOption,piFindNbr,piThisNbr);
		}
		pElement=pElement->pNextElement;
	}
}



/*========================================================================

	INPUT ELEMENT FUNCTIONS

=========================================================================*/

/*========================================================================
	WML_SetInputKeyValue
==========================================================================*/
BOOL WML_SetInputKeyValue (pUA pUser, pELEMENTTYPE pElementObj, WCHAR *pchValue) 
{
	pINPUTELEMENT pInput;
	WCHAR *pchName;

	if (pUser!=NULL) 
	{
		if (pElementObj!=NULL) 
		{
			if (pElementObj->iType==Type_INPUT) 
			{
				/* Get the key name */
				pInput=(INPUTELEMENT*)(pElementObj);
				pchName=pInput->pchName;

				/* Set the value in the var table */
				if (WML_SetVariable(pUser,pchName,pchValue,FALSE))
				{
					return TRUE;
				}
			}
		}
	}
	return FALSE;
}

/*========================================================================
	WML_SetInputKeyValue
==========================================================================*/
WCHAR* WML_GetInputKeyValue (pUA pUser, pELEMENTTYPE pElement)
{
	pINPUTELEMENT pInput;
	WCHAR *pchName;
	WCHAR *pchValue=NULL;

	if (pUser!=NULL) 
	{
		if (pElement!=NULL) 
		{
			if (pElement->iType==Type_INPUT) 
			{
				pInput=(INPUTELEMENT*)(pElement);

				/* Get the Key value */
				pchName=pInput->pchName;

				/* Get COPY of the value */
				pchValue=WML_GetVariable(pUser,pchName);

				/* Check if NULL, if so get the default value */
				if (pchValue==NULL)
				{
					pchValue=WML_GetString(pUser,pInput->pValue);
		
					if (pchValue!=NULL)
					{
						WML_SetInputKeyValue(pUser,pElement,pchValue);
					}
				}
			}
		}
	}
	return pchValue;
}




/*========================================================================

	ACTION ELEMENT FUNCTIONS

=========================================================================*/

/*========================================================================
	WML_UpdateEventVariables
==========================================================================*/
void WML_UpdateEventVariables (pUA pUser, pELEMENTTYPE pAction)
{
	pELEMENTTYPE pContent=NULL;
	pSETVARELEMENT pVar=NULL;
	WCHAR *pchVarName=NULL;
	WCHAR *pchVarValue=NULL;

	pVARTABELM pLastInList=NULL;
	pVARTABELM pTempVar=NULL;

	/* Check if the action includes variables to be set. 
	   The VAR element can exist in GO, PREV and REFRESH.
	   If a VAR element is found, set it.*/
	if (pAction!=NULL) 
	{
		if ((pAction->iType==Type_GO)||
			(pAction->iType==Type_PREV)||
			(pAction->iType==Type_REFRESH)) 
		{
			/* Get the content of the action element. */
			pContent=WML_GetContent(pAction);

			/* Empty old variable list */
			WML_DeleteEventVariables (pUser);

			/* Check for VAR element. */
			while (pContent!=NULL) 
			{
				if (pContent->iType==Type_SETVAR) 
				{
					pVar=(SETVARELEMENT*)(pContent);
					
					/* Set the variable. */
					pchVarName=WML_GetString(pUser,pVar->pName);
					pchVarValue=WML_GetString(pUser,pVar->pValue);

					/* Check if valid variable name. */
					if (WML_CheckVariableSyntax(pchVarName,FALSE))
					{
						/* Create struct */
						pTempVar=NEWSTRUCT(VARTABELM);

						if (pTempVar!=NULL)
						{
							/* Add values to struct */
							pTempVar->pchName=pchVarName;
							pTempVar->pchValue=pchVarValue;
							pTempVar->pNextVar=NULL;

							/* Add struct to list */
							if (pLastInList!=NULL)
							{
								pLastInList->pNextVar=pTempVar;
								pLastInList=pTempVar;
							}
							else
							{
								pUser->pEventVariables=pTempVar;
								pLastInList=pTempVar;
							}
						}
					}
					else
					{
						/* Not valid values - remove */
						DEALLOC(&pchVarName);
						DEALLOC(&pchVarValue);
					}
				}
				pContent=pContent->pNextElement;
			}
		}
	}
}


/*========================================================================
	WML_HandleEvent
==========================================================================*/
pELEMENTTYPE WML_HandleEvent (pUA pUser, pELEMENTTYPE pElement, INT8 iEvent, 
							  BOOL fChangeVars)
{
	pELEMENTTYPE pAction=NULL;

	if (pElement!=NULL) 
	{
		if (pElement->iType==Type_CARD)
		{
			/* Check CARD level Event */
			pAction=WML_GetEventAction(iEvent,
					((CARDELEMENT*)(pElement))->pEventTab);

			if (pAction==NULL) 
			{
				if (pUser!=NULL) 
				{
					/* Check TEMPLATE level Event */
					pAction=WML_GetEventAction (iEvent,pUser->pTemplateEvents);
				}
			}

			if (fChangeVars)
			{
				/* Update variables, if any */
				WML_UpdateEventVariables (pUser, pAction);
			}
		}
	}

	return pAction;
}


/*========================================================================
	WML_HandleMMIAction
==========================================================================*/
pELEMENTTYPE WML_HandleMMIAction (pUA pUser, pELEMENTTYPE pElement, BOOL fChangeVars)
{
	pELEMENTTYPE pAction=NULL;
	pELEMENTTYPE pContent=NULL;

	if (pUser!=NULL)
	{
		if (pElement!=NULL)
		{
			/* do */
			if (pElement->iType==Type_DO)
			{
				/* Get Action */
				pAction=WML_GetContent(pElement);
			}

			/* option */
			else if (pElement->iType==Type_OPTION)
			{
				/* The action is always an attribute 
				   (or moved there during the parse) */
				pAction=((OPTIONELEMENT*)(pElement))->pOnpick;
			}

			/* anchor */
			else if (pElement->iType==Type_ANCHOR)
			{
				/* Get the event in an anchor element */
				pContent=WML_GetContent(pElement);

				/* Find the action. */
				while (pContent!=NULL)
				{
					if ((pContent->iType==Type_GO)||
							(pContent->iType==Type_PREV)||
							(pContent->iType==Type_REFRESH))
					{
						/* Action found. */
						pAction=pContent;

						/* Quit search. */
						pContent=NULL;
					}
					pContent=WML_GetNextElement(pContent);
				}
			}

			/* a */
			else if (pElement->iType==Type_A)
			{
				/* Return the element, the action is the eleemnt.
				   Href is an attribute in a. */
				pAction=pElement;
			}

			if (fChangeVars)
			{
				/* Update variables, if any */
				WML_UpdateEventVariables (pUser, pAction);
			}
		}
	}

	return pAction;
}




/*========================================================================

	TIMER ELEMENT FUNCTIONS

=========================================================================*/

/*========================================================================
	WML_GetTimer
==========================================================================*/
UINT32 WML_GetTimer (pUA pUser, pELEMENTTYPE pTimer)
{
	WCHAR *pchValue;
	pTIMERELEMENT pTimerElm;
	UINT32 iResult=0;

	if (pUser!=NULL) 
	{
		if (pTimer!=NULL) 
		{
			if (pTimer->iType==Type_TIMER) 
			{
				pTimerElm=(TIMERELEMENT*)(pTimer);

				/* Check value of KEY */
				pchValue=WML_GetVariable(pUser,pTimerElm->pchName);

				/* If NULL, get default value. */
				if (pchValue==NULL)
				{
					pchValue=WML_GetString(pUser,pTimerElm->pValue);
				}

				/* Convert to UINT32 */
				if (pchValue!=NULL) 
				{
					if (Convert_StringToUINT32(&pchValue,&iResult))
					{
						return iResult;
					}
				}
			}
		}
	}
	return 0;
}


/*========================================================================
	WML_StoreTimer
==========================================================================*/
/* Help function for StoreTimer */
void WML_SetOneUINT32Number (UINT32 iNumber, WCHAR **ppchString)
{
	UINT32 iDiv=0;
	UINT32 iMod=0;

	if (iNumber>0)
	{
		iDiv=iNumber/10;
		iMod=iNumber%10;

		WML_SetOneUINT32Number(iDiv,ppchString);

		**ppchString=(UINT16)(WC('1')+(UINT16)iMod-1);

		(*ppchString)++;
	}
}

BOOL WML_StoreTimer (pUA pUser, pELEMENTTYPE pTimer, UINT32 iValue)
{
	pTIMERELEMENT pTimerElm;
	WCHAR *pchValue=NULL;
	WCHAR *pchValueTemp=NULL;

	if ((pTimer!=NULL)&&(pUser!=NULL))
	{
		if (pTimer->iType==Type_TIMER) 
		{
			pTimerElm=(TIMERELEMENT*)(pTimer);

			/* Allocate memory for string 
			   (an UINT32 is 10 digits at most) */
			pchValue=NEWARRAY(WCHAR,11);

			if (pchValue!=NULL)
			{
				pchValueTemp=pchValue;

				if (iValue==0)
				{
					*pchValueTemp++=(UINT16)(WC('0'));
				}
				else
				{
					WML_SetOneUINT32Number(iValue,&pchValueTemp);
				}

				/* Set termination character */
				*pchValueTemp=0;

				/* Set variable. fWTA is FALSE - cannot be set from here */
				if (WML_SetVariable(pUser,pTimerElm->pchName,pchValue,FALSE))
				{
					DEALLOC(&pchValue);
					return TRUE;
				}

				DEALLOC(&pchValue);
			}
		}
	}
	return FALSE;
}


/*========================================================================

	WML ELEMENT FUNCTIONS 

=========================================================================*/

/*========================================================================
	WML_GetNextElement
==========================================================================*/
pELEMENTTYPE WML_GetNextElement (pELEMENTTYPE pElement)
{
	BOOL fText=TRUE;

	/* If start element is NOT text, get the first follwoing
	   element. */
	if ((pElement!=NULL)&&(!isTypeWMLText(pElement->iType)))
	{
		pElement=pElement->pNextElement;
	}
	else
	{
		/* Continue until NULL or a non-text element id found
		   (Type_Inline_Text, Type_Table_Text, Type_Entity or
		   Type_Ext).
		*/
		while ((pElement!=NULL)&&(fText))
		{
			pElement=pElement->pNextElement;

⌨️ 快捷键说明

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