FreeCalypso > hg > fc-magnetite
view src/aci2/bmi/ATBWapAUI.c @ 296:154011ef41b1
components/frame_na7_db_{fl,ir}: missed the -o3
which causes function reordering
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 21 Oct 2017 03:18:21 +0000 |
parents | 93999a60b835 |
children |
line wrap: on
line source
/******************************************************************************* 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: $Project code: $Module: $File: ATBWapAUI.c $Revision: $Author: Condat(UK) $Date: ******************************************************************************** Description: Provides most of the functionality of the ATB, as well as an interface with the AUI. ******************************************************************************** $History: ATBWapAUI.c Sep 06 2005 REF: MMI-SPR-34048 x0012849, Jagan Description : GIF is displayed as ? Solution: Close the decoder once for each open xreddymn Aug-03-2005 MMI-SPR-33058: Handling of animated GIF images with transparency xreddymn Jun-29-2005 MMI-ENH-32467: Handling of animated GIF images xrashmic 29 Jun, 2005 MMI-SPR-32462 Patch given by Kyle for display of table border xreddymn Jun-21-2005 MMI-SPR-30291: Send one message for the entire profile, instead of sending one parameter at a time, to the WAP adapter Jun-08-2005 MMI-SPR-30291 xreddymn: Added patches from FG May 11 2005 REF: MMI-SPR-29887 x0012849 To Implement the deferred MMS retrieval. Apr 28 2005 REF: MMI-SPR-30400 x0012849 To display the contents of Drop down menu correctly when a page is browsed through D sample. xreddymn Mar-22-2005 MMI-SPR-29767 Modified behaviour of SL push message handling in MMI xrashmic 08 Feb, 2005 MMI-SPR-27853 Error handling in sending MMS and also displaying the progress value Jan-24-2005 MMI-SPR-28135 - xreddymn: WAP_OTA settings saved in WAP profiles xrashmic 21 Jan, 2005 MMI-SPR-28223 When a plugin image is displayed, we ignore the scroll key events xrashmic 28 Jan, 2005 MMI-SPR-28166 Adding support for saving plugin images xreddymn Jan-06-2005 MMI-SPR-27618: Added end of string character to terminate strings in ATB_wap_entry_add xrashmic 16 Dec, 2004 MMI-SPR-27622 To add support for deleting and adding Profiles Dec-10-2003 MMI-SPR-26159 - xreddymn: Prevent duplicate entries in History List 15/05/2003 - SPR#1983 - SH - Updated to latest from 1.6.3 version. $End *******************************************************************************/ #ifndef MFW #define MFW #endif #ifdef MFW #define ENTITY_MFW #else #ifdef SMI #define ENTITY_SMI #else #define ENTITY_ACI #endif #endif #include <stdio.h> #include <string.h> #include <stdlib.h> #include "typedefs.h" /* BEGIN ADD: Sumit : Req ID: : 31-Mar-2005*/ #ifndef NEPTUNE_BOARD /* END ADD: Sumit : Req ID: : 31-Mar-2005*/ #include "ffs/ffs.h" /* BEGIN ADD: Sumit : Req ID: : 31-Mar-2005*/ #else #include "ffs.h" #endif /* END ADD: Sumit : Req ID: : 31-Mar-2005*/ #include "MmiWapFfs.h" #ifdef FF_GPF_TCPIP #include "leconfig.h" #include "capimic.h" #include "aapimic.h" #include "wapmic_types.h" //kyle 29 Jun, 2005 MMI-SPR-32462 #include "tapimmi.h" #else #include "gledef.h" #include "capiclnt.h" #include "aapiclnt.h" #include "wap_types.h" #endif #include "ATBWapACI.h" #include "ATBData.h" #include "ATBWapAUI.h" #include "font_bitmaps.h" #include "cus_aci.h" #include "prim.h" #ifndef PCM_2_FFS #include "pcm.h" #endif #include "dspl.h" #ifdef FF_GPF_TCPIP #include "mfw_sms.h" #endif void long_IP_to_char_IP(ULONG IPs,char* IPd); #define DEFAULT_PROFILE 0 /* The default starting profile */ static T_WAP_VIEW *View_header = 0; /* View header points to first element in the view chain */ static T_WAP_VIEW *Current_view = 0; /* Points to the current view */ #if defined (FF_MMI_MMS) && defined (FF_GPF_TCPIP) // May 11 2005 REF: MMI-SPR-29887 x0012849 // MmsRetrievalType is used while Reading or writing Data from flash regarding retrieval type. extern FlashDataMmsRetrievalType *MmsRetrievalType; //xrashmic 19 Aug, 2004 Bug: 2, 3, 36 and 42 extern int MMSactive; //xrashmic 08 Feb, 2005 MMI-SPR-27853 extern void AUI_mms_status_notify(int status); #endif #ifdef FF_GPF_TCPIP // Apr 28 2005 REF: MMI-SPR-30400 x0012849 //This is added to see that check box is inline with the text. #define OFFSET_CHECKBOX 4 //xrashmic 21 Jan, 2005 MMI-SPR-28223 extern BOOL pluginImageDisplayed; // xreddymn Jan-25-2005 MMI-SPR-28135: WAP_OTA #include "mfw_ss.h" // For definitions of MFW_ASCII, MFW_DCS_UCS2 int ATB_convert_String( char * ipString, UBYTE ipDataType, int ipLength, char * opString, UBYTE opDataType, int opLength, UBYTE addNull); extern void AUI_profile_list_redraw(S32 index); #endif /* LOCAL FUNCTION PROTOTYPES */ static void ATB_wap_buffer_image_scale(T_WAP_MMI_SEND_IMAGE_IND *image); static void ATB_wap_buffer_text_draw(T_WAP_MMI_SEND_TEXT_IND *parameter); static void ATB_wap_buffer_table_draw(T_WAP_MMI_SEND_TABLE_IND *parameter); static void ATB_wap_buffer_line_draw(SHORT x1, SHORT y1, SHORT x2, SHORT y2); static BOOL ATB_wap_buffer_onscreen(SHORT x, SHORT y, SHORT *deltaX, SHORT *deltaY); static void ATB_wap_buffer_image_display(T_WAP_MMI_SEND_IMAGE_IND *image); #if defined(TRACE_ATBWAPAUI) || defined(TRACE_ATBWAPACI) /* Functions to display strings, for tracing purposes. * SPR#1437 - SH - Fixed these so they won't overwrite array bounds */ void ATB_trace_string(char *String, USHORT length) { UBYTE stringIndex; UBYTE trace_string[41]; for (stringIndex=0; (stringIndex<40 && stringIndex<length); stringIndex++) trace_string[stringIndex] = String[stringIndex]; trace_string[stringIndex] = 0; TRACE_EVENT_P2("%s (%d)", trace_string, length); return; } void ATB_trace_ushort_string(USHORT *String, USHORT length) { USHORT stringIndex; UBYTE trace_string[41]; for (stringIndex=0; (stringIndex<40 && stringIndex<length); stringIndex++) trace_string[stringIndex] = (char) String[stringIndex]; trace_string[stringIndex] = 0; TRACE_EVENT_P2("%s (%d)", trace_string, length); return; } #endif /******************************************************************************* $Function: ATB_wap_start $Description: Starts the WAP application and initialises the view chain $Returns: None. $Arguments: parameter - dummy empty parameter *******************************************************************************/ #ifdef CO_UDP_IP void ATB_wap_start(T_MMI_WAP_START_IND *parameter) #else void ATB_wap_start(T_MMI_WAP_START_USER_AGENT_REQ *parameter) #endif { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_start"); #endif M_MMI_WAP_START_IND(parameter); /* Initialise the pointer to the view chain */ View_header = NULL; Current_view = NULL; return; } #if defined (FF_MMI_MMS) && defined (FF_GPF_TCPIP) //TISHMMS Project /******************************************************************************* $Function: ATB_mms_init_wap_data $Description: init WapData and WapProfilesData $Returns: $Arguments: parameter *******************************************************************************/ void ATB_mms_init_wap_data(void) { #ifdef TRACE_ATBWAPAUI //TRACE_FUNCTION("ATB_mms_init_wap_data"); #endif if (WapData == NULL) { WapData = (FlashDataWap *) AUI_wap_memory_alloc(sizeof(FlashDataWap)); // Allocate memory for flash data } if (WapProfilesData == NULL) { WapProfilesData = (FlashDataWapProfiles *) AUI_wap_memory_alloc(sizeof(FlashDataWapProfiles)); // Allocate memory for profiles data } /* read FFS file to get WapData */ if (flash_wap_read() == 0) { ATB_wap_profile_default_create(); } return; } void ATB_mms_init_mms_data(void) { // May 11 2005 REF: MMI-SPR-29887 x0012849 // type will hold the current retrieval condition BOOL Type; if (MmsProfilesData == NULL) { MmsProfilesData = (FlashDataMmsProfiles *) AUI_wap_memory_alloc(sizeof(FlashDataMmsProfiles)); // Allocate memory for profiles data } // May 11 2005 REF: MMI-SPR-29887 x0012849 // Allocate memory for the MmsRetrievalType // The memory allocated here freed in the function ATB_mms_free_wap_data if ( NULL == MmsRetrievalType) { MmsRetrievalType = (FlashDataMmsRetrievalType *) AUI_wap_memory_alloc(sizeof(FlashDataMmsRetrievalType)); } /* read FFS file to get WapData */ if (flash_mms_read() == 0) { ATB_mms_profile_default_create(); } // May 11 2005 REF: MMI-SPR-29887 x0012849 //If the Information is stored on flash then do nothing, other wise create a file on Flash // Initially MMS retrieval type is set to Immediate Retrieval. if(flash_mms_retrieval_type_read(&Type)==0) { flash_mms_retrieval_type_write(0); // passed 0 indicates immediate } return; } /******************************************************************************* $Function: ATB_mms_free_wap_data $Description: free WapData $Returns: $Arguments: parameter *******************************************************************************/ void ATB_mms_free_wap_data(void) { #ifdef TRACE_ATBWAPAUI //TRACE_FUNCTION("ATB_mms_free_wap_data"); #endif if (WapData) { AUI_wap_memory_free ((UBYTE *)WapData, sizeof(FlashDataWap)); WapData = NULL; } if (WapProfilesData) { AUI_wap_memory_free ((UBYTE *)WapProfilesData, sizeof(FlashDataWapProfiles)); WapProfilesData = NULL; } if (MmsProfilesData) { AUI_wap_memory_free ((UBYTE *)MmsProfilesData, sizeof(FlashDataMmsProfiles)); MmsProfilesData = NULL; } // May 11 2005 REF: MMI-SPR-29887 x0012849 // Memory is freed here for the MmsProfilesData if (MmsRetrievalType) { AUI_wap_memory_free ((UBYTE *)MmsRetrievalType, sizeof(FlashDataMmsRetrievalType )); MmsRetrievalType = NULL; } return; }/* end of ATB_mms_free_wap_data */ char* ATB_mms_get_MmscAddress(void) { UBYTE ucProfileId; char* MmscAddress; ucProfileId = WapData->ProfileId; MmscAddress = MmsProfilesData->Profile[ucProfileId].MmscAddress; return MmscAddress; } void ATB_mms_get_wap_Profile(void ** MmsWapProfile) { UBYTE ucProfileId; char TraceBuffer[100]; T_WAP_PROFILE * pTemp; ucProfileId = WapData->ProfileId; sprintf(TraceBuffer, "ATB_mms_get_wap_grofile called!ucProfileId = "); //M4_DebugStringMessage( TraceBuffer,(strlen(TraceBuffer)), ucProfileId); *MmsWapProfile = (void*)(&(WapProfilesData->Profile[ucProfileId])); pTemp = &(WapProfilesData->Profile[ucProfileId]); return; } void ATB_mms_profile_save(void) { flash_mms_write(); return; } //TISHMMS Project //modification end #endif /******************************************************************************* $Function: ATB_wap_new_view $Description: Starts a new view, defining the graphical size of the screen to be handled. $Returns: Pointer to the data structure of the new view $Arguments: parameter - width and height of the WAP view, etc. UIdata - Optional generic pointer, for use by the AUI. This can point to window information, etc, but is not used by ATB. *******************************************************************************/ #ifdef FF_GPF_TCPIP T_WAP_VIEW* ATB_wap_new_view(T_MMI_WAP_NEW_VIEW_IND *parameter, void* UIdata) { T_WAP_VIEW *View = (T_WAP_VIEW *) AUI_wap_memory_alloc (sizeof(T_WAP_VIEW)); // Create the view T_WAP_VIEW *ViewIndex; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_new_view"); #endif /* SPR#2086 - SH - Changes to allow for multiple views */ View->URL = (char *)AUI_wap_memory_alloc ((URL_MAX_LEN+1)*sizeof(char)); /* SPR#1816 - SH - Card title is unicode */ View->Title = (USHORT *)AUI_wap_memory_alloc ((CARD_TITLE_MAX_LEN+1)*sizeof(USHORT)); // Title of card View->cardWidth = WAP_SCREEN_WIDTH; View->cardHeight = WAP_SCREEN_HEIGHT; /* SPR#1816 - SH - Profiles list is unicode */ View->ProfilesList = ATB_wap_entry_list_create(WAP_PROFILES_LIST, MAX_PROFILES, PROFILENAME_MAX_LEN, TRUE); // ...profiles names list View->object_id = parameter->object_id; View->channel = WAP_CHANNEL_ID; View->UIdata = UIdata; View->ElementHeader = NULL; /* Element chain is as yet empty */ View->NextView = NULL; View->browser_status = ATB_WAP_NO_STATUS; /* SPR#1547 - SH - Replaced 'status' with 'browser_status' */ View->CustSoftKeys = FALSE; /* Whether we have customised soft keys */ /* SPR#1816 - SH - Create entry lists. Now with unicode parameter */ View->Bookmarks = ATB_wap_entry_list_create(WAP_BOOKMARKS_LIST, MAX_BOOKMARKS, CARD_TITLE_MAX_LEN, TRUE); View->BookmarksURL = ATB_wap_entry_list_create(WAP_URL_LIST, MAX_BOOKMARKS, URL_MAX_LEN, FALSE); View->History = ATB_wap_entry_list_create(WAP_HISTORY_LIST, MAX_HISTORY, CARD_TITLE_MAX_LEN+NUMBER_PADDING, TRUE); View->HistoryURL = ATB_wap_entry_list_create(WAP_URL_LIST, MAX_HISTORY, URL_MAX_LEN, FALSE); View->cId = -1; /* Check if WAP data exists */ if (!WapData) { WapData = (FlashDataWap *) AUI_wap_memory_alloc(sizeof(FlashDataWap)); // Allocate memory for flash data WapProfilesData = (FlashDataWapProfiles *) AUI_wap_memory_alloc(sizeof(FlashDataWapProfiles)); // Allocate memory for profiles data /* Default values are provided. If either of the files 'mmi/wapdata' * or 'mmi/wapprof' aren't found, files are created with these defaults. * The '0' size indicator indicates that one of the files was not present. */ if (flash_wap_read() == 0) { ATB_wap_profile_default_create(); } } View->ProfileId = WapData->ProfileId; // Default starting profile // Read in the current profile if (View_header == NULL) View_header = View; // This is the first entry else { ViewIndex = View_header; while (ViewIndex->NextView != NULL) // If not the last entry, ViewIndex = ViewIndex->NextView; // find the next entry! ViewIndex->NextView = View; // New entry is last entry in chain } Current_view = View; ATB_wap_profile_names_read(View); ATB_wap_profile_read(View, View->ProfileId); M_MMI_WAP_NEW_VIEW_IND(parameter); return View; } #else /* #ifdef FF_GPF_TCPIP */ T_WAP_VIEW* ATB_wap_new_view(T_MMI_WAP_NEW_VIEW_IND *parameter, void* UIdata) { T_WAP_VIEW *View; T_WAP_VIEW *ViewIndex; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_new_view"); #endif /* Create the view */ View = (T_WAP_VIEW *) AUI_wap_memory_alloc (sizeof(T_WAP_VIEW)); /* Allocate memory for two FFS files */ WapData = (FlashDataWap *) AUI_wap_memory_alloc(sizeof(FlashDataWap)); WapProfilesData = (FlashDataWapProfiles *) AUI_wap_memory_alloc(sizeof(FlashDataWapProfiles)); /* Allocate some arrays and lists */ View->URL = (char *)AUI_wap_memory_alloc ((URL_MAX_LEN+1)*sizeof(char)); View->Title = (USHORT *)AUI_wap_memory_alloc ((CARD_TITLE_MAX_LEN+1)*sizeof(USHORT)); /* Set up some default values */ View->cardWidth = WAP_SCREEN_WIDTH; View->cardHeight = WAP_SCREEN_HEIGHT; View->object_id = parameter->object_id; View->channel = WAP_CHANNEL_ID; View->UIdata = UIdata; View->ElementHeader = NULL; /* Element chain is as yet empty */ View->NextView = NULL; View->browser_status = ATB_WAP_NO_STATUS; /* Browser status is idle */ View->CustSoftKeys = FALSE; /* Whether we have customised soft keys */ View->cId = -1; /* Create entry lists */ View->ProfilesList = ATB_wap_entry_list_create(WAP_PROFILES_LIST, MAX_PROFILES, PROFILENAME_MAX_LEN, TRUE); View->Bookmarks = ATB_wap_entry_list_create(WAP_BOOKMARKS_LIST, MAX_BOOKMARKS, CARD_TITLE_MAX_LEN, TRUE); View->BookmarksURL = ATB_wap_entry_list_create(WAP_URL_LIST, MAX_BOOKMARKS, URL_MAX_LEN, FALSE); View->History = ATB_wap_entry_list_create(WAP_HISTORY_LIST, MAX_HISTORY, CARD_TITLE_MAX_LEN+NUMBER_PADDING, TRUE); View->HistoryURL = ATB_wap_entry_list_create(WAP_URL_LIST, MAX_HISTORY, URL_MAX_LEN, FALSE); /* Read in profile information from flash */ ATB_wap_profile_names_read(View); ATB_wap_profile_read(View, View->ProfileId); /* Add this view to the view chain */ if (View_header == NULL) View_header = View; /* This is the first entry */ else { ViewIndex = View_header; while (ViewIndex->NextView != NULL) /* If not the last entry, */ ViewIndex = ViewIndex->NextView; /* find the next entry! */ ViewIndex->NextView = View; /* New entry is last entry in chain */ } Current_view = View; /* Tell WAP Browser to create new view */ M_MMI_WAP_NEW_VIEW_IND(parameter); return View; } #endif /* !#ifdef FF_GPF_TCPIP */ #ifdef FF_GPF_TCPIP /******************************************************************************* $Function: ATB_wap_new_view_invisible $Description: Starts a new view that is not associated with a browser SPR#2086 - SH - Added $Returns: Pointer to the data structure of the new view $Arguments: object_id - The object_id of the new view *******************************************************************************/ T_WAP_VIEW* ATB_wap_new_view_invisible(UBYTE object_id) { T_WAP_VIEW *View = (T_WAP_VIEW *) AUI_wap_memory_alloc (sizeof(T_WAP_VIEW)); // Create the view T_WAP_VIEW *ViewIndex; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_new_view_invisible"); #endif memset((void *)View, 0, sizeof(T_WAP_VIEW)); /* Check if WAP data exists */ if (!WapData) { WapData = (FlashDataWap *) AUI_wap_memory_alloc(sizeof(FlashDataWap)); // Allocate memory for flash data WapProfilesData = (FlashDataWapProfiles *) AUI_wap_memory_alloc(sizeof(FlashDataWapProfiles)); // Allocate memory for profiles data /* Default values are provided. If either of the files 'mmi/wapdata' * or 'mmi/wapprof' aren't found, files are created with these defaults. * The '0' size indicator indicates that one of the files was not present. */ if (flash_wap_read() == 0) { ATB_wap_profile_default_create(); } } View->ProfileId = WapData->ProfileId; // Default starting profile View->object_id = object_id; View->channel = WAP_CHANNEL_ID; View->browser_status = ATB_WAP_NO_STATUS; View->cId = -1; View->Title = (USHORT *)AUI_wap_memory_alloc ((CARD_TITLE_MAX_LEN+1)*sizeof(USHORT)); // Title of card if (View_header == NULL) View_header = View; /* This is the first entry */ else { ViewIndex = View_header; while (ViewIndex->NextView != NULL) /* If not the last entry, */ ViewIndex = ViewIndex->NextView; /* find the next entry! */ ViewIndex->NextView = View; /* New entry is last entry in chain */ } Current_view = View; ATB_wap_profile_read(View, View->ProfileId); // Read in the current profile return View; } #endif /******************************************************************************* $Function: ATB_wap_get_view $Description: Returns a pointer to a view, given its object_id $Returns: Pointer to the data structure of the specified view, or NULL if not found $Arguments: object_id - the id of the view *******************************************************************************/ T_WAP_VIEW* ATB_wap_get_view(UBYTE object_id) { T_WAP_VIEW *View = View_header; UBYTE Index; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_get_view()"); #endif if (!View_header) { return NULL; } /* SPR#1497 - SH - If object_id is 0, any view will do */ if (object_id==0) return View; /* Search for object_id */ for (Index = 0; View!=NULL && View->object_id!=object_id; Index++) { View = View->NextView; } return View; } #ifdef FF_GPF_TCPIP /******************************************************************************* $Function: ATB_wap_change_view $Description: Change the view to the one specified SPR#2086 - SH - Added $Returns: None. $Arguments: object_id - The identifier for the view *******************************************************************************/ void ATB_wap_change_view(UBYTE object_id) { T_WAP_VIEW *View; TRACE_FUNCTION("ATB_wap_change_view()"); if (!(View = ATB_wap_get_view(object_id))) return; Current_view = View; AUI_wap_view_changed(View); return; } #endif /******************************************************************************* $Function: ATB_wap_destroy $Description: Destroys any open view. If no views are open, destroys the WAP application by calling ATB_wap_terminate(). $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: None. *******************************************************************************/ #ifdef FF_GPF_TCPIP T_WAP_RES ATB_wap_destroy() { T_MMI_WAP_CLOSE_VIEW_IND parameter1; static T_MMI_WAP_TERMINATE_IND parameter2; T_WAP_VIEW *ViewIndex; T_WAP_VIEW *PrevView; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_destroy"); #endif /* Destroys an open view each time it is called. * if there are no open views, the WAP browser is terminated. */ /* Destroy the view chain. * If views still exist, destroy the bottom one */ if (Current_view!=NULL) /*Until end of chain */ { ViewIndex = View_header; PrevView = NULL; /* Find the next view, or go to the view header */ while (ViewIndex!=Current_view && ViewIndex!=NULL) { PrevView = ViewIndex; ViewIndex = ViewIndex->NextView; } TRACE_EVENT_P2("Found current view as %X; previous view = %X", ViewIndex, PrevView); if (ViewIndex==NULL) { TRACE_EVENT("**ERROR - cannot destroy view***"); return; } /* If we're at the view header, then there is no previous view */ if (ViewIndex==View_header) { View_header = View_header->NextView; Current_view = View_header; } else { Current_view = PrevView; Current_view->NextView = ViewIndex->NextView; /* Close gap in view chain */ } TRACE_EVENT_P1("Current view is now %X", Current_view); /* Notify MMI of new view */ AUI_wap_view_changed(Current_view); parameter1.object_id = ViewIndex->object_id; ATB_wap_entry_list_destroy(ViewIndex->ProfilesList); // Destroy profiles names list ATB_wap_entry_list_destroy(ViewIndex->Bookmarks); // Destroy bookmarks ATB_wap_entry_list_destroy(ViewIndex->BookmarksURL); ATB_wap_entry_list_destroy(ViewIndex->History); // Destroy history list ATB_wap_entry_list_destroy(ViewIndex->HistoryURL); /* SPR#2086 - SH - Only delete memory that has been allocated */ if (ViewIndex->URL) { AUI_wap_memory_free ((UBYTE *)ViewIndex->URL, (URL_MAX_LEN+1)*sizeof(char)); // Delete URL string } if (ViewIndex->Title) { /* SPR#1816 - SH - Title is unicode */ AUI_wap_memory_free ((UBYTE *)ViewIndex->Title, (CARD_TITLE_MAX_LEN+1)*sizeof(USHORT)); // Delete card title } if (ViewIndex->ElementHeader) { ATB_wap_buffer_clear(ViewIndex); // Clear the element buffer ViewIndex->ElementHeader = ViewIndex->NewElementHeader; // Just in case a new card is being created ATB_wap_buffer_clear(ViewIndex); // Clear this too! } TRACE_EVENT_P1("Destroying view %X", ViewIndex); AUI_wap_memory_free((UBYTE *)ViewIndex, sizeof(T_WAP_VIEW)); // Destroy the current entry /* If the view is associated with a user agent, close that too */ if (parameter1.object_id<WAP_DOWNLOAD_VIEW) { M_MMI_WAP_CLOSE_VIEW_IND(¶meter1); } /* Otherwise, indicate this view is closed */ else { ATB_wap_close_view_done(); } return WAP_OK; } else { /* SPR#1794 - SH - WAP data now split between two FFS files */ /* Destroy the RAM copy of the FFS data */ if (WapData) { AUI_wap_memory_free ((UBYTE *)WapData, sizeof(FlashDataWap)); WapData = NULL; } /* Destroy the RAM copy of the FFS profiles information */ if (WapProfilesData) { AUI_wap_memory_free ((UBYTE *)WapProfilesData, sizeof(FlashDataWapProfiles)); WapProfilesData = NULL; } View_header = NULL; Current_view = NULL; /* Shut down WAP Browser */ return ATB_wap_terminate(¶meter2); } } #else /* #ifdef FF_GPF_TCPIP */ T_WAP_RES ATB_wap_destroy() { T_MMI_WAP_CLOSE_VIEW_IND parameter1; static T_MMI_WAP_TERMINATE_IND parameter2; T_WAP_VIEW *ViewIndex; T_WAP_VIEW *NextView; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_destroy"); #endif /* Destroy the view chain. * If views still exist, destroy the bottom one */ if (View_header!=NULL) /* Until end of chain */ { ViewIndex = View_header; /* Store the current entry pointer */ View_header = ViewIndex->NextView; /* Find the next entry */ parameter1.object_id = ViewIndex->object_id; /* Destroy entry lists */ ATB_wap_entry_list_destroy(ViewIndex->ProfilesList); ATB_wap_entry_list_destroy(ViewIndex->Bookmarks); ATB_wap_entry_list_destroy(ViewIndex->BookmarksURL); ATB_wap_entry_list_destroy(ViewIndex->History); ATB_wap_entry_list_destroy(ViewIndex->HistoryURL); /* Free strings */ AUI_wap_memory_free ((UBYTE *)ViewIndex->URL, (URL_MAX_LEN+1)*sizeof(char)); AUI_wap_memory_free ((UBYTE *)ViewIndex->Title, (CARD_TITLE_MAX_LEN+1)*sizeof(USHORT)); /* Clear the element buffer */ ATB_wap_buffer_clear(ViewIndex); /* If a new card is being created, clear this too */ ViewIndex->ElementHeader = ViewIndex->NewElementHeader; ATB_wap_buffer_clear(ViewIndex); /* Free View memory */ AUI_wap_memory_free((UBYTE *)ViewIndex, sizeof(T_WAP_VIEW)); /* Tell WAP Browser to close the view */ M_MMI_WAP_CLOSE_VIEW_IND(¶meter1); return WAP_OK; } else { /* Destroy the RAM copy of the FFS data */ if (WapData) { AUI_wap_memory_free ((UBYTE *)WapData, sizeof(FlashDataWap)); WapData = NULL; } /* Destroy the RAM copy of the FFS profiles information */ if (WapProfilesData) { AUI_wap_memory_free ((UBYTE *)WapProfilesData, sizeof(FlashDataWapProfiles)); WapProfilesData = NULL; } View_header = NULL; Current_view = NULL; /* Shut down WAP Browser */ return ATB_wap_terminate(¶meter2); } } #endif /* !#ifdef FF_GPF_TCPIP */ /******************************************************************************* $Function: ATB_wap_UIdata $Description: Returns the UI pointer, for use by AUI $Returns: The void pointer $Arguments: None. *******************************************************************************/ void * ATB_wap_UIdata() { if (View_header) return View_header->UIdata; else return NULL; } /******************************************************************************* $Function: ATB_wap_terminate $Description: Closes the WAP application and frees all the memory allocated $Returns: WAP_OK $Arguments: parameter - see MMI_WAP_TERMINATE_IND *******************************************************************************/ T_WAP_RES ATB_wap_terminate(T_MMI_WAP_TERMINATE_IND *parameter) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_terminate"); #endif /* SPR#1850 - SH - No longer terminate call here */ M_MMI_WAP_TERMINATE_IND(parameter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_config_int $Description: SPR#1921 - SH - Added Sends integer configuration information to the browser $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: View - The current view param - ID of the configuration value - Integer value of the configuration *******************************************************************************/ T_WAP_RES ATB_wap_config_int(T_WAP_VIEW *View, USHORT param, U32 value) { T_MMI_WAP_CONFIGURE_IND parameter; parameter.object_id = View->object_id; parameter.type = WAP_IntConfig; parameter.param = param; parameter.intvalue = value; parameter.strvalue = NULL; parameter.length = 0; M_MMI_WAP_CONFIGURE_IND(¶meter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_config_str $Description: SPR#1921 - SH - Added Sends string configuration information to the browser $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: View - The current view param - ID of the configuration value - Integer value of the configuration string - String value of the configuration length - Length of the string value *******************************************************************************/ T_WAP_RES ATB_wap_config_str(T_WAP_VIEW *View, USHORT param, char *string, U32 length) { T_MMI_WAP_CONFIGURE_IND parameter; parameter.object_id = View->object_id; parameter.type = WAP_StrConfig; parameter.param = param; parameter.intvalue = 0; parameter.strvalue = string; parameter.length = length; M_MMI_WAP_CONFIGURE_IND(¶meter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_conn_config_int $Description: SPR#1921 - SH - Added Sends integer configuration information to the browser $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: View - The current view param - ID of the configuration value - Integer value of the configuration *******************************************************************************/ T_WAP_RES ATB_wap_conn_config_int(T_WAP_VIEW *View, USHORT param, U32 value) { T_MMI_WAP_CONNECTION_CONFIGURE_IND parameter; parameter.object_id = View->object_id; parameter.type = WAP_IntConfig; parameter.channel_id = View->channel; parameter.param = param; parameter.intvalue = value; parameter.strvalue = NULL; parameter.length = 0; M_MMI_WAP_CONNECTION_CONFIGURE_IND(¶meter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_conn_config_str $Description: SPR#1921 - SH - Added Sends string configuration information to the browser $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: View - The current view param - ID of the configuration value - Integer value of the configuration string - String value of the configuration length - Length of the string value *******************************************************************************/ T_WAP_RES ATB_wap_conn_config_str(T_WAP_VIEW *View, USHORT param, char *string, U32 length) { T_MMI_WAP_CONNECTION_CONFIGURE_IND parameter; parameter.object_id = View->object_id; parameter.type = WAP_StrConfig; parameter.channel_id = View->channel; parameter.param = param; parameter.intvalue = 0; parameter.strvalue = string; parameter.length = length; M_MMI_WAP_CONNECTION_CONFIGURE_IND(¶meter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_download_url $Description: Requests the WAP browser to download a particular URL $Returns: WAP_OK $Arguments: View - The current view URL - The URL to download reload - TRUE if page is to be fetched from network, not cache. *******************************************************************************/ T_WAP_RES ATB_wap_download_url(T_WAP_VIEW *View, char *URL, BOOL reload) { T_MMI_WAP_DOWNLOAD_URL_IND parameter; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_download_url"); #endif parameter.object_id = View->object_id; parameter.Url = URL; parameter.url_length = (U32)(strlen(URL)+1); parameter.reload = reload; // Jun-08-2005 MMI-SPR-30291: Added patches from FG #ifdef FF_GPF_TCPIP parameter.view_height = View->cardHeight; parameter.view_width = View->cardWidth; #endif M_MMI_WAP_DOWNLOAD_URL_IND(¶meter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_stop_download $Description: Requests the WAP browser to stop downloading a particular URL $Returns: WAP_OK $Arguments: View - the current view *******************************************************************************/ T_WAP_RES ATB_wap_stop_download(T_WAP_VIEW *View) { T_MMI_WAP_BROWSE_CONTROL_IND parameter; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_stop_download"); #endif parameter.object_id = View->object_id; parameter.browse_command = WAP_DOWNLOAD_STOP; M_MMI_WAP_BROWSE_CONTROL_IND(¶meter); ATB_wap_status_change(View,ATB_WAP_NO_STATUS); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_card_refresh $Description: Requests the WAP browser to refresh the current card from the network $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: View - the current view *******************************************************************************/ T_WAP_RES ATB_wap_card_refresh(T_WAP_VIEW *View) { T_MMI_WAP_BROWSE_CONTROL_IND parameter; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_card_refresh"); #endif parameter.object_id = View->object_id; parameter.browse_command = WAP_CARD_REFRESH; M_MMI_WAP_BROWSE_CONTROL_IND(¶meter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_card_display $Description: Requests the WAP browser to redisplay a card held in the cache $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: View - the current view *******************************************************************************/ T_WAP_RES ATB_wap_card_display(T_WAP_VIEW *View) { T_MMI_WAP_BROWSE_CONTROL_IND parameter; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_card_display"); #endif parameter.object_id = View->object_id; parameter.browse_command = WAP_CARD_DISPLAY; M_MMI_WAP_BROWSE_CONTROL_IND(¶meter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_card_go_back $Description: Requests the WAP browser to go to the previous card $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: View - the current view *******************************************************************************/ T_WAP_RES ATB_wap_card_go_back(T_WAP_VIEW *View) { T_MMI_WAP_BROWSE_CONTROL_IND parameter; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_card_go_back"); #endif parameter.object_id = View->object_id; parameter.browse_command = WAP_CARD_GO_BACK; M_MMI_WAP_BROWSE_CONTROL_IND(¶meter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_card_key_event $Description: Requests the WAP browser react to a key event, up/down etc. $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: View - the current view keyType - the type of key selected *******************************************************************************/ T_WAP_RES ATB_wap_card_key_event(T_WAP_VIEW *View, WAP_CONTROL_TYPES keyType) { T_MMI_WAP_BROWSE_CONTROL_IND command; T_MMI_WAP_DRAW_CARD_REQ current_card; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_card_key_event"); #endif #ifdef FF_GPF_TCPIP // xreddymn Jun-28-2005 MMI-SPR-32467 ATB_animated_GIF_clear(); #endif command.object_id = View->object_id; command.browse_command = keyType; M_MMI_WAP_BROWSE_CONTROL_IND(&command); /* For select, need to redraw card in order to update changed elements */ if (keyType == WAP_KEY_SELECT) { current_card.object_id = View->object_id; M_MMI_WAP_DRAW_CARD_REQ(¤t_card); } return WAP_OK; } /******************************************************************************* $Function: ATB_wap_key_selected $Description: Send the id of the selected WAP key to the AUS browser. $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: View - the current view keyId - Key identifier *******************************************************************************/ T_WAP_RES ATB_wap_key_selected(T_WAP_VIEW *View, USHORT keyId) { T_MMI_WAP_KEY_SELECTED_IND parameter; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_key_selected"); #endif parameter.object_id = View->object_id; parameter.keyId = keyId; M_MMI_WAP_KEY_SELECTED_IND(¶meter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_card scroll $Description: Scroll to a y position on the current card $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: View - the current view scrollPos - Y position on card to which to scroll *******************************************************************************/ T_WAP_RES ATB_wap_card_scroll(T_WAP_VIEW *View, SHORT scrollPos) { T_MMI_WAP_BROWSE_CONTROL_IND parameter; /* Make sure the scroll destination is on the card */ if (scrollPos > (View->cardHeight-WAP_SCREEN_HEIGHT)) scrollPos = View->cardHeight-WAP_SCREEN_HEIGHT; if (scrollPos<0) scrollPos = 0; /* Send the event */ parameter.object_id = View->object_id; parameter.browse_command = WAP_KEY_SCROLL; parameter.browse_parameter = (USHORT)scrollPos; M_MMI_WAP_BROWSE_CONTROL_IND(¶meter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_input_dialog_closed $Description: Provides the answer of an input dialog. $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: parameter - Dialog confirmation information *******************************************************************************/ T_WAP_RES ATB_wap_input_dialog_closed(T_MMI_WAP_INPUT_DIALOG_CNF *parameter) { T_MMI_WAP_DRAW_CARD_REQ current_card; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_input_dialog_closed"); #endif M_MMI_WAP_INPUT_DIALOG_CNF(parameter); current_card.object_id = parameter->object_id; M_MMI_WAP_DRAW_CARD_REQ(¤t_card); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_password_dialog_closed $Description: Provides the answer of a password dialog. $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: parameter - Dialog confirmation information *******************************************************************************/ T_WAP_RES ATB_wap_password_dialog_closed(T_MMI_WAP_PASSWORD_DIALOG_CNF *parameter) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_password_dialog_closed"); #endif M_MMI_WAP_PASSWORD_DIALOG_CNF(parameter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_confirm_dialog_closed $Description: Provides the answer of a confirmation dialog. $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: parameter - Dialog confirmation information *******************************************************************************/ T_WAP_RES ATB_wap_confirm_dialog_closed(T_MMI_WAP_CONFIRM_DIALOG_CNF *parameter) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_confirm_dialog_closed"); #endif M_MMI_WAP_CONFIRM_DIALOG_CNF(parameter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_info_dialog_closed $Description: Provides the answer of an info dialog. $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: parameter - Dialog confirmation information *******************************************************************************/ T_WAP_RES ATB_wap_info_dialog_closed(T_MMI_WAP_INFO_DIALOG_CNF *parameter) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_info_dialog_closed"); #endif M_MMI_WAP_INFO_DIALOG_CNF(parameter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_options_menu_select $Description: The AUI will notify to the WAP.ATB the id of the selected item $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: View - the current view *******************************************************************************/ T_WAP_RES ATB_wap_options_menu_select(T_WAP_VIEW *View) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_options_menu_select"); #endif ATB_wap_card_key_event(View, WAP_KEY_SELECT); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_buffer_add_element $Description: Add a new element to the element chain $Returns: Pointer to the element $Arguments: SPR#1721 - SH - Modified parameters slightly View - the current view type - the type of element (text, fieldset, image) *******************************************************************************/ T_WAP_ELEMENT * ATB_wap_buffer_add_element(T_WAP_VIEW *View, WAP_ELEMENT_TYPE type) { T_WAP_ELEMENT *Element; T_WAP_ELEMENT *ElementIndex; static USHORT elementCount = 0; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_buffer_add_element"); #endif if (!View) return; /* Create the element */ Element = (T_WAP_ELEMENT *)AUI_wap_memory_alloc(sizeof(T_WAP_ELEMENT)); /* If it's the first element in the chain, it forms the element chain header */ if (View->NewElementHeader == NULL) { View->NewElementHeader = Element; elementCount = 0; } /* Otherwise, find its place in the chain and add it */ else { ElementIndex = View->NewElementHeader; while(ElementIndex->NextElement !=NULL) ElementIndex = ElementIndex->NextElement; ElementIndex->NextElement = Element; } Element->type = type; Element->NextElement = NULL; elementCount++; return Element; } // xreddymn Jun-28-2005 MMI-SPR-32467 // Implementation for animated GIF image handling #ifdef FF_GPF_TCPIP // If value of WAP_MAX_ANIMATED_GIFS is changed, make sure // that ATB_animated_GIF_image_CB_list is also updated and // callbacks are added or removed as required. #define WAP_MAX_ANIMATED_GIFS 8 // Structure that stores details about an animated GIF image typedef struct { T_WAP_MMI_SEND_IMAGE_IND *image_ind; // Pointer to image indication received from WAP adapter T_MFW_HND timer_handle; // Handle to timer created to animate the GIF image UBYTE disposal; // Disposal method for the current frame UBYTE frame; // Currently displayed frame number (1 to n_frames) UBYTE n_frames; // Total number of frames in the animation S16 x; S16 y; S16 width; S16 height; void *pGIFInfo; } WAP_animated_GIF_image; WAP_animated_GIF_image WAP_animated_GIF_images[WAP_MAX_ANIMATED_GIFS]; S16 n_WAP_animated_GIF_elements = 0; #include "mfw_tim.h" #include "mfw_win.h" extern UBYTE wapmic_GIF_convert(void *pInfo, int frame, T_WAP_MMI_SEND_IMAGE_IND *input, T_WAP_MMI_SEND_IMAGE_IND *output, int *n_frames, UBYTE *delay, UBYTE *disposal); extern void wapmic_GIF_close_decoder(void *data); extern void *wapmic_GIF_open_decoder(void *data, int size); extern T_MFW_HND AUI_wap_get_win(void); extern void ATB_animated_GIF_image_CB (int index, T_MFW_EVENT event, MfwTim *tc); extern U32 mfwCheckMemoryLeft(void); extern U32 wapmicCheckMemoryLeft(void); extern void AUI_wap_restore_background(S32 x1, S32 y1, S32 x2, S32 y2); void WAP_FFS_log_message(char *s, int len); /******************************************************************************* $Function: ATB_animated_GIF_image_X_CB $Description: Callback functions to handle animated image timer expiries. $Returns: None. $Arguments: event = MFW event structure tc = pointer to MFW timer element *******************************************************************************/ void ATB_animated_GIF_image_0_CB (T_MFW_EVENT event, MfwTim *tc) { ATB_animated_GIF_image_CB(0, event, tc); } void ATB_animated_GIF_image_1_CB (T_MFW_EVENT event, MfwTim *tc) { ATB_animated_GIF_image_CB(1, event, tc); } void ATB_animated_GIF_image_2_CB (T_MFW_EVENT event, MfwTim *tc) { ATB_animated_GIF_image_CB(2, event, tc); } void ATB_animated_GIF_image_3_CB (T_MFW_EVENT event, MfwTim *tc) { ATB_animated_GIF_image_CB(3, event, tc); } void ATB_animated_GIF_image_4_CB (T_MFW_EVENT event, MfwTim *tc) { ATB_animated_GIF_image_CB(4, event, tc); } void ATB_animated_GIF_image_5_CB (T_MFW_EVENT event, MfwTim *tc) { ATB_animated_GIF_image_CB(5, event, tc); } void ATB_animated_GIF_image_6_CB (T_MFW_EVENT event, MfwTim *tc) { ATB_animated_GIF_image_CB(6, event, tc); } void ATB_animated_GIF_image_7_CB (T_MFW_EVENT event, MfwTim *tc) { ATB_animated_GIF_image_CB(7, event, tc); } // Array of callback functions void (*ATB_animated_GIF_image_CB_list[WAP_MAX_ANIMATED_GIFS]) (T_MFW_EVENT event, MfwTim *tc) = { ATB_animated_GIF_image_0_CB, ATB_animated_GIF_image_1_CB, ATB_animated_GIF_image_2_CB, ATB_animated_GIF_image_3_CB, ATB_animated_GIF_image_4_CB, ATB_animated_GIF_image_5_CB, ATB_animated_GIF_image_6_CB, ATB_animated_GIF_image_7_CB, }; /******************************************************************************* $Function: ATB_animated_GIF_image_CB $Description: Common callback function to handle animated image timer expiries. $Returns: None. $Arguments: index = When there is more than one animated GIF image being displayed, index is used to identify each image. event = MFW event structure tc = pointer to MFW timer element *******************************************************************************/ void ATB_animated_GIF_image_CB (int index, T_MFW_EVENT event, MfwTim *tc) { T_WAP_MMI_SEND_IMAGE_IND converted_image; UBYTE delay; UBYTE disposal; if(WAP_animated_GIF_images[index].frame == WAP_animated_GIF_images[index].n_frames) { WAP_animated_GIF_images[index].frame = 1; } else { WAP_animated_GIF_images[index].frame++; } // TRACE_EVENT_P1("\nATB_animated_GIF_image_CB, disposal = %d", WAP_animated_GIF_images[index].disposal); if((WAP_animated_GIF_images[index].disposal == 2) || (WAP_animated_GIF_images[index].disposal == 3)) { AUI_wap_restore_background(WAP_animated_GIF_images[index].x, WAP_animated_GIF_images[index].y, WAP_animated_GIF_images[index].x + WAP_animated_GIF_images[index].width, WAP_animated_GIF_images[index].y + WAP_animated_GIF_images[index].height); } if(wapmic_GIF_convert(WAP_animated_GIF_images[index].pGIFInfo, WAP_animated_GIF_images[index].frame, WAP_animated_GIF_images[index].image_ind, &converted_image, NULL, &delay, &disposal)) { WAP_animated_GIF_images[index].x = converted_image.pX + WAP_LEFT_BORDER; WAP_animated_GIF_images[index].y = converted_image.pY + WAP_TOP_BORDER; WAP_animated_GIF_images[index].width = converted_image.pWidth; WAP_animated_GIF_images[index].height = converted_image.pHeight; converted_image.bmpFormat = BMP_FORMAT_16BIT_LCD_COLOUR; if (ATB_wap_profile_setting(WAP_STATUS_SCALEIMAGES)) // Image is to be scaled { ATB_wap_buffer_image_scale((T_WAP_MMI_SEND_IMAGE_IND *)&converted_image); } else { ATB_wap_buffer_image_display((T_WAP_MMI_SEND_IMAGE_IND *)&converted_image); } micFree(converted_image.Image); WAP_animated_GIF_images[index].disposal = disposal; timSetTime(WAP_animated_GIF_images[index].timer_handle, delay * 10); timStart(WAP_animated_GIF_images[index].timer_handle); } else { timStop(WAP_animated_GIF_images[n_WAP_animated_GIF_elements].timer_handle); timDelete(WAP_animated_GIF_images[n_WAP_animated_GIF_elements].timer_handle); } } /******************************************************************************* $Function: ATB_animated_GIF_clear $Description: Stops all animating images, image data is not released by this function. Image data is released when LEa_freeObject is called by the browser. $Returns: None. $Arguments: None. *******************************************************************************/ void ATB_animated_GIF_clear(void) { S16 i; for(i = 0; i < n_WAP_animated_GIF_elements; i++) { timStop(WAP_animated_GIF_images[i].timer_handle); timDelete(WAP_animated_GIF_images[i].timer_handle); wapmic_GIF_close_decoder(WAP_animated_GIF_images[i].pGIFInfo); } n_WAP_animated_GIF_elements = 0; } /******************************************************************************* $Function: ATB_animate_GIF_image $Description: Called after displaying the first frame of a GIF image, this function will start a timer to animate the image. It also adds the image details to the WAP_animated_GIF_images array. $Returns: None. $Arguments: image_ind = Image indication containing details of the input GIF image delay = duration after which the first frame must be removed disposal = disposal method to use for the first frame n_frames = Total number of frames (this is obtained when the first frame is decoded) *******************************************************************************/ void ATB_animate_GIF_image(void *pGIFInfo, S16 x, S16 y, S16 width, S16 height, T_WAP_MMI_SEND_IMAGE_IND *image_ind, UBYTE delay, UBYTE disposal, UBYTE n_frames) { T_MFW_HND wap_win; S16 i; for(i = 0; i < n_WAP_animated_GIF_elements; i++) { if(WAP_animated_GIF_images[i].image_ind == image_ind) { return; } } wap_win=AUI_wap_get_win();//mfwParent(mfwHeader()); if(!wap_win) return; if(n_WAP_animated_GIF_elements < (WAP_MAX_ANIMATED_GIFS-1)) { WAP_animated_GIF_images[n_WAP_animated_GIF_elements].timer_handle = timCreate(wap_win, delay * 10, (MfwCb)ATB_animated_GIF_image_CB_list[n_WAP_animated_GIF_elements]); if(WAP_animated_GIF_images[n_WAP_animated_GIF_elements].timer_handle) { WAP_animated_GIF_images[n_WAP_animated_GIF_elements].pGIFInfo = pGIFInfo; WAP_animated_GIF_images[n_WAP_animated_GIF_elements].image_ind = image_ind; WAP_animated_GIF_images[n_WAP_animated_GIF_elements].disposal = disposal; WAP_animated_GIF_images[n_WAP_animated_GIF_elements].frame = 1; WAP_animated_GIF_images[n_WAP_animated_GIF_elements].n_frames = n_frames; WAP_animated_GIF_images[n_WAP_animated_GIF_elements].x=x+WAP_LEFT_BORDER; WAP_animated_GIF_images[n_WAP_animated_GIF_elements].y=y+WAP_TOP_BORDER; WAP_animated_GIF_images[n_WAP_animated_GIF_elements].width=width; WAP_animated_GIF_images[n_WAP_animated_GIF_elements].height=height; timStart(WAP_animated_GIF_images[n_WAP_animated_GIF_elements].timer_handle); n_WAP_animated_GIF_elements++; } } } #endif // FF_GPF_TCPIP /******************************************************************************* $Function: ATB_wap_buffer_display $Description: Displays the card from the buffer $Returns: None. $Arguments: View - the current view *******************************************************************************/ void ATB_wap_buffer_display(T_WAP_VIEW *View) { T_WAP_ELEMENT *Element = View->ElementHeader; USHORT elementCount = 0; /* No. of element */ SHORT titleX; /* Position of title to centre it */ SHORT titleWidth; /* Width of the title in pixels */ double doubleTemp; /* Temporary double value */ SHORT scrollBarSize; /* Size of scroll bar in pixels */ SHORT scrollBarPos; /* Y position of top of scroll bar */ SHORT lineX; /* First X position of line */ SHORT lineY; /* First Y position of line */ USHORT *temp; /* Temporary storage for text strings */ UBYTE scrollIndex; /* For drawing scrollbar */ USHORT titleLen; /* Length of title */ #ifdef FF_GPF_TCPIP // xreddymn Jun-28-2005 MMI-SPR-32467 T_WAP_MMI_SEND_IMAGE_IND *image_ind; T_WAP_MMI_SEND_IMAGE_IND converted_image; UBYTE delay; UBYTE disposal; int n_frames; SHORT dx, dy; #endif // FF_GPF_TCPIP #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_buffer_display"); #endif #ifdef FF_GPF_TCPIP // xreddymn Jun-28-2005 MMI-SPR-32467 ATB_animated_GIF_clear(); #endif // FF_GPF_TCPIP /* Display the title of the card, centred, over the line */ temp = (USHORT *)AUI_wap_memory_alloc((CARD_TITLE_MAX_LEN+1)*sizeof(USHORT)); /* SPR#1816 - SH - Obtain card title in MMI unicode */ if (ATB_wap_status_get(View, ATB_WAP_DOWNLOADING)) { /* Card is downloading */ titleLen = AUI_wap_stringID(temp, CARD_TITLE_MAX_LEN, WAP_STRING_DOWNLOADING); } else if (ATB_wap_status_get(View, ATB_WAP_CARD_READING)) { /* Card is updating */ titleLen = AUI_wap_stringID(temp, CARD_TITLE_MAX_LEN, WAP_STRING_UPDATING); } else { /* Normal card title */ titleLen = ATB_uc_text_copy(temp, View->Title, CARD_TITLE_MAX_LEN); } titleWidth = ATB_uc_text_width(temp, titleLen); /* Width of the title */ titleX = (WAP_TOTAL_WIDTH - titleWidth)/2; /* Position of title to centre it */ dspl_TextOut(titleX,0,DSPL_TXTATTR_SIGNED_COORDS | DSPL_TXTATTR_UNICODE, (char *)temp); AUI_wap_memory_free((UBYTE *)temp, (CARD_TITLE_MAX_LEN+1)*sizeof(USHORT)); /* Horizontal scroll bar and top line */ dspl_DrawLine(titleX-2, WAP_TOP_BORDER/2, 0, WAP_TOP_BORDER/2); /* Line to left of title */ dspl_DrawLine(WAP_TOTAL_WIDTH-titleX+1, WAP_TOP_BORDER/2, WAP_TOTAL_WIDTH-WAP_VSCROLLBAR_WIDTH, WAP_TOP_BORDER/2); /* Line to right of title */ if (View->cardWidth>WAP_SCREEN_WIDTH) { doubleTemp = WAP_HSCROLLBAR_WIDTH*(double)WAP_SCREEN_WIDTH/(double)View->cardWidth; scrollBarSize = (SHORT)(doubleTemp+0.5); /* Round to nearest int */ if (scrollBarSize>WAP_HSCROLLBAR_WIDTH) scrollBarSize = WAP_HSCROLLBAR_WIDTH; doubleTemp = WAP_HSCROLLBAR_WIDTH*(double)View->cardXPosition/(double)View->cardWidth; scrollBarPos = (SHORT)(doubleTemp+0.5); /* Round to nearest int */ for (scrollIndex=0; scrollIndex<scrollBarSize; scrollIndex++) { dspl_DrawLine(scrollBarPos+scrollIndex, 0, scrollBarPos+scrollIndex, WAP_TOP_BORDER/2); } if (WAP_HSCROLLBAR_WIDTH<(titleX-1)) dspl_DrawLine( WAP_HSCROLLBAR_WIDTH, 0, WAP_HSCROLLBAR_WIDTH, WAP_TOP_BORDER/2); } #ifdef FF_GPF_TCPIP //xrashmic 21 Jan, 2005 MMI-SPR-28223 pluginImageDisplayed=FALSE; #endif /* Display the elements of the card one by one */ while (Element!=NULL) { switch(Element->type) { case WAP_TEXT: /* Text Element */ ATB_wap_buffer_text_draw((T_WAP_MMI_SEND_TEXT_IND *)Element->data); break; //kyle 29 Jun, 2005 MMI-SPR-32462 case WAP_BORDER: #ifdef FF_GPF_TCPIP ATB_wap_buffer_border_draw((T_WAP_MMI_DRAW_BORDER_IND *)Element->data); #endif break; case WAP_TABLE: /* Table/Fieldset element */ ATB_wap_buffer_table_draw((T_WAP_MMI_SEND_TABLE_IND *)Element->data); break; case WAP_IMAGE: /* Image element */ #ifdef FF_GPF_TCPIP case WAP_PLUGIN_IMAGE://xrashmic 21 Jan, 2005 MMI-SPR-28223 //xrashmic 21 Jan, 2005 MMI-SPR-28223 //When there is a plugin image, we disable scroll. Storing this info in pluginImageDisplayed if(Element->type==WAP_IMAGE) pluginImageDisplayed=FALSE; else pluginImageDisplayed=TRUE; #endif // xreddymn Jun-28-2005 MMI-SPR-32467: Handling of GIF images #ifdef FF_GPF_TCPIP image_ind = Element->data; if(!image_ind) break; if((image_ind->image_length > 2) && (strncmp((char*)image_ind->Image, "GIF", 3) == 0)) { void *pGIFInfo; converted_image = *image_ind; pGIFInfo = wapmic_GIF_open_decoder(image_ind->Image, image_ind->image_length); if(wapmic_GIF_convert(pGIFInfo, 1, image_ind, &converted_image, &n_frames, &delay, &disposal)) { // TRACE_EVENT_P2("GIF image converted (%d, %d)",converted_image.pWidth, converted_image.pHeight); // TRACE_EVENT_P3("GIF frames=%d, delay=%d, disposal=%d",n_frames, delay, disposal); // TRACE_EVENT_P1("GIF URL = %s", wapmic_image_URL(image_ind->ImageReq)); converted_image.bmpFormat = BMP_FORMAT_16BIT_LCD_COLOUR; if (ATB_wap_profile_setting(WAP_STATUS_SCALEIMAGES)) // Image is to be scaled { ATB_wap_buffer_image_scale((T_WAP_MMI_SEND_IMAGE_IND *)&converted_image); } else { ATB_wap_buffer_image_display((T_WAP_MMI_SEND_IMAGE_IND *)&converted_image); } micFree(converted_image.Image); if(n_frames > 1) { if((converted_image.pX >= 0) && ((converted_image.pX + converted_image.pWidth - 1) < (WAP_LEFT_BORDER + WAP_SCREEN_WIDTH - 1)) && (converted_image.pY >= 0) && ((converted_image.pY + converted_image.pHeight - 1) < (WAP_TOP_BORDER + WAP_SCREEN_HEIGHT - 1))) { ATB_animate_GIF_image(pGIFInfo, converted_image.pX, converted_image.pY, converted_image.pWidth, converted_image.pHeight, image_ind, delay, disposal, n_frames); } else if(image_ind->pluginImage) { ATB_animate_GIF_image(pGIFInfo, converted_image.pX, converted_image.pY, converted_image.pWidth, converted_image.pHeight, image_ind, delay, disposal, n_frames); } } // Sep 06 2005 REF: MMI-SPR-34048 x0012849 //The ? symbol is appeared for pictures with single frame because decoder is not closed at all and after // few instances of deocder are opened, trying to open further will result in memory error. // To avoid this close the decoder each time its opened else { wapmic_GIF_close_decoder(pGIFInfo); } } else { USHORT elementX1, elementY1, elementX2, elementY2; elementX1 = (USHORT)image_ind->pX+WAP_LEFT_BORDER; elementY1 = (USHORT)image_ind->pY+WAP_TOP_BORDER; if(image_ind->pWidth < 14) { elementX2 = (USHORT)14 + elementX1 - 1; } else { elementX2 = (USHORT)image_ind->pWidth + elementX1 - 1; } if(image_ind->pHeight < 14) { elementY2 = (USHORT)14 + elementY1 - 1; } else { elementY2 = (USHORT)image_ind->pHeight + elementY1 - 1; } dspl_DrawRect(elementX1,elementY1, elementX2, elementY2); dspl_TextOut(elementX1 + 6, elementY1 + 0, DSPL_TXTATTR_SIGNED_COORDS, "?"); } } else #endif // FF_GPF_TCPIP { #ifdef FF_GPF_TCPIP ((T_WAP_MMI_SEND_IMAGE_IND *)Element->data)->transparency_flag = 0; #endif #ifdef FF_GPF_TCPIP if (ATB_wap_profile_setting(WAP_STATUS_SCALEIMAGES)) // Image is to be scaled #else if (View->Status & WAP_STATUS_SCALEIMAGES) #endif ATB_wap_buffer_image_scale((T_WAP_MMI_SEND_IMAGE_IND *)Element->data); else ATB_wap_buffer_image_display((T_WAP_MMI_SEND_IMAGE_IND *)Element->data); } break; } elementCount++; Element = Element->NextElement; /* Find the next element */ } /* Vertical scroll bar and right frame */ scrollBarSize = WAP_SCREEN_HEIGHT*WAP_SCREEN_HEIGHT/View->cardHeight; if (scrollBarSize>WAP_SCREEN_HEIGHT) scrollBarSize = WAP_SCREEN_HEIGHT; scrollBarPos = WAP_SCREEN_HEIGHT*View->cardYPosition/View->cardHeight; dspl_DrawLine(WAP_TOTAL_WIDTH-WAP_VSCROLLBAR_WIDTH, WAP_TOP_BORDER/2, WAP_TOTAL_WIDTH-WAP_VSCROLLBAR_WIDTH, WAP_SCREEN_BOTTOM); /* Line to top of bar */ for (scrollIndex=1; scrollIndex<WAP_VSCROLLBAR_WIDTH; scrollIndex++) { dspl_DrawLine(WAP_TOTAL_WIDTH-WAP_VSCROLLBAR_WIDTH+scrollIndex, scrollBarPos+WAP_TOP_BORDER, WAP_TOTAL_WIDTH-WAP_VSCROLLBAR_WIDTH+scrollIndex, scrollBarPos+WAP_TOP_BORDER+scrollBarSize); } return; } /******************************************************************************* $Function: ATB_wap_buffer_text_draw $Description: Draws text $Returns: None. $Arguments: parameter - the send text event *******************************************************************************/ static void ATB_wap_buffer_text_draw(T_WAP_MMI_SEND_TEXT_IND *parameter) { USHORT *temp; /* SPR#1816 - SH - Unicode string storage */ SHORT elementX; /* X position of element on-screen */ SHORT elementY; /* Y position of element on-screen */ USHORT textWidth; /* Width of text to draw */ USHORT textLength; /* SPR#1816 - SH - Length of text */ textWidth = parameter->pWidth; if ((textWidth + parameter->pX)>WAP_SCREEN_WIDTH) /* if text goes off the screen, */ textWidth = WAP_SCREEN_WIDTH-parameter->pX; /* cut it down to size */ elementX = (USHORT)parameter->pX+WAP_LEFT_BORDER; /* Absolute position of text */ elementY = (USHORT)parameter->pY+WAP_TOP_BORDER; /* on screen */ /* Draw special text features */ switch(parameter->type) { case WAP_TEXT_OPTION: // Apr 28 2005 REF: MMI-SPR-30400 x0012849 // To see that box aligns with the text. #ifdef FF_GPF_TCPIP elementY+=OFFSET_CHECKBOX; #endif /* An options menu item - draw checkbox */ dspl_DrawRect(elementX, elementY+WAP_CHECKBOX_TOP, \ elementX+WAP_CHECKBOX_WIDTH-1, \ elementY+WAP_CHECKBOX_TOP+WAP_CHECKBOX_HEIGHT-1); /* Draw check if item is selected */ if (parameter->selected) { dspl_DrawRect(elementX+WAP_CHECKBOX_INDENT, \ elementY+WAP_CHECKBOX_TOP+WAP_CHECKBOX_INDENT, \ elementX+WAP_CHECKBOX_WIDTH-1-WAP_CHECKBOX_INDENT, \ elementY+WAP_CHECKBOX_TOP+WAP_CHECKBOX_HEIGHT-1-WAP_CHECKBOX_INDENT); } /* Shift text to right to make space for checkbox */ elementX += (WAP_CHECKBOX_WIDTH+WAP_CHECKBOX_RIGHT); textWidth -= (WAP_CHECKBOX_WIDTH+WAP_CHECKBOX_RIGHT); // Apr 28 2005 REF: MMI-SPR-30400 x0012849 // To see that box aligns with the text. #ifdef FF_GPF_TCPIP elementY-=OFFSET_CHECKBOX; #endif break; case WAP_TEXT_OPTIONGROUP: /* Option group titles are currently not distinguished from normal text */ break; } /* SPR#1816 - SH - Allocate memory for unicode string */ temp = (USHORT *)AUI_wap_memory_alloc((parameter->text_length+1)*sizeof(USHORT)); /* SPR#1816 - SH - Copy text and convert to MMI unicode */ ATB_uc_text_copy(temp, parameter->Text, (USHORT)parameter->text_length); ATB_uc_text_convert(temp, (USHORT)parameter->text_length); /* SPR#1816 - SH - Swap bytes of unicode */ /* SPR#1816 - SH - Crop text to fit width */ // Apr 28 2005 REF: MMI-SPR-30400 x0012849 // For the text of the Drop down menu , no need to crop the text, instead call // ATB_uc_text_cut, which will return the text that will fit to the screen, otherwise scroll bar will be // overwritten with the text. if(WAP_TEXT_OPTION == parameter->type ) textLength = ATB_uc_text_cut(temp, parameter->text_length, textWidth); else textLength = ATB_uc_text_crop(temp, parameter->text_length, textWidth); if (!parameter->invert) dspl_TextOut((USHORT)elementX,(USHORT)elementY,DSPL_TXTATTR_SIGNED_COORDS | DSPL_TXTATTR_UNICODE,(char*)temp); else dspl_TextOut((USHORT)elementX,(USHORT)elementY,DSPL_TXTATTR_INVERS | DSPL_TXTATTR_SIGNED_COORDS | DSPL_TXTATTR_UNICODE, (char*)temp); AUI_wap_memory_free((UBYTE *)temp, (parameter->text_length+1)*sizeof(USHORT)); return; } /******************************************************************************* $Function: ATB_wap_buffer_border_draw $Description: Draws border //kyle 29 Jun, 2005 MMI-SPR-32462 $Returns: None. $Arguments: *******************************************************************************/ #ifdef FF_GPF_TCPIP static void ATB_wap_buffer_border_draw(T_WAP_MMI_DRAW_BORDER_IND *parameter) { LAYOUT_BORDER bottom, left, right, top; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_buffer_border_draw"); #endif bottom = parameter->borderBottom; left = parameter->borderLeft; right = parameter->borderRight; top = parameter->borderTop; if (bottom.cssPropCode != CSS_VALUE_NONE) { bottom.pX += WAP_LEFT_BORDER; bottom.pY += WAP_TOP_BORDER; dspl_DrawFilledRect(bottom.pX, bottom.pY, bottom.pX + bottom.pWidth, bottom.pY + bottom.pHeight); } if (left.cssPropCode != CSS_VALUE_NONE) { left.pX += WAP_LEFT_BORDER; left.pY += WAP_TOP_BORDER; dspl_DrawFilledRect(left.pX, left.pY, left.pX + left.pWidth, left.pY + left.pHeight); } if (right.cssPropCode != CSS_VALUE_NONE) { right.pX += WAP_LEFT_BORDER; right.pY += WAP_TOP_BORDER; dspl_DrawFilledRect(right.pX, right.pY, right.pX + right.pWidth, right.pY + right.pHeight); } if (top.cssPropCode != CSS_VALUE_NONE) { top.pX += WAP_LEFT_BORDER; top.pY += WAP_TOP_BORDER; dspl_DrawFilledRect(top.pX, top.pY, top.pX + top.pWidth, top.pY + top.pHeight); } return; } #endif /******************************************************************************* $Function: ATB_wap_buffer_table_draw $Description: Draws a table, or a fieldset $Returns: None. $Arguments: parameter - the send table event *******************************************************************************/ static void ATB_wap_buffer_table_draw(T_WAP_MMI_SEND_TABLE_IND *parameter) { SHORT elementX = parameter->pX+WAP_LEFT_BORDER; /* Left edge position of table/fieldset */ SHORT elementY = parameter->pY+WAP_TOP_BORDER; /* Top edge position of table/fieldset */ SHORT top = elementY+WAP_CHAR_HEIGHT/2; /* Top of fieldset */ SHORT bottom = elementY+parameter->pHeight-1; /* Bottom of table/fieldset */ SHORT right = elementX+parameter->pWidth-1; /* Right side of table/fieldset */ SHORT lineX; /* X position of column line */ SHORT lineY; /* Y position of row line */ USHORT *temp; /* Temp storage for title. */ USHORT titleWidth; /* Width of the title in pixels */ USHORT titleLength; /* Length of title */ USHORT index; /* Index for columns and rows */ #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_buffer_table_draw"); TRACE_EVENT_P4( "Fieldset/table pX, pY, pWidth, pHeight: %d, %d, %d, %d", parameter->pX, parameter->pY, parameter->pWidth, parameter->pHeight); #endif /* Convert title to MMI Unicode */ temp = (USHORT *)AUI_wap_memory_alloc((parameter->title_length+1)*sizeof(USHORT)); titleLength = parameter->title_length; ATB_uc_text_copy(temp, parameter->Title, titleLength); ATB_uc_text_convert(temp, titleLength); /* Convert to MMI unicode */ /* Crop title if it overshoots screen */ if ((parameter->pX+gle_fieldset_spaceLeft+ATB_uc_text_width(temp, titleLength)) > WAP_SCREEN_WIDTH) { titleLength = ATB_uc_text_crop(temp, titleLength, WAP_SCREEN_WIDTH-parameter->pX-gle_fieldset_spaceLeft); } /* Crop title if it overshoots edge of fieldset */ if ((gle_fieldset_spaceLeft+ATB_uc_text_width(temp, titleLength)+gle_fieldset_spaceRight) > parameter->pWidth) { titleLength = ATB_uc_text_crop(temp, titleLength, parameter->pWidth-gle_fieldset_spaceLeft-gle_fieldset_spaceRight); } titleWidth = ATB_uc_text_width(temp, titleLength); /* Width of the title */ /* Display title if it's onscreen */ if (parameter->pY >= 0 && parameter->pY < WAP_TEXT_LOWEST) { dspl_TextOut(elementX+gle_fieldset_spaceLeft, elementY, DSPL_TXTATTR_SIGNED_COORDS | DSPL_TXTATTR_UNICODE, (char *)temp); } AUI_wap_memory_free((UBYTE *)temp, (parameter->title_length+1)*sizeof(USHORT)); /* Horizontal lines */ lineY = elementY+gle_cell_vBefore; ATB_wap_buffer_line_draw(elementX, bottom, right, bottom); /* Bottom line of table */ if (parameter->rows_length > 0) ATB_wap_buffer_line_draw(elementX, lineY, right, lineY); /* Line under title */ else { ATB_wap_buffer_line_draw(elementX+gle_fieldset_spaceLeft-2, top, elementX, top); /* Line to left of title */ ATB_wap_buffer_line_draw(elementX+gle_fieldset_spaceLeft+titleWidth+2, top, right, top); /* right */ } /* Row lines */ if (parameter->rows_length > 1) { for (index=0; index<(parameter->rows_length-1); index++) { lineY += parameter->RowHeight[index]+gle_cell_spaceToBorder; ATB_wap_buffer_line_draw(elementX, lineY, right, lineY); lineY += gle_cell_borderExtent+gle_cell_spaceToBorder; } } /* Vertical lines */ lineX = elementX+gle_cell_hBefore; if (parameter->rows_length == 0) lineY = top; /* For fieldset */ else lineY = elementY+gle_cell_vBefore; /* For table */ ATB_wap_buffer_line_draw(elementX, lineY, elementX, bottom); /* Left hand line */ /* Column lines */ if (parameter->cols_length > 1) { for (index=0; index<(parameter->cols_length-1); index++) { lineX += parameter->ColWidth[index]+gle_cell_spaceToBorder; ATB_wap_buffer_line_draw(lineX, lineY, lineX, bottom); lineX += gle_cell_borderExtent+gle_cell_spaceToBorder; } } ATB_wap_buffer_line_draw(right, lineY, right, bottom); /* Right hand line */ return; } /******************************************************************************* $Function: ATB_wap_buffer_line_draw $Description: Draws a line, making sure it fits on-screen $Returns: None. $Arguments: x1,y1 - Coordinates of the start of the line x2,y2 - Coordinates of the end of the line *******************************************************************************/ static void ATB_wap_buffer_line_draw(SHORT x1, SHORT y1, SHORT x2, SHORT y2) { SHORT deltaX1; SHORT deltaY1; SHORT deltaX2; SHORT deltaY2; double m; ATB_wap_buffer_onscreen(x1,y1, &deltaX1, &deltaY1); ATB_wap_buffer_onscreen(x2,y2, &deltaX2, &deltaY2); if (x2==x1) { if (deltaX1) return; y1+=deltaY1; y2+=deltaY2; } else if (y2==y1) { if (deltaY1) return; x1+=deltaX1; x2+=deltaX2; } else { m = (y2-y1)/(x2-x1); if (deltaX1 || deltaY1) { x1 += deltaX1; y1 += m*deltaX1; if (!ATB_wap_buffer_onscreen(x1,y1,&deltaX1,&deltaY1)) return; } if (deltaX2 || deltaY2) { x2 += deltaX2; y2 += m*deltaX2; if (!ATB_wap_buffer_onscreen(x2,y2,&deltaX2,&deltaY2)) return; } } dspl_DrawLine(x1,y1,x2,y2); return; } /******************************************************************************* $Function: ATB_wap_buffer_onscreen $Description: Returns TRUE if the point supplied is on-screen $Returns: TRUE if point is onscreen $Arguments: x,y - coordinates of the point deltaX, deltaY - returns offset from screen *******************************************************************************/ static BOOL ATB_wap_buffer_onscreen(SHORT x, SHORT y, SHORT *deltaX, SHORT *deltaY) { BOOL outcome = TRUE; *deltaX = 0; *deltaY = 0; if (x<WAP_LEFT_BORDER) { outcome = FALSE; *deltaX = WAP_LEFT_BORDER-x; } if (x>(WAP_SCREEN_RIGHT-1)) { outcome = FALSE; *deltaX = (WAP_SCREEN_RIGHT-1)-x; } if (y<WAP_TOP_BORDER) { outcome = FALSE; *deltaY = WAP_TOP_BORDER-y; } if (y>(WAP_SCREEN_BOTTOM-1)) { outcome = FALSE; *deltaY = (WAP_SCREEN_BOTTOM-1)-y; } return outcome; } /******************************************************************************* $Function: ATB_wap_buffer_image_display $Description: Trims an image to fit into the specified space, then displays it $Returns: None. $Arguments: image - the image to display *******************************************************************************/ #ifdef FF_GPF_TCPIP #define RGB16(r,g,b) (( ((b & 0xf8) >> 3) | ((g & 0xfc) << 3) | ((r & 0xf8) << 8) )) #define RGB32(r,g,b) (( (r << 16) & 0x00FF0000) | ((g << 8) & 0x0000FF00) | ( b & 0x000000FF)) #endif static void ATB_wap_buffer_image_display(T_WAP_MMI_SEND_IMAGE_IND *image) { UBYTE *Region; /* Pointer to trimmed image */ SHORT offsetX = 0; /* Offsets from origin of original image... */ SHORT offsetY = 0; /* ...where trimmed image starts */ SHORT scrWidth = image->pWidth; /* Width of trimmed image on screen */ SHORT scrHeight = image->pHeight; /* Height of trimmed image on screen */ SHORT elementX; /* Its x position on the screen */ SHORT elementY; /* Its y position on the screen */ USHORT byteWidth; /* Width of original in bytes */ USHORT scrByteWidth; /* Width of screen image in bytes */ USHORT offsetByteWidth; USHORT heightIndex; USHORT widthIndex; USHORT memIndex = 0; UBYTE *Image = image->Image; /* The image data */ UBYTE pixShift; /* Pixel shift, shift bytes by this amount */ #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_buffer_image_display"); #endif byteWidth = image->pWidth/8; if (image->pWidth % 8) byteWidth++; elementX = image->pX; elementY = image->pY; /* If image starts off the left of the screen */ if (elementX < 0) { offsetX = -elementX; /* Set the X offset so it is trimmed appropriately */ scrWidth -= offsetX; /* Change its width */ elementX = 0; /* And place it at the left of the screen */ } /* If image starts above the top of the screen */ if (image->pY < 0) { offsetY = -elementY; /* Set the Y offset so it is trimmed appropriately */ scrHeight -= offsetY; /* Change its height */ elementY = 0; /* And place it at the top of the screen */ } /* If the image goes off the right of the screen, reduce its width */ if ((elementX+scrWidth)>WAP_SCREEN_WIDTH) scrWidth = WAP_SCREEN_WIDTH-elementX; /* If the image goes off the bottom of the screen, trim its height */ if ((elementY+scrHeight)>WAP_SCREEN_HEIGHT) scrHeight = WAP_SCREEN_HEIGHT-elementY; scrByteWidth = scrWidth/8; /* Work out the width of the trimmed image in bytes */ if (scrWidth % 8) scrByteWidth++; #ifdef FF_GPF_TCPIP if (image->bmpFormat == BMP_FORMAT_16BIT_LCD_COLOUR) { long ColorVal; UINT32 clr; unsigned char* p; int x, y; #if 0 for (x = 0; x < image->pWidth; x++) { for (y = 0; y < image->pHeight; y++) { p = (unsigned char*)(image->Image + ((y * image->pWidth + x) * 2)); ColorVal = 256*(p[0]) + (p[1]); clr = RGB32( (((0xf800 & ColorVal)>>11) << 3), (((0x07e0 & ColorVal)>>5) << 2), ((0x1f & ColorVal) << 3) ); scrPoint(image->pX + WAP_LEFT_BORDER + x, image->pY + WAP_TOP_BORDER + y, clr); } } #else if((scrWidth > 0) && (scrHeight > 0)) { int offset = (offsetY * image->pWidth + offsetX) << 1; int old_offset; UINT16 col16; UBYTE *data = image->Image; int imageX = image->pX; int imageY = image->pY; if(imageX < 0) imageX = 0; if(imageY < 0) imageY = 0; imageX += WAP_LEFT_BORDER; imageY += WAP_TOP_BORDER; if(image->transparency_flag) { for(y = 0; y < scrHeight; y++) { old_offset = offset; for(x = 0; x < scrWidth; x++) { col16 = data[offset++] << 8; col16 |= data[offset++]; if(col16 != 0xAAAA) { clr = RGB32( (((0xf800 & col16)>>11) << 3), (((0x07e0 & col16)>>5) << 2), ((0x1f & col16) << 3) ); scrPoint(imageX + x, imageY + y, clr); } } offset = old_offset + (image->pWidth << 1); } } else { for(y = 0; y < scrHeight; y++) { old_offset = offset; for(x = 0; x < scrWidth; x++) { col16 = data[offset++] << 8; col16 |= data[offset++]; clr = RGB32( (((0xf800 & col16)>>11) << 3), (((0x07e0 & col16)>>5) << 2), ((0x1f & col16) << 3) ); scrPoint(imageX + x, imageY + y, clr); } offset = old_offset + (image->pWidth << 1); } } } #endif // dspl_BitBlt2(image->pX + WAP_LEFT_BORDER, image->pY + WAP_TOP_BORDER, image->pWidth, image->pHeight, (void *)image->Image, 0, image->bmpFormat); return; } #endif /* Allocate memory for the trimmed image */ Region = (UBYTE *)AUI_wap_memory_alloc(scrByteWidth*scrHeight); offsetByteWidth = offsetX/8; pixShift = offsetX % 8; /* Offset within the byte of the first pixel */ Image += (offsetY*byteWidth)+offsetByteWidth; /* Point to the first byte of the region to be isolated */ /* Copy the trimmed region of the image into our allocated memory, * inverting it as necessary */ for (heightIndex = 0; heightIndex<scrHeight; heightIndex++) { for (widthIndex = 0; widthIndex<scrByteWidth; widthIndex++) { Region[memIndex] = Image[widthIndex] << pixShift; if ((offsetByteWidth+scrByteWidth)<byteWidth || widthIndex<(scrByteWidth-1)) Region[memIndex] |= Image[widthIndex+1] >> (8-pixShift); if (!image->invert) Region[memIndex] ^= 0xFF; /* De-invert it if not selected */ memIndex++; } Image += byteWidth; /* Move down one line */ } #ifdef TRACE_ATBWAPAUI TRACE_EVENT_P2( "byteWidth: %d, scrByteWidth: %d", byteWidth, scrByteWidth); TRACE_EVENT_P4( "pX: %d, pY: %d, pWidth: %d, pHeight: %d", image->pX, image->pY, image->pWidth, image->pHeight); TRACE_EVENT_P4( "offsetX: %d, offsetY: %d, scrWidth: %d, scrHeight: %d", offsetX, offsetY, scrWidth, scrHeight); TRACE_EVENT_P2( "elementX: %d, elementY: %d", elementX, elementY); TRACE_EVENT_P2( "Region size: %d, should be: %d", memIndex, scrByteWidth*scrHeight); #endif /* Display the image */ dspl_BitBlt (elementX+WAP_LEFT_BORDER, elementY+WAP_TOP_BORDER, scrWidth, scrHeight, 0, (void *)Region, 0); /* Free the memory */ AUI_wap_memory_free(Region, scrByteWidth*scrHeight); return; } /******************************************************************************* $Function: ATB_wap_buffer_image_scale $Description: Scales an image to fit into a specified space $Returns: None. $Arguments: View - pointer to the appropriate view *******************************************************************************/ static void ATB_wap_buffer_image_scale(T_WAP_MMI_SEND_IMAGE_IND *image) { T_WAP_MMI_SEND_IMAGE_IND *Scaled = NULL; SHORT newWidth; SHORT newHeight; USHORT heightIndex; USHORT widthIndex; USHORT oldIndex; USHORT newIndex; USHORT byteWidth; USHORT scrByteWidth; UBYTE *Image = image->Image; UBYTE oldMask; /* Pixel shift, shift bytes by this amount */ UBYTE newMask; UBYTE pixel; USHORT xScale; USHORT xScaleOld; USHORT yScale; USHORT yScaleOld; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_buffer_image_scale"); #endif #ifdef FF_GPF_TCPIP if (image->bmpFormat == BMP_FORMAT_16BIT_LCD_COLOUR) { ATB_wap_buffer_image_display(image); return; } #endif Scaled = (T_WAP_MMI_SEND_IMAGE_IND *)AUI_wap_memory_alloc(sizeof(T_WAP_MMI_SEND_IMAGE_IND)); // Pointer to scaled image /* Squash to fit horizontally */ if (image->pWidth > WAP_SCREEN_WIDTH) newWidth = WAP_SCREEN_WIDTH; else newWidth = image->pWidth; /* Squash to fit vertically */ if (image->pHeight > WAP_SCREEN_HEIGHT) newHeight = WAP_SCREEN_HEIGHT; else newHeight = image->pHeight; /* Work out the width of the original image in bytes */ byteWidth = image->pWidth/8; if (image->pWidth % 8) byteWidth++; /* Work out the width of the scaled image in bytes */ scrByteWidth = newWidth/8; if (newWidth % 8) scrByteWidth++; /* Allocate memory for the scaled image */ Scaled->Image = (UBYTE *)AUI_wap_memory_alloc(scrByteWidth*newHeight); oldIndex = -1; newIndex = -1; yScaleOld = 0; /* Scale the image */ for (heightIndex = 0; heightIndex<image->pHeight; heightIndex++) { yScale = (USHORT) (heightIndex+1)*newHeight/image->pHeight; if (yScale != yScaleOld) { oldMask = 1; /* Mask within the byte of the first pixel */ newMask = 1; xScaleOld = 0; for (widthIndex = 0; widthIndex<image->pWidth; widthIndex++) { xScale = (USHORT) (widthIndex+1)*newWidth/image->pWidth; if (oldMask == 1) { oldMask = 128; oldIndex++; } else oldMask /= 2; if (xScale != xScaleOld) { if (newMask == 1) { newMask = 128; newIndex++; Scaled->Image[newIndex] = 0; } else newMask /= 2; if (Image[oldIndex] & oldMask) /* If old pixel set, */ Scaled->Image[newIndex] |= newMask; /* set new pixel */ } xScaleOld = xScale; } } else { oldIndex += byteWidth; } yScaleOld = yScale; } #ifdef TRACE_ATBWAPAUI TRACE_EVENT_P2( "byteWidth: %d, scrByteWidth: %d", byteWidth, scrByteWidth); TRACE_EVENT_P4( "pX: %d, pY: %d, pWidth: %d, pHeight: %d", image->pX, image->pY, image->pWidth, image->pHeight); TRACE_EVENT_P2( "newWidth: %d, newHeight: %d", newWidth, newHeight); #endif /* Display the image */ Scaled->object_id = image->object_id; Scaled->image_length = scrByteWidth*newHeight; Scaled->invert = image->invert; Scaled->pX = image->pX; Scaled->pY = image->pY; Scaled->pWidth = newWidth; Scaled->pHeight = newHeight; Scaled->selected = image->selected; ATB_wap_buffer_image_display(Scaled); /* Free the memory */ AUI_wap_memory_free(Scaled->Image, scrByteWidth*newHeight); AUI_wap_memory_free((UBYTE *)Scaled, sizeof(T_WAP_MMI_SEND_IMAGE_IND)); return; } /******************************************************************************* $Function: ATB_wap_buffer_clear $Description: Clears the element buffer $Returns: None. $Arguments: View - pointer to the appropriate view *******************************************************************************/ void ATB_wap_buffer_clear(T_WAP_VIEW *View) { T_WAP_ELEMENT *Element = View->ElementHeader; T_WAP_ELEMENT *NextElement; T_WAP_MMI_SEND_TEXT_IND *TextElement; T_WAP_MMI_SEND_TABLE_IND *TableElement; T_WAP_MMI_SEND_IMAGE_IND *ImageElement; USHORT elementCount = 0; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_buffer_clear"); #endif #ifdef FF_GPF_TCPIP // xreddymn Jun-28-2005 MMI-SPR-32467 ATB_animated_GIF_clear(); #endif // FF_GPF_TCPIP while (Element != NULL) { switch (Element->type) { case WAP_TEXT: /* Delete a text element */ TextElement = (T_WAP_MMI_SEND_TEXT_IND *)Element->data; if (TextElement->text_length != 0) AUI_wap_memory_free((UBYTE *)TextElement->Text, TextElement->text_length*sizeof(USHORT)); if (TextElement->formatstring_length != 0) { AUI_wap_memory_free((UBYTE *)TextElement->Formatstring, TextElement->formatstring_length*sizeof(USHORT)); } AUI_wap_memory_free((UBYTE *)TextElement, sizeof(T_WAP_MMI_SEND_TEXT_IND)); break; case WAP_TABLE: /* Delete a table/fieldset element */ TableElement = (T_WAP_MMI_SEND_TABLE_IND *)Element->data; if (TableElement->title_length != 0) AUI_wap_memory_free((UBYTE *)TableElement->Title, TableElement->title_length*sizeof(USHORT)); if (TableElement->cols_length != 0) AUI_wap_memory_free((UBYTE *)TableElement->ColWidth, TableElement->cols_length*sizeof(SHORT)); if (TableElement->rows_length != 0) AUI_wap_memory_free((UBYTE *)TableElement->RowHeight, TableElement->rows_length*sizeof(SHORT)); AUI_wap_memory_free((UBYTE *)TableElement, sizeof(T_WAP_MMI_SEND_TABLE_IND)); break; case WAP_IMAGE: /* Delete an image element */ ImageElement = (T_WAP_MMI_SEND_IMAGE_IND *)Element->data; if (ImageElement->image_length != 0) AUI_wap_memory_free((UBYTE *)ImageElement->Image, ImageElement->image_length*sizeof(UBYTE)); AUI_wap_memory_free((UBYTE *)ImageElement, sizeof(T_WAP_MMI_SEND_IMAGE_IND)); break; } NextElement = Element->NextElement; AUI_wap_memory_free((UBYTE *)Element, sizeof(T_WAP_ELEMENT)); Element = NextElement; elementCount++; } /* Element chain is now empty */ View->ElementHeader = NULL; return; } /******************************************************************************* $Function: ATB_wap_buffer_identify_element $Description: Identifies which element is selected (based on the invert property) and returns an appropriate type. $Returns: The type of the element that is selected, or NULL if none $Arguments: View - pointer to the view *******************************************************************************/ UBYTE ATB_wap_buffer_identify_element(T_WAP_VIEW *View) { T_WAP_ELEMENT *Element = View->ElementHeader; T_WAP_MMI_SEND_TEXT_IND *TextElement; T_WAP_MMI_SEND_IMAGE_IND *ImageElement; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_buffer_identify_element"); #endif while (Element!=NULL) { switch (Element->type) { case WAP_TEXT: TextElement = (T_WAP_MMI_SEND_TEXT_IND *)Element->data; if (TextElement->invert) { return TextElement->type; } break; case WAP_IMAGE: #ifdef FF_GPF_TCPIP case WAP_PLUGIN_IMAGE: //xrashmic 21 Jan, 2005 MMI-SPR-28223 ImageElement = (T_WAP_MMI_SEND_IMAGE_IND *)Element->data; //xrashmic 28 Jan, 2005 MMI-SPR-28166 //When the card contains the plugin Image, we need to send this //indication, so that Save can be provided in the option menu if(ImageElement->pluginImage) { return WAP_PLUGINIMAGE; } else if (ImageElement->invert) { return WAP_SELECTABLE_IMAGE; } #else if (ImageElement->invert) { return WAP_SELECTABLE_IMAGE; } #endif break; } Element = Element->NextElement; } /* Element not identified */ return NULL; } /******************************************************************************* $Function: ATB_wap_profile_read $Description: Reads in the specified profile and changes the ProfileId $Returns: WAP_OK $Arguments: View - Pointer to the current view ProfileId - the id of the profile to read from the flash *******************************************************************************/ #ifdef FF_GPF_TCPIP T_WAP_RES ATB_wap_profile_read(T_WAP_VIEW *View, UBYTE ProfileId) { T_WAP_VIEW *ViewIndex; T_WAP_PROFILE *Profile = &(WapProfilesData->Profile[ProfileId]); #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_profile_read"); #endif if (View_header==NULL || Profile==NULL) { return WAP_FAIL; } WapData->ProfileId = ProfileId; /* SPR#2086 - SH - Change the profile for all open views */ ViewIndex = View_header; while (ViewIndex!=NULL) { ViewIndex->ProfileId = ProfileId; ViewIndex->Profile = Profile; /* Go to next view */ ViewIndex = ViewIndex->NextView; } return WAP_OK; } #else /* #ifdef FF_GPF_TCPIP */ T_WAP_RES ATB_wap_profile_read(T_WAP_VIEW *View, UBYTE ProfileId) { T_WAP_PROFILE *Profile = View->Profile; UBYTE entryIndex; char *Entry; char *URL; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_profile_read"); #endif View->ProfileId = ProfileId; View->Profile = &(WapProfilesData->Profile[View->ProfileId]); #ifndef GPRS /* SPR#2324 - SH - Ensure that all profiles are of dialup type if GPRS is off */ if (View->Profile->AccessType==WAP_GPRS_DATA) { View->Profile->AccessType = WAP_CS_DATA; } #endif return WAP_OK; } #endif /* !#ifdef FF_GPF_TCPIP */ /******************************************************************************* $Function: ATB_wap_profile_names_read $Description: Reads into RAM the names of all profiles stored in flash, also the global bookmarks and history lists $Returns: WAP_OK $Arguments: Profile - Pointer to the current profile *******************************************************************************/ T_WAP_RES ATB_wap_profile_names_read(T_WAP_VIEW *View) { T_WAP_PROFILE *Profile; T_WAP_LIST *ProfilesList = View->ProfilesList; USHORT no_of_bookmarks; T_WAP_LIST *Bookmarks = View->Bookmarks; T_WAP_LIST *BookmarksURL = View->BookmarksURL; USHORT no_of_history; T_WAP_LIST *History = View->History; T_WAP_LIST *HistoryURL = View->HistoryURL; UBYTE entryIndex; char *Entry; char *URL; UBYTE no_of_profiles; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_profile_names_read"); #endif /* SPR#2086 - SH - FFS files now read when view created. * Read in number of profiles. */ #ifdef CO_UDP_IP /* Default values are provided. If either of the files 'mmi/wapdata' * or 'mmi/wapprof' aren't found, files is created with these defaults. * The '0' size indicator indicates that one of the files was not present. */ if (flash_wap_read() == 0) { ATB_wap_profile_default_create(FALSE); /* SPR#2324 */ } View->Status = WapData->Status; /* Status flags for settings */ View->ProfileId = WapData->ProfileId; /* Default starting profile */ /* Read in profiles list */ #endif no_of_profiles = WapData->no_of_profiles; ProfilesList->no_of_entries = no_of_profiles; /* Get list of profile names */ for (entryIndex = 0; entryIndex<MAX_PROFILES; entryIndex++) { ProfilesList->Entry[entryIndex] = (char *)WapProfilesData->Profile[entryIndex].Title; } /* Read in bookmarks */ no_of_bookmarks = WapData->no_of_bookmarks; Bookmarks->no_of_entries = no_of_bookmarks; BookmarksURL->no_of_entries = no_of_bookmarks; /* SPR#1816 - SH - Cast to char */ for (entryIndex = 0; entryIndex<MAX_BOOKMARKS; entryIndex++) { Bookmarks->Entry[entryIndex] = (char *)WapData->Bookmarks[entryIndex]; BookmarksURL->Entry[entryIndex] = WapData->BookmarksURL[entryIndex]; } /* Read in history entries */ no_of_history = WapData->no_of_history; History->no_of_entries = no_of_history; HistoryURL->no_of_entries = no_of_history; for (entryIndex = 0; entryIndex<MAX_HISTORY; entryIndex++) { History->Entry[entryIndex] = (char *)WapData->History[entryIndex]; HistoryURL->Entry[entryIndex] = WapData->HistoryURL[entryIndex]; } return WAP_OK; } /******************************************************************************* $Function: ATB_wap_profile_save $Description: Store the current updated profile in flash $Returns: WAP_OK $Arguments: View - Pointer to the current view *******************************************************************************/ #ifdef FF_GPF_TCPIP T_WAP_RES ATB_wap_profile_save(T_WAP_VIEW *View) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_profile_save"); #endif /* SPR#2086 - SH - Write bookmarks information only if this is * a browser view */ if (View->Bookmarks) { WapData->no_of_bookmarks = View->Bookmarks->no_of_entries; } if (View->History) { WapData->no_of_history = View->History->no_of_entries; } WapData->ProfileId = View->ProfileId; //xrashmic 16 Dec, 2004 MMI-SPR-27622 // Save the total number of profiles to flash. WapData->no_of_profiles = View->ProfilesList->no_of_entries; flash_wap_write(); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_profile_delete $Description: Deletes a profile, and shifts other profiles up to fill the gap //xrashmic 16 Dec, 2004 MMI-SPR-27622 $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: View - Pointer to the current view ProfileId - ID of the profile to delete *******************************************************************************/ T_WAP_RES ATB_wap_profile_delete(T_WAP_VIEW *View, UBYTE ProfileId) { UBYTE profileIndex; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_profile_save"); #endif if (ProfileId >= View->ProfilesList->no_of_entries) { return WAP_FAIL; } View->ProfilesList->no_of_entries--; for (profileIndex = ProfileId; profileIndex < View->ProfilesList->no_of_entries; profileIndex++) { memcpy((void *)&WapProfilesData->Profile[profileIndex], (void *)&WapProfilesData->Profile[profileIndex+1], sizeof(T_WAP_PROFILE)); } return WAP_OK; } #else /* #ifdef FF_GPF_TCPIP */ T_WAP_RES ATB_wap_profile_save(T_WAP_VIEW *View) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_profile_save"); #endif WapData->ProfileId = View->ProfileId; WapData->Status = View->Status; WapData->no_of_bookmarks = View->Bookmarks->no_of_entries; WapData->no_of_history = View->History->no_of_entries; WapData->no_of_profiles = View->ProfilesList->no_of_entries; /*SPR#2324 - SH - Save no. of profiles */ flash_wap_write(); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_profile_delete $Description: Deletes a profile, and shifts other profiles up to fill the gap SPR#2324 - SH - Added $Returns: WAP_OK if successful, WAP_FAIL if otherwise $Arguments: View - Pointer to the current view ProfileId - ID of the profile to delete *******************************************************************************/ T_WAP_RES ATB_wap_profile_delete(T_WAP_VIEW *View, UBYTE ProfileId) { UBYTE profileIndex; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_profile_save"); #endif if (ProfileId >= View->ProfilesList->no_of_entries) { return WAP_FAIL; } View->ProfilesList->no_of_entries--; for (profileIndex = ProfileId; profileIndex < View->ProfilesList->no_of_entries; profileIndex++) { memcpy((void *)&WapProfilesData->Profile[profileIndex], (void *)&WapProfilesData->Profile[profileIndex+1], sizeof(T_WAP_PROFILE)); } return WAP_OK; } #endif /* !#ifdef FF_GPF_TCPIP */ /******************************************************************************* $Function: ATB_wap_profile_default_create $Description: Creates a default profile in the flash if one isn't already there SPR#1794 - SH - There's now a third default profile. SPR#1816 - SH - Convert all defaults to MMI unicode $Returns: $Arguments: *******************************************************************************/ #ifdef FF_GPF_TCPIP //TISHMMS Project T_WAP_RES ATB_wap_profile_default_create() { UBYTE no_of_bookmarks = 9; char *bookmarksList[] = { "ZgFg wml", "ZgFg html", "Google", "Yahoo!", "Financial Times", "Cnet tech news", "T-Mobile UK", "WEB.DE", "El Pais" }; char *bookURLList[] = { "http://wap.fgmicrotec.hr", "http://www.fgmicrotec.hr/test/dsample.htm", "http://wap.google.com", "http://wap.yahoo.com", "http://wap.ft.com", "http://wap.cnet.com", "http://wap.t-mobile.co.uk", "http://wap.web.de", "http://wap.elpais.es" }; UBYTE no_of_history = 0; char *historyList[] = { "dummy" }; char *histURLList[] = { "www.dummy.org" }; UBYTE no_of_profiles = 8; char *profilesDefault[] = { "fg.vip.gprs", "vip.gprs", "fg.ht.gprs", "ht.gprs", "D1.gprs", "D2.gprs", "E-Plus.gprs", "O2.gprs", "Empty"}; char *homepageURL[] = { "http://wap.fgmicrotec.hr", "http://wap.vip.hr", "http://wap.fgmicrotec.hr", "http://wap.fgmicrotec.hr", "http://wap.yahoo.com", "http://wap.yahoo.com", "http://wap.yahoo.com", "http://wap.yahoo.com", "http://wap.yahoo.com"}; char *IPAddress1[] = { "217.014.220.081", "212.091.099.091", "217.014.220.081", "010.012.000.003", "193.254.160.002", "139.007.029.001", "212.023.097.009", "195.182.114.052", "000.000.000.000"}; char *IPAddress2[] = { "217.014.220.081", "212.091.099.091", "217.014.220.081", "000.000.000.000", "193.254.160.002", "139.007.029.001", "212.023.097.009", "195.182.114.052", "000.000.000.000"}; char *DialupNumber[] = { "00448704290000", "00448704290000", "00448704290000", "00448704290000", "17266", "00491722290100", "00448456609561", "00448456609561", ""}; char *APN[] = { "gprs5.vipnet.hr", "gprs5.vipnet.hr", "www.htgprs.hr", "www.htgprs.hr", "wap.t-d1.de", "wap.vodafone.de", "wap.eplus.de", "wap.viaginterkom.de", ""}; char *Username[] = { "38591", "38591", "", "", "t-d1", "", "eplus", "", ""}; char *Password[] = { "38591", "38591", "", "", "wap", "", "wap", "", ""}; UBYTE AccessType[] = { WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_CS_DATA}; UBYTE ConnectionSpeed[] = { WAP_ISDN9600, WAP_ISDN9600, WAP_ISDN9600, WAP_ISDN9600, WAP_ISDN9600, WAP_ISDN9600, WAP_ISDN9600, WAP_ISDN9600, WAP_ISDN9600}; USHORT ResponseTimer[] = {60, 60, 60, 60, 60, 60, 60, 60, 60}; USHORT Port1[] = {9201, 9201, 9201, 9201, 9201, 9201, 9201, 9201, 9201}; USHORT Port2[] = {9201, 9201, 9201, 9201, 9201, 9201, 9201, 9201, 9201}; //xpradipg - Aug 4: Added the default values for the WAP2.0 Menu Items //Need to confirm these default values char *NameServer1[] = { "000.000.000.000", "000.000.000.000", "000.000.000.000", "000.000.000.000", "000.000.000.000", "139.007.029.001", "212.023.097.009", "195.182.114.052", "000.000.000.000"}; char *NameServer2[] = { "000.000.000.000", "000.000.000.000", "000.000.000.000", "000.000.000.000", "000.000.000.000", "139.007.029.001", "212.023.097.009", "195.182.114.052", "000.000.000.000"}; BOOL PPGAuthentication[] = {FALSE, FALSE, FALSE,FALSE,FALSE,FALSE,FALSE,FALSE}; BOOL WirelessProfiledHTTP[]={ TRUE,TRUE, TRUE, TRUE, TRUE,TRUE, TRUE, TRUE}; /* // Germany MMS settings from Tristan (?) UBYTE no_of_profiles = 4; char *profilesDefault[] = { "T-Mobile", "Vodafone", "E-Plus","O2"}; char *IPAddress1[] = { "193.254.160.003", "139.007.029.017", "212.023.097.153", "195.182.114.052"}; char *IPAddress2[] = { "000.000.000.000", "139.007.029.017", "212.023.097.153", "195.182.114.052"}; char *DialupNumber[] = { "17266", "00447836900808", "00448456609561","00448456609561" }; char *APN[] = { "mms.t-d1.de", "event.vodafone.de", "mms.eplus.de", "wap.viaginterkom.de"}; char *Username[] = { "t-mobil", "", "mms", "" }; char *Password[] = { "mms", "", "eplus", "" }; UBYTE AccessType[] = { WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_GPRS_DATA }; UBYTE ConnectionSpeed[] = { WAP_ISDN9600, WAP_ISDN9600, WAP_ISDN9600, WAP_ISDN9600}; USHORT ResponseTimer[] = {180,60,120, 120}; USHORT Port1[] = {9201,9201,9201, 9201}; USHORT Port2[] = {9201,9201,9201, 9201}; // MMS settings from Tristan (?) UBYTE no_of_profiles = 3; char *profilesDefault[] = { "CNMobile", "Orange", "Magic4"}; char *homepageURL[] = { "http://wap.yahoo.com", "http://plus.orangehk.com", "http://plus.orangehk.com"}; char *IPAddress1[] = { "010.000.000.172", "010.030.003.151", "010.030.003.151"}; char *IPAddress2[] = { "010.000.000.172", "010.030.003.151", "010.030.003.151"}; char *DialupNumber[] = { "17266", "00447836900808", "00448456609561" }; char *APN[] = { "CMWAP", "web.orangehk.com", "web.orangehk.com"}; char *Username[] = { "WAP", "", "" }; char *Password[] = { "WAP", "", "" }; UBYTE AccessType[] = { WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_GPRS_DATA }; /* SPR#1189 - SH - Added UBYTE ConnectionSpeed[] = { WAP_ISDN9600, WAP_ISDN14400, WAP_ISDN14400};/* SPR#1827 - SH - Default connection speed values USHORT ResponseTimer[] = {180,60,120}; USHORT Port1[] = {9201,9201,9201}; USHORT Port2[] = {9201,9201,9201}; */ USHORT entryIndex; USHORT profile; char number[NUMBER_PADDING+1]; /* SPR#1816 -SH */ #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_profile_default_create"); #endif WapData->ProfileId = 0; WapData->Status = WAP_STATUS_SAVEHISTORY | WAP_STATUS_SCALEIMAGES; /* Copy bookmarks into WapData structure */ WapData->no_of_bookmarks = no_of_bookmarks; for (entryIndex = 0; entryIndex<no_of_bookmarks; entryIndex++) { ATB_char_to_uc(WapData->Bookmarks[entryIndex], bookmarksList[entryIndex]); strcpy(WapData->BookmarksURL[entryIndex], bookURLList[entryIndex]); } /* Copy history list into WapData structure */ WapData->no_of_history = no_of_history; for (entryIndex = 0; entryIndex<no_of_history; entryIndex++) { sprintf(number,"%2d. ",entryIndex+1); /* store number */ ATB_char_to_uc(WapData->History[entryIndex], number); ATB_char_to_uc(&WapData->History[entryIndex][NUMBER_PADDING], historyList[entryIndex]); strcpy(WapData->HistoryURL[entryIndex], histURLList[entryIndex]); } /* Copy profile data into WapData and WapProfilesData structures */ WapData->no_of_profiles = no_of_profiles; for (profile = 0; profile<no_of_profiles; profile++) { ATB_char_to_uc(WapProfilesData->Profile[profile].Title, profilesDefault[profile]); strcpy(WapProfilesData->Profile[profile].Homepage, homepageURL[profile]); WapProfilesData->Profile[profile].ConnectionType = WAP_CONTINUOUS; WapProfilesData->Profile[profile].ConnectionSpeed = ConnectionSpeed[profile]; /* SPR#1827 - SH - Assign connection speed values */ WapProfilesData->Profile[profile].Security = FALSE; WapProfilesData->Profile[profile].AccessType = AccessType[profile]; /* SPR#1189 - SH - Now correctly assigned*/ WapProfilesData->Profile[profile].ResponseTimer = ResponseTimer[profile]; WapProfilesData->Profile[profile].Port1 = Port1[profile]; WapProfilesData->Profile[profile].Port2 = Port2[profile]; strcpy(WapProfilesData->Profile[profile].IPAddress1, IPAddress1[profile]); strcpy(WapProfilesData->Profile[profile].IPAddress2, IPAddress2[profile]); strcpy(WapProfilesData->Profile[profile].DialupNumber, DialupNumber[profile]); strcpy(WapProfilesData->Profile[profile].APN, APN[profile]); strcpy(WapProfilesData->Profile[profile].Username, Username[profile]); strcpy(WapProfilesData->Profile[profile].Password, Password[profile]); //xpradipg - Aug 4: changes for the WAP2.0: Populating the default values strcpy(WapProfilesData->Profile[profile].NameServer1, NameServer1[profile]); strcpy(WapProfilesData->Profile[profile].NameServer2, NameServer2[profile]); WapProfilesData->Profile[profile].PPGAuthentication=PPGAuthentication[profile]; WapProfilesData->Profile[profile].WirelessProfiledHTTP=WirelessProfiledHTTP[profile]; } /* Write data to flash */ if (flash_wap_write()==EFFS_OK) // Make sure flash data is written OK return WAP_OK; else return WAP_FAIL; } void ATB_wap_profile_default(UBYTE ProfileId) { char *profilesDefault[] = { "fg.vip.gprs", "vip.gprs", "fg.ht.gprs", "ht.gprs", "D1.gprs", "D2.gprs", "E-Plus.gprs", "O2.gprs", "Empty"}; char *homepageURL[] = { "http://wap.fgmicrotec.hr", "http://wap.vip.hr", "http://wap.fgmicrotec.hr", "http://wap.fgmicrotec.hr", "http://wap.yahoo.com", "http://wap.yahoo.com", "http://wap.yahoo.com", "http://wap.yahoo.com", "http://wap.yahoo.com"}; UBYTE ConnectionSpeed[] = { WAP_ISDN9600, WAP_ISDN9600, WAP_ISDN9600, WAP_ISDN9600, WAP_ISDN9600, WAP_ISDN9600, WAP_ISDN9600, WAP_ISDN9600, WAP_ISDN9600}; UBYTE AccessType[] = { WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_GPRS_DATA, WAP_CS_DATA}; USHORT ResponseTimer[] = {60, 60, 60, 60, 60, 60, 60, 60, 60}; USHORT Port1[] = {9201, 9201, 9201, 9201, 9201, 9201, 9201, 9201, 9201}; USHORT Port2[] = {9201, 9201, 9201, 9201, 9201, 9201, 9201, 9201, 9201}; char *IPAddress1[] = { "217.014.220.081", "212.091.099.091", "217.014.220.081", "010.012.000.003", "193.254.160.002", "139.007.029.001", "212.023.097.009", "195.182.114.052", "000.000.000.000"}; char *IPAddress2[] = { "217.014.220.081", "212.091.099.091", "217.014.220.081", "000.000.000.000", "193.254.160.002", "139.007.029.001", "212.023.097.009", "195.182.114.052", "000.000.000.000"}; char *DialupNumber[] = { "00448704290000", "00448704290000", "00448704290000", "00448704290000", "17266", "00491722290100", "00448456609561", "00448456609561", ""}; char *APN[] = { "gprs5.vipnet.hr", "gprs5.vipnet.hr", "www.htgprs.hr", "www.htgprs.hr", "wap.t-d1.de", "wap.vodafone.de", "wap.eplus.de", "wap.viaginterkom.de", ""}; char *Username[] = { "38591", "38591", "", "", "t-d1", "", "eplus", "", ""}; char *Password[] = { "38591", "38591", "", "", "wap", "", "wap", "", ""}; ATB_char_to_uc(WapProfilesData->Profile[ProfileId].Title, profilesDefault[ProfileId]); strcpy(WapProfilesData->Profile[ProfileId].Homepage, homepageURL[ProfileId]); WapProfilesData->Profile[ProfileId].ConnectionType = WAP_CONTINUOUS; WapProfilesData->Profile[ProfileId].ConnectionSpeed = ConnectionSpeed[ProfileId]; /* SPR#1827 - SH - Assign connection speed values */ WapProfilesData->Profile[ProfileId].Security = FALSE; WapProfilesData->Profile[ProfileId].AccessType = AccessType[ProfileId]; /* SPR#1189 - SH - Now correctly assigned*/ WapProfilesData->Profile[ProfileId].ResponseTimer = ResponseTimer[ProfileId]; WapProfilesData->Profile[ProfileId].Port1 = Port1[ProfileId]; WapProfilesData->Profile[ProfileId].Port2 = Port2[ProfileId]; strcpy(WapProfilesData->Profile[ProfileId].IPAddress1, IPAddress1[ProfileId]); strcpy(WapProfilesData->Profile[ProfileId].IPAddress2, IPAddress2[ProfileId]); strcpy(WapProfilesData->Profile[ProfileId].DialupNumber, DialupNumber[ProfileId]); strcpy(WapProfilesData->Profile[ProfileId].APN, APN[ProfileId]); strcpy(WapProfilesData->Profile[ProfileId].Username, Username[ProfileId]); strcpy(WapProfilesData->Profile[ProfileId].Password, Password[ProfileId]); return; } #else T_WAP_RES ATB_wap_profile_default_create(UBYTE only_reset_profiles) { UBYTE no_of_bookmarks = 10; char *bookmarksList[] = { "Yahoo!", "AOL", "O2", "Financial Times", "Cnet tech news", "T-Mobile UK", "Ents24", "WEB.DE", "Vizzavi", "El Pais" }; char *bookURLList[] = { "http://wap.yahoo.com", "http://wap.aol.co.uk", "http://wap.o2.co.uk/", "http://wap.ft.com", "http://wap.cnet.com", "http://wap.t-mobile.co.uk", "http://wap.ents24.co.uk", "http://wap.web.de", "http://wap.vizzavi.co.uk", "http://wap.elpais.es" }; UBYTE no_of_history = 0; char *historyList[] = { "dummy" }; char *histURLList[] = { "www.dummy.org" }; /* SPR#2324 - SH * - Only need 3 profiles now, as extra ones can be added by user * - Only create first 2 if there's no GPRS */ #ifdef GPRS UBYTE no_of_profiles = 3; #else UBYTE no_of_profiles = 2; #endif char *profilesDefault[] = { "Breathe", "Vodaf.CSD", "Vodaf.GPRS", "Empty", "Empty"}; char *homepageURL[] = { "http://wap.yahoo.com", "http://wap.yahoo.com", "http://wap.yahoo.com", "http://wap.yahoo.com", "http://wap.yahoo.com"}; char *IPAddress1[] = { "062.024.128.014", "212.183.137.012", "212.183.137.012", "000.000.000.000", "000.000.000.000"}; char *IPAddress2[] = { "062.024.128.014", "212.001.130.132", "212.001.130.132", "000.000.000.000", "000.000.000.000"}; char *DialupNumber[] = { "00448704290000", "00447836900808", "00448456609561", "", "" }; char *APN[] = { "none", "none", "wap.vodafone.co.uk", "", ""}; char *Username[] = { "breathe", "user@vodafone.net", "user@vodafone.net", "", "" }; char *Password[] = { "breathewap", "user", "user", "", ""}; UBYTE AccessType[] = { WAP_CS_DATA, WAP_CS_DATA, WAP_GPRS_DATA, WAP_CS_DATA, WAP_CS_DATA }; /* SPR#2324 - SH - Some defaults moved to ATB_wap_profile_default */ USHORT entryIndex; USHORT profile; char number[NUMBER_PADDING+1]; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_profile_default_create"); #endif WapData->ProfileId = 0; /* SPR#2324 - SH - If this flag is set, don't reset settings and bookmarks */ if (!only_reset_profiles) { WapData->Status = WAP_STATUS_SAVEHISTORY | WAP_STATUS_SCALEIMAGES; /* Copy bookmarks into WapData structure */ WapData->no_of_bookmarks = no_of_bookmarks; for (entryIndex = 0; entryIndex<no_of_bookmarks; entryIndex++) { ATB_char_to_uc(WapData->Bookmarks[entryIndex], bookmarksList[entryIndex]); strcpy(WapData->BookmarksURL[entryIndex], bookURLList[entryIndex]); } /* Copy history list into WapData structure */ WapData->no_of_history = no_of_history; for (entryIndex = 0; entryIndex<no_of_history; entryIndex++) { sprintf(number,"%2d. ",entryIndex+1); /* store number */ ATB_char_to_uc(WapData->History[entryIndex], number); ATB_char_to_uc(&WapData->History[entryIndex][NUMBER_PADDING], historyList[entryIndex]); strcpy(WapData->HistoryURL[entryIndex], histURLList[entryIndex]); } } /* Copy profile data into WapData and WapProfilesData structures */ WapData->no_of_profiles = no_of_profiles; for (profile = 0; profile<MAX_PROFILES; profile++) { /* SPR#2324 - SH - Set up "blank" profile first, then configure * WAP gateway settings */ ATB_wap_profile_default(profile); if (profile<no_of_profiles) { ATB_char_to_uc(WapProfilesData->Profile[profile].Title, profilesDefault[profile]); strcpy(WapProfilesData->Profile[profile].Homepage, homepageURL[profile]); WapProfilesData->Profile[profile].AccessType = AccessType[profile]; strcpy(WapProfilesData->Profile[profile].IPAddress1, IPAddress1[profile]); strcpy(WapProfilesData->Profile[profile].IPAddress2, IPAddress2[profile]); strcpy(WapProfilesData->Profile[profile].DialupNumber, DialupNumber[profile]); strcpy(WapProfilesData->Profile[profile].APN, APN[profile]); strcpy(WapProfilesData->Profile[profile].Username, Username[profile]); strcpy(WapProfilesData->Profile[profile].Password, Password[profile]); } } /* Write data to flash */ if (flash_wap_write()==EFFS_OK) /* Make sure flash data is written OK */ return WAP_OK; else return WAP_FAIL; } /******************************************************************************* $Function: ATB_wap_profile_default $Description: Sends the configuration information of the current profile to the WAP task. SPR#2324 - SH - Added $Returns: None. $Arguments: ProfileId - Profile identifier *******************************************************************************/ void ATB_wap_profile_default(UBYTE ProfileId) { AUI_wap_stringID(WapProfilesData->Profile[ProfileId].Title, CARD_TITLE_MAX_LEN, WAP_STRING_UNTITLED); strcpy(WapProfilesData->Profile[ProfileId].Homepage, ""); WapProfilesData->Profile[ProfileId].ConnectionType = WAP_TEMPORARY; WapProfilesData->Profile[ProfileId].ConnectionSpeed = WAP_ANALOGUE; /* SPR#1827 - SH - Assign connection speed values */ WapProfilesData->Profile[ProfileId].Security = FALSE; WapProfilesData->Profile[ProfileId].AccessType = WAP_GPRS_DATA; /* SPR#1189 - SH - Now correctly assigned*/ WapProfilesData->Profile[ProfileId].ResponseTimer = WAP_DEFAULT_RESPONSE_TIME; WapProfilesData->Profile[ProfileId].Port1 = WAP_DEFAULT_PORT; WapProfilesData->Profile[ProfileId].Port2 = WAP_DEFAULT_PORT; strcpy(WapProfilesData->Profile[ProfileId].IPAddress1, "000.000.000.000"); strcpy(WapProfilesData->Profile[ProfileId].IPAddress2, "000.000.000.000"); strcpy(WapProfilesData->Profile[ProfileId].DialupNumber, ""); strcpy(WapProfilesData->Profile[ProfileId].APN, ""); strcpy(WapProfilesData->Profile[ProfileId].Username, ""); strcpy(WapProfilesData->Profile[ProfileId].Password, ""); return; } #endif #if defined (FF_MMI_MMS) && defined (FF_GPF_TCPIP) T_WAP_RES ATB_mms_profile_default_create() { UBYTE no_of_profiles = 8; USHORT profile; char *MmscAddress[] = { "http://mms.fgmicrotec.hr:8888/mms=fgmicro", "http://mms.vipnet.hr/servlets/mms", "http://mms.fgmicrotec.hr:8888/mms=fgmicro", "http://mms.htmobile.hr/servlets/mms", "http://mms.t-mobile.de/servlets/mms", "http://139.7.24.1/servlets/mms", "http://mms/eplus", "http://10.81.0.7:8002"}; /* Copy profile data into MmsProfilesData structures */ for (profile = 0; profile<no_of_profiles; profile++) { strcpy(MmsProfilesData->Profile[profile].MmscAddress, MmscAddress[profile]); } /* Write data to flash */ if (flash_mms_write()==EFFS_OK) // Make sure flash data is written OK return WAP_OK; else return WAP_FAIL; } #endif /******************************************************************************* $Function: ATB_wap_profile_send $Description: Sends the configuration information of the current profile to the WAP task. $Returns: None. $Arguments: View - the current view *******************************************************************************/ #ifdef FF_GPF_TCPIP #if 0 void ATB_wap_profile_send(T_WAP_VIEW *View) { T_WAP_PROFILE *Profile = View->Profile; ULONG IPAddressLong; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_profile_send"); #endif /* Set bearer for data channel */ switch(Profile->AccessType) { case WAP_GPRS_DATA: ATB_wap_conn_config_int(View, configACCESS_TYPE, BEARER_GSM_GPRS); break; case WAP_CS_DATA: ATB_wap_conn_config_int(View, configACCESS_TYPE, BEARER_GSM_CSD); break; case WAP_SMS: ATB_wap_conn_config_int(View, configACCESS_TYPE, BEARER_GSM_SMS); break; } /* Setup timeout */ ATB_wap_conn_config_int(View, configTIMEOUT, Profile->ResponseTimer); /* Setup stack mode */ /* This part is used only for browser */ if (View->object_id == 1) { if (Profile->Port1 == 9201) { ATB_wap_conn_config_int(View, configCONNECTION_TYPE, CONNECTION_TYPE_WSP_CO); TRACE_EVENT("CONNECTION_TYPE_WSP_CO at the location 1 called"); } else { ATB_wap_conn_config_int(View, configCONNECTION_TYPE, CONNECTION_TYPE_TCP); TRACE_EVENT("CONNECTION_TYPE_TCP at the location 1 called"); } } if( (Profile->WirelessProfiledHTTP) || (Profile->Port1 == 9201) ) { /* Set IP address * Trying first IP address, so set flag accordingly */ View->secondaryIP = FALSE; ATB_conv_str_to_IP(Profile->IPAddress1, strlen(Profile->IPAddress1), &IPAddressLong); ATB_wap_conn_config_str(View, configPROXY_ADDRESS, (CHAR *)&IPAddressLong, sizeof(ULONG)); } // Config security ATB_wap_conn_config_int(View, configALWAYS_SECURE, 0); ATB_wap_conn_config_int(View, configNEVER_SECURE, 1); /* Set WAP host */ //ATB_wap_conn_config_str(View, configADD_HOST, Profile->Homepage, strlen(Profile->Homepage)); /* Set connection port 1 */ ATB_wap_conn_config_int(View, configPROXY_PORT, Profile->Port1); ATB_wap_conn_config_int(View, WAP_setPort1, Profile->Port1); ATB_wap_conn_config_int(View, configPROXY_SECURE_PORT, 0); /* Set connection port 2 */ ATB_wap_conn_config_int(View, WAP_setPort2, Profile->Port2); // Set proxy credentials ATB_wap_conn_config_str(View, WAP_transLongIP, (char*) &IPAddressLong, 4); ATB_wap_conn_config_str(View, WAP_transUsername, Profile->Username, strlen(Profile->Username)); ATB_wap_conn_config_str(View, WAP_transPassword, Profile->Password, strlen(Profile->Password)); /* SPR#2086 - SH - Set connection port for PUSH */ // ATB_wap_conn_config_int(View, WAP_setPortPush, WAP_DEFAULT_PORT_PUSH); FG ? return; } #else // xreddymn Jun-21-2005 MMI-SPR-30291: Changed method of sending WAP profile // from MMI to WAP adapter. extern void *micAlloc(int size); void ATB_wap_profile_send(T_WAP_VIEW *View) { T_WAP_PROFILE *Profile = View->Profile; ULONG IPAddressLong; T_MMI_WAP_PROFILE_DATA *profile_data; T_MMI_WAP_SEND_PROFILE_IND send_profile_ind; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_profile_send"); #endif profile_data = micAlloc(sizeof(T_MMI_WAP_PROFILE_DATA)); if(profile_data == NULL) { return; } /* Set bearer for data channel */ switch(Profile->AccessType) { case WAP_GPRS_DATA: profile_data->configACCESS_TYPE = BEARER_GSM_GPRS; break; case WAP_CS_DATA: profile_data->configACCESS_TYPE = BEARER_GSM_CSD; break; case WAP_SMS: profile_data->configACCESS_TYPE = BEARER_GSM_SMS; break; } /* Setup timeout */ profile_data->configTIMEOUT = Profile->ResponseTimer; ATB_wap_conn_config_int(View, configTIMEOUT, Profile->ResponseTimer); /* Setup stack mode */ /* This part is used only for browser */ profile_data->configCONNECTION_TYPE = -1; if (View->object_id == 1) { if (Profile->Port1 == 9201) { profile_data->configCONNECTION_TYPE = CONNECTION_TYPE_WSP_CO; TRACE_EVENT("CONNECTION_TYPE_WSP_CO at the location 1 called"); } else { profile_data->configCONNECTION_TYPE = CONNECTION_TYPE_TCP; TRACE_EVENT("CONNECTION_TYPE_TCP at the location 1 called"); } } profile_data->configPROXY_ADDRESS[0] = 0; if( (Profile->WirelessProfiledHTTP) || (Profile->Port1 == 9201) ) { /* Set IP address * Trying first IP address, so set flag accordingly */ View->secondaryIP = FALSE; ATB_conv_str_to_IP(Profile->IPAddress1, strlen(Profile->IPAddress1), &IPAddressLong); memcpy(profile_data->configPROXY_ADDRESS, (CHAR *)&IPAddressLong, sizeof(ULONG)); } // Config security profile_data->configALWAYS_SECURE = 0; profile_data->configNEVER_SECURE = 1; /* Set connection port 1 */ profile_data->configPROXY_PORT = Profile->Port1; profile_data->WAP_setPort1 = Profile->Port1; profile_data->configPROXY_SECURE_PORT = 0; /* Set connection port 2 */ profile_data->WAP_setPort2 = Profile->Port2; // Set proxy credentials memcpy(profile_data->WAP_transLongIP, (CHAR *)&IPAddressLong, sizeof(ULONG)); strncpy(profile_data->WAP_transUsername, Profile->Username, 20); strncpy(profile_data->WAP_transPassword, Profile->Password, 20); send_profile_ind.data = (UBYTE*)profile_data; send_profile_ind.object_id = View->object_id; send_profile_ind.channel_id = View->channel; M_MMI_WAP_SEND_PROFILE_IND(&send_profile_ind); return; } #endif #else /* #ifdef FF_GPF_TCPIP */ void ATB_wap_profile_send(T_WAP_VIEW *View) { T_WAP_PROFILE *Profile = View->Profile; ULONG IPAddressLong; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_profile_send"); #endif /* Set bearer for data channel */ switch(Profile->AccessType) { case WAP_GPRS_DATA: ATB_wap_conn_config_int(View, configACCESS_TYPE, BEARER_GSM_GPRS); break; case WAP_CS_DATA: ATB_wap_conn_config_int(View, configACCESS_TYPE, BEARER_GSM_CSD); break; case WAP_SMS: ATB_wap_conn_config_int(View, configACCESS_TYPE, BEARER_GSM_SMS); break; } /* Setup timeout */ ATB_wap_conn_config_int(View, configTIMEOUT, Profile->ResponseTimer); /* Set IP address * Trying first IP address, so set flag accordingly */ View->secondaryIP = FALSE; ATB_conv_str_to_IP(Profile->IPAddress1, strlen(Profile->IPAddress1), &IPAddressLong); ATB_wap_conn_config_str(View, configUDP_IP_GW, (CHAR *)&IPAddressLong, sizeof(ULONG)); /* Set WAP Server Authentification name */ ATB_wap_conn_config_str(View, configAUTH_ID_GW, Profile->Username, strlen(Profile->Username)); /* Set WAP Server Authentification password */ ATB_wap_conn_config_str(View, configAUTH_PASS_GW, Profile->Password, strlen(Profile->Password)); /* Set WAP host */ ATB_wap_conn_config_str(View, configADD_HOST, Profile->Homepage, strlen(Profile->Homepage)); /* Set connection port 1 */ ATB_wap_conn_config_int(View, WAP_setPort1, Profile->Port1); /* Set connection port 2 */ ATB_wap_conn_config_int(View, WAP_setPort2, Profile->Port2); return; } #endif /* !#ifdef FF_GPF_TCPIP */ #ifdef FF_GPF_TCPIP /******************************************************************************* $Function: ATB_wap_profile_setting_get $Description: Returns the status of a particular setting $Returns: 1 if the setting is on, 0 otherwise $Arguments: The setting to check *******************************************************************************/ UBYTE ATB_wap_profile_setting(UBYTE setting) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_profile_setting_get"); #endif if (WapData->Status & setting) { return 1; } else { return 0; } } /******************************************************************************* $Function: ATB_wap_profile_setting_change $Description: Switches a setting on or off $Returns: None $Arguments: setting - The setting to change value - The new value (1 = on, 0 = off) *******************************************************************************/ void ATB_wap_profile_setting_change(UBYTE setting, UBYTE value) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_profile_setting_get"); #endif if (value) { WapData->Status ^= setting; } else { WapData->Status &= ~setting; } return; } /******************************************************************************* $Function: ATB_wap_profile_add $Description: Add a new profile with the given data $Returns: none $Arguments: p: Points to the structure containing the new profile data xreddymn Jan-20-2005 MMI-SPR-28135: WAP_OTA *******************************************************************************/ void ATB_wap_profile_add(T_WAP_PROFILE *p) { if (WapData->no_of_profiles==MAX_PROFILES) { /* Overwrite currently selected profile. But the correct method would be: * Ask user if the currently selected profile can be overwritten */ memcpy(&WapProfilesData->Profile[WapData->ProfileId],p,sizeof(T_WAP_PROFILE)); flash_wap_write(); } else { memcpy(&WapProfilesData->Profile[WapData->no_of_profiles],p,sizeof(T_WAP_PROFILE)); WapData->ProfileId=WapData->no_of_profiles; WapData->no_of_profiles++; flash_wap_write(); } #if(0) if (View_header!=NULL) { ATB_wap_entry_list_destroy(View_header->ProfilesList); View_header->ProfilesList = ATB_wap_entry_list_create(WAP_PROFILES_LIST, MAX_PROFILES, PROFILENAME_MAX_LEN, TRUE); } #endif AUI_profile_list_redraw(WapData->ProfileId); } #endif /******************************************************************************* $Function: ATB_wap_secondary_IP $Description: SPR#1688 - SH - Added this function If first IP address fails, try using secondary one. $Returns: None. $Arguments: View - the current view *******************************************************************************/ void ATB_wap_secondary_IP(T_WAP_VIEW *View) { ULONG IPAddressLong; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_secondary_IP()"); #endif /* We're now using secondary IP */ View->secondaryIP = TRUE; /* Send IP configuration to WAP browser */ ATB_conv_str_to_IP(View->Profile->IPAddress2, strlen(View->Profile->IPAddress2), &IPAddressLong); #ifdef FF_GPF_TCPIP ATB_wap_conn_config_str(View, configPROXY_ADDRESS, (CHAR *)&IPAddressLong, sizeof(ULONG)); #else ATB_wap_conn_config_str(View, configUDP_IP_GW, (CHAR *)&IPAddressLong, sizeof(ULONG)); #endif /* Reload the requested page */ ATB_wap_download_url(View, View->URL, TRUE); return; } /******************************************************************************* $Function: ATB_wap_entry_list_create $Description: Creates an entries list $Returns: Pointer to entry list $Arguments: type - type of list max_entries - maximum number of entries in list entry_size - size of entries in characters unicode - TRUE if entries are unicode *******************************************************************************/ T_WAP_LIST * ATB_wap_entry_list_create(WAP_LIST_TYPE type, UBYTE max_entries, UBYTE entry_size, BOOL unicode) { T_WAP_LIST *EntryList; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_entry_list_create"); #endif /* Allocate memory */ EntryList = (T_WAP_LIST *)AUI_wap_memory_alloc(sizeof(T_WAP_LIST)); EntryList->Entry = (char **)AUI_wap_memory_alloc(max_entries*sizeof(char*)); /* Assign list parameters */ EntryList->type = type; EntryList->max_entries = max_entries; EntryList->entry_size = entry_size; EntryList->no_of_entries = 0; EntryList->unicode = unicode; return EntryList; } /******************************************************************************* $Function: ATB_wap_entry_list_destroy $Description: Destroys an entries list $Returns: WAP_OK WAP_FAIL if list does not exist $Arguments: EntryList - pointer to entry list data *******************************************************************************/ T_WAP_RES ATB_wap_entry_list_destroy(T_WAP_LIST *EntryList) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("AUI_wap_entry_list_destroy"); #endif /* Ensure list exists */ if (EntryList==NULL) return WAP_FAIL; /* Destroy structure */ AUI_wap_memory_free((UBYTE *)EntryList->Entry, EntryList->max_entries*sizeof(char *)); AUI_wap_memory_free((UBYTE *)EntryList,sizeof(T_WAP_LIST)); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_entry_add $Description: Adds an entry to an entry list $Returns: WAP_OK if added successfully WAP_FAIL if the list is full $Arguments: Entrylist - Pointer to entries table Entry - Entry to add *******************************************************************************/ T_WAP_RES ATB_wap_entry_add(T_WAP_LIST *EntryList, char *Entry) { UBYTE entryIndex = EntryList->no_of_entries; /* Where the new entry should go */ #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_entry_add"); ATB_trace_string(Entry, strlen(Entry)); #endif /* Check if the list is full */ if (entryIndex==EntryList->max_entries) return WAP_FAIL; /* Add the entry */ if (EntryList->unicode) { ATB_uc_text_copy((USHORT *)EntryList->Entry[entryIndex], (USHORT *)Entry, EntryList->entry_size); // xreddymn Jan-06-2005 MMI-SPR-27618: Added End Of String character *((USHORT *)((USHORT *)EntryList->Entry[entryIndex]+EntryList->entry_size))='\0'; } else { strncpy(EntryList->Entry[entryIndex], Entry, EntryList->entry_size); // xreddymn Jan-06-2005 MMI-SPR-27618: Added End Of String character *((char *)((char *)EntryList->Entry[entryIndex]+EntryList->entry_size))='\0'; } EntryList->no_of_entries++; /* Increase list count */ return WAP_OK; } /******************************************************************************* $Function: ATB_wap_entry_change $Description: Changes an entry in an entry list, destroying the old entry and creating a new one. $Returns: WAP_OK $Arguments: Entrylist - Pointer to entries table Entry - New entry text entryIndex - Number of entry to change *******************************************************************************/ #ifdef FF_GPF_TCPIP T_WAP_RES ATB_wap_entry_change(WAP_LIST_TYPE type, T_WAP_LIST *EntryList, char *Entry, UBYTE entryIndex) #else T_WAP_RES ATB_wap_entry_change(T_WAP_LIST *EntryList, char *Entry, UBYTE entryIndex) #endif { char number[NUMBER_PADDING+1]; USHORT *EntryUC; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_entry_change"); #endif #ifdef FF_GPF_TCPIP if (type==WAP_HISTORY_LIST) #else if (EntryList->type==WAP_HISTORY_LIST) #endif { sprintf(number, "%2d. ", entryIndex+1); /* Add "xx. " number at start */ if (EntryList->unicode) { EntryUC = (USHORT *)EntryList->Entry[entryIndex]; ATB_char_to_uc(EntryUC, number); ATB_uc_text_copy(&EntryUC[NUMBER_PADDING], (USHORT *)Entry, EntryList->entry_size-NUMBER_PADDING); } else { strcpy(EntryList->Entry[entryIndex], number); strncpy(&EntryList->Entry[entryIndex][NUMBER_PADDING], Entry, EntryList->entry_size-NUMBER_PADDING); } } else { /* SPR#1816 - SH - Modified for unicode */ if (EntryList->unicode) { ATB_uc_text_copy((USHORT *)EntryList->Entry[entryIndex], (USHORT *)Entry, EntryList->entry_size); } else { strncpy(EntryList->Entry[entryIndex], Entry, EntryList->entry_size); } } return WAP_OK; } /******************************************************************************* $Function: ATB_wap_entry_insert $Description: Insert an entry into an entry list, shifting all subsequent entries up one. If the maximum limit of the entry list is reached, the last entry is deleted. $Returns: WAP_OK if inserted successfully WAP_FAIL if list is full, or if request does not make sense $Arguments: Entrylist - Pointer to entries table Entry - Entry to insert entryIndex - Position at which to insert the new entry *******************************************************************************/ #ifdef FF_GPF_TCPIP T_WAP_RES ATB_wap_entry_insert(WAP_LIST_TYPE type, T_WAP_LIST *EntryList, char *Entry, UBYTE entryIndex) #else T_WAP_RES ATB_wap_entry_insert(T_WAP_LIST *EntryList, char *Entry, UBYTE entryIndex) #endif { USHORT entryIndex2 = EntryList->no_of_entries; USHORT *EntryUC; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_entry_insert()"); #endif /* Check for errors */ if (EntryList==NULL || entryIndex>EntryList->no_of_entries || EntryList->no_of_entries>EntryList->max_entries) { return WAP_FAIL; } /* xreddymn Dec-10-2004 MMI-SPR-26159: Duplicate check for history list */ #ifdef FF_GPF_TCPIP // If set to 0, will allow duplicate entries in the History List if(type==WAP_URL_LIST) { S32 i, length; BOOL already_exists=FALSE; if (EntryList->unicode) { length=ATB_uc_text_len((USHORT*)Entry); for(i=0;i<entryIndex2;i++) { if(ATB_uc_text_compare((USHORT*)EntryList->Entry[i],(USHORT*)Entry,length)==0) { already_exists=TRUE; break; } } } else { // length=strlen((const char*)Entry); for(i=0;i<entryIndex2;i++) { if(strcmp((const char*)EntryList->Entry[i],(const char*)Entry)==0) { already_exists=TRUE; break; } } } if(already_exists==TRUE) { return WAP_FAIL; } } #endif if (EntryList->no_of_entries == EntryList->max_entries) /* If the list is full... */ { entryIndex2--; /* Start shifting from second last entry */ } else { EntryList->no_of_entries++; /* Increase bookmark count */ } while (entryIndex2>entryIndex) /* Work back from end of table */ { /* Shift the table down to make space */ if (EntryList->unicode) { ATB_uc_text_copy((USHORT *)EntryList->Entry[entryIndex2], (USHORT *)EntryList->Entry[entryIndex2-1], EntryList->entry_size); } else { strncpy(EntryList->Entry[entryIndex2], EntryList->Entry[entryIndex2-1], EntryList->entry_size); } entryIndex2--; } /* For history list, need to include space for number at start */ #ifdef FF_GPF_TCPIP if (type==WAP_HISTORY_LIST) // For history list, need to include space for number at start #else if (EntryList->type==WAP_HISTORY_LIST) #endif { if (EntryList->unicode) { EntryUC = (USHORT *)EntryList->Entry[entryIndex]; ATB_uc_text_copy(&EntryUC[NUMBER_PADDING], (USHORT *)Entry, EntryList->entry_size-NUMBER_PADDING); } else { strncpy(&EntryList->Entry[entryIndex][NUMBER_PADDING], Entry, EntryList->entry_size-NUMBER_PADDING); } ATB_wap_renumber_history(EntryList); } else { /* SPR#1816 - SH - Modified for unicode */ if (EntryList->unicode) { ATB_uc_text_copy((USHORT *)EntryList->Entry[entryIndex], (USHORT *)Entry, EntryList->entry_size); } else { strncpy(EntryList->Entry[entryIndex], Entry, EntryList->entry_size); } } return WAP_OK; } /******************************************************************************* $Function: ATB_wap_entry_remove $Description: Removes an entry from the bookmarks or history list and moves other entries up to close the gap. $Returns: WAP_OK if entry successfully removed WAP_FAIL if request does not make sense $Arguments: Entrylist - Pointer to entries table entryIndex - Number of the entry to delete *******************************************************************************/ T_WAP_RES ATB_wap_entry_remove(T_WAP_LIST *EntryList, UBYTE entryIndex) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_entry_remove"); #endif /* Make sure request is meaningful */ if (EntryList==NULL || entryIndex>EntryList->no_of_entries) { return WAP_FAIL; } EntryList->no_of_entries--; /* Decrease list count */ while (entryIndex<(EntryList->no_of_entries)) { /* If we haven't reached end of table, move entries up */ if (EntryList->unicode) { ATB_uc_text_copy((USHORT *)EntryList->Entry[entryIndex], (USHORT *)EntryList->Entry[entryIndex+1], EntryList->entry_size); } else { strncpy(EntryList->Entry[entryIndex], EntryList->Entry[entryIndex+1], EntryList->entry_size); } entryIndex++; } return WAP_OK; } /******************************************************************************* $Function: ATB_wap_entry_remove_all $Description: Removes all entries from a Entry List $Returns: WAP_OK if successful WAP_FAIL if entry list does not exist $Arguments: EntryList - Pointer to bookmarks table *******************************************************************************/ T_WAP_RES ATB_wap_entry_remove_all(T_WAP_LIST *EntryList) { UBYTE entryIndex; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_entry_remove_all"); #endif /* Make sure request is meaningful */ if (EntryList==NULL) { return WAP_FAIL; } EntryList->no_of_entries = 0; return WAP_OK; } /******************************************************************************* $Function: ATB_wap_renumber_history $Description: Renumber history list, changing prefixes to all entries $Returns: WAP_OK $Arguments: EntryList - pointer to history list *******************************************************************************/ #ifdef FF_GPF_TCPIP int ATB_wap_renumber_history(T_WAP_LIST *EntryList) #else T_WAP_RES ATB_wap_renumber_history(T_WAP_LIST *EntryList) #endif { UBYTE entryIndex; char number[NUMBER_PADDING+1]; USHORT *EntryUC; #ifdef TRACE_AUIWAP TRACE_FUNCTION("ATB_wap_renumber_history"); #endif for (entryIndex = 0; entryIndex<(EntryList->no_of_entries); entryIndex++) { sprintf(number, "%2d.", entryIndex+1); /* Add "xx. " number at start */ if (EntryList->unicode) { EntryUC = (USHORT *)EntryList->Entry[entryIndex]; ATB_char_to_uc(EntryUC, number); /* Overwrite terminating 0 after prefix with space */ EntryUC[NUMBER_PADDING-1] = (USHORT)(' '<<8); } else { /* Overwrite the number prefix */ strcpy(EntryList->Entry[entryIndex],number); /* Overwrite terminating 0 after prefix with space */ EntryList->Entry[entryIndex][NUMBER_PADDING-1] = ' '; } } return WAP_OK; } /******************************************************************************* $Function: ATB_wap_status_change $Description: Called to change WAP Application status, i.e. downloading, updating, etc $Returns: None. $Arguments: View - The current view status - New status *******************************************************************************/ void ATB_wap_status_change(T_WAP_VIEW *View, USHORT status) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_status_change"); #endif View->browser_status = status; /* Inform AUI of status change */ #if defined (FF_MMI_MMS) && defined (FF_GPF_TCPIP) //xrashmic 19 Aug, 2004 Bug: 2, 3, 36 and 42 //The status information is handled by MMS module separatly. if(MMSactive) { //xrashmic 08 Feb, 2005 MMI-SPR-27853 //Modified the parameters for this function. AUI_mms_status_notify(status); } else { AUI_wap_status_notify(View, status); } #endif #ifdef CO_UDP_IP AUI_wap_status_notify(View, status); #endif return; } /******************************************************************************* $Function: ATB_wap_status_get $Description: Return TRUE if the browser is in the supplied status. $Returns: TRUE/FALSE $Arguments: View - The current view status - Is the browser in this state? *******************************************************************************/ BOOL ATB_wap_status_get(T_WAP_VIEW *View, USHORT status) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_status_get"); #endif if (View->browser_status==status) return (TRUE); else return (FALSE); } /******************************************************************************* $Function: ATB_uc_text_charsInWidth $Description: Returns number of characters of the string that can fit into the given width in pixels. $Returns: Number of characters $Arguments: str - the string (unicode, converted) length - the length of string to attempt to display width - the width in pixels into which the string must fit *******************************************************************************/ USHORT ATB_uc_text_charsInWidth(USHORT *str, USHORT length, SHORT width) { USHORT strIndex; USHORT textwidth = 0; USHORT character; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_charsInWidth"); #endif for (strIndex = 0; strIndex<=length && textwidth<=width; strIndex++) { character = ((str[strIndex] & 0xFF)<<8) | ((str[strIndex] & 0xFF00)>>8); textwidth += font_getCharWidth(character); } return strIndex-1; } #ifdef FF_GPF_TCPIP /******************************************************************************* $Function: ATB_uc_text_len $Description: SPR#1816 - SH - Added Returns length of unicode string $Returns: Length of string $Arguments: str - the string *******************************************************************************/ USHORT ATB_uc_text_len(USHORT *str) { USHORT length; #ifdef TRACE_ATBWAPAUI TRACE_EVENT("ATB_uc_text_len"); #endif length = 0; while (str[length]!=0) { length++; } return length; } #endif /******************************************************************************* $Function: ATB_uc_text_copy $Description: SPR#1816 - SH - Added Copies unicode string src into dst $Returns: Length of string copied $Arguments: dst - the destination string src - the source string destlen - the maximum string length to copy *******************************************************************************/ USHORT ATB_uc_text_copy(USHORT *dst, USHORT *src, USHORT destlen) { USHORT length; #ifdef TRACE_ATBWAPAUI TRACE_EVENT("ATB_uc_text_copy"); #endif length = 0; while (src[length]!=NULL && length<destlen) { dst[length] = src[length]; length++; } dst[length] = NULL; /* Add terminating NULL */ return length; } /******************************************************************************* $Function: ATB_uc_text_width $Description: Returns width of unicode string in pixels $Returns: Width of string in pixels $Arguments: str - the string length - the length of string to measure *******************************************************************************/ USHORT ATB_uc_text_width(USHORT *str, USHORT length) { USHORT width; USHORT index; USHORT character; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_uc_text_width"); #endif width = 0; for (index=0; str[index]!=0 && index<length; index++) { character = ((str[index] & 0xFF)<<8) | ((str[index] & 0xFF00)>>8); width += font_getCharWidth(character); } return width; } // Apr 28 2005 REF: MMI-SPR-30400 x0012849 // Thos function is called to see that text is not displayed on the scroll bar space /******************************************************************************* $Function: ATB_uc_text_cut $Description: To see that the displayed string wont appear on the scroll bar space. This function is same as ATB_uc_text_crop but it wont put .. at the end. $Returns: Length of the cropped string in unicode characters. $Arguments: str - the string (unicode, converted) length - the original length width - the maximum pixel width of the new string *******************************************************************************/ USHORT ATB_uc_text_cut(USHORT *str, USHORT length, SHORT width) { USHORT maxlen = ATB_uc_text_charsInWidth(str, length, width); /* Maximum length of string that will fit */ #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_uc_text_cut"); #endif if (length>maxlen) { length = maxlen; str[length] = NULL; } return length; } /******************************************************************************* $Function: ATB_uc_text_crop $Description: Crops a unicode string if necessary to fit the supplied pixel width $Returns: Length of the cropped string in unicode characters. $Arguments: str - the string (unicode, converted) length - the original length width - the maximum pixel width of the new string *******************************************************************************/ USHORT ATB_uc_text_crop(USHORT *str, USHORT length, SHORT width) { USHORT maxlen = ATB_uc_text_charsInWidth(str, length, width); /* Maximum length of string that will fit */ #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_crop_text"); #endif if (length>maxlen) { length = maxlen; str[length] = NULL; /* Add '..' to indicate text is cropped */ if (length>0) str[length-1] = '.'; if (length>1) str[length-2] = '.'; } return length; } /******************************************************************************* $Function: ATB_uc_text_convert $Description: Swap the upper and lower bytes of each unicode character in a string (Converts standard unicode to MMI unicode) $Returns: the string $Arguments: str - the source/destination string strlen - the length of the string *******************************************************************************/ USHORT* ATB_uc_text_convert (USHORT *str, USHORT strlen) { USHORT length; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_uc_text_convert()"); #endif for (length = 0; str[length]!=0 && length < strlen; length++) { str[length] = ((str[length]&0xFF)<<8) | ((str[length]&0xFF00)>>8); } str[length] = NULL; /* Add terminating NULL */ return str; } /******************************************************************************* $Function: ATB_uc_to_char $Description: Converts a MMI-converted unicode string to a char string $Returns: The length in unicode characters of the destination string $Arguments: dst - the destination string src - the source string srclen - the length of the source string *******************************************************************************/ USHORT ATB_uc_to_char(char *dst, USHORT *src, USHORT srclen) { USHORT length; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_uc_to_char()"); #endif for (length = 0; length < srclen && src[length]!=0; length++) { dst[length] = (char)(src[length]>>8); } dst[length] = 0; /* Add terminating NULL */ return length; } /******************************************************************************* $Function: ATB_char_to_uc $Description: Converts a char string to a MMI-converted unicode string $Returns: The length in unicode characters of the destination string $Arguments: dst - the destination string src - the source string *******************************************************************************/ USHORT ATB_char_to_uc (USHORT *dst, char *src) { USHORT length = 0; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_char_to_uc()"); #endif while (src[length]!=NULL) { dst[length] = (USHORT) (src[length]<<8); length++; } dst[length] = 0; /* Add terminating NULL */ return length; } /******************************************************************************* $Function: ATB_uc_text_copy $Description: Compares unicode strings $Returns: zero if strings match, non zero otherwise $Arguments: dst - the destination string src - the source string len - Number of UCS2 characters to compare xreddymn Dec-10-2004 for MMI-SPR-26159 *******************************************************************************/ USHORT ATB_uc_text_compare(USHORT *dst, USHORT *src, USHORT len) { S32 i=0; if((dst==NULL)||(src==NULL)) { return(len); } while ((src[i]==dst[i]) && (len>0)) { len--; i++; } return len; } /******************************************************************************* $Function: ATB_conv_str_to_IP $Description: Converts a string IP address to a long type IP address $Returns: None. $Arguments: str - the string len - the original length ip - pointer to where the result will be placed *******************************************************************************/ GLOBAL const void ATB_conv_str_to_IP(const char* str, USHORT len, ULONG* ip) { char buf[16]; char *p, *pLast; ULONG i, j, k, m; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_conv_str_to_IP"); #endif if (len >= 16) { *ip = 0; return; } memcpy (buf, str, len); buf[len] = '\0'; p = buf; pLast = buf; k = 0; j = 0; m = 1; for (i=0; i<len; i++) { if (*p=='.') { *p = '\0'; k |= (atoi(pLast) & 0xFF) * m; m*=0x100; j++; p++; pLast = p; if (j EQ 3) break; } else p++; } if (j NEQ 3 OR p EQ &buf[len]) { *ip = 0; return; } k |= (atoi(pLast) & 0xFF) * m; *ip = k; return; } #ifdef FF_GPF_TCPIP /******************************************************************************* $Function: ATB_wap_data_call_connect $Description: Connect the specified view SPR#2086 - SH - Added $Returns: None $Arguments: View - The current view *******************************************************************************/ void ATB_wap_data_call_connect(T_WAP_VIEW *View) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_data_call_connect()"); #endif if (View) { connect(View->object_id); } return; } #endif /******************************************************************************* $Function: ATB_data_call_connected $Description: Confirms that a data call has been connected $Returns: None. $Arguments: View - The current view *******************************************************************************/ #ifdef FF_GPF_TCPIP void ATB_data_call_connected(T_WAP_VIEW *View) { T_MMI_WAP_CONNECT_CNF parameter; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_data_call_connected"); #endif /* SPR#2086 - SH - Use Current_view rather than View_header */ if (View != NULL) { parameter.object_id = View->object_id; parameter.channel = View->channel; parameter.success = TRUE; M_MMI_WAP_CONNECT_CNF(¶meter); } if (View->object_id==WAP_PUSH_VIEW) { ATB_wap_status_change(View, ATB_WAP_NO_STATUS); } return; } #else /* #ifdef FF_GPF_TCPIP */ void ATB_data_call_connected(void) { T_MMI_WAP_CONNECT_CNF parameter; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_data_call_connected"); #endif if (View_header != NULL) { parameter.object_id = View_header->object_id; parameter.channel = View_header->channel; parameter.success = TRUE; M_MMI_WAP_CONNECT_CNF(¶meter); } return; } #endif /* ! #ifdef FF_GPF_TCPIP */ #ifdef FF_GPF_TCPIP /******************************************************************************* $Function: ATB_wap_data_call_disconnected $Description: Confirms that a data call has been disconnected SPR#2086 - SH - Added $Returns: None $Arguments: View - The current view *******************************************************************************/ void ATB_wap_data_call_disconnected(T_WAP_VIEW *View) { T_MMI_WAP_CONNECT_CNF parameter; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_data_call_disconnected()"); #endif //xmzhou_trace_string("ATB_wap_data_call_disconnected called"); if (View != NULL) { parameter.object_id = View->object_id; parameter.channel = View->channel; parameter.success = FALSE; M_MMI_WAP_CONNECT_CNF(¶meter); } return; } #endif /* #ifdef FF_GPF_TCPIP */ /******************************************************************************* $Function: ATB_wap_start_done $Description: Confirms that WAP_START has completed $Returns: None. $Arguments: None. *******************************************************************************/ void ATB_wap_start_done(void) { AUI_wap_start_done(); return; } /******************************************************************************* $Function: ATB_wap_new_view_done $Description: Confirms that WAP_NEW_VIEW has completed Also ends configuration information to WAP browser. Only send parameters that will not be modified during this session. $Returns: None. $Arguments: None. *******************************************************************************/ #ifdef FF_GPF_TCPIP void ATB_wap_new_view_done(void) { T_WAP_VIEW *View = Current_view; /* Set max no. of history entries */ ATB_wap_config_int(View, configHISTORY_SIZE, MAX_HISTORY); ATB_wap_config_int(View, configCACHE_SIZE, WAP_cache_size); /* Display Images */ //ATB_wap_config_int(View, configDISPLAY_IMAGES, 1); /* Don't update images */ //ATB_wap_config_int(View, configUPDATE_IMAGES, 0); /* Set default channel */ ATB_wap_config_int(View, configDEFAULT_CHANNEL, View->channel); /* Set connection port */ ATB_wap_conn_config_int(View, configCLIENT_PORT, 3); /* Set online status (FALSE = not always online) */ //ATB_wap_conn_config_int(View, configONLINE, FALSE); /* SPR#2086 - SH */ ATB_wap_config_int(View, configPPG_AUTHENTICATION_REQUIRED, 0); AUI_wap_new_view_done(); return; } #else /* #ifdef FF_GPF_TCPIP */ void ATB_wap_new_view_done(void) { T_WAP_VIEW *View = Current_view; /* Set max no. of history entries */ ATB_wap_config_int(View, configHISTORY_SIZE, MAX_HISTORY); /* Display Images */ ATB_wap_config_int(View, configDISPLAY_IMAGES, 1); /* Don't update images */ ATB_wap_config_int(View, configUPDATE_IMAGES, 0); /* Set default channel */ ATB_wap_config_int(View, configDEFAULT_CHANNEL, View->channel); /* Setup stack mode */ ATB_wap_conn_config_int(View, configSTACKMODE, MODE_CO_WSP); /* Set connection port */ ATB_wap_conn_config_int(View, configCLIENT_LOCAL_PORT, 3); /* Set online status (FALSE = not always online) */ ATB_wap_conn_config_int(View, configONLINE, FALSE); AUI_wap_new_view_done(); return; } #endif /* ! #ifdef FF_GPF_TCPIP */ /******************************************************************************* $Function: ATB_wap_close_view_done $Description: Confirms that WAP_CLOSE_VIEW has completed $Returns: None. $Arguments: None. *******************************************************************************/ void ATB_wap_close_view_done(void) { AUI_wap_close_view_done(); return; } /******************************************************************************* $Function: ATB_wap_cache_prepare $Description: Tell WAP Browser to prepare the cache for shutdown $Returns: None. $Arguments: None. *******************************************************************************/ void ATB_wap_cache_prepare(void) { T_MMI_WAP_CACHE_PREPARE_IND parameter; M_MMI_WAP_CACHE_PREPARE_IND(¶meter); return; } /******************************************************************************* $Function: ATB_wap_cache_prepare_done $Description: Confirms that WAP_CACHE_PREPARE has completed $Returns: None. $Arguments: None. *******************************************************************************/ void ATB_wap_cache_prepare_done(void) { AUI_wap_cache_prepare_done(); return; } /******************************************************************************* $Function: ATB_wap_terminate_done $Description: Confirms that WAP_TERMINATE has completed $Returns: None. $Arguments: None. *******************************************************************************/ void ATB_wap_terminate_done(void) { AUI_wap_terminate_done(); return; } /******************************************************************************* $Function: ATB_wap_disconnect $Description: Informs WAP browser that a disconnection has occurred $Returns: None. $Arguments: View - the current View *******************************************************************************/ void ATB_wap_disconnect(T_WAP_VIEW *View) { T_MMI_WAP_DISCONNECT_IND parameter; TRACE_FUNCTION("ATB_wap_disconnect()"); parameter.object_id = View->object_id; parameter.channel = View->channel; M_MMI_WAP_DISCONNECT_IND(¶meter); return; } #ifdef FF_GPF_TCPIP /******************************************************************************* $Function: ATB_wap_content_get $Description: Fetches content SPR#2086 - SH - Added $Returns: WAP_FAIL if invalid request WAP_OK otherwise. $Arguments: urlID - A distinct ID for this request. Returned in ATB_wap_content(). Url - The URL of the content to download. reload - If TRUE, any version of the requested content in the cache will be ignored, and the content will be fetched from the network. acceptHeader - Specifies if any Accept-Header fields will be sent with the request. Can be NULL. *******************************************************************************/ T_WAP_RES ATB_wap_content_get(UBYTE urlID, char *Url, BOOL reload, char *acceptHeader) { T_MMI_WAP_CONTENT_REQ parameter; TRACE_FUNCTION("ATB_wap_content_get()"); if (!parameter.Url) return WAP_FAIL; parameter.Url = Url; parameter.url_length = strlen(Url); parameter.urlID = urlID; parameter.reload = reload; parameter.AcceptHeader = acceptHeader; if (acceptHeader!=NULL) { parameter.acceptHeader_length = strlen(acceptHeader); } else { parameter.acceptHeader_length = 0; } //xmzhou_trace_string("****M_MMI_WAP_CONTENT_REQ****"); M_MMI_WAP_CONTENT_REQ(¶meter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_content $Description: The requested content. SPR#2086 - SH - Added $Returns: None. $Arguments: urlID - A distinct ID for this request, provided by ATB_wap_content_get(). Data - The downloaded data. data_length - The length of the downloaded data in bytes. moreData - If TRUE, there is more data to come. (This is just an indicator; the request for further data is made by the function M_WAP_MMI_CONTENT_IND. ContentType - The type of the downloaded data. contentType_length - The length of the downloaded data type, in bytes. totalSize - If the data comes in more than one chunk, this will give the total size of the assembled chunks. However, this information may not be provided by the WAP gateway. errorNo - Error code. If this is nonzero, it is reported to the AUI in the function AUI_error_dialog(). *******************************************************************************/ void ATB_wap_content(UBYTE urlID, char *Data, ULONG data_length, BOOL moreData, char *ContentType, ULONG contentType_length, ULONG totalSize, SHORT errorNo) { TRACE_FUNCTION("ATB_wap_content()"); /* Check if an error has occurred */ if (Data==NULL || errorNo>0) { AUI_error_dialog(Current_view, errorNo); return; } //xrashmic 19 Aug, 2004 Bug: 2, 3, 36 and 42 //The download data should not be displayed for MMS module if(!MMSactive) { AUI_wap_content( urlID, Data, data_length, moreData, ContentType, contentType_length, totalSize); } return; } /******************************************************************************* $Function: ATB_wap_content_cancel $Description: Cancel receipt of content. SPR#2086 - SH - Added $Returns: None. $Arguments: urlID - The ID of the download. *******************************************************************************/ void ATB_wap_content_cancel(UBYTE urlID) { T_MMI_WAP_CONTENT_CANCEL_IND parameter; TRACE_FUNCTION("ATB_wap_content_cancel()"); parameter.urlID = urlID; M_MMI_WAP_CONTENT_CANCEL_IND(¶meter); return; } /******************************************************************************* $Function: ATB_wap_content_post $Description: Post content SPR#2086 - SH - Added $Returns: WAP_FAIL if invalid request WAP_OK otherwise. $Arguments: urlID - A distinct ID for this request. Returned in ATB_wap_content(). Url - The URL of the content to download. reload - If TRUE, any version of the requested content in the cache will be ignored, and the content will be fetched from the network. acceptHeader - Specifies if any Accept-Header fields will be sent with the request (NULL terminated). Can be NULL. Data - The data to post. data_length - The length of the data to post, in bytes. moreData - TRUE if there are more chunks to be sent after this one. contentType - May contain the content type of the data (NULL terminated string). sendMode - one of WAP_SENDMODE_URL_ENCODED, WAP_SENDMODE_MULTIPART_FORMDATA, WAP_SENDMODE_BINARY contentDisp - when sendMode is WAP_SENDMODE_MULTIPART_FORMDATA, contentDisp can be set to e.g. filename for the content. Can be NULL. totalSize - If moreData is TRUE, this may indicate the total size of the data to be sent. *******************************************************************************/ T_WAP_RES ATB_wap_content_post( UBYTE urlID, char *Url, BOOL reload, char *acceptHeader, char *Data, ULONG data_length, BOOL moreData, char *ContentType, UBYTE sendMode, char *ContentDisp, ULONG totalSize) { T_MMI_WAP_CONTENT_POST_REQ parameter; TRACE_FUNCTION("ATB_wap_content_post()"); //xmzhou_trace_string("ATB_wap_content_post called!!!!"); //if (!parameter.Url || !parameter.Data) // return WAP_FAIL; parameter.Url = Url; parameter.url_length = strlen(Url); parameter.urlID = urlID; parameter.reload = reload; parameter.AcceptHeader = acceptHeader; if (acceptHeader!=NULL) { parameter.acceptHeader_length = strlen(acceptHeader); } else { parameter.acceptHeader_length = 0; } parameter.Data = Data; parameter.data_length = data_length; parameter.moreData = moreData; parameter.ContentType = ContentType; if (ContentType!=NULL) { parameter.contentType_length = strlen(ContentType); } else { parameter.contentType_length = 0; } parameter.sendMode = sendMode; parameter.ContentDisp = ContentDisp; if (ContentDisp!=NULL) { parameter.contentDisp_length = strlen(ContentDisp); } else { parameter.contentDisp_length = 0; } parameter.totalSize = totalSize; //xmzhou_trace_string("ATB_wap_content_post call M_MMI_WAP_CONTENT_POST_REQ!!!!"); M_MMI_WAP_CONTENT_POST_REQ(¶meter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_content_post_more $Description: Post more content (after the first chunk has been sent) SPR#2086 - SH - Added $Returns: WAP_FAIL if invalid request WAP_OK otherwise. $Arguments: urlID - A distinct ID for this request, sent in ATB_wap_content_post(). Data - The data to post. data_length - The length of the data to post, in bytes. moreData - TRUE if there are more chunks to be sent after this one. *******************************************************************************/ T_WAP_RES ATB_wap_content_post_more( UBYTE urlID, char *Data, ULONG data_length, BOOL moreData) { T_MMI_WAP_CONTENT_POST_MORE_REQ parameter; TRACE_FUNCTION("ATB_wap_content_post_more()"); //xmzhou_trace_string("ATB_wap_content_post_more called"); //if (!parameter.Data) // return WAP_FAIL; parameter.urlID = urlID; parameter.Data = Data; parameter.data_length = data_length; parameter.moreData = moreData; M_MMI_WAP_CONTENT_POST_MORE_REQ(¶meter); return WAP_OK; } /******************************************************************************* $Function: ATB_wap_push_load_SI $Description: Load the requested service indication. SPR#2086 - SH - Added $Returns: None. $Arguments: View - The current view id - The identifier of the SI. *******************************************************************************/ void ATB_wap_push_load_SI(T_WAP_VIEW *View, SHORT id) { T_MMI_WAP_PUSH_LOAD_SI_IND parameter; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_push_load_SI()"); #endif parameter.object_id = View->object_id; parameter.id = id; M_MMI_WAP_PUSH_LOAD_SI_IND(¶meter); return; } /******************************************************************************* $Function: ATB_wap_push_delete_SI $Description: Delete the requested service indication. SPR#2086 - SH - Added $Returns: None. $Arguments: id - The identifier of the SI to delete. selection - Parameter specifying which SI to delete (used if id is -1). Can be WAP_PUSH_DEL_ALL, WAP_PUSH_DEL_EXP, WAP_PUSH_DEL_NON_EXP, WAP_PUSH_DEL_LOADED, WAP_PUSH_DEL_NON_LOADED *******************************************************************************/ void ATB_wap_push_delete_SI(SHORT id, UBYTE selection) { T_MMI_WAP_PUSH_DELETE_SI_IND parameter; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_push_delete_SI()"); #endif parameter.id = id; parameter.selection = selection; M_MMI_WAP_PUSH_DELETE_SI_IND(¶meter); return; } /******************************************************************************* $Function: ATB_wap_push_get_SI_info $Description: Request info on the specified SI. SPR#2086 - SH - Added $Returns: None. $Arguments: id - The identifier of the SI to delete. selection - Parameter specifying for which SI to get info (used if id is -1). Can be WAP_PUSH_SHOW_ALL, WAP_PUSH_SHOW_EXP, WAP_PUSH_SHOW_NON_EXP, WAP_PUSH_SHOW_LOADED, WAP_PUSH_SHOW_NON_LOADED *******************************************************************************/ void ATB_wap_push_get_SI_info(SHORT id, UBYTE selection) { T_MMI_WAP_PUSH_GET_SI_INFO_REQ parameter; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_push_get_SI_info()"); #endif parameter.id = id; parameter.selection = selection; M_MMI_WAP_PUSH_GET_SI_INFO_REQ(¶meter); return; } /******************************************************************************* $Function: ATB_wap_push_save_repository $Description: Save the push repository to flash SPR#2086 - SH - Added $Returns: None. $Arguments: None *******************************************************************************/ void ATB_wap_push_save_to_flash(void) { T_MMI_WAP_PUSH_SAVE_TO_FLASH_IND parameter; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_push_load_SI()"); #endif M_MMI_WAP_PUSH_SAVE_TO_FLASH_IND(¶meter); return; } /******************************************************************************* $Function: ATB_wap_push_SI_new $Description: A new SI has been received SPR#2086 - SH - Added $Returns: None. $Arguments: id - identifier for the SI created - Date and time of when SI was created in UTC format expires - Date and time of when SI expires in UTC format Message - The description of the received SI, to be presented to the end-user message_length - Length of Message in Unicode characters expired - TRUE if SI has expired, FALSE otherwise Url - The URL of the service to retrieve, or NULL if not provided url_length - Length of Url in characters priority - Priority of SI. Can be: WAP_PUSH_LOW_PRIO, WAP_PUSH_HIGH_PRIO, WAP_PUSH_CACHE_PRIO. InitURL - Identifies the push initiator. NULL if not provided initURL_length - Length of InitURL in characters applicationType - Allows application to map message to right user agent. Can be WAP_APPLICATION_WML, WAP_APPLICATON_WTA. newChannelId - For Bluetooth support *******************************************************************************/ void ATB_wap_push_SI_new( SHORT id, ULONG created, ULONG expires, USHORT *Message, ULONG message_length, BOOL expired, char *Url, ULONG url_length, UBYTE priority, char *InitURL, ULONG initURL_length, UBYTE applicationType, UBYTE newChannelId ) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_push_SI_new()"); #endif /* Save the current push repository to flash */ ATB_wap_push_save_to_flash(); /* Indicate to the user that a new push message has arrived * (only if the appropriate setting is set to TRUE) */ if (ATB_wap_profile_setting(WAP_STATUS_PUSHMESSAGES)) { AUI_wap_push_show( Message, (USHORT)message_length, id, (char *)Url, (USHORT)url_length); } return; } /******************************************************************************* $Function: ATB_wap_push_SL_new $Description: A new SL has been received $Returns: void $Arguments: id - identifier for the SL Url - The URL of the service to retrieve, or NULL if not provided url_length - Length of Url in characters priority - Priority of SL. Can be: WAP_PUSH_LOW_PRIO, WAP_PUSH_HIGH_PRIO, WAP_PUSH_CACHE_PRIO. InitURL - Identifies the push initiator. NULL if not provided initURL_length - Length of InitURL in characters applicationType - Allows application to map message to right user agent. Can be WAP_APPLICATION_WML, WAP_APPLICATON_WTA. newChannelId - For Bluetooth support xreddymn Mar-16-2005 MMI-SPR-29767 *******************************************************************************/ void ATB_wap_push_SL_new( SHORT id, char *Url, ULONG url_length, UBYTE priority, char *InitURL, ULONG initURL_length, UBYTE applicationType, UBYTE newChannelId ) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_push_SL_new()"); #endif // Save the current push repository to flash ATB_wap_push_save_to_flash(); // Launch WAP with the URL received in the SL message AUI_wap_push_load_SL(id, Url, url_length); return; } /******************************************************************************* $Function: ATB_wap_push_SI_info $Description: Returns info about the specified SI. SPR#2086 - SH - Added $Returns: None. $Arguments: id - identifier for the SI status - Status of the SI. Can be WAP_PUSH_STATUS_NON_LOADED, WAP_PUSH_STATUS_LOADED. created - Date and time of when SI was created in UTC format expires - Date and time of when SI expires in UTC format Message - The description of the received SI, to be presented to the end-user message_length - Length of Message in Unicode characters expired - TRUE if SI has expired, FALSE otherwise Url - The URL of the service to retrieve, or NULL if not provided url_length - Length of Url in characters priority - Priority of SI. Can be: WAP_PUSH_LOW_PRIO, WAP_PUSH_HIGH_PRIO, WAP_PUSH_CACHE_PRIO. InitURL - Identifies the push initiator. NULL if not provided initURL_length - Length of InitURL in characters *******************************************************************************/ void ATB_wap_push_SI_info( SHORT id, UBYTE status, ULONG created, ULONG expires, USHORT *Message, ULONG message_length, BOOL expired, char *Url, ULONG url_length, UBYTE priority, char *InitURL, ULONG initURL_length ) { #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_push_SI_info()"); #endif AUI_wap_push_info( Message, message_length, id, (char *)Url, (USHORT)url_length, status, created, expired, priority); } char WAPServiceCentre[30] = {0}; T_MFW_PHB_TON addr_type; T_MFW_PHB_TON sc_type; /******************************************************************************* $Function: ATB_wap_push_SMS_received $Description: Notifies WAP that a WAP SMS has been received SPR#2086 - SH - Added $Returns: None. $Arguments: smsc - The service centre address (NULL terminated) tosca - Service centre T.O.N. number - The address of the sender toa - Sender addresss T.O.N. Data - data of message data_length - Length of the message in bytes *******************************************************************************/ void ATB_wap_push_SMS_received( char *Smsc, UBYTE tosca, char *number, UBYTE toa, char *Udh, ULONG udh_length, char *Data, ULONG data_length) { T_MMI_WAP_PUSH_SMS_RECEIVED_IND parameter; USHORT totalsize; char *sms_data; #ifdef TRACE_ATBWAPAUI TRACE_FUNCTION("ATB_wap_push_SMS_received"); TRACE_EVENT_P2("udh_length %d, data_length: %d", udh_length, data_length); #endif /* Concatenate the UDH and data */ totalsize = udh_length+data_length+1; sms_data = (char *)AUI_wap_memory_alloc(totalsize); sms_data[0] = udh_length; memcpy((void *)&sms_data[1], Udh, udh_length); memcpy((void *)&sms_data[udh_length+1], Data, data_length); /* Store WAP Service Centre */ memset((void *)WAPServiceCentre, 0, sizeof(WAPServiceCentre)); if (Smsc) { strcpy(WAPServiceCentre, Smsc); TRACE_EVENT_P1("smsc: %s", WAPServiceCentre); } addr_type = toa; sc_type = tosca; parameter.Source = number; parameter.source_length = (ULONG)strlen(number); parameter.Data = sms_data; parameter.data_length = (ULONG)totalsize; M_MMI_WAP_PUSH_SMS_RECEIVED_IND(¶meter); AUI_wap_memory_free((void *)sms_data, totalsize); return; } /******************************************************************************* $Function: ATB_wap_push_SMS_send $Description: WAP requests MMI to send an SMS SPR#2086 - SH - Added $Returns: None. $Arguments: Smsc - The service centre address smsc_length - Length of the service centre in characters Destination - The address of the destination destination_length - The length of the destination toa - Sender addresss T.O.N. Data - data of message data_length - Length of the message in bytes *******************************************************************************/ void ATB_wap_push_SMS_send( char *Smsc, ULONG smsc_length, char *Destination, ULONG destination_length, char *Data, ULONG data_length) { char *Destination_ascii; char dummy[] = "Test"; #ifdef TRACE_AUIWAP TRACE_FUNCTION("ATB_wap_push_SMS_send"); #endif /* Ensure address is null-terminated */ Destination_ascii = (char *)AUI_wap_memory_alloc(destination_length+1); memcpy((void *)Destination_ascii, (void *)Destination, destination_length); Destination_ascii[destination_length] = 0; sms_submit_wap_sms(MFW_SMS_REPLY, (CHAR *)Destination_ascii, addr_type, (UBYTE *)Data, (USHORT)data_length, WAPServiceCentre, sc_type); AUI_wap_memory_free((void *)Destination_ascii,destination_length+1); return; } /******************************************************************************* $Function: ATB_wap_push_SMS_sent $Description: Notifies WAP that a WAP SMS has been sent SPR#2086 - SH - Added $Returns: None. $Arguments: None *******************************************************************************/ void ATB_wap_push_SMS_sent(void) { T_MMI_WAP_PUSH_SMS_SENT_IND parameter; #ifdef TRACE_AUIWAP TRACE_FUNCTION("ATB_wap_push_SMS_sent"); #endif parameter.dummy = 0; M_MMI_WAP_PUSH_SMS_SENT_IND(¶meter); return; } /******************************************************************************* $Function: ATB_wap_push_SMS_error $Description: Notifies WAP that a WAP SMS has not been sent SPR#2086 - SH - Added $Returns: None. $Arguments: error - an ID for the error *******************************************************************************/ void ATB_wap_push_SMS_error(UBYTE error) { T_MMI_WAP_PUSH_SMS_ERROR_IND parameter; #ifdef TRACE_AUIWAP TRACE_FUNCTION("ATB_wap_push_SMS_error"); TRACE_EVENT_P1("**ERROR: %d**",error); #endif parameter.message = error; M_MMI_WAP_PUSH_SMS_ERROR_IND(¶meter); return; } #endif /* #ifdef FF_GPF_TCPIP */ /******************************************************************************* $Function: long_IP_to_char_IP $Description: Converts a ULONG IP address into an IP address string suitable for an editor. $Returns: None. $Arguments: IPs - The IP address IPd - The string in which to store the result *******************************************************************************/ void long_IP_to_char_IP(ULONG IPs,char* IPd) { ULONG tempLong; char tempChar; int i; char temp[50]; #ifdef TRACE_ATBWAPAUI sprintf(temp,"IP Address %X",(int)IPs); TRACE_EVENT(temp); #endif for (i=3;i>=0;i--) { tempLong=((IPs)>>8*i)&(0xFF); *IPd = (char)tempLong; #ifdef TRACE_ATBWAPAUI sprintf(temp,"IP %d %X",i,(int)*IPd); TRACE_EVENT(temp); #endif IPd++; } } /******************************************************************************* $Function: rAT_WAP_PPP_connected $Description: Indication from ACI that PPP is connected $Returns: None. $Arguments: cId - Id of the WAP call IPAddress - Dynamically assigned IP address *******************************************************************************/ #ifdef FF_GPF_TCPIP //TISHMMS Project extern void M4_DebugStringMessage(char *in_string, UINT8 ucNumber,unsigned long para); void rAT_WAP_PPP_connected(SHORT cId,ULONG IPAddress) { char charIP[5]; TRACE_FUNCTION("rAT_WAP_PPP_connected"); /* SPR#1569 - SH - If there are no open views, disconnect and exit */ if (!View_header) { TRACE_EVENT("** WAP has closed, disconnecting call **"); /* SPR#1575 - SH - Call this function to end a GPRS or CSD call */ AUI_end_call(0); /* SPR#1850 - SH - Call ID 0, disconnect any call */ return; } /* SPR#1189 - SH - If the browser is not in the correct state, disconnect */ if (ATB_wap_status_get(Current_view, ATB_WAP_ONLINE_CONNECTION_CLOSED)) { TRACE_EVENT("** WAP is not in correct status, disconnecting call **"); AUI_end_call(0); return; } /* Send new IP address as config information */ if (IPAddress) { charIP[4]='\0'; long_IP_to_char_IP(IPAddress,(char*)charIP); /* Set IP address host */ ATB_wap_conn_config_str(Current_view, WAP_transCharIP, charIP, 4); } /* SPR#1574 - SH - Removed parameter */ ATB_wap_status_change(Current_view,ATB_WAP_CONNECTING); ATB_data_call_connected(Current_view); return; } #else /* #ifdef FF_GPF_TCPIP */ void rAT_WAP_PPP_connected(SHORT cId,ULONG IPAddress) { char charIP[5]; TRACE_FUNCTION("rAT_WAP_PPP_connected"); /* If there are no open views, disconnect and exit */ if (!View_header) { TRACE_EVENT("** WAP has closed, disconnecting call **"); AUI_wap_end_call(0); /* Call ID 0, disconnect any call */ return; } /* If the browser is not in the correct state, disconnect */ if (ATB_wap_status_get(Current_view, ATB_WAP_ONLINE_CONNECTION_CLOSED)) { TRACE_EVENT("** WAP is not in correct status, disconnecting call **"); AUI_wap_end_call(0); return; } /* Send new IP address as config information */ if (IPAddress) { charIP[4]='\0'; long_IP_to_char_IP(IPAddress,(char*)charIP); /* Set IP address host */ ATB_wap_conn_config_str(Current_view, configUDP_IP_SRC, charIP, 4); } /* Set new MMI status */ ATB_wap_status_change(Current_view,ATB_WAP_CONNECTING); /* Send connection confirmation to WAP Browser */ ATB_data_call_connected(); return; } #endif /* ! #ifdef FF_GPF_TCPIP */ /******************************************************************************* $Function: rAT_WAP_start_login $Description: Login has begun for CSD $Returns: None. $Arguments: None. *******************************************************************************/ void rAT_WAP_start_login(void) { UBYTE temp; TRACE_FUNCTION("rAT_WAP_start_login"); temp = dspl_Enable(0); /* SPR#1569 - SH - Only change status if current view exists */ if (Current_view) { /* SPR#1574 - SH - Removed parameter */ ATB_wap_status_change(Current_view, ATB_WAP_LOGGING_IN); } dspl_Enable(temp); return; } /******************************************************************************* $Function: rAT_WAP_start_gprs_login $Description: Login has started over GPRS $Returns: None. $Arguments: None. *******************************************************************************/ //NM take it out #ifdef MMI_WAP_ENABLED void rAT_WAP_start_gprs_login(void) { UBYTE temp; TRACE_FUNCTION("rAT_WAP_start_gprs_login"); temp = dspl_Enable(0); /* SPR#1569 - SH - Only change status if current view exists */ if (View_header && Current_view) { /* SPR#1982 - SH - Only change status if we are ATTACHING */ if (ATB_wap_status_get(Current_view, ATB_WAP_ATTACHING)) { ATB_wap_status_change(Current_view, ATB_WAP_CONNECTING); } } dspl_Enable(temp); return; } //NM #endif /******************************************************************************* $Function: rAT_WAP_call_disconnected $Description: Callback - disconnection occurred $Returns: None. $Arguments: cId - ID of the WAP call *******************************************************************************/ #ifdef FF_GPF_TCPIP void rAT_WAP_call_disconnected(SHORT cId) { UBYTE temp; T_MMI_WAP_CONNECT_CNF parameter; TRACE_FUNCTION("rAT_WAP_call_disconnected"); temp = dspl_Enable(0); /* SPR#1569 - SH - If there are no open views, do nothing */ if (Current_view) { /* SPR#1574 - SH - Removed parameter */ ATB_wap_status_change(Current_view, ATB_WAP_ONLINE_CONNECTION_CLOSED); parameter.object_id = Current_view->object_id; parameter.channel = Current_view->channel; parameter.success = FALSE; M_MMI_WAP_CONNECT_CNF(¶meter); } dspl_Enable(temp); return; } #else /* #ifdef FF_GPF_TCPIP */ void rAT_WAP_call_disconnected(SHORT cId) { UBYTE temp; T_MMI_WAP_CONNECT_CNF parameter; TRACE_FUNCTION("rAT_WAP_call_disconnected"); temp = dspl_Enable(0); /* If there are no open views, do nothing */ if (View_header != NULL) { /* Inform MMI of connection closed */ if (Current_view) { ATB_wap_status_change(Current_view, ATB_WAP_ONLINE_CONNECTION_CLOSED); } /* Inform WAP Broswer of connection closed */ parameter.object_id = View_header->object_id; parameter.channel = View_header->channel; parameter.success = FALSE; M_MMI_WAP_CONNECT_CNF(¶meter); Current_view = View_header; } dspl_Enable(temp); return; } #endif /* ! #ifdef FF_GPF_TCPIP */ /******************************************************************************* $Function: writeerrorFFS/writeflagFFS $Description: These functions are provided for debugging purposes $Returns: None. $Arguments: *******************************************************************************/ void writeerrorFFS(short error) { UBYTE errordigits[6]; sprintf((char *)errordigits, "%d", error); ffs_file_write("/mmi/errormmi", &errordigits, sizeof(errordigits), FFS_O_TRUNC | FFS_O_CREATE); } void writeflagFFS(UBYTE flag) { ffs_file_write("/mmi/flag", &flag, sizeof(flag), FFS_O_TRUNC | FFS_O_CREATE); }