GSM7BitDefaultAlphabet.c
上传用户:lqx1163
上传日期:2014-08-13
资源大小:9183k
文件大小:47k
源码类别:

MTK

开发平台:

C/C++

  1. /*****************************************************************************
  2. *  Copyright Statement:
  3. *  --------------------
  4. *  This software is protected by Copyright and the information contained
  5. *  herein is confidential. The software may not be copied and the information
  6. *  contained herein may not be used or disclosed except with the written
  7. *  permission of MediaTek Inc. (C) 2005
  8. *
  9. *  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  10. *  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  11. *  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  12. *  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  13. *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  14. *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  15. *  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  16. *  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  17. *  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  18. *  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  19. *  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  20. *  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  21. *
  22. *  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  23. *  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  24. *  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  25. *  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  26. *  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
  27. *
  28. *  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  29. *  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  30. *  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  31. *  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  32. *  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  33. *
  34. *****************************************************************************/
  35. /*******************************************************************************
  36.  * Filename:
  37.  * ---------
  38.  *  GSM7BitDefaultAlphabet.c
  39.  *
  40.  * Project:
  41.  * --------
  42.  *  MAUI
  43.  *
  44.  * Description:
  45.  * ------------
  46.  *  
  47.  *
  48.  * Author:
  49.  * -------
  50.  *  
  51.  *
  52.  *==============================================================================
  53.  *             HISTORY
  54.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! 
  55.  *------------------------------------------------------------------------------
  56.  * removed!
  57.  *
  58.  * removed!
  59.  * removed!
  60.  * removed!
  61.  *
  62.  * removed!
  63.  * removed!
  64.  * removed!
  65.  *
  66.  * removed!
  67.  * removed!
  68.  * removed!
  69.  *
  70.  * removed!
  71.  * removed!
  72.  * removed!
  73.  *
  74.  * removed!
  75.  * removed!
  76.  * removed!
  77.  *
  78.  * removed!
  79.  * removed!
  80.  * removed!
  81.  *
  82.  * removed!
  83.  * removed!
  84.  * removed!
  85.  *
  86.  *------------------------------------------------------------------------------
  87.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! 
  88.  *==============================================================================
  89.  *******************************************************************************/
  90. /**
  91.  * Copyright Notice
  92.  * ?2002 - 2003, Pixtel Communications, Inc., 1489 43rd Ave. W.,
  93.  * Vancouver, B.C. V6M 4K8 Canada. All Rights Reserved.
  94.  *  (It is illegal to remove this copyright notice from this software or any
  95.  *  portion of it)
  96.  */
  97. /**************************************************************
  98.    FILENAME : GSM7BitDefaultAlphabet.c
  99.    PURPOSE     : Converts GSM 7-bit Default alphabet to ascii and
  100.                Ascii to GSM 7-bit Default alphabet
  101.    REMARKS     : .
  102.    AUTHOR      : .
  103.    DATE     : 11-07-03
  104. **************************************************************/
  105. #include "stdC.h"
  106. #include "PixtelDataTypes.h"
  107. #include "GSM7BitDefaultAlphabet.h"
  108. #include "unicodexdcl.h"
  109. /* micha1018 */
  110. #include "wgui_categories.h"
  111. #ifndef GSM_7BIT_DEFAULT_ALPHABET_DEBUG
  112. #undef PRINT_INFORMATION
  113. #define PRINT_INFORMATION(args) NULL
  114. #endif /* GSM_7BIT_DEFAULT_ALPHABET_DEBUG */ 
  115. #define SWAP_SHORT(Var)  *Var = *(short*)         SwapEndian((void*)Var, sizeof(short))
  116. #define SWAP_USHORT(Var) *Var = *(unsigned short*)SwapEndian((void*)Var, sizeof(short))
  117. #define SWAP_LONG(Var)   *Var = *(long*)          SwapEndian((void*)Var, sizeof(long))
  118. #define SWAP_ULONG(Var)  *Var = *(unsigned long*) SwapEndian((void*)Var, sizeof(long))
  119. #define SWAP_FLOAT(Var)  *Var = *(float*)         SwapEndian((void*)Var, sizeof(float))
  120. #define SWAP_DOUBLE(Var) *Var = *(double*)        SwapEndian((void*)Var, sizeof(double))
  121. #define UI_GET_NEXT_BYTE(p,c)          
  122. {  c=(*p);                             
  123.    p+=1;                               
  124. }
  125. #define UI_GET_PREVIOUS_BYTE(p,c)         
  126. {  p-=1;                                  
  127.    c=(*p);                                
  128. }
  129. #define UI_INSERT_BYTE(p,c)               
  130. {  (*((p))++)=(U8)(c);                    
  131. }
  132. #define UI_SWAP_U16_BYTES(c) (c)=((c)>>8)|((c)<<8)
  133. #define _EURO_CHARACTER_UCS2     (0x20AC)
  134. #define _EURO_CHARACTER          (0xA2)
  135. #define _ESCAPE_CHARACTER        (27)
  136. #define _SPACE_CHARACTER         (32)
  137. extern const U8 AsciiToDefaultArray[];
  138. extern const U8 ExtendedAsciiToDefaultArray[];
  139. extern const U8 DefaultToExtendedAsciiArray[];
  140. extern const U8 DefaultToAsciiArray[];
  141. const U8 DefaultToAsciiArray[128] = 
  142. {
  143.     64, 163, 36, 165, 232, 233, 249, 236, 242, 199,
  144.     10, 216, 248, 13, 197, 229, 16, 95, 18, 19,
  145.     20, 21, 22, 23, 24, 25, 26, 27, 198, 230,
  146.     223, 200, 32, 33, 34, 35, 164, 37, 38, 39,
  147.     40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
  148.     50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
  149.     60, 61, 62, 63, 161, 65, 66, 67, 68, 69,
  150.     70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  151.     80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
  152.     90, 196, 214, 209, 220, 167, 191, 97, 98, 99,
  153.     100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
  154.     110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
  155.     120, 121, 122, 228, 246, 241, 252, 224
  156. };
  157. const U8 DefaultToExtendedAsciiArray[128] = 
  158. {
  159.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  160.     32, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /* Page Break at 10=32 Change Later */
  161.     94, 0, 0, 0, 0, 0, 0, 32, 0, 0,
  162.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  163.     123, 125, 0, 0, 0, 0, 0, 92, 0, 0,
  164.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  165.     91, 126, 93, 0, 124, 0, 0, 0, 0, 0,
  166.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  167.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  168.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  169.     0, 162, 0, 0, 0, 0, 0, 0, 0, 0, /* Euro character at 101 changed to 162 */
  170.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  171.     0, 0, 0, 0, 0, 0, 0, 0
  172. };
  173. const U8 AsciiToDefaultArray[] = 
  174. {
  175.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  176.     10, 32, 32, 13, 32, 32, 16, 32, 18, 19,
  177.     20, 21, 22, 23, 24, 25, 26, 27, 32, 32,
  178.     32, 32, 32, 33, 34, 35, 2, 37, 38, 39,
  179.     40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
  180.     50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
  181.     60, 61, 62, 63, 0, 65, 66, 67, 68, 69,
  182.     70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  183.     80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
  184.     90, 32, 32, 32, 32, 17, 32, 97, 98, 99,
  185.     100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
  186.     110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
  187.     120, 121, 122, 32, 32, 32, 32, 32, 32, 32,
  188.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  189.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  190.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  191.     32, 64, 32, 1, 36, 3, 32, 95, 32, 32,
  192.     32, 32, 32, 64, 32, 32, 32, 32, 32, 32,
  193.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  194.     32, 96, 32, 32, 32, 32, 91, 14, 28, 9,
  195.     31, 32, 32, 32, 32, 32, 32, 32, 32, 93,
  196.     32, 32, 32, 32, 92, 32, 11, 32, 32, 32,
  197.     94, 32, 32, 30, 127, 32, 32, 32, 123, 15,
  198.     29, 32, 4, 5, 32, 32, 7, 32, 32, 32,
  199.     32, 125, 8, 32, 32, 32, 124, 32, 12, 6,
  200.     32, 32, 126, 32, 32, 32
  201. };
  202. const U8 ExtendedAsciiToDefaultArray[] = 
  203. {
  204.     0, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  205.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  206.     32, 32, 32, 32, 32, 32, 32, 27, 32, 32,
  207.     32, 32, 10, 32, 32, 32, 32, 32, 32, 32,
  208.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  209.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  210.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  211.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  212.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  213.     32, 60, 47, 62, 20, 32, 32, 32, 32, 32,
  214.     32, 101, 32, 32, 32, 32, 32, 32, 32, 32,
  215.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  216.     32, 32, 32, 40, 64, 41, 61, 32, 32, 32,
  217.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  218.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  219.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  220.     32, 32, 101, 32, 32, 32, 32, 32, 32, 32,    /* Changed character at 162 to 101 (old value was 32) */
  221.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  222.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  223.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  224.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  225.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  226.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  227.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  228.     32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  229.     32, 32, 32, 32, 32, 32
  230. };
  231. /*****************************************************************************
  232.  * FUNCTION
  233.  *  ConvertGSM7BitDefaultEncodingToAscii
  234.  * DESCRIPTION
  235.  *  Converts 7 bit encoding to 8 bit Ascii
  236.  * PARAMETERS
  237.  *  message     [IN]        Output Buffer
  238.  *  msg         [IN]        Input Buffer
  239.  *  length      [IN]        No of bytes to be converted
  240.  *  outLen      [?]         
  241.  * RETURNS
  242.  *  void
  243.  *****************************************************************************/
  244. void ConvertGSM7BitDefaultEncodingToAscii(U8 *message, U8 *msg, U16 length, U16 *outLen)
  245. {
  246.     /*----------------------------------------------------------------*/
  247.     /* Local Variables                                                */
  248.     /*----------------------------------------------------------------*/
  249.     U16 i, j = 0;
  250.     /*----------------------------------------------------------------*/
  251.     /* Code Body                                                      */
  252.     /*----------------------------------------------------------------*/
  253.     for (i = 0; i < length; i++)
  254.     {
  255.         if (msg[i] != 27)   /* escape char ? */
  256.         {
  257.             /* if(msg[i]!=13)       //CR ? */
  258.             message[j++] = DefaultToAsciiArray[msg[i]];
  259.         }
  260.         else
  261.         {
  262.             /* treat escape char as a space */
  263.             message[j++] = 32;
  264.         }
  265.     }
  266.     if (outLen != NULL)
  267.     {
  268.         *outLen = j;
  269.     }
  270. }
  271. /*****************************************************************************
  272.  * FUNCTION
  273.  *  GSM7BitMapDefaultToASCIIByte
  274.  * DESCRIPTION
  275.  *  Converts 7 bit encoding to 8 bit Ascii
  276.  * PARAMETERS
  277.  *  input       [IN]        (GSM 7 bit encoded value)
  278.  *  none(?)     [OUT]       
  279.  * RETURNS
  280.  *  U8 (ASCII value)
  281.  *****************************************************************************/
  282. U8 GSM7BitMapDefaultToASCIIByte(U8 input)
  283. {
  284.     /*----------------------------------------------------------------*/
  285.     /* Local Variables                                                */
  286.     /*----------------------------------------------------------------*/
  287.     /*----------------------------------------------------------------*/
  288.     /* Code Body                                                      */
  289.     /*----------------------------------------------------------------*/
  290.     if (input == 27)
  291.     {
  292.         return 32;  /* return space for "Escape" */
  293.     }
  294.     if (input == 13)
  295.     {
  296.         return 13;  /* Returning same value, but UI should skip CR */
  297.     }
  298.     return DefaultToAsciiArray[input];  /* use the table for the rest */
  299. }
  300. /*****************************************************************************
  301.  * FUNCTION
  302.  *  GSM7BitMapASCIIToDefaultByte
  303.  * DESCRIPTION
  304.  *  Converts  8 bit Ascii to 7 bit encoding
  305.  * PARAMETERS
  306.  *  input       [IN]        (ASCII value)
  307.  *  none(?)     [OUT]       
  308.  * RETURNS
  309.  *  U8 (GSM 7 bit encoded value)
  310.  *****************************************************************************/
  311. U8 GSM7BitMapASCIIToDefaultByte(U8 input)
  312. {
  313.     /*----------------------------------------------------------------*/
  314.     /* Local Variables                                                */
  315.     /*----------------------------------------------------------------*/
  316.     /*----------------------------------------------------------------*/
  317.     /* Code Body                                                      */
  318.     /*----------------------------------------------------------------*/
  319.     return AsciiToDefaultArray[input];
  320. }
  321. /*****************************************************************************
  322.  * FUNCTION
  323.  *  ConvertAsciiEncodingToGSM7BitDefault
  324.  * DESCRIPTION
  325.  *  Converts  8 bit Ascii to 7 bit encoding
  326.  * PARAMETERS
  327.  *  message     [IN]        Output Buffer
  328.  *  msg         [IN]        Input Buffer
  329.  *  length      [IN]        No of bytes to be converted
  330.  *  outLen      [?]         
  331.  * RETURNS
  332.  *  void
  333.  *****************************************************************************/
  334. void ConvertAsciiEncodingToGSM7BitDefault(U8 *message, U8 *msg, U16 length, U16 *outLen)
  335. {
  336.     /*----------------------------------------------------------------*/
  337.     /* Local Variables                                                */
  338.     /*----------------------------------------------------------------*/
  339.     U16 i, j;
  340.     /*----------------------------------------------------------------*/
  341.     /* Code Body                                                      */
  342.     /*----------------------------------------------------------------*/
  343.     for (i = 0, j = 0; i < length; i++, j++)
  344.     {
  345.         message[j] = AsciiToDefaultArray[msg[i]];
  346.     }
  347.     if (outLen != NULL)
  348.     {
  349.         *outLen = j;
  350.     }
  351. }
  352. #ifndef OSL_MEMORY_DUMP
  353. /*****************************************************************************
  354.  * FUNCTION
  355.  *  CovertStringForSIM
  356.  * DESCRIPTION
  357.  *  Converts data from Platfrorm (ASCII or UCS2) format to one specified
  358.  * PARAMETERS
  359.  *  data            [IN]        Pointer to dat to be converted
  360.  *  len             [IN]        No of bytes to be converted
  361.  *  format          [IN]        Format to which data is to be converted 7 bit. 8 bit or UCS2
  362.  *  outLen          [?]         
  363.  *  outlen(?)       [OUT]       Pointer in which output length will be returned
  364.  * RETURNS
  365.  *  Pointer to data containing converted data
  366.  *****************************************************************************/
  367. U8 *CovertStringForSIM(U8 *data, U16 len, U8 format, U16 *outLen)
  368. {
  369.     /*----------------------------------------------------------------*/
  370.     /* Local Variables                                                */
  371.     /*----------------------------------------------------------------*/
  372.     U8 *convertedData = NULL;
  373.     U16 outLength;
  374.     /*----------------------------------------------------------------*/
  375.     /* Code Body                                                      */
  376.     /*----------------------------------------------------------------*/
  377.     if (len > 0)
  378.     {
  379.         switch (format)
  380.         {
  381.             case MMI_DEFAULT_DCS:
  382.                 {
  383.                     U8 *tempData;
  384.                     convertedData = OslMalloc((len) + 1);
  385.                     tempData = OslMalloc(len);
  386.                     UnicodeNToAnsii((PS8) tempData, (PS8) data, len);
  387.                     ConvertAsciiEncodingToGSM7BitDefault(
  388.                         convertedData,
  389.                         tempData,
  390.                         (U16) (len / ENCODING_LENGTH),
  391.                         &outLength);
  392.                     OslMfree(tempData);
  393.                     convertedData[outLength] = 0;
  394.                     if (outLen != NULL)
  395.                     {
  396.                         *outLen = outLength + 1;
  397.                     }
  398.                 }
  399.                 break;
  400.             case MMI_8BIT_DCS:
  401.                 convertedData = OslMalloc((len / ENCODING_LENGTH) + 1);
  402.                 UnicodeNToAnsii((PS8) convertedData, (PS8) data, len);
  403.                 memset((void*)&convertedData[len / ENCODING_LENGTH], 0, 1);
  404.                 if (outLen != NULL)
  405.                 {
  406.                     *outLen = len / ENCODING_LENGTH + 1;
  407.                 }
  408.                 break;
  409.             case MMI_UCS2_DCS:
  410.                 convertedData = OslMalloc((len) + ENCODING_LENGTH);
  411.                 memcpy(convertedData, data, len);
  412.                 memset((void*)&convertedData[len], 0, ENCODING_LENGTH);
  413.                 if (outLen != NULL)
  414.                 {
  415.                     *outLen = len + ENCODING_LENGTH;
  416.                 }
  417.             #ifdef MMI_ON_HARDWARE_P
  418.                 {
  419.                     U16 *tempData;
  420.                     int i;
  421.                     tempData = (U16*) convertedData;
  422.                     for (i = 0; i < len * 2 / ENCODING_LENGTH; i += 2)
  423.                     {
  424.                         SWAP_USHORT(tempData);
  425.                         tempData++;
  426.                     }
  427.                 }
  428.             #endif /* MMI_ON_HARDWARE_P */ 
  429.                 break;
  430.         }
  431.         return convertedData;
  432.     }
  433.     else
  434.     {
  435.         U8 noOfNulls;
  436.         if (format == MMI_UCS2_DCS)
  437.         {
  438.             noOfNulls = 2;
  439.         }
  440.         else
  441.         {
  442.             noOfNulls = 1;
  443.         }
  444.         convertedData = OslMalloc(noOfNulls);
  445.         memset((void*)convertedData, 0, noOfNulls);
  446.         if (outLen != NULL)
  447.         {
  448.             *outLen = noOfNulls;
  449.         }
  450.         return convertedData;
  451.     }
  452. }
  453. /*****************************************************************************
  454.  * FUNCTION
  455.  *  CovertStringForPlatform
  456.  * DESCRIPTION
  457.  *  Converts data from specified format to Platform type (UCS2 or ASCII)
  458.  * PARAMETERS
  459.  *  data            [IN]        Pointer to data to be converted
  460.  *  len             [IN]        No of bytes to be converted
  461.  *  format          [IN]        Format of input data
  462.  *  outLen          [?]         
  463.  *  outlen(?)       [OUT]       Pointer in which output length will be returned
  464.  * RETURNS
  465.  *  Pointer to data containing converted data
  466.  *****************************************************************************/
  467. U8 *CovertStringForPlatform(U8 *data, U16 len, U8 format, U16 *outLen)
  468. {
  469.     /*----------------------------------------------------------------*/
  470.     /* Local Variables                                                */
  471.     /*----------------------------------------------------------------*/
  472.     /* MTK JL added for init */
  473.     U8 *convertedData = NULL;
  474.     /* MTK end */
  475.     U16 outLength;
  476.     /*----------------------------------------------------------------*/
  477.     /* Code Body                                                      */
  478.     /*----------------------------------------------------------------*/
  479.     if (len > 0)
  480.     {
  481.         switch (format)
  482.         {
  483.             case (MMI_DEFAULT_DCS):
  484.                 {
  485.                     U8 *tempData;
  486.     
  487.                     convertedData = OslMalloc((len * ENCODING_LENGTH) + ENCODING_LENGTH);
  488.                     tempData = OslMalloc(len);
  489.                     ConvertGSM7BitDefaultEncodingToAscii(tempData, data, len, &outLength);
  490.                     AnsiiNToUnicodeString((PS8) convertedData, (PS8) tempData, outLength);
  491.                     memset((void*)&convertedData[outLength * ENCODING_LENGTH], 0, ENCODING_LENGTH);
  492.                     OslMfree(tempData);
  493.                 }
  494.                 if (outLen != NULL)
  495.                 {
  496.                     *outLen = outLength * ENCODING_LENGTH + ENCODING_LENGTH;
  497.                 }
  498.                 break;
  499.             case (MMI_8BIT_DCS):
  500.                 convertedData = OslMalloc((len * ENCODING_LENGTH) + ENCODING_LENGTH);
  501.                 AnsiiNToUnicodeString((PS8) convertedData, (PS8) data, len);
  502.                 memset((void*)&convertedData[len * ENCODING_LENGTH], 0, ENCODING_LENGTH);
  503.                 if (outLen != NULL)
  504.                 {
  505.                     *outLen = len * ENCODING_LENGTH + ENCODING_LENGTH;
  506.                 }
  507.                 break;
  508.             case (MMI_UCS2_DCS):
  509.                 convertedData = OslMalloc(len + 1 + ENCODING_LENGTH);   /* prevent odd len number */
  510.                 memset((void*)convertedData, 0, len + 1 + ENCODING_LENGTH);
  511.                 memcpy(convertedData, data, len);
  512.                 if (outLen != NULL)
  513.                 {
  514.                     *outLen = len + ENCODING_LENGTH;
  515.                 }
  516.             #ifdef MMI_ON_HARDWARE_P
  517.                 {
  518.                     U16 *tempData;
  519.                     int i;
  520.                     /* micha0902, #124 */
  521.                     tempData = (U16*) convertedData;
  522.                     for (i = 0; i < len; i += 2)
  523.                     {
  524.                         SWAP_USHORT(tempData);
  525.                         tempData++;
  526.                     }
  527.                 }
  528.             #endif /* MMI_ON_HARDWARE_P */ 
  529.                 break;
  530.                 /* micha1008 begin */
  531.             case (MMI_UCS2_81):
  532.                 convertedData = OslMalloc((len + 1) * 2 + ENCODING_LENGTH);     /* prevent odd len number */
  533.                 memset((void*)convertedData, 0, (len + 1) * 2 + ENCODING_LENGTH);
  534.                 InputboxConvertGSMToDeviceEncoding(
  535.                     data,
  536.                     convertedData,
  537.                     (U8) len,
  538.                     (len + 1) * 2 + ENCODING_LENGTH,
  539.                     MMI_UCS2_81,
  540.                     0,
  541.                     1);
  542.                 break;
  543.             case (MMI_UCS2_82):
  544.                 convertedData = OslMalloc((len + 1) * 2 + ENCODING_LENGTH);     /* prevent odd len number */
  545.                 memset((void*)convertedData, 0, (len + 1) * 2 + ENCODING_LENGTH);
  546.                 InputboxConvertGSMToDeviceEncoding(
  547.                     data,
  548.                     convertedData,
  549.                     (U8) len,
  550.                     (len + 1) * 2 + ENCODING_LENGTH,
  551.                     MMI_UCS2_82,
  552.                     0,
  553.                     1);
  554.                 break;
  555.                 /* micha1008 end */
  556.         }
  557.         return convertedData;
  558.     }
  559.     else
  560.     {
  561.         convertedData = OslMalloc(ENCODING_LENGTH);
  562.         memset((void*)convertedData, 0, ENCODING_LENGTH);
  563.         if (outLen != NULL)
  564.         {
  565.             *outLen = ENCODING_LENGTH;
  566.         }
  567.         return convertedData;
  568.     }
  569. }
  570. #else /* OSL_MEMORY_DUMP */ 
  571. /*****************************************************************************
  572.  * FUNCTION
  573.  *  CovertStringForSIMInt
  574.  * DESCRIPTION
  575.  *  Converts data from Platfrorm (ASCII or UCS2) format to one specified
  576.  * PARAMETERS
  577.  *  data            [IN]        Pointer to dat to be converted
  578.  *  len             [IN]        No of bytes to be converted
  579.  *  format          [IN]        Format to which data is to be converted 7 bit. 8 bit or UCS2
  580.  *  outLen          [?]         
  581.  *  fileName        [?]         
  582.  *  lineNumber      [IN]        
  583.  *  outlen(?)       [OUT]       Pointer in which output length will be returned
  584.  * RETURNS
  585.  *  Pointer to data containing converted data
  586.  *****************************************************************************/
  587. U8 *CovertStringForSIMInt(U8 *data, U16 len, U8 format, U16 *outLen, S8 *fileName, S32 lineNumber)
  588. {
  589.     /*----------------------------------------------------------------*/
  590.     /* Local Variables                                                */
  591.     /*----------------------------------------------------------------*/
  592.     U8 *convertedData;
  593.     U16 outLength;
  594.     /*----------------------------------------------------------------*/
  595.     /* Code Body                                                      */
  596.     /*----------------------------------------------------------------*/
  597.     if (len > 0)
  598.     {
  599.         switch (format)
  600.         {
  601.             case MMI_DEFAULT_DCS:
  602.                 {
  603.                     U8 *tempData;
  604.                     convertedData = OslMallocCHK((len) + 1, fileName, lineNumber);
  605.                     tempData = OslMallocCHK(len, fileName, lineNumber);
  606.                     UnicodeNToAnsii((PS8) tempData, (PS8) data, len);
  607.                     ConvertAsciiEncodingToGSM7BitDefault(
  608.                         convertedData,
  609.                         tempData,
  610.                         (U16) (len / ENCODING_LENGTH),
  611.                         &outLength);
  612.                     OslMfree(tempData);
  613.                     convertedData[outLength] = 0;
  614.                     if (outLen != NULL)
  615.                     {
  616.                         *outLen = outLength + 1;
  617.                     }
  618.                 }
  619.                 break;
  620.             case MMI_8BIT_DCS:
  621.                 convertedData = OslMallocCHK((len / ENCODING_LENGTH) + 1, fileName, lineNumber);
  622.                 UnicodeNToAnsii((PS8) convertedData, (PS8) data, len);
  623.                 memset((void*)&convertedData[len / ENCODING_LENGTH], 0, 1);
  624.                 if (outLen != NULL)
  625.                 {
  626.                     *outLen = len / ENCODING_LENGTH + 1;
  627.                 }
  628.                 break;
  629.             case MMI_UCS2_DCS:
  630.                 convertedData = OslMallocCHK((len) + ENCODING_LENGTH, fileName, lineNumber);
  631.                 memcpy(convertedData, data, len);
  632.                 memset((void*)&convertedData[len], 0, ENCODING_LENGTH);
  633.                 if (outLen != NULL)
  634.                 {
  635.                     *outLen = len + ENCODING_LENGTH;
  636.                 }
  637.             #ifdef MMI_ON_HARDWARE_P
  638.                 {
  639.                     U16 *tempData;
  640.                     int i;
  641.                     tempData = (U16*) convertedData;
  642.                     for (i = 0; i < len * 2 / ENCODING_LENGTH; i += 2)
  643.                     {
  644.                         SWAP_USHORT(tempData);
  645.                         tempData++;
  646.                     }
  647.                 }
  648.             #endif /* MMI_ON_HARDWARE_P */ 
  649.                 break;
  650.         }
  651.         return convertedData;
  652.     }
  653.     else
  654.     {
  655.         U8 noOfNulls;
  656.         if (format == MMI_UCS2_DCS)
  657.         {
  658.             noOfNulls = 2;
  659.         }
  660.         else
  661.         {
  662.             noOfNulls = 1;
  663.         }
  664.         convertedData = OslMallocCHK(noOfNulls, fileName, lineNumber);
  665.         memset((void*)convertedData, 0, noOfNulls);
  666.         if (outLen != NULL)
  667.         {
  668.             *outLen = noOfNulls;
  669.         }
  670.         return convertedData;
  671.     }
  672. }
  673. /*****************************************************************************
  674.  * FUNCTION
  675.  *  CovertStringForPlatformInt
  676.  * DESCRIPTION
  677.  *  Converts data from specified format to Platform type (UCS2 or ASCII)
  678.  * PARAMETERS
  679.  *  data            [IN]        Pointer to data to be converted
  680.  *  len             [IN]        No of bytes to be converted
  681.  *  format          [IN]        Format of input data
  682.  *  outLen          [?]         
  683.  *  fileName        [?]         
  684.  *  lineNumber      [IN]        
  685.  *  outlen(?)       [OUT]       Pointer in which output length will be returned
  686.  * RETURNS
  687.  *  Pointer to data containing converted data
  688.  *****************************************************************************/
  689. U8 *CovertStringForPlatformInt(U8 *data, U16 len, U8 format, U16 *outLen, S8 *fileName, S32 lineNumber)
  690. {
  691.     /*----------------------------------------------------------------*/
  692.     /* Local Variables                                                */
  693.     /*----------------------------------------------------------------*/
  694.     U8 *convertedData;
  695.     U16 outLength;
  696.     /*----------------------------------------------------------------*/
  697.     /* Code Body                                                      */
  698.     /*----------------------------------------------------------------*/
  699.     if (len > 0)
  700.     {
  701.         switch (format)
  702.         {
  703.             case (MMI_DEFAULT_DCS):
  704.                 {
  705.                     U8 *tempData;
  706.     
  707.                     convertedData = OslMallocCHK((len * ENCODING_LENGTH) + ENCODING_LENGTH, fileName, lineNumber);
  708.                     tempData = OslMallocCHK(len, fileName, lineNumber);
  709.                     ConvertGSM7BitDefaultEncodingToAscii(tempData, data, len, &outLength);
  710.                     AnsiiNToUnicodeString((PS8) convertedData, (PS8) tempData, outLength);
  711.                     memset((void*)&convertedData[outLength * ENCODING_LENGTH], 0, ENCODING_LENGTH);
  712.                     OslMfree(tempData);
  713.                 }
  714.                 if (outLen != NULL)
  715.                 {
  716.                     *outLen = outLength * ENCODING_LENGTH + ENCODING_LENGTH;
  717.                 }
  718.                 break;
  719.             case (MMI_8BIT_DCS):
  720.                 convertedData = OslMallocCHK((len * ENCODING_LENGTH) + ENCODING_LENGTH, fileName, lineNumber);
  721.                 AnsiiNToUnicodeString((PS8) convertedData, (PS8) data, len);
  722.                 memset((void*)&convertedData[len * ENCODING_LENGTH], 0, ENCODING_LENGTH);
  723.                 if (outLen != NULL)
  724.                 {
  725.                     *outLen = len * ENCODING_LENGTH + ENCODING_LENGTH;
  726.                 }
  727.                 break;
  728.             case (MMI_UCS2_DCS):
  729.                 convertedData = OslMallocCHK(len + ENCODING_LENGTH, fileName, lineNumber);
  730.                 memcpy(convertedData, data, len);
  731.                 memset((void*)&convertedData[len], 0, ENCODING_LENGTH);
  732.                 if (outLen != NULL)
  733.                 {
  734.                     *outLen = len + ENCODING_LENGTH;
  735.                 }
  736.             #ifdef MMI_ON_HARDWARE_P
  737.                 {
  738.                     U16 *tempData;
  739.                     int i;
  740.                     /* micha0902, #124 */
  741.                     tempData = (U16*) convertedData;
  742.                     for (i = 0; i < len; i += 2)
  743.                     {
  744.                         SWAP_USHORT(tempData);
  745.                         tempData++;
  746.                     }
  747.                 }
  748.             #endif /* MMI_ON_HARDWARE_P */ 
  749.                 break;
  750.         }
  751.         return convertedData;
  752.     }
  753.     else
  754.     {
  755.         convertedData = OslMallocCHK(ENCODING_LENGTH, fileName, lineNumber);
  756.         memset((void*)convertedData, 0, ENCODING_LENGTH);
  757.         if (outLen != NULL)
  758.         {
  759.             *outLen = ENCODING_LENGTH;
  760.         }
  761.         return convertedData;
  762.     }
  763. }
  764. #endif /* OSL_MEMORY_DUMP */ 
  765. /*****************************************************************************
  766.  * FUNCTION
  767.  *  ConvertBCDToString
  768.  * DESCRIPTION
  769.  *  Converts  BCD Digits to Character String
  770.  * PARAMETERS
  771.  *  BCDNumber       [?]         
  772.  *  len             [IN]        
  773.  *  outLen          [?]         
  774.  *  of(?)           [OUT]       Character String  will be returned
  775.  *  msg(?)          [IN]        Input Buffer
  776.  *  message(?)      [IN]        Output Buffer
  777.  *  outlen(?)       [OUT]       Pointer to variable which will have output length
  778.  * RETURNS
  779.  *  Character String of BCD Characters
  780.  *****************************************************************************/
  781. U8 *ConvertBCDToString(U8 *BCDNumber, U16 len, U16 *outLen)
  782. {
  783.     /*----------------------------------------------------------------*/
  784.     /* Local Variables                                                */
  785.     /*----------------------------------------------------------------*/
  786.     U8 *outString;
  787.     U8 i, j = 0;
  788.     /*----------------------------------------------------------------*/
  789.     /* Code Body                                                      */
  790.     /*----------------------------------------------------------------*/
  791.     outString = OslMalloc(2 * len + 1);
  792.     /* micha1104, #211 */
  793.     if (BCDNumber[0] == 0x91)
  794.     {
  795.         outString[j++] = '+';
  796.     }
  797.     /* micha1104, #211 */
  798.     for (i = 1; i < len; i++)
  799.     {
  800.         outString[j++] = ConvertDigitToChar((U8) (BCDNumber[i] & 0x0F));
  801.         outString[j] = ConvertDigitToChar((U8) ((BCDNumber[i] >> 4) & 0x0F));
  802.         if (outString[j++] == 0)
  803.         {
  804.             if (outLen)
  805.             {
  806.                 *outLen = j;
  807.             }
  808.             return outString;
  809.         }
  810.     }
  811.     outString[j++] = 0;
  812.     if (outLen)
  813.     {
  814.         *outLen = j;
  815.     }
  816.     return outString;
  817. }
  818. /*****************************************************************************
  819.  * FUNCTION
  820.  *  ConvertDigitToChar
  821.  * DESCRIPTION
  822.  *  Converts  BCD Digit to Char
  823.  * PARAMETERS
  824.  *  digit       [IN]        BCD Digit
  825.  * RETURNS
  826.  *  Character format of BCD Digit
  827.  *****************************************************************************/
  828. U8 ConvertDigitToChar(U8 digit)
  829. {
  830.     /*----------------------------------------------------------------*/
  831.     /* Local Variables                                                */
  832.     /*----------------------------------------------------------------*/
  833.     /*----------------------------------------------------------------*/
  834.     /* Code Body                                                      */
  835.     /*----------------------------------------------------------------*/
  836.     /* diamond, 2006/02/13 Re-assign the value of BCD encoding numbers */
  837.     if (digit < 10)
  838.     {
  839.         return 48 + digit;
  840.     }
  841.     else if (digit == 10)
  842.     {
  843.         return 42;  /* '*' */
  844.     }
  845.     else if (digit == 11)
  846.     {
  847.         return 35;      /* '#' */
  848.     }
  849.     else if (digit == 12)
  850.     {
  851.         return 0x70;    /* 'p' */
  852.     }
  853.     else if (digit == 13)
  854.     {
  855.         return 0x77;    /* 'w' */
  856.     }
  857.     else if (digit == 14)
  858.     {
  859.         return 43;  /* '+' */
  860.     }
  861.     else
  862.     {
  863.         return 0;
  864.     }
  865. }
  866. /*****************************************************************************
  867.  * FUNCTION
  868.  *  SwapEndian
  869.  * DESCRIPTION
  870.  *  Converts  Little Endian to Big Endian & vice versa
  871.  * PARAMETERS
  872.  *  Addr        [IN]        Pointer to data to be swapped
  873.  *  Nb          [IN]        No. of bytes to be swapped
  874.  * RETURNS
  875.  *  Pointer to Swapped Digits(?)
  876.  *****************************************************************************/
  877. void *SwapEndian(void *Addr, const int Nb)
  878. {
  879.     /*----------------------------------------------------------------*/
  880.     /* Local Variables                                                */
  881.     /*----------------------------------------------------------------*/
  882.     /* micha1014 begin */
  883.     static char Swapped[16];
  884.     static U32 Result_align[4];
  885.     int i;
  886.     /*----------------------------------------------------------------*/
  887.     /* Code Body                                                      */
  888.     /*----------------------------------------------------------------*/
  889.     switch (Nb)
  890.     {
  891.         case 2:
  892.             Swapped[0] = *((char*)Addr + 1);
  893.             Swapped[1] = *((char*)Addr);
  894.             break;
  895.         case 4:
  896.             Swapped[0] = *((char*)Addr + 3);
  897.             Swapped[1] = *((char*)Addr + 2);
  898.             Swapped[2] = *((char*)Addr + 1);
  899.             Swapped[3] = *((char*)Addr);
  900.             break;
  901.         case 8:
  902.             Swapped[0] = *((char*)Addr + 7);
  903.             Swapped[1] = *((char*)Addr + 6);
  904.             Swapped[2] = *((char*)Addr + 5);
  905.             Swapped[3] = *((char*)Addr + 4);
  906.             Swapped[4] = *((char*)Addr + 3);
  907.             Swapped[5] = *((char*)Addr + 2);
  908.             Swapped[6] = *((char*)Addr + 1);
  909.             Swapped[7] = *((char*)Addr);
  910.             break;
  911.         case 16:
  912.             Swapped[0] = *((char*)Addr + 15);
  913.             Swapped[1] = *((char*)Addr + 14);
  914.             Swapped[2] = *((char*)Addr + 13);
  915.             Swapped[3] = *((char*)Addr + 12);
  916.             Swapped[4] = *((char*)Addr + 11);
  917.             Swapped[5] = *((char*)Addr + 10);
  918.             Swapped[6] = *((char*)Addr + 9);
  919.             Swapped[7] = *((char*)Addr + 8);
  920.             Swapped[8] = *((char*)Addr + 7);
  921.             Swapped[9] = *((char*)Addr + 6);
  922.             Swapped[10] = *((char*)Addr + 5);
  923.             Swapped[11] = *((char*)Addr + 4);
  924.             Swapped[12] = *((char*)Addr + 3);
  925.             Swapped[13] = *((char*)Addr + 2);
  926.             Swapped[14] = *((char*)Addr + 1);
  927.             Swapped[15] = *((char*)Addr);
  928.             break;
  929.     }
  930.     for (i = 0; i < 16; i++)
  931.     {
  932.         *((char*)Result_align + i) = Swapped[i];
  933.     }
  934.     return (void*)Result_align;
  935.     /* micha1014 end */
  936. }
  937. /* flag=1: Handle extended characters. flag=0: Ignore extended characters  */
  938. /* UCS2_count=0 for Default DCS, non zero for UCS2 DCS                  */
  939. /*****************************************************************************
  940.  * FUNCTION
  941.  *  InputboxConvertGSMToDeviceEncoding
  942.  * DESCRIPTION
  943.  *  
  944.  * PARAMETERS
  945.  *  inBuffer            [?]         
  946.  *  outBuffer           [?]         
  947.  *  inBufferLength      [IN]        
  948.  *  outBufferSize       [IN]        
  949.  *  UCS2_count          [IN]        
  950.  *  GSM_ext_count       [IN]        
  951.  *  flag                [IN]        
  952.  * RETURNS
  953.  *  
  954.  *****************************************************************************/
  955. S32 InputboxConvertGSMToDeviceEncoding(
  956.         U8 *inBuffer,
  957.         U8 *outBuffer,
  958.         U8 inBufferLength,
  959.         S32 outBufferSize,
  960.         S32 UCS2_count,
  961.         S32 GSM_ext_count,
  962.         U8 flag)
  963. {
  964.     /*----------------------------------------------------------------*/
  965.     /* Local Variables                                                */
  966.     /*----------------------------------------------------------------*/
  967.     U8 done = 0;
  968.     UI_buffer_type p1 = (UI_buffer_type) inBuffer;
  969.     UI_buffer_type p2 = (UI_buffer_type) outBuffer;
  970.     UI_character_type c, cc;
  971.     S32 out_count = 0;
  972.     U8 in_count = 0;
  973.     /*----------------------------------------------------------------*/
  974.     /* Code Body                                                      */
  975.     /*----------------------------------------------------------------*/
  976.     if (flag)
  977.     {
  978.         if (UCS2_count == 0)    /* ASCII */
  979.         {
  980.             while (!done)
  981.             {
  982.                 UI_GET_NEXT_BYTE(p1, c);
  983.                 in_count++;
  984.                 if (UI_STRING_END_OF_STRING_CHARACTER(c) && (in_count > inBufferLength))        /* Also check in_conut to make sure all chracter converted */
  985.                 {
  986.                     done = 1;
  987.                     UI_STRING_INSERT_CHARACTER(p2, c);  /* Insert NULL terminator */
  988.                     out_count += ENCODING_LENGTH;
  989.                 }
  990.                 else if (UI_TEST_ESC_CHARACTER(c))
  991.                 {
  992.                     cc = c;
  993.                     UI_GET_NEXT_BYTE(p1, c);
  994.                     in_count++;
  995.                     c = DefaultToExtendedAsciiArray[c];
  996.                     if (UI_TEST_GSM_EXTENDED(c))
  997.                     {
  998.                         UI_STRING_INSERT_CHARACTER(p2, c);
  999.                         out_count += ENCODING_LENGTH;
  1000.                     }
  1001.                     else
  1002.                     {
  1003.                         UI_GET_PREVIOUS_BYTE(p1, c);
  1004.                         in_count--;
  1005.                         c = DefaultToAsciiArray[cc];
  1006.                         UI_STRING_INSERT_CHARACTER(p2, c);
  1007.                         out_count += ENCODING_LENGTH;
  1008.                     }
  1009.                 }
  1010.                 else
  1011.                 {
  1012.                     c = DefaultToAsciiArray[c];
  1013.                     UI_STRING_INSERT_CHARACTER(p2, c);
  1014.                     out_count += ENCODING_LENGTH;
  1015.                 }
  1016.                 if (out_count >= (outBufferSize - 2))   /* To ensure null terminator at the end when exceeds buffer. */
  1017.                 {
  1018.                     done = 1;
  1019.                     UI_STRING_INSERT_CHARACTER(p2, 0);
  1020.                     out_count += ENCODING_LENGTH;
  1021.                 }
  1022.             }
  1023.         }
  1024.         else    /* MMI_PHB_UCS2 */
  1025.     #if defined(__PHB_0x81_SUPPORT__)       /* Support maximum length of 0x81 and 0x82 UCS2 */
  1026.         if (UCS2_count == 0x08)
  1027.     #endif 
  1028.         {
  1029.             while (!done)
  1030.             {
  1031.                 UI_STRING_GET_NEXT_CHARACTER(p1, c);
  1032.                 UI_SWAP_U16_BYTES(c);
  1033.                 if (UI_STRING_END_OF_STRING_CHARACTER(c))
  1034.                 {
  1035.                     done = 1;
  1036.                 }
  1037.                 //if(c==_EURO_CHARACTER_UCS2) 
  1038.                 //  c=_EURO_CHARACTER;
  1039.                 UI_STRING_INSERT_CHARACTER(p2, c);  /* Append character here, including null terminator */
  1040.                 out_count += ENCODING_LENGTH;
  1041.                 if (out_count >= (outBufferSize - 2))   /* To ensure null terminator at the end when exceeds buffer. */
  1042.                 {
  1043.                     done = 1;
  1044.                     UI_STRING_INSERT_CHARACTER(p2, 0);
  1045.                     out_count += ENCODING_LENGTH;
  1046.                 }
  1047.             }
  1048.         }
  1049.     #if defined(__PHB_0x81_SUPPORT__)       /* Support maximum length of 0x81 and 0x82 UCS2 */
  1050.         else if (UCS2_count == 0x09)    /* MMI_PHB_UCS2_81 */
  1051.         {
  1052.             U16 base_ptr;
  1053.             U8 i, length;
  1054.             UI_GET_NEXT_BYTE(p1, c);
  1055.             UI_GET_NEXT_BYTE(p1, c);
  1056.             length = (U8) c;
  1057.             base_ptr = (*p1) << 7;
  1058.             UI_GET_NEXT_BYTE(p1, c);
  1059.             for (i = 0; i < length; i++)
  1060.             {
  1061.                 if (out_count >= (outBufferSize - 2))
  1062.                 {
  1063.                     break;
  1064.                 }
  1065.                 UI_GET_NEXT_BYTE(p1, c);
  1066.                 if (c < 0x80)   /* Default GSM character */
  1067.                 {
  1068.                     *(p2)++ = (U8) c;
  1069.                     *(p2)++ = 0x0;
  1070.                 }
  1071.                 else    /* UCS2 character */
  1072.                 {
  1073.                     c &= 0x7F;
  1074.                     c += base_ptr;
  1075.                     *(p2)++ = c & 0xFF;
  1076.                     *(p2)++ = c >> 8 & 0xFF;
  1077.                 }
  1078.             }
  1079.             UI_STRING_INSERT_CHARACTER(p2, 0);  /* Add null terminator at the end */
  1080.             out_count += ENCODING_LENGTH;
  1081.         }
  1082.         else if (UCS2_count == 0x10)    /* MMI_PHB_UCS2_82 */
  1083.         {
  1084.             U16 base_ptr;
  1085.             U8 i, length;
  1086.             UI_GET_NEXT_BYTE(p1, c);
  1087.             UI_GET_NEXT_BYTE(p1, c);
  1088.             length = (U8) c;
  1089.             base_ptr = (*p1) << 8;
  1090.             UI_GET_NEXT_BYTE(p1, c);
  1091.             base_ptr |= (*p1);
  1092.             UI_GET_NEXT_BYTE(p1, c);
  1093.             for (i = 0; i < length; i++)
  1094.             {
  1095.                 if (out_count >= (outBufferSize - 2))
  1096.                 {
  1097.                     break;
  1098.                 }
  1099.                 UI_GET_NEXT_BYTE(p1, c);
  1100.                 if (c < 0x80)   /* Default GSM character */
  1101.                 {
  1102.                     *(p2)++ = (U8) c;
  1103.                     *(p2)++ = 0x0;
  1104.                 }
  1105.                 else    /* UCS2 character */
  1106.                 {
  1107.                     c &= 0x7F;
  1108.                     c += base_ptr;
  1109.                     *(p2)++ = c & 0xFF;
  1110.                     *(p2)++ = c >> 8 & 0xFF;
  1111.                 }
  1112.                 out_count += ENCODING_LENGTH;
  1113.             }
  1114.             UI_STRING_INSERT_CHARACTER(p2, 0);  /* Add null terminator at the end */
  1115.             out_count += ENCODING_LENGTH;
  1116.         }
  1117.     #endif /* defined(__PHB_0x81_SUPPORT__) */ 
  1118.     }
  1119.     return out_count;
  1120. }
  1121. /* flag=1: Handle extended characters. flag=0: Ignore extended characters  */
  1122. /* UCS2_count=0 for Default DCS, non zero for UCS2 DCS                  */
  1123. /*****************************************************************************
  1124.  * FUNCTION
  1125.  *  InputboxConvertDeviceEncodingToGSM
  1126.  * DESCRIPTION
  1127.  *  
  1128.  * PARAMETERS
  1129.  *  inBuffer            [?]         
  1130.  *  outBuffer           [?]         
  1131.  *  outBufferSize       [IN]        
  1132.  *  UCS2_count          [IN]        
  1133.  *  GSM_ext_count       [IN]        
  1134.  *  flag                [IN]        
  1135.  * RETURNS
  1136.  *  
  1137.  *****************************************************************************/
  1138. S32 InputboxConvertDeviceEncodingToGSM(
  1139.         U8 *inBuffer,
  1140.         U8 *outBuffer,
  1141.         S32 outBufferSize,
  1142.         S32 UCS2_count,
  1143.         S32 GSM_ext_count,
  1144.         U8 flag)
  1145. {
  1146.     /*----------------------------------------------------------------*/
  1147.     /* Local Variables                                                */
  1148.     /*----------------------------------------------------------------*/
  1149.     U8 done = 0;
  1150.     UI_buffer_type p1 = (UI_buffer_type) inBuffer;
  1151.     UI_buffer_type p2 = (UI_buffer_type) outBuffer;
  1152.     UI_character_type c;
  1153.     S32 out_count = 0;
  1154.     /*----------------------------------------------------------------*/
  1155.     /* Code Body                                                      */
  1156.     /*----------------------------------------------------------------*/
  1157.     if (flag)
  1158.     {
  1159.         if (UCS2_count == 0)
  1160.         {
  1161.             while (!done)
  1162.             {
  1163.                 UI_STRING_GET_NEXT_CHARACTER(p1, c);
  1164.                 if (UI_STRING_END_OF_STRING_CHARACTER(c))
  1165.                 {
  1166.                     done = 1;
  1167.                     UI_INSERT_BYTE(p2, c);
  1168.                     out_count += 1;
  1169.                 }
  1170.                 else if (UI_TEST_GSM_EXTENDED(c))
  1171.                 {
  1172.                     UI_INSERT_BYTE(p2, _ESCAPE_CHARACTER);
  1173.                     c = ExtendedAsciiToDefaultArray[c];
  1174.                     UI_INSERT_BYTE(p2, c);
  1175.                     out_count += 2; /* MTK 2003-12-29 */
  1176.                 }
  1177.                 else
  1178.                 {
  1179.                     c = AsciiToDefaultArray[c];
  1180.                     UI_INSERT_BYTE(p2, c);
  1181.                     out_count += 1;
  1182.                 }
  1183.                 if (out_count >= outBufferSize)
  1184.                 {
  1185.                     done = 1;
  1186.                 }
  1187.             }
  1188.         }
  1189.         else
  1190.         {
  1191.             while (!done)
  1192.             {
  1193.                 UI_STRING_GET_NEXT_CHARACTER(p1, c);
  1194.                 if (UI_STRING_END_OF_STRING_CHARACTER(c))
  1195.                 {
  1196.                     done = 1;
  1197.                 }
  1198.                 /* if(c==_EURO_CHARACTER) c=_EURO_CHARACTER_UCS2; */
  1199.                 UI_SWAP_U16_BYTES(c);
  1200.                 UI_STRING_INSERT_CHARACTER(p2, c);
  1201.                 out_count += ENCODING_LENGTH;
  1202.                 if (out_count >= outBufferSize)
  1203.                 {
  1204.                     done = 1;
  1205.                 }
  1206.             }
  1207.         }
  1208.     }
  1209.     else
  1210.     {
  1211.         if (UCS2_count == 0)
  1212.         {
  1213.             while (!done)
  1214.             {
  1215.                 UI_STRING_GET_NEXT_CHARACTER(p1, c);
  1216.                 if (UI_STRING_END_OF_STRING_CHARACTER(c))
  1217.                 {
  1218.                     done = 1;
  1219.                     UI_INSERT_BYTE(p2, c);
  1220.                 }
  1221.                 else
  1222.                 {
  1223.                     c = AsciiToDefaultArray[c];
  1224.                     UI_INSERT_BYTE(p2, c);
  1225.                 }
  1226.                 out_count += 1;
  1227.                 if (out_count >= outBufferSize)
  1228.                 {
  1229.                     done = 1;
  1230.                 }
  1231.             }
  1232.         }
  1233.         else
  1234.         {
  1235.             while (!done)
  1236.             {
  1237.                 UI_STRING_GET_NEXT_CHARACTER(p1, c);
  1238.                 if (UI_STRING_END_OF_STRING_CHARACTER(c))
  1239.                 {
  1240.                     done = 1;
  1241.                 }
  1242.                 /* if(c==_EURO_CHARACTER) c=_EURO_CHARACTER_UCS2; */
  1243.                 UI_SWAP_U16_BYTES(c);
  1244.                 UI_STRING_INSERT_CHARACTER(p2, c);
  1245.                 out_count += ENCODING_LENGTH;
  1246.                 if (out_count >= outBufferSize)
  1247.                 {
  1248.                     done = 1;
  1249.                 }
  1250.             }
  1251.         }
  1252.     }
  1253.     return (out_count);
  1254. }