FreeCalypso > hg > leo2moko-debug
diff g23m/condat/ms/src/atb/ATBPbGI.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/atb/ATBPbGI.c Mon Jun 01 03:24:05 2015 +0000 @@ -0,0 +1,948 @@ +/* ++--------------------------------------------------------------------+ +| PROJECT: MMI-Framework (8417) $Workfile:: ATBPbGI.c $| +| ++--------------------------------------------------------------------+ + + MODULE : ATBPbGI + + PURPOSE : This modul contains phonebook management functions using ATB. + + HISTORY: + + Oct 27, 2005 REF: OMAPS 48881 b-nekkare + Description: PhoneBook: The modify option under phonebook doesn't + work as expected. + Solution : Change is needed when we initially store the PB entry with + a '+' and then we delete the '+' and resave the number again. + If this is not done we would always end up preserving the TON + as INTERNATIONAL type +*/ +#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 <stdio.h> +#include <string.h> + +#include "mfw_mfw.h" +#include "mfw_sys.h" +#include "mfw_phb.h" +#include "mfw_cm.h" +#include "mfw_ss.h" + +#include "cus_aci.h" +#include "prim.h" +#include "pcm.h" + +#include "ATBPb.h" +#include "ATBPbGI.h" + + +/******************************************************************************* + * LOCAL FUNCTION PROTOTYPES + * + ******************************************************************************/ + +void GI_alpha_AlphaToAscii(T_MFW_PHB_TEXT *ascii, T_PB_ALPHA *alpha, SHORT max_len); +void GI_alpha_AsciiToAlpha(T_PB_ALPHA *alpha, T_MFW_PHB_TEXT *ascii, SHORT max_len); +T_PB_INDEX GI_index_Convert(UBYTE mode); + + +/******************************************************************************* + + $Function: GI_pb_GetPhonebook + + $Description: Checks to see which file system is selected + + $Returns: MFW_PHB_OK Action completed OK. + MFW_PHB_FAIL File write encountered an error + + $Arguments: intphonebook Place to store type of phonebook selected + (TRUE for FFS) + +*******************************************************************************/ + +T_MFW GI_pb_GetPhonebook(UBYTE *intphonebook) +{ + PB_RET result; + T_MFW ret; + T_PB_TYPE current_type; + + result = ATB_pb_GetPhonebook(PB_BOOK_DEFAULT, ¤t_type); + + if (current_type==PB_TYPE_FFS) + *intphonebook = TRUE; + else + *intphonebook = FALSE; + + if (result==PB_OK) + ret = MFW_PHB_OK; + else + ret = MFW_PHB_FAIL; + + return ret; +} + + +/******************************************************************************* + + $Function: GI_pb_SetPhonebook + + $Description: Selects file system + + $Returns: MFW_PHB_OK Action completed OK. + MFW_PHB_FAIL File write encountered an error + + $Arguments: intphonebook TRUE if FFS is to be used + +*******************************************************************************/ + +T_MFW GI_pb_SetPhonebook(UBYTE intphonebook) +{ + PB_RET result; + T_MFW ret; + T_PB_TYPE current_type; + + if (intphonebook) + current_type = PB_TYPE_FFS; + else + current_type = PB_TYPE_SIM; + + result = ATB_pb_SetPhonebook(PB_BOOK_DEFAULT, current_type); + + if (result==PB_OK) + ret = MFW_PHB_OK; + else + ret = MFW_PHB_FAIL; + + return ret; +} + + +/******************************************************************************* + + $Function: GI_pb_Initialise + + $Description: Initialise an instance of phonebook. Dynamically allocates a record + cache in RAM. Creates the necessary file(s) if they do not already exist. + Sorts the phonebook by name and by number, creating the appropriate + index tables. + + $Returns: MFW_PHB_OK + MFW_PHB_FAIL + + $Arguments: None + +*******************************************************************************/ + +T_MFW GI_pb_Initialise(void) +{ + PB_RET result; + T_MFW ret; + + tracefunction("GI_pb_Initialise"); + + result = ATB_pb_Initialise(PB_BOOK_DEFAULT, PB_TYPE_FFS, PB_RECORDS_MAX, + PB_CACHE_MAX, PB_ALPHATAG_MAX, PB_NUMBER_MAX, PB_EXT_MAX); + + switch(result) + { + case PB_OK: + ret = MFW_PHB_OK; + break; + case PB_EXCT: + ret = MFW_PHB_OK; + break; + case PB_BOOKALREADYEXISTS: + ret = MFW_PHB_FAIL; + break; + } + + return ret; +} + + +/******************************************************************************* + + $Function: GI_pb_Exit + + $Description: Frees memory associated with phonebook. To be called when the + phonebook is no longer required, or at shutdown. + + $Returns: MFW_PB_OK Action completed OK. + + $Arguments: None + +*******************************************************************************/ + +T_MFW GI_pb_Exit(void) +{ + tracefunction("GI_pb_Exit"); + + ATB_pb_Exit(PB_BOOK_DEFAULT); + return MFW_PHB_OK; +} + + +/******************************************************************************* + + $Function: GI_pb_Info + + $Description: Returns information about the phonebook, which will be returned + in the data structure pointed to by status. The caller must + allocate the T_MFW_PHB_STATUS structure. + + $Returns: MFW_PB_OK Action completed OK. + + $Arguments: status Data structure to contain phonebook info + +*******************************************************************************/ + +void GI_pb_Info(T_MFW_PHB_STATUS *status) +{ + T_PB_INFO info; + + tracefunction("GI_pb_Info"); + + ATB_pb_Info(PB_BOOK_DEFAULT, &info); + + status->book = PHB_IPB; + status->max_entries = (UBYTE)info.records_max; + status->used_entries = (UBYTE)info.records_used; + status->avail_entries = (UBYTE)info.records_free; + status->tag_len = PHB_MAX_LEN; + + return; +} + + +/******************************************************************************* + + $Function: GI_pb_Status + + $Description: Returns whether or not the phonebook is busy. If so, stat will contain + PHB_BUSY, otherwise PHB_READY. + + $Returns: None + + $Arguments: stat UBYTE to contain status information + +*******************************************************************************/ + +void GI_pb_Status(UBYTE *stat) +{ + PB_RET result; + + tracefunction("GI_pb_Status"); + + result = ATB_pb_Status(PB_BOOK_DEFAULT); + + return; +} + + + +/******************************************************************************* + + $Function: GI_pb_WriteRec + + $Description: Writes a record to the physical position index. If the index is + 0, a new record is added, otherwise the previous + record at that position is overwritten. + + $Returns: MFW_PHB_OK + MFW_PHB_FAIL + MFW_PHB_FULL + + $Arguments: entry The phonebook entry to write + +*******************************************************************************/ + +T_MFW GI_pb_WriteRec(T_MFW_PHB_ENTRY *entry) +{ + T_MFW ret; + PB_RET result; + SHORT index; + T_PB_RECORD *record; + UBYTE *number; + + tracefunction("GI_pb_WriteRec"); + + /* Allocate memory for record */ + + record = ATB_pb_AllocRec(PB_BOOK_DEFAULT); + + /* If the provided index is 0, we must add new record */ + + if (entry->index==0) + index = PB_NEW_RECORD; + else + index = (SHORT)(entry->index-1); /* MFW/ACI indices start at 1, ATB indices start at 0 */ + + /* Convert name to unicode*/ + + record->alpha.dcs = entry->name.dcs; + record->alpha.length = (UBYTE)entry->name.len; + GI_alpha_AsciiToAlpha(&record->alpha, &entry->name, PHB_MAX_LEN); + + /* Convert number to BCD */ + + record->ton_npi = entry->npi & 0x0F; + record->ton_npi |= (entry->ton<<4); + + number = entry->number; + + if (number[0]=='+') + { + record->ton_npi &= 0xF0; + record->ton_npi |= (MFW_TON_INTERNATIONAL<<4); + number++; + } + // Oct 27, 2005 REF: OMAPS OMAPS00048881 b-nekkare + else if(entry->ton == MFW_TON_INTERNATIONAL) + { + record->ton_npi = entry->npi & 0x0F; + record->ton_npi |= (MFW_TON_UNKNOWN<<4); + } + /* Anything else keep as is */ + + TRACE_EVENT_P1("ton_npi: %X", record->ton_npi); + + ATB_pb_CharToBCD(record->number, (char *)number, PB_NUMBER_MAX); + + /* Write the record */ + + result = ATB_pb_WriteRec(PB_BOOK_DEFAULT, INDEX_PHYSICAL, index, record); + + /* Free allocated record */ + + ATB_pb_FreeRec(PB_BOOK_DEFAULT, record); + + switch(result) + { + case PB_OK: + ret = MFW_PHB_OK; + break; + case PB_BOOKFULL: + ret = MFW_PHB_FULL; + break; + default: + ret = MFW_PHB_FAIL; + break; + } + + return ret; +} + + +/******************************************************************************* + + $Function: GI_pb_DeleteRec + + $Description: Deletes a record at a physical position index. + + $Returns: MFW_PHB_OK + MFW_PHB_FAIL + + $Arguments: index Physical index of the record to delete + +*******************************************************************************/ + +T_MFW GI_pb_DeleteRec(UBYTE index) +{ + T_MFW ret; + PB_RET result; + + tracefunction("GI_pb_DeleteRec"); + + /* MFW/ACI indices start at 1, ATB indices start at 0 */ + + index--; + + /* Delete record */ + + result = ATB_pb_DeleteRec(PB_BOOK_DEFAULT, INDEX_PHYSICAL, (SHORT)index); + + switch(result) + { + case PB_OK: + ret = MFW_PHB_OK; + break; + default: + ret = MFW_PHB_FAIL; + break; + } + + return ret; +} + + +/******************************************************************************* + + $Function: GI_pb_Find + + $Description: Find the nearest match to the supplied record. + + $Returns: MFW_PHB_OK + MFW_PHB_FAIL + + $Arguments: mode Specifies the sorting for the index list + index Place to store the index of the matching record + num_recs Number of records to read in + search_pattern The string or number to match + entries Place to store the resulting list of entries + +*******************************************************************************/ + +T_MFW GI_pb_Find(UBYTE mode, UBYTE *index, UBYTE num_recs, T_MFW_PHB_TEXT *search_pattern, T_MFW_PHB_LIST *entries) +{ + PB_RET result; + T_MFW ret; + T_PB_INDEX index_type = GI_index_Convert(mode); + T_PB_RECORD *record; + SHORT recs_count; + SHORT rec_index; + UBYTE *number; + + tracefunction("GI_pb_Find"); + + /* Allocate memory for record */ + + record = ATB_pb_AllocRec(PB_BOOK_DEFAULT); + + /* Convert name to unicode, or number to BCD */ + + if(index_type==INDEX_NAME) + { + GI_alpha_AsciiToAlpha(&record->alpha, search_pattern, PB_ALPHATAG_MAX); + } + else + { + /* Convert number to BCD */ + + number = search_pattern->data; + + if (number[0]=='+') + { + number++; + } + ATB_pb_CharToBCD(record->number, (char *)number, PB_NUMBER_MAX); + } + + result = ATB_pb_Find(PB_BOOK_DEFAULT, index_type, record, &rec_index, NULL); + + if (result==PB_OK) + { + *index = rec_index+1; /* MFW/ACI indices start at 1, ATB indices start at 0 */ + result = GI_pb_ReadRecList(mode, (UBYTE)(*index), num_recs, entries); + } + + /* Free allocated record */ + + ATB_pb_FreeRec(PB_BOOK_DEFAULT, record); + + + switch(result) + { + case PB_OK: + ret = MFW_PHB_OK; + break; + default: + ret = MFW_PHB_FAIL; + break; + } + + return ret; +} + +/******************************************************************************* + + $Function: GI_pb_ReadRecList + + $Description: Read in a list of entries. + + $Returns: MFW_PHB_OK + MFW_PHB_FAIL + + $Arguments: mode Specifies the sorting for the index list + index Place to store the index of the matching record + num_recs Number of records to read in + entries Place to store the resulting list of entries + +*******************************************************************************/ + +T_MFW GI_pb_ReadRecList(UBYTE mode, UBYTE index, UBYTE num_recs, T_MFW_PHB_LIST *entries) +{ + PB_RET result; + T_MFW ret; + T_PB_INDEX index_type = GI_index_Convert(mode); + T_PB_RECORD *record; + SHORT recs_count; + + tracefunction("GI_pb_ReadRecList"); + + /* MFW/ACI indices start at 1, ATB indices start at 0 */ + + index--; + + /* Allocate memory for record */ + + record = ATB_pb_AllocRec(PB_BOOK_DEFAULT); + + for (recs_count = 0; recs_count<(SHORT)num_recs; recs_count++) + { + result = ATB_pb_ReadRec(PB_BOOK_DEFAULT, index_type, (SHORT)(index+recs_count), record); + if (result!=PB_OK) + break; + + entries->entry[recs_count].book = PHB_IPB; + entries->entry[recs_count].index = GI_pb_ConvIndex(index_type, (UBYTE)(index+recs_count), INDEX_PHYSICAL); + entries->entry[recs_count].ton = (record->ton_npi & 0xF0)>>4; + entries->entry[recs_count].npi = record->ton_npi & 0x0F; + GI_alpha_AlphaToAscii(&entries->entry[recs_count].name, &record->alpha, PB_ALPHATAG_MAX); + ATB_pb_BCDToChar((char *)entries->entry[recs_count].number, record->number, PB_NUMBER_MAX); + } + + entries->book = PHB_IPB; + + if (recs_count) + { + entries->result = MFW_ENTRY_EXIST; + entries->num_entries = (UBYTE) recs_count; + /* SPR#1994 - SH - If at least one record is found, result is a success */ + result = PB_OK; + } + else + { + entries->result = MFW_NO_ENTRY; + } + + /* Free allocated record */ + + ATB_pb_FreeRec(PB_BOOK_DEFAULT, record); + + switch(result) + { + case PB_OK: + ret = MFW_PHB_OK; + break; + case PB_RECDOESNOTEXIST: + ret = MFW_PHB_FAIL; + break; + default: + ret = MFW_PHB_FAIL; + break; + } + + return ret; +} + +/******************************************************************************* + + $Function: GI_pb_ConvIndex + + $Description: Returns the index in table new_index_type corresponding to the index + in table index_type. + + $Returns: The new index + + $Arguments: index_type The index table of the original index. + index The original logical index. + new_index_type The index table required. + +*******************************************************************************/ + +UBYTE GI_pb_ConvIndex(T_PB_INDEX index_type, UBYTE index, T_PB_INDEX new_index_type) +{ + SHORT new_index; + + tracefunction("GI_pb_ConvIndex"); + + ATB_pb_ConvIndex(PB_BOOK_DEFAULT, index_type, (SHORT)index, new_index_type, &new_index); + + /* MFW/ACI indices start at 1, ATB indices start at 0 */ + + if (new_index_type==INDEX_PHYSICAL) + { + new_index++; + } + + return (UBYTE)new_index; +} + + +/******************************** + * Functions called by the ATB PB * + ********************************/ + +/******************************************************************************* + + $Function: GI_pb_OK + + $Description: This function is called if the requested command executed successfully. + The param parameter is a pointer to command specific information, + when such information is required to be passed from the ATB to the GI. + See the individual functions for more details. + + $Returns: None. + + $Arguments: phonebook_id The phonebook identifier + command_id Identifies the command. + param Pointer to command-specific information + +*******************************************************************************/ + +void GI_pb_OK(SHORT phonebook_id, SHORT command_id, void *param) +{ + trace("GI_pb_OK"); + + if (param!=NULL) + { + trace_P1("Param is: %d", *((SHORT *)param)); + } +} + +/******************************************************************************* + + $Function: GI_pb_Error + + $Description: This function is called if an error was returned while executing the + requested command. + + $Returns: None. + + $Arguments: phonebook_id The phonebook identifier + command_id Identifies the command. + error_id Identifies the error that occurred. + +*******************************************************************************/ + +void GI_pb_Error(SHORT phonebook_id, SHORT command_id, SHORT error_id) +{ + trace("GI_pb_Error"); + trace_P2("***ERROR*** - command %d, error %d", command_id, error_id); + + return; +} + + +/******************************************************************************* + + $Function: GI_pb_MemAlloc + + $Description: Dynamically allocates memory for the phonebook. + + $Returns: The address of the block of allocated memory, or NULL if failed. + + $Arguments: size - Amount of memory to be allocated in bytes + +*******************************************************************************/ +// Dec 22, 2004 REF: CRR MFW-SPR-27847 xnkulkar +// Description: MFW memory size variable changed from U16 -> U32 +// Solution: The use of variable U16 has been replaced with U32 + +UBYTE *GI_pb_MemAlloc(U32 size) +{ + return mfwAlloc((U32)size); +} + + +/******************************************************************************* + + $Function: GI_pb_MemFree + + $Description: Frees dynamically allocated memory. + + $Returns: None + + $Arguments: mem - Pointer to a block of allocated memory + size - Size of the block + +*******************************************************************************/ +// Dec 22, 2004 REF: CRR MFW-SPR-27847 xnkulkar +// Description: MFW memory size variable changed from U16 -> U32 +// Solution: The use of variable U16 has been replaced with U32 + +void GI_pb_MemFree(UBYTE *mem, U32 size) +{ + mfwFree(mem, (U32)size); + return; +} + + +/******************************************************************************* + + $Function: GI_pb_Match + + $Description: This function allows the user to specify the way in which entries are + matched during searching. This provides the capability of searching + languages with non-Latin alphabets, or searching through special user + fields. + This function attempts a match between two records based on the + field appropriate for the index list, specified in index_type. It returns + a value indicating whether there is no match (MATCH_NONE), + a partial match (MAX_START), or an exact match (MATCH_EXACT). + Note that the contents of the records themselves should not be altered + by this function. The sole result should be a return value that specifies + how the first record matches the second. If it is preferred that the + default matching routine is used (i.e match from the start for alpha + tags, match from the end for phone numbers) then MATCH_DEFAULT + should be returned. + + $Returns: MATCH_DEFAULT, MATCH_EXACT, MATCH_START or MATCH_NONE + + $Arguments: record1 The first record to be compared + record2 The second record to be compared + index_type Indicator of the field which is to be compared + +*******************************************************************************/ + +T_PB_MATCH GI_pb_Match(T_PB_RECORD *record1,T_PB_RECORD *record2, T_PB_INDEX index_type) +{ + return MATCH_DEFAULT; +} + + +/******************************************************************************* + + $Function: GI_pb_Compare + + $Description: This function allows the user to specify the way in which entries are + compared during sorting. This provides the capability of sorting languages + with non-Latin alphabets, or sorting to alternative orders (for example, + reverse alphabetical). + This function compares two records based on the field appropriate for the + index list, specified in index_type. + It returns a value indicating whether the first record should come before + or after the second. + Note that the contents of the records themselves should not be altered by + this function. The sole result should be a return value that specifies + whether or not the positions of the records should be swapped. If it + is preferred that the default comparison routine is used (e.g.Latin + alphabetical ascending) then COMPARE_DEFAULT should be returned. + + + $Returns: COMPARE_DEFAULT No comparison made - use the default comparison method + COMPARE_FIRSTBEFORE The first record should come before the second record + COMPARE_FIRSTAFTER The first record should come after the second record + + $Arguments: record1 The first record to be compared + record2 The second record to be compared + index_type Index list to use + +*******************************************************************************/ + +T_PB_COMPARE GI_pb_Compare (T_PB_RECORD *record1,T_PB_RECORD *record2, T_PB_INDEX index_type) +{ + return COMPARE_DEFAULT; +} + + +/******************************************************************************* + + $Function: GI_pb_GetTable + + $Description: If fields other than name and number are required, then index tables + must be provided for each field. This function is called when access + to an index table is required for an unknown index type. + + The array provided must be a user-allocated array of type SHORT, + records_max in size, e.g. + + static SHORT user_table[RECORDS_MAX]; + return user_table; + + $Returns: A pointer to an array of SHORTs records_max in size. + + $Arguments: index_type Index list to use + +*******************************************************************************/ + +SHORT *GI_pb_GetTable (T_PB_INDEX index_type) +{ + SHORT *user_table = NULL; /*DUMMY IMPLEMENTATION*/ + return user_table; +} + + +/******************************************************************************* + + $Function: GI_alpha_AlphaToAscii + + $Description: Convert an alpha tag to an ascii string + + $Returns: None + + $Arguments: ascii The ascii string + alpha The alpha tag + max_len The maximum length of the resulting string + +*******************************************************************************/ + +void GI_alpha_AlphaToAscii(T_MFW_PHB_TEXT *ascii, T_PB_ALPHA *alpha, SHORT max_len) +{ + SHORT asciiIndex; + SHORT alphaIndex; + + /* Unicode entry - swap the low and high bytes, add in 0x80 at start*/ + + ascii->dcs = alpha->dcs; + + if (alpha->dcs == MFW_DCS_UCS2) + { + ascii->data[0] = 0x80; + asciiIndex = 1; + alphaIndex = 0; + + while (alphaIndex<alpha->length && asciiIndex<max_len) + { + ascii->data[asciiIndex++] = (char) (alpha->data[alphaIndex]>>8); + ascii->data[asciiIndex++] = (char) (alpha->data[alphaIndex] & 0xFF); + alphaIndex++; + } + + /* Put two NULLs at the end, if there is space */ + + if (asciiIndex<max_len) + ascii->data[asciiIndex++] = NULL; + if (asciiIndex<max_len) + ascii->data[asciiIndex] = NULL; + + ascii->len = asciiIndex; + } + + /* Ascii entry - convert from unicode */ + + else + { + asciiIndex = 0; + alphaIndex = 0; + + while (alphaIndex<alpha->length && asciiIndex<max_len) + { + ascii->data[asciiIndex++] = (char) (alpha->data[alphaIndex++]); + } + + /* Put a NULL at the end, if there is space */ + + if (asciiIndex<max_len) + ascii->data[asciiIndex] = NULL; + + ascii->len = asciiIndex; + } + + return; +} + + +/******************************************************************************* + + $Function: GI_alpha_AsciiToAlpha + + $Description: Convert an ascii string to an alpha tag + + $Returns: None + + $Arguments: alpha The alpha tag + ascii The ascii string + max_len The maximum length of the resulting string + +*******************************************************************************/ + +void GI_alpha_AsciiToAlpha(T_PB_ALPHA *alpha, T_MFW_PHB_TEXT *ascii, SHORT max_len) +{ + SHORT asciiIndex; + SHORT alphaIndex; + + alpha->dcs = ascii->dcs; + + /* Unicode entry - swap the low and high bytes, ignore first '0x80' character */ + + if (ascii->dcs == MFW_DCS_UCS2) + { + asciiIndex = 1; + alphaIndex = 0; + + while (asciiIndex<ascii->len && alphaIndex<max_len) + { + alpha->data[alphaIndex++] = (USHORT) ((ascii->data[asciiIndex++]<<8) | ascii->data[asciiIndex++]); + } + + /* Put a NULL at the end, if there is space */ + + if (alphaIndex<max_len) + alpha->data[alphaIndex] = NULL; + } + + /* Ascii entry - convert to unicode */ + + else + { + asciiIndex = 0; + alphaIndex = 0; + + while (asciiIndex<ascii->len && alphaIndex<max_len) + { + alpha->data[alphaIndex++] = (USHORT)ascii->data[asciiIndex++]; + } + + /* Put a NULL at the end, if there is space */ + + if (alphaIndex<max_len) + alpha->data[alphaIndex] = NULL; + } + + alpha->length = alphaIndex; + + return; +} + + +/******************************************************************************* + + $Function: GI_index_Convert + + $Description: Convert indexing types from MFW to ATB. + + $Returns: The ATB indexing type + + $Arguments: mode The MFW sort mode + +*******************************************************************************/ + +T_PB_INDEX GI_index_Convert(UBYTE mode) +{ + T_PB_INDEX index_type; + + switch(mode) + { + case MFW_PHB_ALPHA: + index_type = INDEX_NAME; + break; + case MFW_PHB_NUMBER: + index_type = INDEX_NUMBER; + break; + case MFW_PHB_INDEX: + index_type = INDEX_PHYSICAL; /* NOTE - may not work quite as intended */ + break; + case MFW_PHB_PHYSICAL: + index_type = INDEX_PHYSICAL; + break; + } + + return index_type; +}