/*******************************************************************************

          CONDAT (UK)

********************************************************************************

 This software product is the property of Condat (UK) Ltd and may not be
 disclosed to any third party without the express permission of the owner.

********************************************************************************

 $Project name: Basic MMI
 $Project code: BMI (6349)
 $Module:   MMI
 $File:       MmiSatClassE.c
 $Revision:   1.0

 $Author:   Condat(UK)
 $Date:       13/03/03

********************************************************************************

 Description:   Contains the implementation of SAT Class E



********************************************************************************

 $History: MmiSatClassE.c

  13/03/03      Original Condat(UK) BMI version.

 $End

*******************************************************************************/

#define ENTITY_MFW

/* includes */
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#if defined (NEW_FRAME)

#include "typedefs.h"
#include "vsi.h"
#include "pei.h"
#include "custom.h"
#include "gsm.h"

#else

#include "STDDEFS.H"
#include "custom.h"
#include "gsm.h"
#include "vsi.h"

#endif /* (NEW_FRAME) */

#include "pconst.cdg"
#include "mconst.cdg"
#include "message.h"
#include "ccdapi.h"
#include "prim.h"
#include "cus_aci.h"
#include "cnf_aci.h"
#include "mon_aci.h"

#include "tok.h"

#include "prim.h"
#ifndef PCM_2_FFS
#include "pcm.h"
#endif


#include "mfw_mfw.h"
#include "mfw_kbd.h"
#include "mfw_tim.h"
#include "mfw_lng.h"
#include "mfw_win.h"
#include "mfw_icn.h"
#include "mfw_sim.h"
#include "mfw_nm.h"
/* SPR#1428 - SH - New Editor changes */
#ifndef NEW_EDITOR
#include "mfw_edt.h"
#endif /* NEW_EDITOR */
#include "mfw_mnu.h"
#include "mfw_phb.h"
#include "mfw_sms.h"

#include "dspl.h"


#include "p_mmi.h"
#include "message.h"
#include "prim.h"
#include "aci_cmh.h"
#include "mfw_mme.h"

#include "MmiMmi.h"

#include "Mmiicons.h"
#include "MmiPins.h"
#include "MmiMain.h"
#include "MmiDialogs.h"
#include "MmiIdle.h"
#include "MmiStart.h"
#include "mmiCall.h"
#include "MmiSimToolkit.h"
#include "gdi.h"
#include "audio.h"
#include "MmiLists.h"
#include "MmiSounds.h"
#include "MmiResources.h"
#include "MmiTimeDate.h"
#include "mmiSat_i.h"
/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
#include "ATBCommon.h"
#include "ATBDisplay.h"
#include "ATBEditor.h"
#include "AUIEditor.h"
#else
#include "MmiEditor.h"
#endif /* NEW_EDITOR */
#include "MmiMenu.h" // SH - 20/11/01 - included to provide symbol SimMenuFunc
#include "mmiSmsRead.h" /*MC SPR 940/2*/

#include "cus_aci.h"
#include "prim.h"
#include "pcm.h"

#include "mmiSatClassE.h"
#include "mmiColours.h"

typedef struct
{
    T_MMI_CONTROL mmi_control;
    T_MFW_HND     parent_win;
    T_MFW_HND     win;
    T_SAT_CMD     *sat_command; /* pointer to sat_command in parent */
    char * alpha_id;
} T_sat_open_channel;


/* Local function prototypes */
static void sat_open_channel_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason);
static void sat_class_e_dialog_destroy(T_MFW_HND win);
static void sat_class_e_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason);

/*******************************************************************************

 $Function:    	sat_class_e_create

 $Description:	      Creation of an instance for the SAT Class E dialog.

 $Returns:		mfw window handler 

 $Arguments:        parent_window - Parent window handler
 
*******************************************************************************/
T_MFW_HND sat_class_e_create (T_MFW_HND parent_window)
{
    T_sat_open_channel * data = (T_sat_open_channel *)ALLOC_MEMORY (sizeof (T_sat_open_channel));
    T_MFW_WIN       * win;

    TRACE_FUNCTION("sat_open_channel_create()");

    if (data != NULL)
    {
        data->win = win_create (parent_window, 0, 0,NULL);
    }
    else
    {
        TRACE_ERROR("Error: Cannot allocate memory for data!");
    }

    if (data->win EQ NULL)
        return NULL;

    /*
     * Create window handler
     */
    data->mmi_control.dialog   = (T_DIALOG_FUNC)sat_class_e_exec;
    data->mmi_control.data     = data;
    data->parent_win             = parent_window;
    win                                 = ((T_MFW_HDR *)data->win)->data;
    win->user                        = (MfwUserDataPtr)data;

    /*
     * return window handle
     */
    winShow(data->win);
    return data->win;
}

/*******************************************************************************

 $Function:     sat_open_channel_cb

 $Description:  Callback for accept/reject dialog.
 $Returns:       None.

 $Arguments:  win: current window
                    identifier: unique id
                    reason: event id

*******************************************************************************/
static void sat_open_channel_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason)
{
    TRACE_FUNCTION("sat_open_channel_cb()");
    
    if (win EQ NULL)
    {
        return;
    }
    
    switch (reason)
    {
    case INFO_KCD_LEFT:        /* user has accepted Open Channel request */
        satAccept();

        /* Destroy the dialog */
        sat_class_e_dialog_destroy(win);
        break;
    case INFO_KCD_RIGHT:        /* user has rejected Open Channel request */
        satReject();

        /* Destroy the dialog */
        sat_class_e_dialog_destroy(win);
        break;
    default:
        break;
    }
}

/*******************************************************************************

 $Function:     sat_class_e_dialog_destroy

 $Description:  Close the alert dialog

 $Returns:      None.

 $Arguments:  alert_dialog: window handle.

*******************************************************************************/
static void sat_class_e_dialog_destroy(T_MFW_HND win)
{

    T_MFW_WIN       * win_data;  
    T_sat_open_channel * data;
    
    TRACE_FUNCTION ("sat_class_e_dialog_destroy()");

    if (win == NULL) 
    {
       TRACE_ERROR("ERROR: win is NULL!");
       return;
    }

    win_data = ((T_MFW_HDR *)win)->data;

    if (win_data == NULL)
    {
        TRACE_ERROR("ERROR: win_data is NULL!");
        return;
    }

    data = (T_sat_open_channel *)win_data->user;
    
    if (win != NULL)
    {
        if (data)
        {
            /*
             * Delete WIN Handler
             */
            win_delete (data->win);
            /*
             * Free Memory
             */
            sat_destroy_TEXT_ASCIIZ (data->alpha_id);
            FREE_MEMORY ((U8 *)data, sizeof (T_sat_open_channel));
        }
    }
}

/*******************************************************************************

 $Function:     sat_class_e_cb

 $Description:  Callback for Sat Class E dialogs.
 $Returns:       None.

 $Arguments:  win: current window
                    identifier: unique id
                    reason: event id

*******************************************************************************/
static void sat_class_e_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason)
{
    TRACE_FUNCTION("sat_class_e_cb()");
    
    if (win EQ NULL)
    {
        return;
    }
    
    switch (reason)
    {
    case INFO_KCD_LEFT:
    case INFO_KCD_RIGHT:
    case INFO_TIMEOUT:

        /* Destroy the dialog */
        sat_class_e_dialog_destroy(win);
        break;
    default:
        break;
    }
}

/*******************************************************************************

 $Function:    	sat_class_e_exec

 $Description:	      Dialog function for Sat Class E window.

 $Returns:		none

 $Arguments:	      win - current window
 				event - window event
 				value - unique id
 				call_setup_parameter - call setup info

 SPR#2321 - DS - Corrected misleading comments.
 
*******************************************************************************/
void sat_class_e_exec (T_MFW_HND win, USHORT event, SHORT value,  T_SAT_CMD * sat_command)
{
    
    T_MFW_WIN       * win_data;  
    T_sat_open_channel * data;
    char* text_string;
    
    T_DISPLAY_DATA    display_info;
    
    TRACE_FUNCTION ("sat_class_e_exec()");

    if (win == NULL) 
    {
       TRACE_ERROR("ERROR: win is NULL!");
       return;
    }

    win_data = ((T_MFW_HDR *)win)->data;

    if (win_data == NULL)
    {
        TRACE_ERROR("ERROR: win_data is NULL!");
        return;
    }

    data = (T_sat_open_channel *)win_data->user;

    if (data == NULL)
    {
        TRACE_ERROR("ERROR: data is NULL!");
        return;
    }
    
    switch (event)
    {
        case SAT_OPEN_CHANNEL:

            TRACE_EVENT("SAT_OPEN_CHANNEL");
                
            /* Start an info screen to accept or reject the Open Channel request */
            data->sat_command = sat_command;	

            /* Extract the data from the Open Channel sat command */
            if (sat_command != NULL)
            {

		  TRACE_EVENT_P2("dcs: %x, len: %d", sat_command->c.open.alpha_id.code, sat_command->c.open.alpha_id.len);
		  
                /* Alpha identifier */

                /* Check alpha identifier has valid length */
                if ( (sat_command->c.open.alpha_id.len > 0) &&
                     (sat_command->c.open.alpha_id.len != (U8)-1) )
                {
                    /* Extract alpha_id data and create string */
                    data->alpha_id = sat_create_TEXT_ASCIIZ(&sat_command->c.open.alpha_id);
                }
                else
                {
                    data->alpha_id = NULL;
                }
            }
	     else
	     {
	     	     TRACE_ERROR("ERROR: NULL sat_command!");
	     }

            if (data->alpha_id)
            {
                text_string = data->alpha_id;
#ifdef NO_ASCIIZ/*MC SPR 940/2 Add tag to Unicode strings so info dialog displays them correctly*/
		   sat_add_unicode_tag_if_needed(text_string);
#endif               
            }
            else
            {
                text_string = "Open Channel"; //Need to implement for Chinese
            }
                    
            
            dlg_initDisplayData_TextStr( &display_info, TxtAccept, TxtReject, text_string, NULL, COLOUR_STATUS);
            dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)sat_open_channel_cb, FOREVER, KEY_LEFT|KEY_RIGHT );

            display_info.Identifier   = event;
            
            /*
            * Call Info Screen
            */
            info_dialog (win, &display_info);
                
            break;
        
        case SAT_CLOSE_CHANNEL:

            TRACE_EVENT("SAT_CLOSE_CHANNEL");
                
            /* Start an info screen to inform the user that the SIM is closing the open channel*/
            data->sat_command = sat_command;

            /* Extract the data from the Close Channel sat command */
            if (sat_command != NULL)
            {
                TRACE_EVENT_P2("dcs: %x, len: %d", sat_command->c.close.alpha_id.code, sat_command->c.close.alpha_id.len);
		  
                /* Alpha identifier */

                /* SPR#2321 - DS - Check alpha identifier has valid length */
                if ( (sat_command->c.close.alpha_id.len > 0) &&
                     (sat_command->c.close.alpha_id.len != (U8)-1) )
                {
                    /* Extract alpha_id data and create string */
                    data->alpha_id = sat_create_TEXT_ASCIIZ(&sat_command->c.close.alpha_id);
                }
                else
                {
                    data->alpha_id = NULL;
                }
            }

            if (data->alpha_id)
            {
                text_string = data->alpha_id;
#ifdef NO_ASCIIZ/*MC SPR 940/2 Add tag to Unicode strings so info dialog displays them correctly*/
		   sat_add_unicode_tag_if_needed(text_string);
#endif               
            }
            else
            {
                text_string = "Closing Channel"; //Need to implement for Chinese
            }
                    
            
            dlg_initDisplayData_TextStr( &display_info, TxtNull, TxtNull, text_string, NULL, COLOUR_STATUS);
            dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)sat_class_e_cb, THREE_SECS, KEY_LEFT|KEY_RIGHT );

            display_info.Identifier   = event;
            
            /*
            * Call Info Screen
            */
            info_dialog (win, &display_info);
                
            break;

        case SAT_SEND_DATA:

	     TRACE_EVENT("SAT_SEND_DATA");
                
            /* Start an info screen to inform the user that the SIM is sending data */
            data->sat_command = sat_command;

            /* Extract the data from the Send Data sat command */
            if (sat_command != NULL)
            {
                TRACE_EVENT_P2("dcs: %x, len: %d", sat_command->c.send.alpha_id.code, sat_command->c.send.alpha_id.len);
		  
                /* Alpha identifier */

                /* SPR#2321 - DS - Check alpha identifier has valid length */
                if ( (sat_command->c.send.alpha_id.len > 0) &&
                     (sat_command->c.send.alpha_id.len != (U8)-1) )
                {
                    /* Extract alpha_id data and create string */
                    data->alpha_id = sat_create_TEXT_ASCIIZ(&sat_command->c.send.alpha_id);
                }
                else
                {
                    data->alpha_id = NULL;
                }
            }

            if (data->alpha_id)
            {
                text_string = data->alpha_id;
#ifdef NO_ASCIIZ/*MC SPR 940/2 Add tag to Unicode strings so info dialog displays them correctly*/
		   sat_add_unicode_tag_if_needed(text_string);
#endif               
            }
            else
            {
                text_string = "Sending Data"; //Need to implement for Chinese
            }                   
            
            dlg_initDisplayData_TextStr( &display_info, TxtNull, TxtNull, text_string, NULL, COLOUR_STATUS);
            dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)sat_class_e_cb, THREE_SECS, KEY_LEFT|KEY_RIGHT );

            display_info.Identifier   = event;
            
            /*
            * Call Info Screen
            */
            info_dialog (win, &display_info);
                
            break;

        case SAT_RECEIVE_DATA:

	     TRACE_EVENT("SAT_RECEIVE_DATA");

            /* Start an info screen to inform the user that the SIM is receiving data */
            data->sat_command = sat_command;

            /* Extract the data from the Receive Data sat command */
            if (sat_command != NULL)
            {
                TRACE_EVENT_P2("dcs: %x, len: %d", sat_command->c.receive.alpha_id.code, sat_command->c.receive.alpha_id.len);
		  
                /* Alpha identifier */

                /* SPR#2321 - DS - Check alpha identifier has valid length */
                if ( (sat_command->c.receive.alpha_id.len > 0) &&
                     (sat_command->c.receive.alpha_id.len != (U8)-1) )
                {
                    /* Extract alpha_id data and create string */
                    data->alpha_id = sat_create_TEXT_ASCIIZ(&sat_command->c.receive.alpha_id);
                }
                else
                {
                    data->alpha_id = NULL;
                }
            }

            if (data->alpha_id)
            {
                text_string = data->alpha_id;
#ifdef NO_ASCIIZ/*MC SPR 940/2 Add tag to Unicode strings so info dialog displays them correctly*/
		   sat_add_unicode_tag_if_needed(text_string);
#endif               
            }
            else
            {
                text_string = "Receiving Data"; //Need to implement for Chinese
            }                   
            
            dlg_initDisplayData_TextStr( &display_info, TxtNull, TxtNull, text_string, NULL, COLOUR_STATUS);
            dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)sat_class_e_cb, THREE_SECS, KEY_LEFT|KEY_RIGHT );

            display_info.Identifier   = event;
            
            /*
            * Call Info Screen
            */
            info_dialog (win, &display_info);
                
            break;

        default:
            TRACE_EVENT("sat_open_channel_exec() unexpected event");
            return;
    }

}

/* EOF - End Of File */
