📄 wml_uafn.c
字号:
-------------------------------------------------------------*/
void* SDL_CreateExtendedRequestStruct( void* pWAEInObject, void* pInUserAgent, void* pActiveElement, void* pbURL, void* pAccept, void* pInHistoryElement)
{
GOELEMENT* pGoElement=NULL;
UA* pUser=NULL;
URLREQSTRUCT* pURLStruct=NULL;
HISTORYITEM* pHistoryElement;
pURLStruct = New_URLREQSTRUCT();
pWAEInObject = pWAEInObject;
pHistoryElement = (HISTORYITEM*)pInHistoryElement;
if (!pURLStruct)
return NULL;
pURLStruct->iMethod = M_Get; /*default method */
if (pActiveElement)
{
if ( ((ELEMENTTYPE*)pActiveElement)->iType == Type_GO )
{
pGoElement = (GOELEMENT*)(pActiveElement);
if (pGoElement->fSendRef)
{
pUser = (UA*)pInUserAgent;
/* referring URL */
pURLStruct->pbReferer = b_MinRelativePath ((BYTE*)pbURL, pUser->pbURLBase, TRUE);
}
}
}
if (pHistoryElement)
{
if (pHistoryElement->iPostDataLength)
{
pURLStruct->pbBody = NEWARRAY(BYTE,pHistoryElement->iPostDataLength);
B_COPYSTRINGN(pURLStruct->pbBody,pHistoryElement->pbPostData,pHistoryElement->iPostDataLength);
pURLStruct->iBodyLength = pHistoryElement->iPostDataLength;
}
pURLStruct->iMethod = pHistoryElement->iMethod;
pURLStruct->iContentType = pHistoryElement->iContentType;
pURLStruct->iContentCharSet = pHistoryElement->iContentCharSet;
}
/* the URL that represents this request */
pURLStruct->pbURL = (BYTE*)GenCopyString(1, pbURL);
/* the content-types that are accepted by this request */
pURLStruct->pbAccept= (BYTE*)GenCopyString(1,pAccept);
#ifdef WAE_DEBUG
PrintChar("New Request");
PrintChar((CHAR*)pURLStruct->pbURL);
PrintChar((CHAR*)pURLStruct->pbAccept);
#endif
return pURLStruct;
}
/*---------------------------------------------
Runs updates on all
external variables input variables
Returns the number of signals
----------------------------------------------*/
int SDL_SendSignalsInputVariables(void *pUser, void *pList)
{
void* pListElm=NULL;
/*broadcast a getInputString */
pListElm = SDL_GetNextListElement(pList,NULL);
while (pListElm!=NULL)
{
MMIa_getInputString( (UINT8)((UA*)pUser)->iViewID, (UINT8)SDL_GetListElementID(pListElm) );
pListElm = SDL_GetNextListElement(pList,pListElm);
}
return SDL_GetCardinal(pList);
}
WCHAR* getLang(void* pElement, UINT16 iType)
{
WCHAR* pLang=NULL;
if (!pElement)
return NULL;
switch (iType)
{
case Type_WML:
pLang = ((WMLELEMENT*)pElement)->pwchXmlLang;
break;
case Type_CARD:
pLang = ((CARDELEMENT*)pElement)->pwchXmlLang;
break;
case Type_DO:
pLang = ((DOELEMENT*)pElement)->pwchXmlLang;
break;
case Type_SELECT:
pLang = ((SELECTELEMENT*)pElement)->pwchXmlLang;
break;
case Type_OPTGROUP:
pLang = ((OPTGROUPELEMENT*)pElement)->pwchXmlLang;
break;
case Type_OPTION:
pLang = ((OPTIONELEMENT*)pElement)->pwchXmlLang;
break;
case Type_INPUT:
pLang = ((INPUTELEMENT*)pElement)->pwchXmlLang;
break;
case Type_FIELDSET:
pLang = ((FIELDSETELEMENT*)pElement)->pwchXmlLang;
break;
case Type_IMG:
pLang = ((IMGELEMENT*)pElement)->pwchXmlLang;
break;
case Type_A:
pLang = ((AELEMENT*)pElement)->pwchXmlLang;
break;
case Type_ANCHOR:
pLang = ((ANCHORELEMENT*)pElement)->pwchXmlLang;
break;
case Type_TABLE:
pLang = ((TABLEELEMENT*)pElement)->pwchXmlLang;
break;
case Type_TD:
pLang = ((TDELEMENT*)pElement)->pwchXmlLang;
break;
case Type_BR:
pLang = ((BRELEMENT*)pElement)->pwchXmlLang;
break;
case Type_P:
pLang = ((PELEMENT*)pElement)->pwchXmlLang;
break;
case Type_B:
case Type_BIG:
case Type_EM:
case Type_I:
case Type_SMALL:
case Type_STRONG:
case Type_U:
pLang = ((EMPHELEMENT*)pElement)->pwchXmlLang;
break;
default:
break;
}
return pLang;
}
void SDL_UpdateLanguage(UINT8 iViewID, void* pElement, void* pPrevElement,void* pLanguageStack )
{
WCHAR* pLang=NULL;
BYTE* pbLanguage = NULL;
BOOL fDummy;
void* pTemp;
UINT16 iType=0;
/* if the previous element was a lang remove from stack */
if (pPrevElement && pLanguageStack && pPrevElement == SDL_CheckLIFOStack( pLanguageStack ) )
{
pTemp = SDL_POPLIFOStack( pLanguageStack );
pTemp = SDL_CheckLIFOStack( pLanguageStack );
iType = ((ELEMENTTYPE*)pTemp)->iType;
pLang = getLang(pTemp, iType);
if (pLang)
pbLanguage = wip_wchar2byte(pLang ,& fDummy );
MMIa_setLanguage (iViewID, (const char *)pbLanguage);
}
if (!pElement)
return;
iType = ((ELEMENTTYPE*)pElement)->iType;
if (isTypeWMLText(iType))
return;
pLang = getLang(pElement, iType);
/* if the current element has a lang put on stack */
if (pLang)
{
DEALLOC(& pbLanguage);
pbLanguage = wip_wchar2byte(pLang ,& fDummy );
MMIa_setLanguage (iViewID, (const char *)pbLanguage);
DEALLOC(& pbLanguage);
SDL_PUSHLIFOStack( pLanguageStack, pElement );
}
else if (pbLanguage)
{
DEALLOC(& pbLanguage);
MMIa_setLanguage (iViewID, NULL);
}
}
int SDL_UpdateInputVariables(void *pUserAgent, void* pInputElementList, int iInputID, void* pwchTheInputString)
{
UA *pUser;
ELEMENTTYPE *pTheElement=NULL;
pUser = (UA*)pUserAgent;
pTheElement = SDL_SearchListElement(pInputElementList, iInputID, NULL);
if (pTheElement)
{
#ifdef WAE_DEBUG
PrintChar("Update Input variable");
WMLUA_PrintWS(pwchTheInputString);
#endif
pTheElement = SDL_GetListElementContent(pTheElement);
WML_SetInputKeyValue (pUser, pTheElement, (WCHAR*)pwchTheInputString);
return TRUE;
}
else
return FALSE;
}
void SDL_SetSelectDefault ( void *pTheElement , void *pUser )
{
BOOL fDummy;
fDummy = WML_SetSelectDefault ( (ELEMENTTYPE*)pTheElement , (UA*)pUser );
}
void SDL_UpdateAllSelect (void* pCard, void* pUser)
{
BOOL fDummy;
fDummy = WML_UpdateAllSelect ( (ELEMENTTYPE*)pCard , (UA*)pUser );
}
UINT16 WSP2HTTPStatusConvert(UINT8 iWSPNbr)
{
UINT16 iResult=0;
if (iWSPNbr < 0x60)
iResult = (UINT16)(( (( iWSPNbr >> 4) & 0x0f) * 100) + (iWSPNbr & 0x0f));
else
iResult = (UINT16)(500 + (iWSPNbr & 0x0f));
return iResult;
}
/*---------------------------------------------------------------------------------------*/
/* changes the state for the MMIUserAgent, also affects the User Input */
void SDL_SetMMIUserAgentLocked(void* pUser, BOOL fMMILock)
{
((UA*)pUser)->fLockMMI = fMMILock;
if (fMMILock)
SDL_SetUserInputLocked(pUser, TRUE);
}
/* Changes the UserInputState. (only if the value in fact has changed)
NOTE: when the MMIUserAgent is locked that value overrides the inputvalue */
void SDL_SetUserInputLocked(void* pUser, BOOL fWait)
{
if ( ((UA*)pUser)->fUserInputMode != fWait) /* change is needed */
{
if ( fWait == TRUE || ((UA*)pUser)->fLockMMI == FALSE )
{
((UA*)pUser)->fUserInputMode = fWait;
MMIa_wait( (UINT8)((UA*)pUser)->iViewID, fWait);
}
}
}
void SDL_ToggleLoadIcon(void* pUser, BOOL fLoad, BYTE* pRequestURL)
{
if ( ((UA*)pUser)->fUserLoadMode != fLoad) /* change is needed */
{
((UA*)pUser)->fUserLoadMode = fLoad;
if (fLoad)
SDL_OutputStatus(pUser, LoadingData, pRequestURL );
else
SDL_OutputStatus(pUser, LoadingDataDone, pRequestURL );
}
}
int SDL_MMILocked(void* pUser)
{
return ((UA*)pUser)->fLockMMI;
}
void* SDL_Normalise(void* pTheUA, void* pURL)
{
BYTE *pbResult = NULL;
BYTE *pbTemp = NULL;
if (pURL)
{
if (pTheUA){
pbTemp = b_EscapeBlanks( pURL );
b_Resolve (((UA*)pTheUA)->pbURLBase, pbTemp, & pbResult);
DEALLOC(&pbTemp);
}
else
{
WML_TrimTextBYTE ((BYTE*)pURL, TRIMTEXT_BOTH);
pbResult = b_CompleteURLHeuristically((BYTE*)pURL);
}
}
return pbResult;
}
int SDL_GetScheme(void* pURL)
{
BYTE* pbScheme=NULL;
int iScheme = Scheme_empty;
if (pURL!=NULL)
{
if (b_GetScheme ((BYTE*)pURL, & pbScheme))
{
if (pbScheme)
iScheme = (int)Scheme_FromString (pbScheme);
}
DEALLOC(& pbScheme);
}
return iScheme;
}
int SDL_CheckIfPost(void* pTaskElement)
{
if (pTaskElement!=NULL)
{
if (((ELEMENTTYPE*)pTaskElement)->iType==Type_GO)
{
/* if it磗 a go element that has initiated the request */
if ( ((GOELEMENT*)(pTaskElement))->iMethod == M_Post ) /* TODOjens pElm */
return TRUE;
}
}
return FALSE;
}
int SDL_CheckIfReload(void* pTaskElement)
{
if (pTaskElement!=NULL)
{
if (((ELEMENTTYPE*)pTaskElement)->iType==Type_GO)
{
if ( ((GOELEMENT*)(pTaskElement))->iCacheControl == Cache_nocache )
return TRUE;
}
}
return FALSE;
}
int SDL_URLOnSameDeck(void *pUserAgent,void* pInURL)
{
BOOL res =FALSE;
#ifdef WAE_DEBUG
PrintChar("Compare :");
PrintChar("Current URL:");
PrintChar(((UA*)pUserAgent)->pbURLBase);
PrintChar("New URL:");
PrintChar(pInURL);
#endif
if (((UA*)pUserAgent)->pbURLBase && pInURL)
{
res = b_EqualURL ( ((UA*)pUserAgent)->pbURLBase, (BYTE*)pInURL, ALL_COMP ^ FRAG_COMP); /* compare without frag */
}
return res;
}
void SDL_About(void* pTheUA, void* pReqURL)
{
const WCHAR pInfoString[]={'-','A','U','S',' ','W','A','P',' ','E','n','g','i','n','e','-',0};
UINT8 iViewID;
WCHAR *pwchText=NULL;
if (pReqURL && pTheUA)
{
iViewID = (UINT8)(((UA*)pTheUA)->iViewID);
/*
if (B_STRSTRING( (BYTE*)pReqURL, (BYTE*)"wapengine"))
*/
if (strstr( pReqURL, "wapengine"))
{
WCHAR **AboutStrings2Wchar(const CHAR *);
WCHAR **ppVersionStr = AboutStrings2Wchar((const CHAR *)pReqURL);
WCHAR **iVersionStr = ppVersionStr;
MMIa_newCard(iViewID, NULL, 0, 0, NULL, TRUE, NULL);
MMIa_newParagraph (iViewID,ALIGN_LEFT,TRUE,FALSE);
MMIa_newText (iViewID, 0, pInfoString,FALSE,NULL,0, 0);
MMIa_newBreak (iViewID);
while (*iVersionStr != NULL)
{
pwchText = *iVersionStr;
MMIa_newText (iViewID, 0, pwchText, FALSE,NULL,0, 0);
MMIa_newBreak (iViewID );
DEALLOC( &pwchText);
iVersionStr++;
}
DEALLOC( &ppVersionStr);
MMIa_closeParagraph (iViewID);
MMIa_showCard(iViewID);
}
}
}
void* SDL_URLGetFragment(void* pTheURL)
{
BYTE *pbResultString=NULL;
if (pTheURL)
b_GetFragment((BYTE*)pTheURL, & pbResultString);
return (void*)pbResultString;
}
/*------------------------------------------------------------------------------------------------
WTAI extensions
-------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------
Check if the provided URL is a valid WTA URI function.
If so corresponding adapter function is called.
Output: WTAI_URI_NO_FUNCTION - no URI function found.
WTAI_URI_FUNCTION - URI function found,
adapter function called.
WTAI_URI_END_CONTEXT - the URI function 'endContext',
handle outside this function.
NOTE! There is no checking of useragent type.
The caller of this function must perform this control!
(Currently all URI functions except 'endContext' are public).
--------------------------------------------------------------------*/
int SDL_CallWTAIURI( int objectId, void* pURL)
{
BYTE* pWTAIFunction=NULL;
BYTE* pWTAISubFunction=NULL;
BYTE* pWTAINumber=NULL;
BYTE* pTempWTAINumber=NULL;
WCHAR* pwchName = NULL;
BYTE* pbTemp=NULL;
int iRet= WTAI_URI_NO_FUNCTION;
if (pURL && b_GetHost ((BYTE*)pURL, & pWTAIFunction) && b_GetPath ((BYTE*)pURL, & pWTAISubFunction) && b_GetParameters ((BYTE*)pURL, & pWTAINumber) )
{
/* Check is function and subfunction is present,
all URI functions must have these. */
if ( pWTAIFunction && pWTAISubFunction )
{
/* Check if number section is present */
if (pWTAINumber)
{
BYTE* pWTAIFrag=NULL;
b_GetFragment ((BYTE*)pURL, & pWTAIFrag);
/* Append fragmet if existing, this is done to accept
the '#' sign in dtmf sequences and phone numbers */
if (pWTAIFrag != NULL)
{
INT16 len;
BYTE* pTmpArray;
len = (INT16)B_STRINGLENGTH((const char *)pWTAINumber);
pTmpArray = NEWARRAY (BYTE, (len + B_STRINGLENGTH((const char *)pWTAIFrag) +2));
B_COPYSTRING((char *)pTmpArray, (const char *)pWTAINumber);
pTmpArray[len] =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -