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

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