📄 mmicall.c
字号:
typedef struct
{
T_MMI_CONTROL mmi_control;
T_MFW_HND win;
T_MFW_HND kbd;
T_MFW_HND kbd_long;
T_MFW_HND menu;
T_VOID_FUNC func_cb;
/*
* internal data
*/
} T_call_menu;
static T_MFW_HND call_menu_create(MfwHnd parent);
static void call_menu_destroy(MfwHnd window);
T_MFW_HND call_menu_start(MfwHnd parent,MfwMnuAttr* menuAttr,T_VOID_FUNC func_cb);
void call_menu (T_MFW_HND win, USHORT event, SHORT value, void * parameter);
static int call_menu_win_cb (MfwEvt e, MfwWin *w);
static int call_menu_kbd_cb (MfwEvt e, MfwKbd *k);
static int call_menu_kbd_long_cb (MfwEvt e, MfwKbd *k);
static int call_menu_mnu_cb (MfwEvt e, MfwMnu *m);
/*********************************************************************
**********************************************************************
CALL FUNCTIONS. DECLARATION
*********************************************************************
**********************************************************************/
/*SPR 1392, call deflection function prototypes*/
static int deflPhbExec();
/* SPR#1428 - SH - change parameters slightly */
EXTERN void cm_mt_deflect (T_MFW_HND win, USHORT identifier, SHORT reason);
void call_deflection_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason);//jgg
/*SPR 1392 end*/
void call_incoming_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason);
void call_calling_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason);
void call_ending_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason);
void call_waiting_answer_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason);
void call_sending_dtmf_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason);
void call_menu_end_cb(void);
void call_failure_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason);
static void call_calling_show (USHORT Identifier);
void call_info_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason);
/* Marcus: Issue 1057: 21/01/2003: Added the following function prototype */
void call_acm_max_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason);
/*********************************************************************
**********************************************************************
DIALLING WINDOW. DECLARATION
*********************************************************************
**********************************************************************/
typedef struct
{
T_MMI_CONTROL mmi_control;
T_MFW_HND win; // window handle
T_MFW_HND kbd;
T_MFW_HND kbd_long;
#ifdef NEW_EDITOR
T_ED_DATA *editor; /* SPR#1428 - SH - New Editor changes */
#else
T_MFW_HND edt;
#endif
UBYTE mode;
UBYTE callstatus;
} T_call_scratchpad;
T_MFW_HND call_scratchpad_create(MfwHnd parent);
void call_scratchpad_exit (void);
static int call_scratchpad_kbd_cb (MfwEvt e, MfwKbd *k);
static int call_scratchpad_kbd_long_cb (MfwEvt e, MfwKbd *k);
static int call_scratchpad_win_cb (MfwEvt e, MfwWin *w);
void call_scratchpad (T_MFW_HND win, USHORT event, SHORT value, void * parameter);
T_MFW_HND call_scratchpad_start (T_MFW_HND win_parent,char character,UBYTE mode, UBYTE callstatus);
/*******************************************************************************
Private Methods
*******************************************************************************/
/*******************************************************************************
$Function: callInit
$Description: initiates the window
$Returns: none
$Arguments: parent window
*******************************************************************************/
void callInit (MfwHnd parent)
{
TRACE_FUNCTION("callInit");
cm_init();
call_data.cm = cm_create(0, E_CM_ALL_SERVICES, (MfwCb)callCmEvent);
call_data.win = 0;
call_data.callStatus = CallInactive;
}
/*******************************************************************************
$Function: callExit
$Description: Exits the window
$Returns: none
$Arguments: none
*******************************************************************************/
void callExit (void)
{
TRACE_FUNCTION("callExit");
cm_delete(call_data.win);
timDelete(call_data.timer);
cm_exit();
}
/*******************************************************************************
$Function: callAutoRedialKeyEvent
$Description: keyboard event handler
$Returns: none
$Arguments: typical
*******************************************************************************/
void callAutoRedialKeyEvent(T_MFW_HND win, USHORT identifier, USHORT reason)
{
TRACE_FUNCTION("callAutoRedialKeyEvent");
call_data.win_redial = 0;
switch (reason)
{
case INFO_KCD_LEFT:
/*
callSetMode(ViewAutoRedial);
cm_redial();
*/
break;
case INFO_KCD_HUP:
case INFO_KCD_RIGHT:
case INFO_KCD_CLEAR:
cm_redial_abort();
callSetMode(ViewConnect);
break;
default:
break;
}
}
/*******************************************************************************
$Function: callCmEvent
$Description: call management event handler
$Returns: 1, processed, 0 ignored
$Arguments: event and parameter
*******************************************************************************/
int callCmEvent(MfwEvt e, void *para)
{
UBYTE currentRinger;
int i;
SHORT *cid;
T_MFW_CM_DISCONNECT *dc;
T_MFW_CM_COMMAND *comm;
SHORT callId;
T_MFW_CM_REDIAL *pRedial;
T_MFW_CM_CPI *cmCpi;
/* SPR#1352 - SH - TTY */
#ifdef MMI_TTY_ENABLED
T_MFW_CM_CTYI *cmCTYI;
#endif
/* end SH */
TRACE_EVENT_P2("%s %d","callCmEvent",e);
switch(e)
{
/*
* Handle call notifications
*/
case E_CM_NOTIFY:
TRACE_EVENT("E_CM_NOTIFY");
SEND_EVENT (call_data.win, E_CM_NOTIFY, 0, para);
break;
case E_CM_COLP:
TRACE_EVENT("E_CM_COLP");
SEND_EVENT (call_data.win, E_CM_COLP,0, para);
break;
case E_CM_CW:
if(para)
incomingCall((T_MFW_CM_CW_INFO*)para);
mmeSetVolume (1, FFS_flashData.output_volume);
break;
case E_CM_RING_OFF:
break;
case E_CM_DISCONNECT:
TRACE_EVENT("E_CM_DISCONNECT");
//EF assign dc now 29/01/2003
dc = (T_MFW_CM_DISCONNECT *)para;
if (strlen((char*)call_data.colp_number) > 0)
memset(call_data.colp_number,'\0',sizeof(call_data.colp_number));
/* SPR 1392, work out whether we need to remove the call deflection windows*/
/*if the call to be disconnected is the current incoming call*/
if ((dc->call_number==call_data.incCall))
{ /*if the deflection editor exists*/
if (call_data.win_deflectEdit)
{ /*remove the call deflection windows only*/
deflect_destroy(FALSE);
}
}
#ifdef MMI_WAP_ENABLED
/* SPR#1983 - SH - Inform WAP of a disconnection */
AUI_wap_call_disconnect(dc->call_number);
#endif
if (call_data.ignore_disconnect)
{
return 1;
}
if (LocalRing)
{
LocalRing = FALSE;
}
TRACE_EVENT("Disconnect Event");
cm_get_aoc_value(CM_AOC_CCM,&call_data.aocInfo);
if (!dc->call_number) // Delete multiparty
{
i = 0;
while (i<call_data.calls.numCalls)
{
sprintf(stringTrace,"callId %d",callId);
TRACE_EVENT(stringTrace);
if (call_data.calls.status[i].call_number!=singleCall)
{
if (!removeCall(call_data.calls.status[i].call_number))
i++;
}
else
i++;
}
}
if (callIndex(dc->call_number)<MAX_CALLS)
removeCall(dc->call_number); // Delete active call
else // Delete not executed call
{
if ((dc->call_number==call_data.incCall))
{
if (call_data.win_incoming)
{
TRACE_EVENT("Dialog Destroy No 1");
if(idwithheld == TRUE)
idCounter = idCounter + 1;
SEND_EVENT(call_data.win_incoming,DIALOG_DESTROY,0,0);
call_data.win_incoming = 0;
}
if (GET_CAUSE_VALUE (dc->cause)!=NOT_PRESENT_8BIT)
{
//Calling side has terminated the call, turn of ringer MZ.
currentRinger = getCurrentRingerSettings();
audio_StopSoundbyID( AUDIO_BUZZER, currentRinger );
//Check if incoming call has been rejected by user, call is not regarded as a missed call. MZ
if(dc->cause != MNCC_CAUSE_USER_BUSY )
{
if (call_data.globalCWInfo.type EQ VOICE_CALL)
addMissedCall();
}
}
call_data.incCall = 0;
if (!call_data.calls.numCalls)
if (call_data.win)
{
call_destroy(call_data.win);
/* SPR#1985 - SH - Revert to initial TTY setting
* Do not access dc-> after this call, as it will generate
* an event here which will overwrite the previous data */
#ifdef MMI_TTY_ENABLED
call_tty_revert();
#endif
return 1;
}
}
if ((dc->call_number==call_data.outCall))
{
if (call_data.win_calling){
TRACE_EVENT("Dialog Destroy No 2");
SEND_EVENT(call_data.win_calling,DIALOG_DESTROY,0,0);
call_data.win_calling = 0;
}
call_data.outCall = 0;
callFailureCause(dc->cause);
}
}
if (call_data.callsToEnd)
{
call_data.callsToEnd=call_data.callsToEnd-1;
cm_disconnect(call_data.calls.status[0].call_number);
}
/* SPR#1985 - SH - Revert to initial TTY setting
* Do not access dc-> after this call, as it will generate
* an event here which will overwrite the previous data */
#ifdef MMI_TTY_ENABLED
call_tty_revert();
#endif
//GW-SPR#1035 - Added SAT changed
/*NM, 110702
in case that the SAT initiate the setup call (open a new editor);
so we want to make sure that the editor disappear after disconnect
*/
sat_release_the_editor ();
/*NM, 110702 END*/
break;
case E_CM_CONNECT_ACK:
TRACE_EVENT("E_CM_CONNECT_ACK");
cid = (SHORT*)para;
TRACE_EVENT_P5("CId %d . outCall %d . win_calling %d . incCall %d win_incoming %d",
*cid,call_data.outCall,call_data.win_calling,call_data.incCall,
call_data.win_incoming);
if (LocalRing)
{
LocalRing = FALSE;
}
if ((*cid==call_data.incCall)&&(call_data.win_incoming))
{
SEND_EVENT(call_data.win_incoming,DIALOG_DESTROY,0,0);
call_data.win_incoming = 0;
}
if ((*cid==call_data.outCall)&&(call_data.win_calling)){
SEND_EVENT(call_data.win_calling,DIALOG_DESTROY,0,0);
call_data.win_calling = 0;
}
//Quick check to see if we're duplicating call table
for (i =0; i++; i<MAX_CALL_NR)
{ if (*cid == call_data.calls.status[i].call_number)
return;
}
call_data.outCall = 0;
call_data.incCall = 0;
callConnect(*cid);
mmeSetVolume (1, FFS_flashData.output_volume);
break;
case E_CM_CONNECT:
TRACE_EVENT("E_CM_CONNECT !!");
cid = (SHORT*)para;
if (LocalRing)
{
LocalRing = FALSE;
}
if ((*cid==call_data.incCall)&&(call_data.win_incoming)){
SEND_EVENT(call_data.win_incoming,DIALOG_DESTROY,0,0);
call_data.win_incoming = 0;
}
if ((*cid==call_data.outCall)&&(call_data.win_calling)){
SEND_EVENT(call_data.win_calling,DIALOG_DESTROY,0,0);
call_data.win_calling = 0;
}
call_data.outCall = 0;
call_data.incCall = 0;
callConnect(*cid);
mmeSetVolume (1, FFS_flashData.output_volume);
break;
case E_CM_WAP_CALL_CONNECTED:
break;
case E_CM_COMMAND:
comm = (T_MFW_CM_COMMAND*)para;
if (comm->result == Present) {
sprintf((char*)stringTrace,"comm.result = %d comm.command = %d",comm->result,comm->command);
TRACE_EVENT((char*)stringTrace);
switch (comm->command) {
case CM_RETRIEVE:
TRACE_EVENT("call CM_RETRIEVED received");
break;
case CM_HOLD:
TRACE_EVENT("call CM_HOLD received");
break;
case CM_BUILD_MULTIPARTY:
TRACE_EVENT("call CM_BUILDMULTIPARTY received");
call_data.calls.mode = CallConference;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -