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