picturemsg.c
上传用户:helaifa584
上传日期:2022-06-15
资源大小:29k
文件大小:58k
源码类别:

MTK

开发平台:

Objective-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.  *
  37.  * Filename:
  38.  * ---------
  39.  * pictruemsg.c
  40.  *
  41.  * Project:
  42.  * --------
  43.  * PDG1
  44.  *
  45.  * Description:
  46.  * ------------
  47.  * This file implements Picture Message back end application.
  48.  *
  49.  * Author:
  50.  * -------
  51.  * -------
  52.  * -------
  53.  *
  54.  *============================================================================
  55.  *             HISTORY
  56.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  57.  *------------------------------------------------------------------------------
  58.  */
  59. #include "MMI_include.h"
  60. #if defined(__MMI_SMART_MESSAGE_MT__) || (defined(__MMI_SMART_MESSAGE_MO__) && !defined(__MMI_MESSAGES_EMS__))
  61. #ifndef _MMI_PICMSG_C
  62. #define _MMI_PICMSG_C
  63. // #ifdef __MMI_PICMSG__
  64. /*  Include: MMI header file */
  65. #include "picturemsg.h"
  66. #include "PicMsgApiToOthers.h"
  67. #include "CommonNSM.h"
  68. #include "ems.h"
  69. #include "customer_ps_inc.h"
  70. #include "smsguiinterfacetype.h"
  71. /*  Include: PS header file */
  72. /* ... Add More PS header */
  73. /* 
  74.  ************************* Define ****************************
  75.  */
  76. #define MODULUS                  241
  77. #define ONE_BYTE_SIZE            8
  78. #define MMI_EXTRA_BMP_HEADER_SIZE   6
  79. #define PIC_MSG_SIGNATURE        "0504158A"
  80. #define RING_TONE_MSG_SIGNATURE     "05041581"
  81. #define BMP_HEADER_SIZE          (sizeof(BmpFileHeader_sturct)-2)
  82. #define MAX_PIC_HIEGHT_PIXEL     32
  83. #define MAX_PIC_WIDTH_PIXEL         96 / ONE_BYTE_SIZE  /* We store 8 bits in one bytes */
  84. #define MAX_BMP_HDR_SIZE         64
  85. /* Start JP */
  86. #define     MAX_NSM_PIC_WIDTH    72
  87. #define     MAX_NSM_PIC_HEIGHT      28
  88. /* End JP */
  89. /* 
  90.  *************************** Typedef  *******************************
  91.  */
  92. typedef enum
  93. {
  94.     SMRT_NORMAL_SMS_0,
  95.     SMRT_PICTURE_SMS_1,
  96.     SMRT_RING_TONE_SMS_2
  97. } smrt_sms_type_enum;
  98. typedef enum
  99. {
  100.     PMSG_FIRST_FOUR_BITS = 1,
  101.     PMSG_SECOND_FOUR_BITS = 2
  102. } pmsg_bits_position_enum;
  103. /* 
  104.  *************** Function Declaration *****************************
  105.  */
  106. S16 mmi_smrt_message_type(U8 *SmsData);
  107. #if (0)
  108. /* under construction !*/
  109. /* under construction !*/
  110. #endif /* (0) */ 
  111. U8 *mmi_pmsg_convert_ota_to_bmp(U8 *otaData);
  112. U8 *mmi_pmsg_convert_bmp_to_ota(U8 *BmpBuffer);
  113. U8 mmi_pmsg_convert_ascii_hex_to_dec(S8 character);
  114. U8 mmi_pmsg_convert_binary_dec_to_hex(const U8 DecimalVal, U8 part);
  115. void mmi_pmsg_convert_ascii_hex_string_2_dec_string(U8 *DecStr, U8 *AsciiStr);
  116. void mmi_pmsg_convert_dec_string_2_ascii_hex_string(U8 *AsciiStr, U8 *DecStr);
  117. U8 *mmi_pmsg_create_ota_data(U8 *BinaryData, S16 H, S16 W);
  118. U8 *mmi_pmsg_create_bmp_data(void);
  119. void mmi_pmsg_set_default_values_bmp_header(void);
  120. S16 mmi_pmsg_read_picture_header(U8 *OtaPattern);
  121. S16 mmi_pmsg_read_bmp_data(U8 *RawData, U8 *BmpData, S16 *H, S16 *W);
  122. U16 mmi_pmsg_get_size_bmp_data(U8 *BmpData);
  123. U16 mmi_pmsg_get_size_ota_data(U8 *OtaBuffer);
  124. BOOL mmi_pmsg_is_smart_picture(U8 *BmpData);
  125. S16 mmi_pmsg_add_bmp_header_info(U8 *BmpData);
  126. U16 mmi_pmsg_add_picture_text(U8 *OtaData, U8 *TextBuffer);
  127. void mmi_pmsg_add_nokia_header(U8 *PictureMessage, U8 TotalSegment, U8 CurrentSegment);
  128. void mmi_pmsg_add_header(U8 *header, U16 HeaderLen, U8 *Data, U16 DataLen);
  129. void mmi_pmsg_shift_n_bytes(S8 *Data, S16 offset, S16 nBytes, S16 length);
  130. U8 mmi_pmsg_get_n_bits(U8 *Data, U16 Offset, U16 Bits);
  131. U8 mmi_pmsg_get_next_byte(void);
  132. void mmi_pmsg_fskip(FS_HANDLE fp, S16 num_bytes);
  133. S16 mmi_pmsg_string_search(S8 *Pattern, S8 *Text);
  134. S16 mmi_pmsg_hash(S8 *str);
  135. S16 mmi_pmsg_HashN(S8 *Str, S16 PatternLength);
  136. S16 mmi_pmsg_HashIncrement(S8 *str, S16 PrevIndex, S16 PrevHash, S16 PatternLength);
  137. /* 
  138.  ************************ Global Variables ****************************
  139.  */
  140. /* This is a BMP Header which strored the information of file */
  141. static BmpFileHeader_sturct g_pmsg_BmpHeader;
  142. /*  This var shall store the pointer of OTA data to retrieve the values */
  143. static U8 *OTAdata = NULL;
  144. /*  This var shall store the pointer index of OTA data to retrieve the values */
  145. static U16 g_pmsg_ota_index = 0;
  146. /* This var shall store the Text of Picture message and shall be used by Category screen to show the text */
  147. S8 g_pmsg_TextInMessage[MAX_PICTEXT_BUFF_SIZE + (TEXT_BUFF_PADDING)];
  148. /* This var shall store the Ota Picture len */
  149. static U16 gOtaDataLen = 0;
  150. #if (defined(__MMI_SMART_MESSAGE_MO__) && !defined(__MMI_MESSAGES_EMS__))
  151. extern nsm_msg_struct g_nsm_msg_context;
  152. #endif 
  153. #if defined(__MMI_SMART_MESSAGE_MT__)
  154. #include "MessagesExDcl.h"
  155. extern nsm_picmsg_text_struct picmsg_text_struct;
  156. #endif /* defined(__MMI_SMART_MESSAGE_MT__) */ 
  157. /* 
  158.  ************************ Global Functions ****************************
  159.  */
  160. extern EMSData *GetEMSDataForView(EMSData **p, U8 force);
  161. /* 
  162.  ************************ Temp Var for testing and debugging the code ********
  163.  */
  164. // Assh..whole data.
  165. //S8  OTAdata[] = "0B0504158A000000030103013000000002010000481C01FF5C0151C104555FFFFEAA00278A00AAAFFFFF5C00001500155FFFBEB8000802002AAFFF7FD8005D04000557FFBFF800012800DAAFFF5FF0000E40001557FFBEF80000A0008AABFF5FD0000100001555FFAFF8000080000AABFF55D8000000000555FFAAB8800000000AAAFF557DC000001505557F0B0504158A00000003010302AAAAF80002EFA22AFF555C100015F554457FA0A80A802FA0AA22FF405801405500151474A028E880AA280280BE4015DC01557F00047EA029FE002AFFA802BE4015FF4055FFF4007C800BAC80AAACF800BE00101440151C14015D80A88800AB382800BA415841005110540155AAA82000A80B8000AA555801005415000150AAA80B0504158A000000030103030200A8000002A8";
  166. // Line S8  OTAdata[] = "00480E01803804020300C01800600C06030100400C002006020301806006001802010080C030010008030180C0600800C0060180C040300600600200C040201003003001806020301801801800802030100C00800C006030101806004006002018180C030060030018080C060100200000080C040301803000000606020100801000";
  167. // Chess Data.
  168. //S8  OTAdata[] = "0040400100FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF0000FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF0000FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF0000FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00";
  169. // PMT data.
  170. //S8  OTAdata[] = "00481C01FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000FF5FFFAFFAFFFAFFFF000000FF5FFFAFFAFFFAFFFF000000FF5FFFAFFAFFFAFFFF000000FF5FFFAFFAFFFAFFFF000000FF5FFFAFFAFFFAFFFF000000FF5FFFAFFAFFFAFFFF000000FF5FFFAFFAFFFAFFFF000000FF5FFFAFFAFFFAFFFF000000FF5FFFAFFAFFFAFFFF000000FF5FFFAFFAFFFAFFFF000000FF5FFFAFFAFFFAFFFF000000FF57FFAFFAFFFAFFFF000000FF59FFAF7AFFFAFFFF000000FF5E0FAEBAFFFAFFFF000000FF5FEFADDAFFFAFFFF000000FF5FEFADDAFFFAFFFF000000FF5FEFBBEEFFFAFFFF000000FF5F0FB7F6FFFAFFFF000000";
  171. // Function Spec data.
  172. //S8  OTAdata[] = "00480E01FFFFFFFFFFFFFFFFFF000000000000000000FFFFFFFFFFFFFFFFFF00000000000000000010F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001";
  173. /*********************************************************************************
  174.  ************************* Funtion Definition Starts *****************************
  175.  *********************************************************************************/
  176. /*****************************************************************************
  177.  * FUNCTION
  178.  *  mmi_pmsg_set_default_values_bmp_header
  179.  * DESCRIPTION
  180.  *  Set default values in BMP Header.
  181.  * PARAMETERS
  182.  *  void
  183.  * RETURNS
  184.  *  void
  185.  *****************************************************************************/
  186. void mmi_pmsg_set_default_values_bmp_header(void)
  187. {
  188.     /*----------------------------------------------------------------*/
  189.     /* Local Variables                                                */
  190.     /*----------------------------------------------------------------*/
  191.     /*----------------------------------------------------------------*/
  192.     /* Code Body                                                      */
  193.     /*----------------------------------------------------------------*/
  194.     memset(&g_pmsg_BmpHeader, 0x00, BMP_HEADER_SIZE + 2);
  195.     g_pmsg_BmpHeader.BmpBMPFileHeader.Signature = (U16) 19778;
  196.     g_pmsg_BmpHeader.BmpBMPFileHeader.DataOffset = (U32) BMP_HEADER_SIZE;
  197.     g_pmsg_BmpHeader.BmpBMPInfoHeader.HeaderSize = (U32) 40;
  198.     g_pmsg_BmpHeader.BmpBMPInfoHeader.Bits = (U16) 1;
  199.     g_pmsg_BmpHeader.BmpBMPInfoHeader.Planes = (U16) 1;
  200.     g_pmsg_BmpHeader.BmpColors1.Blue = (U8) 255;
  201.     g_pmsg_BmpHeader.BmpColors1.Green = (U8) 255;
  202.     g_pmsg_BmpHeader.BmpColors1.Red = (U8) 255;
  203. }
  204. /*****************************************************************************
  205.  * FUNCTION
  206.  *  mmi_pmsg_convert_ota_to_bmp
  207.  * DESCRIPTION
  208.  *  Converter of OTA format to BMP format.
  209.  * PARAMETERS
  210.  *  Data        [?]     
  211.  *  S8 *, OTA data.(?)
  212.  * RETURNS
  213.  *  void
  214.  *****************************************************************************/
  215. U8 *mmi_pmsg_convert_ota_to_bmp(U8 *Data)
  216. {
  217.     /*----------------------------------------------------------------*/
  218.     /* Local Variables                                                */
  219.     /*----------------------------------------------------------------*/
  220.     S16 PictureHeaderLen = 0;
  221.     /*----------------------------------------------------------------*/
  222.     /* Code Body                                                      */
  223.     /*----------------------------------------------------------------*/
  224.     g_pmsg_ota_index = 0;
  225.     PictureHeaderLen = mmi_pmsg_read_picture_header(Data);
  226.     if (PictureHeaderLen == -1)
  227.     {
  228.         return NULL;
  229.     }
  230.     mmi_pmsg_shift_n_bytes((S8*) Data, 0, (S16) PictureHeaderLen, gOtaDataLen);        /* Remove the Picture Message Header */
  231.     OTAdata = Data;
  232.     mmi_pmsg_set_default_values_bmp_header();
  233.     return mmi_pmsg_create_bmp_data();
  234. }
  235. /*****************************************************************************
  236.  * FUNCTION
  237.  *  mmi_pmsg_convert_bmp_to_ota
  238.  * DESCRIPTION
  239.  *  Convets the BMP file format to OTA format
  240.  * PARAMETERS
  241.  *  BmpBuffer       [?]     
  242.  *  Bmp Buffer.(?)
  243.  * RETURNS
  244.  *  Pointer to OTA data.
  245.  *****************************************************************************/
  246. U8 *mmi_pmsg_convert_bmp_to_ota(U8 *BmpBuffer)
  247. {
  248.     /*----------------------------------------------------------------*/
  249.     /* Local Variables                                                */
  250.     /*----------------------------------------------------------------*/
  251.     S16 Hight = 0;
  252.     S16 Width = 0;
  253.     /* U8 BmpBinaryData[(PIC_BUFF_MAX_LEN)]; */
  254.     U8 *BmpBinaryData;
  255.     U8 *ptr_OtaData = NULL;
  256.     U8 *BmpDataPtr;
  257.     /*----------------------------------------------------------------*/
  258.     /* Code Body                                                      */
  259.     /*----------------------------------------------------------------*/
  260.     /* AshBmpDataHex */
  261.     BmpBinaryData = OslMalloc(PIC_BUFF_MAX_LEN);
  262.     BmpDataPtr = BmpBuffer + MMI_EXTRA_BMP_HEADER_SIZE; /* removed the MMI header information */
  263.     memset(BmpBinaryData, '', (PIC_BUFF_MAX_LEN));
  264.     if (mmi_pmsg_read_bmp_data(BmpBinaryData, BmpDataPtr, &Hight, &Width) != 0)
  265.     {
  266.         return NULL;
  267.     }
  268.     ptr_OtaData = mmi_pmsg_create_ota_data(BmpBinaryData, Hight, Width);
  269.     OslMfree(BmpBinaryData);
  270.     /* return mmi_pmsg_create_ota_data(BmpBinaryData, Hight,Width); */
  271.     return ptr_OtaData;
  272. }
  273. /*****************************************************************************
  274.  * FUNCTION
  275.  *  mmi_pmsg_read_bmp_data
  276.  * DESCRIPTION
  277.  *  Read the whole bits format of Bmp file.
  278.  * PARAMETERS
  279.  *  RawData     [?]     
  280.  *  BmpData     [?]     
  281.  *  H           [?]     
  282.  *  W           [?]     
  283.  *  File Name with Path of Bmp file and pointe of data to store picture data.(?)
  284.  * RETURNS
  285.  *  -1 if any error.
  286.  *****************************************************************************/
  287. S16 mmi_pmsg_read_bmp_data(U8 *RawData, U8 *BmpData, S16 *H, S16 *W)
  288. {
  289.     /*----------------------------------------------------------------*/
  290.     /* Local Variables                                                */
  291.     /*----------------------------------------------------------------*/
  292.     U8 RotatedData[MAX_PIC_HIEGHT_PIXEL][MAX_PIC_WIDTH_PIXEL];
  293.     S16 i = 0, j = 0;
  294.     S16 width = 0;
  295.     S16 height = 0;
  296.     S16 num_colors = 0;
  297.     S16 index = 0;
  298.     S16 x = 0;
  299.     BOOL complement_flag = FALSE;   /* JP for predefined NSM Pictures */
  300.     /*----------------------------------------------------------------*/
  301.     /* Code Body                                                      */
  302.     /*----------------------------------------------------------------*/
  303.     memset(RotatedData, '', MAX_PIC_HIEGHT_PIXEL * MAX_PIC_WIDTH_PIXEL);
  304.     /* check to see if it is a valid bitmap file */
  305.     if ((BmpData[index++] != 'B') || (BmpData[index++] != 'M'))
  306.     {
  307.         PRINT_INFORMATION("It is not a bitmap file.n");
  308.         return -1;
  309.     }
  310.     /* read in the width and height of the image, and the number of colors used; ignore the rest */
  311.     index += 16;
  312.     width = BmpData[index++];
  313.     width |= BmpData[index++] << ONE_BYTE_SIZE;
  314.     index += 2;
  315.     height = BmpData[index++];
  316.     height |= BmpData[index++] << ONE_BYTE_SIZE;
  317.     index += 22;
  318.     num_colors = BmpData[index++];
  319.     num_colors |= BmpData[index++] << ONE_BYTE_SIZE;
  320.     if (num_colors > 1)
  321.     {
  322.         PRINT_INFORMATION("It is a multi color bitmap file.n");
  323.         complement_flag = TRUE;
  324.         /* return -1; *//* JP commented for tracker issue 396 */
  325.     }
  326.     /* First Header end. */
  327.     index += 6;
  328.     /* Skip the color table */
  329.     index += 8;
  330.     if (width / ONE_BYTE_SIZE > 8)
  331.     {
  332.         j = 12;
  333.     }
  334.     else
  335.     {
  336.         j = 8;
  337.     }
  338.     for (x = 0; x < height; x++)
  339.     {
  340.         for (i = 0; i < j; i++)
  341.         {
  342.             /* 
  343.              * JP 20050629
  344.              * We have to complement Predfined NSM
  345.              * Picture data
  346.              */
  347.             if (complement_flag)
  348.             {
  349.                 RotatedData[x][i] = (~BmpData[index++]);
  350.             }
  351.             else
  352.             {
  353.                 RotatedData[x][i] = (BmpData[index++]);
  354.             }
  355.         }
  356.     }
  357.     index = 0;
  358.     for (i = x - 1; i >= 0; i--)
  359.     {
  360.         for (j = 0; j < width / ONE_BYTE_SIZE; j++)
  361.         {
  362.             RawData[index++] = RotatedData[i][j];
  363.         }
  364.     }
  365.     *H = height;
  366.     *W = width;
  367.     return 0;
  368. }
  369. /*****************************************************************************
  370.  * FUNCTION
  371.  *  mmi_pmsg_create_bmp_data
  372.  * DESCRIPTION
  373.  *  Prepared the BMP file format based on OTA data.
  374.  * PARAMETERS
  375.  *  void
  376.  * RETURNS
  377.  *  void
  378.  *****************************************************************************/
  379. U8 *mmi_pmsg_create_bmp_data()
  380. {
  381.     /*----------------------------------------------------------------*/
  382.     /* Local Variables                                                */
  383.     /*----------------------------------------------------------------*/
  384.     U8 BmpDataHeader[MAX_BMP_HDR_SIZE];
  385.     U8 RotatedData[MAX_PIC_HIEGHT_PIXEL][MAX_PIC_WIDTH_PIXEL];
  386.     U8 *BmpData = NULL;
  387.     S16 HeaderLen = 0;
  388.     S16 TotalSizeOfBmp = 0;
  389.     S16 index = 0;
  390.     S16 x = 0, i = 0, j = 0, k = 0;
  391.     /*----------------------------------------------------------------*/
  392.     /* Code Body                                                      */
  393.     /*----------------------------------------------------------------*/
  394.     memset(RotatedData, '', MAX_PIC_HIEGHT_PIXEL * MAX_PIC_WIDTH_PIXEL);
  395.     memset(BmpDataHeader, '', MAX_BMP_HDR_SIZE);
  396.     /* this is info field. */
  397.     mmi_pmsg_get_next_byte();
  398.     /* this is width field. */
  399.     g_pmsg_BmpHeader.BmpBMPInfoHeader.Width = (U32) mmi_pmsg_get_next_byte();
  400.     /* this is height field. */
  401.     g_pmsg_BmpHeader.BmpBMPInfoHeader.Height = (U32) mmi_pmsg_get_next_byte();
  402.     /* this is Depth field. */
  403.     mmi_pmsg_get_next_byte();
  404.     HeaderLen = (S16) g_pmsg_BmpHeader.BmpBMPInfoHeader.Width / ONE_BYTE_SIZE;
  405.     for (i = 0; i < gOtaDataLen; i++)
  406.     {
  407.         RotatedData[j][k] = mmi_pmsg_get_next_byte();
  408.         k++;
  409.         if (k >= HeaderLen)
  410.         {
  411.             k = 0;
  412.             j++;
  413.         }
  414.     }
  415.     if (HeaderLen > 8)
  416.     {
  417.         HeaderLen = 12;
  418.     }
  419.     else if (HeaderLen > 4)
  420.     {
  421.         HeaderLen = 8;
  422.     }
  423.     else
  424.     {
  425.         HeaderLen = 4;
  426.     }
  427.     /* Six extra bytes added for MMI support */
  428.     TotalSizeOfBmp = BMP_HEADER_SIZE + (HeaderLen * j) + MMI_EXTRA_BMP_HEADER_SIZE;
  429.     /* Put the real size of BMP */
  430.     g_pmsg_BmpHeader.BmpBMPFileHeader.FileSize = (U32) TotalSizeOfBmp - MMI_EXTRA_BMP_HEADER_SIZE;
  431.     memcpy(&BmpDataHeader, &g_pmsg_BmpHeader, BMP_HEADER_SIZE + 2);
  432.     BmpData = (U8*) OslMalloc(TotalSizeOfBmp);
  433.     /* memset((S8*)BmpData,'',TotalSizeOfBmp); */
  434.     BmpData[index++] = 0x1;
  435.     BmpData[index++] = 0x0;
  436.     BmpData[index++] = (U8) ((g_pmsg_BmpHeader.BmpBMPFileHeader.FileSize & 0x000000FF));
  437.     BmpData[index++] = (U8) ((g_pmsg_BmpHeader.BmpBMPFileHeader.FileSize & 0x0000FF00) >> 8);
  438.     BmpData[index++] = (U8) ((g_pmsg_BmpHeader.BmpBMPFileHeader.FileSize & 0x00FF0000) >> 16);
  439.     BmpData[index++] = (U8) ((g_pmsg_BmpHeader.BmpBMPFileHeader.FileSize & 0xFF000000) >> 24);
  440.     for (i = 0; i < BMP_HEADER_SIZE; i++)
  441.     {
  442.         BmpData[index++] = BmpDataHeader[i + 2];
  443.     }
  444.     for (i = j - 1; i >= 0; i--)
  445.     {
  446.         for (x = 0; x < HeaderLen; x++)
  447.         {
  448.             BmpData[index++] = RotatedData[i][x];
  449.         }
  450.     }
  451.     return (U8*) BmpData;
  452. }
  453. /*****************************************************************************
  454.  * FUNCTION
  455.  *  mmi_pmsg_get_next_byte
  456.  * DESCRIPTION
  457.  *  Combine the two Hex value
  458.  * PARAMETERS
  459.  *  void
  460.  * RETURNS
  461.  *  void
  462.  *****************************************************************************/
  463. U8 mmi_pmsg_get_next_byte(void)
  464. {
  465.     /*----------------------------------------------------------------*/
  466.     /* Local Variables                                                */
  467.     /*----------------------------------------------------------------*/
  468.     U8 value;
  469.     /*----------------------------------------------------------------*/
  470.     /* Code Body                                                      */
  471.     /*----------------------------------------------------------------*/
  472.     value = OTAdata[g_pmsg_ota_index];
  473.     g_pmsg_ota_index++;
  474.     return value;
  475. }
  476. /*****************************************************************************
  477.  * FUNCTION
  478.  *  mmi_pmsg_get_n_bits
  479.  * DESCRIPTION
  480.  *  Find out the required bits in given data.
  481.  * PARAMETERS
  482.  *  Data        [?]         Offset and req bits.
  483.  *  Offset      [IN]        
  484.  *  Bits        [IN]        
  485.  * RETURNS
  486.  *  Bits value.
  487.  *****************************************************************************/
  488. U8 mmi_pmsg_get_n_bits(U8 *Data, U16 Offset, U16 Bits)
  489. {
  490.     /*----------------------------------------------------------------*/
  491.     /* Local Variables                                                */
  492.     /*----------------------------------------------------------------*/
  493.     U16 index = Offset / ONE_BYTE_SIZE;
  494.     U8 BitsfromFirstIndex = ONE_BYTE_SIZE - (Offset % ONE_BYTE_SIZE);
  495.     U8 firstByte = Data[index];
  496.     U8 secondByte = Data[index + 1];
  497.     U8 result = 0;
  498.     /*----------------------------------------------------------------*/
  499.     /* Code Body                                                      */
  500.     /*----------------------------------------------------------------*/
  501.     if (Bits > ONE_BYTE_SIZE)
  502.     {
  503.         return 0;
  504.     }
  505.     result = (firstByte << (ONE_BYTE_SIZE - BitsfromFirstIndex)) | (secondByte >> BitsfromFirstIndex);
  506.     result = result >> (ONE_BYTE_SIZE - Bits);
  507.     return result;
  508. }
  509. /*****************************************************************************
  510.  * FUNCTION
  511.  *  mmi_pmsg_convert_ascii_hex_to_dec
  512.  * DESCRIPTION
  513.  *  Converts Ascii value to Decimal value
  514.  * PARAMETERS
  515.  *  character       [IN]        
  516.  *  S8 ascii values(?)
  517.  * RETURNS
  518.  *  U8 Decimal value.
  519.  *****************************************************************************/
  520. U8 mmi_pmsg_convert_ascii_hex_to_dec(S8 character)
  521. {
  522.     /*----------------------------------------------------------------*/
  523.     /* Local Variables                                                */
  524.     /*----------------------------------------------------------------*/
  525.     /*----------------------------------------------------------------*/
  526.     /* Code Body                                                      */
  527.     /*----------------------------------------------------------------*/
  528.     if (character > 47 && character < 58)   /* Digits 0..9 */
  529.     {
  530.         return (character - 48);
  531.     }
  532.     else if (character > 64 && character < 71)  /* Characters A..F */
  533.     {
  534.         return (character - 55);
  535.     }
  536.     else if (character > 96 && character < 103) /* Characters a..f */
  537.     {
  538.         return (character - 87);
  539.     }
  540.     else
  541.     {
  542.         return (0xFF);
  543.     }
  544. }
  545. /*****************************************************************************
  546.  * FUNCTION
  547.  *  mmi_pmsg_convert_binary_dec_to_hex
  548.  * DESCRIPTION
  549.  *  Converts Binary value to Hex value.
  550.  * PARAMETERS
  551.  *  DecimalVal      [IN]        
  552.  *  part            [IN]        Which says about first byte or second byte data needed.
  553.  * RETURNS
  554.  *  U8 Hex value.
  555.  *****************************************************************************/
  556. U8 mmi_pmsg_convert_binary_dec_to_hex(const U8 DecimalVal, U8 part)
  557. {
  558.     /*----------------------------------------------------------------*/
  559.     /* Local Variables                                                */
  560.     /*----------------------------------------------------------------*/
  561.     U8 Firstpart = 0xf0 & DecimalVal;
  562.     U8 Secondpart = 0xf & DecimalVal;
  563.     U8 ReturnVal = 0;
  564.     /*----------------------------------------------------------------*/
  565.     /* Code Body                                                      */
  566.     /*----------------------------------------------------------------*/
  567.     Firstpart >>= 4;
  568.     ReturnVal = Secondpart;
  569.     if (part == PMSG_FIRST_FOUR_BITS)
  570.     {
  571.         ReturnVal = Firstpart;
  572.     }
  573.     if (ReturnVal < 10)
  574.     {
  575.         ReturnVal += 48;
  576.     }
  577.     else
  578.     {
  579.         ReturnVal += 55;
  580.     }
  581.     return ReturnVal;
  582. }
  583. /*****************************************************************************
  584.  * FUNCTION
  585.  *  mmi_pmsg_fskip
  586.  * DESCRIPTION
  587.  *  Skip the file pointer of num bytes.
  588.  * PARAMETERS
  589.  *  fp              [IN]        
  590.  *  num_bytes       [IN]        
  591.  *  file pointer and skip times.(?)
  592.  * RETURNS
  593.  *  void
  594.  *****************************************************************************/
  595. void mmi_pmsg_fskip(FS_HANDLE fp, S16 num_bytes)
  596. {
  597.     /*----------------------------------------------------------------*/
  598.     /* Local Variables                                                */
  599.     /*----------------------------------------------------------------*/
  600.     U32 errorCode = 0;
  601.     S8 Data[64];
  602.     U32 read_len = 0;
  603.     /*----------------------------------------------------------------*/
  604.     /* Code Body                                                      */
  605.     /*----------------------------------------------------------------*/
  606.     FS_Read( fp, (void*)Data, num_bytes, &read_len);
  607. }
  608. /*****************************************************************************
  609.  * FUNCTION
  610.  *  mmi_pmsg_create_ota_data
  611.  * DESCRIPTION
  612.  *  Creates OTA file.
  613.  * PARAMETERS
  614.  *  BinaryData      [?]         
  615.  *  H               [IN]        
  616.  *  W               [IN]        
  617.  *  Pointer to OTA data,Pointer of binary data, Hieght and width.(?)
  618.  * RETURNS
  619.  *  void
  620.  *****************************************************************************/
  621. U8 *mmi_pmsg_create_ota_data(U8 *BinaryData, S16 H, S16 W)
  622. {
  623.     /*----------------------------------------------------------------*/
  624.     /* Local Variables                                                */
  625.     /*----------------------------------------------------------------*/
  626.     S16 i = 0;
  627.     S16 index = 0;
  628.     U8 *OtaData = NULL;
  629.     U16 DataSize = (H * W / ONE_BYTE_SIZE) + 4; /* infofield, width, height, and depth */
  630.     /*----------------------------------------------------------------*/
  631.     /* Code Body                                                      */
  632.     /*----------------------------------------------------------------*/
  633.     gOtaDataLen = DataSize;
  634.     OtaData = (U8*) OslMalloc(MAX_DATA_SIZE);
  635.     memset(OtaData, '', MAX_DATA_SIZE);
  636.     /* Put OTA tyep field */
  637.     OtaData[index++] = 0x02;
  638.     /* Put OTA Size field */
  639.     OtaData[index++] = (U8) ((DataSize & 0xff00) >> ONE_BYTE_SIZE);
  640.     OtaData[index++] = (U8) (DataSize & 0x00ff);
  641.     /* Put Info field */
  642.     OtaData[index++] = 0x00;
  643.     /* Put width */
  644.     OtaData[index++] = (U8) W;
  645.     /* Put Hieght */
  646.     OtaData[index++] = (U8) H;
  647.     /* Put Color */
  648.     OtaData[index++] = 0x01;
  649.     /* Put Data */
  650.     for (i = 0; i < W * H / ONE_BYTE_SIZE; i++)
  651.     {
  652.         OtaData[index++] = BinaryData[i];
  653.     }
  654.     return OtaData;
  655. }
  656. /*****************************************************************************
  657.  * FUNCTION
  658.  *  mmi_pmsg_string_search
  659.  * DESCRIPTION
  660.  *  This algorithm uses hashing to implement string searching in linear time.
  661.  * PARAMETERS
  662.  *  Pattern     [?]     
  663.  *  Text        [?]     In which pattern is to be search.
  664.  * RETURNS
  665.  *  if success then starting location of pattern else -1 if pattern not found.
  666.  *****************************************************************************/
  667. S16 mmi_pmsg_string_search(S8 *Pattern, S8 *Text)
  668. {
  669.     /*----------------------------------------------------------------*/
  670.     /* Local Variables                                                */
  671.     /*----------------------------------------------------------------*/
  672.     S16 num_iteration = 0;
  673.     S16 PatternLength = 0;
  674.     S16 PatternHash = 0;
  675.     S16 TextHash = 0;
  676.     S16 i = 0;
  677.     /*----------------------------------------------------------------*/
  678.     /* Code Body                                                      */
  679.     /*----------------------------------------------------------------*/
  680.     if (Pattern == NULL || Text == NULL)
  681.     {
  682.         return -1;
  683.     }
  684.     else
  685.     {
  686.         PatternLength = strlen((S8*) Pattern);
  687.         num_iteration = strlen((S8*) Text) - PatternLength + 1;
  688.         /* Find initial hash values for Pattern and Text */
  689.         /* These are called FINGERPRINT */
  690.         PatternHash = mmi_pmsg_hash(Pattern);
  691.         TextHash = mmi_pmsg_HashN(Text, PatternLength);
  692.         for (i = 0; i < num_iteration; i++)
  693.         {
  694.             if ((PatternHash == TextHash) && !(strncmp(Pattern, (Text + i), PatternLength)))
  695.             {
  696.                 return i;
  697.             }
  698.             TextHash = mmi_pmsg_HashIncrement(Text, i, TextHash, PatternLength);
  699.         }
  700.     }
  701.     return -1;
  702. }
  703. /*****************************************************************************
  704.  * FUNCTION
  705.  *  mmi_pmsg_hash
  706.  * DESCRIPTION
  707.  *  Calculate the hash of given string.
  708.  * PARAMETERS
  709.  *  str     [?]     
  710.  *  Pointer to given string.(?)
  711.  * RETURNS
  712.  *  Hash value.
  713.  *****************************************************************************/
  714. S16 mmi_pmsg_hash(S8 *str)
  715. {
  716.     /*----------------------------------------------------------------*/
  717.     /* Local Variables                                                */
  718.     /*----------------------------------------------------------------*/
  719.     S16 sum = 0;
  720.     /*----------------------------------------------------------------*/
  721.     /* Code Body                                                      */
  722.     /*----------------------------------------------------------------*/
  723.     for (; *str; str++)
  724.     {
  725.         sum += *str;
  726.     }
  727.     return sum % MODULUS;
  728. }
  729. /*****************************************************************************
  730.  * FUNCTION
  731.  *  mmi_pmsg_HashN
  732.  * DESCRIPTION
  733.  *  Calculate the hash value of given number of bytes.
  734.  * PARAMETERS
  735.  *  Str                 [?]         
  736.  *  PatternLength       [IN]        
  737.  *  Pointer to Data, Length of Pattern which hash value to be needed.(?)
  738.  * RETURNS
  739.  *  Calculated hash value.
  740.  *****************************************************************************/
  741. S16 mmi_pmsg_HashN(S8 *Str, S16 PatternLength)
  742. {
  743.     /*----------------------------------------------------------------*/
  744.     /* Local Variables                                                */
  745.     /*----------------------------------------------------------------*/
  746.     S8 ch = Str[PatternLength];
  747.     S16 HashValue;
  748.     /*----------------------------------------------------------------*/
  749.     /* Code Body                                                      */
  750.     /*----------------------------------------------------------------*/
  751.     Str[PatternLength] = '';
  752.     HashValue = mmi_pmsg_hash(Str);
  753.     Str[PatternLength] = ch;
  754.     return HashValue;
  755. }
  756. /*****************************************************************************
  757.  * FUNCTION
  758.  *  mmi_pmsg_HashIncrement
  759.  * DESCRIPTION
  760.  *  Increment the hash values by removing previous value and adding next value.
  761.  * PARAMETERS
  762.  *  str                 [?]         
  763.  *  PrevIndex           [IN]        
  764.  *  PrevHash            [IN]        
  765.  *  PatternLength       [IN]        
  766.  *  Pointer to given String, Previous Index, Previous hash value, Pattern Length.(?)
  767.  * RETURNS
  768.  *  New hash value.
  769.  *****************************************************************************/
  770. S16 mmi_pmsg_HashIncrement(S8 *str, S16 PrevIndex, S16 PrevHash, S16 PatternLength)
  771. {
  772.     /*----------------------------------------------------------------*/
  773.     /* Local Variables                                                */
  774.     /*----------------------------------------------------------------*/
  775.     S16 val;
  776.     /*----------------------------------------------------------------*/
  777.     /* Code Body                                                      */
  778.     /*----------------------------------------------------------------*/
  779.     val = (PrevHash - (S16) str[PrevIndex]) + (str[PrevIndex + PatternLength]);
  780.     return val < 0 ? val + MODULUS : val % MODULUS;
  781. }
  782. /*****************************************************************************
  783.  * FUNCTION
  784.  *  mmi_pmsg_shift_n_bytes
  785.  * DESCRIPTION
  786.  *  Remove the specified N byte from the given Data and shift the whole values.
  787.  * PARAMETERS
  788.  *  Data        [?]         Location from Data to be removed, Number of byte to be removed.
  789.  *  offset      [IN]        
  790.  *  nBytes      [IN]        
  791.  *  length      [IN]        
  792.  * RETURNS
  793.  *  void
  794.  *****************************************************************************/
  795. void mmi_pmsg_shift_n_bytes(S8 *Data, S16 offset, S16 nBytes, S16 length)
  796. {
  797.     /*----------------------------------------------------------------*/
  798.     /* Local Variables                                                */
  799.     /*----------------------------------------------------------------*/
  800.     S16 index = offset, j = 0;
  801.     S8 *DataPtr = Data + offset + nBytes;
  802.     S16 len = length;
  803.     /*----------------------------------------------------------------*/
  804.     /* Code Body                                                      */
  805.     /*----------------------------------------------------------------*/
  806.     while (len > 0)
  807.     {
  808.         Data[index++] = *DataPtr++;
  809.         len--;
  810.     }
  811.     for (j = 0; j < nBytes; j++)
  812.     {
  813.         Data[index++] = '';
  814.     }
  815. }
  816. /*****************************************************************************
  817.  * FUNCTION
  818.  *  mmi_pmsg_add_header
  819.  * DESCRIPTION
  820.  *  Add the Header into given data. ( Data must be big enought to add header buffer)
  821.  * PARAMETERS
  822.  *  header          [?]         
  823.  *  HeaderLen       [IN]        
  824.  *  Data            [?]         & Data Size.
  825.  *  DataLen         [IN]        
  826.  * RETURNS
  827.  *  void
  828.  *****************************************************************************/
  829. void mmi_pmsg_add_header(U8 *header, U16 HeaderLen, U8 *Data, U16 DataLen)
  830. {
  831.     /*----------------------------------------------------------------*/
  832.     /* Local Variables                                                */
  833.     /*----------------------------------------------------------------*/
  834.     U8 *DataBackUp = NULL;
  835.     U16 i = 0, j = 0;
  836.     /*----------------------------------------------------------------*/
  837.     /* Code Body                                                      */
  838.     /*----------------------------------------------------------------*/
  839.     DataBackUp = (U8*) OslMalloc(DataLen + HeaderLen + 4);
  840.     memset(DataBackUp, 0x00, (DataLen + HeaderLen + 4));
  841.     while (j < HeaderLen)
  842.     {
  843.         DataBackUp[i++] = header[j];
  844.         j++;
  845.     }
  846.     j = 0;
  847.     while (j < DataLen)
  848.     {
  849.         DataBackUp[i++] = Data[j];
  850.         j++;
  851.     }
  852.     memset(Data, 0x00, i + 1);
  853.     j = 0;
  854.     while (j < i)
  855.     {
  856.         Data[j] = DataBackUp[j];
  857.         j++;
  858.     }
  859.     OslMfree(DataBackUp);
  860. }
  861. /*****************************************************************************
  862.  * FUNCTION
  863.  *  mmi_pmsg_read_picture_header
  864.  * DESCRIPTION
  865.  *  Read the Picture Header information and put the checks.
  866.  * PARAMETERS
  867.  *  OtaPattern      [?]     
  868.  *  Pointer to OtaData.(?)
  869.  * RETURNS
  870.  *  If error return -1 else len of picture message header.
  871.  *****************************************************************************/
  872. S16 mmi_pmsg_read_picture_header(U8 *OtaPattern)
  873. {
  874.     /*----------------------------------------------------------------*/
  875.     /* Local Variables                                                */
  876.     /*----------------------------------------------------------------*/
  877.     U8 RecvVal = 0;
  878.     U16 index = 0;
  879.     S16 i = 0;
  880.     U16 OtaDataLen = 0;
  881.     /* S8 tempTextBuffer[MAX_PICTEXT_BUFF_SIZE+(TEXT_BUFF_PADDING)]; */
  882.     S8 *tempTextBuffer = NULL;
  883.     U16 charType = 0;
  884.     EMSData *pEms;
  885.     U16 EmsDataLen = 0;
  886.     U8 missSegStr[] = EMS_MISS_SEG_DELIMIT_STR;
  887.     U16 missSegStrLen = strlen((const char*)missSegStr);
  888.     /*----------------------------------------------------------------*/
  889.     /* Code Body                                                      */
  890.     /*----------------------------------------------------------------*/
  891.     GetEMSDataForView(&pEms, 0);
  892.     EmsDataLen = pEms->textLength / 2;
  893.     memset(g_pmsg_TextInMessage, '', MAX_PICTEXT_BUFF_SIZE + (TEXT_BUFF_PADDING));
  894.     /* Version Information */
  895.     RecvVal = mmi_pmsg_get_n_bits(OtaPattern, index, ONE_BYTE_SIZE);
  896.     index += ONE_BYTE_SIZE;
  897.     if (RecvVal != 48)
  898.     {
  899.         return -1;
  900.     }
  901.     /* Type */
  902.     RecvVal = mmi_pmsg_get_n_bits(OtaPattern, index, ONE_BYTE_SIZE);
  903.     index += ONE_BYTE_SIZE;
  904.     charType = RecvVal;
  905.     if (RecvVal == 0 || RecvVal == 1)   /* Message Text */
  906.     {
  907.         /* Item Len */
  908.         OtaDataLen = mmi_pmsg_get_n_bits(OtaPattern, index, ONE_BYTE_SIZE);
  909.         index += ONE_BYTE_SIZE;
  910.         RecvVal = mmi_pmsg_get_n_bits(OtaPattern, index, ONE_BYTE_SIZE);
  911.         index += ONE_BYTE_SIZE;
  912.         OtaDataLen <<= ONE_BYTE_SIZE;
  913.         OtaDataLen = OtaDataLen | RecvVal;
  914.         /* tempTextBuffer = OslMalloc((MAX_PICTEXT_BUFF_SIZE+TEXT_BUFF_PADDING)); */
  915.         tempTextBuffer = OslMalloc((OtaDataLen) + TEXT_BUFF_PADDING);
  916.         /* memset(tempTextBuffer, '',(MAX_PICTEXT_BUFF_SIZE+TEXT_BUFF_PADDING)); */
  917.         memset(tempTextBuffer, '', ((OtaDataLen) + TEXT_BUFF_PADDING));
  918.         /* Read the Text */
  919.         for (i = 0; i < OtaDataLen; i++)
  920.         {
  921.             tempTextBuffer[i] = mmi_pmsg_get_n_bits(OtaPattern, index, ONE_BYTE_SIZE);
  922.             index += ONE_BYTE_SIZE;
  923.         }
  924.         if (charType == 0)
  925.         {
  926.             mmi_asc_to_ucs2((S8*) g_pmsg_TextInMessage, (S8*) tempTextBuffer);
  927.         }
  928.         else
  929.         {
  930.             /* For Unicode character : JP */
  931.             {
  932.                 S32 count = 0;
  933.                 U8 temp = 0;
  934.                 while (count < OtaDataLen)
  935.                 {
  936.                     temp = tempTextBuffer[count];
  937.                     tempTextBuffer[count] = tempTextBuffer[count + 1];
  938.                     tempTextBuffer[count + 1] = temp;
  939.                     count = count + 2;
  940.                 }
  941.                 mmi_ucs2cpy((S8*) g_pmsg_TextInMessage, (S8*) (tempTextBuffer));
  942.             }
  943.         }
  944.         OslMfree(tempTextBuffer);
  945.         /* Read the OTA bitmat type : 02 */
  946.         RecvVal = mmi_pmsg_get_n_bits(OtaPattern, index, ONE_BYTE_SIZE);
  947.         index += ONE_BYTE_SIZE;
  948.         if (RecvVal != 2)
  949.         {
  950.             return -1;
  951.         }
  952.     }
  953.     else if (RecvVal == 2)
  954.     {
  955.         /* There is not text part in message */
  956.     }
  957.     else
  958.     {
  959.         return -1;
  960.     }
  961.     OtaDataLen = 0;
  962.     /* Read the len of OTA data */
  963.     OtaDataLen = mmi_pmsg_get_n_bits(OtaPattern, index, ONE_BYTE_SIZE);
  964.     index += ONE_BYTE_SIZE;
  965.     RecvVal = mmi_pmsg_get_n_bits(OtaPattern, index, ONE_BYTE_SIZE);
  966.     index += ONE_BYTE_SIZE;
  967.     OtaDataLen <<= ONE_BYTE_SIZE;
  968.     gOtaDataLen = OtaDataLen | RecvVal;
  969.     /* Incomplete message content */
  970.     if (((EmsDataLen - (index / ONE_BYTE_SIZE)) < gOtaDataLen) ||
  971.         !strncmp((const char*)(OtaPattern + (EmsDataLen - missSegStrLen)), (const char*)missSegStr, missSegStrLen))
  972.     {
  973.         return -1;
  974.     }
  975.     return (index / ONE_BYTE_SIZE);
  976. }
  977. /*****************************************************************************
  978.  * FUNCTION
  979.  *  mmi_smrt_message_type
  980.  * DESCRIPTION
  981.  *  Find Out the type of Message.
  982.  * PARAMETERS
  983.  *  SmsData     [?]     
  984.  *  Pointer to SMS data.(?)
  985.  * RETURNS
  986.  *  TYPE of SMS ( Normal, Picture or Ring Tone)
  987.  *****************************************************************************/
  988. S16 mmi_smrt_message_type(U8 *SmsData)
  989. {
  990.     /*----------------------------------------------------------------*/
  991.     /* Local Variables                                                */
  992.     /*----------------------------------------------------------------*/
  993.     S16 IsFindPattern = -1;
  994.     /*----------------------------------------------------------------*/
  995.     /* Code Body                                                      */
  996.     /*----------------------------------------------------------------*/
  997.     /* search the picture message signature */
  998.     IsFindPattern = mmi_pmsg_string_search((S8*) PIC_MSG_SIGNATURE, (S8*) SmsData);
  999.     if (IsFindPattern >= 0)
  1000.     {
  1001.         return SMRT_PICTURE_SMS_1;
  1002.     }
  1003.     /* search the ring tone message signature */
  1004.     IsFindPattern = mmi_pmsg_string_search((S8*) RING_TONE_MSG_SIGNATURE, (S8*) SmsData);
  1005.     if (IsFindPattern >= 0)
  1006.     {
  1007.         return SMRT_RING_TONE_SMS_2;
  1008.     }
  1009.     /* search the ring tone message signature */
  1010.     IsFindPattern = mmi_pmsg_string_search((S8*) RING_TONE_MELODY_SIGNATURE, (S8*) SmsData);
  1011.     if (IsFindPattern >= 0)
  1012.     {
  1013.         return SMRT_RING_TONE_SMS_2;
  1014.     }
  1015.     /* It is neither Picture massage nor Rong tone */
  1016.     return SMRT_NORMAL_SMS_0;
  1017. }
  1018. #if (0)
  1019. /* under construction !*/
  1020. /* under construction !*/
  1021. /* under construction !*/
  1022. /* under construction !*/
  1023. /* under construction !*/
  1024. /* under construction !*/
  1025. /* under construction !*/
  1026. /* under construction !*/
  1027. /* under construction !*/
  1028. /* under construction !*/
  1029. /* under construction !*/
  1030. /* under construction !*/
  1031. /* under construction !*/
  1032. /* under construction !*/
  1033. /* under construction !*/
  1034. /* under construction !*/
  1035. /* under construction !*/
  1036. /* under construction !*/
  1037. /* under construction !*/
  1038. /* under construction !*/
  1039. /* under construction !*/
  1040. /* under construction !*/
  1041. /* under construction !*/
  1042. /* under construction !*/
  1043. /* under construction !*/
  1044. /* under construction !*/
  1045. /* under construction !*/
  1046. /* under construction !*/
  1047. /* under construction !*/
  1048. /* under construction !*/
  1049. /* under construction !*/
  1050. /* under construction !*/
  1051. /* under construction !*/
  1052. /* under construction !*/
  1053. /* under construction !*/
  1054. /* under construction !*/
  1055. /* under construction !*/
  1056. /* under construction !*/
  1057. /* under construction !*/
  1058. /* under construction !*/
  1059. /* under construction !*/
  1060. /* under construction !*/
  1061. /* under construction !*/
  1062. /* under construction !*/
  1063. /* under construction !*/
  1064. /* under construction !*/
  1065. /* under construction !*/
  1066. /* under construction !*/
  1067. /* under construction !*/
  1068. /* under construction !*/
  1069. /* under construction !*/
  1070. /* under construction !*/
  1071. /* under construction !*/
  1072. /* under construction !*/
  1073. /* under construction !*/
  1074. /* under construction !*/
  1075. /* under construction !*/
  1076. /* under construction !*/
  1077. /* under construction !*/
  1078. /* under construction !*/
  1079. /* under construction !*/
  1080. /* under construction !*/
  1081. /* under construction !*/
  1082. /* under construction !*/
  1083. /* under construction !*/
  1084. /* under construction !*/
  1085. /* under construction !*/
  1086. /* under construction !*/
  1087. /* under construction !*/
  1088. /* under construction !*/
  1089. /* under construction !*/
  1090. /* under construction !*/
  1091. /* under construction !*/
  1092. /* under construction !*/
  1093. /* under construction !*/
  1094. /* under construction !*/
  1095. /* under construction !*/
  1096. /* under construction !*/
  1097. /* under construction !*/
  1098. /* under construction !*/
  1099. #endif /* (0) */ 
  1100. /*****************************************************************************
  1101.  * FUNCTION
  1102.  *  mmi_pmsg_add_picture_text
  1103.  * DESCRIPTION
  1104.  *  Prepared the Picture message format and add the picture text.
  1105.  * PARAMETERS
  1106.  *  OtaData         [?]     
  1107.  *  TextBuffer      [?]     
  1108.  *  OTA data & text buffer.(?)
  1109.  * RETURNS
  1110.  *  Length of OTA data with header.
  1111.  *****************************************************************************/
  1112. U16 mmi_pmsg_add_picture_text(U8 *OtaData, U8 *TextBuffer)
  1113. {
  1114.     /*----------------------------------------------------------------*/
  1115.     /* Local Variables                                                */
  1116.     /*----------------------------------------------------------------*/
  1117.     U16 TextLen;                    /* = (mmi_ucs2strlen((S8*)TextBuffer)*2); */
  1118.     U16 DataLen = gOtaDataLen + 3;  /* type (02 for OTA-bitmap), length ( 2 bytes) */
  1119.     /* U8  OtaText[MAX_PICTEXT_BUFF_SIZE+TEXT_BUFF_PADDING]; */
  1120.     U8 *OtaText = NULL;
  1121.     U16 index = 0, i = 0;
  1122.     /*----------------------------------------------------------------*/
  1123.     /* Code Body                                                      */
  1124.     /*----------------------------------------------------------------*/
  1125.     OtaText = OslMalloc((MAX_PICTEXT_BUFF_SIZE + TEXT_BUFF_PADDING));
  1126.     memset(OtaText, 0x00, MAX_PICTEXT_BUFF_SIZE + TEXT_BUFF_PADDING);
  1127.     /* Version */
  1128.     OtaText[index++] = 0x30;
  1129. #if (defined(__MMI_SMART_MESSAGE_MO__) && !defined(__MMI_MESSAGES_EMS__))
  1130.     if (g_nsm_msg_context.UCS2_count > 0)
  1131.     {
  1132.         /* text type */
  1133.         OtaText[index++] = 0x01;
  1134.         TextLen = (mmi_ucs2strlen((S8*) TextBuffer) * 2); /* JP */
  1135.     }
  1136.     else
  1137.     {
  1138.         /* text type */
  1139.         OtaText[index++] = 0x00;
  1140.         TextLen = strlen((S8*) TextBuffer); /* JP */
  1141.     }
  1142. #elif defined(__MMI_SMART_MESSAGE_MT__)
  1143.     if (picmsg_text_struct.ucs2_count > 0)
  1144.     {
  1145.         /* text type */
  1146.         OtaText[index++] = 0x01;
  1147.         TextLen = (mmi_ucs2strlen((S8*) TextBuffer) * 2); /* JP */
  1148.     }
  1149.     else
  1150.     {
  1151.         /* text type */
  1152.         OtaText[index++] = 0x00;
  1153.         TextLen = strlen((S8*) TextBuffer); /* JP */
  1154.     }
  1155. #endif 
  1156.     /* text length */
  1157.     OtaText[index++] = (U8) ((TextLen & 0xff00) >> ONE_BYTE_SIZE);
  1158.     OtaText[index++] = (U8) (TextLen & 0x00ff);
  1159. #if defined(__MMI_SMART_MESSAGE_MT__)
  1160.     if (picmsg_text_struct.ucs2_count > 0)
  1161.     {
  1162. #elif (defined(__MMI_SMART_MESSAGE_MO__) && !defined(__MMI_MESSAGES_EMS__))
  1163.     if (g_nsm_msg_context.UCS2_count > 0)
  1164.     {
  1165. #endif 
  1166.         /* For Unicode text : Reverse bytes order for Nokia chinese problem */
  1167.         {
  1168.             U8 temp1 = 0;
  1169.             U8 temp2 = 0;
  1170.             U8 temparr[3] = {0, 0, 0};
  1171.             U16 count = 0;
  1172.             while (i < TextLen)
  1173.             {
  1174.                 temp1 = TextBuffer[i];
  1175.                 i++;
  1176.                 temp2 = TextBuffer[i];
  1177.                 i++;
  1178.                 temparr[0] = temp2;
  1179.                 temparr[1] = temp1;
  1180.                 for (count = 0; count < 2; count++)
  1181.                 {
  1182.                     OtaText[index++] = (U8) temparr[count];
  1183.                 }
  1184.                 /* Reset all temp variables */
  1185.                 temp1 = 0;
  1186.                 temp2 = 0;
  1187.                 memset(temparr, 0x00, sizeof(temparr));
  1188.             }
  1189.         }
  1190.     }
  1191.     else
  1192.     {
  1193.         /* Only ascii text : DO not change bytes order */
  1194.         while (i < TextLen)
  1195.         {
  1196.             OtaText[index++] = (U8) TextBuffer[i];
  1197.             i++;
  1198.         }
  1199.     }
  1200.     mmi_pmsg_add_header(OtaText, index, OtaData, DataLen);
  1201.     OslMfree(OtaText);
  1202.     return (U16) (index + DataLen);
  1203. }
  1204. /*****************************************************************************
  1205.  * FUNCTION
  1206.  *  mmi_pmsg_add_nokia_header
  1207.  * DESCRIPTION
  1208.  *  Prefix the Nokia Header on given Picture Message.
  1209.  * PARAMETERS
  1210.  *  PictureMessage      [?]         
  1211.  *  TotalSegment        [IN]        
  1212.  *  CurrentSegment      [IN]        
  1213.  *  OTA data ,Total Part & Part of Header (first, second or third ..)(?)
  1214.  * RETURNS
  1215.  *  void
  1216.  *****************************************************************************/
  1217. void mmi_pmsg_add_nokia_header(U8 *PictureMessage, U8 TotalSegment, U8 CurrentSegment)
  1218. {
  1219.     /*----------------------------------------------------------------*/
  1220.     /* Local Variables                                                */
  1221.     /*----------------------------------------------------------------*/
  1222.     const S16 NokiaTotalSegmentLocation = 21;
  1223.     const S16 NokiaCurrectSegmentLocation = 23;
  1224.     const S16 NokiaHeaderSize = 24;
  1225.     const S16 NokiaMaxSegments = 4;
  1226.     U8 NokiaHeader[MAX_NOKIA_HEADER_SIZE];
  1227.     U8 SegmentNumber[] = { '0', '1', '2', '3', '4' };
  1228.     U16 DataSize = strlen((S8*) PictureMessage);
  1229.     /*----------------------------------------------------------------*/
  1230.     /* Code Body                                                      */
  1231.     /*----------------------------------------------------------------*/
  1232.     if ((PictureMessage == NULL)
  1233.         || (TotalSegment > NokiaMaxSegments) || (CurrentSegment > NokiaMaxSegments) || (DataSize > 296))
  1234.     {
  1235.         return;
  1236.     }
  1237.     memset(NokiaHeader, 0x00, MAX_NOKIA_HEADER_SIZE);
  1238.     strcpy((S8*) NokiaHeader, (S8*) "0B0504158A00000003010301");
  1239.     NokiaHeader[NokiaTotalSegmentLocation] = SegmentNumber[TotalSegment];
  1240.     NokiaHeader[NokiaCurrectSegmentLocation] = SegmentNumber[CurrentSegment];
  1241.     mmi_pmsg_add_header(NokiaHeader, NokiaHeaderSize, PictureMessage, DataSize);
  1242. }
  1243. /*****************************************************************************
  1244.  * FUNCTION
  1245.  *  mmi_pmsg_convert_ascii_hex_string_2_dec_string
  1246.  * DESCRIPTION
  1247.  *  Convert the ascii string into Decimal string.
  1248.  * PARAMETERS
  1249.  *  DecStr          [?]     
  1250.  *  AsciiStr        [?]     
  1251.  *  Pointer to Dec string & Pointer to Ascii string.Ascii len must be even number.(?)
  1252.  * RETURNS
  1253.  *  void
  1254.  *****************************************************************************/
  1255. void mmi_pmsg_convert_ascii_hex_string_2_dec_string(U8 *DecStr, U8 *AsciiStr)
  1256. {
  1257.     /*----------------------------------------------------------------*/
  1258.     /* Local Variables                                                */
  1259.     /*----------------------------------------------------------------*/
  1260.     U8 *AsciiStrPtr = AsciiStr;
  1261.     U8 *DecStrPtr = DecStr;
  1262.     U8 FirstVal = 0;
  1263.     U8 SecondVal = 0;
  1264.     /*----------------------------------------------------------------*/
  1265.     /* Code Body                                                      */
  1266.     /*----------------------------------------------------------------*/
  1267.     if (AsciiStrPtr == NULL)
  1268.     {
  1269.         return;
  1270.     }
  1271.     while (*AsciiStrPtr != '')
  1272.     {
  1273.         FirstVal = mmi_pmsg_convert_ascii_hex_to_dec(*AsciiStrPtr++);
  1274.         SecondVal = mmi_pmsg_convert_ascii_hex_to_dec(*AsciiStrPtr++);
  1275.         *DecStrPtr++ = ((FirstVal << 4) | (SecondVal));
  1276.     }
  1277. }
  1278. /*****************************************************************************
  1279.  * FUNCTION
  1280.  *  mmi_pmsg_convert_dec_string_2_ascii_hex_string
  1281.  * DESCRIPTION
  1282.  *  Convert the Decimal string into ascii string.
  1283.  * PARAMETERS
  1284.  *  AsciiStr        [?]     
  1285.  *  DecStr          [?]     
  1286.  *  Pointer to Ascii string & Pointer to Dec string. Ascii string len must be double of Dec string.(?)
  1287.  * RETURNS
  1288.  *  void
  1289.  *****************************************************************************/
  1290. void mmi_pmsg_convert_dec_string_2_ascii_hex_string(U8 *AsciiStr, U8 *DecStr)
  1291. {
  1292.     /*----------------------------------------------------------------*/
  1293.     /* Local Variables                                                */
  1294.     /*----------------------------------------------------------------*/
  1295.     U8 *AsciiStrPtr = AsciiStr;
  1296.     U8 *DecStrPtr = DecStr;
  1297.     /*----------------------------------------------------------------*/
  1298.     /* Code Body                                                      */
  1299.     /*----------------------------------------------------------------*/
  1300.     if (DecStrPtr == NULL)
  1301.     {
  1302.         return;
  1303.     }
  1304.     while (*DecStrPtr != '')
  1305.     {
  1306.         *AsciiStrPtr++ = mmi_pmsg_convert_binary_dec_to_hex(*DecStrPtr, PMSG_FIRST_FOUR_BITS);
  1307.         *AsciiStrPtr++ = mmi_pmsg_convert_binary_dec_to_hex(*DecStrPtr, PMSG_SECOND_FOUR_BITS);
  1308.         DecStrPtr++;
  1309.     }
  1310. }
  1311. /*****************************************************************************
  1312.  * FUNCTION
  1313.  *  mmi_pmsg_get_size_bmp_data
  1314.  * DESCRIPTION
  1315.  *  This fun find out the real size of Bmp data.
  1316.  * PARAMETERS
  1317.  *  BmpData     [?]     
  1318.  *  Pointer of BMP data MMI format.(?)
  1319.  * RETURNS
  1320.  *  Size of Bmp file.
  1321.  *****************************************************************************/
  1322. U16 mmi_pmsg_get_size_bmp_data(U8 *BmpData)
  1323. {
  1324.     /*----------------------------------------------------------------*/
  1325.     /* Local Variables                                                */
  1326.     /*----------------------------------------------------------------*/
  1327.     U16 BmpDataSize = 0;
  1328.     S16 index = 2;
  1329.     U16 val[4];
  1330.     /*----------------------------------------------------------------*/
  1331.     /* Code Body                                                      */
  1332.     /*----------------------------------------------------------------*/
  1333.     val[0] = (U16) BmpData[index++];
  1334.     val[1] = (U16) BmpData[index++];
  1335.     val[2] = (U16) BmpData[index++];
  1336.     val[3] = (U16) BmpData[index++];
  1337.     BmpDataSize = (U16) (val[3] << 24 | val[2] << 16 | val[1] << 8 | val[0]);
  1338.     return (BmpDataSize + MMI_EXTRA_BMP_HEADER_SIZE);
  1339. }
  1340. /*****************************************************************************
  1341.  * FUNCTION
  1342.  *  mmi_pmsg_get_size_ota_data
  1343.  * DESCRIPTION
  1344.  *  This fun find out the real size of Ota Picture data.
  1345.  * PARAMETERS
  1346.  *  OtaBuffer       [?]     
  1347.  *  Pointer of Ota data .(?)
  1348.  * RETURNS
  1349.  *  Size of Ota Data.
  1350.  *****************************************************************************/
  1351. U16 mmi_pmsg_get_size_ota_data(U8 *OtaBuffer)
  1352. {
  1353.     /*----------------------------------------------------------------*/
  1354.     /* Local Variables                                                */
  1355.     /*----------------------------------------------------------------*/
  1356.     S16 OtaHeaderLen = 0;
  1357.     /*----------------------------------------------------------------*/
  1358.     /* Code Body                                                      */
  1359.     /*----------------------------------------------------------------*/
  1360.     OtaHeaderLen = mmi_pmsg_read_picture_header(OtaBuffer);
  1361.     if (OtaHeaderLen == -1)
  1362.     {
  1363.         return 0;
  1364.     }
  1365.     return (U16) (gOtaDataLen + OtaHeaderLen) * 2 + 8;
  1366. }
  1367. /*****************************************************************************
  1368.  * FUNCTION
  1369.  *  mmi_pmsg_add_bmp_header_info
  1370.  * DESCRIPTION
  1371.  *  This fun added the BMP extra header info to show the Picture in UI.Prepared MMI format.
  1372.  * PARAMETERS
  1373.  *  BmpData     [?]     
  1374.  *  Pointer of BMP data .(?)
  1375.  * RETURNS
  1376.  *  void
  1377.  *****************************************************************************/
  1378. S16 mmi_pmsg_add_bmp_header_info(U8 *BmpData)
  1379. {
  1380.     /*----------------------------------------------------------------*/
  1381.     /* Local Variables                                                */
  1382.     /*----------------------------------------------------------------*/
  1383.     S8 HeaderInfo[16];
  1384.     U16 BmpDataSize = 0;
  1385.     U16 index = 0;
  1386.     /*----------------------------------------------------------------*/
  1387.     /* Code Body                                                      */
  1388.     /*----------------------------------------------------------------*/
  1389.     if (mmi_pmsg_is_smart_picture(BmpData) == FALSE)
  1390.     {
  1391.         return -1;
  1392.     }
  1393.     memset(HeaderInfo, 0x00, 16);
  1394.     BmpDataSize = ((BmpData[2]) | (BmpData[3] << 8) | (BmpData[4] << 16) | (BmpData[5] << 24));
  1395.     HeaderInfo[index++] = 0x1;
  1396.     HeaderInfo[index++] = 0x0;
  1397.     HeaderInfo[index++] = (S8) ((BmpDataSize & 0x000000FF));
  1398.     HeaderInfo[index++] = (S8) ((BmpDataSize & 0x0000FF00) >> 8);
  1399.     HeaderInfo[index++] = (S8) ((BmpDataSize & 0x00FF0000) >> 16);
  1400.     HeaderInfo[index++] = (S8) ((BmpDataSize & 0xFF000000) >> 24);
  1401.     mmi_pmsg_add_header((U8*) HeaderInfo, index, (U8*) BmpData, BmpDataSize);
  1402.     return 0;
  1403. }
  1404. /*****************************************************************************
  1405.  * FUNCTION
  1406.  *  mmi_pmsg_is_smart_picture
  1407.  * DESCRIPTION
  1408.  *  
  1409.  * PARAMETERS
  1410.  *  BmpData     [?]     
  1411.  * RETURNS
  1412.  *  
  1413.  *****************************************************************************/
  1414. BOOL mmi_pmsg_is_smart_picture(U8 *BmpData)
  1415. {
  1416.     /*----------------------------------------------------------------*/
  1417.     /* Local Variables                                                */
  1418.     /*----------------------------------------------------------------*/
  1419.     S16 index = 0, num_colors = 0;
  1420.     U8 height;
  1421.     U8 width;
  1422.     /*----------------------------------------------------------------*/
  1423.     /* Code Body                                                      */
  1424.     /*----------------------------------------------------------------*/
  1425.     if ((BmpData[index++] != 'B') || (BmpData[index++] != 'M'))
  1426.     {
  1427.         PRINT_INFORMATION("It is not a bitmap file.n");
  1428.         return FALSE;
  1429.     }
  1430.     /* Start : JP check of height and width NSM picture */
  1431.     index += 16;    /* Hack */
  1432.     width = BmpData[index];
  1433.     if ((width > MAX_NSM_PIC_WIDTH) || (width == 0))    /* Width is greater then 72 */
  1434.     {
  1435.         return FALSE;
  1436.     }
  1437.     index += 4; /* Hack */
  1438.     height = BmpData[index];
  1439.     if ((height > MAX_NSM_PIC_HEIGHT) || (height == 0)) /* Height is greater then 72 */
  1440.     {
  1441.         return FALSE;
  1442.     }
  1443.     /* index += 40; */
  1444.     /* End : JP check of height and width NSM picture */
  1445.     index += 20;
  1446.     num_colors = BmpData[index++];
  1447.     num_colors |= BmpData[index++] << ONE_BYTE_SIZE;
  1448.     if (num_colors > 1)
  1449.     {
  1450.         PRINT_INFORMATION("It is a multi color bitmap file.n");
  1451.         num_colors = 1; /* JP for tracker issue 20050628 */
  1452.         /* return FALSE; */
  1453.     }
  1454.     return TRUE;
  1455. }
  1456. #endif /* _MMI_PICMSG_C */ /* if include picmsg_c */
  1457. #endif /* defined(__MMI_SMART_MESSAGE_MT__) || (defined(__MMI_SMART_MESSAGE_MO__) && !defined(__MMI_MESSAGES_EMS__)) */