diff g23m/condat/ms/src/bmi/MmiDictionary.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/condat/ms/src/bmi/MmiDictionary.c	Mon Jun 01 03:24:05 2015 +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;
+		}
+	}
+
+}