📄 autoredialattempt.c
字号:
memset((PS8) cm_p->redial_info.RedialNum, 0, MAX_NUMBER);
pfnUnicodeStrcpy((PS8) cm_p->redial_info.RedialNum, (PS8) GetOutgoingNumber());
}
/*****************************************************************************
* FUNCTION
* IsRedialSet
* DESCRIPTION
* This function checks if the redial flag is set
* PARAMETERS
* void
* TRUE(?) [OUT] /FALSE
* RETURNS
* pBOOL
*****************************************************************************/
pBOOL IsRedialSet(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
if (GetOutgoingCallOrigin() == CM_CALL_MO_STK)
{
return SATCallRedialStatus();
}
return AutoRedialOnOffStatus();
}
/*****************************************************************************
* FUNCTION
* IsRedialNeeded
* DESCRIPTION
* This function checks if the error cause needs
* to redial
* PARAMETERS
* response [IN]
* TRUE(?) [OUT] /FALSE
* RETURNS
* pBOOL
*****************************************************************************/
pBOOL IsRedialNeeded(U16 response)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
pBOOL result = FALSE;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
MMI_TRACE((MMI_TRACE_G5_CM, MMI_CM_FUNC_IsRedialNeeded));
if ((GetTotalCallCount() == 0) || ((GetTotalCallCount() == 1) && (GetCurrentState() == CM_OUTGOING_STATE)))
{
switch (response)
{
case ERR_USER_BUSY:
case ERR_NO_USER_RESPONDING:
case ERR_DEST_OUT_OF_ORDER:
case ERR_NO_ANSWER_ON_ALERT:
case ERR_NO_CIRCUIT_CHANNEL_AVAIL:
case ERR_TEMPORARY_FAILURE:
case ERR_SWITCH_EQUIPMENT_CONGESTION:
case ERR_REQUESTED_CKT_CHANEL_NOT_AVIL:
case ERR_RESOURCE_UNAVAIL_UNSPECIFIED:
SetMaxAttempts(10);
result = TRUE;
break;
case ERR_UNASSIGNED_NUM:
case ERR_NO_ROUTE_TO_DESTINATION:
case ERR_NUMBER_CHANGED:
case ERR_INVALID_NUMBER_FORMAT:
case ERR_NETWORK_OUT_OF_ORDER:
SetMaxAttempts(1);
result = TRUE;
break;
default:
break;
}
}
if (result == FALSE)
{
ResetRedialAttempts();
return FALSE;
}
return TRUE;
}
/*****************************************************************************
* FUNCTION
* CheckRedialOrShowError
* DESCRIPTION
* Checks if number must be redialed or error
* must be shown
* PARAMETERS
* response [IN]
* Number(?) [IN] To show on screen
* RETURNS
* void
*****************************************************************************/
void CheckRedialOrShowError(U16 response)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
pBOOL result;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
MMI_TRACE((MMI_TRACE_G5_CM, MMI_CM_FUNC_CheckRedialOrShowError));
result = CalculateSetBackOff();
ShowCallManagementErrorMessage(response);
if (result == TRUE)
SetCurrentState(GetPreviousState());
return;
}
/*****************************************************************************
* FUNCTION
* ShowRedialScreen
* DESCRIPTION
* Timer callback after notification time expires
* PARAMETERS
* void
* RETURNS
* void
*****************************************************************************/
void ShowRedialScreen(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
StopTimer(CM_NOTIFYDURATION_TIMER);
cm_p->redial_info.ErrRedialScreen = FALSE;
EntryScrShowUserTimeToRedial();
}
/*****************************************************************************
* FUNCTION
* CalculateSetBackOff
* DESCRIPTION
* Calculates attempt value and resets timer for redial
* PARAMETERS
* void
* RETURNS
* void
*****************************************************************************/
pBOOL CalculateSetBackOff(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
pBOOL minFlag = FALSE;
U8 timer, dispTimer;
S8 temp[10], temp2[20];
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
MMI_TRACE((MMI_TRACE_G5_CM, MMI_CM_FUNC_CalculateSetBackOff));
cm_p->redial_info.CurrentAttempt++;
/* exceed redial attempt */
if (cm_p->redial_info.CurrentAttempt > cm_p->redial_info.MaxAttempts)
{
ResetRedialAttempts();
return FALSE;
}
switch (cm_p->redial_info.CurrentAttempt)
{
case 1:
timer = 7;
dispTimer = 5;
break;
case 2:
case 3:
case 4:
timer = 65;
dispTimer = 1;
minFlag = TRUE;
break;
default:
timer = 190;
dispTimer = 3;
minFlag = TRUE;
break;
}
memset(gRedialMsgTemp, 0, sizeof(gRedialMsgTemp));
pfnUnicodeStrcpy((PS8) gRedialMsgTemp, GetString(STR_CM_REDIAL));
sprintf((PS8) temp, "\n%d \0", cm_p->redial_info.CurrentAttempt);
AnsiiToUnicodeString((PS8) temp2, (PS8) temp);
pfnUnicodeStrcat((PS8) gRedialMsgTemp, (PS8) temp2);
pfnUnicodeStrcat((PS8) gRedialMsgTemp, GetString(STR_CM_REDIAL_TIMES));
pfnUnicodeStrcat((PS8) gRedialMsgTemp, GetString(STR_CM_REDIAL_NEXT_ATTEMPT));
sprintf((PS8) temp, "\n%d \0", dispTimer);
AnsiiToUnicodeString((PS8) temp2, (PS8) temp);
pfnUnicodeStrcat((PS8) gRedialMsgTemp, (PS8) temp2);
if (minFlag == FALSE)
{
pfnUnicodeStrcat((PS8) gRedialMsgTemp, GetString(STR_CM_REDIAL_SEC));
}
else
{
pfnUnicodeStrcat((PS8) gRedialMsgTemp, GetString(STR_CM_REDIAL_MIN));
}
cm_p->redial_info.RedialTimer = TRUE;
StartTimer(CM_REDIAL_TIMER, (timer * 1000), (FuncPtr) RedailAttemptNoArg);
return TRUE;
}
/*****************************************************************************
* FUNCTION
* RedailAttemptNoArg
* DESCRIPTION
* Call back handler for timer expiry
* PARAMETERS
* info [?]
* flag(?) [IN]
* RETURNS
* void
*****************************************************************************/
void RedailAttemptNoArg(void *info)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
U16 index;
S8 TempMsgStruct[MAX_NUMBER];
PHB_CM_INTERFACE *temp;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
StopTimer(CM_REDIAL_TIMER);
cm_p->redial_info.RedialTimer = FALSE;
if (IsScreenPresent(SCR1001_CM_OUTGOINGCALLSCREEN) == TRUE)
{
DeleteNScrId(SCR1001_CM_OUTGOINGCALLSCREEN);
}
DeleteScreenIfPresent(CM_SCR_RDL_TIME);
if (IsScreenPresent(CM_SCR_MARKER) == FALSE)
{
AddMarkerToHistory();
}
SetPreviousState(CM_IDLE_STATE);
SetCurrentState(CM_OUTGOING_STATE);
temp = GetCMPhoneBookStruct();
if (temp->dialInList != MMI_PHB_NONE)
{
cm_p->redial_info.DialFromPhb = temp->dialInList;
}
index = GetFirstFreeIndex();
AddNewCallInfo(
(U8*) cm_p->redial_info.RedialNum,
(CALL_STATE) GetCurrentState(),
CM_IDLE_STATE,
CM_CALL_MO,
(CM_CALL_HANDLE) (index + 1),
CM_VOICE_CALL);
UnicodeToAnsii(TempMsgStruct, (PS8) cm_p->redial_info.RedialNum);
MakePsInitiateCall((PU8) TempMsgStruct, (void*)OutgoingCallConnected);
return;
}
/*****************************************************************************
* FUNCTION
* GetCurrentAttempt
* DESCRIPTION
* To get flag to show redial screen
* PARAMETERS
* void
* RETURNS
* void
*****************************************************************************/
U8 GetCurrentAttempt(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
return cm_p->redial_info.CurrentAttempt;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -