FreeCalypso > hg > fc-magnetite
diff src/aci2/bmi/MmiDictionary.c @ 3:93999a60b835
src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 26 Sep 2016 00:29:36 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/aci2/bmi/MmiDictionary.c Mon Sep 26 00:29:36 2016 +0000 @@ -0,0 +1,455 @@ +/******************************************************************************* + + CONDAT (UK) + +******************************************************************************** + + This software product is the property of Condat (UK) Ltd and may not be + disclosed to any third party without the express permission of the owner. + +******************************************************************************** + + $Project name: Basic MMI + $Project code: BMI + $Module: MMI + $File: Dixtionary.c + $Revision: 1.0 + + $Author: Condat(UK) + $Date: + +******************************************************************************** + + Description: Predictive text dictionary functions. + Interfaces between the Lation text editor and the EziText API. + + + +******************************************************************************** + + $History: Dictionary.c + Aug 16, 2004 REF: CRR 24323 Deepa M.D + Bug:Clenup of sprintf used for tracing + Fix:Replace the char buf[]; sprintf (buf, "...", ...); TRACE_EVENT (buf); statements by TRACE_EVENT_PX + + 03/10/02 Replaced most of the file with version on 3.3.3 line (MC, SPR 1242) + + $End + +*******************************************************************************/ + +#define ENTITY_MFW + +/* includes */ +#include <string.h> +#include <stdio.h> +#include <stdlib.h> + +#if defined (NEW_FRAME) + +#include "typedefs.h" +#include "vsi.h" +#include "pei.h" +#include "custom.h" +#include "gsm.h" + +#else + +#include "STDDEFS.H" +#include "custom.h" +#include "gsm.h" +#include "vsi.h" + +#endif +//#include "MmiBookShared.h" +#include "MmiBlkLangDB.h" +#include "MmiDictionary.h" +#include "zi8api.h" +#include "mfw_kbd.h" + + + +/************************************ MACROS****************************************/ +#define MAX_NO_OF_ELEMENTS 12 +#define CANDIDATES_PER_GROUP 1 + + + + +/************************************* Data Type definitions ****************************/ +typedef struct dict_data_ +{ +ZI8GETPARAM getParam; //global ezitext data structure +int no_of_candidates; +int candidate_cursor; +int more_count; + +} dict_data; + +/*MC, SPR 1150 - Added data structure definitions*/ +typedef struct +{ + UBYTE condat_lang; /*Condat language code e.g. ENGLISH LANGAUGE*/ + UBYTE zi_lang; /*Zi library language code */ + UBYTE zi_sub_lang; /*Zi library sub-language code e.g. British English*/ + +}lang_code_table_entry; + +typedef struct +{ + UBYTE no_of_entries; + lang_code_table_entry* entries; + +}lang_code_table; +/*MC end*/ +/*************************************Global Variables***********************************/ + +ZI8WCHAR element_buffer[MAX_NO_OF_ELEMENTS]; +ZI8WCHAR candidates_buffer[MAX_NO_OF_ELEMENTS*CANDIDATES_PER_GROUP]; + + +static dict_data Dictionary; + +/*MC SPR 1150- hardcoded Language table*/ +/*This is used to correlate the current language with the language settings needed for Ezitext*/ +/*If we add new lanaguages, we just need to amend this table*/ +lang_code_table_entry LangCodeTableEntries[] = +{ + {ENGLISH_LANGUAGE, ZI8_LANG_EN, ZI8_SUBLANG_EN_UK}, + {GERMAN_LANGUAGE, ZI8_LANG_DE, ZI8_SUBLANG_DEFAULT} +}; +lang_code_table LangCodeTable = { 2, LangCodeTableEntries}; +/*************************************Prototypes***********************************/ +void convert_chars_to_ascii(char* string, UBYTE language);/*SPR 1508*/ + +/******************************************************************************* + + $Function: Initialize_Dict + + $Description: Initialises Predictive Text libs + + $Returns: status int + + $Arguments: language, text entry mode(may be used for chinese e.g. pinyin/stroke) +*******************************************************************************/ +int Initialize_Dict(UBYTE language, UBYTE entry_mode) +{ int i; + + Zi8Initialize(); + /*MC, SPR 1150- more generic code for setting Zi library parameters*/ + + /* for each entry in language table*/ + for(i=0; i< LangCodeTable.no_of_entries; i++) + {/*if current language in table*/ + if (LangCodeTable.entries[i].condat_lang == language) + { /*use Zi language definitions*/ + Dictionary.getParam.Language = LangCodeTable.entries[i].zi_lang; + Dictionary.getParam.SubLanguage = LangCodeTable.entries[i].zi_sub_lang; + break; + } + } + /*if no entry found*/ + if (i>=LangCodeTable.no_of_entries) + return 1; /*exit with error code*/ + Dictionary.getParam.GetMode = ZI8_GETMODE_DEFAULT; + Dictionary.getParam.SubLanguage = ZI8_SUBLANG_EN_ALL; + Dictionary.getParam.Context = ZI8_GETCONTEXT_DEFAULT; + Dictionary.getParam.GetOptions = ZI8_GETOPTION_STRINGS; + Dictionary.getParam.pElements = element_buffer; + Dictionary.getParam.pCandidates = candidates_buffer; + Dictionary.getParam.MaxCandidates = CANDIDATES_PER_GROUP + 1; + Dictionary.getParam.pScratch = NULL; + Dictionary.getParam.FirstCandidate = 0; + + memset(element_buffer, 0, MAX_NO_OF_ELEMENTS*sizeof(ZI8WCHAR)); + memset(candidates_buffer, 0, MAX_NO_OF_ELEMENTS*CANDIDATES_PER_GROUP); + Dictionary.getParam.ElementCount = 0; + Dictionary.more_count = 0; + Dictionary.no_of_candidates = 0; + Dictionary.candidate_cursor = 0; + return 0; +} + +/******************************************************************************* + + $Function: DictAlphaKeyPress + + $Description: Passes keypress to pred text lib and puts first match into string param + + $Returns: status int + + $Arguments: keycode, string +*******************************************************************************/ +int DictAlphaKeyPress(UBYTE keycode, char* first_candidate) +{ + ZI8WCHAR new_keycode; + //convert keycode to Ezitext code + + switch (keycode) + { + case KCD_1: new_keycode = ZI8_CODE_LATIN_PUNCT; break; + case KCD_2: new_keycode = ZI8_CODE_LATIN_ABC; break; + case KCD_3: new_keycode = ZI8_CODE_LATIN_DEF; break; + case KCD_4: new_keycode = ZI8_CODE_LATIN_GHI; break; + case KCD_5: new_keycode = ZI8_CODE_LATIN_JKL; break; + case KCD_6: new_keycode = ZI8_CODE_LATIN_MNO; break; + case KCD_7: new_keycode = ZI8_CODE_LATIN_PQRS; break; + case KCD_8: new_keycode = ZI8_CODE_LATIN_TUV; break; + case KCD_9: new_keycode = ZI8_CODE_LATIN_WXYZ; break; + default: break; + } + /*MC, SPR 1150 - removed any code for chinese Pinyin from this function*/ + + //place in array of elements + Dictionary.getParam.pElements[Dictionary.getParam.ElementCount++] = new_keycode; + Dictionary.more_count = 0; + Dictionary.getParam.FirstCandidate = 0; //start new word search + Dictionary.candidate_cursor = 0; + Dictionary.no_of_candidates = Zi8GetCandidates(&Dictionary.getParam); + + if (Dictionary.no_of_candidates == 0) + { TRACE_EVENT("NO candidates returned"); + return DictBackSpace(first_candidate); + } + else + { + /***************************Go-lite Optimization changes Start***********************/ + + //Aug 16, 2004 REF: CRR 24323 Deepa M.D + TRACE_EVENT_P1("No of candidates returned: %d", Dictionary.no_of_candidates); + /***************************Go-lite Optimization changes end***********************/ + + } + Zi8Copy((PZI8UCHAR)first_candidate, (&Dictionary.getParam), Dictionary.candidate_cursor); + /*MC, SPR 1150 - removed any code for chinese Pinyin from this function*/ + + /*SPR 1508*/ + if (Mmi_getCurrentLanguage() == GERMAN_LANGUAGE) + convert_chars_to_ascii(first_candidate, Mmi_getCurrentLanguage()); + /*return 0;*/ + /* SH - '1' will now be returned if the key is accepted, 0 otherwise */ + return 1; + +} + +/******************************************************************************* + + $Function: ResetDictSearch + + $Description: Resets dictionary search as match selected + + $Returns: status int + + $Arguments: none +*******************************************************************************/ + +int ResetDictSearch() +{ + Dictionary.getParam.ElementCount = 0; + Dictionary.more_count = 0; + Dictionary.no_of_candidates = 0; + Dictionary.candidate_cursor = 0; + + return 0; + +} + +/******************************************************************************* + + $Function: MoreCandidates + + $Description: gets next (set of) candidate(s) + + $Returns: status int + + $Arguments: string, pointer to int(not used ATM) +*******************************************************************************/ +//get the next set of candidates +//At the moment we only get one candidate at a time, but this allows us to get more than one +int MoreCandidates(char* first_candidate, int* no_of_candidates) +{ ZI8UCHAR temp[MAX_NO_OF_ELEMENTS + 1]; + + + //any more candidates to retrieve? + if (Dictionary.no_of_candidates > CANDIDATES_PER_GROUP) + { + Dictionary.more_count++; + Dictionary.getParam.FirstCandidate = Dictionary.more_count *CANDIDATES_PER_GROUP; + Dictionary.no_of_candidates = Zi8GetCandidates(&Dictionary.getParam); + + Zi8Copy((PZI8UCHAR)first_candidate, &(Dictionary.getParam), Dictionary.candidate_cursor); + + //return first candidate in group + } + + else + { + Dictionary.more_count = 0; + Dictionary.getParam.FirstCandidate = 0; + Dictionary.no_of_candidates = Zi8GetCandidates(&Dictionary.getParam); + + Zi8Copy((PZI8UCHAR)first_candidate, &(Dictionary.getParam), Dictionary.candidate_cursor); + } + /*SPR 1508*/ + if (Mmi_getCurrentLanguage() == GERMAN_LANGUAGE) + convert_chars_to_ascii(first_candidate, Mmi_getCurrentLanguage()); + + return 0; +} + +/******************************************************************************* + + $Function: ConvertToKeyPresses + + $Description: Takes a string and sends it as keypresses to dictionary to start new search + + $Returns: status int + + $Arguments: input string, output string(first match) +*******************************************************************************/ +//takes in a string +int ConvertToKeyPresses(char* string, char* first_candidate) +{ int no_of_chars; + int i; + + ResetDictSearch(); + no_of_chars = strlen(string); + for (i=0; i < no_of_chars; i++) + { + switch (string[i]) + { + + case ('A'): + case ('a'): + case ('B'): + case ('b'): + case ('C'): + case ('c'): + DictAlphaKeyPress(KCD_2, first_candidate); break; + case ('D'): + case ('d'): + case ('E'): + case ('e'): + case ('F'): + case ('f'): + DictAlphaKeyPress(KCD_3, first_candidate); break; + case ('G'): + case ('g'): + case ('H'): + case ('h'): + case ('I'): + case ('i'): + DictAlphaKeyPress(KCD_4, first_candidate); break; + case ('J'): + case ('j'): + case ('K'): + case ('k'): + case ('L'): + case ('l'): + DictAlphaKeyPress(KCD_5, first_candidate); break; + case ('M'): + case ('m'): + case ('N'): + case ('n'): + case ('O'): + case ('o'): + DictAlphaKeyPress(KCD_6, first_candidate); break; + case ('P'): + case ('p'): + case ('Q'): + case ('q'): + case ('R'): + case ('r'): + case ('S'): + case ('s'): + DictAlphaKeyPress(KCD_7, first_candidate); break; + case ('T'): + case ('t'): + case ('U'): + case ('u'): + case ('V'): + case ('v'): + DictAlphaKeyPress(KCD_8, first_candidate); break; + case ('W'): + case ('w'): + case ('X'): + case ('x'): + case ('Y'): + case ('y'): + case ('Z'): + case ('z'): + DictAlphaKeyPress(KCD_9, first_candidate); break; + default: DictAlphaKeyPress(KCD_1, first_candidate); break; + } + } + Dictionary.no_of_candidates = Zi8GetCandidates(&Dictionary.getParam); + Zi8Copy((PZI8UCHAR)first_candidate, &Dictionary.getParam, Dictionary.candidate_cursor); + /*SPR1508*/ + if (Mmi_getCurrentLanguage() == GERMAN_LANGUAGE) + convert_chars_to_ascii(first_candidate, Mmi_getCurrentLanguage()); + return 0; +} +/******************************************************************************* + + $Function: DictBackSpace + $Description: Removes last char from list of elements in dictionary search + + $Returns: status int + + $Arguments: output string(first match) +*******************************************************************************/ +int DictBackSpace(char* first_candidate) +{ + + if (Dictionary.more_count != 0) + { Dictionary.more_count --;} + else + if (Dictionary.getParam.ElementCount != 0) + { + //replace last element with 0 + Dictionary.getParam.pElements[--Dictionary.getParam.ElementCount] = 0; + } + Dictionary.more_count = 0; + Dictionary.getParam.FirstCandidate = 0; //start new word search + Dictionary.candidate_cursor = 0; + Dictionary.no_of_candidates = Zi8GetCandidates(&Dictionary.getParam); + Zi8Copy((PZI8UCHAR)first_candidate, &Dictionary.getParam, Dictionary.candidate_cursor); + /*SPR 1508*/ + if (Mmi_getCurrentLanguage() == GERMAN_LANGUAGE) + convert_chars_to_ascii(first_candidate, Mmi_getCurrentLanguage()); + return 0; +} +/******************************************************************************* + + $Function: convert_chars_to_ascii + $Description: Changes any language-specific chars from ezitext encoding to our ascii + encoding. Added for SPR 1508. + + $Returns: none + + $Arguments: input string, language +*******************************************************************************/ + void convert_chars_to_ascii(char* string, UBYTE language) +{ + switch(language) + { + + case (GERMAN_LANGUAGE): + { int i; + + for (i=0; i< strlen(string);i++) + { + + switch (string[i]) + { case (0x1e):string[i] = 225;break; /*SS*/ + case (0x7B):string[i] = 132;break; /*a with umlaut*/ + case (0x7c):string[i] = 148;break; /*o with umlaut*/ + case (0x7e):string[i] = 154;break; /*u with umlaut*/ + } + + } + break; + } + } + +}